diff --git a/1.5/features/org.eclipse.epf.base.feature/.project b/1.5/features/org.eclipse.epf.base.feature/.project
deleted file mode 100644
index ca797ad..0000000
--- a/1.5/features/org.eclipse.epf.base.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.base.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/features/org.eclipse.epf.base.feature/build.properties b/1.5/features/org.eclipse.epf.base.feature/build.properties
deleted file mode 100644
index 9e3a819..0000000
--- a/1.5/features/org.eclipse.epf.base.feature/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = feature.xml,\
-               en_license.html,\
-               feature.properties,\
-               eclipse_update_120.jpg,\
-               license_en.html
diff --git a/1.5/features/org.eclipse.epf.base.feature/eclipse_update_120.jpg b/1.5/features/org.eclipse.epf.base.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/1.5/features/org.eclipse.epf.base.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/features/org.eclipse.epf.base.feature/feature.properties b/1.5/features/org.eclipse.epf.base.feature/feature.properties
deleted file mode 100644
index 68593d0..0000000
--- a/1.5/features/org.eclipse.epf.base.feature/feature.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-featureName=EPF Base Feature
-providerName=Eclipse.org
-description=EPF Base Feature.
-updateSiteName=EPF Feature Updates
-copyright=(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.
-licenseURL=license.html
-licenseText=Use of this feature is subject to the same terms and conditions which govern the use of the Product which included this feature.
diff --git a/1.5/features/org.eclipse.epf.base.feature/feature.xml b/1.5/features/org.eclipse.epf.base.feature/feature.xml
deleted file mode 100644
index fb4d9ef..0000000
--- a/1.5/features/org.eclipse.epf.base.feature/feature.xml
+++ /dev/null
@@ -1,326 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.epf.base.feature"
-      label="%featureName"
-      version="1.2.0.qualifier"
-      provider-name="%providerName"
-      plugin="org.eclipse.epf.base"
-      os="linux,win32"
-      ws="gtk,win32"
-      arch="x86"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %licenseText
-   </license>
-
-   <requires>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.draw2d"/>
-      <import plugin="org.eclipse.gef"/>
-      <import plugin="org.eclipse.ui.cheatsheets"/>
-      <import plugin="org.eclipse.ui.forms"/>
-      <import plugin="org.eclipse.ui.intro"/>
-      <import plugin="org.eclipse.ui.views.properties.tabbed"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.team.cvs.ui"/>
-      <import plugin="com.ibm.icu"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swt"/>
-      <import plugin="org.apache.ant"/>
-      <import plugin="org.eclipse.emf.ecore.xmi"/>
-      <import plugin="org.eclipse.emf.edit.ui"/>
-      <import plugin="org.eclipse.emf.common.ui"/>
-      <import plugin="org.eclipse.emf.mapping.ecore2ecore"/>
-      <import plugin="org.eclipse.emf.mapping.ecore2xml"/>
-      <import plugin="org.eclipse.core.filebuffers"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.emf.ecore"/>
-      <import plugin="org.eclipse.osgi"/>
-      <import plugin="org.eclipse.help.base"/>
-      <import plugin="org.apache.lucene"/>
-      <import plugin="org.eclipse.search"/>
-      <import plugin="org.eclipse.emf.ecore.sdo"/>
-      <import plugin="org.eclipse.emf.edit"/>
-      <import plugin="org.eclipse.emf.validation"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.epf.base"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.authoring.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.common"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.common.win32.win32.x86"
-         os="win32"
-         ws="win32"
-         arch="x86"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.dataexchange"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.diagram.model"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.export"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.export.msp"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.export.msp.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.export.xml"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.import"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.import.xml"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.library"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.library.edit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.library.persistence"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.library.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.library.ui.xmi"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.library.xmi"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.msproject"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.publishing"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.publishing.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.richtext"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.search"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.search.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.services"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.ui.intro"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.uma"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.uma.ecore"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.uma.edit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.epf.validation"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.xml.uma"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.diagram.ad"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.diagram.add"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.diagram.edit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.diagram.wpdd"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.diagram.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.migration.diagram"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.diagram.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/1.5/features/org.eclipse.epf.base.feature/license_en.html b/1.5/features/org.eclipse.epf.base.feature/license_en.html
deleted file mode 100644
index c6af966..0000000
--- a/1.5/features/org.eclipse.epf.base.feature/license_en.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/1.5/features/org.eclipse.epf.doc.feature/.project b/1.5/features/org.eclipse.epf.doc.feature/.project
deleted file mode 100644
index 799b514..0000000
--- a/1.5/features/org.eclipse.epf.doc.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.doc.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/features/org.eclipse.epf.doc.feature/build.properties b/1.5/features/org.eclipse.epf.doc.feature/build.properties
deleted file mode 100644
index 9e3a819..0000000
--- a/1.5/features/org.eclipse.epf.doc.feature/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = feature.xml,\
-               en_license.html,\
-               feature.properties,\
-               eclipse_update_120.jpg,\
-               license_en.html
diff --git a/1.5/features/org.eclipse.epf.doc.feature/eclipse_update_120.jpg b/1.5/features/org.eclipse.epf.doc.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/1.5/features/org.eclipse.epf.doc.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/features/org.eclipse.epf.doc.feature/feature.properties b/1.5/features/org.eclipse.epf.doc.feature/feature.properties
deleted file mode 100644
index 9d9b254..0000000
--- a/1.5/features/org.eclipse.epf.doc.feature/feature.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-featureName=EPF Doc Feature
-providerName=Eclipse.org
-description=EPF Documentation Feature.
-updateSiteName=EPF Feature Updates
-copyright=(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.
-licenseURL=license.html
-licenseText=Use of this feature is subject to the same terms and conditions which govern the use of the Product which included this feature.
diff --git a/1.5/features/org.eclipse.epf.doc.feature/feature.xml b/1.5/features/org.eclipse.epf.doc.feature/feature.xml
deleted file mode 100644
index 43357b2..0000000
--- a/1.5/features/org.eclipse.epf.doc.feature/feature.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.epf.doc.feature"
-      label="%featureName"
-      version="1.2.0.qualifier"
-      provider-name="%providerName"
-      plugin="org.eclipse.epf.doc"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %licenseText
-   </license>
-
-   <plugin
-         id="org.eclipse.epf.doc"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.help.doc"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-</feature>
diff --git a/1.5/features/org.eclipse.epf.doc.feature/license_en.html b/1.5/features/org.eclipse.epf.doc.feature/license_en.html
deleted file mode 100644
index c6af966..0000000
--- a/1.5/features/org.eclipse.epf.doc.feature/license_en.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/1.5/features/org.eclipse.epf.platform.feature/.project b/1.5/features/org.eclipse.epf.platform.feature/.project
deleted file mode 100644
index 7813d26..0000000
--- a/1.5/features/org.eclipse.epf.platform.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.platform.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/features/org.eclipse.epf.platform.feature/build.properties b/1.5/features/org.eclipse.epf.platform.feature/build.properties
deleted file mode 100644
index cf5e618..0000000
--- a/1.5/features/org.eclipse.epf.platform.feature/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = feature.xml,\
-               feature.properties,\
-               eclipse_update_120.jpg,\
-               en_license.html,\
-               license_en.html
diff --git a/1.5/features/org.eclipse.epf.platform.feature/eclipse_update_120.jpg b/1.5/features/org.eclipse.epf.platform.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/1.5/features/org.eclipse.epf.platform.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/features/org.eclipse.epf.platform.feature/feature.properties b/1.5/features/org.eclipse.epf.platform.feature/feature.properties
deleted file mode 100644
index 3c5d99d..0000000
--- a/1.5/features/org.eclipse.epf.platform.feature/feature.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-featureName=EPF Platform Feature
-providerName=Eclipse.org
-description=EPF Platform Feature.
-updateSiteName=EPF Feature Updates
-copyright=(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.
-licenseURL=license.html
-licenseText=Use of this feature is subject to the same terms and conditions which govern the use of the Product which included this feature.
diff --git a/1.5/features/org.eclipse.epf.platform.feature/feature.xml b/1.5/features/org.eclipse.epf.platform.feature/feature.xml
deleted file mode 100644
index 0e6e6a5..0000000
--- a/1.5/features/org.eclipse.epf.platform.feature/feature.xml
+++ /dev/null
@@ -1,1367 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.epf.platform.feature"
-      label="%featureName"
-      version="1.2.0.qualifier"
-      provider-name="%providerName"
-      plugin="org.eclipse.epf.platform"
-      os="linux,win32"
-      ws="gtk,win32"
-      arch="x86"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %licenseText
-   </license>
-
-   <plugin
-         id="org.eclipse.epf.platform"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="com.jcraft.jsch"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="javax.servlet"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="javax.servlet.jsp"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.jasper"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.commons.el"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.commons.logging"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.ant"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.apache.lucene"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.lucene.analysis"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ant.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.compare"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.boot"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.filebuffers"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.filesystem"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.net"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.resources"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.resources.compatibility"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.runtime.compatibility"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.osgi.services"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.variables"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.debug.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.debug.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.http.registry"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.http.jetty"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.http.servlet"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.jsp.jasper"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.jsp.jasper.registry"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.help.webapp"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.help.base"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.help.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.help.appserver"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ltk.core.refactoring"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ltk.ui.refactoring"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.platform"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.search"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.team.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.team.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.tomcat"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.text"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jface.text"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jsch.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.console"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.intro"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.cheatsheets"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.browser"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.navigator"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.navigator.resources"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.workbench.texteditor"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.views"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.editors"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.forms"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.ide"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.ide.application"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-         
-   <plugin
-         id="org.eclipse.ui.net"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.win32"
-         ws="win32"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.update.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.update.scheduler"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.update.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.workbench.compatibility"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"/>
-
-   <plugin
-         id="org.eclipse.core.filesystem.linux.x86"
-         os="linux"
-         arch="x86"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.filesystem.win32.x86"
-         os="win32"
-         arch="x86"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.resources.win32"
-         os="win32"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.update.core.linux"
-         os="linux"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.update.core.win32"
-         os="win32"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.views.properties.tabbed"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.runtime.compatibility.registry"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"/>
-
-   <plugin
-         id="org.mortbay.jetty"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="com.ibm.icu"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.commands"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.databinding"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.databinding.beans"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.jobs"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.expressions"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.runtime"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.runtime.compatibility.auth"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.osgi"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.help"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.swt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jface"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jface.databinding"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ui.workbench"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.update.configurator"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.swt.win32.win32.x86"
-         os="win32"
-         ws="win32"
-         arch="x86"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.swt.gtk.linux.x86"
-         os="linux"
-         ws="gtk"
-         arch="x86"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.rcp"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.core.contenttype"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.app"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.common"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.preferences"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.registry"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.launcher"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.equinox.launcher.gtk.linux.x86"
-         os="linux"
-         ws="gtk"
-         arch="x86"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"/>
-
-   <plugin
-         id="org.eclipse.equinox.launcher.win32.win32.x86"
-         os="win32"
-         ws="win32"
-         arch="x86"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"/>
-
-   <plugin
-         id="org.eclipse.ant.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jdt.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jdt.core.manipulation"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jdt.debug"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.jdt.launching"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jdt.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.cvs"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.ssh"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.ssh2"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.team.cvs.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.common"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.common.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.change"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.xmi"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.edit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.commonj.sdo"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.ecore.sdo"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.edit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.edit.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.ecore2ecore"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.ecore2xml"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.mapping.ecore.editor"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.ocl"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.query"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.query.ocl"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.transaction"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.transaction.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.validation"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.emf.workspace"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="net.sourceforge.lpg.lpgjavaruntime"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ocl.ecore"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.draw2d"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gef"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.action"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.action.ide"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.services"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.services.action"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.services.dnd"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.services.dnd.ide"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.services.properties"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.actions"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.dnd"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.geoshapes"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.properties"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.providers"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.providers.ide"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.render"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.resources.editor"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.draw2d.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.draw2d.ui.render"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.draw2d.ui.render.awt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.emf.clipboard.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.emf.commands.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.emf.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.emf.type.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.emf.type.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.emf.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.emf.ui.properties"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.gef.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.notation"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.notation.providers"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.printing"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.common.ui.printing.win32"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.printing"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.gmf.runtime.diagram.ui.printing.render"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.dom.svg"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.bridge"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.dom"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.ext.awt"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.transcoder"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.svggen"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.util"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.w3c.dom.svg"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.xerces"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.xml.resolver"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.css"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.util.gui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.parser"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.apache.batik.xml"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.w3c.css.sac"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.w3c.dom.smil"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uml2.common"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uml2.common.edit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uml2.uml"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.uml2.uml.edit"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/1.5/features/org.eclipse.epf.platform.feature/license_en.html b/1.5/features/org.eclipse.epf.platform.feature/license_en.html
deleted file mode 100644
index c6af966..0000000
--- a/1.5/features/org.eclipse.epf.platform.feature/license_en.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/1.5/features/org.eclipse.epf.product.feature/.project b/1.5/features/org.eclipse.epf.product.feature/.project
deleted file mode 100644
index ae97406..0000000
--- a/1.5/features/org.eclipse.epf.product.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.product.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/features/org.eclipse.epf.product.feature/build.properties b/1.5/features/org.eclipse.epf.product.feature/build.properties
deleted file mode 100644
index e69de29..0000000
--- a/1.5/features/org.eclipse.epf.product.feature/build.properties
+++ /dev/null
diff --git a/1.5/features/org.eclipse.epf.product.feature/feature.xml b/1.5/features/org.eclipse.epf.product.feature/feature.xml
deleted file mode 100644
index 9b0bab7..0000000
--- a/1.5/features/org.eclipse.epf.product.feature/feature.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.epf.product.feature"
-      label="EPF Product feature"
-      version="1.2.0.qualifier"
-      os="linux,win32"
-      ws="gtk,win32"
-      arch="x86">
-
-   <description url="http://www.example.com/description">
-      [Enter Feature Description here.]
-   </description>
-
-   <copyright url="http://www.example.com/copyright">
-      [Enter Copyright Description here.]
-   </copyright>
-
-   <license url="http://www.example.com/license">
-      [Enter License Description here.]
-   </license>
-
-   <includes
-         id="org.eclipse.epf.platform.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.epf.base.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.epf.rcp.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.epf.doc.feature"
-         version="0.0.0"/>
-
-   <includes
-         id="org.eclipse.equinox.executable"
-         version="0.0.0"/>
-
-</feature>
diff --git a/1.5/features/org.eclipse.epf.rcp.feature/.project b/1.5/features/org.eclipse.epf.rcp.feature/.project
deleted file mode 100644
index 6f4b4a9..0000000
--- a/1.5/features/org.eclipse.epf.rcp.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.rcp.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/features/org.eclipse.epf.rcp.feature/build.properties b/1.5/features/org.eclipse.epf.rcp.feature/build.properties
deleted file mode 100644
index 9e3a819..0000000
--- a/1.5/features/org.eclipse.epf.rcp.feature/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = feature.xml,\
-               en_license.html,\
-               feature.properties,\
-               eclipse_update_120.jpg,\
-               license_en.html
diff --git a/1.5/features/org.eclipse.epf.rcp.feature/eclipse_update_120.jpg b/1.5/features/org.eclipse.epf.rcp.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/1.5/features/org.eclipse.epf.rcp.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/features/org.eclipse.epf.rcp.feature/feature.properties b/1.5/features/org.eclipse.epf.rcp.feature/feature.properties
deleted file mode 100644
index 6f6220c..0000000
--- a/1.5/features/org.eclipse.epf.rcp.feature/feature.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-featureName=EPF RCP Feature
-providerName=Eclipse.org
-description=EPF RCP Feature.
-updateSiteName=EPF RCP Updates
-copyright=(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.
-licenseURL=license.html
-licenseText=Use of this feature is subject to the same terms and conditions which govern the use of the Product which included this feature.
diff --git a/1.5/features/org.eclipse.epf.rcp.feature/feature.xml b/1.5/features/org.eclipse.epf.rcp.feature/feature.xml
deleted file mode 100644
index 75e0d80..0000000
--- a/1.5/features/org.eclipse.epf.rcp.feature/feature.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.epf.rcp.feature"
-      label="%featureName"
-      version="1.2.0.qualifier"
-      provider-name="%providerName"
-      plugin="org.eclipse.epf.rcp"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %licenseText
-   </license>
-
-   <requires>
-      <import feature="org.eclipse.epf.base.feature" version="1.2.0" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.epf.rcp.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.epf.rcp"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/1.5/features/org.eclipse.epf.rcp.feature/license_en.html b/1.5/features/org.eclipse.epf.rcp.feature/license_en.html
deleted file mode 100644
index c6af966..0000000
--- a/1.5/features/org.eclipse.epf.rcp.feature/license_en.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/.classpath b/1.5/plugins/org.eclipse.epf.authoring.ui/.classpath
deleted file mode 100644
index 84205b2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry excluding="com/ibm/uma/authoring/views/BSEditorView.java|com/ibm/uma/authoring/views/ContentPackageTab.java|com/ibm/uma/authoring/views/GuidanceTab.java|com/ibm/uma/authoring/views/ProductEditorView.java|com/ibm/uma/authoring/views/ProductViewer.java|com/ibm/uma/authoring/views/RoleDocumentationTab.java|com/ibm/uma/authoring/views/RoleTasksTab.java|com/ibm/uma/authoring/views/RoleWorkProductsTab.java|com/ibm/uma/authoring/views/TaskDisciplineTab.java|com/ibm/uma/authoring/views/TaskDocumentationTab.java|com/ibm/uma/authoring/views/TaskGuidancesTab.java|com/ibm/uma/authoring/views/TaskStepTab.java|com/ibm/uma/authoring/views/WorkProductDocumentationTab.java|com/ibm/uma/authoring/views/WorkProductGuidancesTab.java|com/ibm/uma/authoring/views/WorkProductTasksTab.java" kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/.options b/1.5/plugins/org.eclipse.epf.authoring.ui/.options
deleted file mode 100644
index 499b328..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Authoring UI plug-in
-org.eclipse.epf.authoring.ui/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/.project b/1.5/plugins/org.eclipse.epf.authoring.ui/.project
deleted file mode 100644
index 623352b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.authoring.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/.settings/org.eclipse.jdt.ui.prefs b/1.5/plugins/org.eclipse.epf.authoring.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 86bb2ac..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Wed Nov 29 18:09:49 PST 2006
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.authoring.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 1092dfb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,53 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.authoring.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.authoring.ui.AuthoringUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.library.xmi,
- org.eclipse.epf.library.ui;visibility:=reexport,
- org.eclipse.epf.richtext,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.draw2d,
- org.eclipse.gef,
- org.eclipse.ui.cheatsheets,
- org.eclipse.ui.forms,
- org.eclipse.ui.intro,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.epf.validation,
- org.eclipse.team.cvs.ui,
- org.eclipse.epf.diagram.ad,
- org.eclipse.epf.diagram.add,
- org.eclipse.epf.diagram.wpdd,
- org.eclipse.epf.diagram.ui;visibility:=reexport,
- org.eclipse.search,
- org.eclipse.gmf.runtime.draw2d.ui.render,
- org.eclipse.gmf.runtime.draw2d.ui.render.awt,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.authoring.gef.commands,
- org.eclipse.epf.authoring.gef.edit,
- org.eclipse.epf.authoring.gef.edit.policies,
- org.eclipse.epf.authoring.gef.figures,
- org.eclipse.epf.authoring.gef.util,
- org.eclipse.epf.authoring.gef.viewer,
- org.eclipse.epf.authoring.ui,
- org.eclipse.epf.authoring.ui.actions,
- org.eclipse.epf.authoring.ui.celleditors,
- org.eclipse.epf.authoring.ui.cheatsheets.actions,
- org.eclipse.epf.authoring.ui.dialogs,
- org.eclipse.epf.authoring.ui.dnd,
- org.eclipse.epf.authoring.ui.editors,
- org.eclipse.epf.authoring.ui.filters,
- org.eclipse.epf.authoring.ui.forms,
- org.eclipse.epf.authoring.ui.preferences,
- org.eclipse.epf.authoring.ui.properties,
- org.eclipse.epf.authoring.ui.richtext,
- org.eclipse.epf.authoring.ui.util,
- org.eclipse.epf.authoring.ui.views,
- org.eclipse.epf.authoring.ui.wizards
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/build.properties b/1.5/plugins/org.eclipse.epf.authoring.ui/build.properties
deleted file mode 100644
index 58abba0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
-               help/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/
-
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/help/book.xml b/1.5/plugins/org.eclipse.epf.authoring.ui/help/book.xml
deleted file mode 100644
index 87b0818..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/help/book.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<toc label="EPF Composer Method Authroing Help Page"  topic="html/book.html">
-	<topic label="Mthod Authoring Overview" href="html/overview.html"/>
-	<topic label="Authoring Tutorial" href="html/tutorial.html"/>
-</toc>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Iteration16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Iteration16.gif
deleted file mode 100644
index 4311e46..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Iteration16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Phase16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Phase16.gif
deleted file mode 100644
index ad60bd9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Phase16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/RoleDescriptor.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/RoleDescriptor.gif
deleted file mode 100644
index 368c7b8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/RoleDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/SynchBar16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/SynchBar16.gif
deleted file mode 100644
index bc9944a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/SynchBar16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/SynchBar24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/SynchBar24.gif
deleted file mode 100644
index bc9944a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/SynchBar24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/TaskDescriptor.gif
deleted file mode 100644
index 554e26e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Template.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Template.gif
deleted file mode 100644
index c763251..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/Template.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/TemplateDescription.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/TemplateDescription.gif
deleted file mode 100644
index c763251..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/TemplateDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity.gif
deleted file mode 100644
index 77393e6..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity16.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity24.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/activity24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/addAllDependentElem.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/addAllDependentElem.gif
deleted file mode 100644
index 9cacb96..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/addAllDependentElem.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/addref_co.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/addref_co.gif
deleted file mode 100644
index 6840cd9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/addref_co.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/checked.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/checked.gif
deleted file mode 100644
index d6344db..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/checked.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/closure_co.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/closure_co.gif
deleted file mode 100644
index 8b5541a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/closure_co.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/collapseall.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/collapseall.gif
deleted file mode 100644
index a2d80a9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/collapseall.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/collapsed.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/collapsed.gif
deleted file mode 100644
index 5f4c8bb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/collapsed.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/connection16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/connection16.gif
deleted file mode 100644
index 186a127..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/connection16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/connection24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/connection24.gif
deleted file mode 100644
index 66a5fe7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/connection24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/conwarn_co.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/conwarn_co.gif
deleted file mode 100644
index 5b50c06..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/conwarn_co.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/decnode_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/decnode_pal16.gif
deleted file mode 100644
index 715a5b4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/decnode_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/decnode_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/decnode_pal24.gif
deleted file mode 100644
index 246eaa1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/decnode_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/endnode_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/endnode_pal16.gif
deleted file mode 100644
index d06506d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/endnode_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/endnode_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/endnode_pal24.gif
deleted file mode 100644
index cb177fd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/endnode_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/error.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/error.gif
deleted file mode 100644
index c5e7a94..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/error.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/expandall.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/expandall.gif
deleted file mode 100644
index 0205b29..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/expandall.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/expanded.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/expanded.gif
deleted file mode 100644
index ff4d9c4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/expanded.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/freetext_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/freetext_pal16.gif
deleted file mode 100644
index bdb813f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/freetext_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/freetext_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/freetext_pal24.gif
deleted file mode 100644
index 88b4e06..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/freetext_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/dtool16/show_empty_ui_folders.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/dtool16/show_empty_ui_folders.gif
deleted file mode 100644
index 84e2aed..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/dtool16/show_empty_ui_folders.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Pres_name_toggle.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Pres_name_toggle.gif
deleted file mode 100644
index 570afaf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Pres_name_toggle.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Print.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Print.gif
deleted file mode 100644
index 045de75..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Print.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Refresh.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Refresh.gif
deleted file mode 100644
index 3ca04d0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Refresh.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Stop.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Stop.gif
deleted file mode 100644
index 120823b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/Stop.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/flatLayout.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/flatLayout.gif
deleted file mode 100644
index 1ef74cf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/flatLayout.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/hierarchicalLayout.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/hierarchicalLayout.gif
deleted file mode 100644
index 2344861..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/hierarchicalLayout.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_down.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_down.gif
deleted file mode 100644
index 1d43e17..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_down.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_down_disabled.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_down_disabled.gif
deleted file mode 100644
index b0dcf51..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_down_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_up.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_up.gif
deleted file mode 100644
index fd74706..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_up.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_up_disabled.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_up_disabled.gif
deleted file mode 100644
index b62df18..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/move_up_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_linked_element.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_linked_element.gif
deleted file mode 100644
index d684f7e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_linked_element.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_linked_element_disabled.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_linked_element_disabled.gif
deleted file mode 100644
index 0a7f8fc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_linked_element_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_ui_folders.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_ui_folders.gif
deleted file mode 100644
index 9c54e06..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/show_ui_folders.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/synced.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/synced.gif
deleted file mode 100644
index 81a7602..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/synced.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/validate_method_lib.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/validate_method_lib.gif
deleted file mode 100644
index d6c2e3b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/validate_method_lib.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/validate_method_lib_disabled.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/validate_method_lib_disabled.gif
deleted file mode 100644
index b4864e5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/etool16/validate_method_lib_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Activity.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Check.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Check.gif
deleted file mode 100644
index a289722..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Check.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Collapsed.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Collapsed.gif
deleted file mode 100644
index db33c38..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Collapsed.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/DisableCheck.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/DisableCheck.gif
deleted file mode 100644
index f367376..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/DisableCheck.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/DisableUncheck.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/DisableUncheck.gif
deleted file mode 100644
index ee2a78e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/DisableUncheck.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Expanded.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Expanded.gif
deleted file mode 100644
index 6357454..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Expanded.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodConfiguration.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodConfiguration.gif
deleted file mode 100644
index de89602..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodConfiguration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodElement.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodElement.gif
deleted file mode 100644
index c4fb30e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodLibrary.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodLibrary.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodLibrary.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodPlugin.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodPlugin.gif
deleted file mode 100644
index bb82c39..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/MethodPlugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Process.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Process.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Process.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Uncheck.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Uncheck.gif
deleted file mode 100644
index c4fa963..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/Uncheck.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/WorkProductDescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/obj16/WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/ovr16/error_ovr.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/ovr16/error_ovr.gif
deleted file mode 100644
index c112416..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/ovr16/error_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/AuthoringPerspective.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/AuthoringPerspective.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/AuthoringPerspective.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/BrowsingPerspective.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/BrowsingPerspective.gif
deleted file mode 100644
index de89602..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/BrowsingPerspective.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ConfigurationErrorLogView.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ConfigurationErrorLogView.gif
deleted file mode 100644
index e1b637d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ConfigurationErrorLogView.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ConfigurationView.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ConfigurationView.gif
deleted file mode 100644
index de89602..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ConfigurationView.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ContentView.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ContentView.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/ContentView.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/LibraryView.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/LibraryView.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/LibraryView.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/MethodPlugin.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/MethodPlugin.gif
deleted file mode 100644
index bb82c39..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/view16/MethodPlugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/wizban/New.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/wizban/New.gif
deleted file mode 100644
index e249831..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/wizban/New.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/wizban/synchronization.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/wizban/synchronization.gif
deleted file mode 100644
index b24b368..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/full/wizban/synchronization.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/hideUncheckedElem.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/hideUncheckedElem.gif
deleted file mode 100644
index 870934b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/hideUncheckedElem.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/link_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/link_pal16.gif
deleted file mode 100644
index 18f408c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/link_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/link_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/link_pal24.gif
deleted file mode 100644
index 94137e1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/link_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/marq_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/marq_pal16.gif
deleted file mode 100644
index d7f875b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/marq_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/marq_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/marq_pal24.gif
deleted file mode 100644
index 957d784..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/marq_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/move_down.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/move_down.gif
deleted file mode 100644
index 0328357..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/move_down.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/move_up.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/move_up.gif
deleted file mode 100644
index 830c2c9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/move_up.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/select_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/select_pal16.gif
deleted file mode 100644
index fd5cafa..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/select_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/select_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/select_pal24.gif
deleted file mode 100644
index eb0fcfc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/select_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/activity.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/activity.gif
deleted file mode 100644
index 77393e6..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/artifact.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/artifact.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/capabilitypattern.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/capabilitypattern.gif
deleted file mode 100644
index d80b1ac..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/capabilitypattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/checklist.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/checklist.gif
deleted file mode 100644
index c33aa3b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/checklist.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/concept.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/concept.gif
deleted file mode 100644
index f0e95cd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/concept.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/contentpackage.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/contentpackage.gif
deleted file mode 100644
index e3ad96a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/contentpackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/customcat.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/customcat.gif
deleted file mode 100644
index 4bb2d8f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/customcat.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/deliverable.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/deliverable.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/deliverable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/deliveryprocess.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/deliveryprocess.gif
deleted file mode 100644
index c2ba788..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/deliveryprocess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/discipline.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/discipline.gif
deleted file mode 100644
index 7715a9b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/discipline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/disciplinegroup.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/disciplinegroup.gif
deleted file mode 100644
index 7b43069..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/disciplinegroup.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/domain.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/domain.gif
deleted file mode 100644
index d0e257d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/domain.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/guideline.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/guideline.gif
deleted file mode 100644
index 9e91e5b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/guideline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/iteration.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/iteration.gif
deleted file mode 100644
index 25c8a14..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/methodlibrary.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/methodlibrary.gif
deleted file mode 100644
index 8b4f970..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/methodlibrary.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/methodplugin.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/methodplugin.gif
deleted file mode 100644
index 791a23c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/methodplugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/milestone.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/milestone.gif
deleted file mode 100644
index 576ff94..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/outcome.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/outcome.gif
deleted file mode 100644
index e703518..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/outcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/phase.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/phase.gif
deleted file mode 100644
index 55cb3cd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/process.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/process.gif
deleted file mode 100644
index 8f9a085..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/process.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processcomponent.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processcomponent.gif
deleted file mode 100644
index 8f9a085..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processcomponent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processcontribution.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processcontribution.gif
deleted file mode 100644
index b966b60..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processcontribution.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processpackage.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processpackage.gif
deleted file mode 100644
index 3757fc8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processpackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processplanningtemplate.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processplanningtemplate.gif
deleted file mode 100644
index bd06804..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/processplanningtemplate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/role.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/role.gif
deleted file mode 100644
index 69ebdf2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/role.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roledes_obj.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roledes_obj.gif
deleted file mode 100644
index 75524ab..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roledes_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roledescriptor.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roledescriptor.gif
deleted file mode 100644
index e5a22b0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roledescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roleset.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roleset.gif
deleted file mode 100644
index 8fb67c6..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/roleset.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/task.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/task.gif
deleted file mode 100644
index 7633d58..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/task.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdes_obj.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdes_obj.gif
deleted file mode 100644
index 149efe0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdes_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdescriptor.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdescriptor.gif
deleted file mode 100644
index 345d651..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdescriptor1.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdescriptor1.gif
deleted file mode 100644
index 345d651..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/taskdescriptor1.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/technique.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/technique.gif
deleted file mode 100644
index 015135c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/technique.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/template.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/template.gif
deleted file mode 100644
index 957a7e0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/template.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/tool.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/tool.gif
deleted file mode 100644
index 4c55a2c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/tool.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/toolmentor.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/toolmentor.gif
deleted file mode 100644
index 4c55a2c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/toolmentor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/whitepaper.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/whitepaper.gif
deleted file mode 100644
index 62e48ef..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/whitepaper.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workdes_obj.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workdes_obj.gif
deleted file mode 100644
index 0eea8cc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workdes_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workorder.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workorder.gif
deleted file mode 100644
index f05ebc0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workorder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workproductdescriptor.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workproductdescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/workproductdescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/wpguideline.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/wpguideline.gif
deleted file mode 100644
index 9e91e5b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/shape/wpguideline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/showConfigError.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/showConfigError.gif
deleted file mode 100644
index e1b637d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/showConfigError.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/stnode_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/stnode_pal16.gif
deleted file mode 100644
index c222f4d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/stnode_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/stnode_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/stnode_pal24.gif
deleted file mode 100644
index a56b1fc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/stnode_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/syncbar_pal16.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/syncbar_pal16.gif
deleted file mode 100644
index 2d9d0fd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/syncbar_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/syncbar_pal24.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/syncbar_pal24.gif
deleted file mode 100644
index d07d07f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/syncbar_pal24.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/warning.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/warning.gif
deleted file mode 100644
index 1ee20aa..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/warning.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/wf_editor_icon.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/wf_editor_icon.gif
deleted file mode 100644
index 7ddc1cc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/wf_editor_icon.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/wizban/synchronization.gif b/1.5/plugins/org.eclipse.epf.authoring.ui/icons/wizban/synchronization.gif
deleted file mode 100644
index b24b368..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/icons/wizban/synchronization.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.properties
deleted file mode 100644
index 2737e49..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.properties
+++ /dev/null
@@ -1,121 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Authoring UI
-providerName=Eclipse.org
-
-# Category
-methodCategoryName=Method
-
-# Perspective
-authoringPerspectiveName=Authoring
-browsingPerspectiveName=Browsing
-
-# Views
-libraryViewName=Library
-configurationViewName=Configuration
-contentViewName=Content
-configurationErrorLogViewName=Configuration Error Log
-
-# Editors
-methodElementEditorName=Method Element Editor
-configurationEditorName=Configuration Editor
-processEditorName=Process Editor
-activityDiagramEditorName=Activity Diagram Editor
-activityDetailDiagramEditorName=Activity Detail Diagram Editor
-workProductDepedencyDiagramEditorName=Work Product Dependency Diagram Editor
-
-# Wizards
-newMethodLibraryWizardName=Method Library
-newMethodLibraryWizardDescription=Create a new method library.
-newMethodPluginWizardName=Method Plug-in
-newMethodPluginWizardDescription=Create a new method plug-in.
-newConfigurationWizardName=Method Configuration
-newConfigurationWizardDescription=Create a new method configuration.
-
-# Cheat Sheets
-methodAuthoringCheatSheetsName=Method Authoring Cheat Sheets
-CheatsheetGetstartedCategoryText=Getting Started
-CheatsheetReusableContentCategoryText=Create Reusable Method Content
-CheatsheetWriteContentCategoryText=Write Method Content
-CheatsheetProcessesCategoryText=Work with Processes
-CheatsheetNavigateMethodContent=Navigate Method Content
-CheatsheetCreateMethodConfiguration=Create your own Method Configuration
-CheatsheetCreateMethodPlugin=Create your own Method Plug-in
-CheatsheetAddMethodContent=Add new Method Content such as Roles, Tasks, Work Products, or Guidance
-CheatsheetTailorMethodElements=Tailor existing Method Elements (Roles, Tasks, Work Products or Guidance) Using Contribution
-CheatsheetReplaceMehtodElements=Replace existing Method Elements (Roles, Tasks, Work Products or Guidance)
-CheatsheetAddMethodRefOrHyperlink=Add a Method Reference or Hyperlink (URL)
-CheatsheetApplyCapabilityPattern=Apply a Capability Pattern
-CheatsheetCreateProcess=Create a Process (Capability Pattern or Delivery Process)
-
-# Action Set
-authoringActionSet=Authoring
-cheatSheetsActionSet=Cheat Sheets
-
-# Global Actions
-newLibraryAction=Method &Library
-newLibraryActionTooltip=Create a new Method Library
-newPluginAction=Method &Plug-in
-newPluginActionTooltip=Create a new Method Plug-in
-newConfigAction=Method &Configuration
-newConfigActionTooltip=Create a new Method Configuration
-openLibraryAction=Method &Library
-openLibraryActionTooltip=Open an existing Method Library
-openConfigAction=Method &Configuration
-openConfigActionTooltip=Open an existing Method Configuration
-openCheatSheets=&Cheat Sheets...
-
-# Library View Actions
-linkWithEditor=Link with Editor
-linkWithEditorTooltip=Link with Editor
-showPresentationNames=Show Presentation Names
-showPresentationNamesTooltip=Show Presentation Names
-
-# Configuration View Actions
-refreshConfig=Refresh
-refreshConfigTooltip=Refresh Configuration
-
-# Preference Page
-authoringPreferencePage=Authoring
-processEditor=Process Editor
-libraryOptions=Library Options
-startupAndShutdown=Startup and Shutdown
-debug=Debug
-modelingOptions=Modeling Options
-diagramAppearance=Diagram Appearance
-breakdownElementAttributes=Breakdown Element Attributes
-libraryViewOptions=Library View Options
-
-# Command Handler
-selectAll=Select All
-
-# Properties View
-_UI_ProcessEditor_menu=Process
-_UI_CreateChild_menu_item=&New Child
-_UI_CreateSibling_menu_item=N&ew Sibling
-_UI_ShowPropertiesView_menu_item=Show Properties &View
-_UI_RefreshViewer_menu_item=Re&fresh
-_UI_Properties_General=General
-_UI_Properties_Documentation=Documentation
-_UI_Properties_Guidance=Guidance
-_UI_Properties_Work_Rollup=Work Rollup
-_UI_Properties_Team_Rollup=Team Rollup
-_UI_Properties_WP_Rollup=Work Product Rollup
-_UI_Properties_Roles=Roles
-_UI_Properties_WorkProducts=Work Products
-_UI_Properties_Steps=Steps
-_UI_Properties_Teams=Teams
-
-RichTextMarkerTypeName=HTML Problems
-ConfigurationMarkerTypeName=Configuration Problems
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.xml
deleted file mode 100644
index 3322232..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.xml
+++ /dev/null
@@ -1,623 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point
-         id="newPluginWizard"
-         name="New Method Plug-in Wizard Extension"
-         schema="schema/NewPluginWizard.exsd" />
-         
-   <extension-point
-         id="newConfigurationWizard"
-         name="New Method Configuration Wizard Extension"
-         schema="schema/NewConfigurationWizard.exsd" />         
-
-   <extension-point
-         id="TaskEditorPageProvider"
-         name="Task Editor Page Provider"
-         schema="schema/TaskEditorPageProvider.exsd"/>
-
-   <extension-point
-         id="ProcessEditorPageProvider"
-         name="Process Editor Page Provider"
-         schema="schema/ProcessEditorPageProvider.exsd"/>
-
-   <extension-point
-         id="wizardRegistryProvider"
-         name="Wizard Registery Provider"
-         schema="schema/wizardRegistryProvider.exsd"/>
-   <extension-point id="EditorOpener" name="Editor Opener" schema="schema/editorOpener.exsd"/>
-   <extension-point id="CustomizedLocker" name="Customized Locker" schema="schema/CustomizedLocker.exsd"/>
-
-   <extension point="org.eclipse.ui.perspectives">
-      <perspective
-            class="org.eclipse.epf.authoring.ui.AuthoringPerspective"
-            fixed="false"
-            icon="icons/full/view16/AuthoringPerspective.gif"
-            id="org.eclipse.epf.authoring.ui.AuthoringPerspective"
-            name="%authoringPerspectiveName"/>
-      <perspective
-            class="org.eclipse.epf.authoring.ui.BrowsingPerspective"
-            fixed="false"
-            icon="icons/full/view16/BrowsingPerspective.gif"
-            id="org.eclipse.epf.authoring.ui.BrowsingPerspective"
-            name="%browsingPerspectiveName"/>
-   </extension>
-
-   <extension point="org.eclipse.ui.views">
-      <view
-            category="org.eclipse.epf.ui.views.category"
-            class="org.eclipse.epf.authoring.ui.views.LibraryView"
-            icon="icons/full/view16/LibraryView.gif"
-            id="org.eclipse.epf.authoring.ui.views.LibraryView"
-            name="%libraryViewName"/>
-      <view
-            category="org.eclipse.epf.ui.views.category"
-            class="org.eclipse.epf.authoring.ui.views.ConfigurationView"
-            icon="icons/full/view16/ConfigurationView.gif"
-            id="org.eclipse.epf.authoring.ui.views.ConfigurationView"
-            name="%configurationViewName"/>
-      <view
-            category="org.eclipse.epf.ui.views.category"
-            class="org.eclipse.epf.authoring.ui.views.ContentView"
-            icon="icons/full/view16/ContentView.gif"
-            id="org.eclipse.epf.authoring.ui.views.ContentView"
-            name="%contentViewName"/>
-    </extension>
-   
-   <extension point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.epf.authoring.ui.AuthoringPerspective">
-         <view
-               id="org.eclipse.epf.authoring.ui.views.ConfigurationView"
-               moveable="true"
-               ratio="0.5f"
-               relationship="bottom"
-               relative="org.eclipse.epf.authoring.ui.views.LibraryView"/>
-         <viewShortcut
-               id="org.eclipse.epf.authoring.ui.views.LibraryView"/>
-         <viewShortcut
-               id="org.eclipse.epf.authoring.ui.views.ConfigurationView"/>
-         <showInPart id="org.eclipse.epf.authoring.ui.views.LibraryView"/>
-      </perspectiveExtension>
-      
-      <perspectiveExtension
-            targetID="org.eclipse.epf.authoring.ui.BrowsingPerspective">
-         <view
-               closeable="false"
-               id="org.eclipse.epf.authoring.ui.views.ContentView"
-               moveable="true"
-               ratio="0.70f"
-               relationship="right"
-               relative="org.eclipse.ui.editorss"/>
-      </perspectiveExtension>
-   </extension>
-
-   <extension point="org.eclipse.ui.editors">
-      <editor
-            class="org.eclipse.epf.authoring.ui.editors.MethodElementEditor"
-            icon="icons/full/obj16/MethodElement.gif"
-            id="org.eclipse.epf.authoring.ui.editors.MethodElementEditor"
-            name="%methodElementEditorName"
-            matchingStrategy="org.eclipse.epf.authoring.ui.editors.MethodElementEditorMatchingStrategy"/>
-      <editor
-            class="org.eclipse.epf.authoring.ui.editors.ConfigurationEditor"
-            icon="icons/full/obj16/MethodConfiguration.gif"
-            id="org.eclipse.epf.authoring.ui.editors.ConfigurationEditor"
-            name="%configurationEditorName"
-            matchingStrategy="org.eclipse.epf.authoring.ui.editors.MethodElementEditorMatchingStrategy"/>
-      <editor
-            class="org.eclipse.epf.authoring.ui.editors.ProcessEditor"
-            contributorClass="org.eclipse.epf.authoring.ui.editors.ProcessEditorActionBarContributor"
-            icon="icons/full/obj16/Process.gif"
-            id="org.eclipse.epf.authoring.ui.editors.ProcessEditor"
-            name="%processEditorName"/>
-      <editor
-            class="org.eclipse.epf.authoring.ui.editors.GraphicalWorkflowEditor"
-            icon="icons/full/obj16/Activity.gif"
-            id="org.eclipse.epf.authoring.ui.editors.GraphicalWorkflowEditor"
-            name="%activityDiagramEditorName"/>
-      <editor
-            class="org.eclipse.epf.authoring.ui.editors.ActivityDetailDiagramEditor"
-            icon="icons/full/obj16/Activity.gif"
-            id="org.eclipse.epf.authoring.ui.editors.ActivityDetailDiagramEditor"
-            name="%activityDetailDiagramEditorName"/>
-      <editor
-            class="org.eclipse.epf.authoring.ui.editors.GraphicalWPDependencyEditor"
-            icon="icons/full/obj16/WorkProductDescriptor.gif"
-            id="org.eclipse.epf.authoring.ui.editors.GraphicalWPDependencyEditor"
-            name="%workProductDepedencyDiagramEditorName"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <wizard
-            category="org.eclipse.epf.ui.newWizards.category"
-            class="org.eclipse.epf.authoring.ui.wizards.NewLibraryWizard"
-            icon="icons/full/obj16/MethodLibrary.gif"
-            id="org.eclipse.epf.authoring.ui.wizards.NewLibraryWizard"
-            name="%newMethodLibraryWizardName">
-         <description>
-               %newMethodLibraryWizardDescription
-         </description>
-      </wizard>       
-      <wizard
-            category="org.eclipse.epf.ui.newWizards.category"
-            class="org.eclipse.epf.authoring.ui.wizards.NewPluginWizard"
-            icon="icons/full/obj16/MethodPlugin.gif"
-            id="org.eclipse.epf.authoring.ui.wizards.NewPluginWizard"
-            name="%newMethodPluginWizardName">
-         <description>
-               %newMethodPluginWizardDescription
-         </description>
-      </wizard>
-      <wizard
-            category="org.eclipse.epf.ui.newWizards.category"
-            class="org.eclipse.epf.authoring.ui.wizards.NewConfigurationWizard"
-            icon="icons/full/obj16/MethodConfiguration.gif"
-            id="org.eclipse.epf.authoring.ui.wizards.NewConfigurationWizard"
-            name="%newConfigurationWizardName">
-         <description>
-               %newConfigurationWizardDescription
-         </description>
-      </wizard>
-   </extension>
-
-   <extension point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-      <propertyContributor
-            typeMapper="org.eclipse.epf.authoring.ui.properties.ElementTypeMapper"
-            contributorId="org.eclipse.epf.authoring.ui.editors.ProcessEditor"
-            labelProvider="org.eclipse.epf.authoring.ui.properties.ElementLabelProvider">
-         <propertyCategory category="element"/>
-         <propertyCategory category="other"/>
-      </propertyContributor>
-   </extension>
-   
-   <extension point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-      <propertyTabs
-            contributorId="org.eclipse.epf.authoring.ui.editors.ProcessEditor">
-         <!-- START GENERAL -->
-         <propertyTab
-               label="%_UI_Properties_General"
-               category="element"
-               id="properties.tab.BreakdownElement.General"/>
-         <propertyTab
-               label="%_UI_Properties_General"
-               category="element"
-               id="properties.tab.WorkBreakdownElement.General"/>
-         <propertyTab
-               label="%_UI_Properties_General"
-               category="element"
-               id="properties.tab.Activity.General"/>
-         <propertyTab
-               label="%_UI_Properties_General"
-               category="element"
-               id="properties.tab.TaskDescriptor.General"/>
-         <propertyTab
-               label="%_UI_Properties_General"
-               category="element"
-               id="properties.tab.RoleDescriptor.General"/>
-         <propertyTab
-               label="%_UI_Properties_General"
-               category="element"
-               id="properties.tab.WorkProductDescriptor.General"/>
-		 <!-- END GENERAL-->
-         
-         <!-- START DOCUMENTATION -->
-         <propertyTab
-               label="%_UI_Properties_Documentation"
-               category="element"
-               id="properties.tab.BreakdownElement.Documentation"
-               afterTab="properties.tab.BreakdownElement.General"/>
-         <propertyTab
-               label="%_UI_Properties_Documentation"
-               category="element"
-               id="properties.tab.Activity.Documentation"
-               afterTab="properties.tab.Activity.General"/>
-         <propertyTab
-               label="%_UI_Properties_Documentation"
-               category="element"
-               id="properties.tab.Descriptor.Documentation"
-               afterTab="properties.tab.TaskDescriptor.General"/>
-		 <!-- END DOCUMENTATION -->
-		
-		 <!-- ACTIVITY -->
-         <propertyTab
-               label="%_UI_Properties_Guidance"
-               category="element"
-               afterTab="properties.tab.Activity.Documentation"
-               id="properties.tab.Activity.Guidance"/>  
-         <propertyTab
-               label="%_UI_Properties_Work_Rollup"
-               category="element"
-               afterTab="properties.tab.Activity.Guidance"
-               id="properties.tab.Activity.WorkRollup"/>
-         <propertyTab
-               label="%_UI_Properties_Team_Rollup"
-               category="element"
-               afterTab="properties.tab.Activity.WorkRollup"
-               id="properties.tab.Activity.TeamRollup"/>
-         <propertyTab
-               label="%_UI_Properties_WP_Rollup"
-               category="element"
-               afterTab="properties.tab.Activity.TeamRollup"
-               id="properties.tab.Activity.WorkProductsRollup"/>
-        
-         <!-- TASK DESCRIPTOR -->
-         <propertyTab
-               label="%_UI_Properties_Roles"
-               category="element"
-               afterTab="properties.tab.Descriptor.Documentation"
-               id="properties.tab.TaskDescriptor.Role"/>
-         <propertyTab
-               label="%_UI_Properties_WorkProducts"
-               category="element"
-               afterTab="properties.tab.TaskDescriptor.Role"
-               id="properties.tab.TaskDescriptor.WorkProduct"/>
-         <propertyTab
-               label="%_UI_Properties_Steps"
-               category="element"
-               afterTab="properties.tab.TaskDescriptor Relation"
-               id="properties.tab.TaskDescriptor.Step"/>
-         
-         <!-- ROLE DESCRIPTOR -->
-         <propertyTab
-               label="%_UI_Properties_WorkProducts"
-               category="element"
-               afterTab="properties.tab.RoleDescriptor.Task"
-               id="properties.tab.RoleDescriptor.WorkProduct"/>
-         <propertyTab
-               label="%_UI_Properties_Teams"
-               category="element"
-               afterTab="properties.tab.RoleDescriptor.WorkProduct"
-               id="properties.tab.RoleDescriptor.Team"/>
-         
-         <!-- TEAM PROFILE -->
-         <propertyTab
-               label="%_UI_Properties_Roles"
-               category="element"
-               afterTab="properties.tab.TeamProfile.Documentation"
-               id="properties.tab.TeamProfile.Role"/>
-         
-         <!-- COMPOSITE ROLE -->
-         <propertyTab
-               label="%_UI_Properties_Roles"
-               category="element"
-               afterTab="properties.tab.RoleDescriptor.Team"
-               id="properties.tab.CompositeRole.Role"/>
-      </propertyTabs>
-   </extension>
-   
-   <extension point="org.eclipse.ui.views.properties.tabbed.propertySections">
-      <propertySections
-            contributorId="org.eclipse.epf.authoring.ui.editors.ProcessEditor">
-         <!-- START GENERAL SECTION -->
-         <propertySection
-               tab="properties.tab.Activity.General"
-               class="org.eclipse.epf.authoring.ui.properties.ActivityGeneralSection"
-               id="properties.section.Activity.General">
-            <input type="org.eclipse.epf.uma.Activity"/>
-            <input type="org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider"/>
-         </propertySection>
-         <propertySection
-               tab="properties.tab.TaskDescriptor.General"
-               class="org.eclipse.epf.authoring.ui.properties.TaskDescriptorGeneralSection"
-               id="properties.section.TaskDescriptor.General">
-            <input type="org.eclipse.epf.uma.TaskDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider"/>
-         </propertySection> 
-         <propertySection
-               class="org.eclipse.epf.authoring.ui.properties.RoleDescriptorGeneralSection"
-               id="properties.section.RoleDescriptor.General"
-               tab="properties.tab.RoleDescriptor.General">
-            <input type="org.eclipse.epf.uma.RoleDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider"/>
-         </propertySection>
-         <propertySection
-               class="org.eclipse.epf.authoring.ui.properties.WorkProductDescriptorGeneralSection"
-               id="properties.section.WorkProductDescriptor.General"
-               tab="properties.tab.WorkProductDescriptor.General">      
-            <input type="org.eclipse.epf.uma.WorkProductDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.WorkProductDescriptorWrapperItemProvider"/>
-         </propertySection>       
-         <propertySection
-               tab="properties.tab.WorkBreakdownElement.General"
-               class="org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection"
-               id="properties.section.WorkBreakdownElement.General">
-            <input type="org.eclipse.epf.uma.Milestone"/>
-            <input type="org.eclipse.epf.library.edit.process.MilestoneWrapperItemProvider"/>
-         </propertySection>
-         <propertySection
-               tab="properties.tab.BreakdownElement.General"
-               class="org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection"
-               id="properties.section.BreakdownElement.General">
-            <input type="org.eclipse.epf.uma.TeamProfile"/>
-            <input type="org.eclipse.epf.library.edit.process.TeamProfileWrapperItemProvider"/>
-         </propertySection>
-         <!-- END GENERAL SECTION -->
-        
-         <!-- START DOCUMENTATION SECTION -->
-         <propertySection
-               tab="properties.tab.Activity.Documentation"
-               class="org.eclipse.epf.authoring.ui.properties.ActivityDocumentSection"
-               id="properties.section.Activity.Documentation">
-            <input type="org.eclipse.epf.uma.Activity"/>
-            <input type="org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider"/>
-         </propertySection>
-         <propertySection
-               tab="properties.tab.Descriptor.Documentation"
-               class="org.eclipse.epf.authoring.ui.properties.DescriptorDocumentSection"
-               id="properties.section.Descriptor.Documentation">
-            <input type="org.eclipse.epf.uma.Descriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider"/>
-            <input type="org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider"/>
-            <input type="org.eclipse.epf.library.edit.process.WorkProductDescriptorWrapperItemProvider"/>
-         </propertySection> 
-         <propertySection
-               tab="properties.tab.BreakdownElement.Documentation"
-               class="org.eclipse.epf.authoring.ui.properties.MilestoneDocumentSection"
-               id="properties.section.BreakdownElement.Document">
-            <input type="org.eclipse.epf.uma.Milestone"/>
-            <input type="org.eclipse.epf.uma.TeamProfile"/>
-            <input type="org.eclipse.epf.library.edit.process.MilestoneWrapperItemProvider"/>
-            <input type="org.eclipse.epf.library.edit.process.TeamProfileWrapperItemProvider"/>
-         </propertySection>       
-         <!-- END DOCUMENTATION SECTION -->
-      
-         <!-- ACTIVITY -->
-         <propertySection
-               tab="properties.tab.Activity.Guidance"
-               class="org.eclipse.epf.authoring.ui.properties.ActivityGuidanceSection"
-               id="properties.section.Activity.Guidance">
-            <input type="org.eclipse.epf.uma.Activity"/>
-            <input type="org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider"/>
-         </propertySection>
-         <propertySection
-               tab="properties.tab.Activity.WorkRollup"
-               class="org.eclipse.epf.authoring.ui.properties.ActivityWorkRollupSection"
-               id="properties.section.Activity.WorkRollup">
-            <input type="org.eclipse.epf.uma.Activity"/>
-            <input type="org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider"/>
-         </propertySection>
-         <propertySection
-               tab="properties.tab.Activity.TeamRollup"
-               class="org.eclipse.epf.authoring.ui.properties.ActivityTeamRollupSection"
-               id="properties.section.Activity.TeamRollup">
-            <input type="org.eclipse.epf.uma.Activity"/>
-            <input type="org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider"/>
-         </propertySection>
-         <propertySection
-               tab="properties.tab.Activity.WorkProductsRollup"
-               class="org.eclipse.epf.authoring.ui.properties.ActivityWorkProductsRollupSection"
-               id="properties.section.Activity.WorkProductsRollup">
-            <input type="org.eclipse.epf.uma.Activity"/>
-            <input type="org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider"/>
-         </propertySection>
-         <!-- END ACTIVITY -->
-         
-         <!-- Sections for TaskDescriptor -->
-         <propertySection
-               tab="properties.tab.TaskDescriptor.Role"
-               class="org.eclipse.epf.authoring.ui.properties.TaskDescriptorRoleSection"
-               id="properties.section.TaskDescriptor.Role">
-            <input type="org.eclipse.epf.uma.TaskDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider"/>
-         </propertySection>  
-         <propertySection
-               tab="properties.tab.TaskDescriptor.WorkProduct"
-               class="org.eclipse.epf.authoring.ui.properties.TaskDescriptorWorkProductSection"
-               id="properties.section.TaskDescriptor.WorkProduct">
-            <input type="org.eclipse.epf.uma.TaskDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider"/>
-         </propertySection> 
-         <propertySection
-               tab="properties.tab.TaskDescriptor.Step"
-               class="org.eclipse.epf.authoring.ui.properties.TaskDescriptorStepSection"
-               id="properties.section.TaskDescriptor.Step">
-            <input type="org.eclipse.epf.uma.TaskDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider"/>
-         </propertySection> 
-         
-         <!-- Sections for RoleDescriptor -->
-         <propertySection
-               tab="properties.tab.RoleDescriptor.WorkProduct"
-               class="org.eclipse.epf.authoring.ui.properties.RoleDescriptorWorkProductSection"
-               id="properties.section.RoleDescriptor.WorkProduct">
-            <input type="org.eclipse.epf.uma.RoleDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider"/>
-         </propertySection>  
-         <propertySection
-               tab="properties.tab.RoleDescriptor.Team"
-               class="org.eclipse.epf.authoring.ui.properties.RoleDescriptorTeamSection"
-               id="properties.section.RoleDescriptor.Team">
-            <input type="org.eclipse.epf.uma.RoleDescriptor"/>
-            <input type="org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider"/>
-         </propertySection> 
-      
-
-         <!-- Section for TeamProfile -->
-         <propertySection
-               tab="properties.tab.TeamProfile.Role"
-               class="org.eclipse.epf.authoring.ui.properties.TeamProfileRoleSection"
-               id="properties.section.TeamProfile.Role">
-            <input type="org.eclipse.epf.uma.TeamProfile"/>
-            <input type="org.eclipse.epf.library.edit.process.TeamProfileWrapperItemProvider"/>
-         </propertySection> 
-         
-         <!-- Section for CompositeRole -->
-         <propertySection
-               tab="properties.tab.CompositeRole.Role"
-               class="org.eclipse.epf.authoring.ui.properties.CompositeRoleRoleSection"
-               id="properties.section.CompositeRole.Role">
-            <input type="org.eclipse.epf.uma.CompositeRole"/>
-            <input type="org.eclipse.epf.library.edit.process.CompositeRoleWrapperItemProvider"/>
-         </propertySection>
-      </propertySections>
-   </extension>
-   
-   <extension point="org.eclipse.ui.preferencePages">
-      <page
-            id="org.eclipse.epf.authoring.ui.preferences.AuthoringPreferencePage"
-            class="org.eclipse.epf.authoring.ui.preferences.AuthoringPreferencePage"
-            category="org.eclipse.epf.ui.preferences.RootPreferencePage"
-            name="%authoringPreferencePage"/>
-      <page
-            id="org.eclipse.epf.authoring.ui.preferences.ProcessEditorPreferencePage"
-            class="org.eclipse.epf.authoring.ui.preferences.ProcessEditorPreferencePage"
-            category="org.eclipse.epf.authoring.ui.preferences.AuthoringPreferencePage"
-            name="%processEditor"/>
-      <page
-            id="org.eclipse.epf.authoring.ui.preferences.BreakdownElementPrefPage"
-            class="org.eclipse.epf.authoring.ui.preferences.BreakdownElementPrefPage"
-            category="org.eclipse.epf.authoring.ui.preferences.ProcessEditorPreferencePage"            
-            name="%breakdownElementAttributes"/>            
-      <page
-            category="org.eclipse.epf.authoring.ui.preferences.AuthoringPreferencePage"
-            class="org.eclipse.epf.authoring.ui.preferences.LibraryViewPrefPage"
-            id="org.eclipse.epf.authoring.ui.preferences.LibraryViewPrefPage"
-            name="%libraryViewOptions"/>
-      <!--
-      <page
-            class="org.eclipse.epf.authoring.ui.preferences.RootPrefPage"
-            name="%methodAuthoringPage"
-            id="org.eclipse.epf.authoring.ui.preferences.rootprefpage"/>
-      <page
-            category="org.eclipse.epf.authoring.ui.preferences.rootprefpage"
-            class="org.eclipse.epf.authoring.ui.preferences.LibraryPrefPage"
-            id="org.eclipse.epf.authoring.ui.preferences.libraryprefpage"
-            name="%libraryOptions"/>
-      <page
-            category="org.eclipse.epf.authoring.ui.preferences.rootprefpage"
-            class="org.eclipse.epf.authoring.ui.preferences.DebugPrefPage"
-            id="org.eclipse.epf.authoring.ui.preferences.DebugPrefPage"
-            name="%debug"/>
-      <page
-            category="org.eclipse.epf.authoring.ui.preferences.rootprefpage"
-            class="org.eclipse.epf.authoring.ui.preferences.ModelingOptionsPrefPage"
-            id="org.eclipse.epf.authoring.ui.preferences.ModelingOptionsPrefPage"
-            name="%modelingOptions"/>
-      -->
-
-   </extension>
-   
-   <extension point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.epf.authoring.ui.preferences.LibraryPreferenceInitializer"/>
-      <initializer
-            class="org.eclipse.epf.authoring.ui.preferences.AuthoringPreferenceInitializer"/>
-   </extension>
-   
-   <extension point="org.eclipse.ui.viewActions">
-      <viewContribution
-            id="org.eclipse.epf.authoring.ui.viewContribution.refreshConfiguration"
-            targetID="org.eclipse.epf.authoring.ui.views.ConfigurationView">
-         <action
-               class="org.eclipse.epf.authoring.ui.actions.RefreshConfiguration"
-               disabledIcon="icons/full/etool16/Refresh.gif"
-               enablesFor="+"
-               icon="icons/full/etool16/Refresh.gif"
-               id="org.eclipse.epf.authoring.ui.actions.refresh"
-               label="%refreshConfig"
-               menubarPath="additions"
-               style="push"
-               toolbarPath="additions"
-               tooltip="%refreshConfigTooltip"/>
-      </viewContribution>
-      <viewContribution
-            id="org.eclipse.epf.authoring.ui.viewContribution.linkWithEditor"
-            targetID="org.eclipse.epf.authoring.ui.views.LibraryView">
-         <action
-               class="org.eclipse.epf.authoring.ui.actions.LinkWithEditor"
-               disabledIcon="icons/full/etool16/synced.gif"
-               icon="icons/full/etool16/synced.gif"
-               id="org.eclipse.epf.authoring.ui.actions.linkWithEditor"
-               label="%linkWithEditor"
-               menubarPath="additions"
-               style="toggle"
-               toolbarPath="additions"
-               tooltip="%linkWithEditorTooltip"/>
-      </viewContribution>
-      <viewContribution
-            id="org.eclipse.epf.authoring.ui.viewContribution.showPresNames"
-            targetID="org.eclipse.epf.authoring.ui.views.LibraryView">
-         <action
-               class="org.eclipse.epf.authoring.ui.actions.ShowPresentationNames"
-               disabledIcon="icons/full/etool16/Pres_name_toggle.gif"
-               icon="icons/full/etool16/Pres_name_toggle.gif"
-               id="org.eclipse.epf.authoring.ui.actions.showPresNames"
-               label="%showPresentationNames"
-               menubarPath="additions"
-               style="toggle"
-               toolbarPath="additions"
-               tooltip="%showPresentationNamesTooltip"/>
-      </viewContribution>
-   </extension>
-   
-   <extension point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.ui.category.edit"
-            defaultHandler="org.eclipse.ui.internal.handlers.SelectAllHandler"
-            description="%selectAll"
-            id="org.eclipse.ui.edit.selectAllB"
-            name="selectAll"/>
-   </extension>
-   
-   <extension point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.ui.edit.selectAllB"
-            contextId="org.eclipse.ui.contexts.window"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="Ctrl+A"/>
-   </extension>
-
-   <extension point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="%cheatSheetsActionSet"
-            visible="true"
-            id="org.eclipse.ui.cheatsheets.actionSet">
-         <action
-            label="%openCheatSheets"
-            class="org.eclipse.ui.internal.cheatsheets.actions.CheatSheetHelpMenuAction"
-            menubarPath="help/group.assist" id="org.eclipse.ui.cheatsheets.actions.CheatSheetHelpMenuAction">
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         point="org.eclipse.ui.decorators">
-      <decorator
-            class="org.eclipse.epf.authoring.ui.providers.MethodElementLightweightLabelDecorator"
-            id="org.eclipse.epf.authoring.ui.providers.MethodElementLightweightLabelDecorator"
-            label="Method Element Lightweight Label Decorator"
-            lightweight="true"
-            location="TOP_LEFT"
-            state="true"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerResolution">
-      <markerResolutionGenerator class="org.eclipse.epf.authoring.ui.util.MarkerResolutionGenerator"
-      	markerType="org.eclipse.epf.library.persistence.unresolvedProxyMarker"/>
-   </extension>
-   <extension id="methodRichText" point="org.eclipse.core.resources.markers" name="%RichTextMarkerTypeName"> 
-      <persistent value="false"/> 
-      <super type="org.eclipse.core.resources.problemmarker"/> 
-      <attribute name="guid"/>
-      <attribute name="MethodFieldName"/>
-   </extension>
-   <extension id="configuration" point="org.eclipse.core.resources.markers" name="%ConfigurationMarkerTypeName"> 
-      <persistent value="false"/> 
-      <super type="org.eclipse.core.resources.problemmarker"/> 
-      <attribute name="errorID"/>
-      <attribute name="configGuid"/>
-      <attribute name="elementGuid"/> 
-      <attribute name="causeGuid"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerResolution">
-      <markerResolutionGenerator class="org.eclipse.epf.authoring.ui.util.ConfigurationMarkerResolutionGenerator"
-      markerType="org.eclipse.epf.authoring.ui.configuration"/>
-   </extension>
-   <extension
-         point="org.eclipse.epf.library.edit.userInteractionHandler">
-      <userInteractionHandler class="org.eclipse.epf.authoring.ui.actions.UserInteractionHandler"/>
-   </extension>
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/CustomizedLocker.exsd b/1.5/plugins/org.eclipse.epf.authoring.ui/schema/CustomizedLocker.exsd
deleted file mode 100644
index 90c0330..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/CustomizedLocker.exsd
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.authoring.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.authoring.ui" id="CustomizedLocker" name="Customized Locker"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="CustomizedLocker"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="CustomizedLocker">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/NewConfigurationWizard.exsd b/1.5/plugins/org.eclipse.epf.authoring.ui/schema/NewConfigurationWizard.exsd
deleted file mode 100644
index 4364ae2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/NewConfigurationWizard.exsd
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.authoring.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.authoring.ui" id="newPluginWizard" name="New Method Plugin Wizard Extension"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to extend the New Method Configuration wizard by replacing existing wizard pages or adding new ones.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizardExtender" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardExtender">
-      <complexType>
-         <sequence>
-            <element ref="wizardPage" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard extender. This class must implements &lt;code&gt;org.eclipse.epf.publishing.ui.wizards.IPublishConfigWizardExtender&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardPage">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard page. This class must implements &lt;code&gt;org.eclipse.jface.wizard.IWizardPage&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The type of extension - &quot;replace&quot; or &quot;new&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="target" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the base wizard page to be replaced or used as a reference for inserting a new wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="insert" type="string">
-            <annotation>
-               <documentation>
-                  The insertion type for a new wizard page - &quot;before&quot; or &quot;after&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of how the extension point can be used: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.authoring.ui.newConfigurationWizard&quot;&gt;
-      &lt;wizard
-            class=&quot;org.eclipse.epf.authoring.ui.wizards.NewConfigurationWizardExtender&quot;&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.authoring.ui.wizards.NewCnfigurationWizardPage&quot;
-               type=&quot;replace&quot;
-               target=&quot;org.eclipse.epf.authoring.ui.wizards.NewConfigurationMainPage&quot;/&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.authoring.ui.wizards.SelectOptionsPage&quot;
-               type=&quot;new&quot;
-               target=&quot;org.eclipse.epf.authoring.ui.wizards.NewConfigurationMainPage&quot;
-               insert=&quot;after&quot;/&gt;                     
-      &lt;/wizard&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/NewPluginWizard.exsd b/1.5/plugins/org.eclipse.epf.authoring.ui/schema/NewPluginWizard.exsd
deleted file mode 100644
index e056266..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/NewPluginWizard.exsd
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.authoring.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.authoring.ui" id="newPluginWizard" name="New Method Plugin Wizard Extension"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to extend the New Method Plug-in wizard by replacing existing wizard pages or adding new ones.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizardExtender" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardExtender">
-      <complexType>
-         <sequence>
-            <element ref="wizardPage" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard extender. This class must implements &lt;code&gt;org.eclipse.epf.publishing.ui.wizards.IPublishConfigWizardExtender&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardPage">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard page. This class must implements &lt;code&gt;org.eclipse.jface.wizard.IWizardPage&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The type of extension - &quot;replace&quot; or &quot;new&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="target" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the base wizard page to be replaced or used as a reference for inserting a new wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="insert" type="string">
-            <annotation>
-               <documentation>
-                  The insertion type for a new wizard page - &quot;before&quot; or &quot;after&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of how the extension point can be used: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.authoring.ui.newPluginWizard&quot;&gt;
-      &lt;wizard
-            class=&quot;org.eclipse.epf.authoring.ui.wizards.NewPluginWizardExtender&quot;&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.authoring.ui.wizards.NewPluginWizardPage&quot;
-               type=&quot;replace&quot;
-               target=&quot;org.eclipse.epf.authoring.ui.wizards.NewPluginMainPage&quot;/&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.authoring.ui.wizards.SelectOptionsPage&quot;
-               type=&quot;new&quot;
-               target=&quot;org.eclipse.epf.authoring.ui.wizards.NewPluginMainPage&quot;
-               insert=&quot;after&quot;/&gt;                     
-      &lt;/wizard&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/ProcessEditorPageProvider.exsd b/1.5/plugins/org.eclipse.epf.authoring.ui/schema/ProcessEditorPageProvider.exsd
deleted file mode 100644
index 82e6161..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/ProcessEditorPageProvider.exsd
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.authoring.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.authoring.ui" id="ProcessEditorPageProvider" name="Process Editor Page Provider"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="editorPage"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editorPage">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.authoring.ui.forms.IExtensionFormPage"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
- &lt;extension
-  point=&quot;org.eclipse.epf.authoring.ui.ProcessEditorPageProvider&quot;&gt;
-  &lt;editorPage
-   id=&quot;org.eclipse.epf.authoring.ui.ProcessEstimationPage&quot;
-   name=&quot;Estimation&quot;
-   class=&quot;org.eclipse.epf.authoring.ui.forms.ProcessEstimationPage&quot;&gt;
-  &lt;/editorPage&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/TaskEditorPageProvider.exsd b/1.5/plugins/org.eclipse.epf.authoring.ui/schema/TaskEditorPageProvider.exsd
deleted file mode 100644
index 9994a49..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/TaskEditorPageProvider.exsd
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.authoring.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.authoring.ui" id="EditorPageProvider" name="Editor Page Provider"/>
-      </appInfo>
-      <documentation>
-         This extension point enables a plug-in to register one or more pages in authoring editor. Though this page will only be added for method element type &quot;task&quot;.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="editorPage"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="editorPage">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.authoring.ui.forms.IExtensionFormPage"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;pre&gt;
- &lt;extension
-  point=&quot;org.eclipse.epf.authoring.ui.TaskEditorPageProvider&quot;&gt;
-  &lt;editorPage
-   id=&quot;org.eclipse.epf.authoring.ui.TaskEstimationPage&quot;
-   name=&quot;Estimation&quot;
-   class=&quot;org.eclipse.epf.authoring.ui.forms.TaskEstimationPage&quot;&gt;
-  &lt;/editorPage&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/editorOpener.exsd b/1.5/plugins/org.eclipse.epf.authoring.ui/schema/editorOpener.exsd
deleted file mode 100644
index 1cd19dc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/editorOpener.exsd
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.authoring.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.authoring.ui" id="editorOpener" name="Editor Opener"/>
-      </appInfo>
-      <documentation>
-         extension to define editor opened. The opener is associated with an ID that matches with the MethodElementProperty name.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="EditorOpener"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="EditorOpener">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/wizardRegistryProvider.exsd b/1.5/plugins/org.eclipse.epf.authoring.ui/schema/wizardRegistryProvider.exsd
deleted file mode 100644
index 5be68e5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/schema/wizardRegistryProvider.exsd
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.authoring.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.authoring.ui" id="wizardRegistryProvider" name="Wizard Registery Provider"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="wizardRegistry" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardRegistry">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.authoring.ui.wizards.IWizardRegistry"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeBoundsCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeBoundsCommand.java
deleted file mode 100644
index 484c2ed..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeBoundsCommand.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ChangeBoundsCommand extends Command {
-
-	private Node node;
-
-	private Point newLocation, oldLocation;
-
-	private int newWidth, oldWidth;
-
-	private static final String LABEL = AuthoringUIResources.gef_changeBoundsCommand_label; 
-
-	public ChangeBoundsCommand(Node node, Point newLocation, int newWidth) {
-		super(ChangeBoundsCommand.LABEL);
-		setNode(node);
-		setNewLocation(newLocation.getCopy());
-		this.newWidth = newWidth;
-	}
-
-	public boolean canExecute() {
-		return node != null
-				&& newLocation != null
-				&& (newWidth != oldWidth || !(node.getLocation()
-						.equals(newLocation)));
-	}
-
-	public void execute() {
-		oldLocation = node.getLocation();
-		oldWidth = node.getWidth();
-		redo();
-	}
-
-	public void redo() {
-		node.setLocation(newLocation);
-		node.setWidth(newWidth);
-	}
-
-	public void setNode(Node node) {
-		this.node = node;
-	}
-
-	public void setNewLocation(Point loc) {
-		newLocation = loc;
-	}
-
-	public void undo() {
-		node.setWidth(oldWidth);
-		node.setLocation(oldLocation);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeHeightCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeHeightCommand.java
deleted file mode 100644
index 38d4957..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeHeightCommand.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Shashidhar Kannoori
- * Command to handle Node's height changes.
- * ChangeBoundsCommand handles Node's width changes. 
- */
-public class ChangeHeightCommand extends Command {
-
-	private Node node;
-
-	private Point newLocation, oldLocation;
-
-	private int newHeight, oldHeight;
-
-	private static final String LABEL = "Change Height Command"; //$NON-NLS-1$
-
-	public ChangeHeightCommand(Node node, Point newLocation, int newHeight) {
-		super(ChangeHeightCommand.LABEL);
-		setNode(node);
-		setNewLocation(newLocation.getCopy());
-		this.newHeight = newHeight;
-	}
-
-	public boolean canExecute() {
-		return node != null
-				&& newLocation != null
-				&& (newHeight != oldHeight || !(node.getLocation()
-						.equals(newLocation)));
-	}
-
-	public void execute() {
-		oldLocation = node.getLocation();
-		oldHeight = node.getHeight();
-		redo();
-	}
-
-	public void redo() {
-		node.setLocation(newLocation);
-		node.setHeight(newHeight);
-	}
-
-	public void setNode(Node node) {
-		this.node = node;
-	}
-
-	public void setNewLocation(Point loc) {
-		newLocation = loc;
-	}
-
-	public void undo() {
-		node.setHeight(oldHeight);
-		node.setLocation(oldLocation);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeNameCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeNameCommand.java
deleted file mode 100644
index 80956ee..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangeNameCommand.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.epf.authoring.gef.edit.NamedNodeEditPart;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ChangeNameCommand extends Command {
-
-	private NamedNode element;
-
-	private String newName, oldName;
-
-	private static final String LABEL = AuthoringUIResources.gef_changeNameCommand_label;
-	private static final String UNDO_MESSAGE = AuthoringUIResources.gef_changeNameCommand_undoMessage;
-
-	public ChangeNameCommand(NamedNode elem, String newName) {
-		super(LABEL);
-		element = elem;
-		oldName = elem.getName();
-		this.newName = newName.trim();
-	}
-
-	public boolean canExecute() {
-		return element != null;
-	}
-
-	public void execute() {
-		element.setName(newName);
-	}
-
-	public void undo() {
-		if (!StrUtil.isBlank(oldName)) {
-			element.setName(oldName);
-		} else {
-			Display.getCurrent().asyncExec(new PromptEdit(null, UNDO_MESSAGE));
-		}
-	}
-
-	static class PromptEdit implements Runnable {
-		
-		private String msg;
-
-		PromptEdit(NamedNodeEditPart part, String msg) {
-			this.msg = msg;
-		}
-
-		/**
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			String title = AuthoringUIResources.warningDialog_title;
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, msg, ""); //$NON-NLS-1$
-		}
-
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangePropertyValueCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangePropertyValueCommand.java
deleted file mode 100644
index 0454d14..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ChangePropertyValueCommand.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import java.util.List;
-
-import org.eclipse.epf.authoring.gef.edit.NodeEditPart;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.gef.commands.Command;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ChangePropertyValueCommand extends Command {
-
-	private Node element;
-
-	private NodeEditPart part;
-
-	private String newName, oldName;
-
-	private static final String LABEL = AuthoringUIResources.gef_changePropertyValueCommand_label; 
-
-	public ChangePropertyValueCommand(NodeEditPart elem, String newName) {
-		super(LABEL);
-		part = elem;
-		element = (Node) elem.getModel();
-		GraphNode graphNode = element.getGraphNode();
-		List list = graphNode.getProperty();
-		oldName = ((Property) list.get(0)).getValue();
-		this.newName = newName.trim();
-	}
-
-	public boolean canExecute() {
-		return element != null;
-	}
-
-	public void execute() {
-		((Property) element.getGraphNode().getProperty().get(0))
-				.setValue(newName);
-		part.refresh();
-	}
-
-	public void undo() {
-		((Property) element.getGraphNode().getProperty().get(0))
-				.setValue(oldName);
-		part.refresh();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateBendpointCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateBendpointCommand.java
deleted file mode 100644
index 844c32a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateBendpointCommand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class CreateBendpointCommand extends Command {
-
-	private Link link;
-
-	private AbsoluteBendpoint point;
-
-	private int index = -1;
-
-	private static final String LABEL = AuthoringUIResources.gef_createBendpointCommand_label; 
-
-	public CreateBendpointCommand(Link link, Point location, int index) {
-		super(LABEL);
-		this.link = link;
-		point = new AbsoluteBendpoint(location);
-		this.index = index;
-	}
-
-	public boolean canExecute() {
-		return link != null && point != null;
-	}
-
-	public void execute() {
-		link.getBendpoints().add(index, point);
-	}
-
-	public void undo() {
-		link.getBendpoints().remove(index);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateLinkCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateLinkCommand.java
deleted file mode 100644
index 05e4d02..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateLinkCommand.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.gef.util.Validation;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class CreateLinkCommand extends Command {
-
-	private Link link;
-
-	private Node source, target;
-
-	private Point targetEndPoint;
-
-	private Point sourceEndPoint;
-
-	private static final String LABEL = AuthoringUIResources.gef_createLinkCommand_label; 
-
-	public CreateLinkCommand(Link newObj, Node src) {
-		super(LABEL);
-		link = newObj;
-		source = src;
-	}
-
-	public boolean canExecute() {
-		boolean result = source != null && target != null && link != null;
-		if (!result)
-			return result;
-
-		String msg = Validation.checkConnect(source, target, link);
-		if (msg != null) {
-			return false;
-		}
-		return true;
-	}
-
-	public void execute() {
-		if (source == target) {
-			link.getBendpoints().add(
-					new AbsoluteBendpoint(source.getLocation().getTranslated(
-							-10, 10)));
-			link.getBendpoints().add(
-					new AbsoluteBendpoint(source.getLocation().getTranslated(
-							-10, -10)));
-			link.getBendpoints().add(
-					new AbsoluteBendpoint(source.getLocation().getTranslated(
-							10, -10)));
-		}
-
-		link.setTargetEndPoint(targetEndPoint);
-		link.setSourceEndPoint(sourceEndPoint);
-		link.setSource(source);
-		link.setTarget(target);
-	}
-
-	public void setTarget(Node target) {
-		this.target = target;
-	}
-
-	public void setTargetEndPoint(Point p) {
-		targetEndPoint = p;
-	}
-
-	public void setSourceEndPoint(Point p) {
-		sourceEndPoint = p;
-	}
-
-	public Point getTargetEndPoint() {
-		return targetEndPoint;
-	}
-
-	/**
-	 * @return Returns the sourceEndPoint.
-	 */
-	public Point getSourceEndPoint() {
-		return sourceEndPoint;
-	}
-
-	public void undo() {
-		link.setSourceEndPoint(null);
-		link.setTargetEndPoint(null);
-		link.setSource(null);
-		link.setTarget(null);
-		if (source == target) {
-			link.getBendpoints().clear();
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateNodeCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateNodeCommand.java
deleted file mode 100644
index 6307786..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/CreateNodeCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class CreateNodeCommand extends DiagramModifyCommand {
-
-	private Point loc;
-
-	private Node node;
-
-	private Diagram diagram;
-
-	private static final String LABEL = AuthoringUIResources.gef_createNodeCommand_label; 
-
-	public CreateNodeCommand(Node newObject, Diagram parent, Point location) {
-		super(LABEL);
-		node = newObject;
-		diagram = parent;
-		loc = location.getCopy();
-		setDiagram(parent);
-	}
-
-	public void undo() {
-		node.setLocation(null);
-		node.setDiagram(null);
-		diagram.getNodes().remove(node);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.commands.DiagramModifyCommand#doExecute()
-	 */
-	protected void doExecute() {
-		node.setLocation(loc);
-		node.setDiagram(diagram);
-		if (node instanceof NamedNode) {
-			diagram.setDefaultName((NamedNode) node);
-		}
-		diagram.getNodes().add(node);
-	}
-
-	public boolean canExecute() {
-		if (diagram instanceof Diagram) {
-			if (diagram.isReadOnly()) {
-				return false;
-			}
-		}
-		return super.canExecute();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteBendpointCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteBendpointCommand.java
deleted file mode 100644
index b801637..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteBendpointCommand.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DeleteBendpointCommand extends Command {
-
-	private Link link;
-
-	private AbsoluteBendpoint bendpoint;
-
-	private int index;
-
-	private static final String LABEL = AuthoringUIResources.gef_deleteBendpointCommand_label; 
-
-	public DeleteBendpointCommand(Link link, int index) {
-		super(LABEL);
-		this.link = link;
-		this.index = index;
-		bendpoint = link.getBendpoints().get(index);
-	}
-
-	public boolean canExecute() {
-		return index >= 0 && bendpoint != null && link != null;
-	}
-
-	public void execute() {
-		link.getBendpoints().remove(index);
-	}
-
-	public void undo() {
-		link.getBendpoints().add(index, bendpoint);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteCommand.java
deleted file mode 100644
index 9a333ca..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteCommand.java
+++ /dev/null
@@ -1,201 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.epf.authoring.gef.util.Validation;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DeleteCommand extends Command {
-
-	private Command delegate;
-
-	private static final String LABEL = AuthoringUIResources.gef_deleteCommand_label; 
-
-	public static final String KEY_PERM_DELETE = "gef.ediagram.$perm"; //$NON-NLS-1$
-
-	public DeleteCommand(boolean hardDelete) {
-		super(LABEL);
-	}
-
-	public boolean canExecute() {
-		return delegate != null && delegate.canExecute();
-	}
-
-	public void execute() {
-		delegate.execute();
-	}
-
-	public Command setPartToBeDeleted(Object model) {
-		if (model instanceof Node)
-			delegate = new DeleteNodeCommand(model);
-		else
-			delegate = null;
-		return this;
-	}
-
-	public void undo() {
-		delegate.undo();
-	}
-
-	private static class DeleteNodeCommand extends Command {
-		protected Map incomingConnectionsToSource;
-
-		protected Map outgoingConnectionsToTarget;
-
-		protected NodeContainer container;
-
-		protected Node node;
-
-		protected int index;
-
-		public DeleteNodeCommand(Object node) {
-			this.node = (Node) node;
-			container = (NodeContainer) this.node.eContainer();
-		}
-
-		public void execute() {
-			index = container.getNodes().indexOf(node);
-			// There's always the possibility that this node has already been
-			// deleted by the time this command is executed (eg., when the
-			// package containing this class is also selected). Hence, we check
-			// to see if the node exists in the diagram. If not, do nothing.
-			if (index == -1)
-				return;
-			incomingConnectionsToSource = new HashMap();
-			outgoingConnectionsToTarget = new HashMap();
-			for (Iterator iter = node.getOutgoingConnections().iterator(); iter
-					.hasNext();) {
-				Link link = (Link) iter.next();
-				outgoingConnectionsToTarget.put(link, link.getTarget());
-				link.setTarget(null);
-			}
-			for (Iterator iter = node.getIncomingConnections().iterator(); iter
-					.hasNext();) {
-				Link link = (Link) iter.next();
-				incomingConnectionsToSource.put(link, link.getSource());
-				link.setSource(null);
-			}
-			// Commenting below two lines, Links get removed from the model
-			// when link.setTarget(null) or link.setSource(null) is done.  For 
-			// Node if we clear incoming/outgoing connections, Undo command will not work.
-			
-			//node.getOutgoingConnections().clear();
-			//node.getIncomingConnections().clear();
-			container.getNodes().remove(index);
-		}
-
-		public void undo() {
-			if (index == -1)
-				return;
-			container.getNodes().add(index, node);
-			for (Iterator iter = outgoingConnectionsToTarget.keySet()
-					.iterator(); iter.hasNext();) {
-				Link link = (Link) iter.next();
-				link.setTarget((Node) outgoingConnectionsToTarget.get(link));
-				link.setSource(node);
-			}
-			for (Iterator iter = incomingConnectionsToSource.keySet()
-					.iterator(); iter.hasNext();) {
-				Link link = (Link) iter.next();
-				link.setTarget(node);
-				link.setSource((Node) incomingConnectionsToSource.get(link));
-			}
-			outgoingConnectionsToTarget = null;
-			incomingConnectionsToSource = null;
-		}
-
-		/**
-		 * @see org.eclipse.gef.commands.Command#canExecute()
-		 */
-		public boolean canExecute() {
-			if (Validation.checkDelete(node) != null)
-				return false;
-			return super.canExecute();
-		}
-	}
-	/*
-	 * Not in use. Need modification for future feature implementations. 
-	 * Compound Command deletion do the recursive deletion and undo. 
-	 */
-//	private static class DeleteNodeCompoundCommand extends CompoundCommand {
-//		protected Map incomingConnectionsToSource;
-//
-//		protected Map outgoingConnectionsToTarget;
-//
-//		protected NodeContainer container;
-//
-//		protected Node node;
-//
-//		protected int index;
-//
-//		public DeleteNodeCompoundCommand(Object node) {
-//			this.node = (Node) node;
-//			container = (NodeContainer) this.node.eContainer();
-//			incomingConnectionsToSource = new HashMap();
-//			outgoingConnectionsToTarget = new HashMap();
-//			for (Iterator iter = this.node.getOutgoingConnections().iterator(); iter
-//					.hasNext();) {
-//				Link link = (Link) iter.next();
-//				outgoingConnectionsToTarget.put(link, link.getTarget());
-//				add(new DeleteLinkCommand( link, false));
-//			}
-//			for (Iterator iter = this.node.getIncomingConnections().iterator(); iter
-//					.hasNext();) {
-//				Link link = (Link) iter.next();
-//				incomingConnectionsToSource.put(link, link.getSource());
-//				add(new DeleteLinkCommand( link, false));
-//			}
-//		}
-//
-//		public void execute() {
-//			index = container.getNodes().indexOf(node);
-//			// There's always the possibility that this node has already been
-//			// deleted by the time this command is executed (eg., when the
-//			// package containing this class is also selected). Hence, we check
-//			// to see if the node exists in the diagram. If not, do nothing.
-//			if (index == -1)
-//				return;
-//
-//			super.execute();
-//			container.getNodes().remove(index);
-//			
-//		}
-//
-//		public void undo() {
-//			if (index == -1)
-//				return;
-//			container.getNodes().add(index, node);
-//			super.undo();
-//		}
-//
-//		/**
-//		 * @see org.eclipse.gef.commands.Command#canExecute()
-//		 */
-//		public boolean canExecute() {
-//			if (Validation.checkDelete(node) != null)
-//				return false;
-//			return super.canExecute();
-//		}
-//	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteLinkCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteLinkCommand.java
deleted file mode 100644
index b10cffb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DeleteLinkCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.epf.authoring.gef.util.Validation;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DeleteLinkCommand extends Command {
-
-	private Link link;
-
-	private Node src, target;
-
-	private int srcIndex, targetIndex;
-
-	private static final String LABEL = AuthoringUIResources.gef_deleteLinkCommand_label; 
-
-	public DeleteLinkCommand(Link link, boolean isHardDelete) {
-		super(LABEL);
-		this.link = link;
-		src = link.getSource();
-		target = link.getTarget();
-	}
-
-	public boolean canExecute() {
-		if (Validation.checkDelete(link) != null)
-			return false;
-		return link != null && src != null && target != null;
-	}
-
-	/*
-	 * This should work even if the link (view) was deleted. Eg., user selects a
-	 * class and one of its references, and hits Ctrl+Del. The class will be
-	 * deleted first and it will delete all its references. When this command is
-	 * executed, it should do the hard-delete part.
-	 */
-	public void execute() {
-		srcIndex = src.getOutgoingConnections().indexOf(link);
-		targetIndex = target.getIncomingConnections().indexOf(link);
-		if (srcIndex != -1 && targetIndex != -1) {
-			src.getOutgoingConnections().remove(srcIndex);
-			target.getIncomingConnections().remove(targetIndex);
-		}
-	}
-
-	public void undo() {
-		if (srcIndex != -1 && targetIndex != -1) {
-			src.getOutgoingConnections().add(srcIndex, link);
-			target.getIncomingConnections().add(targetIndex, link);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DiagramModifyCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DiagramModifyCommand.java
deleted file mode 100644
index 95f16bd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/DiagramModifyCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class DiagramModifyCommand extends Command {
-
-	private EObject object;
-
-	private boolean canUndo = true;
-
-	public DiagramModifyCommand(String label) {
-		super(label);
-	}
-
-	protected void setDiagram(Diagram diagram) {
-		Object obj = diagram.getObject();
-		if (obj instanceof EObject) {
-			object = (EObject) obj;
-		}
-	}
-
-	protected boolean prepareExecute() {
-		IStatus status = UserInteractionHelper.checkModify(object, MsgBox.getDefaultShell());
-		if (status.isOK()) {
-			return true;
-		} else {
-			AuthoringUIPlugin.getDefault().getMsgDialog()
-					.displayWarning(
-							DiagramUIResources.errorDialog_title, 
-							DiagramUIResources.command_cannotEdit, 
-							status);
-			return false;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		if (prepareExecute()) {
-			doExecute();
-			canUndo = true;
-		} else {
-			canUndo = false;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#canUndo()
-	 */
-	public boolean canUndo() {
-		return canUndo;
-	}
-
-	protected abstract void doExecute();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/MoveBendpointCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/MoveBendpointCommand.java
deleted file mode 100644
index 10b75c1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/MoveBendpointCommand.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.gef.commands.Command;
-
-/**
- * Bendpoint manipulation commands cannot be chained or compounded.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MoveBendpointCommand extends Command {
-
-	private Link link;
-
-	private int index;
-
-	private AbsoluteBendpoint oldBendpoint;
-
-	AbsoluteBendpoint newBendpoint;
-
-	private static final String LABEL = AuthoringUIResources.gef_moveBendpointCommand_label; 
-
-	public MoveBendpointCommand(Link link, Point location, int index) {
-		super(LABEL);
-		this.link = link;
-		this.index = index;
-		newBendpoint = new AbsoluteBendpoint(location);
-		oldBendpoint = link.getBendpoints().get(index);
-	}
-
-	public boolean canExecute() {
-		return link != null && index >= 0 && newBendpoint != null
-				&& oldBendpoint != null;
-	}
-
-	public void execute() {
-		link.getBendpoints().set(index, newBendpoint);
-	}
-
-	public void undo() {
-		link.getBendpoints().set(index, oldBendpoint);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ReconnectLinkCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ReconnectLinkCommand.java
deleted file mode 100644
index 049329f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/ReconnectLinkCommand.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.gef.util.Validation;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 3.1
- */
-public class ReconnectLinkCommand extends Command {
-
-	private boolean isSource;
-
-	private Link link;
-
-	private Node newNode, oldNode;
-
-	private int viewIndex;
-
-	private Point endPoint;
-
-	private static final String LABEL = AuthoringUIResources.gef_reconnectLinkCommand_label; 
-
-	public ReconnectLinkCommand(Link link, Node newNode, boolean isSource) {
-		super(LABEL);
-		this.link = link;
-		this.newNode = newNode;
-		this.isSource = isSource;
-	}
-
-	public void setEndPoint(Point p) {
-		endPoint = p.getCopy();
-	}
-
-	public boolean canExecute() {
-		boolean result = link != null && newNode != null;
-		if (!result) {
-			return false;
-		}
-		if (isSource) {
-			return Validation.checkReconnect(newNode, link.getTarget(), link) == null;
-		} else {
-			return Validation.checkReconnect(link.getSource(), newNode, link) == null;
-		}
-	}
-
-	public void execute() {
-
-		// Link
-		if (isSource) {
-			oldNode = link.getSource();
-			if (oldNode != null) { // safety check to handle dangling link
-				viewIndex = oldNode.getOutgoingConnections().indexOf(link);
-			}
-			link.setSource(newNode);
-			link.setSourceEndPoint(endPoint);
-		} else {
-			oldNode = link.getTarget();
-			if (oldNode != null) { // safety check to handle dangling link
-				viewIndex = oldNode.getIncomingConnections().indexOf(link);
-			}
-			link.setTarget(newNode);
-			link.setTargetEndPoint(endPoint);
-		}
-
-	}
-
-	public void undo() {
-		if (isSource) {
-			newNode.getOutgoingConnections().remove(link);
-			oldNode.getOutgoingConnections().add(viewIndex, link);
-		} else {
-			newNode.getIncomingConnections().remove(link);
-			oldNode.getIncomingConnections().add(viewIndex, link);
-		}
-		oldNode = null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/RefreshDiagramFromBaseActivityCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/RefreshDiagramFromBaseActivityCommand.java
deleted file mode 100644
index be35653..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/RefreshDiagramFromBaseActivityCommand.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.commands;
-
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.gef.commands.Command;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RefreshDiagramFromBaseActivityCommand extends Command {
-
-	private static final String LABEL = DiagramUIResources.refreshFromBaseCmd_label; 
-
-	public RefreshDiagramFromBaseActivityCommand() {
-		super(LABEL);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/package.html
deleted file mode 100644
index 4ce2d7b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/commands/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides commands for editing the activity diagrams.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDetailDiagramEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDetailDiagramEditPart.java
deleted file mode 100644
index 7050436..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDetailDiagramEditPart.java
+++ /dev/null
@@ -1,321 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-
-
-/**
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- * 
- */
-public class ActivityDetailDiagramEditPart extends DiagramEditPart {
-
-	int y = 60;
-
-	boolean xaxisbegin = false;
-
-	boolean loading = true;
-
-	final static int spacing = 40;
-
-	final static int yspacing = 20;
-
-	boolean miscellaneous = false;
-
-	int x = 10;
-
-	public static final String OUTPUTS = "outputs"; //$NON-NLS-1$
-
-	public static final String INPUTS = "inputs"; //$NON-NLS-1$
-
-	private List recentlyAddedParts = new ArrayList();
-
-	/** 
-	 * EditPart for ActivityDetailDiagram.
-	 */
-	public ActivityDetailDiagramEditPart(ActivityDetailDiagram model) {
-		super(model);
-	}
-
-	/**
-	 * Override method super.resetChildrenLocations. In this, All the Task's
-	 * MandatoryInput workproducts placed on top. and RoleTask composite in the
-	 * middle. and Task's output workproducts south.
-	 */
-	protected void resetChildrenLocations() {
-		final int yspacing = 40;
-		List rolecompositeList = new ArrayList();
-		List inputworkproductCompositeList = new ArrayList();
-		List outputWorkProductCompositeList = new ArrayList();
-		List miscList = new ArrayList();
-		List taskList = new ArrayList();
-		this.recentlyAddedParts = new ArrayList();
-
-		HashMap map = new HashMap();
-
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			Node n = (Node) ((EditPart) child).getModel();
-			if (n.getLocation() == null || n.getLocation().x == -1) {
-				this.recentlyAddedParts.add(child);
-			}
-			if (child instanceof RoleTaskCompositeEditPart) {
-				rolecompositeList.add(child);
-				List list = ((RoleTaskCompositeEditPart) child).getChildren();
-				for (Iterator it = list.iterator(); it.hasNext();) {
-					Object obj = it.next();
-					Node objNode = (Node) ((NodeEditPart) obj).getModel();
-					if (objNode instanceof TaskNode) {
-						taskList.add(objNode);
-						HashMap taskMap = new HashMap();
-						List inputList = new ArrayList();
-						List outputList = new ArrayList();
-						taskMap.put("inputs", inputList); //$NON-NLS-1$
-						taskMap.put("outputs", outputList); //$NON-NLS-1$
-						map.put(objNode, taskMap);
-					}
-				}
-			} else if (child instanceof WorkProductCompositeEditPart) {
-				GraphicalEditPart part = (GraphicalEditPart) child;
-				if (part.getModel() instanceof WorkProductComposite) {
-					WorkProductComposite node = (WorkProductComposite) part
-							.getModel();
-					if (node.getType() == WorkProductComposite.INPUTS) {
-						inputworkproductCompositeList.add(child);
-					} else if (node.getType() == WorkProductComposite.OUTPUTS) {
-						outputWorkProductCompositeList.add(child);
-					}
-					calcSize(child);
-				}
-			} else {
-				miscList.add(child);
-			}
-		}
-
-		// Set size for the rolecomposite.
-		if (!rolecompositeList.isEmpty()) {
-			for (Iterator itor = rolecompositeList.iterator(); itor.hasNext();) {
-				Object object = itor.next();
-				List list = ((RoleTaskCompositeEditPart) object).getChildren();
-				for (Iterator itor1 = list.iterator(); itor1.hasNext();) {
-					Object obj = itor1.next();
-					if (obj instanceof DescriptorNodeEditPart) {
-						if (((DescriptorNodeEditPart) obj).getModel() instanceof TaskNode) {
-							TaskNode taskNode = (TaskNode) ((DescriptorNodeEditPart) obj)
-									.getModel();
-							TaskDescriptor task = (TaskDescriptor) taskNode
-									.getObject();
-							for (Iterator wpitor = inputworkproductCompositeList
-									.iterator(); wpitor.hasNext();) {
-								WorkProductCompositeEditPart wpEditPart = (WorkProductCompositeEditPart) wpitor
-										.next();
-								WorkProductComposite wpCompositeNode = (WorkProductComposite) wpEditPart
-										.getModel();
-								Object wpObject = wpCompositeNode.getObject();
-								if (wpObject.equals(task)) {
-									int width = wpEditPart.getFigure()
-											.getPreferredSize().width;
-									int height = ((DescriptorNodeEditPart) obj)
-											.getFigure().getPreferredSize().height;
-									((DescriptorNodeEditPart) obj)
-											.getFigure()
-											.setPreferredSize(
-													new Dimension(width, height));
-									if (((WorkProductComposite) wpEditPart
-											.getModel()).getType() == WorkProductComposite.INPUTS) {
-										List inputList = (List) ((HashMap) map
-												.get(taskNode)).get(INPUTS);
-										inputList.add(wpEditPart);
-									} else if (((WorkProductComposite) wpEditPart
-											.getModel()).getType() == WorkProductComposite.OUTPUTS) {
-										List outputList = (List) ((HashMap) map
-												.get(taskNode)).get(OUTPUTS);
-										outputList.add(wpEditPart);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (!rolecompositeList.isEmpty()) {
-			for (int i = 0; i < rolecompositeList.size(); i++) {
-				List confirmedSeqInputList = new ArrayList();
-				List confirmedSeqOutputList = new ArrayList();
-				List list = ((RoleTaskCompositeEditPart) rolecompositeList
-						.get(i)).getChildren();
-				for (int j = 0; j < list.size(); j++) {
-					DescriptorNodeEditPart task = (DescriptorNodeEditPart) list
-							.get(j);
-					if (task.getModel() instanceof TaskNode) {
-						TaskNode tasknode = (TaskNode) task.getModel();
-						for (int k = 0; k < inputworkproductCompositeList
-								.size(); k++) {
-							WorkProductComposite wpcomp = ((WorkProductComposite) ((WorkProductCompositeEditPart) inputworkproductCompositeList
-									.get(k)).getModel());
-							if (wpcomp.getObject().equals(tasknode.getObject())) {
-								if (wpcomp.getType() == WorkProductComposite.INPUTS) {
-									confirmedSeqInputList
-											.add(inputworkproductCompositeList
-													.get(k));
-								}
-							}
-						}
-						for (int k = 0; k < outputWorkProductCompositeList
-								.size(); k++) {
-							WorkProductComposite wpcomp = ((WorkProductComposite) ((WorkProductCompositeEditPart) outputWorkProductCompositeList
-									.get(k)).getModel());
-							if (wpcomp.getObject().equals(tasknode.getObject())) {
-								if (wpcomp.getType() == WorkProductComposite.OUTPUTS) {
-									confirmedSeqOutputList
-											.add(outputWorkProductCompositeList
-													.get(k));
-								}
-							}
-						}
-					}
-				}
-				if (!confirmedSeqInputList.isEmpty()) {
-					setObjectsLocations(confirmedSeqInputList);
-					y = cachedPoint.y + cachedHeight + yspacing;
-				}
-				List roleC = new ArrayList();
-				roleC.add(rolecompositeList.get(i));
-				setObjectsLocations(roleC);
-
-				y = cachedPoint.y + cachedHeight + yspacing;
-				if (!confirmedSeqOutputList.isEmpty()) {
-					setObjectsLocations(confirmedSeqOutputList);
-					y = cachedPoint.y + cachedHeight + yspacing;
-				}
-			}
-
-		}
-
-		if (!miscList.isEmpty()) {
-			if (debug) {
-				System.out.println("Print Size of misc: " + miscList.size()); //$NON-NLS-1$
-			}
-			if (!loading) {
-				miscellaneous = true;
-			}
-			setObjectsLocations(miscList);
-			miscellaneous = false;
-		}
-
-		loading = false;
-	}
-
-	private void calcSize(Object child) {
-		List list = ((GraphicalEditPart) child).getChildren();
-		int largestWidth = 0;
-		int largestHeight = 0;
-		for (Iterator it = list.iterator(); it.hasNext();) {
-			Object obj = it.next();
-			Node objNode = (Node) ((NodeEditPart) obj).getModel();
-			if (objNode instanceof WorkProductDescriptorNode) {
-				int nodeWidth = ((DescriptorNodeEditPart) obj).getFigure()
-						.getPreferredSize().width;
-				int nodeHeight = ((DescriptorNodeEditPart) obj).getFigure()
-						.getPreferredSize().height;
-				if (nodeWidth > largestWidth)
-					largestWidth = nodeWidth;
-				if (nodeHeight > largestHeight)
-					largestHeight = nodeHeight;
-			}
-		}
-		((WorkProductCompositeEditPart) child).getFigure().setPreferredSize(
-				new Dimension(largestWidth * 2 + 10, 20 + largestHeight
-						* (list.size() / 2 + 1)));
-	}
-
-	private void setObjectsLocations(List list) {
-
-		xaxisbegin = true;
-		x = 10;
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child instanceof GraphicalEditPart) {
-				GraphicalEditPart part = (GraphicalEditPart) child;
-				if (part.getModel() instanceof Node) {
-					Node node = (Node) part.getModel();
-					Point p = node.getLocation();
-					if (p == null || p.x == -1) {
-						int viewerWidth = part.getRoot().getViewer()
-								.getControl().getBounds().width;
-						if (!xaxisbegin) {
-							x = cachedPoint.x + cachedWidth + spacing;
-						}
-						// check if p is null, create Point.
-						if (p == null)
-							p = new Point();
-
-						if (!loading && miscellaneous) {
-							p.x = x;
-							p.y = 10;
-						} else {
-							p.x = x;
-							p.y = y;
-						}
-						node.setLocation(p);
-						if (!miscellaneous)
-							cachedPoint = p;
-						cachedWidth = part.getFigure().getPreferredSize().width;
-						if (part.getFigure().getPreferredSize().height > cachedHeight)
-							cachedHeight = part.getFigure().getPreferredSize().height;
-						xaxisbegin = false;
-						if (debug) {
-							System.out
-									.println("Point : " + new Point(x, y).toString() + "And width=" //$NON-NLS-1$ //$NON-NLS-2$
-											+ cachedWidth
-											+ ", Height=" + cachedHeight + ", Width of Viewer: " + viewerWidth); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns recently addded editparts. Usually called 
-	 * by diagram services to do autolayout adjustment.
-	 */
-	public List getRecentlyAddedParts() {
-		return recentlyAddedParts;
-	}
-
-	/**
-	 * Clear the recently added editparts from the list.
-	 */
-	public void clearRecentlyAddedParts() {
-		recentlyAddedParts.clear();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDetailDiagramEditPartFactory.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDetailDiagramEditPartFactory.java
deleted file mode 100644
index 9f46f55..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDetailDiagramEditPartFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-
-/**
- * Factory for ActivityDetailDiagram's EditPart. Creates an EditPart for
- * Activity Detail Diagram's children.  
- * 
- * @author Jinhua Xi
- * @since 1.0
- * 
- */
-public class ActivityDetailDiagramEditPartFactory implements EditPartFactory {
-
-	/**
-	 * Creates an EditPart for a child with in the context.
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-		if (model instanceof ActivityDetailDiagram) {
-			return new ActivityDetailDiagramEditPart(
-					(ActivityDetailDiagram) model);
-		} else if (model instanceof RoleTaskComposite) {
-			return new RoleTaskCompositeEditPart((RoleTaskComposite) model);
-		} else if (model instanceof WorkProductComposite) {
-			return new WorkProductCompositeEditPart(
-					(WorkProductComposite) model);
-		} else if (model instanceof RoleNode || model instanceof TaskNode
-				|| model instanceof WorkProductDescriptorNode) {
-			return new DescriptorNodeEditPart((NamedNode) model);
-		} else if (model instanceof Link) {
-			return new LinkEditPart((Link) model);
-		}
-		if (model instanceof TypedNode) {
-			TypedNode node = (TypedNode) model;
-			switch (node.getType()) {
-			case TypedNode.START:
-				return new StartNodeEditPart(node);
-			case TypedNode.END:
-				return new EndNodeEditPart(node);
-			case TypedNode.DECISION:
-				return new DecisionNodeEditPart(node);
-			case TypedNode.SYNCH_BAR:
-				return new SynchBarNodeEditPart(node);
-			case TypedNode.FREE_TEXT:
-				return new FreeTextNodeEditPart(node);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDiagramEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDiagramEditPart.java
deleted file mode 100644
index 7079f90..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDiagramEditPart.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-
-/**
- * EditPart for ActivityDiagram.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityDiagramEditPart extends DiagramEditPart {
-
-	/**
-	 * Creates a editpart for Activity Diagram. 
-	 * 
-	 * @param model {@link ActivityDiagram}
-	 */
-	public ActivityDiagramEditPart(ActivityDiagram model) {
-		super(model);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDiagramEditPartFactory.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDiagramEditPartFactory.java
deleted file mode 100644
index 3ec976a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ActivityDiagramEditPartFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityDiagramEditPartFactory implements EditPartFactory {
-
-	/**
-	 * Creates editpart for ActivityDiagram's children. 
-	 * 
-	 * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart,
-	 *      java.lang.Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-		if (model instanceof ActivityDiagram) {
-			return new ActivityDiagramEditPart((ActivityDiagram) model);
-		} else if (model instanceof WorkBreakdownElementNode) {
-			return new WorkBreakdownElementNodeEditPart((NamedNode) model);
-		} else if (model instanceof Link) {
-			return new LinkEditPart((Link) model);
-		} else if (model instanceof TypedNode) {
-			TypedNode node = (TypedNode) model;
-			switch (node.getType()) {
-			case TypedNode.START:
-				return new StartNodeEditPart(node);
-			case TypedNode.END:
-				return new EndNodeEditPart(node);
-			case TypedNode.DECISION:
-				return new DecisionNodeEditPart(node);
-			case TypedNode.SYNCH_BAR:
-				return new SynchBarNodeEditPart(node);
-			case TypedNode.FREE_TEXT:
-				return new FreeTextNodeEditPart(node);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/BaseEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/BaseEditPart.java
deleted file mode 100644
index 32197da..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/BaseEditPart.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.text.TextFlow;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.authoring.gef.edit.policies.LabelSelectionEditPolicy;
-import org.eclipse.epf.authoring.gef.figures.SelectableLabel;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-
-/**
- * Provides infrastructure for deletion, direct-editing, property source and
- * model-listening.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class BaseEditPart extends AbstractGraphicalEditPart {
-
-	protected DirectEditManager manager;
-
-	protected Adapter modelListener = new AdapterImpl() {
-		public void notifyChanged(Notification msg) {
-			handlePropertyChanged(msg);
-		}
-	};
-
-	/**
-	 * Constructor 
-	 * @param obj {@link EObject}
-	 */
-	public BaseEditPart(EObject obj) {
-		super();
-		setModel(obj);
-	}
-
-	public void activate() {
-		super.activate();
-		((EObject) getModel()).eAdapters().add(modelListener);
-	}
-
-	protected abstract DirectEditPolicy createDirectEditPolicy();
-
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-				new LabelSelectionEditPolicy());
-	}
-
-	protected IFigure createFigure() {
-		return new SelectableLabel();
-	}
-
-	/**
-	 * (non-Javadoc)
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate()
-	 */
-	public void deactivate() {
-		((EObject) getModel()).eAdapters().remove(modelListener);
-		super.deactivate();
-	}
-
-	IFigure getDirectEditFigure() {
-		return getFigure();
-	}
-
-	String getDirectEditText() {
-		IFigure fig = getDirectEditFigure();
-		if (fig instanceof Label) {
-			return ((Label) fig).getText();
-		} else if (fig instanceof TextFlow) {
-			return ((TextFlow) fig).getText();
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	protected abstract void handlePropertyChanged(Notification msg);
-
-	protected DirectEditManager getDirectEditManager() {
-		if (manager == null) {
-			manager = createDirectEditManager();
-		}
-		return manager;
-	}
-
-	protected void performDirectEdit() {
-		getDirectEditManager();
-
-		if (manager != null) {
-			manager.show();
-		}
-	}
-
-	protected DirectEditManager createDirectEditManager() {
-		return new LabelDirectEditManager(this, TextCellEditor.class,
-				new LabelCellEditorLocator(getDirectEditFigure()));
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/BottomAnchor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/BottomAnchor.java
deleted file mode 100644
index 9b7f56a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/BottomAnchor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.AbstractConnectionAnchor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * Provides support for bottom anchor for a figure's bottom location.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-class BottomAnchor extends AbstractConnectionAnchor {
-
-	private int offset;
-
-	BottomAnchor(IFigure source, int offset) {
-		super(source);
-		this.offset = offset;
-	}
-
-	public Point getLocation(Point reference) {
-		Rectangle r = getOwner().getBounds().getCopy();
-		getOwner().translateToAbsolute(r);
-		int off = offset;
-		if (off == -1)
-			off = r.width / 2;
-		if (r.contains(reference) || r.bottom() > reference.y)
-			return r.getTopLeft().translate(off, 0);
-		else
-			return r.getBottomLeft().translate(off, -1);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ClosestAnchor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ClosestAnchor.java
deleted file mode 100644
index c604a5e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ClosestAnchor.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.AbstractConnectionAnchor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.authoring.gef.util.AnchorUtil;
-
-/**
- * Provides support to find the closest location in figure
- * for anchor. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ClosestAnchor extends AbstractConnectionAnchor {
-
-	public ClosestAnchor(IFigure figure) {
-		super(figure);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.ConnectionAnchor#getLocation(Point)
-	 */
-	public Point getLocation(Point reference) {
-		return getLocation(getOwner(), reference);
-	}
-
-	/**
-	 * Finds the location in the closest location in figure, based on 
-	 * figure bounds and the reference point.   
-	 * 
-	 * @param figure {@link IFigure}  Figure to which connection is establishing.
-	 * @param reference {@link Point}
-	 */
-	public static Point getLocation(IFigure figure, Point reference) {
-		Rectangle r = figure.getBounds().getCopy();
-		figure.translateToAbsolute(r);
-		Rectangle absoluteBounds = r.getCopy();
-		Point p = null;
-		switch (r.getPosition(reference)) {
-		case PositionConstants.NORTH:
-			p = r.getTopLeft().translate(reference.x - r.x, 0);
-			break;
-		case PositionConstants.NORTH_EAST:
-			p = r.getTopRight();
-			break;
-		case PositionConstants.EAST:
-			p = r.getTopRight().translate(0, reference.y - r.y);
-			break;
-		case PositionConstants.SOUTH_EAST:
-			p = r.getBottomRight();
-			break;
-		case PositionConstants.SOUTH:
-			p = r.getBottomLeft().translate(reference.x - r.x, 0);
-			break;
-		case PositionConstants.SOUTH_WEST:
-			p = r.getBottomLeft();
-			break;
-		case PositionConstants.WEST:
-			p = r.getTopLeft().translate(0, reference.y - r.y);
-			break;
-		case PositionConstants.NORTH_WEST:
-			p = r.getTopLeft();
-			break;
-		default:
-			int topDistance = reference.y - r.y;
-			int rightDistance = r.right() - reference.x;
-			int bottomDistance = r.bottom() - reference.y;
-			int leftDistance = reference.x - r.x;
-			int[] distances = { topDistance, rightDistance, bottomDistance,
-					leftDistance };
-			int id = AnchorUtil.min(distances);
-			switch (id) {
-			case 0:
-				p = r.getTopLeft().translate(leftDistance, 0);
-				break;
-			case 1:
-				p = r.getTopRight().translate(0, topDistance);
-				break;
-			case 2:
-				p = r.getBottomLeft().translate(leftDistance, 0);
-				break;
-			case 4:
-				p = r.getTopLeft().translate(topDistance, 0);
-				break;
-			}
-		}
-		if (p != null) {
-			p.performTranslate(-absoluteBounds.x, -absoluteBounds.y);
-		}
-		return p;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DecisionNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DecisionNodeEditPart.java
deleted file mode 100644
index 89e2abf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DecisionNodeEditPart.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.authoring.gef.figures.Diamond;
-import org.eclipse.epf.authoring.gef.util.AnchorUtil;
-import org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * EditPart for  DecisionNode, used in activity diagram.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DecisionNodeEditPart extends NodeEditPart implements
-		ConnectionAnchorLocator {
-
-	private static final Color BG_COLOR = new Color(null, 254, 204, 153);
-
-	private Point recentSourceEndPoint;
-
-	private Point recentTargetEndPoint;
-
-	public DecisionNodeEditPart(TypedNode model) {
-		super(model);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditPolicy()
-	 */
-	protected DirectEditPolicy createDirectEditPolicy() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		Diamond figure = new Diamond();
-		figure.setBackgroundColor(BG_COLOR);
-		figure.setSize(48, 24);
-		return figure;
-	}
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(
-			ConnectionEditPart connection) {
-		boolean isRelative = false;
-		Point sourceEndPoint;
-		if (recentSourceEndPoint == null) {
-			// get source end point from the model
-			Link link = (Link) connection.getModel();
-			sourceEndPoint = link.getSourceEndPoint();
-			isRelative = true;
-		} else {
-			sourceEndPoint = recentSourceEndPoint;
-		}
-		if (sourceEndPoint != null) {
-			return new RelativeXYAnchor(getFigure(), sourceEndPoint, isRelative);
-		}
-		return super.getSourceConnectionAnchor(connection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
-		Point p = null;
-		if (request instanceof CreateConnectionRequest) {
-			CreateConnectionRequest req = (CreateConnectionRequest) request;
-			p = req.getLocation();
-		} else if (request instanceof LocationRequest) {
-			p = ((LocationRequest) request).getLocation();
-		}
-		if (p != null) {
-			recentSourceEndPoint = getLocation(p);
-			return new RelativeXYAnchor(getFigure(), recentSourceEndPoint, true);
-		}
-		return super.getSourceConnectionAnchor(request);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(
-			ConnectionEditPart connection) {
-		boolean isRelative = false;
-		Point targetEndPoint;
-		if (recentTargetEndPoint == null) {
-			// get target end point from model
-			Link link = (Link) connection.getModel();
-			targetEndPoint = link.getTargetEndPoint();
-			isRelative = true;
-		} else {
-			targetEndPoint = recentTargetEndPoint;
-		}
-		if (targetEndPoint != null) {
-			return new RelativeXYAnchor(getFigure(), targetEndPoint, isRelative);
-		}
-
-		return super.getTargetConnectionAnchor(connection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
-		Point p = null;
-		if (request instanceof CreateConnectionRequest) {
-			CreateConnectionRequest req = (CreateConnectionRequest) request;
-			p = req.getLocation();
-		} else if (request instanceof LocationRequest) {
-			p = ((LocationRequest) request).getLocation();
-		}
-		if (p != null) {
-			recentTargetEndPoint = getLocation(p);
-			return new RelativeXYAnchor(getFigure(), recentTargetEndPoint, true);
-		}
-
-		return super.getTargetConnectionAnchor(request);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator#getLocation(Point)
-	 */
-	public Point getLocation(Point reference) {
-		Diamond f = ((Diamond) getFigure());
-
-		// translate points to absolute
-		Point[] points = new Point[f.getPoints().size()];
-		for (int i = f.getPoints().size() - 1; i > -1; i--) {
-			Point p = f.getPoints().getPoint(i);
-			f.translateToAbsolute(p);
-			points[i] = p;
-		}
-
-		Point p = AnchorUtil.getClosestPoint(points, reference);
-		if (p != null) {
-			Rectangle r = f.getBounds().getCopy();
-			f.translateToAbsolute(r);
-			p.performTranslate(-r.x, -r.y);
-		}
-		return p;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DescriptorNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DescriptorNodeEditPart.java
deleted file mode 100644
index aa7a64b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DescriptorNodeEditPart.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.epf.authoring.gef.figures.Images;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.graphics.Image;
-
-
-/**
- * EditPart for WorkBreakdown Elements in an Activity.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DescriptorNodeEditPart extends NamedNodeEditPart {
-
-	public DescriptorNodeEditPart(NamedNode model) {
-		super(model);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NamedNodeEditPart#getImage()
-	 */
-	protected Image getImage() {
-		Object model = getModel();
-		if (model instanceof RoleNode) {
-			if(((Node)model).getDiagram() instanceof ActivityDetailDiagram)
-				return Images.ROLE_DESCRIPTOR_16;
-			return Images.ROLE;
-		} else if (model instanceof TaskNode) {
-			if(((Node)model).getDiagram() instanceof ActivityDetailDiagram)
-				return Images.TASK_DESCRIPTOR_16;
-			return Images.TASK_DESCRIPTOR;
-		} else if (model instanceof WorkProductDescriptorNode) {
-			if(((Node)model).getDiagram() instanceof ActivityDetailDiagram)
-				return Images.WORK_PRODUCT_DESCRIPTOR_16;
-			WorkProductDescriptor wpd = (WorkProductDescriptor) ((LinkedObject) model)
-					.getObject();
-			WorkProduct wp = wpd.getWorkProduct();
-			if (wp instanceof Artifact) {
-				return Images.WORK_PRODUCT_DESCRIPTOR_16;
-			} else if (wp instanceof Deliverable) {
-				return Images.DELIVERABLE;
-			} else if (wp instanceof Outcome) {
-				return Images.OUTCOME;
-			}
-			return Images.WORK_PRODUCT_DESCRIPTOR_16;
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NamedNodeEditPart#createDirectEditPolicy() *
-	 */
-	protected DirectEditManager createDirectEditManager() {
-		Label l = (Label) getFigure();
-		return new ValidatingDirectEditManager(this, TextCellEditor.class,
-				new LabelTextCellEditorLocator(l), l) {
-
-			protected String validate(String txt) {
-				Object obj = getEditPart().getModel();
-				if (obj instanceof WorkProductDescriptorNode) {
-					Node node = (Node) obj;
-					Object e = node.getObject();
-					return TngUtil.checkWorkProductDescriptorPresentationName(
-							e, txt, node.getDiagram().getSuppression());
-				}
-				if (obj instanceof TaskNode) {
-					Node node = (Node) obj;
-					Object e = node.getObject();
-					return TngUtil.checkWorkBreakdownElementPresentationName(e,
-							txt, node.getDiagram().getSuppression());
-				}
-				if (obj instanceof RoleNode) {
-					Node node = (Node) obj;
-					Object e = node.getObject();
-					return TngUtil.checkRoleDescriptorPresentationName(e, txt, node.getDiagram().getSuppression());
-				}
-
-				return super.validate(txt);
-			}
-		};
-	}
-
-	protected void refreshSourceConnections() {
-		super.refreshSourceConnections();
-	}
-
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, null);
-	}
-	protected DirectEditManager getDirectEditManager() {
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramActionService.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramActionService.java
deleted file mode 100644
index fcc4575..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramActionService.java
+++ /dev/null
@@ -1,514 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.authoring.gef.commands.ChangeBoundsCommand;
-import org.eclipse.epf.authoring.gef.commands.ReconnectLinkCommand;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Service class to allow create and register common action to the action
- * register. Most of the code are moved from the Editor class.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DiagramActionService {
-
-	public static final String ALIGN_HORZ_AVERAGE = "align_horizontal_to_average"; //$NON-NLS-1$
-
-	public static final String ALIGN_HORZ_FIRST_SELECTED = "align_horizontal_to_first_selection"; //$NON-NLS-1$
-
-	public static final String ALIGN_VERT_AVERAGE = "align_vertical_to_average"; //$NON-NLS-1$
-
-	public static final String ALIGN_VERT_FIRST_SELECTED = "align_vertical_to_first_selection"; //$NON-NLS-1$
-
-	private DefaultEditDomain editDomain;
-
-	private GraphicalViewer graphicalViewer;
-
-	private ActionRegistry actionRegistry;
-
-	/**
-	 * Constructor 
-	 * @param graphicalViewer {@link GraphicalViewer}
-	 * @param editDomain 	{@link DefaultEditDomain}
-	 * @param actionRegistry 	{@link ActionRegistry}
-	 */
-	public DiagramActionService(GraphicalViewer graphicalViewer,
-			DefaultEditDomain editDomain, ActionRegistry actionRegistry) {
-		this.graphicalViewer = graphicalViewer;
-		this.editDomain = editDomain;
-		this.actionRegistry = actionRegistry;
-	}
-
-	/**
-	 * Sets the GraphicalViewer.
-	 */
-	public void setGraphicalViewer(GraphicalViewer graphicalViewer) {
-		this.graphicalViewer = graphicalViewer;
-	}
-
-	/**
-	 * returns GraphicalViewer
-	 */
-	private GraphicalViewer getGraphicalViewer() {
-		return graphicalViewer;
-	}
-
-	/**
-	 * Returns the command stack.
-	 * 
-	 * @return the command stack
-	 */
-	protected CommandStack getCommandStack() {
-		return getEditDomain().getCommandStack();
-	}
-
-	/**
-	 * Returns the edit domain.
-	 * 
-	 * @return the edit domain
-	 */
-	protected DefaultEditDomain getEditDomain() {
-		return editDomain;
-	}
-
-	protected ActionRegistry getActionRegistry() {
-		return actionRegistry;
-	}
-
-	/**
-	 * Register HorizontalAlignAverageAction action. 
-	 * HorizontalAignAverage Action aligns selected editparts to horizontal average.  
-	 */
-	public IAction registerHorizontalAlignAverageAction() {
-		// align horizontally to average y-value of all nodes
-		IAction hAlignAverageAction = new Action(
-				DiagramUIResources.AbstractDiagramEditor_hAlignAverageAction_text) { 
-			public void run() {
-				horizAlignToAverageSelected();
-			}
-
-			public String getId() {
-				return ALIGN_HORZ_AVERAGE;
-			}
-		};
-		getActionRegistry().registerAction(hAlignAverageAction);
-
-		return hAlignAverageAction;
-	}
-	
-	/**
-	 * Register HorizontalAlignFirstSelectedAction action. 
-	 * HorizontalAlignFirstSelectedAction aligns selected editparts with 
-	 * respect to first selected editpart. 
-	 */
-
-	public IAction registerHorizontalAlignFirstSelectedAction() {
-		// align horizontally to y-value of first selected node
-		IAction hAlignFirstSelectedAction = new Action(
-				DiagramUIResources.AbstractDiagramEditor_hAlignFirstSelectedAction_text) { 
-			public void run() {
-				horzAlignToFirstSelected();
-			}
-
-			public String getId() {
-				return ALIGN_HORZ_FIRST_SELECTED;
-			}
-		};
-		getActionRegistry().registerAction(hAlignFirstSelectedAction);
-
-		return hAlignFirstSelectedAction;
-	}
-	
-	/**
-	 * Register vertialAlignAverageAction action. 
-	 * vertialAlignAverageAction aligns selected editparts vertically w.r.t average.
-	 * 
-	 */
-	
-	public IAction registerVerticalAlignAverageAction() {
-		// align vertically to average x-value of all selected nodes
-		IAction vAlignAverageAction = new Action(
-				DiagramUIResources.AbstractDiagramEditor_vAlignAverageAction_text) { 
-			public void run() {
-				verticalAlignToAverageSelected();
-			}
-
-			public String getId() {
-				return ALIGN_VERT_AVERAGE;
-			}
-		};
-		getActionRegistry().registerAction(vAlignAverageAction);
-
-		return vAlignAverageAction;
-	}
-
-	/**
-	 * Register vertialAlignFirstSelectedAction action. 
-	 * vertialAlignFirstSelectedAction aligns selected editparts vertically w.r.t first selected.
-	 * 
-	 */
-
-	public IAction registerVerticalAlignFirstSelectedAction() {
-		// align vertically to x-value of first selected node
-		IAction vAlignFirstSelectedAction = new Action(
-				DiagramUIResources.AbstractDiagramEditor_vAlignFirstSelectedAction_text) { 
-			public void run() {
-				verticalAlignToFirstSelected();
-			}
-
-			public String getId() {
-				return ALIGN_VERT_FIRST_SELECTED;
-			}
-		};
-		getActionRegistry().registerAction(vAlignFirstSelectedAction);
-
-		return vAlignFirstSelectedAction;
-	}
-
-	// /////////////////////////////////////////////////////////////////////////////////////////////////
-	// action methods
-	// /////////////////////////////////////////////////////////////////////////////////////////////////
-	
-	/** 
-	 * Action implementation method for horizontalAlignFirsteSElectedAction.
-	 * 
-	 */
-	public void horzAlignToFirstSelected() {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart firstPart = null;
-		// loop through all selected items, remember the y-value of the
-		// first node,
-		// set the following nodes to the same y-value
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof NodeEditPart
-					|| editParts.get(a) instanceof NodeContainerEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// remember the first part we move
-				if (firstPart == null) {
-					firstPart = ep;
-				} else {
-					// calculate the offset for centerline alignment
-					Rectangle bounds = ep.getFigure().getBounds();
-					int offset = (int) ((double) (bounds.height - firstPart
-							.getFigure().getBounds().height) / 2.0);
-					// is this node in a container?
-					if (!(ep.getParent() instanceof DiagramEditPart)) {
-						// need to move the container, adjust the offset
-						ep = (AbstractGraphicalEditPart) ep.getParent();
-						Rectangle parentBounds = ep.getFigure().getBounds();
-						offset += bounds.y - parentBounds.y;
-						bounds = parentBounds;
-					}
-					// send the command to move the node
-					org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-							(Node) ep.getModel(), new Point(bounds.x, firstPart
-									.getFigure().getBounds().y
-									- offset), bounds.width);
-					getCommandStack().execute(c);
-				}
-			}
-		}
-	}
-	
-	/** 
-	 * Action implementation method for horizontalAlignAverageAction.
-	 * 
-	 */
-	public void horizAlignToAverageSelected() {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart firstPart = null;
-		int total = 0;
-		int ysum = 0;
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof NodeEditPart
-					|| editParts.get(a) instanceof NodeContainerEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// remember the first part we move
-				if (firstPart == null) {
-					firstPart = ep;
-				}
-				ysum += ep.getFigure().getBounds().y;
-				total++;
-			}
-		}
-		// calculate the average y-value for all nodes
-		int yave = (int) ((double) ysum / (double) total);
-		// loop through all the nodes again and set them
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof NodeEditPart
-					|| editParts.get(a) instanceof NodeContainerEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// calculate the height difference, so that elements are aligned
-				// through the centerline
-				Rectangle bounds = ep.getFigure().getBounds();
-				int offset = (int) ((double) (bounds.height - firstPart
-						.getFigure().getBounds().height) / 2.0);
-				// is this node inside a container?
-				if (!(ep.getParent() instanceof DiagramEditPart)) {
-					// we need to move the container, adjust the offset
-					ep = (AbstractGraphicalEditPart) ep.getParent();
-					Rectangle parentBounds = ep.getFigure().getBounds();
-					offset += bounds.y - parentBounds.y;
-					bounds = parentBounds;
-				}
-				// send the command to move the node
-				org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-						(Node) ep.getModel(),
-						new Point(bounds.x, yave - offset), bounds.width);
-				getCommandStack().execute(c);
-			}
-		}
-
-	}
-	/** 
-	 * Action implementation method for verticalAlignToAverageAction.
-	 * 
-	 */
-
-	public void verticalAlignToAverageSelected() {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart firstPart = null;
-		int total = 0;
-		int xsum = 0;
-		// loop through the selected parts
-		for (int a = 0; a < editParts.size(); a++) {
-			// we are only interested in nodes and containers
-			if (editParts.get(a) instanceof NodeEditPart
-					|| editParts.get(a) instanceof NodeContainerEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				if (firstPart == null) {
-					firstPart = ep;
-				}
-				// sum the x coordinates of each element
-				xsum += ep.getFigure().getBounds().x;
-				// remember how many selected elements applied to this operation
-				total++;
-			}
-		}
-		// calculate the average x-value for all nodes
-		int xave = (int) ((double) xsum / (double) total);
-		// loop through all the nodes again and set them
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof NodeEditPart
-					|| editParts.get(a) instanceof NodeContainerEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// calculate the offset for centerline alignment
-				Rectangle bounds = ep.getFigure().getBounds();
-				int offset = (int) ((double) (bounds.width - firstPart
-						.getFigure().getBounds().width) / 2.0);
-				// are we inside a container?
-				if (!(ep.getParent() instanceof DiagramEditPart)) {
-					// adjust the offset since we have to move the container
-					ep = (AbstractGraphicalEditPart) ep.getParent();
-					Rectangle parentBounds = ep.getFigure().getBounds();
-					offset += bounds.x - parentBounds.x;
-					bounds = parentBounds;
-				}
-				// send the command to move the element
-				org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-						(Node) ep.getModel(),
-						new Point(xave - offset, bounds.y), bounds.width);
-				getCommandStack().execute(c);
-			}
-		}
-
-	}
-	/** 
-	 * Action implementation method for verticalAlignToFirstSelectedAction.
-	 * 
-	 */
-
-	public void verticalAlignToFirstSelected() {
-		// get the selected items
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart alignToPart = null;
-		// find the first diagram part we can align to
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof NodeEditPart
-					|| editParts.get(a) instanceof NodeContainerEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				if (alignToPart == null) {
-					// remember it and stop
-					alignToPart = ep;
-					break;
-				}
-			}
-		}
-		// loop through the elements and set their new position
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof NodeEditPart
-					|| editParts.get(a) instanceof NodeContainerEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// we can skip the first one since this is an align-to
-				if (ep != alignToPart
-						&& !(alignToPart instanceof SynchBarNodeEditPart)) {
-					// calculate the offset for centerline alignment
-					if (!(ep instanceof SynchBarNodeEditPart)) {
-						Rectangle bounds = ep.getFigure().getBounds();
-						int offset = (int) ((double) (bounds.width - alignToPart
-								.getFigure().getBounds().width) / 2.0);
-						// is this inside a container?
-						if (!(ep.getParent() instanceof DiagramEditPart)) {
-							// adjust the offset since we are moving the
-							// container
-							ep = (AbstractGraphicalEditPart) ep.getParent();
-							Rectangle parentBounds = ep.getFigure().getBounds();
-							offset += bounds.x - parentBounds.x;
-							bounds = parentBounds;
-						}
-						// send the command to move the element
-						org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-								(Node) ep.getModel(), new Point(alignToPart
-										.getFigure().getBounds().x
-										- offset, bounds.y), bounds.width);
-						getCommandStack().execute(c);
-						ep.getFigure().setLocation(
-								new Point(alignToPart.getFigure().getBounds().x
-										- offset, bounds.y));
-					} else {
-						Point tp = ep.getFigure().getBounds().getLocation();
-						boolean connected = false;
-						boolean source = false;
-						Point endPoint = null;
-						LinkEditPart lp = null;
-						// check target connections
-						List list = ((NodeEditPart) ep).getTargetConnections();
-						for (Iterator itor = list.iterator(); itor.hasNext();) {
-							lp = (LinkEditPart) itor.next();
-							if (lp.getSource().equals(alignToPart)) {
-								endPoint = ((Link) lp.getModel())
-										.getTargetEndPoint();
-								tp = tp.getTranslated(endPoint);
-								connected = true;
-								break;
-							}
-						}
-						// check source connections if not found in target connections
-						if (!connected) {
-							list = ((NodeEditPart) ep).getSourceConnections();
-							for (Iterator itor = list.iterator(); itor
-									.hasNext();) {
-								lp = (LinkEditPart) itor.next();
-								if (lp.getTarget().equals(alignToPart)) {
-									endPoint = ((Link) lp.getModel())
-											.getSourceEndPoint();
-									tp = tp.getTranslated(endPoint);
-									connected = true;
-									source = true;
-									break;
-								}
-							}
-						}
-						if (connected && (alignToPart instanceof NodeEditPart)) {
-									Point centerPoint = alignToPart.getFigure()
-											.getBounds().getCenter();
-									int delta = centerPoint.x - tp.x;
-							endPoint.x += delta;
-									ReconnectLinkCommand c = new ReconnectLinkCommand(
-									(Link) lp.getModel(), (Node) ep.getModel(),
-									source);
-							c.setEndPoint(endPoint);
-									getCommandStack().execute(c);
-						}
-
-					}
-				}
-				// If first selected edit part is syncbarnodeeditpart, need to
-				// handle differently
-				if (ep != alignToPart
-						&& (alignToPart instanceof SynchBarNodeEditPart)) {
-
-					Point sp = alignToPart.getFigure().getBounds()
-							.getLocation();
-					boolean connected = false;
-					// check if the part is connected via source connections
-					List list = ((NodeEditPart) alignToPart)
-							.getSourceConnections();
-					for (Iterator itor = list.iterator(); itor.hasNext();) {
-						LinkEditPart lp = (LinkEditPart) itor.next();
-						if (lp.getTarget().equals(ep)) {
-							Point sourceEndPoint = ((Link) lp.getModel())
-									.getSourceEndPoint();
-							sp = sp.getTranslated(sourceEndPoint);
-							connected = true;
-							break;
-						}
-					}
-					// if not found above, check if it is connected via target connections
-					if (!connected) {
-						list = ((NodeEditPart) alignToPart)
-								.getTargetConnections();
-						for (Iterator itor = list.iterator(); itor.hasNext();) {
-							LinkEditPart lp = (LinkEditPart) itor.next();
-							if (lp.getSource().equals(ep)) {
-								Point targetEndPoint = ((Link) lp.getModel())
-										.getTargetEndPoint();
-								sp = sp.getTranslated(targetEndPoint);
-								connected = true;
-								break;
-							}
-						}
-					}
-					if (ep instanceof SynchBarNodeEditPart) {
-						Point tp = ((Node) ep.getModel()).getLocation()
-								.getCopy();
-						Point alignToCenter = alignToPart.getFigure().getBounds().getCenter();
-						Point centerPoint = ep.getFigure().getBounds().getCenter();
-						int delta = alignToCenter.x - centerPoint.x;
-						tp.x = tp.x + delta;
-						org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-								(Node) ep.getModel(), tp, ep.getFigure()
-										.getBounds().width);
-						getCommandStack().execute(c);
-						ep.getFigure().setLocation(new Point(tp.x, tp.y));
-					} else if (ep instanceof NodeEditPart) {
-						Point tp = ((Node) ep.getModel()).getLocation()
-								.getCopy();
-						Point centerPoint = ep.getFigure().getBounds()
-								.getCenter();
-						int delta = sp.x - centerPoint.x;
-						tp.x = tp.x + delta;
-						org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-								(Node) ep.getModel(), tp, ep.getFigure()
-										.getBounds().width);
-						getCommandStack().execute(c);
-						ep.getFigure().setLocation(new Point(tp.x, tp.y));
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramEditPart.java
deleted file mode 100644
index 04e741c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramEditPart.java
+++ /dev/null
@@ -1,241 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.authoring.gef.commands.ChangeBoundsCommand;
-import org.eclipse.epf.authoring.gef.edit.policies.DiagramLayoutEditPolicy;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
-
-/**
- * Provides EditPart for Diagram. Handles the basic layout mechanism
- * if the children location is not set in the diagram.  
- *   
- * @author Phong Nguyen Le
- * @author skannoor
- * @since 1.0
- */
-public class DiagramEditPart extends NodeContainerEditPart {
-
-	Point cachedPoint = new Point(-1, -1);
-
-	protected boolean debug;
-
-	private boolean markDirty = false;
-
-	static int cachedWidth = 10;
-
-	static int cachedHeight = 10;
-
-	public DiagramEditPart(Diagram model) {
-		super(model);
-		debug = AuthoringUIPlugin.getDefault().isDebugging();
-	}
-
-	protected IFigure createFigure() {
-		Figure f = new FreeformLayer() {
-			protected void layout() {
-				if (hasMisplacedChildren()) {
-					resetChildrenLocations();
-				}
-				super.layout();
-			}
-
-		};
-
-		f.setBorder(new MarginBorder(20));
-		f.setLayoutManager(new FreeformLayout());
-		return f;
-	}
-
-	protected void resetChildrenLocations() {
-		int y = 10;
-		final int spacing = 40;
-		int occupied = 0;
-		int xelements = 0;
-		int x = 10;
-		boolean locked = TngUtil.isLocked((EObject)((Diagram)getModel()).getObject());
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child instanceof GraphicalEditPart) {
-				GraphicalEditPart part = (GraphicalEditPart) child;
-				int width = part.getRoot().getViewer().getControl().getBounds().width;
-				if (part.getModel() instanceof Node) {
-					Node node = (Node) part.getModel();
-					Point p = node.getLocation().getCopy();
-					if (p == null || p.x == -1) {
-						if (x + part.getFigure().getPreferredSize().width > width) {
-							y = cachedPoint.y + cachedHeight + spacing;
-							xelements = 0;
-							x = 10;
-							cachedPoint.x = -1;
-							occupied = 0;
-						}
-						if (cachedPoint.x != -1) {
-							x = cachedPoint.x + cachedWidth + spacing;
-						}
-						++xelements;
-						if (p == null) {
-							p = new Point(-1, -1);
-						}
-						p.x = x;
-						p.y = y;
-						//node.setLocation(p);
-						//On opening a AD diagram, editor should be marked dirty.
-						//If diagram is not saved, cannot be browsed. Forcing to save the diagram once.
-						if (!locked && ((Diagram) getModel()).isNew()
-								&& !((Diagram) getModel()).isReadOnly()
-								&& markDirty) {
-							ChangeBoundsCommand cbc = new ChangeBoundsCommand(node, p, part.getFigure()
-											.getPreferredSize().width);
-							getViewer().getEditDomain().getCommandStack()
-									.execute(cbc);
-						} else {
-							// If Plugin is Locked: Do auto-layout and donot
-							// save to model.
-							node.setLocation(p);
-						}
-						
-						cachedPoint = p;
-						cachedWidth = part.getFigure().getPreferredSize().width;
-						cachedHeight = part.getFigure().getPreferredSize().height;
-						if (debug) {
-							System.out
-									.println("Point : " + new Point(x, y).toString()); //$NON-NLS-1$
-							System.out
-									.println("Cached : width: " + cachedWidth + " Height : " + cachedHeight); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-						occupied += x;
-					}
-				}
-			}
-		}
-	}
-
-	protected boolean hasMisplacedChildren() {
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child instanceof EditPart) {
-				Object model = ((EditPart) child).getModel();
-				if (model instanceof Node) {
-					Node node = (Node) model;
-					Point p = node.getLocation();
-					if (p == null || p.x == -1){
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE,
-				new RootComponentEditPolicy());
-		installEditPolicy(EditPolicy.CONTAINER_ROLE,
-				new DiagramLayoutEditPolicy());
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart#addPartToEdit(Collection,
-	 *      Object)
-	 */
-	protected void addPartToEdit(Collection partsToEdit, Object node) {
-		if (node instanceof NodeContainer) {
-			NodeContainerEditPart editPart = (NodeContainerEditPart) findChildByModel(node);
-			for (Iterator iter = ((NodeContainer) node).getNodes().iterator(); iter
-					.hasNext();) {
-				editPart.addPartToEdit(partsToEdit, iter.next());
-			}
-		} else {
-			super.addPartToEdit(partsToEdit, node);
-		}
-	}
-
-	/**
-	 * Moves complete diagram children to given delta. 
-	 * @param int  (X-axis delta)
-	 * @param int  (Y-axis delta)
-	 * 
-	 */
-	public void moveFigure(int moveX, int moveY) {
-		for (Iterator iter = this.getChildren().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child instanceof GraphicalEditPart) {
-				GraphicalEditPart part = (GraphicalEditPart) child;
-				Rectangle bounds = part.getFigure().getBounds();
-				Rectangle r = new Rectangle(new Point(bounds.x + moveX,
-						bounds.y + moveY), bounds.getSize());
-
-				// also need to move the bend points
-				List list = part.getSourceConnections();
-				for (Iterator itor = list.iterator(); itor.hasNext();) {
-					LinkEditPart linkpart = (LinkEditPart) itor.next();
-					Link link = (Link) linkpart.getModel();
-					if (link.getBendpoints().size() > 0) {
-						PointList plist = ((PolylineConnection) linkpart
-								.getFigure()).getPoints();
-						List points = new ArrayList();
-						for (int i = 1; i < plist.size() - 1; i++) {
-							Point p = plist.getPoint(i);
-							p = p.translate(new Point(moveX, moveY));
-
-							org.eclipse.draw2d.AbsoluteBendpoint bp = new org.eclipse.draw2d.AbsoluteBendpoint(
-									p);
-							points.add(bp);
-						}
-
-						linkpart.getConnectionFigure().setRoutingConstraint(
-								points);
-					}
-				}
-
-				this.setLayoutConstraint(part, part.getFigure(), r);
-
-			} else {
-				// System.out.println("Part not moved: " + child); //$NON-NLS-1$
-			}
-		}
-
-	}
-	/**
-	 * On opening a diagram, editor should be marked dirty.
-	 * Invoker of DiagramEditPart should explicitly set the flag to mark editor dirty
-	 * or not. Withou handling this will cause browsing perspective in consistent.    
-	 * For defect: https://bugs.eclipse.org/bugs/show_bug.cgi?id=156029
-	 */
-	public void markDirty(boolean markDirty){
-		this.markDirty  = markDirty;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramUpdateService.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramUpdateService.java
deleted file mode 100644
index 9078a46..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/DiagramUpdateService.java
+++ /dev/null
@@ -1,607 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.authoring.gef.commands.ChangeBoundsCommand;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * Service class to allow updating diagram to a default layout. Most of the code
- * are moved from the Editor class.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DiagramUpdateService {
-
-	private DefaultEditDomain editDomain;
-
-	private GraphicalViewer graphicalViewer;
-
-	private ActionRegistry actionRegistry;
-
-	public DiagramUpdateService(
-			GraphicalViewer graphicalViewer, DefaultEditDomain editDomain,
-			ActionRegistry actionRegistry) {
-		this.graphicalViewer = graphicalViewer;
-		this.editDomain = editDomain;
-		this.actionRegistry = actionRegistry;
-	}
-
-	private GraphicalViewer getGraphicalViewer() {
-		return graphicalViewer;
-	}
-
-	/**
-	 * Returns the command stack.
-	 * 
-	 * @return the command stack
-	 */
-	protected CommandStack getCommandStack() {
-		return getEditDomain().getCommandStack();
-	}
-
-	/**
-	 * Returns the edit domain.
-	 * 
-	 * @return the edit domain
-	 */
-	protected DefaultEditDomain getEditDomain() {
-		return editDomain;
-	}
-
-	/**
-	 * Lazily creates and returns the action registry.
-	 * 
-	 * @return the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		return actionRegistry;
-	}
-
-	/**
-	 * Method used only in ActivityDetailDiagram or any diagram need auto-layout.
-	 * Method will verify recently added editparts in the Activitydetaildiagram editpart
-	 * indirectly from WorkBreakdownStructure (means any descriptors created in wbs, corresponding
-	 * EditPart will get created in ActivityDetailDiagram Viewer) and does auto-layout
-	 * all the new added editparts and existing ones. 
-	 * 
-	 */
-	public void cleanUpDiagram() {
-		if (getGraphicalViewer().getContents() instanceof ActivityDetailDiagramEditPart) {
-			ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-					.getContents();
-			List children = dep.getRecentlyAddedParts();
-			if (!children.isEmpty()) {
-				Comparator comparator = new Comparator() {
-
-					public int compare(Object arg0, Object arg1) {
-						int rc = 0;
-						if (arg0 instanceof RoleTaskCompositeEditPart) {
-							if (!(arg1 instanceof RoleTaskCompositeEditPart))
-								rc = -1;
-						} else if (arg1 instanceof RoleTaskCompositeEditPart)
-							rc = 1;
-						return rc;
-					}
-
-				};
-
-				Object[] array = children.toArray();
-				Arrays.sort(array, comparator);
-				for (int a = 0; a < array.length; a++) {
-					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[a];
-					adjustSize(ep);
-				}
-				for (int b = 0; b < array.length; b++) {
-					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[b];
-					cleanUp(ep);
-				}
-				for (int c = 0; c < array.length; c++) {
-					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[c];
-					reduceLinkLength(ep);
-				}
-//				for (int c = 0; c < array.length; c++) {
-//					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[c];
-//					if(ep instanceof RoleTaskCompositeEditPart){
-//						resetSizes(ep, ep);
-//					}
-//				}
-				packDiagram();
-				dep.clearRecentlyAddedParts();
-				getGraphicalViewer().setSelection(new StructuredSelection());
-			}
-		}
-	}
-
-	/*
-	private void resetSizes(AbstractGraphicalEditPart ep, AbstractGraphicalEditPart parent) {
-		if (!(ep instanceof WorkProductCompositeEditPart)) {
-			List sourceLinks = ep.getSourceConnections();
-			if (sourceLinks.size() > 0) {
-				for (int b = 0; b < sourceLinks.size(); b++) {
-					LinkEditPart link = (LinkEditPart) sourceLinks.get(b);
-					AbstractGraphicalEditPart target = (AbstractGraphicalEditPart) link
-							.getTarget();
-					int w = target.getFigure().getBounds().width;
-					int ew = ep.getFigure().getPreferredSize().width;
-					if (w > ew) {
-						Point location = ep.getFigure().getBounds()
-						.getLocation();
-						location.x+=(w-ew)/2;
-						Command c = new ChangeBoundsCommand(((Node) ep
-								.getModel()), ep.getFigure().getBounds()
-								.getLocation(), w);
-						getCommandStack().execute(c);
-						int h = ep.getFigure().getPreferredSize().height;
-						ep.getFigure()
-								.setPreferredSize(new Dimension(w, h));
-						ep.getFigure().setSize(new Dimension(w, h));
-					}
-					getGraphicalViewer()
-							.setSelection(
-									new StructuredSelection(new Object[] { ep,
-											target }));
-					IAction valign = getActionRegistry().getAction(
-							DiagramActionService.ALIGN_VERT_FIRST_SELECTED);
-					valign.run();
-				}
-			}
-			List targetLinks = ep.getTargetConnections();
-			if (targetLinks.size() > 0) {
-				for (int b = 0; b < targetLinks.size(); b++) {
-					LinkEditPart link = (LinkEditPart) targetLinks.get(b);
-					AbstractGraphicalEditPart source = (AbstractGraphicalEditPart) link
-							.getSource();
-					int w = source.getFigure().getBounds().width;
-					int ew = ep.getFigure().getPreferredSize().width;
-					if (w > ew) {
-						Command c = new ChangeBoundsCommand(((Node) ep
-								.getModel()), ep.getFigure().getBounds()
-								.getLocation(), w);
-						getCommandStack().execute(c);
-						int h = ep.getFigure().getPreferredSize().height;
-						ep.getFigure()
-								.setPreferredSize(new Dimension(w, h));
-						ep.getFigure().setSize(new Dimension(w, h));
-					}
-					getGraphicalViewer()
-							.setSelection(
-									new StructuredSelection(new Object[] { ep,
-											source }));
-					IAction valign = getActionRegistry().getAction(
-							DiagramActionService.ALIGN_VERT_FIRST_SELECTED);
-					valign.run();
-				}
-			}
-			parent.getFigure().getLayoutManager().layout(parent.getFigure());
-			if (ep instanceof NodeContainerEditPart) {
-				List children = ep.getChildren();
-				for (int d = 0; d < children.size(); d++) {
-					AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) children
-							.get(d);
-					resetSizes(p, ep);
-				}
-			}
-		}
-	}
-	*/
-
-	/**
-	 * This method does a vertical alignment of all nodes with links
-	 */
-	private void cleanUp(AbstractGraphicalEditPart ep) {
-		if (!(ep instanceof WorkProductCompositeEditPart)) {
-			List sourceLinks = ep.getSourceConnections();
-			if (sourceLinks.size() > 0) {
-				for (int b = 0; b < sourceLinks.size(); b++) {
-					LinkEditPart link = (LinkEditPart) sourceLinks.get(b);
-					AbstractGraphicalEditPart target = (AbstractGraphicalEditPart) link
-							.getTarget();
-					int w = target.getFigure().getBounds().width;
-					int ew = ep.getFigure().getPreferredSize().width;
-					if (w < ew) {
-						Command c = new ChangeBoundsCommand(((Node) ep
-								.getModel()), target.getFigure().getBounds()
-								.getLocation(), w);
-						getCommandStack().execute(c);
-						int h = target.getFigure().getPreferredSize().height;
-						target.getFigure()
-								.setPreferredSize(new Dimension(w, h));
-						target.getFigure().setSize(new Dimension(w, h));
-					}
-					getGraphicalViewer()
-							.setSelection(
-									new StructuredSelection(new Object[] { ep,
-											target }));
-					IAction valign = getActionRegistry().getAction(
-							DiagramActionService.ALIGN_VERT_FIRST_SELECTED);
-					valign.run();
-				}
-			}
-			List targetLinks = ep.getTargetConnections();
-			if (targetLinks.size() > 0) {
-				for (int b = 0; b < targetLinks.size(); b++) {
-					LinkEditPart link = (LinkEditPart) targetLinks.get(b);
-					AbstractGraphicalEditPart source = (AbstractGraphicalEditPart) link
-							.getSource();
-					int w = source.getFigure().getBounds().width;
-					int ew = ep.getFigure().getPreferredSize().width;
-					if (w < ew) {
-						Command c = new ChangeBoundsCommand(((Node) ep
-								.getModel()), source.getFigure().getBounds()
-								.getLocation(), w);
-						getCommandStack().execute(c);
-						int h = source.getFigure().getPreferredSize().height;
-						source.getFigure()
-								.setPreferredSize(new Dimension(w, h));
-						source.getFigure().setSize(new Dimension(w, h));
-					}
-					getGraphicalViewer()
-							.setSelection(
-									new StructuredSelection(new Object[] { ep,
-											source }));
-					IAction valign = getActionRegistry().getAction(
-							DiagramActionService.ALIGN_VERT_FIRST_SELECTED);
-					valign.run();
-				}
-			}
-			if (ep instanceof NodeContainerEditPart) {
-				List children = ep.getChildren();
-				for (int d = 0; d < children.size(); d++) {
-					AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) children
-							.get(d);
-					cleanUp(p);
-				}
-			}
-		}
-	}
-
-	/**
-	 *  For auto-layout, need to adjust connection(or link) length, based on
-	 *  connecting editparts(figures).
-	 * 
-	 */
-	private boolean reduceLinkLength(AbstractGraphicalEditPart part) {
-		boolean moved = false;
-		// only move new WorkProductComposite elements
-		if (part instanceof WorkProductCompositeEditPart) {
-			AbstractGraphicalEditPart linkedPart = null;
-			int position = PositionConstants.CENTER;
-			// is this element linked to another item?
-			if (part.getTargetConnections().size() > 0) {
-				linkedPart = (AbstractGraphicalEditPart) ((LinkEditPart) part
-						.getTargetConnections().get(0)).getSource();
-				position = PositionConstants.NORTH;
-			} else if (part.getSourceConnections().size() > 0) {
-				linkedPart = (AbstractGraphicalEditPart) ((LinkEditPart) part
-						.getSourceConnections().get(0)).getTarget();
-				position = PositionConstants.SOUTH;
-			}
-			if (linkedPart != null) {
-				if (!(linkedPart.getParent() instanceof DiagramEditPart)) {
-					linkedPart = (AbstractGraphicalEditPart) linkedPart
-							.getParent();
-				}
-				// get the part's position
-				Rectangle partBounds = part.getFigure().getBounds();
-				// get the linked part's position
-				Rectangle linkedPartBounds = linkedPart.getFigure().getBounds();
-				// determine in which direction is the linked part
-				// int position = partBounds.getPosition(linkedPartBounds
-				// .getLocation());
-				// assume it is below us, so this part moves up
-				int direction = -1;
-				if ((position & PositionConstants.NORTH) == PositionConstants.NORTH
-						|| (position & PositionConstants.CENTER) == PositionConstants.CENTER) {
-					// above us, move down
-					direction = 1;
-				}
-				// set new bounds for the part so that it sites just outside of
-				// the linked part
-				Rectangle testBounds = partBounds.getCopy();
-				if (direction == 1) {
-					testBounds.y = linkedPartBounds.y + linkedPartBounds.height
-							+ VERT_PIX_PADDING;
-				} else {
-					testBounds.y = linkedPartBounds.y - VERT_PIX_PADDING
-							- partBounds.height;
-				}
-				// set the new location for the part in the model
-				Point np = new Point(testBounds.x, testBounds.y);
-				part.getFigure().setLocation(np);
-				Command c = new ChangeBoundsCommand((Node) part.getModel(), np,
-						partBounds.width);
-				getCommandStack().execute(c);
-			}
-		}
-		return moved;
-	}
-
-	/**
-	 * Method to adjust the size of editpart.  
-	 * 
-	 */
-	private void adjustSize(AbstractGraphicalEditPart ep) {
-		if (ep instanceof WorkProductCompositeEditPart) {
-			adjustSize((NodeContainerEditPart) ep, 1);
-		}
-		// Below Code generic NodeContainerEditPart modification.
-		else if (ep instanceof NodeContainerEditPart) {
-			// This is to allow user customizable 
-//			String count = AuthoringUIPlugin.getDefault().getPreferenceStore()
-//							.getString(TemplateConstants.ADD_ROLE_TASKS_COUNT);
-//			if(count != null || count != ""){
-//				int i = Integer.parseInt(count);
-//				if(i > 0){
-//					adjustSize((NodeContainerEditPart) ep, i);
-//				}
-//			}else{
-//				adjustSize((NodeContainerEditPart) ep, 50);
-//			}
-			adjustSize((NodeContainerEditPart) ep, 50);
-		}
-	}
-
-	protected final static int HORIZ_PIX_PADDING = 30;
-
-	protected final static int VERT_PIX_PADDING = 20;
-
-	/**
-	 * Adjusts the size of ContainerEditPart to accomodate number of editparts in a row,
-	 * push the remaining the editparts in two second row. 
-	 * This is useful for {@link ToolbarLayout}
-	 * 
-	 */
-	private void adjustSize(NodeContainerEditPart ep, int horizCount) {
-		int requiredWidth = 0;
-		int rowMaxHeight = 0;
-		int rows = 0;
-		int widthSum = 0;
-		int heightSum = 0;
-		int column = 0;
-		//int originalWidth = ep.getFigure().getSize().width;
-		List children = ep.getChildren();
-		for (int p = 0; p < children.size();) {
-			if (column == 0) {
-				rows++;
-			}
-			if (column < horizCount) {
-				AbstractGraphicalEditPart child = (AbstractGraphicalEditPart) children
-						.get(p);
-				Dimension d = child.getFigure().getPreferredSize();
-				widthSum += d.width;
-				if (d.height > rowMaxHeight) {
-					rowMaxHeight = d.height;
-				}
-				p++;
-				column++;
-			} else {
-				if (widthSum > requiredWidth) {
-					requiredWidth = widthSum;
-				}
-				heightSum += rowMaxHeight;
-				rowMaxHeight = 0;
-				widthSum = 0;
-				column = 0;
-			}
-		}
-		if (widthSum > requiredWidth) {
-			requiredWidth = widthSum;
-		}
-		heightSum += rowMaxHeight;
-		requiredWidth += HORIZ_PIX_PADDING
-				* Math.min(horizCount, children.size());
-		int requiredHeight = heightSum + (VERT_PIX_PADDING * rows);
-		Command cmd = new ChangeBoundsCommand(((Node) ep.getModel()), ep
-				.getFigure().getBounds().getLocation(), requiredWidth);
-		getCommandStack().execute(cmd);
-		ep.getFigure().setPreferredSize(
-				new Dimension(requiredWidth, requiredHeight));
-		((Node) ep.getModel()).setHeight(requiredHeight);
-		ep.getFigure().setSize(new Dimension(requiredWidth, requiredHeight));
-			ep.getFigure().getLayoutManager().layout(ep.getFigure());
-		// after layout, check the bottom-most child figure against the bottom
-		// of the container, adjust the bottom of the container is necessary
-		if (ep instanceof WorkProductCompositeEditPart && children.size() > 0) {
-			GraphicalEditPart last = (GraphicalEditPart) children.get(children
-					.size() - 1);
-			Point childBottom = last.getFigure().getBounds().getBottom();
-			Point parentBottom = ep.getFigure().getBounds().getBottom();
-			int delta = parentBottom.y - childBottom.y - (VERT_PIX_PADDING / 2);
-			ep.getFigure().setPreferredSize(
-					new Dimension(requiredWidth, requiredHeight - delta));
-			((Node) ep.getModel()).setHeight(requiredHeight - delta);
-			ep.getFigure().setSize(
-					new Dimension(requiredWidth, requiredHeight - delta));
-		}
-	}
-
-	protected void enumerateConnectedParts(AbstractGraphicalEditPart part,
-			List connected) {
-		// only add parts directly on the diagram surface
-		if (!connected.contains(part)) {
-			if (!(part.getParent() instanceof DiagramEditPart)) {
-				if (!connected.contains(part.getParent())) {
-					connected.add(part.getParent());
-				}
-			} else {
-				connected.add(part);
-			}
-			AbstractGraphicalEditPart linkedPart = null;
-			List children = part.getChildren();
-			for (int x = 0; x < children.size(); x++) {
-				AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) children
-						.get(x);
-				enumerateConnectedParts(p, connected);
-			}
-			// is this element linked to another item?
-			for (int x = 0; x < part.getTargetConnections().size(); x++) {
-				linkedPart = (AbstractGraphicalEditPart) ((LinkEditPart) part
-						.getTargetConnections().get(x)).getSource();
-				enumerateConnectedParts(linkedPart, connected);
-			}
-			for (int x = 0; x < part.getSourceConnections().size(); x++) {
-				linkedPart = (AbstractGraphicalEditPart) ((LinkEditPart) part
-						.getSourceConnections().get(x)).getTarget();
-				enumerateConnectedParts(linkedPart, connected);
-			}
-		}
-	}
-
-	/**
-	 * This method finds single elements and groups of elements, and positions
-	 * them starting from the top of the diagram and continuously down the page.
-	 */
-	private void packDiagram() {
-		ActivityDetailDiagramEditPart diagram = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-				.getContents();
-		// start at the top of the diagram
-		// Dimension diagramSize = diagram.getFigure().getSize();
-		// no new shapes can be moved above this y-axis value
-		int reserved = 0;
-		// these are elements without connections
-		List stragglers = new ArrayList();
-		// these are groups of elements connected with links
-		List groups = new ArrayList();
-		// these are top level parts on the diagram that have been added
-		List diagramParts = diagram.getRecentlyAddedParts();
-		for (int x = 0; x < diagramParts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) diagramParts
-					.get(x);
-			boolean found = false;
-			for (int g = 0; g < groups.size() && found == false; g++) {
-				List group = (List) groups.get(g);
-				if (group.contains(p)) {
-					found = true;
-					break;
-				}
-			}
-			if (!found) {
-				List connected = new ArrayList();
-				enumerateConnectedParts(p, connected);
-				if (connected.size() == 1) {
-					stragglers.add(p);
-				} else {
-					groups.add(connected);
-				}
-			}
-		}
-		// process each group closest to the top (min y value)
-		while (groups.size() > 0) {
-			List top = (List) groups.get(0);
-			int topY = getVerticalMinPart(top).getFigure().getBounds().y;
-			for (int x = 0; x < groups.size(); x++) {
-				List g = (List) groups.get(x);
-				int y = getVerticalMinPart(g).getFigure().getBounds().y;
-				if (y < topY) {
-					top = g;
-					topY = y;
-				}
-			}
-			int limit = reserved + 1;
-			int verticalDelta = limit - topY;
-			int leftX = getHorizontalMinPart(top).getFigure().getBounds().x;
-			int horizontalDelta = HORIZ_PIX_PADDING - leftX;
-			for (int x = 0; x < top.size(); x++) {
-				AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) top
-						.get(x);
-				Rectangle bounds = p.getFigure().getBounds();
-				ChangeBoundsCommand cbc = new ChangeBoundsCommand((Node) p
-						.getModel(), new Point(bounds.x + horizontalDelta,
-						bounds.y + verticalDelta), bounds.width);
-				getCommandStack().execute(cbc);
-				p.getFigure().setLocation(
-						new Point(bounds.x + horizontalDelta, bounds.y
-								+ verticalDelta));
-			}
-			int bottomY = getVerticalMaxPart(top).getFigure().getBounds()
-					.bottom();
-			reserved = bottomY + (VERT_PIX_PADDING * 2);
-			groups.remove(top);
-		}
-		int next = HORIZ_PIX_PADDING;
-		for (int x = 0; x < stragglers.size(); x++) {
-			int limit = reserved + 1;
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) stragglers
-					.get(x);
-			Rectangle bounds = p.getFigure().getBounds();
-			ChangeBoundsCommand cbc = new ChangeBoundsCommand((Node) p
-					.getModel(), new Point(next, limit), bounds.width);
-			getCommandStack().execute(cbc);
-			p.getFigure().setLocation(new Point(next, limit));
-			next += bounds.width + HORIZ_PIX_PADDING;
-		}
-	}
-
-	private AbstractGraphicalEditPart getVerticalMinPart(List parts) {
-		AbstractGraphicalEditPart rc = parts.size() > 0 ? (AbstractGraphicalEditPart) parts
-				.get(0)
-				: null;
-		for (int x = 0; x < parts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) parts
-					.get(x);
-			if (p.getFigure().getBounds().y < rc.getFigure().getBounds().y) {
-				rc = p;
-			}
-		}
-		return rc;
-	}
-
-	private AbstractGraphicalEditPart getHorizontalMinPart(List parts) {
-		AbstractGraphicalEditPart rc = parts.size() > 0 ? (AbstractGraphicalEditPart) parts
-				.get(0)
-				: null;
-		for (int x = 0; x < parts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) parts
-					.get(x);
-			if (p.getFigure().getBounds().x < rc.getFigure().getBounds().x) {
-				rc = p;
-			}
-		}
-		return rc;
-	}
-
-	private AbstractGraphicalEditPart getVerticalMaxPart(List parts) {
-		AbstractGraphicalEditPart rc = parts.size() > 0 ? (AbstractGraphicalEditPart) parts
-				.get(0)
-				: null;
-		for (int x = 0; x < parts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) parts
-					.get(x);
-			if (p.getFigure().getBounds().bottom() > rc.getFigure().getBounds()
-					.bottom()) {
-				rc = p;
-			}
-		}
-		return rc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/EndNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/EndNodeEditPart.java
deleted file mode 100644
index 504bd95..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/EndNodeEditPart.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.epf.authoring.gef.figures.EndNodeFigure;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-
-/**
- * EditPart for Final(or End) node 
- *
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class EndNodeEditPart extends NodeEditPart {
-
-	public EndNodeEditPart(TypedNode model) {
-		super(model);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditPolicy()
-	 */
-	protected DirectEditPolicy createDirectEditPolicy() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		EndNodeFigure f = new EndNodeFigure();
-		f.setBackgroundColor(ColorConstants.black);
-		f.setForegroundColor(ColorConstants.red);
-		f.setSize(24, 24);
-		return f;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextCellEditorLocator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextCellEditorLocator.java
deleted file mode 100644
index b0a92e1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextCellEditorLocator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.authoring.gef.figures.FreeTextFigure;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * 
- * Constraint for placing FreeText Cell Editor.
- * @author Shashidhar Kannoori
- *
- */
-public class FreeTextCellEditorLocator implements CellEditorLocator {
-
-	IFigure figure;
-	/*
-	 * Creates a new FreeTextCellEditorLocator 
-	 * 
-	 * @param label the Label
-	 */
-	public FreeTextCellEditorLocator(IFigure figure) {
-		setFigure(figure);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.tools.CellEditorLocator#relocate(org.eclipse.jface.viewers.CellEditor)
-	 */
-	public void relocate(CellEditor ce) {
-		// TODO Auto-generated method stub
-		FreeTextFigure fig = (FreeTextFigure)figure;
-		Text text = (Text) ce.getControl();
-		String n = (String) ce.getValue();
-		GC gc = new GC(text);
-		Point size = gc.textExtent(n);
-		gc.dispose();
-		if (size.x != 0)
-			size = text.computeSize(size.x, SWT.DEFAULT);
-		text.setSize(size.x, size.y);
-		Rectangle textBounds = new Rectangle(text.getClientArea().x, text
-				.getClientArea().y, text.getClientArea().width, text
-				.getClientArea().height);
-		Rectangle figBounds = fig.getClientArea();
-		fig.translateToAbsolute(figBounds);
-		int delta = (figBounds.width - textBounds.width) / 2;
-		int y = fig.getTextFlowPage().getLocation().y;
-		text.setLocation(figBounds.x + delta, y);
-
-	}
-	
-	public void setFigure(IFigure figure) {
-		this.figure = figure;
-	}
-	/**
-	 * @return Returns the figure.
-	 */
-	public IFigure getFigure() {
-		return figure;
-	}
-	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextDirectEditManager.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextDirectEditManager.java
deleted file mode 100644
index 7235d00..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextDirectEditManager.java
+++ /dev/null
@@ -1,207 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Manages the direct edit operation by creating and maintaining the 
- * {@link org.eclipse.jface.viewers.CellEditor} and executing the resulting command if 
- * the cell editor value has changed. Specifically for FreeText.
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class FreeTextDirectEditManager extends DirectEditManager {
-	
-	/*
-	 * 
-	 */
-	protected VerifyListener verifyListener;
-	private Font scaledFont;
-	protected IFigure figure;
-	
-	public FreeTextDirectEditManager(GraphicalEditPart source, Class editorType, CellEditorLocator locator, IFigure figure) {
-		super(source, editorType, locator);
-		this.figure = figure;
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		bringDown(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown(boolean check) {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null)
-			disposeFont.dispose();
-		if (check) {
-			Node node = (Node) getEditPart().getModel();
-			String name = ""; //$NON-NLS-1$
-			// TODO: Remove this check 
-			if (node instanceof WorkBreakdownElementNode) {
-				Object wbelement = node.getObject();
-				if (wbelement instanceof Activity
-						&& ProcessUtil
-								.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
-					name = ProcessUtil
-							.getPresentationName((BreakdownElement) wbelement);
-				}
-
-			}
-			if(node instanceof TypedNode && ((TypedNode)node).getType()==TypedNode.FREE_TEXT){
-				GraphNode gnode = ((Node) getEditPart().getModel()).getGraphNode();
-				name = ((Property) gnode.getProperty().get(0)).getValue();
-			}
-			if (name == null || name.trim().length() == 0) {
-				Display
-						.getCurrent()
-						.asyncExec(
-								new PromptEdit(
-										(NodeEditPart) getEditPart(),
-										DiagramUIResources.err_name_empty));
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
-	 */
-	protected void initCellEditor() {
-		TextCellEditor editor = (TextCellEditor) getCellEditor();
-		editor.setStyle(SWT.MULTI);
-		Text t = (Text) editor.getControl();
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent event) {
-				Text text = (Text) getCellEditor().getControl();
-				String oldText = text.getText();
-				String leftText = oldText.substring(0, event.start);
-				String rightText = oldText.substring(event.end, oldText
-						.length());
-				GC gc = new GC(text);
-				Point size = gc.textExtent(leftText + event.text + rightText);
-				gc.dispose();
-				if (size.x != 0)
-					size = text.computeSize(size.x, SWT.DEFAULT);
-				getCellEditor().getControl().setSize(size.x, size.y);
-			}
-		};
-		t.addVerifyListener(verifyListener);
-		String initialLabelText = ((NodeEditPart) this.getEditPart())
-				.getDirectEditText();
-		editor.setValue(initialLabelText);
-		Font f = figure.getFont();
-		FontMetrics fm = FigureUtilities.getFontMetrics(f);
-		int h = fm.getHeight();
-		int w = fm.getAverageCharWidth();
-		t.setSize(initialLabelText.length()*w+100, h+50);
-	
-		if(f != null)
-			t.setFont(f);
-		else
-			t.setFont(TemplateConstants.DEFAULT_FONT);
-		t.selectAll();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
-	 */
-	protected void unhookListeners() {
-		super.unhookListeners();
-		if (getCellEditor() != null) {
-			Text text = (Text) getCellEditor().getControl();
-			if (verifyListener != null)
-				text.removeVerifyListener(verifyListener);
-			verifyListener = null;
-		}
-	}
-
-	/**
-	 * Checks if the given text is valid. Subclasses can override this method.
-	 * 
-	 * @param txt
-	 * @return null if the given text is valid, an error message otherwise
-	 */
-	protected String validate(String txt) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#commit()
-	 */
-	protected void commit() {
-		String msg = validate((String) getCellEditor().getValue());
-		if (msg != null) {
-			bringDown(false);
-			Display.getCurrent().asyncExec(
-					new PromptEdit((NodeEditPart) getEditPart(), msg));
-			return;
-		}
-		super.commit();
-	}
-
-	static class PromptEdit implements Runnable {
-
-		private NodeEditPart part;
-
-		private String msg;
-
-		PromptEdit(NodeEditPart part, String msg) {
-			this.part = part;
-			this.msg = msg;
-		}
-
-		/**
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			String title = DiagramUIResources.diagram_errorDialog_title_text0; 
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, msg); 
-			part.performDirectEdit();
-		}
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextEditPart.java
deleted file mode 100644
index 221c05d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextEditPart.java
+++ /dev/null
@@ -1,196 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.authoring.gef.commands.ChangePropertyValueCommand;
-import org.eclipse.epf.authoring.gef.figures.SelectableLabel;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * Provides support for direct editing, free text properties changes like font, color and text.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class FreeTextEditPart extends NodeEditPart {
-
-	private Font font;
-
-	private Color color;
-
-	private FontData fData;
-
-	private NodeEditPart part;
-
-	public FreeTextEditPart(Node model) {
-		super(model);
-		part = this;
-	}
-
-	protected IFigure createFigure() {
-		Label l = new SelectableLabel();
-		l.setLabelAlignment(PositionConstants.LEFT);
-		l.setTextPlacement(PositionConstants.SOUTH);
-		return l;
-
-	}
-
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		if (!((Node) getModel()).isReadOnly()) {
-			installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-					createDirectEditPolicy());
-		}
-	}
-
-	protected DirectEditPolicy createDirectEditPolicy() {
-		return new DirectEditPolicy() {
-			protected Command getDirectEditCommand(DirectEditRequest request) {
-				return new ChangePropertyValueCommand(part, (String) request
-						.getCellEditor().getValue());
-			}
-
-			protected void showCurrentEditValue(DirectEditRequest request) {
-				IFigure fig = getDirectEditFigure();
-				if (fig instanceof Label) {
-					((Label) fig).setText((String) request.getCellEditor()
-							.getValue());
-					fig.getUpdateManager().performUpdate();
-				}
-			}
-		};
-	}
-
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(Node.class)) {
-		case ModelPackage.TYPED_NODE__TYPE:
-			refreshVisuals();
-			return;
-		}
-		super.handlePropertyChanged(msg);
-	}
-
-	public void performRequest(Request request) {
-		if (request.getType() == RequestConstants.REQ_DIRECT_EDIT
-				&& !((Node) getModel()).isReadOnly()) {
-			performDirectEdit();
-		} else {
-			super.performRequest(request);
-		}
-	}
-
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		IFigure fig = getDirectEditFigure();
-		if (fig instanceof Label) {
-			Label l = (Label) fig;
-			List alist = ((Node) getModel()).getGraphNode().getProperty();
-			String fontName = TemplateConstants.DEFAULT_FONT_NAME;
-			int fontStyle = SWT.NORMAL;
-			int fontHeight = TemplateConstants.DEFAULT_FONT_SIZE;
-			int fontRed = SWT.COLOR_RED;
-			int fontBlue = SWT.COLOR_BLUE;
-			int fontGreen = SWT.COLOR_GREEN;
-
-			if (alist.size() > 0) {
-				for (Iterator ior = alist.iterator(); ior.hasNext();) {
-					Property prop = (Property) ior.next();
-					if (prop.getKey().equals(
-							GraphicalDataHelper.GRAPH_NODE_FREE_TEXT)) {
-						l.setText(prop.getValue());
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_NAME)) {
-						fontName = prop.getValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_STYLE)) {
-						fontStyle = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_HEIGHT)) {
-						fontHeight = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_RED)) {
-						fontRed = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_BLUE)) {
-						fontBlue = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_GREEN)) {
-						fontGreen = new Integer(prop.getValue()).intValue();
-					}
-				}
-			} else {
-				l.setText(((Node) getModel()).getGraphNode().getName());
-			}
-			if (font != null && !font.isDisposed()) {
-				font.dispose();
-			}
-			if (color != null && !color.isDisposed()) {
-				color.dispose();
-			}
-			fData = new FontData(fontName, fontHeight, fontStyle);
-			font = new Font(PlatformUI.getWorkbench().getDisplay(), fData);
-			color = new Color(null, fontRed, fontGreen, fontBlue);
-			l.setFont(font);
-
-			l.setForegroundColor(color);
-		}
-	}
-
-	protected DirectEditManager createDirectEditManager() {
-		Label l = (Label) getFigure();
-		return new ValidatingFreeTextEditManager(this, TextCellEditor.class,
-				new LabelTextCellEditorLocator(l), l) {
-			protected String validate(String txt) {
-				return super.validate(txt);
-			}
-		};
-	}
-
-	IFigure getDirectEditFigure() {
-		return getFigure();
-	}
-
-	public void deactivate() {
-		if (font != null && !font.isDisposed()) {
-			font.dispose();
-		}
-		if (color != null && !color.isDisposed()) {
-			color.dispose();
-		}
-		super.deactivate();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextNodeEditPart.java
deleted file mode 100644
index db19efc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/FreeTextNodeEditPart.java
+++ /dev/null
@@ -1,206 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.authoring.gef.commands.ChangePropertyValueCommand;
-import org.eclipse.epf.authoring.gef.figures.FreeTextFigure;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Provides support for direct editing, text font, color and size changes. 
- * @author Shashidhar Kannoori.
- */
-
-public class FreeTextNodeEditPart extends NodeEditPart {
-	private Font font;
-
-	private Color color;
-
-	private FontData fData;
-
-	private NodeEditPart part;
-
-	public FreeTextNodeEditPart(Node model) {
-		super(model);
-		part = this; 
-		// TODO Auto-generated constructor stub
-	}
-	protected IFigure createFigure() {
-		FreeTextFigure l = new FreeTextFigure();
-		return l;
-
-	}
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		if (!((Node) getModel()).isReadOnly()) {
-			installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-					createDirectEditPolicy());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditPolicy()
-	 */
-	protected DirectEditPolicy createDirectEditPolicy() {
-		// TODO Auto-generated method stub
-		return new DirectEditPolicy() {
-			protected Command getDirectEditCommand(DirectEditRequest request) {
-				return new ChangePropertyValueCommand(part, (String) request
-						.getCellEditor().getValue());
-			}
-
-			protected void showCurrentEditValue(DirectEditRequest request) {
-				IFigure fig = getDirectEditFigure();
-				if (fig instanceof FreeTextFigure) {
-					((FreeTextFigure) fig).setText((String) request.getCellEditor()
-							.getValue());
-					fig.getUpdateManager().performUpdate();
-				}
-			}
-		};
-	}
-	
-	
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(Node.class)) {
-		case ModelPackage.TYPED_NODE__TYPE:
-			refreshVisuals();
-			return;
-		}
-		super.handlePropertyChanged(msg);
-	}
-
-	public void performRequest(Request request) {
-		if (request.getType() == RequestConstants.REQ_DIRECT_EDIT
-				&& !((Node) getModel()).isReadOnly()) {
-			performDirectEdit();
-		} else {
-			super.performRequest(request);
-		}
-	}
-
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		IFigure fig = getDirectEditFigure();
-		if (fig instanceof FreeTextFigure) {
-			FreeTextFigure l = (FreeTextFigure) fig;
-			List alist = ((Node) getModel()).getGraphNode().getProperty();
-			String fontName = TemplateConstants.DEFAULT_FONT_NAME;
-			int fontStyle = SWT.NORMAL;
-			int fontHeight = TemplateConstants.DEFAULT_FONT_SIZE;
-			int fontRed = SWT.COLOR_RED;
-			int fontBlue = SWT.COLOR_BLUE;
-			int fontGreen = SWT.COLOR_GREEN;
-
-			if (alist.size() > 0) {
-				for (Iterator ior = alist.iterator(); ior.hasNext();) {
-					Property prop = (Property) ior.next();
-					if (prop.getKey().equals(
-							GraphicalDataHelper.GRAPH_NODE_FREE_TEXT)) {
-						l.setText(prop.getValue());
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_NAME)) {
-						fontName = prop.getValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_STYLE)) {
-						fontStyle = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_HEIGHT)) {
-						fontHeight = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_RED)) {
-						fontRed = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_BLUE)) {
-						fontBlue = new Integer(prop.getValue()).intValue();
-					} else if (prop.getKey().equals(
-							TemplateConstants.PROPERTY_FONT_GREEN)) {
-						fontGreen = new Integer(prop.getValue()).intValue();
-					}
-				}
-			} else {
-				l.setText(((Node) getModel()).getGraphNode().getName());
-			}
-			if (font != null && !font.isDisposed()) {
-				font.dispose();
-			}
-			if (color != null && !color.isDisposed()) {
-				color.dispose();
-			}
-			fData = new FontData(fontName, fontHeight, fontStyle);
-			font = new Font(PlatformUI.getWorkbench().getDisplay(), fData);
-			color = new Color(null, fontRed, fontGreen, fontBlue);
-			l.setFont(font);
-
-			l.setForegroundColor(color);
-		}
-	}
-
-	protected DirectEditManager createDirectEditManager() {
-		FreeTextFigure l = (FreeTextFigure) getFigure();
-		return new FreeTextDirectEditManager(this, TextCellEditor.class,
-				new FreeTextCellEditorLocator(l), l) {
-			protected String validate(String txt) {
-				return super.validate(txt);
-			}
-		};
-	}
-
-	IFigure getDirectEditFigure() {
-		return getFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#deactivate()
-	 */
-	public void deactivate() {
-		if (font != null && !font.isDisposed()) {
-			font.dispose();
-		}
-		if (color != null && !color.isDisposed()) {
-			color.dispose();
-		}
-		super.deactivate();
-	}
-	String getDirectEditText() {
-		// TODO Auto-generated method stub
-		//return super.getDirectEditText();
-		IFigure fig = getDirectEditFigure();
-		if (fig instanceof FreeTextFigure) {
-			return ((FreeTextFigure) fig).getText();
-		} 
-		return "";  //$NON-NLS-1$
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelCellEditorLocator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelCellEditorLocator.java
deleted file mode 100644
index 9a98419..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelCellEditorLocator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Constraint for Label placing. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-final public class LabelCellEditorLocator implements CellEditorLocator {
-
-	private IFigure fig;
-
-	private static int WIN_X_OFFSET = -4;
-
-	private static int WIN_W_OFFSET = 5;
-
-	private static int GTK_X_OFFSET = 0;
-
-	private static int GTK_W_OFFSET = 0;
-
-	private static int MAC_X_OFFSET = -3;
-
-	private static int MAC_W_OFFSET = 9;
-
-	private static int MAC_Y_OFFSET = -3;
-
-	private static int MAC_H_OFFSET = 6;
-
-	public LabelCellEditorLocator(IFigure figure) {
-		fig = figure;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gef.tools.CellEditorLocator#relocate(org.eclipse.jface.viewers.CellEditor)
-	 */
-
-	public void relocate(CellEditor celleditor) {
-		Text text = (Text) celleditor.getControl();
-
-		Rectangle rect = null;
-		if (fig instanceof Label)
-			rect = ((Label) fig).getTextBounds().intersect(fig.getClientArea());
-		else
-			rect = fig.getClientArea(Rectangle.SINGLETON);
-		fig.translateToAbsolute(rect);
-
-		int xOffset = 0;
-		int wOffset = 0;
-		int yOffset = 0;
-		int hOffset = 0;
-
-		if (SWT.getPlatform().equalsIgnoreCase("gtk")) { //$NON-NLS-1$
-			xOffset = GTK_X_OFFSET;
-			wOffset = GTK_W_OFFSET;
-		} else if (SWT.getPlatform().equalsIgnoreCase("carbon")) { //$NON-NLS-1$
-			xOffset = MAC_X_OFFSET;
-			wOffset = MAC_W_OFFSET;
-			yOffset = MAC_Y_OFFSET;
-			hOffset = MAC_H_OFFSET;
-		} else {
-			xOffset = WIN_X_OFFSET;
-			wOffset = WIN_W_OFFSET;
-		}
-
-		text.setBounds(rect.x + xOffset, rect.y + yOffset,
-				rect.width + wOffset, rect.height + hOffset);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelDirectEditManager.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelDirectEditManager.java
deleted file mode 100644
index ab0f929..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelDirectEditManager.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Manages the direct edit operation by creating and maintaining the 
- * {@link org.eclipse.jface.viewers.CellEditor} and executing the resulting command if 
- * the cell editor value has changed. For {@link Label}.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LabelDirectEditManager extends DirectEditManager {
-
-	Font scaledFont;
-
-	public LabelDirectEditManager(GraphicalEditPart source, Class editorType,
-			CellEditorLocator locator) {
-		super(source, editorType, locator);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null)
-			disposeFont.dispose();
-	}
-
-	protected void initCellEditor() {
-		Text text = (Text) getCellEditor().getControl();
-
-		getCellEditor().setValue(getInitialText());
-		IFigure figure = getEditPart().getFigure();
-		scaledFont = figure.getFont();
-		FontData data = scaledFont.getFontData()[0];
-		Dimension fontSize = new Dimension(0, data.getHeight());
-		getDirectEditFigure().translateToAbsolute(fontSize);
-		data.setHeight(fontSize.height);
-		scaledFont = new Font(null, data);
-
-		text.setFont(scaledFont);
-		text.selectAll();
-	}
-
-	/**
-	 * Creates the cell editor on the given composite. The cell editor is
-	 * created by instantiating the cell editor type passed into this
-	 * DirectEditManager's constuctor.
-	 * 
-	 * @param composite
-	 *            the composite to create the cell editor on
-	 * @return the newly created cell editor
-	 */
-	protected CellEditor createCellEditorOn(Composite composite) {
-		return new TextCellEditor(composite, SWT.MULTI | SWT.WRAP);
-	}
-
-	/**
-	 * @return the initial value of the text shown in the cell editor for
-	 *         direct-editing; cannot return <code>null</code>
-	 */
-	protected String getInitialText() {
-		return ((BaseEditPart) getEditPart()).getDirectEditText();
-	}
-
-	/**
-	 * Used to determine the initial text of the cell editor and to determine
-	 * the font size of the text.
-	 * 
-	 * @return the figure being edited
-	 */
-	protected IFigure getDirectEditFigure() {
-		return ((BaseEditPart) getEditPart()).getDirectEditFigure();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelTextCellEditorLocator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelTextCellEditorLocator.java
deleted file mode 100644
index 3f1ed48..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LabelTextCellEditorLocator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Constraint for Text placing. 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LabelTextCellEditorLocator implements CellEditorLocator {
-
-	private Label label;
-
-	/**
-	 * Creates a new LabelTextCellEditorLocator for the given Label
-	 * 
-	 * @param label
-	 *            the Label
-	 */
-	public LabelTextCellEditorLocator(Label label) {
-		setLabel(label);
-	}
-
-	/**
-	 * @see CellEditorLocator#relocate(org.eclipse.jface.viewers.CellEditor)
-	 */
-	public void relocate(CellEditor celleditor) {
-		Text text = (Text) celleditor.getControl();
-		Point pref = text.computeSize(-1, -1);
-		Rectangle rect = label.getTextBounds().getCopy();
-		label.translateToAbsolute(rect);
-		text.setBounds(rect.x - 1, rect.y - 1, pref.x + 1, pref.y + 1);
-	}
-
-	/**
-	 * Returns the Label figure.
-	 * 
-	 * @return the Label
-	 */
-	protected Label getLabel() {
-		return label;
-	}
-
-	/**
-	 * Sets the label.
-	 * 
-	 * @param label
-	 *            The label to set
-	 */
-	protected void setLabel(Label label) {
-		this.label = label;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LinkEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LinkEditPart.java
deleted file mode 100644
index 16bcbdb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/LinkEditPart.java
+++ /dev/null
@@ -1,122 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PolygonDecoration;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.epf.authoring.gef.commands.DeleteCommand;
-import org.eclipse.epf.authoring.gef.commands.DeleteLinkCommand;
-import org.eclipse.epf.authoring.gef.edit.policies.LinkBendpointEditPolicy;
-import org.eclipse.epf.authoring.gef.edit.policies.LinkEndpointEditPolicy;
-import org.eclipse.epf.authoring.gef.figures.Colors;
-import org.eclipse.epf.authoring.gef.util.Validation;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editparts.AbstractConnectionEditPart;
-import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
-import org.eclipse.gef.requests.GroupRequest;
-
-/**
- * Provides support to update the appearance, and installs the editpolicies
- * specific the {@link Link} and listens to changes in the diagram model.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LinkEditPart extends AbstractConnectionEditPart {
-
-	protected Adapter modelListener = new AdapterImpl() {
-		public void notifyChanged(Notification msg) {
-			handlePropertyChanged(msg);
-		}
-	};
-
-	public LinkEditPart(Link conn) {
-		super();
-		setModel(conn);
-	}
-
-	public void activate() {
-		super.activate();
-		getLink().eAdapters().add(modelListener);
-	}
-
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
-				new LinkEndpointEditPolicy());
-		installEditPolicy(EditPolicy.CONNECTION_ROLE,
-				new ConnectionEditPolicy() {
-					protected Command getDeleteCommand(GroupRequest request) {
-						Boolean bool = (Boolean) request.getExtendedData().get(
-								DeleteCommand.KEY_PERM_DELETE);
-						boolean permDelete = bool == null ? false : bool
-								.booleanValue();
-						return new DeleteLinkCommand((Link) getHost()
-								.getModel(), permDelete);
-					}
-				});
-		installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
-				new LinkBendpointEditPolicy());
-	}
-
-	protected IFigure createFigure() {
-		PolylineConnection conn = new PolylineConnection();
-		conn.setTargetDecoration(new PolygonDecoration());
-		updateAppearance();
-		return conn;
-	}
-
-	private void updateAppearance() {
-		if (figure == null)
-			return;
-		Link link = (Link) getModel();
-		if (Validation.isReadOnly(link)) {
-			figure.setForegroundColor(Colors.INHERITED_ELEMENT_LABEL);
-		} else {
-			figure.setForegroundColor(ColorConstants.black);
-		}
-	}
-
-	public void deactivate() {
-		getLink().eAdapters().remove(modelListener);
-		super.deactivate();
-	}
-
-	protected Link getLink() {
-		return (Link) getModel();
-	}
-
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(Link.class)) {
-		case ModelPackage.LINK__BENDPOINTS:
-			refreshVisuals();
-			break;
-		case ModelPackage.LINK__TARGET_END_POINT:
-			refreshTargetAnchor();
-			break;
-		case ModelPackage.LINK__SOURCE_END_POINT:
-			refreshSourceAnchor();
-			break;
-		}
-	}
-
-	protected void refreshVisuals() {
-		updateAppearance();
-		getConnectionFigure().setRoutingConstraint(getLink().getBendpoints());
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NamedNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NamedNodeEditPart.java
deleted file mode 100644
index b1b5221..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NamedNodeEditPart.java
+++ /dev/null
@@ -1,225 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.authoring.gef.commands.ChangeNameCommand;
-import org.eclipse.epf.authoring.gef.figures.Colors;
-import org.eclipse.epf.authoring.gef.figures.SelectableLabel;
-import org.eclipse.epf.authoring.gef.figures.TextFigure;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.swt.graphics.Image;
-
-import com.ibm.icu.text.BreakIterator;
-
-/**
- * Diagram children should extend this NamedNodeEditPart in order to support name for figure.
- * NamedNodeEditPart provides instructure to handle the name wrapping and color. Support direct 
- * editing feedback.   
- *  
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class NamedNodeEditPart extends NodeEditPart {
-
-	public NamedNodeEditPart(NamedNode model) {
-		super(model);
-	}
-
-	protected IFigure createFigure() {
-		Label l = new SelectableLabel();
-		l.setLabelAlignment(PositionConstants.LEFT);
-		if (getImage() != null) {
-			l.setIcon(getImage());
-		}
-		l.setTextPlacement(PositionConstants.SOUTH);
-		l.setFont(TemplateConstants.DEFAULT_FONT);
-		setLabelForegroundColor(l);
-		return l;
-	}
-
-	private void setLabelForegroundColor(Label l) {
-		NamedNode node = (NamedNode) getModel();
-		// Object e = node.getObject();
-		// boolean suppressed = isSuppressed(e);
-		boolean suppressed = node.isSuppressed();
-		if (node.isReadOnly()) {
-			if (!suppressed) {
-				l.setForegroundColor(Colors.INHERITED_ELEMENT_LABEL);
-			}
-		} else {
-			if (!suppressed) {
-				l.setForegroundColor(ColorConstants.black);
-			}
-		}
-		if (suppressed) {
-			l.setForegroundColor(Colors.SUPRESSED_ELEMENT_LABEL);
-		}
-	}
-
-	protected Image getImage() {
-		return null;
-	}
-
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		if (!((Node) getModel()).isReadOnly()) {
-			installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-					createDirectEditPolicy());
-		}
-	}
-
-	protected DirectEditPolicy createDirectEditPolicy() {
-		return new DirectEditPolicy() {
-			protected Command getDirectEditCommand(DirectEditRequest request) {
-				return new ChangeNameCommand((NamedNode) getModel(),
-						(String) request.getCellEditor().getValue());
-			}
-
-			protected void showCurrentEditValue(DirectEditRequest request) {
-				IFigure fig = getDirectEditFigure();
-				String s = (String) request.getCellEditor().getValue();
-				if (fig instanceof Label) {
-					((Label) fig).setText(s);
-				}
-				else if (fig instanceof TextFigure) {
-					((TextFigure) fig).setText(s);
-				}
-				fig.getUpdateManager().performUpdate();
-			}
-		};
-	}
-
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(NamedNode.class)) {
-		case ModelPackage.NAMED_NODE__NAME:
-			refreshVisuals();
-			return;
-		}
-		super.handlePropertyChanged(msg);
-	}
-
-	public void performRequest(Request request) {
-		if (request.getType() == RequestConstants.REQ_DIRECT_EDIT
-				&& !((Node) getModel()).isReadOnly()) {
-			performDirectEdit();
-		} else {
-			super.performRequest(request);
-		}
-	}
-
-	protected static final int WRAP_WIDTH = 12;
-
-	protected static final int WORK_PRODUCT_WRAP_WIDTH = 3;
-
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		IFigure fig = getDirectEditFigure();
-		if (fig instanceof Label) {
-			Label l = (Label) fig;
-			setLabelForegroundColor(l);
-			String text;
-			// Below check is required for Extended Activity presentation name
-			// should be used from base.
-			if (getModel() instanceof WorkBreakdownElementNode) {
-				WorkBreakdownElementNode node = (WorkBreakdownElementNode) getModel();
-				Object wbelement = node.getObject();
-				if (wbelement instanceof Activity
-						&& ProcessUtil
-								.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
-					text = ProcessUtil
-							.getPresentationName((BreakdownElement) wbelement);
-				} else {
-					text = ((NamedNode) getModel()).getName();
-				}
-			} else {
-				text = ((NamedNode) getModel()).getName();
-			}
-			try {
-				if (getParent() instanceof ActivityDetailDiagramEditPart
-						|| getParent().getParent() instanceof ActivityDetailDiagramEditPart) {
-					int w = WRAP_WIDTH;
-					if (this.getModel() instanceof WorkProductDescriptorNode)
-						w = WORK_PRODUCT_WRAP_WIDTH;
-					
-					if(this.getModel() instanceof TaskNode && 
-							GraphicalDataHelper.isAutoLayout(
-							(ActivityDetailDiagram)getParent().getParent().getModel())){
-						// Used 16 as min length for taskname, else add spaces to it.
-						// TODO: find better solution for this.
-						if(text.length() < 16){
-							int gap = 16 - text.length();
-							for(int i=0; i<gap/2; i++){
-								text+=" "; //$NON-NLS-1$
-							}
-							for(int i=0; i<gap/2; i++){
-								text = " "+text; //$NON-NLS-1$
-							}
-						}
-					}
-					text = wrap(text, w);
-				}
-			} catch (NullPointerException npe) {
-			}
-			l.setText(text);
-		}
-	}
-
-	protected String wrap(String s, int wrapWidth) {
-		String wrapped = ""; //$NON-NLS-1$
-		BreakIterator bi = BreakIterator.getLineInstance();
-		String remaining = s;
-		while (true) {
-			if (remaining.length() <= wrapWidth) {
-				wrapped += remaining;
-				break;
-			} else {
-				bi.setText(remaining);
-				int pos = bi.following(wrapWidth);
-				if (pos == BreakIterator.DONE) {
-					wrapped += remaining;
-					break;
-				} else {
-					if (pos >= remaining.length()) {
-						wrapped += remaining;
-						break;
-					} else {
-						wrapped += remaining.substring(0, pos) + "\n"; //$NON-NLS-1$
-						remaining = remaining.substring(pos);
-					}
-				}
-			}
-		}
-		return wrapped;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NodeContainerEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NodeContainerEditPart.java
deleted file mode 100644
index 1021851..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NodeContainerEditPart.java
+++ /dev/null
@@ -1,226 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.BendpointConnectionRouter;
-import org.eclipse.draw2d.ConnectionLayer;
-import org.eclipse.draw2d.FanRouter;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.authoring.gef.commands.DeleteCommand;
-import org.eclipse.epf.authoring.gef.edit.policies.NodeContainerEditPolicy;
-import org.eclipse.epf.authoring.gef.edit.policies.NodeContainerFlowLayoutEditPolicy;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.editpolicies.ComponentEditPolicy;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-
-/**
- * NodeContainerEditPart manages the child editparts in a {@link GraphicalViewer}.
- * Provides instructure to handle the notifications from model.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class NodeContainerEditPart extends AbstractGraphicalEditPart
-		implements LayerConstants {
-
-	private BendpointConnectionRouter cRouter;
-
-	protected Adapter modelListener = new AdapterImpl() {
-		public void notifyChanged(Notification msg) {
-			handlePropertyChanged(msg);
-		}
-	};
-
-	public NodeContainerEditPart(NodeContainer model) {
-		super();
-		setModel(model);
-	}
-
-	public void activate() {
-		super.activate();
-		NodeContainer model = (NodeContainer) ((EObject) getModel());
-		model.eAdapters().add(modelListener);
-		model.addConsumer(this);
-	}
-
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() {
-			protected Command createDeleteCommand(GroupRequest deleteRequest) {
-				Boolean bool = (Boolean) deleteRequest.getExtendedData().get(
-						DeleteCommand.KEY_PERM_DELETE);
-				boolean permDelete = bool == null ? false : bool.booleanValue();
-				DeleteCommand cmd = new DeleteCommand(permDelete);
-				cmd.setPartToBeDeleted(getHost().getModel());
-				return cmd;
-			}
-		});
-		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
-		installEditPolicy(EditPolicy.CONTAINER_ROLE,
-				new NodeContainerEditPolicy());
-		installEditPolicy(EditPolicy.NODE_ROLE, null);
-		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new NodeContainerFlowLayoutEditPolicy());
-	}
-
-	public void deactivate() {
-		NodeContainer model = (NodeContainer) ((EObject) getModel());
-		model.eAdapters().remove(modelListener);
-		model.removeConsumer(this);
-
-		super.deactivate();
-	}
-
-	protected EditPart findChildByModel(Object model) {
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			EditPart child = (EditPart) iter.next();
-			if (child.getModel() == model) {
-				return child;
-			}
-		}
-		return null;
-	}
-
-	protected void addPartToEdit(Collection partsToEdit, Object node) {
-		if (node instanceof NamedNode) {
-			EditPart editPart = findChildByModel(node);
-			if (editPart instanceof BaseEditPart) {
-				DirectEditManager editManager = ((BaseEditPart) editPart)
-						.getDirectEditManager();
-				if (editManager instanceof ValidatingDirectEditManager
-						&& ((ValidatingDirectEditManager) editManager)
-								.validate(((NamedNode) node).getName()) != null) {
-					partsToEdit.add(editPart);
-				}
-			}
-		}
-	}
-
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(NodeContainer.class)) {
-		case ModelPackage.NODE__LOCATION:
-		case ModelPackage.NODE__WIDTH:
-			refreshVisuals();
-			break;
-		case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-			refreshSourceConnections();
-			break;
-		case ModelPackage.NODE__INCOMING_CONNECTIONS:
-			refreshTargetConnections();
-			break;
-		case ModelPackage.NODE_CONTAINER__NODES:
-			refreshChildren();
-
-			List partsToEdit = new ArrayList();
-			switch (msg.getEventType()) {
-			case Notification.ADD:
-				addPartToEdit(partsToEdit, msg.getNewValue());
-				break;
-			case Notification.ADD_MANY:
-				for (Iterator iter = ((Collection) msg.getNewValue())
-						.iterator(); iter.hasNext();) {
-					addPartToEdit(partsToEdit, iter.next());
-				}
-				break;
-			}
-
-			if (getViewer().getControl().isFocusControl()) {
-				for (Iterator iter = partsToEdit.iterator(); iter.hasNext();) {
-					BaseEditPart editPart = (BaseEditPart) iter.next();
-					editPart.performDirectEdit();
-				}
-			}
-
-			break;
-		}
-	}
-
-	protected void refreshVisuals() {
-		Node node = (Node) getModel();
-		Dimension size = new Dimension(node.getWidth(), node.getHeight());
-		if (size == null) {
-			size = new Dimension(60, 100);
-		}
-		Point loc = node.getLocation();
-		if (loc == null) {
-			loc = new Point(10, 10);
-		}
-		Rectangle r = new Rectangle(loc, size);
-
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), r);
-
-		if (cRouter == null) {
-			ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
-			FanRouter router = new FanRouter();
-			router.setSeparation(30);
-			cRouter = new BendpointConnectionRouter();
-			router.setNextRouter(cRouter);
-			cLayer.setConnectionRouter(router);
-		}
-	}
-
-	protected List getModelChildren() {
-		return ((NodeContainer) getModel()).getNodes();
-	}
-	
-	/**
-	 * Only useful in case of ADD. Placed here in order to invoke in sub classes.
-	 * TODO:  Move this method to utility class.
-	 */
-	protected void cleanUpDiagram(EditPart part) {
-		EditPart dep = (EditPart) part.getParent();
-		if(dep instanceof ActivityDetailDiagramEditPart ){
-			
-			ActivityDetailDiagramEditPart add = ((ActivityDetailDiagramEditPart)dep);
-			if(!((Diagram)add.getModel()).isReadOnly()){
-				add.getRecentlyAddedParts().addAll(dep.getChildren());
-		
-				// clean up the diagram
-				DefaultEditDomain editingDomain = new DefaultEditDomain(null);
-				ActionRegistry actionRegistry = new ActionRegistry();
-		
-				DiagramActionService actionService = new DiagramActionService(
-						(GraphicalViewer)getParent().getViewer(), editingDomain, actionRegistry);
-				actionService.registerVerticalAlignFirstSelectedAction();
-		
-				DiagramUpdateService service = new DiagramUpdateService(
-						(GraphicalViewer)getParent().getViewer(), editingDomain, actionRegistry);
-				service.cleanUpDiagram();
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NodeEditPart.java
deleted file mode 100644
index 45987f5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/NodeEditPart.java
+++ /dev/null
@@ -1,246 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.ChopboxAnchor;
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.authoring.gef.commands.CreateLinkCommand;
-import org.eclipse.epf.authoring.gef.commands.DeleteCommand;
-import org.eclipse.epf.authoring.gef.commands.ReconnectLinkCommand;
-import org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ComponentEditPolicy;
-import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gef.requests.ReconnectRequest;
-
-/**
- * Provides support for connections, and installs EditPolicy for (
- * {@link EditPolicy.COMPONENT_ROLE}, {@link EditPolicy.GRAPHICAL_NODE_ROLE},
- * {@linkEditPolicy.SELECTION_FEEDBACK_ROLE})
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class NodeEditPart extends BaseEditPart implements
-		org.eclipse.gef.NodeEditPart {
-
-	public NodeEditPart(Node model) {
-		super(model);
-	}
-
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() {
-			protected Command createDeleteCommand(GroupRequest deleteRequest) {
-				Boolean bool = (Boolean) deleteRequest.getExtendedData().get(
-						DeleteCommand.KEY_PERM_DELETE);
-				boolean permDelete = bool == null ? false : bool.booleanValue();
-				DeleteCommand cmd = new DeleteCommand(permDelete);
-				cmd.setPartToBeDeleted(getHost().getModel());
-				return cmd;
-			}
-		});
-
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new GraphicalNodeEditPolicy() {
-					protected Command getConnectionCompleteCommand(
-							CreateConnectionRequest request) {
-						CreateLinkCommand cmd = (CreateLinkCommand) request
-								.getStartCommand();
-						cmd.setTarget((Node) getHost().getModel());
-
-						if (request.getTargetEditPart() instanceof ConnectionAnchorLocator) {
-							if (request.getTargetEditPart().equals(
-									request.getSourceEditPart())) {
-
-							} else {
-								cmd
-										.setTargetEndPoint(((ConnectionAnchorLocator) request
-												.getTargetEditPart())
-												.getLocation(request
-														.getLocation()));
-							}
-						}
-
-						return cmd;
-					}
-
-					protected Command getConnectionCreateCommand(
-							CreateConnectionRequest request) {
-						CreateLinkCommand cmd = new CreateLinkCommand(
-								ModelFactory.eINSTANCE.createLink(),
-								(Node) getHost().getModel());
-						if (request.getTargetEditPart() instanceof ConnectionAnchorLocator) {
-							cmd
-									.setSourceEndPoint(((ConnectionAnchorLocator) request
-											.getTargetEditPart())
-											.getLocation(request.getLocation()));
-						} else {
-							cmd.setSourceEndPoint(request.getLocation());
-						}
-						request.setStartCommand(cmd);
-
-						return cmd;
-
-					}
-
-					protected Command getReconnectSourceCommand(
-							ReconnectRequest request) {
-						Link link = (Link) request.getConnectionEditPart()
-								.getModel();
-						ReconnectLinkCommand cmd = new ReconnectLinkCommand(
-								link, (Node) getHost().getModel(), true);
-						if (request.getTarget() instanceof ConnectionAnchorLocator) {
-							cmd.setEndPoint(((ConnectionAnchorLocator) request
-									.getTarget()).getLocation(request
-									.getLocation()));
-						}
-
-						return cmd;
-					}
-
-					protected Command getReconnectTargetCommand(
-							ReconnectRequest request) {
-						Link link = (Link) request.getConnectionEditPart()
-								.getModel();
-						ReconnectLinkCommand cmd = new ReconnectLinkCommand(
-								link, (Node) getHost().getModel(), false);
-						if (request.getTarget() instanceof ConnectionAnchorLocator) {
-							cmd.setEndPoint(((ConnectionAnchorLocator) request
-									.getTarget()).getLocation(request
-									.getLocation()));
-						}
-						return cmd;
-					}
-				});
-
-		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
-		// By default, can't add anything to a node
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, new LayoutEditPolicy() {
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-
-			protected Command getDeleteDependantCommand(Request request) {
-				return null;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-		});
-	}
-
-	protected Node getNode() {
-		return (Node) getModel();
-	}
-
-	protected List getModelSourceConnections() {
-		return getNode().getOutgoingConnections();
-	}
-
-	protected List getModelTargetConnections() {
-		return getNode().getIncomingConnections();
-	}
-
-	public ConnectionAnchor getSourceConnectionAnchor(
-			ConnectionEditPart connection) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	public ConnectionAnchor getTargetConnectionAnchor(
-			ConnectionEditPart connection) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(Node.class)) {
-		case ModelPackage.NODE__LOCATION:
-		case ModelPackage.NODE__WIDTH:
-		case ModelPackage.NODE__HEIGHT:			
-			refreshVisuals();
-			break;
-		case ModelPackage.NODE__READ_ONLY:
-			refreshVisuals();
-			for (Iterator iter = getTargetConnections().iterator(); iter
-					.hasNext();) {
-				ConnectionEditPart conn = (ConnectionEditPart) iter.next();
-				conn.refresh();
-			}
-			break;
-
-		case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-			refreshSourceConnections();
-			break;
-
-		case ModelPackage.NODE__INCOMING_CONNECTIONS:
-			refreshTargetConnections();
-			break;
-		}
-	}
-
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		Rectangle constraint = new Rectangle(0, 0, -1, -1);
-		if (getNode().getLocation() != null)
-			constraint.setLocation(getNode().getLocation());
-		constraint.width = getNode().getWidth();
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), constraint);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#activate()
-	 */
-	public void activate() {
-		super.activate();
-		((Node) getModel()).addConsumer(this);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#deactivate()
-	 */
-	public void deactivate() {
-		((Node) getModel()).removeConsumer(this);
-		super.deactivate();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RaisedMarginBorder.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RaisedMarginBorder.java
deleted file mode 100644
index 442d0a5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RaisedMarginBorder.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package  org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- *  A border with a raised margin.
- *  
- * @author Kelvin Low
- * @since 1.0
- */
-public class RaisedMarginBorder extends MarginBorder {
-
-	private static final Insets DEFAULT_INSETS = new Insets(10, 10, 10, 10);
-
-	public RaisedMarginBorder() {
-		this(DEFAULT_INSETS);
-	}
-
-	public RaisedMarginBorder(Insets insets) {
-		super(insets);
-	}
-
-	public RaisedMarginBorder(int t, int l, int b, int r) {
-		super(t, l, b, r);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Border#getInsets(IFigure)
-	 */
-	public Insets getInsets(IFigure figure) {
-		return insets;
-	}
-	
-	/**
-	 * @see org.eclipse.draw2d.Border#isOpaque()
-	 */	
-	public boolean isOpaque() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-	 */
-	public void paint(IFigure figure, Graphics g, Insets insets) {
-		g.setLineStyle(Graphics.LINE_SOLID);
-		g.setLineWidth(1);
-		g.setForegroundColor(ColorConstants.buttonLightest);
-		Rectangle r = getPaintRectangle(figure, insets);
-		r.resize(-1, -1);
-		g.drawLine(r.x, r.y, r.right(), r.y);
-		g.drawLine(r.x, r.y, r.x, r.bottom());
-		g.setForegroundColor(ColorConstants.buttonDarker);
-		g.drawLine(r.x, r.bottom(), r.right(), r.bottom());
-		g.drawLine(r.right(), r.y, r.right(), r.bottom());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RelativeXYAnchor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RelativeXYAnchor.java
deleted file mode 100644
index 8dcb75c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RelativeXYAnchor.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.AbstractConnectionAnchor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * Provides relative anchor for a figure's location. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RelativeXYAnchor extends AbstractConnectionAnchor {
-
-	private Point relativeLocation;
-
-	public RelativeXYAnchor(IFigure figure, Point location, boolean isRelative) {
-		super(figure);
-		relativeLocation = location.getCopy();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.ConnectionAnchor#getLocation(Point)
-	 */
-	public Point getLocation(Point reference) {
-		Point p = relativeLocation.getCopy();
-		Rectangle r = getOwner().getBounds().getCopy();
-		p.performTranslate(r.x, r.y);
-		getOwner().translateToAbsolute(p);
-		return p;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.AbstractConnectionAnchor#getReferencePoint()
-	 */
-	public Point getReferencePoint() {
-		return getLocation(null);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RoleTaskCompositeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RoleTaskCompositeEditPart.java
deleted file mode 100644
index b008128..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/RoleTaskCompositeEditPart.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.authoring.gef.edit.policies.RoleTaskFlowLayoutEditPolicy;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * RoleTaskCompositeEditPart is container with {@link FlowLayout}, and does not support adding/removing child editpart. 
- *  
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RoleTaskCompositeEditPart extends NodeContainerEditPart {
-
-//	private static final Color BG_COLOR = new Color(Display.getCurrent(), 255,
-//			255, 156);
-	
-	private static  Color BG_COLOR;
-	public RoleTaskCompositeEditPart(RoleTaskComposite model) {
-		super(model);
-	}
-
-	protected IFigure createFigure() {
-		Figure figure = new Figure();
-		FlowLayout layout = new FlowLayout();
-		layout.setMinorSpacing(20);
-		figure.setLayoutManager(layout);
-		figure.setBorder(new RaisedMarginBorder());
-		figure.setBackgroundColor(getBackgroundColor());
-		figure.setOpaque(true);
-		return figure;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart#handlePropertyChanged(Notification)
-	 */
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(NodeContainer.class)) {
-		case ModelPackage.NODE_CONTAINER__NODES:
-			refreshChildren();
-
-			// refresh diagram's children
-			EditPart diagramEditPart = getParent();
-//			if (diagramEditPart instanceof ActivityDetailDiagramEditPart) {
-//				ActivityDetailDiagram diagram = (ActivityDetailDiagram) diagramEditPart
-//						.getModel();
-//
-//				if (!GraphicalDataHelper.isAutoLayout(diagram)) {
-//					((ActivityDetailDiagramEditPart) diagramEditPart)
-//							.getRecentlyAddedParts().addAll(
-//									diagramEditPart.getChildren());
-//					DefaultEditDomain ed = (DefaultEditDomain) diagramEditPart
-//							.getViewer().getEditDomain();
-//					IEditorPart editor = ed.getEditorPart();
-//					if (editor != null && editor instanceof ActivityDetailDiagramEditor) {
-//						((ActivityDetailDiagramEditor) editor).cleanUpDiagram();
-//					}
-//				} else {
-//					diagramEditPart.refresh();
-//				}
-//			}
-			diagramEditPart.refresh();
-			return;
-		}
-		super.handlePropertyChanged(msg);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, new RoleTaskFlowLayoutEditPolicy());
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, null);
-	}
-	protected Color getBackgroundColor(){
-		if(BG_COLOR != null) return BG_COLOR;
-		
-		if(BG_COLOR == null){
-			String colorString = AuthoringUIPlugin.getDefault().getPreferenceStore().getString(
-					TemplateConstants.ADD_ROLE_TASKS_BOX_BG_COLOR_RGB);
-			if(colorString != null && colorString.length() > 0){
-				StringTokenizer tokenizer = new StringTokenizer(colorString, ","); //$NON-NLS-1$
-				int r = Integer.parseInt(tokenizer.nextToken());
-				int g = Integer.parseInt(tokenizer.nextToken());
-				int b = Integer.parseInt(tokenizer.nextToken());
-				BG_COLOR = new Color(null, r,g,b);
-				return BG_COLOR;
-			}
-		}
-		if(BG_COLOR == null){
-			BG_COLOR = new Color(Display.getCurrent(), 255,
-							255, 156);
-		}
-		return BG_COLOR;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/StartNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/StartNodeEditPart.java
deleted file mode 100644
index 1aabcb3..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/StartNodeEditPart.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Ellipse;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-
-/**
- * Provides support for creating figure for {@link TypedNode.START}
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class StartNodeEditPart extends NodeEditPart {
-
-	public StartNodeEditPart(TypedNode model) {
-		super(model);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditPolicy()
-	 */
-	protected DirectEditPolicy createDirectEditPolicy() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		Ellipse f = new Ellipse();
-		f.setBackgroundColor(ColorConstants.black);
-		f.setForegroundColor(ColorConstants.red);
-		f.setSize(20, 20);
-		return f;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/SynchBarNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/SynchBarNodeEditPart.java
deleted file mode 100644
index c2fc003..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/SynchBarNodeEditPart.java
+++ /dev/null
@@ -1,134 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * Provides support for creating figure and creating relative anchors
- * for {@link TypedNode.SYNC_BAR}
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class SynchBarNodeEditPart extends NodeEditPart implements
-		ConnectionAnchorLocator {
-
-	private static final Color BG_COLOR = new Color(null, 51, 102, 102);
-
-	private Point recentTargetEndPoint;
-
-	private Point recentSourceEndPoint;
-
-	public SynchBarNodeEditPart(TypedNode model) {
-		super(model);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditPolicy()
-	 */
-	protected DirectEditPolicy createDirectEditPolicy() {
-		return null;
-	}
-
-	protected IFigure createFigure() {
-		RectangleFigure f = new RectangleFigure();
-		f.setBackgroundColor(BG_COLOR);
-		f.setSize(100, 5);
-		return f;
-	}
-
-	public ConnectionAnchor getSourceConnectionAnchor(
-			ConnectionEditPart connection) {
-		boolean isRelative = false;
-		Point sourceEndPoint = null;
-		if (recentSourceEndPoint == null) {
-			// get source end point from the model
-			Link link = (Link) connection.getModel();
-			sourceEndPoint = link.getSourceEndPoint();
-			isRelative = true;
-		} else {
-			sourceEndPoint = recentSourceEndPoint;
-		}
-		if (sourceEndPoint != null) {
-			return new RelativeXYAnchor(getFigure(), sourceEndPoint, isRelative);
-		}
-		return super.getSourceConnectionAnchor(connection);
-	}
-
-	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
-		Point p = null;
-		if (request instanceof CreateConnectionRequest) {
-			CreateConnectionRequest req = (CreateConnectionRequest) request;
-			p = req.getLocation();
-		} else if (request instanceof LocationRequest) {
-			p = ((LocationRequest) request).getLocation();
-		}
-		if (p != null) {
-			recentSourceEndPoint = getLocation(p);
-			return new RelativeXYAnchor(getFigure(), recentSourceEndPoint, true);
-		}
-		return super.getSourceConnectionAnchor(request);
-	}
-
-	public ConnectionAnchor getTargetConnectionAnchor(
-			ConnectionEditPart connection) {
-		boolean isRelative = false;
-		Point targetEndPoint = null;
-		if (recentTargetEndPoint == null) {
-			Link link = (Link) connection.getModel();
-			targetEndPoint = link.getTargetEndPoint();
-			isRelative = true;
-		} else {
-			targetEndPoint = recentTargetEndPoint;
-		}
-		if (targetEndPoint != null) {
-			return new RelativeXYAnchor(getFigure(), targetEndPoint, isRelative);
-		}
-
-		return super.getTargetConnectionAnchor(connection);
-	}
-
-	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
-		Point p = null;
-		if (request instanceof CreateConnectionRequest) {
-			CreateConnectionRequest req = (CreateConnectionRequest) request;
-			p = req.getLocation();
-		} else if (request instanceof LocationRequest) {
-			p = ((LocationRequest) request).getLocation();
-		}
-		if (p != null) {
-			recentTargetEndPoint = getLocation(p);
-			return new RelativeXYAnchor(getFigure(), recentTargetEndPoint, true);
-		}
-
-		return super.getTargetConnectionAnchor(request);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator#getLocation(Point)
-	 */
-	public Point getLocation(Point reference) {
-		return ClosestAnchor.getLocation(getFigure(), reference);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TextFigureCellEditorLocator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TextFigureCellEditorLocator.java
deleted file mode 100644
index 465e7db..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TextFigureCellEditorLocator.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.authoring.gef.figures.TextFigure;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Constraint for TextFlow placing.
- * @author James Thario
- * @since 1.0
- */
-public class TextFigureCellEditorLocator implements CellEditorLocator {
-
-	private TextFigure figure;
-
-
-	/**
-	 * Creates a new LabelTextCellEditorLocator for the given text figure
-	 * @param tf
-	 */
-	public TextFigureCellEditorLocator(TextFigure tf) {
-		setFigure(tf);
-	}
-
-	/**
-	 * @see CellEditorLocator#relocate(org.eclipse.jface.viewers.CellEditor)
-	 */
-	public void relocate(CellEditor celleditor) {
-		TextFigureCellEditorLocator.doLocate(celleditor, figure);
-	}
-
-	public static void doLocate(CellEditor ce, TextFigure fig) {
-		Text text = (Text) ce.getControl();
-		String n = (String) ce.getValue();
-		GC gc = new GC(text);
-		Point size = gc.textExtent(n);
-		gc.dispose();
-		if (size.x != 0)
-			size = text.computeSize(size.x, SWT.DEFAULT);
-		text.setSize(size.x, size.y);
-		Rectangle textBounds = new Rectangle(text.getClientArea().x, text
-				.getClientArea().y, text.getClientArea().width, text
-				.getClientArea().height);
-		Rectangle figBounds = fig.getClientArea();
-		fig.translateToAbsolute(figBounds);
-		int delta = (figBounds.width - textBounds.width) / 2;
-		int y = fig.getTextFlowPage().getLocation().y;
-		text.setLocation(figBounds.x + delta, y);
-	}
-
-	public TextFigure getFigure() {
-		return figure;
-	}
-
-	public void setFigure(TextFigure figure) {
-		this.figure = figure;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TextFigureDirectEditManager.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TextFigureDirectEditManager.java
deleted file mode 100644
index 976b27c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TextFigureDirectEditManager.java
+++ /dev/null
@@ -1,188 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.epf.authoring.gef.figures.TextFigure;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Manages direct editing and creating celleditor for {@link TextFigure}
- * 
- * @author James Thario
- * @since 1.0
- */
-public class TextFigureDirectEditManager extends DirectEditManager {
-
-	Font scaledFont;
-
-	protected VerifyListener verifyListener;
-
-	protected TextFigure figure = null;
-
-	public TextFigureDirectEditManager(GraphicalEditPart source,
-			Class editorType, CellEditorLocator locator, TextFigure figure) {
-		super(source, editorType, locator);
-		this.figure = figure;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		bringDown(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown(boolean check) {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null)
-			disposeFont.dispose();
-		if (check) {
-			NamedNode node = (NamedNode) getEditPart().getModel();
-			String name = node.getName();
-			if (node instanceof WorkBreakdownElementNode) {
-				Object wbelement = node.getObject();
-				if (wbelement instanceof Activity
-						&& ProcessUtil
-								.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
-					name = ProcessUtil
-							.getPresentationName((BreakdownElement) wbelement);
-				}
-
-			}
-			if (name == null || name.trim().length() == 0) {
-				Display
-						.getCurrent()
-						.asyncExec(
-								new PromptEdit(
-										(NamedNodeEditPart) getEditPart(),
-										DiagramUIResources.err_name_empty)); 
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
-	 */
-	protected void initCellEditor() {
-		TextCellEditor editor = (TextCellEditor) getCellEditor();
-		editor.setStyle(SWT.MULTI);
-		Text t = (Text) editor.getControl();
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent event) {
-				Text text = (Text) getCellEditor().getControl();
-				String oldText = text.getText();
-				String leftText = oldText.substring(0, event.start);
-				String rightText = oldText.substring(event.end, oldText
-						.length());
-				GC gc = new GC(text);
-				Point size = gc.textExtent(leftText + event.text + rightText);
-				gc.dispose();
-				if (size.x != 0)
-					size = text.computeSize(size.x, SWT.DEFAULT);
-				getCellEditor().getControl().setSize(size.x, size.y);
-			}
-		};
-		t.addVerifyListener(verifyListener);
-		String initialLabelText = ((NamedNodeEditPart) this.getEditPart())
-				.getDirectEditText();
-		editor.setValue(initialLabelText);
-		t.setFont(TemplateConstants.DEFAULT_FONT);
-		t.selectAll();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
-	 */
-	protected void unhookListeners() {
-		super.unhookListeners();
-		if (getCellEditor() != null) {
-			Text text = (Text) getCellEditor().getControl();
-			if (verifyListener != null)
-				text.removeVerifyListener(verifyListener);
-			verifyListener = null;
-		}
-	}
-
-	/**
-	 * Checks if the given text is valid. Subclasses can override this method.
-	 * 
-	 * @param txt
-	 * @return null if the given text is valid, an error message otherwise
-	 */
-	protected String validate(String txt) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#commit()
-	 */
-	protected void commit() {
-		String msg = validate((String) getCellEditor().getValue());
-		if (msg != null) {
-			bringDown(false);
-			Display.getCurrent().asyncExec(
-					new PromptEdit((NamedNodeEditPart) getEditPart(), msg));
-			return;
-		}
-		super.commit();
-	}
-
-	static class PromptEdit implements Runnable {
-
-		private NamedNodeEditPart part;
-
-		private String msg;
-
-		PromptEdit(NamedNodeEditPart part, String msg) {
-			this.part = part;
-			this.msg = msg;
-		}
-
-		/**
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			String title = DiagramUIResources.diagram_errorDialog_title_text0; 
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, msg); 
-			part.performDirectEdit();
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TopAnchor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TopAnchor.java
deleted file mode 100644
index 0f8282e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/TopAnchor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.AbstractConnectionAnchor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * Connection anchor for top of the figure. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-class TopAnchor extends AbstractConnectionAnchor {
-
-	private int offset;
-
-	TopAnchor(IFigure source, int offset) {
-		super(source);
-		this.offset = offset;
-	}
-
-	public Point getLocation(Point reference) {
-		Rectangle r = getOwner().getBounds().getCopy();
-		getOwner().translateToAbsolute(r);
-		int off = offset;
-		if (off == -1)
-			off = r.width / 2;
-		if (r.contains(reference) || r.y < reference.y)
-			return r.getBottomLeft().translate(off, -1);
-		else
-			return r.getTopLeft().translate(off, 0);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ValidatingDirectEditManager.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ValidatingDirectEditManager.java
deleted file mode 100644
index 372d00f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ValidatingDirectEditManager.java
+++ /dev/null
@@ -1,204 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-
-
-/**
- * Manages direct editing and creating cell editor for the {@link Label}
- * and validates the input. 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ValidatingDirectEditManager extends DirectEditManager {
-
-	Font scaledFont;
-
-	protected VerifyListener verifyListener;
-
-	protected Label activityLabel;
-
-	/**
-	 * Creates a new ActivityDirectEditManager with the given attributes.
-	 * 
-	 * @param source
-	 *            the source EditPart
-	 * @param editorType
-	 *            type of editor
-	 * @param locator
-	 *            the CellEditorLocator
-	 */
-	public ValidatingDirectEditManager(GraphicalEditPart source,
-			Class editorType, CellEditorLocator locator, Label label) {
-		super(source, editorType, locator);
-		activityLabel = label;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		bringDown(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown(boolean check) {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null)
-			disposeFont.dispose();
-		if (check) {
-			NamedNode node = (NamedNode) getEditPart().getModel();
-			String name = node.getName();
-			if (node instanceof WorkBreakdownElementNode) {
-				Object wbelement = node.getObject();
-				if (wbelement instanceof Activity
-						&& ProcessUtil
-								.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
-					name = ProcessUtil
-							.getPresentationName((BreakdownElement) wbelement);
-				}
-
-			}
-			if (name == null || name.trim().length() == 0) {
-				Display
-						.getCurrent()
-						.asyncExec(
-								new PromptEdit(
-										(NamedNodeEditPart) getEditPart(),
-										DiagramUIResources.err_name_empty)); 
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
-	 */
-	protected void initCellEditor() {
-		Text text = (Text) getCellEditor().getControl();
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent event) {
-				Text text = (Text) getCellEditor().getControl();
-				String oldText = text.getText();
-				String leftText = oldText.substring(0, event.start);
-				String rightText = oldText.substring(event.end, oldText
-						.length());
-				GC gc = new GC(text);
-				Point size = gc.textExtent(leftText + event.text + rightText);
-				gc.dispose();
-				if (size.x != 0)
-					size = text.computeSize(size.x, SWT.DEFAULT);
-				getCellEditor().getControl().setSize(size.x, size.y);
-			}
-		};
-		text.addVerifyListener(verifyListener);
-
-		String initialLabelText = activityLabel.getText();
-		getCellEditor().setValue(initialLabelText);
-		IFigure figure = ((GraphicalEditPart) getEditPart()).getFigure();
-		scaledFont = figure.getFont();
-		FontData data = scaledFont.getFontData()[0];
-		Dimension fontSize = new Dimension(0, data.getHeight());
-		activityLabel.translateToAbsolute(fontSize);
-		data.setHeight(fontSize.height);
-		scaledFont = new Font(null, data);
-
-		text.setFont(scaledFont);
-		text.selectAll();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
-	 */
-	protected void unhookListeners() {
-		super.unhookListeners();
-		if (getCellEditor() != null) {
-			Text text = (Text) getCellEditor().getControl();
-			text.removeVerifyListener(verifyListener);
-			verifyListener = null;
-		}
-	}
-
-	/**
-	 * Checks if the given text is valid. Subclasses can override this method.
-	 * 
-	 * @param txt
-	 * @return null if the given text is valid, an error message otherwise
-	 */
-	protected String validate(String txt) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#commit()
-	 */
-	protected void commit() {
-		String msg = validate((String) getCellEditor().getValue());
-		if (msg != null) {
-			bringDown(false);
-			Display.getCurrent().asyncExec(
-					new PromptEdit((NamedNodeEditPart) getEditPart(), msg));
-			return;
-		}
-		super.commit();
-	}
-
-	static class PromptEdit implements Runnable {
-
-		private NamedNodeEditPart part;
-
-		private String msg;
-
-		PromptEdit(NamedNodeEditPart part, String msg) {
-			this.part = part;
-			this.msg = msg;
-		}
-
-		/**
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			String title = DiagramUIResources.diagram_errorDialog_title_text0; 
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, msg); 
-			part.performDirectEdit();
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ValidatingFreeTextEditManager.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ValidatingFreeTextEditManager.java
deleted file mode 100644
index a80e383..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/ValidatingFreeTextEditManager.java
+++ /dev/null
@@ -1,196 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-
-
-/**
- * Manages direct editing and creating cell editor for the {@link Label}
- * and validates the input. 
- * 
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ValidatingFreeTextEditManager extends DirectEditManager {
-
-	Font scaledFont;
-
-	protected VerifyListener verifyListener;
-
-	protected Label activityLabel;
-
-	/**
-	 * Creates a new ActivityDirectEditManager with the given attributes.
-	 * 
-	 * @param source
-	 *            the source EditPart
-	 * @param editorType
-	 *            type of editor
-	 * @param locator
-	 *            the CellEditorLocator
-	 */
-	public ValidatingFreeTextEditManager(GraphicalEditPart source,
-			Class editorType, CellEditorLocator locator, Label label) {
-		super(source, editorType, locator);
-		activityLabel = label;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		bringDown(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown(boolean check) {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null)
-			disposeFont.dispose();
-		if (check) {
-			GraphNode node = ((Node) getEditPart().getModel()).getGraphNode();
-			String name = ((Property) node.getProperty().get(0)).getValue();
-			if (name == null || name.trim().length() == 0) {
-				Display
-						.getCurrent()
-						.asyncExec(
-								new PromptEdit(
-										(NodeEditPart) getEditPart(),
-										AuthoringUIResources.gef_validatingFreeTextEditManager_bringDownPrompt)); 
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
-	 */
-	protected void initCellEditor() {
-		Text text = (Text) getCellEditor().getControl();
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent event) {
-				Text text = (Text) getCellEditor().getControl();
-				String oldText = text.getText();
-				String leftText = oldText.substring(0, event.start);
-				String rightText = oldText.substring(event.end, oldText
-						.length());
-				GC gc = new GC(text);
-				Point size = gc.textExtent(leftText + event.text + rightText);
-				gc.dispose();
-				if (size.x != 0)
-					size = text.computeSize(size.x, SWT.DEFAULT);
-				getCellEditor().getControl().setSize(size.x, size.y);
-			}
-		};
-		text.addVerifyListener(verifyListener);
-
-		String initialLabelText = activityLabel.getText();
-		getCellEditor().setValue(initialLabelText);
-		text.selectAll();
-		IFigure figure = ((GraphicalEditPart) getEditPart()).getFigure();
-		scaledFont = figure.getFont();
-		FontData data = scaledFont.getFontData()[0];
-		Dimension fontSize = new Dimension(0, data.getHeight());
-		activityLabel.translateToAbsolute(fontSize);
-		data.setHeight(fontSize.height);
-		scaledFont = new Font(null, data);
-
-		text.setFont(scaledFont);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
-	 */
-	protected void unhookListeners() {
-		super.unhookListeners();
-		if (getCellEditor() != null) {
-			Text text = (Text) getCellEditor().getControl();
-			text.removeVerifyListener(verifyListener);
-			verifyListener = null;
-		}
-	}
-
-	/**
-	 * Checks if the given text is valid. Subclasses can override this method.
-	 * 
-	 * @param txt
-	 * @return null if the given text is valid, an error message otherwise
-	 */
-	protected String validate(String txt) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#commit()
-	 */
-	protected void commit() {
-		String msg = validate((String) getCellEditor().getValue());
-		if (msg != null) {
-			bringDown(false);
-			Display.getCurrent().asyncExec(
-					new PromptEdit((NamedNodeEditPart) getEditPart(), msg));
-			return;
-		}
-		super.commit();
-	}
-
-	static class PromptEdit implements Runnable {
-
-		private NodeEditPart part;
-
-		private String msg;
-
-		PromptEdit(NodeEditPart part, String msg) {
-			this.part = part;
-			this.msg = msg;
-		}
-
-		/**
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			String title = DiagramUIResources.diagram_errorDialog_title_text0; 
-			String problem = DiagramUIResources.diagram_node_property_value_problem_msg; 
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, problem, msg); 
-			part.performDirectEdit();
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WPDiagramEditPartFactory.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WPDiagramEditPartFactory.java
deleted file mode 100644
index 0c477f3..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WPDiagramEditPartFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-
-/**
- * Factory for Work Product Dependency Diagram. Support creation 
- * of child editpart in WorkPRoduct dependency diagram. 
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class WPDiagramEditPartFactory implements EditPartFactory {
-
-	public WPDiagramEditPartFactory() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.gef.EditPartFactory#createEditPart(EditPart, Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-		if (model instanceof Diagram) {
-			return new DiagramEditPart((Diagram) model);
-		} else if (model instanceof WorkProductNode) {
-			return new WorkProductNodeEditPart((NamedNode) model);
-		} else if (model instanceof Link) {
-			return new LinkEditPart((Link) model);
-		}
-		// typed node creation
-		if (model instanceof TypedNode) {
-			TypedNode node = (TypedNode) model;
-			switch (node.getType()) {
-			case TypedNode.START:
-				return new StartNodeEditPart(node);
-			case TypedNode.END:
-				return new EndNodeEditPart(node);
-			case TypedNode.DECISION:
-				return new DecisionNodeEditPart(node);
-			case TypedNode.SYNCH_BAR:
-				return new SynchBarNodeEditPart(node);
-			case TypedNode.FREE_TEXT:
-				return new FreeTextNodeEditPart(node);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WPNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WPNodeEditPart.java
deleted file mode 100644
index 9791ebf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WPNodeEditPart.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.epf.authoring.gef.figures.Images;
-import org.eclipse.epf.authoring.gef.figures.SelectableLabel;
-import org.eclipse.epf.authoring.gef.figures.WPCompartmentFigure;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * 
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- * @since 1.0
- * @deprecated 
- * @see WorkProductNodeEditPart
- */
-public class WPNodeEditPart extends NamedNodeEditPart {
-
-	int type = 1;
-
-	public WPNodeEditPart(NamedNode model) {
-		super(model);
-	}
-
-	protected IFigure createFigure() {
-		if (getModel() instanceof WorkProductNode) {
-			type = ((WorkProductNode) getModel()).getType();
-		}
-		Label l = new SelectableLabel();
-		l.setLabelAlignment(PositionConstants.LEFT);
-		l.setTextPlacement(PositionConstants.SOUTH);
-		l.setBackgroundColor(ColorConstants.white);
-		Font font = new Font(null, "Arial", 9, SWT.NORMAL); //$NON-NLS-1$
-		l.setFont(font);
-		if (type == 1)
-			l.setIcon(Images.ARTIFACT);
-		else if (type == 2)
-			l.setIcon(Images.DELIVERABLE);
-		else if (type == 3)
-			l.setIcon(Images.OUTCOME);
-		else
-			l.setIcon(Images.WORK_PRODUCT_DESCRIPTOR);
-		l.setIconTextGap(5);
-
-		WPCompartmentFigure wpfigure = new WPCompartmentFigure(l, type);
-		return wpfigure;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditManager()
-	 */
-	protected DirectEditManager createDirectEditManager() {
-		Label l = (Label) (((WPCompartmentFigure) getFigure()).getLabel());
-		return new ValidatingDirectEditManager(this, TextCellEditor.class,
-				new LabelTextCellEditorLocator(l), l) {
-			protected String validate(String txt) {
-				Object obj = getEditPart().getModel();
-				if (obj instanceof WorkProductNode) {
-					Node node = (Node) obj;
-					Object e = node.getObject();
-					Suppression suppression = node.getDiagram().getSuppression();
-					return TngUtil.checkWorkProductDescriptorPresentationName(
-							e, txt, suppression);
-				}
-
-				return super.validate(txt);
-			}
-		};
-	}
-
-	IFigure getDirectEditFigure() {
-		return (((WPCompartmentFigure) getFigure()).getLabel());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkBreakdownElementNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkBreakdownElementNodeEditPart.java
deleted file mode 100644
index b19be76..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkBreakdownElementNodeEditPart.java
+++ /dev/null
@@ -1,169 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.epf.authoring.gef.figures.ActivityFigure;
-import org.eclipse.epf.authoring.gef.figures.Colors;
-import org.eclipse.epf.authoring.gef.figures.Images;
-import org.eclipse.epf.authoring.gef.figures.TextFigure;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Common editpart for different {@link Descriptor}
- * Provides support for word-wrap of editpart's object name. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class WorkBreakdownElementNodeEditPart extends NamedNodeEditPart {
-
-	public WorkBreakdownElementNodeEditPart(NamedNode model) {
-		super(model);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NamedNodeEditPart#getImage()
-	 */
-	protected Image getImage() {
-		Image img = null;
-		Node node = (Node) getModel();
-		Object obj = node.getObject();
-		if (obj instanceof Phase) {
-			img = Images.PHASE;
-		}
-		else if (obj instanceof Iteration) {
-			img = Images.ITERATION;
-		}
-		else if (obj instanceof Activity) {
-			img = Images.ACTIVITY;
-		}
-		else if (obj instanceof TaskDescriptor) {
-			img = Images.TASK_DESCRIPTOR;
-		}
-		else if (obj instanceof Milestone) {
-			img = Images.MILESTONE;
-		}
-		return img;
-	}
-
-	protected IFigure createFigure() {
-		ActivityFigure figure = new ActivityFigure();
-		Image image = getImage();
-		if (image != null) {
-			figure.add(image);
-		}
-		return figure;
-	}
-
-	String getDirectEditText() {
-		TextFigure note = (TextFigure) getFigure();
-		return note.getText();
-	}
-
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		IFigure fig = getDirectEditFigure();
-		if (fig instanceof ActivityFigure) {
-			ActivityFigure l = (ActivityFigure) fig;
-			fig.setForegroundColor(getForegroundColor());
-			String text;
-			// Below check is required for Extended Activity presentation name
-			// should be used from base.
-			if (getModel() instanceof WorkBreakdownElementNode) {
-				WorkBreakdownElementNode node = (WorkBreakdownElementNode) getModel();
-				Object wbelement = node.getObject();
-				if (wbelement instanceof Activity
-						&& ProcessUtil
-								.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
-					text = ProcessUtil
-							.getPresentationName((BreakdownElement) wbelement);
-				}
-				else {
-					text = ((NamedNode) getModel()).getName();
-				}
-			}
-			else {
-				text = ((NamedNode) getModel()).getName();
-			}
-			try {
-				if (getParent() instanceof ActivityDetailDiagramEditPart
-						|| getParent().getParent() instanceof ActivityDetailDiagramEditPart) {
-					int w = WRAP_WIDTH;
-					if (this.getModel() instanceof WorkProductDescriptorNode)
-						w = WORK_PRODUCT_WRAP_WIDTH;
-					text = wrap(text, w);
-				}
-			}
-			catch (NullPointerException npe) {
-			}
-			l.setText(text);
-		}
-	}
-
-	private Color getForegroundColor() {
-		NamedNode node = (NamedNode) getModel();
-		if (node.isSuppressed()) {
-			return Colors.SUPRESSED_ELEMENT_LABEL;
-		}
-		if (node.isReadOnly()) {
-			return Colors.INHERITED_ELEMENT_LABEL;
-		}
-		else {
-			return ColorConstants.black;
-		}
-	}
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#createDirectEditManager()
-	 */
-	protected DirectEditManager createDirectEditManager() {
-		return new TextFigureDirectEditManager((GraphicalEditPart) this,
-				TextCellEditor.class, new TextFigureCellEditorLocator(
-						(TextFigure) getFigure()), (TextFigure) getFigure()) {
-			protected String validate(String txt) {
-				Object obj = getEditPart().getModel();
-				if (obj instanceof WorkBreakdownElementNode) {
-					WorkBreakdownElementNode node = (WorkBreakdownElementNode) obj;
-					Object e = node.getObject();
-					if (e instanceof Activity) {
-						return TngUtil.checkWBSActivityPresentationName(e, txt, node.getDiagram().getSuppression());
-					}
-					else {
-						return TngUtil
-								.checkWorkBreakdownElementPresentationName(e,
-										txt, node.getDiagram().getSuppression());
-					}
-				}
-
-				return super.validate(txt);
-			}
-		};
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkProductCompositeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkProductCompositeEditPart.java
deleted file mode 100644
index 251c6ff..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkProductCompositeEditPart.java
+++ /dev/null
@@ -1,246 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.ChopboxAnchor;
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.authoring.gef.commands.CreateLinkCommand;
-import org.eclipse.epf.authoring.gef.commands.ReconnectLinkCommand;
-import org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.NodeEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gef.requests.ReconnectRequest;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * WorkProductCompositeEditPart is container with {@link FlowLayout}, and does not support adding/removing child editpart.
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class WorkProductCompositeEditPart extends NodeContainerEditPart
-		implements NodeEditPart {
-
-	//private static final Color BG_COLOR = new Color(Display.getCurrent(), 255,
-	//		255, 205);
-	private static Color BG_COLOR;
-
-	/**
-	 * @param model
-	 */
-	public WorkProductCompositeEditPart(WorkProductComposite model) {
-		super(model);
-	}
-
-	protected IFigure createFigure() {
-		Figure figure = new Figure();
-		FlowLayout layout = new FlowLayout();
-		layout.setMinorSpacing(20);
-		figure.setLayoutManager(layout);
-		figure.setBorder(new RaisedMarginBorder());
-		figure.setBackgroundColor(getBackgroundColor());
-		figure.setOpaque(true);
-		return figure;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart#handlePropertyChanged(Notification)
-	 */
-	protected void handlePropertyChanged(Notification msg) {
-		switch (msg.getFeatureID(NodeContainer.class)) {
-		case ModelPackage.NODE_CONTAINER__NODES:
-			refreshChildren();
-			
-			adjustSize();
-			
-			// refresh diagram's children
-			EditPart diagramEditPart = getParent();
-			diagramEditPart.refresh();
-
-			return;
-		}
-		super.handlePropertyChanged(msg);
-	}
-
-	/**
-	 * 
-	 */
-	private void adjustSize() {
-		// TODO Auto-generated method stub
-		List list = getChildren();
-		int tHeight = 20;
-		int tWidth = 20;
-		for(Iterator iterator = list.iterator(); iterator.hasNext();){
-			GraphicalEditPart editpart = (GraphicalEditPart)iterator.next();
-			tHeight+=editpart.getFigure().getPreferredSize().height;
-			if(tWidth < editpart.getFigure().getPreferredSize().width){
-				tWidth = editpart.getFigure().getPreferredSize().width;
-			}
-		}
-		((Node) this.getModel()).setHeight(tHeight);
-		((Node) this.getModel()).setWidth(tWidth+20);
-	}
-
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new GraphicalNodeEditPolicy() {
-					protected Command getConnectionCompleteCommand(
-							CreateConnectionRequest request) {
-						CreateLinkCommand cmd = (CreateLinkCommand) request
-								.getStartCommand();
-						cmd.setTarget((Node) getHost().getModel());
-
-						if (request.getTargetEditPart() instanceof ConnectionAnchorLocator) {
-							if (request.getTargetEditPart().equals(
-									request.getSourceEditPart())) {
-
-							} else {
-								cmd
-										.setTargetEndPoint(((ConnectionAnchorLocator) request
-												.getTargetEditPart())
-												.getLocation(request
-														.getLocation()));
-							}
-						}
-
-						return cmd;
-					}
-
-					protected Command getConnectionCreateCommand(
-							CreateConnectionRequest request) {
-						CreateLinkCommand cmd = new CreateLinkCommand(
-								ModelFactory.eINSTANCE.createLink(),
-								(Node) getHost().getModel());
-						if (request.getTargetEditPart() instanceof ConnectionAnchorLocator) {
-							cmd
-									.setSourceEndPoint(((ConnectionAnchorLocator) request
-											.getTargetEditPart())
-											.getLocation(request.getLocation()));
-						} else {
-							cmd.setSourceEndPoint(request.getLocation());
-						}
-						request.setStartCommand(cmd);
-
-						return cmd;
-
-					}
-
-					protected Command getReconnectSourceCommand(
-							ReconnectRequest request) {
-						Link link = (Link) request.getConnectionEditPart()
-								.getModel();
-						ReconnectLinkCommand cmd = new ReconnectLinkCommand(
-								link, (Node) getHost().getModel(), true);
-						if (request.getTarget() instanceof ConnectionAnchorLocator) {
-							cmd.setEndPoint(((ConnectionAnchorLocator) request
-									.getTarget()).getLocation(request
-									.getLocation()));
-						}
-
-						return cmd;
-					}
-
-					protected Command getReconnectTargetCommand(
-							ReconnectRequest request) {
-						Link link = (Link) request.getConnectionEditPart()
-								.getModel();
-						ReconnectLinkCommand cmd = new ReconnectLinkCommand(
-								link, (Node) getHost().getModel(), false);
-						if (request.getTarget() instanceof ConnectionAnchorLocator) {
-							cmd.setEndPoint(((ConnectionAnchorLocator) request
-									.getTarget()).getLocation(request
-									.getLocation()));
-						}
-						return cmd;
-					}
-				});
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, null);
-		installEditPolicy(EditPolicy.COMPONENT_ROLE, null);
-	}
-
-	public ConnectionAnchor getSourceConnectionAnchor(
-			ConnectionEditPart connection) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	public ConnectionAnchor getTargetConnectionAnchor(
-			ConnectionEditPart connection) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
-		return new ChopboxAnchor(getFigure());
-	}
-
-	protected List getModelSourceConnections() {
-		return getNode().getOutgoingConnections();
-	}
-
-	protected List getModelTargetConnections() {
-		return getNode().getIncomingConnections();
-	}
-
-	protected Node getNode() {
-		return (Node) getModel();
-	}
-	
-	protected Color getBackgroundColor(){
-		if(BG_COLOR != null) return BG_COLOR;
-		
-		if(BG_COLOR == null){
-			String colorString = AuthoringUIPlugin.getDefault().getPreferenceStore().getString(
-					TemplateConstants.ADD_WP_BOX_BG_COLOR_RGB);
-			if(colorString != null && colorString.length() > 0){
-				StringTokenizer tokenizer = new StringTokenizer(colorString, ","); //$NON-NLS-1$
-				int r = Integer.parseInt(tokenizer.nextToken());
-				int g = Integer.parseInt(tokenizer.nextToken());
-				int b = Integer.parseInt(tokenizer.nextToken());
-				BG_COLOR = new Color(null, r,g,b);
-				return BG_COLOR;
-			}
-		}
-		if(BG_COLOR == null){
-			BG_COLOR = new Color(Display.getCurrent(), 255,
-							255, 205);
-		}
-		return BG_COLOR;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkProductNodeEditPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkProductNodeEditPart.java
deleted file mode 100644
index de78157..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/WorkProductNodeEditPart.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.epf.authoring.gef.figures.Images;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Provides support for {@link WorkProductDescriptor}.
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class WorkProductNodeEditPart extends NamedNodeEditPart {
-
-	public WorkProductNodeEditPart(NamedNode model) {
-		super(model);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NamedNodeEditPart#getImage()
-	 */
-	protected Image getImage() {
-		Object model = getModel();
-		if (model instanceof WorkProductNode) {
-			WorkProductNode node = (WorkProductNode) model;
-			switch (node.getType()) {
-			case WorkProductNode.ARTIFACT:
-				return Images.WORK_PRODUCT_DESCRIPTOR_16;
-			case WorkProductNode.DELIVERABLE:
-				return Images.DELIVERABLE;
-			case WorkProductNode.OUTCOME:
-				return Images.OUTCOME;
-			}
-			return Images.WORK_PRODUCT_DESCRIPTOR_16;
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.gef.edit.NamedNodeEditPart#createDirectEditPolicy()
-	 */
-	protected DirectEditManager createDirectEditManager() {
-		Label l = (Label) getFigure();
-		return new ValidatingDirectEditManager(this, TextCellEditor.class,
-				new LabelTextCellEditorLocator(l), l) {
-			protected String validate(String txt) {
-				Object obj = getEditPart().getModel();
-				if (obj instanceof WorkProductNode) {
-					Node node = (Node) obj;
-					Object e = node.getObject();
-					Suppression suppression = node.getDiagram().getSuppression();
-					return TngUtil.checkWorkProductDescriptorPresentationName(
-							e, txt, suppression);
-				}
-				return super.validate(txt);
-			}
-		};
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/package.html
deleted file mode 100644
index 311ff38..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides display and editing support for the activity diagrams.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/DiagramLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/DiagramLayoutEditPolicy.java
deleted file mode 100644
index c349dc8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/DiagramLayoutEditPolicy.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit.policies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.XYLayout;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.gef.commands.ChangeBoundsCommand;
-import org.eclipse.epf.authoring.gef.commands.ChangeHeightCommand;
-import org.eclipse.epf.authoring.gef.commands.CreateNodeCommand;
-import org.eclipse.epf.authoring.gef.commands.MoveBendpointCommand;
-import org.eclipse.epf.authoring.gef.edit.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.DiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.LinkEditPart;
-import org.eclipse.epf.authoring.gef.edit.RoleTaskCompositeEditPart;
-import org.eclipse.epf.authoring.gef.edit.WorkProductCompositeEditPart;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.editpolicies.ConstrainedLayoutEditPolicy;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.CreateRequest;
-
-/**
- * An EditPolicy for use with <code>Figures</code> in {@link XYLayout} of diagram. The constraint for
- * XYLayout is a {@link org.eclipse.draw2d.geometry.Rectangle}. Implements the changeconstraint, delete,
- * resize commands of {@link ConstrainedLayoutEditPolicy}
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DiagramLayoutEditPolicy extends XYLayoutEditPolicy {
-
-	protected Command createAddCommand(EditPart child, Object constraint) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	protected Command createChangeConstraintCommand(EditPart child,
-			Object constraint) {
-		return null;
-	}
-
-	protected Command createChangeConstraintCommand(
-			ChangeBoundsRequest request, EditPart child, Object constraint) {
-		
-		// special for ADD
-		EditPart parent = child.getParent();
-		if(parent instanceof ActivityDetailDiagramEditPart){
-			String autolayout = GraphicalDataHelper.getAutoLayoutFlag((ActivityDetailDiagram)(Node)parent.getModel());
-			if(autolayout != null){
-				GraphicalDataHelper.createProperty(((Node)parent.getModel()).getGraphNode(),
-					GraphicalDataHelper.PROP_AUTO_LAYOUT, 
-					GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_FALSE);
-			}
-		}
-		
-		Node node = (Node) child.getModel();
-		int directions = request.getResizeDirection();
-		
-		if ((directions & PositionConstants.NORTH_SOUTH) 
-				== PositionConstants.SOUTH){
-			Point newLocation = node.getLocation().getTranslated(
-					request.getMoveDelta());
-			int newHeight = request.getSizeDelta().height;
-			if (newHeight != 0) {
-				newHeight += ((GraphicalEditPart) child).getFigure().getBounds().height;
-				if (newHeight < 10)
-					return UnexecutableCommand.INSTANCE;
-			} else
-				newHeight = ((GraphicalEditPart) child).getFigure().getBounds().height;
-			return new ChangeHeightCommand(node, newLocation, newHeight);
-		}
-		else{
-			// Other directions are EAST WEST. 
-			Point newLocation = node.getLocation().getTranslated(
-					request.getMoveDelta());
-			int newWidth = request.getSizeDelta().width;
-			if (newWidth != 0) {
-				newWidth += ((GraphicalEditPart) child).getFigure().getBounds().width;
-				if (newWidth < 10)
-					return UnexecutableCommand.INSTANCE;
-			} else
-				newWidth = ((GraphicalEditPart) child).getFigure().getBounds().width;
-			return new ChangeBoundsCommand(node, newLocation, newWidth);
-		} 
-	}
-
-	protected EditPolicy createChildEditPolicy(EditPart child) {
-		ResizableEditPolicy childPolicy = new ResizableEditPolicy();
-		if(child instanceof RoleTaskCompositeEditPart ||
-				child instanceof WorkProductCompositeEditPart){
-			childPolicy.setResizeDirections(PositionConstants.NSEW);
-		}else{
-			childPolicy.setResizeDirections(PositionConstants.EAST_WEST);
-		}
-		return childPolicy;
-	}
-
-	protected Command getCreateCommand(CreateRequest request) {
-		if (request.getNewObject() instanceof Node) {
-			Point loc = request.getLocation();
-			getHostFigure().translateToRelative(loc);
-			return new CreateNodeCommand((Node) request.getNewObject(),
-					(Diagram) getHost().getModel(), loc);
-		}
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	protected Command getDeleteDependantCommand(Request request) {
-		return null;
-	}
-
-	protected Command getResizeChildrenCommand(ChangeBoundsRequest request) {
-		CompoundCommand resize = new CompoundCommand();
-		Command c;
-		GraphicalEditPart child;
-		List children = request.getEditParts();
-
-		for (int i = 0; i < children.size(); i++) {
-			child = (GraphicalEditPart) children.get(i);
-			c = createChangeConstraintCommand(
-					request,
-					child,
-					translateToModelConstraint(getConstraintFor(request, child)));
-			resize.add(c);
-			if (!child.getSourceConnections().isEmpty()) {
-				List list = child.getSourceConnections();
-				for (Iterator itor = list.iterator(); itor.hasNext();) {
-					Object obj = itor.next();
-					if (obj instanceof LinkEditPart) {
-						EditPart rootedit = child.getParent();
-						List sel = new ArrayList();
-						if (rootedit instanceof DiagramEditPart) {
-							sel = ((DiagramEditPart) rootedit).getViewer()
-									.getSelectedEditParts();
-						}
-						EditPart part = ((LinkEditPart) obj).getTarget();
-						if (sel.contains(part)) {
-							Link link = (Link) ((LinkEditPart) obj).getModel();
-							((DiagramEditPart) rootedit).getViewer()
-									.appendSelection((LinkEditPart) obj);
-							List blist = link.getBendpoints();
-							for (int j = 0; j < blist.size(); j++) {
-								AbsoluteBendpoint abpoint = (AbsoluteBendpoint) blist
-										.get(j);
-								Point deltaPoint = request.getMoveDelta();
-								((LinkEditPart) obj).getFigure()
-										.translateToAbsolute(deltaPoint);
-								Point p = abpoint.getTranslated(request
-										.getMoveDelta());
-								Command bendcommand = new MoveBendpointCommand(
-										link, p, j);
-								resize.add(bendcommand);
-							}
-						}
-					}
-				}
-			}
-		}
-		return resize;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LabelSelectionEditPolicy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LabelSelectionEditPolicy.java
deleted file mode 100644
index 06693c5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LabelSelectionEditPolicy.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit.policies;
-
-import org.eclipse.epf.authoring.gef.figures.SelectableLabel;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-/**
- * Handles selection of activites. Primary selection is denoted by highlight and
- * a focus rectangle. Normal selection is denoted by highlight only.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LabelSelectionEditPolicy extends NonResizableEditPolicy {
-
-	private SelectableLabel getLabel() {
-		GraphicalEditPart part = (GraphicalEditPart) getHost();
-		return ((SelectableLabel) part.getFigure());
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#hideFocus()
-	 */
-	protected void hideFocus() {
-		getLabel().setFocus(false);
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#hideSelection()
-	 */
-	protected void hideSelection() {
-		getLabel().setSelected(false);
-		getLabel().setFocus(false);
-
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#showFocus()
-	 */
-	protected void showFocus() {
-		getLabel().setFocus(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
-	 */
-	protected void showPrimarySelection() {
-		getLabel().setSelected(true);
-		getLabel().setFocus(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
-	 */
-	protected void showSelection() {
-		getLabel().setSelected(true);
-		getLabel().setFocus(false);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LinkBendpointEditPolicy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LinkBendpointEditPolicy.java
deleted file mode 100644
index ebdbf85..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LinkBendpointEditPolicy.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit.policies;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.epf.authoring.gef.commands.CreateBendpointCommand;
-import org.eclipse.epf.authoring.gef.commands.DeleteBendpointCommand;
-import org.eclipse.epf.authoring.gef.commands.MoveBendpointCommand;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.BendpointEditPolicy;
-import org.eclipse.gef.requests.BendpointRequest;
-
-/**
- * A EditPolicy to handle the create, move and delete bendpoints activities of Link.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LinkBendpointEditPolicy extends BendpointEditPolicy {
-
-	protected Command getCreateBendpointCommand(BendpointRequest request) {
-		Point loc = request.getLocation();
-		getConnection().translateToRelative(loc);
-		return new CreateBendpointCommand(
-				(Link) request.getSource().getModel(), loc, request.getIndex());
-	}
-
-	protected Command getDeleteBendpointCommand(BendpointRequest request) {
-		return new DeleteBendpointCommand((Link) getHost().getModel(), request
-				.getIndex());
-	}
-
-	protected Command getMoveBendpointCommand(BendpointRequest request) {
-		Point loc = request.getLocation();
-		getConnection().translateToRelative(loc);
-		return new MoveBendpointCommand((Link) request.getSource().getModel(),
-				loc, request.getIndex());
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LinkEndpointEditPolicy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LinkEndpointEditPolicy.java
deleted file mode 100644
index 1905ad8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/LinkEndpointEditPolicy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit.policies;
-
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-
-/**
- * A EditPolicy to handle the selection handles for connection. 
- *  
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LinkEndpointEditPolicy extends ConnectionEndpointEditPolicy {
-
-	private static Font BOLD_FONT;
-
-	protected void addSelectionHandles() {
-		super.addSelectionHandles();
-		getConnectionFigure().setLineWidth(2);
-	}
-
-	protected PolylineConnection getConnectionFigure() {
-		return (PolylineConnection) getHostFigure();
-	}
-
-	protected void hideSelection() {
-		super.hideSelection();
-		getHostFigure().setFont(null);
-		getHostFigure().invalidateTree();
-	}
-
-	protected void removeSelectionHandles() {
-		super.removeSelectionHandles();
-		getConnectionFigure().setLineWidth(0);
-	}
-
-	protected void showSelection() {
-		super.showSelection();
-		if (BOLD_FONT == null) {
-			FontData[] data = getConnectionFigure().getFont().getFontData();
-			for (int i = 0; i < data.length; i++)
-				if ((data[i].getStyle() & SWT.BOLD) == 0)
-					data[i].setStyle(data[i].getStyle() | SWT.BOLD);
-			BOLD_FONT = new Font(null, data);
-		}
-		getHostFigure().setFont(BOLD_FONT);
-		getHostFigure().invalidateTree();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/NodeContainerEditPolicy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/NodeContainerEditPolicy.java
deleted file mode 100644
index 6ef05f5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/NodeContainerEditPolicy.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit.policies;
-
-import org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ContainerEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-
-/**
- * A EditPolicy for {@link NodeContainerEditPart} for disabling direct child creation.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class NodeContainerEditPolicy extends ContainerEditPolicy {
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.ContainerEditPolicy#getCreateCommand(CreateRequest)
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/NodeContainerFlowLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/NodeContainerFlowLayoutEditPolicy.java
deleted file mode 100644
index fdf481d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/NodeContainerFlowLayoutEditPolicy.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.edit.policies;
-
-import org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.FlowLayoutEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-
-/**
- * A EditPolicy for {@link NodeContainerEditPart} to disable the all editing features.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class NodeContainerFlowLayoutEditPolicy extends FlowLayoutEditPolicy {
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.OrderedLayoutEditPolicy#createAddCommand(EditPart,
-	 *      EditPart)
-	 */
-	protected Command createAddCommand(EditPart child, EditPart after) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.OrderedLayoutEditPolicy#createMoveChildCommand(EditPart,
-	 *      EditPart)
-	 */
-	protected Command createMoveChildCommand(EditPart child, EditPart after) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.LayoutEditPolicy#getCreateCommand(CreateRequest)
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.LayoutEditPolicy#getDeleteDependantCommand(Request)
-	 */
-	protected Command getDeleteDependantCommand(Request request) {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/RoleTaskFlowLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/RoleTaskFlowLayoutEditPolicy.java
deleted file mode 100644
index bdfe87e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/RoleTaskFlowLayoutEditPolicy.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.authoring.gef.edit.policies;
-
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.FlowLayoutEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-
-/**
- * EditPolicy to disable the editing feature in a {@link FlowLayout}
- * @author Shashidhar Kannoori
- *
- */
-public class RoleTaskFlowLayoutEditPolicy extends FlowLayoutEditPolicy {
-
-	/**
-	 * 
-	 */
-	public RoleTaskFlowLayoutEditPolicy() {
-		// TODO Auto-generated constructor stub
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.editpolicies.OrderedLayoutEditPolicy#createAddCommand(org.eclipse.gef.EditPart, org.eclipse.gef.EditPart)
-	 */
-	protected Command createAddCommand(EditPart child, EditPart after) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.editpolicies.OrderedLayoutEditPolicy#createMoveChildCommand(org.eclipse.gef.EditPart, org.eclipse.gef.EditPart)
-	 */
-	protected Command createMoveChildCommand(EditPart child, EditPart after) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.editpolicies.LayoutEditPolicy#getCreateCommand(org.eclipse.gef.requests.CreateRequest)
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/package.html
deleted file mode 100644
index a3d8549..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/edit/policies/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides graphical edit policies for the activity diagrams.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/ActivityFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/ActivityFigure.java
deleted file mode 100644
index 12a4f7b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/ActivityFigure.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-/**
- * @author James Thario
- * @since  1.0
- */
-public class ActivityFigure extends TextFigure {
-
-	public ActivityFigure() {
-		super();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/CentredLabel.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/CentredLabel.java
deleted file mode 100644
index 5709f80..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/CentredLabel.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.0
- * @deprecated
- */
-public class CentredLabel extends Label {
-
-	public CentredLabel() {
-		super();
-	}
-
-	public CentredLabel(String s) {
-		super(s);
-	}
-
-	public CentredLabel(Image i) {
-		super(i);
-	}
-
-	public CentredLabel(String s, Image i) {
-		super(s, i);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		if (isOpaque())
-			super.paintFigure(graphics);
-		Rectangle bounds = getBounds();
-		graphics.setForegroundColor(ColorConstants.yellow);
-		graphics.translate(bounds.x, bounds.y);
-		if (!isEnabled()) {
-			graphics.translate(1, 1);
-			graphics.setBackgroundColor(ColorConstants.yellow);
-			graphics.setForegroundColor(ColorConstants.buttonLightest);
-			graphics.drawText(getSubStringText(), getTextLocation());
-			graphics.translate(-1, -1);
-			graphics.setForegroundColor(ColorConstants.buttonDarker);
-		}
-		graphics.drawText(getSubStringText(), getTextLocation());
-		graphics.setBackgroundColor(ColorConstants.yellow);
-		graphics.translate(-bounds.x, -bounds.y);
-		graphics.setBackgroundColor(ColorConstants.blue);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Colors.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Colors.java
deleted file mode 100644
index 337e02d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Colors.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * The color constants referenced by the diagram editors.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class Colors {
-
-	public static final Color INHERITED_ELEMENT_LABEL = ColorConstants.darkGreen;
-
-	public static final Color SUPRESSED_ELEMENT_LABEL = ColorConstants.gray;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/CompositeFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/CompositeFigure.java
deleted file mode 100644
index 812fccc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/CompositeFigure.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.epf.authoring.gef.edit.RaisedMarginBorder;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- * @deprecated
- */
-public class CompositeFigure extends Figure {
-
-	private static final Color BG_COLOR = new Color(Display.getCurrent(), 255,
-			255, 205);
-
-	private static final int DEFAULT_MAX_WIDTH = 50;
-
-	private static final int SPACING = 10;
-
-	private int maxWidth = DEFAULT_MAX_WIDTH;
-
-	/**
-	 * 
-	 */
-	public CompositeFigure() {
-		ToolbarLayout layout = new ToolbarLayout();
-		layout.setMinorAlignment(FlowLayout.ALIGN_CENTER);
-		layout.setStretchMinorAxis(false);
-		layout.setSpacing(SPACING);
-		layout.setObserveVisibility(true);
-		setLayoutManager(layout);
-		setBorder(new RaisedMarginBorder());
-		setBackgroundColor(BG_COLOR);
-		setOpaque(true);
-	}
-
-	public void setMaxWidth(int w) {
-		maxWidth = w;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		if (wHint > maxWidth) {
-			wHint = maxWidth;
-		}
-		return super.getPreferredSize(wHint, hHint);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Diamond.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Diamond.java
deleted file mode 100644
index 06fe4fd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Diamond.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Shape;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * A figure for diamond shape.  
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class Diamond extends Shape {
-
-	private PointList diamond = new PointList(4);
-
-	/**
-	 * @see Shape#fillShape(Graphics)
-	 */
-	protected void fillShape(Graphics g) {
-		g.fillPolygon(diamond);
-	}
-
-	/**
-	 * @see Shape#outlineShape(Graphics)
-	 */
-	protected void outlineShape(Graphics g) {
-		g.drawPolygon(diamond);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#validate()
-	 */
-	public void validate() {
-		Rectangle r = getBounds().getCopy();
-		r.crop(getInsets());
-		r.resize(-1, -1);
-		diamond.removeAllPoints();
-		diamond.addPoint(r.getTop());
-		diamond.addPoint(r.getRight());
-		diamond.addPoint(r.getBottom());
-		diamond.addPoint(r.getLeft());
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Polyline#primTranslate(int, int)
-	 */
-	public void primTranslate(int x, int y) {
-		super.primTranslate(x, y);
-		diamond.translate(x, y);
-	}
-
-	public PointList getPoints() {
-		return diamond;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/EndNodeFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/EndNodeFigure.java
deleted file mode 100644
index ac01a05..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/EndNodeFigure.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Ellipse;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.diagram.model.TypedNode;
-
-/**
- * Figure for {@link TypedNode} end.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class EndNodeFigure extends Ellipse {
-
-	/**
-	 * Fills the ellipse.
-	 * 
-	 * @see org.eclipse.draw2d.Shape#fillShape(org.eclipse.draw2d.Graphics)
-	 */
-	protected void fillShape(Graphics graphics) {
-		Rectangle r = getBounds().getCopy();
-		r.shrink(r.width / 8, r.height / 8);
-		graphics.fillOval(r);
-	}
-
-	/**
-	 * Outlines the ellipse.
-	 * 
-	 * @see org.eclipse.draw2d.Shape#outlineShape(org.eclipse.draw2d.Graphics)
-	 */
-	protected void outlineShape(Graphics graphics) {
-		super.outlineShape(graphics);
-
-		Rectangle r = Rectangle.SINGLETON;
-		r.setBounds(getBounds());
-		r.shrink(getBounds().width / 8, getBounds().height / 8);
-		r.width--;
-		r.height--;
-		r.shrink((lineWidth - 1) / 2, (lineWidth - 1) / 2);
-		graphics.drawOval(r);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/FreeTextFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/FreeTextFigure.java
deleted file mode 100644
index 36d8e52..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/FreeTextFigure.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RelativeLocator;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.text.FlowPage;
-import org.eclipse.draw2d.text.ParagraphTextLayout;
-import org.eclipse.draw2d.text.TextFlow;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-/**
- * Figure to support free text in the diagram, without an image attached to it.
- * FreeTextFigure wrapper over {@link FlowPage} and {@link TextFlow}. 
- * 
- * @author Shashidhar kannoori
- *
- */
-public class FreeTextFigure extends Figure {
-
-	private FlowPage textFlowPage;
-
-	private TextFlow textFlow;
-
-	public FreeTextFigure() {
-		textFlowPage = new FlowPage();
-		textFlowPage.setHorizontalAligment(PositionConstants.CENTER);
-		setLayoutManager(new StackLayout());
-		add(textFlowPage, new RelativeLocator(textFlowPage,
-				PositionConstants.ALWAYS_LEFT));
-	}
-	public String getText() {
-		return textFlow.getText();
-	}
-
-	public void setText(String newText) {
-		textFlowPage.removeAll();
-		textFlow = new TextFlow();
-		textFlow.setFont(TemplateConstants.DEFAULT_FONT);
-		textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
-				ParagraphTextLayout.WORD_WRAP_TRUNCATE));
-		textFlow.setText(newText);
-		textFlowPage.add(textFlow);
-	}
-
-	public FlowPage getTextFlowPage() {
-		return textFlowPage;
-	}
-	public void setFont(Font f) {
-		// TODO Auto-generated method stub
-		super.setFont(f);
-		textFlow.setFont(f);
-	}
-	public void setForegroundColor(Color fg) {
-		// TODO Auto-generated method stub
-		super.setForegroundColor(fg);
-		textFlow.setForegroundColor(fg);
-	}
-
-	public TextFlow getTextFlow() {
-		return textFlow;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Images.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Images.java
deleted file mode 100644
index 9b4e01f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/Images.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Image location constants referenced in diagram.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class Images {
-
-	public static final Image ACTIVITY = AuthoringUIPlugin.getDefault()
-			.getImage("shape/activity.gif"); //$NON-NLS-1$
-
-	public static final Image ITERATION = AuthoringUIPlugin.getDefault()
-			.getImage("shape/iteration.gif"); //$NON-NLS-1$
-
-	public static final Image PHASE = AuthoringUIPlugin.getDefault().getImage(
-			"shape/phase.gif"); //$NON-NLS-1$
-
-	public static final Image MILESTONE = AuthoringUIPlugin.getDefault()
-			.getImage("shape/milestone.gif"); //$NON-NLS-1$
-
-	public static final Image ROLE = AuthoringUIPlugin.getDefault().getImage(
-			"shape/role.gif"); //$NON-NLS-1$
-
-	public static final Image TASK = AuthoringUIPlugin.getDefault().getImage(
-			"shape/task.gif"); //$NON-NLS-1$
-
-	public static final Image TASK_DESCRIPTOR = AuthoringUIPlugin.getDefault()
-			.getImage("shape/taskdescriptor.gif"); //$NON-NLS-1$
-
-	public static final Image WORK_PRODUCT_DESCRIPTOR = AuthoringUIPlugin
-			.getDefault().getImage("shape/workproductdescriptor.gif"); //$NON-NLS-1$
-
-	public static final Image ARTIFACT = AuthoringUIPlugin.getDefault()
-			.getImage("shape/artifact.gif"); //$NON-NLS-1$
-
-	public static final Image DELIVERABLE = AuthoringUIPlugin.getDefault()
-			.getImage("shape/deliverable.gif"); //$NON-NLS-1$
-
-	public static final Image OUTCOME = AuthoringUIPlugin.getDefault()
-			.getImage("shape/outcome.gif"); //$NON-NLS-1$
-
-	public static final Image WORK_PRODUCT = AuthoringUIPlugin.getDefault()
-			.getImage("WorkProductDescriptor.gif"); //$NON-NLS-1$
-
-	public static final Image TASK_DESCRIPTOR_16 = AuthoringUIPlugin
-			.getDefault().getImage("shape/taskdes_obj.gif"); //$NON-NLS-1$
-
-	public static final Image ROLE_DESCRIPTOR_16 = AuthoringUIPlugin
-			.getDefault().getImage("shape/roledes_obj.gif"); //$NON-NLS-1$
-
-	public static final Image WORK_PRODUCT_DESCRIPTOR_16 = AuthoringUIPlugin
-			.getDefault().getImage("shape/workdes_obj.gif"); //$NON-NLS-1$
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/NoteFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/NoteFigure.java
deleted file mode 100644
index a7ab1ea..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/NoteFigure.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * 
- * @author James Thario
- * @since  1.0
- * @deprecated
- */
-public class NoteFigure
-        extends TextFigure {
-    private static final int CORNER_SIZE = 4;
-
-    public NoteFigure() {
-        setBackgroundColor(ColorConstants.tooltipBackground);
-        setForegroundColor(ColorConstants.black);
-
-        setBorder(new MarginBorder(CORNER_SIZE));
-    }
-
-    protected void paintFigure(Graphics graphics) {
-        Rectangle rect = getBounds().getCopy();
-
-        graphics.translate(getLocation());
-
-        // fill the note
-        PointList outline = new PointList();
-
-        outline.addPoint(0, 0);
-        outline.addPoint(rect.width - CORNER_SIZE, 0);
-        outline.addPoint(rect.width - 1, CORNER_SIZE);
-        outline.addPoint(rect.width - 1, rect.height - 1);
-        outline.addPoint(0, rect.height - 1);
-
-        graphics.fillPolygon(outline);
-
-        // draw the inner outline
-        PointList innerLine = new PointList();
-
-        innerLine.addPoint(rect.width - CORNER_SIZE - 1, 0);
-        innerLine.addPoint(rect.width - CORNER_SIZE - 1, CORNER_SIZE);
-        innerLine.addPoint(rect.width - 1, CORNER_SIZE);
-        innerLine.addPoint(rect.width - CORNER_SIZE - 1, 0);
-        innerLine.addPoint(0, 0);
-        innerLine.addPoint(0, rect.height - 1);
-        innerLine.addPoint(rect.width - 1, rect.height - 1);
-        innerLine.addPoint(rect.width - 1, CORNER_SIZE);
-
-        graphics.drawPolygon(innerLine);
-
-        graphics.translate(getLocation().getNegated());
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/RoleTaskCompositeFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/RoleTaskCompositeFigure.java
deleted file mode 100644
index b9c8a5c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/RoleTaskCompositeFigure.java
+++ /dev/null
@@ -1,97 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.epf.authoring.gef.edit.RaisedMarginBorder;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Figure for {@link RoleTaskComposite}.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RoleTaskCompositeFigure extends Figure {
-
-	private static final Color BG_COLOR = new Color(Display.getCurrent(), 255,
-			255, 156);
-
-	private static final int MAX_WIDTH = 500;
-
-	private static final int MINOR_SPACING = 20;
-
-	private Figure tasksFigure;
-
-	/**
-	 * 
-	 */
-	public RoleTaskCompositeFigure() {
-		FlowLayout layout = new FlowLayout(true);
-		layout.setMinorAlignment(FlowLayout.ALIGN_CENTER);
-		layout.setMajorAlignment(FlowLayout.ALIGN_LEFTTOP);
-		layout.setStretchMinorAxis(false);
-		layout.setMinorSpacing(MINOR_SPACING);
-		layout.setObserveVisibility(true);
-
-		setLayoutManager(layout);
-		setBorder(new RaisedMarginBorder());
-		setBackgroundColor(BG_COLOR);
-		setOpaque(true);
-
-		tasksFigure = new Figure() {
-			/**
-			 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-			 */
-			public Dimension getPreferredSize(int wHint, int hHint) {
-				IFigure firstChild = (IFigure) getChildren().get(0);
-				if (firstChild != this) {
-					int offset = firstChild.getSize().width; // firstChild.getSize().width
-					// +
-					// RoleTaskCompositeFigure.this.getInsets().getWidth()
-					// +
-					// MINOR_SPACING;
-					if (wHint < offset) {
-
-					}
-					wHint = wHint - offset;
-					if (wHint > MAX_WIDTH) {
-						wHint = MAX_WIDTH;
-					}
-				}
-				Dimension dim = super.getPreferredSize(wHint, hHint);
-				return dim;
-			}
-		};
-		FlowLayout flowLayout = new FlowLayout();
-		flowLayout.setMinorSpacing(10);
-		flowLayout.setMinorAlignment(FlowLayout.ALIGN_CENTER);
-		tasksFigure.setLayoutManager(flowLayout);
-		tasksFigure.setOpaque(true);
-		super.add(tasksFigure, null, -1);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#add(IFigure, Object, int)
-	 */
-	public void add(IFigure figure, Object constraint, int index) {
-		if (getChildren().size() == 1) {
-			super.add(figure, constraint, 0);
-		} else {
-			tasksFigure.add(figure, constraint);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/RoleTaskFlowLayout.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/RoleTaskFlowLayout.java
deleted file mode 100644
index fbd7862..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/RoleTaskFlowLayout.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.authoring.gef.figures;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author skannoor
- * @deprecated
- */
-public class RoleTaskFlowLayout extends FlowLayout {
-
-	boolean adjust = false;
-	WorkingData data;
-	/**
-	 * 
-	 */
-	public RoleTaskFlowLayout() {
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param isHorizontal
-	 */
-	public RoleTaskFlowLayout(boolean isHorizontal) {
-		super(isHorizontal);
-		// TODO Auto-generated constructor stub
-	}
-	
-	public void layout(IFigure parent) {
-		// TODO Auto-generated method stub
-		if(adjust){
-			adjustLayout(parent);
-		}else
-			super.layout(parent);
-	}
-	class WorkingData {
-		int rowHeight, rowWidth, rowCount, rowX, rowY, maxWidth;
-		Rectangle bounds[], area;
-		IFigure row[];
-	}
-	/**
-	 * Initializes the state of row data, which is internal to the layout process. 
-	 */
-	private void initRow() {
-		data.rowX = 0;
-		data.rowHeight = 0;
-		data.rowWidth = 0;
-		data.rowCount = 0;
-	}
-
-	/**
-	 * Initializes state data for laying out children, based on the Figure given as input.
-	 *
-	 * @param parent the parent figure
-	 * @since 2.0 
-	 */
-	private void initVariables(IFigure parent) {
-		data.row = new IFigure[parent.getChildren().size()];
-		data.bounds = new Rectangle[data.row.length];
-		data.maxWidth = data.area.width;
-	}
-	private void adjustLayout(IFigure parent) {
-		// TODO Auto-generated method stub
-		data = new WorkingData();
-		Rectangle relativeArea = parent.getClientArea();
-		data.area = transposer.t(relativeArea);
-
-		Iterator iterator = parent.getChildren().iterator();
-		int dx;
-
-		//Calculate the hints to be passed to children
-		int wHint = -1;
-		int hHint = -1;
-		if (isHorizontal())
-			wHint = parent.getClientArea().width;
-		else
-			hHint = parent.getClientArea().height;
-
-		initVariables(parent);
-		initRow();
-		int i = 0; 
-		while (iterator.hasNext()) {
-			IFigure f = (IFigure)iterator.next();
-			Dimension pref = transposer.t(getChildSize(f, wHint, hHint));
-			Rectangle r = new Rectangle(0, 0, pref.width, pref.height);
-
-			if (data.rowCount > 0) {
-				if (data.rowWidth + pref.width > data.maxWidth)
-					layoutRow(parent);
-			}
-			r.x = data.rowX;
-			r.y = data.rowY;
-			dx = r.width + getMinorSpacing();
-			data.rowX += dx;
-			data.rowWidth += dx;
-			data.rowHeight = Math.max(data.rowHeight, r.height);
-			data.row [data.rowCount] = f;
-			data.bounds[data.rowCount] = r;
-			data.rowCount++;
-			i++;
-		}
-		if (data.rowCount != 0)
-			layoutRow(parent);
-		data = null;
-	}
-
-	public void setAdjust(boolean adjust) {
-		this.adjust = adjust;
-	}	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/SelectableLabel.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/SelectableLabel.java
deleted file mode 100644
index e9925b9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/SelectableLabel.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * A customized Label for selection. Primary selection is denoted by highlight
- * and focus rectangle. Normal selection is denoted by highlight only.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class SelectableLabel extends Label {
-
-	private boolean selected;
-
-	private boolean hasFocus;
-
-	private Rectangle getSelectionRectangle() {
-		Rectangle bounds = getTextBounds();
-		bounds.expand(new Insets(2, 2, 0, 0));
-		translateToParent(bounds);
-		bounds.intersect(getBounds());
-		return bounds;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Label#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		if (selected) {
-			graphics.pushState();
-			graphics.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			graphics.fillRectangle(getSelectionRectangle());
-			graphics.popState();
-			graphics.setForegroundColor(ColorConstants.white);
-		}
-		if (hasFocus) {
-			graphics.pushState();
-			graphics.setXORMode(true);
-			graphics.setForegroundColor(ColorConstants.menuBackgroundSelected);
-			graphics.setBackgroundColor(ColorConstants.white);
-			graphics.drawFocus(getSelectionRectangle().resize(-1, -1));
-			graphics.popState();
-		}
-		super.paintFigure(graphics);
-	}
-
-	/**
-	 * Sets the selection state of this SimpleActivityLabel
-	 * 
-	 * @param b
-	 *            true will cause the label to appear selected
-	 */
-	public void setSelected(boolean b) {
-		selected = b;
-		repaint();
-	}
-
-	/**
-	 * Sets the focus state of this SimpleActivityLabel
-	 * 
-	 * @param b
-	 *            true will cause a focus rectangle to be drawn around the text
-	 *            of the Label
-	 */
-	public void setFocus(boolean b) {
-		hasFocus = b;
-		repaint();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/TextFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/TextFigure.java
deleted file mode 100644
index 09e1a8a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/TextFigure.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.ImageFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RelativeLocator;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.text.FlowPage;
-import org.eclipse.draw2d.text.ParagraphTextLayout;
-import org.eclipse.draw2d.text.TextFlow;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * TextFigure is customizable figure to allow word-wraping and with image. 
- * {@link Label} do not support word-wrap.  TextFigure is wrapper over {@link TextFlow}
- * and {@link FlowPage} to support word-wrap and image. 
- * @author James Thario
- * @since  1.0
- */
-public class TextFigure extends Figure {
-
-	private FlowPage textFlowPage;
-
-	private TextFlow textFlow;
-
-	private ImageFigure imageFigure;
-
-	public TextFigure() {
-		textFlowPage = new FlowPage();
-		textFlowPage.setHorizontalAligment(PositionConstants.CENTER);
-		setLayoutManager(new ToolbarLayout());
-		imageFigure = new ImageFigure();
-		add(imageFigure, new RelativeLocator(imageFigure,
-				PositionConstants.CENTER));
-		add(textFlowPage, new RelativeLocator(textFlowPage,
-				PositionConstants.ALWAYS_LEFT));
-	}
-
-	public void add(Image image) {
-		imageFigure.setImage(image);
-	}
-
-	public String getText() {
-		return textFlow.getText();
-	}
-
-	public void setText(String newText) {
-		textFlowPage.removeAll();
-		textFlow = new TextFlow();
-		textFlow.setFont(TemplateConstants.DEFAULT_FONT);
-		textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
-				ParagraphTextLayout.WORD_WRAP_HARD));
-		textFlow.setText(newText);
-		textFlowPage.add(textFlow);
-	}
-
-	public FlowPage getTextFlowPage() {
-		return textFlowPage;
-	}
-
-	public TextFlow getTextFlow() {
-		return textFlow;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WPCompartmentFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WPCompartmentFigure.java
deleted file mode 100644
index 8d7ed73..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WPCompartmentFigure.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.epf.authoring.gef.edit.RaisedMarginBorder;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.0
- * @deprecated
- */
-public class WPCompartmentFigure extends Figure {
-
-	public final static Color wpColor = new Color(Display.getCurrent(), 255,
-			255, 156);
-
-	public final static Color artifactColor = new Color(Display.getCurrent(),
-			255, 255, 156);
-
-	public final static Color deliverableColor = new Color(
-			Display.getCurrent(), 206, 255, 216);
-
-	public final static Color outcomeColor = new Color(Display.getCurrent(),
-			206, 255, 100);
-
-	public final static String newWPName = AuthoringUIResources.WPCompartmentFigure_0; 
-
-	public Label label;
-
-	WPFigure figure = null;
-
-	/**
-	 * WorkProduct Compartment - With background filled depending on Type of the
-	 * WorkProduct.
-	 */
-	public WPCompartmentFigure(Label name, int type) {
-		label = name;
-		ToolbarLayout layout = new ToolbarLayout();
-		setLayoutManager(layout);
-		setOpaque(true);
-		setBorder(new RaisedMarginBorder());
-		if (type == 1)
-			setBackgroundColor(artifactColor);
-		else if (type == 2)
-			setBackgroundColor(deliverableColor);
-		else if (type == 3)
-			setBackgroundColor(outcomeColor);
-		else
-			setBackgroundColor(wpColor);
-		label.setText(newWPName);
-		add(label);
-	}
-
-	public Label getLabel() {
-		return label;
-	}
-
-	public void setLabelName(String name) {
-		label.setText(name);
-	}
-
-	public void setLabel(Label label) {
-		this.label = label;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WPFigure.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WPFigure.java
deleted file mode 100644
index 42a10c0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WPFigure.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.AbstractBorder;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.0
- * @deprecated
- */
-public class WPFigure extends Figure {
-
-	public Label label = new Label();
-
-	public WPFigure(Label l) {
-		super();
-		add(l);
-	}
-
-	protected void paintFigure(Graphics g) {
-		Rectangle clientArea = getClientArea();
-		Rectangle bar = clientArea.getCopy();
-		bar.crop(new Insets(0, 5, 5, 5));
-		g.setBackgroundColor(ColorConstants.gray);
-		g.fillRectangle(bar.getTranslated(6, 6));
-		g.setBackgroundColor(ColorConstants.yellow);
-		g.fillRectangle(bar);
-		g.setLineStyle(2);
-		g.setLineWidth(1);
-		super.paintFigure(g);
-	}
-
-	public Label getFigure() {
-		return label;
-	}
-
-	public void setLabelName(String name) {
-		label.setText(name);
-	}
-
-	public void setLabel(Label label) {
-		this.label = label;
-	}
-
-	class Box extends Figure {
-		public Box(Insets insets) {
-			setBorder(new BoxBorder(insets));
-			ToolbarLayout toolbarLayout = new ToolbarLayout();
-			toolbarLayout.setStretchMinorAxis(false);
-			setLayoutManager(toolbarLayout);
-			setBackgroundColor(ColorConstants.red);
-
-		}
-
-		private class BoxBorder extends AbstractBorder {
-
-			public Insets insets = new Insets(1, 0, 0, 0);
-
-			public BoxBorder(Insets insets) {
-				this.insets = insets;
-			}
-
-			/**
-			 * @see org.eclipse.draw2d.Border#getInsets(IFigure)
-			 */
-			public Insets getInsets(IFigure figure) {
-				return insets;
-			}
-
-			/**
-			 * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-			 */
-			public void paint(IFigure figure, Graphics graphics, Insets insets) {
-				Rectangle rect = getPaintRectangle(figure, insets);
-				graphics.drawLine(rect.getTopLeft(), rect.getTopRight());
-			}
-
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WrapLabelnImage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WrapLabelnImage.java
deleted file mode 100644
index cf80df7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WrapLabelnImage.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.ImageFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.text.FlowPage;
-import org.eclipse.draw2d.text.ParagraphTextLayout;
-import org.eclipse.draw2d.text.TextFlow;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.0
- * @deprecated
- */
-public class WrapLabelnImage extends Figure {
-
-	// The inner TextFlow
-	private TextFlow textFlow;
-
-	private Image image;
-
-	public WrapLabelnImage(Image image) {
-		setBorder(new MarginBorder(3));
-		ImageFigure fig = new ImageFigure();
-		this.image = image;
-		fig.setImage(image);
-		add(fig);
-		FlowPage flowPage = new FlowPage();
-
-		textFlow = new TextFlow();
-
-		textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
-				ParagraphTextLayout.WORD_WRAP_SOFT));
-		
-		flowPage.add(textFlow);
-		flowPage.setSize(40,40);
-
-		setLayoutManager(new ToolbarLayout());
-		add(flowPage);
-
-	}
-
-	/**
-	 * Returns the text inside the TextFlow.
-	 * 
-	 * @return the text flow inside the text.
-	 */
-	public String getText() {
-		return textFlow.getText();
-	}
-
-	/**
-	 * Sets the text of the TextFlow to the given value.
-	 * 
-	 * @param newText
-	 *            the new text value.
-	 */
-	public void setText(String newText) {
-		textFlow.setText(newText);
-	}
-
-	/**
-	 * @return Returns the image.
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * @param image
-	 *            The image to set.
-	 */
-	public void setImage(Image image) {
-		this.image = image;
-	}
-	public TextFlow getTextFlow(){
-		return textFlow;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WrappableLabel.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WrappableLabel.java
deleted file mode 100644
index 15873c8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/WrappableLabel.java
+++ /dev/null
@@ -1,1089 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.figures;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.Image;
-
-import com.ibm.icu.text.BreakIterator;
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * Provides support for text wrap in a label.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- * 
- */
-public class WrappableLabel extends Figure implements PositionConstants {
-
-	private static String ELLIPSIS = "..."; //$NON-NLS-1$
-
-	private Image icon;
-
-	private String text = ""; //$NON-NLS-1$
-
-	private String subStringText;
-
-	private Dimension textSize;
-
-	private Dimension subStringTextSize;
-
-	private Dimension iconSize = new Dimension(0, 0);
-
-	private Point iconLocation;
-
-	private Point textLocation;
-
-	private int textAlignment = CENTER;
-
-	private int iconAlignment = CENTER;
-
-	private int labelAlignment = CENTER;
-
-	private int textPlacement = SOUTH;
-
-	private int iconTextGap = 3;
-
-	private static final int FLAG_SELECTED = MAX_FLAG << 1,
-			FLAG_HASFOCUS = MAX_FLAG << 2, FLAG_WRAP = MAX_FLAG << 5,
-			FLAG_WRAP_ALIGN = MAX_FLAG << 6;
-
-	// The primary dimensions used to calculate text size.
-	private Dimension textDimension = new Dimension(-1, -1);
-
-	private Dimension prefSizeDimension = new Dimension(-1, -1);
-
-	private int wrapWidth;
-
-	public WrappableLabel() {
-		super();
-	}
-
-	/**
-	 * Construct a Label with passed String as its text.
-	 * 
-	 * @param s
-	 *            the label text
-	 * @since 2.0
-	 */
-	public WrappableLabel(String s) {
-		setText(s);
-	}
-
-	/**
-	 * Construct a WrappedLabel with passed Image as its icon.
-	 * 
-	 * @param i
-	 *            the WrappedLabel image
-	 * @since 2.0
-	 */
-	public WrappableLabel(Image i) {
-		setIcon(i);
-	}
-
-	/**
-	 * Construct a WrappedLabel with passed String as text and passed Image as
-	 * its icon.
-	 * 
-	 * @param s
-	 *            the WrappedLabel text
-	 * @param i
-	 *            the WrappedLabel image
-	 * @since 2.0
-	 */
-	public WrappableLabel(String s, Image i) {
-		setText(s);
-		setIcon(i);
-	}
-
-	private void alignOnHeight(Point loc, Dimension size, int alignment) {
-		Insets insets = getInsets();
-		switch (alignment) {
-		case TOP:
-			loc.y = insets.top;
-			break;
-		case BOTTOM:
-			loc.y = bounds.height - size.height - insets.bottom;
-			break;
-		default:
-			loc.y = (bounds.height - size.height) / 2;
-		}
-	}
-
-	private void alignOnWidth(Point loc, Dimension size, int alignment) {
-		Insets insets = getInsets();
-		switch (alignment) {
-		case LEFT:
-			loc.x = insets.left;
-			break;
-		case RIGHT:
-			loc.x = bounds.width - size.width - insets.right;
-			break;
-		default:
-			loc.x = (bounds.width - size.width) / 2;
-		}
-	}
-
-	private void calculateAlignment() {
-		switch (textPlacement) {
-		case EAST:
-		case WEST:
-			alignOnHeight(textLocation, getTextSize(), textAlignment);
-			alignOnHeight(iconLocation, iconSize, iconAlignment);
-			break;
-		case NORTH:
-		case SOUTH:
-			alignOnWidth(textLocation, getSubStringTextSize(), textAlignment);
-			alignOnWidth(iconLocation, iconSize, iconAlignment);
-			break;
-		}
-	}
-
-	/**
-	 * Calculates the size of the WrappedLabel using the passed Dimension as the
-	 * size of the WrappedLabel's text.
-	 * 
-	 * @param txtSize
-	 *            the precalculated size of the WrappedLabel's text
-	 * @return the WrappedLabel's size
-	 * @since 2.0
-	 */
-	protected Dimension calculateLabelSize(Dimension txtSize) {
-		int gap = iconTextGap;
-		if (getIcon() == null || getText().equals("")) //$NON-NLS-1$
-			gap = 0;
-		Dimension d = new Dimension(0, 0);
-		if (textPlacement == WEST || textPlacement == EAST) {
-			d.width = iconSize.width + gap + txtSize.width;
-			d.height = Math.max(iconSize.height, txtSize.height);
-		} else {
-			d.width = Math.max(iconSize.width, txtSize.width);
-			d.height = iconSize.height + gap + txtSize.height;
-		}
-		return d;
-	}
-
-	private void calculateLocations() {
-		textLocation = new Point();
-		iconLocation = new Point();
-
-		calculatePlacement();
-		calculateAlignment();
-		Dimension offset = getSize().getDifference(getPreferredSize());
-		offset.width += getTextSize().width - getSubStringTextSize().width;
-		switch (labelAlignment) {
-		case CENTER:
-			offset.scale(0.5f);
-			break;
-		case LEFT:
-			offset.scale(0.0f);
-			break;
-		case RIGHT:
-			offset.scale(1.0f);
-			break;
-		case TOP:
-			offset.height = 0;
-			offset.scale(0.5f);
-			break;
-		case BOTTOM:
-			offset.height = offset.height * 2;
-			offset.scale(0.5f);
-			break;
-		default:
-			offset.scale(0.5f);
-			break;
-		}
-
-		switch (textPlacement) {
-		case EAST:
-		case WEST:
-			offset.height = 0;
-			break;
-		case NORTH:
-		case SOUTH:
-			offset.width = 0;
-			break;
-		}
-
-		textLocation.translate(offset);
-		iconLocation.translate(offset);
-	}
-
-	private void calculatePlacement() {
-		int gap = iconTextGap;
-		if (icon == null || text.equals("")) //$NON-NLS-1$
-			gap = 0;
-		Insets insets = getInsets();
-
-		switch (textPlacement) {
-		case EAST:
-			iconLocation.x = insets.left;
-			textLocation.x = iconSize.width + gap + insets.left;
-			break;
-		case WEST:
-			textLocation.x = insets.left;
-			iconLocation.x = getSubStringTextSize().width + gap + insets.left;
-			break;
-		case NORTH:
-			textLocation.y = insets.top;
-			iconLocation.y = getTextSize().height + gap + insets.top;
-			break;
-		case SOUTH:
-			textLocation.y = iconSize.height + gap + insets.top;
-			iconLocation.y = insets.top;
-		}
-	}
-
-	/**
-	 * Calculates the size of the Label's text size. The text size calculated
-	 * takes into consideration if the Label's text is currently truncated. If
-	 * text size without considering current truncation is desired, use
-	 * {@link #calculateTextSize()}.
-	 * 
-	 * @return the size of the label's text, taking into account truncation
-	 * @since 2.0
-	 */
-	protected Dimension calculateSubStringTextSize() {
-		return FigureUtilities.getTextExtents(getSubStringText(), getFont());
-	}
-
-	/**
-	 * Calculates and returns the size of the Label's text. Note that this
-	 * Dimension is calculated using the Label's full text, regardless of
-	 * whether or not its text is currently truncated. If text size considering
-	 * current truncation is desired, use {@link #calculateSubStringTextSize()}.
-	 * 
-	 * @return the size of the label's text, ignoring truncation
-	 * @since 2.0
-	 */
-	protected Dimension calculateTextSize() {
-		// return FigureUtilities.getTextExtents(getText(), getFont());
-		return FigureUtilities.getTextExtents(getWrappedText(getSize().width,
-				getSize().height), getFont());
-
-	}
-
-	private void clearLocations() {
-		iconLocation = textLocation = null;
-	}
-
-	/**
-	 * Returns the Label's icon.
-	 * 
-	 * @return the label icon
-	 * @since 2.0
-	 */
-	public Image getIcon() {
-		return icon;
-	}
-
-	/**
-	 * Returns the current alignment of the Label's icon. The default is
-	 * {@link PositionConstants#CENTER}.
-	 * 
-	 * @return the icon alignment
-	 * @since 2.0
-	 */
-	public int getIconAlignment() {
-		return iconAlignment;
-	}
-
-	/**
-	 * Returns the bounds of the Label's icon.
-	 * 
-	 * @return the icon's bounds
-	 * @since 2.0
-	 */
-	public Rectangle getIconBounds() {
-		Rectangle bounds = getBounds();
-		return new Rectangle(bounds.getLocation().translate(getIconLocation()),
-				iconSize);
-	}
-
-	/**
-	 * Returns the location of the Label's icon relative to the Label.
-	 * 
-	 * @return the icon's location
-	 * @since 2.0
-	 */
-	protected Point getIconLocation() {
-		if (iconLocation == null)
-			calculateLocations();
-		return iconLocation;
-	}
-
-	/**
-	 * Returns the gap in pixels between the Label's icon and its text.
-	 * 
-	 * @return the gap
-	 * @since 2.0
-	 */
-	public int getIconTextGap() {
-		return iconTextGap;
-	}
-
-	/**
-	 * @see IFigure#getMinimumSize(int, int)
-	 */
-	public Dimension getMinimumSize(int w, int h) {
-		if (minSize != null)
-			return minSize;
-		minSize = new Dimension();
-		if (getLayoutManager() != null)
-			minSize.setSize(getLayoutManager().getMinimumSize(this, w, h));
-
-		Dimension labelSize = calculateLabelSize(FigureUtilities
-				.getTextExtents(ELLIPSIS, getFont()).intersect(
-						FigureUtilities.getTextExtents(getText(), getFont())));
-		Insets insets = getInsets();
-		labelSize.expand(insets.getWidth(), insets.getHeight());
-		minSize.union(labelSize);
-		return minSize;
-	}
-
-	/**
-	 * @see IFigure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		if (prefSize == null || wHint != prefSizeDimension.width
-				|| hHint != prefSizeDimension.height) {
-			prefSize = calculateLabelSize(getTextSize(wHint, hHint));
-			Insets insets = getInsets();
-			prefSize.expand(insets.getWidth(), insets.getHeight());
-			if (getLayoutManager() != null)
-				prefSize.union(getLayoutManager().getPreferredSize(this, wHint,
-						hHint));
-		}
-		if (wHint >= 0 && wHint < prefSize.width) {
-			Dimension minSize = getMinimumSize(wHint, hHint);
-			Dimension result = prefSize.getCopy();
-			result.width = Math.min(result.width, wHint);
-			result.width = Math.max(minSize.width, result.width);
-			prefSizeDimension.width = result.width;
-			prefSizeDimension.height = result.width;
-			return result;
-		}
-		return prefSize;
-	}
-
-	/**
-	 * Calculates the amount of the Label's current text will fit in the Label,
-	 * including an elipsis "..." if truncation is required.
-	 * 
-	 * @return the substring
-	 * @since 2.0
-	 */
-	public String getSubStringText() {
-		if (subStringText != null)
-			return subStringText;
-
-		subStringText = text;
-		Dimension shrink = getPreferredSize(getSize().width, getSize().height)
-				.getDifference(getSize());
-		Dimension effectiveSize = getTextSize().getExpanded(-shrink.width,
-				-shrink.height);
-		Font currentFont = getFont();
-		int fontHeight = FigureUtilities.getFontMetrics(currentFont)
-				.getHeight();
-		int maxLines = (int) (effectiveSize.height / (double) fontHeight);
-
-		StringBuffer accumlatedText = new StringBuffer();
-		StringBuffer remainingText = new StringBuffer(getText());
-		int i = 0, j = 0;
-
-		while (remainingText.length() > 0 && j++ < maxLines) {
-			i = getLineWrapPosition(remainingText.toString(), currentFont,
-					effectiveSize.width);
-
-			if (accumlatedText.length() > 0)
-				accumlatedText.append("\n"); //$NON-NLS-1$
-
-			if (i == 0 || (remainingText.length() > i && j == maxLines)) {
-				int dotsWidth = FigureUtilities.getTextExtents(ELLIPSIS,
-						currentFont).width;
-				i = getLargestSubstringConfinedTo(remainingText.toString(),
-						currentFont, Math.max(effectiveSize.width - dotsWidth,
-								0));
-				accumlatedText.append(remainingText.substring(0, i));
-				accumlatedText.append(ELLIPSIS);
-			} else
-				accumlatedText.append(remainingText.substring(0, i));
-			remainingText.delete(0, i);
-		}
-		return subStringText = accumlatedText.toString();
-	}
-
-	/**
-	 * Returns the size of the Label's current text. If the text is currently
-	 * truncated, the truncated text with its ellipsis is used to calculate the
-	 * size.
-	 * 
-	 * @return the size of this label's text, taking into account truncation
-	 * @since 2.0
-	 */
-	protected Dimension getSubStringTextSize() {
-		if (subStringTextSize == null)
-			subStringTextSize = calculateSubStringTextSize();
-		return subStringTextSize;
-	}
-
-	/**
-	 * Returns the text of the label. Note that this is the complete text of the
-	 * label, regardless of whether it is currently being truncated. Call
-	 * {@link #getSubStringText()} to return the label's current text contents
-	 * with truncation considered.
-	 * 
-	 * @return the complete text of this label
-	 * @since 2.0
-	 */
-	public String getText() {
-		return text;
-	}
-
-	/**
-	 * Returns the current alignment of the Label's text. The default text
-	 * alignment is {@link PositionConstants#CENTER}.
-	 * 
-	 * @return the text alignment
-	 */
-	public int getTextAlignment() {
-		return textAlignment;
-	}
-
-	/**
-	 * Returns the bounds of the label's text. Note that the bounds are
-	 * calculated using the label's complete text regardless of whether the
-	 * label's text is currently truncated.
-	 * 
-	 * @return the bounds of this label's complete text
-	 * @since 2.0
-	 */
-	public Rectangle getTextBounds() {
-		Rectangle bounds = getBounds();
-		return new Rectangle(bounds.getLocation().translate(getTextLocation()),
-				textSize);
-	}
-
-	/**
-	 * Returns the location of the label's text relative to the label.
-	 * 
-	 * @return the text location
-	 * @since 2.0
-	 */
-	protected Point getTextLocation() {
-		if (textLocation != null)
-			return textLocation;
-		calculateLocations();
-		return textLocation;
-	}
-
-	/**
-	 * Returns the current placement of the label's text relative to its icon.
-	 * The default text placement is {@link PositionConstants#EAST}.
-	 * 
-	 * @return the text placement
-	 * @since 2.0
-	 */
-	public int getTextPlacement() {
-		return textPlacement;
-	}
-
-	/**
-	 * Returns the size of the label's complete text. Note that the text used to
-	 * make this calculation is the label's full text, regardless of whether the
-	 * label's text is currently being truncated and is displaying an ellipsis.
-	 * If the size considering current truncation is desired, call
-	 * {@link #getSubStringTextSize()}.
-	 * 
-	 * @return the size of this label's complete text
-	 * @since 2.0
-	 */
-	protected Dimension getTextSize() {
-		if (textSize == null)
-			textSize = calculateTextSize();
-		return textSize;
-	}
-
-	/**
-	 * Returns the size of the label's complete text. Note that the text used to
-	 * make this calculation is the label's full text, regardless of whether the
-	 * label's text is currently being truncated and is displaying an ellipsis.
-	 * If the size considering current truncation is desired, call
-	 * {@link #getSubStringTextSize()}.
-	 * 
-	 * @return the size of this label's complete text
-	 * @since 2.0
-	 */
-	protected Dimension getTextSize(int width, int height) {
-		if (textSize == null) {
-			textSize = calculateTextSize(width, height);
-			textDimension.width = width;
-			textDimension.height = height;
-		}
-		return textSize;
-	}
-
-	/**
-	 * @see IFigure#invalidate()
-	 */
-	public void invalidate() {
-		prefSize = null;
-		minSize = null;
-		clearLocations();
-		textSize = null;
-		subStringTextSize = null;
-		subStringText = null;
-		super.invalidate();
-	}
-
-	/**
-	 * Returns <code>true</code> if the label's text is currently truncated
-	 * and is displaying an ellipsis, <code>false</code> otherwise.
-	 * 
-	 * @return <code>true</code> if the label's text is truncated
-	 * @since 2.0
-	 */
-	public boolean isTextTruncated() {
-		return !getSubStringTextSize().equals(getTextSize());
-	}
-
-	/**
-	 * @see Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		if (isSelected()) {
-			graphics.pushState();
-			graphics.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			graphics.fillRectangle(getSelectionRectangle());
-			graphics.popState();
-			graphics.setForegroundColor(ColorConstants.white);
-		}
-		if (hasFocus()) {
-			graphics.pushState();
-			graphics.setXORMode(true);
-			graphics.setForegroundColor(ColorConstants.menuBackgroundSelected);
-			graphics.setBackgroundColor(ColorConstants.white);
-			graphics.drawFocus(getSelectionRectangle().resize(-1, -1));
-			graphics.popState();
-		}
-		if (isOpaque())
-			super.paintFigure(graphics);
-		Rectangle bounds = getBounds();
-		graphics.translate(bounds.x, bounds.y);
-		if (icon != null)
-			graphics.drawImage(icon, getIconLocation());
-
-		if (!isEnabled()) {
-			graphics.translate(1, 1);
-			graphics.setForegroundColor(ColorConstants.buttonLightest);
-			graphicsdrawText(graphics);
-			graphics.drawText(getSubStringText(), getTextLocation());
-			graphics.translate(-1, -1);
-			graphics.setForegroundColor(ColorConstants.buttonDarker);
-		}
-		graphicsdrawText(graphics);
-		graphics.translate(-bounds.x, -bounds.y);
-	}
-
-	/**
-	 * Sets the label's icon to the passed image.
-	 * 
-	 * @param image
-	 *            the new label image
-	 * @since 2.0
-	 */
-	public void setIcon(Image image) {
-		if (icon == image)
-			return;
-		icon = image;
-		// Call repaint, in case the image dimensions are the same.
-		repaint();
-		if (icon == null)
-			setIconDimension(new Dimension());
-		else
-			setIconDimension(new Dimension(image));
-	}
-
-	/**
-	 * This method sets the alignment of the icon within the icon dimension. The
-	 * dimension should be the same size as the Image itself, so calling this
-	 * method should have no affect.
-	 * 
-	 * @param align
-	 *            the icon alignment
-	 * @since 2.0
-	 */
-	public void setIconAlignment(int align) {
-		if (iconAlignment == align)
-			return;
-		iconAlignment = align;
-		clearLocations();
-		repaint();
-	}
-
-	/**
-	 * Sets the label's icon size to the passed Dimension.
-	 * 
-	 * @param d
-	 *            the new icon size
-	 * @since 2.0
-	 */
-	public void setIconDimension(Dimension d) {
-		if (d.equals(iconSize))
-			return;
-		iconSize = d;
-		revalidate();
-	}
-
-	/**
-	 * Sets the gap in pixels between the label's icon and text to the passed
-	 * value. The default is 4.
-	 * 
-	 * @param gap
-	 *            the gap
-	 * @since 2.0
-	 */
-	public void setIconTextGap(int gap) {
-		if (iconTextGap == gap)
-			return;
-		iconTextGap = gap;
-		repaint();
-		revalidate();
-	}
-
-	/**
-	 * Sets the alignment of the entire label (icon and text). If this figure's
-	 * bounds are larger than the size needed to display the label, the label
-	 * will be aligned accordingly. Valid values are:
-	 * <UL>
-	 * <LI><EM>{@link PositionConstants#CENTER}</EM>
-	 * <LI>{@link PositionConstants#TOP}
-	 * <LI>{@link PositionConstants#BOTTOM}
-	 * <LI>{@link PositionConstants#LEFT}
-	 * <LI>{@link PositionConstants#RIGHT}
-	 * </UL>
-	 * 
-	 * @param align
-	 *            label alignment
-	 */
-	public void setLabelAlignment(int align) {
-		if (labelAlignment == align)
-			return;
-		labelAlignment = align;
-		clearLocations();
-		repaint();
-	}
-
-	/**
-	 * Sets the label's text.
-	 * 
-	 * @param s
-	 *            the new label text
-	 * @since 2.0
-	 */
-	public void setText(String s) {
-		// "text" will never be null.
-		if (s == null)
-			s = ""; //$NON-NLS-1$
-		if (text.equals(s))
-			return;
-		text = s;
-		revalidate();
-		repaint();
-	}
-
-	/**
-	 * Sets the alignment of the Text relative to the icon. The text alignment
-	 * must be orthogonal to the text placement. For example, if the placement
-	 * is EAST, then the text can be aligned using TOP, CENTER, or BOTTOM. Valid
-	 * values are:
-	 * <UL>
-	 * <LI><EM>{@link PositionConstants#CENTER}</EM>
-	 * <LI>{@link PositionConstants#TOP}
-	 * <LI>{@link PositionConstants#BOTTOM}
-	 * <LI>{@link PositionConstants#LEFT}
-	 * <LI>{@link PositionConstants#RIGHT}
-	 * </UL>
-	 * 
-	 * @see #setLabelAlignment(int)
-	 * @param align
-	 *            the text alignment
-	 * @since 2.0
-	 */
-	public void setTextAlignment(int align) {
-		if (textAlignment == align)
-			return;
-		textAlignment = align;
-		clearLocations();
-		repaint();
-	}
-
-	/**
-	 * Sets the placement of text relative to the label's icon. Valid values
-	 * are:
-	 * <UL>
-	 * <LI><EM>{@link PositionConstants#EAST}</EM>
-	 * <LI>{@link PositionConstants#NORTH}
-	 * <LI>{@link PositionConstants#SOUTH}
-	 * <LI>{@link PositionConstants#WEST}
-	 * </UL>
-	 * 
-	 * @param where
-	 *            the text placement
-	 * @since 2.0
-	 */
-	public void setTextPlacement(int where) {
-		if (textPlacement == where)
-			return;
-		textPlacement = where;
-		revalidate();
-		repaint();
-	}
-
-	private Rectangle getSelectionRectangle() {
-		Rectangle bounds = getTextBounds();
-		bounds.expand(new Insets(2, 2, 0, 0));
-		translateToParent(bounds);
-		bounds.intersect(getBounds());
-		return bounds;
-	}
-
-	/**
-	 * Calculates and returns the size of the Label's text. Note that this
-	 * Dimension is calculated using the Label's full text, regardless of
-	 * whether or not its text is currently truncated. If text size considering
-	 * current truncation is desired, use {@link #calculateSubStringTextSize()}.
-	 * 
-	 * @return the size of the label's text, ignoring truncation
-	 * @since 2.0
-	 */
-	protected Dimension calculateTextSize(int width, int height) {
-		return FigureUtilities.getTextExtents(getWrappedText(width, height),
-				getFont());
-	}
-
-	// Code for the Text Wrap.
-	// Starts here.
-
-	private String getWrappedText(int width, int height) {
-		if (!isTextWrapped() || width == -1)
-			return getText();
-
-		if (isIconExist()) {
-			switch (textPlacement) {
-			case EAST:
-			case WEST:
-				width -= iconSize.width + getIconTextGap();
-				break;
-			case NORTH:
-			case SOUTH:
-				if (height != -1)
-					height -= iconSize.height + getIconTextGap();
-				break;
-			}
-		}
-
-		Font f = getFont();
-		int maxLines = Integer.MAX_VALUE;
-		if (height != -1) {
-			int fontHeight = FigureUtilities.getFontMetrics(f).getHeight();
-			maxLines = (int) (height / (double) fontHeight);
-		}
-
-		StringBuffer accumlatedText = new StringBuffer();
-		StringBuffer remainingText = new StringBuffer(getText());
-		int i = 0, j = 0;
-
-		while (remainingText.length() > 0 && j++ < maxLines) {
-			if ((i = getLineWrapPosition(remainingText.toString(), f, height)) == 0)
-				break;
-
-			if (accumlatedText.length() > 0)
-				accumlatedText.append("\n"); //$NON-NLS-1$
-			accumlatedText.append(remainingText.substring(0, i));
-			remainingText.delete(0, i);
-		}
-		return accumlatedText.toString();
-	}
-
-	private boolean isIconExist() {
-		return true;
-	}
-
-	private int getLineWrapPosition(String string, Font f, int width) {
-		BreakIterator iter = BreakIterator.getLineInstance();
-		iter.setText(string);
-		int start = iter.first();
-		int end = iter.next();
-
-		// if the first line segment does not fit in the width,
-		// determine the position within it where we need to cut
-		if (FigureUtilities.getTextExtents(string.substring(start, end), f).width > width) {
-			iter = BreakIterator.getCharacterInstance();
-			iter.setText(string);
-			start = iter.first();
-		}
-
-		// keep iterating as long as width permits
-		do
-			end = iter.next();
-		while (end != BreakIterator.DONE
-				&& FigureUtilities.getTextExtents(string.substring(start, end),
-						f).width <= width);
-		return (end == BreakIterator.DONE) ? iter.last() : iter.previous();
-	}
-
-	/**
-	 * Returns the largest substring of <i>s</i> in Font <i>f</i> that can be
-	 * confined to the number of pixels in <i>availableWidth<i>.
-	 * 
-	 * @param s
-	 *            the original string
-	 * @param f
-	 *            the font
-	 * @param availableWidth
-	 *            the available width
-	 * @return the largest substring that fits in the given width
-	 * @since 2.0 Copied from <class>FigureUtilities<class> Class, to avoid
-	 *        call of static.
-	 */
-	static int getLargestSubstringConfinedTo(String s, Font f,
-			int availableWidth) {
-		FontMetrics metrics = FigureUtilities.getFontMetrics(f);
-		int min, max;
-		float avg = metrics.getAverageCharWidth();
-		min = 0;
-		max = s.length() + 1;
-
-		// The size of the current guess
-		int guess = 0, guessSize = 0;
-		while ((max - min) > 1) {
-			// Pick a new guess size
-			// New guess is the last guess plus the missing width in pixels
-			// divided by the average character size in pixels
-			guess = guess + (int) ((availableWidth - guessSize) / avg);
-
-			if (guess >= max)
-				guess = max - 1;
-			if (guess <= min)
-				guess = min + 1;
-
-			// Measure the current guess
-			guessSize = FigureUtilities
-					.getTextExtents(s.substring(0, guess), f).width;
-
-			if (guessSize < availableWidth)
-				// We did not use the available width
-				min = guess;
-			else
-				// We exceeded the available width
-				max = guess;
-		}
-		return min;
-	}
-
-	/**
-	 * Sets to wrap text in Label.
-	 * 
-	 * @param b
-	 *            true/false
-	 */
-	public void setTextWrap(boolean b) {
-		if (isTextWrapped() == b)
-			return;
-		setFlag(FLAG_WRAP, b);
-		revalidate();
-		repaint();
-	}
-
-	/**
-	 * @return text wrap.
-	 */
-	public boolean isTextWrapped() {
-		return true;
-	}
-
-	/**
-	 * Set text wrap width.
-	 * 
-	 * @param i
-	 *            The label text wrap width
-	 */
-	public void setTextWrapWidth(int i) {
-		if (this.wrapWidth == i)
-			return;
-		this.wrapWidth = i;
-		revalidate();
-		repaint();
-
-	}
-
-	/**
-	 * Text Wrap Alignment, use only after using <method>setTextWrap(boolean)</method>
-	 * 
-	 * @param i
-	 *            The label text wrapping width
-	 */
-	public void setTextWrapAlignment(int i) {
-		if (getTextWrapAlignment() == i)
-			return;
-
-		setAlignmentFlags(i, FLAG_WRAP_ALIGN);
-		repaint();
-	}
-
-	/**
-	 * setAlignmentFlags
-	 * 
-	 * @param int
-	 *            align
-	 * @param int
-	 *            flagOffset
-	 * 
-	 * --- TODO - copied needs to modify
-	 */
-	private void setAlignmentFlags(int align, int flagOffset) {
-		flags &= ~(0x7 * flagOffset);
-		switch (align) {
-		case CENTER:
-			flags |= 0x1 * flagOffset;
-			break;
-		case TOP:
-			flags |= 0x2 * flagOffset;
-			break;
-		case LEFT:
-			flags |= 0x3 * flagOffset;
-			break;
-		case RIGHT:
-			flags |= 0x4 * flagOffset;
-			break;
-		case BOTTOM:
-			flags |= 0x5 * flagOffset;
-			break;
-		}
-	}
-
-	/**
-	 * 
-	 * @param wrapValue
-	 * @return PositionConstant representing the alignment
-	 */
-	private int getAlignment(int flagOffset) {
-		int wrapValue = flags & (0x7 * flagOffset);
-		if (wrapValue == 0x1 * flagOffset)
-			return CENTER;
-		else if (wrapValue == 0x2 * flagOffset)
-			return TOP;
-		else if (wrapValue == 0x3 * flagOffset)
-			return LEFT;
-		else if (wrapValue == 0x4 * flagOffset)
-			return RIGHT;
-		else if (wrapValue == 0x5 * flagOffset)
-			return BOTTOM;
-
-		return CENTER;
-	}
-
-	/**
-	 * @return the label text wrapping width
-	 */
-	public int getTextWrapAlignment() {
-		return getAlignment(FLAG_WRAP_ALIGN);
-	}
-
-	/**
-	 * @return the focus state of this label
-	 */
-	public boolean hasFocus() {
-		return (flags & FLAG_HASFOCUS) != 0;
-	}
-
-	/**
-	 * @return the selection state of this label
-	 */
-	public boolean isSelected() {
-		return (flags & FLAG_SELECTED) != 0;
-	}
-
-	private void graphicsdrawText(Graphics graphics) {
-		String subString = getSubStringText();
-		StringTokenizer tokenizer = new StringTokenizer(subString, "\n"); //$NON-NLS-1$
-
-		Font f = getFont();
-		int fontHeight = FigureUtilities.getFontMetrics(f).getHeight();
-		int textWidth = FigureUtilities.getTextExtents(subString, f).width;
-		int y = getTextLocation().y;
-
-		// If the font's leading area is 0 then we need to add an offset to
-		// avoid truncating at the top (e.g. Korean fonts)
-		if (0 == FigureUtilities.getFontMetrics(f).getLeading()) {
-			int offset = 2; // 2 is the leading area for default English
-			y += offset;
-		}
-
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken();
-			System.out.println("Text added to draw" + token); //$NON-NLS-1$
-			int tokenWidth = FigureUtilities.getTextExtents(token, f).width;
-			int x = getTextLocation().x;
-			switch (getTextWrapAlignment()) {
-			case CENTER:
-				x += (textWidth - tokenWidth) / 2;
-				break;
-			case RIGHT:
-				x += textWidth - tokenWidth;
-				break;
-			}
-			graphics.drawText(token, x, y);
-			y += fontHeight;
-		}
-	}
-
-	/**
-	 * Sets the focus state of this label
-	 * 
-	 * @param b
-	 *            true will cause a focus rectangle to be drawn around the text
-	 *            of the Label
-	 */
-	public void setFocus(boolean b) {
-		if (hasFocus() == b)
-			return;
-		setFlag(FLAG_HASFOCUS, b);
-		repaint();
-	}
-
-	/**
-	 * Sets the selection state of this label
-	 * 
-	 * @param b
-	 *            true will cause the label to appear selected
-	 */
-	public void setSelected(boolean b) {
-		if (isSelected() == b)
-			return;
-		setFlag(FLAG_SELECTED, b);
-		repaint();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/package.html
deleted file mode 100644
index c908dd8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/figures/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides graphical figures for the activity diagrams.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/AnchorUtil.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/AnchorUtil.java
deleted file mode 100644
index 6b11dbe..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/AnchorUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.util;
-
-import org.eclipse.draw2d.geometry.Point;
-
-/**
- * Utility class for anchors.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class AnchorUtil {
-
-	public static Point getClosestPoint(Point[] points, Point point) {
-		int size = points.length;
-		double[] distances = new double[size];
-		for (int i = 0; i < size; i++) {
-			distances[i] = points[i].getDistance(point);
-		}
-		return points[min(distances)];
-	}
-
-	public static int min(double[] numbers) {
-		if (numbers.length == 0)
-			return -1;
-		double min = numbers[0];
-		int id = 0;
-		for (int i = 1; i < numbers.length; i++) {
-			double n = numbers[i];
-			if (n < min) {
-				min = n;
-				id = i;
-			}
-		}
-		return id;
-	}
-
-	/**
-	 * @param numbers
-	 * @return
-	 * 		index of the smallest number in the given array
-	 */
-	public static int min(int[] numbers) {
-		if (numbers.length == 0)
-			return -1;
-		int min = numbers[0];
-		int id = 0;
-		for (int i = 1; i < numbers.length; i++) {
-			int n = numbers[i];
-			if (n < min) {
-				min = n;
-				id = i;
-			}
-		}
-		return id;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/ConnectionAnchorLocator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/ConnectionAnchorLocator.java
deleted file mode 100644
index b634ff7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/ConnectionAnchorLocator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.util;
-
-import org.eclipse.draw2d.geometry.Point;
-
-/**
- * Constraint for placing anchor location.
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface ConnectionAnchorLocator {
-
-	/**
-	 * Gets relative location based on the given reference point
-	 * 
-	 * @param reference
-	 * @return absolute location
-	 */
-	Point getLocation(Point reference);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/DiagramEditorUtil.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/DiagramEditorUtil.java
deleted file mode 100644
index 99c31a9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/DiagramEditorUtil.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.epf.diagram.ui.service.DiagramEditorHelper;
-import org.eclipse.epf.library.edit.ICommandListener;
-import org.eclipse.epf.library.edit.process.command.VaryActivityCommand;
-import org.eclipse.ui.IEditorReference;
-
-/**
- * Provides instructure to listens to actions like LocalContribution, Local
- * Replace in WorkBreakdown Structure. Loads at time of plugin load.
- * 
- * @see VaryActivityCommand
- * 
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public final class DiagramEditorUtil {
-
-	private static DiagramEditorUtil instance = null;
-
-	private List<ICommandListener> commandListeners;
-
-	private DiagramEditorUtil() {
-	}
-
-	public static DiagramEditorUtil getInstance() {
-		if (instance == null) {
-			synchronized (DiagramEditorUtil.class) {
-				if (instance == null) {
-					instance = new DiagramEditorUtil();
-				}
-			}
-		}
-		return instance;
-	}
-
-	public List<ICommandListener> getVaryCommandListeners() {
-		if (commandListeners == null) {
-			commandListeners = new ArrayList<ICommandListener>();
-		}
-
-		commandListeners.add(new ICommandListener() {
-
-			public void notifyExecuted(Command command) {
-				// Get contributor/replacer of the activity.
-				Object wrapper = ((VaryActivityCommand) command).getWrapper();
-				DiagramEditorHelper.closeDiagramEditors(wrapper, 
-						new ArrayList<IEditorReference>());
-				DiagramEditorHelper.refreshParentDiagramEditors(wrapper,
-						new ArrayList<IEditorReference>(), true);
-			}
-
-			public Class getCommandType() {
-				return VaryActivityCommand.class;
-			}
-
-			public void preUndo(Command command) {
-				// Get old contributor/replacer of the activity.
-				Collection list = ((VaryActivityCommand) command).getResult();
-
-				List listx = new ArrayList();
-				for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-					Object wrapper = iterator.next();
-					DiagramEditorHelper.closeDiagramEditors(wrapper, 
-							new ArrayList<IEditorReference>());
-					listx.clear();
-				}
-
-			}
-			public void preExecute(Command command) {
-			}
-
-			public void postUndo(Command command) {
-				DiagramEditorHelper.refreshParentDiagramEditors(((VaryActivityCommand) command).superActivity,
-							new ArrayList<IEditorReference>(), false);
-			}
-		});
-
-		return commandListeners;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/DiagramUIResources.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/DiagramUIResources.java
deleted file mode 100644
index f3df939..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/DiagramUIResources.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.authoring.gef.util;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Resource Class for the Authoring Diagram (GEF) packages.
- * 
- */
-public final class DiagramUIResources extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.epf.authoring.gef.util.Resources";//$NON-NLS-1$
-
-	private DiagramUIResources() {
-		// Do not instantiate
-	}
-
-	public static String previous_name_null1;
-	public static String err_name_empty;
-	public static String moveAction_label;
-	public static String AbstractDiagram_Select_text;
-	public static String AbstractDiagram_Select_tooltip;
-	public static String AbstractDiagram_AddNode_title;
-	public static String AbstractDiagram_AddNode_err_msg;
-	public static String AbstractDiagram_Link_text;
-	public static String AbstractDiagram_Link_select;
-	public static String AbstractDiagram_Link_tooltip;
-	public static String ActivityDiagram_StartNode_text;
-	public static String ActivityDiagram_StartNode_tooltip;
-	public static String AbstractDiagram_FreeText_text;
-	public static String AbstractDiagram_FreeText_tooltip;
-	public static String ActivityDiagram_SyncBar_text;
-	public static String ActivityDiagram_SyncBar_tooltip;
-	public static String ActivityDiagram_DecisionNode_text;
-	public static String ActivityDiagram_DecisionNode_tooltip;
-	public static String ActivityDiagram_EndNode_text;
-	public static String ActivityDetailDiagram_prefix;
-	public static String ActivityDiagram_EndNode_tooltip;
-	public static String ActivityDiagram_Activity_text;
-	public static String ActivityDiagram_Activity_tooltip;
-	public static String ActivityDiagram_Iteration_text;
-	public static String ActivityDiagram_Iteration_tooltip;
-	public static String ActivityDiagram_Phase_text;
-	public static String ActivityDiagram_Phase_tooltip;
-	public static String AbstractDiagram_TaskDescriptor_text;
-	public static String AbstractDiagram_RoleDescriptor_text;
-	public static String WorkProductDependencyDiagram_prefix;
-	public static String AbstractDiagram_RoleDescriptor_tooltip;
-	public static String AbstractDiagram_TaskDescriptor_tooltip;
-	public static String ActvitivityDiagram_DeliveryProcess_text;
-	public static String ActvitivityDiagram_CapabilityPattern_text;
-	public static String ActvitivityDiagram_Phase_tex;
-	public static String ActvitivityDiagram_Iteration_text;
-	public static String ActvitivityDiagram_Activity_text;
-	public static String AbstractDiagram_WorkProductDescriptor_text;
-	public static String AbstractDiagram_WorkProductDescriptor_tooltip;
-	public static String AbstractDiagramEditor_alignMenu_text;
-	public static String AbstractDiagramEditor_refreshFromBaseActivity_text;
-	public static String AbstractDiagramEditor_formatTextBoxActivity_text;
-	public static String AbstractDiagramEditor_hAlignAverageAction_text;
-	public static String AbstractDiagramEditor_hAlignFirstSelectedAction_text;
-	public static String AbstractDiagramEditor_vAlignAverageAction_text;
-	public static String AbstractDiagramEditor_vAlignFirstSelectedAction_text;
-	public static String AbstractDiagramEditor_Save_text;
-	public static String AbstractDiagramEditor_Save_message;
-	public static String AbstractDiagramEditor_MoveNode_label;
-	public static String AbstractDiagramEditorrefreshfrombase;
-	public static String AbstractDiagram_BendPoint_create;
-	public static String ActivityDiagram_openActivityDetailDiagram_text;
-	public static String refreshAction_label;
-	public static String refreshFromBaseCmd_label;
-	public static String diagram_saveError;
-	public static String DeleteDiagram_text;
-	public static String DeleteDiagram_prompt;
-	public static String align_bend_point_text;
-	public static String ConfigurationEditorInput_configeditor0;
-	public static String diagram_node_property_value_problem_msg;
-	public static String diagram_errorDialog_title_text0;
-	public static String ActivityDetailDiagramEditor_ResetDiagramLayout_text;
-	public static String errorDialog_title;
-	public static String command_cannotEdit;
-	public static String AbstractDiagramEditor_ParentEditorClose_title;
-	public static String AbstractDiagramEditor_ParentEditorClose_text;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, DiagramUIResources.class);
-	}
-	
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given object.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String bind(String key, Object data) {
-		return NLS.bind(key, new Object[] { data });
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/Resources.properties b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/Resources.properties
deleted file mode 100644
index 06bce54..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/Resources.properties
+++ /dev/null
@@ -1,84 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-previous_name_null1=Undo of a name change is not allowed if the previous name is null.
-err_name_empty=The name cannot be empty. Please specify a valid name.
-moveAction_label=Move
-
-AbstractDiagram_Select_text=Select
-AbstractDiagram_Select_tooltip=Select node or link
-AbstractDiagram_AddNode_title=Add Node
-AbstractDiagram_AddNode_err_msg=IXRD0002W: Adding a node to diagram failed
-AbstractDiagram_Link_text=Link
-AbstractDiagram_Link_select=Select Link
-AbstractDiagram_Link_tooltip=Create new link
-ActivityDiagram_StartNode_text=Start Node
-ActivityDiagram_StartNode_tooltip=Create new start node
-AbstractDiagram_FreeText_text=Free Text
-AbstractDiagram_FreeText_tooltip=Create new free text
-ActivityDiagram_SyncBar_text=Synchronization Bar
-ActivityDiagram_SyncBar_tooltip=Create new synchronization bar
-ActivityDiagram_DecisionNode_text=Decision Node
-ActivityDiagram_DecisionNode_tooltip=Create new decision node
-ActivityDiagram_EndNode_text=End Node
-ActivityDetailDiagram_prefix=Activity Detail:
-ActivityDiagram_EndNode_tooltip=Create new end node
-ActivityDiagram_Activity_text=Activity
-ActivityDiagram_Activity_tooltip=Create new activity
-ActivityDiagram_Iteration_text=Iteration
-ActivityDiagram_Iteration_tooltip=Create new iteration
-ActivityDiagram_Phase_text=Phase
-ActivityDiagram_Phase_tooltip=Create new phase
-AbstractDiagram_TaskDescriptor_text=Task Descriptor
-AbstractDiagram_RoleDescriptor_text=Role Descriptor
-WorkProductDependencyDiagram_prefix=Work Product Dependency Diagram:
-AbstractDiagram_RoleDescriptor_tooltip=Create new role descriptor
-AbstractDiagram_TaskDescriptor_tooltip=Create new task descriptor
-ActvitivityDiagram_DeliveryProcess_text=Delivery Process
-ActvitivityDiagram_CapabilityPattern_text=Capability Pattern
-ActvitivityDiagram_Phase_tex=Phase
-ActvitivityDiagram_Iteration_text=Iteration
-ActvitivityDiagram_Activity_text=Activity
-AbstractDiagram_WorkProductDescriptor_text=Work Product Descriptor
-AbstractDiagram_WorkProductDescriptor_tooltip=Create new work product descriptor
-
-AbstractDiagramEditor_alignMenu_text=Align
-AbstractDiagramEditor_refreshFromBaseActivity_text=Refresh from Base Activity
-AbstractDiagramEditor_formatTextBoxActivity_text=Format Text Box...
-AbstractDiagramEditor_hAlignAverageAction_text=Horizontally to Average
-AbstractDiagramEditor_hAlignFirstSelectedAction_text=Horizontally to First Selected
-AbstractDiagramEditor_vAlignAverageAction_text=Vertically to Average
-AbstractDiagramEditor_vAlignFirstSelectedAction_text=Vertically to First Selected
-AbstractDiagramEditor_Save_text=Save
-AbstractDiagramEditor_Save_message=Saving {0}
-AbstractDiagramEditor_MoveNode_label=Move Node
-AbstractDiagramEditorrefreshfrombase=Refresh From Base
-AbstractDiagram_BendPoint_create=Create Bendpoint
-
-ActivityDiagram_openActivityDetailDiagram_text=Open Activity Detail Diagram
-refreshAction_label=Refresh
-refreshFromBaseCmd_label=Refresh From Base
-diagram_saveError=IUPD0001W: Saving diagram failed
-
-DeleteDiagram_text=Delete Diagram
-DeleteDiagram_prompt=Are you sure you want to close and delete this diagram?\nThis change is permanent and cannot be undone.
-align_bend_point_text=Align Bend Point
-ConfigurationEditorInput_configeditor0=Configuration Editor
-diagram_node_property_value_problem_msg=Error in the node's property value.
-diagram_errorDialog_title_text0=Error
-
-ActivityDetailDiagramEditor_ResetDiagramLayout_text=Reset Diagram Layout
-errorDialog_title=Error
-command_cannotEdit=IUPD0003E: Cannot edit diagram
-
-AbstractDiagramEditor_ParentEditorClose_title=Parent Editor Closed
-AbstractDiagramEditor_ParentEditorClose_text={0} has closed. Would you also like to close {1}?
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/TemplateConstants.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/TemplateConstants.java
deleted file mode 100644
index 848f318..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/TemplateConstants.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.util;
-
-import java.util.Locale;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * Constants used in authoring diagram
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class TemplateConstants {
-
-	public static final String ACTIVITY = "activity template"; //$NON-NLS-1$
-
-	public static final String ITERATION = "iteration template"; //$NON-NLS-1$
-
-	public static final String PHASE = "phase template"; //$NON-NLS-1$
-
-	public static final String SYNCH_BAR = "synchonization bar"; //$NON-NLS-1$
-
-	public static final String DECISION_NODE = "decision node"; //$NON-NLS-1$
-
-	public static final String START_NODE = "start node"; //$NON-NLS-1$
-
-	public static final String END_NODE = "end node"; //$NON-NLS-1$
-
-	public static final String WORK_PRODUCT = "work product template"; //$NON-NLS-1$
-
-	public static final String ROLE_DESCRIPTOR = "role descriptor template"; //$NON-NLS-1$
-
-	public static final String TASK_DESCRIPTOR = "task descriptor template"; //$NON-NLS-1$
-
-	public static final String WORK_PRODUCT_DESCRIPTOR = "work product descriptor template"; //$NON-NLS-1$
-
-	public static final String FREE_TEXT = "free text"; //$NON-NLS-1$
-
-	// TODO: move these constants to other file. This class define only template
-	// constants
-	//
-	public static final String PROPERTY_FONT_NAME = "property_font_name"; //$NON-NLS-1$
-
-	public static final String PROPERTY_FONT_STYLE = "property_font_style"; //$NON-NLS-1$
-
-	public static final String PROPERTY_FONT_HEIGHT = "property_font_height"; //$NON-NLS-1$
-
-	public static final String PROPERTY_FONT_RED = "property_font_red"; //$NON-NLS-1$
-
-	public static final String PROPERTY_FONT_BLUE = "property_font_blue"; //$NON-NLS-1$
-
-	public static final String PROPERTY_FONT_GREEN = "property_font_green"; //$NON-NLS-1$
-
-	// For default fonts.
-	public static final String DEFAULT_FONT_NAME = getFontName();
-
-	public static final int DEFAULT_FONT_SIZE = 8;
-
-	public static final Font DEFAULT_FONT = new Font(null, DEFAULT_FONT_NAME,
-			DEFAULT_FONT_SIZE, java.awt.Font.PLAIN);
-
-	public static final Font DEFAULT_FONT_ITALIC = new Font(null,
-			DEFAULT_FONT_NAME, DEFAULT_FONT_SIZE, java.awt.Font.ITALIC);
-
-	public static final String WIN_2K = "Windows 2000"; //$NON-NLS-1$
-
-	public static final String getFontName() {
-		String name = "Arial"; //$NON-NLS-1$
-
-		// Corrupted Japanese characters in Activity Diagrams
-		String currentLocale = Platform.getNL();
-		if (currentLocale != null
-				&& currentLocale.startsWith(Locale.JAPANESE.getLanguage())) {
-			if (WIN_2K.equalsIgnoreCase(System.getProperty("os.name"))) { //$NON-NLS-1$
-				name = LibraryResources.roleDiagramFont_name_win32;
-			}
-		}
-		return name;
-	}
-	public static final String ADD_ROLE_TASKS_BOX_BG_COLOR_RGB = "ADD_ROLE_TASKS_BOX_BG_COLOR_RGB"; //$NON-NLS-1$
-	public static final String ADD_WP_BOX_BG_COLOR_RGB = "ADD_WP_BOX_BG_COLOR_RGB"; //$NON-NLS-1$
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/Validation.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/Validation.java
deleted file mode 100644
index cdb19d7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/Validation.java
+++ /dev/null
@@ -1,533 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * Validating routines for diagram editing
- * 
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public final class Validation {
-
-	private static final String errMsg_CanNotConnect = AuthoringUIResources.DiagramValidation_err_cannot_connect_text; 
-
-	private static final String errMsg_SamePredAndSucc = AuthoringUIResources.DiagramValidation_err_samepredandsuc_text; 
-
-	private static final String errMsg_CanNotDelete = AuthoringUIResources.DiagramValidation_err_cannot_delete_text; 
-
-	/**
-	 * Checks if user can connect the given nodes.
-	 * 
-	 * @param source
-	 * @param target
-	 * @return null if connection is allowed, error message otherwise.
-	 */
-	public static String checkConnect(Node source, Node target) {
-		if (source.getDiagram() != target.getDiagram())
-			return AuthoringUIResources.DiagramValidation_err_cannot_connect_text;
-
-		if (source.getDiagram() instanceof ActivityDiagram) {
-			AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-					.getWBS_ComposedAdapterFactory();
-			Object adapter = adapterFactory.adapt(source.getDiagram()
-					.getObject(), ITreeItemContentProvider.class);
-			Object proc = null;
-			if (adapter instanceof IBSItemProvider) {
-				proc = ((IBSItemProvider) adapter).getTopItem();
-			}
-			// get all breakdown elements in this process
-			List<Object> allElements = new ArrayList<Object>();
-			for (Iterator iter = new AdapterFactoryTreeIterator(adapterFactory,
-					proc); iter.hasNext();) {
-				Object obj = iter.next();
-				allElements.add(TngUtil.unwrap(obj));
-			}
-			if (proc != null) {
-				// If target is ReadOnly (means extends) and allow the link if
-				// its parent activity is a Contributor
-				if (target.getDiagram().isReadOnly())
-					return errMsg_CanNotConnect;
-				if (source.getObject() instanceof WorkBreakdownElement) {
-					if (target.getObject() instanceof WorkBreakdownElement) {
-						if (ProcessUtil.checkCircular(
-								(WorkBreakdownElement) target.getObject(),
-								(WorkBreakdownElement) source.getObject(),
-								allElements)) {
-							return errMsg_SamePredAndSucc;
-						}
-						if (target.isReadOnly())
-							return errMsg_CanNotConnect;
-					} else if (target instanceof TypedNode) {
-						// should not allow incoming connection to start node
-						// and FreeText.
-						if (((TypedNode) target).getType() == TypedNode.START
-								|| ((TypedNode) target).getType() == TypedNode.FREE_TEXT) {
-							return errMsg_CanNotConnect;
-						}
-
-						Collection targetNodes = GraphicalDataHelper
-								.getTargetNodes((TypedNode) target,
-										WorkBreakdownElementNode.class);
-						WorkBreakdownElement pred = (WorkBreakdownElement) source
-								.getObject();
-						for (Iterator iter = targetNodes.iterator(); iter
-								.hasNext();) {
-							Node node = ((Node) iter.next());
-							if (node.isReadOnly())
-								return errMsg_CanNotConnect;
-							if (ProcessUtil.checkCircular(
-									(WorkBreakdownElement) node.getObject(),
-									pred, allElements)) {
-								return errMsg_SamePredAndSucc;
-							}
-						}
-					}
-				} else if (source instanceof TypedNode) {
-					if (target == source) {
-						return errMsg_CanNotConnect;
-					}
-					// should not allow outgoing connection from End Node and
-					// Free Text
-					if (((TypedNode) source).getType() == TypedNode.END
-							|| ((TypedNode) source).getType() == TypedNode.FREE_TEXT) {
-						return errMsg_CanNotConnect;
-					}
-
-					if (target instanceof TypedNode) {
-
-						/*
-						 * If source and target are TypedNodes, avoid circular
-						 * loop connection.
-						 */
-						if (checkSyncBarCircularLooop((TypedNode) source,
-								(TypedNode) target) != null) {
-							return errMsg_CanNotConnect;
-						}
-
-						// should not allow incoming connection to start node
-						// and FreeText.
-						if (((TypedNode) target).getType() == TypedNode.START
-								|| ((TypedNode) target).getType() == TypedNode.FREE_TEXT) {
-							return errMsg_CanNotConnect;
-						}
-
-						Collection srcNodes = GraphicalDataHelper
-								.getSourceNodes((TypedNode) source,
-										WorkBreakdownElementNode.class);
-						if (!srcNodes.isEmpty()) {
-							Collection targetNodes = GraphicalDataHelper
-									.getTargetNodes((TypedNode) target,
-											WorkBreakdownElementNode.class);
-							for (Iterator iter = targetNodes.iterator(); iter
-									.hasNext();) {
-								Node node = ((Node) iter.next());
-								if (node.isReadOnly())
-									return errMsg_CanNotConnect;
-								WorkBreakdownElement succ = (WorkBreakdownElement) node
-										.getObject();
-								for (Iterator iterator = srcNodes.iterator(); iterator
-										.hasNext();) {
-									WorkBreakdownElement pred = (WorkBreakdownElement) ((Node) iterator
-											.next()).getObject();
-									if (ProcessUtil.checkCircular(succ, pred,
-											allElements)) {
-										return errMsg_SamePredAndSucc;
-									}
-								}
-							}
-						}
-					} else if (target instanceof WorkBreakdownElementNode) {
-
-						if (target.isReadOnly())
-							return errMsg_CanNotConnect;
-
-						Collection srcNodes = GraphicalDataHelper
-								.getSourceNodes((TypedNode) source,
-										WorkBreakdownElementNode.class);
-						WorkBreakdownElement succ = (WorkBreakdownElement) ((Node) target)
-								.getObject();
-						for (Iterator iterator = srcNodes.iterator(); iterator
-								.hasNext();) {
-							WorkBreakdownElement pred = (WorkBreakdownElement) ((Node) iterator
-									.next()).getObject();
-							if (ProcessUtil.checkCircular(succ, pred,
-									allElements)) {
-								return errMsg_SamePredAndSucc;
-							}
-						}
-
-					}
-				}
-			}
-		} else if (source.getDiagram() instanceof ActivityDetailDiagram) {
-			if (source.isReadOnly() || target.isReadOnly()) {
-				return errMsg_CanNotConnect;
-			}
-
-			if ((source.getObject() instanceof RoleDescriptor || target
-					.getObject() instanceof RoleDescriptor)
-					|| (source.getObject() instanceof TaskDescriptor && target
-							.getObject() instanceof TaskDescriptor)
-					|| (source.getObject() instanceof WorkProductDescriptor && target
-							.getObject() instanceof WorkProductDescriptor)) {
-				return errMsg_CanNotConnect;
-			} else {
-				// check for duplicate connection
-				//
-				for (Iterator iter = source.getOutgoingConnections().iterator(); iter
-						.hasNext();) {
-					Link link = (Link) iter.next();
-					if (link.getTarget() == target) {
-						return errMsg_CanNotConnect;
-					}
-				}
-
-			}
-		} else if (source.getDiagram() instanceof WorkProductDependencyDiagram) {
-			if (source.isReadOnly() || target.isReadOnly()) {
-				return errMsg_CanNotConnect;
-			}
-		}
-
-		return null;
-	}
-
-	public static String checkDelete(Link link) {
-
-		// if (link.getTarget() != null
-		// && link.getTarget().getDiagram() instanceof ActivityDiagram) {
-		// if (link.getTarget().isReadOnly()){
-		// if(link.getSource() instanceof TypedNode){
-		// if(((TypedNode)link.getSource()).getType() == TypedNode.DECISION){
-		// return null;
-		// }
-		// }
-		// return errMsg_CanNotDelete;
-		// }
-		// if (link.getTarget() instanceof TypedNode) {
-		//				
-		// TypedNode typednode = (TypedNode)link.getTarget();
-		// if(typednode.getType() == TypedNode.DECISION){
-		// return null;
-		// }
-		// if(link.getSource() instanceof TypedNode){
-		// typednode = (TypedNode)link.getSource();
-		// if(typednode.getType() == TypedNode.DECISION){
-		// return null;
-		// }
-		// }
-		//				
-		// if (link.getSource().isReadOnly())
-		// return errMsg_CanNotDelete;
-		//				
-		// if (link.getSource().getObject() instanceof WorkBreakdownElement
-		// || (link.getSource() instanceof TypedNode && !GraphicalDataHelper
-		// .getSourceNodes((TypedNode) link.getSource(),
-		// WorkBreakdownElementNode.class)
-		// .isEmpty())) {
-		//					
-		// Collection targetNodes =
-		// GraphicalDataHelper.getTargetNodes((TypedNode) link.getTarget(),
-		// WorkBreakdownElementNode.class);
-		// for (Iterator iter = targetNodes.iterator(); iter.hasNext();) {
-		// Node node = (Node) iter.next();
-		// if (node.isReadOnly()) {
-		// return errMsg_CanNotDelete;
-		// }
-		// }
-		// }
-		//
-		// }
-		// if (link.getSource() instanceof TypedNode) {
-		// TypedNode typednode = (TypedNode)link.getSource();
-		// if(typednode.getType() == TypedNode.DECISION){
-		// return null;
-		// }
-		// if (link.getTarget().isReadOnly())
-		// return errMsg_CanNotDelete;
-		// }
-		// } else if ((link.getTarget() != null &&
-		// link.getTarget().isReadOnly())
-		// || (link.getSource() != null && link.getSource().isReadOnly())) {
-		// return errMsg_CanNotDelete;
-		// }
-		// return null;
-
-		Node source = link.getSource();
-		Node target = link.getTarget();
-
-		// Special handle for Activity Detail Diagram links cannot be deleted.
-		if (target != null
-				&& target.getDiagram() instanceof ActivityDetailDiagram) {
-			return errMsg_CanNotDelete;
-		}
-
-		if (target != null && target.getDiagram() instanceof ActivityDiagram) {
-
-			// Target = breakdownelement
-			if (target instanceof WorkBreakdownElementNode) {
-				// Source = Breakdown element
-				if (source instanceof WorkBreakdownElementNode) {
-					if (link.getTarget().isReadOnly())
-						return errMsg_CanNotDelete;
-					else
-						return null;
-				}
-				// Source = TypedNode
-				if (source instanceof TypedNode) {
-					// Source = Decision Node
-					TypedNode sourceNode = (TypedNode) source;
-					if (!target.isReadOnly()) {
-						return null;
-					} else if (sourceNode.getType() == TypedNode.DECISION) {
-						return null;
-					} else if (sourceNode.getType() == TypedNode.SYNCH_BAR) {
-						return checkSyncBarIncomingLinks(sourceNode);
-					} else if (sourceNode.isReadOnly()) {
-						return errMsg_CanNotDelete;
-					}
-				}
-			}// Target is TypedNode
-			else if (target instanceof TypedNode) {
-
-				TypedNode typedNode = (TypedNode) target;
-				// if Target is TypedNode and its a DecisionPoint - should be
-				// black.
-				if (typedNode.getType() == TypedNode.DECISION) {
-					return null;
-				}
-				// If Target is TypedNode and and Source is WorkBreakdownElement
-				// and readonly
-				// Link should be green.
-				if (source instanceof WorkBreakdownElementNode) {
-					// Check Target - is having any indirect(outgoing
-					// connnection) contains decision points.
-					if (checkSyncBarOutgoingLinks((TypedNode) target) == null)
-						return null;
-					if (source.isReadOnly())
-						return errMsg_CanNotDelete;
-				}
-				if (source instanceof TypedNode) {
-					TypedNode sourceTypedNode = (TypedNode) source;
-					// Source is Typed Node and its a decision point return
-					// null.
-					if (sourceTypedNode.getType() == TypedNode.DECISION) {
-						return null;
-					}
-					// if source is SyncBar and check all its incoming
-					// connections.
-					if (sourceTypedNode.getType() == TypedNode.SYNCH_BAR) {
-						return checkSyncBarIncomingLinks(sourceTypedNode);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public static String checkDelete(Node node) {
-		if (node.isReadOnly())
-			return errMsg_CanNotDelete;
-		Diagram diagram = node.getDiagram();
-		if (diagram instanceof ActivityDiagram) {
-			if (node instanceof TypedNode) {
-				Collection targetNodes = GraphicalDataHelper.getTargetNodes(
-						(TypedNode) node, WorkBreakdownElementNode.class);
-				for (Iterator iter = targetNodes.iterator(); iter.hasNext();) {
-					Node target = (Node) iter.next();
-					if (target.isReadOnly()) {
-						return errMsg_CanNotDelete;
-					}
-				}
-			}
-		} else if (diagram instanceof ActivityDetailDiagram) {
-			if (node instanceof RoleNode) {
-				return errMsg_CanNotDelete;
-			}
-		}
-		return null;
-	}
-
-	public static String checkReconnect(Node source, Node target, Link link) {
-		if (source.getDiagram() instanceof ActivityDiagram) {
-			if (link.getTarget() != null) {
-				if (link.getTarget().isReadOnly()) {
-					return errMsg_CanNotConnect;
-				} else {
-					if (link.getTarget() instanceof TypedNode) {
-						Collection targetNodes = GraphicalDataHelper
-								.getTargetNodes((TypedNode) link.getTarget(),
-										WorkBreakdownElementNode.class);
-						for (Iterator iter = targetNodes.iterator(); iter
-								.hasNext();) {
-							Node node = (Node) iter.next();
-							if (node.isReadOnly()) {
-								return errMsg_CanNotConnect;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		return checkConnect(source, target, link);
-	}
-
-	/*
-	 * Method will not allow multiple link between two nodes. Needs to call
-	 * CreakLinkCommand and ReconnectLinkCommand. Any action on a Link should
-	 * call this checkConnect(Node source, Node target, Link link) before allow
-	 * to connect.
-	 */
-	public static String checkConnect(Node source, Node target, Link link) {
-
-		if (source == target && !(source.getObject() instanceof Activity)) {
-			return errMsg_CanNotConnect;
-		}
-
-		List links = source.getOutgoingConnections();
-		if (links != null) {
-			// This is need for reconnect to same target node.
-			if (links.contains(link)) {
-				if (link.getTarget().equals(target)) {
-					return null;
-				}
-			}
-			// This is need for new connect and reconnect to different target
-			// node.
-			for (Iterator iter = links.iterator(); iter.hasNext();) {
-				Link linkx = (Link) iter.next();
-				Object linkxtarget = linkx.getTarget();
-				if (linkxtarget != null && linkxtarget.equals(target)) {
-					return errMsg_CanNotConnect;
-				}
-			}
-		}
-		return checkConnect(source, target);
-	}
-
-	/*
-	 * To avoid circular looping between synchronization bars. If SycnBar1 ->
-	 * SyncBar2 (connected) then SyncBar2 -> SyncBar1 cannot connect. if
-	 * syncbar1 -> syncbar2->syncbar3 then syncbar3 -> syncbar1 disallowed.
-	 * 
-	 */
-	public static String checkSyncBarCircularLooop(TypedNode sNode,
-			TypedNode tNode) {
-		List list = tNode.getOutgoingConnections();
-		if (!list.isEmpty() && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				Link link = (Link) iterator.next();
-				Node typednode = link.getTarget();
-				if (sNode.equals(typednode))
-					return errMsg_CanNotConnect;
-				if (typednode instanceof TypedNode) {
-					return checkSyncBarCircularLooop(sNode,
-							(TypedNode) typednode);
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * Method to Check if SyncBar inComming connections have any source is a
-	 * readonly. @return
-	 */
-	public static String checkSyncBarIncomingLinks(TypedNode typedNode) {
-		for (Iterator iter = typedNode.getIncomingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			Node source = link.getSource();
-			if (source instanceof WorkBreakdownElementNode) {
-				if (source.isReadOnly())
-					return errMsg_CanNotDelete;
-			} else if (source instanceof TypedNode) {
-				if (((TypedNode) source).getType() == TypedNode.SYNCH_BAR)
-					if (checkSyncBarIncomingLinks((TypedNode) source) != null)
-						return errMsg_CanNotDelete;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * Method to check if synchronization bar outgoing connection has any target
-	 * is readonly.
-	 */
-	public static String checkSyncBarOutgoingLinks(TypedNode typedNode) {
-		for (Iterator iter = typedNode.getOutgoingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			Node target = link.getTarget();
-			if (target instanceof WorkBreakdownElementNode) {
-				if (target.isReadOnly())
-					return errMsg_CanNotDelete;
-			} else if (target instanceof TypedNode) {
-				if (((TypedNode) target).getType() == TypedNode.SYNCH_BAR)
-					if (checkSyncBarOutgoingLinks((TypedNode) target) != null)
-						return errMsg_CanNotDelete;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Check to see link is readonly.
-	 */
-	public static boolean isReadOnly(Link link) {
-		Node target = link.getTarget();
-		Node source = link.getSource();
-		if (target != null && target.getDiagram() instanceof ActivityDiagram) {
-			return checkDelete(link) != null;
-		} else if (target != null
-				&& target.getDiagram() instanceof ActivityDetailDiagram) {
-			if ((source != null && source instanceof TaskNode && source
-					.isReadOnly())
-					|| (target instanceof TaskNode && target.isReadOnly()))
-				return true;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/package.html
deleted file mode 100644
index 2a98a6b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for the activity diagrams.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/AbstractDiagramGraphicalViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/AbstractDiagramGraphicalViewer.java
deleted file mode 100644
index 3afb86b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/AbstractDiagramGraphicalViewer.java
+++ /dev/null
@@ -1,306 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.viewer;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.SWTGraphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.authoring.gef.edit.DiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart;
-import org.eclipse.epf.authoring.gef.figures.SelectableLabel;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.diagram.DiagramInfo;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editparts.LayerManager;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-
-/**
- * The abstract base class for a graphical viewer of the element diagram.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public abstract class AbstractDiagramGraphicalViewer {
-
-	protected Composite parent;
-
-	protected GraphicalViewer graphicalViewer;
-
-	protected Object wrapper;
-
-	public AbstractDiagramGraphicalViewer(Composite parent) {
-		this.parent = parent;
-		createGraphicalViewer();
-	}
-
-	public AbstractDiagramGraphicalViewer(Composite parent, Object wrapper) {
-		this.parent = parent;
-		this.wrapper = wrapper;
-		createGraphicalViewer();
-	}
-	/**
-	 * Creates the GraphicalViewer on the specified <code>Composite</code>
-	 * 
-	 */
-	protected void createGraphicalViewer() {
-		this.graphicalViewer = new ScrollingGraphicalViewer();
-		this.graphicalViewer.createControl(parent);
-		configureGraphicalViewer();
-	}
-
-	/**
-	 * Returns the graphical viewer.
-	 * 
-	 * @return the graphical viewer
-	 */
-	protected GraphicalViewer getGraphicalViewer() {
-		return graphicalViewer;
-	}
-
-	protected void configureGraphicalViewer() {
-		getGraphicalViewer().getControl().setBackground(
-				ColorConstants.listBackground);
-		ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer();
-
-		ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart();
-		viewer.setRootEditPart(root);
-		viewer.setEditPartFactory(createEditPartFactory());
-	}
-
-	protected IFigure getFigure() {
-		GraphicalViewer viewer = getGraphicalViewer();
-
-		// find the figure to be saved
-		LayerManager lm = (LayerManager) viewer.getEditPartRegistry().get(
-				LayerManager.ID);
-		IFigure figure = lm.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		return figure;
-	}
-
-	protected void setSuppressionToDiagram(Diagram diagram) {
-		Object e = diagram.getObject();
-		if (e instanceof BreakdownElement) {
-			Process proc = TngUtil.getOwningProcess((BreakdownElement) e);
-			if (proc != null) {
-				diagram.setSuppression(Suppression.getSuppression(proc));
-			}
-		}
-	}
-
-	/**
-	 * Creates diagram for given object (only for {@link Activity} and packs the bounds.
-	 * 
-	 * @param wrapper 	{@link Object} 	
-	 * @param needReset boolean
-	 * @param filter 	{@link IFilter}
-	 * @param sup		{@link Suppression}
-	 */
-	public EditPart loadDiagram(Object wrapper, boolean needReset,
-			IFilter filter, Suppression sup) {
-		// initialize the viewer with the edit part
-		EditPart editPart = createEditPart(wrapper, filter, sup);
-		this.graphicalViewer.setContents(editPart);
-
-		// ask for immediate update of the control so that the diagram figure
-		// will be computed
-		parent.pack(true);
-
-		// This check is needed for browsing, in order to render activity contributing's
-		// children.  In processAuthoring we don't do realization, in order to displayed 
-		// realized elements, we have to cleanup ADD diagram and recreate. needtoReset or cleanupdiagram.
-		// Only for activity detail diagram.
-		Object o = TngUtil.unwrap(wrapper);
-		if(o instanceof VariabilityElement && getDiagramType() != null && 
-				getDiagramType().equalsIgnoreCase(ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL)){
-			if(TngUtil.hasContributor((VariabilityElement)o)){
-				needReset = true;
-			}
-		}
-		
-		if (needReset) {
-			cleanUpDiagram();
-		}
-
-		IFigure figure = getFigure();
-		if (figure != null) {
-			Rectangle bounds = figure.getBounds();
-
-			//System.out.println("Before update: Diagram Bounds = " + bounds); //$NON-NLS-1$
-			if (bounds.x < 0 || bounds.y < 0) {
-				((DiagramEditPart) editPart).moveFigure(-bounds.x, -bounds.y);
-
-				parent.pack(true);
-
-				bounds = figure.getBounds();
-				//System.out.println("After update: Diagram Bounds = " + bounds); //$NON-NLS-1$
-			}
-		}
-		return editPart;
-	}
-
-	protected void loadDiagramInfo(GraphicalEditPart part, DiagramInfo diagramInfo) {
-		List children = part.getChildren();
-		for (Iterator it = children.iterator(); it.hasNext();) {
-			Object o = it.next();
-			if (o instanceof NodeContainerEditPart) {
-				loadDiagramInfo((GraphicalEditPart) o, diagramInfo);
-			} else if (o instanceof GraphicalEditPart) {
-				part = (GraphicalEditPart) o;
-				Object model = part.getModel();
-				Object e = model;
-				if (e instanceof LinkedObject) {
-					e = ((LinkedObject) e).getObject();
-				}
-
-				if (e instanceof DiagramElement) {
-					continue;
-				}
-
-				if (e instanceof MethodElement) {
-					boolean suppressed;
-					if (model instanceof NamedNode) {
-						suppressed = ((NamedNode) model).isSuppressed();
-					} else {
-						suppressed = ((MethodElement) e).getSuppressed()
-								.booleanValue();
-					}
-
-						IFigure f = part.getFigure();
-						Rectangle bounds = f.getBounds();
-
-						String altTag = null;
-						if (f instanceof SelectableLabel) {
-							altTag = ((SelectableLabel) f).getText();
-						}
-						diagramInfo.addArea((MethodElement) e, bounds.x,
-							bounds.y, bounds.width, bounds.height, altTag, suppressed);
-
-				}
-			} else {
-				// System.out.println("EditPart not handled: " + o);
-				// //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * returns {@link DiagramInfo}
-	 * 
-	 */
-	public DiagramInfo getDiagramInfo() {
-		DiagramInfo diagramInfo = null;
-
-		GraphicalEditPart part = (GraphicalEditPart) this.graphicalViewer
-				.getContents();
-		Object element = part.getModel();
-		if (element instanceof LinkedObject) {
-			element = ((LinkedObject) element).getObject();
-		}
-		if (element instanceof MethodElement) {
-			diagramInfo = new DiagramInfo(getDiagramType(),
-					(MethodElement) element);
-			loadDiagramInfo(part, diagramInfo);
-		}
-
-		return diagramInfo;
-	}
-
-	/**
-	 * Creates diagram image from figure created in loadDiagram method.
-	 * 
-	 */
-	public Image createDiagramImage() {
-		IFigure figure = getFigure();
-
-		SWTGraphics graphics = null;
-		GC gc = null;
-		Image image = null;
-
-		try {
-			Rectangle bounds = figure.getBounds();
-			int height = bounds.height;
-			int width = bounds.width;
-
-			// create a new image and repaint the graph
-			final Display display = Display.getDefault();
-			image = new Image(display, width, height);
-			gc = new GC(image);
-			graphics = new SWTGraphics(gc);
-			figure.paint(graphics);
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		} finally {
-			// release resources
-			if (graphics != null)
-				graphics.dispose();
-			if (gc != null)
-				gc.dispose();
-		}
-
-		return image;
-	}
-
-	public void dispose() {
-		try {
-			if (graphicalViewer != null) {
-				Control ctrl = graphicalViewer.getControl();
-				if (ctrl != null) {
-					ctrl.dispose();
-				}
-
-				graphicalViewer = null;
-			}
-		} catch (RuntimeException e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	protected abstract EditPartFactory createEditPartFactory();
-
-	protected abstract EditPart createEditPart(Object e, IFilter filter,
-			Suppression sup);
-
-	protected abstract String getDiagramType();
-
-	protected void cleanUpDiagram() {
-		// default implementation does nothing
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDetailDiagramViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDetailDiagramViewer.java
deleted file mode 100644
index 170815d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDetailDiagramViewer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.viewer;
-
-import org.eclipse.epf.authoring.gef.edit.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.ActivityDetailDiagramEditPartFactory;
-import org.eclipse.epf.authoring.gef.edit.DiagramActionService;
-import org.eclipse.epf.authoring.gef.edit.DiagramUpdateService;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The graphical viewer for the ActivityDetail diagram.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ActivityDetailDiagramViewer extends AbstractDiagramGraphicalViewer {
-
-	public ActivityDetailDiagramViewer(Composite parent) {
-		super(parent);
-	}
-
-	protected EditPartFactory createEditPartFactory() {
-		return new ActivityDetailDiagramEditPartFactory();
-	}
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#createEditPart(java.lang.Object, org.eclipse.epf.library.edit.IFilter, org.eclipse.epf.library.edit.util.Suppression)
-	 */
-
-	protected EditPart createEditPart(Object e, IFilter filter, Suppression sup) {
-		ActivityDetailDiagram diagram = ModelFactory.eINSTANCE
-				.createActivityDetailDiagram();//
-		diagram.setFilter(filter);
-		if (sup != null) {
-			diagram.setSuppression(sup);
-		}
-
-		diagram.setObject(e);
-		EditPart part = new ActivityDetailDiagramEditPart(
-				(ActivityDetailDiagram) diagram);
-		part.setModel(diagram);
-		return part;
-	}
-
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#cleanUpDiagram()
-	 */
-	protected void cleanUpDiagram() {
-		ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-				.getContents();
-		dep.getRecentlyAddedParts().addAll(dep.getChildren());
-
-		// clean up the diagram
-		DefaultEditDomain editingDomain = new DefaultEditDomain(null);
-		ActionRegistry actionRegistry = new ActionRegistry();
-
-		DiagramActionService actionService = new DiagramActionService(
-				getGraphicalViewer(), editingDomain, actionRegistry);
-		actionService.registerVerticalAlignFirstSelectedAction();
-
-		DiagramUpdateService service = new DiagramUpdateService(
-				getGraphicalViewer(), editingDomain, actionRegistry);
-		service.cleanUpDiagram();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDiagramService.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDiagramService.java
deleted file mode 100644
index c4eae89..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDiagramService.java
+++ /dev/null
@@ -1,516 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.viewer;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.VariabilityInfo;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ProcessAdapterFactoryFilter;
-import org.eclipse.epf.library.layout.diagram.DiagramInfo;
-import org.eclipse.epf.library.layout.diagram.IActivityDiagramService;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.ImageLoader;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Provides service methods for creating diagram images for activity elements
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ActivityDiagramService implements IActivityDiagramService {
-
-	private Composite parent = null;
-
-	private Composite holder = null;
-
-	private File pubDir;
-
-	private static Map typeMap = new HashMap();
-
-	private DiagramInfo diagramInfo = null;
-
-	private boolean publishUncreatedADD = true;
-	
-	private boolean publishADForActivityExtension = true;
-
-	static {
-		typeMap.put(ResourceHelper.DIAGRAM_TYPE_WORKFLOW, new Integer(
-				IDiagramManager.ACTIVITY_DIAGRAM));
-		typeMap.put(ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL, new Integer(
-				IDiagramManager.ACTIVITY_DETAIL_DIAGRAM));
-		typeMap.put(ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY, new Integer(
-				IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM));
-	}
-
-	public static int getIntType(String diagramType) {
-		Integer type = (Integer) typeMap.get(diagramType);
-		if (type != null) {
-			return type.intValue();
-		}
-
-		return -1;
-	}
-
-	Shell shell = null;
-
-	public ActivityDiagramService() {
-		this(null, new File(LibraryService.getInstance().getCurrentMethodLibraryLocation()));
-	}
-
-	public ActivityDiagramService(File pubDir) {
-		this(null, pubDir);
-	}
-
-	public ActivityDiagramService(Composite parent, File pubDir) {
-		this.parent = parent;
-		this.pubDir = pubDir;
-	}
-
-	private AbstractDiagramGraphicalViewer getDiagramViewer(int diagramType) {
-		// if the shell window is distroyed, recreate it
-		if ((this.shell != null) && this.shell.isDisposed()) {
-			this.parent = null;
-			this.shell = null;
-		}
-
-		getViewerHolder(parent);
-
-		switch (diagramType) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return new ActivityDiagramViewer(holder);
-
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return new ActivityDetailDiagramViewer(holder);
-
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return new WPDependencyDiagramViewer(holder);
-			
-		default:
-			return null;
-		}
-	}
-
-	private void getViewerHolder(Composite parent) {
-		if (parent == null) {
-			if (shell == null || shell.isDisposed()) {
-				shell = createShell();
-			}
-			shell.open();
-			parent = shell;
-		}
-
-		if (holder != null) {
-			holder.dispose();
-		}
-
-		holder = new Composite(parent, SWT.NONE);
-		holder.setLayoutData(new GridData(1, 1)); // size can't be 0,0
-		// otherwise the diagram
-		// will not be painted
-		holder.setLayout(new GridLayout());
-		holder.setVisible(false);
-	}
-
-	private Shell createShell() {
-		Shell shell = null;
-		Display d = Display.getDefault();
-		shell = new Shell(d);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		shell.setLayout(layout);
-		shell.setBounds(0, 0, 0, 0);
-		shell.setVisible(false);
-		return shell;
-	}
-
-	public void dispose() {
-		if ((shell != null) && (!shell.isDisposed())) {
-			shell.close();
-			shell.dispose();
-		}
-	}
-
-	/**
-	 * save the element diagram image and returns the image file url.
-	 * 
-	 * @param wrapper
-	 * @param imgPath
-	 * @param diagramType
-	 * @param filter
-	 *            IFilter
-	 * @param sup
-	 *            Suppression
-	 * @return String the image path relative to the publishing dir
-	 * 
-	 * @see org.eclipse.epf.library.layout.diagram.IActivityDiagramService#saveDiagram(java.lang.Object, java.lang.String, java.lang.String, org.eclipse.epf.library.edit.IFilter, org.eclipse.epf.library.edit.util.Suppression)
-	 */
-	public DiagramInfo saveDiagram(final Object wrapper, final String imgPath, 
-			final String diagramType, final IFilter filter,
-			final Suppression sup) {
-		// initialize the diagramInfo
-		diagramInfo = null;
-
-		// grab the UI thread to avoid thread access error
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				__internal_saveDiagram(wrapper, imgPath, diagramType, filter, sup);
-			}
-		});
-
-		return diagramInfo;
-	}
-
-	private boolean hasUserDefinedDiagram(Activity e, String imgPath, String diagramType) throws Exception
-	{		
-		// if there is a user defined diagram, use it
-		org.eclipse.epf.diagram.model.util.DiagramInfo info = new org.eclipse.epf.diagram.model.util.DiagramInfo((Activity)e);
-		switch (getIntType(diagramType))
-		{
-			case IDiagramManager.ACTIVITY_DIAGRAM:
-				if ( info.canPublishADImage() )
-				{
-					return (info.getActivityDiagram() != null) && info.canPublishADImage();
-				}
-				break;
-	
-			case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-				if ( info.canPublishADDImage() )
-				{
-					return (info.getActivityDetailDiagram() != null) && info.canPublishADDImage();
-				}
-				break;
-							
-			case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-				if ( info.canPublishWPDImage() )
-				{
-					return (info.getWPDDiagram() != null ) && info.canPublishWPDImage();
-				}
-				break;
-
-			default:
-				break;
-		}
-		
-		return false;
-	}
-	
-	private void __internal_saveDiagram(Object wrapper, final String imgPath, String diagramType,
-			IFilter filter, Suppression sup) {
-		
-		if ( sup.isSuppressed(wrapper) ) {
-			return;
-		}
-		
-		Object o = TngUtil.unwrap(wrapper);
-		if (!(o instanceof Activity)) {
-			return;
-		}
-
-		//MethodElement e = (MethodElement)o;
-		Activity e = (Activity)o;
-		// DiagramInfo diagramInfo = null;
-		Image image = null;
-		int type = getIntType(diagramType);
-		if (type < 0) {
-			return;
-		}
-
-		AbstractDiagramGraphicalViewer viewer = null;
-
-		// keep the dirty flag and reset back to avoid make the library dirty
-		boolean dirtyFlag = e.eResource().isModified();
-
-		try {
-			if ( hasUserDefinedDiagram((Activity)e, imgPath, diagramType) )
-			{
-				return;
-			}
-
-
-			// first check if we need to generate the diagram or not
-			// if the diagram is supressed, don't generate diagram
-			// don't create the diagram if it's not there,
-			// id the diagram does not exist, it's supressed
-			org.eclipse.epf.uma.Diagram d = GraphicalDataManager.getInstance()
-					.getUMADiagram((Activity) e, type, false);
-
-			// Allow the option to publish 'uncreated' diagrams
-			// by default, uncreated activity detail diagrams will be published,
-			// uncreated diagrams of other types will not be published
-			boolean exist = (d != null);
-			if (exist) {
-				if (d.getSuppressed().booleanValue() == true)
-					return;
-				
-				// If an extension has its own diagram. Base is replaced or contributed. 
-				// extension diagram shows realized element in undefined location. 
-				// In publishing don't display extension diagram even if it has its own
-				// diagram if realized elements are coming in through variability.
-				if(type == GraphicalDataHelper.ACTIVITY_DIAGRAM &&
-						checkVariability(e, filter,type) != null){
-					return;
-				}
-					
-			}else{
-				
-				if((type == GraphicalDataHelper.WORK_PRODUCT_DEPENDENCY_DIAGRAM))
-					return;
-
-				// For Activity Diagram un opened extension publish.
-				if(type == GraphicalDataHelper.ACTIVITY_DIAGRAM){
-					// If option is not checked, don't generate a diagram
-					if(!publishADForActivityExtension) return;
-					
-					//If extension is modified don't generate it.
-					if(!e.getBreakdownElements().isEmpty())
-						return;
-					VariabilityElement calculatedBase = checkVariability(e, filter, type);
-					if(calculatedBase == null) {
-						return;
-					}	
-					
-					wrapper = calculatedBase;
-					e = (Activity)calculatedBase;
-					exist = true;
-				}
-				
-				if (publishUncreatedADD == false && type == GraphicalDataHelper.ACTIVITY_DETAIL_DIAGRAM){
-					boolean contributorexist = false;
-					// This is need, if contributor has a ADD diagra, base don't 
-					// base should generate ADD in browsing.
-					MethodConfiguration config = null;
-					if (filter instanceof ProcessAdapterFactoryFilter) {
-						config = ((ProcessAdapterFactoryFilter) filter)
-								.getMethodConfiguration();
-					}
-					if (config == null)
-						return;
-
-					// Get immediate contributors first, and check immediate contributors
-					// have anything extra breakdown elements.
-					List list = ConfigurationHelper.getContributors(e, config);
-					if(e instanceof Activity){
-						Iterator iterator = list.iterator();
-						if(iterator != null){
-							while(iterator.hasNext()){
-								Object act = iterator.next();
-								if(act != null){
-									org.eclipse.epf.uma.Diagram dx = GraphicalDataManager.getInstance()
-									.getUMADiagram((Activity) act, type, false);
-									if(dx != null){   
-										contributorexist = true;
-										break;
-									}
-								}
-							}
-						}
-					}
-					if(!contributorexist)
-					return;
-				}
-			}
-			
-			try {
-				viewer = getDiagramViewer(type);
-				viewer.loadDiagram(wrapper, !exist, filter, sup);
-				diagramInfo = viewer.getDiagramInfo();
-				if (diagramInfo != null && !diagramInfo.isEmpty()) {
-					image = viewer.createDiagramImage();
-					if (image != null) {
-						// save the image
-						File f = new File(pubDir, imgPath);
-
-						// make sure the file is created otherwise exception
-						File parent = f.getParentFile();
-						if (!parent.exists()) {
-							parent.mkdirs();
-						}
-
-						if (!f.exists()) {
-							f.createNewFile();
-						}
-						OutputStream os = new FileOutputStream(f);
-						ImageLoader loader = new ImageLoader();
-						loader.data = new ImageData[] { image.getImageData() };
-						loader.save(os, SWT.IMAGE_JPEG);
-
-						diagramInfo.setImageFilePath(imgPath);
-					} else {
-						System.out.println("Unable to create diagram image"); //$NON-NLS-1$
-					}
-				}
-			} catch (RuntimeException e1) {
-				e1.printStackTrace();
-			}
-
-			// delete the newly created diagram from the library
-			if (!exist) {
-				d = GraphicalDataManager.getInstance().getUMADiagram(
-						(Activity) e, type, false);
-				if (d != null) {
-					EcoreUtil.remove(d);
-				}
-			}
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		} finally {
-			try {
-
-				// restore the dirty flag
-				e.eResource().setModified(dirtyFlag);
-
-				if (viewer != null) {
-					viewer.dispose();
-				}
-				if (image != null) {
-					image.dispose();
-				}
-			} catch (RuntimeException e1) {
-				e1.printStackTrace();
-			}
-		}
-
-	}
-
-
-	private VariabilityElement checkVariability(VariabilityElement e, IFilter filter,
-			int type) {
-
-		MethodConfiguration config = null;
-		if (filter instanceof ProcessAdapterFactoryFilter) {
-			config = ((ProcessAdapterFactoryFilter) filter)
-					.getMethodConfiguration();
-		}
-		if (config == null)
-			return null;
-
-		// Get immediate contributors first, and check immediate contributors
-		// have anything extra breakdown elements.
-		List list = ConfigurationHelper.getContributors(e, config);
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object next = iterator.next();
-			if (next instanceof Activity) {
-				if (!((Activity) next).getBreakdownElements().isEmpty())
-					return null;
-			}
-		}
-
-		// Get all Contributors from parent chain and contributor chain for the
-		// element e.
-		VariabilityInfo eInfo = ((ProcessAdapterFactoryFilter) filter)
-				.getVariabilityInfo((VariabilityElement) e);
-		List contributors = eInfo.getContributors();
-
-		VariabilityElement ve = e.getVariabilityBasedOnElement();
-		if (ve == null) {
-			return null;
-		}
-		
-		Activity replacer = (Activity) ConfigurationHelper.getReplacer(ve,
-				config);
-		if (replacer != null) {
-			ve = replacer;
-			org.eclipse.epf.uma.Diagram replacerDiagram = GraphicalDataManager
-					.getInstance().getUMADiagram(replacer, type, false);
-			if (replacerDiagram != null) {
-				//anyReplacer.add(replacer);
-				return replacer;
-			} else {
-				return null;
-			}
-		} else {
-			org.eclipse.epf.uma.Diagram baseDiagram = GraphicalDataManager
-					.getInstance()
-					.getUMADiagram((Activity) ve, type, false);
-			if (baseDiagram != null) {
-				
-				// Check first if baseDiagram is suppressed.
-				if (baseDiagram.getSuppressed().booleanValue() == true)
-					return null;
-				
-				// Find the contributors of Base
-				VariabilityInfo veInfo = ((ProcessAdapterFactoryFilter) filter)
-						.getVariabilityInfo((VariabilityElement) ve);
-				List veContributors = veInfo.getContributors();
-				if (contributors.size() != veContributors.size()) {
-					for (Iterator iterator = contributors.iterator(); iterator
-							.hasNext();) {
-						Object next = iterator.next();
-						if (!veContributors.contains(next)) {
-							if (!((Activity) next).getBreakdownElements()
-									.isEmpty()) {
-								return null;
-							}
-						}
-					}
-				}
-				
-				return ve;
-				
-			}else{
-				// If no base diagram, check base of base had any diagram.
-				return checkVariability(ve, filter, type);
-			}
-		}
-		
-	}
-
-	/**
-	 * Set the window's preference attribute for Activity Detail Diagram.
-	 * 
-	 */
-	public void setPublishedUnCreatedADD(boolean flag) {
-		this.publishUncreatedADD = flag;
-	}
-	/**
-	 * Set the window's preference attribute for Acitivyt Diagram
-	 * 
-	 */
-	
-	public void setPublishADForActivityExtension(boolean flag){
-		this.publishADForActivityExtension = flag;
-	}
-
-	public Activity getRealizedForUnmodified(Object activity, IFilter filter, Suppression suppression) {
-		// Does nothing, just interface implementation.
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDiagramViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDiagramViewer.java
deleted file mode 100644
index 8fa15e8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/ActivityDiagramViewer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.viewer;
-
-import org.eclipse.epf.authoring.gef.edit.ActivityDiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.ActivityDiagramEditPartFactory;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The graphical viewer for the Activity diagram.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ActivityDiagramViewer extends AbstractDiagramGraphicalViewer {
-
-	public ActivityDiagramViewer(Composite parent) {
-		super(parent);
-	}
-
-	protected EditPartFactory createEditPartFactory() {
-		return new ActivityDiagramEditPartFactory();
-	}
-
-	protected EditPart createEditPart(Object e, IFilter filter, Suppression sup) {
-		ActivityDiagram diagram = ModelFactory.eINSTANCE
-				.createActivityDiagram();
-		diagram.setFilter(filter);
-		if (sup != null) {
-			diagram.setSuppression(sup);
-		}
-
-		diagram.setObject(e);
-		EditPart part = new ActivityDiagramEditPart(diagram);
-		part.setModel(diagram);
-		return part;
-	}
-
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/WPDependencyDiagramViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/WPDependencyDiagramViewer.java
deleted file mode 100644
index 7d7a98a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/WPDependencyDiagramViewer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.gef.viewer;
-
-import org.eclipse.epf.authoring.gef.edit.DiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.WPDiagramEditPartFactory;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The graphical viewer for the WP Dependency diagram.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class WPDependencyDiagramViewer extends AbstractDiagramGraphicalViewer {
-
-	public WPDependencyDiagramViewer(Composite parent) {
-		super(parent);
-
-	}
-
-	protected EditPartFactory createEditPartFactory() {
-		return new WPDiagramEditPartFactory();
-	}
-
-	protected EditPart createEditPart(Object e, IFilter filter, Suppression sup) {
-		WorkProductDependencyDiagram diagram = ModelFactory.eINSTANCE
-				.createWorkProductDependencyDiagram();
-		diagram.setFilter(filter);
-		if (sup != null) {
-			diagram.setSuppression(sup);
-		}
-
-		diagram.setObject(e);
-		EditPart part = new DiagramEditPart(diagram);
-		part.setModel(diagram);
-		return part;
-	}
-
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/package.html
deleted file mode 100644
index 4a2e324..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/gef/viewer/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides graphical viewers for the activity diagrams.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringPerspective.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringPerspective.java
deleted file mode 100644
index 5f43dc1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringPerspective.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.views.ConfigurationView;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.authoring.ui.wizards.NewConfigurationWizard;
-import org.eclipse.epf.authoring.ui.wizards.NewLibraryWizard;
-import org.eclipse.epf.authoring.ui.wizards.NewPluginWizard;
-import org.eclipse.epf.ui.wizards.WizardCategories;
-import org.eclipse.search.ui.NewSearchUI;
-import org.eclipse.ui.IFolderLayout;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IPlaceholderFolderLayout;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.console.IConsoleConstants;
-import org.eclipse.ui.progress.IProgressConstants;
-import org.eclipse.ui.wizards.IWizardCategory;
-import org.eclipse.ui.wizards.IWizardDescriptor;
-import org.eclipse.ui.wizards.IWizardRegistry;
-
-/**
- * The Method Authoring perspective.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class AuthoringPerspective implements IPerspectiveFactory {
-
-	/**
-	 * The Authoring perspective ID.
-	 */
-	public static final String PERSPECTIVE_ID = AuthoringPerspective.class
-			.getName();
-
-	private static List<String> newWizardShortcuts = new ArrayList<String>();
-
-	static {
-		newWizardShortcuts.add(NewLibraryWizard.WIZARD_ID);
-		newWizardShortcuts.add(NewPluginWizard.WIZARD_ID);
-		newWizardShortcuts.add(NewConfigurationWizard.WIZARD_ID);
-	}
-
-	/**
-	 * Opens this perspective.
-	 * 
-	 * @return the previously active perspective
-	 */
-	public static IPerspectiveDescriptor open() {
-		IWorkbenchPage activePage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		if (activePage != null) {
-			IPerspectiveRegistry registry = PlatformUI.getWorkbench()
-					.getPerspectiveRegistry();
-			IPerspectiveDescriptor oldPerspective = activePage.getPerspective();
-			if (!oldPerspective.getId().equals(PERSPECTIVE_ID)) {
-				IPerspectiveDescriptor perspective = registry
-						.findPerspectiveWithId(PERSPECTIVE_ID);
-				activePage.setPerspective(perspective);
-			}
-			return oldPerspective;
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		layout.setEditorAreaVisible(true);
-		String editorArea = layout.getEditorArea();
-		IFolderLayout topLeftFolder = layout.createFolder("topLeft", //$NON-NLS-1$
-				IPageLayout.LEFT, 0.30f, editorArea);
-
-		IFolderLayout bottomLeftFolder = layout.createFolder("bottomLeft", //$NON-NLS-1$
-				IPageLayout.BOTTOM, 0.50f, "topLeft"); //$NON-NLS-1$
-
-		topLeftFolder.addView(LibraryView.VIEW_ID);
-		bottomLeftFolder.addView(ConfigurationView.VIEW_ID);
-
-		IPlaceholderFolderLayout outputFolder = layout.createPlaceholderFolder(
-				"bottom", IPageLayout.BOTTOM, 0.65f, editorArea); //$NON-NLS-1$
-		outputFolder.addPlaceholder(IPageLayout.ID_PROP_SHEET);
-		outputFolder.addPlaceholder(IPageLayout.ID_PROBLEM_VIEW);
-		outputFolder.addPlaceholder(NewSearchUI.SEARCH_VIEW_ID);
-		outputFolder.addPlaceholder(IConsoleConstants.ID_CONSOLE_VIEW);
-		outputFolder.addPlaceholder(IPageLayout.ID_BOOKMARKS);
-		outputFolder.addPlaceholder(IProgressConstants.PROGRESS_VIEW_ID);
-
-		layout.addNewWizardShortcut(NewLibraryWizard.WIZARD_ID);
-		layout.addNewWizardShortcut(NewPluginWizard.WIZARD_ID);
-		layout.addNewWizardShortcut(NewConfigurationWizard.WIZARD_ID);
-
-		IWizardRegistry newWizardRegistry = PlatformUI.getWorkbench()
-				.getNewWizardRegistry();
-		IWizardCategory newWizardCategory = newWizardRegistry
-				.findCategory(WizardCategories.NEW_WIZARDS_CATEGORY);
-		IWizardDescriptor[] wizardDescriptors = newWizardCategory.getWizards();
-		for (int i = 0; i < wizardDescriptors.length; i++) {
-			IWizardDescriptor wizardDescriptor = wizardDescriptors[i];
-			String wizardId = wizardDescriptor.getId();
-			if (!newWizardShortcuts.contains(wizardId)) {
-				layout.addNewWizardShortcut(wizardId);
-			}
-		}
-
-		PerspectiveListUtil.addPerspectiveShortList(layout);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIHelpContexts.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIHelpContexts.java
deleted file mode 100644
index 1f43d4e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIHelpContexts.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-/**
- * Authoring UI help contexts
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- *
- */
-public class AuthoringUIHelpContexts {
-
-	private final static String ROOT_CONTEXT = AuthoringUIHelpContexts.class.getPackage().getName() + ".";  //$NON-NLS-1$
-	
-	public final static String  FILE_NEW_LIBRARY_CONTEXT = ROOT_CONTEXT +  "file_new_library_context"; //$NON-NLS-1$ 
-	public final static String	FILE_NEW_PLUGIN_CONTEXT = ROOT_CONTEXT +  "file_new_plugin_context"; //$NON-NLS-1$
-	public final static String	FILE_NEW_CONFIGURATION_CONTEXT = ROOT_CONTEXT +  "file_new_configuration_context"; //$NON-NLS-1$  
-	public final static String  FILE_OPEN_LIBRARY_CONTEXT = ROOT_CONTEXT +  "file_open_library_context"; //$NON-NLS-1$
-	public final static String  FILE_OPEN_CONFIGURATION_CONTEXT = ROOT_CONTEXT +  "file_open_configuration_context"; //$NON-NLS-1$
-	public final static String  FILE_IMPORT_CONTEXT = ROOT_CONTEXT + "file_import_context"; //$NON-NLS-1$
-	public final static String  FILE_EXPORT_CONTEXT = ROOT_CONTEXT + "file_export_context"; //$NON-NLS-1$
-	public final static String  LIBRARY_NAVIGATOR_VIEW_CONTEXT = ROOT_CONTEXT +  "library_navigator_view_context"; //$NON-NLS-1$  
-	public final static String  CONFIGURATION_VIEW_CONTEXT = ROOT_CONTEXT +  "configuration_view_context"; //$NON-NLS-1$  
-	public final static String  PLUGIN_EDITOR_DESCRIPTION_ALL_CONTEXT = ROOT_CONTEXT +  "plugin_editor_description_all_context"; //$NON-NLS-1$  
-	public final static String  CONFIGURATION_EDITOR_ALL_CONTEXT = ROOT_CONTEXT +  "configuration_editor_all_context"; //$NON-NLS-1$  
-	public final static String  CONTENT_PACKAGE_EDITOR_ALL_CONTEXT = ROOT_CONTEXT +  "content_package_editor_all_context"; //$NON-NLS-1$  
-	public final static String  EDITOR_ROLE_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_role_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_TASK_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_task_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_WORK_PRODUCT_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_work_product_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_GUIDANCE_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_guidance_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_DISCIPLINE_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_discipline_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_DISCIPLINE_GROUPING_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_discipline_grouping_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_DOMAIN_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_domain_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_WORK_PRODUCT_TYPE_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_work_product_type_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_ROLE_SET_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_role_set_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_ROLSE_SET_GROUPING_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_rolse_set_grouping_context_help_ID"; //$NON-NLS-1$  
-	public final static String  EDITOR_TOOL_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_tool_context_help_ID"; //$NON-NLS-1$ 
-	public final static String  EDITOR_CUSTOM_CATEGORY_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_custom_category_context_help_ID" ; //$NON-NLS-1$ 
-	public final static String  FORM_EDITOR_DESCRIPTION_GENERAL_CONTEXT = ROOT_CONTEXT +  "form_editor_description_general_context" ; //$NON-NLS-1$ 
-	public final static String  FORM_EDITOR_DESCRIPTION_DETAIL_CONTEXT = ROOT_CONTEXT +  "form_editor_description_detail_context"  ; //$NON-NLS-1$
-	public final static String  FORM_EDITOR_DESCRIPTION_NOTATION_CONTEXT = ROOT_CONTEXT +  "form_editor_description_notation_context"  ; //$NON-NLS-1$
-	public final static String  FORM_EDITOR_DESCRIPTION_TAILORING_CONTEXT = ROOT_CONTEXT +  "form_editor_description_tailoring_context" ; //$NON-NLS-1$ 
-	public final static String  FORM_EDITOR_DESCRIPTION_VERSION_CONTEXT = ROOT_CONTEXT +  "form_editor_description_version_context" ; //$NON-NLS-1$ 
-	public final static String  FORM_EDITOR_DESCRIPTION_ELEMENT_CONTEXT = ROOT_CONTEXT +  "form_editor_description_element_context" ; //$NON-NLS-1$ 
-	public final static String  FORM_EDITOR_DESCRIPTION_ICON_CONTEXT = ROOT_CONTEXT +  "form_editor_description_icon_context" ; //$NON-NLS-1$ 
-	public final static String  EDITOR_CP_DESCRIPTION_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_cp_description_context_help_ID" ; //$NON-NLS-1$ 
-	public final static String  EDITOR_DP_DESCRIPTION_CONTEXT_HELP_ID = ROOT_CONTEXT +  "editor_dp_description_context_help_ID" ; //$NON-NLS-1$ 
-	public final static String  FORM_EDITOR_PROCESS_WBS_CONTEXT = ROOT_CONTEXT +  "form_editor_process_wbs_context"  ; //$NON-NLS-1$
-	public final static String  FORM_EDITOR_PROCESS_OBS_CONTEXT = ROOT_CONTEXT +  "form_editor_process_obs_context" ; //$NON-NLS-1$ 
-	public final static String  FORM_EDITOR_PROCESS_PBS_CONTEXT = ROOT_CONTEXT +  "form_editor_process_pbs_context"  ; //$NON-NLS-1$
-	public final static String  FORM_EDITOR_PROCESS_ALLBS_CONTEXT = ROOT_CONTEXT + "form_editor_process_allbs_context"; //$NON-NLS-1$
-	public final static String  CONFIGURATION_PUBLISH_WIZARD_ALL_PAGES_CONTEXT = ROOT_CONTEXT +  "configuration_publish_wizard_all_pages_context" ; //$NON-NLS-1$ 
-	public final static String  RICH_TEXT_EDITOR_CONTEXT_ID = ROOT_CONTEXT +  "rich_text_editor_context_ID"  ; //$NON-NLS-1$
-	public final static String  FORM_EDITOR_ACTIVITY_DIAGRAM_CONTEXT = ROOT_CONTEXT + "form_editor_activity_diagram_context"; //$NON-NLS-1$
-	public final static String  FORM_EDITOR_ACTIVITY_DETAIL_DIAGRAM_CONTEXT = ROOT_CONTEXT +"form_editor_activity_detail_diagram_context";//$NON-NLS-1$
-	public final static String  FORM_EDITOR_WP_DEPENDENCY_DIAGRAM_CONTEXT = ROOT_CONTEXT + "form_editor_wp_dependency_diagram_context";//$NON-NLS-1$
-	public final static String  LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED = ROOT_CONTEXT + "library_view_node_context_not_implemented"; //$NON-NLS-1$
-	public static final String  LAYOUT_FLAT_ACTION = ROOT_CONTEXT + "layout_flat_action"; 	 //$NON-NLS-1$
-	public static final String  LAYOUT_HIERARCHICAL_ACTION = ROOT_CONTEXT + "layout_hierarchical_action"; 	 //$NON-NLS-1$	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIImages.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIImages.java
deleted file mode 100644
index bdbbb9f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIImages.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Shared images used in the Authoring UI.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AuthoringUIImages {
-
-	public static final String IMG_NAME_COLLAPSED = "full/obj16/Collapsed.gif"; //$NON-NLS-1$ 	
-
-	public static final String IMG_NAME_EXPANDED = "full/obj16/Expanded.gif"; //$NON-NLS-1$
-
-	public static final String IMG_NAME_REFRESH = "full/etool16/Refresh.gif"; //$NON-NLS-1$ 	
-
-	public static final String IMG_NAME_STOP = "full/etool16/Stop.gif"; //$NON-NLS-1$
-
-	public static final String IMG_NAME_PRINT = "full/etool16/Print.gif"; //$NON-NLS-1$
-	
-	public static final String IMG_NAME_OVR_ERROR = "full/ovr16/error_ovr.gif"; //$NON-NLS-1$
-	
-	public static final String IMG_NAME_LAYOUT_FLAT = "full/etool16/flatLayout.gif"; //$NON-NLS-1$
-
-	public static final String IMG_NAME_LAYOUT_HIERARCHICAL = "full/etool16/hierarchicalLayout.gif"; //$NON-NLS-1$
-
-	public static final ImageDescriptor IMG_DESC_COLLAPSED = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_COLLAPSED);
-
-	public static final ImageDescriptor IMG_DESC_EXPANDED = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_EXPANDED);
-
-	public static final ImageDescriptor IMG_DESC_REFRESH = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_REFRESH);
-
-	public static final ImageDescriptor IMG_DESC_STOP = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_STOP);
-
-	public static final ImageDescriptor IMG_DESC_PRINT = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_PRINT);
-	
-	public static final ImageDescriptor IMG_DESC_OVR_ERROR = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_OVR_ERROR);
-
-	public static final ImageDescriptor IMG_DESC_LAYOUT_FLAT = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_LAYOUT_FLAT);
-	
-	public static final ImageDescriptor IMG_DESC_LAYOUT_HIERARCHICAL = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(IMG_NAME_LAYOUT_HIERARCHICAL);
-
-	public static final Image IMG_BACK = PlatformUI.getWorkbench()
-			.getSharedImages().getImage(ISharedImages.IMG_TOOL_BACK);
-
-	public static final Image IMG_COLLAPSED = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_COLLAPSED);
-
-	public static final Image IMG_EXPANDED = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_EXPANDED);
-
-	public static final Image IMG_FORWARD = PlatformUI.getWorkbench()
-			.getSharedImages().getImage(ISharedImages.IMG_TOOL_FORWARD);
-
-	public static final Image IMG_REFRESH = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_REFRESH);
-
-	public static final Image IMG_STOP = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_STOP);
-
-	public static final Image IMG_PRINT = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_PRINT);
-	
-	public static final Image IMG_OVR_ERROR = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_OVR_ERROR);
-
-	public static final Image IMG_LAYOUT_FLAT = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_LAYOUT_FLAT);
-
-	public static final Image IMG_LAYOUT_HIERARCHICAL = AuthoringUIPlugin.getDefault()
-			.getSharedImage(IMG_NAME_LAYOUT_HIERARCHICAL);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIPlugin.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIPlugin.java
deleted file mode 100644
index ea11cf1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIPlugin.java
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import org.eclipse.epf.authoring.ui.internal.ImageDescriptorRegistry;
-import org.eclipse.epf.authoring.ui.internal.ProblemMarkerManager;
-import org.eclipse.epf.authoring.ui.preferences.LibraryViewPrefPage;
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Authoring UI plug-in class.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class AuthoringUIPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static AuthoringUIPlugin plugin;
-
-	private ProblemMarkerManager fProblemMarkerManager;
-	private ImageDescriptorRegistry fImageDescriptorRegistry;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AuthoringUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		
-		// Initialize the Authoring UI service.
-		AuthoringUIService.getInstance().start();
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-	
-	@Override
-	protected void init(BundleContext context) throws Exception {
-		super.init(context);
-		
-		LibraryViewPrefPage.initDefaults(getDefault().getPreferenceStore());
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static AuthoringUIPlugin getDefault() {
-		return plugin;
-	}
-	
-	public synchronized ProblemMarkerManager getProblemMarkerManager() {
-		if (fProblemMarkerManager == null)
-			fProblemMarkerManager= new ProblemMarkerManager();
-		return fProblemMarkerManager;
-	}
-	
-	public static ImageDescriptorRegistry getImageDescriptorRegistry() {
-		return getDefault().internalGetImageDescriptorRegistry();
-	}
-
-	private synchronized ImageDescriptorRegistry internalGetImageDescriptorRegistry() {
-		if (fImageDescriptorRegistry == null)
-			fImageDescriptorRegistry= new ImageDescriptorRegistry();
-		return fImageDescriptorRegistry;
-	}
-	
-	public static void log(Throwable t) {
-		getDefault().getLogger().logError(t);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
deleted file mode 100644
index bc27915..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
+++ /dev/null
@@ -1,1965 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Authoing UI resources
- * 
- * @author Lokanath Jagga
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public final class AuthoringUIResources extends NLS {
-
-	private static String BUNDLE_NAME = AuthoringUIResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private AuthoringUIResources() {
-		// Do not instantiate.
-	}
-
-	public static String ConfigurationOrderDialog_description;
-
-	public static String ConfigurationOrderDialog_NavigationViews;
-
-	public static String editor_error_activated_outofsync_title;
-
-	public static String editor_error_activated_outofsync_message;
-
-	public static String assignPage_title;
-
-	public static String categoriesPage_title;
-
-	public static String deliverablePartsPage_title;
-
-	public static String descriptionPage_title;
-
-	public static String disciplinesPage_title;
-
-	public static String discardunresolvedref;
-
-	public static String guidancePage_title;
-
-	public static String ItemsFilterDialog_UpdateTreeJob_name;
-
-	public static String NewDiagramFile_title;
-
-	public static String previewPage_title;
-
-	public static String promptCreateNewDiagramFile_msg;
-
-	public static String promptDeleteCustomCategoryBeforeRemoveLastRefToIt;
-
-	public static String referencesPage_title;
-
-	public static String reference_text;
-
-	public static String referenceWorkflowPage_title;
-
-	public static String rolesPage_title;
-
-	public static String roleSetsPage_title;
-
-	public static String stepsPage_title;
-
-	public static String tasksPage_title;
-
-	public static String toolMentorsPage_title;
-
-	public static String workProductsPage_title;
-
-	public static String checkItemsSection_name;
-
-	public static String checkItemsSection_desc;
-
-	public static String dependenciesSection_name;
-
-	public static String dependenciesSection_desc;
-
-	public static String detailSection_name;
-
-	public static String detailSection_desc;
-
-	public static String generalInfoSection_name;
-
-	public static String generalInfoSection_desc;
-
-	public static String iconSection_name;
-
-	public static String iconSection_desc;
-
-	public static String notationSection_name;
-
-	public static String notationSection_desc;
-
-	public static String referencedPluginsSection_name;
-
-	public static String referencedPluginsSection_desc;
-
-	public static String staffingSection_name;
-
-	public static String staffingSection_desc;
-
-	public static String stepsSection_name;
-
-	public static String stepsSection_desc;
-
-	public static String tailoringSection_name;
-
-	public static String tailoringSection_desc;
-
-	public static String variabilitySection_name;
-
-	public static String variabilitySection_desc;
-
-	public static String versionInfoSection_name;
-
-	public static String versionInfoSection_desc;
-
-	public static String additionalInfo_text;
-
-	public static String application_text;
-
-	public static String actionLabel_edit;
-
-	public static String actionLabel_findElementInLibNav;
-
-	public static String alternatives_text;
-
-	public static String assignmentApproaches_text;
-
-	public static String authors_text;
-
-	public static String background_text;
-
-	public static String baseElement_text;
-
-	public static String baseGuidance_text;
-
-	public static String briefDescription_text;
-
-	public static String description_text;
-
-	public static String backupbeforesave_text;
-
-	public static String briefOutline_text;
-
-	public static String changeDate_text;
-
-	public static String changeDescription_text;
-
-	public static String checkItems_text;
-
-	public static String contributes_text;
-
-	public static String localContributes_text;
-
-	public static String contributes_to_text;
-
-	public static String copyright_text;
-
-	public static String editor_text;
-
-	public static String extends_text;
-
-	public static String extend_text;
-
-	public static String externalDescription_text;
-
-	public static String externalId_text;
-
-	public static String goals_text;
-
-	public static String impactOfNotHaving_text;
-
-	public static String keyConsiderations_text;
-
-	public static String levelsOfAdoption_text;
-
-	public static String mainDescription_text;
-
-	public static String newElement_text;
-
-	public static String name_text;
-
-	public static String notApplicable_text;
-
-	public static String notation_text;
-
-	public static String packagingGuidance_text;
-
-	public static String presentationName_text;
-
-	public static String promptforlibary_text;
-
-	public static String enableHealthCheck_text;
-
-	public static String problem_text;
-
-	public static String purpose_text;
-
-	public static String reasonForNotNeeding_text;
-
-	public static String replaces_text;
-
-	public static String localReplaces_text;
-
-	public static String extendsReplaces_text;
-
-	public static String representationOptions_text;
-
-	public static String representation_text;
-
-	public static String attachedFile_text;
-
-	public static String skills_text;
-
-	public static String steps_text;
-
-	public static String steps_name_text;
-
-	public static String stop_text;
-
-	public static String print_text;
-
-	public static String synonyms_text;
-
-	public static String type_text;
-
-	public static String copy_text;
-
-	public static String deepCopy_text;
-
-	public static String back_text;
-
-	public static String new_plugin;
-
-	public static String move;
-
-	public static String uniqueId_text;
-
-	public static String variabilityType_text;
-
-	public static String version_text;
-
-	public static String addButton_text;
-
-	public static String attachButton_text;
-	
-	public static String attachUrlButton_text;
-	
-	public static String browseButton_text;
-
-	public static String changeTypeButton_text;
-
-	public static String clearButton_text;
-
-	public static String deleteButton_text;
-
-	public static String detachButton_text;
-
-	public static String diagram_saveError;
-
-	public static String downButton_text;
-
-	public static String directory_text;
-
-	public static String orderButton_text;
-
-	public static String editButton_text;
-
-	public static String removeButton_text;
-
-	public static String renameAction_text;
-
-	public static String remove_text;
-
-	public static String rename_text;
-
-	public static String SaveAs_text;
-
-	public static String selectButton_text;
-
-	public static String deselectButton_text;
-
-	public static String upButton_text;
-
-	public static String makeDefaultButton_text;
-
-	public static String viewHistoryButton_text;
-
-	public static String roleTasksPage_sectionName;
-
-	public static String roleTasksPage_sectionDescription;
-
-	public static String roleTasksPage_availableLabel;
-
-	public static String roleTasksPage_selectedLabel;
-
-	public static String roleTasksPage_selectedLabel2;
-
-	public static String roleTasksPage_multipleSelectDescription;
-
-	public static String roleWorkProductsPage_sectionName;
-
-	public static String roleWorkProductsPage_sectionDescription;
-
-	public static String roleWorkProductsPage_availableLabel;
-
-	public static String roleWorkProductsPage_selectedLabel;
-
-	public static String roleWorkProductsPage_selectedLabel2;
-
-	public static String roleWorkProductsPage_multipleSelectDescription;
-
-	public static String roleGuidancePage_sectionName;
-
-	public static String roleGuidancePage_sectionDescription;
-
-	public static String roleGuidancePage_availableLabel;
-
-	public static String roleGuidancePage_selectedLabel;
-
-	public static String roleGuidancePage_multipleSelectDescription;
-
-	public static String roleCategoriesPage_sectionName;
-
-	public static String roleCategoriesPage_sectionDescription;
-
-	public static String roleCategoriesPage_availableLabel;
-
-	public static String roleCategoriesPage_availableLabel2;
-
-	public static String roleCategoriesPage_selectedLabel;
-
-	public static String roleCategoriesPage_selectedLabel2;
-
-	public static String taskRolesPage_sectionName;
-
-	public static String taskRolesPage_sectionDescription;
-
-	public static String taskRolesPage_availableLabel;
-
-	public static String taskRolesPage_selectedLabel;
-
-	public static String taskRolesPage_selectedLabel2;
-
-	public static String taskRolesPage_multipleSelectDescription;
-
-	public static String taskRolesPage_primaryPerformer_modify_message;
-
-	public static String taskRolesPage_confirm_title;
-
-	public static String taskWorkProductsPage_sectionName;
-
-	public static String taskWorkProductsPage_sectionDescription;
-
-	public static String taskWorkProductsPage_availableLabel;
-
-	public static String taskWorkProductsPage_selectedLabel;
-
-	public static String taskWorkProductsPage_selectedLabel2;
-
-	public static String taskWorkProductsPage_selectedLabel3;
-
-	public static String taskWorkProductsPage_multipleSelectDescription;
-
-	public static String taskGuidancePage_sectionName;
-
-	public static String taskGuidancePage_sectionDescription;
-
-	public static String taskGuidancePage_availableLabel;
-
-	public static String taskGuidancePage_selectedLabel;
-
-	public static String taskGuidancePage_multipleSelectDescription;
-
-	public static String taskCategoriesPage_sectionName;
-
-	public static String taskCategoriesPage_sectionDescription;
-
-	public static String taskCategoriesPage_availableLabel;
-
-	public static String taskCategoriesPage_availableLabel2;
-
-	public static String taskCategoriesPage_selectedLabel;
-
-	public static String taskCategoriesPage_selectedLabel2;
-
-	public static String MarkerResolutionGenerator_removeUnresolvedReference;
-
-	public static String MarkerResolutionGenerator_showOwnerInLibraryView;
-
-	public static String ConfigurationMarkerResolutionGenerator_resolveMissingReference;
-
-	public static String WorkProduct_Tasks_SectionName;
-
-	public static String WorkProduct_Tasks_SectionDescription;
-
-	public static String WorkProduct_Tasks_AvailableLabel;
-
-	public static String WorkProduct_Tasks_SelectedLabel;
-
-	public static String WorkProduct_Tasks_SelectedLabel2;
-
-	public static String WorkProduct_Tasks_SelectedLabel3;
-
-	public static String WorkProduct_Tasks_MultipleSelectDescription;
-
-	public static String workProductRolesPage_sectionName;
-
-	public static String workProductRolesPage_sectionDescription;
-
-	public static String workProductRolesPage_availableLabel;
-
-	public static String workProductRolesPage_selectedLabel;
-
-	public static String workProductRolesPage_selectedLabel2;
-
-	public static String workProductRolesPage_multipleSelectDescription;
-
-	public static String workProductDeliverablePartsPage_sectionName;
-
-	public static String workProductDeliverablePartsPage_sectionDescription;
-
-	public static String workProductDeliverablePartsPage_availableLabel;
-
-	public static String workProductDeliverablePartsPage_selectedLabel;
-
-	public static String workProductDeliverablePartsPage_multipleSelectDescription;
-
-	public static String workProductGuidancePage_sectionName;
-
-	public static String workProductGuidancePage_sectionDescription;
-
-	public static String workProductGuidancePage_availableLabel;
-
-	public static String workProductGuidancePage_selectedLabel;
-
-	public static String workProductGuidancePage_multipleSelectDescription;
-
-	public static String workProductCategoriesPage_sectionName;
-
-	public static String workProductCategoriesPage_sectionDescription;
-
-	public static String workProductCategoriesPage_availableLabel;
-
-	public static String workProductCategoriesPage_availableLabel2;
-
-	public static String workProductCategoriesPage_availableLabel3;
-
-	public static String workProductCategoriesPage_selectedLabel;
-
-	public static String workProductCategoriesPage_selectedLabel2;
-
-	public static String workProductCategoriesPage_selectedLabel3;
-
-	public static String practiceReferencesPage_sectionName;
-
-	public static String practiceReferencesPage_sectionDescription;
-
-	public static String practiceReferencesPage_availableLabel;
-
-	public static String practiceReferencesPage_selectedLabel;
-
-	public static String practiceReferencesPage_multipleSelectDescription;
-
-	public static String categoryGuidancesPage_sectionName;
-
-	public static String categoryGuidancesPage_sectionDescription;
-
-	public static String categoryGuidancesPage_availableLabel;
-
-	public static String categoryGuidancesPage_selectedLabel;
-
-	public static String categoryGuidancesPage_multipleSelectDescription;
-
-	public static String disciplineGroupingDisciplinesPage_sectionName;
-
-	public static String disciplineGroupingDisciplinesPage_sectionDescription;
-
-	public static String disciplineGroupingDisciplinesPage_availableLabel;
-
-	public static String disciplineGroupingDisciplinesPage_selectedLabel;
-
-	public static String disciplineGroupingDisciplinesPage_multipleSelectDescription;
-
-	public static String AuthoringUIPlugin_AbstractNewLibraryPage_UseDefaultDirectoryButtonLabel;
-
-	public static String disciplineTasksPage_sectionName;
-
-	public static String disciplineTasksPage_sectionDescription;
-
-	public static String disciplineTasksPage_availableLabel;
-
-	public static String disciplineTasksPage_selectedLabel;
-
-	public static String disciplineTasksPage_multipleSelectDescription;
-
-	public static String disciplineReferenceWorkflowPage_sectionName;
-
-	public static String disciplineReferenceWorkflowPage_sectionDescription;
-
-	public static String disciplineReferenceWorkflowPage_availableLabel;
-
-	public static String disciplineReferenceWorkflowPage_selectedLabel;
-
-	public static String disciplineReferenceWorkflowPage_multipleSelectDescription;
-
-	public static String domainWorkProductsPage_sectionName;
-
-	public static String domainWorkProductsPage_sectionDescription;
-
-	public static String domainWorkProductsPage_availableLabel;
-
-	public static String domainWorkProductsPage_selectedLabel;
-
-	public static String domainWorkProductsPage_multipleSelectDescription;
-
-	public static String workProductTypeWorkProductsPage_sectionName;
-
-	public static String workProductTypeWorkProductsPage_sectionDescription;
-
-	public static String workProductTypeWorkProductsPage_availableLabel;
-
-	public static String workProductTypeWorkProductsPage_selectedLabel;
-
-	public static String workProductTypeWorkProductsPage_multipleSelectDescription;
-
-	public static String roleSetGroupingRoleSetsPage_sectionName;
-
-	public static String roleSetGroupingRoleSetsPage_sectionDescription;
-
-	public static String roleSetGroupingRoleSetsPage_availableLabel;
-
-	public static String roleSetGroupingRoleSetsPage_selectedLabel;
-
-	public static String roleSetGroupingRoleSetsPage_multipleSelectDescription;
-
-	public static String roleSetRolesPage_sectionName;
-
-	public static String roleSetRolesPage_sectionDescription;
-
-	public static String roleSetRolesPage_availableLabel;
-
-	public static String roleSetRolesPage_selectedLabel;
-
-	public static String roleSetRolesPage_multipleSelectDescription;
-
-	public static String toolToolMentorsPage_sectionName;
-
-	public static String toolToolMentorsPage_sectionDescription;
-
-	public static String toolToolMentorsPage_availableLabel;
-
-	public static String toolToolMentorsPage_selectedLabel;
-
-	public static String toolToolMentorsPage_multipleSelectDescription;
-
-	public static String customCategoryAssignPage_sectionName;
-
-	public static String customCategoryAssignPage_sectionDescription;
-
-	public static String customCategoryAssignPage_availableLabel;
-
-	public static String customCategoryAssignPage_selectedLabel;
-
-	public static String customCategoryAssignPage_multipleSelectDescription;
-
-	public static String newPluginWizard_title;
-
-	public static String newPluginWizardPage_title;
-
-	public static String newPluginWizardPage_text;
-
-	public static String newPluginError_msg;
-
-	public static String newPluginError_reason;
-
-	public static String methodLibraryGroup_text;
-
-	public static String defaultPathLabel_text;
-	
-	public static String modelingGroup_text;
-	
-	public static String userInterfaceGroup_text;
-	
-	public static String debugGroup_text;
-	
-	public static String enableLibraryValidationCheckbox_text;
-	
-	public static String invalidPreferenceHistorySizeError_msg;
-
-	public static String createDialog_title;
-
-	public static String deleteDialog_title;
-
-	public static String editDialog_title;
-
-	public static String errorDialog_title;
-
-	public static String moveDialog_title;
-
-	public static String renameDialog_title;
-
-	public static String warningDialog_title;
-
-	public static String addConfigErrorDialog_title;
-
-	public static String setDefaultConfigErrorDialog_title;
-
-	public static String editProcessElementErrorDialog_title;
-
-	public static String openLibraryDialog_title;
-
-	public static String openLibraryDialog_text;
-
-	public static String saveLibraryDialog_title;
-
-	public static String saveLibraryDialog_text;
-
-	public static String upgradeLibraryDialog_title;
-
-	public static String deleteAssociationDialog_text;
-
-	public static String noOpenLibraryError_msg;
-
-	public static String emptyElementNameError_msg;
-
-	public static String duplicateElementNameError_msg;
-
-	public static String createConfigError_msg;
-
-	public static String deleteConfigError_msg;
-
-	public static String internalError_msg;
-
-	public static String invalidPresentationNameError_msg;
-
-	public static String invalidConfigError_msg;
-
-	public static String setDefaultConfigError_msg;
-
-	public static String openLibraryError_msg;
-
-	public static String saveLibraryError_msg;
-
-	public static String saveLibraryToError_msg;
-
-	public static String elementAlreadyDeletedError_msg;
-
-	public static String upgradeLibraryError_msg;
-
-	public static String openConfigWizardError_msg;
-
-	public static String error_reason;
-
-	public static String internalError_reason;
-
-	public static String upgradeLibraryError_reason;
-
-	public static String saveUpgradedLibraryError_reason;
-
-	public static String openingLibraryTask_name;
-
-	public static String savingLibraryTask_name;
-
-	public static String upgradingLibraryTask_name;
-
-	public static String loadingLibraryElementsTask_name;
-
-	public static String savingUpgradedElementsTask_name;
-
-	public static String savingTask_name;
-
-	public static String savingFilesTask_name;
-
-	public static String fixingContentDescriptionGUIDsTask_name;
-
-	public static String deletingInvalidReferencesTask_name;
-
-	public static String addEditorToPerspectiveWarning_msg;
-
-	public static String ChangeHistoryDialog_title;
-
-	public static String ChangeHistoryDialog_label;
-
-	public static String confirmDeleteDialog_title;
-
-	public static String confirmDeleteDialog_msg;
-
-	public static String confirmDeleteDialog_msgWithReference;
-
-	public static String errorDialog_message;
-
-	public static String errorDialog_error;
-
-	public static String err_noopenlibrary;
-
-	public static String err_loadinglibrary;
-
-	public static String msg_reloadLibrary;
-
-	public static String reloadDialog_message;
-
-	public static String reloadDialog_title;
-
-	public static String dialogs_MoveDialog_errorTitle;
-
-	public static String dialogs_MoveDialog_errorMessage;
-
-	public static String processFormEditorSaveDialog_title;
-
-	public static String processFormEditorSaveDialog_message1;
-
-	public static String processFormEditorSaveDialog_message2;
-
-	public static String configViewPageRemoveViewDialog_title;
-
-	public static String configViewPageRemoveViewDialog_message;
-
-	public static String configViewPageViewExistsDialog_title;
-
-	public static String configViewPage_configuration;
-
-	public static String configViewPage_configurationViews;
-
-	public static String configViewPage_views;
-
-	public static String columnselection_text;
-
-	public static String configViewPage_addViewButtonText;
-
-	public static String configViewPage_removeViewButtonText;
-
-	public static String configViewPage_makeDefaultButtonText;
-
-	public static String configViewPageViewExistsDialog_message;
-
-	public static String configViewPage_configurationViewSectionTitle;
-
-	public static String configViewPage_configurationViewSectionMessage;
-
-	public static String descriptionTabGuidanceWarningDialog_title;
-
-	public static String descriptionTabGuidanceWarningDialog_message1;
-
-	public static String descriptionTabGuidanceWarningDialog_message2;
-
-	public static String changeActivityTypeWarningDialog_title;
-
-	public static String AssociationFormPage_BriefDescriptionLabel;
-
-	public static String methodElementDescriptionEmptyNameDialog_title;
-
-	public static String methodElementDescriptionEmptyNameDialog_message;
-
-	public static String methodPluginDescriptionRemoveRefConfirm_message;
-
-	public static String methodPluginDescriptionPage_confirmRename;
-
-	public static String methodPluginDescriptionPage_confirmRename_title;
-
-	public static String methodPluginDescriptionPage_cannotRenamePluginFolder;
-
-	public static String methodPluginDescriptionPage_lockPluginLabel;
-
-	public static String methodPluginDescriptionPage_lockPlugin_message;
-
-	public static String processDescriptionNameChangeConfirm_title;
-
-	public static String processDescriptionNameChangeConfirm_message;
-
-	public static String processDescription_configurationDescription;
-
-	public static String processDescription_configurationSectionTitle;
-
-	public static String processDescription_configurationSectionMessage;
-
-	public static String processDescription_configurations;
-
-	public static String processDescription_default;
-
-	public static String ProcessDescription_selectConfiguration;
-
-	public static String ProcessDeleteAction_deletecofirm_text0;
-
-	public static String ProcessDeleteAction_selectDescriptorsToDelete;
-
-	public static String viewHelperHealthCheckDialog_title;
-
-	public static String viewHelper_performHealthCheck;
-
-	public static String viewHelperHealthCheckDialog_message;
-
-	public static String attachGuidanceFileDialog_title;
-
-	public static String createElementDialog_title;
-
-	public static String createNewElementError_msg;
-
-	public static String dlgTitle_reloadLibrary;
-
-	public static String createElementError_reason;
-
-	public static String deleteConfigError_reason;
-
-	public static String gef_changeBoundsCommand_label;
-
-	public static String gef_changeNameCommand_label;
-
-	public static String gef_changeNameCommand_undoMessage;
-
-	public static String gef_changePropertyValueCommand_label;
-
-	public static String gef_createBendpointCommand_label;
-
-	public static String gef_createLinkCommand_label;
-
-	public static String gef_createNodeCommand_label;
-
-	public static String gef_deleteBendpointCommand_label;
-
-	public static String gef_deleteCommand_label;
-
-	public static String gef_deleteLinkCommand_label;
-
-	public static String gef_moveBendpointCommand_label;
-
-	public static String gef_reconnectLinkCommand_label;
-
-	public static String gef_validatingDirectEditManager_bringDownPrompt;
-
-	public static String gef_validatingFreeTextEditManager_bringDownPrompt;
-
-	public static String gef_workProductNodeEditPart_validateMessage;
-
-	public static String actions_ElementsViewDeleteAction_message;
-
-	public static String actions_LibraryActionBarContributor_deleteErrorTitle;
-
-	public static String actions_LibraryActionBarContributor_deleteErrorMessage;
-
-	public static String actions_LibraryActionBarContributor_deleteErrorReason;
-
-	public static String editors_MethodElementEditor_saveErrorTitle;
-
-	public static String editors_MethodElementEditor_saveErrorMessage1;
-
-	public static String editors_MethodElementEditor_saveErrorMessage2;
-
-	public static String editors_MethodElementEditor_saveErrorReason1;
-
-	public static String editors_MethodElementEditor_saveErrorReason2;
-
-	public static String editors_MethodElementEditor_renameErrorTitle;
-
-	public static String editors_MethodElementEditor_invalidEditorMsg;
-
-	public static String editors_MethodElementEditor_invalidEditorTitle;
-
-	public static String editors_MethodElementEditor_renameErrorMessage1;
-
-	public static String renameError_title;
-
-	public static String renameError_msg;
-
-	public static String SelectElementDialog_selectelement_text;
-
-	public static String editors_EditorChooser_systemErrorDialog_title;
-
-	public static String AuthoringUIPlugin_AbstractNewLibraryPage_DescriptionLabel;
-
-	public static String AuthoringUIPlugin_SaveAllEditorsPage_SelectAllButtonLabel;
-
-	public static String OpenElementWorkbenchActionDelegate_edit_text0;
-
-	public static String editors_EditorChooser_systemErrorDialog_message;
-
-	public static String DescriptionFormPage_IconFileChooserDialog_title;
-
-	public static String AuthoringUIPlugin_AbstractNewLibraryPage_DefaultLibraryName;
-
-	public static String AuthoringUIPlugin_NewConfigurationMainPage_DescriptionLabel;
-
-	public static String AuthoringUIPlugin_OpenConfigurationMainPage_pageDescription;
-
-	public static String AuthoringUIPlugin_SaveAllEditorsPage_DeselectAllButtonLabel;
-
-	public static String ElementsView_migration_dir_dlg_description_text;
-
-	public static String editors_EditorChooser_systemErrorDialog_reason;
-
-	public static String forms_DescriptionFormPage_imageTooBigDialog_title;
-
-	public static String forms_DescriptionFormPage_imageTooBigDialog_template;
-
-	public static String forms_DescriptionFormPage_imageNotFoundDialog_title;
-
-	public static String forms_DescriptionFormPage_imageNotFoundDialog_template;
-
-	public static String DescriptionFormPage_ShapeIconPreview_SelectButtonLabel;
-
-	public static String AuthoringUIPlugin_AbstractNewLibraryPage_DefaultLibraryDescription;
-
-	public static String AuthoringUIPlugin_NewConfigurationMainPage_DefaultBriefDescription;
-
-	public static String AuthoringUIPlugin_SaveAllEditorsPage_saveAndClosePageDescription;
-
-	public static String forms_GuidanceWithAttachmentsDescriptionPage_alreadyAttached_msg;
-
-	public static String newLibraryError_msg;
-
-	public static String newLibraryInternlError_reason;
-
-	public static String newLibraryError_reason1;
-
-	public static String newLibraryError_reason2;
-
-	public static String newLibraryError_reason3;
-
-	public static String newLibraryError_advice;
-
-	public static String Process_ExternalID;
-
-	public static String Process_Purpose;
-
-	public static String Process_Scope;
-
-	public static String Process_UsageNotes;
-
-	public static String Process_Alternatives;
-
-	public static String Process_HowToStaff;
-
-	public static String Process_KeyConsideration;
-
-	public static String Process_Scale;
-
-	public static String Process_ProjectCharacteristics;
-
-	public static String Process_RiskLevel;
-
-	public static String Process_EstimatingTechnique;
-
-	public static String Process_ProjectMemberExpertise;
-
-	public static String Process_TypeOfContract;
-
-	public static String backButton_text;
-
-	public static String forwardButton_text;
-
-	public static String forward_text;
-
-	public static String stopButton_text;
-
-	public static String refreshButton_text;
-
-	public static String refresh_text;
-
-	public static String newname_text;
-
-	public static String printButton_text;
-
-	public static String _UI_RefreshViewer_menu_item;
-
-	public static String _UI_ShowPropertiesView_menu_item;
-
-	public static String _UI_MethodEditor_menu;
-
-	public static String _UI_CreateChild_menu_item;
-
-	public static String _UI_CreateSibling_menu_item;
-
-	public static String _UI_SelectionPage_label;
-
-	public static String _UI_ParentPage_label;
-
-	public static String _UI_ListPage_label;
-
-	public static String _UI_TreePage_label;
-
-	public static String _UI_TablePage_label;
-
-	public static String _UI_TableTreePage_label;
-
-	public static String _UI_ObjectColumn_label;
-
-	public static String _UI_SelfColumn_label;
-
-	public static String _UI_NoObjectSelected;
-
-	public static String _UI_SingleObjectSelected;
-
-	public static String _UI_MultiObjectSelected;
-
-	public static String _UI_OpenEditorError_label;
-
-	public static String _UI_Wizard_category;
-
-	public static String _UI_MethodModelWizard_label;
-
-	public static String _UI_MethodModelWizard_description;
-
-	public static String _UI_MethodEditor_label;
-
-	public static String _UI_MethodEditorFilenameDefaultBase;
-
-	public static String _UI_MethodEditorFilenameExtension;
-
-	public static String _UI_Wizard_label;
-
-	public static String _WARN_FilenameExtension;
-
-	public static String _UI_ModelObject;
-
-	public static String _UI_XMLEncoding;
-
-	public static String _UI_XMLEncodingChoices;
-
-	public static String _UI_Wizard_initial_object_description;
-
-	public static String _UI_FileConflict_label;
-
-	public static String _WARN_FileConflict;
-
-	public static String addLinkDialog_linkType;
-
-	public static String openLinkCheckbox_text;
-
-	public static String heightLabel_text;
-
-	public static String widthLabel_text;
-
-	public static String ElementsView_20;
-
-	public static String ElementsView_21;
-
-	public static String ElementsView_22;
-
-	public static String ElementsView_35;
-
-	public static String ElementsView_36;
-
-	public static String altTagLabel_text;
-
-	public static String imageSizeLabel_text;
-
-	public static String ProcessEditor;
-
-	public static String ProcessEditor_Name;
-
-	public static String ProcessEditor_PresentationName;
-
-	public static String ProcessEditor_Index;
-
-	public static String ProcessEditor_Predecessors;
-
-	// public static String ConfigurationPage_Selected;
-	public static String ChecklistOrder_description;
-
-	public static String ElementsView_renaming_text;
-
-	public static String ProcessEditor_ModelInfo;
-
-	public static String ProcessEditor_Prefix;
-
-	public static String MoveDialog_move_text;
-
-	public static String ChecklistOrder_title;
-
-	public static String ProcessEditor_Repetable;
-
-	public static String ProcessEditor_Ongoing;
-
-	public static String ProcessEditor_Action_Synchronization;
-
-	public static String ProcessEditor_EventDriven;
-
-	public static String ProcessEditor_Deliverable;
-
-	public static String ProcessEditor_Optional;
-
-	public static String FilterDialog_Type_text;
-
-	public static String FilterDialog_ExpandAll;
-
-	public static String MoveDialog_moving_text;
-
-	public static String DescriptionFormPage_LoadShapeIconWarning;
-
-	public static String DescriptionFormPage_LoadShapeIconError;
-
-	public static String AuthoringUIPlugin_AbstractNewLibraryPage_NameLabel;
-
-	public static String AuthoringUIPlugin_NewConfigurationMainPage_pageTitle;
-
-	public static String AuthoringUIPlugin_NewConfigurationMainPage_NameLabel;
-
-	public static String AuthoringUIPlugin_newConfigurationWizard_title;
-
-	public static String newConfigurationWizard_title;
-
-	public static String newLibraryWizard_title;
-
-	public static String newLibraryWizardMainPage_title;
-
-	public static String newLibraryWizardMainPage_description;
-
-	public static String libraryPathLabel_text;
-
-	public static String libraryTypeLabel_text;
-
-	public static String AuthoringUIPlugin_SaveAllEditorsPage_saveTitle;
-
-	public static String AuthoringUIPlugin_SaveAllEditorsPage_saveDescription;
-
-	public static String AuthoringUIPlugin_OpenConfigurationMainPage_pageTitle;
-
-	public static String AuthoringUIPlugin_OpenConfigurationWizard_windowTitle;
-
-	public static String ElementsView_replaceingwithformat_text;
-
-	public static String DescriptionFormPage_LoadNodeIconWarning;
-
-	// public static String MessageLabelProvider_unselectedpackages;
-
-	public static String DescriptionFormPage_LoadNodeIconError;
-
-	public static String StepsOrderDialog_steps;
-
-	public static String StepsOrderDialog_title;
-
-	public static String ProcessEditor_Planned;
-
-	public static String specifydirectory_text;
-
-	public static String ProcessEditor_MultipleOccurrences;
-
-	public static String ProcessEditor_EntryState;
-
-	public static String ProcessEditor_ExitState;
-
-	public static String selectColumnstoAdd_text;
-
-	public static String ProcessEditor_Type;
-
-	public static String ProcessEditor_Team;
-
-	public static String FilterDialog_title;
-
-	public static String ProcessEditor_Action_Add;
-
-	public static String FilterDialog_CollapseAll;
-
-	public static String OpenCheatsheetView_title;
-
-	public static String ProcessEditor_Action_RollUp;
-
-	public static String ProcessEditor_Action_RollDown;
-
-	public static String ProcessEditor_Action_MoveUp;
-
-	public static String ProcessEditor_Action_MoveDown;
-
-	public static String ProcessEditor_Action_Indent;
-	
-	public static String ProcessEditor_Action_Outdent;
-	
-	public static String ProcessEditor_Action_Reveal;
-
-	public static String ProcessEditor_Reveal_Title;
-
-	public static String ProcessEditor_Action_Copy;
-
-	public static String FilterDialog_Pattern_text;
-
-	public static String MethodLibraryEditor_title;
-
-	// public static String MessageView_selected_text;
-	public static String MessageView_errmsg_text;
-
-	public static String ElementsView_err_saving;
-
-	public static String err_copying_file_title;
-
-	public static String err_copying_file_error;
-
-	public static String err_copying_file_reason;
-
-	public static String err_processing_file_title;
-
-	public static String editConfiguration_tooltip;
-
-	public static String editDialog_msgCannotEdit;
-
-	public static String SaveThisAction_saveobject;
-
-	public static String ElementsView_replace_text;
-
-	public static String ProcessEditor_Action_Extend;
-
-	public static String MoveDialog_destination_text;
-
-	public static String chooseDefaultDirectory_text;
-
-	public static String ProcessEditor_Action_Suppress;
-
-	public static String ProcessEditor_Action_Suppress2;
-
-	public static String ProcessEditor_Action_AssignUserDiagram;
-
-	public static String UserDefinedDiagramDialog_title;
-
-	public static String UserDefinedDiagramDialog_adImage;
-
-	public static String UserDefinedDiagramDialog_addImage;
-
-	public static String UserDefinedDiagramDialog_wpdImage;
-
-	public static String UserDefinedDiagramDialog_notaFile;
-
-	public static String UserDefinedDiagramDialog_assignButton;
-
-	public static String UserDefinedDiagramDialog_enteredImageNotFound;
-
-	public static String UserDefinedDiagramDialog_selectedImageNotFound;
-
-	public static String UserDefinedDiagramDialog_useADImage;
-
-	public static String UserDefinedDiagramDialog_useADDImage;
-
-	public static String UserDefinedDiagramDialog_useWPDImage;
-
-	public static String ProcessEditor_Action_Contribute;
-
-	public static String ProcessEditor_Action_Replace;
-
-	public static String ProcessEditor_Action_Diagrams;
-
-	public static String ProcessEditor_action_deepCopy;
-
-	public static String FilterDialog_BriefDescription;
-
-	public static String ConfigurationPage_hideToolTip;
-
-	public static String ConfigurationPage_Description;
-
-	public static String ProcessEditor_Action_SuppressAll;
-
-	public static String FilterDialog_Pattern_description;
-
-	public static String ConfigurationPage_TreeTitleLabel;
-
-	public static String ConfigurationPage_AddCategoriesTitleLabel;
-
-	public static String ConfigurationPage_SubCategoriesTitleLabel;
-
-	public static String ConfigurationPage_LoadingMessage;
-
-	public static String MoveDialog_validdestination_text;
-
-	public static String MoveDialog_cannotModifyDestination;
-
-	public static String ProcessEditor_Action_RevealAll;
-
-	public static String ProcessEditor_Action_OpenBaseActivity;
-
-	public static String ProcessFormEditor_expanAllActionLabel;
-
-	public static String ProcessFormEditor_collapseAllActionLabel;
-
-	public static String ProcessEditor_Action_OpenActivityDiagram;
-
-	public static String ProcessEditor_promptToDeleteBeforeReveal;
-
-	public static String ProcessEditorPreferencePage_SelectColumns;
-
-	public static String ProcessEditor_Action_OpenActivityDetailDiagram;
-
-	public static String ProcessEditorPreferencePage_ColumnSelection;
-
-	public static String ProcessEditorPreferencePage_switchConfiguration;
-
-	public static String ProcessEditorPreferencePage_suppressionGroupTitle;
-
-	public static String ProcessEditorPreferencePage_inheritSuppressionState;
-
-	public static String ProcessEditor_Action_OpenWorkProductDependencyDiagram;
-
-	public static String DescriptionFormPage_ShapeIconPreview_ClearButtonLabel;
-
-	public static String DescriptionFormPage_NodeIconPreview_SelectButtonLabel;
-
-	public static String ProcessEditor_Action_InsertNewPhase;
-
-	public static String ViewHelper_reloadLibOnRollbackError;
-
-	public static String ViewHelper_alreadydeleted_text;
-
-	public static String ViewHelper_alreadydeletedconfirm_text;
-
-	public static String ConfigurationPage_AddMissingToolTip;
-
-	public static String ConfigurationDescriptionDescription;
-
-	public static String ConfigurationDescriptionGeneralInfo;
-
-	public static String ProcessEditor_Action_ApplyPattern;
-
-	public static String MoveDialog_selectdestination_text;
-
-	public static String MoveDialog_nomove_destination_problem_msg;
-
-	public static String MethodLibraryEditor_troubleobject;
-
-	public static String MessageLabelProvider_errchildpkgs;
-
-	public static String ProcessEditor_SuppressDialog_Title;
-
-	public static String ProcessEditor_SuppressDialog_Message;
-
-	public static String ProcessEditor_Title;
-
-	public static String SaveAswithdots_text;
-
-	public static String ProcessEditor_WorkBreakdownStructure;
-
-	public static String ProcessEditor_TeamAllocation;
-
-	public static String ProcessEditor_WorkProductUsage;
-
-	public static String ProcessEditor_ConsolidatedView;
-
-	public static String ProcessEditor_confirmAutoSynch;
-
-	public static String ProcessEditor_defaultSynchronization;
-
-	public static String ConfigurationPage_Description1;
-
-	public static String ConfigurationPage_Description2;
-
-	public static String NewLibraryDialog_newlibrary_as;
-
-	public static String NewPluginDialog_newplugin_text;
-
-	public static String SelectElementDialog_title_text;
-
-	public static String OpenConfigDialognewconfig_text;
-
-	public static String processBreakdownStructureFormPage_BSEditor;
-
-	public static String AbstractDiagramEditor_alignMenu_text;
-
-	public static String AbstractDiagramEditor_refreshFromBaseActivity_text;
-
-	public static String AbstractDiagramEditor_formatTextBoxActivity_text;
-
-	public static String AbstractDiagramEditor_hAlignAverageAction_text;
-
-	public static String AbstractDiagramEditor_hAlignFirstSelectedAction_text;
-
-	public static String AbstractDiagramEditor_vAlignAverageAction_text;
-
-	public static String MethodLibraryDescriptionFormPage_section_title;
-
-	public static String MoveDialog_invalid_move_destination_problem_msg;
-
-	public static String MethodLibraryEditor_savemodellibrary;
-
-	public static String MethodLibraryEditor_error_dialog_title;
-
-	public static String MethodLibraryEditor_save_library_problem_msg;
-
-	public static String MethodElementDeleteAction_deleteconfirm_text;
-
-	public static String ContentElementsOrderDialog_ContentElement_text;
-
-	public static String AuthoringUIPlugin_AbstractNewLibraryPage_BrowseButtonLabel;
-
-	public static String AuthoringUIPlugin_NewConfigurationMainPage_pageDescription;
-
-	public static String AuthoringUIPlugin_SaveAllEditorsPage_saveAndClosePageTitle;
-
-	public static String AbstractDiagramEditor_vAlignFirstSelectedAction_text;
-
-	public static String AbstractDiagramEditor_Save_text;
-
-	public static String AttachmentDialogattachFile_text;
-
-	public static String ConfigurationPage_ConfigContent;
-
-	public static String OpenConfigDialogopenconfig_text;
-
-	public static String ElementsView_replaceAction_text;
-
-	public static String AbstractDiagramEditor_Save_message;
-
-	public static String ConfigurationPage_ShowErrorToolTip;
-
-	public static String ConfigurationDescriptionFormPrefix;
-
-	public static String ChecklistOrder_checklistitems_text;
-
-	public static String AbstractDiagramEditor_MoveNode_label;
-
-	public static String ConfigurationPage_MakeClosureToolTip;
-
-	public static String NewPluginDialog_referenceplugin_text;
-
-	public static String AbstractDiagramEditor_createFreeText_text;
-
-	public static String DescriptionFormPage_NodeIconPreview_Label;
-
-	public static String DiagramValidation_err_cannot_connect_text;
-
-	public static String DiagramValidation_err_samepredandsuc_text;
-
-	public static String EditorChooser_loaddErrorDlgTitle;
-
-	public static String EditorChooser_ResourcesError;
-
-	public static String ConfigurationPage_FormPrefix;
-
-	public static String ConfigurationDescriptionName;
-
-	public static String AttachmentDialogFileURL_text;
-
-	public static String StepsOrderDialog_description;
-
-	public static String MethodLibraryEditor_err_save;
-
-	public static String MessageView_errelement_text;
-
-	public static String MessageView_refelement_text;
-
-	public static String ActivityDiagramEditor_createStartNode_text;
-
-	public static String ConfigurationPage_ConfigContentDescription;
-
-	public static String ContentElementsOrderDialog_description_text;
-
-	public static String AuthoringUIPlugin_AbstractNewLibraryPage_DirectoryLabel;
-
-	public static String RootPrefPage_enableprocesscontribution_text;
-
-	public static String ConfigurationDescriptionDescription_text;
-
-	public static String ConfigurationDescriptionDescriptionLabel;
-
-	public static String ContributionSelection_filterdialog_title;
-
-	public static String ElementsView_openVariabilityDialogAction_text;
-
-	public static String VariabilitySelection_filterdialog_title;
-
-	public static String VariabilitySelection_filterdialog_viewerLabel;
-
-	public static String DescriptionFormPage_ShapeIconPreview_Label;
-
-	public static String DiagramValidation_err_cannot_delete_text;
-
-	public static String ActivityDiagramEditor_openActivityDetailDiagram_text;
-
-	public static String MethodLibraryDescriptionFormPage_section_description;
-
-	public static String DescriptionFormPage_NodeIconPreview_ClearButtonLabel;
-
-	public static String WPCompartmentFigure_0;
-
-	public static String promptfor_publish_unopen_activitydd_text;
-
-	public static String prompt_for_publish_extend_activity_diagram;
-
-	public static String ConfigProcessViewDialog_NamePattern;
-
-	public static String showInResourceNavigatorAction_label;
-
-	public static String ConfigProcessViewDialog_Pattern;
-
-	public static String err_processing_file_description;
-
-	public static String ConfigProcessViewDialog_CategoryType;
-
-	public static String ConfigProcessViewDialog_BriefDescription;
-
-	public static String ConfigProcessViewDialog_SelectCategories;
-
-	public static String cheatsheet_load_failure_log_msg;
-
-	public static String newConfigurationWirazd_createError;
-
-	public static String newPluginWizard_createError;
-
-	public static String errorDialog_moveError;
-
-	public static String renameDialog_renameError;
-
-	public static String errorDialog_createError;
-
-	public static String duplicatePluginNameError_msg;
-
-	public static String ProcessEditor_Action_AddADImage;
-
-	public static String ProcessEditor_refreshErrorTitle;
-
-	public static String ProcessEditor_refreshErrorMsg;
-
-	public static String ProcessEditor_Action_AddADDImage;
-
-	public static String ProcessEditor_Action_AddWPDImage;
-
-	public static String ProcessEditor_Action_UseADImageInPublishing;
-
-	public static String ProcessEditor_promptToDeleteBeforeSuppress;
-
-	public static String ProcessEditor_Action_UseADDImageInPublishing;
-
-	public static String ProcessEditor_Action_UseWPDImageInPublishing;
-
-	public static String ProcessEditor_DiagramImage_InputDialog_initialValue;
-
-	public static String ProcessEditor_Action_ShowLinkedElementinLibraryView;
-
-	public static String ProcessEditor_updateSuppressionFromBaseAction_label;
-
-	public static String ProcessEditor_ContextMenu_DiagramImages;
-
-	public static String synchronizationWizard_descriptionPage_title;
-
-	public static String synchronizationWizard_descriptionPage_text;
-
-	public static String synchronizationWizard_selectConfigPage_title;
-
-	public static String synchronizationWizard_selectConfigPage_text;
-
-	public static String synchronizationWizard_selectConfigPage_configLabel;
-
-	public static String synchronizationWizard_selectDetailsPage_title;
-
-	public static String synchronizationWizard_selectDetailsPage_properties_lable;
-
-	public static String synchronizationWizard_selectDetailsPage_name_lable;
-
-	public static String synchronizationWizard_selectDetailsPage_presentationName_lable;
-
-	public static String synchronizationWizard_selectDetailsPage_briefDesc_lable;
-
-	public static String synchronizationWizard_selectDetailsPage_optionalInouts_label;
-
-	public static String synchronizationWizard_selectDetailsPage_mandatoryInputs_lable;
-
-	public static String synchronizationWizard_selectDetailsPage_outputs_label;
-
-	public static String synchronizationWizard_selectDetailsPage_primaryPerformer_label;
-
-	public static String synchronizationWizard_selectDetailsPage_addnPerformers_lable;
-
-	public static String synchronizationWizard_selectDetailsPage_responsibleRoles_lable;
-
-	public static String synchronizationWizard_selectDetailsPage_contnArtifacts_label;
-
-	public static String synchronizationWizard_selectDetailsPage_dilvedParts_label;
-
-	public static String synchronizationWizard_selectDetailsPage_selSteps_label;
-
-	public static String synchronizationWizard_selectDetailsPage_text;
-
-	public static String synchronizationWizard_previewPage_title;
-
-	public static String synchronizationWizard_previewPage_text;
-
-	public static String selectEditorsToDiscardConflictChanges;
-
-	public static String synchronizationWizard_title_text;
-
-	public static String synchronizationWizard_descriptionPage_explainText;
-
-	public static String openRTE;
-
-	public static String closeRTE;
-
-	public static String ChangeHistoryDialog_delimiter;
-
-	public static String rolesets_guidancepage_sectiondescription;
-
-	public static String disciplines_guidancepage_sectiondescription;
-
-	public static String workproducttypes_guidancepage_sectiondescription;
-
-	public static String domains_guidancepage_sectiondescription;
-
-	public static String tools_guidancepage_sectiondescription;
-
-	public static String customcategory_guidancepage_sectiondescription;
-
-	public static String concept_guidancepage_sectiondescription;
-
-	public static String checklist_guidancepage_sectiondescription;
-
-	public static String example_guidancepage_sectiondescription;
-
-	public static String guideline_guidancepage_sectiondescription;
-
-	public static String roadmap_guidancepage_sectiondescription;
-
-	public static String reusableasset_guidancepage_sectiondescription;
-
-	public static String supportingmaterial_guidancepage_sectiondescription;
-
-	public static String report_guidancepage_sectiondescription;
-
-	public static String practice_guidancepage_sectiondescription;
-
-	public static String template_guidancepage_sectiondescription;
-
-	public static String termdefinition_guidancepage_sectiondescription;
-
-	public static String toolmentor_guidancepage_sectiondescription;
-
-	public static String whitepaper_guidancepage_sectiondescription;
-
-	public static String estimationconsideration_guidancepage_sectiondescription;
-
-	// New String Section Description
-	public static String role_detailSection_desc;
-
-	public static String role_generalInfoSection_desc;
-
-	public static String role_variabilitySection_desc;
-
-	public static String role_versionInfoSection_desc;
-
-	public static String task_detailSection_desc;
-
-	public static String task_generalInfoSection_desc;
-
-	public static String task_variabilitySection_desc;
-
-	public static String task_versionInfoSection_desc;
-
-	public static String artifact_detailSection_desc;
-
-	public static String artifact_generalInfoSection_desc;
-
-	public static String artifact_iconSection_desc;
-
-	public static String artifact_notationSection_desc;
-
-	public static String artifact_tailoringSection_desc;
-
-	public static String artifact_variabilitySection_desc;
-
-	public static String artifact_versionInfoSection_desc;
-
-	public static String outcome_detailSection_desc;
-
-	public static String outcome_generalInfoSection_desc;
-
-	public static String outcome_iconSection_desc;
-
-	public static String outcome_notationSection_desc;
-
-	public static String outcome_tailoringSection_desc;
-
-	public static String outcome_variabilitySection_desc;
-
-	public static String outcome_versionInfoSection_desc;
-
-	public static String deliverable_detailSection_desc;
-
-	public static String deliverable_generalInfoSection_desc;
-
-	public static String deliverable_iconSection_desc;
-
-	public static String deliverable_notationSection_desc;
-
-	public static String deliverable_tailoringSection_desc;
-
-	public static String deliverable_variabilitySection_desc;
-
-	public static String deliverable_versionInfoSection_desc;
-
-	public static String discipline_detailSection_desc;
-
-	public static String discipline_generalInfoSection_desc;
-
-	public static String discipline_variabilitySection_desc;
-
-	public static String discipline_versionInfoSection_desc;
-
-	public static String domain_detailSection_desc;
-
-	public static String domain_generalInfoSection_desc;
-
-	public static String domain_variabilitySection_desc;
-
-	public static String domain_versionInfoSection_desc;
-
-	public static String workproducttype_detailSection_desc;
-
-	public static String workproducttype_generalInfoSection_desc;
-
-	public static String workproducttype_variabilitySection_desc;
-
-	public static String workproducttype_versionInfoSection_desc;
-
-	public static String roleset_detailSection_desc;
-
-	public static String roleset_generalInfoSection_desc;
-
-	public static String roleset_variabilitySection_desc;
-
-	public static String roleset_versionInfoSection_desc;
-
-	public static String tool_detailSection_desc;
-
-	public static String tool_generalInfoSection_desc;
-
-	public static String tool_variabilitySection_desc;
-
-	public static String tool_versionInfoSection_desc;
-
-	public static String concept_detailSection_desc;
-
-	public static String concept_generalInfoSection_desc;
-
-	public static String concept_variabilitySection_desc;
-
-	public static String concept_versionInfoSection_desc;
-
-	public static String checklist_detailSection_desc;
-
-	public static String checklist_generalInfoSection_desc;
-
-	public static String checklist_variabilitySection_desc;
-
-	public static String checklist_versionInfoSection_desc;
-
-	public static String example_detailSection_desc;
-
-	public static String example_generalInfoSection_desc;
-
-	public static String example_variabilitySection_desc;
-
-	public static String example_versionInfoSection_desc;
-
-	public static String guideline_detailSection_desc;
-
-	public static String guideline_generalInfoSection_desc;
-
-	public static String guideline_variabilitySection_desc;
-
-	public static String guideline_versionInfoSection_desc;
-
-	public static String estimationconsideration_detailSection_desc;
-
-	public static String estimationconsideration_generalInfoSection_desc;
-
-	public static String estimationconsideration_variabilitySection_desc;
-
-	public static String estimationconsideration_versionInfoSection_desc;
-
-	public static String practice_detailSection_desc;
-
-	public static String practice_generalInfoSection_desc;
-
-	public static String practice_variabilitySection_desc;
-
-	public static String practice_versionInfoSection_desc;
-
-	public static String report_detailSection_desc;
-
-	public static String report_generalInfoSection_desc;
-
-	public static String report_variabilitySection_desc;
-
-	public static String report_versionInfoSection_desc;
-
-	public static String resuableasset_detailSection_desc;
-
-	public static String resuableasset_generalInfoSection_desc;
-
-	public static String resuableasset_variabilitySection_desc;
-
-	public static String resuableasset_versionInfoSection_desc;
-
-	public static String roadmap_detailSection_desc;
-
-	public static String roadmap_generalInfoSection_desc;
-
-	public static String roadmap_variabilitySection_desc;
-
-	public static String roadmap_versionInfoSection_desc;
-
-	public static String supportingmaterial_detailSection_desc;
-
-	public static String supportingmaterial_generalInfoSection_desc;
-
-	public static String supportingmaterial_variabilitySection_desc;
-
-	public static String supportingmaterial_versionInfoSection_desc;
-
-	public static String template_detailSection_desc;
-
-	public static String template_generalInfoSection_desc;
-
-	public static String template_variabilitySection_desc;
-
-	public static String template_versionInfoSection_desc;
-
-	public static String termdefinition_detailSection_desc;
-
-	public static String termdefinition_generalInfoSection_desc;
-
-	public static String termdefinition_variabilitySection_desc;
-
-	public static String termdefinition_versionInfoSection_desc;
-
-	public static String toolmentor_detailSection_desc;
-
-	public static String toolmentor_generalInfoSection_desc;
-
-	public static String toolmentor_variabilitySection_desc;
-
-	public static String toolmentor_versionInfoSection_desc;
-
-	public static String whitepaper_detailSection_desc;
-
-	public static String whitepaper_generalInfoSection_desc;
-
-	public static String whitepaper_variabilitySection_desc;
-
-	public static String whitepaper_versionInfoSection_desc;
-
-	public static String disciplinegrouping_detailSection_desc;
-
-	public static String disciplinegrouping_generalInfoSection_desc;
-
-	public static String disciplinegrouping_variabilitySection_desc;
-
-	public static String disciplinegrouping_versionInfoSection_desc;
-
-	public static String rolesetgrouping_detailSection_desc;
-
-	public static String rolesetgrouping_generalInfoSection_desc;
-
-	public static String rolesetgrouping_variabilitySection_desc;
-
-	public static String rolesetgrouping_versionInfoSection_desc;
-
-	public static String customcategory_detailSection_desc;
-
-	public static String customcategory_generalInfoSection_desc;
-
-	public static String customcategory_variabilitySection_desc;
-
-	public static String customcategory_versionInfoSection_desc;
-
-	public static String customcategory_IconSection_desc;
-
-	public static String concept_iconSection_desc;
-
-	public static String checklist_iconSection_desc;
-
-	public static String toolmentor_iconSection_desc;
-
-	public static String whitepaper_iconSection_desc;
-
-	public static String estimationconsideration_iconSection_desc;
-
-	public static String termdefinition_iconSection_desc;
-
-	public static String template_iconSection_desc;
-
-	public static String reusableasset_iconSection_desc;
-
-	public static String report_iconSection_desc;
-
-	public static String practice_iconSection_desc;
-
-	public static String example_iconSection_desc;
-
-	public static String guideline_iconSection_desc;
-
-	public static String roadmap_iconSection_desc;
-
-	public static String supportingmaterial_iconSection_desc;
-
-	public static String activity_variability_error_title;
-
-	public static String variability_error_title;
-
-	public static String circular_dependency_error_title;
-
-	public static String apply_pattern_error_msg;
-
-	public static String apply_pattern_error_title;
-
-	public static String editor_title_colon_with_spaces;
-
-	public static String publish_categories_text;
-
-	public static String default_list_length_label;
-
-	public static String extend_semantics_button_text;
-
-	public static String extend_semantics_text;
-
-	public static String ProcessEditor_Action_Preferences;
-
-	public static String ProcessEditor_Action_Suppress_Task;
-
-	public static String ProcessEditor_Action_Reveal_Task;
-
-	public static String LayoutActionGroup_label;
-
-	public static String LayoutActionGroup_flatLayoutAction_label;
-
-	public static String LayoutActionGroup_hierarchicalLayoutAction_label;
-
-	public static String preference_WorkBreakdownElements;
-
-	public static String preference_DescriptorElements;
-
-	public static String preference_breakDownElement_Description;
-
-	public static String preference_Activity_Diagram;
-
-	public static String preference_Activity_Detail_Diagram;
-
-	public static String configurationPage_QuickfixError_reason1;
-
-	public static String configurationPage_quickfixError_title;
-	
-	public static String defaultLinkTypePrefLabel;
-	
-	public static String forms_GuidanceWithUrlAttachmentsDescriptionPage_alreadyAttached_msg;
-	
-	public static String AttachmentDialogattachUrl_text;
-	
-	public static String Validate_method_library;
-	
-	public static String roleCategoriesPage_multipleSelectDescription;
-
-	public static String taskCategoriesPage_multipleSelectDescription;
-	
-	public static String workProductCategoriesPage_multipleSelectDescription;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, AuthoringUIResources.class);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIService.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIService.java
deleted file mode 100644
index e400ba8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIService.java
+++ /dev/null
@@ -1,164 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.gef.util.DiagramEditorUtil;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.providers.MethodEditorPageProvider;
-import org.eclipse.epf.authoring.ui.providers.ProcessEditorPageProvider;
-import org.eclipse.epf.common.ui.PreferenceStoreWrapper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationApplicator;
-import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.library.edit.ICommandListener;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IConfiguratorFactory;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.ui.LibraryUIUtil;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.util.CopyAttachmentsToNewLocation;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * The Authoring UI service.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class AuthoringUIService {
-
-	// The shared instance.
-	private static AuthoringUIService instance = new AuthoringUIService();
-
-	// The status flag.
-	private boolean started = false;
-
-	/**
-	 * Creates a new instance.
-	 */
-	private AuthoringUIService() {
-		LibraryService.getInstance().addListener(new ILibraryServiceListener() {
-			public void libraryCreated(MethodLibrary library) {
-			}
-
-			public void libraryOpened(MethodLibrary library) {
-			}
-
-			public void libraryReopened(MethodLibrary library) {
-			}
-			
-			public void libraryClosed(MethodLibrary library) {
-			}			
-
-			public void librarySet(MethodLibrary library) {
-				if (library != null) {
-					start();
-				}
-				LibraryUIUtil.updateShellTitle();
-			}
-			
-			public void configurationSet(MethodConfiguration config) {
-			}			
-		});		
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static AuthoringUIService getInstance() {
-		return instance;
-	}
-
-	/**
-	 * Starts the Authoring UI service.
-	 */
-	public synchronized void start() {
-		if (!started) {	
-			LibraryUIPreferences.applyDefaultValuesForBreakdownElementAttributes();
-
-			// Initialize ProcessAuthoringConfigurator
-			ProcessAuthoringConfigurator.INSTANCE.getClass();
-			
-			// Set configurator for WBS adapter factory if it's not set yet
-			if(TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory() instanceof ConfigurableComposedAdapterFactory) {
-				ConfigurableComposedAdapterFactory adapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-				if(adapterFactory.getFilter() == null) {
-					adapterFactory.setFilter(ProcessAuthoringConfigurator.INSTANCE);
-				}
-			}
-
-			// Initialize the move/paste command.
-			MethodElementAddCommand
-					.setResourceManager(new CopyAttachmentsToNewLocation());
-
-			// Initialize the EditorChooser.
-			EditorChooser.getInstance();
-
-			// Load EditorPage Providers
-			MethodEditorPageProvider.getInstance().loadProviders();
-			ProcessEditorPageProvider.getInstance().loadProviders();
-
-			// Set providers for library edit.
-			Providers.setConfiguratorFactory(new IConfiguratorFactory() {
-				public IConfigurator createConfigurator(
-						MethodConfiguration config) {
-					return new ProcessConfigurator(config, true);
-				}
-			});
-
-			Providers
-					.setConfigurationApplicator(new ConfigurationApplicator());
-
-			Providers.setPreferenceStore(LibraryPlugin.getDefault()
-					.getPreferenceStore());
-
-			PreferenceStoreWrapper store = new PreferenceStoreWrapper(AuthoringUIPlugin.getDefault().getPreferenceStore());
-			Providers.setAuthoringPluginPreferenceStore(store);
-
-			List<ICommandListener> cmdListeners = GraphicalDataManager.getInstance()
-					.getCommandListeners();
-			cmdListeners.addAll(DiagramEditorUtil.getInstance()
-					.getVaryCommandListeners());
-			for (Iterator<ICommandListener> iter = cmdListeners.iterator(); iter.hasNext();) {
-				ICommandListener listener = iter.next();
-				Providers.registerCommandListener(listener);
-			}
-
-			RefreshJob.getInstance().start();
-			
-			started = true;
-		}
-	}
-
-	/**
-	 * Stops the Authoring UI service.
-	 */
-	public synchronized void stop() {
-		if (started) {
-			RefreshJob.getInstance().stop();			
-			started = false;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIText.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIText.java
deleted file mode 100644
index c037759..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIText.java
+++ /dev/null
@@ -1,246 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-
-/**
- * Defines and caches the commonly referenced text in the Authoring UI.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AuthoringUIText {
-
-	/**
-	 * Editor form page titles.
-	 */
-	public static final String ASSIGN_PAGE_TITLE = AuthoringUIResources.assignPage_title; 
-
-	public static final String CATEGORIES_PAGE_TITLE = AuthoringUIResources.categoriesPage_title; 
-
-	public static final String DELIVERABLE_PARTS_PAGE_TITLE = AuthoringUIResources.deliverablePartsPage_title; 
-
-	public static final String DESCRIPTION_PAGE_TITLE = AuthoringUIResources.descriptionPage_title; 
-
-	public static final String DISCIPLINES_PAGE_TITLE = AuthoringUIResources.disciplinesPage_title; 
-
-	public static final String GUIDANCE_PAGE_TITLE = AuthoringUIResources.guidancePage_title; 
-
-	public static final String PREVIEW_PAGE_TITLE = AuthoringUIResources.previewPage_title; 
-
-	public static final String REFERENCES_PAGE_TITLE = AuthoringUIResources.referencesPage_title; 
-
-	public static final String REFERENCE_WORKFLOW_PAGE_TITLE = AuthoringUIResources.referenceWorkflowPage_title; 
-
-	public static final String ROLES_PAGE_TITLE = AuthoringUIResources.rolesPage_title; 
-
-	public static final String ROLE_SETS_PAGE_TITLE = AuthoringUIResources.roleSetsPage_title; 
-
-	public static final String STEPS_PAGE_TITLE = AuthoringUIResources.stepsPage_title; 
-
-	public static final String TASKS_PAGE_TITLE = AuthoringUIResources.tasksPage_title; 
-
-	public static final String TOOL_MENTORS_PAGE_TITLE = AuthoringUIResources.toolMentorsPage_title; 
-
-	public static final String WORK_PRODUCTS_PAGE_TITLE = AuthoringUIResources.workProductsPage_title; 
-
-	/**
-	 * Editor section names and description.
-	 */
-	public static final String CHECK_ITEMS_SECTION_NAME = AuthoringUIResources.checkItemsSection_name; 
-
-	public static final String CHECK_ITEMS_SECTION_DESC = AuthoringUIResources.checkItemsSection_desc; 
-
-	public static final String DEPENDENCIES_SECTION_NAME = AuthoringUIResources.dependenciesSection_name; 
-
-	public static final String DEPENDENCIES_SECTION_DESC = AuthoringUIResources.dependenciesSection_desc; 
-
-	public static final String DETAIL_SECTION_NAME = AuthoringUIResources.detailSection_name; 
-
-	public static final String DETAIL_SECTION_DESC = AuthoringUIResources.detailSection_desc; 
-
-	public static final String GENERAL_INFO_SECTION_NAME = AuthoringUIResources.generalInfoSection_name; 
-
-	public static final String GENERAL_INFO_SECTION_DESC = AuthoringUIResources.generalInfoSection_desc; 
-
-	public static final String ICON_SECTION_NAME = AuthoringUIResources.iconSection_name; 
-
-	public static final String ICON_SECTION_DESC = AuthoringUIResources.iconSection_desc; 
-
-	public static final String NOTATION_SECTION_NAME = AuthoringUIResources.notationSection_name; 
-
-	public static final String NOTATION_SECTION_DESC = AuthoringUIResources.notationSection_desc; 
-
-	public static final String REFERENCED_PLUGINS_SECTION_NAME = AuthoringUIResources.referencedPluginsSection_name; 
-
-	public static final String REFERENCED_PLUGINS_SECTION_DESC = AuthoringUIResources.referencedPluginsSection_desc; 
-
-	public static final String STAFFING_SECTION_NAME = AuthoringUIResources.staffingSection_name; 
-
-	public static final String STAFFING_SECTION_DESC = AuthoringUIResources.staffingSection_desc; 
-
-	public static final String STEPS_SECTION_NAME = AuthoringUIResources.stepsSection_name; 
-
-	public static final String STEPS_SECTION_DESC = AuthoringUIResources.stepsSection_desc; 
-
-	public static final String TAILORING_SECTION_NAME = AuthoringUIResources.tailoringSection_name; 
-
-	public static final String TAILORING_SECTION_DESC = AuthoringUIResources.tailoringSection_desc; 
-
-	public static final String VARIABILITY_SECTION_NAME = AuthoringUIResources.variabilitySection_name; 
-
-	public static final String VARIABILITY_SECTION_DESC = AuthoringUIResources.variabilitySection_desc; 
-
-	public static final String VERSION_INFO_SECTION_NAME = AuthoringUIResources.versionInfoSection_name; 
-
-	public static final String VERSION_INFO_SECTION_DESC = AuthoringUIResources.versionInfoSection_desc; 
-
-	/**
-	 * UI and element attribute labels.
-	 */
-	public static final String ADDITIONAL_INFO_TEXT = AuthoringUIResources.additionalInfo_text; 
-
-	public static final String APPLICATION_TEXT = AuthoringUIResources.application_text; 
-
-	public static final String ALTERNATIVES_TEXT = AuthoringUIResources.alternatives_text; 
-
-	public static final String ASSIGNMENT_APPROACHES_TEXT = AuthoringUIResources.assignmentApproaches_text; 
-
-	public static final String AUTHORS_TEXT = AuthoringUIResources.authors_text; 
-
-	public static final String BACKGROUND_TEXT = AuthoringUIResources.background_text; 
-
-	public static final String BASE_ELEMENT_TEXT = AuthoringUIResources.baseElement_text; 
-
-	public static final String BASE_GUIDANCE_TEXT = AuthoringUIResources.baseGuidance_text; 
-
-	public static final String BRIEF_DESCRIPTION_TEXT = AuthoringUIResources.briefDescription_text; 
-
-	public static final String BRIEF_OUTLINE_TEXT = AuthoringUIResources.briefOutline_text; 
-
-	public static final String CHANGE_DATE_TEXT = AuthoringUIResources.changeDate_text; 
-
-	public static final String CHANGE_DESCRIPTION_TEXT = AuthoringUIResources.changeDescription_text; 
-
-	public static final String CHECK_ITEMS_TEXT = AuthoringUIResources.checkItems_text; 
-
-	public static final String CONTRIBUTES_TEXT = AuthoringUIResources.contributes_text; 
-	
-	public static final String LOCAL_CONTRIBUTES_TEXT = AuthoringUIResources.localContributes_text;  
-
-	public static final String COPYRIGHT_TEXT = AuthoringUIResources.copyright_text; 
-
-	public static final String DESCRIPTION_TEXT = AuthoringUIResources.description_text; 
-
-	public static final String EDITOR_TEXT = AuthoringUIResources.editor_text; 
-
-	public static final String EXTENDS_TEXT = AuthoringUIResources.extends_text; 
-
-	public static final String EXTERNAL_DESCRIPTION_TEXT = AuthoringUIResources.externalDescription_text; 
-
-	public static final String EXTERNAL_ID_TEXT = AuthoringUIResources.externalId_text; 
-
-	public static final String GOALS_TEXT = AuthoringUIResources.goals_text; 
-
-	public static final String IMPACT_OF_NOT_HAVING_TEXT = AuthoringUIResources.impactOfNotHaving_text; 
-
-	public static final String KEY_CONSIDERATIONS_TEXT = AuthoringUIResources.keyConsiderations_text; 
-
-	public static final String LEVEL_OF_ADOPTION_TEXT = AuthoringUIResources.levelsOfAdoption_text; 
-
-	public static final String MAIN_DESCRIPTION_TEXT = AuthoringUIResources.mainDescription_text; 
-
-	public static final String NAME_TEXT = AuthoringUIResources.name_text; 
-
-	public static final String NEW_ELEMENT_TEXT = AuthoringUIResources.newElement_text; 
-
-	public static final String NOT_APPLICABLE_TEXT = AuthoringUIResources.notApplicable_text; 
-
-	public static final String NOTATION_TEXT = AuthoringUIResources.notation_text; 
-
-	public static final String PACKAGING_GUIDANCE_TEXT = AuthoringUIResources.packagingGuidance_text; 
-
-	public static final String PRESENTATION_NAME_TEXT = AuthoringUIResources.presentationName_text; 
-
-	public static final String PROBLEM_TEXT = AuthoringUIResources.problem_text; 
-
-	public static final String PURPOSE_TEXT = AuthoringUIResources.purpose_text; 
-
-	public static final String REASON_FOR_NOT_NEEDING_TEXT = AuthoringUIResources.reasonForNotNeeding_text; 
-
-	public static final String REPLACES_TEXT = AuthoringUIResources.replaces_text; 
-
-	public static final String REPRESENTATION_TEXT = AuthoringUIResources.representation_text; 
-
-	public static final String REPRESENTATION_OPTIONS_TEXT = AuthoringUIResources.representationOptions_text; 
-
-	public static final String SKILLS_TEXT = AuthoringUIResources.skills_text; 
-
-	public static final String STEPS_TEXT = AuthoringUIResources.steps_text; 
-
-	public static final String STEP_NAME_TEXT = AuthoringUIResources.steps_name_text; 
-
-	public static final String SYNONYMS_TEXT = AuthoringUIResources.synonyms_text; 
-
-	public static final String ATTACHED_FILE_TEXT = AuthoringUIResources.attachedFile_text; 
-
-	public static final String TYPE_TEXT = AuthoringUIResources.type_text; 
-
-	public static final String UNIQUE_ID_TEXT = AuthoringUIResources.uniqueId_text; 
-
-	public static final String VARIABILITY_TYPE_TEXT = AuthoringUIResources.variabilityType_text; 
-
-	public static final String VERSION_TEXT = AuthoringUIResources.version_text; 
-
-	/**
-	 * Button labels.
-	 */
-	public static final String ADD_BUTTON_TEXT = AuthoringUIResources.addButton_text; 
-
-	public static final String ATTACH_BUTTON_TEXT = AuthoringUIResources.attachButton_text; 
-	
-	public static final String ATTACH_URL_BUTTON_TEXT = AuthoringUIResources.attachUrlButton_text;
-
-	public static final String BROWSE_BUTTON_TEXT = AuthoringUIResources.browseButton_text; 
-
-	public static final String CHANGE_TYPE_BUTTON_TEXT = AuthoringUIResources.changeTypeButton_text; 
-
-	public static final String CLEAR_BUTTON_TEXT = AuthoringUIResources.clearButton_text; 
-
-	public static final String DELETE_BUTTON_TEXT = AuthoringUIResources.deleteButton_text; 
-
-	public static final String DESELECT_BUTTON_TEXT = AuthoringUIResources.deselectButton_text; 
-
-	public static final String DETACH_BUTTON_TEXT = AuthoringUIResources.detachButton_text; 
-
-	public static final String DOWN_BUTTON_TEXT = AuthoringUIResources.downButton_text; 
-
-	public static final String ORDER_BUTTON_TEXT = AuthoringUIResources.orderButton_text; 
-
-	public static final String EDIT_BUTTON_TEXT = AuthoringUIResources.editButton_text; 
-	
-	public static final String REMOVE_BUTTON_TEXT = AuthoringUIResources.removeButton_text; 
-
-	public static final String SELECT_BUTTON_TEXT = AuthoringUIResources.selectButton_text; 
-
-	public static final String UP_BUTTON_TEXT = AuthoringUIResources.upButton_text; 
-
-	public static final String VIEW_HISTORY_BUTTON_TEXT = AuthoringUIResources.viewHistoryButton_text; 
-
-	public static final String ALWAYS_BUTTON_TEXT = MessageDialogWithToggle.ALWAYS;
-
-	public static final String NEVER_BUTTON_TEXT = MessageDialogWithToggle.NEVER;
-
-	public static final String PROMPT_BUTTON_TEXT = MessageDialogWithToggle.PROMPT;
-
-	public static final String PUBLISH_CATEGORIES_TEXT = AuthoringUIResources.publish_categories_text;
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/BrowsingPerspective.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/BrowsingPerspective.java
deleted file mode 100644
index d83aa31..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/BrowsingPerspective.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import org.eclipse.epf.authoring.ui.views.ConfigurationView;
-import org.eclipse.epf.authoring.ui.views.ContentView;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IPerspectiveFactory;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The Method Browsing perspective.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class BrowsingPerspective implements IPerspectiveFactory {
-
-	/**
-	 * The perspective ID.
-	 */
-	public static final String PERSPECTIVE_ID = BrowsingPerspective.class
-			.getName();
-
-	/**
-	 * @see org.eclipse.ui.IPerspectiveFactory#createInitialLayout(IPageLayout)
-	 */
-	public void createInitialLayout(IPageLayout layout) {
-		layout.setEditorAreaVisible(false);
-		String editorArea = layout.getEditorArea();
-		layout.addView(ConfigurationView.VIEW_ID, IPageLayout.LEFT, 0.30f,
-				editorArea);
-		PerspectiveListUtil.addPerspectiveShortList(layout);
-		layout.addView(ContentView.VIEW_ID, IPageLayout.RIGHT, 0.70f, editorArea);
-	}
-
-	/**
-	 * Opens this perspective.
-	 */
-	public static void open() {
-		try {
-			IWorkbenchWindow window = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			if (window == null) {
-				IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
-						.getWorkbenchWindows();
-				if (windows != null && windows.length > 0) {
-					window = windows[0];
-				}
-			}
-
-			if (window != null) {
-				PlatformUI.getWorkbench().showPerspective(PERSPECTIVE_ID,
-						window);
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(
-					"Failed to open browsing perspective", e); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/PerspectiveListUtil.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/PerspectiveListUtil.java
deleted file mode 100644
index 5f880be..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/PerspectiveListUtil.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.ui.IPageLayout;
-
-/**
- * Helper class for the Authoring and Browsing perspectives.
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-public class PerspectiveListUtil {
-
-	/**
-	 * Add the Browsing and Authoring perspective shortcuts to the given page
-	 * layout.
-	 */
-	public static void addPerspectiveShortList(IPageLayout layout) {
-		layout.addPerspectiveShortcut(BrowsingPerspective.PERSPECTIVE_ID);
-		layout.addPerspectiveShortcut(AuthoringPerspective.PERSPECTIVE_ID);
-	}
-
-	/**
-	 * Returns <code>true</code> if the current perspective is the Authoring
-	 * perspective.
-	 */
-	public static boolean isAuthoringPerspective() {
-		String activePerspectiveId = PerspectiveUtil.getActivePerspectiveId();
-		if (activePerspectiveId == null) {
-			return false;
-		} else {
-			return activePerspectiveId
-					.equalsIgnoreCase(AuthoringPerspective.PERSPECTIVE_ID);
-		}
-	}
-
-	/**
-	 * Returns <code>true</code> if the current perspective is the Browsing
-	 * perspective.
-	 */
-	public static boolean isBrowsingPerspective() {
-		String activePerspectiveId = PerspectiveUtil.getActivePerspectiveId();
-		if (activePerspectiveId == null) {
-			return false;
-		} else {
-			return activePerspectiveId
-					.equalsIgnoreCase(BrowsingPerspective.PERSPECTIVE_ID);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
deleted file mode 100644
index f192d02..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
+++ /dev/null
@@ -1,1242 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-################################################################################
-# START NO TRANSLATION
-################################################################################
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-ChangeHistoryDialog_delimiter=|
-
-#Below property "editor_title_colon_with_spaces" should not be translated
-#Don't delete a space after ": "
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-editor_title_colon_with_spaces=: 
-################################################################################
-# END NO TRANSLATION
-################################################################################
-
-# Form Page Titles
-assignPage_title=Assign
-categoriesPage_title=Categories
-deliverablePartsPage_title=Deliverable Parts
-descriptionPage_title=Description
-disciplinesPage_title=Disciplines
-discardunresolvedref=Discard unresolved references
-guidancePage_title=Guidance
-previewPage_title=Preview
-referencesPage_title=References
-reference_text=References:
-referenceWorkflowPage_title=Reference Workflow
-rolesPage_title=Roles
-roleSetsPage_title=Role Sets
-stepsPage_title=Steps
-tasksPage_title=Tasks
-toolMentorsPage_title=Tool Mentors
-workProductsPage_title=Work Products
-
-# Section Names & Description
-checkItemsSection_name=Check Items
-checkItemsSection_desc=Specify the check items that constitute this checklist.
-dependenciesSection_name=Dependencies
-dependenciesSection_desc=This section displays dependencies of this content package to other content packages.
-detailSection_name=Detail Information
-detailSection_desc=Provide detailed information about this {0}.
-generalInfoSection_name=General Information
-generalInfoSection_desc=Provide general information about this {0}.
-iconSection_name=Icon
-iconSection_desc=Customize the icons for this {0}.
-notationSection_name=Delivery Information
-notationSection_desc=Provide delivery information about this {0}.
-referencedPluginsSection_name=Referenced Plug-ins:
-referencedPluginsSection_desc=This section displays plug-ins referenced by this method plug-in.
-staffingSection_name=Staffing Information
-staffingSection_desc=Provide staffing information about this role.
-stepsSection_name=Steps
-stepsSection_desc=Specify the steps to perform this task.
-tailoringSection_name=Tailoring
-tailoringSection_desc=Provide tailoring information about this {0}.
-variabilitySection_name=Content Variability
-variabilitySection_desc=Specify how this {0} relates to another {0}.
-versionInfoSection_name=Version Information
-versionInfoSection_desc=Provide version information about this {0}.
-
-# UI & Element Attribute Labels
-additionalInfo_text=Additional information:
-application_text=Application:
-actionLabel_edit=&Edit
-actionLabel_findElementInLibNav=&Show in Library View
-alternatives_text=Alternatives:
-assignmentApproaches_text=Assignment approaches:
-authors_text=Authors:
-background_text=Background:
-baseElement_text=Base:
-baseGuidance_text=Base guidance:
-briefDescription_text=Brief description:
-description_text=Description:
-backupbeforesave_text=Back up before save
-briefOutline_text=Brief outline:
-changeDate_text=Change date:
-changeDescription_text=Change description:
-checkItems_text=Check Items
-contributes_text=Contributes
-localContributes_text=LocalContributes
-contributes_to_text=Contributes to
-copyright_text=Copyright:
-editor_text=Editor
-extends_text=Extends
-extend_text=Extend
-externalDescription_text=External description:
-externalId_text=External ID:
-goals_text=Goals:
-impactOfNotHaving_text=Impact of not having:
-keyConsiderations_text=Key considerations:
-levelsOfAdoption_text=Level of adoption:
-mainDescription_text=Main description:
-newElement_text=New {0}
-name_text=Name:
-notApplicable_text=Not applicable
-packagingGuidance_text=Packaging guidance:
-presentationName_text=Presentation name:
-promptforlibary_text=Prompt for method library on startup
-enableHealthCheck_text=Enable internal debug tools
-notation_text=Notation:
-problem_text=Problem:
-purpose_text=Purpose:
-reasonForNotNeeding_text=Reason for not needing:
-replaces_text=Replaces
-localReplaces_text=LocalReplaces
-extendsReplaces_text=Extends and Replaces
-representationOptions_text=Representation options:
-representation_text=Selected representation:
-attachedFile_text=Attached file(s)/URL(s):
-skills_text=Skills:
-steps_text=Steps:
-steps_name_text=Name:
-stop_text=Stop
-print_text=Print
-synonyms_text=Synonyms:
-type_text=Type:
-copy_text=Copy
-deepCopy_text=Deep Copy
-back_text=Back
-new_plugin=Ne&w Method Plug-in
-move=&Move...
-uniqueId_text=Unique ID:
-variabilityType_text=Variability type:
-version_text=Version:
-
-# Button Labels
-addButton_text=Add...
-attachButton_text=Attach File...
-attachUrlButton_text=Attach Url...
-browseButton_text=Browse...
-changeTypeButton_text=Change Type...
-clearButton_text=Clear
-deleteButton_text=Delete
-detachButton_text=Detach
-diagram_saveError=Error saving diagram
-downButton_text=Down
-directory_text=Directory:
-orderButton_text=Order
-editButton_text=Edit...
-removeButton_text=Remove
-renameAction_text=Ren&ame...
-remove_text=Remove
-rename_text=Rename
-SaveAs_text=Save As
-selectButton_text=Select...
-deselectButton_text=Deselect
-upButton_text=Up
-makeDefaultButton_text=Make Default
-viewHistoryButton_text=View History...
-
-# Role Editor Tasks Page
-roleTasksPage_sectionName=Tasks
-roleTasksPage_sectionDescription=This role is the performer of the following tasks.
-roleTasksPage_availableLabel=Available tasks
-roleTasksPage_selectedLabel=Primary performer:
-roleTasksPage_selectedLabel2=Additional performer:
-roleTasksPage_multipleSelectDescription={0} tasks have been selected.
-
-# Role Editor Work Products Page
-roleWorkProductsPage_sectionName=Work Products:
-roleWorkProductsPage_sectionDescription=Specify work products that this role is responsible for.
-roleWorkProductsPage_availableLabel=Available work products:
-roleWorkProductsPage_selectedLabel=Responsible for:
-roleWorkProductsPage_selectedLabel2=Work products that are output of tasks that this role performs:
-roleWorkProductsPage_multipleSelectDescription={0} work products have been selected.
-
-# Role Editor Guidance Page
-roleGuidancePage_sectionName=Guidance
-roleGuidancePage_sectionDescription=Provide links to additional information in the form of guidance.
-roleGuidancePage_availableLabel=Available Guidance:
-roleGuidancePage_selectedLabel=Guidance:
-roleGuidancePage_multipleSelectDescription={0} guidance have been selected.
-
-# Role Editor Categories Page
-roleCategoriesPage_sectionName=Categories:
-roleCategoriesPage_sectionDescription=Manage the categories to which this role belongs.
-roleCategoriesPage_availableLabel=Role Sets:
-roleCategoriesPage_availableLabel2=Custom Categories:
-roleCategoriesPage_selectedLabel=Role sets:
-roleCategoriesPage_selectedLabel2=Custom categories:
-roleCategoriesPage_multipleSelectDescription={0} categories have been selected.
-
-# Task Editor Roles Page
-taskRolesPage_sectionName=Roles
-taskRolesPage_sectionDescription=Assign the roles to perform this task.
-taskRolesPage_availableLabel=Available roles:
-taskRolesPage_selectedLabel=Primary performer:
-taskRolesPage_selectedLabel2=Additional performers:
-taskRolesPage_multipleSelectDescription={0} roles have been selected.
-taskRolesPage_primaryPerformer_modify_message=IUPA00045W: Do you want to change the primary performer to ''{0}''?
-taskRolesPage_confirm_title=Confirm primary role change
-
-# Task Editor Work Products Page
-taskWorkProductsPage_sectionName=Work Products
-taskWorkProductsPage_sectionDescription=Specify the input and output work products for this task.
-taskWorkProductsPage_availableLabel=Available Work Products
-taskWorkProductsPage_selectedLabel=Mandatory inputs:
-taskWorkProductsPage_selectedLabel2=Optional inputs:
-taskWorkProductsPage_selectedLabel3=Outputs:
-taskWorkProductsPage_multipleSelectDescription={0} work products have been selected.
-
-# Task Editor Guidance Page
-taskGuidancePage_sectionName=Guidance
-taskGuidancePage_sectionDescription=Provide links to additional information in the form of guidance.
-taskGuidancePage_availableLabel=Available Guidance:
-taskGuidancePage_selectedLabel=Guidance:
-taskGuidancePage_multipleSelectDescription={0} guidances have been selected.
-
-# Task Editor Categories Page
-taskCategoriesPage_sectionName=Categories
-taskCategoriesPage_sectionDescription=Manage the categories to which this task belongs.
-taskCategoriesPage_availableLabel=Disciplines
-taskCategoriesPage_availableLabel2=Custom Categories
-taskCategoriesPage_selectedLabel=Disciplines:
-taskCategoriesPage_selectedLabel2=Custom categories:
-taskCategoriesPage_multipleSelectDescription={0} categories have been selected.
-
-# Work Product Editor Tasks Page
-WorkProduct_Tasks_SectionName=Tasks
-WorkProduct_Tasks_SectionDescription=This work product is an input or output for the following tasks.
-WorkProduct_Tasks_AvailableLabel=Available tasks
-WorkProduct_Tasks_SelectedLabel=Mandatory input:
-WorkProduct_Tasks_SelectedLabel2=Optional input:
-WorkProduct_Tasks_SelectedLabel3=Output:
-WorkProduct_Tasks_MultipleSelectDescription={0} tasks have been selected.
-
-# Work Product Editor Roles Page
-workProductRolesPage_sectionName=Roles
-workProductRolesPage_sectionDescription=The following roles are responsible for or modify this work product.
-workProductRolesPage_availableLabel=Available roles
-workProductRolesPage_selectedLabel=Responsible role:
-workProductRolesPage_selectedLabel2=Modifying roles:
-workProductRolesPage_multipleSelectDescription={0} roles have been selected.
-
-## Work Product Editor Deliverable Parts Page
-workProductDeliverablePartsPage_sectionName=Deliverable Parts
-workProductDeliverablePartsPage_sectionDescription=Specify the work products that constitute this deliverable.
-workProductDeliverablePartsPage_availableLabel=Available work products as deliverable parts:
-workProductDeliverablePartsPage_selectedLabel=Work products as deliverable parts:
-workProductDeliverablePartsPage_multipleSelectDescription={0} work products have been selected.
-
-# Work Product Editor Guidance Page
-workProductGuidancePage_sectionName=Guidance
-workProductGuidancePage_sectionDescription=Provide links to additional information in the form of guidance.
-workProductGuidancePage_availableLabel=Available Guidance:
-workProductGuidancePage_selectedLabel=Guidance:
-workProductGuidancePage_multipleSelectDescription={0} guidances have been selected.
-
-# Work Product Editor Categories Page
-workProductCategoriesPage_sectionName=Categories
-workProductCategoriesPage_sectionDescription=Manage the categories to which this work product belongs.
-workProductCategoriesPage_availableLabel=Domains
-workProductCategoriesPage_availableLabel2=Work Product Kinds:
-workProductCategoriesPage_availableLabel3=Custom Categories:
-workProductCategoriesPage_selectedLabel=Domain:
-workProductCategoriesPage_selectedLabel2=Work product kinds:
-workProductCategoriesPage_selectedLabel3=Custom categories:
-workProductCategoriesPage_multipleSelectDescription={0} categories have been selected.
-
-# Practice Editor References Page
-practiceReferencesPage_sectionName=Content Elements
-practiceReferencesPage_sectionDescription=Specify the content elements referenced by this practice.
-practiceReferencesPage_availableLabel=Available content elements:
-practiceReferencesPage_selectedLabel=Content elements:
-practiceReferencesPage_multipleSelectDescription={0} Content elements have been selected.
-
-# Category Editor Guidance Page
-categoryGuidancesPage_sectionName=Guidance
-categoryGuidancesPage_sectionDescription=Manage the guidances that belong to this {0}.
-categoryGuidancesPage_availableLabel=Available guidance:
-categoryGuidancesPage_selectedLabel=Guidance:
-categoryGuidancesPage_multipleSelectDescription={0} guidances have been selected.
-
-# Discipline Grouping Editor Disciplines Page
-disciplineGroupingDisciplinesPage_sectionName=Disciplines
-disciplineGroupingDisciplinesPage_sectionDescription=Manage the disciplines that belong to this discipline grouping.
-disciplineGroupingDisciplinesPage_availableLabel=Available Disciplines:
-disciplineGroupingDisciplinesPage_selectedLabel=Disciplines:
-disciplineGroupingDisciplinesPage_multipleSelectDescription={0} Disciplines have been selected.
-AuthoringUIPlugin_AbstractNewLibraryPage_UseDefaultDirectoryButtonLabel=Use default directory
-
-# Discipline Editor Tasks Page
-disciplineTasksPage_sectionName=Tasks
-disciplineTasksPage_sectionDescription=Manage the tasks that belong to this discipline.
-disciplineTasksPage_availableLabel=Available tasks:
-disciplineTasksPage_selectedLabel=Tasks:
-disciplineTasksPage_multipleSelectDescription={0} tasks have been selected.
-
-# Discipline Editor Reference Workflow Page
-disciplineReferenceWorkflowPage_sectionName=Reference Workflows
-disciplineReferenceWorkflowPage_sectionDescription=Manage the reference workflows that belong to this discipline.
-disciplineReferenceWorkflowPage_availableLabel=Available Reference Workflows:
-disciplineReferenceWorkflowPage_selectedLabel=Reference workflows:
-disciplineReferenceWorkflowPage_multipleSelectDescription={0} Reference workflows have been selected.
-
-# Domain Editor Work Products Page
-domainWorkProductsPage_sectionName=Work Products
-domainWorkProductsPage_sectionDescription=Manage the work products that belong to this domain.
-domainWorkProductsPage_availableLabel=Available work products:
-domainWorkProductsPage_selectedLabel=Work products:
-domainWorkProductsPage_multipleSelectDescription={0} work products have been selected.
-
-# Work Product Kind Editor Work Products Page
-workProductTypeWorkProductsPage_sectionName=Work Products
-workProductTypeWorkProductsPage_sectionDescription=Manage the work products that belong to this work product kind.
-workProductTypeWorkProductsPage_availableLabel=Available work products:
-workProductTypeWorkProductsPage_selectedLabel=Work products:
-workProductTypeWorkProductsPage_multipleSelectDescription={0} work products have been selected.
-
-# Role Set Grouping Editor Role Sets Page
-roleSetGroupingRoleSetsPage_sectionName=Role Sets
-roleSetGroupingRoleSetsPage_sectionDescription=Manage the role sets that belong to this role set grouping.
-roleSetGroupingRoleSetsPage_availableLabel=Available Role Sets:
-roleSetGroupingRoleSetsPage_selectedLabel=Role sets:
-roleSetGroupingRoleSetsPage_multipleSelectDescription={0} Role Sets have been selected.
-
-# Role Set Editor Roles Page
-roleSetRolesPage_sectionName=Roles
-roleSetRolesPage_sectionDescription=Manage the roles that belong to this role set.
-roleSetRolesPage_availableLabel=Available roles:
-roleSetRolesPage_selectedLabel=Roles:
-roleSetRolesPage_multipleSelectDescription={0} roles have been selected.
-
-# Tool Editor Tool Mentors Page
-toolToolMentorsPage_sectionName=Tool Mentors
-toolToolMentorsPage_sectionDescription=Manage the tool mentors that belong to this tool.
-toolToolMentorsPage_availableLabel=Available tool mentors:
-toolToolMentorsPage_selectedLabel=Tool mentors:
-toolToolMentorsPage_multipleSelectDescription={0} Tool Mentors have been selected.
-
-# Custom Category Editor Assign Page
-customCategoryAssignPage_sectionName=Content Elements
-customCategoryAssignPage_sectionDescription=Manage the content elements that constitute this custom category.
-customCategoryAssignPage_availableLabel=Available Content Elements:
-customCategoryAssignPage_selectedLabel=Content elements:
-customCategoryAssignPage_multipleSelectDescription={0} Content Elements have been selected.
-
-# New Method Plug-in Wizard
-newPluginWizard_title=New Method Plug-in
-newPluginWizardPage_title=Create a new method plug-in
-newPluginWizardPage_text=Specify a name and provide general information about the new method plug-in.
-newPluginError_msg=IUPA0021E: Failed to create the method plug-in.
-newPluginError_reason=Internal error.\n\nClick Details for more information.
-
-# Preference Pages
-methodLibraryGroup_text=Method library
-defaultPathLabel_text=Default path:
-modelingGroup_text=Modeling
-userInterfaceGroup_text=User interface
-debugGroup_text=Debug
-enableLibraryValidationCheckbox_text=Enable method library validation
-invalidPreferenceHistorySizeError_msg=Preference history size must be an integer with value ranging from {0} to {1}.
-
-# Generic dialog titles
-createDialog_title=Create Element
-deleteDialog_title=Delete Element
-editDialog_title=Edit Element
-errorDialog_title=Error
-moveDialog_title=Move Element
-renameDialog_title=Rename Element
-warningDialog_title=Warning
-
-# Add Configuration to Process Error Dialog
-addConfigErrorDialog_title=Add Configuration to Process
-
-# Set Default Configuration Error Dialog
-setDefaultConfigErrorDialog_title=Set Default Configuration for Process
-
-# Edit Process Error Dialog
-editProcessElementErrorDialog_title=Edit Process Element
-
-# Open Library Dialog
-openLibraryDialog_title=Open Method Library
-openLibraryDialog_text=The current method library was not saved properly. Do you want to ignore the error and proceed to open another library?
-
-# Save Library Dialog
-saveLibraryDialog_title=Save Method Library
-saveLibraryDialog_text=The current method library has been modified. Do you want to save the changes?
-
-# Upgrade Library Dialog
-upgradeLibraryDialog_title=Upgrade Method Library
-
-# Delete Element Reference Dialog
-deleteAssociationDialog_text=The element ''{0}'' has already been deleted. Do you want to remove it from ''{1}''?
-
-# Error Messages
-noOpenLibraryError_msg=IUPA0000E: No open method library.\n\nA method library must be opened before a new method element can be added.\n\nCreate a new method library or open an existing one and try again.
-emptyElementNameError_msg=IUPA0001E: The {0} name is missing.\n\nAll method and process elements must have a name.\n\nClick OK and enter a valid name for the element.
-duplicateElementNameError_msg=IUPA0002E: The name ''{0}'' already exists.\n\nA method element must have a unique name.\n\nClick OK and enter a different name for the element.
-createConfigError_msg=IUPA0003E: The method configuration cannot be created.
-deleteConfigError_msg=IUPA0004W: The method configuration cannot be deleted.
-internalError_msg=IUPA0005E: An internal error has occurred.\n\nClick Details for more information.
-invalidPresentationNameError_msg=IUPA0006E: The specified presentation name is invalid.\n\nClick OK and enter a different name.
-invalidConfigError_msg=IUPA0007E: The selected method configuration ''{0}'' is not a subset of the process''s default configuration.\n\nIn order to maintain the integrity of a process, its default configuration must be a superset of all other configurations associated with the process.\n\nSelect another configuration or modify the default configuration to include the content of the selected configuration and try again.
-setDefaultConfigError_msg=IUPA0008E: The selected method configuration ''{0}'' is not a superset of the other configurations referenced by the process.\n\nIn order to maintain the integrity of a process, its default configuration must be a superset of all other configurations associated with the process.\n\nSelect another configuration or modify the content of the selected configuration and try again.
-openLibraryError_msg=IUPA0009E: The method library cannot be loaded.\n\nClick Details for more information.
-saveLibraryError_msg=IUPA0010E: The method library cannot be saved.
-saveLibraryToError_msg=IUPA0010E: The method library cannot be saved to ''{0}''.
-elementAlreadyDeletedError_msg=IUPA0011E: The element ''{0}'' has already been deleted.
-upgradeLibraryError_msg=IUPA0012E: The method library cannot be upgraded.
-openConfigWizardError_msg=IUPA0016E: The New Method Configuration wizard cannot be opened.
-
-# Error Reasons
-error_reason=An error has occurred.\n\nClick Details for more information.
-internalError_reason=An internal error has occurred.\n\nClick Details for more information.
-upgradeLibraryError_reason=IUPA0018E: An error has occurred while loading the method library elements.\n\nClick Details for more information.
-saveUpgradedLibraryError_reason=IUPA0019E: An error has occurred while saving the upgraded method library.\n\nClick Details for more information.
-
-configurationPage_QuickfixError_reason1=IUPA0020W:Unable to fix the problem for element ''{0}'' since it is in a subtracted category. \n\n You need to manually remove the element from the subtracted category.
-configurationPage_quickfixError_title=Quick Fix
-
-# Progress Messages
-openingLibraryTask_name=Opening method library...
-savingLibraryTask_name=Saving method library ...
-upgradingLibraryTask_name=Upgrading method library...
-loadingLibraryElementsTask_name=Loading method library elements...
-savingUpgradedElementsTask_name=Saving method library elements in new file format...
-savingTask_name=Saving ''{0}''...
-savingFilesTask_name=Saving files...
-fixingContentDescriptionGUIDsTask_name=Fixing content description GUIDs...
-deletingInvalidReferencesTask_name=Deleting invalid references...
-
-
-# Add Editor To Browsing Perspective Warning Dialog
-addEditorToPerspectiveWarning_msg=IUPA0046W: This perspective has been specially designed to maximize your user experience of browsing the HTML representation of the method library elements. No editor can be added or displayed here.
-
-# Change History Dialog
-ChangeHistoryDialog_title=Change Description History
-ChangeHistoryDialog_label=Change history:
-
-# Method Element Delete Action
-confirmDeleteDialog_title=Confirm Deletion
-confirmDeleteDialog_msg=Are you sure you want to delete ''{0}''?
-confirmDeleteDialog_msgWithReference=Are you sure you want to delete ''{0}''?\n\nThe following element(s) contain references to the item(s) to be deleted: {1}
-
-# New Library Dialog
-errorDialog_message=IUPA0022E: The  method library ''{0}'' cannot be created.
-errorDialog_error=Cannot create a method library within another method library.
-err_noopenlibrary=IUPA0040E: No open method library.\n\nA method library must be opened before a new method plug-in can be added.\n\nCreate a new method library or open an existing one and try again.
-err_loadinglibrary=Error loading library
-msg_reloadLibrary=Error undoing the failed deletion. The current method library needs to be reloaded.
-
-# Reload Library Dialog
-reloadDialog_message=The library needs to be reloaded to restore its original state.
-reloadDialog_title=Reload Library
-dialogs_MoveDialog_errorTitle=Move Error
-dialogs_MoveDialog_errorMessage=Error during move
-
-# Process Form Editor
-processFormEditorSaveDialog_title=Save
-processFormEditorSaveDialog_message1=This change will affect all diagrams in your process. The editor will be saved after your change. Do you want to continue?
-processFormEditorSaveDialog_message2=The editor will be saved after your change. Do you want to continue?
-
-# Configuration View Page
-configViewPageRemoveViewDialog_title=Confirm Removing
-configViewPageRemoveViewDialog_message=Are you sure you want to remove view ''{0}''?
-configViewPageViewExistsDialog_title=Warning
-configViewPage_configuration=Configuration:
-configViewPage_configurationViews=Configuration Views
-configViewPage_views=Views
-columnselection_text=Column selection:
-configViewPage_addViewButtonText=Add View...
-configViewPage_removeViewButtonText=Remove View
-configViewPage_makeDefaultButtonText=Make Default
-configViewPageViewExistsDialog_message=IUPA0023W: View with name ''{0}'' already exists.
-configViewPage_configurationViewSectionTitle=Published Navigation Views
-configViewPage_configurationViewSectionMessage=Specify the views that will be included when this configuration is published. To create a view, click Add View to select any standard or custom category within the configuration.  The selected category will represent the view and the category's sub-categories and content elements will represent the view's tree elements.
-
-# Description Tab
-descriptionTabGuidanceWarningDialog_title=Convert Guidance
-descriptionTabGuidanceWarningDialog_message1=IUPA0040W:  Please save the editor first.
-descriptionTabGuidanceWarningDialog_message2=There are no compatible guidance for this type.
-
-changeActivityTypeWarningDialog_title=Convert Activity
-# Association Form Page
-AssociationFormPage_BriefDescriptionLabel=Brief description of selected element:
-
-# Method Element Description
-methodElementDescriptionEmptyNameDialog_title=Enter Element Name
-methodElementDescriptionEmptyNameDialog_message=The name field cannot be empty.
-
-# Method Plug-in Description
-methodPluginDescriptionRemoveRefConfirm_message=Deselecting the referenced plug-in(s) associated with plug-in ''{0}'' will produce invalid relationships that will be deleted.\n\nThis action cannot be undone. Do you want to proceed with this change?
-methodPluginDescriptionPage_confirmRename=You are about to change the name of this method plug-in from ''{0}'' to ''{1}''. This action will save and close any open editors of elements belonging to this plug-in and rename the plug-in folder to the new name. Do you want to continue?
-methodPluginDescriptionPage_confirmRename_title=Rename Method Plug-in
-methodPluginDescriptionPage_cannotRenamePluginFolder=Could not rename plug-in folder to new name
-methodPluginDescriptionPage_lockPluginLabel=Lock plug-in
-methodPluginDescriptionPage_lockPlugin_message=Changing the lock state of this plug-in ''{0}'' will save and close any open editors of elements belonging to it. Do you want proceed with this change?
-
-# Process Description
-processDescriptionNameChangeConfirm_title=Rename
-processDescriptionNameChangeConfirm_message=You are about to change the name of this process. This will save this editor and rename the process folder to the new name. Do you want to continue?
-processDescription_configurationDescription=Description:
-processDescription_configurationSectionTitle=Configuration
-processDescription_configurationSectionMessage=Specify all the configurations valid for this process. Select one configuration as the default and it needs to be a super-set of all the other configurations.
-processDescription_configurations=Configurations:
-processDescription_default=(default)
-ProcessDescription_selectConfiguration=Select the configurations to add
-ProcessDeleteAction_deletecofirm_text0=This will save the current editor and the change will be permanent. Are you sure you want to delete ''{0}''?
-ProcessDeleteAction_selectDescriptorsToDelete=The following descriptors are not used anywhere after deletion of the selected elements.\nSelect descriptors you want to delete.
-
-# View Helper
-viewHelperHealthCheckDialog_title=Library Health Check
-viewHelper_performHealthCheck=Performing health check on library...
-viewHelperHealthCheckDialog_message=The health check on open library is successfully completed. See the report in the log file.
-
-# Attach Guidance File Dialog
-attachGuidanceFileDialog_title=Attach File
-
-# Create Element Error Dialog
-createElementDialog_title=Create New {0}
-createNewElementError_msg=Error creating new {0}.
-
-dlgTitle_reloadLibrary=Reload Library
-createElementError_reason=The {0} name cannot be empty.\n\nSpecify a valid name and try again.
-deleteConfigError_reason=The configuration is referenced by process ''{0}''
-
-# ChangeBoundsCommand
-gef_changeBoundsCommand_label=Change Bounds
-# ChangeNameCommand
-gef_changeNameCommand_label=Change Name
-gef_changeNameCommand_undoMessage=Cannot undo the name change.\n\nUndo name change is not allowed if previous name is null.
-# ChangePropertyValueCommand
-gef_changePropertyValueCommand_label=Change Property Value
-# CreateBendpointCommand
-gef_createBendpointCommand_label=Create Bendpoint
-# CreateLinkCommand
-gef_createLinkCommand_label=Link Creation
-# CreateNodeCommand
-gef_createNodeCommand_label=Create New Node
-# DeleteBendpointCommand
-gef_deleteBendpointCommand_label=Delete Bendpoint
-# DeleteCommand
-gef_deleteCommand_label=Delete
-# DeleteLinkCommand
-gef_deleteLinkCommand_label=Delete Connection
-# MoveBendpointCommand
-gef_moveBendpointCommand_label=Move Bendpoint
-# ReconnectLinkCommand
-gef_reconnectLinkCommand_label=Reconnect Link
-
-# ValidatingDirectEditManager
-gef_validatingDirectEditManager_bringDownPrompt=The name cannot be empty. Please specify a valid name.
-# ValidatingFreeTextEditManager
-gef_validatingFreeTextEditManager_bringDownPrompt=The name cannot be empty. Please specify a valid name.
-# WorkProductNodeEditPart
-gef_workProductNodeEditPart_validateMessage=The name cannot be empty. Please specify a valid name.
-
-# ElementsViewDeleteAction
-actions_ElementsViewDeleteAction_message=The configuration ''{0}'' cannot be deleted since it is still in use by process ''{1}''.
-
-# LibraryActionBarContributor
-actions_LibraryActionBarContributor_deleteErrorTitle=Delete Error
-actions_LibraryActionBarContributor_deleteErrorMessage=Unhandled exception
-actions_LibraryActionBarContributor_deleteErrorReason=See details
-
-# MethodElementEditor
-editors_MethodElementEditor_saveErrorTitle=Save Error
-editors_MethodElementEditor_saveErrorMessage1=IUPA0020E: Error saving file
-editors_MethodElementEditor_saveErrorMessage2=Commit Error
-editors_MethodElementEditor_saveErrorReason1=See log file for more details
-editors_MethodElementEditor_saveErrorReason2=See details
-editors_MethodElementEditor_renameErrorTitle=Rename Error
-editors_MethodElementEditor_invalidEditorMsg=One or many files of this editor have been removed. The editor is no longer valid and has to close.
-editors_MethodElementEditor_invalidEditorTitle=Invalid Editor
-editors_MethodElementEditor_renameErrorMessage1=Error renaming file(s) ''{0}''
-
-# DescriptionFormPage
-renameError_title=Rename Element
-renameError_msg=IUPA0013E: The rename operation cannot be completed.
-SelectElementDialog_selectelement_text=Select Element
-
-# EditorChooser
-editors_EditorChooser_systemErrorDialog_title=Open Method Editor
-AuthoringUIPlugin_AbstractNewLibraryPage_DescriptionLabel=Description:
-AuthoringUIPlugin_SaveAllEditorsPage_SelectAllButtonLabel=Select All
-OpenElementWorkbenchActionDelegate_edit_text0=Edit Element
-editors_EditorChooser_systemErrorDialog_message=IUPA0023E: Cannot open the editor associated with the selected Method element.
-DescriptionFormPage_IconFileChooserDialog_title=Select Image File
-AuthoringUIPlugin_AbstractNewLibraryPage_DefaultLibraryName=New Library
-AuthoringUIPlugin_NewConfigurationMainPage_DescriptionLabel=Description:
-AuthoringUIPlugin_OpenConfigurationMainPage_pageDescription=Select one or more method configurations and click Finish to open them.
-AuthoringUIPlugin_SaveAllEditorsPage_DeselectAllButtonLabel=Deselect All
-ElementsView_migration_dir_dlg_description_text=Specify the directory of newly migrated {0} to replace the selected {0}
-editors_EditorChooser_systemErrorDialog_reason=A system error has occurred. Click Details for more information.\n\nClose some of the opened editors and try again.
-
-# DescriptionFormPage
-forms_DescriptionFormPage_imageTooBigDialog_title=Image is invalid
-forms_DescriptionFormPage_imageTooBigDialog_template=IUPA0031E: The selected image ''{0}'' is larger than the allowed size ({1} by {2}). Please select another image.
-forms_DescriptionFormPage_imageNotFoundDialog_title=Image is invalid
-forms_DescriptionFormPage_imageNotFoundDialog_template=IUPA0032E: The selected file ''{0}'' does not exist. Please select another image.
-DescriptionFormPage_ShapeIconPreview_SelectButtonLabel=Select...
-AuthoringUIPlugin_AbstractNewLibraryPage_DefaultLibraryDescription=Method library description
-AuthoringUIPlugin_NewConfigurationMainPage_DefaultBriefDescription=Method configuration description
-AuthoringUIPlugin_SaveAllEditorsPage_saveAndClosePageDescription=All editors must be closed. Select the ones that need to be saved first, if applicable.
-
-# TemplateDescriptionPage
-forms_GuidanceWithAttachmentsDescriptionPage_alreadyAttached_msg=The selected file is already an attachment to this Guidance.
-forms_GuidanceWithUrlAttachmentsDescriptionPage_alreadyAttached_msg=The selected URL is already an attachment to this Guidance.
-
-# New Library Error Dialog
-newLibraryError_msg=IUPA0014E: Unable to create the method library.
-newLibraryInternlError_reason=An internal error has occurred.
-newLibraryError_reason1=The specified method library path ''{0}'' is invalid.
-newLibraryError_reason2=A method library already exists in ''{0}''.
-newLibraryError_reason3=The specified method library folder ''{0}'' cannot be created.
-newLibraryError_advice=Select OK to specify another method library path.
-
-#Process literals
-Process_ExternalID=External ID:
-Process_Purpose=Purpose:
-Process_Scope=Scope:
-Process_UsageNotes=Usage Notes:
-Process_Alternatives=Alternatives:
-Process_HowToStaff=How to Staff:
-Process_KeyConsideration=Key Considerations:
-Process_Scale=Scale:
-Process_ProjectCharacteristics=Project Characteristics:
-Process_RiskLevel=Risk Level:
-Process_EstimatingTechnique=Estimating Techniques:
-Process_ProjectMemberExpertise=Project Member Expertise:
-Process_TypeOfContract=Type Of Contract:
-
-# Editor Preview Navigation Buttons
-backButton_text=Back
-forwardButton_text=Forward
-forward_text=Forward
-stopButton_text=Stop
-refreshButton_text=Refresh
-refresh_text=Refresh
-newname_text=New name:
-printButton_text=Print
-
-# Context menus
-_UI_RefreshViewer_menu_item=&Refresh
-_UI_ShowPropertiesView_menu_item=&Show Properties
-
-_UI_MethodEditor_menu=&Method Editor
-_UI_CreateChild_menu_item=&New
-_UI_CreateSibling_menu_item=N&ew Sibling
-
-_UI_SelectionPage_label=Selection
-_UI_ParentPage_label=Parent
-_UI_ListPage_label=List
-_UI_TreePage_label=Tree
-_UI_TablePage_label=Table
-_UI_TableTreePage_label=TableTree
-_UI_ObjectColumn_label=Object
-_UI_SelfColumn_label=Self
-
-_UI_NoObjectSelected=Selected Nothing
-_UI_SingleObjectSelected=Selected Object: {0}
-_UI_MultiObjectSelected=Selected {0} Objects
-
-_UI_OpenEditorError_label=Open Editor
-
-_UI_Wizard_category=Example EMF Model Creation Wizards
-
-_UI_MethodModelWizard_label=Method Model
-_UI_MethodModelWizard_description=Create a new Method model
-
-_UI_MethodEditor_label=Method Model Editor
-
-_UI_MethodEditorFilenameDefaultBase=My
-_UI_MethodEditorFilenameExtension=method
-
-_UI_Wizard_label=New
-
-_WARN_FilenameExtension=The filename must end in ''.{0}''
-
-_UI_ModelObject=Model Object
-_UI_XMLEncoding=XML Encoding
-_UI_XMLEncodingChoices=UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1
-_UI_Wizard_initial_object_description=Select a model object to create
-
-_UI_FileConflict_label=File Conflict
-_WARN_FileConflict=There are unsaved changes that conflict with changes made outside the editor. Do you wish to discard this editor's changes?
-
-# Add Link Dialog
-addLinkDialog_linkType=Type:
-openLinkCheckbox_text=Open link in a separate browser window
-
-# Add Image Dialog
-heightLabel_text=Height:
-widthLabel_text=Width:
-ElementsView_20=capability pattern
-ElementsView_21=delivery process
-ElementsView_22=process
-ElementsView_35={0} is read-only. Make it writable before continuing.
-ElementsView_36=Error loading library
-altTagLabel_text=ALT tag:
-imageSizeLabel_text=Height and width of image must be at least 10 and no more than 600. Invalid height and width will be converted to a suitable size.
-
-# Process Editor
-ProcessEditor=ProcessEditor
-ProcessEditor_Name=Name
-ProcessEditor_PresentationName=Presentation Name
-ProcessEditor_Index=Index
-ProcessEditor_Predecessors=Predecessors
-#ConfigurationPage_Selected=Selected: 
-ChecklistOrder_description=Select a check item and click Up or Down to change its order.
-ElementsView_renaming_text=Renaming...
-ProcessEditor_ModelInfo=Model Info
-ProcessEditor_Prefix=Prefix
-MoveDialog_move_text=Move
-ChecklistOrder_title=Order Check Items
-ProcessEditor_Repetable=Repeatable
-ProcessEditor_Ongoing=Ongoing
-ProcessEditor_Action_Synchronization=Synchronize...
-ProcessEditor_EventDriven=Event-Driven
-ProcessEditor_Deliverable=Deliverable
-ProcessEditor_Optional=Optional
-FilterDialog_Type_text=Method Element Type:
-FilterDialog_ExpandAll=Expand All
-MoveDialog_moving_text=Moving...
-DescriptionFormPage_LoadShapeIconWarning=IUPA0025W: Shape icon for {0} is not found in path: {1}
-DescriptionFormPage_LoadShapeIconError=IUPA0025E: Error: Shape icon section: {0}
-AuthoringUIPlugin_AbstractNewLibraryPage_NameLabel=Name:
-AuthoringUIPlugin_NewConfigurationMainPage_pageTitle=Create a new method configuration
-AuthoringUIPlugin_NewConfigurationMainPage_NameLabel=Name:
-AuthoringUIPlugin_newConfigurationWizard_title=New Method Configuration
-newConfigurationWizard_title=New Method Configuration
-preference_WorkBreakdownElements=Phase, Iteration, Activity and Milestone
-preference_DescriptorElements=Role, Task and Work Product Descriptor
-preference_breakDownElement_Description=The following attributes will be selected by default in the process editor:
-preference_Activity_Diagram=Activity Diagram 
-preference_Activity_Detail_Diagram=Activity Detail Diagram
-
-# New Method Library Wizard
-newLibraryWizard_title=New Method Library
-newLibraryWizardMainPage_title=Create a new method library.
-newLibraryWizardMainPage_description=Specify a path and description for the new method library.
-#newLibraryWizardMainPage_description_1=Specify a name, description and storage type for the new method library.
-libraryPathLabel_text=Path:
-libraryTypeLabel_text=Type:
-
-AuthoringUIPlugin_SaveAllEditorsPage_saveTitle=Save changes
-AuthoringUIPlugin_SaveAllEditorsPage_saveDescription=One or more method elements have been modified. Select the ones that need to be saved.
-AuthoringUIPlugin_OpenConfigurationMainPage_pageTitle=Open Method Configurations
-AuthoringUIPlugin_OpenConfigurationWizard_windowTitle=Open Method Configurations
-ElementsView_replaceingwithformat_text=Replacing {0}...
-DescriptionFormPage_LoadNodeIconWarning=IUPA0026W: Node icon for {0} is not found in path: {1}
-#MessageLabelProvider_unselectedpackages=''{0}'' contains elements that reference elements in unselected packages
-DescriptionFormPage_LoadNodeIconError=IUPA0026E: Error: Node icon section: {0}
-StepsOrderDialog_steps=Steps: 
-StepsOrderDialog_title=Order Task Steps
-ProcessEditor_Planned=Planned
-specifydirectory_text=Please specify a directory to save the method library to
-ProcessEditor_MultipleOccurrences=Multiple Occurrences
-ProcessEditor_EntryState=Entry State
-ProcessEditor_ExitState=Exit State
-selectColumnstoAdd_text=Select the columns to add
-ProcessEditor_Type=Type
-ProcessEditor_Team=Team
-FilterDialog_title=Select Dialog: 
-
-ProcessEditor_Action_Add=&Add from Method Content...
-FilterDialog_CollapseAll=Collapse All
-OpenCheatsheetView_title=Open CheatSheet View
-ProcessEditor_Action_RollUp=R&oll Up
-ProcessEditor_Action_RollDown=R&oll Down
-ProcessEditor_Action_MoveUp=&Move Up
-ProcessEditor_Action_MoveDown=Move Do&wn
-ProcessEditor_Action_Indent=&Indent
-ProcessEditor_Action_Outdent=&Outdent
-ProcessEditor_Action_Reveal=Reve&al
-ProcessEditor_Reveal_Title=Reveal
-ProcessEditor_Action_Copy=&Copy...
-FilterDialog_Pattern_text=Name patterns (matching names will be shown): 
-ProcessEditor_Action_Preferences=Preference&s...
-MethodLibraryEditor_title=Method Library: 
-#MessageView_selected_text=Selected: 
-MessageView_errmsg_text=Description
-ElementsView_err_saving=IUPA0027E: Error saving ''{0}''{1}
-
-err_copying_file_title=Error copying file
-err_copying_file_error=IUPA0028E: The icon could not be assigned. 
-err_copying_file_reason=An error occurred while copying the selected file. Click Details for more information.
-err_processing_file_title=Error processing file
-editConfiguration_tooltip=Edit configuration
-editDialog_msgCannotEdit=IUPA0015E: Cannot edit element
-SaveThisAction_saveobject=Save This Object...
-ElementsView_replace_text=Replace
-ProcessEditor_Action_Extend=&Extend...
-MoveDialog_destination_text=Choose destination for selected element(s):
-chooseDefaultDirectory_text=Choose a default directory for libraries:
-ProcessEditor_Action_Suppress=&Suppress
-ProcessEditor_Action_Suppress2=&Publishing Options...
-ProcessEditor_Action_AssignUserDiagram=&User Defined Diagrams...
-UserDefinedDiagramDialog_title=Assign user defined diagrams
-UserDefinedDiagramDialog_adImage=Activity Diagram:
-UserDefinedDiagramDialog_addImage=Activity Detail Diagram:
-UserDefinedDiagramDialog_wpdImage=Work Product Dependency Diagram:
-UserDefinedDiagramDialog_notaFile=IUPA0004E: The specified path is not a file.
-UserDefinedDiagramDialog_assignButton=Select...
-UserDefinedDiagramDialog_enteredImageNotFound=IUPA0024E: The specified image does not exist in the library. Make sure you enter the path relative to the library's root directory.
-UserDefinedDiagramDialog_selectedImageNotFound=IUPA0030E: The image you selected is not in the library.
-UserDefinedDiagramDialog_useADImage=Use Activity diagram image for browsing and publishing
-UserDefinedDiagramDialog_useADDImage=Use Activity detail diagram image for browsing and publishing
-UserDefinedDiagramDialog_useWPDImage=Use Work product dependency diagram image for browsing and publishing
-ProcessEditor_Action_Contribute=&Local Contribution
-ProcessEditor_Action_Replace=Local Replacemen&t
-ProcessEditor_Action_Diagrams=Dia&grams
-ProcessEditor_action_deepCopy=&Deep Copy...
-FilterDialog_BriefDescription=Brief Description:
-ConfigurationPage_hideToolTip=Show/Hide Unchecked Elements
-ConfigurationPage_Description=Description:
-ProcessEditor_Action_SuppressAll=Publish &None
-FilterDialog_Pattern_description=Patterns are separated by comma, where *=any string, ?=any character
-ConfigurationPage_TreeTitleLabel=Content:
-ConfigurationPage_LoadingMessage=Loading configuration, please wait ...
-ConfigurationPage_AddCategoriesTitleLabel=Add these Categories:
-ConfigurationPage_SubCategoriesTitleLabel=Subtract these Categories:
-MoveDialog_validdestination_text=The specified move destination is invalid.
-MoveDialog_cannotModifyDestination=IUPA0034E: The selected destination cannot be modified.
-ProcessEditor_Action_RevealAll=Publish A&ll
-ProcessEditor_Action_OpenBaseActivity=Open &Base Activity
-ProcessFormEditor_expanAllActionLabel=E&xpand All
-ProcessFormEditor_collapseAllActionLabel=Co&llapse All
-ProcessEditor_Action_OpenActivityDiagram=Open &Activity Diagram
-ProcessEditor_promptToDeleteBeforeReveal=The unsuppressed descriptors listed in Details must be deleted to avoid duplication after revealing the selected elements. Click OK if you want to delete them and continue.
-ProcessEditorPreferencePage_SelectColumns=Select the columns to add
-ProcessEditor_Action_OpenActivityDetailDiagram=Open Activity &Detail Diagram
-ProcessEditorPreferencePage_ColumnSelection=Column selection:
-ProcessEditorPreferencePage_switchConfiguration=Switch to the Process' default configuration when activating a Process editor
-ProcessEditorPreferencePage_suppressionGroupTitle=Suppression
-ProcessEditorPreferencePage_inheritSuppressionState=Inherit suppression states
-ProcessEditor_Action_OpenWorkProductDependencyDiagram=Open &Work Product Dependency Diagram
-DescriptionFormPage_ShapeIconPreview_ClearButtonLabel=Clear
-DescriptionFormPage_NodeIconPreview_SelectButtonLabel=Select...
-ProcessEditor_Action_InsertNewPhase=Insert New Phase
-ViewHelper_reloadLibOnRollbackError=Could not recover from a persistence error. The library needs to be reloaded to restore its original state.
-ViewHelper_alreadydeleted_text=The element ''{0}'' is already deleted.
-ViewHelper_alreadydeletedconfirm_text=The element ''{0}'' is already deleted. Do you want to remove it from ''{1}''?
-ConfigurationPage_AddMissingToolTip=Fix errors and warnings
-ConfigurationDescriptionDescription=Description
-ConfigurationDescriptionGeneralInfo=General Information 
-ProcessEditor_Action_ApplyPattern=Apply Pa&ttern
-MoveDialog_selectdestination_text=Please select a destination.
-MoveDialog_nomove_destination_problem_msg=No move destination specified.
-MethodLibraryEditor_troubleobject=. Trouble object: 
-MessageLabelProvider_errchildpkgs=A child content package or process contains elements with missing references
-ProcessEditor_SuppressDialog_Title=Diagram Publishing Options
-ProcessEditor_SuppressDialog_Message=Please select the diagram(s) to publish or deselect to not publish
-ProcessEditor_Title=Process Editor: 
-SaveAswithdots_text=Save As...
-ProcessEditor_WorkBreakdownStructure=Work Breakdown Structure
-ProcessEditor_TeamAllocation=Team Allocation
-ProcessEditor_WorkProductUsage=Work Product Usage
-ProcessEditor_ConsolidatedView=Consolidated View
-ProcessEditor_confirmAutoSynch=This operation refreshes the selected descriptors or all descriptors below the selected activities that have been marked as "Synchronized with source" in the General tab of their Properties view.  It refreshes these descriptors with the original properties of the linked method content elements under the process' default configuration.  Note that it will not update any dynamically linked (green italic) descriptors.  Do you want to proceed?
-ProcessEditor_defaultSynchronization=Default Synchronization from method content
-ConfigurationPage_Description1=Configuration
-ConfigurationPage_Description2=Plug-in and Package Selection
-NewLibraryDialog_newlibrary_as=Create New Library As
-NewPluginDialog_newplugin_text=New Method Plug-in
-SelectElementDialog_title_text=Select the element or one of its contributors:
-OpenConfigDialognewconfig_text=New Configuration:
-processBreakdownStructureFormPage_BSEditor=Process Editor
-
-# AbstractDiagramEditor
-AbstractDiagramEditor_alignMenu_text=Align
-AbstractDiagramEditor_refreshFromBaseActivity_text=Refresh from Base Activity
-AbstractDiagramEditor_formatTextBoxActivity_text=Format Text Box...
-AbstractDiagramEditor_hAlignAverageAction_text=Horizontally to Average
-AbstractDiagramEditor_hAlignFirstSelectedAction_text=Horizontally to First Selected
-AbstractDiagramEditor_vAlignAverageAction_text=Vertically to Average
-MethodLibraryDescriptionFormPage_section_title=General Information
-MoveDialog_invalid_move_destination_problem_msg=IUPA0041E: The selected element(s) cannot be moved to the specified destination.
-MethodLibraryEditor_savemodellibrary=Saving model library ...
-MethodLibraryEditor_error_dialog_title=Error
-MethodLibraryEditor_save_library_problem_msg=IUPA0033E: Problem encountered in saving library.
-MethodElementDeleteAction_deleteconfirm_text=Are you sure you want to delete ''{0}''?
-ContentElementsOrderDialog_ContentElement_text=Content Elements: 
-AuthoringUIPlugin_AbstractNewLibraryPage_BrowseButtonLabel=Browse...
-AuthoringUIPlugin_NewConfigurationMainPage_pageDescription=Specify a name and description for the new method configuration.
-AuthoringUIPlugin_SaveAllEditorsPage_saveAndClosePageTitle=Save changes and close all editors
-AbstractDiagramEditor_vAlignFirstSelectedAction_text=Vertically to First Selected
-AbstractDiagramEditor_Save_text=Save
-AttachmentDialogattachFile_text=Attach File
-AttachmentDialogattachUrl_text=Attach Url
-ConfigurationPage_ConfigContent=Configuration Content
-OpenConfigDialogopenconfig_text=Open Configuration
-ElementsView_replaceAction_text=Replace...
-AbstractDiagramEditor_Save_message=Saving {0}
-ConfigurationPage_ShowErrorToolTip=Show configuration errors
-ConfigurationDescriptionFormPrefix=Configuration: 
-ChecklistOrder_checklistitems_text=Check Items: 
-AbstractDiagramEditor_MoveNode_label=Move Node
-ConfigurationPage_MakeClosureToolTip=Fix errors
-ConfigurationOrderDialog_description=Order Navigation Views
-NewPluginDialog_referenceplugin_text=Reference Plug-ins:
-AbstractDiagramEditor_createFreeText_text=Create a Free Text
-DescriptionFormPage_NodeIconPreview_Label=Node Icon Preview:
-DiagramValidation_err_cannot_connect_text=IUPA0032W: Cannot connect
-DiagramValidation_err_samepredandsuc_text=IUPA0033W: Cannot have the same breakdown element as predecessor and successor
-
-# EditorChooser
-EditorChooser_loaddErrorDlgTitle=Open Editor
-EditorChooser_ResourcesError=This element has errors. It is recommended to fix these errors before continuing (see details).\n\nClick OK to continue without opening the editor. Close this dialog to open the editor.
-ConfigurationPage_FormPrefix=Configuration: 
-ConfigurationDescriptionName=Name:
-AttachmentDialogFileURL_text=File URL:
-StepsOrderDialog_description=Select a step and click Up or Down to change its order.
-MethodLibraryEditor_err_save=Error during saving
-MessageView_errelement_text=Referencing Element
-MessageView_refelement_text=Referenced Element
-
-#Activity Diagram
-ActivityDiagramEditor_createStartNode_text=Create a Start Node
-ConfigurationPage_ConfigContentDescription=Select the method plug-ins, content packages and processes that will be included in this configuration.
-ContentElementsOrderDialog_description_text=Order dialog
-AuthoringUIPlugin_AbstractNewLibraryPage_DirectoryLabel=Directory:
-RootPrefPage_enableprocesscontribution_text=Enable Process Contribution
-ConfigurationDescriptionDescription_text=Provide general information about this method configuration.
-ConfigurationDescriptionDescriptionLabel=Description:
-ConfigurationOrderDialog_NavigationViews=Navigation Views: 
-ContributionSelection_filterdialog_title=Choosing Contributors for ''{0}''
-ElementsView_openVariabilityDialogAction_text=&Open via variability elements
-VariabilitySelection_filterdialog_title=choosing variability elements for ''{0}''
-VariabilitySelection_filterdialog_viewerLabel=Variability elements for ''{0}''
-DescriptionFormPage_ShapeIconPreview_Label=Shape Icon Preview:
-DiagramValidation_err_cannot_delete_text=Cannot delete
-ActivityDiagramEditor_openActivityDetailDiagram_text=Open Activity Detail Diagram 
-MethodLibraryDescriptionFormPage_section_description=Provide general information about this method library.
-DescriptionFormPage_NodeIconPreview_ClearButtonLabel=Clear
-WPCompartmentFigure_0=New WorkProduct Descriptor
-promptfor_publish_unopen_activitydd_text=Publish activity detail diagrams that have not been created in process editor
-prompt_for_publish_extend_activity_diagram=Publish activity diagrams for unmodified activity extensions
-
-#ConfigProcessViewDialog
-ConfigProcessViewDialog_NamePattern=Name patterns (matching names will be shown):
-showInResourceNavigatorAction_label=&Show in Resource Navigator
-ConfigProcessViewDialog_Pattern=Patterns are separated by comma, where *=any string, ?=any character
-err_processing_file_description=IUPA0029E: An error occurred while processing the selected file. Click Details for more information.
-ConfigProcessViewDialog_CategoryType=Category Type :
-ConfigProcessViewDialog_BriefDescription=Brief Description:
-ConfigProcessViewDialog_SelectCategories=Select Categories
-
-#log messages
-cheatsheet_load_failure_log_msg=Failed to open the requested cheatsheet: 
-
-newConfigurationWirazd_createError=IUPA0035E: The configuration cannot be created successfully
-newPluginWizard_createError=IUPA0036E: The plug-in cannot be created successfully
-errorDialog_moveError=IUPA0037E: The element cannot be moved successfully
-renameDialog_renameError=IUPA0038E: The element cannot be renamed successfully
-errorDialog_createError=IUPA0039E: The element cannot be created successfully
-duplicatePluginNameError_msg=IUPA0101E: The name ''{0}'' already exists. Enter a different name and try again.
-
-#New Strings for ProcessEditor Context menu diagram images
-ProcessEditor_Action_AddADImage=Assign AD Image...
-ProcessEditor_refreshErrorTitle=Refresh Error
-ProcessEditor_refreshErrorMsg=Error refreshing editor
-ProcessEditor_Action_AddADDImage=Assign ADD Image...
-ProcessEditor_Action_AddWPDImage=Assign WPD Image...
-ProcessEditor_Action_UseADImageInPublishing=Use AD Image in Publishing
-ProcessEditor_promptToDeleteBeforeSuppress=The suppressed descriptors listed in Details must be deleted to avoid duplication after suppressing the selected elements. Click OK if you want to delete them and continue.
-ProcessEditor_Action_UseADDImageInPublishing=Use ADD Image in Publishing
-ProcessEditor_Action_UseWPDImageInPublishing=Use WPD Image in Publishing
-ProcessEditor_DiagramImage_InputDialog_initialValue=Image Path
-ProcessEditor_Action_ShowLinkedElementinLibraryView=S&how Linked Element in Library View
-ProcessEditor_updateSuppressionFromBaseAction_label=Update Suppression from &Base
-ProcessEditor_ContextMenu_DiagramImages=Diagram Images
-
-#Strings for synchronization wizard on process editor's BS
-synchronizationWizard_descriptionPage_title=Synchronization Description
-synchronizationWizard_descriptionPage_text=Read the information below \
-that explains what custom synchronization will accomplish.
-synchronizationWizard_selectConfigPage_title=Select Configuration
-synchronizationWizard_selectConfigPage_text=Select the configuration \
-that you want to use for the synchronization.  Your selection determines which contributions and replacements will be used for the synchronization.
-synchronizationWizard_selectConfigPage_configLabel=Configuration:
-synchronizationWizard_selectDetailsPage_title=Select Properties to Synchronize
-synchronizationWizard_selectDetailsPage_properties_lable=Properties
-synchronizationWizard_selectDetailsPage_name_lable=Name
-synchronizationWizard_selectDetailsPage_presentationName_lable=Presentation Name
-synchronizationWizard_selectDetailsPage_briefDesc_lable=Brief Description
-synchronizationWizard_selectDetailsPage_optionalInouts_label=Optional Inputs
-synchronizationWizard_selectDetailsPage_mandatoryInputs_lable=Mandatory Inputs
-synchronizationWizard_selectDetailsPage_outputs_label=Outputs
-synchronizationWizard_selectDetailsPage_primaryPerformer_label=Primary Performer
-synchronizationWizard_selectDetailsPage_addnPerformers_lable=Additional Performers
-synchronizationWizard_selectDetailsPage_responsibleRoles_lable=Responsible Roles
-synchronizationWizard_selectDetailsPage_contnArtifacts_label=Contained Artifacts
-synchronizationWizard_selectDetailsPage_dilvedParts_label=Deliverable Parts
-synchronizationWizard_selectDetailsPage_selSteps_label=Steps Selection
-synchronizationWizard_selectDetailsPage_text=Choose the properties of \
-the method content that you want to be considered for synchronization.
-synchronizationWizard_previewPage_title=Synchronization Preview
-synchronizationWizard_previewPage_text=Review the proposed synchronization details below.
-selectEditorsToDiscardConflictChanges=There are unsaved changes that conflict with changes made outside the editors.\nSelect the editors you wish to discard their changes.
-synchronizationWizard_title_text=Synchronization Wizard
-synchronizationWizard_descriptionPage_explainText=This wizard supports you in refreshing \
-the selected descriptors or all descriptors below the selected activities that have been marked as \
-"Synchronize with Source" in the General tab of their Properties view.  Only the properties that you \
-select in this wizard are refreshed in the descriptors.  You can also select any valid configuration \
-for your process to be used when computing the refresh.  Note that the wizard will not update any \
-dynamically linked (green italic) descriptors.
-
-openRTE=Open rich text editor
-closeRTE=Close rich text editor
-
-#New Strings
-rolesets_guidancepage_sectiondescription=Manage the guidances that belong to this role set.
-disciplines_guidancepage_sectiondescription=Manage the guidances that belong to this discipline.
-workproducttypes_guidancepage_sectiondescription=Manage the guidances that belong to this work product kind.
-domains_guidancepage_sectiondescription=Manage the guidances that belong to this domain.
-tools_guidancepage_sectiondescription=Manage the guidances that belong to this tool.
-customcategory_guidancepage_sectiondescription=Manage the guidances that belong to this custom category.
-
-concept_guidancepage_sectiondescription=Manage the guidances that belong to this concept.
-checklist_guidancepage_sectiondescription=Manage the guidances that belong to this checklist.
-example_guidancepage_sectiondescription=Manage the guidances that belong to this example.
-guideline_guidancepage_sectiondescription=Manage the guidances that belong to this guideline.
-roadmap_guidancepage_sectiondescription=Manage the guidances that belong to this roadmap.
-reusableasset_guidancepage_sectiondescription=Manage the guidances that belong to this reusable asset.
-supportingmaterial_guidancepage_sectiondescription=Manage the guidances that belong to this supporting material.
-report_guidancepage_sectiondescription=Manage the guidances that belong to this report.
-practice_guidancepage_sectiondescription=Manage the guidances that belong to this practice.
-template_guidancepage_sectiondescription=Manage the guidances that belong to this template.
-termdefinition_guidancepage_sectiondescription=Manage the guidances that belong to this term definition.
-toolmentor_guidancepage_sectiondescription=Manage the guidances that belong to this tool mentor.
-whitepaper_guidancepage_sectiondescription=Manage the guidances that belong to this whitepaper.
-estimationconsideration_guidancepage_sectiondescription=Manage the guidances that belong to this estimation consideration.
-
-#New String Section Description
-role_detailSection_desc=Provide detailed information about this role.
-role_generalInfoSection_desc=Provide general information about this role.
-role_variabilitySection_desc=Specify how this role relates to another role.
-role_versionInfoSection_desc=Provide version information about this role.
-
-task_detailSection_desc=Provide detailed information about this task.
-task_generalInfoSection_desc=Provide general information about this task.
-task_variabilitySection_desc=Specify how this task relates to another task.
-task_versionInfoSection_desc=Provide version information about this task.
-
-artifact_detailSection_desc=Provide detailed information about this artifact.
-artifact_generalInfoSection_desc=Provide general information about this artifact.
-artifact_iconSection_desc=Customize the icons for this artifact.
-artifact_notationSection_desc=Provide delivery information about this artifact.
-artifact_tailoringSection_desc=Provide tailoring information about this artifact.
-artifact_variabilitySection_desc=Specify how this artifact relates to another artifact.
-artifact_versionInfoSection_desc=Provide version information about this artifact.
-
-outcome_detailSection_desc=Provide detailed information about this outcome.
-outcome_generalInfoSection_desc=Provide general information about this outcome.
-outcome_iconSection_desc=Customize the icons for this outcome.
-outcome_notationSection_desc=Provide delivery information about this outcome.
-outcome_tailoringSection_desc=Provide tailoring information about this outcome.
-outcome_variabilitySection_desc=Specify how this outcome relates to another outcome.
-outcome_versionInfoSection_desc=Provide version information about this outcome.
-
-deliverable_detailSection_desc=Provide detailed information about this deliverable.
-deliverable_generalInfoSection_desc=Provide general information about this deliverable.
-deliverable_iconSection_desc=Customize the icons for this deliverable.
-deliverable_notationSection_desc=Provide delivery information about this deliverable.
-deliverable_tailoringSection_desc=Provide tailoring information about this deliverable.
-deliverable_variabilitySection_desc=Specify how this deliverable relates to another deliverable.
-deliverable_versionInfoSection_desc=Provide version information about this deliverable.
-
-discipline_detailSection_desc=Provide detailed information about this discipline.
-discipline_generalInfoSection_desc=Provide general information about this discipline.
-discipline_variabilitySection_desc=Specify how this discipline relates to another discipline.
-discipline_versionInfoSection_desc=Provide version information about this discipline.
-
-domain_detailSection_desc=Provide detailed information about this domain.
-domain_generalInfoSection_desc=Provide general information about this domain.
-domain_variabilitySection_desc=Specify how this domain relates to another domain.
-domain_versionInfoSection_desc=Provide version information about this domain.
-
-workproducttype_detailSection_desc=Provide detailed information about this work product kind.
-workproducttype_generalInfoSection_desc=Provide general information about this work product kind.
-workproducttype_variabilitySection_desc=Specify how this work product kind relates to another work product kind.
-workproducttype_versionInfoSection_desc=Provide version information about this work product kind.
-
-roleset_detailSection_desc=Provide detailed information about this role set.
-roleset_generalInfoSection_desc=Provide general information about this role set.
-roleset_variabilitySection_desc=Specify how this role set relates to another role set.
-roleset_versionInfoSection_desc=Provide version information about this role set.
-
-tool_detailSection_desc=Provide detailed information about this tool.
-tool_generalInfoSection_desc=Provide general information about this tool.
-tool_variabilitySection_desc=Specify how this tool relates to another tool.
-tool_versionInfoSection_desc=Provide version information about this tool.
-
-concept_detailSection_desc=Provide detailed information about this concept.
-concept_generalInfoSection_desc=Provide general information about this concept.
-concept_variabilitySection_desc=Specify how this concept relates to another concept.
-concept_versionInfoSection_desc=Provide version information about this concept.
-
-checklist_detailSection_desc=Provide detailed information about this checklist.
-checklist_generalInfoSection_desc=Provide general information about this checklist.
-checklist_variabilitySection_desc=Specify how this checklist relates to another checklist.
-checklist_versionInfoSection_desc=Provide version information about this checklist.
-
-example_detailSection_desc=Provide detailed information about this example.
-example_generalInfoSection_desc=Provide general information about this example.
-example_variabilitySection_desc=Specify how this example relates to another example.
-example_versionInfoSection_desc=Provide version information about this example.
-
-guideline_detailSection_desc=Provide detailed information about this guideline.
-guideline_generalInfoSection_desc=Provide general information about this guideline.
-guideline_variabilitySection_desc=Specify how this guideline relates to another guideline.
-guideline_versionInfoSection_desc=Provide version information about this guideline.
-
-estimationconsideration_detailSection_desc=Provide detailed information about this estimation consideration.
-estimationconsideration_generalInfoSection_desc=Provide general information about this estimation consideration.
-estimationconsideration_variabilitySection_desc=Specify how this estimation consideration relates to another estimation consideration.
-estimationconsideration_versionInfoSection_desc=Provide version information about this estimation consideration.
-
-practice_detailSection_desc=Provide detailed information about this practice.
-practice_generalInfoSection_desc=Provide general information about this practice.
-practice_variabilitySection_desc=Specify how this practice relates to another practice.
-practice_versionInfoSection_desc=Provide version information about this practice.
-
-report_detailSection_desc=Provide detailed information about this report.
-report_generalInfoSection_desc=Provide general information about this report.
-report_variabilitySection_desc=Specify how this report relates to another report.
-report_versionInfoSection_desc=Provide version information about this report.
-
-resuableasset_detailSection_desc=Provide detailed information about this reusable asset.
-resuableasset_generalInfoSection_desc=Provide general information about this reusable asset.
-resuableasset_variabilitySection_desc=Specify how this reusable asset relates to another reusable asset.
-resuableasset_versionInfoSection_desc=Provide version information about this reusable asset.
-
-roadmap_detailSection_desc=Provide detailed information about this roadmap.
-roadmap_generalInfoSection_desc=Provide general information about this roadmap.
-roadmap_variabilitySection_desc=Specify how this roadmap relates to another roadmap.
-roadmap_versionInfoSection_desc=Provide version information about this roadmap.
-
-supportingmaterial_detailSection_desc=Provide detailed information about this supporting material.
-supportingmaterial_generalInfoSection_desc=Provide general information about this supporting material.
-supportingmaterial_variabilitySection_desc=Specify how this supporting material relates to another supporting material.
-supportingmaterial_versionInfoSection_desc=Provide version information about this supporting material.
-
-template_detailSection_desc=Provide detailed information about this template.
-template_generalInfoSection_desc=Provide general information about this template.
-template_variabilitySection_desc=Specify how this template relates to another template.
-template_versionInfoSection_desc=Provide version information about this template.
-
-termdefinition_detailSection_desc=Provide detailed information about this term definition.
-termdefinition_generalInfoSection_desc=Provide general information about this term definition.
-termdefinition_variabilitySection_desc=Specify how this term definition relates to another term definition.
-termdefinition_versionInfoSection_desc=Provide version information about this term definition.
-
-toolmentor_detailSection_desc=Provide detailed information about this tool mentor.
-toolmentor_generalInfoSection_desc=Provide general information about this tool mentor.
-toolmentor_variabilitySection_desc=Specify how this tool mentor relates to another tool mentor.
-toolmentor_versionInfoSection_desc=Provide version information about this tool mentor.
-
-whitepaper_detailSection_desc=Provide detailed information about this whitepaper.
-whitepaper_generalInfoSection_desc=Provide general information about this whitepaper.
-whitepaper_variabilitySection_desc=Specify how this whitepaper relates to another whitepaper.
-whitepaper_versionInfoSection_desc=Provide version information about this whitepaper.
-
-disciplinegrouping_detailSection_desc=Provide detailed information about this discipline grouping.
-disciplinegrouping_generalInfoSection_desc=Provide general information about this discipline grouping.
-disciplinegrouping_variabilitySection_desc=Specify how this discipline grouping relates to another discipline grouping.
-disciplinegrouping_versionInfoSection_desc=Provide version information about this discipline grouping.
-
-rolesetgrouping_detailSection_desc=Provide detailed information about this roleset grouping.
-rolesetgrouping_generalInfoSection_desc=Provide general information about this roleset grouping.
-rolesetgrouping_variabilitySection_desc=Specify how this roleset grouping relates to another roleset grouping.
-rolesetgrouping_versionInfoSection_desc=Provide version information about this roleset grouping.
-
-customcategory_detailSection_desc=Provide detailed information about this custom category.
-customcategory_generalInfoSection_desc=Provide general information about this custom category.
-customcategory_variabilitySection_desc=Specify how this custom category relates to another custom category.
-customcategory_versionInfoSection_desc=Provide version information about this custom category.
-customcategory_IconSection_desc=Customize the icons for this custom category.
-
-concept_iconSection_desc=Customize the icons for this concept.
-checklist_iconSection_desc=Customize the icons for this checklist.
-toolmentor_iconSection_desc=Customize the icons for this tool mentor.
-whitepaper_iconSection_desc=Customize the icons for this whitepaper.
-estimationconsideration_iconSection_desc=Customize the icons for this estimation consideration.
-termdefinition_iconSection_desc=Customize the icons for this term definition.
-template_iconSection_desc=Customize the icons for this template.
-reusableasset_iconSection_desc=Customize the icons for this reusable asset.
-report_iconSection_desc=Customize the icons for this report.
-practice_iconSection_desc=Customize the icons for this practice.
-example_iconSection_desc=Customize the icons for this example.
-guideline_iconSection_desc=Customize the icons for this guideline.
-roadmap_iconSection_desc=Customize the icons for this roadmap.
-supportingmaterial_iconSection_desc=Customize the icons for this supporting material.
-
-publish_categories_text=Publish this category with the categorized method elements.
-editor_error_activated_outofsync_title=File Changed
-editor_error_activated_outofsync_message=The file has been changed on the file system. Do you want to load the changes?
-
-activity_variability_error_title=Activity Variability
-
-variability_error_title=Variability
-
-circular_dependency_error_title=Circular dependency
-
-apply_pattern_error_title=Apply Pattern
-apply_pattern_error_msg=Activity ''{0}'' cannot apply pattern with ''{1}'' since it will result in circular dependency.
-
-#set default history size
-default_list_length_label=Preference history size:
-
-ProcessEditor_Action_Suppress_Task=Suppress &Tasks
-ProcessEditor_Action_Reveal_Task=Reveal &Tasks
-
-#Extend Semantics preference check
-extend_semantics_button_text=Use new &Extends semantics
-extend_semantics_text=Extending elements override to-many relationships instead of adding to the inherited elements.
-
-################################################################################
-# EPF 1.2 NL strings.
-################################################################################
-
-# Layout Action group
-# Note: Mnemonics do not work on these
-LayoutActionGroup_label=Method Plug-in Presentation
-LayoutActionGroup_flatLayoutAction_label=Flat
-LayoutActionGroup_hierarchicalLayoutAction_label=Hierarchical
-
-Validate_method_library=Validate Method Library
-
-MarkerResolutionGenerator_showOwnerInLibraryView=Show owner of this unresolved reference in Library view
-MarkerResolutionGenerator_removeUnresolvedReference=Remove this unresolved reference
-promptDeleteCustomCategoryBeforeRemoveLastRefToIt=You are about to remove the last reference to {0} in the plug-in. The element(s) will be deleted. Do you want to continue?
-
-ConfigurationMarkerResolutionGenerator_resolveMissingReference=Add reference
-
-defaultLinkTypePrefLabel=Choose the default element link type when dragging from the Library view.
-promptCreateNewDiagramFile_msg=No diagram file exists for this process. Do you want to create a new one?
-NewDiagramFile_title=New Diagram File
-ItemsFilterDialog_UpdateTreeJob_name=Update filter tree
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/UIActionDispatcher.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/UIActionDispatcher.java
deleted file mode 100644
index cd1c666..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/UIActionDispatcher.java
+++ /dev/null
@@ -1,304 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.dialogs.ContributionSelection;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.views.ConfigurationView;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-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.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Handles UI actions in the workbench.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class UIActionDispatcher implements ISelectionProvider {
-
-	private static UIActionDispatcher instance = null;
-
-	protected List<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
-
-	protected List<IDoubleClickListener> doubleClickListeners = new ArrayList<IDoubleClickListener>();
-
-	private CurrentSelection currentSelection = new CurrentSelection();
-
-	private IDoubleClickListener doubleClickListener = null;
-
-	/**
-	 * Returns the singleton instance.
-	 */
-	public static UIActionDispatcher getInstance() {
-		if (instance == null) {
-			synchronized (UIActionDispatcher.class) {
-				if (instance == null) {
-					instance = new UIActionDispatcher();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Private default constructor.
-	 */
-	private UIActionDispatcher() {
-		this(null);
-	}
-
-	/**
-	 * create an action dispatcher of my own
-	 * 
-	 * @param owner
-	 */
-	public UIActionDispatcher(Object owner) {
-		// Create the double click listener used for launching the Method
-		// editors.
-		doubleClickListener = new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent e) {
-				ISelection selection = e.getSelection();
-				if (selection != null) {
-					IWorkbenchWindow window = PlatformUI.getWorkbench()
-							.getActiveWorkbenchWindow();
-					IWorkbenchPartSite site = window.getActivePage()
-							.getActivePart().getSite();
-
-					IStructuredSelection sel = (IStructuredSelection) selection;
-					Object[] selObjs = sel.toArray();
-					Object selectedObject = null;
-
-					if ((selObjs != null) && (selObjs.length > 0)) {
-						// Open the Authoring persepective.
-						UIActionDispatcher.openAuthoringPerspective();
-
-						// Locate the selected Method element.
-						Object obj = TngUtil.unwrap(selObjs[0]);
-						ConfigurationView view = ConfigurationView.getView();						
-						if ((view != null ) && site.equals(view.getSite()) ) {
-							// Double-click orginated from the Configuration
-							// view.
-							if (obj instanceof VariabilityElement) {
-								VariabilityElement element = (VariabilityElement) obj;
-								ContributionSelection contribSelection = new ContributionSelection();
-								selectedObject = contribSelection
-										.getSelectedContributor(element);
-							}
-						} else {
-							selectedObject = obj;
-						}
-
-						if (selectedObject != null) {
-							EditorChooser.getInstance().openEditor(
-									selectedObject);
-						}
-					}
-				}
-			}
-		};
-
-		// Add a perspective listener to enable/disable double-click listening.
-		IWorkbenchWindow activeWorkbenchWindow = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow();
-		if (activeWorkbenchWindow != null) {
-			activeWorkbenchWindow
-					.addPerspectiveListener(new IPerspectiveListener() {
-						public void perspectiveActivated(IWorkbenchPage page,
-								IPerspectiveDescriptor desc) {
-							if (desc.getId().equals(
-									AuthoringPerspective.PERSPECTIVE_ID)) {
-								addDoubleClickListener(doubleClickListener);
-							} else {
-								removeDoubleClickListener(doubleClickListener);
-							}
-						}
-
-						public void perspectiveChanged(IWorkbenchPage page,
-								IPerspectiveDescriptor desc, String id) {
-						}
-					});
-		}
-
-		if (PerspectiveUtil
-				.isActivePerspective(AuthoringPerspective.PERSPECTIVE_ID)) {
-			addDoubleClickListener(doubleClickListener);
-		}
-	}
-
-	public static void editConfiguration(String configName) {
-	}
-
-	/**
-	 * Open library perspective
-	 * 
-	 */
-	public static void openLibraryPerspective() {
-		PerspectiveUtil.openPerspective(BrowsingPerspective.PERSPECTIVE_ID);
-		IWorkbenchPage wkbPage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		IViewPart viewPart = wkbPage.findView(LibraryView.VIEW_ID);
-		if (viewPart != null)
-			wkbPage.hideView(viewPart);
-		viewPart = wkbPage.findView(ConfigurationView.VIEW_ID);
-		wkbPage.activate(viewPart);
-	}
-
-	/**
-	 * Open authoring perspective
-	 * 
-	 */
-	public static void openAuthoringPerspective() {
-		PerspectiveUtil.openPerspective(AuthoringPerspective.PERSPECTIVE_ID);
-		IWorkbenchPage wkbPage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		IViewPart viewPart = wkbPage.findView(LibraryView.VIEW_ID);
-		wkbPage.activate(viewPart);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		if (!selectionChangedListeners.contains(listener)) {
-			selectionChangedListeners.add(listener);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * Return current selection
-	 */
-	public ISelection getSelection() {
-		return currentSelection.selection;
-	}
-
-	public ISelectionProvider getSelectionSource() {
-		return currentSelection.source;
-	}
-
-	/**
-	 * Sets current selection
-	 */
-	public void setSelection(ISelection selection) {
-		setSelection(this, selection);
-	}
-
-	/**
-	 * Sets current selection
-	 */
-	public void setSelection(ISelectionProvider source, ISelection selection) {
-		synchronized (this) {
-			currentSelection.selection = selection;
-			currentSelection.source = source;
-
-			SelectionChangedEvent event = new SelectionChangedEvent(source,
-					selection);
-
-			// Avoid concurrent error.
-			List<ISelectionChangedListener> processedItems = new ArrayList<ISelectionChangedListener>();
-			while (selectionChangedListeners.size() > 0) {
-				ISelectionChangedListener listener = (ISelectionChangedListener) selectionChangedListeners
-						.remove(0);
-				if (listener != null) {
-					try {
-						listener.selectionChanged(event);
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					}
-					processedItems.add(listener);
-				}
-			}
-
-			selectionChangedListeners.addAll(processedItems);
-		}
-	}
-
-	/**
-	 * Add double click listener
-	 * 
-	 * @param listener
-	 */
-	public void addDoubleClickListener(IDoubleClickListener listener) {
-		if (!doubleClickListeners.contains(listener)) {
-			doubleClickListeners.add(listener);
-		}
-	}
-
-	/**
-	 * Remove double click listener
-	 * 
-	 * @param listener
-	 */
-	public void removeDoubleClickListener(IDoubleClickListener listener) {
-		doubleClickListeners.remove(listener);
-	}
-
-	/**
-	 * Handle double click event
-	 * 
-	 * @param event
-	 */
-	public void handleDoubleClickEvent(DoubleClickEvent event) {
-		synchronized (this) {
-			// Avoid concurrent error.
-			List<IDoubleClickListener> processedItems = new ArrayList<IDoubleClickListener>();
-			while (doubleClickListeners.size() > 0) {
-				IDoubleClickListener listener = (IDoubleClickListener) doubleClickListeners
-						.remove(0);
-				try {
-					listener.doubleClick(event);
-				} catch (Exception e) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				}
-				processedItems.add(listener);
-			}
-			doubleClickListeners.addAll(processedItems);
-		}
-	}
-
-	public class CurrentSelection {
-
-		public ISelectionProvider source = null;
-
-		public ISelection selection = StructuredSelection.EMPTY;
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/AbstractMoveAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/AbstractMoveAction.java
deleted file mode 100644
index 4d5de1f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/AbstractMoveAction.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.action.CommandActionHandler;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Moves breakdown element in a process tree.
- * 
- * @author Phong Nguyen Le
- * @since  1.2
- */
-public abstract class AbstractMoveAction extends
-		CommandActionHandler implements IWorkbenchPartAction, IModifyingAction {
-
-	protected ProcessEditor editor;
-
-	/**
-	 * Creates an instance
-	 * @param text
-	 */
-	public AbstractMoveAction(String text) {
-		super(null, text);
-	}
-	
-	protected boolean accept(IStructuredSelection selection) {
-		// support move only one activity for now
-		//
-		if(selection.size() == 1) {
-			Object e = selection.getFirstElement();
-			ITreeItemContentProvider ip = (ITreeItemContentProvider) getItemProvider(e);
-			return e instanceof BreakdownElement && ip != null && ip.getParent(e) instanceof Activity;
-		}
-		
-		return false;
-	}
-		
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		// support move only one activity for now
-		//
-		if(accept(selection)) {
-			return super.updateSelection(selection);
-		}
-		return false;
-	}
-	
-	protected IBSItemProvider getItemProvider(Object element) {
-		if(domain instanceof AdapterFactoryEditingDomain) {
-			AdapterFactory adapterFactory = ((AdapterFactoryEditingDomain)domain).getAdapterFactory();
-			Object ip = adapterFactory.adapt(element, ITreeItemContentProvider.class);
-			if(ip instanceof IBSItemProvider) {
-				return (IBSItemProvider) ip;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#createCommand(java.util.Collection)
-	 */
-	@SuppressWarnings("unchecked")
-	public Command createCommand(Collection<?> selection) {
-		Object element = selection.iterator().next();
-		IBSItemProvider ip = getItemProvider(element);
-		if(ip != null) {
-			Object parent = ((ITreeItemContentProvider)ip).getParent(element);
-			if ((parent != null) && (parent instanceof Activity)) {
-				return createMoveCommand((Activity)parent, element, ip.getEClasses());
-			}
-		}
-		return UnexecutableCommand.INSTANCE;
-		
-	}
-	
-	protected abstract Command createMoveCommand(Activity act, Object element, Collection<EClass> eClasses);
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction#setActiveWorkbenchPart(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart) {
-		if(workbenchPart instanceof IEditingDomainProvider) {
-			domain = ((IEditingDomainProvider)workbenchPart).getEditingDomain();
-		}
-		if(workbenchPart instanceof ProcessEditor) {
-			editor = (ProcessEditor) workbenchPart;
-		}		
-		else if(workbenchPart == null) {
-			editor = null;
-		}
-	}	
-	
-	private void superRun() {
-		super.run();
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		BusyIndicator.showWhile(editor.getEditorSite()
-				.getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						superRun();
-					}
-			
-		});
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ActivityDetailDiagramInfoAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ActivityDetailDiagramInfoAction.java
deleted file mode 100644
index bb2622b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ActivityDetailDiagramInfoAction.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.dialogs.ADDInfoDialog;
-import org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor;
-import org.eclipse.epf.authoring.ui.editors.ActivityDetailDiagramEditor;
-import org.eclipse.epf.authoring.ui.filters.DescriptorConfigurationFilter;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Action to show the ADDInfoDialog, to show the ActivityDetailDiagrams
- * in the process. Not in use.
- * @author Shashidhar Kannoori
- */
-public class ActivityDetailDiagramInfoAction extends Action {
-
-	protected Object selected;
-	
-	public ActivityDetailDiagramInfoAction() {
-		super("Activity Detail Diagram Info"); //$NON-NLS-1$
-	}
-	
-	public void run() {
-		
-		IFilter filter = new ADDFilter(null, null, null);
-		
-		ADDInfoDialog fd = new ADDInfoDialog(PlatformUI
-				.getWorkbench().getActiveWorkbenchWindow()
-				.getShell(), filter, getObject(), "Activity", //$NON-NLS-1$
-				null);
-
-		fd.setBlockOnOpen(true);
-		fd.setTitle("Activity"); //$NON-NLS-1$
-		fd.open();
-		List list = fd.getSelectedItems();
-		
-		try {
-			IEditorPart parent = getPagex().getActiveEditor();
-			IEditorInput input = new ActivityDetailDiagramEditor.EditorInput(
-					list.get(0), Suppression.getSuppression((Process)getObject()));
-			IEditorPart part = getPagex().openEditor(input,
-					ActivityDetailDiagramEditor.class
-					.getName());
-			if (part instanceof AbstractDiagramEditor) {
-				AbstractDiagramEditor editor = (AbstractDiagramEditor) part;
-				editor.setParentEditor(parent);
-			}
-		} catch (PartInitException exception) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(
-					exception);
-		}
-		// open editor
-
-		super.run();
-	}
-	
-	public Object getObject(){
-		return selected;
-	}
-	
-	public IWorkbenchPage getPagex(){
-		return null;
-	}
-	
-	public boolean isEnabled() {
-		return super.isEnabled();
-	}
-	public class ADDFilter extends DescriptorConfigurationFilter {
-		public ADDFilter(MethodConfiguration methodConfig, Viewer viewer, String filterStr) {
-			super(methodConfig, viewer, filterStr);
-		}
-
-		public boolean accept(Object obj) {
-			// TODO Auto-generated method stub
-			if(obj instanceof CapabilityPattern) return true;
-			if(obj instanceof Activity){
-				org.eclipse.epf.uma.Diagram d = GraphicalDataManager.getInstance()
-				.getUMADiagram((Activity) obj, GraphicalDataHelper.ACTIVITY_DETAIL_DIAGRAM, false);
-				if(d != null ) return true;
-			}
-			return false;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ConfigurationViewEditAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ConfigurationViewEditAction.java
deleted file mode 100644
index fd70eaf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ConfigurationViewEditAction.java
+++ /dev/null
@@ -1,117 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.epf.authoring.ui.PerspectiveListUtil;
-import org.eclipse.epf.authoring.ui.UIActionDispatcher;
-import org.eclipse.epf.authoring.ui.dialogs.ContributionSelection;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.actions.BaseSelectionListenerAction;
-
-
-/**
- * Edits an element in the Configuration view.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationViewEditAction extends BaseSelectionListenerAction {
-
-	/**
-	 * The ID for this action.
-	 */
-	public static final String ACTION_ID = ConfigurationViewEditAction.class
-			.getName();
-
-	private IStructuredSelection selected;
-
-	private ContributionSelection contributorSelector;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationViewEditAction(String text) {
-		super(text);
-		contributorSelector = new ContributionSelection();
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		ArrayList elementList = new ArrayList();
-		for (Iterator objects = selected.iterator(); objects.hasNext();) {
-			Object element = TngUtil.unwrap(objects.next());
-			if (element instanceof VariabilityElement) {
-				Object obj = contributorSelector
-						.getSelectedContributor((VariabilityElement) element);
-				if (obj != null)
-					elementList.add(obj);
-			} else {
-				elementList.add(element);
-			}
-		}
-
-		if (elementList.size() < 1)
-			return;
-
-		if (PerspectiveListUtil.isBrowsingPerspective()) {
-			UIActionDispatcher.openAuthoringPerspective();
-		}
-
-		for (Iterator objects = elementList.iterator(); objects.hasNext();) {
-			Object element = objects.next();
-			EditorChooser.getInstance().openEditor(element);
-		}
-	}
-
-	/**
-	 * Updates this action in response to the given selection changes.
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		selected = selection;
-
-		boolean enableTheMenu = true;
-
-		for (Iterator objects = selection.iterator(); objects.hasNext();) {
-			Object element = objects.next();
-			Object realObj = TngUtil.unwrap(element);
-			if (!(realObj instanceof MethodElement)) {
-				enableTheMenu = false;
-				break;
-			} else if ((realObj instanceof DeliveryProcess)
-					|| (realObj instanceof CapabilityPattern)) {
-				break;
-			} else if ((realObj instanceof Phase)
-					|| (realObj instanceof Activity)
-					|| (realObj instanceof ProcessPackage)) {
-				enableTheMenu = false;
-				break;
-			}
-		}
-
-		return enableTheMenu;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/CreateMethodElementCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/CreateMethodElementCommand.java
deleted file mode 100644
index 2a81e62..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/CreateMethodElementCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandWrapper;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CommandActionDelegate;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.IEditorKeeper;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.library.edit.command.CommandStatusChecker;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.process.command.CreateProcessComponentCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Creates a new Method element.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class CreateMethodElementCommand extends CommandWrapper implements
-		CommandActionDelegate {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CreateMethodElementCommand(Command command) {
-		super(command);
-	}
-	
-	private void reloadCurrentLibraryOnRollbackError() {
-		ViewHelper.reloadCurrentLibaryOnRollbackError(null);
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.command.CommandWrapper#execute()
-	 */
-	public void execute() {
-		Command cmd = TngUtil.unwrap(this);
-
-		super.execute();
-
-		if (command instanceof CreateProcessComponentCommand) {
-			IStatus status = ((CreateProcessComponentCommand) command)
-					.getStatus();
-			if (status != null && !status.isOK()) {
-				if (CommandStatusChecker.hasRollbackError(status)) {					
-					reloadCurrentLibraryOnRollbackError();
-				} else if (!CommandStatusChecker.hasSaveError(status)) {
-					displayError(status);
-				}
-				return;
-			}
-		} else {
-			cmd = this;
-
-			while (cmd instanceof CommandWrapper
-					&& !(cmd instanceof MethodElementAddCommand)) {
-				cmd = ((CommandWrapper) cmd).getCommand();
-			}
-
-			if (cmd instanceof MethodElementAddCommand) {
-				MethodElementAddCommand addCmd = ((MethodElementAddCommand) cmd);
-				IStatus status = addCmd.getStatus();
-				if (status != null && !status.isOK()) {
-					if (CommandStatusChecker.hasRollbackError(status)) {
-						reloadCurrentLibraryOnRollbackError();
-					} else if (!CommandStatusChecker.hasSaveError(status)) {
-						displayError(status);
-					}
-					return;
-				}
-			}
-		}
-
-		Collection<?> result = getCommand().getResult();
-		for (Object o : result) {
-			Object obj = TngUtil.unwrap(o);
-			if (obj instanceof EObject && ((EObject) obj).eContainer() != null) {
-				// Open the editor for the newly created element.
-				IEditorKeeper.REFERENCE.getEditorKeeper().openEditor(obj);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.command.CommandWrapper#canUndo()
-	 */
-	public boolean canUndo() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.command.CommandActionDelegate#getImage()
-	 */
-	public Object getImage() {
-		CommandActionDelegate cmd = (CommandActionDelegate) getCommand();
-		return cmd.getImage();
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.command.CommandActionDelegate#getText()
-	 */
-	public String getText() {
-		CommandActionDelegate cmd = (CommandActionDelegate) getCommand();
-		return cmd.getText();
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.command.CommandActionDelegate#getToolTipText()
-	 */
-	public String getToolTipText() {
-		CommandActionDelegate cmd = (CommandActionDelegate) getCommand();
-		return cmd.getToolTipText();
-	}
-
-	/**
-	 * Display an error dialog.
-	 */
-	protected void displayError(IStatus status) {
-		int severity = status.getSeverity();
-		if (severity == IStatus.ERROR || severity == IStatus.WARNING) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().display(
-					getLabel(),
-					AuthoringUIResources.errorDialog_createError
-					, status);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/DiagramPrintAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/DiagramPrintAction.java
deleted file mode 100644
index 8648d4f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/DiagramPrintAction.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.print.PrintGraphicalViewerOperation;
-import org.eclipse.gef.ui.actions.PrintAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.printing.PrintDialog;
-import org.eclipse.swt.printing.Printer;
-import org.eclipse.swt.printing.PrinterData;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * 
- * Print diagram
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- *
- */
-public class DiagramPrintAction extends PrintAction {
-
-	GraphicalViewer viewer;
-	/**
-	 * @param part
-	 */
-	public DiagramPrintAction(IWorkbenchPart part, GraphicalViewer viewer) {
-		super(part);
-		this.viewer = viewer;
-	}
-	
-	/* 
-	 * @see org.eclipse.gef.ui.actions.PrintAction#run()
-	 */
-	public void run() {
-		//GraphicalViewer viewer;
-		PrintDialog dialog = new PrintDialog(viewer.getControl().getShell(), SWT.NULL);
-		PrinterData data = dialog.open();
-		
-		if (data != null) {
-			PrintGraphicalViewerOperation op = 
-						new PrintGraphicalViewerOperation(new Printer(data), viewer);
-			op.run(getWorkbenchPart().getTitle());
-		}
-		super.run();
-	}
-	
-	/**
-	 * Set graphical viewer
-	 * @param viewer
-	 */
-	public void setViewer(GraphicalViewer viewer) {
-		this.viewer = viewer;
-	}
-	
-	/**
-	 * Return graphical viewer
-	 * @return viewer
-	 */
-	public GraphicalViewer getViewer() {
-		return viewer;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ILibraryActionBarContributor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ILibraryActionBarContributor.java
deleted file mode 100644
index d8da548..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ILibraryActionBarContributor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.part.IPage;
-
-/**
- * The interface for the Library view action bar contributor.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface ILibraryActionBarContributor extends
-		IEditorActionBarContributor {
-
-	public IViewPart getActiveView();
-
-	public void setActiveView(IViewPart part);
-
-	public void shareGlobalActions(IPage page, IActionBars actionBars);
-
-	public void menuAboutToShow(IMenuManager menuManager);
-
-	public void deactivate();
-
-	public void disableGlobalEditMenu();
-
-	public void enableGlobalEditMenu();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IModifyingAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IModifyingAction.java
deleted file mode 100644
index 871345d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IModifyingAction.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.jface.action.IAction;
-
-/**
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public interface IModifyingAction extends IAction {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IWorkbenchPartAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IWorkbenchPartAction.java
deleted file mode 100644
index a1cb02b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IWorkbenchPartAction.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Interface for workbench part
- * 
- * @author Phong Nguyen Le 
- * @since  1.0
- */
-public interface IWorkbenchPartAction {
-	void setActiveWorkbenchPart(IWorkbenchPart workbenchPart);
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IndentAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IndentAction.java
deleted file mode 100644
index a5c63c1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/IndentAction.java
+++ /dev/null
@@ -1,272 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.action.CommandActionHandler;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Indents breakdown elements in a process tree.
- * 
- * @author Phong Nguyen Le
- * @since  1.2
- */
-public class IndentAction extends
-		CommandActionHandler implements IWorkbenchPartAction, IModifyingAction {
-
-	public static class IndentCommand extends AbstractCommand implements IResourceAwareCommand {
-		
-		private Collection<BreakdownElement> elements;
-		private AdapterFactory adapterFactory;
-		private Set modifiedResources;
-		private BreakdownElement element;
-		private Activity oldParent;
-		private Activity newParent;
-		private int oldIndex;
-		private Map<WorkBreakdownElement, WorkOrder> circularWorkOrders;
-
-		public IndentCommand(Collection<BreakdownElement> collection, AdapterFactory adapterFactory) {
-			this.elements = collection;
-			this.adapterFactory = adapterFactory;
-			setLabel(LABEL);
-		}
-
-		public Collection getModifiedResources() {
-			if(modifiedResources == null) {
-				Process proc = null;
-				for (Iterator<BreakdownElement> iter = elements.iterator(); proc == null && iter.hasNext();) {
-					BreakdownElement e = iter.next();
-					proc = TngUtil.getOwningProcess(e);
-				}
-				if(proc != null) {
-					Resource resource = proc.eResource();
-					if(resource != null) {
-						modifiedResources = Collections.singleton(proc.eResource());
-					}
-				}
-				if(modifiedResources == null) {
-					modifiedResources = Collections.EMPTY_SET;
-				}
-			}
-			return modifiedResources;
-		}
-		
-		@Override
-		protected boolean prepare() {
-			element = elements.iterator().next();
-			oldParent = element.getSuperActivities();
-			if(oldParent == null) {
-				return false;
-			}
-			oldIndex = oldParent.getBreakdownElements().indexOf(element);
-			ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(oldParent, 
-					ITreeItemContentProvider.class);
-			List<Object> children = new LinkedList<Object>(ip.getChildren(oldParent));
-			int index = children.indexOf(element);
-			if(index > 0) {
-				Object prev = children.get(index - 1);
-				if(prev instanceof Activity) {
-					newParent = (Activity) prev;
-					return DependencyChecker.checkCircularForMovingVariabilityElement(newParent, Collections.singleton(element), true);
-				}
-			}
-			return false;
-		}
-
-		public void execute() {
-			newParent.getBreakdownElements().add(element);
-			
-			// remove circular work orders
-			//
-			if(element instanceof WorkBreakdownElement) {
-				if(circularWorkOrders == null) {
-					circularWorkOrders = new HashMap<WorkBreakdownElement, WorkOrder>();
-				}
-				else {
-					circularWorkOrders.clear();
-				}
-				WorkOrder wo = UmaUtil.findWorkOrder(newParent, element);
-				if(wo != null) {	
-					newParent.getLinkToPredecessor().remove(wo);
-					circularWorkOrders.put(newParent, wo);
-				}
-				WorkBreakdownElement wbe = (WorkBreakdownElement) element;
-				wo = UmaUtil.findWorkOrder(wbe, newParent);
-				if(wo != null) {
-					wbe.getLinkToPredecessor().remove(wo);
-					circularWorkOrders.put(wbe, wo);
-				}
-			}			
-			
-			// move the process pacakge of the activity to new parent package
-			//
-			if(element instanceof Activity) {
-				ProcessPackage parentPkg = (ProcessPackage) newParent.eContainer();
-				parentPkg.getChildPackages().add(element.eContainer());
-			}
-		}
-
-		public void redo() {
-			execute();
-		}
-		
-		@Override
-		public void undo() {
-			if(circularWorkOrders != null && !circularWorkOrders.isEmpty()) {
-				for (Map.Entry<WorkBreakdownElement, WorkOrder> entry : circularWorkOrders.entrySet()) {
-					entry.getKey().getLinkToPredecessor().add(entry.getValue());
-				}
-				circularWorkOrders.clear();
-			}
-			oldParent.getBreakdownElements().add(oldIndex, element);			
-			if(element instanceof Activity) {
-				ProcessPackage parentPkg = (ProcessPackage) oldParent.eContainer();
-				parentPkg.getChildPackages().add(element.eContainer());
-			}
-		}
-		
-		@Override
-		public Collection getAffectedObjects() {
-			return elements;
-		}
-	}
-
-	private static final String LABEL = AuthoringUIResources.ProcessEditor_Action_Indent;
-
-	private ProcessEditor editor;
-
-	/**
-	 * Creates an instance
-	 * @param text
-	 */
-	public IndentAction(String text) {
-		super(null, text);
-	}
-	
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public IndentAction() {
-		this(LABEL);
-		setImageDescriptor(RichTextImages.IMG_DESC_INDENT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_INDENT);
-		setToolTipText(LABEL);
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		// support indent only one activity for now
-		//
-		boolean ret = false;
-		if(selection.size() == 1) {
-			Object e = selection.getFirstElement();
-			if(e instanceof Activity) {
-				ret = super.updateSelection(selection);				
-			}
-		}
-		setEnabled(ret);
-		return ret;
-		
-		//TODO: support indent multiple activities in selection
-//		ArrayList<Activity> list = new ArrayList<Activity>();
-//		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-//			Object element = iter.next();
-//			if(element instanceof Activity) {
-//				list.add((Activity) element);
-//			}
-//		}
-//		if(list.isEmpty()) {
-//			return false;
-//		}
-//		return super.updateSelection(new StructuredSelection(list));
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#createCommand(java.util.Collection)
-	 */
-	public Command createCommand(Collection selection) {
-		if(domain instanceof AdapterFactoryEditingDomain) {
-			return new IndentCommand(selection, ((AdapterFactoryEditingDomain)domain).getAdapterFactory());
-		}
-		return UnexecutableCommand.INSTANCE;
-	}	
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction#setActiveWorkbenchPart(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart) {
-		if(workbenchPart instanceof IEditingDomainProvider) {
-			domain = ((IEditingDomainProvider)workbenchPart).getEditingDomain();
-		}
-		if(workbenchPart instanceof ProcessEditor) {
-			editor = (ProcessEditor) workbenchPart;
-		}		
-		else if(workbenchPart == null) {
-			editor = null;
-		}
-	}	
-	
-	private void superRun() {
-		super.run();
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		BusyIndicator.showWhile(editor.getEditorSite()
-				.getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						superRun();
-					}
-			
-		});
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LayoutActionGroup.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LayoutActionGroup.java
deleted file mode 100644
index e367baf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LayoutActionGroup.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.preferences.ApplicationPreferenceConstants;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.edit.PluginUIPackageContext;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * 
- * Code taken from org.eclipse.jdt.internal.ui.packageview.LayoutActionGroup
- *
- */
-public class LayoutActionGroup extends MultiActionGroup {
-
-	public LayoutActionGroup(LibraryView libView) {
-		super(createActions(libView), getSelectedState(libView));
-	}
-
-	/* (non-Javadoc)
-	 * @see ActionGroup#fillActionBars(IActionBars)
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		super.fillActionBars(actionBars);
-		contributeToViewMenu(actionBars.getMenuManager());
-	}
-	
-	private void contributeToViewMenu(IMenuManager viewMenu) {
-		viewMenu.add(new Separator());
-
-		// Create layout sub menu
-		
-		IMenuManager layoutSubMenu= new MenuManager(AuthoringUIResources.LayoutActionGroup_label); 
-		final String layoutGroupName= "layout"; //$NON-NLS-1$
-		Separator marker= new Separator(layoutGroupName);
-
-		viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		viewMenu.add(marker);
-		viewMenu.appendToGroup(layoutGroupName, layoutSubMenu);
-		viewMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS+"-end"));//$NON-NLS-1$		
-		addActions(layoutSubMenu);
-	}
-
-	static int getSelectedState(LibraryView libView) {
-		if (PluginUIPackageContext.INSTANCE.isFlatLayout())
-			return 0;
-		else
-			return 1;
-	}
-	
-	static IAction[] createActions(LibraryView libView) {
-		IAction flatLayoutAction= new LayoutAction(libView, true);
-		flatLayoutAction.setText(AuthoringUIResources.LayoutActionGroup_flatLayoutAction_label); 
-		flatLayoutAction.setImageDescriptor(AuthoringUIImages.IMG_DESC_LAYOUT_FLAT);
-		IAction hierarchicalLayout= new LayoutAction(libView, false);
-		hierarchicalLayout.setText(AuthoringUIResources.LayoutActionGroup_hierarchicalLayoutAction_label);
-		hierarchicalLayout.setImageDescriptor(AuthoringUIImages.IMG_DESC_LAYOUT_HIERARCHICAL);
-		
-		return new IAction[]{flatLayoutAction, hierarchicalLayout};
-	}
-}
-
-class LayoutAction extends Action implements IAction {
-
-	private boolean fIsFlatLayout;
-	private LibraryView flibView;
-
-	public LayoutAction(LibraryView libView, boolean flat) {
-		super("", AS_RADIO_BUTTON); //$NON-NLS-1$
-
-		fIsFlatLayout= flat;
-		flibView= libView;
-		if (fIsFlatLayout)
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, AuthoringUIHelpContexts.LAYOUT_FLAT_ACTION);
-		else
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(this, AuthoringUIHelpContexts.LAYOUT_HIERARCHICAL_ACTION);
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (PluginUIPackageContext.INSTANCE.isFlatLayout() != fIsFlatLayout) {
-			PluginUIPackageContext.INSTANCE.toggleLayout();
-			// save state
-			ApplicationPreferenceConstants.setLayout(PluginUIPackageContext.INSTANCE.getLayoutAsString());
-		}
-		flibView.getViewer().getControl().setRedraw(false);
-		flibView.getViewer().refresh();
-		flibView.getViewer().getControl().setRedraw(true);
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryActionBarContributor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryActionBarContributor.java
deleted file mode 100644
index 1553f98..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryActionBarContributor.java
+++ /dev/null
@@ -1,620 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.CopyAction;
-import org.eclipse.emf.edit.ui.action.CutAction;
-import org.eclipse.emf.edit.ui.action.DeleteAction;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.emf.edit.ui.action.PasteAction;
-import org.eclipse.emf.edit.ui.action.RedoAction;
-import org.eclipse.emf.edit.ui.action.UndoAction;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.validation.LibraryEValidator;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.SubContributionItem;
-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.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * The Library view action bar contributor.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryActionBarContributor extends
-		EditingDomainActionBarContributor implements
-		ILibraryActionBarContributor, ISelectionChangedListener {
-
-	// Keep track of the active editor.
-	protected IViewPart activeViewPart;
-
-	// Keep track of the current selection provider.
-	protected ISelectionProvider selectionProvider;
-
-	protected IActionBars viewActionBars;
-
-	// Library view edit action
-	protected LibraryViewEditAction libraryViewEditAction;
-
-	// Configuration view edit action
-	protected ConfigurationViewEditAction configViewEditAction;
-
-	private EditingDomain editingDomain;
-	
-	/**
-	 * Displays the Properties view.
-	 */
-	protected IAction showPropertiesViewAction = new Action(
-			AuthoringUIResources._UI_ShowPropertiesView_menu_item) { 
-		public void run() {
-			try {
-				try {
-					getPage().showView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$
-				} catch (PartInitException exception) {
-					exception.printStackTrace();
-				}
-			} catch (RuntimeException e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	};
-
-	/**
-	 * Refreshes the viewer of the current editor if the editor implements
-	 * {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
-	 */
-	protected IAction refreshViewerAction = new Action(
-			AuthoringUIResources._UI_RefreshViewer_menu_item) { 
-		public boolean isEnabled() {
-			return activeViewPart instanceof IViewerProvider;
-		}
-
-		public void run() {
-			if (activeViewPart instanceof IViewerProvider) {
-				Viewer viewer = ((IViewerProvider) activeViewPart).getViewer();
-				if (viewer != null) {
-					refreshViewer(viewer);
-				}
-			}
-		}
-	};
-
-	/**
-	 * This will contain one
-	 * {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to
-	 * each descriptor generated for the current selection by the item provider.
-	 */
-	protected Collection createChildActions;
-
-	/**
-	 * The menu manager into which menu contribution items should be added for
-	 * CreateChild actions.
-	 */
-	protected IMenuManager createChildMenuManager;
-
-	/**
-	 * This will contain one
-	 * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding
-	 * to each descriptor generated for the current selection by the item
-	 * provider.
-	 */
-	protected Collection createSiblingActions;
-
-	/**
-	 * This is the menu manager into which menu contribution items should be
-	 * added for CreateSibling actions.
-	 */
-	protected IMenuManager createSiblingMenuManager;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryActionBarContributor(EditingDomain editingDomain) {
-		this.editingDomain = editingDomain;
-		
-		validateAction = new LibraryValidateAction();
-		((LibraryValidateAction)validateAction).putContextData(LibraryEValidator.CTX_ADAPTER_FACTORY_PROVIDER,
-				ProcessEditor.adapterFactoryProvider);
-	}
-
-	/**
-	 * @param viewer
-	 */
-	protected void refreshViewer(Viewer viewer) {
-		viewer.refresh();
-	}
-
-	/**
-	 * Adds Separators for editor additions to the tool bar.
-	 */
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		toolBarManager.add(new Separator("method-settings")); //$NON-NLS-1$
-		toolBarManager.add(new Separator("method-additions")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Adds to the menu bar a menu and some separators for editor
-	 * additions, as well as the sub-menus for object creation items.
-	 */
-	public void contributeToMenu(IMenuManager menuManager) {
-		super.contributeToMenu(menuManager);
-
-		IMenuManager submenuManager = new MenuManager(
-				AuthoringUIResources._UI_MethodEditor_menu, "com.ibm.methodMenuID"); //$NON-NLS-1$  
-		menuManager.insertAfter("additions", submenuManager); //$NON-NLS-1$
-		submenuManager.add(new Separator("settings")); //$NON-NLS-1$
-		submenuManager.add(new Separator("actions")); //$NON-NLS-1$
-		submenuManager.add(new Separator("additions")); //$NON-NLS-1$
-		submenuManager.add(new Separator("additions-end")); //$NON-NLS-1$
-
-		// Prepare for CreateChild item addition or removal.
-		createChildMenuManager = new MenuManager(
-				AuthoringUIResources._UI_CreateChild_menu_item); 
-		submenuManager.insertBefore("additions", createChildMenuManager); //$NON-NLS-1$
-
-		// Prepare for CreateSibling item addition or removal.
-		createSiblingMenuManager = new MenuManager(
-				AuthoringUIResources._UI_CreateSibling_menu_item); 
-		submenuManager.insertBefore("additions", createSiblingMenuManager); //$NON-NLS-1$
-
-		// Force an update because Eclipse hides empty menus now.
-		submenuManager.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager menuManager) {
-				menuManager.updateAll(true);
-			}
-		});
-
-		addGlobalActions(submenuManager);
-	}
-
-	public IViewPart getActiveView() {
-		return activeViewPart;
-	}
-
-	public void setActiveView(IViewPart part) {
-		// TODO - may need to check other method
-		if (part != null)
-			super.setActiveView(part);
-		if (part == activeViewPart)
-			return;
-		if (activeViewPart != null) {
-			deactivate();
-		}
-		if (part == null) {
-			selectionProvider = null;
-		}
-		if (!(part instanceof IEditingDomainProvider))
-			return;
-		activeViewPart = part;
-		editingDomain = ((IEditingDomainProvider) part).getEditingDomain();
-
-		// Switch to the new selection provider.
-		if (selectionProvider != null) {
-			selectionProvider.removeSelectionChangedListener(this);
-		} else {
-			selectionProvider = part.getSite().getSelectionProvider();
-			selectionProvider.addSelectionChangedListener(this);
-
-			// Fake a selection changed event to update the menus.
-			if (selectionProvider.getSelection() != null) {
-				selectionChanged(new SelectionChangedEvent(selectionProvider,
-						selectionProvider.getSelection()));
-			}
-		}
-
-		activate();
-
-	}
-
-	public void deactivate() {
-		activeViewPart.removePropertyListener(this);
-
-		deleteAction.setEditingDomain(null);
-		cutAction.setEditingDomain(null);
-		copyAction.setEditingDomain(null);
-		pasteAction.setEditingDomain(null);
-		undoAction.setEditingDomain(null);
-		redoAction.setEditingDomain(null);
-
-		if (loadResourceAction != null) {
-			loadResourceAction.setEditingDomain(null);
-		}
-
-		ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
-				: activeViewPart.getSite().getSelectionProvider();
-		selectionProvider.removeSelectionChangedListener(deleteAction);
-		selectionProvider.removeSelectionChangedListener(libraryViewEditAction);
-		selectionProvider.removeSelectionChangedListener(cutAction);
-		selectionProvider.removeSelectionChangedListener(copyAction);
-		selectionProvider.removeSelectionChangedListener(pasteAction);
-	}
-
-	public void disableGlobalEditMenu() {
-		deleteAction.setEnabled(false);
-		if (libraryViewEditAction != null)
-			libraryViewEditAction.setEnabled(false);
-		if (configViewEditAction != null)
-			configViewEditAction.setEnabled(false);
-		cutAction.setEnabled(false);
-		copyAction.setEnabled(false);
-		pasteAction.setEnabled(false);
-		undoAction.setEnabled(false);
-		redoAction.setEnabled(false);
-	}
-
-	public void enableGlobalEditMenu() {
-		deleteAction.setEnabled(true);
-		if (libraryViewEditAction != null)
-			libraryViewEditAction.setEnabled(true);
-		if (configViewEditAction != null)
-			configViewEditAction.setEnabled(true);
-		cutAction.setEnabled(true);
-		copyAction.setEnabled(true);
-		pasteAction.setEnabled(true);
-		undoAction.setEnabled(true);
-		redoAction.setEnabled(true);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#activate()
-	 */
-	public void activate() {
-		activeViewPart.addPropertyListener(this);
-		
-		deleteAction.setEditingDomain(editingDomain);
-		cutAction.setEditingDomain(editingDomain);
-		copyAction.setEditingDomain(editingDomain);
-		pasteAction.setEditingDomain(editingDomain);
-		undoAction.setEditingDomain(editingDomain);
-		redoAction.setEditingDomain(editingDomain);
-
-		if (loadResourceAction != null) {
-			loadResourceAction.setEditingDomain(editingDomain);
-		}
-
-		ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
-				: activeViewPart.getSite().getSelectionProvider();
-		selectionProvider.addSelectionChangedListener(deleteAction);
-		selectionProvider.addSelectionChangedListener(libraryViewEditAction);
-		selectionProvider.addSelectionChangedListener(cutAction);
-		selectionProvider.addSelectionChangedListener(copyAction);
-		selectionProvider.addSelectionChangedListener(pasteAction);
-		if (validateAction != null) {
-			selectionProvider.addSelectionChangedListener(validateAction);
-		}
-
-		if (controlAction != null) {
-			selectionProvider.addSelectionChangedListener(controlAction);
-		}      		
-
-		update();
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#update()
-	 */
-	public void update() {
-		if (activeViewPart == null)
-			return;
-
-		ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
-				: activeViewPart.getSite().getSelectionProvider();
-		ISelection selection = selectionProvider.getSelection();
-		IStructuredSelection structuredSelection = selection instanceof IStructuredSelection ? (IStructuredSelection) selection
-				: StructuredSelection.EMPTY;
-
-		deleteAction.updateSelection(structuredSelection);
-		libraryViewEditAction.updateSelection(structuredSelection);
-		cutAction.updateSelection(structuredSelection);
-		copyAction.updateSelection(structuredSelection);
-		pasteAction.updateSelection(structuredSelection);
-		undoAction.update();
-		redoAction.update();
-
-		if (loadResourceAction != null) {
-			loadResourceAction.update();
-		}
-
-		if (validateAction != null) {
-			validateAction.updateSelection(structuredSelection);
-		}
-	}
-
-	/**
-	 * This implements
-	 * {@link org.eclipse.jface.viewers.ISelectionChangedListener}, handling
-	 * {@link org.eclipse.jface.viewers.SelectionChangedEvent} by querying for
-	 * the children and siblings that can be added to the selected object and
-	 * updating the menus accordingly.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		// Remove any menu items for old selection.
-		if (createChildMenuManager != null) {
-			depopulateManager(createChildMenuManager, createChildActions);
-		}
-		if (createSiblingMenuManager != null) {
-			depopulateManager(createSiblingMenuManager, createSiblingActions);
-		}
-
-		// Query the new selection for appropriate new child/sibling descriptors
-		Collection newChildDescriptors = null;
-
-		ISelection selection = event.getSelection();
-		if (selection instanceof IStructuredSelection
-				&& ((IStructuredSelection) selection).size() == 1) {
-			Object object = ((IStructuredSelection) selection)
-					.getFirstElement();
-
-			EditingDomain domain = ((IEditingDomainProvider) activeViewPart)
-					.getEditingDomain();
-
-			newChildDescriptors = domain.getNewChildDescriptors(object, null);
-		}
-
-		// Generate actions for selection; populate and redraw the menus.
-		createChildActions = generateCreateChildActions(newChildDescriptors,
-				selection);
-
-		if (createChildMenuManager != null) {
-			populateManager(createChildMenuManager, createChildActions, null);
-			createChildMenuManager.update(true);
-		}
-	}
-
-	/**
-	 * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction}
-	 * for each object in <code>descriptors</code>, and returns the
-	 * collection of these actions.
-	 */
-	protected Collection generateCreateChildActions(Collection descriptors,
-			ISelection selection) {
-		Collection actions = new ArrayList();
-		if (descriptors != null) {
-			for (Iterator i = descriptors.iterator(); i.hasNext();) {
-				actions.add(new MethodCreateChildAction(editingDomain,
-						selection, i.next()));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This generates a
-	 * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each
-	 * object in <code>descriptors</code>, and returns the collection of
-	 * these actions.
-	 */
-	protected Collection generateCreateSiblingActions(Collection descriptors,
-			ISelection selection) {
-		Collection actions = new ArrayList();
-		if (descriptors != null) {
-			for (Iterator i = descriptors.iterator(); i.hasNext();) {
-				actions.add(new MethodCreateSiblingAction(activeViewPart,
-						selection, i.next()));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This populates the specified <code>manager</code> with
-	 * {@link org.eclipse.jface.action.ActionContributionItem}s based on the
-	 * {@link org.eclipse.jface.action.IAction}s contained in the
-	 * <code>actions</code> collection, by inserting them before the specified
-	 * contribution item <code>contributionID</code>. If <code>ID</code> is
-	 * <code>null</code>, they are simply added.
-	 */
-	protected void populateManager(IContributionManager manager,
-			Collection actions, String contributionID) {
-		if (actions != null) {
-			for (Iterator i = actions.iterator(); i.hasNext();) {
-				IAction action = (IAction) i.next();
-				if (contributionID != null) {
-					manager.insertBefore(contributionID, action);
-				} else {
-					manager.add(action);
-				}
-			}
-		}
-	}
-
-	/**
-	 * This removes from the specified <code>manager</code> all
-	 * {@link org.eclipse.jface.action.ActionContributionItem}s based on the
-	 * {@link org.eclipse.jface.action.IAction}s contained in the
-	 * <code>actions</code> collection.
-	 */
-	protected void depopulateManager(IContributionManager manager,
-			Collection actions) {
-		if (actions != null) {
-			IContributionItem[] items = manager.getItems();
-			for (int i = 0; i < items.length; i++) {
-				// Look into SubContributionItems
-				IContributionItem contributionItem = items[i];
-				while (contributionItem instanceof SubContributionItem) {
-					contributionItem = ((SubContributionItem) contributionItem)
-							.getInnerItem();
-				}
-
-				// Delete the ActionContributionItems with matching action.
-				if (contributionItem instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) contributionItem)
-							.getAction();
-					if (actions.contains(action)) {
-						manager.remove(contributionItem);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * This populates the pop-up menu before it appears.
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		super.menuAboutToShow(menuManager);
-		MenuManager submenuManager = null;
-
-		submenuManager = new MenuManager(AuthoringUIResources._UI_CreateChild_menu_item); 
-		populateManager(submenuManager, createChildActions, null);
-		menuManager.insertBefore("additions", submenuManager); //$NON-NLS-1$
-	}
-
-	/**
-	 * Inserts global actions before the "additions-end" separator.
-	 */
-	protected void addGlobalActions(IMenuManager menuManager) {
-		menuManager.insertAfter("additions-end", new Separator("ui-actions")); //$NON-NLS-1$ //$NON-NLS-2$
-
-		refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
-		menuManager.insertAfter("ui-actions", refreshViewerAction); //$NON-NLS-1$
-
-		menuManager.insertBefore("additions-end", new Separator()); //$NON-NLS-1$
-		
-	    String key = (style & ADDITIONS_LAST_STYLE) == 0 ? "additions-end" : "additions"; //$NON-NLS-1$ //$NON-NLS-2$
-	    if (validateAction != null)
-	    {
-	      menuManager.insertBefore(key, new ActionContributionItem(validateAction));
-	    }
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#init(IActionBars,
-	 *      IWorkbenchPage)
-	 */
-	public void init(IActionBars actionBars, IWorkbenchPage page) {
-		super.init(actionBars, page);
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#init(IActionBars)
-	 */
-	public void init(IActionBars actionBars) {
-		viewActionBars = actionBars;
-
-		ISharedImages sharedImages = PlatformUI.getWorkbench()
-				.getSharedImages();
-
-		libraryViewEditAction = new LibraryViewEditAction(AuthoringUIResources.actionLabel_edit); 
-		actionBars.setGlobalActionHandler(LibraryViewEditAction.ACTION_ID,
-				libraryViewEditAction);
-
-		cutAction = createCutAction();
-		cutAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-		actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction);
-
-		copyAction = createCopyAction();
-		copyAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-				copyAction);
-
-		pasteAction = createPasteAction();
-		pasteAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-				pasteAction);
-
-		deleteAction = createDeleteAction();
-		deleteAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-				deleteAction);
-		
-		undoAction = new UndoAction();
-		undoAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
-		actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-				undoAction);
-
-		redoAction = new RedoAction();
-		redoAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
-		actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-				redoAction);
-
-		libraryViewEditAction.setEnabled(false);
-		
-		contributeToToolBar(actionBars.getToolBarManager());
-	}
-
-	/**
-	 * Creates cut action
-	 * @return action
-	 */
-	protected CutAction createCutAction() {
-		return new CutAction();
-	}
-	
-	/**
-	 * Creates paste action
-	 * @return action
-	 */
-	protected PasteAction createPasteAction() {
-		return new PasteAction();
-	}
-	
-	/**
-	 * Creates copy action
-	 * @return action
-	 */
-	protected CopyAction createCopyAction() {
-		return new CopyAction();
-	}
-	
-	/**
-	 * Creates delete action
-	 * @return action
-	 */
-	protected DeleteAction createDeleteAction() {
-		return new DeleteAction();
-	}
-	
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#getActionBars()
-	 */
-	public IActionBars getActionBars() {
-		return viewActionBars;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryValidateAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryValidateAction.java
deleted file mode 100644
index f8a5dee..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryValidateAction.java
+++ /dev/null
@@ -1,298 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.common.util.DiagnosticChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.Diagnostician;
-import org.eclipse.emf.ecore.util.EObjectValidator;
-import org.eclipse.emf.edit.ui.EMFEditUIPlugin;
-import org.eclipse.emf.edit.ui.action.ValidateAction;
-import org.eclipse.epf.authoring.ui.providers.MethodElementLabelDecorator;
-import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyValidationMgr;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.epf.validation.LibraryEValidator;
-import org.eclipse.epf.validation.constraints.LibraryTraversalStrategy;
-import org.eclipse.epf.validation.constraints.LibraryTraversalStrategy.LibraryIterator;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ISetSelectionTarget;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class LibraryValidateAction extends ValidateAction {
-	private HashSet resources;
-	private boolean success;
-	private boolean showSuccess = true;
-	private Map contextData = new HashMap();
-
-	public LibraryValidateAction() {
-		super();
-		eclipseResourcesUtil = new LibraryValidationMarkerHelper();
-	}
-	
-	public LibraryValidateAction(boolean showSuccess) {
-		this();
-		this.showSuccess  = showSuccess;
-	}
-	
-	public void putContextData(Object key, Object value) {
-		contextData.put(key, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.ui.action.ValidateAction#validate(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected Diagnostic validate(final IProgressMonitor progressMonitor) {
-	    if(resources == null) {
-	    	resources = new HashSet();
-	    }
-	    else {
-	    	resources.clear();
-	    }
-	    boolean dependencyInfoMgrSet = false;
-		Collection eObjects = new ArrayList();
-		for (Iterator iter = selectedObjects.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if(element instanceof EObject) {
-				eObjects.add(element);
-				Resource resource = ((EObject)element).eResource();
-				if(resource != null) {
-					resources.add(resource);
-				}
-				if (! dependencyInfoMgrSet && element instanceof MethodElement) {
-					MethodLibrary lib = UmaUtil.getMethodLibrary((MethodElement) element);	
-					putContextData(LibraryEValidator.CTX_DEPENDENCY_VALIDATION_MGR, new DependencyValidationMgr(lib));
-					dependencyInfoMgrSet = true;
-				}
-			}
-		}
-		
-	    int count = eObjects.size();
-	    eObjects = LibraryTraversalStrategy.makeTargetsDisjoint(eObjects);
-		LibraryIterator libIter = new LibraryIterator(eObjects, true, LibraryTraversalStrategy.DEEP, true);
-		while(libIter.hasNext()) {
-			Object o = libIter.next();
-			count++;
-			if(o instanceof EObject) {
-				Resource resource = ((EObject)o).eResource();
-				if(resource != null) {
-					resources.add(resource);
-				}
-			}
-		}
-		
-	    progressMonitor.beginTask("", count); //$NON-NLS-1$
-
-//	    final AdapterFactory adapterFactory = 
-//	      domain instanceof AdapterFactoryEditingDomain ? ((AdapterFactoryEditingDomain)domain).getAdapterFactory() : null;
-
-	    Diagnostician diagnostician = 
-	      new Diagnostician()
-	      {
-	        public String getObjectLabel(EObject eObject)
-	        {
-//	          if (adapterFactory != null && !eObject.eIsProxy())
-//	          {
-//	            IItemLabelProvider itemLabelProvider = (IItemLabelProvider)adapterFactory.adapt(eObject, IItemLabelProvider.class);
-//	            if (itemLabelProvider != null)
-//	            {
-//	              return itemLabelProvider.getText(eObject);
-//	            }
-//	          }
-//	  
-//	          return super.getObjectLabel(eObject);
-	        	
-	        	return TngUtil.getLabelWithPath(eObject);
-	        }
-
-	        public boolean validate(EClass eClass, EObject eObject, DiagnosticChain diagnostics, Map context)
-	        {
-	          progressMonitor.worked(1);
-	          if(context == null) {
-	        	  context = contextData;	        	  
-	          }
-	          else {
-	        	  context.putAll(contextData);
-	          }
-	          return super.validate(eClass, eObject, diagnostics, context);
-	        }	        
-	        
-	      };
-	      
-	      List list = new ArrayList(eObjects);
-	      int max = list.size() - 1;
-	      StringBuffer strBuf = new StringBuffer();
-	      for (int i = 0; i < max; i++) {
-	    	  Object e = list.get(i);
-	    	  if(e instanceof NamedElement) {
-	    		  strBuf.append(((NamedElement)e).getName()).append(", "); //$NON-NLS-1$
-	    	  }
-	      }
-	      Object e = max < 0 ? null : list.get(max);
-	      if(e instanceof NamedElement) {
-    		  strBuf.append(((NamedElement)e).getName());
-    	  }
-	      BasicDiagnostic diagnostics = 
-	          new BasicDiagnostic
-	            (EObjectValidator.DIAGNOSTIC_SOURCE,
-	             0,
-	             EcorePlugin.INSTANCE.getString
-	               ("_UI_DiagnosticRoot_diagnostic", //$NON-NLS-1$ 
-	                new Object [] { strBuf.toString() }), 
-	             list.toArray());
-	      for (Iterator iter = eObjects.iterator(); iter.hasNext();) {
-	    	  EObject eObject = (EObject) iter.next();
-	    	  progressMonitor.setTaskName
-	    	  (EMFEditUIPlugin.INSTANCE.getString("_UI_Validating_message", new Object [] {diagnostician.getObjectLabel(eObject)})); //$NON-NLS-1$
-	    	  diagnostician.validate(eObject, diagnostics);
-	      }
-	      success = diagnostics.getSeverity() == Diagnostic.OK;
-	      return diagnostics;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.ui.action.ValidateAction#handleDiagnostic(org.eclipse.emf.common.util.Diagnostic)
-	 */
-	protected void handleDiagnostic(Diagnostic diagnostic) {
-		if(diagnostic != null) {
-			if(showSuccess || !isSuccessful()) {
-				// save the reference to EclipseResourcesUtil and set eclipseResourcesUtil to null
-				// so super method will not try to deal with the markers
-				//
-				EclipseResourcesUtil savedRef = eclipseResourcesUtil;
-				eclipseResourcesUtil = null;
-				try {
-					super.handleDiagnostic(diagnostic);
-				}
-				finally {
-					eclipseResourcesUtil = savedRef;
-				}
-			}
-			
-			// dealing with markers
-			//
-			if (eclipseResourcesUtil != null)				
-			{
-				// delete old markers
-				//					
-				for (Iterator iter = resources.iterator(); iter.hasNext();) {
-					eclipseResourcesUtil.deleteMarkers((Resource) iter.next());
-				}
-				
-				Viewer viewer = null;
-				if (!diagnostic.getChildren().isEmpty())
-				{
-					Map diagnosticToResourceMap = new HashMap();
-					for (Iterator i = diagnostic.getChildren().iterator(); i.hasNext(); )
-					{
-						Diagnostic childDiagnostic = (Diagnostic)i.next();
-						List data = childDiagnostic.getData();
-						if (!data.isEmpty()) {
-							Object o = data.get(0);
-							if(o instanceof EObject) {
-								Resource resource = ((EObject)o).eResource();
-								if(resource != null) {
-									diagnosticToResourceMap.put(childDiagnostic, resource);
-								}
-							}
-						}
-					}
-										
-					// create markers
-					//
-					for (Iterator i = diagnosticToResourceMap.entrySet().iterator(); i.hasNext(); )
-					{
-						Map.Entry entry = (Entry) i.next();
-						Diagnostic childDiagnostic = (Diagnostic)entry.getKey();
-						Resource resource = (Resource) entry.getValue();
-						eclipseResourcesUtil.createMarkers(resource, childDiagnostic);
-					}
-					
-					// select the first object with problem in the viewer if possible
-					//
-					List data = ((Diagnostic)diagnostic.getChildren().get(0)).getData();
-					if (!data.isEmpty())
-					{
-						Object part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();						
-						Object e = data.get(0);
-						if (part instanceof ISetSelectionTarget)
-						{
-							((ISetSelectionTarget)part).selectReveal(new StructuredSelection(e));
-						}
-						else if (part instanceof IViewerProvider)
-						{
-							viewer = ((IViewerProvider)part).getViewer();
-							if (viewer != null)
-							{
-								viewer.setSelection(new StructuredSelection(data.get(0)), true);
-							}
-						}
-					}					
-				}
-				if(viewer == null) {
-					Object part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
-					if (part instanceof IViewerProvider)
-					{
-						viewer = ((IViewerProvider)part).getViewer();
-					}
-				}
-				if(viewer != null) {
-					// clear decoration cache
-					//
-					MethodElementLabelDecorator.clearDecorationCache();
-					viewer.refresh();
-				}
-				
-				try {
-					refreshViews();
-				}
-				catch(Exception e) {
-					
-				}
-			}
-		}
-	}
-	
-	protected void refreshViews() {
-		// no error markers for configuration view
-		//
-//		ConfigurationView.getView().getViewer().refresh();
-	}
-
-	public boolean isSuccessful() {
-		return success;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewCopyAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewCopyAction.java
deleted file mode 100644
index e109877..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewCopyAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.command.CopyToClipboardCommand;
-import org.eclipse.emf.edit.ui.action.CopyAction;
-import org.eclipse.epf.common.ui.util.ClipboardUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-
-/**
- * Copies an element in the Library view.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryViewCopyAction extends CopyAction {
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		if (command == null)
-			return;
-		else {
-			if (domain instanceof TraceableAdapterFactoryEditingDomain) {
-				((TraceableAdapterFactoryEditingDomain) domain).resetCopyMaps();
-			}
-			if (command instanceof CopyToClipboardCommand) {
-				String links = ""; //$NON-NLS-1$
-				for (Iterator iter = ((CopyToClipboardCommand)command).getSourceObjects().iterator();iter.hasNext();) {
-					Object item = TngUtil.unwrap(iter.next());
-					if (item instanceof MethodElement) {
-						MethodElement e = (MethodElement)item;
-						String href = ResourceHelper.getUrl(e,
-								null, "html"); //$NON-NLS-1$
-						if (links.length() > 0) {
-							links += StrUtil.LINE_FEED;
-						}
-						links += ResourceHelper.getElementLink(e, true,
-								"file://" + href); //$NON-NLS-1$
-					}
-				}
-				if (links.length() > 0) {
-					ClipboardUtil.copyTextHTMLToClipboard(links);
-				}
-			}
-			super.run();
-		}
-	}
-
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		if (selection == null || selection.isEmpty())
-			return false;
-
-		Collection collection = new ArrayList();
-		for (Iterator objects = selection.iterator(); objects.hasNext();) {
-			Object element = TngUtil.unwrap(objects.next());
-			if (element instanceof MethodElement
-					&& !(element instanceof MethodPlugin)
-					&& !TngUtil.isPredefined((MethodElement) element)) {
-				collection.add(element);
-			}
-
-		}
-
-		command = createCommand(collection);
-
-		return command.canExecute();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewCutAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewCutAction.java
deleted file mode 100644
index 72ccde2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewCutAction.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.emf.edit.ui.action.CutAction;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Cuts an element in the Library view to the clipboard.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryViewCutAction extends CutAction {
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		if (command == null)
-			return;
-		else
-			super.run();
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		return false;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewDeleteAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewDeleteAction.java
deleted file mode 100644
index 47f44fc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewDeleteAction.java
+++ /dev/null
@@ -1,345 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.IEditorKeeper;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.ui.actions.MethodElementDeleteAction;
-import org.eclipse.epf.library.ui.actions.ProcessDeleteAction;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-
-/**
- * Deletes an element in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryViewDeleteAction extends MethodElementDeleteAction {
-	
-	/** 
-	 * Delets an element in library view
-	 * 
-	 */
-	public LibraryViewDeleteAction() {
-		this(true);
-	}
-	
-	/**
-	 * Deletes an element in library view after confirming with user
-	 * @param confirm
-	 */
-	public LibraryViewDeleteAction(boolean confirm) {
-		super();
-		this.confirm = confirm; 
-	}
-
-	/**
-	 * @see MethodElementDeleteAction#didDelete(Collection)
-	 */
-	protected void didDelete(Collection deletedElements) {
-		super.didDelete(deletedElements);
-		
-		// Close all open editors associated with the deleted elements.
-		for (Iterator iter = deletedElements.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if (element instanceof MethodElement
-					&& ((MethodElement) element).eContainer() == null) {
-				IEditorKeeper.REFERENCE.getEditorKeeper()
-						.closeEditorsOnDeletion((MethodElement) element);
-			}
-		}
-	}
-	
-	protected static CustomCategory getRootCustomCategory(Object object) {
-		for(; object instanceof IWrapperItemProvider; object = ((IWrapperItemProvider)object).getOwner());
-		object = TngUtil.unwrap(object);
-		return object instanceof CustomCategory && TngUtil.isRootCustomCategory((CustomCategory) object) ?
-			(CustomCategory) object : null;
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		ArrayList filteredSelection = new ArrayList();
-
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object e = iter.next();
-			if(e instanceof CustomCategory) {
-				filteredSelection.add(e);
-				continue;
-			}
-			Object element = TngUtil.unwrap(e);
-			if (element instanceof ItemProviderAdapter
-					|| (element instanceof MethodElement && TngUtil
-							.isPredefined((MethodElement) element))) {
-				continue;
-			}
-			if (element instanceof CustomCategory) {
-				CustomCategory rootCustomCategory = getRootCustomCategory(e);
-				CustomCategory cc = (CustomCategory) element;
-				if (rootCustomCategory != null && 
-						UmaUtil.getMethodPlugin(rootCustomCategory) == UmaUtil.getMethodPlugin(cc)) {
-					// selected custome category is in the current plugin.
-					// add the element to the selection instead of its
-					// wrapper so the element
-					// will be deleted permanently from the library
-					//
-					filteredSelection.add(element);					
-				}
-			} else {				
-				if(e instanceof IWrapperItemProvider) {
-					IWrapperItemProvider wrapper = (IWrapperItemProvider) e;
-//					if(wrapper.getValue() instanceof IWrapperItemProvider &&
-//							!(TngUtil.unwrap(wrapper.getOwner()) instanceof CustomCategory)) {
-//						// disallow deleting element when its reference in
-//						// CustomCategory tree
-//						// that is not directly under a CustomCategory is
-//						// selected
-//						//
-//						continue;
-//					}
-					
-					if (TngUtil.isUnderCustomCategoryTree(wrapper)) {
-						// disallow deleting element under a custom category that is not a custom category
-						//
-						continue;
-					}
-					else if (wrapper.getFeature() == UmaPackage.Literals.DISCIPLINE_GROUPING__DISCIPLINES 
-							|| wrapper.getFeature() == UmaPackage.Literals.ROLE_SET_GROUPING__ROLE_SETS) 
-					{
-						Object owner = wrapper.getOwner();
-						if(owner instanceof EObject && element instanceof EObject && 
-								UmaUtil.getMethodPlugin((EObject) owner) == UmaUtil.getMethodPlugin((EObject) element)) {
-							// category grouping and category are in the same plugin
-							// add the element to the selection instead of its wrapper so the element 
-							// will be deleted permanently from the library
-							//
-							filteredSelection.add(element);
-							continue;
-						} else {
-							continue;
-						}
-					}
-				}
-				filteredSelection.add(e);
-			}
-		}
-
-		if (filteredSelection.isEmpty())
-			return false;
-
-		return super
-				.updateSelection(new StructuredSelection(filteredSelection));
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ui.actions.MethodElementDeleteAction#performDelete()
-	 */
-	protected void performDelete() {
-		HashSet configsToDelete = new HashSet();
-		HashSet modifiedResources = new HashSet();
-		ILibraryPersister persister = LibraryServiceUtil.getCurrentPersister();
-		if (selection != null && selection.size() > 0) {
-			for (Iterator iter = selection.iterator(); iter.hasNext();) {
-				Object object = TngUtil.unwrap(iter.next());
-				if (object instanceof MethodConfiguration) {
-					configsToDelete.add(object);
-				}
-				if (object instanceof EObject && !persister.hasOwnResourceWithoutReferrer(object)) {
-					EObject container = ((EObject) object).eContainer();
-					if (container != null && container.eResource() != null) {
-						modifiedResources.add(container.eResource());
-					}
-				}
-			}
-		}
-
-		// Avoid deleting the default configuration of a process.
-		if (!configsToDelete.isEmpty()) {
-			HashSet configGUIDsToDelete = new HashSet();
-			for (Iterator iter = configsToDelete.iterator(); iter.hasNext();) {
-				MethodConfiguration config = (MethodConfiguration) iter.next();
-				configGUIDsToDelete.add(config.getGuid());
-			}
-			ILibraryResourceSet resourceSet = (ILibraryResourceSet) LibraryService
-					.getInstance().getCurrentMethodLibrary().eResource()
-					.getResourceSet();
-			resourceSet
-					.loadOppositeFeatures(
-							Collections
-									.singletonList(AssociationHelper.MethodConfiguration_DependentProcesses),
-							configGUIDsToDelete);
-
-			for (Iterator iter = configsToDelete.iterator(); iter.hasNext();) {
-				MethodConfiguration config = (MethodConfiguration) iter.next();
-
-				List references = AssociationHelper
-						.getDependentProcesses(config);
-				if (references != null && references.size() > 0) {
-					String processName = ((org.eclipse.epf.uma.Process) references
-							.get(0)).getName();
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayWarning(
-									AuthoringUIResources.deleteDialog_title, 
-									AuthoringUIResources.deleteConfigError_msg, 
-									AuthoringUIResources
-											.bind(
-													AuthoringUIResources.deleteConfigError_reason,
-													processName)); 
-					return;
-				}
-
-			}
-
-		}
-
-		IStatus status = UserInteractionHelper.checkModify(modifiedResources,
-				LibraryEditPlugin.getDefault().getContext());
-		if (!status.isOK()) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().display(
-					AuthoringUIResources.deleteDialog_title, 
-					status);
-			return;
-		}
-
-		if (confirmDelete()) {
-			// Collect the information of Refreshable Objects
-			// ( Reference Objects should be refreshed in navigation tree) -
-			ArrayList refreshList = new ArrayList();
-			for (Iterator iter = selection.iterator(); iter.hasNext();) {
-				Object deletingObject = TngUtil.unwrap(iter.next());
-				if (deletingObject instanceof MethodElement) {
-					// check for variability
-					if (deletingObject instanceof VariabilityElement) {
-						for (Iterator iterator = TngUtil
-								.getGeneralizers((VariabilityElement) deletingObject); iterator
-								.hasNext();) {
-							Object aReference = iterator.next();
-							refreshList.add(aReference);
-						}
-					}
-				}
-			}
-
-			DeleteMethodElementCommand cmd = (DeleteMethodElementCommand) (command instanceof DeleteMethodElementCommand ? command : null);
-			
-			// execute actual delete command.
-			command.execute();
-
-			// delete the referencing descriptors if there is any
-			//
-			if(cmd != null) {
-				Collection<Descriptor> descriptorsToDelete = cmd.getDescriptorsToDelete();
-				if(descriptorsToDelete != null && !descriptorsToDelete.isEmpty()) {
-					ProcessDeleteAction.delete(descriptorsToDelete);
-				}
-			}
-
-			// Refresh the refreshlist objects in navigation tree.
-			if (refreshList.size() > 0) {
-				TreeViewer viewer = ((TreeViewer) (LibraryView.getView()
-						.getViewer()));
-				for (Iterator iter = refreshList.iterator(); iter.hasNext();) {
-					viewer.refresh(iter.next());
-				}
-			}			
-		}
-	}
-
-	/**
-	 * Notify propery change with old and new value
-	 * 
-	 * @param propertyName
-	 * 			property name for which value is going to change
-	 * @param oldValue
-	 * 			Old value of the property
-	 * @param newValue
-	 * 			New value of the property
-	 */
-	public void notifyPropertyChange(String propertyName, Object oldValue,
-			Object newValue) {
-		super.firePropertyChange(propertyName, oldValue, newValue);
-	}
-
-	/**
-	 * Handle the special case of customcategory Copy/Delete action If parent of
-	 * customcategory selected, ignore the customcategory, otherwise compound
-	 * command creates a command for parent and a command for child,
-	 * CompoundCommand will execute both commands, command for parent will
-	 * remove parent itself and removes child too, next it try to execute
-	 * command for child, command will fail because child got remove in command
-	 * for parent. 
-	 * TODO: handle properly in RemoveCommand for this case instead here.
-	 */
-	public void filterCustomCategorySelection(Object e, List filteredSelection) {
-		if (e instanceof FeatureValueWrapperItemProvider) {
-			filteredSelection.add(e);
-		} else {
-			Object owner = ((DelegatingWrapperItemProvider) e).getOwner();
-			while (owner instanceof DelegatingWrapperItemProvider) {
-				if (owner instanceof FeatureValueWrapperItemProvider) {
-					if (!filteredSelection.contains(owner)) {
-						filteredSelection.add(e);
-					}
-					break;
-				} else {
-					if (filteredSelection.contains(owner))
-						break;
-					owner = ((DelegatingWrapperItemProvider) owner).getOwner();
-					if (!(owner instanceof FeatureValueWrapperItemProvider)) {
-						if (!filteredSelection.contains(owner)) {
-							filteredSelection.add(e);
-							break;
-						}
-					}
-				}
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewEditAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewEditAction.java
deleted file mode 100644
index fb60dd3..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewEditAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.actions.BaseSelectionListenerAction;
-
-
-/**
- * Edits an element in the Library view.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryViewEditAction extends BaseSelectionListenerAction {
-
-	/**
-	 * The ID for this action.
-	 */
-	public static final String ACTION_ID = LibraryViewEditAction.class.getName();
-	
-	private Collection selected;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryViewEditAction(String text) {
-		super(text);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		for (Iterator objects = selected.iterator(); objects.hasNext();) {
-			Object element = objects.next();
-			EditorChooser.getInstance().openEditor(element);
-		}
-	}
-
-	/**
-	 * Updates this action in response to the given selection changes.
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		if (selection.isEmpty()) {
-			return false;
-		}
-
-		selected = new HashSet();
-
-		for (Iterator objects = selection.iterator(); objects.hasNext();) {
-			Object element = objects.next();
-			Object realObj = TngUtil.unwrap(element);
-			if (realObj instanceof MethodElement
-					&& !TngUtil.isPredefined((MethodElement) realObj)
-					&& !(realObj instanceof ProcessPackage && !(realObj instanceof ProcessComponent))) {
-				selected.add(realObj);
-			}
-		}
-
-		return !selected.isEmpty();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewFindElementAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewFindElementAction.java
deleted file mode 100644
index abe93bd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewFindElementAction.java
+++ /dev/null
@@ -1,90 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.BaseSelectionListenerAction;
-
-/**
- * 
- * Finds an element in library view
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- *
- */
-public class LibraryViewFindElementAction extends BaseSelectionListenerAction {
-
-	/**
-	 * The ID for this action.
-	 */
-	public static final String ACTION_ID = LibraryViewFindElementAction.class
-			.getName();
-	
-	private LibraryView targetView;
-	private IStructuredSelection selected;
-
-	
-	public LibraryViewFindElementAction(String text) {
-		super(text);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (targetView == null)
-			targetView = LibraryView.getView();
-
-		// select currentSelection in Lib View
-		if (targetView != null && selected != null && !selected.isEmpty()) {
-
-			try {
-				targetView.getSite().getPage().showView(LibraryView.VIEW_ID);
-			} catch (PartInitException pe) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(pe);
-			}
-
-			final Object selectedObject = selected.getFirstElement();
-			if (selectedObject != null) {
-				Display.getCurrent().asyncExec(new Runnable() {
-					public void run() {
-						LibraryView.getView().setSelectionToViewer(
-								selectedObject);
-					}
-
-				});
-
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	protected boolean updateSelection(IStructuredSelection selection) {
-		selected = selection;
-		if (selection != null && !selection.isEmpty()) {
-			Object element = selection.getFirstElement();
-			Object realObj = TngUtil.unwrap(element);
-			if (realObj instanceof MethodElement) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewPasteAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewPasteAction.java
deleted file mode 100644
index 17588a4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewPasteAction.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
-import org.eclipse.emf.edit.ui.action.PasteAction;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.library.edit.category.StandardCategoriesItemProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.ui.actions.ILibraryAction;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-
-/**
- * Pastes an element from the clipboard to the Library view.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=181559
- */
-public class LibraryViewPasteAction extends PasteAction implements
-		ILibraryAction {
-
-	private IProgressMonitor progressMonitor;
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.setProgressMonitor(getProgressMonitor());
-		runner.run(new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				performPaste();
-			}
-			
-		});
-	}
-	
-	/**
-	 * Perform paste operation
-	 */
-	protected void performPaste() {
-		if(command instanceof PasteFromClipboardCommand) {
-			PasteFromClipboardCommand cmd = ((PasteFromClipboardCommand)command);
-			Object owner = cmd.getOwner();
-			if(owner instanceof Adapter) {
-				owner = ((Adapter)owner).getTarget();
-			}
-			
-			// check target for modifiable
-			//
-			if(owner instanceof EObject) {
-				IStatus status = UserInteractionHelper.checkModify((EObject) owner, MsgBox.getDefaultShell());
-				if (!status.isOK()) {
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							getText(), null, status);
-					return;
-				}
-			}			
-		}
-		
-		if (command == null)
-			return;
-		else
-			super.run();
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		if(selection == null || selection.isEmpty() || selection.size() != 1)
-			return false;
-		else{
-			Object object = selection.getFirstElement();
-			if(object instanceof MethodPlugin)
-				return false;
-			if(object instanceof StandardCategoriesItemProvider)
-				return false;
-		}
-		
-		return super.updateSelection(selection);
-	}
-	
-	/**
-	 * Notify propery change with old and new value
-	 * 
-	 * @param propertyName
-	 * 			property name for which value is going to change
-	 * @param oldValue
-	 * 			Old value of the property
-	 * @param newValue
-	 * 			New value of the property
-	 */
-	public void notifyPropertyChange(String propertyName, Object oldValue,
-			Object newValue) {
-		super.firePropertyChange(propertyName, oldValue, newValue);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ui.actions.ILibraryAction#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		progressMonitor = monitor;
-	}
-
-	/**
-	 * Returns progress monitor
-	 * @return the progressMonitor
-	 */
-	protected IProgressMonitor getProgressMonitor() {
-		if(progressMonitor == null) {
-			progressMonitor = new NullProgressMonitor();
-		}
-		return progressMonitor;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LinkWithEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LinkWithEditor.java
deleted file mode 100644
index 9a63462..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LinkWithEditor.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Links editor with an element in library view
- * @author Jeff Hardy
- * @since 1.0
- *
- */
-public class LinkWithEditor implements IViewActionDelegate {
-
-	private LibraryView targetView;
-
-	private static boolean enabled = false;
-
-	private IPartListener editorPartListener = new IPartListener() {
-
-		public void partOpened(IWorkbenchPart part) {
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		public void partActivated(IWorkbenchPart part) {
-			if (part instanceof IEditorPart) {
-				// Select the method element associated with the currently
-				// selected editor.
-				Object[] objects = new Object[1];
-				objects[0] = EditorChooser.getInstance()
-						.getActiveMethodEditorInput();
-				if (objects[0] != null) {
-					// disable the selectionChanged method from firing from this selection change
-					enabled = false;
-					targetView.setSelectionToViewer(objects[0]);
-					enabled = true;
-				}
-			}
-
-		}
-	};
-
-	/**
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		targetView = (LibraryView) view;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (enabled) {
-			// remove listeners from editorpart
-			targetView.getSite().getPage().removePartListener(
-					editorPartListener);
-
-			enabled = false;
-		} else {
-			// select element of currently selected editor
-			Object[] objects = new Object[1];
-			objects[0] = EditorChooser.getInstance().getActiveMethodEditorInput();
-			if (objects[0] != null) {
-				targetView.setSelectionToViewer(objects[0]);
-			}
-
-			// add listeners to editorpart
-			targetView.getSite().getPage().addPartListener(editorPartListener);
-
-			enabled = true;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		// System.out.println("LinkWithEditor selection is " + selection);
-		if (enabled) {
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			EditorChooser.getInstance().selectEditor(sel.getFirstElement());
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodAddImageAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodAddImageAction.java
deleted file mode 100644
index 8548996..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodAddImageAction.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.io.IOException;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.dialogs.MethodAddImageDialog;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.ui.LibraryUIUtil;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.actions.RichTextAction;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-
-
-/**
- * Displays the Add Image dialog.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class MethodAddImageAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodAddImageAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_ADD_IMAGE);
-		setToolTipText(RichTextResources.addImageAction_toolTipText); 
-		setEnabled(true);
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            A Rich Text control.
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null && richText instanceof IMethodRichText) {
-			MethodAddImageDialog dialog = new MethodAddImageDialog(Display
-					.getCurrent().getActiveShell(),
-					((IMethodRichText) richText).getMethodElement());
-			dialog.open();
-			if (dialog.getReturnCode() == Window.OK) {
-				if (dialog.getFileToCopy() != null) {
-					// Copy the image to the resource folder if necessary.
-					try {
-						String imageLink = NetUtil.decodedFileUrl(LibraryUIUtil.getURLForAttachment(Display
-								.getCurrent().getActiveShell(), dialog
-								.getFileToCopy(),
-								((IMethodRichText) richText)
-										.getMethodElement(), true));
-						if (imageLink == null) {
-							// user hit cancel on RenameFileConflictDialog
-							return;
-						}
-						if (richText instanceof RichTextEditor) {
-							((RichTextEditor) richText).setFocus();
-							((RichTextEditor) richText).addImage(imageLink, "" + dialog.getHeight(), "" + dialog.getWidth(), dialog.getAltTag()); //$NON-NLS-1$ //$NON-NLS-2$
-						} else {
-							richText
-							.executeCommand(
-									RichTextCommand.ADD_IMAGE,
-									new String[] {
-											imageLink,
-											"" + dialog.getHeight(), "" + dialog.getWidth(), dialog.getAltTag() }); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-					} catch (IOException ex) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(ex);
-					}
-				}
-			}
-		}
-	}
-	
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodAddLinkAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodAddLinkAction.java
deleted file mode 100644
index fd0eafc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodAddLinkAction.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.authoring.ui.dialogs.MethodAddLinkDialog;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.ui.LibraryUIUtil;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.actions.AddLinkAction;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Adds a link to a Rich Text editor.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodAddLinkAction extends AddLinkAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodAddLinkAction(IRichText richText) {
-		super(richText);
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            A Rich Text control.
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			if (richText instanceof IMethodRichText) {
-				MethodAddLinkDialog dialog = new MethodAddLinkDialog(Display
-						.getCurrent().getActiveShell(),
-						(IMethodRichText) richText);
-				dialog.open();
-				if (dialog.getReturnCode() == Window.OK) {
-					String linkURL = dialog.getLink().getURL();
-					if (linkURL.length() > 0) {
-						if (dialog.getFileToCopy() != null) {
-							// link to a file, create the URL
-							try {
-								linkURL = LibraryUIUtil.getURLForAttachment(Display
-										.getCurrent().getActiveShell(), dialog
-										.getFileToCopy(),
-										((IMethodRichText) richText)
-												.getMethodElement(), true);
-								if (linkURL == null) {
-									// user hit cancel on RenameFileConflictDialog
-									return;
-								}
-								String url = "<a href=\""; //$NON-NLS-1$
-								if (Platform.getOS().equals(Platform.WS_WIN32)) {
-									url += NetUtil
-											.encodeFileURL(NetUtil.FILE_URI_PREFIX
-													+ linkURL);
-								} else {
-									url += NetUtil.encodeFileURL("./" + linkURL); //$NON-NLS-1$
-								}
-								url += "\"" + (dialog.getOpenLinkInNewWindow() ? " " + //$NON-NLS-1$ //$NON-NLS-2$
-										MethodAddLinkDialog.OPEN_LINK_IN_NEW_WINDOW_ATTRIBUTE : "") +  //$NON-NLS-1$
-										">" + new File(linkURL).getName() + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$
-								linkURL = url;
-
-							} catch (IOException ex) {
-								ex.printStackTrace();
-							}
-						}
-						if (richText instanceof RichTextEditor) {
-							((RichTextEditor) richText).addHTML(linkURL);
-						} else {
-							richText.executeCommand(RichTextCommand.ADD_HTML,
-									linkURL);
-						}
-					}
-				}
-			} else {
-				super.execute(richText);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodCreateChildAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodCreateChildAction.java
deleted file mode 100644
index be95162..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodCreateChildAction.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.command.CreateChildCommand.Helper;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction;
-import org.eclipse.epf.library.edit.process.command.CreateProcessComponentCommand;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelection;
-
-
-/**
- * Method Create Child action.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class MethodCreateChildAction extends StaticSelectionCommandAction {
-	/**
-	 * This describes the child to be created.
-	 */
-	protected Object descriptor;
-
-	/**
-	 * This constructs an instance of an action that creates a child specified
-	 * by <code>descriptor</code> for the single object in the
-	 * <code>selection</code>.
-	 */
-	public MethodCreateChildAction(EditingDomain editingDomain,
-			ISelection selection, Object descriptor) {
-		super();
-		this.editingDomain = editingDomain;
-		this.descriptor = descriptor;
-		configureAction(selection);
-	}
-
-	/**
-	 * This creates the command for {@link
-	 * StaticSelectionCommandAction#createActionCommand}.
-	 */
-	protected Command createActionCommand(EditingDomain editingDomain,
-			Collection collection) {
-		if (collection.size() == 1) {
-			Object owner = collection.iterator().next();
-			Command cmd = null;
-
-			if (descriptor instanceof CommandParameter
-					&& ((CommandParameter) descriptor).getValue() instanceof ProcessComponent) {
-				CommandParameter newChildParameter = (CommandParameter) descriptor;
-				CreateChildCommand.Helper helper = (Helper) ((AdapterFactoryEditingDomain)editingDomain).getAdapterFactory().adapt(owner, IEditingDomainItemProvider.class);
-//				for (Iterator iter = ((EObject) owner).eAdapters().iterator(); iter
-//						.hasNext();) {
-//					Object o = iter.next();
-//					if (o instanceof ProcessPackageItemProvider) {
-//						helper = (ProcessPackageItemProvider) o;
-//						break;
-//					}
-//				}
-				cmd = new CreateProcessComponentCommand(editingDomain,
-						(EObject) owner, newChildParameter
-								.getEStructuralFeature(), newChildParameter
-								.getValue(), newChildParameter.getIndex(),
-						collection, helper) {
-				};
-			} else {
-				cmd = CreateChildCommand.create(editingDomain, owner,
-						descriptor, collection);
-			}
-
-			return new CreateMethodElementCommand(cmd);
-		}
-		return UnexecutableCommand.INSTANCE;
-	}
-	
-	private void superRun() {
-		super.run();
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction#run()
-	 */
-	public void run() {
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.run(new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				superRun();
-			}
-			
-		});
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodCreateSiblingAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodCreateSiblingAction.java
deleted file mode 100644
index 4af4f29..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodCreateSiblingAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Method Create Sibiling action.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class MethodCreateSiblingAction extends
-		StaticSelectionCommandAction {
-
-	/**
-	 * This describes the sibling to be created.
-	 */
-	protected Object descriptor;
-
-	/**
-	 * This constructs an instance of an action that creates a sibling specified
-	 * by <code>descriptor</code>.
-	 */
-	public MethodCreateSiblingAction(IViewPart viewPart, ISelection selection,
-			Object descriptor) {
-		super();
-		if (viewPart instanceof IEditingDomainProvider) {
-			editingDomain = ((IEditingDomainProvider) viewPart)
-					.getEditingDomain();
-		}
-		this.descriptor = descriptor;
-		configureAction(selection);
-	}
-
-	/**
-	 * This creates the command for {@link
-	 * StaticSelectionCommandAction#createActionCommand}.
-	 */
-	protected Command createActionCommand(EditingDomain editingDomain,
-			Collection collection) {
-		if (collection.size() == 1) {
-			Command cmd = CreateChildCommand.create(editingDomain, null,
-					descriptor, collection);
-			return new CreateMethodElementCommand(cmd);
-		}
-		return UnexecutableCommand.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodLibraryActionBarContributor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodLibraryActionBarContributor.java
deleted file mode 100644
index 990b7f8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodLibraryActionBarContributor.java
+++ /dev/null
@@ -1,501 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.CopyAction;
-import org.eclipse.emf.edit.ui.action.CreateChildAction;
-import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
-import org.eclipse.emf.edit.ui.action.CutAction;
-import org.eclipse.emf.edit.ui.action.DeleteAction;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.emf.edit.ui.action.LoadResourceAction;
-import org.eclipse.emf.edit.ui.action.PasteAction;
-import org.eclipse.emf.edit.ui.action.RedoAction;
-import org.eclipse.emf.edit.ui.action.UndoAction;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.SubContributionItem;
-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.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * The contributor for a Method editor.
- *  
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodLibraryActionBarContributor extends
-		EditingDomainActionBarContributor implements ISelectionChangedListener {
-	
-	// Keep track of the active editor.
-	protected IEditorPart activeEditorPart;
-
-	// Keep track of the current selection provider.
-	protected ISelectionProvider selectionProvider;
-
-	// Handle the Show Properties view action.
-	protected IAction showPropertiesViewAction = new Action(
-			getString("_UI_ShowPropertiesView_menu_item")) { //$NON-NLS-1$
-		public void run() {
-			try {
-				getPage().showView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$
-			} catch (PartInitException exception) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(exception);
-			}
-		}
-	};
-
-	/**
-	 * This action refreshes the viewer of the current editor if the editor
-	 * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
-	 */
-	protected IAction refreshViewerAction = new Action(
-			getString("_UI_RefreshViewer_menu_item")) { //$NON-NLS-1$
-		public boolean isEnabled() {
-			return activeEditorPart instanceof IViewerProvider;
-		}
-
-		public void run() {
-			doRefresh();
-		}
-	};
-
-	/**
-	 * This will contain one
-	 * {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to
-	 * each descriptor generated for the current selection by the item provider.
-	 */
-	protected Collection createChildActions;
-
-	/**
-	 * This is the menu manager into which menu contribution items should be
-	 * added for CreateChild actions.
-	 */
-	protected IMenuManager createChildMenuManager;
-
-	/**
-	 * This will contain one
-	 * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding
-	 * to each descriptor generated for the current selection by the item
-	 * provider.
-	 */
-	protected Collection createSiblingActions;
-
-	/**
-	 * This is the menu manager into which menu contribution items should be
-	 * added for CreateSibling actions.
-	 */
-	protected IMenuManager createSiblingMenuManager;
-
-	protected String name;
-
-	protected boolean enabled;
-
-	/**
-	 * This creates an instance of the contributor.
-	 */
-	public MethodLibraryActionBarContributor(String name) {
-		loadResourceAction = new LoadResourceAction();
-		validateAction = new LibraryValidateAction();
-		this.name = name;
-	}
-
-	/**
-	 * Creates delete action
-	 * @return Action
-	 */
-	protected DeleteAction createDeleteAction() {
-		return new DeleteAction();
-	}
-
-	 /**
-	 * 
-	 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#init(org.eclipse.ui.IActionBars)
-	 */
-	public void init(IActionBars actionBars) {
-		ISharedImages sharedImages = PlatformUI.getWorkbench()
-				.getSharedImages();
-
-		deleteAction = createDeleteAction();
-		deleteAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-				deleteAction);
-
-		cutAction = createCutAction();
-		cutAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-		actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), cutAction);
-
-		copyAction = createCopyAction();
-		copyAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-				copyAction);
-
-		pasteAction = createPasteAction();
-		pasteAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-				pasteAction);
-
-		undoAction = new UndoAction();
-		undoAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
-		actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-				undoAction);
-
-		redoAction = new RedoAction();
-		redoAction.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
-		actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-				redoAction);
-	}
-
-	/**
-	 * Creates copy action
-	 * @return Action
-	 */
-	protected CopyAction createCopyAction() {
-		return new CopyAction();
-	}
-
-	/**
-	 * Creates paste action
-	 * @return Action
-	 */
-	protected PasteAction createPasteAction() {
-		return new PasteAction();
-	}
-
-	/**
-	 * Creates cut action
-	 * @return Action
-	 */
-	protected CutAction createCutAction() {
-		return new CutAction();
-	}
-
-	/**
-	 * This adds Separators for editor additions to the tool bar.
-	 */
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		toolBarManager.add(new Separator(name + "-settings")); //$NON-NLS-1$
-		toolBarManager.add(new Separator(name + "-additions")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Sets enabled flag
-	 * @param enabled
-	 */
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-
-	/**
-	 * This adds to the menu bar a menu and some separators for editor
-	 * additions, as well as the sub-menus for object creation items.
-	 */
-	public void contributeToMenu(IMenuManager menuManager) {
-		super.contributeToMenu(menuManager);
-		IMenuManager submenuManager = new MenuManager(
-				getString("_UI_" + name + "_menu"), "org.eclipse.epf.authoring." + name + "MenuID"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		menuManager.insertAfter("additions", submenuManager); //$NON-NLS-1$
-		submenuManager.add(new Separator("settings")); //$NON-NLS-1$
-		submenuManager.add(new Separator("actions")); //$NON-NLS-1$
-		submenuManager.add(new Separator("additions")); //$NON-NLS-1$
-		submenuManager.add(new Separator("additions-end")); //$NON-NLS-1$
-
-		// Prepare for CreateChild item addition or removal.
-		createChildMenuManager = new MenuManager(
-				getString("_UI_CreateChild_menu_item")); //$NON-NLS-1$
-		submenuManager.insertBefore("additions", createChildMenuManager); //$NON-NLS-1$
-
-		// Prepare for CreateSibling item addition or removal.
-		createSiblingMenuManager = new MenuManager(
-				getString("_UI_CreateSibling_menu_item")); //$NON-NLS-1$
-		submenuManager.insertBefore("additions", createSiblingMenuManager); //$NON-NLS-1$
-
-		// Force an update because Eclipse hides empty menus now.
-		submenuManager.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager menuManager) {
-				menuManager.updateAll(true);
-			}
-		});
-
-		addGlobalActions(submenuManager);
-	}
-
-	/**
-	 * When the active editor changes, this remembers the change and registers
-	 * with it as a selection provider.
-	 */
-	public void setActiveEditor(IEditorPart part) {
-		super.setActiveEditor(part);
-		activeEditorPart = part;
-
-		// Switch to the new selection provider.
-		if (selectionProvider != null) {
-			selectionProvider.removeSelectionChangedListener(this);
-		}
-		if (part == null) {
-			selectionProvider = null;
-		} else {
-			selectionProvider = part.getSite().getSelectionProvider();
-			selectionProvider.addSelectionChangedListener(this);
-
-			// Fake a selection changed event to update the menus.
-			if (selectionProvider.getSelection() != null) {
-				selectionChanged(new SelectionChangedEvent(selectionProvider,
-						selectionProvider.getSelection()));
-			}
-		}
-	}
-
-	/**
-	 * This implements
-	 * {@link org.eclipse.jface.viewers.ISelectionChangedListener}, handling
-	 * {@link org.eclipse.jface.viewers.SelectionChangedEvent} by querying for
-	 * the children and siblings that can be added to the selected object and
-	 * updating the menus accordingly.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		// Remove any menu items for old selection.
-		if (createChildMenuManager != null) {
-			depopulateManager(createChildMenuManager, createChildActions);
-		}
-		if (createSiblingMenuManager != null) {
-			depopulateManager(createSiblingMenuManager, createSiblingActions);
-		}
-
-		// Query the new selection for appropriate new child/sibling
-		// descriptors.
-		Collection newChildDescriptors = null;
-		Collection newSiblingDescriptors = null;
-
-		ISelection selection = event.getSelection();
-		if (selection instanceof IStructuredSelection
-				&& ((IStructuredSelection) selection).size() == 1) {
-			Object object = ((IStructuredSelection) selection)
-					.getFirstElement();
-
-			EditingDomain domain = ((IEditingDomainProvider) activeEditorPart)
-					.getEditingDomain();
-
-			newChildDescriptors = domain.getNewChildDescriptors(object, null);
-			newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
-		}
-
-		// Generate actions for selection; populate and redraw the menus.
-		createChildActions = generateCreateChildActions(newChildDescriptors,
-				selection);
-		createSiblingActions = generateCreateSiblingActions(
-				newSiblingDescriptors, selection);
-
-		if (createChildMenuManager != null) {
-			populateManager(createChildMenuManager, createChildActions, null);
-			createChildMenuManager.update(true);
-		}
-		if (createSiblingMenuManager != null) {
-			populateManager(createSiblingMenuManager, createSiblingActions,
-					null);
-			createSiblingMenuManager.update(true);
-		}
-	}
-
-	/**
-	 * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction}
-	 * for each object in <code>descriptors</code>, and returns the
-	 * collection of these actions.
-	 */
-	protected Collection generateCreateChildActions(Collection descriptors,
-			ISelection selection) {
-		Collection actions = new ArrayList();
-		if (descriptors != null) {
-			for (Iterator i = descriptors.iterator(); i.hasNext();) {
-				actions.add(new CreateChildAction(activeEditorPart, selection,
-						i.next()));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This generates a
-	 * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each
-	 * object in <code>descriptors</code>, and returns the collection of
-	 * these actions.
-	 */
-	protected Collection generateCreateSiblingActions(Collection descriptors,
-			ISelection selection) {
-		Collection actions = new ArrayList();
-		if (descriptors != null) {
-			for (Iterator i = descriptors.iterator(); i.hasNext();) {
-				actions.add(new CreateSiblingAction(activeEditorPart,
-						selection, i.next()));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This populates the specified <code>manager</code> with
-	 * {@link org.eclipse.jface.action.ActionContributionItem}s based on the
-	 * {@link org.eclipse.jface.action.IAction}s contained in the
-	 * <code>actions</code> collection, by inserting them before the specified
-	 * contribution item <code>contributionID</code>. If <code>ID</code> is
-	 * <code>null</code>, they are simply added.
-	 */
-	protected void populateManager(IContributionManager manager,
-			Collection actions, String contributionID) {
-		if (actions != null) {
-			for (Iterator i = actions.iterator(); i.hasNext();) {
-				IAction action = (IAction) i.next();
-				if (contributionID != null) {
-					manager.insertBefore(contributionID, action);
-				} else {
-					manager.add(action);
-				}
-			}
-		}
-	}
-
-	/**
-	 * This removes from the specified <code>manager</code> all
-	 * {@link org.eclipse.jface.action.ActionContributionItem}s based on the
-	 * {@link org.eclipse.jface.action.IAction}s contained in the
-	 * <code>actions</code> collection.
-	 */
-	protected void depopulateManager(IContributionManager manager,
-			Collection actions) {
-		if (actions != null) {
-			IContributionItem[] items = manager.getItems();
-			for (int i = 0; i < items.length; i++) {
-				// Look into SubContributionItems
-				IContributionItem contributionItem = items[i];
-				while (contributionItem instanceof SubContributionItem) {
-					contributionItem = ((SubContributionItem) contributionItem)
-							.getInnerItem();
-				}
-
-				// Delete the ActionContributionItems with matching action.
-				if (contributionItem instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) contributionItem)
-							.getAction();
-					if (actions.contains(action)) {
-						manager.remove(contributionItem);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * This populates the pop-up menu before it appears.
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		// Add our standard marker.
-		menuManager.add(new Separator("additions")); //$NON-NLS-1$
-		menuManager.add(new Separator("edit")); //$NON-NLS-1$
-
-		// Add the edit menu actions.
-		menuManager.add(new ActionContributionItem(undoAction));
-		menuManager.add(new ActionContributionItem(redoAction));
-		menuManager.add(new Separator());
-		// menuManager.add(new ActionContributionItem(cutAction));
-		menuManager.add(new ActionContributionItem(copyAction));
-		menuManager.add(new ActionContributionItem(pasteAction));
-		menuManager.add(new Separator());
-		menuManager.add(new ActionContributionItem(deleteAction));
-		menuManager.add(new Separator());
-
-		// Add our other standard marker.
-		menuManager.add(new Separator("additions-end")); //$NON-NLS-1$
-
-		addGlobalActions(menuManager);
-
-		if (enabled) {
-			MenuManager submenuManager = null;
-			submenuManager = new MenuManager(
-					getString("_UI_CreateChild_menu_item")); //$NON-NLS-1$
-			populateManager(submenuManager, createChildActions, null);
-			menuManager.insertBefore("additions", submenuManager); //$NON-NLS-1$
-
-			submenuManager = new MenuManager(
-					getString("_UI_CreateSibling_menu_item")); //$NON-NLS-1$
-			populateManager(submenuManager, createSiblingActions, null);
-			menuManager.insertBefore("additions", submenuManager); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * This inserts global actions before the "additions-end" separator.
-	 */
-	protected void addGlobalActions(IMenuManager menuManager) {
-		menuManager.insertAfter("additions-end", new Separator("ui-actions")); //$NON-NLS-1$ //$NON-NLS-2$
-		menuManager.insertAfter("ui-actions", showPropertiesViewAction); //$NON-NLS-1$
-
-		refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
-		menuManager.insertAfter("ui-actions", refreshViewerAction); //$NON-NLS-1$
-		
-	    String key = (style & ADDITIONS_LAST_STYLE) == 0 ? "additions-end" : "additions"; //$NON-NLS-1$ //$NON-NLS-2$
-	    if (validateAction != null)
-	    {
-	      menuManager.insertBefore(key, new ActionContributionItem(validateAction));
-	    }
-	}
-
-	protected String getString(String key) {
-		return AuthoringUIPlugin.getDefault().getString(key);
-	}
-
-	/**
-	 * Refresh the viewer
-	 *
-	 */
-	protected void doRefresh() {
-		if (activeEditorPart instanceof IViewerProvider) {
-			Viewer viewer = ((IViewerProvider) activeEditorPart).getViewer();
-			if (viewer != null) {
-				viewer.refresh();
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MoveDownAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MoveDownAction.java
deleted file mode 100644
index 8baa0de..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MoveDownAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.MoveDownCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Moves up breakdown element in a process tree.
- * 
- * @author Phong Nguyen Le
- * @since  1.2
- */
-public class MoveDownAction extends AbstractMoveAction {
-
-	private static final String LABEL = AuthoringUIResources.ProcessEditor_Action_MoveDown;
-	private static final ImageDescriptor IMG_DESC = AuthoringUIPlugin
-			.getDefault().getImageDescriptor("full/etool16/move_down.gif"); //$NON-NLS-1$
-	private static final ImageDescriptor DISABLED_IMG_DESC = AuthoringUIPlugin
-			.getDefault().getImageDescriptor(
-					"full/etool16/move_down_disabled.gif"); //$NON-NLS-1$
-	
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public MoveDownAction() {
-		super(LABEL);
-		setImageDescriptor(IMG_DESC);
-		setDisabledImageDescriptor(DISABLED_IMG_DESC);
-		setToolTipText(LABEL);
-	}
-
-	@Override
-	protected Command createMoveCommand(Activity act, Object element,
-			Collection<EClass> classes) {
-		return new MoveDownCommand(act, element, classes);
-	}	
-	
-	@Override
-	protected boolean accept(IStructuredSelection selection) {		
-		if(super.accept(selection)) {
-			Object element = selection.getFirstElement();
-			IBSItemProvider ip = getItemProvider(element);
-			if(ip != null) {
-				return !ip.isLastElement(element);
-			}
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MoveUpAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MoveUpAction.java
deleted file mode 100644
index 2596110..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MoveUpAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.MoveUpCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Moves up breakdown element in a process tree.
- * 
- * @author Phong Nguyen Le
- * @since  1.2
- */
-public class MoveUpAction extends AbstractMoveAction {
-
-	private static final String LABEL = AuthoringUIResources.ProcessEditor_Action_MoveUp;
-	private static final ImageDescriptor IMG_DESC = AuthoringUIPlugin
-			.getDefault().getImageDescriptor("full/etool16/move_up.gif"); //$NON-NLS-1$
-	private static final ImageDescriptor DISABLED_IMG_DESC = AuthoringUIPlugin
-			.getDefault().getImageDescriptor("full/etool16/move_up_disabled.gif"); //$NON-NLS-1$ 
-	
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public MoveUpAction() {
-		super(LABEL);
-		setImageDescriptor(IMG_DESC);
-		setDisabledImageDescriptor(DISABLED_IMG_DESC);
-		setToolTipText(LABEL);
-	}
-
-	@Override
-	protected Command createMoveCommand(Activity act, Object element,
-			Collection<EClass> classes) {
-		return new MoveUpCommand(act, element, classes);
-	}	
-	
-	@Override
-	protected boolean accept(IStructuredSelection selection) {		
-		if(super.accept(selection)) {
-			Object element = selection.getFirstElement();
-			IBSItemProvider ip = getItemProvider(element);
-			if(ip != null) {
-				return !ip.isFirstElement(element);
-			}
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MultiActionGroup.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MultiActionGroup.java
deleted file mode 100644
index 880dadb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MultiActionGroup.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.actions.ActionGroup;
-
-/**
- * A MultiActionGroup will display a list of IActions in a menu by transforming them
- * into MenuItems. The list of labels given will be what is displayed in the ViewMenu for 
- * the corresponding action (the action at the same position in the action array).
- * The actions are currently implemented as state based
- * so that after an action is executed the label will have a selection check.
- * 
- * Code taken from org.eclipse.jdt.internal.ui.actions.MultiActionGroup.class
- */
-public class MultiActionGroup extends ActionGroup {
-	
-	public IAction[] NO_ACTIONS = new IAction[0];
-	
-	private IAction[] fActions; 
-	
-	private int fCurrentSelection;
-	private MenuItem[] fItems;
-
-	/**
-	 * Creates a new action group with a given set of actions.
-	 * 
-	 * @param actions			the actions for this multi group
-	 * @param currentSelection	decides which action is selected in the menu on start up.
-	 * 							Denotes the location in the actions array of the current
-	 * 							selected state. It cannot be null.
-	 */
-	public MultiActionGroup(IAction[] actions, int currentSelection) {
-		super();
-		setActions(actions, currentSelection);
-	}
-	
-	/**
-	 * Creates a new action group. Clients using this constructor must set the actions
-	 * immediately after creating the multi action group by calling {@link #setActions(IAction[], int)}.
-	 */
-	protected MultiActionGroup() {
-		super();
-	}
-	
-	/**
-	 * Sets the given actions.
-	 * 
-	 * @param actions			the actions for this multi group, at least one
-	 * @param currentSelection	decides which action is selected in the menu on start up.
-	 * 							Denotes the location in the actions array of the current
-	 * 							selected state. It cannot be null.
-	 */
-	protected final void setActions(IAction[] actions, int currentSelection) {
-		fCurrentSelection= currentSelection;
-		fActions = actions;
-	}
-
-	/**
-	 * Adds the actions to the given menu manager.
-	 */
-	protected void addActions(IMenuManager viewMenu) {
-
-		viewMenu.add(new Separator());
-		fItems= new MenuItem[fActions.length];
-
-		for (int i= 0; i < fActions.length; i++) {
-			final int j= i;
-
-			viewMenu.add(new ContributionItem() {
-
-				public void fill(Menu menu, int index) {
-					
-					int style= SWT.CHECK;
-					if ((fActions[j].getStyle() & IAction.AS_RADIO_BUTTON) != 0)
-						style= SWT.RADIO;
-					
-					MenuItem mi= new MenuItem(menu, style, index);
-					ImageDescriptor d= fActions[j].getImageDescriptor();
-					mi.setImage(AuthoringUIPlugin.getImageDescriptorRegistry().get(d));
-					fItems[j]= mi;
-					mi.setText(fActions[j].getText());
-					mi.setSelection(fCurrentSelection == j);
-					mi.addSelectionListener(new SelectionAdapter() {
-
-						public void widgetSelected(SelectionEvent e) {
-							if (fCurrentSelection == j) {
-								fItems[fCurrentSelection].setSelection(true);
-								return;
-							}
-							fActions[j].run();
-
-							// Update checked state
-							fItems[fCurrentSelection].setSelection(false);
-							fCurrentSelection= j;
-							fItems[fCurrentSelection].setSelection(true);
-						}
-
-					});
-				}
-				public boolean isDynamic() {
-					return false;
-				}
-			});
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewConfigurationAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewConfigurationAction.java
deleted file mode 100644
index ba6e439..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewConfigurationAction.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.wizards.NewConfigurationWizard;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Displays the New Method Configuration wizard.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class NewConfigurationAction extends Action implements
-		IWorkbenchWindowActionDelegate {
-
-	// The current workbench window.
-	private IWorkbenchWindow window;
-
-	// The current selection object.
-	private ISelection selection;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewConfigurationAction() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewConfigurationAction(String text) {
-		super(text);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-
-	/**
-	 * @see IWorkbenchWindowActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		this.selection = selection;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {
-		run();
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IWorkbench workbench = null;
-		if (window != null) {
-			workbench = window.getWorkbench();
-		}
-		if (workbench == null) {
-			workbench = PlatformUI.getWorkbench();
-		}
-
-		try {
-			NewConfigurationWizard wizard = new NewConfigurationWizard();
-			if (selection != null && selection instanceof IStructuredSelection) {
-				wizard.init(workbench, (IStructuredSelection) selection);
-			} else {
-				wizard.init(workbench, null);
-			}
-			WizardDialog dialog = new WizardDialog(Display.getCurrent()
-					.getActiveShell(), wizard);
-			dialog.create();
-			dialog.open();
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-					AuthoringUIResources.newConfigurationWizard_title,
-					AuthoringUIResources.openConfigWizardError_msg,
-					AuthoringUIResources.internalError_reason, "", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewPluginAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewPluginAction.java
deleted file mode 100644
index 2e5679b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewPluginAction.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.epf.authoring.ui.AuthoringPerspective;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.PerspectiveListUtil;
-import org.eclipse.epf.authoring.ui.wizards.NewPluginWizard;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Displays the New Method Plug-in wizard and creates a new plug-in when the
- * user selects the Finish button.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class NewPluginAction extends Action implements
-		IWorkbenchWindowActionDelegate {
-
-	// The cached window object.
-	private IWorkbenchWindow window;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewPluginAction() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewPluginAction(String text) {
-		super(text);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {
-		run();
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		MethodLibrary targetLib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (targetLib == null) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-					AuthoringUIResources.newPluginWizard_title, 
-					AuthoringUIResources.noOpenLibraryError_msg); 
-			return;
-		}
-
-		Shell shell = Display.getCurrent().getActiveShell();
-		IStatus status = UserInteractionHelper.checkModify(targetLib, shell);
-		if (!status.isOK()) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().display(
-					AuthoringUIResources.newPluginWizard_title, 
-					AuthoringUIResources.newPluginWizard_createError, 
-					status);
-			return;
-		}
-
-		final IWorkbench workbench = window != null ? (window.getWorkbench() == null ? PlatformUI
-				.getWorkbench()
-				: window.getWorkbench())
-				: PlatformUI.getWorkbench();
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.run(new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				execute(workbench, null);
-			}
-
-		});
-	}
-
-	/**
-	 * @see IWorkbenchWindowActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param workbench
-	 *            The active workbench.
-	 * @param selection
-	 *            The active selection.
-	 */
-	public static void execute(IWorkbench workbench, ISelection selection) {
-		NewPluginWizard wizard = new NewPluginWizard();
-
-		if (selection instanceof IStructuredSelection || selection == null) {
-			wizard.init(workbench, (IStructuredSelection) selection);
-		}
-
-		WizardDialog dialog = new WizardDialog(Display.getCurrent()
-				.getActiveShell(), wizard);
-		dialog.create();
-		dialog.open();
-
-		if (!PerspectiveListUtil.isAuthoringPerspective()) {
-			PerspectiveUtil
-					.openPerspective(AuthoringPerspective.PERSPECTIVE_ID);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenCheatsheetView.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenCheatsheetView.java
deleted file mode 100644
index 320536a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenCheatsheetView.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Properties;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.cheatsheets.views.CheatSheetView;
-import org.eclipse.ui.intro.IIntroSite;
-import org.eclipse.ui.intro.config.IIntroAction;
-
-/**
- * Open cheat sheet view
- * 
- * @author Bingxue Xu
- * @since 1.0
- * 
- */
-public class OpenCheatsheetView extends Action implements IIntroAction {
-
-	/**
-	 * Create an instance
-	 *
-	 */
-	public OpenCheatsheetView() {
-		super(AuthoringUIResources.OpenCheatsheetView_title); 
-	}
-
-	/* 
-	 * @see org.eclipse.ui.intro.config.IIntroAction#run(org.eclipse.ui.intro.IIntroSite, java.util.Properties)
-	 */
-	public void run(IIntroSite site, Properties params) {
-		String cheatsheet_id = params.getProperty("input"); //$NON-NLS-1$
-		String toggle_str = params.getProperty("toggle"); //$NON-NLS-1$
-		// System.out.println("$$$ INFO: cheatsheet id = " + cheatsheet_id);
-
-		IWorkbenchWindow activeWindow = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-
-		// de-maximaize the welcome, i.e. the intro view window
-		if (toggle_str != null && toggle_str.equalsIgnoreCase("true")) { //$NON-NLS-1$
-			toggleActiveView();
-		}
-
-		try {
-			// CheatSheetView obj = new CheatSheetView();
-			activeWindow.getActivePage().showView(
-					"org.eclipse.ui.cheatsheets.views.CheatSheetView"); //$NON-NLS-1$
-			CheatSheetView csView = (CheatSheetView) activeWindow
-					.getActivePage().getActivePart();
-			csView.setInput(cheatsheet_id);
-
-		} catch (PartInitException exp) {
-			// $$$ error handling here.
-		}
-
-	}
-
-	/**
-	 * Toggle active view
-	 *
-	 */
-	private void toggleActiveView() {
-		IWorkbenchWindow activeWindow = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-
-		// de-maximaize the welcome, i.e. the intro view window or any active
-		// view
-		IWorkbenchPage page = activeWindow.getActivePage();
-		if (page != null) {
-			if (page instanceof WorkbenchPage) {
-				//WorkbenchPage realPage = (WorkbenchPage) page;
-
-				IWorkbenchPartReference partRef = page.getActivePartReference();
-
-				if (partRef != null) {
-					((WorkbenchPage) page).toggleZoom(partRef);
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenElementActionDelegate.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenElementActionDelegate.java
deleted file mode 100644
index a62b4ea..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenElementActionDelegate.java
+++ /dev/null
@@ -1,122 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.epf.authoring.ui.PerspectiveListUtil;
-import org.eclipse.epf.authoring.ui.UIActionDispatcher;
-import org.eclipse.epf.authoring.ui.dialogs.ContributionSelection;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.views.ConfigurationView;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-/**
- * Open a method element editor delegation action
- * 
- * @author BingXue Xu
- * @since 1.0
- */
-public class OpenElementActionDelegate implements IObjectActionDelegate {
-
-	private IWorkbenchPart targetPart;
-
-	private ISelection selection;
-
-	private ContributionSelection contributorSelector;
-
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public OpenElementActionDelegate() {
-		super();
-		contributorSelector = new ContributionSelection();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		this.targetPart = targetPart;
-	}
-
-	
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		this.selection = selection;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// System.out.println("$$$ Open element action!");
-
-		// System.out.println("$$$ 5: " + selection);
-		IStructuredSelection selected = (IStructuredSelection) selection;
-
-		ArrayList elementList = new ArrayList();
-
-		// System.out.println("$$$ targetPart = " + targetPart); //$NON-NLS-1$
-		if (targetPart instanceof ConfigurationView) {
-			for (Iterator objects = selected.iterator(); objects.hasNext();) {
-				Object element = TngUtil.unwrap(objects.next());
-				if (element instanceof VariabilityElement) {
-					Object obj = contributorSelector
-							.getSelectedContributor((VariabilityElement) element);
-					if (obj != null)
-						elementList.add(obj);
-				} else {
-					elementList.add(element);
-				}
-			}
-		} else {
-			for (Iterator objects = selected.iterator(); objects.hasNext();) {
-				Object element = TngUtil.unwrap(objects.next());
-				if (element instanceof MethodElement) {
-					elementList.add(element);
-				}
-			}
-		}
-
-		if (elementList.size() < 1)
-			return;
-
-		if (PerspectiveListUtil.isBrowsingPerspective()) {
-			UIActionDispatcher.openAuthoringPerspective();
-		}
-
-		for (Iterator objects = elementList.iterator(); objects.hasNext();) {
-			Object element = objects.next();
-			EditorChooser.getInstance().openEditor(element);
-		}
-
-	}
-
-	/**
-	 * Dispose 
-	 */
-	public void dispose() {
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenElementWorkbenchActionDelegate.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenElementWorkbenchActionDelegate.java
deleted file mode 100644
index 372c4bb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OpenElementWorkbenchActionDelegate.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.PerspectiveListUtil;
-import org.eclipse.epf.authoring.ui.UIActionDispatcher;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.actions.BaseSelectionListenerAction;
-
-
-/**
- * Open method element editor delegation action 
- * 
- * @author BingXue Xu
- * @since 1.0
- */
-public class OpenElementWorkbenchActionDelegate extends
-		BaseSelectionListenerAction implements IWorkbenchWindowActionDelegate {
-
-	// private IWorkbenchWindow window;
-
-	private ISelection selection;
-
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public OpenElementWorkbenchActionDelegate() {
-		this(
-				AuthoringUIResources.OpenElementWorkbenchActionDelegate_edit_text0); 
-	}
-
-	protected OpenElementWorkbenchActionDelegate(String text) {
-		super(text);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		// this.window = window;
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// System.out.println("$$$ Open element action!");
-
-		// System.out.println("$$$ 5: " + selection);
-		IStructuredSelection selected = (IStructuredSelection) selection;
-
-		if (PerspectiveListUtil.isBrowsingPerspective()) {
-			UIActionDispatcher.openAuthoringPerspective();
-		}
-
-		for (Iterator objects = selected.iterator(); objects.hasNext();) {
-			Object element = TngUtil.unwrap(objects.next());
-			// System.out.println("$$$ 6: " + element);
-			if (element instanceof MethodElement) {
-				EditorChooser.getInstance().openEditor(element);
-			}
-		}
-
-		action.setEnabled(false);
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		this.selection = selection;
-
-		IStructuredSelection selected = (IStructuredSelection) selection;
-
-		// if (!PerspectiveListUitl.isAuthoringPerspective() ||
-		// selected.isEmpty()) {
-		if (selected.isEmpty()) {
-			action.setEnabled(false);
-			return;
-		}
-
-		boolean enableMenu = true;
-		for (Iterator objects = selected.iterator(); objects.hasNext();) {
-			Object element = TngUtil.unwrap(objects.next());
-			if (!(element instanceof MethodElement)) {
-				enableMenu = false;
-			}
-		}
-
-		action.setEnabled(enableMenu);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OutdentAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OutdentAction.java
deleted file mode 100644
index 798523a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/OutdentAction.java
+++ /dev/null
@@ -1,316 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.action.CommandActionHandler;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Update suppression information from base elements
- * 
- * @author Phong Nguyen Le
- * @since  1.2
- */
-public class OutdentAction extends
-		CommandActionHandler implements IWorkbenchPartAction, IModifyingAction {
-	public static class OutdentCommand extends AbstractCommand implements IResourceAwareCommand {
-		private static final AdapterFactory[] ADAPTER_FACTORIES = {
-			TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory(),
-			TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory(),
-			TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory()
-		};
-		
-		private Collection<BreakdownElement> elements;
-		private Set modifiedResources;
-		private BreakdownElement element;
-		private Activity oldParent;
-		private Activity newParent;
-		private int oldIndex;
-		private int newIndex;
-		private List<Object> newChildren;
-
-		private AdapterFactory adapterFactory;
-
-		public OutdentCommand(Collection<BreakdownElement> collection, AdapterFactory adapterFactory) {
-			this.elements = collection;
-			this.adapterFactory = adapterFactory;
-			setLabel(LABEL);
-		}
-		
-		@Override
-		public void dispose() {
-			if(newChildren != null) {
-				newChildren.clear();
-				newChildren = null;
-			}
-			
-			super.dispose();
-		}
-
-		public Collection getModifiedResources() {
-			if(modifiedResources == null) {
-				Process proc = null;
-				for (Iterator<BreakdownElement> iter = elements.iterator(); proc == null && iter.hasNext();) {
-					BreakdownElement e = iter.next();
-					proc = TngUtil.getOwningProcess(e);
-				}
-				if(proc != null) {
-					Resource resource = proc.eResource();
-					if(resource != null) {
-						modifiedResources = Collections.singleton(proc.eResource());
-					}
-				}
-				if(modifiedResources == null) {
-					modifiedResources = Collections.EMPTY_SET;
-				}
-			}
-			return modifiedResources;
-		}
-		
-		@Override
-		protected boolean prepare() {
-			element = elements.iterator().next();
-			oldParent = element.getSuperActivities();
-			if(oldParent == null) {
-				return false;
-			}
-			oldIndex = oldParent.getBreakdownElements().indexOf(element);
-			Map<List<Object>, Integer> childrenToStartIndexMap = new HashMap<List<Object>, Integer>();
-			AdapterFactory[] adapterFactories;
-			if(element instanceof Activity) {
-				adapterFactories = ADAPTER_FACTORIES;
-			}
-			else {
-				adapterFactories = new AdapterFactory[] {
-					adapterFactory	
-				};
-			}
-			for (int i = 0; i < adapterFactories.length; i++) {
-				AdapterFactory adapterFactory = adapterFactories[i];
-				ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(oldParent, 
-						ITreeItemContentProvider.class);
-				List<Object> children = new ArrayList<Object>(ip.getChildren(oldParent));
-				int index = children.indexOf(element);
-				int size = children.size();
-				int newChildrenFromIndex = index + 1;
-				if(newChildrenFromIndex < size) {
-					for(int j = newChildrenFromIndex; j < size; j++) {
-						Object child = children.get(j);
-						if(ProcessUtil.isInherited(child)) {
-							// cannot outdent activity that have inherited sibling below it
-							//
-							return false;
-						}
-					}
-					childrenToStartIndexMap.put(children, Integer.valueOf(newChildrenFromIndex));
-				}
-			}
-			if(!(element instanceof Activity) && !childrenToStartIndexMap.isEmpty()) {
-				return false;
-			}
-			newParent = oldParent.getSuperActivities();
-			if(newParent != null) {
-				newIndex = newParent.getBreakdownElements().indexOf(oldParent) + 1;
-				if(!childrenToStartIndexMap.isEmpty()) {
-					newChildren = new UniqueEList();
-					for (Iterator<Map.Entry<List<Object>, Integer>> iter = childrenToStartIndexMap.entrySet().iterator(); iter.hasNext();) {
-						Map.Entry<List<Object>, Integer> entry = iter.next();
-						List children = entry.getKey();
-						newChildren.addAll(children.subList(entry.getValue().intValue(), children.size()));
-					}
-					if(!DependencyChecker.checkCircularForMovingVariabilityElement((VariabilityElement) element, newChildren, true)) {
-						return false;						
-					}
-				}
-				return DependencyChecker.checkCircularForMovingVariabilityElement(newParent, Collections.singleton(element), true);
-			}
-			return false;
-		}
-
-		public void execute() {
-			newParent.getBreakdownElements().add(newIndex, element);
-			if(element instanceof Activity) {
-				ProcessPackage parentPkg = (ProcessPackage) newParent.eContainer();
-				parentPkg.getChildPackages().add(element.eContainer());
-
-				if(newChildren != null) {
-					((Activity)element).getBreakdownElements().addAll(newChildren);			
-					// move the process pacakge of the activity to new parent package
-					//
-					for (Iterator iter = newChildren.iterator(); iter.hasNext();) {
-						Object child = iter.next();
-						if(child instanceof Activity) {
-							parentPkg.getChildPackages().add(((Activity)child).eContainer());
-						}
-					}
-				}
-			}
-		}
-
-		public void redo() {
-			execute();
-		}
-		
-		@Override
-		public void undo() {
-			oldParent.getBreakdownElements().add(oldIndex, element);
-			if(element instanceof Activity) {
-				ProcessPackage parentPkg = (ProcessPackage) oldParent.eContainer();
-				parentPkg.getChildPackages().add(element.eContainer());
-				if(newChildren != null) {
-					((Activity) element).getBreakdownElements().removeAll(newChildren);
-					for (Iterator iter = newChildren.iterator(); iter.hasNext();) {
-						Object child = iter.next();
-						if(child instanceof Activity) {
-							parentPkg.getChildPackages().add(((Activity)child).eContainer());
-						}
-					}
-				}
-			}
-		}
-		
-		@Override
-		public Collection getAffectedObjects() {
-			return elements;
-		}
-	}
-
-	private static final String LABEL = AuthoringUIResources.ProcessEditor_Action_Outdent;
-
-	private ProcessEditor editor;
-
-	/**
-	 * Creates an instance
-	 * @param text
-	 */
-	public OutdentAction(String text) {
-		super(null, text);
-	}
-	
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public OutdentAction() {
-		this(LABEL);
-		setImageDescriptor(RichTextImages.IMG_DESC_OUTDENT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_OUTDENT);
-		setToolTipText(LABEL);
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		// support indent only one activity for now
-		//
-		boolean ret = false;
-		if(selection.size() == 1) {
-			Object e = selection.getFirstElement();
-			if(e instanceof Activity) {
-				ret = super.updateSelection(selection);
-			}
-		}
-		setEnabled(ret);
-		return ret;
-		
-		//TODO: support indent multiple activities in selection
-//		ArrayList<Activity> list = new ArrayList<Activity>();
-//		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-//			Object element = iter.next();
-//			if(element instanceof Activity) {
-//				list.add((Activity) element);
-//			}
-//		}
-//		if(list.isEmpty()) {
-//			return false;
-//		}
-//		return super.updateSelection(new StructuredSelection(list));
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#createCommand(java.util.Collection)
-	 */
-	public Command createCommand(Collection selection) {
-		if(domain instanceof AdapterFactoryEditingDomain) {
-			return new OutdentCommand(selection, ((AdapterFactoryEditingDomain)domain).getAdapterFactory());
-		}
-		return UnexecutableCommand.INSTANCE;
-	}	
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction#setActiveWorkbenchPart(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart) {
-		if(workbenchPart instanceof IEditingDomainProvider) {
-			domain = ((IEditingDomainProvider)workbenchPart).getEditingDomain();
-		}
-		if(workbenchPart instanceof ProcessEditor) {
-			editor = (ProcessEditor) workbenchPart;
-		}		
-		else if(workbenchPart == null) {
-			editor = null;
-		}
-	}	
-	
-	private void superRun() {
-		super.run();
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		BusyIndicator.showWhile(editor.getEditorSite()
-				.getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						superRun();
-					}
-			
-		});
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ProcessAutoSynchronizeAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ProcessAutoSynchronizeAction.java
deleted file mode 100644
index 4108559..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ProcessAutoSynchronizeAction.java
+++ /dev/null
@@ -1,207 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.CommandActionHandler;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.command.SynchronizeCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.actions.ProcessDeleteAction;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-/**
- * Default Synchronize action for process elements.
- * Synchronization takes place from method to process elements.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ProcessAutoSynchronizeAction extends CommandActionHandler 
-implements IWorkbenchPartAction, IModifyingAction
-{
-	protected IWorkbenchPart activeWorkbenchPart;
-	protected boolean canRun;
-
-	/**
-	 * Creates an instance
-	 */
-	public ProcessAutoSynchronizeAction() {
-		super(null, LibraryEditResources.AutoSynchronizeCommand_label); 
-	}
-
-	/**
-	 * Creates an instance with label text
-	 */
-	public ProcessAutoSynchronizeAction(String labelText) {
-		super(null, labelText); 
-	}
-	
-	/**
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction#setActiveWorkbenchPart(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart) {
-		activeWorkbenchPart = workbenchPart;
-		if (workbenchPart instanceof IEditingDomainProvider) {
-			domain = ((IEditingDomainProvider) workbenchPart)
-					.getEditingDomain();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#createCommand(java.util.Collection)
-	 */
-	public Command createCommand(Collection selection) {
-		return new SynchronizeCommand(getText(), selection) {
-			/*
-			 * 
-			 * 
-			 * @see AutoSynchronizeCommand#delete(java.util.Collection)
-			 */
-			protected Command delete(List elements) {
-				try {
-					return ProcessDeleteAction.delete(elements);
-				}
-				catch(OperationCanceledException e) {
-					aborted = true;
-					return null;
-				}
-			}
-		};
-	}
-	
-	/**
-	 * Return the process 
-	 * @return
-	 */
-	protected Process getProcess() {
-		if(activeWorkbenchPart instanceof IEditorPart) {
-			IEditorInput input = ((IEditorPart)activeWorkbenchPart).getEditorInput();
-			if(input instanceof MethodElementEditorInput) {
-				MethodElement e = ((MethodElementEditorInput)input).getMethodElement();
-				if(e instanceof ProcessComponent) {
-					return ((ProcessComponent)e).getProcess();
-				}
-			}
-		}
-		return null;
-	}
-
-	/** 
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		ArrayList selected = new ArrayList();
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			
-			if (element instanceof BreakdownElementWrapperItemProvider 
-					&& !((BreakdownElementWrapperItemProvider) element).isReadOnly()) {
-				element = TngUtil.unwrap(element);
-			}
-			
-			boolean valid = false;
-			if (element instanceof BreakdownElement) {
-				if(element instanceof Descriptor) {
-					Descriptor desc = (Descriptor) element;
-					
-					// descriptor must be linked and is not suppressed
-					//
-					valid = ProcessUtil.getAssociatedElement(desc) != null && !desc.getSuppressed().booleanValue();					
-				}
-				else {
-					// exclude breakdown element without a super activity like TeamProfile's own RoleDescriptor
-					//
-					if (((BreakdownElement)element).getSuperActivities() == null) 
-					{
-						if(element instanceof Process && ((Process)element).eContainer() instanceof ProcessComponent) {
-							valid = true;
-						}
-					}
-					else {
-						valid = element instanceof Activity || element instanceof TeamProfile;
-					}
-				}
-			}
-			if(valid) {
-				selected.add(element);
-			}
-		}
-		if (selected.isEmpty()) {
-			return false;
-		}
-		return super.updateSelection(new StructuredSelection(selected));
-	}
-
-
-   /**
-	 * 
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		org.eclipse.epf.library.edit.util.IRunnableWithProgress runnable = new org.eclipse.epf.library.edit.util.IRunnableWithProgress() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				canRun = ((SynchronizeCommand) command).initilize();
-			}
-		};
-		UserInteractionHelper.runWithProgress(runnable, LibraryEditResources.ProcessAutoSynchronizeAction_prepare); 
-
-		if (canRun) {
-			super.run();
-			// if(((AutoSynchronizeCommand)command).isSucessful()) {
-			// AuthoringUIPlugin.getDefault().getMsgDialog().displayInfo(getText(),
-			// "Synchronization has been completed successfully.");
-			//				
-			// }
-		} else {
-			AuthoringUIPlugin
-					.getDefault()
-					.getMsgDialog()
-					.displayInfo(
-							getText(),
-							LibraryEditResources.ProcessAutoSynchronizeAction_noDescriptorToSynch); 
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/RefreshConfiguration.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/RefreshConfiguration.java
deleted file mode 100644
index c2aef1f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/RefreshConfiguration.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.epf.authoring.ui.views.ConfigurationView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Refresh Configuration action
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- *
- */
-public class RefreshConfiguration implements IViewActionDelegate {
-
-	private ConfigurationView targetView;
-
-	/**
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		targetView = (ConfigurationView) view;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		targetView.getViewer().refresh();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		action.setEnabled(true);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/RenameAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/RenameAction.java
deleted file mode 100644
index cbcd53f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/RenameAction.java
+++ /dev/null
@@ -1,508 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.CommandActionHandler;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Renames method element.
- * 
- * @author Phong Nguyen Le
- * @since  1.2
- */
-public class RenameAction extends
-		CommandActionHandler implements IWorkbenchPartAction, IModifyingAction {
-
-	private static final String LABEL = AuthoringUIResources.renameAction_text;
-
-	private IStructuredSelection selection;
-
-	private IWorkbenchPart activePart;
-
-	/**
-	 * Creates an instance
-	 * @param text
-	 */
-	public RenameAction(String text) {
-		super(null, text);
-	}
-	
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public RenameAction() {
-		this(LABEL);
-	}
-	
-	/**
-	 * Returns <code>true</code> if the selected method elements can be
-	 * renamed.
-	 */
-	private boolean canRename(IStructuredSelection selection) {
-		if (!(domain instanceof AdapterFactoryEditingDomain) || selection.size() > 1)
-			return false;
-		Object element = TngUtil.unwrap(selection.getFirstElement());
-		if (element instanceof NamedElement
-				&& !TngUtil.isPredefined((MethodElement) element)) {
-			return true;
-		}
-		return false;
-	}
-
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		boolean ret = false;
-		if(canRename(selection)) {
-			this.selection = selection;
-			ret = super.updateSelection(selection);
-		}
-		setEnabled(ret);
-		return ret;
-	}
-	
-	@Override
-	public Command createCommand(Collection<?> selection) {
-		if(selection.isEmpty()) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Object o = TngUtil.unwrap(selection.iterator().next());
-		if(o instanceof NamedElement) {
-			return new RenameCommand((NamedElement) o, null);
-		}
-		return UnexecutableCommand.INSTANCE;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction#setActiveWorkbenchPart(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart) {
-		if(workbenchPart instanceof IEditingDomainProvider) {
-			domain = ((IEditingDomainProvider)workbenchPart).getEditingDomain();
-		}
-		activePart = workbenchPart;
-	}	
-	
-	private void superRun() {
-		final NamedElement e = (NamedElement) TngUtil.unwrap(selection.getFirstElement());
-//		Resource resource = e.eResource();
-//		if(resource != null) {
-//			org.eclipse.core.resources.IFile file = WorkspaceSynchronizer.getFile(e.eResource());
-//			if(file != null) {
-//				RepositoryProvider provider = RepositoryProvider.getProvider(file.getProject());
-//				if(provider != null) {
-//					IFileHistoryProvider historyProvider = provider.getFileHistoryProvider();
-//					FileModificationValidator modValidator = provider.getFileModificationValidator2();
-//					String id = provider.getID();
-//					Subscriber subscriber = provider.getSubscriber();
-//					System.out.println(id);
-//				}
-//			}
-//		}
-
-		Shell shell = activePart.getSite().getShell();
-		
-		// check if container's resource can be modified
-		//
-		if (e.eContainer() != null
-				&& e.eContainer().eResource() != e.eResource()) {
-			IStatus status = UserInteractionHelper.checkModify(e.eContainer(), shell);
-			if (!status.isOK()) {
-				AuthoringUIPlugin
-				.getDefault()
-				.getMsgDialog()
-				.displayError(
-						AuthoringUIResources.renameDialog_title,
-						AuthoringUIResources.renameDialog_renameError,
-						status);
-				return;
-			}
-		}
-
-		final IValidator validator = IValidatorFactory.INSTANCE
-		.createNameValidator(e, ((AdapterFactoryEditingDomain)domain).getAdapterFactory());
-		IInputValidator inputValidator = new IInputValidator() {
-			public String isValid(String newText) {
-				if (validator != null) {
-					return UserInteractionHelper
-					.getSimpleErrorMessage(validator
-							.isValid(newText));
-				}
-				return null;
-			}
-		};
-
-		boolean getInput = true;
-		InputDialog inputDlg = new InputDialog(Display.getCurrent()
-				.getActiveShell(), AuthoringUIResources.rename_text,
-				AuthoringUIResources.newname_text, e.getName(),
-				inputValidator);
-		while (getInput) {
-			getInput = false;
-			if (inputDlg.open() == Window.OK) {
-				String newName = inputDlg.getValue().trim();
-				if(e instanceof ContentElement) {
-					newName = StrUtil.makeValidFileName(newName);
-				}
-				if (!newName.equals(e.getName())) {
-					if (e instanceof MethodConfiguration) {
-						String[] configNames = LibraryServiceUtil
-						.getMethodConfigurationNames(LibraryService
-								.getInstance()
-								.getCurrentMethodLibrary());
-						for (int i = 0; i < configNames.length; i++) {
-							if (newName.equals(configNames[i])) {
-								AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										AuthoringUIResources.renameDialog_title,
-										AuthoringUIResources
-										.bind(
-												AuthoringUIResources.duplicateElementNameError_msg,
-												newName));
-								getInput = true;
-								break;
-							}
-						}
-					}
-					if (getInput == true) {
-						inputDlg = new InputDialog(Display.getCurrent()
-								.getActiveShell(),
-								AuthoringUIResources.rename_text,
-								AuthoringUIResources.newname_text, e
-								.getName(), inputValidator);
-						continue;
-					}
-
-					if (e instanceof MethodPlugin) {
-						String msg = AuthoringUIResources.bind(AuthoringUIResources.methodPluginDescriptionPage_confirmRename, (new Object[] { e.getName(), newName })); 
-						String title = AuthoringUIResources.methodPluginDescriptionPage_confirmRename_title; 
-						if (!MessageDialog.openConfirm(shell, title, msg)) {
-							return;
-						}
-
-						EditorChooser.getInstance().closeMethodEditorsForPluginElements((MethodPlugin)e);
-					}
-					
-					RenameCommand renameCmd = (RenameCommand) command;
-					renameCmd.setNewName(newName);
-					renameCmd.setShell(shell);
-					super.run();					
-				}
-			}
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		BusyIndicator.showWhile(activePart.getSite()
-				.getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-						runner.run(new IRunnableWithProgress() {
-
-							public void run(IProgressMonitor monitor)
-									throws InvocationTargetException,
-									InterruptedException {
-								superRun();
-							}
-							
-						});
-					}
-			
-		});
-	}
-
-	public static void doRename(final NamedElement e, final String newName) {
-		new RenameCommand(e, newName).execute();
-	}
-	
-	private static class RenameCommand extends AbstractCommand {		
-		private NamedElement e;
-		private String newName;
-		private String oldName;
-		private Shell shell;
-		Collection<Resource> renamedResources;
-		
-		public RenameCommand(NamedElement e, String newName) {
-			this.e = e;
-			this.newName = newName;
-		}		
-		
-		public void setNewName(String newName) {
-			this.newName = newName;
-		}
-		
-		public void setShell(Shell shell) {
-			this.shell = shell;
-		}
-		
-		private void rollback() {
-			// restore old name
-			//
-			setName(oldName);
-			
-			// restore old location
-			//
-			if(!renamedResources.isEmpty()) {
-				adjustLocation(renamedResources, new ArrayList<Resource>());
-			}
-		}
-		
-		private void handlePersistenceException(Exception e1) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e1);
-
-			String details = e1.getMessage() != null ? MessageFormat
-					.format(": {0}", new Object[] { e1.getMessage() }) : ""; //$NON-NLS-1$ //$NON-NLS-2$
-			String msg = MessageFormat.format(
-					AuthoringUIResources.ElementsView_err_saving,
-					new Object[] {
-							e.eResource().getURI().toFileString(),
-							details });
-			throw new MessageException(msg);
-		}
-		
-		private ILibraryPersister.FailSafeMethodLibraryPersister getPersister() {
-			return LibraryServiceUtil.getPersisterFor(e.eResource())
-						.getFailSafePersister();
-		}
-		
-		/**
-		 * Adjusts location of all affected resources.
-		 * 
-		 * @return resources whose location has been adjusted
-		 */
-		private IStatus adjustLocation(Collection<Resource> renamedResources) {
-			Collection<Resource> resourcesToRename = new ArrayList<Resource>();
-			if (e instanceof ContentElement
-					&& ContentDescriptionFactory
-							.hasPresentation((MethodElement) e)) {
-				resourcesToRename.add(((ContentElement) e).getPresentation()
-						.eResource());
-			}
-			resourcesToRename.add(e.eResource());
-			return adjustLocation(resourcesToRename, renamedResources);
-		}
-		
-		/**
-		 * Adjusts location of the specified resources.
-		 * 
-		 * @return resources whose location has been adjusted
-		 */
-		private IStatus adjustLocation(Collection<Resource> resourcesToRename, Collection<Resource> renamedResources) {
-			FailSafeMethodLibraryPersister persister = getPersister();
-			try {
-				for (Resource resource : resourcesToRename) {
-					URI oldURI = resource.getURI();
-					persister.adjustLocation(resource);
-					if(!resource.getURI().equals(oldURI)) {
-						renamedResources.add(resource);
-					}
-				}
-				return Status.OK_STATUS;
-			} catch (Exception e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				try {
-					persister.rollback();
-				}
-				catch(Exception ex) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				}
-				return new Status(IStatus.ERROR, AuthoringUIPlugin.getDefault().getId(),
-						e.getMessage(), e);
-			}
-		}		
-		
-		private void setName(String newName) {
-			e.setName(newName);
-			
-			// Special handling for ProcessComponent to keep its
-			// name and the name of its process in sync.
-			if (e instanceof ProcessComponent) {
-				Process proc = ((ProcessComponent) e).getProcess();
-				proc.setName(newName);
-			}
-		}
-
-		public void execute() {
-			oldName = e.getName();			
-			setName(newName);
-			
-			renamedResources = new ArrayList<Resource>();
-
-			// rename file(s)
-			//
-			Runnable runnable = new Runnable() {
-		
-				public void run() {
-					IStatus status = adjustLocation(renamedResources);
-					if(!status.isOK()) {
-						rollback();
-						Exception ex = (Exception) status.getException();
-						throw ex instanceof RuntimeException ? (RuntimeException) ex : new WrappedException(ex);
-					}
-					
-				}
-		
-			};
-		
-			boolean result = UserInteractionHelper.runWithProgress(runnable,
-					AuthoringUIResources.ElementsView_renaming_text);
-			if(!result) {
-				return;
-			}
-			
-			IStatus status = UserInteractionHelper.checkModify(e, 
-					shell == null ? MsgBox.getDefaultShell() : shell);
-			if (!status.isOK()) {
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						AuthoringUIResources.renameDialog_title,
-						AuthoringUIResources.renameDialog_renameError,
-						status);
-				UserInteractionHelper.runWithProgress(new Runnable() {
-
-					public void run() {
-						rollback();
-					}
-					
-				}, ""); //$NON-NLS-1$
-				return;
-			}
-			
-			// Save the modified file(s).
-			//
-			runnable = new Runnable() {
-				
-				public void run() {
-					// Save the modified file(s).
-					//
-					ILibraryPersister.FailSafeMethodLibraryPersister persister = getPersister();
-					try {
-						try {
-							persister.save(e.eResource());
-							persister.commit();		
-						} catch (Exception e1) {		
-							try {
-								persister.rollback();
-							}
-							catch(Exception e) {
-								AuthoringUIPlugin.getDefault().getLogger().logError(e);
-							}
-							handlePersistenceException(e1);
-						}
-					}
-					catch(RuntimeException e) {
-						rollback();						
-						throw e;
-					}
-					
-					// change diagram resource as well
-					if (e instanceof ProcessComponent) {
-						Process proc = ((ProcessComponent) e).getProcess();	
-						DiagramManager mgr = DiagramManager.getInstance(proc, this);
-						if(mgr != null) {
-							try {
-								mgr.updateResourceURI();
-							}
-							catch(Exception e) {
-								AuthoringUIPlugin.getDefault().getLogger().logError(e);
-							}
-							finally {
-								try { 
-									mgr.removeConsumer(this);
-								}
-								catch(Exception e) {
-									AuthoringUIPlugin.getDefault().getLogger().logError(e);
-								}
-							}
-						}
-						
-					}
-				}
-		
-			};
-			UserInteractionHelper.runWithProgress(runnable,
-					AuthoringUIResources.ElementsView_renaming_text);
-		}
-
-		public void redo() {
-			execute();
-		}
-		
-		@Override
-		protected boolean prepare() {
-			return true;
-		}
-		
-		@Override
-		public void dispose() {
-			e = null;
-			super.dispose();
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SaveThisAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SaveThisAction.java
deleted file mode 100644
index 0f6f09d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SaveThisAction.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-
-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.xmi.impl.XMIResourceFactoryImpl;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-
-/**
- * Action for saving resources
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class SaveThisAction extends Action {
-
-	private ArrayList selectedObjects;
-
-	public SaveThisAction() {
-		super(AuthoringUIResources.SaveThisAction_saveobject); 
-	}
-
-	/**
-	 * Update selection
-	 * @param selection
-	 * 			Selection
-	 * @return 
-	 * 			boolean value to indicate whether update was done
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		selectedObjects = new ArrayList();
-		for (Iterator objects = selection.iterator(); objects.hasNext();) {
-			selectedObjects.add(AdapterFactoryEditingDomain.unwrap(objects
-					.next()));
-		}
-
-		return selectedObjects.size() == 1
-				&& selectedObjects.get(0) instanceof EObject;
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (selectedObjects == null || selectedObjects.isEmpty())
-			return;
-		FileDialog fd = new FileDialog(Display.getCurrent().getActiveShell(),
-				SWT.SAVE);
-		String path = fd.open();
-		if (path == null)
-			return;
-		URI fileURI = URI.createFileURI(path);
-		// Create the resource to persist the model.
-		Resource res = new XMIResourceFactoryImpl().createResource(fileURI);
-		Object obj = selectedObjects.get(0);
-		res.getContents().add((EObject) obj);
-		try {
-			res.save(Collections.EMPTY_MAP);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ShowPresentationNames.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ShowPresentationNames.java
deleted file mode 100644
index 9dcf517..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ShowPresentationNames.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Show Presentation names in library view
- * 
- * @author Jeff Hardy
- * @since 1.0
- *
- */
-public class ShowPresentationNames implements IViewActionDelegate {
-
-	private LibraryView targetView;
-
-	/**
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		targetView = (LibraryView) view;
-
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		PresentationContext.INSTANCE.setShowPresentationNames(!PresentationContext.INSTANCE.isShowPresentationNames());
-		targetView.getViewer().refresh();
-	}
-
-	
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SynchronizationAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SynchronizationAction.java
deleted file mode 100644
index c73950f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SynchronizationAction.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashSet;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.wizards.SynchronizationChoices;
-import org.eclipse.epf.authoring.ui.wizards.SynchronizationWizard;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.command.SynchronizeCommand;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Synchronizaiton action for process elements. Synchronization takes place from method
- * element to process elements
- * 
- * @author Phong Le
- * @since 1.0
- *
- */
-public class SynchronizationAction extends ProcessAutoSynchronizeAction 
-implements IWorkbenchPartAction
-{
-
-	private Process selectedProcess;
-	
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public SynchronizationAction() {
-		super(LibraryEditResources.ManualSynchronizeCommand_label); 
-	}
-	
-	/*
-	 * Set Process
-	 */
-	public void setProcess(Process aProcess) {
-		this.selectedProcess = aProcess;
-	}
-	
-	private void superRun() {
-		super.run();
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.run(new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				SynchronizationChoices choices = new SynchronizationChoices();
-				choices.setSelectedProcess(selectedProcess);
-				
-				// Instantiate and initialize the wizard.
-				SynchronizationWizard wizard = new SynchronizationWizard(choices);
-
-				// Instantiate the wizard container with the wizard and open it.
-				WizardDialog dialog = new WizardDialog(Display.getCurrent().getActiveShell(), 
-											wizard);
-				dialog.create();
-				dialog.open();	
-//				System.out.println("$$$ DEBUG: " + choices); //$NON-NLS-1$
-				
-				if (!choices.isFinishPressed())
-					return;
-				
-				// Set synchFeatures 'syncFeatureSet'
-				HashSet syncFeatureSet = new HashSet();
-				addChoicesToSet(syncFeatureSet, choices);
-				// Method config can be obtained by 'choices.getSelectedConfig()'
-				
-				SynchronizeCommand cmd = (SynchronizeCommand)command;
-				cmd.setMethodConfiguration(choices.getSelectedConfig());
-				cmd.setSynchronizationFeatures(syncFeatureSet);
-				
-				superRun();
-			}
-		});
-		
-	}
-
-	private void addChoicesToSet(HashSet syncSet, SynchronizationChoices choices) {
-		if (choices.getSyncName() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getNamedElement_Name());
-		}
-		if (choices.getSyncPresName() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getDescribableElement_PresentationName());
-		}
-		if (choices.getSyncBriefDesc() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-		}
-		if (choices.getSyncOptInput() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getTask_OptionalInput());
-		}
-		if (choices.getSyncManInput() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getTask_MandatoryInput());
-		}
-		if (choices.getSyncOutput() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getTask_Output());
-		}
-		if (choices.getSyncPrimPerformer() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getTask_PerformedBy());
-		}
-		if (choices.getSyncAddnPerformer() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy());
-		}
-		if (choices.getSyncRespRole() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getRole_ResponsibleFor());
-		}
-		if (choices.getSyncContArtifact() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts());
-		}
-		if (choices.getSyncDelivPart() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts());
-		}
-		if (choices.getSyncSelStep() == SynchronizationChoices.SYNC_FROM_CONETNT){
-			syncSet.add(UmaPackage.eINSTANCE.getTask_Steps());
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/UpdateSuppressionFromBaseAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/UpdateSuppressionFromBaseAction.java
deleted file mode 100644
index c46948a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/UpdateSuppressionFromBaseAction.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.CommandActionHandler;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.library.edit.process.command.UpdateSuppressionFromBaseCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Update suppression information from base elements
- * 
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class UpdateSuppressionFromBaseAction extends
-		CommandActionHandler implements IWorkbenchPartAction, IModifyingAction {
-
-	private ProcessEditor editor;
-
-	/**
-	 * Creates an instance
-	 * @param text
-	 */
-	public UpdateSuppressionFromBaseAction(String text) {
-		super(null, text);
-	}
-	
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public UpdateSuppressionFromBaseAction() {
-		this(AuthoringUIResources.ProcessEditor_updateSuppressionFromBaseAction_label); 
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		ArrayList<Object> list = new ArrayList<Object>();
-		for (Iterator<?> iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if(Suppression.isValid(element)) {
-				list.add(element);
-			}
-		}
-		if(list.isEmpty()) {
-			return false;
-		}
-		if(list.size() == 1 && 
-				ProcessUtil.isRolledUpDescriptor(list.get(0), ((AdapterFactoryEditingDomain)domain).getAdapterFactory())) {
-			return false;
-		}
-		return super.updateSelection(new StructuredSelection(list));
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#createCommand(java.util.Collection)
-	 */
-	public Command createCommand(Collection<?> selection) {
-		return new UpdateSuppressionFromBaseCommand(getText(), selection, editor.getAdapterFactory(), editor.getSuppression()) {
-			/* (non-Javadoc)
-			 * @see org.eclipse.epf.library.edit.process.command.UpdateSuppressionFromBaseCommand#execute()
-			 */
-			public void execute() {
-				super.execute();
-				
-				if(!getAffectedObjects().isEmpty()) {
-					editor.refreshAllProcessEditors();
-				}
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.epf.library.edit.process.command.UpdateSuppressionFromBaseCommand#undo()
-			 */
-			public void undo() {
-				super.undo();
-				
-				if(!getAffectedObjects().isEmpty()) {
-					editor.refreshAllProcessEditors();
-				}
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction#setActiveWorkbenchPart(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart) {
-		if(workbenchPart instanceof IEditingDomainProvider) {
-			domain = ((IEditingDomainProvider)workbenchPart).getEditingDomain();
-		}
-		if(workbenchPart instanceof ProcessEditor) {
-			editor = (ProcessEditor) workbenchPart;
-		}		
-		else if(workbenchPart == null) {
-			editor = null;
-		}
-	}	
-	
-	private void superRun() {
-		super.run();
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		BusyIndicator.showWhile(editor.getEditorSite()
-				.getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						superRun();
-					}
-			
-		});
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/UserInteractionHandler.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/UserInteractionHandler.java
deleted file mode 100644
index c417965..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/UserInteractionHandler.java
+++ /dev/null
@@ -1,462 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.actions;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.epf.authoring.ui.wizards.NewConfigurationWizard;
-import org.eclipse.epf.common.ui.util.ErrorDialogNoReason;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.eclipse.epf.library.edit.command.MethodElementCreateChildCommand;
-import org.eclipse.epf.library.edit.command.UserInput;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.dialogs.UncancelableListSelectionDialog;
-import org.eclipse.epf.library.ui.dialogs.UserInputsDialog;
-import org.eclipse.epf.library.ui.providers.DelegateLabelProvider;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-
-/**
- * Implements handling of user interaction during command execution
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UserInteractionHandler implements IUserInteractionHandler {
-
-	private Shell shell;
-
-	private IMessenger messenger = new IMessenger() {
-
-		/*
-		 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showWarning(java.lang.String,
-		 *      java.lang.String)
-		 */
-		public void showWarning(final String title, final String msg) {
-			if (Display.getCurrent() == null) {
-				// current thread is not a user-interface thread
-				//
-				Display.getDefault().syncExec(new Runnable() {
-
-					public void run() {
-						LibraryUIPlugin.getDefault().getMsgDialog()
-								.displayWarning(title, msg);
-					}
-
-				});
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayWarning(
-						title, msg);
-			}
-		}
-
-		/*
-		 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String,
-		 *      java.lang.String, org.eclipse.core.runtime.IStatus)
-		 */
-		public void showError(final String title, final String msg,
-				final IStatus status) {
-			if (status == null) {
-				showError(title, msg);
-			} else {
-				if (Display.getCurrent() == null) {
-					// current thread is not a user-interface thread
-					//
-					Display.getDefault().syncExec(new Runnable() {
-
-						public void run() {
-							LibraryUIPlugin.getDefault().getMsgDialog()
-									.displayError(title, msg, status);
-						}
-
-					});
-				} else {
-					LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-							title, msg, status);
-				}
-			}
-		}
-
-		/*
-		 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String,
-		 *      java.lang.String, java.lang.String, java.lang.Exception)
-		 */
-		public void showError(final String title, final String msg,
-				final String reason, final Exception exception) {
-			if (Display.getCurrent() == null) {
-				// current thread is not a user-interface thread
-				//
-				Display.getDefault().syncExec(new Runnable() {
-
-					public void run() {
-						LibraryUIPlugin.getDefault().getMsgDialog()
-								.displayError(title, msg, reason, exception);
-					}
-
-				});
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(title,
-						msg, reason, exception);
-			}
-		}
-
-		/*
-		 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showWarning(java.lang.String,
-		 *      java.lang.String, java.lang.String)
-		 */
-		public void showWarning(final String title, final String msg,
-				final String reason) {
-			if (Display.getCurrent() == null) {
-				// current thread is not a user-interface thread
-				//
-				Display.getDefault().syncExec(new Runnable() {
-
-					public void run() {
-						LibraryUIPlugin.getDefault().getMsgDialog()
-								.displayWarning(title, msg, reason);
-					}
-
-				});
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayWarning(
-						title, msg, reason);
-			}
-		}
-
-		/*
-		 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String,
-		 *      java.lang.String)
-		 */
-		public void showError(final String title, final String msg) {
-			if (Display.getCurrent() == null) {
-				// current thread is not a user-interface thread
-				//
-				Display.getDefault().syncExec(new Runnable() {
-
-					public void run() {
-						LibraryUIPlugin.getDefault().getMsgDialog()
-								.displayError(title, msg);
-					}
-
-				});
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(title,
-						msg);
-			}
-		}
-
-		/*
-		 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showInfo(java.lang.String,
-		 *      java.lang.String)
-		 */
-		public void showInfo(final String title, final String msg) {
-			if (Display.getCurrent() == null) {
-				// current thread is not a user-interface thread
-				//
-				Display.getDefault().syncExec(new Runnable() {
-
-					public void run() {
-						LibraryUIPlugin.getDefault().getMsgDialog()
-								.displayInfo(title, msg);
-					}
-
-				});
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayInfo(title,
-						msg);
-			}
-		}
-
-		/*
-		 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String,
-		 *      java.lang.String, java.lang.String, java.lang.String,
-		 *      java.lang.Exception)
-		 */
-		public void showError(final String title, final String msg,
-				final String reason, final String details,
-				final Exception exception) {
-			if (Display.getCurrent() == null) {
-				// current thread is not a user-interface thread
-				//
-				Display.getDefault().syncExec(new Runnable() {
-
-					public void run() {
-						LibraryUIPlugin.getDefault().getMsgDialog()
-								.displayError(title, msg, reason, details,
-										exception);
-					}
-
-				});
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(title,
-						msg, reason, details, exception);
-			}
-		}
-
-	};
-
-	public UserInteractionHandler() {
-
-	}
-
-	/**
-	 * @param shell
-	 *            the shell to set
-	 */
-	public void setShell(Shell shell) {
-		this.shell = shell;
-	}
-
-	/*
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#getUIContext()
-	 */
-	public Object getUIContext() {
-		if (shell == null) {
-			return MsgBox.getDefaultShell();
-		}
-		return shell;
-	}
-
-	/*
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#select(java.util.List,
-	 *      org.eclipse.jface.viewers.ILabelProvider, boolean, java.util.List,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public List select(List objectsToSelect, final IItemLabelProvider labelProvider,
-			boolean multiple, List intitialSelection, String title, String msg) {
-		ILabelProvider lp = new DelegateLabelProvider(labelProvider);
-		if (multiple) {
-			IStructuredContentProvider contentProvider = new ArrayContentProvider();
-			UncancelableListSelectionDialog dlg = new UncancelableListSelectionDialog(
-					shell, objectsToSelect, contentProvider, lp, msg);
-			dlg.setTitle(title);
-			dlg.setBlockOnOpen(true);
-			dlg.open();
-			Object objs[] = dlg.getResult();
-			if (objs == null) {
-				return null;
-			} else {
-				if (objs.length == 0) {
-					return Collections.EMPTY_LIST;
-				}
-				return Arrays.asList(objs);
-			}
-		} else {
-			ElementListSelectionDialog dlg = new ElementListSelectionDialog(
-					shell, lp);
-
-			dlg.setBlockOnOpen(true);
-			dlg.setElements(objectsToSelect.toArray());
-			dlg.setMultipleSelection(false);
-			dlg.setMessage(msg);
-			dlg.setTitle(title);
-			dlg.setFilter(null);
-			if (dlg.open() == Dialog.CANCEL) {
-				return null;
-			}
-			Object obj = dlg.getFirstResult();
-			return Collections.singletonList(obj);
-		}
-	}
-
-	/*
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#selectOne(int[],
-	 *      java.lang.String, java.lang.String)
-	 */
-	public int selectOne(int[] actions, String title, String msg, IStatus status) {
-		final String[] buttonLabels = new String[actions.length];
-		for (int i = 0; i < actions.length; i++) {
-			buttonLabels[i] = getActionText(actions[i]);
-		}
-		Image image = null;
-		try {
-			shell = LibraryUIPlugin.getDefault().getWorkbench().getDisplay()
-					.getActiveShell();
-			image = shell.getImage();
-		} catch (Exception e) {
-		}
-		if (status == null) {
-			MessageDialog msgDlg = new MessageDialog(shell, title, image, msg,
-					MessageDialog.QUESTION, buttonLabels, 0);
-			int id = msgDlg.open();
-			return actions[id];
-		} else {
-			ErrorDialogNoReason dlg = new ErrorDialogNoReason(shell, title,
-					msg, status, IStatus.OK | IStatus.INFO | IStatus.WARNING
-							| IStatus.ERROR) {
-
-				protected void createButtonsForButtonBar(Composite parent) {
-					// create OK and Details buttons
-					for (int i = 0; i < buttonLabels.length; i++) {
-						String label = buttonLabels[i];
-						createButton(parent, i, label, i == 0);
-					}
-					if (shouldShowDetailsButton()) {
-						detailsButton = createButton(parent,
-								IDialogConstants.DETAILS_ID,
-								IDialogConstants.SHOW_DETAILS_LABEL, false);
-					}
-
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.epf.common.serviceability.ErrorDialogNoReason#buttonPressed(int)
-				 */
-				protected void buttonPressed(int id) {
-					if (id == IDialogConstants.DETAILS_ID) {
-						super.buttonPressed(id);
-					} else {
-						setReturnCode(id);
-						close();
-					}
-				}
-			};
-			int id = dlg.open();
-			return actions[id];
-		}
-	}
-
-	/**
-	 * Return action text
-	 * 
-	 * @param action
-	 * @return Action text - either ABORT, CANCEL, OK, RETRY
-	 */
-	public static String getActionText(int action) {
-		switch (action) {
-		case IUserInteractionHandler.ACTION_ABORT:
-			return IDialogConstants.ABORT_LABEL;
-		case IUserInteractionHandler.ACTION_CANCEL:
-			return IDialogConstants.CANCEL_LABEL;
-		case IUserInteractionHandler.ACTION_OK:
-			return IDialogConstants.OK_LABEL;
-		case IUserInteractionHandler.ACTION_RETRY:
-			return IDialogConstants.RETRY_LABEL;
-		case IUserInteractionHandler.ACTION_YES:
-			return IDialogConstants.YES_LABEL;
-		case IUserInteractionHandler.ACTION_NO:
-			return IDialogConstants.NO_LABEL;
-		default:
-			break;
-		}
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#getMessenger()
-	 */
-	public IMessenger getMessenger() {
-		return messenger;
-	}
-
-	/*
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#requestInput(java.lang.String,
-	 *      java.lang.String, java.util.List)
-	 */
-	public boolean requestInput(final String title, final String msg, final List userInputs) {
-		if (userInputs == null || userInputs.size() == 0)
-			return false;
-		
-		if (Display.getCurrent() == null) {
-			// current thread is not a user-interface thread
-			//
-			final boolean retHolder[] = new boolean[1];
-			Display.getDefault().syncExec(new Runnable() {
-
-				public void run() {
-					retHolder[0] = doRequestInput(title, msg, userInputs);
-				}
-
-			});
-			return retHolder[0];
-		} else {
-			return doRequestInput(title, msg, userInputs);
-		}
-		
-	}
-	
-	private boolean doRequestInput(String title, String msg, List userInputs) {
-		final UserInput userInput = (UserInput) userInputs.get(0);
-		if (userInput.getContext() instanceof MethodElementCreateChildCommand) {
-			MethodElementCreateChildCommand cmd = (MethodElementCreateChildCommand) userInput
-					.getContext();
-			if (cmd.getFeature() == UmaPackage.eINSTANCE
-					.getMethodLibrary_PredefinedConfigurations()) {
-				NewConfigurationWizard wizard = new NewConfigurationWizard();
-				wizard.init(PlatformUI.getWorkbench(), null);
-				wizard.setMethodConfiguration((MethodConfiguration) cmd.getChild());
-				WizardDialog dialog = new WizardDialog(Display.getCurrent()
-						.getActiveShell(), wizard);
-				dialog.create();
-				if (dialog.open() == Window.OK) {
-					userInput.setInput(wizard.getMethodConfiguration().getName());
-					return true;
-				}
-				else {
-					return false;
-				}
-			}
-		}
-		
-		if(userInputs.size() == 1 && userInput.getType() == UserInput.TEXT && userInput.getLabel() == null) {
-			// user InputDialog for this case until we fix this dialog box
-			//
-			IInputValidator validator = userInput.getValidator() != null ? new IInputValidator() {
-
-				public String isValid(String newText) {
-					return userInput.getValidator().isValid(newText);
-				}
-			
-			} : null;
-			InputDialog dlg = new InputDialog(PlatformUI
-				.getWorkbench().getDisplay().getActiveShell(),
-				title, msg, (String)userInput.getInput(), validator);
-			if(dlg.open() == Window.OK) {
-				userInput.setInput(dlg.getValue());
-				return true;
-			}
-			return false;
-		}
-		
-		UserInputsDialog dialog = new UserInputsDialog(PlatformUI
-				.getWorkbench().getDisplay().getActiveShell(), userInputs,
-				title, msg);
-		dialog.setBlockOnOpen(true);
-		dialog.open();
-		return dialog.getResult();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/package.html
deleted file mode 100644
index 0417dd5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides editing actions for the Authoring UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/celleditors/AbstractCheckBoxCellEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/celleditors/AbstractCheckBoxCellEditor.java
deleted file mode 100644
index e57bb28..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/celleditors/AbstractCheckBoxCellEditor.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.celleditors;
-
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TreeEditor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * An abstract class for check box cell editor
- * @author An Ming
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public abstract class AbstractCheckBoxCellEditor {
-
-	// the cell modifier
-	private ICellModifier modifier = null;
-
-	// tree editor
-	private TreeEditor treeEditor = null;
-
-	// the tree
-	private Tree tree = null;
-
-	// the control editor
-	private Control control = null;
-
-	// the column index
-	private int columnIndex;
-
-	/**
-	 * Construct an instance
-	 * @param tree
-	 */
-	public AbstractCheckBoxCellEditor(Composite tree) {
-		this.tree = (Tree) tree;
-		this.treeEditor = new TreeEditor(this.tree);
-	}
-
-
-	/**
-	 * Set cell modifier
-	 * @param modifier
-	 */
-	public void setCellModifier(ICellModifier modifier) {
-		this.modifier = modifier;
-	}
-
-	/**
-	 * Get the cell modifier
-	 * 
-	 * @return
-	 * 		CellModifier
-	 */
-	protected ICellModifier getCellModifier() {
-		return this.modifier;
-	}
-
-	public abstract Image getImage(TreeItem item, String columnproperty);
-
-	public abstract void modify(TreeItem item, String columnproperty);
-
-	/*
-	 * =======in fact below codes are for the dynamic cell editor (real control
-	 * "button")=====
-	 */
-	public void setEditorTo(TreeItem item, String columnproperty) {
-		if (treeEditor.getItem() != null)
-			return;
-		if (control == null)
-			control = createControl(tree);
-		hookControl(control, item, columnproperty);
-
-		treeEditor.minimumWidth = control.getSize().x;
-		treeEditor.horizontalAlignment = SWT.CENTER;
-		treeEditor.setEditor(control, item, columnIndex);
-
-	}
-
-	public void deleteEditorFrom(TreeItem item, String columnproperty) {
-		control.setVisible(false);
-		treeEditor.setEditor(null, null, columnIndex);
-	}
-
-	protected abstract Control createControl(Tree parent);
-
-	protected abstract void hookControl(Control control, TreeItem item,
-			String columnproperty);
-
-	/**
-	 * Get column index
-	 * @return
-	 * 		index
-	 */
-	public int getColumnIndex() {
-		return columnIndex;
-	}
-
-	/**
-	 * Set index for column
-	 * @param columnIndex
-	 */
-	public void setColumnIndex(int columnIndex) {
-		this.columnIndex = columnIndex;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/celleditors/ProcessCheckBoxCellEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/celleditors/ProcessCheckBoxCellEditor.java
deleted file mode 100644
index 6ecd43e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/celleditors/ProcessCheckBoxCellEditor.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.celleditors;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * Check Box cell editor for process form page, WBS, TA, WPU
- * 
- * @author An Ming
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class ProcessCheckBoxCellEditor extends AbstractCheckBoxCellEditor {
-	
-	// checkbox images
-	private final Image checkImage = AuthoringUIPlugin.getDefault().getSharedImage(
-			"full/obj16/Check.gif"); //$NON-NLS-1$
-
-	private final Image uncheckImage = AuthoringUIPlugin.getDefault().getSharedImage(
-			"full/obj16/Uncheck.gif"); //$NON-NLS-1$
-
-	private final Image disableCheckImage = AuthoringUIPlugin.getDefault().getSharedImage(
-		"full/obj16/DisableCheck.gif"); //$NON-NLS-1$
-	
-	private final Image disableUncheckImage = AuthoringUIPlugin.getDefault().getSharedImage(
-		"full/obj16/DisableUncheck.gif"); //$NON-NLS-1$
-	
-	private SelectionListener listener;
-
-	/**
-	 * Constructor
-	 * @param tree
-	 */
-	public ProcessCheckBoxCellEditor(Composite tree) {
-		super(tree);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.celleditors.AbstractCheckBoxCellEditor#getImage(org.eclipse.swt.widgets.TreeItem, java.lang.String)
-	 */
-	public Image getImage(TreeItem item, String columnproperty) {
-		final ICellModifier modifier = getCellModifier();
-		Object element = item.getData();
-		if (element == null)
-			return null;
-//		if (columnproperty == IBSItemProvider.COL_IS_ONGOING
-//				|| columnproperty == IBSItemProvider.COL_IS_REPEATABLE
-//				|| columnproperty == IBSItemProvider.COL_IS_EVENT_DRIVEN) {
-//			if (!(TngUtil.unwrap(element) instanceof WorkBreakdownElement)) {
-//				return null;
-//			}
-//		}
-		Object value = modifier.getValue(element, columnproperty);
-		if (value == null || !(value instanceof Boolean))
-			return null;
-		boolean canModify = modifier.canModify(element, columnproperty);
-
-		if (((Boolean) value).booleanValue()) {
-			return canModify ? checkImage : disableCheckImage;
-		} else {
-			return canModify ? uncheckImage : disableUncheckImage;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.celleditors.AbstractCheckBoxCellEditor#modify(org.eclipse.swt.widgets.TreeItem, java.lang.String)
-	 */
-	public void modify(TreeItem item, String columnproperty) {
-		final ICellModifier modifier = getCellModifier();
-		if (!modifier.canModify(item.getData(), columnproperty))
-			return;
-		modifier.modify(item, columnproperty, new Boolean(!((Boolean) modifier
-				.getValue(item.getData(), columnproperty)).booleanValue()));
-	}
-
-	/*
-	 * =======in fact below codes are for the dynamic cell editor (real control
-	 * "button")=====
-	 */
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.celleditors.AbstractCheckBoxCellEditor#createControl(org.eclipse.swt.widgets.Tree)
-	 */
-	protected Control createControl(Tree parent) {
-		Button button = new Button(parent, SWT.CHECK);
-		button.pack();
-		return button;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.celleditors.AbstractCheckBoxCellEditor#hookControl(org.eclipse.swt.widgets.Control, org.eclipse.swt.widgets.TreeItem, java.lang.String)
-	 */
-	protected void hookControl(Control control, TreeItem item,
-			final String columnproperty) {
-		final ICellModifier modifier = getCellModifier();
-		final Object element = item;
-		final Button checkbox = (Button) control;
-		if (listener != null)
-			checkbox.removeSelectionListener(listener);
-		listener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				modifier.modify(element, columnproperty, new Boolean(checkbox
-						.getSelection()));
-			}
-		};
-		checkbox.addSelectionListener(listener);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/CheatsheetSwitchJob.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/CheatsheetSwitchJob.java
deleted file mode 100644
index 86198f6..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/CheatsheetSwitchJob.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.cheatsheets.actions;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.cheatsheets.OpenCheatSheetAction;
-
-/**
- * Switchs cheat sheet and opens it.
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class CheatsheetSwitchJob extends Job {
-	private String cheatsheetId;
-
-	/**
-	 * Create an instance with cheat sheet name and Id
-	 * @param name
-	 * @param cheatsheetId
-	 */
-	public CheatsheetSwitchJob(String name, String cheatsheetId) {
-		super(name);
-		this.cheatsheetId = cheatsheetId;
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected IStatus run(IProgressMonitor monitor) {
-		PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				new OpenCheatSheetAction(cheatsheetId).run();
-			}
-		});
-		return Status.OK_STATUS;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/CreatePluginAction.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/CreatePluginAction.java
deleted file mode 100644
index 767878a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/CreatePluginAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.cheatsheets.actions;
-
-import org.eclipse.epf.authoring.ui.actions.NewPluginAction;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.cheatsheets.ICheatSheetAction;
-import org.eclipse.ui.cheatsheets.ICheatSheetManager;
-
-/**
- * Create Method Plug-in cheat sheet action.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class CreatePluginAction extends Action implements ICheatSheetAction {
-
-	/**
-	 * @see ICheatSheetAction#run(String[], ICheatSheetManager)
-	 */
-	public void run(String[] params, ICheatSheetManager manager) {
-		NewPluginAction.execute(PlatformUI.getWorkbench(), null);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/SwitchCheatsheetTo.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/SwitchCheatsheetTo.java
deleted file mode 100644
index 24135eb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/SwitchCheatsheetTo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.cheatsheets.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.cheatsheets.ICheatSheetAction;
-import org.eclipse.ui.cheatsheets.ICheatSheetManager;
-
-/**
- * Create switch cheat sheet action
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SwitchCheatsheetTo extends Action implements ICheatSheetAction {
-
-	
-	/**
-	 * @see org.eclipse.ui.cheatsheets.ICheatSheetAction#run(java.lang.String[], org.eclipse.ui.cheatsheets.ICheatSheetManager)
-	 */
-	public void run(String[] params, ICheatSheetManager manager) {
-
-		if (params.length <= 0)
-			return;
-
-		String cs_id = params[0];
-
-		// System.out.println("$$$ DEBUG: in SwitchCheatsheetTo.run(...) cs_ID =
-		// " + cs_id); //$NON-NLS-1$
-
-		CheatsheetSwitchJob switchJob = new CheatsheetSwitchJob(
-				"Switch Cheatsheet", cs_id); //$NON-NLS-1$
-		switchJob.schedule(50);
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/package.html
deleted file mode 100644
index 72e9afa..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/cheatsheets/actions/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides actions for the Authoring cheatsheets.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ADDInfoDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ADDInfoDialog.java
deleted file mode 100644
index 0e02177..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ADDInfoDialog.java
+++ /dev/null
@@ -1,740 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor;
-import org.eclipse.epf.authoring.ui.editors.ActivityDetailDiagramEditor;
-import org.eclipse.epf.authoring.ui.filters.DescriptorConfigurationFilter;
-import org.eclipse.epf.authoring.ui.filters.ExProcessAuthoringConfigurator;
-import org.eclipse.epf.authoring.ui.util.AuthoringAccessibleListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
-import org.eclipse.epf.library.edit.itemsfilter.ICategoryFilter;
-import org.eclipse.epf.library.edit.itemsfilter.IProcessFilter;
-import org.eclipse.epf.library.edit.process.BreakdownElementItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * Filter Dialog - allow the user to filter the content element, content
- * categories, custom categories, All types of contentelements based on location of the use of the filter
- * dialog.
- * 
- * @author Shashidhar Kannoori
- */
-public class ADDInfoDialog extends Dialog implements
-		ISelectionChangedListener, IDoubleClickListener {
-
-	protected Button okButton, cancelButton;
-
-	protected Text ctrl_brief_desc;
-
-	//private String pattern, filterTypeStr;
-
-	//protected Combo filterType;
-
-	private String dialogTitle, tabStr;
-
-	private Object contentElement;
-
-	private ArrayList selectedList = new ArrayList();
-
-	private boolean viewerSelectionSingle = false;
-	private String viewerLabel = null;
-	
-	/*
-	 * Treeviewer for ContentElements to display.
-	 */
-	private TreeViewer treeViewer;
-
-	protected IStructuredContentProvider contentProvider;
-
-	protected ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getText(Object object) {
-			// return super.getText(object);
-			if (object instanceof VariabilityElement) {
-				return TngUtil.getLabel((VariabilityElement) object, "", true); //$NON-NLS-1$
-			} else {
-				return super.getText(object);
-			}
-		}
-	};
-
-	private AdapterFactory adapterFactory;
-	private ComposedAdapterFactory composedAdapterFactory;
-
-	/*
-	 * Dialog Attributes
-	 */
-	// private boolean anyChilds = true;
-	private List alreadySelectedList = new ArrayList();
-
-	private IFilter filter;
-
-	Pattern regexPattern;
-
-	// private MethodConfiguration methodConfiguration;
-	protected FilterHelper helper;
-
-	private Button expandButton;
-
-	private Button collapseButton;
-
-	private Object input;
-
-	//private String[] types;
-
-	/**
-	 * Constructs a new FilterDialog. This constructor will use filter based on
-	 * tabStr, filters out the list of elements based on already existing
-	 * selected element in the selected table. Initializes the ContentProvider
-	 * for the treeviewer.
-	 * 
-	 */
-	public ADDInfoDialog(Shell parentShell, Object contentElement,
-			String tabStr, List alreadyExists) {
-		super(parentShell);
-		this.contentElement = contentElement;
-		this.tabStr = tabStr;
-		this.filter = null;
-		this.alreadySelectedList = alreadyExists;
-		helper = new FilterHelper(contentElement, tabStr, null, null,
-				this.alreadySelectedList);
-		initProviderForTabs();
-	}
-
-	public ADDInfoDialog(Shell parentShell, IFilter filter, String tabStr,
-			List alreadyExists, Object input) {
-		this(parentShell, filter, null, tabStr, alreadyExists);
-		this.input = input;
-	}
-
-	/**
-	 * Constructs a new FilterDialog. This constructor will use passed filter.
-	 * tabStr is used for the searchtype only. Initializes the ContentProvider
-	 * for the treeviewer.
-	 * 
-	 */
-	public ADDInfoDialog(Shell parentShell, IFilter filter,
-			Object contentElement, String tabStr) {
-		super(parentShell);
-		this.filter = filter;
-		this.tabStr = tabStr;
-
-		helper = new FilterHelper(contentElement, tabStr, null, null, null);
-		initProviderForTabs();
-	}
-
-	/**
-	 * Constructs a new FilterDialog. This constructor will use passed filter.
-	 * tabStr is used for the searchtype only. Initializes the ContentProvider
-	 * for the treeviewer.
-	 * 
-	 */
-	public ADDInfoDialog(Shell parentShell, IFilter filter,
-			Object contentElement, String tabStr, List alreadyExists) {
-		super(parentShell);
-		this.filter = filter;
-		this.tabStr = tabStr;
-		this.alreadySelectedList = alreadyExists;
-		helper = new FilterHelper(contentElement, tabStr, null, null,
-				alreadyExists);
-		this.contentElement = contentElement;
-		initProviderForTabs();
-	}
-
-	/**
-	 * Constructs a new FilterDialog. Only for methodconfiguration. This
-	 * constructor will use passed filter. Initializes the ContentProvider for
-	 * the treeviewer.
-	 * 
-	 */
-	// public ItemsFilterDialog(Shell parentShell, Object contentElement,
-	// MethodConfiguration methodConfiguration, String tabStr) {
-	// super(parentShell);
-	// this.contentElement = contentElement;
-	// this.tabStr = tabStr;
-	// this.filter = null;
-	// this.methodConfiguration = methodConfiguration;
-	// helper = new FilterHelper(contentElement, tabStr, null, null, null);
-	// initProviderForTabs();
-	// }
-	/**
-	 * This constructor is very generic, in order to initialize filter, input
-	 * and contentprovider should be handled explicitly by calling below method.
-	 * setFilter(IFilter) setInput(Object)
-	 * setContentProvider(IStructuredProvider)
-	 * 
-	 */
-	public ADDInfoDialog(Shell parentShell) {
-		super(parentShell);
-		helper = new FilterHelper(null, null, null, null, null);
-	}
-
-	/**
-	 * This method is called if a button has been pressed.
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.OK_ID)
-			saveValues();
-		super.buttonPressed(buttonId);
-		if(composedAdapterFactory != null){
-			composedAdapterFactory.dispose();
-		}
-		close();
-
-	}
-
-	public void saveValues(){
-		IStructuredSelection selection = (IStructuredSelection) treeViewer
-		.getSelection();
-		if (selection.size() > 0) {
-			Object[] objectArr = selection.toArray();
-			for (int i = 0; i < objectArr.length; i++) {
-				Object obj = LibraryUtil.unwrap(objectArr[i]);
-				if (obj instanceof Activity) {
-					selectedList.add(obj);
-				} 
-			}
-		}
-	}
-		
-	/**
-	 * Notifies that the cancel button of this dialog has been pressed.
-	 */
-	protected void cancelPressed() {
-		if(composedAdapterFactory != null){
-			composedAdapterFactory.dispose();
-		}
-		super.cancelPressed();
-	}
-
-	/**
-	 * Set title for dialog box eg: Select Dialog For Role, dialogTitle needs to
-	 * "Role"
-	 */
-	public void setTitle(String dialogTitle) {
-		this.dialogTitle = dialogTitle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (dialogTitle == null)
-			dialogTitle = tabStr;
-		shell.setText("Activity Detail Diagram Info: " + dialogTitle); //$NON-NLS-1$
-	}
-
-	/**
-	 * (non-Javadoc) Adds buttons to this dialog's button bar.
-	 * 
-	 * @param parent
-	 *            the button bar composite
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-	}
-
-	/**
-	 * Creates dialog area and controls and viewer.
-	 * 
-	 * @param the
-	 *            parent composite to contain the dialog area
-	 * @return the dialog area control
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		Composite composite = (Composite) super.createDialogArea(parent);
-		composite.setFont(parent.getFont());
-
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-		//GridData gD = (GridData) composite.getLayoutData();
-		layout.numColumns = 3;
-
-		Label typeLabel = new Label(composite, SWT.NONE);
-		{
-			typeLabel.setText("Select the activity to modify ADD"); //$NON-NLS-1$
-			GridData gD1 = new GridData(GridData.BEGINNING);
-			typeLabel.setLayoutData(gD1);
-
-		}
-//		filterType = new Combo(composite, SWT.SINGLE | SWT.READ_ONLY);
-//		{
-//			GridData gD1 = new GridData(GridData.BEGINNING);
-//			gD1.horizontalSpan = 2;
-//			gD1.widthHint = 390;
-//			filterType.setLayoutData(gD1);
-//		}
-//
-//		if (types == null) {
-//			fillFilterTypeCombo();
-//		} else {
-//			filterType.setItems(types);
-//			if (helper != null) {
-//				filterTypeStr = filterType.getItem(0);
-//				helper.setFilterTypeStr(filterType.getItem(0));
-//				if (tabStr == null) {
-//					tabStr = filterTypeStr;
-//					helper.setTabStr(tabStr);
-//				}
-//			}
-//		}
-//		filterType.select(0);
-
-//		Label ctrl_patternLabel = new Label(composite, SWT.NONE);
-//		{
-//			ctrl_patternLabel.setText(AuthoringUIResources.FilterDialog_Pattern_text); //$NON-NLS-1$
-//			gD.horizontalSpan = 3;
-//			ctrl_patternLabel.setLayoutData(gD);
-//		}
-
-//		ctrl_pattern = new Text(composite, SWT.BORDER);
-//		{
-//			GridData gD1 = new GridData(GridData.FILL_HORIZONTAL);
-//			gD1.horizontalSpan = 3;
-//			ctrl_pattern.setLayoutData(gD1);
-//			ctrl_pattern.getAccessible().addAccessibleListener(
-//					new AuthoringAccessibleListener(
-//							AuthoringUIResources.FilterDialog_Pattern_text +  
-//							AuthoringUIResources.FilterDialog_Pattern_description));
-//		}
-//		Label ctrl_patternLabel1 = new Label(composite, SWT.NONE);
-//		{
-//			ctrl_patternLabel1.setText(AuthoringUIResources.FilterDialog_Pattern_description); //$NON-NLS-1$
-//			ctrl_patternLabel1.setLayoutData(gD);
-//		}
-		
-		Composite buttonsComposite = new Composite(composite, SWT.NONE);		
-		
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL
-			| GridData.HORIZONTAL_ALIGN_END);
-		gd2.horizontalSpan = 2;
-		buttonsComposite.setLayoutData(gd2);
-		GridLayout buttonsLayout = new GridLayout();
-		buttonsLayout.numColumns = 2;
-		buttonsLayout.marginRight = 0;
-		buttonsComposite.setLayout(buttonsLayout);
-		
-		expandButton = new Button(buttonsComposite, SWT.BUTTON1);
-
-		expandButton.setImage(AuthoringUIPlugin.getDefault().getSharedImage(
-				"expandall.gif")); //$NON-NLS-1$
-		expandButton.setToolTipText(AuthoringUIResources.FilterDialog_ExpandAll); 
-		
-		expandButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-						AuthoringUIResources.FilterDialog_ExpandAll));		
-
-		gd2 = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING
-				| GridData.GRAB_HORIZONTAL);
-
-		expandButton.setLayoutData(gd2);
-
-		collapseButton = new Button(buttonsComposite, SWT.PUSH);
-		collapseButton.setImage(AuthoringUIPlugin.getDefault().getSharedImage(
-				"collapseall.gif")); //$NON-NLS-1$
-
-		collapseButton.setToolTipText(AuthoringUIResources.FilterDialog_CollapseAll); 
-		collapseButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-				AuthoringUIResources.FilterDialog_CollapseAll));
-		
-		gd2 = new GridData(GridData.HORIZONTAL_ALIGN_END);
-
-		collapseButton.setLayoutData(gd2);
-		
-		createLine(composite, 3);
-		createViewerLabel(composite);
-		// create a treeviewer area.
-		createViewer(composite);
-
-
-		new Label(composite, SWT.NONE).setText(AuthoringUIResources.FilterDialog_BriefDescription); 
-		ctrl_brief_desc = new Text(composite, SWT.BORDER | SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL | SWT.READ_ONLY);
-		{
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.horizontalSpan = 3;
-			gd.heightHint = 60;
-			ctrl_brief_desc.setLayoutData(gd);
-		}
-		// Restore the last state
-		createLine(composite, 3);
-
-		// Return results.
-		addListener();
-		// System.out.println("$$$ createDialogArea.filterTypeStr = " +
-		// filterTypeStr);
-		return composite;
-	}
-
-	/**
-	 * Create a new viewer in the parent.
-	 * 
-	 * @param parent
-	 *            the parent <code>Composite</code>.
-	 */
-	private void createViewer(Composite parent) {
-		if (viewerSelectionSingle) {
-			treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL
-					| SWT.V_SCROLL | SWT.BORDER);
-		} else {
-			treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
-					| SWT.V_SCROLL | SWT.BORDER);
-		}
-		treeViewer.setLabelProvider(labelProvider);
-		treeViewer.setContentProvider(contentProvider);
-		treeViewer.setUseHashlookup(true);
-
-		if (input != null) {
-			treeViewer.setInput(input);
-		} else {
-			// Phong: this is too messy. If you relies on the contentElement to
-			// determine the input for the viewer
-			// then you should declare a input field instead and move this code
-			// to constructor
-			//
-			// sorter needs or not. TODO
-			if (contentElement != null) {
-				if (contentElement instanceof Activity) {
-					if (contentElement instanceof Process) {
-						if (((Process) contentElement).eContainer() instanceof ProcessComponent) {
-							if (tabStr.equals(FilterConstants.GUIDANCE)
-									|| tabStr.equals(FilterConstants.ROADMAP) 
-									|| tabStr.equals(FilterConstants.SUPPORTING_MATERIALS)) {
-								treeViewer
-										.setInput(UmaUtil
-												.getMethodLibrary((EObject) contentElement));
-							} else {
-								treeViewer.setInput(((Process) contentElement)
-										.eContainer());
-							}
-						} else
-							treeViewer.setInput(contentElement);
-					} else
-						treeViewer.setInput(UmaUtil
-								.getMethodLibrary((EObject) contentElement));
-				} else {
-					treeViewer.setInput(UmaUtil
-							.getMethodLibrary((EObject) contentElement));
-				}
-			} else {
-				treeViewer
-						.setInput(LibraryService.getInstance().getCurrentMethodLibrary());
-			}
-		}
-
-		treeViewer.addSelectionChangedListener(this);
-		treeViewer.addDoubleClickListener(this);
-		treeViewer.getTree().setFont(parent.getFont());
-
-		if (tabStr.equalsIgnoreCase(FilterConstants.ALL_ELEMENTS)) { 
-			treeViewer.setSorter(new FilterSorterForAll());
-		} else {
-			treeViewer.setSorter(new FilterSorter());
-		}
-
-		// treeViewer.expandToLevel(3);
-		// treeViewer.expandAll();
-
-		GridData spec = new GridData(GridData.FILL_BOTH);
-		{
-			spec.widthHint = 300;
-			spec.heightHint = 300;
-			spec.horizontalSpan = 3;
-			treeViewer.getControl().setLayoutData(spec);
-		}
-	}
-
-	private void createLine(Composite parent, int ncol) {
-		Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = ncol;
-		line.setLayoutData(gridData);
-	}
-
-	private void createViewerLabel(Composite parent) {
-   		if (viewerLabel != null) {
-   			Label label = new Label(parent, SWT.NONE);
-			label.setText(viewerLabel);
-   		}
-   	}
-	
-	public void setViewerSelectionSingle(boolean single) {
-		viewerSelectionSingle = single;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-	 */
-	public void doubleClick(DoubleClickEvent event) {
-		IStructuredSelection s = (IStructuredSelection) event.getSelection();
-		Object element = s.getFirstElement();
-		element = LibraryUtil.unwrap(element);
-		if (element instanceof ContentElement || element instanceof Process) {
-			selectedList.add(element);
-		} else if (element instanceof ProcessComponent) {
-			selectedList.add(element);
-		} else if (element instanceof BreakdownElement) {
-			// if(!(element instanceof Activity))
-			selectedList.add(element);
-		} else if (element instanceof ProcessPackage) {
-			// if(!(element instanceof Activity))
-			selectedList.add(element);
-		}
-		close();
-		if(composedAdapterFactory != null){
-			composedAdapterFactory.dispose();
-		}
-	}
-
-	
-	public void traverseTree(TreeItem[] items, List list) {
-		for (int i = 0; i < items.length; i++) {
-			TreeItem[] itemsx = items[i].getItems();
-			if (itemsx.length > 1) {
-				list.add(items[i].getData());
-				traverseTree(itemsx, list);
-			} else {
-				list.add(items[i].getData());
-			}
-		}
-	}
-
-	
-
-
-	/**
-	 * Notifies that the selection has changed.
-	 * 
-	 * @param event
-	 *            event object describing the change
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		updateSelection(event);
-		updateButtons();
-	}
-
-	/**
-	 * Update the button enablement state.
-	 */
-	protected void updateButtons() {
-		// okButton.setEnabled(getSelection().length > 0);
-	}
-
-	public Object getParentObject(Object contentElement) {
-		return MethodElementUtil.getMethodModel(contentElement);
-	}
-
-	/**
-	 * Update the selection object.
-	 */
-	protected void updateSelection(SelectionChangedEvent event) {
-		// ArrayList descs = new ArrayList();
-		IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-		Object selected = sel.getFirstElement();
-		if (selected instanceof BreakdownElementWrapperItemProvider ||
-				selected instanceof BreakdownElementItemProvider){
-			Object unwrap =  TngUtil.unwrap(selected);
-			setBriefDescription(unwrap);
-		}else {
-			setBriefDescription(selected);
-		}
-	}
-	/**
-	 * Set the brief description to control
-	 */
-	private void setBriefDescription(Object element) {
-		if (element instanceof MethodElement) {
-			String desc = ((MethodElement) element).getBriefDescription();
-			if (desc != null) {
-				ctrl_brief_desc.setText(desc);
-			}
-		}
-	}
-
-	
-
-	public void addListener() {
-
-		expandButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				treeViewer.expandAll();
-
-			}
-		});
-		collapseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				treeViewer.collapseAll();
-
-			}
-		});
-
-	}
-
-	public ArrayList getSelectedItems() {
-		return selectedList;
-	}
-
-	private void initProviderForTabs() {
-
-		if (filter != null) {
-			if (filter instanceof org.eclipse.epf.library.edit.itemsfilter.IFilter) {
-				if(filter instanceof ICategoryFilter){
-					// special handling for contentcategory.
-					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=157452
-					helper.setContentCategoryTabStr(tabStr);
-				}
-				((org.eclipse.epf.library.edit.itemsfilter.IFilter) filter)
-						.setHelper(helper);
-			} else if (filter instanceof DescriptorConfigurationFilter) {
-				((DescriptorConfigurationFilter) filter).setHelper(helper);
-			}else if (filter instanceof ExProcessAuthoringConfigurator) {
-				((ExProcessAuthoringConfigurator) filter).setHelper(helper);
-			}
-		}
-		if (filter instanceof IProcessFilter) {
-			if (tabStr
-					.equalsIgnoreCase(FilterConstants.WORK_PRODUCT_DESCRIPTORS)) {
-				adapterFactory =TngAdapterFactory.INSTANCE.getPBSFilter_AdapterFactory(filter);
-				contentProvider = new AdapterFactoryContentProvider(
-						adapterFactory);
-				composedAdapterFactory = TngAdapterFactory.INSTANCE.getPBSFilter_ComposedAdapterFactory();
-				labelProvider = new AdapterFactoryLabelProvider(
-						TngAdapterFactory.INSTANCE
-								.getPBS_ComposedAdapterFactory());
-			} else if (tabStr
-					.equalsIgnoreCase(FilterConstants.ROLE_DESCRIPTORS)) {
-				adapterFactory = TngAdapterFactory.INSTANCE
-				.getOBSFilter_AdapterFactory(filter); 
-				contentProvider = new AdapterFactoryContentProvider(adapterFactory);
-				composedAdapterFactory = TngAdapterFactory.INSTANCE.getOBSFilter_ComposedAdapterFactory();
-				labelProvider = new AdapterFactoryLabelProvider(
-						TngAdapterFactory.INSTANCE
-								.getOBS_ComposedAdapterFactory());
-			}
-		} else {
-			adapterFactory = TngAdapterFactory.INSTANCE
-						.getItemsFilter_AdapterFactory(filter); 
-			contentProvider = new AdapterFactoryContentProvider(adapterFactory);
-			composedAdapterFactory = TngAdapterFactory.INSTANCE.getItemsFilter_ComposedAdapterFactory();
-		}
-	}
-
-	public void setExistingElements(List list) {
-		this.alreadySelectedList = list;
-		if (helper != null) {
-			helper.setAlreadySelectedList(list);
-		}
-	}
-
-	public FilterHelper getHelper() {
-		return this.helper;
-	}
-
-	public String[] getFilterTypeArray() {
-		return null;
-	}
-
-	/*
-	 * sets the ContentProvider used by TreeViewer.
-	 */
-	public void setContentProvider(IStructuredContentProvider contentProvider,
-			ComposedAdapterFactory composedAdapterFactory) {
-		this.contentProvider = contentProvider;
-		this.composedAdapterFactory = composedAdapterFactory;
-	}
-
-	/*
-	 * set the Filter.
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-		if (helper != null) {
-			if (this.filter instanceof org.eclipse.epf.library.edit.itemsfilter.IFilter) {
-				((org.eclipse.epf.library.edit.itemsfilter.IFilter) this.filter)
-						.setHelper(helper);
-			} else if (this.filter instanceof DescriptorConfigurationFilter) {
-				((DescriptorConfigurationFilter) this.filter).setHelper(helper);
-			}
-		}
-	}
-
-	public void setInput(Object input) {
-		if (input != null) {
-			this.input = input;
-		}
-	}
-
-	public void setViewerLabel(String viewerLabel) {
-		this.viewerLabel = viewerLabel;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/AttachmentDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/AttachmentDialog.java
deleted file mode 100644
index a35070a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/AttachmentDialog.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.io.File;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Opens dialog to attach attachments
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class AttachmentDialog extends Dialog {
-
-	/**
-	 * The OK button.
-	 */
-	protected Button okButton;
-
-	/**
-	 * The Cancel button.
-	 */
-	protected Button cancelButton;
-
-	/**
-	 * @param parent
-	 */
-
-	private Text attachment;
-
-	/**
-	 * Creates an instance
-	 * @param parent
-	 */
-	public AttachmentDialog(Shell parent) {
-		super(parent);
-	}
-
-	/**
-	 * @see Dialog#createDialogArea(Composite parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		Composite dialogArea = (Composite) super.createDialogArea(parent);
-		GridLayout layout = (GridLayout) dialogArea.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-		layout.numColumns = 2;
-		GridData gridData = (GridData) dialogArea.getLayoutData();
-		gridData.verticalIndent = 10;
-		layout.numColumns = 3;
-
-		Label urlLabel = new Label(dialogArea, SWT.NONE);
-		urlLabel.setText(AuthoringUIResources.AttachmentDialogFileURL_text); 
-		attachment = new Text(dialogArea, SWT.BORDER);
-		gridData.widthHint = 300;
-		attachment.setLayoutData(gridData);
-		attachment.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (okButton != null) {
-					okButton
-							.setEnabled(attachment.getText().trim().length() > 0);
-				}
-			}
-		});
-
-		Button browseButton = new Button(dialogArea, SWT.NONE);
-		browseButton.setText(AuthoringUIText.BROWSE_BUTTON_TEXT);
-		browseButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				FileDialog dialog = new FileDialog(Display.getCurrent()
-						.getActiveShell(), SWT.OPEN);
-				String imageFile = dialog.open();
-				if (imageFile != null && imageFile.length() > 0) {
-					File file = new File(imageFile);
-					try {
-						String url = file.toURL().toExternalForm();
-						attachment.setText(url);
-					} catch (Exception e) {
-					}
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		super
-				.getShell()
-				.setText(
-						AuthoringUIResources.AttachmentDialogattachFile_text); 
-
-		return dialogArea;
-
-	}
-
-	/**
-	 * Creates the dialog buttons.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// Create the OK button.
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		// Create the Cancel button.
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		// Set help context for the OK button.
-		okButton = super.getButton(IDialogConstants.OK_ID);
-
-		// Set help context for the Cancel button.
-		cancelButton = super.getButton(IDialogConstants.CANCEL_ID);
-
-		okButton.setEnabled(false);
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		// String url = attachment.getText();
-		// if (url != null && url.length() > 0) {
-		//			
-		// }
-		super.okPressed();
-	}
-
-	/**
-	 * Returns the File Name
-	 */
-	public String getAttachmentPath() {
-		return attachment.getText();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ChangeHistoryDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ChangeHistoryDialog.java
deleted file mode 100644
index 42a430f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ChangeHistoryDialog.java
+++ /dev/null
@@ -1,162 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-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.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-import com.ibm.icu.util.StringTokenizer;
-
-
-/**
- * Dialog to show change history of an element
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ChangeHistoryDialog extends Dialog {
-
-	/**
-	 * The OK button.
-	 */
-	protected Button okButton;
-
-	/**
-	 * The Cancel button.
-	 */
-	protected Button cancelButton;
-
-	/**
-	 * @param parent
-	 */
-
-	private MethodElement element;
-
-	private Table table;
-
-	/**
-	 * Creates an instance
-	 * 
-	 * @param parent
-	 * @param element
-	 */
-	public ChangeHistoryDialog(Shell parent, MethodElement element) {
-		super(parent);
-
-		this.element = element;
-	}
-
-	/**
-	 * @see Dialog#createDialogArea(Composite parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		Composite dialogArea = (Composite) super.createDialogArea(parent);
-		GridLayout layout = (GridLayout) dialogArea.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-		layout.numColumns = 1;
-		GridData gd = (GridData) dialogArea.getLayoutData();
-		gd.verticalIndent = 10;
-
-		Label label = new Label(dialogArea, SWT.NONE);
-		label.setText(AuthoringUIResources.ChangeHistoryDialog_label); 
-
-		table = new Table(dialogArea, SWT.BORDER | SWT.MULTI);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.horizontalSpan = 2;
-			gridData.widthHint = 400;
-			gridData.heightHint = 300;
-			table.setLayoutData(gridData);
-			table.setLinesVisible(true);
-
-		}
-
-		initChangeHistoryTable();
-		super.getShell().setText(
-				AuthoringUIResources.ChangeHistoryDialog_title); 
-
-		return dialogArea;
-
-	}
-
-	private void initChangeHistoryTable() {
-		String changeDesc = null;
-		if (element instanceof ContentElement) {
-			ContentDescription contentDescription = ((ContentElement) element)
-					.getPresentation();
-			changeDesc = contentDescription.getChangeDescription();
-		}
-		if (element instanceof MethodPlugin) {
-			changeDesc = ((MethodPlugin) element).getChangeDescription();
-		}
-
-		if (changeDesc != null) {
-			StringTokenizer tok = new StringTokenizer(
-					changeDesc,
-					AuthoringUIResources.ChangeHistoryDialog_delimiter); 
-			List strList = new ArrayList();
-
-			while (tok.hasMoreTokens()) {
-				strList.add(tok.nextToken());
-			}
-
-			for (int i = strList.size() - 1; i >= 0; i--) {
-				TableItem item = new TableItem(table, SWT.NONE);
-				item.setText((String) strList.get(i));
-			}
-		}
-
-	}
-
-	/**
-	 * Creates the dialog buttons.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// Create the OK button.
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		// Set help context for the OK button.
-		okButton = super.getButton(IDialogConstants.OK_ID);
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-
-		super.okPressed();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ConfigurationAddViewsDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ConfigurationAddViewsDialog.java
deleted file mode 100644
index e85f2e2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ConfigurationAddViewsDialog.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Open an dialog to add views into configuration
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ConfigurationAddViewsDialog extends ItemsFilterDialog {
-
-	/**
-	 * @param parentShell
-	 */
-	public ConfigurationAddViewsDialog(Shell parentShell) {
-		super(parentShell);
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public String getText(Object object) {
-				String presentationName = null;
-				if (object instanceof DescribableElement) {
-					presentationName = ((DescribableElement) object)
-							.getPresentationName();
-				}
-				if (presentationName == null || "".equals(presentationName)) { //$NON-NLS-1$
-					presentationName = super.getText(object);
-				}
-				return presentationName;
-			}
-		};
-		helper.setShowPresentationName(true);
-		return super.createDialogArea(parent);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ConfigurationOrderDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ConfigurationOrderDialog.java
deleted file mode 100644
index e0819f7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ConfigurationOrderDialog.java
+++ /dev/null
@@ -1,301 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInConfigurationCommand;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * Open a dialog to order configuration views
- * @author Xiang Dong Hu
- * @since 1.2
- *  fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=173827
- */
-public class ConfigurationOrderDialog extends Dialog {
-
-	private Composite baseComposite;
-
-	private Button ctrl_up, ctrl_down;
-
-	private Table ctrl_views;
-
-	private TableViewer viewsTableViewer;
-
-//	private ContentElementOrderList allSteps;
-
-	private IStructuredContentProvider viewsViewerContentProvider;
-
-	private ILabelProvider viewsViewerLabelProvider;
-	
-	private MethodConfiguration config;
-
-	private IActionManager actionManager;
-	
-	private ArrayList commands = new ArrayList();
-	
-	public ConfigurationOrderDialog(Shell parent, 
-			MethodConfiguration config, IActionManager actionManager) {
-		super(parent);
-		this.config = config;
-		this.actionManager = actionManager;
-	}
-	
-	/**
-	 * @see Dialog#createDialogArea(Composite parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		baseComposite = (Composite) super.createDialogArea(parent);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 4;
-		baseComposite.setLayout(gridLayout);
-		baseComposite.setLayoutData(new GridData());
-
-		// Empty line
-		createLabel(baseComposite, " ", 4); //$NON-NLS-1$
-
-		createLabel(baseComposite, " ", 1); //$NON-NLS-1$
-		createLabel(
-				baseComposite,
-				AuthoringUIResources.ConfigurationOrderDialog_NavigationViews, 3);
-
-		createLabel(baseComposite, " ", 1); //$NON-NLS-1$
-		ctrl_views = new Table(baseComposite, SWT.MULTI | SWT.BORDER);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.horizontalSpan = 2;
-			gridData.widthHint = 300;
-			gridData.heightHint = 400;
-			ctrl_views.setLayoutData(gridData);
-		}
-
-		initProviders();
-
-		viewsTableViewer = new TableViewer(ctrl_views);
-		viewsTableViewer.setContentProvider(viewsViewerContentProvider);
-		viewsTableViewer.setLabelProvider(viewsViewerLabelProvider);
-
-		Composite orderButtonPane = new Composite(baseComposite, SWT.NULL);
-		{
-			GridData gridData = new GridData(GridData.VERTICAL_ALIGN_CENTER
-					| GridData.HORIZONTAL_ALIGN_CENTER);
-			gridData.horizontalSpan = 1;
-			orderButtonPane.setLayoutData(gridData);
-			orderButtonPane.setLayout(new GridLayout());
-		}
-
-		ctrl_up = createButton(orderButtonPane, AuthoringUIText.UP_BUTTON_TEXT);
-		ctrl_up.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_down = createButton(orderButtonPane,
-				AuthoringUIText.DOWN_BUTTON_TEXT);
-		ctrl_down.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_up.setEnabled(false);
-		ctrl_down.setEnabled(false);
-		// Empty line
-		createLabel(baseComposite, " ", 4); //$NON-NLS-1$
-
-		createLine(baseComposite, 4);
-
-		super
-				.getShell()
-				.setText(
-						AuthoringUIResources.ConfigurationOrderDialog_description);
-
-		addListeners();
-		loadData();
-
-		return baseComposite;
-	}
-	
-	private void createLine(Composite parent, int ncol) {
-		Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = ncol;
-		line.setLayoutData(gridData);
-	}
-	
-	private Label createLabel(Composite parent, String text, int nCol) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(text);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.horizontalSpan = nCol;
-			label.setLayoutData(gridData);
-		}
-
-		return label;
-	}
-
-	private Button createButton(Composite parent, String label) {
-		Button button = new Button(parent, SWT.NONE);
-		button.setText(label);
-		return button;
-	}
-	
-	private void initProviders() {
-		viewsViewerContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return config.getProcessViews().toArray();
-			}
-		};
-
-		viewsViewerLabelProvider = new VariabilityElementLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-
-			public boolean isExternal(Object element) {
-				return !config.getProcessViews().contains(element);
-			}
-
-		};
-	}
-	
-	public void addListeners() {
-		viewsTableViewer
-		.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = (IStructuredSelection) viewsTableViewer
-						.getSelection();
-				if (selection.size() > 0) {
-					if (viewsTableViewer.getTable().getSelectionIndex() > 0
-							&& selection.size() == 1) {
-						ctrl_up.setEnabled(true);
-					} else
-						ctrl_up.setEnabled(false);
-
-					if (viewsTableViewer.getTable().getSelectionIndex() < viewsTableViewer
-							.getTable().getItemCount() - 1
-							&& selection.size() == 1) {
-						ctrl_down.setEnabled(true);
-					} else
-						ctrl_down.setEnabled(false);
-				}
-			}
-
-		});
-		
-		ctrl_up.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewsTableViewer
-						.getSelection();
-
-				ArrayList moveUpItems = new ArrayList();
-				moveUpItems.addAll(selection.toList());
-				EStructuralFeature feature = UmaPackage.eINSTANCE
-						.getMethodConfiguration_ProcessViews();
-				MoveInConfigurationCommand cmd = new MoveInConfigurationCommand(
-						config, moveUpItems, feature,1);
-				actionManager.execute(cmd);
-				commands.add(cmd);
-
-				viewsTableViewer.refresh();
-
-				if (viewsTableViewer.getTable().getSelectionIndex() > 0) {
-					ctrl_up.setEnabled(true);
-				} else
-					ctrl_up.setEnabled(false);
-				if (viewsTableViewer.getTable().getSelectionIndex() < viewsTableViewer
-						.getTable().getItemCount() - 1) {
-					ctrl_down.setEnabled(true);
-				} else
-					ctrl_down.setEnabled(false);
-			}
-		});
-		
-		ctrl_down.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewsTableViewer
-						.getSelection();
-				ArrayList moveDownItems = new ArrayList();
-				moveDownItems.addAll(selection.toList());
-				EStructuralFeature feature = UmaPackage.eINSTANCE
-						.getMethodConfiguration_ProcessViews();
-				MoveInConfigurationCommand cmd = new MoveInConfigurationCommand(
-						config, moveDownItems, feature,0);
-				actionManager.execute(cmd);
-				commands.add(cmd);
-
-				viewsTableViewer.refresh();
-
-				if (viewsTableViewer.getTable().getSelectionIndex() > 0) {
-					ctrl_up.setEnabled(true);
-				} else
-					ctrl_up.setEnabled(false);
-				if (viewsTableViewer.getTable().getSelectionIndex() < viewsTableViewer
-						.getTable().getItemCount() - 1) {
-					ctrl_down.setEnabled(true);
-				} else
-					ctrl_down.setEnabled(false);
-			}
-		});
-	}
-	
-	/**
-	 * Load initial data from model
-	 */
-	private void loadData() {
-		viewsTableViewer.setInput(config);
-	}
-	
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-//		allSteps.apply();
-		super.okPressed();
-	}
-
-	protected void cancelPressed() {
-		if (!commands.isEmpty()) {
-			for (int i = commands.size() - 1; i > -1; i--) {
-				Object cmd = commands.get(i);
-				if (cmd instanceof MoveInConfigurationCommand) {
-					((MoveInConfigurationCommand) cmd).undo();
-				}
-			}
-		}
-		super.cancelPressed();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ContentElementsOrderDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ContentElementsOrderDialog.java
deleted file mode 100644
index 3b6334a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ContentElementsOrderDialog.java
+++ /dev/null
@@ -1,469 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-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.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * Open an dialog to order content elements
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- * 
- */
-public class ContentElementsOrderDialog extends Dialog {
-
-	private Composite baseComposite;
-
-	private Button ctrl_up, ctrl_down;
-
-	private Table ctrl_steps;
-
-	private TableViewer stepsTableViewer;
-
-	// private ContentElementOrderList allSteps;
-	private ContentElementOrderList allSteps;
-
-	private IStructuredContentProvider stepsViewerContentProvider;
-
-	private ILabelProvider stepsViewerLabelProvider;
-
-	// private Task contentElement;
-	private ContentElement contentElement;
-
-	// the Element to use for sorting
-	private MethodElement sortElement;
-
-	private IActionManager actionManager;
-
-	private ArrayList commands = new ArrayList();
-
-	protected ComboViewer viewer_sort;
-
-	protected IStructuredContentProvider contentProviderSort = new AdapterFactoryContentProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public Object[] getElements(Object object) {
-			List<String> sortTypesList = CategorySortHelper
-					.getCategorySortTypes();
-			return sortTypesList.toArray();
-		}
-	};
-
-	protected ILabelProvider labelProviderSort = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getText(Object object) {
-			if (object instanceof String) {
-				String str = ((String) object);
-				return CategorySortHelper.getSortTypeDisplayName(str);
-			}
-			return null;
-		}
-	};
-
-	private EStructuralFeature feature;
-
-	/**
-	 * Creates a <code>AdvancedSearchDialog</code> giveb the parent control.
-	 * 
-	 * @param parent
-	 *            The parent control.
-	 */
-	public ContentElementsOrderDialog(Shell parent,
-			ContentElement contentElement, IActionManager actionManager) {
-		super(parent);
-		this.contentElement = contentElement;
-		if (TngUtil.isContributor(contentElement)) {
-			this.sortElement = contentElement.getVariabilityBasedOnElement();
-		} else {
-			this.sortElement = contentElement;
-		}
-		this.actionManager = actionManager;
-		this.allSteps = null;
-
-	}
-
-	/**
-	 * @see Dialog#createDialogArea(Composite parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		baseComposite = (Composite) super.createDialogArea(parent);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 4;
-		baseComposite.setLayout(gridLayout);
-		baseComposite.setLayoutData(new GridData());
-
-		// Empty line
-		createLabel(baseComposite, " ", 4); //$NON-NLS-1$
-
-		createLabel(baseComposite, " ", 1); //$NON-NLS-1$
-		createLabel(
-				baseComposite,
-				AuthoringUIResources.ContentElementsOrderDialog_ContentElement_text,
-				3); 
-
-		createLabel(baseComposite, " ", 1); //$NON-NLS-1$
-		ctrl_steps = new Table(baseComposite, SWT.MULTI | SWT.BORDER);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.horizontalSpan = 2;
-			gridData.widthHint = 300;
-			gridData.heightHint = 400;
-			ctrl_steps.setLayoutData(gridData);
-		}
-
-		initProviders();
-
-		stepsTableViewer = new TableViewer(ctrl_steps);
-		stepsTableViewer.setContentProvider(stepsViewerContentProvider);
-		stepsTableViewer.setLabelProvider(stepsViewerLabelProvider);
-
-		Composite orderButtonPane = new Composite(baseComposite, SWT.NULL);
-		{
-			GridData gridData = new GridData(GridData.VERTICAL_ALIGN_CENTER
-					| GridData.HORIZONTAL_ALIGN_CENTER);
-			gridData.horizontalSpan = 1;
-			orderButtonPane.setLayoutData(gridData);
-			orderButtonPane.setLayout(new GridLayout());
-		}
-
-		ctrl_up = createButton(orderButtonPane, AuthoringUIText.UP_BUTTON_TEXT);
-		ctrl_up.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_down = createButton(orderButtonPane,
-				AuthoringUIText.DOWN_BUTTON_TEXT);
-		ctrl_down.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_up.setEnabled(false);
-		ctrl_down.setEnabled(false);
-
-		createLabel(orderButtonPane, LibraryEditResources.SortType_Label, 1);
-		Combo ctrl_sort = new Combo(orderButtonPane, SWT.SINGLE | SWT.FLAT
-				| SWT.READ_ONLY);
-		viewer_sort = new ComboViewer(ctrl_sort);
-		viewer_sort.setContentProvider(contentProviderSort);
-		viewer_sort.setLabelProvider(labelProviderSort);
-		viewer_sort.setInput(contentElement);
-		// set initial selection
-		String sortType = CategorySortHelper.getCategorySortValue(sortElement);
-		viewer_sort.setSelection(new StructuredSelection(sortType), true);
-		enableButtons();
-
-		// Empty line
-		createLabel(baseComposite, " ", 4); //$NON-NLS-1$
-
-		createLine(baseComposite, 4);
-
-		super
-				.getShell()
-				.setText(
-						AuthoringUIResources.ContentElementsOrderDialog_description_text); 
-
-		addListeners();
-		loadData();
-
-		// contributors cannot change the sort type - the base element's sort is
-		// used
-		if (TngUtil.isLocked(contentElement) || TngUtil.isContributor(contentElement)) {
-			viewer_sort.getCombo().setEnabled(false);
-		} else {
-			viewer_sort.getCombo().setEnabled(true);
-		}
-
-		return baseComposite;
-	}
-
-	private void createLine(Composite parent, int ncol) {
-		Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = ncol;
-		line.setLayoutData(gridData);
-	}
-
-	private Label createLabel(Composite parent, String text, int nCol) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(text);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.horizontalSpan = nCol;
-			label.setLayoutData(gridData);
-		}
-
-		return label;
-	}
-
-	private Button createButton(Composite parent, String label) {
-		Button button = new Button(parent, SWT.NONE);
-		button.setText(label);
-		return button;
-	}
-
-	/**
-	 * Creates the dialog buttons.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// Create the OK button.
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		// Create the Cancel button.
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	private void initProviders() {
-		stepsViewerContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-
-				// if (allSteps == null) {
-				// allSteps = new ContentElementOrderList(
-				// contentElement,
-				// ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_AND_PARENTS);
-				// }
-				// List returnList =
-				// CategorySortHelper.sortCategoryElements(sortElement,
-				// allSteps.toArray());
-				// return returnList.toArray();
-
-				if (allSteps == null) {
-					allSteps = new ContentElementOrderList(
-							contentElement,
-							ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_AND_PARENTS,
-							feature);
-				}
-				List returnList = CategorySortHelper.sortCategoryElements(
-						sortElement, allSteps.toArray());
-				return returnList.toArray();
-			}
-		};
-
-		stepsViewerLabelProvider = new VariabilityElementLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-
-			public boolean isExternal(Object element) {
-				return !((List) ((ContentCategory) contentElement)
-						.eGet(feature)).contains(element);
-			}
-
-		};
-	}
-
-	public void addListeners() {
-
-		stepsTableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-
-					public void selectionChanged(SelectionChangedEvent event) {
-						enableButtons();
-					}
-
-				});
-
-		ctrl_up.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-						.getSelection();
-
-				ArrayList moveUpItems = new ArrayList();
-				moveUpItems.addAll(selection.toList());
-				EStructuralFeature feature = UmaPackage.eINSTANCE
-						.getCustomCategory_CategorizedElements();
-				MoveInCategoryCommand cmd = new MoveInCategoryCommand(
-						(ContentCategory) contentElement, moveUpItems,
-						allSteps, feature,
-						ModelStructure.DEFAULT.customCategoryPath, 1);
-
-				actionManager.execute(cmd);
-				commands.add(cmd);
-
-				refreshViewers();
-
-				enableButtons();
-			}
-		});
-
-		ctrl_down.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-						.getSelection();
-				ArrayList moveDownItems = new ArrayList();
-				moveDownItems.addAll(selection.toList());
-				EStructuralFeature feature = UmaPackage.eINSTANCE
-						.getCustomCategory_CategorizedElements();
-				MoveInCategoryCommand cmd = new MoveInCategoryCommand(
-						(ContentCategory) contentElement, moveDownItems,
-						allSteps, feature,
-						ModelStructure.DEFAULT.customCategoryPath, 0);
-				actionManager.execute(cmd);
-				commands.add(cmd);
-
-				refreshViewers();
-
-				enableButtons();
-			}
-		});
-
-		viewer_sort
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						IStructuredSelection selection = (IStructuredSelection) viewer_sort
-								.getSelection();
-						String sortType = (String) selection.getFirstElement();
-						MethodElementProperty prop = CategorySortHelper
-								.getCategorySortProperty(contentElement);
-
-						if (prop == null) {
-							prop = CategorySortHelper
-									.createNewSortProperty(sortType);
-							actionManager
-									.doAction(
-											IActionManager.ADD,
-											contentElement,
-											UmaPackage.eINSTANCE
-													.getMethodElement_MethodElementProperty(),
-											prop, -1);
-						} else {
-							actionManager.doAction(IActionManager.SET, prop,
-									UmaPackage.eINSTANCE
-											.getMethodElementProperty_Value(),
-									sortType, -1);
-						}
-						refreshViewers();
-						enableButtons();
-					}
-				});
-
-	}
-
-	private void refreshViewers() {
-		stepsTableViewer.refresh();
-	}
-
-	/**
-	 * Load initial data from model
-	 */
-	private void loadData() {
-		stepsTableViewer.setInput(contentElement);
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		allSteps.apply();
-
-		super.okPressed();
-	}
-
-	protected void cancelPressed() {
-		if (!commands.isEmpty()) {
-			for (int i = commands.size() - 1; i > -1; i--) {
-				Object cmd = commands.get(i);
-				if (cmd instanceof MoveInCategoryCommand) {
-					((MoveInCategoryCommand) cmd).undo();
-				}
-			}
-		}
-		super.cancelPressed();
-	}
-
-	public void setFeature(EStructuralFeature feature) {
-		this.feature = feature;
-	}
-
-	private void enableButtons() {
-		if (isShouldEnableUp()) {
-			ctrl_up.setEnabled(true);
-		} else
-			ctrl_up.setEnabled(false);
-
-		if (isShouldEnableDown()) {
-			ctrl_down.setEnabled(true);
-		} else
-			ctrl_down.setEnabled(false);
-	}
-	
-	protected boolean isShouldEnableUp() {
-		IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-			.getSelection();
-		if (selection.size() == 1 &&
-				stepsTableViewer.getTable().getSelectionIndex() > 0 &&
-				!TngUtil.isLocked(contentElement) && 
-				CategorySortHelper.isManualCategorySort(sortElement)) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-	
-	protected boolean isShouldEnableDown() {
-		IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-			.getSelection();
-		if (selection.size() == 1 &&
-				(stepsTableViewer.getTable().getSelectionIndex() < stepsTableViewer
-					.getTable().getItemCount() - 1) &&
-				!TngUtil.isLocked(contentElement) &&
-				CategorySortHelper.isManualCategorySort(sortElement)) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ContributionSelection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ContributionSelection.java
deleted file mode 100644
index 32dfb79..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ContributionSelection.java
+++ /dev/null
@@ -1,321 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.filters.AllFilter;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.CategorizedProcessesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.ContentCategoriesGroupItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The dialog for selecting element to detetmine which element editor to open in
- * case of variability relationship. This will only take effect if user
- * double-clicks from configuration view.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ContributionSelection {
-
-	private HashSet filterElementList = new HashSet();
-
-	private class ContributionFilter extends AllFilter {
-		public boolean accept(Object obj) {
-			Object contentElement = helper.getContentElement();
-			if (contentElement != null) {
-				if (obj.equals(helper.getContentElement()))
-					return false;
-			}
-
-			if (helper.getAlreadySelectedList() != null) {
-				if (obj instanceof ProcessComponent) {
-					if (helper.getAlreadySelectedList().contains(
-							((ProcessComponent) obj).getProcess()))
-						return false;
-				} else {
-					if (helper.getAlreadySelectedList().contains(obj))
-						return false;
-				}
-			}
-
-			if (obj instanceof CustomCategory) {
-				if (TngUtil.isRootCustomCategory((CustomCategory) obj)) {
-					if (((CustomCategory) obj).getCategorizedElements()
-							.isEmpty())
-						return false;
-				}
-			}
-			if (!helper.matchPattern(obj))
-				return false;
-
-			// if(obj instanceof TermDefinition) return false;
-
-			if (obj instanceof MethodPlugin) {
-				if (obj instanceof MethodPlugin) {
-					if (contentElement != null) {
-						if (MethodElementUtil.getAllModels(contentElement)
-								.contains(obj))
-							return true;
-						else
-							return false;
-					} else {
-						return true;
-					}
-				}
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				Collection list = ((ContentCategoriesGroupItemProvider) obj)
-						.getChildren(obj);
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-			if (obj instanceof ProcessesItemProvider) {
-				Collection list = ((ProcessesItemProvider) obj)
-						.getChildren(obj);
-				for (Iterator ior = list.iterator(); ior.hasNext();) {
-					Object object = ior.next();
-					if (((CategorizedProcessesItemProvider) object)
-							.getChildren(object).isEmpty())
-						ior.remove();
-				}
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-
-			if (childAccept(obj))
-				return true;
-			return false;
-		}
-
-		public boolean childAccept(Object obj) {
-			if (obj instanceof CustomCategory) {
-				return anyCategorizedElementAccepted((CustomCategory) obj,
-						filterElementList);
-			}
-			if ((obj instanceof ContentElement)
-					&& filterElementList.contains(obj)) {
-				return true;
-			}
-			if(obj instanceof Process){ 
-				if(filterElementList.contains(obj)){
-					return true;
-				}
-			}
-			if(obj instanceof ProcessPackage) {
-				return checkProcessPkg(obj);
-			}
-			if(obj instanceof Process) {
-				return checkProcessElements(obj);
-			}
-			return false;
-		}
-	};
-	
-	public boolean checkProcessPkg(Object obj){
-		
-		List list = new ArrayList();
-		if(obj instanceof ProcessPackage){
-			if(filterElementList.contains(obj))
-				return true;
-			if(obj instanceof ProcessComponent){
-				if(filterElementList.contains(((ProcessComponent)obj).getProcess()))
-					return true;
-				list = ((ProcessComponent)obj).getProcess().getBreakdownElements();
-			}else{
-				list = ((ProcessPackage)obj).getChildPackages();
-			}
-			
-		}
-		for(Iterator iterator = list.iterator(); iterator.hasNext();)
-		{
-			Object child = iterator.next();
-			if(child instanceof ProcessComponent){
-				if(checkProcessPkg(child)) return true;
-			}
-			if(child instanceof BreakdownElement){
-				if(filterElementList.contains(child)) return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Check any process elements
-	 * @param obj
-	 * @return
-	 * 			Boolean value 
-	 */
-	public boolean checkProcessElements(Object obj){
-		List list = ((Process)obj).getBreakdownElements();
-		for(Iterator iterator = list.iterator(); iterator.hasNext();)
-		{
-			Object child = iterator.next();
-			if(child instanceof BreakdownElement){
-				if(filterElementList.contains(((BreakdownElement)child)))
-						return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks whether any categorized elements to be accepted.
-	 * @param obj
-	 * @param list
-	 * @return
-	 * 		Boolean value which indicates whether any categoriezed elements to be accepted
-	 */
-	public boolean anyCategorizedElementAccepted(CustomCategory obj,
-			HashSet list) {
-		if (list.contains(obj))
-			return true;
-		List elements = obj.getCategorizedElements();
-		for (Iterator iterator = elements.iterator(); iterator.hasNext();) {
-			Object object = iterator.next();
-			if (object instanceof CustomCategory) {
-				if (list.contains(object))
-					return true;
-				anyCategorizedElementAccepted((CustomCategory) object, list);
-			}
-		}
-		return false;
-	}
-
-
-	/**
-	 * Display contribution selection dialog which lists elements and it's
-	 * contributors.
-	 */
-	public ContributionSelection() {
-	}
-
-	/**
-	 * It shows dialog box for all the contributors. User is expected to select
-	 * one.
-	 * 
-	 * @param element
-	 * 			Element for which contributor are shown
-	 * @return
-	 * 			Selected contributor
-	 */
-	public Object getSelectedContributor(VariabilityElement element) {
-		filterElementList = new HashSet();
-		// Get the current configuration.
-		MethodConfiguration config = LibraryService.getInstance()
-				.getCurrentMethodConfiguration();
-
-		// get list of contributors
-		List contributors = ConfigurationHelper
-				.getContributors(element, config);
-		if ((contributors != null) && (!contributors.isEmpty())) {
-			// clear the array
-			List elementList = new ArrayList();
-
-			// add element and it's contributors
-			elementList.add(element);
-			elementList.addAll(contributors);
-			filterElementList.addAll(elementList);
-			for (Iterator itor = elementList.iterator(); itor.hasNext();) {
-				Object e = itor.next();
-				List groupings = null;
-				if (e instanceof Discipline) {
-					groupings = AssociationHelper
-							.getDisciplineGroups((Discipline) e);
-
-				}
-				if (e instanceof RoleSet) {
-					groupings = AssociationHelper
-							.getRoleSetGroups((RoleSet) e);
-				}
-
-				if ((groupings != null) && (!groupings.isEmpty()))
-					filterElementList.addAll(groupings);
-
-			}
-
-			IFilter filter = new ContributionFilter();
-			// ItemsFilterDialog dlg = new ItemsFilterDialog(PlatformUI
-			// .getWorkbench().getActiveWorkbenchWindow().getShell(),
-			// filter, null, FilterConstants.CONFIG_CONTENT_ELEMENT);
-			// dlg.setViewerSelectionSingle(true);
-			String[] str = new String[] { FilterConstants.CONFIG_CONTENT_ELEMENT };
-			ConfigurationAddViewsDialog dlg = new ConfigurationAddViewsDialog(
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-							.getShell());
-			dlg.setFilter(filter);
-			dlg.setTitle(FilterConstants.CONFIG_CONTENT_ELEMENT);
-			dlg.setViewerSelectionSingle(true);
-			dlg.setTypes(str);
-			dlg.setInput(UmaUtil.getMethodLibrary((EObject) element));
-			dlg.setContentProvider(new AdapterFactoryContentProvider(
-					TngAdapterFactory.INSTANCE
-							.getItemsFilter_AdapterFactory(filter)),
-					TngAdapterFactory.INSTANCE
-							.getItemsFilter_ComposedAdapterFactory());
-			dlg.setBlockOnOpen(true);
-
-			String title = MessageFormat
-					.format(
-							AuthoringUIResources.ContributionSelection_filterdialog_title, 
-							new String[] { element.getName() });
-
-			dlg.setTitle(title);
-			dlg.setBlockOnOpen(true);
-			dlg.open();
-
-			List result = dlg.getSelectedItems();
-			if ((result == null) || (result.isEmpty()))
-				return null;
-			else
-				return result.get(0);
-		}
-		return element;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/DialogHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/DialogHelper.java
deleted file mode 100644
index 9a91d40..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/DialogHelper.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.authoring.ui.filters.ProcessActivityFilter;
-import org.eclipse.epf.authoring.ui.filters.ProcessRoleFilter;
-import org.eclipse.epf.authoring.ui.filters.VariabilityProcessRoleFilter;
-import org.eclipse.epf.authoring.ui.filters.VariabilityProcessTaskFilter;
-import org.eclipse.epf.authoring.ui.filters.VariabilityProcessWorkProductFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * Helper class to collect input data from users using dialog boxes
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class DialogHelper {
-
-	public static List selectElementsFor(BreakdownElement e, IFilter filter,
-			MethodConfiguration config, String tabName) {
-		ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(), filter, tabName, null,
-				config);
-		fd.setBlockOnOpen(true);
-		fd.setViewerSelectionSingle(false);
-		fd.setTitle(tabName);
-		fd.open();
-		return fd.getSelectedItems();
-	}
-
-	public static List selectTasksFor(Activity act, MethodConfiguration config) {
-		String tabName = FilterConstants.TASKS;
-		IFilter filter = new VariabilityProcessTaskFilter(config, null,
-				FilterConstants.TASKS, act);
-
-		return selectElementsFor(act, filter, config, tabName);
-	}
-
-	public static List selectElementsFor(Object object,
-			MethodConfiguration config, AdapterFactory adapterFactory) {
-		if (object instanceof Activity) {
-			if (adapterFactory == TngAdapterFactory.INSTANCE
-					.getWBS_ComposedAdapterFactory()) {
-				return selectTasksFor((Activity) object, config);
-			} else if (adapterFactory == TngAdapterFactory.INSTANCE
-					.getOBS_ComposedAdapterFactory()) {
-				String tabName = FilterConstants.ROLES;
-				IFilter filter = new VariabilityProcessRoleFilter(config, null,
-						FilterConstants.ROLES, (Activity) object);
-				return selectElementsFor((BreakdownElement) object, filter,
-						config, tabName);
-			} else if (adapterFactory == TngAdapterFactory.INSTANCE
-					.getPBS_ComposedAdapterFactory()) {
-				String tabName = FilterConstants.WORKPRODUCTS;
-				IFilter filter = new VariabilityProcessWorkProductFilter(
-						config, null, FilterConstants.WORKPRODUCTS,
-						(Activity) object);
-				return selectElementsFor((BreakdownElement) object, filter,
-						config, tabName);
-			}
-		}
-		if (object instanceof TeamProfile) {
-			if (adapterFactory == TngAdapterFactory.INSTANCE
-					.getOBS_ComposedAdapterFactory()) {
-				String tabName = FilterConstants.ROLES;
-				IFilter filter = new ProcessRoleFilter(config, null,
-						FilterConstants.ROLES);
-				return selectElementsFor((BreakdownElement) object, filter,
-						config, tabName);
-			}
-		}
-
-		return Collections.EMPTY_LIST;
-	}
-
-	public static List selectActivitiesFor(Activity act,
-			MethodConfiguration config, int command) {
-		// return null;
-		String tabName = FilterConstants.PROCESSES;
-		IFilter filter = new ProcessActivityFilter(config, null,
-				FilterConstants.PROCESSES, act, command);
-		List selection = selectElementsFor(act, filter, config, tabName);
-		ArrayList activities = new ArrayList();
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Activity) {
-				activities.add(element);
-			} else if (element instanceof ProcessComponent) {
-				Process proc = ((ProcessComponent) element).getProcess();
-				if (proc != null) {
-					activities.add(proc);
-				}
-			}
-		}
-		return activities;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/FilterSorter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/FilterSorter.java
deleted file mode 100644
index 62213d7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/FilterSorter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.text.Collator;
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.viewers.ContentViewer;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-
-
-/**
- * A {@link ItemsFilterDialog} dialog viewer sorter to order the display for certain element and packages.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class FilterSorter extends ViewerSorter {
-
-	public FilterSorter() {
-		super();
-	}
-
-	public int category(Object element) {
-		if (element instanceof ContentPackage)
-			return 0;
-		else
-			return 1;
-	}
-
-	/**
-	 * @param collator
-	 */
-	public FilterSorter(Collator collator) {
-		super(collator);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Viewer viewer, Object e1, Object e2) {
-
-		if (!(e1 instanceof ContentPackage) || !(e2 instanceof ContentPackage)) {
-			int cat1 = category(e1);
-			int cat2 = category(e2);
-
-			if (cat1 != cat2)
-				return cat1 - cat2;
-		}
-
-		if (e1 instanceof MethodPlugin && e2 instanceof MethodPlugin) {
-			return 0;
-		}
-
-		String name1;
-		String name2;
-
-		if (viewer == null || !(viewer instanceof ContentViewer)) {
-			name1 = e1.toString();
-			name2 = e2.toString();
-		} else {
-			IBaseLabelProvider prov = ((ContentViewer) viewer)
-					.getLabelProvider();
-			if (prov instanceof ILabelProvider) {
-				ILabelProvider lprov = (ILabelProvider) prov;
-				name1 = lprov.getText(e1);
-				name2 = lprov.getText(e2);
-			} else {
-				name1 = e1.toString();
-				name2 = e2.toString();
-			}
-		}
-		if (name1 == null)
-			name1 = "";//$NON-NLS-1$
-		if (name2 == null)
-			name2 = "";//$NON-NLS-1$
-		return collator.compare(name1, name2);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerComparator#sort(org.eclipse.jface.viewers.Viewer, java.lang.Object[])
-	 */
-	public void sort(final Viewer viewer, Object[] elements) {
-		Arrays.sort(elements, new Comparator() {
-			public int compare(Object a, Object b) {
-				return FilterSorter.this.compare(viewer, a, b);
-			}
-		});
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/FilterSorterForAll.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/FilterSorterForAll.java
deleted file mode 100644
index 94a2a69..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/FilterSorterForAll.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.text.Collator;
-import java.util.Arrays;
-import java.util.Comparator;
-
-import org.eclipse.epf.authoring.ui.filters.AllFilter;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.viewers.ContentViewer;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-
-/**
- * A Filter sorter for {@link ItemsFilterDialog} using {@link AllFilter}
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class FilterSorterForAll extends ViewerSorter {
-
-	public FilterSorterForAll() {
-		super();
-	}
-
-	/**
-	 * @param collator
-	 */
-	public FilterSorterForAll(Collator collator) {
-		super(collator);
-	}
-
-	public int category(Object element) {
-		if (element instanceof ContentPackage)
-			return 0;
-		else
-			return 1;
-	}
-
-	public int compare(Viewer viewer, Object e1, Object e2) {
-
-		if (!(e1 instanceof ContentPackage) || !(e2 instanceof ContentPackage)) {
-			int cat1 = category(e1);
-			int cat2 = category(e2);
-
-			if (cat1 != cat2)
-				return cat1 - cat2;
-		}
-
-		if (e1 instanceof MethodPlugin && e2 instanceof MethodPlugin) {
-			return 0;
-		}
-		if (!(e1 instanceof ContentElement) || !(e2 instanceof ContentElement)) {
-			return 0;
-		}
-
-		String name1;
-		String name2;
-
-		if (viewer == null || !(viewer instanceof ContentViewer)) {
-			name1 = e1.toString();
-			name2 = e2.toString();
-		} else {
-			IBaseLabelProvider prov = ((ContentViewer) viewer)
-					.getLabelProvider();
-			if (prov instanceof ILabelProvider) {
-				ILabelProvider lprov = (ILabelProvider) prov;
-				name1 = lprov.getText(e1);
-				name2 = lprov.getText(e2);
-			} else {
-				name1 = e1.toString();
-				name2 = e2.toString();
-			}
-		}
-		if (name1 == null)
-			name1 = "";//$NON-NLS-1$
-		if (name2 == null)
-			name2 = "";//$NON-NLS-1$
-		return collator.compare(name1, name2);
-	}
-
-	public void sort(final Viewer viewer, Object[] elements) {
-		Arrays.sort(elements, new Comparator() {
-			public int compare(Object a, Object b) {
-				return FilterSorterForAll.this.compare(viewer, a, b);
-			}
-		});
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/InputType.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/InputType.java
deleted file mode 100644
index 28cccbe..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/InputType.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-/**
- * @author skannoor
- *
- */
-public final class InputType {
-	
-	public static int TEXT = 0;
-	public static int COMBO = 1;
-	public static int LIST = 2;
-	public static int TREE = 3;
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ItemsFilterDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ItemsFilterDialog.java
deleted file mode 100644
index 481565e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ItemsFilterDialog.java
+++ /dev/null
@@ -1,1089 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.filters.DescriptorConfigurationFilter;
-import org.eclipse.epf.authoring.ui.filters.ExProcessAuthoringConfigurator;
-import org.eclipse.epf.authoring.ui.util.AuthoringAccessibleListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
-import org.eclipse.epf.library.edit.itemsfilter.ICategoryFilter;
-import org.eclipse.epf.library.edit.itemsfilter.IProcessFilter;
-import org.eclipse.epf.library.edit.navigator.MethodPluginItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.search.internal.core.text.PatternConstructor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Filter Dialog - allow the user to filter the content element, content
- * categories, custom categories, All types of contentelements based on location of the use of the filter
- * dialog.
- * 
- * @author Lokanath Jagga
- * @author Shashidhar Kannoori
- */
-public class ItemsFilterDialog extends Dialog implements
-		ISelectionChangedListener, IDoubleClickListener {
-
-	protected Button okButton, cancelButton;
-
-	protected Text ctrl_pattern, ctrl_brief_desc;
-
-	private String pattern, filterTypeStr;
-
-	protected Combo filterType;
-
-	private String dialogTitle, tabStr;
-
-	private Object contentElement;
-
-	private ArrayList selectedList = new ArrayList();
-
-	private boolean viewerSelectionSingle = false;
-	private String viewerLabel = null;
-	
-	/*
-	 * Treeviewer for ContentElements to display.
-	 */
-	private TreeViewer treeViewer;
-
-	protected IStructuredContentProvider contentProvider;
-
-	protected ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getText(Object object) {
-			// return super.getText(object);
-			if (object instanceof VariabilityElement) {
-				return TngUtil.getLabel((VariabilityElement) object, "", true); //$NON-NLS-1$
-			} else if (object instanceof MethodPlugin) {
-				MethodPluginItemProvider methodPluginItemProvider = (MethodPluginItemProvider)TngUtil.getAdapter((MethodPlugin)object, MethodPluginItemProvider.class);
-				if (methodPluginItemProvider != null) {
-					return methodPluginItemProvider.getFullName(object);
-				}
-			} 
-			return super.getText(object);
-		}
-		
-		
-		public String getColumnText(Object object, int index) {
-			return getText(object);
-		}
-		
-		public Image getColumnImage(Object object, int index) {
-			return super.getImage(object);
-		}
-	};
-
-	private AdapterFactory adapterFactory;
-	private ComposedAdapterFactory composedAdapterFactory;
-
-	/*
-	 * Dialog Attributes
-	 */
-	// private boolean anyChilds = true;
-	private List alreadySelectedList = new ArrayList();
-
-	private IFilter filter;
-
-	Pattern regexPattern;
-
-	// private MethodConfiguration methodConfiguration;
-	protected FilterHelper helper;
-
-	private String STORE_EXPANDED_LEVEL_ID = ".LEVEL_ID"; //$NON-NLS-1$
-	private String PATTERN_ID = ".Pattern"; //$NON-NLS-1$
-	private String TYPE_ID = ".Type"; //$NON-NLS-1$
-
-	private String DIALOG_NAME;
-
-	private Button expandButton;
-
-	private Button collapseButton;
-
-	private Object input;
-
-	private String[] types;
-
-	/**
-	 * Constructs a new FilterDialog. This constructor will use filter based on
-	 * tabStr, filters out the list of elements based on already existing
-	 * selected element in the selected table. Initializes the ContentProvider
-	 * for the treeviewer.
-	 * 
-	 */
-	public ItemsFilterDialog(Shell parentShell, Object contentElement,
-			String tabStr, List alreadyExists) {
-		super(parentShell);
-		this.contentElement = contentElement;
-		this.tabStr = tabStr;
-		this.filter = null;
-		this.alreadySelectedList = alreadyExists;
-		helper = new FilterHelper(contentElement, tabStr, null, null,
-				this.alreadySelectedList);
-		initProviderForTabs();
-	}
-
-	public ItemsFilterDialog(Shell parentShell, IFilter filter, String tabStr,
-			List alreadyExists, Object input) {
-		this(parentShell, filter, null, tabStr, alreadyExists);
-		this.input = input;
-	}
-
-	/**
-	 * Constructs a new FilterDialog. This constructor will use passed filter.
-	 * tabStr is used for the searchtype only. Initializes the ContentProvider
-	 * for the treeviewer.
-	 * 
-	 */
-	public ItemsFilterDialog(Shell parentShell, IFilter filter,
-			Object contentElement, String tabStr) {
-		super(parentShell);
-		this.filter = filter;
-		this.tabStr = tabStr;
-
-		helper = new FilterHelper(contentElement, tabStr, null, null, null);
-		initProviderForTabs();
-	}
-
-	/**
-	 * Constructs a new FilterDialog. This constructor will use passed filter.
-	 * tabStr is used for the searchtype only. Initializes the ContentProvider
-	 * for the treeviewer.
-	 * 
-	 */
-	public ItemsFilterDialog(Shell parentShell, IFilter filter,
-			Object contentElement, String tabStr, List alreadyExists) {
-		super(parentShell);
-		this.filter = filter;
-		this.tabStr = tabStr;
-		this.alreadySelectedList = alreadyExists;
-		helper = new FilterHelper(contentElement, tabStr, null, null,
-				alreadyExists);
-		this.contentElement = contentElement;
-		initProviderForTabs();
-	}
-
-	/**
-	 * Constructs a new FilterDialog. Only for methodconfiguration. This
-	 * constructor will use passed filter. Initializes the ContentProvider for
-	 * the treeviewer.
-	 * 
-	 */
-	// public ItemsFilterDialog(Shell parentShell, Object contentElement,
-	// MethodConfiguration methodConfiguration, String tabStr) {
-	// super(parentShell);
-	// this.contentElement = contentElement;
-	// this.tabStr = tabStr;
-	// this.filter = null;
-	// this.methodConfiguration = methodConfiguration;
-	// helper = new FilterHelper(contentElement, tabStr, null, null, null);
-	// initProviderForTabs();
-	// }
-	/**
-	 * This constructor is very generic, in order to initialize filter, input
-	 * and contentprovider should be handled explicitly by calling below method.
-	 * setFilter(IFilter) setInput(Object)
-	 * setContentProvider(IStructuredProvider)
-	 * 
-	 */
-	public ItemsFilterDialog(Shell parentShell) {
-		super(parentShell);
-		helper = new FilterHelper(null, null, null, null, null);
-	}
-
-	/**
-	 * This method is called if a button has been pressed.
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.OK_ID)
-			saveValues();
-		super.buttonPressed(buttonId);
-		if(composedAdapterFactory != null){
-			composedAdapterFactory.dispose();
-		}
-
-	}
-
-	/**
-	 * Notifies that the cancel button of this dialog has been pressed.
-	 */
-	protected void cancelPressed() {
-	    if (treeJob != null) {
-	    	treeJob.cancel();
-	    }
-		super.cancelPressed();
-		if(composedAdapterFactory != null){
-			composedAdapterFactory.dispose();
-		}
-	}
-	
-	@Override
-	protected void okPressed() {
-	    if (treeJob != null) {
-	    	treeJob.cancel();
-	    }
-		super.okPressed();
-	}
-
-	/**
-	 * Set title for dialog box eg: Select Dialog For Role, dialogTitle needs to
-	 * "Role"
-	 */
-	public void setTitle(String dialogTitle) {
-		this.dialogTitle = dialogTitle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (dialogTitle == null)
-			dialogTitle = tabStr;
-		shell.setText(AuthoringUIResources.FilterDialog_title + dialogTitle); 
-	}
-
-	/**
-	 * (non-Javadoc) Adds buttons to this dialog's button bar.
-	 * 
-	 * @param parent
-	 *            the button bar composite
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-	}
-
-	/**
-	 * Creates dialog area and controls and viewer.
-	 * 
-	 * @param the
-	 *            parent composite to contain the dialog area
-	 * @return the dialog area control
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		Composite composite = (Composite) super.createDialogArea(parent);
-		composite.setFont(parent.getFont());
-
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-		layout.numColumns = 3;
-
-		Label typeLabel = new Label(composite, SWT.NONE);
-		{
-			typeLabel.setText(AuthoringUIResources.FilterDialog_Type_text); 
-			GridData gD1 = new GridData(GridData.BEGINNING);
-			typeLabel.setLayoutData(gD1);
-
-		}
-		filterType = new Combo(composite, SWT.SINGLE | SWT.READ_ONLY);
-		{
-			GridData gD1 = new GridData(GridData.BEGINNING);
-			gD1.horizontalSpan = 2;
-			gD1.widthHint = 390;
-			filterType.setLayoutData(gD1);
-		}
-
-		if (types == null) {
-			fillFilterTypeCombo();
-		} else {
-			filterType.setItems(types);
-			if (helper != null) {
-				filterTypeStr = filterType.getItem(0);
-				helper.setFilterTypeStr(filterType.getItem(0));
-				if (tabStr == null) {
-					tabStr = filterTypeStr;
-					helper.setTabStr(tabStr);
-				}
-			}
-		}
-		filterType.select(0);
-
-		Label ctrl_patternLabel = new Label(composite, SWT.NONE);
-		{
-			ctrl_patternLabel.setText(AuthoringUIResources.FilterDialog_Pattern_text); 
-			GridData gD = new GridData();
-			gD.horizontalSpan = 3;
-			ctrl_patternLabel.setLayoutData(gD);
-		}
-
-		ctrl_pattern = new Text(composite, SWT.BORDER);
-		{
-			GridData gD1 = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-			gD1.horizontalSpan = 3;
-			ctrl_pattern.setLayoutData(gD1);
-			ctrl_pattern.getAccessible().addAccessibleListener(
-					new AuthoringAccessibleListener(
-							AuthoringUIResources.FilterDialog_Pattern_text +  
-							AuthoringUIResources.FilterDialog_Pattern_description));
-		}
-		Label ctrl_patternLabel1 = new Label(composite, SWT.WRAP);
-		{
-			ctrl_patternLabel1.setText(AuthoringUIResources.FilterDialog_Pattern_description); 
-			GridData gD = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false, 3, 1);
-			gD.widthHint = 550;
-			ctrl_patternLabel1.setLayoutData(gD);
-		}
-		
-		Composite buttonsComposite = new Composite(composite, SWT.NONE);		
-		
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL
-			| GridData.HORIZONTAL_ALIGN_END);
-		gd2.horizontalSpan = 2;
-		buttonsComposite.setLayoutData(gd2);
-		GridLayout buttonsLayout = new GridLayout();
-		buttonsLayout.numColumns = 2;
-		buttonsLayout.marginRight = 0;
-		buttonsComposite.setLayout(buttonsLayout);
-		
-		expandButton = new Button(buttonsComposite, SWT.BUTTON1);
-
-		expandButton.setImage(AuthoringUIPlugin.getDefault().getSharedImage(
-				"expandall.gif")); //$NON-NLS-1$
-		expandButton.setToolTipText(AuthoringUIResources.FilterDialog_ExpandAll); 
-		
-		expandButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-						AuthoringUIResources.FilterDialog_ExpandAll));		
-
-		gd2 = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING
-				| GridData.GRAB_HORIZONTAL);
-
-		expandButton.setLayoutData(gd2);
-
-		collapseButton = new Button(buttonsComposite, SWT.PUSH);
-		collapseButton.setImage(AuthoringUIPlugin.getDefault().getSharedImage(
-				"collapseall.gif")); //$NON-NLS-1$
-
-		collapseButton.setToolTipText(AuthoringUIResources.FilterDialog_CollapseAll); 
-		collapseButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-				AuthoringUIResources.FilterDialog_CollapseAll));
-		
-		gd2 = new GridData(GridData.HORIZONTAL_ALIGN_END);
-
-		collapseButton.setLayoutData(gd2);
-		
-		createLine(composite, 3);
-		createViewerLabel(composite);
-		// create a treeviewer area.
-		createViewer(composite);
-
-		restoreLastSettings();
-
-		new Label(composite, SWT.NONE).setText(AuthoringUIResources.FilterDialog_BriefDescription); 
-		ctrl_brief_desc = new Text(composite, SWT.BORDER | SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL | SWT.READ_ONLY);
-		{
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.horizontalSpan = 3;
-			gd.heightHint = 60;
-			ctrl_brief_desc.setLayoutData(gd);
-		}
-		// Restore the last state
-		createLine(composite, 3);
-
-		// Return results.
-		addListener();
-		return composite;
-	}
-
-	/**
-	 * Create a new viewer in the parent.
-	 * 
-	 * @param parent
-	 *            the parent <code>Composite</code>.
-	 */
-	private void createViewer(Composite parent) {
-		if (viewerSelectionSingle) {
-			treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL
-					| SWT.V_SCROLL | SWT.BORDER);
-		} else {
-			treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
-					| SWT.V_SCROLL | SWT.BORDER);
-		}
-		treeViewer.setLabelProvider(labelProvider);
-		treeViewer.setContentProvider(contentProvider);
-		treeViewer.setUseHashlookup(true);
-
-		// Set the input to treeViewer
-		treeViewer.setInput(getInput());
-
-		treeViewer.addSelectionChangedListener(this);
-		treeViewer.addDoubleClickListener(this);
-		treeViewer.getTree().setFont(parent.getFont());
-
-		if (tabStr.equalsIgnoreCase(FilterConstants.ALL_ELEMENTS)) { 
-			treeViewer.setSorter(new FilterSorterForAll());
-		} else {
-			treeViewer.setSorter(new FilterSorter());
-		}
-
-		GridData spec = new GridData(GridData.FILL_BOTH);
-		{
-			spec.widthHint = 300;
-			spec.heightHint = 300;
-			spec.horizontalSpan = 3;
-			treeViewer.getControl().setLayoutData(spec);
-		}
-	}
-
-	/**
-	 * Returns input if externally set by setInput invoker.
-	 * Else, calculates the input based on the Object set to the dialog.
-	 */
-	private Object getInput(){
-		if(input != null){
-			return input;
-		}else{
-			if (contentElement != null) {
-				if (contentElement instanceof Process) {
-						Process process = (Process)contentElement;
-						if (process.eContainer() instanceof ProcessComponent) {
-							if (!(tabStr.equals(FilterConstants.GUIDANCE)
-									|| tabStr.equals(FilterConstants.ROADMAP) 
-									|| tabStr.equals(FilterConstants.SUPPORTING_MATERIALS))) {
-							return process.eContainer();
-						} else
-							return process;
-						}
-				} 
-				return UmaUtil.getMethodLibrary((EObject) contentElement);
-			} 
-			return LibraryService.getInstance().getCurrentMethodLibrary();
-		}
-	}
-	
-	private void createLine(Composite parent, int ncol) {
-		Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = ncol;
-		line.setLayoutData(gridData);
-	}
-
-	private void createViewerLabel(Composite parent) {
-   		if (viewerLabel != null) {
-   			Label label = new Label(parent, SWT.NONE);
-			label.setText(viewerLabel);
-   		}
-   	}
-	
-	public void setViewerSelectionSingle(boolean single) {
-		viewerSelectionSingle = single;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-	 */
-	public void doubleClick(DoubleClickEvent event) {
-		IStructuredSelection s = (IStructuredSelection) event.getSelection();
-		Object element = s.getFirstElement();
-		element = LibraryUtil.unwrap(element);
-		if (element instanceof ContentElement || element instanceof Process
-				|| element instanceof ProcessComponent
-				|| element instanceof BreakdownElement
-				|| element instanceof ProcessPackage) {
-			selectedList.add(element);
-		} 
-		saveLastSettings();
-		close();
-		if(composedAdapterFactory != null){
-			composedAdapterFactory.dispose();
-		}
-	}
-
-	/**
-	 * Return the dialog store to cache values into
-	 */
-	protected IDialogSettings getDialogSettings() {
-		DialogSettings dialogSettings = (DialogSettings) AuthoringUIPlugin
-				.getDefault().getDialogSettings();
-		DialogSettings section = (DialogSettings) dialogSettings
-				.getSection(DIALOG_NAME + STORE_EXPANDED_LEVEL_ID);
-		if (section == null)
-			section = (DialogSettings) dialogSettings.addNewSection(DIALOG_NAME
-					+ STORE_EXPANDED_LEVEL_ID);
-		return section;
-	}
-
-	/**
-	 * Use the dialog settings to restore widget values to the values that they
-	 * held last time this dialog was used to completion.
-	 */
-	protected void restoreLastSettings() {
-		DIALOG_NAME = tabStr;
-		DialogSettings dialogSettings = (DialogSettings) getDialogSettings();
-		String temp = dialogSettings.get(DIALOG_NAME + PATTERN_ID); 
-		if (temp != null && temp.length() > 0) { 
-			pattern = dialogSettings.get(DIALOG_NAME + PATTERN_ID); 
-			filterTypeStr = dialogSettings.get(DIALOG_NAME + TYPE_ID); 
-			filterType.setText(filterTypeStr);
-			regexPattern = getRegEx(pattern);
-			
-			//Trim "*" from pattern string before display. This action is just for display.
-//			if(pattern != null){
-//				if(pattern.lastIndexOf(FilterConstants.ANY_STRING) 
-//						== pattern.length()-1){
-//					pattern = pattern.substring(0, pattern.length()-1);
-//				}
-//			}
-			ctrl_pattern.setText(pattern);
-			
-			if (helper != null) {
-				helper.setPattern(pattern);
-				helper.setRegexPattern(regexPattern);
-				helper.setFilterTypeStr(filterTypeStr);
-			}
-			initProviderForTabs();
-
-		}
-		List elements = (List) FilterConstants.hashMap.get(DIALOG_NAME
-				+ STORE_EXPANDED_LEVEL_ID);
-		if (elements == null || elements.isEmpty()) {
-			treeViewer.expandAll();
-			return;
-		}
-
-		if (elements != null && !elements.isEmpty()) {
-			try {
-				treeViewer.setExpandedElements(elements.toArray());
-				treeViewer.refresh();
-			} catch (Exception e) {
-				treeViewer.expandAll();
-			}
-		}
-
-	}
-
-	public void traverseTree(TreeItem[] items, List list) {
-		for (int i = 0; i < items.length; i++) {
-			TreeItem[] itemsx = items[i].getItems();
-			if (itemsx.length > 1) {
-				list.add(items[i].getData());
-				traverseTree(itemsx, list);
-			} else {
-				list.add(items[i].getData());
-			}
-		}
-	}
-
-	/**
-	 * Since OK was pressed, write widget values to the dialog store so that
-	 * they will persist into the next invocation of this dialog
-	 */
-	protected void saveValues() {
-		IStructuredSelection selection = (IStructuredSelection) treeViewer
-				.getSelection();
-		if (selection.size() > 0) {
-			Object[] objectArr = selection.toArray();
-			for (int i = 0; i < objectArr.length; i++) {
-				Object obj = LibraryUtil.unwrap(objectArr[i]);
-				if (obj instanceof ContentElement 
-						|| obj instanceof Process 
-						|| obj instanceof ProcessComponent
-						|| obj instanceof BreakdownElement
-						|| obj instanceof ProcessPackage) {
-					selectedList.add(obj);
-				} 
-			}
-		}
-		saveLastSettings();
-	}
-
-	/**
-	 * Saves the last settings of dialog.
-	 */
-	public void saveLastSettings() {
-
-		// eclipse docs forIDialogSettings for understanding.
-		IDialogSettings settings = getDialogSettings();
-		DIALOG_NAME = tabStr;
-		Object[] expandedElements = treeViewer.getExpandedElements();
-		List expandList = new ArrayList();
-		// String[] expandedCategoryIds = new String[expandedElements.length];
-		for (int i = 0; i < expandedElements.length; i++) {
-			Object obj = expandedElements[i];
-			if (obj instanceof NamedElement) {
-				expandList.add(expandedElements[i]);
-			}
-		}
-		settings.put(DIALOG_NAME + PATTERN_ID, pattern);
-		settings.put(DIALOG_NAME + TYPE_ID, filterTypeStr);
-		FilterConstants.hashMap.put(DIALOG_NAME + STORE_EXPANDED_LEVEL_ID,
-				expandList);
-	}
-
-	/**
-	 * Notifies that the selection has changed.
-	 * 
-	 * @param event
-	 *            event object describing the change
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		updateSelection(event);
-		updateButtons();
-	}
-
-	/**
-	 * Update the button enablement state.
-	 */
-	protected void updateButtons() {
-		// okButton.setEnabled(getSelection().length > 0);
-	}
-
-	public Object getParentObject(Object contentElement) {
-		return MethodElementUtil.getMethodModel(contentElement);
-	}
-
-	/**
-	 * Update the selection object.
-	 */
-	protected void updateSelection(SelectionChangedEvent event) {
-		// ArrayList descs = new ArrayList();
-		IStructuredSelection sel = (IStructuredSelection) event.getSelection();
-		Object selected = sel.getFirstElement();
-		if (selected instanceof BreakdownElementWrapperItemProvider ||
-				selected instanceof BreakdownElementItemProvider){
-			Object unwrap =  TngUtil.unwrap(selected);
-			setBriefDescription(unwrap);
-		}else {
-			setBriefDescription(selected);
-		}
-	}
-	/**
-	 * Set the brief description to control
-	 */
-	private void setBriefDescription(Object element) {
-		if (element instanceof MethodElement) {
-			String desc = ((MethodElement) element).getBriefDescription();
-			if (desc != null) {
-				ctrl_brief_desc.setText(desc);
-			}
-		}
-	}
-
-	public void fillFilterTypeCombo() {
-		if (filter instanceof ConfigurationFilter) {
-			String[] str = new String[1];
-			str[0] = (String) tabStr;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		} else if (FilterConstants.categoryStrs.contains(tabStr)) {
-			String[] str = new String[2];
-			str[0] = (String) tabStr;
-			str[1] = FilterConstants.METHO_PLUGINS;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		} else if (FilterConstants.CUSTOM_CATEGORIES.equalsIgnoreCase(tabStr)) {
-			String[] str = new String[2];
-			str[0] = (String) tabStr;
-			str[1] = FilterConstants.METHO_PLUGINS;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		} else if (FilterConstants.breakdownElements.contains(tabStr)) {
-			String[] str = new String[1];
-			str[0] = (String) tabStr;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		} else if (FilterConstants.contentElementStrs.contains(tabStr)) {
-			String[] str = new String[3];
-			str[0] = tabStr;
-			str[1] = FilterConstants.CONTENT_PACKAGES;
-			str[2] = FilterConstants.METHO_PLUGINS;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		} else if (FilterConstants.ALL_ELEMENTS.equals(tabStr)) { // 172956
-			String space = "-"; //$NON-NLS-1$
-			String[] str = new String[26];
-			int i = 0;
-			str[i++] = FilterConstants.ALL_ELEMENTS;
-			str[i++] = FilterConstants.CONTENT_PACKAGES;
-			str[i++] = space + FilterConstants.ROLES;
-			str[i++] = space + FilterConstants.TASKS;
-			str[i++] = space + FilterConstants.WORKPRODUCTS;
-			str[i++] = space + FilterConstants.GUIDANCE;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.CHECKLISTS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.CONCEPTS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.EXAMPLES;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.GUIDELINES;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.REUSABLE_ASSETS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.SUPPORTING_MATERIALS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.TOOL_MENTORS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.ESTIMATE_CONSIDERATIONS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.REPORTS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.TEMPLATES;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.TOOL_MENTORS;
-			str[i++] = FilterConstants.space + FilterConstants.space
-					+ FilterConstants.ESTIMATE_CONSIDERATIONS;
-			str[i++] = FilterConstants.DISCIPLINES;
-			str[i++] = FilterConstants.ROLESETS;
-			str[i++] = FilterConstants.WORKPRODUCTTYPES;
-			str[i++] = FilterConstants.DOMAINS;
-			str[i++] = FilterConstants.TOOLS;
-			str[i++] = FilterConstants.CUSTOM_CATEGORIES;
-			str[i++] = FilterConstants.PROCESSES;
-			str[i++] = FilterConstants.METHO_PLUGINS;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		} else if (FilterConstants.CONFIG_CONTENT_ELEMENT.equals(tabStr)) {
-			String[] str = new String[1];
-			str[0] = (String) tabStr;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		} else {
-			String[] str = new String[1];
-			str[0] = (String) tabStr;
-			filterType.setItems(str);
-			filterTypeStr = str[0];
-		}
-	}
-
-	public long delay = 800;
-	
-	private class UpdateTreeJob extends Job {
-
-		public UpdateTreeJob(String name) {
-			super(name);
-		}
-
-		@Override
-		protected IStatus run(IProgressMonitor monitor) {
-
-			// need to run this in UI thread
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-
-				public void run() {
-					if (treeViewer == null || 
-							treeViewer.getControl() == null ||
-							treeViewer.getControl().isDisposed()) {
-						return;
-					}
-					treeViewer.getTree().clearAll(true);
-					if (ctrl_pattern.getText() != null
-							&& ctrl_pattern.getText().trim().length() > 0) {
-						pattern = ctrl_pattern.getText().trim();
-						// if(pattern.indexOf(FilterConstants.ANY_STRING)> -1
-						// || pattern.indexOf(FilterConstants.ANY_CHARACTER) >
-						// -1){
-						//              
-						// }else{
-						// pattern = pattern+FilterConstants.ANY_STRING;
-						// }
-					} else {
-						pattern = FilterConstants.ANY_STRING;
-						// return;
-					}
-					regexPattern = getRegEx(pattern);
-					if (helper != null) {
-						helper.setPattern(pattern);
-						helper.setRegexPattern(regexPattern);
-						helper.setFilterTypeStr(filterTypeStr);
-						helper.setTabStr(filterTypeStr);
-					}
-					refreshTreeViewer();
-				}
-
-			});
-			return Status.OK_STATUS;
-		}
-
-	}
-	
-	private UpdateTreeJob treeJob = new UpdateTreeJob(AuthoringUIResources.ItemsFilterDialog_UpdateTreeJob_name);
-	
-	public void addListener() {
-		ctrl_pattern.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				
-			  if (treeJob.getState() == Job.NONE) {
-			    // We should schedule the job to run
-			    treeJob.schedule(delay);
-			  } else if (treeJob.getState() == Job.WAITING ||
-					  treeJob.getState() == Job.SLEEPING){
-			    // Cancel the previous job, and reschedule
-			    treeJob.cancel();
-			    treeJob.schedule(delay);
-			  }
-			}
-		});
-
-		filterType.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				// updateFontList();
-				if (filterType.getSelectionIndex() > -1) {
-					filterTypeStr = filterType.getItem(filterType
-							.getSelectionIndex());
-				}
-				filterTypeStr.trim();
-				if (helper != null) {
-					helper.setPattern(pattern);
-					helper.setRegexPattern(regexPattern);
-					helper.setFilterTypeStr(filterTypeStr);
-					helper.setTabStr(filterTypeStr);
-				}
-				// initProviderForTabs();
-				refreshTreeViewer();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent selectionevent) {
-			}
-		});
-		expandButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {				
-				expandOrCollapse(true);
-			}
-		});
-		collapseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				expandOrCollapse(false);
-			}
-		});
-
-	}
-
-	public ArrayList getSelectedItems() {
-		return selectedList;
-	}
-
-	private void initProviderForTabs() {
-
-		if (filter != null) {
-			if (filter instanceof org.eclipse.epf.library.edit.itemsfilter.IFilter) {
-				if(filter instanceof ICategoryFilter){
-					// special handling for contentcategory.
-					// https://bugs.eclipse.org/bugs/show_bug.cgi?id=157452
-					helper.setContentCategoryTabStr(tabStr);
-				}
-				((org.eclipse.epf.library.edit.itemsfilter.IFilter) filter)
-						.setHelper(helper);
-			} else if (filter instanceof DescriptorConfigurationFilter) {
-				((DescriptorConfigurationFilter) filter).setHelper(helper);
-			}else if (filter instanceof ExProcessAuthoringConfigurator) {
-				((ExProcessAuthoringConfigurator) filter).setHelper(helper);
-			}
-		}
-		if (filter instanceof IProcessFilter) {
-			if (tabStr
-					.equalsIgnoreCase(FilterConstants.WORK_PRODUCT_DESCRIPTORS)) {
-				adapterFactory =TngAdapterFactory.INSTANCE.getPBSFilter_AdapterFactory(filter);
-				contentProvider = new AdapterFactoryContentProvider(
-						adapterFactory);
-				composedAdapterFactory = TngAdapterFactory.INSTANCE.getPBSFilter_ComposedAdapterFactory();
-				labelProvider = new AdapterFactoryLabelProvider(
-						TngAdapterFactory.INSTANCE
-								.getPBS_ComposedAdapterFactory()) {
-					public String getColumnText(Object object, int index) {
-						return super.getText(object);
-					}
-					
-					public Image getColumnImage(Object object, int index) {
-						return super.getImage(object);
-					}
-				};
-			} else if (tabStr
-					.equalsIgnoreCase(FilterConstants.ROLE_DESCRIPTORS)) {
-				adapterFactory = TngAdapterFactory.INSTANCE
-				.getOBSFilter_AdapterFactory(filter); 
-				contentProvider = new AdapterFactoryContentProvider(adapterFactory);
-				composedAdapterFactory = TngAdapterFactory.INSTANCE.getOBSFilter_ComposedAdapterFactory();
-				labelProvider = new AdapterFactoryLabelProvider(
-						TngAdapterFactory.INSTANCE
-								.getOBS_ComposedAdapterFactory()){
-					public String getColumnText(Object object, int index) {
-						return super.getText(object);
-					}
-					
-					public Image getColumnImage(Object object, int index) {
-						return super.getImage(object);
-					}
-				};
-			}
-		} else {
-			adapterFactory = TngAdapterFactory.INSTANCE
-						.getItemsFilter_AdapterFactory(filter); 
-			contentProvider = new AdapterFactoryContentProvider(adapterFactory);
-			composedAdapterFactory = TngAdapterFactory.INSTANCE.getItemsFilter_ComposedAdapterFactory();
-		}
-	}
-
-	public void setExistingElements(List list) {
-		this.alreadySelectedList = list;
-		if (helper != null) {
-			helper.setAlreadySelectedList(list);
-		}
-	}
-
-	public FilterHelper getHelper() {
-		return this.helper;
-	}
-
-	public String[] getFilterTypeArray() {
-		return null;
-	}
-
-	/*
-	 * sets the ContentProvider used by TreeViewer.
-	 */
-	public void setContentProvider(IStructuredContentProvider contentProvider,
-			ComposedAdapterFactory composedAdapterFactory) {
-		this.contentProvider = contentProvider;
-		this.composedAdapterFactory = composedAdapterFactory;
-	}
-
-	/*
-	 * Passing String[] array fills the FilterType list in dropdown combo box.
-	 */
-	public void setTypes(String[] str) {
-		this.types = str;
-	}
-
-	/*
-	 * set the Filter.
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-		if (helper != null) {
-			if (this.filter instanceof org.eclipse.epf.library.edit.itemsfilter.IFilter) {
-				((org.eclipse.epf.library.edit.itemsfilter.IFilter) this.filter)
-						.setHelper(helper);
-			} else if (this.filter instanceof DescriptorConfigurationFilter) {
-				((DescriptorConfigurationFilter) this.filter).setHelper(helper);
-			}
-		}
-	}
-
-	public void setInput(Object input) {
-		if (input != null) {
-			this.input = input;
-		}
-	}
-
-	public void setViewerLabel(String viewerLabel) {
-		this.viewerLabel = viewerLabel;
-	}
-	/*
-	 * 
-	 */
-	public void refreshTreeViewer(){
-		try {
-			// To improve performance of filter, filter first and reset visible to
-			// true.This will avoid the flickering in UI at time of filtering
-			// elements in the tree structure
-			
-			treeViewer.getTree().clearAll(true);
-			treeViewer.getTree().setVisible(false);
-			treeViewer.refresh();
-			treeViewer.expandAll();
-			treeViewer.getTree().setVisible(true);
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-	/*
-	 * 
-	 */
-	public void expandOrCollapse(boolean expand){
-		treeViewer.getTree().setVisible(false);
-		if(expand){
-			treeViewer.expandAll();
-		}else{
-			treeViewer.collapseAll();
-		}
-		treeViewer.getTree().setVisible(true);
-	}
-	
-	private Pattern getRegEx(String pattern){
-		try{
-			return PatternConstructor.createPattern(pattern, false, false);
-		}catch(Exception e){
-			return PatternConstructor.createPattern(FilterConstants.ANY_STRING, false, false); 
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MethodAddImageDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MethodAddImageDialog.java
deleted file mode 100644
index 3a5806b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MethodAddImageDialog.java
+++ /dev/null
@@ -1,245 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.io.File;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.richtext.dialogs.AddImageDialog;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-
-/**
- * Prompts the user to specify the image that will be used to create a HTML
- * <img> tag in the Rich Text Editor.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodAddImageDialog extends AddImageDialog {
-
-	private static final int MAX_HEIGHT = 600;
-
-	private static final int MAX_WIDTH = 600;
-
-	private static final int DEFAULT_HEIGHT = 200;
-
-	private static final int DEFAULT_WIDTH = 200;
-
-	private MethodElement methodElement;
-
-	private File fileToCopy;
-
-	private String elementLoc;
-
-	private int height = DEFAULT_HEIGHT;
-
-	private int width = DEFAULT_WIDTH;
-
-	private String altTag = ""; //$NON-NLS-1$
-
-	private Text heightText;
-
-	private Text widthText;
-
-	private Text altTagText;
-
-	private ModifyListener modifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent event) {
-			if (okButton != null) {
-				try {
-					if (event.widget == urlText) {
-						File urlFile = new File(urlText.getText().trim());
-						if (urlFile.isAbsolute()) {
-							fileToCopy = urlFile;
-						} else {
-							fileToCopy = new File(elementLoc, urlText.getText().trim());
-						}
-						if (fileToCopy.isFile() && fileToCopy.canRead()) {
-							// Try to get the image info.
-							setImageInfo(fileToCopy.getAbsolutePath());
-						}
-					}
-					height = Integer.parseInt(heightText.getText().trim());
-					width = Integer.parseInt(widthText.getText().trim());
-					okButton.setEnabled(fileToCopy.isFile() && fileToCopy.canRead() && height > 0
-							&& width > 0);
-				} catch (Exception e) {
-					// if the above fails, let the user click ok if the file is readable
-					okButton.setEnabled(fileToCopy.isFile() && fileToCopy.canRead());
-				}
-			}
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            The parent shell.
-	 * @param methodElement
-	 *            A method element.
-	 */
-	public MethodAddImageDialog(Shell parent, MethodElement methodElement) {
-		super(parent);
-		this.methodElement = methodElement;
-		elementLoc = ResourceHelper.getFolderAbsolutePath(methodElement);
-	}
-
-	/**
-	 * @see org.eclipse.epf.richtext.dialogs.BaseDialog#createDialogArea(Composite
-	 *      parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-
-		((GridLayout) composite.getLayout()).numColumns = 4;
-		((GridData) urlText.getLayoutData()).horizontalSpan = 2;
-
-		urlText.removeModifyListener(urlTextListener);
-		urlText.addModifyListener(modifyListener);
-
-		browseButton.removeSelectionListener(browseSelectionAdapter);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				FileDialog dialog = new FileDialog(Display.getCurrent()
-						.getActiveShell(), SWT.OPEN);
-				dialog.setFilterPath(ResourceHelper.getFolderAbsolutePath(methodElement));
-				String attachFile = dialog.open();
-				if (attachFile != null && attachFile.length() > 0) {
-					try {
-						File file = new File(dialog.getFilterPath(), dialog
-								.getFileName());
-						urlText.setText(file.getAbsolutePath());
-					} catch (Exception e) {
-						logger.logError(e);
-					}
-				}
-			}
-		});
-
-		Label heightLabel = new Label(composite, SWT.NONE);
-		heightLabel.setText(AuthoringUIResources.heightLabel_text); 
-
-		heightText = new Text(composite, SWT.BORDER);
-		heightText.setLayoutData(new GridData());
-		heightText.setText("" + DEFAULT_HEIGHT); //$NON-NLS-1$
-		heightText.addModifyListener(modifyListener);
-
-		Label imageSizeLabel = new Label(composite, SWT.WRAP);
-		{
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.widthHint = 300;
-			gd.horizontalSpan = 2;
-			gd.verticalSpan = 2;
-			gd.horizontalIndent = 10;
-			imageSizeLabel.setLayoutData(gd);
-		}
-		imageSizeLabel.setText(AuthoringUIResources.imageSizeLabel_text); 
-
-		Label widthLabel = new Label(composite, SWT.NONE);
-		widthLabel.setText(AuthoringUIResources.widthLabel_text); 
-
-		widthText = new Text(composite, SWT.BORDER);
-		widthText.setLayoutData(new GridData());
-		widthText.setText("" + DEFAULT_WIDTH); //$NON-NLS-1$
-		widthText.addModifyListener(modifyListener);
-
-		Label altLabel = new Label(composite, SWT.NONE);
-		altLabel.setText(AuthoringUIResources.altTagLabel_text); 
-		altTagText = new Text(composite, SWT.BORDER);
-		{
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.horizontalSpan = 3;
-			altTagText.setLayoutData(gd);
-		}
-		altTagText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent event) {
-				altTag = altTagText.getText().trim();
-			}
-		});
-
-		return composite;
-	}
-
-	/**
-	 * Returns the file to be copied to a resource folder.
-	 */
-	public File getFileToCopy() {
-		return fileToCopy;
-	}
-
-	private void setImageInfo(String imageName) {
-		File imageFile = new File(imageName);
-		if (imageFile.exists()) {
-			try {
-				ImageData imageData = new ImageData(imageName);
-				heightText.setText(String.valueOf(imageData.height));
-				widthText.setText(String.valueOf(imageData.width));
-			} catch (Exception e) {
-				// set default height/width if we can't obtain ImageData
-				heightText.setText(String.valueOf(DEFAULT_HEIGHT));
-				widthText.setText(String.valueOf(DEFAULT_WIDTH));
-			}
-		} else {
-			heightText.setText(String.valueOf(DEFAULT_HEIGHT));
-			widthText.setText(String.valueOf(DEFAULT_WIDTH));
-		}
-	}
-
-	/**
-	 * Returns the image height.
-	 */
-	public int getHeight() {
-		return Math.min(MAX_HEIGHT, Math.max(10, height));
-	}
-
-	/**
-	 * Returns the image width.
-	 */
-	public int getWidth() {
-		return Math.min(MAX_WIDTH, Math.max(10, width));
-	}
-
-	/**
-	 * Returns the image ALT tag.
-	 */
-	public String getAltTag() {
-		return altTag;
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		super.okPressed();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MethodAddLinkDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MethodAddLinkDialog.java
deleted file mode 100644
index 367b25b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MethodAddLinkDialog.java
+++ /dev/null
@@ -1,314 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.io.File;
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.AddLinkFilter;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.dialogs.AddLinkDialog;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Prompts the user to select a link type that will be used to create a HTML <a>
- * tag in the Rich Text Editor.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodAddLinkDialog extends AddLinkDialog {
-
-	private static final int LINK_URL = 0;
-
-	private static final int LINK_FILE = LINK_URL + 1;
-
-	// private static final int LINK_ELEMENT_LINK = LINK_URL + 2;
-
-	private static final int LINK_ELEMENT_LINK_WITH_TYPE = LINK_URL + 3;
-
-	private static final int LINK_ELEMENT_LINK_WITH_USER_TEXT = LINK_URL + 4;
-
-	private static final String[] ELEMENT_TYPE_LABELS = {
-			LibraryUIResources.linkToURL_name,
-			LibraryUIResources.linkToFile_name,
-			LibraryUIResources.elementLink_name,
-			LibraryUIResources.elementLinkWithType_name,
-			LibraryUIResources.elementLinkWithUserText_name };
-
-	public static final String OPEN_LINK_IN_NEW_WINDOW_ATTRIBUTE = "target=\"_blank\""; //$NON-NLS-1$
-
-	private IMethodRichText richText;
-
-	private MethodElement methodElement;
-	
-	private String elementLoc;
-
-	private Combo linkTypeCombo;
-
-	private Button browseButton;
-
-	private Button openLinkCheckbox;
-
-	private int linkType;
-
-	private boolean openLinkInNewWindow = true;
-
-	private File fileToCopy;
-	
-	private ModifyListener modifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent event) {
-			if (okButton != null) {
-				try {
-					if (linkType == LINK_FILE && event.widget == urlText) {
-						File urlFile = new File(urlText.getText().trim());
-						if (urlFile.isAbsolute()) {
-							fileToCopy = urlFile;
-						} else {
-							fileToCopy = new File(elementLoc, urlText.getText().trim());
-						}
-						okButton.setEnabled(fileToCopy.isFile() && fileToCopy.canRead());
-					} else {
-						okButton.setEnabled(urlText.getText().trim().length() > 0);
-					}
-				} catch (Exception e) {
-					okButton.setEnabled(false);
-				}
-			}
-		}
-	};
-
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            The parent shell.
-	 * @param richText
-	 *            A rich text control.
-	 */
-	public MethodAddLinkDialog(Shell parent, IMethodRichText richText) {
-		super(parent, richText.getBasePath());
-		this.richText = richText;
-		this.methodElement = richText.getMethodElement();
-		elementLoc = ResourceHelper.getFolderAbsolutePath(methodElement);
-	}
-
-	/**
-	 * @see org.eclipse.epf.richtext.dialogs.BaseDialog#createDialogArea(Composite
-	 *      parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.numColumns = 3;
-
-		Label linkTypeLabel = new Label(composite, SWT.NONE);
-		linkTypeLabel.setText(AuthoringUIResources.addLinkDialog_linkType);
-		linkTypeLabel.moveAbove(urlLabel);
-		
-		urlText.removeModifyListener(urlTextModifyListener);
-		urlText.addModifyListener(modifyListener);
-
-
-		linkTypeCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
-		GridData comboGridData = new GridData(GridData.FILL_HORIZONTAL);
-		comboGridData.horizontalSpan = 2;
-		linkTypeCombo.setLayoutData(comboGridData);
-		linkTypeCombo.setItems(ELEMENT_TYPE_LABELS);
-		linkTypeCombo.setText(ELEMENT_TYPE_LABELS[0]);
-		linkTypeCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				linkType = linkTypeCombo.getSelectionIndex();
-				browseButton.setEnabled(linkType != LINK_URL);
-				urlDisplayNameLabel.setEnabled(linkType == LINK_URL);
-				urlDisplayNameText.setEnabled(linkType == LINK_URL);
-				if (linkType == LINK_URL) {
-					urlDisplayNameText
-							.setText(richText.getSelected().getText());
-				} else {
-					urlDisplayNameText.setText(""); //$NON-NLS-1$
-				}
-				openLinkCheckbox.setEnabled(linkType == LINK_URL
-						|| linkType == LINK_FILE);
-				urlText.setText(""); //$NON-NLS-1$
-				if (linkType != LINK_FILE) {
-					fileToCopy = null;
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent event) {
-			}
-		});
-		linkTypeCombo.moveAbove(urlLabel);
-
-		browseButton = new Button(composite, SWT.PUSH);
-		browseButton.setLayoutData(new GridData());
-		browseButton.setText(AuthoringUIText.BROWSE_BUTTON_TEXT);
-		browseButton.setEnabled(false);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				if (linkType == LINK_FILE) {
-					FileDialog dialog = new FileDialog(Display.getCurrent()
-							.getActiveShell(), SWT.OPEN);
-					dialog.setFilterPath(basePath);
-					String attachFile = dialog.open();
-					if (attachFile != null && attachFile.length() > 0) {
-						try {
-							File file = new File(dialog.getFilterPath(), dialog
-									.getFileName());
-							urlText.setText(file.getAbsolutePath());
-						} catch (Exception e) {
-							logger.logError(e);
-						}
-					}
-				}
-				// MethodElement link
-				else {
-					IFilter filter = new AddLinkFilter() {
-						protected boolean childAccept(Object obj) {
-							if (obj instanceof MethodPlugin)
-								return true;
-							if (obj instanceof MethodConfiguration)
-								return false;
-							if(obj instanceof Milestone) return false;
-							return true;
-						}
-					};
-					ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-							.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(), filter, methodElement,
-							FilterConstants.ALL_ELEMENTS);
-					fd.setBlockOnOpen(true);
-					fd.setTitle(FilterConstants.ALL_ELEMENTS);
-					fd.open();
-					ArrayList sel = fd.getSelectedItems();
-					if (sel.size() > 0) {
-						MethodElement selectedElement = (MethodElement) sel
-								.get(0);
-						String url = null;
-						String href = ResourceHelper.getUrl(selectedElement,
-								methodElement, "html"); //$NON-NLS-1$
-						if (linkType == LINK_ELEMENT_LINK_WITH_USER_TEXT) {
-							String linkName = ((RichTextEditor) richText)
-									.getSelected().getText();
-							if (linkName.trim().length() == 0)
-								linkName = selectedElement.getName();
-							url = ResourceHelper
-									.getElementLink(selectedElement, linkName,
-											"file://" + href); //$NON-NLS-1$
-						} else {
-							boolean withType = (linkType == LINK_ELEMENT_LINK_WITH_TYPE) ? true
-									: false;
-							url = ResourceHelper
-									.getElementLink(selectedElement, withType,
-											"file://" + href); //$NON-NLS-1$
-						}
-						urlText.setText(url);
-					}
-				}
-			}
-		});
-		browseButton.moveAbove(urlDisplayNameLabel);
-
-		openLinkCheckbox = new Button(composite, SWT.CHECK);
-		GridData checkBoxGridData = new GridData();
-		checkBoxGridData.horizontalSpan = 2;
-		openLinkCheckbox.setLayoutData(checkBoxGridData);
-		openLinkCheckbox.setText(AuthoringUIResources.openLinkCheckbox_text);
-		openLinkCheckbox.setSelection(true);
-		openLinkCheckbox.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				openLinkInNewWindow = openLinkCheckbox.getSelection();
-			}
-		});
-
-		urlDisplayNameText.setText(richText.getSelected().getText());
-
-		return composite;
-	}
-
-	/**
-	 * Returns the file to be copied to a resource folder.
-	 */
-	public File getFileToCopy() {
-		return fileToCopy;
-	}
-
-	/**
-	 * Returns <code>true</code> if the link should be opened in a new browser
-	 * window.
-	 */
-	public boolean getOpenLinkInNewWindow() {
-		return openLinkInNewWindow;
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		String url = urlText.getText();
-		if (url != null && url.length() > 0) {
-			if (linkType == LINK_URL) {
-				String urlDisplayName = urlDisplayNameText.getText();
-				if (urlDisplayName.trim().length() == 0) {
-					urlDisplayName = url;
-				}
-				String fullURL = "<a href=\"" + //$NON-NLS-1$
-						url
-						+ "\"" + //$NON-NLS-1$
-						(openLinkInNewWindow ? " " + OPEN_LINK_IN_NEW_WINDOW_ATTRIBUTE : "") + //$NON-NLS-1$ //$NON-NLS-2$
-						">" + urlDisplayName + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$
-				link.setURL(fullURL);
-			} else {
-				link.setURL(url);
-			}
-		}
-
-		// Set widget text to blank so super.okPressed doesn't overwrite the
-		// above.
-		urlText.removeModifyListener(modifyListener);
-		urlText.setText(""); //$NON-NLS-1$
-		super.okPressed();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MoveDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MoveDialog.java
deleted file mode 100644
index 09ef59d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/MoveDialog.java
+++ /dev/null
@@ -1,434 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.category.StandardCategoriesItemProvider;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand.MoveOperation;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.wizard.ProgressMonitorPart;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Dialog for moving MethodElement within MethodLibrary.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MoveDialog extends Dialog implements ISelectionChangedListener {
-
-	private TreeViewer treeViewer;
-
-	private Collection elements;
-
-	// private IStructuredSelection selection;
-
-	private boolean lockedUI = false;
-
-	// The progress monitor
-	private ProgressMonitorPart progressMonitorPart;
-
-	private EditingDomain editingDomain;
-
-	private Object destination;
-
-	private Cursor waitCursor;
-
-	private boolean moving;
-
-	public MoveDialog(Shell parentShell, Collection elementsToMove,
-			EditingDomain editingDomain) {
-		super(parentShell);
-		this.editingDomain = editingDomain;
-
-		// filter out the predefined elements to prevent them from getting moved
-		//
-		elements = new ArrayList();
-		for (Iterator iter = elementsToMove.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			Object e = TngUtil.unwrap(element);
-			if (e instanceof MethodElement
-					&& TngUtil.isPredefined((MethodElement) e)) {
-				continue;
-			}
-			elements.add(element);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-
-		Label label = new Label(composite, SWT.NONE);
-		label.setText(AuthoringUIResources.MoveDialog_destination_text); 
-		GridData layoutData = new GridData(SWT.BEGINNING);
-		label.setLayoutData(layoutData);
-
-		treeViewer = new TreeViewer(composite, SWT.SINGLE | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER);
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getNavigatorView_ComposedAdapterFactory();
-		treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				adapterFactory));
-		treeViewer.setContentProvider(new AdapterFactoryContentProvider(
-				adapterFactory));
-		treeViewer.addSelectionChangedListener(this);
-		// treeViewer.addDoubleClickListener(this);
-
-		GridData spec = new GridData(GridData.FILL_BOTH);
-		{
-			spec.widthHint = 300;
-			spec.heightHint = 300;
-			treeViewer.getControl().setLayoutData(spec);
-		}
-
-		treeViewer.setInput(LibraryService.getInstance().getCurrentMethodLibrary());
-
-		// Insert a progress monitor
-		GridLayout pmlayout = new GridLayout();
-		pmlayout.numColumns = 1;
-		progressMonitorPart = createProgressMonitorPart(composite, pmlayout);
-		progressMonitorPart
-				.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		progressMonitorPart.setVisible(false);
-
-		waitCursor = parent.getShell().getDisplay().getSystemCursor(
-				SWT.CURSOR_WAIT);
-
-		return composite;
-	}
-
-	protected ProgressMonitorPart createProgressMonitorPart(
-			Composite composite, GridLayout pmlayout) {
-		return new ProgressMonitorPart(composite, pmlayout, SWT.DEFAULT) {
-			String currentTask = null;
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#setBlocked(org.eclipse.core.runtime.IStatus)
-			 */
-			public void setBlocked(IStatus reason) {
-				super.setBlocked(reason);
-				if (!lockedUI)// Do not show blocked if we are locking the UI
-					getBlockedHandler().showBlocked(getShell(), this, reason,
-							currentTask);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#clearBlocked()
-			 */
-			public void clearBlocked() {
-				super.clearBlocked();
-				if (!lockedUI)// Do not vlear if we never set it
-					getBlockedHandler().clearBlocked();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#beginTask(java.lang.String,
-			 *      int)
-			 */
-			public void beginTask(String name, int totalWork) {
-				super.beginTask(name, totalWork);
-				currentTask = name;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#setTaskName(java.lang.String)
-			 */
-			public void setTaskName(String name) {
-				super.setTaskName(name);
-				currentTask = name;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.wizard.ProgressMonitorPart#subTask(java.lang.String)
-			 */
-			public void subTask(String name) {
-				super.subTask(name);
-				// If we haven't got anything yet use this value for more
-				// context
-				if (currentTask == null)
-					currentTask = name;
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(AuthoringUIResources.MoveDialog_move_text); 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		destination = TngUtil.unwrap(((IStructuredSelection) event
-				.getSelection()).getFirstElement());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		if (doMove()) {
-			super.okPressed();
-		}
-	}
-
-	private boolean isValidDestination() {
-		// preventing moving elements to category
-		//
-		if (destination instanceof ContentCategory) {
-			return false;
-		}
-
-		// do not allow moving into Standard Categories
-		if (destination instanceof StandardCategoriesItemProvider) {
-			return false;
-		}
-
-		// check containers for compatible types will not work if we want to move a sub-artifact
-		// to a content package
-		//
-		
-//		// do not allow move if destination is not the same type as every
-//		// elements' eContainer
-//		Object realDest = destination;
-//		if (destination instanceof TransientContentPackageItemProvider) {
-//			realDest = ((TransientContentPackageItemProvider) destination)
-//					.getTarget();
-//		}
-//		if (destination instanceof TransientGroupItemProvider) {
-//			realDest = ((TransientGroupItemProvider) destination).getTarget();
-//		}		
-//		try {
-//			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-//				Object e = iter.next();
-//				if (e instanceof EObject) {
-//					if (!realDest.getClass().isInstance(
-//							((EObject) e).eContainer()))
-//						return false;
-//				}
-//			}
-//		} catch (Exception ex) {
-//			AuthoringUIPlugin.getDefault().getLogger().logError(ex);
-//			return false;
-//		}
-		
-		//Do not allow moving into a destination which is 
-		//locked through extended locker.
-		if(ViewHelper.isExtendedLocked(destination)){
-			return false;
-		}	
-		if (DependencyChecker.newCheck) {
-			if (destination instanceof VariabilityElement) {
-				if (! DependencyChecker.checkCircularForMovingVariabilityElement
-						((VariabilityElement) destination, elements)) {
-					return false;
-				}
-			}			
-		}
-		// Sub Artifact circular check code
-		else if(destination instanceof Artifact){
-			return DependencyChecker.checkCircularForArtifacts((Artifact)destination, 
-					elements);
-		}		
-		
-		Command addCommand = AddCommand.create(editingDomain, destination,
-				null, elements);
-		boolean result;
-		try {
-			result = addCommand.canExecute();
-		}
-		finally {
-			addCommand.dispose();
-		}
-		if (!result) {
-			return false;
-		}
-
-		if (destination instanceof TransientGroupItemProvider) {
-			destination = ((TransientGroupItemProvider) destination)
-					.getTarget();
-		}
-
-		// IStatus status = UserInteractionHelper.checkModify((EObject)
-		// destination, getShell());
-		// if (status.isOK()) {
-		// return true;
-		// }
-		// else {
-		// AuthoringUIPlugin.getDefault().getMsgDialog().display(
-		// AuthoringUIResources.getString("AuthoringUIPlugin.moveDialog.title"),
-		// //$NON-NLS-1$
-		// status);
-		// return false;
-		// }
-
-		return true;
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean doMove() {
-		if (destination == null) {
-			String title = AuthoringUIResources.errorDialog_title; 
-			String problem = AuthoringUIResources.MoveDialog_nomove_destination_problem_msg; 
-			String msg = AuthoringUIResources.MoveDialog_selectdestination_text; 
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, problem, msg); 
-			return false;
-		}
-		if (!isValidDestination()) {
-			String title = AuthoringUIResources.errorDialog_title; 
-			String problem = AuthoringUIResources.MoveDialog_invalid_move_destination_problem_msg; 
-			String msg = AuthoringUIResources.MoveDialog_validdestination_text; 
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, problem, msg); 
-			return false;
-		} else {
-			IStatus status = UserInteractionHelper.checkModify(
-					(EObject) destination, getShell());
-			if (!status.isOK()) {
-				String title = AuthoringUIResources.errorDialog_title; 
-				String msg = AuthoringUIResources.MoveDialog_cannotModifyDestination; 
-				MsgDialog dialog = AuthoringUIPlugin.getDefault()
-						.getMsgDialog();
-				dialog.displayError(title, msg, status); 
-				return false;
-			}
-		}
-
-		moving = true;
-		final Shell shell = getShell();
-		shell.setCursor(waitCursor);
-
-		getButton(IDialogConstants.OK_ID).setEnabled(false);
-		getButton(IDialogConstants.CANCEL_ID).setEnabled(false);
-		treeViewer.getControl().setEnabled(false);
-
-		progressMonitorPart.setVisible(true);
-		progressMonitorPart
-				.beginTask(
-						AuthoringUIResources.MoveDialog_moving_text, IProgressMonitor.UNKNOWN); 
-		MoveOperation moveOp = null;
-		try {
-			// create command
-			//
-			Command command = AddCommand.create(editingDomain, destination,
-					null, elements);
-
-			moveOp = new MoveOperation(command, progressMonitorPart, shell);
-			moveOp.run();
-		} finally {
-			moving = false;
-			progressMonitorPart.done();
-
-			// clear cursor
-			if (shell != null && !shell.isDisposed()) {
-				shell.setCursor(null);
-			}
-		}
-
-		if (moveOp != null) {
-			IStatus status = moveOp.getStatus();
-			if (!status.isOK()) {
-				String title = AuthoringUIResources.dialogs_MoveDialog_errorTitle; 
-				String message = AuthoringUIResources.dialogs_MoveDialog_errorMessage; 
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						title, message, status);
-				if (moveOp.reloadNeeded()) {
-					ViewHelper.reloadCurrentLibrary(shell, null);
-				}
-			}
-		}
-
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#close()
-	 */
-	public boolean close() {
-		if (moving)
-			return false;
-		return super.close();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/OpenConfigDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/OpenConfigDialog.java
deleted file mode 100644
index 7ec3889..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/OpenConfigDialog.java
+++ /dev/null
@@ -1,130 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- * @deprecated
- */
-public class OpenConfigDialog extends Dialog {
-	private static final String NEW_CONFIG_TEXT = AuthoringUIResources.OpenConfigDialognewconfig_text; 
-
-	// Combo combo_configs;
-	String seelctedName;
-
-	Button[] ctrl_configs = null;
-
-	Text ctrl_new_config = null;
-
-	public OpenConfigDialog(Shell parent) {
-		super(parent);
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		final GridLayout gridLayout = new GridLayout();
-		area.setLayout(gridLayout);
-		{
-			Group g = new Group(area, SWT.NONE);
-			{
-				GridData gridData = new GridData(GridData.FILL_BOTH);
-				g.setLayoutData(gridData);
-				GridLayout layout = new GridLayout();
-				g.setLayout(layout);
-			}
-
-			String[] names = LibraryServiceUtil.getMethodConfigurationNames(
-					LibraryService.getInstance().getCurrentMethodLibrary());
-			if (names != null) {
-				ctrl_configs = new Button[names.length + 1];
-				for (int i = 0; i < ctrl_configs.length; i++) {
-					String name = NEW_CONFIG_TEXT;
-					if (i < names.length) {
-						name = names[i];
-					}
-					ctrl_configs[i] = new Button(g, SWT.RADIO);
-					ctrl_configs[i].setText(name);
-					{
-						GridData gridData = new GridData(
-								GridData.FILL_HORIZONTAL);
-						ctrl_configs[i].setLayoutData(gridData);
-					}
-				}
-			}
-
-			ctrl_new_config = new Text(g, SWT.BORDER);
-			{
-				GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-				gridData.horizontalIndent = 10;
-				ctrl_new_config.setLayoutData(gridData);
-			}
-
-			// set image and title
-			super
-					.getShell()
-					.setText(
-							AuthoringUIResources.OpenConfigDialogopenconfig_text); 
-		}
-
-		return area;
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		seelctedName = null;
-		for (int i = 0; i < ctrl_configs.length; i++) {
-			if (ctrl_configs[i].getSelection()) {
-				seelctedName = ctrl_configs[i].getText();
-				break;
-			}
-		}
-
-		if (seelctedName == null) {
-			return;
-		}
-
-		if (seelctedName.equals(NEW_CONFIG_TEXT)) {
-			seelctedName = ctrl_new_config.getText();
-		}
-
-		if (seelctedName == null || seelctedName.equals("")) { //$NON-NLS-1$
-			return;
-		}
-
-		super.okPressed();
-	}
-
-	public String getSelection() {
-		if (super.open() == Dialog.OK) {
-			return seelctedName;
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/SectionsOrderDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/SectionsOrderDialog.java
deleted file mode 100644
index 9f4d604..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/SectionsOrderDialog.java
+++ /dev/null
@@ -1,336 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.ArrayList;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInSectionListCommand;
-import org.eclipse.epf.library.edit.util.SectionList;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Step;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-
-
-/**
- * Dialog to order the {@link Step}s.
- * 
- */
-public class SectionsOrderDialog extends Dialog {
-
-	private Composite baseComposite;
-
-	private Button ctrl_up, ctrl_down;
-
-	private Table ctrl_steps;
-
-	private TableViewer stepsTableViewer;
-
-	private SectionList allSections;
-
-	private IStructuredContentProvider stepsViewerContentProvider;
-
-	private ILabelProvider stepsViewerLabelProvider;
-
-	// private Task contentElement;
-	private ContentElement contentElement;
-
-	private IActionManager actionManager;
-
-	private String title;
-
-	private String message;
-
-	private String label;
-
-	private ArrayList commands = new ArrayList();
-
-	/**
-	 * Creates a <code>AdvancedSearchDialog</code> giveb the parent control.
-	 * 
-	 * @param parent
-	 *            The parent control.
-	 */
-	public SectionsOrderDialog(Shell parent, ContentElement contentElement,
-			IActionManager actionManager, String title, String message,
-			String label) {
-		super(parent);
-		this.contentElement = contentElement;
-		this.actionManager = actionManager;
-		this.title = title;
-		this.message = message;
-		this.label = label;
-		allSections = null;
-	}
-
-	/**
-	 * @see Dialog#createDialogArea(Composite parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		baseComposite = (Composite) super.createDialogArea(parent);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 4;
-		baseComposite.setLayout(gridLayout);
-		baseComposite.setLayoutData(new GridData());
-
-		createLabel(baseComposite, message, 4);
-
-		// Empty line
-		createLabel(baseComposite, " ", 4); //$NON-NLS-1$
-
-		createLabel(baseComposite, " ", 1); //$NON-NLS-1$
-		createLabel(baseComposite, label, 3);
-
-		createLabel(baseComposite, " ", 1); //$NON-NLS-1$
-		ctrl_steps = new Table(baseComposite, SWT.BORDER | SWT.MULTI);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.horizontalSpan = 2;
-			gridData.widthHint = 300;
-			gridData.heightHint = 400;
-			ctrl_steps.setLayoutData(gridData);
-		}
-
-		initProviders();
-
-		stepsTableViewer = new TableViewer(ctrl_steps);
-		stepsTableViewer.setContentProvider(stepsViewerContentProvider);
-		stepsTableViewer.setLabelProvider(stepsViewerLabelProvider);
-
-		Composite orderButtonPane = new Composite(baseComposite, SWT.NULL);
-		{
-			GridData gridData = new GridData(GridData.VERTICAL_ALIGN_CENTER
-					| GridData.HORIZONTAL_ALIGN_CENTER);
-			gridData.horizontalSpan = 1;
-			orderButtonPane.setLayoutData(gridData);
-			orderButtonPane.setLayout(new GridLayout());
-		}
-
-		ctrl_up = createButton(orderButtonPane, AuthoringUIText.UP_BUTTON_TEXT);
-		ctrl_up.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_down = createButton(orderButtonPane,
-				AuthoringUIText.DOWN_BUTTON_TEXT);
-		ctrl_down.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_up.setEnabled(false);
-		ctrl_down.setEnabled(false);
-
-		// Empty line
-		createLabel(baseComposite, " ", 4); //$NON-NLS-1$
-
-		createLine(baseComposite, 4);
-
-		super.getShell().setText(title);
-
-		addListeners();
-		loadData();
-
-		return baseComposite;
-	}
-
-	private void createLine(Composite parent, int ncol) {
-		Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = ncol;
-		line.setLayoutData(gridData);
-	}
-
-	private Label createLabel(Composite parent, String text, int nCol) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(text);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.horizontalSpan = nCol;
-			label.setLayoutData(gridData);
-		}
-
-		return label;
-	}
-
-	private Button createButton(Composite parent, String label) {
-		Button button = new Button(parent, SWT.NONE);
-		button.setText(label);
-		return button;
-	}
-
-	/**
-	 * Creates the dialog buttons.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// Create the OK button.
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		// Create the Cancel button.
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	private void initProviders() {
-		stepsViewerContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				if (allSections == null) {
-					allSections = new SectionList(contentElement,
-							SectionList.STEPS_FOR_ELEMENT_AND_PARENTS);
-				}
-				return allSections.toArray();
-			}
-		};
-
-		stepsViewerLabelProvider = new VariabilityElementLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-
-			public boolean isExternal(Object element) {
-				return !contentElement.getPresentation().getSections()
-						.contains(element);
-			}
-
-		};
-	}
-
-	public void addListeners() {
-		stepsTableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-
-					public void selectionChanged(SelectionChangedEvent event) {
-						IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-								.getSelection();
-						if (selection.size() > 0
-								&& !TngUtil.isLocked(contentElement)) {
-							if (stepsTableViewer.getTable().getSelectionIndex() > 0
-									&& !TngUtil.isLocked(contentElement)
-									&& selection.size() == 1) {
-								ctrl_up.setEnabled(true);
-							} else
-								ctrl_up.setEnabled(false);
-
-							if (stepsTableViewer.getTable().getSelectionIndex() < stepsTableViewer
-									.getTable().getItemCount() - 1
-									&& !TngUtil.isLocked(contentElement)
-									&& selection.size() == 1) {
-								ctrl_down.setEnabled(true);
-							} else
-								ctrl_down.setEnabled(false);
-						}
-					}
-				});
-
-		ctrl_up.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-						.getSelection();
-
-				ArrayList moveUpItems = new ArrayList();
-				moveUpItems.addAll(selection.toList());
-				MoveInSectionListCommand cmd = new MoveInSectionListCommand(
-						contentElement, moveUpItems, allSections, 1);
-				actionManager.execute(cmd);
-				commands.add(cmd);
-
-				stepsTableViewer.refresh();
-
-				if (stepsTableViewer.getTable().getSelectionIndex() > 0
-						&& !TngUtil.isLocked(contentElement)) {
-					ctrl_up.setEnabled(true);
-				} else
-					ctrl_up.setEnabled(false);
-				if (stepsTableViewer.getTable().getSelectionIndex() < stepsTableViewer
-						.getTable().getItemCount() - 1
-						&& !TngUtil.isLocked(contentElement)) {
-					ctrl_down.setEnabled(true);
-				} else
-					ctrl_down.setEnabled(false);
-			}
-		});
-
-		ctrl_down.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-						.getSelection();
-				ArrayList moveDownItems = new ArrayList();
-				moveDownItems.addAll(selection.toList());
-				MoveInSectionListCommand cmd = new MoveInSectionListCommand(
-						contentElement, moveDownItems, allSections, 0);
-				actionManager.execute(cmd);
-				commands.add(cmd);
-
-				stepsTableViewer.refresh();
-
-				if (stepsTableViewer.getTable().getSelectionIndex() > 0
-						&& !TngUtil.isLocked(contentElement)) {
-					ctrl_up.setEnabled(true);
-				} else
-					ctrl_up.setEnabled(false);
-				if (stepsTableViewer.getTable().getSelectionIndex() < stepsTableViewer
-						.getTable().getItemCount() - 1
-						&& !TngUtil.isLocked(contentElement)) {
-					ctrl_down.setEnabled(true);
-				} else
-					ctrl_down.setEnabled(false);
-			}
-		});
-	}
-
-	/**
-	 * Load initial data from model
-	 */
-	private void loadData() {
-		stepsTableViewer.setInput(contentElement);
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		allSections.apply();
-		super.okPressed();
-	}
-
-	protected void cancelPressed() {
-		if (!commands.isEmpty()) {
-			for (int i = commands.size() - 1; i > -1; i--) {
-				Object cmd = commands.get(i);
-				if (cmd instanceof MoveInSectionListCommand) {
-					((MoveInSectionListCommand) cmd).undo();
-				}
-			}
-		}
-		super.cancelPressed();
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/SwitchConfigDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/SwitchConfigDialog.java
deleted file mode 100644
index 9dda8a4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/SwitchConfigDialog.java
+++ /dev/null
@@ -1,151 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor;
-import org.eclipse.epf.authoring.ui.editors.BreakdownElementEditorInput;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * Prompts the user to switch the current Configuration to a recommended
- * Configuration.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class SwitchConfigDialog {
-
-	private Shell shell;
-	
-	private IEditorPart part;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param shell
-	 *            The parent shell.
-	 * @param recommendedConfig
-	 *            The recommended configuration.
-	 */
-	public SwitchConfigDialog(Shell shell, IEditorPart part) {
-		this.shell = shell;
-		this.part = part;
-	}
-
-	/**
-	 * Displays the dialog iff the given recommendedConfig is different than the
-	 * currently selected config
-	 * 
-	 * returns IDialogConstants.OK_ID if dialog wasn't shown, or if config was
-	 * switched returns IDialogConstants.CANCEL_ID if dialog was shown and user
-	 * did not click Yes
-	 */
-	public void execute() {
-		Display display = shell != null ? shell.getDisplay() : null;
-		if (display == null) {
-			display = MsgBox.getDisplay();
-		}
-		if (display == null) {
-			// could not get display
-			return;
-		}
-		display.asyncExec(new Runnable() {
-			public void run() {
-				Object obj = null;
-				if (part instanceof AbstractDiagramEditor) {
-					if (((AbstractDiagramEditor)part).isDisposed()) {
-						return;
-					}
-					BreakdownElementEditorInput input = (BreakdownElementEditorInput) ((IEditorPart) part)
-							.getEditorInput();
-					if (input.getSuppression().getProcess() != null) {
-						obj = input.getSuppression().getProcess().eContainer();
-					}
-				} else if (part instanceof ProcessEditor) {
-					if (((ProcessEditor)part).isDisposed()) {
-						return;
-					}
-					obj = EditorChooser.getInstance().getMethodEditorInput(part);
-				}
-				if (obj != null && obj instanceof ProcessComponent) {
-					MethodConfiguration recommendedConfig = ((ProcessComponent) obj).getProcess().getDefaultContext();
-					String switchConfigPref = LibraryUIPreferences.getSwitchConfig();
-					if (MessageDialogWithToggle.NEVER.equals(switchConfigPref)) {
-						// Call this to refresh active part if needed.
-						// TODO: Review implementation.
-//						LibraryService.getInstance().setCurrentMethodConfiguration(
-//								LibraryService.getInstance()
-//										.getCurrentMethodConfiguration());
-						return;
-					}
-					if (LibraryService.getInstance().getCurrentMethodConfiguration() != recommendedConfig) {
-						final String configName = recommendedConfig.getName();
-						if (MessageDialogWithToggle.PROMPT.equals(switchConfigPref)) {
-							MessageDialogWithToggle dialog = MessageDialogWithToggle
-							.openYesNoQuestion(shell,
-									LibraryUIResources.switchConfigDialog_title,
-									LibraryUIResources
-									.bind(
-											LibraryUIResources.switchConfigDialog_text,
-											configName),
-									null, false, LibraryUIPlugin.getDefault()
-											.getPreferenceStore(),
-									LibraryUIPreferences.getSwitchConfigPreferenceKey());
-							if (dialog.getReturnCode() == IDialogConstants.YES_ID) {
-								MethodConfiguration config = LibraryServiceUtil
-										.getMethodConfiguration(LibraryService
-												.getInstance().getCurrentMethodLibrary(),
-												configName);
-								LibraryService.getInstance().setCurrentMethodConfiguration(
-										config);
-							} else {
-								// Call this to refresh active part if needed.
-								// TODO: Review implementation.
-								LibraryService.getInstance().setCurrentMethodConfiguration(
-										LibraryService.getInstance()
-												.getCurrentMethodConfiguration());
-							}
-							
-						} else if (MessageDialogWithToggle.ALWAYS.equals(switchConfigPref)) {
-							MethodConfiguration config = LibraryServiceUtil
-									.getMethodConfiguration(LibraryService.getInstance()
-											.getCurrentMethodLibrary(), configName);
-							LibraryService.getInstance().setCurrentMethodConfiguration(
-									config);
-						}
-					}
-				}
-			}
-		});
-	}
-	
-	public static void run(Shell shell, IEditorPart part) {
-		SwitchConfigDialog dialog = new SwitchConfigDialog(Display
-				.getCurrent().getActiveShell(), (IEditorPart)part);
-		dialog.execute();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/UserDefinedDiagramDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/UserDefinedDiagramDialog.java
deleted file mode 100644
index d818ee1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/UserDefinedDiagramDialog.java
+++ /dev/null
@@ -1,490 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.authoring.ui.filters.ProcessGuidanceFilter;
-import org.eclipse.epf.diagram.model.util.DiagramInfo;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.configuration.GuidanceItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-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.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * Dialog to assign user defined diagram to process elements
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UserDefinedDiagramDialog extends Dialog {
-
-	private Button assignADImageButton, assignADDImageButton,
-			assignWPDImageButton;
-
-	private Button clearADImageButton, clearADDImageButton,
-			clearWPDImageButton;
-
-	private Button useADImageButton, useADDImageButton, useWPDImageButton;
-
-	private Text adImageText, addImageText, wpdImageText;
-
-	private IEditorPart editor;
-
-	private Activity activity;
-
-	private Composite area;
-
-	private final String tabName = FilterConstants.GUIDANCE;
-
-	private IFilter filter;
-
-	private SupportingMaterial activityDiagram, activityDetailDiagram,
-			wpdDiagram;
-
-	private static final int buttonWidthHint = 60;
-	
-	private Set existingList;
-	
-	private boolean isWrapped = false;
-
-	/**
-	 * Creates an instance
-	 * @param parent
-	 * @param editor
-	 * @param activity
-	 * @param config
-	 * @param isWrapped
-	 */
-	public UserDefinedDiagramDialog(Shell parent, IEditorPart editor,
-			Activity activity, MethodConfiguration config, boolean isWrapped) {
-		super(parent);
-
-		this.editor = editor;
-		this.isWrapped = isWrapped;
-		
-		this.activity = activity;
-		this.filter = new ProcessGuidanceFilter(config, null, tabName) {
-			public boolean childAccept(Object obj) {
-				if (super.childAccept(obj))
-					return true;
-				if (obj instanceof GuidanceItemProvider) {
-					String name = ((GuidanceItemProvider) obj).getText(obj);
-					if (name
-							.equalsIgnoreCase(FilterConstants.SUPPORTING_MATERIALS)
-							&& 
-							!((GuidanceItemProvider) obj).getChildren(obj)
-									.isEmpty())
-						return true;
-					else
-						return false;
-				}
-				if ((obj instanceof SupportingMaterial))
-					return true;
-				return false;
-			}
-		};
-		
-		existingList = new HashSet();
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		area = (Composite) super.createDialogArea(parent);
-		final GridLayout gridLayout = new GridLayout(4, false);
-		area.setLayout(gridLayout);
-
-		// Use AD Image for publishing
-		Label blankLabel = new Label(area, SWT.NONE);
-		blankLabel.setText(""); //$NON-NLS-1$
-
-		useADImageButton = new Button(area, SWT.CHECK);
-		useADImageButton.setText(AuthoringUIResources.UserDefinedDiagramDialog_useADImage); 
-		GridData buttonGD = new GridData(GridData.BEGINNING);
-		buttonGD.horizontalSpan = 3;
-		useADImageButton.setLayoutData(buttonGD);
-
-		// Assign activity diagram image
-		Label aLabel = new Label(area, SWT.NONE);
-		aLabel.setText(AuthoringUIResources.UserDefinedDiagramDialog_adImage); 
-
-		adImageText = new Text(area, SWT.BORDER | SWT.READ_ONLY);
-		GridData gd = new GridData(GridData.BEGINNING
-				| GridData.FILL_HORIZONTAL);
-		gd.widthHint = 300;
-		adImageText.setLayoutData(gd);
-
-		assignADImageButton = new Button(area, SWT.NONE);
-		assignADImageButton
-				.setText(AuthoringUIResources.UserDefinedDiagramDialog_assignButton); 
-		GridData buttonGridData = new GridData(GridData.BEGINNING
-				| GridData.FILL_HORIZONTAL);
-		buttonGridData.widthHint = buttonWidthHint;
-		assignADImageButton.setLayoutData(buttonGridData);
-
-		clearADImageButton = new Button(area, SWT.NONE);
-		clearADImageButton.setText(AuthoringUIResources.clearButton_text); 
-		clearADImageButton.setLayoutData(buttonGridData);
-
-		// Use ADD Image for publishing
-		blankLabel = new Label(area, SWT.NONE);
-		blankLabel.setText(""); //$NON-NLS-1$
-
-		useADDImageButton = new Button(area, SWT.CHECK);
-		useADDImageButton.setText(AuthoringUIResources.UserDefinedDiagramDialog_useADDImage); 
-		buttonGD = new GridData(GridData.BEGINNING);
-		buttonGD.horizontalSpan = 3;
-		useADDImageButton.setLayoutData(buttonGD);
-
-		// Assign activity detail diagram image
-		aLabel = new Label(area, SWT.NONE);
-		aLabel.setText(AuthoringUIResources.UserDefinedDiagramDialog_addImage); 
-
-		addImageText = new Text(area, SWT.BORDER | SWT.READ_ONLY);
-		addImageText.setLayoutData(gd);
-
-		assignADDImageButton = new Button(area, SWT.NONE);
-		assignADDImageButton
-				.setText(AuthoringUIResources.UserDefinedDiagramDialog_assignButton); 
-		assignADDImageButton.setLayoutData(buttonGridData);
-
-		clearADDImageButton = new Button(area, SWT.NONE);
-		clearADDImageButton.setText(AuthoringUIResources.clearButton_text); 
-		clearADDImageButton.setLayoutData(buttonGridData);
-
-		// Use WPD Image for publishing
-		blankLabel = new Label(area, SWT.NONE);
-		blankLabel.setText(""); //$NON-NLS-1$
-
-		useWPDImageButton = new Button(area, SWT.CHECK);
-		useWPDImageButton.setText(AuthoringUIResources.UserDefinedDiagramDialog_useWPDImage); 
-		buttonGD = new GridData(GridData.BEGINNING );
-		buttonGD.horizontalSpan = 3;
-		useWPDImageButton.setLayoutData(buttonGD);
-
-		// Assign work product dependency diagram image
-		aLabel = new Label(area, SWT.NONE);
-		aLabel.setText(AuthoringUIResources.UserDefinedDiagramDialog_wpdImage); 
-
-		wpdImageText = new Text(area, SWT.BORDER | SWT.READ_ONLY);
-		wpdImageText.setLayoutData(gd);
-
-		assignWPDImageButton = new Button(area, SWT.NONE);
-		assignWPDImageButton
-				.setText(AuthoringUIResources.UserDefinedDiagramDialog_assignButton); 
-		assignWPDImageButton.setLayoutData(buttonGridData);
-
-		clearWPDImageButton = new Button(area, SWT.NONE);
-		clearWPDImageButton.setText(AuthoringUIResources.clearButton_text); 
-		clearWPDImageButton.setLayoutData(buttonGridData);
-
-		// loadData
-		loadData();
-		
-		// disableControls
-		if (TngUtil.isLocked(activity) || isWrapped){
-			disableControls();
-		}
-
-		// add listeners
-		addListeners();
-
-		// set image and title
-		super
-				.getShell()
-				.setText(
-						AuthoringUIResources.UserDefinedDiagramDialog_title); 
-
-		return area;
-	}
-
-	/**
-	 * Disable controls
-	 *
-	 */
-	private void disableControls()
-	{
-		useADImageButton.setEnabled(false);
-		useADDImageButton.setEnabled(false);
-		useWPDImageButton.setEnabled(false);
-		
-		assignADImageButton.setEnabled(false);
-		assignADDImageButton.setEnabled(false);
-		assignWPDImageButton.setEnabled(false);
-		
-		clearADImageButton.setEnabled(false);
-		clearADDImageButton.setEnabled(false);
-		clearWPDImageButton.setEnabled(false);
-	}
-	
-	/**
-	 * Loads initial data
-	 *
-	 */
-	private void loadData() {		
-		//	 load existing supporting materials list
-		existingList.addAll(activity.getSupportingMaterials());
-
-		
-		DiagramInfo info = new DiagramInfo(activity);
-		if (info.getActivityDiagram() != null) {
-			adImageText.setText(TngUtil.getLabelWithPath(info
-					.getActivityDiagram()));
-			activityDiagram = info.getActivityDiagram();
-			
-			existingList.add(activityDiagram);
-		}
-		if (info.getActivityDetailDiagram() != null) {
-			addImageText.setText(TngUtil.getLabelWithPath(info
-					.getActivityDetailDiagram()));
-			activityDetailDiagram = info.getActivityDetailDiagram();
-			
-			existingList.add(activityDetailDiagram);
-		}
-		if (info.getWPDDiagram() != null) {
-			wpdImageText
-					.setText(TngUtil.getLabelWithPath(info.getWPDDiagram()));
-			wpdDiagram = info.getWPDDiagram();
-			
-			existingList.add(wpdDiagram);
-		}
-
-		useADImageButton.setSelection(info.canPublishADImage());
-		useADDImageButton.setSelection(info.canPublishADDImage());
-		useWPDImageButton.setSelection(info.canPublishWPDImage());
-	}
-
-	/**
-	 * Add listeners
-	 */
-	private void addListeners() {
-		assignADImageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				try {
-					SupportingMaterial sm = openFilterDialog();
-					if (sm != null) {
-						activityDiagram = sm;
-						adImageText.setText(TngUtil.getLabelWithPath(sm));
-						existingList.add(activityDiagram);
-					}
-				} catch (Exception ex) {
-					ex.printStackTrace();
-				}
-			}
-		});
-
-		assignADDImageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				try {
-					SupportingMaterial sm = openFilterDialog();
-					if (sm != null) {
-						activityDetailDiagram = sm;
-						addImageText.setText(TngUtil.getLabelWithPath(sm));
-						existingList.add(activityDetailDiagram);
-					}
-				} catch (Exception ex) {
-					ex.printStackTrace();
-				}
-			}
-		});
-
-		assignWPDImageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				try {
-					SupportingMaterial sm = openFilterDialog();
-					if (sm != null) {
-						wpdDiagram = sm;
-						wpdImageText.setText(TngUtil.getLabelWithPath(sm));
-						existingList.add(wpdDiagram);
-					}
-				} catch (Exception ex) {
-					ex.printStackTrace();
-				}
-			}
-		});
-
-		clearADImageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				existingList.remove(activityDiagram);
-				adImageText.setText(""); //$NON-NLS-1$
-				activityDiagram = null;
-			}
-		});
-
-		clearADDImageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				existingList.remove(activityDetailDiagram);
-				addImageText.setText(""); //$NON-NLS-1$
-				activityDetailDiagram = null;
-			}
-		});
-
-		clearWPDImageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				existingList.remove(wpdDiagram);
-				wpdImageText.setText(""); //$NON-NLS-1$
-				wpdDiagram = null;
-			}
-		});
-	}
-
-	/**
-	 * Open a filter dialog
-	 */
-	private SupportingMaterial openFilterDialog() {
-	
-		ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(), filter, activity,
-				FilterConstants.SUPPORTING_MATERIALS, Arrays.asList(existingList.toArray()));
-		
-		fd.setTitle(FilterConstants.SUPPORTING_MATERIALS);
-		fd.setViewerSelectionSingle(true);
-		fd.setInput(UmaUtil.getMethodLibrary((EObject) activity));
-		fd.setBlockOnOpen(true);
-		fd.open();
-
-		List list = fd.getSelectedItems();
-		if ((list != null) && (!list.isEmpty())) {
-			Object obj = list.get(0);
-			if (obj instanceof SupportingMaterial) {
-				return (SupportingMaterial) obj;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		if (TngUtil.isLocked(activity) || isWrapped){
-			// then don't need to do anything.. just return
-			super.okPressed();
-		}
-		boolean editorDirty = false;
-		DiagramInfo info = new DiagramInfo(activity);
-
-		// set activity diagram
-		if (activityDiagram != info.getActivityDiagram()) {
-			editorDirty = true;
-		}
-		info.setActivityDiagram(activityDiagram);
-
-		// set activity detail diagram
-		if (!editorDirty) {
-			if (activityDetailDiagram != info.getActivityDetailDiagram())
-				editorDirty = true;
-		}
-		info.setActivityDetailDiagram(activityDetailDiagram);
-
-		// set work product dependency diagram
-		if (!editorDirty) {
-			if (wpdDiagram != info.getWPDDiagram())
-				editorDirty = true;
-		}
-		info.setWPDDiagram(wpdDiagram);
-
-		// set can publish flag for activity diagram
-		boolean oldCanPublishFlag = info.canPublishADImage();
-		boolean newCanPublishFlag = useADImageButton.getSelection();
-		if ((!editorDirty) && (oldCanPublishFlag != newCanPublishFlag))
-			editorDirty = true;
-		info.setPublishADImage(useADImageButton.getSelection());
-
-		// set can publish flag for activity detail diagram
-		oldCanPublishFlag = info.canPublishADDImage();
-		newCanPublishFlag = useADDImageButton.getSelection();
-		if ((!editorDirty) && (oldCanPublishFlag != newCanPublishFlag))
-			editorDirty = true;
-		info.setPublishADDImage(useADDImageButton.getSelection());
-
-		// set can publish flag for work product dependency diagram
-		oldCanPublishFlag = info.canPublishWPDImage();
-		newCanPublishFlag = useWPDImageButton.getSelection();
-		if ((!editorDirty) && (oldCanPublishFlag != newCanPublishFlag))
-			editorDirty = true;
-		info.setPublishWPDImage(useWPDImageButton.getSelection());
-
-		// System.out.println("EDitor dirty=" + editorDirty);
-		if (editorDirty) {
-
-			if (!promptSaveActiveEditor()) {
-				return;
-			}
-		}
-
-		saveActiveEditor();
-		super.okPressed();
-	}
-
-	private boolean promptSaveActiveEditor() {
-		String title = AuthoringUIResources.processFormEditorSaveDialog_title; 
-		String message = AuthoringUIResources.processFormEditorSaveDialog_message2; 
-		// if (editor.isDirty()) {
-		return AuthoringUIPlugin.getDefault().getMsgDialog()
-				.displayConfirmation(title, message);
-		// }
-		// return true;
-	}
-
-	private void saveActiveEditor() {
-		// save the editor
-		BusyIndicator.showWhile(editor.getEditorSite().getShell().getDisplay(),
-				new Runnable() {
-
-					public void run() {
-						((ProcessEditor) editor).resourcesToSave
-								.add(((ProcessComponent) ((MethodElementEditorInput) editor
-										.getEditorInput()).getMethodElement())
-										.getProcess().eResource());
-						// System.out.println("saving..."); //$NON-NLS-1$
-						editor.doSave(new NullProgressMonitor());
-						// System.out.println("saving done"); //$NON-NLS-1$
-					}
-
-				});
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/VariabilitySelection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/VariabilitySelection.java
deleted file mode 100644
index 9fcbe04..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/VariabilitySelection.java
+++ /dev/null
@@ -1,267 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dialogs;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.filters.AllFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.CategorizedProcessesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.ContentCategoriesGroupItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * The dialog for showing and possibly selecting any variability related to the
- * given element.
- * 
- * @author Jeff Hardy
- * @since 1.1
- */
-public class VariabilitySelection {
-
-	private HashSet filterElementList = new HashSet();
-
-	private class VariabilityFilter extends AllFilter {
-		public boolean accept(Object obj) {
-			Object contentElement = helper.getContentElement();
-			if (contentElement != null) {
-				if (obj.equals(helper.getContentElement()))
-					return false;
-			}
-
-			if (helper.getAlreadySelectedList() != null) {
-				if (obj instanceof ProcessComponent) {
-					if (helper.getAlreadySelectedList().contains(
-							((ProcessComponent) obj).getProcess()))
-						return false;
-				} else {
-					if (helper.getAlreadySelectedList().contains(obj))
-						return false;
-				}
-			}
-
-			if (obj instanceof CustomCategory) {
-				if (TngUtil.isRootCustomCategory((CustomCategory) obj)) {
-					if (((CustomCategory) obj).getCategorizedElements()
-							.isEmpty())
-						return false;
-				}
-			}
-			if (!helper.matchPattern(obj))
-				return false;
-
-			if (obj instanceof MethodPlugin) {
-				if (obj instanceof MethodPlugin) {
-					if (contentElement != null) {
-						if (MethodElementUtil.getAllModels(contentElement)
-								.contains(obj))
-							return true;
-						else
-							return false;
-					} else {
-						return true;
-					}
-				}
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				Collection list = ((ContentCategoriesGroupItemProvider) obj)
-						.getChildren(obj);
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-			if (obj instanceof ProcessesItemProvider) {
-				Collection list = ((ProcessesItemProvider) obj)
-						.getChildren(obj);
-				for (Iterator ior = list.iterator(); ior.hasNext();) {
-					Object object = ior.next();
-					if (((CategorizedProcessesItemProvider) object)
-							.getChildren(object).isEmpty())
-						ior.remove();
-				}
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-
-			if (childAccept(obj))
-				return true;
-			return false;
-		}
-
-		public boolean childAccept(Object obj) {
-			if ((obj instanceof ContentElement)
-					&& filterElementList.contains(obj)) {
-				return true;
-			}
-			return false;
-		}
-	};
-
-	/**
-	 * Display variability selection dialog which lists elements and it's
-	 * variabilities.
-	 * 
-	 */
-	public VariabilitySelection() {
-	}
-
-	/**
-	 * It shows dialog box for all the contributors. User is expected to select
-	 * one.
-	 * 
-	 * @param element
-	 * @return
-	 * 		Object selected by user
-	 */
-	public Object getSelectedVariability(VariabilityElement element) {
-		Set elementSet = new HashSet();
-		elementSet.add(element);
-		elementSet = AssociationHelper.getVariabilityElements(elementSet, true, true);
-
-		filterElementList.addAll(elementSet);
-		if (!elementSet.isEmpty()) {
-
-			for (Iterator itor = elementSet.iterator(); itor.hasNext();) {
-				ContentElement contentElement = (ContentElement) itor.next();
-				List groupings = null;
-				if (contentElement instanceof Discipline) {
-					groupings = AssociationHelper
-							.getDisciplineGroups((Discipline) contentElement);
-
-				}
-				if (contentElement instanceof RoleSet) {
-					groupings = AssociationHelper
-							.getRoleSetGroups((RoleSet) contentElement);
-				}
-				
-				if (contentElement instanceof CustomCategory) {
-					groupings = getAncestors((CustomCategory)contentElement);
-				}
-
-				if ((groupings != null) && (!groupings.isEmpty()))
-					filterElementList.addAll(groupings);
-
-			}
-
-			IFilter filter = new VariabilityFilter();
-			String[] str = new String[] { FilterConstants.CONFIG_CONTENT_ELEMENT };
-			ItemsFilterDialog dlg = new ItemsFilterDialog(PlatformUI
-					.getWorkbench().getActiveWorkbenchWindow().getShell());
-			dlg.setFilter(filter);
-			dlg.setTitle(FilterConstants.CONFIG_CONTENT_ELEMENT);
-			dlg.setViewerSelectionSingle(true);
-			dlg.setTypes(str);
-			dlg.setInput(UmaUtil.getMethodLibrary((EObject) element));
-			dlg.setContentProvider(new AdapterFactoryContentProvider(
-					TngAdapterFactory.INSTANCE
-							.getItemsFilter_AdapterFactory(filter)),
-							TngAdapterFactory.INSTANCE.getItemsFilter_ComposedAdapterFactory());
-			dlg.setBlockOnOpen(true);
-
-			String elementName = element.getName();
-			if (element instanceof DescribableElement
-					&& PresentationContext.INSTANCE.isShowPresentationNames()) {
-				if (((DescribableElement) element).getPresentationName().trim()
-						.length() > 0)
-					elementName = ((DescribableElement) element)
-							.getPresentationName();
-			}
-			dlg
-					.setViewerLabel(AuthoringUIResources.bind(AuthoringUIResources.VariabilitySelection_filterdialog_viewerLabel, (new String[] { elementName })));
-
-			String title = MessageFormat
-					.format(
-							AuthoringUIResources.VariabilitySelection_filterdialog_title, 
-							new String[] { elementName });
-
-			dlg.setTitle(title);
-			dlg.setBlockOnOpen(true);
-			dlg.open();
-
-			List result = dlg.getSelectedItems();
-			if ((result == null) || (result.isEmpty()))
-				return null;
-			else
-				return result.get(0);
-		}
-		return element;
-	}
-
-	/**
-	 * Returns the ancestors for the given Custom Category.
-	 * taken from authoring.ui.CustomCategoryAssignPage
-	 */
-	private List getAncestors(CustomCategory methodObject) {
-		List ancestorList = new ArrayList();
-		List objList = new ArrayList();
-		objList.add(methodObject);
-		getAncestors(ancestorList, objList);
-		return ancestorList;
-	}
-
-	private List getAncestors(List ancestorList, List methodObjectList) {
-		if (methodObjectList.isEmpty())
-			return ancestorList;
-
-		List allParentCustCats = new ArrayList();
-
-		for (Iterator iter = methodObjectList.iterator(); iter.hasNext();) {
-			CustomCategory element = (CustomCategory) iter.next();
-			List parentList = AssociationHelper.getCustomCategories(element);
-			allParentCustCats.addAll(parentList);
-		}
-
-		ancestorList.addAll(methodObjectList);
-		List nextCheckList = new ArrayList();
-		for (Iterator iter = allParentCustCats.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!ancestorList.contains(element)) {
-				nextCheckList.add(element);
-			}
-		}
-
-		return getAncestors(ancestorList, nextCheckList);
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/package.html
deleted file mode 100644
index c437119..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides dialogs for the Authoring UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/EditingDomainTableTreeViewerDropAdapter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/EditingDomainTableTreeViewerDropAdapter.java
deleted file mode 100644
index e68d575..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/EditingDomainTableTreeViewerDropAdapter.java
+++ /dev/null
@@ -1,217 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dnd;
-
-import org.eclipse.emf.edit.command.DragAndDropCommand;
-import org.eclipse.emf.edit.command.DragAndDropFeedback;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
-import org.eclipse.jface.viewers.TableTreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Drop adapter for drag and drop
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class EditingDomainTableTreeViewerDropAdapter extends
-		EditingDomainViewerDropAdapter {
-
-	public EditingDomainTableTreeViewerDropAdapter(EditingDomain domain,
-			Viewer viewer) {
-		super(domain, viewer);
-	}
-
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#dragEnter(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragEnter(DropTargetEvent event) {
-		if (event.detail == DND.DROP_NONE) {
-			event.detail = DND.DROP_COPY;
-		}
-		super.dragEnter(event);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOver(DropTargetEvent event) {
-		if (event.detail == DND.DROP_NONE) {
-			event.detail = DND.DROP_COPY;
-		}
-
-		super.dragOver(event);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#dropAccept(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dropAccept(DropTargetEvent event) {
-		if (event.detail == DND.DROP_NONE) {
-			event.detail = DND.DROP_COPY;
-		}
-
-		super.dropAccept(event);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#helper(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	protected void helper(DropTargetEvent event) {
-		Table table = null;
-		TableItem item = null;
-		if (viewer instanceof TableTreeViewer) {
-			table = ((TableTreeViewer) viewer).getTableTree().getTable();
-			item = table.getItem(table.toControl(event.x, event.y));
-			event.item = item;
-		}
-
-		superHelper(event);
-
-		if (item != null && (event.feedback & DND.FEEDBACK_SELECT) != 0) {
-			table.setSelection(new TableItem[] { item });
-		}
-	}
-
-	/**
-	 * Get drop target
-	 * 
-	 * @param item
-	 * @return drop target object
-	 */
-	protected Object getDropTarget(Widget item) {
-		return extractDropTarget(item);
-	}
-
-	/**
-	 * This is called to indicate that the drop action should be invoked.
-	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		// A command was created if the source was available early, and the
-		// information used to create it was cached...
-		if (dragAndDropCommandInformation != null) {
-			// Recreate the command.
-			command = dragAndDropCommandInformation.createCommand();
-		} else {
-			// Otherwise, the source should be available now as event.data, and
-			// we can create the command.
-			source = extractDragSource(event.data);
-			Object target = getDropTarget(event.item);
-			command = DragAndDropCommand.create(domain, target,
-					getLocation(event), event.operations, originalOperation,
-					source);
-		}
-
-		// If the command can execute...
-		if (command.canExecute()) {
-			// Execute it.
-			domain.getCommandStack().execute(command);
-		} else {
-			// Otherwise, let's call the whole thing off.
-			event.detail = DND.DROP_NONE;
-			command.dispose();
-		}
-
-		// Clean up the state.
-		command = null;
-		commandTarget = null;
-		source = null;
-	}
-
-	/**
-	 * This method is called the same way for each of the
-	 * {@link org.eclipse.swt.dnd.DropTargetListener} methods, except for leave
-	 * and drop. If the source is available early, it creates or revalidates the
-	 * {@link DragAndDropCommand}, and updates the event's detail (operation)
-	 * and feedback (drag under effect), appropriately.
-	 */
-	protected void superHelper(DropTargetEvent event) {
-		// If we can't do anything else, we'll provide the default select
-		// feedback and enable auto-scroll and auto-expand effects.
-		event.feedback = DND.FEEDBACK_SELECT | getAutoFeedback();
-
-		// If we don't already have it, try to get the source early. We can't
-		// give feedback if it's not available yet (this is platform-dependent).
-		if (source == null) {
-			source = getDragSource(event);
-			if (source == null)
-				return;
-		}
-
-		// Get the target object from the item widget and the mouse location in
-		// it.
-		Object target = getDropTarget(event.item);
-		float location = getLocation(event);
-
-		// Determine if we can create a valid command at the current location.
-		boolean valid = false;
-
-		// If we don't have a previous cached command...
-		if (command == null) {
-			// We'll need to keep track of the information we use to create the
-			// command, so that we can recreate it in drop.
-			dragAndDropCommandInformation = new DragAndDropCommandInformation(
-					domain, target, location, event.operations,
-					originalOperation, source);
-
-			// Remember the target; create the command and test if it is
-			// executable.
-			commandTarget = target;
-			command = dragAndDropCommandInformation.createCommand();
-			valid = command.canExecute();
-		} else {
-			// Check if the cached command can provide DND
-			// feedback/revalidation.
-			if (target == commandTarget
-					&& command instanceof DragAndDropFeedback) {
-				// If so, revalidate the command.
-				valid = ((DragAndDropFeedback) command).validate(target,
-						location, event.operations, originalOperation, source);
-
-				// Keep track of any changes to the command information.
-				dragAndDropCommandInformation = new DragAndDropCommandInformation(
-						domain, target, location, event.operations,
-						originalOperation, source);
-			} else {
-				// If not, dispose the current command and create a new one.
-				dragAndDropCommandInformation = new DragAndDropCommandInformation(
-						domain, target, location, event.operations,
-						originalOperation, source);
-				commandTarget = target;
-				command.dispose();
-				command = dragAndDropCommandInformation.createCommand();
-				valid = command.canExecute();
-			}
-		}
-
-		// If this command can provide detailed drag and drop feedback...
-		if (command instanceof DragAndDropFeedback) {
-			// Use it for the operation and drag under effect.
-			DragAndDropFeedback dragAndDropFeedback = (DragAndDropFeedback) command;
-			event.detail = dragAndDropFeedback.getOperation();
-			event.feedback = dragAndDropFeedback.getFeedback()
-					| getAutoFeedback();
-		} else if (!valid) {
-			// There is no executable command, so we'd better nix the whole
-			// deal.
-			event.detail = DND.DROP_NONE;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/LibraryViewerDragAdapter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/LibraryViewerDragAdapter.java
deleted file mode 100644
index 2127bc2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/LibraryViewerDragAdapter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.dnd;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.preferences.ApplicationPreferenceConstants;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.HTMLTransfer;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The drag adapter for the Library Viewer.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryViewerDragAdapter extends ViewerDragAdapter {
-
-	/**
-	 * Creates a new <code>EditorDragAdapter</code>.
-	 */
-	public LibraryViewerDragAdapter(Viewer viewer) {
-		super(viewer);
-	}
-
-	/**
-	 * Called when dragging is initiated.
-	 */
-	public void dragStart(DragSourceEvent event) {
-		super.dragStart(event);
-		IStructuredSelection selection = (IStructuredSelection) viewer
-			.getSelection();
-		event.doit = false;
-		for (Iterator iter = selection.toList().iterator();iter.hasNext();) {
-			Object selectedElement = TngUtil.unwrap(iter.next());
-			if (selectedElement instanceof MethodElement &&
-					!(selectedElement instanceof MethodConfiguration) &&
-					!(selectedElement instanceof ContentPackage)) {
-				event.doit = true;
-			}
-		}		
-	}
-
-	/**
-	 * Called to transfer the data.
-	 */
-	public void dragSetData(DragSourceEvent event) {
-		if (HTMLTransfer.getInstance().isSupportedType(event.dataType) ||
-				TextTransfer.getInstance().isSupportedType(event.dataType)) {
-			IStructuredSelection selection = (IStructuredSelection) viewer
-					.getSelection();
-			
-			String links = ""; //$NON-NLS-1$
-			for (Iterator iter = selection.toList().iterator();iter.hasNext();) {
-				Object selectedElement = TngUtil.unwrap(iter.next());
-				if (selectedElement instanceof MethodElement) {
-					String linkText = getHyperlink((MethodElement) selectedElement);					
-					if (Platform.getOS().equals(Platform.WS_WIN32)) {
-						if (links.length() > 0) {
-							links += StrUtil.LINE_FEED;
-						}
-						links += new String(StrUtil.getUTF8Bytes(linkText));						
-					}
-					else {
-						if (links.length() > 0) {
-							links += StrUtil.LINE_FEED;
-						}
-						links += linkText;
-					}
-				}
-				
-			}
-			if (links.length() > 0) {
-				event.data = links;
-			}
-		}
-		super.dragSetData(event);
-	}
-
-	/**
-	 * Returns the hyperlink for the given Method element.
-	 */
-	protected String getHyperlink(MethodElement dragElement) {
-		MethodElement dropElement = null;
-		IWorkbenchPage activePage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		IEditorPart activeEditor = activePage.getActiveEditor();
-		if (activeEditor != null) {
-			IEditorInput editorInput = activeEditor.getEditorInput();
-			if (editorInput instanceof MethodElementEditorInput) {
-				dropElement = ((MethodElementEditorInput) editorInput)
-						.getMethodElement();
-			}
-		}
-		
-		if(dragElement instanceof ProcessComponent){
-			dragElement = ((ProcessComponent)dragElement).getProcess();
-		}
-
-		String href = ResourceHelper.getUrl(dragElement, dropElement, ".html"); //$NON-NLS-1$
-		
-		// obey LibraryViewPrefPage
-		String defaultLinkType = AuthoringUIPlugin.getDefault().getPreferenceStore().getString(ApplicationPreferenceConstants.PREF_LIB_VIEW_DND_DEFAULT_LINKTYPE);
-		String text = ""; //$NON-NLS-1$
-		if (ResourceHelper.ELEMENT_LINK_CLASS_elementLinkWithType.equals(defaultLinkType)) {
-			text = ResourceHelper.getElementLinkText(dragElement, true);
-		} else {
-			text = ResourceHelper.getElementLinkText(dragElement, false);
-		}
-		
-		return ResourceHelper.getElementLink(dragElement, text,
-				"file://" + href, defaultLinkType); //$NON-NLS-1$
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/package.html
deleted file mode 100644
index 3857f58..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dnd/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides drag and drop support for the Authoring UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/AbstractBaseFormEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/AbstractBaseFormEditor.java
deleted file mode 100644
index f5efda9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/AbstractBaseFormEditor.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.ui.editors.IMethodEditor;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-/**
- * The abstract base class for all method editors.
- * 
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class AbstractBaseFormEditor extends FormEditor implements IMethodEditor {
-
-	// Global map used to record which editor modifies the shared resource
-	// first.
-	// This enables the appropriate editors to be flagged as dirty.
-	protected static final Map SHARED_RESOURCE_TO_EDITORS_MAP = new HashMap();
-
-	// If true, debug tracing is enabled.
-	protected static final boolean DEBUG = AuthoringUIPlugin.getDefault()
-			.isDebugging();
-
-	// Collection of resources associated with the model data being edited by
-	// this editor.
-	protected Collection resources;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AbstractBaseFormEditor() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
-	 */
-	protected abstract void addPages();
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#doSave(IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		try {
-			LibraryService.getInstance().saveCurrentMethodLibrary();
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(
-					"Error saving library:", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		return manager != null ? manager.isMethodLibraryModified() : false;
-	}
-
-	/**
-	 * Disposes the operating system resources allocated by this editor.
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-	/**
-	 * Updates the editor's dirty state by adding a "*" to the editor tab and
-	 * enabling the Save button.
-	 */
-	public void updateDirtyStatus() {
-		super.editorDirtyStateChanged();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/AbstractDiagramEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/AbstractDiagramEditor.java
deleted file mode 100644
index 204d863..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/AbstractDiagramEditor.java
+++ /dev/null
@@ -1,2318 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.epf.authoring.gef.commands.ChangeBoundsCommand;
-import org.eclipse.epf.authoring.gef.commands.CreateBendpointCommand;
-import org.eclipse.epf.authoring.gef.commands.CreateLinkCommand;
-import org.eclipse.epf.authoring.gef.commands.CreateNodeCommand;
-import org.eclipse.epf.authoring.gef.commands.MoveBendpointCommand;
-import org.eclipse.epf.authoring.gef.edit.DecisionNodeEditPart;
-import org.eclipse.epf.authoring.gef.edit.DiagramActionService;
-import org.eclipse.epf.authoring.gef.edit.FreeTextNodeEditPart;
-import org.eclipse.epf.authoring.gef.edit.LinkEditPart;
-import org.eclipse.epf.authoring.gef.edit.NodeContainerEditPart;
-import org.eclipse.epf.authoring.gef.edit.NodeEditPart;
-import org.eclipse.epf.authoring.gef.edit.SynchBarNodeEditPart;
-import org.eclipse.epf.authoring.gef.figures.FreeTextFigure;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.actions.DiagramPrintAction;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.ui.actions.ProcessDeleteAction;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.ui.editors.IMethodEditor;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.KeyHandler;
-import org.eclipse.gef.KeyStroke;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackEvent;
-import org.eclipse.gef.commands.CommandStackEventListener;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.CopyTemplateAction;
-import org.eclipse.gef.ui.actions.DeleteAction;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.util.TransferDropTargetListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.FontDialog;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Abstract base class for all diagram editors
- * 
- * @author Phong Nguyen Le
- * @author Jim Thario
- * @author Jinhua Xi
- * @since 1.0
- */
-public abstract class AbstractDiagramEditor extends
-		GraphicalEditorWithFlyoutPalette implements IMethodEditor {
-
-	private static final String REFRESH_FROM_BASE_ACTIVITY = "refresh_from_base_activity"; //$NON-NLS-1$
-	// protected static final String ALIGN_HORZ_AVERAGE =
-	// "align_horizontal_to_average"; //$NON-NLS-1$
-	// protected static final String ALIGN_HORZ_FIRST_SELECTED =
-	// "align_horizontal_to_first_selection"; //$NON-NLS-1$
-	// protected static final String ALIGN_VERT_AVERAGE =
-	// "align_vertical_to_average"; //$NON-NLS-1$
-	// protected static final String ALIGN_VERT_FIRST_SELECTED =
-	// "align_vertical_to_first_selection"; //$NON-NLS-1$
-
-	private static final String FONT_DIALOG = "font_dialog"; //$NON-NLS-1$
-
-	private static final String CREATE_LINK = "create_link"; //$NON-NLS-1$
-
-	private static final String SELECT_LINK = "select_link"; //$NON-NLS-1$
-
-	private static final String CREATE_BEND_POINT = "create_bend_point"; //$NON-NLS-1$	
-
-	protected static final String CREATE_FREE_TEXT = "create_free_text"; //$NON-NLS-1$
-
-	public static final String MOVE = "move"; //$NON-NLS-1$
-
-	protected static final String REFRESH = "refresh"; //$NON-NLS-1$
-
-	protected static final String ALIGN_BEND_POINT = "align_bend_point"; //$NON-NLS-1$
-
-	protected static final String PALETTE_DOCK_LOCATION = "Dock location"; //$NON-NLS-1$
-
-	protected static final String PALETTE_SIZE = "Palette Size"; //$NON-NLS-1$
-
-	protected static final String PALETTE_STATE = "Palette state"; //$NON-NLS-1$
-
-	protected static final int DEFAULT_PALETTE_SIZE = 130;
-
-	protected static final String DELETE_DIAGRAM = "delete_actvity_detail_diagram"; //$NON-NLS-1$
-
-	private KeyHandler sharedKeyHandler;
-
-	private PaletteRoot paletteRoot;
-
-	protected EditPart editPart;
-
-	private CommandStackEventListener cmdStackEventListener;
-
-	protected CreationFactory freeTxtNodeCreationFactory;
-
-	protected DiagramActionService actionService = null;
-
-	private boolean disposed;
-
-	/**
-	 * The parent is the editor from where the user opened this editor.
-	 */
-	protected IEditorPart parentEditor = null;
-
-	/**
-	 * This is used to listen for our parent editor and our own closing. When it
-	 * does, we ask the user if they want to close this diagram as well.
-	 */
-	protected IPartListener partListener = new IPartListener() {
-		IEditorPart me = AbstractDiagramEditor.this;
-
-		public void partOpened(IWorkbenchPart part) {
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-			// check if the editor closed as a result of user action or the
-			// workbench closing
-			// IWorkbench wb = PlatformUI.getWorkbench();
-			if (part == me) {
-				setParentEditor(null);
-				IWorkbenchPage page = getSite().getPage();
-				page.removePartListener(partListener);
-				// remove this diagram if it is new
-				Diagram diagram = (Diagram) ((EditPart) getGraphicalViewer()
-						.getContents()).getModel();
-				// make sure we remove the UMA diagram from the model if it is
-				// new (never saved)
-				if (diagram.isNew()) {
-					if (diagram.getUMADiagram() != null) {
-					EcoreUtil.remove(diagram.getUMADiagram());
-					}
-					if(isResourceChangedByOther()) {
-					doSave(new NullProgressMonitor());
-					}
-				}
-			}
-			// else if (!wb.isClosing()) {
-			// // are we being notified about our parent editor object?
-			// if (getParentEditor() != null) {
-			// if (part == getParentEditor()) {
-			// IWorkbenchPage page = getSite().getPage();
-			// // yes, ask the user if they want to close this
-			// // editor
-			// if (AuthoringUIPlugin
-			// .getDefault()
-			// .getMsgDialog()
-			// .displayPrompt(
-			// DiagramUIResources
-			// .getString("DiagramUI.AbstractDiagramEditor.ParentEditorClose.title"),
-			// //$NON-NLS-1$
-			// DiagramUIResources
-			// .formatString(
-			// "DiagramUI.AbstractDiagramEditor.ParentEditorClose.text",
-			// getParentEditor().getTitle(), me.getTitle()))) { //$NON-NLS-1$
-			// // yes, close this diagram, ask to save changes
-			// page.closeEditor(me, true);
-			// }
-			// // either way, our parent is closed and we can stop
-			// // listening
-			// page.removePartListener(partListener);
-			// }
-			// }
-			// }
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		public void partActivated(IWorkbenchPart part) {
-		}
-	};
-
-	private Font font;
-
-	private Color color;
-
-	private Command refreshFromBaseCommand = new Command(DiagramUIResources.AbstractDiagramEditorrefreshfrombase) { 
-		private ArrayList oldContent = new ArrayList();
-
-		public void execute() {
-			Diagram diagram = (Diagram) editPart.getModel();
-
-			// back up old diagram content
-			//
-			oldContent.clear();
-			oldContent.addAll(diagram.getUMADiagram().getContained());
-
-			GraphicalDataHelper.refreshFromBase(diagram.getUMADiagram());
-			if (editPart.isActive()) {
-				editPart.deactivate();
-			}
-			diagram.removeConsumer(this);
-			createEditPart();
-			getGraphicalViewer().setContents(editPart);
-		}
-
-		public void undo() {
-			Diagram diagram = (Diagram) editPart.getModel();
-			diagram.getUMADiagram().getContained().clear();
-			diagram.getUMADiagram().getContained().addAll(oldContent);
-			if (editPart.isActive()) {
-				editPart.deactivate();
-			}
-			diagram.removeConsumer(this);
-			createEditPart();
-			getGraphicalViewer().setContents(editPart);
-		}
-	};
-
-	protected Map templateNameToCreationFactoryMap;
-	/**
-	 * Records time when the model first has been changed by this editor. This will be used later
-	 * to determine if save is needed to reverse the changes.
-	 */
-	protected long changeTime = -1;
-	protected MethodConfiguration currentConfig;
-
-	class DiagramContextMenuProvider extends ContextMenuProvider {
-
-		private ActionRegistry actionRegistry;
-
-		/**
-		 * Creates a new WorkflowContextMenuProvider assoicated with the given
-		 * viewer and action registry.
-		 * 
-		 * @param viewer
-		 *            the viewer
-		 * @param registry
-		 *            the action registry
-		 */
-		public DiagramContextMenuProvider(EditPartViewer viewer,
-				ActionRegistry registry) {
-			super(viewer);
-			setActionRegistry(registry);
-		}
-
-		/**
-		 * @see ContextMenuProvider#buildContextMenu(org.eclipse.jface.action.IMenuManager)
-		 */
-		public void buildContextMenu(IMenuManager menu) {
-			GEFActionConstants.addStandardActionGroups(menu);
-
-			IAction action;
-			action = getActionRegistry().getAction(ActionFactory.UNDO.getId());
-			menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
-
-			action = getActionRegistry().getAction(ActionFactory.REDO.getId());
-			menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
-
-			boolean canModify = !isReadOnly();
-
-			action = getActionRegistry()
-					.getAction(ActionFactory.DELETE.getId());
-			if (action.isEnabled() && canModify) {
-				if (!TngUtil.isLocked(getMethodElementFromInput())) {
-					menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
-				}
-			}
-
-			action = getActionRegistry().getAction(REFRESH);
-			menu.appendToGroup(GEFActionConstants.GROUP_VIEW, action);
-
-			action = getActionRegistry().getAction(FONT_DIALOG);
-			if (action.isEnabled() && canModify) {
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-			}
-
-			IAction createFreeTextAction = getActionRegistry().getAction(
-					CREATE_FREE_TEXT);
-			if (createFreeTextAction.isEnabled() && canModify) {
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-						createFreeTextAction);
-			}
-
-			// IAction moveAction = getActionRegistry().getAction(MOVE);
-			// if(moveAction.isEnabled()){
-			// menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,moveAction);
-			// }
-			IAction linkAction = getActionRegistry().getAction(CREATE_LINK);
-			if (linkAction.isEnabled() && canModify) {
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, linkAction);
-			}
-			IAction selectlinkAction = getActionRegistry().getAction(
-					SELECT_LINK);
-			if (selectlinkAction.isEnabled()) {
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-						selectlinkAction);
-			}
-			IAction bendpointAction = getActionRegistry().getAction(
-					CREATE_BEND_POINT);
-			if (bendpointAction.isEnabled() && canModify) {
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-						bendpointAction);
-			}
-			IAction alignbendpointaction = getActionRegistry().getAction(
-					ALIGN_BEND_POINT);
-			if (alignbendpointaction.isEnabled() && canModify) {
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-						alignbendpointaction);
-			}
-			
-			//Print Action for diagram through Context Menu.
-			// Enable this code when print required for diagram.
-//			action = getActionRegistry().getAction(ActionFactory.PRINT.getId());
-//			if(action.isEnabled()){
-//				menu.appendToGroup(GEFActionConstants.GROUP_PRINT, action);
-//			}
-			
-			contributeToContextMenu(menu);
-		}
-
-		private ActionRegistry getActionRegistry() {
-			return actionRegistry;
-		}
-
-		/**
-		 * Sets the action registry
-		 * 
-		 * @param registry
-		 *            the action registry
-		 */
-		public void setActionRegistry(ActionRegistry registry) {
-			actionRegistry = registry;
-		}
-
-	}
-
-	/**
-	 * Creates an instance
-	 *
-	 */
-	public AbstractDiagramEditor() {
-		super();
-		setEditDomain(new DefaultEditDomain(this));
-		getEditDomain().setCommandStack(new CommandStack() {
-			public boolean isDirty() {
-				Command cmd = getUndoCommand();
-				if (cmd != null && !cmd.canUndo()) {
-					return false;
-				}
-				return super.isDirty();
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.gef.commands.CommandStack#execute(org.eclipse.gef.commands.Command)
-			 */
-			public void execute(Command command) {
-				if(command == null || !command.canExecute()) {
-					return;
-				}
-				if(changeTime == -1) {
-					changeTime = System.currentTimeMillis();
-				}
-				super.execute(command);
-			}
-		});
-
-		// add CommandStackEventListener
-		//
-		cmdStackEventListener = new CommandStackEventListener() {
-
-			public void stackChanged(CommandStackEvent event) {
-				if (event.getDetail() == CommandStack.POST_EXECUTE) {
-					firePropertyChange(PROP_DIRTY);
-				}
-			}
-
-		};
-		getEditDomain().getCommandStack().addCommandStackEventListener(
-				cmdStackEventListener);
-		// add our part listener if either parent or this closes
-		IWorkbench wb = PlatformUI.getWorkbench();
-		IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
-		IWorkbenchPage page = win.getActivePage();
-		page.addPartListener(partListener);
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose()
-	 */
-	public void dispose() {
-		getCommandStack()
-				.removeCommandStackEventListener(cmdStackEventListener);
-
-		if (isDirty()) {
-			// changes discarded, reverse to saved
-			//
-			reverseToSaved();
-		}
-
-		if (editPart != null) {
-			Diagram diagram = (Diagram) editPart.getModel();
-			if (diagram != null) {
-				diagram.removeConsumer(this);
-			}
-		}
-
-		if (font != null && !font.isDisposed()) {
-			font.dispose();
-		}
-		if (color != null && !color.isDisposed()) {
-			color.dispose();
-		}
-		
-		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.removeListener(libraryListener);
-		}
-		LibraryService.getInstance().removeListener(libSvcListener);
-		
-		super.dispose();
-		disposed = true;
-	}
-	
-	private boolean isResourceChangedByOther() {
-		Resource resource = getMethodElementFromInput().eResource();
-		if(resource != null && resource.getURI().isFile()){
-			File file = new File(resource.getURI().toFileString());
-			return file.lastModified() > changeTime;
-		}
-		return false;
-	}
-
-	/**
-	 * 
-	 */
-	private void reverseToSaved() {
-		// save the undone changes only if the resource has been changed outside this editor
-		//
-		boolean saveNeeded = getCommandStack().isDirty() && isResourceChangedByOther();
-		changeTime = -1;
-		while (getCommandStack().isDirty()) {
-			getCommandStack().undo();
-		}
-		if (saveNeeded) {
-			ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-			try {
-				persister.save(getMethodElementFromInput().eResource());
-				persister.commit();
-			} catch (Exception e) {
-				CommonPlugin.INSTANCE.log(e);
-				try {
-					persister.rollback();
-				} catch (Exception ex) {
-					ViewHelper.reloadCurrentLibrary(getSite().getShell(), null);
-				}
-			}
-		}
-	}
-
-	protected void contributeToContextMenu(IMenuManager menu) {
-		boolean canModify = !isReadOnly();
-		IAction action = getActionRegistry().getAction(
-				REFRESH_FROM_BASE_ACTIVITY);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-		// the align menu is a cascading menu
-		IContributionItem ci = createAlignMenu();
-		if (ci.isEnabled() && canModify) {
-			menu
-					.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-							new Separator());
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, ci);
-			menu
-					.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-							new Separator());
-		}
-		action = getActionRegistry().getAction(DELETE_DIAGRAM);
-		if (action.isEnabled() && canModify) {
-			menu
-					.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-							new Separator());
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-			menu
-					.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-							new Separator());
-		}
-	}
-
-	protected IContributionItem createAlignMenu() {
-		// create a new menu manager for the cascading menu
-		MenuManager alignMenuManager = new MenuManager(DiagramUIResources.AbstractDiagramEditor_alignMenu_text) { 
-
-			public boolean isEnabled() {
-				int total = 0;
-				// enable the menu only if 2 or more nodes or node containers
-				// are selected
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				// need at least two things selected to align
-				if (editParts.size() > 1) {
-					for (int a = 0; a < editParts.size(); a++) {
-						EditPart editPart = (EditPart) editParts.get(a);
-						// we can align nodes and containers
-						if (editPart instanceof NodeEditPart
-								|| editPart instanceof NodeContainerEditPart) {
-							// add up the elements we need, there may be more
-							// elements selected (links, etc.)
-							total++;
-							if (total > 1) {
-								// we only need to know there is more than 1, so
-								// we can stop here
-								break;
-							}
-						}
-					}
-				}
-				return total > 1;
-			}
-		};
-		// add the actions to this menu
-		alignMenuManager.add(getActionRegistry().getAction(
-				DiagramActionService.ALIGN_HORZ_AVERAGE));
-		alignMenuManager.add(getActionRegistry().getAction(
-				DiagramActionService.ALIGN_HORZ_FIRST_SELECTED));
-		alignMenuManager.add(getActionRegistry().getAction(
-				DiagramActionService.ALIGN_VERT_AVERAGE));
-		alignMenuManager.add(getActionRegistry().getAction(
-				DiagramActionService.ALIGN_VERT_FIRST_SELECTED));
-		return alignMenuManager;
-	}
-
-	protected void refreshFromBase() {
-		getCommandStack().execute(refreshFromBaseCommand);
-
-		// Diagram diagram = (Diagram) editPart.getModel();
-		// GraphicalDataHelper.refreshFromBase(diagram.getUMADiagram());
-		// Object act = diagram.getObject();
-		// if(editPart.isActive()) {
-		// editPart.deactivate();
-		// }
-		// diagram.removeConsumer(this);
-		// editPart = createEditPart(act);
-		// getGraphicalViewer().setContents(editPart);
-	}
-
-	protected void createActions() {
-		super.createActions();
-
-		ActionRegistry registry = getActionRegistry();
-		IAction action;
-
-		// replace default delete action with a custom one
-		//
-		action = registry.getAction(ActionFactory.DELETE.getId());
-		if (action != null) {
-			registry.removeAction(action);
-			getSelectionActions().remove(action);
-		}
-		action = new DeleteAction((IWorkbenchPart) this) {
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#isEnabled()
-			 */
-			public boolean isEnabled() {
-				return super.isEnabled();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.gef.ui.actions.DeleteAction#calculateEnabled()
-			 */
-			// protected boolean calculateEnabled() {
-			// for (Iterator iter = getSelectedObjects().iterator();
-			// iter.hasNext();) {
-			// Object editPart = iter.next();
-			// if(editPart instanceof EditPart) {
-			// Object obj = ((EditPart)editPart).getModel();
-			// if(obj instanceof NamedNode) {
-			// Object element = ((NamedNode)obj).getObject();
-			// if(element instanceof BreakdownElement) {
-			// return false;
-			// }
-			// }
-			// }
-			// }
-			// return super.calculateEnabled();
-			// }
-			// TODO: uncomment this code if we are ready to test deleting
-			// BreakdownElement node
-			//
-			// /* (non-Javadoc)
-			// * @see org.eclipse.gef.ui.actions.DeleteAction#run()
-			// */
-			public void run() {
-				List elements = new ArrayList();
-				for (Iterator iter = getSelectedObjects().iterator(); iter
-						.hasNext();) {
-					Object editPart = iter.next();
-					if (editPart instanceof EditPart) {
-						Object obj = ((EditPart) editPart).getModel();
-						if (obj instanceof NamedNode) {
-							Object element = ((NamedNode) obj).getObject();
-							if (element instanceof BreakdownElement) {
-								elements.add(element);
-							}
-						}
-					}
-				}
-				if (!elements.isEmpty()) {
-					ProcessDeleteAction deleteAction = new ProcessDeleteAction() {
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.epf.authoring.ui.actions.MethodElementDeleteAction#createCommand(java.util.Collection)
-						 */
-						public org.eclipse.emf.common.command.Command createCommand(
-								Collection selection) {
-							domain = null;
-							for (Iterator iter = selection.iterator(); iter
-									.hasNext();) {
-								Object element = iter.next();
-								if (element instanceof WorkProductDescriptor) {
-									domain = new AdapterFactoryEditingDomain(
-											TngAdapterFactory.INSTANCE
-													.getPBS_ComposedAdapterFactory(),
-											new BasicCommandStack());
-									break;
-								}
-							}
-							if (domain == null) {
-								domain = new AdapterFactoryEditingDomain(
-										TngAdapterFactory.INSTANCE
-												.getWBS_ComposedAdapterFactory(),
-										new BasicCommandStack());
-							}
-							return super.createCommand(selection);
-						}
-
-					};
-					deleteAction.updateSelection(new StructuredSelection(
-							elements));
-					deleteAction.run();
-					if (deleteAction.isDeletionConfirmed()) {
-						super.run();
-
-						// save the editor
-						// 
-						BusyIndicator.showWhile(getEditorSite().getShell()
-								.getDisplay(), new Runnable() {
-
-							public void run() {
-								doSave(new NullProgressMonitor());
-							}
-						});
-					}
-
-				} else {
-					super.run();
-				}
-			}
-		};
-		registry.registerAction(action);
-		getSelectionActions().add(action.getId());
-
-		action = new CopyTemplateAction(this);
-		registry.registerAction(action);
-
-		// refresh diagram from base action
-		//
-		action = new Action(
-				DiagramUIResources.AbstractDiagramEditor_refreshFromBaseActivity_text) { 
-			public String getId() {
-				return REFRESH_FROM_BASE_ACTIVITY;
-			}
-
-			public void run() {
-				refreshFromBase();
-			}
-
-			public boolean isEnabled() {
-				Activity act = (Activity) getMethodElementFromInput();
-				return act.getVariabilityBasedOnElement() != null;
-			}
-		};
-		registry.registerAction(action);
-
-		// action = new MatchWidthAction(this);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-
-		// action = new MatchHeightAction(this);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-
-		// action = new LogicPasteTemplateAction(this);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-
-		// action = new IncrementDecrementAction(this, true);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new IncrementDecrementAction(this, false);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new DirectEditAction((IWorkbenchPart)this);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new AlignmentAction((IWorkbenchPart)this,
-		// PositionConstants.LEFT);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new AlignmentAction((IWorkbenchPart)this,
-		// PositionConstants.RIGHT);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new AlignmentAction((IWorkbenchPart)this,
-		// PositionConstants.TOP);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new AlignmentAction((IWorkbenchPart)this,
-		// PositionConstants.BOTTOM);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new AlignmentAction((IWorkbenchPart)this,
-		// PositionConstants.CENTER);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-		//
-		// action = new AlignmentAction((IWorkbenchPart)this,
-		// PositionConstants.MIDDLE);
-		// registry.registerAction(action);
-		// getSelectionActions().add(action.getId());
-
-		IAction action1 = new Action(
-				DiagramUIResources.AbstractDiagramEditor_formatTextBoxActivity_text) { 
-			public String getId() {
-				return FONT_DIALOG;
-			}
-
-			public void run() {
-				try {
-					try {
-						EditPart selectedEditPart = (EditPart) getGraphicalViewer()
-								.getSelectedEditParts().get(0);
-						
-						FontDialog fd = new FontDialog(PlatformUI
-								.getWorkbench().getActiveWorkbenchWindow()
-								.getShell());
-						// Restoring old values.
-						if(selectedEditPart != null){
-							restoreFontData(selectedEditPart, fd);
-						}
-						
-						fd.open();
-						if (selectedEditPart instanceof FreeTextNodeEditPart) {
-							if (fd.getFontList() != null) {
-								FontData fData = fd.getFontList()[0];
-								if (fData != null) {
-									if (font != null && !font.isDisposed()) {
-										font.dispose();
-									}
-									// if(color != null && !font.isDisposed()){
-									// color.dispose();
-									// }
-									font = new Font(PlatformUI.getWorkbench()
-											.getDisplay(), fData);
-									
-									if(fd.getRGB() != null)
-									color = new Color(null, fd.getRGB());
-									
-									((FreeTextFigure) ((FreeTextNodeEditPart) selectedEditPart)
-											.getFigure()).setFont(font);
-									
-									if(color != null)
-									((FreeTextFigure) ((FreeTextNodeEditPart) selectedEditPart)
-											.getFigure())
-											.setForegroundColor(color);
-
-									GraphNode graphNode = ((Node) selectedEditPart
-											.getModel()).getGraphNode();
-									List list = graphNode
-											.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-
-									String text = ((FreeTextFigure) ((FreeTextNodeEditPart) selectedEditPart)
-											.getFigure()).getText();
-									Property property = getPropertyByKey(
-											list,
-											GraphicalDataHelper.GRAPH_NODE_FREE_TEXT);
-									if (property != null) {
-										property.setValue(text);
-										list.add(property);
-									}
-									setProperty(
-											list,
-											TemplateConstants.PROPERTY_FONT_NAME,
-											fData.getName());
-									setProperty(
-											list,
-											TemplateConstants.PROPERTY_FONT_STYLE,
-											new Integer(fData.getStyle())
-													.toString());
-									setProperty(
-											list,
-											TemplateConstants.PROPERTY_FONT_HEIGHT,
-											new Integer(fData.getHeight())
-													.toString());
-									if(fd.getRGB() != null){
-									setProperty(
-											list,
-											TemplateConstants.PROPERTY_FONT_RED,
-											new Integer(fd.getRGB().red)
-													.toString());
-									setProperty(
-											list,
-											TemplateConstants.PROPERTY_FONT_BLUE,
-											new Integer(fd.getRGB().blue)
-													.toString());
-									setProperty(
-											list,
-											TemplateConstants.PROPERTY_FONT_GREEN,
-											new Integer(fd.getRGB().green)
-													.toString());
-									}
-									selectedEditPart.refresh();
-								}
-							}
-						}
-
-					} catch (Exception exception) {
-						exception.printStackTrace();
-					}
-				} catch (RuntimeException e) {
-					e.printStackTrace();
-				}
-
-			}
-
-			public boolean isEnabled() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() != 1)
-					return false;
-				EditPart editPart = (EditPart) editParts.get(0);
-				if (editPart.getModel() instanceof TypedNode) {
-					return (((TypedNode) editPart.getModel()).getType() == TypedNode.FREE_TEXT);
-				}
-				return false;
-			}
-
-			public Property getPropertyByKey(List list, String key) {
-				if (!list.isEmpty()) {
-					for (Iterator iror = list.iterator(); iror.hasNext();) {
-						Property property = (Property) iror.next();
-						if (property != null) {
-							if (property.getKey().equals(key)) {
-								return property;
-							} 
-						}
-					}
-				}
-				return null;
-			}
-
-			public void setProperty(List list, String key, String value) {
-
-				Property property = getPropertyByKey(list, key);
-				if (property != null) {
-					property.setValue(value);
-
-				} else {
-					property = UmaFactory.eINSTANCE.createProperty();
-					property.setKey(key);
-					property.setValue(value);
-				}
-				list.add(property);
-			}
-			public void restoreFontData(EditPart selectedEditPart, FontDialog fd){
-				GraphNode graphNode = ((Node) selectedEditPart
-						.getModel()).getGraphNode();
-					List list = graphNode
-						.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-					if(list != null && !list.isEmpty()){
-						Property property = null;
-						String fontname = null, fontStyle = null, fontHeight = null, red = null, blue = null, green = null;
-
-						property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_NAME);
-						if(property != null ){
-							fontname = property.getValue();
-						}else{
-							return;
-						}
-						
-						property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_STYLE);
-						if(property != null ){
-							fontStyle = property.getValue();
-						}
-						property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_HEIGHT);
-						if(property != null){
-							fontHeight = property.getValue();
-						}
-						property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_RED);
-						if(property != null){
-							red = property.getValue();
-						}
-						property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_BLUE);
-						if(property != null){
-							blue = property.getValue();
-						}
-						property = getPropertyByKey(list, TemplateConstants.PROPERTY_FONT_GREEN);
-						if(property != null){
-							green = property.getValue();
-						}
-						
-						FontData fData = new FontData();
-						fData.setName(fontname);
-						fData.setHeight((new Integer(fontHeight)).intValue());
-						fData.setStyle((new Integer(fontStyle)).intValue());
-						
-						//, (new Integer(fontStyle)).intValue(), (new Integer(fontHeight)).intValue());
-						if( red != null && blue != null && green != null){
-							RGB rgb = new RGB(new Integer(red).intValue(),
-									new Integer(green).intValue(),
-									 new Integer(blue).intValue()
-									 );
-							fd.setRGB(rgb);
-//							if(rgb != null){
-//								rgb.red = new Integer(red).intValue();
-//								rgb.blue = new Integer(blue).intValue();
-//								rgb.green = new Integer(green).intValue();
-//							}
-						}
-						fd.setFontList(new FontData[]{fData});
-					}
-			}
-		};
-		getActionRegistry().registerAction(action1);
-
-		// Jinhua Xi
-		// added this to consolidate common actions into a service class
-		actionService = new DiagramActionService(getGraphicalViewer(),
-				getEditDomain(), registry);
-		actionService.registerHorizontalAlignAverageAction();
-		actionService.registerHorizontalAlignFirstSelectedAction();
-		actionService.registerVerticalAlignAverageAction();
-		actionService.registerVerticalAlignFirstSelectedAction();
-
-		// // align horizontally to average y-value of all nodes
-		// IAction hAlignAverageAction = new Action(
-		// DiagramUIResources
-		// .getString("DiagramUI.AbstractDiagramEditor.hAlignAverageAction.text"))
-		// { //$NON-NLS-1$
-		// public void run() {
-		// horizAlignToAverageSelected();
-		// }
-		//
-		// public String getId() {
-		// return ALIGN_HORZ_AVERAGE;
-		// }
-		// };
-		// getActionRegistry().registerAction(hAlignAverageAction);
-		//
-		// // align horizontally to y-value of first selected node
-		// IAction hAlignFirstSelectedAction = new Action(
-		// DiagramUIResources
-		// .getString("DiagramUI.AbstractDiagramEditor.hAlignFirstSelectedAction.text"))
-		// { //$NON-NLS-1$
-		// public void run() {
-		// horzAlignToFirstSelected();
-		// }
-		//
-		// public String getId() {
-		// return ALIGN_HORZ_FIRST_SELECTED;
-		// }
-		// };
-		// getActionRegistry().registerAction(hAlignFirstSelectedAction);
-		//
-		// // align vertically to average x-value of all selected nodes
-		// IAction vAlignAverageAction = new Action(
-		// DiagramUIResources
-		// .getString("DiagramUI.AbstractDiagramEditor.vAlignAverageAction.text"))
-		// { //$NON-NLS-1$
-		// public void run() {
-		// verticalAlignToAverageSelected();
-		// }
-		//
-		// public String getId() {
-		// return ALIGN_VERT_AVERAGE;
-		// }
-		// };
-		// getActionRegistry().registerAction(vAlignAverageAction);
-		//
-		// // align vertically to x-value of first selected node
-		// IAction vAlignFirstSelectedAction = new Action(
-		// DiagramUIResources
-		// .getString("DiagramUI.AbstractDiagramEditor.vAlignFirstSelectedAction.text"))
-		// { //$NON-NLS-1$
-		// public void run() {
-		// verticalAlignToFirstSelected();
-		// }
-		//
-		// public String getId() {
-		// return ALIGN_VERT_FIRST_SELECTED;
-		// }
-		// };
-		// getActionRegistry().registerAction(vAlignFirstSelectedAction);
-
-		action = createAnAction(
-				DiagramUIResources.AbstractDiagram_FreeText_text, freeTxtNodeCreationFactory, 
-				CREATE_FREE_TEXT,
-				DiagramUIResources.AbstractDiagram_FreeText_tooltip, 
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = new Action(DiagramUIResources.moveAction_label) { 
-
-			public void setImageDescriptor(ImageDescriptor newImage) {
-				super.setImageDescriptor(newImage);
-			}
-
-			public void runWithEvent(Event event) {
-				super.runWithEvent(event);
-
-			}
-
-			public void run() {
-				super.run();
-			}
-
-			public boolean isEnabled() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() > 0)
-					return true;
-				return false;
-			}
-
-			public String getId() {
-				return MOVE;
-			}
-
-		};
-		getActionRegistry().registerAction(action);
-
-		IAction linkAction = new Action(DiagramUIResources.AbstractDiagram_Link_text) { 
-			public void run() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() == 2) {
-					EditPart sourceEditPart = (EditPart) editParts.get(0);
-					EditPart targetEditPart = (EditPart) editParts.get(1);
-					List targetList = new ArrayList();
-					if (sourceEditPart instanceof FreeTextNodeEditPart
-							|| targetEditPart instanceof FreeTextNodeEditPart)
-						return;
-					if (sourceEditPart instanceof NodeEditPart) {
-						targetList = ((NodeEditPart) sourceEditPart)
-								.getSourceConnections();
-						if (!targetList.isEmpty()) {
-							for (Iterator itor = targetList.iterator(); itor
-									.hasNext();) {
-								LinkEditPart obj = (LinkEditPart) itor.next();
-								if (targetEditPart.equals(obj.getSource()))
-									return;
-								if (targetEditPart.equals(obj.getTarget()))
-									return;
-							}
-						}
-						targetList = ((NodeEditPart) sourceEditPart)
-								.getTargetConnections();
-						if (!targetList.isEmpty()) {
-							for (Iterator itor = targetList.iterator(); itor
-									.hasNext();) {
-								LinkEditPart obj = (LinkEditPart) itor.next();
-								if (targetEditPart.equals(obj.getSource()))
-									return;
-								if (targetEditPart.equals(obj.getTarget()))
-									return;
-							}
-						}
-					}
-					Link link = ModelFactory.eINSTANCE.createLink();
-					if (sourceEditPart.getModel() instanceof Node)
-						link.setSource((Node) sourceEditPart.getModel());
-					if (targetEditPart.getModel() instanceof Node)
-						link.setTarget((Node) targetEditPart.getModel());
-					org.eclipse.gef.commands.Command c = new CreateLinkCommand(
-							link, (Node) sourceEditPart.getModel());
-					getCommandStack().execute(c);
-				}
-			}
-
-			public boolean isEnabled() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				for (Iterator itor = editParts.iterator(); itor.hasNext();) {
-					Object part = itor.next();
-					if (part instanceof FreeTextNodeEditPart)
-						return false;
-				}
-				if (editParts.size() == 2)
-					return true;
-				return false;
-			}
-
-			public String getId() {
-				return CREATE_LINK;
-			}
-		};
-		getActionRegistry().registerAction(linkAction);
-
-		IAction selectLinkAction = new Action(DiagramUIResources.AbstractDiagram_Link_select) { 
-
-			public void run() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() == 1) {
-					EditPart part = (EditPart) editParts.get(0);
-					if (part instanceof NodeEditPart) {
-						List list = ((NodeEditPart) part)
-								.getSourceConnections();
-						if (list != null && !list.isEmpty()) {
-							LinkEditPart linkpart = (LinkEditPart) list.get(0);
-							linkpart.setSelected(1);
-							getGraphicalViewer().select(linkpart);
-							// part.setSelected(0);
-						}
-					}
-				}
-			}
-
-			public boolean isEnabled() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() == 1) {
-					return true;
-				}
-				return false;
-			}
-
-			public String getId() {
-				return SELECT_LINK;
-			}
-
-		};
-		getActionRegistry().registerAction(selectLinkAction);
-
-		IAction createBendPointAction = new Action(DiagramUIResources.AbstractDiagram_BendPoint_create) { 
-
-			public void run() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() == 1) {
-					EditPart part = (EditPart) editParts.get(0);
-					if (part instanceof LinkEditPart) {
-						// return true;
-						Link link = (Link) ((LinkEditPart) part).getModel();
-						List bendpoints = link.getBendpoints();
-						if (bendpoints == null || bendpoints.size() < 1) {
-							Point sp = link.getSourceEndPoint();
-							Point tp = link.getTargetEndPoint();
-							if (sp == null) {
-								if (link.getSource() == null) {
-									sp = ((Node) link.eContainer())
-											.getLocation();
-								} else {
-									sp = link.getSource().getLocation();
-								}
-							}
-							if (tp == null) {
-								tp = link.getTarget().getLocation();
-							}
-							Point bPoint = new Point();
-							bPoint.x = (sp.x + tp.x) / 2;
-							bPoint.y = (sp.y + tp.y) / 2;
-							org.eclipse.gef.commands.Command c = new CreateBendpointCommand(
-									link, bPoint, 0);
-							getCommandStack().execute(c);
-
-						}
-					}
-				}
-			}
-
-			public boolean isEnabled() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() == 1) {
-					EditPart part = (EditPart) editParts.get(0);
-					if (part instanceof LinkEditPart) {
-						return true;
-					}
-				}
-				return false;
-			}
-
-			public String getId() {
-				return CREATE_BEND_POINT;
-			}
-		};
-		getActionRegistry().registerAction(createBendPointAction);
-
-		IAction refreshAction = new Action(DiagramUIResources.refreshAction_label) { 
-			public void run() {
-				Diagram diagram = (Diagram) editPart.getModel();
-				if (editPart.isActive()) {
-					editPart.deactivate();
-				}
-				diagram.removeConsumer(AbstractDiagramEditor.this);
-				createEditPart();
-				getGraphicalViewer().setContents(editPart);
-			}
-
-			public String getId() {
-				return REFRESH;
-			}
-		};
-		getActionRegistry().registerAction(refreshAction);
-		IAction deleteDiagramAction = new Action(DiagramUIResources.DeleteDiagram_text) { 
-
-			public void run() {
-				if (AuthoringUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayPrompt(
-								DiagramUIResources.DeleteDiagram_text, 
-								DiagramUIResources.DeleteDiagram_prompt)) { 
-					Diagram diagram = (Diagram) ((EditPart) getGraphicalViewer()
-							.getContents()).getModel();
-					EcoreUtil.remove(diagram.getUMADiagram());
-					doSave(new NullProgressMonitor());
-					getSite().getPage().closeEditor(
-							getSite().getPage().getActiveEditor(), false);
-				}
-			}
-
-			public boolean isEnabled() {
-				return getGraphicalViewer().getSelectedEditParts().size() == 0;
-			}
-
-			public String getId() {
-				return DELETE_DIAGRAM;
-			}
-
-		};
-		getActionRegistry().registerAction(deleteDiagramAction);
-		IAction alignBendPointAction = new Action(DiagramUIResources.align_bend_point_text) { 
-
-			public void run() {
-				EditPart part = (EditPart) getGraphicalViewer()
-						.getSelectedEditParts().get(0);
-				if (part instanceof LinkEditPart) {
-					LinkEditPart linkpart = ((LinkEditPart) part);
-					Link link = (Link) linkpart.getModel();
-					if (link.getBendpoints().size() > 0) {
-
-						GraphicalEditPart spart = ((GraphicalEditPart) linkpart
-								.getSource());
-						GraphicalEditPart tpart = ((GraphicalEditPart) linkpart
-								.getTarget());
-
-						Point sp = spart.getFigure().getBounds().getCenter();
-						Point tp = tpart.getFigure().getBounds().getCenter();
-
-						if (spart instanceof DecisionNodeEditPart
-								|| spart instanceof SynchBarNodeEditPart) {
-							sp = ((TypedNode) spart.getModel()).getLocation();
-							List list = ((NodeEditPart) spart)
-									.getSourceConnections();
-							for (Iterator itor = list.iterator(); itor
-									.hasNext();) {
-								LinkEditPart lp = (LinkEditPart) itor.next();
-								if (lp.getTarget().equals(tpart)) {
-									Point sourceEndPoint = ((Link) lp
-											.getModel()).getSourceEndPoint();
-									sp = sp.getTranslated(sourceEndPoint);
-								}
-							}
-						}
-
-						if (tpart instanceof DecisionNodeEditPart
-								|| tpart instanceof SynchBarNodeEditPart) {
-							tp = ((TypedNode) tpart.getModel()).getLocation();
-							List list = ((NodeEditPart) tpart)
-									.getTargetConnections();
-							for (Iterator itor = list.iterator(); itor
-									.hasNext();) {
-								LinkEditPart lp = (LinkEditPart) itor.next();
-								if (lp.getSource().equals(spart)) {
-									Point targetEndPoint = ((Link) lp
-											.getModel()).getTargetEndPoint();
-									tp = tp.getTranslated(targetEndPoint);
-								}
-							}
-						}
-						for (int i = 0; i < link.getBendpoints().size(); i++) {
-							AbsoluteBendpoint oldbp = (AbsoluteBendpoint) link
-									.getBendpoints().get(i);
-							AbsoluteBendpoint bp = new AbsoluteBendpoint(
-									new Point(-1, -1));
-							AbsoluteBendpoint previousbp = null;
-							int delta = 40;
-							int position = 0;
-
-							if (i == 0) {
-								position = sp.getPosition(oldbp);
-							} else {
-								previousbp = (AbsoluteBendpoint) link
-										.getBendpoints().get(i - 1);
-								position = previousbp.getPosition(oldbp);
-							}
-
-							if (position == PositionConstants.SOUTH
-									|| position == PositionConstants.NORTH) {
-								if (i == 0) {
-									if (sp.x - delta < oldbp.x
-											&& sp.x + delta > oldbp.x
-											&& !(sp.x == oldbp.x)) {
-										bp.x = sp.x;
-									}
-								} else {
-									if (previousbp.x - delta < oldbp.x
-											&& previousbp.x + delta > oldbp.x
-											&& !(previousbp.x == oldbp.x)) {
-										bp.x = previousbp.x;
-									}
-								}
-								if (link.getBendpoints().size() - 1 == i) {
-									if (tp.y - delta < oldbp.y
-											&& tp.y + delta > oldbp.y
-											&& !(tp.y == oldbp.y)) {
-										bp.y = tp.y;
-									}
-								} else {
-									bp.y = oldbp.y;
-								}
-							}
-							if (position == PositionConstants.EAST
-									|| position == PositionConstants.WEST) {
-
-								if (i == 0) {
-									if (sp.y - delta < oldbp.y
-											&& sp.y + delta > oldbp.y
-											&& !(sp.y == oldbp.y)) {
-										bp.y = sp.y;
-									}
-								} else {
-									if (previousbp.y - delta < oldbp.y
-											&& previousbp.y + delta > oldbp.y
-											&& !(previousbp.y == oldbp.y)) {
-										bp.y = previousbp.y;
-									}
-								}
-								if (link.getBendpoints().size() - 1 == i) {
-									if (tp.x - delta < oldbp.x
-											&& tp.x + delta > oldbp.x
-											&& !(tp.x == oldbp.x)) {
-										bp.x = tp.x;
-									}
-								} else {
-									bp.x = oldbp.x;
-								}
-							}
-							if (bp.x == -1 && bp.y != -1) {
-								org.eclipse.gef.commands.Command c = new MoveBendpointCommand(
-										link, new Point(oldbp.x, bp.y), i);
-								// ((RootEditPart)getRoot()).getViewer().getEditDomain().getCommandStack().execute(c);
-								getCommandStack().execute(c);
-							}
-							if (bp.x != -1 && bp.y == -1) {
-								org.eclipse.gef.commands.Command c = new MoveBendpointCommand(
-										link, new Point(bp.x, oldbp.y), i);
-								getCommandStack().execute(c);
-							}
-							if (bp.x != -1 && bp.y != -1) {
-								org.eclipse.gef.commands.Command c = new MoveBendpointCommand(
-										link, new Point(bp.x, bp.y), i);
-								getCommandStack().execute(c);
-							}
-						}
-					}
-				}
-			}
-
-			public boolean isEnabled() {
-				List list = getGraphicalViewer().getSelectedEditParts();
-				if (list.size() == 1) {
-					if (list.get(0) instanceof LinkEditPart) {
-						LinkEditPart part = (LinkEditPart) list.get(0);
-						Link link = (Link) part.getModel();
-						if (link.getBendpoints().size() > 0)
-							return true;
-					}
-				}
-				return false;
-			}
-
-			public String getId() {
-				return ALIGN_BEND_POINT;
-			}
-
-		};
-		
-		// Viewer Print Action
-		action = new DiagramPrintAction(this, getGraphicalViewer());
-		registry.registerAction(action);
-		getActionRegistry().registerAction(alignBendPointAction);
-	}
-
-	protected IAction createAnAction(String actionName,
-			CreationFactory creationFactory, String actionId,
-			String tooltipString, ImageDescriptor imagedesc) {
-		final CreationFactory factory = creationFactory;
-		final String id = actionId;
-		final String tooltip = tooltipString;
-		final ImageDescriptor imagedescriptor = imagedesc;
-		return new Action(actionName) { 
-
-			public void run() {
-				CreateRequest request = new CreateRequest();
-				// CreationFactory factory = getFactory(template);
-				if (factory == null)
-					return;
-				request.setFactory(factory);
-				request.setLocation(new Point(10, 10));
-
-				if (request.getNewObject() instanceof Node) {
-					Point loc = request.getLocation();
-					Diagram parent = (Diagram) editPart.getModel();
-					org.eclipse.gef.commands.Command c = new CreateNodeCommand(
-							(Node) request.getNewObject(), parent, loc);
-					getCommandStack().execute(c);
-				}
-			}
-
-			public String getId() {
-				return id;
-			}
-
-			public boolean isEnabled() {
-				if (TngUtil.isLocked(getMethodElementFromInput())) {
-					return false;
-				} else
-					return true;
-			}
-
-			public String getToolTipText() {
-				return tooltip;
-			}
-
-			public void setImageDescriptor(
-					org.eclipse.jface.resource.ImageDescriptor newImage) {
-				super.setImageDescriptor(imagedescriptor);
-			}
-
-			public ImageDescriptor getImageDescriptor() {
-				return imagedescriptor;
-			}
-		};
-	}
-
-	protected PaletteViewerProvider createPaletteViewerProvider() {
-		return new PaletteViewerProvider(getEditDomain()) {
-			private IMenuListener menuListener;
-
-			protected void configurePaletteViewer(PaletteViewer viewer) {
-				super.configurePaletteViewer(viewer);
-				// TODO viewer.setCustomizer(new LogicPaletteCustomizer());
-				viewer
-						.addDragSourceListener(new TemplateTransferDragSourceListener(
-								viewer));
-			}
-
-			protected void hookPaletteViewer(PaletteViewer viewer) {
-				super.hookPaletteViewer(viewer);
-				final CopyTemplateAction copy = (CopyTemplateAction) getActionRegistry()
-						.getAction(ActionFactory.COPY.getId());
-				viewer.addSelectionChangedListener(copy);
-				if (menuListener == null)
-					menuListener = new IMenuListener() {
-						public void menuAboutToShow(IMenuManager manager) {
-							manager.appendToGroup(
-									GEFActionConstants.GROUP_COPY, copy);
-						}
-					};
-				viewer.getContextMenu().addMenuListener(menuListener);
-			}
-		};
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences()
-	 */
-	protected FlyoutPreferences getPalettePreferences() {
-		return new FlyoutPreferences() {
-			public int getDockLocation() {
-				return AuthoringUIPlugin.getDefault().getPreferenceStore()
-						.getInt(PALETTE_DOCK_LOCATION);
-			}
-
-			public int getPaletteState() {
-				return AuthoringUIPlugin.getDefault().getPreferenceStore()
-						.getInt(PALETTE_STATE);
-			}
-
-			public int getPaletteWidth() {
-				return AuthoringUIPlugin.getDefault().getPreferenceStore()
-						.getInt(PALETTE_SIZE);
-			}
-
-			public void setDockLocation(int location) {
-				AuthoringUIPlugin.getDefault().getPreferenceStore().setValue(
-						PALETTE_DOCK_LOCATION, location);
-			}
-
-			public void setPaletteState(int state) {
-				AuthoringUIPlugin.getDefault().getPreferenceStore().setValue(
-						PALETTE_STATE, state);
-			}
-
-			public void setPaletteWidth(int width) {
-				AuthoringUIPlugin.getDefault().getPreferenceStore().setValue(
-						PALETTE_SIZE, width);
-			}
-		};
-	}
-
-	protected KeyHandler getCommonKeyHandler() {
-		if (sharedKeyHandler == null) {
-			sharedKeyHandler = new KeyHandler() {
-
-				public boolean keyPressed(KeyEvent event) {
-					if ((event.stateMask == SWT.CTRL)
-							&& (event.keyCode == SWT.ARROW_RIGHT)) {
-						move(1);
-					}
-					if ((event.stateMask == SWT.CTRL)
-							&& (event.keyCode == SWT.ARROW_DOWN)) {
-						move(2);
-
-					}
-					if ((event.stateMask == SWT.CTRL)
-							&& (event.keyCode == SWT.ARROW_UP)) {
-						move(3);
-					}
-					if ((event.stateMask == SWT.CTRL)
-							&& (event.keyCode == SWT.ARROW_LEFT)) {
-						move(4);
-					}
-
-					return super.keyPressed(event);
-				}
-
-				public boolean move(int direction) {
-					List list = getGraphicalViewer().getSelectedEditParts();
-					GraphicalEditPart part = (GraphicalEditPart) list.get(0);
-					if (part.getModel() instanceof Node) {
-						Node node = (Node) part.getModel();
-						Point point = node.getLocation();
-						int newx = point.x;
-						int newy = point.y;
-						int presslength = 1;
-						switch (direction) {
-						case 1:
-							// node.setLocation(new Point(point.x+10,point.y));
-							newx = point.x + presslength;
-							break;
-						case 2:
-							// node.setLocation(new Point(point.x,point.y+10));
-							newy += presslength;
-							break;
-						case 3:
-							// node.setLocation(new Point(point.x,point.y-10));
-							newy -= presslength;
-							break;
-						case 4:
-							// node.setLocation(new Point(point.x-10,point.y));
-							newx -= presslength;
-							break;
-						default:
-							break;
-						}
-						org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-								node, new Point(newx, newy), node.getWidth());
-						getCommandStack().execute(c);
-						return true;
-					}
-					// TODO- check adding more bendpoint, capture bendpoint
-					// index on fly
-					if (part.getModel() instanceof Link) {
-						Link link = (Link) part.getModel();
-						List blist = link.getBendpoints();
-						int index = 0;
-						if (blist != null && blist.size() > 0) {
-							AbsoluteBendpoint point = (AbsoluteBendpoint) blist
-									.get(index);
-							int newx = point.x;
-							int newy = point.y;
-							int presslength = 5;
-							switch (direction) {
-							case 1:
-								// node.setLocation(new
-								// Point(point.x+10,point.y));
-								newx = point.x + presslength;
-								break;
-							case 2:
-								// node.setLocation(new
-								// Point(point.x,point.y+10));
-								newy += presslength;
-								break;
-							case 3:
-								// node.setLocation(new
-								// Point(point.x,point.y-10));
-								newy -= presslength;
-								break;
-							case 4:
-								// node.setLocation(new
-								// Point(point.x-10,point.y));
-								newx -= presslength;
-								break;
-							default:
-								break;
-							}
-							org.eclipse.gef.commands.Command c = new MoveBendpointCommand(
-									link, new Point(newx, newy), index);
-							getCommandStack().execute(c);
-						}
-					}
-					return true;
-				}
-
-			};
-			sharedKeyHandler
-					.put(KeyStroke.getPressed(SWT.DEL, 127, 0),
-							getActionRegistry().getAction(
-									ActionFactory.DELETE.getId()));
-			sharedKeyHandler.put(KeyStroke.getPressed(SWT.F2, 0),
-					getActionRegistry().getAction(
-							GEFActionConstants.DIRECT_EDIT));
-
-		}
-		return sharedKeyHandler;
-	}
-
-	/**
-	 * Sets the graphicalViewer for this EditorPart.
-	 * 
-	 * @param viewer
-	 *            the graphical viewer
-	 */
-	protected void setGraphicalViewer(GraphicalViewer viewer) {
-		super.setGraphicalViewer(viewer);
-		if (actionService != null) {
-			actionService.setGraphicalViewer(viewer);
-		}
-	}
-
-	protected void configureGraphicalViewer() {
-		super.configureGraphicalViewer();
-		ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer();
-
-		ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart();
-
-		// List zoomLevels = new ArrayList(3);
-		// zoomLevels.add(ZoomManager.FIT_ALL);
-		// zoomLevels.add(ZoomManager.FIT_WIDTH);
-		// zoomLevels.add(ZoomManager.FIT_HEIGHT);
-		// root.getZoomManager().setZoomLevelContributions(zoomLevels);
-		//
-		// IAction zoomIn = new ZoomInAction(root.getZoomManager());
-		// IAction zoomOut = new ZoomOutAction(root.getZoomManager());
-		// getActionRegistry().registerAction(zoomIn);
-		// getActionRegistry().registerAction(zoomOut);
-		// getSite().getKeyBindingService().registerAction(zoomIn);
-		// getSite().getKeyBindingService().registerAction(zoomOut);
-
-		viewer.setRootEditPart(root);
-
-		// viewer.setEditPartFactory(new MethodElementEditPartFactory());
-		viewer.setEditPartFactory(createEditPartFactory());
-
-		ContextMenuProvider provider = new DiagramContextMenuProvider(
-				getGraphicalViewer(), getActionRegistry());
-		getGraphicalViewer().setContextMenu(provider);
-		getSite().registerContextMenu(
-				"org.eclipse.epf.authoring.ui.editors.workflow.contextmenu", //$NON-NLS-1$
-				provider, getGraphicalViewer());
-
-		viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer)
-				.setParent(getCommonKeyHandler()));
-
-		// loadProperties();
-
-		// Actions
-		// IAction showRulers = new
-		// ToggleRulerVisibilityAction(getGraphicalViewer());
-		// getActionRegistry().registerAction(showRulers);
-		//    	
-		// IAction snapAction = new
-		// ToggleSnapToGeometryAction(getGraphicalViewer());
-		// getActionRegistry().registerAction(snapAction);
-		//
-		// IAction showGrid = new ToggleGridAction(getGraphicalViewer());
-		// getActionRegistry().registerAction(showGrid);
-
-		Listener listener = new Listener() {
-			public void handleEvent(Event event) {
-				handleActivationChanged(event);
-			}
-		};
-
-		getGraphicalControl().addListener(SWT.Activate, listener);
-		getGraphicalControl().addListener(SWT.Deactivate, listener);
-
-		getGraphicalControl().addListener(SWT.MouseDoubleClick, new Listener() {
-
-			public void handleEvent(Event event) {
-				handleDoubleClick(event);
-			}
-
-		});
-		if (getDiagramType().equalsIgnoreCase(
-				ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL))
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							getGraphicalControl(),
-							AuthoringUIHelpContexts.FORM_EDITOR_ACTIVITY_DETAIL_DIAGRAM_CONTEXT);
-		else if (getDiagramType().equalsIgnoreCase(
-				ResourceHelper.DIAGRAM_TYPE_WORKFLOW))
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(
-					getGraphicalControl(), AuthoringUIHelpContexts.FORM_EDITOR_ACTIVITY_DIAGRAM_CONTEXT); 
-		else if (getDiagramType().equalsIgnoreCase(
-				ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY))
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(getGraphicalControl(), AuthoringUIHelpContexts.FORM_EDITOR_WP_DEPENDENCY_DIAGRAM_CONTEXT);
-
-		Display display = getGraphicalControl().getDisplay();
-		if (!(display == null || display.isDisposed())) {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					if (getPaletteRoot() != null) {
-						Object obj = getMethodElementFromInput();
-						if (TngUtil.isLocked((EObject) obj)) {
-							List list = getPaletteRoot().getChildren();
-							for (Iterator itor = list.iterator(); itor
-									.hasNext();) {
-								PaletteEntry entry = (PaletteEntry) itor.next();
-								entry.setVisible(false);
-							}
-
-						} else {
-							List list = getPaletteRoot().getChildren();
-							for (Iterator itor = list.iterator(); itor
-									.hasNext();) {
-								PaletteEntry entry = (PaletteEntry) itor.next();
-								entry.setVisible(true);
-							}
-						}
-					}
-				}
-			});
-		}
-		
-		currentConfig = LibraryService.getInstance().getCurrentMethodConfiguration();
-		
-		// listen to change for current selection of MethodConfiguration or changes in 
-		// current configuration.
-		//
-		LibraryService.getInstance().addListener(libSvcListener);
-		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.addListener(libraryListener);
-		}
-		
-		IAction action = getActionRegistry().getAction(ActionFactory.PRINT.getId());
-		if(action instanceof DiagramPrintAction){
-			((DiagramPrintAction)action).setViewer(viewer);
-		}
-
-	}
-
-	/**
-	 * @return
-	 */
-	protected abstract EditPartFactory createEditPartFactory();
-
-	/**
-	 * @param event
-	 */
-	protected void handleDoubleClick(Event event) {
-	}
-
-	protected void initializeGraphicalViewer() {
-		super.initializeGraphicalViewer();
-		getGraphicalViewer().setContents(editPart);
-
-		TransferDropTargetListener listener = createDropTargetListener();
-		if (listener != null) {
-			getGraphicalViewer().addDropTargetListener(listener);
-		}
-
-		// AbstractEditPartViewer
-		// getGraphicalViewer().addDropTargetListener(
-		// new TextTransferDropTargetListener(getGraphicalViewer(),
-		// TextTransfer.getInstance()));
-	}
-
-	protected void initializeCreationFactories() {
-		templateNameToCreationFactoryMap = new HashMap();
-
-		if (freeTxtNodeCreationFactory == null)
-			freeTxtNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					TypedNode node = ModelFactory.eINSTANCE.createTypedNode();
-					node.setType(TypedNode.FREE_TEXT);
-					node.setObject(GraphicalDataHelper
-							.newTypedGraphNode(TypedNode.FREE_TEXT));
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.FREE_TEXT;
-				}
-
-			};
-		CreationFactory creationFactory = freeTxtNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createDropTargetListener()
-	 */
-	protected TransferDropTargetListener createDropTargetListener() {
-		return new TemplateTransferDropTargetListener(getGraphicalViewer()) {
-
-			protected CreationFactory getFactory(Object template) {
-				return (CreationFactory) templateNameToCreationFactoryMap
-						.get(template);
-			}
-
-		};
-	}
-
-	protected void handleActivationChanged(Event event) {
-		IAction copy = null;
-		if (event.type == SWT.Deactivate)
-			copy = getActionRegistry().getAction(ActionFactory.COPY.getId());
-		if (getEditorSite().getActionBars().getGlobalActionHandler(
-				ActionFactory.COPY.getId()) != copy) {
-			getEditorSite().getActionBars().setGlobalActionHandler(
-					ActionFactory.COPY.getId(), copy);
-			getEditorSite().getActionBars().updateActionBars();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (paletteRoot == null) {
-			createPaletteRoot();
-		}
-		return paletteRoot;
-	}
-
-	/**
-	 * 
-	 */
-	private void createPaletteRoot() {
-		paletteRoot = new PaletteRoot();
-		paletteRoot.addAll(createCategories(paletteRoot));
-	}
-
-	private List createCategories(PaletteRoot root) {
-		List categories = new ArrayList();
-
-		PaletteContainer paletteContainer = createControlGroup(root);
-		if (paletteContainer != null) {
-			categories.add(paletteContainer);
-		}
-
-		return categories;
-	}
-
-	protected PaletteContainer createControlGroup(PaletteRoot root) {
-		return null;
-	}
-
-	protected MethodElement getMethodElementFromInput() {
-		IEditorInput input = getEditorInput();
-		if (input instanceof MethodElementEditorInput) {
-			return ((MethodElementEditorInput) input).getMethodElement();
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(final IProgressMonitor monitor) {
-
-		// saveDiagram();
-		// saveScreen();
-
-		final MethodElement e = getMethodElementFromInput();
-		if (e == null)
-			return;
-		SafeRunnable.run(new SafeRunnable() {
-
-			public void run() throws Exception {
-				try {
-					monitor
-							.beginTask(
-									DiagramUIResources.AbstractDiagramEditor_Save_text, IProgressMonitor.UNKNOWN); 
-					monitor
-							.setTaskName(DiagramUIResources.bind(DiagramUIResources.AbstractDiagramEditor_Save_message
-									, e.eResource().getURI().isFile() ? e.eResource().getURI().toFileString() : e.getName())); 
-					ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-					try {
-						persister.save(e.eResource());
-						persister.commit();
-						Diagram diagram = (Diagram) ((EditPart) getGraphicalViewer()
-								.getContents()).getModel();
-						diagram.setNew(false);
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-						try {
-							persister.rollback();
-						} catch (Exception ex) {
-							AuthoringUIPlugin.getDefault().getLogger()
-									.logError(ex);
-							ViewHelper
-									.reloadCurrentLibaryOnRollbackError(getSite()
-											.getShell());
-							return;
-						}
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayWarning(
-										getSite().getShell().getText(),
-										DiagramUIResources.diagram_saveError
-										, e.getMessage(), e);
-						return;
-					}
-
-					// Refresh the necessary state.
-					//
-					//getEditDomain().getCommandStack().markSaveLocation();
-					getEditDomain().getCommandStack().flush();
-					changeTime = -1;
-					firePropertyChange(IEditorPart.PROP_DIRTY);
-
-				} finally {
-					monitor.done();
-				}
-			}
-
-		});
-	}
-
-	/** 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		return getEditDomain().getCommandStack().isDirty();
-	}
-
-	/** 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	protected boolean isReadOnly() {
-		if (editPart != null) {
-			Diagram diagram = (Diagram) editPart.getModel();
-			return diagram != null && diagram.isReadOnly();
-		}
-		return false;
-	}
-
-	private void createEditPart() {
-		BreakdownElementEditorInput editorInput = (BreakdownElementEditorInput) getEditorInput();
-		Object object;
-		if (editorInput.getWrapper() != null) {
-			object = editorInput.getWrapper();
-		} else {
-			object = editorInput.getMethodElement();
-		}
-		
-		changeTime = System.currentTimeMillis();
-		editPart = createDiagramEditPart();
-		Diagram diagram = (Diagram) editPart.getModel();
-		// pass along the Suppression instance from input to diagram model
-		//
-		diagram.setSuppression(editorInput.getSuppression());
-		diagram.setObject(object);
-		diagram.addConsumer(this);
-		
-		if(!diagram.isNew()) {
-			changeTime = -1;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) {
-		super.setInput(input);
-
-		MethodElement e = getMethodElementFromInput();
-		if (e != null) {
-			createEditPart();
-
-			BreakdownElementEditorInput editorInput = (BreakdownElementEditorInput) getEditorInput();
-			setPartName(getPartNamePrefix()
-					+ e.getName()
-					+ ", " + editorInput.getSuppression().getProcess().getName()); //$NON-NLS-1$
-			// setTitleImage(getTypeImage(e));
-		}
-	}
-
-	protected abstract EditPart createDiagramEditPart();
-
-	protected abstract String getPartNamePrefix();
-
-	protected abstract String getDiagramType();
-
-	/**
-	 * Get parent editor
-	 * @return editor
-	 */
-	public IEditorPart getParentEditor() {
-		return parentEditor;
-	}
-
-	public void setParentEditor(IEditorPart parentEditor) {
-		this.parentEditor = parentEditor;
-	}
-	
-	//Adding librarychnaged listener, if configuration got changed diagram needs to refresh
-	private ILibraryChangeListener libraryListener = new ILibraryChangeListener() {
-		public void libraryChanged(int option, Collection collection) {
-			switch (option) {
-			case ILibraryChangeListener.OPTION_CHANGED: {
-				if (collection != null && collection.contains(currentConfig)) {
-					MethodConfiguration config = ProcessAuthoringConfigurator.INSTANCE.getMethodConfiguration();
-					try {
-						ProcessAuthoringConfigurator.INSTANCE.setMethodConfiguration(currentConfig);					
-						IAction action = getActionRegistry().getAction(REFRESH);
-						action.run();
-					}
-					finally {
-						ProcessAuthoringConfigurator.INSTANCE.setMethodConfiguration(config);
-					}
-				}		
-				break;
-			}
-			// handled by libSvcListener
-			//
-//			case ILibraryChangeListener.OPTION_CONFIGURATION_SELECTED: {
-//				configChanged();
-//				break;
-//			}
-			}
-		}
-	};
-	
-	private ILibraryServiceListener libSvcListener = new ILibraryServiceListener() {
-
-		public void configurationSet(MethodConfiguration config) {
-			configChanged();
-		}
-
-		public void libraryClosed(MethodLibrary library) {
-		}
-
-		public void libraryCreated(MethodLibrary library) {
-		}
-
-		public void libraryOpened(MethodLibrary library) {
-		}
-
-		public void libraryReopened(MethodLibrary library) {
-		}
-
-		public void librarySet(MethodLibrary library) {
-		}		
-	};
-	
-	private void configChanged() {
-		MethodConfiguration config = LibraryService.getInstance().getCurrentMethodConfiguration();
-		if(currentConfig != config) {
-			// refresh only if the active part is this diagram editor or process editor of the process
-			// that owns this diagram
-			//
-			IWorkbenchPart activePart = getSite().getWorkbenchWindow().getPartService().getActivePart();
-			boolean refresh =  activePart == this;
-			if(!refresh) {
-				if(activePart instanceof ProcessEditor) {
-					MethodElementEditorInput input = (MethodElementEditorInput) ((ProcessEditor)activePart).getEditorInput();
-					Object procComp = input.getMethodElement();
-					EObject diagram = ((Diagram)editPart.getModel()).getUMADiagram();
-					refresh = UmaUtil.isContainedBy(diagram, procComp);
-				}
-			}
-			if(refresh) {
-				currentConfig = config;
-				IAction action = getActionRegistry().getAction(REFRESH);
-				action.run();
-			}
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 * override to donot allow any node selection in Activity Detail Diagram 
-	 * if activity is extends.
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		// TODO Auto-generated method stub
-		super.selectionChanged(part, selection);
-		if(editPart != null){
-			Diagram diagram = (Diagram)editPart.getModel();
-			if(diagram.isReadOnly() || TngUtil.isLocked(getMethodElementFromInput())){
-				getGraphicalViewer().select(editPart);
-			}
-		}
-	}
-	
-	public void refreshDiagram(){
-		getActionRegistry().getAction(REFRESH).run();
-	}
-
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-	
-//	/*
-//	 * Method sets the context menu contributing items state.
-//	 * This is efficient way instead of doing at each action. 
-//	 * Uncomment this code, once all the place isEnabled Code is removed.
-//	 */
-//	public void setStateMenuContributeItems(){
-//		
-//		List editParts = getGraphicalViewer().getSelectedEditParts();
-//		if(editParts.size() == 0){
-//			getActionRegistry().getAction(DELETE_DIAGRAM).setEnabled(true);
-//		}
-//		if(editParts.size() == 1){
-//			EditPart editPart = (EditPart)editParts.get(0);
-//			getActionRegistry().getAction(SELECT_LINK).setEnabled(true);
-//			if (editPart.getModel() instanceof TypedNode) {
-//				if(((TypedNode) editPart.getModel()).getType() == TypedNode.FREE_TEXT)
-//				getActionRegistry().getAction(FONT_DIALOG).setEnabled(true);
-//				getActionRegistry().getAction(SELECT_LINK).setEnabled(false);
-//			}
-//			if(editPart instanceof LinkEditPart){
-//				getActionRegistry().getAction(CREATE_BEND_POINT).setEnabled(true);
-//				Link link = (Link)editPart.getModel();
-//				if(link.getBendpoints().size() > 0){
-//					getActionRegistry().getAction(ALIGN_BEND_POINT).setEnabled(true);
-//				}
-//			}
-//			
-//		}
-//		if(editParts.size() == 2){
-//			getActionRegistry().getAction(CREATE_LINK).setEnabled(true); 
-//			for (Iterator itor = editParts.iterator(); itor.hasNext();) {
-//				Object part = itor.next();
-//				if (part instanceof FreeTextEditPart)
-//					getActionRegistry().getAction(CREATE_LINK).setEnabled(false);
-//			}
-//		}
-//	}
-	
-//	public void setFocus() {
-//		// TODO Auto-generated method stub
-//		super.setFocus();
-//		// Refresh is expensive operation.
-//		// TODO - find process solution for notification between 
-//		// base diagram and extend diagram.     
-//		MethodElement element = getMethodElementFromInput();
-//		if(((Diagram)editPart.getModel()).isReadOnly()){
-//			getActionRegistry().getAction(REFRESH).run();
-//		}
-//		else if(element instanceof VariabilityElement){
-//			if(((VariabilityElement)element).getVariabilityType() != null){
-//				if(!((VariabilityElement)element).getVariabilityType().equals(VariabilityType.NA_LITERAL)){
-//					getActionRegistry().getAction(REFRESH).run();
-//				}
-//			}
-//				
-//		}
-//	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ActivityDetailDiagramEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ActivityDetailDiagramEditor.java
deleted file mode 100644
index bfcaca4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ActivityDetailDiagramEditor.java
+++ /dev/null
@@ -1,503 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.authoring.gef.edit.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.ActivityDetailDiagramEditPartFactory;
-import org.eclipse.epf.authoring.gef.edit.DiagramUpdateService;
-import org.eclipse.epf.authoring.gef.edit.FreeTextNodeEditPart;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PanningSelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-
-
-/**
- * An editor for activity detail diagram
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityDetailDiagramEditor extends AbstractDiagramEditor {
-
-
-	private static final String RESET_DIAGRAM_LAYOUT = "reset_diagram_layout"; //$NON-NLS-1$
-
-	private CreationFactory roleNodeCreationFactory;
-
-	private CreationFactory taskNodeCreationFactory;
-
-	private CreationFactory wpdNodeCreationFactory;
-
-	private boolean initialCleanUp = false;
-	private BreakdownAdapterFactory factory = null;
-
-	// a hack
-	/**
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createEditPartFactory()
-	 */
-	protected EditPartFactory createEditPartFactory() {
-		return new ActivityDetailDiagramEditPartFactory();
-		// return new EditPartFactory() {
-		//
-		// public EditPart createEditPart(EditPart context, Object model) {
-		// if(model instanceof ActivityDetailDiagram) {
-		// return new ActivityDetailDiagramEditPart((ActivityDetailDiagram)
-		// model);
-		// }
-		// else if(model instanceof RoleTaskComposite) {
-		// return new RoleTaskCompositeEditPart((RoleTaskComposite) model);
-		// }
-		// else if(model instanceof WorkProductComposite){
-		// return new WorkProductCompositeEditPart((WorkProductComposite)
-		// model);
-		// }
-		// else if(model instanceof RoleNode
-		// || model instanceof TaskNode
-		// || model instanceof WorkProductDescriptorNode
-		// )
-		// {
-		// return new DescriptorNodeEditPart((NamedNode) model);
-		// }
-		// else if(model instanceof Link) {
-		// return new LinkEditPart((Link) model);
-		// }
-		// if(model instanceof TypedNode) {
-		// TypedNode node = (TypedNode) model;
-		// switch(node.getType()) {
-		// case TypedNode.START: return new StartNodeEditPart(node);
-		// case TypedNode.END: return new EndNodeEditPart(node);
-		// case TypedNode.DECISION: return new DecisionNodeEditPart(node);
-		// case TypedNode.SYNCH_BAR: return new SynchBarNodeEditPart(node);
-		// case TypedNode.FREE_TEXT: return new FreeTextEditPart(node);
-		// }
-		// }
-		// return null;
-		// }
-		//			
-		// };
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createDiagramEditPart()
-	 */
-	protected EditPart createDiagramEditPart() {
-		return new ActivityDetailDiagramEditPart(ModelFactory.eINSTANCE
-				.createActivityDetailDiagram());
-	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createEditPart(java.lang.Object)
-//	 */
-//	protected EditPart createEditPart(Object e) {
-//		ActivityDetailDiagram diagram = ModelFactory.eINSTANCE
-//				.createActivityDetailDiagram();
-//		diagram.setObject(e);
-//		EditPart part = new ActivityDetailDiagramEditPart(diagram);
-//		part.setModel(diagram);
-//		diagram.addConsumer(this);
-//		return part;
-//	}
-		
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#getPartNamePrefix()
-	 */
-	protected String getPartNamePrefix() {
-		return DiagramUIResources.ActivityDetailDiagram_prefix; 
-	}
-
-	protected PaletteContainer createControlGroup(PaletteRoot root) {
-		initializeCreationFactories();
-
-		PaletteGroup controlGroup = new PaletteGroup("Control Group"); //$NON-NLS-1$
-
-		List entries = new ArrayList();
-
-		ToolEntry tool = new PanningSelectionToolEntry(DiagramUIResources.AbstractDiagram_Select_text, 
-				DiagramUIResources.AbstractDiagram_Select_tooltip
-		);
-		tool.setSmallIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"select_pal16.gif")); //$NON-NLS-1$
-		tool.setLargeIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"select_pal24.gif")); //$NON-NLS-1$
-		entries.add(tool);
-		root.setDefaultEntry(tool);
-
-		tool = new MarqueeToolEntry();
-		tool.setSmallIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"marq_pal16.gif")); //$NON-NLS-1$
-		tool.setLargeIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"marq_pal24.gif")); //$NON-NLS-1$
-		entries.add(tool);
-
-		CombinedTemplateCreationEntry combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.AbstractDiagram_FreeText_text, 
-				DiagramUIResources.AbstractDiagram_FreeText_tooltip, 
-				TemplateConstants.FREE_TEXT, freeTxtNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		controlGroup.addAll(entries);
-		return controlGroup;
-	}
-
-	protected void initializeCreationFactories() {
-		super.initializeCreationFactories();
-
-		if (roleNodeCreationFactory == null) {
-			roleNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					RoleTaskComposite node = ModelFactory.eINSTANCE
-							.createRoleTaskComposite();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					node.setObject(UmaFactory.eINSTANCE.createRoleDescriptor());
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.ROLE_DESCRIPTOR;
-				}
-
-			};
-		}
-		CreationFactory creationFactory = roleNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (taskNodeCreationFactory == null) {
-			taskNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					NamedNode node = ModelFactory.eINSTANCE.createTaskNode();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					node.setObject(UmaFactory.eINSTANCE.createTaskDescriptor());
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.TASK_DESCRIPTOR;
-				}
-
-			};
-		}
-		creationFactory = taskNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (wpdNodeCreationFactory == null) {
-			wpdNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					NamedNode node = ModelFactory.eINSTANCE
-							.createWorkProductDescriptorNode();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					node.setObject(UmaFactory.eINSTANCE
-							.createWorkProductDescriptor());
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.TASK_DESCRIPTOR;
-				}
-
-			};
-		}
-		creationFactory = wpdNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-	}
-
-	/**
-	 * Editor Input
-	 *
-	 */
-	public static class EditorInput extends BreakdownElementEditorInput {
-
-		/**
-		 * @param e
-		 */
-		public EditorInput(Object e, Suppression suppression) {
-			super(e, suppression);
-		}
-
-	}
-
-	/**
-	 * Set focus on the editor
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#setFocus()
-	 */
-	public void setFocus() {
-		super.setFocus();
-		getGraphicalViewer().getContents().refresh();
-		if (!initialCleanUp) {
-			cleanUpDiagram();
-			initialCleanUp = true;
-			// Locked Plugin case: Display generated ADD diagram, Permission denied to save,  
-			// and No dirty flag on editor. 
-			if(TngUtil.isLocked(getMethodElementFromInput())){
-				// Flush all commands, means will not save.
-				getCommandStack().flush();
-				// Fire dirty flag property change, no dirty flag on editor.
-				firePropertyChange(PROP_DIRTY);
-			}
-		}
-	}
-
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL;
-	}
-
-	/**
-	 * Clean diagram
-	 *
-	 */
-	public void cleanUpDiagram() {
-//		MethodElement obj = ((MethodElementEditorInput) getEditorInput())
-//				.getMethodElement();
-		DiagramUpdateService service = new DiagramUpdateService(
-				getGraphicalViewer(), getEditDomain(), getActionRegistry());
-		service.cleanUpDiagram();
-		// if (TngUtil.isGeneralizer(obj,
-		// getExtendAndContributeVariabilityTypes())
-		// && !initialCleanUp) {
-		// initialCleanUp = true;
-		// IAction reset = getActionRegistry().getAction(
-		// ActivityDetailDiagramEditor.RESET_DIAGRAM_LAYOUT);
-		// reset.run();
-		// doSave(new NullProgressMonitor());
-		// }
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#contributeToContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void contributeToContextMenu(IMenuManager menu) {
-		super.contributeToContextMenu(menu);
-
-		boolean canModify = !isReadOnly();
-
-		IAction action = getActionRegistry().getAction(RESET_DIAGRAM_LAYOUT);
-		if (action.isEnabled() && canModify) {
-			menu.insertBefore(DELETE_DIAGRAM, action);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createActions()
-	 */
-	protected void createActions() {
-		super.createActions();
-		Action resetLayoutAction = new Action(
-				DiagramUIResources.ActivityDetailDiagramEditor_ResetDiagramLayout_text) { 
-
-			public void run() {
-				getActionRegistry().getAction(REFRESH).run();
-				if (getGraphicalViewer().getContents() instanceof ActivityDetailDiagramEditPart) {
-					ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-							.getContents();
-					List local = new ArrayList();
-					if(dep.getChildren() != null && !dep.getChildren().isEmpty()){
-						for(Iterator iterator = dep.getChildren().iterator(); iterator.hasNext();){
-							Object next = iterator.next();
-							if(!(next instanceof FreeTextNodeEditPart)){
-								local.add(next);
-							}
-						}
-					}
-					dep.getRecentlyAddedParts().addAll(local);
-					cleanUpDiagram();
-				}
-			}
-
-			public boolean isEnabled() {
-				return getGraphicalViewer().getSelectedEditParts().size() == 0;
-			}
-
-			public String getId() {
-				return RESET_DIAGRAM_LAYOUT;
-			}
-
-		};
-		getActionRegistry().registerAction(resetLayoutAction);
-	}
-
-//	private static Collection extendAndContributeVariabilityTypes = null;
-
-//	private static Collection getExtendAndContributeVariabilityTypes() {
-//		if (extendAndContributeVariabilityTypes == null) {
-//			extendAndContributeVariabilityTypes = new ArrayList();
-//			extendAndContributeVariabilityTypes
-//					.add(VariabilityType.EXTENDS_LITERAL);
-//			extendAndContributeVariabilityTypes
-//					.add(VariabilityType.CONTRIBUTES_LITERAL);
-//		}
-//		return extendAndContributeVariabilityTypes;
-//	}
-	
-	/**
-	 * Break down adapter factory class
-	 */
-	public class BreakdownAdapterFactory
-	{
-		public ConfigurableComposedAdapterFactory wbsAdapterFactory = null;
-		public ConfigurableComposedAdapterFactory tbsAdapterFactory = null;
-		public ConfigurableComposedAdapterFactory wpbsAdapterFactory = null;
-		public ConfigurableComposedAdapterFactory cbsAdapterFactory = null;
-
-		public BreakdownAdapterFactory(MethodConfiguration methodConfig)
-		{
-			// create adapt factories
-			wbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.createWBSComposedAdapterFactory();
-			tbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.createTBSComposedAdapterFactory();
-			wpbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.createWPBSComposedAdapterFactory();
-			cbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.createProcessComposedAdapterFactory();
-
-			// set configuration filter
-			DiagramAdapterFactoryFilter configurator = new DiagramAdapterFactoryFilter(
-					methodConfig, this);
-
-			wbsAdapterFactory.setFilter(configurator);
-			tbsAdapterFactory.setFilter(configurator);
-			wpbsAdapterFactory.setFilter(configurator);
-			cbsAdapterFactory.setFilter(configurator);		}
-		
-		public void clear()
-		{
-			if (wbsAdapterFactory != null) {
-				wbsAdapterFactory.dispose();
-				wbsAdapterFactory = null;
-			}
-
-			if (tbsAdapterFactory != null) {
-				tbsAdapterFactory.dispose();
-				tbsAdapterFactory = null;
-			}
-
-			if (wpbsAdapterFactory != null) {
-				wpbsAdapterFactory.dispose();
-				wpbsAdapterFactory = null;
-			}
-
-			if (cbsAdapterFactory != null) {
-				cbsAdapterFactory.dispose();
-				cbsAdapterFactory = null;
-			}
-		}
-	}
-	
-	/**
-	 * Diagram Adapter factory filter
-	 *
-	 */
-	public class DiagramAdapterFactoryFilter extends ProcessConfigurator
-			implements IAdapterFactoryFilter {
-
-		private ActivityDetailDiagramEditor.BreakdownAdapterFactory factory;
-
-		/*
-		 * Create an instance
-		 */
-		public DiagramAdapterFactoryFilter(MethodConfiguration methodConfig,
-				ActivityDetailDiagramEditor.BreakdownAdapterFactory factory) {
-			super(methodConfig);
-			this.factory = factory;
-		}
-
-		/**
-		 * Return WBS Adapter Factory
-		 */
-		public AdapterFactory getWBSAdapterFactory() {
-			return factory.wbsAdapterFactory;
-		}
-
-		/**
-		 * Return Team Allocation Adapter Factory
-		 */
-		public AdapterFactory getTBSAdapterFactory() {
-			return factory.tbsAdapterFactory;
-		}
-
-		/**
-		 * Return WP Usage Adapter Factory
-		 */
-		public AdapterFactory getWPBSAdapterFactory() {
-			return factory.wpbsAdapterFactory;
-		}
-
-		/**
-		 * Return consolidated view adapter factory
-		 */
-		public AdapterFactory getCBSAdapterFactory() {
-			return factory.cbsAdapterFactory;
-		}
-
-		public boolean accept(Object obj) {
-			return super.accept(obj);
-		}
-	}
-	
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#dispose()
-	 */
-	public void dispose() {
-		if(factory != null){
-			factory.clear();
-		}
-		super.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/BreakdownElementEditorInput.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/BreakdownElementEditorInput.java
deleted file mode 100644
index d330e98..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/BreakdownElementEditorInput.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * Breakdown Element input for an editor
- * 
- * @author Phong Nguyen Le - Oct 7, 2005
- * @since 1.0
- */
-public class BreakdownElementEditorInput extends MethodElementEditorInput {
-
-	private Suppression suppression;
-
-	private BreakdownElementWrapperItemProvider wrapper;
-
-	/**
-	 * Creates an instance
-	 * @param object
-	 */
-	public BreakdownElementEditorInput(Object object, Suppression suppression) {
-		super((MethodElement) TngUtil.unwrap(object));
-		if (object instanceof BreakdownElementWrapperItemProvider) {
-			wrapper = (BreakdownElementWrapperItemProvider) object;
-		}
-		this.suppression = suppression;
-	}
-
-	/**
-	 * @return Returns the suppression.
-	 */
-	public Suppression getSuppression() {
-		return suppression;
-	}
-
-	/**
-	 * @return Returns the wrapper.
-	 */
-	public BreakdownElementWrapperItemProvider getWrapper() {
-		return wrapper;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (getClass().isInstance(obj)) {
-			BreakdownElementEditorInput other = (BreakdownElementEditorInput) obj;
-			return getMethodElement() == other.getMethodElement()
-					&& suppression.getProcess() == other.getSuppression()
-							.getProcess();
-		}
-		return false;
-	}
-	
-	@Override
-	public int hashCode() {
-		int result = super.hashCode();
-		result ^= suppression.getProcess().hashCode();
-		return result;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ColumnDescriptor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ColumnDescriptor.java
deleted file mode 100644
index d0b32c3..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ColumnDescriptor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.io.Serializable;
-
-import org.eclipse.swt.SWT;
-
-/**
- * Column descriptors used for process editors
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ColumnDescriptor implements Serializable {
-
-	private static final long serialVersionUID = 3256718476985970997L;
-
-	public static final int CELL_EDITOR_TYPE_NONE = 0;
-
-	public static final int CELL_EDITOR_TYPE_TEXT = 1;
-
-	public static final int CELL_EDITOR_TYPE_COMBO_BOOLEAN = 2;
-
-	public static final int CELL_EDITOR_TYPE_CHECK_BOOLEAN = 3;
-
-	public String id;
-
-	public String label;
-
-	public int width;
-
-	public boolean resizable;
-
-	public int cellEditorType;
-
-	public int weight;
-
-	public int alignment;
-
-	/**
-	 * 
-	 * @param id
-	 * 			ID of the column
-	 * @param label
-	 * 			Column Name
-	 * @param weight
-	 * 			Column weight
-	 * @param width
-	 * 			Column Width
-	 * @param resizable
-	 * 			Flag to indicate whether column is resizable or not
-	 * @param cellEditorType
-	 * 			Column cell editor type
-	 */
-	public ColumnDescriptor(String id, String label, int weight, int width,
-			boolean resizable, int cellEditorType) {
-		this(id, label, weight, width, resizable, cellEditorType, SWT.LEFT);
-	}
-
-	/**
-	 * Creates an instance
-	 * 
-	 * @param id
-	 * 			ID of the column
-	 * @param label
-	 * 			Column Name
-	 * @param weight
-	 * 			Column weight
-	 * @param width
-	 * 			Column Width
-	 * @param resiable
-	 * 			Flag to indicate whether column is resizable or not
-	 * @param cellEditorType
-	 * 			Column cell editor type
-	 * @param alignment
-	 * 			Column alignment
-	 */
-	public ColumnDescriptor(String id, String label, int weight, int width,
-			boolean resiable, int cellEditorType, int alignment) {
-		this.id = id;
-		this.label = label;
-		this.resizable = resiable;
-		this.weight = weight;
-		this.width = width;
-		this.cellEditorType = cellEditorType;
-		this.alignment = alignment;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ConfigurationEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ConfigurationEditor.java
deleted file mode 100644
index e6d4b1e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ConfigurationEditor.java
+++ /dev/null
@@ -1,155 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.forms.ConfigViewPage;
-import org.eclipse.epf.authoring.ui.forms.ConfigurationDescription;
-import org.eclipse.epf.authoring.ui.forms.ConfigurationPage;
-import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-
-
-/**
- * The Method Configuration editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationEditor extends MethodElementEditor implements IGotoMarker {
-
-	/**
-	 * The editor ID.
-	 */
-	public static final String EDITOR_ID = ConfigurationEditor.class.getName();
-
-	ConfigurationPage configPage = null;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationEditor() {
-		super();
-	}
-
-	/**
-	 * Returns the method configuration associated with this editor.
-	 */
-	public MethodConfiguration getConfiguration() {
-		return ((ConfigurationEditorInput) super.getEditorInput())
-				.getConfiguration();
-	}
-
-	
-	@Override
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		if (input instanceof FileEditorInput) {
-			// probably opened from Problems View
-			// create a ConfigurationEditorInput
-			Resource resource = RefreshJob.getInstance().getResource(((FileEditorInput)input).getFile());
-			MethodElement element = PersistenceUtil.getMethodElement(resource);
-			if (element instanceof MethodConfiguration) {
-				input = new ConfigurationEditorInput((MethodConfiguration)element);
-			}
-		}
-
-		super.init(site, input);
-	}
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
-	 */
-	protected void addPages() {
-		try {
-			addPage(new ConfigurationDescription(this));
-			configPage = new ConfigurationPage(this);
-			addPage(configPage);
-			addPage(new ConfigViewPage(this));
-		} catch (PartInitException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-	/**
-	 * Returns closure for this configuration
-	 * @return closure
-	 */
-	public ConfigurationClosure getClosure() {
-		return configPage.getClosure();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#createInput(org.eclipse.epf.uma.MethodElement)
-	 */
-	protected IEditorInput createInput(MethodElement e) {
-		if(e instanceof MethodConfiguration) {
-			return new ConfigurationEditorInput((MethodConfiguration) e);
-		}
-		return null;
-	}
-	
-	private List<Listener> setFocusListeners = new ArrayList<Listener>();
-	
-	
-	/**
-	 * Add given listener to list of focus listeners
-	 * @param lis
-	 */
-	public void addToSetFocusLiseners(Listener lis) {
-		setFocusListeners.add(lis);
-	}
-	
-    /**
-     * @see org.eclipse.ui.part.MultiPageEditorPart#setFocus()
-     */
-    public void setFocus() {    	
-    	Event e = new Event();
-    	e.data = getActivePageInstance();   	
-    	for (int i=0; i<setFocusListeners.size(); i++) {
-    		Listener lis = (Listener) setFocusListeners.get(i);
-    		lis.handleEvent(e);
-    	}
-    }
-
-    public void gotoMarker(IMarker marker) {
-    	// activate config page
-    	setActivePage(1);
-    	if (configPage != null) {
-    		configPage.gotoMarker(marker);
-    	}
-    }
-    
-    public void doQuickFix(IMarker marker) {
-    	configPage.doQuickFix(marker);
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ConfigurationEditorInput.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ConfigurationEditorInput.java
deleted file mode 100644
index ab7af37..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ConfigurationEditorInput.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-
-/**
- * An editor input for the configuration editor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ConfigurationEditorInput extends MethodElementEditorInput {
-
-	/**
-	 * Creates an instance
-	 * @param config
-	 */
-	public ConfigurationEditorInput(MethodConfiguration config) {
-		// methodConfiguration = config;
-		super(config);
-	}
-
-	/**
-	 * Returns method configuration
-	 */
-	public MethodConfiguration getConfiguration() {
-		// return methodConfiguration;
-		return (MethodConfiguration) super.getMethodElement();
-	}
-
-
-	/**
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return DiagramUIResources.ConfigurationEditorInput_configeditor0; 
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorChooser.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorChooser.java
deleted file mode 100644
index 665c442..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorChooser.java
+++ /dev/null
@@ -1,507 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.ui.editors.IMethodEditor;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Launches a Method editor that is appropriate for a given method element.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class EditorChooser implements IEditorKeeper {
-
-	private static EditorChooser singleton = null;
-
-	/**
-	 * Returns a singleton instance
-	 * 
-	 */
-	public static EditorChooser getInstance() {
-		if (singleton == null) {
-			synchronized (EditorChooser.class) {
-				if (singleton == null) {
-					singleton = new EditorChooser();
-					IEditorKeeper.REFERENCE.setEditorKeeper(singleton);
-				}
-			}
-		}
-		return singleton;
-	}
-
-	public EditorChooser() {
-		
-	}
-	
-	
-	/**
-	 * Opens the respective editor depending on the given Method element object.
-	 * 
-	 * @param obj
-	 *            A Method element.
-	 */
-	public void openEditor(Object obj) {
-		try {
-			obj = ViewHelper.handleDangling(obj);
-			if (obj == null)
-				return;
-
-			obj = LibraryUtil.unwrap(obj);
-
-			ArrayList errors = new ArrayList();
-			if (obj instanceof EObject) {
-				Resource res = ((EObject) obj).eResource();
-				if (res != null && !res.getErrors().isEmpty()) {
-					errors.addAll(res.getErrors());
-				}
-				if (obj instanceof DescribableElement) {
-					Resource presRes = ((DescribableElement) obj)
-							.getPresentation().eResource();
-					if (presRes != null && !presRes.getErrors().isEmpty()) {
-						errors.addAll(presRes.getErrors());
-					}
-				}
-				if (!errors.isEmpty()) {
-					final MultiStatus multiStatus = new MultiStatus(
-							AuthoringUIPlugin.getDefault().getId(),
-							0,
-							AuthoringUIResources.EditorChooser_ResourcesError, null); 
-					for (Iterator iter = errors.iterator(); iter.hasNext();) {
-						Diagnostic e = (Diagnostic) iter.next();
-						IStatus status = new Status(IStatus.WARNING,
-								LibraryPlugin.getDefault().getId(), 0, e
-										.getMessage(), null);
-						multiStatus.add(status);
-					}
-					try {
-						if (AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayConfirmation(
-										AuthoringUIResources.EditorChooser_loaddErrorDlgTitle,
-										AuthoringUIResources.EditorChooser_ResourcesError, 
-										multiStatus) == Dialog.CANCEL) {
-							return;
-						}
-
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-
-			EditorOpener opener = EditorOpenerFactory.getInstance().getOpener(obj);
-			if ( opener != null && opener.canOpen(obj) ) {
-				opener.openEditor(obj);
-			} else if ((obj instanceof MethodPlugin)
-					|| (obj instanceof ContentPackage) || (obj instanceof Role)
-					|| (obj instanceof Task) || (obj instanceof WorkProduct)
-					|| (obj instanceof Guidance) || (obj instanceof Discipline)
-					|| (obj instanceof DisciplineGrouping)
-					|| (obj instanceof Domain)
-					|| (obj instanceof WorkProductType)
-					|| (obj instanceof RoleSet) || (obj instanceof Tool)
-					|| (obj instanceof RoleSetGrouping)
-					|| (obj instanceof MethodLibrary)) {
-				openEditor((MethodElement) obj, MethodElementEditor.EDITOR_ID);
-			} else if (obj instanceof CustomCategory) {
-				CustomCategory custCat = (CustomCategory) obj;
-				if(TngUtil.isRootCustomCategory(custCat)) {
-					return;
-				}
-				openEditor((MethodElement) obj, MethodElementEditor.EDITOR_ID);
-			} else if (obj instanceof ProcessComponent) {
-				openEditor((MethodElement) obj, ProcessEditor.EDITOR_ID);
-
-				// open properties view by default when we open Process Editor
-				try {
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-							.getActivePage().showView(
-									"org.eclipse.ui.views.PropertySheet", null, IWorkbenchPage.VIEW_VISIBLE); //$NON-NLS-1$
-				} catch (PartInitException exception) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(
-							exception);
-				}
-			} else if (obj instanceof Process) {
-				Object container = ((Process) obj).eContainer();
-				if (container instanceof ProcessComponent) {
-					openEditor((MethodElement) container,
-							ProcessEditor.EDITOR_ID);
-				}
-			}else if (obj instanceof MethodConfiguration) {
-				openEditor((MethodConfiguration) obj,
-						ConfigurationEditor.EDITOR_ID);
-			}else if(obj instanceof BreakdownElement){
-				Process process = TngUtil.getOwningProcess((BreakdownElement)obj);
-				Object container = process.eContainer();
-				if (container instanceof ProcessComponent) {
-					openEditor((MethodElement) container,
-							ProcessEditor.EDITOR_ID);
-				}
-			}
-		} catch (Throwable t) {
-			t.printStackTrace();
-			String title = AuthoringUIResources.editors_EditorChooser_systemErrorDialog_title; 
-			String message = AuthoringUIResources.editors_EditorChooser_systemErrorDialog_message; 
-			String reason = AuthoringUIResources.editors_EditorChooser_systemErrorDialog_reason; 
-			MsgDialog dialog = AuthoringUIPlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, message, reason, t);
-		}
-	}
-
-	/**
-	 * Opens the Configuration editor.
-	 * 
-	 * @param config
-	 * @param editorId
-	 */
-	private void openEditor(MethodConfiguration config, String editorId)
-			throws PartInitException {
-		ConfigurationEditorInput editorInput = new ConfigurationEditorInput(
-				config);
-		AuthoringUIPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().openEditor(
-						editorInput, editorId);
-	}
-
-	/**
-	 * Opens the Method editor for the given method element.
-	 * 
-	 * @param element
-	 *            A Method element.
-	 * @param editorId
-	 *            The editor ID.
-	 */
-	private void openEditor(MethodElement element, String editorId)
-			throws PartInitException {
-		MethodElementEditorInput editorInput = new MethodElementEditorInput(
-				element);
-		AuthoringUIPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().openEditor(
-						editorInput, editorId);
-	}
-
-	/**
-	 * Selects (brings to front, but does not give focus) the Method editor for
-	 * the given object. If there is no open editor for the object, does
-	 * nothing.
-	 * 
-	 * @param obj
-	 */
-	public void selectEditor(Object obj) {
-		try {
-			obj = ViewHelper.handleDangling(obj);
-			if (obj == null)
-				return;
-			obj = LibraryUtil.unwrap(obj);
-		} catch (Throwable t) {
-			t.printStackTrace();
-		}
-		IEditorInput editorInput = null;
-		if (obj instanceof MethodConfiguration)
-			editorInput = new ConfigurationEditorInput(
-					(MethodConfiguration) obj);
-		else if (obj instanceof MethodElement)
-			editorInput = new MethodElementEditorInput((MethodElement) obj);
-		if (editorInput != null) {
-			IWorkbenchPage page = AuthoringUIPlugin.getDefault().getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage();
-			IEditorPart editorPart = page.findEditor(editorInput);
-			if (editorPart != null)
-				page.bringToTop(editorPart);
-		}
-	}
-
-	/**
-	 * 
-	 * Returns selected editor input
-	 * @return The object which the currently selected Method editor is editing (or
-	 *         null if there is no editor or if the editor is not a Method editor).
-	 */
-	public Object getActiveMethodEditorInput() {
-		IEditorPart editorPart = AuthoringUIPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		return getMethodEditorInput(editorPart);
-	}
-
-	public Object getMethodEditorInput(IEditorPart editorPart) {
-		if (editorPart != null) {
-			IEditorInput editorInput = editorPart.getEditorInput();
-			if (editorInput instanceof ConfigurationEditorInput)
-				return ((ConfigurationEditorInput) editorInput)
-						.getConfiguration();
-			if (editorInput instanceof MethodElementEditorInput)
-				return ((MethodElementEditorInput) editorInput)
-						.getMethodElement();
-		}
-		return null;
-	}
-
-	/**
-	 * Closes the Method editor for the given Method element.
-	 * 
-	 * @param obj
-	 *            A Method element.
-	 */
-	public void closeEditor(Object obj) {
-		try {
-			IEditorPart editor = findEditor(obj);
-			if (editor != null) {
-				AuthoringUIPlugin.getDefault().getWorkbench()
-						.getActiveWorkbenchWindow().getActivePage()
-						.closeEditor(editor, false);
-			}
-		} catch (NullPointerException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-	
-	public IEditorPart findEditor(Object obj) {
-		try {
-			MethodElementEditorInput editorInput = new MethodElementEditorInput(
-					(MethodElement) obj);
-			IEditorPart editor = AuthoringUIPlugin.getDefault().getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage().findEditor(
-							editorInput);
-			return editor;
-		} catch (NullPointerException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns list of dirty editors for the given elements
-	 * @param elements
-	 * @return	List of dirty editor
-	 */
-	public Collection getElementsWithDirtyEditor(Collection elements) {
-		ArrayList result = new ArrayList();
-
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		// ArrayList closeEditorRefs = new ArrayList();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null && editor.isDirty()) {
-				IEditorInput input = editor.getEditorInput();
-				MethodElement element = null;
-				if (input instanceof MethodElementEditorInput) {
-					element = ((MethodElementEditorInput) input)
-							.getMethodElement();
-				} else if (input instanceof ConfigurationEditorInput) {
-					element = ((ConfigurationEditorInput) input)
-							.getConfiguration();
-				}
-				if (element != null) {
-					for (Iterator iter = elements.iterator(); iter.hasNext();) {
-						Object e = iter.next();
-						if (e == element || UmaUtil.isContainedBy(element, e)) {
-							result.add(element);
-							iter.remove();
-						}
-					}
-				}
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Closes the all open Method editors ofor the given (deleted) element and
-	 * all of its children and grand children.
-	 * 
-	 * @param e
-	 *            the deleted MethodElement
-	 */
-	public void closeEditorsOnDeletion(Object e) {
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		ArrayList closeEditorRefs = new ArrayList();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				MethodElement element = null;
-				if (input instanceof MethodElementEditorInput) {
-					element = ((MethodElementEditorInput) input)
-							.getMethodElement();
-				} else if (input instanceof ConfigurationEditorInput) {
-					element = ((ConfigurationEditorInput) input)
-							.getConfiguration();
-				}
-				if (element != null
-						&& (element.eContainer() == null || UmaUtil
-								.isContainedBy(element, e))) {
-					closeEditorRefs.add(reference);
-				}
-			}
-		}
-		int size = closeEditorRefs.size();
-		IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			references[i] = (IEditorReference) closeEditorRefs.get(i);
-		}
-		workbenchPage.closeEditors(references, false);
-	}
-	
-	/**
-	 * Closes all Method Editors without saving.
-	 *
-	 */
-	public void closeAllMethodEditors() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		workbench.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-				if (window != null) {
-					IWorkbenchPage workbenchPage = window.getActivePage();
-					List<IEditorReference> closeEditorRefs = getOpenMethodEditors();
-					workbenchPage.closeEditors(closeEditorRefs.toArray(new IEditorReference[closeEditorRefs.size()]), false);
-				}
-			}
-		});
-	}
-	
-	/**
-	 * @return a list of all open Method Editors
-	 */
-	public List<IEditorReference> getOpenMethodEditors() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		final List<IEditorReference> methodEditorRefs = new ArrayList<IEditorReference>();
-		workbench.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-				if (window != null) {
-					IWorkbenchPage workbenchPage = window.getActivePage();
-					IEditorReference[] editorReferences = workbenchPage.getEditorReferences();
-					for (int i = 0; i < editorReferences.length; i++) {
-						IEditorReference reference = editorReferences[i];
-						IEditorPart editorPart = reference.getEditor(false);
-						String editorId = reference.getId();
-						if (editorId.startsWith("org.eclipse.epf") || //$NON-NLS-1$
-								editorPart instanceof IMethodEditor) {
-							methodEditorRefs.add(reference);
-						}
-					}
-				}
-			}
-		});
-		return methodEditorRefs;
-	}
-
-	/**
-	 * Close all MethodEditors associated with the given Plugin.
-	 * Will cause a user-prompt for each dirty editor
-	 * 
-	 */
-	public void closeMethodEditorsForPluginElements(MethodPlugin methodplugin) {
-		if (AuthoringUIPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow() != null
-				&& AuthoringUIPlugin.getDefault().getWorkbench()
-						.getActiveWorkbenchWindow().getActivePage() != null) {
-			IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-			List<IEditorReference> list = getOpenMethodEditors();
-			List<IEditorReference> editorRefsToClose = new ArrayList<IEditorReference>();
-			for (IEditorReference editorReference : list) {
-				IEditorPart editor = editorReference.getEditor(true);
-				if (editor != null) {
-					IEditorInput input = editor.getEditorInput();
-					MethodElement element = null;
-					if (input instanceof MethodElementEditorInput) {
-						element = ((MethodElementEditorInput) input)
-								.getMethodElement();
-					} else if (input instanceof ConfigurationEditorInput) {
-						element = ((ConfigurationEditorInput) input)
-								.getConfiguration();
-					} else if(input instanceof DiagramEditorInputProxy){
-						DiagramEditorInput eInput = ((DiagramEditorInputProxy)input).getDiagramEditorInput();
-						element = eInput.getMethodElement();
-						if(element == null){
-							if(eInput.getWrapper() != null){
-								element = (MethodElement)TngUtil.unwrap(eInput.getWrapper());
-							}
-						}
-					}
-					if (element != null
-							&& (element.eContainer() == null || UmaUtil
-									.isContainedBy(element, methodplugin))) {
-						if (!element.equals(methodplugin))
-							editorRefsToClose.add(editorReference);
-					}
-				}
-			}
-			workbenchPage.closeEditors(editorRefsToClose.toArray(new IEditorReference[editorRefsToClose.size()]), true);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorOpener.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorOpener.java
deleted file mode 100644
index 8bcd4f0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorOpener.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-/**
- * abstract class for editor openenr extension
- * 
- * @author Jinhua Xi
- *
- */
-public abstract class EditorOpener {
-
-	public EditorOpener() {
-		
-	}
-	
-	public abstract boolean canOpen(Object obj);
-	public abstract void openEditor(Object obj) throws Exception ;
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorOpenerFactory.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorOpenerFactory.java
deleted file mode 100644
index 3f1af8b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/EditorOpenerFactory.java
+++ /dev/null
@@ -1,188 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * Manages the Editor Openenr Extensions
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class EditorOpenerFactory {
-
-	/**
-	 * The extension point namespace.
-	 */
-	public static final String EXTENSION_POINT_NAMESPACE = "org.eclipse.epf.authoring.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension point name.
-	 */
-	public static final String EXTENSION_POINT_NAME = "EditorOpener"; //$NON-NLS-1$
-
-	/**
-	 * The "class" attribute name.
-	 */
-	public static final String CLASS_ATTRIB_NAME = "class"; //$NON-NLS-1$
-
-	/**
-	 * The "id" attribute name.
-	 */
-	public static final String ID_ATTRIB_NAME = "id"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static EditorOpenerFactory instance = null;
-
-	// A map of library manager configuration elements.
-	private Map<String, EditorOpenerElement> openerElements = new HashMap<String, EditorOpenerElement>();
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static synchronized EditorOpenerFactory getInstance() {
-		if (instance == null) {
-			instance = new EditorOpenerFactory();
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private EditorOpenerFactory() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		// Process the "org.eclipse.epf.library.libraryManagers" extension point
-		// contributors.
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				EXTENSION_POINT_NAMESPACE, EXTENSION_POINT_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String className = configElement
-								.getAttribute(CLASS_ATTRIB_NAME);
-						String id = configElement
-								.getAttribute(ID_ATTRIB_NAME);
-						if (className != null && className.trim().length() > 0
-								&& id != null && id.trim().length() > 0) {							
-							EditorOpenerElement provider = openerElements.get(id);
-							if(provider == null ) {
-								provider = new EditorOpenerElement(
-										bundle, className, id);
-								openerElements.put(id, provider);
-							}
-						}
-					} catch (Exception e) {
-						LibraryPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-
-	public EditorOpener getOpener(Object obj) {
-		if ( obj instanceof MethodElement ) {
-			MethodElement e = ((MethodElement)obj);
-			
-			while (e != null ) {
-				List props = e.getMethodElementProperty();
-				if ( props != null && props.size() > 0 ) {
-					for (Iterator itp = props.iterator(); itp.hasNext(); ) {
-						MethodElementProperty prop = (MethodElementProperty)itp.next();
-						String id = prop.getName();
-						EditorOpener opener= createExtension(id);
-						if ( opener != null ) {						
-							return opener;
-						}
-					}
-				}	
-				
-				if ( e instanceof MethodPlugin) {
-					break;
-				}
-				
-				// try if the id is defined in the plugin
-				e = LibraryUtil.getMethodPlugin(e);
-			}
-		}
-
-		return null;
-	}
-	
-	public boolean hasExtension(String id) {
-		return openerElements.containsKey(id);
-	}
-	
-	/**
-	 * Creates layout extension.
-	 * 
-	 * @param id the extension id
-	 * @return LayoutExtension
-	 */
-	private EditorOpener createExtension(String id) {
-		
-		if ( !hasExtension(id) ) {
-			return null;
-		}
-		
-		EditorOpenerElement provider = (EditorOpenerElement) openerElements.get(id);
-		try {
-			Class clazz = provider.bundle.loadClass(provider.className);
-			return (EditorOpener) clazz.newInstance();
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-		}
-		
-		return null;
-	}
-
-	private class EditorOpenerElement {
-		Bundle bundle;
-		String className;
-		String id;
-		private EditorOpenerElement(Bundle bundle, String className, String id) {
-			this.bundle = bundle;
-			this.className = className;
-			this.id = id;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/GraphicalWPDependencyEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/GraphicalWPDependencyEditor.java
deleted file mode 100644
index b591b21..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/GraphicalWPDependencyEditor.java
+++ /dev/null
@@ -1,329 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.gef.edit.DiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.WPDiagramEditPartFactory;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.palette.ConnectionCreationToolEntry;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PaletteSeparator;
-import org.eclipse.gef.palette.PanningSelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-
-/**
- * An editor for graphical work product depenedency diagram
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0 
- */
-public class GraphicalWPDependencyEditor extends AbstractDiagramEditor {
-
-	private CreationFactory wpNodeCreationFactory;
-
-//	private IPropertySheetEntry rootEntry;
-
-	private static final String CREATE_WP_NODE = "create_workproduct_descriptor_node"; //$NON-NLS-1$
-
-	/*
-	 * Create an instance
-	 */
-	public GraphicalWPDependencyEditor() {
-		super();
-	}
-
-	protected void initializeCreationFactories() {
-		super.initializeCreationFactories();
-
-		if (wpNodeCreationFactory == null) {
-			wpNodeCreationFactory = new CreationFactory() {
-				public Object getNewObject() {
-					WorkProductNode node = ModelFactory.eINSTANCE
-							.createWorkProductNode();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					WorkProductDescriptor wpd = UmaFactory.eINSTANCE
-							.createWorkProductDescriptor();
-					node.setDiagram(diagram);
-					node.setObject(wpd);
-					return node;
-				}
-
-				public Object getObjectType() {
-
-					return TemplateConstants.WORK_PRODUCT;
-				}
-			};
-		}
-		CreationFactory creationFactory = wpNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void contributeToContextMenu(IMenuManager menu) {
-		super.contributeToContextMenu(menu);
-
-		boolean canModify = !isReadOnly();
-
-		// IAction action = getActionRegistry().getAction(PROPERTIES_PAGE);
-		// if(action.isEnabled()) {
-		// menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		// }
-		IAction action = getActionRegistry().getAction(CREATE_WP_NODE);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-	}
-
-	protected void createActions() {
-		super.createActions();
-		// ActionRegistry registry = getActionRegistry();
-		// IAction action;
-		//
-		// action = new Action("Show &Properties View") {
-		// public String getId() {
-		// return PROPERTIES_PAGE;
-		// }
-		// public void run() {
-		// try {
-		//
-		// getSite().getPage().showView(
-		// "org.eclipse.ui.views.PropertySheet");
-		// // setId("Show_Properties");
-		// }
-		// catch (PartInitException exception) {
-		// //AuthoringPlugin.getDefault().getLogger().logError(exception);
-		// }
-		// }
-		// public boolean isEnabled() {
-		// List editParts = getGraphicalViewer().getSelectedEditParts();
-		// return (editParts.size() == 1 && editParts.get(0) instanceof
-		// EditPart);
-		// }
-		// };
-		//		
-		// registry.registerAction(action);
-
-		IAction action = createAnAction(
-				DiagramUIResources.AbstractDiagram_WorkProductDescriptor_text, wpNodeCreationFactory, 
-				CREATE_WP_NODE,
-				DiagramUIResources.AbstractDiagram_WorkProductDescriptor_tooltip, 
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"full/obj16/WorkProductDescriptor.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-	}
-
-	protected PaletteContainer createControlGroup(PaletteRoot root) {
-		initializeCreationFactories();
-		PaletteGroup controlGroup = new PaletteGroup("Control Group"); //$NON-NLS-1$
-
-		List entries = new ArrayList();
-
-		ToolEntry tool = new PanningSelectionToolEntry(DiagramUIResources.AbstractDiagram_Select_text, 
-				DiagramUIResources.AbstractDiagram_Select_tooltip
-		);
-		tool.setSmallIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"select_pal16.gif")); //$NON-NLS-1$
-		tool.setLargeIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"select_pal24.gif")); //$NON-NLS-1$
-		entries.add(tool);
-		root.setDefaultEntry(tool);
-
-		tool = new MarqueeToolEntry();
-		tool.setSmallIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"marq_pal16.gif")); //$NON-NLS-1$
-		tool.setLargeIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"marq_pal24.gif")); //$NON-NLS-1$
-		entries.add(tool);
-
-		tool = new ConnectionCreationToolEntry(
-				DiagramUIResources.AbstractDiagram_Link_text, DiagramUIResources.AbstractDiagram_Link_tooltip, 
-				null, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"link_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"link_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(tool);
-		CombinedTemplateCreationEntry combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.AbstractDiagram_FreeText_text, 
-				DiagramUIResources.AbstractDiagram_FreeText_tooltip, 
-				TemplateConstants.FREE_TEXT, freeTxtNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		PaletteSeparator sep = new PaletteSeparator(
-				GraphicalWPDependencyEditor.class.getName() + "sep1"); //$NON-NLS-1$
-		sep
-				.setUserModificationPermission(PaletteEntry.PERMISSION_NO_MODIFICATION);
-		entries.add(sep); 
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.AbstractDiagram_WorkProductDescriptor_text, 
-				DiagramUIResources.AbstractDiagram_WorkProductDescriptor_tooltip, 
-				TemplateConstants.WORK_PRODUCT, wpNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"full/obj16/WorkProductDescriptor.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"full/obj16/WorkProductDescriptor.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-		controlGroup.addAll(entries);
-		return controlGroup;
-	}
-
-	protected EditPartFactory createEditPartFactory() {
-		return new WPDiagramEditPartFactory();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createDiagramEditPart()
-	 */
-	protected EditPart createDiagramEditPart() {
-		 DiagramEditPart editPart = new DiagramEditPart(ModelFactory.eINSTANCE
-				.createWorkProductDependencyDiagram());
-		 editPart.markDirty(true);
-		 return editPart;
-	}
-	
-//	protected EditPart createEditPart(Object e) {
-//		WorkProductDependencyDiagram diagram = ModelFactory.eINSTANCE
-//				.createWorkProductDependencyDiagram();
-//		diagram.setObject(e);
-//		EditPart part = new DiagramEditPart(diagram);
-//		part.setModel(diagram);
-//		diagram.addConsumer(this);
-//		return part;
-//	}
-
-	protected String getPartNamePrefix() {
-		return DiagramUIResources.WorkProductDependencyDiagram_prefix; 
-	}
-
-	/**
-	 * An editor input 
-	 *
-	 *
-	 */
-	/**
-	 * @author shilpat
-	 *
-	 */
-	public class EditorInput implements IEditorInput {
-
-		/**
-		 * @param e
-		 */
-		public EditorInput(MethodElement e) {
-		}
-
-		/**
-		 * @see org.eclipse.ui.IEditorInput#exists()
-		 */
-		public boolean exists() {
-			return false;
-		}
-
-		/**
-		 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-		 */
-		public ImageDescriptor getImageDescriptor() {
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.ui.IEditorInput#getName()
-		 */
-		public String getName() {
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.ui.IEditorInput#getPersistable()
-		 */
-		public IPersistableElement getPersistable() {
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-		 */
-		public String getToolTipText() {
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-		 */
-		public Object getAdapter(Class type) {
-			// if (type.equals(IPropertySheetPage.class)) {
-			// return getPropertySheetPage();
-			// }else
-			return null;
-		}
-
-//		private Object getPropertySheetPage() {
-//
-//			if (rootEntry == null) {
-//				// create a new root
-//				PropertySheetEntry root = new PropertySheetEntry();
-//				rootEntry = root;
-//			}
-//			if (rootEntry instanceof PropertySheetEntry) {
-//				// = wpEditPart.getViewer();
-//				// ISelectionProvider provider = new
-//				// AdapterFactoryContentProvider(WP);
-//				// ((PropertySheetEntry) rootEntry).setPropertySourceProvider();
-//			}
-//			return rootEntry;
-//		}
-	}
-
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/GraphicalWorkflowEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/GraphicalWorkflowEditor.java
deleted file mode 100644
index e68a351..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/GraphicalWorkflowEditor.java
+++ /dev/null
@@ -1,871 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.gef.edit.ActivityDiagramEditPart;
-import org.eclipse.epf.authoring.gef.edit.ActivityDiagramEditPartFactory;
-import org.eclipse.epf.authoring.gef.util.DiagramUIResources;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.palette.ConnectionCreationToolEntry;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PaletteSeparator;
-import org.eclipse.gef.palette.PanningSelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-
-/**
- * An editor for graphical workflow
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class GraphicalWorkflowEditor extends AbstractDiagramEditor {
-
-	private static final String OPEN_WORKFLOW_DETAIL_DIAGRAM = "open_workflow_detail_diagram"; //$NON-NLS-1$
-
-	private static final String CREATE_START_NODE = "create_start_node"; //$NON-NLS-1$
-
-	private static final String CREATE_END_NODE = "create_end_node"; //$NON-NLS-1$
-
-	private static final String CREATE_SYNC_BAR = "create_sync_bar"; //$NON-NLS-1$
-
-	private static final String CREATE_DECISION_BAR = "create_decision_bar"; //$NON-NLS-1$
-
-	private static final String CREATE_ACTIVITY = "create_activity"; //$NON-NLS-1$
-
-	private static final String CREATE_PHASE = "create_phase"; //$NON-NLS-1$
-
-	private static final String CREATE_ITERATION = "create_iteration"; //$NON-NLS-1$
-
-	private static final String CREATE_TASK_DESCRIPTOR = "create_task_descriptor"; //$NON-NLS-1$
-
-	private CreationFactory activityNodeCreationFactory;
-
-	private CreationFactory phaseNodeCreationFactory;
-
-	private CreationFactory iterationNodeCreationFactory;
-
-	private CreationFactory synchBarCreationFactory;
-
-	private CreationFactory decisionNodeCreationFactory;
-
-	private CreationFactory startNodeCreationFactory;
-
-	private CreationFactory endNodeCreationFactory;
-
-	private CreationFactory taskDescriptorNodeCreationFactory;
-
-	/**
-	 * Create an instance
-	 */
-	public GraphicalWorkflowEditor() {
-		super();
-	}
-
-	protected void initializeCreationFactories() {
-		super.initializeCreationFactories();
-
-		if (activityNodeCreationFactory == null)
-			activityNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					// ActivityNode node =
-					// ModelFactory.eINSTANCE.createActivityNode();
-					WorkBreakdownElementNode node = ModelFactory.eINSTANCE
-							.createWorkBreakdownElementNode();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					node.setDiagram(diagram);
-					node.setObject(UmaFactory.eINSTANCE.createActivity());
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.ACTIVITY;
-				}
-
-			};
-		CreationFactory creationFactory = activityNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (phaseNodeCreationFactory == null)
-			phaseNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					// ActivityNode node =
-					// ModelFactory.eINSTANCE.createActivityNode();
-					WorkBreakdownElementNode node = ModelFactory.eINSTANCE
-							.createWorkBreakdownElementNode();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					node.setDiagram(diagram);
-					node.setObject(UmaFactory.eINSTANCE.createPhase());
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.PHASE;
-				}
-
-			};
-		creationFactory = phaseNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (iterationNodeCreationFactory == null)
-			iterationNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					// ActivityNode node =
-					// ModelFactory.eINSTANCE.createActivityNode();
-					WorkBreakdownElementNode node = ModelFactory.eINSTANCE
-							.createWorkBreakdownElementNode();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					node.setDiagram(diagram);
-					node.setObject(UmaFactory.eINSTANCE.createIteration());
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.ITERATION;
-				}
-
-			};
-		creationFactory = iterationNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (synchBarCreationFactory == null)
-			synchBarCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					TypedNode node = ModelFactory.eINSTANCE.createTypedNode();
-					node.setType(TypedNode.SYNCH_BAR);
-					node.setObject(GraphicalDataHelper
-							.newTypedGraphNode(TypedNode.SYNCH_BAR));
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.SYNCH_BAR;
-				}
-
-			};
-		creationFactory = synchBarCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (decisionNodeCreationFactory == null)
-			decisionNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					TypedNode node = ModelFactory.eINSTANCE.createTypedNode();
-					node.setType(TypedNode.DECISION);
-					node.setObject(GraphicalDataHelper
-							.newTypedGraphNode(TypedNode.DECISION));
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.DECISION_NODE;
-				}
-
-			};
-		creationFactory = decisionNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (startNodeCreationFactory == null)
-			startNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					TypedNode node = ModelFactory.eINSTANCE.createTypedNode();
-					node.setType(TypedNode.START);
-					node.setObject(GraphicalDataHelper
-							.newTypedGraphNode(TypedNode.START));
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.START_NODE;
-				}
-
-			};
-		creationFactory = startNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (endNodeCreationFactory == null)
-			endNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					TypedNode node = ModelFactory.eINSTANCE.createTypedNode();
-					node.setType(TypedNode.END);
-					node.setObject(GraphicalDataHelper
-							.newTypedGraphNode(TypedNode.END));
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.END_NODE;
-				}
-
-			};
-		creationFactory = endNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-
-		if (taskDescriptorNodeCreationFactory == null)
-			taskDescriptorNodeCreationFactory = new CreationFactory() {
-
-				public Object getNewObject() {
-					WorkBreakdownElementNode node = ModelFactory.eINSTANCE
-							.createWorkBreakdownElementNode();
-					Diagram diagram = (Diagram) editPart.getModel();
-					node.setUMADiagram(diagram.getUMADiagram());
-					node.setDiagram(diagram);
-					node.setObject(UmaFactory.eINSTANCE.createTaskDescriptor());
-					return node;
-				}
-
-				public Object getObjectType() {
-					return TemplateConstants.TASK_DESCRIPTOR;
-				}
-
-			};
-		creationFactory = taskDescriptorNodeCreationFactory;
-		templateNameToCreationFactoryMap.put(creationFactory.getObjectType(),
-				creationFactory);
-	}
-
-	protected void contributeToContextMenu(IMenuManager menu) {
-		super.contributeToContextMenu(menu);
-
-		boolean canModify = !isReadOnly();
-
-		menu.insertAfter(GEFActionConstants.MB_ADDITIONS, new Separator(
-				GEFActionConstants.MB_ADDITIONS));
-
-		IAction action = getActionRegistry().getAction(
-				OPEN_WORKFLOW_DETAIL_DIAGRAM);
-		if (action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-		menu.insertAfter(GEFActionConstants.MB_ADDITIONS, new Separator(
-				GEFActionConstants.MB_ADDITIONS));
-
-		action = getActionRegistry().getAction(CREATE_START_NODE);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-
-		// action = getActionRegistry().getAction(CREATE_FREE_TEXT);
-		// if(action.isEnabled()) {
-		// menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		// }
-
-		action = getActionRegistry().getAction(CREATE_SYNC_BAR);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-
-		action = getActionRegistry().getAction(CREATE_DECISION_BAR);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-
-		action = getActionRegistry().getAction(CREATE_END_NODE);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-		menu.insertAfter(GEFActionConstants.MB_ADDITIONS, new Separator(
-				GEFActionConstants.MB_ADDITIONS));
-
-		action = getActionRegistry().getAction(CREATE_ACTIVITY);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-		action = getActionRegistry().getAction(CREATE_ITERATION);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-
-		action = getActionRegistry().getAction(CREATE_PHASE);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-
-		action = getActionRegistry().getAction(CREATE_TASK_DESCRIPTOR);
-		if (action.isEnabled() && canModify) {
-			menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, action);
-		}
-	}
-
-	protected void createActions() {
-		super.createActions();
-
-		// Open workflow detail action
-		//
-		IAction action = new Action(
-				DiagramUIResources.ActivityDiagram_openActivityDetailDiagram_text) { 
-			public String getId() {
-				return OPEN_WORKFLOW_DETAIL_DIAGRAM;
-			}
-
-			public void run() {
-				try {
-					try {
-						EditPart selectedEditPart = (EditPart) getGraphicalViewer()
-								.getSelectedEditParts().get(0);
-						IEditorPart parent = getSite().getPage()
-								.getActiveEditor();
-						IEditorInput input = new ActivityDetailDiagramEditor.EditorInput(
-								(MethodElement) ((Node) selectedEditPart
-										.getModel()).getObject(),
-								((Diagram) editPart.getModel())
-										.getSuppression());
-						IEditorPart part = getSite()
-								.getPage()
-								.openEditor(
-										input,
-										ProcessEditor.ACTIVITY_DETAIL_DIAGRAM_EDITOR_ID);
-						if (part instanceof AbstractDiagramEditor) {
-							AbstractDiagramEditor editor = (AbstractDiagramEditor) part;
-							editor.setParentEditor(parent);
-						}
-					} catch (PartInitException exception) {
-						exception.printStackTrace();
-					}
-				} catch (RuntimeException e) {
-					e.printStackTrace();
-				}
-			}
-
-			public boolean isEnabled() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() != 1)
-					return false;
-				EditPart editPart = (EditPart) editParts.get(0);
-				return (editPart.getModel() instanceof WorkBreakdownElementNode && ((LinkedObject) editPart
-						.getModel()).getObject() instanceof Activity);
-			}
-		};
-		getActionRegistry().registerAction(action);
-
-		// IAction startNodeAction = new Action(DiagramUIResources.
-		// getString("DiagramUI.ActivityDiagram.StartNode.text")){ //$NON-NLS-1$
-		//			
-		// public void run(){
-		// CreateRequest request = new CreateRequest();
-		// //CreationFactory factory = getFactory(template);
-		// if (startNodeCreationFactory == null)
-		// return;
-		// request.setFactory(startNodeCreationFactory);
-		// request.setLocation(new Point(10,10));
-		//				
-		// if (request.getNewObject() instanceof Node) {
-		// Point loc = request.getLocation();
-		// //((GraphicalEditPart)getHost()).getFigure().translateToRelative(loc);
-		// Diagram parent = (Diagram)editPart.getModel();
-		// org.eclipse.gef.commands.Command c = new
-		// CreateNodeCommand((Node)request.getNewObject(),
-		// parent, loc);
-		// getCommandStack().execute(c);
-		// }
-		// }
-		// public String getId(){
-		// return CREATE_START_NODE;
-		// }
-		// public boolean isEnabled(){
-		// return true;
-		// }
-		// public String getToolTipText() {
-		// return
-		// DiagramUIResources.getString("DiagramUI.ActivityDiagram.StartNode.tooltip");
-		// }
-		//			
-		// };
-		// getActionRegistry().registerAction(startNodeAction);
-		//		
-		//		
-		// IAction endNodeAction = new Action(DiagramUIResources.
-		// getString("DiagramUI.ActivityDiagram.EndNode.text")){ //$NON-NLS-1$
-		//			
-		// public void run(){
-		// CreateRequest request = new CreateRequest();
-		// if (endNodeCreationFactory == null)
-		// return;
-		// request.setFactory(endNodeCreationFactory);
-		// request.setLocation(new Point(10,10));
-		//				
-		// if (request.getNewObject() instanceof Node) {
-		// Point loc = request.getLocation();
-		// Diagram parent = (Diagram)editPart.getModel();
-		// org.eclipse.gef.commands.Command c = new
-		// CreateNodeCommand((Node)request.getNewObject(),
-		// parent, loc);
-		// getCommandStack().execute(c);
-		// }
-		// }
-		// public String getId(){
-		// return CREATE_END_NODE;
-		// }
-		// public boolean isEnabled(){
-		// return true;
-		// }
-		// public String getToolTipText() {
-		// return
-		// DiagramUIResources.getString("DiagramUI.ActivityDiagram.EndNode.tooltip");
-		// }
-		// };
-		// getActionRegistry().registerAction(endNodeAction);
-		//		
-		// IAction syncBarAction = new Action(DiagramUIResources.
-		// getString("DiagramUI.ActivityDiagram.SyncBar.text")){ //$NON-NLS-1$
-		//			
-		// public void run(){
-		// CreateRequest request = new CreateRequest();
-		// //CreationFactory factory = getFactory(template);
-		// if (synchBarCreationFactory == null)
-		// return;
-		// request.setFactory(synchBarCreationFactory);
-		// request.setLocation(new Point(10,10));
-		//				
-		// if (request.getNewObject() instanceof Node) {
-		// Point loc = request.getLocation();
-		// //((GraphicalEditPart)getHost()).getFigure().translateToRelative(loc);
-		// Diagram parent = (Diagram)editPart.getModel();
-		// org.eclipse.gef.commands.Command c = new
-		// CreateNodeCommand((Node)request.getNewObject(),
-		// parent, loc);
-		// getCommandStack().execute(c);
-		// }
-		// }
-		// public String getId(){
-		// return CREATE_SYNC_BAR;
-		// }
-		// public boolean isEnabled(){
-		// return true;
-		// }
-		// public String getToolTipText() {
-		// return
-		// DiagramUIResources.getString("DiagramUI.ActivityDiagram.SyncBar.tooltip");
-		// }
-		//			
-		// };
-		// getActionRegistry().registerAction(syncBarAction);
-		//		
-		//		
-		// IAction decisionBarAction = new Action(DiagramUIResources.
-		// getString("DiagramUI.ActivityDiagram.DecisionBar.text")){
-		// //$NON-NLS-1$
-		//			
-		// public void run(){
-		// CreateRequest request = new CreateRequest();
-		// //CreationFactory factory = getFactory(template);
-		// if (decisionNodeCreationFactory == null)
-		// return;
-		// request.setFactory(decisionNodeCreationFactory);
-		// request.setLocation(new Point(10,10));
-		//				
-		// if (request.getNewObject() instanceof Node) {
-		// Point loc = request.getLocation();
-		// //((GraphicalEditPart)getHost()).getFigure().translateToRelative(loc);
-		// Diagram parent = (Diagram)editPart.getModel();
-		// org.eclipse.gef.commands.Command c = new
-		// CreateNodeCommand((Node)request.getNewObject(),
-		// parent, loc);
-		// getCommandStack().execute(c);
-		// }
-		// }
-		// public String getId(){
-		// return CREATE_DECISION_BAR;
-		// }
-		// public boolean isEnabled(){
-		// return true;
-		// }
-		// public String getToolTipText() {
-		// return
-		// DiagramUIResources.getString("DiagramUI.ActivityDiagram.DecisionBar.tooltip");
-		// }
-		//			
-		// };
-		// getActionRegistry().registerAction(decisionBarAction);
-
-		action = createAnAction(
-				DiagramUIResources.ActivityDiagram_StartNode_text, startNodeCreationFactory, 
-				CREATE_START_NODE,
-				DiagramUIResources.ActivityDiagram_StartNode_tooltip, 
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"stnode_pal16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.AbstractDiagram_FreeText_text, freeTxtNodeCreationFactory, 
-				CREATE_FREE_TEXT,
-				DiagramUIResources.AbstractDiagram_FreeText_tooltip, 
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.ActivityDiagram_SyncBar_text, synchBarCreationFactory, 
-				CREATE_SYNC_BAR, DiagramUIResources.ActivityDiagram_SyncBar_tooltip
-				, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"syncbar_pal16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.ActivityDiagram_DecisionNode_text, decisionNodeCreationFactory, 
-				CREATE_DECISION_BAR,
-				DiagramUIResources.ActivityDiagram_DecisionNode_tooltip
-				, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"decnode_pal16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.ActivityDiagram_EndNode_text, endNodeCreationFactory, 
-				CREATE_END_NODE, DiagramUIResources.ActivityDiagram_EndNode_tooltip
-				, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"endnode_pal16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.ActivityDiagram_Activity_text, activityNodeCreationFactory, 
-				CREATE_ACTIVITY,
-				DiagramUIResources.ActivityDiagram_Activity_tooltip
-				, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"activity16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.ActivityDiagram_Iteration_text, iterationNodeCreationFactory, 
-				CREATE_ITERATION,
-				DiagramUIResources.ActivityDiagram_Iteration_tooltip
-				, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"Iteration16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.ActivityDiagram_Phase_text, phaseNodeCreationFactory, 
-				CREATE_PHASE, DiagramUIResources.ActivityDiagram_Phase_tooltip
-				, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"Phase16.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		action = createAnAction(
-				DiagramUIResources.AbstractDiagram_TaskDescriptor_text, taskDescriptorNodeCreationFactory, 
-				CREATE_TASK_DESCRIPTOR,
-				DiagramUIResources.AbstractDiagram_TaskDescriptor_tooltip
-				, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"TaskDescriptor.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-	}
-
-	/**
-	 * @param event
-	 */
-	protected void handleDoubleClick(Event event) {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-
-		// do nothing if 0 or more than 1 edit parts are selected
-		//
-		if (editParts.size() != 1)
-			return;
-
-		EditPart editPart = (EditPart) editParts.get(0);
-		WorkBreakdownElementNode node = null;
-		if (editPart.getModel() instanceof WorkBreakdownElementNode
-				&& (node = (WorkBreakdownElementNode) editPart.getModel()).getObject() instanceof Activity) {
-			// open activity diagram of the selected activity in a new editor
-			//
-			try {
-				try {
-					BreakdownElementEditorInput editorInput = (BreakdownElementEditorInput) getEditorInput();
-					Object object = node.isReadOnly() ? node.getWrapper() : node.getObject();
-					IEditorInput input = new EditorInput(object, editorInput.getSuppression());
-					IEditorPart parent = getSite().getPage().getActiveEditor();
-					IEditorPart part = getSite().getPage().openEditor(input,
-							ProcessEditor.WORKFLOW_EDITOR_ID);
-					if (part instanceof AbstractDiagramEditor) {
-						AbstractDiagramEditor editor = (AbstractDiagramEditor) part;
-						editor.setParentEditor(parent);
-					}
-				} catch (PartInitException exception) {
-					exception.printStackTrace();
-				}
-			} catch (RuntimeException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	protected PaletteContainer createControlGroup(PaletteRoot root) {
-		initializeCreationFactories();
-
-		PaletteGroup controlGroup = new PaletteGroup("Control Group"); //$NON-NLS-1$
-
-		List entries = new ArrayList();
-
-		ToolEntry tool = new PanningSelectionToolEntry(DiagramUIResources.AbstractDiagram_Select_text, 
-				DiagramUIResources.AbstractDiagram_Select_tooltip
-		);
-		tool.setSmallIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"select_pal16.gif")); //$NON-NLS-1$
-		tool.setLargeIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"select_pal24.gif")); //$NON-NLS-1$
-		entries.add(tool);
-		root.setDefaultEntry(tool);
-
-		tool = new MarqueeToolEntry();
-		tool.setSmallIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"marq_pal16.gif")); //$NON-NLS-1$
-		tool.setLargeIcon(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"marq_pal24.gif")); //$NON-NLS-1$
-		entries.add(tool);
-
-		tool = new ConnectionCreationToolEntry(DiagramUIResources.AbstractDiagram_Link_text, 
-				DiagramUIResources.AbstractDiagram_Link_tooltip, 
-				null, AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"link_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"link_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(tool);
-
-		CombinedTemplateCreationEntry combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.ActivityDiagram_StartNode_text, 
-				DiagramUIResources.ActivityDiagram_StartNode_tooltip, 
-				TemplateConstants.START_NODE, startNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"stnode_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"stnode_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.AbstractDiagram_FreeText_text, 
-				DiagramUIResources.AbstractDiagram_FreeText_tooltip, 
-				TemplateConstants.FREE_TEXT, freeTxtNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"freetext_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.ActivityDiagram_SyncBar_text, 
-				DiagramUIResources.ActivityDiagram_SyncBar_tooltip, 
-				TemplateConstants.SYNCH_BAR, synchBarCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"syncbar_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"syncbar_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.ActivityDiagram_DecisionNode_text, 
-				DiagramUIResources.ActivityDiagram_DecisionNode_tooltip, 
-				TemplateConstants.DECISION_NODE, decisionNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"decnode_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"decnode_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.ActivityDiagram_EndNode_text, 
-				DiagramUIResources.ActivityDiagram_EndNode_tooltip, 
-				TemplateConstants.END_NODE, endNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"endnode_pal16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"endnode_pal24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		PaletteSeparator sep = new PaletteSeparator(
-				GraphicalWorkflowEditor.class.getName() + "sep1"); //$NON-NLS-1$
-		sep
-				.setUserModificationPermission(PaletteEntry.PERMISSION_NO_MODIFICATION);
-		entries.add(sep); 
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.ActivityDiagram_Activity_text, 
-				DiagramUIResources.ActivityDiagram_Activity_tooltip, 
-				TemplateConstants.ACTIVITY, activityNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"activity16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"activity24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.ActivityDiagram_Iteration_text, 
-				DiagramUIResources.ActivityDiagram_Iteration_tooltip, 
-				TemplateConstants.ITERATION, iterationNodeCreationFactory,
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"Iteration16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"activity24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		combined = new CombinedTemplateCreationEntry(DiagramUIResources.ActivityDiagram_Phase_text, 
-				DiagramUIResources.ActivityDiagram_Phase_tooltip, 
-				TemplateConstants.PHASE, phaseNodeCreationFactory,
-				AuthoringUIPlugin.getDefault()
-						.getImageDescriptor("Phase16.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"activity24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		combined = new CombinedTemplateCreationEntry(
-				DiagramUIResources.AbstractDiagram_TaskDescriptor_text, 
-				DiagramUIResources.AbstractDiagram_TaskDescriptor_tooltip, 
-				TemplateConstants.TASK_DESCRIPTOR,
-				taskDescriptorNodeCreationFactory, AuthoringUIPlugin
-						.getDefault().getImageDescriptor("TaskDescriptor.gif"), //$NON-NLS-1$
-				AuthoringUIPlugin.getDefault().getImageDescriptor(
-						"activity24.gif")//$NON-NLS-1$
-		);
-		entries.add(combined);
-
-		controlGroup.addAll(entries);
-		return controlGroup;
-	}
-
-	protected String getPartNamePrefix() {
-		MethodElement e = ((MethodElementEditorInput) getEditorInput())
-				.getMethodElement();
-		if (e instanceof Activity) {
-			return getTypeName((Activity) e) + ": "; //$NON-NLS-1$
-		}
-		return ""; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createDiagramEditPart()
-	 */
-	protected EditPart createDiagramEditPart() {
-		ActivityDiagramEditPart adEditPart = new ActivityDiagramEditPart(ModelFactory.eINSTANCE
-				.createActivityDiagram());
-		adEditPart.markDirty(true);
-		return adEditPart;
-	}
-
-//	protected EditPart createEditPart(Object e) {
-//		ActivityDiagram diagram = ModelFactory.eINSTANCE
-//				.createActivityDiagram();
-//		diagram.setObject(e);
-//		EditPart part = new ActivityDiagramEditPart(diagram);
-//		part.setModel(diagram);
-//		diagram.addConsumer(this);
-//		return part;
-//	}
-
-	private static String getTypeName(Activity act) {
-		if (act instanceof DeliveryProcess) {
-			return DiagramUIResources.ActvitivityDiagram_DeliveryProcess_text; 
-		} else if (act instanceof CapabilityPattern) {
-			return DiagramUIResources.ActvitivityDiagram_CapabilityPattern_text; 
-		} else if (act instanceof Phase) {
-			return DiagramUIResources.ActvitivityDiagram_Phase_tex; 
-		} else if (act instanceof Iteration) {
-			return DiagramUIResources.ActvitivityDiagram_Iteration_text; 
-		}
-		return DiagramUIResources.ActvitivityDiagram_Activity_text; 
-	}
-
-//	private static Image getTypeImage(Object object) {
-//		IItemLabelProvider adapter = (IItemLabelProvider) TngAdapterFactory.INSTANCE
-//				.getWBS_ComposedAdapterFactory().adapt(object,
-//						IItemLabelProvider.class);
-//		if (adapter != null) {
-//			// return new Image(Display.getCurrent(),
-//			// ((URL)adapter.getImage(object)).getContent());
-//		}
-//		return null;
-//	}
-
-	/**
-	 * An editor input for grahical workflow editor
-	 */
-	public static class EditorInput extends BreakdownElementEditorInput {
-
-		/**
-		 * @param e
-		 */
-		public EditorInput(Object e, Suppression suppression) {
-			super(e, suppression);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createEditPartFactory()
-	 */
-	protected EditPartFactory createEditPartFactory() {
-		return new ActivityDiagramEditPartFactory();
-	}
-
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/IEditorKeeper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/IEditorKeeper.java
deleted file mode 100644
index 4697685..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/IEditorKeeper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-/**
- * An interface which manages opening/closing of an editor
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IEditorKeeper {
-
-	/**
-	 * Reference class for editor keeper
-	 *
-	 */
-	public static class Reference {
-		private IEditorKeeper editorKeeper;
-
-		private Reference() {
-
-		}
-
-		public void setEditorKeeper(IEditorKeeper editorKeeper) {
-			this.editorKeeper = editorKeeper;
-		}
-
-		public IEditorKeeper getEditorKeeper() {
-			return editorKeeper;
-		}
-	}
-
-	public static final Reference REFERENCE = new Reference();
-
-	/**
-	 * Open an editor for the given element
-	 * @param object
-	 */
-	void openEditor(Object object);
-
-	/**
-	 * Closes an open editor if element is deleted
-	 * @param object
-	 */
-	void closeEditorsOnDeletion(Object object);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditor.java
deleted file mode 100644
index e626b75..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditor.java
+++ /dev/null
@@ -1,2170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringPerspective;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.actions.LibraryValidateAction;
-import org.eclipse.epf.authoring.ui.forms.ChecklistItemsPage;
-import org.eclipse.epf.authoring.ui.forms.ContentElementGuidancePage;
-import org.eclipse.epf.authoring.ui.forms.ContentPackageDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.CustomCategoryAssignPage;
-import org.eclipse.epf.authoring.ui.forms.CustomCategoryDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.DisciplineDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.DisciplineGroupingDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.DisciplineGroupingDisciplinesPage;
-import org.eclipse.epf.authoring.ui.forms.DisciplineReferenceWorkflowPage;
-import org.eclipse.epf.authoring.ui.forms.DisciplineTasksPage;
-import org.eclipse.epf.authoring.ui.forms.DomainDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.DomainWorkProductsPage;
-import org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.GuidanceWithAttachmentsDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.IExtensionFormPage;
-import org.eclipse.epf.authoring.ui.forms.IRefreshable;
-import org.eclipse.epf.authoring.ui.forms.MethodLibraryDescriptionFormPage;
-import org.eclipse.epf.authoring.ui.forms.MethodPluginDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.PracticeDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.PracticeReferencesPage;
-import org.eclipse.epf.authoring.ui.forms.RoleCategoriesPage;
-import org.eclipse.epf.authoring.ui.forms.RoleDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.RoleSetDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.RoleSetGroupingDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.RoleSetGroupingRoleSets;
-import org.eclipse.epf.authoring.ui.forms.RoleSetRolesPage;
-import org.eclipse.epf.authoring.ui.forms.RoleWorkProductsPage;
-import org.eclipse.epf.authoring.ui.forms.TaskCategoriesPage;
-import org.eclipse.epf.authoring.ui.forms.TaskDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.TaskRolesPage;
-import org.eclipse.epf.authoring.ui.forms.TaskStepsPage;
-import org.eclipse.epf.authoring.ui.forms.TaskWorkProductsPage;
-import org.eclipse.epf.authoring.ui.forms.ToolDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.ToolToolMentorsPage;
-import org.eclipse.epf.authoring.ui.forms.WorkProductCategoriesPage;
-import org.eclipse.epf.authoring.ui.forms.WorkProductDeliverablePartsPage;
-import org.eclipse.epf.authoring.ui.forms.WorkProductDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.WorkProductTypeDescriptionPage;
-import org.eclipse.epf.authoring.ui.forms.WorkProductTypeWorkProductsPage;
-import org.eclipse.epf.authoring.ui.internal.MethodElementEditorErrorTickUpdater;
-import org.eclipse.epf.authoring.ui.providers.MethodEditorPageProvider;
-import org.eclipse.epf.authoring.ui.providers.MethodElementLabelDecorator;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper;
-import org.eclipse.epf.authoring.ui.views.ElementHTMLViewer;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.ActionManager;
-import org.eclipse.epf.library.edit.command.FullyRevertibleCommandStack;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResource;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.persistence.synch.ISynchronizationHelper;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.library.xmi.XMILibraryUtil;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.LibrarySchedulingRule;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPartService;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * The Method Element editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodElementEditor extends AbstractBaseFormEditor implements
-		ISelectionProvider, IGotoMarker {
-
-	protected static class ResourceInfo {
-		long modificationStamp;
-		long loadStamp;		
-		boolean overwrite;
-		boolean adjustLocation; 
-		
-		private Resource resource;		
-		
-		ResourceInfo(Resource resource) {
-			this.resource = resource;
-			refresh();
-		}
-		
-		public void refresh() {
-			modificationStamp = ISynchronizationHelper.INSTANCE.getModificationStamp(resource);
-			if(resource instanceof ILibraryResource) {
-				loadStamp = ((ILibraryResource)resource).getLoadStamp();
-			}
-			else {
-				loadStamp = IResource.NULL_STAMP;
-			}
-		}
-	}
-	
-	/**
-	 * The editor ID.
-	 */
-	public static final String EDITOR_ID = MethodElementEditor.class.getName();
-
-	protected int preview_page_index = -1;
-
-	protected ElementHTMLViewer previewer = null;
-
-	protected MethodElement elementObj = null;
-
-	// The rich text control or editor whose content was last modified before
-	// the Save or Save All button key is selected.
-	protected IMethodRichText modifiedRichText = null;
-
-	protected Adapter nameChangedListener = new AdapterImpl() {
-		public void notifyChanged(org.eclipse.emf.common.notify.Notification msg) {
-			switch (msg.getFeatureID(MethodElement.class)) {
-			case UmaPackage.METHOD_ELEMENT__NAME:
-				nameChanged();
-				break;
-			}
-		}
-	};
-
-	protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
-
-	protected ISelection currentSelection = StructuredSelection.EMPTY;
-
-	protected ActionManager actionMgr;
-
-	private boolean dirty;
-
-	private FailSafeMethodLibraryPersister persister;
-
-	private Collection<Object> widgetsToRestoreValue = new HashSet<Object>();
-
-	private long changeTime = -1;
-
-	public Object widgetToCheck;
-
-	private Object currentFeatureEditor;
-
-	private EStructuralFeature currentEditedFeature;
-
-	protected ArrayList<Resource> removedResources = new ArrayList<Resource>();
-
-	protected ArrayList<Resource> changedResources = new ArrayList<Resource>();
-	
-	protected MethodElementEditorErrorTickUpdater fMethodElementEditorErrorTickUpdater = null;
-	
-	/**
-	 * Listens for workspace changes.
-	 */
-	protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
-		public void resourceChanged(IResourceChangeEvent event) {
-			System.out
-					.println("MethodElementEditor.resourceChanged(): event = " + event); //$NON-NLS-1$
-
-			if (elementObj.eIsProxy()) {
-				return;
-			}
-
-			IResourceDelta delta = event.getDelta();
-			try {
-				class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-					protected Map URIToUsedResourceMap = getURIToUsedResourceMap();
-
-					protected Collection<Resource> changedResources = new ArrayList<Resource>();
-
-					protected Collection<Resource> removedResources = new ArrayList<Resource>();
-
-					public boolean visit(IResourceDelta delta) {
-						if (delta.getFlags() != IResourceDelta.MARKERS
-								&& delta.getResource().getType() == IResource.FILE) {
-							if ((delta.getKind() & (IResourceDelta.CHANGED | IResourceDelta.REMOVED)) != 0) {
-								Resource resource = (Resource) URIToUsedResourceMap
-										.get(URI.createFileURI(delta
-												.getResource().getLocation()
-												.toString()));
-								if (resource != null) {
-									if ((delta.getKind() & IResourceDelta.REMOVED) != 0) {
-										removedResources.add(resource);
-									} else {
-										changedResources.add(resource);
-									}
-								}
-							}
-						}
-
-						return true;
-					}
-
-					public Collection<Resource> getChangedResources() {
-						return changedResources;
-					}
-
-					public Collection<Resource> getRemovedResources() {
-						return removedResources;
-					}
-				}
-
-				ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-				delta.accept(visitor);
-
-				removedResources.addAll(visitor.getRemovedResources());
-				if (!visitor.getRemovedResources().isEmpty() && !isDirty()) {
-					getSite().getShell().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							MethodElementEditor.this.dispose();
-						}
-					});
-				}
-
-				changedResources.addAll(visitor.getChangedResources());
-			} catch (CoreException e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	};
-
-	class ActivationListener implements IPartListener, IWindowListener {
-
-		/** Cache of the active workbench part. */
-		private IWorkbenchPart fActivePart;
-
-		/** Indicates whether activation handling is currently be done. */
-		private boolean fIsHandlingActivation = false;
-
-		/**
-		 * The part service.
-		 * 
-		 * @since 3.1
-		 */
-		private IPartService fPartService;
-
-		/**
-		 * Creates this activation listener.
-		 * 
-		 * @param partService
-		 *            the part service on which to add the part listener
-		 * @since 3.1
-		 */
-		public ActivationListener(IPartService partService) {
-			fPartService = partService;
-			fPartService.addPartListener(this);
-			PlatformUI.getWorkbench().addWindowListener(this);
-		}
-
-		/**
-		 * Disposes this activation listener.
-		 * 
-		 * @since 3.1
-		 */
-		public void dispose() {
-			fPartService.removePartListener(this);
-			PlatformUI.getWorkbench().removeWindowListener(this);
-			fPartService = null;
-		}
-
-		/*
-		 * @see IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
-		 */
-		public void partActivated(IWorkbenchPart part) {
-			fActivePart = part;
-			handleActivation();
-		}
-
-		/*
-		 * @see IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
-		 */
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		/*
-		 * @see IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
-		 */
-		public void partClosed(IWorkbenchPart part) {
-		}
-
-		/*
-		 * @see IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
-		 */
-		public void partDeactivated(IWorkbenchPart part) {
-			fActivePart = null;
-		}
-
-		/*
-		 * @see IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
-		 */
-		public void partOpened(IWorkbenchPart part) {
-			if (part == MethodElementEditor.this) {
-				if (!isInputValid()) {
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayInfo(
-									AuthoringUIResources.editors_MethodElementEditor_invalidEditorTitle, 
-									AuthoringUIResources.editors_MethodElementEditor_invalidEditorMsg); 
-					MethodElementEditor.this.close(false);
-					return;
-				}
-				Collection<Resource> usedResources = getUsedResources();
-				if (ResourceUtil.hasOutOfSynch(usedResources)) {
-					handleFileChanged(usedResources);
-					return;
-				}
-				setResourceInfos(usedResources);
-			}
-		}
-
-		/**
-		 * Handles the activation triggering a element state check in the
-		 * editor.
-		 */
-		private void handleActivation() {
-			if (fIsHandlingActivation || MethodElementEditor.this.disposed)
-				return;
-
-			if (fActivePart == MethodElementEditor.this) {
-				fIsHandlingActivation = true;
-				try {
-					handleActivate(fActivePart);
-				} finally {
-					fIsHandlingActivation = false;
-				}
-			}
-		}
-
-		/*
-		 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
-		 * @since 3.1
-		 */
-		public void windowActivated(IWorkbenchWindow window) {
-			if (window == getEditorSite().getWorkbenchWindow()) {
-				/*
-				 * Workaround for problem described in
-				 * http://dev.eclipse.org/bugs/show_bug.cgi?id=11731 Will be
-				 * removed when SWT has solved the problem.
-				 */
-				window.getShell().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						handleActivation();
-					}
-				});
-			}
-		}
-
-		/*
-		 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
-		 * @since 3.1
-		 */
-		public void windowDeactivated(IWorkbenchWindow window) {
-		}
-
-		/*
-		 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
-		 * @since 3.1
-		 */
-		public void windowClosed(IWorkbenchWindow window) {
-		}
-
-		/*
-		 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
-		 * @since 3.1
-		 */
-		public void windowOpened(IWorkbenchWindow window) {
-		}
-	}
-
-	private ActivationListener activationListener;
-
-	private boolean checkFileChangedRequired = false;
-
-	protected HashSet<Resource> lastUsedResources;
-
-	private boolean disposed;
-
-	protected HashMap<Resource, ResourceInfo> resourceInfoMap;
-
-	private IFile elementFile;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodElementEditor() {
-		super();
-		
-		// moved the details out so that user can override the tick updator
-		// Jinhua Xi 3/15/2007
-		createEditorErrorTickUpdater();
-		createActionManager();
-	}
-	
-	protected void createEditorErrorTickUpdater() {
-		
-		this.fMethodElementEditorErrorTickUpdater = new MethodElementEditorErrorTickUpdater(this);
-	}
-	
-	protected void createActionManager() {
-		actionMgr = new ActionManager() {
-
-			protected FullyRevertibleCommandStack createCommandStack() {
-				return new FullyRevertibleCommandStack(this) {
-					public boolean doExecute(Command command) {
-						// Check modify first.
-						if (command instanceof IResourceAwareCommand) {
-							Collection modifiedResources = ((IResourceAwareCommand) command)
-									.getModifiedResources();
-							if (modifiedResources != null
-									&& !(modifiedResources.isEmpty())) {
-								IStatus status = UserInteractionHelper
-										.checkModify(modifiedResources,
-												getSite().getShell());
-								if (!status.isOK()) {
-									MethodElementEditor.this
-											.handleError(status);
-									return false;
-								}
-							}
-						} else {
-							EObject owner = TngUtil.getOwner(command);
-							if (owner != null) {
-								IStatus status = TngUtil.checkEdit(owner,
-										getSite().getShell());
-								if (!status.isOK()) {
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.display(
-													AuthoringUIResources.errorDialog_title, 
-													AuthoringUIResources.editDialog_msgCannotEdit, 
-													status);
-									return false;
-								}
-							}
-						}
-
-						if (changeTime == -1) {
-							changeTime = System.currentTimeMillis();
-						}
-						boolean ret = super.doExecute(command);
-						if (!ret && changeTime != -1) {
-							changeTime = -1;
-						}
-						return ret;
-					}
-
-				};
-			}
-
-			public boolean doAction(int actionType, EObject object,
-					org.eclipse.emf.ecore.EStructuralFeature feature,
-					Object value, int index) {
-				final IStatus status = TngUtil
-						.checkEdit(object, getSite().getShell());
-				if (status.isOK()) {
-					return super.doAction(actionType, object, feature, value,
-							index);
-				} else {
-					// this might be called from a non-UI thread
-					// so make sure the message dialog will be shown in a UI thread
-					//
-					SafeUpdateController.syncExec(new Runnable() {
-
-						public void run() {
-							AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-									AuthoringUIResources.editDialog_title, 
-									AuthoringUIResources.editDialog_msgCannotEdit, 
-									status);
-						}
-						
-					});
-					return false;
-				}
-			}
-
-			protected void save(Resource resource) {
-				// don't save resource that is changed outside of this editor
-				//
-				if (changedResources.contains(resource)) {
-					return;
-				}
-				
-				boolean canSave;
-				if(resource.getURI().isFile()) {
-					File file = new File(resource.getURI().toFileString());
-					canSave = file.lastModified() > changeTime;
-				}
-				else {
-					canSave = true;
-				}				
-				try {
-					if(canSave) {
-						ILibraryPersister.FailSafeMethodLibraryPersister persister = getPersister();
-						try {
-							persister.save(resource);
-							persister.commit();
-						} catch (Exception e) {
-							AuthoringUIPlugin.getDefault().getLogger()
-							.logError(e);
-							try {
-								persister.rollback();
-							} catch (Exception ex) {
-								ViewHelper
-								.reloadCurrentLibaryOnRollbackError(getEditorSite()
-										.getShell());
-							}
-						}
-					}
-				} finally {
-					changeTime = -1;
-				}
-			}
-		};
-
-		actionMgr.getCommandStack().addCommandStackListener(
-				new CommandStackListener() {
-					public void commandStackChanged(EventObject event) {
-						Display.getDefault().asyncExec(new Runnable() {
-							public void run() {
-								firePropertyChange(IEditorPart.PROP_DIRTY);
-							}
-						});
-					}
-				});
-
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.startListeningTo(actionMgr.getCommandStack());
-		}
-	}
-
-	private void nameChanged() {
-		SafeUpdateController.asyncExec(new Runnable() {
-
-			public void run() {
-				setPartName();
-				if (pages != null) {
-					for (Iterator iter = pages.iterator(); iter.hasNext();) {
-						Object page = iter.next();
-
-						if (page instanceof IRefreshable) {
-							((IRefreshable) page).refreshName(elementObj
-									.getName());
-						}
-					}
-				}
-			}
-			
-		});
-	}
-	
-	public IActionManager getActionManager() {
-		return actionMgr;
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#init(IEditorSite,
-	 *      IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		if (input instanceof FileEditorInput) {
-			// probably opened from Problems View
-			// create a MethodElementEditorInput
-			elementFile = ((FileEditorInput)input).getFile();
-			MethodElement element = PersistenceUtil.getMethodElement(
-					elementFile,
-					LibraryService.getInstance().getCurrentLibraryManager().
-						getEditingDomain().getResourceSet());
-			if (element != null) {
-				input = new MethodElementEditorInput(
-					element);
-			}
-		}
-		setInput(input);
-		site.setSelectionProvider(this);
-		activationListener = new ActivationListener(site.getWorkbenchWindow()
-				.getPartService());
-
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory());
-		Image titleImage = labelProvider.getImage(elementObj);
-		labelProvider.dispose();
-		setTitleImage(titleImage);
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) {
-		super.setInput(input);
-
-		// Get method element object from Editor input.
-		//
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-		elementObj = methodElementInput.getMethodElement();
-
-		setPartName();
-		elementObj.eAdapters().add(nameChangedListener);
-		
-		if (fMethodElementEditorErrorTickUpdater != null)
-			fMethodElementEditorErrorTickUpdater.updateEditorImage(elementObj);
-
-	}
-
-	public void updateResourceInfos(Collection<Resource> resources) {
-		if(resourceInfoMap == null) {
-			resourceInfoMap = new HashMap<Resource, ResourceInfo>();
-		}
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			ResourceInfo info = resourceInfoMap.get(resource);
-			if(info == null) {
-				info = new ResourceInfo(resource);
-				resourceInfoMap.put(resource, info);
-			}
-			else {
-				info.refresh();
-			}
-		}
-		checkFileChangedRequired = true;
-	}
-	
-	public void ovewriteResources(Collection<Resource> resources) {
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			ResourceInfo info = resourceInfoMap.get(resource);
-			if(info != null) {
-				info.overwrite = true;
-			}
-		}		
-	}
-	
-	public void setResourceInfos(Collection<Resource> resources) {
-		if(resourceInfoMap != null && !resourceInfoMap.isEmpty()) {
-			resourceInfoMap.clear();
-		}
-		updateResourceInfos(resources);
-	}
-	
-	private long getLoadStamp(Resource resource) {
-		ResourceInfo info = resourceInfoMap.get(resource);
-		return info != null ? info.loadStamp : IResource.NULL_STAMP;
-	}
-
-	/**
-	 * Checks if there is any resource in the given <code>usedResources</code>
-	 * that has been reloaded since last update of load time stamps by this
-	 * editor
-	 * 
-	 * @param usedResource
-	 * @return
-	 */
-	private boolean checkReloaded(Collection usedResources) {
-		ResourceSet resourceSet = getResourceSet(usedResources);
-		boolean xmi = resourceSet instanceof ILibraryResourceSet 
-			&& ((ILibraryResourceSet)resourceSet).getPersistenceType().equals(Services.XMI_PERSISTENCE_TYPE);
-		for (Iterator iter = usedResources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			if(resource instanceof ILibraryResource) {
-				long oldStamp = getLoadStamp(resource);
-				long currentStamp = ((ILibraryResource)resource).getLoadStamp();
-				if (oldStamp != currentStamp) {
-					if(xmi) {
-						IResource wsRes = FileManager.getResourceForLocation(resource
-								.getURI().toFileString());
-						if (wsRes != null) {
-							return true;
-						}
-					}
-					else {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-	
-	private static ResourceSet getResourceSet(Collection resources) {
-		ResourceSet resourceSet = null;
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			resourceSet = resource.getResourceSet();
-			if (resourceSet != null) {
-				break;
-			}
-		}
-		return resourceSet;
-	}
-	
-	private Collection<Resource> getOutOfSyncResources(Collection<Resource> usedResources) {
-		Collection<Resource> outOfSyncResources = new ArrayList<Resource>();
-		for (Resource resource : usedResources) {
-			if(isOutOfSync(resource)) {
-				outOfSyncResources.add(resource);
-			}
-		}
-		return outOfSyncResources;
-	}
-
-	
-	private boolean isOutOfSync(Resource resource) {
-		ResourceInfo info = resourceInfoMap.get(resource);
-		long stamp = ISynchronizationHelper.INSTANCE.getModificationStamp(resource);
-		if(stamp != IResource.NULL_STAMP) {
-			if(info == null || info.modificationStamp != stamp) {
-				if(ISynchronizationHelper.INSTANCE.isSynchronized(resource)) {
-					// refresh the cached stamp
-					//
-					if(info == null) {
-						resourceInfoMap.put(resource, new ResourceInfo(resource));
-					}
-					else {
-						info.modificationStamp = ISynchronizationHelper.INSTANCE.getModificationStamp(resource); 
-					}						
-					return false;
-				}
-				return true;
-			}
-			else {
-				return false;
-			}
-		}
-		else {
-			return !ISynchronizationHelper.INSTANCE.isSynchronized(resource);
-		}
-	}
-
-	private boolean checkFileChanged(Collection usedResources) {
-		// check resource set type and continue to check for changed file if the
-		// type is XMI
-		//
-		ResourceSet resourceSet = getResourceSet(usedResources);
-		if (resourceSet instanceof ILibraryResourceSet
-				&& ((ILibraryResourceSet) resourceSet).getPersistenceType().equals(Services.XMI_PERSISTENCE_TYPE)) {
-			for (Iterator iter = usedResources.iterator(); iter.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				if(isOutOfSync(resource)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	protected boolean promptReloadFiles() {
-		String title = AuthoringUIResources.editor_error_activated_outofsync_title;
-		String msg = AuthoringUIResources.editor_error_activated_outofsync_message;
-		return AuthoringUIPlugin.getDefault().getMsgDialog().displayPrompt(
-				title, msg);
-	}
-	
-	private boolean handleFileChanged(final Collection<Resource> usedResources) {
-		boolean ret = promptReloadFiles();
-		if (ret) {
-			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-					monitor.beginTask("", 10); //$NON-NLS-1$
-					monitor.subTask(AuthoringUIResources.refresh_text); 
-					monitor.worked(1);
-					try {
-
-						Collection<Resource> removedResources = new ArrayList<Resource>();
-						for (Resource resource : usedResources) {
-							if (!new File(resource.getURI().toFileString())
-									.exists()) {
-								removedResources.add(resource);
-							}
-						}
-						Collection<Resource> changedResources = resourceInfoMap != null ? 
-								getOutOfSyncResources(usedResources) :
-								ResourceUtil.getOutOfSyncResources(usedResources);
-						monitor.worked(2);
-
-						// unload the removed resources
-						//
-						PersistenceUtil.unload(removedResources);
-						monitor.worked(2);
-
-						// Reload the changed resources.
-						ILibraryManager manager = (ILibraryManager) LibraryService
-								.getInstance().getCurrentLibraryManager();
-						if (manager != null) {
-							Collection<Resource> reloadedResources = manager
-									.reloadResources(changedResources);
-							if (!reloadedResources.isEmpty()) {
-								RefreshJob.getInstance()
-										.getReloadedBeforeRefreshResources()
-										.addAll(reloadedResources);
-							}
-
-							if (!removedResources.isEmpty()
-									|| !reloadedResources.isEmpty()) {
-								// save changed resources before refresh so
-								// action
-								// manager will not try to save these changed
-								// resources
-								//
-								MethodElementEditor.this.changedResources
-										.addAll(reloadedResources);
-								MethodElementEditor.this.lastUsedResources
-										.removeAll(removedResources);
-								refresh(true);
-								MethodElementEditor.this.changedResources
-										.clear();
-							}
-						}
-						monitor.worked(4);
-
-						// refresh out-of-synch resources
-						//
-						for (Resource resource : changedResources) {
-							FileManager.getInstance().refresh(resource);
-						}
-						monitor.worked(1);
-					} finally {
-						monitor.done();
-					}
-				}
-
-			};
-
-			try {
-				getSite()
-						.getWorkbenchWindow()
-						.getWorkbench()
-						.getProgressService()
-						.runInUI(
-								new ProgressMonitorDialog(getSite().getShell()),
-								runnable, new LibrarySchedulingRule(LibraryService.getInstance().getCurrentMethodLibrary()));
-			} catch (Exception e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				String title = AuthoringUIResources.ProcessEditor_refreshErrorTitle; 
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						title, e.toString(), e);
-			}
-		} else {
-			checkFileChangedRequired = false;
-		}
-		return ret;
-	}
-
-	public void setPartName() {
-		String partName = elementObj.getName();
-		if (partName == null) {
-			partName = ""; //$NON-NLS-1$
-		}
-		setPartName(partName);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return currentSelection;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		currentSelection = selection;
-
-		for (Iterator listeners = new ArrayList<ISelectionChangedListener>(selectionChangedListeners)
-				.iterator(); listeners.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener
-					.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
-	 */
-	protected void addPages() {
-		try {
-			if (elementObj instanceof MethodLibrary) {
-				addPage(new MethodLibraryDescriptionFormPage(this));
-			} else if (elementObj instanceof MethodPlugin) {
-				addPage(new MethodPluginDescriptionPage(this));
-			} else if (elementObj instanceof ContentPackage) {
-				addPage(new ContentPackageDescriptionPage(this));
-			} else if (elementObj instanceof Role) {
-				addPage(new RoleDescriptionPage(this));
-				addPage(new RoleWorkProductsPage(this));
-				addPage(new ContentElementGuidancePage(this));
-				addPage(new RoleCategoriesPage(this));
-			} else if (elementObj instanceof Task) {
-				addPage(new TaskDescriptionPage(this));
-				addPage(new TaskStepsPage(this));
-				addPage(new TaskRolesPage(this));
-				addPage(new TaskWorkProductsPage(this));
-				addPage(new ContentElementGuidancePage(this));
-				addPage(new TaskCategoriesPage(this));
-			} else if (elementObj instanceof WorkProduct) {
-				addPage(new WorkProductDescriptionPage(this));
-				if (elementObj instanceof Deliverable) {
-					addPage(new WorkProductDeliverablePartsPage(this));
-				}
-				addPage(new ContentElementGuidancePage(this));
-				addPage(new WorkProductCategoriesPage(this));
-			} else if (elementObj instanceof Guidance) {
-				if (TngUtil.isAllowedAttachments(elementObj)) {
-					addPage(new GuidanceWithAttachmentsDescriptionPage(this));
-				} else if (elementObj instanceof Practice) {
-					addPage(new PracticeDescriptionPage(this));
-					addPage(new PracticeReferencesPage(this));
-				} else if (elementObj instanceof Checklist) {
-					addPage(new GuidanceDescriptionPage(this));
-					addPage(new ChecklistItemsPage(this));
-				} else {
-					addPage(new GuidanceDescriptionPage(this));
-				}
-				if (!(elementObj instanceof Practice))
-					addPage(new ContentElementGuidancePage(this));
-			} else if (elementObj instanceof Discipline) {
-				addPage(new DisciplineDescriptionPage(this));
-				addPage(new DisciplineTasksPage(this));
-				addPage(new DisciplineReferenceWorkflowPage(this));
-				addPage(new ContentElementGuidancePage(this));
-			} else if (elementObj instanceof DisciplineGrouping) {
-				addPage(new DisciplineGroupingDescriptionPage(this));
-				addPage(new DisciplineGroupingDisciplinesPage(this));
-			} else if (elementObj instanceof Domain) {
-				addPage(new DomainDescriptionPage(this));
-				addPage(new DomainWorkProductsPage(this));
-				addPage(new ContentElementGuidancePage(this));
-			} else if (elementObj instanceof WorkProductType) {
-				addPage(new WorkProductTypeDescriptionPage(this));
-				addPage(new WorkProductTypeWorkProductsPage(this));
-				addPage(new ContentElementGuidancePage(this));
-			} else if (elementObj instanceof RoleSet) {
-				addPage(new RoleSetDescriptionPage(this));
-				addPage(new RoleSetRolesPage(this));
-				addPage(new ContentElementGuidancePage(this));
-			} else if (elementObj instanceof RoleSetGrouping) {
-				addPage(new RoleSetGroupingDescriptionPage(this));
-				addPage(new RoleSetGroupingRoleSets(this));
-			} else if (elementObj instanceof Tool) {
-				addPage(new ToolDescriptionPage(this));
-				addPage(new ToolToolMentorsPage(this));
-				addPage(new ContentElementGuidancePage(this));
-			} else if (elementObj instanceof CustomCategory) {
-				addPage(new CustomCategoryDescriptionPage(this));
-				addPage(new CustomCategoryAssignPage(this));
-			}
-
-			setPartName(elementObj.getName());
-
-			if (!(elementObj instanceof ContentPackage || elementObj instanceof MethodPlugin))
-				createPreviewPage();
-
-			if (elementObj instanceof Task) {
-				// check for extenstion point and add the page if there
-				List<?> pageProviders = MethodEditorPageProvider.getInstance()
-						.getPageProviders();
-
-				if (pageProviders != null && pageProviders.size() > 0) {
-					try {
-						for (int i = 0; i < pageProviders.size(); i++) {
-							Object page = pageProviders.get(i);
-							if (page instanceof IExtensionFormPage) {
-								IExtensionFormPage formPage = (IExtensionFormPage) page;
-								formPage.setEditor(this);
-							}
-						}
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		} catch (Throwable t) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(t);
-			dispose();
-			if(t instanceof RuntimeException) {
-				throw (RuntimeException)t;
-			}
-			if(t instanceof Error) {
-				throw (Error) t;
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractBaseFormEditor#dispose()
-	 */
-	public void dispose() {
-		try {
-			// ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-			// resourceChangeListener);
-
-			if (activationListener != null) {
-				activationListener.dispose();
-			}
-
-			modifiedRichText = null;
-
-			disposeEditorErrorTickUpdater();
-			
-			ILibraryManager manager = (ILibraryManager) LibraryService
-					.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				manager.stopListeningTo(actionMgr.getCommandStack());
-			}
-
-			if (isDirty()) {
-				actionMgr.undoAll();
-			}
-			actionMgr.dispose();
-			elementObj.eAdapters().remove(nameChangedListener);
-			
-			if(resourceInfoMap != null) {
-				resourceInfoMap.clear();
-				resourceInfoMap = null;				
-			}
-			
-			if(changedResources != null) {
-				changedResources.clear();
-				changedResources = null;
-			}
-			
-			if(selectionChangedListeners != null) {
-				selectionChangedListeners.clear();
-				selectionChangedListeners = null;
-			}
-			
-			if(PerspectiveUtil.isActivePerspective(AuthoringPerspective.PERSPECTIVE_ID)) {
-				// unload all resources of content description that are not used by 
-			}
-			
-			if(lastUsedResources != null) {
-				lastUsedResources.clear();
-				lastUsedResources = null;
-			}						 
-		} finally {
-			super.dispose();
-			disposed = true;
-		}
-	}
-
-	protected void disposeEditorErrorTickUpdater()
-	{
-		if ( fMethodElementEditorErrorTickUpdater != null ) {
-			fMethodElementEditorErrorTickUpdater.dispose();
-			fMethodElementEditorErrorTickUpdater = null;
-		}
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractBaseFormEditor#isDirty()
-	 */
-	public boolean isDirty() {
-		if (dirty)
-			return true;
-		dirty = actionMgr.isSaveNeeded();
-		return dirty;
-	}
-
-	public FailSafeMethodLibraryPersister getPersister() {
-		if (persister == null) {
-			persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-		}
-		return persister;
-	}
-
-	protected Collection<Resource> getModifiedResources() {
-		return actionMgr.getModifiedResources();
-	}
-
-	/**
-	 * Set modified rich text field
-	 * @param modifiedRichText
-	 */
-	public void setModifiedRichText(IMethodRichText modifiedRichText) {
-		this.modifiedRichText = modifiedRichText;
-	}
-
-	/**
-	 * Save modified rich text 
-	 * @param richText
-	 */
-	public void saveModifiedRichText(IMethodRichText richText) {
-		if (richText != null && !richText.isDisposed()
-				&& richText.getModified()) {
-			EObject modalObject = richText.getModalObject();
-			EStructuralFeature modalObjectFeature = richText
-					.getModalObjectFeature();
-			if (modalObject != null && modalObjectFeature != null) {
-				Object oldContent = modalObject.eGet(modalObjectFeature);
-				if (!mustRestoreValue(richText, oldContent)) {
-					Object newContent = richText.getText();
-					richText.setInitialText((String)newContent);
-					if (!newContent.equals(oldContent)) {
-						actionMgr.doAction(IActionManager.SET, modalObject,
-								modalObjectFeature, newContent, -1);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Save last modified rich text 
-	 */
-	public void saveModifiedRichText() {
-		saveModifiedRichText(modifiedRichText);
-	}
-	
-	protected LibraryValidateAction createValidateResourceAction() {
-		return new LibraryValidateAction(false) {
-			/* (non-Javadoc)
-			 * @see org.eclipse.epf.authoring.ui.actions.LibraryValidateAction#refreshViews()
-			 */
-			protected void refreshViews() {
-				LibraryView.getView().refreshViews();
-			}
-		};
-	}
-	
-	public boolean validateResources(Collection modifiedResources) {
-		ArrayList<EObject> elements = new ArrayList<EObject>();
-		for (Iterator iter = modifiedResources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			if (resource instanceof MultiFileXMIResourceImpl) {
-				elements.addAll(resource.getContents());
-			}
-		}
-		LibraryValidateAction validateAction = createValidateResourceAction();
-		validateAction.updateSelection(new StructuredSelection(elements));
-		validateAction.run();
-		return validateAction.isSuccessful();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractBaseFormEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (DEBUG) {
-			System.out
-					.println("MethodElementEditor.doSave: saving changes to method library"); //$NON-NLS-1$
-		}
-
-		saveModifiedRichText(modifiedRichText);
-
-		getPersister();
-		try {
-			// check for modifiable
-			//
-			Collection<Resource> modifiedResources = getModifiedResources();
-			
-			ArrayList<Resource> resourcesToSave = new ArrayList<Resource>(modifiedResources);
-
-			// update version info in library resource if needed by adding
-			// library resource to collection
-			// of modified resources
-			//
-			HashSet<Resource> resourcesToUpdateVersionInfo = new HashSet<Resource>();
-			if (!modifiedResources.isEmpty()) {
-				for (Iterator iter = modifiedResources.iterator(); iter
-						.hasNext();) {
-					Resource resource = (Resource) iter.next();
-					MethodElement me = PersistenceUtil
-							.getMethodElement(resource);
-					if (me != null) {
-						MethodLibrary lib = UmaUtil.getMethodLibrary(me);
-						if (lib != null) {
-							Resource libResource = lib.eResource();
-							if (libResource != null
-									&& !modifiedResources.contains(libResource)
-									&& !resourcesToUpdateVersionInfo
-											.contains(libResource)
-									&& PersistenceUtil
-											.checkToolVersion(libResource) != 0) {
-								resourcesToUpdateVersionInfo.add(libResource);
-							}
-						}
-					}
-				}
-				resourcesToSave.addAll(resourcesToUpdateVersionInfo);
-			}
-
-			IStatus status = UserInteractionHelper.checkModify(
-					resourcesToSave, getSite().getShell());
-			if (!status.isOK()) {
-				handleError(status);
-				return;
-			}
-
-			// check for out-of-synch
-			//
-			if (checkFileChanged(resourcesToSave)) {
-				String title = LibraryEditResources.update_outofsynch_title;
-				String msg = LibraryEditResources.update_outofsynch_msg;
-				if (!AuthoringUIPlugin.getDefault().getMsgDialog()
-						.displayPrompt(title, msg)) {
-					return;
-				}
-			}
-
-			// flag the resources to update version info as modified so they
-			// will be saved
-			//
-			if (!resourcesToUpdateVersionInfo.isEmpty()) {
-				for (Iterator iter = resourcesToUpdateVersionInfo.iterator(); iter
-						.hasNext();) {
-					Resource resource = (Resource) iter.next();
-					resource.setModified(true);
-				}
-			}
-			
-			if(isValidateResourcesBeforeSaveRequired()) {
-				// validate
-				//
-				if(!validateResources(modifiedResources)) {
-					return;
-				}
-			}
-			else {
-				// no validation before save
-				// remove all validation errors markers associated with current method element
-				//
-				if(LibraryValidationMarkerHelper.INSTANCE.hasMarkers(elementObj)) {
-					LibraryValidationMarkerHelper.INSTANCE.deleteMarkers(elementObj);
-					
-					// refresh library view
-					//
-					LibraryView view = LibraryView.getView();
-					if(view != null) {
-						MethodElementLabelDecorator.clearDecorationCache();
-						view.getViewer().refresh();
-					}
-				}
-			}
-
-			
-			// Save.
-			//
-			Object oldValue = persister.getSaveOptions().get(
-					ILibraryPersister.FailSafeMethodLibraryPersister.OPTIONS_OVERWRITABLE_RESOURCES); 
-
-			Collection<Resource> resourcesToAdjustLocation = null;
-			
-			try {
-				persister.getSaveOptions().put(
-						ILibraryPersister.FailSafeMethodLibraryPersister.OPTIONS_OVERWRITABLE_RESOURCES, 
-						getOverwritableResources());
-			
-				for (Iterator iter = resourcesToSave.iterator(); iter.hasNext();) {
-					Resource resource = (Resource) iter.next();
-					try {
-						persister.save(resource);
-					} catch (Exception e) {
-						String title = AuthoringUIResources.editors_MethodElementEditor_saveErrorTitle; 
-						String msg = AuthoringUIResources.editors_MethodElementEditor_saveErrorMessage1; 
-						String reason = e.getMessage() == null ? AuthoringUIResources.editors_MethodElementEditor_saveErrorReason1
-								: e.getMessage(); 
-						AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-								title, msg, reason, e);
-						throw e;
-					}
-				}
-
-				try {
-					persister.commit();
-					dirty = false;
-					actionMgr.saveIsDone();
-					changeTime = -1;
-					resourcesToAdjustLocation = getResourceToAdjustLocation();	
-					setResourceInfos(getUsedResources());
-				} catch (Exception e) {
-					String reason = e.getMessage();
-					if (StrUtil.isBlank(reason)) {
-						reason = AuthoringUIResources.editors_MethodElementEditor_saveErrorReason2; 
-					}
-					StringWriter details = new StringWriter();
-					e.printStackTrace(new PrintWriter(details));
-					String title = AuthoringUIResources.editors_MethodElementEditor_saveErrorTitle; 
-					String message = AuthoringUIResources.editors_MethodElementEditor_saveErrorMessage2; 
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							title, message, reason, details.toString(), e);
-					throw e;
-				}
-			}
-			finally {
-				persister.getSaveOptions().put(
-						ILibraryPersister.FailSafeMethodLibraryPersister.OPTIONS_OVERWRITABLE_RESOURCES,
-						oldValue);
-			}
-
-			// Rename
-			//
-			//Collection<Resource> resourcesToAdjustLocation = getResourceToAdjustLocation();						
-			if (resourcesToAdjustLocation != null && !resourcesToAdjustLocation.isEmpty()) {
-				try {
-					persister.adjustLocation(resourcesToAdjustLocation);
-				} catch (Exception e) {
-					String title = AuthoringUIResources.editors_MethodElementEditor_renameErrorTitle; 
-					String template = AuthoringUIResources.editors_MethodElementEditor_renameErrorMessage1; 
-					StringBuffer fileList = new StringBuffer();
-					for (Iterator iter = resourcesToAdjustLocation.iterator(); iter
-							.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						Object obj = FileManager.toFileString(resource.getURI());
-						if(obj == null) {
-							obj = resource;
-						}
-						fileList.append(obj).append(", "); //$NON-NLS-1$
-					}
-					String msg = MessageFormat.format(template,
-							new Object[] { fileList });
-					String reason = e.getMessage() == null ? AuthoringUIResources.editors_MethodElementEditor_saveErrorReason1
-							: e.getMessage(); 
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							title, msg, reason, e);
-					throw e;
-				}
-
-				try {
-					persister.commit();
-				} catch (Exception e) {
-					String reason = e.getMessage();
-					if (StrUtil.isBlank(reason)) {
-						reason = AuthoringUIResources.editors_MethodElementEditor_saveErrorReason2; 
-					}
-					StringWriter details = new StringWriter();
-					e.printStackTrace(new PrintWriter(details));
-					String title = AuthoringUIResources.editors_MethodElementEditor_renameErrorTitle; 
-					String message = AuthoringUIResources.editors_MethodElementEditor_saveErrorMessage2; 
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							title, message, reason, details.toString(), e);
-					throw e;
-				}
-
-				resourcesToAdjustLocation.clear();
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			try {
-				persister.rollback();
-			} catch (Exception ex) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(ex);
-				ViewHelper.reloadCurrentLibaryOnRollbackError(getSite()
-						.getShell());
-			}
-		}
-	}
-
-	private Collection<Resource> getOverwritableResources() {
-		if(resourceInfoMap == null) {
-			return Collections.EMPTY_LIST;
-		}
-		ArrayList<Resource> resources = new ArrayList<Resource>();
-		for (Iterator iter = resourceInfoMap.values().iterator(); iter.hasNext();) {
-			ResourceInfo info = (ResourceInfo) iter.next();
-			if(info.overwrite) {
-				resources.add(info.resource);
-			}
-		}
-		return resources;
-	}
-
-	private Collection<Resource> getResourceToAdjustLocation() {
-		if(resourceInfoMap == null) {
-			return Collections.EMPTY_LIST;
-		}
-		ArrayList<Resource> resources = new ArrayList<Resource>();
-		for (Iterator iter = resourceInfoMap.values().iterator(); iter.hasNext();) {
-			ResourceInfo info = (ResourceInfo) iter.next();
-			if(info.adjustLocation) {
-				resources.add(info.resource);
-			}
-		}
-		return resources;
-	}
-
-	/**
-	 * @return
-	 */
-	protected boolean isValidateResourcesBeforeSaveRequired() {
-		return false;
-	}
-
-	protected void saveResource(Resource resource) {
-		if (resource != null && resource.isModified()) {
-			try {
-				getPersister().save(resource);
-			} catch (Exception e) {
-				String title = AuthoringUIResources.editors_MethodElementEditor_saveErrorTitle; 
-				String template = AuthoringUIResources.editors_MethodElementEditor_saveErrorMessage1; 
-				String msg = MessageFormat.format(template,
-						new Object[] { resource.getURI().toFileString() });
-				String reason = e.getMessage() == null ? AuthoringUIResources.editors_MethodElementEditor_saveErrorReason1
-						: e.getMessage(); 
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						title, msg, reason, e);
-			}
-		}
-	}
-
-	protected void createPreviewPage() {
-		Composite parent = getContainer();
-		Composite previewComposite = new Composite(parent, SWT.NONE);
-		previewComposite.setLayout(new GridLayout());
-
-		PreviewPage page = new PreviewPage(previewComposite);
-		previewer = page.getPreviewViewer();
-
-		preview_page_index = addPage(previewComposite);
-		setPageText(preview_page_index, AuthoringUIResources.previewPage_title); 
-	}
-
-	/**
-	 * Override this method to listen to the tab change.
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-
-		if (preview_page_index == newPageIndex && previewer != null) {
-			// Use the default layout manager.
-			//previewer.setLayoutManager(null);
-			previewer.showElementContent(elementObj);
-		}
-	}
-
-	private void setDirty() {
-		dirty = true;
-		firePropertyChange(PROP_DIRTY);
-	}
-
-	/**
-	 * Restore value of the control
-	 * @param control
-	 * @param value
-	 * @return
-	 * 		boolean value to indicate whether control was restored or not
-	 */
-	public boolean mustRestoreValue(Object control, Object value) {
-		if (widgetToCheck == control) {
-			// the control is currently being checked for editable, but there is
-			// still focus lost
-			// event is being sent out even the check is not completed yet.
-			// return true so the focusLost() will not make any change to the
-			// control.
-			//
-			return true;
-		}
-
-		Object editControl = control;
-		if (editControl instanceof MethodRichTextEditor) {
-			editControl = ((MethodRichTextEditor) control).getRichTextControl();
-		}
-		boolean restore = widgetsToRestoreValue.contains(editControl);
-		if (!restore) {
-			synchronized (widgetsToRestoreValue) {
-				restore = widgetsToRestoreValue.contains(editControl);
-			}
-		}
-		if (restore) {
-			if (editControl instanceof Text) {
-				Text text = ((Text) editControl);
-				text.setText((String) value);
-			} else if (editControl instanceof IMethodRichText) {
-				IMethodRichText richText = (IMethodRichText) editControl;
-				richText.setText((String) value);
-			}
-			widgetsToRestoreValue.remove(editControl);
-		}
-		return restore;
-	}
-
-	/**
-	 * Modify Listener 
-	 *
-	 */
-	public class ModifyListener implements
-			org.eclipse.swt.events.ModifyListener {
-
-		private EObject element;
-
-		private boolean checkContainerResource;
-
-		private boolean disabled = false;
-
-		/**
-		 * Creates a new instance.
-		 */
-		public ModifyListener(EObject element, boolean checkContainer) {
-			super();
-			checkContainerResource = checkContainer;
-			this.element = element;
-		}
-
-		private void restoreText(Object control, String txt) {
-			boolean old = disabled;
-			try {
-				disabled = true;
-				Object editControl = control;
-				if (editControl instanceof MethodRichTextEditor) {
-					editControl = ((MethodRichTextEditor) control)
-							.getRichTextControl();
-				}
-				if (editControl instanceof Text) {
-					Text text = ((Text) editControl);
-					text.setText(txt);
-				} else if (editControl instanceof IMethodRichText) {
-					IMethodRichText richText = (IMethodRichText) editControl;
-					richText.setText(txt);
-				}
-			} finally {
-				disabled = old;
-			}
-		}
-
-		private boolean checkEdit(EObject element, Object control,
-				boolean checkContainerResource) {
-			// keep a reference to the current widget so mustRestoreValue() can
-			// use it to check
-			// whether a focus lost event is triggered during a checkEdit.
-			// mustRestoreValue() then
-			// returns true so focusLost() will not try to make change to the
-			// value bound to the widget
-			//
-			widgetToCheck = control;
-			try {
-				if (DEBUG) {
-					System.out
-							.println("MethodElementEditor.checkEdit: enter, control=" + control); //$NON-NLS-1$
-				}
-				IStatus status = null;
-				if (widgetsToRestoreValue.contains(control)) {
-					if (DEBUG) {
-						System.out
-								.println("MethodElementEditor.checkEdit: widget found in widgetsToRestoreValue, exit"); //$NON-NLS-1$
-					}
-					return false;
-				}
-
-				synchronized (widgetsToRestoreValue) {
-					if (widgetsToRestoreValue.contains(control)) {
-						if (DEBUG) {
-							System.out
-									.println("MethodElementEditor.checkEdit: widget found in widgetsToRestoreValue, exit"); //$NON-NLS-1$
-						}
-						return false;
-					}
-
-					status = TngUtil.checkEdit(element, getSite().getShell());
-
-					if (!status.isOK()) {
-						if (control instanceof IRichText) {
-							((IRichText) control).restoreText();
-						} else {
-							if (control == currentFeatureEditor) {
-								restoreText(control, (String) element
-										.eGet(currentEditedFeature));
-							} else {
-								// Add the control to the list of widgets whose
-								// value needs
-								// to be restored to the original one..
-								widgetsToRestoreValue.add(control);
-								if (DEBUG) {
-									System.out
-											.println("MethodElementEditor.checkEdit: added widget to widgetsToRestoreValue"); //$NON-NLS-1$
-								}
-							}
-						}
-					} else if (checkContainerResource) {
-						if (element.eContainer() != null
-								&& element.eContainer().eResource() != element
-										.eResource()) {
-							status = TngUtil.checkEdit(element.eContainer(),
-									getSite().getShell());
-							if (!status.isOK()) {
-								// // Add the control to the list of widgets
-								// whose value
-								// // needs to be restored to the original one.
-								// if (debug) {
-								// System.out
-								// .println("MethodElementEditor.checkEdit:
-								// added widget to widgetsToRestoreValue");
-								// //$NON-NLS-1$
-								// }
-								if (control instanceof IRichText) {
-									((IRichText) control).restoreText();
-								} else {
-									if (control == currentFeatureEditor) {
-										restoreText(control, (String) element
-												.eGet(currentEditedFeature));
-									} else {
-										widgetsToRestoreValue.add(control);
-									}
-								}
-							}
-						}
-					}
-				}
-
-				if (status != null && !status.isOK()) {
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							AuthoringUIResources.editDialog_title, 
-							AuthoringUIResources.editDialog_msgCannotEdit, 
-							status);
-					return false;
-				}
-
-				return true;
-			} finally {
-				// clear the reference when the check is done
-				//
-				widgetToCheck = null;
-			}
-		}
-
-		/**
-		 * @see org.eclipse.swt.events.ModifyListener#modifyText(ModifyEvent)
-		 */
-		public void modifyText(ModifyEvent e) {
-			if (DEBUG) {
-				System.out
-						.println("MethodElementEditor.ModifyListener.modifyText: enter, disabled=" + disabled); //$NON-NLS-1$
-			}
-			if (!disabled && element != null) {
-				if (e.widget == null) {
-					return;
-				}
-
-				Object widget = e.widget;
-				if (widget instanceof Browser) {
-					widget = ((Browser) widget)
-							.getData(IMethodRichText.PROPERTY_NAME);
-					if (widget == null) {
-						widget = e.widget;
-					}
-				}
-				if (DEBUG) {
-					System.out
-							.println("MethodElementEditor.ModifyListener.modifyText: widget=" + widget); //$NON-NLS-1$
-				}
-
-				if (widgetsToRestoreValue.contains(widget)) {
-					if (DEBUG) {
-						System.out
-								.println("MethodElementEditor.ModifyListener.modifyText: widget found in widgetsToRestoreValue, exit"); //$NON-NLS-1$
-					}
-					return;
-				}
-
-				if (!checkEdit(element, widget, checkContainerResource)) {
-					if (DEBUG) {
-						System.out
-								.println("MethodElementEditor.ModifyListener.modifyText: checkEdit failed, exit"); //$NON-NLS-1$
-					}
-					return;
-				}
-
-				if (widget instanceof IMethodRichText) {
-					IMethodRichText richText = (IMethodRichText) widget;
-					setModifiedRichText(richText);
-					if (DEBUG) {
-						System.out
-								.println("MethodElementEditor.ModifyListener.modifyText: adding to modifiedRichTexts list"); //$NON-NLS-1$
-					}
-				}
-
-				if (DEBUG) {
-					System.out
-							.println("MethodElementEditor.ModifyListener.modifyText: marking editor as dirty"); //$NON-NLS-1$
-				}
-				setDirty();
-			}
-
-			if (DEBUG) {
-				System.out
-						.println("MethodElementEditor.ModifyListener.modifyText: exit"); //$NON-NLS-1$
-			}
-		}
-
-		/**
-		 * Sets the underlying model element.
-		 * 
-		 * @param element
-		 *            A method element.
-		 */
-		public void setElement(EObject element) {
-			this.element = element;
-		}
-
-		/**
-		 * Sets the disable flag.
-		 * 
-		 * @param disabled
-		 *            If <code>true</code>, ignore the modify events.
-		 */
-		public void setDisable(boolean disabled) {
-			this.disabled = disabled;
-		}
-	}
-
-	/**
-	 * Creates an new instance of ModifyListener that supports team and CM
-	 * integration Any control in the editor, if it needs a ModifyListener, must
-	 * use one created by this method
-	 * 
-	 * @param eObj
-	 * 
-	 * @return
-	 */
-	public ModifyListener createModifyListener(EObject eObj) {
-		return createModifyListener(eObj, false);
-	}
-
-	/**
-	 * Creates an new instance of ModifyListener that supports team and CM
-	 * integration Any control in the editor, if it needs a ModifyListener, must
-	 * use one created by this method
-	 * 
-	 * @param eObj
-	 * @param checkContainer
-	 *            if true will check the container of the given object for
-	 *            editable as well when checking the given object for editable
-	 * 
-	 * @return
-	 * 		Modify Listener
-	 */
-	public ModifyListener createModifyListener(EObject eObj,
-			boolean checkContainer) {
-		return new ModifyListener(eObj, checkContainer);
-	}
-
-	/**
-	 * Sets the specified control to be the current editor of the specified
-	 * feature.
-	 * 
-	 * @param control
-	 * @param feature
-	 */
-	public void setCurrentFeatureEditor(Object control,
-			EStructuralFeature feature) {
-		currentFeatureEditor = control;
-		currentEditedFeature = feature;
-	}
-
-	protected void monitorChange() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint point = registry
-				.getExtensionPoint("org.eclipse.core.resources.refreshProviders"); //$NON-NLS-1$
-		if (point == null)
-			return;
-		IExtension[] extensions = point.getExtensions();
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension extension = extensions[i];
-			if (DEBUG) {
-				System.out
-						.println("extension: UID=" + extension.getUniqueIdentifier() + ", " + extension); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-	
-	private Map<Resource, ResourceInfo> getResourceInfoMap() {
-		if(resourceInfoMap == null) {
-			resourceInfoMap = new HashMap<Resource, ResourceInfo>();
-		}
-		return resourceInfoMap;
-	}
-
-	/**
-	 * Add resource to adjust location
-	 * @param resource
-	 */
-	public void addResourceToAdjustLocation(Resource resource) {
-		ResourceInfo info = getResourceInfoMap().get(resource);
-		if(info == null) {
-			info = new ResourceInfo(resource);
-			getResourceInfoMap().put(resource, info);
-		}
-		info.adjustLocation = true;
-	}
-
-	protected List getUsedFeatures() {
-		return elementObj.eClass().getEAllStructuralFeatures();
-	}
-
-	/**
-	 * Gets resources that are currently being used by this editors
-	 * 
-	 * @return
-	 * 		list of used resources
-	 */
-	public Collection<Resource> getUsedResources() {
-		HashSet<Resource> resources = new HashSet<Resource>();
-		Resource resource = elementObj.eResource();
-		if (resource != null) {
-			resources.add(resource);
-		}
-		List allFeatures = getUsedFeatures();
-		for (int i = allFeatures.size() - 1; i > -1; i--) {
-			EStructuralFeature feature = (EStructuralFeature) allFeatures
-					.get(i);
-			if (feature.isMany()) {
-				List values = (List) elementObj.eGet(feature);
-				for (int j = values.size() - 1; j > -1; j--) {
-					EObject value = (EObject) values.get(j);
-					if (value.eResource() != null) {
-						resources.add(value.eResource());
-					}
-				}
-			} else {
-				Object value = elementObj.eGet(feature);
-				if (value instanceof EObject
-						&& (resource = ((EObject) value).eResource()) != null) {
-					resources.add(resource);
-				}
-			}
-		}
-		lastUsedResources = resources;
-		return resources;
-	}
-
-	private Map getURIToUsedResourceMap() {
-		HashMap<URI, Resource> map = new HashMap<URI, Resource>();
-		for (Iterator iter = getUsedResources().iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			map.put(resource.getURI(), resource);
-		}
-		return map;
-	}
-
-	protected void handleError(IStatus status) {
-		AuthoringUIPlugin.getDefault().getMsgDialog().display(
-				AuthoringUIResources.errorDialog_title, 
-				AuthoringUIResources.editDialog_msgCannotEdit, 
-				status);
-	}
-
-	/**
-	 * Handles the activation of this view.
-	 */
-	protected void handleActivate(IWorkbenchPart part) {
-		// TODO: Review implementation.
-		// Make sure that the method library open is not closed.
-		XMILibraryUtil.openMethodLibraryProject(LibraryService.getInstance()
-				.getCurrentMethodLibrary(), getEditorSite().getActionBars()
-				.getStatusLineManager().getProgressMonitor());
-
-		if (checkFileChangedRequired) {
-			Collection<Resource> usedResources = getUsedResources();
-			if (checkFileChanged(usedResources)) {
-				handleFileChanged(usedResources);
-			}
-		}
-	}
-
-	/**
-	 * Displays a dialog that asks if conflicting changes should be discarded.
-	 */
-	protected boolean handleDirtyConflict() {
-		String title = AuthoringUIResources._UI_FileConflict_label;
-		String msg = AuthoringUIResources._WARN_FileConflict;
-		return AuthoringUIPlugin.getDefault().getMsgDialog().displayPrompt(
-				title, msg);
-	}
-
-	/**
-	 * Handles changed resources when this view is activated.
-	 */
-	protected void handleChangedResources() {
-		if ((elementObj.eIsProxy() || !changedResources.isEmpty())
-				&& (!isDirty() || handleDirtyConflict())) {
-			// editingDomain.getCommandStack().flush();
-
-			// for (Iterator i = changedResources.iterator(); i.hasNext();) {
-			// Resource resource = (Resource) i.next();
-			// if (resource.isLoaded()) {
-			// if(resource instanceof MultiFileXMIResourceImpl) {
-			// try {
-			// ((MultiFileXMIResourceImpl)resource).reload(null);
-			// } catch (IOException e) {
-			// AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			// }
-			// }
-			// else {
-			// resource.unload();
-			// try {
-			// resource.load(Collections.EMPTY_MAP);
-			// } catch (IOException e) {
-			// AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			// }
-			// }
-			// }
-			// }
-		}
-	}
-
-	/**
-	 * Checks whether input is valid or not
-	 * @return boolean value
-	 */
-	public boolean isInputValid() {
-		if (elementObj != null && elementObj.eIsProxy()) {
-			EObject e = RefreshJob.getInstance().resolve(elementObj);
-			return (e instanceof MethodElement && !e.eIsProxy() && UmaUtil
-					.getMethodLibrary(e) == LibraryService.getInstance()
-					.getCurrentMethodLibrary());
-		}
-		return true;
-	}
-
-	protected void updatePages() {
-		while (getPageCount() > 0) {
-			removePage(0);
-		}
-		addPages();
-	}
-
-	protected IEditorInput createInput(MethodElement e) {
-		return new MethodElementEditorInput(e);
-	}
-
-	public synchronized void refresh(final boolean force) {
-		BusyIndicator.showWhile(getSite().getShell().getDisplay(),
-				new Runnable() {
-
-					public void run() {
-						Collection<Resource> usedResources = lastUsedResources;
-						if (!force && !elementObj.eIsProxy()
-								&& !checkReloaded(usedResources)) {
-							// no resource reloaded, no need to refresh
-							//
-							return;
-						}
-						int activePageIndex = getActivePage();
-						modifiedRichText = null;
-						if (isDirty()) {
-							actionMgr.undoAll();
-							dirty = false;
-						}
-						if (elementObj.eIsProxy()) {
-							elementObj.eAdapters().remove(nameChangedListener);
-							EObject e = RefreshJob.getInstance().resolve(
-									elementObj);
-							if (e instanceof MethodElement
-									&& !e.eIsProxy()
-									&& UmaUtil.getMethodLibrary(e) == LibraryService
-											.getInstance()
-											.getCurrentMethodLibrary()) {
-								setInput(createInput((MethodElement) e));
-							} else {
-								// input element is invalid, close the editor
-								//
-								close(false);
-								return;
-							}
-						}
-						setResourceInfos(usedResources);
-						updatePages();
-						if (activePageIndex != -1) {
-							setActivePage(activePageIndex);
-						}
-						firePropertyChange(IEditorPart.PROP_DIRTY);
-					}
-
-				});
-
-	}
-
-	/**
-	 * Refreshes the editor
-	 */
-	public void refresh() {
-		refresh(RefreshJob.getInstance().getChangedResources());
-	}
-	
-	protected void refresh(Collection<Resource> changedResources) {
-		// save changed resources before refresh so action manager will not try
-		// to save these changed resources
-		//
-		this.changedResources.addAll(changedResources);
-		refresh(false);
-		this.changedResources.clear();		
-	}
-
-
-	/**
-	 * Public method to refresh editor title image on certain action.
-	 * e.g. If methodPlugin is locked, editor title image should be grey-ed out.
-	 * 
-	 * @param methodElement
-	 */
-	public void refreshTitleImage() {
-		if (fMethodElementEditorErrorTickUpdater != null)
-			fMethodElementEditorErrorTickUpdater.updateEditorImage(elementObj);
-	}
-
-	public void updatedTitleImage(Image image) {
-		setTitleImage(image);
-	}
-	
-	public void gotoMarker(IMarker marker) {
-		if(marker.getResource() == elementFile) {
-			try {
-				Object val = marker.getAttribute(LibraryValidationMarkerHelper.GUID);
-				if(val instanceof String) {
-					String guid = (String) val;
-					MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-					if(e != elementObj) {
-						// wrong element is opened because element from the
-						// marker is not the top element in its resource
-						// close this editor and open the right one
-						//
-						close(false);
-						IEditorKeeper.REFERENCE.getEditorKeeper().openEditor(e);
-						return;
-					}
-				}
-			} catch (CoreException e) {
-
-			}
-		}
-		
-		// open description page
-		setActivePage(0);
-	}
-
-	public boolean isDisposed() {
-		return disposed;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditorInput.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditorInput.java
deleted file mode 100644
index 1fe52b5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditorInput.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.epf.library.ui.IMethodElementProvider;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-
-/**
- * An editor input for method element editor
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodElementEditorInput implements IEditorInput, IMethodElementProvider {
-
-	private MethodElement methodElement;
-
-	private ImageDescriptor imageDescriptor = null;
-
-	public MethodElementEditorInput(MethodElement e) {
-		methodElement = e;
-	}
-
-	public MethodElement getMethodElement() {
-		return methodElement;
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.ui.IEditorInput#exists()
-	 */
-	public boolean exists() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return imageDescriptor;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getName()
-	 */
-	public String getName() {
-		return methodElement.getName();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getPersistable()
-	 */
-	public IPersistableElement getPersistable() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/**
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (getClass().isInstance(obj)) {
-			return methodElement == ((MethodElementEditorInput) obj)
-					.getMethodElement();
-		}
-		return false;
-	}
-	
-	@Override
-	public int hashCode() {
-		int result = methodElement.hashCode();
-		return result;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditorMatchingStrategy.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditorMatchingStrategy.java
deleted file mode 100644
index 925b8a5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodElementEditorMatchingStrategy.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * implements IEditorMatchingStrategy for MethodElementEditor
- * @author Jeff Hardy
- *
- */
-public class MethodElementEditorMatchingStrategy implements IEditorMatchingStrategy {
-
-	public boolean matches(IEditorReference editorRef, IEditorInput input) {
-		// inspect input
-		MethodElement inputElement = getMethodElementFromInput(input);
-		if (inputElement == null) {
-			// no MethodElement in incoming input
-			return false;
-		}
-		
-        IEditorInput existingEditorInput;
-        IEditorPart editor = editorRef.getEditor(false);
-        
-        if (!(editor instanceof MethodElementEditor)) {
-        	// existing editor is not a MethodElementEditor
-        	return false;
-        }
-
-        try {
-            existingEditorInput = editorRef.getEditorInput();
-        } catch (PartInitException e) {
-            return false;
-        }
-        
-        MethodElement existingEditorInputElement = getMethodElementFromInput(existingEditorInput);
-		if (existingEditorInputElement == null) {
-			// no MethodElement in existing editor
-			return false;
-		}
-        
-        if (existingEditorInputElement.equals(inputElement)) {
-        	// editor is editing the MethodElement represented by the input
-        	return true;
-        }
-        
-        return false;
-	}
-	
-	private MethodElement getMethodElementFromInput(IEditorInput input) {
-		MethodElement inputElement = null;
-		if (input instanceof FileEditorInput) {
-			// probably opened from Problems View
-			inputElement = PersistenceUtil.getMethodElement(((FileEditorInput)input).getFile(),
-					LibraryService.getInstance().getCurrentLibraryManager().
-					getEditingDomain().getResourceSet());
-		}
-		if (input instanceof MethodElementEditorInput) {
-			inputElement = ((MethodElementEditorInput)input).getMethodElement();
-		}
-		return inputElement;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodLibraryEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodLibraryEditor.java
deleted file mode 100644
index ed5d845..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodLibraryEditor.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.forms.MethodLibraryDescriptionFormPage;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.persistence.MultiFileIOException;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-/**
- * The method library editor.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodLibraryEditor extends MethodElementEditor {
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#setPartName()
-	 */
-	public void setPartName() {
-		String partName = AuthoringUIResources.MethodLibraryEditor_title; 
-		if (elementObj.getName() != null) {
-			partName += elementObj.getName();
-			;
-		}
-		setPartName(partName);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#addPages()
-	 */
-	protected void addPages() {
-		try {
-			addPage(new MethodLibraryDescriptionFormPage(this));
-			createPreviewPage();
-		} catch (PartInitException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#dispose()
-	 */
-	public void dispose() {
-		// Close all the editors.
-		getSite().getPage().closeAllEditors(false);
-
-		// Clear the Library View.
-		LibraryView.getView().setInputForViewer(null);
-
-		try {
-			// Close the current method library.
-			LibraryService.getInstance().closeCurrentMethodLibrary();
-		} catch (Exception e) {
-		}
-
-		super.dispose();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (monitor != null) {
-			monitor
-					.beginTask(
-							AuthoringUIResources.MethodLibraryEditor_savemodellibrary, IProgressMonitor.UNKNOWN); 
-
-			try {
-				LibraryService.getInstance().saveCurrentMethodLibrary();
-				firePropertyChange(IEditorPart.PROP_DIRTY);
-			} catch (Exception ex) {
-				ex.printStackTrace();
-				String errMsg = AuthoringUIResources.MethodLibraryEditor_err_save; 
-				String errDetails = ""; //$NON-NLS-1$
-				if (ex.getMessage() != null) {
-					errDetails = ex.getMessage(); 
-				}
-				if (ex instanceof MultiFileIOException) {
-					Object troubleObj = ((MultiFileIOException) ex)
-							.getTroubleObject();
-					if (troubleObj instanceof MethodElement) {
-						errDetails = AuthoringUIResources.MethodLibraryEditor_troubleobject + MultiFileSaveUtil.getPath((MethodElement) troubleObj); 
-					}
-				}
-
-				String title = AuthoringUIResources.MethodLibraryEditor_error_dialog_title; 
-				String problem = AuthoringUIResources.MethodLibraryEditor_save_library_problem_msg; 
-				MsgDialog dialog = AuthoringUIPlugin.getDefault()
-						.getMsgDialog();
-				dialog.displayError(title, problem, errMsg, errDetails); 
-			} finally {
-				monitor.done();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#isDirty()
-	 */
-	public boolean isDirty() {
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		return manager != null ? manager.isMethodLibraryModified() : false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodRichText.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodRichText.java
deleted file mode 100644
index 9843305..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodRichText.java
+++ /dev/null
@@ -1,310 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.io.UnsupportedEncodingException;
-import java.util.regex.Matcher;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.authoring.ui.forms.BaseFormPage;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.util.MethodRichTextMarkerHelper;
-import org.eclipse.epf.common.html.HTMLFormatter;
-import org.eclipse.epf.library.layout.RichTextContentValidator;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.richtext.RichText;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * A Method Editor Rich Text control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class MethodRichText extends RichText implements IMethodRichText {
-
-	// The method element associated with this rich text control.
-	private MethodElement methodElement;
-	
-	// the MethodElement's ContentDescription
-	private ContentDescription contentDescription;
-
-	// The modal object associated with this rich text control.
-	private EObject modalObject;
-
-	// The modal object feature associated with this rich text control.
-	private EStructuralFeature modalObjectFeature;
-
-	// The resource being edited       
-	protected Resource resource;
-	
-	// the decoratedField label
-	protected Label label;
-	
-	protected ControlDecoration controlDecoration;
-	
-	protected final Image errorFieldDecorationImage = FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage();
-                                      
-	// Field name being edited
-	protected String fieldName = ""; //$NON-NLS-1$
-
-	// Field name being edited with the trailing : removed     
-	protected String fieldNameTrim;
-	
-	// marker helper
-	protected MethodRichTextMarkerHelper markerHelper;
-	
-//	// marker attribute
-//	private static String METHOD_FIELDNAME = "MethodFieldName";
-
-//	// marker ID
-//	protected static final String MARKER_ID = "org.eclipse.epf.authoring.ui.methodRichText"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            The parent control.
-	 * @param style
-	 *            The initial style for the editor.
-	 * @param basePath
-	 *            The base path used for resolving hrefs.
-	 */
-	public MethodRichText(Composite parent, int style, String basePath) {
-		super(parent, style, basePath);
-	}
-
-	/**
-	 * Updates the presentation names of all element links.
-	 * 
-	 * @param text
-	 *            Rich text encoded in HTML format.
-	 */
-	@Override
-	protected String tidyText(String text) {
-		/*
-		 *  this will do the following to the HTML:
-		 *  1.  update Element Links
-		 *  2.  change <A ..> to <a ..>
-		 *  3.  change </A> to </a>
-		 *  4.  add double-quotes (") around all attribute values if they are missing
-		 */
-		
-		return ResourceHelper.validateRichTextContent(methodElement, text,
-				new RichTextContentValidator());
-	}
-
-	/**
-	 * Sets the method element associated with this rich text control.
-	 * 
-	 * @param methodElement
-	 */
-	public void setMethodElement(MethodElement methodElement) {
-		this.methodElement = methodElement;
-		if (this.methodElement instanceof ProcessComponent) {
-			this.methodElement = ((ProcessComponent) this.methodElement).getProcess();
-		}
-		if (this.methodElement instanceof DescribableElement) { 
-			this.contentDescription = ((DescribableElement)this.methodElement).getPresentation();
-		}
-	}
-
-	/**
-	 * Returns the method element associated with this rich text control.
-	 */
-	public MethodElement getMethodElement() {
-		return methodElement;
-	}
-
-	/**
-	 * Returns the modal object associated with this rich text control.
-	 */
-	public EObject getModalObject() {
-		return modalObject;
-	}
-
-	/**
-	 * Sets the modal object associated with this rich text control.
-	 */
-	public void setModalObject(EObject modalObject) {
-		this.modalObject = modalObject;
-	}
-
-	/**
-	 * Returns modal object feature associated with this rich text control.
-	 */
-	public EStructuralFeature getModalObjectFeature() {
-		return modalObjectFeature;
-	}
-
-	/**
-	 * Sets the modal object feature associated with this rich text control.
-	 */
-	public void setModalObjectFeature(EStructuralFeature modalObjectFeature) {
-		this.modalObjectFeature = modalObjectFeature;
-	}
-
-	public String getFieldName() {
-		return fieldName;
-	}
-
-	public void setDecoratedFieldLabel(Label label) {
-		this.label = label;
-		if (label != null) {
-			Object data = label.getData(BaseFormPage.LABEL_DECORATOR_KEY);
-			if (data instanceof ControlDecoration) {
-				controlDecoration = (ControlDecoration)data;
-				controlDecoration.setImage(errorFieldDecorationImage);
-				controlDecoration.hide();
-			}
-			updateFieldNameFromLabel(label);
-		}
-	}
-
-	private boolean updateFieldNameFromLabel(Label label) {
-		if (label != null) {
-			String fieldName = label.getText();
-			if (!this.fieldName.equals(fieldName)) {
-				this.fieldName = fieldName;
-				int colonIndex = fieldName.indexOf(':');
-				if (colonIndex == -1)
-					colonIndex = fieldName.length();
-				this.fieldNameTrim = fieldName.substring(0, colonIndex).trim();
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	public void init(MethodElement element, Label label) {
-		setMethodElement(element);
-		setDecoratedFieldLabel(label);
-		markerHelper = MethodRichTextMarkerHelper.INSTANCE;
-	}
-	
-	@Override
-	protected String formatHTML(String text) {
-		String formattedText;
-		try {
-			// clear markers first
-			clearMarkers();
-			// Call JTidy to format the source to XHTML.
-			formattedText = htmlFormatter.formatHTML(text);
-			if (htmlFormatter.getLastErrorStr() != null) {
-				String errorString = htmlFormatter.getLastErrorStr();
-				// create markers
-				try {
-					createMarker(errorString);
-				} catch (CoreException cex) {
-					logger.logError(cex);
-				}
-			}
-			return formattedText;
-		} catch (UnsupportedEncodingException e) {
-			logger.logError(e);
-		}
-		return text;
-	}
-	
-	protected void clearMarkers() {
-		markerHelper.deleteMarkers(contentDescription, fieldNameTrim);
-		setErrorDescription(""); //$NON-NLS-1$
-		hideErrorDecoration();
-		refreshDecorators();
-	}
-	
-	protected void setErrorDescription(String text) {
-		if (controlDecoration != null) {
-			controlDecoration.setDescriptionText(text);
-		}
-	}
-	
-	protected void refreshDecorators() {
-		// refresh
-//		PlatformUI.getWorkbench().getDecoratorManager().update(MethodElementLightweightLabelDecorator.DECORATOR_ID);
-	}
-	
-	
-	/*
-	 * TODO:
-	 * had to undo change in DescribableElementImpl to set presentation on any new obj
-	 * so editor will need to assign presentation when field is edited so that the marker
-	 * can be added to the presentation's resource
-	 */
-	
-	
-	protected void createMarker(String fullErrMsg) throws CoreException {
-		if (contentDescription.eContainer() instanceof DescribableElement) {
-			Matcher m = HTMLFormatter.jTidyErrorParser.matcher(fullErrMsg);                                                                          
-			if (m.find()) {                                                                                                                          
-				String location = m.group(1);
-				String errorMsg = m.group(4);
-				BasicDiagnostic diagnostics = 
-			          new BasicDiagnostic
-			            (HTMLFormatter.DIAGNOSTIC_SOURCE,
-			             0, "", //$NON-NLS-1$
-			                new Object[] { contentDescription, fieldNameTrim });
-	
-				diagnostics.add( 
-					new BasicDiagnostic(Diagnostic.ERROR,
-						location, 0, errorMsg,
-						new Object[] { contentDescription, fieldNameTrim }));
-	
-		        markerHelper.createMarkers(diagnostics);
-		        setErrorDescription(errorMsg);
-		        showErrorDecoration();
-				refreshDecorators();
-			}
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		clearMarkers();
-		refreshDecorators();
-	}
-	
-	public void showErrorDecoration() {
-        if (controlDecoration != null) {
-        	controlDecoration.show();
-        }
-	}
-
-	public void hideErrorDecoration() {
-        if (controlDecoration != null) {
-        	controlDecoration.hide();
-        }
-	}
-	
-	@Override
-	public void setText(String text) {
-		// check if label text was changed (this happens when RTE is expanded)
-		// this is called when RTE is toggled in editor - read new fieldName
-		if (updateFieldNameFromLabel(label))
-			hideErrorDecoration();
-		super.setText(text);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodRichTextEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodRichTextEditor.java
deleted file mode 100644
index fcf5790..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/MethodRichTextEditor.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.authoring.ui.actions.MethodAddImageAction;
-import org.eclipse.epf.authoring.ui.actions.MethodAddLinkAction;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.IRichTextToolBar;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.actions.AddOrderedListAction;
-import org.eclipse.epf.richtext.actions.AddTableAction;
-import org.eclipse.epf.richtext.actions.AddUnorderedListAction;
-import org.eclipse.epf.richtext.actions.BoldAction;
-import org.eclipse.epf.richtext.actions.ClearContentAction;
-import org.eclipse.epf.richtext.actions.CopyAction;
-import org.eclipse.epf.richtext.actions.CutAction;
-import org.eclipse.epf.richtext.actions.FindReplaceAction;
-import org.eclipse.epf.richtext.actions.FontNameAction;
-import org.eclipse.epf.richtext.actions.FontSizeAction;
-import org.eclipse.epf.richtext.actions.FontStyleAction;
-import org.eclipse.epf.richtext.actions.IndentAction;
-import org.eclipse.epf.richtext.actions.ItalicAction;
-import org.eclipse.epf.richtext.actions.OutdentAction;
-import org.eclipse.epf.richtext.actions.PasteAction;
-import org.eclipse.epf.richtext.actions.SubscriptAction;
-import org.eclipse.epf.richtext.actions.SuperscriptAction;
-import org.eclipse.epf.richtext.actions.TidyActionGroup;
-import org.eclipse.epf.richtext.actions.UnderlineAction;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorSite;
-
-/**
- * A Rich Text editor with added extensions to support Method browsing and
- * authoring. Includes a tool bar and an integrated HTML source editor.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class MethodRichTextEditor extends RichTextEditor implements
-		IMethodRichTextEditor {
-
-	// The method element associated with this rich text control.
-	private MethodElement methodElement;
-
-	// The modal object associated with this rich text control.
-	private EObject modalObject;
-
-	// The modal object feature associated with this rich text control.
-	private EStructuralFeature modalObjectFeature;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            The parent control.
-	 * @param style
-	 *            The initial style for the editor.
-	 * @param basePath
-	 *            The base path used for resolving hrefs.
-	 */
-	public MethodRichTextEditor(Composite parent, int style, String basePath,
-			MethodElement methodElement, Label label, IEditorSite editorSite) {
-		super(parent, style, editorSite, basePath);
-		this.methodElement = methodElement;
-		init(methodElement, label);
-	}
-
-	/**
-	 * Creates the underlying rich text control.
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 * @param style
-	 *            The style for this control.
-	 * @param basePath
-	 *            The path used for resolving links.
-	 */
-	protected IRichText createRichTextControl(Composite parent, int style,
-			String basePath) {
-		return new MethodRichText(parent, style, basePath);
-	}
-
-	/**
-	 * Fills the Rich Text editor tool bar with action items.
-	 * 
-	 * @param toolBar
-	 *            The Rich text editor tool bar.
-	 */
-	public void fillToolBar(IRichTextToolBar toolBar) {
-		toolBar.addAction(new FontStyleAction(this));
-		toolBar.addAction(new FontNameAction(this));
-		toolBar.addAction(new FontSizeAction(this));
-		toolBar.addSeparator();		
-		toolBar.addAction(new CutAction(this));
-		toolBar.addAction(new CopyAction(this));
-		toolBar.addAction(new PasteAction(this));
-		toolBar.addSeparator();
-		toolBar.addAction(new ClearContentAction(this));
-		toolBar.addSeparator();
-		toolBar.addAction(new BoldAction(this));
-		toolBar.addAction(new ItalicAction(this));
-		toolBar.addAction(new UnderlineAction(this));
-		toolBar.addSeparator();
-		toolBar.addAction(new SubscriptAction(this));
-		toolBar.addAction(new SuperscriptAction(this));
-		toolBar.addSeparator();
-		toolBar.addAction(new TidyActionGroup(this));
-		toolBar.addSeparator();
-		toolBar.addAction(new AddOrderedListAction(this));
-		toolBar.addAction(new AddUnorderedListAction(this));
-		toolBar.addSeparator();
-		toolBar.addAction(new OutdentAction(this));
-		toolBar.addAction(new IndentAction(this));
-		toolBar.addSeparator();
-		toolBar.addAction(new FindReplaceAction(this) {
-			@Override
-			public void execute(IRichText richText) {
-				richText.getFindReplaceAction().execute(richText);
-			}
-		});
-		toolBar.addSeparator();
-		toolBar.addAction(new MethodAddLinkAction(this));
-		toolBar.addAction(new MethodAddImageAction(this));
-		toolBar.addAction(new AddTableAction(this));
-	}
-
-	/**
-	 * Returns the method element associated with this rich text control.
-	 */
-	public MethodElement getMethodElement() {
-		return methodElement;
-	}
-
-	/**
-	 * Returns the modal object associated with this rich text control.
-	 */
-	public EObject getModalObject() {
-		return modalObject;
-	}
-
-	/**
-	 * Sets the modal object associated with this rich text control.
-	 */
-	public void setModalObject(EObject modalObject) {
-		this.modalObject = modalObject;
-	}
-
-	/**
-	 * Returns modal object feature associated with this rich text control.
-	 */
-	public EStructuralFeature getModalObjectFeature() {
-		return modalObjectFeature;
-	}
-
-	/**
-	 * Sets the modal object feature associated with this rich text control.
-	 */
-	public void setModalObjectFeature(EStructuralFeature modalObjectFeature) {
-		this.modalObjectFeature = modalObjectFeature;
-	}
-
-	public void init(MethodElement element, Label label) {
-		if (richText instanceof IMethodRichText)
-			((IMethodRichText)richText).init(methodElement, label);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/PreviewPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/PreviewPage.java
deleted file mode 100644
index aeef57f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/PreviewPage.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.views.ElementHTMLViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.custom.ViewForm;
-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.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * The Preview page in the Method Editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class PreviewPage {
-
-	private ElementHTMLViewer previewer = null;
-
-	/**
-	 * Create an instance
-	 * 
-	 * @param composite
-	 */
-	public PreviewPage(Composite composite) {
-		// Use the ViewForm control to give it the Eclipse Workbench window
-		// look & feel.
-		ViewForm viewForm = new ViewForm(composite, SWT.DEFAULT);
-		viewForm.marginHeight = 0;
-		viewForm.marginWidth = 0;
-		viewForm.setLayout(new GridLayout());
-		viewForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// Set toolbar
-		Control toolbar = createToolbar(viewForm);
-		viewForm.setTopRight(toolbar);
-
-		// Set content
-		Control content = createContent(viewForm);
-		viewForm.setContent(content);
-	}
-
-	/**
-	 * Create preview content
-	 * 
-	 * @param parent
-	 * @return
-	 */
-	private Control createContent(ViewForm parent) {
-		Composite content = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		layout.horizontalSpacing = 0;
-		layout.verticalSpacing = 0;
-		content.setLayout(layout);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		content.setLayoutData(gridData);
-
-		previewer = new ElementHTMLViewer(content);
-		return (Control) content;
-	}
-
-	/**
-	 * Return ElementViewer
-	 * 
-	 * @return
-	 * 			Viewer
-	 */
-	public ElementHTMLViewer getPreviewViewer() {
-		return previewer;
-	}
-
-	/**
-	 * Create Toolbar It has Go back, Go forward, Stop and refresh buttons
-	 * 
-	 * @param ViewForm
-	 *            parent
-	 * @return Toolbar
-	 */
-	private ToolBar createToolbar(ViewForm parent) {
-		// Create the browser navigation toolbar.
-		ToolBar toolbar = new ToolBar(parent, SWT.FLAT);
-
-		// Add the Back button.
-		ToolItem backButton = new ToolItem(toolbar, SWT.NONE);
-		backButton.setImage(AuthoringUIImages.IMG_BACK);
-		backButton.setToolTipText(AuthoringUIResources.backButton_text); 
-		backButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				Browser browser = previewer.getBrowser();
-				if (browser != null) {
-					browser.back();
-				}
-			};
-		});
-
-		// Add the Foward button.
-		ToolItem forwardButton = new ToolItem(toolbar, SWT.NONE);
-		forwardButton.setImage(AuthoringUIImages.IMG_FORWARD);
-		forwardButton.setToolTipText(AuthoringUIResources.forwardButton_text); 
-		forwardButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				Browser browser = previewer.getBrowser();
-				if (browser != null) {
-					browser.forward();
-				}
-			};
-		});
-
-		// Add the Stop button.
-		ToolItem stopButton = new ToolItem(toolbar, SWT.NONE);
-		stopButton.setImage(AuthoringUIImages.IMG_STOP);
-		stopButton.setToolTipText(AuthoringUIResources.stopButton_text); 
-		stopButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				Browser browser = previewer.getBrowser();
-				if (browser != null) {
-					browser.stop();
-				}
-			};
-		});
-
-		// Add the Refresh button.
-		ToolItem refreshButton = new ToolItem(toolbar, SWT.NONE);
-		refreshButton.setImage(AuthoringUIImages.IMG_REFRESH);
-		refreshButton.setToolTipText(AuthoringUIResources.refreshButton_text); 
-		refreshButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				// Browser browser = previewer.getBrowser();
-				// if (browser != null) {
-				// browser.refresh();
-				// }
-
-				previewer.refresh();
-			};
-		});
-
-		// Add the Print button.
-		ToolItem printButton = new ToolItem(toolbar, SWT.NONE);
-		printButton.setImage(AuthoringUIImages.IMG_PRINT);
-		printButton.setToolTipText(AuthoringUIResources.printButton_text); 
-		printButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				previewer.print();
-			};
-		});
-
-		return toolbar;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditor.java
deleted file mode 100644
index 35f6ace..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditor.java
+++ /dev/null
@@ -1,2412 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
-import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction;
-import org.eclipse.epf.authoring.ui.actions.LibraryValidateAction;
-import org.eclipse.epf.authoring.ui.dnd.EditingDomainTableTreeViewerDropAdapter;
-import org.eclipse.epf.authoring.ui.forms.DeliveryProcessDescription;
-import org.eclipse.epf.authoring.ui.forms.IExtensionFormPage;
-import org.eclipse.epf.authoring.ui.forms.ProcessBreakdownStructureFormPage;
-import org.eclipse.epf.authoring.ui.forms.ProcessDescription;
-import org.eclipse.epf.authoring.ui.preferences.ApplicationPreferenceConstants;
-import org.eclipse.epf.authoring.ui.properties.EPFPropertySheetPage;
-import org.eclipse.epf.authoring.ui.providers.ProcessEditorPageProvider;
-import org.eclipse.epf.authoring.ui.views.ProcessViewer;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeEventWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeListenerWrapper;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.ui.service.DiagramEditorHelper;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
-import org.eclipse.epf.library.edit.IAdapterFactoryProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.CommandStackChangedEvent;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.EditingDomainComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.prefs.PreferenceUtil;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.epf.validation.LibraryEValidator;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.IContentProvider;
-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.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.BaseSelectionListenerAction;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheet;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * Editor for process authoring.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ProcessEditor extends MethodElementEditor implements
-		IEditingDomainProvider, IMenuListener, ISelectionProvider,
-		IViewerProvider, ITabbedPropertySheetPageContributor {
-
-	/**
-	 * The editor ID.
-	 */
-	public static final String EDITOR_ID = ProcessEditor.class.getName();
-
-	public static final String WORKFLOW_EDITOR_ID = GraphicalWorkflowEditor.class
-			.getName();
-
-	public static final String ACTIVITY_DETAIL_DIAGRAM_EDITOR_ID = ActivityDetailDiagramEditor.class
-			.getName();
-
-	public static final String WPDEPENDENCY_EDITOR_ID = GraphicalWPDependencyEditor.class
-			.getName();
-
-	/** Column descriptor constants */
-	public static final ColumnDescriptor COL_DESC_NAME = new ColumnDescriptor(
-			IBSItemProvider.COL_NAME, ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_NAME),
-			3, 200, true, ColumnDescriptor.CELL_EDITOR_TYPE_TEXT);
-
-	public static final ColumnDescriptor COL_DESC_ID = new ColumnDescriptor(
-			IBSItemProvider.COL_ID, ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_ID),
-			0, 40, true, ColumnDescriptor.CELL_EDITOR_TYPE_NONE);
-
-	public static final ColumnDescriptor COL_DESC_PREFIX = new ColumnDescriptor(
-			IBSItemProvider.COL_PREFIX,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_PREFIX), 0, 80, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_TEXT);
-
-	public static final ColumnDescriptor COL_DESC_MODEL_INFO = new ColumnDescriptor(
-			IBSItemProvider.COL_MODEL_INFO,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_MODEL_INFO), 0, 120, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_NONE); 
-
-	public static final ColumnDescriptor COL_DESC_TYPE = new ColumnDescriptor(
-			IBSItemProvider.COL_TYPE, ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_TYPE),
-			0, 80, true, ColumnDescriptor.CELL_EDITOR_TYPE_NONE);
-
-	public static final ColumnDescriptor COL_DESC_PREDECESSORS = new ColumnDescriptor(
-			IBSItemProvider.COL_PREDECESSORS,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_PREDECESSORS), 2, 100, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_TEXT); 
-
-	public static final ColumnDescriptor COL_DESC_IS_REPEATABLE = new ColumnDescriptor(
-			IBSItemProvider.COL_IS_REPEATABLE,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_IS_REPEATABLE), 1, 60, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN); 
-
-	public static final ColumnDescriptor COL_DESC_IS_ONGOING = new ColumnDescriptor(
-			IBSItemProvider.COL_IS_ONGOING,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_IS_ONGOING), 1, 60, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN);
-
-	public static final ColumnDescriptor COL_DESC_IS_EVENT_DRIVEN = new ColumnDescriptor(
-			IBSItemProvider.COL_IS_EVENT_DRIVEN,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_IS_EVENT_DRIVEN), 1, 60, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN); 
-
-	public static final ColumnDescriptor COL_DESC_TEAM = new ColumnDescriptor(
-			IBSItemProvider.COL_TEAMS, ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_TEAMS),
-			1, 100, true, ColumnDescriptor.CELL_EDITOR_TYPE_TEXT);
-
-	public static final ColumnDescriptor COL_DESC_ENTRY_STATE = new ColumnDescriptor(
-			IBSItemProvider.COL_ENTRY_STATE,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_ENTRY_STATE), 1, 60, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_TEXT); 
-
-	public static final ColumnDescriptor COL_DESC_EXIT_STATE = new ColumnDescriptor(
-			IBSItemProvider.COL_EXIT_STATE,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_EXIT_STATE), 1, 60, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_TEXT); 
-
-	public static final ColumnDescriptor COL_DESC_PRESENTATION_NAME = new ColumnDescriptor(
-			IBSItemProvider.COL_PRESENTATION_NAME,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_PRESENTATION_NAME), 3, 200, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_TEXT); 
-
-	public static final ColumnDescriptor COL_DESC_DELIVERABLE = new ColumnDescriptor(
-			IBSItemProvider.COL_DELIVERABLE,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_DELIVERABLE), 1, 100, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_TEXT); 
-
-	public static final ColumnDescriptor COL_DESC_IS_OPTIONAL = new ColumnDescriptor(
-			IBSItemProvider.COL_IS_OPTIONAL,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_IS_OPTIONAL), 1, 60, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN); 
-
-	public static final ColumnDescriptor COL_DESC_IS_PLANNED = new ColumnDescriptor(
-			IBSItemProvider.COL_IS_PLANNED,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_IS_PLANNED), 1, 60, true,
-			ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN);
-
-	public static final ColumnDescriptor COL_DESC_HAS_MULTIPLE_OCCURRENCES = new ColumnDescriptor(
-			IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES,
-			ProcessUtil.getColumnDisplayName(IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES), 1, 60,
-			true, ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN); 
-
-	public static final String WBS_FORM_ID = "wbs"; //$NON-NLS-1$
-
-	public static final String TA_FORM_ID = "tbs"; //$NON-NLS-1$
-
-	public static final String WPBS_FORM_ID = "wpbs"; //$NON-NLS-1$
-
-	public static final String CONSOLIDATED_FORM_ID = "consolidated"; //$NON-NLS-1$
-	
-	DiagramEditorHelper diagramEditorHelper = null;
-
-	// change the default order based on 152867 - Publish option and prefrences
-	/* WBS: Presentation Name, Index, Predecessors, Model Info, Type, Planned,
-			Repeatable, Multiple Occurrences, Ongoing, Event-driven, Optional
-		TA: Presentation Name, Model Info, Team, Type, Planned, Multiple
-			Occurrences, Optional
-		Work Product Usage: Presentation Name, Model Info, Entry State, Exit State, 
-			Deliverable, Type, Planned, Multiple Occurrences, Optional
-	*/
-	// Jinhua Xi, 08/21/2006
-	
-	// the default list must be available in the library plugin as well.
-	// duplicate definition for now, will need to merge together later
-	// see PreferenceConstants.org.eclipse.epf.library.prefs
-	
-	public static final List<ColumnDescriptor> DEFAULT_TBS_COLUMNS = Arrays
-			.asList(new ColumnDescriptor[] {
-					COL_DESC_PRESENTATION_NAME,
-					// COL_DESC_ID,
-					//COL_DESC_PREFIX, 
-					COL_DESC_MODEL_INFO, COL_DESC_TEAM, COL_DESC_TYPE,
-					COL_DESC_IS_PLANNED,
-					COL_DESC_HAS_MULTIPLE_OCCURRENCES, COL_DESC_IS_OPTIONAL });
-
-	public static final List DEFAULT_WPBS_COLUMNS = Arrays
-			.asList(new ColumnDescriptor[] {
-					COL_DESC_PRESENTATION_NAME,
-					// COL_DESC_ID,
-					//COL_DESC_PREFIX, 
-					COL_DESC_MODEL_INFO, COL_DESC_ENTRY_STATE,
-					COL_DESC_EXIT_STATE, 
-					COL_DESC_DELIVERABLE, COL_DESC_TYPE, 
-					COL_DESC_IS_PLANNED, COL_DESC_HAS_MULTIPLE_OCCURRENCES, COL_DESC_IS_OPTIONAL });
-
-	public static final List<ColumnDescriptor> DEFAULT_WBS_COLUMNS = Arrays
-			.asList(new ColumnDescriptor[] { COL_DESC_PRESENTATION_NAME,
-					COL_DESC_ID, 
-					//COL_DESC_PREFIX, 
-					COL_DESC_PREDECESSORS, COL_DESC_MODEL_INFO,
-					COL_DESC_TYPE, COL_DESC_IS_PLANNED, 
-					COL_DESC_IS_REPEATABLE, COL_DESC_HAS_MULTIPLE_OCCURRENCES, COL_DESC_IS_ONGOING,
-					COL_DESC_IS_EVENT_DRIVEN, COL_DESC_IS_OPTIONAL
-					 });
-
-	 
-	public static final List<ColumnDescriptor> ALL_WBS_COLUMNS = new ArrayList<ColumnDescriptor>(
-			DEFAULT_WBS_COLUMNS);
-
-	public static final List<ColumnDescriptor> ALL_TBS_COLUMNS = new ArrayList<ColumnDescriptor>(
-			DEFAULT_TBS_COLUMNS);
-
-	public static final List<ColumnDescriptor> ALL_WPBS_COLUMNS = new ArrayList<ColumnDescriptor>(
-			DEFAULT_WPBS_COLUMNS);
-
-	public static final Map<String, ColumnDescriptor> idToColumnDescriptorMap = new HashMap<String, ColumnDescriptor>();
-	static {
-		ALL_WBS_COLUMNS.add(COL_DESC_PREFIX);
-		ALL_TBS_COLUMNS.add(COL_DESC_PREFIX);
-		ALL_WPBS_COLUMNS.add(COL_DESC_PREFIX);
-		
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_NAME.id,
-				COL_DESC_NAME);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_ID.id, COL_DESC_ID);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_PREFIX.id,
-				COL_DESC_PREFIX);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_MODEL_INFO.id,
-				COL_DESC_MODEL_INFO);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_TYPE.id,
-				COL_DESC_TYPE);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_PREDECESSORS.id,
-				COL_DESC_PREDECESSORS);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_IS_REPEATABLE.id,
-				COL_DESC_IS_REPEATABLE);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_IS_ONGOING.id,
-				COL_DESC_IS_ONGOING);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_IS_EVENT_DRIVEN.id,
-				COL_DESC_IS_EVENT_DRIVEN);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_TEAM.id,
-				COL_DESC_TEAM);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_ENTRY_STATE.id,
-				COL_DESC_ENTRY_STATE);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_EXIT_STATE.id,
-				COL_DESC_EXIT_STATE);
-		ProcessEditor.idToColumnDescriptorMap.put(
-				COL_DESC_PRESENTATION_NAME.id, COL_DESC_PRESENTATION_NAME);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_DELIVERABLE.id,
-				COL_DESC_DELIVERABLE);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_IS_OPTIONAL.id,
-				COL_DESC_IS_OPTIONAL);
-		ProcessEditor.idToColumnDescriptorMap.put(COL_DESC_IS_PLANNED.id,
-				COL_DESC_IS_PLANNED);
-		ProcessEditor.idToColumnDescriptorMap.put(
-				COL_DESC_HAS_MULTIPLE_OCCURRENCES.id,
-				COL_DESC_HAS_MULTIPLE_OCCURRENCES);
-
-		ALL_WBS_COLUMNS.add(COL_DESC_NAME);
-		ALL_TBS_COLUMNS.add(COL_DESC_NAME);
-		ALL_WPBS_COLUMNS.add(COL_DESC_NAME);
-	}
-
-	protected static boolean addAdapterFactoryListeners = false;
-
-	private class ProcessEditorDropAdapter extends
-			EditingDomainTableTreeViewerDropAdapter {
-
-		/**
-		 * @param domain
-		 * @param viewer
-		 */
-		public ProcessEditorDropAdapter(EditingDomain domain, Viewer viewer) {
-			super(domain, viewer);
-		}
-
-		/** 
-		 * @see org.eclipse.epf.authoring.ui.dnd.EditingDomainTableTreeViewerDropAdapter#getDropTarget(org.eclipse.swt.widgets.Widget)
-		 */
-		protected Object getDropTarget(Widget item) {
-			Object target = super.getDropTarget(item);
-			if (target == null && selectedProcessComponent != null) {
-				target = selectedProcessComponent.getProcess();
-			}
-			return target;
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.dnd.EditingDomainTableTreeViewerDropAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
-		 */
-		public void drop(DropTargetEvent event) {
-			if (currentViewer instanceof IActionTypeProvider) {
-				((IActionTypeProvider) currentViewer).setInputData(new Point(
-						event.x, event.y));
-			}
-			super.drop(event);
-		}
-	}
-
-	protected ComposedAdapterFactory adapterFactory;
-
-	protected AdapterFactoryEditingDomain editingDomain;
-
-	protected Viewer currentViewer;
-
-	protected ISelectionChangedListener selectionChangedListener;
-
-	protected Collection selectionChangedListeners = new ArrayList();
-
-	protected ISelection viewSelection;
-
-	protected ProcessComponent selectedProcessComponent;
-
-	protected Process selectedProcess;
-
-	protected Adapter processComponentListener = new AdapterImpl() {
-		/**
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			switch (msg.getFeatureID(ProcessComponent.class)) {
-			case UmaPackage.PROCESS_COMPONENT__NAME:
-				String name = msg.getNewStringValue();
-				if (name == null)
-					name = ""; //$NON-NLS-1$
-				setPartName(name);
-
-				if (pages != null) {
-					for (Iterator iter = pages.iterator(); iter.hasNext();) {
-						Object page = iter.next();
-						if (page instanceof ProcessDescription) {
-							((ProcessDescription) page)
-									.refreshElementName(name);
-						}
-
-					}
-				}
-
-				break;
-			}
-		}
-	};
-
-	protected AdapterFactoryContentProvider propContentProvider;
-
-	protected MethodConfiguration currentConfig;
-
-	protected ILibraryChangeListener libraryListener = new ILibraryChangeListener() {
-
-		public void libraryChanged(int option, Collection collection) {
-			switch (option) {
-			// case ILibraryChangeListener.OPTION_LOADED:
-			// // close all open diagram editors
-			// //
-			// IEditorReference[] editorRefs =
-			// getSite().getPage().getEditorReferences();
-			// for (int i = 0; i < editorRefs.length; i++) {
-			// IEditorPart editorPart = editorRefs[i].getEditor(false);
-			// if(editorPart instanceof GraphicalWorkflowEditor
-			// || editorPart instanceof ProcessFormEditor) {
-			// getSite().getPage().closeEditor(editorPart, true);
-			// }
-			// }
-			// getSite().getPage().closeEditor(ProcessFormEditor.this, true);
-			case ILibraryChangeListener.OPTION_CHANGED: {
-				if (collection != null && collection.contains(currentConfig)) {
-					MethodConfiguration config = ProcessAuthoringConfigurator.INSTANCE
-							.getMethodConfiguration();
-					try {
-						ProcessAuthoringConfigurator.INSTANCE
-								.setMethodConfiguration(currentConfig);
-						refreshAll();
-					} finally {
-						ProcessAuthoringConfigurator.INSTANCE
-								.setMethodConfiguration(config);
-					}
-				}
-				break;
-			}
-				// handled by libSvcListener
-				// case ILibraryChangeListener.OPTION_CONFIGURATION_SELECTED: {
-				// configChanged();
-				// break;
-				// }
-
-			}
-
-		}
-
-	};
-
-	protected ILibraryServiceListener libSvcListener = new ILibraryServiceListener() {
-
-		public void configurationSet(MethodConfiguration config) {
-			configChanged();
-		}
-
-		public void libraryClosed(MethodLibrary library) {
-		}
-
-		public void libraryCreated(MethodLibrary library) {
-		}
-
-		public void libraryOpened(MethodLibrary library) {
-		}
-
-		public void libraryReopened(MethodLibrary library) {
-		}
-
-		public void librarySet(MethodLibrary library) {
-		}
-
-	};
-
-	protected ProcessBreakdownStructureFormPage WBSTab;
-
-	protected ProcessBreakdownStructureFormPage OBSTab;
-
-	protected ProcessBreakdownStructureFormPage PBSTab;
-
-	protected ProcessBreakdownStructureFormPage procTab;
-
-	protected ProcessBreakdownStructureFormPage[] extensionTabs = null;
-
-	protected ProcessBreakdownStructureFormPage[] bsPages;
-
-	protected EPFPropertySheetPage propertySheetPage;
-
-	public Collection resourcesToSave = new ArrayList();
-
-	// private boolean firstExpanded = false;
-
-	/**
-	 * a listener that is interested in part activation events.
-	 */
-	protected IPartListener partActivationListener = new IPartListener() {
-
-		public void partActivated(IWorkbenchPart part) {
-			if (part instanceof PropertySheet) {
-				removePropertiesDropDownMenu(part);
-			}
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-			// if(!firstExpanded) {
-			// synchronized(ProcessFormEditor.this) {
-			// if(firstExpanded) {
-			// ((AbstractTreeViewer) WBSTab.getViewer()).expandAll();
-			// ((AbstractTreeViewer) OBSTab.getViewer()).expandAll();
-			// ((AbstractTreeViewer) PBSTab.getViewer()).expandAll();
-			// firstExpanded = true;
-			// }
-			// }
-			// }
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-			if (part instanceof PropertySheet) {
-				propertySheetPage = null;
-			}
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partOpened(IWorkbenchPart part) {
-			if (part instanceof PropertySheet) {
-				removePropertiesDropDownMenu(part);
-			}
-		}
-	};
-
-	protected IPropertyChangeListenerWrapper prefStoreListener;
-
-	// private ProcessConfigurator configurator;
-
-	protected Suppression suppression;
-
-	protected boolean synchronizingSelection;
-
-	protected boolean inputChanged;
-
-	public static final IAdapterFactoryProvider adapterFactoryProvider = new IAdapterFactoryProvider() {
-
-		public AdapterFactory getCBSAdapterFactory() {
-			return TngAdapterFactory.INSTANCE.getProcessComposedAdapterFactory();
-		}
-
-		public AdapterFactory getTBSAdapterFactory() {
-			return TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory();
-		}
-
-		public AdapterFactory getWBSAdapterFactory() {
-			return TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-		}
-
-		public AdapterFactory getWPBSAdapterFactory() {
-			return TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory();
-		}
-	};
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#isValidateResourcesBeforeSaveRequired()
-	 */
-	protected boolean isValidateResourcesBeforeSaveRequired() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#createValidateResourceAction()
-	 */
-	protected LibraryValidateAction createValidateResourceAction() {
-		LibraryValidateAction validateAction = super.createValidateResourceAction();
-		validateAction.putContextData(LibraryEValidator.CTX_ADAPTER_FACTORY_PROVIDER,
-				adapterFactoryProvider);
-		return validateAction;
-	}
-	
-	protected void inputChanged(Object newInput) {
-		inputChanged = false;
-		if (!(newInput instanceof MethodElementEditorInput))
-			return;
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) newInput;
-
-		Object obj = methodElementInput.getMethodElement();
-		if (obj instanceof ProcessComponent) {
-			selectedProcessComponent = (ProcessComponent) obj;
-			selectedProcess = getTopBreakdownElement(selectedProcessComponent);
-			suppression = getSuppression(selectedProcess);
-
-			// for (Iterator iter = pages.iterator(); iter.hasNext();) {
-			// Object page = iter.next();
-			// if(page instanceof ProcessBreakdownStructureFormPage) {
-			// ((ProcessBreakdownStructureFormPage)page).setProcess(proc);
-			// }
-			// }
-
-			if (WBSTab != null) {
-				WBSTab.setProcess(selectedProcess);
-			}
-			
-			if ( OBSTab != null ) {
-				OBSTab.setProcess(selectedProcess);
-			}
-			
-			if ( PBSTab != null ) {
-				PBSTab.setProcess(selectedProcess);
-			}
-			
-			if ( procTab != null ) {
-				procTab.setProcess(selectedProcess);
-			}
-			
-			if (extensionTabs != null) {
-				for (int i = 0; i < extensionTabs.length; i++) {
-					if (extensionTabs[i] != null) {
-						extensionTabs[i].setProcess(selectedProcess);
-					}
-				}
-			}
-
-		}
-	}
-
-	
-	/**
-	 * @return
-	 */
-	protected Process  getTopBreakdownElement(ProcessComponent selectedProcessComponent) {
-		return (Process) ProcessUtil.getTopBreakdownElement(selectedProcessComponent);
-	}
-	
-	   /**
-     * @param selectedProcess
-     * @return
-     */
-    protected Suppression getSuppression(Process selectedProcess) {
-        return Suppression.getSuppression(selectedProcess);
-    }
-
-    
-	// private String getTitlePrefix() {
-	// IEditorInput input = getEditorInput();
-	// if (input instanceof MethodElementEditorInput) {
-	// Object obj = ((MethodElementEditorInput) input).getMethodElement();
-	// if (obj instanceof ProcessComponent) {
-	// ProcessComponent pc = (ProcessComponent) obj;
-	// Process proc = pc.getProcess();
-	// if (proc instanceof CapabilityPattern) {
-	// return LibraryUIText.TEXT_CAPABILITY_PATTERN;
-	// } else if (proc instanceof DeliveryProcess) {
-	// return LibraryUIText.TEXT_DELIVERY_PROCESS;
-	// } else if (proc instanceof ProcessContribution) {
-	// return LibraryUIText.TEXT_PROCESS_CONTRIBUTION;
-	// }
-	// }
-	// }
-	// return AuthoringUIResources
-	// .getString("AuthoringUI.ProcessEditor.Title"); //$NON-NLS-1$
-	// }
-
-	protected Image getProcTitleImage() {
-		IEditorInput input = getEditorInput();
-		if (input instanceof MethodElementEditorInput) {
-			Object obj = ((MethodElementEditorInput) input).getMethodElement();
-			if (obj instanceof ProcessComponent) {
-				ProcessComponent pc = (ProcessComponent) obj;
-				Process proc = pc.getProcess();
-				if (proc instanceof CapabilityPattern) {
-					return LibraryUIImages.IMG_CAPABILITY_PATTERN;
-				} else if (proc instanceof DeliveryProcess) {
-					return LibraryUIImages.IMG_DELIVERY_PROCESS;
-				}
-			}
-		}
-		return LibraryUIImages.IMG_PROCESS;
-	}
-
-	/**
-	 * Remove Properties view drop down menu
-	 * 
-	 * @param part
-	 */
-	protected void removePropertiesDropDownMenu(IWorkbenchPart part) {
-		if (part instanceof PropertySheet) {
-			IViewSite view = ((PropertySheet) part).getViewSite();
-
-			IMenuManager menuMgr = view.getActionBars().getMenuManager();
-			// IContributionItem[] items = menuMgr.getItems();
-			// for (int i=0; i < items.length; i++)
-			// {
-			// System.out.println("Id =" + i + " " + items[i].getId() + "$");
-			// }
-			menuMgr.removeAll();
-			menuMgr.updateAll(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		super.init(site, input);
-
-		// TODO: need revisit
-		// site.setSelectionProvider(new FormEditorSelectionProvider(this));
-		// actionManager = getActionManager();
-
-		List factories = new ArrayList();
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-
-		adapterFactory = new ComposedAdapterFactory(factories);
-
-		// Create the command stack that will notify this editor as commands are
-		// executed.
-		//
-		CommandStack commandStack = actionMgr.getCommandStack(); // new
-		// BasicCommandStack();
-
-		// Add a listener to set the most recent command's affected objects to
-		// be the selection of the viewer with focus.
-		//
-		commandStack.addCommandStackListener(new CommandStackListener() {
-			public void commandStackChanged(final EventObject event) {
-				boolean run = false;
-				if (event instanceof CommandStackChangedEvent) {
-					switch (((CommandStackChangedEvent) event).getType()) {
-					case CommandStackChangedEvent.EXECUTED:
-					case CommandStackChangedEvent.UNDO:
-						run = true;
-						break;
-					}
-				} else {
-					run = true;
-				}
-				if (run) {
-					Display.getCurrent().asyncExec(new Runnable() {
-						public void run() {
-							firePropertyChange(IEditorPart.PROP_DIRTY);
-
-							// Try to select the affected objects.
-							//
-							Command mostRecentCommand = ((CommandStack) event
-									.getSource()).getMostRecentCommand();
-							if (mostRecentCommand != null) {
-									if (!(TngUtil.unwrap(mostRecentCommand) instanceof SetCommand)) {
-										setSelectionToViewer(mostRecentCommand
-												.getAffectedObjects());
-									}
-									if (mostRecentCommand instanceof CreateChildCommand
-											&& currentViewer instanceof ProcessViewer) {
-										Object[] arr = mostRecentCommand
-												.getAffectedObjects().toArray();
-										if (arr.length == 1) {
-											ProcessViewer viewer = (ProcessViewer) currentViewer;
-											viewer.editElement(arr[0], 0);
-										}
-									}
-							}
-							// if (propertySheetPage != null) {
-							// propertySheetPage.refresh();
-							// }
-						}
-					});
-				}
-			}
-		});
-
-		// Create the editing domain with a special command stack.
-		editingDomain = new TraceableAdapterFactoryEditingDomain(
-				adapterFactory, commandStack);
-
-		LibraryService.getInstance().addListener(libSvcListener);
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.addListener(libraryListener);
-			manager.startListeningTo(actionMgr.getCommandStack());
-
-			// TODO: need to revisit this code
-			if (!addAdapterFactoryListeners) {
-				addAdapterFactoryListeners = true;
-				manager.startListeningTo(TngAdapterFactory.INSTANCE
-						.getWBS_ComposedAdapterFactory());
-				manager.startListeningTo(TngAdapterFactory.INSTANCE
-						.getOBS_ComposedAdapterFactory());
-				manager.startListeningTo(TngAdapterFactory.INSTANCE
-						.getPBS_ComposedAdapterFactory());
-			}
-		}
-
-		//setPartName(input.getName());
-		//setTitleImage(getProcTitleImage());
-
-		setPartFacade(input);
-
-		// get method element object from Editor input
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-		elementObj = methodElementInput.getMethodElement();
-
-		if (elementObj instanceof ProcessComponent) {
-			selectedProcessComponent = ((ProcessComponent) elementObj);
-			selectedProcess = selectedProcessComponent.getProcess();
-		}
-
-		if (selectedProcessComponent != null) {
-			selectedProcessComponent.eAdapters().add(processComponentListener);
-		}
-
-		// listen to resource change to update dirty flag
-		//
-		// addResourceChangedListener();
-
-		// add part listener to listen to propertySheet close event
-		getSite().getWorkbenchWindow().getPartService().addPartListener(
-				partActivationListener);
-
-		// inputChanged(input);
-
-		// listen to the change of column list in preference store
-		//
-		if (prefStoreListener == null) {
-			prefStoreListener = new IPropertyChangeListenerWrapper() {
-
-				public void propertyChange(IPropertyChangeEventWrapper event) {
-					ProcessBreakdownStructureFormPage page = null;
-					if (event.getProperty().equals(
-							ApplicationPreferenceConstants.PREF_WBS_COLUMNS)) {
-						page = WBSTab;
-					} else if (event.getProperty().equals(
-							ApplicationPreferenceConstants.PREF_TBS_COLUMNS)) {
-						page = OBSTab;
-					} else if (event.getProperty().equals(
-							ApplicationPreferenceConstants.PREF_WPBS_COLUMNS)) {
-						page = PBSTab;
-					}
-					if (page != null) {
-						ColumnDescriptor[] cols = toColumnDescriptors(getPreferenceStore().getString(
-										event.getProperty()));
-						page.updateColumns(cols);
-						if (page == WBSTab || page == OBSTab) {
-							// update consolidated view as well
-							//
-							// get WBS columns
-							List list = toColumnDescriptorList(getPreferenceStore()
-									.getString(ApplicationPreferenceConstants.PREF_WBS_COLUMNS));
-
-							// get TBS columns 
-							ColumnDescriptor[] teamColumnDescriptors = toColumnDescriptors(getPreferenceStore()
-									.getString(ApplicationPreferenceConstants.PREF_TBS_COLUMNS));
-
-							// if TBS columns has TEAM column then add to consolidated view
-							for (int i = 0; i < teamColumnDescriptors.length; i++) {
-								ColumnDescriptor colDesc = teamColumnDescriptors[i];
-								if (colDesc == COL_DESC_TEAM) {
-									list.add(colDesc);
-									break;
-								}
-							}
-							
-							ColumnDescriptor[] columns = new ColumnDescriptor[list.size()];
-							list.toArray(columns);
-							procTab.updateColumns(columns);
-						}
-					}
-				}
-
-			};
-		}
-
-		getPreferenceStore()
-				.addPropertyChangeListener(prefStoreListener);
-		
-		diagramEditorHelper = new DiagramEditorHelper();
-
-	}
-
-    /**
-     * @param input
-     */
-    protected void setPartFacade(IEditorInput input) {
-        setPartName(input.getName());
-        setTitleImage(getProcTitleImage());
-    }
-
-	/**
-	 * This sets the selection into whichever viewer is active. 
-	 * 
-	 */
-	public void setSelectionToViewer(Collection collection) {
-		if (currentViewer != null && collection != null && !collection.isEmpty()) {
-					// Try to select the items in the current content viewer of
-					// the editor.
-					//
-			currentViewer.setSelection(new StructuredSelection(
-					collection.toArray()), true);
-		}
-	}
-
-	public EditingDomainActionBarContributor getActionBarContributor() {
-		return (EditingDomainActionBarContributor) getEditorSite()
-				.getActionBarContributor();
-	}
-
-	public void dispose() {
-		// close all diagram editors of this process
-		//
-		closeAllDiagramEditors();
-		
-		getPreferenceStore()
-				.removePropertyChangeListener(prefStoreListener);
-
-		// ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
-		//
-		// getSite().getPage().removePartListener(partListener);
-
-		adapterFactory.dispose();
-
-		if (getActionBarContributor().getActiveEditor() == this) {
-			getActionBarContributor().setActiveEditor(null);
-		}
-
-		if (propertySheetPage != null) {
-			propertySheetPage.dispose();
-		}
-
-		ILibraryManager manager = LibraryService.getInstance()
-				.getCurrentLibraryManager();
-		if (manager != null) {
-			manager.removeListener(libraryListener);
-			manager.stopListeningTo(editingDomain.getCommandStack());
-		}
-		LibraryService.getInstance().removeListener(libSvcListener);
-
-		if (selectedProcessComponent != null) {
-			selectedProcessComponent.eAdapters().remove(
-					processComponentListener);
-		}
-
-		// removeResourceChangedListener();
-
-		getSite().getWorkbenchWindow().getPartService().removePartListener(
-				partActivationListener);
-
-		boolean saveNeeded = isDirty();
-		
-		super.dispose();
-		
-		if(diagramEditorHelper != null)
-			diagramEditorHelper.dispose();
-
-
-		// call this to set modified flag of suppression to false
-		//
-		suppression.saveIsDone();
-
-		if (saveNeeded) {
-			// user discarded all the changes, save the resources after changes
-			// are undone.
-			// TODO: reload the process component resource instead since it is
-			// not shared.
-			//
-			// for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			// Resource resource = (Resource) iter.next();
-			// saveResource(resource);
-			// }
-		}
-	}
-
-	private void closeAllDiagramEditors() {
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		if(workbenchPage == null) {
-			// workbench is closing, all editor will be closed so no need to close the diagram editor here
-			//
-			return;
-		}
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		ArrayList<IEditorReference> diagramEditorRefs = new ArrayList<IEditorReference>();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			IEditorInput input = editor.getEditorInput();
-			if (input instanceof DiagramEditorInputProxy) {
-				DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input)
-				.getDiagramEditorInput();
-				if (diagramInput != null) {
-					MethodElement element = diagramInput.getMethodElement();
-					if (element instanceof BreakdownElement
-							&& selectedProcess == TngUtil
-							.getOwningProcess((BreakdownElement) element)) {
-						diagramEditorRefs.add(reference);
-					}
-				}
-			}
-		}
-		if(!diagramEditorRefs.isEmpty()) {
-			IEditorReference[] refs = new IEditorReference[diagramEditorRefs.size()];
-			diagramEditorRefs.toArray(refs);
-			workbenchPage.closeEditors(refs, true);
-		}
-	}
-
-	protected void addDescriptionPage() throws PartInitException {
-		if (selectedProcess instanceof DeliveryProcess) {
-			// Delivery Process
-			addPage(0, new DeliveryProcessDescription(this));
-		} else {
-			// Capability Pattern
-			// Process Contribution
-			addPage(0, new ProcessDescription(this));
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
-	 */
-	protected void addPages() {
-		try {
-			addDescriptionPage();
-
-			AdapterFactory adapterFactory;
-
-			// create DND transfer objects
-			// int dndOperations = DND.DROP_COPY | DND.DROP_LINK;
-			// Transfer[] transfers = new Transfer[]
-			// {LocalTransfer.getInstance() };
-
-			// preference is managed by library plugin,
-			// since this preferences is also used for browsing and publishing
-			// Jinhua Xi 08/21/2006
-			// IPreferenceStore store = AuthoringUIPlugin.getDefault()
-			// .getPreferenceStore();
-			PreferenceUtil.validatePreferences();
-			IPreferenceStoreWrapper store = getPreferenceStore();
-			
-			List pages = new ArrayList();
-
-			// WBS tab
-			WBSTab = new ProcessBreakdownStructureFormPage(this, WBS_FORM_ID,
-					AuthoringUIResources.ProcessEditor_WorkBreakdownStructure); 
-			ColumnDescriptor[] columnDescriptors = toColumnDescriptors(store
-					.getString(ApplicationPreferenceConstants.PREF_WBS_COLUMNS));
-			adapterFactory = TngAdapterFactory.INSTANCE
-					.getWBS_ComposedAdapterFactory();
-			currentConfig = LibraryService.getInstance()
-					.getCurrentMethodConfiguration();
-			ProcessAuthoringConfigurator.INSTANCE
-					.setMethodConfiguration(currentConfig);
-			if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-				((ConfigurableComposedAdapterFactory) adapterFactory)
-						.setFilter(ProcessAuthoringConfigurator.INSTANCE);
-			}
-			WBSTab.setAdapterFactory(adapterFactory);
-			WBSTab.setColumnDescriptors(columnDescriptors);
-			int id = addPage(WBSTab.createControl(getContainer()));
-			setPageText(id, WBSTab.getTitle());
-			WBSTab.setTabIndex(id);
-			StructuredViewer viewer = (StructuredViewer) WBSTab.getViewer();
-			createContextMenuFor(viewer);
-			pages.add(WBSTab);
-			// viewer.addDropSupport(dndOperations, transfers, new
-			// ProcessEditorDropAdapter(editingDomain, viewer));
-			// viewer.addDoubleClickListener(new IDoubleClickListener()
-			// {
-			// public void doubleClick(DoubleClickEvent event)
-			// {
-			// UIActionDispatcher.getInstance().handleDoubleClickEvent(event);
-			// // System.out.println("double clicked ...");
-			// //
-			// // StructuredSelection selection = (StructuredSelection)
-			// event.getSelection();
-			// // System.out.println("sel"+selection.getFirstElement());
-			// //
-			// ProductEditorView.getView().getProductViewer().setInput(selection.getFirstElement());
-			// }
-			// });
-			// addPage(WBSTab);
-
-			// OBS tab
-			OBSTab = new ProcessBreakdownStructureFormPage(this, TA_FORM_ID,
-					AuthoringUIResources.ProcessEditor_TeamAllocation); 
-			columnDescriptors = toColumnDescriptors(store
-					.getString(ApplicationPreferenceConstants.PREF_TBS_COLUMNS));
-			// setColumnIndexToNameMap(TngAdapterFactory.INSTANCE.getOBS_AdapterFactories(),
-			// columnDescriptors);
-			adapterFactory = TngAdapterFactory.INSTANCE
-					.getOBS_ComposedAdapterFactory();
-			if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-				((ConfigurableComposedAdapterFactory) adapterFactory)
-						.setFilter(ProcessAuthoringConfigurator.INSTANCE);
-			}
-			OBSTab.setAdapterFactory(adapterFactory);
-			OBSTab.setColumnDescriptors(columnDescriptors);
-			id = addPage(OBSTab.createControl(getContainer()));
-			setPageText(id, OBSTab.getTitle());
-			OBSTab.setTabIndex(id);
-			viewer = (StructuredViewer) OBSTab.getViewer();
-			createContextMenuFor(viewer);
-			pages.add(OBSTab);
-			// viewer.addDropSupport(dndOperations, transfers, new
-			// ProcessEditorDropAdapter(editingDomain, viewer));
-			// addPage(OBSTab);
-
-			// PBS tab
-			PBSTab = new ProcessBreakdownStructureFormPage(this, WPBS_FORM_ID,
-					AuthoringUIResources.ProcessEditor_WorkProductUsage); 
-			columnDescriptors = toColumnDescriptors(store
-					.getString(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS));
-			// setColumnIndexToNameMap(TngAdapterFactory.INSTANCE.getPBS_AdapterFactories(),
-			// columnDescriptors);
-			adapterFactory = TngAdapterFactory.INSTANCE
-					.getPBS_ComposedAdapterFactory();
-			if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-				((ConfigurableComposedAdapterFactory) adapterFactory)
-						.setFilter(ProcessAuthoringConfigurator.INSTANCE);
-			}
-			PBSTab.setAdapterFactory(adapterFactory);
-			PBSTab.setColumnDescriptors(columnDescriptors);
-			id = addPage(PBSTab.createControl(getContainer()));
-			setPageText(id, PBSTab.getTitle());
-			PBSTab.setTabIndex(id);
-			viewer = (StructuredViewer) PBSTab.getViewer();
-			createContextMenuFor(viewer);
-			pages.add(PBSTab);
-			// viewer.addDropSupport(dndOperations, transfers, new
-			// ProcessEditorDropAdapter(editingDomain, viewer));
-			// addPage(PBSTab);
-
-			// consolidated tab
-			procTab = new ProcessBreakdownStructureFormPage(this,
-					CONSOLIDATED_FORM_ID,
-					AuthoringUIResources.ProcessEditor_ConsolidatedView); 
-			procTab.setReadOnly(true);
-			adapterFactory = TngAdapterFactory.INSTANCE
-					.getProcessComposedAdapterFactory();
-			if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-				((ConfigurableComposedAdapterFactory) adapterFactory)
-						.setFilter(ProcessAuthoringConfigurator.INSTANCE);
-			}
-			procTab.setAdapterFactory(adapterFactory);
-//			columnDescriptors = toColumnDescriptors(store
-//					.getString(ApplicationPreferenceConstants.PREF_WBS_COLUMNS));
-//			
-			// get WBS columns
-			List list = toColumnDescriptorList(store
-					.getString(ApplicationPreferenceConstants.PREF_WBS_COLUMNS));
-
-			// get TBS columns 
-			ColumnDescriptor[] teamColumnDescriptors = toColumnDescriptors(store
-					.getString(ApplicationPreferenceConstants.PREF_TBS_COLUMNS));
-
-			// if TBS columns has TEAM column then add to consolidated view
-			for (int i = 0; i < teamColumnDescriptors.length; i++) {
-				ColumnDescriptor colDesc = teamColumnDescriptors[i];
-				if (colDesc == COL_DESC_TEAM) {
-					list.add(colDesc);
-					break;
-				}
-			}
-
-			ColumnDescriptor[] columns = new ColumnDescriptor[list.size()];
-			list.toArray(columns);
-			procTab.setColumnDescriptors(columns);
-			
-			id = addPage(procTab.createControl(getContainer()));
-			setPageText(id, procTab.getTitle());
-			procTab.setTabIndex(id);
-			viewer = (StructuredViewer) procTab.getViewer();
-			createContextMenuFor(viewer);
-			pages.add(procTab);
-
-			// check for extenstion point and add the page if there
-			List pageProviders = ProcessEditorPageProvider.getInstance()
-					.getPageProviders();
-
-			if (pageProviders != null && pageProviders.size() > 0) {
-				try {
-					extensionTabs = new ProcessBreakdownStructureFormPage[pageProviders
-							.size()];
-					for (int i = 0; i < pageProviders.size(); i++) {
-						Object page = pageProviders.get(i);
-						if (page instanceof IExtensionFormPage) {
-
-							IExtensionFormPage formPage = (IExtensionFormPage) page;
-							IFormPage control = formPage.setEditor(this);
-							formPage.setInput(selectedProcess);
-							ProcessBreakdownStructureFormPage extendedPage = null;
-							if (control instanceof ProcessBreakdownStructureFormPage) {
-								extendedPage = (ProcessBreakdownStructureFormPage) control;
-								extensionTabs[i] = extendedPage;
-							}
-
-							id = addPage(extendedPage
-									.createControl(getContainer()));
-							setPageText(id, extendedPage.getTitle());
-							extendedPage.setTabIndex(id);
-							viewer = (StructuredViewer) extendedPage
-									.getViewer();
-							createContextMenuFor(viewer);
-
-							pages.add(extendedPage);
-						}
-					}
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-
-			bsPages = new ProcessBreakdownStructureFormPage[pages.size()];
-			for (int i = 0; i < pages.size(); i++) {
-				bsPages[i] = (ProcessBreakdownStructureFormPage) pages.get(i);
-			}
-
-			// bsPages = new ProcessBreakdownStructureFormPage[] { WBSTab,
-			// OBSTab,
-			// PBSTab, procTab };
-
-			// if(getEditorInput() instanceof ProcessEditorInput) {
-			// int pageId =
-			// ((ProcessEditorInput)getEditorInput()).getActivePage();
-			// if(pageId != -1) {
-			// setActivePage(0);
-			// setActivePage(pageId);
-			// }
-			// }
-
-			inputChanged(getEditorInput());
-		} catch (PartInitException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			e.printStackTrace();
-		}
-	}
-
-	protected void setActivePage(int pageIndex) {
-		super.setActivePage(pageIndex);
-
-		// work around for active page that is not a form page. Super method
-		// does not call pageChange() in this case
-		//
-		handlePageChange();
-		if (pageIndex > 0 && bsPages.length <= pageIndex) {
-			Viewer viewer = bsPages[pageIndex].getViewer();
-			ISelection selection = viewer.getSelection();
-			if (selection == null || selection.isEmpty()) {
-				ISelection initialSelection = null;
-				if (getEditorInput() instanceof ProcessEditorInput) {
-					initialSelection = ((ProcessEditorInput) getEditorInput())
-							.getInitialSelection();
-				}
-				if (initialSelection == null) {
-					selection = new StructuredSelection(selectedProcess);
-				} else {
-					selection = initialSelection;
-				}
-				viewer.setSelection(selection, true);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.forms.editor.FormEditor#setActivePage(java.lang.String)
-	 */
-	public IFormPage setActivePage(String pageId) {
-		int id = -1;
-		IFormPage activePage = null;
-		for (int i = 0; i < pages.size(); i++) {
-			Object page = pages.get(i);
-			if (page instanceof IFormPage) {
-				IFormPage fpage = (IFormPage) page;
-				if (fpage.getId().equals(pageId)) {
-					id = i;
-					activePage = fpage;
-					break;
-				}
-			}
-		}
-		if(id == -1) {
-			for (int i = 0; i < bsPages.length; i++) {
-				ProcessBreakdownStructureFormPage page = bsPages[i];
-				if (page.getId().equals(pageId)) {
-					id = page.getTabIndex();
-					activePage = page;
-					break;
-				}
-			}
-		}
-		if(id == -1 && extensionTabs != null) {
-			for (int i = 0; i < extensionTabs.length; i++) {
-				ProcessBreakdownStructureFormPage page = extensionTabs[i];
-				if (page.getId().equals(pageId)) {
-					id = page.getTabIndex();
-					activePage = page;
-					break;
-				}
-			}
-		}
-
-		if(activePage != null) {
-			setActivePage(id);
-			return activePage;
-		}
-		return null;
-	}
-	
-	protected void handlePageChange() {
-		int id = getActivePage();
-		if (id != -1) {
-			Object page = pages.get(id);
-			if (page instanceof ProcessDescription) {
-				((ProcessDescription) page).setFormText();
-			}
-			if (WBSTab != null && id == WBSTab.getTabIndex()) {
-				setCurrentViewer(WBSTab.getViewer());
-			} else if (OBSTab != null && id == OBSTab.getTabIndex()) {
-				setCurrentViewer(OBSTab.getViewer());
-			} else if (PBSTab != null && id == PBSTab.getTabIndex()) {
-				setCurrentViewer(PBSTab.getViewer());
-			} else if (procTab != null && id == procTab.getTabIndex()) {
-				setCurrentViewer(procTab.getViewer());
-			} else if (extensionTabs != null) {
-				for (int i = 0; i < extensionTabs.length; i++) {
-					if (extensionTabs[i] != null && id == extensionTabs[i].getTabIndex())
-						setCurrentViewer(extensionTabs[i].getViewer());
-				}
-			} else {
-				setCurrentViewer(null);
-			}
-
-			if (propertySheetPage != null) {
-				propertySheetPage.refresh();
-			}
-		}
-	}
-
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-		handlePageChange();
-	}
-
-	/**
-	 * Create context menu for the give viewer
-	 * @param viewer
-	 */
-	public void createContextMenuFor(final StructuredViewer viewer) {
-		MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
-		contextMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		contextMenu.setRemoveAllWhenShown(true);
-		contextMenu.addMenuListener(this);
-		Menu menu = contextMenu.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(contextMenu, viewer);
-
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection sel = (IStructuredSelection) event
-						.getSelection();
-				setSelection(sel);
-			}
-		});
-
-		int dndOperations = DND.DROP_LINK | DND.DROP_COPY | DND.DROP_MOVE;
-		Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };
-		viewer.addDropSupport(dndOperations, transfers,
-				new ProcessEditorDropAdapter(editingDomain, viewer));
-		
-		dndOperations = DND.DROP_MOVE | DND.DROP_COPY;
-		transfers = new Transfer[] { LocalTransfer.getInstance() };
-		viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
-
-	}
-
-	protected void setCurrentViewer(Viewer viewer) {
-		// If it is changing...
-		//
-		if (currentViewer != viewer) {
-			if (selectionChangedListener == null) {
-				// Create the listener on demand.
-				//
-				selectionChangedListener = new ISelectionChangedListener() {
-					// This just notifies those things that are affected by the
-					// section.
-					//
-					public void selectionChanged(
-							SelectionChangedEvent selectionChangedEvent) {
-						setSelection(selectionChangedEvent.getSelection());
-					}
-				};
-			}
-
-			// Stop listening to the old one.
-			//
-			if (currentViewer != null) {
-				currentViewer
-						.removeSelectionChangedListener(selectionChangedListener);
-			}
-
-			// Start listening to the new one.
-			//
-			if (viewer != null) {
-				viewer.addSelectionChangedListener(selectionChangedListener);
-			}
-
-			// Remember it.
-			//
-			currentViewer = viewer;
-
-			// Set adapter factory of editingDomain to that of the current view
-			//
-			if (currentViewer instanceof ProcessViewer) {
-				IContentProvider contentProvider = ((ProcessViewer) currentViewer)
-						.getContentProvider();
-				if (contentProvider instanceof AdapterFactoryContentProvider) {
-					AdapterFactoryContentProvider adapterFactoryContentProvider = ((AdapterFactoryContentProvider) contentProvider);
-					AdapterFactory adapterFactory = adapterFactoryContentProvider
-							.getAdapterFactory();
-					if (adapterFactory instanceof EditingDomainComposedAdapterFactory) {
-						((EditingDomainComposedAdapterFactory) adapterFactory)
-								.setEditingDomain(editingDomain);
-					} else {
-						editingDomain.setAdapterFactory(adapterFactory);
-					}
-
-					if (propContentProvider != null) {
-						propContentProvider.setAdapterFactory(adapterFactory);
-					}
-				}
-			}
-
-			// Set the editors selection based on the current viewer's
-			// selection.
-			//
-			setSelection(currentViewer == null ? StructuredSelection.EMPTY
-					: currentViewer.getSelection());
-
-		}
-	}
-
-	public static Activity getParentActivity(BreakdownElement e,
-			AdapterFactory adapterFactory) {
-		Activity act = UmaUtil.getParentActivity(e);
-		if (act != null) {
-			return act;
-		}
-
-		// TODO: handle element that does not directly belong to an activity
-		// (like deliverable part of a deliverable descriptor)
-		//
-
-		return null;
-	}
-
-	public static AdapterFactory getAdapterFactory(StructuredViewer viewer) {
-		return ((AdapterFactoryContentProvider) viewer.getContentProvider())
-				.getAdapterFactory();
-	}
-
-	public static void setSelectionToViewer(Viewer viewer,
-			IStructuredSelection otherSel, boolean alternateSelection) {
-		if (alternateSelection) {
-			IStructuredSelection sel = (IStructuredSelection) viewer
-					.getSelection();
-			Object currentSelection = null;
-			if (sel.size() == 1) {
-				currentSelection = sel.getFirstElement();
-				if (currentSelection instanceof BreakdownElement) {
-					Activity act = getParentActivity(
-							(BreakdownElement) currentSelection,
-							getAdapterFactory((StructuredViewer) viewer));
-					if (act != otherSel.getFirstElement()) {
-						viewer.setSelection(otherSel, true);
-					}
-				}
-			} else {
-				viewer.setSelection(otherSel, true);
-			}
-		} else {
-			viewer.setSelection(otherSel, true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		if (synchronizingSelection) {
-			return;
-		}
-
-		// // check if the resources of selected objects are out of synch or any
-		// of the selected objects
-		// // became proxy then refresh them if needed
-		// //
-		// if(refreshOutOfSynch(selection)) {
-		// return;
-		// }
-
-		viewSelection = selection;
-		ArrayList listenerList = new ArrayList(selectionChangedListeners);
-
-		for (int i = 0; i < listenerList.size(); i++) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listenerList
-					.get(i);
-			listener
-					.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-
-		// synchronize selection in all BS views if only one element is selected
-		//
-		synchronizeSelection(selection, currentViewer);
-	}
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	protected boolean refreshOutOfSynch(ISelection selection) {
-		if (currentViewer != null && selection instanceof IStructuredSelection) {
-			boolean refreshRequired = false;
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			HashSet<Resource> resources = new HashSet<Resource>();
-			for (Iterator iter = sel.iterator(); iter.hasNext();) {
-				Object e = TngUtil.unwrap(iter.next());
-				if (e instanceof EObject) {
-					EObject eObject = ((EObject) e);
-					if (eObject.eIsProxy()) {
-						eObject = RefreshJob.getInstance().resolve(eObject);
-						refreshRequired = true;
-					}
-					Resource resource = eObject.eResource();
-					if (resource != null) {
-						resources.add(resource);
-					}
-				}
-			}
-			if (!resources.isEmpty()) {
-				ArrayList<Resource> removedResources = new ArrayList<Resource>();
-				ArrayList<Resource> changedResources = new ArrayList<Resource>();
-				ResourceUtil.checkOutOfSynchResources(resources,
-						removedResources, changedResources);
-				if (!removedResources.isEmpty() || !changedResources.isEmpty()) {
-					boolean ret = promptReloadFiles();
-					if (ret) {
-						// unload the removed resources
-						//
-						if (!removedResources.isEmpty()) {
-							PersistenceUtil.unload(removedResources);
-						}
-
-						Collection reloadedResources = null;
-						if (!changedResources.isEmpty()) {
-							// Reload the changed resources.
-							ILibraryManager manager = (ILibraryManager) LibraryService
-									.getInstance().getCurrentLibraryManager();
-							if (manager != null) {
-								reloadedResources = manager
-										.reloadResources(changedResources);
-							}
-						}
-
-						if (!removedResources.isEmpty()
-								|| reloadedResources != null) {
-							refreshRequired = true;
-						}
-
-						// refresh out-of-synch resources
-						//
-						for (Iterator iter = changedResources.iterator(); iter
-								.hasNext();) {
-							FileManager.getInstance().refresh(
-									(Resource) iter.next());
-						}
-					}
-				}
-			}
-			if (refreshRequired) {
-				currentViewer.refresh();
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * @param selection
-	 */
-	protected void synchronizeSelection(ISelection selection, Viewer currentViewer) {
-		try {
-			synchronizingSelection = true;
-			if (currentViewer != null
-					&& selection instanceof IStructuredSelection) {
-				IStructuredSelection sel = (IStructuredSelection) selection;
-				if (sel.size() == 1) {
-					Object selected = sel.getFirstElement();
-					IStructuredSelection otherSel = null;
-					boolean alternateSelection = false;
-					ArrayList selectedPath = null;
-					AdapterFactory adapterFactory = getAdapterFactory((StructuredViewer) currentViewer);
-					if (selected instanceof BreakdownElementWrapperItemProvider) {
-						if (((BreakdownElementWrapperItemProvider) selected)
-								.isReadOnly()) {
-							if (adapterFactory != null) {
-								// get path
-								//
-								Object e = TngUtil.unwrap(selected);
-								selectedPath = new ArrayList();
-								ITreeItemContentProvider adapter = (ITreeItemContentProvider) selected;
-								do {
-									selectedPath.add(0, e);
-									Object parent = adapter.getParent(e);
-									if (parent == null) {
-										break;
-									}
-									if (parent instanceof BreakdownElementWrapperItemProvider) {
-										adapter = (ITreeItemContentProvider) parent;
-										e = TngUtil.unwrap(parent);
-									} else {
-										adapter = (ITreeItemContentProvider) adapterFactory
-												.adapt(
-														parent,
-														ITreeItemContentProvider.class);
-										e = parent;
-									}
-								} while (true);
-							}
-						} else if (procTab.getViewer() == currentViewer) {
-							selected = TngUtil.unwrap(selected);
-							selection = new StructuredSelection(selected);
-						} else if (extensionTabs != null) {
-							for (int i = 0; i < extensionTabs.length; i++) {
-								if (extensionTabs[i].getViewer() == currentViewer) {
-									selected = TngUtil.unwrap(selected);
-									selection = new StructuredSelection(
-											selected);
-
-								}
-							}
-						}
-					}
-					if (selected instanceof BreakdownElement) {
-						if (procTab.getViewer() != currentViewer) {
-							procTab.getViewer().setSelection(selection, false);
-						}
-						if (extensionTabs != null) {
-							for (int i = 0; i < extensionTabs.length; i++) {
-								if (extensionTabs[i].getViewer() != currentViewer)
-									extensionTabs[i].getViewer().setSelection(
-											selection, false);
-							}
-						}
-
-						if (selected instanceof Activity
-								|| selected instanceof Milestone) {
-							otherSel = (IStructuredSelection) selection;
-						} else {
-							Activity act = getParentActivity(
-									(BreakdownElement) selected, adapterFactory);
-							if (act != null) {
-								otherSel = new StructuredSelection(act);
-								alternateSelection = true;
-							}
-						}
-					}
-					if (otherSel != null) {
-						// own element is selected
-						//
-						Viewer viewer = null;
-
-						if ( WBSTab != null ) {
-							viewer = WBSTab.getViewer();
-						}
-						
-						if (viewer != null && viewer != currentViewer) {
-							if (selected instanceof WorkBreakdownElement) {
-								viewer.setSelection(selection, false);
-							} else {
-								setSelectionToViewer(viewer, otherSel,
-										alternateSelection);
-							}
-						}
-						
-						if ( OBSTab != null ) {
-							viewer = OBSTab.getViewer();
-						}
-						
-						if (viewer != null && viewer != currentViewer) {
-							if (selected instanceof RoleDescriptor) {
-								viewer.setSelection(selection, false);
-							} else {
-								setSelectionToViewer(viewer, otherSel,
-										alternateSelection);
-							}
-						}
-						
-						if ( PBSTab != null ) {
-							viewer = PBSTab.getViewer();
-						}
-						
-						if (viewer != null && viewer != currentViewer) {
-							if (selected instanceof WorkProductDescriptor) {
-								viewer.setSelection(selection, false);
-							} else {
-								setSelectionToViewer(viewer, otherSel,
-										alternateSelection);
-							}
-						}
-					} else if (selectedPath != null) {
-						// inherited element is selected
-						//
-						Viewer viewer = null;
-						if ( WBSTab != null ) {
-							viewer = WBSTab.getViewer();
-							if (viewer != currentViewer) {
-								selection = new StructuredSelection(findSelection(
-										selectedPath, WBSTab.getAdapterFactory()));
-								viewer.setSelection(selection, false);
-							}
-						}
-												
-						if ( OBSTab != null ) {
-							viewer = OBSTab.getViewer();						
-							if (viewer != currentViewer) {
-								selection = new StructuredSelection(findSelection(
-										selectedPath, OBSTab.getAdapterFactory()));
-								viewer.setSelection(selection, false);
-							}
-						}
-						
-						if ( PBSTab != null ) {
-							viewer = PBSTab.getViewer();						
-							if (viewer != currentViewer) {
-								selection = new StructuredSelection(findSelection(
-										selectedPath, PBSTab.getAdapterFactory()));
-								viewer.setSelection(selection, false);
-							}
-						}
-						
-						if ( procTab != null ) {
-							viewer = procTab.getViewer();
-							if (viewer != currentViewer) {
-								selection = new StructuredSelection(findSelection(
-										selectedPath, procTab.getAdapterFactory()));
-								viewer.setSelection(selection, false);
-							}
-						}
-						
-						if (extensionTabs != null) {
-							for (int i = 0; i < extensionTabs.length; i++) {
-								viewer = extensionTabs[i].getViewer();
-								if (viewer != currentViewer) {
-									selection = new StructuredSelection(
-											findSelection(
-													selectedPath,
-													extensionTabs[i]
-															.getAdapterFactory()));
-									viewer.setSelection(selection, false);
-								}
-							}
-						}
-					}
-				}
-			}
-		} finally {
-			synchronizingSelection = false;
-		}
-	}
-
-	public static Object findSelection(List selectedPath,
-			AdapterFactory adapterFactory) {
-		int size = selectedPath.size();
-		if (size == 0) {
-			return null;
-		}
-		Object e = selectedPath.get(0);
-		Object selection = e;
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-				.adapt(e, ITreeItemContentProvider.class);
-		Collection children = adapter.getChildren(e);
-		find_selection: for (int i = 1; i < size; i++) {
-			e = selectedPath.get(i);
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object child = iter.next();
-				Object element = TngUtil.unwrap(child);
-				if (element == e) {
-					selection = child;
-					adapter = (ITreeItemContentProvider) adapterFactory.adapt(
-							child, ITreeItemContentProvider.class);
-					children = adapter.getChildren(e);
-					continue find_selection;
-				}
-			}
-			break find_selection;
-		}
-		return selection;
-	}
-
-	// Implements ISelectionProvider
-	//
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return viewSelection;
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
-	 */
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer()
-	 */
-	public Viewer getViewer() {
-		return currentViewer;
-	}
-
-	/**
-	 * Gets the adapter factory of the current page if there is any
-	 * 
-	 * @return
-	 * 		Adapter Factory of the current page of the editor
-	 */
-	public AdapterFactory getAdapterFactory() {
-		IFormPage page = getActivePageInstance();
-		if (page instanceof ProcessBreakdownStructureFormPage) {
-			return ((ProcessBreakdownStructureFormPage) page)
-					.getAdapterFactory();
-		}
-
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		((IMenuListener) getEditorSite().getActionBarContributor())
-				.menuAboutToShow(menuManager);
-		
-		// populate contributed menu items
-		//
-		IFormPage activePage = getActivePageInstance();
-		if(activePage instanceof ProcessBreakdownStructureFormPage) {
-			IAction[] actions = ((ProcessBreakdownStructureFormPage)activePage).getAdditionalActions();
-			if(actions != null && actions.length > 0) {
-				menuManager.insertAfter(IWorkbenchActionConstants.MB_ADDITIONS, new Separator());
-				for (int i = 0; i < actions.length; i++) {
-					IAction action = actions[i];
-					ISelection selection = getSelection();
-					if(selection instanceof IStructuredSelection && action instanceof BaseSelectionListenerAction) {
-						((BaseSelectionListenerAction)action).selectionChanged((IStructuredSelection) selection);
-					}
-					if (action instanceof IWorkbenchPartAction) {
-						((IWorkbenchPartAction) action)
-								.setActiveWorkbenchPart(this);
-					}
-					menuManager.insertAfter(IWorkbenchActionConstants.MB_ADDITIONS, action);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Return property sheet page
-	 * @return
-	 * 			PropertySheet Page
-	 */
-	public IPropertySheetPage getPropertySheetPage() {
-		if (propertySheetPage == null) {
-			propertySheetPage = (EPFPropertySheetPage) createPropertySheetPage();
-
-			// {
-			// public void makeContributions(IMenuManager menuManager,
-			// IToolBarManager toolBarManager, IStatusLineManager
-			// statusLineManager) {
-			// super.makeContributions(menuManager, toolBarManager,
-			// statusLineManager);
-			// }
-			//
-			// public void setActionBars(IActionBars actionBars) {
-			// super.setActionBars(actionBars);
-			// getActionBarContributor().shareGlobalActions(this, actionBars);
-			// }
-			// };
-			// System.out.println("Setting provider ");
-			if (currentViewer != null) {
-				AdapterFactoryContentProvider contentProvider = (AdapterFactoryContentProvider) ((ProcessViewer) currentViewer)
-						.getContentProvider();
-				propContentProvider = new AdapterFactoryContentProvider(
-						contentProvider.getAdapterFactory());
-				propertySheetPage
-						.setPropertySourceProvider(propContentProvider);
-			}
-		}
-		return propertySheetPage;
-	}
-
-    /**
-     * 
-     */
-    protected TabbedPropertySheetPage createPropertySheetPage() {
-        return new EPFPropertySheetPage(this);
-    }
-
-	/**
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		if (key.equals(IPropertySheetPage.class)) {
-			return getPropertySheetPage();
-		} else if (key.equals(IGotoMarker.class)) {
-			return this;
-		} else {
-			return super.getAdapter(key);
-		}
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() {
-		return getSite().getId();
-	}
-
-	
-	/**
-	 * Return column descriptor list for given string
-	 * @param str
-	 * @return
-	 * 			list of column descriptors
-	 */
-	public static EList toColumnDescriptorList(String str) {
-		EList columnDescriptors = new BasicEList();
-		StringTokenizer tokens = new StringTokenizer(str, ","); //$NON-NLS-1$
-		while (tokens.hasMoreTokens()) {
-			String token = tokens.nextToken();
-			Object columnDescriptor = ProcessEditor.idToColumnDescriptorMap
-					.get(token);
-			if (columnDescriptor != null) {
-				columnDescriptors.add(columnDescriptor);
-			}
-		}
-		return columnDescriptors;
-	}
-
-	/**
-	 * Return array of column descriptors for the given string
-	 * @param str
-	 * @return
-	 * 			list of column descriptors
-	 */
-	public static ColumnDescriptor[] toColumnDescriptors(String str) {
-		List list = toColumnDescriptorList(str);
-		ColumnDescriptor[] columns = new ColumnDescriptor[list.size()];
-		list.toArray(columns);
-		return columns;
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#getCurrentPage()
-	 */
-	public int getCurrentPage() {
-		return super.getCurrentPage();
-	}
-
-	/**
-	 * Return suppression info
-	 */
-	public Suppression getSuppression() {
-		return suppression;
-	}
-
-	protected void configChanged() {
-		MethodConfiguration config = LibraryService.getInstance()
-				.getCurrentMethodConfiguration();
-		if (config != currentConfig) {
-			// refresh only if the active part is this editor or diagram editor
-			// of any activity in this process
-			//
-			IWorkbenchPart activePart = getSite().getWorkbenchWindow()
-					.getPartService().getActivePart();
-			boolean refresh = activePart == this;
-			if (!refresh) {
-				if (activePart instanceof AbstractDiagramEditor) {
-					DiagramEditorInput input = ((DiagramEditorInputProxy)((IEditorPart) activePart)
-							.getEditorInput()).getDiagramEditorInput();
-					refresh = input.getSuppression().getProcess() == selectedProcess;
-				}
-			}
-			if (refresh) {
-				currentConfig = config;
-				refreshAll();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) {
-		if (input != getEditorInput()) {
-			inputChanged = true;
-		}
-		super.setInput(input);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#updatePages()
-	 */
-	protected void updatePages() {
-		// remove and add description page if the model.xmi or content.xmi of
-		// the process have been changed
-		//
-		Resource modelResource = selectedProcess.eResource();
-		Resource contentResource = selectedProcess.getPresentation()
-				.eResource();
-		if (changedResources.contains(modelResource)
-				|| (contentResource != null && changedResources
-						.contains(contentResource))) {
-			removePage(0);
-			try {
-				addDescriptionPage();
-			} catch (PartInitException e) {
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						AuthoringUIResources.ProcessEditor_refreshErrorTitle, 
-						AuthoringUIResources.ProcessEditor_refreshErrorMsg, e); 
-			}
-		}
-		if (inputChanged) {
-			inputChanged(getEditorInput());
-			if (propertySheetPage != null) {
-				propertySheetPage.refresh();
-			}
-		} else {
-			refreshAll();
-		}
-	}
-
-	protected void refreshAll() {
-		BusyIndicator.showWhile(getSite().getShell().getDisplay(),
-				new Runnable() {
-
-					public void run() {
-						doRefreshAll(true);
-					}
-
-				});
-	}
-
-	/**
-	 * Refresh all viewers 
-	 * @param updateIDs
-	 * 			if true, then refresh all index in viewers
-	 */
-	public void doRefreshAll(boolean updateIDs) {
-//		if (updateIDs) {
-//			AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-//					.getWBS_ComposedAdapterFactory();
-//			ProcessUtil.updateIDs(adapterFactory, selectedProcess);
-//			ProcessUtil.refreshPredeccessorLists(adapterFactory,
-//					selectedProcess);
-//
-//			adapterFactory = TngAdapterFactory.INSTANCE
-//					.getProcessComposedAdapterFactory();
-//			ProcessUtil.updateIDs(adapterFactory, selectedProcess);
-//		}
-
-		updateIDs(updateIDs);
-		
-        if (WBSTab != null && WBSTab.getViewer() != null) {
-            WBSTab.getViewer().refresh();
-        }
-        
-        if (OBSTab != null && OBSTab.getViewer() != null) {
-        	OBSTab.getViewer().refresh();
-        }
-        if (PBSTab != null && PBSTab.getViewer() != null) {
-        	PBSTab.getViewer().refresh();
-        }
-        if (procTab != null && procTab.getViewer() != null) {
-        	procTab.getViewer().refresh();
-        }
-
-		
-		if (extensionTabs != null) {
-			for (int i = 0; i < extensionTabs.length; i++) {
-				extensionTabs[i].getViewer().refresh();
-			}
-		}
-
-		if (propertySheetPage != null) {
-			propertySheetPage.refresh();
-		}
-	}
-	
-	
-    /**
-     * @param updateIDs
-     */
-    protected void updateIDs(boolean updateIDs) {
-        if (updateIDs) {
-            AdapterFactory adapterFactory = null;
-            if (WBSTab != null) {
-                adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-                ProcessUtil.updateIDs(adapterFactory, selectedProcess);
-                ProcessUtil.refreshPredeccessorLists(adapterFactory, selectedProcess);
-            }
-            if (procTab != null) {
-                adapterFactory = TngAdapterFactory.INSTANCE.getProcessComposedAdapterFactory();
-                ProcessUtil.updateIDs(adapterFactory, selectedProcess);
-            }
-        }
-    }
-
-
-	/**
-	 * Refresh all open process editors
-	 */
-	public void refreshAllProcessEditors() {
-		IEditorReference[] editorReferences = getSite().getPage()
-				.getEditorReferences();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof ProcessEditor) {
-				((ProcessEditor) editor).doRefreshAll(false);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormEditor#getActivePageInstance()
-	 */
-	public IFormPage getActivePageInstance() {
-		int index = getActivePage();
-		if (index == -1) {
-			return null;
-		}
-		if (index == 0) {
-			return super.getActivePageInstance();
-		}
-		return bsPages[index - 1];
-	}
-
-	protected Collection getModifiedResources() {
-		Collection modifiedResources = super.getModifiedResources();
-		if (suppression.isSaveNeeded()
-				&& !modifiedResources.contains(selectedProcessComponent
-						.eResource())) {
-			modifiedResources.add(selectedProcessComponent.eResource());
-		}
-		modifiedResources.addAll(resourcesToSave);
-
-		return modifiedResources;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		suppression.saveToModel();
-		super.doSave(monitor);
-		suppression.saveIsDone();
-		resourcesToSave.clear();
-		firePropertyChange(PROP_DIRTY);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#isDirty()
-	 */
-	public boolean isDirty() {
-		if (suppression.isSaveNeeded()) {
-			return true;
-		}
-		return super.isDirty();
-	}
-
-	
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#firePropertyChange(int)
-	 */
-	public void firePropertyChange(int propertyId) {
-		super.firePropertyChange(propertyId);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditor#getUsedResources()
-	 */
-	public Collection<Resource> getUsedResources() {
-		HashSet<Resource> usedResources = new HashSet<Resource>();
-
-		// model.xmi
-		//
-		Resource resource = elementObj.eResource();
-		if (resource != null) {
-			usedResources.add(resource);
-		}
-
-		// content.xmi
-		//
-		resource = selectedProcess.getPresentation().eResource();
-		if (resource != null) {
-			usedResources.add(resource);
-		}
-
-		// configuration.xmi
-		//
-		MethodConfiguration config = selectedProcess.getDefaultContext();
-		if (config != null) {
-			resource = config.eResource();
-			if (resource != null) {
-				usedResources.add(resource);
-			}
-		}
-
-		// resources of other processes that this process is depending on
-		//
-		AdapterFactory adapterFactory = getAdapterFactoryFromTab();
-		for (Iterator iter = new AdapterFactoryTreeIterator(adapterFactory,
-				selectedProcess); iter.hasNext();) {
-			Object obj = TngUtil.unwrap(iter.next());
-			if (obj instanceof EObject) {
-				resource = ((EObject) obj).eResource();
-				if (resource != null) {
-					usedResources.add(resource);
-				}
-			}
-		}
-
-		lastUsedResources = usedResources;
-
-		return usedResources;
-	}
-
-	/**
-     * @return
-     */
-    protected AdapterFactory getAdapterFactoryFromTab() {
-        return WBSTab.getAdapterFactory();
-    }
-
-    
-	/**
-	 * Check whether selected objects can be revealed or not and retuns result
-	 * 
-	 * @param selection
-	 * 			List of objects
-	 * @param adapterFactory
-	 * 			Adapter factory of the selected objects
-	 * @param suppression
-	 * 			Suppression information
-	 * @return
-	 * 		Boolean value to indicate whether selected objects can be revealed
-	 */
-	public static boolean canReveal(Collection<?> selection,
-			AdapterFactory adapterFactory, Suppression suppression) {
-		// NO more check for duplication of name and presentation name
-		//
-//		// check if revealing the selected elements will cause name duplication
-//		//
-//		String msg = suppression.checkDuplicateNameAfterReveal(selection,
-//				adapterFactory);
-//		if (msg != null) {
-//			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-//					AuthoringUIResources.ProcessEditor_Reveal_Title, //$NON-NLS-1$ 
-//					msg);
-//			return false;
-//		}
-//
-//		// check if revealing the selected elements will cause duplicate
-//		// descriptors.
-//		// If so, prompt user to delete the duplicates before continuing.
-//		//
-//		Collection duplicates = ProcessUtil
-//				.getDuplicateDescriptorsAfterReveal(selection);
-//		if (!duplicates.isEmpty()) {
-//			MultiStatus status = new MultiStatus(AuthoringUIPlugin.getDefault()
-//					.getId(), 0, "", null); //$NON-NLS-1$
-//			for (Iterator iter = duplicates.iterator(); iter.hasNext();) {
-//				Descriptor desc = (Descriptor) iter.next();
-//				String descTxt = TngUtil.getTypeText(desc)
-//						+ ": " + desc.getPresentationName(); //$NON-NLS-1$
-//				status.add(new Status(IStatus.INFO, AuthoringUIPlugin
-//						.getDefault().getId(), 0, descTxt, null));
-//			}
-//			if (AuthoringUIPlugin
-//					.getDefault()
-//					.getMsgDialog()
-//					.displayConfirmation(
-//							AuthoringUIResources.ProcessEditor_Reveal_Title, //$NON-NLS-1$ 
-//							AuthoringUIResources.ProcessEditor_promptToDeleteBeforeReveal, //$NON-NLS-1$
-//							status) == Dialog.CANCEL) {
-//				return false;
-//			}
-//
-//			// delete duplicate descriptors
-//			try {
-//				ProcessDeleteAction.delete(duplicates);
-//			} catch (OperationCanceledException e) {
-//				return false;
-//			}
-//		}
-
-		return true;
-	}
-
-	public static boolean hasInherited(Collection selection) {
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (ProcessUtil.isInherited(element)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	protected IPreferenceStoreWrapper getPreferenceStore() {
-		// preference is managed by library plugin,
-		// since this preferences is also used for browsing and publishing
-		// Jinhua Xi 08/21/2006
-		// IPreferenceStore store = AuthoringUIPlugin.getDefault()
-		// .getPreferenceStore();
-		IPreferenceStoreWrapper store = LibraryPlugin.getDefault()
-				.getPreferenceStore();
-
-		return store;
-	}
-	
-	/**
-	 * 
-	 * @return
-	 */
-	protected DiagramEditorHelper getDiagramEditorHelper(){
-		if(diagramEditorHelper == null){
-			diagramEditorHelper = new DiagramEditorHelper();
-			diagramEditorHelper.getDiagramManager(selectedProcess);
-		}
-		return diagramEditorHelper;
-	}
-	
-	/**
-	 * Override without any code change just for {@link ProcessEditorActionBarContributor} to access it.
-	 */
-	@Override
-	protected int getActivePage() {
-		return super.getActivePage();
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditorActionBarContributor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditorActionBarContributor.java
deleted file mode 100644
index 15e7df0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditorActionBarContributor.java
+++ /dev/null
@@ -1,2523 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.emf.edit.ui.action.CommandActionHandler;
-import org.eclipse.emf.edit.ui.action.CopyAction;
-import org.eclipse.emf.edit.ui.action.CutAction;
-import org.eclipse.emf.edit.ui.action.DeleteAction;
-import org.eclipse.emf.edit.ui.action.PasteAction;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.actions.IModifyingAction;
-import org.eclipse.epf.authoring.ui.actions.IWorkbenchPartAction;
-import org.eclipse.epf.authoring.ui.actions.IndentAction;
-import org.eclipse.epf.authoring.ui.actions.MethodLibraryActionBarContributor;
-import org.eclipse.epf.authoring.ui.actions.MoveDownAction;
-import org.eclipse.epf.authoring.ui.actions.MoveUpAction;
-import org.eclipse.epf.authoring.ui.actions.OutdentAction;
-import org.eclipse.epf.authoring.ui.actions.ProcessAutoSynchronizeAction;
-import org.eclipse.epf.authoring.ui.actions.SynchronizationAction;
-import org.eclipse.epf.authoring.ui.actions.UpdateSuppressionFromBaseAction;
-import org.eclipse.epf.authoring.ui.dialogs.DialogHelper;
-import org.eclipse.epf.authoring.ui.dialogs.UserDefinedDiagramDialog;
-import org.eclipse.epf.authoring.ui.forms.ProcessBreakdownStructureFormPage;
-import org.eclipse.epf.authoring.ui.properties.EPFPropertySheetPage;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.authoring.ui.views.ProcessViewer;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.diagram.ad.ADImages;
-import org.eclipse.epf.diagram.add.ADDImages;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.diagram.ui.service.DiagramEditorHelper;
-import org.eclipse.epf.diagram.wpdd.part.WPDDImages;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ActivityDeepCopyConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.command.ResourceAwarePasteFromClipboardCommand;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.ActivityDropCommand;
-import org.eclipse.epf.library.edit.process.command.ContributeToActivityCommand;
-import org.eclipse.epf.library.edit.process.command.LocallyReplaceAndDeepCopyCommand;
-import org.eclipse.epf.library.edit.process.command.ReplaceActivityCommand;
-import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.DiagramOptions;
-import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.util.Suppression.SuppressionCommand;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.library.ui.actions.ProcessDeleteAction;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.forms.editor.IFormPage;
-
-/**
- * Action bar contribtutor for process editor
- * 
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public class ProcessEditorActionBarContributor extends
-		MethodLibraryActionBarContributor {
-	protected Collection<IAction> registeredActions = new ArrayList<IAction>();
-
-	protected boolean locked;
-
-	protected IAction rollupAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_RollUp) {
-
-		public void run() {
-			boolean wasRolledUp = bsItemProvider.isRolledUp();
-			bsItemProvider.setRolledUp(!bsItemProvider.isRolledUp());
-			((IChangeNotifier) bsItemProvider)
-					.fireNotifyChanged(new ViewerNotification(
-							new ENotificationImpl(
-									(InternalEObject) selectedActivity,
-									Notification.ADD, null, null, null, false),
-							selectedActivity, true, false));
-
-			if (bsItemProvider instanceof DelegatingWrapperItemProvider) {
-				// Refreshing for green activities during rollup
-				DelegatingWrapperItemProvider provider = (DelegatingWrapperItemProvider) bsItemProvider;
-				provider.fireNotifyChanged(new ViewerNotification(
-						new NotificationImpl(Notification.SET, provider,
-								provider), provider, true, false));
-			}
-			if (wasRolledUp) {
-				ProcessViewer viewer = (ProcessViewer) ((ProcessEditor) activeEditor).currentViewer;
-				viewer.expandToLevel(selectedActivity,
-						AbstractTreeViewer.ALL_LEVELS);
-
-				// eventhough we switched off creating new activities in
-				// WBS,
-				// user can still create thru AD. Hence we need to update
-				// IDs
-				// afterwards
-				doRefresh();
-			}
-		}
-
-	};
-
-	protected MoveUpAction moveUpAction = new MoveUpAction() {
-		@Override
-		protected boolean accept(IStructuredSelection selection) {
-			if(!isEditingAllowed()) {
-				return false;
-			}
-			return super.accept(selection);
-		}		
-	};
-
-	protected MoveDownAction moveDownAction = new MoveDownAction() {
-		@Override
-		protected boolean accept(IStructuredSelection selection) {
-			if(!isEditingAllowed()) {
-				return false;
-			}
-			return super.accept(selection);
-		}
-	};
-
-	private IAction preferenceAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Preferences) {
-		public void run() {
-			// open process preference page
-			org.eclipse.ui.dialogs.PreferencesUtil
-					.createPreferenceDialogOn(
-							getActiveEditor().getEditorSite().getShell(),
-							"org.eclipse.epf.authoring.ui.preferences.ProcessEditorPreferencePage", //$NON-NLS-1$
-							null, null).open();
-		}
-	};
-
-	protected IAction openBaseActivity = new Action(
-			AuthoringUIResources.ProcessEditor_Action_OpenBaseActivity) {
-		public void run() {
-			VariabilityElement base = selectedActivity
-					.getVariabilityBasedOnElement();
-			Process proc = TngUtil.getOwningProcess((BreakdownElement) base);
-			try {
-				int id = ((ProcessEditor) activeEditor).getActivePage();
-				ISelection selection = new StructuredSelection(base);
-
-				IEditorInput input = new MethodElementEditorInput(
-						(MethodElement) proc.eContainer());
-				ProcessEditor editor = (ProcessEditor) getPage().openEditor(
-						input, ProcessEditor.EDITOR_ID);
-				editor.setActivePage(id);
-				editor.bsPages[id - 1].getViewer()
-						.setSelection(selection, true);
-			} catch (PartInitException e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	};
-
-	protected IAction openWorkflowEditorAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_OpenActivityDiagram) {
-		public void run() {
-			try {
-				try {
-					IEditorPart parent = getPage().getActiveEditor();
-					IEditorInput input = new GraphicalWorkflowEditor.EditorInput(
-							selectedObject, getSuppression());
-					IEditorPart part = getPage().openEditor(input,
-							ProcessEditor.WORKFLOW_EDITOR_ID);
-					if (part instanceof AbstractDiagramEditor) {
-						AbstractDiagramEditor editor = (AbstractDiagramEditor) part;
-						editor.setParentEditor(parent);
-					}
-				} catch (PartInitException exception) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(
-							exception);
-				}
-			} catch (RuntimeException e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	};
-	
-	private class OpenDiagramEditorAction extends Action {
-
-		private int diagramType;
-
-		public OpenDiagramEditorAction(String text, int diagramType) {
-			super(text);
-			this.diagramType = diagramType;
-			setImageDescriptor(getImageDescriptor(diagramType));
-			setDisabledImageDescriptor(getDisabledImageDescriptor(diagramType));
-		}
-		
-		private ImageDescriptor getImageDescriptor(int diagramType) {
-			switch(diagramType) {
-			case IDiagramManager.ACTIVITY_DIAGRAM:
-				return ADImages.IMG_DESC_EDITOR;
-			case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-				return ADDImages.IMG_DESC_EDITOR;
-			case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-				return WPDDImages.IMG_DESC_EDITOR;
-			}
-			return null;
-		}
-		
-		private ImageDescriptor getDisabledImageDescriptor(int diagramType) {
-			switch(diagramType) {
-			case IDiagramManager.ACTIVITY_DIAGRAM:
-				return ADImages.DISABLED_IMG_DESC_EDITOR;
-			case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-				return ADDImages.DISABLED_IMG_DESC_EDITOR;
-			case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-				return WPDDImages.DISABLED_IMG_DESC_EDITOR;
-			}
-			return null;
-		}
-
-		
-		@Override
-		public void run() {
-			DiagramManager mgr = null;
-			try {
-				if(!ProcessUtil.isInherited(selectedObject)) {
-					mgr = DiagramManager.getInstance(getProcess(), this);
-					Resource resource = mgr.getResource();
-					if(mgr.isNewResource() && !new File(FileManager.toFileString(resource.getURI())).exists()) {
-						boolean result = AuthoringUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayConfirmation(AuthoringUIResources.NewDiagramFile_title,
-								AuthoringUIResources.promptCreateNewDiagramFile_msg);
-						if(result) {
-							resource.save(Collections.EMPTY_MAP);
-
-							// still keep the flag resourceIsNew set so editor will be marked dirty
-							//
-							mgr.setResourceIsNew(true);
-						}
-						else {
-							return;
-						}
-					}
-				}
-				openDiagram(diagramType);
-			} catch (Exception exception) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(
-						exception);
-			}
-			finally {
-				if(mgr != null) {
-					mgr.removeConsumer(this);
-				}
-			}
-		}
-	}
-	
-	private IAction newActivityDiagramEditor = new OpenDiagramEditorAction(
-			AuthoringUIResources.ProcessEditor_Action_OpenActivityDiagram, IDiagramManager.ACTIVITY_DIAGRAM);
-
-	private IAction newActivityDetailDiagramEditor = new OpenDiagramEditorAction(
-			AuthoringUIResources.ProcessEditor_Action_OpenActivityDetailDiagram, IDiagramManager.ACTIVITY_DETAIL_DIAGRAM);
-
-	private IAction newWPDiagramEditor = new OpenDiagramEditorAction(
-			AuthoringUIResources.ProcessEditor_Action_OpenWorkProductDependencyDiagram,
-			IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM);
-
-	// Open workflow detail action
-	//
-	protected IAction openWorkflowDetailEditorAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_OpenActivityDetailDiagram) {
-		public void run() {
-			try {
-				try {
-					IEditorPart parent = getPage().getActiveEditor();
-					IEditorInput input = new ActivityDetailDiagramEditor.EditorInput(
-							selectedObject, getSuppression());
-					IEditorPart part = getPage().openEditor(input,
-							ProcessEditor.ACTIVITY_DETAIL_DIAGRAM_EDITOR_ID);
-					if (part instanceof AbstractDiagramEditor) {
-						AbstractDiagramEditor editor = (AbstractDiagramEditor) part;
-						editor.setParentEditor(parent);
-					}
-				} catch (PartInitException exception) {
-					exception.printStackTrace();
-				}
-			} catch (RuntimeException e) {
-				e.printStackTrace();
-			}
-
-		}
-	};
-
-	protected IAction openWPDependencyEditorAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_OpenWorkProductDependencyDiagram) {
-		public void run() {
-			try {
-				try {
-					IEditorPart parent = getPage().getActiveEditor();
-					MethodElementEditorInput input = new BreakdownElementEditorInput(
-							selectedObject, getSuppression()) {
-					};
-					IEditorPart part = getPage().openEditor(input,
-							ProcessEditor.WPDEPENDENCY_EDITOR_ID);
-					if (part instanceof AbstractDiagramEditor) {
-						AbstractDiagramEditor editor = (AbstractDiagramEditor) part;
-						editor.setParentEditor(parent);
-					}
-				} catch (PartInitException exception) {
-					exception.printStackTrace();
-				}
-			} catch (RuntimeException e) {
-				e.printStackTrace();
-			}
-		}
-	};
-
-	protected IAction replaceAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Replace) {
-		public void run() {
-			IResourceAwareCommand cmd = null;
-			try {
-				cmd = new ReplaceActivityCommand(
-						(BreakdownElementWrapperItemProvider) bsItemProvider);
-				getActionManager().execute(cmd);
-			} catch (Exception e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			} finally {
-				if (cmd != null) {
-					try {
-						cmd.dispose();
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	};
-
-	protected IAction localReplacementAndDeepCopy = new Action(
-			LibraryEditResources.localReplacementAndDeepCopy_text) {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			Runnable runnable = new Runnable() {
-
-				public void run() {
-					IResourceAwareCommand cmd = null;
-					try {
-						cmd = new LocallyReplaceAndDeepCopyCommand(
-								(BreakdownElementWrapperItemProvider) bsItemProvider);
-						getActionManager().execute(cmd);
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					} finally {
-						if (cmd != null) {
-							try {
-								cmd.dispose();
-							} catch (Exception e) {
-								AuthoringUIPlugin.getDefault().getLogger()
-										.logError(e);
-							}
-						}
-					}
-				}
-
-			};
-
-			UserInteractionHelper.runInUI(runnable, getText());
-		}
-	};
-
-	protected IAction contributeAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Contribute) {
-		public void run() {
-			IResourceAwareCommand cmd = null;
-			try {
-				cmd = new ContributeToActivityCommand(
-						(BreakdownElementWrapperItemProvider) bsItemProvider);
-				getActionManager().execute(cmd);
-				// ProcessUtil.contributeToActivity((BreakdownElementWrapperItemProvider)bsItemProvider,
-				// ((ProcessFormEditor)activeEditor).editingDomain.getAdapterFactory());
-			} catch (Exception e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			} finally {
-				if (cmd != null) {
-					try {
-						cmd.dispose();
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	};
-
-	private class EditorSuppressionCommand extends SuppressionCommand {
-		EditorSuppressionCommand(Suppression suppression, List selection,
-				boolean suppressed) {
-			super(suppression, selection, suppressed);
-		}
-
-		private void refresh() {
-			if (!getResult().isEmpty()) {
-				ProcessEditor editor = (ProcessEditor) getActiveEditor();
-				if (isReadOnlyElementAffected()) {
-					if (ProcessEditor.hasInherited(selection)) {
-						editor.refreshAllProcessEditors();
-					} else {
-						editor.doRefreshAll(false);
-					}
-				}
-				editor.firePropertyChange(IEditorPart.PROP_DIRTY);
-
-				// Do Diagram Editors refresh
-				List<IEditorReference> list = new ArrayList<IEditorReference>();
-				for (Iterator iter = selection.iterator(); iter.hasNext();) {
-					Object element = iter.next();
-					DiagramEditorHelper.closeDiagramEditors(element, list);
-					DiagramEditorHelper.refreshParentDiagramEditors(element,
-							list, true);
-					list.clear();
-				}
-			}
-		}
-
-		/**
-		 * @see org.eclipse.epf.library.edit.util.Suppression.SuppressionCommand#didExecute()
-		 */
-		protected void didExecute() {
-			refresh();
-		}
-
-		/**
-		 * @see org.eclipse.epf.library.edit.util.Suppression.SuppressionCommand#didUndo()
-		 */
-		protected void didUndo() {
-			refresh();
-		}
-
-	}
-
-	//TODO: move this action to its own CommandActionHandler class, see IndenAction
-	private IAction suppressTaskAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Suppress_Task) {
-
-		public void run() {
-			// check if suppressing the selected elements will cause
-			// duplicate descriptors.
-			// If so, prompt user to delete the duplicates before
-			// continuing.
-			//
-
-			final List taskDescriptors = ProcessUtil
-					.getTaskDescriptors(selection);
-			
-			// NO MORE CHECK FOR DUPLICATION OF NAME, PRESENTATION NAME, OR LINKED ELEMENT
-
-			BusyIndicator.showWhile(getActiveEditor().getEditorSite()
-					.getShell().getDisplay(), new Runnable() {
-
-				public void run() {
-					EditorSuppressionCommand cmd = new EditorSuppressionCommand(
-							getSuppression(), taskDescriptors, true);
-					cmd.setLabel(getText());
-					getActionManager().execute(cmd);
-				}
-			});
-
-			boolean show = true;
-			// update context bar menu after performing suppress
-			if (getAdapterFactory() == TngAdapterFactory.INSTANCE
-					.getWBS_ComposedAdapterFactory()) {
-				for (int i = 0; i < selection.size(); i++) {
-					if (!(selection.get(i) instanceof Activity || selection
-							.get(i) instanceof ActivityWrapperItemProvider))
-						show = false;
-				}
-			} else
-				show = false;
-
-			revealTaskAction.setEnabled(show);
-			suppressTaskAction.setEnabled(show);
-
-			// enable synchronize actions correctly
-			autoSynchronize.setEnabled(autoSynchronize
-					.updateSelection(new StructuredSelection(selection
-							.toArray())));
-			manualSynchronizeAction.setEnabled(manualSynchronizeAction
-					.updateSelection(new StructuredSelection(selection
-							.toArray())));
-		}
-	};
-
-	private IAction suppressAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Suppress) {
-
-		public void run() {
-			// NO MORE CHECK FOR DUPLICATION OF NAME, PRESENTATION NAME, OR LINKED ELEMENT
-			
-			BusyIndicator.showWhile(getActiveEditor().getEditorSite()
-					.getShell().getDisplay(), new Runnable() {
-
-				public void run() {
-					// if (getSuppression().suppress(selection)) {
-					// if (hasInherited(selection)) {
-					// editor.refreshAllProcessEditors();
-					// } else {
-					// editor.doRefreshAll(false);
-					// }
-					// }
-					// editor.firePropertyChange(PROP_DIRTY);
-
-					EditorSuppressionCommand cmd = new EditorSuppressionCommand(
-							getSuppression(), selection, true);
-					cmd.setLabel(getText());
-					getActionManager().execute(cmd);
-				}
-
-			});
-
-			// update context bar menu after performing suppress
-			revealAction.setEnabled(getSuppression().canReveal(selection));
-			suppressAction.setEnabled(getSuppression().canSuppress(selection));
-
-			// enable synchronize actions correctly
-			autoSynchronize.setEnabled(autoSynchronize
-					.updateSelection(new StructuredSelection(selection
-							.toArray())));
-			manualSynchronizeAction.setEnabled(manualSynchronizeAction
-					.updateSelection(new StructuredSelection(selection
-							.toArray())));
-		}
-	};
-
-	protected UpdateSuppressionFromBaseAction updateSuppressionFromBaseAction = new UpdateSuppressionFromBaseAction();
-
-	protected IAction revealAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Reveal) {
-
-		public void run() {
-			if (ProcessEditor.canReveal(selection, getAdapterFactory(), getSuppression())) {
-				// final ProcessEditor editor = (ProcessEditor)
-				// getActiveEditor();
-
-				BusyIndicator.showWhile(getActiveEditor().getEditorSite()
-						.getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						// if (getSuppression().reveal(selection)) {
-						// if (hasInherited(selection)) {
-						// editor.refreshAllProcessEditors();
-						// } else {
-						// editor.doRefreshAll(false);
-						// }
-						// }
-						// editor.firePropertyChange(PROP_DIRTY);
-
-						EditorSuppressionCommand cmd = new EditorSuppressionCommand(
-								getSuppression(), selection, false);
-						cmd.setLabel(getText());
-						getActionManager().execute(cmd);
-					}
-
-				});
-				// update context bar menu after performing reveal
-				revealAction.setEnabled(getSuppression().canReveal(selection));
-				suppressAction.setEnabled(getSuppression().canSuppress(
-						selection));
-				// enable synchronize actions correctly
-				autoSynchronize.setEnabled(autoSynchronize
-						.updateSelection(new StructuredSelection(selection
-								.toArray())));
-				manualSynchronizeAction.setEnabled(manualSynchronizeAction
-						.updateSelection(new StructuredSelection(selection
-								.toArray())));
-			}
-		}
-	};
-
-	private IAction revealTaskAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Reveal_Task) {
-
-		public void run() {
-			final List taskDescriptors = ProcessUtil
-					.getTaskDescriptors(selection);
-			if (ProcessEditor.canReveal(taskDescriptors, getAdapterFactory(),
-					getSuppression())) {
-
-				BusyIndicator.showWhile(getActiveEditor().getEditorSite()
-						.getShell().getDisplay(), new Runnable() {
-
-					public void run() {
-						EditorSuppressionCommand cmd = new EditorSuppressionCommand(
-								getSuppression(), taskDescriptors, false);
-						cmd.setLabel(getText());
-						getActionManager().execute(cmd);
-					}
-
-				});
-
-				// enable synchronize actions correctly
-				autoSynchronize.setEnabled(autoSynchronize
-						.updateSelection(new StructuredSelection(selection
-								.toArray())));
-				manualSynchronizeAction.setEnabled(manualSynchronizeAction
-						.updateSelection(new StructuredSelection(selection
-								.toArray())));
-			}
-		}
-	};
-
-	protected IBSItemProvider bsItemProvider = null;
-
-	protected Object selectedElement = null;
-
-	protected Activity selectedActivity = null;
-
-	protected BreakdownElement selectedBreakdownElement = null;
-
-	protected List selection;
-
-	protected IAction suppressDiagramAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Suppress2) {
-		public boolean isEnabled() {
-			if (!super.isEnabled()) {
-				return false;
-			}
-			return !(bsItemProvider instanceof BreakdownElementWrapperItemProvider && ((BreakdownElementWrapperItemProvider) bsItemProvider)
-					.isReadOnly());
-		}
-
-		public void run() {
-			if (!promptSaveActiveEditor()) {
-				return;
-			}
-
-			IStructuredContentProvider contentProvider = new ArrayContentProvider();
-
-			ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-					TngUtil.umaItemProviderAdapterFactory) {
-				public String getColumnText(Object object, int columnIndex) {
-					return GraphicalDataHelper
-							.getDiagramTypeText((Diagram) object);
-				}
-			};
-
-			Collection diagrams = GraphicalDataHelper
-					.getDiagrams(selectedActivity);
-			ArrayList unsuppressedDiagrams = new ArrayList();
-			for (Iterator iter = diagrams.iterator(); iter.hasNext();) {
-				Diagram diagram = (Diagram) iter.next();
-				if (!diagram.getSuppressed().booleanValue()) {
-					unsuppressedDiagrams.add(diagram);
-				}
-			}
-
-			ListSelectionDialog dlg = new ListSelectionDialog(activeEditor
-					.getEditorSite().getShell(), diagrams, contentProvider,
-					labelProvider,
-					AuthoringUIResources.ProcessEditor_SuppressDialog_Message);
-			dlg.setInitialElementSelections(unsuppressedDiagrams);
-			dlg
-					.setTitle(AuthoringUIResources.ProcessEditor_SuppressDialog_Title);
-			dlg.setBlockOnOpen(true);
-			dlg.open();
-
-			Object[] diagramsToReveal = dlg.getResult();
-
-			if (diagramsToReveal == null) {
-				return;
-			}
-
-			boolean changed = true;
-
-			// check if there is really any change
-			//
-			if (diagramsToReveal.length == unsuppressedDiagrams.size()) {
-				for (int i = 0; i < diagramsToReveal.length; i++) {
-					if (!unsuppressedDiagrams.contains(diagramsToReveal[i])) {
-						changed = false;
-						break;
-					}
-				}
-			}
-
-			if (changed) {
-				for (Iterator iter = diagrams.iterator(); iter.hasNext();) {
-					Diagram diagram = (Diagram) iter.next();
-					diagram.setSuppressed(Boolean.TRUE);
-				}
-
-				for (int i = 0; i < diagramsToReveal.length; i++) {
-					Diagram diagram = (Diagram) diagramsToReveal[i];
-					diagram.setSuppressed(Boolean.FALSE);
-				}
-
-				// save the editor
-				//
-				saveActiveEditor();
-			}
-		}
-	};
-
-	private IAction newSuppressDiagramAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Suppress2) {
-		public boolean isEnabled() {
-			if (!super.isEnabled()) {
-				return false;
-			}
-			return !(bsItemProvider instanceof BreakdownElementWrapperItemProvider && ((BreakdownElementWrapperItemProvider) bsItemProvider)
-					.isReadOnly());
-		}
-
-		public void run() {
-			if (!promptSaveActiveEditor()) {
-				return;
-			}
-
-			IStructuredContentProvider contentProvider = new ArrayContentProvider();
-
-			ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-					TngUtil.umaItemProviderAdapterFactory) {
-				public String getColumnText(Object object, int columnIndex) {
-					// TODO: Change to exact string.
-					return DiagramEditorHelper
-							.getDiagramTypeString((org.eclipse.gmf.runtime.notation.Diagram) object);
-				}
-			};
-
-			Collection diagrams = ((ProcessEditor) getActiveEditor())
-					.getDiagramEditorHelper().getDiagrams(selectedActivity);
-			ArrayList<org.eclipse.gmf.runtime.notation.Diagram> publishDiagrams = new ArrayList<org.eclipse.gmf.runtime.notation.Diagram>();
-
-			for (Iterator iter = diagrams.iterator(); iter.hasNext();) {
-				org.eclipse.gmf.runtime.notation.Diagram diagram = (org.eclipse.gmf.runtime.notation.Diagram) iter
-						.next();
-				switch (DiagramEditorHelper.getDiagramType(diagram)) {
-				case IDiagramManager.ACTIVITY_DIAGRAM:
-					if (DiagramOptions.isPublishAD(selectedActivity)) {
-						publishDiagrams.add(diagram);
-					}
-					break;
-				case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-					if (DiagramOptions.isPublishADD(selectedActivity)) {
-						publishDiagrams.add(diagram);
-					}
-					break;
-				case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-					if (DiagramOptions.isPublishWPDD(selectedActivity)) {
-						publishDiagrams.add(diagram);
-					}
-					break;
-				}
-			}
-
-			ListSelectionDialog dlg = new ListSelectionDialog(activeEditor
-					.getEditorSite().getShell(), diagrams, contentProvider,
-					labelProvider,
-					AuthoringUIResources.ProcessEditor_SuppressDialog_Message);
-			dlg.setInitialElementSelections(publishDiagrams);
-			dlg
-					.setTitle(AuthoringUIResources.ProcessEditor_SuppressDialog_Title);
-			dlg.setBlockOnOpen(true);
-			dlg.open();
-
-			Object[] diagramsToReveal = dlg.getResult();
-
-			if (diagramsToReveal == null) {
-				return;
-			}
-
-			boolean changed = true;
-
-			// check if there is really any change
-			//
-			if (diagramsToReveal.length == publishDiagrams.size()) {
-				for (int i = 0; i < diagramsToReveal.length; i++) {
-					if (!publishDiagrams.contains(diagramsToReveal[i])) {
-						changed = false;
-						break;
-					}
-				}
-			}
-
-			if (changed) {
-				for (Iterator iter = diagrams.iterator(); iter.hasNext();) {
-					org.eclipse.gmf.runtime.notation.Diagram diagram = (org.eclipse.gmf.runtime.notation.Diagram) iter
-							.next();
-					switch (DiagramEditorHelper.getDiagramType(diagram)) {
-					case IDiagramManager.ACTIVITY_DIAGRAM:
-						DiagramOptions.setPublishAD(selectedActivity, false);
-						break;
-					case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-						DiagramOptions.setPublishADD(selectedActivity, false);
-						break;
-					case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-						DiagramOptions.setPublishWPDD(selectedActivity, false);
-						break;
-					}
-				}
-
-				for (int i = 0; i < diagramsToReveal.length; i++) {
-					org.eclipse.gmf.runtime.notation.Diagram diagram = (org.eclipse.gmf.runtime.notation.Diagram) diagramsToReveal[i];
-					switch (DiagramEditorHelper.getDiagramType(diagram)) {
-					case IDiagramManager.ACTIVITY_DIAGRAM:
-						DiagramOptions.setPublishAD(selectedActivity, true);
-						break;
-					case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-						DiagramOptions.setPublishADD(selectedActivity, true);
-						break;
-					case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-						DiagramOptions.setPublishWPDD(selectedActivity, true);
-						break;
-					}
-				}
-				// save the editor
-				//
-				saveActiveEditor();
-			}
-		}
-	};
-
-	private IAction newAssignUserDiagram = new Action(
-			AuthoringUIResources.ProcessEditor_Action_AssignUserDiagram) {
-		/**
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			// TODO: necessary changes UserDefinedDiagramDialog's DiagramInfo.
-			UserDefinedDiagramDialog dialog = new UserDefinedDiagramDialog(
-					Display.getCurrent().getActiveShell(), activeEditor,
-					selectedActivity, getProcess().getDefaultContext(), TngUtil
-							.isWrapped(selectedObject));
-			dialog.open();
-		}
-	};
-
-	private IAction diagramPublishNone = new Action(
-			AuthoringUIResources.ProcessEditor_Action_SuppressAll) {
-		public void run() {
-			publishDiagramsForProcess(false);
-		}
-	};
-
-	private IAction diagramsPublishAll = new Action(
-			AuthoringUIResources.ProcessEditor_Action_RevealAll) {
-		public void run() {
-			publishDiagramsForProcess(true);
-		}
-	};
-
-	protected IAction suppressAllDiagrams = new Action(
-			AuthoringUIResources.ProcessEditor_Action_SuppressAll) {
-		public void run() {
-			setAllDiagramSuppressed(true);
-		}
-	};
-
-	protected IAction revealAllDiagrams = new Action(
-			AuthoringUIResources.ProcessEditor_Action_RevealAll) {
-		public void run() {
-			setAllDiagramSuppressed(false);
-		}
-	};
-
-	protected IAction addAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Add) {
-		public void run() {
-			LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-			runner.run(new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-					AdapterFactory adapterFactory = getAdapterFactory();
-					if (adapterFactory != null) {
-						MethodConfiguration config = LibraryService
-								.getInstance().getCurrentMethodConfiguration();
-						if (config == null) {
-							config = TngUtil.getOwningProcess(
-									selectedBreakdownElement)
-									.getDefaultContext();
-						}
-						List selection = DialogHelper.selectElementsFor(
-								selectedBreakdownElement, config,
-								adapterFactory);
-
-						if (selection == null || selection.isEmpty()) {
-							return;
-						}
-
-						Object adapter = adapterFactory.adapt(
-								selectedBreakdownElement,
-								IEditingDomainItemProvider.class);
-						if (adapter instanceof IBSItemProvider) {
-							IResourceAwareCommand cmd = ((IBSItemProvider) adapter)
-									.createDropCommand(
-											selectedBreakdownElement, selection);
-							getActionManager().execute(cmd);
-						}
-					}
-				}
-
-			});
-
-		}
-	};
-
-	protected IAction copyActivityAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Copy) {
-		public void run() {
-			MethodConfiguration config = LibraryService.getInstance()
-					.getCurrentMethodConfiguration();
-			if (config == null) {
-				config = TngUtil.getOwningProcess(selectedActivity)
-						.getDefaultContext();
-			}
-			List selection = DialogHelper.selectActivitiesFor(selectedActivity,
-					config, IActionTypeProvider.COPY);
-
-			if (selection == null || selection.isEmpty()) {
-				return;
-			} else {
-				for (Iterator itor = selection.iterator(); itor.hasNext();) {
-					Object o = itor.next();
-
-					if (o instanceof Activity) {
-						Activity act = (Activity) o;
-
-						// Process proc =
-						// TngUtil.getOwningProcess(selectedBreakdownElement);
-						// if (DependencyChecker.hasCyclicDependency(act, proc))
-						// {
-						// Object[] args = { selectedActivity.getName(),
-						// act.getName() };
-						// String message = AuthoringUIResources
-						// .bind(
-						// AuthoringUIResources.apply_pattern_error_msg,
-						// args);
-						//
-						// String title =
-						// AuthoringUIResources.apply_pattern_error_title;
-						// AuthoringUIPlugin.getDefault().getMsgDialog()
-						// .displayError(title, message, ""); //$NON-NLS-1$
-						// itor.remove();
-						// }
-						// else if (ProcessUtil.hasContributorOrReplacer(act)) {
-						// Object[] args = { selectedActivity.getName(),
-						// act.getName() };
-						// String message = AuthoringUIResources
-						// .bind(
-						// AuthoringUIResources.activity_variability_error_msg,
-						// args);
-						//
-						// String title =
-						// AuthoringUIResources.activity_variability_error_title;
-						// AuthoringUIPlugin.getDefault().getMsgDialog()
-						// .displayError(title, message, ""); //$NON-NLS-1$
-						//
-						// itor.remove();
-						// return;
-						// }
-
-						IStatus status = DependencyChecker
-								.checkCircularDependency(act, selectedActivity);
-						if (!status.isOK()) {
-							String title = AuthoringUIResources.activity_variability_error_title;
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayError(title, status.getMessage());
-							itor.remove();
-						}
-					}
-					if (selection.isEmpty()) {
-						return;
-					}
-				}
-			}
-
-			ActivityDropCommand cmd = new ActivityDropCommand(selectedActivity,
-					selection, null, getAdapterFactory());
-			IStatus status = cmd.checkCopy();
-			if (!status.isOK()) {
-				String title = AuthoringUIResources.activity_variability_error_title;
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						title, status.getMessage());
-				return;
-			}
-			cmd.setType(IActionTypeProvider.COPY);
-			getActionManager().execute(cmd);
-		}
-	};
-
-	protected IAction extendActivityAction = new Action(
-			AuthoringUIResources.ProcessEditor_Action_Extend) {
-		public void run() {
-			MethodConfiguration config = LibraryService.getInstance()
-					.getCurrentMethodConfiguration();
-			if (config == null) {
-				config = TngUtil.getOwningProcess(selectedActivity)
-						.getDefaultContext();
-			}
-			List selection = DialogHelper.selectActivitiesFor(selectedActivity,
-					config, IActionTypeProvider.EXTEND);
-
-			if (selection == null || selection.isEmpty()) {
-				return;
-			} else {
-				for (Iterator itor = selection.iterator(); itor.hasNext();) {
-					Object o = itor.next();
-
-					if (o instanceof Activity) {
-						Activity act = (Activity) o;
-
-						// Process proc =
-						// TngUtil.getOwningProcess(selectedBreakdownElement);
-						// if (DependencyChecker.hasCyclicDependency(act, proc))
-						// {
-						// Object[] args = { selectedActivity.getName(),
-						// act.getName() };
-						// String message = AuthoringUIResources
-						// .bind(
-						// AuthoringUIResources.apply_pattern_error_msg,
-						// args);
-						//
-						// String title =
-						// AuthoringUIResources.apply_pattern_error_title;
-						// AuthoringUIPlugin.getDefault().getMsgDialog()
-						// .displayError(title, message, ""); //$NON-NLS-1$
-						// itor.remove();
-						// }
-						// else if (ProcessUtil.hasContributorOrReplacer(act)) {
-						// Object[] args = { selectedActivity.getName(),
-						// act.getName() };
-						// String message = AuthoringUIResources
-						// .bind(
-						// AuthoringUIResources.activity_variability_error_msg,
-						// args);
-						//
-						// String title =
-						// AuthoringUIResources.activity_variability_error_title;
-						// AuthoringUIPlugin.getDefault().getMsgDialog()
-						// .displayError(title, message, ""); //$NON-NLS-1$
-						//
-						// itor.remove();
-						// return;
-						// }
-
-						/*
-						 * IStatus status = DependencyChecker.newCheckAct ?
-						 * DependencyChecker.checkCircularDependencyAfterFilterSelection
-						 * (act, selectedActivity,
-						 * VariabilityType.EXTENDS_LITERAL) :
-						 * DependencyChecker.checkCircularDependency(act,
-						 * selectedActivity);
-						 */
-						IStatus status = DependencyChecker.newCheckAct ? DependencyChecker
-								.checkCircularForApplyingVariabilityElement(
-										selectedActivity, act, true)
-								: DependencyChecker.checkCircularDependency(
-										act, selectedActivity);
-						if (!status.isOK()) {
-							String title = AuthoringUIResources.activity_variability_error_title;
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayError(title, status);
-							itor.remove();
-						}
-					}
-					if (selection.isEmpty()) {
-						return;
-					}
-				}
-			}
-			ActivityDropCommand cmd = new ActivityDropCommand(selectedActivity,
-					selection, null, getAdapterFactory());
-			IStatus status = cmd.checkExtend();
-			if (!status.isOK()) {
-				String title = AuthoringUIResources.activity_variability_error_title;
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						title, status.getMessage());
-				return;
-			}
-			cmd.setType(IActionTypeProvider.EXTEND);
-			getActionManager().execute(cmd);
-		}
-	};
-
-	protected IAction deepCopyActivityAction = new Action(
-			AuthoringUIResources.ProcessEditor_action_deepCopy) {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-			runner.run(new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-					MethodConfiguration config = LibraryService.getInstance()
-							.getCurrentMethodConfiguration();
-					if (config == null) {
-						config = TngUtil.getOwningProcess(selectedActivity)
-								.getDefaultContext();
-					}
-					List selection = DialogHelper.selectActivitiesFor(
-							selectedActivity, config,
-							IActionTypeProvider.DEEP_COPY);
-
-					if (selection == null || selection.isEmpty()) {
-						return;
-					} else {
-						for (Iterator itor = selection.iterator(); itor
-								.hasNext();) {
-							Object o = itor.next();
-
-							if (o instanceof Activity) {
-								Activity act = (Activity) o;
-
-								// Process proc =
-								// TngUtil.getOwningProcess(selectedBreakdownElement);
-								// if (ProcessUtil.hasCyclicDependency(act,
-								// proc)) {
-								// Object[] args = { selectedActivity.getName(),
-								// act.getName() };
-								// String message = AuthoringUIResources
-								// .bind(
-								// AuthoringUIResources.apply_pattern_error_msg,
-								// args);
-								//
-								// String title =
-								// AuthoringUIResources.apply_pattern_error_title;
-								// AuthoringUIPlugin.getDefault().getMsgDialog()
-								// .displayError(title, message, "");
-								// //$NON-NLS-1$
-								// itor.remove();
-								// }
-
-								IStatus status = DependencyChecker
-										.checkCircularDependency(act,
-												selectedActivity);
-								if (!status.isOK()) {
-									String title = AuthoringUIResources.activity_variability_error_title;
-									AuthoringUIPlugin.getDefault()
-											.getMsgDialog().displayError(title,
-													status.getMessage());
-									itor.remove();
-								}
-							}
-							if (selection.isEmpty()) {
-								return;
-							}
-						}
-					}
-
-					ActivityDropCommand cmd = new ActivityDropCommand(
-							selectedActivity, selection, null,
-							getAdapterFactory(),new ActivityDeepCopyConfigurator(config));
-					cmd.setType(IActionTypeProvider.DEEP_COPY);
-					getActionManager().execute(cmd);
-
-				}
-			});
-		}
-	};
-
-	protected Object selectedObject;
-
-	protected IAction expandAllAction = new Action(
-			AuthoringUIResources.ProcessFormEditor_expanAllActionLabel) {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			Viewer viewer = ((ProcessEditor) activeEditor).currentViewer;
-			if (viewer instanceof TreeViewer) {
-				((TreeViewer) viewer).expandToLevel(selectedObject,
-						AbstractTreeViewer.ALL_LEVELS);
-			}
-		}
-	};
-
-	protected IAction collapseAllAction = new Action(
-			AuthoringUIResources.ProcessFormEditor_collapseAllActionLabel) {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			Viewer viewer = ((ProcessEditor) activeEditor).currentViewer;
-			if (viewer instanceof TreeViewer) {
-				((TreeViewer) viewer).collapseToLevel(selectedObject,
-						AbstractTreeViewer.ALL_LEVELS);
-			}
-		}
-	};
-
-	protected SynchronizationAction manualSynchronizeAction = new SynchronizationAction() {
-		public void run() {
-			super.run();
-
-			// refresh properties view after synch
-			EPFPropertySheetPage page = (EPFPropertySheetPage) ((ProcessEditor) activeEditor)
-					.getPropertySheetPage();
-			if (page != null) {
-				page.refresh();
-			}
-		}
-	};
-
-	protected ProcessAutoSynchronizeAction autoSynchronize = new ProcessAutoSynchronizeAction() {
-		private void superRun() {
-			super.run();
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.ProcessAutoSynchronizeAction#run()
-		 */
-		public void run() {
-			LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-			runner.run(new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-					if (!AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayConfirmation(
-									AuthoringUIResources.ProcessEditor_defaultSynchronization,
-									AuthoringUIResources.ProcessEditor_confirmAutoSynch)) {
-						return;
-					}
-					// ((SynchronizeCommand)command).setUIContext(getActiveEditor().getSite().getShell());
-					superRun();
-
-					// refresh properties view after synch
-					EPFPropertySheetPage page = (EPFPropertySheetPage) ((ProcessEditor) activeEditor)
-							.getPropertySheetPage();
-					if (page != null) {
-						page.refresh();
-					}
-				}
-			});
-
-		}
-	};
-
-	private IAction showInLibraryView = new Action(
-			AuthoringUIResources.ProcessEditor_Action_ShowLinkedElementinLibraryView,
-			AuthoringUIPlugin.getDefault().getImageDescriptor(
-					"full/etool16/show_linked_element.gif")) { //$NON-NLS-1$   //) 
-
-		public void run() {
-			final Object linkedElement = ProcessUtil
-					.getAssociatedElement((Descriptor) selectedBreakdownElement);
-			if (linkedElement != null) {
-				Display.getCurrent().asyncExec(new Runnable() {
-
-					public void run() {
-						LibraryView.getView().setSelectionToViewer(
-								linkedElement);
-					}
-
-				});
-			}
-		}
-
-	};
-
-	private IAction assignUserDiagram = new Action(
-			AuthoringUIResources.ProcessEditor_Action_AssignUserDiagram) {
-		/**
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			UserDefinedDiagramDialog dialog = new UserDefinedDiagramDialog(
-					Display.getCurrent().getActiveShell(), activeEditor,
-					selectedActivity, getProcess().getDefaultContext(), TngUtil
-							.isWrapped(selectedObject));
-
-			dialog.open();
-		}
-	};
-
-	// private IAction activityDetailDiagramInfo = new
-	// ActivityDetailDiagramInfoAction(){
-	// public Object getObject() {
-	// return selectedActivity;
-	// }
-	// public IWorkbenchPage getPagex() {
-	// // TODO Auto-generated method stub
-	// return getPage();
-	// }
-	// };
-
-	private boolean oldLocked;
-
-	private IndentAction indentAction = new IndentAction() {
-		public boolean updateSelection(IStructuredSelection selection) {
-			if (!isEditingAllowed()) {
-				return false;
-			}
-			return super.updateSelection(selection);
-		}
-	};
-
-	private OutdentAction outdentAction = new OutdentAction() {
-		@Override
-		public boolean updateSelection(IStructuredSelection selection) {
-			if (!isEditingAllowed()) {
-				return false;
-			}
-			return super.updateSelection(selection);
-		}
-	};
-
-	public ProcessEditorActionBarContributor() {
-		super(AuthoringUIResources.ProcessEditor);
-
-		// don't show validate action
-		//
-		validateAction = null;
-
-		// set disabled image descriptors
-		showInLibraryView.setDisabledImageDescriptor(AuthoringUIPlugin
-				.getDefault().getImageDescriptor(
-						"full/etool16/show_linked_element_disabled.gif")); //$NON-NLS-1$			
-	}
-
-	public ProcessEditorActionBarContributor(String name) {
-        super(name);
-    }
-
-	protected void openDiagram(int diagramType) {
-		try {
-			DiagramEditorInput input = new DiagramEditorInput(
-					selectedObject, getSuppression(), diagramType);
-			DiagramEditorUtil.openDiagramEditor(getPage(), input,
-					DiagramEditorHelper.getDiagramPreferencesHint(diagramType),
-					new NullProgressMonitor());
-		} catch (RuntimeException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	protected void registerAction(IAction action) {
-		if (action != null && !registeredActions.contains(action)) {
-			registeredActions.add(action);
-		}
-	}
-
-	protected void registerActions() {
-		registerAction(autoSynchronize);
-		registerAction(manualSynchronizeAction);
-		registerAction(updateSuppressionFromBaseAction);
-		registerAction(indentAction);
-		registerAction(outdentAction);
-		registerAction(moveDownAction);
-		registerAction(moveUpAction);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#update()
-	 */
-	public void update() {
-		super.update();
-
-		ISelectionProvider selectionProvider = activeEditor instanceof ISelectionProvider ? (ISelectionProvider) activeEditor
-				: activeEditor.getEditorSite().getSelectionProvider();
-		ISelection selection = selectionProvider.getSelection();
-		IStructuredSelection structuredSelection = selection instanceof IStructuredSelection ? (IStructuredSelection) selection
-				: StructuredSelection.EMPTY;
-
-		boolean editingAllowed = isEditingAllowed();
-		for (IAction action : registeredActions) {
-			if (action instanceof CommandActionHandler) {
-				action.setEnabled(((CommandActionHandler) action)
-						.updateSelection(structuredSelection));
-			}
-			else if (action instanceof IModifyingAction) {
-				action.setEnabled(editingAllowed);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#activate()
-	 */
-	public void activate() {
-		manualSynchronizeAction.setProcess(getProcess());
-		ISelectionProvider selectionProvider = activeEditor instanceof ISelectionProvider ? (ISelectionProvider) activeEditor
-				: activeEditor.getEditorSite().getSelectionProvider();
-		for (Iterator iter = registeredActions.iterator(); iter.hasNext();) {
-			Object action = (Object) iter.next();
-			if (action instanceof IWorkbenchPartAction) {
-				((IWorkbenchPartAction) action)
-						.setActiveWorkbenchPart(activeEditor);
-			}
-			if (action instanceof ISelectionChangedListener) {
-				selectionProvider
-						.addSelectionChangedListener((ISelectionChangedListener) action);
-			}
-		}
-		super.activate();
-
-		// call set Active page explicitly in order to get correct action
-		// bars
-		setActivePage(activeEditor);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-
-		ISelectionProvider selectionProvider = activeEditor instanceof ISelectionProvider ? (ISelectionProvider) activeEditor
-				: activeEditor.getEditorSite().getSelectionProvider();
-
-		for (Iterator iter = registeredActions.iterator(); iter.hasNext();) {
-			Object action = (Object) iter.next();
-			if (action instanceof IWorkbenchPartAction) {
-				((IWorkbenchPartAction) action).setActiveWorkbenchPart(null);
-			}
-			if (action instanceof ISelectionChangedListener) {
-				selectionProvider
-						.removeSelectionChangedListener((ISelectionChangedListener) action);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.MethodLibraryActionBarContributor#init(org.eclipse.ui.IActionBars)
-	 */
-	public void init(IActionBars actionBars) {
-		super.init(actionBars);
-		registerActions();
-		contributeToToolBar(actionBars.getToolBarManager());
-	}
-
-	protected IActionManager getActionManager() {
-		return ((MethodElementEditor) activeEditor).getActionManager();
-	}
-
-	protected AdapterFactory getAdapterFactory() {
-		return ((ProcessEditor) activeEditor).getAdapterFactory();
-	}
-
-	protected void setAllDiagramSuppressed(final boolean suppressed) {
-		String title = AuthoringUIResources.processFormEditorSaveDialog_title;
-		String message = AuthoringUIResources.processFormEditorSaveDialog_message1;
-
-		if (!AuthoringUIPlugin.getDefault().getMsgDialog().displayConfirmation(
-				title, message)) {
-			return;
-		}
-
-		BusyIndicator.showWhile(activeEditor.getEditorSite().getShell()
-				.getDisplay(), new Runnable() {
-
-			public void run() {
-				GraphicalDataHelper.setAllDiagramSuppressed(getProcess(),
-						suppressed);
-				doSaveActiveEditor();
-			}
-
-		});
-	}
-
-	private void publishDiagramsForProcess(final boolean publish) {
-		String title = AuthoringUIResources.processFormEditorSaveDialog_title;
-		String message = AuthoringUIResources.processFormEditorSaveDialog_message1;
-
-		if (!AuthoringUIPlugin.getDefault().getMsgDialog().displayConfirmation(
-				title, message)) {
-			return;
-		}
-
-		BusyIndicator.showWhile(activeEditor.getEditorSite().getShell()
-				.getDisplay(), new Runnable() {
-
-			public void run() {
-
-				Iterator iterator = new AbstractTreeIterator(getProcess()) {
-
-					/**
-					 * Comment for <code>serialVersionUID</code>
-					 */
-					private static final long serialVersionUID = -618949014476371114L;
-
-					protected Iterator getChildren(Object object) {
-						Activity act = (Activity) object;
-						ArrayList children = new ArrayList();
-						for (Iterator iterator = act.getBreakdownElements()
-								.iterator(); iterator.hasNext();) {
-							Object element = iterator.next();
-							if (element instanceof Activity) {
-								children.add(element);
-							}
-						}
-						return children.iterator();
-					}
-
-				};
-				try {
-					while (iterator.hasNext()) {
-						Activity activity = (Activity) iterator.next();
-						DiagramOptions.setPublishAD(activity, publish);
-						DiagramOptions.setPublishADD(activity, publish);
-						DiagramOptions.setPublishWPDD(activity, publish);
-					}
-				} catch (Exception e) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				}
-				doSaveActiveEditor();
-			}
-		});
-	}
-
-	private boolean promptSaveActiveEditor() {
-		String title = AuthoringUIResources.processFormEditorSaveDialog_title;
-		String message = AuthoringUIResources.processFormEditorSaveDialog_message2;
-		if (activeEditor.isDirty()) {
-			return AuthoringUIPlugin.getDefault().getMsgDialog()
-					.displayConfirmation(title, message);
-		}
-		return true;
-	}
-
-	protected void saveActiveEditor() {
-		// save the editor
-		//
-		BusyIndicator.showWhile(activeEditor.getEditorSite().getShell()
-				.getDisplay(), new Runnable() {
-
-			public void run() {
-				doSaveActiveEditor();
-			}
-
-		});
-	}
-
-	protected void doSaveActiveEditor() {
-		((ProcessEditor) activeEditor).resourcesToSave.add(getProcess()
-				.eResource());
-		activeEditor.doSave(new NullProgressMonitor());
-	}
-
-	protected DeleteAction createDeleteAction() {
-		return new ProcessDeleteAction() {
-			protected void saveCurrentEditor() {
-				if (activeEditor.isDirty()) {
-					BusyIndicator.showWhile(activeEditor.getEditorSite()
-							.getShell().getDisplay(), new Runnable() {
-
-						public void run() {
-							activeEditor.doSave(new NullProgressMonitor());
-						}
-
-					});
-				}
-			}
-
-			public void run() {
-				IFormPage activePage = ((ProcessEditor) activeEditor)
-						.getActivePageInstance();
-				if (activePage != null) {
-					String id = activePage.getId();
-					if (id == ProcessEditor.WBS_FORM_ID
-							|| id == ProcessEditor.TA_FORM_ID
-							|| id == ProcessEditor.WPBS_FORM_ID
-							|| id == ProcessEditor.CONSOLIDATED_FORM_ID) {
-						// for all other pages, disable DELETE
-						super.run();
-					}
-				}
-			}
-		};
-	}
-
-	protected CutAction createCutAction() {
-		return new CutAction() {
-			public boolean updateSelection(IStructuredSelection selection) {
-				return super.updateSelection(ProcessDeleteAction
-						.filterSelection(selection));
-			}
-
-			@Override
-			public Command createCommand(Collection selection) {
-				boolean unexecutable = false;
-				for (Iterator iter = selection.iterator(); iter.hasNext();) {
-					Object element = (Object) iter.next();
-					if (element instanceof Activity) {
-						unexecutable = true;
-					}
-				}
-				if (unexecutable) {
-					return UnexecutableCommand.INSTANCE;
-				} else {
-					return super.createCommand(selection);
-				}
-			}
-		};
-	}
-
-	protected PasteAction createPasteAction() {
-		return new PasteAction() {
-			public boolean updateSelection(IStructuredSelection selection) {
-				return super.updateSelection(ProcessDeleteAction
-						.filterSelection(selection));
-			}
-
-			/**
-			 * Overrided to use ResourceAwarePasteFromClipboardCommand
-			 * 
-			 * @see org.eclipse.emf.edit.ui.action.PasteAction#createCommand(java.util.Collection)
-			 * @see org.eclipse.epf.library.edit.command.ResourceAwarePasteFromClipboardCommand
-			 */
-			public Command createCommand(Collection selection) {
-				if (selection.size() == 1) {
-					return new ResourceAwarePasteFromClipboardCommand(domain,
-							selection.iterator().next(), null,
-							CommandParameter.NO_INDEX);
-				} else {
-					return UnexecutableCommand.INSTANCE;
-				}
-			}
-		};
-	}
-
-	protected CopyAction createCopyAction() {
-		return new CopyAction() {
-
-			public void run() {
-				if (domain instanceof TraceableAdapterFactoryEditingDomain) {
-					((TraceableAdapterFactoryEditingDomain) domain)
-							.resetCopyMaps();
-				}
-				super.run();
-			}
-
-		};
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#addGlobalActions(org.eclipse.jface.action.IMenuManager)
-	 */
-	protected void addGlobalActions(IMenuManager menuManager) {
-		super.addGlobalActions(menuManager);
-		menuManager.insertAfter("additions", new Separator("fixed-additions")); //$NON-NLS-1$ //$NON-NLS-2$
-		// menuManager.insertBefore("fixed-additions",
-		// insertNewPhaseAction);
-	}
-
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		super.contributeToToolBar(toolBarManager);
-
-		showInLibraryView
-				.setToolTipText(AuthoringUIResources.ProcessEditor_Action_ShowLinkedElementinLibraryView);
-		toolBarManager.add(moveUpAction);
-		toolBarManager.add(moveDownAction);
-		toolBarManager.add(indentAction);
-		toolBarManager.add(outdentAction);
-		toolBarManager.add(showInLibraryView);
-	}
-
-	protected boolean isEditingAllowed() {
-		IFormPage activePage = ((ProcessEditor) activeEditor)
-				.getActivePageInstance();
-		return !(activePage instanceof ProcessBreakdownStructureFormPage && ((ProcessBreakdownStructureFormPage) activePage)
-				.basicIsReadOnly());
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		IFormPage activePage = ((ProcessEditor) activeEditor)
-				.getActivePageInstance();
-		if (!isEditingAllowed()) {
-			menuManager.add(new Separator(
-					IWorkbenchActionConstants.MB_ADDITIONS));
-			menuManager.add(showInLibraryView);
-			if (bsItemProvider != null
-			// && ((ITreeItemContentProvider)
-			// bsItemProvider).hasChildren(selectedObject)
-			) {
-				menuManager.add(expandAllAction);
-				menuManager.add(collapseAllAction);
-			}
-			menuManager.add(new Separator());
-			refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
-			menuManager.add(refreshViewerAction);
-			menuManager.add(showPropertiesViewAction);
-			return;
-		}
-
-		ISelectionProvider selectionProvider = (ISelectionProvider) activeEditor;
-
-		if (selectedActivity == null
-				&& (selectionProvider.getSelection() == null || selectionProvider
-						.getSelection().isEmpty())) {
-			// fake a selection change event with the process selected if no
-			// element is selected yet.
-			//
-			selectionChanged(new SelectionChangedEvent(selectionProvider,
-					new StructuredSelection(getProcess())));
-		}
-		// disable all new action if it's rolled up
-		boolean isRolledUP = bsItemProvider != null
-				&& bsItemProvider.isRolledUp();
-		super.setEnabled(!isRolledUP);
-		super.menuAboutToShow(menuManager);
-
-		// add markers
-		//
-		menuManager.insertAfter("fixed-additions", new Separator("preference")); //$NON-NLS-1$ //$NON-NLS-2$	
-		menuManager.appendToGroup("preference", preferenceAction); //$NON-NLS-1$
-
-		menuManager.insertAfter("fixed-additions", new Separator("open")); //$NON-NLS-1$ //$NON-NLS-2$
-
-		if (bsItemProvider instanceof BreakdownElementWrapperItemProvider
-				&& TngUtil.unwrap(bsItemProvider) instanceof Activity) {
-			menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
-					contributeAction);
-			menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
-					replaceAction);
-			menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
-					localReplacementAndDeepCopy);
-		}
-
-		if (!isRolledUP) {
-			if (createChildActions != null && !createChildActions.isEmpty()) {
-				menuManager.insertBefore(
-						IWorkbenchActionConstants.MB_ADDITIONS, addAction);
-			}
-		}
-
-		if (revealAction.isEnabled()) {
-			menuManager.insertBefore("fixed-additions", revealAction); //$NON-NLS-1$
-		}
-
-		if (suppressAction.isEnabled()) {
-			menuManager.insertBefore("fixed-additions", suppressAction); //$NON-NLS-1$
-		}
-		if (!isRolledUP) {
-			if (suppressTaskAction.isEnabled()) {
-				menuManager.insertBefore("fixed-additions", suppressTaskAction); //$NON-NLS-1$
-			}
-			if (revealTaskAction.isEnabled()) {
-				menuManager.insertBefore("fixed-additions", revealTaskAction); //$NON-NLS-1$
-			}
-		}
-		if (updateSuppressionFromBaseAction.isEnabled()) {
-			menuManager.insertBefore(
-					"fixed-additions", updateSuppressionFromBaseAction); //$NON-NLS-1$
-		}
-
-		if ((selectedBreakdownElement != null) && (bsItemProvider != null)) {
-			menuManager.insertBefore("fixed-additions", moveUpAction); //$NON-NLS-1$
-			menuManager.insertBefore("fixed-additions", moveDownAction); //$NON-NLS-1$
-		}
-
-		// Indent/outdent
-		//
-		menuManager.insertBefore("fixed-additions", indentAction); //$NON-NLS-1$				
-		menuManager.insertBefore("fixed-additions", outdentAction); //$NON-NLS-1$
-
-		menuManager.appendToGroup("open", showInLibraryView); //$NON-NLS-1$
-
-		if ((selectedActivity != null) && (bsItemProvider != null)) {
-			if (bsItemProvider.isRolledUp()) {
-				rollupAction
-						.setText(AuthoringUIResources.ProcessEditor_Action_RollDown);
-			} else {
-				rollupAction
-						.setText(AuthoringUIResources.ProcessEditor_Action_RollUp);
-			}
-			menuManager.appendToGroup("open", rollupAction); //$NON-NLS-1$				
-		}
-
-		if (selectedObject instanceof Activity) {
-			// "Reuse" menu
-			//
-			MenuManager reuseSubMenu = new MenuManager(
-					AuthoringUIResources.ProcessEditor_Action_ApplyPattern);
-			reuseSubMenu.add(copyActivityAction);
-			reuseSubMenu.add(extendActivityAction);
-			reuseSubMenu.add(deepCopyActivityAction);
-
-			menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
-					reuseSubMenu);
-		}
-
-		if (autoSynchronize.isEnabled()) {
-			menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
-					autoSynchronize);
-		}
-		if (manualSynchronizeAction.isEnabled()) {
-			menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS,
-					manualSynchronizeAction);
-		}
-
-		if (!(selectedElement instanceof Milestone)) {
-			// MenuManager diagramSubMenu = new MenuManager(
-			// AuthoringUIResources.ProcessEditor_Action_Diagrams);
-			if (selectedActivity != null) {
-				if (selectedActivity.getVariabilityBasedOnElement() != null) {
-					menuManager.appendToGroup("open", openBaseActivity); //$NON-NLS-1$
-				}
-
-				// diagramSubMenu.add(openWorkflowEditorAction);
-				// diagramSubMenu.add(openWorkflowDetailEditorAction);
-				// diagramSubMenu.add(openWPDependencyEditorAction);
-				// diagramSubMenu.add(suppressDiagramAction);
-				// diagramSubMenu.add(assignUserDiagram);
-			}
-			// if (selectedActivity == getProcess()) {
-			// diagramSubMenu.add(suppressAllDiagrams);
-			// diagramSubMenu.add(revealAllDiagrams);
-			// }
-			// Enable this code if ActivityDetailDiagramInfoDialog is need.
-			// if(selectedActivity != null){
-			// diagramSubMenu.add(new Separator());
-			// diagramSubMenu.add(activityDetailDiagramInfo);
-			// }
-			// menuManager.appendToGroup("open", diagramSubMenu); //$NON-NLS-1$
-
-			MenuManager newDiagramSubMenu = new MenuManager(
-					AuthoringUIResources.ProcessEditor_Action_Diagrams); 
-			if (selectedActivity != null) {
-				newDiagramSubMenu.add(newActivityDiagramEditor);
-				newDiagramSubMenu.add(newActivityDetailDiagramEditor);
-				newDiagramSubMenu.add(newWPDiagramEditor);
-				newDiagramSubMenu.add(newSuppressDiagramAction);
-				newDiagramSubMenu.add(newAssignUserDiagram);
-
-			}
-
-			if (selectedActivity == getProcess()) {
-				newDiagramSubMenu.add(diagramsPublishAll);
-				newDiagramSubMenu.add(diagramPublishNone);
-			}
-			menuManager.appendToGroup("open", newDiagramSubMenu); //$NON-NLS-1$
-		}
-
-		if (bsItemProvider != null
-		// this is an expensive check, removed it
-		//
-		// && ((ITreeItemContentProvider)
-		// bsItemProvider).hasChildren(selectedObject)
-		) {
-			menuManager.appendToGroup("open", expandAllAction); //$NON-NLS-1$
-			menuManager.appendToGroup("open", collapseAllAction); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	protected Process getProcess() {
-		return ((ProcessComponent) ((MethodElementEditorInput) activeEditor
-				.getEditorInput()).getMethodElement()).getProcess();
-	}
-
-	protected Suppression getSuppression() {
-		return ((ProcessEditor) activeEditor).suppression;
-	}
-
-	protected void depopulateDynamicMenuItems() {
-		// Remove any menu items for old selection.
-		//
-		if (createChildMenuManager != null) {
-			depopulateManager(createChildMenuManager, createChildActions);
-		}
-		if (createSiblingMenuManager != null) {
-			depopulateManager(createSiblingMenuManager, createSiblingActions);
-		}
-		createChildActions = null;
-		createSiblingActions = null;
-	}
-
-	/**
-	 * Set action state to enabled or disabled
-	 * 
-	 * @param locked
-	 */
-	protected void setActionState() {
-		if (locked) {
-			// disable modifying actions
-			pasteAction.setEnabled(false);
-			cutAction.setEnabled(false);
-			deleteAction.setEnabled(false);
-			
-			for(IAction action : registeredActions) {
-				if(action instanceof IModifyingAction) {
-					action.setEnabled(false);
-				}
-			}
-		} else if (!oldLocked) {
-			// update state of modifying actions
-			//
-			IStructuredSelection selection = (IStructuredSelection) selectionProvider
-					.getSelection();
-			cutAction.setEnabled(cutAction.updateSelection(selection));
-			pasteAction.setEnabled(pasteAction.updateSelection(selection));
-			deleteAction.setEnabled(deleteAction.updateSelection(selection));
-			
-			for(IAction action : registeredActions) {
-				if(action instanceof IModifyingAction) {
-					action.setEnabled(action instanceof CommandActionHandler ? 
-							((CommandActionHandler)action).updateSelection(selection) : true);
-				}
-			}
-		}
-
-		boolean enabled = !locked;
-
-		addAction.setEnabled(enabled);
-		contributeAction.setEnabled(enabled);
-
-		// state of these actions is set in updateActions()
-		//
-		// moveDownAction.setEnabled(enabled);
-		// moveUpAction.setEnabled(enabled);
-		// revealAction.setEnabled(enabled);
-		// suppressAction.setEnabled(enabled);
-		replaceAction.setEnabled(enabled);
-		localReplacementAndDeepCopy.setEnabled(enabled);
-		revealAllDiagrams.setEnabled(enabled);
-		suppressAllDiagrams.setEnabled(enabled);
-		suppressDiagramAction.setEnabled(enabled);
-		copyActivityAction.setEnabled(enabled);
-		extendActivityAction.setEnabled(enabled);
-		deepCopyActivityAction.setEnabled(enabled);
-	}
-
-	protected Collection generateCreateChildActions(Collection descriptors,
-			ISelection selection) {
-		if (locked) {
-			return null;
-		}
-		return super.generateCreateChildActions(descriptors, selection);
-	}
-
-	protected Collection generateCreateSiblingActions(Collection descriptors,
-			ISelection selection) {
-		if (locked) {
-			return null;
-		}
-		return super.generateCreateSiblingActions(descriptors, selection);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.MethodLibraryActionBarContributor#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection sel = event.getSelection();
-		if (sel instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) sel;
-			oldLocked = locked;
-			locked = ViewHelper.isLocked(structuredSelection);
-
-			selection = ((IStructuredSelection) sel).toList();
-			if (selection.size() == 1) {
-				selectedObject = ((IStructuredSelection) sel).getFirstElement();
-				Object obj = TngUtil.unwrap(selectedObject);
-				super.selectionChanged(event);
-				selectedElement = obj;
-				if (obj instanceof Activity) {
-					selectedActivity = (Activity) obj;
-				} else {
-					// depopulateDynamicMenuItems();
-					// bsItemProvider = null;
-					selectedActivity = null;
-				}
-				AdapterFactoryEditingDomain domain = (AdapterFactoryEditingDomain) ((IEditingDomainProvider) activeEditorPart)
-						.getEditingDomain();
-				Object providerObj = domain.getAdapterFactory().adapt(
-						selectedObject, ITreeItemContentProvider.class);
-				if (providerObj instanceof IBSItemProvider)
-					bsItemProvider = (IBSItemProvider) providerObj;
-
-				if (obj instanceof BreakdownElement) {
-					selectedBreakdownElement = (BreakdownElement) obj;
-				} else {
-					selectedBreakdownElement = null;
-				}
-			} else {
-				depopulateDynamicMenuItems();
-				bsItemProvider = null;
-				selectedElement = null;
-				selectedActivity = null;
-				selectedBreakdownElement = null;
-				selectedObject = null;
-			}
-
-			updateActions();
-
-		} else {
-			depopulateDynamicMenuItems();
-			bsItemProvider = null;
-			selectedElement = null;
-			selectedActivity = null;
-			selectedBreakdownElement = null;
-		}
-
-		// // test code
-		// //
-		// if(selectedActivity != null) {
-		// for (Iterator iter =
-		// selectedActivity.eClass().getEAllAttributes().iterator();
-		// iter.hasNext();) {
-		// EAttribute attrib = (EAttribute) iter.next();
-		// if(String.class.isAssignableFrom(attrib.getEAttributeType().getInstanceClass()))
-		// {
-		// List values =
-		// ConfigurationHelper.getStringAttribute(selectedActivity, attrib);
-		// System.out.println();
-		// System.out.println(attrib.getName() + ": " + values);
-		// }
-		// }
-		// }
-	}
-
-	/**
-	 * Updates actions including enabling/disabling them based on selection
-	 */
-	protected void updateActions() {
-		showInLibraryView
-				.setEnabled(selectedBreakdownElement instanceof Descriptor
-						&& ProcessUtil
-								.getAssociatedElement((Descriptor) selectedBreakdownElement) != null);
-
-		if (!locked && selection != null && !selection.isEmpty()) {
-			if (selection.size() == 1) {				
-				Object o = selection.get(0);
-				AdapterFactory adapterFactory = getAdapterFactory();
-				if(ProcessUtil.isRolledUpDescriptor(o, adapterFactory)) {
-					revealAction.setEnabled(false);
-					suppressAction.setEnabled(false);
-				}
-				else {
-					if (getSuppression().canReveal(selection)) {
-						revealAction.setEnabled(true);
-						suppressAction.setEnabled(false);
-					} else if (getSuppression().canSuppress(selection)) {
-						suppressAction.setEnabled(true);
-						revealAction.setEnabled(false);
-					} else {
-						revealAction.setEnabled(false);
-						suppressAction.setEnabled(false);
-					}
-				}
-			} else {
-				revealAction.setEnabled(getSuppression().canReveal(selection));
-				suppressAction.setEnabled(getSuppression().canSuppress(
-						selection));
-			}
-
-			// Action Enable/Disable for Suppress Task/Reveal Task context menu
-			boolean show = true;
-			for (int i = 0; i < selection.size(); i++) {
-				if (getAdapterFactory() == TngAdapterFactory.INSTANCE
-						.getWBS_ComposedAdapterFactory()) {
-
-					if (!(selection.get(i) instanceof Activity || selection
-							.get(i) instanceof ActivityWrapperItemProvider)) {
-						show = false;
-						break;
-					}
-				} else
-					show = false;
-			}
-			if (show) {
-				List taskDescriptors = ProcessUtil
-						.getTaskDescriptors(selection);
-				suppressTaskAction.setEnabled(getSuppression().canSuppress(
-						taskDescriptors));
-				revealTaskAction.setEnabled(getSuppression().canReveal(
-						taskDescriptors));
-			} else {
-				suppressTaskAction.setEnabled(false);
-				revealTaskAction.setEnabled(false);
-			}
-
-			// boolean hasInherited = false;
-			// for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			// Object item = iter.next();
-			// if (item instanceof BreakdownElementWrapperItemProvider
-			// && ((BreakdownElementWrapperItemProvider) item)
-			// .isReadOnly()) {
-			// hasInherited = true;
-			// break;
-			// }
-			// }
-			// updateSuppressionFromBaseAction.setEnabled(hasInherited);
-		} else {
-			revealAction.setEnabled(false);
-			suppressAction.setEnabled(false);
-			suppressTaskAction.setEnabled(false);
-			revealTaskAction.setEnabled(false);
-		}
-
-		// Set Activity Detail Diagram Action enable state.
-		if (selectedObject instanceof Activity
-				|| selectedObject instanceof ActivityWrapperItemProvider) {
-			setActionStateForADD();
-			setDiagramsContextMenuState();
-		}
-
-		// change action state for locked plugin
-		setActionState();
-	}
-
-	public void setActivePage(IEditorPart part) {
-		if (this.activeEditor != null) {
-			int page = ((ProcessEditor) this.activeEditor).getActivePage();
-			IActionBars actionBars = this.activeEditor.getEditorSite()
-					.getActionBars();
-
-			// TODO - need to get IFormPage and compare on that rather than
-			// integer page id. These id will change if we reposition pages.
-			if (page == 0) {			
-				actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-						null);
-				actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-						null);
-				actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-						null);
-				actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-						null);
-				actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-						null);
-				actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-						null);
-			} else if (page == 4) {
-				actionBars.clearGlobalActionHandlers();
-			}
-			else {
-				actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-						deleteAction);
-				actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-						cutAction);
-				actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-						copyAction);
-				actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-						pasteAction);
-				actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-						undoAction);
-				actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-						redoAction);
-			}
-			actionBars.updateActionBars();
-		}
-	}
-	
-	private void superDoRefresh() {
-		super.doRefresh();
-	}
-
-	protected void doRefresh() {
-		if (activeEditorPart instanceof IViewerProvider) {
-			Display display = activeEditorPart.getEditorSite().getShell().getDisplay();
-			BusyIndicator.showWhile(display, new Runnable() {
-
-				public void run() {
-					// update IDs
-					//
-					AdapterFactory adapterFactory = getAdapterFactory();
-					if (adapterFactory == TngAdapterFactory.INSTANCE
-							.getWBS_ComposedAdapterFactory()
-							|| adapterFactory == TngAdapterFactory.INSTANCE
-									.getProcessComposedAdapterFactory()) {
-						Process proc = getProcess();
-						ProcessUtil.updateIDs(adapterFactory, proc);
-//						long time = System.currentTimeMillis();
-						ProcessUtil.refreshPredeccessorLists(adapterFactory, proc);
-//						System.out.println("refreshPredeccessorLists() took: " + (System.currentTimeMillis() - time));
-					}
-
-					superDoRefresh();
-				}
-				
-			});
-		}
-
-	}
-
-	/*
-	 * Set Action state for Activity Detail Diagram in Context Menu on selection
-	 * of Activity. If an Activity consist atleast one taskdescriptor and its
-	 * primary performer in current configuration, then state is enabled else
-	 * state is disabled in context menu (process editor).
-	 */
-	protected void setActionStateForADD() {
-
-		// set ADD Action state false
-		openWorkflowDetailEditorAction.setEnabled(false);
-
-		// set AD Action state true always
-		openWorkflowEditorAction.setEnabled(true);
-
-		// set WPD Diagram Menu Action state tru always
-		openWPDependencyEditorAction.setEnabled(true);
-
-		if (selectedObject != null) {
-
-			if (getSuppression().isSuppressed(selectedObject)) {
-				openWorkflowDetailEditorAction.setEnabled(false);
-				openWorkflowEditorAction.setEnabled(false);
-				openWPDependencyEditorAction.setEnabled(false);
-				return;
-			}
-
-			Activity activity = null;
-			List list = new ArrayList();
-
-			if (selectedObject instanceof Activity) {
-				activity = selectedActivity;
-			} else if (selectedObject instanceof ActivityWrapperItemProvider) {
-				activity = (Activity) ((ActivityWrapperItemProvider) selectedObject)
-						.getValue();
-			}
-			if (activity == null)
-				return;
-
-			while (!activity.getVariabilityType().equals(
-					VariabilityType.NA_LITERAL)) {
-
-				VariabilityElement ve = activity.getVariabilityBasedOnElement();
-				// If Activity is set to local contribution,
-				// need to get breakdown elements of local contributed
-				// activity + base activity. And base activity breakdown
-				// elements
-				// are collected after while loop ends)
-				// if (VariabilityType.CONTRIBUTES_LITERAL.equals(activity
-				// .getVariabilityType())) {
-				// list.addAll(activity.getBreakdownElements());
-				// }
-				list.addAll(activity.getBreakdownElements());
-
-				if ((ve != null) && (ve instanceof Activity)) {
-					activity = (Activity) ve;
-				} else {
-					break;
-				}
-			}
-
-			// For AD diagram menu option, if Base Activity donot have any
-			// AD diagram, donot show AD diagram option in context menu for
-			// readonly activity.
-			Diagram diagram = GraphicalDataManager.getInstance().getUMADiagram(
-					activity, GraphicalDataHelper.ACTIVITY_DIAGRAM, false);
-			if (diagram == null
-					&& selectedObject instanceof ActivityWrapperItemProvider) {
-				openWorkflowEditorAction.setEnabled(false);
-			}
-
-			// For WPD diagram menu option, if Base Activity donot have any
-			// WPD diagram, donot show WPD diagram option in context menu
-			// for readonly activity.
-			diagram = GraphicalDataManager.getInstance().getUMADiagram(
-					activity,
-					GraphicalDataHelper.WORK_PRODUCT_DEPENDENCY_DIAGRAM, false);
-			if (diagram == null
-					&& selectedObject instanceof ActivityWrapperItemProvider) {
-				openWPDependencyEditorAction.setEnabled(false);
-			}
-
-			// Collect the breakdown elements to verifty taskdescriptors are
-			// not.
-			list.addAll(activity.getBreakdownElements());
-
-			// For ADD diagram menu option, if Base Activity donot have any
-			// ADD diagram, donot show ADD diagram option in context menu
-			// for
-			// readonly activity.
-			diagram = GraphicalDataManager.getInstance().getUMADiagram(
-					activity, GraphicalDataHelper.ACTIVITY_DETAIL_DIAGRAM,
-					false);
-			if (diagram == null
-					&& selectedObject instanceof ActivityWrapperItemProvider) {
-				openWorkflowDetailEditorAction.setEnabled(false);
-			} else {
-				// Iterate through the List, to find taskdescriptor and has
-				// primary role within current configuration.
-				// then enable the action.
-				for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-					Object obj = iterator.next();
-					if (obj instanceof TaskDescriptor) {
-						if (!getSuppression().isSuppressed(obj)) {
-							Object e = ((TaskDescriptor) obj)
-									.getPerformedPrimarilyBy();
-							AdapterFactoryEditingDomain domain = (AdapterFactoryEditingDomain) ((IEditingDomainProvider) activeEditorPart)
-									.getEditingDomain();
-							AdapterFactory factory = domain.getAdapterFactory();
-							if (factory instanceof ExposedAdapterFactory) {
-								IFilter filter = ((ExposedAdapterFactory) factory)
-										.getFilter();
-								if (filter != null && filter.accept(e)
-										&& !getSuppression().isSuppressed(e)) {
-									openWorkflowDetailEditorAction
-											.setEnabled(true);
-									break;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * Set Action state for Open Diagram Actions in Context Menu on
-	 * selection of Activity. Checking condition to handle if activity suppressed, if activity don't have
-	 * any taskdescriptor and primary performer, if base activity don't have diagram. 
-	 */
-	private void setDiagramsContextMenuState() {
-
-		// set ADD Action state false
-		newActivityDetailDiagramEditor.setEnabled(false);
-
-		// set AD Action state true always
-		newActivityDiagramEditor.setEnabled(true);
-
-		// set WPD Diagram Menu Action state tru always
-		newWPDiagramEditor.setEnabled(true);
-
-		if (selectedObject != null) {
-
-			if (getSuppression().isSuppressed(selectedObject)) {
-				newActivityDetailDiagramEditor.setEnabled(false);
-				newActivityDiagramEditor.setEnabled(false);
-				newWPDiagramEditor.setEnabled(false);
-				return;
-			}
-
-			Object unwrapped = TngUtil.unwrap(selectedObject);
-			if(!(unwrapped instanceof Activity)) {
-				return;
-			}
-			Activity activity = (Activity) unwrapped;
-			List list = new ArrayList();
-			
-			//TODO: check for existing diagrams in immediate base instead of root base
-			
-			while (!activity.getVariabilityType().equals(
-					VariabilityType.NA_LITERAL)) {
-
-				VariabilityElement ve = activity.getVariabilityBasedOnElement();
-				list.addAll(activity.getBreakdownElements());
-
-				if ((ve != null) && (ve instanceof Activity)) {
-					activity = (Activity) ve;
-				} else {
-					break;
-				}
-			}
-
-			org.eclipse.gmf.runtime.notation.Diagram diagram = ((ProcessEditor) getActiveEditor())
-					.getDiagramEditorHelper().getDiagram(activity,
-							IDiagramManager.ACTIVITY_DIAGRAM);
-			if (diagram == null
-					&& selectedObject instanceof ActivityWrapperItemProvider) {
-				newActivityDiagramEditor.setEnabled(false);
-			}
-
-			// For WPD diagram menu option, if Base Activity donot have any
-			// WPD diagram, donot show WPD diagram option in context menu
-			// for readonly activity.
-			diagram = ((ProcessEditor) getActiveEditor())
-					.getDiagramEditorHelper().getDiagram(activity,
-							IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM);
-			if (diagram == null
-					&& selectedObject instanceof ActivityWrapperItemProvider) {
-				newWPDiagramEditor.setEnabled(false);
-			}
-
-			// Collect the breakdown elements to verifty taskdescriptors are
-			// not.
-			list.addAll(activity.getBreakdownElements());
-
-			// For ADD diagram menu option, if Base Activity donot have any
-			// ADD diagram, donot show ADD diagram option in context menu
-			// for
-			// readonly activity.
-			diagram = ((ProcessEditor) getActiveEditor())
-					.getDiagramEditorHelper().getDiagram(activity,
-							IDiagramManager.ACTIVITY_DETAIL_DIAGRAM);
-
-			if (diagram == null
-					&& selectedObject instanceof ActivityWrapperItemProvider) {
-				newActivityDetailDiagramEditor.setEnabled(false);
-			} else {
-				// Iterate through the List, to find taskdescriptor and has
-				// primary role within current configuration.
-				// then enable the action.
-				for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-					Object obj = iterator.next();
-					if (obj instanceof TaskDescriptor) {
-						if (!getSuppression().isSuppressed(obj)) {
-							Object e = ((TaskDescriptor) obj)
-									.getPerformedPrimarilyBy();
-							AdapterFactoryEditingDomain domain = (AdapterFactoryEditingDomain) ((IEditingDomainProvider) activeEditorPart)
-									.getEditingDomain();
-							AdapterFactory factory = domain.getAdapterFactory();
-							if (factory instanceof ExposedAdapterFactory) {
-								IFilter filter = ((ExposedAdapterFactory) factory)
-										.getFilter();
-								if (filter != null && filter.accept(e)
-										&& !getSuppression().isSuppressed(e)) {
-									newActivityDetailDiagramEditor
-											.setEnabled(true);
-									break;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditorInput.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditorInput.java
deleted file mode 100644
index 59c578b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditorInput.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.editors;
-
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * An editor input for process editor
- * 
- * @author Phong Nguyen Le
- */
-public class ProcessEditorInput extends MethodElementEditorInput {
-	private ISelection initialSelection;
-	private int activePage = -1;
-
-	public ProcessEditorInput(MethodElement e) {
-		super(e);
-	}
-
-	/**
-	 * Return active page of the editor
-	 */
-	public int getActivePage() {
-		return activePage;
-	}
-
-	/**
-	 * Set active page for the editor
-	 * @param activePage
-	 */
-	public void setActivePage(int activePage) {
-		this.activePage = activePage;
-	}
-
-	/**
-	 * Return initial selection
-	 * @return
-	 * 			Selection
-	 */
-	public ISelection getInitialSelection() {
-		return initialSelection;
-	}
-
-	/**
-	 * Set initial selection 
-	 * @param initialSelection
-	 */
-	public void setInitialSelection(ISelection initialSelection) {
-		this.initialSelection = initialSelection;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/package.html
deleted file mode 100644
index bc27256..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides method, process and activity diagram editors.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AbstractBaseFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AbstractBaseFilter.java
deleted file mode 100644
index 59b234f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AbstractBaseFilter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
-
-/**
- * The base class for UI filters. Supports multiple filters.
- * Support filtering the element based on the pattern and type. 
- * 
- * @author Jinhua Xi
- * @since 1.0
- * 
- */
-public class AbstractBaseFilter {
-
-	protected FilterHelper helper;
-
-	protected IFilter[] additionalFilters = null;
-
-	/**
-	 * added for futher filtering. For example, we may set a filer to prevent
-	 * generalizers as base element to avoid circular dependency
-	 * 
-	 * @param additionalFilters
-	 */
-	public void setAdditionalFilters(IFilter[] additionalFilters) {
-		this.additionalFilters = additionalFilters;
-	}
-
-	public FilterHelper getHelper() {
-		return helper;
-	}
-
-	public void setHelper(FilterHelper helper) {
-		this.helper = helper;
-	}
-
-	/*
-	 * subclass method should call this before returning true.
-	 */
-	public boolean accept(Object obj) {
-
-		// Jinhua Xi, added for futher filtering.
-		// For example, we may set a filer to prevent generalizers as base
-		// element to avoid circular dependency
-		if (additionalFilters != null && additionalFilters.length > 0) {
-			for (int i = 0; i < additionalFilters.length; i++) {
-				if (additionalFilters[i].accept(obj) == false) {
-					return false;
-				}
-			}
-		}
-
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ActivityVariabilityFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ActivityVariabilityFilter.java
deleted file mode 100644
index a2bde58..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ActivityVariabilityFilter.java
+++ /dev/null
@@ -1,125 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.configuration.CategorizedProcessesItemProvider;
-import org.eclipse.epf.library.edit.configuration.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.viewers.TableViewer;
-
-/**
- * Activity variability filter
- * 
- * @author Shilpa Toraskar
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ActivityVariabilityFilter extends ExProcessAuthoringConfigurator {
-
-	private Activity activity = null;
-	
-	private List treeList = new ArrayList();
-	private List generalizers = new ArrayList();
-	private List baseelements = new ArrayList();
-	private List badelements = new ArrayList();
-
-	public ActivityVariabilityFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName, Activity activity) {
-		super(config, viewer);
-		this.activity = activity;
-		
-		// load the parentlist
-		AdapterFactory adapter = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-		FilterUtil.getSubTree(adapter, activity, treeList);
-		FilterUtil.getGeneralizers(treeList, generalizers);
-		FilterUtil.getVariabilityBase(treeList, baseelements);
-		
-		FilterUtil.getSubTree(adapter, generalizers, badelements);
-		FilterUtil.getSubTree(adapter, baseelements, badelements);
-	}
-	
-	public boolean accept(Object obj) {
-		// TODO Auto-generated method stub
-		if (!super.accept(obj)) return false;
-		return childAccept(obj);
-	}
-
-	public boolean childAccept(Object obj) {
-		if (obj instanceof ProcessesItemProvider) {
-			return true;
-		}
-		if (obj instanceof CategorizedProcessesItemProvider) {
-			return true;
-
-		}
-		if ((obj instanceof Activity) || obj instanceof ProcessPackage) {
-			if ((obj instanceof Activity)){
-				if(this.activity.equals((Activity) obj)) 
-					return false;
-				VariabilityElement e = ((Activity)obj).getVariabilityBasedOnElement();
-				if(e != null && activity.equals(e))
-					return false;
-			}
-			if (obj instanceof BreakdownElement) {
-				Process srcProc = TngUtil
-						.getOwningProcess((BreakdownElement) obj);
-				Process targetProc = TngUtil
-						.getOwningProcess((BreakdownElement) this.activity);
-				if (srcProc instanceof DeliveryProcess
-						&& targetProc instanceof CapabilityPattern) {
-					return false;
-				}
-			}
-			if(obj instanceof Activity){
-				if(TngUtil.contains(generalizers, obj) 
-				//Comment this out due to 182531, other cases missing this check here
-				//should be compensated by circular check after filter selection.
-				//Better fix is to include the circular check into the filter logic.		
-				// || TngUtil.contains(baseelements, obj)						
-				//		||TngUtil.contains(badelements, obj)
-						){
-					return false;
-				}
-			}
-			
-//			if (obj instanceof Process) {
-//				Process proc = (Process) obj;
-//				if (proc.equals(TngUtil.getOwningProcess(this.activity)))
-//					return false;
-//			}
-//			if(obj instanceof Activity){
-//				if(TngUtil.contains(contributors, obj)) return false;
-//				if(TngUtil.contains(variabilitybases, obj)) return false;
-//				if(obj.equals(FilterUtil.getParentActivity(TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory(), 
-//						activity))) return false;
-//			}
-			
-			return true;
-		} else
-			return false;
-	}
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AddLinkFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AddLinkFilter.java
deleted file mode 100644
index 6e8f04f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AddLinkFilter.java
+++ /dev/null
@@ -1,420 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.itemsfilter.CategorizedProcessesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.ContentCategoriesGroupItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.IAllFilter;
-import org.eclipse.epf.library.edit.itemsfilter.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.navigator.PluginUIPackagesItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * Filter for AddLink in RichTextEditor.
- * 
- */
-
-public class AddLinkFilter extends AbstractBaseFilter implements IAllFilter {
-
-	public boolean accept(Object obj) {
-		
-		// if can't be accdepted by super, return.
-		if(obj == null )return false;
-		
-		if (!super.accept(obj)) {
-			return false;
-		}
-
-		String filterTypeString = helper.getFilterTypeStr();
-		Object contentElement = helper.getContentElement();
-
-		if (helper.getAlreadySelectedList() != null) {
-			if (obj instanceof ProcessComponent) {
-				if (helper.getAlreadySelectedList().contains(
-						((ProcessComponent) obj).getProcess()))
-					return false;
-			} else {
-				if (helper.getAlreadySelectedList().contains(obj))
-					return false;
-			}
-		}
-
-		if (contentElement != null
-				&& !(obj instanceof ProcessComponent || obj instanceof Process)) {
-			if (obj.equals(helper.getContentElement()))
-				return false;
-		}
-
-		if (filterTypeString == null
-				|| filterTypeString.equals(FilterConstants.ALL_ELEMENTS)
-				|| filterTypeString.equals(FilterConstants.METHO_PLUGINS)) {
-
-			if (obj instanceof CustomCategory) {
-				if (TngUtil.isRootCustomCategory((CustomCategory) obj)) {
-					if (((CustomCategory) obj).getCategorizedElements()
-							.isEmpty())
-						return false;
-				}
-			}
-			if (!helper.matchPattern(obj))
-				return false;
-
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				Collection list = ((ContentCategoriesGroupItemProvider) obj)
-						.getChildren(obj);
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-			if (obj instanceof ProcessesItemProvider) {
-				Collection list = ((ProcessesItemProvider) obj)
-						.getChildren(obj);
-				for (Iterator ior = list.iterator(); ior.hasNext();) {
-					Object object = ior.next();
-					if (((CategorizedProcessesItemProvider) object)
-							.getChildren(object).isEmpty())
-						ior.remove();
-				}
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-			if (obj instanceof PluginUIPackagesItemProvider) {
-				return true;
-			}
-			if (childAccept(obj))
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.DISCIPLINES)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Disciplines_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof DisciplineGrouping) {
-				return !((DisciplineGrouping) obj).getDisciplines().isEmpty();
-			}
-			if (obj instanceof Discipline) {
-				return true;// AssociationHelper.getDisciplineGroups((Discipline)obj).isEmpty();
-			}
-		} else if (filterTypeString.equals(FilterConstants.ROLESETS)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Role_Sets_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof RoleSetGrouping) {
-				return !((RoleSetGrouping) obj).getRoleSets().isEmpty();
-			}
-			if (obj instanceof RoleSet) {
-				return true;// AssociationHelper.getRoleSetGroups((RoleSet)obj).isEmpty();
-			}
-		} else if (filterTypeString.equals(FilterConstants.WORKPRODUCTTYPES)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_WorkProductTypes_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof WorkProductType)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.DOMAINS)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Domains_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof Domain)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TOOLS)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Tools_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof Tool)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.ROLES)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Role)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TASKS)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Task)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.WORKPRODUCTS)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof WorkProduct)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.GUIDANCE)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Guidance)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.CHECKLISTS)) { //172956
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Checklist)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.CONCEPTS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Concept)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.EXAMPLES)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Example)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.GUIDELINES)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Guideline)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.CONCEPTS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Concept)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.ESTIMATE_CONSIDERATIONS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof EstimationConsiderations)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.PRACTICES)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Practice)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.REPORTS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Report)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.REUSABLE_ASSETS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ReusableAsset)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.ROADMAP)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Roadmap)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.SUPPORTING_MATERIALS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof SupportingMaterial)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TEMPLATES)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Template)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TERM_DEFINITIONS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof TermDefinition)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TOOL_MENTORS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ToolMentor)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.WHITE_PAPERS)) {
-			
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Whitepaper)
-				return true;
-		}
-		else if (filterTypeString.equals(FilterConstants.CONTENT_PACKAGES)) {
-
-			if (!helper.matchPattern(obj))
-				return false;
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof CustomCategory)
-				return false;
-			if (obj instanceof Role || obj instanceof Task
-					|| obj instanceof WorkProduct || obj instanceof Guidance)
-				return true;
-			// if(obj instanceof Guidance) return true;
-		} else if (filterTypeString.equals(FilterConstants.CUSTOM_CATEGORIES)) {
-
-			if (!helper.matchPattern(obj))
-				return false;
-			if (obj instanceof CustomCategory)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.PROCESSES)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof CustomCategory)
-				return false;
-			if (obj instanceof ProcessesItemProvider) {
-				Collection list = ((ProcessesItemProvider) obj)
-						.getChildren(obj);
-				for (Iterator ior = list.iterator(); ior.hasNext();) {
-					Object object = ior.next();
-					if (((CategorizedProcessesItemProvider) object)
-							.getChildren(object).isEmpty())
-						ior.remove();
-				}
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-			if (obj instanceof ProcessPackage)
-				return true;
-			if (obj instanceof BreakdownElement)
-				return true;
-		}
-		if (obj instanceof MethodPlugin) {
-			return true;
-		}
-		return false;
-	}
-
-	protected boolean childAccept(Object obj) {
-		if (obj instanceof MethodConfiguration)
-			return false;
-		return true;
-	}
-
-	public boolean acceptCategoriesGroup(Object obj, String type) {
-		if (obj instanceof ContentCategoriesGroupItemProvider) {
-			Collection list = ((ContentCategoriesGroupItemProvider) obj)
-					.getChildren(obj);
-			if (list.isEmpty())
-				return false;
-			if (((ContentCategoriesGroupItemProvider) obj).getText(obj).equals(
-					type))
-				return true;
-		}
-		return false;
-	}
-
-	public Object getObject() {
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AllFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AllFilter.java
deleted file mode 100644
index a0baa1f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/AllFilter.java
+++ /dev/null
@@ -1,587 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.forms.CustomCategoryAssignPage;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.itemsfilter.CategorizedProcessesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.ContentCategoriesGroupItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.IAllFilter;
-import org.eclipse.epf.library.edit.itemsfilter.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * Filter for all elements eg: used in {@link CustomCategoryAssignPage} 
- * 
- * @author Lokanath Jagga
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class AllFilter extends AbstractBaseFilter implements IAllFilter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.IAllFilter#getObject()
-	 */
-	public Object getObject() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		if(obj == null)
-			return false;
-		// if can't be accdepted by super, return.
-		if (!super.accept(obj)) {
-			return false;
-		}
-
-		String filterTypeString = helper.getFilterTypeStr();
-		Object contentElement = helper.getContentElement();
-
-		if (helper.getAlreadySelectedList() != null) {
-			if (obj instanceof ProcessComponent) {
-				if (helper.getAlreadySelectedList().contains(
-						((ProcessComponent) obj).getProcess()))
-					return false;
-			} else {
-				if (helper.getAlreadySelectedList().contains(obj))
-					return false;
-			}
-		}
-
-		if (contentElement != null
-				&& !(obj instanceof ProcessComponent || obj instanceof Process)) {
-			if(obj == null){
-				System.out.println("null"); //$NON-NLS-1$
-			}
-			if (obj.equals(helper.getContentElement()))
-				return false;
-		}
-
-		if (filterTypeString == null
-				|| filterTypeString.equals(FilterConstants.ALL_ELEMENTS)
-				|| filterTypeString.equals(FilterConstants.METHO_PLUGINS)
-				|| filterTypeString
-						.equals(FilterConstants.ONLY_CONTENT_ELEMENTS)) {
-
-			if (obj instanceof CustomCategory) {
-				if (TngUtil.isRootCustomCategory((CustomCategory) obj)) {
-					if (((CustomCategory) obj).getCategorizedElements()
-							.isEmpty())
-						return false;
-				}
-			}
-			if (!helper.matchPattern(obj))
-				return false;
-
-			// if(obj instanceof TermDefinition) return false;
-
-			if (obj instanceof MethodPlugin) {
-				if (obj instanceof MethodPlugin) {
-					if (contentElement != null) {
-						if (MethodElementUtil.getAllModels(contentElement)
-								.contains(obj))
-							return true;
-						else
-							return false;
-					} else {
-						return true;
-					}
-				}
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				Collection list = ((ContentCategoriesGroupItemProvider) obj)
-						.getChildren(obj);
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-			if (obj instanceof ProcessesItemProvider) {
-				Collection list = ((ProcessesItemProvider) obj)
-						.getChildren(obj);
-				for (Iterator ior = list.iterator(); ior.hasNext();) {
-					Object object = ior.next();
-					if (((CategorizedProcessesItemProvider) object)
-							.getChildren(object).isEmpty())
-						ior.remove();
-				}
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-
-			if (childAccept(obj))
-				return true;
-			//		
-		} else if (filterTypeString.equals(FilterConstants.DISCIPLINES)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Disciplines_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof DisciplineGrouping) {
-				return !((DisciplineGrouping) obj).getDisciplines().isEmpty();
-			}
-			if (obj instanceof Discipline) {
-				return true;// AssociationHelper.getDisciplineGroups((Discipline)obj).isEmpty();
-			}
-		} else if (filterTypeString.equals(FilterConstants.ROLESETS)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Role_Sets_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof RoleSetGrouping) {
-				return !((RoleSetGrouping) obj).getRoleSets().isEmpty();
-			}
-			if (obj instanceof RoleSet) {
-				return true;// AssociationHelper.getRoleSetGroups((RoleSet)obj).isEmpty();
-			}
-		} else if (filterTypeString.equals(FilterConstants.WORKPRODUCTTYPES)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_WorkProductTypes_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof WorkProductType)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.DOMAINS)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Domains_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof Domain)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TOOLS)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentCategoriesGroupItemProvider) {
-				return acceptCategoriesGroup(obj, LibraryEditPlugin.INSTANCE
-						.getString("_UI_Tools_group")); //$NON-NLS-1$
-			}
-			if (obj instanceof Tool)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.ROLES)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Role)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TASKS)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Task)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.WORKPRODUCTS)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof WorkProduct)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.GUIDANCE)) { 
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Guidance)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.CHECKLISTS)) { //172956
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Checklist)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.CONCEPTS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Concept)
-				return true;
-		}
-		else if (filterTypeString.equals(FilterConstants.EXAMPLES)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Example)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.GUIDELINES)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Guideline)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.CONCEPTS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Concept)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.ESTIMATE_CONSIDERATIONS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof EstimationConsiderations)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.PRACTICES)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Practice)
-				return true;
-		}else if (filterTypeString.equals(FilterConstants.REPORTS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Report)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.REUSABLE_ASSETS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ReusableAsset)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.ROADMAP)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Roadmap)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.SUPPORTING_MATERIALS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof SupportingMaterial)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TEMPLATES)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Template)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TERM_DEFINITIONS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof TermDefinition)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.TOOL_MENTORS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof ToolMentor)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.WHITE_PAPERS)) {
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof Whitepaper)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.CONTENT_PACKAGES)) {
-
-			if (!helper.matchPattern(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof ContentPackage)
-				return true;
-			if (obj instanceof CustomCategory)
-				return false;
-			if (obj instanceof Role || obj instanceof Task
-					|| obj instanceof WorkProduct || obj instanceof Guidance)
-				return true;
-			// if(obj instanceof Guidance) return true;
-		} else if (filterTypeString.equals(FilterConstants.CUSTOM_CATEGORIES)) {
-
-			if (!helper.matchPattern(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof CustomCategory)
-				return true;
-		} else if (filterTypeString.equals(FilterConstants.PROCESSES)) {
-
-			if (!helper.matchPatternBasedOnType(obj))
-				return false;
-			// if(obj instanceof Discipline) return true;
-			if (obj instanceof MethodPlugin) {
-				return acceptMethodPlugin(obj, contentElement);
-			}
-			if (obj instanceof CustomCategory)
-				return false;
-			if (obj instanceof ProcessesItemProvider) {
-				Collection list = ((ProcessesItemProvider) obj)
-						.getChildren(obj);
-				for (Iterator ior = list.iterator(); ior.hasNext();) {
-					Object object = ior.next();
-					if (((CategorizedProcessesItemProvider) object)
-							.getChildren(object).isEmpty())
-						ior.remove();
-				}
-				if (list.isEmpty())
-					return false;
-				else
-					return true;
-			}
-			if (obj instanceof ProcessPackage)
-				return true;
-			if (obj instanceof BreakdownElement)
-				//return true;
-				return childAccept(obj);
-		}
-		return false;
-	}
-
-	protected boolean childAccept(Object obj) {
-		if (obj instanceof MethodConfiguration)
-			return false;
-		if(obj instanceof Milestone) return false;
-		return true;
-	}
-
-	// public FilterHelper getHelper() {
-	// return helper;
-	// }
-	//
-	//	
-	// public void setHelper(FilterHelper helper) {
-	// this.helper = helper;
-	// }
-	protected List getAncestors(CustomCategory methodObject) {
-		List ancestorList = new ArrayList();
-
-		List objList = new ArrayList();
-		objList.add(methodObject);
-
-		getAncestors(ancestorList, objList);
-
-		return ancestorList;
-	}
-
-	protected List getAncestors(List ancestorList, List methodObjectList) {
-		if (methodObjectList.isEmpty())
-			return ancestorList;
-
-		List allParentCustCats = new ArrayList();
-
-		for (Iterator iter = methodObjectList.iterator(); iter.hasNext();) {
-			CustomCategory element = (CustomCategory) iter.next();
-			List parentList = AssociationHelper.getCustomCategories(element);
-			allParentCustCats.addAll(parentList);
-
-		}
-
-		ancestorList.addAll(methodObjectList);
-		List nextCheckList = new ArrayList();
-		for (Iterator iter = allParentCustCats.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!ancestorList.contains(element))
-				nextCheckList.add(element);
-		}
-
-		return getAncestors(ancestorList, nextCheckList);
-	}
-
-	public boolean acceptMethodPlugin(Object obj, Object contentElement) {
-		if (contentElement != null) {
-			if (MethodElementUtil.getAllModels(contentElement).contains(obj))
-				return true;
-			else
-				return false;
-		} else {
-			return true;
-		}
-	}
-
-	public boolean acceptCategoriesGroup(Object obj, String type) {
-		if (obj instanceof ContentCategoriesGroupItemProvider) {
-			Collection list = ((ContentCategoriesGroupItemProvider) obj)
-					.getChildren(obj);
-			if (list.isEmpty())
-				return false;
-			if (((ContentCategoriesGroupItemProvider) obj).getText(obj).equals(
-					type))
-				return true;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/CategoryFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/CategoryFilter.java
deleted file mode 100644
index dcf8ca0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/CategoryFilter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.itemsfilter.ICategoryFilter;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * Filter for {@link ContentCategory}
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class CategoryFilter extends AbstractBaseFilter implements
-		ICategoryFilter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.ICategoryFilter#getCategoryPackagePath()
-	 */
-	public String[] getCategoryPackagePath() {
-		return helper.getPathBasedOnTabString(helper.getContentCategoryTabStr());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.ICategoryFilter#getObject()
-	 */
-	public Object getObject() {
-		return helper.getContentElement();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		// if can't be accdepted by super, return.
-		if (!super.accept(obj)) {
-			return false;
-		}
-
-		if (!helper.checkObjectAccepted(obj))
-			return false;
-
-		if (obj instanceof MethodPlugin) {
-			return helper.acceptMethodPlugin(obj);
-		}
-		if (childAccept(obj))
-			return true;
-		return false;
-	}
-
-	protected boolean childAccept(Object obj) {
-		if (obj instanceof ContentElement)
-			return true;
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ContentFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ContentFilter.java
deleted file mode 100644
index a469046..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ContentFilter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.itemsfilter.IContentFilter;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * Filter implements {@link IContentFilter}. Filter content element in content package. 
- * 
- * @author Shashidhar Kannoori
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ContentFilter extends AbstractBaseFilter implements IContentFilter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.IContentFilter#getContentPackagePath()
-	 */
-	public String[] getContentPackagePath() {
-		return helper.getPathBasedOnTabString(helper.getTabStr());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.IContentFilter#getObject()
-	 */
-	public Object getObject() {
-		return helper.getContentElement();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		// if can't be accdepted by super, return.
-		if (!super.accept(obj)) {
-			return false;
-		}
-
-		// further filtering
-		if (!helper.checkObjectAccepted(obj))
-			return false;
-
-		if (obj instanceof MethodPlugin) {
-			return helper.acceptMethodPlugin(obj);
-		}
-
-		if (childAccept(obj))
-			return true;
-
-		if (obj instanceof ContentPackage) {
-			return helper.acceptContentPackage(obj);
-		}
-
-		return false;
-	}
-
-	protected boolean childAccept(Object obj) {
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/CustomCategoryFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/CustomCategoryFilter.java
deleted file mode 100644
index a8540d8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/CustomCategoryFilter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.itemsfilter.ICustomFilter;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * Filter specific for {@link CustomCategory} elements. 
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class CustomCategoryFilter extends AbstractBaseFilter implements
-		ICustomFilter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.ICustomFilter#getContentPackagePath()
-	 */
-	public String[] getContentPackagePath() {
-		return helper.getPathBasedOnTabString(helper.getTabStr());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.ICustomFilter#getObject()
-	 */
-	public Object getObject() {
-		return helper.getContentElement();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.ICustomFilter#getString()
-	 */
-	public String getString() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		// if can't be accdepted by super, return.
-		if (!super.accept(obj)) {
-			return false;
-		}
-
-		if (!helper.checkObjectAccepted(obj))
-			return false;
-
-		if (obj instanceof MethodPlugin) {
-			return helper.acceptMethodPlugin(obj);
-		}
-
-		if (childAccept(obj))
-			return true;
-		return false;
-	}
-
-	private boolean childAccept(Object obj) {
-		if (obj instanceof CustomCategory)
-			return true;
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/DescriptorConfigurationFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/DescriptorConfigurationFilter.java
deleted file mode 100644
index b91f763..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/DescriptorConfigurationFilter.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.library.configuration.ConfigurationFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.Viewer;
-
-
-/**
- *  Method configuration specific filter for filtering elements based on filter pattern
- *  and type after elements are realized within the specified configuraiton.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class DescriptorConfigurationFilter extends ConfigurationFilter {
-
-	String filterStr;
-
-	MethodConfiguration methodConfiguration;
-
-	protected FilterHelper helper;
-
-	protected Viewer viewer;
-	
-	/**
-	 * @param methodConfig
-	 * @param viewer
-	 */
-	public DescriptorConfigurationFilter(MethodConfiguration methodConfig,
-			Viewer viewer, String filterStr) {
-		super(methodConfig);
-		this.viewer = viewer;
-		this.filterStr = filterStr;
-		this.methodConfiguration = methodConfig;
-	}
-
-	public void notifyChanged(final Notification msg) {
-		if (viewer == null) {
-			return;
-		}
-	
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					viewer.refresh();
-				}
-			}
-		});
-
-	}
-	
-	public boolean accept(Object obj) {
-
-		if (obj instanceof MethodConfiguration) {
-			return methodConfiguration.equals(obj);
-		}
-
-		if (!super.accept(obj))
-			return false;
-		if(helper != null) {
-			if (helper.isShowPresentationName()) {
-				if (!helper.matchPatternOnPresentationName(obj))
-					return false;
-			} else {
-				if (!helper.matchPattern(obj))
-					return false;
-			}
-			if (!helper.isObjectInSelectedItems(obj))
-				return false;
-		}
-		if (childAccept(obj))
-			return true;
-		return false;
-
-	}
-
-	public java.util.Collection getChildren(Object obj,
-			org.eclipse.emf.ecore.EStructuralFeature childFeature) {
-		// return super.getChildren(obj, childFeature);
-		// Modified code to handle the filtering
-		// to check if the variability of parent is not N/A, filter out already
-		// exisitng
-		// element from children list.
-		Collection col = super.getChildren(obj, childFeature);
-		if(col != null){
-		for (Iterator itor = col.iterator(); itor.hasNext();) {
-			Object element = itor.next();
-			if (!accept(element))
-				itor.remove();
-		}
-		}else{
-			col = Collections.EMPTY_LIST;
-		}
-
-		return col;
-	}
-
-	public boolean childAccept(Object obj) {
-		return false;
-	}
-
-	public void setHelper(FilterHelper helper) {
-		this.helper = helper;
-	}
-	
-	public void setMethodConfiguration(MethodConfiguration config)
-	{
-		super.setMethodConfiguration(config);
-		this.methodConfiguration = config;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/DescriptorProcessFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/DescriptorProcessFilter.java
deleted file mode 100644
index e6a206a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/DescriptorProcessFilter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.IProcessFilter;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-
-
-/**
- * {@link Process} filter for filtering {@link Process} elements. 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class DescriptorProcessFilter extends AbstractBaseFilter implements
-		IProcessFilter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.IFilter#getObject()
-	 */
-	public Object getObject() {
-		return helper.getContentElement();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		// if can't be accdepted by super, return.
-		if (!super.accept(obj)) {
-			return false;
-		}
-
-		if (!helper.isObjectInSelectedItems(obj))
-			return false;
-		if (!matchPattern(obj))
-			return false;
-		if (obj instanceof ProcessComponent)
-			return true;
-		if (obj instanceof Process)
-			return true;
-		if (childAccept(obj))
-			return true;
-
-		return false;
-	}
-
-	protected boolean childAccept(Object obj) {
-		return false;
-	}
-
-	public boolean matchPattern(Object obj) {
-		// if no valid filter type or pattern, always return true
-		String filterTypeStr = helper.getFilterTypeStr();
-		// String pattern = helper.getPattern();
-		String tabStr = helper.getTabStr();
-		Pattern regexPattern = helper.getRegexPattern();
-		if (helper.getFilterTypeStr() == null || helper.getPattern() == null
-				|| helper.getPattern().equalsIgnoreCase("")) //$NON-NLS-1$
-			return true;
-
-		if (filterTypeStr.equalsIgnoreCase(tabStr)) {
-			if (obj instanceof BreakdownElement) {
-				if (obj instanceof Activity)
-					return true;
-				Matcher m = regexPattern.matcher(((BreakdownElement) obj)
-						.getName());
-				boolean found = m.matches();
-				if (found)
-					return true;
-				else {
-					return false;
-				}
-			} else {
-				// else for all other types of elements
-				return true;
-			}
-		} else
-			// the All case
-			return true;
-	}
-
-	protected void getActivitiesInScope(AdapterFactory adapterFactory,
-			BreakdownElement element, List activityList) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(element, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(element);
-		if (parent instanceof Activity) {
-			activityList.add(parent);
-			getActivitiesInScope(adapterFactory, (BreakdownElement) parent,
-					activityList);
-		}
-	}
-	public DescriptorProcessFilter(MethodConfiguration config) {
-		setAdditionalFilters(new IFilter[] { new ProcessConfigurator(config) });
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ExProcessAuthoringConfigurator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ExProcessAuthoringConfigurator.java
deleted file mode 100644
index c9a2644..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ExProcessAuthoringConfigurator.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
-import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Configuration filter that still shows certain elements during process authoring that
- * ProcessConfigurator does not show. Filter elements based on search pattern and type.
- * @author skannoor
- *
- */
-public class ExProcessAuthoringConfigurator extends
-		ProcessAuthoringConfigurator {
-
-	String filterStr;
-
-	MethodConfiguration methodConfiguration;
-	Viewer viewer;
-	
-	protected FilterHelper helper;
-	/**
-	 * @param methodConfig
-	 * @param viewer
-	 */
-	public ExProcessAuthoringConfigurator(MethodConfiguration methodConfig,
-			Viewer viewer) {
-		super(methodConfig);
-		this.viewer = viewer;
-		//this.filterStr = filterStr;
-		this.methodConfiguration = methodConfig;
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(final Notification msg) {
-		if (viewer == null) {
-			return;
-		}
-
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					viewer.refresh();
-				}
-			}
-		});
-
-	}
-	
-	public boolean accept(Object obj) {
-
-		if(obj == null) return false;
-		
-		if (obj instanceof MethodConfiguration) {
-			return methodConfiguration.equals(obj);
-		}
-
-//		if (!super.accept(obj))
-//			return false;
-		if (methodConfig == null)
-			return true;
-
-		obj = LibraryUtil.unwrap(obj);
-
-//		if (obj instanceof MethodPackage) {
-//			return methodConfig.getMethodPackageSelection().contains(obj);
-//		} else if (obj instanceof ItemProviderAdapter) {
-//			return true;
-//		} else {
-//			if(Log.DEBUG) {
-//				System.out.println("Object filtered: " + (obj == null ? null : obj.toString())); //$NON-NLS-1$
-//			}
-//		}
-		if (helper.isShowPresentationName()) {
-			if (!helper.matchPatternOnPresentationName(obj))
-				return false;
-		} else {
-			if (!helper.matchPattern(obj))
-				return false;
-		}
-		if (!helper.isObjectInSelectedItems(obj))
-			return false;
-		if (childAccept(obj))
-			return true;
-		return false;
-
-	}
-
-	public boolean childAccept(Object obj) {
-		return false;
-	}
-
-	public void setHelper(FilterHelper helper) {
-		this.helper = helper;
-	}
-	
-	public void setMethodConfiguration(MethodConfiguration config)
-	{
-		super.setMethodConfiguration(config);
-		this.methodConfiguration = config;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/GuidanceFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/GuidanceFilter.java
deleted file mode 100644
index 343d8bb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/GuidanceFilter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.itemsfilter.FilterInitializer;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.WorkProduct;
-
-
-/**
- * Filter for {@link Guidance} type elements.
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class GuidanceFilter extends ContentFilter {
-
-	protected boolean childAccept(Object obj) {
-//		 When type is selected allow those Class types to display.
-		Class cls = FilterInitializer.getInstance().
-						getClassForType(helper.getFilterTypeStr());
-		if(cls != null){
-			if(cls.isInstance(obj)){
-				return true;
-			}else{
-				return false;
-			}
-		}
-		// For all ContentElement - these guidances are associated
-		if (obj instanceof Checklist || obj instanceof Concept
-				|| obj instanceof Example || obj instanceof SupportingMaterial
-				|| obj instanceof Guideline || obj instanceof ReusableAsset)	
-			return true;
-		
-		// For task extra guidances
-		if(helper.getContentElement() instanceof Task){
-			if(obj instanceof ToolMentor 
-					|| obj instanceof EstimationConsiderations)
-				return true;
-		}
-		// For workProduct Extra guidances.
-		if(helper.getContentElement() instanceof WorkProduct){
-			if(obj instanceof Report || obj instanceof Template
-					|| obj instanceof ToolMentor 
-					|| obj instanceof EstimationConsiderations)
-				return true;
-		}
-		
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessActivityFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessActivityFilter.java
deleted file mode 100644
index be51571..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessActivityFilter.java
+++ /dev/null
@@ -1,154 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.configuration.CategorizedProcessesItemProvider;
-import org.eclipse.epf.library.edit.configuration.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
-import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Activity Filter for doing Process copy/extend
- * 
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ProcessActivityFilter extends DescriptorConfigurationFilter {
-
-	private Activity activity = null;
-
-	private int command = 0;
-
-	private ActivityVariabilityFilter delegateFilter;
-
-	public ProcessActivityFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName, Activity activity, int command) {
-		super(config, viewer, tabName);
-		this.activity = activity;
-		this.command = command;
-		delegateFilter = new ActivityVariabilityFilter(config, viewer, tabName, activity);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.filters.DescriptorConfigurationFilter#setHelper(org.eclipse.epf.library.edit.itemsfilter.FilterHelper)
-	 */
-	public void setHelper(FilterHelper helper) {
-		super.setHelper(helper);
-		delegateFilter.setHelper(helper);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.filters.DescriptorConfigurationFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		// any activity can be deep-copied
-		//
-		if(command == IActionTypeProvider.DEEP_COPY && 
-				(obj instanceof Activity || obj instanceof ProcessComponent)) {
-			return true;
-		}
-		return super.accept(obj);
-	}
-
-	public boolean childAccept(Object obj) {
-		if (obj instanceof ProcessesItemProvider) {
-			return true;
-		}
-		if (obj instanceof CategorizedProcessesItemProvider) {
-			return true;
-
-		}
-		
-//		if ((obj instanceof Activity) || obj instanceof ProcessPackage) {
-//			if (obj instanceof ProcessComponent) {
-//				// if source and taget is same process, block it
-//				Process proc = ((ProcessComponent) obj).getProcess();
-//				if (!(this.command == IActionTypeProvider.COPY)) {
-//					if (proc.equals(this.activity))
-//						return false;
-//				}
-//			}
-//			if (obj instanceof Process) {
-//				// if source and taget is same process, block it
-//				Process proc = (Process) obj;
-//				if (!(this.command == IActionTypeProvider.COPY)) {
-//					if (proc.equals(this.activity))
-//						return false;
-//				}
-//			}
-//
-//			if (obj instanceof BreakdownElement) {
-//				Process srcProc = TngUtil
-//						.getOwningProcess((BreakdownElement) obj);
-//				Process targetProc = TngUtil
-//						.getOwningProcess((BreakdownElement) this.activity);
-//				if (srcProc instanceof DeliveryProcess
-//						&& targetProc instanceof CapabilityPattern) {
-//					return false;
-//				}
-//			}
-//			if (obj instanceof Process) {
-//				Process proc = (Process) obj;
-//				if (proc.equals(this.activity))
-//					return false;
-//			}
-//
-//			return true;
-//		} else
-//			return false;
-		
-		if(obj instanceof Activity || obj instanceof ProcessPackage) {
-			switch(command) {
-				case IActionTypeProvider.EXTEND:
-					return delegateFilter.accept(obj);
-				case IActionTypeProvider.COPY:
-					// disallow copying from delivery process to capability pattern
-					//
-					Process srcProc = null;
-					if (obj instanceof ProcessComponent) {
-						// if source and taget is same process, block it
-						srcProc = ((ProcessComponent) obj).getProcess();
-					}
-					else if (obj instanceof BreakdownElement) {
-						BreakdownElement be = (BreakdownElement) obj;
-						srcProc = TngUtil.getOwningProcess(be);
-					}
-					if(srcProc != null) {
-						Process targetProc = TngUtil.getOwningProcess(this.activity);
-						if (srcProc instanceof DeliveryProcess
-								&& targetProc instanceof CapabilityPattern) {
-							return false;
-						}
-						else {
-							return true;
-						}
-					}
-				default:
-					return true;
-			}
-		}
-		
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessGuidanceFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessGuidanceFilter.java
deleted file mode 100644
index fed4e59..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessGuidanceFilter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.Collection;
-
-import org.eclipse.epf.library.edit.configuration.GuidanceGroupingItemProvider;
-import org.eclipse.epf.library.edit.configuration.GuidanceItemProvider;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Guidance Filter for Work breakdown structure. 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessGuidanceFilter extends DescriptorConfigurationFilter {
-
-	public ProcessGuidanceFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName) {
-		super(config, viewer, tabName);
-	}
-
-	public boolean accept(Object obj) {
-		return super.accept(obj);
-	}
-
-	public boolean childAccept(Object obj) {
-		if (obj instanceof GuidanceGroupingItemProvider)
-			return true;
-		if ((obj instanceof GuidanceItemProvider)) {
-			Collection col = ((GuidanceItemProvider) obj).getChildren(obj);
-			if (col.isEmpty())
-				return false;
-			else
-				return true;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessRoleFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessRoleFilter.java
deleted file mode 100644
index 4cbeca5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessRoleFilter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.library.edit.configuration.UncategorizedItemProvider;
-import org.eclipse.epf.library.edit.element.RoleItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Filters {@link RoleSet}, {@link RoleSetGrouping} in specific {@link MethodConfiguration}
- * based on search pattern. 
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessRoleFilter extends DescriptorConfigurationFilter {
-
-	public ProcessRoleFilter(MethodConfiguration config, TableViewer viewer,
-			String tabName) {
-		super(config, viewer, tabName);
-	}
-
-	public boolean childAccept(Object obj) {
-		if (obj instanceof CategoriesItemProvider) {
-			if (((CategoriesItemProvider) obj).getText(obj).equalsIgnoreCase(
-					LibraryEditPlugin.INSTANCE.getString("_UI_Role_Sets_group"))) //$NON-NLS-1$
-				return true;
-		}
-		if ((obj instanceof RoleItemProvider) || (obj instanceof Role)
-				|| (obj instanceof UncategorizedItemProvider))
-			return true;
-		
-		if(obj instanceof RoleSetGrouping){
-			Iterator iter = (TngUtil.getContributors((VariabilityElement)obj));
-			if(iter != null){
-				while(iter.hasNext()){
-					RoleSetGrouping grouping = (RoleSetGrouping)iter.next();
-					// TODO : Check for (recursive)RoleSets is empty, 
-					// if roleset's roles are empty donot show Discipline grouping 
-					if(!grouping.getRoleSets().isEmpty()) return true;
-				}
-			}
-			// TODO : Check for (recursive)RoleSets is empty, 
-			// if roleset's roles are empty donot show Discipline grouping 
-			return !((RoleSetGrouping)obj).getRoleSets().isEmpty();
-		}
-		if(obj instanceof RoleSet){
-			return !((RoleSet)obj).getRoles().isEmpty();
-		}
-		else
-			return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessSpecificWorkProductFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessSpecificWorkProductFilter.java
deleted file mode 100644
index 495b978..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessSpecificWorkProductFilter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Filters {@link WorkProduct}s based on {@link MethodConfiguration} and search pattern.
- * and {@link WorkProductType}  
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessSpecificWorkProductFilter extends ProcessWorkProductFilter {
-
-	Class workProductType = null;
-
-	public ProcessSpecificWorkProductFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName, Class type) {
-		super(config, viewer, tabName);
-		this.workProductType = type;
-	}
-
-	public boolean childAccept(Object obj) {
-		if (super.childAccept(obj)) {
-			if (obj instanceof WorkProduct) {
-				if (workProductType == null)
-					return true;
-				else if (obj.getClass().equals(this.workProductType)) {
-					return true;
-				} else {
-					return false;
-				}
-
-			} else {
-				return true;
-			}
-		} else {
-			return false;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessTaskFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessTaskFilter.java
deleted file mode 100644
index e39cb70..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessTaskFilter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.library.edit.configuration.UncategorizedItemProvider;
-import org.eclipse.epf.library.edit.element.TaskItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Filters {@link Task}s in {@link MethodConfiguration} based on search pattern.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessTaskFilter extends DescriptorConfigurationFilter {
-
-	public ProcessTaskFilter(MethodConfiguration config, TableViewer viewer,
-			String tabName) {
-		super(config, viewer, tabName);
-	}
-
-	public boolean childAccept(Object obj) {
-		if (obj instanceof CategoriesItemProvider) {
-			if (((CategoriesItemProvider) obj).getText(obj).equalsIgnoreCase(
-					LibraryEditPlugin.INSTANCE
-							.getString("_UI_Disciplines_group"))) //$NON-NLS-1$
-				return true;
-		}
-		if ((obj instanceof TaskItemProvider) || (obj instanceof Task)
-				|| (obj instanceof UncategorizedItemProvider))
-			return true;
-		if(obj instanceof DisciplineGrouping){
-			Iterator iter = (TngUtil.getContributors((VariabilityElement)obj));
-			if(iter != null){
-				while(iter.hasNext()){
-					DisciplineGrouping grouping = (DisciplineGrouping)iter.next();
-					// TODO : Check for (recursive)Discipline is empty, 
-					// if discipline's tasks are empty donot show Discipline grouping 
-					if(!grouping.getDisciplines().isEmpty()) return true;
-				}
-			}
-			// TODO : Check for (recursive)Discipline is empty, 
-			// if discipline's tasks are empty donot show Discipline grouping 
-			return !((DisciplineGrouping)obj).getDisciplines().isEmpty();
-		}
-		if(obj instanceof Discipline){
-			Iterator iter = (TngUtil.getContributors((VariabilityElement)obj));
-			if(iter != null){
-				while(iter.hasNext()){
-					Discipline discipline = (Discipline)iter.next();
-					// TODO : Check for (recursive)Discipline is empty, 
-					// if discipline's tasks are empty donot show Discipline 
-					if(!discipline.getTasks().isEmpty()) return true;
-				}
-			}
-			return !((Discipline)obj).getTasks().isEmpty();
-		}
-			return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessViewFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessViewFilter.java
deleted file mode 100644
index d846522..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessViewFilter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.jface.viewers.Viewer;
-
-
-/**
- * Filter {@link Process}es within {@link MethodConfiguration} used in
- * {@link ItemsFilterDialog}.
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessViewFilter extends DescriptorConfigurationFilter {
-
-	public ProcessViewFilter(MethodConfiguration methodConfig, Viewer viewer,
-			String filterStr) {
-		super(methodConfig, viewer, filterStr);
-	}
-
-	public boolean childAccept(Object obj) {
-		String filterType = helper.getFilterTypeStr();
-		if (obj instanceof CategoriesItemProvider) {
-			return true;
-		}
-		if (filterType.equalsIgnoreCase(FilterConstants.ROLESETS)) {
-			return (obj instanceof RoleSet || obj instanceof RoleSetGrouping);
-		} else if (filterType.equalsIgnoreCase(FilterConstants.DISCIPLINES)) {
-			return (obj instanceof Discipline || obj instanceof DisciplineGrouping);
-		} else if (filterType.equalsIgnoreCase(FilterConstants.DOMAINS)) {
-			return (obj instanceof Domain);
-		} else if (filterType
-				.equalsIgnoreCase(FilterConstants.WORKPRODUCTTYPES)) {
-			return (obj instanceof WorkProductType);
-		} else if (filterType.equalsIgnoreCase(FilterConstants.TOOLS)) {
-			return (obj instanceof Tool);
-		} else if (filterType
-				.equalsIgnoreCase(FilterConstants.CUSTOM_CATEGORIES)) {
-			return obj instanceof CustomCategory;
-		} else if (filterType.equalsIgnoreCase(FilterConstants.ALL_ELEMENTS)) {
-			return obj instanceof RoleSet || obj instanceof Discipline
-					|| obj instanceof Domain || obj instanceof WorkProductType
-					|| obj instanceof Tool || obj instanceof CustomCategory
-					|| obj instanceof DisciplineGrouping
-					|| obj instanceof RoleSetGrouping;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessWorkProductFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessWorkProductFilter.java
deleted file mode 100644
index c3ff30f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ProcessWorkProductFilter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.library.edit.configuration.DomainItemProvider;
-import org.eclipse.epf.library.edit.configuration.UncategorizedItemProvider;
-import org.eclipse.epf.library.edit.element.WorkProductItemProvider;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Filters {@link WorkProduct}s with in {@link MethodConfiguration}. 
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessWorkProductFilter extends DescriptorConfigurationFilter {
-
-	public ProcessWorkProductFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName) {
-		super(config, viewer, tabName);
-	}
-
-	public boolean childAccept(Object obj) {
-		if (obj instanceof CategoriesItemProvider) {
-			if (((CategoriesItemProvider) obj).getText(obj).equalsIgnoreCase(
-					LibraryEditPlugin.INSTANCE
-							.getString("_UI_WorkProductTypes_group"))) //$NON-NLS-1$
-				return true;
-		}
-		if (obj instanceof CategoriesItemProvider) {
-			if (((CategoriesItemProvider) obj).getText(obj).equalsIgnoreCase(
-					LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group"))) //$NON-NLS-1$
-				return true;
-		}
-		if ((obj instanceof WorkProductItemProvider)
-				|| (obj instanceof WorkProduct)
-				|| (obj instanceof UncategorizedItemProvider)
-				|| (obj instanceof Domain)
-				|| (obj instanceof DomainItemProvider)
-				|| (obj instanceof WorkProductType))
-			return true;
-		else
-			return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ReferenceWorkFlowFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ReferenceWorkFlowFilter.java
deleted file mode 100644
index 0ba01db..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ReferenceWorkFlowFilter.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.epf.library.edit.itemsfilter.CategorizedProcessesItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.IAllFilter;
-import org.eclipse.epf.library.edit.itemsfilter.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-
-
-/**
- * Filters the {@link Process}s for reference workflows of {@link Discipline}. 
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ReferenceWorkFlowFilter extends AbstractBaseFilter implements
-		IAllFilter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.itemsfilter.IAllFilter#getObject()
-	 */
-	public Object getObject() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		// if can't be accdepted by super, return.
-		if (!super.accept(obj)) {
-			return false;
-		}
-
-		Object contentElement = helper.getContentElement();
-		if (contentElement != null) {
-			if (obj.equals(helper.getContentElement()))
-				return false;
-		}
-
-		if (helper.getAlreadySelectedList() != null) {
-			if (obj instanceof ProcessComponent) {
-				if (helper.getAlreadySelectedList().contains(
-						((ProcessComponent) obj).getProcess()))
-					return false;
-			}
-			if(helper.getAlreadySelectedList().contains(obj))
-				return false;
-		}
-		if (!helper.matchPattern(obj))
-			return false;
-
-		if (obj instanceof MethodPlugin) {
-			if (contentElement != null) {
-				if (MethodElementUtil.getAllModels(contentElement)
-						.contains(obj))
-					return true;
-				else
-					return false;
-			} else {
-				return true;
-			}
-		}
-		if (obj instanceof ProcessesItemProvider) {
-			Collection list = ((ProcessesItemProvider) obj).getChildren(obj);
-			for (Iterator ior = list.iterator(); ior.hasNext();) {
-				Object object = ior.next();
-				if (((CategorizedProcessesItemProvider) object).getChildren(
-						object).isEmpty())
-					ior.remove();
-			}
-			if (list.isEmpty())
-				return false;
-			else
-				return true;
-		}
-		if (obj instanceof Activity)
-			return true;
-		if (obj instanceof ProcessPackage) {
-			if (!(obj instanceof ProcessComponent)) {
-				if (((ProcessPackage) obj).getProcessElements().isEmpty()
-						&& ((ProcessPackage) obj).getChildPackages().isEmpty())
-					return false;
-				else
-					return true;
-			} else {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/RoleFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/RoleFilter.java
deleted file mode 100644
index 99cc43b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/RoleFilter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Role;
-
-
-/**
- * Filters {@link Role} 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class RoleFilter extends AllFilter {
-
-	public boolean accept(Object obj) {
-		Object contentElement = getHelper().getContentElement();
-		if (contentElement != null) {
-			if (obj.equals(contentElement))
-				return false;
-		}
-
-		if (getHelper().getAlreadySelectedList() != null) {
-			if (getHelper().getAlreadySelectedList().contains(obj))
-				return false;
-		}
-		if (!getHelper().matchPattern(obj))
-			return false;
-		if (obj instanceof MethodPlugin) {
-			if (obj instanceof MethodPlugin) {
-				if (contentElement != null) {
-					if (MethodElementUtil.getAllModels(contentElement)
-							.contains(obj))
-						return true;
-					else
-						return false;
-				} else {
-					return true;
-				}
-			}
-		}
-		if (obj instanceof ContentPackage)
-			return true;
-		if (obj instanceof Role)
-			return true;
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessRoleFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessRoleFilter.java
deleted file mode 100644
index 30d0e93..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessRoleFilter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.command.ProcessCommandUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Filters {@link Process}'s {@link Role} within {@link MethodConfiguration}
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class VariabilityProcessRoleFilter extends ProcessRoleFilter {
-
-	Activity activity = null;
-
-	public VariabilityProcessRoleFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName, Activity activity) {
-		super(config, viewer, tabName);
-		this.activity = activity;
-	}
-
-	public boolean childAccept(Object obj) {
-		if (super.childAccept(obj)) {
-//			if (ProcessUtil.getVariabilityElement(this.activity).contains(obj)) {
-//				return false;
-//			} else
-//				return true;
-			return ProcessCommandUtil.getValidDescriptor(obj, activity, TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory()) == null;
-		} else {
-			return false;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessTaskFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessTaskFilter.java
deleted file mode 100644
index 808c692..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessTaskFilter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.command.ProcessCommandUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Filters {@link Process}'s {@link Task} within {@link MethodConfiguration}
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class VariabilityProcessTaskFilter extends ProcessTaskFilter {
-
-	Activity activity = null;
-
-	public VariabilityProcessTaskFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName, Activity activity) {
-		super(config, viewer, tabName);
-		this.activity = activity;
-	}
-
-	public boolean childAccept(Object obj) {
-		if (super.childAccept(obj)) {
-//			if (ProcessUtil.getVariabilityElement(this.activity).contains(obj)) {
-//				return false;
-//			} else
-//				return true;
-			return ProcessCommandUtil.getValidDescriptor(obj, activity, TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory()) == null;
-		} else {
-			return false;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessWorkProductFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessWorkProductFilter.java
deleted file mode 100644
index e42c2bb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/VariabilityProcessWorkProductFilter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.command.ProcessCommandUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.jface.viewers.TableViewer;
-
-
-/**
- * Filters {@link Process}'s {@link WorkProduct} within {@link MethodConfiguration}
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class VariabilityProcessWorkProductFilter extends
-		ProcessWorkProductFilter {
-
-	Activity activity = null;
-
-	public VariabilityProcessWorkProductFilter(MethodConfiguration config,
-			TableViewer viewer, String tabName, Activity activity) {
-		super(config, viewer, tabName);
-		this.activity = activity;
-	}
-
-	public boolean childAccept(Object obj) {
-		if (super.childAccept(obj)) {
-//			if (ProcessUtil.getVariabilityElement(this.activity).contains(obj)) {
-//				return false;
-//			} else
-//				return true;
-			return ProcessCommandUtil.getValidDescriptor(obj, activity, TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory()) == null;
-		} else {
-			return false;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/WorkProductFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/WorkProductFilter.java
deleted file mode 100644
index fd62136..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/WorkProductFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.filters;
-
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * Filters {@link WorkProduct} based on search pattern
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class WorkProductFilter extends ContentFilter {
-
-	protected boolean childAccept(Object obj) {
-		if (obj instanceof WorkProduct) {
-			return true;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/package.html
deleted file mode 100644
index a98d475..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides filters for the method and process elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/AssociationFormPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/AssociationFormPage.java
deleted file mode 100644
index 225991a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/AssociationFormPage.java
+++ /dev/null
@@ -1,1419 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewFindElementAction;
-import org.eclipse.epf.authoring.ui.dialogs.ContentElementsOrderDialog;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.util.EditorsContextHelper;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.library.util.LibraryManager;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-
-
-/**
- * The base class for all Association type form pages in the Method editors.
- * 
- * @author Jeff Hardy
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class AssociationFormPage extends BaseFormPage implements IMenuListener {
-
-	protected static final String PACKAGE_PREFIX = "AuthoringUI_"; //$NON-NLS-1$	
-
-	protected IStructuredContentProvider contentProviderSelected;
-
-	protected ILabelProvider labelProviderSelected = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getColumnText(Object object, int columnIndex) {
-			return TngUtil.getLabelWithPath(object);
-		}
-	};
-
-	protected IStructuredContentProvider contentProviderSelected2;
-
-	protected ILabelProvider labelProviderSelected2 = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getColumnText(Object object, int columnIndex) {
-			return TngUtil.getLabelWithPath(object);
-		}
-	};
-
-	protected IStructuredContentProvider contentProviderSelected3;
-
-	protected ILabelProvider labelProviderSelected3 = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getColumnText(Object object, int columnIndex) {
-			return TngUtil.getLabelWithPath(object);
-		}
-	};
-
-	protected Section aSection;
-
-	protected Composite aComposite;
-
-	protected TableViewer viewer_selected, viewer_selected2, viewer_selected3;
-
-	protected Table ctrl_selected, ctrl_selected2, ctrl_selected3;
-
-	protected Button ctrl_add, ctrl_remove, ctrl_add2, ctrl_remove2, ctrl_add3,
-			ctrl_remove3;
-
-	protected Button ctrl_up1, ctrl_down1, ctrl_up2, ctrl_down2, ctrl_up3,
-			ctrl_down3;
-
-	protected Text ctrl_briefDesc;
-
-	protected Button ctrl_select, ctrl_clear;
-
-	protected ArrayList usedCategories = new ArrayList();
-
-	protected Label label_Category, label_Category2, label_Category3;
-
-	private boolean useCategory1 = true;
-
-	private boolean useCategory2 = true;
-
-	private boolean useCategory3 = true;
-
-	private boolean allowChange1 = true;
-
-	private boolean allowChange2 = true;
-
-	private boolean allowChange3 = true;
-
-	private boolean isUpAndDownButtonsRequired1 = false;
-
-	private boolean isUpAndDownButtonsRequired2 = false;
-
-	private boolean isUpAndDownButtonsRequired3 = false;
-
-	private boolean categoryIsSingleSelection1 = false;
-
-	private boolean categoryIsSingleSelection2 = false;
-
-	private boolean categoryIsSingleSelection3 = false;
-
-	private LibraryViewFindElementAction libraryViewFindElementAction;
-	// strings used in the form
-	protected String formNamePrefix = "Form prefix"; //$NON-NLS-1$
-
-	protected String sectionName = "Section name"; //$NON-NLS-1$
-
-	protected String sectionDesc = "Section description"; //$NON-NLS-1$
-
-	protected String selectedLabel = "Selected Label 1"; //$NON-NLS-1$
-
-	protected String selectedLabel2 = "Selected Label 2"; //$NON-NLS-1$
-
-	protected String selectedLabel3 = "Selected Label 3"; //$NON-NLS-1$
-
-	// Data model methods.
-	protected void addItemsToModel1(ArrayList newItems) {
-	}
-
-	protected void addItemsToModel2(ArrayList newItems) {
-	}
-
-	protected void addItemsToModel3(ArrayList newItems) {
-	}
-
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-	}
-
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-	}
-
-	protected void removeItemsFromModel3(ArrayList rmItems) {
-	}
-
-	protected void moveUpItemsInSelectedItems1(ArrayList moveUpItems) {
-		if (!moveUpItems.isEmpty()) {
-			EStructuralFeature feature = getContentCategoryOrderFeature();
-			ContentElementOrderList orderList = getContentElementOrderList();
-			String[] path = getModelStructurePath();
-			if (feature != null && orderList != null && path != null) {
-				MoveInCategoryCommand cmd = new MoveInCategoryCommand(
-						(ContentCategory) contentElement, moveUpItems, orderList,
-						feature, path, 1);
-				getActionManager().execute(cmd);
-			}
-		}
-	}
-
-	protected void moveDownItemsInSelectedItems1(ArrayList moveDownItems) {
-		if (!moveDownItems.isEmpty()) {
-			EStructuralFeature feature = getContentCategoryOrderFeature();
-			ContentElementOrderList orderList = getContentElementOrderList();
-			String[] path = getModelStructurePath();
-			if (feature != null && orderList != null && path != null) {
-				MoveInCategoryCommand cmd = new MoveInCategoryCommand(
-						(ContentCategory) contentElement, moveDownItems, orderList,
-						feature, path, 0);
-				getActionManager().execute(cmd);
-			}
-		}
-	}
-	
-	// Viewer methods.
-	protected void initContentProviderSelected() {
-	}
-
-	protected void initContentProviderSelected2() {
-	}
-
-	protected void initContentProviderSelected3() {
-	}
-
-	protected ContentElementOrderList getContentElementOrderList() {
-		return null;
-	}
-	
-	protected String[] getModelStructurePath() {
-		return null;
-	}
-	
-	protected Object getContentElement() {
-		return null;
-	}
-
-	protected String getTabString() {
-		return "contentelement";} //$NON-NLS-1$
-
-	protected String getTabString2() {
-		return getTabString();
-	}
-
-	protected String getTabString3() {
-		return getTabString();
-	}
-
-	/*
-	 * getFilterTypes should be override to pass types.
-	 */
-	protected String[] getFilterTypes(){
-		return null;
-	}
-	/*
-	 * getFilterTypes should be override to pass types.
-	 */
-	protected String[] getFilterTypes2(){
-		return null;
-	}
-	/*
-	 * getFilterTypes should be override to pass types.
-	 */
-	protected String[] getFilterTypes3(){
-		return null;
-	}
-
-	protected MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-	// Filter info.
-	protected IFilter filter, filter2, filter3;
-
-	protected IFilter getFilter() {
-		return filter;
-	}
-
-	protected IFilter getFilter2() {
-		return filter;
-	}
-
-	protected IFilter getFilter3() {
-		return filter;
-	}
-
-	// Ordering of contributed categorized elements in custom
-	// categories
-	protected Button ctrl_ordering;
-
-	protected ComboViewer viewer_sort1;
-	
-	protected IStructuredContentProvider contentProviderSort = new AdapterFactoryContentProvider(
-			TngAdapterFactory.INSTANCE.getNavigatorView_ComposedAdapterFactory()) {
-		public Object[] getElements(Object object) {
-			List<String> sortTypesList = CategorySortHelper.getCategorySortTypes();
-			return sortTypesList.toArray();
-		}
-	};
-
-	protected ILabelProvider labelProviderSort = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getText(Object object) {
-			if (object instanceof String) {
-				String str = ((String)object);
-				return CategorySortHelper.getSortTypeDisplayName(str);
-			}
-			return null;
-		}
-	};
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public AssociationFormPage(FormEditor editor, String id, String name) {
-		super(editor, id, name);
-		this.editorTabName = name;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.BaseFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-
-		UIHelper.setFormText(form, contentElement);
-		
-		// Create a section.
-		aSection = toolkit.createSection(form.getBody(), Section.TITLE_BAR
-				| Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		aSection.setLayoutData(td);
-		aSection.setText(getSectionName());
-		aSection.setDescription(getSectionDescription());
-		aSection.setLayout(new GridLayout());
-
-		aComposite = toolkit.createComposite(aSection);
-		aComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		aComposite.setLayout(new GridLayout(2, false));
-		aSection.setClient(aComposite);
-
-		int numTablesUsed = 0;
-
-		if (useCategory1)
-			numTablesUsed++;
-		if (useCategory2)
-			numTablesUsed++;
-		if (useCategory3)
-			numTablesUsed++;
-
-		if (useCategory1) {
-			Composite pane1 = createComposite(toolkit, aComposite, 1);
-			label_Category = createLabel(toolkit, pane1, getSelectedLabel());
-
-			if (categoryIsSingleSelection1)
-				ctrl_selected = createTable(toolkit, pane1, SINGLE_ROW);
-			else {
-				if (numTablesUsed == 1)
-					ctrl_selected = createTable(toolkit, pane1, LARGE_SIZE);
-				else if (numTablesUsed == 2)
-					ctrl_selected = createTable(toolkit, pane1, MEDIUM_SIZE);
-				else
-					ctrl_selected = createTable(toolkit, pane1, SMALL_SIZE);
-			}
-
-			libraryViewFindElementAction = new LibraryViewFindElementAction(AuthoringUIResources.actionLabel_findElementInLibNav); 
-			viewer_selected = new TableViewer(ctrl_selected);
-			viewer_selected.setLabelProvider(labelProviderSelected);
-			initContentProviderSelected();
-			viewer_selected.setInput(contentElement);
-			if (!isUpAndDownButtonsRequired1)
-				viewer_selected.setSorter(new ViewerSorter());
-
-			createContextMenuFor(viewer_selected);
-			toolkit.paintBordersFor(pane1);
-
-			Composite pane2 = createCompositeForButtons(toolkit, aComposite);
-			if (allowChange1) {
-				ctrl_add = createButton(toolkit, pane2,
-						(categoryIsSingleSelection1) ? SELECT_BUTTON
-								: ADD_BUTTON);
-				ctrl_remove = createButton(toolkit, pane2,
-						(categoryIsSingleSelection1) ? CLEAR_BUTTON
-								: REMOVE_BUTTON);
-
-				if (isUpAndDownButtonsRequired1) {
-					ctrl_up1 = createButton(toolkit, pane2, UP_BUTTON);
-					ctrl_down1 = createButton(toolkit, pane2, DOWN_BUTTON);
-					ctrl_ordering = createButton(toolkit, pane2, ORDER_BUTTON);
-					ctrl_ordering.setEnabled(true);
-					Combo ctrl_sort1 = createComboWithLabel(toolkit, pane2, LibraryEditResources.SortType_Label);
-					viewer_sort1 = new ComboViewer(ctrl_sort1);
-					viewer_sort1.setContentProvider(contentProviderSort);
-					viewer_sort1.setLabelProvider(labelProviderSort);
-					viewer_sort1.setInput(contentElement);
-					// set initial selection
-					String sortType = CategorySortHelper.getCategorySortValue(contentElement);
-					viewer_sort1.setSelection(new StructuredSelection(sortType), true);
-
-					// ctrl_ordering.setLayoutData(new
-					// GridData(GridData.FILL_HORIZONTAL));
-
-				}
-			}
-			toolkit.paintBordersFor(pane2);
-		}
-
-		if (useCategory2) {
-			Composite pane3 = createComposite(toolkit, aComposite, 1);
-			label_Category2 = createLabel(toolkit, pane3, getSelectedLabel2());
-			if (categoryIsSingleSelection2)
-				ctrl_selected2 = createTable(toolkit, pane3, SINGLE_ROW);
-			else {
-				if (numTablesUsed == 1)
-					ctrl_selected2 = createTable(toolkit, pane3, LARGE_SIZE);
-				else if (numTablesUsed == 2)
-					ctrl_selected2 = createTable(toolkit, pane3, MEDIUM_SIZE);
-				else
-					ctrl_selected2 = createTable(toolkit, pane3, SMALL_SIZE);
-			}
-			viewer_selected2 = new TableViewer(ctrl_selected2);
-			viewer_selected2.setLabelProvider(labelProviderSelected2);
-			initContentProviderSelected2();
-			viewer_selected2.setInput(contentElement);
-			viewer_selected2.setSorter(new ViewerSorter());
-			createContextMenuFor(viewer_selected2);
-
-			toolkit.paintBordersFor(pane3);
-
-			Composite pane4 = createCompositeForButtons(toolkit, aComposite);
-			if (allowChange2) {
-				ctrl_add2 = createButton(toolkit, pane4, ADD_BUTTON);
-				ctrl_remove2 = createButton(toolkit, pane4, REMOVE_BUTTON);
-
-				if (isUpAndDownButtonsRequired2) {
-					ctrl_up2 = createButton(toolkit, pane4, UP_BUTTON);
-					ctrl_down2 = createButton(toolkit, pane4, DOWN_BUTTON);
-				}
-			}
-			toolkit.paintBordersFor(pane4);
-		}
-
-		if (useCategory3) {
-			Composite pane5 = createComposite(toolkit, aComposite, 1);
-			label_Category3 = createLabel(toolkit, pane5, getSelectedLabel3());
-			if (categoryIsSingleSelection3)
-				ctrl_selected3 = createTable(toolkit, pane5, SINGLE_ROW);
-			else {
-				if (numTablesUsed == 1)
-					ctrl_selected3 = createTable(toolkit, pane5, LARGE_SIZE);
-				else if (numTablesUsed == 2)
-					ctrl_selected3 = createTable(toolkit, pane5, MEDIUM_SIZE);
-				else
-					ctrl_selected3 = createTable(toolkit, pane5, SMALL_SIZE);
-			}
-			viewer_selected3 = new TableViewer(ctrl_selected3);
-			viewer_selected3.setLabelProvider(labelProviderSelected3);
-			initContentProviderSelected3();
-			viewer_selected3.setInput(contentElement);
-			viewer_selected3.setSorter(new ViewerSorter());
-			createContextMenuFor(viewer_selected3);
-
-			toolkit.paintBordersFor(pane5);
-
-			Composite pane6 = createCompositeForButtons(toolkit, aComposite);
-			if (allowChange3) {
-				ctrl_add3 = createButton(toolkit, pane6, ADD_BUTTON);
-				ctrl_remove3 = createButton(toolkit, pane6, REMOVE_BUTTON);
-
-				if (isUpAndDownButtonsRequired3) {
-					ctrl_up3 = createButton(toolkit, pane6, UP_BUTTON);
-					ctrl_down3 = createButton(toolkit, pane6, DOWN_BUTTON);
-				}
-			}
-			toolkit.paintBordersFor(pane6);
-		}
-
-		setEnabledAddButtons(true);
-
-		setWidgetWidths();
-		Composite pane7 = createComposite(toolkit, aComposite,
-				GridData.FILL_BOTH, 1, 1, 1);
-		ctrl_briefDesc = createTextEditWithLabelLarge(
-				toolkit,
-				pane7,
-				AuthoringUIResources.AssociationFormPage_BriefDescriptionLabel); 
-		ctrl_briefDesc.setEditable(false);
-		toolkit.paintBordersFor(pane7);
-		toolkit.paintBordersFor(aComposite);
-
-		addListeners();
-
-		setContextHelp();
-
-	}
-
-	protected void setEnabledAddButtons(boolean value) {
-		if (allowChange1)
-			ctrl_add.setEnabled(value);
-		if (useCategory2 && allowChange2)
-			ctrl_add2.setEnabled(value);
-		if (useCategory3 && allowChange3)
-			ctrl_add3.setEnabled(value);
-	}
-
-	protected void setEnabledRemoveButtons(boolean value) {
-		if (allowChange1)
-			ctrl_remove.setEnabled(value);
-		if (useCategory2 && allowChange2)
-			ctrl_remove2.setEnabled(value);
-		if (useCategory3 && allowChange3)
-			ctrl_remove3.setEnabled(value);
-	}
-
-	protected void disableButtonsAndDeselectTables() {
-		// setEnabledAddButtons(false);
-		setEnabledRemoveButtons(false);
-		viewer_selected.setSelection(null, true);
-		if (useCategory2)
-			viewer_selected2.setSelection(null, true);
-		if (useCategory3)
-			viewer_selected3.setSelection(null, true);
-		ctrl_briefDesc.setText(""); //$NON-NLS-1$
-	}
-
-	protected void refreshViewers() {
-
-		viewer_selected.refresh();
-		// Check if existing element is contributor/contributes for standard
-		// categories
-		// should not shown in the tableviewer.
-		// Commented below to allow contributors to display in the list box
-		// if(contentElement instanceof ContentCategory){
-		// if(!(contentElement instanceof CustomCategory)){
-		// Object[] elements =
-		// contentProviderSelected.getElements(contentElement);
-		// for(int i=0; i<elements.length; i++){
-		// Object element = elements[i];
-		// if(element instanceof ContentElement){
-		// if(UIHelper.isContributor((ContentElement)element)){
-		// viewer_selected.remove(element);
-		// }
-		// }
-		// }
-		// }
-		// }
-
-		if (useCategory2) {
-			viewer_selected2.refresh();
-			// if(contentElement instanceof ContentCategory){
-			// Object[] elements =
-			// contentProviderSelected2.getElements(contentElement);
-			// for(int i=0; i<elements.length; i++){
-			// Object element = elements[i];
-			// if(element instanceof ContentElement){
-			// if(UIHelper.isContributor((ContentElement)element)){
-			// viewer_selected2.remove(element);
-			// }
-			// }
-			// }
-			// }
-
-		}
-		if (useCategory3) {
-			viewer_selected3.refresh();
-			// if(contentElement instanceof ContentCategory){
-			// Object[] elements =
-			// contentProviderSelected3.getElements(contentElement);
-			// for(int i=0; i<elements.length; i++){
-			// Object element = elements[i];
-			// if(element instanceof ContentElement){
-			// if(UIHelper.isContributor((ContentElement)element)){
-			// viewer_selected3.remove(element);
-			// }
-			// }
-			// }
-			// }
-		}
-		ctrl_briefDesc.setText(""); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 */
-	private void addListeners() {
-		form.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event e) {
-				if (form != null && !form.isDisposed()) {
-					UIHelper.setFormText(form, contentElement);
-				}
-				refreshViewers();
-				if (TngUtil.isLocked(contentElement)) {
-					enableControls(false);
-				} else {
-					enableControls(true);
-				}
-			}
-		});
-		
-		form.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				if (form != null && !form.isDisposed()) {
-					UIHelper.setFormText(form, contentElement);
-				}
-				refreshViewers();
-				if (TngUtil.isLocked(contentElement)) {
-					enableControls(false);
-				} else {
-					enableControls(true);
-				}
-			}
-		});
-
-		if (useCategory1) {
-			// Add focus listener on primary tasks list
-			ctrl_selected.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					disableButtonsAndDeselectTables();
-
-					IStructuredSelection selection = (IStructuredSelection) viewer_selected
-							.getSelection();
-					if (allowChange1 && selection.size() > 0
-							&& !TngUtil.isLocked(contentElement)) {
-						ctrl_remove.setEnabled(true);
-					}
-				}
-			});
-
-			viewer_selected
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) viewer_selected
-									.getSelection();
-							libraryViewFindElementAction.selectionChanged(event);
-							if (allowChange1 && selection.size() > 0
-									&& !TngUtil.isLocked(contentElement)) {
-								ctrl_remove.setEnabled(true);
-							}
-							enableUpDownButtons1();
-
-							if (selection.size() == 1) {
-								String desc = ((MethodElement) selection
-										.getFirstElement())
-										.getBriefDescription();
-								if (desc == null) {
-									desc = ""; //$NON-NLS-1$
-								}
-								ctrl_briefDesc.setText(desc);
-							} else if (selection.size() > 1) {
-								ctrl_briefDesc
-										.setText(getMultipleSelectDescription(selection
-												.size()));
-							}
-						}
-
-					});
-
-			if (allowChange1) {
-				ctrl_add.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						TableItem[] items = viewer_selected.getTable()
-								.getItems();
-						List selectedList = new ArrayList();
-						for (int i = 0; i < items.length; i++) {
-							selectedList.add(items[i].getData());
-						}
-
-						if (getFilter() != null) {
-							ItemsFilterDialog fd = new ItemsFilterDialog(
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getShell(), getFilter(),
-									getContentElement(), getTabString());
-							fd.setBlockOnOpen(true);
-							fd.setTitle(getTabString());
-							if(categoryIsSingleSelection1){
-								fd.setViewerSelectionSingle(true);
-							}
-							fd.setExistingElements(selectedList);
-							if(getFilterTypes() != null){
-								fd.setTypes(getFilterTypes());
-							}
-							fd.open();
-							addItemsToModel1(fd.getSelectedItems());
-						}
-						// viewer_selected.refresh();
-						refreshViewers();
-
-					}
-				});
-
-				ctrl_remove.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IStructuredSelection selection = (IStructuredSelection) viewer_selected
-								.getSelection();
-						if (selection.size() > 0) {
-							// update the model
-							ArrayList rmItems = new ArrayList();
-							rmItems.addAll(selection.toList());
-							removeItemsFromModel1(rmItems);
-							// viewer_selected.refresh();
-							refreshViewers();
-							// clear the selection
-							viewer_selected.setSelection(null, true);
-							ctrl_briefDesc.setText(""); //$NON-NLS-1$
-						}
-						ctrl_remove.setEnabled(false);
-					}
-				});
-			}
-		}
-
-		if (useCategory2) {
-			// Add focus listener on primary tasks list
-			ctrl_selected2.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					disableButtonsAndDeselectTables();
-
-					IStructuredSelection selection = (IStructuredSelection) viewer_selected2
-							.getSelection();
-					if (allowChange2 && selection.size() > 0
-							&& !TngUtil.isLocked(contentElement)) {
-						ctrl_remove2.setEnabled(true);
-					}
-				}
-			});
-
-			viewer_selected2
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) viewer_selected2
-									.getSelection();
-							libraryViewFindElementAction.selectionChanged(event);
-							if (allowChange2 && selection.size() > 0
-									&& !TngUtil.isLocked(contentElement)) {
-								ctrl_remove2.setEnabled(true);
-							}
-							if (selection.size() == 1) {
-								String desc = ((MethodElement) selection
-										.getFirstElement())
-										.getBriefDescription();
-								if (desc == null) {
-									desc = ""; //$NON-NLS-1$
-								}
-								ctrl_briefDesc.setText(desc);
-							} else if (selection.size() > 1) {
-								ctrl_briefDesc
-										.setText(getMultipleSelectDescription(selection
-												.size()));
-							}
-						}
-
-					});
-
-			if (allowChange2) {
-				ctrl_add2.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						TableItem[] items = viewer_selected2.getTable()
-								.getItems();
-						List selectedList = new ArrayList();
-						for (int i = 0; i < items.length; i++) {
-							selectedList.add(items[i].getData());
-						}
-						if (getFilter2() != null) {
-							ItemsFilterDialog fd = new ItemsFilterDialog(
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getShell(), getFilter2(),
-									getContentElement(), getTabString2());
-							fd.setBlockOnOpen(true);
-							fd.setTitle(getTabString2());
-							fd.setExistingElements(selectedList);
-							fd.open();
-							addItemsToModel2(fd.getSelectedItems());
-						}
-						viewer_selected2.refresh();
-					}
-				});
-
-				ctrl_remove2.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IStructuredSelection selection = (IStructuredSelection) viewer_selected2
-								.getSelection();
-						if (selection.size() > 0) {
-							// update the model
-							ArrayList rmItems = new ArrayList();
-							rmItems.addAll(selection.toList());
-							removeItemsFromModel2(rmItems);
-							viewer_selected2.refresh();
-
-							// clear the selection
-							viewer_selected2.setSelection(null, true);
-							ctrl_briefDesc.setText(""); //$NON-NLS-1$
-						}
-						ctrl_remove2.setEnabled(false);
-					}
-				});
-			}
-		}
-		if (useCategory3) {
-			// Add focus listener on primary tasks list
-			ctrl_selected3.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					disableButtonsAndDeselectTables();
-
-					IStructuredSelection selection = (IStructuredSelection) viewer_selected3
-							.getSelection();
-					if (allowChange3 && selection.size() > 0
-							&& !TngUtil.isLocked(contentElement)) {
-						ctrl_remove3.setEnabled(true);
-					}
-				}
-			});
-
-			viewer_selected3
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) viewer_selected3
-									.getSelection();
-							libraryViewFindElementAction.selectionChanged(event);
-							if (allowChange3 && selection.size() > 0
-									&& !TngUtil.isLocked(contentElement)) {
-								ctrl_remove3.setEnabled(true);
-							}
-							if (selection.size() == 1) {
-								String desc = ((MethodElement) selection
-										.getFirstElement())
-										.getBriefDescription();
-								if (desc == null) {
-									desc = ""; //$NON-NLS-1$
-								}
-								ctrl_briefDesc.setText(desc);
-							} else if (selection.size() > 1) {
-								ctrl_briefDesc
-										.setText(getMultipleSelectDescription(selection
-												.size()));
-							}
-						}
-
-					});
-
-			if (allowChange3) {
-				ctrl_add3.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						TableItem[] items = viewer_selected3.getTable()
-								.getItems();
-						List selectedList = new ArrayList();
-						for (int i = 0; i < items.length; i++) {
-							selectedList.add(items[i].getData());
-						}
-						if (getFilter3() != null) {
-							ItemsFilterDialog fd = new ItemsFilterDialog(
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getShell(), getFilter3(),
-									getContentElement(), getTabString3());
-							fd.setBlockOnOpen(true);
-							fd.setTitle(getTabString3());
-							fd.setExistingElements(selectedList);
-							fd.open();
-							addItemsToModel3(fd.getSelectedItems());
-						}
-						viewer_selected3.refresh();
-
-					}
-				});
-
-				ctrl_remove3.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IStructuredSelection selection = (IStructuredSelection) viewer_selected3
-								.getSelection();
-						if (selection.size() > 0) {
-							// update the model
-							ArrayList rmItems = new ArrayList();
-							rmItems.addAll(selection.toList());
-							removeItemsFromModel3(rmItems);
-							viewer_selected3.refresh();
-
-							// clear the selection
-							viewer_selected3.setSelection(null, true);
-							ctrl_briefDesc.setText(""); //$NON-NLS-1$
-						}
-						ctrl_remove3.setEnabled(false);
-					}
-				});
-			}
-		}
-
-		if (allowChange1 && isUpAndDownButtonsRequired1) {
-			ctrl_up1.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_selected
-							.getSelection();
-					if (selection.size() > 0) {
-						ArrayList moveUpItems = new ArrayList();
-						moveUpItems.addAll(selection.toList());
-						moveUpItemsInSelectedItems1(moveUpItems);
-					}
-					// viewer_selected.refresh();
-					refreshViewers();
-					enableUpDownButtons1();
-				}
-			});
-
-			ctrl_down1.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_selected
-							.getSelection();
-					if (selection.size() > 0) {
-						ArrayList moveDownItems = new ArrayList();
-						moveDownItems.addAll(selection.toList());
-						moveDownItemsInSelectedItems1(moveDownItems);
-					}
-					// viewer_selected.refresh();
-					refreshViewers();
-					enableUpDownButtons1();
-				}
-			});
-
-			ctrl_ordering.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					ContentElementsOrderDialog dlg = new ContentElementsOrderDialog(
-							Display.getCurrent().getActiveShell(),
-							contentElement, getActionManager());
-					dlg.setFeature(getContentCategoryOrderFeature());
-					dlg.open();
-					if (allowChange1 && isUpAndDownButtonsRequired1) {
-						String sortType = CategorySortHelper.getCategorySortValue(contentElement);
-						viewer_sort1.setSelection(new StructuredSelection(sortType), true);
-						viewer_sort1.refresh();
-					}
-				}
-			});
-			
-			viewer_sort1.addSelectionChangedListener(new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_sort1
-							.getSelection();
-					String sortType = (String)selection.getFirstElement();
-					if (!CategorySortHelper.getCategorySortValue(contentElement).equals(sortType)) {
-						MethodElementProperty prop = CategorySortHelper.getCategorySortProperty(contentElement);
-						
-						if (prop == null) {			
-							prop = CategorySortHelper.createNewSortProperty(sortType);
-							getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getMethodElement_MethodElementProperty(),
-									prop, -1);
-						}
-						else {
-							getActionManager().doAction(IActionManager.SET,
-								prop,
-								UmaPackage.eINSTANCE
-										.getMethodElementProperty_Value(),
-										sortType, -1);
-						}
-						LibraryView.getView().refreshViews();
-					}
-					refreshViewers();
-					enableUpDownButtons1();
-				}
-			});
-		}
-	}
-
-	protected EStructuralFeature getContentCategoryOrderFeature() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	protected void enableControls(boolean editable) {
-		if (useCategory1) {
-			if (allowChange1) {
-				ctrl_add.setEnabled(editable);
-				IStructuredSelection selection = (IStructuredSelection) viewer_selected
-						.getSelection();
-				if (allowChange1 && selection.size() > 0
-						&& !TngUtil.isLocked(contentElement)) {
-					ctrl_remove.setEnabled(true);
-				} else {
-					ctrl_remove.setEnabled(false);
-
-				}
-			}
-		}
-
-		if (useCategory2) {
-			if (allowChange2) {
-				ctrl_add2.setEnabled(editable);
-				IStructuredSelection selection = (IStructuredSelection) viewer_selected2
-						.getSelection();
-				if (allowChange2 && selection.size() > 0
-						&& !TngUtil.isLocked(contentElement)) {
-					ctrl_remove2.setEnabled(true);
-				} else {
-					ctrl_remove2.setEnabled(false);
-
-				}
-			}
-		}
-		if (useCategory3) {
-			if (allowChange3) {
-				ctrl_add3.setEnabled(editable);
-				IStructuredSelection selection = (IStructuredSelection) viewer_selected3
-						.getSelection();
-				if (allowChange3 && selection.size() > 0
-						&& !TngUtil.isLocked(contentElement)) {
-					ctrl_remove3.setEnabled(true);
-				} else {
-					ctrl_remove3.setEnabled(false);
-
-				}
-			}
-		}
-		enableUpDownButtons1();
-		if (isUpAndDownButtonsRequired1) {
-			if (!TngUtil.isLocked(contentElement)) {
-				viewer_sort1.getCombo().setEnabled(true);
-			} else {
-				viewer_sort1.getCombo().setEnabled(false);
-			}
-		}
-	}
-
-	void setDirty(boolean b) {
-		// Phong (03/07/2005): the dirty state of the editor is already taken
-		// care in MethodElementEditor, transparent from user
-		// interaction. No firePropertyChange(PROP_DIRTY) should be called
-		// somewhere else.
-		// NOTE: unnecessary calls to firePropertyChange(PROP_DIRTY) will cause
-		// performance problem.
-		// firePropertyChange(PROP_DIRTY);
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-		if (usedCategories.size() > 0)
-			LibraryManager.getInstance().releaseCategories(contentElement,
-					usedCategories);
-
-		if (labelProviderSelected != null) {
-			labelProviderSelected.dispose();
-		}
-		if (labelProviderSelected2 != null) {
-			labelProviderSelected2.dispose();
-		}
-		if (labelProviderSelected3 != null) {
-			labelProviderSelected3.dispose();
-		}
-		super.dispose();
-	}
-
-	/**
-	 * Returns the section name.
-	 */
-	protected String getSectionName() {
-		return null;
-	}
-
-	/**
-	 * Returns the section description.
-	 */
-	protected String getSectionDescription() {
-		// TVT issue single quote 
-		// Format should be done only for CategoryGuidancePage, AuthoringUI.categoryGuidancesPage.sectionDescription key 
-		// have has replacement variable in its value. For more information check NLS_MESSAGEFORMAT_VAR
-	   /* 
-	    * NLS_MESSAGEFORMAT_VAR
-	    Strings which contain replacement variables are processed by the  
-	    MessageFormat class (single quote must be coded as 2 consecutive single  
-	    quotes ''). Strings which do NOT contain replacement variables are NOT   
-	    processed by the MessageFormat class (single quote must be coded as 1
-		single quote ').*/
-		
-		if (methodElement instanceof ContentElement
-				&& "categoryGuidancesPage".equalsIgnoreCase(getId())) { //$NON-NLS-1$
-			return NLS.bind(getId() + "_sectionDescription", LibraryUIText.getUITextLower(methodElement)); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the first selected lable.
-	 */
-	protected String getSelectedLabel() {
-		// if (methodElement instanceof ContentCategory) {
-		// return AuthoringUIResources.formatString(PACKAGE_PREFIX + getId() +
-		// ".selectedLabel", LibraryUIText.getUIText(methodElement));
-		// //$NON-NLS-1$
-		// }
-		return null;
-	}
-
-	/**
-	 * Returns the second selected lable.
-	 */
-	protected String getSelectedLabel2() {
-		return null;
-	}
-
-	/**
-	 * Returns the third selected lable.
-	 */
-	protected String getSelectedLabel3() {
-		return null;
-	}
-
-	/**
-	 * Returns the multiple section description.
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return getMultipleSelectDescription(count, getMultipleSelectDescriptionString()); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the multiple section description.
-	 */
-	protected String getMultipleSelectDescription(int count, String message) {
-		return AuthoringUIResources.bind(message, new Integer(count));
-	}
-	
-	protected String getMultipleSelectDescriptionString() {
-		return AuthoringUIResources.roleCategoriesPage_multipleSelectDescription;
-	}
-
-	/**
-	 * Set description for section
-	 * @param sectionDesc
-	 * 			Description
-	 */
-	public void setSectionDesc(String sectionDesc) {
-		this.sectionDesc = sectionDesc;
-	}
-
-	/**
-	 * Set first label
-	 * @param selectedLabel1
-	 */
-	public void setSelectedLabel(String selectedLabel1) {
-		this.selectedLabel = selectedLabel1;
-	}
-
-	/**
-	 * Set second label
-	 * @param selectedLabel2
-	 */
-	public void setSelectedLabel2(String selectedLabel2) {
-		this.selectedLabel2 = selectedLabel2;
-	}
-
-	/**
-	 * Set third label
-	 * @param selectedLabel3
-	 */
-	public void setSelectedLabel3(String selectedLabel3) {
-		this.selectedLabel3 = selectedLabel3;
-	}
-
-	/**
-	 * Set an option for the first category to be either single selection or multiple selection
-	 * @param categoryIsSingleSelection1
-	 */
-	public void setCategoryIsSingleSelection1(boolean categoryIsSingleSelection1) {
-		this.categoryIsSingleSelection1 = categoryIsSingleSelection1;
-	}
-
-	/**
-	 * Set an option for the second category to be either single selection or multiple selection
-	 * @param categoryIsSingleSelection2
-	 */
-	public void setCategoryIsSingleSelection2(boolean categoryIsSingleSelection2) {
-		this.categoryIsSingleSelection2 = categoryIsSingleSelection2;
-	}
-
-	/**
-	 * Set an option for the third category to be either single selection or multiple selection
-	 * @param categoryIsSingleSelection3
-	 */
-	public void setCategoryIsSingleSelection3(boolean categoryIsSingleSelection3) {
-		this.categoryIsSingleSelection3 = categoryIsSingleSelection3;
-	}
-
-	/**
-	 * Set an option to use first category
-	 * @param useCategory1
-	 */
-	public void setUseCategory1(boolean useCategory1) {
-		this.useCategory1 = useCategory1;
-	}
-
-	/**
-	 * Set an option to use second category
-	 * @param useCategory2
-	 */
-	public void setUseCategory2(boolean useCategory2) {
-		this.useCategory2 = useCategory2;
-	}
-
-	
-	/**
-	 * Set an option to use third category
-	 * @param useCategory3
-	 */
-	public void setUseCategory3(boolean useCategory3) {
-		this.useCategory3 = useCategory3;
-	}
-
-	/**
-	 * Set an option to allow changes for first table in UI
-	 * @param allowChange1
-	 */
-	public void setAllowChange1(boolean allowChange1) {
-		this.allowChange1 = allowChange1;
-	}
-
-	/**
-	 * Set an option to allow changes for the second table in UI
-	 * @param allowChange2
-	 */
-	public void setAllowChange2(boolean allowChange2) {
-		this.allowChange2 = allowChange2;
-	}
-
-	/**
-	 * Set an option to allow changes for third table.
-	 * @param allowChange3
-	 */
-	public void setAllowChange3(boolean allowChange3) {
-		this.allowChange3 = allowChange3;
-	}
-
-	/**
-	 * Set an option to show first set of up/down buttons
-	 * @param isUpAndDownButtonsRequired1
-	 */
-	public void setIsUpAndDownButtonsRequired1(
-			boolean isUpAndDownButtonsRequired1) {
-		this.isUpAndDownButtonsRequired1 = isUpAndDownButtonsRequired1;
-	}
-
-	/**
-	 * Set an option to show second set of up/down buttons
-	 * @param isUpAndDownButtonsRequired2
-	 */
-	public void setIsUpAndDownButtonsRequired2(
-			boolean isUpAndDownButtonsRequired2) {
-		this.isUpAndDownButtonsRequired2 = isUpAndDownButtonsRequired2;
-	}
-
-	/**
-	 * Set an option to show third set of up/down buttons.
-	 * @param isUpAndDownButtonsRequired3
-	 */
-	public void setIsUpAndDownButtonsRequired3(
-			boolean isUpAndDownButtonsRequired3) {
-		this.isUpAndDownButtonsRequired3 = isUpAndDownButtonsRequired3;
-	}
-
-	// calculate widths for labels and tables, based on width of labels
-	protected void setWidgetWidths() {
-		int allCategoriesWidth = 0, categoryWidth = 0, category2Width = 0, category3Width = 0;
-		int largestWidth = 0;
-		// if (useCategory1) allCategoriesWidth =
-		// label_allCategories.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
-		if (useCategory1)
-			categoryWidth = label_Category
-					.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
-		if (useCategory2)
-			category2Width = label_Category2.computeSize(SWT.DEFAULT,
-					SWT.DEFAULT).x;
-		if (useCategory3)
-			category3Width = label_Category3.computeSize(SWT.DEFAULT,
-					SWT.DEFAULT).x;
-
-		if (useCategory1)
-			largestWidth = Math.max(allCategoriesWidth, categoryWidth);
-		if (useCategory2)
-			largestWidth = Math.max(largestWidth, category2Width);
-		if (useCategory3)
-			largestWidth = Math.max(largestWidth, category3Width);
-
-		if (useCategory1) {
-			// ((GridData)label_allCategories.getLayoutData()).widthHint =
-			// largestWidth;
-			// ((GridData)ctrl_allAvailable.getLayoutData()).widthHint =
-			// largestWidth;
-			((GridData) label_Category.getLayoutData()).widthHint = largestWidth;
-			((GridData) ctrl_selected.getLayoutData()).widthHint = largestWidth;
-		}
-		if (useCategory2) {
-			((GridData) label_Category2.getLayoutData()).widthHint = largestWidth;
-			((GridData) ctrl_selected2.getLayoutData()).widthHint = largestWidth;
-		}
-		if (useCategory3) {
-			((GridData) label_Category3.getLayoutData()).widthHint = largestWidth;
-			((GridData) ctrl_selected3.getLayoutData()).widthHint = largestWidth;
-		}
-	}
-
-	protected IActionManager getActionManager() {
-		FormEditor editor = getEditor();
-		if (editor instanceof MethodElementEditor) {
-			return ((MethodElementEditor) editor).getActionManager();
-		}
-		return null;
-	}
-
-	private void setContextHelp() {
-		// in the future, we should check the subclass type to set up a
-		// different
-		// context page for ech type of associations
-		EditorsContextHelper.setHelp(getPartControl(), getContentElement());
-	}
-	
-	/**
-	 * Create context menu for the given viewer
-	 * @param viewer
-	 */
-	public void createContextMenuFor(final StructuredViewer viewer) {
-		MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
-		contextMenu.add(new Separator(org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS));
-		contextMenu.setRemoveAllWhenShown(true);
-		contextMenu.addMenuListener(this);
-		Menu menu = contextMenu.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(contextMenu, viewer);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		menuManager.add(new Separator(org.eclipse.ui.IWorkbenchActionConstants.MB_ADDITIONS));
-		menuManager.add(new ActionContributionItem(libraryViewFindElementAction));
-	}
-	
-	protected void enableUpDownButtons1() {
-		if (ctrl_up1 != null) {
-			if (isShouldEnableUp1()) {
-				ctrl_up1.setEnabled(true);
-			} else {
-				ctrl_up1.setEnabled(false);
-			}
-		}
-		if (ctrl_down1 != null) {
-			if (isShouldEnableDown1()) {
-				ctrl_down1.setEnabled(true);
-			} else {
-				ctrl_down1.setEnabled(false);
-			}
-		}
-	}
-	
-	protected boolean isShouldEnableUp1() {
-		if (viewer_selected != null && contentElement != null) {
-			IStructuredSelection selection = (IStructuredSelection) viewer_selected
-				.getSelection();
-			if (isUpAndDownButtonsRequired1 &&
-					selection.size() == 1 &&
-					viewer_selected.getTable().getSelectionIndex() > 0 &&
-					!TngUtil.isLocked(contentElement) && 
-					CategorySortHelper.isManualCategorySort(contentElement)) {
-				return true;
-			}
-		} 
-		return false;
-	}
-	
-	protected boolean isShouldEnableDown1() {
-		IStructuredSelection selection = (IStructuredSelection) viewer_selected
-			.getSelection();
-		if (isUpAndDownButtonsRequired1 &&
-				selection.size() == 1 &&
-				(viewer_selected.getTable().getSelectionIndex() < viewer_selected
-					.getTable().getItemCount() - 1) &&
-				!TngUtil.isLocked(contentElement) &&
-				CategorySortHelper.isManualCategorySort(contentElement)) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/BaseFormPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/BaseFormPage.java
deleted file mode 100644
index 0f472bd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/BaseFormPage.java
+++ /dev/null
@@ -1,1116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * The base class for all Method editor form pages.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @author Shashidhar Kannoori
- * @since 1.0
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=176382
- */
-public class BaseFormPage extends FormPage {
-
-	/**
-	 * Button types.
-	 */
-	public static final int ADD_BUTTON = 0;
-
-	public static final int REMOVE_BUTTON = 1;
-
-	public static final int UP_BUTTON = 2;
-
-	public static final int DOWN_BUTTON = 3;
-
-	protected static final int ORDER_BUTTON = 4;
-
-	protected static final int SELECT_BUTTON = 5;
-
-	protected static final int CLEAR_BUTTON = 6;
-
-	protected static final int ATTACH_BUTTON = 7;
-
-	protected static final int DETACH_BUTTON = 8;
-	
-	protected static final int ATTACH_URL_BUTTON = 9;
-	
-	/**
-	 * Table types.
-	 */
-	public static final int SMALL_SIZE = 0;
-
-	public static final int MEDIUM_SIZE = 1;
-
-	public static final int LARGE_SIZE = 2;
-
-	public static final int SINGLE_ROW = 3;
-
-	protected boolean debug;
-
-	protected ScrolledForm form;
-
-	protected FormToolkit toolkit;
-
-	protected String editorTabName;
-
-	protected String editorName;
-
-	protected MethodElement methodElement;
-
-	protected ContentElement contentElement = null;
-
-	protected String contentElementPath;
-
-	private int SECTION_ID;
-
-	public static String LABEL_DECORATOR_KEY = "labelControlDecoration"; //$NON-NLS-1$
-	
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param editor
-	 *            The parent form editor.
-	 * @param id
-	 *            The unique ID for the form page.
-	 * @param title
-	 *            The title for the form page.
-	 */
-	public BaseFormPage(FormEditor editor, String id, String title) {
-		super(editor, id, title);
-		debug = AuthoringUIPlugin.getDefault().isDebugging();
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		setSite(site);
-		setInput(input);
-
-		// Retrieve the ContentElement object from the editor input.
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-		methodElement = methodElementInput.getMethodElement();
-		MethodElement elementOfPath =  methodElement instanceof ProcessComponent ?
-				((ProcessComponent) methodElement).getProcess() : methodElement;
-		contentElementPath = ResourceHelper.getFolderAbsolutePath(elementOfPath);
-		if(methodElement instanceof ContentElement) {
-			contentElement = (ContentElement) methodElement;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		form = managedForm.getForm();
-		toolkit = managedForm.getToolkit();
-		form.getBody().setLayout(new TableWrapLayout());
-	}
-
-	/**
-	 * Called when the expand/collapse button is selected.
-	 * 
-	 * @param event
-	 *            The associated event.
-	 */
-	protected void toggle(HyperlinkEvent event) {
-	}
-
-	/**
-	 * Called when the expand/collapse button is selected.
-	 * 
-	 * @param event
-	 *            The associated event.
-	 * @param o
-	 *            ???
-	 */
-	protected void toggle(HyperlinkEvent event, int o) {
-	}
-
-	/**
-	 * Sets the name for the editor.
-	 * 
-	 * @param editorName
-	 *            The name of the editor.
-	 */
-	public void setEditorName(String editorName) {
-		this.editorName = editorName;
-	}
-
-	/**
-	 * Returns a list of Method elements.
-	 * 
-	 * @param viewer
-	 *            A TableViewer.
-	 * @return A list of Method elements.
-	 */
-	public List<?> retrieveTableViewerContents(TableViewer viewer) {
-		Object[] elements = ((IStructuredContentProvider) viewer
-				.getContentProvider()).getElements(viewer.getInput());
-		List<Object> elementList = new ArrayList<Object>();
-		for (int i = 0; i < elements.length; i++)
-			elementList.add(elements[i]);
-		return elementList;
-	}
-
-	/**
-	 * Creates a section on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param name
-	 *            The section name.
-	 * @param description
-	 *            The section description.
-	 * @return A new <code>Section</code>.
-	 */
-	protected Section createSection(FormToolkit toolkit, Composite parent,
-			String title, String description) {
-		Section section = toolkit.createSection(parent, Section.DESCRIPTION
-				| Section.TWISTIE | Section.EXPANDED | Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		section.setLayoutData(td);
-		section.setText(title);
-//		String text = MessageFormat.format(description,
-//				new String[] { LibraryUIText.getUITextLower(methodElement) });
-//		section.setDescription(text);
-		section.setDescription(description);
-		section.setLayout(new GridLayout());
-		return section;
-	}
-
-	/**
-	 * Creates a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param text
-	 *            The text for the label.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Label.
-	 * @return A new <code>Label</code>.
-	 */
-	protected static Label createLabel(FormToolkit toolkit, Composite parent,
-			String text, int gridDataStyle, int horizontalSpan) {
-		Label label = toolkit.createLabel(parent, text, SWT.WRAP
-				| SWT.LEFT_TO_RIGHT);
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.horizontalSpan = horizontalSpan;
-		gridData.verticalAlignment = SWT.TOP;
-		gridData.widthHint = (horizontalSpan == 2) ? 115 : 100;
-		label.setLayoutData(gridData);
-		return label;
-	}
-	
-	/**
-	 * Creates a label on a form page without wrap and no widthHint.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param text
-	 *            The text for the label.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Label.
-	 * @return A new <code>Label</code>.
-	 */
-	public static Label createLabelWithNoWrap(FormToolkit toolkit, Composite parent,
-			String text, int gridDataStyle, int horizontalSpan) {
-		Label label = toolkit.createLabel(parent, text, SWT.LEFT_TO_RIGHT);
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.horizontalSpan = horizontalSpan;
-		gridData.verticalAlignment = SWT.TOP;
-		//gridData.widthHint = (horizontalSpan == 2) ? 115 : 100;
-		label.setLayoutData(gridData);
-		return label;
-	}
-
-	/**
-	 * Creates a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param text
-	 *            The text for the label.
-	 * @return A new <code>Label</code>.
-	 */
-	protected static Label createLabel(FormToolkit toolkit, Composite parent,
-			String text) {
-		return createLabel(toolkit, parent, text, GridData.BEGINNING, 1);
-	}
-
-	/**
-	 * Creates a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param text
-	 *            The text for the label.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Label.
-	 * @return A new <code>Label</code>.
-	 */
-	protected static Label createLabel(FormToolkit toolkit, Composite parent,
-			String text, int horizontalSpan) {
-		return createLabel(toolkit, parent, text, GridData.BEGINNING,
-				horizontalSpan);
-	}
-
-	/**
-	 * Creates a blank label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Label.
-	 * @return A new <code>Label</code>.
-	 */
-	protected static Label createBlankLabel(FormToolkit toolkit,
-			Composite parent, int horizontalSpan) {
-		return createLabel(toolkit, parent,
-				"", GridData.FILL_HORIZONTAL, horizontalSpan); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a text control on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param style
-	 *            The Text style.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @param heigth
-	 *            The height of the control.
-	 * @param width
-	 *            The width of the text control.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Text control.
-	 * @return A new <code>Text</code> control.
-	 */
-	protected static Text createTextEdit(FormToolkit toolkit, Composite parent,
-			int style, int gridDataStyle, int height, int width,
-			int horizontalSpan) {
-		Text control = toolkit.createText(parent, "", style); //$NON-NLS-1$
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.heightHint = height;
-		gridData.widthHint = width;
-		gridData.horizontalSpan = horizontalSpan;
-		control.setLayoutData(gridData);
-		return control;
-	}
-
-	/**
-	 * Creates a single-line text control on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @return A new <code>Text</code> control.
-	 */
-	protected static Text createTextEdit(FormToolkit toolkit, Composite parent) {
-		return createTextEdit(toolkit, parent, SWT.SINGLE | SWT.WRAP,
-				GridData.FILL_HORIZONTAL, SWT.DEFAULT, 100, 1);
-	}
-
-	/**
-	 * Creates a text control with a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param textStyle
-	 *            The Text style.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @param height
-	 *            The height of the control.
-	 * @param width
-	 *            The width of the text control.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Text control.
-	 * @param labelText
-	 *            the text for the label.
-	 * @return A new <code>Text</code> control.
-	 */
-	protected static Text createTextEditWithLabel(FormToolkit toolkit,
-			Composite parent, int textStyle, int gridDataStyle, int height,
-			int width, int horizontalSpan, String textLabel) {
-		createLabel(toolkit, parent, textLabel);
-		return createTextEdit(toolkit, parent, textStyle, gridDataStyle,
-				height, width, horizontalSpan);
-	}
-
-	/**
-	 * Creates a single-line text control with a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            the text for the label.
-	 * @return A new <code>Text</code> control.
-	 */
-	protected static Text createTextEditWithLabel(FormToolkit toolkit,
-			Composite parent, String labelText) {
-		createLabel(toolkit, parent, labelText, 2);
-		return createTextEdit(toolkit, parent);
-	}
-
-	/**
-	 * Creates a double-line text control with a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            the text for the label.
-	 * @return A new <code>Text</code> control.
-	 */
-	protected static Text createTextEditWithLabel2(FormToolkit toolkit,
-			Composite parent, String labelText) {
-		createLabel(toolkit, parent, labelText, 2);
-		return createTextEdit(toolkit, parent, SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL, GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL, 40, 300, 1);
-	}
-
-	/**
-	 * Creates a single or multi-line text control with a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            the text for the label.
-	 * @return A new <code>Text</code> control.
-	 */
-	protected static Text createTextEditWithLabel3(FormToolkit toolkit,
-			Composite parent, String labelText, int height, int singleOrMulti) {
-		createLabel(toolkit, parent, labelText, 2);
-		return createTextEdit(toolkit, parent, singleOrMulti | SWT.WRAP
-				| SWT.V_SCROLL | SWT.TRAVERSE_TAB_NEXT,
-				GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL, height,
-				300, 2);
-	}
-
-	/**
-	 * Creates a single or multi-line text control with a label in a composite.
-	 * 
-	 * @author hopeshared
-	 */
-	protected static Text createTextEditWithLabel4(FormToolkit toolkit,
-			Composite parent, String labelText, int height, int singleOrMulti, String fillText) {
-		createLabel(toolkit, parent, labelText, 2);
-		
-		int horizontalSpan = calculateSpan(fillText);
-		
-		if(horizontalSpan==1){
-			Text text = createTextEdit(toolkit, parent, singleOrMulti | SWT.WRAP
-					| SWT.V_SCROLL | SWT.TRAVERSE_TAB_NEXT, GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL, height, 200, 1);
-			Text text2 = createTextEdit(toolkit, parent, singleOrMulti | SWT.WRAP
-					| SWT.V_SCROLL, GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL, height, 100, 1);
-			text2.setVisible(false);
-			createLabel(toolkit, parent,
-					"", 1); //$NON-NLS-1$
-			return text;
-		}else{
-			return createTextEdit(toolkit, parent, singleOrMulti | SWT.WRAP
-					| SWT.V_SCROLL | SWT.TRAVERSE_TAB_NEXT,
-					GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL, height,
-					300, 3);
-		}
-	}
-	
-	
-	/**
-	 * Creates a double-line text control with a label on a form page.
-	 * @author hopeshared
-	 */
-	protected static Text createTextEditWithLabel5(FormToolkit toolkit,
-			Composite parent, String labelText) {
-		createLabel(toolkit, parent, labelText, 2);
-		return createTextEdit(toolkit, parent, SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL, GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL, 40, 300, 2);
-	}
-	
-	/**
-	 * Creates a single or multi-line text control with a label on a form page.
-	 * @author hopeshared
-	 */
-	protected static Text createTextEditWithLabel5(FormToolkit toolkit,
-			Composite parent, String labelText, int height, int singleOrMulti) {
-		createLabel(toolkit, parent, labelText, 2);
-		return createTextEdit(toolkit, parent, singleOrMulti | SWT.WRAP
-				| SWT.V_SCROLL | SWT.TRAVERSE_TAB_NEXT,
-				GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL, height,
-				300, 3);
-	}
-	
-	/**
-	 * Creates a combobox control with a label on a form page.
-	 * 
-	 * @author hopeshared
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            The text for the Label.
-	 * @return A new <code>Combobox</code>.
-	 */
-	protected Combo createComboWithLabel3(FormToolkit toolkit, Composite parent,
-			String labelText) {
-		createLabel(toolkit, parent, labelText, 2);
-		return createCombo(parent, SWT.SINGLE | SWT.FLAT | SWT.READ_ONLY |SWT.TRAVERSE_TAB_NEXT,
-				GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
-	}
-	
-	/**
-	 * Calculate the text's horizontal span.
-	 * 
-	 * @author hopeshared
-	 */
-	protected static int calculateSpan(String fillText){
-		int length = fillText.length();
-
-		if(length < 60)
-			return 1;
-		return 2;
-	}
-
-
-	/**
-	 * Creates a large text control with a label on a form page.
-	 * <p>
-	 * Used for the Brief Description box.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            the text for the label.
-	 * @return A new <code>Text</code> control.
-	 */
-	protected static Text createTextEditWithLabelLarge(FormToolkit toolkit,
-			Composite parent, String labelText) {
-		Label label = createLabel(toolkit, parent, labelText);
-		((GridData) label.getLayoutData()).widthHint = SWT.DEFAULT;
-		return createTextEdit(toolkit, parent, SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL, GridData.FILL_HORIZONTAL
-				| GridData.GRAB_HORIZONTAL, 80, SWT.DEFAULT, 3);
-	}
-
-	/**
-	 * Creates an image hyperlink on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param text
-	 *            The text for the hyperlink.
-	 * @param image
-	 *            The hyperlink image.
-	 * @return A new <code>ImageHyperlink</code>.
-	 */
-	protected ImageHyperlink createImageHyperlink(FormToolkit toolkit,
-			Composite parent, String text, Image image) {
-		ImageHyperlink link = toolkit.createImageHyperlink(parent, SWT.LEFT
-				| SWT.TOP);
-		GridData gridData = new GridData(GridData.BEGINNING);
-		gridData.verticalAlignment = SWT.TOP;
-		link.setLayoutData(gridData);
-		link.setImage(image);
-		if (text != null)
-			link.setText(text);
-		return link;
-	}
-
-	/**
-	 * Creates an image hyperlink on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param sectionId
-	 *            The sction ID.
-	 * @return A new <code>ImageHyperlink</code>.
-	 */
-	protected ImageHyperlink createHyperLink(FormToolkit toolkit,
-			Composite expandedComposite, int sectionID) {
-		SECTION_ID = sectionID;
-		ImageHyperlink expandLink = toolkit.createImageHyperlink(
-				expandedComposite, SWT.NONE);
-		expandLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		expandLink.setUnderlined(false);
-		expandLink.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e, SECTION_ID);
-			}
-		});
-		return expandLink;
-	}
-
-	/**
-	 * Creates a rich text control on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param style
-	 *            The rich text style.
-	 * @param height
-	 *            The height of the control.
-	 * @param width
-	 *            The width of the text control.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Text control.
-	 * @return A new <code>IMethodRichText</code>.
-	 */
-	protected IMethodRichText createRichTextEdit(FormToolkit toolkit,
-			Composite parent, int style, int gridDataStyle, int height,
-			int width, int horizontalSpan, Label label) {
-		IMethodRichText richText = MethodFormToolkit.createRichText(toolkit,
-				parent, "", style, contentElementPath, methodElement, label); //$NON-NLS-1$
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.heightHint = height;
-		gridData.widthHint = width;
-		gridData.horizontalSpan = horizontalSpan;
-		richText.setLayoutData(gridData);
-		return richText;
-	}
-
-	/**
-	 * Creates a rich text control on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @return A new <code>IMethodRichText</code>.
-	 */
-	protected IMethodRichText createRichTextEdit(FormToolkit toolkit,
-			Composite parent) {
-		return createRichTextEdit(toolkit, parent, SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL, GridData.FILL_HORIZONTAL, SWT.DEFAULT,
-				SWT.DEFAULT, 1, null);
-	}
-	
-	
-	public static Label createDecoratedLabel(FormToolkit toolkit, Composite parent,
-			String text) {
-		Label decoratedLabel = createLabel(toolkit, parent, text);
-		int margin = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth(); 
-		((GridData)decoratedLabel.getLayoutData()).horizontalIndent = margin;
-		ControlDecoration labelControlDecoration = new ControlDecoration(decoratedLabel, SWT.LEFT | SWT.BOTTOM);
-		decoratedLabel.setData(LABEL_DECORATOR_KEY, labelControlDecoration);
-		return decoratedLabel;
-	}
-	
-	/**
-	 * Creates a rich text control with a image hyperLink and label on a form
-	 * page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            The text for the label.
-	 * @param sectionId
-	 *            The section ID.
-	 * @return A new <code>IRichMethodText</code>.
-	 */
-	protected IMethodRichText createRichTextEditWithLink(
-			FormToolkit toolkit, Composite parent, String labelText,
-			int height, int width, int horizontalSpan) {
-		ImageHyperlink link = createImageHyperlink(toolkit, parent, null,
-				AuthoringUIImages.IMG_COLLAPSED);
-		link.setToolTipText(AuthoringUIResources.openRTE);
-		// create label with ControlDecoration here for markers
-		Label decoratedLabel = createDecoratedLabel(toolkit, parent, labelText);
-
-		IMethodRichText control = createRichTextEdit(toolkit, parent, SWT.MULTI
-				| SWT.WRAP | SWT.V_SCROLL, GridData.FILL_HORIZONTAL, height,
-				width, horizontalSpan, decoratedLabel);
-
-		link.setHref(control);
-		link.setData("Title", labelText); //$NON-NLS-1$
-		link.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e);
-			}
-		});
-
-		return control;
-	}
-
-
-	/**
-	 * Creates a rich text control with a image hyperLink and label on a form
-	 * page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            The text for the label.
-	 * @param sectionId
-	 *            The section ID.
-	 * @return A new <code>IRichMethodText</code>.
-	 */
-	protected IMethodRichText createRichTextEditWithLinkForSection(
-			FormToolkit toolkit, Composite parent, String labelText,
-			int height, int width, int sectionID) {
-		final int SECTION_ID = sectionID;
-		ImageHyperlink link = createImageHyperlink(toolkit, parent, null,
-				AuthoringUIImages.IMG_COLLAPSED);
-		link.setToolTipText(AuthoringUIResources.openRTE);
-
-		// create label with ControlDecoration here for markers
-		Label decoratedLabel = createDecoratedLabel(toolkit, parent, labelText);
-
-		IMethodRichText control = createRichTextEdit(toolkit, parent, SWT.MULTI
-				| SWT.WRAP | SWT.V_SCROLL, GridData.FILL_HORIZONTAL, height,
-				width, 1, decoratedLabel);
-
-		link.setHref(control);
-		link.setData("Title", labelText); //$NON-NLS-1$
-		link.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e, SECTION_ID);
-			}
-		});
-
-		return control;
-	}
-
-	/**
-	 * Creates a rich text editor on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param style
-	 *            The rich text style.
-	 * @param height
-	 *            The height of the control.
-	 * @param width
-	 *            The width of the text control.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Text control.
-	 * @return The new <code>IMethodRichTextEditor</code>.
-	 */
-	protected IMethodRichTextEditor createRichTextEditor(FormToolkit toolkit,
-			Composite parent, int style, int gridDataStyle, int height,
-			int width, int horizontalSpan, Label label) {
-		IMethodRichTextEditor editor = MethodFormToolkit.createRichTextEditor(
-				toolkit, parent, "", style, contentElementPath, methodElement, label, getEditor().getEditorSite()); //$NON-NLS-1$
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.heightHint = height;
-		gridData.widthHint = width;
-		gridData.horizontalSpan = horizontalSpan;
-		editor.setLayoutData(gridData);
-		return editor;
-	}
-
-	/**
-	 * Creates a combobox control on a form page.
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 * @param style
-	 *            The Combobox style.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @return A new <code>Combobox</code>.
-	 */
-	protected Combo createCombo(Composite parent, int style, int gridDataStyle) {
-		Combo control = new Combo(parent, style);
-		return control;
-	}
-
-	/**
-	 * Creates a combobox control on a form page.
-	 * 
-	 * @param parent
-	 *            The parent composite.
-	 * @return A new <code>Combobox</code>.
-	 */
-	protected Combo createCombo(Composite parent) {
-		return createCombo(parent, SWT.SINGLE | SWT.FLAT | SWT.READ_ONLY,
-				GridData.FILL_HORIZONTAL);
-	}
-
-	/**
-	 * Creates a combobox control with a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            The text for the Label.
-	 * @param style
-	 *            The Combobox style.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @return A new <code>Combobox</code>.
-	 */
-	protected Combo createCComboWithLabel(FormToolkit toolkit,
-			Composite parent, String textLabel, int style, int gridDataStyle) {
-		createLabel(toolkit, parent, textLabel);
-		return createCombo(parent, style, gridDataStyle);
-	}
-
-	/**
-	 * Creates a combobox control with a label on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param labelText
-	 *            The text for the Label.
-	 * @return A new <code>Combobox</code>.
-	 */
-	protected Combo createComboWithLabel(FormToolkit toolkit, Composite parent,
-			String labelText) {
-		createLabel(toolkit, parent, labelText);
-		return createCombo(parent, SWT.SINGLE | SWT.FLAT | SWT.READ_ONLY,
-				GridData.FILL_HORIZONTAL);
-	}
-
-	/**
-	 * Creates a composite on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param section
-	 *            The parent section.
-	 * @return A new <code>Composite</code>.
-	 */
-
-	protected Composite createComposite(FormToolkit toolkit, Section section) {
-		Composite composite = toolkit.createComposite(section);
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		composite.setLayout(new GridLayout(3, false));
-		section.setClient(composite);
-		return composite;
-	}
-
-	/**
-	 * Creates a composite on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @param verticalSpan
-	 *            The number of row cells taken up by the Composite.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Composite.
-	 * @param numColumns
-	 *            The number of columns in the grid.
-	 * @return A new <code>Composite</code>.
-	 */
-	protected static Composite createComposite(FormToolkit toolkit,
-			Composite parent, int gridDataStyle, int verticalSpan,
-			int horizontalSpan, int numColumns) {
-		Composite composite = toolkit.createComposite(parent, SWT.NONE);
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.verticalSpan = verticalSpan;
-		gridData.horizontalSpan = horizontalSpan;
-		composite.setLayoutData(gridData);
-		composite.setLayout(new GridLayout(numColumns, false));
-		return composite;
-	}
-
-	/**
-	 * Creates a composite on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param verticalSpan
-	 *            The number of row cells taken up by the Composite.
-	 * @return A new <code>Composite</code>.
-	 */
-	protected static Composite createComposite(FormToolkit toolkit,
-			Composite parent, int verticalSpan) {
-		return createComposite(toolkit, parent, GridData.FILL_BOTH,
-				verticalSpan, 1, 1);
-	}
-
-	/**
-	 * Creates a composite for displaying buttons on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param type
-	 *            The Composite type.
-	 * @return A new <code>Composite</code>.
-	 */
-	protected static Composite createCompositeForButtons(FormToolkit toolkit,
-			Composite parent) {
-		return createComposite(toolkit, parent, GridData.VERTICAL_ALIGN_CENTER
-				| GridData.HORIZONTAL_ALIGN_CENTER, SWT.DEFAULT, SWT.DEFAULT, 1);
-	}
-
-	/**
-	 * Creates a expanded composite in the form
-	 * <p>
-	 * Used to hold an expanded rich text editor.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @return A new <code>Composite</code>.
-	 */
-	protected Composite createExpandedComposite(FormToolkit toolkit,
-			Composite parent) {
-		Composite expandedComposite = toolkit.createComposite(parent, SWT.NONE);
-		expandedComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		expandedComposite.setLayout(new GridLayout(2, false));
-		expandedComposite.setVisible(false);
-		return expandedComposite;
-	}
-
-	/**
-	 * Creates a table on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param style
-	 *            The Table style.
-	 * @param gridDataStyle
-	 *            The GridData style.
-	 * @param height
-	 *            The height of the Table.
-	 * @param width
-	 *            The width of the Table.
-	 * @param verticalSpan
-	 *            The number of row cells taken up by the Table.
-	 * @param horizontalSpan
-	 *            The number of column cells taken up by the Table.
-	 * @return A new <code>Table</code>.
-	 */
-	protected static Table createTable(FormToolkit toolkit, Composite parent,
-			int style, int gridDataStyle, int height, int width,
-			int verticalSpan, int horizontalSpan) {
-		Table table = toolkit.createTable(parent, style);
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.heightHint = height;
-		gridData.widthHint = width;
-		gridData.verticalSpan = verticalSpan;
-		gridData.horizontalSpan = horizontalSpan;
-		table.setLayoutData(gridData);
-		return table;
-	}
-
-	/**
-	 * Creates a table on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param type
-	 *            The table table.
-	 * @return A new <code>Table</code>.
-	 */
-	protected static Table createTable(FormToolkit toolkit, Composite parent,
-			int type) {
-		switch (type) {
-		case SMALL_SIZE:
-			return createTable(toolkit, parent, SWT.MULTI, GridData.FILL_BOTH,
-					56, 200, 1, 1);
-		case MEDIUM_SIZE:
-			return createTable(toolkit, parent, SWT.MULTI, GridData.FILL_BOTH,
-					112, 200, 1, 1);
-		case LARGE_SIZE:
-			return createTable(toolkit, parent, SWT.MULTI, GridData.FILL_BOTH,
-					200, 200, 1, 1);
-		case SINGLE_ROW:
-			return createTable(toolkit, parent, SWT.MULTI,
-					GridData.FILL_HORIZONTAL, 20, 200, 1, 1);
-		default:
-			throw new IllegalArgumentException();
-		}
-	}
-
-	/**
-	 * Creates a button on a form page.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 * @param parent
-	 *            The parent composite.
-	 * @param type
-	 *            The button type.
-	 * @return A new <code>Button</code>.
-	 */
-	protected static Button createButton(FormToolkit toolkit, Composite parent,
-			int type) {
-		Button button;
-		switch (type) {
-		case ADD_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.ADD_BUTTON_TEXT, SWT.NONE);
-			break;
-		case REMOVE_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.REMOVE_BUTTON_TEXT, SWT.NONE);
-			break;
-		case UP_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.UP_BUTTON_TEXT, SWT.NONE);
-			break;
-		case DOWN_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.DOWN_BUTTON_TEXT, SWT.NONE);
-			break;
-		case ORDER_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.ORDER_BUTTON_TEXT, SWT.NONE);
-			break;
-		case SELECT_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.SELECT_BUTTON_TEXT, SWT.NONE);
-			break;
-		case CLEAR_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.CLEAR_BUTTON_TEXT, SWT.NONE);
-			break;
-		case ATTACH_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.ATTACH_BUTTON_TEXT, SWT.NONE);
-			break;
-		case ATTACH_URL_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.ATTACH_URL_BUTTON_TEXT, SWT.NONE);
-			break;		
-		case DETACH_BUTTON:
-			button = toolkit.createButton(parent,
-					AuthoringUIText.DETACH_BUTTON_TEXT, SWT.NONE);
-			break;
-		default:
-			throw new IllegalArgumentException();
-		}
-		button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		button.setEnabled(false);
-		return button;
-	}
-	
-	/**
-	 * Get height of the rich text control
-	 * @return
-	 * 		Height of the rich text control
-	 */
-	public int getRichTextEditorHeight() {
-		return form.getBounds().height - 3 * 32;
-	}
-
-	/**
-	 * Get width of the rich text control
-	 * @return
-	 * 		Width of the rich text control
-	 */
-	public int getRichTextEditorWidth() {
-		return form.getBounds().width - 2 * 32;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CategoryGuidancePage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CategoryGuidancePage.java
deleted file mode 100644
index c08af7c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CategoryGuidancePage.java
+++ /dev/null
@@ -1,253 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.GuidanceFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Guidance page in the content element editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- * TODO - change name of class to ContentElementGuidancePage
- */
-public class CategoryGuidancePage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "categoryGuidancesPage"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CategoryGuidancePage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.GUIDANCE_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		setAllowChange1(true);
-		setAllowChange2(true);
-		setUseCategory2(false);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List list = MethodElementUtil
-						.getSelectedGuidances(contentElement);
-				List local = new ArrayList();
-				for (Iterator it = list.iterator(); it.hasNext();) {
-					Object obj = it.next();
-					if (!(obj instanceof Practice
-							|| (obj instanceof ToolMentor && contentElement instanceof Tool) || obj
-							.equals(contentElement
-									.getVariabilityBasedOnElement()))) {
-						local.add(obj);
-					}
-				}
-				return local.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// Guidance for content element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									(Checklist) item, -1);
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-				} else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to add guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"to " //$NON-NLS-1$
-											+ contentElement.getType()
-													.getName()
-											+ ":" + contentElement.getName()); //$NON-NLS-1$
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// Guidance for the method element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									item, -1);
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-				} else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to remove guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"from " //$NON-NLS-1$
-											+ contentElement.getType()
-													.getName()
-											+ ":" + contentElement.getName()); //$NON-NLS-1$ 
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.GUIDANCE;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new GuidanceFilter();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ChecklistItemsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ChecklistItemsPage.java
deleted file mode 100644
index 586c8dc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ChecklistItemsPage.java
+++ /dev/null
@@ -1,769 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.dialogs.SectionsOrderDialog;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor.ModifyListener;
-import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.authoring.ui.util.EditorsContextHelper;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.AddToSectionListCommand;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInSectionListCommand;
-import org.eclipse.epf.library.edit.command.RemoveFromSectionList;
-import org.eclipse.epf.library.edit.util.SectionList;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.richtext.RichTextListener;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * The Check Item page in the Checklist editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ChecklistItemsPage extends BaseFormPage {
-
-	private static final String FORM_PAGE_ID = "checklistCheckItemsPage"; //$NON-NLS-1$
-
-	private Text ctrl_name;
-
-	private Button ctrl_add, ctrl_delete, ctrl_up, ctrl_down, ctrl_order;
-
-	private Table ctrl_checkItems;
-
-	private TableViewer checkItemsTableViewer;
-
-	private SectionList allcheckItems;
-
-	private IMethodRichText activeControl;
-
-	private boolean descExpandFlag = false;
-
-	private IMethodRichTextEditor ctrl_expanded;
-
-	private ImageHyperlink expandLink;
-
-	private Label expandLabel;
-
-	protected Section formSection;
-	private Section generalSection;
-
-	protected Composite sectionComposite;
-	private Composite generalComposite;
-
-	private Composite expandedComposite;
-
-	private IMethodRichText ctrl_maindesc;
-
-	private IStructuredContentProvider checkItemsViewerContentProvider;
-
-	private ILabelProvider checkItemsViewerLabelProvider;
-
-	private Checklist checklist;
-
-	private org.eclipse.epf.uma.Section currentItem;
-
-	private ILibraryChangeListener libListener = null;
-
-	private ModifyListener contentModifyListener;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ChecklistItemsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.CHECK_ITEMS_TEXT);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.BaseFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-		checklist = (Checklist) methodElementInput.getMethodElement();
-	}
-
-	/**
-	 * Create form content
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-
-		String elementLabel = LibraryUIText.getUIText(methodElement);
-		form.setText(LibraryUIText.TEXT_GUIDANCE
-				+ " (" + elementLabel + "): " + methodElement.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		formSection = toolkit.createSection(form.getBody(), Section.NO_TITLE);
-		{
-			TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-			formSection.setLayoutData(td);
-			formSection.setLayout(new TableWrapLayout());
-		}
-		// Create the composite for the sections.
-		sectionComposite = toolkit.createComposite(formSection, SWT.NONE);
-		sectionComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		sectionComposite.setLayout(new TableWrapLayout());
-		formSection.setClient(sectionComposite);
-
-		// Create the General Information section.
-		generalSection = toolkit.createSection(sectionComposite,
-				Section.TITLE_BAR | Section.DESCRIPTION | Section.TWISTIE
-						| Section.EXPANDED);
-		generalSection
-				.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		generalSection.setText(AuthoringUIText.CHECK_ITEMS_SECTION_NAME);
-		generalSection.setDescription(AuthoringUIText.CHECK_ITEMS_SECTION_DESC);
-		generalSection.setLayout(new GridLayout());
-
-		generalComposite = toolkit.createComposite(generalSection);
-		generalComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		generalComposite.setLayout(new GridLayout(4, false));
-		generalSection.setClient(generalComposite);
-
-		EditorsContextHelper.setHelp(generalComposite.getParent(), checklist);
-
-		Composite pane1 = toolkit.createComposite(generalComposite);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.verticalSpan = 1;
-			gridData.horizontalSpan = 3;
-			pane1.setLayoutData(gridData);
-			pane1.setLayout(new GridLayout());
-		}
-
-		Label l_name = toolkit.createLabel(pane1,
-				AuthoringUIText.CHECK_ITEMS_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 3;
-			l_name.setLayoutData(gridData);
-		}
-
-		ctrl_checkItems = toolkit.createTable(pane1, SWT.MULTI);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.horizontalSpan = 3;
-			gridData.heightHint = 150;
-			ctrl_checkItems.setLayoutData(gridData);
-		}
-
-		initProviders();
-
-		checkItemsTableViewer = new TableViewer(ctrl_checkItems);
-		checkItemsTableViewer
-				.setContentProvider(checkItemsViewerContentProvider);
-		checkItemsTableViewer.setLabelProvider(checkItemsViewerLabelProvider);
-
-		Composite pane2 = toolkit.createComposite(generalComposite);
-		pane2.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER
-				| GridData.HORIZONTAL_ALIGN_CENTER));
-		pane2.setLayout(new GridLayout());
-
-		ctrl_add = toolkit.createButton(pane2, AuthoringUIText.ADD_BUTTON_TEXT,
-				SWT.NONE);
-		ctrl_add.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_delete = toolkit.createButton(pane2,
-				AuthoringUIText.DELETE_BUTTON_TEXT, SWT.NONE);
-		ctrl_delete.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		ctrl_delete.setEnabled(false);
-
-		ctrl_up = toolkit.createButton(pane2, AuthoringUIText.UP_BUTTON_TEXT,
-				SWT.NONE);
-		ctrl_up.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		ctrl_up.setEnabled(false);
-
-		ctrl_down = toolkit.createButton(pane2,
-				AuthoringUIText.DOWN_BUTTON_TEXT, SWT.NONE);
-		ctrl_down.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		ctrl_down.setEnabled(false);
-
-		ctrl_order = toolkit.createButton(pane2,
-				AuthoringUIText.ORDER_BUTTON_TEXT, SWT.NONE);
-		ctrl_order.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// name
-		Label nameLabel = toolkit.createLabel(generalComposite,
-				AuthoringUIText.NAME_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 4;
-			nameLabel.setLayoutData(gridData);
-		}
-		ctrl_name = toolkit.createText(generalComposite, "", SWT.SINGLE); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.horizontalSpan = 4;
-			ctrl_name.setLayoutData(gridData);
-		}
-
-		createBlankLabel(toolkit, generalComposite, 4);
-		
-		ctrl_maindesc = createRichTextEditWithLink(
-				toolkit, generalComposite, AuthoringUIText.DESCRIPTION_TEXT,
-				250, 300, 4);
-
-		createRichTextEditorSection();
-
-		toolkit.paintBordersFor(pane1);
-		toolkit.paintBordersFor(pane2);
-		toolkit.paintBordersFor(generalComposite);
-		toolkit.paintBordersFor(expandedComposite);
-
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-
-		addListeners();
-		loadData();
-		enableControls();
-	}
-
-	/**
-	 * Add library and selection listener
-	 */
-	public void addListeners() {
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-		contentModifyListener = editor.createModifyListener(currentItem);
-		ctrl_name.addModifyListener(contentModifyListener);
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setDisable(true);
-
-		form.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event e) {
-//				IStatus status = TngUtil.checkEdit((EObject) checklist,
-//						getSite().getShell());
-//				if (status.isOK()) {
-//					loadData();
-//				}
-				if (form != null && !form.isDisposed()) {
-					UIHelper.setFormText(form, contentElement);
-				}
-				loadData();
-				if (TngUtil.isLocked(contentElement)) {
-					enableControls(false);
-				} else {
-					ctrl_add.setEnabled(true);
-					checkSelection();
-				}
-			}
-		});
-
-		form.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				deactivate();
-			}
-		});
-
-		form.addControlListener(new ControlListener() {
-			public void controlResized(ControlEvent e) {
-				if (ctrl_expanded != null) {
-					((GridData) ctrl_expanded.getLayoutData()).heightHint = getRichTextEditorHeight();
-					((GridData) ctrl_expanded.getLayoutData()).widthHint = getRichTextEditorWidth();
-				}
-				formSection.layout(true, true);
-			}
-
-			public void controlMoved(ControlEvent e) {
-			}
-		});
-
-		ctrl_name.addModifyListener(contentModifyListener);
-		ctrl_name.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				if (currentItem != null) {
-					String oldName = currentItem.getName();
-					String newName = ctrl_name.getText();
-					//newName = StrUtil.makeValidFileName(newName);
-					if (ctrl_name.getText() == null
-							|| ctrl_name.getText().length() == 0) {
-						String title = AuthoringUIResources.bind(AuthoringUIResources.renameDialog_title, LibraryUIText.TEXT_CHECK_ITEM); 
-						String msg = AuthoringUIResources.bind(AuthoringUIResources.emptyElementNameError_msg, StrUtil.toLower(LibraryUIText.TEXT_CHECK_ITEM)); 
-						if (oldName != null && oldName.length() > 0) {
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayError(title, msg);
-						} else {
-							getEditorSite()
-									.getActionBars()
-									.getStatusLineManager()
-									.setErrorMessage(
-											PlatformUI
-													.getWorkbench()
-													.getSharedImages()
-													.getImage(
-															ISharedImages.IMG_OBJS_ERROR_TSK),
-											msg);
-						}
-					} else if (!oldName.equals(newName)) {
-						editor.getActionManager().doAction(IActionManager.SET,
-								currentItem,
-								UmaPackage.eINSTANCE.getNamedElement_Name(),
-								newName, -1);
-					}
-				}
-			}
-		});
-
-		ctrl_maindesc.addModifyListener(contentModifyListener);
-		ctrl_maindesc.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				saveMainDescription();
-			}
-		});
-
-		checkItemsTableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						checkSelection();
-					}
-				});
-
-		ctrl_add.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				org.eclipse.epf.uma.Section child = UmaFactory.eINSTANCE
-						.createSection();
-				String newName = MessageFormat.format(
-						AuthoringUIText.NEW_ELEMENT_TEXT,
-						new String[] { LibraryUIText.TEXT_CHECK_ITEM });
-				child.setName(newName);
-				AddToSectionListCommand cmd = new AddToSectionListCommand(
-						checklist, child, allcheckItems);
-				getActionManager().execute(cmd);
-				checkItemsTableViewer.refresh();
-				checkItemsTableViewer.setSelection(new StructuredSelection(
-						child));
-				ctrl_name.setFocus();
-				ctrl_name.setSelection(0, newName.length());
-				getEditorSite().getActionBars().getStatusLineManager()
-						.setErrorMessage(""); //$NON-NLS-1$
-			}
-		});
-
-		ctrl_delete.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				getEditorSite().getActionBars().getStatusLineManager()
-						.setErrorMessage(""); //$NON-NLS-1$
-				IStructuredSelection selection = (IStructuredSelection) checkItemsTableViewer
-						.getSelection();
-				for (Iterator iter = selection.toList().iterator(); iter
-						.hasNext();) {
-					Object o = iter.next();
-					if (o instanceof org.eclipse.epf.uma.Section) {
-						RemoveFromSectionList cmd = new RemoveFromSectionList(
-								checklist, (org.eclipse.epf.uma.Section) o,
-								allcheckItems);
-						getActionManager().execute(cmd);
-					}
-				}
-				checkItemsTableViewer.refresh();
-				editItem(null);
-			}
-		});
-
-		ctrl_up.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) checkItemsTableViewer
-						.getSelection();
-
-				ArrayList moveUpItems = new ArrayList();
-				moveUpItems.addAll(selection.toList());
-				MoveInSectionListCommand cmd = new MoveInSectionListCommand(
-						checklist, moveUpItems, allcheckItems, 1);
-				getActionManager().execute(cmd);
-
-				checkItemsTableViewer.refresh();
-
-				if (checkItemsTableViewer.getTable().getSelectionIndex() > 0
-						&& !TngUtil.isLocked(checklist)) {
-					ctrl_up.setEnabled(true);
-				} else {
-					ctrl_up.setEnabled(false);
-				}
-				if (checkItemsTableViewer.getTable().getSelectionIndex() < checkItemsTableViewer
-						.getTable().getItemCount() - 1
-						&& !TngUtil.isLocked(checklist)) {
-					ctrl_down.setEnabled(true);
-				} else {
-					ctrl_down.setEnabled(false);
-				}
-			}
-		});
-
-		ctrl_down.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) checkItemsTableViewer
-						.getSelection();
-				ArrayList moveDownItems = new ArrayList();
-				moveDownItems.addAll(selection.toList());
-				MoveInSectionListCommand cmd = new MoveInSectionListCommand(
-						checklist, moveDownItems, allcheckItems, 0);
-				getActionManager().execute(cmd);
-
-				checkItemsTableViewer.refresh();
-
-				if (checkItemsTableViewer.getTable().getSelectionIndex() > 0
-						&& !TngUtil.isLocked(checklist)) {
-					ctrl_up.setEnabled(true);
-				} else {
-					ctrl_up.setEnabled(false);
-				}
-				if (checkItemsTableViewer.getTable().getSelectionIndex() < checkItemsTableViewer
-						.getTable().getItemCount() - 1
-						&& !TngUtil.isLocked(checklist)) {
-					ctrl_down.setEnabled(true);
-				} else {
-					ctrl_down.setEnabled(false);
-				}
-			}
-		});
-
-		ctrl_order.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				SectionsOrderDialog dlg = new SectionsOrderDialog(
-						Display.getCurrent().getActiveShell(),
-						checklist,
-						getActionManager(),
-						AuthoringUIResources.ChecklistOrder_title, 
-						AuthoringUIResources.ChecklistOrder_description, 
-						AuthoringUIResources.ChecklistOrder_checklistitems_text); 
-				dlg.open();
-			}
-		});
-	}
-
-	protected void enableControls(boolean editable) {
-		ctrl_name.setEditable(editable);
-		ctrl_maindesc.setEditable(editable);
-		ctrl_add.setEnabled(editable);
-		ctrl_delete.setEnabled(editable);
-		ctrl_up.setEnabled(editable);
-		ctrl_down.setEnabled(editable);
-		ctrl_order.setEnabled(true);
-		if (ctrl_expanded != null) {
-			ctrl_expanded.setEditable(editable);
-		}
-	}
-
-
-	protected void deactivate() {
-		// Save the Item order.
-		if (allcheckItems != null) {
-			allcheckItems.apply();
-		}
-	}
-
-	/**
-	 * Initializes the controls with data from the model.
-	 */
-	private void loadData() {
-		allcheckItems = null;
-		checkItemsTableViewer.setInput(checklist);
-		checkItemsTableViewer.refresh();
-		editItem(currentItem);
-	}
-
-	/**
-	 * Edit current Item.
-	 */
-	private void editItem(org.eclipse.epf.uma.Section item) {
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setDisable(true);
-
-		if (ctrl_maindesc.getModified()) {
-			saveMainDescription();
-		}
-
-		currentItem = item;
-		String name = ""; //$NON-NLS-1$
-		String desc = ""; //$NON-NLS-1$
-		if (currentItem != null) {
-			name = currentItem.getName();
-			desc = currentItem.getSectionDescription();
-			ctrl_name.setFocus();
-			getEditorSite().getActionBars().getStatusLineManager()
-					.setErrorMessage(""); //$NON-NLS-1$
-		}
-		ctrl_name.setText(name == null ? "" : name); //$NON-NLS-1$
-		ctrl_maindesc.setText(desc == null ? "" : desc); //$NON-NLS-1$
-		ctrl_maindesc.setModalObject(currentItem);
-		ctrl_maindesc.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getSection_SectionDescription());
-		if (item == null) {
-			// close any Find/Replace dialog open in the RTE
-			ctrl_maindesc.getFindReplaceAction().dispose();
-		}
-
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setElement(currentItem);
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setDisable(currentItem == null);
-
-		enableControls();
-	}
-
-	/**
-	 * Enable name and description controls
-	 */
-	private void enableControls() {
-		if (checklist.getPresentation().getSections().contains(currentItem)) {
-			if (!TngUtil.isLocked(contentElement)) {
-				ctrl_name.setEditable(true);
-				ctrl_maindesc.setEditable(true);
-			}
-		} else {
-			ctrl_name.setEditable(false);
-			ctrl_maindesc.setEditable(false);
-		}
-	}
-
-	/**
-	 * Dispose listener
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-		if (libListener != null) {
-			ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				manager.removeListener(libListener);
-			}
-			libListener = null;
-		}
-	}
-
-	private void createRichTextEditorSection() {
-		expandedComposite = toolkit.createComposite(formSection, SWT.NONE);
-		expandedComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		expandedComposite.setLayout(new GridLayout(2, false));
-		expandedComposite.setVisible(false);
-
-		// Hyperlink desc
-		expandLink = toolkit.createImageHyperlink(expandedComposite, SWT.NONE);
-		expandLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		expandLink.setToolTipText(AuthoringUIResources.closeRTE); 
-		expandLink.setUnderlined(false);
-		expandLink.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e);
-			}
-		});
-
-		expandLabel = createDecoratedLabel(toolkit, expandedComposite, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Toggle Description control to expand and control state
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.forms.BaseFormPage#toggle(org.eclipse.ui.forms.events.HyperlinkEvent)
-	 */
-	protected void toggle(HyperlinkEvent e) {
-		if (currentItem == null)
-			return;
-		if (ctrl_expanded == null) {
-			ctrl_expanded = createRichTextEditor(toolkit, expandedComposite,
-					SWT.MULTI | SWT.WRAP | SWT.V_SCROLL, GridData.FILL_BOTH,
-					getRichTextEditorHeight(), getRichTextEditorWidth(), 2, expandLabel);
-			ctrl_expanded.addModifyListener(contentModifyListener);
-		}
-
-		if (descExpandFlag) {
-			sectionComposite.setVisible(true);
-			expandedComposite.setVisible(false);
-			formSection.setClient(sectionComposite);
-			IMethodRichText richText = getActiveRichTextControl();
-			richText.setText(ctrl_expanded.getText());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.removeListener(listener.getEventType(), listener
-						.getListener());
-			}
-			if (ctrl_expanded.getModified()) {
-				((MethodElementEditor) getEditor())
-						.saveModifiedRichText(ctrl_expanded);
-			}
-			richText.setFocus();
-		} else {
-			sectionComposite.setVisible(false);
-			expandedComposite.setVisible(true);
-			formSection.setClient(expandedComposite);
-			expandLabel.setText(currentItem.getName() +
-					" - " + (String) ((ImageHyperlink) e.getSource()).getData("Title")); //$NON-NLS-1$ //$NON-NLS-2$
-			IMethodRichText richText = (IMethodRichText) e.getHref();
-			ctrl_expanded.setInitialText(richText.getText());
-			ctrl_expanded.setModalObject(richText.getModalObject());
-			ctrl_expanded.setModalObjectFeature(richText
-					.getModalObjectFeature());
-			ctrl_expanded.setFindReplaceAction(richText.getFindReplaceAction());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.addListener(listener.getEventType(), listener
-						.getListener());
-			}
-			boolean editable = !TngUtil.isLocked(contentElement);
-			ctrl_expanded.setEditable(editable);
-			if (editable) {
-				ctrl_expanded.setFocus();
-			}
-			setActiveRichTextControl(richText);
-		}
-
-		form.getBody().layout(true, true);
-		descExpandFlag = !descExpandFlag;
-	}
-
-	private void setActiveRichTextControl(IMethodRichText editor) {
-		activeControl = editor;
-	}
-
-	private IMethodRichText getActiveRichTextControl() {
-		return activeControl;
-	}
-
-	private void initProviders() {
-		checkItemsViewerContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				if (object != checklist)
-					return super.getElements(object);
-				if (allcheckItems == null) {
-					allcheckItems = new SectionList(checklist,
-							SectionList.STEPS_FOR_ELEMENT_ONLY);
-				}
-				return allcheckItems.toArray();
-			}
-		};
-
-		checkItemsViewerLabelProvider = new VariabilityElementLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public boolean isExternal(Object element) {
-				return !checklist.getPresentation().getSections().contains(
-						element);
-			}
-		};
-	}
-
-	private void saveMainDescription() {
-		if (currentItem != null) {
-			IMethodRichText control = descExpandFlag ? ctrl_expanded
-					: ctrl_maindesc;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = currentItem.getSectionDescription();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(control,
-					oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, currentItem,
-						UmaPackage.eINSTANCE.getSection_SectionDescription(),
-						newContent, -1);
-			}
-		}
-	}
-
-	protected IActionManager getActionManager() {
-		FormEditor editor = getEditor();
-		if (editor instanceof MethodElementEditor) {
-			return ((MethodElementEditor) editor).getActionManager();
-		}
-		return null;
-	}
-
-	private void checkSelection() {
-		IStructuredSelection selection = (IStructuredSelection) checkItemsTableViewer
-				.getSelection();
-		if (selection.size() > 0 && !TngUtil.isLocked(checklist)) {
-			ctrl_delete.setEnabled(true);
-
-			if (checkItemsTableViewer.getTable().getSelectionIndex() > 0
-					&& !TngUtil.isLocked(checklist) && selection.size() == 1) {
-				ctrl_up.setEnabled(true);
-			} else {
-				ctrl_up.setEnabled(false);
-			}
-
-			if (checkItemsTableViewer.getTable().getSelectionIndex() < checkItemsTableViewer
-					.getTable().getItemCount() - 1
-					&& !TngUtil.isLocked(checklist) && selection.size() == 1) {
-				ctrl_down.setEnabled(true);
-			} else {
-				ctrl_down.setEnabled(false);
-			}
-		}
-		if (selection.size() == 1) {
-			editItem((org.eclipse.epf.uma.Section) selection.getFirstElement());
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigViewPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigViewPage.java
deleted file mode 100644
index c85fd6c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigViewPage.java
+++ /dev/null
@@ -1,571 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.dialogs.ConfigurationAddViewsDialog;
-import org.eclipse.epf.authoring.ui.dialogs.ConfigurationOrderDialog;
-import org.eclipse.epf.authoring.ui.editors.ConfigurationEditor;
-import org.eclipse.epf.authoring.ui.editors.ConfigurationEditorInput;
-import org.eclipse.epf.authoring.ui.filters.ProcessViewFilter;
-import org.eclipse.epf.authoring.ui.providers.ConfigurationLabelProvider;
-import org.eclipse.epf.authoring.ui.views.ConfigurationViewFilter;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-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.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-
-
-/**
- * Page for customizing publishing views
- * 
- * @author Shilpa Toraskar
- * @author Jinhua Xi
- * @since 1.0
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=173827
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=174260
- */
-public class ConfigViewPage extends FormPage {
-
-	private MethodConfiguration config = null;
-
-	private String formPrefix = AuthoringUIResources.configViewPage_configuration; 
-
-	private FormToolkit toolkit;
-
-	private CTabFolder tabFolder;
-	private CTabItem tabDefaultviewItem;
-
-	private Button removeButton, makeDefaultButton, orderButton;
-
-	private Object selectedItem = null;
-
-	private IActionManager actionMgr = null;
-
-	private Logger logger = null;
-
-	/**
-	 * Creates an instance
-	 * @param editor
-	 */
-	public ConfigViewPage(FormEditor editor) {
-		super(
-				editor,
-				AuthoringUIResources.configViewPage_configurationViews, AuthoringUIResources.configViewPage_views); 
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		setSite(site);
-		setInput(input);
-
-		ConfigurationEditorInput configInput = (ConfigurationEditorInput) input;
-		config = configInput.getConfiguration();
-
-		actionMgr = ((ConfigurationEditor) getEditor()).getActionManager();
-
-		// get plugin logger
-		logger = AuthoringUIPlugin.getDefault().getLogger();
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		ScrolledForm form = managedForm.getForm();
-		form.setText(formPrefix + config.getName());
-		toolkit = managedForm.getToolkit();
-		form.getBody().setLayout(new GridLayout());
-
-		// Create the view section.
-		Section viewSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		viewSection.setLayoutData(td);
-		viewSection
-				.setText(AuthoringUIResources.configViewPage_configurationViewSectionTitle); 
-		viewSection
-				.setDescription(AuthoringUIResources.configViewPage_configurationViewSectionMessage); 
-		viewSection.setLayout(new GridLayout());
-
-		Composite parent = toolkit.createComposite(viewSection);
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-		parent.setLayout(new GridLayout());
-		viewSection.setClient(parent);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent.getParent(),
-				AuthoringUIHelpContexts.CONFIGURATION_EDITOR_ALL_CONTEXT);
-
-		// create button pane
-		createButtonPane(parent);
-
-		// create tabfolder pane
-		createTabPane(parent);
-
-		toolkit.paintBordersFor(parent);
-		loadData();
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createTabPane(Composite parent) {
-		tabFolder = new CTabFolder(parent, SWT.FLAT | SWT.TOP | SWT.BORDER);
-		tabFolder.setLayout(new GridLayout());
-		tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// set tabfolder background color
-		Color selectedColor = toolkit.getColors().getColor(FormColors.TB_BG);
-		tabFolder.setSelectionBackground(new Color[] { selectedColor, toolkit.getColors().getBackground() }, new int[] { 50 });
-		
-		toolkit.paintBordersFor(tabFolder);
-
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createButtonPane(Composite parent) {
-		Composite buttonPane = toolkit.createComposite(parent);
-		buttonPane.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		buttonPane.setLayout(new GridLayout(4, false));
-
-		Button addButton = toolkit
-				.createButton(
-						buttonPane,
-						AuthoringUIResources.configViewPage_addViewButtonText, SWT.NONE); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			addButton.setLayoutData(gridData);
-		}
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				// ConfigProcessViewDialog fd = new
-				// ConfigProcessViewDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
-				// config);
-				// ConfigProcessViewDialog.setDefaultImage(Display.getCurrent().getActiveShell().getImage());
-				IFilter filter = new ProcessViewFilter(config, null,
-						FilterConstants.ALL_ELEMENTS);
-				ConfigurationAddViewsDialog fd = new ConfigurationAddViewsDialog(
-						PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-								.getShell());
-				fd.setTypes(getTypes());
-				fd
-						.setTitle(AuthoringUIResources.ConfigProcessViewDialog_SelectCategories); 
-				fd.setInput(config);
-				fd.setFilter(filter);
-				fd.setExistingElements(config.getProcessViews());
-				fd.setContentProvider(new AdapterFactoryContentProvider(
-						TngAdapterFactory.INSTANCE
-								.getItemsFilter_AdapterFactory(filter)),
-								TngAdapterFactory.INSTANCE.getItemsFilter_ComposedAdapterFactory());
-				fd.setBlockOnOpen(true);
-				fd.open();
-				List views = fd.getSelectedItems();
-
-				// add view to configuration
-				for (Iterator itor = views.iterator(); itor.hasNext();) {
-					Object obj = itor.next();
-					if (obj instanceof ContentCategory) {
-
-						if (config.getProcessViews().contains(
-								(ContentCategory) obj)) {
-							String name = ((ContentCategory) obj).getName();
-							String title = AuthoringUIResources.configViewPageViewExistsDialog_title; 
-							String message = AuthoringUIResources.bind(AuthoringUIResources.configViewPageViewExistsDialog_message, name);
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayWarning(title, message);
-						} else {
-							boolean status = actionMgr
-							.doAction(
-									IActionManager.ADD,
-									config,
-									UmaPackage.eINSTANCE
-											.getMethodConfiguration_ProcessViews(),
-									(ContentCategory) obj, -1);
-							if(status){
-								addView((ContentCategory) obj);
-							}
-						}
-					}
-				}
-			}
-		});
-
-		// remove button
-		removeButton = toolkit
-				.createButton(
-						buttonPane,
-						AuthoringUIResources.configViewPage_removeViewButtonText, SWT.NONE); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			removeButton.setLayoutData(gridData);
-		}
-		removeButton.setEnabled(false);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeView();
-			}
-		});
-
-		// make default button
-		makeDefaultButton = toolkit
-				.createButton(
-						buttonPane,
-						AuthoringUIResources.configViewPage_makeDefaultButtonText, SWT.NONE); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			makeDefaultButton.setLayoutData(gridData);
-		}
-		makeDefaultButton.setEnabled(false);
-		makeDefaultButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				makeDefaultView();
-			}
-		});
-		
-		orderButton = toolkit.createButton(
-				buttonPane,
-				AuthoringUIResources.orderButton_text, SWT.NONE); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			removeButton.setLayoutData(gridData);
-		}
-		orderButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				ConfigurationOrderDialog dlg = new ConfigurationOrderDialog(
-						Display.getCurrent().getActiveShell(),
-						config,
-						getActionManager());
-				int ret = dlg.open();
-				if(ret == Window.OK) refresh();
-			}
-		});
-
-		toolkit.paintBordersFor(buttonPane);
-	}
-
-	/**
-	 * Remove the selected view
-	 * 
-	 */
-	private void removeView() {
-		CTabItem item = tabFolder.getSelection();
-		if (item == null)
-			return;
-		
-		// don't change default view if the view is not removed.
-		// 155025 - error when removing the view in configuration
-		String itemText = item.getText();		
-		String title = AuthoringUIResources.configViewPageRemoveViewDialog_title; 
-		String message = AuthoringUIResources.bind(AuthoringUIResources.configViewPageRemoveViewDialog_message, item 
-		.getText());
-		boolean ret = AuthoringUIPlugin.getDefault().getMsgDialog()
-				.displayConfirmation(title, message);
-
-		if (!ret) {
-			return;
-		}
-		
-		boolean removeDefault = false;
-		if (tabDefaultviewItem != null && item == tabDefaultviewItem) {
-			removeDefault = true;
-		}
-
-			List views = config.getProcessViews();
-			// if there is a default view tab, and it's the one slected to be removed
-			if (removeDefault) {
-				String defaultText = " " //$NON-NLS-1$
-					+ AuthoringUIResources.processDescription_default; 
-				int idx = itemText.lastIndexOf(defaultText);
-				if (idx > 0) {
-					itemText = itemText.substring(0,idx);
-				}
-			}
-			
-			for (Iterator itor = views.iterator(); itor.hasNext();) {
-				ContentCategory category = (ContentCategory) itor.next();
-				
-				if (category.getName().equals(itemText)) {
-					// remove it from views
-					actionMgr.doAction(IActionManager.REMOVE, config,
-							UmaPackage.eINSTANCE
-									.getMethodConfiguration_ProcessViews(),
-							category, -1);
-
-					ContentCategory defaultView = config.getDefaultView();
-
-					if ((defaultView != null) && (defaultView.equals(category))) {
-						if (views.size() > 0) {
-							actionMgr
-									.doAction(
-											IActionManager.SET,
-											config,
-											UmaPackage.eINSTANCE
-													.getMethodConfiguration_DefaultView(),
-											(ContentCategory) views.get(0), -1);
-						} else {
-							actionMgr
-									.doAction(
-											IActionManager.SET,
-											config,
-											UmaPackage.eINSTANCE
-													.getMethodConfiguration_DefaultView(),
-											null, -1);
-						}
-					}
-					// remove tab item
-					item.dispose();
-					break;
-				}
-			}
-
-		views = config.getProcessViews();
-		if ((views == null) || (views.size() <= 0)) {
-			removeButton.setEnabled(false);
-			makeDefaultButton.setEnabled(false);
-		}
-		
-		// make the 1st tab as the default view if the default one is removed
-		if (removeDefault) {
-			Control[] tabList = tabFolder.getTabList();
-			if (tabList != null && tabList.length > 0) {
-				tabFolder.setSelection(0);
-				makeDefaultView();
-			}
-		}
-	}
-
-	/**
-	 * Add view
-	 * 
-	 * @param obj
-	 */
-	private void addView(ContentCategory obj) {
-		selectedItem = obj;
-		Composite composite = new Composite(tabFolder, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		TreeViewer treeViewer = new TreeViewer(composite, SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER);
-		treeViewer.getTree().setLayout(new GridLayout());
-		treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		IFilter configFilter = new ConfigurationViewFilter(config, treeViewer);
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getConfigurationView_AdapterFactory(configFilter);
-
-		AdapterFactoryContentProvider contentProvider = new AdapterFactoryContentProvider(
-				adapterFactory) {
-			public Object[] getElements(Object object) {
-				// Get the adapter from the factory.
-				ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-						.adapt(selectedItem, ITreeItemContentProvider.class);
-
-				return itemProvider.getChildren(selectedItem).toArray();
-				// return itemProvider.getElements(selectedItem).toArray();
-			}
-		};
-
-		treeViewer.setContentProvider(contentProvider);
-		treeViewer.setLabelProvider(new ConfigurationLabelProvider(config,
-				adapterFactory));
-		try {
-			treeViewer.setInput(config);
-		} catch (Exception ex) {
-			logger.logError("Error creating treeviewer for config", ex); //$NON-NLS-1$
-		}
-
-		CTabItem item = new CTabItem(tabFolder, SWT.TOP);
-		item.setText(((ContentCategory) obj).getName());
-		item.setControl(composite);
-
-		// make all buttons enabled
-		removeButton.setEnabled(true);
-		makeDefaultButton.setEnabled(true);
-
-		toolkit.paintBordersFor(composite);
-		tabFolder.setSelection(item);
-	}
-
-	/**
-	 * Make selected as default view
-	 * 
-	 */
-	private void makeDefaultView() {
-		CTabItem item = tabFolder.getSelection();
-		List views = config.getProcessViews();
-		for (Iterator itor = views.iterator(); itor.hasNext();) {
-			ContentCategory category = (ContentCategory) itor.next();
-			if (category.getName().equals(item.getText())) {
-				clearDefaultViewIndicator();
-				// make that view default
-				actionMgr.doAction(IActionManager.SET, config,
-						UmaPackage.eINSTANCE
-								.getMethodConfiguration_DefaultView(),
-						category, -1);
-				setDefaultViewIndicator(item);
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Load initial data
-	 * 
-	 */
-	private void loadData() {
-		// get process views
-		List views = config.getProcessViews();
-		for (Iterator itor = views.iterator(); itor.hasNext();) {
-			// create view in UI
-			addView((ContentCategory) itor.next());
-		}
-
-		// get default view
-		ContentCategory defaultView = config.getDefaultView();
-		int cnt = tabFolder.getItemCount();
-		if (defaultView != null) {
-			// if default view is defined, select that view
-			CTabItem[] items = tabFolder.getItems();
-			for (int i = 0; i < items.length; i++) {
-				String name = items[i].getText();
-				if (name.equals(defaultView.getName())) {
-					tabFolder.setSelection(items[i]);
-					setDefaultViewIndicator(items[i]);
-					break;
-				}
-			}
-		} else if (cnt > 0) {
-			// else select first view
-			tabFolder.setSelection(0);
-		}
-	}
-	
-	private void refresh(){
-		ContentCategory defaultView = config.getDefaultView();
-		String defaultViewName = ""; //$NON-NLS-1$
-		if(defaultView!=null) {
-			defaultViewName = defaultView.getName();
-			clearDefaultViewIndicator();
-		}
-		String selectedView = tabFolder.getSelection().getText();
-		Map origViews = new HashMap();
-		for(int i=0;i<tabFolder.getItemCount();i++){
-			CTabItem item = tabFolder.getItem(i);
-			origViews.put(item.getText(), item.getControl());
-		}
-		List views = config.getProcessViews();
-		int index = 0;
-		int selectedIndex = 0;
-		for (Iterator itor = views.iterator(); itor.hasNext() && index<tabFolder.getItemCount();) {
-			String view = ((ContentCategory)itor.next()).getName();
-			CTabItem item = tabFolder.getItem(index++);
-			item.setText(view);
-			item.setControl((Control)origViews.get(view));
-			if(view.equals(defaultViewName)) setDefaultViewIndicator(item);
-			if(view.equals(selectedView)) selectedIndex = index-1;
-		}
-		tabFolder.setSelection(selectedIndex);
-	}
-
-	/**
-	 * This method removes the appended "(default)" from the tab for the default
-	 * view. This method must be called before changing the default view!
-	 */
-	private void clearDefaultViewIndicator() {
-		ContentCategory defaultView = config.getDefaultView();
-		if (defaultView != null) {
-			String defaultViewTabName = defaultView.getName()
-					+ " " //$NON-NLS-1$
-					+ AuthoringUIResources.processDescription_default; 
-			CTabItem[] items = tabFolder.getItems();
-			for (int i = 0; i < items.length; i++) {
-				String name = items[i].getText();
-				if (name.equals(defaultViewTabName)) {
-					items[i].setText(defaultView.getName());
-				}
-			}
-		}
-	}
-	
-	/**
-	 * This method appends "(default)" to the tab of the default view.
-	 */
-	private void setDefaultViewIndicator(CTabItem item) {
-		tabDefaultviewItem = item;
-		
-		String name = item.getText()
-				+ " " //$NON-NLS-1$
-				+ AuthoringUIResources.processDescription_default; 
-		item.setText(name);
-	}
-
-	private String[] getTypes() {
-		String[] Categories = new String[] { FilterConstants.CUSTOM_CATEGORIES,
-				FilterConstants.ALL_ELEMENTS, FilterConstants.DISCIPLINES,
-				FilterConstants.DOMAINS, FilterConstants.ROLESETS,
-				FilterConstants.WORKPRODUCTTYPES, FilterConstants.TOOLS };
-		return Categories;
-	}
-	
-	protected IActionManager getActionManager() {
-		return actionMgr;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationDescription.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationDescription.java
deleted file mode 100644
index 4e8aafb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationDescription.java
+++ /dev/null
@@ -1,323 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ConfigurationEditor;
-import org.eclipse.epf.authoring.ui.editors.ConfigurationEditorInput;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.views.ConfigurationView;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * The Description page in the Configuration editor.
- * 
- * @author Shashidhar Kannoori
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationDescription extends FormPage implements IRefreshable {
-
-	private static final String FORM_PREFIX = AuthoringUIResources.ConfigurationDescriptionFormPrefix; 
-
-	private MethodConfiguration config = null;
-
-	private ScrolledForm form = null;
-
-	private Text nameText;
-
-	private Text despText;
-
-	private ModifyListener modelModifyListener;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationDescription(FormEditor editor) {
-		super(
-				editor,
-				AuthoringUIResources.ConfigurationDescriptionDescription, AuthoringUIResources.ConfigurationDescriptionDescription); 
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		setSite(site);
-		setInput(input);
-		ConfigurationEditorInput configInput = (ConfigurationEditorInput) input;
-		config = configInput.getConfiguration();
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		form = managedForm.getForm();
-		form.setText(FORM_PREFIX + config.getName());
-		FormToolkit toolkit = managedForm.getToolkit();
-
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-
-		Section genSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		createGeneralContent(toolkit, genSection);
-
-		addListeners();
-	}
-
-	/**
-	 * Create general content for the description page
-	 * @param toolkit
-	 * @param section
-	 */
-	public void createGeneralContent(FormToolkit toolkit, Section section) {
-		section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		section.setText(AuthoringUIResources.ConfigurationDescriptionGeneralInfo); 
-		section
-				.setDescription(AuthoringUIResources.ConfigurationDescriptionDescription_text); 
-
-		Composite sectionClient = toolkit.createComposite(section);
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 2;
-		sectionClient.setLayout(layout);
-
-		toolkit
-				.createLabel(
-						sectionClient,
-						AuthoringUIResources.ConfigurationDescriptionName, SWT.NONE); 
-		nameText = toolkit.createText(sectionClient, "", SWT.NONE); //$NON-NLS-1$
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		nameText.setLayoutData(td);
-		nameText.setText(config.getName());
-
-		Label despLabel = toolkit
-				.createLabel(
-						sectionClient,
-						AuthoringUIResources.ConfigurationDescriptionDescriptionLabel, SWT.NONE); 
-		TableWrapData twd0 = new TableWrapData();
-		despLabel.setLayoutData(twd0);
-
-		despText = toolkit.createText(sectionClient,
-				"", SWT.NONE | SWT.MULTI | SWT.V_SCROLL | SWT.WRAP); //$NON-NLS-1$
-		TableWrapData twd = new TableWrapData(TableWrapData.FILL_GRAB);
-		twd.heightHint = 50;
-		despText.setLayoutData(twd);
-		despText.setText(config.getBriefDescription());
-
-		section.setClient(sectionClient);
-		toolkit.paintBordersFor(sectionClient);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				sectionClient.getParent(), AuthoringUIHelpContexts.CONFIGURATION_EDITOR_ALL_CONTEXT); 
-
-		Display display = form.getBody().getDisplay();
-		if (!(display == null || display.isDisposed())) {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					nameText.setFocus();
-					nameText.setSelection(0, nameText.getText().length());
-				}
-			});
-		}
-	}
-
-	private void addListeners() {
-		final ConfigurationEditor editor = (ConfigurationEditor) getEditor();
-		modelModifyListener = editor.createModifyListener(config);
-
-		actionMgr = ((ConfigurationEditor) getEditor()).getActionManager();
-
-		nameText.addModifyListener(modelModifyListener);
-		nameText.addFocusListener(new FocusAdapter() {
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.FocusAdapter#focusGained(org.eclipse.swt.events.FocusEvent)
-			 */
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getNamedElement_Name());
-			}
-			
-			public void focusLost(FocusEvent e) {
-				String oldContent = config.getName();
-				final MethodConfiguration iConfig = config;
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				if (isTextNonEmpty(nameText)) {
-					String name = nameText.getText();
-					
-					// 178462
-					String msg = null;
-					if (oldContent.indexOf("&") < 0 && name.indexOf("&") > -1) { //$NON-NLS-1$ //$NON-NLS-2$
-						msg = NLS
-								.bind(
-										LibraryEditResources.invalidElementNameError4_msg,
-										name);
-					} else {
-						IValidator validator = IValidatorFactory.INSTANCE
-								.createNameValidator(config.eContainer(),
-										config);
-						msg = validator.isValid(name);
-					}
-					
-					if (msg != null) {
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										AuthoringUIResources.renameDialog_title, 
-										msg);
-						nameText.getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								nameText.setText(iConfig.getName());
-								nameText.selectAll();
-								nameText.setFocus();
-							}
-						});
-						return;
-					}
-					name = name.trim();			//166755
-					
-					if (!name.equals(config.getName())) {
-						boolean status = actionMgr.doAction(IActionManager.SET,
-								config, UmaPackage.eINSTANCE
-										.getNamedElement_Name(), name, -1);
-						if (status) {
-							Resource resource = config.eResource();
-							if(resource != null && resource != config.eContainer().eResource()) {
-								editor.addResourceToAdjustLocation(config.eResource());
-							}
-							form.setText(FORM_PREFIX + config.getName());
-							nameText.setText(name);
-						}
-					}
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayError(
-									AuthoringUIResources.renameDialog_title, 
-									AuthoringUIResources.bind(AuthoringUIResources.emptyElementNameError_msg, StrUtil.toLower(LibraryUIText.TEXT_METHOD_CONFIGURATON))); 
-					nameText.setText(config.getName());
-					nameText.getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							nameText.setFocus();
-							nameText.setSelection(0, nameText.getText()
-									.length());
-						}
-					});
-				}
-			}
-
-		});
-
-		despText.addModifyListener(modelModifyListener);
-		despText.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = config.getBriefDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String desc1 = despText.getText();
-				if (!desc1.equals(config.getBriefDescription())) {
-					actionMgr.doAction(IActionManager.SET, config,
-							UmaPackage.eINSTANCE
-									.getMethodElement_BriefDescription(),
-							desc1, -1);
-				}
-			}
-		});
-	}
-
-	/**
-	 * Returns <code>true</code> if the given Text control contain characters
-	 * other than spaces.
-	 * 
-	 * @param text
-	 *            The Text control.
-	 * @return <code>true</code> if the given Text control contain characters
-	 *         other than spaces.
-	 */
-	private static boolean isTextNonEmpty(Text t) {
-		String s = t.getText();
-		if ((s != null) && (s.trim().length() > 0))
-			return true;
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.IRefreshable#refreshName(java.lang.String)
-	 */
-	public void refreshName(String newName) {
-		if (newName != null) {
-			if ((nameText != null) && !(nameText.isDisposed())) {
-				nameText.removeModifyListener(modelModifyListener);
-				nameText.setText(newName);
-				nameText.addModifyListener(modelModifyListener);
-				form.setText(FORM_PREFIX + config.getName());
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationPage.java
deleted file mode 100644
index 506ca3b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationPage.java
+++ /dev/null
@@ -1,1832 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IViewerNotification;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ConfigurationEditor;
-import org.eclipse.epf.authoring.ui.editors.ConfigurationEditorInput;
-import org.eclipse.epf.authoring.ui.providers.CategoryContentProvider;
-import org.eclipse.epf.authoring.ui.providers.CategoryLabelProvider;
-import org.eclipse.epf.authoring.ui.providers.CategoryTreeFilter;
-import org.eclipse.epf.authoring.ui.util.AuthoringAccessibleListener;
-import org.eclipse.epf.authoring.ui.util.ConfigurationMarkerHelper;
-import org.eclipse.epf.authoring.ui.views.CategoryTreeViewerWrapper;
-import org.eclipse.epf.authoring.ui.views.ConfigurationViewer;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationData;
-import org.eclipse.epf.library.configuration.closure.ClosureListener;
-import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
-import org.eclipse.epf.library.configuration.closure.ElementDependencyError;
-import org.eclipse.epf.library.configuration.closure.IConfigurationError;
-import org.eclipse.epf.library.edit.IPluginUIPackageContextChangedListener;
-import org.eclipse.epf.library.edit.PluginUIPackageContext;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.navigator.ContentItemProvider;
-import org.eclipse.epf.library.edit.navigator.MethodPackagesItemProvider;
-import org.eclipse.epf.library.edit.navigator.PluginUIPackagesItemProvider;
-import org.eclipse.epf.library.edit.navigator.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ConfigurationUtil;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-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.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-/**
- * The Configuration page in the Method Configuration editor.
- * 
- * @author Shashidhar Kannoori
- * @author Jinhua Xi
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ConfigurationPage extends FormPage implements ISelectionProvider {
-	MethodConfiguration config = null;
-
-	ConfigurationClosure closure = null;
-
-	ConfigurationViewer treeViewer;
-
-	ConfigPackageContentProvider contProvider;
-
-	ISelectionChangedListener selectionChangedListener = null;
-	
-	protected CategoryTreeViewerWrapper addCategoryViewer;
-	
-	protected CategoryTreeViewerWrapper subCategoryViewer;
-	
-	protected CategoryTreeFilter addCategoryTreeFilter;
-
-	protected CategoryTreeFilter subCategoryTreeFilter;
-
-	ScrolledForm form = null;
-
-	boolean isDirty = false;
-	
-	private boolean needUpdate = false;
-
-	private String formPrefix = AuthoringUIResources.ConfigurationPage_FormPrefix; 
-
-	// private EObject currentRootNode;
-	private ArrayList expandedElements = new ArrayList();
-
-	// private Text ctrl_name;
-
-	// private Text ctrl_brief_desc;
-
-	private List modifiedElements = new ArrayList();
-
-	private Button closureButton;
-
-	private Button fixWarningButton;
-
-	private Button refreshButton;
-
-	// private Button dependentButton;
-
-	private Button hideButton;
-
-	// private Text despText;
-
-	private Text elemDespContentText;
-
-	// private Text nameText;
-
-	protected Collection selectionChangedListeners = new ArrayList();
-
-	// private ISelectionChangedListener parentSelectionChangedListener = null;
-
-	protected ISelection currentSelection = StructuredSelection.EMPTY;
-
-	private static final ConfigurationMarkerHelper markerHelper = ConfigurationMarkerHelper.INSTANCE;
-
-	ISelectionChangedListener msgViewListener = null;
-
-	private ConfigTreeFilter configFilter;
-
-	private IActionManager actionMgr;
-
-	private ILibraryChangeListener libListener = null;
-
-	protected Adapter configurationChangedListener = null;
-
-	private static final ClosureListener closureListener = new ClosureListener() {
-		@Override
-		public void errorAdded(MethodConfiguration config, IConfigurationError error) {
-			markerHelper.createMarker(config, error);
-		}
-
-		@Override
-		public void errorRemoved(MethodConfiguration config, IConfigurationError error) {
-			markerHelper.deleteMarker(config, error);
-		}
-
-		@Override
-		public void errorUpdated(MethodConfiguration config, IConfigurationError error) {
-			markerHelper.adjustMarker(null, config, error);
-		}
-	};
-
-	private IPluginUIPackageContextChangedListener layoutListener = new IPluginUIPackageContextChangedListener() {
-		public void layoutChanged(boolean isFlat) {
-			refreshViewers();
-		}
-	};
-
-	/**
-	 * Creates an instance
-	 * @param editor
-	 */
-	public ConfigurationPage(FormEditor editor) {
-		super(
-				editor,
-				AuthoringUIResources.ConfigurationPage_Description1, AuthoringUIResources.ConfigurationPage_Description2); 
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		setSite(site);
-		setInput(input);
-
-		ConfigurationEditorInput configInput = (ConfigurationEditorInput) input;
-		config = configInput.getConfiguration();
-		actionMgr = ((ConfigurationEditor) getEditor()).getActionManager();
-
-		
-		configurationChangedListener = new AdapterImpl() {
-			public void notifyChanged(
-					org.eclipse.emf.common.notify.Notification msg) {
-				// System.out.println("$$$ catched modify config notification =
-				// " + msg);
-				int type = msg.getEventType();
-				if (	type == org.eclipse.emf.common.notify.Notification.ADD
-						|| type == org.eclipse.emf.common.notify.Notification.ADD_MANY
-						|| type == org.eclipse.emf.common.notify.Notification.REMOVE
-						||   type == org.eclipse.emf.common.notify.Notification.REMOVE_MANY) {					
-					needUpdate = true;
-					
-//					This was done to refresh configuration plugin-package section page. But its not perfect
-//					solution. Doesnt cover all the scenarios. So commenting it out.
-//					Will have to think of alternate way to refresh plugin/package configuration page.
-//					Low Priority
-//						|| type == org.eclipse.emf.common.notify.Notification.REMOVE
-//						|| type == org.eclipse.emf.common.notify.Notification.REMOVE_MANY ) {
-//					
-					
-//					if (treeViewer != null)	{
-//						treeViewer.refresh();
-//						updateCheckStates();
-//						showErrors();
-//					}
-				}
-			}
-		};
-		config.eAdapters().add(configurationChangedListener);
-
-	}
-
-	private void reInitializeConfigFactory() {
-		// the following may not be the most efficient way
-		// need a fast way to update the closure
-//		System.out.println("$$$ reInit closure for config add notification!");
-
-		createConfigurationClosure();
-		ConfigTreeFilter old = configFilter;
-		configFilter = new ConfigTreeFilter(closure);
-		if (treeViewer !=  null && old != null) {
-			treeViewer.removeFilter(old);
-		}
-		treeViewer.addFilter(configFilter);
-	}
-
-	/**
-	 * Set input for connfiguration viewer
-	 * @param input
-	 */
-	public void setInput(Object input) {
-		treeViewer.setInput(input);
-		addCategoryViewer.setRoot(input);
-		subCategoryViewer.setRoot(input);
-
-		// initially expand the whole tree before updating the tree
-		// this is a workaround for the content provider to build the child -
-		// parent lookup map
-		treeViewer.expandAll();
-		treeViewer.collapseAll();
-		addCategoryViewer.expandAll();
-		addCategoryViewer.collapseAll();
-		subCategoryViewer.expandAll();
-		subCategoryViewer.collapseAll();
-		
-		// update the tree with the default closure selection
-		updateCheckStates();
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// create form toolkit
-		form = managedForm.getForm();
-		form.setText(formPrefix + config.getName());
-		FormToolkit toolkit = managedForm.getToolkit();
-
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-
-		Section treeSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		createTreeContent(toolkit, treeSection);
-		
-		addListeners();
-
-		// finally set the input.
-		// RootContent inputNode = new RootContent(closure
-		// .getConfigurationFactory().getMethodPlugins());
-		setInput(LibraryService.getInstance().getCurrentMethodLibrary());
-		
-		initializeCategoriesViewers();
-
-	}
-	
-	/**
-	 * Create tree content
-	 * @param toolkit
-	 * @param section
-	 */
-	public void createTreeContent(FormToolkit toolkit, Section section) {
-		section.setText(AuthoringUIResources.ConfigurationPage_ConfigContent); 
-		section
-				.setDescription(AuthoringUIResources.ConfigurationPage_ConfigContentDescription); 
-		section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-		Composite sectionClient = toolkit.createComposite(section);
-		section.setClient(sectionClient);
-		GridLayout gl = new GridLayout();
-		sectionClient.setLayout(gl);
-		gl.numColumns = 6;
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				sectionClient.getParent(),
-				AuthoringUIHelpContexts.CONFIGURATION_EDITOR_ALL_CONTEXT);
-
-		Composite buttonComposite = toolkit.createComposite(sectionClient);
-		{
-			GridLayout gridLayout = new GridLayout();
-			gridLayout.numColumns = 6;
-			buttonComposite.setLayout(gridLayout);
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.horizontalSpan = 6;
-			gridData.horizontalAlignment = 3;
-			buttonComposite.setLayoutData(gridData);
-
-		}
-
-		hideButton = toolkit.createButton(buttonComposite, "", SWT.PUSH //$NON-NLS-1$
-				| GridData.HORIZONTAL_ALIGN_END);
-		hideButton.setImage(AuthoringUIPlugin.getDefault().getSharedImage(
-				"hideUncheckedElem.gif")); //$NON-NLS-1$
-		hideButton.setToolTipText(AuthoringUIResources.ConfigurationPage_hideToolTip); 
-		hideButton.setLayoutData(new GridData(GridData.END));
-		hideButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-				AuthoringUIResources.ConfigurationPage_hideToolTip));
-		
-		fixWarningButton = toolkit.createButton(buttonComposite, "", SWT.PUSH); //$NON-NLS-1$
-		fixWarningButton.setImage(AuthoringUIPlugin.getDefault()
-				.getSharedImage("addref_co.gif")); //$NON-NLS-1$
-		fixWarningButton.setToolTipText(AuthoringUIResources.ConfigurationPage_AddMissingToolTip); 
-		fixWarningButton.setLayoutData(new GridData(GridData.END));
-		fixWarningButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-				AuthoringUIResources.ConfigurationPage_AddMissingToolTip));
-
-		// Add the closure button.
-		closureButton = toolkit.createButton(buttonComposite, "", SWT.PUSH); //$NON-NLS-1$
-		closureButton.setImage(AuthoringUIPlugin.getDefault().getSharedImage(
-				"closure_co.gif")); //$NON-NLS-1$
-		closureButton.setToolTipText(AuthoringUIResources.ConfigurationPage_MakeClosureToolTip); 
-		closureButton.setLayoutData(new GridData(GridData.END));
-		closureButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-				AuthoringUIResources.ConfigurationPage_MakeClosureToolTip));
-		// closureButton.setText("");
-
-		refreshButton = toolkit.createButton(buttonComposite, "", SWT.PUSH); //$NON-NLS-1$
-		refreshButton.setImage(AuthoringUIImages.IMG_REFRESH);
-		refreshButton.setToolTipText(AuthoringUIResources.refreshButton_text);
-		{
-			GridData gd = new GridData(GridData.END
-					| GridData.HORIZONTAL_ALIGN_END);
-			gd.horizontalAlignment = 3;
-			gd.horizontalSpan = 1;
-			refreshButton.setLayoutData(gd);
-		}
-		refreshButton.getAccessible().addAccessibleListener(new AuthoringAccessibleListener(
-				AuthoringUIResources.refreshButton_text));
-
-		// Create Viewer and Handle Listener for the viewer.
-		createViewers(toolkit, sectionClient);
-
-		Label elemDespLabel = toolkit
-				.createLabel(sectionClient, AuthoringUIResources.ConfigurationPage_Description); 
-		GridData gd1 = new GridData();
-		gd1.horizontalSpan = 6;
-		elemDespLabel.setLayoutData(gd1);
-
-		elemDespContentText = toolkit.createText(sectionClient, "", SWT.NONE //$NON-NLS-1$
-				| SWT.MULTI | SWT.READ_ONLY | SWT.WRAP);
-		GridData gd2 = new GridData(GridData.FILL_BOTH);
-		gd2.grabExcessHorizontalSpace = true;
-		gd2.horizontalSpan = 6;
-		gd2.heightHint = 50;
-
-		toolkit.paintBordersFor(sectionClient);
-		toolkit.paintBordersFor(buttonComposite);
-		elemDespContentText.setLayoutData(gd2);
-		
-		// set text widget to Category viewers so they can update description field
-		addCategoryViewer.setTextWidget(elemDespContentText);
-		subCategoryViewer.setTextWidget(elemDespContentText);
-
-		hideButton.setEnabled(true);
-		hideButton.setVisible(true);
-		refreshButton.setEnabled(true);
-		refreshButton.setVisible(true);
-		fixWarningButton.setEnabled(true);
-		fixWarningButton.setVisible(true);
-		closureButton.setEnabled(true);
-		closureButton.setVisible(true);
-	}
-	
-	private void createConfigurationClosure() {
-		// refresh configuration from editor
-		//
-		FormEditor editor = getEditor();
-		if(editor != null) {
-			IEditorInput input = editor.getEditorInput();
-			if(input instanceof ConfigurationEditorInput) {
-				config = ((ConfigurationEditorInput)input).getConfiguration();
-			}
-		}
-		
-		closure = new ConfigurationClosure(actionMgr, config);
-		closure.addListener(closureListener);
-	}
-
-	/**
-	 * Initialize configuration factory
-	 */
-	public void initializeConfigFactory() {
-		// loading the configuration closure might be slow,
-		// display a progress bar
-		org.eclipse.epf.library.edit.util.IRunnableWithProgress runnable = new org.eclipse.epf.library.edit.util.IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				createConfigurationClosure();
-			}
-
-		};
-
-		UserInteractionHelper.runWithProgress(runnable, AuthoringUIResources.ConfigurationPage_LoadingMessage); 
-
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getNavigatorView_ComposedAdapterFactory();
-		// AdapterFactory adapterFactory = configFactory.getAdapterFactory();
-		contProvider = new ConfigPackageContentProvider(//configFactory,
-				adapterFactory);
-		treeViewer.setContentProvider(contProvider);
-		treeViewer
-				.setLabelProvider(new ConfigPackageLabelProvider(contProvider));
-
-		configFilter = new ConfigTreeFilter(closure);
-		treeViewer.addFilter(configFilter);
-		
-		addCategoryTreeFilter = new CategoryTreeFilter(addCategoryViewer);
-		addCategoryViewer.addTreeFilter(addCategoryTreeFilter);
-		subCategoryTreeFilter = new CategoryTreeFilter(subCategoryViewer);
-		subCategoryViewer.addTreeFilter(subCategoryTreeFilter);
-		
-	}
-	
-	private void initializeCategoriesViewers() {
-		// read from config and check the appropriate items in the CC viewers
-    	List addCats = new ArrayList(config.getAddedCategory());
-    	initializeCCViewer(addCategoryViewer, addCats);
-    	List subCats = new ArrayList(config.getSubtractedCategory());
-    	initializeCCViewer(subCategoryViewer, subCats);
-    	
-		addCategoryViewer.aboutToOpen();
-		subCategoryViewer.aboutToOpen();
-	}
-	
-	private void initializeCCViewer(CategoryTreeViewerWrapper viewer, List elements) {
-		if (!elements.isEmpty())
-			viewer.updateSelections(elements);
-	}
-
-	private void createViewers(FormToolkit toolkit, Composite sectionClient) {
-		Label treeTitleLabel = toolkit.createLabel(sectionClient,
-				AuthoringUIResources.ConfigurationPage_TreeTitleLabel);
-		{
-			GridData gd = new GridData(GridData.BEGINNING
-					| GridData.VERTICAL_ALIGN_END);
-			treeTitleLabel.setLayoutData(gd);
-			gd.horizontalSpan = 1;
-		}
-
-		Label addCCTitleLabel = toolkit.createLabel(sectionClient,
-				AuthoringUIResources.ConfigurationPage_AddCategoriesTitleLabel);
-		{
-			GridData gd = new GridData(GridData.BEGINNING
-					| GridData.VERTICAL_ALIGN_END);
-			addCCTitleLabel.setLayoutData(gd);
-			gd.horizontalSpan = 1;
-		}
-		sectionClient.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout(2, true);
-		sectionClient.setLayout(layout);
-		// create the library tree viewer
-		treeViewer = new ConfigurationViewer(sectionClient);
-		// treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH
-					| GridData.GRAB_HORIZONTAL);
-			gridData.heightHint = 200;
-			gridData.verticalSpan = 3;
-			treeViewer.getTree().setLayoutData(gridData);
-		}
-
-		addCategoryViewer = new CategoryTreeViewerWrapper(sectionClient, 200,
-				LibraryService.getInstance().getCurrentMethodLibrary(),
-				new CategoryContentProvider(TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory(), config),
-				new CategoryLabelProvider(TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()), config);
-
-		Label subCCTitleLabel = toolkit.createLabel(sectionClient,
-				AuthoringUIResources.ConfigurationPage_SubCategoriesTitleLabel);
-		{
-			GridData gd = new GridData(GridData.BEGINNING
-					| GridData.VERTICAL_ALIGN_END);
-			subCCTitleLabel.setLayoutData(gd);
-			gd.horizontalSpan = 1;
-		}
-		subCategoryViewer = new CategoryTreeViewerWrapper(sectionClient, 200,
-				LibraryService.getInstance().getCurrentMethodLibrary(),
-				new CategoryContentProvider(TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory(), config),
-				new CategoryLabelProvider(TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()), config);
-
-		
-		// add listener so the 2 Category viewers are in sync
-		// that is, when an item is checked in one, it is unchecked in the other
-		addCategoryViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(final CheckStateChangedEvent event) {
-				//Potentially long operation - show a busy cursor
-				BusyIndicator.showWhile(subCategoryViewer.getTree().getDisplay(), new Runnable() {
-					public void run() {
-						if (event.getChecked())
-							subCategoryViewer.selectTreeCheck(event.getElement(), false);
-					}
-				});
-			}
-		});
-
-		subCategoryViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(final CheckStateChangedEvent event) {
-				//Potentially long operation - show a busy cursor
-				BusyIndicator.showWhile(addCategoryViewer.getTree().getDisplay(), new Runnable() {
-					public void run() {
-						if (event.getChecked())
-							addCategoryViewer.selectTreeCheck(event.getElement(), false);
-					}
-				});
-			}
-		});
-		
-		initializeConfigFactory();
-	}
-
-	private void addListeners() {
-		addEditorSetFocusLiseners();		
-		
-		// nameText.addFocusListener(new FocusAdapter() {
-		// public void focusLost(FocusEvent e) {
-		// if (isTextNonEmpty(nameText)) {
-		// String name = StrUtil.makeValidFileName(nameText.getText());
-		// if (!name.equals(config.getName())) {
-		// actionMgr.doAction(IActionManager.SET, config,
-		// UmaPackage.eINSTANCE.getNamedElement_Name(),
-		// name, -1);
-		// form.setText(formPrefix + config.getName());
-		// nameText.setText(name);
-		// }
-		// } else {
-		// // Display a warning dialog for empty Name.
-		// nameText.setText(config.getName());
-		// MessageDialog.openWarning(PlatformUI.getWorkbench()
-		// .getActiveWorkbenchWindow().getShell(),
-		// "Enter Configuration Name",
-		// "Name field cannot be empty!");
-		// }
-		// // config.setName(StrUtil.makeValidFileName(nameText.getText()));
-		// // form.setText(formPrefix + config.getName());
-		// }
-		// });
-		// despText.addFocusListener(new FocusAdapter() {
-		// public void focusLost(FocusEvent e) {
-		// // config.setBriefDescription(StrUtil.getPlainText(despText
-		// // .getText()));
-		// String desc1 = despText.getText();
-		// if (!desc1.equals(config.getBriefDescription())) {
-		// actionMgr.doAction(IActionManager.SET, config,
-		// UmaPackage.eINSTANCE
-		// .getMethodElement_BriefDescription(),
-		// desc1, -1);
-		// }
-		// }
-		// });
-		closureButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				
-				BusyIndicator.showWhile(form.getDisplay(), new Runnable() {
-					public void run() {
-						makeClosure();
-					}
-				});
-			};
-		});
-		fixWarningButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				BusyIndicator.showWhile(form.getDisplay(), new Runnable() {
-					public void run() {
-						fixWarning();
-					}
-				});				
-			};
-		});
-		refreshButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				BusyIndicator.showWhile(form.getDisplay(), new Runnable() {
-					public void run() {
-						showErrors();
-					}
-				});				
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		hideButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				showHideElements();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		treeViewer.addTreeListener(new ITreeViewerListener() {
-			public void treeCollapsed(TreeExpansionEvent event) {
-				Object element = event.getElement();
-				expandedElements.remove(element);
-			}
-
-			public void treeExpanded(TreeExpansionEvent event) {
-				Object element = event.getElement();
-				expandedElements.add(element);
-
-				// // this is a quick dirty fix for check state initialize issue
-				// // better solution later. jxi 07/01/05
-				// updateTree();
-				//				
-				// // restore the check state of the UI elements
-				// Object obj = event.getElement();
-				// boolean parentState = treeViewer.getChecked(obj);
-				//				
-				// ConfigPackageContentProvider cp =
-				// (ConfigPackageContentProvider)treeViewer.getContentProvider();
-				// Object[] children = cp.getChildren(obj);
-				// if ( children != null )
-				// {
-				// for ( int i = 0; i < children.length; i++)
-				// {
-				// boolean check = false;
-				// // if the folder is a UI folder, keep the check state
-				// if ( children[i] instanceof MethodPlugin )
-				// {
-				// check =
-				// config.getMethodPluginSelection().contains(children[i]);
-				// }
-				// else if ( children[i] instanceof MethodPackage )
-				// {
-				// check =
-				// config.getMethodPackageSelection().contains(children[i]);
-				// }
-				// else
-				// {
-				// check = parentState;
-				// }
-				//						
-				// boolean ret = treeViewer.setChecked(children[i], check);
-				// if ( ret == false)
-				// {
-				// System.out.println("Can't set state");
-				// }
-				//
-				// }
-				// }
-			}
-		});
-
-		// listen to the selection change of the current tree viewer
-		if (selectionChangedListener == null) {
-			// Create the listener
-			selectionChangedListener = new ISelectionChangedListener() {
-				// This just notifies those things that are affected by the
-				// section.
-				//
-				public void selectionChanged(SelectionChangedEvent event) {
-//					System.out
-//							.println(AuthoringUIResources.ConfigurationPage_Selected + event.getSelection()); //$NON-NLS-1$
-					setSelection(event.getSelection());
-				}
-			};
-
-			treeViewer.addSelectionChangedListener(selectionChangedListener);
-		}
-
-		// add a check state change listener
-		treeViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent evt) {
-				
-				final CheckStateChangedEvent event = evt;
-				BusyIndicator.showWhile(form.getDisplay(), new Runnable() {
-					public void run() {
-				
-				// BEGIN
-				modifiedElements = new ArrayList();
-				boolean checked = event.getChecked();
-				updateCheckStates(event.getElement(), checked);
-
-				/*
-				 * // save the previous invalid elements List invalid =
-				 * closure.getInvalidElements();
-				 * 
-				 * closure.setSelections(treeViewer.getCheckedElements());
-				 * 
-				 * if ( configFilter.isHiding() ) { treeViewer.refresh(); } else { //
-				 * get the new error elements, add to the previous error
-				 * elements, // and update them to update the error/warning
-				 * images invalid.addAll(closure.getInvalidElements()); // also
-				 * add the UI folders ConfigPackageContentProvider cp =
-				 * (ConfigPackageContentProvider)treeViewer.getContentProvider();
-				 * invalid.addAll(cp.getUIElements());
-				 * 
-				 * treeViewer.update(invalid.toArray(), null); }
-				 */
-				
-				// need to save the config before showing error
-				// since the error handling needs to check the config
-				boolean saved = saveConfiguration();
-				refreshCategoryViewers();
-				saved = saved & saveContentCategorySelectionsToConfiguration();
-				showErrors();
-				
-				if (!saved) {
-					updateCheckStates(event.getElement(), false);
-
-					for (int i = 0; i < modifiedElements.size(); i++) {
-						treeViewer.setChecked(modifiedElements.get(i), false);
-					}
-
-				}
-				
-				// END
-					}
-				});
-				
-			}
-		});
-		
-		ICheckStateListener catsCheckStateListener = new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				
-				BusyIndicator.showWhile(form.getDisplay(), new Runnable() {
-					public void run() {
-				
-						saveContentCategorySelectionsToConfiguration();
-						
-						// update the closure error
-						showErrors();
-					}
-				});
-			}
-		};
-		
-		addCategoryViewer.addCheckStateListener(catsCheckStateListener);
-		subCategoryViewer.addCheckStateListener(catsCheckStateListener);
-
-		// treeViewer.addTreeListener(new ITreeViewerListener(){
-		//
-		// public void treeCollapsed(TreeExpansionEvent event) {
-		//				
-		// }
-		//
-		// public void treeExpanded(TreeExpansionEvent event) {
-		// //updateConfigSelection();
-		//
-		// // restore the check state of the UI elements
-		// Object obj = event.getElement();
-		// boolean parentState = treeViewer.getChecked(obj);
-		//				
-		// ConfigPackageContentProvider cp =
-		// (ConfigPackageContentProvider)treeViewer.getContentProvider();
-		// Object[] children = cp.getChildren(obj);
-		// if ( children != null )
-		// {
-		// for ( int i = 0; i < children.length; i++)
-		// {
-		// boolean check = false;
-		// // if the folder is a UI folder, keep the check state
-		// if ( children[i] instanceof MethodPlugin )
-		// {
-		// check = config.getMethodPluginSelection().contains(children[i]);
-		// }
-		// else if ( children[i] instanceof MethodPackage )
-		// {
-		// check = config.getMethodPackageSelection().contains(children[i]);
-		// }
-		// else
-		// {
-		// check = parentState;
-		// }
-		//						
-		// boolean ret = treeViewer.setChecked(children[i], check);
-		// if ( ret == false)
-		// {
-		// System.out.println("Can't set state");
-		// }
-		//
-		// }
-		// }
-		//				
-		// }});
-
-		// listen to the library changes and automatically update the
-		// configuration view
-		libListener = new ILibraryChangeListener() {
-			public void libraryChanged(int option, Collection changedItems) {
-				// for performance reason, we should not response to every
-				// library change
-				// only cover package and plugin changes
-				if (option == ILibraryChangeListener.OPTION_DELETED
-						|| option == ILibraryChangeListener.OPTION_NEWCHILD
-						|| option == ILibraryChangeListener.OPTION_NEWCHILD) {
-					if (changedItems != null && changedItems.size() > 0) {
-						Object o = changedItems.toArray()[0];
-						if (o instanceof MethodPlugin
-								|| o instanceof ProcessComponent
-								|| o instanceof MethodPackage
-								|| o instanceof CustomCategory) {
-							reInitializeConfigFactory();
-							refreshViewers();
-							updateCheckStates();
-							showErrors();
-						}
-					}
-				}
-			}
-		};
-
-		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.addListener(libListener);
-		}
-		
-		// listen to plugin presentation layout changes
-		PluginUIPackageContext.INSTANCE.addListener(layoutListener);
-	}
-
-	protected void showHideElements() {
-		configFilter.setHide();
-		addCategoryTreeFilter.toggleHideUnchecked();
-		subCategoryTreeFilter.toggleHideUnchecked();
-//		initializeCCViewers();
-		refreshViewers();
-		updateCheckStates(); // neded to have this to update the check status
-	}
-
-	/**
-	 * the UI selections contains UI folders, need to convert to the
-	 * corresponding method element selections
-	 * 
-	 * @return Object[] the converted selections
-	 */
-	protected Object[] getConvertedSelections() {
-		List items = new ArrayList();
-		Object[] sels = treeViewer.getCheckedElements();
-
-		ConfigPackageContentProvider cp = (ConfigPackageContentProvider) treeViewer
-				.getContentProvider();
-		for (int i = 0; i < sels.length; i++) {
-			Object sel = cp.getUITargetElement(sels[i]);
-			if (sel != null && !items.contains(sel)) {
-				items.add(sel);
-			}
-		}
-
-		return items.toArray();
-	}
-
-	protected void showErrors() {
-		// ConfigurationClosure c = closure;
-		// c.setSelections(treeViewer.getCheckedElements());
-
-		// save the previous invalid elements
-		List invalid = closure.getInvalidElements();
-
-		// convert selections to method plugins and method packages
-		//closure.setSelections(getConvertedSelections());
-		closure.checkError();
-		
-		if (configFilter.isHiding()) {
-			treeViewer.refresh();
-		} else {
-			// get the new error elements, add to the previous error elements,
-			// and update them to update the error/warning images
-			invalid.addAll(closure.getInvalidElements());
-
-			// also add the UI folders
-			ConfigPackageContentProvider cp = (ConfigPackageContentProvider) treeViewer
-					.getContentProvider();
-			invalid.addAll(cp.getUIElements());
-
-			treeViewer.update(invalid.toArray(), null);
-		}
-
-		this.needUpdate = false;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return currentSelection;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		currentSelection = selection;
-
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener
-					.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-
-		// update the description field
-		IStructuredSelection sel = (IStructuredSelection) selection;
-		Object o = sel.getFirstElement();
-		if (o instanceof MethodElement) {
-			String briefDesc = ((MethodElement) o).getBriefDescription();
-			elemDespContentText.setText(briefDesc != null ? briefDesc : ""); //$NON-NLS-1$
-		}
-
-	}
-
-	/**
-	 * Make configuration closure
-	 *
-	 */
-	protected void makeClosure() {
-		closure.fixErrors();
-		refreshViewers();
-		updateCheckStates();
-		saveConfiguration();
-
-	}
-
-	/**
-	 * Fix all warnings 
-	 */
-	protected void fixWarning() {
-
-		closure.fixProblems();
-		refreshViewers();	
-		updateCheckStates();
-		saveConfiguration();
-
-	}
-
-	private void updateCheckStates(Object element, boolean checked) {
-
-		// Object element = event.getElement();
-
-		if (checked == true) {
-			ITreeContentProvider cp = (ITreeContentProvider) treeViewer
-					.getContentProvider();
-			checkParent(cp, element);
-			// treeViewer.setChecked(element, true);
-		} else
-			treeViewer.setChecked(element, false);
-
-		selectionChildren(element, checked);
-
-	}
-
-	/**
-	 * Select/unselect all the children for the given element
-	 * @param element
-	 * @param checked
-	 */
-	public void selectionChildren(Object element, boolean checked) {
-		ITreeContentProvider cp = (ITreeContentProvider) treeViewer
-				.getContentProvider();
-		Object[] childs = cp.getChildren(element);
-		for (int i = 0; i < childs.length; i++) {
-			treeViewer.setChecked(childs[i], checked);
-			selectionChildren(childs[i], checked);
-		}
-	}
-
-	private void updateCheckStates() {
-		treeViewer.getTree().setVisible(false);
-		// treeViewer.expandAll();
-
-		try {
-			Object content = treeViewer.getInput();
-			if (content instanceof MethodLibrary) {
-
-				// set the selection since the colsure may changed with make
-				// closure or fix error
-				// treeViewer.setCheckedElements(closure
-				// .getSelection());
-				Object[] selectionList = closure.getSelection();
-				ConfigPackageContentProvider cp = (ConfigPackageContentProvider) treeViewer
-						.getContentProvider();
-
-				for (int i = 0; i < selectionList.length; i++) {
-					Object element = selectionList[i];
-
-					checkParent(cp, element);
-					treeViewer.setChecked(element, true);
-				}
-
-				// also set the UI folders if the corresponding package is
-				// selected
-				for (Iterator it = new ArrayList(cp.getUIElements()).iterator(); it
-						.hasNext();) {
-					Object element = it.next();
-					Object o = cp.getUITargetElement(element);
-					if (o != null && closure.isSelected(o)) {
-						checkParent(cp, element);
-						treeViewer.setChecked(element, true);
-					}
-				}
-
-				// restore the expand state
-				//treeViewer.setExpandedElements(expandedElements.toArray());
-
-			}
-
-		} finally {
-			treeViewer.getTree().setVisible(true);
-		}
-
-	}
-
-	private void checkParent(ITreeContentProvider cp, Object element) {
-		if (element == null || element instanceof MethodLibrary /*
-																 * || element ==
-																 * currentRootNode
-																 */) {
-			return;
-		}
-		modifiedElements.add(element);
-		Object parent = LibraryUtil.unwrap(cp.getParent(element));
-		if (parent != null) {
-			treeViewer.setChecked(parent, true);
-			// configFactory.getCurrentConfiguration().add((EObject)parent,
-			// false);
-			checkParent(cp, parent);
-		}
-
-	}
-
-	/**
-	 * Get all parents
-	 * @param list
-	 * @param pkg
-	 */
-	public void getAllParents(List list, MethodPackage pkg) {
-		MethodPackage parentPkg = ((MethodPackage) pkg).getParentPackage();
-		if (parentPkg != null) {
-			list.add(parentPkg);
-			getAllParents(list, parentPkg);
-		}
-	}
-
-	/**
-	 * Check parents for the given element
-	 * @param element
-	 */
-	public boolean setParentsChecked(Object element) {
-		Widget widget = treeViewer.testFindItem(element);
-		if (widget instanceof TreeItem) {
-			TreeItem item = (TreeItem) widget;
-			item = item.getParentItem();
-			while (item != null) {
-				item.setChecked(true);
-				item = item.getParentItem();
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-		// return isDirty;
-	}
-
-	/**
-	 * Set dirty flag
-	 * @param dirty
-	 */
-	public void setDirty(boolean dirty) {
-		isDirty = dirty;
-	}
-
-	/**
-	 * Content provider for configuration packages
-	 */
-	public class ConfigPackageContentProvider extends
-			AdapterFactoryContentProvider {
-		//private ConfigurationFactory configFactory;
-
-		// private boolean showMethodModelOnly = false;
-
-		// there is a problem in the passed in AdapterFactory
-		// it can't find the correct parent from the child
-		// need to build a map of child to it's parent if the child is a UI
-		// folder
-		// clear the map when the input is set
-		Map childUIParentMap = new HashMap();
-
-		List uiFolders = new ArrayList();
-
-		public List getUIElements() {
-			return uiFolders;
-		}
-
-		/**
-		 * Create an instance
-		 * @param adapterFactory
-		 */
-		public ConfigPackageContentProvider(//ConfigurationFactory configFactory,
-				AdapterFactory adapterFactory/* , boolean showMethodModelOnly */) {
-			super(adapterFactory);
-			// this.showMethodModelOnly = showMethodModelOnly;
-		}
-
-		/*
-		public ConfigurationFactory getConfigFactory() {
-			return configFactory;
-		}
-		*/
-
-		// public void setShowMethodModelOnly(boolean showOnly) {
-		// showMethodModelOnly = showOnly;
-		// }
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			// if (parentElement instanceof RootContent) {
-			// return ((RootContent) parentElement).getChildren();
-			// } else {
-			// if (showMethodModelOnly) {
-			// return null;
-			// } else {
-			Object[] items = getValidItems(parentElement, super
-					.getChildren(parentElement));
-			return items;
-			// }
-			// }
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			// if (inputElement instanceof RootContent) {
-			// return ((RootContent) inputElement).getChildren();
-			// } else {
-
-			Object[] items = getValidItems(inputElement, super
-					.getElements(inputElement));
-
-			// if (showMethodModelOnly && items != null) {
-			// List elements = new ArrayList();
-			// for (int i = 0; i < items.length; i++) {
-			// if (items[i] instanceof MethodPlugin) {
-			// elements.add(items[i]);
-			// }
-			// }
-			// return elements.toArray();
-			//
-			// } else {
-			return items;
-			// }
-			// }
-		}
-
-		private boolean isUIFolder(Object e) {
-			return (e instanceof ContentItemProvider
-					|| e instanceof ProcessesItemProvider || e instanceof MethodPackagesItemProvider ||
-					e instanceof PluginUIPackagesItemProvider
-			/*
-			 * || e instanceof StandardCategoriesItemProvider || e instanceof
-			 * DisciplineCategoriesItemProvider || e instanceof
-			 * DomainsItemProvider || e instanceof WorkProductTypesItemProvider ||
-			 * e instanceof RoleSetsItemProvider || e instanceof
-			 * ToolsItemProvider || (e instanceof CustomCategory) &&
-			 * TngUtil.isRootCustomCategory((CustomCategory)e)
-			 */
-			);
-		}
-
-		public Object getUITargetElement(Object e) {
-			if (e instanceof CustomCategory) {
-				return ((CustomCategory) e).eContainer();
-			} else if (e instanceof MethodElement) {
-				return e;
-			} else if (e instanceof ContentItemProvider) {
-				return ((ContentItemProvider) e).getParent(null);
-			} else if (e instanceof ProcessesItemProvider) {
-				return ((ProcessesItemProvider) e).getParent(null);
-			} else if (e instanceof ItemProviderAdapter) {
-				Object target = ((ItemProviderAdapter) e).getTarget();
-				if (target != null && target instanceof MethodElement) {
-					return target;
-				}
-			}
-
-			return null;
-		}
-
-		private Object[] getValidItems(Object parent, Object[] elements) {
-			if (elements == null || elements.length == 0) {
-				return elements;
-			}
-
-			List pkgs = new ArrayList();
-			for (int i = 0; i < elements.length; i++) {
-				Object e = LibraryUtil.unwrap(elements[i]);
-				boolean uiFolder = isUIFolder(e);
-				if (uiFolder || e instanceof MethodPackage
-						|| e instanceof MethodPlugin) {
-					pkgs.add(e);
-
-					if (uiFolder) {
-						uiFolders.add(e);
-					}
-
-					// if the parent is a UI folder, map the child to the parent
-					// so that we can get the parent later
-					// if ( !(parent instanceof MethodElement) )
-					{
-						childUIParentMap.put(e, parent);
-					}
-				} else {
-					; // System.out.println("Ignored: " + e);
-				}
-			}
-
-			return pkgs.toArray();
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			// if (element instanceof RootContent) {
-			// return null;
-			// } else
-			if (childUIParentMap.containsKey(element)) {
-				return childUIParentMap.get(element);
-			} else {
-				return super.getParent(element);
-			}
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			// if (element instanceof RootContent) {
-			// return true;
-			// } else
-			// if (showMethodModelOnly) {
-			// return false;
-			// } else {
-			Object[] children = getChildren(element);
-			return (children != null && children.length > 0);
-
-			// return treeNodeProvider.hasChildren(element);
-			// return super.hasChildren(element);
-			// }
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			super.inputChanged(viewer, oldInput, newInput);
-			childUIParentMap.clear();
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification notification) {
-			super.notifyChanged(notification);
-
-			if ((notification instanceof IViewerNotification)) {
-				final IViewerNotification vnt = (IViewerNotification) notification;
-				final Object element = vnt.getElement();
-				final ConfigurationViewer ctrl = ((ConfigurationViewer) super.viewer);
-				if (element != null && (vnt.getEventType() == Notification.ADD
-						/*|| vnt.getEventType() == Notification.SET*/)) {
-
-					SafeUpdateController.syncExec(new Runnable() {
-						public void run() {
-							ctrl.setChecked(element, true);
-						}
-					});
-				}
-			}
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#dispose()
-		 */
-		public void dispose() {
-			super.dispose();
-			uiFolders.clear();
-			childUIParentMap.clear();
-			//configFactory = null;
-		}
-	}
-
-	/**
-	 * Label provider for configuration packages
-	 */
-	public class ConfigPackageLabelProvider extends LabelProvider {
-		ConfigPackageContentProvider contentProvider;
-
-		//ConfigurationFactory configFactory;
-
-		AdapterFactoryLabelProvider afProvider;
-
-		/**
-		 * Creates an instance
-		 * @param contentProvider
-		 */
-		public ConfigPackageLabelProvider(
-				ConfigPackageContentProvider contentProvider) {
-			this.contentProvider = contentProvider;
-			afProvider = new AdapterFactoryLabelProvider(contentProvider
-					.getAdapterFactory());
-			//this.configFactory = contentProvider.getConfigFactory();
-		}
-
-		private ElementDependencyError getFirstChildError(Object e) {
-			ElementDependencyError error = null;
-			Object[] children = contentProvider.getChildren(e);
-			if (children == null || children.length == 0) {
-				return null;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				Object object = children[i];
-				if (object instanceof ItemProviderAdapter) {
-					return getFirstChildError(object);
-				} else {
-					error = closure.getError(object);
-					if (error != null) {
-						return error;
-					}
-				}
-			}
-
-			return error;
-		}
-
-		/**
-		 * This implements {@link ILabelProvider}.getImage by forwarding it to
-		 * an object that implements
-		 * {@link IItemLabelProvider#getImage IItemLabelProvider.getImage}
-		 */
-		public Image getImage(Object object) {
-			// disable for now till it works
-			ConfigurationClosure config1 = closure;
-			if (config1 != null) {
-				// no, this will show the error mark even if the child has no
-				// error, not good
-				// show the error if there is child error
-				// while ( object instanceof ItemProviderAdapter)
-				// {
-				// object = contentProvider.getParent(object);
-				// }
-
-				ElementDependencyError error = null;
-				if (object instanceof ItemProviderAdapter) {
-					error = getFirstChildError(object);
-				} else {
-					error = closure.getError(object);
-				}
-
-				if (error != null) {
-					if (error.isError() || error.isChildError()) {
-						return PlatformUI.getWorkbench().getSharedImages()
-								.getImage(ISharedImages.IMG_OBJS_ERROR_TSK); 
-					} else if (error.isWarning() || error.isChildWarning()) {
-						return PlatformUI.getWorkbench().getSharedImages()
-								.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
-					}
-				}
-			}
-
-			return afProvider.getImage(object);
-		}
-
-		protected Image getImageFromObject(Object object) {
-			return ExtendedImageRegistry.getInstance().getImage(object);
-		}
-
-		/**
-		 * This implements {@link ILabelProvider}.getText by forwarding it to
-		 * an object that implements
-		 * {@link IItemLabelProvider#getText IItemLabelProvider.getText}
-		 */
-		public String getText(Object object) {
-			if (object instanceof ProcessComponent) {
-				// return
-				// ((ProcessComponent)object).getProcess().getPresentationName();
-				Process proc = (Process) ((ProcessComponent) object)
-						.getProcess();
-				if (proc != null)
-					return proc.getPresentationName();
-				else
-					// if process is null, return processcomponent name
-					return ((ProcessComponent) object).getName();
-			} else
-				return afProvider.getText(object);
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.LabelProvider#dispose()
-		 */
-		public void dispose() {
-			super.dispose();
-
-			contentProvider = null;
-			afProvider = null;
-			//configFactory = null;
-		}
-	}
-
-	/**
-	 * Filter for configuration
-	 * 
-	 *
-	 */
-	public class ConfigTreeFilter extends ViewerFilter {
-		boolean hideUncheckedNodes = false;
-
-		CheckboxTreeViewer checkTree = null;
-
-		ConfigurationClosure closure = null;
-
-		ConfigPackageContentProvider cp = null;
-
-		public ConfigTreeFilter(ConfigurationClosure closure) {
-			this.closure = closure;
-		}
-
-		public void setHide() {
-			hideUncheckedNodes = hideUncheckedNodes == true ? false : true;
-			
-			if ( checkTree != null ) {
-				checkTree.refresh();
-			}
-		}
-
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			if (checkTree == null) {
-				checkTree = (CheckboxTreeViewer) viewer;
-				cp = (ConfigPackageContentProvider) checkTree
-						.getContentProvider();
-			}
-
-			if (hideUncheckedNodes) {
-				Object o = cp.getUITargetElement(element);
-				return closure.isSelected(o);
-			}
-			return true;
-		}
-
-		public boolean isHiding() {
-			return hideUncheckedNodes;
-		}
-
-		public void dispose() {
-			checkTree = null;
-			cp = null;
-			closure = null;
-		}
-	}
-
-	/**
-	 * Save configuration
-	 * @return
-	 * 		True if configuration is save successfully, false otherwise
-	 */
-	public boolean saveConfiguration() {
-		ConfigurationData configData = LibraryService.getInstance()
-							.getConfigurationManager(config)
-									.getConfigurationData();
-		
-		configData.setEnableUpdate(false);
-		boolean ret = saveConfiguration_();
-		configData.setEnableUpdate(true);
-
-		return ret;
-	}
-	
-	private boolean saveConfiguration_() {
-
-		boolean oldNotify = config.eDeliver();
-	    try
-	    {
-	    	//config.eSetDeliver(false);
-	    	
-			// remove the old entries
-			List pkgList = config.getMethodPackageSelection();
-			List plgList = config.getMethodPluginSelection();
-	
-			if (ConfigurationUtil.removeCollFromMethodPluginList(actionMgr, config, plgList) == false)
-				return false;
-			if (ConfigurationUtil.removeCollFromMethodPackageList(actionMgr, config, pkgList) == false)
-				return false;
-	
-			// add the new entries
-			pkgList = new ArrayList();
-			plgList = new ArrayList();
-	
-			// we changed to let the ConfigurationClosure to depends on the MethodConfiguration
-			// so should get the selection from the viewer checks instead of the closure
-			Object[] objs = treeViewer.getCheckedElements();
-			// //modifiedList.toArray();
-			//Object[] objs = closure.getSelection();
-	
-			for (int i = 0; i < objs.length; i++) {
-				if ( (objs[i] instanceof MethodPlugin) && !plgList.contains(objs[i]) ) {				
-					plgList.add(objs[i]);
-					
-//					// add all system packages into the package selection
-//					List pkgs = TngUtil.getAllSystemPackages((MethodPlugin)objs[i]);
-//					for (Iterator it = pkgs.iterator(); it.hasNext();) {
-//						Object pkg = it.next();
-//						if (!pkgList.contains(pkg)) {
-//							pkgList.add(pkg);
-//						}
-//					}
-				}
-				else if ( (objs[i] instanceof MethodPackage) && !pkgList.contains(objs[i]) ) {
-					pkgList.add(objs[i]);
-				}
-			}
-			
-			if (ConfigurationUtil.addCollToMethodPluginList(actionMgr, config, plgList) == false)
-				return false;
-			if (ConfigurationUtil.addCollToMethodPackageList(actionMgr, config, pkgList) == false)
-				return false;
-	
-	    	// validate before save
-	    	TngUtil.validateMethodConfiguration(actionMgr, config);
-
-			return true;
-		
-		} finally {
-			config.eSetDeliver(oldNotify);
-		}
-	}
-	
-	/**
-	 * Save configuration
-	 * @return
-	 * 		True if configuration is save successfully, false otherwise
-	 */
-	public boolean saveContentCategorySelectionsToConfiguration() {
-		
-    	List oldAddCats = new ArrayList(config.getAddedCategory());
-    	List oldSubCats = new ArrayList(config.getSubtractedCategory());
-    	
-    	Set<ContentCategory> newAddCats = addCategoryViewer.getCheckedContentCategories();
-    	Set<ContentCategory> newSubCats = subCategoryViewer.getCheckedContentCategories();
-    	
-    	oldAddCats.removeAll(newAddCats);
-    	oldSubCats.removeAll(newSubCats);
-    	
-    	newAddCats.removeAll(config.getAddedCategory());
-    	newSubCats.removeAll(config.getSubtractedCategory());
-		
-		if (ConfigurationUtil.removeCollFromAddedCategoryList(actionMgr, config, oldAddCats) == false)
-			return false;
-		
-		if (!newAddCats.isEmpty()) {
-			if (ConfigurationUtil.addCollToAddedCategoryList(actionMgr, config, newAddCats) == false)
-				return false;
-			
-			Map pluginMap = MethodElementUtil.buildMap(config.getMethodPluginSelection());
-			HashSet newAddedPlugins = new HashSet();
-			for (Iterator<ContentCategory> it = newAddCats.iterator(); it.hasNext(); ) {
-				ContentCategory cat = it.next();
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(cat);
-				if (! pluginMap.containsKey(plugin.getGuid())) {
-					if (! newAddedPlugins.contains(plugin)) {
-						newAddedPlugins.add(plugin);
-					}
-				}
-			}
-			if (! newAddedPlugins.isEmpty()) {
-				if (ConfigurationUtil.addCollToMethodPluginList(actionMgr, config, newAddedPlugins) == false)
-					return false;
-				LibraryUtil.validateMethodConfiguration(actionMgr, config);
-			}
-			
-		}
-		if (ConfigurationUtil.removeCollFromSubtractedCategoryList(actionMgr, config, oldSubCats) == false)
-			return false;
-		
-		if (ConfigurationUtil.addCollToSubtractedCategoryList(actionMgr, config, newSubCats) == false)
-			return false;
-
-		return true;
-	}
-
-
-	public void dispose() {
-		super.dispose();
-
-		if (libListener != null) {
-			ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				manager.removeListener(libListener);
-			}
-		}
-		
-		if (layoutListener != null) {
-			PluginUIPackageContext.INSTANCE.removeListener(layoutListener);
-		}
-
-		if (configFilter != null) {
-			configFilter.dispose();
-		}
-
-		if (closure != null) {
-			closure.dispose();
-			closure = null;
-		}
-
-		config.eAdapters().remove(configurationChangedListener);
-	}
-
-	/**
-	 * Get configuration closure
-	 */
-	public ConfigurationClosure getClosure() {
-		return closure;
-	}
-	
-	private void addEditorSetFocusLiseners() {
-		if (getEditor() instanceof ConfigurationEditor) {
-			Listener lis = new Listener() {
-				public void handleEvent (Event event) {
-					if (event.data == ConfigurationPage.this && needUpdate && treeViewer != null)	{
-						reInitializeConfigFactory();
-						refreshViewers();
-						updateCheckStates();
-						showErrors();
-						needUpdate = false;
-					}
-				}
-			};
-			((ConfigurationEditor) getEditor()).addToSetFocusLiseners(lis);
-		}
-	}
-	
-	private void refreshViewers() {
-		treeViewer.refresh();
-		refreshCategoryViewers();
-	}
-
-	private void refreshCategoryViewers() {
-		addCategoryViewer.refresh();
-		subCategoryViewer.refresh();
-		addCategoryViewer.aboutToOpen();
-		subCategoryViewer.aboutToOpen();
-	}
-	
-	public void doQuickFix(IMarker marker) {
-		if ( marker == null ) {
-			return;
-		}
-		MethodElement element = markerHelper.getCauseMethodElement(marker);	
-		if ( element == null ) {
-			return;
-		}
-		
-		if ( closure.getConfigurationManager().getConfigurationData().isElementInSubtractedCategory(element)) {
-			String message = AuthoringUIResources.bind(
-					AuthoringUIResources.configurationPage_QuickfixError_reason1, 
-					(new String[] {LibraryUtil.getTypeName(element)}));
-			AuthoringUIPlugin.getDefault().getMsgDialog()
-				.displayWarning(
-						AuthoringUIResources.configurationPage_quickfixError_title, 
-						message);
-			return;
-		}
-		
-		Object owner = LibraryUtil.getSelectable(element);
-		treeViewer.setChecked(owner, true);
-		updateCheckStates(owner, true);
-		saveConfiguration();
-		showErrors();					
-		updateCheckStates();
-
-   }
-	
-	public void gotoMarker(IMarker marker) {
-		// select problem in main viewer
-		
-		MethodElement e = ConfigurationMarkerHelper.INSTANCE.getErrorMethodElement(marker);
-
-		if (e != null && treeViewer != null) {
-			treeViewer.setSelection(LibraryUtil
-					.getSelectable(e));
-		}
-
-//		msgViewListener = new ISelectionChangedListener() {
-//			public void selectionChanged(SelectionChangedEvent event) {
-//				IStructuredSelection sel = (IStructuredSelection) event
-//						.getSelection();
-//				Object[] selObjs = sel.toArray();
-//				if ((selObjs != null) && (selObjs.length > 0)) {
-//					EObject node = null;
-//					if (selObjs[0] instanceof ElementDependencyError) {
-//						node = (EObject) ((ElementDependencyError) selObjs[0])
-//								.getErrorElement();
-//					} else if (selObjs[0] instanceof ErrorInfo) {
-//						ErrorInfo info = (ErrorInfo) selObjs[0];
-//						// node = (EObject) info.getOwnerElement();
-//
-//						// show the cause element
-//						node = (EObject) info.getCauseElement();
-//
-//					}
-//
-//					else if (selObjs[0] instanceof ElementReference) {
-//						node = (EObject) ((ElementReference) selObjs[0])
-//								.getRefElement();
-//						if (node != null) {
-//							node = node.eContainer();
-//						}
-//					}
-//
-//				}
-//			}
-//		};
-//
-//	}
-		
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ContentElementGuidancePage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ContentElementGuidancePage.java
deleted file mode 100644
index 01978c4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ContentElementGuidancePage.java
+++ /dev/null
@@ -1,547 +0,0 @@
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.GuidanceFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-/**
- * Class for Guidance tab page in the content element editor.
- * Class ContentElementGuidancePage replaces CategoryGuidancePage and handles
- * all contentelement's guidance tab feature.  
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ContentElementGuidancePage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "categoryGuidancesPage"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentElementGuidancePage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.GUIDANCE_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		setAllowChange1(true);
-		setAllowChange2(true);
-		setUseCategory2(false);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List list = MethodElementUtil
-						.getSelectedGuidances(contentElement);
-				List local = new ArrayList();
-				for (Iterator it = list.iterator(); it.hasNext();) {
-					Object obj = it.next();
-					if (!(obj instanceof Practice
-							|| (obj instanceof ToolMentor && contentElement instanceof Tool) || obj
-							.equals(contentElement
-									.getVariabilityBasedOnElement()))) {
-						local.add(obj);
-					}
-				}
-				return local.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		IActionManager actionMgr = editor.getActionManager();
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// Consolidating the separate form page code
-				// to accomodate better filtering.
-				if (contentElement instanceof Task) {
-//					if (item instanceof Estimate) {
-//						editor.getActionManager().doAction(IActionManager.SET,
-//								contentElement,
-//								UmaPackage.eINSTANCE.getTask_Estimate(),
-//								(Estimate) item, -1);
-//					} else 
-					if (item instanceof ToolMentor) {
-						actionMgr.doAction(IActionManager.ADD,
-								contentElement,
-								UmaPackage.eINSTANCE.getTask_ToolMentors(),
-								(ToolMentor) item, -1);
-						continue;
-					} else if (item instanceof EstimationConsiderations) {
-						actionMgr.doAction(IActionManager.ADD, contentElement,
-								UmaPackage.eINSTANCE.getTask_EstimationConsiderations(),
-								item, -1);
-						continue;
-					}
-				}
-				// In case of WorkProduct, WorkProduct is associated to ToolMentor,
-				// Estimate, Report and Template guidance
-				if (contentElement instanceof WorkProduct) {
-					if (item instanceof Template) {
-						actionMgr
-								.doAction(IActionManager.ADD, contentElement,
-										UmaPackage.eINSTANCE
-												.getWorkProduct_Templates(),
-										item, -1);
-						continue;
-					} else if (item instanceof ToolMentor) {
-						actionMgr
-								.doAction(IActionManager.ADD, contentElement,
-										UmaPackage.eINSTANCE
-												.getWorkProduct_ToolMentors(),
-										item, -1);
-						continue;
-					} else if (item instanceof Report) {
-						actionMgr.doAction(IActionManager.ADD, contentElement,
-								UmaPackage.eINSTANCE.getWorkProduct_Reports(),
-								item, -1);
-						continue;
-					} 
-//					else if (item instanceof Estimate) {
-//						actionMgr.doAction(IActionManager.SET, contentElement,
-//								UmaPackage.eINSTANCE.getWorkProduct_Estimate(),
-//								item, -1);
-//					}
-					else if (item instanceof EstimationConsiderations) {
-						actionMgr.doAction(IActionManager.ADD, contentElement,
-								UmaPackage.eINSTANCE.getWorkProduct_EstimationConsiderations(),
-								item, -1);
-						continue;
-					}
-				}
-
-				// Guidance for content element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									(Checklist) item, -1);
-					continue;
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-					continue;
-				} else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-					continue;
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-					continue;
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-					continue;
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-					continue;
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to add guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"to " //$NON-NLS-1$
-											+ contentElement.getType()
-													.getName()
-											+ ":" + contentElement.getName()); //$NON-NLS-1$ 
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		IActionManager actionMgr = editor.getActionManager();
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// In case of Task, Task is associated to ToolMentor and
-				// Estimate guidance
-				if (contentElement instanceof Task) {
-					if (item instanceof ToolMentor) {
-						editor.getActionManager().doAction(
-								IActionManager.REMOVE, contentElement,
-								UmaPackage.eINSTANCE.getTask_ToolMentors(),
-								item, -1);
-						continue;
-					} 
-//					else if (item instanceof Estimate) {
-//						editor.getActionManager().doAction(IActionManager.SET,
-//								contentElement,
-//								UmaPackage.eINSTANCE.getTask_Estimate(), null,
-//								-1);
-//					}
-					else if (item instanceof EstimationConsiderations) {
-						editor.getActionManager().doAction(IActionManager.REMOVE,
-								contentElement,
-								UmaPackage.eINSTANCE.getTask_EstimationConsiderations(), item,
-								-1);
-						continue;
-					}
-				}
-				// In case of WorkProduct, WorkProduct is associated to ToolMentor,
-				// Estimate, Report and Template guidance
-				if (contentElement instanceof WorkProduct) {
-					if (item instanceof Report) {
-						actionMgr.doAction(IActionManager.REMOVE,
-								contentElement, UmaPackage.eINSTANCE
-										.getWorkProduct_Reports(), item, -1);
-						continue;
-					} else if (item instanceof Template) {
-						actionMgr.doAction(IActionManager.REMOVE,
-								contentElement, UmaPackage.eINSTANCE
-										.getWorkProduct_Templates(), item, -1);
-						continue;
-					} else if (item instanceof ToolMentor) {
-						actionMgr
-								.doAction(IActionManager.REMOVE,
-										contentElement, UmaPackage.eINSTANCE
-												.getWorkProduct_ToolMentors(),
-										item, -1);
-						continue;
-					} 
-//					else if (item instanceof Estimate) {
-//						actionMgr.doAction(IActionManager.SET, contentElement,
-//								UmaPackage.eINSTANCE.getWorkProduct_Estimate(),
-//								null, -1);
-//					}
-					else if (item instanceof EstimationConsiderations) {
-						editor.getActionManager().doAction(IActionManager.REMOVE,
-								contentElement,
-								UmaPackage.eINSTANCE.getWorkProduct_EstimationConsiderations(), item,
-								-1);
-						continue;
-					}
-				}
-				// Guidance for the method element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									item, -1);
-					continue;
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-					continue;
-				} else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-					continue;
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-					continue;
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									contentElement,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-					continue;
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							contentElement,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-					continue;
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to remove guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"from " //$NON-NLS-1$
-											+ contentElement.getType()
-													.getName()
-											+ ":" + contentElement.getName()); //$NON-NLS-1$ 
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.GUIDANCE;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new GuidanceFilter();
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getFilterTypes()
-	 *      Types are returned in order to display in the filter dialog for
-	 *      search based on type.
-	 */
-	protected String[] getFilterTypes() {
-		
-		String[] str;
-		if (contentElement instanceof Task) {
-			str = new String[11];
-		} else if (contentElement instanceof WorkProduct) {
-			str = new String[13];
-		} else
-			str = new String[9];
-		int i = 0;
-		str[i++] = FilterConstants.GUIDANCE;
-		str[i++] = FilterConstants.space + FilterConstants.CHECKLISTS;
-		str[i++] = FilterConstants.space + FilterConstants.CONCEPTS;
-		str[i++] = FilterConstants.space + FilterConstants.EXAMPLES;
-		str[i++] = FilterConstants.space + FilterConstants.GUIDELINES;
-		str[i++] = FilterConstants.space + FilterConstants.REUSABLE_ASSETS;
-		str[i++] = FilterConstants.space + FilterConstants.SUPPORTING_MATERIALS;
-		if (contentElement instanceof Task) {
-			str[i++] = FilterConstants.space + FilterConstants.TOOL_MENTORS;
-			str[i++] = FilterConstants.space + FilterConstants.ESTIMATE_CONSIDERATIONS;
-			// TODO Estimate contentelement
-		} else if (contentElement instanceof WorkProduct) {
-			str[i++] = FilterConstants.space + FilterConstants.REPORTS;
-			str[i++] = FilterConstants.space + FilterConstants.TEMPLATES;
-			str[i++] = FilterConstants.space + FilterConstants.TOOL_MENTORS;
-			str[i++] = FilterConstants.space + FilterConstants.ESTIMATE_CONSIDERATIONS;
-			// TODO Estimate contentelement
-		}
-		str[i++] = FilterConstants.CONTENT_PACKAGES;
-		str[i++] = FilterConstants.METHO_PLUGINS;
-		return str;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.categoryGuidancesPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		
-		if(contentElement instanceof RoleSet){
-			return AuthoringUIResources.rolesets_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Discipline){
-			return AuthoringUIResources.disciplines_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof WorkProductType){
-			return AuthoringUIResources.workproducttypes_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Domain){
-			return AuthoringUIResources.domains_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Tool){
-			return AuthoringUIResources.tools_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Role){
-			return AuthoringUIResources.roleGuidancePage_sectionDescription;
-		}
-		if(contentElement instanceof Task){
-			return AuthoringUIResources.taskGuidancePage_sectionDescription;
-		}
-		if(contentElement instanceof WorkProduct){
-			return AuthoringUIResources.workProductGuidancePage_sectionDescription;
-		}
-		if(contentElement instanceof Tool){
-			return AuthoringUIResources.tools_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Whitepaper){
-			return AuthoringUIResources.whitepaper_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Concept){
-			return AuthoringUIResources.concept_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Checklist){
-			return AuthoringUIResources.checklist_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Example){
-			return AuthoringUIResources.example_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Guideline){
-			return AuthoringUIResources.guideline_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof SupportingMaterial){
-			return AuthoringUIResources.supportingmaterial_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Roadmap){
-			return AuthoringUIResources.roadmap_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Practice){
-			return AuthoringUIResources.practice_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Report){
-			return AuthoringUIResources.report_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof ReusableAsset){
-			return AuthoringUIResources.reusableasset_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof Template){
-			return AuthoringUIResources.template_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof TermDefinition){
-			return AuthoringUIResources.termdefinition_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof EstimationConsiderations){
-			return AuthoringUIResources.estimationconsideration_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof ToolMentor){
-			return AuthoringUIResources.toolmentor_guidancepage_sectiondescription;
-		}
-		if(contentElement instanceof CustomCategory){
-			return AuthoringUIResources.customcategory_guidancepage_sectiondescription;
-		}
-		
-		if(contentElement != null)
-			return AuthoringUIResources.bind(AuthoringUIResources.categoryGuidancesPage_sectionDescription, contentElement.getType().getName().toLowerCase());
-		
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.categoryGuidancesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.categoryGuidancesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.categoryGuidancesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.categoryGuidancesPage_selectedLabel;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ContentPackageDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ContentPackageDescriptionPage.java
deleted file mode 100644
index 605ba11..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ContentPackageDescriptionPage.java
+++ /dev/null
@@ -1,497 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * The description page for the Content Package editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class ContentPackageDescriptionPage extends FormPage implements IRefreshable {
-
-	private static final String FORM_PREFIX = LibraryUIText.TEXT_CONTENT_PACKAGE
-			+ ": "; //$NON-NLS-1$
-
-	private Text ctrl_name;
-
-	private Text ctrl_brief_desc;
-
-	private CheckboxTableViewer ctrl_dependency;
-
-	private ScrolledForm form;
-
-	private ContentPackage contentPackage;
-
-	private org.eclipse.epf.authoring.ui.editors.MethodElementEditor.ModifyListener modelModifyListener;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentPackageDescriptionPage(FormEditor editor) {
-		super(editor, AuthoringUIText.DESCRIPTION_PAGE_TITLE,
-				AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-
-		// Retrieve the ContentPackage object from the Editor input.
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-		Object obj = methodElementInput.getMethodElement();
-		contentPackage = (ContentPackage) obj;
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// Create the form toolkit.
-		form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		form.setText(FORM_PREFIX + contentPackage.getName());
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-
-		// Create the General Informaiton section.
-		Section generalSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		generalSection.setLayoutData(td);
-		generalSection.setText(AuthoringUIText.GENERAL_INFO_SECTION_NAME);
-		generalSection.setDescription(MessageFormat.format(
-				AuthoringUIText.GENERAL_INFO_SECTION_DESC,
-				new String[] { LibraryUIText.getUITextLower(contentPackage) }));
-		generalSection.setLayout(new GridLayout());
-
-		Composite generalComposite = toolkit.createComposite(generalSection);
-		generalComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		generalComposite.setLayout(new GridLayout(2, false));
-		generalSection.setClient(generalComposite);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				generalComposite.getParent().getParent(),
-				AuthoringUIHelpContexts.CONTENT_PACKAGE_EDITOR_ALL_CONTEXT); 
-
-		// name
-		Label l_name = toolkit.createLabel(generalComposite,
-				AuthoringUIText.NAME_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			l_name.setLayoutData(gridData);
-		}
-
-		ctrl_name = toolkit.createText(generalComposite, ""); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			ctrl_name.setLayoutData(gridData);
-		}
-
-		// brief desc
-		Label l_brief_desc = toolkit.createLabel(generalComposite,
-				AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			l_brief_desc.setLayoutData(gridData);
-		}
-
-		ctrl_brief_desc = toolkit.createText(generalComposite,
-				"", SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.heightHint = 40;
-			gridData.widthHint = 300;
-			ctrl_brief_desc.setLayoutData(gridData);
-		}
-
-		Section dependencySection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td1 = new TableWrapData(TableWrapData.FILL_GRAB);
-		dependencySection.setLayoutData(td1);
-		dependencySection.setText(AuthoringUIText.DEPENDENCIES_SECTION_NAME);
-		dependencySection
-				.setDescription(AuthoringUIText.DEPENDENCIES_SECTION_DESC);
-		dependencySection.setLayout(new GridLayout());
-
-		Composite dependencyComposite = toolkit
-				.createComposite(dependencySection);
-		dependencyComposite
-				.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		dependencyComposite.setLayout(new GridLayout(2, false));
-		dependencySection.setClient(dependencyComposite);
-
-		
-		Table ctrl_table = toolkit.createTable(dependencyComposite, SWT.V_SCROLL
-				| SWT.CHECK | SWT.READ_ONLY | SWT.COLOR_BLUE);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING
-					| GridData.FILL_BOTH);
-			gridData.heightHint = 100;
-			ctrl_table.setLayoutData(gridData);
-		}
-
-		ctrl_dependency = new CheckboxTableViewer(ctrl_table);
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public String getText(Object element) {
-				if (element instanceof ContentPackage) {
-					return TngUtil.getLabelWithPath((ContentPackage)element);
-				} else {
-					return element.toString();
-				}
-			}
-		};
-		ctrl_dependency.setLabelProvider(labelProvider);
-		ctrl_dependency.setContentProvider(new IStructuredContentProvider() {
-			public void dispose() {
-			}
-			
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-			
-			public Object[] getElements(Object inputElement) {
-				if (inputElement instanceof ContentPackage) {
-					return getDependenciesPackages(contentPackage).toArray();
-				} else {
-					return Collections.EMPTY_LIST.toArray();
-				}
-			}
-		});
-		ctrl_dependency.setSorter(new ViewerSorter());
-		ctrl_dependency.setInput(contentPackage);
-
-		ctrl_dependency.setAllChecked(true);
-		ctrl_dependency.setAllGrayed(true);
-
-		toolkit.paintBordersFor(generalComposite);
-		toolkit.paintBordersFor(dependencyComposite);
-
-		// load data
-		loadData();
-		addListeners();
-
-		// set focus on the name attribute
-		Display display = form.getBody().getDisplay();
-		if (!(display == null || display.isDisposed())) {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					ctrl_name.setFocus();
-					ctrl_name.setSelection(0, ctrl_name.getText().length());
-				}
-			});
-		}
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 */
-	private void addListeners() {
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-		modelModifyListener = editor.createModifyListener(contentPackage);
-
-		form.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event e) {
-				// refreshViewers();
-				ctrl_dependency.refresh();
-				ctrl_dependency.setAllChecked(true);
-				ctrl_dependency.setAllGrayed(true);
-				if (TngUtil.isLocked(contentPackage)) {
-					enableControls(false);
-				} else {
-					enableControls(true);
-				}
-			}
-		});
-
-		ctrl_name.addModifyListener(modelModifyListener);
-		ctrl_name.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getNamedElement_Name());
-			}
-
-			public void focusLost(FocusEvent e) {
-				final Collection eClasses = Collections
-						.singleton(UmaPackage.eINSTANCE.getMethodPackage());
-				String oldContent = contentPackage.getName();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String msg = null ;
-				String newName = ctrl_name.getText();
-				if(newName != null) {
-					newName = newName.trim();					
-					// 178462
-					if (oldContent.indexOf("&") < 0 && newName.indexOf("&") > -1) { //$NON-NLS-1$ //$NON-NLS-2$
-						msg = NLS
-								.bind(
-										LibraryEditResources.invalidElementNameError4_msg,
-										newName);
-					} else {
-						msg = TngUtil.checkName(contentPackage, newName,
-								eClasses);
-					}
-				}
-				if (msg == null) {
-					if (!newName.equals(contentPackage.getName())) {
-						ctrl_name.setText(newName);
-						editor.getActionManager().doAction(IActionManager.SET,
-								contentPackage,
-								UmaPackage.eINSTANCE.getNamedElement_Name(),
-								newName, -1);
-					}
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayError(
-									AuthoringUIResources.renameDialog_title, msg); 
-					ctrl_name.setText(contentPackage.getName());
-					ctrl_name.getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							ctrl_name.setFocus();
-							ctrl_name.selectAll();
-						}
-					});
-				}
-			}
-		});
-
-		ctrl_brief_desc.addModifyListener(modelModifyListener);
-		ctrl_brief_desc.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = contentPackage.getBriefDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newName = ctrl_brief_desc.getText();
-				if (!newName.equals(contentPackage.getBriefDescription())) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							contentPackage,
-							UmaPackage.eINSTANCE
-									.getMethodElement_BriefDescription(),
-							newName, -1);
-					if (success) {
-						ctrl_brief_desc.setText(newName);
-					}
-				}
-			}
-		});
-
-		ctrl_dependency.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				Object obj = event.getSource();
-				((CheckboxTableViewer) obj).setAllChecked(true);
-			}
-		});
-
-	}
-
-	protected void enableControls(boolean editable) {
-		ctrl_name.setEditable(editable);
-		ctrl_brief_desc.setEditable(editable);
-	}
-
-	/**
-	 * Loads initial data from model
-	 */
-	private void loadData() {
-		String name = contentPackage.getName();
-		String desc = contentPackage.getBriefDescription();
-
-
-		ctrl_name.setText(name == null ? "" : name); //$NON-NLS-1$
-		ctrl_name.selectAll();
-		ctrl_brief_desc.setText(desc == null ? "" : desc); //$NON-NLS-1$
-	}
-
-	/**
-	 * Get dependency packages for the given content package
-	 * @return
-	 * 		List of dependency packages
-	 */
-	public Collection<ContentPackage> getDependenciesPackages(ContentPackage contentPackage) {
-
-		List elements = new ArrayList();
-		for (Iterator iter = contentPackage.getContentElements().iterator(); iter
-				.hasNext();) {
-			ContentElement contentElement = (ContentElement) iter.next();
-			if (contentElement.getVariabilityBasedOnElement() != null) {
-				elements.add((ContentElement) contentElement
-						.getVariabilityBasedOnElement());
-			}
-			elements.addAll(MethodElementUtil
-					.getSelectedGuidances(contentElement));
-
-			if (contentElement instanceof Role) {
-/*				if (AssociationHelper
-						.getModifiedWorkProducts((Role) contentElement) != null) {
-					elements.addAll(AssociationHelper
-							.getModifiedWorkProducts((Role) contentElement));
-				}
-				if (AssociationHelper.getPrimaryTasks((Role) contentElement) != null) {
-					elements.addAll(AssociationHelper
-							.getPrimaryTasks((Role) contentElement));
-				}
-				if (AssociationHelper.getSecondaryTasks((Role) contentElement) != null) {
-					elements.addAll(AssociationHelper
-							.getSecondaryTasks((Role) contentElement));
-				}*/
-			}
-			if (contentElement instanceof Task) {
-				if (((Task) contentElement).getPerformedBy() != null) {
-					elements.add(((Task) contentElement).getPerformedBy());
-				}
-				if (((Task) contentElement).getAdditionallyPerformedBy() != null) {
-					elements.addAll(((Task) contentElement)
-							.getAdditionallyPerformedBy());
-				}
-				if (((Task) contentElement).getMandatoryInput() != null) {
-					elements
-							.addAll(((Task) contentElement).getMandatoryInput());
-				}
-				if (((Task) contentElement).getOptionalInput() != null) {
-					elements.addAll(((Task) contentElement).getOptionalInput());
-				}
-				if (((Task) contentElement).getOutput() != null) {
-					elements.addAll(((Task) contentElement).getOutput());
-				}
-			}
-			if (contentElement instanceof WorkProduct) {
-/*				if (AssociationHelper
-						.getModifiedBy((WorkProduct) contentElement) != null) {
-					elements.addAll(AssociationHelper
-							.getModifiedBy((WorkProduct) contentElement));
-				}
-				if (AssociationHelper
-						.getMandatoryInputToTasks((WorkProduct) contentElement) != null) {
-					elements
-							.addAll(AssociationHelper
-									.getMandatoryInputToTasks((WorkProduct) contentElement));
-				}
-				if (AssociationHelper
-						.getOutputtingTasks((WorkProduct) contentElement) != null) {
-					elements.addAll(AssociationHelper
-							.getOutputtingTasks((WorkProduct) contentElement));
-				}
-				List list = AssociationHelper.getResponsibleRoles((WorkProduct) contentElement);
-				if (list != null) {
-					elements.addAll(list);
-				}*/
-			}
-
-		}
-
-		List<ContentPackage> cpList = new ArrayList<ContentPackage>();
-		for (int i = 0; i < elements.size(); i++) {
-			Object object = ((ContentElement) elements.get(i)).eContainer();
-			if (object instanceof ContentPackage) {
-				if (!contentPackage.equals(object)) {
-					if (!cpList.contains((ContentPackage)object)) {
-						cpList.add((ContentPackage)object);
-					}
-				}
-			}
-		}
-		return cpList;
-	}	
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.IRefreshable#refreshName(java.lang.String)
-	 */
-	public void refreshName(String newName) {
-		if (newName != null) {
-			if ((ctrl_name != null) && !(ctrl_name.isDisposed())) {
-				ctrl_name.removeModifyListener(modelModifyListener);
-				ctrl_name.setText(newName);
-				ctrl_name.addModifyListener(modelModifyListener);
-				UIHelper.setFormText(form, contentPackage);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CustomCategoryAssignPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CustomCategoryAssignPage.java
deleted file mode 100644
index ff382d8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CustomCategoryAssignPage.java
+++ /dev/null
@@ -1,390 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewDeleteAction;
-import org.eclipse.epf.authoring.ui.filters.AllFilter;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.epf.library.util.LibraryManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Assign page in the Custom Category editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class CustomCategoryAssignPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "customCategoryAssignPage"; //$NON-NLS-1$
-
-	private CustomCategory category;
-
-	//private ContentElementOrderList allSteps;
-	private ContentElementOrderList allSteps;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CustomCategoryAssignPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.ASSIGN_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		category = (CustomCategory) contentElement;
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setAllowChange1(true);
-		setIsUpAndDownButtonsRequired1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				if (allSteps == null) {
-					allSteps = new ContentElementOrderList(
-							contentElement,
-							ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_ONLY,
-							getContentCategoryOrderFeature());
-				}
-				List returnList = CategorySortHelper.sortCategoryElements(contentElement, allSteps.toArray());
-				return returnList.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		boolean ok = DependencyChecker.checkCircularForMovingVariabilityElement(category, addItems);
-		if(! ok) {
-			String title = AuthoringUIResources.circular_dependency_error_title;
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(title, LibraryEditResources.circular_dependency_error_msg);						
-			return;
-		}
-		
-		List<Object> ancestors = getAncestors(category);
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				MethodElement customCategory = (MethodElement) it.next();
-				if (customCategory instanceof CustomCategory
-						&& TngUtil
-								.isRootCustomCategory((CustomCategory) customCategory)) {
-				} else if (ancestors.contains(customCategory)) {
-				} else {
-					if (customCategory instanceof ProcessComponent) {
-						MethodElement object = ((ProcessComponent) customCategory)
-								.getProcess();
-						LibraryManager.getInstance().addToCustomCategory(
-								getActionManager(), category, object, usedCategories);
-					} else {
-						LibraryManager.getInstance().addToCustomCategory(
-								getActionManager(), category, customCategory, usedCategories);
-					}
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		if (!rmItems.isEmpty()) {
-			ArrayList<MethodElement> customCategoriesToDelete = new ArrayList<MethodElement>();
-			MethodPlugin currentPlugin = UmaUtil.getMethodPlugin(category);
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				MethodElement e = (MethodElement) it.next();
-				if (e instanceof CustomCategory) {
-//					Adapter adapter = TngAdapterFactory.INSTANCE
-//							.getNavigatorView_ComposedAdapterFactory().adapt(
-//									category, ITreeItemContentProvider.class);
-//					if (adapter != null
-//							&& adapter instanceof ItemProviderAdapter) {
-//						for (Iterator iter = ((ItemProviderAdapter) adapter)
-//								.getChildren(category).iterator(); iter
-//								.hasNext();) {
-//							Object o = iter.next();
-//							if (TngUtil.unwrap(o) == e) {
-//								customCategoriesToDelete.add(o);
-//							}
-//						}
-//					}
-					
-					// will delete e if it is in the current plugin and
-					// the last super custom category of e in the current plugin
-					//
-					if(TngUtil.isInPluginWithLessThanOneSuperCustomCategory((CustomCategory) e, currentPlugin)) {
-						customCategoriesToDelete.add(e);
-						continue;
-					}
-				}				
-				LibraryManager.getInstance().removeFromCustomCategory(
-						getActionManager(), category, e, usedCategories);
-			}
-
-			if (customCategoriesToDelete.size() > 0) {
-				int i = 0;
-				StringBuffer elementStr = new StringBuffer();
-				for (Iterator<MethodElement> it = customCategoriesToDelete.iterator(); it.hasNext();) {
-					Object obj = TngUtil.unwrap(it.next());
-					if (obj instanceof MethodElement) {
-						if (i > 0) {
-							elementStr.append(", "); //$NON-NLS-1$
-						}
-						elementStr.append(((MethodElement) obj).getName());
-
-						i++;
-					}
-				}
-				
-				if(!AuthoringUIPlugin.getDefault().getMsgDialog().displayConfirmation(AuthoringUIResources.remove_text,
-						NLS.bind(AuthoringUIResources.promptDeleteCustomCategoryBeforeRemoveLastRefToIt, elementStr))) {
-					return;
-				}
-				LibraryViewDeleteAction deleteAction = new LibraryViewDeleteAction() {
-					public void run() {
-						String title = AuthoringUIResources.actions_LibraryActionBarContributor_deleteErrorTitle; 
-						confirm = false;
-						try {
-							super.run();
-						} catch (MessageException e) {
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayError(title, e.getMessage());
-						} catch (Exception e) {
-							String details = TngUtil.toStackTraceString(e);
-							String message = AuthoringUIResources.actions_LibraryActionBarContributor_deleteErrorMessage; 
-							String reason = AuthoringUIResources.actions_LibraryActionBarContributor_deleteErrorReason; 
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayError(title, message, reason,
-											details, e);
-						}
-					}
-
-					protected void deleteFailed() {
-						// library need to be reloaded
-						String libDir = LibraryService.getInstance()
-								.getCurrentMethodLibraryLocation();
-						LibraryUIManager.getInstance().openLibrary(libDir);
-					}
-					
-				};
-				deleteAction.setEditingDomain(LibraryView.getView()
-						.getEditingDomain());
-				deleteAction.selectionChanged(new StructuredSelection(
-						customCategoriesToDelete));
-				deleteAction.run();
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * Returns the ancestors for the given Custom Category.
-	 */
-	private List<Object> getAncestors(CustomCategory methodObject) {
-		List<Object> ancestorList = new ArrayList<Object>();
-		List<Object> objList = new ArrayList<Object>();
-		objList.add(methodObject);
-		getAncestors(ancestorList, objList);
-		return ancestorList;
-	}
-
-	private List<Object> getAncestors(List<Object> ancestorList, List<Object> methodObjectList) {
-		if (methodObjectList.isEmpty())
-			return ancestorList;
-
-		List allParentCustCats = new ArrayList();
-
-		for (Iterator<Object> iter = methodObjectList.iterator(); iter.hasNext();) {
-			CustomCategory element = (CustomCategory) iter.next();
-			List parentList = AssociationHelper.getCustomCategories(element);
-			allParentCustCats.addAll(parentList);
-		}
-
-		ancestorList.addAll(methodObjectList);
-		List<Object> nextCheckList = new ArrayList<Object>();
-		for (Iterator iter = allParentCustCats.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!ancestorList.contains(element)) {
-				nextCheckList.add(element);
-			}
-		}
-
-		return getAncestors(ancestorList, nextCheckList);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return category;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ALL_ELEMENTS;
-	}
-
-	private class CustomCategoryAssignFilter extends AllFilter {
-		protected boolean childAccept(Object obj) {
-			if (obj instanceof ProcessPackage)
-				return true;
-			if (obj instanceof Process)
-				return true;
-			if(obj instanceof Milestone){
-				return true;
-			}
-			if(obj instanceof Activity){
-				return true;
-			}
-			if (obj instanceof CustomCategory) {
-				if (TngUtil.isRootCustomCategory((CustomCategory) obj)) {
-					return !(((CustomCategory) obj).getCategorizedElements()
-							.isEmpty());
-				}
-			}
-			if (obj instanceof TermDefinition)
-				return false;
-			if (obj instanceof ContentElement) {
-				// if (obj instanceof Discipline){
-				// return
-				// AssociationHelper.getDisciplineGroups((Discipline)obj).isEmpty();
-				// }
-				// if (obj instanceof RoleSet){
-				// return
-				// AssociationHelper.getRoleSetGroups((RoleSet)obj).isEmpty();
-				// }
-				return !(getHelper().isContributor((ContentElement) obj));
-			}
-			return false;
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new CustomCategoryAssignFilter();
-	}
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.customCategoryAssignPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.customCategoryAssignPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.customCategoryAssignPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.customCategoryAssignPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return null;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return null;
-	}
-	
-	@Override
-	protected EStructuralFeature getContentCategoryOrderFeature() {
-		return UmaPackage.eINSTANCE.getCustomCategory_CategorizedElements();
-	}
-	
-	@Override
-	protected String[] getModelStructurePath() {
-		return ModelStructure.DEFAULT.customCategoryPath;
-	}
-	
-	@Override
-	protected ContentElementOrderList getContentElementOrderList() {
-		return allSteps;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CustomCategoryDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CustomCategoryDescriptionPage.java
deleted file mode 100644
index af25809..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/CustomCategoryDescriptionPage.java
+++ /dev/null
@@ -1,94 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CustomCategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Domain editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class CustomCategoryDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "customCategoryDescriptionPage"; //$NON-NLS-1$
-
-	private CustomCategory category;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CustomCategoryDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		category = (CustomCategory) contentElement;
-		publishCategoryOn = true;
-		setIconSectionOn(true);
-		
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return category;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.CUSTOM_CATEGORIES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CustomCategoryFilter();
-		// set additional filter for variability base element checking
-		((CustomCategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						category) });
-		return filter;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.customcategory_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.customcategory_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.customcategory_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.customcategory_versionInfoSection_desc;
-		this.iconSectionDescription =  AuthoringUIResources.customcategory_IconSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DeliveryProcessDescription.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DeliveryProcessDescription.java
deleted file mode 100644
index a7b9fb2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DeliveryProcessDescription.java
+++ /dev/null
@@ -1,330 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * Description page for delivery process
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class DeliveryProcessDescription extends ProcessDescription {
-
-	private IMethodRichText ctrl_scale, ctrl_project_characteristics;
-
-	private IMethodRichText ctrl_risk_level, ctrl_estimating_techniques;
-
-	private IMethodRichText ctrl_project_member_expertise,
-			ctrl_type_of_contract;
-
-	private DeliveryProcess deliveryProcess;
-
-	/**
-	 * Creates an instance
-	 * @param editor
-	 */
-	public DeliveryProcessDescription(FormEditor editor) {
-		super(editor);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.ProcessFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		deliveryProcess = (DeliveryProcess) process;
-
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.ProcessDescription#createDetailSection()
-	 */
-	protected void createDetailSection() {
-		super.createDetailSection();
-
-		// scale
-		ctrl_scale = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIResources.Process_Scale, 40, 400, DETAIL_SECTION_ID); 
-
-		// project characteristics
-		ctrl_project_characteristics = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_ProjectCharacteristics, 40, 400, DETAIL_SECTION_ID); 
-
-		// risk level
-		ctrl_risk_level = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_RiskLevel, 40, 400, DETAIL_SECTION_ID); 
-
-		// Estimating technique
-		ctrl_estimating_techniques = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_EstimatingTechnique, 40, 400, DETAIL_SECTION_ID); 
-
-		// Project Member expertise
-		ctrl_project_member_expertise = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_ProjectMemberExpertise, 40, 400, DETAIL_SECTION_ID); 
-
-		// Type of contract
-		ctrl_type_of_contract = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_TypeOfContract, 40, 400, DETAIL_SECTION_ID); 
-
-	}
-
-	/**
-	 * Loads initial data from model
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.forms.ProcessDescription#loadData()
-	 */
-	public void loadData() {
-		super.loadData();
-
-		org.eclipse.epf.uma.DeliveryProcessDescription content = (org.eclipse.epf.uma.DeliveryProcessDescription) deliveryProcess
-				.getPresentation();
-		String scale = content.getScale();
-		String projectChar = content.getProjectCharacteristics();
-		String estimatingTechnique = content.getEstimatingTechnique();
-		String riskLevel = content.getRiskLevel();
-		String projectMemberExpertiese = content.getProjectMemberExpertise();
-		String typeOfContract = content.getTypeOfContract();
-
-		ctrl_scale.setText(scale == null ? "" : scale); //$NON-NLS-1$
-		ctrl_project_characteristics
-				.setText(projectChar == null ? "" : projectChar); //$NON-NLS-1$
-		ctrl_estimating_techniques
-				.setText(estimatingTechnique == null ? "" : estimatingTechnique); //$NON-NLS-1$
-		ctrl_risk_level.setText(riskLevel == null ? "" : riskLevel); //$NON-NLS-1$
-		ctrl_project_member_expertise
-				.setText(projectMemberExpertiese == null ? "" : projectMemberExpertiese); //$NON-NLS-1$
-		ctrl_type_of_contract
-				.setText(typeOfContract == null ? "" : typeOfContract); //$NON-NLS-1$
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.forms.ProcessDescription#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-		MethodElementEditor editor = ((MethodElementEditor) getEditor());
-		final IActionManager actionMgr = editor.getActionManager();
-		final org.eclipse.epf.uma.DeliveryProcessDescription content = (org.eclipse.epf.uma.DeliveryProcessDescription) deliveryProcess
-				.getPresentation();
-
-		ctrl_scale.setModalObject(deliveryProcess.getPresentation());
-		ctrl_scale.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getDeliveryProcessDescription_Scale());
-		ctrl_scale.addModifyListener(contentModifyListener);
-		ctrl_scale.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_scale;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getScale();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, deliveryProcess
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getDeliveryProcessDescription_Scale(), newContent,
-							-1);
-				}
-			}
-		});
-
-		ctrl_project_characteristics.setModalObject(deliveryProcess
-				.getPresentation());
-		ctrl_project_characteristics.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getDeliveryProcessDescription_ProjectCharacteristics());
-		ctrl_project_characteristics.addModifyListener(contentModifyListener);
-		ctrl_project_characteristics.addListener(SWT.Deactivate,
-				new Listener() {
-					public void handleEvent(Event e) {
-						IMethodRichText control = descExpandFlag ? ctrl_expanded
-								: ctrl_project_characteristics;
-						if (!control.getModified()) {
-							return;
-						}
-						String oldContent = content.getProjectCharacteristics();
-						if (((MethodElementEditor) getEditor())
-								.mustRestoreValue(control, oldContent)) {
-							return;
-						}
-						String newContent = control.getText();
-						if (!newContent.equals(oldContent)) {
-							actionMgr
-									.doAction(
-											IActionManager.SET,
-											deliveryProcess.getPresentation(),
-											UmaPackage.eINSTANCE
-													.getDeliveryProcessDescription_ProjectCharacteristics(),
-											newContent, -1);
-						}
-					}
-				});
-
-		ctrl_risk_level.setModalObject(deliveryProcess.getPresentation());
-		ctrl_risk_level.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getDeliveryProcessDescription_RiskLevel());
-		ctrl_risk_level.addModifyListener(contentModifyListener);
-		ctrl_risk_level.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_risk_level;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getRiskLevel();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, deliveryProcess
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getDeliveryProcessDescription_RiskLevel(),
-							newContent, -1);
-				}
-			}
-		});
-
-		ctrl_estimating_techniques.setModalObject(deliveryProcess
-				.getPresentation());
-		ctrl_estimating_techniques.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getDeliveryProcessDescription_EstimatingTechnique());
-		ctrl_estimating_techniques.addModifyListener(contentModifyListener);
-		ctrl_estimating_techniques.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_estimating_techniques;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getEstimatingTechnique();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr
-							.doAction(
-									IActionManager.SET,
-									deliveryProcess.getPresentation(),
-									UmaPackage.eINSTANCE
-											.getDeliveryProcessDescription_EstimatingTechnique(),
-									newContent, -1);
-				}
-			}
-		});
-
-		ctrl_project_member_expertise.setModalObject(deliveryProcess
-				.getPresentation());
-		ctrl_project_member_expertise
-				.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getDeliveryProcessDescription_ProjectMemberExpertise());
-		ctrl_project_member_expertise.addModifyListener(contentModifyListener);
-		ctrl_project_member_expertise.addListener(SWT.Deactivate,
-				new Listener() {
-					public void handleEvent(Event e) {
-						IMethodRichText control = descExpandFlag ? ctrl_expanded
-								: ctrl_project_member_expertise;
-						if (!control.getModified()) {
-							return;
-						}
-						String oldContent = content.getProjectMemberExpertise();
-						if (((MethodElementEditor) getEditor())
-								.mustRestoreValue(control, oldContent)) {
-							return;
-						}
-						String newContent = control.getText();
-						if (!newContent.equals(oldContent)) {
-							actionMgr
-									.doAction(
-											IActionManager.SET,
-											deliveryProcess.getPresentation(),
-											UmaPackage.eINSTANCE
-													.getDeliveryProcessDescription_ProjectMemberExpertise(),
-											newContent, -1);
-						}
-					}
-				});
-
-		ctrl_type_of_contract.setModalObject(deliveryProcess.getPresentation());
-		ctrl_type_of_contract.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getDeliveryProcessDescription_TypeOfContract());
-		ctrl_type_of_contract.addModifyListener(contentModifyListener);
-		ctrl_type_of_contract.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_type_of_contract;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getTypeOfContract();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, deliveryProcess
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getDeliveryProcessDescription_TypeOfContract(),
-							newContent, -1);
-				}
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.ProcessDescription#refresh(boolean)
-	 */
-	protected void refresh(boolean editable) {
-		super.refresh(editable);
-		ctrl_estimating_techniques.setEditable(editable);
-		ctrl_project_characteristics.setEditable(editable);
-		ctrl_project_member_expertise.setEditable(editable);
-		ctrl_risk_level.setEditable(editable);
-		ctrl_scale.setEditable(editable);
-		ctrl_type_of_contract.setEditable(editable);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DescriptionFormPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DescriptionFormPage.java
deleted file mode 100644
index a0b7cb4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DescriptionFormPage.java
+++ /dev/null
@@ -1,2853 +0,0 @@
-//------------------------------------------------------------------------------
-	// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.authoring.ui.util.EditorsContextHelper;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.library.ui.LibraryUIUtil;
-import org.eclipse.epf.library.ui.actions.MethodElementDeleteAction;
-import org.eclipse.epf.library.ui.util.ConvertGuidanceType;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.richtext.RichTextListener;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-import com.ibm.icu.text.DateFormat;
-
-
-/**
- * The base class for all Description pages in the Method editors.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=176382
- */
-public abstract class DescriptionFormPage extends BaseFormPage implements IRefreshable {
-
-	public static final int BUTTON_WIDTH = 150;
-	
-	protected static final String NOT_APPLICABLE_TEXT = AuthoringUIResources.notApplicable_text; 
-	
-	protected static final String CONTRIBUTES_TEXT = AuthoringUIResources.contributes_text; 
-	
-	private static final String LOCAL_CONTRIBUTES_TEXT = AuthoringUIResources.localContributes_text;  
-
-	protected static final String EXTENDS_TEXT = AuthoringUIResources.extends_text; 
-
-	protected static final String REPLACES_TEXT = AuthoringUIResources.replaces_text; 
-	
-	protected static final String LOCAL_REPLACES_TEXT = AuthoringUIResources.localReplaces_text; 
-	
-	protected static final String EXTENDS_REPLACES_TEXT = AuthoringUIResources.extendsReplaces_text;
-
-	protected static final ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngUtil.umaItemProviderAdapterFactory);
-	
-	// Composites and sections.
-	protected Section formSection;
-
-	protected Composite sectionComposite;
-
-	protected Composite expandedComposite;
-
-	protected Section generalSection;
-
-	protected Section variabilitySection;
-
-	protected Composite generalComposite;
-
-	protected Composite variabilityComposite;
-
-	protected Section versionSection;
-
-	protected Composite versionComposite;
-
-	protected Section iconSection;
-
-	protected Composite iconComposite;
-
-	private Canvas pane1;
-
-	private Canvas pane3;
-
-	protected Section detailSection;
-
-	protected Composite detailComposite;
-
-	protected Section notationSection;
-
-	protected Composite notationComposite;
-
-	protected Section tailoringSection;
-
-	protected Composite tailoringComposite;
-
-	// Edit controls.
-	protected Text ctrl_name;
-
-	protected Text ctrl_presentation_name;
-
-	protected Label ctrl_type_label;
-
-	protected Button ctrl_type_button;
-
-	protected Text ctrl_brief_desc;
-
-	protected IMethodRichText ctrl_full_desc;
-
-	protected IMethodRichText ctrl_key;
-
-	protected IMethodRichTextEditor ctrl_expanded;
-
-	protected ComboViewer viewer_variability;
-
-	protected Combo ctrl_variability;
-
-	protected Label label_base;
-
-	protected TableViewer base_viewer;
-
-	protected Table ctrl_base;
-
-	protected Button ctrl_base_button;
-
-	private IMethodRichText activeControl;
-
-	private Text ctrl_authors;
-
-	private Text ctrl_change_date;
-
-	private Text ctrl_change_desc;
-
-	private Text ctrl_version;
-
-	protected Label label_copyright;
-
-	protected TableViewer copyright_viewer;
-
-	protected Table ctrl_copyright;
-
-	private Button copyright_button;
-
-	private Button copyright_button_deselect;
-
-	protected ImageHyperlink expandDetailLink;
-
-	protected Label expandDetailLabel;
-
-	protected ImageHyperlink expandNotationLink;
-
-	protected Label expandNotationLabel;
-
-	protected ImageHyperlink expandTailoringLink;
-
-	protected Label expandTailoringLabel;
-
-	protected IMethodRichText ctrl_purpose;
-
-	protected Text ctrl_external_id;
-
-	private Image shapeImage;
-
-	private Image nodeImage;
-
-	protected Button ctrl_select_shapeIcon_button;
-
-	protected Button ctrl_clear_shapeIcon_button;
-
-	protected Button ctrl_select_nodeIcon_button;
-
-	protected Button ctrl_clear_nodeIcon_button;
-	
-	protected Button ctrl_publish_categories_button;
-
-	protected ImageHyperlink expandVersionLink;
-
-	protected Label expandVersionLabel;
-
-	protected ImageHyperlink expandLink;
-
-	protected Label expandLabel;
-	
-	protected IStructuredContentProvider contentProviderVariability;
-
-	protected IStructuredContentProvider contentProviderBase;
-	
-	protected ILabelProvider labelProviderVariability = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getText(Object object) {
-			VariabilityType varObject = (VariabilityType) object;
-			if (varObject == VariabilityType.NA_LITERAL)
-				return NOT_APPLICABLE_TEXT;
-			if (varObject == VariabilityType.CONTRIBUTES_LITERAL)
-				return CONTRIBUTES_TEXT;
-			if (varObject == VariabilityType.LOCAL_CONTRIBUTION_LITERAL)
-				return LOCAL_CONTRIBUTES_TEXT;
-			if (varObject == VariabilityType.EXTENDS_LITERAL)
-				return EXTENDS_TEXT;
-			if (varObject == VariabilityType.REPLACES_LITERAL)
-				return REPLACES_TEXT;
-			if (varObject == VariabilityType.LOCAL_REPLACEMENT_LITERAL)
-				return LOCAL_REPLACES_TEXT;
-			if (varObject == VariabilityType.EXTENDS_REPLACES_LITERAL)
-				return EXTENDS_REPLACES_TEXT;
-			
-			return null;
-		}
-	};
-
-	protected ILabelProvider labelProviderBase = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getColumnText(Object object, int columnIndex) {
-			return TngUtil.getLabelWithPath(object);
-		}
-	};
-
-	protected IActionManager actionMgr;
-
-	protected IStructuredContentProvider copyrightContentProvider;
-
-	private ILabelProvider copyrightLabelProviderBase = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory());
-
-	protected ModifyListener modelModifyListener;
-
-	protected ModifyListener contentModifyListener;
-
-	// Editing and display flags.
-	protected boolean descExpandFlag = false;
-
-	protected boolean generalSectionExpandFlag = false;
-
-	protected boolean detailSectionExpandFlag = false;
-
-	protected boolean notationSectionExpandFlag = false;
-
-	protected boolean tailoringSectionExpandFlag = false;
-
-	protected boolean versionSectionExpandFlag = false;
-
-	protected boolean elementSectionExpandFlag = false;
-
-	protected boolean iconSectionExpandFlag = false;
-
-	protected boolean fullDescOn = true;
-
-	protected boolean keyConsiderationOn = true;
-
-	protected boolean briefDescOn = true;
-
-	protected boolean elementTypeOn = false;
-
-	protected boolean contentFieldOn = false;
-
-	protected boolean versionSectionOn = true;
-
-	protected boolean anyAttributeModified = false;
-
-	protected boolean generalSectionOn = true;
-
-	protected boolean notationSectionOn = false;
-
-	protected boolean detailSectionOn = true;
-
-	protected boolean tailoringSectionOn = false;
-
-	protected boolean variabilitySectionOn = true;
-
-	protected boolean purposeOn = false;
-
-	protected boolean externalIdOn = false;
-
-	protected boolean iconSectionOn = false;
-	
-	protected boolean publishCategoryOn = false;
-
-	// commented because these variables are not in use
-	// protected String variabilityTypeNone = NOT_APPLICABLE_TEXT;
-	// protected String variabilityTypeContributes = CONTRIBUTES_TEXT;
-	// protected String variabilityTypeExtends = EXTENDS_TEXT;
-	// protected String variabilityTypeReplaces = REPLACES_TEXT;
-
-	// Internal IDs for the sections.
-	protected static final int GENERAL_SECTION_ID = 1;
-
-	protected static final int DETAIL_SECTION_ID = 2;
-
-	protected static final int VERSION_SECTION_ID = 3;
-
-	protected static final int NOTATION_SECTION_ID = 4;
-
-	protected static final int TAILORING_SECTION_ID = 5;
-
-	private int warningCount = 1;
-
-	private int SECTIONS = 0;
-
-	private static int SHAPEICON_WIDTH_MAX = 32;
-
-	private static int SHAPEICON_HEIGHT_MAX = 32;
-
-	private static int NODEICON_WIDTH_MAX = 16;
-
-	private static int NODEICON_HEIGHT_MAX = 16;
-
-	protected IFilter filter;
-
-	private boolean disposed;
-
-	// To handle the i118n properly and avoid string concatenation.
-	public String generalSectionDescription;
-	public String detailSectionDescription;
-	public String tailoringSectionDescription;
-	public String notationSectionDescription;
-	public String variabilitySectionDescription;
-	public String iconSectionDescription;
-	public String versionSectionDescription;
-
-	private Label nodeIconPath;
-
-	private Label shapeIconPath;
-	
-	private String[] imageTypes = new String[] { "*.gif;*.jpg;*.png;*.ico;*.bmp" }; //$NON-NLS-1$
-	private String[] imageNames = new String[] { "Image (gif, jpeg, png, ico, bmp)" }; //$NON-NLS-1$
-
-	/**
-	 * Returns the Content filter associated with this page.
-	 */
-	protected IFilter getFilter() {
-		return filter;
-	}
-
-	/**
-	 * Returns the Content element associated with this page.
-	 */
-	protected Object getContentElement() {
-		return null;
-	}
-
-	protected void initContentProviderBase() {
-		contentProviderBase = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				ArrayList base_selected_list = new ArrayList();
-				if (contentElement.getVariabilityBasedOnElement() != null)
-					base_selected_list.add(contentElement
-							.getVariabilityBasedOnElement());
-				return base_selected_list.toArray();
-			}
-
-			public void notifyChanged(Notification notification) {
-				switch (notification.getFeatureID(VariabilityElement.class)) {
-				case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-					super.notifyChanged(notification);
-				}
-			}
-		};
-		base_viewer.setContentProvider(contentProviderBase);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param editor
-	 *            The parent form editor.
-	 * @param id
-	 *            The unique ID for the form page.
-	 * @param title
-	 *            The title for the form page.
-	 */
-	public DescriptionFormPage(FormEditor editor, String id, String title) {
-		super(editor, id, title);
-	}
-	
-	private class VariabilityTypeContentProvider extends AdapterFactoryContentProvider {
-
-		private VariabilityType[] types;
-
-		public VariabilityTypeContentProvider(AdapterFactory adapterFactory, VariabilityType[] types) {
-			super(adapterFactory);
-			this.types = types;
-		}
-		
-		@Override
-		public Object[] getElements(Object object) {
-			return types;
-		}
-		
-		@Override
-		public void notifyChanged(Notification notification) {
-			if (notification.getNotifier() == contentElement
-					&& notification.getEventType() == Notification.SET
-					&& notification.getFeature() == UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE) {
-				viewer.setSelection(new StructuredSelection(notification.getNewValue()));
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.BaseFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		
-		VariabilityType[] types;
-		if (contentElement instanceof ContentCategory) {
-			types = new VariabilityType[] {
-					VariabilityType.NA_LITERAL,
-					VariabilityType.CONTRIBUTES_LITERAL,
-					VariabilityType.REPLACES_LITERAL,
-					VariabilityType.EXTENDS_REPLACES_LITERAL
-			};
-		} else {
-			types = new VariabilityType[] {
-					VariabilityType.NA_LITERAL,
-					VariabilityType.CONTRIBUTES_LITERAL,
-					VariabilityType.EXTENDS_LITERAL,
-					VariabilityType.REPLACES_LITERAL,
-					VariabilityType.EXTENDS_REPLACES_LITERAL
-			};
-		}
-		contentProviderVariability = new VariabilityTypeContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory(), types);
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-		createEditorContent(toolkit);
-		setContextHelp();
-		setFormTextWithVariableInfo();
-		loadData();
-		addListeners();
-	}
-
-	private void setFormTextWithVariableInfo() {
-		UIHelper.setFormText(form, contentElement);
-	}
-
-	/**
-	 * @deprecated
-	 * @see TngUtil#getLabel Code moved to TngUtil.getLabel(below more specific
-	 *      method)returns label with variabilityInfo
-	 *      <code>TngUtil.getLabel(VariabilityElement object, String alternativeLabel, boolean preferBase)</code>
-	 * 
-	 */
-	public String getLabel(VariabilityElement object, String alternativeLabel,
-			boolean preferBase) {
-		String label = TngUtil.getLabel(object, alternativeLabel);
-		if (preferBase && object.getVariabilityBasedOnElement() != null) {
-			VariabilityType type = object.getVariabilityType();
-			String variabilityTxt = null;
-			if (type == VariabilityType.CONTRIBUTES_LITERAL) {
-				variabilityTxt = AuthoringUIResources
-						.contributes_to_text; 
-			} else if (type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-				variabilityTxt = AuthoringUIResources
-					.localContributes_text; 			
-			} else if (type == VariabilityType.EXTENDS_LITERAL) {					
-				variabilityTxt = AuthoringUIResources
-						.extends_text;
-			} else if (type == VariabilityType.REPLACES_LITERAL) {
-				variabilityTxt = AuthoringUIResources
-						.replaces_text; 
-			} else if (type == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-				variabilityTxt = AuthoringUIResources
-						.localReplaces_text; 
-			} else if (type == VariabilityType.EXTENDS_REPLACES_LITERAL) {
-				variabilityTxt = AuthoringUIResources
-				.extendsReplaces_text; 
-			}
-			if (variabilityTxt != null) {
-				StringBuffer strBuf = new StringBuffer(label)
-						.append(" (").append(variabilityTxt).append(" '") //$NON-NLS-1$ //$NON-NLS-2$
-						.append(
-								TngUtil.getLabel(object
-										.getVariabilityBasedOnElement(),
-										alternativeLabel)).append("'"); //$NON-NLS-1$
-				MethodPlugin basePlugin = UmaUtil.getMethodPlugin(object
-						.getVariabilityBasedOnElement());
-				if (basePlugin != null) {
-					strBuf
-							.append(" in '").append(basePlugin.getName()).append("')"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				label = strBuf.toString();
-			}
-		}
-
-		return label;
-	}
-
-	/**
-	 * Creates the editor tab content
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		createFormComposites(toolkit);
-		loadSectionDescription();
-		// Create the General section.
-		if (generalSectionOn) {
-			createGeneralSection(toolkit);
-			SECTIONS++;
-		}
-
-		// Create the Detail section.
-		if (detailSectionOn) {
-			createDetailSection(toolkit);
-			SECTIONS++;
-		}
-
-		// Create the Notation section.
-		if (notationSectionOn) {
-			createNotationSection(toolkit);
-			SECTIONS++;
-		}
-
-		// Create the Tailoring Section.
-		if (tailoringSectionOn) {
-			createTailoringSection(toolkit);
-			SECTIONS++;
-		}
-
-		// Create the Version section.
-		if (versionSectionOn) {
-			createVersionSection(toolkit);
-			createVersionSectionContent();
-			SECTIONS++;
-		}
-
-		if (variabilitySectionOn) {
-			createVariabilitySection(toolkit);
-			SECTIONS++;
-		}
-
-		// Icon Section
-		if (iconSectionOn) {
-			createIconSection(toolkit);
-			createIconSectionContent();
-			SECTIONS++;
-		}
-
-		toolkit.paintBordersFor(variabilityComposite);
-		toolkit.paintBordersFor(expandedComposite);
-		toolkit.paintBordersFor(generalComposite);
-		toolkit.paintBordersFor(versionComposite);
-	}
-
-	private void createFormComposites(FormToolkit toolkit) {
-		// Create the main section (used for swapping display of
-		// sectionComposite and expandedComposite).
-		formSection = toolkit.createSection(form.getBody(), Section.NO_TITLE);
-		{
-			TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-			formSection.setLayoutData(td);
-			formSection.setLayout(new TableWrapLayout());
-		}
-
-		// Create the composite for the sections.
-		sectionComposite = toolkit.createComposite(formSection, SWT.NONE);
-		sectionComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		sectionComposite.setLayout(new TableWrapLayout());
-		formSection.setClient(sectionComposite);
-
-		// Create the composite for the RichTextEditor.
-		expandedComposite = toolkit.createComposite(formSection, SWT.NONE);
-		{
-			TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-			expandedComposite.setLayoutData(td);
-			expandedComposite.setLayout(new GridLayout(2, false));
-			expandedComposite.setVisible(false);
-		}
-
-		// Add the expand/collapse hyperlink image.
-		expandLink = toolkit.createImageHyperlink(expandedComposite, SWT.NONE);
-		expandLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		expandLink.setToolTipText(AuthoringUIResources.closeRTE);
-		expandLink.setUnderlined(false);
-		expandLink.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e);
-			}
-		});
-
-		// Add the expand/collapse hyperlink text.
-		expandLabel = createDecoratedLabel(toolkit, expandedComposite, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates the General section.
-	 */
-	protected void createGeneralSection(FormToolkit toolkit) {
-		generalSection = createSection(toolkit, sectionComposite,
-				AuthoringUIText.GENERAL_INFO_SECTION_NAME,
-				getGeneralSectionDescription());
-		generalComposite = createComposite(toolkit, generalSection);
-		((GridLayout) generalComposite.getLayout()).numColumns = 4;
-		createGeneralSectionContent();
-	}
-
-	/**
-	 * Creates the General section content.
-	 */
-	private void createGeneralSectionContent() {
-		// Add the Name label and text control.
-		ctrl_name = createTextEditWithLabel3(toolkit, generalComposite,
-				AuthoringUIText.NAME_TEXT, SWT.DEFAULT, SWT.SINGLE);
-
-		// Add the Presentation name label and text control.
-		ctrl_presentation_name = createTextEditWithLabel3(toolkit,
-				generalComposite, AuthoringUIText.PRESENTATION_NAME_TEXT,
-				SWT.DEFAULT, SWT.SINGLE);
-
-		if (elementTypeOn) {
-			createLabel(toolkit, generalComposite, AuthoringUIText.TYPE_TEXT, 2);
-			ctrl_type_label = createLabel(toolkit, generalComposite, ""); //$NON-NLS-1$
-			{
-				GridData gridData = new GridData(GridData.BEGINNING);
-				gridData.horizontalSpan = 1;
-				ctrl_type_label.setBackground(Display.getCurrent()
-						.getSystemColor(19));
-				ctrl_type_label.setLayoutData(gridData);
-			}
-			if (contentElement instanceof Guidance) {
-				ctrl_type_button = toolkit.createButton(generalComposite,
-						AuthoringUIText.CHANGE_TYPE_BUTTON_TEXT, SWT.PUSH);
-				{
-					GridData gridData = new GridData(GridData.BEGINNING);
-					gridData.horizontalSpan = 1;
-					ctrl_type_button.setLayoutData(gridData);
-				}
-				if (ConvertGuidanceType
-						.getValidNewGuidanceTypes((Guidance) contentElement) == null) {
-					ctrl_type_button.setVisible(false);
-				}
-			}
-		}
-
-		if (externalIdOn) {
-			ctrl_external_id = createTextEditWithLabel3(toolkit,
-					generalComposite, AuthoringUIText.UNIQUE_ID_TEXT,
-					SWT.DEFAULT, SWT.SINGLE);
-		}
-
-		if (briefDescOn) {
-			ctrl_brief_desc = createTextEditWithLabel3(toolkit,
-					generalComposite, AuthoringUIText.BRIEF_DESCRIPTION_TEXT,
-					40, SWT.MULTI | SWT.TRAVERSE_TAB_NEXT);
-		}		
-
-		if (publishCategoryOn) {
-			ctrl_publish_categories_button = toolkit
-			.createButton(
-					generalComposite,
-					AuthoringUIText.PUBLISH_CATEGORIES_TEXT, SWT.CHECK); 
-			GridData data = new GridData();
-			data.horizontalSpan = 3;
-			ctrl_publish_categories_button.setLayoutData(data);
-		}
-	}
-
-	/**
-	 * Creates the Content Variability section.
-	 */
-	protected void createVariabilitySection(FormToolkit toolkit) {
-		variabilitySection = createSection(toolkit, sectionComposite,
-				AuthoringUIText.VARIABILITY_SECTION_NAME,
-				getVariabilitySectionDescription());
-		
-		variabilityComposite = toolkit.createComposite(variabilitySection);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.BEGINNING | GridData.GRAB_HORIZONTAL);
-			gridData.horizontalSpan = 1;
-			gridData.heightHint = 24;
-			gridData.widthHint = 300;
-			variabilityComposite.setLayoutData(gridData);
-		}
-		variabilityComposite.setLayout(new GridLayout(5, false));
-		variabilitySection.setClient(variabilityComposite);
-
-		ctrl_variability = createComboWithLabel3(toolkit, variabilityComposite,
-				AuthoringUIText.VARIABILITY_TYPE_TEXT);
-
-		viewer_variability = new ComboViewer(ctrl_variability);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.BEGINNING | GridData.GRAB_HORIZONTAL);
-			gridData.horizontalSpan = 2;
-			gridData.heightHint = 24;
-			gridData.widthHint = 300;
-			viewer_variability.getCombo().setLayoutData(gridData);
-		}
-		viewer_variability.setContentProvider(contentProviderVariability);
-		viewer_variability.setLabelProvider(labelProviderVariability);
-		viewer_variability.setInput(contentElement);
-
-		toolkit.createLabel(variabilityComposite, "", SWT.NONE); //$NON-NLS-1$
-
-		//String baseElement = LibraryUIText.getUITextLower(methodElement);
-		label_base = createLabel(toolkit, variabilityComposite,
-				AuthoringUIText.BASE_ELEMENT_TEXT, 2);
-		ctrl_base = createTable(toolkit, variabilityComposite, SWT.SINGLE
-				| SWT.READ_ONLY, GridData.FILL_HORIZONTAL | GridData.BEGINNING, 5, 300, 1, 2);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.BEGINNING);
-			gridData.horizontalSpan = 2;
-			gridData.heightHint = 24;
-			gridData.widthHint = 300;
-			ctrl_base.setLayoutData(gridData);
-		}
-
-		base_viewer = new TableViewer(ctrl_base);
-		initContentProviderBase();
-		base_viewer.setLabelProvider(labelProviderBase);
-		base_viewer.setInput(contentElement);
-
-		Composite baseButtonPane = createComposite(toolkit, variabilityComposite, 
-				GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING, 1, 1, 1);
-		{
-			GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-			baseButtonPane.setLayoutData(gridData);
-		}
-		ctrl_base_button = toolkit.createButton(baseButtonPane,
-				AuthoringUIText.SELECT_BUTTON_TEXT, SWT.SIMPLE);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.widthHint = BUTTON_WIDTH;
-			ctrl_base_button.setLayoutData(gridData);
-		}
-
-		// Set focus on the Name text control.
-		Display display = form.getBody().getDisplay();
-		if (!(display == null || display.isDisposed())) {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					if(ctrl_name.isDisposed()) return;
-					
-					ctrl_name.setFocus();
-					ContentDescription contentDescription = contentElement
-							.getPresentation();
-					if (contentDescription.getChangeDate() == null)
-						ctrl_name.setSelection(0, ctrl_name.getText().length());
-				}
-			});
-		}
-	}
-
-	protected void refresh(boolean editable) {
-		ctrl_name.setEditable(editable);
-		ctrl_presentation_name.setEditable(editable);
-
-		if (briefDescOn) {
-			ctrl_brief_desc.setEditable(editable);
-		}
-		if (purposeOn) {
-			ctrl_purpose.setEditable(editable);
-		}
-		if (fullDescOn) {
-			ctrl_full_desc.setEditable(editable);
-		}
-		if (keyConsiderationOn) {
-			ctrl_key.setEditable(editable);
-		}
-		if (externalIdOn) {
-			ctrl_external_id.setEditable(editable);
-		}
-		if (elementTypeOn) {
-			ctrl_type_button.setEnabled(editable);
-		}
-		if (variabilitySectionOn) {
-			ctrl_variability.setEnabled(editable);
-			ctrl_base_button.setEnabled(editable);
-			if (((IStructuredSelection) viewer_variability.getSelection())
-					.getFirstElement() == VariabilityType.NA_LITERAL) {
-				ctrl_base_button.setEnabled(false);
-			}
-		}
-		if (versionSectionOn) {
-			ctrl_change_date.setEditable(false);
-			ctrl_change_desc.setEditable(editable);
-			ctrl_authors.setEditable(editable);
-			ctrl_version.setEditable(editable);
-			copyright_button.setEnabled(editable);
-			setCopyrightButtonDeselect();
-		}
-		if (iconSectionOn) {
-			ctrl_select_shapeIcon_button.setEnabled(editable);
-			ctrl_clear_shapeIcon_button.setEnabled(editable
-					&& contentElement.getShapeicon() != null);
-			ctrl_select_nodeIcon_button.setEnabled(editable);
-			ctrl_clear_nodeIcon_button.setEnabled(editable
-					&& contentElement.getNodeicon() != null);
-		}
-		if (ctrl_expanded != null) {
-			ctrl_expanded.setEditable(editable);
-		}
-		
-		if (publishCategoryOn) {
-			ctrl_publish_categories_button.setEnabled(editable);
-		}
-	}
-
-	/**
-	 * Create the Detail section.
-	 */
-	protected void createDetailSection(FormToolkit toolkit) {
-		detailSection = createSection(toolkit, sectionComposite,
-				AuthoringUIText.DETAIL_SECTION_NAME,
-				getDetailSectionDescription());
-		detailComposite = createComposite(toolkit, detailSection);
-		createDetailSectionContent();
-		toolkit.paintBordersFor(detailComposite);
-	}
-
-	/**
-	 * Creates the Detail section content.
-	 */
-	private void createDetailSectionContent() {
-		if (purposeOn) {
-			ctrl_purpose = createRichTextEditWithLinkForSection(toolkit,
-					detailComposite, AuthoringUIText.PURPOSE_TEXT, 40, 400,
-					DETAIL_SECTION_ID);
-		}
-
-		if (fullDescOn) {
-			ctrl_full_desc = createRichTextEditWithLinkForSection(toolkit,
-					detailComposite, AuthoringUIText.MAIN_DESCRIPTION_TEXT,
-					100, 400, DETAIL_SECTION_ID);
-
-		}
-
-		if (keyConsiderationOn) {
-			ctrl_key = createRichTextEditWithLinkForSection(toolkit,
-					detailComposite, AuthoringUIText.KEY_CONSIDERATIONS_TEXT,
-					40, 400, DETAIL_SECTION_ID);
-		}
-	}
-
-	/**
-	 * Creates the Notation section.
-	 */
-	protected void createNotationSection(FormToolkit toolkit) {
-		notationSection = createSection(toolkit, sectionComposite,
-				AuthoringUIText.NOTATION_SECTION_NAME,
-				getNotationSectionDescription());
-		notationComposite = createComposite(toolkit, notationSection);
-		createNotationSectionContent();
-		toolkit.paintBordersFor(notationComposite);
-	}
-
-	/**
-	 * Creates the Notation section content.
-	 */
-	protected void createNotationSectionContent() {
-	}
-
-	/**
-	 * Creates the Tailoring section.
-	 */
-	protected void createTailoringSection(FormToolkit toolkit) {
-		tailoringSection = createSection(toolkit, sectionComposite,
-				AuthoringUIText.TAILORING_SECTION_NAME,
-				getTailoringSectionDescription());
-		tailoringComposite = createComposite(toolkit, tailoringSection);
-		createTailoringSectionContent();
-		toolkit.paintBordersFor(tailoringComposite);
-
-	}
-
-	protected void createTailoringSectionContent() {
-	}
-
-	/**
-	 * Add listeners to monitor focus and modification changes in the edit
-	 * controls.
-	 */
-	protected void addListeners() {
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-		modelModifyListener = editor.createModifyListener(contentElement);
-		contentModifyListener = editor.createModifyListener(contentElement
-				.getPresentation());
-		actionMgr = editor.getActionManager();
-
-		form.addControlListener(new ControlListener() {
-			public void controlResized(ControlEvent e) {
-				if (ctrl_expanded != null) {
-					((GridData) ctrl_expanded.getLayoutData()).heightHint = getRichTextEditorHeight();
-					((GridData) ctrl_expanded.getLayoutData()).widthHint = getRichTextEditorWidth();
-				}
-				formSection.layout(true, true);
-			}
-
-			public void controlMoved(ControlEvent e) {
-			}
-		});
-
-		form.getParent().addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event event) {
-				if(disposed) {
-					return;
-				}
-				
-				refresh(!TngUtil.isLocked(contentElement));
-				setFormTextWithVariableInfo();
-				
-				// do refresh variability and copyright viewer
-				if(variabilitySectionOn)
-					base_viewer.refresh();
-				if(versionSectionOn)
-					copyright_viewer.refresh();
-			}
-		});
-
-		if (generalSectionOn) {
-			addGeneralSectionListeners();
-		}
-
-		if (detailSectionOn) {
-			addDetailSectionListeners();
-		}
-
-		if (versionSectionOn) {
-			addVersionSectionListeners();
-		}
-
-		if (iconSectionOn) {
-			addIconSectionListeners();
-		}
-
-		viewer_variability
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						IStructuredSelection selection = (IStructuredSelection) viewer_variability
-								.getSelection();
-
-						if (contentElement.getVariabilityBasedOnElement() != null) {
-							boolean status = editor
-									.getActionManager()
-									.doAction(
-											IActionManager.SET,
-											contentElement,
-											UmaPackage.eINSTANCE
-													.getVariabilityElement_VariabilityType(),
-											(VariabilityType) selection
-													.getFirstElement(), -1);
-							if (!status) {
-								return;
-							}
-						}
-						if (selection.getFirstElement() == VariabilityType.NA_LITERAL) {
-							if (contentElement.getVariabilityBasedOnElement() != null) {
-								boolean status = editor
-										.getActionManager()
-										.doAction(
-												IActionManager.SET,
-												contentElement,
-												UmaPackage.eINSTANCE
-														.getVariabilityElement_VariabilityBasedOnElement(),
-												null, -1);
-								if (!status) {
-									return;
-								}
-							}
-							ctrl_base_button.setEnabled(false);
-							base_viewer.refresh();
-						} else {
-							List selectionBaseList = new ArrayList();
-							VariabilityElement base = contentElement
-									.getVariabilityBasedOnElement();
-							selectionBaseList.add(base);
-							ctrl_base_button.setEnabled(true);
-							base_viewer.refresh();
-						}
-						setFormTextWithVariableInfo();
-					}
-				});
-
-		ctrl_base_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				filter = getFilter();
-				if (filter != null) {
-					ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-							.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(), filter, getContentElement(),
-							LibraryUIText.getUIText(contentElement, true));
-					fd.setViewerSelectionSingle(true);
-					fd.setBlockOnOpen(true);
-					fd.setTitle(LibraryUIText.getUIText(contentElement, true));
-					fd.open();
-					fd.getSelectedItems();
-					if (fd.getSelectedItems().size() > 0) {
-						IStatus istatus = DependencyChecker.checkCircularDependencyAfterFilterSelection(
-								contentElement, (VariabilityElement) fd.getSelectedItems().get(0));
-						if(!istatus.isOK()) {
-							String title = AuthoringUIResources.variability_error_title;
-							AuthoringUIPlugin.getDefault().getMsgDialog().displayError(title, istatus.getMessage());						
-							return;
-						}
-						boolean status = editor
-								.getActionManager()
-								.doAction(
-										IActionManager.SET,
-										contentElement,
-										UmaPackage.eINSTANCE
-												.getVariabilityElement_VariabilityBasedOnElement(),
-										(VariabilityElement) fd
-												.getSelectedItems().get(0), -1);
-						if (!status) {
-							return;
-						}
-						status = editor
-								.getActionManager()
-								.doAction(
-										IActionManager.SET,
-										contentElement,
-										UmaPackage.eINSTANCE
-												.getVariabilityElement_VariabilityType(),
-										(VariabilityType) ((IStructuredSelection) viewer_variability
-												.getSelection())
-												.getFirstElement(), -1);
-					}
-				}
-				setFormTextWithVariableInfo();
-				if ((ctrl_base != null) && (!(ctrl_base.isDisposed())))
-					ctrl_base.redraw();
-				if ((base_viewer != null)
-						&& (!(base_viewer.getControl().isDisposed())))
-					base_viewer.refresh();
-			}
-		});
-	}
-
-	private void addGeneralSectionListeners() {
-		ctrl_name.addModifyListener(modelModifyListener);
-		ctrl_name.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getNamedElement_Name());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = contentElement.getName() ;
-				String name = ctrl_name.getText().trim();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, contentElement.getName())) {
-					return;
-				}
-				if (name.equals(contentElement.getName()))
-					return;
-				
-				// 178462
-				String msg = null;
-				if (oldContent.indexOf("&") < 0 && name.indexOf("&") > -1) { //$NON-NLS-1$ //$NON-NLS-2$
-					msg = NLS.bind(
-							LibraryEditResources.invalidElementNameError4_msg,
-							name);
-				} else {
-					IValidator validator = getNameValidator();
-					if(validator == null){
-						validator = IValidatorFactory.INSTANCE
-							.createNameValidator(
-									contentElement,
-									TngAdapterFactory.INSTANCE
-											.getNavigatorView_ComposedAdapterFactory());
-					}
-					msg = validator.isValid(name);
-				}
-				if (msg == null && !name.equals(contentElement.getName())) {
-					if(name.indexOf("&") > -1) { //$NON-NLS-1$
-						msg = NLS.bind(
-								LibraryEditResources.invalidElementNameError4_msg,
-								name);
-					}
-				}
-				if (msg == null) {
-					name = StrUtil.makeValidFileName(ctrl_name.getText());
-					ctrl_name.setText(name); //183084
-					if (!name.equals(contentElement.getName())) {						
-						boolean success = actionMgr.doAction(
-								IActionManager.SET, contentElement,
-								UmaPackage.eINSTANCE.getNamedElement_Name(),
-								name, -1);
-						if (!success) {
-							return;
-						}
-						if (ContentDescriptionFactory
-								.hasPresentation(contentElement)) {
-							Resource contentResource = contentElement
-									.getPresentation().eResource();
-							if (contentResource != null) {
-								((MethodElementEditor) getEditor())
-										.addResourceToAdjustLocation(contentResource);
-							}
-						}
-						setFormTextWithVariableInfo();
-						ctrl_name.setText(name);
-					}
-				} else {
-					//Fix missing "&" in error dialog
-					if (msg.indexOf("&") >= 0) {//$NON-NLS-1$
-						msg = msg.replace("&", "&&");//$NON-NLS-1$//$NON-NLS-2$
-					}
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayError(
-									AuthoringUIResources.renameError_title, 
-									msg);
-					ctrl_name.setText(contentElement.getName());
-					ctrl_name.getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							ctrl_name.setFocus();
-							ctrl_name.selectAll();
-						}
-					});
-				}
-			}
-		});
-
-		ctrl_presentation_name.addModifyListener(modelModifyListener);
-		ctrl_presentation_name.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				String oldContent = contentElement.getPresentationName();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				
-				String newContent = StrUtil.getPlainText(ctrl_presentation_name
-						.getText());				
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr.doAction(IActionManager.SET,
-							contentElement, UmaPackage.eINSTANCE
-									.getDescribableElement_PresentationName(),
-							newContent, -1);
-					if (success) {
-						ctrl_presentation_name.setText(newContent);
-					}
-				}
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.swt.events.FocusAdapter#focusGained(org.eclipse.swt.events.FocusEvent)
-			 */
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget, UmaPackage.eINSTANCE.getDescribableElement_PresentationName());
-			}
-		});
-
-		if (briefDescOn) {
-			ctrl_brief_desc.addModifyListener(modelModifyListener);
-			ctrl_brief_desc.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-							UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-				}
-
-				/* (non-Javadoc)
-				 * @see org.eclipse.swt.events.FocusAdapter#focusLost(org.eclipse.swt.events.FocusEvent)
-				 */
-				public void focusLost(FocusEvent e) {
-					String oldContent = contentElement.getBriefDescription();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							e.widget, oldContent)) {
-						return;
-					}
-					String newContent = ctrl_brief_desc.getText();
-					if (!newContent.equals(oldContent)) {
-						boolean success = actionMgr.doAction(
-								IActionManager.SET, contentElement,
-								UmaPackage.eINSTANCE
-										.getMethodElement_BriefDescription(),
-								newContent, -1);
-						if (success) {
-							ctrl_brief_desc.setText(newContent);
-						}
-					}
-				}
-			});
-		}
-
-		if (elementTypeOn) {
-			if (contentElement instanceof Guidance) {
-				ctrl_type_button.addListener(SWT.Selection, new Listener() {
-					public void handleEvent(Event event) {
-						final MethodElementEditor editor = (MethodElementEditor) getEditor();
-						if (editor.isDirty()) {
-							String title = AuthoringUIResources.descriptionTabGuidanceWarningDialog_title; 
-							String message = AuthoringUIResources.descriptionTabGuidanceWarningDialog_message1; 
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayWarning(title, message);
-						} else if (contentElement instanceof Guidance) {
-							MethodElementDeleteAction deleteAction = new MethodElementDeleteAction();
-							deleteAction.setEditingDomain(LibraryView.getView()
-									.getEditingDomain());
-							deleteAction
-									.selectionChanged(new StructuredSelection(
-											contentElement));
-							Command cmd = deleteAction
-									.createCommand(Collections
-											.singleton(contentElement));
-							if (cmd instanceof DeleteMethodElementCommand) {
-								Guidance newGuidance;
-								try {
-									newGuidance = ConvertGuidanceType
-										.convertGuidance(
-												(Guidance) contentElement,
-												null,
-												(DeleteMethodElementCommand) cmd);
-								}
-								finally {
-									try { cmd.dispose(); } catch(Exception e) {}
-								}
-								if (newGuidance != null) {
-									EditorChooser.getInstance().closeEditor(
-											contentElement);
-									EditorChooser.getInstance().openEditor(
-											newGuidance);
-								}
-							}
-						} else if (editor.isDirty()) {
-							String title = AuthoringUIResources.descriptionTabGuidanceWarningDialog_title; 
-							String message = AuthoringUIResources.descriptionTabGuidanceWarningDialog_message2; 
-							AuthoringUIPlugin.getDefault().getMsgDialog()
-									.displayWarning(title, message);
-						}
-					}
-				});
-			}
-		}
-		
-		if (publishCategoryOn)	{
-			ctrl_publish_categories_button.addSelectionListener(new SelectionAdapter() {			
-				public void widgetSelected(SelectionEvent e) {				
-					String val = new Boolean(ctrl_publish_categories_button.getSelection()).toString();				
-					MethodElementProperty prop = TngUtil.getPublishCategoryProperty(contentElement);
-										
-					if (prop == null) {			
-						prop = UmaFactory.eINSTANCE
-							.createMethodElementProperty();
-						prop.setName(TngUtil.PUBLISH_CATEGORY_PROPERTY);
-						prop.setValue(val);
-								
-						actionMgr
-						.doAction(
-								IActionManager.ADD,
-								contentElement,
-								UmaPackage.eINSTANCE
-										.getMethodElement_MethodElementProperty(),
-								prop, -1);
-					}
-					else {
-						actionMgr.doAction(IActionManager.SET,
-							prop,
-							UmaPackage.eINSTANCE
-									.getMethodElementProperty_Value(),
-							val, -1);
-					}
-				}
-			});
-		}
-	}
-
-	protected IValidator getNameValidator() {
-		return null;
-	}
-
-	private void addDetailSectionListeners() {
-		if (fullDescOn) {
-			ctrl_full_desc.setModalObject(contentElement.getPresentation());
-			ctrl_full_desc.setModalObjectFeature(UmaPackage.eINSTANCE
-					.getContentDescription_MainDescription());
-			ctrl_full_desc.addModifyListener(contentModifyListener);
-			ctrl_full_desc.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event e) {
-					IMethodRichText control = descExpandFlag ? ctrl_expanded
-							: ctrl_full_desc;
-					if (debug) {
-						System.out
-								.println("DescriptionFormPage.ctrl_full_desc.deactivateListener: control=" + control); //$NON-NLS-1$
-					}
-					if (!control.getModified()) {
-						if (debug) {
-							System.out
-									.println("DescriptionFormPage.ctrl_full_desc.deactivateListener: content not modified, exit"); //$NON-NLS-1$
-						}
-						return;
-					}
-					String oldContent = contentElement.getPresentation()
-							.getMainDescription();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							control, oldContent)) {
-						if (debug) {
-							System.out
-									.println("DescriptionFormPage.ctrl_full_desc.deactivateListener: restored old content, exit"); //$NON-NLS-1$
-						}
-						return;
-					}
-					String newContent = control.getText();
-					if (!newContent.equals(oldContent)) {
-						if (debug) {
-							System.out
-									.println("DescriptionFormPage.ctrl_full_desc.deactivateListener: saving modified content"); //$NON-NLS-1$
-						}
-						boolean success = actionMgr
-								.doAction(
-										IActionManager.SET,
-										contentElement.getPresentation(),
-										UmaPackage.eINSTANCE
-												.getContentDescription_MainDescription(),
-										newContent, -1);
-						if (debug) {
-							System.out
-									.println("DescriptionFormPage.ctrl_full_desc.deactivateListener: saved status=" + success); //$NON-NLS-1$
-						}
-						if (success && isVersionSectionOn()) {
-							updateChangeDate();
-						}
-					}
-					if (debug) {
-						System.out
-								.println("DescriptionFormPage.ctrl_full_desc.deactivateListener: exit"); //$NON-NLS-1$
-					}
-				}
-			});
-		}
-
-		if (keyConsiderationOn) {
-			ctrl_key.setModalObject(contentElement.getPresentation());
-			ctrl_key.setModalObjectFeature(UmaPackage.eINSTANCE
-					.getContentDescription_KeyConsiderations());
-			ctrl_key.addModifyListener(contentModifyListener);
-			ctrl_key.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event e) {
-					IMethodRichText control = descExpandFlag ? ctrl_expanded
-							: ctrl_key;
-					if (debug) {
-						System.out
-								.println("DescriptionFormPage.ctrl_key.deactivateListener: control=" + control); //$NON-NLS-1$
-					}
-					if (!control.getModified()) {
-						if (debug) {
-							System.out
-									.println("DescriptionFormPage.ctrl_key.deactivateListener: content not modified, exit"); //$NON-NLS-1$
-						}
-						return;
-					}
-					String oldContent = contentElement.getPresentation()
-							.getKeyConsiderations();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							control, oldContent)) {
-						if (debug) {
-							System.out
-									.println("DescriptionFormPage.ctrl_key.deactivateListener: restored old content, exit"); //$NON-NLS-1$
-						}
-						return;
-					}
-					String newContent = control.getText();
-					if (!newContent.equals(oldContent)) {
-						boolean success = actionMgr
-								.doAction(
-										IActionManager.SET,
-										contentElement.getPresentation(),
-										UmaPackage.eINSTANCE
-												.getContentDescription_KeyConsiderations(),
-										newContent, -1);
-						if (debug) {
-							System.out
-									.println("DescriptionFormPage.ctrl_key.deactivateListener: saved status=" + success); //$NON-NLS-1$
-						}
-						if (success && isVersionSectionOn()) {
-							updateChangeDate();
-						}
-					}
-					if (debug) {
-						System.out
-								.println("DescriptionFormPage.ctrl_key.deactivateListener: exit"); //$NON-NLS-1$
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * Initializes the controls with data from the model.
-	 */
-	protected void loadData() {
-		if (generalSectionOn) {
-			loadGeneralSectionData();
-		}
-		if (detailSectionOn) {
-			loadDetailSectionData();
-		}
-		if (notationSectionOn) {
-			loadNotationSectionData();
-		}
-		if (tailoringSectionOn) {
-			loadTailoringSectionData();
-		}
-		if (versionSectionOn) {
-			loadVersionSectionData();
-		}
-		if (iconSectionOn) {
-			loadIconSectionData();
-		}
-		if (variabilitySectionOn) {
-			variabilitySectionData();
-		}
-		form.getBody().layout(true, true);
-	}
-
-	private void loadGeneralSectionData() {
-		String name = contentElement.getName();
-		String presentationName = (contentElement).getPresentationName();
-		ctrl_name.setText(name == null ? "" : name); //$NON-NLS-1$
-		ctrl_presentation_name
-				.setText(presentationName == null ? "" : presentationName); //$NON-NLS-1$
-
-		if (elementTypeOn) {
-			// String type = contentElement.getType().getName();
-			String type = LibraryUIText.getUIText(contentElement);
-			ctrl_type_label.setText(type == null ? "" : type); //$NON-NLS-1$
-		}
-		if (briefDescOn) {
-			String brief_desc = contentElement.getBriefDescription();
-			ctrl_brief_desc.setText(brief_desc == null ? "" : brief_desc); //$NON-NLS-1$
-		}
-		
-		if (publishCategoryOn) {
-			MethodElementProperty prop = TngUtil.getPublishCategoryProperty(contentElement);
-			if (prop != null) {
-				String val = prop.getValue();
-				ctrl_publish_categories_button.setSelection((new Boolean(val)).booleanValue());
-			}
-		}
-	}
-
-	private void loadDetailSectionData() {
-		if (fullDescOn) {
-			String full_desc = (contentElement.getPresentation())
-					.getMainDescription();
-			ctrl_full_desc.setText(full_desc == null ? "" : full_desc); //$NON-NLS-1$
-		}
-		if (keyConsiderationOn) {
-			String keyConsiderations = (contentElement.getPresentation())
-					.getKeyConsiderations();
-			ctrl_key
-					.setText(keyConsiderations == null ? "" : keyConsiderations); //$NON-NLS-1$
-		}
-	}
-	
-	
-
-	private void loadTailoringSectionData() {
-	}
-
-	private void loadNotationSectionData() {
-	}
-
-	private void variabilitySectionData() {
-		VariabilityType variabilityType = contentElement.getVariabilityType();
-		List selectionVariabilityList = new ArrayList();
-		selectionVariabilityList.add(variabilityType);
-		IStructuredSelection newVariabilitySelection = new StructuredSelection(
-				selectionVariabilityList);
-		viewer_variability.setSelection(newVariabilitySelection, true);
-	}
-
-	/**
-	 * Toggle Description control to expand and control state.
-	 */
-	protected void toggle(HyperlinkEvent e) {
-		if (ctrl_expanded == null) {
-			ctrl_expanded = createRichTextEditor(toolkit, expandedComposite,
-					SWT.MULTI | SWT.WRAP | SWT.V_SCROLL, GridData.FILL_BOTH,
-					getRichTextEditorHeight(), getRichTextEditorWidth(), 2,
-					expandLabel);
-			ctrl_expanded.addModifyListener(contentModifyListener);
-		}
-
-		if (descExpandFlag) {
-			expandedComposite.setVisible(false);
-			sectionComposite.setVisible(true);
-			formSection.setClient(sectionComposite);
-			enableSections(true);
-			IMethodRichText richText = getActiveRichTextControl();
-			richText.setText(ctrl_expanded.getText());
-			richText.setFindReplaceAction(ctrl_expanded.getFindReplaceAction());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.removeListener(listener.getEventType(), listener
-						.getListener());
-			}
-			if (ctrl_expanded.getModified()) {
-				((MethodElementEditor) getEditor())
-						.saveModifiedRichText(ctrl_expanded);
-			}
-			richText.setFocus();
-		} else {
-			sectionComposite.setVisible(false);
-			expandedComposite.setVisible(true);
-			formSection.setClient(expandedComposite);
-			enableSections(false);
-			expandLabel.setText((String) ((ImageHyperlink) e.getSource())
-					.getData("Title")); //$NON-NLS-1$
-			IMethodRichText richText = (IMethodRichText) e.getHref();
-			ctrl_expanded.setInitialText(richText.getText());
-			ctrl_expanded.setModalObject(richText.getModalObject());
-			ctrl_expanded.setModalObjectFeature(richText
-					.getModalObjectFeature());
-			ctrl_expanded.setFindReplaceAction(richText.getFindReplaceAction());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.addListener(listener.getEventType(), listener
-						.getListener());
-			}
-			boolean editable = !TngUtil.isLocked(contentElement);
-			ctrl_expanded.setEditable(editable);
-			if (editable) {
-				ctrl_expanded.setFocus();
-			}
-			setActiveRichTextControl(richText);
-		}
-		form.getBody().layout(true, true);
-		descExpandFlag = !descExpandFlag;
-	}
-
-	/**
-	 * Set the active rich text control.
-	 */
-	private void setActiveRichTextControl(IMethodRichText ctrl) {
-		activeControl = ctrl;
-	}
-
-	/**
-	 * Returns the active rich text control.
-	 */
-	private IMethodRichText getActiveRichTextControl() {
-		return activeControl;
-	}
-
-	public void setBriefDescOn(boolean briefDescOn) {
-		this.briefDescOn = briefDescOn;
-	}
-
-	public void setFullDescOn(boolean fullDescOn) {
-		this.fullDescOn = fullDescOn;
-	}
-
-	public void setKeyConsiderationOn(boolean keyConsiderationOn) {
-		this.keyConsiderationOn = keyConsiderationOn;
-	}
-
-	/**
-	 * @param elementTypeOn
-	 *            The elementTypeOn to set.
-	 */
-	public void setElementTypeOn(boolean elementTypeOn) {
-		this.elementTypeOn = elementTypeOn;
-	}
-
-	/**
-	 * @return Returns the anyAttributeModified.
-	 */
-	public boolean isAnyAttributeModified() {
-		return anyAttributeModified;
-	}
-
-	/**
-	 * Set this if any attribute is modified. This is required for the change
-	 * date field in version section.
-	 * 
-	 * @param anyAttributeModified
-	 *            The anyAttributeModified to set.
-	 */
-	public void setAnyAttributeModified(boolean anyAttributeModified) {
-		this.anyAttributeModified = anyAttributeModified;
-	}
-
-	/**
-	 * @return Returns the versionSectionOn.
-	 */
-	public boolean isVersionSectionOn() {
-		return versionSectionOn;
-	}
-
-	/**
-	 * @param versionSectionOn
-	 *            The versionSectionOn to set.
-	 */
-	public void setVersionSectionOn(boolean versionSectionOn) {
-		this.versionSectionOn = versionSectionOn;
-	}
-
-	/**
-	 * Creates the Version Information section.
-	 */
-	private void createVersionSection(FormToolkit toolkit) {
-		versionSection = toolkit.createSection(sectionComposite,
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		versionSection.setLayoutData(td);
-		versionSection.setText(AuthoringUIText.VERSION_INFO_SECTION_NAME);
-		versionSection.setDescription(getVersionSectionDescription());
-		versionSection.setLayout(new GridLayout());
-
-		versionComposite = toolkit.createComposite(versionSection);
-		versionComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		versionComposite.setLayout(new GridLayout(5, false));
-		versionSection.setClient(versionComposite);
-	}
-	
-	
-
-	/**
-	 * Create the Version section content.
-	 */
-	private void createVersionSectionContent() {
-		ContentDescription contentDescription = contentElement.getPresentation();
-		String fillText = (contentDescription.getVersion() == null ? "" : contentDescription.getVersion()); //$NON-NLS-1$
-		ctrl_version = createTextEditWithLabel4(toolkit, versionComposite,
-				AuthoringUIText.VERSION_TEXT, SWT.DEFAULT, SWT.SINGLE, fillText);
-
-		fillText = contentDescription.getChangeDate() == null ? "" //$NON-NLS-1$
-				: DateFormat.getDateInstance(DateFormat.FULL).format(
-						contentDescription.getChangeDate());
-		ctrl_change_date = createTextEditWithLabel4(toolkit, versionComposite,
-				AuthoringUIText.CHANGE_DATE_TEXT, SWT.DEFAULT, SWT.SINGLE, fillText);
-		ctrl_change_date.setEditable(false);
-
-		ctrl_change_desc = createTextEditWithLabel5(toolkit, versionComposite,
-				AuthoringUIText.CHANGE_DESCRIPTION_TEXT, 40, SWT.MULTI);
-
-		ctrl_authors = createTextEditWithLabel5(toolkit, versionComposite,
-				AuthoringUIText.AUTHORS_TEXT, 40, SWT.MULTI);
-
-		label_copyright = createLabel(toolkit, versionComposite,
-				AuthoringUIText.COPYRIGHT_TEXT, 2);
-		ctrl_copyright = createTable(toolkit, versionComposite, SWT.SINGLE
-				| SWT.READ_ONLY, GridData.FILL_HORIZONTAL | GridData.BEGINNING | GridData.FILL_VERTICAL,
-				5, 400, 1, 2);
-
-		copyright_viewer = new TableViewer(ctrl_copyright);
-		initContentProviderCopyright();
-		copyright_viewer.setLabelProvider(copyrightLabelProviderBase);
-		copyright_viewer.setInput(contentElement);
-		Composite buttonpane = createComposite(toolkit, versionComposite,
-				GridData.HORIZONTAL_ALIGN_END, 1, 1, 1);
-		{
-			GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-			buttonpane.setLayoutData(gridData);
-		}
-		copyright_button = toolkit.createButton(buttonpane,
-				AuthoringUIText.SELECT_BUTTON_TEXT, SWT.SIMPLE);
-		{
-			GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-			gridData.widthHint = BUTTON_WIDTH;
-			copyright_button.setLayoutData(gridData);
-		}
-		copyright_button_deselect = toolkit.createButton(buttonpane,
-				AuthoringUIText.DESELECT_BUTTON_TEXT, SWT.SIMPLE);
-		{
-			GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-			gridData.widthHint = BUTTON_WIDTH;
-			copyright_button_deselect.setLayoutData(gridData);
-		}
-
-		setCopyrightButtonDeselect();
-
-		// Create the expanded composite.
-		toolkit.paintBordersFor(versionComposite);
-		//toolkit.paintBordersFor(buttonpane);
-	}
-
-	private void initContentProviderCopyright() {
-		copyrightContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List list = new ArrayList();
-				if (contentElement.getPresentation().getCopyrightStatement() != null) {
-					list.add(contentElement.getPresentation()
-							.getCopyrightStatement());
-				}
-				return list.toArray();
-			}
-
-			public void notifyChanged(Notification notification) {
-			}
-		};
-		copyright_viewer.setContentProvider(copyrightContentProvider);
-	}
-
-	protected void addVersionSectionListeners() {
-		ctrl_version.addModifyListener(contentModifyListener);
-		ctrl_version.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodUnit_Version());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = contentElement.getPresentation()
-						.getVersion();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil
-						.getPlainText(ctrl_version.getText());
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE.getMethodUnit_Version(),
-							newContent, -1);
-					if (status) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_authors.addModifyListener(contentModifyListener);
-		ctrl_authors.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodUnit_Authors());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = contentElement.getPresentation()
-						.getAuthors();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil
-						.getPlainText(ctrl_authors.getText());
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE.getMethodUnit_Authors(),
-							newContent, -1);
-					if (status) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		copyright_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IFilter filter = new ContentFilter() {
-					protected boolean childAccept(Object obj) {
-						if (obj instanceof Guidance) {
-							return (obj instanceof SupportingMaterial);
-						}
-						return false;
-					}
-				};
-				List alreadyExsting = new ArrayList();
-				if (ctrl_copyright.getItemCount() > 0) {
-					TableItem item = ctrl_copyright.getItems()[0];
-					if (item.getData() != null)
-						alreadyExsting.add(item.getData());
-				}
-				ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						filter, contentElement,
-						FilterConstants.SUPPORTING_MATERIALS, alreadyExsting);
-				fd.setViewerSelectionSingle(true);
-				fd.setBlockOnOpen(true);
-				fd.setTitle(FilterConstants.SUPPORTING_MATERIALS);
-				fd.open();
-				fd.getSelectedItems();
-				if (fd.getSelectedItems().size() > 0) {
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getMethodUnit_CopyrightStatement(),
-							(SupportingMaterial) fd.getSelectedItems().get(0),
-							-1);
-					if (!status) {
-						return;
-					}
-				}
-				copyright_viewer.refresh();
-				setCopyrightButtonDeselect();
-			}
-		});
-
-		ctrl_change_desc.addModifyListener(contentModifyListener);
-		ctrl_change_desc.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodUnit_ChangeDescription());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = contentElement.getPresentation()
-						.getChangeDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = ctrl_change_desc.getText();
-				newContent = newContent.replace(StrUtil.LINE_FEED, AuthoringUIResources.ChangeHistoryDialog_delimiter);
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr.doAction(
-							IActionManager.SET, contentElement
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getMethodUnit_ChangeDescription(), newContent, -1);
-					if (success) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		copyright_button_deselect.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						contentElement.getPresentation(), UmaPackage.eINSTANCE
-								.getMethodUnit_CopyrightStatement(), null, -1);
-				if (status) {
-					copyright_viewer.refresh();
-					setCopyrightButtonDeselect();
-				}
-			}
-		});
-	}
-
-	/*
-	 * update the change date if any attribute is modified.
-	 */
-	protected void updateChangeDate() {
-
-		Date changeDate = contentElement.getPresentation().getChangeDate();
-		DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
-
-		String oldContent = ""; //$NON-NLS-1$
-		if (changeDate != null) {
-			oldContent = df.format(changeDate);
-		}
-
-		Date currentDate = new Date();
-		String newContent = df.format(currentDate);
-		if (!newContent.equals(oldContent)) {
-			boolean status = actionMgr.doAction(IActionManager.SET,
-					contentElement.getPresentation(), UmaPackage.eINSTANCE
-							.getMethodUnit_ChangeDate(), currentDate, -1);
-			if (!status) {
-				return;
-			} else {
-				ctrl_change_date.setText(newContent);
-			}
-		}
-	}
-
-	protected void loadVersionSectionData() {
-
-		ContentDescription contentDescription = contentElement
-				.getPresentation();
-		ctrl_version
-				.setText(contentDescription.getVersion() == null ? "" : contentDescription.getVersion()); //$NON-NLS-1$
-		ctrl_authors
-				.setText(contentDescription.getAuthors() == null ? "" : contentDescription.getAuthors()); //$NON-NLS-1$
-		String changeDesc = contentDescription.getChangeDescription() == null ? "" : contentDescription.getChangeDescription(); //$NON-NLS-1$
-		changeDesc = changeDesc.replace(AuthoringUIResources.ChangeHistoryDialog_delimiter, StrUtil.LINE_FEED);
-		ctrl_change_desc.setText(changeDesc);
-		ctrl_change_date
-				.setText(contentDescription.getChangeDate() == null ? "" //$NON-NLS-1$
-						: DateFormat.getDateInstance(DateFormat.FULL).format(
-								contentDescription.getChangeDate()));
-	}
-
-	/**
-	 * Toggle Description control to expand and control state
-	 */
-	protected void toggle(HyperlinkEvent e, int id) {
-		// TODO- we should combine these methods into one. One way to do it,
-		// dispoing
-		// ctrl_expanded every time it collapses and creating it when we expand.
-		// At present, there is no method to dispose
-		toggle(e);
-	}
-
-	/**
-	 * @return Returns the iconSectionOn.
-	 */
-	public boolean isIconSectionOn() {
-		return iconSectionOn;
-	}
-
-	/**
-	 * @param iconSectionOn
-	 *            The iconSectionOn to set.
-	 */
-	public void setIconSectionOn(boolean iconSectionOn) {
-		this.iconSectionOn = iconSectionOn;
-	}
-
-	/**
-	 * Creates the Icon section.
-	 */
-	protected void createIconSection(FormToolkit toolkit) {
-		iconSection = toolkit.createSection(sectionComposite,
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		iconSection.setLayoutData(td);
-		iconSection.setText(AuthoringUIText.ICON_SECTION_NAME);
-		iconSection.setDescription(getIconSectionDescription());
-		iconSection.setLayout(new GridLayout());
-
-		iconComposite = toolkit.createComposite(iconSection);
-		iconComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		iconComposite.setLayout(new GridLayout(3, true));
-		iconSection.setClient(iconComposite);
-	}
-	private void createIconSectionContent() {
-		Composite shapeIconComposite = createComposite(toolkit, iconComposite,
-				1);
-		shapeIconComposite.setLayoutData(new GridData());
-		shapeIconComposite.setLayout(new GridLayout(2, true));
-//		createLabel(
-//				toolkit,
-//				shapeIconComposite,
-//				AuthoringUIResources.DescriptionFormPage_ShapeIconPreview_Label, 2); //$NON-NLS-1$
-		// No wrap needed
-		createLabelWithNoWrap(
-				toolkit,
-				shapeIconComposite,
-				AuthoringUIResources.DescriptionFormPage_ShapeIconPreview_Label,
-				GridData.BEGINNING,
-				2); 
-		
-		pane1 = new Canvas(shapeIconComposite, SWT.BORDER);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-
-			gridData.heightHint = 60;
-			gridData.widthHint = 60;
-			gridData.verticalSpan = 1;
-			gridData.horizontalSpan = 1;
-			pane1.setLayoutData(gridData);
-			pane1.setBackground(ColorConstants.lightGray);
-		}
-		// pane1.setSize(30,30);
-		Composite pane2 = createCompositeForButtons(toolkit, shapeIconComposite);
-		ctrl_select_shapeIcon_button = toolkit
-				.createButton(
-						pane2,
-						AuthoringUIResources.DescriptionFormPage_ShapeIconPreview_SelectButtonLabel, SWT.NONE); 
-		ctrl_clear_shapeIcon_button = toolkit
-				.createButton(
-						pane2,
-						AuthoringUIResources.DescriptionFormPage_ShapeIconPreview_ClearButtonLabel, SWT.NONE); 
-		if (contentElement.getShapeicon() == null)
-			ctrl_clear_shapeIcon_button.setEnabled(false);
-		else
-			ctrl_clear_shapeIcon_button.setEnabled(true);
-
-		Composite nodeIconComposite = createComposite(toolkit, iconComposite, 1);
-		nodeIconComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		nodeIconComposite.setLayout(new GridLayout(2, false));
-//		createLabel(
-//				toolkit,
-//				nodeIconComposite,
-//				AuthoringUIResources.DescriptionFormPage_NodeIconPreview_Label, 2); //$NON-NLS-1$
-		// No wrap need for 
-		createLabelWithNoWrap(
-				toolkit,
-				nodeIconComposite,
-				AuthoringUIResources.DescriptionFormPage_NodeIconPreview_Label,
-				GridData.BEGINNING,
-				2); 
-		pane3 = new Canvas(nodeIconComposite, SWT.BORDER);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-
-			gridData.heightHint = 40;
-			gridData.widthHint = 40;
-			gridData.verticalSpan = 1;
-			gridData.horizontalSpan = 1;
-			pane3.setLayoutData(gridData);
-			pane3.setBackground(ColorConstants.lightGray);
-		}
-		Composite pane4 = createCompositeForButtons(toolkit, nodeIconComposite);
-		ctrl_select_nodeIcon_button = toolkit
-				.createButton(
-						pane4,
-						AuthoringUIResources.DescriptionFormPage_NodeIconPreview_SelectButtonLabel, SWT.NONE); 
-		ctrl_clear_nodeIcon_button = toolkit
-				.createButton(
-						pane4,
-						AuthoringUIResources.DescriptionFormPage_NodeIconPreview_ClearButtonLabel, SWT.NONE); 
-		if (contentElement.getNodeicon() == null)
-			ctrl_clear_nodeIcon_button.setEnabled(false);
-		else
-			ctrl_clear_nodeIcon_button.setEnabled(true);
-		
-		new Label(iconComposite, SWT.NONE);
-		shapeIconPath = createLabelWithNoWrap(toolkit,
-				iconComposite, "", GridData.BEGINNING, 1); //$NON-NLS-1$
-		nodeIconPath = createLabelWithNoWrap(toolkit,
-				iconComposite, "", GridData.BEGINNING, 2); //$NON-NLS-1$
-//			new Label(nodeIconComposite, SWT.NONE);
-//		GridData data = new GridData(GridData.BEGINNING);
-//		data.horizontalSpan =2;
-//		nodeIconPath.setLayoutData(data);
-
-		toolkit.paintBordersFor(pane1);
-		toolkit.paintBordersFor(pane2);
-		toolkit.paintBordersFor(pane3);
-		toolkit.paintBordersFor(pane4);
-	}
-
-	protected void addIconSectionListeners() {
-
-		ctrl_select_shapeIcon_button
-				.addSelectionListener(new SelectionAdapter() {
-//					File libDirFile = new File(LibraryService.getInstance()
-//							.getCurrentMethodLibraryPath());
-
-					public void widgetSelected(SelectionEvent e) {
-						java.net.URI shapeIconUri = null;
-						FileDialog fileChooser = new FileDialog(Display
-								.getCurrent().getActiveShell(), SWT.OPEN);
-						fileChooser.setText(AuthoringUIResources.DescriptionFormPage_IconFileChooserDialog_title); 
-						fileChooser.setFilterExtensions(imageTypes); 
-						fileChooser.setFilterNames(imageNames); 
-						String imageFile = null;
-						String filename = null;
-						while (true) {
-							imageFile = fileChooser.open();
-							filename = fileChooser.getFileName();
-							if (imageFile != null) {
-								if (new File(imageFile).exists()) {
-//									ImageData imageData = new ImageData(
-//											imageFile);
-//									if (imageData.width > SHAPEICON_WIDTH_MAX
-//											|| imageData.height > SHAPEICON_HEIGHT_MAX) {
-//										// msg user - image too big
-//										AuthoringUIPlugin
-//												.getDefault()
-//												.getMsgDialog()
-//												.displayError(
-//														AuthoringUIResources.forms_DescriptionFormPage_imageTooBigDialog_title, //$NON-NLS-1$ 
-//														MessageFormat
-//																.format(
-//																		AuthoringUIResources.forms_DescriptionFormPage_imageTooBigDialog_template, //$NON-NLS-1$
-//																		new Object[] {
-//																				imageFile,
-//																				new Integer(
-//																						SHAPEICON_WIDTH_MAX),
-//																				new Integer(
-//																						SHAPEICON_HEIGHT_MAX) }));
-//									} else {
-//										break;
-//									}
-									break;
-								} else {
-									// msg user - file doesn't exist
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayError(
-													AuthoringUIResources.forms_DescriptionFormPage_imageNotFoundDialog_title, 
-													MessageFormat
-															.format(
-																	AuthoringUIResources.forms_DescriptionFormPage_imageNotFoundDialog_template, 
-																	new Object[] { imageFile }));
-								}
-							} else {
-								return;
-							}
-						}
-						if (imageFile != null && imageFile.length() > 0) {
-							try {
-								String url = copyResourceToLib(ctrl_select_shapeIcon_button.getShell(), filename,
-										fileChooser.getFilterPath(),
-										contentElement);
-								if (url != null) {
-									File file = new File(url);
-									shapeIconUri = new URI(NetUtil
-											.encodeFileURL(FileUtil
-													.getRelativePath(file,
-															new File(getPluginPath(contentElement)))));
-									if (shapeIconUri != null) {
-										boolean status = actionMgr
-												.doAction(
-														IActionManager.SET,
-														contentElement,
-														UmaPackage.eINSTANCE
-																.getDescribableElement_Shapeicon(),
-														shapeIconUri, -1);
-										if (!status)
-											return;
-									}
-									shapeImage = new Image(
-											Display.getCurrent(), file
-													.getAbsolutePath());
-									shapeIconPath.setText(shapeIconUri.getPath());
-								}
-							} catch (Exception ex) {
-								shapeIconUri = null;
-								shapeImage = null;
-								AuthoringUIPlugin.getDefault().getLogger()
-										.logError(ex);
-								if (ex instanceof IOException) {
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayError(
-													AuthoringUIResources.err_copying_file_title, 
-													AuthoringUIResources.err_copying_file_error, 
-													AuthoringUIResources.err_copying_file_reason, 
-													ex.getMessage());
-								} else {
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayError(
-													AuthoringUIResources.err_processing_file_title, 
-													AuthoringUIResources.err_processing_file_description, ex); 
-								}
-							}
-						}
-						if (shapeImage != null) {
-							pane1.redraw();
-							ctrl_clear_shapeIcon_button.setEnabled(true);
-						} else {
-							ctrl_clear_shapeIcon_button.setEnabled(false);
-						}
-
-					}
-				});
-
-		ctrl_clear_shapeIcon_button
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						boolean status = actionMgr.doAction(IActionManager.SET,
-								contentElement, UmaPackage.eINSTANCE
-										.getDescribableElement_Shapeicon(),
-								null, -1);
-						if (!status)
-							return;
-						pane1.redraw();
-						ctrl_clear_shapeIcon_button.setEnabled(false);
-						shapeIconPath.setText(""); //$NON-NLS-1$
-					}
-				});
-
-		ctrl_select_nodeIcon_button
-				.addSelectionListener(new SelectionAdapter() {
-//					File libDirFile = new File(LibraryService.getInstance()
-//							.getCurrentMethodLibraryPath());
-
-					public void widgetSelected(SelectionEvent e) {
-						java.net.URI nodeIconUri = null;
-						FileDialog fileChooser = new FileDialog(Display
-								.getCurrent().getActiveShell(), SWT.OPEN);
-						fileChooser.setText(AuthoringUIResources.DescriptionFormPage_IconFileChooserDialog_title); 
-						fileChooser.setFilterExtensions(imageTypes); 
-						fileChooser.setFilterNames(imageNames); 
-						String imageFile = null;
-						String filename = null;
-						while (true) {
-							imageFile = fileChooser.open();
-							filename = fileChooser.getFileName();
-							if (imageFile != null) {
-								if (new File(imageFile).exists()) {
-									ImageData imageData = new ImageData(
-											imageFile);
-									if (imageData.width > NODEICON_WIDTH_MAX
-											|| imageData.height > NODEICON_HEIGHT_MAX) {
-										// msg user - image too big
-										AuthoringUIPlugin
-												.getDefault()
-												.getMsgDialog()
-												.displayError(
-														AuthoringUIResources.forms_DescriptionFormPage_imageTooBigDialog_title, 
-														MessageFormat
-																.format(
-																		AuthoringUIResources.forms_DescriptionFormPage_imageTooBigDialog_template, 
-																		new Object[] {
-																				imageFile,
-																				new Integer(
-																						NODEICON_WIDTH_MAX),
-																				new Integer(
-																						NODEICON_HEIGHT_MAX) }));
-									} else {
-										break;
-									}
-								} else {
-									// msg user - file doesn't exist
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayError(
-													AuthoringUIResources.forms_DescriptionFormPage_imageNotFoundDialog_title, 
-													MessageFormat
-															.format(
-																	AuthoringUIResources.forms_DescriptionFormPage_imageNotFoundDialog_template, 
-																	new Object[] { imageFile }));
-								}
-							} else {
-								return;
-							}
-						}
-						if (imageFile != null && imageFile.length() > 0) {
-							try {
-								String url = copyResourceToLib(ctrl_select_nodeIcon_button.getShell(), filename,
-										fileChooser.getFilterPath(),
-										contentElement);
-								if (url != null) {
-									File file = new File(url);
-									nodeIconUri = new URI(NetUtil
-											.encodeFileURL(FileUtil
-													.getRelativePath(file,
-															new File(getPluginPath(contentElement)))));
-									if (nodeIconUri != null) {
-										boolean status = actionMgr
-												.doAction(
-														IActionManager.SET,
-														contentElement,
-														UmaPackage.eINSTANCE
-																.getDescribableElement_Nodeicon(),
-														nodeIconUri, -1);
-										if (!status)
-											return;
-									}
-									nodeImage = new Image(Display.getCurrent(),
-											file.getAbsolutePath());
-									nodeIconPath.setText(nodeIconUri.getPath());
-								}
-							} catch (Exception ex) {
-								nodeIconUri = null;
-								nodeImage = null;
-								AuthoringUIPlugin.getDefault().getLogger()
-										.logError(ex);
-								if (ex instanceof IOException) {
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayError(
-													AuthoringUIResources.err_copying_file_title, 
-													AuthoringUIResources.err_copying_file_error, 
-													AuthoringUIResources.err_copying_file_reason, 
-													ex.getMessage());
-
-								} else {
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayError(
-													AuthoringUIResources.err_processing_file_title, 
-													AuthoringUIResources.err_processing_file_description, ex); 
-								}
-							}
-						}
-						if (nodeImage != null) {
-							pane3.redraw();
-							ctrl_clear_nodeIcon_button.setEnabled(true);
-						} else {
-							ctrl_clear_nodeIcon_button.setEnabled(false);
-						}
-					}
-				});
-
-		ctrl_clear_nodeIcon_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						contentElement, UmaPackage.eINSTANCE
-								.getDescribableElement_Nodeicon(), null, -1);
-				if (!status)
-					return;
-				pane3.redraw();
-				ctrl_clear_nodeIcon_button.setEnabled(false);
-				nodeIconPath.setText(""); //$NON-NLS-1$
-			}
-		});
-	}
-
-	/**
-	 * Copies the selected shapeNodeIcon and nodeIcon to resources folder of
-	 * content element. Prompts to overwrite if file already exists.
-	 * @param sFileName
-	 * @param sFilePath
-	 * @param methodElement
-	 * @return
-	 * @throws IOException
-	 */
-	protected String copyResourceToLib(Shell shell, String sFileName, String sFilePath,
-			MethodElement methodElement) throws IOException {
-		File newFile = LibraryUIUtil.copyResourceToLib(shell, new File(sFilePath, sFileName), methodElement);
-		if (newFile != null)
-			return newFile.getAbsolutePath();
-		else 
-			return null;
-	}
-
-	protected void loadIconSectionData() {
-		pane1.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				// paint the grey background
-				Rectangle clientRect = pane1.getClientArea();
-				e.gc.setClipping(clientRect);
-				e.gc.setBackground(Display.getCurrent().getSystemColor(15));
-				e.gc.fillRectangle(clientRect);
-
-				java.net.URI uri = contentElement.getShapeicon();
-				if (uri != null) {
-					String path = contentElement.getShapeicon().getPath();
-					if (path != null) {
-						try {
-							File file = new File(path);
-							if (file.exists()) {
-							} else {
-								if (!file.isAbsolute()) {
-									// Check for the uri contains the relative to library.
-									MethodPlugin plugin = UmaUtil.getMethodPlugin(contentElement);
-									if(path.indexOf(plugin.getName()) > -1){
-										path = LibraryService.getInstance()
-										.getCurrentMethodLibraryLocation()
-										+ File.separator + path;	
-									}else{
-										path = getPluginPath(contentElement)
-										+ File.separator + path;
-									}
-									
-								}
-								file = new File(path);
-							}
-							if (file.exists()) {
-								if (shapeImage == null) {
-									shapeImage = new Image(
-											Display.getCurrent(), path);
-								}
-								if(contentElement.getShapeicon() != null){
-									shapeIconPath.setText(contentElement.getShapeicon().getPath());
-								}
-								clientRect = pane1.getClientArea();
-								e.gc.setClipping(clientRect);
-								e.gc.setBackground(Display.getCurrent()
-										.getSystemColor(15));
-								e.gc.fillRectangle(clientRect);
-								e.gc.drawImage(shapeImage, shapeImage
-										.getBounds().x,
-										shapeImage.getBounds().y, shapeImage
-												.getBounds().width, shapeImage
-												.getBounds().height, pane1
-												.getClientArea().x, pane1
-												.getClientArea().y, pane1
-												.getClientArea().width, pane1
-												.getClientArea().height);
-							} else {
-								if (warningCount == 1) {
-									warningCount++;
-									String msg = AuthoringUIResources.bind(AuthoringUIResources.DescriptionFormPage_LoadShapeIconWarning, (new Object[] { contentElement.getName(), path })); 
-									MsgBox.showWarning(msg);
-								}
-
-							}
-						} catch (Exception ex) {
-							AuthoringUIPlugin
-									.getDefault()
-									.getLogger()
-									.logError(
-											AuthoringUIResources.bind(AuthoringUIResources.DescriptionFormPage_LoadShapeIconError, (new Object[] { ex.getMessage() }))); 
-						}
-					}
-				}
-			}
-
-		});
-		pane1.redraw();
-		if(contentElement.getShapeicon() != null){
-			shapeIconPath.setText(contentElement.getShapeicon().getPath());
-		}
-		
-		pane3.addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				// paint the grey background
-				Rectangle clientRect = pane3.getClientArea();
-				e.gc.setClipping(clientRect);
-				e.gc.setBackground(Display.getCurrent().getSystemColor(15));
-				e.gc.fillRectangle(clientRect);
-
-				java.net.URI uri = contentElement.getNodeicon();
-				if (uri != null) {
-					String path = contentElement.getNodeicon().getPath();
-					if (path != null) {
-						try {
-							File file = new File(path);
-							if (file.exists()) {
-							} else {
-								if (!file.isAbsolute()) {
-									MethodPlugin plugin = UmaUtil.getMethodPlugin(contentElement);
-									if(path.indexOf(plugin.getName()) > -1){
-										path = LibraryService.getInstance()
-										.getCurrentMethodLibraryLocation()
-										+ File.separator + path;	
-									}else{
-										path = getPluginPath(contentElement)
-										+ File.separator + path;
-									}
-								}
-								file = new File(path);
-							}
-							if (file.exists()) {
-								if (nodeImage == null) {
-									nodeImage = new Image(Display.getCurrent(),
-											path);
-								}
-								if(contentElement.getNodeicon() != null){
-									nodeIconPath.setText(contentElement.getNodeicon().getPath());
-								}
-								clientRect = pane3.getClientArea();
-								e.gc.setClipping(clientRect);
-								e.gc.setBackground(Display.getCurrent()
-										.getSystemColor(15));
-								e.gc.fillRectangle(clientRect);
-								e.gc.drawImage(nodeImage,
-										nodeImage.getBounds().x, nodeImage
-												.getBounds().y, nodeImage
-												.getBounds().width, nodeImage
-												.getBounds().height, pane3
-												.getClientArea().x, pane3
-												.getClientArea().y, pane3
-												.getClientArea().width, pane3
-												.getClientArea().height);
-							} else {
-								if (warningCount == 1) {
-									warningCount++;
-									String msg = AuthoringUIResources.bind(AuthoringUIResources.DescriptionFormPage_LoadNodeIconWarning, (new Object[] { contentElement.getName(), path })); 
-									MsgBox.showWarning(msg);
-								}
-
-							}
-						} catch (Exception ex) {
-							AuthoringUIPlugin
-									.getDefault()
-									.getLogger()
-									.logError(
-											AuthoringUIResources.bind(AuthoringUIResources.DescriptionFormPage_LoadNodeIconError, (new Object[] { ex.getMessage() }))); 
-						}
-					}
-				}
-			}
-
-		});
-		pane3.redraw();
-		if(contentElement.getNodeicon() != null){
-			nodeIconPath.setText(contentElement.getNodeicon().getPath());
-		}
-	}
-
-	
-	protected void enableSections(boolean enable) {
-		if (generalSectionOn) {
-			generalSection.setVisible(enable);
-			if (enable) {
-				generalSection.setExpanded(generalSectionExpandFlag);
-			} else {
-				generalSectionExpandFlag = generalSection.isExpanded();
-				generalSection.setExpanded(enable);
-			}
-		}
-
-		if (detailSectionOn) {
-			detailSection.setVisible(enable);
-			if (enable) {
-				detailSection.setExpanded(detailSectionExpandFlag);
-			} else {
-				detailSectionExpandFlag = detailSection.isExpanded();
-				detailSection.setExpanded(enable);
-			}
-		}
-		if (notationSectionOn) {
-			notationSection.setVisible(enable);
-			if (enable) {
-				notationSection.setExpanded(notationSectionExpandFlag);
-			} else {
-				notationSectionExpandFlag = notationSection.isExpanded();
-				notationSection.setExpanded(enable);
-			}
-		}
-		if (tailoringSectionOn) {
-			tailoringSection.setVisible(enable);
-			if (enable) {
-				tailoringSection.setExpanded(tailoringSectionExpandFlag);
-			} else {
-				tailoringSectionExpandFlag = tailoringSection.isExpanded();
-				tailoringSection.setExpanded(enable);
-			}
-		}
-		if (versionSectionOn) {
-			versionSection.setVisible(enable);
-			if (enable) {
-				versionSection.setExpanded(versionSectionExpandFlag);
-			} else {
-				versionSectionExpandFlag = versionSection.isExpanded();
-				versionSection.setExpanded(enable);
-			}
-		}
-		if (iconSectionOn) {
-			iconSection.setVisible(enable);
-			if (enable) {
-				iconSection.setExpanded(iconSectionExpandFlag);
-			} else {
-				iconSectionExpandFlag = iconSection.isExpanded();
-				iconSection.setExpanded(enable);
-			}
-		}
-		if (variabilitySectionOn) {
-			variabilitySection.setVisible(enable);
-			if (enable) {
-				variabilitySection.setExpanded(elementSectionExpandFlag);
-			} else {
-				elementSectionExpandFlag = variabilitySection.isExpanded();
-				variabilitySection.setExpanded(enable);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-		if (shapeImage != null) {
-			shapeImage.dispose();
-		}
-		if (nodeImage != null) {
-			nodeImage.dispose();
-		}
-		if (labelProviderVariability != null) {
-			labelProviderVariability.dispose();
-		}
-		if (contentProviderVariability != null) {
-			contentProviderVariability.dispose();
-		}
-		if (labelProviderBase != null) {
-			labelProviderBase.dispose();
-		}
-		if (copyrightLabelProviderBase != null) {
-			copyrightLabelProviderBase.dispose();
-		}
-		super.dispose();
-		
-		disposed = true;
-	}		
-
-	private void setCopyrightButtonDeselect() {
-		if (contentElement.getPresentation().getCopyrightStatement() != null) {
-			copyright_button_deselect
-					.setEnabled((contentElement.getPresentation()
-							.getCopyrightStatement().getName() == null) ? false
-							: true);
-		} else
-			copyright_button_deselect.setEnabled(false);
-		if (TngUtil.isLocked(contentElement))
-			copyright_button_deselect.setEnabled(false);
-	}
-
-	private void setContextHelp() {
-		if (sectionComposite != null) {
-			EditorsContextHelper.setHelp(sectionComposite.getParent(),
-					getContentElement());
-		}
-		if (expandedComposite != null) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(
-					expandedComposite,
-					AuthoringUIHelpContexts.RICH_TEXT_EDITOR_CONTEXT_ID);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.forms.IRefreshable#refreshName(java.lang.String)
-	 */
-	public void refreshName(String newName) {
-		if (newName != null) {
-			if ((ctrl_name != null) && !(ctrl_name.isDisposed())) {
-				ctrl_name.removeModifyListener(modelModifyListener);
-				ctrl_name.setText(newName);
-				ctrl_name.addModifyListener(modelModifyListener);
-				setFormTextWithVariableInfo();
-			}
-		}
-	}
-	
-	public void loadSectionDescription(){
-		
-	}
-	protected String getDetailSectionDescription(){
-		if(detailSectionDescription != null){
-			return detailSectionDescription;
-		}
-		return AuthoringUIText.DETAIL_SECTION_DESC;
-	}
-	protected String getGeneralSectionDescription(){
-		if(generalSectionDescription!= null){
-			return generalSectionDescription;
-		}
-		return AuthoringUIText.GENERAL_INFO_SECTION_DESC;
-	}
-	protected String getTailoringSectionDescription(){
-		if(tailoringSectionDescription != null){
-			return tailoringSectionDescription;
-		}
-		return AuthoringUIText.TAILORING_SECTION_DESC;
-	}
-	protected String getNotationSectionDescription(){
-		if(notationSectionDescription != null){
-			return notationSectionDescription;
-		}
-		return AuthoringUIText.NOTATION_SECTION_DESC;
-	}
-	protected String getVariabilitySectionDescription(){
-		if(variabilitySectionDescription != null){
-			return variabilitySectionDescription;
-		}
-		return AuthoringUIText.VARIABILITY_SECTION_DESC;
-	}
-	
-	private String getIconSectionDescription() {
-		// TODO Auto-generated method stubs
-		if(iconSectionDescription != null){
-			return iconSectionDescription;
-		}
-		return AuthoringUIText.ICON_SECTION_DESC;
-	}
-	private String getVersionSectionDescription() {
-		// TODO Auto-generated method stub
-		if(versionSectionDescription != null){
-			return versionSectionDescription;
-		}
-		return AuthoringUIText.VERSION_INFO_SECTION_DESC;
-	}
-
-	/** 
-	 * Following methods below exposed public in order to allow 
-	 * test automation to access the form objects through test objects
-	 * of any automation tools.
-	 */
-	
-	/**
-	 * Get brief description
-	 * @return Returns the ctrl_brief_desc.
-	 */
-	public Text getCtrl_brief_desc() {
-		return ctrl_brief_desc;
-	}
-
-	/**
-	 * Set brief description
-	 * @param ctrl_brief_desc The ctrl_brief_desc to set.
-	 */
-	public void setCtrl_brief_desc(Text ctrl_brief_desc) {
-		this.ctrl_brief_desc = ctrl_brief_desc;
-	}
-
-	/**
-	 * Get main description
-	 * @return Returns the ctrl_full_desc.
-	 */
-	public IMethodRichText getCtrl_full_desc() {
-		return ctrl_full_desc;
-	}
-
-	/**
-	 * Set main description
-	 * @param ctrl_full_desc The ctrl_full_desc to set.
-	 */
-	public void setCtrl_full_desc(IMethodRichText ctrl_full_desc) {
-		this.ctrl_full_desc = ctrl_full_desc;
-	}
-
-	/**
-	 * Get presentation name
-	 * @return Returns the ctrl_presentation_name.
-	 */
-	public Text getCtrl_presentation_name() {
-		return ctrl_presentation_name;
-	}
-
-	/**
-	 * Set presentation name
-	 * @param ctrl_presentation_name The ctrl_presentation_name to set.
-	 */
-	public void setCtrl_presentation_name(Text ctrl_presentation_name) {
-		this.ctrl_presentation_name = ctrl_presentation_name;
-	}
-
-	/**
-	 * Get expanded rich text control
-	 * @return Returns the ctrl_expanded.
-	 */
-	public IMethodRichTextEditor getCtrl_expanded() {
-		return ctrl_expanded;
-	}
-
-	/**
-	 * Set expanded rich text control
-	 * @param ctrl_expanded The ctrl_expanded to set.
-	 */
-	public void setCtrl_expanded(IMethodRichTextEditor ctrl_expanded) {
-		this.ctrl_expanded = ctrl_expanded;
-	}
-
-	/**
-	 * Get rich text control
-	 * @return Returns the ctrl_key.
-	 */
-	public IMethodRichText getCtrl_key() {
-		return ctrl_key;
-	}
-
-	/**
-	 * Set rich text control
-	 * @param ctrl_key The ctrl_key to set.
-	 */
-	public void setCtrl_key(IMethodRichText ctrl_key) {
-		this.ctrl_key = ctrl_key;
-	}
-	
-	public String getPluginPath(MethodElement e){
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		if (plugin != null) {
-			return ResourceHelper.getFolderAbsolutePath(plugin);
-		}
-
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineDescriptionPage.java
deleted file mode 100644
index c9c6cd2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineDescriptionPage.java
+++ /dev/null
@@ -1,91 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Domain editor.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @since 1.0
- */
-public class DisciplineDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "disciplineDescriptionPage"; //$NON-NLS-1$
-
-	private Discipline discipline;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		discipline = (Discipline) contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return discipline;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Discipline);
-			}
-		};
-
-		// set additional filter for variability base element checking
-		((CategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						discipline) });
-		return filter;
-	}
-
-	protected String getTabString() {
-		return FilterConstants.DISCIPLINES;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.discipline_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.discipline_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.discipline_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.discipline_versionInfoSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineGroupingDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineGroupingDescriptionPage.java
deleted file mode 100644
index c2500ec..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineGroupingDescriptionPage.java
+++ /dev/null
@@ -1,94 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Discipline Grouping editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class DisciplineGroupingDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "disciplineGroupingDescriptionPage"; //$NON-NLS-1$
-
-	private DisciplineGrouping disciplineGrouping;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineGroupingDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		disciplineGrouping = (DisciplineGrouping) contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return disciplineGrouping;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.DISCIPLINES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof DisciplineGrouping);
-			}
-		};
-
-		// Set additional filter for variability base element checking.
-		((CategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						disciplineGrouping) });
-		return filter;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.disciplinegrouping_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.disciplinegrouping_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.disciplinegrouping_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.disciplinegrouping_versionInfoSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineGroupingDisciplinesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineGroupingDisciplinesPage.java
deleted file mode 100644
index cefabfe..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineGroupingDisciplinesPage.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Disciplines page in the Discipline Grouping editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineGroupingDisciplinesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "disciplineGroupingDisciplinesPage"; //$NON-NLS-1$	
-
-	private DisciplineGrouping disciplineGrouping;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineGroupingDisciplinesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DISCIPLINES_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		disciplineGrouping = (DisciplineGrouping) contentElement;
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setAllowChange1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((DisciplineGrouping) object).getDisciplines().toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			editor.getActionManager().doAction(IActionManager.ADD_MANY,
-					disciplineGrouping,
-					UmaPackage.eINSTANCE.getDisciplineGrouping_Disciplines(),
-					addItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			editor.getActionManager().doAction(IActionManager.REMOVE_MANY,
-					disciplineGrouping,
-					UmaPackage.eINSTANCE.getDisciplineGrouping_Disciplines(),
-					rmItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return disciplineGrouping;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.DISCIPLINES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Discipline);
-			}
-		};
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.disciplineGroupingDisciplinesPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.disciplineGroupingDisciplinesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.disciplineGroupingDisciplinesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.disciplineGroupingDisciplinesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.disciplineGroupingDisciplinesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.disciplineGroupingDisciplinesPage_selectedLabel;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineReferenceWorkflowPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineReferenceWorkflowPage.java
deleted file mode 100644
index e5f3f50..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineReferenceWorkflowPage.java
+++ /dev/null
@@ -1,195 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.ReferenceWorkFlowFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Reference Workflow page in the Discipline editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineReferenceWorkflowPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "disciplineReferenceWorkflowPage"; //$NON-NLS-1$
-
-	private Discipline discipline;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineReferenceWorkflowPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID,
-				AuthoringUIText.REFERENCE_WORKFLOW_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		discipline = (Discipline) contentElement;
-		setAllowChange1(true);
-		setAllowChange2(true);
-		setUseCategory2(false);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return discipline.getReferenceWorkflows().toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		for (Iterator itor = addItems.iterator(); itor.hasNext();) {
-			// Object object = itor.next();
-			// if (object instanceof ProcessComponent) {
-			// Process process =
-			// (Process)((ProcessComponent)object).getProcess();
-			// if (process != null) {
-			// editor.getActionManager().doAction(IActionManager.ADD,
-			// discipline,
-			// UmaPackage.eINSTANCE.getDiscipline_ReferenceWorkflows(), process,
-			// -1);
-			// }
-			// }
-			// else {
-			// editor.getActionManager().doAction(IActionManager.ADD,
-			// discipline,
-			// UmaPackage.eINSTANCE.getDiscipline_ReferenceWorkflows(), object,
-			// -1);
-			// }
-			MethodElement object = (MethodElement) itor.next();
-			if (object instanceof ProcessComponent) {
-				object = ((ProcessComponent) object).getProcess();
-			}
-			if (object != null) {
-				EStructuralFeature feature = UmaPackage.eINSTANCE
-						.getDiscipline_ReferenceWorkflows();
-				if (UserInteractionHelper.checkModifyOpposite(discipline,
-						feature, object)) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							discipline, feature, object, -1);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			editor.getActionManager().doAction(IActionManager.REMOVE_MANY,
-					discipline,
-					UmaPackage.eINSTANCE.getDiscipline_ReferenceWorkflows(),
-					rmItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return discipline;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.PROCESSES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new ReferenceWorkFlowFilter();
-	}
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.disciplineReferenceWorkflowPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.disciplineReferenceWorkflowPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.disciplineReferenceWorkflowPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.disciplineReferenceWorkflowPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.disciplineReferenceWorkflowPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.disciplineReferenceWorkflowPage_selectedLabel;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineTasksPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineTasksPage.java
deleted file mode 100644
index 18ef89a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DisciplineTasksPage.java
+++ /dev/null
@@ -1,231 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.util.LibraryManager;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Tasks page in the Discipline editor.
- * 
- * @author Lokanath Jagga
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineTasksPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "disciplineTasksPage"; //$NON-NLS-1$	
-
-	private Discipline discipline;
-	
-	private ContentElementOrderList allSteps;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineTasksPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.TASKS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		discipline = (Discipline) contentElement;
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setAllowChange1(true);
-		setIsUpAndDownButtonsRequired1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-
-			public Object[] getElements(Object object) {
-				//return ((Discipline) object).getTasks().toArray();
-				if (allSteps == null) {
-					allSteps = new ContentElementOrderList(
-							contentElement,
-							ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_ONLY,
-							getContentCategoryOrderFeature());
-				}
-				List returnList = CategorySortHelper.sortCategoryElements(contentElement, 
-						allSteps.toArray());
-				return returnList.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				
-				//	check to maintain many-to-one rule for domain-workproduct
-//				List disciplines = AssociationHelper.getDisciplines(task);
-//				if (disciplines != null && disciplines.size() > 0)	{
-//					Object associatedDiscipline = disciplines.get(0);
-//					String msg = MessageFormat
-//					.format(
-//							LibraryEditResources.UserInteractionHelper_errRelationshipExists,
-//							new Object[] {
-//									task.getName(),
-//									TngUtil
-//											.getLabelWithPath(associatedDiscipline),
-//									discipline.getName() });
-//					Messenger.INSTANCE.showWarning(
-//							LibraryEditResources.errorDialog_title, msg);
-//					return;
-//				}
-				
-				LibraryManager.getInstance().addToDiscipline(
-						getActionManager(), discipline, task, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				LibraryManager.getInstance().removeFromDiscipline(
-						getActionManager(), discipline, task, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return discipline;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.TASKS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new ContentFilter() {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof ContentElement) {
-					if (getHelper().isContributor((ContentElement) obj))
-						return false;
-				}
-				return (obj instanceof Task);
-			}
-		};
-	}
-		
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.disciplineTasksPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.disciplineTasksPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.disciplineTasksPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.disciplineTasksPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.disciplineTasksPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.disciplineTasksPage_selectedLabel;
-	}
-
-	@Override
-	protected EStructuralFeature getContentCategoryOrderFeature() {
-		return UmaPackage.eINSTANCE.getDiscipline_Tasks();
-	}
-	
-	@Override
-	protected String[] getModelStructurePath() {
-		return ModelStructure.DEFAULT.disciplineDefinitionPath;
-	}
-	
-	@Override
-	protected ContentElementOrderList getContentElementOrderList() {
-		return allSteps;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DomainDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DomainDescriptionPage.java
deleted file mode 100644
index e58ff4d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DomainDescriptionPage.java
+++ /dev/null
@@ -1,91 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Domain editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class DomainDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "domainDescriptionPage"; //$NON-NLS-1$
-
-	private Domain domain;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DomainDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		domain = (Domain) contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return domain;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Domain);
-			}
-		};
-
-		// set additional filter for variability base element checking
-		((CategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						domain) });
-		return filter;
-	}
-
-	protected String getTabString() {
-		return FilterConstants.DOMAINS;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.domain_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.domain_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.domain_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.domain_versionInfoSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DomainWorkProductsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DomainWorkProductsPage.java
deleted file mode 100644
index cde18c5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DomainWorkProductsPage.java
+++ /dev/null
@@ -1,245 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.WorkProductFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Work Products page in the Domain editor.
- * 
- * @author Lokanath Jagga
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- * remove the to-one UI restriction on wp-domian (R395390) 2007-08-30
- */
-public class DomainWorkProductsPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "domainWorkProductsPage"; //$NON-NLS-1$
-
-	private Domain domain;
-
-	private IActionManager actionMgr;
-	
-	private ContentElementOrderList allSteps;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DomainWorkProductsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.WORK_PRODUCTS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		domain = (Domain) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setIsUpAndDownButtonsRequired1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				//return ((Domain) object).getWorkProducts().toArray();
-				if (allSteps == null) {
-					allSteps = new ContentElementOrderList(
-							contentElement,
-							ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_ONLY,
-							getContentCategoryOrderFeature());
-				}
-				List returnList = CategorySortHelper.sortCategoryElements(
-						contentElement, allSteps.toArray());
-				return returnList.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Uupdate the model.
-		if (!addItems.isEmpty()) {
-				// check to maintain many-to-one rule for domain-workproduct
-			for (Iterator iter = addItems.iterator(); iter.hasNext();) {
-				MethodElement element = (MethodElement) iter.next();
-				List domains = AssociationHelper.getDomains((WorkProduct) element);
-				if (domains != null && domains.size() > 0)	{
-					Object associatedDomain = domains.get(0);
-//					String msg = MessageFormat
-//					.format(
-//							LibraryEditResources.UserInteractionHelper_errRelationshipExists,
-//							new Object[] {
-//									element.getName(),
-//									TngUtil
-//											.getLabelWithPath(associatedDomain),
-//									domain.getName() });
-//					Messenger.INSTANCE.showWarning(
-//							LibraryEditResources.errorDialog_title, msg);
-//					return;
-				}
-				// check if this operation will modify the element in opposite
-				// feature value
-				//	
-//				if (!UserInteractionHelper.checkModifyOpposite(domain,
-//						UmaPackage.eINSTANCE.getDomain_WorkProducts(), element)) {
-//					return;
-//				}
-			}
-
-			actionMgr
-					.doAction(IActionManager.ADD_MANY, domain,
-							UmaPackage.eINSTANCE.getDomain_WorkProducts(),
-							addItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.REMOVE_MANY, domain,
-					UmaPackage.eINSTANCE.getDomain_WorkProducts(), rmItems, -1);
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return domain;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.WORKPRODUCTS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new WorkProductFilter() {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof ContentElement) {
-					if (getHelper().isContributor((ContentElement) obj))
-						return false;
-				}
-				return (obj instanceof WorkProduct);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.domainWorkProductsPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.domainWorkProductsPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.domainWorkProductsPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.domainWorkProductsPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.domainWorkProductsPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.domainWorkProductsPage_selectedLabel;
-	}
-	
-	@Override
-	protected EStructuralFeature getContentCategoryOrderFeature() {
-		return UmaPackage.eINSTANCE.getDomain_WorkProducts();
-	}
-	
-	@Override
-	protected String[] getModelStructurePath() {
-		return ModelStructure.DEFAULT.domainPath;
-	}
-	
-	@Override
-	protected ContentElementOrderList getContentElementOrderList() {
-		return allSteps;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/GuidanceDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/GuidanceDescriptionPage.java
deleted file mode 100644
index 31af4c5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/GuidanceDescriptionPage.java
+++ /dev/null
@@ -1,327 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-
-/**
- * The Description page in a Guidance editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class GuidanceDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "guidanceDescriptionPage"; //$NON-NLS-1$
-
-	protected Guidance guidance;
-
-	private String elementLabel;
-
-	private IMethodRichText ctrl_content;
-
-	private int contentFieldHeight = 400;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GuidanceDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		guidance = (Guidance) contentElement;
-		elementLabel = LibraryUIText.getUIText(guidance);
-		setElementTypeOn(true);
-		if (guidance instanceof TermDefinition)
-			setBriefDescOn(false);
-		setFullDescOn(false);
-		setKeyConsiderationOn(false);
-		setIconSectionOn(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFormPrefix()
-	 */
-	protected String getFormPrefix() {
-		return new StringBuffer(LibraryUIText.TEXT_GUIDANCE)
-				.append(" (").append(elementLabel).append("): ").toString(); //$NON-NLS-1$ //$NON-NLS-2$	
-	}
-
-	/**
-	 * Creates the editor tab content
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		super.createEditorContent(toolkit);
-		ctrl_content = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.MAIN_DESCRIPTION_TEXT,
-				contentFieldHeight, 400, DETAIL_SECTION_ID);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-		ctrl_content.setModalObject(contentElement.getPresentation());
-		ctrl_content.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getContentDescription_MainDescription());
-		ctrl_content.addModifyListener(contentModifyListener);
-		ctrl_content.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_content;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = guidance.getPresentation()
-						.getMainDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getContentDescription_MainDescription(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#refresh(boolean)
-	 */
-	protected void refresh(boolean editable) {
-		super.refresh(editable);
-		ctrl_content.setEditable(editable);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadData()
-	 */
-	protected void loadData() {
-		super.loadData();
-		if (guidance != null) {
-			String content = null;
-			if (guidance.getPresentation() != null) {
-				content = guidance.getPresentation().getMainDescription();
-			}
-			ctrl_content.setText(content == null ? "" : content); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return guidance;
-	}
-
-	/**
-	 * Returns the height of the Main Description text box.
-	 */
-	public int getContentFieldHeight() {
-		return contentFieldHeight;
-	}
-
-	/**
-	 * Sets the height of the Main Description text box.
-	 */
-	public void setContentFieldHeight(int contentFieldHeight) {
-		this.contentFieldHeight = contentFieldHeight;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.GUIDANCE;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new ContentFilter() {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof Guidance) {
-					return (((ContentElement) obj).getType()
-							.equals(((Guidance) contentElement).getType()));
-				}
-				return false;
-			}
-		};
-
-		// Set additional filter for variability base element checking.
-		((ContentFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						guidance) });
-		return filter;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		if(contentElement instanceof Whitepaper){
-			this.generalSectionDescription = AuthoringUIResources.whitepaper_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.whitepaper_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.whitepaper_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.whitepaper_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.whitepaper_iconSection_desc;
-		}
-		else if(contentElement instanceof Concept){
-			this.generalSectionDescription = AuthoringUIResources.concept_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.concept_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.concept_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.concept_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.concept_iconSection_desc;
-		}
-		else if(contentElement instanceof Checklist){
-			this.generalSectionDescription = AuthoringUIResources.checklist_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.checklist_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.checklist_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.checklist_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.checklist_iconSection_desc;
-		}
-		else if(contentElement instanceof Example){
-			this.generalSectionDescription = AuthoringUIResources.example_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.example_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.example_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.example_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.example_iconSection_desc;
-		}
-		else if(contentElement instanceof Guideline){
-			this.generalSectionDescription = AuthoringUIResources.guideline_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.guideline_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.guideline_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.guideline_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.guideline_iconSection_desc;
-		}
-		else if(contentElement instanceof EstimationConsiderations){
-			this.generalSectionDescription = AuthoringUIResources.estimationconsideration_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.estimationconsideration_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.estimationconsideration_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.estimationconsideration_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.estimationconsideration_iconSection_desc;
-		}
-		else if(contentElement instanceof Practice){
-			this.generalSectionDescription = AuthoringUIResources.practice_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.practice_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.practice_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.practice_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.practice_iconSection_desc;
-		}
-		else if(contentElement instanceof SupportingMaterial){
-			this.generalSectionDescription = AuthoringUIResources.supportingmaterial_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.supportingmaterial_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.supportingmaterial_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.supportingmaterial_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.supportingmaterial_iconSection_desc;
-		}
-		else if(contentElement instanceof Report){
-			this.generalSectionDescription = AuthoringUIResources.report_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.report_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.report_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.report_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.report_iconSection_desc;
-		}
-		else if(contentElement instanceof Roadmap){
-			this.generalSectionDescription = AuthoringUIResources.roadmap_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.roadmap_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.roadmap_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.roadmap_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.roadmap_iconSection_desc;
-		}
-		else if(contentElement instanceof Template){
-			this.generalSectionDescription = AuthoringUIResources.template_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.template_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.template_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.template_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.template_iconSection_desc;
-		}
-		else if(contentElement instanceof TermDefinition){
-			this.generalSectionDescription = AuthoringUIResources.termdefinition_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.termdefinition_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.termdefinition_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.termdefinition_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.termdefinition_iconSection_desc;
-		}
-		else if(contentElement instanceof ReusableAsset){
-			this.generalSectionDescription = AuthoringUIResources.resuableasset_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.resuableasset_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.resuableasset_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.resuableasset_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.reusableasset_iconSection_desc;
-		}
-		else if(contentElement instanceof ToolMentor){
-			this.generalSectionDescription = AuthoringUIResources.toolmentor_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.toolmentor_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.toolmentor_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.toolmentor_versionInfoSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.toolmentor_iconSection_desc;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/GuidanceWithAttachmentsDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/GuidanceWithAttachmentsDescriptionPage.java
deleted file mode 100644
index ae18cc3..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/GuidanceWithAttachmentsDescriptionPage.java
+++ /dev/null
@@ -1,342 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.richtext.dialogs.AddLinkDialog;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.window.Window;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-
-/**
- * The Description page in a Guidance (with attachments) editor.
- * 
- * @author Lokanath Jagga
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class GuidanceWithAttachmentsDescriptionPage extends GuidanceDescriptionPage {
-
-	private Button ctrl_attach, ctrl_detach, ctrl_attach_url ; //ctrl_remove ;
-
-	private List ctrl_attached_files;
-
-	private static final String GUIDANCE_ATTACHMENT_LAST_DIRECTORY_BROWSED_PREF = "guidance_attachment_last_dir_browsed"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GuidanceWithAttachmentsDescriptionPage(FormEditor editor) {
-		super(editor);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#createEditorContent(org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		super.createEditorContent(toolkit);
-
-		createLabel(toolkit, generalComposite,
-				AuthoringUIText.ATTACHED_FILE_TEXT, 2);
-		ctrl_attached_files = new List(generalComposite, SWT.SINGLE
-				| SWT.V_SCROLL | SWT.H_SCROLL);
-		GridData listGridData = new GridData(SWT.BEGINNING, SWT.BEGINNING,
-				true, true);
-		listGridData.heightHint = 30;
-		listGridData.widthHint = 300;
-		ctrl_attached_files.setLayoutData(listGridData);
-
-		ctrl_attached_files.setData(FormToolkit.KEY_DRAW_BORDER,
-				FormToolkit.TEXT_BORDER);
-
-		Composite buttonComposite = createComposite(toolkit, generalComposite,
-				1);
-		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		gridData.verticalSpan = 1;
-		gridData.horizontalSpan = 3;
-		buttonComposite.setLayoutData(gridData);
-		buttonComposite.setLayout(new GridLayout(3, false));
-
-		ctrl_attach = createButton(toolkit, buttonComposite, ATTACH_BUTTON);
-		ctrl_attach_url = createButton(toolkit, buttonComposite, ATTACH_URL_BUTTON);
-		ctrl_detach = createButton(toolkit, buttonComposite, DETACH_BUTTON);
-		
-		label_base.setText(AuthoringUIText.BASE_ELEMENT_TEXT);
-
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-
-		final IActionManager actionMgr = ((MethodElementEditor) getEditor())
-				.getActionManager();
-
-		ctrl_attach.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				FileDialog dialog = new FileDialog(PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow().getShell());
-				dialog
-						.setText(AuthoringUIResources.attachGuidanceFileDialog_title); 
-				String lastDir = AuthoringUIPlugin
-						.getDefault()
-						.getPreferenceStore()
-						.getString(
-								GUIDANCE_ATTACHMENT_LAST_DIRECTORY_BROWSED_PREF);
-				if (lastDir != null && lastDir.trim().length() > 0) {
-					dialog.setFilterPath(lastDir);
-				} else {
-					dialog.setFilterPath(ResourceHelper.getFolderAbsolutePath(guidance));
-				}
-				dialog.open();
-				if (dialog.getFileName() != null && dialog.getFileName() != "") { //$NON-NLS-1$
-					try {
-						File fileToAttach = new File(dialog.getFilterPath(),
-								dialog.getFileName());
-						String fileUrl = LibraryUIUtil.getURLForAttachment(ctrl_attach.getShell(),
-								fileToAttach, guidance, true);
-						if (fileUrl == null) {
-							// user hit cancel on RenameFileConflictDialog
-							return;
-						}
-						if (ctrl_attached_files.indexOf(fileUrl) != -1) {
-							// file is already an attachment
-							AuthoringUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayInfo(
-											AuthoringUIResources.AttachmentDialogattachFile_text, 
-											AuthoringUIResources.forms_GuidanceWithAttachmentsDescriptionPage_alreadyAttached_msg); 
-							return;
-						}
-						ctrl_attached_files.add(fileUrl);
-						boolean status = actionMgr.doAction(IActionManager.SET,
-								guidance.getPresentation(),
-								UmaPackage.eINSTANCE
-										.getGuidanceDescription_Attachments(),
-								getFilesFromListCtrl(), -1);
-						if (!status) {
-							return;
-						} else {
-							AuthoringUIPlugin
-									.getDefault()
-									.getPreferenceStore()
-									.setValue(
-											GUIDANCE_ATTACHMENT_LAST_DIRECTORY_BROWSED_PREF,
-											dialog.getFilterPath());
-						}
-					} catch (IOException ex) {
-						// TODO: Display an error dialog.
-						ex.printStackTrace();
-					}
-				}
-			}
-		});
-
-		ctrl_attach_url.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				AddLinkDialog dialog = new AddLinkDialog(PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow().getShell(), ""); //$NON-NLS-1$
-				dialog.open();
-				if (dialog.getReturnCode() == Window.OK) {
-					
-					if( dialog.getLink() != null) { 
-						
-						try {
-							String linkUrl = dialog.getLink().getURL();
-							String linkName = dialog.getLink().getName();
-							if (linkName == null || linkName.trim().length() == 0) {
-								linkName = FileUtil.getFileName(linkUrl);
-							}
-							
-							try {
-								URL url = new URL(linkUrl);
-							} catch (MalformedURLException mue) {
-								if (mue.getMessage().startsWith("no protocol")) { //$NON-NLS-1$
-									linkUrl = NetUtil.HTTP_URI_PREFIX + linkUrl;
-								}
-							}
-							
-							String urlString = "<a href=\""; //$NON-NLS-1$
-							if (Platform.getOS().equals(Platform.WS_WIN32)) {
-								urlString += NetUtil
-										.encodeFileURL(linkUrl);
-							} else {
-								urlString += NetUtil.encodeFileURL(linkUrl);
-							}
-							urlString += "\">" + linkName + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$
-							linkUrl = urlString;
-							//String linkDisplayName = dialog.getLink().getName();							
-							
-							if (linkUrl == null) {
-								// user hit cancel on AddLinkDialog
-								return;
-							}
-							if (ctrl_attached_files.indexOf(linkUrl) != -1) {
-								// If link already exists
-								AuthoringUIPlugin
-										.getDefault()
-										.getMsgDialog()
-										.displayInfo(
-												AuthoringUIResources.AttachmentDialogattachUrl_text, 
-												AuthoringUIResources.forms_GuidanceWithUrlAttachmentsDescriptionPage_alreadyAttached_msg); 
-								return;
-							}
-							ctrl_attached_files.add(linkUrl);
-							boolean status = actionMgr.doAction(IActionManager.SET,
-									guidance.getPresentation(),
-									UmaPackage.eINSTANCE
-											.getGuidanceDescription_Attachments(),
-									getFilesFromListCtrl(), -1);
-							if (!status) {
-								return;
-							}
-						} catch (Exception ex) {
-							// TODO: Display an error dialog.
-							ex.printStackTrace();
-						}
-					}
-				}
-			}
-		});
-		
-		ctrl_detach.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				ctrl_attached_files.remove(ctrl_attached_files
-						.getSelectionIndex());
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						guidance.getPresentation(), UmaPackage.eINSTANCE
-								.getGuidanceDescription_Attachments(),
-						getFilesFromListCtrl(), -1);
-
-				if (!status) {
-					// ctrl_attached_files.setText(oldContent);
-					return;
-				}
-			}
-		});
-
-		// ctrl_remove.addSelectionListener(new SelectionAdapter(){
-		// public void widgetSelected(SelectionEvent e) {
-		// //ctrl_attached_files.setText(""); //$NON-NLS-1$
-		// String oldContent =
-		// ((GuidanceDescription)guidance.getPresentation()).getAttachments();
-		// ctrl_attached_files.setText(""); //$NON-NLS-1$
-		// boolean status = actionMgr.doAction(IActionManager.SET,
-		// guidance.getPresentation(),
-		// UmaPackage.eINSTANCE.getGuidanceDescription_Attachments(),
-		// ctrl_attached_files.getText(), -1);
-		// if(!status){
-		// //ctrl_attached_files.setText(oldContent);
-		// return;
-		// }
-		// }
-		// });
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#refresh(boolean)
-	 */
-	protected void refresh(boolean editable) {
-		super.refresh(editable);
-		ctrl_attach.setEnabled(editable);
-		ctrl_attach_url.setEnabled(editable);
-		ctrl_detach.setEnabled(editable);
-		
-		// ctrl_remove.setEnabled(editable);
-	}
-
-	/**
-	 * Load initial data from model
-	 *
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#loadData()
-	 */
-	protected void loadData() {
-		super.loadData();
-		if (guidance != null) {
-			ContentDescription content = (ContentDescription) guidance
-					.getPresentation();
-			String thirdpartyformat = ((org.eclipse.epf.uma.GuidanceDescription) content)
-					.getAttachments();
-			setFilesToListCtrl(thirdpartyformat);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return contentElement;
-	}
-
-	/**
-	 * Given a string of files, add the files to the List control
-	 * 
-	 * @param files
-	 */
-	private void setFilesToListCtrl(String fileString) {
-		java.util.List attachmentList = TngUtil
-				.convertGuidanceAttachmentsToList(fileString);
-		ctrl_attached_files.removeAll();
-
-		for (Iterator iter = attachmentList.iterator(); iter.hasNext();) {
-			String attachment = (String) iter.next();
-			ctrl_attached_files.add(attachment);
-
-		}
-	}
-
-	/**
-	 * returns the list of files as a string
-	 * 
-	 * @return
-	 */
-	private String getFilesFromListCtrl() {
-		String files[] = ctrl_attached_files.getItems();
-		return TngUtil.convertGuidanceAttachmentsToString(Arrays.asList(files));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/IExtensionFormPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/IExtensionFormPage.java
deleted file mode 100644
index a19f535..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/IExtensionFormPage.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.IFormPage;
-
-/**
- * Interface to be used for all pages added through extension points
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public interface IExtensionFormPage   {
-
-	/**
-	 * Set editor for form page
-	 * @param editor
-	 */
-	public IFormPage setEditor(FormEditor editor) ;
-	
-	/**
-	 * Set input for form page
-	 * @param input
-	 */
-	public void setInput(Object input);
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/IRefreshable.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/IRefreshable.java
deleted file mode 100644
index 1aa6a46..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/IRefreshable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-/**
- * Interface used to refresh a form that implements this in case of model change outside of the form
- * 
- * @author Phong Nguyen Le 
- * @since  1.0
- */
-public interface IRefreshable {
-	
-	/**
-	 * Refresh name of the form
-	 * @param newName
-	 */
-	void refreshName(String newName);
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodFormToolkit.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodFormToolkit.java
deleted file mode 100644
index 56176c9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodFormToolkit.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.editors.MethodRichText;
-import org.eclipse.epf.authoring.ui.editors.MethodRichTextEditor;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-
-/**
- * A help class for creating UI widgets adapted adapted to work in Eclipse
- * forms.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodFormToolkit {
-
-	/**
-	 * Creates a Rich Text control and adapts it to be used in a form.
-	 * 
-	 * @param parent
-	 *            The parent control.
-	 * @param text
-	 *            The initial text for the viewer.
-	 * @param style
-	 *            The initial style for the viewer.
-	 * @param basePath
-	 *            The base path used for resolving hrefs.
-	 * @return A new <code>IMethodRichText</code> instance.
-	 */
-	public static IMethodRichText createRichText(FormToolkit toolkit,
-			Composite parent, String text, int style, String basePath,
-			MethodElement methodElement, Label label) {
-		IMethodRichText richText = new MethodRichText(parent, style, basePath);
-		richText.init(methodElement, label);
-		richText.getControl().setData(FormToolkit.KEY_DRAW_BORDER,
-				FormToolkit.TEXT_BORDER);
-		if (text != null) {
-			richText.setText(text);
-		}
-		return richText;
-	}
-
-	/**
-	 * Creates a Rich Text editor and adapts it to be used in a form.
-	 * 
-	 * @param parent
-	 *            The parent control.
-	 * @param text
-	 *            The initial text for the viewer.
-	 * @param style
-	 *            The initial style for the viewer.
-	 * @param basePath
-	 *            The base path used for resolving hrefs.
-	 * @return A new <code>IMethodRichTextEditor</code> instance.
-	 */
-	public static IMethodRichTextEditor createRichTextEditor(
-			FormToolkit toolkit, Composite parent, String text, int style,
-			String basePath, MethodElement methodElement, Label label, IEditorSite editorSite) {
-		IMethodRichTextEditor editor = new MethodRichTextEditor(parent, style,
-				basePath, methodElement, label, editorSite);
-		editor.getControl().setData(FormToolkit.KEY_DRAW_BORDER,
-				FormToolkit.TEXT_BORDER);
-		if (text != null) {
-			editor.setText(text);
-		}
-		return editor;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodLibraryDescriptionFormPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodLibraryDescriptionFormPage.java
deleted file mode 100644
index 52f7c36..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodLibraryDescriptionFormPage.java
+++ /dev/null
@@ -1,347 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * Description page for method library
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodLibraryDescriptionFormPage extends FormPage {
-	private static final int DEFAULT_VERTICAL_INDENT = 2;
-
-	private Text ctrl_name;
-
-	private Text ctrl_brief_desc;
-
-	private Section generalSection;
-
-	private Composite generalComposite;
-
-	private MethodLibrary library;
-
-	private Text textAuthors;
-
-	private Text ctrl_change_date;
-
-	private Text ctrl_change_desc;
-
-	private Text ctrl_version;
-
-	private Text ctrl_copyright;
-
-	/**
-	 * Creates an instance
-	 * @param editor
-	 */
-	public MethodLibraryDescriptionFormPage(FormEditor editor) {
-		super(
-				editor,
-				AuthoringUIResources.descriptionPage_title, AuthoringUIResources.descriptionPage_title); 
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-
-		// get MethodLibrary object from Editor input
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-
-		Object obj = methodElementInput.getMethodElement();
-		if (obj instanceof MethodLibrary) {
-			library = (MethodLibrary) obj;
-		}
-	}
-
-	/**
-	 * Creates the form content.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// create form toolkit
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		form.setText(getEditor().getPartName());
-
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-
-		// Create editor content
-		createEditorContent(toolkit, form.getBody());
-	}
-
-	/**
-	 * Create editor tab content
-	 * 
-	 * @param toolkit
-	 * @param editorComposite
-	 */
-	private void createEditorContent(FormToolkit toolkit,
-			Composite editorComposite) {
-		// Create General Information section
-		generalSection = toolkit.createSection(editorComposite,
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		generalSection.setLayoutData(td);
-		generalSection
-				.setText(AuthoringUIResources.MethodLibraryDescriptionFormPage_section_title); 
-		generalSection
-				.setDescription(AuthoringUIResources.MethodLibraryDescriptionFormPage_section_description); 
-		generalSection.setLayout(new GridLayout());
-
-		generalComposite = toolkit.createComposite(generalSection);
-		generalComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		generalComposite.setLayout(new GridLayout(2, false));
-		generalSection.setClient(generalComposite);
-
-		// name
-		Label l_name = toolkit.createLabel(generalComposite,
-				AuthoringUIResources.name_text); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			l_name.setLayoutData(gridData);
-		}
-
-		ctrl_name = toolkit.createText(generalComposite, "", SWT.SINGLE); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.widthHint = 400;
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			ctrl_name.setLayoutData(gridData);
-		}
-
-		// brief desc
-		Label l_brief_desc = toolkit.createLabel(generalComposite,
-				AuthoringUIResources.description_text); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			l_brief_desc.setLayoutData(gridData);
-		}
-
-		ctrl_brief_desc = toolkit.createText(generalComposite,
-				"", SWT.MULTI | SWT.WRAP); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.heightHint = 40;
-			gridData.widthHint = 400;
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			ctrl_brief_desc.setLayoutData(gridData);
-		}
-
-		// Authors
-		Label label = toolkit.createLabel(generalComposite,
-				AuthoringUIResources.authors_text); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			label.setLayoutData(gridData);
-		}
-
-		textAuthors = toolkit.createText(generalComposite,
-				"", SWT.MULTI | SWT.WRAP); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.heightHint = 40;
-			gridData.widthHint = 400;
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			textAuthors.setLayoutData(gridData);
-		}
-
-		// Change Date
-		Label l_changedate = toolkit.createLabel(generalComposite, ""); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			l_changedate.setLayoutData(gridData);
-		}
-
-		ctrl_change_date = toolkit.createText(generalComposite,
-				"", SWT.READ_ONLY); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			ctrl_change_date.setLayoutData(gridData);
-		}
-
-		// Authors
-		Label l_change_desc = toolkit.createLabel(generalComposite,
-				AuthoringUIText.CHANGE_DESCRIPTION_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			l_change_desc.setLayoutData(gridData);
-		}
-
-		ctrl_change_desc = toolkit.createText(generalComposite, "", SWT.MULTI); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.heightHint = 40;
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			ctrl_change_desc.setLayoutData(gridData);
-		}
-
-		// Version
-		Label l_version = toolkit.createLabel(generalComposite,
-				AuthoringUIText.VERSION_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			l_version.setLayoutData(gridData);
-		}
-
-		ctrl_version = toolkit.createText(generalComposite, "", SWT.MULTI); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			ctrl_version.setLayoutData(gridData);
-		}
-		Label l_copyright = toolkit.createLabel(generalComposite,
-				AuthoringUIResources.copyright_text); 
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			l_copyright.setLayoutData(gridData);
-		}
-		ctrl_copyright = toolkit.createText(generalComposite, ""); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.heightHint = 40;
-			gridData.widthHint = 400;
-			gridData.horizontalSpan = 1;
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			ctrl_copyright.setLayoutData(gridData);
-		}
-
-		toolkit.paintBordersFor(generalComposite);
-
-		addListeners();
-		loadData();
-
-		// Set focus on the name attribute
-		Display display = editorComposite.getDisplay();
-		if (!(display == null || display.isDisposed())) {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					ctrl_name.setFocus();
-				}
-			});
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-	/**
-	 * Loads initial data from model
-	 */
-	private void loadData() {
-		String name = library.getName();
-		String brief_desc = library.getBriefDescription();
-
-		ctrl_name.setText(TngUtil.checkNull(name));
-		ctrl_brief_desc.setText(TngUtil.checkNull(brief_desc));
-		textAuthors.setText(TngUtil.checkNull(library.getAuthors()));
-		if (library.getChangeDate() != null) {
-			ctrl_change_date.setText(TngUtil.checkNull(library.getChangeDate()
-					.toLocaleString()));
-		}
-		ctrl_change_desc.setText(TngUtil.checkNull(library
-				.getChangeDescription()));
-		ctrl_version.setText(TngUtil.checkNull(library.getVersion()));
-	}
-
-	/**
-	 * Add focus listeners
-	 * 
-	 */
-	private void addListeners() {
-		ctrl_name.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				library.setName(ctrl_name.getText());
-			}
-		});
-
-		ctrl_brief_desc.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				library.setBriefDescription(ctrl_brief_desc.getText());
-			}
-		});
-
-		textAuthors.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				library.setAuthors(textAuthors.getText());
-			}
-		});
-
-		ctrl_change_desc.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				library.setChangeDescription(ctrl_change_desc.getText());
-			}
-		});
-
-		ctrl_version.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				library.setVersion(ctrl_version.getText());
-			}
-		});
-
-		ctrl_copyright.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-			}
-		});
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodPluginDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodPluginDescriptionPage.java
deleted file mode 100644
index e01ae54..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodPluginDescriptionPage.java
+++ /dev/null
@@ -1,1213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.RemoveReferencesCommand;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.PluginReferenceChecker;
-import org.eclipse.epf.richtext.RichTextListener;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-
-import com.ibm.icu.text.DateFormat;
-
-/**
- * Description page for method plugin
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=176382
- */
-public class MethodPluginDescriptionPage extends BaseFormPage implements IRefreshable {
-
-	private static final String FORM_PREFIX = LibraryUIText.TEXT_METHOD_PLUGIN
-			+ ": "; //$NON-NLS-1$
-
-	private Text ctrl_name;
-
-	private Text ctrl_brief_desc, ctrl_r_brief_desc;
-
-	private CheckboxTableViewer ctrl_refModel;
-
-	private Section generalSection, refModelSection;
-
-	private Composite generalComposite, refModelComposite;
-
-	private boolean descExpandFlag = false;
-
-	private MethodPlugin plugin;
-
-	private IActionManager actionMgr;
-
-	protected Section versionSection;
-
-	protected Composite versionComposite;
-
-	private Text ctrl_authors;
-
-	private Text ctrl_change_date;
-
-	private Text ctrl_change_desc;
-
-	private Text ctrl_version;
-
-	protected boolean versionSectionOn = true;
-
-	protected boolean anyAttributeModified = false;
-
-	protected static final int VERSION_SECTION_ID = 3;
-
-	protected IMethodRichTextEditor ctrl_version_expanded;
-
-	protected ImageHyperlink expandVersionLink;
-
-	protected Label expandVersionLabel;
-
-	protected Composite expandedVersionComposite;
-
-	protected ModifyListener modelModifyListener;
-
-	protected ModifyListener contentModifyListener;
-
-	protected static final int GENERAL_SECTION_ID = 1;
-
-	private IMethodRichText activeControl;
-
-	protected Label label_copyright;
-
-	protected TableViewer copyright_viewer;
-
-	protected Table ctrl_copyright;
-
-	protected IStructuredContentProvider copyrightContentProvider;
-
-	private ILabelProvider labelProviderBase = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory());;
-
-	private Button copyright_button;
-
-	private Button copyright_button_deselect;
-
-	private Button ctrl_changeable;
-
-	public boolean notificationEnabled = true;
-
-	protected Adapter userChangeableAdapter;
-
-	private ModifyListener nameModifyListener;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodPluginDescriptionPage(FormEditor editor) {
-		super(editor, AuthoringUIText.DESCRIPTION_PAGE_TITLE,
-				AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-
-		actionMgr = ((MethodElementEditor) editor).getActionManager();
-		userChangeableAdapter = new UserChangeableAdapter();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.BaseFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-		Object obj = methodElementInput.getMethodElement();
-		plugin = (MethodPlugin) obj;
-		if (userChangeableAdapter != null) {
-			plugin.eAdapters().add(userChangeableAdapter);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-		createEditorContent(toolkit);
-		createReferenceContent(toolkit);
-		setContextHelp();
-		loadData();
-		addListeners();
-	}
-
-	private void setContextHelp() {
-		if (generalComposite != null) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							generalComposite.getParent().getParent(),
-							AuthoringUIHelpContexts.PLUGIN_EDITOR_DESCRIPTION_ALL_CONTEXT);
-		}
-	}
-
-	/**
-	 * Creates the editor page content.
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		form.setText(FORM_PREFIX + plugin.getName());
-
-		// Create the General section.
-		generalSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		generalSection.setLayoutData(td);
-		generalSection.setText(AuthoringUIText.GENERAL_INFO_SECTION_NAME);
-		generalSection.setDescription(MessageFormat.format(
-				AuthoringUIText.GENERAL_INFO_SECTION_DESC,
-				new String[] { LibraryUIText.getUITextLower(methodElement) }));
-		generalSection.setLayout(new GridLayout());
-
-		generalComposite = toolkit.createComposite(generalSection);
-		generalComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		generalComposite.setLayout(new GridLayout(3, false));
-		generalSection.setClient(generalComposite);
-
-		// name
-		ctrl_name = createTextEditWithLabel(toolkit, generalComposite,
-				AuthoringUIText.NAME_TEXT);
-
-		// brief desc
-		ctrl_brief_desc = createTextEditWithLabel2(toolkit, generalComposite,
-				AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-
-		if (versionSectionOn) {
-			createVersionSection(toolkit);
-			createVersionSectionContent();
-		}
-
-		toolkit.paintBordersFor(generalComposite);
-
-		// set focus on the name attribute
-		Display display = form.getBody().getDisplay();
-		if (!(display == null || display.isDisposed())) {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					ctrl_name.setFocus();
-				}
-			});
-		}
-	}
-
-	private void createReferenceContent(FormToolkit toolkit) {
-		// Ref Model Section
-		refModelSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td1 = new TableWrapData(TableWrapData.FILL_GRAB);
-		refModelSection.setLayoutData(td1);
-		refModelSection
-				.setText(AuthoringUIText.REFERENCED_PLUGINS_SECTION_NAME);
-		refModelSection
-				.setDescription(AuthoringUIText.REFERENCED_PLUGINS_SECTION_DESC);
-		refModelSection.setLayout(new GridLayout());
-
-		refModelComposite = toolkit.createComposite(refModelSection);
-		refModelComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		refModelComposite.setLayout(new GridLayout(2, false));
-		refModelSection.setClient(refModelComposite);
-
-		Table ctrl_table = toolkit.createTable(refModelComposite, SWT.CHECK);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING
-					| GridData.FILL_BOTH);
-			gridData.heightHint = 100;
-			ctrl_table.setLayoutData(gridData);
-		}
-
-		ctrl_refModel = new CheckboxTableViewer(ctrl_table);
-		ILabelProvider labelProvider = new LabelProvider() {
-			public String getText(Object element) {
-				MethodPlugin plugin = (MethodPlugin) element;
-				return plugin.getName();
-			}
-		};
-		ctrl_refModel.setLabelProvider(labelProvider);
-
-		Label l_r_brief_desc = toolkit.createLabel(refModelComposite,
-				AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 3;
-			l_r_brief_desc.setLayoutData(gridData);
-		}
-
-		ctrl_r_brief_desc = toolkit.createText(refModelComposite,
-				"", SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			gridData.heightHint = 80;
-			ctrl_r_brief_desc.setLayoutData(gridData);
-		}
-
-		toolkit.paintBordersFor(refModelComposite);
-	}
-
-	private void setCheckboxForCurrentBase(List currentBaseList) {
-		ctrl_refModel.setAllChecked(false);
-		for (int i = 0; i < currentBaseList.size(); i++) {
-			MethodPlugin model = (MethodPlugin) currentBaseList.get(i);
-			ctrl_refModel.setChecked(model, true);
-		}
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 */
-	private void addListeners() {
-		MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-		form.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event e) {
-				// Clear the old items and add the newly allowable items.
-				ctrl_refModel.getTable().clearAll();
-				ctrl_refModel.refresh();
-
-				List allowableList = PluginReferenceChecker
-						.getApplicableBasePlugins(plugin);
-				Collections.<Object>sort(allowableList, Comparators.PLUGINPACKAGE_COMPARATOR);
-				ctrl_refModel.add(allowableList.toArray());
-
-				List currentBaseList = plugin.getBases();
-				setCheckboxForCurrentBase(currentBaseList);
-
-				if (!plugin.getUserChangeable().booleanValue()) {
-					enableControls(false);
-				} else {
-					enableControls(true);
-				}
-				copyright_viewer.refresh();
-			}
-		});
-
-		final ModifyListener modifyListener = editor
-				.createModifyListener(plugin);
-
-		nameModifyListener = editor.createModifyListener(plugin, true);
-		ctrl_name.addModifyListener(nameModifyListener);
-		ctrl_name.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				String oldContent = plugin.getName();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				if (ctrl_name.getText().equals(plugin.getName())) {
-					return;
-				}
-
-				// Check invalid characters first.
-				
-				// 178462
-				String msg = null;
-				String name = ctrl_name.getText().trim();
-				if (name != null) {
-					if (oldContent.indexOf("&") < 0 && name.indexOf("&") > -1) { //$NON-NLS-1$ //$NON-NLS-2$
-						msg = NLS
-								.bind(
-										LibraryEditResources.invalidElementNameError4_msg,
-										name);
-					} else {
-						msg = LibraryUtil.checkPluginName(null, name);
-					}
-				}
-				
-				String validName = StrUtil.makeValidFileName(ctrl_name
-						.getText());
-				if (msg == null) {
-					// Check duplicate plug-in name.
-					msg = LibraryUtil.checkPluginName(plugin, validName);
-				}
-				if (msg == null) {
-					if (!validName.equals(plugin.getName())) {
-						Shell shell = getSite().getShell();
-						msg = AuthoringUIResources.bind(AuthoringUIResources.methodPluginDescriptionPage_confirmRename, (new Object[] { plugin.getName(), ctrl_name.getText() })); 
-						String title = AuthoringUIResources.methodPluginDescriptionPage_confirmRename_title; 
-						if (!MessageDialog.openConfirm(shell, title, msg)) {
-							ctrl_name.setText(plugin.getName());
-							return;
-						}
-
-						e.doit = true;
-						EditorChooser.getInstance().closeMethodEditorsForPluginElements(plugin);
-						ctrl_name.setText(validName);
-						boolean status = actionMgr.doAction(IActionManager.SET,
-								plugin, UmaPackage.eINSTANCE
-										.getNamedElement_Name(), validName, -1);
-
-						if (!status) {
-							return;
-						}
-						form.setText(FORM_PREFIX + plugin.getName());
-						updateChangeDate();
-
-						// adjust plugin location and save the editor
-						//
-						BusyIndicator.showWhile(getSite().getShell()
-								.getDisplay(), new Runnable() {
-							public void run() {
-								MethodElementEditor editor = (MethodElementEditor) getEditor();
-								editor.doSave(new NullProgressMonitor());
-								ILibraryPersister.FailSafeMethodLibraryPersister persister = editor
-										.getPersister();
-								try {
-									persister
-											.adjustLocation(plugin.eResource());
-									persister.commit();
-								} catch (RuntimeException e) {
-									AuthoringUIPlugin.getDefault().getLogger()
-											.logError(e);
-									try {
-										persister.rollback();
-									} catch (Exception ex) {
-										AuthoringUIPlugin.getDefault()
-												.getLogger().logError(ex);
-										ViewHelper
-												.reloadCurrentLibaryOnRollbackError(getSite()
-														.getShell());
-										return;
-									}
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayWarning(
-													getSite().getShell()
-															.getText(),
-													AuthoringUIResources.methodPluginDescriptionPage_cannotRenamePluginFolder
-													, e.getMessage(), e);
-								}
-							}
-						});
-					}
-				} else {
-					ctrl_name.setText(plugin.getName());
-					Shell shell = getSite().getShell();
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							shell.getText(), msg);
-					e.doit = false;
-					ctrl_name.getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							ctrl_name.setFocus();
-							ctrl_name.selectAll();
-						}
-					});
-				}
-			}
-		});
-		ctrl_name.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getNamedElement_Name());
-			}
-		});
-
-		ctrl_brief_desc.addModifyListener(modifyListener);
-		ctrl_brief_desc.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = plugin.getBriefDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = ctrl_brief_desc.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							plugin, UmaPackage.eINSTANCE
-									.getMethodElement_BriefDescription(),
-							newContent, -1);
-					if (status) {
-						ctrl_brief_desc.setText(newContent);
-					}
-				}
-			}
-		});
-
-		ctrl_refModel
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						StructuredSelection selectedList = (StructuredSelection) event
-								.getSelection();
-						MethodPlugin selectedObj = (MethodPlugin) selectedList
-								.getFirstElement();
-						if (selectedObj == null)
-							return;
-						ctrl_r_brief_desc.setText(selectedObj
-								.getBriefDescription());
-					}
-
-				});
-
-		ctrl_refModel.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				Object obj = event.getElement();
-
-				ctrl_r_brief_desc.setText(((MethodPlugin) obj)
-						.getBriefDescription());
-
-				if (TngUtil.isLocked(plugin)) {
-					ctrl_refModel.setChecked(obj, !event.getChecked());
-					return;
-				}
-
-				if (event.getChecked()) {
-					// TODO: Change this to be not un-doable due to the circular
-					// dependency check.
-					actionMgr.doAction(IActionManager.ADD, plugin,
-							UmaPackage.eINSTANCE.getMethodPlugin_Bases(),
-							(MethodPlugin) obj, -1);
-				} else {
-					final MethodPlugin base = (MethodPlugin) obj;
-					
-					if(removeAllReferences(base)){
-						ctrl_refModel.setChecked(base, false);
-					}else{
-						Display.getCurrent().asyncExec(new Runnable() {
-							public void run() {
-								ctrl_refModel.setChecked(base, true);
-							}
-						});
-						return;
-					}
-					// change this to be not un-doable due to the circular
-					// dependency check
-					// plugin.getBases().remove(obj);
-					actionMgr.doAction(IActionManager.REMOVE, plugin,
-							UmaPackage.eINSTANCE.getMethodPlugin_Bases(),
-							(MethodPlugin) obj, -1);
-				}
-
-				// double check circular dependency, not necessary here
-				PluginReferenceChecker.hasCircularConflictWithPlugin(plugin);
-
-				updateChangeDate();
-			}
-
-		});
-
-		if (versionSectionOn) {
-			addVersionSectionListeners();
-		}
-	}
-
-	protected void enableControls(boolean editable) {
-		ctrl_name.setEditable(editable);
-		ctrl_authors.setEditable(editable);
-		ctrl_brief_desc.setEditable(editable);
-		ctrl_version.setEditable(editable);
-		ctrl_change_desc.setEditable(editable);
-		copyright_button.setEnabled(editable);
-		copyright_button_deselect.setEnabled(editable);
-		ctrl_r_brief_desc.setEditable(false);
-	}
-
-	/**
-	 * Loads initial data from model
-	 */
-	private void loadData() {
-		String name = plugin.getName();
-		String desc = plugin.getBriefDescription();
-		ctrl_name.setText(name == null ? "" : name); //$NON-NLS-1$
-		ctrl_brief_desc.setText(desc == null ? "" : desc); //$NON-NLS-1$
-
-		if (versionSectionOn) {
-			loadVersionSectionData();
-		}
-	}
-
-	/**
-	 * Check to see whether version section is visible or not
-	 * @return Returns the versionSectionOn.
-	 */
-	public boolean isVersionSectionOn() {
-		return versionSectionOn;
-	}
-
-	/**
-	 * Set version section to be visible or not
-	 * @param versionSectionOn
-	 *            The versionSectionOn to set.
-	 */
-	public void setVersionSectionOn(boolean versionSectionOn) {
-		this.versionSectionOn = versionSectionOn;
-	}
-
-	private void createVersionSection(FormToolkit toolkit) {
-		versionSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		versionSection.setLayoutData(td);
-		versionSection.setText(AuthoringUIText.VERSION_INFO_SECTION_NAME);
-		versionSection.setDescription(MessageFormat.format(
-				AuthoringUIText.VERSION_INFO_SECTION_DESC,
-				new String[] { LibraryUIText.getUITextLower(methodElement) }));
-		versionSection.setLayout(new GridLayout());
-
-		versionComposite = toolkit.createComposite(versionSection);
-		versionComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		versionComposite.setLayout(new GridLayout(5, false));
-		versionSection.setClient(versionComposite);
-	}
-
-	/**
-	 * Create the Version section content.
-	 */
-	private void createVersionSectionContent() {
-		String fillText = (plugin.getVersion() == null ? "" : plugin.getVersion()); //$NON-NLS-1$
-		ctrl_version = createTextEditWithLabel4(toolkit, versionComposite,
-				AuthoringUIText.VERSION_TEXT, SWT.DEFAULT, SWT.SINGLE, fillText);
-		
-		fillText = plugin.getChangeDate() == null ? "" : //$NON-NLS-1$
-			DateFormat.getDateInstance(DateFormat.FULL).format(
-					plugin.getChangeDate());
-
-		ctrl_change_date = createTextEditWithLabel4(toolkit, versionComposite,
-				AuthoringUIText.CHANGE_DATE_TEXT, SWT.DEFAULT, SWT.SINGLE, fillText);
-		ctrl_change_date.setEditable(false);
-		
-		ctrl_change_desc = createTextEditWithLabel5(toolkit, versionComposite,
-				AuthoringUIText.CHANGE_DESCRIPTION_TEXT, 40, SWT.MULTI);
-	
-		ctrl_authors = createTextEditWithLabel5(toolkit, versionComposite,
-				AuthoringUIText.AUTHORS_TEXT, 40, SWT.MULTI);
-		
-		label_copyright = createLabel(toolkit, versionComposite,
-				AuthoringUIText.COPYRIGHT_TEXT, 2);
-		ctrl_copyright = createTable(toolkit, versionComposite, SWT.SINGLE
-				| SWT.READ_ONLY, GridData.FILL_HORIZONTAL | GridData.BEGINNING | GridData.FILL_VERTICAL,
-				5, 400, 1, 2);
-		copyright_viewer = new TableViewer(ctrl_copyright);
-		initContentProviderCopyright();
-		copyright_viewer.setLabelProvider(labelProviderBase);
-		copyright_viewer.setInput(plugin);
-		
-		
-		Composite buttonpane = createComposite(toolkit, versionComposite,
-				GridData.HORIZONTAL_ALIGN_END, 1, 1, 1);
-		{
-			GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-			buttonpane.setLayoutData(gridData);
-		}
-		copyright_button = toolkit.createButton(buttonpane,
-				AuthoringUIText.SELECT_BUTTON_TEXT, SWT.SIMPLE);
-		{
-			GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-			gridData.widthHint = DescriptionFormPage.BUTTON_WIDTH;
-			copyright_button.setLayoutData(gridData);
-		}
-		copyright_button_deselect = toolkit.createButton(buttonpane,
-				AuthoringUIText.DESELECT_BUTTON_TEXT, SWT.SIMPLE);
-		{
-			GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-			gridData.widthHint = DescriptionFormPage.BUTTON_WIDTH;
-			copyright_button_deselect.setLayoutData(gridData);
-		}		
-
-		ctrl_changeable = toolkit
-				.createButton(
-						versionComposite,
-						AuthoringUIResources.methodPluginDescriptionPage_lockPluginLabel, SWT.CHECK); 
-
-		// Create the expanded composite.
-		expandedVersionComposite = toolkit.createComposite(versionSection,
-				SWT.NONE);
-		expandedVersionComposite.setLayoutData(new GridData(
-				GridData.FILL_HORIZONTAL));
-		expandedVersionComposite.setLayout(new GridLayout(2, false));
-		expandedVersionComposite.setVisible(false);
-
-		// Add the expand/collapse hyperlink image.
-		expandVersionLink = toolkit.createImageHyperlink(
-				expandedVersionComposite, SWT.NONE);
-		expandVersionLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		expandVersionLink.setUnderlined(false);
-		expandVersionLink.setToolTipText(AuthoringUIResources.closeRTE); 
-		expandVersionLink.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e, VERSION_SECTION_ID);
-			}
-		});
-
-		// Add the expand/collapse hyperlink text.
-		expandVersionLabel = createDecoratedLabel(toolkit, expandedVersionComposite, ""); //$NON-NLS-1$
-		toolkit.paintBordersFor(expandedVersionComposite);
-		toolkit.paintBordersFor(versionComposite);
-	}
-
-	private void initContentProviderCopyright() {
-		copyrightContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List list = new ArrayList();
-				if (plugin.getCopyrightStatement() != null) {
-					list.add(plugin.getCopyrightStatement());
-				}
-				return list.toArray();
-			}
-		};
-		copyright_viewer.setContentProvider(copyrightContentProvider);
-	}
-
-	protected void addVersionSectionListeners() {
-
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-		modelModifyListener = editor.createModifyListener(plugin);
-		contentModifyListener = editor.createModifyListener(plugin);
-
-		ctrl_version.addModifyListener(contentModifyListener);
-		ctrl_version.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodUnit_Version());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = plugin.getVersion();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil
-						.getPlainText(ctrl_version.getText());
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, plugin,
-							UmaPackage.eINSTANCE.getMethodUnit_Version(),
-							newContent, -1);
-					updateChangeDate();
-				}
-			}
-		});
-
-		ctrl_authors.addModifyListener(contentModifyListener);
-		ctrl_authors.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodUnit_Authors());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = plugin.getAuthors();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil
-						.getPlainText(ctrl_authors.getText());
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, plugin,
-							UmaPackage.eINSTANCE.getMethodUnit_Authors(),
-							newContent, -1);
-					updateChangeDate();
-				}
-			}
-		});
-
-		copyright_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IFilter filter = new ContentFilter() {
-					protected boolean childAccept(Object obj) {
-						if (obj instanceof Guidance) {
-							return (obj instanceof SupportingMaterial);
-						}
-						return false;
-					}
-				};
-				List alreadyExsting = new ArrayList();
-				if (ctrl_copyright.getItemCount() > 0) {
-					TableItem item = ctrl_copyright.getItems()[0];
-					if (item.getData() != null)
-						alreadyExsting.add(item.getData());
-				}
-				ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						filter, plugin, FilterConstants.SUPPORTING_MATERIALS,
-						alreadyExsting);
-				fd.setViewerSelectionSingle(true);
-				fd.setBlockOnOpen(true);
-				fd.setTitle(FilterConstants.SUPPORTING_MATERIALS);
-				fd.open();
-				fd.getSelectedItems();
-				if (fd.getSelectedItems().size() > 0) {
-					editor.getActionManager().doAction(
-							IActionManager.SET,
-							plugin,
-							UmaPackage.eINSTANCE
-									.getMethodUnit_CopyrightStatement(),
-							(SupportingMaterial) fd.getSelectedItems().get(0),
-							-1);
-				}
-				copyright_viewer.refresh();
-
-			}
-		});
-
-		ctrl_change_desc.addModifyListener(contentModifyListener);
-		ctrl_change_desc.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodUnit_ChangeDescription());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = plugin.getChangeDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = ctrl_change_desc.getText();
-
-				newContent = newContent.replace(StrUtil.LINE_FEED, AuthoringUIResources.ChangeHistoryDialog_delimiter);
-
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr.doAction(
-							IActionManager.SET, plugin,
-							UmaPackage.eINSTANCE
-									.getMethodUnit_ChangeDescription(),
-							newContent, -1);
-					if (success) {
-						updateChangeDate();
-					}
-				}
-			}
-
-		});
-
-		copyright_button_deselect.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				actionMgr
-						.doAction(IActionManager.SET, plugin,
-								UmaPackage.eINSTANCE
-										.getMethodUnit_CopyrightStatement(),
-								null, -1);
-				copyright_viewer.refresh();
-			}
-		});
-
-		ctrl_changeable.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				notificationEnabled = true;
-
-				
-				IStatus status = TngUtil.checkEdit(plugin, getSite().getShell());
-				if (status.isOK()) {
-					
-					String message = AuthoringUIResources
-							.bind(
-									AuthoringUIResources.methodPluginDescriptionPage_lockPlugin_message,
-									plugin.getName());
-					Shell shell = getSite().getShell();
-					if (AuthoringUIPlugin.getDefault().getMsgDialog()
-							.displayConfirmation(shell.getText(), message)) {
-						// close editors on any change in ctrl_changeable
-						// if (ctrl_changeable.getSelection()) {
-						EditorChooser.getInstance().closeMethodEditorsForPluginElements(plugin);
-						boolean ret = actionMgr.doAction(IActionManager.SET,
-								plugin, UmaPackage.eINSTANCE
-										.getMethodPlugin_UserChangeable(),
-								new Boolean(!ctrl_changeable.getSelection()),
-								-1);
-						// in case of readonly file, roll back changes.
-						if (!ret) {
-							ctrl_changeable.setSelection(!ctrl_changeable
-									.getSelection());
-							return;
-						}
-
-						// }
-						enableControls(!ctrl_changeable.getSelection());
-					} else {
-						// actionMgr.undo();
-						ctrl_changeable.setSelection(!ctrl_changeable
-								.getSelection());
-						enableControls(!ctrl_changeable.getSelection());
-						// return;
-					}
-				} else {
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							AuthoringUIResources.editDialog_title,
-							AuthoringUIResources.editDialog_msgCannotEdit,
-							status);
-					return;
-				}
-				copyright_viewer.refresh();
-				
-				// refresh editor title image. 
-				((MethodElementEditor)getEditor()).refreshTitleImage();
-			}
-
-			
-		});
-	}
-
-	/*
-	 * update the change date if any attribute is modified.
-	 */
-	protected void updateChangeDate() {
-
-		Date changeDate = plugin.getChangeDate();
-		DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
-
-		String oldContent = ""; //$NON-NLS-1$
-		if (changeDate != null) {
-			oldContent = df.format(changeDate);
-		}
-
-		Date currentDate = new Date();
-		String newContent = df.format(currentDate);
-		if (!newContent.equals(oldContent)) {
-			actionMgr.doAction(IActionManager.SET, plugin, UmaPackage.eINSTANCE
-					.getMethodUnit_ChangeDate(), currentDate, -1);
-			ctrl_change_date.setText(newContent);
-		}
-	}
-
-	protected void loadVersionSectionData() {
-		ctrl_version
-				.setText(plugin.getVersion() == null ? "" : plugin.getVersion()); //$NON-NLS-1$
-		ctrl_authors
-				.setText(plugin.getAuthors() == null ? "" : plugin.getAuthors()); //$NON-NLS-1$
-		String changeDesc = plugin.getChangeDescription() == null ? "" : plugin.getChangeDescription(); //$NON-NLS-1$
-		changeDesc = changeDesc.replace(AuthoringUIResources.ChangeHistoryDialog_delimiter, StrUtil.LINE_FEED);
-		ctrl_change_desc.setText(changeDesc);
-		ctrl_change_date.setText(plugin.getChangeDate() == null ? "" : //$NON-NLS-1$
-				DateFormat.getDateInstance(DateFormat.FULL).format(
-						plugin.getChangeDate())); 
-		ctrl_changeable
-				.setSelection(!plugin.getUserChangeable().booleanValue());
-	}
-
-	/**
-	 * Toggle Description control to expand and control state
-	 * 
-	 */
-	protected void toggle(HyperlinkEvent e, int id) {
-		// TODO: We should combine these methods into one. One way to do it,
-		// dispoing
-		// ctrl_expanded every time it collapses and creating it when we expand.
-		// At present, there is no method to dispose
-		if (id == GENERAL_SECTION_ID) {
-			toggle(e);
-		}
-		if (id == VERSION_SECTION_ID) {
-			toggleVersionSection(e);
-		}
-	}
-
-	private void toggleVersionSection(HyperlinkEvent e) {
-		if (ctrl_version_expanded == null) {
-			ctrl_version_expanded = createRichTextEditor(toolkit,
-					expandedVersionComposite, SWT.MULTI | SWT.WRAP
-							| SWT.V_SCROLL, GridData.FILL_BOTH, getRichTextEditorHeight(), getRichTextEditorWidth(), 2,
-							expandVersionLabel); 
-			ctrl_version_expanded.addModifyListener(contentModifyListener);
-		}
-
-		if (descExpandFlag) {
-			versionComposite.setVisible(true);
-			expandedVersionComposite.setVisible(false);
-			versionSection.setClient(versionComposite);
-			refModelSection.setExpanded(true);
-			generalSection.setExpanded(true);
-			IMethodRichText richText = getActiveRichTextControl();
-			richText.setText(ctrl_version_expanded.getText());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_version_expanded.removeListener(listener.getEventType(),
-						listener.getListener());
-			}
-			if (ctrl_version_expanded.getModified()) {
-				((MethodElementEditor) getEditor())
-						.saveModifiedRichText(ctrl_version_expanded);
-			}
-			richText.setFocus();
-		} else {
-			versionComposite.setVisible(false);
-			expandedVersionComposite.setVisible(true);
-			versionSection.setClient(expandedVersionComposite);
-			refModelSection.setExpanded(false);
-			generalSection.setExpanded(false);
-			expandVersionLabel.setText((String) ((ImageHyperlink) e.getSource())
-							.getData("Title")); //$NON-NLS-1$    		
-			IMethodRichText richText = (IMethodRichText) e.getHref();
-			ctrl_version_expanded.setText(richText.getText());
-			ctrl_version_expanded.setModalObject(richText.getModalObject());
-			ctrl_version_expanded.setModalObjectFeature(richText
-					.getModalObjectFeature());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_version_expanded.addListener(listener.getEventType(),
-						listener.getListener());
-			}
-			ctrl_version_expanded.setFocus();
-			setActiveRichTextControl(richText);
-		}
-
-		versionSection.layout(true);
-		descExpandFlag = !descExpandFlag;
-	}
-
-	/**
-	 * Set active rich text control
-	 */
-	private void setActiveRichTextControl(IMethodRichText ctrl) {
-		activeControl = ctrl;
-	}
-
-	/**
-	 * Get Active Rich text control.
-	 */
-	private IMethodRichText getActiveRichTextControl() {
-		return activeControl;
-	}
-
-	protected class UserChangeableAdapter extends AdapterImpl {
-		public void notifyChanged(Notification msg) {
-			switch (msg.getFeatureID(MethodPlugin.class)) {
-			case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-				Boolean b = (Boolean) msg.getNewValue();
-				setUserChangeable(b.booleanValue());
-				return;
-			}
-		}
-	}
-
-	public void setUserChangeable(boolean userChangeable) {
-		if (!notificationEnabled)
-			return;
-		notificationEnabled = false;
-		plugin.setUserChangeable(Boolean.valueOf(userChangeable));
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-		plugin.eAdapters().remove(userChangeableAdapter);
-		super.dispose();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.IRefreshable#refreshName(java.lang.String)
-	 */
-	public void refreshName(String newName) {
-		if (newName != null) {
-			if ((ctrl_name != null) && !(ctrl_name.isDisposed())) {
-				ctrl_name.removeModifyListener(nameModifyListener);
-				ctrl_name.setText(newName);
-				ctrl_name.addModifyListener(nameModifyListener);
-				form.setText(FORM_PREFIX + plugin.getName());
-			}
-		}
-	}
-	
-	/**
-	 * Checks if the given MethodPlugin <code>base</code> is one in the given
-	 * plugins collection or base of any plugin in the collection.
-	 * 
-	 * @param base
-	 * @param plugins
-	 * @return
-	 */
-	private static boolean isOneOrBaseOf(MethodPlugin base, Collection<MethodPlugin> plugins) {
-		for (MethodPlugin plugin : plugins) {
-			if(base == plugin || Misc.isBaseOf(base, plugin)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean removeAllReferences(MethodPlugin unCheckedPlugin) {
-		ArrayList<MethodPlugin> removedBases = new ArrayList<MethodPlugin>();
-		removedBases.add(unCheckedPlugin);
-		for (Iterator<MethodPlugin> iter = new AbstractTreeIterator<MethodPlugin>(unCheckedPlugin, false) {
-		
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected Iterator<? extends MethodPlugin> getChildren(Object object) {
-				if(object instanceof MethodPlugin) {
-					return ((MethodPlugin)object).getBases().iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-		
-		}; iter.hasNext();) {
-			MethodPlugin base = iter.next();
-			ArrayList<MethodPlugin> plugins = new ArrayList<MethodPlugin>(plugin.getBases());
-			plugins.remove(unCheckedPlugin);
-			if(!isOneOrBaseOf(base, plugins)) {
-				removedBases.add(base);
-			}
-		}
-		
-		ArrayList<MethodPlugin> affectedPlugins = new ArrayList<MethodPlugin>();
-		
-		// get all plug-ins in library that extend this plug-in
-		//
-		List<?> plugins = LibraryService.getInstance().getCurrentMethodLibrary()
-				.getMethodPlugins();
-		for (Iterator<?> iterator = plugins.iterator(); iterator.hasNext();) {
-			MethodPlugin mp = (MethodPlugin) iterator.next();
-			if(mp != plugin && Misc.isBaseOf(plugin, mp)) {				
-				affectedPlugins.add(mp);
-			}
-		}
-		
-		ArrayList<RemoveReferencesCommand> commands = new ArrayList<RemoveReferencesCommand>();
-		for (MethodPlugin base : removedBases) {			
-			if(UmaUtil.hasReference(plugin, base)) {
-				commands.add(new RemoveReferencesCommand(plugin, base));
-			}
-			for (MethodPlugin mp : affectedPlugins) {
-				ArrayList<MethodPlugin> bases = new ArrayList<MethodPlugin>(mp.getBases());
-				bases.remove(base);
-				if(!isOneOrBaseOf(base, bases) && UmaUtil.hasReference(mp, base)) {
-					commands.add(new RemoveReferencesCommand(mp, base));
-				}
-			}
-		}
-
-		if (!commands.isEmpty()) {
-			String message = AuthoringUIResources
-					.bind(AuthoringUIResources.methodPluginDescriptionRemoveRefConfirm_message,
-							plugin.getName());
-			Shell shell = getSite().getShell();
-			if (AuthoringUIPlugin.getDefault().getMsgDialog()
-					.displayConfirmation(shell.getText(), message)) {
-				int i = 0;
-				try {
-					for (RemoveReferencesCommand cmd : commands) {
-						actionMgr.execute(cmd);
-						i++;
-					}
-					return true;
-				}
-				catch(Exception e) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					// undo the executed commands
-					for (; i > 0; i--) {
-						actionMgr.undo();
-					}
-					return false;
-				}
-			} else {
-				return false;
-			}
-		}
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/PracticeDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/PracticeDescriptionPage.java
deleted file mode 100644
index 67eb05e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/PracticeDescriptionPage.java
+++ /dev/null
@@ -1,348 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-
-/**
- * The Description page in a Practice editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class PracticeDescriptionPage extends GuidanceDescriptionPage {
-
-	private IMethodRichText ctrl_additional_info, ctrl_problem,
-			ctrl_background;
-
-	private IMethodRichText ctrl_goals, ctrl_application, ctrl_levels_adoption;
-
-	private Practice guidance;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PracticeDescriptionPage(FormEditor editor) {
-		super(editor);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		guidance = (Practice) contentElement;
-		setContentFieldHeight(200);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#createEditorContent(org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		super.createEditorContent(toolkit);
-
-		ctrl_additional_info = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.ADDITIONAL_INFO_TEXT, 40, 400,
-				DETAIL_SECTION_ID);
-		ctrl_goals = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.GOALS_TEXT, 40, 400,
-				DETAIL_SECTION_ID);
-		ctrl_application = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.APPLICATION_TEXT, 40, 400,
-				DETAIL_SECTION_ID);
-		ctrl_problem = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.PROBLEM_TEXT, 40, 400,
-				DETAIL_SECTION_ID);
-		ctrl_background = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.BACKGROUND_TEXT, 40, 400,
-				DETAIL_SECTION_ID);
-		ctrl_levels_adoption = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.LEVEL_OF_ADOPTION_TEXT, 40,
-				400, DETAIL_SECTION_ID);
-
-		label_base.setText(AuthoringUIText.BASE_ELEMENT_TEXT);
-	}
-
-	/**
-	 * Add listeners
-	 *
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-		final ModifyListener contentModifyListener = editor
-				.createModifyListener(guidance.getPresentation());
-
-		ctrl_additional_info
-				.setModalObject((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation());
-		ctrl_additional_info.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getPracticeDescription_AdditionalInfo());
-		ctrl_additional_info.addModifyListener(contentModifyListener);
-		ctrl_additional_info.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_additional_info;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation()).getAdditionalInfo();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							(org.eclipse.epf.uma.PracticeDescription) guidance
-									.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getPracticeDescription_AdditionalInfo(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_application
-				.setModalObject((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation());
-		ctrl_application.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getPracticeDescription_Application());
-		ctrl_application.addModifyListener(contentModifyListener);
-		ctrl_application.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_application;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation()).getApplication();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							(org.eclipse.epf.uma.PracticeDescription) guidance
-									.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getPracticeDescription_Application(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_goals.setModalObject((org.eclipse.epf.uma.PracticeDescription) guidance
-				.getPresentation());
-		ctrl_goals.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getPracticeDescription_Goals());
-		ctrl_goals.addModifyListener(contentModifyListener);
-		ctrl_goals.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_goals;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation()).getGoals();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager()
-							.doAction(
-									IActionManager.SET,
-									(org.eclipse.epf.uma.PracticeDescription) guidance
-											.getPresentation(),
-									UmaPackage.eINSTANCE
-											.getPracticeDescription_Goals(),
-									newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_problem.setModalObject((org.eclipse.epf.uma.PracticeDescription) guidance
-				.getPresentation());
-		ctrl_problem.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getPracticeDescription_Problem());
-		ctrl_problem.addModifyListener(contentModifyListener);
-		ctrl_problem.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_problem;
-				String oldContent = ((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation()).getProblem();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							(org.eclipse.epf.uma.PracticeDescription) guidance
-									.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getPracticeDescription_Problem(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_background
-				.setModalObject((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation());
-		ctrl_background.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getPracticeDescription_Background());
-		ctrl_background.addModifyListener(contentModifyListener);
-		ctrl_background.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_background;
-				String oldContent = ((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation()).getBackground();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							(org.eclipse.epf.uma.PracticeDescription) guidance
-									.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getPracticeDescription_Background(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_levels_adoption
-				.setModalObject((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation());
-		ctrl_levels_adoption.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getPracticeDescription_LevelsOfAdoption());
-		ctrl_levels_adoption.addModifyListener(contentModifyListener);
-		ctrl_levels_adoption.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_levels_adoption;
-				String oldContent = ((org.eclipse.epf.uma.PracticeDescription) guidance
-						.getPresentation()).getLevelsOfAdoption();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = descExpandFlag ? ctrl_expanded.getText()
-						: ctrl_levels_adoption.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							(org.eclipse.epf.uma.PracticeDescription) guidance
-									.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getPracticeDescription_LevelsOfAdoption(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#refresh(boolean)
-	 */
-	protected void refresh(boolean editable) {
-		super.refresh(editable);
-		ctrl_additional_info.setEditable(editable);
-		ctrl_application.setEditable(editable);
-		ctrl_goals.setEditable(editable);
-		ctrl_problem.setEditable(editable);
-		ctrl_levels_adoption.setEditable(editable);
-		ctrl_background.setEditable(editable);
-	}
-
-	/**
-	 * Load initial data from model
-	 *
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#loadData()
-	 */
-	protected void loadData() {
-		super.loadData();
-		if (guidance != null) {
-			org.eclipse.epf.uma.PracticeDescription guidanceDescription = (org.eclipse.epf.uma.PracticeDescription) guidance
-					.getPresentation();
-			ctrl_additional_info
-					.setText(guidanceDescription.getAdditionalInfo() == null ? "" : guidanceDescription.getAdditionalInfo()); //$NON-NLS-1$
-			ctrl_problem
-					.setText(guidanceDescription.getProblem() == null ? "" : guidanceDescription.getProblem()); //$NON-NLS-1$
-			ctrl_background
-					.setText(guidanceDescription.getBackground() == null ? "" : guidanceDescription.getBackground()); //$NON-NLS-1$
-			ctrl_application
-					.setText(guidanceDescription.getApplication() == null ? "" : guidanceDescription.getApplication()); //$NON-NLS-1$
-			ctrl_goals
-					.setText(guidanceDescription.getGoals() == null ? "" : guidanceDescription.getGoals()); //$NON-NLS-1$
-			ctrl_levels_adoption
-					.setText(guidanceDescription.getLevelsOfAdoption() == null ? "" : guidanceDescription.getLevelsOfAdoption()); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.GuidanceDescriptionPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return guidance;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/PracticeReferencesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/PracticeReferencesPage.java
deleted file mode 100644
index b374174..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/PracticeReferencesPage.java
+++ /dev/null
@@ -1,230 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.AllFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The References page in the Practice editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class PracticeReferencesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "practiceReferencesPage"; //$NON-NLS-1$
-
-	private Practice practice;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PracticeReferencesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.REFERENCES_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		practice = (Practice) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setUseCategory2(false);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List list = new ArrayList();
-				list.addAll(practice.getContentReferences());
-				list.addAll(practice.getActivityReferences());
-				return list.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Object item = it.next();
-				if (item instanceof ContentElement) {
-					actionMgr.doAction(IActionManager.ADD, practice,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(), item, -1);
-				} else if (item instanceof Activity) {
-					actionMgr
-							.doAction(IActionManager.ADD, practice,
-									UmaPackage.eINSTANCE
-											.getPractice_ActivityReferences(),
-									item, -1);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Object item = it.next();
-				if (item instanceof ContentElement) {
-					actionMgr.doAction(IActionManager.REMOVE, practice,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(), item, -1);
-				} else if (item instanceof Activity) {
-					actionMgr
-							.doAction(IActionManager.REMOVE, practice,
-									UmaPackage.eINSTANCE
-											.getPractice_ActivityReferences(),
-									item, -1);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return practice;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ONLY_CONTENT_ELEMENTS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new AllFilter() {
-			protected boolean childAccept(Object obj) {
-				if(obj instanceof Milestone) return false;
-				if(obj instanceof ContentElement
-					|| obj instanceof BreakdownElement
-					|| obj instanceof ProcessPackage) 
-					return true;
-				return false;
-			}
-		};
-	}
-	/**
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getFilterTypes()
-	 */
-	protected String[] getFilterTypes() {
-		String[] str = new String[14];
-		int i = 0;
-		str[i++] = FilterConstants.ALL_ELEMENTS;
-		str[i++] = FilterConstants.space + FilterConstants.ROLES;
-		str[i++] = FilterConstants.space + FilterConstants.TASKS;
-		str[i++] = FilterConstants.space + FilterConstants.WORKPRODUCTS;
-		str[i++] = FilterConstants.space + FilterConstants.GUIDANCE;
-		str[i++] = FilterConstants.DISCIPLINES;
-		str[i++] = FilterConstants.ROLESETS;
-		str[i++] = FilterConstants.WORKPRODUCTTYPES;
-		str[i++] = FilterConstants.DOMAINS;
-		str[i++] = FilterConstants.TOOLS;
-		str[i++] = FilterConstants.CUSTOM_CATEGORIES;
-		str[i++] = FilterConstants.PROCESSES;
-		str[i++] = FilterConstants.CONTENT_PACKAGES;
-		str[i++] = FilterConstants.METHO_PLUGINS;
-		return str;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.practiceReferencesPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.practiceReferencesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.practiceReferencesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.practiceReferencesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.practiceReferencesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.practiceReferencesPage_selectedLabel;
-	}
-
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessBreakdownStructureFormPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessBreakdownStructureFormPage.java
deleted file mode 100644
index 6114558..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessBreakdownStructureFormPage.java
+++ /dev/null
@@ -1,1006 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.gef.figures.Colors;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.celleditors.AbstractCheckBoxCellEditor;
-import org.eclipse.epf.authoring.ui.celleditors.ProcessCheckBoxCellEditor;
-import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.authoring.ui.providers.ExposedAdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider;
-import org.eclipse.epf.authoring.ui.views.ProcessViewer;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.IColumnAware;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckboxCellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * Breadown structure editor
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ProcessBreakdownStructureFormPage extends ProcessFormPage
-		implements IViewerProvider {
-
-	protected static final String TXT_TRUE = "true"; //$NON-NLS-1$
-
-	protected static final String TXT_FALSE = "false"; //$NON-NLS-1$
-
-	protected static final Collection<EClass> ECLASSES;
-	
-	private int tabIndex = 0;
-	
-	static {
-		ECLASSES = new ArrayList<EClass>();
-		ECLASSES.add(UmaPackage.eINSTANCE.getMethodPackage());
-	}
-	
-	private class ProcessAdapterFactoryLabelProvider extends
-			VariabilityElementLabelProvider implements IColorProvider {
-
-		private DecoratingLabelProvider decoratingLabelProvider;
-		
-		/**
-		 * @param adapterFactory
-		 */
-		public ProcessAdapterFactoryLabelProvider(AdapterFactory adapterFactory) {
-			super(adapterFactory);
-			decoratingLabelProvider = new DecoratingLabelProvider(
-					new AdapterFactoryLabelProvider(adapterFactory),
-					PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator());
-		}
-		
-		public void addListener(ILabelProviderListener listener) {
-			super.addListener(listener);
-			decoratingLabelProvider.addListener(listener);
-		}
-		
-		public void removeListener(ILabelProviderListener listener) {			
-			super.removeListener(listener);
-			decoratingLabelProvider.removeListener(listener);
-		}
-				
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getColumnImage(java.lang.Object, int)
-		 */
-		public Image getColumnImage(Object object, int columnIndex) {
-			if(columnIndex == 0) {
-				return getImage(object);
-			}
-			return super.getColumnImage(object, columnIndex);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object object) {
-			return decoratingLabelProvider.getImage(object);
-		}
-
-		/**
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-		 */
-		public Color getForeground(Object element) {
-			if (isSuppressed(element)) {
-				return Colors.SUPRESSED_ELEMENT_LABEL;
-			}
-			else if (isExternal(element)) {
-				return Colors.INHERITED_ELEMENT_LABEL;
-			}			
-			return null;
-		}
-
-		private boolean isSuppressed(Object element) {
-			if (element instanceof BreakdownElement) {
-				return getSuppression()
-						.isSuppressed((BreakdownElement) element);
-			} else if (element instanceof BreakdownElementWrapperItemProvider) {
-				return getSuppression().isSuppressed(
-						(BreakdownElementWrapperItemProvider) element);
-			}
-			return false;
-		}
-
-		private Suppression getSuppression() {
-			return ((ProcessEditor) ProcessBreakdownStructureFormPage.this
-					.getEditor()).getSuppression();
-		}
-
-		/**
-		 * 
-		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-		 */
-		public Color getBackground(Object element) {
-			// let OS take control over tree widget background
-			// rather than sending one fixed background.
-			return null;
-		}
-
-		/**
-		 * 
-		 * @see com.ibm.library.edit.util.VariabilityElementLabelProvider#isExternal(java.lang.Object)
-		 */
-		public boolean isExternal(Object element) {
-			return ProcessUtil.isInherited(element);
-		}
-
-		/**
-		 * @see com.ibm.library.edit.util.VariabilityElementLabelProvider#getFont(java.lang.Object)
-		 */
-		public Font getFont(Object element) {
-			if (isExternal(element)) {
-				return italicFont;
-			}
-			return regularFont;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider#dispose()
-		 */
-		public void dispose() {
-			decoratingLabelProvider.dispose();
-			decoratingLabelProvider = null;
-			super.dispose();
-		}
-	}
-
-	protected class ValidatingTextCellEditor extends TextCellEditor {
-		protected Object lastInvalidElement;
-
-		private int columnIndex;
-
-		/**
-		 * @param parent
-		 */
-		public ValidatingTextCellEditor(Composite parent) {
-			super(parent);
-		}
-
-		public void setColumnIndex(int columnIndex) {
-			this.columnIndex = columnIndex;
-		}
-
-		public int getColumnIndex() {
-			return columnIndex;
-		}
-
-		public Object getLastInvalidElement() {
-			return lastInvalidElement;
-		}
-
-		String isValid(String txt) {
-			IStructuredSelection selection = (IStructuredSelection) viewer
-					.getSelection();
-			if (selection.size() == 1) {
-				Object e = selection.getFirstElement();
-				String msg = isValid(e, txt);
-				if (msg != null) {
-					lastInvalidElement = e;
-				} else {
-					lastInvalidElement = null;
-				}
-				return msg;
-			}
-			return null;
-		}
-
-		protected String isValid(Object e, String txt) {
-			return null;
-		}
-	}
-
-	protected static class CellEditorValidator implements ICellEditorValidator {
-
-		private ValidatingTextCellEditor cellEditor;
-
-		/**
-		 * 
-		 */
-		public CellEditorValidator(ValidatingTextCellEditor cellEditor) {
-			this.cellEditor = cellEditor;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.ICellEditorValidator#isValid(java.lang.Object)
-		 */
-		public String isValid(Object value) {
-			return cellEditor.isValid((String) value);
-		}
-
-	}
-
-	protected class ValidatingDeactivateListener implements Listener {
-		private ValidatingTextCellEditor cellEditor;
-
-		public ValidatingDeactivateListener(ValidatingTextCellEditor cellEditor) {
-			this.cellEditor = cellEditor;
-		}
-
-		public void handleEvent(Event e) {
-			Display.getCurrent().asyncExec(new Runnable() {
-				public void run() {
-					if (cellEditor.getLastInvalidElement() != null) {
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										AuthoringUIResources.editProcessElementErrorDialog_title, 
-										cellEditor.getErrorMessage());
-						viewer.editElement(cellEditor.getLastInvalidElement(),
-								cellEditor.getColumnIndex());
-					}
-				}
-
-			});
-		}
-	}
-
-	// private class ValidatingFocusAdapter extends FocusAdapter {
-	// private ValidatingTextCellEditor cellEditor;
-	//
-	// ValidatingFocusAdapter(ValidatingTextCellEditor cellEditor) {
-	// this.cellEditor = cellEditor;
-	// }
-	//
-	// public void focusLost(FocusEvent e) {
-	// Display.getCurrent().asyncExec(new Runnable() {
-	//
-	// public void run() {
-	// if (cellEditor.getLastInvalidElement() != null) {
-	// AuthoringUIPlugin
-	// .getDefault()
-	// .getMsgDialog()
-	// .displayError(
-	// AuthoringUIResources
-	// .getString("AuthoringUI.editProcessElementErrorDialog.title"),
-	// //$NON-NLS-1$
-	// cellEditor.getErrorMessage());
-	// viewer.editElement(cellEditor.getLastInvalidElement(),
-	// cellEditor.getColumnIndex());
-	// }
-	// }
-	//
-	// });
-	// }
-	// }
-
-	// private Composite parent = null;
-
-	protected ColumnDescriptor[] columnDescriptors;
-
-	// private boolean validNamePrompted = false;
-	// private int promptCount = 0;
-
-	// private MethodElement promptedElement;
-
-	// private TableTreeViewer tableTreeViewer;
-
-	protected AdapterFactory adapterFactory;
-
-	// private int tabIndex;
-
-	// private Object tabFolder;
-
-	protected ProcessViewer viewer;
-
-	protected TextCellEditor textCellEditor;
-
-	protected ValidatingTextCellEditor nameCellEditor;
-
-	protected ValidatingTextCellEditor predListCellEditor;
-
-	protected ComboBoxCellEditor comboBoxCellEditor;
-
-	protected CheckboxCellEditor checkBoxCellEditor;
-
-	protected ValidatingTextCellEditor presentationNameCellEditor;
-
-	// private HashMap columnIndexToNameMap;
-	protected boolean isReadOnly;
-
-	/**
-	 * Creates an instance
-	 * @param editor
-	 * @param id
-	 * @param title
-	 */
-	public ProcessBreakdownStructureFormPage(FormEditor editor, String id,
-			String title) {
-		super(editor, id, title);
-	}
-	
-	/**
-	 * If returns true, editing is disabled or not available for the process 
-	 * breakdown structure.
-	 * 
-	 */
-	public boolean isReadOnly() {
-		if (isReadOnly) {
-			return isReadOnly;
-		}
-		return TngUtil.isLocked(process);
-	}
-	
-	/**
-	 * If returns true, editing is disabled or not available for the process 
-	 * breakdown structure.
-	 * 
-	 */
-	public boolean basicIsReadOnly() {
-		return isReadOnly;
-	}
-
-	/**
-	 * Enables/disable modifying process breakdown structure
-	 * 
-	 * @param isReadOnly
-	 */
-	public void setReadOnly(boolean isReadOnly) {
-		this.isReadOnly = isReadOnly;
-	}
-
-	/**
-	 * Sets adapter factory to create item provider for each element in 
-	 * the breakdown structure
-	 *
-	 * @param adapterFactory
-	 */
-	public void setAdapterFactory(AdapterFactory adapterFactory) {
-		this.adapterFactory = adapterFactory;
-	}
-
-	/**
-	 * Sets column descriptors to define the columns of the tree.
-	 * 
-	 * @param columnDescriptors
-	 */
-	public void setColumnDescriptors(ColumnDescriptor[] columnDescriptors) {
-		this.columnDescriptors = columnDescriptors;
-
-		if (adapterFactory instanceof IColumnAware) {
-			Map<Integer, String> columnIndexToNameMap = new HashMap<Integer, String>();
-			for (int i = 0; i < columnDescriptors.length; i++) {
-				columnIndexToNameMap.put(new Integer(i),
-						columnDescriptors[i].id);
-			}
-			((IColumnAware) adapterFactory)
-					.setColumnIndexToNameMap(columnIndexToNameMap);
-		}
-	}
-	
-	protected void setText(BreakdownElement e, String prop, String txt) {
-		IActionManager actionMgr = ((MethodElementEditor) getEditor())
-				.getActionManager();
-		if (prop == IBSItemProvider.COL_PREDECESSORS) {
-			WorkBreakdownElement wbe = (WorkBreakdownElement) e;
-			List<WorkOrder> addList = new ArrayList<WorkOrder>();
-			List<WorkOrder> predToBeDeleted = new ArrayList<WorkOrder>();
-			if(PredecessorList.prepareUpdatePredecessors(adapterFactory, wbe, txt, addList, predToBeDeleted)) {
-				if(!predToBeDeleted.isEmpty()) {
-					actionMgr.doAction(
-							IActionManager.REMOVE_MANY,
-							wbe,
-							UmaPackage.eINSTANCE.getWorkBreakdownElement_LinkToPredecessor(),
-							predToBeDeleted, -1);
-				}
-				if(!addList.isEmpty()) {
-					actionMgr
-					.doAction(
-							IActionManager.ADD_MANY,
-							wbe,
-							UmaPackage.eINSTANCE
-									.getWorkBreakdownElement_LinkToPredecessor(),
-							addList, -1);
-				}
-			}
-			
-			return;
-		}
-		
-		ProcessUtil.setAttribute(actionMgr, e, prop, txt);
-	}
-
-	protected String getText(BreakdownElement e, String prop) {
-		// handle editing presentation name of extending/contributing activity
-		// specially
-		//
-		if (prop == IBSItemProvider.COL_PRESENTATION_NAME
-				&& ProcessUtil.isExtendingOrLocallyContributing(e)) {
-			return ((DescribableElement) e).getPresentationName();
-		}
-
-		IBSItemProvider adapter = (IBSItemProvider) adapterFactory.adapt(e,
-				ITreeItemContentProvider.class);
-		return adapter.getAttribute(e, prop);
-	}
-
-	/**
-	 * Set tab index for the form page
-	 * @param id
-	 */
-	public void setTabIndex(int id) {
-		 tabIndex = id;
-	}
-	
-	/**
-	 * Return tab index for the form page
-	 */
-	public int getTabIndex() {
-		return tabIndex;
-	}
-
-	/**
-	 * Set tab folder
-	 * @param tabFolder
-	 */
-	public void setTabFolder(CTabFolder tabFolder) {
-		// this.tabFolder = tabFolder;
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// create form toolkit
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		form.setText(getEditor().getPartName());
-
-		TableWrapLayout layout = new TableWrapLayout();
-		form.getBody().setLayout(layout);
-
-		Section section = toolkit.createSection(form.getBody(),
-				Section.EXPANDED | Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB,
-				TableWrapData.FILL_GRAB);
-		section.setLayoutData(td);
-		section
-				.setText(getTitle()
-						+ " " + AuthoringUIResources.processBreakdownStructureFormPage_BSEditor); //$NON-NLS-1$ 
-		section.setLayout(new GridLayout());
-
-		Composite composite = toolkit.createComposite(section);
-		// composite.setLayout(new GridLayout(1, false));
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		composite.setLayout(new GridLayout());
-		section.setClient(composite);
-		Control control = createControl(composite);
-		toolkit.adapt(control, true, true);
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gridData.verticalIndent = 10;
-		gridData.heightHint = 600;
-		control.setLayoutData(gridData);
-
-		ProcessEditor editor = (ProcessEditor) getEditor();
-		// editor.createContextMenuFor(tableTreeViewer);
-		editor.createContextMenuFor(viewer);
-
-		setInput(process);
-	}
-
-
-	/**
-	 * Create control
-	 * @param parent
-	 * @return
-	 * 			Control
-	 */
-	public Control createControl(Composite parent) {
-		// this.parent = parent;
-		// This is the page for the table tree viewer.
-		//
-		Composite comp = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		comp.setLayout(layout);
-		GridData gd = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
-		comp.setLayoutData(gd);
-		
-		viewer = new ProcessViewer(comp, SWT.MULTI | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
-		viewer.getControl().setLayoutData(gd);
-		viewer.setupColumns(columnDescriptors);
-		viewer.setContentProvider(new ExposedAdapterFactoryContentProvider(
-				adapterFactory));
-		viewer.setLabelProvider(new ProcessAdapterFactoryLabelProvider(adapterFactory));
-
-
-		viewer.setActionManager(((MethodElementEditor) getEditor())
-			.getActionManager());
-
-		textCellEditor = new TextCellEditor(viewer.getCellEditorParent());
-		comboBoxCellEditor = new ComboBoxCellEditor(viewer
-				.getCellEditorParent(), new String[] { TXT_TRUE, TXT_FALSE });
-		checkBoxCellEditor = new CheckboxCellEditor(viewer
-				.getCellEditorParent());
-
-		//set all editors and modifiers
-		setAllEditorsAndModifiers();
-		
-		viewer.setAutoExpandLevel(3);
-		viewer.setInput(process);
-
-//		 int dndOperations = DND.DROP_COPY | DND.DROP_MOVE ;
-//		 Transfer[] transfers = new Transfer[] { TNGObjTransfer.getInstance()
-//		 };
-//		 tableTreeViewer.addDropSupport(DND.DROP_MOVE, transfers, new
-//		 BSTabDropAdapter(tableTreeViewer));
-
-		// BSEditorView.getView().createContextMenuFor(tableTreeViewer);
-		// return tableTreeViewer.getControl();
-
-		setContextHelp(viewer.getControl());
-
-		return comp;
-
-	}
-
-	
-	/**
-	 * Set all editors and modifiers for the viewer
-	 */
-	private void setAllEditorsAndModifiers()
-	{
-		setCellEditors();
-		setCheckBoxCellEditors();
-
-		// Set the cell modifier
-		viewer.setCellModifier(new ICellModifier() {
-			/**
-			 * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-			 */
-			public boolean canModify(Object element, String property) {
-				// System.out.println("canModify: element="+element+",
-				// property="+property);
-
-				if (isReadOnly() ||
-						(element instanceof BreakdownElementWrapperItemProvider && ((BreakdownElementWrapperItemProvider) element).isReadOnly())) {
-					return false;
-				}
-
-//				if (!(element instanceof BreakdownElement)
-//						&& !(element instanceof BreakdownElementWrapperItemProvider && !((BreakdownElementWrapperItemProvider) element)
-//								.isReadOnly())) {
-//					Collection types = new ArrayList();
-//					types.add(VariabilityType.EXTENDS_LITERAL);
-//					if (TngUtil
-//							.isGeneralizer(
-//									(VariabilityElement) ((BreakdownElementWrapperItemProvider) element)
-//											.getOwner(), types))
-//						return false;
-//				}
-				
-				if (property == IBSItemProvider.COL_ID
-						|| property == IBSItemProvider.COL_TYPE
-						|| property == IBSItemProvider.COL_MODEL_INFO
-						|| property == IBSItemProvider.COL_DELIVERABLE) {
-					return false;
-				}
-
-				element = TngUtil.unwrap(element);
-				if (!(element instanceof WorkProductDescriptor)
-						&& (property == IBSItemProvider.COL_ENTRY_STATE || property == IBSItemProvider.COL_EXIT_STATE)) {
-					return false;
-				}
-				if (!(element instanceof WorkBreakdownElement)
-						&& (property == IBSItemProvider.COL_PREDECESSORS)) {
-					return false;
-				}
-
-				return true;
-			}
-
-			/**
-			 * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-			 */
-			public Object getValue(Object element, String property) {
-				// System.out.println("getValue: element="+element+",
-				// property="+property);
-				BreakdownElement e = (BreakdownElement) TngUtil.unwrap(element);
-				String val = getText(e, property);
-				switch (getCellEditorType(property)) {
-				case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN:
-					if (TXT_TRUE.equalsIgnoreCase(val)) {
-						return new Integer(0);
-					} else {
-						return new Integer(1);
-					}
-				case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT:
-					return val;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN:
-					return Boolean.valueOf(val);
-				default:
-					return val;
-				}
-			}
-
-			/**
-			 * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-			 */
-			public void modify(final Object element, String property,
-					Object value) {
-				// System.out.println("modify: element="+element+",
-				// property="+property+", value="+value);
-				Widget item = (Widget) element;
-				BreakdownElement be = (BreakdownElement) TngUtil.unwrap(item
-						.getData());
-
-				final int columnIndex = getColumnIndex(property);
-				CellEditor cellEditor = viewer.getCellEditors()[columnIndex];
-				String errMsg = cellEditor.getErrorMessage();
-				if (errMsg != null) {
-					return;
-				}
-
-				String txt;
-				switch (getCellEditorType(property)) {
-				case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT:
-					txt = (String) value;
-					break;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN:
-					int index = ((Number) value).intValue();
-					if (index == 0) {
-						txt = TXT_TRUE;
-					} else {
-						txt = TXT_FALSE;
-					}
-					break;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN:
-					txt = value.toString();
-					break;
-				default:
-					txt = TngUtil.checkNull(value.toString());
-				}
-				setText(be, property, txt);
-				if (property == IBSItemProvider.COL_PRESENTATION_NAME
-						&& StrUtil.isBlank(be.getName())) {
-					be.setName(txt);
-				}
-				
-				viewer.refresh();
-			}
-		});
-	}
-	
-	
-	/**
-	 * Get cell editor for the given column
-	 * @param columnID
-	 * @param columnIndex
-	 * @return
-	 * 			Cell Editor
-	 */
-	public CellEditor getCellEditor(String columnID, int columnIndex) {
-		if (columnID == IBSItemProvider.COL_PRESENTATION_NAME) {
-			if (presentationNameCellEditor == null) {
-				presentationNameCellEditor = new ValidatingTextCellEditor(
-						viewer.getCellEditorParent()) {
-					protected String isValid(Object e, String txt) {
-						e = TngUtil.unwrap(e);
-						Suppression suppression = ((ProcessEditor)getEditor()).getSuppression();
-						boolean ignoreSuppressed = true;
-						return ProcessUtil
-								.checkBreakdownElementPresentationName(
-										adapterFactory, (BreakdownElement) e,
-										txt, suppression, ignoreSuppressed);
-					}
-				};
-
-				presentationNameCellEditor
-						.setValidator(new CellEditorValidator(
-								presentationNameCellEditor));
-				// presentationNameCellEditor.getControl().addFocusListener(new
-				// ValidatingFocusAdapter(presentationNameCellEditor));
-				presentationNameCellEditor.getControl().addListener(
-						SWT.Deactivate,
-						new ValidatingDeactivateListener(
-								presentationNameCellEditor));
-			}
-			presentationNameCellEditor.setColumnIndex(columnIndex);
-
-			return presentationNameCellEditor;
-		} else if (columnID == IBSItemProvider.COL_NAME) {
-			if (nameCellEditor == null) {
-				nameCellEditor = new ValidatingTextCellEditor(viewer
-						.getCellEditorParent()) {
-					protected String isValid(Object e, String txt) {
-						e = TngUtil.unwrap(e);
-						Suppression suppression = ((ProcessEditor)getEditor()).getSuppression();
-						return TngUtil
-								.checkActivityName(adapterFactory, e, txt, suppression);
-					}
-				};
-				nameCellEditor.setValidator(new CellEditorValidator(
-						nameCellEditor));
-				// nameCellEditor.getControl().addFocusListener(new
-				// ValidatingFocusAdapter(nameCellEditor));
-				nameCellEditor.getControl().addListener(SWT.Deactivate,
-						new ValidatingDeactivateListener(nameCellEditor));
-			}
-			nameCellEditor.setColumnIndex(columnIndex);
-
-			return nameCellEditor;
-		} else if (columnID == IBSItemProvider.COL_PREDECESSORS) {
-			if (predListCellEditor == null) {
-				predListCellEditor = new ValidatingTextCellEditor(viewer
-						.getCellEditorParent()) {
-					protected String isValid(Object e, String txt) {
-						e = TngUtil.unwrap(e);
-						return ProcessUtil.checkPredecessorList(
-								(WorkBreakdownElement) e, txt, adapterFactory,
-								process, null);
-					}
-				};
-				predListCellEditor.setValidator(new CellEditorValidator(
-						predListCellEditor));
-				// predListCellEditor.getControl().addFocusListener(new
-				// ValidatingFocusAdapter(predListCellEditor));
-				predListCellEditor.getControl().addListener(SWT.Deactivate,
-						new ValidatingDeactivateListener(predListCellEditor));
-			}
-			predListCellEditor.setColumnIndex(columnIndex);
-
-			return predListCellEditor;
-		}
-		return null;
-	}
-
-	/**
-	 * Set cell editors for all columns 
-	 */
-	public void setCellEditors() {
-		CellEditor[] cellEditors = new CellEditor[columnDescriptors.length];
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			CellEditor cellEditor = getCellEditor(columnDescriptors[i].id, i);
-			if (cellEditor != null) {
-				cellEditors[i] = cellEditor;
-			} else {
-				switch (columnDescriptors[i].cellEditorType) {
-				case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN:
-					cellEditors[i] = comboBoxCellEditor;
-					break;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT:
-					cellEditors[i] = textCellEditor;
-					break;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN:
-					cellEditors[i] = checkBoxCellEditor;
-					break;
-				default:
-					cellEditors[i] = null;
-				}
-			}
-		}
-		viewer.setCellEditors(cellEditors);
-	}
-	
-	
-	
-
-	/**
-	 * Set input for viewer
-	 * @param newInput
-	 */
-	public void setInput(Object newInput) {
-		if (newInput instanceof Process) {
-			process = (Process) newInput;
-			if (process.eContainer() instanceof ProcessComponent) {
-				viewer.setInput(process.eContainer());
-				// viewer.expandAll();
-//				viewer.reveal(process);
-				return;
-			}
-		}
-		viewer.setInput(null);
-	}
-
-	protected int getColumnIndex(String property) {
-		Object[] colProps = viewer.getColumnProperties();
-		for (int i = 0; i < colProps.length; i++) {
-			if (colProps[i] == property)
-				return i;
-		}
-		return -1;
-	}
-
-	protected int getCellEditorType(String property) {
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			ColumnDescriptor desc = columnDescriptors[i];
-			if (desc.id == property) {
-				return desc.cellEditorType;
-			}
-		}
-		return ColumnDescriptor.CELL_EDITOR_TYPE_NONE;
-	}
-
-	/**
-	 * Return viewer
-	 */
-	public Viewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * Set process as input
-	 * @param proc
-	 */
-	public void setProcess(Process proc) {
-		if (process != proc) {
-			setInput(proc);
-		}
-	}
-
-	/**
-	 * Returns the adapterFactory.
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return adapterFactory;
-	}
-
-	/**
-	 * Update columns with new column descriptors
-	 * @param newColumnDescriptors
-	 */
-	public void updateColumns(ColumnDescriptor[] newColumnDescriptors) {
-		setColumnDescriptors(newColumnDescriptors);
-		viewer.setupColumns(newColumnDescriptors);	
-		setAllEditorsAndModifiers();
-		viewer.refresh();
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-		// if(adapterFactory instanceof ComposeableAdapterFactory) {
-		// ((ComposedAdapterFactory)adapterFactory).dispose();
-		// }
-
-		if (viewer.getContentProvider() != null) {
-			viewer.getContentProvider().dispose();
-		}
-
-		if (viewer.getLabelProvider() != null) {
-			viewer.getLabelProvider().dispose();
-		}
-
-		super.dispose();
-	}
-
-	protected void setContextHelp(Control control) {
-		AdapterFactory adapterFac = getAdapterFactory();
-		AdapterFactory allFac = TngAdapterFactory.INSTANCE
-				.getProcessComposedAdapterFactory();
-		AdapterFactory wbsFac = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		AdapterFactory obsFac = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		AdapterFactory pbsFac = TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory();
-
-		// System.out.println("$$$ DEBUG: current dadpter fac = " + adapterFac);
-		// System.out.println("$$$ DEBUG: all dadpter fac = " + allFac);
-		// System.out.println("$$$ DEBUG: wbs dadpter fac = " + wbsFac);
-		// System.out.println("$$$ DEBUG: obs dadpter fac = " + obsFac);
-		// System.out.println("$$$ DEBUG: pbs dadpter fac = " + pbsFac);
-
-		if (adapterFac == wbsFac)
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-					AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_WBS_CONTEXT);
-		else if (adapterFac == obsFac)
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-					AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_OBS_CONTEXT);
-		else if (adapterFac == pbsFac)
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-					AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_PBS_CONTEXT);
-		else if (adapterFac == allFac)
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-					AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_ALLBS_CONTEXT);
-	}
-	
-	/**
-	 * Gets additional actions to contribute to the context menu.
-	 * 
-	 * @return
-	 * 			Actions
-	 */
-	public IAction[] getAdditionalActions() {
-		return null;
-	}
-	
-	/**
-	 * Set check box cell editors
-	 */
-	public void setCheckBoxCellEditors() {
-		AbstractCheckBoxCellEditor[] cellEditors = new AbstractCheckBoxCellEditor[columnDescriptors.length];
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			switch (columnDescriptors[i].cellEditorType) {
-				case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN:
-					cellEditors[i] = new ProcessCheckBoxCellEditor(viewer
-							.getCellEditorParent());
-					break;
-				default:
-					cellEditors[i] = null;
-			}
-		}
-		((ProcessViewer) viewer).setCheckBoxCellEditors(cellEditors);
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessDescription.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessDescription.java
deleted file mode 100644
index 2a3d557..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessDescription.java
+++ /dev/null
@@ -1,1556 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.authoring.ui.util.EditorsContextHelper;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.navigator.ConfigurationsItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.richtext.RichTextListener;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * The Description page for the process description.
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- * 
- * TODO: Rename this class to ProcessDescriptionPage
- */
-public class ProcessDescription extends ProcessFormPage {
-
-	private static final String FORM_PAGE_ID = "processDescriptionPage"; //$NON-NLS-1$
-
-	private static final int DEFAULT_VERTICAL_INDENT = 2;
-
-	protected static final int GENERAL_SECTION_ID = 1;
-
-	protected static final int DETAIL_SECTION_ID = 2;
-
-	private IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-	};
-
-	private ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory());
-
-	protected Section formSection;
-
-	protected Composite sectionComposite;
-
-	private Composite expandedComposite;
-
-	private Text ctrl_name;
-
-	private Text ctrl_presentation_name;
-
-	private Text ctrl_brief_desc, ctrl_external_id;
-
-	private IMethodRichText ctrl_purpose;
-
-	private IMethodRichText ctrl_full_desc;
-
-	private IMethodRichText ctrl_scope, ctrl_usage_notes;
-
-	private IMethodRichText ctrl_alternatives, ctrl_how_to_staff,
-			ctrl_key_consideration;
-
-	private IMethodRichText activeControl;
-
-	private Section generalSection, detailSection, configSection;
-
-	protected Composite generalComposite, detailComposite, configComposite;
-
-	protected boolean descExpandFlag = false;
-
-	protected boolean generalSectionExpandFlag = false;
-
-	protected boolean detailSectionExpandFlag = false;
-
-	protected boolean configSectionExpandFlag = false;
-
-	protected IMethodRichTextEditor ctrl_expanded;
-
-	private ImageHyperlink expandLink;
-
-	private Label expandLabel;
-
-	// private String[] variabilityTypes = new String[] {"N/A", "Contributes",
-	// "Extends", "Replaces"};
-	// private HashMap variabilityElementMap = new HashMap();
-
-	private org.eclipse.swt.widgets.List list_configurations;
-
-	private ListViewer configListViewer;
-
-	protected Button buttonAdd;
-
-	protected Button buttonRemove;
-
-	// private Button buttonEdit;
-	protected Button buttonMakeDefault;
-
-	private Text textConfigDescription;
-
-	private ItemProviderAdapter configListAdapter;
-
-	protected ModifyListener modifyListener;
-
-	protected ModifyListener contentModifyListener;
-
-//	private Adapter processListener;
-
-	private String processType;
-
-	private MethodElementEditor editor;
-
-	private ModifyListener nameModifyListener;
-
-	private boolean disposed;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessDescription(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIResources.descriptionPage_title); 
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// create form toolkit
-		super.createFormContent(managedForm);
-
-		processType = LibraryUIText.getUITextLower(process);
-		setFormText();
-
-		// create editor content
-		createEditorContent(toolkit);
-
-//		// add listener to listen to change in process's data
-//		if (processListener == null) {
-//			processListener = new AdapterImpl() {
-//				public void notifyChanged(Notification msg) {
-//					switch (msg.getFeatureID(Process.class)) {
-//					case UmaPackage.PROCESS__NAME:
-//						refreshElementName(msg.getNewStringValue());
-//						break;
-//					}
-//				}
-//			};
-//		}
-//		process.eAdapters().add(processListener);
-
-		loadData();
-		addListeners();
-
-		EditorsContextHelper.setHelp(getPartControl(), processType);
-	}
-
-	/**
-	 * Creates the editor tab content
-	 * 
-	 * @param toolkit
-	 *            The form toolkit.
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		createFormComposites();
-		createGeneralSection();
-		createDetailSection();
-		createConfigurationSection();
-
-		toolkit.paintBordersFor(generalComposite);
-		toolkit.paintBordersFor(detailComposite);
-		toolkit.paintBordersFor(configComposite);
-		toolkit.paintBordersFor(expandedComposite);
-	}
-
-	private void createFormComposites() {
-		formSection = toolkit.createSection(form.getBody(), Section.NO_TITLE);
-		{
-			TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-			formSection.setLayoutData(td);
-			formSection.setLayout(new TableWrapLayout());
-		}
-
-		// create the composite for the sections
-		sectionComposite = toolkit.createComposite(formSection, SWT.NONE);
-		sectionComposite.setLayoutData(new TableWrapData());
-		sectionComposite.setLayout(new TableWrapLayout());
-		formSection.setClient(sectionComposite);
-
-		expandedComposite = toolkit.createComposite(formSection, SWT.NONE);
-		{
-			TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-			expandedComposite.setLayoutData(td);
-			expandedComposite.setLayout(new GridLayout(2, false));
-			expandedComposite.setVisible(false);
-		}
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(expandedComposite,
-				AuthoringUIHelpContexts.RICH_TEXT_EDITOR_CONTEXT_ID);
-
-		// Add the expand/collapse hyperlink image.
-		expandLink = toolkit.createImageHyperlink(expandedComposite, SWT.NONE);
-		expandLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		expandLink.setToolTipText(AuthoringUIResources.closeRTE);
-		expandLink.setUnderlined(false);
-		expandLink.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e);
-			}
-		});
-
-		// Add the expand/collapse hyperlink text.
-		expandLabel = createDecoratedLabel(toolkit, expandedComposite, ""); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * Create general section
-	 */
-	protected void createGeneralSection() {
-		// create General Information section
-		generalSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		generalSection.setLayoutData(td);
-		generalSection.setText(AuthoringUIText.GENERAL_INFO_SECTION_NAME);
-		generalSection.setDescription(MessageFormat.format(
-				AuthoringUIText.GENERAL_INFO_SECTION_DESC,
-				new String[] { processType }));
-		generalSection.setLayout(new GridLayout());
-
-		generalComposite = toolkit.createComposite(generalSection);
-		generalComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		generalComposite.setLayout(new GridLayout(3, false));
-		generalSection.setClient(generalComposite);
-
-		// name
-		ctrl_name = createTextEditWithLabel(toolkit, generalComposite,
-				AuthoringUIText.NAME_TEXT);
-
-		// Presentation name
-		ctrl_presentation_name = createTextEditWithLabel(toolkit,
-				generalComposite, AuthoringUIText.PRESENTATION_NAME_TEXT);
-
-		// brief desc
-		ctrl_brief_desc = createTextEditWithLabel2(toolkit, generalComposite,
-				AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-
-		// External Id
-		ctrl_external_id = createTextEditWithLabel(toolkit, generalComposite,
-				AuthoringUIResources.Process_ExternalID); 
-
-		// Purpose
-		ctrl_purpose = createRichTextEditWithLinkForSection(
-				toolkit,
-				generalComposite,
-				AuthoringUIResources.Process_Purpose, 40, 400, GENERAL_SECTION_ID); 
-
-		// // create expanded composite
-		// expandGeneralComposite = toolkit.createComposite(generalSection);
-		// expandGeneralComposite.setLayoutData(new
-		// GridData(GridData.FILL_HORIZONTAL));
-		// expandGeneralComposite.setLayout(new GridLayout(2, false));
-		// expandGeneralComposite.setVisible(false);
-		//		
-		// // Hyperlink desc
-		// expandGeneralLink =
-		// toolkit.createImageHyperlink(expandGeneralComposite, SWT.NONE);
-		// expandGeneralLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		// expandGeneralLink.setUnderlined(false);
-		// expandGeneralLink.addHyperlinkListener(new HyperlinkAdapter()
-		// {
-		// public void linkActivated(HyperlinkEvent e)
-		// {
-		// toggle(e, GENERAL_SECTION_ID);
-		// }
-		// });
-		//		
-		// expandGeneralLabel = createLabel(toolkit, expandGeneralComposite,
-		// "");
-
-		// set focus on the name attribute
-		Display display = form.getBody().getDisplay();
-		if (!(display == null || display.isDisposed())) {
-			display.asyncExec(new Runnable() {
-				public void run() {
-					ctrl_name.setFocus();
-				}
-			});
-		}
-
-	}
-
-	/**
-	 * Create detail section
-	 *
-	 */
-	protected void createDetailSection() {
-		// create detail section
-		detailSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		detailSection.setLayoutData(td);
-		detailSection.setText(AuthoringUIText.DETAIL_SECTION_NAME);
-		detailSection.setDescription(MessageFormat.format(
-				AuthoringUIText.DETAIL_SECTION_DESC,
-				new String[] { processType }));
-		detailSection.setLayout(new GridLayout());
-
-		detailComposite = toolkit.createComposite(detailSection);
-		detailComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		detailComposite.setLayout(new GridLayout(3, false));
-		detailSection.setClient(detailComposite);
-
-		// full description
-		ctrl_full_desc = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.MAIN_DESCRIPTION_TEXT, 100,
-				400, DETAIL_SECTION_ID);
-
-		// scope
-		ctrl_scope = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIResources.Process_Scope, 40, 400, DETAIL_SECTION_ID); 
-
-		// usage notes
-		ctrl_usage_notes = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_UsageNotes, 40, 400, DETAIL_SECTION_ID); 
-
-		// alternatives
-		ctrl_alternatives = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_Alternatives, 40, 400, DETAIL_SECTION_ID); 
-
-		// how to staff
-		ctrl_how_to_staff = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_HowToStaff, 40, 400, DETAIL_SECTION_ID); 
-
-		// key consideration
-		ctrl_key_consideration = createRichTextEditWithLinkForSection(
-				toolkit,
-				detailComposite,
-				AuthoringUIResources.Process_KeyConsideration, 40, 400, DETAIL_SECTION_ID); 
-
-		// // create expanded composite
-		// expandDetailComposite = toolkit.createComposite(detailSection);
-		// expandDetailComposite.setLayoutData(new
-		// GridData(GridData.FILL_HORIZONTAL));
-		// expandDetailComposite.setLayout(new GridLayout(2, false));
-		// expandDetailComposite.setVisible(false);
-		//		
-		// // Hyperlink desc
-		// expandDetailLink =
-		// toolkit.createImageHyperlink(expandDetailComposite, SWT.NONE);
-		// expandDetailLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		// expandDetailLink.setUnderlined(false);
-		// expandDetailLink.addHyperlinkListener(new HyperlinkAdapter()
-		// {
-		// public void linkActivated(HyperlinkEvent e)
-		// {
-		// toggle(e, DETAIL_SECTION_ID);
-		// }
-		// });
-		//		
-		// expandDetailLabel = createLabel(toolkit, expandDetailComposite, "");
-
-	}
-
-	/**
-	 * Create configuration section
-	 */
-	protected void createConfigurationSection() {
-		// create Configuration section
-		configSection = toolkit.createSection(form.getBody(),
-				Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED
-						| Section.TITLE_BAR);
-		TableWrapData td1 = new TableWrapData(TableWrapData.FILL_GRAB);
-		configSection.setLayoutData(td1);
-		configSection
-				.setText(AuthoringUIResources.processDescription_configurationSectionTitle); 
-		configSection
-				.setDescription(AuthoringUIResources.processDescription_configurationSectionMessage); 
-		configSection.setLayout(new GridLayout());
-
-		configComposite = toolkit.createComposite(configSection);
-		configComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		configComposite.setLayout(new GridLayout(2, false));
-		configSection.setClient(configComposite);
-
-		Label l_element = toolkit
-				.createLabel(
-						configComposite,
-						AuthoringUIResources.processDescription_configurations); 
-		{
-			GridData gridData = new GridData(SWT.BEGINNING, SWT.END, true,
-					true, 2, 1);
-			l_element.setLayoutData(gridData);
-		}
-
-		list_configurations = UIHelper.createList(toolkit, configComposite,
-				SWT.SINGLE | SWT.BORDER);
-		{
-			GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			gridData.heightHint = 80;
-			gridData.widthHint = 200;
-			list_configurations.setLayoutData(gridData);
-		}
-		configListViewer = new ListViewer(list_configurations);
-		configListViewer.setContentProvider(contentProvider);
-		configListViewer.setLabelProvider(new LabelProvider() {
-			public org.eclipse.swt.graphics.Image getImage(Object element) {
-				if (element == process.getDefaultContext()) {
-					return AuthoringUIPlugin.getDefault().getSharedImage(
-							"icons/checked.gif"); //$NON-NLS-1$
-				}
-				return null;
-			}
-
-			public String getText(Object element) {
-				String txt = labelProvider.getText(element);
-				if (element == process.getDefaultContext()) {
-					txt = txt
-							+ " " + AuthoringUIResources.processDescription_default; //$NON-NLS-1$ 
-				}
-				return txt;
-			}
-		});
-
-		Composite buttonPanel = toolkit.createComposite(configComposite);
-		{
-			GridData gridData = new GridData(SWT.CENTER, SWT.CENTER, false,
-					false);
-			// gridData.widthHint = 80;
-			gridData.horizontalIndent = 4;
-			buttonPanel.setLayoutData(gridData);
-			buttonPanel.setLayout(new GridLayout());
-
-		}
-		// Add button
-		Button button = toolkit.createButton(buttonPanel, AuthoringUIResources.addButton_text, SWT.NONE); 
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			button.setLayoutData(gridData);
-		}
-		buttonAdd = button;
-
-		// Remove button
-		button = toolkit.createButton(buttonPanel, AuthoringUIResources.removeButton_text, SWT.NONE); 
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			button.setLayoutData(gridData);
-		}
-		buttonRemove = button;
-
-		// // Edit button
-		// button = toolkit.createButton(buttonPanel, "Edit...", SWT.NONE);
-		// {
-		// GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		// gridData.verticalIndent = DEFAULT_VERTICAL_INDENT * 6;
-		// button.setLayoutData(gridData);
-		// }
-		// buttonEdit = button;
-		//		
-		//		
-		// Make Default button
-		button = toolkit.createButton(buttonPanel, AuthoringUIResources.makeDefaultButton_text, SWT.NONE); 
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			button.setLayoutData(gridData);
-		}
-		buttonMakeDefault = button;
-
-		// configuration description
-		Label label = toolkit
-				.createLabel(
-						configComposite,
-						AuthoringUIResources.processDescription_configurationDescription); 
-		{
-			GridData gridData = new GridData(SWT.BEGINNING, SWT.END, true,
-					false, 2, 1);
-			label.setLayoutData(gridData);
-		}
-
-		textConfigDescription = toolkit.createText(configComposite, ""); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-			gridData.verticalIndent = DEFAULT_VERTICAL_INDENT;
-			gridData.heightHint = 80;
-			gridData.widthHint = 400;
-			textConfigDescription.setLayoutData(gridData);
-		}
-		textConfigDescription.setEditable(false);
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-//		if (processListener != null) {
-//			process.eAdapters().remove(processListener);
-//		}
-
-		if (configListAdapter != null) {
-			configListAdapter.dispose();
-		}
-
-		super.dispose();
-
-		if (contentProvider != null) {
-			contentProvider.dispose();
-		}
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-		
-		disposed = true;
-	}
-
-	/**
-	 * Content provider for configurations
-	 *
-	 */
-	class ConfigListItemProvider extends ItemProviderAdapter implements
-			IStructuredItemContentProvider {
-		
-		/**
-		 * Creates an instance
-		 * @param adapterFactory
-		 */
-		public ConfigListItemProvider(AdapterFactory adapterFactory) {
-			super(adapterFactory);
-			process.eAdapters().add(this);
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-		 */
-		public java.util.Collection getChildren(Object object) {
-			MethodConfiguration defaultConfig = process.getDefaultContext();
-
-			if (defaultConfig != null
-					&& !process.getValidContext().contains(defaultConfig)) {
-				process.getValidContext().add(0, defaultConfig);
-			}
-			return process.getValidContext();
-		}
-
-		/**
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(org.eclipse.emf.common.notify.Notification msg) {
-			boolean refresh = false;
-			switch (msg.getFeatureID(Process.class)) {
-			case UmaPackage.PROCESS__VALID_CONTEXT:
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					refresh = true;
-				}
-				break;
-			case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-				refresh = true;
-				break;
-			}
-			if (refresh)
-				configListViewer.refresh();
-		}
-	};
-
-	private void updateModelControls() {
-		if ((ctrl_name != null) && (!ctrl_name.isDisposed())) {
-			updateControl(ctrl_name, process.getName());
-		}
-		if ((ctrl_brief_desc != null) && (!ctrl_brief_desc.isDisposed())) {
-			updateControl(ctrl_brief_desc, process.getBriefDescription());
-		}
-		if ((ctrl_presentation_name != null)
-				&& (!ctrl_presentation_name.isDisposed())) {
-			updateControl(ctrl_presentation_name, process.getPresentationName());
-		}
-	}
-
-	/**
-	 * Updates the Text control iff the newText is different than what's there
-	 * @param text
-	 * @param newText
-	 * @return
-	 */
-	private boolean updateControl(Text text, String newText) {
-		if (!text.getText().equals(TngUtil.checkNull(newText))) {
-			text.setText(TngUtil.checkNull(newText));
-		}
-		return false;
-	}
-	
-	/**
-	 * Updates the IMethodRichText control iff the newText is different than what's there
-	 * @param text
-	 * @param newText
-	 * @return
-	 */
-	private boolean updateControl(IMethodRichText text, String newText) {
-		if (!text.getText().equals(TngUtil.checkNull(newText))) {
-			text.setText(TngUtil.checkNull(newText));
-		}
-		return false;
-	}
-
-	/**
-	 * Loads initial data from model
-	 * 
-	 */
-	public void loadData() {
-		org.eclipse.epf.uma.ProcessDescription content = (org.eclipse.epf.uma.ProcessDescription) process
-				.getPresentation();
-
-		String externalID = content.getExternalId();
-		String purpose = content.getPurpose();
-		String fullDesc = content.getMainDescription();
-		String scope = content.getScope();
-		String usageNotes = content.getUsageNotes();
-		String alternatives = content.getAlternatives();
-		String howToStaff = content.getHowtoStaff();
-		String keyConsideration = content.getKeyConsiderations();
-
-		updateModelControls();
-
-		updateControl(ctrl_external_id, externalID);
-		updateControl(ctrl_purpose, purpose);
-		updateControl(ctrl_full_desc, fullDesc);
-		updateControl(ctrl_scope, scope);
-		updateControl(ctrl_usage_notes, usageNotes);
-		updateControl(ctrl_alternatives, alternatives);
-		updateControl(ctrl_how_to_staff, howToStaff);
-		updateControl(ctrl_key_consideration, keyConsideration);
-
-		if (configListAdapter == null) {
-			configListAdapter = new ConfigListItemProvider(
-					TngAdapterFactory.INSTANCE
-							.getNavigatorView_ComposedAdapterFactory());
-		}
-
-		configListViewer.setInput(configListAdapter);
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 */
-	protected void addListeners() {
-		this.editor = ((MethodElementEditor) getEditor());
-		final IActionManager actionMgr = editor.getActionManager();
-		final org.eclipse.epf.uma.ProcessDescription content = (org.eclipse.epf.uma.ProcessDescription) process
-				.getPresentation();
-		modifyListener = editor.createModifyListener(process);
-		contentModifyListener = editor.createModifyListener(process
-				.getPresentation());
-
-		form.addControlListener(new ControlListener() {
-			public void controlResized(ControlEvent e) {
-				if (!descExpandFlag)
-					return;
-				if (ctrl_expanded != null) {
-					((GridData) ctrl_expanded.getLayoutData()).heightHint = getRichTextEditorHeight();
-					((GridData) ctrl_expanded.getLayoutData()).widthHint = getRichTextEditorWidth();
-				}
-				formSection.layout(true, true);
-			}
-
-			public void controlMoved(ControlEvent e) {
-			}
-		});
-
-		form.getParent().addListener(SWT.Activate, new Listener() {
-
-			public void handleEvent(Event event) {
-				if (TngUtil.isLocked(process)) {
-					refresh(false);
-				} else {
-					refresh(true);
-				}
-			}
-		});
-		
-		nameModifyListener = editor.createModifyListener(process.eContainer(),
-				true);
-		ctrl_name.addModifyListener(nameModifyListener);
-		ctrl_name.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				String oldContent = process.getName();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newName = ctrl_name.getText().trim();
-				if (newName.equals(process.getName())) {
-					return;
-				}
-
-				ProcessComponent procComp = (ProcessComponent) process.eContainer();
-				
-				String msg = null;
-				if (newName.indexOf('&') > -1) { //FIXME: this must go to validator code
-					msg = NLS.bind(LibraryEditResources.invalidElementNameError4_msg, newName);
-				} else {
-					IValidator validator = IValidatorFactory.INSTANCE
-					.createNameValidator(
-							procComp,
-							TngAdapterFactory.INSTANCE
-									.getNavigatorView_ComposedAdapterFactory());
-					msg = validator.isValid(newName);
-				}
-				
-				if (msg == null) {
-					String title = AuthoringUIResources.processDescriptionNameChangeConfirm_title; 
-					String message = AuthoringUIResources.processDescriptionNameChangeConfirm_message; 
-					if (AuthoringUIPlugin.getDefault().getMsgDialog()
-							.displayConfirmation(title, message)) {
-						e.doit = true;
-
-						boolean status = actionMgr.doAction(IActionManager.SET,
-								process, UmaPackage.eINSTANCE
-										.getNamedElement_Name(), ctrl_name
-										.getText(), -1);
-						if (!status) {
-							ctrl_name.setText(process.getName());
-							return;
-						}
-						actionMgr.doAction(IActionManager.SET, procComp,
-								UmaPackage.eINSTANCE.getNamedElement_Name(),
-								ctrl_name.getText(), -1);
-
-						setFormText();
-
-						// adjust plugin location and save the editor
-						//
-						BusyIndicator.showWhile(getSite().getShell()
-								.getDisplay(), new Runnable() {
-							public void run() {
-								MethodElementEditor editor = (MethodElementEditor) getEditor();
-								editor
-										.doSave(new NullProgressMonitor());
-								if(editor.isDirty()) {
-									// save failed
-									//
-									return;
-								}
-								ILibraryPersister.FailSafeMethodLibraryPersister persister = editor
-										.getPersister();
-								try {
-									persister.adjustLocation(process
-													.eResource());
-									persister.commit();
-								} catch (RuntimeException e) {
-									persister.rollback();
-									throw e;
-								}
-								// adjust diagram resource as well
-								//
-								DiagramManager mgr = DiagramManager.getInstance(process, this);
-								if(mgr != null) {
-									try {
-										mgr.updateResourceURI();
-									}
-									catch(Exception e) {
-										AuthoringUIPlugin.getDefault().getLogger().logError(e);
-									}
-									finally {
-										mgr.removeConsumer(this);
-									}
-								}
-							}
-						});
-					} else {
-						ctrl_name.setText(process.getName());
-						return;
-					}
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayError(
-									AuthoringUIResources.renameDialog_title, msg); 
-					ctrl_name.setText(process.getName());
-					e.doit = false;
-					ctrl_name.getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							ctrl_name.setFocus();
-							ctrl_name.selectAll();
-						}
-					});
-				}
-			}
-		});
-		ctrl_name.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getNamedElement_Name());
-			}
-		});
-		
-		ctrl_presentation_name.addModifyListener(modifyListener);
-		ctrl_presentation_name.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				String oldContent = process.getPresentationName();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				if ((ctrl_presentation_name.getText() != null)
-						&& (!ctrl_presentation_name.getText().equals(""))) //$NON-NLS-1$
-				{
-					e.doit = true;
-					if (!ctrl_presentation_name.getText().equals(oldContent)) {
-
-						boolean status = actionMgr
-								.doAction(
-										IActionManager.SET,
-										process,
-										UmaPackage.eINSTANCE
-												.getDescribableElement_PresentationName(),
-										ctrl_presentation_name.getText(), -1);
-						if (!status) {
-							ctrl_presentation_name.setText(oldContent);
-							return;
-						}
-//						LibraryView elementsView = LibraryView.getView();
-//						if (elementsView != null)
-//							elementsView.getViewer().refresh();
-					}
-				} else {
-					// restore the old name first, then present the error
-					// message box
-					ctrl_presentation_name.setText(process
-							.getPresentationName());
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayError(
-									AuthoringUIResources.editDialog_title, 
-									AuthoringUIResources.invalidPresentationNameError_msg); 
-					e.doit = false;
-					ctrl_presentation_name.getDisplay().asyncExec(
-							new Runnable() {
-								public void run() {
-									ctrl_presentation_name.setFocus();
-								}
-							});
-				}
-			}
-		});
-		ctrl_presentation_name.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getDescribableElement_PresentationName());
-			}
-		});
-
-		ctrl_brief_desc.addModifyListener(modifyListener);
-		ctrl_brief_desc.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = process.getBriefDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						e.widget, oldContent)) {
-					return;
-				}
-				String newContent = ctrl_brief_desc.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr.doAction(IActionManager.SET,
-							process, UmaPackage.eINSTANCE
-									.getMethodElement_BriefDescription(),
-							newContent, -1);
-					if (success) {
-						ctrl_brief_desc.setText(newContent);
-					}
-				}
-			}
-		});
-
-		ctrl_external_id.addModifyListener(contentModifyListener);
-		ctrl_external_id.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getContentDescription_ExternalId());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = content.getExternalId();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_external_id, oldContent)) {
-					return;
-				}
-				String newContent = ctrl_external_id.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr.doAction(IActionManager.SET,
-							process.getPresentation(), UmaPackage.eINSTANCE
-									.getContentDescription_ExternalId(),
-							newContent, -1);
-					if (success) {
-						ctrl_external_id.setText(newContent);
-					}
-				}
-			}
-
-		});
-
-		ctrl_purpose.setModalObject(process.getPresentation());
-		ctrl_purpose.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getActivityDescription_Purpose());
-		ctrl_purpose.addModifyListener(contentModifyListener);
-		ctrl_purpose.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_purpose;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getPurpose();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_purpose, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, process
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getActivityDescription_Purpose(), newContent, -1);
-				}
-			}
-		});
-
-		ctrl_full_desc.setModalObject(process.getPresentation());
-		ctrl_full_desc.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getContentDescription_MainDescription());
-		ctrl_full_desc.addModifyListener(contentModifyListener);
-		ctrl_full_desc.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_full_desc;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getMainDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_full_desc, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, process
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getContentDescription_MainDescription(),
-							newContent, -1);
-				}
-			}
-		});
-
-		ctrl_scope.setModalObject(process.getPresentation());
-		ctrl_scope.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getProcessDescription_Scope());
-		ctrl_scope.addModifyListener(contentModifyListener);
-		ctrl_scope.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_scope;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getScope();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_scope, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, process
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getProcessDescription_Scope(), newContent, -1);
-				}
-			}
-		});
-
-		ctrl_usage_notes.setModalObject(process.getPresentation());
-		ctrl_usage_notes.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getProcessDescription_UsageNotes());
-		ctrl_usage_notes.addModifyListener(contentModifyListener);
-		ctrl_usage_notes.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_usage_notes;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getUsageNotes();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_usage_notes, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr
-							.doAction(IActionManager.SET, process
-									.getPresentation(), UmaPackage.eINSTANCE
-									.getProcessDescription_UsageNotes(),
-									newContent, -1);
-				}
-			}
-		});
-
-		ctrl_alternatives.setModalObject(process.getPresentation());
-		ctrl_alternatives.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getActivityDescription_Alternatives());
-		ctrl_alternatives.addModifyListener(contentModifyListener);
-		ctrl_alternatives.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_alternatives;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getAlternatives();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_alternatives, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, process
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getActivityDescription_Alternatives(), newContent,
-							-1);
-				}
-			}
-		});
-
-		ctrl_how_to_staff.setModalObject(process.getPresentation());
-		ctrl_how_to_staff.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getActivityDescription_HowtoStaff());
-		ctrl_how_to_staff.addModifyListener(contentModifyListener);
-		ctrl_how_to_staff.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_how_to_staff;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getHowtoStaff();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_how_to_staff, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, process
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getActivityDescription_HowtoStaff(), newContent,
-							-1);
-				}
-			}
-		});
-
-		ctrl_key_consideration.setModalObject(process.getPresentation());
-		ctrl_key_consideration.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getContentDescription_KeyConsiderations());
-		ctrl_key_consideration.addModifyListener(contentModifyListener);
-		ctrl_key_consideration.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_key_consideration;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = content.getKeyConsiderations();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_key_consideration, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					actionMgr.doAction(IActionManager.SET, process
-							.getPresentation(), UmaPackage.eINSTANCE
-							.getContentDescription_KeyConsiderations(),
-							newContent, -1);
-				}
-			}
-		});
-
-		configListViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						IStructuredSelection selection = (IStructuredSelection) configListViewer
-								.getSelection();
-						if (selection.size() == 1) {
-							MethodConfiguration config = ((MethodConfiguration) selection
-									.getFirstElement());
-							if (config == process.getDefaultContext()) {
-								buttonRemove.setEnabled(false);
-							} else {
-								buttonRemove.setEnabled(true);
-							}
-							String desc = config.getBriefDescription();
-							if (desc == null) {
-								desc = ""; //$NON-NLS-1$
-							}
-							textConfigDescription.setText(desc);
-						}
-					}
-				});
-
-		buttonAdd.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
-				MethodLibrary lib = UmaUtil.getMethodLibrary(process);
-
-				final ConfigurationsItemProvider input = new ConfigurationsItemProvider(
-						TngAdapterFactory.INSTANCE
-								.getNavigatorView_ComposedAdapterFactory(),
-						lib, ""); //$NON-NLS-1$
-
-				ListSelectionDialog dlg = new ListSelectionDialog(
-						Display.getCurrent().getActiveShell(),
-						input,
-						contentProvider,
-						labelProvider,
-						AuthoringUIResources.ProcessDescription_selectConfiguration) { 
-					protected Control createDialogArea(Composite parent) {
-						Control control = super.createDialogArea(parent);
-						getViewer().addFilter(new ViewerFilter() {
-
-							public boolean select(Viewer viewer,
-									Object parentElement, Object element) {
-								// int count =
-								// configListViewer.getList().getItemCount();
-								// for(int i = 0; i < count; i++) {
-								// if(element ==
-								// configListViewer.getElementAt(i)) return
-								// false;
-								// }
-								// return true;
-								return !process.getValidContext().contains(
-										element);
-							}
-
-						});
-						return control;
-					}
-
-					public boolean close() {
-						input.dispose();
-						return super.close();
-					}
-				};
-				if (dlg.open() == Window.OK) {
-					Object obs[] = dlg.getResult();
-					MethodConfiguration config;
-					// get default configuration
-//					MethodConfiguration defaultConfig = process
-//							.getDefaultContext();
-					for (int i = 0; i < obs.length; i++) {
-						config = (MethodConfiguration) obs[i];
-						if (config != null) {
-//								|| checkValidityForSuperSet(defaultConfig,
-//										config)) {
-							actionMgr.doAction(IActionManager.ADD, process,
-									UmaPackage.eINSTANCE
-											.getProcess_ValidContext(), config,
-									-1);
-						} else {
-							AuthoringUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayError(
-											AuthoringUIResources.addConfigErrorDialog_title, 
-											AuthoringUIResources.bind(AuthoringUIResources.invalidConfigError_msg, config.getName())); 
-						}
-					}
-				}
-			}
-		});
-
-		buttonRemove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) configListViewer
-						.getSelection();
-				actionMgr.doAction(IActionManager.REMOVE_MANY, process,
-						UmaPackage.eINSTANCE.getProcess_ValidContext(),
-						selection.toList(), -1);
-			}
-		});
-
-		buttonMakeDefault.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) configListViewer
-						.getSelection();
-				if (selection.size() == 1) {
-					MethodConfiguration currentConfig = process
-							.getDefaultContext();
-
-					if (currentConfig != selection.getFirstElement()) {
-						boolean isValid = true;
-						List validContext = process.getValidContext();
-						for (Iterator itor = validContext.iterator(); itor
-								.hasNext();) {
-							MethodConfiguration config = (MethodConfiguration) itor
-									.next();
-							if (!(checkValidityForSuperSet(
-									(MethodConfiguration) selection
-											.getFirstElement(), config))) {
-								isValid = false;
-								break;
-							}
-						}
-						if (isValid) {
-							boolean status = actionMgr.doAction(
-									IActionManager.SET, process,
-									UmaPackage.eINSTANCE
-											.getProcess_DefaultContext(),
-									selection.getFirstElement(), -1);
-							if (!status)
-								return;
-							buttonRemove.setEnabled(false);
-						} else {
-							String selectedConfigName = ((MethodConfiguration) selection
-									.getFirstElement()).getName();
-							AuthoringUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayError(
-											AuthoringUIResources.setDefaultConfigErrorDialog_title, 
-											AuthoringUIResources.bind(AuthoringUIResources.setDefaultConfigError_msg, selectedConfigName)); 
-						}
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * Refresh all the controls
-	 * 
-	 * @param editable
-	 */
-	protected void refresh(boolean editable) {
-		if (!ctrl_name.isDisposed()) {
-			ctrl_name.setEditable(editable);
-		}
-		if (!ctrl_presentation_name.isDisposed()) {
-			ctrl_presentation_name.setEditable(editable);
-		}
-		if (!ctrl_brief_desc.isDisposed()) {
-			ctrl_brief_desc.setEditable(editable);
-		}
-		if (!ctrl_purpose.isDisposed()) {
-			ctrl_purpose.setEditable(editable);
-		}
-		if (!ctrl_full_desc.isDisposed()) {
-			ctrl_full_desc.setEditable(editable);
-		}
-		if (!ctrl_alternatives.isDisposed()) {
-			ctrl_alternatives.setEditable(editable);
-		}
-		if (!ctrl_external_id.isDisposed())
-			ctrl_external_id.setEditable(editable);
-		if (!ctrl_key_consideration.isDisposed())
-			ctrl_key_consideration.setEditable(editable);
-		if (!ctrl_how_to_staff.isDisposed())
-			ctrl_how_to_staff.setEditable(editable);
-		if (!ctrl_scope.isDisposed())
-			ctrl_scope.setEditable(editable);
-		if (!ctrl_usage_notes.isDisposed())
-			ctrl_usage_notes.setEditable(editable);
-		if (ctrl_expanded != null && !ctrl_expanded.isDisposed()) {
-			ctrl_expanded.setEditable(editable);
-		}
-		if (!buttonAdd.isDisposed())
-			buttonAdd.setEnabled(editable);
-		if (!buttonMakeDefault.isDisposed())
-			buttonMakeDefault.setEnabled(editable);
-		if (!buttonRemove.isDisposed())
-			buttonRemove.setEnabled(editable);
-	}
-
-	/**
-	 * Toggle Description control to expand and control state
-	 * 
-	 */
-	protected void toggle(HyperlinkEvent e, int id) {
-		// TODO- we should combine these methods into one. One way to do it,
-		// dispoing
-		// ctrl_expanded every time it collapses and creating it when we expand.
-		// At present, there is no method to dispose
-		toggle(e);
-		// if (id == GENERAL_SECTION_ID)
-		// {
-		// toggleGeneralSection(e);
-		// }
-		// if (id == DETAIL_SECTION_ID)
-		// {
-		// toggleDetailSection(e);
-		// }
-	}
-
-	protected void toggle(HyperlinkEvent e) {
-		if (ctrl_expanded == null) {
-			ctrl_expanded = createRichTextEditor(toolkit, expandedComposite,
-					SWT.MULTI | SWT.WRAP | SWT.V_SCROLL,
-					GridData.FILL_VERTICAL, getRichTextEditorHeight(),
-					getRichTextEditorWidth(), 2,
-					expandLabel);
-			ctrl_expanded.addModifyListener(contentModifyListener);
-		}
-
-		if (descExpandFlag) {
-			expandedComposite.setVisible(false);
-			sectionComposite.setVisible(true);
-			formSection.setClient(sectionComposite);
-			enableSections(true);
-			IMethodRichText richText = getActiveRichTextControl();
-			richText.setText(ctrl_expanded.getText());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.removeListener(listener.getEventType(), listener
-						.getListener());
-			}
-			if (ctrl_expanded.getModified()) {
-				((MethodElementEditor) getEditor())
-						.saveModifiedRichText(ctrl_expanded);
-			}
-			editor.setFocus();
-		} else {
-			sectionComposite.setVisible(false);
-			expandedComposite.setVisible(true);
-			formSection.setClient(expandedComposite);
-			enableSections(false);
-			expandLabel.setText((String) ((ImageHyperlink) e.getSource())
-					.getData("Title")); //$NON-NLS-1$
-			IMethodRichText richText = (IMethodRichText) e.getHref();
-			ctrl_expanded.setInitialText(richText.getText());
-			ctrl_expanded.setModalObject(richText.getModalObject());
-			ctrl_expanded.setModalObjectFeature(richText
-					.getModalObjectFeature());
-			ctrl_expanded.setFindReplaceAction(richText.getFindReplaceAction());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.addListener(listener.getEventType(), listener
-						.getListener());
-			}
-			boolean editable = !TngUtil.isLocked(process);
-			ctrl_expanded.setEditable(editable);
-			if (editable) {
-				ctrl_expanded.setFocus();
-			}
-			setActiveRichTextControl(richText);
-		}
-		form.getBody().layout(true, true);
-		descExpandFlag = !descExpandFlag;
-	}
-
-	/**
-	 * Checks whether default configuration is superset of selected
-	 * configuration or not
-	 * 
-	 * @param config
-	 * @return
-	 */
-	private boolean checkValidityForSuperSet(MethodConfiguration defaultConfig,
-			MethodConfiguration config) {
-		// get default plugins and packages
-		List defaultPlugins = defaultConfig.getMethodPluginSelection();
-		List defaultPackages = defaultConfig.getMethodPackageSelection();
-
-		// get confiugration plugins and pacakges
-		List packages = config.getMethodPackageSelection();
-		List plugins = config.getMethodPluginSelection();
-		boolean pluginContains = false;
-		boolean packageContains = false;
-		if ((plugins != null) ) {
-			pluginContains = defaultPlugins.containsAll(plugins);
-		}
-		if ((packages != null) ) {
-			packageContains = defaultPackages.containsAll(packages);
-		}
-
-		return (pluginContains) && (packageContains);
-	}
-
-	/**
-	 * Set active rich text control
-	 * 
-	 * @param ctrl
-	 */
-	private void setActiveRichTextControl(IMethodRichText ctrl) {
-		activeControl = ctrl;
-	}
-
-	/**
-	 * Get Active Rich text control
-	 * 
-	 * @return
-	 * 		Rich text control
-	 */
-	private IMethodRichText getActiveRichTextControl() {
-		return activeControl;
-	}
-
-	protected void enableSections(boolean enable) {
-		generalSection.setVisible(enable);
-		if (enable) {
-			generalSection.setExpanded(generalSectionExpandFlag);
-		} else {
-			generalSectionExpandFlag = generalSection.isExpanded();
-			generalSection.setExpanded(enable);
-		}
-
-		detailSection.setVisible(enable);
-		if (enable) {
-			detailSection.setExpanded(detailSectionExpandFlag);
-		} else {
-			detailSectionExpandFlag = detailSection.isExpanded();
-			detailSection.setExpanded(enable);
-		}
-		configSection.setVisible(enable);
-		if (enable) {
-			configSection.setExpanded(configSectionExpandFlag);
-		} else {
-			configSectionExpandFlag = configSection.isExpanded();
-			configSection.setExpanded(enable);
-		}
-	}
-
-	/**
-	 * Set name for the form
-	 */
-	public void setFormText() {
-
-		form.setText(LibraryUIText.getUIText(process)
-				+ ": " + methodElement.getName()); //$NON-NLS-1$
-	}
-
-	/**
-	 * Refresh form name
-	 * @param newName
-	 */
-	public void refreshElementName(final String newName) {
-		if (newName != null) {
-			if ((ctrl_name != null) && !(ctrl_name.isDisposed())) {
-				Runnable runnable = new Runnable() {
-
-					public void run() {
-						ctrl_name.removeModifyListener(nameModifyListener);
-						ctrl_name.setText(newName);
-						ctrl_name.addModifyListener(nameModifyListener);
-						setFormText();
-					}
-					
-				};
-				if (ctrl_name.getDisplay().getThread() == Thread.currentThread()) {
-					runnable.run();
-				} else {
-					ctrl_name.getDisplay().syncExec(runnable);
-				}
-
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessFormPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessFormPage.java
deleted file mode 100644
index 2ead5b2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessFormPage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The base class for all Process form pages.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessFormPage extends BaseFormPage {
-
-	protected Process process;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param editor
-	 *            The parent form editor.
-	 * @param id
-	 *            The unique ID for the form page.
-	 * @param title
-	 *            The title for the form page.
-	 */
-	public ProcessFormPage(FormEditor editor, String id, String title) {
-		super(editor, id, title);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.BaseFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-
-		// Get the Process object from the editor input.
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-
-		Object obj = methodElementInput.getMethodElement();
-		if (obj instanceof ProcessComponent) {
-			process = ((ProcessComponent) obj).getProcess();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessFormUtil.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessFormUtil.java
deleted file mode 100644
index 500d1c2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessFormUtil.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * Helper class for the Process editor form pages.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ProcessFormUtil {
-
-	/**
-	 * Converts string representation into column descriptors list
-	 * @param str
-	 * @return
-	 * 		List of column descriptors
-	 */
-	public static EList toColumnDescriptorList(String str) {
-		EList columnDescriptors = new BasicEList();
-		StringTokenizer tokens = new StringTokenizer(str, ","); //$NON-NLS-1$
-		while (tokens.hasMoreTokens()) {
-			String token = tokens.nextToken();
-			Object columnDescriptor = ProcessEditor.idToColumnDescriptorMap
-					.get(token);
-			if (columnDescriptor != null) {
-				columnDescriptors.add(columnDescriptor);
-			}
-		}
-		return columnDescriptors;
-	}
-
-	/**
-	 * Converts string representation into column descriptors array list
-	 * @param str
-	 * @return
-	 * 		Array ist of column descriptors
-	 */
-	public static ColumnDescriptor[] toColumnDescriptors(String str) {
-		List list = toColumnDescriptorList(str);
-		ColumnDescriptor[] columns = new ColumnDescriptor[list.size()];
-		list.toArray(columns);
-		return columns;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleCategoriesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleCategoriesPage.java
deleted file mode 100644
index c805702..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleCategoriesPage.java
+++ /dev/null
@@ -1,231 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.authoring.ui.filters.CustomCategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.util.LibraryManager;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Categories page in the Role editor.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleCategoriesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "roleCategoriesPage"; //$NON-NLS-1$
-
-	private Role role;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleCategoriesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.CATEGORIES_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		role = (Role) contentElement;
-		setAllowChange1(true);
-		setAllowChange2(true);
-		setUseCategory3(false);
-		setCategoryIsSingleSelection1(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getRoleSets((Role) object).toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				RoleSet roleSet = (RoleSet) it.next();
-				// TODO: Test on-the-fly creation of category contributor
-				LibraryManager.getInstance().addToRoleSet(getActionManager(),
-						roleSet, role, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				RoleSet roleSet = (RoleSet) it.next();
-				// TODO: Test on-the-fly creation of category contributor
-				LibraryManager.getInstance().removeFromRoleSet(
-						getActionManager(), roleSet, role, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getCustomCategories((Role) object)
-						.toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2()
-	 */
-	protected void addItemsToModel2(ArrayList addItems) {
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				CustomCategory customCategory = (CustomCategory) it.next();
-				LibraryManager.getInstance().addToCustomCategory(
-						getActionManager(), customCategory, role, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2()
-	 */
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				CustomCategory customCategory = (CustomCategory) it.next();
-				LibraryManager.getInstance().removeFromCustomCategory(
-						getActionManager(), customCategory, role, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return role;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ROLESETS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString2()
-	 */
-	protected String getTabString2() {
-		return FilterConstants.CUSTOM_CATEGORIES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof RoleSet);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter2()
-	 */
-	protected IFilter getFilter2() {
-		return filter = new CustomCategoryFilter();
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.roleCategoriesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.roleCategoriesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.roleCategoriesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.roleCategoriesPage_selectedLabel2;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return null;
-	}
-	
-	protected String getMultipleSelectDescriptionString() {
-		return AuthoringUIResources.roleCategoriesPage_multipleSelectDescription;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleDescriptionPage.java
deleted file mode 100644
index 7a95455..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleDescriptionPage.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-
-/**
- * The Description page for the Role editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "roleDescriptionPage"; //$NON-NLS-1$
-
-	private static final String BASE_ROLE = AuthoringUIText.BASE_ELEMENT_TEXT;
-
-	private IMethodRichText ctrl_skills;
-
-	private IMethodRichText ctrl_assign;
-
-	private IMethodRichText ctrl_synonyms;
-
-	private Role role;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		role = (Role) contentElement;
-		notationSectionOn = true;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#createEditorContent(FormToolkit)
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		super.createEditorContent(toolkit);
-		label_base.setText(BASE_ROLE);
-	}
-
-	/**
-	 * Creates the Staffing section.
-	 */
-	protected void createNotationSectionContent() {
-		super.createNotationSectionContent();
-		notationSection.setText(AuthoringUIText.STAFFING_SECTION_NAME);
-		notationSection.setDescription(AuthoringUIText.STAFFING_SECTION_DESC);
-		ctrl_skills = createRichTextEditWithLinkForSection(toolkit,
-				notationComposite, AuthoringUIText.SKILLS_TEXT, 40, 400,
-				NOTATION_SECTION_ID);
-		ctrl_assign = createRichTextEditWithLinkForSection(toolkit,
-				notationComposite, AuthoringUIText.ASSIGNMENT_APPROACHES_TEXT,
-				40, 400, NOTATION_SECTION_ID);
-		ctrl_synonyms = createRichTextEditWithLinkForSection(toolkit,
-				notationComposite, AuthoringUIText.SYNONYMS_TEXT, 40, 400,
-				NOTATION_SECTION_ID);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-		ctrl_skills.setModalObject(contentElement.getPresentation());
-		ctrl_skills.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getRoleDescription_Skills());
-		ctrl_skills.addModifyListener(contentModifyListener);
-		ctrl_skills.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_skills;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.RoleDescription) role
-						.getPresentation()).getSkills();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE.getRoleDescription_Skills(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_assign.setModalObject(contentElement.getPresentation());
-		ctrl_assign.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getRoleDescription_AssignmentApproaches());
-		ctrl_assign.addModifyListener(contentModifyListener);
-		ctrl_assign.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_assign;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.RoleDescription) role
-						.getPresentation()).getAssignmentApproaches();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getRoleDescription_AssignmentApproaches(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_synonyms.setModalObject(contentElement.getPresentation());
-		ctrl_synonyms.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getRoleDescription_Synonyms());
-		ctrl_synonyms.addModifyListener(contentModifyListener);
-		ctrl_synonyms.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_synonyms;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.RoleDescription) role
-						.getPresentation()).getSynonyms();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE.getRoleDescription_Synonyms(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#refresh(boolean)
-	 */
-	protected void refresh(boolean editable) {
-		super.refresh(editable);
-		ctrl_skills.setEditable(editable);
-		ctrl_assign.setEditable(editable);
-		ctrl_synonyms.setEditable(editable);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadData()
-	 */
-	protected void loadData() {
-		super.loadData();
-
-		String skills = ((org.eclipse.epf.uma.RoleDescription) role.getPresentation())
-				.getSkills();
-		String assign = ((org.eclipse.epf.uma.RoleDescription) role.getPresentation())
-				.getAssignmentApproaches();
-		String synonyms = ((org.eclipse.epf.uma.RoleDescription) role.getPresentation())
-				.getSynonyms();
-
-		ctrl_skills.setText(skills == null ? "" : skills); //$NON-NLS-1$
-		ctrl_assign.setText(assign == null ? "" : assign); //$NON-NLS-1$
-		ctrl_synonyms.setText(synonyms == null ? "" : synonyms); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return role;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ROLES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new ContentFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Role);
-			}
-		};
-
-		// Set additional filter for variability base element checking.
-		((ContentFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						role) });
-		return filter;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.role_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.role_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.role_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.role_versionInfoSection_desc;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleGuidancePage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleGuidancePage.java
deleted file mode 100644
index 621744c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleGuidancePage.java
+++ /dev/null
@@ -1,247 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.GuidanceFilter;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Guidance page in the Role editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleGuidancePage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "roleGuidancePage"; //$NON-NLS-1$
-
-	private Role role;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleGuidancePage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.GUIDANCE_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		role = (Role) contentElement;
-		setAllowChange1(true);
-		setAllowChange2(true);
-		setUseCategory2(false);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return UIHelper.getSelectedGuidances(role);
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// Guidance for the content element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									role,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									(Checklist) item, -1);
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							role,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-				} else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							role,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-				} else if (item instanceof Practice) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							(Practice) item,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(), role, -1);
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							role,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									role,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							role,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to add guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"to " + role.getType().getName() //$NON-NLS-1$
-											+ ":" + role.getName()); //$NON-NLS-1$ 
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// Guidance for the method element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									role,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									(Checklist) item, -1);
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							role,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-				} else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							role,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-				} else if (item instanceof Practice) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							(Practice) item,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(), role, -1);
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							role,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									role,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							role,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to remove guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"from " + role.getType().getName() //$NON-NLS-1$
-											+ ":" + role.getName()); //$NON-NLS-1$ 
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return role;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.GUIDANCE;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new GuidanceFilter();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetDescriptionPage.java
deleted file mode 100644
index 6b255e6..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetDescriptionPage.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Domain editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class RoleSetDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "roleSetDescriptionPage"; //$NON-NLS-1$
-
-	private RoleSet roleSet;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		roleSet = (RoleSet) contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return roleSet;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof RoleSet);
-			}
-		};
-
-		// set additional filter for variability base element checking
-		((CategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						roleSet) });
-		return filter;
-	}
-
-	protected String getTabString() {
-		return FilterConstants.ROLESETS;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.roleset_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.roleset_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.roleset_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.roleset_versionInfoSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetGroupingDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetGroupingDescriptionPage.java
deleted file mode 100644
index 649dd7d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetGroupingDescriptionPage.java
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Domain editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class RoleSetGroupingDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "roleSetGroupingDescriptionPage"; //$NON-NLS-1$
-
-	private RoleSetGrouping roleSetGrouping;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetGroupingDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		roleSetGrouping = (RoleSetGrouping) contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return roleSetGrouping;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ROLESETS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof RoleSetGrouping);
-			}
-		};
-
-		// set additional filter for variability base element checking
-		((CategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						roleSetGrouping) });
-		return filter;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.rolesetgrouping_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.rolesetgrouping_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.rolesetgrouping_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.rolesetgrouping_versionInfoSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetGroupingRoleSets.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetGroupingRoleSets.java
deleted file mode 100644
index 3b2f284..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetGroupingRoleSets.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Role Sets page in the Role Set Grouping editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- * 
- * TODO: Rename this class to RoleSetGroupingRoleSetsPage and move it to the
- * om.ibm.rmc.authoring.ui.util.forms package
- */
-public class RoleSetGroupingRoleSets extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "roleSetGroupingRoleSetsPage"; //$NON-NLS-1$
-
-	private RoleSetGrouping roleSetGrouping;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetGroupingRoleSets(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.ROLE_SETS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		roleSetGrouping = (RoleSetGrouping) contentElement;
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setAllowChange1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((RoleSetGrouping) object).getRoleSets().toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			editor.getActionManager().doAction(IActionManager.ADD_MANY,
-					roleSetGrouping,
-					UmaPackage.eINSTANCE.getRoleSetGrouping_RoleSets(),
-					addItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			editor.getActionManager().doAction(IActionManager.REMOVE_MANY,
-					roleSetGrouping,
-					UmaPackage.eINSTANCE.getRoleSetGrouping_RoleSets(),
-					rmItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return roleSetGrouping;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ROLESETS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof RoleSet);
-			}
-		};
-	}
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.roleSetGroupingRoleSetsPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.roleSetGroupingRoleSetsPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.roleSetGroupingRoleSetsPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.roleSetGroupingRoleSetsPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.roleSetGroupingRoleSetsPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.roleSetGroupingRoleSetsPage_selectedLabel;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetRolesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetRolesPage.java
deleted file mode 100644
index f2d9e47..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleSetRolesPage.java
+++ /dev/null
@@ -1,206 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Roles page in the Role Set editor.
- * 
- * @author Lokanath Jagga
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleSetRolesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "roleSetRolesPage"; //$NON-NLS-1$
-
-	private RoleSet roleSet;
-	
-	private ContentElementOrderList allSteps;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetRolesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.ROLES_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		roleSet = (RoleSet) contentElement;
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setIsUpAndDownButtonsRequired1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				//return ((RoleSet) object).getRoles().toArray();
-				if (allSteps == null) {
-					allSteps = new ContentElementOrderList(
-							contentElement,
-							ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_ONLY,
-							getContentCategoryOrderFeature());
-				}
-				List returnList = CategorySortHelper.sortCategoryElements(contentElement, 
-						allSteps.toArray());
-				return returnList.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			editor.getActionManager().doAction(IActionManager.ADD_MANY,
-					roleSet, UmaPackage.eINSTANCE.getRoleSet_Roles(), addItems,
-					-1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			editor.getActionManager().doAction(IActionManager.REMOVE_MANY,
-					roleSet, UmaPackage.eINSTANCE.getRoleSet_Roles(), rmItems,
-					-1);
-		}
-	}
-		
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return roleSet;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ROLES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new ContentFilter() {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof ContentElement) {
-					if (getHelper().isContributor((ContentElement) obj))
-						return false;
-				}
-				return (obj instanceof Role);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.roleSetRolesPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.roleSetRolesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.roleSetRolesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.roleSetRolesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.roleSetRolesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.roleSetRolesPage_selectedLabel;
-	}
-	
-	@Override
-	protected EStructuralFeature getContentCategoryOrderFeature() {
-		return UmaPackage.eINSTANCE.getRoleSet_Roles();
-	}
-
-	@Override
-	protected String[] getModelStructurePath() {
-		return ModelStructure.DEFAULT.roleSetPath;
-	}
-	
-	@Override
-	protected ContentElementOrderList getContentElementOrderList() {
-		return allSteps;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleTasksPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleTasksPage.java
deleted file mode 100644
index c724006..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleTasksPage.java
+++ /dev/null
@@ -1,217 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Tasks page in the Role editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleTasksPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "roleTasksPage"; //$NON-NLS-1$
-
-	private Role role;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleTasksPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.TASKS_PAGE_TITLE); 
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		role = (Role) contentElement;
-		setUseCategory3(false);
-		setAllowChange1(false);
-		setAllowChange2(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getPrimaryTasks((Role) object)
-						.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			List elementList = retrieveTableViewerContents(viewer_selected2);
-			for (java.util.Iterator it = addItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				if (!elementList.contains(task)) {
-					editor.getActionManager().doAction(IActionManager.SET,
-							task, UmaPackage.eINSTANCE.getTask_PerformedBy(),
-							role, -1);
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (java.util.Iterator it = rmItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				task.setPerformedBy(null);
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getSecondaryTasks((Role) object)
-						.toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2(ArrayList)
-	 */
-	protected void addItemsToModel2(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			List elementList = retrieveTableViewerContents(viewer_selected);
-			for (java.util.Iterator it = addItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				if (!elementList.contains(task)) {
-					task.getAdditionallyPerformedBy().add(role);
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2(ArrayList)
-	 */
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (java.util.Iterator it = rmItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				task.getAdditionallyPerformedBy().remove(role);
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return role;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.TASKS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new ContentFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Task);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.roleTasksPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.roleTasksPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.roleTasksPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.roleTasksPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.roleTasksPage_selectedLabel2;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleWorkProductsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleWorkProductsPage.java
deleted file mode 100644
index c1210bc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/RoleWorkProductsPage.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.WorkProductFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Work Products page in the Role editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleWorkProductsPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "roleWorkProductsPage"; //$NON-NLS-1$
-
-	private Role role;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleWorkProductsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.WORK_PRODUCTS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		role = (Role) contentElement;
-		setUseCategory3(false);
-		setAllowChange1(true);
-		setAllowChange2(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-		ctrl_add2.setVisible(false);
-		ctrl_remove2.setVisible(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((Role) object).getResponsibleFor().toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if(!addItems.isEmpty()) {
-			getActionManager().doAction(IActionManager.ADD_MANY, role, UmaPackage.eINSTANCE.getRole_ResponsibleFor(), addItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-//			for (int i = 0; i < rmItems.size(); i++) {
-//				LibraryManager.getInstance().setResponsibleRole(
-//						getActionManager(), (WorkProduct) rmItems.get(i), null);
-//			}
-			
-			getActionManager().doAction(IActionManager.REMOVE_MANY, role, UmaPackage.eINSTANCE.getRole_ResponsibleFor(), rmItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getModifiedWorkProducts((Role) object)
-						.toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return role;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.WORKPRODUCTS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new WorkProductFilter();
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.roleWorkProductsPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.roleWorkProductsPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.roleWorkProductsPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.roleWorkProductsPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.roleWorkProductsPage_selectedLabel2;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskCategoriesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskCategoriesPage.java
deleted file mode 100644
index ef4a4be..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskCategoriesPage.java
+++ /dev/null
@@ -1,246 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.authoring.ui.filters.CustomCategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryManager;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Categories page in the Task editor.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class TaskCategoriesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "taskCategoriesPage"; //$NON-NLS-1$
-
-	private Task task;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TaskCategoriesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.CATEGORIES_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		task = (Task) contentElement;
-//		setCategoryIsSingleSelection1(true);
-		setAllowChange1(true);
-		setAllowChange2(true);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getDisciplines((Task) object).toArray();				
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for(Iterator iterator = addItems.iterator(); iterator.hasNext();){
-				Object discipline = iterator.next();
-				if(discipline instanceof Discipline){
-//					List disciplines = AssociationHelper.getDisciplines(task);
-//					if (disciplines != null && disciplines.size() > 0)	{
-//						Object associatedDiscipline = disciplines.get(0);
-//						String msg = MessageFormat
-//						.format(
-//								LibraryEditResources.UserInteractionHelper_errRelationshipExists,
-//								new Object[] {
-//										task.getName(),
-//										TngUtil
-//												.getLabelWithPath(associatedDiscipline),
-//										((Discipline) discipline).getName() });
-//						Messenger.INSTANCE.showWarning(
-//								LibraryEditResources.errorDialog_title, msg);
-//						return;
-//					}
-
-					
-					LibraryManager.getInstance().addToDiscipline(getActionManager(),
-						(Discipline) discipline, task, usedCategories);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Discipline discipline = (Discipline) it.next();
-				LibraryManager.getInstance().removeFromDiscipline(
-						getActionManager(), discipline, task, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getCustomCategories((Task) object)
-						.toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2()
-	 */
-	protected void addItemsToModel2(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				CustomCategory customCategory = (CustomCategory) it.next();
-				LibraryManager.getInstance().addToCustomCategory(
-						getActionManager(), customCategory, task, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2()
-	 */
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				CustomCategory customCategory = (CustomCategory) it.next();
-				LibraryManager.getInstance().removeFromCustomCategory(
-						getActionManager(), customCategory, task, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return task;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.DISCIPLINES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString2()
-	 */
-	protected String getTabString2() {
-		return FilterConstants.CUSTOM_CATEGORIES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Discipline);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter2() {
-		return filter2 = new CustomCategoryFilter();
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.taskCategoriesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.taskCategoriesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.taskCategoriesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.taskCategoriesPage_selectedLabel2;
-	}
-	
-	protected String getMultipleSelectDescriptionString() {
-		return AuthoringUIResources.taskCategoriesPage_multipleSelectDescription;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskDescriptionPage.java
deleted file mode 100644
index 34f5a63..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskDescriptionPage.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-
-/**
- * The Description page for the Task editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class TaskDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "taskDescriptionPage"; //$NON-NLS-1$		
-
-	private static final String BASE_TASK = AuthoringUIText.BASE_ELEMENT_TEXT;
-
-	private IMethodRichText ctrl_alternatives;
-
-	private Task task;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TaskDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		task = (Task) contentElement;
-		purposeOn = true;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#createEditorContent(FormToolkit)
-	 */
-	protected void createEditorContent(FormToolkit toolkit) {
-		super.createEditorContent(toolkit);
-		ctrl_alternatives = createRichTextEditWithLinkForSection(toolkit,
-				detailComposite, AuthoringUIText.ALTERNATIVES_TEXT, 40, 400,
-				DETAIL_SECTION_ID);
-		label_base.setText(BASE_TASK);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadData()
-	 */
-	protected void loadData() {
-		super.loadData();
-		String purpose = ((org.eclipse.epf.uma.TaskDescription) task.getPresentation())
-				.getPurpose();
-		String alternatives = ((org.eclipse.epf.uma.TaskDescription) task
-				.getPresentation()).getAlternatives();
-		ctrl_purpose.setText(purpose == null ? "" : purpose); //$NON-NLS-1$	
-		ctrl_alternatives.setText(alternatives == null ? "" : alternatives); //$NON-NLS-1$	
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-
-		ctrl_purpose.setModalObject(contentElement.getPresentation());
-		ctrl_purpose.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getTaskDescription_Purpose());
-		ctrl_purpose.addModifyListener(contentModifyListener);
-		ctrl_purpose.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_purpose;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.TaskDescription) task
-						.getPresentation()).getPurpose();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE.getTaskDescription_Purpose(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_alternatives.setModalObject(contentElement.getPresentation());
-		ctrl_alternatives.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getTaskDescription_Alternatives());
-		ctrl_alternatives.addModifyListener(contentModifyListener);
-		ctrl_alternatives.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_alternatives;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.TaskDescription) task
-						.getPresentation()).getAlternatives();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = editor.getActionManager().doAction(
-							IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getTaskDescription_Alternatives(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#refresh(boolean)
-	 */
-	protected void refresh(boolean editable) {
-		super.refresh(editable);
-		ctrl_alternatives.setEditable(editable);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return task;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.TASKS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new ContentFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Task);
-			}
-		};
-
-		// Set additional filter for variability base element checking.
-		((ContentFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						task) });
-		return filter;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.task_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.task_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.task_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.task_versionInfoSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskGuidancePage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskGuidancePage.java
deleted file mode 100644
index 6b8454a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskGuidancePage.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.GuidanceFilter;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Guidance page in the Task editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class TaskGuidancePage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "taskGuidancePage"; //$NON-NLS-1$
-
-	private Task task;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TaskGuidancePage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.GUIDANCE_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		task = (Task) contentElement;
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setAllowChange1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return UIHelper.getSelectedGuidances(task);
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// Guidances for content element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									task,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									(Checklist) item, -1);
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							task,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-				} 
-				else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							task,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-				} else if (item instanceof Practice) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							(Practice) item,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(), task, -1);
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.ADD,
-							task,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.ADD,
-									task,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-				} else if (item instanceof ToolMentor) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							task, UmaPackage.eINSTANCE.getTask_ToolMentors(),
-							(ToolMentor) item, -1);
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.ADD,
-							task,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-				} 
-				else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to add guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"to " + task.getType().getName() //$NON-NLS-1$
-											+ ":" + task.getName()); //$NON-NLS-1$ 
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// Guidance for the method element.
-				if (item instanceof Checklist) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									task,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									(Checklist) item, -1);
-				} else if (item instanceof Concept) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							task,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							(Concept) item, -1);
-				} else if (item instanceof Example) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							task,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							(Example) item, -1);
-				} else if (item instanceof Practice) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							(Practice) item,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(), task, -1);
-				} else if (item instanceof SupportingMaterial) {
-					editor.getActionManager().doAction(
-							IActionManager.REMOVE,
-							task,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							(SupportingMaterial) item, -1);
-				} else if (item instanceof Guideline) {
-					editor.getActionManager()
-							.doAction(
-									IActionManager.REMOVE,
-									task,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									(Guideline) item, -1);
-				} else if (item instanceof ToolMentor) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							task, UmaPackage.eINSTANCE.getTask_ToolMentors(),
-							item, -1);
-				} else if (item instanceof ReusableAsset) {
-					editor.getActionManager().doAction(IActionManager.REMOVE,
-							task,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							(ReusableAsset) item, -1);
-				} 
-//				else if (item instanceof Estimate) {
-//					editor.getActionManager().doAction(IActionManager.SET,
-//							task, UmaPackage.eINSTANCE.getTask_Estimate(),
-//							null, -1);
-//				} 
-				else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to remove guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"from " + task.getType().getName() //$NON-NLS-1$
-											+ ":" + task.getName()); //$NON-NLS-1$ 
-				}
-			}
-			setDirty(true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return task;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.GUIDANCE;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new GuidanceFilter() {
-			protected boolean childAccept(Object obj) {
-				if (super.childAccept(obj))
-					return true;
-				return (obj instanceof ToolMentor);
-			}
-		};
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskRolesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskRolesPage.java
deleted file mode 100644
index 13749e1..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskRolesPage.java
+++ /dev/null
@@ -1,296 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Roles page in the Task editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class TaskRolesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "taskRolesPage"; //$NON-NLS-1$
-
-	private Task task;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TaskRolesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.ROLES_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		task = (Task) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setCategoryIsSingleSelection1(true);
-		setUseCategory3(false);
-		setAllowChange1(true);
-		setAllowChange2(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List list = new ArrayList();
-				Role role = ((Task) object).getPerformedBy();
-				if (role != null)
-					list.add(role);
-				return list.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			// Below line is needed to disallowed primary performer as a additional performer.
-			List elementList = retrieveTableViewerContents(viewer_selected2);
-			// Below line is needed to warn before changing primary performer.
-			List elementList1 = retrieveTableViewerContents(viewer_selected);
-			boolean ok = true;
-			if(!elementList1.isEmpty()){
-				String newPrimaryPerfomer = ((Role)addItems.get(0)).getName();
-				String message = AuthoringUIResources.bind(AuthoringUIResources.taskRolesPage_primaryPerformer_modify_message, (new String[]{newPrimaryPerfomer})); 
-				String warning = AuthoringUIResources.taskRolesPage_confirm_title;
-				ok = AuthoringUIPlugin.getDefault().getMsgDialog()
-				.displayConfirmation(warning, message);
-			}
-			if (!elementList.contains(((Role) addItems.get(0))) && ok) {
-				actionMgr.doAction(IActionManager.SET, task,
-						UmaPackage.eINSTANCE.getTask_PerformedBy(),
-						(Role) addItems.get(0), -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.SET, task, UmaPackage.eINSTANCE
-					.getTask_PerformedBy(), null, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((Task) object).getAdditionallyPerformedBy().toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2(ArrayList)
-	 */
-	protected void addItemsToModel2(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			List elementList = retrieveTableViewerContents(viewer_selected);
-			List addItemsFiltered = new ArrayList();
-			for (int i = 0; i < addItems.size(); i++) {
-				if (!elementList.contains(((Role) addItems.get(i)))) {
-					addItemsFiltered.add(addItems.get(i));
-				}
-			}
-			if (addItems.size() > 0) {
-				actionMgr.doAction(IActionManager.ADD_MANY, task,
-						UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy(),
-						addItemsFiltered, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2(ArrayList)
-	 */
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.REMOVE_MANY, task,
-					UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy(),
-					rmItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return task;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.ROLES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter =	new ContentFilter (){
-			protected boolean childAccept(Object obj) {
-				if(task.getAdditionallyPerformedBy() != null){
-					List list = task.getAdditionallyPerformedBy();
-					for(Iterator it = list.iterator(); it.hasNext();){
-						Object next = it.next();
-						if(next instanceof Role){
-							if(obj == next) return false;
-							if(!checkContribution((VariabilityElement)next, obj))
-								return false;
-						}
-					}
-				}
-				return (obj instanceof Role);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter2()
-	 */
-	protected IFilter getFilter2() {
-		return filter = new ContentFilter (){
-			protected boolean childAccept(Object obj) {
-				if(task.getPerformedBy() != null){
-					Role role = task.getPerformedBy();
-					if(obj == role) return false;
-					if(!checkContribution(role, obj))
-						return false;
-				}
-				return (obj instanceof Role);
-			}
-		};
-	}
-
-	/**
-	 * Role filter
-	 *
-	 */
-	public class RoleFilter extends ContentFilter {
-		protected boolean childAccept(Object obj) {
-			if(task.getPerformedBy() != null){
-				Role role = task.getPerformedBy();
-				if(obj == role) return false;
-				if(!checkContribution(role, obj))
-					return false;
-			}
-			return (obj instanceof Role);
-		}
-	};
-
-	/**
-	 * Check contribution
-	 * @param contributor
-	 * @param obj
-	 */
-	public boolean checkContribution(VariabilityElement contributor, Object obj){
-		if(TngUtil.isContributor(contributor) && obj instanceof Role){
-			VariabilityElement e = contributor.getVariabilityBasedOnElement();
-			if(e != null){
-				if(e.equals(obj)) return false;
-				if(TngUtil.isContributor(e))
-					return checkContribution(e, obj);
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.taskRolesPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.taskRolesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.taskRolesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.taskRolesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.taskRolesPage_selectedLabel2;
-	}
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskStepsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskStepsPage.java
deleted file mode 100644
index 7c8e4c4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskStepsPage.java
+++ /dev/null
@@ -1,720 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.dialogs.SectionsOrderDialog;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor.ModifyListener;
-import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.authoring.ui.util.EditorsContextHelper;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.AddToSectionListCommand;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInSectionListCommand;
-import org.eclipse.epf.library.edit.command.RemoveFromSectionList;
-import org.eclipse.epf.library.edit.util.SectionList;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.richtext.RichTextListener;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * The Steps page in the Task editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class TaskStepsPage extends BaseFormPage {
-
-	private static final String FORM_PAGE_ID = "taskStepsPage"; //$NON-NLS-1$
-
-	private Text ctrl_name;
-
-	private Button ctrl_add, ctrl_delete, ctrl_up, ctrl_down, ctrl_ordering;
-
-	private Table ctrl_steps;
-
-	private TableViewer stepsTableViewer;
-
-	private SectionList allSteps;
-
-	protected IMethodRichText activeControl;
-
-	protected boolean descExpandFlag = false;
-
-	protected IMethodRichTextEditor ctrl_expanded;
-
-	protected ImageHyperlink expandLink;
-
-	protected Label expandLabel;
-
-	protected Section formSection;
-
-	protected Section generalSection;
-
-	protected Composite sectionComposite;
-	
-	protected Composite generalComposite;
-
-	protected Composite expandedComposite;
-
-	protected IMethodRichText ctrl_maindesc;
-
-	private IStructuredContentProvider stepsViewerContentProvider;
-
-	private ILabelProvider stepsViewerLabelProvider;
-
-	private Task task;
-
-	private org.eclipse.epf.uma.Section currentStep;
-
-	private ModifyListener contentModifyListener;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TaskStepsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.STEPS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.BaseFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		MethodElementEditorInput methodElementInput = (MethodElementEditorInput) input;
-		task = (Task) methodElementInput.getMethodElement();
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm
-	 *      managedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-
-		form.setText(LibraryUIText.getUIText(task) + ": " + task.getName()); //$NON-NLS-1$
-
-		formSection = toolkit.createSection(form.getBody(), Section.NO_TITLE);
-		{
-			TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-			formSection.setLayoutData(td);
-			formSection.setLayout(new TableWrapLayout());
-		}
-		// Create the composite for the sections.
-		sectionComposite = toolkit.createComposite(formSection, SWT.NONE);
-		sectionComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		sectionComposite.setLayout(new TableWrapLayout());
-		formSection.setClient(sectionComposite);
-
-		// Create the General Information section.
-		generalSection = toolkit.createSection(sectionComposite,
-				Section.TITLE_BAR | Section.DESCRIPTION | Section.TWISTIE
-						| Section.EXPANDED);
-		generalSection
-				.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		generalSection.setText(AuthoringUIText.STEPS_SECTION_NAME);
-		generalSection.setDescription(AuthoringUIText.STEPS_SECTION_DESC);
-		generalSection.setLayout(new GridLayout());
-
-		generalComposite = toolkit.createComposite(generalSection);
-		generalComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		generalComposite.setLayout(new GridLayout(4, false));
-		generalSection.setClient(generalComposite);
-
-		EditorsContextHelper.setHelp(generalComposite.getParent(), task);
-
-		Composite pane1 = toolkit.createComposite(generalComposite);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.verticalSpan = 1;
-			gridData.horizontalSpan = 3;
-			pane1.setLayoutData(gridData);
-			pane1.setLayout(new GridLayout());
-		}
-
-		Label l_name = toolkit.createLabel(pane1, AuthoringUIText.STEPS_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 3;
-			l_name.setLayoutData(gridData);
-		}
-
-		ctrl_steps = toolkit.createTable(pane1, SWT.MULTI);
-		{
-			GridData gridData = new GridData(GridData.FILL_BOTH);
-			gridData.horizontalSpan = 3;
-			gridData.heightHint = 150;
-			ctrl_steps.setLayoutData(gridData);
-		}
-
-		initProviders();
-
-		stepsTableViewer = new TableViewer(ctrl_steps);
-		stepsTableViewer.setContentProvider(stepsViewerContentProvider);
-		stepsTableViewer.setLabelProvider(stepsViewerLabelProvider);
-
-		Composite pane2 = toolkit.createComposite(generalComposite);
-		pane2.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER
-				| GridData.HORIZONTAL_ALIGN_CENTER));
-		pane2.setLayout(new GridLayout());
-
-		ctrl_add = toolkit.createButton(pane2, AuthoringUIText.ADD_BUTTON_TEXT,
-				SWT.NONE);
-		ctrl_add.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		ctrl_delete = toolkit.createButton(pane2,
-				AuthoringUIText.DELETE_BUTTON_TEXT, SWT.NONE);
-		ctrl_delete.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		ctrl_delete.setEnabled(false);
-
-		ctrl_up = toolkit.createButton(pane2, AuthoringUIText.UP_BUTTON_TEXT,
-				SWT.NONE);
-		ctrl_up.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		ctrl_up.setEnabled(false);
-
-		ctrl_down = toolkit.createButton(pane2,
-				AuthoringUIText.DOWN_BUTTON_TEXT, SWT.NONE);
-		ctrl_down.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		ctrl_down.setEnabled(false);
-
-		ctrl_ordering = toolkit.createButton(pane2,
-				AuthoringUIText.ORDER_BUTTON_TEXT, SWT.NONE);
-		ctrl_ordering.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// name
-		Label nameLabel = toolkit.createLabel(generalComposite,
-				AuthoringUIText.STEP_NAME_TEXT);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 4;
-			nameLabel.setLayoutData(gridData);
-		}
-		ctrl_name = toolkit.createText(generalComposite, "", SWT.SINGLE); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-			gridData.horizontalSpan = 4;
-			ctrl_name.setLayoutData(gridData);
-		}
-
-		createBlankLabel(toolkit, generalComposite, 4);
-
-		ctrl_maindesc = createRichTextEditWithLink(
-				toolkit, generalComposite, AuthoringUIText.DESCRIPTION_TEXT,
-				250, 300, 4);
-
-		createRichTextEditorSection();
-
-		toolkit.paintBordersFor(pane1);
-		toolkit.paintBordersFor(pane2);
-		toolkit.paintBordersFor(generalComposite);
-		toolkit.paintBordersFor(expandedComposite);
-
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-
-		addListeners();
-		loadData();
-		enableControls();
-	}
-
-	/**
-	 * Add listeners to monitor focus and modification changes in the edit
-	 * controls.
-	 */
-	public void addListeners() {
-		final MethodElementEditor editor = (MethodElementEditor) getEditor();
-		contentModifyListener = editor.createModifyListener(currentStep);
-		ctrl_name.addModifyListener(contentModifyListener);
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setDisable(true);
-
-		form.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event e) {
-//				IStatus status = TngUtil.checkEdit((EObject) task, getSite()
-//						.getShell());
-//				if (status.isOK()) {
-//					loadData();
-//				}
-				if (form != null && !form.isDisposed()) {
-					UIHelper.setFormText(form, contentElement);
-				}
-				loadData();
-				if (TngUtil.isLocked(contentElement)) {
-					enableControls(false);
-				} else {
-					ctrl_add.setEnabled(true);
-					checkSelection();
-				}
-			}
-		});
-
-		form.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				deactivate();
-			}
-		});
-
-		form.addControlListener(new ControlListener() {
-			public void controlResized(ControlEvent e) {
-				if (ctrl_expanded != null) {
-					((GridData) ctrl_expanded.getLayoutData()).heightHint = getRichTextEditorHeight();
-					((GridData) ctrl_expanded.getLayoutData()).widthHint = getRichTextEditorWidth();
-				}
-				formSection.layout(true, true);
-			}
-
-			public void controlMoved(ControlEvent e) {
-			}
-		});
-
-		ctrl_name.addModifyListener(contentModifyListener);
-		ctrl_name.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				if (currentStep != null) {
-					String oldContent = currentStep.getName();
-					String newContent = ctrl_name.getText();
-					if (ctrl_name.getText() == null
-							|| ctrl_name.getText().length() == 0) {
-						String title = AuthoringUIResources.bind(AuthoringUIResources.renameDialog_title, LibraryUIText.TEXT_STEP); 
-						String msg = AuthoringUIResources.bind(AuthoringUIResources.emptyElementNameError_msg, StrUtil.toLower(LibraryUIText.TEXT_STEP)); 
-						AuthoringUIPlugin.getDefault().getMsgDialog()
-								.displayError(title, msg);
-						ctrl_name.setSelection(0, oldContent.length());
-					} else if (!newContent.equals(oldContent)) {
-						actionMgr.doAction(IActionManager.SET, currentStep,
-								UmaPackage.eINSTANCE.getNamedElement_Name(),
-								newContent, -1);
-					}
-				}
-			}
-		});
-
-		ctrl_maindesc.addModifyListener(contentModifyListener);
-		ctrl_maindesc.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				saveMainDescription();
-			}
-		});
-
-		stepsTableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						checkSelection();
-					}
-				});
-
-		ctrl_add.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				org.eclipse.epf.uma.Section child = UmaFactory.eINSTANCE
-						.createSection();
-				String newName = MessageFormat.format(
-						AuthoringUIText.NEW_ELEMENT_TEXT,
-						new String[] { LibraryUIText.TEXT_STEP });
-				child.setName(newName);
-				AddToSectionListCommand cmd = new AddToSectionListCommand(task,
-						child, allSteps);
-				getActionManager().execute(cmd);
-				stepsTableViewer.refresh();
-				stepsTableViewer.setSelection(new StructuredSelection(child));
-				ctrl_name.setFocus();
-				ctrl_name.setSelection(0, newName.length());
-			}
-		});
-
-		ctrl_delete.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-						.getSelection();
-				for (Iterator iter = selection.toList().iterator(); iter
-						.hasNext();) {
-					Object o = iter.next();
-					if (o instanceof org.eclipse.epf.uma.Section) {
-						RemoveFromSectionList cmd = new RemoveFromSectionList(
-								task, (org.eclipse.epf.uma.Section) o, allSteps);
-						getActionManager().execute(cmd);
-					}
-				}
-				stepsTableViewer.refresh();
-				editStep(null);
-			}
-		});
-
-		ctrl_up.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-						.getSelection();
-
-				ArrayList moveUpItems = new ArrayList();
-				moveUpItems.addAll(selection.toList());
-				MoveInSectionListCommand cmd = new MoveInSectionListCommand(
-						task, moveUpItems, allSteps, 1);
-				getActionManager().execute(cmd);
-
-				stepsTableViewer.refresh();
-
-				if (stepsTableViewer.getTable().getSelectionIndex() > 0
-						&& !TngUtil.isLocked(task)) {
-					ctrl_up.setEnabled(true);
-				} else {
-					ctrl_up.setEnabled(false);
-				}
-				if (stepsTableViewer.getTable().getSelectionIndex() < stepsTableViewer
-						.getTable().getItemCount() - 1
-						&& !TngUtil.isLocked(task)) {
-					ctrl_down.setEnabled(true);
-				} else {
-					ctrl_down.setEnabled(false);
-				}
-			}
-		});
-
-		ctrl_down.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-						.getSelection();
-				ArrayList moveDownItems = new ArrayList();
-				moveDownItems.addAll(selection.toList());
-				MoveInSectionListCommand cmd = new MoveInSectionListCommand(
-						task, moveDownItems, allSteps, 0);
-				getActionManager().execute(cmd);
-
-				stepsTableViewer.refresh();
-
-				if (stepsTableViewer.getTable().getSelectionIndex() > 0
-						&& !TngUtil.isLocked(task)) {
-					ctrl_up.setEnabled(true);
-				} else {
-					ctrl_up.setEnabled(false);
-				}
-				if (stepsTableViewer.getTable().getSelectionIndex() < stepsTableViewer
-						.getTable().getItemCount() - 1
-						&& !TngUtil.isLocked(task)) {
-					ctrl_down.setEnabled(true);
-				} else {
-					ctrl_down.setEnabled(false);
-				}
-			}
-		});
-
-		ctrl_ordering.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				SectionsOrderDialog dlg = new SectionsOrderDialog(
-						Display.getCurrent().getActiveShell(),
-						task,
-						getActionManager(),
-						AuthoringUIResources.StepsOrderDialog_title, 
-						AuthoringUIResources.StepsOrderDialog_description, 
-						AuthoringUIResources.steps_text); 
-				dlg.open();
-			}
-		});
-	}
-
-	protected void enableControls(boolean editable) {
-		ctrl_name.setEditable(editable);
-		ctrl_maindesc.setEditable(editable);
-		ctrl_add.setEnabled(editable);
-		ctrl_delete.setEnabled(editable);
-		ctrl_up.setEnabled(editable);
-		ctrl_down.setEnabled(editable);
-		ctrl_ordering.setEnabled(true);
-		if (ctrl_expanded != null) {
-			ctrl_expanded.setEditable(editable);
-		}
-	}
-
-	protected void deactivate() {
-		// Save the step order.
-		if (allSteps != null) {
-			allSteps.apply();
-		}
-	}
-
-	/**
-	 * Initializes the controls with data from the model.
-	 */
-	private void loadData() {
-		allSteps = null;
-		stepsTableViewer.setInput(task);
-		stepsTableViewer.refresh();
-		editStep(currentStep);
-	}
-
-	/**
-	 * Edit current step.
-	 */
-	private void editStep(org.eclipse.epf.uma.Section step) {
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setDisable(true);
-
-		if (ctrl_maindesc.getModified()) {
-			saveMainDescription();
-		}
-
-		currentStep = step;
-		String name = ""; //$NON-NLS-1$
-		String desc = ""; //$NON-NLS-1$
-		if (currentStep != null) {
-			name = currentStep.getName();
-			desc = currentStep.getSectionDescription();
-			ctrl_name.setFocus();
-		}
-		ctrl_name.setText(name == null ? "" : name); //$NON-NLS-1$
-		ctrl_maindesc.setText(desc == null ? "" : desc); //$NON-NLS-1$
-		ctrl_maindesc.setModalObject(currentStep);
-		ctrl_maindesc.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getSection_SectionDescription());
-		if (step == null) {
-			// close any Find/Replace dialog open in the RTE
-			ctrl_maindesc.getFindReplaceAction().dispose();
-		}
-
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setElement(currentStep);
-		((MethodElementEditor.ModifyListener) contentModifyListener)
-				.setDisable(currentStep == null);
-
-		enableControls();
-	}
-
-	/**
-	 * Enable name and description controls
-	 */
-	private void enableControls() {
-		if (task.getPresentation().getSections().contains(currentStep)) {
-			if (!TngUtil.isLocked(contentElement)) {
-				ctrl_name.setEditable(true);
-				ctrl_maindesc.setEditable(true);
-			}
-		} else {
-			ctrl_name.setEditable(false);
-			ctrl_maindesc.setEditable(false);
-		}
-	}
-
-	/**
-	 * Dispose listener
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#dispose()
-	 */
-	public void dispose() {
-	}
-
-	private void createRichTextEditorSection() {
-		expandedComposite = toolkit.createComposite(formSection, SWT.NONE);
-		expandedComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		expandedComposite.setLayout(new GridLayout(2, false));
-		expandedComposite.setVisible(false);
-
-
-		// Hyperlink desc
-		expandLink = toolkit.createImageHyperlink(expandedComposite, SWT.NONE);
-		expandLink.setImage(AuthoringUIImages.IMG_EXPANDED);
-		expandLink.setToolTipText(AuthoringUIResources.closeRTE); 
-		expandLink.setUnderlined(false);
-		expandLink.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e);
-			}
-		});
-
-		expandLabel = createDecoratedLabel(toolkit, expandedComposite, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Toggle Description control to expand and control state.
-	 */
-	protected void toggle(HyperlinkEvent e) {
-		if (currentStep == null)
-			return;
-		if (ctrl_expanded == null) {
-			ctrl_expanded = createRichTextEditor(toolkit, expandedComposite,
-					SWT.MULTI | SWT.WRAP | SWT.V_SCROLL, GridData.FILL_BOTH,
-					getRichTextEditorHeight(), getRichTextEditorWidth(), 2, expandLabel);
-			ctrl_expanded.addModifyListener(contentModifyListener);
-		}
-
-		if (descExpandFlag) {
-			sectionComposite.setVisible(true);
-			expandedComposite.setVisible(false);
-			formSection.setClient(sectionComposite);
-			IMethodRichText richText = activeControl;
-			richText.setText(ctrl_expanded.getText());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.removeListener(listener.getEventType(), listener
-						.getListener());
-			}
-			if (ctrl_expanded.getModified()) {
-				((MethodElementEditor) getEditor())
-						.saveModifiedRichText(ctrl_expanded);
-			}
-			richText.setFocus();
-		} else {
-			sectionComposite.setVisible(false);
-			expandedComposite.setVisible(true);
-			formSection.setClient(expandedComposite);
-			expandLabel.setText(currentStep.getName() +
-					" - " + (String) ((ImageHyperlink) e.getSource()).getData("Title")); //$NON-NLS-1$ //$NON-NLS-2$
-			IMethodRichText richText = (IMethodRichText) e.getHref();
-			ctrl_expanded.setInitialText(richText.getText());
-			ctrl_expanded.setModalObject(richText.getModalObject());
-			ctrl_expanded.setModalObjectFeature(richText
-					.getModalObjectFeature());
-			ctrl_expanded.setFindReplaceAction(richText.getFindReplaceAction());
-			for (Iterator i = richText.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_expanded.addListener(listener.getEventType(), listener
-						.getListener());
-			}
-			boolean editable = !TngUtil.isLocked(contentElement);
-			ctrl_expanded.setEditable(editable);
-			if (editable) {
-				ctrl_expanded.setFocus();
-			}
-			activeControl = richText;
-		}
-
-		form.getBody().layout(true, true);
-		descExpandFlag = !descExpandFlag;
-	}
-
-	private void initProviders() {
-		stepsViewerContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				if (allSteps == null) {
-					allSteps = new SectionList(task,
-							SectionList.STEPS_FOR_ELEMENT_ONLY);
-				}
-				return allSteps.toArray();
-			}
-		};
-
-		stepsViewerLabelProvider = new VariabilityElementLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public boolean isExternal(Object element) {
-				return !task.getPresentation().getSections().contains(element);
-			}
-		};
-	}
-
-	private void saveMainDescription() {
-		if (currentStep != null) {
-			IMethodRichText control = descExpandFlag ? ctrl_expanded
-					: ctrl_maindesc;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = currentStep.getSectionDescription();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(control,
-					oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, currentStep,
-						UmaPackage.eINSTANCE.getSection_SectionDescription(),
-						newContent, -1);
-			}
-		}
-	}
-
-	protected IActionManager getActionManager() {
-		FormEditor editor = getEditor();
-		if (editor instanceof MethodElementEditor) {
-			return ((MethodElementEditor) editor).getActionManager();
-		}
-		return null;
-	}
-
-	private void checkSelection() {
-		IStructuredSelection selection = (IStructuredSelection) stepsTableViewer
-				.getSelection();
-		if (selection.size() > 0 && !TngUtil.isLocked(task)) {
-			ctrl_delete.setEnabled(true);
-
-			if (stepsTableViewer.getTable().getSelectionIndex() > 0
-					&& !TngUtil.isLocked(task) && selection.size() == 1) {
-				ctrl_up.setEnabled(true);
-			} else {
-				ctrl_up.setEnabled(false);
-			}
-
-			if (stepsTableViewer.getTable().getSelectionIndex() < stepsTableViewer
-					.getTable().getItemCount() - 1
-					&& !TngUtil.isLocked(task) && selection.size() == 1) {
-				ctrl_down.setEnabled(true);
-			} else {
-				ctrl_down.setEnabled(false);
-			}
-		}
-		if (selection.size() == 1) {
-			editStep((org.eclipse.epf.uma.Section) selection.getFirstElement());
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskWorkProductsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskWorkProductsPage.java
deleted file mode 100644
index 99ed5c4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskWorkProductsPage.java
+++ /dev/null
@@ -1,266 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.WorkProductFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Work Products page in the Task editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class TaskWorkProductsPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "taskWorkProductsPage"; //$NON-NLS-1$	
-
-	private Task task;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TaskWorkProductsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.WORK_PRODUCTS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		task = (Task) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setAllowChange1(true);
-		setAllowChange2(true);
-		setAllowChange3(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.forms.editor.createFormContent(IManagedForm)
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((Task) object).getMandatoryInput().toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			List elementList = retrieveTableViewerContents(viewer_selected2);
-			List addItemsFiltered = new ArrayList();
-			for (int i = 0; i < addItems.size(); i++) {
-				if (!elementList.contains(((WorkProduct) addItems.get(i)))) {
-					addItemsFiltered.add(addItems.get(i));
-				}
-			}
-			if (addItems.size() > 0) {
-				actionMgr.doAction(IActionManager.ADD_MANY, task,
-						UmaPackage.eINSTANCE.getTask_MandatoryInput(),
-						addItemsFiltered, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.REMOVE_MANY, task,
-					UmaPackage.eINSTANCE.getTask_MandatoryInput(), rmItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((Task) object).getOptionalInput().toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2(ArrayList)
-	 */
-	protected void addItemsToModel2(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			List elementList = retrieveTableViewerContents(viewer_selected);
-			List addItemsFiltered = new ArrayList();
-			for (int i = 0; i < addItems.size(); i++) {
-				if (!elementList.contains(((WorkProduct) addItems.get(i)))) {
-					addItemsFiltered.add(addItems.get(i));
-				}
-			}
-			if (addItems.size() > 0) {
-				actionMgr.doAction(IActionManager.ADD_MANY, task,
-						UmaPackage.eINSTANCE.getTask_OptionalInput(),
-						addItemsFiltered, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2(ArrayList)
-	 */
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.REMOVE_MANY, task,
-					UmaPackage.eINSTANCE.getTask_OptionalInput(), rmItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected3()
-	 */
-	protected void initContentProviderSelected3() {
-		contentProviderSelected3 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((Task) object).getOutput().toArray();
-			}
-		};
-		viewer_selected3.setContentProvider(contentProviderSelected3);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2(ArrayList)
-	 */
-	protected void addItemsToModel3(ArrayList addItems) {
-		actionMgr.doAction(IActionManager.ADD_MANY, task, UmaPackage.eINSTANCE
-				.getTask_Output(), addItems, -1);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2(ArrayList)
-	 */
-	protected void removeItemsFromModel3(ArrayList rmItems) {
-		actionMgr.doAction(IActionManager.REMOVE_MANY, task,
-				UmaPackage.eINSTANCE.getTask_Output(), rmItems, -1);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return task;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.WORKPRODUCTS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new WorkProductFilter();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter2()
-	 */
-	protected IFilter getFilter2() {
-		return filter = new WorkProductFilter();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter3()
-	 */
-	protected IFilter getFilter3() {
-		return filter = new WorkProductFilter();
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.taskWorkProductsPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.taskWorkProductsPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.taskWorkProductsPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.taskWorkProductsPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.taskWorkProductsPage_selectedLabel2;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.taskWorkProductsPage_selectedLabel3;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ToolDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ToolDescriptionPage.java
deleted file mode 100644
index b88db07..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ToolDescriptionPage.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Domain editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ToolDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "toolDescriptionPage"; //$NON-NLS-1$	
-
-	private Tool tool;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ToolDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		tool = (Tool) contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return tool;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Tool);
-			}
-		};
-
-		// set additional filter for variability base element checking
-		((CategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						tool) });
-		return filter;
-
-	}
-
-	protected String getTabString() {
-		return FilterConstants.TOOLS;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.tool_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.tool_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.tool_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.tool_versionInfoSection_desc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ToolToolMentorsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ToolToolMentorsPage.java
deleted file mode 100644
index 2856572..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ToolToolMentorsPage.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.GuidanceFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Tool Mentors page in the Tool editor.
- * 
- * @author Lokanath Jagga
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ToolToolMentorsPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "toolToolMentorsPage"; //$NON-NLS-1$
-
-	private Tool tool;
-
-	private IActionManager actionMgr;
-	
-	private ContentElementOrderList allSteps;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ToolToolMentorsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.TOOL_MENTORS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		tool = (Tool) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setIsUpAndDownButtonsRequired1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				//return tool.getToolMentors().toArray();
-				if (allSteps == null) {
-					allSteps = new ContentElementOrderList(
-							contentElement,
-							ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_ONLY,
-							getContentCategoryOrderFeature());
-				}
-				List returnList = CategorySortHelper.sortCategoryElements(
-						contentElement, allSteps.toArray());
-				return returnList.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			// check if this operation will modify the element in opposite feature value
-			for (Iterator iter = addItems.iterator(); iter.hasNext();) {
-				MethodElement element = (MethodElement) iter.next();
-				if (!UserInteractionHelper.checkModifyOpposite(tool,
-						UmaPackage.eINSTANCE.getTool_ToolMentors(), element)) {
-					return;
-				}
-			}
-			actionMgr.doAction(IActionManager.ADD_MANY, tool,
-					UmaPackage.eINSTANCE.getTool_ToolMentors(), addItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.REMOVE_MANY, tool,
-					UmaPackage.eINSTANCE.getTool_ToolMentors(), rmItems, -1);
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return tool;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.TOOL_MENTORS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new GuidanceFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof ToolMentor);
-			}
-		};
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.toolToolMentorsPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.toolToolMentorsPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.toolToolMentorsPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.toolToolMentorsPage_selectedLabel;
-	}
-	
-	@Override
-	protected EStructuralFeature getContentCategoryOrderFeature() {
-		return UmaPackage.eINSTANCE.getTool_ToolMentors();
-	}
-
-	@Override
-	protected String[] getModelStructurePath() {
-		return ModelStructure.DEFAULT.toolPath;
-	}
-	
-	@Override
-	protected ContentElementOrderList getContentElementOrderList() {
-		return allSteps;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductCategoriesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductCategoriesPage.java
deleted file mode 100644
index 40888d3..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductCategoriesPage.java
+++ /dev/null
@@ -1,309 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.authoring.ui.filters.CustomCategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryManager;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Categories page in the Work Product editor.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- * remove the to-one UI restriction on wp-domian (R395390) 2007-08-30
- */
-public class WorkProductCategoriesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductCategoriesPage"; //$NON-NLS-1$
-
-	private WorkProduct workProduct;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductCategoriesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.CATEGORIES_PAGE_TITLE);
-	}
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProduct = (WorkProduct) contentElement;
-		setUseCategory3(true);
-		setCategoryIsSingleSelection1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getDomains((WorkProduct) object).toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			Object domain = addItems.get(0);
-			List domains = AssociationHelper.getDomains(workProduct);
-			if (domains != null && domains.size() > 0)	{
-				Object associatedDomain = domains.get(0);
-//				String msg = MessageFormat
-//				.format(
-//						LibraryEditResources.UserInteractionHelper_errRelationshipExists,
-//						new Object[] {
-//								workProduct.getName(),
-//								TngUtil
-//										.getLabelWithPath(associatedDomain),
-//								((Domain) domain).getName() });
-//				Messenger.INSTANCE.showWarning(
-//						LibraryEditResources.errorDialog_title, msg);
-//				return;
-			}
-			
-			LibraryManager.getInstance().addToDomain(getActionManager(),
-					(Domain) domain, workProduct, usedCategories);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Domain domain = (Domain) it.next();
-				LibraryManager.getInstance().removeFromDomain(
-						getActionManager(), domain, workProduct, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getWorkProductTypes(
-						(WorkProduct) object).toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2()
-	 */
-	protected void addItemsToModel2(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (java.util.Iterator it = addItems.iterator(); it.hasNext();) {
-				WorkProductType wpType = (WorkProductType) it.next();
-				LibraryManager.getInstance().addToWorkProductType(
-						getActionManager(), wpType, workProduct, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2()
-	 */
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				WorkProductType wpType = (WorkProductType) it.next();
-				LibraryManager.getInstance().removeFromWorkProductType(
-						getActionManager(), wpType, workProduct, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected3()
-	 */
-	protected void initContentProviderSelected3() {
-		contentProviderSelected3 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getCustomCategories(
-						(WorkProduct) object).toArray();
-			}
-		};
-		viewer_selected3.setContentProvider(contentProviderSelected3);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel3(ArrayList)
-	 */
-	protected void addItemsToModel3(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (java.util.Iterator it = addItems.iterator(); it.hasNext();) {
-				CustomCategory customCategory = (CustomCategory) it.next();
-				LibraryManager.getInstance().addToCustomCategory(
-						getActionManager(), customCategory, workProduct, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel3(ArrayList)
-	 */
-	protected void removeItemsFromModel3(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (java.util.Iterator it = rmItems.iterator(); it.hasNext();) {
-				CustomCategory customCategory = (CustomCategory) it.next();
-				LibraryManager.getInstance().removeFromCustomCategory(
-						getActionManager(), customCategory, workProduct, usedCategories);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return workProduct;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.DOMAINS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString2()
-	 */
-	protected String getTabString2() {
-		return FilterConstants.WORKPRODUCTTYPES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString3()
-	 */
-	protected String getTabString3() {
-		return FilterConstants.CUSTOM_CATEGORIES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof Domain);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter2()
-	 */
-	protected IFilter getFilter2() {
-		return filter2 = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof WorkProductType);
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter3()
-	 */
-	protected IFilter getFilter3() {
-		return filter3 = new CustomCategoryFilter();
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.workProductCategoriesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.workProductCategoriesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.workProductCategoriesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.workProductCategoriesPage_selectedLabel2;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.workProductCategoriesPage_selectedLabel3;
-	}
-	
-	protected String getMultipleSelectDescriptionString() {
-		return AuthoringUIResources.workProductCategoriesPage_multipleSelectDescription;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductDeliverablePartsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductDeliverablePartsPage.java
deleted file mode 100644
index 78eed6d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductDeliverablePartsPage.java
+++ /dev/null
@@ -1,336 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.WorkProductFilter;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Deliverable Parts page in the Work Product editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductDeliverablePartsPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductDeliverablePartsPage"; //$NON-NLS-1$
-
-	private WorkProduct workProduct;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductDeliverablePartsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID,
-				AuthoringUIText.DELIVERABLE_PARTS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProduct = (WorkProduct) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setUseCategory2(false);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				Deliverable wp = (Deliverable) workProduct;
-				return wp.getDeliveredWorkProducts().toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				WorkProduct item = (WorkProduct) it.next();
-				actionMgr.doAction(IActionManager.ADD, workProduct,
-						UmaPackage.eINSTANCE
-								.getDeliverable_DeliveredWorkProducts(), item,
-						-1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				WorkProduct item = (WorkProduct) it.next();
-				actionMgr.doAction(IActionManager.REMOVE, workProduct,
-						UmaPackage.eINSTANCE
-								.getDeliverable_DeliveredWorkProducts(), item,
-						-1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return workProduct;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.WORKPRODUCTS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new WorkProductFilter() {
-			/*
-			 * ArrayList(badlist) is used to store all
-			 * generalizer/basevariability for subparts of
-			 * generalizer/basevariability can be rejected. Deliverable cannot
-			 * hold information to who itself is acting as deliverable part.
-			 */
-			List badlist = new ArrayList();
-
-			protected boolean childAccept(Object obj) {
-				// TODO Auto-generated method stub
-				if (obj instanceof WorkProduct) {
-					/* 
-					 * Check Deliverable and DeliverableParts association
-					 * circular dependency.
-					*/
-					if (obj instanceof Deliverable
-							&& workProduct instanceof Deliverable) {
-						/*
-						 * Check passed object's chained deliverable parts
-						 * (tree) contain workProduct (editor object).
-						 */
-						if (!UIHelper.checkCircularDeliverables(
-								(Deliverable) obj, (Deliverable) workProduct)) {
-							badlist.add(obj);
-							return false;
-						}
-						if (!checkVariability((Deliverable) obj, badlist)) {
-							badlist.add(obj);
-							return false;
-						}
-						// browse through badlist and its deliverable parts.
-						List templist = new ArrayList();
-						for (Iterator iterator = badlist.iterator(); iterator
-								.hasNext();) {
-							Object bad = iterator.next();
-							UIHelper.deliverablePartsChain((Deliverable) bad, templist);
-						}
-						if (templist.contains(obj))
-							return false;
-					}
-					/*
-					 * return true if above condition are successful
-					 */
-					return true;
-				}
-				return false;
-			}
-		};
-		return filter;
-	}
-
-	public boolean checkVariability(Deliverable e, List badlist) {
-
-		/*
-		 * Check editor object's variability base object is child in
-		 * Deliverable(e) tree. then Deliverable(e)shouldnot be accepted. D1 ->
-		 * D2 -> D3 ( -> indicates deliverable part relationship) D6 contributes
-		 * D3. D6 cannot select D1,D2 as deliverable part.
-		 */
-		if (workProduct.getVariabilityBasedOnElement() != null) {
-			Object obj = workProduct.getVariabilityBasedOnElement();
-			if (!UIHelper.checkCircularDeliverables(e, (Deliverable) obj))
-				return false;
-		}
-
-		/*
-		 * Check editor Deliverable's generalizer, if generalizer's subparts
-		 * (tree) contains passed deliverable. Return false.
-		 */
-
-		Iterator it = TngUtil.getGeneralizers(workProduct);
-		while (it.hasNext()) {
-			VariabilityElement ve = (VariabilityElement) it.next();
-			if (ve != null) {
-				/*
-				 * generalizer is added to badlist, because if variability base
-				 * is filtered before coming to childAccept(object) method, this
-				 * will prevents any subparts of generalizer to be added as a
-				 * deliverable part of Deliverable (Editor object or local
-				 * defined variable"workProduct").
-				 * 
-				 * eg: D1 -> D2 -> D3. (-> indicates deliverable part). D1
-				 * contributes D5. and D5's deliverable parts assign filter
-				 * shouldnot show D2 and D3.
-				 * 
-				 */
-				badlist.add(ve);
-				if (ve.equals(e))
-					return false;
-				if (!UIHelper.checkCircularDeliverables(e, (Deliverable) ve))
-					return false;
-			}
-
-		}
-		/*
-		 * 
-		 */
-		if (e.getVariabilityBasedOnElement() != null) {
-			Object obj = e.getVariabilityBasedOnElement();
-			if (!UIHelper.checkCircularDeliverables((Deliverable) obj,
-					(Deliverable) workProduct))
-				return false;
-		}
-		/*
-		 * Check passed object's generalizer's deliverable parts list donot have
-		 * workProduct.
-		 */
-		Iterator it1 = TngUtil.getGeneralizers(e);
-		while (it1.hasNext()) {
-			VariabilityElement ve = (VariabilityElement) it1.next();
-			if (ve != null) {
-				if (ve.equals(e))
-					return false;
-				if (!UIHelper.checkCircularDeliverables((Deliverable) ve,
-						(Deliverable) workProduct))
-					return false;
-			}
-
-		}
-
-		/*
-		 * Check workProduct object (editor object)'s variability and its
-		 * deliverables should not contain passed object.
-		 */
-		List list = new ArrayList();
-		deliverablePartsVariability((Deliverable) workProduct, list);
-		if (list.contains(e))
-			return false;
-
-		/*
-		 * Check passed object variability and its deliverables should not
-		 * contain workproduct(deliverable or editor object). If it contains,
-		 * passed object shouldnot be accepted.
-		 */
-		deliverablePartsVariability((Deliverable) e, list);
-		if (list.contains(workProduct))
-			return false;
-		return true;
-	}
-
-	private void deliverablePartsVariability(Deliverable e, List roots) {
-		List list = ((Deliverable) e).getDeliveredWorkProducts();
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				Object obj = iterator.next();
-				if (obj instanceof Deliverable) {
-					if (((Deliverable) obj).getVariabilityBasedOnElement() != null) {
-						roots.add(((Deliverable) obj)
-								.getVariabilityBasedOnElement());
-					} else {
-						Iterator it1 = TngUtil.getGeneralizers(e);
-						while (it1.hasNext()) {
-							VariabilityElement ve = (VariabilityElement) it1
-									.next();
-							UIHelper.deliverablePartsChain((Deliverable) ve, roots);
-						}
-					}
-					deliverablePartsVariability((Deliverable) obj, roots);
-				}
-			}
-		}
-		if (e instanceof Deliverable) {
-			Iterator it1 = TngUtil.getGeneralizers(e);
-			while (it1.hasNext()) {
-				VariabilityElement ve = (VariabilityElement) it1.next();
-				UIHelper.deliverablePartsChain((Deliverable) ve, roots);
-			}
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.workProductDeliverablePartsPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.workProductDeliverablePartsPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.workProductDeliverablePartsPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.workProductDeliverablePartsPage_selectedLabel;
-	}
-	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductDescriptionPage.java
deleted file mode 100644
index ece6e9a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductDescriptionPage.java
+++ /dev/null
@@ -1,685 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.ContentFilter;
-import org.eclipse.epf.authoring.ui.filters.WorkProductFilter;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ArtifactDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DeliverableDescription;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page in a Work Product (Artifact, Deliverable and Outcome)
- * editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductDescriptionPage"; //$NON-NLS-1$	
-
-	private IMethodRichText ctrl_impact;
-
-	private IMethodRichText ctrl_reason;
-
-	// For Artifact
-	private IMethodRichText ctrl_brief_outline;
-
-	private IMethodRichText ctrl_representation_options;
-
-	// For Deliverable
-	private IMethodRichText ctrl_external_desc, ctrl_packaging_guidance;
-	
-	private IMethodRichText ctrl_representation;
-	
-	private IMethodRichText ctrl_notation;
-
-	private WorkProduct workProduct;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProduct = (WorkProduct) contentElement;
-		purposeOn = true;
-		externalIdOn = true;
-		if (!(contentElement instanceof Outcome)) {
-			notationSectionOn = true;
-		}
-		tailoringSectionOn = true;
-		iconSectionOn = true;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#createNotationSectionContent()
-	 */
-	protected void createNotationSectionContent() {
-		super.createNotationSectionContent();
-		
-		
-		
-		if (workProduct instanceof Artifact) {
-			ctrl_brief_outline = createRichTextEditWithLinkForSection(toolkit,
-					notationComposite, AuthoringUIText.BRIEF_OUTLINE_TEXT, 40,
-					400, NOTATION_SECTION_ID);
-			ctrl_representation = createRichTextEditWithLinkForSection(toolkit,
-					notationComposite,
-					AuthoringUIText.REPRESENTATION_TEXT, 40, 400,
-					NOTATION_SECTION_ID);
-			ctrl_notation = createRichTextEditWithLinkForSection(toolkit,
-					notationComposite,
-					AuthoringUIText.NOTATION_TEXT, 40, 400,
-					NOTATION_SECTION_ID);
-		} else if (workProduct instanceof Deliverable) {
-			ctrl_external_desc = createRichTextEditWithLinkForSection(toolkit,
-					notationComposite,
-					AuthoringUIText.EXTERNAL_DESCRIPTION_TEXT, 40, 400,
-					NOTATION_SECTION_ID);
-			ctrl_packaging_guidance = createRichTextEditWithLinkForSection(
-					toolkit, notationComposite,
-					AuthoringUIText.PACKAGING_GUIDANCE_TEXT, 40, 400,
-					NOTATION_SECTION_ID);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#createTailoringSectionContent()
-	 */
-	protected void createTailoringSectionContent() {
-		super.createTailoringSectionContent();
-		ctrl_impact = createRichTextEditWithLinkForSection(toolkit,
-				tailoringComposite, AuthoringUIText.IMPACT_OF_NOT_HAVING_TEXT,
-				40, 400, TAILORING_SECTION_ID);
-		ctrl_reason = createRichTextEditWithLinkForSection(toolkit,
-				tailoringComposite,
-				AuthoringUIText.REASON_FOR_NOT_NEEDING_TEXT, 40, 400,
-				TAILORING_SECTION_ID);
-		if (workProduct instanceof Artifact) {
-			ctrl_representation_options = createRichTextEditWithLinkForSection(
-					toolkit, tailoringComposite,
-					AuthoringUIText.REPRESENTATION_OPTIONS_TEXT, 40, 400,
-					NOTATION_SECTION_ID);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#addListeners()
-	 */
-	protected void addListeners() {
-		final IActionManager actionMgr = ((MethodElementEditor) getEditor())
-				.getActionManager();
-
-		super.addListeners();
-
-		ctrl_purpose.setModalObject(contentElement.getPresentation());
-		ctrl_purpose.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getWorkProductDescription_Purpose());
-		ctrl_purpose.addModifyListener(contentModifyListener);
-		ctrl_purpose.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_purpose;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.WorkProductDescription) workProduct
-						.getPresentation()).getPurpose();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr.doAction(IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getWorkProductDescription_Purpose(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_external_id.addModifyListener(contentModifyListener);
-		ctrl_external_id.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getContentDescription_ExternalId());
-			}
-
-			public void focusLost(FocusEvent e) {
-				String oldContent = ((org.eclipse.epf.uma.WorkProductDescription) workProduct
-						.getPresentation()).getExternalId();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						ctrl_external_id, oldContent)) {
-					return;
-				}
-				String newContent = ctrl_external_id.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr.doAction(IActionManager.SET,
-							contentElement.getPresentation(),
-							UmaPackage.eINSTANCE
-									.getContentDescription_ExternalId(),
-							newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_impact.setModalObject(contentElement.getPresentation());
-		ctrl_impact.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getWorkProductDescription_ImpactOfNotHaving());
-		ctrl_impact.addModifyListener(contentModifyListener);
-		ctrl_impact.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_impact;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.WorkProductDescription) workProduct
-						.getPresentation()).getImpactOfNotHaving();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr
-							.doAction(
-									IActionManager.SET,
-									contentElement.getPresentation(),
-									UmaPackage.eINSTANCE
-											.getWorkProductDescription_ImpactOfNotHaving(),
-									newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		ctrl_reason.setModalObject(contentElement.getPresentation());
-		ctrl_reason.setModalObjectFeature(UmaPackage.eINSTANCE
-				.getWorkProductDescription_ReasonsForNotNeeding());
-		ctrl_reason.addModifyListener(contentModifyListener);
-		ctrl_reason.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event e) {
-				IMethodRichText control = descExpandFlag ? ctrl_expanded
-						: ctrl_reason;
-				if (!control.getModified()) {
-					return;
-				}
-				String oldContent = ((org.eclipse.epf.uma.WorkProductDescription) workProduct
-						.getPresentation()).getReasonsForNotNeeding();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						control, oldContent)) {
-					return;
-				}
-				String newContent = control.getText();
-				if (!newContent.equals(oldContent)) {
-					boolean success = actionMgr
-							.doAction(
-									IActionManager.SET,
-									contentElement.getPresentation(),
-									UmaPackage.eINSTANCE
-											.getWorkProductDescription_ReasonsForNotNeeding(),
-									newContent, -1);
-					if (success && isVersionSectionOn()) {
-						updateChangeDate();
-					}
-				}
-			}
-		});
-
-		if (workProduct instanceof Artifact) {
-			ctrl_brief_outline.setModalObject(contentElement.getPresentation());
-			ctrl_brief_outline.setModalObjectFeature(UmaPackage.eINSTANCE
-					.getArtifactDescription_BriefOutline());
-			ctrl_brief_outline.addModifyListener(contentModifyListener);
-			ctrl_brief_outline.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event e) {
-					IMethodRichText control = descExpandFlag ? ctrl_expanded
-							: ctrl_brief_outline;
-					if (!control.getModified()) {
-						return;
-					}
-					String oldContent = ((org.eclipse.epf.uma.ArtifactDescription) workProduct
-							.getPresentation()).getBriefOutline();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							control, oldContent)) {
-						return;
-					}
-					String newContent = descExpandFlag ? ctrl_expanded
-							.getText() : ctrl_brief_outline.getText();
-					if (!newContent.equals(oldContent)) {
-						boolean success = actionMgr.doAction(
-								IActionManager.SET, contentElement
-										.getPresentation(),
-								UmaPackage.eINSTANCE
-										.getArtifactDescription_BriefOutline(),
-								newContent, -1);
-						if (success && isVersionSectionOn()) {
-							updateChangeDate();
-						}
-					}
-				}
-			});
-
-			ctrl_representation_options.setModalObject(contentElement
-					.getPresentation());
-			ctrl_representation_options
-					.setModalObjectFeature(UmaPackage.eINSTANCE
-							.getArtifactDescription_RepresentationOptions());
-			ctrl_representation_options
-					.addModifyListener(contentModifyListener);
-			ctrl_representation_options.addListener(SWT.Deactivate,
-					new Listener() {
-						public void handleEvent(Event e) {
-							IMethodRichText control = descExpandFlag ? ctrl_expanded
-									: ctrl_representation_options;
-							if (!control.getModified()) {
-								return;
-							}
-							String oldContent = ((org.eclipse.epf.uma.ArtifactDescription) workProduct
-									.getPresentation())
-									.getRepresentationOptions();
-							if (((MethodElementEditor) getEditor())
-									.mustRestoreValue(control, oldContent)) {
-								return;
-							}
-							String newContent = control.getText();
-							if (!newContent.equals(oldContent)) {
-								boolean success = actionMgr
-										.doAction(
-												IActionManager.SET,
-												contentElement
-														.getPresentation(),
-												UmaPackage.eINSTANCE
-														.getArtifactDescription_RepresentationOptions(),
-												newContent, -1);
-								if (success && isVersionSectionOn()) {
-									updateChangeDate();
-								}
-							}
-						}
-					});
-			
-			ctrl_representation.setModalObject(contentElement.getPresentation());
-			ctrl_representation.setModalObjectFeature(UmaPackage.eINSTANCE
-					.getArtifactDescription_Representation());
-			ctrl_representation.addModifyListener(contentModifyListener);
-			ctrl_representation.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event e) {
-					IMethodRichText control = descExpandFlag ? ctrl_expanded
-							: ctrl_representation;
-					if (!control.getModified()) {
-						return;
-					}
-					String oldContent = ((org.eclipse.epf.uma.ArtifactDescription) workProduct
-							.getPresentation()).getRepresentation();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							control, oldContent)) {
-						return;
-					}
-					String newContent = descExpandFlag ? ctrl_expanded
-							.getText() : ctrl_representation.getText();
-					if (!newContent.equals(oldContent)) {
-						boolean success = actionMgr.doAction(
-								IActionManager.SET, contentElement
-										.getPresentation(),
-								UmaPackage.eINSTANCE
-										.getArtifactDescription_Representation(),
-								newContent, -1);
-						if (success && isVersionSectionOn()) {
-							updateChangeDate();
-						}
-					}
-				}
-			});
-
-			ctrl_notation.setModalObject(contentElement.getPresentation());
-			ctrl_notation.setModalObjectFeature(UmaPackage.eINSTANCE
-					.getArtifactDescription_Notation());
-			ctrl_notation.addModifyListener(contentModifyListener);
-			ctrl_notation.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event e) {
-					IMethodRichText control = descExpandFlag ? ctrl_expanded
-							: ctrl_notation;
-					if (!control.getModified()) {
-						return;
-					}
-					String oldContent = ((org.eclipse.epf.uma.ArtifactDescription) workProduct
-							.getPresentation()).getNotation();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							control, oldContent)) {
-						return;
-					}
-					String newContent = descExpandFlag ? ctrl_expanded
-							.getText() : ctrl_notation.getText();
-					if (!newContent.equals(oldContent)) {
-						boolean success = actionMgr.doAction(
-								IActionManager.SET, contentElement
-										.getPresentation(),
-								UmaPackage.eINSTANCE
-										.getArtifactDescription_Notation(),
-								newContent, -1);
-						if (success && isVersionSectionOn()) {
-							updateChangeDate();
-						}
-					}
-				}
-			});
-
-		}
-
-		if (workProduct instanceof Deliverable) {
-			ctrl_external_desc.setModalObject(contentElement.getPresentation());
-			ctrl_external_desc.setModalObjectFeature(UmaPackage.eINSTANCE
-					.getDeliverableDescription_ExternalDescription());
-			ctrl_external_desc.addModifyListener(contentModifyListener);
-			ctrl_external_desc.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event e) {
-					IMethodRichText control = descExpandFlag ? ctrl_expanded
-							: ctrl_external_desc;
-					if (!control.getModified()) {
-						return;
-					}
-					String oldContent = ((org.eclipse.epf.uma.DeliverableDescription) workProduct
-							.getPresentation()).getExternalDescription();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							control, oldContent)) {
-						return;
-					}
-					String newContent = control.getText();
-					if (!newContent.equals(oldContent)) {
-						boolean success = actionMgr
-								.doAction(
-										IActionManager.SET,
-										contentElement.getPresentation(),
-										UmaPackage.eINSTANCE
-												.getDeliverableDescription_ExternalDescription(),
-										newContent, -1);
-						if (success && isVersionSectionOn()) {
-							updateChangeDate();
-						}
-					}
-				}
-			});
-
-			ctrl_packaging_guidance.setModalObject(contentElement
-					.getPresentation());
-			ctrl_packaging_guidance.setModalObjectFeature(UmaPackage.eINSTANCE
-					.getDeliverableDescription_PackagingGuidance());
-			ctrl_packaging_guidance.addModifyListener(contentModifyListener);
-			ctrl_packaging_guidance.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event e) {
-					IMethodRichText control = descExpandFlag ? ctrl_expanded
-							: ctrl_packaging_guidance;
-					if (!control.getModified()) {
-						return;
-					}
-					String oldContent = ((org.eclipse.epf.uma.DeliverableDescription) workProduct
-							.getPresentation()).getPackagingGuidance();
-					if (((MethodElementEditor) getEditor()).mustRestoreValue(
-							control, oldContent)) {
-						return;
-					}
-					String newContent = control.getText();
-					if (!newContent.equals(oldContent)) {
-						boolean success = actionMgr
-								.doAction(
-										IActionManager.SET,
-										contentElement.getPresentation(),
-										UmaPackage.eINSTANCE
-												.getDeliverableDescription_PackagingGuidance(),
-										newContent, -1);
-						if (success && isVersionSectionOn()) {
-							updateChangeDate();
-						}
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#refresh(boolean)
-	 */
-	protected void refresh(boolean editable) {
-		super.refresh(editable);
-		ctrl_impact.setEditable(editable);
-		ctrl_reason.setEditable(editable);
-		if (workProduct instanceof Artifact) {
-			ctrl_brief_outline.setEditable(editable);
-			ctrl_representation_options.setEditable(editable);
-			ctrl_representation.setEditable(editable);
-			ctrl_notation.setEditable(editable);
-
-		}
-		if (workProduct instanceof Deliverable) {
-			ctrl_external_desc.setEditable(editable);
-			ctrl_packaging_guidance.setEditable(editable);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadData()
-	 */
-	protected void loadData() {
-		super.loadData();
-
-		org.eclipse.epf.uma.WorkProductDescription content = ((org.eclipse.epf.uma.WorkProductDescription) workProduct
-				.getPresentation());
-		String purpose = content.getPurpose();
-		String impact = content.getImpactOfNotHaving();
-		String reason = content.getReasonsForNotNeeding();
-
-		ctrl_purpose.setText(purpose == null ? "" : purpose); //$NON-NLS-1$	
-		ctrl_impact.setText(impact == null ? "" : impact); //$NON-NLS-1$	
-		ctrl_reason.setText(reason == null ? "" : reason); //$NON-NLS-1$
-
-		if (externalIdOn) {
-			String external_id = content.getExternalId();
-			ctrl_external_id.setText(external_id == null ? "" : external_id); //$NON-NLS-1$
-		}
-
-		if (workProduct instanceof Artifact) {
-			ctrl_brief_outline
-					.setText(((ArtifactDescription) content).getBriefOutline() == null ? "" : ((ArtifactDescription) content).getBriefOutline()); //$NON-NLS-1$
-			ctrl_representation_options
-					.setText(((ArtifactDescription) content)
-							.getRepresentationOptions() == null ? "" : ((ArtifactDescription) content).getRepresentationOptions()); //$NON-NLS-1$
-			ctrl_representation.setText(((ArtifactDescription) content).getRepresentation() == null ? "" : ((ArtifactDescription) content).getRepresentation()); //$NON-NLS-1$
-			ctrl_notation.setText(((ArtifactDescription) content).getNotation() == null ? "" : ((ArtifactDescription) content).getNotation()); //$NON-NLS-1$
-		} else if (workProduct instanceof Deliverable) {
-			ctrl_external_desc
-					.setText(((DeliverableDescription) content)
-							.getExternalDescription() == null ? "" : ((DeliverableDescription) content).getExternalDescription()); //$NON-NLS-1$
-			ctrl_packaging_guidance
-					.setText(((DeliverableDescription) content)
-							.getPackagingGuidance() == null ? "" : ((DeliverableDescription) content).getPackagingGuidance()); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return workProduct;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.WORKPRODUCTS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new WorkProductFilter() {
-			List badlist = new ArrayList();
-
-			protected boolean childAccept(Object obj) {
-				if (super.childAccept(obj)) {
-					if (obj instanceof ContentElement) {
-						if (obj instanceof WorkProduct
-								&& ((ContentElement) getHelper()
-										.getContentElement()).getType().equals(
-										((ContentElement) obj).getType())) {
-							// prevent circular dependency from deliverable
-							// parts and variability
-							if (obj instanceof Deliverable
-									&& workProduct instanceof Deliverable) {
-								if (!UIHelper.checkCircularDeliverables(
-										(Deliverable) obj,
-										(Deliverable) workProduct)) {
-									badlist.add(obj);
-									return false;
-								}
-								if (((Deliverable) obj)
-										.getVariabilityBasedOnElement() != null) {
-									if (!UIHelper
-											.checkCircularDeliverables(
-													(Deliverable) ((Deliverable) obj)
-															.getVariabilityBasedOnElement(),
-													(Deliverable) workProduct)) {
-										badlist.add(obj);
-										return false;
-									}
-								}
-								Iterator it1 = TngUtil
-										.getGeneralizers((Deliverable) obj);
-								while (it1.hasNext()) {
-									VariabilityElement ve = (VariabilityElement) it1
-											.next();
-									if (ve != null) {
-										if (ve.equals(obj))
-											return false;
-										if (!UIHelper
-												.checkCircularDeliverables(
-														(Deliverable) ve,
-														(Deliverable) workProduct)) {
-											badlist.add(obj);
-											return false;
-										}
-									}
-
-								}
-								// browse through badlist and its deliverable
-								// parts.
-								List templist = new ArrayList();
-								for (Iterator iterator = badlist.iterator(); iterator
-										.hasNext();) {
-									Object bad = iterator.next();
-									UIHelper.deliverablePartsChain(
-											(Deliverable) bad, templist);
-								}
-								if (templist.contains(obj))
-									return false;
-							}
-
-							return true;
-						}
-					}
-				}
-				return false;
-			}
-		};
-
-		// set additional filter for variability base element checking
-		((ContentFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						workProduct) });
-		return filter;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		if(contentElement instanceof Artifact){
-			this.generalSectionDescription = AuthoringUIResources.artifact_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.artifact_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.artifact_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.artifact_versionInfoSection_desc;
-			this.notationSectionDescription = AuthoringUIResources.artifact_notationSection_desc;
-			this.tailoringSectionDescription = AuthoringUIResources.artifact_tailoringSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.artifact_iconSection_desc;
-		}
-		if(contentElement instanceof Outcome){
-			this.generalSectionDescription = AuthoringUIResources.outcome_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.outcome_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.outcome_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.outcome_versionInfoSection_desc;
-			this.notationSectionDescription = AuthoringUIResources.outcome_notationSection_desc;
-			this.tailoringSectionDescription = AuthoringUIResources.outcome_tailoringSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.outcome_iconSection_desc;
-		}
-		if(contentElement instanceof Deliverable){
-			this.generalSectionDescription = AuthoringUIResources.deliverable_generalInfoSection_desc;
-			this.detailSectionDescription = AuthoringUIResources.deliverable_detailSection_desc;
-			this.variabilitySectionDescription = AuthoringUIResources.deliverable_variabilitySection_desc;
-			this.versionSectionDescription = AuthoringUIResources.deliverable_versionInfoSection_desc;
-			this.notationSectionDescription = AuthoringUIResources.deliverable_notationSection_desc;
-			this.tailoringSectionDescription = AuthoringUIResources.deliverable_tailoringSection_desc;
-			this.iconSectionDescription = AuthoringUIResources.deliverable_iconSection_desc;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductGuidancePage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductGuidancePage.java
deleted file mode 100644
index 618e38a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductGuidancePage.java
+++ /dev/null
@@ -1,266 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.GuidanceFilter;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Guidance page in the Work Product editor.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductGuidancePage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductGuidancePage"; //$NON-NLS-1$
-
-	private WorkProduct workProduct;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductGuidancePage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.GUIDANCE_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProduct = (WorkProduct) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setUseCategory2(false);
-		setUseCategory3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return UIHelper.getSelectedGuidances(workProduct);
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// The guidance for the content element.
-				if (item instanceof Checklist) {
-					actionMgr
-							.doAction(IActionManager.ADD, workProduct,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									(Checklist) item, -1);
-				} else if (item instanceof Concept) {
-					actionMgr.doAction(IActionManager.ADD, workProduct,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							item, -1);
-				} else if (item instanceof Example) {
-					actionMgr.doAction(IActionManager.ADD, workProduct,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							item, -1);
-				} else if (item instanceof Guideline) {
-					actionMgr
-							.doAction(IActionManager.ADD, workProduct,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									item, -1);
-				} else if (item instanceof Practice) {
-					actionMgr.doAction(IActionManager.ADD, (Practice) item,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(),
-							workProduct, -1);
-				} else if (item instanceof Report) {
-					actionMgr.doAction(IActionManager.ADD, workProduct,
-							UmaPackage.eINSTANCE.getWorkProduct_Reports(),
-							item, -1);
-				} else if (item instanceof ReusableAsset) {
-					actionMgr.doAction(IActionManager.ADD, workProduct,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							item, -1);
-				} else if (item instanceof SupportingMaterial) {
-					actionMgr.doAction(IActionManager.ADD, workProduct,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							item, -1);
-				} else if (item instanceof Template) {
-					actionMgr.doAction(IActionManager.ADD, workProduct,
-							UmaPackage.eINSTANCE.getWorkProduct_Templates(),
-							item, -1);
-				} else if (item instanceof ToolMentor) {
-					actionMgr.doAction(IActionManager.ADD, workProduct,
-							UmaPackage.eINSTANCE.getWorkProduct_ToolMentors(),
-							item, -1);
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to add guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"to " //$NON-NLS-1$
-											+ workProduct.getType().getName()
-											+ ":" + workProduct.getName()); //$NON-NLS-1$ 
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// The guidance for the content element.
-				if (item instanceof Checklist) {
-					actionMgr
-							.doAction(IActionManager.REMOVE, workProduct,
-									UmaPackage.eINSTANCE
-											.getContentElement_Checklists(),
-									item, -1);
-				} else if (item instanceof Concept) {
-					actionMgr.doAction(IActionManager.REMOVE, workProduct,
-							UmaPackage.eINSTANCE
-									.getContentElement_ConceptsAndPapers(),
-							item, -1);
-				} else if (item instanceof Example) {
-					actionMgr.doAction(IActionManager.REMOVE, workProduct,
-							UmaPackage.eINSTANCE.getContentElement_Examples(),
-							item, -1);
-				} else if (item instanceof Guideline) {
-					actionMgr
-							.doAction(IActionManager.REMOVE, workProduct,
-									UmaPackage.eINSTANCE
-											.getContentElement_Guidelines(),
-									item, -1);
-				} else if (item instanceof Practice) {
-					actionMgr.doAction(IActionManager.REMOVE, (Practice) item,
-							UmaPackage.eINSTANCE
-									.getPractice_ContentReferences(),
-							workProduct, -1);
-				} else if (item instanceof Report) {
-					actionMgr.doAction(IActionManager.REMOVE, workProduct,
-							UmaPackage.eINSTANCE.getWorkProduct_Reports(),
-							item, -1);
-				} else if (item instanceof ReusableAsset) {
-					actionMgr.doAction(IActionManager.REMOVE, workProduct,
-							UmaPackage.eINSTANCE.getContentElement_Assets(),
-							item, -1);
-				} else if (item instanceof SupportingMaterial) {
-					actionMgr.doAction(IActionManager.REMOVE, workProduct,
-							UmaPackage.eINSTANCE
-									.getContentElement_SupportingMaterials(),
-							item, -1);
-				} else if (item instanceof Template) {
-					actionMgr.doAction(IActionManager.REMOVE, workProduct,
-							UmaPackage.eINSTANCE.getWorkProduct_Templates(),
-							item, -1);
-				} else if (item instanceof ToolMentor) {
-					actionMgr.doAction(IActionManager.REMOVE, workProduct,
-							UmaPackage.eINSTANCE.getWorkProduct_ToolMentors(),
-							item, -1);
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unable to remove guidance " + item.getType().getName() + ":" + item.getName() + //$NON-NLS-1$ //$NON-NLS-2$
-											"from " //$NON-NLS-1$
-											+ workProduct.getType().getName()
-											+ ":" + workProduct.getName()); //$NON-NLS-1$ 
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return workProduct;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.GUIDANCE;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new GuidanceFilter() {
-			protected boolean childAccept(Object obj) {
-				if (super.childAccept(obj))
-					return true;
-				if (obj instanceof Template)
-					return true;
-				if (obj instanceof Report)
-					return true;
-				if (obj instanceof ToolMentor)
-					return true;
-				return false;
-			}
-		};
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductRolesPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductRolesPage.java
deleted file mode 100644
index 9419562..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductRolesPage.java
+++ /dev/null
@@ -1,166 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Roles page in the Work Product editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- * 
- * TODO: Rename this class to WorkProductRolesFormPage
- */
-public class WorkProductRolesPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductRolesPage"; //$NON-NLS-1$
-
-	private WorkProduct workProduct;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductRolesPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.ROLES_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProduct = (WorkProduct) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setUseCategory3(false);
-		setCategoryIsSingleSelection1(true);
-		setAllowChange1(false);
-		setAllowChange2(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getResponsibleRoles((WorkProduct) object).toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			Role role = (Role) addItems.get(0);
-			if (UserInteractionHelper.checkModifyOpposite(role,
-					UmaPackage.eINSTANCE.getRole_ResponsibleFor(), workProduct)) {
-				actionMgr.doAction(IActionManager.ADD, role,
-						UmaPackage.eINSTANCE.getRole_ResponsibleFor(),
-						workProduct, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-//			LibraryManager.getInstance().setResponsibleRole(getActionManager(),
-//					workProduct, null);
-			
-			for (Iterator iter = rmItems.iterator(); iter.hasNext();) {
-				Role role = (Role) iter.next();
-				getActionManager().doAction(IActionManager.REMOVE, role, UmaPackage.eINSTANCE.getRole_ResponsibleFor(), workProduct, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getModifiedBy((WorkProduct) object)
-						.toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.workProductRolesPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.workProductRolesPage_sectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.workProductRolesPage_sectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.workProductRolesPage_selectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.workProductRolesPage_selectedLabel2;
-	}
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTasksPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTasksPage.java
deleted file mode 100644
index 3965980..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTasksPage.java
+++ /dev/null
@@ -1,256 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.util.LibraryManager;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Tasks page in the Work Product editor.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductTasksPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductTasksPage"; //$NON-NLS-1$
-
-	private WorkProduct workProduct;
-
-	private IActionManager actionMgr;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductTasksPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.TASKS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProduct = (WorkProduct) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setAllowChange1(false);
-		setAllowChange2(false);
-		setAllowChange3(false);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getMandatoryInputToTasks(
-						(WorkProduct) object).toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			List elementList = retrieveTableViewerContents(viewer_selected2);
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				if (!elementList.contains(task)) {
-					actionMgr.doAction(IActionManager.ADD, task,
-							UmaPackage.eINSTANCE.getTask_MandatoryInput(),
-							workProduct, -1);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				actionMgr.doAction(IActionManager.REMOVE, task,
-						UmaPackage.eINSTANCE.getTask_MandatoryInput(),
-						workProduct, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected2()
-	 */
-	protected void initContentProviderSelected2() {
-		contentProviderSelected2 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List selectedTasks = new ArrayList();
-				List availableTasksList = LibraryManager.getInstance()
-						.getAvailableTasks(workProduct);
-				if (availableTasksList != null && availableTasksList.size() > 0) {
-					for (java.util.Iterator it = availableTasksList.iterator(); it
-							.hasNext();) {
-						Task task = (Task) it.next();
-						if (task.getOptionalInput().contains(workProduct))
-							selectedTasks.add(task);
-					}
-				}
-				return selectedTasks.toArray();
-			}
-		};
-		viewer_selected2.setContentProvider(contentProviderSelected2);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel2(ArrayList)
-	 */
-	protected void addItemsToModel2(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			List elementList = retrieveTableViewerContents(viewer_selected);
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				if (!elementList.contains(task)) {
-					actionMgr.doAction(IActionManager.ADD, task,
-							UmaPackage.eINSTANCE.getTask_OptionalInput(),
-							workProduct, -1);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel2(ArrayList)
-	 */
-	protected void removeItemsFromModel2(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				actionMgr.doAction(IActionManager.REMOVE, task,
-						UmaPackage.eINSTANCE.getTask_OptionalInput(),
-						workProduct, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected3()
-	 */
-	protected void initContentProviderSelected3() {
-		contentProviderSelected3 = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return AssociationHelper.getOutputtingTasks(
-						(WorkProduct) object).toArray();
-			}
-		};
-		viewer_selected3.setContentProvider(contentProviderSelected3);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel3(ArrayList)
-	 */
-	protected void addItemsToModel3(ArrayList addItems) {
-		// Update the model.
-		if (!addItems.isEmpty()) {
-			for (Iterator it = addItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				actionMgr.doAction(IActionManager.ADD, task,
-						UmaPackage.eINSTANCE.getTask_Output(), workProduct, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel3(ArrayList)
-	 */
-	protected void removeItemsFromModel3(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Task task = (Task) it.next();
-				actionMgr.doAction(IActionManager.REMOVE, task,
-						UmaPackage.eINSTANCE.getTask_Output(), workProduct, -1);
-			}
-		}
-	}
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.WorkProduct_Tasks_MultipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.WorkProduct_Tasks_SectionDescription;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.WorkProduct_Tasks_SectionName;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel()
-	 */
-	protected String getSelectedLabel() {
-		return AuthoringUIResources.WorkProduct_Tasks_SelectedLabel;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel2()
-	 */
-	protected String getSelectedLabel2() {
-		return AuthoringUIResources.WorkProduct_Tasks_SelectedLabel2;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSelectedLabel3()
-	 */
-	protected String getSelectedLabel3() {
-		return AuthoringUIResources.WorkProduct_Tasks_SelectedLabel3;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTypeDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTypeDescriptionPage.java
deleted file mode 100644
index 0929f04..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTypeDescriptionPage.java
+++ /dev/null
@@ -1,90 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.filters.CategoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.VariabilityBaseElementFilter;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Description page for the Work product Type editor.
- * 
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class WorkProductTypeDescriptionPage extends DescriptionFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductTypeDescriptionPage"; //$NON-NLS-1$
-
-	private WorkProductType workProductType;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductTypeDescriptionPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.DESCRIPTION_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProductType = (WorkProductType) contentElement;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return workProductType;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		filter = new CategoryFilter() {
-			protected boolean childAccept(Object obj) {
-				return (obj instanceof WorkProductType);
-			}
-		};
-
-		// set additional filter for variability base element checking
-		((CategoryFilter) filter)
-				.setAdditionalFilters(new IFilter[] { new VariabilityBaseElementFilter(
-						workProductType) });
-		return filter;
-	}
-
-	protected String getTabString() {
-		return FilterConstants.WORKPRODUCTTYPES;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#loadSectionDescription()
-	 */
-	public void loadSectionDescription() {
-		this.generalSectionDescription = AuthoringUIResources.workproducttype_generalInfoSection_desc;
-		this.detailSectionDescription = AuthoringUIResources.workproducttype_detailSection_desc;
-		this.variabilitySectionDescription = AuthoringUIResources.workproducttype_variabilitySection_desc;
-		this.versionSectionDescription = AuthoringUIResources.workproducttype_versionInfoSection_desc;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTypeWorkProductsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTypeWorkProductsPage.java
deleted file mode 100644
index ac28dbc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/WorkProductTypeWorkProductsPage.java
+++ /dev/null
@@ -1,188 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.forms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.filters.WorkProductFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.MoveInCategoryCommand;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-
-/**
- * The Work Products page in the Work Product Type editor.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductTypeWorkProductsPage extends AssociationFormPage {
-
-	private static final String FORM_PAGE_ID = "workProductTypeWorkProductsPage"; //$NON-NLS-1$
-
-	private WorkProductType workProductType;
-
-	private IActionManager actionMgr;
-	
-	private ContentElementOrderList allSteps;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductTypeWorkProductsPage(FormEditor editor) {
-		super(editor, FORM_PAGE_ID, AuthoringUIText.WORK_PRODUCTS_PAGE_TITLE);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input) {
-		super.init(site, input);
-		workProductType = (WorkProductType) contentElement;
-		actionMgr = ((MethodElementEditor) getEditor()).getActionManager();
-		setUseCategory2(false);
-		setUseCategory3(false);
-		setIsUpAndDownButtonsRequired1(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#initContentProviderSelected()
-	 */
-	protected void initContentProviderSelected() {
-		contentProviderSelected = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				//return ((WorkProductType) object).getWorkProducts().toArray();
-				if (allSteps == null) {
-					allSteps = new ContentElementOrderList(
-							contentElement,
-							ContentElementOrderList.CONTENT_ELEMENTS__FOR_ELEMENT_ONLY,
-							getContentCategoryOrderFeature());
-				}
-				List returnList = CategorySortHelper.sortCategoryElements(contentElement, 
-						allSteps.toArray());
-				return returnList.toArray();
-			}
-		};
-		viewer_selected.setContentProvider(contentProviderSelected);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#addItemsToModel1(ArrayList)
-	 */
-	protected void addItemsToModel1(ArrayList addItems) {
-		if (!addItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.ADD_MANY, workProductType,
-					UmaPackage.eINSTANCE.getWorkProductType_WorkProducts(),
-					addItems, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#removeItemsFromModel1(ArrayList)
-	 */
-	protected void removeItemsFromModel1(ArrayList rmItems) {
-		// Update the model.
-		if (!rmItems.isEmpty()) {
-			actionMgr.doAction(IActionManager.REMOVE_MANY, workProductType,
-					UmaPackage.eINSTANCE.getWorkProductType_WorkProducts(),
-					rmItems, -1);
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getContentElement()
-	 */
-	protected Object getContentElement() {
-		return workProductType;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getTabString()
-	 */
-	protected String getTabString() {
-		return FilterConstants.WORKPRODUCTS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.DescriptionFormPage#getFilter()
-	 */
-	protected IFilter getFilter() {
-		return filter = new WorkProductFilter() {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof ContentElement) {
-					if (getHelper().isContributor((ContentElement) obj))
-						return false;
-				}
-				return (obj instanceof WorkProduct);
-			}
-		};
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getMultipleSelectDescription(int)
-	 */
-	protected String getMultipleSelectDescription(int count) {
-		return super.getMultipleSelectDescription(count, AuthoringUIResources.workProductTypeWorkProductsPage_multipleSelectDescription);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionDescription()
-	 */
-	protected String getSectionDescription() {
-		return AuthoringUIResources.workProductTypeWorkProductsPage_sectionDescription;
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.forms.AssociationFormPage#getSectionName()
-	 */
-	protected String getSectionName() {
-		return AuthoringUIResources.workProductTypeWorkProductsPage_sectionName;
-	}
-	
-	@Override
-	protected EStructuralFeature getContentCategoryOrderFeature() {
-		return UmaPackage.eINSTANCE.getWorkProductType_WorkProducts();
-	}
-
-	@Override
-	protected String[] getModelStructurePath() {
-		return ModelStructure.DEFAULT.workProductTypePath;
-	}
-	
-	@Override
-	protected ContentElementOrderList getContentElementOrderList() {
-		return allSteps;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/package.html
deleted file mode 100644
index 3b73713..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides form pages for the method and process editors.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/IProblemChangedListener.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/IProblemChangedListener.java
deleted file mode 100644
index edc8e93..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/IProblemChangedListener.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal;
-
-import org.eclipse.core.resources.IResource;
-
-/**
- * 
- * Code taken from org.eclipse.jdt.internal.ui.viewsupport.IProblemChangedListener
- *
- */
-public interface IProblemChangedListener {
-	
-	/**
-	 * Called when problems changed. This call is posted in an aynch exec, therefore passed
-	 * resources must not exist.
-	 * @param changedResources  A set with elements of type <code>IResource</code> that
-	 * describe the resources that had an problem change.
-	 * @param isMarkerChange If set to <code>true</code>, the change was a marker change, if
-	 * <code>false</code>, the change came from an annotation model modification.
-	 */
-	void problemsChanged(IResource[] changedResources, boolean isMarkerChange);
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ImageDescriptorRegistry.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ImageDescriptorRegistry.java
deleted file mode 100644
index 3638529..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ImageDescriptorRegistry.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal;
-
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * 
- * Code taken from org.eclipse.jdt.internal.ui.viewsupport.ImageDescriptorRegistry
- *
- */
-public class ImageDescriptorRegistry {
-
-	private HashMap<ImageDescriptor, Image> fRegistry= new HashMap<ImageDescriptor, Image>(10);
-	private Display fDisplay;
-	
-	/**
-	 * Creates a new image descriptor registry for the current or default display,
-	 * respectively.
-	 */
-	public ImageDescriptorRegistry() {
-		this(AuthoringUIPlugin.getStandardDisplay());
-	}
-	
-	/**
-	 * Creates a new image descriptor registry for the given display. All images
-	 * managed by this registry will be disposed when the display gets disposed.
-	 * 
-	 * @param display the display the images managed by this registry are allocated for 
-	 */
-	public ImageDescriptorRegistry(Display display) {
-		fDisplay= display;
-		Assert.isNotNull(fDisplay);
-		hookDisplay();
-	}
-	
-	/**
-	 * Returns the image associated with the given image descriptor.
-	 * 
-	 * @param descriptor the image descriptor for which the registry manages an image
-	 * @return the image associated with the image descriptor or <code>null</code>
-	 *  if the image descriptor can't create the requested image.
-	 */
-	public Image get(ImageDescriptor descriptor) {
-		if (descriptor == null)
-			descriptor= ImageDescriptor.getMissingImageDescriptor();
-			
-		Image result= (Image)fRegistry.get(descriptor);
-		if (result != null)
-			return result;
-	
-		Assert.isTrue(fDisplay == AuthoringUIPlugin.getStandardDisplay(), "Allocating image for wrong display."); //$NON-NLS-1$
-		result= descriptor.createImage();
-		if (result != null)
-			fRegistry.put(descriptor, result);
-		return result;
-	}
-
-	/**
-	 * Disposes all images managed by this registry.
-	 */	
-	public void dispose() {
-		for (Iterator iter= fRegistry.values().iterator(); iter.hasNext(); ) {
-			Image image= (Image)iter.next();
-			image.dispose();
-		}
-		fRegistry.clear();
-	}
-	
-	private void hookDisplay() {
-		fDisplay.disposeExec(new Runnable() {
-			public void run() {
-				dispose();
-			}	
-		});
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ImageImageDescriptor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ImageImageDescriptor.java
deleted file mode 100644
index 27864dc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ImageImageDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-
-/**
- * Code taken from org.eclipse.jdt.internal.ui.viewsupport.ImageImageDescriptor
- *
- */
-public class ImageImageDescriptor extends ImageDescriptor {
-
-	private Image fImage;
-
-	/**
-	 * Constructor for ImagImageDescriptor.
-	 */
-	public ImageImageDescriptor(Image image) {
-		super();
-		fImage= image;
-	}
-
-	/* (non-Javadoc)
-	 * @see ImageDescriptor#getImageData()
-	 */
-	public ImageData getImageData() {
-		return fImage.getImageData();
-	}
-
-	/* (non-Javadoc)
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object obj) {
-		return (obj != null) && getClass().equals(obj.getClass()) && fImage.equals(((ImageImageDescriptor)obj).fImage);
-	}
-
-	/* (non-Javadoc)
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		return fImage.hashCode();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/MethodElementEditorErrorTickUpdater.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/MethodElementEditorErrorTickUpdater.java
deleted file mode 100644
index 70e781a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/MethodElementEditorErrorTickUpdater.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.providers.MethodElementUILabelProvider;
-import org.eclipse.epf.authoring.ui.providers.ProblemsLabelDecorator;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.text.Assert;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-
-/**
- * Code taken from org.eclipse.jdt.internal.ui.javaeditor.JavaEditorErrorTickUpdater
- *
- */
-public class MethodElementEditorErrorTickUpdater implements IProblemChangedListener {
-
-	private MethodElementEditor fMethodElementEditor;
-	private MethodElementUILabelProvider fLabelProvider;
-
-	public MethodElementEditorErrorTickUpdater(MethodElementEditor editor) {
-		Assert.isNotNull(editor);
-		fMethodElementEditor= editor;
-		fLabelProvider= new MethodElementUILabelProvider();
-		fLabelProvider.addLabelDecorator(new ProblemsLabelDecorator(null));
-		AuthoringUIPlugin.getDefault().getProblemMarkerManager().addListener(this);
-	}
-
-	/* (non-Javadoc)
-	 * @see IProblemChangedListener#problemsChanged(IResource[], boolean)
-	 */
-	public void problemsChanged(IResource[] changedResources, boolean isMarkerChange) {
-		if (!isMarkerChange)
-			return;
-
-		IEditorInput input= fMethodElementEditor.getEditorInput();
-		if (input instanceof MethodElementEditorInput) { // might run async, tests needed
-			MethodElement melement = ((MethodElementEditorInput)input).getMethodElement();
-			if (melement instanceof ProcessComponent) {
-				melement = ((ProcessComponent) melement).getProcess();
-			}
-			if (melement != null) {
-				IResource resource= PersistenceUtil.getWorkspaceResource(melement);
-				for (int i = 0; i < changedResources.length; i++) {
-					if (changedResources[i].equals(resource)) {
-						updateEditorImage(melement);
-					}
-				}
-			}
-		}
-	}
-
-	public void updateEditorImage(MethodElement melement) {
-		Image titleImage= fMethodElementEditor.getTitleImage();
-		if (titleImage == null) {
-			return;
-		}
-		Image newImage;
-		newImage= fLabelProvider.getImage(melement);
-		if (titleImage != newImage) {
-			postImageChange(newImage);
-		}
-	}
-
-	private void postImageChange(final Image newImage) {
-		Shell shell= fMethodElementEditor.getEditorSite().getShell();
-		if (shell != null && !shell.isDisposed()) {
-			shell.getDisplay().syncExec(new Runnable() {
-				public void run() {
-					fMethodElementEditor.updatedTitleImage(newImage);
-				}
-			});
-		}
-	}
-
-	public void dispose() {
-		fLabelProvider.dispose();
-		AuthoringUIPlugin.getDefault().getProblemMarkerManager().removeListener(this);
-	}
-
-
-}
-
-
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/MethodElementImageDescriptor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/MethodElementImageDescriptor.java
deleted file mode 100644
index 888222d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/MethodElementImageDescriptor.java
+++ /dev/null
@@ -1,161 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-/**
- * Code taken from org.eclipse.jdt.ui.JavaElementImageDescriptor
- *
- */
-public class MethodElementImageDescriptor extends CompositeImageDescriptor {
-	
-	/** Flag to render the error adornment. */
-	public final static int ERROR=			0x040;
-
-	private ImageDescriptor fBaseImage;
-	private int fFlags;
-	private Point fSize;
-
-	/**
-	 * Creates a new MethodElementImageDescriptor.
-	 * 
-	 * @param baseImage an image descriptor used as the base image
-	 * @param flags flags indicating which adornments are to be rendered. See <code>setAdornments</code>
-	 * 	for valid values.
-	 * @param size the size of the resulting image
-	 * @see #setAdornments(int)
-	 */
-	public MethodElementImageDescriptor(ImageDescriptor baseImage, int flags, Point size) {
-		fBaseImage= baseImage;
-		Assert.isNotNull(fBaseImage);
-		fFlags= flags;
-		Assert.isTrue(fFlags >= 0);
-		fSize= size;
-		Assert.isNotNull(fSize);
-	}
-	
-	/**
-	 * Sets the descriptors adornments. Valid values are: <code>ABSTRACT</code>, <code>FINAL</code>,
-	 * <code>SYNCHRONIZED</code>, </code>STATIC<code>, </code>RUNNABLE<code>, </code>WARNING<code>, 
-	 * </code>ERROR<code>, </code>OVERRIDDES<code>, <code>IMPLEMENTS</code>, <code>CONSTRUCTOR</code>,
-	 * <code>DEPRECATED</code>,  or any combination of those.
-	 * 
-	 * @param adornments the image descriptors adornments
-	 */
-	public void setAdornments(int adornments) {
-		Assert.isTrue(adornments >= 0);
-		fFlags= adornments;
-	}
-
-	/**
-	 * Returns the current adornments.
-	 * 
-	 * @return the current adornments
-	 */
-	public int getAdronments() {
-		return fFlags;
-	}
-
-	/**
-	 * Sets the size of the image created by calling <code>createImage()</code>.
-	 * 
-	 * @param size the size of the image returned from calling <code>createImage()</code>
-	 * @see ImageDescriptor#createImage()
-	 */
-	public void setImageSize(Point size) {
-		Assert.isNotNull(size);
-		Assert.isTrue(size.x >= 0 && size.y >= 0);
-		fSize= size;
-	}
-	
-	/**
-	 * Returns the size of the image created by calling <code>createImage()</code>.
-	 * 
-	 * @return the size of the image created by calling <code>createImage()</code>
-	 * @see ImageDescriptor#createImage()
-	 */
-	public Point getImageSize() {
-		return new Point(fSize.x, fSize.y);
-	}
-	
-	/* (non-Javadoc)
-	 * Method declared in CompositeImageDescriptor
-	 */
-	protected Point getSize() {
-		return fSize;
-	}
-	
-	/* (non-Javadoc)
-	 * Method declared on Object.
-	 */
-	public boolean equals(Object object) {
-		if (object == null || !MethodElementImageDescriptor.class.equals(object.getClass()))
-			return false;
-			
-		MethodElementImageDescriptor other= (MethodElementImageDescriptor)object;
-		return (fBaseImage.equals(other.fBaseImage) && fFlags == other.fFlags && fSize.equals(other.fSize));
-	}
-	
-	/* (non-Javadoc)
-	 * Method declared on Object.
-	 */
-	public int hashCode() {
-		return fBaseImage.hashCode() | fFlags | fSize.hashCode();
-	}
-	
-	/* (non-Javadoc)
-	 * Method declared in CompositeImageDescriptor
-	 */
-	protected void drawCompositeImage(int width, int height) {
-		ImageData bg= getImageData(fBaseImage);
-			
-		
-		drawImage(bg, 0, 0);
-				
-		drawTopRight();
-		drawBottomRight();
-		drawBottomLeft();
-		
-
-	}
-	
-	private ImageData getImageData(ImageDescriptor descriptor) {
-		ImageData data= descriptor.getImageData(); // see bug 51965: getImageData can return null
-		if (data == null) {
-			data= DEFAULT_IMAGE_DATA;
-			AuthoringUIPlugin.getDefault().getLogger().logError("Image data not available: " + descriptor.toString()); //$NON-NLS-1$
-		}
-		return data;
-	}
-	
-	
-	private void drawTopRight() {		
-	}		
-	
-	private void drawBottomRight() {
-	}		
-	
-	private void drawBottomLeft() {
-		Point size= getSize();
-		int x= 0;
-		if ((fFlags & ERROR) != 0) {
-			ImageData data= getImageData(AuthoringUIImages.IMG_DESC_OVR_ERROR);
-			drawImage(data, x, size.y - data.height);
-			x+= data.width;
-		}
-	}		
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ProblemMarkerManager.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ProblemMarkerManager.java
deleted file mode 100644
index 7f22304..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/ProblemMarkerManager.java
+++ /dev/null
@@ -1,161 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal;
-
-import java.util.HashSet;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Listens to resource deltas and filters for marker changes of type IMarker.PROBLEM
- * Viewers showing error ticks should register as listener to
- * this type.
- * 
- * Code taken from org.eclipse.jdt.internal.ui.viewsupport.ProblemMarkerManager
- */
-public class ProblemMarkerManager implements IResourceChangeListener {
-
-	/**
-	 * Visitors used to look if the element change delta contains a marker change.
-	 */
-	private static class ProjectErrorVisitor implements IResourceDeltaVisitor {
-
-		private HashSet<IResource> fChangedElements; 
-		
-		public ProjectErrorVisitor(HashSet<IResource> changedElements) {
-			fChangedElements= changedElements;
-		}
-			
-		public boolean visit(IResourceDelta delta) throws CoreException {
-			IResource res= delta.getResource();
-			if (res instanceof IProject && delta.getKind() == IResourceDelta.CHANGED) {
-				IProject project= (IProject) res;
-				if (!project.isAccessible()) {
-					// only track open Java projects
-					return false;
-				}
-			}
-			checkInvalidate(delta, res);
-			return true;
-		}
-		
-		private void checkInvalidate(IResourceDelta delta, IResource resource) {
-			int kind= delta.getKind();
-			if (kind == IResourceDelta.REMOVED || kind == IResourceDelta.ADDED || (kind == IResourceDelta.CHANGED && isErrorDelta(delta))) {
-				// invalidate the resource and all parents
-				while (resource.getType() != IResource.ROOT && fChangedElements.add(resource)) {
-					resource= resource.getParent();
-				}
-			} 
-		}	
-		
-		private boolean isErrorDelta(IResourceDelta delta) {	
-			if ((delta.getFlags() & IResourceDelta.MARKERS) != 0) {
-				IMarkerDelta[] markerDeltas= delta.getMarkerDeltas();
-				for (int i= 0; i < markerDeltas.length; i++) {
-					if (markerDeltas[i].isSubtypeOf(IMarker.PROBLEM)) {
-						int kind= markerDeltas[i].getKind();
-						if (kind == IResourceDelta.ADDED || kind == IResourceDelta.REMOVED)
-							return true;
-						int severity= markerDeltas[i].getAttribute(IMarker.SEVERITY, -1);
-						int newSeverity= markerDeltas[i].getMarker().getAttribute(IMarker.SEVERITY, -1);
-						if (newSeverity != severity)
-							return true; 
-					}
-				}
-			}
-			return false;
-		}
-	}
-
-	private ListenerList fListeners;
-	
-	
-	public ProblemMarkerManager() {
-		fListeners= new ListenerList();
-	}
-
-	/*
-	 * @see IResourceChangeListener#resourceChanged
-	 */	
-	public void resourceChanged(IResourceChangeEvent event) {
-		HashSet<IResource> changedElements= new HashSet<IResource>();
-		
-		try {
-			IResourceDelta delta= event.getDelta();
-			if (delta != null)
-				delta.accept(new ProjectErrorVisitor(changedElements));
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-
-		if (!changedElements.isEmpty()) {
-			IResource[] changes= (IResource[]) changedElements.toArray(new IResource[changedElements.size()]);
-			fireChanges(changes, true);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see IAnnotationModelListener#modelChanged(IAnnotationModel)
-	 */
-	public void modelChanged(IAnnotationModel model) {
-		// no action
-	}	
-	
-	/**
-	 * Adds a listener for problem marker changes.
-	 */
-	public void addListener(IProblemChangedListener listener) {
-		if (fListeners.isEmpty()) { 
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-		}
-		fListeners.add(listener);
-	}
-
-	/**
-	 * Removes a <code>IProblemChangedListener</code>.
-	 */	
-	public void removeListener(IProblemChangedListener listener) {
-		fListeners.remove(listener);
-		if (fListeners.isEmpty()) {
-			ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-		}
-	}
-	
-	private void fireChanges(final IResource[] changes, final boolean isMarkerChange) {
-		Display display= Display.getCurrent();
-		if (display != null && !display.isDisposed()) {
-			display.asyncExec(new Runnable() {
-				public void run() {		
-					Object[] listeners= fListeners.getListeners();
-					for (int i= 0; i < listeners.length; i++) {
-						IProblemChangedListener curr= (IProblemChangedListener) listeners[i];
-						curr.problemsChanged(changes, isMarkerChange);
-					}	
-				}
-			});
-		}	
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/wizards/NewLibraryMainPage2.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/wizards/NewLibraryMainPage2.java
deleted file mode 100644
index fca51bf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/wizards/NewLibraryMainPage2.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal.wizards;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.library.LibraryManagerFactory;
-import org.eclipse.epf.library.ui.wizards.NewLibraryWizardPage;
-import org.eclipse.epf.library.ui.wizards.NewLibraryWizardPageFactory;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to enter the name, brief description and
- * type for a new method library.
- * 
- * @author Kelvin Low
- * @since 1.2
- * @deprecated
- */
-public class NewLibraryMainPage2 extends WizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = NewLibraryMainPage2.class
-			.getName();
-
-	private static final String TYPE_ID = "typeId"; //$NON-NLS-1$	
-
-	private Text nameText;
-
-	private Text briefDescText;
-
-	private Button[] radioButtons;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewLibraryMainPage2() {
-		super(PAGE_NAME);
-		setTitle(AuthoringUIResources.newLibraryWizardMainPage_title);
-		setDescription(AuthoringUIResources.newLibraryWizardMainPage_description);
-		setImageDescriptor(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/New.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(3, false));
-
-		Label nameLabel = new Label(composite, SWT.NORMAL);
-		nameLabel.setText(AuthoringUIText.NAME_TEXT);
-
-		nameText = new Text(composite, SWT.BORDER);
-		nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		((GridData) nameText.getLayoutData()).horizontalSpan = 2;
-
-		Label briefDescLabel = new Label(composite, SWT.NORMAL);
-		briefDescLabel.setText(AuthoringUIText.DESCRIPTION_TEXT);
-
-		briefDescText = new Text(composite, SWT.BORDER | SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL);
-		briefDescText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		((GridData) briefDescText.getLayoutData()).horizontalSpan = 2;
-		((GridData) briefDescText.getLayoutData()).heightHint = 70;
-		((GridData) briefDescText.getLayoutData()).widthHint = 480;
-
-		Label libraryTypeLabel = new Label(composite, SWT.NORMAL);
-		libraryTypeLabel.setText(AuthoringUIResources.libraryTypeLabel_text);
-
-		Composite typeComposite = new Composite(composite, SWT.NORMAL);
-		typeComposite.setLayout(new GridLayout(2, false));
-		typeComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Map types = LibraryManagerFactory.getInstance().getLibraryTypes();
-		radioButtons = new Button[types.size()];
-		int radioButtonIndex = 0;
-		for (Iterator it = types.keySet().iterator(); it.hasNext();) {
-			String typeId = (String) it.next();
-			String typeName = (String) types.get(typeId);
-			Button radioButton = new Button(typeComposite, SWT.RADIO);
-			radioButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent event) {
-					setPageComplete(isPageComplete());
-					getWizard().getContainer().updateButtons();
-				}
-			});
-			radioButton.setText(typeName);
-			radioButton.setData(TYPE_ID, typeId);
-			radioButtons[radioButtonIndex++] = radioButton;
-		}
-
-		if (radioButtons.length > 0) {
-			radioButtons[0].setSelection(true);
-		}
-
-		addListeners();
-
-		setPageComplete(isPageComplete());
-
-		setControl(composite);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		NewLibraryWizardPage wizardPage = NewLibraryWizardPageFactory
-				.getInstance().getWizardPage(getLibraryType());
-		if (wizardPage != null) {
-			wizardPage.onEnterPage(getLibraryName());
-		}
-		return wizardPage;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		return getLibraryName().length() > 0;
-	}
-
-	/**
-	 * Adds listeners to the wizard controls.
-	 */
-	private void addListeners() {
-		nameText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-	}
-
-	/**
-	 * Returns the library name.
-	 */
-	public String getLibraryName() {
-		return nameText.getText().trim();
-	}
-
-	/**
-	 * Returns the library type selected by the user.
-	 */
-	public String getLibraryType() {
-		for (int i = 0; i < radioButtons.length; i++) {
-			Button radioButton = radioButtons[i];
-			if (radioButton.getSelection()) {
-				return (String) radioButton.getData(TYPE_ID);
-			}
-		}
-		return (String) radioButtons[0].getData(TYPE_ID);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/wizards/NewLibraryWizard2.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/wizards/NewLibraryWizard2.java
deleted file mode 100644
index 1c7d21e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/internal/wizards/NewLibraryWizard2.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.internal.wizards;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.authoring.ui.AuthoringPerspective;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.wizards.NewLibraryMainPage;
-import org.eclipse.epf.authoring.ui.wizards.SaveAllEditorsPage;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.library.LibraryManagerFactory;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.ui.wizards.NewLibraryWizardPage;
-import org.eclipse.epf.library.ui.wizards.NewLibraryWizardPageFactory;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that guides the user to create a new method library.
- * 
- * @author Kelvin Low
- * @since 1.2
- * @deprecated
- */
-public class NewLibraryWizard2 extends Wizard implements INewWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = NewLibraryWizard2.class.getName();
-
-	// The main wizard page.
-	private NewLibraryMainPage mainPage;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewLibraryWizard2() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		setWindowTitle(AuthoringUIResources.newLibraryWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		SaveAllEditorsPage.addPageIfNeeded(this, true, null, null, null);
-		mainPage = new NewLibraryMainPage();
-		addPage(mainPage);
-
-		for (Iterator it = LibraryManagerFactory.getInstance()
-				.getLibraryTypes().keySet().iterator(); it.hasNext();) {
-			String persistenceId = (String) it.next();
-			String pageId = persistenceId + "Page"; //$NON-NLS-1$
-			NewLibraryWizardPage page = NewLibraryWizardPageFactory
-					.getInstance().createWizardPage(pageId, persistenceId);
-			if (page != null) {
-				page.setImageDescriptor(AuthoringUIPlugin.getDefault()
-						.getImageDescriptor("full/wizban/New.gif")); //$NON-NLS-1$					
-				addPage(page);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				AuthoringUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MethodLibrary.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
-	 */
-	public boolean canFinish() {
-		IWizardPage[] pages = getPages();
-		for (int i = 1; i < pages.length; i++) {
-			if (!pages[i].isPageComplete()) {
-				return false;
-			}
-		}
-		return getContainer().getCurrentPage() != mainPage;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		String name = mainPage.getLibraryName();
-		String type = mainPage.getLibraryType();
-		NewLibraryWizardPage page = NewLibraryWizardPageFactory.getInstance()
-				.getWizardPage(type);
-		try {
-			MethodLibrary library = LibraryService.getInstance()
-					.createMethodLibrary(name, type, page.getSelections());
-			if (library != null) {
-				addRecentlyOpenedLibrary(library);
-				PerspectiveUtil
-						.openPerspective(AuthoringPerspective.PERSPECTIVE_ID);
-				return true;
-			}
-		} catch (Exception e) {
-			String reason = e.getMessage();
-			if (reason == null) {
-				reason = AuthoringUIResources.newLibraryInternlError_reason;
-			}
-			reason += "\n\n" + AuthoringUIResources.newLibraryError_advice;  //$NON-NLS-1$
-			if (e.getMessage() != null) {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						AuthoringUIResources.newLibraryWizard_title,
-						AuthoringUIResources.newLibraryError_msg, reason);
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						AuthoringUIResources.newLibraryWizard_title,
-						AuthoringUIResources.newLibraryError_msg, reason, e);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Adds the newly opened or created method library to the recently opened
-	 * method libraries preference.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	protected void addRecentlyOpenedLibrary(MethodLibrary library) {
-		if (library != null) {
-			String libraryURI = LibraryService.getInstance().getLibraryManager(
-					library).getMethodLibraryURI().toString();
-			LibraryUIPreferences.addOpenLibraryURI(libraryURI);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/package.html
deleted file mode 100644
index baebb00..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides UI services for the Authoring and Browsing perspectives.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/ApplicationPreferenceConstants.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/ApplicationPreferenceConstants.java
deleted file mode 100644
index e805eef..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/ApplicationPreferenceConstants.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.prefs.PreferenceConstants;
-
-/**
- * 
- * Preference constants for application
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Jinhua Xi
- * @since 1.0
- * 
- */
-public class ApplicationPreferenceConstants implements PreferenceConstants {
-	
-	public static final String PREF_ENABLE_PROCESS_CONTRIBUTION = LibraryEditConstants.PREF_ENABLE_PROCESS_CONTRIBUTION;
-
-	public static final String PREF_INHERIT_SUPPRESSION_STATE = LibraryEditConstants.PREF_INHERIT_SUPPRESSION_STATE;
-	
-	public static final String PREF_LIB_VIEW_LAYOUT = "layout"; //$NON-NLS-1$
-	
-	public static final String PREF_LIB_VIEW_DND_DEFAULT_LINKTYPE = "libViewDNDDefaultLinkType"; //$NON-NLS-1$
-
-	/**
-	 * Saves the URI of the method library that was opened in the last session.
-	 */
-	public static void setLayout(String value) {
-		AuthoringUIPlugin.getDefault().getPreferenceStore().setValue(
-				PREF_LIB_VIEW_LAYOUT, value);
-	}
-
-	/**
-	 * Gets the type of the method library that was opened in the last session.
-	 */
-	public static String getLayout() {
-		return AuthoringUIPlugin.getDefault().getPreferenceStore().getString(
-				PREF_LIB_VIEW_LAYOUT);
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringPreferenceInitializer.java
deleted file mode 100644
index be0ad18..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringPreferenceInitializer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-
-/**
- * PreferenceInitializer for AuthoringPlugin.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class AuthoringPreferenceInitializer extends
-		AbstractPreferenceInitializer {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = AuthoringUIPlugin.getDefault()
-				.getPreferenceStore();
-
-		// We don't need it here. It's been moved to libraryPlugin
-//		store.setDefault(ApplicationPreferenceConstants.PREF_WBS_COLUMNS,
-//				ProcessEditorPreferencePage
-//						.toString(ProcessEditor.DEFAULT_WBS_COLUMNS));
-//		store.setDefault(ApplicationPreferenceConstants.PREF_TBS_COLUMNS,
-//				ProcessEditorPreferencePage
-//						.toString(ProcessEditor.DEFAULT_TBS_COLUMNS));
-//		store.setDefault(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS,
-//				ProcessEditorPreferencePage
-//						.toString(ProcessEditor.DEFAULT_WPBS_COLUMNS));
-//		store.setDefault(
-//				ApplicationPreferenceConstants.PREF_INHERIT_SUPPRESSION_STATE,
-//				true);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringPreferencePage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringPreferencePage.java
deleted file mode 100644
index a5ab573..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringPreferencePage.java
+++ /dev/null
@@ -1,278 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.common.ui.util.CommonPreferences;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.ui.preferences.BasePreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * The Authoring preference page.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class AuthoringPreferencePage extends BasePreferencePage implements
-		ModifyListener {
-
-	private static int MIN_PREFERENCE_HISTORY_SIZE = 1;
-
-	private static int MAX_PREFERENCE_HISTORY_SIZE = 20;
-
-	private Composite composite;
-
-	private Text defaultLibraryPathText;
-
-	private Button browseButton;
-
-	private Button discardUnresolvedReferencesCheckbox;
-
-	private Button useNewExtendsSemanticsCheckbox;
-
-	private Button enableLibraryValidationCheckbox;
-
-	private Text preferenceHistorySizeText;
-
-	/**
-	 * Creates and returns the SWT control for the customized body of this
-	 * preference page under the given parent composite.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return the new control
-	 */
-	protected Control createContents(Composite parent) {
-		composite = createGridLayoutComposite(parent, 1);
-
-		// Create the Method library group.
-		Group libraryGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.methodLibraryGroup_text, 3);
-
-		createLabel(libraryGroup, AuthoringUIResources.defaultPathLabel_text);
-		defaultLibraryPathText = createEditableText(libraryGroup);
-		browseButton = createButton(libraryGroup,
-				AuthoringUIText.BROWSE_BUTTON_TEXT);
-
-		discardUnresolvedReferencesCheckbox = createCheckbox(libraryGroup,
-				AuthoringUIResources.discardunresolvedref, 3);
-
-		// Create the Modeling group.
-		Group modelingGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.modelingGroup_text, 1);
-
-		useNewExtendsSemanticsCheckbox = createCheckbox(modelingGroup,
-				AuthoringUIResources.extend_semantics_button_text);
-
-		// Create the UI group.
-		Group userInterfaceGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.userInterfaceGroup_text, 2);
-
-		createLabel(userInterfaceGroup,
-				AuthoringUIResources.default_list_length_label);
-		preferenceHistorySizeText = createEditableText(userInterfaceGroup,
-				"", 25); //$NON-NLS-1$
-
-		// Create the debug group.
-		Group debugGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.debugGroup_text, 2);
-
-		enableLibraryValidationCheckbox = createCheckbox(debugGroup,
-				AuthoringUIResources.enableLibraryValidationCheckbox_text);
-
-		initControls();
-
-		addListeners();
-
-		return composite;
-	}
-
-	/**
-	 * Initializes the preference page controls with data.
-	 */
-	protected void initControls() {
-		defaultLibraryPathText.setText(LibraryUIPreferences
-				.getDefaultLibraryPath());
-
-		discardUnresolvedReferencesCheckbox.setSelection(LibraryPreferences
-				.getDiscardUnresolvedReferences());
-
-		useNewExtendsSemanticsCheckbox.setSelection(LibraryPreferences
-				.getUseNewExtendsSemantics());
-
-		preferenceHistorySizeText.setText("" //$NON-NLS-1$
-				+ CommonPreferences.getPreferenceHistorySize()); 
-
-		enableLibraryValidationCheckbox.setSelection(AuthoringUIPreferences
-				.getEnableLibraryValidation());
-	}
-
-	/**
-	 * Adds event listeners to the preference page controls.
-	 */
-	protected void addListeners() {
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				openDirectoryDialog();
-			}
-		});
-
-		preferenceHistorySizeText.addModifyListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.ModifyListener#modifyText(ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-		setErrorMessage(null);
-		setValid(true);
-
-		int value = 0;
-		if (e.widget == preferenceHistorySizeText) {
-			value = getPreferenceHistorySize();
-			if (value < MIN_PREFERENCE_HISTORY_SIZE
-					|| value > MAX_PREFERENCE_HISTORY_SIZE) {
-				setErrorMessage(AuthoringUIResources
-						.bind(
-								AuthoringUIResources.invalidPreferenceHistorySizeError_msg,
-								new Object[] {
-										new Integer(MIN_PREFERENCE_HISTORY_SIZE),
-										new Integer(MAX_PREFERENCE_HISTORY_SIZE) }));
-				setValid(false);
-			}
-		}
-	}
-
-	/**
-	 * Performs special processing when this page's Defaults button has been
-	 * pressed.
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-
-		String defaultLibraryPath = LibraryUIPreferences
-				.getInitialDefaultLibraryPath();
-		LibraryUIPreferences.setDefaultLibraryPath(defaultLibraryPath);
-		defaultLibraryPathText.setText(defaultLibraryPath);
-
-		boolean discardUnresolvedReferences = LibraryPreferences
-				.getDefaultDiscardUnresolvedReferences();
-		LibraryPreferences
-				.setDiscardUnresolvedReferences(discardUnresolvedReferences);
-		discardUnresolvedReferencesCheckbox
-				.setSelection(discardUnresolvedReferences);
-
-		boolean useNewExtendsSemantics = LibraryPreferences
-				.getDefaultUseNewExtendsSemantics();
-		LibraryPreferences.setUseNewExtendsSemantics(useNewExtendsSemantics);
-		useNewExtendsSemanticsCheckbox.setSelection(useNewExtendsSemantics);
-
-		int preferenceHistorySize = CommonPreferences
-				.getDefaultPreferenceHistorySize();
-		CommonPreferences.setPreferenceHistorySize(preferenceHistorySize);
-		preferenceHistorySizeText.setText("" + preferenceHistorySize); //$NON-NLS-1$
-
-		boolean enableLibraryValidation = AuthoringUIPreferences
-				.getDefaultEnableLibraryValidation();
-		AuthoringUIPreferences
-				.setEnableLibraryValidation(enableLibraryValidation);
-		enableLibraryValidationCheckbox.setSelection(enableLibraryValidation);
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		LibraryUIPreferences.setDefaultLibraryPath(getDefaultLibraryPath());
-		LibraryPreferences
-				.setDiscardUnresolvedReferences(getDiscardUnresolvedReferences());
-		LibraryPreferences
-				.setUseNewExtendsSemantics(getUseNewExtendsSemantics());
-		CommonPreferences.setPreferenceHistorySize(getPreferenceHistorySize());
-		AuthoringUIPreferences
-			.setEnableLibraryValidation(getEnableLibraryValidation());
-		
-		// update the settings for browsing
-		LibraryUIPlugin.getDefault().updateLayoutSettings();
-
-		return true;
-	}
-
-	/**
-	 * Gets the user specified default method library path.
-	 */
-	protected String getDefaultLibraryPath() {
-		return defaultLibraryPathText.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified discard unresolved references preference.
-	 */
-	protected boolean getDiscardUnresolvedReferences() {
-		return discardUnresolvedReferencesCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified use new extends semantics preference.
-	 */
-	protected boolean getUseNewExtendsSemantics() {
-		return useNewExtendsSemanticsCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified prefefrence history size.
-	 */
-	protected int getPreferenceHistorySize() {
-		return StrUtil.getIntValue(preferenceHistorySizeText.getText().trim(),
-				0);
-	}
-	
-	/**
-	 * Gets the enabled library validation preference
-	 * @return
-	 */
-	protected boolean getEnableLibraryValidation() {
-		return enableLibraryValidationCheckbox.getSelection();
-	}
-
-	/**
-	 * Opens the directory dialog.
-	 */
-	private void openDirectoryDialog() {
-		try {
-			DirectoryDialog dd = new DirectoryDialog(composite.getShell(),
-					SWT.NONE);
-			String path = dd.open();
-			if (path != null) {
-				defaultLibraryPathText.setText(path);
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringUIPreferences.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringUIPreferences.java
deleted file mode 100644
index 47f74dd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/AuthoringUIPreferences.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Manages the Authoring UI preferences.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class AuthoringUIPreferences {
-
-	public static final String ENABLE_LIBRARY_VALIDATION = "enabledLibraryValidation"; //$NON-NLS-1$
-
-	private static final boolean DEFAULT_ENABLE_LIBRARY_VALIDATION = false;
-
-	// The plug-in specific preference store.
-	private static IPreferenceStore prefStore = AuthoringUIPlugin.getDefault()
-			.getPreferenceStore();
-	static {
-		// Initialize the default preference values.
-		prefStore.setDefault(ENABLE_LIBRARY_VALIDATION,
-				DEFAULT_ENABLE_LIBRARY_VALIDATION);
-	}
-
-	/**
-	 * Gets the default enable method library validation preference.
-	 */
-	public static boolean getDefaultEnableLibraryValidation() {
-		return DEFAULT_ENABLE_LIBRARY_VALIDATION;
-	}
-
-	/**
-	 * Gets the method library validation preference.
-	 */
-	public static boolean getEnableLibraryValidation() {
-		return prefStore.getBoolean(ENABLE_LIBRARY_VALIDATION);
-	}
-
-	/**
-	 * Sets the method library validation preference.
-	 */
-	public static void setEnableLibraryValidation(boolean value) {
-		prefStore.setValue(ENABLE_LIBRARY_VALIDATION, value);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/BreakdownElementPrefPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/BreakdownElementPrefPage.java
deleted file mode 100644
index 2164467..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/BreakdownElementPrefPage.java
+++ /dev/null
@@ -1,252 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.ui.PreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.ui.preferences.BasePreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * Preference page for breakdown element attributes
- * 
- * @author Shilpa Toraskar
- * @since 1.2
- * 
- */
-public class BreakdownElementPrefPage extends BasePreferencePage implements
-		IWorkbenchPreferencePage, SelectionListener {
-
-	Composite composite;
-
-	private Button workBreakdownElementOptionalButton,
-			workBreakdownElementMultipleOccurrancesButton,
-			workBreakdownElementPlannedButton,
-			workBreakdownElementEventDrivenButton,
-			workBreakdownElementOngoingButton,
-			workBreakdownElementRepetableButton;
-
-	private Button descriptorOptionalButton,
-			descriptorMultipleOccurrancesButton, descriptorPlannedButton,
-			descriptorEventDrivenButton, descriptorOngoingButton,
-			descriptorRepetableButton;
-
-	public BreakdownElementPrefPage() {
-		super();
-	}
-
-	protected Control createContents(Composite parent) {
-
-		composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout(1, false));
-
-		createLabel(composite,
-				AuthoringUIResources.preference_breakDownElement_Description);
-
-		createLabel(composite, ""); //$NON-NLS-1$
-
-		// create group for activity elements
-		Group workBreakdownElementGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.preference_WorkBreakdownElements, 1, true);
-
-		workBreakdownElementOptionalButton = createCheckbox(
-				workBreakdownElementGroup,
-				AuthoringUIResources.ProcessEditor_Optional);
-		workBreakdownElementMultipleOccurrancesButton = createCheckbox(
-				workBreakdownElementGroup,
-				AuthoringUIResources.ProcessEditor_MultipleOccurrences);
-		workBreakdownElementPlannedButton = createCheckbox(
-				workBreakdownElementGroup,
-				AuthoringUIResources.ProcessEditor_Planned);
-		workBreakdownElementEventDrivenButton = createCheckbox(
-				workBreakdownElementGroup,
-				AuthoringUIResources.ProcessEditor_EventDriven);
-		workBreakdownElementOngoingButton = createCheckbox(
-				workBreakdownElementGroup,
-				AuthoringUIResources.ProcessEditor_Ongoing);
-		workBreakdownElementRepetableButton = createCheckbox(
-				workBreakdownElementGroup,
-				AuthoringUIResources.ProcessEditor_Repetable);
-
-		// create group for descriptor elements
-		Group descriptorGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.preference_DescriptorElements, 1, true);
-		descriptorOptionalButton = createCheckbox(descriptorGroup,
-				AuthoringUIResources.ProcessEditor_Optional);
-		descriptorMultipleOccurrancesButton = createCheckbox(descriptorGroup,
-				AuthoringUIResources.ProcessEditor_MultipleOccurrences);
-		descriptorPlannedButton = createCheckbox(descriptorGroup,
-				AuthoringUIResources.ProcessEditor_Planned);
-		descriptorEventDrivenButton = createCheckbox(descriptorGroup,
-				AuthoringUIResources.ProcessEditor_EventDriven);
-		descriptorOngoingButton = createCheckbox(descriptorGroup,
-				AuthoringUIResources.ProcessEditor_Ongoing);
-		descriptorRepetableButton = createCheckbox(descriptorGroup,
-				AuthoringUIResources.ProcessEditor_Repetable);
-
-		// Initialize values
-		initializeValues();
-
-		return composite;
-	}
-
-	public void init(IWorkbench workbench) {
-
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PreferencePage
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		initializeDefaults();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PreferencePage
-	 */
-	public boolean performOk() {
-		storeValues();
-		LibraryUIPlugin.getDefault().savePluginPreferences();
-		LibraryUIPreferences.applyDefaultValuesForBreakdownElementAttributes();
-		return true;
-	}
-
-	/**
-	 * Stores the values of the controls back to the preference store.
-	 */
-	private void storeValues() {
-		//
-		LibraryUIPreferences
-				.setWorkBreakdownElementOptional(workBreakdownElementOptionalButton
-						.getSelection());
-		LibraryUIPreferences
-				.setWorkBreakdownElementMultipleOccurrances(workBreakdownElementMultipleOccurrancesButton
-						.getSelection());
-		LibraryUIPreferences
-				.setWorkBreakdownElementPlanned(workBreakdownElementPlannedButton
-						.getSelection());
-		LibraryUIPreferences
-				.setWorkBreakdownElementEventDriven(workBreakdownElementEventDrivenButton
-						.getSelection());
-		LibraryUIPreferences
-				.setWorkBreakdownElementOngoing(workBreakdownElementOngoingButton
-						.getSelection());
-		LibraryUIPreferences
-				.setWorkBreakdownElementRepeatable(workBreakdownElementRepetableButton
-						.getSelection());
-
-		LibraryUIPreferences.setDescriptorOptional(descriptorOptionalButton
-				.getSelection());
-		LibraryUIPreferences
-				.setDescriptorMultipleOccurrances(descriptorMultipleOccurrancesButton
-						.getSelection());
-		LibraryUIPreferences.setDescriptorPlanned(descriptorPlannedButton
-				.getSelection());
-		LibraryUIPreferences
-				.setDescriptorEventDriven(descriptorEventDrivenButton
-						.getSelection());
-		LibraryUIPreferences.setDescriptorOngoing(descriptorOngoingButton
-				.getSelection());
-		LibraryUIPreferences.setDescriptorRepeatable(descriptorRepetableButton
-				.getSelection());
-
-	}
-
-	/**
-	 * Initializes default states of the controls from the preference store.
-	 */
-	private void initializeDefaults() {
-		
-		workBreakdownElementOptionalButton.setSelection(false);
-		workBreakdownElementMultipleOccurrancesButton.setSelection(false);
-		workBreakdownElementPlannedButton.setSelection(true);
-		workBreakdownElementEventDrivenButton.setSelection(false);
-		workBreakdownElementOngoingButton.setSelection(false);
-		workBreakdownElementRepetableButton.setSelection(false);
-
-		descriptorOptionalButton.setSelection(false);
-		descriptorMultipleOccurrancesButton.setSelection(false);
-		descriptorPlannedButton.setSelection(false);
-		descriptorEventDrivenButton.setSelection(false);
-		descriptorOngoingButton.setSelection(false);
-		descriptorRepetableButton.setSelection(false);
-	}
-
-	/**
-	 * Initializes states of the controls from the preference store.
-	 */
-	private void initializeValues() {
-	
-		workBreakdownElementOptionalButton.setSelection(LibraryUIPreferences
-				.getWorkBreakDownElementOptional());
-		workBreakdownElementMultipleOccurrancesButton
-				.setSelection(LibraryUIPreferences
-						.getWorkBreakDownElementMultipleOccurrances());
-		workBreakdownElementPlannedButton.setSelection(LibraryUIPreferences
-				.getWorkBreakDownElementPlanned());
-		workBreakdownElementEventDrivenButton.setSelection(LibraryUIPreferences
-				.getWorkBreakDownElementEventDriven());
-		workBreakdownElementOngoingButton.setSelection(LibraryUIPreferences
-				.getWorkBreakDownElementOngoing());
-		workBreakdownElementRepetableButton.setSelection(LibraryUIPreferences
-				.getWorkBreakDownElementRepeatable());
-
-		descriptorOptionalButton.setSelection(LibraryUIPreferences
-				.getDescriptorOptional());
-		descriptorMultipleOccurrancesButton.setSelection(LibraryUIPreferences
-				.getDescriptorMultipleOccurrances());
-		descriptorPlannedButton.setSelection(LibraryUIPreferences
-				.getDescriptorPlanned());
-		descriptorEventDrivenButton.setSelection(LibraryUIPreferences
-				.getDescriptorEventDriven());
-		descriptorOngoingButton.setSelection(LibraryUIPreferences
-				.getDescriptorOngoing());
-		descriptorRepetableButton.setSelection(LibraryUIPreferences
-				.getDescriptorRepeatable());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.preferences.CommonPrefPage#doGetPreferenceStore()
-	 */
-	protected IPreferenceStore doGetPreferenceStore() {
-		IPreferenceStoreWrapper wrapper = LibraryPlugin.getDefault().getPreferenceStore();
-		if ( wrapper instanceof PreferenceStoreWrapper ) {
-			return ((PreferenceStoreWrapper)wrapper).getStore();
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/CommonPrefPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/CommonPrefPage.java
deleted file mode 100644
index d51be52..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/CommonPrefPage.java
+++ /dev/null
@@ -1,136 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.ui.PreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-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.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Preference page for common options
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- *
- */
-public class CommonPrefPage extends PreferencePage {
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		// do nothing in this common preference page
-		return null;
-	}
-
-	protected Composite createGridComposite(Composite parent, int numColumns) {
-
-		Composite composite = new Composite(parent, SWT.NULL);
-
-		// GridLayout
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		composite.setLayout(layout);
-
-		// GridData
-		GridData data = new GridData();
-		data.verticalAlignment = GridData.FILL;
-		data.horizontalAlignment = GridData.FILL;
-		composite.setLayoutData(data);
-
-		return composite;
-	}
-
-	protected void openDirectoryDialog(Composite parent, Text path_ctr) {
-		try {
-			DirectoryDialog dd = new DirectoryDialog(parent.getShell(),
-					SWT.NONE);
-
-			String destination = dd.open();
-			if (destination != null) {
-				path_ctr.setText(destination);
-			}
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	/**
-	 * Method to create a Label
-	 * @param parent parent composite of the Label
-	 * @param text Label text
-	 * @param span horizontal span
-	 * @return the newly created Label
-	 */
-	protected Label createLabel(Composite parent, String text, int span) {
-		Label label = new Label(parent, SWT.LEFT);
-		label.setText(text);
-		GridData data = new GridData();
-		data.horizontalSpan = span;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		return label;
-	}
-
-	/**
-	 * Method to create a radio button
-	 * @param parent parent composite of the button
-	 * @param label the button label
-	 * @return the newly created Radio Button
-	 */
-	protected Button createRadioButton(Composite parent, String label) {
-		Button button = new Button(parent, SWT.RADIO | SWT.LEFT);
-		button.setText(label);
-		GridData data = new GridData();
-		button.setLayoutData(data);
-		return button;
-	}
-
-	/**
-	 * Method to create a line
-	 * @param parent parent composite of the line
-	 * @param ncol horizontal span
-	 */
-	protected void createLine(Composite parent, int ncol) {
-		Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = ncol;
-		line.setLayoutData(gridData);
-	}
-
-	/**
-	 * return the preference store
-	 */
-	protected IPreferenceStore doGetPreferenceStore() {
-
-		IPreferenceStoreWrapper wrapper = LibraryPlugin.getDefault().getPreferenceStore();
-		if ( wrapper instanceof PreferenceStoreWrapper ) {
-			return ((PreferenceStoreWrapper)wrapper).getStore();
-		}
-		return null;
-		// return PlatformUI.getWorkbench().getPreferenceStore();
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryLocationData.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryLocationData.java
deleted file mode 100644
index 0766b40..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryLocationData.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import java.io.File;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.ui.CommonUIPlugin;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.prefs.LibraryPreferenceConstants;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Location Data for library 
- * 
- * @author BingXue Xu
- * @since 1.0
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=157401
- */
-public class LibraryLocationData {
-
-	private String parentFolder;
-
-	private String libName;
-
-	private String libBriefDescription;
-
-	private boolean isSingleLibFile;
-
-	private boolean defLibDirChecked;
-
-	protected static final String libraryFile = "library.xmi"; //$NON-NLS-1$
-
-	/**
-	 * @return Returns the isOkPressed.
-	 */
-	public boolean isOkPressed() {
-		return isOkPressed;
-	}
-
-	/**
-	 * @param isOkPressed
-	 *            The isOkPressed to set.
-	 */
-	public void setOkPressed(boolean isOkPressed) {
-		this.isOkPressed = isOkPressed;
-	}
-
-	private boolean isOkPressed;
-
-	/**
-	 * @return Returns the isSingleLibFile.
-	 */
-	public boolean isSingleLibFile() {
-		return isSingleLibFile;
-	}
-
-	/**
-	 * @param isSingleLibFile
-	 *            The isSingleLibFile to set.
-	 */
-	public void setSingleLibFile(boolean isSingleLibFile) {
-		this.isSingleLibFile = isSingleLibFile;
-	}
-
-	/**
-	 * @return Returns the libName.
-	 */
-	public String getLibName() {
-		return libName;
-	}
-
-	/**
-	 * 
-	 * @return Full path of library.xmi
-	 */
-	public String getLibraryFile() {
-		return getParentFolder() + File.separator + libraryFile;
-	}
-
-	/**
-	 * @param libName
-	 *            The libName to set.
-	 */
-	public void setLibName(String libName) {
-		this.libName = libName;
-	}
-
-	/**
-	 * @return Returns the parentFolder.
-	 */
-	public String getParentFolder() {
-		return parentFolder;
-	}
-
-	/**
-	 * @param parentFolder
-	 *            The parentFolder to set.
-	 */
-	public void setParentFolder(String parentFolder) {
-		this.parentFolder = parentFolder;
-	}
-
-	/**
-	 * @return Returns the libBriefDescription.
-	 */
-	public String getLibBriefDescription() {
-		return libBriefDescription;
-	}
-
-	/**
-	 * @param libBriefDescription
-	 *            The libBriefDescription to set.
-	 */
-	public void setLibBriefDescription(String libBriefDescription) {
-		this.libBriefDescription = libBriefDescription;
-	}
-
-	/**
-	 * @return Returns the defLibDirChecked.
-	 */
-	public boolean isDefLibDirChecked() {
-		return defLibDirChecked;
-	}
-
-	/**
-	 * @param defLibDirChecked
-	 *            The defLibDirChecked to set.
-	 */
-	public void setDefLibDirChecked(boolean defLibDirChecked) {
-		this.defLibDirChecked = defLibDirChecked;
-	}
-
-	/**
-	 * Loads preferences from the store
-	 *
-	 */
-	public void loadFromPreferenceStore() {
-		IPreferenceStoreWrapper store = LibraryPlugin.getDefault()
-				.getPreferenceStore();
-
-		String lastDir = store
-				.getString(LibraryPreferenceConstants.PREF_LAST_LIBRARY_PARENT_DIRECTORY);
-		this.setParentFolder(lastDir);
-
-		boolean lastChecked = store
-				.getBoolean(LibraryPreferenceConstants.PREF_LAST_DEFAULT_DIRECTORY_CHECKED);
-		// the contains method does not seem to work so use last dir as an
-		// approximation if
-		// (store.contains(LibaryPreferenceConstants.PREF_LAST_DEFAULT_DIRECTORY_CHECKED))
-		if (lastDir == null || lastDir.trim().length() == 0)
-			this.setDefLibDirChecked(true);
-		else
-			this.setDefLibDirChecked(lastChecked);
-	}
-
-	/**
-	 * Saves dialog choices to the preference store
-	 *
-	 */
-	public void saveToPreferenceStore() {
-		IPreferenceStoreWrapper store = LibraryPlugin.getDefault()
-				.getPreferenceStore();
-		File file = new File(this.getParentFolder());
-		LibraryUIPreferences.setSavedLibraryPath(file.getAbsolutePath());
-		store.setValue(
-				LibraryPreferenceConstants.PREF_LAST_LIBRARY_PARENT_DIRECTORY,
-				file.getParent());
-		store.setValue(
-				LibraryPreferenceConstants.PREF_LAST_DEFAULT_DIRECTORY_CHECKED,
-				this.isDefLibDirChecked());
-
-		LibraryPlugin.getDefault().savePluginPreferences();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryPreferenceConstants.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryPreferenceConstants.java
deleted file mode 100644
index 23f1c28..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryPreferenceConstants.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.library.prefs.PreferenceConstants;
-
-/**
- * Preference Constants for library
- * @author BingXue Xu
- * @since 1.0
- */
-public interface LibraryPreferenceConstants extends PreferenceConstants {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryPreferenceInitializer.java
deleted file mode 100644
index d1d2478..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryPreferenceInitializer.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.prefs.LibraryPreferenceConstants;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Initializer for library preferences
- * 
- * @author BingXue Xu
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class LibraryPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStoreWrapper store = LibraryPlugin.getDefault()
-				.getPreferenceStore();
-		store.setDefault(LibraryPreferenceConstants.PREF_RADIO_SAVE_CHOICE, 1);
-		
-		store.setDefault(ApplicationPreferenceConstants.PREF_WBS_COLUMNS,
-				ProcessEditorPreferencePage
-						.toString(ProcessEditor.DEFAULT_WBS_COLUMNS));
-		store.setDefault(ApplicationPreferenceConstants.PREF_TBS_COLUMNS,
-				ProcessEditorPreferencePage
-						.toString(ProcessEditor.DEFAULT_TBS_COLUMNS));
-		store.setDefault(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS,
-				ProcessEditorPreferencePage
-						.toString(ProcessEditor.DEFAULT_WPBS_COLUMNS));
-		store.setDefault(
-				ApplicationPreferenceConstants.PREF_INHERIT_SUPPRESSION_STATE,
-				true);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryViewPrefPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryViewPrefPage.java
deleted file mode 100644
index 78b9c45..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/LibraryViewPrefPage.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.DefaultValues;
-import org.eclipse.gmf.runtime.diagram.ui.internal.properties.WorkspaceViewerProperties;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.RadioGroupFieldEditor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * Library view options preference page
- * 
- * @author Jeff Hardy
- * @since 1.2
- */
-public class LibraryViewPrefPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-	
-	public LibraryViewPrefPage() {
-		super(GRID);
-	}
-
-	@Override
-	protected void createFieldEditors() {
-		// TODO Auto-generated method stub
-		Composite parent = getFieldEditorParent();
-		RadioGroupFieldEditor defaultLinkTypeEditor = new RadioGroupFieldEditor(
-	    	     			ApplicationPreferenceConstants.PREF_LIB_VIEW_DND_DEFAULT_LINKTYPE,
-	    	     			AuthoringUIResources.defaultLinkTypePrefLabel, 1,
-	    	     			new String[][] {
-	    	     					{LibraryUIResources.elementLink_name, ResourceHelper.ELEMENT_LINK_CLASS_elementLink},
-	    	     					{LibraryUIResources.elementLinkWithType_name, ResourceHelper.ELEMENT_LINK_CLASS_elementLinkWithType},
-	    	     					{LibraryUIResources.elementLinkWithUserText_name, ResourceHelper.ELEMENT_LINK_CLASS_elementLinkWithUserText}
-	    	     			}, parent, true);
-		defaultLinkTypeEditor.setPreferenceStore(doGetPreferenceStore());
-		addField(defaultLinkTypeEditor);
-	}
-	
-	public void init(IWorkbench workbench) {
-	}
-	
-	protected IPreferenceStore doGetPreferenceStore() {
-		return AuthoringUIPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Initializes printing preferences to their default values.
-	 */
-	public static void initDefaults(IPreferenceStore store) {
-		store.setDefault(ApplicationPreferenceConstants.PREF_LIB_VIEW_DND_DEFAULT_LINKTYPE,
-				ResourceHelper.ELEMENT_LINK_CLASS_elementLink);
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/ProcessEditorPreferencePage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/ProcessEditorPreferencePage.java
deleted file mode 100644
index 3d7beeb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/ProcessEditorPreferencePage.java
+++ /dev/null
@@ -1,691 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.ui.PreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-
-/**
- * Preference page for ProcessEditor
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ProcessEditorPreferencePage extends PreferencePage implements
-		IWorkbenchPreferencePage, SelectionListener, ModifyListener {
-
-	// private Text lineWidthText;
-	// private Button indentCheckbox;
-	// private Text indentSizeText;
-	// private Combo bsCombo;
-	private static final String WBS_TXT = AuthoringUIResources.ProcessEditor_WorkBreakdownStructure; 
-
-	private static final String TBS_TXT = AuthoringUIResources.ProcessEditor_TeamAllocation; 
-
-	private static final String WPBS_TXT = AuthoringUIResources.ProcessEditor_WorkProductUsage; 
-
-	private ListViewer selectedColumnListViewer;
-
-	// private ListViewer tbsSelectedColList;
-	// private ListViewer wpbsSelectedColList;
-	private java.util.List wbsColumnDescriptors;
-
-	private java.util.List tbsColumnDescriptors;
-
-	private java.util.List wpbsColumnDescriptors;
-
-	private Button addButton;
-
-	private Button removeButton;
-
-	private Button downButton;
-
-	private Button upButton;
-
-	private static final String[] BS_NAMES = new String[] { WBS_TXT, TBS_TXT,
-			WPBS_TXT };
-
-	private List[] columnDescriptorLists;
-
-	private static final List[] ALL_COLUMN_DESCRIPTOR_LISTS = new List[] {
-			ProcessEditor.ALL_WBS_COLUMNS, ProcessEditor.ALL_TBS_COLUMNS,
-			ProcessEditor.ALL_WPBS_COLUMNS };
-
-	// configuration switching preference
-	private Button configSwitchAlwaysButton;
-
-	private Button configSwitchNeverButton;
-
-	private Button configSwitchPromptButton;
-
-	private Button inheritSuppressionButton;
-
-	private static class ColumnDescriptorProvider implements
-			ITreeContentProvider, ILabelProvider {
-
-		public ColumnDescriptorProvider() {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return ((java.util.List) inputElement).toArray();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			return ((ColumnDescriptor) element).label;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void addListener(ILabelProviderListener listener) {
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-		 */
-		public void removeListener(ILabelProviderListener listener) {
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
-	 */
-	protected IPreferenceStore doGetPreferenceStore() {
-		IPreferenceStoreWrapper wrapper = LibraryPlugin.getDefault().getPreferenceStore();
-		if ( wrapper instanceof PreferenceStoreWrapper ) {
-			return ((PreferenceStoreWrapper)wrapper).getStore();
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		initData();
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(1, false));
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Composite columnsComposite = new Composite(composite, SWT.NONE);
-		columnsComposite.setLayout(new GridLayout(1, false));
-		columnsComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label label = new Label(columnsComposite, SWT.NONE);
-		label.setText(AuthoringUIResources.columnselection_text); 
-
-		final Combo bsCombo = new Combo(columnsComposite, SWT.READ_ONLY
-				| SWT.BORDER);
-		bsCombo.setItems(BS_NAMES);
-		bsCombo.addSelectionListener(new SelectionListener() {
-
-			public void widgetSelected(SelectionEvent e) {
-				Combo combo = (Combo) e.getSource();
-				int id = combo.getSelectionIndex();
-				if (id != -1) {
-					selectedColumnListViewer
-							.setInput(columnDescriptorLists[id]);
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-
-			}
-
-		});
-		bsCombo.select(0);
-
-		Composite listComposite = new Composite(composite, SWT.NONE);
-		GridLayout layout = new GridLayout(2, false);
-		listComposite.setLayout(layout);
-		listComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Composite subComposite = new Composite(listComposite, SWT.NONE);
-		layout = new GridLayout();
-		layout.marginLeft = 0;
-		layout.marginWidth = 0;
-		subComposite.setLayout(layout);
-		subComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		selectedColumnListViewer = new ListViewer(subComposite, SWT.MULTI
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		final ColumnDescriptorProvider itemProvider = new ColumnDescriptorProvider();
-		selectedColumnListViewer.setContentProvider(itemProvider);
-		selectedColumnListViewer.setLabelProvider(itemProvider);
-		selectedColumnListViewer.setInput(wbsColumnDescriptors);
-		selectedColumnListViewer.addSelectionChangedListener(new ISelectionChangedListener(){
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				List removeList = ((IStructuredSelection) selectedColumnListViewer
-						.getSelection()).toList();
-				if (removeList.contains(ProcessEditor.COL_DESC_ID)
-						|| removeList
-								.contains(ProcessEditor.COL_DESC_PRESENTATION_NAME)) {
-					// if present name or id selected, 
-					// disable "remove","up" and "down" button
-					//
-					if(removeButton.isEnabled()) removeButton.setEnabled(false);
-					if(upButton.isEnabled()) upButton.setEnabled(false);
-					if(downButton.isEnabled()) downButton.setEnabled(false);
-				} else {
-					if(!removeButton.isEnabled()) removeButton.setEnabled(true);
-					if(!upButton.isEnabled()) upButton.setEnabled(true);
-					if(!downButton.isEnabled()) downButton.setEnabled(true);
-				}
-			}
-			
-		});
-		
-	
-		selectedColumnListViewer.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// wbsSelectedColumnsTable.setItems(new String[] {
-		// IBSItemProvider.COL_ID,
-		// IBSItemProvider.COL_IS_EVENT_DRIVEN,
-		// IBSItemProvider.COL_IS_ONGOING,
-		// IBSItemProvider.COL_IS_REPEATABLE,
-		// IBSItemProvider.COL_MODEL_INFO,
-		// IBSItemProvider.COL_NAME,
-		// IBSItemProvider.COL_PREDECESSORS,
-		// IBSItemProvider.COL_PREFIX,
-		// IBSItemProvider.COL_TYPE,
-		// });
-
-		// CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
-		// tabItem.setText("Work Breakdown Structure");
-		// tabItem.setControl(wbsSelectedColumnsTable.getControl());
-
-		// tbsSelectedColList = new ListViewer(columnsComposite, SWT.CHECK |
-		// SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		// tbsSelectedColList.setContentProvider(itemProvider);
-		// tbsSelectedColList.setLabelProvider(itemProvider);
-		// tbsSelectedColList.setInput(tbsColumnDescriptors);
-		// tbsSelectedColList.setItems(new String[] {
-		// IBSItemProvider.COL_ID,
-		// IBSItemProvider.COL_MODEL_INFO,
-		// IBSItemProvider.COL_NAME,
-		// IBSItemProvider.COL_PREFIX,
-		// IBSItemProvider.COL_TYPE,
-		// });
-		// tabItem = new CTabItem(tabFolder, SWT.NONE);
-		// tabItem.setText("Team Breakdown Structure");
-		// tabItem.setControl(tbsSelectedColList.getControl());
-
-		// wpbsSelectedColList = new ListViewer(columnsComposite, SWT.CHECK |
-		// SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		// wpbsSelectedColList.setContentProvider(itemProvider);
-		// wpbsSelectedColList.setLabelProvider(itemProvider);
-		// wpbsSelectedColList.setInput(wpbsColumnDescriptors);
-		// tabItem = new CTabItem(tabFolder, SWT.NONE);
-		// tabItem.setText("Work Product Breakdown Structure");
-		// tabItem.setControl(wpbsSelectedColList.getControl());
-
-		Composite buttonsComposite = new Composite(listComposite, SWT.NONE);
-		buttonsComposite.setLayout(new GridLayout());
-		GridData gridData = new GridData(GridData.GRAB_HORIZONTAL);
-		gridData.widthHint = 100;
-		buttonsComposite.setLayoutData(gridData);
-
-		GridData layoutData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
-
-		addButton = new Button(buttonsComposite, SWT.NONE);
-		addButton.setText(AuthoringUIText.ADD_BUTTON_TEXT);
-		addButton.setLayoutData(layoutData);
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				int id = bsCombo.getSelectionIndex();
-				Object input = ALL_COLUMN_DESCRIPTOR_LISTS[id];
-				final List selectedColumns = columnDescriptorLists[id];
-				ListSelectionDialog dlg = new ListSelectionDialog(
-						Display.getCurrent().getActiveShell(),
-						input,
-						itemProvider,
-						itemProvider,
-						AuthoringUIResources.selectColumnstoAdd_text) { 
-					protected Control createDialogArea(Composite parent) {
-						Control control = super.createDialogArea(parent);
-						getViewer().addFilter(new ViewerFilter() {
-
-							public boolean select(Viewer viewer,
-									Object parentElement, Object element) {
-								return !selectedColumns.contains(element);
-							}
-
-						});
-						return control;
-					}
-
-				};
-				if (dlg.open() == Window.OK) {
-					selectedColumns.addAll(Arrays.asList(dlg.getResult()));
-					selectedColumnListViewer.refresh();
-				}
-
-			}
-		});
-
-		removeButton = new Button(buttonsComposite, SWT.NONE);
-		removeButton.setText(AuthoringUIResources.removeButton_text); 
-		removeButton.setLayoutData(layoutData);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				java.util.List columns = (java.util.List) selectedColumnListViewer
-						.getInput();
-				List removeList = ((IStructuredSelection) selectedColumnListViewer
-						.getSelection()).toList();
-				if (removeList.contains(ProcessEditor.COL_DESC_ID)
-						|| removeList
-								.contains(ProcessEditor.COL_DESC_PRESENTATION_NAME)) {
-					// cannot remove name or ID column
-					//
-					return;
-				}
-				columns.removeAll(removeList);
-				selectedColumnListViewer.refresh();
-			}
-
-		});
-
-		upButton = new Button(buttonsComposite, SWT.NONE);
-		upButton.setText(AuthoringUIText.UP_BUTTON_TEXT);
-		upButton.setLayoutData(layoutData);
-		upButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) selectedColumnListViewer
-						.getSelection();
-				if (selection.size() > 1)
-					return;
-				EList columns = (EList) selectedColumnListViewer.getInput();
-				Object selected = selection.getFirstElement();
-				int id = columns.indexOf(selected);
-				if (bsCombo.getSelectionIndex() == 0 && id < 3)
-					return;
-				if (bsCombo.getSelectionIndex() > 0 && id < 2)
-					return;
-				columns.move(id - 1, id);
-				selectedColumnListViewer.refresh();
-				selectedColumnListViewer.setSelection(new StructuredSelection(
-						selected), true);
-			}
-
-		});
-
-		downButton = new Button(buttonsComposite, SWT.NONE);
-		downButton.setText(AuthoringUIText.DOWN_BUTTON_TEXT);
-		downButton.setLayoutData(layoutData);
-		downButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) selectedColumnListViewer
-						.getSelection();
-				if (selection.size() > 1)
-					return;
-				EList columns = (EList) selectedColumnListViewer.getInput();
-				Object selected = selection.getFirstElement();
-				int id = columns.indexOf(selected);
-				
-				if (id == columns.size() - 1 || (bsCombo.getSelectionIndex() == 0 && id < 2))
-					return;
-				if (id == columns.size() - 1 || (bsCombo.getSelectionIndex() > 0 && id < 1))
-					return;
-				columns.move(id + 1, id);
-				selectedColumnListViewer.refresh();
-				selectedColumnListViewer.setSelection(new StructuredSelection(
-						selected), true);
-			}
-
-		});
-
-		Group configSwitchGroup = new Group(composite, SWT.SHADOW_OUT);
-		configSwitchGroup.setLayout(new GridLayout(3, false));
-		configSwitchGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		configSwitchGroup
-				.setText(AuthoringUIResources.ProcessEditorPreferencePage_switchConfiguration); 
-
-		configSwitchAlwaysButton = new Button(configSwitchGroup, SWT.RADIO);
-		configSwitchAlwaysButton.setText(LibraryUIResources.alwaysButton_text);
-		configSwitchNeverButton = new Button(configSwitchGroup, SWT.RADIO);
-		configSwitchNeverButton.setText(LibraryUIResources.neverButton_text);
-		configSwitchPromptButton = new Button(configSwitchGroup, SWT.RADIO);
-		configSwitchPromptButton.setText(LibraryUIResources.promptButton_text);
-
-		setSwitchConfigButton(LibraryUIPreferences.getSwitchConfig());
-
-		// inherit suppression states
-		Group suppressionGroup = new Group(composite, SWT.SHADOW_OUT);
-		suppressionGroup.setLayout(new GridLayout());
-		suppressionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		suppressionGroup
-				.setText(AuthoringUIResources.ProcessEditorPreferencePage_suppressionGroupTitle); 
-
-		inheritSuppressionButton = new Button(suppressionGroup, SWT.CHECK);
-		inheritSuppressionButton
-				.setText(AuthoringUIResources.ProcessEditorPreferencePage_inheritSuppressionState); 
-
-		inheritSuppressionButton.setSelection(getPreferenceStore().getBoolean(
-				ApplicationPreferenceConstants.PREF_INHERIT_SUPPRESSION_STATE));
-		return composite;
-	}
-
-	/**
-	 * Loads data from preference store
-	 */
-	private void initData() {
-		IPreferenceStore store = getPreferenceStore();
-
-		String str = store
-				.getString(ApplicationPreferenceConstants.PREF_WBS_COLUMNS);
-		if (str == null) {
-			str = store
-					.getDefaultString(ApplicationPreferenceConstants.PREF_WBS_COLUMNS);
-		}
-		wbsColumnDescriptors = ProcessEditor.toColumnDescriptorList(str);
-
-		str = store.getString(ApplicationPreferenceConstants.PREF_TBS_COLUMNS);
-		if (str == null) {
-			str = store
-					.getDefaultString(ApplicationPreferenceConstants.PREF_TBS_COLUMNS);
-		}
-		tbsColumnDescriptors = ProcessEditor.toColumnDescriptorList(str);
-
-		str = store.getString(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS);
-		if (str == null) {
-			str = store
-					.getDefaultString(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS);
-		}
-		wpbsColumnDescriptors = ProcessEditor.toColumnDescriptorList(str);
-
-		// load and set to the default if nothing in the store
-		// 154758 - Processes: WBS is blank as default preference is not set for the first time
-		if ( wbsColumnDescriptors.size() == 0 ) {
-			wbsColumnDescriptors.addAll(ProcessEditor.DEFAULT_WBS_COLUMNS);
-			store.setValue(ApplicationPreferenceConstants.PREF_WBS_COLUMNS,
-					toString(wbsColumnDescriptors));
-		
-		}
-		
-		if ( tbsColumnDescriptors.size() == 0 ) {
-			tbsColumnDescriptors.addAll(ProcessEditor.DEFAULT_TBS_COLUMNS);
-			store.setValue(ApplicationPreferenceConstants.PREF_TBS_COLUMNS,
-					toString(tbsColumnDescriptors));
-		}
-		
-		if ( wpbsColumnDescriptors.size() == 0 ) {
-			wpbsColumnDescriptors.addAll(ProcessEditor.DEFAULT_WPBS_COLUMNS);
-			store.setValue(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS,
-					toString(wpbsColumnDescriptors));
-		}
-		
-		columnDescriptorLists = new List[] { wbsColumnDescriptors,
-				tbsColumnDescriptors, wpbsColumnDescriptors };
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage.performDefaults
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-
-		wbsColumnDescriptors.clear();
-		wbsColumnDescriptors.addAll(ProcessEditor.DEFAULT_WBS_COLUMNS);
-
-		tbsColumnDescriptors.clear();
-		tbsColumnDescriptors.addAll(ProcessEditor.DEFAULT_TBS_COLUMNS);
-
-		wpbsColumnDescriptors.clear();
-		wpbsColumnDescriptors.addAll(ProcessEditor.DEFAULT_WPBS_COLUMNS);
-
-		inheritSuppressionButton
-				.setSelection(getPreferenceStore()
-						.getDefaultBoolean(
-								ApplicationPreferenceConstants.PREF_INHERIT_SUPPRESSION_STATE));
-
-		setSwitchConfigButton(MessageDialogWithToggle.PROMPT);
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		IPreferenceStore store = getPreferenceStore();
-
-		store.setValue(ApplicationPreferenceConstants.PREF_WBS_COLUMNS,
-				toString(wbsColumnDescriptors));
-		store.setValue(ApplicationPreferenceConstants.PREF_TBS_COLUMNS,
-				toString(tbsColumnDescriptors));
-		store.setValue(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS,
-				toString(wpbsColumnDescriptors));
-		store.setValue(
-				ApplicationPreferenceConstants.PREF_INHERIT_SUPPRESSION_STATE,
-				inheritSuppressionButton.getSelection());
-		// switch config preference is in library.ui
-		LibraryUIPreferences.setSwitchConfig(getSwitchConfigValue());
-
-		return true;
-	}
-
-	/**
-	 * Converts given list into string representation
-	 * @param columnDescriptors
-	 * @return 
-	 * 			String representation of the given list
-	 */
-	public static String toString(java.util.List columnDescriptors) {
-		StringBuffer strBuf = new StringBuffer();
-		int max = columnDescriptors.size() - 1;
-		for (int i = 0; i < max; i++) {
-			strBuf.append(((ColumnDescriptor) columnDescriptors.get(i)).id)
-					.append(',');
-		}
-		strBuf.append(((ColumnDescriptor) columnDescriptors.get(max)).id);
-		return strBuf.toString();
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.ModifyListener#modifyText(ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-	}
-
-	private String getSwitchConfigValue() {
-		if (configSwitchAlwaysButton.getSelection())
-			return MessageDialogWithToggle.ALWAYS;
-		if (configSwitchNeverButton.getSelection())
-			return MessageDialogWithToggle.NEVER;
-		if (configSwitchPromptButton.getSelection())
-			return MessageDialogWithToggle.PROMPT;
-
-		// return Prompt value as a default
-		return MessageDialogWithToggle.PROMPT;
-	}
-
-	private void setSwitchConfigButton(String value) {
-		if (MessageDialogWithToggle.ALWAYS.equals(value)) {
-			configSwitchAlwaysButton.setSelection(true);
-			configSwitchNeverButton.setSelection(false);
-			configSwitchPromptButton.setSelection(false);
-		} else if (MessageDialogWithToggle.NEVER.equals(value)) {
-			configSwitchAlwaysButton.setSelection(false);
-			configSwitchNeverButton.setSelection(true);
-			configSwitchPromptButton.setSelection(false);
-		} else { // MessageDialogWithToggle.PROMPT
-			configSwitchAlwaysButton.setSelection(false);
-			configSwitchNeverButton.setSelection(false);
-			configSwitchPromptButton.setSelection(true);
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#getPreferenceStore()
-	 */
-	public IPreferenceStore getPreferenceStore() {
-		
-		// change to use LibraryPlugin store
-		// we need to share the preference in Library browsing and publishing
-		// Jinhua Xi 08/19/2006
-		// changed to use CommonUIPlugin store
-		IPreferenceStoreWrapper wrapper = LibraryPlugin.getDefault().getPreferenceStore();
-		if ( wrapper instanceof PreferenceStoreWrapper ) {
-			return ((PreferenceStoreWrapper)wrapper).getStore();
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/RootPrefPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/RootPrefPage.java
deleted file mode 100644
index a9ede34..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/RootPrefPage.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.preferences;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.ui.CommonUIPlugin;
-import org.eclipse.epf.common.ui.PreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-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.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-
-/**
- * Root preference page
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-public class RootPrefPage extends PreferencePage implements
-		IWorkbenchPreferencePage {
-
-	private Composite composite_tab;
-
-	// private IWorkbench workbench;
-
-	// Disableing enable process contribution preference for now.
-	// private Button enableProcessContribution;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-
-		// composite_tab << parent
-		composite_tab = createComposite(parent, 3);
-
-		// enableProcessContribution = new Button(composite_tab, SWT.CHECK);
-		// enableProcessContribution.setText(AuthoringUIResources.getString("AuthoringUI.RootPrefPage.enableprocesscontribution.text"));
-		// //$NON-NLS-1$
-
-		initializeValues();
-
-		// font = null;
-		return composite_tab;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		// this.workbench = workbench;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PreferencePage
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		initializeDefaults();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PreferencePage
-	 */
-	public boolean performOk() {
-		storeValues();
-		LibraryPlugin.getDefault().savePluginPreferences();
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
-	 */
-	protected IPreferenceStore doGetPreferenceStore() {
-		IPreferenceStoreWrapper wrapper = LibraryPlugin.getDefault().getPreferenceStore();
-		if ( wrapper instanceof PreferenceStoreWrapper ) {
-			return ((PreferenceStoreWrapper)wrapper).getStore();
-		}
-		return null;
-	}
-
-	/**
-	 * Stores the values of the controls back to the preference store.
-	 */
-	private void storeValues() {
-	}
-
-	/**
-	 * Initializes states of the controls using default values in the preference
-	 * store.
-	 */
-	private void initializeDefaults() {
-	}
-
-	/**
-	 * Initializes states of the controls from the preference store.
-	 */
-	private void initializeValues() {
-	}
-
-	private Composite createComposite(Composite parent, int numColumns) {
-
-		Composite composite = new Composite(parent, SWT.NULL);
-
-		// GridLayout
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		layout.marginHeight = layout.marginWidth = 0;
-		composite.setLayout(layout);
-
-		// GridData
-		GridData data = new GridData();
-		data.verticalAlignment = GridData.FILL;
-		data.horizontalAlignment = GridData.FILL;
-		composite.setLayoutData(data);
-
-		return composite;
-	}
-
-	// private Label createLabel(Composite parent, String text, int span) {
-	// Label label = new Label(parent, SWT.LEFT);
-	// label.setText(text);
-	// GridData data = new GridData();
-	// data.horizontalSpan = span;
-	// data.horizontalAlignment = GridData.FILL;
-	// label.setLayoutData(data);
-	// return label;
-	// }
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/package.html
deleted file mode 100644
index 48b5390..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the Authoring UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/AbstractSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/AbstractSection.java
deleted file mode 100644
index ff67e11..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/AbstractSection.java
+++ /dev/null
@@ -1,353 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.views.properties.tabbed.view.Tab;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * Base class for a section in a tab in the properties view.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AbstractSection extends AbstractPropertySection implements
-		PropertyChangeListener {
-
-	private BreakdownElement element;
-
-	protected boolean editable = false;
-
-	protected TabbedPropertySheetPage page;
-
-	protected ProcessAuthoringConfigurator configurator = new ProcessAuthoringConfigurator(
-			LibraryService.getInstance().getCurrentMethodConfiguration());
-
-	protected Logger logger;
-
-	/*
-	 * Create an instance
-	 */
-	public AbstractSection() {
-		super();
-
-		// listen to change for current selection of MethodConfiguration
-		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.addListener(libraryListener);
-		}
-
-		// get logger
-		logger = AuthoringUIPlugin.getDefault().getLogger();
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite comp, TabbedPropertySheetPage page) {
-		super.createControls(comp, page);
-		this.page = page;
-	}
-
-	private ILibraryChangeListener libraryListener = new ILibraryChangeListener() {
-
-		public void libraryChanged(int option, Collection collection) {
-			switch (option) {
-			case ILibraryChangeListener.OPTION_CHANGED: {
-				sectionRefresh();
-			}
-			}
-		}
-	};
-
-	/**
-	 * Refresh the current section
-	 * 
-	 */
-	private void sectionRefresh() {
-		if (page != null) {
-			Tab tab = page.getCurrentTab();
-			if (tab != null) {
-				ISection section = tab.getSectionAtIndex(0);
-
-				if ((section != null)
-						&& (section instanceof BreakdownElementGeneralSection)) {
-					section.refresh();
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (libraryListener != null) {
-			ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				manager.removeListener(libraryListener);
-			}
-		}
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#setInput(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		// System.out.println("SetInput::selection - "+selection);
-		Assert.isTrue(selection instanceof IStructuredSelection);
-		Object input = ((IStructuredSelection) selection).getFirstElement();
-
-		initElementData(input);
-
-	}
-
-	private void initElementData(Object input) {
-
-		if (input instanceof BreakdownElement) {
-			this.element = (BreakdownElement) input;
-			if (TngUtil.isLocked(this.element))
-				this.editable = false;
-			else {
-				this.editable = true;
-
-				if (element instanceof RoleDescriptor) {
-					RoleDescriptor roleDesc = (RoleDescriptor) element;
-					if ((roleDesc.getSuperActivities() == null)
-							|| (roleDesc.getSuperActivities() == null))
-						this.editable = false;
-					else
-						this.editable = true;
-				}
-			}
-		} else if (input instanceof BreakdownElementWrapperItemProvider) {
-			this.element = (BreakdownElement) LibraryUtil.unwrap(input);
-			this.editable = false;
-		}
-
-	}
-
-	/**
-	 * Return selection
-	 */
-	public ISelection getSelection() {
-		return EPFPropertySheetPage.getSelection();
-	}
-
-	/**
-	 * Return first element from selection
-	 */
-	public Object getInput() {
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			Object input = ((IStructuredSelection) selection).getFirstElement();
-			return input;
-		}
-		return null;
-	}
-
-	/**
-	 * Return process editor
-	 * 
-	 * @return
-	 * 		process editor
-	 */
-	public ProcessEditor getEditor() {
-		return EPFPropertySheetPage.getEditor();
-	}
-
-	/**
-	 * Return ItemProvider
-	 * 
-	 * @return
-	 * 			adapter
-	 */
-	public ItemProviderAdapter getAdapter() {
-		try {
-			AdapterFactory factory = EPFPropertySheetPage.getAdapterFactory();
-			ItemProviderAdapter provider = (ItemProviderAdapter) factory.adapt(
-					element, ITreeItemContentProvider.class);
-			return provider;
-		} catch (Exception ex) {
-			return null;
-		}
-	}
-
-	/**
-	 * Return Adapter factory
-	 * 
-	 * @return
-	 * 			adapter factory
-	 */
-	public AdapterFactory getAdapterFactory() {
-		AdapterFactory adapterFactory = EPFPropertySheetPage
-				.getAdapterFactory();
-		return adapterFactory;
-	}
-
-	/**
-	 * Get the element.
-	 * 
-	 * @return the element.
-	 */
-	public BreakdownElement getElement() {
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			Object input = ((IStructuredSelection) selection).getFirstElement();
-			// System.out.println("getElement::selection - "+selection);
-			try {
-				initElementData(input);
-			} catch (Exception e) {
-				logger
-						.logError(
-								"Error getting element from the selection " + element, e); //$NON-NLS-1$
-				return null;
-			}
-			return element;
-		}
-		return null;
-	}
-
-	/**
-	 * Return property sheet page
-	 * @return
-	 * 			property sheet page
-	 */
-	public TabbedPropertySheetPage getPropertySheetPage() {
-		return this.page;
-	}
-
-	/**
-	 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent evt) {
-		// System.out.println("ProeprtyChangeEvent" + evt);
-		refresh();
-	}
-
-	/**
-	 * Return filter list of elements. Filter is based on current method configuration
-	 * @param list
-	 * 			Original list
-	 * @return
-	 * 			filtered list
-	 */
-	public List getFilteredList(List list) {
-		List newList = new ArrayList();
-		for (Iterator itor = list.iterator(); itor.hasNext();) {
-			if (configurator != null) {
-				Object obj = (Object) itor.next();
-				configurator.setMethodConfiguration(LibraryService
-						.getInstance().getCurrentMethodConfiguration());
-				if (configurator.accept(obj)) {
-					newList.add(obj);
-				}
-			}
-		}
-		return newList;
-	}
-
-	/**
-	 * Get default method configuration
-	 * 
-	 * @return 
-	 * 			default method configuration
-	 */
-	protected MethodConfiguration getDefaultConfiguration() {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) getAdapter();
-		Object parent = null;
-		if (adapter instanceof IBSItemProvider) {
-			IBSItemProvider bsItemProvider = (IBSItemProvider) adapter;
-			parent = bsItemProvider.getTopItem();
-			MethodConfiguration config = ((org.eclipse.epf.uma.Process) parent)
-					.getDefaultContext();
-			return config;
-		} else {
-			logger
-					.logError("AbstractSection::getDefaultConfiguration - IBSItemProvider is null"); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Return current method configuration
-	 * 
-	 * @return
-	 * 			current method configuration
-	 */
-	protected MethodConfiguration getConfiguration() {
-		MethodConfiguration config = LibraryService.getInstance()
-				.getCurrentMethodConfiguration();
-		if (config == null) {
-			// if configuration is not selected, use default configuration
-			return getDefaultConfiguration();
-		}
-
-		return config;
-	}
-
-
-	// public void updateTitle(Object obj)
-	// {
-	// String name = getNamePrefix() + ((BreakdownElement)obj).getName();
-	// TabbedPropertyComposite comp = (TabbedPropertyComposite)
-	// page.getControl();
-	// TabbedPropertyTitle title = comp.getTitle();
-	// if (titleImage == null)
-	// {
-	// titleImage = Display.getCurrent().getActiveShell().getImage();
-	// }
-	// title.setTitle(name, titleImage);
-	// }
-	
-	
-	
-	/**
-	 * Get name prefix for the element
-	 */
-	public String getNamePrefix() {
-		return "ProcessElement: "; //$NON-NLS-1$
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityDocumentSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityDocumentSection.java
deleted file mode 100644
index 91bd8aa..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityDocumentSection.java
+++ /dev/null
@@ -1,367 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.util.RichTextImageLinkContainer;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-
-
-/**
- * The document tab for Activity
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class ActivityDocumentSection extends BreakdownElementDocumentSection {
-
-	protected Activity element;
-
-	protected IMethodRichText mainDescText;
-	
-	protected RichTextImageLinkContainer mainDescContainer;
-
-	protected IMethodRichText purposeText;
-	
-	protected RichTextImageLinkContainer purposeContainer;
-
-	protected IMethodRichText alternativesText;
-	
-	protected RichTextImageLinkContainer alternativesContainer;
-
-	protected IMethodRichText howToStaffText;
-	
-	protected RichTextImageLinkContainer howToStaffContainer;
-
-	private Listener purposeListener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (Activity) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: purposeText;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((ActivityDescription) element
-					.getPresentation()).getPurpose();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					purposeText, oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getActivityDescription_Purpose(), newContent, -1);
-			}
-		}
-	};
-
-	private Listener mainDescListener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (Activity) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: mainDescText;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((ActivityDescription) element
-					.getPresentation()).getMainDescription();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					mainDescText, oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getContentDescription_MainDescription(), newContent,
-						-1);
-			}
-		}
-	};
-
-	private Listener alternativesListener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (Activity) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: alternativesText;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((ActivityDescription) element
-					.getPresentation()).getAlternatives();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					alternativesText, oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getActivityDescription_Alternatives(), newContent, -1);
-			}
-		}
-	};
-
-	private Listener howToStaffListener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (Activity) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: howToStaffText;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((ActivityDescription) element
-					.getPresentation()).getHowtoStaff();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					howToStaffText, oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getActivityDescription_HowtoStaff(), newContent, -1);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#init()
-	 */
-	protected void init() {
-		super.init();
-		element = (Activity) getElement();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#createDocumentSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createDocumentSection(Composite composite) {
-		int mainDescheightHint = 100;
-
-		super.createDocumentSection(composite);
-
-		// main description
-		mainDescContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, mainDescheightHint, contentElementPath, element,
-				PropertiesResources.Process_mainDescription);
-		addHyperLinkListener(mainDescContainer.link);
-		mainDescText = mainDescContainer.richText;
-
-		// purpose
-		purposeContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, heightHint, contentElementPath, element,
-				PropertiesResources.Process_purpose);
-		addHyperLinkListener(purposeContainer.link);
-		purposeText = purposeContainer.richText;
-
-		// create alternatives
-		alternativesContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, heightHint, contentElementPath, element,
-				PropertiesResources.Activity_alternatives);
-		addHyperLinkListener(alternativesContainer.link);
-		alternativesText = alternativesContainer.richText;
-		
-		// create howtoStaff
-		howToStaffContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, heightHint, contentElementPath, element,
-				PropertiesResources.Activity_howToStaff);
-		addHyperLinkListener(howToStaffContainer.link);
-		howToStaffText = howToStaffContainer.richText;
-		
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-		
-		BreakdownElement element = getElement();
-		
-		purposeText.setModalObject(element);
-		purposeText.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getActivityDescription_Purpose());
-		purposeText.addListener(SWT.Deactivate, purposeListener);
-		
-		mainDescText.setModalObject(element);
-		mainDescText.setModalObjectFeature(UmaPackage.eINSTANCE.getContentDescription_MainDescription());
-		mainDescText.addListener(SWT.Deactivate, mainDescListener);
-				
-		alternativesText.setModalObject(element);
-		alternativesText.setModalObjectFeature(UmaPackage.eINSTANCE.getActivityDescription_Alternatives());
-		alternativesText.addListener(SWT.Deactivate, alternativesListener);
-		
-		howToStaffText.setModalObject(element);
-		howToStaffText.setModalObjectFeature(UmaPackage.eINSTANCE.getActivityDescription_HowtoStaff());
-		howToStaffText.addListener(SWT.Deactivate, howToStaffListener);
-	}
-		
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-		purposeText.setEditable(editable);
-		mainDescText.setEditable(editable);
-		alternativesText.setEditable(editable);
-		howToStaffText.setEditable(editable);
-		// hide fields for top-level processes:
-		if (ProcessUtil.isTopProcess(element)) {
-			briefDescLabel.setVisible(false);
-			briefDescText.setVisible(false);
-			externalIDLabel.setVisible(false);
-			externalIDText.setVisible(false);
-			keyConsiderationsContainer.setVisible(false);
-			mainDescContainer.setVisible(false);
-			purposeContainer.setVisible(false);
-			alternativesContainer.setVisible(false);
-			howToStaffContainer.setVisible(false);
-			
-			// move usage guidance to be right after prefix field
-			usageGuidanceContainer.moveBelow(prefixText);
-			
-		} else {
-			briefDescLabel.setVisible(true);
-			briefDescText.setVisible(true);
-			externalIDLabel.setVisible(true);
-			externalIDText.setVisible(true);
-			keyConsiderationsContainer.setVisible(true);
-			mainDescContainer.setVisible(true);
-			purposeContainer.setVisible(true);
-			alternativesContainer.setVisible(true);
-			howToStaffContainer.setVisible(true);
-			// move usage guidance to be right after externalID field
-			usageGuidanceContainer.moveBelow(externalIDText);
-		}
-		parent.layout(true, true);
-		// make parent be totally repainted
-		parent.setVisible(false);
-		parent.setVisible(true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof Activity) {
-				((MethodElementEditor) getEditor()).saveModifiedRichText();
-
-				element = (Activity) getElement();
-				ActivityDescription content = (ActivityDescription) element
-						.getPresentation();
-
-				if (contentModifyListener != null) {
-					mainDescText.removeModifyListener(contentModifyListener);
-					purposeText.removeModifyListener(contentModifyListener);
-					alternativesText
-							.removeModifyListener(contentModifyListener);
-					howToStaffText.removeModifyListener(contentModifyListener);
-				}
-				
-				super.refresh();
-
-				if (contentModifyListener != null) {
-					if (contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-						((MethodElementEditor.ModifyListener) contentModifyListener)
-								.setElement(element.getPresentation());
-						((MethodElementEditor.ModifyListener) contentModifyListener)
-								.setDisable(true);
-					}
-				}
-
-				mainDescText.setText(content.getMainDescription());
-				purposeText.setText(content.getPurpose());
-				alternativesText.setText(content.getAlternatives());
-				howToStaffText.setText(content.getHowtoStaff());
-
-				if (expandFlag) {
-					if (expandDocumentLabel.getText().equals(
-							PropertiesResources.Process_mainDescription)) { 
-						ctrl_document_expanded.setText(content
-								.getMainDescription());
-						ctrl_document_expanded.setSelection(0);
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getContentDescription_MainDescription());
-
-					} else if (expandDocumentLabel.getText().equals(
-							PropertiesResources.Process_purpose)) { 
-						ctrl_document_expanded.setText(content.getPurpose());
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getActivityDescription_Purpose());
-					} else if (expandDocumentLabel.getText().equals(
-							PropertiesResources.Activity_alternatives)) { 
-						ctrl_document_expanded.setText(content
-								.getAlternatives());
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getActivityDescription_Alternatives());
-					} else if (expandDocumentLabel.getText().equals(
-							PropertiesResources.Activity_howToStaff)) { 
-						ctrl_document_expanded.setText(content.getHowtoStaff());
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getActivityDescription_HowtoStaff());
-					}
-				}
-
-				if (contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) contentModifyListener)
-							.setDisable(false);
-				}
-
-				mainDescText.setModalObject(content);
-				mainDescText.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getContentDescription_MainDescription());
-				mainDescText.addModifyListener(contentModifyListener);
-
-				purposeText.setModalObject(content);
-				purposeText.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getActivityDescription_Purpose());
-				purposeText.addModifyListener(contentModifyListener);
-
-				alternativesText.setModalObject(content);
-				alternativesText.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getActivityDescription_Alternatives());
-				alternativesText.addModifyListener(contentModifyListener);
-
-				howToStaffText.setModalObject(content);
-				howToStaffText.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getActivityDescription_HowtoStaff());
-				howToStaffText.addModifyListener(contentModifyListener);
-			}
-		} catch (Exception ex) {
-			logger.logError(
-					"Error refreshing activity documentation section :", ex); //$NON-NLS-1$
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGeneralSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGeneralSection.java
deleted file mode 100644
index 3ec0500..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGeneralSection.java
+++ /dev/null
@@ -1,654 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.editors.BreakdownElementEditorInput;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.authoring.ui.filters.ActivityVariabilityFilter;
-import org.eclipse.epf.authoring.ui.forms.ProcessBreakdownStructureFormPage;
-import org.eclipse.epf.authoring.ui.views.ProcessViewer;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.core.providers.SharedResourceDiagramDocumentProvider;
-import org.eclipse.epf.library.configuration.ProcessVariabilityConfigurator;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.ActivityVariabilityCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.library.ui.dialogs.ConvertActivityDialog;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-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.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The general tab section for Activity
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- * 
- */
-public class ActivityGeneralSection extends WorkBreakdownElementGeneralSection {
-	protected Activity element;
-
-	private static final String NOT_APPLICABLE_TEXT = AuthoringUIResources.notApplicable_text; 
-
-	private static final String CONTRIBUTES_TEXT = AuthoringUIResources.contributes_text; 
-
-	private static final String EXTENDS_TEXT = AuthoringUIResources.extends_text; 
-
-	private static final String REPLACES_TEXT = AuthoringUIResources.replaces_text; 
-
-	private Text modelInfoText;
-
-	private Label activityTypeLabel;
-
-	private Text ctrl_type_text;
-
-	private Button ctrl_type_button;
-
-	private Combo ctrl_variability;
-
-	private ComboViewer viewer_variability;
-
-	private Text baseText;
-
-	private Button selectButton;
-
-	protected ILabelProvider variabilityLabelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public String getText(Object object) {
-			VariabilityType varObject = (VariabilityType) object;
-			if (varObject == VariabilityType.NA_LITERAL)
-				return NOT_APPLICABLE_TEXT;
-			if (varObject == VariabilityType.CONTRIBUTES_LITERAL)
-				return CONTRIBUTES_TEXT;
-			if (varObject == VariabilityType.EXTENDS_LITERAL)
-				return EXTENDS_TEXT;
-			if (varObject == VariabilityType.REPLACES_LITERAL)
-				return REPLACES_TEXT;
-			return null;
-		}
-	};
-
-	private IContentProvider variabilityContentProvider = new AdapterFactoryContentProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		public Object[] getElements(Object object) {
-			List variabilityTypesList = new ArrayList();
-			variabilityTypesList.add(VariabilityType.NA_LITERAL);
-			variabilityTypesList.add(VariabilityType.CONTRIBUTES_LITERAL);
-			variabilityTypesList.add(VariabilityType.EXTENDS_LITERAL);
-			variabilityTypesList.add(VariabilityType.REPLACES_LITERAL);
-			return variabilityTypesList.toArray();
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#init()
-	 */
-	protected void init() {
-		super.init();
-		// get activity object
-		element = (Activity) getElement();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#createGeneralSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createGeneralSection(Composite composite) {
-		super.createGeneralSection(composite);
-
-		// Model Info
-		FormUI.createLabel(toolkit, generalComposite,
-				PropertiesResources.Activity_ModelInfo); 
-
-		modelInfoText = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, horizontalSpan);
-		modelInfoText.setEnabled(false);
-		modelInfoText.setText(getModelInfo());
-
-		// Type of an Activity
-		activityTypeLabel = FormUI.createLabel(toolkit, generalComposite,
-				PropertiesResources.Activity_Type);
-		
-		ctrl_type_text = toolkit.createText(generalComposite, "", SWT.READ_ONLY); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL);
-			gridData.horizontalSpan = 1;
-			ctrl_type_text.setLayoutData(gridData);
-		}
-		ctrl_type_button = toolkit.createButton(generalComposite,
-				AuthoringUIText.CHANGE_TYPE_BUTTON_TEXT, SWT.PUSH);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 1;
-			ctrl_type_button.setLayoutData(gridData);
-		}
-		if (ConvertActivityDialog.getValidNewActivityTypes(element) == null) {
-			ctrl_type_button.setVisible(false);
-		}
-
-		FormUI.createLabel(toolkit, generalComposite, ""); //$NON-NLS-1$
-
-		// Variability Type
-		FormUI.createLabel(toolkit, generalComposite,
-				AuthoringUIText.VARIABILITY_TYPE_TEXT);
-
-		ctrl_variability = FormUI.createCombo(toolkit, generalComposite, 2);
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 1;
-			ctrl_variability.setLayoutData(gridData);
-		}
-
-		viewer_variability = new ComboViewer(ctrl_variability);
-		viewer_variability.getCombo().setLayoutData(new GridData(1));
-		viewer_variability.setContentProvider(variabilityContentProvider);
-		viewer_variability.setLabelProvider(variabilityLabelProvider);
-		viewer_variability.setInput(element);
-
-		Label blankLabel = FormUI.createLabel(toolkit, generalComposite, ""); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.BEGINNING);
-			gridData.horizontalSpan = 2;
-			blankLabel.setLayoutData(gridData);
-		}
-
-		// Base elements
-		FormUI.createLabel(toolkit, generalComposite,
-				AuthoringUIText.BASE_ELEMENT_TEXT);
-
-		baseText = FormUI.createText(toolkit, generalComposite);
-		{
-			GridData gd = new GridData(GridData.BEGINNING
-					| GridData.FILL_HORIZONTAL);
-			gd.horizontalSpan = 2;
-			baseText.setLayoutData(gd);
-		}
-		baseText.setEnabled(false);
-
-		// Button to select
-		selectButton = FormUI.createButton(toolkit, generalComposite,
-				AuthoringUIText.SELECT_BUTTON_TEXT);
-	}
-	
-	private List<AbstractDiagramEditor> getDirtyDiagramEditors() {
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		org.eclipse.epf.uma.Process process = TngUtil.getOwningProcess(element); 
-		ArrayList<AbstractDiagramEditor> dirtyEditors = new ArrayList<AbstractDiagramEditor>();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof AbstractDiagramEditor && editor.isDirty()) {
-				IEditorInput input = editor.getEditorInput();
-				if (input instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
-					if (diagramInput != null) {
-						MethodElement element = diagramInput.getMethodElement();
-						if(element instanceof BreakdownElement && process == TngUtil.getOwningProcess((BreakdownElement)element)) {
-							dirtyEditors.add((AbstractDiagramEditor) editor);
-						}
-					}
-				}
-			}
-		}
-		return dirtyEditors;
-	}
-
-	/**
-	 * add listeners
-	 */
-	protected void addListeners() {
-		super.addListeners();
-		ctrl_type_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				final ProcessEditor editor = (ProcessEditor) getEditor();
-				// allow changing type only if the process editor and all of its diagram editors are not dirty
-				//
-				if (editor.isDirty() || !getDirtyDiagramEditors().isEmpty()) {
-					String title = AuthoringUIResources.changeActivityTypeWarningDialog_title; 
-					String message = AuthoringUIResources.descriptionTabGuidanceWarningDialog_message1; 
-					AuthoringUIPlugin.getDefault().getMsgDialog()
-							.displayWarning(title, message);
-				} else  {
-					nameText.removeListener(SWT.Deactivate,
-							nameDeactivateListener);
-					presentationNameText.removeListener(SWT.Deactivate,
-							presentationNameDeactivateListener);
-
-					Activity newActivity = ConvertActivityDialog
-					.queryUserAndConvert((Activity) element, null, null);
-					
-					if (newActivity != null) {
-						IStructuredSelection sel = new StructuredSelection(
-								newActivity);
-						// deal with property sheet directly.
-						getPropertySheetPage().selectionChanged(getPart(),
-								sel);
-						// getEditor().setSelection(sel);
-						refresh();
-						((ProcessViewer) ((ProcessBreakdownStructureFormPage) getEditor()
-								.getActivePageInstance()).getViewer())
-								.expandToLevel(newActivity, 3);
-					}
-					nameText.addListener(SWT.Deactivate,
-							nameDeactivateListener);
-					presentationNameText.addListener(SWT.Deactivate,
-							presentationNameDeactivateListener);
-
-					Display.getCurrent().asyncExec(new Runnable() {
-
-						public void run() {
-							// refresh any dirty diagram editor and clear the dirty flag
-							//
-							List<AbstractDiagramEditor> dirtyDiagramEditors = getDirtyDiagramEditors();
-							for (AbstractDiagramEditor diagramEditor : dirtyDiagramEditors) {
-								diagramEditor.refresh();
-								IDocumentProvider docProvider = diagramEditor.getDocumentProvider();
-								if(docProvider instanceof SharedResourceDiagramDocumentProvider) {
-									((SharedResourceDiagramDocumentProvider)docProvider).markDocumentAsSaved((IFileEditorInput) diagramEditor.getEditorInput());
-								}			
-							}							
-						}
-						
-					});
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		ctrl_variability.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				IStructuredSelection selection = (IStructuredSelection) viewer_variability
-						.getSelection();
-
-				VariabilityElement ve = element.getVariabilityBasedOnElement();
-				VariabilityType type = (VariabilityType) selection
-						.getFirstElement();
-
-				if (ve != null & ve instanceof Activity) {
-//					if(type.equals(VariabilityType.REPLACES_LITERAL)
-//							&& ve instanceof Process){
-//						Object[] args = { element.getName() };
-//						String message = AuthoringUIResources
-//						.bind(
-//								AuthoringUIResources.activity_variability_error_msg1,
-//								args);
-//
-//						String title = AuthoringUIResources.activity_variability_error_title;
-//						AuthoringUIPlugin.getDefault().getMsgDialog()
-//							.displayError(title, message, ""); //$NON-NLS-1$
-//						VariabilityType vtype = element.getVariabilityType();
-//						if(vtype != null){
-//							IStructuredSelection sel = new StructuredSelection(vtype);
-//							viewer_variability.setSelection(sel);
-//						}
-//						return;
-//					}
-//					if (ProcessUtil.hasContributorOrReplacer((Activity) ve)
-//							&& type.equals(VariabilityType.EXTENDS_LITERAL)) {
-//						Object[] args = { element.getName(),
-//								((Activity) ve).getName() };
-//						String message = AuthoringUIResources
-//								.bind(
-//										AuthoringUIResources.activity_variability_error_msg,
-//										args);
-//
-//						String title = AuthoringUIResources.activity_variability_error_title;
-//						AuthoringUIPlugin.getDefault().getMsgDialog()
-//								.displayError(title, message, ""); //$NON-NLS-1$
-//
-//						VariabilityType variabilityType = element
-//								.getVariabilityType();
-//						IStructuredSelection newVariabilitySelection = new StructuredSelection(
-//								variabilityType);
-//						viewer_variability.setSelection(
-//								newVariabilitySelection, true);
-//
-//						return;
-//					}
-					
-					if(type != VariabilityType.NA_LITERAL) {
-						IStatus state = DependencyChecker.checkCircularDependencyAfterFilterSelection(element, (Activity) ve, type);
-						if(!state.isOK()) {
-							String title = AuthoringUIResources.activity_variability_error_title;
-							AuthoringUIPlugin.getDefault().getMsgDialog().displayError(title, state.getMessage());
-							
-							// set variability to back whatever it was for UI
-							VariabilityType variabilityType = element.getVariabilityType();
-							IStructuredSelection newVariabilitySelection = new StructuredSelection(
-									variabilityType);
-							viewer_variability.setSelection(newVariabilitySelection, true);
-							return;
-						}
-					}
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							element, UmaPackage.eINSTANCE
-									.getVariabilityElement_VariabilityType(),
-							type, -1);
-					if (!status) {
-						if (element.getPresentationName() == null
-								|| element.getPresentationName().equals("")) { //$NON-NLS-1$
-							if (type.equals(VariabilityType.NA_LITERAL))
-								element.setPresentationName(element.getName());
-						}
-						return;
-					}
-					if (element.getPresentationName() == null
-							|| element.getPresentationName().equals("")) { //$NON-NLS-1$
-						if (type.equals(VariabilityType.CONTRIBUTES_LITERAL)
-								|| type.equals(VariabilityType.REPLACES_LITERAL)
-								|| type.equals(VariabilityType.NA_LITERAL))
-							element.setPresentationName(element.getName());
-					}
-				}
-
-				if (type == VariabilityType.NA_LITERAL) {
-					if (ve != null) {
-						boolean status = actionMgr
-								.doAction(
-										IActionManager.SET,
-										element,
-										UmaPackage.eINSTANCE
-												.getVariabilityElement_VariabilityBasedOnElement(),
-										null, -1);
-
-						if (!status) {
-							return;
-						}
-					}
-					selectButton.setEnabled(false);
-					baseText.setText(""); //$NON-NLS-1$
-				} else {
-					List selectionBaseList = new ArrayList();
-					VariabilityElement base = element
-							.getVariabilityBasedOnElement();
-					selectionBaseList.add(base);
-					selectButton.setEnabled(true);
-
-				}
-				// setFormTextWithVariableInfo();
-			}
-		});
-
-		selectButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				MethodConfiguration config = getConfiguration();
-				String tabName = FilterConstants.ACTIVITIES;
-
-				VariabilityType type = (VariabilityType) ((IStructuredSelection) viewer_variability
-						.getSelection()).getFirstElement();
-
-				IFilter filter = new ActivityVariabilityFilter(config, null,
-						tabName, element);
-
-				ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						filter, tabName, null, config);
-				fd.setBlockOnOpen(true);
-				fd.setViewerSelectionSingle(true);
-				fd.setTitle(tabName);
-				fd.open();
-
-				List selectedItems = fd.getSelectedItems();
-
-				if (selectedItems != null && !selectedItems.isEmpty()) {
-					Object o = selectedItems.get(0);
-					if (o instanceof Activity) {
-//						Activity act = (Activity) o;
-//						if (isDirectParent(act)
-//								|| ((act instanceof Process) && type.equals(VariabilityType.REPLACES_LITERAL)
-//										&& !(element instanceof Process))) 
-//						{
-//							Object[] args = { element.getName() };
-//							String message = AuthoringUIResources
-//									.bind(
-//											AuthoringUIResources.activity_variability_error_msg1,
-//											args);
-//
-//							String title = AuthoringUIResources.activity_variability_error_title;
-//							AuthoringUIPlugin.getDefault().getMsgDialog()
-//									.displayError(title, message, ""); //$NON-NLS-1$
-//
-//							return;
-//						}
-//						if (isCircularDependency(act)) {
-//							Object[] args = { element.getName(), act.getName() };
-//							String message = AuthoringUIResources
-//									.bind(
-//											AuthoringUIResources.activity_variability_error_msg2,
-//											args);
-//
-//							String title = AuthoringUIResources.activity_variability_error_title;
-//							AuthoringUIPlugin.getDefault().getMsgDialog()
-//									.displayError(title, message, ""); //$NON-NLS-1$
-//
-//							return;
-//						}
-//						// block for children
-//						if (ProcessUtil.hasContributorOrReplacer(act)
-//								&& type.equals(VariabilityType.EXTENDS_LITERAL)) {
-//							Object[] args = { element.getName(), act.getName() };
-//							String message = AuthoringUIResources
-//									.bind(
-//											AuthoringUIResources.activity_variability_error_msg,
-//											args);
-//
-//							String title = AuthoringUIResources.activity_variability_error_title;
-//							AuthoringUIPlugin.getDefault().getMsgDialog()
-//									.displayError(title, message, ""); //$NON-NLS-1$
-//
-//							return;
-//						}
-						
-						IStatus status = DependencyChecker.checkCircularDependencyAfterFilterSelection(element, (Activity) o, type);
-						if(!status.isOK()) {
-							String title = AuthoringUIResources.activity_variability_error_title;
-							AuthoringUIPlugin.getDefault().getMsgDialog().displayError(title, status.getMessage());						
-							return;
-						}
-					}
-					if (o instanceof VariabilityElement) {
-						VariabilityElement ve = (VariabilityElement) o;
-
-						IConfigurator configurator = new ProcessVariabilityConfigurator(
-								getDefaultConfiguration());
-						ActivityVariabilityCommand cmd = new ActivityVariabilityCommand(
-								element, ve, type, configurator);
-						boolean status = actionMgr.execute(cmd);
-
-						if (!status) {
-							return;
-						}
-
-						baseText.setText(TngUtil.getLabelWithPath(ve));
-					}
-				}
-			}
-		});
-
-	}
-
-	/**
-	 * Get model information for the activity
-	 * @return
-	 * 			model info string
-	 */
-	private String getModelInfo() {
-		String info = null;
-
-		try {
-			Object o = getAdapter();
-			if (o instanceof IBSItemProvider) {
-				IBSItemProvider adapter = (IBSItemProvider) o;
-				info = adapter.getAttribute(element,
-						IBSItemProvider.COL_MODEL_INFO);
-			}
-		} catch (Exception e) {
-			// print exception
-		}
-		if (!(StrUtil.isBlank(info)))
-			return info;
-		else
-			return PropertiesResources.Process_None;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-
-		ctrl_type_button.setEnabled(editable);
-		ctrl_variability.setEnabled(editable);
-		selectButton.setEnabled(editable);
-
-		ctrl_variability.setEnabled(editable);
-		if (((IStructuredSelection) viewer_variability.getSelection())
-				.getFirstElement() == VariabilityType.NA_LITERAL) {
-			selectButton.setEnabled(false);
-		}
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof Activity) {
-				super.refresh();
-
-				element = (Activity) getElement();
-
-				modelInfoText.setText(getModelInfo());
-
-				ctrl_type_text.setText(PropertiesUtil.getType(element));
-
-				// hide/show combo
-				if ((element instanceof org.eclipse.epf.uma.Process)
-						&& (element.getSuperActivities() == null || element
-								.getSuperActivities() == null)) {
-					activityTypeLabel.setVisible(false);
-					ctrl_type_text.setVisible(false);
-					ctrl_type_button.setVisible(false);
-				} else {
-					activityTypeLabel.setVisible(true);
-					ctrl_type_text.setVisible(true);
-					ctrl_type_button.setVisible(true);
-				}
-
-				VariabilityType variabilityType = element.getVariabilityType();
-				IStructuredSelection newVariabilitySelection = new StructuredSelection(
-						variabilityType);
-				viewer_variability.setSelection(newVariabilitySelection, true);
-
-				if (element.getVariabilityBasedOnElement() != null)
-					baseText.setText(TngUtil.getLabelWithPath(element
-							.getVariabilityBasedOnElement()));
-				else
-					baseText.setText(""); //$NON-NLS-1$
-				
-				// make variability type combo disabled incase type is either local contributes or local replaces.
-				if (variabilityType
-						.equals(VariabilityType.LOCAL_CONTRIBUTION_LITERAL)
-						|| (variabilityType
-								.equals(VariabilityType.LOCAL_REPLACEMENT_LITERAL))) {
-					IStructuredSelection selection = new StructuredSelection(
-							VariabilityType.NA_LITERAL);
-					viewer_variability.setSelection(selection);
-					ctrl_variability.setEnabled(false);
-				} else
-					ctrl_variability.setEnabled(editable);
-			}
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing Activity general section : " + element, ex); //$NON-NLS-1$
-		}
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#getNamePrefix()
-	 */
-	public String getNamePrefix() {
-		if (element instanceof CapabilityPattern) {
-			return LibraryUIText.TEXT_CAPABILITY_PATTERN + ": "; //$NON-NLS-1$
-		} else if (element instanceof DeliveryProcess) {
-			return LibraryUIText.TEXT_DELIVERY_PROCESS + ": "; //$NON-NLS-1$
-		} else if (element instanceof Phase) {
-			return LibraryUIText.TEXT_PHASE + ": "; //$NON-NLS-1$
-		} else if (element instanceof Iteration) {
-			return LibraryUIText.TEXT_ITERATION + ": "; //$NON-NLS-1$
-		} else
-			return LibraryUIText.TEXT_ACTIVITY + ": "; //$NON-NLS-1$
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGuidanceSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGuidanceSection.java
deleted file mode 100644
index 146d3dc..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGuidanceSection.java
+++ /dev/null
@@ -1,978 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.filters.ProcessGuidanceFilter;
-import org.eclipse.epf.diagram.model.util.DiagramInfo;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.configuration.GuidanceGroupingItemProvider;
-import org.eclipse.epf.library.edit.configuration.GuidanceItemProvider;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.FilterInitializer;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.AddGuidanceToActivityCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.Table;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * The activity guidance section. It list all avaiable guidances of an activity
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ActivityGuidanceSection extends AbstractSection {
-	protected ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory());
-
-	private FormToolkit toolkit;
-
-	private Button ctrl_add_1, ctrl_remove_1, ctrl_add_2, ctrl_remove_2;
-
-	private Button ctrl_add_3, ctrl_remove_3, ctrl_add_4, ctrl_remove_4;
-
-	private Table ctrl_table_1, ctrl_table_2, ctrl_table_3, ctrl_table_4;
-
-	private Section communicationMaterialSection, educationMaterialSection;
-
-	private TableViewer viewer_1, viewer_2, viewer_3, viewer_4;
-
-	// element
-	private Activity element;
-
-	// action manager
-	private IActionManager actionMgr;
-
-	public final String tabName = FilterConstants.GUIDANCE;
-
-	private IFilter roadMapFilter = null;
-
-	private IFilter generalGuidanceFilter = null;
-
-	private IFilter supportingMaterialFilter = null;
-
-	/**
-	 * Get road map guidance filter
-	 */
-	public IFilter getRoadMapFilter() {
-		if (roadMapFilter == null) {
-			roadMapFilter = new ProcessGuidanceFilter(getConfiguration(), null,
-					tabName) {
-				public boolean childAccept(Object obj) {
-					if (obj instanceof GuidanceGroupingItemProvider)
-						return true;
-					if (obj instanceof GuidanceItemProvider) {
-						String name = ((GuidanceItemProvider) obj).getText(obj);
-						if (name.equalsIgnoreCase(LibraryEditPlugin.INSTANCE
-								.getString("_UI_Guidances_Roadmap")) && //$NON-NLS-1$
-								!((GuidanceItemProvider) obj).getChildren(obj)
-										.isEmpty())
-							return true;
-						else
-							return false;
-					}
-					if ((obj instanceof Roadmap))
-						return true;
-					return false;
-				}
-			};
-		} else {
-			((ProcessGuidanceFilter) roadMapFilter).setMethodConfiguration(getConfiguration());
-		}
-
-		return roadMapFilter;
-	}
-
-	/**
-	 * Get General guidance filter
-	 * 
-	 */
-	public IFilter getGeneralGuidanceFilter() {
-		if (generalGuidanceFilter == null) {
-			generalGuidanceFilter = new ProcessGuidanceFilter(
-					getConfiguration(), null, tabName) {
-				public boolean childAccept(Object obj) {
-					if (super.childAccept(obj))
-						return true;
-					if (obj instanceof GuidanceItemProvider) {
-						if (((GuidanceItemProvider) obj).getChildren(obj)
-								.isEmpty())
-							return false;
-						else
-							return true;
-					}
-					Class cls = FilterInitializer.getInstance()
-							.getClassForType(helper.getFilterTypeStr());
-					if (cls != null) {
-						if (cls.isInstance(obj)) {
-							return true;
-						} else {
-							return false;
-						}
-					}
-					if ((obj instanceof Checklist) || (obj instanceof Concept)
-							|| (obj instanceof Example)
-							|| (obj instanceof Guideline)
-							|| (obj instanceof ReusableAsset)
-							|| (obj instanceof SupportingMaterial))
-						return true;
-
-					return false;
-
-				}
-			};
-		}else {
-			((ProcessGuidanceFilter) generalGuidanceFilter).setMethodConfiguration(getConfiguration());
-		}
-		return generalGuidanceFilter;
-	}
-
-	/**
-	 * Get Supporting materical guidance filter
-	 * 
-	 */
-	public IFilter getSupportingMaterialFilter() {
-		if (supportingMaterialFilter == null) {
-			supportingMaterialFilter = new ProcessGuidanceFilter(
-					getConfiguration(), null, tabName) {
-				public boolean childAccept(Object obj) {
-					if (super.childAccept(obj))
-						return true;
-					if ((obj instanceof GuidanceItemProvider)
-							|| (obj instanceof SupportingMaterial))
-						return true;
-					return false;
-				}
-			};
-		} else {
-			((ProcessGuidanceFilter) supportingMaterialFilter).setMethodConfiguration(getConfiguration());
-		}
-		return supportingMaterialFilter;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-
-		super.createControls(parent, tabbedPropertySheetPage);
-		init();
-
-		parent.setLayout(new GridLayout());
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create guidance section
-		createGuidanceSection(parent);
-
-		// add listeners
-		addListeners();
-
-		// update controls
-		updateControls();
-
-	}
-
-	/**
-	 * Initialize
-	 */
-	private void init() {
-		// get activity object
-		element = (Activity) getElement();
-
-		// get toolkit
-		toolkit = getWidgetFactory();
-
-		// get action manager
-		actionMgr = EPFPropertySheetPage.getActionManager();
-	}
-
-	private void toggleSection() {
-		if (!(element instanceof DeliveryProcess)) {
-			if (communicationMaterialSection.isExpanded())
-				communicationMaterialSection.setExpanded(false);
-			if (educationMaterialSection.isExpanded())
-				educationMaterialSection.setExpanded(false);
-
-			if (communicationMaterialSection.isVisible())
-				communicationMaterialSection.setVisible(false);
-			if (educationMaterialSection.isVisible())
-				educationMaterialSection.setVisible(false);
-		} else {
-			if (!communicationMaterialSection.isExpanded())
-				communicationMaterialSection.setExpanded(true);
-			if (!educationMaterialSection.isExpanded())
-				educationMaterialSection.setExpanded(true);
-
-			if (!communicationMaterialSection.isVisible())
-				communicationMaterialSection.setVisible(true);
-			if (!educationMaterialSection.isVisible())
-				educationMaterialSection.setVisible(true);
-		}
-
-	}
-
-	/**
-	 *  Update controls based on editable flag. Controls can become editable or un-editable
-	 */
-	public void updateControls() {
-		ctrl_add_1.setEnabled(editable);
-		ctrl_add_2.setEnabled(editable);
-		ctrl_add_3.setEnabled(editable);
-		ctrl_add_4.setEnabled(editable);
-
-		IStructuredSelection selection = (IStructuredSelection) viewer_1
-				.getSelection();
-		if (selection.size() > 0 && editable) {
-			ctrl_remove_1.setEnabled(true);
-		} else {
-			ctrl_remove_1.setEnabled(false);
-		}
-
-		selection = (IStructuredSelection) viewer_2.getSelection();
-		if (selection.size() > 0 && editable) {
-			ctrl_remove_2.setEnabled(true);
-		} else {
-			ctrl_remove_2.setEnabled(false);
-		}
-
-		selection = (IStructuredSelection) viewer_3.getSelection();
-		if (selection.size() > 0 && editable) {
-			ctrl_remove_3.setEnabled(true);
-		} else {
-			ctrl_remove_3.setEnabled(false);
-		}
-
-		selection = (IStructuredSelection) viewer_4.getSelection();
-		if (selection.size() > 0 && editable) {
-			ctrl_remove_4.setEnabled(true);
-		} else {
-			ctrl_remove_4.setEnabled(false);
-		}
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof Activity) {
-				element = (Activity) getElement();
-
-				viewer_1.refresh();
-				viewer_2.refresh();
-				viewer_3.refresh();
-				viewer_4.refresh();
-
-				// hide/show certain sections.
-				toggleSection();
-
-				// hide/show controls
-				updateControls();
-			}
-
-		} catch (Exception ex) {
-			logger.logError("Error refreshing activity guidance section: ", ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-	}
-
-	/**
-	 * Create guidance section on the given composite
-	 * @param composite
-	 */
-	private void createGuidanceSection(Composite composite) {
-		int tableHeight = 50;
-		String sectionTitle = null;
-		String sectionDesc = null;
-		String tableTitle = null;
-		// Label tableLabel = null;
-
-		// ROADMAP
-		{
-			sectionTitle = PropertiesResources.Activity_RoadmapTitle; 
-			sectionDesc = PropertiesResources.Activity_RoadmapDescription; 
-			tableTitle = PropertiesResources.Activity_Selected_Roadmap; 
-
-			Section section = FormUI.createSection(toolkit, composite,
-					sectionTitle, sectionDesc);
-
-			// create composite
-			Composite sectionComposite = FormUI.createComposite(toolkit,
-					section, 2, false);
-
-			Composite pane1 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane1, tableTitle);
-
-			ctrl_table_1 = FormUI.createTable(toolkit, pane1, tableHeight);
-			viewer_1 = new TableViewer(ctrl_table_1);
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					getAdapterFactory()) {
-				public Object[] getElements(Object object) {
-					return getFilteredList(element.getRoadmaps()).toArray();
-				}
-			};
-
-			viewer_1.setContentProvider(contentProvider);
-			viewer_1.setLabelProvider(labelProvider);
-			viewer_1.setInput(element);
-
-			// create buttons for table1
-			Composite pane2 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-
-			ctrl_add_1 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Add);
-			ctrl_remove_1 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Remove);
-
-			toolkit.paintBordersFor(pane1);
-		}
-
-		// GENERAL GUIDANCE
-		{
-			sectionTitle = PropertiesResources.Activity_GeneralGuidanceTitle; 
-			sectionDesc = PropertiesResources.Activity_GeneralGuidanceDescription; 
-			tableTitle = PropertiesResources.Activity_Selected_GeneralGuidance; 
-
-			Section section = FormUI.createSection(toolkit, composite,
-					sectionTitle, sectionDesc);
-
-			// create composite
-			Composite sectionComposite = FormUI.createComposite(toolkit,
-					section, 2, false);
-
-			Composite pane1 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane1, tableTitle);
-
-			ctrl_table_2 = FormUI.createTable(toolkit, pane1, tableHeight);
-			viewer_2 = new TableViewer(ctrl_table_2);
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					getAdapterFactory()) {
-				public Object[] getElements(Object object) {
-					return getFilteredList(getSelectedGuidances()).toArray();
-				}
-			};
-
-			viewer_2.setContentProvider(contentProvider);
-			viewer_2.setLabelProvider(labelProvider);
-			viewer_2.setInput(element);
-
-			// create buttons for table2
-			Composite pane2 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-
-			ctrl_add_2 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Add);
-			ctrl_remove_2 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Remove);
-
-			toolkit.paintBordersFor(pane1);
-		}
-
-		// COMMUNICATION MATERIAL
-		{
-			sectionTitle = PropertiesResources.Activity_CommunicationMaterialTitle; 
-			sectionDesc = PropertiesResources.Activity_CommunicationMaterialDescription; 
-			tableTitle = PropertiesResources.Activity_Selected_CommunicationMaterial; 
-
-			Section section = FormUI.createSection(toolkit, composite,
-					sectionTitle, sectionDesc);
-
-			// create composite
-			Composite sectionComposite = FormUI.createComposite(toolkit,
-					section, 2, false);
-
-			Composite pane1 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane1, tableTitle);
-
-			ctrl_table_3 = FormUI.createTable(toolkit, pane1, tableHeight);
-			viewer_3 = new TableViewer(ctrl_table_3);
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					getAdapterFactory()) {
-				public Object[] getElements(Object object) {
-					if (element instanceof DeliveryProcess) {
-						return getFilteredList(
-								((DeliveryProcess) element)
-										.getCommunicationsMaterials())
-								.toArray();
-					} else
-						return Collections.EMPTY_LIST.toArray();
-				}
-			};
-
-			viewer_3.setContentProvider(contentProvider);
-			viewer_3.setLabelProvider(labelProvider);
-			viewer_3.setInput(element);
-
-			// create buttons for table2
-			Composite pane2 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-
-			ctrl_add_3 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Add);
-			ctrl_remove_3 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Remove);
-
-			toolkit.paintBordersFor(pane1);
-
-			communicationMaterialSection = section;
-
-		}
-
-		// EDUCATION MATERIAL
-		{
-			sectionTitle = PropertiesResources.Activity_EducationMaterialTitle; 
-			sectionDesc = PropertiesResources.Activity_EducationMaterialDescription; 
-			tableTitle = PropertiesResources.Activity_Selected_EducationMaterial; 
-
-			Section section = FormUI.createSection(toolkit, composite,
-					sectionTitle, sectionDesc);
-
-			// create composite
-			Composite sectionComposite = FormUI.createComposite(toolkit,
-					section, 2, false);
-
-			Composite pane1 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane1, tableTitle);
-
-			ctrl_table_4 = FormUI.createTable(toolkit, pane1, tableHeight);
-			viewer_4 = new TableViewer(ctrl_table_4);
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					getAdapterFactory()) {
-				public Object[] getElements(Object object) {
-					if (element instanceof DeliveryProcess) {
-						return getFilteredList(
-								((DeliveryProcess) element)
-										.getEducationMaterials()).toArray();
-					} else
-						return Collections.EMPTY_LIST.toArray();
-				}
-			};
-
-			viewer_4.setContentProvider(contentProvider);
-			viewer_4.setLabelProvider(labelProvider);
-			viewer_4.setInput(element);
-
-			// create buttons for table2
-			Composite pane2 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-
-			ctrl_add_4 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Add);
-			ctrl_remove_4 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_Remove);
-
-			toolkit.paintBordersFor(pane1);
-
-			educationMaterialSection = section;
-
-		}
-
-		// hide/show certain sections
-		toggleSection();
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 */
-	private void addListeners() {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) getAdapter();
-		Object parent = null;
-		if (adapter instanceof IBSItemProvider) {
-			IBSItemProvider bsItemProvider = (IBSItemProvider) adapter;
-			parent = bsItemProvider.getTopItem();
-		} else {
-			logger
-					.logError("ActivityGuidanceSection::addListeners - IBSItemProvider is null"); //$NON-NLS-1$
-			return;
-		}
-
-		{
-			ctrl_table_1.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_1
-							.getSelection();
-					if ((selection.size() > 0) && editable)
-						ctrl_remove_1.setEnabled(true);
-				}
-			});
-
-			viewer_1
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) viewer_1
-									.getSelection();
-							if ((selection.size() > 0) && editable)
-								ctrl_remove_1.setEnabled(true);
-						}
-					});
-
-			ctrl_add_1.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IFilter filter = getRoadMapFilter();
-					ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-							.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(), filter, element,
-							FilterConstants.ROADMAP, element.getRoadmaps());
-
-					fd.setTitle(FilterConstants.ROADMAP);
-					fd.setInput(UmaUtil.getMethodLibrary((EObject) element));
-					fd.setBlockOnOpen(true);
-					fd.open();
-					addGuidances(fd.getSelectedItems());
-					viewer_1.refresh();
-				}
-			});
-
-			ctrl_remove_1.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_1
-							.getSelection();
-					if (selection.size() > 0) {
-						// update the model
-						ArrayList rmItems = new ArrayList();
-						rmItems.addAll(selection.toList());
-						removeGuidances(rmItems);
-						viewer_1.refresh();
-
-						// clear the selection
-						viewer_1.setSelection(null, true);
-					}
-					ctrl_remove_1.setEnabled(false);
-				}
-			});
-		}
-
-		{
-			ctrl_table_2.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_2
-							.getSelection();
-					if ((selection.size() > 0) && editable)
-						ctrl_remove_2.setEnabled(true);
-				}
-			});
-
-			viewer_2
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) viewer_2
-									.getSelection();
-							if ((selection.size() > 0) && editable)
-								ctrl_remove_2.setEnabled(true);
-						}
-					});
-
-			ctrl_add_2.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IFilter filter = getGeneralGuidanceFilter();
-					ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-							.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(), filter, element,
-							FilterConstants.GUIDANCE, getExistingElements()); 
-
-					fd.setTitle(FilterConstants.GUIDANCE);
-					fd.setInput(UmaUtil.getMethodLibrary((EObject) element));
-					fd.setBlockOnOpen(true);
-					fd.setTypes(getFilterTypes());
-					fd.open();
-					addGuidances(fd.getSelectedItems());
-					viewer_2.refresh();
-				}
-			});
-
-			ctrl_remove_2.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_2
-							.getSelection();
-					if (selection.size() > 0) {
-						// update the model
-						ArrayList rmItems = new ArrayList();
-						rmItems.addAll(selection.toList());
-						removeGuidances(rmItems);
-						viewer_2.refresh();
-
-						// clear the selection
-						viewer_2.setSelection(null, true);
-					}
-					ctrl_remove_2.setEnabled(false);
-				}
-			});
-		}
-
-		{
-			ctrl_table_3.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_3
-							.getSelection();
-					if ((selection.size() > 0) && editable)
-						ctrl_remove_3.setEnabled(true);
-				}
-			});
-
-			viewer_3
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) viewer_3
-									.getSelection();
-							if ((selection.size() > 0) && editable)
-								ctrl_remove_3.setEnabled(true);
-						}
-					});
-
-			ctrl_add_3.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					if (element instanceof DeliveryProcess) {
-						DeliveryProcess proc = (DeliveryProcess) element;
-
-						IFilter filter = getSupportingMaterialFilter();
-						ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-								.getWorkbench().getActiveWorkbenchWindow()
-								.getShell(), filter, proc,
-								FilterConstants.SUPPORTING_MATERIALS, proc
-										.getCommunicationsMaterials());
-
-						fd.setTitle(FilterConstants.GUIDANCE);
-						fd
-								.setInput(UmaUtil
-										.getMethodLibrary((EObject) element));
-						fd.setBlockOnOpen(true);
-						fd.open();
-
-						actionMgr
-								.doAction(
-										IActionManager.ADD_MANY,
-										proc,
-										UmaPackage.eINSTANCE
-												.getDeliveryProcess_CommunicationsMaterials(),
-										fd.getSelectedItems(), -1);
-					}
-
-					viewer_3.refresh();
-				}
-			});
-
-			ctrl_remove_3.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_3
-							.getSelection();
-					if (selection.size() > 0) {
-						// update the model
-						ArrayList rmItems = new ArrayList();
-						rmItems.addAll(selection.toList());
-
-						if (element instanceof DeliveryProcess) {
-							DeliveryProcess proc = (DeliveryProcess) element;
-							actionMgr
-									.doAction(
-											IActionManager.REMOVE_MANY,
-											proc,
-											UmaPackage.eINSTANCE
-													.getDeliveryProcess_CommunicationsMaterials(),
-											rmItems, -1);
-						}
-						viewer_3.refresh();
-
-						// clear the selection
-						viewer_3.setSelection(null, true);
-					}
-					ctrl_remove_3.setEnabled(false);
-				}
-			});
-		}
-
-		{
-			ctrl_table_4.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_4
-							.getSelection();
-					if ((selection.size() > 0) && editable)
-						ctrl_remove_4.setEnabled(true);
-				}
-			});
-
-			viewer_4
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) viewer_4
-									.getSelection();
-							if ((selection.size() > 0) && editable)
-								ctrl_remove_4.setEnabled(true);
-						}
-					});
-
-			ctrl_add_4.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					if (element instanceof DeliveryProcess) {
-						DeliveryProcess proc = (DeliveryProcess) element;
-
-						IFilter filter = getSupportingMaterialFilter();
-						ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-								.getWorkbench().getActiveWorkbenchWindow()
-								.getShell(), filter, proc,
-								FilterConstants.SUPPORTING_MATERIALS, proc
-										.getEducationMaterials());
-
-						fd.setTitle(FilterConstants.GUIDANCE);
-						fd
-								.setInput(UmaUtil
-										.getMethodLibrary((EObject) element));
-						fd.setBlockOnOpen(true);
-						fd.open();
-
-						actionMgr
-								.doAction(
-										IActionManager.ADD_MANY,
-										proc,
-										UmaPackage.eINSTANCE
-												.getDeliveryProcess_EducationMaterials(),
-										fd.getSelectedItems(), -1);
-
-						viewer_4.refresh();
-					}
-				}
-			});
-
-			ctrl_remove_4.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) viewer_4
-							.getSelection();
-					if (selection.size() > 0) {
-						// update the model
-						ArrayList rmItems = new ArrayList();
-						rmItems.addAll(selection.toList());
-						if (element instanceof DeliveryProcess) {
-							DeliveryProcess proc = (DeliveryProcess) element;
-							actionMgr
-									.doAction(
-											IActionManager.REMOVE_MANY,
-											proc,
-											UmaPackage.eINSTANCE
-													.getDeliveryProcess_EducationMaterials(),
-											rmItems, -1);
-						}
-						viewer_4.refresh();
-
-						// clear the selection
-						viewer_4.setSelection(null, true);
-
-					}
-					ctrl_remove_4.setEnabled(false);
-				}
-			});
-		}
-
-	}
-
-	/**
-	 * Add guidances to the element
-	 * @param addItems
-	 * 				list of guidances to add
-	 */
-	private void addGuidances(ArrayList addItems) {
-		// update the model
-
-		AddGuidanceToActivityCommand command = new AddGuidanceToActivityCommand(
-				element, addItems);
-		actionMgr.execute(command);
-	}
-
-	/**
-	 * Remove guidances from the element
-	 * @param rmItems
-	 * 				list of guidances to remove
-	 */
-	private void removeGuidances(ArrayList rmItems) {
-		// update the model
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				Guidance item = (Guidance) it.next();
-
-				// guidances for activity
-				if (item instanceof Checklist) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE.getActivity_Checklists(),
-							item, -1);
-				} else if (item instanceof Concept) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE.getActivity_Concepts(), item,
-							-1);
-				} else if (item instanceof Example) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE.getActivity_Examples(), item,
-							-1);
-				} else if (item instanceof SupportingMaterial) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE
-									.getActivity_SupportingMaterials(), item,
-							-1);
-				} else if (item instanceof Guideline) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE.getActivity_Guidelines(),
-							item, -1);
-				} else if (item instanceof ReusableAsset) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE.getActivity_ReusableAssets(),
-							item, -1);
-				} else if (item instanceof Roadmap) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE.getActivity_Roadmaps(), item,
-							-1);
-				} else {
-					logger
-							.logError("Can't remove Guidance: " + item.getType().getName() + ":" + item.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-	}
-
-	/**
-	 * Get existing guidances of the element
-	 * @return
-	 * 			list of existing guidances.
-	 */
-	private List getExistingElements() {
-
-		List itemList = new ArrayList();
-
-		itemList.addAll(element.getChecklists());
-		itemList.addAll(element.getConcepts());
-		itemList.addAll(element.getExamples());
-		itemList.addAll(element.getGuidelines());
-		itemList.addAll(element.getReusableAssets());
-		itemList.addAll(element.getSupportingMaterials());
-
-		DiagramInfo info = new DiagramInfo((Activity) element);
-		if (info.getActivityDiagram() != null)
-			itemList.add(info.getActivityDiagram());
-		if (info.getActivityDetailDiagram() != null)
-			itemList.add(info.getActivityDetailDiagram());
-		if (info.getWPDDiagram() != null)
-			itemList.add(info.getWPDDiagram());
-
-		return itemList;
-	}
-
-	/**
-	 * Get selected guidances
-	 * @return
-	 * 			list of selected guidances
-	 */
-	private List getSelectedGuidances() {
-		List itemList = new ArrayList();
-
-		itemList.addAll(element.getChecklists());
-		itemList.addAll(element.getConcepts());
-		itemList.addAll(element.getExamples());
-		itemList.addAll(element.getGuidelines());
-		itemList.addAll(element.getReusableAssets());
-		List supportingMaterials = element.getSupportingMaterials();
-		DiagramInfo info = new DiagramInfo((Activity) element);
-		for (Iterator itor = supportingMaterials.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (obj instanceof SupportingMaterial)
-				if (!info.isDiagram((SupportingMaterial) obj)) {
-					itemList.add(obj);
-				}
-		}
-
-		return itemList;
-	}
-
-	/**
-	 * Return list of filter types
-	 */
-	protected String[] getFilterTypes() {
-		String[] str = new String[14];
-		int i = 0;
-		str[i++] = FilterConstants.GUIDANCE;
-		str[i++] = FilterConstants.space + FilterConstants.CHECKLISTS;
-		str[i++] = FilterConstants.space + FilterConstants.CONCEPTS;
-		str[i++] = FilterConstants.space
-				+ FilterConstants.ESTIMATE_CONSIDERATIONS;
-		str[i++] = FilterConstants.space + FilterConstants.EXAMPLES;
-		str[i++] = FilterConstants.space + FilterConstants.GUIDELINES;
-		str[i++] = FilterConstants.space + FilterConstants.PRACTICES;
-		str[i++] = FilterConstants.space + FilterConstants.REPORTS;
-		str[i++] = FilterConstants.space + FilterConstants.REUSABLE_ASSETS;
-		str[i++] = FilterConstants.space + FilterConstants.SUPPORTING_MATERIALS;
-		str[i++] = FilterConstants.space + FilterConstants.TEMPLATES;
-		str[i++] = FilterConstants.space + FilterConstants.TOOL_MENTORS;
-		str[i++] = FilterConstants.space + FilterConstants.WHITE_PAPERS;
-		str[i++] = FilterConstants.space + FilterConstants.TERM_DEFINITIONS;
-		return str;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityRollupSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityRollupSection.java
deleted file mode 100644
index fb6e00a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityRollupSection.java
+++ /dev/null
@@ -1,212 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor;
-import org.eclipse.epf.authoring.ui.providers.ExposedAdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.views.ProcessViewer;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.IColumnAware;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-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.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The rollup section for activity
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public abstract class ActivityRollupSection extends AbstractSection {
-	// controls
-	private FormToolkit toolkit;
-
-	protected Section section;
-
-	private Composite rollupComposite;
-
-	private ProcessViewer viewer;
-
-	// private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	// element
-	private Activity element;
-
-	// action manager
-	// protected IActionManager actionMgr;
-
-	protected IPreferenceStoreWrapper store;
-
-	protected ColumnDescriptor[] columnDescriptors;
-
-	protected ComposedAdapterFactory adapterFactory;
-
-	private ILabelProvider labelProvider;
-
-	private IContentProvider contentProvider;
-
-	/**
-	 * Initialize
-	 * 
-	 */
-	private void init() {
-		// get Activity object
-		element = (Activity) getElement();
-
-		// get toolkit
-		toolkit = getWidgetFactory();
-
-		// get preference store
-		store = LibraryPlugin.getDefault().getPreferenceStore();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		init();
-
-		parent.setLayout(new GridLayout());
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create rollup section
-		createRollupSection(parent);
-	}
-
-	/**
-	 * Create rollup section on the composite
-	 * @param composite
-	 */
-	private void createRollupSection(Composite composite) {
-		// create section
-		section = FormUI
-				.createSection(toolkit, composite, PropertiesResources.Activity_WorkRollup, 
-						PropertiesResources.Activity_WorkRollupDescription); 
-
-		// create rollup composite
-		rollupComposite = FormUI.createComposite(toolkit, section, 2, false);
-
-		// set section labels
-		setSectionLabels();
-
-		// create viewer
-		viewer = new ProcessViewer(rollupComposite, SWT.MULTI | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gridData.verticalIndent = 10;
-		// gridData.heightHint = 600;
-		viewer.getControl().setLayoutData(gridData);
-
-		// initAdapterFactory
-		initAdapterFactory();
-
-		// set up columns
-		viewer.setupColumns(columnDescriptors);
-		setColumnIndexToNameMap(adapterFactory, columnDescriptors);
-
-		// set up providers
-		viewer.setContentProvider(new ExposedAdapterFactoryContentProvider(
-				adapterFactory));
-		viewer
-				.setLabelProvider(new AdapterFactoryLabelProvider(
-						adapterFactory));
-
-		// do roll up
-		rollUp();
-
-	}
-
-	private void rollUp() {
-		// set up columns
-		viewer.setInput(element);
-		IBSItemProvider adapter = (IBSItemProvider) adapterFactory.adapt(
-				element, ITreeItemContentProvider.class);
-		adapter.setRolledUp(true);
-		viewer.refresh();
-	}
-
-	private static void setColumnIndexToNameMap(AdapterFactory factory,
-			ColumnDescriptor[] columnDescriptors) {
-		Map columnIndexToNameMap = new HashMap();
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			columnIndexToNameMap.put(new Integer(i), columnDescriptors[i].id);
-		}
-		((IColumnAware) factory).setColumnIndexToNameMap(columnIndexToNameMap);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (adapterFactory != null) {
-			adapterFactory.dispose();
-		}
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-		if (contentProvider != null) {
-			contentProvider.dispose();
-		}
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#refresh()
-	 */
-	public void refresh() {
-		try {
-			// get Activity object
-			if (getElement() instanceof Activity) {
-				element = (Activity) getElement();
-
-				rollUp();
-			}
-		} catch (Exception ex) {
-			logger.logError(
-					"Error refreshing activity work roll up section", ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Initialize adapter factory
-	 *
-	 */
-	protected abstract void initAdapterFactory();
-
-	/**
-	 * Set label for the section
-	 *
-	 */
-	protected abstract void setSectionLabels();
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityTeamRollupSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityTeamRollupSection.java
deleted file mode 100644
index 5152ffb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityTeamRollupSection.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.authoring.ui.forms.ProcessFormUtil;
-import org.eclipse.epf.authoring.ui.preferences.ApplicationPreferenceConstants;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-
-
-/**
- * The team rollup section for activity
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ActivityTeamRollupSection extends ActivityRollupSection {
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.ActivityRollupSection#initAdapterFactory()
-	 */
-	protected void initAdapterFactory() {
-		// get column descriptors
-		columnDescriptors = ProcessFormUtil.toColumnDescriptors(store
-				.getString(ApplicationPreferenceConstants.PREF_TBS_COLUMNS));
-
-		// create adapter factory
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.createTBSComposedAdapterFactory();
-		if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-			((ConfigurableComposedAdapterFactory) adapterFactory)
-					.setFilter(configurator);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.ActivityRollupSection#setSectionLabels()
-	 */
-	protected void setSectionLabels() {
-		section.setText(PropertiesResources.Activity_TeamRollup); 
-		section.setDescription(PropertiesResources.Activity_TeamRollupDescription); 
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityWorkProductsRollupSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityWorkProductsRollupSection.java
deleted file mode 100644
index 7719c19..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityWorkProductsRollupSection.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.authoring.ui.forms.ProcessFormUtil;
-import org.eclipse.epf.authoring.ui.preferences.ApplicationPreferenceConstants;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-
-
-/**
- * The work products rollup section for activity
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ActivityWorkProductsRollupSection extends ActivityRollupSection {
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.ActivityRollupSection#initAdapterFactory()
-	 */
-	protected void initAdapterFactory() {
-		// get column descriptors
-		columnDescriptors = ProcessFormUtil.toColumnDescriptors(store
-				.getString(ApplicationPreferenceConstants.PREF_WPBS_COLUMNS));
-
-		// create adapter factory
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.createWPBSComposedAdapterFactory();
-		if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-			((ConfigurableComposedAdapterFactory) adapterFactory)
-					.setFilter(configurator);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.ActivityRollupSection#setSectionLabels()
-	 */
-	protected void setSectionLabels() {
-		section.setText(PropertiesResources.Activity_WorkProductsRollup); 
-		section.setDescription(PropertiesResources.Activity_WorkProductsRollupDescription); 
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityWorkRollupSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityWorkRollupSection.java
deleted file mode 100644
index ca03ff7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityWorkRollupSection.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.authoring.ui.preferences.ApplicationPreferenceConstants;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-
-import com.ibm.icu.util.StringTokenizer;
-
-
-/**
- * The work rollup section for activity
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ActivityWorkRollupSection extends ActivityRollupSection {
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.ActivityRollupSection#initAdapterFactory()
-	 */
-	protected void initAdapterFactory() {
-		// get column descriptors
-		columnDescriptors = getColumnDescriptors();
-
-		// create adapter factory
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.createWBSComposedAdapterFactory();
-
-		if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-			((ConfigurableComposedAdapterFactory) adapterFactory)
-					.setFilter(configurator);
-		}
-
-	}
-	
-	private ColumnDescriptor[] getColumnDescriptors() {
-		ColumnDescriptor[] descriptors = toColumnDescriptors(store
-				.getString(ApplicationPreferenceConstants.PREF_WBS_COLUMNS));
-		
-		// don't show column "Predecessors"
-		//
-		int index = -1;
-		for (int i = 0; i < descriptors.length; i++) {
-			if(descriptors[i] == ProcessEditor.COL_DESC_PREDECESSORS) {
-				index = i;
-				break;
-			}			
-		}
-		if(index != -1) {
-			ColumnDescriptor[] colDescriptors = new ColumnDescriptor[descriptors.length - 1];
-			if(index > 0) {
-				System.arraycopy(descriptors, 0, colDescriptors, 0, index);
-			}
-			int len = descriptors.length - 1 - index;
-			if(len > 0) {
-				System.arraycopy(descriptors, index + 1, colDescriptors, index, len);
-			}
-			return colDescriptors;
-		}
-		return descriptors;
-	}
-
-	/**
-	 * Convert string into colum descriptor list
-	 * @param str
-	 * @return
-	 * 		List of column descriptors
-	 */
-	public static EList toColumnDescriptorList(String str) {
-		EList columnDescriptors = new BasicEList();
-		StringTokenizer tokens = new StringTokenizer(str, ","); //$NON-NLS-1$
-		while (tokens.hasMoreTokens()) {
-			String token = tokens.nextToken();
-			// DON"T PUT INDEX COLUMN
-			if (!(token.equals(ProcessEditor.COL_DESC_ID.id))) {
-				Object columnDescriptor = ProcessEditor.idToColumnDescriptorMap
-						.get(token);
-				if (columnDescriptor != null) {
-					columnDescriptors.add(columnDescriptor);
-				}
-			}
-		}
-		return columnDescriptors;
-	}
-
-	/**
-	 * Convert string into column descriptors
-	 * @param str
-	 * @return
-	 * 		list of column descriptors
-	 */
-	public static ColumnDescriptor[] toColumnDescriptors(String str) {
-		List list = toColumnDescriptorList(str);
-		ColumnDescriptor[] columns = new ColumnDescriptor[list.size()];
-		list.toArray(columns);
-		return columns;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.ActivityRollupSection#setSectionLabels()
-	 */
-	protected void setSectionLabels() {
-		section.setText(PropertiesResources.Activity_WorkRollup); 
-		section.setDescription(PropertiesResources.Activity_WorkRollupDescription); 
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/BreakdownElementDocumentSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/BreakdownElementDocumentSection.java
deleted file mode 100644
index de3beee..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/BreakdownElementDocumentSection.java
+++ /dev/null
@@ -1,625 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.forms.BaseFormPage;
-import org.eclipse.epf.authoring.ui.forms.MethodFormToolkit;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichTextEditor;
-import org.eclipse.epf.authoring.ui.util.RichTextImageLinkContainer;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.richtext.RichTextListener;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The breakdown element documentation section
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class BreakdownElementDocumentSection extends AbstractSection {
-
-	// controls
-	protected Text prefixText;
-	
-	protected Label prefixLabel;
-
-	protected Text briefDescText;
-	
-	protected Label briefDescLabel;
-	
-	protected Text externalIDText;
-
-	protected Label externalIDLabel;
-
-	protected FormToolkit toolkit;
-
-	protected Section documentSection;
-
-	protected Composite parent;
-	
-	protected Composite documentComposite;
-
-	protected Composite expandDocumentComposite;
-
-	protected IMethodRichTextEditor ctrl_document_expanded;
-
-	protected IMethodRichText usageGuidance;
-	
-	protected RichTextImageLinkContainer usageGuidanceContainer;
-
-	protected IMethodRichText keyConsiderations;
-	
-	protected RichTextImageLinkContainer keyConsiderationsContainer;
-
-	protected Text ctrl_document_expanded_Text;
-
-	protected ImageHyperlink expandDocumentLink;
-
-	protected Label expandDocumentLabel;
-
-	protected boolean expandFlag = false;
-
-	protected boolean expandFlagText = false;
-
-	protected IMethodRichText activeControl;
-
-	protected Text activeControlText;
-
-	// element
-	protected BreakdownElement element;
-
-	// action manager
-	protected IActionManager actionMgr;
-
-	// modify listener
-	protected ModifyListener modelModifyListener;
-
-	protected ModifyListener contentModifyListener;
-
-	protected String contentElementPath;
-
-	protected String type = ""; //$NON-NLS-1$
-
-	protected String contentElementName = ""; //$NON-NLS-1$
-
-	protected int heightHint = 40;
-	
-	private Listener usageGuidanceListener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (BreakdownElement) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: usageGuidance;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((BreakdownElementDescription) element
-					.getPresentation()).getUsageGuidance();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					usageGuidance, oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getBreakdownElementDescription_UsageGuidance(),
-						newContent, -1);
-			}
-		}
-	};
-
-	private Listener keyConsiderationsListener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (BreakdownElement) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: keyConsiderations;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((ContentDescription) element.getPresentation())
-					.getKeyConsiderations();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					keyConsiderations, oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getContentDescription_KeyConsiderations(), newContent,
-						-1);
-			}
-		}
-	};
-
-	/**
-	 * Initialize
-	 */
-	protected void init() {
-		// get BreakdownElement object
-		element = (BreakdownElement) getElement();
-
-		// get toolkit
-		toolkit = getWidgetFactory();
-
-		// get action manager
-		actionMgr = EPFPropertySheetPage.getActionManager();
-
-		// set content element path
-		contentElementPath = ResourceHelper.getFolderAbsolutePath(element); 
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		this.parent = parent;
-		super.createControls(parent, tabbedPropertySheetPage);
-		init();
-
-		parent.setLayout(new GridLayout());
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create Docment section
-		createDocumentSection(parent);
-
-		// add listeners
-		addListeners();
-
-		// update controls
-		updateControls();
-	}
-
-	/**
-	 * Add listeners
-	 */
-	protected void addListeners() {
-
-		parent.addControlListener(new ControlListener() {
-			public void controlResized(ControlEvent e) {
-				if (ctrl_document_expanded != null) {
-					((GridData) ctrl_document_expanded.getLayoutData()).heightHint = getRichTextEditorHeight();
-					((GridData) ctrl_document_expanded.getLayoutData()).widthHint = getRichTextEditorWidth();
-				}
-				parent.layout(true, true);
-			}
-
-			public void controlMoved(ControlEvent e) {
-			}
-		});
-
-		
-		prefixText.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getBreakdownElement_Prefix());
-			}
-
-			public void focusLost(FocusEvent e) {
-				element = (BreakdownElement) getElement();
-				String oldContent = element.getPrefix();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						prefixText, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil.getPlainText(prefixText.getText());
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							element, UmaPackage.eINSTANCE
-									.getBreakdownElement_Prefix(), newContent,
-							-1);
-					if (status) {
-						prefixText.setText(newContent);
-					}
-				}
-			}
-		});
-
-		briefDescText.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-			}
-
-			public void focusLost(FocusEvent e) {
-				element = (BreakdownElement) getElement();
-				String oldContent = element.getBriefDescription();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						briefDescText, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil.getPlainText(briefDescText
-						.getText());
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							element, UmaPackage.eINSTANCE
-									.getMethodElement_BriefDescription(),
-							newContent, -1);
-					if (status) {
-						briefDescText.setText(newContent);
-					}
-				}
-			}
-		});
-		
-		
-		externalIDText.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getContentDescription_ExternalId());
-			}
-
-			public void focusLost(FocusEvent e) {
-				element = (BreakdownElement) getElement();				
-				
-				String oldContent = element.getPresentation().getExternalId();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						externalIDText, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil.getPlainText(externalIDText
-						.getText());
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr.doAction(IActionManager.SET,
-							element.getPresentation(), UmaPackage.eINSTANCE
-									.getContentDescription_ExternalId(),
-							newContent, -1);
-					if (status) {
-						externalIDText.setText(newContent);
-					}
-				}
-			}
-		});
-
-		BreakdownElement element = getElement();
-		
-		usageGuidance.setModalObject(element);
-		usageGuidance.setModalObjectFeature(UmaPackage.eINSTANCE.getBreakdownElementDescription_UsageGuidance());
-		usageGuidance.addListener(SWT.Deactivate, usageGuidanceListener);
-		
-		keyConsiderations.setModalObject(element);
-		keyConsiderations.setModalObjectFeature(UmaPackage.eINSTANCE.getContentDescription_KeyConsiderations());
-		keyConsiderations
-				.addListener(SWT.Deactivate, keyConsiderationsListener);
-	}
-
-	/**
-	 * Add documentation section on the given composite
-	 * @param composite
-	 */
-	protected void createDocumentSection(Composite composite) {
-		int horizontalSpan = 2;
-
-		// create document section
-		documentSection = FormUI
-				.createSection(
-						toolkit,
-						composite,
-						PropertiesResources.Process_DocumentInformationTitle, 
-						PropertiesResources.bind(PropertiesResources.Process_documentInformationDescription, PropertiesUtil.getTypeLower(element))); 
-
-		// create document composite
-		documentComposite = FormUI.createComposite(toolkit, documentSection, 3,
-				false);
-
-		// prefix
-		prefixLabel = FormUI.createLabel(toolkit, documentComposite, PropertiesResources.Process_prefix, horizontalSpan); 
-		prefixText = FormUI.createText(toolkit, documentComposite, heightHint);
-
-		// brief description
-		briefDescLabel = FormUI.createLabel(toolkit, documentComposite, PropertiesResources.Process_briefDescription, horizontalSpan); 
-		briefDescText = FormUI.createText(toolkit, documentComposite,
-				heightHint);
-		
-		// external ID
-		externalIDLabel = FormUI.createLabel(toolkit, documentComposite, AuthoringUIResources.Process_ExternalID, horizontalSpan); 
-		externalIDText = FormUI.createText(toolkit, documentComposite);
-
-		// create usage guidance
-		usageGuidanceContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, heightHint, contentElementPath, element,
-				PropertiesResources.Process_usageGuidance);
-		addHyperLinkListener(usageGuidanceContainer.link);
-		usageGuidance = usageGuidanceContainer.richText;
-
-		// create key considerations
-		keyConsiderationsContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, heightHint, contentElementPath, element,
-				PropertiesResources.BreakdownElement_keyConsiderations);
-		addHyperLinkListener(keyConsiderationsContainer.link);
-		keyConsiderations = keyConsiderationsContainer.richText;
-
-		// create expanded composite
-		expandDocumentComposite = FormUI.createComposite(toolkit,
-				documentSection, 2, true);
-
-		// Hyperlink desc
-		expandDocumentLink = FormUI.createImageHyperLink(toolkit,
-				expandDocumentComposite, AuthoringUIImages.IMG_EXPANDED,
-				AuthoringUIResources.closeRTE); 
-		addHyperLinkListener(expandDocumentLink);
-
-		// expand label
-		expandDocumentLabel = BaseFormPage.createDecoratedLabel(toolkit, expandDocumentComposite, ""); //$NON-NLS-1$
-	}
-
-	protected void addHyperLinkListener(ImageHyperlink link) {
-		link.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				toggle(e);
-			}
-		});
-	}
-
-	protected IMethodRichTextEditor toggle(HyperlinkEvent e) {
-		IMethodRichText ctrl = (IMethodRichText) e.getHref();
-		if (ctrl_document_expanded == null) {
-			ctrl_document_expanded = MethodFormToolkit.createRichTextEditor(
-					toolkit, expandDocumentComposite,
-					"", SWT.MULTI | SWT.WRAP, contentElementPath, element, expandDocumentLabel, getEditor().getEditorSite()); //$NON-NLS-1$
-			{
-				GridData gridData = new GridData(GridData.FILL_BOTH);
-				gridData.heightHint = getRichTextEditorHeight();
-				gridData.widthHint = getRichTextEditorWidth();
-				gridData.horizontalSpan = 2;
-				ctrl_document_expanded.setLayoutData(gridData);
-				// doesn't seem to work - RTE is not proper width until window is resized
-//				((GridData)expandDocumentComposite.getLayoutData()).widthHint = getRichTextEditorWidth();
-//				((GridData)parent.getLayoutData()).widthHint = getRichTextEditorWidth();
-//				parent.layout(true, true);
-			}
-
-			ctrl_document_expanded.addModifyListener(contentModifyListener);
-		}
-
-		if (expandFlag) {
-			documentComposite.setVisible(true);
-			documentSection.setClient(documentComposite);
-
-			expandDocumentComposite.setVisible(false);
-
-			ctrl = getActiveRichTextControl();
-			ctrl.setText(ctrl_document_expanded.getText());
-
-			for (Iterator i = ctrl.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_document_expanded.removeListener(listener.getEventType(),
-						listener.getListener());
-			}
-
-			if (ctrl_document_expanded.getModified()) {
-				((MethodElementEditor) getEditor())
-						.saveModifiedRichText(ctrl_document_expanded);
-			}
-
-			ctrl.setFocus();
-		} else {
-			// expanded
-			documentComposite.setVisible(false);
-			documentSection.setClient(expandDocumentComposite);
-
-			expandDocumentComposite.setVisible(true);
-
-			expandDocumentLabel.setText((String) ((ImageHyperlink) e
-					.getSource()).getData("Title")); //$NON-NLS-1$
-			setActiveRichTextControl(ctrl);
-			ctrl_document_expanded.setInitialText(ctrl.getText());
-			ctrl_document_expanded.setModalObject(ctrl.getModalObject());
-			ctrl_document_expanded.setModalObjectFeature(ctrl
-					.getModalObjectFeature());
-			ctrl_document_expanded.setFindReplaceAction(ctrl.getFindReplaceAction());
-
-			for (Iterator i = ctrl.getListeners(); i.hasNext();) {
-				RichTextListener listener = (RichTextListener) i.next();
-				ctrl_document_expanded.addListener(listener.getEventType(),
-						listener.getListener());
-			}
-
-		}
-
-		documentSection.layout(true);
-
-		// set editable
-		if (ctrl_document_expanded != null)
-			ctrl_document_expanded.setEditable(editable);
-
-		expandFlag = !expandFlag;
-		return ctrl_document_expanded;
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof BreakdownElement) {
-				((MethodElementEditor) getEditor()).saveModifiedRichText();
-
-				element = (BreakdownElement) getElement();
-				BreakdownElementDescription content = (BreakdownElementDescription) element
-						.getPresentation();
-
-				// update section name
-				documentSection
-						.setDescription(PropertiesResources.bind(PropertiesResources.Process_documentInformationDescription, PropertiesUtil.getTypeLower(element))); 
-
-				if (modelModifyListener != null) {
-					prefixText.removeModifyListener(modelModifyListener);
-					briefDescText.removeModifyListener(modelModifyListener);
-					
-				}
-
-				if (contentModifyListener != null) {
-					externalIDText.removeModifyListener(contentModifyListener);
-					usageGuidance.removeModifyListener(contentModifyListener);
-					keyConsiderations
-							.removeModifyListener(contentModifyListener);
-				}
-
-				modelModifyListener = getEditor().createModifyListener(element);
-				contentModifyListener = getEditor().createModifyListener(
-						element.getPresentation());
-
-				if (modelModifyListener != null
-						&& modelModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) modelModifyListener)
-							.setElement(element);
-					((MethodElementEditor.ModifyListener) modelModifyListener)
-							.setDisable(true);
-				}
-
-				if (contentModifyListener != null
-						&& contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) contentModifyListener)
-							.setElement(element.getPresentation());
-					((MethodElementEditor.ModifyListener) contentModifyListener)
-							.setDisable(true);
-				}
-
-				prefixText.setText(element.getPrefix());
-				briefDescText.setText(element.getBriefDescription());
-				externalIDText.setText(content.getExternalId());
-
-				usageGuidance.setText(content.getUsageGuidance());
-				keyConsiderations.setText(content.getKeyConsiderations());
-
-				if (expandFlag) {
-					if (expandDocumentLabel.getText().equals(
-							PropertiesResources.Process_usageGuidance)) 
-					{
-						ctrl_document_expanded.setText(content
-								.getUsageGuidance());
-						ctrl_document_expanded.setSelection(0);
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getBreakdownElementDescription_UsageGuidance());
-					} else if (expandDocumentLabel.getText()
-							.equals(
-									PropertiesResources.BreakdownElement_keyConsiderations)) 
-					{
-						ctrl_document_expanded.setText(content
-								.getKeyConsiderations());
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getContentDescription_KeyConsiderations());
-					}
-				}
-
-				updateControls();
-
-				if (modelModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) modelModifyListener)
-							.setDisable(false);
-				}
-				if (contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) contentModifyListener)
-							.setDisable(false);
-				}
-
-				prefixText.addModifyListener(modelModifyListener);
-				briefDescText.addModifyListener(modelModifyListener);
-				
-				externalIDText.addModifyListener(contentModifyListener);
-				usageGuidance.setModalObject(content);
-				usageGuidance.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getBreakdownElementDescription_UsageGuidance());
-				usageGuidance.addModifyListener(contentModifyListener);
-
-				keyConsiderations.setModalObject(content);
-				keyConsiderations.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getContentDescription_KeyConsiderations());
-				keyConsiderations.addModifyListener(contentModifyListener);
-			}
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing breakdown element documentation section", ex); //$NON-NLS-1$
-		}
-	}
-
-	protected void updateControls() {
-		prefixText.setEditable(editable);
-		briefDescText.setEditable(editable);
-		externalIDText.setEditable(editable);
-		usageGuidance.setEditable(editable);
-		keyConsiderations.setEditable(editable);
-	}
-
-	/**
-	 * Sets the active "unexpanded" rich text control.
-	 */
-	private void setActiveRichTextControl(IMethodRichText ctrl) {
-		activeControl = ctrl;
-	}
-
-	/**
-	 * Returns the active "unexpanded" rich text control.
-	 */
-	private IMethodRichText getActiveRichTextControl() {
-		return activeControl;
-	}
-	
-	/**
-	 * Get height of the rich text control
-	 * @return
-	 * 		Height of the rich text control
-	 */
-	public int getRichTextEditorHeight() {
-		return parent.getBounds().height - 3 * 32;
-	}
-
-	/**
-	 * Get width of the rich text control
-	 * @return
-	 * 		Width of the rich text control
-	 */
-	public int getRichTextEditorWidth() {
-		return parent.getBounds().width - 2 * 32;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/BreakdownElementGeneralSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/BreakdownElementGeneralSection.java
deleted file mode 100644
index f602b8b..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/BreakdownElementGeneralSection.java
+++ /dev/null
@@ -1,703 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.Arrays;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyComposite;
-import org.eclipse.ui.internal.views.properties.tabbed.view.TabbedPropertyTitle;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The general tab section for breakdownElement
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class BreakdownElementGeneralSection extends AbstractSection {
-	// controls
-	protected FormToolkit toolkit;
-
-	protected Section generalSection;
-
-	protected Composite generalComposite, checkBoxComposite;
-
-	protected Text nameText;
-
-	protected Text presentationNameText;
-
-	private Button multipleButton, optionalButton;
-
-	private Button plannedButton, supressedButton;
-
-	protected int numOfColumns = 4;
-
-	protected int horizontalSpan = 3;
-
-	// private TabbedPropertySheetPage tabbedPropertySheetPage;
-
-	// element
-	protected BreakdownElement element;
-
-	// action manager
-	protected IActionManager actionMgr;
-
-	// modify listener
-	protected ModifyListener modelModifyListener;
-
-	protected ModifyListener nameModifyListener;
-
-	private ILabelProvider labelProvider;
-
-	final boolean ignoreSuppressed = true;
-
-	protected Listener nameDeactivateListener = new Listener() {
-		public void handleEvent(Event e) {
-			AdapterFactory adapterFactory = EPFPropertySheetPage
-					.getAdapterFactory();
-
-			element = (BreakdownElement) getElement();
-			String oldContent = element.getName();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					nameText, oldContent)) {
-				return;
-			}
-
-			String message = null;
-			if (!StrUtil.isBlank(element.getName())) {
-				Suppression suppression = EPFPropertySheetPage.getEditor()
-						.getSuppression();
-				message = ProcessUtil.checkBreakdownElementName(
-						adapterFactory, element, nameText.getText(),
-						suppression, ignoreSuppressed);
-			}
-			if (message == null) {
-				if (!nameText.getText().equals(oldContent)) {
-					if ((element instanceof Activity)
-							&& (element.eContainer() instanceof ProcessComponent)) {
-						ProcessComponent procComp = (ProcessComponent) element
-								.eContainer();
-						IValidator validator = IValidatorFactory.INSTANCE
-								.createNameValidator(
-										procComp,
-										TngAdapterFactory.INSTANCE
-												.getNavigatorView_ComposedAdapterFactory());
-						String msg = validator.isValid(nameText.getText());
-
-						if (msg == null) {
-							msg = PropertiesResources.Process_Rename_Message; 
-
-							if (AuthoringUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayConfirmation(
-											PropertiesResources.Process_Rename_Title, msg)) { 
-								e.doit = true;
-								boolean status = actionMgr.doAction(
-										IActionManager.SET, element,
-										UmaPackage.eINSTANCE
-												.getNamedElement_Name(),
-										nameText.getText(), -1);
-								if (!status) {
-									return;
-									// nameText.setText(element.getName());
-
-								}
-								actionMgr.doAction(IActionManager.SET,
-										procComp, UmaPackage.eINSTANCE
-												.getNamedElement_Name(),
-										nameText.getText(), -1);
-								getEditor().setPartName();
-
-								// adjust plugin location and save the
-								// editor
-								//
-								BusyIndicator.showWhile(Display
-										.getDefault(), new Runnable() {
-
-									public void run() {
-										MethodElementEditor editor = (MethodElementEditor) getEditor();
-										editor
-												.doSave(new NullProgressMonitor());
-										ILibraryPersister.FailSafeMethodLibraryPersister persister = editor
-												.getPersister();
-										try {
-											persister
-													.adjustLocation(element
-															.eResource());
-											persister.commit();
-										} catch (RuntimeException e) {
-											persister.rollback();
-											throw e;
-										}
-										//	 adjust diagram resource as well
-										//
-										if (element instanceof Process) {
-											DiagramManager mgr = DiagramManager.getInstance((Process) element, this);
-											if(mgr != null) {
-												try {
-													mgr.updateResourceURI();
-												}
-												catch(Exception e) {
-													AuthoringUIPlugin.getDefault().getLogger().logError(e);
-												}
-												finally {
-													mgr.removeConsumer(this);
-												}
-											}
-										}
-									}
-
-								});
-							} else {
-								// replace with existing name
-								nameText.setText(oldContent);
-								return;
-							}
-						} else {
-							// restore the old name first, then present the
-							// error message box
-							nameText.setText(oldContent);
-							AuthoringUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayError(
-											PropertiesResources.Process_InvalidNameTitle, msg); 
-							e.doit = false;
-							nameText.getDisplay().asyncExec(new Runnable() {
-								public void run() {
-									nameText.setFocus();
-									nameText.selectAll();
-								}
-							});
-						}
-					} else {
-						e.doit = true;
-						boolean status = actionMgr
-								.doAction(IActionManager.SET, element,
-										UmaPackage.eINSTANCE
-												.getNamedElement_Name(),
-										nameText.getText(), -1);
-						if (!status) {
-							return;
-						}
-					}
-				}
-			} else {
-				// restore the old name first, then present the error
-				// message box
-				nameText.setText(oldContent);
-				AuthoringUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayError(
-								PropertiesResources.Process_InvalidNameTitle, message); 
-				e.doit = false;
-				nameText.getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						nameText.setFocus();
-						nameText.selectAll();
-					}
-				});
-
-			}
-		}
-	};
-
-	protected Listener presentationNameDeactivateListener = new Listener() {
-		public void handleEvent(Event e) {
-			AdapterFactory adapterFactory = EPFPropertySheetPage
-					.getAdapterFactory();
-
-			element = (BreakdownElement) getElement();
-			String oldContent = element.getPresentationName();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					presentationNameText, oldContent)) {
-				return;
-			}
-
-			String message = null;
-			
-			// you can have blank presentation name for activity that extends 
-			if (StrUtil.isBlank(presentationNameText.getText())
-					&& element instanceof VariabilityElement) {
-				VariabilityElement ve = (VariabilityElement) element;
-				if (ve.getVariabilityBasedOnElement() != null
-						&& ve.getVariabilityType().equals(
-								VariabilityType.EXTENDS_LITERAL)) {
-					
-					e.doit = true;
-					if (!presentationNameText.getText().equals(oldContent)) {
-						boolean status = actionMgr
-								.doAction(
-										IActionManager.SET,
-										element,
-										UmaPackage.eINSTANCE
-												.getDescribableElement_PresentationName(),
-										presentationNameText.getText(), -1);
-						if (!status) {
-							return;
-						}
-					}
-				}
-			}
-			
-			if (!StrUtil.isBlank(element.getPresentationName())) {
-				Suppression suppression = EPFPropertySheetPage.getEditor()
-						.getSuppression();
-				message = ProcessUtil
-						.checkBreakdownElementPresentationName(
-								adapterFactory, element,
-								presentationNameText.getText(), suppression, ignoreSuppressed);
-			}
-
-			if (message == null) {
-				e.doit = true;
-				if (!presentationNameText.getText().equals(oldContent)) {
-					boolean status = actionMgr
-							.doAction(
-									IActionManager.SET,
-									element,
-									UmaPackage.eINSTANCE
-											.getDescribableElement_PresentationName(),
-									presentationNameText.getText(), -1);
-					if (!status) {
-						return;
-					}
-				}
-			} else {
-				// restore the old name first, then present the error
-				// message box
-				presentationNameText.setText(element.getPresentationName());
-
-				AuthoringUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayError(
-								PropertiesResources.Process_InvalidNameTitle, message); 
-				e.doit = false;
-				presentationNameText.getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						presentationNameText.setFocus();
-					}
-				});
-			}
-		}
-	};
-	protected void init() {
-		// get BreakdownElement object
-		element = (BreakdownElement) getElement();
-
-		// get toolkit
-		toolkit = getWidgetFactory();
-
-		// get action manager
-		actionMgr = EPFPropertySheetPage.getActionManager();
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		init();
-		// this.tabbedPropertySheetPage = tabbedPropertySheetPage;
-
-		parent.setLayout(new GridLayout());
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create general section
-		createGeneralSection(parent);
-
-		// addListeners
-		addListeners();
-
-		// update controls
-		updateControls();
-
-	}
-
-	/**
-	 *  Add listeners
-	 */
-	protected void addListeners() {
-		nameText.addListener(SWT.Activate, new Listener() {
-
-			public void handleEvent(Event event) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(event.widget,
-						UmaPackage.eINSTANCE.getNamedElement_Name());
-			}
-			
-		});
-		nameText.addListener(SWT.Deactivate, nameDeactivateListener);
-
-		presentationNameText.addListener(SWT.Activate, new Listener() {
-
-			public void handleEvent(Event event) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(event.widget,
-						UmaPackage.eINSTANCE.getDescribableElement_PresentationName());
-			}
-			
-		});		
-		presentationNameText.addListener(SWT.Deactivate, presentationNameDeactivateListener);
-
-		multipleButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				element = (BreakdownElement) getElement();
-
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						element, UmaPackage.eINSTANCE
-								.getBreakdownElement_HasMultipleOccurrences(),
-						Boolean.valueOf(multipleButton.getSelection()), -1);
-				if (!status)
-					multipleButton.setSelection(element
-							.getHasMultipleOccurrences().booleanValue());
-
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		optionalButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				element = (BreakdownElement) getElement();
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						element, UmaPackage.eINSTANCE
-								.getBreakdownElement_IsOptional(), Boolean
-								.valueOf(optionalButton.getSelection()), -1);
-				if (!status)
-					optionalButton.setSelection(element.getIsOptional()
-							.booleanValue());
-
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		plannedButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				element = (BreakdownElement) getElement();
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						element, UmaPackage.eINSTANCE
-								.getBreakdownElement_IsPlanned(), Boolean
-								.valueOf(plannedButton.getSelection()), -1);
-				if (!status)
-					plannedButton.setSelection(element.getIsPlanned()
-							.booleanValue());
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		supressedButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				element = (BreakdownElement) getElement();
-				if (element.getSuppressed().booleanValue()) {
-					// revealing
-					ProcessEditor editor = getEditor();
-					Suppression suppression = editor.getSuppression();
-					boolean canReveal = ProcessEditor.canReveal(
-							Arrays.asList(new Object[] { element }),
-							EPFPropertySheetPage.getAdapterFactory(),
-							suppression);
-				
-					if (!canReveal)					
-						supressedButton.setSelection(true);	
-					else
-						supressedButton.setSelection(false);
-				}
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						element, UmaPackage.eINSTANCE
-								.getMethodElement_Suppressed(), Boolean
-								.valueOf(supressedButton.getSelection()), -1);
-				if (!status)
-					supressedButton.setSelection(element.getSuppressed()
-							.booleanValue());
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-	}
-
-	/**
-	 * Create general section on the given composite
-	 * @param composite
-	 */
-	protected void createGeneralSection(Composite composite) {
-		// create general section
-		generalSection = FormUI
-				.createSection(
-						toolkit,
-						composite,
-						PropertiesResources.Process_generalInformationTitle, 
-						PropertiesResources.bind(PropertiesResources.Process_generalInformationDescription, PropertiesUtil.getTypeLower(element))); 
-
-		// create general composite
-		generalComposite = FormUI.createComposite(toolkit, generalSection,
-				numOfColumns, false);
-
-		// name
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.Process_name); 
-		nameText = FormUI.createText(toolkit, generalComposite, SWT.DEFAULT,
-				horizontalSpan);
-
-		// presentation name
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.Activity_presentationName); 
-		presentationNameText = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, horizontalSpan);
-
-		// create composite for checkbox
-		checkBoxComposite = FormUI.createComposite(toolkit, generalComposite,
-				GridData.FILL_HORIZONTAL, numOfColumns, true);
-
-		// optional
-		optionalButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		optionalButton.setText(PropertiesResources.BreakdownElement_Option_Optional); 
-
-		// Multiple Ocurrances
-		multipleButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		multipleButton.setText(PropertiesResources.BreakdownElement_Option_MultipleOcurrance); 
-
-		// planned
-		plannedButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		plannedButton.setText(PropertiesResources.BreakdownElement_Option_Planned); 
-
-		// supressed
-		supressedButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		supressedButton.setText(PropertiesResources.BreakdownElement_Option_Supressed); 
-		supressedButton.setEnabled(false);
-
-		toolkit.paintBordersFor(generalComposite);
-		toolkit.paintBordersFor(checkBoxComposite);
-
-	}
-
-	/**
-	 * Modify listner for name and presentation name
-	 *
-	 */
-	public class NameModifyListener extends MethodElementEditor.ModifyListener {
-		/**
-		 * Creates a new instance.
-		 */
-
-		public NameModifyListener(EObject element, boolean checkContainer) {
-
-			getEditor().super(element, checkContainer);
-		}
-
-		public void modifyText(ModifyEvent e) {
-			super.modifyText(e);
-
-			updateTitle(nameText.getText());
-		}
-	}
-
-	/**
-	 * Create name modify listener for the given object
-	 * @param eObj
-	 * @return
-	 * 			listener
-	 */
-	public ModifyListener createNameModifyListener(EObject eObj) {
-		return createNameModifyListener(eObj, false);
-	}
-
-	public ModifyListener createNameModifyListener(EObject eObj,
-			boolean checkContainer) {
-		return new NameModifyListener(eObj, checkContainer);
-	}
-
-	/**
-	 * Update title of the properties page
-	 * @param txt
-	 * 			new title
-	 */
-	public void updateTitle(String txt) {
-		String name = getNamePrefix() + txt;
-		TabbedPropertyComposite comp = (TabbedPropertyComposite) page
-				.getControl();
-		TabbedPropertyTitle title = comp.getTitle();
-
-		title.setTitle(name, getImage(element));
-	}
-
-	private Image getImage(Object obj) {
-		if (labelProvider == null) {
-			labelProvider = new AdapterFactoryLabelProvider(
-					TngUtil.umaItemProviderAdapterFactory);
-		}
-		Image titleImage = labelProvider.getImage(obj);
-		return titleImage;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#dispose()
-	 */
-	public void dispose() {
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-	}
-
-	/*
-	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof BreakdownElement) {
-				// get BreakdownElement object
-				element = (BreakdownElement) getElement();
-
-				// update section name
-				generalSection
-						.setDescription(PropertiesResources.bind(PropertiesResources.Process_generalInformationDescription, PropertiesUtil.getTypeLower(element))); 
-
-				// Model Modify listener for presentation name
-				if (modelModifyListener != null) {
-					presentationNameText
-							.removeModifyListener(modelModifyListener);
-				}
-				modelModifyListener = getEditor().createModifyListener(element);
-
-				// Modify listener for name
-				if (nameModifyListener != null)
-					nameText.removeModifyListener(nameModifyListener);
-
-				if (element instanceof Process) {
-					nameModifyListener = createNameModifyListener(
-							((Process) element).eContainer(), true);
-				} else {
-					nameModifyListener = createNameModifyListener(element);
-				}
-
-				if (modelModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) modelModifyListener)
-							.setElement(element);
-					((MethodElementEditor.ModifyListener) modelModifyListener)
-							.setDisable(true);
-				}
-				if (nameModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) nameModifyListener)
-							.setDisable(true);
-				}
-
-				nameText.setText(element.getName());
-				presentationNameText.setText(element.getPresentationName());
-
-				if (modelModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) modelModifyListener)
-							.setDisable(false);
-				}
-				if (nameModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) nameModifyListener)
-							.setDisable(false);
-				}
-
-				nameText.addModifyListener(nameModifyListener);
-				presentationNameText.addModifyListener(modelModifyListener);
-
-				multipleButton.setSelection(element.getHasMultipleOccurrences()
-						.booleanValue());
-				optionalButton.setSelection(element.getIsOptional()
-						.booleanValue());
-				plannedButton.setSelection(element.getIsPlanned()
-						.booleanValue());
-				// get selected original input object
-				Object input = getInput();
-				if (input instanceof BreakdownElementWrapperItemProvider) {
-					if (getEditor().getSuppression().isInSuppressedList(
-							(BreakdownElementWrapperItemProvider) input)) {
-						supressedButton.setSelection(true);
-					} else {
-						supressedButton.setSelection(false);
-					}
-				} else
-				supressedButton.setSelection(element.getSuppressed()
-						.booleanValue());
-
-				updateControls();
-			}
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing breakdown element general section" + element, ex); //$NON-NLS-1$
-		}
-	}
-
-	protected void updateControls() {
-		nameText.setEditable(editable);
-		presentationNameText.setEditable(editable);
-		nameText.setEnabled(editable);
-		presentationNameText.setEnabled(editable);
-
-		multipleButton.setEnabled(editable);
-		optionalButton.setEnabled(editable);
-		plannedButton.setEnabled(editable);
-//		supressedButton.setEnabled(editable);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/CompositeRoleRoleSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/CompositeRoleRoleSection.java
deleted file mode 100644
index d1fa204..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/CompositeRoleRoleSection.java
+++ /dev/null
@@ -1,248 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.filters.DescriptorProcessFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The composite role - role section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class CompositeRoleRoleSection extends OBSRelationSection {
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#initContentProvider()
-	 */
-	protected void initContentProvider() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				element = getElement();
-				return getFilteredList(
-						((CompositeRole) element).getAggregatedRoles())
-						.toArray();
-			}
-		};
-
-		viewer.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#init()
-	 */
-	protected void init() {
-		super.init();
-		element = (CompositeRole) element;
-
-		String title = PropertiesResources.CompositeRole_Role_SectionTitle;
-		String desc = PropertiesResources.CompositeRole_Role_SectionDescription;
-		String table1 = PropertiesResources.CompositeRole_Role_Table1;
-		setTabData(title, desc, table1); 
-		showAddFromProcessButton = true;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof CompositeRole) {
-				super.refresh();
-
-				element = (CompositeRole) getElement();
-				viewer.refresh();
-			}
-		} catch (Exception ex) {
-			logger.logError(
-					"Error refreshing Composite role - role sectin ", ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Add composite roles 
-	 * @param items
-	 * 		List of roles
-	 */
-	private void add(List items) {
-		// update the model
-		if (items != null) {
-			for (Iterator itor = items.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (obj instanceof Role) {
-					actionMgr.doAction(IActionManager.ADD,
-							(CompositeRole) element, UmaPackage.eINSTANCE
-									.getCompositeRole_AggregatedRoles(),
-							(Role) obj, -1);
-				} else if (obj instanceof RoleDescriptor) {
-					Role role = ((RoleDescriptor) obj).getRole();
-					if (role != null)
-						actionMgr.doAction(IActionManager.ADD,
-								(CompositeRole) element, UmaPackage.eINSTANCE
-										.getCompositeRole_AggregatedRoles(),
-								role, -1);
-					else {
-						MessageFormat mf = new MessageFormat(
-								PropertiesResources.Process_CompositeRoleAssignError); 
-						Object[] args = { ((RoleDescriptor) obj).getName(),
-								((CompositeRole) element).getName() };
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayInfo(
-										PropertiesResources.Process_AssignmentInfoTitle, mf.format(args)); 
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#remove(java.util.ArrayList)
-	 */
-	protected void remove(ArrayList rmItems) {
-		// update the model
-		if (!rmItems.isEmpty()) {
-			for (Iterator itor = rmItems.iterator(); itor.hasNext();) {
-				Role role = (Role) itor.next();
-				actionMgr.doAction(IActionManager.REMOVE,
-						(CompositeRole) element, UmaPackage.eINSTANCE
-								.getCompositeRole_AggregatedRoles(), role, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#openAddDialog()
-	 */
-	protected void openAddDialog() {
-		List existingElements = ((CompositeRole) element).getAggregatedRoles();
-		ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(), getFilter(), element,
-				FilterConstants.ROLES, existingElements);
-
-		fd.setBlockOnOpen(true);
-		fd.setTitle(FilterConstants.ROLES);
-		fd.open();
-		add(fd.getSelectedItems());
-
-	}
-
-	private List getExistingElements() {
-		return null;
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#openAddFromProcessDialog()
-	 */
-	protected void openAddFromProcessDialog() {
-		String tabName = FilterConstants.ROLE_DESCRIPTORS;
-		List existingElements = getExistingElements();
-		Process process = (Process) getProcess(element);
-		IFilter descriptorFilter = getDescriptorFilter();
-		if (descriptorFilter != null && process != null) {
-			ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-					.getWorkbench().getActiveWorkbenchWindow().getShell(),
-					descriptorFilter, process, tabName, existingElements);
-			fd.setBlockOnOpen(true);
-			fd.setTitle(FilterConstants.ROLE_DESCRIPTORS);
-			fd.open();
-			add(fd.getSelectedItems());
-		}
-	}
-
-	/**
-	 * Get parent Find parent until it's activity.
-	 * 
-	 * @param element
-	 * @return
-	 * 		process object
-	 */
-	protected Object getProcess(BreakdownElement element) {
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				element, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(element);
-		if (parent instanceof Process) {
-			return parent;
-
-		} else {
-			return getProcess((BreakdownElement) parent);
-		}
-	}
-
-	/**
-	 * Return descriptor process filter
-	 */
-	protected IFilter getDescriptorFilter() {
-		return new DescriptorProcessFilter(getConfiguration()) {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof Activity) {
-					// List list = ((Activity)obj).getBreakdownElements();
-					List list = new ArrayList();
-					getActivitiesInScope(TngAdapterFactory.INSTANCE
-							.getOBS_ComposedAdapterFactory(), element, list);
-					if (list.contains(obj))
-						return true;
-					else
-						return false;
-				}
-				if (obj instanceof CompositeRole) {
-					if (obj.equals(element))
-						return false;
-				}
-				if (obj instanceof RoleDescriptor)
-					return true;
-				return false;
-			}
-		};
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/DescriptorDocumentSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/DescriptorDocumentSection.java
deleted file mode 100644
index 0d378fb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/DescriptorDocumentSection.java
+++ /dev/null
@@ -1,168 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.util.RichTextImageLinkContainer;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-
-
-/**
- * The document tab section for Descriptor
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class DescriptorDocumentSection extends BreakdownElementDocumentSection {
-
-	protected Descriptor element;
-
-	private IMethodRichText refinedDesc;
-
-	private Listener listener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (Descriptor) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: refinedDesc;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((DescriptorDescription) element
-					.getPresentation()).getRefinedDescription();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(
-					refinedDesc, oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getDescriptorDescription_RefinedDescription(),
-						newContent, -1);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#init()
-	 */
-	protected void init() {
-		super.init();
-		element = (Descriptor) getElement();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#createDocumentSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createDocumentSection(Composite composite) {
-		super.createDocumentSection(composite);
-		int heightHint = 200;
-
-		// refined description
-		RichTextImageLinkContainer refinedContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, heightHint, contentElementPath, element,
-				PropertiesResources.Descriptor_RefinedDescription);
-		addHyperLinkListener(refinedContainer.link);
-		refinedDesc = refinedContainer.richText;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-		refinedDesc.setModalObject(getElement());
-		refinedDesc.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getDescriptorDescription_RefinedDescription());
-		refinedDesc.addListener(SWT.Deactivate, listener);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-		refinedDesc.setEditable(editable);
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof Descriptor) {
-				((MethodElementEditor) getEditor()).saveModifiedRichText();
-
-				element = (Descriptor) getElement();
-				DescriptorDescription content = (DescriptorDescription) element
-						.getPresentation();
-
-				if (contentModifyListener != null) {
-					refinedDesc.removeModifyListener(contentModifyListener);		
-				}
-			
-				super.refresh();
-
-				if (contentModifyListener != null) {
-					if (contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-						((MethodElementEditor.ModifyListener) contentModifyListener)
-								.setElement(element.getPresentation());
-						((MethodElementEditor.ModifyListener) contentModifyListener)
-								.setDisable(true);
-					}
-				}
-				
-				
-				refinedDesc.setText(content.getRefinedDescription());
-
-				if (expandFlag) {
-					if (expandDocumentLabel.getText()
-							.equals(
-									PropertiesResources.Descriptor_RefinedDescription)) { 
-						ctrl_document_expanded.setText(content
-								.getRefinedDescription());
-						ctrl_document_expanded.setSelection(0);
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getDescriptorDescription_RefinedDescription());
-					}
-				}
-
-				if (contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) contentModifyListener)
-							.setDisable(false);
-				}
-
-				refinedDesc.setModalObject(content);
-				refinedDesc.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getDescriptorDescription_RefinedDescription());
-				refinedDesc.addModifyListener(contentModifyListener);
-			}
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error while refreshing descriptor documentation section :", ex); //$NON-NLS-1$
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/DescriptorGeneralSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/DescriptorGeneralSection.java
deleted file mode 100644
index ca7b19c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/DescriptorGeneralSection.java
+++ /dev/null
@@ -1,118 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.UmaPackage;
-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.Composite;
-
-
-/**
- * The general tab section for Descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class DescriptorGeneralSection extends BreakdownElementGeneralSection {
-	protected Descriptor element;
-
-	private Button synchronizedButton;
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#init()
-	 */
-	protected void init() {
-		super.init();
-
-		// get Descriptor object
-		element = (Descriptor) getElement();
-
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#createGeneralSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createGeneralSection(Composite composite) {
-		super.createGeneralSection(composite);
-
-		// create composite for checkbox
-		checkBoxComposite = FormUI.createComposite(toolkit, generalComposite,
-				GridData.FILL_HORIZONTAL, numOfColumns, true);
-
-		synchronizedButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		synchronizedButton.setText(PropertiesResources.BreakdownElement_Option_Synchronized); 
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-
-		synchronizedButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				actionMgr.doAction(IActionManager.SET, element,
-						UmaPackage.eINSTANCE
-								.getDescriptor_IsSynchronizedWithSource(),
-						Boolean.valueOf(synchronizedButton.getSelection()), -1);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-		synchronizedButton.setEnabled(editable);
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof Descriptor) {
-				super.refresh();
-
-				element = (Descriptor) getElement();
-
-				synchronizedButton.setSelection(element
-						.getIsSynchronizedWithSource().booleanValue());
-			}
-
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing Descriptor general section: ", ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#getNamePrefix()
-	 */
-	public String getNamePrefix() {
-		return LibraryUIText.TEXT_DESCRIPTOR + ": "; //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/EPFPropertySheetPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/EPFPropertySheetPage.java
deleted file mode 100644
index 3a8cb6a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/EPFPropertySheetPage.java
+++ /dev/null
@@ -1,188 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.authoring.ui.forms.ProcessBreakdownStructureFormPage;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.views.properties.IPropertySheetEntry;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.ui.views.properties.PropertySheetEntry;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * This class represents property sheet page for process elements
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class EPFPropertySheetPage extends TabbedPropertySheetPage {
-
-	private IPropertySheetEntry rootEntry;
-
-	private static IPropertySourceProvider sourceProvider;
-
-	private static ISelection selection = null;
-
-	private static IActionManager actionMgr;
-
-	private static ProcessEditor processEditor;
-
-	public static String formPageID = null;
-	
-	private static ProcessBreakdownStructureFormPage formPage = null;
-
-	public EPFPropertySheetPage(ProcessEditor editor) {
-		super((ITabbedPropertySheetPageContributor) editor);
-
-		actionMgr = ((ProcessEditor) editor).getActionManager();
-		processEditor = editor;
-
-	}
-
-	/**
-	 * Get action manager
-	 * @return
-	 * 			Action Manager
-	 */
-	public static IActionManager getActionManager() {
-		return actionMgr;
-	}
-
-	/**
-	 * Get editor associated with property sheet page
-	 * @return
-	 * 			Process Editor
-	 */
-	public static ProcessEditor getEditor() {
-		return processEditor;
-	}
-
-	/**
-	 * Sets the given property source provider as the property source provider.
-	 * <p>
-	 * Calling this method is only valid if you are using this page's default
-	 * root entry.
-	 * </p>
-	 * 
-	 * @param newProvider
-	 *            the property source provider
-	 */
-	public void setPropertySourceProvider(IPropertySourceProvider newProvider) {
-		sourceProvider = newProvider;
-		if (rootEntry == null) {
-			// create a new root
-			PropertySheetEntry root = new PropertySheetEntry();
-
-			rootEntry = root;
-		}
-		if (sourceProvider != null) {
-			// set the property source provider for root entry
-			if (rootEntry instanceof PropertySheetEntry) {
-				((PropertySheetEntry) rootEntry)
-						.setPropertySourceProvider(sourceProvider);
-			}
-		}
-	}
-
-	/**
-	 * Return property source provider
-	 */
-	public static IPropertySourceProvider getPropertySourceProvider() {
-		return sourceProvider;
-	}
-
-	/**
-	 * Return selection of the object from breakdown structure of the process editor
-	 */
-	public static ISelection getSelection() {
-		return selection;
-	}
-
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection sel) {
-		selection = sel;
-
-		if (part instanceof ProcessEditor) {
-			processEditor = (ProcessEditor) part;
-			actionMgr = processEditor.getActionManager();
-			IFormPage activePage = processEditor.getActivePageInstance();
-			if (activePage instanceof ProcessBreakdownStructureFormPage)
-				formPage = (ProcessBreakdownStructureFormPage) activePage;
-			formPageID = activePage != null ? activePage.getId() : null;
-		}
-
-		super.selectionChanged(part, selection);
-		
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage#handlePartActivated(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void handlePartActivated(IWorkbenchPart part) {
-		if (part instanceof ProcessEditor) {
-			processEditor = (ProcessEditor) part;
-			selection = processEditor.getSelection();
-			actionMgr = processEditor.getActionManager();
-			IFormPage activePage = processEditor.getActivePageInstance();
-			if (activePage instanceof ProcessBreakdownStructureFormPage)
-				formPage = (ProcessBreakdownStructureFormPage) activePage;
-			formPageID = activePage != null ? activePage.getId() : null;
-		}
-
-		super.handlePartActivated(part);
-		
-		this.refresh();
-	}
-
-	/**
-	 * Get current adapter factory of editor
-	 * @return
-	 * 			Adapter Factory
-	 */
-	public static AdapterFactory getAdapterFactory() {
-		return formPage.getAdapterFactory();
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage#refresh()
-	 */
-	public void refresh() {
-
-		// will see if this works..
-		try {
-			super.refresh();
-		} catch (Exception e) {
-
-		}
-		
-// TODO - get rid of internal APIs.
-//		if (this.getCurrentTab() != null) {
-//			this.getCurrentTab().refresh();
-//
-//			// also refresh section
-//			ISection section = this.getCurrentTab().getSectionAtIndex(0);
-//			if (section != null) {
-//				section.refresh();
-//			}
-//		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ElementLabelProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ElementLabelProvider.java
deleted file mode 100644
index 394de7f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ElementLabelProvider.java
+++ /dev/null
@@ -1,165 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-
-/**
- * Label provider for the title bar for the tabbed property sheet page.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ElementLabelProvider extends LabelProvider {
-
-	private ITypeMapper typeMapper;
-
-	private ILabelProvider labelProvider = null;
-
-	/**
-	 * Create an instance
-	 */
-	public ElementLabelProvider() {
-		super();
-		typeMapper = new ElementTypeMapper();
-	}
-
-	
-	/**
-	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object objects) {
-		if (objects == null || objects.equals(StructuredSelection.EMPTY)) {
-			return null;
-		}
-		Image image = LibraryUIImages.IMG_PROCESS;
-		final boolean multiple[] = { false };
-		final Object object = getObject(objects, multiple);
-		if (object == null || ((IStructuredSelection) objects).size() > 1) {
-			return image;
-		} else {
-			Object obj = LibraryUtil.unwrap(object);
-			if (labelProvider == null) {
-				labelProvider = new AdapterFactoryLabelProvider(TngUtil.umaItemProviderAdapterFactory);
-			}
-			Image titleImage = labelProvider.getImage(obj);
-
-			return titleImage;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.LabelProvider#dispose()
-	 */
-	public void dispose() {
-		labelProvider.dispose();
-	}
-
-
-	/**
-	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object objects) {
-		if (objects == null || objects.equals(StructuredSelection.EMPTY)) {
-			return PropertiesResources.Process_NoItems; 
-		}
-		final boolean multiple[] = { false };
-		final Object object = getObject(objects, multiple);
-		if (object == null || ((IStructuredSelection) objects).size() > 1) {
-			Object size = new Integer(((IStructuredSelection) objects).size());
-			String msg = PropertiesResources.bind(PropertiesResources.Process_ItemsSelected, (new Object[] { size })); 
-			return msg;
-		} else {
-
-			Object obj = LibraryUtil.unwrap(object);
-			return getName(obj);
-		}
-	}
-
-	private String getName(Object obj) {
-		String name = null;
-
-		String prefix = PropertiesUtil.getType(obj);
-
-		if (obj instanceof BreakdownElement) {
-			name = prefix + " : " + ((BreakdownElement) obj).getName(); //$NON-NLS-1$
-		} else {
-			name = PropertiesResources.Process_NoPropertiesAvailable; 
-		}
-
-		return name;
-	}
-
-	/**
-	 * Determine if a multiple object selection has been passed to the label
-	 * provider. If the objects is a IStructuredSelection, see if all the
-	 * objects in the selection are the same and if so, we want to provide
-	 * labels for the common selected element.
-	 * 
-	 * @param objects
-	 *            a single object or a IStructuredSelection.
-	 * @param multiple
-	 *            first element in the array is true if there is multiple
-	 *            unequal selected elements in a IStructuredSelection.
-	 * @return the object to get labels for.
-	 */
-	private Object getObject(Object objects, boolean multiple[]) {
-		Assert.isNotNull(objects);
-		Object object = null;
-		if (objects instanceof IStructuredSelection) {
-			IStructuredSelection selection = (IStructuredSelection) objects;
-			object = selection.getFirstElement();
-			if (selection.size() == 1) {
-				// one element selected
-				multiple[0] = false;
-				return object;
-			}
-			// multiple elements selected
-			multiple[0] = true;
-//			Class firstClass = typeMapper.mapType(object, object.getClass());
-			Class firstClass = typeMapper.mapType(object);
-			// determine if all the objects in the selection are the same type
-			if (selection.size() > 1) {
-				for (Iterator i = selection.iterator(); i.hasNext();) {
-					Object next = i.next();
-//					Class nextClass = typeMapper.mapType(next, next
-//							.getClass());
-					Class nextClass = typeMapper.mapType(next);
-					if (!nextClass.equals(firstClass)) {
-						// two elements not equal == multiple selected unequal
-						multiple[0] = false;
-						object = null;
-						break;
-					}
-				}
-			}
-		} else {
-			multiple[0] = false;
-			object = objects;
-		}
-		return object;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ElementTypeMapper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ElementTypeMapper.java
deleted file mode 100644
index a8ec057..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ElementTypeMapper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-
-
-/**
- * Type mapper for the logic example. We want to get the GEF model object from
- * the selected element in the outline view and the diagram. We can then filter
- * on the model object type.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ElementTypeMapper implements ITypeMapper {
-
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.ITypeMapper#mapType(java.lang.Object)
-	 */
-	public Class mapType(Object object) {
-//		Class type = effectiveType;
-		Class type = null;
-		if (object != null) {
-			type = object.getClass();
-			if (object instanceof BreakdownElement) {
-				type = ((BreakdownElement) object).getClass();
-			}
-		}
-	
-		return type;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/FormUI.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/FormUI.java
deleted file mode 100644
index 31ed2c0..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/FormUI.java
+++ /dev/null
@@ -1,279 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.forms.BaseFormPage;
-import org.eclipse.epf.authoring.ui.forms.MethodFormToolkit;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.util.RichTextImageLinkContainer;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-
-/**
- * The UI util class tailored for properties view for process authoring
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class FormUI {
-
-	private static final int DEFAULT_WIDTH = 300;
-
-	private static Label _createLabel(FormToolkit toolkit, Composite parent,
-			String str, int gridDataStyle, int horizontalSpan) {
-		Label label = toolkit.createLabel(parent, str);
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.horizontalSpan = horizontalSpan;
-		label.setLayoutData(gridData);
-		return label;
-	}
-
-	public static Label createLabel(FormToolkit toolkit, Composite parent,
-			String str) {
-		// make horizonatalSpan 1
-		return _createLabel(toolkit, parent, str, GridData.BEGINNING, 1);
-	}
-
-	public static Label createLabel(FormToolkit toolkit, Composite parent,
-			String str, int horizontalSpan) {
-		// make horizonatalSpan 2
-		return _createLabel(toolkit, parent, str, GridData.BEGINNING,
-				horizontalSpan);
-	}
-
-	private static Text _createText(FormToolkit toolkit, Composite parent,
-			int textStyle, int gridDataStyle, int height, int width,
-			int horizontalSpan) {
-		Text control = toolkit.createText(parent, "", textStyle); //$NON-NLS-1$
-		GridData gridData = new GridData(gridDataStyle);
-		gridData.heightHint = height;
-		gridData.widthHint = width;
-		gridData.horizontalSpan = horizontalSpan;
-		control.setLayoutData(gridData);
-		return control;
-	}
-
-	public static Text createText(FormToolkit toolkit, Composite parent) {
-		return _createText(toolkit, parent, SWT.SINGLE | SWT.WRAP,
-				GridData.FILL_HORIZONTAL, SWT.DEFAULT, DEFAULT_WIDTH,
-				SWT.DEFAULT);
-	}
-
-	public static Text createText(FormToolkit toolkit, Composite parent,
-			int height) {
-		return _createText(toolkit, parent, SWT.MULTI | SWT.WRAP,
-				GridData.FILL_HORIZONTAL, height, DEFAULT_WIDTH, SWT.DEFAULT);
-	}
-
-	public static Text createText(FormToolkit toolkit, Composite parent,
-			int height, int horizontalSpan) {
-		return _createText(toolkit, parent, SWT.SINGLE | SWT.WRAP,
-				GridData.FILL_HORIZONTAL, height, DEFAULT_WIDTH, horizontalSpan);
-	}
-
-	private static IMethodRichText _createRichText(FormToolkit toolkit,
-			Composite parent, int height, int width, String path,
-			MethodElement methodElement, Label label) {
-		IMethodRichText control = MethodFormToolkit.createRichText(toolkit,
-				parent,
-				"", SWT.MULTI | SWT.WRAP | SWT.V_SCROLL, path, methodElement, label); //$NON-NLS-1$
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.FILL_VERTICAL);
-		gridData.heightHint = height;
-		gridData.widthHint = width;
-		control.setLayoutData(gridData);
-		return control;
-	}
-
-	public static RichTextImageLinkContainer createRichTextWithLink(FormToolkit toolkit,
-			Composite parent, int height, String path,
-			MethodElement methodElement, String labelText) {
-		ImageHyperlink link = createImageHyperLink(toolkit, parent, AuthoringUIImages.IMG_COLLAPSED,
-				AuthoringUIResources.openRTE);
-		link.setData("Title", labelText); //$NON-NLS-1$
-		Label decoratedLabel = BaseFormPage.createDecoratedLabel(toolkit, parent, labelText);
-		((GridData)decoratedLabel.getLayoutData()).verticalAlignment = SWT.CENTER;
-
-		IMethodRichText control = _createRichText(toolkit, parent, height, DEFAULT_WIDTH, path,
-				methodElement, decoratedLabel);
-		link.setHref(control);
-
-		return new RichTextImageLinkContainer(control, link, decoratedLabel);
-	}
-
-	public static ImageHyperlink createImageHyperLink(FormToolkit toolkit,
-			Composite parent, Image image, String toolTip) {
-		ImageHyperlink link = toolkit.createImageHyperlink(parent, SWT.LEFT
-				| SWT.TOP);
-		GridData gridData = new GridData(GridData.BEGINNING);
-		link.setLayoutData(gridData);
-		link.setImage(image);
-		link.setToolTipText(toolTip);
-		return link;
-	}
-
-	public static Section createSection(FormToolkit toolkit, Composite parent,
-			String title, String description) {
-		Section section = toolkit.createSection(parent, Section.DESCRIPTION
-				| Section.TWISTIE | Section.EXPANDED);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		section.setLayoutData(gd);
-		section.setText(title);
-		section.setDescription(description);
-		toolkit.createCompositeSeparator(section);
-		section.setLayout(new GridLayout());
-		return section;
-	}
-	
-	public static Section createSection(FormToolkit toolkit, Composite parent,
-			String title, String description, int gdStyle) {
-		Section section = toolkit.createSection(parent, Section.DESCRIPTION
-				| Section.TWISTIE | Section.EXPANDED);
-		GridData gd = new GridData(gdStyle);
-		section.setLayoutData(gd);
-		section.setText(title);
-		section.setDescription(description);
-		toolkit.createCompositeSeparator(section);
-		section.setLayout(new GridLayout());
-		return section;
-	}
-
-	public static Composite createComposite(FormToolkit toolkit,
-			Section section, int numOfColumns, boolean expanded) {
-		Composite composite = toolkit.createComposite(section);
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-		composite.setLayout(new GridLayout(numOfColumns, false));
-		if (!expanded)
-			section.setClient(composite);
-		else
-			composite.setVisible(false);
-		return composite;
-	}
-	
-	public static Composite createComposite(FormToolkit toolkit,
-			Composite parent, int gridStyle) {
-		Composite pane = toolkit.createComposite(parent, SWT.NONE);
-		GridData gridData = new GridData(gridStyle);
-		pane.setLayoutData(gridData);
-		pane.setLayout(new GridLayout());
-		return pane;
-	}
-
-	public static Composite createComposite(FormToolkit toolkit,
-			Composite parent, int gridStyle, int numOfColumns,
-			boolean equalSizeColumn) {
-		Composite pane = toolkit.createComposite(parent, SWT.NONE);
-		GridData gridData = new GridData(gridStyle);
-		gridData.horizontalSpan = numOfColumns;
-		pane.setLayoutData(gridData);
-		GridLayout layout = new GridLayout(numOfColumns, equalSizeColumn);
-		layout.marginBottom = 0;
-		layout.marginHeight = 0;
-		layout.marginLeft = 0;
-		layout.marginRight = 0;
-		layout.marginWidth = 0;
-		pane.setLayout(layout);
-		return pane;
-	}
-
-	private static Button _createButton(FormToolkit toolkit, Composite parent,
-			String buttonStr, int style, int horizontalSpan) {
-		Button control = toolkit.createButton(parent, buttonStr, style);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = horizontalSpan;
-		control.setLayoutData(gridData);
-		return control;
-	}
-
-	private static Button _createButton(FormToolkit toolkit, Composite parent,
-			String buttonStr, int style) {
-		Button control = toolkit.createButton(parent, buttonStr, style);
-		control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		return control;
-	}
-	
-	
-
-	private static Combo _createCombo(FormToolkit toolkit, Composite parent,
-			int style, int horizontalSpan) {
-		Combo combo = new Combo(parent, style);
-		GridData gridData = new GridData(GridData.BEGINNING);
-		gridData.horizontalSpan = horizontalSpan;
-		combo.setLayoutData(gridData);
-		return combo;
-	}
-
-	public static Combo createCombo(FormToolkit toolkit, Composite parent,
-			int horizontalSpan) {
-		return _createCombo(toolkit, parent, SWT.SINGLE | SWT.FLAT
-				| SWT.READ_ONLY, horizontalSpan);
-	}
-	
-	public static Button createButton(FormToolkit toolkit, Composite parent,
-			String buttonStr) {
-		return _createButton(toolkit, parent, buttonStr, SWT.NONE);
-	}
-
-
-	public static Button createButton(FormToolkit toolkit, Composite parent,
-			int style, int horizontalSpan) {
-		return _createButton(toolkit, parent, "", style, horizontalSpan); //$NON-NLS-1$
-	}
-	
-	public static Button createCheckButton(FormToolkit toolkit, Composite parent, int horizontalSpan)
-	{
-		Button control = toolkit.createButton(parent, "", SWT.CHECK);		//$NON-NLS-1$
-		GridData gridData = new GridData(GridData.GRAB_HORIZONTAL);
-		gridData.horizontalSpan = horizontalSpan;
-		control.setLayoutData(gridData);
-		return control;
-	}
-
-	private static Table _createTable(FormToolkit toolkit, Composite parent,
-			int tableStyle, int gridStyle, int height, int width,
-			int verticalSpan, int horizontalSpan) {
-		Table table = toolkit.createTable(parent, tableStyle);
-		GridData gridData = new GridData(gridStyle);
-		gridData.heightHint = height;
-		gridData.widthHint = width;
-		gridData.verticalSpan = verticalSpan;
-		gridData.horizontalSpan = horizontalSpan;
-		table.setLayoutData(gridData);
-		return table;
-	}
-
-	public static Table createTable(FormToolkit toolkit, Composite parent) {
-		return _createTable(toolkit, parent, SWT.MULTI, GridData.FILL_BOTH,
-				200, 200, 1, 1);
-	}
-
-	public static Table createTable(FormToolkit toolkit, Composite parent,
-			int height) {
-		return _createTable(toolkit, parent, SWT.MULTI, GridData.FILL_BOTH,
-				height, 200, 1, 1);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/MilestoneDocumentSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/MilestoneDocumentSection.java
deleted file mode 100644
index 878e540..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/MilestoneDocumentSection.java
+++ /dev/null
@@ -1,169 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.epf.authoring.ui.util.RichTextImageLinkContainer;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-
-/**
- * The document tab section for Milestone
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class MilestoneDocumentSection extends BreakdownElementDocumentSection {
-
-	protected BreakdownElement element;
-
-	private IMethodRichText mainDesc;
-
-	private Listener listener = new Listener() {
-		public void handleEvent(Event e) {
-			element = (BreakdownElement) getElement();
-			IMethodRichText control = expandFlag ? ctrl_document_expanded
-					: mainDesc;
-			if (!control.getModified()) {
-				return;
-			}
-			String oldContent = ((ContentDescription) element.getPresentation())
-					.getMainDescription();
-			if (((MethodElementEditor) getEditor()).mustRestoreValue(mainDesc,
-					oldContent)) {
-				return;
-			}
-			String newContent = control.getText();
-			if (!newContent.equals(oldContent)) {
-				actionMgr.doAction(IActionManager.SET, element
-						.getPresentation(), UmaPackage.eINSTANCE
-						.getContentDescription_MainDescription(), newContent,
-						-1);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#init()
-	 */
-	protected void init() {
-		super.init();
-		element = (BreakdownElement) getElement();
-
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#createDocumentSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createDocumentSection(Composite composite) {
-		super.createDocumentSection(composite);
-		int heightHint = 200;
-
-		// main description
-		RichTextImageLinkContainer mainDescContainer = FormUI.createRichTextWithLink(toolkit,
-				documentComposite, heightHint, contentElementPath, element,
-				PropertiesResources.Process_mainDescription);
-		addHyperLinkListener(mainDescContainer.link);
-		mainDesc = mainDescContainer.richText;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-		mainDesc.setModalObject(getElement());
-		mainDesc.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getContentDescription_MainDescription());
-		mainDesc.addListener(SWT.Deactivate, listener);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-		mainDesc.setEditable(editable);
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementDocumentSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			super.refresh();
-
-			if (getElement() instanceof BreakdownElement) {
-				((MethodElementEditor) getEditor()).saveModifiedRichText();
-
-				element = (BreakdownElement) getElement();
-				ContentDescription content = (ContentDescription) element
-						.getPresentation();
-
-				if (contentModifyListener != null) {
-					mainDesc.removeModifyListener(contentModifyListener);		
-				}
-			
-				super.refresh();
-
-				if (contentModifyListener != null) {
-					if (contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-						((MethodElementEditor.ModifyListener) contentModifyListener)
-								.setElement(element.getPresentation());
-						((MethodElementEditor.ModifyListener) contentModifyListener)
-								.setDisable(true);
-					}
-				}
-				
-				mainDesc.setText(content.getMainDescription());
-
-				if (expandFlag) {
-					if (expandDocumentLabel.getText().equals(
-							PropertiesResources.Process_mainDescription)) 
-					{
-						ctrl_document_expanded.setText(content
-								.getMainDescription());
-						ctrl_document_expanded.setSelection(0);
-						ctrl_document_expanded.setModalObject(content);
-						ctrl_document_expanded
-								.setModalObjectFeature(UmaPackage.eINSTANCE
-										.getContentDescription_MainDescription());
-					}
-				}
-
-				if (contentModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) contentModifyListener)
-							.setDisable(false);
-				}
-
-				mainDesc.setModalObject(content);
-				mainDesc.setModalObjectFeature(UmaPackage.eINSTANCE
-						.getContentDescription_MainDescription());
-				mainDesc.addModifyListener(contentModifyListener);
-			}
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error while refreshing milestone documentation section :", ex); //$NON-NLS-1$
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/OBSRelationSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/OBSRelationSection.java
deleted file mode 100644
index 067b481..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/OBSRelationSection.java
+++ /dev/null
@@ -1,347 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.filters.ProcessRoleFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.Table;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The base OBS relation section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class OBSRelationSection extends AbstractSection {
-	protected IStructuredContentProvider contentProvider = null;
-
-	protected ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory());
-
-	private FormToolkit toolkit;
-
-	private Button ctrl_add_1, ctrl_add_2, ctrl_remove;
-
-	private Table ctrl_selected;
-
-	protected TableViewer viewer;
-
-	private String title;
-	
-	private String desc;
-	
-	private String table1;
-
-	// element
-	protected BreakdownElement element;
-
-	// action manager
-	protected IActionManager actionMgr;
-
-	// by default this button is false
-	protected boolean showAddFromProcessButton = false;
-
-	// filter
-	private IFilter filter = null;
-
-	public IFilter getFilter() {
-		if (filter == null) {
-			filter = new ProcessRoleFilter(getConfiguration(), null,
-					FilterConstants.ROLES);
-		}
-		return filter;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-
-		super.createControls(parent, tabbedPropertySheetPage);
-		init();
-
-		parent.setLayout(new GridLayout());
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create section
-		createSection(parent);
-
-		// add listeners
-		addListeners();
-
-		// update controls
-		updateControls();
-
-	}
-
-	/**
-	 * Initialize
-	 */
-	protected void init() {
-		// get breakdownelement object
-		element = (BreakdownElement) getElement();
-
-		// get toolkit
-		toolkit = getWidgetFactory();
-
-		// get action manager
-		actionMgr = EPFPropertySheetPage.getActionManager();
-	}
-
-	protected void setTabData(String title, String desc, String table1) {
-		this.title = title;
-		this.desc = desc;
-		this.table1 = table1;
-	}
-
-	private void createSection(Composite parent) {
-		// create section
-		Section aSection = FormUI.createSection(toolkit, parent,
-				title, desc);
-
-		// create general composite
-		Composite composite = FormUI.createComposite(toolkit, aSection, 2,
-				false);
-
-		// create table composite
-		Composite pane1 = FormUI.createComposite(toolkit, composite,
-				GridData.FILL_BOTH);
-		FormUI.createLabel(toolkit, pane1, table1);
-
-		ctrl_selected = FormUI.createTable(toolkit, pane1);
-		viewer = new TableViewer(ctrl_selected);
-
-		initContentProvider();
-
-		viewer.setLabelProvider(labelProvider);
-		viewer.setInput(element);
-
-		// create button composite
-		Composite pane2 = FormUI.createComposite(toolkit, composite,
-				GridData.VERTICAL_ALIGN_CENTER
-						| GridData.HORIZONTAL_ALIGN_CENTER);
-
-		// create buttons
-		ctrl_add_1 = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Add); 
-		if (showAddFromProcessButton) {
-			ctrl_add_2 = FormUI.createButton(toolkit, pane2,
-					PropertiesResources.Process_AddFromProcess); 
-		}
-		ctrl_remove = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Remove); 
-
-		toolkit.paintBordersFor(composite);
-		toolkit.paintBordersFor(pane1);
-		toolkit.paintBordersFor(pane2);
-
-	}
-
-	/**
-	 * Get Default configuration
-	 * 
-	 * @return MethodConfiguration
-	 */
-	protected MethodConfiguration getDefaultConfiguration() {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) getAdapter();
-		Object parent = null;
-		if (adapter instanceof IBSItemProvider) {
-			IBSItemProvider bsItemProvider = (IBSItemProvider) adapter;
-			parent = bsItemProvider.getTopItem();
-			MethodConfiguration config = ((org.eclipse.epf.uma.Process) parent)
-					.getDefaultContext();
-			return config;
-		} else {
-			logger
-					.logError("OBSRelationSection::getDefaultConfiguration - IBSItemProvider is null"); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Add listeners
-	 * 
-	 */
-	private void addListeners() {
-		// Add focus listener on primary tasks list
-		ctrl_selected.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if ((selection.size() > 0) && editable)
-					ctrl_remove.setEnabled(true);
-			}
-		});
-
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if ((selection.size() > 0) && editable)
-					ctrl_remove.setEnabled(true);
-			}
-		});
-
-		ctrl_add_1.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				openAddDialog();
-				viewer.refresh();
-			}
-		});
-
-		if (showAddFromProcessButton) {
-			ctrl_add_2.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					openAddFromProcessDialog();
-					viewer.refresh();
-				}
-			});
-		}
-
-		ctrl_remove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if (selection.size() > 0) {
-					// update the model
-					ArrayList rmItems = new ArrayList();
-					rmItems.addAll(selection.toList());
-					remove(rmItems);
-					viewer.refresh();
-
-					// clear the selection
-					viewer.setSelection(null, true);
-				}
-				ctrl_remove.setEnabled(false);
-			}
-		});
-	}
-
-	public void updateControls() {
-		// System.out.println("Element "+element.getName() +
-		// "Editable-"+editable);
-		if (ctrl_add_1 != null)
-			ctrl_add_1.setEnabled(editable);
-		if (ctrl_add_2 != null)
-			ctrl_add_2.setEnabled(editable);
-
-		IStructuredSelection selection = (IStructuredSelection) viewer
-				.getSelection();
-		if (selection.size() > 0 && editable) {
-			if (ctrl_remove != null)
-			ctrl_remove.setEnabled(true);
-		} else {
-			if (ctrl_remove != null)
-			ctrl_remove.setEnabled(false);
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#refresh()
-	 */
-	public void refresh() {
-		updateControls();
-
-		super.refresh();
-	}
-
-	/**
-	 * Get parent activity
-	 * 
-	 * @param element
-	 * @return
-	 */
-	// protected Activity getParentActivity(BreakdownElement element)
-	// {
-	// Activity activity = null;
-	// AdapterFactory aFactory =
-	// TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory();
-	// ItemProviderAdapter adapter = (ItemProviderAdapter)
-	// aFactory.adapt(element, ITreeItemContentProvider.class);
-	// Object parent = adapter.getParent(element);
-	// if (parent instanceof Activity)
-	// {
-	// activity = (Activity) parent;
-	// }
-	//		
-	// return activity;
-	// }
-	
-	/**
-	 * Initialize content provider
-	 */
-	protected void initContentProvider() {
-	}
-
-	/**
-	 * Open UI Dialog to add method elements
-	 *
-	 */
-	protected void openAddDialog() {
-	}
-
-	/**
-	 * Open UI Dialog to add descriptor elements
-	 *
-	 */
-	protected void openAddFromProcessDialog() {
-	}
-
-	// protected void add(Object[] items) {}
-	protected void remove(ArrayList rmItems) {
-	}
-
-	/**
-	 * Dispose
-	 *
-	 */
-	public void disose() {
-		super.dispose();
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-		if (contentProvider != null) {
-			contentProvider.dispose();
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PredecessorDialog.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PredecessorDialog.java
deleted file mode 100644
index 80973b9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PredecessorDialog.java
+++ /dev/null
@@ -1,436 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-
-/**
- * Dialog for adding predecessor dependency
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class PredecessorDialog extends Dialog {
-
-	private Text predIdText;
-
-	private Text presentationName;
-
-	private Combo dependency;
-
-	/** Dependency Literals * */
-	private static final String FINISH_TO_START = PropertiesResources.WorkOrderType_FINISH_TO_START; 
-
-	private static final String FINISH_TO_FINISH = PropertiesResources.WorkOrderType_FINISH_TO_FINISH; 
-
-	private static final String START_TO_START = PropertiesResources.WorkOrderType_START_TO_START; 
-
-	private static final String START_TO_FINISH = PropertiesResources.WorkOrderType_START_TO_FINISH; 
-
-	private String[] dependencyList = new String[] { FINISH_TO_START,
-			FINISH_TO_FINISH, START_TO_START, START_TO_FINISH };
-
-	private WorkBreakdownElement element;
-
-	private Object process;
-
-	private AdapterFactory adapterFactory;
-
-	private List predecessors = new ArrayList();
-
-	private List predMapList;
-
-	private IActionManager actionMgr;
-
-	private PredecessorMap predMap;
-
-	/**
-	 * Dialog for setting predecessor for the element
-	 * @param parentShell
-	 * 			The parent shell
-	 * @param element
-	 * 			Work Break down Element
-	 * @param process
-	 * 			Process of the workbreakdown element
-	 * @param adapterFactory
-	 * 			Adapter Factory 
-	 * @param predMap
-	 * 			Predecessor Map
-	 * @param predMapList
-	 * 			Predecessor Map list
-	 * @param actionMgr
-	 * 			Action Manager
-	 */
-	public PredecessorDialog(Shell parentShell, WorkBreakdownElement element,
-			Object process, AdapterFactory adapterFactory,
-			PredecessorMap predMap, List predMapList, IActionManager actionMgr) {
-		super(parentShell);
-
-		this.element = element;
-		this.process = process;
-		this.adapterFactory = adapterFactory;
-		this.predMap = predMap;
-		this.predMapList = predMapList;
-		this.actionMgr = actionMgr;
-
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.numColumns = 2;
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gridData);
-
-		// dialog header
-		Label label = new Label(composite, SWT.NONE);
-		label.setText(PropertiesResources.PredecessorDialog_HeaderMessage); 
-		gridData = new GridData(GridData.BEGINNING);
-		gridData.horizontalSpan = 2;
-		label.setLayoutData(gridData);
-
-		// blank label
-		label = new Label(composite, SWT.NONE);
-		label.setText(""); //$NON-NLS-1$
-		gridData = new GridData(GridData.BEGINNING);
-		gridData.horizontalSpan = 2;
-		label.setLayoutData(gridData);
-
-		// Predecessor ID index
-		label = new Label(composite, SWT.NONE);
-		label.setText(PropertiesResources.PredecessorDialog_Index); 
-		gridData = new GridData(GridData.BEGINNING);
-		label.setLayoutData(gridData);
-
-		predIdText = new Text(composite, SWT.BORDER);
-		gridData = new GridData(GridData.GRAB_HORIZONTAL);
-		gridData.widthHint = 100;
-		predIdText.setLayoutData(gridData);
-		predIdText.setText(new Integer(predMap.getId()).toString());
-		// predIdText.setEditable(false);
-
-		// Presentaion Name
-		label = new Label(composite, SWT.NONE);
-		label.setText(PropertiesResources.PredecessorDialog_PresentationName); 
-		gridData = new GridData(GridData.BEGINNING);
-		label.setLayoutData(gridData);
-
-		presentationName = new Text(composite, SWT.BORDER);
-		gridData = new GridData(GridData.GRAB_HORIZONTAL);
-		gridData.widthHint = 400;
-		presentationName.setEditable(false);
-		presentationName.setLayoutData(gridData);
-
-		WorkOrder wo = predMap.getWorkOrder();
-		presentationName.setText(ProcessUtil.getPresentationName(wo.getPred()));
-
-		// Dependency
-		label = new Label(composite, SWT.NONE);
-		label.setText(PropertiesResources.PredecessorDialog_Dependency); 
-		gridData = new GridData(GridData.BEGINNING);
-		label.setLayoutData(gridData);
-
-		dependency = new Combo(composite, SWT.SINGLE | SWT.READ_ONLY);
-		gridData = new GridData(GridData.BEGINNING);
-		dependency.setLayoutData(gridData);
-		dependency.setItems(dependencyList);
-
-		String depedencyName = wo.getLinkType().getName();
-		if (wo.getLinkType().getValue() == WorkOrderType.FINISH_TO_FINISH) {
-			depedencyName = FINISH_TO_FINISH;
-		} else if (wo.getLinkType().getValue() == WorkOrderType.FINISH_TO_START) {
-			depedencyName = FINISH_TO_START;
-		} else if (wo.getLinkType().getValue() == WorkOrderType.START_TO_FINISH) {
-			depedencyName = START_TO_FINISH;
-		} else if (wo.getLinkType().getValue() == WorkOrderType.START_TO_START) {
-			depedencyName = START_TO_START;
-		}
-		dependency.setText(depedencyName);
-
-		Label line = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		line.setLayoutData(gridData);
-
-		predIdText.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent event) {
-				int newId;
-				try {
-					newId = new Integer(predIdText.getText()).intValue();
-					if (newId < 0)
-						throw new Exception();
-				} catch (Exception e) {
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayWarning(
-									PropertiesResources.Process_predecessors_validNumberTitle, 
-									PropertiesResources.Process_predecessors_validNumberMessage); 
-
-					predIdText.setText(new Integer(predMap.getId()).toString());
-					predIdText.setFocus();
-					predIdText.selectAll();
-					return;
-				}
-
-				if (alreadyExists(newId)) {
-					predIdText.setText(new Integer(predMap.getId()).toString());
-
-					predIdText.selectAll();
-					return;
-				}
-
-				String predIDList = getPredId(newId);
-				if (predIDList == null)
-					return;
-
-				String str = ProcessUtil.checkPredecessorList(element,
-						predIDList, adapterFactory, process, predecessors);
-				if (str != null) {
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayError(
-									PropertiesResources.PredecessorDialog_PredecessorErrorDialogTitle, str); 
-					predIdText.setText(new Integer(predMap.getId()).toString());
-					return;
-				}
-				presentationName.setText(getName(newId));
-			}
-		});
-
-		return composite;
-	}
-
-	/**
-	 * Get presentation name/name for this predecessor id
-	 * 
-	 * @param newId
-	 * @return
-	 */
-	private String getName(int newId) {
-		String name = null;
-		for (Iterator iter = new AdapterFactoryTreeIterator(adapterFactory,
-				process); iter.hasNext();) {
-			Object obj = iter.next();
-			IBSItemProvider itemProvider = (IBSItemProvider) adapterFactory
-					.adapt(obj, ITreeItemContentProvider.class);
-			Integer id = new Integer(itemProvider.getId());
-			obj = TngUtil.unwrap(obj);
-
-			if (newId == id.intValue()) {
-				name = ((BreakdownElement) obj).getPresentationName();
-				if (StrUtil.isBlank(name)) {
-					name = ((BreakdownElement) obj).getName();
-				}
-			}
-		}
-		return name;
-	}
-
-	/**
-	 * Check to see whether predecessor Id already exists
-	 * 
-	 * @param newId
-	 * @return
-	 */
-	private boolean alreadyExists(int newId) {
-		for (Iterator itor = predMapList.iterator(); itor.hasNext();) {
-			PredecessorMap map = (PredecessorMap) itor.next();
-			if ((map.getId() == newId) && (predMap.getId() != newId)) {
-				AuthoringUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayError(
-								PropertiesResources.PredecessorDialog_PredecessorErrorDialogTitle, 
-								PropertiesResources.PredecessorDialog_PredecessorErrorMessage); 
-
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Get command separated list of all predecessor
-	 * 
-	 * @param newId
-	 * @return
-	 */
-	private String getPredId(int newId) {
-		StringBuffer buf = new StringBuffer();
-
-		for (Iterator itor = predMapList.iterator(); itor.hasNext();) {
-			PredecessorMap map = (PredecessorMap) itor.next();
-			if (predMap.getId() == map.getId()) {
-				buf.append(newId);
-			} else {
-				buf.append(map.getId());
-			}
-
-			buf.append(","); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell parent) {
-		super.configureShell(parent);
-		parent
-				.setText(PropertiesResources.PredecessorDialog_Title); 
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		// new id
-		int newId = new Integer(predIdText.getText()).intValue();
-		// ne link type
-		WorkOrderType workOrderType = getWorkOrderType();
-
-		if ((newId != predMap.getId())
-				|| (!workOrderType.equals(predMap.getWorkOrder().getLinkType()))) {
-			String predIDList = getPredId(newId);
-			if (predIDList == null)
-				return;
-
-			String str = ProcessUtil.checkPredecessorList(element, predIDList,
-					adapterFactory, process, predecessors);
-			if (str != null) {
-				AuthoringUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayError(
-								PropertiesResources.PredecessorDialog_PredecessorErrorDialogTitle, str); 
-				predIdText.setText(new Integer(predMap.getId()).toString());
-			}
-
-			// remove it
-			boolean status = actionMgr.doAction(IActionManager.REMOVE, element,
-					UmaPackage.eINSTANCE
-							.getWorkBreakdownElement_LinkToPredecessor(),
-					predMap.getWorkOrder(), -1);
-			if (!status) {
-				close();
-				return;
-			}
-			predMapList.remove(predMap);
-
-			int size = predecessors.size();
-
-			for (int i = 0; i < size; i++) {
-				WorkBreakdownElement e = (WorkBreakdownElement) predecessors
-						.get(i);
-
-				boolean found = false;
-				find_pred: for (Iterator iterator = element
-						.getLinkToPredecessor().iterator(); iterator.hasNext();) {
-					WorkOrder wo = (WorkOrder) iterator.next();
-					if (wo.getPred() == e) {
-						found = true;
-						break find_pred;
-					}
-				}
-				if (!found) {
-					WorkOrder wo = UmaFactory.eINSTANCE.createWorkOrder();
-					wo.setPred(e);
-					wo.setLinkType(workOrderType);
-					boolean stat = actionMgr
-							.doAction(
-									IActionManager.ADD,
-									element,
-									UmaPackage.eINSTANCE
-											.getWorkBreakdownElement_LinkToPredecessor(),
-									wo, -1);
-					if (!stat)
-						return;
-
-					predMap.setId(newId);
-					predMap.setWorkOrder(wo);
-					predMapList.add(predMap);
-				}
-			}
-		}
-
-		super.okPressed();
-	}
-
-	/**
-	 * Get work order link type from UI
-	 * 
-	 * @return 
-	 * 			Work Order type
-	 */
-	private WorkOrderType getWorkOrderType() {
-		int index = dependency.getSelectionIndex();
-		WorkOrderType type;
-		if (index == 0) {
-			type = WorkOrderType.FINISH_TO_START_LITERAL;
-		} else if (index == 1) {
-			type = WorkOrderType.FINISH_TO_FINISH_LITERAL;
-		} else if (index == 2) {
-			type = WorkOrderType.START_TO_START_LITERAL;
-		} else {
-			type = WorkOrderType.START_TO_FINISH_LITERAL;
-		}
-
-		return type;
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#close()
-	 */
-	public boolean close() {
-
-		return super.close();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PredecessorMap.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PredecessorMap.java
deleted file mode 100644
index 85d502f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PredecessorMap.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.uma.WorkOrder;
-
-/**
- * Map of predecessor ID and corresponding work order
- * @author Shilpa Toraskar
- * @since 1.0
- *
- */
-public class PredecessorMap {
-	private int id;
-
-	private WorkOrder wo;
-
-	/**
-	 * 
-	 * @param id
-	 * 		Predecessor ID
-	 * @param wo
-	 * 		WorkOrder object
-	 */
-	public PredecessorMap(int id, WorkOrder wo) {
-		this.id = id;
-		this.wo = wo;
-	}
-
-	/**
-	 * Get predecessor ID
-	 * @return
-	 * 			Predecessor ID
-	 */
-	public int getId() {
-		return this.id;
-	}
-
-	/**
-	 * Set Predecessor ID
-	 * @param id
-	 * 			Predecessor ID
-	 */
-	public void setId(int id) {
-		this.id = id;
-	}
-	
-	/**
-	 * Get work order
-	 * @return
-	 * 		Work Order
-	 */
-	public WorkOrder getWorkOrder() {
-		return this.wo;
-	}
-
-	/**
-	 * Set Work Order
-	 * @param wo
-	 * 			Work Order
-	 */
-	public void setWorkOrder(WorkOrder wo) {
-		this.wo = wo;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesResources.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesResources.java
deleted file mode 100644
index 1b82ddf..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesResources.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.osgi.util.NLS;
-/**
- * Properties resources
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public final class PropertiesResources extends NLS {
-
-	private static final String BUNDLE_NAME = PropertiesResources.class.getPackage().getName()
-								+ ".Resources"; //$NON-NLS-1$
-	
-	private PropertiesResources() {
-		// Do not instantiate
-	}
-
-	public static String Process_generalInformationTitle;
-	public static String Process_DocumentInformationTitle;
-	public static String Activity_guidanceInformationTitle;
-	public static String BreakdownElement_optionInformationTitle;
-	public static String TaskDescriptor_stepInformationTitle;
-	public static String Process_generalInformationDescription;
-	public static String Process_documentInformationDescription;
-	public static String Descriptor_generalInformationDescription;
-	public static String Descriptor_detailInformationDescription;
-	public static String Milestone_generalInformationDescription;
-	public static String Milestone_detailInformationDescription;
-	public static String TaskDescriptor_stepInformationDescription;
-	public static String BreakdownElement_generalInformationDescription;
-	public static String WorkBreakdownElement_generalInformationDescription;
-	public static String Descriptor_generalInformationDescripton;
-	public static String Activity_generalInformationDescription;
-	public static String BreakdownElement_DocumentInformationDescription;
-	public static String Activity_DocumentInformationDescription;
-	public static String Descriptor_documentInformationDescription;
-	public static String Process_None;
-	public static String Process_name;
-	public static String Process_PresentationName;
-	public static String Process_briefDescription;
-	public static String Process_mainDescription;
-	public static String Process_purpose;
-	public static String Process_prefix;
-	public static String BreakdownElement_Type_Name;
-	public static String Process_Type_Task;
-	public static String Process_Type_Role;
-	public static String Process_Type_WorkProduct;
-	public static String WorkProduct_Type;
-	public static String Activity_ModelInfo;
-	public static String Activity_Type;
-	public static String Activity_presentationName;
-	public static String Activity_alternatives;
-	public static String Activity_howToStaff;
-	public static String BreakdownElement_keyConsiderations;
-	public static String Process_usageGuidance;
-	public static String Activity_RoadmapTitle;
-	public static String Activity_RoadmapDescription;
-	public static String Activity_GeneralGuidanceTitle;
-	public static String Activity_GeneralGuidanceDescription;
-	public static String Activity_CommunicationMaterialTitle;
-	public static String Activity_CommunicationMaterialDescription;
-	public static String Activity_EducationMaterialTitle;
-	public static String Activity_EducationMaterialDescription;
-	public static String Activity_Selected_Roadmap;
-	public static String Activity_Selected_GeneralGuidance;
-	public static String Activity_Selected_CommunicationMaterial;
-	public static String Activity_Selected_EducationMaterial;
-	public static String Activity_DiagramTitle;
-	public static String Activity_DiagramDescription;
-	public static String Activity_ADImage;
-	public static String Activity_ADDImage;
-	public static String Activity_WPDImage;
-	public static String Activity_UseADImage;
-	public static String Activity_UseADDImage;
-	public static String Activity_UseWPDImage;
-	public static String Activity_Assign;
-	
-	public static String Activity_WorkRollup;
-	public static String Activity_TeamRollup;
-	public static String Activity_WorkProductsRollup;
-	public static String Activity_WorkRollupDescription;
-	public static String Activity_TeamRollupDescription;
-	public static String Activity_WorkProductsRollupDescription;
-	public static String BreakdownElement_Option_MultipleOcurrance;
-	public static String BreakdownElement_Option_Optional;
-	public static String BreakdownElement_Option_Planned;
-	public static String BreakdownElement_Option_Supressed;
-	public static String WorkBreakdownElement_EventDriven;
-	public static String WorkBreakdownElement_Ongoing;
-	public static String WorkBreakdownElement_Repeatable;
-	public static String WorkBreakdownElement_Predecessors;
-	public static String WorkBreakdownElement_Dependency;
-	public static String WorkBreakdownElement_Dependency_COL_ID_TEXT;
-	public static String WorkBreakdownElement_Dependency_COL_PRESENTATION_NAME_TEXT;
-	public static String WorkBreakdownElement_Dependency_COL_DEPENDENCY_TEXT;
-	public static String WorkBreakdownElement_Dependency_Add;
-	public static String WorkBreakdownElement_Dependency_Edit;
-	public static String WorkBreakdownElement_Dependency_Remove;
-	public static String WorkOrderType_FINISH_TO_START;
-	public static String WorkOrderType_FINISH_TO_FINISH;
-	public static String WorkOrderType_START_TO_FINISH;
-	public static String WorkOrderType_START_TO_START;
-	public static String BreakdownElement_Option_Synchronized;
-	public static String Descriptor_RefinedDescription;
-	public static String TaskDescriptor_Roles_SectionTitle;
-	public static String TaskDescriptor_Roles_SectionDescription;
-	public static String TaskDescriptor_Roles_Table1;
-	public static String TaskDescriptor_Roles_Table2;
-	public static String TaskDescriptor_Roles_Table3;
-	public static String TaskDescriptor_Selected_Steps;
-	public static String TaskDescriptor_StepDialogTitle;
-	public static String TaskDescriptor_StepDialogMessage;
-	public static String TaskDescriptor_WorkProducts_SectionTitle;
-	public static String TaskDescriptor_WorkProducts_SectionDescription;
-	public static String TaskDescriptor_WorkProducts_Table1;
-	public static String TaskDescriptor_WorkProducts_Table2;
-	public static String TaskDescriptor_WorkProducts_Table3;
-	public static String TaskDescriptor_WorkProducts_Table4;
-	public static String RoleDescriptor_Tasks_SectionTitle;
-	public static String RoleDescriptor_Tasks_SectionDescription;
-	public static String RoleDescriptor_Tasks_Table1;
-	public static String RoleDescriptor_Tasks_Table2;
-	public static String RoleDescriptor_Tasks_Table3;
-	public static String RoleDescriptor_WorkProducts_SectionTitle;
-	public static String RoleDescriptor_WorkProducts_SectionDescription;
-	public static String RoleDescriptor_WorkProducts_Table1;
-	public static String RoleDescriptor_WorkProducts_Table2;
-	public static String WorkProductDescriptor_Roles_SectionTitle;
-	public static String WorkProductDescriptor_Roles_SectionDescription;
-	public static String WorkProductDescriptor_Roles_Table1;
-	public static String WorkProductDescriptor_Roles_Table2;
-	public static String WorkProductDescriptor_Type;
-	public static String WorkProductDescriptor_ActivityEntryState;
-	public static String WorkProductDescriptor_ActivityExitState;
-	public static String WPDescriptor_DeliverablePart_SectionTitle;
-	public static String WPDescriptor_DeliverablePart_SectionDescription;
-	public static String WPDescriptor_DeliverablePart_Table1;
-	public static String RoleDescriptor_Team_SectionTitle;
-	public static String RoleDescriptor_Team_SectionDescription;
-	public static String RoleDescriptor_Team_Table1;
-	public static String CompositeRole_Role_SectionTitle;
-	public static String CompositeRole_Role_SectionDescription;
-	public static String CompositeRole_Role_Table1;
-	public static String TeamProfile_Role_SectionTitle;
-	public static String TeamProfile_Role_SectionDescription;
-	public static String TeamProfile_Role_Table1;
-	public static String Process_RichText_CollapseImage;
-	public static String Process_RichText_ExpandImage;
-	public static String Process_Add;
-	public static String Process_AddFromProcess;
-	public static String Process_Rename_Message;
-	public static String Process_Remove;
-	public static String Process_Up;
-	public static String Process_Down;
-	public static String Process_MultipleSelection;
-	public static String Process_Button_LinkMethodElement;
-	public static String Process_Button_ClearMethodElement;
-	public static String Process_InvalidNameTitle;
-	public static String Process_InvalidName;
-	public static String Process_Rename_Title;
-	public static String Process_InvalidPresentationName;
-	public static String Process_LinkMethodElementTitle;
-	public static String Process_InvalidLinkMethodElement;
-	public static String Process_AssignmentInfoTitle;
-	public static String Process_TeamAssignError;
-	public static String Process_TeamDialogMessage;
-	public static String Process_TeamDialogTitle;
-	public static String Process_DeliverableAssignError;
-	public static String Process_CompositeRoleAssignError;
-	public static String Process_predecessors_validNumberMessage;
-	public static String Process_predecessors_validNumberTitle;
-	public static String Process_NoItems;
-	public static String Process_ItemsSelected;
-	public static String Process_NoPropertiesAvailable;
-	public static String PredecessorDialog_Title;
-	public static String PredecessorDialog_HeaderMessage;
-	public static String PredecessorDialog_Index;
-	public static String PredecessorDialog_PresentationName;
-	public static String PredecessorDialog_Dependency;
-	public static String PredecessorDialog_PredecessorErrorDialogTitle;
-	public static String PredecessorDialog_PredecessorErrorMessage;
-	public static String ProcessEditorFormProperties_textEditCell_problem_msg;
-	public static String ProcessEditorFormProperties_cellEditor_invalidPredcessor_problem_msg;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PropertiesResources.class);
-	}
-	
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given object.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String bind(String key, Object data) {
-		return NLS.bind(key, new Object[] { data });
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesUtil.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesUtil.java
deleted file mode 100644
index 503ef0e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesUtil.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Utility class for properties 
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class PropertiesUtil {
-
-	/**
-	 * Returns type of the object
-	 * 
-	 * @param obj
-	 * @return
-	 * 		Type
-	 */
-	public static String getType(Object obj) {
-		String prefix = PropertiesResources.BreakdownElement_Type_Name; 
-
-		if (obj instanceof CapabilityPattern) {
-			prefix = LibraryUIText.TEXT_CAPABILITY_PATTERN;
-		} else if (obj instanceof DeliveryProcess) {
-			prefix = LibraryUIText.TEXT_DELIVERY_PROCESS;
-		} else if (obj instanceof Process) {
-			prefix = LibraryUIText.TEXT_PROCESS;
-		} else if (obj instanceof Phase) {
-			prefix = LibraryUIText.TEXT_PHASE;
-		} else if (obj instanceof Iteration) {
-			prefix = LibraryUIText.TEXT_ITERATION;
-		} else if (obj instanceof Activity) {
-			prefix = LibraryUIText.TEXT_ACTIVITY;
-		} else if (obj instanceof TaskDescriptor) {
-			prefix = LibraryUIText.TEXT_TASK_DESCRIPTOR;
-		} else if (obj instanceof RoleDescriptor) {
-			prefix = LibraryUIText.TEXT_ROLE_DESCRIPTOR;
-		} else if (obj instanceof WorkProductDescriptor) {
-			prefix = LibraryUIText.TEXT_WORK_PRODUCT_DESCRIPTOR;
-		} else if (obj instanceof Milestone) {
-			prefix = LibraryUIText.TEXT_MILESTONE;
-		} else if (obj instanceof TeamProfile) {
-			prefix = LibraryUIText.TEXT_TEAM_PROFILE;
-		}
-
-		return prefix;
-	}
-	
-	/**
-	 * Return type of the object in lower case
-	 * @param obj
-	 * @return
-	 * 		Type
-	 */
-	public static String getTypeLower(Object obj) {
-		String type = getType(obj);
-		
-		return StrUtil.toLower(type);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesViewConstants.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesViewConstants.java
deleted file mode 100644
index c867505..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesViewConstants.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-/**
- * Constants for properties view
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- * 
- */
-public class PropertiesViewConstants {
-
-	public static final String ROLE_DESCRIPTOR = "RoleDescriptor"; //$NON-NLS-1$
-
-	public static final String WORKPRODUCTS = "WorkProducts"; //$NON-NLS-1$
-
-	public static final String TASK_DESCRIPTOR = "TaskDescriptor"; //$NON-NLS-1$
-
-	public static final String ROLES = "Roles"; //$NON-NLS-1$
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RelationSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RelationSection.java
deleted file mode 100644
index d749eae..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RelationSection.java
+++ /dev/null
@@ -1,899 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The base class used to display relationships between descriptors
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class RelationSection extends AbstractSection {
-	protected ILabelProvider labelProvider = null;
-
-	protected IStructuredContentProvider contentProvider = null;
-
-	// element
-	protected Descriptor element;
-
-	// action manager
-	protected IActionManager actionMgr;
-
-	private FormToolkit toolkit;
-
-	private Button ctrl_add_1, ctrl_add_2, ctrl_add_3, ctrl_add_4;
-
-	private Button ctrl_remove_1, ctrl_remove_2, ctrl_remove_3, ctrl_remove_4;
-
-	private Button ctrl_add_proc_1, ctrl_add_proc_2, ctrl_add_proc_3,
-			ctrl_add_proc_4;;
-
-	private Table ctrl_table_1, ctrl_table_2, ctrl_table_3, ctrl_table_4;
-
-	protected TableViewer tableViewer1, tableViewer2, tableViewer3,
-			tableViewer4;
-
-	private Text ctrl_brief_desc;
-
-	private String tabString;
-	
-	private String title, desc, table1, table2, table3, table4;
-
-	private int tableCount;
-
-	private boolean[] changesAllowed;
-
-	Process process;
-
-	IFilter descriptorProcessfilter;
-
-	protected Process getProcess() {
-		return process;
-	}
-
-	protected IFilter getFilterForDescriptors() {
-		return descriptorProcessfilter;
-	}
-
-	protected String getDescriptorTabName() {
-		return null;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-
-		super.createControls(parent, tabbedPropertySheetPage);
-		init();
-
-		parent.setLayout(new GridLayout());
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create section
-		createSection(parent);
-
-		// add listeners
-		addListeners();
-
-		// update controls
-		updateControls();
-
-	}
-
-	protected void setTabData(String title, String desc, String table1, String table2, String table3, String table4, String tabString) {
-		this.title = title;
-		this.desc = desc;
-		this.table1 = table1;
-		this.table2 = table2;
-		this.table3 = table3;
-		this.table4 = table4;
-		
-		this.tabString = tabString;
-	}
-
-	protected void setTableData(int tableCount, boolean[] changesAllowed) {
-		this.tableCount = tableCount;
-		this.changesAllowed = changesAllowed;
-	}
-
-	protected void init() {
-		// get descriptor object
-		element = (Descriptor) getElement();
-
-		// get toolkit
-		toolkit = getWidgetFactory();
-
-		// get action manager
-		actionMgr = EPFPropertySheetPage.getActionManager();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof Descriptor) {
-				element = (Descriptor) getElement();
-
-				initContentProvider1();
-				initContentProvider2();
-				initContentProvider3();
-				initContentProvider4();
-
-				// hide/show controls based on editable
-				updateControls();
-			}
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing descriptor relation section: " + element, ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Update controls based on editable boolean value. Controls could be
-	 * editable or read-only after this.
-	 */
-	public void updateControls() {
-		// System.out.println("Element "+element.getName() +
-		// "Editable-"+editable);
-		if (ctrl_add_1 != null)
-			ctrl_add_1.setEnabled(editable);
-		if (ctrl_add_2 != null)
-			ctrl_add_2.setEnabled(editable);
-		if (ctrl_add_3 != null)
-			ctrl_add_3.setEnabled(editable);
-		if (ctrl_add_4 != null)
-			ctrl_add_4.setEnabled(editable);
-
-		if (ctrl_add_proc_1 != null)
-			ctrl_add_proc_1.setEnabled(editable);
-		if (ctrl_add_proc_2 != null)
-			ctrl_add_proc_2.setEnabled(editable);
-		if (ctrl_add_proc_3 != null)
-			ctrl_add_proc_3.setEnabled(editable);
-		if (ctrl_add_proc_4 != null)
-			ctrl_add_proc_4.setEnabled(editable);
-
-		IStructuredSelection selection = (IStructuredSelection) tableViewer1
-				.getSelection();
-		if (selection.size() > 0 && editable) {
-			ctrl_remove_1.setEnabled(true);
-		} else {
-			ctrl_remove_1.setEnabled(false);
-		}
-
-		if (tableViewer2 != null) {
-			selection = (IStructuredSelection) tableViewer2.getSelection();
-			if (selection.size() > 0 && editable) {
-					if (ctrl_remove_2 != null)
-				ctrl_remove_2.setEnabled(true);
-			} else {
-					if (ctrl_remove_2 != null)
-				ctrl_remove_2.setEnabled(false);
-			}
-		}
-
-		if (tableViewer3 != null) {
-			selection = (IStructuredSelection) tableViewer3.getSelection();
-			if (selection.size() > 0 && editable) {
-				ctrl_remove_3.setEnabled(true);
-			} else {
-				ctrl_remove_3.setEnabled(false);
-			}
-		}
-
-		if (tableViewer4 != null) {
-			selection = (IStructuredSelection) tableViewer4.getSelection();
-			if (selection.size() > 0 && editable) {
-				ctrl_remove_4.setEnabled(true);
-			} else {
-				ctrl_remove_4.setEnabled(false);
-			}
-		}
-	}
-
-	/**
-	 * Dispose all label and content providers
-	 */
-	public void dispose() {
-		super.dispose();
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-		if (contentProvider != null) {
-			contentProvider.dispose();
-		}
-	}
-
-	/**
-	 * Initialize content provider for the first table in properties view
-	 *
-	 */
-	protected void initContentProvider1() {
-	}
-
-	/**
-	 * Initialize content provider for the second table in properties view
-	 *
-	 */
-	protected void initContentProvider2() {
-	}
-
-	/**
-	 * Initialize content provider for the third table in properties view
-	 *
-	 */
-	protected void initContentProvider3() {
-	}
-
-	/**
-	 * Initialize content provider for the fourth table in properties view
-	 *
-	 */
-	protected void initContentProvider4() {
-	}
-
-	/**
-	 * Get list of descriptors from the process
-	 * @return
-	 * 			List of descriptors
-	 */
-	protected List getDescriptorsFromProcess() {
-		return null;
-	}
-
-	/**
-	 * Returns filter which allows filtering element based on method configuration 
-	 * @return
-	 * 		Filter
-	 */
-	protected IFilter getFilter() {
-		return null;
-	}
-
-	protected void createSection(Composite composite) {
-		int tableHeight = 80;
-
-		// create section
-		Section aSection = FormUI.createSection(toolkit, composite,
-				title, desc);
-
-		// create composite
-		Composite sectionComposite = FormUI.createComposite(toolkit, aSection,
-				2, false);
-
-		// create table 1
-		int count = 0;
-		{
-			Composite pane1 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane1, table1);
-
-			ctrl_table_1 = FormUI.createTable(toolkit, pane1, tableHeight);
-			tableViewer1 = new TableViewer(ctrl_table_1);
-			initContentProvider1();
-
-			tableViewer1.setLabelProvider(labelProvider);
-			tableViewer1.setInput(element);
-
-			// create buttons for table1
-			Composite pane2 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-
-			if (changesAllowed[count]) {
-				ctrl_add_1 = FormUI.createButton(toolkit, pane2,
-						PropertiesResources.Process_Add); 
-				ctrl_add_proc_1 = FormUI
-						.createButton(toolkit, pane2, PropertiesResources.Process_AddFromProcess); 
-				ctrl_remove_1 = FormUI.createButton(toolkit, pane2,
-						PropertiesResources.Process_Remove); 
-				ctrl_remove_1.setEnabled(false);
-			}
-			toolkit.paintBordersFor(pane1);
-		}
-		count++;
-
-		// create table2
-		if (count < tableCount) {
-			Composite pane3 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane3, table2);
-
-			ctrl_table_2 = FormUI.createTable(toolkit, pane3, tableHeight);
-			tableViewer2 = new TableViewer(ctrl_table_2);
-			initContentProvider2();
-
-			tableViewer2.setLabelProvider(labelProvider);
-			tableViewer2.setInput(element);
-
-			// create buttons for table2
-			Composite pane4 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-			if (changesAllowed[count]) {
-				ctrl_add_2 = FormUI.createButton(toolkit, pane4,
-						PropertiesResources.Process_Add); 
-				ctrl_add_proc_2 = FormUI
-						.createButton(toolkit, pane4, PropertiesResources.Process_AddFromProcess); 
-				ctrl_remove_2 = FormUI.createButton(toolkit, pane4,
-						PropertiesResources.Process_Remove); 
-				ctrl_remove_2.setEnabled(false);
-			}
-			toolkit.paintBordersFor(pane3);
-		}
-
-		count++;
-
-		// Create table3
-		if (count < tableCount) {
-			Composite pane5 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane5, table3);
-
-			ctrl_table_3 = FormUI.createTable(toolkit, pane5, tableHeight);
-			tableViewer3 = new TableViewer(ctrl_table_3);
-			initContentProvider3();
-
-			tableViewer3.setLabelProvider(labelProvider);
-			tableViewer3.setInput(element);
-
-			// create buttons for table2
-			Composite pane6 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-			if ((new Boolean(changesAllowed[count])).booleanValue()) {
-				ctrl_add_3 = FormUI.createButton(toolkit, pane6,
-						PropertiesResources.Process_Add); 
-				ctrl_add_proc_3 = FormUI
-						.createButton(toolkit, pane6, PropertiesResources.Process_AddFromProcess); 
-				ctrl_remove_3 = FormUI.createButton(toolkit, pane6,
-						PropertiesResources.Process_Remove); 
-				ctrl_remove_3.setEnabled(false);
-			}
-			toolkit.paintBordersFor(pane5);
-		}
-		count++;
-
-		if (count < tableCount) {
-			Composite pane7 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.FILL_BOTH);
-			FormUI.createLabel(toolkit, pane7, table4);
-
-			ctrl_table_4 = FormUI.createTable(toolkit, pane7, tableHeight);
-			tableViewer4 = new TableViewer(ctrl_table_4);
-			initContentProvider4();
-
-			tableViewer4.setLabelProvider(labelProvider);
-			tableViewer4.setInput(element);
-
-			// create buttons for table4
-			Composite pane8 = FormUI.createComposite(toolkit, sectionComposite,
-					GridData.VERTICAL_ALIGN_CENTER
-							| GridData.HORIZONTAL_ALIGN_CENTER);
-			if ((new Boolean(changesAllowed[count])).booleanValue()) {
-				ctrl_add_4 = FormUI.createButton(toolkit, pane8,
-						PropertiesResources.Process_Add); 
-				ctrl_add_proc_4 = FormUI
-						.createButton(toolkit, pane8, PropertiesResources.Process_AddFromProcess); 
-				ctrl_remove_4 = FormUI.createButton(toolkit, pane8,
-						PropertiesResources.Process_Remove); 
-				ctrl_remove_4.setEnabled(false);
-			}
-			toolkit.paintBordersFor(pane8);
-
-		}
-
-		// create brief description
-		int heightHint = 40;
-		// int horizontalSpan = 2;
-		FormUI.createLabel(toolkit, sectionComposite, PropertiesResources.Process_briefDescription, heightHint); 
-		ctrl_brief_desc = FormUI.createText(toolkit, sectionComposite,
-				heightHint, heightHint);
-		ctrl_brief_desc.setEditable(false);
-
-		toolkit.paintBordersFor(sectionComposite);
-	}
-
-	/**
-	 * addListerers
-	 * 
-	 */
-	protected void addListeners() {
-		/**
-		 * First set of listeners
-		 */
-		int count = 0;
-		if (count < tableCount) {
-			ctrl_table_1.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) tableViewer1
-							.getSelection();
-					if ((selection.size() > 0) && editable)
-						ctrl_remove_1.setEnabled(true);
-				}
-			});
-
-			tableViewer1
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) tableViewer1
-									.getSelection();
-							if ((selection.size() > 0) & editable)
-								ctrl_remove_1.setEnabled(true);
-							if (selection.size() == 1) {
-								String desc = ((MethodElement) selection
-										.getFirstElement())
-										.getBriefDescription();
-								if (desc == null) {
-									desc = ""; //$NON-NLS-1$
-								}
-								ctrl_brief_desc.setText(desc);
-							} else if (selection.size() > 1) {
-								ctrl_brief_desc
-										.setText(PropertiesResources.Process_MultipleSelection + " - " + selection.size()); //$NON-NLS-1$ 
-							}
-						}
-					});
-
-			if (changesAllowed[count]) {
-				ctrl_add_1.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IFilter filter = getFilter();
-						List existingElements = ProcessUtil
-								.getAssociatedElementList(getExistingElements1());
-
-						ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-								.getWorkbench().getActiveWorkbenchWindow()
-								.getShell(), filter, element, tabString,
-								existingElements);
-
-						fd.setBlockOnOpen(true);
-						fd.setTitle(tabString);
-						fd.open();
-						addItems1(fd.getSelectedItems());
-						tableViewer1.refresh();
-
-					}
-				});
-
-				ctrl_add_proc_1.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						descriptorProcessfilter = getFilterForDescriptors();
-						process = getProcess();
-						if (descriptorProcessfilter != null && process != null) {
-							List existingElements = getExistingElements1();
-							ItemsFilterDialog fd = new ItemsFilterDialog(
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getShell(),
-									descriptorProcessfilter, process,
-									getDescriptorTabName(), existingElements);
-
-							fd.setBlockOnOpen(true);
-							fd.open();
-							addFromProcessItems1(fd.getSelectedItems());
-							tableViewer1.refresh();
-						}
-
-					}
-				});
-
-				ctrl_remove_1.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IStructuredSelection selection = (IStructuredSelection) tableViewer1
-								.getSelection();
-						if (selection.size() > 0) {
-							// update the model
-							ArrayList rmItems = new ArrayList();
-							rmItems.addAll(selection.toList());
-							removeItems1(rmItems);
-							tableViewer1.refresh();
-
-							// clear the selection
-							tableViewer1.setSelection(null, true);
-							ctrl_brief_desc.setText(""); //$NON-NLS-1$
-						}
-						ctrl_remove_1.setEnabled(false);
-					}
-				});
-			}
-		}
-		count++;
-
-		/**
-		 * Second set of listeners
-		 */
-		if (count < tableCount) {
-			ctrl_table_2.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) tableViewer2
-							.getSelection();
-					if ((selection.size() > 0) && editable) {
-						if (ctrl_remove_2 != null)
-							ctrl_remove_2.setEnabled(true);
-					}
-				}
-			});
-
-			tableViewer2
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) tableViewer2
-									.getSelection();
-							if ((selection.size() > 0) && editable) {
-								if (ctrl_remove_2 != null)
-									ctrl_remove_2.setEnabled(true);
-							}
-							if (selection.size() == 1) {
-								String desc = ((MethodElement) selection
-										.getFirstElement())
-										.getBriefDescription();
-								if (desc == null) {
-									desc = ""; //$NON-NLS-1$
-								}
-								ctrl_brief_desc.setText(desc);
-							} else if (selection.size() > 1) {
-								ctrl_brief_desc
-										.setText(PropertiesResources.Process_MultipleSelection + " - " + selection.size()); //$NON-NLS-1$ 
-							}
-						}
-					});
-
-			if (changesAllowed[count]) {
-				ctrl_add_2.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IFilter filter = getFilter();
-						List existingElements = ProcessUtil
-								.getAssociatedElementList(getExistingElements2());
-						ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-								.getWorkbench().getActiveWorkbenchWindow()
-								.getShell(), filter, element, tabString,
-								existingElements);
-
-						fd.setBlockOnOpen(true);
-						fd.setTitle(tabString);
-						fd.open();
-						addItems2(fd.getSelectedItems());
-						tableViewer2.refresh();
-					}
-				});
-
-				ctrl_add_proc_2.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						descriptorProcessfilter = getFilterForDescriptors();
-						process = getProcess();
-						if (descriptorProcessfilter != null && process != null) {
-							List existingElements = getExistingElements2();
-							ItemsFilterDialog fd = new ItemsFilterDialog(
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getShell(),
-									descriptorProcessfilter, process,
-									getDescriptorTabName(), existingElements);
-
-							fd.setBlockOnOpen(true);
-							fd.open();
-							addFromProcessItems2(fd.getSelectedItems());
-							tableViewer2.refresh();
-						}
-					}
-				});
-
-				ctrl_remove_2.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IStructuredSelection selection = (IStructuredSelection) tableViewer2
-								.getSelection();
-						if (selection.size() > 0) {
-							// update the model
-							ArrayList rmItems = new ArrayList();
-							rmItems.addAll(selection.toList());
-							removeItems2(rmItems);
-							tableViewer2.refresh();
-
-							// clear the selection
-							tableViewer2.setSelection(null, true);
-							ctrl_brief_desc.setText(""); //$NON-NLS-1$
-						}
-						ctrl_remove_2.setEnabled(false);
-					}
-				});
-			}
-		}
-		count++;
-
-		/**
-		 * Third set of listeners
-		 */
-		if (count < tableCount) {
-			ctrl_table_3.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) tableViewer3
-							.getSelection();
-					if ((selection.size() > 0) && editable)
-						ctrl_remove_3.setEnabled(true);
-				}
-			});
-
-			tableViewer3
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) tableViewer3
-									.getSelection();
-							if ((selection.size() > 0) && editable)
-								ctrl_remove_3.setEnabled(true);
-							if (selection.size() == 1) {
-								String desc = ((MethodElement) selection
-										.getFirstElement())
-										.getBriefDescription();
-								if (desc == null) {
-									desc = ""; //$NON-NLS-1$
-								}
-								ctrl_brief_desc.setText(desc);
-							} else if (selection.size() > 1) {
-								ctrl_brief_desc
-										.setText(PropertiesResources.Process_MultipleSelection + " - " + selection.size()); //$NON-NLS-1$ 
-							}
-						}
-					});
-
-			if ((new Boolean(changesAllowed[count])).booleanValue()) {
-				ctrl_add_3.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IFilter filter = getFilter();
-						List existingElements = ProcessUtil
-								.getAssociatedElementList(getExistingElements3());
-						ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-								.getWorkbench().getActiveWorkbenchWindow()
-								.getShell(), filter, element, tabString,
-								existingElements);
-
-						fd.setBlockOnOpen(true);
-						fd.setTitle(tabString);
-						fd.open();
-						addItems3(fd.getSelectedItems());
-						tableViewer3.refresh();
-
-					}
-				});
-
-				ctrl_add_proc_3.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						descriptorProcessfilter = getFilterForDescriptors();
-						process = getProcess();
-						if (descriptorProcessfilter != null && process != null) {
-							List existingElements = getExistingElements3();
-							ItemsFilterDialog fd = new ItemsFilterDialog(
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getShell(),
-									descriptorProcessfilter, process,
-									getDescriptorTabName(), existingElements);
-
-							fd.setBlockOnOpen(true);
-							fd.open();
-							addFromProcessItems3(fd.getSelectedItems());
-							tableViewer3.refresh();
-						}
-
-					}
-				});
-
-				ctrl_remove_3.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IStructuredSelection selection = (IStructuredSelection) tableViewer3
-								.getSelection();
-						if (selection.size() > 0) {
-							// update the model
-							ArrayList rmItems = new ArrayList();
-							rmItems.addAll(selection.toList());
-							removeItems3(rmItems);
-							tableViewer3.refresh();
-
-							// clear the selection
-							tableViewer3.setSelection(null, true);
-							ctrl_brief_desc.setText(""); //$NON-NLS-1$
-						}
-						ctrl_remove_3.setEnabled(false);
-					}
-				});
-			}
-		}
-		count++;
-
-		/**
-		 * Fouth set of listeners
-		 */
-		if (count < tableCount) {
-			ctrl_table_4.addFocusListener(new FocusAdapter() {
-				public void focusGained(FocusEvent e) {
-					IStructuredSelection selection = (IStructuredSelection) tableViewer4
-							.getSelection();
-					if ((selection.size() > 0) && editable)
-						ctrl_remove_4.setEnabled(true);
-				}
-			});
-
-			tableViewer4
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							IStructuredSelection selection = (IStructuredSelection) tableViewer4
-									.getSelection();
-							if ((selection.size() > 0) && editable)
-								ctrl_remove_4.setEnabled(true);
-							if (selection.size() == 1) {
-								String desc = ((MethodElement) selection
-										.getFirstElement())
-										.getBriefDescription();
-								if (desc == null) {
-									desc = ""; //$NON-NLS-1$
-								}
-								ctrl_brief_desc.setText(desc);
-							} else if (selection.size() > 1) {
-								ctrl_brief_desc
-										.setText(PropertiesResources.Process_MultipleSelection + " - " + selection.size()); //$NON-NLS-1$ 
-							}
-						}
-					});
-
-			if ((new Boolean(changesAllowed[count])).booleanValue()) {
-				ctrl_add_4.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IFilter filter = getFilter();
-						List existingElements = ProcessUtil
-								.getAssociatedElementList(getExistingElements4());
-						ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-								.getWorkbench().getActiveWorkbenchWindow()
-								.getShell(), filter, element, tabString,
-								existingElements);
-
-						fd.setBlockOnOpen(true);
-						fd.setTitle(tabString);
-						fd.open();
-						addItems4(fd.getSelectedItems());
-						tableViewer4.refresh();
-					}
-				});
-
-				ctrl_add_proc_4.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						descriptorProcessfilter = getFilterForDescriptors();
-						process = getProcess();
-						if (descriptorProcessfilter != null && process != null) {
-							List existingElements = getExistingElements4();
-							ItemsFilterDialog fd = new ItemsFilterDialog(
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getShell(),
-									descriptorProcessfilter, process,
-									getDescriptorTabName(), existingElements);
-
-							fd.setBlockOnOpen(true);
-							fd.open();
-							addFromProcessItems4(fd.getSelectedItems());
-							tableViewer4.refresh();
-						}
-					}
-				});
-
-				ctrl_remove_4.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						IStructuredSelection selection = (IStructuredSelection) tableViewer4
-								.getSelection();
-						if (selection.size() > 0) {
-							// update the model
-							ArrayList rmItems = new ArrayList();
-							rmItems.addAll(selection.toList());
-							removeItems4(rmItems);
-							tableViewer4.refresh();
-
-							// clear the selection
-							tableViewer4.setSelection(null, true);
-							ctrl_brief_desc.setText(""); //$NON-NLS-1$
-						}
-						ctrl_remove_4.setEnabled(false);
-					}
-				});
-			}
-		}
-	}
-
-	protected void addItems1(List list) {
-	};
-
-	protected void addItems2(List list) {
-	};
-
-	protected void addItems3(List list) {
-	};
-
-	protected void addItems4(List list) {
-	};
-
-	protected void addFromProcessItems1(List list) {
-	};
-
-	protected void addFromProcessItems2(List list) {
-	};
-
-	protected void addFromProcessItems3(List list) {
-	};
-
-	protected void addFromProcessItems4(List list) {
-	};
-
-	protected void removeItems1(List list) {
-	};
-
-	protected void removeItems2(List list) {
-	};
-
-	protected void removeItems3(List list) {
-	};
-
-	protected void removeItems4(List list) {
-	};
-
-	protected List getExistingElements1() {
-		return null;
-	};
-
-	protected List getExistingElements2() {
-		return null;
-	};
-
-	protected List getExistingElements3() {
-		return null;
-	};
-
-	protected List getExistingElements4() {
-		return null;
-	};
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RemoveDescriptorCommand.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RemoveDescriptorCommand.java
deleted file mode 100644
index da51f08..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RemoveDescriptorCommand.java
+++ /dev/null
@@ -1,252 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.command.DeleteUnusedDescriptorsCommand;
-import org.eclipse.epf.library.edit.ui.ReferenceSelection;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.ui.actions.ProcessDeleteAction;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * Command to remove descriptors
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class RemoveDescriptorCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private List elements;
-
-	private Descriptor desc;
-
-	private Collection modifiedResources;
-
-	private Command deleteUnusedDescriptorsCommand = null;
-
-	private int featureID;
-
-	private List references;
-
-	/**
-	 * Remove relationships
-	 */
-	public RemoveDescriptorCommand(Descriptor desc, List elements, int featureID) {
-
-		super();
-
-		this.elements = elements;
-		this.desc = desc;
-		this.featureID = featureID;
-
-		this.modifiedResources = new HashSet();
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		
-		List notUsedReferences = new ArrayList();
-		for (int i = 0; i < elements.size(); i++) {
-			Descriptor o = (Descriptor) elements.get(i);
-
-			boolean checkRef;
-			if (o instanceof WorkProductDescriptor)
-			{
-				checkRef = ProcessUtil.checkWorkProductDescriptorReferences(Collections
-				.singleton(desc), (WorkProductDescriptor) o, true, featureID);
-			}
-			else
-				checkRef = ProcessUtil.checkDescriptorReferences(desc, o);
-			
-			if (!checkRef) {
-				Activity act = UmaUtil.getParentActivity(desc);
-				if (act.getBreakdownElements().contains(o))
-					notUsedReferences.add(o);
-			}
-		}
-		if (!(notUsedReferences.isEmpty())) {
-			Object[] refToBeDeleted = ReferenceSelection
-					.getReferences(notUsedReferences);
-			references = Arrays.asList(refToBeDeleted);
-		}
-		
-		redo();
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		if (desc instanceof TaskDescriptor)
-		{
-			switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-				((TaskDescriptor) desc).setPerformedPrimarilyBy(null);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-				((TaskDescriptor) desc).getAdditionallyPerformedBy().removeAll(
-						elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-				((TaskDescriptor) desc).getAssistedBy().removeAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				((TaskDescriptor) desc).getMandatoryInput().removeAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-				((TaskDescriptor) desc).getExternalInput().removeAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-				((TaskDescriptor) desc).getOptionalInput().removeAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				((TaskDescriptor) desc).getOutput().removeAll(elements);
-				break;
-			}
-		}
-		else if (desc instanceof RoleDescriptor)
-		{
-			switch (featureID){
-			case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-				((RoleDescriptor) desc).getResponsibleFor().removeAll(elements);
-				break;
-			}
-		}
-
-		if (references != null && !references.isEmpty()) {
-			if (deleteUnusedDescriptorsCommand == null) {
-				deleteUnusedDescriptorsCommand = new DeleteUnusedDescriptorsCommand(
-						references, false, Collections.EMPTY_LIST) {
-
-					protected Command delete(List elements) {
-						return ProcessDeleteAction.delete(elements);
-					}
-				};
-			}
-			deleteUnusedDescriptorsCommand.execute();
-		}
-
-		if (!elements.isEmpty()) {
-			
-			if (desc.eResource() != null) {
-				modifiedResources.add(desc.eResource());
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-
-		// basically remove from configuration if anything was added
-
-		if (desc instanceof TaskDescriptor)
-		{
-			switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-				Object o = elements.get(0);
-				if (o instanceof RoleDescriptor)
-					((TaskDescriptor) desc).setPerformedPrimarilyBy((RoleDescriptor)o);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-				((TaskDescriptor) desc).getAdditionallyPerformedBy().addAll(
-						elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-				((TaskDescriptor) desc).getAssistedBy().addAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				((TaskDescriptor) desc).getMandatoryInput().addAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-				((TaskDescriptor) desc).getExternalInput().addAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-				((TaskDescriptor) desc).getOptionalInput().addAll(elements);
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				((TaskDescriptor) desc).getOutput().addAll(elements);
-				break;
-			}
-		}
-		else if (desc instanceof RoleDescriptor)
-		{
-			switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-				((RoleDescriptor) desc).getResponsibleFor().addAll(elements);
-				break;
-			}
-		}
-
-		if (references != null && !references.isEmpty()) {
-			try {
-				if (deleteUnusedDescriptorsCommand != null)
-					deleteUnusedDescriptorsCommand.undo();
-			} catch (RuntimeException exception) {
-			
-			}
-		}
-		
-	}
-	
-	/**
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose()
-	{
-		if (deleteUnusedDescriptorsCommand != null)
-			deleteUnusedDescriptorsCommand.dispose();
-		if(references != null) {
-			references.clear();
-		}
-		if(modifiedResources != null) {
-			modifiedResources.clear();
-		}
-		
-		super.dispose();
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		return modifiedResources;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/Resources.properties b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/Resources.properties
deleted file mode 100644
index d1cbd10..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/Resources.properties
+++ /dev/null
@@ -1,211 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-Process_generalInformationTitle=General Information
-Process_DocumentInformationTitle=Documentation Information
-Activity_guidanceInformationTitle=Guidance
-BreakdownElement_optionInformationTitle=Breakdown Options
-TaskDescriptor_stepInformationTitle=Steps
-
-TaskDescriptor_stepInformationDescription=Specify the steps to perform this task descriptor.
-
-Process_generalInformationDescription=Provide general information about this {0}.
-Process_documentInformationDescription=Provide documentation information about this {0}.
-
-Descriptor_generalInformationDescription=Provide general information about this descriptor.
-Descriptor_detailInformationDescription=Provide detailed information about this descriptor.
-Milestone_generalInformationDescription=Provide general information about this milestone.
-Milestone_detailInformationDescription=Provide detailed information about this milestone.
-
-BreakdownElement_generalInformationDescription=Provide general information about this breakdown element.
-WorkBreakdownElement_generalInformationDescription=Provide general information about this work breakdown element.
-Descriptor_generalInformationDescripton=Provide general information about this descriptor.
-Activity_generalInformationDescription=Provide general information about this activity.
-
-BreakdownElement_DocumentInformationDescription=Provide documentation information about this breakdown element.
-Activity_DocumentInformationDescription=Provide documentation information about this activity.
-Descriptor_documentInformationDescription=Provide documentation information about this descriptor.
-Process_None=<< NONE >>
-Process_name=Name:
-Process_PresentationName=Presentation name:
-Process_briefDescription=Brief description:
-Process_mainDescription= Main description:
-Process_purpose=Purpose:
-Process_prefix=Prefix:
-
-BreakdownElement_Type_Name=Breakdown Element
-
-Process_Type_Task=Method task:
-Process_Type_Role=Method role:
-Process_Type_WorkProduct=Method work product:
-
-WorkProduct_Type=Work Product Type:
-
-Activity_ModelInfo=Model information:
-Activity_Type=Activity Type:
-Activity_presentationName=Presentation name:
-Activity_alternatives=Alternatives:
-Activity_howToStaff=How to staff:
-BreakdownElement_keyConsiderations=Key considerations:
-Process_usageGuidance=Usage guidance:
-
-Activity_RoadmapTitle=Roadmaps
-Activity_RoadmapDescription=Provide links to additional information in the form of roadmaps.
-Activity_GeneralGuidanceTitle=General Guidance
-Activity_GeneralGuidanceDescription=Provide links to additional information in the form of guidance.
-Activity_CommunicationMaterialTitle=Communication Materials
-Activity_CommunicationMaterialDescription=Provide links to additional information in the form of communication materials.
-Activity_EducationMaterialTitle=Education Materials
-Activity_EducationMaterialDescription=Provide links to additional information in the form of education materials.
-
-Activity_Selected_Roadmap=Roadmaps:
-Activity_Selected_GeneralGuidance=Guidance:
-Activity_Selected_CommunicationMaterial=Communication Materials:
-Activity_Selected_EducationMaterial=Education Materials:
-
-Activity_DiagramTitle=Diagram
-Activity_DiagramDescription = Provide diagram images for this {0}.
-Activity_ADImage=Activity Diagram
-Activity_ADDImage=Activity Detail Diagram
-Activity_WPDImage=Work Product Dependency Diagram
-Activity_UseADImage=Use Activity Diagram for publishing
-Activity_UseADDImage=Use Activity Detail Diagram for publishing
-Activity_UseWPDImage=Use Work Product Dependency Diagram for publishing
-Activity_Assign=Assign...
-
-TaskDescriptor_Selected_Steps=Steps:
-TaskDescriptor_StepDialogTitle=Steps
-TaskDescriptor_StepDialogMessage=Select steps
-
-Activity_WorkRollup=Work Rollup
-Activity_TeamRollup=Team Rollup
-Activity_WorkProductsRollup=Work Products Rollup
-Activity_WorkRollupDescription=Review the work roll-up for this activity in this section.
-Activity_TeamRollupDescription=Review the team roll-up for this activity in this section.
-Activity_WorkProductsRollupDescription=Review the work product roll-up for this activity in this section.
-BreakdownElement_Option_MultipleOcurrance=Multiple Occurrences
-BreakdownElement_Option_Optional=Optional
-BreakdownElement_Option_Planned=Planned
-BreakdownElement_Option_Supressed=Suppressed
-
-WorkBreakdownElement_EventDriven=Event Driven
-WorkBreakdownElement_Ongoing=Ongoing
-WorkBreakdownElement_Repeatable=Repeatable
-WorkBreakdownElement_Predecessors=Predecessors:
-WorkBreakdownElement_Dependency=Dependency:
-WorkBreakdownElement_Dependency_COL_ID_TEXT=Index
-WorkBreakdownElement_Dependency_COL_PRESENTATION_NAME_TEXT=Presentation Name
-WorkBreakdownElement_Dependency_COL_DEPENDENCY_TEXT=Dependency
-WorkBreakdownElement_Dependency_Add=Add
-WorkBreakdownElement_Dependency_Edit=Edit
-WorkBreakdownElement_Dependency_Remove=Remove
-
-WorkOrderType_FINISH_TO_START=Finish To Start
-WorkOrderType_FINISH_TO_FINISH=Finish To Finish
-WorkOrderType_START_TO_FINISH=Start To Finish
-WorkOrderType_START_TO_START=Start To Start
-
-BreakdownElement_Option_Synchronized=Synchronized with source
-
-Descriptor_RefinedDescription=Refined description:
-
-TaskDescriptor_Roles_SectionTitle=Roles
-TaskDescriptor_Roles_SectionDescription=Assign the role descriptors to perform this task descriptor.
-TaskDescriptor_Roles_Table1=Primary Performer:
-TaskDescriptor_Roles_Table2=Additional Performers:
-TaskDescriptor_Roles_Table3=Assisted By:
-
-TaskDescriptor_WorkProducts_SectionTitle=Work Products
-TaskDescriptor_WorkProducts_SectionDescription=Specify the input and output work product descriptors for this task descriptor.
-TaskDescriptor_WorkProducts_Table1=Mandatory Input:
-TaskDescriptor_WorkProducts_Table2=Optional Input:
-TaskDescriptor_WorkProducts_Table3=External Input:
-TaskDescriptor_WorkProducts_Table4=Output:
-
-RoleDescriptor_Tasks_SectionTitle=Tasks
-RoleDescriptor_Tasks_SectionDescription=This role descriptor is performer of following task descriptors.
-RoleDescriptor_Tasks_Table1=Primary Performer:
-RoleDescriptor_Tasks_Table2=Additional Performers:
-RoleDescriptor_Tasks_Table3=Assisted By:
-
-RoleDescriptor_WorkProducts_SectionTitle=Work Products
-RoleDescriptor_WorkProducts_SectionDescription=This role descriptor is responsible for and modifies following work product descriptors.
-RoleDescriptor_WorkProducts_Table1=Responsible for:
-RoleDescriptor_WorkProducts_Table2=Modifies:
-
-WorkProductDescriptor_Roles_SectionTitle=Roles
-WorkProductDescriptor_Roles_SectionDescription=The following role descriptors are responsible for and modifies this work product descriptor.
-WorkProductDescriptor_Roles_Table1=Responsible for:
-WorkProductDescriptor_Roles_Table2=Modified by:
-WorkProductDescriptor_Type=Type:
-WorkProductDescriptor_ActivityEntryState=Activity Entry State:
-WorkProductDescriptor_ActivityExitState=Activity Exit State:
-
-WPDescriptor_DeliverablePart_SectionTitle=Deliverable Parts
-WPDescriptor_DeliverablePart_SectionDescription=The deliverable has following deliverable parts.
-WPDescriptor_DeliverablePart_Table1=Deliverable Parts
-
-RoleDescriptor_Team_SectionTitle=Teams
-RoleDescriptor_Team_SectionDescription=This role descriptor refers to following teams.
-RoleDescriptor_Team_Table1=Teams:
-
-CompositeRole_Role_SectionTitle=Roles
-CompositeRole_Role_SectionDescription=This composite role has following aggregated roles.
-CompositeRole_Role_Table1=Aggregated Roles:
-
-TeamProfile_Role_SectionTitle=Roles
-TeamProfile_Role_SectionDescription=Add or remove roles to/from the team profile.
-TeamProfile_Role_Table1=Roles:
-
-Process_RichText_CollapseImage=collapsed.gif
-Process_RichText_ExpandImage=expanded.gif
-Process_Add=Add...
-Process_AddFromProcess=Add from Process...
-Process_Rename_Message=You are about to change the name of this process. This will save this editor and rename the process folder to the new name. Do you want to continue?
-Process_Remove=Remove
-Process_Up=Up
-Process_Down=Down
-Process_MultipleSelection=Multiple Selection
-Process_Button_LinkMethodElement=Link Method Element...
-Process_Button_ClearMethodElement=Clear
-
-## Error/Warning
-Process_InvalidNameTitle=Invalid name
-Process_InvalidName=IUPA0081E: The name cannot be empty. Please specify a valid name.
-Process_Rename_Title=Rename
-Process_InvalidPresentationName=IUPA0082E: The presentation name cannot be empty. Please specify a valid presentation name.
-Process_LinkMethodElementTitle=Link Method Element
-Process_InvalidLinkMethodElement=IUPA0083E: Cannot link to ''{0}'' since this MethodElement is already being used for another descriptor under the same parent.
-Process_AssignmentInfoTitle=Information
-Process_TeamAssignError=IUPA0084E: Cannot add ''{0}'' to the team ''{1}'' \n\nRole descriptor(s) must have method element role associated with it to be assigned to team.\n\n Fix the association first and try again.
-Process_TeamDialogMessage=Select teams
-Process_TeamDialogTitle=Teams
-
-Process_DeliverableAssignError=IUPA0085E: Cannot add ''{0}'' to the deliverable ''{1}'' since it does not have method element workproduct associated with it.
-Process_CompositeRoleAssignError=IUPA0086E: Cannot add  ''{0}'' to the Composite role ''{1}'' since it does not have method element role associated with it.
-Process_predecessors_validNumberMessage=IUPA0087W: Please enter valid number for predecessors.
-Process_predecessors_validNumberTitle=Invalid Predecessor Id
-
-Process_NoItems=No items selected
-Process_ItemsSelected={0} items selected
-Process_NoPropertiesAvailable=No Properties available
-
-PredecessorDialog_Title=Predecessor Dependency
-PredecessorDialog_HeaderMessage=Enter dependency type for predecessor:
-PredecessorDialog_Index=Index:
-PredecessorDialog_PresentationName=Presentation Name:
-PredecessorDialog_Dependency=Dependency:
-PredecessorDialog_PredecessorErrorDialogTitle=Predecessor
-PredecessorDialog_PredecessorErrorMessage=IUPA0088E: Predecessor with that Id already exists for this work breakdown element.
-
-ProcessEditorFormProperties_textEditCell_problem_msg=IUPA0090E: There was an error editing a property.
-ProcessEditorFormProperties_cellEditor_invalidPredcessor_problem_msg=IUPA0089W: Invalid predecessor list
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorGeneralSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorGeneralSection.java
deleted file mode 100644
index fd16c7e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorGeneralSection.java
+++ /dev/null
@@ -1,264 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.filters.ProcessRoleFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.command.LinkMethodElementCommand;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * The general tab section for Role Descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class RoleDescriptorGeneralSection extends DescriptorGeneralSection {
-	protected RoleDescriptor element;
-
-	private Label ctrl_method_element_label;
-
-	private Text ctrl_method_element;
-
-	private Button linkButton;
-	
-	private Button clearButton;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#init()
-	 */
-	protected void init() {
-		super.init();
-		// get RoleDescriptor object
-		element = (RoleDescriptor) getElement();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#createGeneralSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createGeneralSection(Composite composite) {
-		super.createGeneralSection(composite);
-
-		// method element
-		ctrl_method_element_label = FormUI.createLabel(toolkit,
-				generalComposite, PropertiesResources.Process_Type_Role); 
-
-		ctrl_method_element = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, 1);
-		ctrl_method_element.setText(getMethodElementName(element));
-		ctrl_method_element.setEnabled(false);
-
-		Composite buttonComposite = FormUI.createComposite(toolkit,
-				generalComposite, SWT.NONE, 2, true);
-		linkButton = FormUI.createButton(toolkit, buttonComposite, SWT.PUSH, 1);
-		linkButton
-				.setText(PropertiesResources.Process_Button_LinkMethodElement); 
-
-		clearButton = FormUI.createButton(toolkit, buttonComposite, SWT.PUSH, 1);
-		clearButton
-				.setText(PropertiesResources.Process_Button_ClearMethodElement); 
-
-		// show/hide method role
-		toggleMethodRole();
-	}
-
-	private void toggleMethodRole() {
-		if (element instanceof CompositeRole) {
-			ctrl_method_element_label.setVisible(false);
-			ctrl_method_element.setVisible(false);
-			linkButton.setVisible(false);
-			clearButton.setVisible(false);
-		} else {
-			ctrl_method_element_label.setVisible(true);
-			ctrl_method_element.setVisible(true);
-			linkButton.setVisible(true);
-			clearButton.setVisible(true);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-
-		linkButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IFilter filter = new ProcessRoleFilter(
-						getConfiguration(), null, FilterConstants.ROLES);
-				List existingElements = new ArrayList();
-				if (element.getRole() != null) {
-					existingElements.add(element.getRole());
-				}
-				ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						filter, element, FilterConstants.ROLES,
-						existingElements);
-
-				fd.setBlockOnOpen(true);
-				fd.setViewerSelectionSingle(true);
-				fd.setTitle(FilterConstants.ROLES);
-				fd.open();
-				setMethodElement(fd.getSelectedItems());
-
-				// update method element control
-				ctrl_method_element.setText(getMethodElementName(element));
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e1) {
-			}
-		});
-		
-		clearButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				actionMgr.doAction(IActionManager.SET, element,
-						UmaPackage.eINSTANCE
-								.getRoleDescriptor_Role(),
-						null, -1);
-				// update method element control
-				ctrl_method_element.setText(getMethodElementName(element));
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e1) {
-			}
-		});
-	}
-
-	private void setMethodElement(List items) {
-		if ((items != null) && (items.size() >= 1)) {
-			if (items.get(0) instanceof Role) {
-				Role role = (Role) items.get(0);
-
-//				List list = ProcessUtil
-//						.getSiblings(TngAdapterFactory.INSTANCE
-//								.getOBS_ComposedAdapterFactory(), getAdapter(),
-//								element);
-				boolean canAssign = true;
-//				for (Iterator itor = list.iterator(); itor.hasNext();) {
-//					Object obj = itor.next();
-//					if (obj instanceof RoleDescriptor) {
-//						RoleDescriptor roleDesc = (RoleDescriptor) obj;
-//						if ((!roleDesc.equals(element))
-//								&& (!roleDesc.getSuppressed().booleanValue())) {
-//							Role exisingRole = roleDesc.getRole();
-//							if (role.equals(exisingRole)) {
-//								canAssign = false;
-//								break;
-//							}
-//						}
-//					}
-//				}
-				if (canAssign) {
-					LinkMethodElementCommand cmd = new LinkMethodElementCommand(
-							element, role, UmaPackage.ROLE_DESCRIPTOR__ROLE);
-					actionMgr.execute(cmd);
-
-					// set selection to same element to enable correct actions
-					getEditor().setSelection(getSelection());
-				} else {
-					MessageFormat mf = new MessageFormat(PropertiesResources.Process_InvalidLinkMethodElement); 
-					Object[] args = { role.getName() };
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayInfo(
-									PropertiesResources.Process_LinkMethodElementTitle, mf.format(args)); 
-				}
-			}
-		}
-	}
-
-	private String getMethodElementName(RoleDescriptor element) {
-		String str = PropertiesResources.Process_None; 
-		if (element.getRole() != null) {
-			str = element.getRole().getName();
-		}
-
-		return str;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-
-		linkButton.setEnabled(editable);
-		clearButton.setEnabled(editable);
-		Object obj = getElement();
-		if (obj instanceof RoleDescriptor) {
-			RoleDescriptor roleDesc = (RoleDescriptor) obj;
-			if ((roleDesc.getSuperActivities() == null)
-					|| (roleDesc.getSuperActivities() == null)) {
-				nameText.setEditable(true);
-				presentationNameText.setEditable(true);
-			} else {
-				nameText.setEditable(editable);
-				presentationNameText.setEditable(editable);
-			}
-		}
-
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			super.refresh();
-
-			if (getElement() instanceof RoleDescriptor) {
-				element = (RoleDescriptor) getElement();
-				ctrl_method_element.setText(getMethodElementName(element));
-
-				// show/hide method role
-				toggleMethodRole();
-
-			}
-		} catch (Exception ex) {
-			logger.logError(
-					"Error refreshing RoleDescriptor general section: ", ex); //$NON-NLS-1$
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#getNamePrefix()
-	 */
-	public String getNamePrefix() {
-		if (getElement() instanceof CompositeRole) {
-			return LibraryUIText.TEXT_COMPOSITE_ROLE + ": "; //$NON-NLS-1$
-		}
-		return LibraryUIText.TEXT_ROLE_DESCRIPTOR + ": "; //$NON-NLS-1$
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorTeamSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorTeamSection.java
deleted file mode 100644
index 737b406..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorTeamSection.java
+++ /dev/null
@@ -1,310 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The Role descriptor - team profile section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class RoleDescriptorTeamSection extends OBSRelationSection {
-	private Image titleImage = null;
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#initContentProvider()
-	 */
-	protected void initContentProvider() {
-		contentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getSelectedTeams(element).toArray();
-			}
-		};
-
-		viewer.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#init()
-	 */
-	protected void init() {
-		super.init();
-		element = (RoleDescriptor) element;
-
-		
-		setTabData(PropertiesResources.RoleDescriptor_Team_SectionTitle, 
-				PropertiesResources.RoleDescriptor_Team_SectionDescription,
-				PropertiesResources.RoleDescriptor_Team_Table1); 
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof RoleDescriptor) {
-				super.refresh();
-
-				element = (RoleDescriptor) getElement();
-				viewer.refresh();
-			}
-		} catch (Exception ex) {
-			logger.logError(
-					"Error refreshing Role Descriptor team section ", ex); //$NON-NLS-1$
-		}
-	}
-
-	private void add(Object[] items) {
-		// update the model
-		if (items != null) {
-			for (int i = 0; i < items.length; i++) {
-				TeamProfile team = (TeamProfile) items[i];
-				if (element instanceof CompositeRole) {
-					CompositeRole compRole = ProcessUtil
-							.createCompositeRole((CompositeRole) element);
-					actionMgr.doAction(IActionManager.ADD, team,
-							UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-							compRole, -1);
-				} else if (element instanceof RoleDescriptor) {
-					Role role = ((RoleDescriptor) element).getRole();
-					if (role != null) {
-						if (!isPartOfTeam(role, team)) {
-							RoleDescriptor roleDesc = ProcessUtil
-									.createRoleDescriptor(role);
-							actionMgr.doAction(IActionManager.ADD, team,
-									UmaPackage.eINSTANCE
-											.getTeamProfile_TeamRoles(),
-									roleDesc, -1);
-						}
-					} else {
-						MessageFormat mf = new MessageFormat(
-								PropertiesResources.Process_TeamAssignError); 
-						Object[] args = { element.getName(), team.getName() };
-						String message = mf.format(args);
-						String title = getEditor().getTitle();
-						MsgDialog dialog = AuthoringUIPlugin.getDefault()
-								.getMsgDialog();
-						dialog.displayError(title, message, ""); //$NON-NLS-1$
-						return;
-					}
-				}
-				actionMgr.doAction(IActionManager.ADD, team,
-						UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-						element, -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#remove(java.util.ArrayList)
-	 */
-	protected void remove(ArrayList rmItems) {
-		// update the model
-		if (!rmItems.isEmpty()) {
-			for (Iterator itor = rmItems.iterator(); itor.hasNext();) {
-				TeamProfile team = (TeamProfile) itor.next();
-				Role role = ((RoleDescriptor) element).getRole();
-				actionMgr.doAction(IActionManager.REMOVE, team,
-						UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-						element, -1);
-
-				// Get the list of roleDescriptors from team profile which
-				// has same role original role descriptor
-				List teamRoles = team.getTeamRoles();
-				List roleDescList = new ArrayList();
-				for (int i = 0; i < teamRoles.size(); i++) {
-					RoleDescriptor roleDesc = (RoleDescriptor) teamRoles.get(i);
-
-					if (roleDesc.getRole().equals(role))
-					{
-						roleDescList.add(roleDesc);
-					}
-				}
-
-				// if roleDescripor just has one element, delete that one too.
-				// since that would be the last one
-				if (roleDescList.size() == 1) {
-					actionMgr.doAction(IActionManager.REMOVE, team,
-							UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-							(RoleDescriptor) roleDescList.get(0), -1);
-				}
-			}
-		}
-	}
-	
-	
-	private boolean isPartOfTeam(Role role, TeamProfile team) {
-		List teamRoles = team.getTeamRoles();
-		List roles = new ArrayList();
-		for (Iterator itor = teamRoles.iterator(); itor.hasNext();) {
-			RoleDescriptor roleDesc = (RoleDescriptor) itor.next();
-			roles.add(roleDesc.getRole());
-		}
-
-		if (roles.contains(role))
-			return true;
-
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#openAddDialog()
-	 */
-	protected void openAddDialog() {
-		IStructuredContentProvider teamContentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List items = getTeams();
-				items.removeAll(getSelectedTeams(element));
-				return items.toArray();
-			}
-		};
-
-		ILabelProvider teamLabelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory());
-
-		ListSelectionDialog dlg = new ListSelectionDialog(PlatformUI
-				.getWorkbench().getActiveWorkbenchWindow().getShell(), element,
-				teamContentProvider, teamLabelProvider, PropertiesResources.Process_TeamDialogMessage); 
-		titleImage = Display.getCurrent().getActiveShell().getImage();
-		ListSelectionDialog.setDefaultImage(titleImage);
-
-		dlg.setTitle(PropertiesResources.Process_TeamDialogTitle); 
-		dlg.setBlockOnOpen(true);
-		dlg.open();
-		add(dlg.getResult());
-	}
-
-	public void dispose() {
-		super.dispose();
-
-		if (contentProvider != null) {
-			contentProvider.dispose();
-		}
-	}
-
-	/**
-	 * Get parent
-	 * 
-	 * @param element
-	 * @return
-	 * 		Parent of the element
-	 */
-	protected Object getParent(BreakdownElement element) {
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				element, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(element);
-
-		return parent;
-	}
-
-	/**
-	 * Get Teams from parent
-	 * 
-	 * @return
-	 * 			List of teams
-	 */
-	private List getTeams() {
-		ArrayList items = new ArrayList();
-		Object parent = getParent(element);
-		while (parent != null) {
-			if (parent instanceof Activity) {
-				Activity act = (Activity) parent;
-				List breakdownElements = act.getBreakdownElements();
-				for (Iterator it = breakdownElements.iterator(); it.hasNext();) {
-					BreakdownElement element = (BreakdownElement) it.next();
-					if (element instanceof TeamProfile) {
-						TeamProfile team = (TeamProfile) element;
-						items.add(team);
-						// add any sub teams if there
-						List subTeams = team.getSubTeam();
-						items.addAll(subTeams);
-
-					}
-				}
-			}
-
-			parent = getParent((BreakdownElement) parent);
-		}
-
-		return items;
-	}
-
-	/**
-	 * Get selected teams for that role descriptor
-	 * 
-	 * @param object
-	 * @return
-	 * 		List of selected team 
-	 */
-	private List getSelectedTeams(EObject object) {
-		Object input = getInput();
-		
-		if (input instanceof RoleDescriptorWrapperItemProvider) {
-			return ProcessUtil
-					.getTeamProfiles((RoleDescriptorWrapperItemProvider) input);
-		} else {
-			RoleDescriptor roleDesc = (RoleDescriptor) object;
-			return ProcessUtil.getTeamProfiles(roleDesc, getAdapterFactory());
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorWorkProductSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorWorkProductSection.java
deleted file mode 100644
index 415fea5..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorWorkProductSection.java
+++ /dev/null
@@ -1,244 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.filters.DescriptorProcessFilter;
-import org.eclipse.epf.authoring.ui.filters.ProcessWorkProductFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.command.AssignWPToRoleDescriptor;
-import org.eclipse.epf.library.edit.process.command.IActionTypeConstants;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * Role Descriptor - work product section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class RoleDescriptorWorkProductSection extends RelationSection {
-	private IFilter filter = null;
-
-	/**
-	 * Get process work product filter
-	 */
-	public IFilter getFilter() {
-		if (filter == null) {
-			filter = new ProcessWorkProductFilter(getConfiguration(),
-					null, FilterConstants.WORKPRODUCTS);
-		}
-		return filter;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-
-		super.createControls(parent, tabbedPropertySheetPage);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider1()
-	 */
-	protected void initContentProvider1() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(
-						((RoleDescriptor) element).getResponsibleFor())
-						.toArray();
-			}
-		};
-		tableViewer1.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider2()
-	 */
-	protected void initContentProvider2() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(((RoleDescriptor) element).getModifies())
-						.toArray();
-			}
-		};
-		tableViewer2.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#init()
-	 */
-	protected void init() {
-		super.init();
-
-		labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory());
-
-		int numOfTables = 2;
-		
-		setTabData(PropertiesResources.RoleDescriptor_WorkProducts_SectionTitle,
-				PropertiesResources.RoleDescriptor_WorkProducts_SectionDescription,
-				PropertiesResources.RoleDescriptor_WorkProducts_Table1,
-				PropertiesResources.RoleDescriptor_WorkProducts_Table2,
-				null,
-				null,
-				FilterConstants.WORKPRODUCTS); 
-
-		boolean[] changesAllowed = { true, false };
-		setTableData(numOfTables, changesAllowed);
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#refresh()
-	 */
-	public void refresh() {
-		if (getElement() instanceof RoleDescriptor) {
-			element = (RoleDescriptor) getElement();
-		}
-		super.refresh();
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorsFromProcess()
-	 */
-	protected List getDescriptorsFromProcess() {
-		List items = new ArrayList();
-		return ProcessUtil.getElementsInScope(getAdapterFactory(), element,
-				WorkProductDescriptor.class, items);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems1(java.util.List)
-	 */
-	protected void addItems1(List items) {
-		if (!items.isEmpty()) {
-			AssignWPToRoleDescriptor cmd = new AssignWPToRoleDescriptor(
-					(RoleDescriptor) element, items,
-					IActionTypeConstants.ADD_RESPONSIBLE_FOR, getConfiguration());
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems1(java.util.List)
-	 */
-	protected void removeItems1(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items, UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	private List getWorkProducts(List items) {
-		List wpList = new ArrayList();
-		if (!items.isEmpty()) {
-			for (int i = 0; i < items.size(); i++) {
-				wpList.add(((WorkProductDescriptor) items.get(i))
-						.getWorkProduct());
-			}
-		}
-
-		return wpList;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements1()
-	 */
-	protected List getExistingElements1() {
-		return getWorkProducts(((RoleDescriptor) element).getResponsibleFor());
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getProcess()
-	 */
-	protected Process getProcess() {
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				element, ITreeItemContentProvider.class);
-		Object obj = ProcessUtil.getRootProcess(aFactory, adapter, element);
-		return (Process) obj;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getFilterForDescriptors()
-	 */
-	protected IFilter getFilterForDescriptors() {
-		return new DescriptorProcessFilter(getConfiguration()) {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof Activity) {
-					List list = new ArrayList();
-					getActivitiesInScope(TngAdapterFactory.INSTANCE
-							.getOBS_ComposedAdapterFactory(), element, list);
-					if (list.contains(obj))
-						return true;
-					else
-						return false;
-				}
-				// Uncomment to show extended activity's workproducts
-				// if(obj instanceof WorkProductDescriptorWrapperItemProvider){
-				// Object object =
-				// ((BreakdownElementWrapperItemProvider)obj).getParent(obj);
-				// List list = new ArrayList();
-				// getActivitiesInScope(
-				// TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory(),
-				// element, list);
-				// if(list.contains(object)) return true;
-				// }
-				if (obj instanceof WorkProductDescriptor)
-					return true;
-				return false;
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorTabName()
-	 */
-	protected String getDescriptorTabName() {
-		return FilterConstants.WORK_PRODUCT_DESCRIPTORS;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems1(java.util.List)
-	 */
-	protected void addFromProcessItems1(List items) {
-		if (!items.isEmpty()) {
-			actionMgr.doAction(IActionManager.ADD_MANY, element,
-					UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor(),
-					items, -1);
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorGeneralSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorGeneralSection.java
deleted file mode 100644
index 7bde103..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorGeneralSection.java
+++ /dev/null
@@ -1,255 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.filters.ProcessTaskFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.command.LinkMethodElementCommand;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-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.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * The general tab section for Task Descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class TaskDescriptorGeneralSection extends
-		WorkBreakdownElementGeneralSection {
-	protected TaskDescriptor element;
-
-	private Button synchronizedButton;
-
-	private Text ctrl_method_element;
-
-	private Button linkButton;
-	
-	private Button clearButton;
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#init()
-	 */
-	protected void init() {
-		super.init();
-		// get TaskDescriptor object
-		element = (TaskDescriptor) getElement();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#createGeneralSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createGeneralSection(Composite composite) {
-		super.createGeneralSection(composite);
-
-		// create composite for checkbox
-		checkBoxComposite = FormUI.createComposite(toolkit, generalComposite,
-				GridData.FILL_HORIZONTAL, numOfColumns, true);
-
-		// synchronized with source
-		synchronizedButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		synchronizedButton.setText(PropertiesResources.BreakdownElement_Option_Synchronized); 
-
-		// method element
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.Process_Type_Task); 
-		ctrl_method_element = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, 1);
-
-		ctrl_method_element.setText(getMethodElementName(element));
-		ctrl_method_element.setEnabled(false);
-
-		Composite buttonComposite = FormUI.createComposite(toolkit,
-				generalComposite, SWT.NONE, 2, true);
-		linkButton = FormUI.createButton(toolkit, buttonComposite, SWT.PUSH, 1);
-		linkButton
-				.setText(PropertiesResources.Process_Button_LinkMethodElement); 
-
-		clearButton = FormUI.createButton(toolkit, buttonComposite, SWT.PUSH, 1);
-		clearButton
-				.setText(PropertiesResources.Process_Button_ClearMethodElement); 
-
-
-	}
-
-	private void setMethodElement(List items) {
-		if ((items != null) && (items.size() >= 1)) {
-			if (items.get(0) instanceof Task) {
-				Task task = (Task) items.get(0);
-
-//				List siblings = ProcessUtil
-//						.getSiblings(TngAdapterFactory.INSTANCE
-//								.getWBS_ComposedAdapterFactory(), getAdapter(),
-//								element);
-				boolean canAssign = true;
-//			
-//
-//				for (Iterator itor = list.iterator(); itor.hasNext();) {
-//					Object obj = itor.next();
-//					if (obj instanceof TaskDescriptor) {
-//						TaskDescriptor taskDesc = (TaskDescriptor) obj;
-//						if ((!taskDesc.equals(element))
-//								&& (!taskDesc.getSuppressed().booleanValue())) {
-//							Task exisingTask = taskDesc.getTask();
-//							if (task.equals(exisingTask)) {
-//								canAssign = false;
-//								break;
-//							}
-//						}
-//					}
-//				}
-				if (canAssign) {
-					LinkMethodElementCommand cmd = new LinkMethodElementCommand(
-							element, task, UmaPackage.TASK_DESCRIPTOR__TASK);
-					actionMgr.execute(cmd);
-
-					// set selection to same element to enable correct actions
-					getEditor().setSelection(getSelection());
-				} else {
-					MessageFormat mf = new MessageFormat(PropertiesResources.Process_InvalidLinkMethodElement); 
-					Object[] args = { task.getName() };
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayInfo(
-									PropertiesResources.Process_LinkMethodElementTitle, mf.format(args)); 
-				}
-			}
-		}
-	}
-
-	private String getMethodElementName(TaskDescriptor element) {
-		String str = PropertiesResources.Process_None; 
-		if (element.getTask() != null) {
-			str = element.getTask().getName();
-		}
-
-		return str;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-
-		synchronizedButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				actionMgr.doAction(IActionManager.SET, element,
-						UmaPackage.eINSTANCE
-								.getDescriptor_IsSynchronizedWithSource(),
-						Boolean.valueOf(synchronizedButton.getSelection()), -1);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		linkButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IFilter filter = new ProcessTaskFilter(
-						getConfiguration(), null, FilterConstants.TASKS);
-				List existingElements = new ArrayList();
-				if (element.getTask() != null) {
-					existingElements.add(element.getTask());
-				}
-				ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						filter, element, FilterConstants.TASKS,
-						existingElements);
-
-				fd.setBlockOnOpen(true);
-				fd.setViewerSelectionSingle(true);
-				fd.setTitle(FilterConstants.TASKS);
-				fd.open();
-				setMethodElement(fd.getSelectedItems());
-
-				// update method element control
-				ctrl_method_element.setText(getMethodElementName(element));
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e1) {
-			}
-		});
-		
-		
-		clearButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				actionMgr.doAction(IActionManager.SET, element,
-						UmaPackage.eINSTANCE
-								.getTaskDescriptor_Task(),
-						null, -1);
-				// update method element control
-				ctrl_method_element.setText(getMethodElementName(element));
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e1) {
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-		synchronizedButton.setEnabled(editable);
-		linkButton.setEnabled(editable);
-		clearButton.setEnabled(editable);
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof TaskDescriptor) {
-				super.refresh();
-
-				element = (TaskDescriptor) getElement();
-				synchronizedButton.setSelection(element
-						.getIsSynchronizedWithSource().booleanValue());
-				ctrl_method_element.setText(getMethodElementName(element));
-			}
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing TaskDescriptor general section: " + element, ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.WorkBreakdownElementGeneralSection#getNamePrefix()
-	 */
-	public String getNamePrefix() {
-		return LibraryUIText.TEXT_TASK_DESCRIPTOR + ": "; //$NON-NLS-1$
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorRoleSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorRoleSection.java
deleted file mode 100644
index ce377a6..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorRoleSection.java
+++ /dev/null
@@ -1,410 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.filters.DescriptorProcessFilter;
-import org.eclipse.epf.authoring.ui.filters.ProcessRoleFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.command.AssignPrimaryPerformerToTaskDescriptor;
-import org.eclipse.epf.library.edit.process.command.AssignRoleToTaskDescriptor;
-import org.eclipse.epf.library.edit.process.command.IActionTypeConstants;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The Task descriptor - role tab section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class TaskDescriptorRoleSection extends RelationSection {
-	private IFilter roleFilter = null;
-
-	/**
-	 * Get process roledescriptor filter
-	 */
-	public IFilter getFilter() {
-		if (roleFilter == null) {
-			roleFilter = new ProcessRoleFilter(getConfiguration(), null,
-					FilterConstants.ROLES);
-		}
-		return roleFilter;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-
-		super.createControls(parent, tabbedPropertySheetPage);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider1()
-	 */
-	protected void initContentProvider1() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List list = new ArrayList();
-				RoleDescriptor role = ((TaskDescriptor) element)
-						.getPerformedPrimarilyBy();
-				if (role != null)
-					list.add(role);
-				return getFilteredList(list).toArray();
-			}
-		};
-		tableViewer1.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider2()
-	 */
-	protected void initContentProvider2() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(
-						((TaskDescriptor) element).getAdditionallyPerformedBy())
-						.toArray();
-			}
-		};
-		tableViewer2.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider3()
-	 */
-	protected void initContentProvider3() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(
-						((TaskDescriptor) element).getAssistedBy()).toArray();
-			}
-		};
-		tableViewer3.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#init()
-	 */
-	protected void init() {
-		super.init();
-
-		labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory());
-
-		int numOfTables = 3;
-		
-		setTabData(PropertiesResources.TaskDescriptor_Roles_SectionTitle,
-				PropertiesResources.TaskDescriptor_Roles_SectionDescription,
-				PropertiesResources.TaskDescriptor_Roles_Table1,
-				PropertiesResources.TaskDescriptor_Roles_Table2,
-				PropertiesResources.TaskDescriptor_Roles_Table3,
-				null,
-				FilterConstants.ROLES);
-		
-		boolean[] changesAllowed = { true, true, true };
-		setTableData(numOfTables, changesAllowed);
-
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#refresh()
-	 */
-	public void refresh() {
-		// System.out.println("Refreshing TaskDescriptor ROLES Section");
-		if (getElement() instanceof TaskDescriptor) {
-			element = (TaskDescriptor) getElement();
-		}
-		super.refresh();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorsFromProcess()
-	 */
-	protected List getDescriptorsFromProcess() {
-		List items = new ArrayList();
-		return ProcessUtil.getElementsInScope(getAdapterFactory(), element,
-				RoleDescriptor.class, items);
-
-	}
-
-	private List getRoles(List items) {
-		List roleList = new ArrayList();
-		if (!items.isEmpty()) {
-			for (int i = 0; i < items.size(); i++) {
-				roleList.add(((RoleDescriptor) items.get(i)).getRole());
-			}
-		}
-
-		return roleList;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems1(java.util.List)
-	 */
-	protected void addItems1(List items) {
-		if (!items.isEmpty()) {
-			List elementList = getRoles(((TaskDescriptor) element)
-					.getAdditionallyPerformedBy());
-			elementList.addAll(getRoles(((TaskDescriptor) element)
-					.getAssistedBy()));
-
-			List newList = new ArrayList();
-			for (int i = 0; i < items.size(); i++) {
-				Object obj = items.get(i);
-				if (obj instanceof Role) {
-					Role role = (Role) obj;
-					if (!elementList.contains(role))
-						newList.add(role);
-				}
-			}
-			if (newList.size() > 0) {
-				AssignPrimaryPerformerToTaskDescriptor cmd = new AssignPrimaryPerformerToTaskDescriptor(
-						(TaskDescriptor) element, (Role) newList.get(0), getConfiguration());
-				actionMgr.execute(cmd);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems2(java.util.List)
-	 */
-	protected void addItems2(List items) {
-		if (!items.isEmpty()) {
-			RoleDescriptor roleDesc = ((TaskDescriptor) element)
-					.getPerformedPrimarilyBy();
-			List elementList = getRoles(((TaskDescriptor) element)
-					.getAssistedBy());
-			if (roleDesc != null)
-				elementList.add(roleDesc.getRole());
-
-			List newList = new ArrayList();
-			for (int i = 0; i < items.size(); i++) {
-				Object obj = items.get(i);
-				if (obj instanceof Role) {
-					Role role = (Role) obj;
-					if (!elementList.contains(role))
-						newList.add(role);
-				}
-			}
-			if (newList.size() > 0) {
-				AssignRoleToTaskDescriptor cmd = new AssignRoleToTaskDescriptor(
-						(TaskDescriptor) element, newList,
-						IActionTypeConstants.ADD_ADDITIONAL_PERFORMER, getConfiguration());
-				actionMgr.execute(cmd);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems3(java.util.List)
-	 */
-	protected void addItems3(List items) {
-		if (!items.isEmpty()) {
-			RoleDescriptor roleDesc = ((TaskDescriptor) element)
-					.getPerformedPrimarilyBy();
-			List elementList = getRoles(((TaskDescriptor) element)
-					.getAdditionallyPerformedBy());
-			if (roleDesc != null)
-				elementList.add(roleDesc.getRole());
-
-			List newList = new ArrayList();
-			for (int i = 0; i < items.size(); i++) {
-				Object obj = items.get(i);
-				if (obj instanceof Role) {
-					Role role = (Role) obj;
-					if (!elementList.contains(role))
-						newList.add(role);
-				}
-			}
-			if (newList.size() > 0) {
-				AssignRoleToTaskDescriptor cmd = new AssignRoleToTaskDescriptor(
-						(TaskDescriptor) element, newList,
-						IActionTypeConstants.ADD_ASSISTED_BY, getConfiguration());
-				actionMgr.execute(cmd);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems1(java.util.List)
-	 */
-	protected void addFromProcessItems1(List items) {
-		if (!items.isEmpty()) {
-			items.removeAll(((TaskDescriptor) element)
-					.getAdditionallyPerformedBy());
-			items.removeAll(((TaskDescriptor) element).getAssistedBy());
-
-			if (items.size() > 0) {
-				actionMgr.doAction(IActionManager.SET, element,
-						UmaPackage.eINSTANCE
-								.getTaskDescriptor_PerformedPrimarilyBy(),
-						items.get(0), -1);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems2(java.util.List)
-	 */
-	protected void addFromProcessItems2(List items) {
-		if (!items.isEmpty()) {
-			items.removeAll(((TaskDescriptor) element).getAssistedBy());
-			items.remove(((TaskDescriptor) element).getPerformedPrimarilyBy());
-
-			actionMgr.doAction(IActionManager.ADD_MANY, element,
-					UmaPackage.eINSTANCE
-							.getTaskDescriptor_AdditionallyPerformedBy(),
-					items, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems3(java.util.List)
-	 */
-	protected void addFromProcessItems3(List items) {
-		if (!items.isEmpty()) {
-			items.removeAll(((TaskDescriptor) element)
-					.getAdditionallyPerformedBy());
-			items.remove(((TaskDescriptor) element).getPerformedPrimarilyBy());
-
-			actionMgr.doAction(IActionManager.ADD_MANY, element,
-					UmaPackage.eINSTANCE.getTaskDescriptor_AssistedBy(), items,
-					-1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems1(java.util.List)
-	 */
-	protected void removeItems1(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items, UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems2(java.util.List)
-	 */
-	protected void removeItems2(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items,
-					UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems3(java.util.List)
-	 */
-	protected void removeItems3(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items, UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements1()
-	 */
-	protected List getExistingElements1() {
-		List list = new ArrayList();
-		RoleDescriptor roleDesc = ((TaskDescriptor) element)
-				.getPerformedPrimarilyBy();
-		if (roleDesc != null)
-			list.add(roleDesc);
-
-		return list;
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements2()
-	 */
-	protected List getExistingElements2() {
-		return ((TaskDescriptor) element).getAdditionallyPerformedBy();
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements3()
-	 */
-	protected List getExistingElements3() {
-		return ((TaskDescriptor) element).getAssistedBy();
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getFilterForDescriptors()
-	 */
-	protected IFilter getFilterForDescriptors() {
-		return new DescriptorProcessFilter(getConfiguration()) {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof Activity) {
-					List list = new ArrayList();
-					getActivitiesInScope(TngAdapterFactory.INSTANCE
-							.getWBS_ComposedAdapterFactory(), element, list);
-					if (list.contains(obj))
-						return true;
-					else
-						return false;
-				}
-				if (obj instanceof RoleDescriptor)
-					return true;
-				return false;
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getProcess()
-	 */
-	protected Process getProcess() {
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				element, ITreeItemContentProvider.class);
-		Object obj = ProcessUtil.getRootProcess(aFactory, adapter, element);
-		return (Process) obj;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorTabName()
-	 */
-	protected String getDescriptorTabName() {
-		return FilterConstants.ROLE_DESCRIPTORS;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorStepSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorStepSection.java
deleted file mode 100644
index 39fac7f..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorStepSection.java
+++ /dev/null
@@ -1,539 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider;
-import org.eclipse.epf.library.edit.IConfigurationApplicator;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The task descriptor - step section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class TaskDescriptorStepSection extends AbstractSection {
-
-	protected ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory());
-
-	private TaskDescriptor element;
-
-	private IActionManager actionMgr;
-
-	private FormToolkit toolkit;
-
-	private Button ctrl_add, ctrl_remove, ctrl_up, ctrl_down;
-
-	private Table ctrl_selected;
-
-	private TableViewer viewer;
-
-	// private Text ctrl_brief_desc;
-	private Image titleImage;
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-
-		super.createControls(parent, tabbedPropertySheetPage);
-		init();
-
-		parent.setLayout(new GridLayout());
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// create steps section
-		createStepSection(parent);
-
-		addListeners();
-
-	}
-
-	/**
-	 * Initialize
-	 *
-	 */
-	private void init() {
-		// get activity object
-		element = (TaskDescriptor) getElement();
-
-		// get toolkit
-		toolkit = getWidgetFactory();
-
-		// get action manager
-		actionMgr = EPFPropertySheetPage.getActionManager();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof TaskDescriptor) {
-				element = (TaskDescriptor) getElement();
-				viewer.refresh();
-
-				// hide/refresh controls
-				updateControls();
-			}
-		} catch (Exception ex) {
-			logger.logError("Error refreshing TaskDescriptor step section" + element, ex);  //$NON-NLS-1$
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-	}
-
-	/**
-	 * Update controls based on editable flag. Controls will be either editable 
-	 * or read-only after updating this.
-	 */
-	public void updateControls() {
-		ctrl_add.setEnabled(editable);
-		if (element.getTask() == null)
-			ctrl_add.setEnabled(false);
-		else {
-			List steps = getSteps();
-			if (steps != null && steps.size() > 0) 
-				ctrl_add.setEnabled(true);
-			else 
-				ctrl_add.setEnabled(false);
-		}
-		
-		IStructuredSelection selection = (IStructuredSelection) viewer
-				.getSelection();
-		if (selection.size() > 0 && editable) {
-			ctrl_remove.setEnabled(editable);
-			ctrl_up.setEnabled(editable);
-			ctrl_down.setEnabled(editable);
-		} else {
-			ctrl_remove.setEnabled(false);
-			ctrl_up.setEnabled(false);
-			ctrl_down.setEnabled(false);
-
-		}
-	}
-
-	/**
-	 * Create Step section on the given composite
-	 * @param composite
-	 */
-	private void createStepSection(Composite composite) {
-		// create step section
-		Section stepSection = FormUI
-				.createSection(
-						toolkit,
-						composite,
-						PropertiesResources.TaskDescriptor_stepInformationTitle, 
-						PropertiesResources.TaskDescriptor_stepInformationDescription); 
-
-		// create step composite
-		Composite stepComposite = FormUI.createComposite(toolkit, stepSection,
-				2, false);
-
-		// create table composite
-		Composite pane1 = FormUI.createComposite(toolkit, stepComposite,
-				GridData.FILL_BOTH);
-		FormUI.createLabel(toolkit, pane1, PropertiesResources.TaskDescriptor_Selected_Steps); 
-
-		ctrl_selected = FormUI.createTable(toolkit, pane1);
-		viewer = new TableViewer(ctrl_selected);
-
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return element.getSelectedSteps().toArray();
-			}
-		};
-
-		viewer.setContentProvider(contentProvider);
-		viewer.setLabelProvider(labelProvider);
-		viewer.setInput(element);
-
-		// create button composite
-		Composite pane2 = FormUI.createComposite(toolkit, stepComposite,
-				GridData.VERTICAL_ALIGN_CENTER
-						| GridData.HORIZONTAL_ALIGN_CENTER);
-
-		// create buttons
-		ctrl_add = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Add);
-		ctrl_add.setEnabled(false);
-		ctrl_remove = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Remove); 
-		ctrl_remove.setEnabled(false);
-		ctrl_up = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Up); 
-		ctrl_down = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Down); 
-
-		if (element.getTask() != null) {
-			List steps = getSteps();
-			if (steps != null && steps.size() > 0) {
-				ctrl_add.setEnabled(true);
-			}
-		}
-		// create brief description
-		// int heightHint = 40;
-		// int horizontalSpan = 2;
-		// Label label = FormUI.createLabel(toolkit, stepComposite,
-		// PropertiesResources.getString("Process.briefDescription"),
-		// heightHint);
-		// ctrl_brief_desc = FormUI.createText(toolkit, stepComposite,
-		// heightHint, heightHint);
-		// ctrl_brief_desc.setEditable(false);
-		//		
-		toolkit.paintBordersFor(stepComposite);
-		toolkit.paintBordersFor(pane1);
-
-	}
-
-	/**
-	 * Add listeners
-	 */
-	private void addListeners() {
-		// Add focus listener on primary tasks list
-		ctrl_selected.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if ((selection.size() > 0) && editable) {
-					ctrl_remove.setEnabled(editable);
-					ctrl_up.setEnabled(editable);
-					ctrl_down.setEnabled(editable);
-				}
-			}
-		});
-
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if ((selection.size() > 0) && editable) {
-					ctrl_remove.setEnabled(true);
-
-					if (viewer.getTable().getSelectionIndex() > 0
-							&& selection.size() == 1) {
-						ctrl_up.setEnabled(true);
-					} else
-						ctrl_up.setEnabled(false);
-
-					if (viewer.getTable().getSelectionIndex() < viewer
-							.getTable().getItemCount() - 1
-							&& selection.size() == 1) {
-						ctrl_down.setEnabled(true);
-					} else
-						ctrl_down.setEnabled(false);
-
-				}
-
-				if (selection.size() == 1) {
-					String desc = ((MethodElement) selection.getFirstElement())
-							.getBriefDescription();
-					if (desc == null) {
-						desc = ""; //$NON-NLS-1$
-					}
-					// ctrl_brief_desc.setText(desc);
-				} else if (selection.size() > 1) {
-					// ctrl_brief_desc.setText(PropertiesResources.getString("Process.MultipleSelection")
-					// + " - " + selection.size());
-				}
-			}
-		});
-
-		ctrl_add.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredContentProvider stepContentProvider = new AdapterFactoryContentProvider(
-						TngAdapterFactory.INSTANCE
-								.getNavigatorView_ComposedAdapterFactory()) {
-					public Object[] getElements(Object object) {
-
-						return getSteps().toArray();
-//						// get all steps
-//						IConfigurationApplicator configApplicator = Providers
-//								.getConfigurationApplicator();
-//						MethodConfiguration config = TngUtil.getOwningProcess(
-//								element).getDefaultContext();
-//						List steps = (List) configApplicator.getReference(
-//								element.getTask(), UmaPackage.eINSTANCE
-//										.getTask_Steps(), config);
-//
-//						// remove already existing steps
-//						steps.removeAll(element.getSelectedSteps());
-//						return steps.toArray();
-					}
-				};
-
-				ILabelProvider stepLabelProvider = new VariabilityElementLabelProvider(
-						TngAdapterFactory.INSTANCE
-								.getNavigatorView_ComposedAdapterFactory()) {
-
-					public boolean isExternal(Object obj) {
-
-						boolean flag = !element.getTask().getPresentation()
-								.getSections().contains(obj);
-						return flag;
-					}
-				};
-
-				ListSelectionDialog dlg = new ListSelectionDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						element.getTask(), stepContentProvider,
-						stepLabelProvider, PropertiesResources.TaskDescriptor_StepDialogMessage); 
-				titleImage = Display.getCurrent().getActiveShell().getImage();
-				ListSelectionDialog.setDefaultImage(titleImage);
-				dlg.setTitle(PropertiesResources.TaskDescriptor_StepDialogTitle);
-				dlg.setBlockOnOpen(true);
-				dlg.open();
-
-				addSteps(dlg.getResult());
-				
-				// enable/disable add button
-				List steps = getSteps();
-				if (steps != null && steps.size() > 0) 
-					ctrl_add.setEnabled(true);
-				else 
-					ctrl_add.setEnabled(false);
-				
-				viewer.refresh();
-			}
-		});
-
-		ctrl_remove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if (selection.size() > 0) {
-					// update the model
-					ArrayList rmItems = new ArrayList();
-					rmItems.addAll(selection.toList());
-					removeSteps(rmItems);
-					viewer.refresh();
-
-					// clear the selection
-					viewer.setSelection(null, true);
-					// ctrl_brief_desc.setText("");
-				}
-				// ctrl_remove.setEnabled(false);
-				
-				// enable/disable add button
-				List steps = getSteps();
-				if (steps != null && steps.size() > 0) 
-					ctrl_add.setEnabled(true);
-				else 
-					ctrl_add.setEnabled(false);
-			}
-		});
-
-		ctrl_up.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				ArrayList steps = new ArrayList();
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if (selection.size() > 0) {
-					ArrayList items = new ArrayList();
-					items.addAll(selection.toList());
-					BasicEList stepList = (BasicEList) element
-							.getSelectedSteps();
-
-					for (Iterator it = items.iterator(); it.hasNext();) {
-						Object object = it.next();
-						int index = stepList.indexOf(object);
-						if (index > 0)
-							stepList.move(index - 1, object);
-
-					}
-					steps.addAll(stepList);
-					// TODO - write a command. 
-					// activate dirty flag
-					actionMgr.doAction(IActionManager.REMOVE_MANY, element,
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_SelectedSteps(),
-							stepList, -1);
-					actionMgr.doAction(IActionManager.ADD_MANY, element,
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_SelectedSteps(), steps,
-							-1);
-
-					viewer.refresh();
-				}
-
-				if (viewer.getTable().getSelectionIndex() > 0 && editable)
-					ctrl_up.setEnabled(true);
-				else
-					ctrl_up.setEnabled(false);
-
-				if (viewer.getTable().getSelectionIndex() < viewer.getTable()
-						.getItemCount() - 1
-						&& editable)
-					ctrl_down.setEnabled(true);
-				else
-					ctrl_down.setEnabled(false);
-			}
-
-		});
-
-		ctrl_down.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				ArrayList steps = new ArrayList();
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if (selection.size() > 0) {
-					ArrayList items = new ArrayList();
-					items.addAll(selection.toList());
-					BasicEList stepList = (BasicEList) element
-							.getSelectedSteps();
-
-					for (Iterator it = items.iterator(); it.hasNext();) {
-						Object object = it.next();
-						int index = stepList.indexOf(object);
-
-						if (index < stepList.size() - 1)
-							stepList.move(index + items.size(), object);
-
-					}
-					steps.addAll(stepList);
-
-					// TODO - write a cmmand. Hacking it for now to activate
-					// dirty flag
-					actionMgr.doAction(IActionManager.REMOVE_MANY, element,
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_SelectedSteps(),
-							stepList, -1);
-					actionMgr.doAction(IActionManager.ADD_MANY, element,
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_SelectedSteps(), steps,
-							-1);
-
-					viewer.refresh();
-				}
-
-				if (viewer.getTable().getSelectionIndex() > 0 && editable)
-					ctrl_up.setEnabled(true);
-				else
-					ctrl_up.setEnabled(false);
-
-				if (viewer.getTable().getSelectionIndex() < viewer.getTable()
-						.getItemCount() - 1
-						&& editable)
-					ctrl_down.setEnabled(true);
-				else
-					ctrl_down.setEnabled(false);
-
-			}
-
-		});
-	}
-
-	/**
-	 * Assign Steps to task descriptor
-	 * @param addItems
-	 * 			List of steps
-	 */
-	private void addSteps(Object[] addItems) {
-		// update the model
-		if (addItems != null) {
-			for (int i = 0; i < addItems.length; i++) {
-				org.eclipse.epf.uma.Section item = (org.eclipse.epf.uma.Section) addItems[i];
-
-				actionMgr.doAction(IActionManager.ADD, element,
-						UmaPackage.eINSTANCE.getTaskDescriptor_SelectedSteps(),
-						item, -1);
-			}
-		}
-	}
-
-	/**
-	 * Remove assigned steps for the task descriptor
-	 * @param rmItems
-	 * 			List of steps 
-	 */
-	private void removeSteps(List rmItems) {
-		// update the model
-		if (!rmItems.isEmpty()) {
-			for (Iterator it = rmItems.iterator(); it.hasNext();) {
-				org.eclipse.epf.uma.Section item = (org.eclipse.epf.uma.Section) it.next();
-
-				actionMgr.doAction(IActionManager.REMOVE, element,
-						UmaPackage.eINSTANCE.getTaskDescriptor_SelectedSteps(),
-						item, -1);
-			}
-		}
-	}
-	
-	/**
-	 * Get steps that could be assigned to this task descriptor
-	 * @return
-	 */
-	private List getSteps(){
-		//	get all steps
-		IConfigurationApplicator configApplicator = Providers
-				.getConfigurationApplicator();
-		MethodConfiguration config = TngUtil.getOwningProcess(
-				element).getDefaultContext();
-		List steps = (List) configApplicator.getReference(
-				element.getTask(), UmaPackage.eINSTANCE
-						.getTask_Steps(), config);
-
-		// remove already existing steps
-		steps.removeAll(element.getSelectedSteps());
-		return steps;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorWorkProductSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorWorkProductSection.java
deleted file mode 100644
index c8c1b1c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorWorkProductSection.java
+++ /dev/null
@@ -1,444 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.filters.DescriptorProcessFilter;
-import org.eclipse.epf.authoring.ui.filters.ProcessWorkProductFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.command.AssignWPToTaskDescriptor;
-import org.eclipse.epf.library.edit.process.command.IActionTypeConstants;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The task descriptor - work product section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class TaskDescriptorWorkProductSection extends RelationSection {
-	private IFilter filter = null;
-
-	/**
-	 * Get process work product filter
-	 */
-	public IFilter getFilter() {
-		if (filter == null) {
-			filter = new ProcessWorkProductFilter(getConfiguration(), null,
-					FilterConstants.WORKPRODUCTS);
-		}
-		return filter;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-
-		super.createControls(parent, tabbedPropertySheetPage);
-
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider1()
-	 */
-	protected void initContentProvider1() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(
-						((TaskDescriptor) element).getMandatoryInput())
-						.toArray();
-			}
-		};
-		tableViewer1.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider2()
-	 */
-	protected void initContentProvider2() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(
-						((TaskDescriptor) element).getOptionalInput())
-						.toArray();
-			}
-		};
-		tableViewer2.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider3()
-	 */
-	protected void initContentProvider3() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(
-						((TaskDescriptor) element).getExternalInput())
-						.toArray();
-			}
-		};
-		tableViewer3.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider4()
-	 */
-	protected void initContentProvider4() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return getFilteredList(((TaskDescriptor) element).getOutput())
-						.toArray();
-			}
-		};
-		tableViewer4.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#init()
-	 */
-	protected void init() {
-		super.init();
-
-		labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory());
-
-		int numOfTables = 4;
-		setTabData(PropertiesResources.TaskDescriptor_WorkProducts_SectionTitle,
-				PropertiesResources.TaskDescriptor_WorkProducts_SectionDescription,
-				PropertiesResources.TaskDescriptor_WorkProducts_Table1,
-				PropertiesResources.TaskDescriptor_WorkProducts_Table2,
-				PropertiesResources.TaskDescriptor_WorkProducts_Table3,
-				PropertiesResources.TaskDescriptor_WorkProducts_Table4,
-				FilterConstants.WORKPRODUCTS);
-		
-		boolean[] changesAllowed = { true, true, true, true };
-		setTableData(numOfTables, changesAllowed);
-
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#refresh()
-	 */
-	public void refresh() {
-		if (getElement() instanceof TaskDescriptor) {
-			element = (TaskDescriptor) getElement();
-		}
-		super.refresh();
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorsFromProcess()
-	 */
-	protected List getDescriptorsFromProcess() {
-		List items = new ArrayList();
-		return ProcessUtil.getElementsInScope(getAdapterFactory(), element,
-				WorkProductDescriptor.class, items);
-	}
-
-	private List getWorkProducts(List items) {
-		List wpList = new ArrayList();
-		if (!items.isEmpty()) {
-			for (int i = 0; i < items.size(); i++) {
-				wpList.add(((WorkProductDescriptor) items.get(i))
-						.getWorkProduct());
-			}
-		}
-
-		return wpList;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems1(java.util.List)
-	 */
-	protected void addItems1(List items) {
-		if (!items.isEmpty()) {
-			List elementList = getWorkProducts(((TaskDescriptor) element)
-					.getOptionalInput());
-			elementList.addAll(getWorkProducts(((TaskDescriptor) element)
-					.getExternalInput()));
-			List newList = new ArrayList();
-			for (int i = 0; i < items.size(); i++) {
-				Object obj = items.get(i);
-				if (obj instanceof WorkProduct) {
-					WorkProduct wp = (WorkProduct) obj;
-					if (!elementList.contains(wp))
-						newList.add(wp);
-				}
-			}
-			if (newList.size() > 0) {
-				AssignWPToTaskDescriptor cmd = new AssignWPToTaskDescriptor(
-						(TaskDescriptor) element, newList,
-						IActionTypeConstants.ADD_MANDATORY_INPUT,
-						getConfiguration());
-				actionMgr.execute(cmd);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems2(java.util.List)
-	 */
-	protected void addItems2(List items) {
-		if (!items.isEmpty()) {
-			List elementList = getWorkProducts(((TaskDescriptor) element)
-					.getMandatoryInput());
-			elementList.addAll(getWorkProducts(((TaskDescriptor) element)
-					.getExternalInput()));
-
-			List newList = new ArrayList();
-			for (int i = 0; i < items.size(); i++) {
-				Object obj = items.get(i);
-				if (obj instanceof WorkProduct) {
-					WorkProduct wp = (WorkProduct) obj;
-					if (!elementList.contains(wp))
-						newList.add(wp);
-				}
-			}
-
-			if (newList.size() > 0) {
-				AssignWPToTaskDescriptor cmd = new AssignWPToTaskDescriptor(
-						(TaskDescriptor) element, newList,
-						IActionTypeConstants.ADD_OPTIONAL_INPUT,
-						getConfiguration());
-				actionMgr.execute(cmd);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems3(java.util.List)
-	 */
-	protected void addItems3(List items) {
-		if (!items.isEmpty()) {
-			List elementList = getWorkProducts(((TaskDescriptor) element)
-					.getMandatoryInput());
-			elementList.addAll(getWorkProducts(((TaskDescriptor) element)
-					.getOptionalInput()));
-
-			List newList = new ArrayList();
-			for (int i = 0; i < items.size(); i++) {
-				Object obj = items.get(i);
-				if (obj instanceof WorkProduct) {
-					WorkProduct wp = (WorkProduct) obj;
-					if (!elementList.contains(wp))
-						newList.add(wp);
-				}
-			}
-			if (newList.size() > 0) {
-				AssignWPToTaskDescriptor cmd = new AssignWPToTaskDescriptor(
-						(TaskDescriptor) element, newList,
-						IActionTypeConstants.ADD_EXTERNAL_INPUT,
-						getConfiguration());
-				actionMgr.execute(cmd);
-			}
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems4(java.util.List)
-	 */
-	protected void addItems4(List items) {
-		if (!items.isEmpty()) {
-			AssignWPToTaskDescriptor cmd = new AssignWPToTaskDescriptor(
-					(TaskDescriptor) element, items,
-					IActionTypeConstants.ADD_OUTPUT, getConfiguration());
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems1(java.util.List)
-	 */
-	protected void removeItems1(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items, UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems2(java.util.List)
-	 */
-	protected void removeItems2(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items, UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems3(java.util.List)
-	 */
-	protected void removeItems3(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items, UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems4(java.util.List)
-	 */
-	protected void removeItems4(List items) {
-		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
-					items, UmaPackage.TASK_DESCRIPTOR__OUTPUT);
-			actionMgr.execute(cmd);
-		}
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements1()
-	 */
-	protected List getExistingElements1() {
-		return ((TaskDescriptor) element).getMandatoryInput();
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements2()
-	 */
-	protected List getExistingElements2() {
-		return ((TaskDescriptor) element).getOptionalInput();
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements3()
-	 */
-	protected List getExistingElements3() {
-		return ((TaskDescriptor) element).getExternalInput();
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements4()
-	 */
-	protected List getExistingElements4() {
-		return ((TaskDescriptor) element).getOutput();
-	};
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getProcess()
-	 */
-	protected Process getProcess() {
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				element, ITreeItemContentProvider.class);
-		Object obj = ProcessUtil.getRootProcess(aFactory, adapter, element);
-		return (Process) obj;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getFilterForDescriptors()
-	 */
-	protected IFilter getFilterForDescriptors() {
-		return new DescriptorProcessFilter(getConfiguration()) {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof Activity) {
-					List list1 = new ArrayList();
-					getActivitiesInScope(TngAdapterFactory.INSTANCE
-							.getWBS_ComposedAdapterFactory(), element, list1);
-					if (list1.contains(obj))
-						return true;
-					else
-						return false;
-				}
-				if (obj instanceof WorkProductDescriptor)
-					return true;
-				return false;
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems1(java.util.List)
-	 */
-	protected void addFromProcessItems1(List items) {
-		if (!items.isEmpty()) {
-			items.removeAll(((TaskDescriptor) element).getOptionalInput());
-			items.removeAll(((TaskDescriptor) element).getExternalInput());
-			actionMgr.doAction(IActionManager.ADD_MANY, element,
-					UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput(),
-					items, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems2(java.util.List)
-	 */
-	protected void addFromProcessItems2(List items) {
-		if (!items.isEmpty()) {
-			items.removeAll(((TaskDescriptor) element).getMandatoryInput());
-			items.removeAll(((TaskDescriptor) element).getExternalInput());
-			actionMgr.doAction(IActionManager.ADD_MANY, element,
-					UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput(),
-					items, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems3(java.util.List)
-	 */
-	protected void addFromProcessItems3(List items) {
-		if (!items.isEmpty()) {
-			items.removeAll(((TaskDescriptor) element).getMandatoryInput());
-			items.removeAll(((TaskDescriptor) element).getOptionalInput());
-			actionMgr.doAction(IActionManager.ADD_MANY, element,
-					UmaPackage.eINSTANCE.getTaskDescriptor_ExternalInput(),
-					items, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems4(java.util.List)
-	 */
-	protected void addFromProcessItems4(List items) {
-		if (!items.isEmpty()) {
-			actionMgr.doAction(IActionManager.ADD_MANY, element,
-					UmaPackage.eINSTANCE.getTaskDescriptor_Output(), items, -1);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorTabName()
-	 */
-	protected String getDescriptorTabName() {
-		return FilterConstants.WORK_PRODUCT_DESCRIPTORS;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TeamProfileRoleSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TeamProfileRoleSection.java
deleted file mode 100644
index 6256790..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TeamProfileRoleSection.java
+++ /dev/null
@@ -1,568 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.emf.edit.provider.WrapperItemProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.filters.DescriptorProcessFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.CompositeRoleWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.command.AddRoleToTeamCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The team profile - role/composite role section
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class TeamProfileRoleSection extends OBSRelationSection {
-
-	List roleList = null;
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#initContentProvider()
-	 */
-	protected void initContentProvider() {
-		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List newList = new ArrayList();
-				List teamRoles = ((TeamProfile) element).getTeamRoles();
-				for (Iterator itor = teamRoles.iterator(); itor.hasNext();) {
-					RoleDescriptor roleDesc = (RoleDescriptor) itor.next();
-					if ((roleDesc.getSuperActivities() == null)
-							|| (roleDesc.getSuperActivities() == null))
-						newList.add(roleDesc);
-				}
-
-				// return ((TeamProfile)element).getTeamRoles().toArray();
-				return getFilteredList(newList).toArray();
-			}
-		};
-
-		viewer.setContentProvider(contentProvider);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#init()
-	 */
-	protected void init() {
-		super.init();
-		element = (TeamProfile) element;
-
-		setTabData(PropertiesResources.TeamProfile_Role_SectionTitle, 
-				PropertiesResources.TeamProfile_Role_SectionDescription,
-				PropertiesResources.TeamProfile_Role_Table1); 
-		showAddFromProcessButton = true;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof TeamProfile) {
-				super.refresh();
-				element = (TeamProfile) getElement();
-				viewer.refresh();
-			}
-		} catch (Exception ex) {
-			logger.logError("Error refreshing Team Profile role section ", ex); //$NON-NLS-1$
-		}
-	}
-
-	private boolean isPartOfTeam(Role role, TeamProfile team) {
-		List teamRoles = team.getTeamRoles();
-		List roles = new ArrayList();
-		for (Iterator itor = teamRoles.iterator(); itor.hasNext();) {
-			RoleDescriptor roleDesc = (RoleDescriptor) itor.next();
-			roles.add(roleDesc.getRole());
-		}
-
-		if (roles.contains(role))
-			return true;
-
-		return false;
-	}
-
-	private void add(List items) {
-		if (items != null) {
-			List roles = new ArrayList();
-
-			for (Iterator itor = items.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if ((obj instanceof Role)
-						&& (!isPartOfTeam((Role) obj, (TeamProfile) element))) {
-					roles.add((Role) obj);
-				}
-			}
-
-			if (!roles.isEmpty()) {
-				AddRoleToTeamCommand cmd = new AddRoleToTeamCommand(
-						(TeamProfile) element, roles);
-				actionMgr.execute(cmd);
-			}
-		}
-	}
-
-	private void addFromProcess(List items) {
-		// update the model
-		if (items != null) {
-			for (Iterator itor = items.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (obj instanceof CompositeRole) {
-					CompositeRole compRole = ProcessUtil
-							.createCompositeRole((CompositeRole) obj);
-					actionMgr.doAction(IActionManager.ADD, element,
-							UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-							compRole, -1);
-					actionMgr.doAction(IActionManager.ADD, element,
-							UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-							obj, -1);
-				} else if (obj instanceof RoleDescriptor) {
-					Role role = ((RoleDescriptor) obj).getRole();
-					if (role != null) {
-						if (!isPartOfTeam(role, (TeamProfile) element)) {
-							RoleDescriptor roleDesc = ProcessUtil
-									.createRoleDescriptor(role);
-							actionMgr.doAction(IActionManager.ADD, element,
-									UmaPackage.eINSTANCE
-											.getTeamProfile_TeamRoles(),
-									roleDesc, -1);
-						}
-						actionMgr
-								.doAction(IActionManager.ADD, element,
-										UmaPackage.eINSTANCE
-												.getTeamProfile_TeamRoles(),
-										obj, -1);
-
-						// fire Notification
-						AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-								.getOBS_ComposedAdapterFactory();
-						Activity parent = (Activity) getParentActivity(element);
-						ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-								.adapt(parent, ITreeItemContentProvider.class);
-						Collection children = adapter.getChildren(parent);
-
-						fireNotification(children, (RoleDescriptor) obj);
-
-					} else {
-						MessageFormat mf = new MessageFormat(
-								PropertiesResources.Process_TeamAssignError); 
-						Object[] args = { ((RoleDescriptor) obj).getName(),
-								((TeamProfile) element).getName() };
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayInfo(
-										PropertiesResources.Process_AssignmentInfoTitle, mf.format(args)); 
-					}
-				}
-			}
-		}
-	}
-
-	private void fireNotification(Collection children, RoleDescriptor roleDesc) {
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (obj instanceof Activity) {
-				AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-						.getOBS_ComposedAdapterFactory();
-				ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-						.adapt((Activity) obj, ITreeItemContentProvider.class);
-				children = adapter.getChildren((Activity) obj);
-				fireNotification(children, roleDesc);
-			}
-			if (obj instanceof ActivityWrapperItemProvider) {
-				Object o1 = ((WrapperItemProvider) obj).getValue();
-				ActivityWrapperItemProvider activityAdapter = (ActivityWrapperItemProvider) obj;
-				fireNotification(activityAdapter.getChildren(o1), roleDesc);
-			}
-			if (obj instanceof RoleDescriptorWrapperItemProvider) {
-				RoleDescriptorWrapperItemProvider provider = (RoleDescriptorWrapperItemProvider) obj;
-				if (((RoleDescriptor) provider.getValue()).getRole().equals(
-						roleDesc.getRole())) {
-					provider.fireNotifyChanged(new ViewerNotification(
-							new NotificationImpl(Notification.SET, provider,
-									provider), provider, false, true));
-				}
-			}
-		}
-	}
-	
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#remove(java.util.ArrayList)
-	 */
-	protected void remove(ArrayList rmItems) {
-		// update the model
-		if (!rmItems.isEmpty()) {
-			for (Iterator itor = rmItems.iterator(); itor.hasNext();) {
-				Object obj = (Object) itor.next();
-				if (obj instanceof RoleDescriptor) {
-					actionMgr.doAction(IActionManager.REMOVE, element,
-							UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-							(RoleDescriptor) obj, -1);
-				}
-
-				// find matching roleDescriptor in team roles
-				List roleDescList = findRoleDescriptor((Object) obj);
-				for (Iterator roleDescItor = roleDescList.iterator(); roleDescItor
-						.hasNext();) {
-					RoleDescriptor roleDesc = (RoleDescriptor) roleDescItor
-							.next();
-				actionMgr.doAction(IActionManager.REMOVE, element,
-						UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
-						roleDesc, -1);
-				}
-			}
-		}
-	}
-
-	private List findRoleDescriptor(Object obj) {
-		List teamRoles = ((TeamProfile) element).getTeamRoles();
-		List roleDescList = new ArrayList();
-		for (Iterator itor = teamRoles.iterator(); itor.hasNext();) {
-			Object itorObject = itor.next();
-			if (obj instanceof CompositeRole) {
-				if (itorObject instanceof CompositeRole) {
-					List firstObjectAggRoles = ((CompositeRole) obj)
-							.getAggregatedRoles();
-					List secondObjectAggRoles = ((CompositeRole) itorObject)
-							.getAggregatedRoles();
-					if (firstObjectAggRoles.equals(secondObjectAggRoles)) {
-						roleDescList.add(itorObject);
-					}
-				}
-			} else if (obj instanceof RoleDescriptor) {
-				if ((itorObject instanceof RoleDescriptor)
-						&& (!(itorObject instanceof CompositeRole))) {
-					Object objRole = ((RoleDescriptor) obj).getRole();
-					Object itorObjRole = ((RoleDescriptor) itorObject)
-							.getRole();
-					if (objRole.equals(itorObjRole)) {
-						roleDescList.add(itorObject);
-					}
-				}
-			}
-		}
-
-		return roleDescList;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#openAddDialog()
-	 */
-	protected void openAddDialog() {
-		List existingElements = ProcessUtil
-				.getAssociatedElementList(((TeamProfile) element)
-						.getTeamRoles());
-		ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(), getFilter(), element,
-				FilterConstants.ROLE_DESCRIPTORS, existingElements);
-		fd.setBlockOnOpen(true);
-		fd.setTitle(FilterConstants.ROLES);
-		String[] str = new String[]{FilterConstants.ROLES};
-		fd.setTypes(str);
-		fd.open();
-		add(fd.getSelectedItems());
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#openAddFromProcessDialog()
-	 */
-	protected void openAddFromProcessDialog() {
-		List existingElements = ((TeamProfile) element).getTeamRoles();
-		Process process = (Process) getProcess(element);
-		IFilter descriptorFilter = getDescriptorFilter();
-
-		if (descriptorFilter != null && process != null) {
-			ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-					.getWorkbench().getActiveWorkbenchWindow().getShell(),
-					descriptorFilter, process,
-					FilterConstants.ROLE_DESCRIPTORS, existingElements);
-			fd.setBlockOnOpen(true);
-			fd.setTitle(FilterConstants.ROLE_DESCRIPTORS);
-			fd.open();
-			addFromProcess(fd.getSelectedItems());
-		}
-	}
-
-	/**
-	 * Get parent Find parent until it's activity.
-	 * 
-	 * @param element
-	 * @return
-	 * 			Process
-	 */
-	protected Object getProcess(BreakdownElement element) {
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				element, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(element);
-		if (parent instanceof Process) {
-			return parent;
-
-		} else {
-			return getProcess((BreakdownElement) parent);
-		}
-	}
-
-	/**
-	 * Get descriptor filter
-	 */
-	protected IFilter getDescriptorFilter() {
-		return new DescriptorProcessFilter(getConfiguration()) {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof Activity) {
-					AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-							.getOBS_ComposedAdapterFactory();
-					List parentsList = new ArrayList();
-					getActivitiesInScope(adapterFactory, element, parentsList);
-					if (parentsList.contains(obj))
-						return true;
-					if (obj.equals(getParentActivity(element)))
-						return true;
-					List childList = ((Activity) obj).getBreakdownElements();
-					if (childList.contains(getParentActivity(element)))
-						return true;
-					List list = getAllowableActivities();
-					if (list.contains(obj)){
-						return true;
-//						List belements = ((Activity)obj).getBreakdownElements();
-//						if(!belements.isEmpty()){
-//							if(containsType(belements, RoleDescriptor.class,
-//											getHelper()))
-//							return true;
-//						}
-					}
-				}
-				if (obj instanceof RoleDescriptor) {
-					Object parentActivity = getParentActivity((BreakdownElement) obj);
-					Object parent = getParentActivity(element);
-					if (parent.equals(parentActivity))
-						return true;
-
-					if (parentActivity instanceof Activity) {
-						if (getBaseActivities((Activity) parent).contains(
-								parentActivity))
-							return true;
-						if (getAllowableActivities().contains(parentActivity))
-							return true;
-					}
-				}
-				if (obj instanceof RoleDescriptorWrapperItemProvider
-						|| obj instanceof CompositeRoleWrapperItemProvider) {
-					Object object = ((BreakdownElementWrapperItemProvider) obj)
-							.getParent(obj);
-					if (getParentActivity(element).equals(object))
-						return true;
-					if (object instanceof Activity
-							|| object instanceof ActivityWrapperItemProvider) {
-						if (object instanceof ActivityWrapperItemProvider) {
-							object = ((ActivityWrapperItemProvider) object)
-									.getValue();
-						}
-						if (getAllowableActivities().contains(object))
-							return true;
-					}
-				}
-				if (obj instanceof ActivityWrapperItemProvider) {
-					Object parent = ((BreakdownElementWrapperItemProvider) obj)
-							.getParent(obj);
-					if (getParentActivity(element).equals(parent))
-						return true;
-					Object object = ((BreakdownElementWrapperItemProvider) obj)
-							.getValue();
-					if (object instanceof Activity) {
-						List list = getAllowableActivities();
-						if (list.contains(object)){
-							return true;
-//							List belements = ((Activity)obj).getBreakdownElements();
-//							if(!belements.isEmpty()){
-//								if(containsType(belements, RoleDescriptor.class,getHelper()))
-//								return true;
-//							}
-						}
-					}
-				}
-				return false;
-			}
-		};
-	}
-	
-	
-	private List getBaseActivities(Activity activity) {
-		List list = new ArrayList();
-		while (!activity.getVariabilityType()
-				.equals(VariabilityType.NA_LITERAL)) {
-			VariabilityElement ve = activity.getVariabilityBasedOnElement();
-
-			if ((ve != null) && (ve instanceof Activity)) {
-
-				list.add(ve);
-
-				activity = (Activity) ve;
-			} else {
-				break;
-			}
-		}
-		return list;
-	}
-
-	/**
-	 * Get parent activity for breakdownelement
-	 * 
-	 * @param brElement
-	 * @return
-	 * 			Parent activity
-	 */
-	private Object getParentActivity(BreakdownElement brElement) {
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(brElement, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(brElement);
-		while (!(parent instanceof Activity)) {
-			brElement = (BreakdownElement) parent;
-			adapter = (ItemProviderAdapter) adapterFactory.adapt(brElement,
-					ITreeItemContentProvider.class);
-			parent = adapter.getParent(brElement);
-		}
-
-		return parent;
-	}
-
-	/**
-	 * Get all children of the activity parent recursively.
-	 * 
-	 * @param adapterFactory
-	 * @param parent
-	 * @param activityList
-	 */
-	private void getChildActivitiesInScope(AdapterFactory adapterFactory,
-			Activity parent, List activityList) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(parent, ITreeItemContentProvider.class);
-
-		Object o = adapter.getChildren(parent);
-		if (o instanceof List) {
-			List children = (List) o;
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (obj instanceof Activity) {
-				activityList.add(obj);
-				getChildActivitiesInScope(adapterFactory, (Activity) obj,
-						activityList);
-				}
-				if (obj instanceof ActivityWrapperItemProvider) {
-					Object o1 = ((WrapperItemProvider) obj).getValue();
-					activityList.add(o1);
-					getChildActivitiesInScope(adapterFactory, (Activity) o1,
-							activityList);
-				}
-			}
-		}
-	}
-
-	private boolean containsType(List list, Class class1, FilterHelper helper) {
-		for(Iterator iterator = list.iterator(); iterator.hasNext();){
-			Object obj = iterator.next();
-			if(obj instanceof MethodElement 
-					&& class1.isInstance(obj)
-					&& helper.matcher(obj)) 
-				return true;
-			if(obj instanceof Activity){
-				return containsType(((Activity)obj).getBreakdownElements(),
-						class1, helper);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Get all activities in scope
-	 * 
-	 * @return
-	 * 		List of activities in scope
-	 */
-	private List getAllowableActivities() {
-		List list = new ArrayList();
-		// parent activity
-		Object object = getParentActivity(element);
-		if (object instanceof Activity) {
-			AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-					.getOBS_ComposedAdapterFactory();
-			// get all child activities in scope
-			getChildActivitiesInScope(adapterFactory, (Activity) object, list);
-		}
-		// get base activities for all activities in scope
-		HashSet baseActivties = new HashSet();
-		for (Iterator itor = list.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (obj instanceof Activity) {
-				baseActivties.addAll(getBaseActivities((Activity) obj));
-			}
-		}
-
-		// return complete list of child activities and it's base activities
-		list.addAll(baseActivties);
-		return list;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/WorkBreakdownElementGeneralSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/WorkBreakdownElementGeneralSection.java
deleted file mode 100644
index 375664a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/WorkBreakdownElementGeneralSection.java
+++ /dev/null
@@ -1,1178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.WrapperItemProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * The general tab section for WorkBreakdownElement
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class WorkBreakdownElementGeneralSection extends
-		BreakdownElementGeneralSection {
-	protected WorkBreakdownElement element;
-
-	protected Button eventDrivenButton, ongoingButton, repeatableButton;
-
-	// protected Text predecessorText;
-	protected Button addButton, editButton, removeButton;
-
-	// private SelectionListener eventDrivenButtonSelectionListener;
-	// private SelectionListener ongoingButtonSelectionListener;
-	// private SelectionListener repeatableButtonSelectionListener;
-
-	// private Listener predecessorsListener;
-
-	// private ComposedAdapterFactory adapterFactory;
-
-	private TableViewer viewer;
-
-	// private Table table;
-	private TextCellEditor textCellEditor;
-
-	private ValidatingTextCellEditor idCellEditor;
-
-	private ComboBoxCellEditor comboBoxCellEditor;
-
-	// predecessor map list
-	private List predMapList = new ArrayList();
-
-	private class ValidatingTextCellEditor extends TextCellEditor {
-		protected Object lastInvalidElement;
-
-		private int columnIndex;
-
-		/**
-		 * @param parent
-		 */
-		public ValidatingTextCellEditor(Composite parent) {
-			super(parent);
-		}
-
-		void setColumnIndex(int columnIndex) {
-			this.columnIndex = columnIndex;
-		}
-
-		public int getColumnIndex() {
-			return columnIndex;
-		}
-
-		public Object getLastInvalidElement() {
-			return lastInvalidElement;
-		}
-
-		String isValid(String txt) {
-			IStructuredSelection selection = (IStructuredSelection) viewer
-					.getSelection();
-			if (selection.size() == 1) {
-				Object e = selection.getFirstElement();
-				String msg = isValid(e, txt);
-				if (msg != null) {
-					lastInvalidElement = e;
-				} else {
-					lastInvalidElement = null;
-				}
-				return msg;
-			}
-			return null;
-		}
-
-		protected String isValid(Object e, String txt) {
-			return null;
-		}
-	}
-
-	/** Dependency Literals * */
-	private static final String FINISH_TO_START = PropertiesResources.WorkOrderType_FINISH_TO_START; 
-
-	private static final String FINISH_TO_FINISH = PropertiesResources.WorkOrderType_FINISH_TO_FINISH; 
-
-	private static final String START_TO_START = PropertiesResources.WorkOrderType_START_TO_START; 
-
-	private static final String START_TO_FINISH = PropertiesResources.WorkOrderType_START_TO_FINISH; 
-
-	/** Column ids * */
-	private static final String COL_ID = IBSItemProvider.COL_ID;
-
-	private static final String COL_PRESENTATION_NAME = IBSItemProvider.COL_PRESENTATION_NAME;
-
-	private static final String COL_DEPENDENCY = "dependency"; //$NON-NLS-1$
-
-	/** Column descriptor constants */
-	public static final ColumnDescriptor COL_DESC_ID = new ColumnDescriptor(
-			COL_ID,
-			PropertiesResources.WorkBreakdownElement_Dependency_COL_ID_TEXT, 0, 100, true, ColumnDescriptor.CELL_EDITOR_TYPE_TEXT, SWT.CENTER); 
-
-	public static final ColumnDescriptor COL_DESC_PRESENTATION_NAME = new ColumnDescriptor(
-			COL_PRESENTATION_NAME,
-			PropertiesResources.WorkBreakdownElement_Dependency_COL_PRESENTATION_NAME_TEXT, 1, 250, true, ColumnDescriptor.CELL_EDITOR_TYPE_NONE); 
-
-	public static final ColumnDescriptor COL_DESC_DEPENDENCY = new ColumnDescriptor(
-			COL_DEPENDENCY,
-			PropertiesResources.WorkBreakdownElement_Dependency_COL_DEPENDENCY_TEXT, 2, 100, true, ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN); 
-
-	ColumnDescriptor[] columnDescriptors = new ColumnDescriptor[] {
-			COL_DESC_ID, COL_DESC_PRESENTATION_NAME, COL_DESC_DEPENDENCY };
-
-	private static class CellEditorValidator implements ICellEditorValidator {
-
-		private ValidatingTextCellEditor cellEditor;
-
-		/**
-		 * 
-		 */
-		public CellEditorValidator(ValidatingTextCellEditor cellEditor) {
-			this.cellEditor = cellEditor;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ICellEditorValidator#isValid(java.lang.Object)
-		 */
-		public String isValid(Object value) {
-			return cellEditor.isValid((String) value);
-		}
-
-	}
-
-	private class ValidatingDeactivateListener implements Listener {
-		private ValidatingTextCellEditor cellEditor;
-
-		ValidatingDeactivateListener(ValidatingTextCellEditor cellEditor) {
-			this.cellEditor = cellEditor;
-		}
-
-		public void handleEvent(Event e) {
-			Display.getCurrent().asyncExec(new Runnable() {
-				public void run() {
-					// System.out.println("ValidatDeactivatee::run");
-					if (cellEditor.getLastInvalidElement() != null) {
-						String message = cellEditor.getErrorMessage();
-						String title = getEditor().getTitle();
-						String problem = PropertiesResources.ProcessEditorFormProperties_textEditCell_problem_msg; 
-						MsgDialog dialog = AuthoringUIPlugin.getDefault()
-								.getMsgDialog();
-						dialog.displayError(title, problem, message); 
-						viewer.editElement(cellEditor.getLastInvalidElement(),
-								cellEditor.getColumnIndex());
-					}
-				}
-
-			});
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#init()
-	 */
-	protected void init() {
-		super.init();
-
-		// get workbreakdownelement object
-		element = (WorkBreakdownElement) getElement();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#createGeneralSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createGeneralSection(Composite composite) {
-		super.createGeneralSection(composite);
-
-		// Event Driven
-		eventDrivenButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		eventDrivenButton.setText(PropertiesResources.WorkBreakdownElement_EventDriven); 
-
-		// Ongoing
-		ongoingButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				1);
-		ongoingButton.setText(PropertiesResources.WorkBreakdownElement_Ongoing); 
-
-		// repeatable
-		repeatableButton = FormUI.createCheckButton(toolkit, checkBoxComposite,
-				2);
-		repeatableButton.setText(PropertiesResources.WorkBreakdownElement_Repeatable); 
-
-		// predecessors
-		// FormUI.createLabel(toolkit, generalComposite,
-		// PropertiesResources.getString("WorkBreakdownElement.Predecessors"));
-		// predecessorText = FormUI.createText(toolkit, generalComposite,
-		// SWT.DEFAULT, horizontalSpan);
-		// predecessorText.setText(getPredecessorsList());
-
-		// depenency type
-
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.WorkBreakdownElement_Dependency); 
-
-		try {
-			// create viewer
-			createViewer(generalComposite, 2);
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error creating viewer for workbreakdown element general section: ", ex); //$NON-NLS-1$
-		}
-
-		// create button pane
-		Composite buttonPane = toolkit.createComposite(generalComposite);
-		buttonPane.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		buttonPane.setLayout(new GridLayout());
-
-		FormUI.createLabel(toolkit, buttonPane, ""); //$NON-NLS-1$
-		addButton = FormUI.createButton(toolkit, buttonPane,
-				PropertiesResources.WorkBreakdownElement_Dependency_Add); 
-		editButton = FormUI.createButton(toolkit, buttonPane,
-				PropertiesResources.WorkBreakdownElement_Dependency_Edit); 
-		removeButton = FormUI.createButton(toolkit, buttonPane,
-				PropertiesResources.WorkBreakdownElement_Dependency_Remove); 
-		editButton.setEnabled(false);
-		removeButton.setEnabled(false);
-	}
-
-	protected void addListeners() {
-		super.addListeners();
-
-		eventDrivenButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				element = (WorkBreakdownElement) getElement();
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						element, UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsEventDriven(),
-						Boolean.valueOf(eventDrivenButton.getSelection()), -1);
-				if (!status)
-					eventDrivenButton.setSelection(element.getIsEventDriven()
-							.booleanValue());
-
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		ongoingButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				element = (WorkBreakdownElement) getElement();
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						element, UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsOngoing(), Boolean
-								.valueOf(ongoingButton.getSelection()), -1);
-				if (!status)
-					ongoingButton.setSelection(element.getIsOngoing()
-							.booleanValue());
-
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		repeatableButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				element = (WorkBreakdownElement) getElement();
-				boolean status = actionMgr.doAction(IActionManager.SET,
-						element, UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsRepeatable(),
-						Boolean.valueOf(repeatableButton.getSelection()), -1);
-				if (!status)
-					repeatableButton.setSelection(element.getIsRepeatable()
-							.booleanValue());
-
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		addButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				// List predList = element.getLinkToPredecessor();
-				WorkOrder o = UmaFactory.eINSTANCE.createWorkOrder();
-				o.setLinkType(WorkOrderType.FINISH_TO_START_LITERAL);
-
-				// predList.add(o);
-
-				PredecessorMap map = new PredecessorMap(-1, (WorkOrder) o);
-				predMapList.add(map);
-
-				viewer.refresh();
-				viewer.editElement(map, 0);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		editButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				// get selection
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if (selection.size() > 0) {
-					PredecessorMap predMap = (PredecessorMap) selection
-							.getFirstElement();
-					IBSItemProvider adapter = (IBSItemProvider) getBSAdapter();
-					Object process = adapter.getTopItem();
-
-					PredecessorDialog dlg = new PredecessorDialog(PlatformUI
-							.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(), element, process, getAdapterFactory(),
-							predMap, predMapList, actionMgr);
-					dlg.open();
-
-					viewer.refresh();
-
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		removeButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if (selection.size() > 0) {
-					PredecessorMap map = (PredecessorMap) selection
-							.getFirstElement();
-					predMapList.remove(map);
-
-					WorkOrder wo = map.getWorkOrder();
-					WorkBreakdownElement wbe = (WorkBreakdownElement) getElement();
-					actionMgr
-							.doAction(
-									IActionManager.REMOVE,
-									wbe,
-									UmaPackage.eINSTANCE
-											.getWorkBreakdownElement_LinkToPredecessor(),
-									wo, -1);
-					viewer.refresh();
-
-				}
-
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				IStructuredSelection selection = (IStructuredSelection) viewer
-						.getSelection();
-				if (selection.size() == 1 && editable) {
-					removeButton.setEnabled(true);
-					editButton.setEnabled(true);
-				}
-			}
-		});
-
-	}
-
-	/**
-	 * Returns comma separated list of predecessors
-	 * 
-	 * @return
-	 */
-	// private String getPredecessorsList()
-	// {
-	// IBSItemProvider adapter = (IBSItemProvider) getBSAdapter();
-	// return adapter.getAttribute(element, IBSItemProvider.COL_PREDECESSORS);
-	// }
-	// protected void addListeners()
-	// {
-	// super.addListeners();
-	//		
-	// eventDrivenButton.addSelectionListener(eventDrivenButtonSelectionListener);
-	// ongoingButton.addSelectionListener(ongoingButtonSelectionListener);
-	// repeatableButton.addSelectionListener(repeatableButtonSelectionListener);
-	// //predecessorText.addListener(SWT.Deactivate, predecessorsListener);
-	// }
-	//	
-	// protected void removeListeners()
-	// {
-	// super.removeListeners();
-	//			
-	// eventDrivenButton.removeSelectionListener(eventDrivenButtonSelectionListener);
-	// ongoingButton.removeSelectionListener(ongoingButtonSelectionListener);
-	// repeatableButton.removeSelectionListener(repeatableButtonSelectionListener);
-	// //predecessorText.removeListener(SWT.Deactivate, predecessorsListener);
-	// }
-	protected void updateControls() {
-		super.updateControls();
-		eventDrivenButton.setEnabled(editable);
-		ongoingButton.setEnabled(editable);
-		repeatableButton.setEnabled(editable);
-		viewer.getTable().setEnabled(editable);
-		addButton.setEnabled(editable);
-
-		IStructuredSelection selection = (IStructuredSelection) viewer
-				.getSelection();
-		if (selection.size() == 1 && editable) {
-			removeButton.setEnabled(editable);
-			editButton.setEnabled(editable);
-		} else {
-			removeButton.setEnabled(false);
-			editButton.setEnabled(false);
-		}
-
-//		if ((EPFPropertySheetPage.formPageID
-//				.equals(ProcessEditor.TA_FORM_ID))
-//				|| (EPFPropertySheetPage.formPageID
-//						.equals(ProcessEditor.WPBS_FORM_ID))) {
-		if (!(EPFPropertySheetPage.formPageID.equals(ProcessEditor.WBS_FORM_ID) || EPFPropertySheetPage.formPageID
-				.equals(ProcessEditor.CONSOLIDATED_FORM_ID))) {
-			addButton.setEnabled(false);
-			removeButton.setEnabled(false);
-			editButton.setEnabled(false);
-			viewer.getTable().setEnabled(false);
-		}
-	}
-
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof WorkBreakdownElement) {
-				super.refresh();
-				element = (WorkBreakdownElement) getElement();
-
-				eventDrivenButton.setSelection(element.getIsEventDriven()
-						.booleanValue());
-				ongoingButton.setSelection(element.getIsOngoing()
-						.booleanValue());
-				repeatableButton.setSelection(element.getIsRepeatable()
-						.booleanValue());
-				// predecessorText.setText(getPredecessorsList());
-
-				// re-initialize predList
-				predMapList = new ArrayList();
-				initializePredList();
-				viewer.refresh();
-			}
-
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing Workbreakdown element general section:", ex); //$NON-NLS-1$
-		}
-	}
-
-	private void createViewer(Composite parent, int horizontalSpan) {
-		// create process viewer
-		viewer = new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gridData.verticalIndent = 10;
-		gridData.heightHint = 50;
-		gridData.horizontalSpan = horizontalSpan;
-		viewer.getControl().setLayoutData(gridData);
-
-		// set up columns
-		String[] colProps = new String[columnDescriptors.length];
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			colProps[i] = columnDescriptors[i].id;
-			TableColumn column = new TableColumn(viewer.getTable(),
-					columnDescriptors[i].alignment);
-			column.setText(columnDescriptors[i].label);
-			column.setResizable(columnDescriptors[i].resizable);
-			column.setWidth(columnDescriptors[i].width);
-
-		}
-		viewer.getTable().setHeaderVisible(true);
-		viewer.setColumnProperties(colProps);
-
-		// table = viewer.getTable();
-
-		// final TableCursor cursor = new TableCursor(table, SWT.NONE);
-		// final ControlEditor editor = new ControlEditor(cursor);
-		// editor.grabHorizontal = true;
-		// editor.grabVertical = true;
-
-		// final TableCursor cursor = new TableCursor(table, SWT.NONE);
-		// // create an editor to edit the cell when the user hits "ENTER"
-		// // while over a cell in the table
-		// final ControlEditor editor = new ControlEditor(cursor);
-		// editor.grabHorizontal = true;
-		// editor.grabVertical = true;
-		//
-		// cursor.addSelectionListener(new SelectionAdapter() {
-		// // when the TableEditor is over a cell, select the corresponding row
-		// in
-		// // the table
-		// public void widgetSelected(SelectionEvent e) {
-		// table.setSelection(new TableItem[] { cursor.getRow()});
-		// }
-		// // when the user hits "ENTER" in the TableCursor, pop up a text
-		// editor so that
-		// // they can change the text of the cell
-		// public void widgetDefaultSelected(SelectionEvent e) {
-		// final Text text = new Text(cursor, SWT.NONE);
-		// TableItem row = cursor.getRow();
-		// int column = cursor.getColumn();
-		// text.setText(row.getText(column));
-		// text.addKeyListener(new KeyAdapter() {
-		// public void keyPressed(KeyEvent e) {
-		// // close the text editor and copy the data over
-		// // when the user hits "ENTER"
-		// if (e.character == SWT.CR) {
-		// TableItem row = cursor.getRow();
-		// int column = cursor.getColumn();
-		// if (column == 1) return;
-		// row.setText(column, text.getText());
-		// text.dispose();
-		// }
-		// // close the text editor when the user hits "ESC"
-		// if (e.character == SWT.ESC) {
-		// text.dispose();
-		// }
-		// }
-		// });
-		// editor.setEditor(text);
-		// text.setFocus();
-		// }
-		// });
-		// // Hide the TableCursor when the user hits the "CTRL" or "SHIFT" key.
-		// // This alows the user to select multiple items in the table.
-		// cursor.addKeyListener(new KeyAdapter() {
-		// public void keyPressed(KeyEvent e) {
-		// if (e.keyCode == SWT.CTRL
-		// || e.keyCode == SWT.SHIFT
-		// || (e.stateMask & SWT.CONTROL) != 0
-		// || (e.stateMask & SWT.SHIFT) != 0) {
-		// cursor.setVisible(false);
-		// }
-		// }
-		// });
-		// // Show the TableCursor when the user releases the "SHIFT" or "CTRL"
-		// key.
-		// // This signals the end of the multiple selection task.
-		// table.addKeyListener(new KeyAdapter() {
-		// public void keyReleased(KeyEvent e) {
-		// if (e.keyCode == SWT.CONTROL && (e.stateMask & SWT.SHIFT) != 0)
-		// return;
-		// if (e.keyCode == SWT.SHIFT && (e.stateMask & SWT.CONTROL) != 0)
-		// return;
-		// if (e.keyCode != SWT.CONTROL
-		// && (e.stateMask & SWT.CONTROL) != 0)
-		// return;
-		// if (e.keyCode != SWT.SHIFT && (e.stateMask & SWT.SHIFT) != 0)
-		// return;
-		//
-		// TableItem[] selection = table.getSelection();
-		// TableItem row = (selection.length == 0) ?
-		// table.getItem(table.getTopIndex()) : selection[0];
-		// table.showItem(row);
-		// cursor.setSelection(row, 0);
-		// cursor.setVisible(true);
-		// cursor.setFocus();
-		// }
-		// });
-
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory()) {
-			public Object[] getElements(Object obj) {
-				// System.out.println("PredMapList::"+predMapList);
-				if (obj instanceof List) {
-					return ((List) predMapList).toArray();
-				}
-				return null;
-			}
-		};
-
-		viewer.setContentProvider(contentProvider);
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				getAdapterFactory()) {
-			public String getColumnText(Object obj, int i) {
-				// System.out.println("WorkBreakdownElementGeneralSection::labelProvider
-				// Object- " + obj);
-				if (obj instanceof PredecessorMap) {
-					int id = ((PredecessorMap) obj).getId();
-					WorkOrder wo = ((PredecessorMap) obj).getWorkOrder();
-
-					if (i == 0) {
-						return String.valueOf(id);
-					}
-					if (i == 1) {
-						String name = ""; //$NON-NLS-1$
-						if (wo.getPred() != null) {
-							name = wo.getPred().getPresentationName();
-							if (StrUtil.isBlank(name)) {
-								return wo.getPred().getName();
-							}
-						}
-						return name;
-					}
-					if (i == 2) {
-						if (wo.getLinkType().getValue() == WorkOrderType.FINISH_TO_FINISH)
-							return FINISH_TO_FINISH;
-						else if (wo.getLinkType().getValue() == WorkOrderType.FINISH_TO_START)
-							return FINISH_TO_START;
-						else if (wo.getLinkType().getValue() == WorkOrderType.START_TO_START)
-							return START_TO_START;
-						else if (wo.getLinkType().getValue() == WorkOrderType.START_TO_FINISH)
-							return START_TO_FINISH;
-						return wo.getLinkType().getName();
-					}
-				}
-				return ""; //$NON-NLS-1$
-			}
-		};
-
-		viewer.setLabelProvider(labelProvider);
-
-		textCellEditor = new TextCellEditor(viewer.getTable());
-		comboBoxCellEditor = new ComboBoxCellEditor(viewer.getTable(),
-				new String[] { FINISH_TO_START, FINISH_TO_FINISH,
-						START_TO_START, START_TO_FINISH });
-
-		setCellEditors();
-		setCellModifiers();
-
-		initializePredList();
-		viewer.setInput(predMapList);
-		viewer.refresh();
-
-	}
-
-	private int getCellEditorType(String property) {
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			ColumnDescriptor desc = columnDescriptors[i];
-			if (desc.id == property) {
-				return desc.cellEditorType;
-			}
-		}
-		return ColumnDescriptor.CELL_EDITOR_TYPE_NONE;
-	}
-
-	public CellEditor getCellEditor(String columnID, int columnIndex) {
-		if (columnID == COL_ID) {
-			if (idCellEditor == null) {
-				idCellEditor = new ValidatingTextCellEditor(viewer.getTable()) {
-					protected String isValid(Object e, String txt) {
-						// System.out.println("ValidatingTextCellEditor::isValid");
-						e = TngUtil.unwrap(e);
-
-						IBSItemProvider adapter = (IBSItemProvider) getBSAdapter();
-						Object process = adapter.getTopItem();
-
-						List predecessors = new ArrayList();
-						WorkBreakdownElement wbe = (WorkBreakdownElement) getElement();
-						String str = getPredId();
-						String result = ProcessUtil
-								.checkPredecessorList(wbe, str,
-										getAdapterFactory(), process,
-										predecessors);
-
-						return result;
-					}
-				};
-
-				idCellEditor
-						.setValidator(new CellEditorValidator(idCellEditor));
-				idCellEditor.getControl().addListener(SWT.Deactivate,
-						new ValidatingDeactivateListener(idCellEditor));
-			}
-			idCellEditor.setColumnIndex(columnIndex);
-
-			return idCellEditor;
-		}
-
-		return null;
-	}
-
-	private void setCellEditors() {
-		CellEditor[] cellEditors = new CellEditor[columnDescriptors.length];
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			CellEditor cellEditor = getCellEditor(columnDescriptors[i].id, i);
-			if (cellEditor != null) {
-				cellEditors[i] = cellEditor;
-			} else {
-				switch (columnDescriptors[i].cellEditorType) {
-				case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT:
-					cellEditors[i] = textCellEditor;
-					break;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN:
-					cellEditors[i] = comboBoxCellEditor;
-					break;
-				default:
-					cellEditors[i] = null;
-				}
-			}
-		}
-		viewer.setCellEditors(cellEditors);
-	}
-
-	private void setCellModifiers() {
-		// Set the cell modifier
-		viewer.setCellModifier(new ICellModifier() {
-			public boolean canModify(Object element, String property) {
-				// System.out.println("canModify: element="+element+",
-				// property="+property);
-				if (!(element instanceof PredecessorMap))
-					return false;
-				if (property == COL_PRESENTATION_NAME) {
-					return false;
-				}
-
-				return true;
-			}
-
-			public Object getValue(Object element, String property) {
-				// System.out.println("getValue: element="+element+",
-				// property="+property);
-
-				String val = null;
-				switch (getCellEditorType(property)) {
-				case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT:
-					val = new Integer(((PredecessorMap) element).getId())
-							.toString();
-					return val;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN:
-					int value = (((PredecessorMap) element).getWorkOrder())
-							.getLinkType().getValue();
-					if (WorkOrderType.FINISH_TO_START == value) {
-						return new Integer(0);
-					} else if (WorkOrderType.FINISH_TO_FINISH == value) {
-						return new Integer(1);
-					} else if (WorkOrderType.START_TO_START == value) {
-						return new Integer(2);
-					} else
-						return new Integer(3);
-
-				default:
-					return ""; //$NON-NLS-1$
-				}
-			}
-
-			public void modify(final Object element, String property,
-					Object value) {
-				// System.out.println("modify: element="+element+",
-				// property="+property+", value="+value);
-				TableItem item = (TableItem) element;
-				PredecessorMap predMap = (PredecessorMap) item.getData();
-				WorkOrder wo = predMap.getWorkOrder();
-
-				if (property.equals(COL_ID)) {
-					item.setText(0, value.toString());
-
-					int predId;
-					try {
-						predId = new Integer(value.toString()).intValue();
-						if (predId < 0)
-							throw new Exception();
-					} catch (Exception e) {
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayWarning(
-										PropertiesResources.Process_predecessors_validNumberTitle, 
-										PropertiesResources.Process_predecessors_validNumberMessage); 
-						predMapList.remove(predMap);
-						viewer.refresh();
-						return;
-					}
-					predMap.setId(predId);
-				}
-
-				final int columnIndex = getColumnIndex(property);
-				CellEditor cellEditor = viewer.getCellEditors()[columnIndex];
-				String errMsg = cellEditor.getErrorMessage();
-				if (errMsg != null) {
-					return;
-				}
-
-				WorkOrderType type;
-				IBSItemProvider adapter = (IBSItemProvider) getBSAdapter();
-				WorkBreakdownElement wbe = (WorkBreakdownElement) getElement();
-				
-				switch (getCellEditorType(property)) {
-				case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT:					
-					Object process = adapter.getTopItem();
-
-					List<Object> predecessors = new ArrayList<Object>();					
-					String str = getPredId();
-					String result = ProcessUtil.checkPredecessorList(wbe, str,
-							getAdapterFactory(), process, predecessors);
-
-					if (result == null) {
-						List<WorkOrder> addList = new ArrayList<WorkOrder>();
-						List<WorkOrder> predToBeDeleted = new ArrayList<WorkOrder>();
-						PredecessorList.prepareUpdatePredecessors(getAdapterFactory(), wbe, predecessors, addList, predToBeDeleted);
-						if(!predToBeDeleted.isEmpty()) {
-							actionMgr.doAction(
-									IActionManager.REMOVE_MANY,
-									wbe,
-									UmaPackage.eINSTANCE.getWorkBreakdownElement_LinkToPredecessor(),
-									predToBeDeleted, -1);
-						}
-						if(!addList.isEmpty()) {
-							boolean status = actionMgr
-									.doAction(
-											IActionManager.ADD_MANY,
-											wbe,
-											UmaPackage.eINSTANCE
-													.getWorkBreakdownElement_LinkToPredecessor(),
-											addList, -1);
-							if(status) {
-								//TODO: review this
-								predMap.setWorkOrder(addList.get(addList.size() - 1));
-							} else {
-								predMapList.remove(predMap);
-							}
-						}
-					} else {
-						// show error message box
-						String title = getEditor().getTitle();
-						String problem = PropertiesResources.ProcessEditorFormProperties_cellEditor_invalidPredcessor_problem_msg; 
-						MsgDialog dialog = AuthoringUIPlugin.getDefault()
-								.getMsgDialog();
-						dialog.displayWarning(title, problem, result); 
-						predMapList.remove(predMap);
-					}
-
-					break;
-				case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN:
-					boolean removed = false;
-					WorkBreakdownElement wbeCopy = null;
-					WorkOrder o = null;
-					int index = ((Number) value).intValue();
-					for (Iterator iter = wbe.getLinkToPredecessor()
-							.iterator(); iter.hasNext();) {
-						o = (WorkOrder) iter.next();
-						if (o.getPred() == wo.getPred())
-						{							
-							if (o.getLinkType().getValue() != index) {
-								wbeCopy = o.getPred();
-								iter.remove();
-								removed = true;
-							}
-						}
-					}					
-										
-					if (index == 0) {
-						type = WorkOrderType.FINISH_TO_START_LITERAL;
-					} else if (index == 1) {
-						type = WorkOrderType.FINISH_TO_FINISH_LITERAL;
-					} else if (index == 2) {
-						type = WorkOrderType.START_TO_START_LITERAL;
-					} else {
-						type = WorkOrderType.START_TO_FINISH_LITERAL;
-					}
-					
-					if (removed && wbeCopy != null) {					
-						wo.setPred(wbeCopy);
-						wo.setLinkType(type);
-						boolean status = actionMgr
-								.doAction(
-										IActionManager.ADD,
-										wbe,
-										UmaPackage.eINSTANCE
-												.getWorkBreakdownElement_LinkToPredecessor(),
-										wo, -1);
-						if (status)
-							predMap.setWorkOrder(o);
-					} else {
-						actionMgr.doAction(IActionManager.SET, wo,
-								UmaPackage.eINSTANCE.getWorkOrder_LinkType(), type,
-								-1);
-					}						
-					
-					break;
-
-				default:
-					type = WorkOrderType.FINISH_TO_FINISH_LITERAL;
-				}
-
-				viewer.refresh();
-			}
-		});
-
-	}
-
-	/**
-	 * This method returns list of item providers for predecessors
-	 * 
-	 * @return
-	 */
-	// private Object getPredItemProviders()
-	// {
-	// IBSItemProvider adapter = (IBSItemProvider) getBSAdapter();
-	// if (adapter != null)
-	// return adapter.getPredecessors();
-	//    	
-	// return null;
-	// }
-	private ItemProviderAdapter getBSAdapter() {
-		try {
-			AdapterFactory factory = getAdapterFactory();// TngAdapterFactory.INSTANCE.getProcessComposedAdapterFactory();
-
-			element = (WorkBreakdownElement) getElement();
-
-			ItemProviderAdapter provider = (ItemProviderAdapter) factory.adapt(
-					element, ITreeItemContentProvider.class);
-			return provider;
-		} catch (Exception ex) {
-			return null;
-		}
-
-	}
-
-	/**
-	 * Return column index for property
-	 * 
-	 * @param property
-	 * @return
-	 */
-	private int getColumnIndex(String property) {
-		Object[] colProps = viewer.getColumnProperties();
-		for (int i = 0; i < colProps.length; i++) {
-			if (colProps[i] == property)
-				return i;
-		}
-		return -1;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.AbstractSection#getNamePrefix()
-	 */
-	public String getNamePrefix() {
-		if (element instanceof TeamProfile) {
-			return LibraryUIText.TEXT_TEAM_PROFILE + ": "; //$NON-NLS-1$
-		} else if (element instanceof Milestone) {
-			return LibraryUIText.TEXT_MILESTONE + ": "; //$NON-NLS-1$
-		}
-		return LibraryUIText.TEXT_WORK_PRODUCT_ELEMENT + ": "; //$NON-NLS-1$
-	}
-
-	private String getPredId() {
-		StringBuffer buf = new StringBuffer();
-
-		for (Iterator itor = predMapList.iterator(); itor.hasNext();) {
-			PredecessorMap map = (PredecessorMap) itor.next();
-			buf.append(map.getId());
-			buf.append(","); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Initialize pred list
-	 * 
-	 */
-	private void initializePredList() {
-		try {
-			List predProviders = null;
-
-			// get work breakdown element
-			element = (WorkBreakdownElement) getElement();
-
-			// get predecessor item providers
-			AdapterFactory factory = getAdapterFactory();
-
-			if (factory != null) {
-				ItemProviderAdapter provider = (ItemProviderAdapter) factory
-						.adapt(element, ITreeItemContentProvider.class);
-				if (provider instanceof IBSItemProvider) {
-					predProviders = ((IBSItemProvider) provider)
-							.getPredecessors();
-				}
-			}
-
-			// need following for special case (WrapperItemProviders).
-			ISelection selection = getSelection();
-			if (selection instanceof IStructuredSelection) {
-				Object input = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (input instanceof BreakdownElementWrapperItemProvider) {
-					predProviders = ((BreakdownElementWrapperItemProvider) input)
-							.getPredecessors();
-				}
-			}
-
-			// get link to predecessors
-			if ((element != null) && (predProviders != null)) {
-				List predList = element.getLinkToPredecessor();
-				for (Iterator itemIterator = predProviders.iterator(); itemIterator
-						.hasNext();) {
-					boolean found = false;
-					Object itemObj = (Object) itemIterator.next();
-					Object targetObj = null;
-					if (itemObj instanceof WrapperItemProvider) {
-						targetObj = ((WrapperItemProvider) itemObj).getValue();
-					}
-					if (itemObj instanceof ItemProviderAdapter) {
-						targetObj = ((ItemProviderAdapter) itemObj).getTarget();
-					}
-					if (targetObj != null) {
-						int id = ((IBSItemProvider) itemObj).getId();
-						found = addPredecessor(predList, id, targetObj);
-
-						if ((!found)
-								&& (targetObj instanceof VariabilityElement)) {
-							VariabilityElement ve = (VariabilityElement) targetObj;
-							if (ve.getVariabilityBasedOnElement() != null) {
-								VariabilityElement el = ve
-										.getVariabilityBasedOnElement();
-								targetObj = el;
-
-								// add base variability object
-								addPredecessor(predList, id, targetObj);
-							}
-						}
-					}
-				}
-
-				// for (Iterator itor=predList.iterator(); itor.hasNext();)
-				// {
-				// boolean found = false;
-				// Object o = (Object) itor.next();
-				// if (o instanceof WorkOrder)
-				// {
-				// //System.out.println("getElement::WorkOrder = "+ ((WorkOrder)
-				// o).getPred());
-				// WorkBreakdownElement wbe = ((WorkOrder) o).getPred();
-				// if (wbe != null)
-				// {
-				// for (Iterator itemIterator=predProviders.iterator();
-				// itemIterator.hasNext();)
-				// {
-				// Object itemObj = (Object) itemIterator.next();
-				// Object targetObj = null;
-				// if (itemObj instanceof WrapperItemProvider)
-				// {
-				// targetObj = ((WrapperItemProvider) itemObj).getValue();
-				// }
-				// if (itemObj instanceof ItemProviderAdapter)
-				// {
-				// targetObj = ((ItemProviderAdapter)itemObj).getTarget();
-				// }
-				// if (targetObj != null)
-				// {
-				// if (targetObj.equals(wbe))
-				// {
-				// // create mapObjectList
-				// int id = ((IBSItemProvider) itemObj).getId();
-				// PredecessorMap map = new PredecessorMap(id, (WorkOrder) o);
-				// predMapList.add(map);
-				//		
-				// found=true;
-				// break;
-				// }
-				// }
-				// }
-				// if (!found)
-				// {
-				// // if provider is not found, then add with id=0
-				// // do it only for TeamAllocation and WorkProductUsage view
-				// // if
-				// ((EPFPropertySheetPage.formPageID.equals(ProcessFormEditor.TA_FORM_ID))
-				// ||
-				// //
-				// (EPFPropertySheetPage.formPageID.equals(ProcessFormEditor.WPBS_FORM_ID)))
-				// {
-				// PredecessorMap map = new PredecessorMap(0, (WorkOrder) o);
-				// predMapList.add(map);
-				// }
-				// }
-				// }
-				// }
-				// }
-			}
-		} catch (Exception e) {
-			logger.logError("Initializing Predecessor List", e); //$NON-NLS-1$
-		}
-	}
-
-	private boolean addPredecessor(List predList, int id, Object targetObj) {
-		for (Iterator itor = predList.iterator(); itor.hasNext();) {
-			Object o = (Object) itor.next();
-			if (o instanceof WorkOrder) {
-				// System.out.println("getElement::WorkOrder = "+ ((WorkOrder)
-				// o).getPred());
-				WorkBreakdownElement wbe = ((WorkOrder) o).getPred();
-
-				if (targetObj.equals(wbe)) {
-					// create mapObjectList
-					PredecessorMap map = new PredecessorMap(id, (WorkOrder) o);
-					predMapList.add(map);
-
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/WorkProductDescriptorGeneralSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/WorkProductDescriptorGeneralSection.java
deleted file mode 100644
index 347c172..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/WorkProductDescriptorGeneralSection.java
+++ /dev/null
@@ -1,875 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.properties;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.dialogs.ItemsFilterDialog;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor.ModifyListener;
-import org.eclipse.epf.authoring.ui.filters.DescriptorProcessFilter;
-import org.eclipse.epf.authoring.ui.filters.ProcessSpecificWorkProductFilter;
-import org.eclipse.epf.authoring.ui.filters.ProcessWorkProductFilter;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.edit.process.command.AssignWPToDeliverable;
-import org.eclipse.epf.library.edit.process.command.LinkMethodElementCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-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.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-
-/**
- * The general tab section for Work Product Descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class WorkProductDescriptorGeneralSection extends
-		DescriptorGeneralSection {
-	protected WorkProductDescriptor element;
-
-	private Text ctrl_method_element;
-
-	private Text ctrl_workProduct_type;
-
-	private Text activityEntryState, activityExitState;
-
-	private Button linkButton;
-
-	private Button clearButton;
-	
-	private Table ctrl_table_1;
-
-	private TableViewer viewer_1;
-
-	private Button ctrl_add_1, ctrl_add_proc_1, ctrl_remove_1;
-
-	private Section deliverableSection;
-
-	private ModifyListener wpModelModifyListener;
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#init()
-	 */
-	protected void init() {
-		super.init();
-		// get WorkProductDescriptor object
-		element = (WorkProductDescriptor) getElement();
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-
-	}
-
-	private void toggleSection() {
-		if (!(element.getWorkProduct() instanceof Deliverable)) {
-			if (deliverableSection.isExpanded())
-				deliverableSection.setExpanded(false);
-			if (deliverableSection.isVisible())
-				deliverableSection.setVisible(false);
-		} else {
-			if (!deliverableSection.isExpanded())
-				deliverableSection.setExpanded(true);
-			if (!deliverableSection.isVisible())
-				deliverableSection.setVisible(true);
-		}
-	}
-
-	private void createDeliverableSection(Composite composite) {
-		String sectionTitle = PropertiesResources.WPDescriptor_DeliverablePart_SectionTitle; 
-		String sectionDesc = PropertiesResources.WPDescriptor_DeliverablePart_SectionDescription; 
-		String tableTitle = PropertiesResources.WPDescriptor_DeliverablePart_Table1; 
-
-		Section section = FormUI.createSection(toolkit, composite,
-				sectionTitle, sectionDesc);
-
-		// create composite
-		Composite sectionComposite = FormUI.createComposite(toolkit, section,
-				2, false);
-
-		Composite pane1 = FormUI.createComposite(toolkit, sectionComposite,
-				GridData.FILL_BOTH);
-		FormUI.createLabel(toolkit, pane1, tableTitle);
-
-		int tableHeight = 80;
-		ctrl_table_1 = FormUI.createTable(toolkit, pane1, tableHeight);
-		viewer_1 = new TableViewer(ctrl_table_1);
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List newList = new ArrayList();
-				List deliverableParts = element.getDeliverableParts();
-				for (Iterator itor = deliverableParts.iterator(); itor
-						.hasNext();) {
-					WorkProductDescriptor wpDesc = (WorkProductDescriptor) itor
-							.next();
-					if (wpDesc.getSuperActivities() == null
-							|| wpDesc.getSuperActivities() == null)
-						newList.add(wpDesc);
-				}
-				return getFilteredList(newList).toArray();
-			}
-		};
-
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory());
-		viewer_1.setContentProvider(contentProvider);
-		viewer_1.setLabelProvider(labelProvider);
-		viewer_1.setInput(element);
-
-		// create buttons for table2
-		Composite pane2 = FormUI.createComposite(toolkit, sectionComposite,
-				GridData.VERTICAL_ALIGN_CENTER
-						| GridData.HORIZONTAL_ALIGN_CENTER);
-
-		ctrl_add_1 = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Add); 
-		ctrl_add_proc_1 = FormUI.createButton(toolkit, pane2,
-				PropertiesResources.Process_AddFromProcess); 
-		ctrl_remove_1 = FormUI.createButton(toolkit, pane2, PropertiesResources.Process_Remove); 
-
-		toolkit.paintBordersFor(pane1);
-
-		deliverableSection = section;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.BreakdownElementGeneralSection#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-
-		// if (labelProvider != null)
-		// {
-		// labelProvider.dispose();
-		// }
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#createGeneralSection(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createGeneralSection(Composite composite) {
-		super.createGeneralSection(composite);
-
-		// method element
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.Process_Type_WorkProduct); 
-		ctrl_method_element = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, 1);
-		ctrl_method_element.setText(getMethodElementName(element));
-		ctrl_method_element.setEnabled(false);
-
-		Composite buttonComposite = FormUI.createComposite(toolkit,
-				generalComposite, SWT.NONE, 2, true);
-		linkButton = FormUI.createButton(toolkit, buttonComposite, SWT.PUSH, 1);
-		linkButton
-				.setText(PropertiesResources.Process_Button_LinkMethodElement); 
-
-		clearButton = FormUI.createButton(toolkit, buttonComposite, SWT.PUSH, 1);
-		clearButton
-				.setText(PropertiesResources.Process_Button_ClearMethodElement); 
-
-		// type
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.WorkProduct_Type); 
-		ctrl_workProduct_type = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, horizontalSpan);
-		ctrl_workProduct_type.setText(getMethodElementType(element));
-		ctrl_workProduct_type.setEnabled(false);
-
-		// activityEntrystate
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.WorkProductDescriptor_ActivityEntryState); 
-		activityEntryState = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, horizontalSpan);
-
-		// activityExitstate
-		FormUI.createLabel(toolkit, generalComposite, PropertiesResources.WorkProductDescriptor_ActivityExitState); 
-		activityExitState = FormUI.createText(toolkit, generalComposite,
-				SWT.DEFAULT, horizontalSpan);
-
-		// CREATE DELIVERABLE SECTION
-		createDeliverableSection(composite);
-		toggleSection();
-
-	}
-
-	private String getMethodElementName(WorkProductDescriptor element) {
-		String str = PropertiesResources.Process_None; 
-		if (element.getWorkProduct() != null) {
-			str = element.getWorkProduct().getName();
-		}
-
-		return str;
-	}
-
-	private String getMethodElementType(WorkProductDescriptor element) {
-		String str = PropertiesResources.Process_None; 
-		if (element.getWorkProduct() != null) {
-			str = element.getWorkProduct().getType().getName();
-		}
-
-		return str;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#addListeners()
-	 */
-	protected void addListeners() {
-		super.addListeners();
-
-		activityEntryState.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getWorkProductDescriptor_ActivityEntryState());
-			}
-		
-			public void focusLost(FocusEvent e) {
-				WorkProductDescriptor element = (WorkProductDescriptor) getElement();
-				String oldContent = element.getActivityEntryState();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						activityEntryState, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil.getPlainText(activityEntryState
-						.getText());
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr
-							.doAction(
-									IActionManager.SET,
-									element,
-									UmaPackage.eINSTANCE
-											.getWorkProductDescriptor_ActivityEntryState(),
-									newContent, -1);
-					if (status) {
-						activityEntryState.setText(newContent);
-					}
-				}
-			}
-		});
-
-		activityExitState.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				((MethodElementEditor) getEditor()).setCurrentFeatureEditor(e.widget,
-						UmaPackage.eINSTANCE.getWorkProductDescriptor_ActivityExitState());
-			}
-			
-			public void focusLost(FocusEvent e) {
-				WorkProductDescriptor element = (WorkProductDescriptor) getElement();
-				String oldContent = element.getActivityExitState();
-				if (((MethodElementEditor) getEditor()).mustRestoreValue(
-						activityExitState, oldContent)) {
-					return;
-				}
-				String newContent = StrUtil.getPlainText(activityExitState
-						.getText());
-				if (!newContent.equals(oldContent)) {
-					boolean status = actionMgr
-							.doAction(
-									IActionManager.SET,
-									element,
-									UmaPackage.eINSTANCE
-											.getWorkProductDescriptor_ActivityExitState(),
-									newContent, -1);
-					if (status) {
-						activityExitState.setText(newContent);
-					}
-				}
-			}
-		});
-
-		ctrl_table_1.addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewer_1
-						.getSelection();
-				if (selection.size() > 0)
-					ctrl_remove_1.setEnabled(true);
-			}
-		});
-
-		ctrl_add_1.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IFilter filter = new ProcessWorkProductFilter(
-						getConfiguration(), null, FilterConstants.WORKPRODUCTS); 
-				// block it's deliverable parts
-				List existingElements = new ArrayList();
-				existingElements
-						.addAll(ProcessUtil
-								.getAssociatedElementList(((WorkProductDescriptor) element)
-										.getDeliverableParts()));
-				// block itself
-				existingElements.add(ProcessUtil
-						.getAssociatedElement((WorkProductDescriptor) element));
-				// also block it's parent work products, if any
-				existingElements
-						.addAll((Collection) getParentWorkProducts((WorkProductDescriptor) element));
-
-				ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						filter, element, FilterConstants.WORKPRODUCTS,
-						existingElements);
-				fd.setBlockOnOpen(true);
-				fd.setTitle(FilterConstants.WORKPRODUCTS);
-				fd.open();
-				addItems(fd.getSelectedItems());
-				viewer_1.refresh();
-
-			}
-		});
-
-		ctrl_add_proc_1.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				String tabName = FilterConstants.WORK_PRODUCT_DESCRIPTORS;
-				List existingElements = new ArrayList();
-				existingElements.addAll(((WorkProductDescriptor) element)
-						.getDeliverableParts());
-				existingElements.add(element);
-
-				existingElements
-						.addAll(getParentDeliverables((WorkProductDescriptor) element));
-				Process process = TngUtil.getOwningProcess(element);
-
-				IFilter descriptorFilter = getDescriptorFilter();
-				if (descriptorFilter != null && process != null) {
-					ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-							.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(), descriptorFilter, process, tabName,
-							existingElements);
-					fd.setBlockOnOpen(true);
-					fd.setTitle(tabName);
-					fd.open();
-					addFromProcessItems(fd.getSelectedItems());
-					viewer_1.refresh();
-				}
-			}
-		});
-
-		ctrl_remove_1.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IStructuredSelection selection = (IStructuredSelection) viewer_1
-						.getSelection();
-				if (selection.size() > 0) {
-					// update the model
-					ArrayList rmItems = new ArrayList();
-					rmItems.addAll(selection.toList());
-					removeItems(rmItems);
-					viewer_1.refresh();
-
-					// clear the selection
-					viewer_1.setSelection(null, true);
-
-				}
-			}
-		});
-
-		linkButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				String tabName = FilterConstants.WORKPRODUCTS; 
-				Class workProductType = null;
-				if (element.getWorkProduct() != null) {
-					workProductType = element.getWorkProduct().getClass();
-				}
-				List existingElements = new ArrayList();
-				if (element.getWorkProduct() != null) {
-					WorkProduct wp = element.getWorkProduct();
-					existingElements.add(wp);
-					if (wp instanceof Artifact) {
-						List subArtifacts = new ArrayList();
-						getAllSubArtifacts((Artifact) wp, subArtifacts,
-								((Artifact) wp).getContainedArtifacts());
-						existingElements.addAll(subArtifacts);
-					}
-				}
-
-				List list = ProcessUtil
-						.getSiblings(TngAdapterFactory.INSTANCE
-								.getPBS_ComposedAdapterFactory(), getAdapter(),
-								element);
-
-				for (Iterator itor = list.iterator(); itor.hasNext();) {
-					Object obj = itor.next();
-					if (obj instanceof WorkProductDescriptor) {
-						WorkProductDescriptor wpDesc = (WorkProductDescriptor) obj;
-						if ((!wpDesc.equals(element))
-								&& (!wpDesc.getSuppressed().booleanValue())) {
-							WorkProduct wp = wpDesc.getWorkProduct();
-
-							if (wp != null) {
-								existingElements.add(wp);
-
-								if (wp instanceof Artifact) {
-									List subArtifacts = new ArrayList();
-									getAllSubArtifacts((Artifact) wp,
-											subArtifacts, ((Artifact) wp)
-													.getContainedArtifacts());
-									existingElements.addAll(subArtifacts);
-								}
-							}
-						}
-					}
-				}
-				IFilter filter = new ProcessSpecificWorkProductFilter(
-						getConfiguration(), null, tabName, workProductType);
-
-				ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI
-						.getWorkbench().getActiveWorkbenchWindow().getShell(),
-						filter, element, tabName, existingElements);
-
-				fd.setBlockOnOpen(true);
-				fd.setViewerSelectionSingle(true);
-				fd.setTitle(tabName);
-				fd.open();
-				setMethodElement(fd.getSelectedItems());
-
-				// update method element control
-				ctrl_method_element.setText(getMethodElementName(element));
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e1) {
-			}
-		});
-		
-		clearButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				actionMgr.doAction(IActionManager.SET, element,
-						UmaPackage.eINSTANCE
-								.getWorkProductDescriptor_WorkProduct(),
-						null, -1);
-				// update method element control
-				ctrl_method_element.setText(getMethodElementName(element));
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e1) {
-			}
-		});
-	}
-
-	private void getAllSubArtifacts(Artifact artifact, List subArtifacts,
-			List containedArtifacts) {
-		for (Iterator itor = containedArtifacts.iterator(); itor.hasNext();) {
-			Object obj = (Object) itor.next();
-			if (obj instanceof Artifact) {
-				if (!subArtifacts.contains(obj))
-					subArtifacts.add(obj);
-				getAllSubArtifacts((Artifact) obj, subArtifacts,
-						((Artifact) obj).getContainedArtifacts());
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#updateControls()
-	 */
-	protected void updateControls() {
-		super.updateControls();
-		activityEntryState.setEditable(editable);
-		activityExitState.setEditable(editable);
-		linkButton.setEnabled(editable);
-		clearButton.setEnabled(editable);
-		activityEntryState.setEnabled(editable);
-		activityExitState.setEnabled(editable);
-
-		if (ctrl_add_1 != null)
-			ctrl_add_1.setEnabled(editable);
-		if (ctrl_add_proc_1 != null)
-			ctrl_add_proc_1.setEnabled(editable);
-		if (ctrl_remove_1 != null)
-			ctrl_remove_1.setEnabled(editable);
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#refresh()
-	 */
-	public void refresh() {
-		try {
-			if (getElement() instanceof WorkProductDescriptor) {
-				element = (WorkProductDescriptor) getElement();
-
-				super.refresh();
-
-				// Model Modify listener for activity entry state and activity
-				// exit state
-				if (wpModelModifyListener != null) {
-					activityEntryState
-							.removeModifyListener(wpModelModifyListener);
-					activityExitState
-							.removeModifyListener(wpModelModifyListener);
-
-				}
-
-				wpModelModifyListener = getEditor().createModifyListener(
-						(WorkProductDescriptor) element);
-
-				if (wpModelModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) wpModelModifyListener)
-							.setElement(element);
-					((MethodElementEditor.ModifyListener) wpModelModifyListener)
-							.setDisable(true);
-				}
-
-				ctrl_method_element.setText(getMethodElementName(element));
-				ctrl_workProduct_type.setText(getMethodElementType(element));
-				activityEntryState.setText(element.getActivityEntryState());
-				activityExitState.setText(element.getActivityExitState());
-
-				if (wpModelModifyListener instanceof MethodElementEditor.ModifyListener) {
-					((MethodElementEditor.ModifyListener) wpModelModifyListener)
-							.setDisable(false);
-				}
-
-				activityEntryState.addModifyListener(wpModelModifyListener);
-				activityExitState.addModifyListener(wpModelModifyListener);
-
-				if (viewer_1 != null) {
-					viewer_1.refresh();
-				}
-
-				// hide/show certain sections.
-				toggleSection();
-
-			}
-
-		} catch (Exception ex) {
-			logger
-					.logError(
-							"Error refreshing WorkProductDescriptor general section : " + element, ex); //$NON-NLS-1$
-		}
-	}
-
-	private void addItems(List items) {
-		if (items != null) {
-			List wps = new ArrayList();
-
-			for (Iterator itor = items.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if ((obj instanceof WorkProduct)
-						&& (!isPartOfDeliverable((WorkProduct) obj,
-								(WorkProductDescriptor) element))) {
-					wps.add((WorkProduct) obj);
-
-				}
-			}
-			if (!wps.isEmpty()) {
-				AssignWPToDeliverable cmd = new AssignWPToDeliverable(
-						(WorkProductDescriptor) element, wps);
-				actionMgr.execute(cmd);
-			}
-		}
-		viewer_1.refresh();
-	}
-
-	protected IFilter getDescriptorFilter() {
-
-		return new DescriptorProcessFilter(getConfiguration()) {
-			protected boolean childAccept(Object obj) {
-				if (obj instanceof Activity) {
-					List list = new ArrayList();
-					getActivitiesInScope(TngAdapterFactory.INSTANCE
-							.getPBS_ComposedAdapterFactory(), element, list);
-					if (list.contains(obj))
-						return true;
-					else
-						return false;
-				}
-				if (obj instanceof WorkProductDescriptor)
-					return true;
-				return false;
-			}
-		};
-	}
-
-	private void addFromProcessItems(List items) {
-		if (items != null) {
-			for (Iterator itor = items.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (obj instanceof WorkProductDescriptor) {
-					WorkProduct wp = ((WorkProductDescriptor) obj)
-							.getWorkProduct();
-					if (wp != null) {
-						if (!isPartOfDeliverable(wp,
-								(WorkProductDescriptor) element)) {
-							WorkProductDescriptor wpDesc = ProcessUtil
-									.createWorkProductDescriptor(wp);
-							actionMgr
-									.doAction(
-											IActionManager.ADD,
-											element,
-											UmaPackage.eINSTANCE
-													.getWorkProductDescriptor_DeliverableParts(),
-											wpDesc, -1);
-						}
-						actionMgr
-								.doAction(
-										IActionManager.ADD,
-										element,
-										UmaPackage.eINSTANCE
-												.getWorkProductDescriptor_DeliverableParts(),
-										obj, -1);
-						
-					} else {
-						MessageFormat mf = new MessageFormat(
-								PropertiesResources.Process_DeliverableAssignError); 
-						Object[] args = {
-								((WorkProductDescriptor) obj).getName(),
-								((WorkProductDescriptor) element).getName() };
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayInfo(
-										PropertiesResources.Process_AssignmentInfoTitle, mf.format(args)); 
-					}
-				}
-			}
-		}
-
-	}
-
-	private void removeItems(List items) {
-		if (!items.isEmpty()) {
-			for (Iterator itor = items.iterator(); itor.hasNext();) {
-				Object obj = (Object) itor.next();
-				if (obj instanceof WorkProductDescriptor) {
-					actionMgr
-							.doAction(
-									IActionManager.REMOVE,
-									element,
-									UmaPackage.eINSTANCE
-											.getWorkProductDescriptor_DeliverableParts(),
-									(WorkProductDescriptor) obj, -1);
-				}
-
-				// find matching deliverable parts
-				Object wpDesc = findDeliverableParts((Object) obj);
-				actionMgr.doAction(IActionManager.REMOVE, element,
-						UmaPackage.eINSTANCE
-								.getWorkProductDescriptor_DeliverableParts(),
-						wpDesc, -1);
-			}
-		}
-	}
-
-	private Object findDeliverableParts(Object obj) {
-		List parts = ((WorkProductDescriptor) element).getDeliverableParts();
-
-		for (Iterator itor = parts.iterator(); itor.hasNext();) {
-			Object itorObject = itor.next();
-			if (obj instanceof WorkProductDescriptor) {
-				if (itorObject instanceof WorkProductDescriptor) {
-					Object objWP = ((WorkProductDescriptor) obj)
-							.getWorkProduct();
-					Object itorWP = ((WorkProductDescriptor) itorObject)
-							.getWorkProduct();
-					if (objWP.equals(itorWP)) {
-						return itorObject;
-					}
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Find parent process
-	 * 
-	 * @param element
-	 * @return
-	 */
-	protected Object getProcess(BreakdownElement brElement) {
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				brElement, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(brElement);
-		while (!(parent instanceof Process)) {
-			brElement = (BreakdownElement) parent;
-			adapter = (ItemProviderAdapter) aFactory.adapt(brElement,
-					ITreeItemContentProvider.class);
-			parent = adapter.getParent(brElement);
-		}
-		return parent;
-	}
-
-	/**
-	 * Get parent deliverables
-	 * 
-	 * @param brElement
-	 * @return
-	 */
-	private List getParentDeliverables(BreakdownElement brElement) {
-		List parentDeliverables = new ArrayList();
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				brElement, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(brElement);
-		while (!(parent instanceof Activity)) {
-			brElement = (BreakdownElement) parent;
-			if (parent instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpdesc = (WorkProductDescriptor) parent;
-				if (wpdesc.getWorkProduct() instanceof Deliverable) {
-					parentDeliverables.add(wpdesc);
-				}
-			}
-			adapter = (ItemProviderAdapter) aFactory.adapt(brElement,
-					ITreeItemContentProvider.class);
-			parent = adapter.getParent(brElement);
-		}
-		return parentDeliverables;
-	}
-	/**
-	 * Find all sibling work products
-	 * 
-	 * @param element
-	 * @return
-	 */
-	private Object getParentWorkProducts(BreakdownElement brElement) {
-		HashSet workProducts = new HashSet();
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				brElement, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(brElement);
-		while (!(parent instanceof Activity)) {
-			brElement = (BreakdownElement) parent;
-			if (parent instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpdesc = (WorkProductDescriptor) parent;
-				if (wpdesc.getWorkProduct() instanceof Deliverable) {
-					workProducts.add(wpdesc.getWorkProduct());
-				}
-			}
-			adapter = (ItemProviderAdapter) aFactory.adapt(brElement,
-					ITreeItemContentProvider.class);
-			parent = adapter.getParent(brElement);
-		}
-
-		if (parent instanceof Activity) {
-			List brElements = ((Activity) parent).getBreakdownElements();
-			for (Iterator itor = brElements.iterator(); itor.hasNext();) {
-				Object obj = (Object) itor.next();
-				if (obj instanceof WorkProductDescriptor) {
-					WorkProduct wp = ((WorkProductDescriptor) obj)
-							.getWorkProduct();
-					if (wp != null)
-						workProducts.add(wp);
-				}
-			}
-		}
-		return workProducts;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.properties.DescriptorGeneralSection#getNamePrefix()
-	 */
-	public String getNamePrefix() {
-		return LibraryUIText.TEXT_WORK_PRODUCT_DESCRIPTOR + ": "; //$NON-NLS-1$
-	}
-
-	private void setMethodElement(List items) {
-		if ((items != null) && (items.size() >= 1)) {
-			if (items.get(0) instanceof WorkProduct) {
-				WorkProduct wp = (WorkProduct) items.get(0);
-
-//				List list = ProcessUtil
-//						.getSiblings(TngAdapterFactory.INSTANCE
-//								.getPBS_ComposedAdapterFactory(), getAdapter(),
-//								element);
-				boolean canAssign = true;
-//				for (Iterator itor = list.iterator(); itor.hasNext();) {
-//					Object obj = itor.next();
-//					if (obj instanceof WorkProductDescriptor) {
-//						WorkProductDescriptor wpDesc = (WorkProductDescriptor) obj;
-//						if ((!wpDesc.equals(element))
-//								&& (!wpDesc.getSuppressed().booleanValue())) {
-//							WorkProduct exisingWP = wpDesc.getWorkProduct();
-//							if (wp.equals(exisingWP)) {
-//								canAssign = false;
-//								break;
-//							}
-//						}
-//					}
-//				}
-				if (canAssign) {
-					LinkMethodElementCommand cmd = new LinkMethodElementCommand(
-							element, wp,
-							UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT);
-					actionMgr.execute(cmd);
-
-					// set selection to same element to enable correct actions
-					getEditor().setSelection(getSelection());
-				} else {
-					MessageFormat mf = new MessageFormat(PropertiesResources.Process_InvalidLinkMethodElement); 
-					Object[] args = { wp.getName() };
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayInfo(
-									PropertiesResources.Process_LinkMethodElementTitle, mf.format(args)); 
-				}
-			}
-		}
-	}
-
-	private boolean isPartOfDeliverable(WorkProduct wp,
-			WorkProductDescriptor deliverable) {
-
-		List deliverableParts = ProcessUtil
-				.getAssociatedElementList(deliverable.getDeliverableParts());
-		if (deliverableParts.contains(wp))
-			return true;
-
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/package.html
deleted file mode 100644
index 47aa7c7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides tabbed pages for the breakdown elements Properties view.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryContentProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryContentProvider.java
deleted file mode 100644
index bf96294..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryContentProvider.java
+++ /dev/null
@@ -1,300 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.IViewerNotification;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.category.CustomCategoryItemProvider;
-import org.eclipse.epf.library.edit.category.DisciplineCategoriesItemProvider;
-import org.eclipse.epf.library.edit.category.DomainsItemProvider;
-import org.eclipse.epf.library.edit.category.RoleSetsItemProvider;
-import org.eclipse.epf.library.edit.category.ToolsItemProvider;
-import org.eclipse.epf.library.edit.category.WorkProductTypesItemProvider;
-import org.eclipse.epf.library.edit.navigator.ConfigurationsItemProvider;
-import org.eclipse.epf.library.edit.navigator.PluginUIPackagesItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * Content provider for Custom Category view of configuration page
- * 
- * @author Jeff Hardy
- */
-
-public class CategoryContentProvider extends AdapterFactoryContentProvider {
-
-	// there is a problem in the passed in AdapterFactory
-	// it can't find the correct parent from the child
-	// need to build a map of child to it's parent if the child is a UI
-	// folder
-	// clear the map when the input is set
-	private Map<Object, Object> childUIParentMap = new HashMap<Object, Object>();
-	
-	private MethodConfiguration config;
-
-	/**
-	 * Create an instance
-	 * @param adapterFactory
-	 */
-	public CategoryContentProvider(AdapterFactory adapterFactory, MethodConfiguration config) {
-		super(adapterFactory);
-		this.config = config;
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		Collection<Object> children = new ArrayList<Object>();
-		if (parentElement instanceof MethodPlugin) {
-			// add standard categories UI folders as appropriate
-			DisciplineCategoriesItemProvider disciplines = (DisciplineCategoriesItemProvider)TngUtil.getDisciplineCategoriesItemProvider((MethodPlugin)parentElement);
-			if (disciplines != null && !disciplines.getChildren(disciplines).isEmpty()) {
-				children.add(disciplines);
-			}
-			DomainsItemProvider domains = (DomainsItemProvider)TngUtil.getDomainsItemProvider((MethodPlugin)parentElement);
-			if (domains != null && !domains.getChildren(domains).isEmpty()) {
-				children.add(domains);
-			}
-			WorkProductTypesItemProvider wpTypes = (WorkProductTypesItemProvider)TngUtil.getWorkProductTypesItemProvider((MethodPlugin)parentElement);
-			if (wpTypes != null && !wpTypes.getChildren(wpTypes).isEmpty()) {
-				children.add(wpTypes);
-			}
-			RoleSetsItemProvider roleSets = (RoleSetsItemProvider)TngUtil.getRoleSetsItemProvider((MethodPlugin)parentElement);
-			if (roleSets != null && !roleSets.getChildren(roleSets).isEmpty()) {
-				children.add(roleSets);
-			}
-			ToolsItemProvider tools = (ToolsItemProvider)TngUtil.getToolsItemProvider((MethodPlugin)parentElement);
-			if (tools != null && !tools.getChildren(tools).isEmpty()) {
-				children.add(tools);
-			}
-			
-			// add CustomCategories provider
-			// get root CC of plugin
-			CustomCategory rootCC = (TngUtil.getRootCustomCategory((MethodPlugin)parentElement));
-			if (rootCC != null && !rootCC.getCategorizedElements().isEmpty()) {
-				children.add(rootCC);
-			}
-//			children = unwrapFVWIPs(children);
-//			children = filterCategoryElements(parentElement, children);
-		} else if (parentElement instanceof PluginUIPackagesItemProvider) {
-			children.addAll(Arrays.asList(super.getChildren(parentElement)));
-			children = filterPlugin(children);
-		} else if (parentElement instanceof ContentCategory) {
-			children.addAll(Arrays.asList(super.getChildren(parentElement)));
-//			children = unwrapFVWIPs(children);
-			children = filterCategoryElements(parentElement, children);
-		} else if (parentElement instanceof FeatureValueWrapperItemProvider) {
-			children.addAll(Arrays.asList(super.getChildren(parentElement)));
-//			children = unwrapFVWIPs(children);
-			children = filterCategoryElements(parentElement, children);
-		} else if (parentElement instanceof MethodLibrary) {
-			children.addAll(Arrays.asList(super.getElements(parentElement)));
-			children = filterPlugin(children);
-		} else if (parentElement instanceof TransientGroupItemProvider) {
-			children.addAll(Arrays.asList(super.getChildren(parentElement)));
-		}
-		createChildParentMap(parentElement, children);
-		return children.toArray();
-	}
-	
-	private void createChildParentMap(Object parent, Collection children) {
-		if (children == null || children.size() == 0) {
-			return;
-		}
-		for (Iterator iter = children.iterator();iter.hasNext();) {
-			Object child = iter.next();
-			// if the parent is a UI folder, map the child to the parent
-			// so that we can get the parent later
-			// if ( !(parent instanceof MethodElement) )
-			{
-				childUIParentMap.put(child, parent);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-	
-	private Collection<Object> filterPlugin(Collection<Object> elements) {
-		for (Iterator iter = elements.iterator();iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof MethodPlugin) {
-				// filter out plugins that have no CC's
-				if (!hasChildren((MethodPlugin)element) || !config.getMethodPluginSelection().contains(element)) {
-					iter.remove();
-				}
-			} else if (element instanceof PluginUIPackagesItemProvider) {
-				// filter out plugin packages that have no plugins with CC's
-				if (!hasChildren((PluginUIPackagesItemProvider)element)) {
-					iter.remove();
-				}
-			} else if (element instanceof ConfigurationsItemProvider) {
-				// remove "Configurations" folder
-				iter.remove();
-			}
-		}
-		return elements;
-	}
-	
-	private Collection<Object> filterCategoryElements(Object parent, Collection<Object> elements) {
-		for (Iterator iter = elements.iterator();iter.hasNext();) {
-			Object element = iter.next();
-			element = TngUtil.unwrap(element);
-			if (!(element instanceof ContentCategory)) {
-				// remove non-ContentCategory
-				iter.remove();
-			}
-		}
-		return elements;
-	}
-	
-//	private Collection<Object> unwrapFVWIPs(Collection<Object> elements) {
-//		Collection<Object> result = new ArrayList<Object>();
-//		for (Iterator iter = elements.iterator();iter.hasNext();) {
-//			Object element = iter.next();
-//			element = TngUtil.unwrap(element);
-//			if (element instanceof CustomCategory) {
-//				result.add(getFirstTreeItemForCC((CustomCategory)element));
-//			} else if (element instanceof ContentCategory) {
-//				result.add(element);
-//			} else if (element instanceof TransientCategoryPackageItemProvider) {
-//				result.add(element);
-//			}
-//		}
-//		return result;
-//	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		if (childUIParentMap.containsKey(element)) {
-			return childUIParentMap.get(element);
-		} else {
-			return null;
-			// try to determine parent
-//			Object parent = super.getParent(element);
-//			if (parent instanceof ContentPackage && 
-//					element instanceof ContentCategory) {
-//				return LibraryUtil.getMethodPlugin((ContentCategory)element);
-//			} else if (parent instanceof CustomCategory) {
-//				parent = getFirstTreeItemForCC((CustomCategory)parent);
-//			}
-//			else if (parent instanceof FeatureValueWrapperItemProvider) {
-//				parent = TngUtil.unwrap(parent);
-//			}
-//			return parent;
-		}
-	}
-	
-	public Object getFirstTreeItemForCC(CustomCategory cc) {
-		// get ITreeContentProvider adapater
-		CustomCategoryItemProvider adapter = (CustomCategoryItemProvider) getAdapterFactory().adapt(cc, ITreeItemContentProvider.class);
-		for (Iterator iter = adapter.getNotifyChangedListeners().iterator(); iter.hasNext();) {
-			Object listener = iter.next();
-			if (listener instanceof FeatureValueWrapperItemProvider
-					&& TngUtil.unwrap(listener) == cc) {
-				return (FeatureValueWrapperItemProvider)listener;
-			}
-		}
-		return cc;
-	}
-
-	public Collection<Object> getTreeItems(Object item) {
-		List<Object> result = new ArrayList<Object>();
-		// get ITreeContentProvider adapater
-		List notifyChangedListeners = TngUtil.getNotifyChangedListeners(adapterFactory, item);
-		if (!notifyChangedListeners.isEmpty()) {
-			for (Iterator iterator = notifyChangedListeners.iterator(); iterator.hasNext();) {
-				Object listener = iterator.next();
-				if(listener instanceof ITreeItemContentProvider
-						&& TngUtil.unwrap(listener) == item) {
-					result.add(listener);
-				}
-			}
-		} else {
-			result.add(item);
-		}
-		return result;
-	}
-
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		Object[] children = getChildren(element);
-		return (children != null && children.length > 0);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		super.inputChanged(viewer, oldInput, newInput);
-		childUIParentMap.clear();
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		super.notifyChanged(notification);
-
-		if ((notification instanceof IViewerNotification)) {
-			final IViewerNotification vnt = (IViewerNotification) notification;
-			final Object element = vnt.getElement();
-			final CheckboxTreeViewer ctrl = ((CheckboxTreeViewer) super.viewer);
-			if (element != null && (vnt.getEventType() == Notification.ADD
-					|| vnt.getEventType() == Notification.SET)) {
-
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						ctrl.refresh();
-					}
-				});
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		childUIParentMap.clear();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryLabelProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryLabelProvider.java
deleted file mode 100644
index ac4f674..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryLabelProvider.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-
-/**
- * Label provider for Custom Category view of configuration page
- * 
- * @author Jeff Hardy
- */
-
-public class CategoryLabelProvider extends AdapterFactoryLabelProvider {
-
-	/**
-	 * Creates an instance
-	 * @param contentProvider
-	 */
-	public CategoryLabelProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	protected Image getImageFromObject(Object object) {
-		return ExtendedImageRegistry.getInstance().getImage(object);
-	}
-
-	/**
-	 * This implements {@link ILabelProvider}.getText by forwarding it to
-	 * an object that implements
-	 * {@link IItemLabelProvider#getText IItemLabelProvider.getText}
-	 */
-	public String getText(Object object) {
-		if (object instanceof ProcessComponent) {
-			Process proc = (Process) ((ProcessComponent) object)
-					.getProcess();
-			if (proc != null)
-				return proc.getPresentationName();
-			else
-				// if process is null, return processcomponent name
-				return ((ProcessComponent) object).getName();
-		} else
-			return super.getText(object);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.LabelProvider#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryTreeFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryTreeFilter.java
deleted file mode 100644
index 93bc1fe..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/CategoryTreeFilter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import java.util.Set;
-
-import org.eclipse.epf.authoring.ui.views.CategoryTreeViewerWrapper;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * Filter for Custom Category view of configuration page
- * 
- * @author Jeff Hardy
- */
-public class CategoryTreeFilter extends ViewerFilter {
-	
-	CategoryTreeViewerWrapper CCViewer;
-	
-	private boolean hideUnchecked = false;
-	
-	public CategoryTreeFilter(CategoryTreeViewerWrapper CCViewer) {
-		this.CCViewer = CCViewer;
-	}
-
-	@Override
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		if (hideUnchecked && !isChecked(element))
-			return false;
-		return true;
-	}
-
-	public boolean isHideUnchecked() {
-		return hideUnchecked;
-	}
-
-	public void toggleHideUnchecked() {
-		hideUnchecked = !hideUnchecked;
-	}
-	
-	private boolean isChecked(Object element) {
-		Set<Object> checkedItems = CCViewer.getAllCheckedTreeItems();
-		return checkedItems.contains(element);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ConfigurationLabelProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ConfigurationLabelProvider.java
deleted file mode 100644
index fac8a26..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ConfigurationLabelProvider.java
+++ /dev/null
@@ -1,183 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.authoring.gef.figures.Colors;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The label provider for the Configuration view tree,
- * 
- * @author Jinhua Xi
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ConfigurationLabelProvider extends VariabilityElementLabelProvider implements IColorProvider {
-	MethodConfiguration config = null;
-
-	public ConfigurationLabelProvider(MethodConfiguration config,
-			AdapterFactory adapterFactory) {
-		super(adapterFactory);
-		this.config = config;
-	}
-
-	/**
-	 * This implements {@link ILabelProvider}.getImage by forwarding it to an
-	 * object that implements
-	 * {@link IItemLabelProvider#getImage IItemLabelProvider.getImage}
-	 */
-	public Image getImage(Object object) {
-		// by default, return the default image
-		return super.getImage(object);
-	}
-
-	/**
-	 * This implements {@link ILabelProvider}.getText by forwarding it to an
-	 * object that implements
-	 * {@link IItemLabelProvider#getText IItemLabelProvider.getText}
-	 */
-	public String getText(Object object) {
-		String name = null;
-		Object element = null;
-		if (object instanceof MethodElement) {
-			element = ConfigurationHelper.getCalculatedElement(
-					(MethodElement) object, config);
-		}
-		else if (object instanceof FeatureValueWrapperItemProvider) {
-			element = ((FeatureValueWrapperItemProvider) object)
-					.getValue();
-		}
-		if(object instanceof IWrapperItemProvider){
-			element = TngUtil.unwrap(object);
-		}
-		
-		if(element != null) {
-			if (element instanceof BreakdownElement) {
-				name = ProcessUtil
-				.getPresentationName((BreakdownElement) element);
-			} else {
-				name = TngUtil.getPresentationName(element);
-			}
-
-			// name = ConfigurationHelper.getName((MethodElement)object,
-			// config);
-		}
-
-		if (name == null) {
-			name = super.getText(object);
-		}
-
-		return name;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int index) {
-		return getText(object);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Image getColumnImage(Object object, int index) {
-		// by default, return the default image
-		return getImage(object);
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#dispose()
-	 */
-	public void dispose() {
-		config = null;
-		super.dispose();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
-	 */
-	public Color getForeground(Object element) {
-		if (isSuppressed(element)) {
-			return Colors.SUPRESSED_ELEMENT_LABEL;
-		}
-		else if (isExternal(element)) {
-			return Colors.INHERITED_ELEMENT_LABEL;
-		}
-		return null;
-	}
-
-	private boolean isSuppressed(Object element) {
-		if (element instanceof BreakdownElement) {
-			org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess((BreakdownElement) element);
-			if(proc != null) {
-				return Suppression.getSuppression(proc).isSuppressed(element);
-			}
-		} else if (element instanceof BreakdownElementWrapperItemProvider) {
-			Object top = ((BreakdownElementWrapperItemProvider)element).getTopItem();
-			if(top instanceof org.eclipse.epf.uma.Process) {
-				return Suppression.getSuppression((Process) top).isSuppressed(element);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
-	 */
-	public Color getBackground(Object element) {
-		// let OS take control over tree widget background
-		// rather than sending one fixed background.
-		return null;
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.library.edit.util.VariabilityElementLabelProvider#isExternal(java.lang.Object)
-	 */
-	public boolean isExternal(Object element) {
-		return ProcessUtil.isInherited(element) || ProcessUtil.isContributed(element);
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.library.edit.util.VariabilityElementLabelProvider#getFont(java.lang.Object)
-	 */
-	public Font getFont(Object element) {
-		if (ProcessUtil.isInherited(element)) {
-			return italicFont;
-		}
-		else if(ProcessUtil.isContributed(element)) {
-			return boldItalicFont;
-		}
-		return regularFont;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/EditorPageElement.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/EditorPageElement.java
deleted file mode 100644
index bf21f53..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/EditorPageElement.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2006 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.osgi.framework.Bundle;
-
-
-/**
- * Models a <editorPage> element in the "org.eclipse.epf.authoring.ui.EditorPageProvider"
- * extension point.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class EditorPageElement {
-
-	// plugin bundle
-	Bundle bundle;
-	
-	// The page ID.
-	private String id;
-	
-	// The page name.
-	private String name;
-
-	// The contributor class for the page.
-	private String contributorClass;
-	
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param bundle
-	 * 			  Installed Bundle
-	 * @param id
-	 *            The page ID.
-	 * @param name
-	 *            The page name.            
-	 * @param contributorClass
-	 *            The page contributor class.
-	 */
-	public EditorPageElement(Bundle bundle, String id, String name, String contributorClass) {
-		this.bundle = bundle;
-		this.id = id;
-		this.name = name;
-		this.contributorClass = contributorClass;
-	}
-
-	/**
-	 * Returns the page ID.
-	 * 
-	 * @return The page ID.
-	 */
-	public String getId() {
-		return id;
-	}
-	
-	/**
-	 * Returns the page name.
-	 * 
-	 * @return The page name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Returns the page contributor class.
-	 * 
-	 * @return The page contributor class.
-	 */
-	public Object getContributorClass() throws Exception {
-		
-		Class clazz = bundle.loadClass(contributorClass);
-		return clazz.newInstance();	
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ExposedAdapterFactoryContentProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ExposedAdapterFactoryContentProvider.java
deleted file mode 100644
index 2c01647..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ExposedAdapterFactoryContentProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ExposedAdapterFactoryContentProvider extends
-		AdapterFactoryContentProvider implements IViewerProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public ExposedAdapterFactoryContentProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public Viewer getViewer() {
-		return viewer;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodEditorPageProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodEditorPageProvider.java
deleted file mode 100644
index 6cb732d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodEditorPageProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * Manages the <editorPage> elements defined via the
- * "org.eclipse.epf.authoring.ui.EditorPageProvider" extension point.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class MethodEditorPageProvider {
-
-	/**
-	 * The extension namespace.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAMESPACE = "org.eclipse.epf.authoring.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension name.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAME = "TaskEditorPageProvider"; //$NON-NLS-1$
-
-	/**
-	 * The extension Attributes
-	 */
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_ID = "id"; //$NON-NLS-1$
-
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_NAME = "name"; //$NON-NLS-1$
-
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	// Contains the editor page providers loaded via the
-	// "org.eclipse.epf.authoring.ui.MethodEditorPageProvider" extension point.
-	private ArrayList pageProviders = new ArrayList();
-
-	//	 The shared instance.
-	private static MethodEditorPageProvider instance = null;
-	
-	public static MethodEditorPageProvider getInstance() {
-		if (instance == null) {
-			synchronized (MethodEditorPageProvider.class) {
-				if (instance == null) {
-					instance = new MethodEditorPageProvider();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private MethodEditorPageProvider() {
-
-	}
-
-	/**
-	 * Returns all the page providers
-	 * 
-	 * @return all the page providers.
-	 */
-	public List getPageProviders() {
-		List pages = new ArrayList();
-		for (int i = 0; i < pageProviders.size(); i++) {
-			EditorPageElement pageElement = (EditorPageElement) pageProviders
-					.get(i);
-			Object contributorClass = null;
-			try {
-				contributorClass = pageElement.getContributorClass();
-			} catch (Exception e) {
-			}
-			pages.add(contributorClass);
-		}
-		return pages;
-	}
-
-	/**
-	 * Loads the configuration providers specified via the
-	 * "com.ibm.process.pageProviders" extension point.
-	 */
-	public void loadProviders() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				PAGE_PROVIDERS_EXTENSION_NAMESPACE,
-				PAGE_PROVIDERS_EXTENSION_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-
-				IConfigurationElement[] configElements = extension.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String id = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_ID);
-						String name = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_NAME);
-						String contributorClass = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_CLASS); 
-
-						EditorPageElement pageElement = new EditorPageElement(
-								bundle, id, name, contributorClass);
-						pageProviders.add(pageElement);
-						
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(
-								"Failed to load Editor Page Provider", e); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementLabelDecorator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementLabelDecorator.java
deleted file mode 100644
index 048b6e6..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementLabelDecorator.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IDecoratorManager;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Label decorator for method element
- * 
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class MethodElementLabelDecorator implements ILabelDecorator {
-	private static ILabelDecorator delegateDecorator;
-	
-	private static ILabelDecorator getDelegateDecorator() {
-		if (delegateDecorator == null) {
-			delegateDecorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator();
-		}
-		return delegateDecorator;
-	}
-	
-	private static IResource getWorkspaceResource(Object element) {
-		element = TngUtil.unwrap(element);
-		// don't decorate icon of predefined elements in library view b/c some of them are shown as UI folder
-		//
-		if(element instanceof MethodElement && TngUtil.isPredefined((MethodElement) element)) {
-			return null;
-		}
-		return PersistenceUtil.getWorkspaceResource(element);
-	}
-	
-	public MethodElementLabelDecorator() {
-		
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image, java.lang.Object)
-	 */
-	public Image decorateImage(Image image, Object element) {		
-		IResource wsRes = getWorkspaceResource(element);
-		if(wsRes != null) {
-			image = getDelegateDecorator().decorateImage(image, wsRes);
-		}
-		return getDelegateDecorator().decorateImage(image, element);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelDecorator#decorateText(java.lang.String, java.lang.Object)
-	 */
-	public String decorateText(String text, Object element) {
-		return text;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		getDelegateDecorator().addListener(listener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		IResource wsRes = getWorkspaceResource(element);
-		if(wsRes != null) {
-			return getDelegateDecorator().isLabelProperty(wsRes, property);
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		getDelegateDecorator().removeListener(listener);
-	}
-
-	public static void clearDecorationCache() {
-		IDecoratorManager decoratorManager = PlatformUI.getWorkbench().getDecoratorManager();
-		decoratorManager.update("org.eclipse.epf.authoring.ui.providers.MethodElementLightweightLabelDecorator"); //$NON-NLS-1$
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementLightweightLabelDecorator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementLightweightLabelDecorator.java
deleted file mode 100644
index d41974a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementLightweightLabelDecorator.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper;
-import org.eclipse.epf.authoring.ui.util.MethodRichTextMarkerHelper;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.1
- */
-public class MethodElementLightweightLabelDecorator implements
-		ILightweightLabelDecorator {
-	private static ImageDescriptor overlay = null;
-	
-
-	public static final String DECORATOR_ID = "org.eclipse.epf.authoring.ui.providers.MethodElementLightweightLabelDecorator"; //$NON-NLS-1$
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object,
-	 *      org.eclipse.jface.viewers.IDecoration)
-	 */
-	public void decorate(Object element, IDecoration decoration) {
-		try {
-			if(LibraryValidationMarkerHelper.isInvalid(element)
-//					|| MethodRichTextMarkerHelper.isInvalid(element)
-					) {
-				decoration.addOverlay(getErrorOverlay());
-			}
-		}
-		catch(Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}	
-
-	/**
-	 * @return
-	 */
-	private static ImageDescriptor getErrorOverlay() {
-		if(overlay == null) {
-			overlay = AuthoringUIPlugin.getDefault().getImageDescriptor("full/ovr16/error_ovr.gif"); //$NON-NLS-1$
-		}
-		return overlay;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementUILabelProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementUILabelProvider.java
deleted file mode 100644
index 27dbe42..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/MethodElementUILabelProvider.java
+++ /dev/null
@@ -1,174 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Code taken from org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider
- * 
- */
-public class MethodElementUILabelProvider implements ILabelProvider {
-	
-	protected ListenerList fListeners = new ListenerList();
-	
-	ILabelProvider fLabelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-			.getNavigatorView_ComposedAdapterFactory());
-	
-	private ArrayList<ILabelDecorator> fLabelDecorators;
-
-	/**
-	 * Creates a new label provider with default flags.
-	 */
-	public MethodElementUILabelProvider() {
-		fLabelDecorators= null; 
-	}
-	
-	/**
-	 * Adds a decorator to the label provider
-	 */
-	public void addLabelDecorator(ILabelDecorator decorator) {
-		if (fLabelDecorators == null) {
-			fLabelDecorators= new ArrayList<ILabelDecorator>(2);
-		}
-		fLabelDecorators.add(decorator);
-	}
-	
-	protected Image decorateImage(Image image, Object element) {
-		if (fLabelDecorators != null && image != null) {
-			for (int i= 0; i < fLabelDecorators.size(); i++) {
-				ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
-				image= decorator.decorateImage(image, element);
-			}
-		}
-		return image;
-	}
-
-	/* (non-Javadoc)
-	 * @see ILabelProvider#getImage
-	 */
-	public Image getImage(Object element) {
-		Image result= fLabelProvider.getImage(element);
-		return decorateImage(result, element);
-	}
-
-	protected String decorateText(String text, Object element) {
-		if (fLabelDecorators != null && text.length() > 0) {
-			for (int i= 0; i < fLabelDecorators.size(); i++) {
-				ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
-				text= decorator.decorateText(text, element);
-			}
-		}	
-		return text;
-	}
-
-
-	/* (non-Javadoc)
-	 * @see ILabelProvider#getText
-	 */
-	public String getText(Object element) {
-		String result= fLabelProvider.getText(element);
-		return decorateText(result, element);
-	}
-
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#dispose
-	 */
-	public void dispose() {
-		if (fLabelDecorators != null) {
-			for (int i= 0; i < fLabelDecorators.size(); i++) {
-				ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
-				decorator.dispose();
-			}
-			fLabelDecorators= null;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		if (fLabelDecorators != null) {
-			for (int i= 0; i < fLabelDecorators.size(); i++) {
-				ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
-				decorator.addListener(listener);
-			}
-		}
-		fListeners.add(listener);	
-	}
-
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#isLabelProperty(Object, String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		return true;	
-	}
-
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		if (fLabelDecorators != null) {
-			for (int i= 0; i < fLabelDecorators.size(); i++) {
-				ILabelDecorator decorator= (ILabelDecorator) fLabelDecorators.get(i);
-				decorator.removeListener(listener);
-			}
-		}
-		fListeners.remove(listener);	
-	}
-	
-	public static ILabelDecorator[] getDecorators(boolean errortick, ILabelDecorator extra) {
-		if (errortick) {
-			if (extra == null) {
-				return new ILabelDecorator[] {};
-			} else {
-				return new ILabelDecorator[] { extra };
-			}
-		}
-		if (extra != null) {
-			return new ILabelDecorator[] { extra };
-		}
-		return null;
-	}
-	
-    /**
-     * Fires a label provider changed event to all registered listeners
-     * Only listeners registered at the time this method is called are notified.
-     *
-     * @param event a label provider changed event
-     *
-     * @see ILabelProviderListener#labelProviderChanged
-     */
-    protected void fireLabelProviderChanged(final LabelProviderChangedEvent event) {
-        Object[] listeners = fListeners.getListeners();
-        for (int i = 0; i < listeners.length; ++i) {
-            final ILabelProviderListener l = (ILabelProviderListener) listeners[i];
-            SafeRunner.run(new SafeRunnable() {
-                public void run() {
-                    l.labelProviderChanged(event);
-                }
-            });
-        }
-    }
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ProblemsLabelDecorator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ProblemsLabelDecorator.java
deleted file mode 100644
index ff1c32e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ProblemsLabelDecorator.java
+++ /dev/null
@@ -1,259 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.internal.IProblemChangedListener;
-import org.eclipse.epf.authoring.ui.internal.ImageDescriptorRegistry;
-import org.eclipse.epf.authoring.ui.internal.ImageImageDescriptor;
-import org.eclipse.epf.authoring.ui.internal.MethodElementImageDescriptor;
-import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-
-/**
- * Code taken from org.eclipse.jdt.ui.ProblemsLabelDecorator 
- *
- */
-public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabelDecorator {
-	
-	/**
-	 * This is a special <code>LabelProviderChangedEvent</code> carrying additional 
-	 * information whether the event origins from a maker change.
-	 * <p>
-	 * <code>ProblemsLabelChangedEvent</code>s are only generated by <code>
-	 * ProblemsLabelDecorator</code>s.
-	 * </p>
-	 */
-	public static class ProblemsLabelChangedEvent extends LabelProviderChangedEvent {
-
-		private static final long serialVersionUID= 1L;
-		
-		private boolean fMarkerChange;
-
-		/**
-		 * Note: This constructor is for internal use only. Clients should not call this constructor.
-		 * 
-		 * @param eventSource the base label provider
-		 * @param changedResource the changed resources
-		 * @param isMarkerChange <code>true<code> if the change is a marker change; otherwise
-		 *  <code>false</code> 
-		 */
-		public ProblemsLabelChangedEvent(IBaseLabelProvider eventSource, IResource[] changedResource, boolean isMarkerChange) {
-			super(eventSource, changedResource);
-			fMarkerChange= isMarkerChange;
-		}
-		
-		/**
-		 * Returns whether this event origins from marker changes. If <code>false</code> an annotation 
-		 * model change is the origin. In this case viewers not displaying working copies can ignore these 
-		 * events.
-		 * 
-		 * @return if this event origins from a marker change.
-		 */
-		public boolean isMarkerChange() {
-			return fMarkerChange;
-		}
-
-	}
-
-	private static final int ERRORTICK_ERROR= MethodElementImageDescriptor.ERROR;	
-
-	private ImageDescriptorRegistry fRegistry;
-	private boolean fUseNewRegistry= false;
-	private IProblemChangedListener fProblemChangedListener;
-	
-	private ListenerList fListeners;
-
-	/**
-	 * Creates a new <code>ProblemsLabelDecorator</code>.
-	 */
-	public ProblemsLabelDecorator() {
-		this(null);
-		fUseNewRegistry= true;
-	}
-	
-	/**
-	 * Note: This constructor is for internal use only. Clients should not call this constructor.
-	 * 
-	 * @param registry The registry to use or <code>null</code> to use the Java plugin's
-	 *  image registry
-	 */
-	public ProblemsLabelDecorator(ImageDescriptorRegistry registry) {
-		fRegistry= registry;
-		fProblemChangedListener= null;
-	}
-	
-	private ImageDescriptorRegistry getRegistry() {
-		if (fRegistry == null) {
-			fRegistry= fUseNewRegistry ? new ImageDescriptorRegistry() : AuthoringUIPlugin.getImageDescriptorRegistry();
-		}
-		return fRegistry;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see ILabelDecorator#decorateText(String, Object)
-	 */
-	public String decorateText(String text, Object element) {
-		return text;
-	}	
-
-	/* (non-Javadoc)
-	 * @see ILabelDecorator#decorateImage(Image, Object)
-	 */
-	public Image decorateImage(Image image, Object obj) {
-		int adornmentFlags= computeAdornmentFlags(obj);
-		if (adornmentFlags != 0) {
-			ImageDescriptor baseImage= new ImageImageDescriptor(image);
-			Rectangle bounds= image.getBounds();
-			return getRegistry().get(new MethodElementImageDescriptor(baseImage, adornmentFlags, new Point(bounds.width, bounds.height)));
-		}
-		return image;
-	}
-
-	/**
-	 * Note: This method is for internal use only. Clients should not call this method.
-	 * 
-	 * @param obj the element to compute the flags for
-	 * 
-	 * @return the adornment flags
-	 */
-	protected int computeAdornmentFlags(Object obj) {
-		try {
-			if (obj instanceof MethodElement) {
-				return getErrorTicksFromMarkers((MethodElement) obj, PersistenceUtil.getWorkspaceResource(obj), IResource.DEPTH_INFINITE);
-			} else if (obj instanceof IResource) {
-				return getErrorTicksFromMarkers(null, (IResource) obj, IResource.DEPTH_INFINITE);
-			}
-		} catch (CoreException e) {
-			if (e.getStatus().getCode() == IResourceStatus.MARKER_NOT_FOUND) {
-				return 0;
-			}
-			
-			AuthoringUIPlugin.log(e);
-		}
-		return 0;
-	}
-
-	private int getErrorTicksFromMarkers(MethodElement e, IResource res,
-			int depth) throws CoreException {
-		if (res == null || !res.isAccessible()) {
-			return 0;
-		}
-		int info = 0;
-
-		IMarker[] markers = res.findMarkers(IMarker.PROBLEM, true, depth);
-		if (markers != null) {
-			for (int i = 0; i < markers.length && (info != ERRORTICK_ERROR); i++) {
-				IMarker curr = markers[i];
-				int priority = curr.getAttribute(IMarker.SEVERITY, -1);
-				if (priority == IMarker.SEVERITY_ERROR
-						&& (e == null || e
-								.getGuid()
-								.equals(
-										curr
-												.getAttribute(LibraryValidationMarkerHelper.GUID)))) {
-					info = ERRORTICK_ERROR;
-				}
-			}
-		}
-		return info;
-	}
-	
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if (fProblemChangedListener != null) {
-			AuthoringUIPlugin.getDefault().getProblemMarkerManager().removeListener(fProblemChangedListener);
-			fProblemChangedListener= null;
-		}
-		if (fRegistry != null && fUseNewRegistry) {
-			fRegistry.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#isLabelProperty(Object, String)
-	 */
-	public boolean isLabelProperty(Object element, String property) {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#addListener(ILabelProviderListener)
-	 */
-	public void addListener(ILabelProviderListener listener) {
-		if (fListeners == null) {
-			fListeners= new ListenerList();
-		}
-		fListeners.add(listener);
-		if (fProblemChangedListener == null) {
-			fProblemChangedListener= new IProblemChangedListener() {
-				public void problemsChanged(IResource[] changedResources, boolean isMarkerChange) {
-					fireProblemsChanged(changedResources, isMarkerChange);
-				}
-			};
-			AuthoringUIPlugin.getDefault().getProblemMarkerManager().addListener(fProblemChangedListener);
-		}
-	}	
-
-	/* (non-Javadoc)
-	 * @see IBaseLabelProvider#removeListener(ILabelProviderListener)
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-		if (fListeners != null) {
-			fListeners.remove(listener);
-			if (fListeners.isEmpty() && fProblemChangedListener != null) {
-				AuthoringUIPlugin.getDefault().getProblemMarkerManager().removeListener(fProblemChangedListener);
-				fProblemChangedListener= null;
-			}
-		}
-	}
-	
-	private void fireProblemsChanged(IResource[] changedResources, boolean isMarkerChange) {
-		if (fListeners != null && !fListeners.isEmpty()) {
-			LabelProviderChangedEvent event= new ProblemsLabelChangedEvent(this, changedResources, isMarkerChange);
-			Object[] listeners= fListeners.getListeners();
-			for (int i= 0; i < listeners.length; i++) {
-				((ILabelProviderListener) listeners[i]).labelProviderChanged(event);
-			}
-		}
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
-	 */
-	public void decorate(Object element, IDecoration decoration) { 
-		int adornmentFlags= computeAdornmentFlags(element);
-		if (adornmentFlags == ERRORTICK_ERROR) {
-			decoration.addOverlay(AuthoringUIImages.IMG_DESC_OVR_ERROR);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ProcessEditorPageProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ProcessEditorPageProvider.java
deleted file mode 100644
index e07755a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/ProcessEditorPageProvider.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * Manages the <editorPage> elements defined via the
- * "org.eclipse.epf.authoring.ui.EditorPageProvider" extension point.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ProcessEditorPageProvider {
-
-	/**
-	 * The extension namespace.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAMESPACE = "org.eclipse.epf.authoring.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension name.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAME = "ProcessEditorPageProvider"; //$NON-NLS-1$
-
-	/**
-	 * The extension Attributes
-	 */
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_ID = "id"; //$NON-NLS-1$
-
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_NAME = "name"; //$NON-NLS-1$
-
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	// Contains the editor page providers loaded via the
-	// "org.eclipse.epf.authoring.ui.ProcessEditorPageProvider" extension point.
-	private ArrayList pageProviders = new ArrayList();
-
-	//	 The shared instance.
-	private static ProcessEditorPageProvider instance = null;
-	
-	public static ProcessEditorPageProvider getInstance() {
-		if (instance == null) {
-			synchronized (ProcessEditorPageProvider.class) {
-				if (instance == null) {
-					instance = new ProcessEditorPageProvider();
-				}
-			}
-		}
-		return instance;
-	}
-
-	
-	/**
-	 * Creates a new instance.
-	 */
-	private ProcessEditorPageProvider() {
-
-	}
-
-	/**
-	 * Returns all the page providers
-	 * 
-	 * @return all the page providers.
-	 */
-	public List getPageProviders() {
-		List pages = new ArrayList();
-		for (int i = 0; i < pageProviders.size(); i++) {
-			EditorPageElement pageElement = (EditorPageElement) pageProviders
-					.get(i);
-			Object contributorClass = null;
-			try {
-				contributorClass = pageElement.getContributorClass();
-			} catch (Exception e) {
-			}
-			pages.add(contributorClass);
-		}
-		return pages;
-	}
-	
-	/**
-	 * Loads the configuration providers specified via the
-	 * "com.ibm.process.pageProviders" extension point.
-	 */
-	public void loadProviders() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				PAGE_PROVIDERS_EXTENSION_NAMESPACE,
-				PAGE_PROVIDERS_EXTENSION_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-				
-				IConfigurationElement[] configElements = extension.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String id = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_ID);
-						String name = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_NAME);
-						String contributorClass = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_CLASS); 
-						EditorPageElement pageElement = new EditorPageElement(bundle,
-								id, name, contributorClass);
-						pageProviders.add(pageElement);
-					} catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(
-								"Failed to load Editor Page Provider", e); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/VariabilityElementLabelProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/VariabilityElementLabelProvider.java
deleted file mode 100644
index e5727cd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/VariabilityElementLabelProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.providers;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class VariabilityElementLabelProvider extends
-		AdapterFactoryLabelProvider implements IFontProvider {
-
-	protected static Font regularFont;
-
-	protected static Font boldFont;
-
-	protected static Font italicFont;
-	
-	protected static Font boldItalicFont;
-
-	protected static Font strikeoutFont;	
-
-	static {
-		Font defaultFont = JFaceResources.getDefaultFont();
-		regularFont = defaultFont;
-		FontData[] fds = JFaceResources.getDefaultFont().getFontData();
-		if (fds.length > 0) {
-			FontData fd = fds[0];
-			int h = fd.getHeight();
-			Display display = Display.getDefault();
-			boldFont = new Font(display, fd.getName(), h, fd.getStyle()
-					| SWT.BOLD);
-			italicFont = new Font(display, fd.getName(), h, fd.getStyle()
-					| SWT.ITALIC);
-			boldItalicFont = new Font(display, fd.getName(), h, fd.getStyle()
-					| SWT.BOLD | SWT.ITALIC);
-		}
-	}
-
-	public static final Font getItalicFont() {
-		return italicFont;
-	}
-
-	public static final Font getDefaultFont() {
-		return regularFont;
-	}
-
-	/**
-	 * @param adapterFactory
-	 */
-	public VariabilityElementLabelProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-
-	}
-
-	public void dispose() {
-		super.dispose();
-	}
-
-	public Font getFont(Object element) {
-		if (isExternal(element)) {
-			return italicFont;
-		}
-		return boldFont;
-	}
-
-	public abstract boolean isExternal(Object element);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/package.html
deleted file mode 100644
index 326f3e7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/providers/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides extension point management for the Authoring UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/IMethodRichText.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/IMethodRichText.java
deleted file mode 100644
index 074a643..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/IMethodRichText.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.richtext;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.swt.widgets.Label;
-
-
-/**
- * The interface for a Rich Text control used in the Method editors.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IMethodRichText extends IRichText {
-
-	/**
-	 * Returns the method element associated with this rich text control.
-	 */
-	public MethodElement getMethodElement();
-
-	/**
-	 * Returns the modal object associated with this rich text control.
-	 */
-	public EObject getModalObject();
-
-	/**
-	 * Sets the modal object associated with this rich text control.
-	 */
-	public void setModalObject(EObject modalObject);
-
-	/**
-	 * Returns modal object feature associated with this rich text control.
-	 */
-	public EStructuralFeature getModalObjectFeature();
-
-	/**
-	 * Sets the modal object feature associated with this rich text control.
-	 */
-	public void setModalObjectFeature(EStructuralFeature modalObjectFeature);
-
-	/**
-	 * Initialize the MethodRichText with the edited MethodElemnt and name of the field
-	 * @param element
-	 * @param fieldName
-	 */
-	public void init(MethodElement element, Label label);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/IMethodRichTextEditor.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/IMethodRichTextEditor.java
deleted file mode 100644
index a9f539d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/IMethodRichTextEditor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.richtext;
-
-import org.eclipse.epf.richtext.IRichTextEditor;
-import org.eclipse.epf.richtext.IRichTextToolBar;
-
-/**
- * The interface for a Rich Text editor used in the Method editors.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IMethodRichTextEditor extends IMethodRichText, IRichTextEditor {
-
-	/**
-	 * Fills the Rich Text editor tool bar with action items.
-	 * 
-	 * @param toolBar
-	 *            The Rich text editor tool bar.
-	 */
-	public void fillToolBar(IRichTextToolBar toolBar);
-	
-	/**
-	 * Selects the Rich Text or HTML tab.
-	 * 
-	 * @param index
-	 *            0 for the Rich Text tab, 1 for the HTML tab.
-	 */
-	public void setSelection(int index);	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/package.html
deleted file mode 100644
index 6d8eff9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/richtext/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides rich text editing support for the editors and Properties view.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/AuthoringAccessibleListener.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/AuthoringAccessibleListener.java
deleted file mode 100644
index bf4bcfe..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/AuthoringAccessibleListener.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.accessibility.AccessibleListener;
-
-/**
- * Accessible listener while authoring the content
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- *
- */
-public class AuthoringAccessibleListener implements AccessibleListener {
-	
-	private String description;
-	private String name;
-	
-	/**
-	 * Creates an instance
-	 * @param name
-	 */
-	public AuthoringAccessibleListener(String name){
-		this.name = name;
-	}
-	
-	/**
-	 * Create an instance
-	 * @param name
-	 * @param description
-	 */
-	public AuthoringAccessibleListener(String name, String description){
-		this.name = name;
-		this.description = description;
-	}
-	
-	/**
-	 * @see org.eclipse.swt.accessibility.AccessibleListener#getDescription(org.eclipse.swt.accessibility.AccessibleEvent)
-	 */
-	public void getDescription(AccessibleEvent e) {
-		e.result = this.description;
-	}
-
-	/**
-	 * @see org.eclipse.swt.accessibility.AccessibleListener#getHelp(org.eclipse.swt.accessibility.AccessibleEvent)
-	 */
-	public void getHelp(AccessibleEvent e) {
-
-	}
-
-	/**
-	 * @see org.eclipse.swt.accessibility.AccessibleListener#getKeyboardShortcut(org.eclipse.swt.accessibility.AccessibleEvent)
-	 */
-	public void getKeyboardShortcut(AccessibleEvent e) {
-	
-	}
-
-	/**
-	 * @see org.eclipse.swt.accessibility.AccessibleListener#getName(org.eclipse.swt.accessibility.AccessibleEvent)
-	 */
-	public void getName(AccessibleEvent e) {		
-		e.result = this.name;
-	}
-	
-	
-	/**
-	 * Set name for the listener
-	 * @param name
-	 */
-	public void setName(String name){
-		this.name = name;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerHelper.java
deleted file mode 100644
index a9466a8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerHelper.java
+++ /dev/null
@@ -1,381 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceListener;
-import org.eclipse.epf.library.configuration.closure.IConfigurationError;
-import org.eclipse.epf.library.edit.navigator.ConfigurationsItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.project.MethodLibraryProject;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.ui.ide.IDE;
-
-/**
- *  Helper class to handle Configuration error markers
- * @author Jeff Hardy
- * @author Jinhua Xi
- *
- */
-public class ConfigurationMarkerHelper {	
-	public static final ConfigurationMarkerHelper INSTANCE = new ConfigurationMarkerHelper();
-	public static final String ATTR_ERROR_ID = "errorID"; //$NON-NLS-1$
-	public static final String ATTR_CONFIG_GUID = "configGuid"; //$NON-NLS-1$
-	public static final String ATTR_ERROR_ELEMENT_GUID = "elementGuid"; //$NON-NLS-1$
-	public static final String ATTR_CAUSE_ELEMENT_GUID = "causeGuid"; //$NON-NLS-1$
-
-	// marker ID
-	public static final String MARKER_ID = "org.eclipse.epf.authoring.ui.configuration"; //$NON-NLS-1$
-
-	
-//	private Map<ElementDependencyError, IMarker> errorMarkerMap = new HashMap<ElementDependencyError, IMarker>();
-	
-	// private constructor
-	private ConfigurationMarkerHelper() {
-	}
-	
-	private static class ContainerMap extends HashMap<Object, Integer> {
-		/**
-		 * 
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public ContainerMap() {
-			super();
-			initMap();
-			LibraryService.getInstance().addListener(new LibraryServiceListener() {
-				public void libraryOpened(MethodLibrary library) {
-					initMap();
-				}
-				
-				public void libraryClosed(MethodLibrary library) {
-					clear();
-				}
-				
-				public void libraryReopened(MethodLibrary library) {
-					initMap();
-				}				
-			});
-		}
-		
-		private void initMap() {
-			clear();
-			
-			// fill this set with containers of marked objects
-			//
-			MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-			if(lib != null) {
-				IProject prj = MethodLibraryProject.findProject(lib);
-				if(prj != null) {
-					try {
-						IMarker[] markers = prj.findMarkers(INSTANCE.getMarkerID(), false, IResource.DEPTH_INFINITE);
-						for (int i = 0; i < markers.length; i++) {
-							IMarker marker = markers[i];
-							String guid = (String) marker.getAttribute(ATTR_CONFIG_GUID);
-							MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-							if(e != null) {
-								// remove its containers from containersOfMarkedObjects
-								//
-								markContainers(e);
-							}
-						}
-					} catch (CoreException e) {
-					}
-				}
-			}
-		}
-		
-		private void increment(Object object) {
-			Integer count;
-			if (containsKey(object)) {
-				count = get(object);
-			} else {
-				count = new Integer(0);
-			}
-			count++;
-			put(object, count);
-		}
-
-		private void decrement(Object object) {
-			if (containsKey(object)) {
-				Integer count = get(object);
-				if (count == 1) {
-					// remove object
-					remove(object);
-				} else {
-					count--;
-					put(object, count);
-				}
-			}
-		}
-		
-		private void markContainers(MethodElement e) {
-			for(EObject container = e.eContainer(); container != null; container = container.eContainer()) {
-				increment(container);
-			}
-		}
-
-		private void unmarkContainers(MethodElement e) {
-			for(EObject container = e.eContainer(); container != null; container = container.eContainer()) {
-				decrement(container);
-			}
-		}
-	}
-	
-	private static ContainerMap containersOfMarkedObjects = new ContainerMap();	
-	
-	
-	protected String getMarkerID() {
-		return MARKER_ID;
-	}
-	                                                                                                                             
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.ui.MarkerHelper#getFile(org.eclipse.emf.common.util.URI)
-	 */
-	protected IFile getFile(URI uri) {
-		if(uri.isFile()) {
-			return (IFile) FileManager.getResourceForLocation(uri.toFileString());
-		}
-	    String scheme = uri.scheme();
-	    if ("platform".equals(scheme) && uri.segmentCount() > 1 && "resource".equals(uri.segment(0))) //$NON-NLS-1$ //$NON-NLS-2$
-	    {
-	      StringBuffer platformResourcePath = new StringBuffer();
-	      for (int j = 1, size = uri.segmentCount(); j < size; ++j)
-	      {
-	        platformResourcePath.append('/');
-	        platformResourcePath.append(URI.decode(uri.segment(j)));
-	      }
-	      return ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(platformResourcePath.toString()));
-	    }
-	    return null;
-	}
-		
-	/**
-	 * Used by decorators to determine to put an error tick on the Object
-	 * @param object
-	 * @return
-	 */
-	public static boolean isInvalid(Object object) {
-		if (object instanceof ConfigurationsItemProvider) {
-			Collection children = ((ConfigurationsItemProvider)object).getChildren(object);
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object obj = TngUtil.unwrap(iter.next());
-				if(containersOfMarkedObjects.containsKey(obj)) {
-					return true;
-				}				
-				if (obj instanceof MethodConfiguration) {
-					if (INSTANCE.hasMarkers((MethodConfiguration)obj)) {
-						return true;
-					}
-				}
-			}
-			return false;
-		} else if (object instanceof MethodConfiguration) {
-			if (INSTANCE.hasMarkers((MethodConfiguration)object)) {
-				return true;
-			}
-		}
-		return containersOfMarkedObjects.containsKey(object);
-	}
-		    
-    public void deleteMarker(MethodConfiguration config, IConfigurationError error) {
-    	try {
-	    	IMarker marker = getMarker(config, error);
-	    	if (marker != null) {
-	    		marker.delete();
-	    		containersOfMarkedObjects.unmarkContainers(config);
-	    	}
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-    }
-	
-    public IMarker createMarker(MethodConfiguration config, IConfigurationError error) {
-//    	if (error.getErrorMethodElement() == null) return null;
-//    	if (error.getCauseMethodElement() == null) return null;
-    	
-    	IMarker existingMarker = getMarker(config, error);
-    	if (existingMarker != null) {
-    		adjustMarker(existingMarker, config, error);
-    		return existingMarker;
-    	}
-    	try {
-	    	IResource resource = getIResource(config);
-	    	if (resource != null && resource.exists()) {
-	    		IMarker marker = resource.createMarker(getMarkerID());
-	    		marker.setAttribute(IDE.EDITOR_ID_ATTR, "org.eclipse.epf.authoring.ui.editors.ConfigurationEditor"); //$NON-NLS-1$
-	    		adjustMarker(marker, config, error);
-	    		containersOfMarkedObjects.markContainers(config);
-	    		return marker;
-	    	}
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-    }
-    
-    public void adjustMarker(IMarker marker, MethodConfiguration config, IConfigurationError error) {
-    	if (config == null || error == null) return;
-       	try {
-       		if (marker == null) {
-       			// try to find marker
-       			marker = getMarker(config, error);
-       		}
-       		if (marker == null) return;
-			marker.setAttribute(IMarker.SEVERITY, error.getSeverity());
-	    	String message = getMessage(error);
-			marker.setAttribute(IMarker.MESSAGE, message);
-			marker.setAttribute(IMarker.LINE_NUMBER, 0);
-			marker.setAttribute(ATTR_CONFIG_GUID, config.getGuid());
-			marker.setAttribute(ATTR_ERROR_ID, error.getId());
-	    	if (error.getErrorMethodElement() != null) {
-				marker.setAttribute(IMarker.LOCATION, TngUtil.getLabelWithPath(error.getErrorMethodElement()));
-				marker.setAttribute(ATTR_ERROR_ELEMENT_GUID, error.getErrorMethodElement().getGuid());
-	    	}
-	    	if (error.getCauseMethodElement() != null) {
-	    		marker.setAttribute(ATTR_CAUSE_ELEMENT_GUID, error.getCauseMethodElement().getGuid());
-	    	}
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-   }
-    	
-    public boolean hasMarker(MethodConfiguration config, IConfigurationError error) {
-		if (getMarker(config, error) != null) {
-			return true;
-		}
-   		return false;
-    }
-    
-    /**                                                                                                
-     * Returns whether the a maker with id equals to the return of {@link #getMarkerID()}              
-     * is available in the IResource computed from the specified object.                               
-     * @param object                                                                                   
-     * @return boolean                                                                                 
-     */
-    public boolean hasMarkers(MethodConfiguration config) {
-    	IResource resource = getIResource(config);
-        if (resource != null && resource.exists()) {
-        	try {
-				IMarker[] markers = resource.findMarkers(getMarkerID(), true, IResource.DEPTH_ZERO);
-				return markers.length > 0;
-	  		} catch (CoreException e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			}
-        }
-        return false;
-    }
-    
-    public IMarker getMarker(MethodConfiguration config, IConfigurationError error) {
-    	if (config == null || error == null) {
-    		return null;
-    	}
-    	try {
-	    	IResource resource = getIResource(config);                                                     
-	        if (resource != null) {                                                     
-				IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-				for (int i = 0; i < markers.length; i++) {
-					IMarker marker = markers[i];
-					String markerErrorId = (String) marker.getAttribute(ATTR_ERROR_ID);
-					if (error.getId().equals(markerErrorId)) {
-						return marker;
-					}
-				}
-	        }
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-    }
-    
-    private String getMessage(IConfigurationError error) {
-    	return error.getErrorMessage();
-    }
-    
-    private IResource getIResource(MethodConfiguration config) {
-    	Resource resource = config.eResource();
-        URI uri = resource.getURI();
-        uri = resource.getResourceSet().getURIConverter().normalize(uri);
-        return getFile(uri);
-
-    }
-	
-	public MethodConfiguration getConfig(IMarker marker) {
-		if (marker == null) {
-			return null;
-		}
-		try {
-			String configGuid = (String) marker.getAttribute(ATTR_CONFIG_GUID);
-			MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(configGuid);
-			if (e instanceof MethodConfiguration) {
-				return (MethodConfiguration)e;
-			}
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-	
-	public MethodElement getErrorMethodElement(IMarker marker) {
-		if (marker == null) {
-			return null;
-		}
-		try {
-			String errorGuid = (String) marker.getAttribute(ATTR_ERROR_ELEMENT_GUID);
-			if (errorGuid != null) {
-				MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(errorGuid);
-				if (e instanceof MethodElement) {
-					return (MethodElement)e;
-				}
-			}
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-
-	public MethodElement getCauseMethodElement(IMarker marker) {
-		if (marker == null) {
-			return null;
-		}
-		try {
-			String causeGuid = (String) marker.getAttribute(ATTR_CAUSE_ELEMENT_GUID);
-			if (causeGuid != null) {
-				MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(causeGuid);
-				if (e instanceof MethodElement) {
-					return (MethodElement)e;
-				}
-			}
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerResolution.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerResolution.java
deleted file mode 100644
index 82c2652..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerResolution.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ConfigurationEditor;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMarkerResolution;
-
-/**
- *  MarkerResolution for Configuration errors
- * @author Jeff Hardy
- * @author Jinhua Xi
- *
- */
-public class ConfigurationMarkerResolution implements IMarkerResolution {
-	
-	protected MethodConfiguration config;
-	
-	protected MethodElement errorElement;
-
-	protected MethodElement causeElement;
-
-	public ConfigurationMarkerResolution(MethodConfiguration config, MethodElement errorElement, MethodElement causeElement) {
-		this.config = config;
-		this.errorElement = errorElement;
-		this.causeElement = causeElement;
-	}
-
-	public String getLabel() {
-		return AuthoringUIResources.ConfigurationMarkerResolutionGenerator_resolveMissingReference;
-	}
-
-	public void run(IMarker marker) {
-		//System.out.println("quick fix me");
-		try {
-			   // get the marker resource file
-	        if ((marker.getResource() instanceof IFile)) {
-	      
-	        	IFile file = (IFile) marker.getResource();
-	        	
-	        	ResourceSet resourceSet = LibraryService.getInstance().getCurrentMethodLibrary().eResource().getResourceSet();
-	        	MethodElement config = PersistenceUtil.getMethodElement(file, resourceSet);
-	        	IEditorPart editor = EditorChooser.getInstance().findEditor(config);
-	        	if ( editor instanceof ConfigurationEditor ) {
-	        		((ConfigurationEditor)editor).doQuickFix(marker);
-	        	}
-	        	
-	        }
-		} catch (Exception ex ) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(ex);
-		}
-        
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerResolutionGenerator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerResolutionGenerator.java
deleted file mode 100644
index 1496d67..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/ConfigurationMarkerResolutionGenerator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolutionGenerator;
-
-/**
- * Generates ConfigurationMarkerResolution's
- * @author Jeff Hardy
- *
- */
-public class ConfigurationMarkerResolutionGenerator implements IMarkerResolutionGenerator {
-	
-	private static final IMarkerResolution[] EMPTY_RESOLUTIONS = new IMarkerResolution[0];
-
-	private static final ConfigurationMarkerHelper markerHelper = ConfigurationMarkerHelper.INSTANCE;
-	
-	/**
-	 * @see org.eclipse.ui.IMarkerResolutionGenerator#getResolutions(org.eclipse.core.resources.IMarker)
-	 */
-	public IMarkerResolution[] getResolutions(IMarker marker) {
-		MethodConfiguration config = markerHelper.getConfig(marker);
-		MethodElement errorElement = markerHelper.getErrorMethodElement(marker);
-		MethodElement causeElement = markerHelper.getCauseMethodElement(marker);
-		try {
-			
-			// create MarkerResolutions
-			return new IMarkerResolution[] {new ConfigurationMarkerResolution(config, errorElement, causeElement)};
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return EMPTY_RESOLUTIONS;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/EditorsContextHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/EditorsContextHelper.java
deleted file mode 100644
index 571d74c..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/EditorsContextHelper.java
+++ /dev/null
@@ -1,164 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Editors context helper
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class EditorsContextHelper {
-
-	/**
-	 * Set context help for method element
-	 * @param uiComposite
-	 * @param obj
-	 */
-	public static void setHelp(Control uiComposite, Object obj) {
-		if (obj == null)
-			return;
-
-		obj = LibraryUtil.unwrap(obj);
-
-		if ((obj instanceof Role)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.EDITOR_ROLE_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof Task)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.EDITOR_TASK_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof WorkProduct)) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.EDITOR_WORK_PRODUCT_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof Guidance)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.EDITOR_GUIDANCE_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof Discipline)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.EDITOR_DISCIPLINE_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof DisciplineGrouping)) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.EDITOR_DISCIPLINE_GROUPING_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof Domain)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.EDITOR_DOMAIN_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof WorkProductType)) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.EDITOR_WORK_PRODUCT_TYPE_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof RoleSet)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.EDITOR_ROLE_SET_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof RoleSetGrouping)) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.EDITOR_ROLSE_SET_GROUPING_CONTEXT_HELP_ID);
-			return;
-		}
-		if ((obj instanceof Tool)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.EDITOR_TOOL_CONTEXT_HELP_ID);
-			return;
-		}
-		if (obj instanceof CustomCategory) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.EDITOR_CUSTOM_CATEGORY_CONTEXT_HELP_ID);
-			return;
-		}
-	}
-
-	/**
-	 * Set context help for process type
-	 * 
-	 * @param uiComposite
-	 * @param procType
-	 */
-	public static void setHelp(Control uiComposite, String procType) {
-		if ((procType != null && procType
-				.equalsIgnoreCase("capability pattern"))) { //$NON-NLS-1$
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.EDITOR_CP_DESCRIPTION_CONTEXT_HELP_ID);
-			return;
-		}
-
-		if ((procType != null && procType.equalsIgnoreCase("delivery process"))) { //$NON-NLS-1$
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.EDITOR_DP_DESCRIPTION_CONTEXT_HELP_ID);
-			return;
-		}
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-				AuthoringUIHelpContexts.EDITOR_DP_DESCRIPTION_CONTEXT_HELP_ID);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/LibraryValidationMarkerHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/LibraryValidationMarkerHelper.java
deleted file mode 100644
index 178c198..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/LibraryValidationMarkerHelper.java
+++ /dev/null
@@ -1,428 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.action.ValidateAction.EclipseResourcesUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceListener;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.element.TransientContentPackageItemProvider;
-import org.eclipse.epf.library.edit.navigator.ContentItemProvider;
-import org.eclipse.epf.library.edit.navigator.MethodPackagesItemProvider;
-import org.eclipse.epf.library.edit.navigator.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.1
- */
-public class LibraryValidationMarkerHelper extends EclipseResourcesUtil {	
-	public static final LibraryValidationMarkerHelper INSTANCE = new LibraryValidationMarkerHelper();
-	public static final String GUID = "guid"; //$NON-NLS-1$
-	
-	private static interface IParentProvider {
-		final IParentProvider containerProvider = new IParentProvider() {
-
-			public Collection<?> getParents(Object object) {
-				if(object instanceof EObject) {
-				return Collections.singleton(((EObject)object).eContainer());
-				}
-				return Collections.emptyList();
-			}
-			
-		};
-		
-		final IParentProvider parentCustomCategoryProvider = new IParentProvider() {
-
-			public Collection<?> getParents(Object object) {
-				if(object instanceof CustomCategory) {
-					return AssociationHelper.getCustomCategories((CustomCategory)object);
-				}
-				return Collections.emptyList();
-			}
-			
-		};
-		
-		final IParentProvider parentStandardCategoryProvider = new IParentProvider() {
-
-			public Collection<?> getParents(Object object) {
-				if(object instanceof Discipline) {
-					Discipline discipline = (Discipline) object;
-					List parentDisciplines = AssociationHelper.getDiscipline(discipline);
-					List disciplineGroupings = AssociationHelper.getDisciplineGroups(discipline);
-					if(!parentDisciplines.isEmpty() && !disciplineGroupings.isEmpty()) {
-						Collection<Object> parents = new ArrayList<Object>(disciplineGroupings);
-						parents.addAll(parentDisciplines);
-						return parents;
-					}
-					else {
-						return parentDisciplines.isEmpty() ? disciplineGroupings : parentDisciplines;
-					}
-				}
-				else if(object instanceof RoleSet) {
-					return AssociationHelper.getRoleSetGroups((RoleSet) object);
-				}
-				return Collections.emptyList();
-			}
-			
-		};
-		
-		Collection<?> getParents(Object object);
-	}
-	
-	private static class ErrorCalculator extends HashMap<MethodPlugin, Set<MethodElement>> {		
-		/**
-		 * 
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public ErrorCalculator() {
-			super();
-			initialize();
-			LibraryService.getInstance().addListener(new LibraryServiceListener() {
-				public void libraryOpened(MethodLibrary library) {
-					initialize();
-				}
-				
-				public void libraryClosed(MethodLibrary library) {
-					clear();
-				}
-				
-				public void libraryReopened(MethodLibrary library) {
-					initialize();
-				}				
-			});
-		}
-		
-		private void initialize() {
-			clear();
-			
-			// fill this set with containers of marked objects
-			//
-			MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-			if(lib != null) {
-				IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-				try {
-					IMarker[] markers = wsRoot.findMarkers(INSTANCE.getMarkerID(), false, IResource.DEPTH_INFINITE);
-					for (int i = 0; i < markers.length; i++) {
-						IMarker marker = markers[i];
-						String guid = (String) marker.getAttribute(GUID);
-						MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-						if(e != null) {
-							if(e.eIsProxy()) {
-								e = (MethodElement) PersistenceUtil.resolve(e,
-										LibraryService.getInstance()
-												.getCurrentMethodLibrary()
-												.eResource().getResourceSet());
-							}
-							// add the element to this set
-							//
-							addError(e);
-						}
-					}
-				} catch (CoreException e) {
-				}
-			}
-		}
-		
-		public void addError(MethodElement e) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-			if(plugin != null) {
-				Set<MethodElement> elements = get(plugin);
-				if(elements == null) {
-					elements = new HashSet<MethodElement>();
-					put(plugin, elements);
-				}
-				elements.add(e);
-			}
-		}
-		
-		public void removeError(MethodElement e) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-			if(plugin != null) {
-				Set<MethodElement> elements = get(plugin);
-				if(elements != null) {
-					elements.remove(e);
-					if(elements.isEmpty()) {
-						remove(plugin);
-					}
-				}
-			}
-		}
-		
-		public boolean hasErrors(MethodElement e) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-			if(plugin != null) {
-				Set<MethodElement> elements = get(plugin);
-				if(elements != null) {
-					if(elements.contains(e)) {
-						return true;
-					}
-
-					// check if e is container of any error element
-					//
-					HashSet<Object> processedChildren = null;
-					for (MethodElement me : elements) {
-						if(UmaUtil.isContainedBy(me, e)) {
-							return true;
-						}
-						if(me instanceof CustomCategory) {
-							if(processedChildren == null) {
-								processedChildren = new HashSet<Object>();
-							}
-							else {
-								processedChildren.clear();
-							}
-							if(isParentOf(me, e, IParentProvider.parentCustomCategoryProvider, processedChildren)) {
-								return true;
-							}
-						}
-						else if(me instanceof ContentCategory) {
-							// me must be a standard category
-							// currently all content packages that contain
-							// standard categories are not contained by
-							// predefined content package "Standard Categories"
-							// we need to handle this specially here
-							//
-							if(e instanceof ContentPackage && e == UmaUtil.findContentPackage(plugin, ModelStructure.DEFAULT.standardCategoryPath)) {
-								return true;
-							}
-							if(processedChildren == null) {
-								processedChildren = new HashSet<Object>();
-							}
-							else {
-								processedChildren.clear();
-							}
-							if(isParentOf(me, e, IParentProvider.parentStandardCategoryProvider, processedChildren)) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-			return false;
-		}
-		
-		private static boolean isParentOf(Object child, Object parent, IParentProvider parentProvider, Set<Object> processedChildren) {
-			processedChildren.add(child);
-			for (Object myParent : parentProvider.getParents(child)) {				
-				if(myParent == parent) {
-					return true;
-				}
-				if(!processedChildren.contains(myParent) && isParentOf(myParent, parent, parentProvider, processedChildren)) {
-					return true;
-				}				
-			}
-			return false;
-		}
-	}
-	
-	private static ErrorCalculator errorCalculator = new ErrorCalculator();	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.ui.MarkerHelper#getFile(org.eclipse.emf.common.util.URI)
-	 */
-	protected IFile getFile(URI uri) {
-		if(uri.isFile()) {
-			return (IFile) FileManager.getResourceForLocation(uri.toFileString());
-		}
-		return super.getFile(uri);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.ui.util.EditUIMarkerHelper#adjustMarker(org.eclipse.core.resources.IMarker, org.eclipse.emf.common.util.Diagnostic)
-	 */
-	protected boolean adjustMarker(IMarker marker, Diagnostic diagnostic) throws CoreException {
-		boolean ret = super.adjustMarker(marker, diagnostic);
-		if(!diagnostic.getData().isEmpty()) {
-			Object o = diagnostic.getData().get(0);
-			if(o instanceof MethodElement) {
-				marker.setAttribute(GUID, ((MethodElement)o).getGuid());
-				marker.setAttribute(IMarker.LOCATION, TngUtil.getLabelWithPath(o));
-	    		marker.setAttribute(IDE.EDITOR_ID_ATTR, "org.eclipse.epf.authoring.ui.editors.MethodElementEditor"); //$NON-NLS-1$
-	    		errorCalculator.addError((MethodElement) o);
-			}
-		}
-		return ret;
-	}
-	
-	public static boolean isInvalid(Object object) {
-		if(object instanceof ProcessesItemProvider) {
-			// this is an UI object: Processes
-			//
-			ProcessesItemProvider ip = (ProcessesItemProvider) object;
-			MethodElement o;			
-			return ((o = ip.getCapabilityPatternPackage()) != null && errorCalculator.hasErrors(o))
-				|| ((o = ip.getDeliveryProcessPackage()) != null && errorCalculator.hasErrors(o));
-		}
-		else if(object instanceof MethodPackagesItemProvider) {
-			// this is an UI object
-			//
-			object = ((ItemProviderAdapter)object).getTarget();			
-		}
-		else if(object instanceof ContentItemProvider) {
-			ContentPackage coreContentPkg = ((ContentItemProvider)object).getCoreContentPackage();
-			if(coreContentPkg != null) {
-				object = coreContentPkg.eContainer();
-			}
-		}
-		else if(object instanceof TransientContentPackageItemProvider) {
-			// this is an UI object: either Tasks, Roles, Work Products, or Guidance
-			//
-			Collection<?> children = ((TransientContentPackageItemProvider)object).getChildren(object);
-			for (Iterator<?> iter = children.iterator(); iter.hasNext();) {
-				Object child = TngUtil.unwrap(iter.next());
-				if(child instanceof MethodElement && errorCalculator.hasErrors((MethodElement) child)) {
-					return true;
-				}				
-			}
-			return false;
-		}
-		else if(object instanceof TransientGroupItemProvider) {
-			object = ((TransientGroupItemProvider)object).getTarget();
-		}
-		return ((object = TngUtil.unwrap(object)) instanceof MethodElement && errorCalculator
-				.hasErrors((MethodElement) object));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.ui.MarkerHelper#hasMarkers(java.lang.Object)
-	 */
-	public boolean hasMarkers(Object object) {
-		if(object instanceof MethodElement) {			
-			IResource resource = getFile(object);
-			if (resource != null && resource.exists())
-			{
-				try
-				{
-					String guid = ((MethodElement)object).getGuid();
-					IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-					for (int i = 0; i < markers.length; i++) {
-						IMarker marker = markers[i];
-						if(guid.equals(marker.getAttribute(GUID))) {
-							return true;
-						}
-					}
-				}
-				catch (CoreException e)
-				{
-				}
-			}
-			return false;
-		}
-
-		return super.hasMarkers(object);
-	}
-	
-	@Override
-	protected IFile getFile(Object datum) {
-		try {
-			return super.getFile(datum);
-		}
-		catch(Exception e) {
-			return null;
-		}
-	}
-	
-	public void deleteMarkers(Object object) {
-		if(object instanceof MethodElement) {
-			IResource resource = getFile(object);
-			if (resource != null && resource.exists())
-			{
-				try
-				{
-					MethodElement e = (MethodElement) object;
-					String guid = e.getGuid();
-					IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-					for (int i = 0; i < markers.length; i++) {
-						IMarker marker = markers[i];						
-						if(guid.equals(marker.getAttribute(GUID))) {
-							marker.delete();
-							errorCalculator.removeError(e);
-						}
-					}
-				}
-				catch (CoreException e)
-				{
-				}
-			}
-			return;
-		}
-		
-		super.deleteMarkers(object);
-	}
-
-	protected void deleteMarkers(IResource resource, boolean includeSubtypes, int depth) {
-		if (resource != null && resource.exists()) {
-			try {				
-				IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-				for (int i = 0; i < markers.length; i++) {
-					IMarker marker = markers[i];
-					String guid = (String) marker.getAttribute(GUID);
-					MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-					if(e != null) {
-						errorCalculator.removeError(e);
-					}
-				}
-
-			} catch (CoreException e) {
-				
-			}			
-		}
-			
-		super.deleteMarkers(resource, includeSubtypes, depth);
-	}
-
-	//Override to seperate error message in error dialog and problems view (bug 174351)
-	//Note: better fix is to extend BasicDiagnostic to encapsulate both types of msgs -> to do later
-	protected String composeMessage(Diagnostic diagnostic, Diagnostic parentDiagnostic) {
-		int ix = diagnostic.getMessage().indexOf(LibraryEditResources.duplicateElementNameError_msg2);
-		if (ix > 0) {
-			return diagnostic.getMessage().substring(0, ix);
-		}
-		return super.composeMessage(diagnostic, parentDiagnostic);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/MarkerResolutionGenerator.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/MarkerResolutionGenerator.java
deleted file mode 100644
index f41259d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/MarkerResolutionGenerator.java
+++ /dev/null
@@ -1,288 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.persistence.util.UnresolvedProxyMarkerManager;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolutionGenerator;
-import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
-
-/**
- * Create resolutions for the given marker
- * 
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class MarkerResolutionGenerator implements IMarkerResolutionGenerator {
-	private static final IMarkerResolution[] EMPTY_RESOLUTIONS = new IMarkerResolution[0];
-	
-	private static class ShowOwnerInLibraryView implements IMarkerResolution {
-
-		private Object owner;
-
-		/**
-		 * @param owner
-		 */
-		private ShowOwnerInLibraryView(Object owner) {
-			super();
-			this.owner = owner;
-		}
-
-		/**
-		 * @see org.eclipse.ui.IMarkerResolution#getLabel()
-		 */
-		public String getLabel() {
-			return AuthoringUIResources.MarkerResolutionGenerator_showOwnerInLibraryView;
-		}
-
-		/**
-		 * @see org.eclipse.ui.IMarkerResolution#run(org.eclipse.core.resources.IMarker)
-		 */
-		public void run(IMarker marker) {
-			LibraryView.getView().setSelectionToViewer(owner);
-		}
-		
-	}
-	
-	private static class MarkerResolution extends WorkbenchMarkerResolution {
-		private IMarker currentMarker;
-		private ReferenceInfo referenceInfo;
-
-		public MarkerResolution(IMarker currentMarker, ReferenceInfo referenceInfo) {
-			this.currentMarker = currentMarker;
-			this.referenceInfo = referenceInfo;
-		}
-		
-		/**
-		 * @see org.eclipse.ui.IMarkerResolution#getLabel()
-		 */
-		public String getLabel() {
-			return AuthoringUIResources.MarkerResolutionGenerator_removeUnresolvedReference;
-		}
-
-		/**
-		 * @see org.eclipse.ui.IMarkerResolution#run(org.eclipse.core.resources.IMarker)
-		 */
-		public void run(IMarker marker) {
-			ReferenceInfo refInfo = currentMarker.equals(marker) ? referenceInfo : getReferenceInfo(marker);
-			if(refInfo == null) {
-				return;
-			}
-			if(refInfo.reference.isMany()) {
-				((List<?>)refInfo.owner.eGet(refInfo.reference)).remove(refInfo.index);
-			}
-			else {
-				refInfo.owner.eSet(refInfo.reference, null);
-			}
-			boolean validate = false;
-			Resource resource = refInfo.owner.eResource();
-			ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
-					.getPersisterFor(resource).getFailSafePersister();
-			try {
-				persister.save(resource);
-				persister.commit();
-				validate = true;
-			}
-			catch(Exception e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				persister.rollback();
-			}
-			if(validate) { 				
-				ResourceSet resourceSet = resource.getResourceSet();
-				if(resourceSet instanceof MultiFileResourceSetImpl) {
-					((MultiFileResourceSetImpl)resourceSet).getMarkerMananger().doValidateMarkers(resource);
-				}
-			}
-		}
-
-		@Override
-		public IMarker[] findOtherMarkers(IMarker[] markers) {
-			ArrayList<IMarker> similarMarkerList = new ArrayList<IMarker>();
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				if(!currentMarker.equals(marker)) {
-					try {
-						if(UnresolvedProxyMarkerManager.MARKER_ID.equals(marker.getType())) {
-							similarMarkerList.add(marker);
-						}
-					} catch (CoreException e) {
-						//
-					}
-				}
-			}
-			IMarker[] similarMarkers = new IMarker[similarMarkerList.size()];
-			similarMarkerList.toArray(similarMarkers);
-			return similarMarkers;
-		}
-
-		public String getDescription() {
-			// TODO provide detailed description
-			return null;
-		}
-
-		public Image getImage() {
-			// TODO provide image
-			return null;
-		}
-		
-	}
-	
-	private static class ReferenceInfo {
-		private EObject owner;
-		private EReference reference;
-		private int index;
-		
-		public ReferenceInfo(EObject owner, EReference reference, int index) {
-			super();
-			this.owner = owner;
-			this.reference = reference;
-			this.index = index;
-		}
-				
-	}
-	
-	private static ReferenceInfo getReferenceInfo(IMarker marker) {
-		try {
-			String proxyURI = (String) marker.getAttribute(UnresolvedProxyMarkerManager.PROXY_URI);
-			String ownerGUID = (String) marker.getAttribute(UnresolvedProxyMarkerManager.OWNER_GUID);
-			if(proxyURI != null && ownerGUID != null) {
-				Resource resource = RefreshJob.getInstance().getResource(marker.getResource());
-				if(resource != null) {
-					EObject owner = resource.getEObject(ownerGUID);
-					if(owner != null) {
-						URI uri = URI.createURI(proxyURI);
-						// find the proxy
-						//
-						int index = -1;
-						EReference reference = null;
-						find_proxy_loop:
-						for (EReference ref : owner.eClass().getEAllReferences()) {
-							if(ref.isChangeable() && !ref.isDerived()) {
-								if(ref.isMany()) {
-									InternalEList list = (InternalEList) owner.eGet(ref);
-									int id = 0;
-									for (Iterator iterator = list.basicIterator(); iterator
-											.hasNext();) {
-										InternalEObject o = (InternalEObject) iterator.next();
-										if(o.eIsProxy() && uri.equals(o.eProxyURI())) {
-											index = id;
-											reference = ref;
-											break find_proxy_loop;
-										}
-										id++;
-									}
-								}
-								else {
-									InternalEObject o = (InternalEObject) owner.eGet(ref, false);
-									if(o != null && o.eIsProxy() && uri.equals(o.eProxyURI())) {
-										reference = ref;
-										break find_proxy_loop;
-									}
-								}
-							}
-						}
-						if(reference != null) {
-							return new ReferenceInfo(owner, reference, index);
-						}
-					}
-				}
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IMarkerResolutionGenerator#getResolutions(org.eclipse.core.resources.IMarker)
-	 */
-	public IMarkerResolution[] getResolutions(IMarker marker) {
-		ReferenceInfo refInfo = getReferenceInfo(marker);
-		if(refInfo != null) {
-			Object selectableOwner = getSelectableObject(refInfo.owner);
-			IMarkerResolution markerResolution = new MarkerResolution(marker, refInfo);
-			if(selectableOwner != null) {
-				return new IMarkerResolution[] {
-						markerResolution,
-						new ShowOwnerInLibraryView(selectableOwner)
-				};
-			}
-			else {
-				return new IMarkerResolution[] {
-						markerResolution
-				};
-			}
-		}
-		return EMPTY_RESOLUTIONS;
-	}
-
-	/**
-	 * Get selectable object 
-	 * @param owner
-	 * @return
-	 * 			object itself
-	 */
-	private static Object getSelectableObject(EObject owner) {
-		if(owner instanceof MethodPlugin || owner instanceof ContentElement || owner instanceof ContentPackage 
-				|| owner instanceof ProcessComponent) {
-			return owner;
-		}
-		if(owner instanceof MethodElement) {
-			ProcessComponent procComp = UmaUtil.getProcessComponent((MethodElement) owner);
-			if(procComp != null) {
-				return procComp;
-			}
-		}
-		if(owner instanceof ProcessPackage) {
-			return owner;
-		}
-		if(owner instanceof ContentDescription && owner.eContainer() instanceof ContentElement) {
-			return owner.eContainer(); 
-		}
-		Resource resource = owner.eResource();
-		MethodElement e = PersistenceUtil.getMethodElement(resource);
-		if(e != owner) {
-			return getSelectableObject(e);
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/MethodRichTextMarkerHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/MethodRichTextMarkerHelper.java
deleted file mode 100644
index fa4e43a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/MethodRichTextMarkerHelper.java
+++ /dev/null
@@ -1,357 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.action.ValidateAction.EclipseResourcesUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceListener;
-import org.eclipse.epf.library.edit.element.TransientContentPackageItemProvider;
-import org.eclipse.epf.library.edit.navigator.ContentItemProvider;
-import org.eclipse.epf.library.edit.navigator.MethodPackagesItemProvider;
-import org.eclipse.epf.library.edit.navigator.ProcessesItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.project.MethodLibraryProject;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * based on org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper 
- * @author Jeff Hardy
- *
- */
-public class MethodRichTextMarkerHelper extends EclipseResourcesUtil {	
-	public static final MethodRichTextMarkerHelper INSTANCE = new MethodRichTextMarkerHelper();
-	public static final String GUID = "guid"; //$NON-NLS-1$
-
-	// marker ID
-	public static final String MARKER_ID = "org.eclipse.epf.authoring.ui.methodRichText"; //$NON-NLS-1$
-	
-	// marker attribute
-	private static String METHOD_FIELDNAME = "MethodFieldName"; //$NON-NLS-1$
-
-	// private constructor
-	private MethodRichTextMarkerHelper() {
-	}
-	
-	private static class ContainerMap extends HashMap<Object, Integer> {
-		/**
-		 * 
-		 */
-		private static final long serialVersionUID = 1L;
-
-		public ContainerMap() {
-			super();
-			initMap();
-			LibraryService.getInstance().addListener(new LibraryServiceListener() {
-				public void libraryOpened(MethodLibrary library) {
-					initMap();
-				}
-				
-				public void libraryClosed(MethodLibrary library) {
-					clear();
-				}
-				
-				public void libraryReopened(MethodLibrary library) {
-					initMap();
-				}				
-			});
-		}
-		
-		private void initMap() {
-			clear();
-			
-			// fill this set with containers of marked objects
-			//
-//			MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-//			if(lib != null) {
-//				IProject prj = MethodLibraryProject.findProject(lib);
-//				if(prj != null) {
-//					try {
-//						IMarker[] markers = prj.findMarkers(INSTANCE.getMarkerID(), false, IResource.DEPTH_INFINITE);
-//						for (int i = 0; i < markers.length; i++) {
-//							IMarker marker = markers[i];
-//							String guid = (String) marker.getAttribute(GUID);
-//							MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-//							if(e != null) {
-//								// remove its containers from containersOfMarkedObjects
-//								//
-//								markContainers(e);
-//							}
-//						}
-//					} catch (CoreException e) {
-//					}
-//				}
-//			}
-		}
-		
-		private void increment(Object object) {
-			Integer count;
-			if (containsKey(object)) {
-				count = get(object);
-			} else {
-				count = new Integer(0);
-			}
-			count++;
-			put(object, count);
-		}
-
-		private void decrement(Object object) {
-			if (containsKey(object)) {
-				Integer count = get(object);
-				if (count == 1) {
-					// remove object
-					remove(object);
-				} else {
-					count--;
-					put(object, count);
-				}
-			}
-		}
-		
-		private void markContainers(MethodElement e) {
-			for(EObject container = e.eContainer(); container != null; container = container.eContainer()) {
-				increment(container);
-			}
-		}
-
-		private void unmarkContainers(MethodElement e) {
-			for(EObject container = e.eContainer(); container != null; container = container.eContainer()) {
-				decrement(container);
-			}
-		}
-	}
-	
-	private static ContainerMap containersOfMarkedObjects = new ContainerMap();	
-	
-	
-	protected String getMarkerID() {
-		return MARKER_ID;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.ui.MarkerHelper#getFile(org.eclipse.emf.common.util.URI)
-	 */
-	protected IFile getFile(URI uri) {
-		if(uri.isFile()) {
-			return (IFile) FileManager.getResourceForLocation(uri.toFileString());
-		}
-		return super.getFile(uri);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.ui.util.EditUIMarkerHelper#adjustMarker(org.eclipse.core.resources.IMarker, org.eclipse.emf.common.util.Diagnostic)
-	 */
-	protected boolean adjustMarker(IMarker marker, Diagnostic diagnostic) throws CoreException {
-		boolean ret = super.adjustMarker(marker, diagnostic);
-		if(!diagnostic.getData().isEmpty()) {
-			Object o = diagnostic.getData().get(0);
-			Object str = diagnostic.getData().get(1);
-			if(o instanceof MethodElement) {
-				marker.setAttribute(GUID, ((MethodElement)o).getGuid());
-				marker.setAttribute(IMarker.LOCATION, TngUtil.getLabel(o) + ", " + str); //$NON-NLS-1$
-	    		marker.setAttribute(IDE.EDITOR_ID_ATTR, "org.eclipse.epf.authoring.ui.editors.MethodElementEditor"); //$NON-NLS-1$
-			}
-			if (str instanceof String) {
-				marker.setAttribute(METHOD_FIELDNAME, (String)str);
-			}
-
-		}
-		return ret;
-	}
-	
-	public static boolean isInvalid(Object object) {
-		if(object instanceof ProcessesItemProvider) {
-			// this is an UI object: Processes
-			//
-			ProcessesItemProvider ip = (ProcessesItemProvider) object;
-			Object o;
-			return ((o = ip.getCapabilityPatternPackage()) != null && containersOfMarkedObjects.containsKey(o))
-				|| ((o = ip.getDeliveryProcessPackage()) != null && containersOfMarkedObjects.containsKey(o));
-		}
-		else if(object instanceof MethodPackagesItemProvider
-				|| object instanceof ContentItemProvider) {
-			// this is an UI object
-			//
-			object = ((ItemProviderAdapter)object).getTarget();
-		}
-		else if(object instanceof TransientContentPackageItemProvider) {
-			// this is an UI object: either Tasks, Roles, Work Products, or Guidance
-			//
-			Collection children = ((TransientContentPackageItemProvider)object).getChildren(object);
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object obj = iter.next();
-				if(containersOfMarkedObjects.containsKey(obj) || INSTANCE.hasMarkers(obj)) {
-					return true;
-				}				
-			}
-			return false;
-		}
-		return containersOfMarkedObjects.containsKey(object) || INSTANCE.hasMarkers(object);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.ui.MarkerHelper#hasMarkers(java.lang.Object)
-	 */
-	public boolean hasMarkers(Object object) {
-		if(object instanceof MethodElement) {
-			IResource resource = getFile(object);
-			if (resource != null && resource.exists())
-			{
-				try
-				{
-					String guid = ((MethodElement)object).getGuid();
-					IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-					for (int i = 0; i < markers.length; i++) {
-						IMarker marker = markers[i];
-						if(guid.equals(marker.getAttribute(GUID))) {
-							return true;
-						}
-					}
-				}
-				catch (CoreException e)
-				{
-				}
-			}
-			return false;
-		}
-
-		return super.hasMarkers(object);
-	}
-	
-	/**
-	 * Overrided to handle exception that is thrown if the object already has been unloaded
-	 * 
-	 * @see org.eclipse.emf.edit.ui.util.EditUIMarkerHelper#getFile(java.lang.Object)
-	 */
-	@Override
-	protected IFile getFile(Object datum) {
-		try {
-			return super.getFile(datum);
-		}
-		catch(Exception e) {
-			return null;
-		}
-	}
-	
-	public void deleteMarkers(Object object, String fieldName) {
-		if(object instanceof MethodElement) {
-			IResource resource = getFile(object);
-			if (resource != null)
-			{
-				try
-				{
-					String guid = ((MethodElement)object).getGuid();
-					IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-					for (int i = 0; i < markers.length; i++) {
-						IMarker marker = markers[i];
-						if(guid.equals(marker.getAttribute(GUID)) && (fieldName == null ||
-								fieldName.equals(marker.getAttribute(METHOD_FIELDNAME)))) {
-							marker.delete();
-//							MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-//							if(e != null) {
-//								// remove its containers from containersOfMarkedObjects
-//								//
-//								containersOfMarkedObjects.unmarkContainers(e);
-//							}
-						}
-					}
-				}
-				catch (CoreException e)
-				{
-				}
-			}
-			return;
-		}
-		
-		super.deleteMarkers(object);
-	}
-
-	protected void deleteMarkers(IResource resource, boolean includeSubtypes, int depth) {
-//		if (resource != null) {
-//			try {				
-//				IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-//				for (int i = 0; i < markers.length; i++) {
-//					IMarker marker = markers[i];
-//					String guid = (String) marker.getAttribute(GUID);
-//					MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-//					if(e != null) {
-//						// remove its containers from containersOfMarkedObjects
-//						//
-//						containersOfMarkedObjects.unmarkContainers(e);
-//					}
-//				}
-//
-//			} catch (CoreException e) {
-//				
-//			}			
-//		}
-			
-		super.deleteMarkers(resource, includeSubtypes, depth);
-	}
-	
-	protected void createMarkers(IResource resource, Diagnostic diagnostic, Diagnostic parentDiagnostic) throws CoreException {
-		super.createMarkers(resource, diagnostic, parentDiagnostic);
-//		String fieldName = null;
-//		if(!diagnostic.getData().isEmpty() && diagnostic.getData().size() > 1) {
-//			fieldName = (String)diagnostic.getData().get(1);
-//		}
-//		if (resource != null && fieldName != null) {
-//			try {				
-//				IMarker[] markers = resource.findMarkers(getMarkerID(), false, IResource.DEPTH_ZERO);
-//				for (int i = 0; i < markers.length; i++) {
-//					IMarker marker = markers[i];
-//					String guid = (String) marker.getAttribute(GUID);
-//					if(fieldName.equals(marker.getAttribute(METHOD_FIELDNAME))) {
-//						MethodElement e = LibraryService.getInstance().getCurrentLibraryManager().getMethodElement(guid);
-//						if(e != null) {
-//							// add its containers to containersOfMarkedObjects
-//							//
-//							containersOfMarkedObjects.markContainers(e);
-//						}
-//					}
-//				}
-//
-//			} catch (CoreException e) {
-//				
-//			}			
-//		}
-
-	}
-	
-    protected String composeMessage(Diagnostic diagnostic, Diagnostic parentDiagnostic)
-    {
-      String message = diagnostic.getMessage();
-      if (parentDiagnostic != null)
-      {
-        String parentMessage = parentDiagnostic.getMessage();
-        if (parentMessage != null)
-        {
-          message = message != null ? parentMessage + " " + message : parentMessage; //$NON-NLS-1$
-        }
-      }
-      return message;
-    }
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/RefreshHandler.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/RefreshHandler.java
deleted file mode 100644
index 6a20aac..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/RefreshHandler.java
+++ /dev/null
@@ -1,430 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.refresh.IRefreshHandler;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.LibrarySchedulingRule;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * Notify changes in resources to refresh
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RefreshHandler implements IRefreshHandler {
-	
-	private ViewPart view;
-
-
-	public RefreshHandler(ViewPart view) {
-		this.view = view;
-	}
-	
-	private Control getControl() {
-		if(view instanceof IViewerProvider) {
-			Viewer viewer = ((IViewerProvider)view).getViewer();
-			if(viewer != null) {
-				return viewer.getControl();
-			}
-		}
-		return null;
-	}
-
-	public void refresh(IProgressMonitor monitor) {
-		Control ctrl = getControl();
-		if (ctrl == null || ctrl.isDisposed())
-			return;
-
-		if (ctrl.getDisplay().getThread() == Thread.currentThread()) {
-			doRefresh(view.getSite().getShell());
-		} else {
-			ctrl.getDisplay().syncExec(new Runnable() {
-
-				public void run() {
-					doRefresh(null);
-				}
-
-			});
-		}
-	}
-	
-	private void doRefresh(Shell shell) {
-		final boolean refreshViews = !RefreshJob.getInstance()
-				.getReloadedBeforeRefreshResources().isEmpty()
-				|| !RefreshJob.getInstance().getAddedResources().isEmpty();
-		ArrayList<Resource> removedResources = new ArrayList<Resource>(RefreshJob.getInstance()
-				.getRemovedResources());
-		ArrayList<Resource> changedResources = new ArrayList<Resource>(RefreshJob.getInstance()
-				.getChangedResources());
-		ArrayList<IResource> addedWsResources = new ArrayList<IResource>(RefreshJob.getInstance()
-				.getAddedWorkspaceResources());
-
-		if (!removedResources.isEmpty() || !changedResources.isEmpty()
-				|| !addedWsResources.isEmpty() || refreshViews) {
-			blockingRefresh(removedResources, changedResources,
-					addedWsResources, shell);
-		}
-
-		if (!removedResources.isEmpty()) {
-			RefreshJob.getInstance().getRemovedResources().removeAll(
-					removedResources);
-		}
-		if (!changedResources.isEmpty()) {
-			RefreshJob.getInstance().getChangedResources().removeAll(
-					changedResources);
-		}
-		if (!addedWsResources.isEmpty()) {
-			RefreshJob.getInstance().getAddedWorkspaceResources().removeAll(
-					addedWsResources);
-		}
-		if (refreshViews) {
-			RefreshJob.getInstance().getReloadedBeforeRefreshResources()
-					.clear();
-			RefreshJob.getInstance().getAddedResources().clear();
-		}
-	}
-	
-	private void blockingRefresh(final ArrayList<Resource> removedResources,
-			final ArrayList<Resource> changedResources,
-			final Collection<IResource> addedWorkspaceResources,
-			Shell shell) {
-		final IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-				monitor
-						.subTask(AuthoringUIResources._UI_RefreshViewer_menu_item);
-				monitor.worked(1);
-				try {
-					// monitor.worked(1);
-					doRefresh(removedResources, changedResources,
-							addedWorkspaceResources);
-				} finally {
-					monitor.done();
-				}
-			}
-
-		};
-
-		IRunnableContext context = new ProgressMonitorDialog(shell);
-		try {
-			view.getSite().getWorkbenchWindow().getWorkbench().getProgressService()
-					.runInUI(
-							context,
-							runnable,
-							new LibrarySchedulingRule(LibraryService
-									.getInstance().getCurrentMethodLibrary()));
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			String title = AuthoringUIResources.ProcessEditor_refreshErrorTitle;
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(title,
-					e.toString(), e);
-		}
-	}
-
-	
-	/**
-	 * Must be synchronized to avoid stepping on each other in reloading
-	 * resources/refreshing UI
-	 * 
-	 * @param removedResources
-	 * @param changedResources
-	 * @param addedWorkspaceResources
-	 *            collection of IResource objects that are just newly added to
-	 *            the library
-	 * @param refreshViews
-	 */
-	private synchronized void doRefresh(Collection<Resource> removedResources,
-			Collection<Resource> changedResources, Collection<IResource> addedWorkspaceResources) {
-		HashSet<IEditorPart> editorsToRefresh = new HashSet<IEditorPart>();
-		if (!removedResources.isEmpty()) {
-			handleRemovedResources(removedResources, editorsToRefresh);
-		}
-		if (!changedResources.isEmpty()) {
-			handleChangedResources(changedResources, editorsToRefresh);
-		}
-		if (addedWorkspaceResources != null
-				&& !addedWorkspaceResources.isEmpty()) {
-			ILibraryManager mgr = LibraryService.getInstance()
-					.getCurrentLibraryManager();
-			if (mgr != null) {
-				ResourceSet resourceSet = mgr.getEditingDomain()
-						.getResourceSet();
-				if (resourceSet instanceof MultiFileResourceSetImpl) {
-					((MultiFileResourceSetImpl) resourceSet)
-							.loadNewResources(addedWorkspaceResources);
-					((MultiFileResourceSetImpl) resourceSet).getUnresolvedProxyMarkerManager().validateAllMarkers();
-				}
-			}
-		}
-	}
-	
-	private Collection<Resource> handleChangedResources(Collection<Resource> changedResources,
-			Collection<IEditorPart> editorsToRefresh) {
-		return handleChangedResources(changedResources, null, editorsToRefresh);
-	}
-
-	/**
-	 * 
-	 * @param removedResources
-	 * @param editorsToRefresh
-	 * @return resources that have been unloaded
-	 */
-	private Collection<Resource> handleRemovedResources(Collection<Resource> removedResources,
-			Collection<IEditorPart> editorsToRefresh) {
-		IWorkbenchPage workbenchPage = view.getSite().getPage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		ArrayList<IEditorPart> dirtyEditorsWithConflict = new ArrayList<IEditorPart>();
-		ArrayList<Resource> removedResourceList = new ArrayList<Resource>(removedResources);
-		if (editorsToRefresh == null) {
-			editorsToRefresh = new ArrayList<IEditorPart>();
-		}
-		// find all editor with dirty conflict
-		//
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof MethodElementEditor && editor.isDirty()) {
-				MethodElementEditorInput input = (MethodElementEditorInput) editor
-						.getEditorInput();
-				Resource resource = input.getMethodElement() != null ? input
-						.getMethodElement().eResource() : null;
-				if (!removedResources.contains(resource)) {
-					Collection<Resource> usedResources = ((MethodElementEditor) editor)
-							.getUsedResources();
-					check_resource: for (int j = 0; j < removedResourceList
-							.size(); j++) {
-						resource = (Resource) removedResourceList.get(j);
-						if (usedResources.contains(resource)) {
-							dirtyEditorsWithConflict.add(editor);
-							break check_resource;
-						}
-					}
-				} else {
-					editorsToRefresh.add(editor);
-				}
-			}
-		}
-
-		if (!dirtyEditorsWithConflict.isEmpty()) {
-			Object[] selected = selectDirtyEditors(dirtyEditorsWithConflict);
-			for (int i = 0; i < selected.length; i++) {
-				editorsToRefresh.add((IEditorPart) selected[i]);
-			}
-		}
-
-		// Unload the removed resources.
-		PersistenceUtil.unload(removedResources);
-
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof MethodElementEditor && !editor.isDirty()) {
-				Collection<Resource> usedResources = ((MethodElementEditor) editor)
-						.getUsedResources();
-				check_resource: for (int j = 0; j < removedResourceList.size(); j++) {
-					Resource resource = (Resource) removedResourceList.get(j);
-					if (usedResources.contains(resource)) {
-						editorsToRefresh.add(editor);
-						break check_resource;
-					}
-				}
-			}
-		}
-
-		return removedResources;
-	}
-
-
-	/**
-	 * Reload the changed resources
-	 * 
-	 * @param changedResources
-	 * @param editorsNotToRefresh
-	 * @param editorsToRefresh
-	 * @return List of changed resources that have been reloaded
-	 */
-	public Collection<Resource> handleChangedResources(Collection<Resource> changedResources,
-			Collection<IEditorPart> editorsNotToRefresh, Collection<IEditorPart> editorsToRefresh) {
-		Control ctrl = getControl();
-		if (ctrl == null || ctrl.isDisposed())
-			return Collections.emptyList();
-
-		IWorkbenchPage workbenchPage = view.getSite().getPage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		ArrayList<IEditorPart> dirtyEditorsWithConflict = new ArrayList<IEditorPart>();
-		ArrayList<Resource> changedResourceList = new ArrayList<Resource>(changedResources);
-		// find all editor with dirty conflict
-		//
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof MethodElementEditor && editor.isDirty()) {
-				Collection<Resource> usedResources = ((MethodElementEditor) editor)
-						.getUsedResources();
-				check_resource: for (int j = 0; j < changedResourceList.size(); j++) {
-					Resource resource = (Resource) changedResourceList.get(j);
-					if (usedResources.contains(resource)) {
-						dirtyEditorsWithConflict.add(editor);
-						break check_resource;
-					}
-				}
-			}
-		}
-		if (!dirtyEditorsWithConflict.isEmpty()) {
-			Object[] result = selectDirtyEditors(dirtyEditorsWithConflict);
-			if(result != null) {
-				for (int i = 0; i < result.length; i++) {
-					Object editor = result[i];
-					if ((editorsNotToRefresh == null || !editorsNotToRefresh
-							.contains(editor))
-							&& (editorsToRefresh == null || !editorsToRefresh
-									.contains(editor))) {
-						dirtyEditorsWithConflict.remove(editor);
-					}
-				}
-			}
-			// remove all resources used by dirty editors with conflict from the
-			// collection of changed resources after updating cached modification stamp
-			// so they will not be prompted to reload again until the next external change
-			//
-			for (int i = 0; i < dirtyEditorsWithConflict.size(); i++) {
-				MethodElementEditor editor = (MethodElementEditor) dirtyEditorsWithConflict
-						.get(i);				
-				Collection<Resource> usedResources = editor.getUsedResources();
-				usedResources.retainAll(changedResourceList);
-				editor.updateResourceInfos(usedResources);
-				editor.ovewriteResources(usedResources);
-				changedResourceList.removeAll(usedResources);
-			}
-		}
-
-		if (!changedResourceList.isEmpty()) {
-			// Reload the selected changed resources.
-			ILibraryManager manager = (ILibraryManager) LibraryService
-					.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				manager.reloadResources(changedResourceList);
-			}
-		}
-		return changedResourceList;
-	}
-
-	private Object[] selectDirtyEditors(
-			ArrayList<IEditorPart> dirtyEditorsWithConflict) {
-		return selectDirtyEditors(dirtyEditorsWithConflict, view.getSite().getShell());
-	}
-
-	public static Object[] selectDirtyEditors(List<?> dirtyEditors, Shell shell) {
-		String title = AuthoringUIResources._UI_FileConflict_label;
-		String msg = AuthoringUIResources.selectEditorsToDiscardConflictChanges;
-		return selectEditors(dirtyEditors, title, msg, shell);
-	}
-
-	private static Object[] selectEditors(List<?> editors, String title, String msg, Shell shell) {
-		// prompt user to discard changes in editors that conflict with outside
-		// change
-		//
-		IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
-			List<?> fContents;
-
-			public Object[] getElements(Object inputElement) {
-				if (fContents != null && fContents == inputElement)
-					return fContents.toArray();
-				return new Object[0];
-			}
-
-			public void dispose() {
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				if (newInput instanceof List)
-					fContents = (List<?>) newInput;
-				else
-					fContents = null;
-
-			}
-
-		};
-		ILabelProvider labelProvider = new LabelProvider() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-			 */
-			public String getText(Object element) {
-				if (element instanceof IEditorPart) {
-					return ((IEditorPart) element).getTitle();
-				}
-				return super.getText(element);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
-			 */
-			public Image getImage(Object element) {
-				if (element instanceof IEditorPart) {
-					return ((IEditorPart) element).getTitleImage();
-				}
-				return super.getImage(element);
-			}
-		};
-		ListSelectionDialog dlg = new ListSelectionDialog(shell,
-				editors, contentProvider, labelProvider, msg);
-		dlg.setTitle(title);
-		dlg.setBlockOnOpen(true);
-		dlg.open();
-		return dlg.getResult();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/RichTextImageLinkContainer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/RichTextImageLinkContainer.java
deleted file mode 100644
index 6a30216..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/RichTextImageLinkContainer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import org.eclipse.epf.authoring.ui.richtext.IMethodRichText;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-
-/**
- * Simple container class used as a return value for FormUI convenience methods
- * @author Jeff Hardy
- *
- */
-public class RichTextImageLinkContainer {
-	public IMethodRichText richText;
-	public ImageHyperlink link;
-	public Label label;
-	
-	public RichTextImageLinkContainer(IMethodRichText richText, ImageHyperlink link, Label label) {
-		this.richText = richText;
-		this.link = link;
-		this.label = label;
-	}
-	
-	public void setVisible(boolean visible) {
-		if (richText != null) {
-			richText.getControl().setVisible(visible);
-		}
-		if (link != null) {
-			link.setVisible(visible);
-		}
-		if (label != null) {
-			label.setVisible(visible);
-		}
-	}
-	
-	public void moveBelow(Control control) {
-		if (link != null) {
-			link.moveBelow(control);
-		}
-		if (label != null) {
-			label.moveBelow(link);
-		}
-		if (richText != null) {
-			richText.getControl().moveBelow(label);
-		}
-	}
-	
-	public void redraw() {
-		if (link != null) {
-			link.redraw();
-		}
-		if (label != null) {
-			label.redraw();
-		}
-		if (richText != null) {
-			richText.getControl().redraw();
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/UIHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/UIHelper.java
deleted file mode 100644
index 9cbb3a7..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/UIHelper.java
+++ /dev/null
@@ -1,586 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.BreakdownElementEditorInput;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.ui.service.DiagramEditorHelper;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.internal.ContentElementNameValidator;
-import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-
-/**
- * Helper Utility class for UI
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UIHelper {
-
-	/**
-	 * Setting items in a table
-	 * 
-	 * @param table
-	 * @param items
-	 */
-	public static void setItems(Table table, ArrayList items) {
-		table.removeAll();
-		for (int i = 0; i < items.size(); i++) {
-			TableItem item = new TableItem(table, SWT.NONE);
-			item.setText((String) items.get(i));
-		}
-	}
-
-	/**
-	 * Create list on the given composite with given style
-	 * @param toolkit
-	 * @param parent
-	 * @param style
-	 */
-	public static List createList(FormToolkit toolkit, Composite parent,
-			int style) {
-		List list = new List(parent, style | SWT.NULL);
-		toolkit.adapt(list, true, true);
-		return list;
-	}
-
-	/*
-	 * Method will return Object[] of guidance excluding Practice.
-	 * MethodElementUtil#getSelectedGuidances(EObject) calculates all guidance.
-	 */
-	public static Object[] getSelectedGuidances(ContentElement contentElement) {
-		java.util.List list = MethodElementUtil
-				.getSelectedGuidances(contentElement);
-		for (Iterator it = list.iterator(); it.hasNext();) {
-			Object obj = it.next();
-			if (obj instanceof Practice)
-				it.remove();
-		}
-		return list.toArray();
-	}
-
-	private static String getFormPageTitlePrefixFor(MethodElement methodElement) {
-		String elementLabel = LibraryUIText.getUIText(methodElement);
-		if (methodElement instanceof WorkProduct) {
-			return LibraryUIText.TEXT_WORK_PRODUCT + " (" + elementLabel + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-		} else if (methodElement instanceof Guidance) {
-			return LibraryUIText.TEXT_GUIDANCE + " (" + elementLabel + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			return elementLabel;
-		}
-	}
-
-	/**
-	 * Sets text for the given form based on the given element, including variable information of the element
-	 * if there is any.
-	 * 
-	 * @param form
-	 * @param element
-	 */
-	public static void setFormText(ScrolledForm form, MethodElement element) {
-		if (form != null && !form.isDisposed()) {
-			StringBuffer str = new StringBuffer();
-			str.append(getFormPageTitlePrefixFor(element));
-			str.append(AuthoringUIResources.editor_title_colon_with_spaces);
-			
-			if(element instanceof VariabilityElement) {
-				str.append(TngUtil.getLabel((VariabilityElement) element,
-						"", true)); //$NON-NLS-1$
-			}
-			else if(element.getName() != null){
-				str.append(element.getName());
-			}
-			form.setText(str.toString());
-		}
-	}
-
-	/**
-	 * Check whether given deliverables leads to circular dependency
-	 * @param toBePart
-	 * @param deliverable
-	 * @return
-	 * 			Boolean value to indicate whether cicular dependency is detected
-	 * @deprecated moved to {@link DependencyChecker#checkCircularDeliverables(Deliverable, Deliverable)}
-	 */
-	public static boolean checkCircularDeliverables(Deliverable toBePart,
-			Deliverable deliverable) {
-		return DependencyChecker.checkCircularDeliverables(toBePart, deliverable);
-	}
-
-	/**
-	 * Check whether deliverable parts are in chain
-	 * 
-	 * @param e
-	 * @param roots
-	 */
-	public static void deliverablePartsChain(Deliverable e, java.util.List roots) {
-		java.util.List list = e.getDeliveredWorkProducts();
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				Object obj = iterator.next();
-				if (obj instanceof Deliverable) {
-					roots.add(obj);
-					deliverablePartsChain((Deliverable) obj, roots);
-				}
-			}
-		}
-	}
-	
-
-	/**
-	 * Resolve content element name conflicts
-	 * @param container
-	 * @param element
-	 * @param reference
-	 */
-	public static String resolveContentElementNameConflict(EObject container, MethodElement element, EReference
-			reference) {
-
-		final IValidator validator = new ContentElementNameValidator(container
-				, reference,
-				(ContentElement) element, new ValidatorFactory.TypeFilter(element));
-		
-		String msg = validator.isValid(element.getName());
-		
-		if (msg != null) {
-			String featureTxt = TngUtil.getFeatureText(UmaPackage.eINSTANCE
-					.getNamedElement_Name());
-			String title = LibraryEditResources.resolveNameConflictDialog_title; 
-			String dlgMsg = NLS.bind(
-					LibraryEditResources.resolveNameConflictDialog_text,
-					StrUtil.toLower(featureTxt), element.getName());
-			String currentValue = (String) element.eGet(UmaPackage.eINSTANCE
-					.getNamedElement_Name());
-
-			IInputValidator inputValidator = new IInputValidator() {
-				public String isValid(String newText) {
-					return validator.isValid(newText);
-				}
-			};
-
-			InputDialog inputDlg = new InputDialog(
-					MsgBox.getDefaultShell(), title, dlgMsg, currentValue,
-					inputValidator);
-			if (inputDlg.open() == Window.CANCEL) {
-				throw new OperationCanceledException();
-			}
-			return inputDlg.getValue();
-		}
-		return null;
-	}
-	
-	
-	/**
-	 * Diagram editors of object itself will be closed. And Parent diagram editors 
-	 * will be refreshed.  
-	 *  @deprecated  (see:  {@link DiagramEditorHelper} - refreshParentDiagramEditors())
-	 */
-	public static void refreshOpenDiagramEditorsOfParent(Object refreshElement, java.util.List openEditorRefs) {
-		openEditorRefs = new ArrayList();
-		// Now refresh object's parent's diagrams.
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow()
-				.getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				Object element = null;
-				if (input instanceof BreakdownElementEditorInput) {
-					BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
-					if (binput.getWrapper() != null) {
-						element = binput.getWrapper();
-						if(element instanceof BreakdownElementWrapperItemProvider){
-							Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(null);
-							if(parent instanceof BreakdownElementWrapperItemProvider){
-								if(element.equals(refreshElement))
-									refreshOpenDiagramEditorsOfParent(parent, openEditorRefs);
-							}
-						}
-					} else {
-						element = binput.getMethodElement();
-					}
-				} 
-				else if (input instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
-					if (diagramInput != null) {
-						element = diagramInput.getMethodElement();
-					}
-				}
-				if (element != null)
-				{
-					if(element instanceof Activity){
-						if(((Activity)element).getBreakdownElements().contains(refreshElement))
-							openEditorRefs.add(reference);
-						else if(refreshElement instanceof BreakdownElementWrapperItemProvider){
-							Object localRefreshElement = refreshElement;
-							while((localRefreshElement instanceof BreakdownElementWrapperItemProvider)
-									&& ((BreakdownElementWrapperItemProvider)localRefreshElement).getOwner()!= null){
-								if(((BreakdownElementWrapperItemProvider)localRefreshElement).getOwner()
-										.equals(element)){
-									openEditorRefs.add(reference);
-								}
-								localRefreshElement = ((BreakdownElementWrapperItemProvider)localRefreshElement).getOwner();
-							}
-						}
-					}else if(element instanceof BreakdownElementWrapperItemProvider){
-						Collection c = ((BreakdownElementWrapperItemProvider)element).getChildren(element);
-						if(c != null && c.contains(refreshElement)){
-							openEditorRefs.add(reference);
-						}
-					}
-					
-				}
-			}
-		}
-		int size = openEditorRefs.size();
-		//IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			IEditorReference reference = (IEditorReference) openEditorRefs.get(i);
-			IEditorPart editor = reference.getEditor(true);
-			if(editor instanceof AbstractDiagramEditor ){
-				((AbstractDiagramEditor)editor).refreshDiagram();
-			}
-		}
-	}
-	
-	/**
-	 * Close diagram editors including parent editors
-	 * @param closeElement
-	 * @param closeEditorRefs
-	 * @deprecated
-	 */
-	public static void closeDiagramEditorsIncludingParent(Object closeElement, java.util.List closeEditorRefs) {
-		closeEditorRefs = new ArrayList();
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow()
-				.getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				Object element = null;
-				if (input instanceof BreakdownElementEditorInput) {
-					BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
-					if (binput.getWrapper() != null) {
-						element = binput.getWrapper();
-						if(element instanceof BreakdownElementWrapperItemProvider){
-							Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(null);
-							if(parent instanceof BreakdownElementWrapperItemProvider){
-								if(element.equals(closeElement))
-									closeDiagramEditorsIncludingParent(parent, closeEditorRefs);
-							}
-						}
-					} else {
-						element = binput.getMethodElement();
-					}
-				} 
-				else if (input instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
-					if (diagramInput != null) {
-						element = diagramInput.getMethodElement();
-					}
-				}
-				if (element != null)
-				{
-						//closeEditorRefs.add(reference);
-					if(element instanceof Activity){
-						if(element.equals(closeElement))
-							closeEditorRefs.add(reference);
-						
-						if(((Activity)element).getBreakdownElements().contains(closeElement))
-							closeEditorRefs.add(reference);
-						else if(closeElement instanceof BreakdownElementWrapperItemProvider){
-							if(((BreakdownElementWrapperItemProvider)closeElement).getOwner()
-									!= null)
-								if(((BreakdownElementWrapperItemProvider)closeElement).getOwner()
-									.equals(element)){
-									closeEditorRefs.add(reference);
-								if(((BreakdownElementWrapperItemProvider)closeElement).getOwner()
-									instanceof BreakdownElementWrapperItemProvider){
-									if(((BreakdownElementWrapperItemProvider)((BreakdownElementWrapperItemProvider)
-											closeElement).getOwner()).getOwner().equals(element))
-										closeEditorRefs.add(reference);
-								}
-							}
-						}
-					}else if(element instanceof BreakdownElementWrapperItemProvider){
-						Collection c = ((BreakdownElementWrapperItemProvider)element).getChildren(element);
-						if(c != null && c.contains(closeElement)){
-							closeEditorRefs.add(reference);
-						}
-					}
-				}
-			}
-		}
-		int size = closeEditorRefs.size();
-		IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			references[i] = (IEditorReference) closeEditorRefs.get(i);
-		}
-		workbenchPage.closeEditors(references, false);
-	}
-	
-	/**
-	 * Get base activity for the given activity
-	 * @param activity
-	 * @return
-	 * 			Base activity
-	 */
-	public static VariabilityElement getBaseActivity(Activity activity){
-		while (!activity.getVariabilityType().equals(
-				VariabilityType.NA_LITERAL)) {
-
-			VariabilityElement ve = activity
-					.getVariabilityBasedOnElement();
-			if ((ve != null) && (ve instanceof Activity)) {
-				activity = (Activity) ve;
-			} else {
-				break;
-			}
-		}
-		return activity;
-	}
-	
-	/**
-	 * Close diagram editors
-	 * 
-	 * @param closeElement
-	 * @param closeEditorRefs
-	 *  @deprecated (see:  {@link DiagramEditorHelper})
-	 *  
-	 */
-	public static void closeDiagramEditors(Object closeElement, java.util.List closeEditorRefs) {
-		closeEditorRefs = new ArrayList();
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow()
-				.getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				Object element = null;
-				if (input instanceof BreakdownElementEditorInput) {
-					BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
-					if (binput.getWrapper() != null) {
-						element = binput.getWrapper();
-						if(element instanceof BreakdownElementWrapperItemProvider){
-							Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(element);
-							if(parent instanceof BreakdownElementWrapperItemProvider){
-								if(element.equals(closeElement))
-									closeDiagramEditors(parent, closeEditorRefs);
-							}
-						}
-					} else {
-						element = binput.getMethodElement();
-					}
-				} 
-				else if (input instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
-					if (diagramInput != null) {
-						element = diagramInput.getMethodElement();
-					}
-				}
-				if (element != null) {
-					if (element.equals(closeElement)) {
-						closeEditorRefs.add(reference);
-					} else {
-						// check whether element is child of closeElement
-						// directly/indirectly
-						if (closeElement instanceof Activity) {
-							Collection collection = new ArrayList();
-							ProcessUtil.getChildElements(
-									(Activity) closeElement, Activity.class,
-									collection);
-							if (collection.contains(element)) {
-								closeEditorRefs.add(reference);
-							}
-						}
-					}
-				}
-			}
-		}
-		int size = closeEditorRefs.size();
-		IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			references[i] = (IEditorReference) closeEditorRefs.get(i);
-		}
-		workbenchPage.closeEditors(references, false);
-		references = null;
-	}
-	
-	/**
-	 * Diagram editors of object itself will be closed. And Parent diagram editors 
-	 * will be refreshed.  code not tested use refreshOpenDiagramEditors method.
-	 * Not used currently
-	 * @param object
-	 */
-	public static void syncDiagramEditors(Object object) {
-		java.util.List closeEditors = new ArrayList();
-		java.util.List refreshEditors = new ArrayList();
-		
-		IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				Object editorElement = null;
-				if (input instanceof BreakdownElementEditorInput) {
-					BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
-					if(binput.getWrapper() != null){
-						editorElement = binput.getWrapper();
-					}else{
-						editorElement = binput.getMethodElement();
-					}
-				}
-				else if (input instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
-					if (diagramInput != null) {
-						editorElement = diagramInput.getMethodElement();
-					}
-				}
-				if(editorElement != null){
-					if(editorElement.equals(object)){
-						closeEditors.add(reference);
-					}else{
-						if(editorElement instanceof Activity){
-							if(((Activity)editorElement).getBreakdownElements().contains(object))
-								refreshEditors.add(reference);
-							else if(object instanceof BreakdownElementWrapperItemProvider){
-								Object local = object;
-								while((local instanceof BreakdownElementWrapperItemProvider)
-										&& ((BreakdownElementWrapperItemProvider)local).getOwner()!= null){
-									if(((BreakdownElementWrapperItemProvider)local).getOwner()
-											.equals(editorElement)){
-										refreshEditors.add(reference);
-									}
-									local = ((BreakdownElementWrapperItemProvider)local).getOwner();
-								}
-							}
-						}else if(editorElement instanceof BreakdownElementWrapperItemProvider){
-							Collection c = ((BreakdownElementWrapperItemProvider)editorElement).getChildren(editorElement);
-							if(c != null && c.contains(object)){
-								refreshEditors.add(reference);
-							}
-						}
-					}
-				}
-			}
-		}
-		// Close editor references and refresh editors.
-		int size = closeEditors.size();
-		IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			references[i] = (IEditorReference) closeEditors.get(i);
-		}
-		workbenchPage.closeEditors(references, false);
-		references = null;
-		
-		size = refreshEditors.size();
-		//IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			IEditorReference reference = (IEditorReference) refreshEditors.get(i);
-			IEditorPart editor = reference.getEditor(true);
-			if(editor instanceof AbstractDiagramEditor ){
-				((AbstractDiagramEditor)editor).refreshDiagram();
-			}
-		}
-		
-	}
-	
-	public static void showProblemsView() {
- 		SafeUpdateController
-		.asyncExec(new Runnable() {
-			public void run() {
-				try {
-					if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null &&
-							PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null) {
-						IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-						IViewPart view = page.findView(IPageLayout.ID_PROBLEM_VIEW);
-						if (view == null) {
-							page.showView(IPageLayout.ID_PROBLEM_VIEW, null, IWorkbenchPage.VIEW_VISIBLE);
-						}
-					}
-				} catch (Exception e) {
-					// couldn't open the
-					// problem view, too
-					// bad..
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		});
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/UILayoutHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/UILayoutHelper.java
deleted file mode 100644
index e5fe0c8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/UILayoutHelper.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.util;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-
-/**
- * Layout Helper for UI. 
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class UILayoutHelper {
-
-	private static Composite editorComposite, previewComposite;
-
-	private static CTabFolder tabFolder;
-
-	/**
-	 * Create tabs in form 
-	 * @param form
-	 * @param toolkit
-	 */
-	public static void createTabs(ScrolledForm form, FormToolkit toolkit) {
-		// create tabfolder
-		tabFolder = new CTabFolder(form.getBody(), SWT.FLAT | SWT.TOP);
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		tabFolder.setLayoutData(td);
-
-		// set tabfolder background color
-		Color selectedColor = toolkit.getColors()
-				.getColor(FormColors.SEPARATOR);
-		tabFolder.setSelectionBackground(new Color[] { selectedColor,
-				toolkit.getColors().getBackground() }, new int[] { 50 });
-
-		// create editor tab item and the corresponding composite
-		CTabItem editorItem = new CTabItem(tabFolder, SWT.NULL);
-		editorItem.setText(AuthoringUIText.EDITOR_TEXT);
-		editorComposite = createComposite(toolkit);
-		editorItem.setControl(editorComposite);
-
-		// create preview tab item and the corresponding composite
-		CTabItem previewItem = new CTabItem(tabFolder, SWT.NULL);
-		previewItem.setText(AuthoringUIText.PREVIEW_PAGE_TITLE);
-		previewComposite = createComposite(toolkit);
-		previewItem.setControl(previewComposite);
-
-		toolkit.paintBordersFor(tabFolder);
-
-		toolkit.adapt(tabFolder, true, true);
-
-		tabFolder.setSelection(0);
-	}
-
-	/**
-	 * Create composite on the form
-	 * 
-	 * @param toolkit
-	 * @return
-	 * 			UI composite
-	 */
-	private static Composite createComposite(FormToolkit toolkit) {
-		Composite composite = toolkit.createComposite(tabFolder);
-		composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		composite.setLayout(new TableWrapLayout());
-
-		return composite;
-	}
-
-	/**
-	 * Return editor composite
-	 * 
-	 * @return
-	 * 		UI Composite
-	 */
-	public static Composite getEditorComposite() {
-		return editorComposite;
-	}
-
-	/**
-	 * Return preview composite
-	 * 
-	 * @return
-	 * 		Preview composite
-	 */
-	public static Composite getPreviewComposite() {
-		return previewComposite;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/package.html
deleted file mode 100644
index 9645657..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for the Authoring UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/AbstractBaseView.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/AbstractBaseView.java
deleted file mode 100644
index 93b6e5a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/AbstractBaseView.java
+++ /dev/null
@@ -1,496 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.UIActionDispatcher;
-import org.eclipse.epf.authoring.ui.actions.ILibraryActionBarContributor;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.epf.library.ui.LibraryUIUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-/**
- * The abstract base class for all Method Library views.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class AbstractBaseView extends SaveableLibraryViewPart
-		implements IEditingDomainProvider, ISelectionProvider,
-		ILibraryServiceListener, IMenuListener, IViewerProvider, IGotoMarker {
-
-	protected AdapterFactoryEditingDomain editingDomain;
-
-	protected PropertySheetPage propertySheetPage;
-
-	protected UIActionDispatcher actionDispatcher = null;
-
-	protected AdapterFactory adapterFactory;
-
-	protected ILibraryActionBarContributor actionBarContributor;
-
-	protected ISelectionChangedListener selectionChangedListener;
-
-	protected IPartListener partListener = new IPartListener() {
-		public void partActivated(IWorkbenchPart part) {
-			if (part == AbstractBaseView.this) {
-				handleActivate(part);
-			}
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partOpened(IWorkbenchPart part) {
-		}
-	};
-		
-	/**
-	 * Handles the activation of this view.
-	 */
-	protected void handleActivate(IWorkbenchPart part) {
-		// Set the right adapter factory for the editing domain.
-		editingDomain.setAdapterFactory(adapterFactory);
-
-		// Recompute the read only state.
-		if (editingDomain.getResourceToReadOnlyMap() != null) {
-			editingDomain.getResourceToReadOnlyMap().clear();
-
-			// Refresh any actions that may become enabled or disabled.
-			setSelection(getSelection());
-		}
-	}
-
-	// this window listener is for opening the library when the 
-	// view first becomes visible
-	private IWindowListener windowListener = new IWindowListener() {
-
-		public void windowActivated(IWorkbenchWindow window) {
-		}
-
-		public void windowClosed(IWorkbenchWindow window) {
-		}
-
-		public void windowDeactivated(IWorkbenchWindow window) {
-		}
-
-		public void windowOpened(IWorkbenchWindow window) {
-			window.getWorkbench().removeWindowListener(this);
-			boolean isVisible = getSite().getPage().isPartVisible(AbstractBaseView.this);
-			if (isVisible) {
-				LibraryUIManager.getInstance().startupOpenLibrary();
-			} else {
-				LibraryUIManager.getInstance().addMethodViewPartListener(getViewId());
-			}
-		}
-	};
-
-	/**
-	 * Displays a dialog that asks if conflicting changes should be discarded.
-	 */
-	protected boolean handleDirtyConflict() {
-		String title = AuthoringUIResources._UI_FileConflict_label; 
-		String msg = AuthoringUIResources._WARN_FileConflict; 
-		return AuthoringUIPlugin.getDefault().getMsgDialog().displayPrompt(
-				title, msg);
-	}
-
-	/**
-	 * Handles changed resources when this view is activated.
-	 */
-	protected void handleChangedResources() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		init();
-
-		actionDispatcher = new UIActionDispatcher(this);
-
-		// Create the viewer.
-		createViewer(parent);
-
-		// Create and initialize the action bar contributor.
-		try {
-			actionBarContributor = createActionBarContributor();
-			actionBarContributor.init(getViewSite().getActionBars(), getSite()
-					.getPage());
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-
-		// Add a selection change listener for the viewer.
-		Viewer viewer = getViewer();
-		if (viewer != null) {
-			if (selectionChangedListener == null) {
-				selectionChangedListener = new ISelectionChangedListener() {
-					public void selectionChanged(
-							SelectionChangedEvent selectionChangedEvent) {
-						setSelection(selectionChangedEvent.getSelection());
-					}
-				};
-			}
-			viewer.addSelectionChangedListener(selectionChangedListener);
-		}
-
-		// Add a library service listener.
-		LibraryService.getInstance().addListener(this);
-
-		Object library = LibraryService.getInstance().getCurrentMethodLibrary();
-		if (library != null) {
-			setInputForViewer(library);
-			LibraryUIUtil.updateShellTitle();
-		}
-		IWorkbench workbench = AuthoringUIPlugin.getDefault().getWorkbench();
-		if (workbench != null) {
-			workbench.addWindowListener(windowListener);
-		}
-	}
-
-	private void init() {
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			editingDomain = manager.getEditingDomain();
-			adapterFactory = (ComposedAdapterFactory) editingDomain
-					.getAdapterFactory();
-		}
-
-		IViewSite site = (IViewSite) this.getSite();
-		site.setSelectionProvider(this);
-		site.getPage().addPartListener(partListener);
-	}
-
-	/**
-	 * creates a context menu for the viewer
-	 * @param viewer
-	 */
-	public void createContextMenuFor(final StructuredViewer viewer) {
-		MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
-		contextMenu.add(new Separator("additions")); //$NON-NLS-1$
-		contextMenu.setRemoveAllWhenShown(true);
-		contextMenu.addMenuListener(this);
-		Menu menu = contextMenu.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(contextMenu, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		try {
-			actionBarContributor.setActiveView(this);
-			actionBarContributor.menuAboutToShow(menuManager);
-		} catch (RuntimeException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			throw e;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
-	 */
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		actionDispatcher.addSelectionChangedListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		actionDispatcher.removeSelectionChangedListener(listener);
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#getAdapter(Class)
-	 */
-	public Object getAdapter(Class key) {
-		if (key.equals(IGotoMarker.class)) {
-			return this;
-		} else {
-			return super.getAdapter(key);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return actionDispatcher.getSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		setSelection(this, selection);
-	}
-
-	private void setSelection(ISelectionProvider source, ISelection selection) {
-		actionDispatcher.setSelection(source, selection);
-		UIActionDispatcher.getInstance().setSelection(source, selection);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryCreated(MethodLibrary)
-	 */
-	public void libraryCreated(MethodLibrary library) {
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryOpened(MethodLibrary)
-	 */
-	public void libraryOpened(MethodLibrary library) {
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryReopened(MethodLibrary)
-	 */
-	public void libraryReopened(MethodLibrary library) {
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryClosed(MethodLibrary)
-	 */
-	public void libraryClosed(MethodLibrary library) {
-		setInputForViewer(null);
-		if (adapterFactory instanceof ComposedAdapterFactory) {
-			((ComposedAdapterFactory) adapterFactory).dispose();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#librarySet(MethodLibrary)
-	 */
-	public void librarySet(MethodLibrary library) {
-		setInputForViewer(library);
-		if (library != null) {
-			actionBarContributor.setActiveView(AbstractBaseView.this);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#configurationSet(MethodConfiguration)
-	 */
-	public void configurationSet(MethodConfiguration config) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		// ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-		// resourceChangeListener);
-
-		getSite().getPage().removePartListener(partListener);
-
-		if (adapterFactory instanceof ComposedAdapterFactory) {
-			((ComposedAdapterFactory) adapterFactory).dispose();
-		}
-
-		if (actionBarContributor.getActiveView() == this) {
-			actionBarContributor.setActiveView(null);
-		}
-
-		if (propertySheetPage != null) {
-			propertySheetPage.dispose();
-		}
-
-		IWorkbench workbench = AuthoringUIPlugin.getDefault().getWorkbench();
-		if (workbench != null) {
-			workbench.removeWindowListener(windowListener);
-		}
-
-		LibraryService.getInstance().removeListener(this);
-
-		super.dispose();
-	}
-
-	/**
-	 * This accesses a cached version of the property sheet.
-	 */
-	public IPropertySheetPage getPropertySheetPage() {
-		if (propertySheetPage == null) {
-			propertySheetPage = new PropertySheetPage() {
-				public void makeContributions(IMenuManager menuManager,
-						IToolBarManager toolBarManager,
-						IStatusLineManager statusLineManager) {
-					super.makeContributions(menuManager, toolBarManager,
-							statusLineManager);
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					if (actionBarContributor != null) {
-						actionBarContributor.shareGlobalActions(this,
-								actionBars);
-					}
-				}
-			};
-			propertySheetPage
-					.setPropertySourceProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-		}
-		return propertySheetPage;
-	}
-
-	/**
-	 * @see org.eclipse.ui.ide.IGotoMarker#gotoMarker(IMarker)
-	 */
-	public void gotoMarker(IMarker marker) {
-		try {
-			if (marker.getType().equals(EValidator.MARKER)) {
-				String uriAttribute = marker.getAttribute(
-						EValidator.URI_ATTRIBUTE, null);
-				if (uriAttribute != null) {
-					URI uri = URI.createURI(uriAttribute);
-					EObject eObject = editingDomain.getResourceSet()
-							.getEObject(uri, true);
-					if (eObject != null) {
-						setSelectionToViewer(Collections
-								.singleton(editingDomain.getWrapper(eObject)));
-					}
-				}
-			}
-		} catch (CoreException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/**
-	 * This sets the selection into whichever viewer is active.
-	 */
-	public void setSelectionToViewer(Collection collection) {
-		final Collection theSelection = collection;
-		if (theSelection != null && !theSelection.isEmpty()) {
-			Runnable runnable = new Runnable() {
-				public void run() {
-					// Try to select the items in the current content viewer of
-					// the editor.
-					Viewer viewer = getViewer();
-					if (viewer != null) {
-						viewer.setSelection(new StructuredSelection(
-								theSelection.toArray()), true);
-					}
-				}
-			};
-			runnable.run();
-		}
-	}
-
-	/**
-	 * @return a new AdapterFactoryContentProvider
-	 */
-	public AdapterFactoryContentProvider getContentProvider() {
-		return new AdapterFactoryContentProvider(adapterFactory);
-	}
-
-	/**
-	 * @return the viewer
-	 */
-	public abstract Viewer getViewer();
-
-	/**
-	 * Creates the viewer in the given parent
-	 * @param parent
-	 */
-	public abstract void createViewer(Composite parent);
-
-	/**
-	 * @return a new actionBarContributer
-	 */
-	public abstract ILibraryActionBarContributor createActionBarContributor();
-
-	/**
-	 * Sets the input for the viewer
-	 * @param model new input for the viewer
-	 */
-	public abstract void setInputForViewer(Object model);
-
-	public abstract String getViewId();
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/AbstractLocker.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/AbstractLocker.java
deleted file mode 100644
index 3d60040..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/AbstractLocker.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.epf.authoring.ui.views;
-
-public abstract class AbstractLocker {
-	
-	public abstract boolean isLocked(Object selection); 
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/CategoryTreeViewerWrapper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/CategoryTreeViewerWrapper.java
deleted file mode 100644
index 823ad15..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/CategoryTreeViewerWrapper.java
+++ /dev/null
@@ -1,223 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * CheckboxTreeViewer wrapper that does not check parents when all children are checked.
- * 
- * @author Jeff Hardy
- *
- */
-public class CategoryTreeViewerWrapper extends
-		GrayingCheckboxTreeViewerWrapper {
-	
-	protected List<Object> fUserCheckedStateStore= new ArrayList<Object>();
-	
-	protected Text textWidget;
-	
-	protected MethodConfiguration config;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CategoryTreeViewerWrapper(Composite parent, int height,
-			Object rootObject,
-			AdapterFactoryContentProvider treeContentProvider,
-			AdapterFactoryLabelProvider treeLabelProvider,
-			MethodConfiguration config) {
-		super (parent, height, rootObject, treeContentProvider, treeLabelProvider);
-		this.config = config;
-	}
-	
-	@Override
-	protected boolean determineShouldBeWhiteChecked(Object treeElement) {
-		return fUserCheckedStateStore.contains(treeElement);
-	}
-	
-	protected boolean determineShouldBeAtLeastGrayChecked(Object treeElement) {
-		// if any children of treeElement are still gray-checked then treeElement
-		// must remain gray-checked as well
-		Object[] children= getTreeChildren(treeElement);
-		for (int i= 0; i < children.length; ++i) {
-			if (fCheckedStateStore.contains(children[i]) || fUserCheckedStateStore.contains(children[i]))
-				return true;
-		}
-
-		return false;
-	}
-
-		
-	@Override
-	protected void setTreeChecked(Object treeElement, boolean state) {
-		if (state) {
-			fUserCheckedStateStore.add(treeElement);
-		} else
-			fUserCheckedStateStore.remove(treeElement);
-		
-		super.setTreeChecked(treeElement, state);
-	}
-
-	
-	private Set<TreeItem> getAllTreeItems(TreeItem treeItem) {
-		Set<TreeItem> result = new HashSet<TreeItem>();
-		if (treeItem != null) {
-			result.add(treeItem);
-			TreeItem[] children = treeItem.getItems();
-			for (int i = 0; i < children.length; i++) {
-				result.addAll(getAllTreeItems(children[i]));
-			}
-		} else {
-			TreeItem[] children = fTreeViewer.getTree().getItems();
-			for (int i = 0; i < children.length; i++) {
-				result.addAll(getAllTreeItems(children[i]));
-			}
-		}
-		return result;
-	}
-	
-	@Override
-	protected void handleUpdateSelection(List items) {
-
-		// iterate thru TreeItems to find selections
-		Collection<TreeItem> allTreeItems = getAllTreeItems(null);
-		Collection<Object> checkedItems = new ArrayList<Object>();
-		
-		for (Iterator<TreeItem> iter = allTreeItems.iterator();iter.hasNext();) {
-			TreeItem treeItem = iter.next();
-			Object item = treeItem.getData();
-			if (items.contains(TngUtil.unwrap(item))) {
-				checkedItems.add(item);
-				//Replace the items in the checked state store with those from the supplied items
-				if (!fUserCheckedStateStore.contains(item))
-					fUserCheckedStateStore.add(item);
-				if (!fCheckedStateStore.contains(item))
-					fCheckedStateStore.add(item);
-				// proceed up the tree element hierarchy
-				Object parent= fTreeContentProvider.getParent(item);
-				if (parent != null) {
-					addToHierarchyToCheckedStore(parent);
-				}
-				
-			}
-		}
-
-		//Now update hierarchies
-		Iterator<Object> iter = checkedItems.iterator();
-
-		while (iter.hasNext()) {
-			Object item= iter.next();
-			updateHierarchy(item);
-		}
-	}
-	
-	public Set<ContentCategory> getCheckedContentCategories() {
-		Set<ContentCategory> result = new HashSet<ContentCategory>();
-		Set<Object> checkedItems = getWhiteCheckedTreeItems();
-		for (Iterator<Object> iter = checkedItems.iterator();iter.hasNext();) {
-			Object item = TngUtil.unwrap(iter.next());
-			if (item instanceof ContentCategory) {
-				if (config.getMethodPluginSelection().contains(LibraryUtil.getMethodPlugin((ContentCategory)item))) {
-					result.add((ContentCategory)item);
-				}
-			}
-		}
-		return result;
-	}
-	
-	/**
-	 *	Handles the selection of an item in the tree viewer
-	 *
-	 *	@param event ISelection
-	 */
-	public void selectionChanged(final SelectionChangedEvent event) {
-		BusyIndicator.showWhile(getTree().getShell().getDisplay(), new Runnable() {
-			public void run() {
-				IStructuredSelection selection= (IStructuredSelection) event.getSelection();
-				Object selectedElement= selection.getFirstElement();
-				selectedElement = TngUtil.unwrap(selectedElement);
-				if (selectedElement == null) {
-					return;
-				} else if (textWidget != null && selectedElement instanceof MethodElement) {
-					// display selected element's description
-					String briefDesc = ((MethodElement) selectedElement).getBriefDescription();
-					textWidget.setText(briefDesc != null ? briefDesc : ""); //$NON-NLS-1$
-				}
-			}
-		});
-	}
-
-	public void setTextWidget(Text textWidget) {
-		this.textWidget = textWidget;
-	}
-
-	@Override
-	protected void treeItemChecked(Object treeElement, boolean state) {
-		// uncheck parent but not siblings
-		if (!state) {
-			Object parent= fTreeContentProvider.getParent(treeElement);
-			if (parent != null) {
-				fUserCheckedStateStore.remove(parent);
-			}
-		}
-		
-		super.treeItemChecked(treeElement, state);
-		
-		// now check all other instances of the element
-		Collection items = getAllTreeItems(treeElement);
-		for (Iterator iter = items.iterator();iter.hasNext();) {
-			super.treeItemChecked(iter.next(), state);
-		}
-		
-	}
-	
-	private Collection<Object> getAllTreeItems(Object treeElement) {
-		if (treeElement == null) {
-			return Collections.<Object>emptyList();
-		}
-		// iterate thru TreeItems to find selections
-		Collection<TreeItem> allTreeItems = getAllTreeItems(null);
-		Collection<Object> result = new ArrayList<Object>();
-		
-		for (Iterator<TreeItem> iter = allTreeItems.iterator();iter.hasNext();) {
-			TreeItem treeItem = iter.next();
-			Object item = treeItem.getData();
-			if (item != treeElement && 
-					TngUtil.unwrap(treeElement).equals(TngUtil.unwrap(item))) {
-				result.add(item);
-			}
-		}
-		return result;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationView.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationView.java
deleted file mode 100644
index 42cef1e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationView.java
+++ /dev/null
@@ -1,620 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.IdentityCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.ui.action.CopyAction;
-import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.PerspectiveListUtil;
-import org.eclipse.epf.authoring.ui.UIActionDispatcher;
-import org.eclipse.epf.authoring.ui.actions.ConfigurationViewEditAction;
-import org.eclipse.epf.authoring.ui.actions.ILibraryActionBarContributor;
-import org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewCopyAction;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewFindElementAction;
-import org.eclipse.epf.authoring.ui.dnd.LibraryViewerDragAdapter;
-import org.eclipse.epf.authoring.ui.providers.ConfigurationLabelProvider;
-import org.eclipse.epf.common.ui.util.ClipboardUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IBaseLabelProvider;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.HTMLTransfer;
-import org.eclipse.swt.dnd.Transfer;
-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.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Displays the content of the current method configuration.
- * <p>
- * The current configuration is set via the Configuration combobox in the system
- * toolbar.
- * 
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationView extends AbstractBaseView implements
-		ILibraryChangeListener {
-
-	/**
-	 * The view ID.
-	 */
-	public static final String VIEW_ID = ConfigurationView.class.getName();
-
-	private String configName;
-
-	private TreeViewer treeViewer;
-
-	private IDoubleClickListener doubleClickListener;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationView() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.ViewPart#init(IViewSite)
-	 */
-	public void init(IViewSite site) throws PartInitException {
-		super.init(site);
-		createActions(site);
-		LibraryUIManager.getInstance();
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				AuthoringUIHelpContexts.CONFIGURATION_VIEW_CONTEXT);
-
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-				new BasicCommandStack());
-		adapterFactory = (ComposedAdapterFactory) editingDomain
-				.getAdapterFactory();
-
-		// Open the current configuration.
-		setConfiguration(null);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryCreated(MethodLibrary)
-	 */
-	public void libraryCreated(MethodLibrary library) {
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryOpened(MethodLibrary)
-	 */
-	public void libraryOpened(MethodLibrary library) {
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryClosed(MethodLibrary)
-	 */
-	public void libraryClosed(MethodLibrary library) {
-		setInputForViewer(null);
-		if (adapterFactory instanceof ComposedAdapterFactory) {
-			((ComposedAdapterFactory) adapterFactory).dispose();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#librarySet(MethodLibrary)
-	 */
-	public void librarySet(MethodLibrary library) {
-		setMethodConfiguration(null);
-		// Add a library change listener.
-		ILibraryManager manager = LibraryService.getInstance()
-				.getCurrentLibraryManager();
-		if (manager != null) {
-			manager.addListener(this);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.events.ILibraryChangeListener#libraryChanged(int,
-	 *      Collection)
-	 */
-	public void libraryChanged(int option, Collection changedItems) {
-		switch (option) {
-		case ILibraryChangeListener.OPTION_DELETED:
-			if (changedItems != null) {
-				for (Iterator it = changedItems.iterator(); it.hasNext();) {
-					Object element = it.next();
-					if (element instanceof MethodConfiguration) {
-						if (((MethodConfiguration) element).getName().equals(
-								getCurrentConfig())) {
-							setMethodConfiguration(null);
-						}
-					}
-				}
-			}
-			break;                                                          
-			// Bugzilla defect 164739                                         
-		case ILibraryChangeListener.OPTION_CHANGED:                       
-			if (changedItems != null) {                                     
-				for (Iterator it = changedItems.iterator(); it.hasNext();) {  
-					Object element = it.next();                                 
-					if (element instanceof MethodConfiguration) {               
-						if (((MethodConfiguration) element)                       
-								.equals(LibraryService.getInstance()                  
-										.getCurrentMethodConfiguration())) {              
-							setContentDescription(((MethodConfiguration) element)   
-									.getName());                                        
-						}                                                         
-					}                                                           
-				}                                                             
-			}                                                               
-			break;                                                          
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#configurationSet(MethodConfiguration)
-	 */
-	public void configurationSet(MethodConfiguration config) {
-		setMethodConfiguration(config);
-	}
-
-	/**
-	 * @return the name of the currently viewed configuration
-	 */
-	public String getCurrentConfig() {
-		return configName;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#setFocus()
-	 */
-	public void setFocus() {
-		actionBarContributor.setActiveView(this);
-
-		IStructuredSelection selected = (IStructuredSelection) getSelection();
-		if (selected.isEmpty())
-			actionBarContributor.disableGlobalEditMenu();
-		else
-			actionBarContributor.enableGlobalEditMenu();
-
-		if (treeViewer != null) {
-			treeViewer.getControl().setFocus();
-		}
-	}
-
-	/**
-	 * Creates the viewer.
-	 */
-	public void createViewer(Composite parent) {
-		// Create the controls.
-		Composite content = new Composite(parent, SWT.NONE);
-		content.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout();
-		content.setLayout(layout);
-
-		treeViewer = new TreeViewer(content);
-		treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		// Add drag-and-drop support.
-		int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
-		Transfer[] transfers = new Transfer[] { HTMLTransfer.getInstance(),
-				LocalTransfer.getInstance() };
-		treeViewer.addDragSupport(dndOperations, transfers,
-				new LibraryViewerDragAdapter(treeViewer));
-
-		// Add a double click listener.
-		doubleClickListener = new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				UIActionDispatcher.getInstance().handleDoubleClickEvent(event);
-			}
-		};
-		treeViewer.addDoubleClickListener(doubleClickListener);
-
-		createContextMenuFor(treeViewer);
-	}
-
-	/**
-	 * Creates the actions.
-	 */
-	public void createActions(IViewSite viewSite) {
-		IAction editAction = new Action(AuthoringUIResources.actionLabel_edit) {
-			public void run() {
-				UIActionDispatcher.editConfiguration(configName);
-			}
-		};
-		editAction
-				.setToolTipText(AuthoringUIResources.editConfiguration_tooltip);
-	}
-
-	private void reset() {
-		// Prevent memory leak.
-		configName = null;
-		if (adapterFactory != null) {
-			if (adapterFactory instanceof IDisposable) {
-				((IDisposable) adapterFactory).dispose();
-			}
-			adapterFactory = null;
-		}
-		editingDomain.setAdapterFactory(null);
-		IContentProvider contentProvider = treeViewer.getContentProvider();
-		if (contentProvider != null) {
-			contentProvider.dispose();
-		}
-		IBaseLabelProvider labelProvider = treeViewer.getLabelProvider();
-		if (labelProvider != null) {
-			labelProvider.dispose();
-		}
-		StructuredSelection emptySelection = new StructuredSelection();
-		actionDispatcher.setSelection(emptySelection);
-		UIActionDispatcher.getInstance().setSelection(emptySelection);
-	}
-
-	/**
-	 * Sets the given Method Configuration as this viewer's input
-	 * 
-	 * @param config
-	 */
-	public void setMethodConfiguration(MethodConfiguration config) {
-		Control ctrl = this.getViewer().getControl();
-		if (ctrl == null || ctrl.isDisposed()) {
-			return;
-		}
-
-		if (treeViewer.getInput() == config)
-			return;
-		String title = ""; //$NON-NLS-1$
-
-		if (config != null) {
-			this.configName = config.getName();
-			IFilter configFilter = new ConfigurationViewFilter(config, treeViewer);
-			adapterFactory = TngAdapterFactory.INSTANCE
-					.getConfigurationView_AdapterFactory(configFilter);
-			editingDomain.setAdapterFactory(adapterFactory);
-			treeViewer.setContentProvider(new AdapterFactoryContentProvider(
-					adapterFactory));
-			treeViewer.setLabelProvider(new ConfigurationLabelProvider(config,
-					adapterFactory));
-			title = config.getName();
-		} else {
-			// Prevent memory leak.
-			configName = null;
-			if (adapterFactory != null) {
-				if (adapterFactory instanceof IDisposable) {
-					((IDisposable) adapterFactory).dispose();
-				}
-				adapterFactory = null;
-			}
-			editingDomain.setAdapterFactory(null);
-			IContentProvider contentProvider = treeViewer.getContentProvider();
-			if (contentProvider != null) {
-				contentProvider.dispose();
-			}
-			IBaseLabelProvider labelProvider = treeViewer.getLabelProvider();
-			if (labelProvider != null) {
-				labelProvider.dispose();
-			}
-			StructuredSelection emptySelection = new StructuredSelection();
-			actionDispatcher.setSelection(emptySelection);
-			UIActionDispatcher.getInstance().setSelection(emptySelection);
-		}
-
-		treeViewer.setInput(config);
-		setContentDescription(title);
-	}
-
-	/**
-	 * Sets this viewer's input to the Method Configuration with the given name
-	 * 
-	 * @param name
-	 */
-	public void setConfiguration(String name) {
-		configName = name;
-
-		if (name == null) {
-			MethodConfiguration config = LibraryService.getInstance()
-					.getCurrentMethodConfiguration();
-			if (config != null) {
-				configName = config.getName();
-			}
-		}
-
-		if (configName != null) {
-			MethodConfiguration config = LibraryServiceUtil
-					.getMethodConfiguration(LibraryService.getInstance()
-							.getCurrentMethodLibrary(), configName);
-			if (config != null) {
-				setMethodConfiguration(config);
-				return;
-			}
-		}
-
-		this.configName = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		if (doubleClickListener != null) {
-			treeViewer.removeDoubleClickListener(doubleClickListener);
-		}
-	}
-
-	/**
-	 * @return the ConfigurationView object
-	 */
-	public static ConfigurationView getView() {
-//		try {
-//			IWorkbenchPage activePage = PlatformUI.getWorkbench()
-//					.getActiveWorkbenchWindow().getActivePage();
-//			if (activePage != null) {
-//				IViewPart view = activePage.findView(VIEW_ID);
-//				if (view == null) {
-//					view = activePage.showView(VIEW_ID);
-//				}
-//				return (ConfigurationView) view;
-//			}
-//
-//		} catch (Exception e) {
-//			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-//		}
-//
-//		return null;
-		
-		boolean show = ViewHelper.isViewInCurrentPerspective(VIEW_ID);
-		return (ConfigurationView)ViewHelper.findView(VIEW_ID, show);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#getViewer()
-	 */
-	public Viewer getViewer() {
-		return treeViewer;
-	}
-
-	private class ConfigurationViewActionBarContributor extends
-			LibraryActionBarContributor {
-
-		private LibraryViewFindElementAction libraryViewFindElementAction;
-
-		public ConfigurationViewActionBarContributor(EditingDomain editingDomain) {
-			super(editingDomain);
-			
-			// don't show validate action
-			//
-			validateAction = null;
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#init(IActionBars)
-		 */
-		public void init(IActionBars actionBars) {
-			ISharedImages sharedImages = PlatformUI.getWorkbench()
-					.getSharedImages();
-			copyAction = createCopyAction();
-			copyAction.setImageDescriptor(sharedImages
-					.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-			actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-					copyAction);
-
-			viewActionBars = actionBars;
-			configViewEditAction = new ConfigurationViewEditAction(
-					AuthoringUIResources.actionLabel_edit);
-			actionBars.setGlobalActionHandler(
-					"org.eclipse.epf.authoring.ui.actions.openElement", //$NON-NLS-1$
-					configViewEditAction);
-			libraryViewFindElementAction = new LibraryViewFindElementAction(
-					AuthoringUIResources.actionLabel_findElementInLibNav);
-			actionBars.setGlobalActionHandler(
-					LibraryViewFindElementAction.ACTION_ID,
-					libraryViewFindElementAction);
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#activate()
-		 */
-		public void activate() {
-			activeViewPart.addPropertyListener(this);
-			ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
-					: activeViewPart.getSite().getSelectionProvider();
-			selectionProvider.addSelectionChangedListener(configViewEditAction);
-			selectionProvider
-					.addSelectionChangedListener(libraryViewFindElementAction);
-			copyAction.setEditingDomain(editingDomain);
-			selectionProvider.addSelectionChangedListener(copyAction);
-			update();
-		}
-
-		/**
-		 * @see LibraryActionBarContributor#deactivate()
-		 */
-		public void deactivate() {
-			activeViewPart.removePropertyListener(this);
-			ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
-					: activeViewPart.getSite().getSelectionProvider();
-			selectionProvider
-					.removeSelectionChangedListener(configViewEditAction);
-			selectionProvider
-					.removeSelectionChangedListener(libraryViewFindElementAction);
-			copyAction.setEditingDomain(null);
-			selectionProvider.removeSelectionChangedListener(copyAction);
-		}
-
-		/**
-		 * @see LibraryActionBarContributor#update()
-		 */
-		public void update() {
-			ISelectionProvider selectionProvider = activeViewPart instanceof ISelectionProvider ? (ISelectionProvider) activeViewPart
-					: activeViewPart.getSite().getSelectionProvider();
-			ISelection selection = selectionProvider.getSelection();
-			IStructuredSelection structuredSelection = selection instanceof IStructuredSelection ? (IStructuredSelection) selection
-					: StructuredSelection.EMPTY;
-			configViewEditAction.selectionChanged(structuredSelection);
-			libraryViewFindElementAction.selectionChanged(structuredSelection);
-			copyAction.updateSelection(structuredSelection);
-		}
-
-		/**
-		 * @see LibraryActionBarContributor#selectionChanged(SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-		}
-
-		/**
-		 * @see LibraryActionBarContributor#disableGlobalEditMenu()
-		 */
-		public void disableGlobalEditMenu() {
-			configViewEditAction.setEnabled(false);
-		}
-
-		/**
-		 * @see LibraryActionBarContributor#enableGlobalEditMenu()
-		 */
-		public void enableGlobalEditMenu() {
-			configViewEditAction.setEnabled(true);
-		}
-
-		/**
-		 * @see LibraryActionBarContributor#menuAboutToShow(IMenuManager)
-		 */
-		public void menuAboutToShow(IMenuManager menuManager) {
-			// Add our standard markers.
-			menuManager.add(new Separator("additions")); //$NON-NLS-1$
-			menuManager.add(new Separator("edit")); //$NON-NLS-1$
-
-			// Add our other standard marker.
-			menuManager.add(new Separator("additions-end")); //$NON-NLS-1$
-
-			addGlobalActions(menuManager);
-
-			menuManager.add(new Separator());
-			menuManager.add(new ActionContributionItem(configViewEditAction));
-			if (PerspectiveListUtil.isAuthoringPerspective()) {
-				menuManager.add(new ActionContributionItem(
-						libraryViewFindElementAction));
-			}
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#createCopyAction()
-		 */
-		protected CopyAction createCopyAction() {
-			return new LibraryViewCopyAction() {
-				@Override
-				public Command createCommand(Collection selection) {
-					return new IdentityCommand(selection);
-				}
-
-				@Override
-				public void run() {
-					String links = ""; //$NON-NLS-1$
-					for (Iterator iter = ((IdentityCommand) command)
-							.getResult().iterator(); iter.hasNext();) {
-						Object item = TngUtil.unwrap(iter.next());
-						if (item instanceof MethodElement) {
-							MethodElement e = (MethodElement) item;
-							String href = ResourceHelper
-									.getUrl(e, null, "html"); //$NON-NLS-1$
-							if (links.length() > 0) {
-								links += StrUtil.LINE_FEED;
-							}
-							links += ResourceHelper.getElementLink(e, true,
-									"file://" + href); //$NON-NLS-1$
-						}
-					}
-					if (links.length() > 0) {
-						ClipboardUtil.copyTextHTMLToClipboard(links);
-					}
-				}
-			};
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#createActionBarContributor()
-	 */
-	public ILibraryActionBarContributor createActionBarContributor() {
-		return new ConfigurationViewActionBarContributor(editingDomain);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#setInputForViewer(Object)
-	 */
-	public void setInputForViewer(Object model) {
-		if ((model == null) || (model instanceof MethodConfiguration)) {
-			setMethodConfiguration((MethodConfiguration) model);
-		} else {
-			reset();
-		}
-	}
-
-	@Override
-	public String getViewId() {
-		return VIEW_ID;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationViewFilter.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationViewFilter.java
deleted file mode 100644
index e5aec4e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationViewFilter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.eclipse.epf.authoring.ui.views;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.library.configuration.ConfigurationFilter;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.Viewer;
-
-public class ConfigurationViewFilter extends ConfigurationFilter {
-
-	protected Viewer viewer;
-	
-	public ConfigurationViewFilter(MethodConfiguration methodConfig, Viewer viewer) {
-		super(methodConfig);
-		this.viewer = viewer;
-	}
-	
-	public void notifyChanged(final Notification msg) {
-		if (viewer == null) {
-			return;
-		}
-	
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					viewer.refresh();
-				}
-			}
-		});
-
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationViewer.java
deleted file mode 100644
index bbf98e4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ConfigurationViewer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Displays the selectable plug-ins and packages of a method configuration in a
- * tree viewer.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationViewer extends CheckboxTreeViewer {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationViewer(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationViewer(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * Selects the given element in the tree.
-	 */
-	public void setSelection(Object element) {
-		super.expandToLevel(element, 0);
-		Widget ctrl = super.findItem(element);
-		if (ctrl != null) {
-			List items = new ArrayList();
-			items.add(ctrl);
-			super.setSelection(items);
-			this.getTree().setFocus();
-		}
-	}
-
-	/**
-	 * Refreshes the content of the viewer.
-	 */
-	public void refresh(final Object element, final boolean updateLabels) {
-		Object[] checked = this.getCheckedElements();
-		super.refresh(element, updateLabels);
-		this.setCheckedElements(checked);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ContentView.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ContentView.java
deleted file mode 100644
index 2388ab9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ContentView.java
+++ /dev/null
@@ -1,524 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.io.File;
-import java.util.Collection;
-
-import org.eclipse.epf.authoring.gef.viewer.ActivityDiagramService;
-import org.eclipse.epf.authoring.ui.AuthoringUIImages;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.BrowsingPerspective;
-import org.eclipse.epf.authoring.ui.UIActionDispatcher;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.diagram.ui.service.DiagramImageService;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * The Content view.
- * <p>
- * Displays the HTML representation of a Method element.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ContentView extends ViewPart {
-
-	/**
-	 * The view ID.
-	 */
-	public static final String VIEW_ID = ContentView.class.getName();
-
-	private ElementHTMLViewer contentViewer;
-
-	private Object displayedElement;
-
-	private IPartListener partListener = new IPartListener() {
-		public void partActivated(IWorkbenchPart part) {
-			if (part instanceof ContentView && part == ContentView.this) {
-				handleSelection(UIActionDispatcher.getInstance().getSelectionSource(), UIActionDispatcher.getInstance()
-				        .getSelection());
-			}
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partOpened(IWorkbenchPart part) {
-		}
-	};
-
-	private ISelectionChangedListener selectionChangeListener = new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			handleSelection(event.getSource(), event.getSelection());
-		}
-	};
-
-	private ILibraryChangeListener libraryChangeListener = new ILibraryChangeListener() {
-		public void libraryChanged(int option, Collection changedItems) {
-//			if (option == ILibraryChangeListener.OPTION_LOADED
-//					|| option == ILibraryChangeListener.OPTION_CREATED) {
-//				if (contentViewer != null) {
-//					contentViewer.setHtmlBuilder(new HtmlBuilder());
-//					contentViewer.getBrowser().redraw();
-//				}
-//			}
-
-			if (changedItems != null && displayedElement != null) {
-				if (changedItems.contains(displayedElement)) {
-					displayedElement = null;
-				}
-			}
-		}
-	};
-
-	private ILibraryServiceListener libSvcListener = new ILibraryServiceListener() {
-
-		public void configurationSet(MethodConfiguration config) {
-			contentViewer.getBrowser().setUrl("about:blank"); //$NON-NLS-1$
-			displayedElement = null;
-		}
-
-		public void libraryClosed(MethodLibrary library) {
-		}
-
-		public void libraryCreated(MethodLibrary library) {
-			cleanup();
-		}
-
-		public void libraryOpened(MethodLibrary library) {
-			cleanup();
-		}
-
-		public void libraryReopened(MethodLibrary library) {
-			cleanup();
-		}
-
-		public void librarySet(MethodLibrary library) {
-		}
-		
-		private void cleanup() {
-			if (contentViewer != null) {
-				contentViewer.setHtmlBuilder(new HtmlBuilder());
-				contentViewer.getBrowser().redraw();
-			}
-		}
-	};
-	
-	// Page navigation actions.
-	private Action backAction;
-
-	private Action forwardAction;
-
-	private Action stopAction;
-
-	private Action refreshAction;
-
-	private Action printAction;
-
-	// A hidden composite to hold the diagram viewer for diagram image
-	// generation.
-	private Composite diagramViewerHolder;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentView() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		try {
-			GridLayout layout = new GridLayout();
-			layout.marginWidth = 0;
-			layout.marginHeight = 0;
-			layout.horizontalSpacing = 0;
-			layout.verticalSpacing = 0;
-			parent.setLayout(layout);
-			parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			contentViewer = new ElementHTMLViewer(parent);
-			diagramViewerHolder = new Composite(parent, SWT.NONE);
-			diagramViewerHolder.setLayoutData(new GridData(1, 1)); // size
-			// can't be
-			// 0,0
-			// otherwise
-			// the
-			// diagram
-			// will not
-			// be
-			// painted
-			diagramViewerHolder.setLayout(new GridLayout());
-			diagramViewerHolder.setVisible(false);
-
-			// Create the page navigation tool buttons.
-			createActions();
-
-			// Add a part listener to monitor part activation and update this
-			// view
-			// as and when needed.
-			getSite().getWorkbenchWindow().getPartService().addPartListener(
-					partListener);
-
-			getSite().getWorkbenchWindow().addPerspectiveListener(
-					new IPerspectiveListener() {
-						public void perspectiveActivated(IWorkbenchPage page,
-								IPerspectiveDescriptor desc) {
-						}
-
-						public void perspectiveChanged(IWorkbenchPage page,
-								IPerspectiveDescriptor desc, String id) {
-							if (desc.getId().equals(
-									BrowsingPerspective.PERSPECTIVE_ID)) {
-								if (id
-										.equals(IWorkbenchPage.CHANGE_EDITOR_AREA_SHOW)) {
-									page.setEditorAreaVisible(false);
-									AuthoringUIPlugin
-											.getDefault()
-											.getMsgDialog()
-											.displayWarning(
-													AuthoringUIResources.warningDialog_title, 
-													AuthoringUIResources.addEditorToPerspectiveWarning_msg); 
-								}
-							}
-						}
-					});
-
-			// Add selection change listener to update this view as and when
-			// needed.
-			UIActionDispatcher.getInstance().addSelectionChangedListener(
-					selectionChangeListener);
-
-			LibraryService.getInstance().addListener(libSvcListener);
-
-			ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				manager.addListener(libraryChangeListener);
-			}
-		} catch (Exception e) {
-			// TODO: Display an error dialog.
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus
-	 */
-	public void setFocus() {
-		contentViewer.setFocus();
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#dispose
-	 */
-	public void dispose() {
-		LibraryService.getInstance().removeListener(libSvcListener);
-
-		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.removeListener(libraryChangeListener);
-		}
-		UIActionDispatcher.getInstance().removeSelectionChangedListener(
-				selectionChangeListener);
-		getSite().getWorkbenchWindow().getPartService().removePartListener(
-				partListener);
-	}
-
-	/**
-	 * Creates the actions for this view.
-	 */
-	protected void createActions() {
-		backAction = new Action() {
-			public void run() {
-				Browser browser = contentViewer.getBrowser();
-				if (browser != null) {
-					browser.back();
-				}
-			}
-		};
-		backAction.setText(AuthoringUIResources.back_text); 
-		backAction.setToolTipText(AuthoringUIResources.back_text); 
-		backAction.setImageDescriptor(PlatformUI.getWorkbench()
-				.getSharedImages().getImageDescriptor(
-						ISharedImages.IMG_TOOL_BACK));
-
-		forwardAction = new Action() {
-			public void run() {
-				Browser browser = contentViewer.getBrowser();
-				if (browser != null) {
-					browser.forward();
-				}
-			}
-		};
-		forwardAction.setText(AuthoringUIResources.forward_text); 
-		forwardAction.setToolTipText(AuthoringUIResources.forward_text); 
-		forwardAction.setImageDescriptor(PlatformUI.getWorkbench()
-				.getSharedImages().getImageDescriptor(
-						ISharedImages.IMG_TOOL_FORWARD));
-
-		stopAction = new Action() {
-			public void run() {
-				Browser browser = contentViewer.getBrowser();
-				if (browser != null) {
-					browser.stop();
-				}
-			}
-		};
-		stopAction.setText(AuthoringUIResources.stop_text); 
-		stopAction.setToolTipText(AuthoringUIResources.stop_text); 
-		stopAction.setImageDescriptor(AuthoringUIImages.IMG_DESC_STOP);
-
-		refreshAction = new Action() {
-			public void run() {
-				// Browser browser = contentViewer.getBrowser();
-				// if (browser != null) {
-				// browser.refresh();
-				// }
-
-				// need to regenerate the content
-				contentViewer.refresh();
-			}
-		};
-		refreshAction.setText(AuthoringUIResources.refresh_text); 
-		refreshAction.setToolTipText(AuthoringUIResources.refresh_text); 
-		refreshAction.setImageDescriptor(AuthoringUIImages.IMG_DESC_REFRESH);
-
-		printAction = new Action() {
-			public void run() {
-				contentViewer.print();
-			}
-		};
-		printAction.setText(AuthoringUIResources.print_text); 
-		printAction.setToolTipText(AuthoringUIResources.print_text); 
-		printAction.setImageDescriptor(AuthoringUIImages.IMG_DESC_PRINT);
-
-		IActionBars bars = getViewSite().getActionBars();
-		IToolBarManager manager = bars.getToolBarManager();
-		manager.add(backAction);
-		manager.add(forwardAction);
-		manager.add(stopAction);
-		manager.add(refreshAction);
-		manager.add(printAction);
-	}
-
-	protected boolean isViewVisible() {
-		IWorkbenchPage activePage = getSite().getWorkbenchWindow()
-		.getActivePage();
-		if (activePage == null) {
-			return false;
-		}
-		
-		IViewPart view = activePage.findView(getViewId());
-		if (view == null) {
-			return false;
-		}
-		
-		return true;
-	}
-	
-	/**
-	 * Handles the given selection.
-	 * 
-	 * @param source
-	 *            The Library or Configuration view.
-	 * @param selection
-	 *            The selection in the Library or Configuration view.
-	 */
-	protected void handleSelection(Object source, ISelection selection) {
-		if (selection == null || !isViewVisible() ) {
-			return;
-		}
-	
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			Object[] selectedElements = sel.toArray();
-			if (selectedElements != null && selectedElements.length > 0) {
-				Object element = selectedElements[0];
-				
-				// don't unwrap the object. 
-				// For activity, we need to wrapped item provider to get the suppress status.
-				// Object element = LibraryUtil.unwrap(selectedElement);
-				if (displayedElement != null && displayedElement == element) {
-					displayedElement = null;
-					return;
-				}
-				if (displayContentPage(source, element)) {
-					displayedElement = element;
-				}
-			}else{
-				contentViewer.getBrowser().setUrl("about:blank"); //$NON-NLS-1$
-				displayedElement = null;
-			}
-		}
-	}
-
-	protected boolean isConfigSource(Object source) {
-		return (source != null) && (source instanceof ConfigurationView);
-	}
-	
-	protected ElementLayoutManager getLayoutMgr() {
-		return 	LibraryService.getInstance()
-			.getCurrentConfigurationManager().getElementLayoutManager();
-	}
-	
-	protected String getViewId() {
-		return VIEW_ID;
-	}
-	
-	/**
-	 * Displays the content page for the given ContentElement.
-	 * 
-	 * @param source
-	 *            The Library or Configuration view.
-	 * @param element
-	 *            The selected Method element.
-	 * @return <code>true</code> if the content page is displayed
-	 *         successfully.
-	 */
-	protected boolean displayContentPage(Object source, Object raw_element) {
-		Object element = LibraryUtil.unwrap(raw_element);
-		element = ViewHelper.handleDangling(element);
-		if (element == null) {
-			return false;
-		}
-
-		ElementLayoutManager layoutMgr = null;
-		boolean isBrowsing = PerspectiveUtil
-				.isActivePerspective(BrowsingPerspective.PERSPECTIVE_ID);
-		boolean isConfigSource = isConfigSource(source);
-
-		// if in browsing but the source is not from configruation view
-		// ignore it
-		if (isBrowsing && !isConfigSource) {
-			return false;
-		}
-
-		if (isConfigSource) {
-			// Get the Element Layout Manager for the current configuration.
-			layoutMgr = getLayoutMgr();
-			if ( layoutMgr == null ) {
-				return false;
-			}
-			
-			// Add the activity diagram service to generate diagram images.
-			
-			String newDiagrams = AuthoringUIPlugin.getDefault().getPreferenceStore().getString("PUBLISH_NEW_DIAGRAM"); //$NON-NLS-1$
-			Boolean newDiagram = new Boolean(true);
-			if(newDiagrams != null && newDiagrams.length() > 0){
-				newDiagram = new Boolean(newDiagrams);
-			}
-			if(newDiagram.booleanValue()){
-				DiagramImageService diagramService = (DiagramImageService) layoutMgr
-					.getActivityDiagramService();
-				if (diagramService == null) {
-					diagramService = new DiagramImageService(
-						diagramViewerHolder,
-						new File(layoutMgr.getPublishDir()));
-					diagramService.setConfig(layoutMgr.getConfiguration());
-					layoutMgr.setActivityDiagramService(diagramService);
-				}
-//				 For Activity Detail Diagram 
-				boolean option = LibraryUIPreferences.getPublishUnopenActivitydd();
-				diagramService.setPublishedUnCreatedADD(option);
-				
-				// For Activity Diagram 
-				option = LibraryUIPreferences.getPublishADForActivityExtension();
-				diagramService.setPublishADForActivityExtension(option);
-			}else{
-//				 Add the activity diagram service to generate diagram images.
-				ActivityDiagramService diagramService = (ActivityDiagramService) layoutMgr
-						.getActivityDiagramService();
-				if (diagramService == null) {
-					diagramService = new ActivityDiagramService(
-							diagramViewerHolder,
-							new File(layoutMgr.getPublishDir()));
-					layoutMgr.setActivityDiagramService(diagramService);
-				}
-				
-				// For Activity Detail Diagram 
-				boolean option = LibraryUIPreferences.getPublishUnopenActivitydd();
-				diagramService.setPublishedUnCreatedADD(option);
-				
-				// For Activity Diagram 
-				option = LibraryUIPreferences.getPublishADForActivityExtension();
-				diagramService.setPublishADForActivityExtension(option);
-			}
-			
-			
-			
-		}
-
-		contentViewer.setLayoutManager(layoutMgr);
-		contentViewer.showElementContent(raw_element);
-
-		return true;
-	}
-
-	/**
-	 * Displays the HTML content page for a Method element.
-	 * 
-	 * @param element
-	 *            A Method element.
-	 * @return <code>true</code> if the HTML content page is displayed
-	 *         successfully.
-	 */
-	public boolean displayHTMLContentPage(Object element) {
-		element = LibraryUtil.unwrap(element);
-		element = ViewHelper.handleDangling(element);
-		if (element != null) {
-			contentViewer.setLayoutManager(null);
-			contentViewer.showElementContent(element);
-			return true;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ElementHTMLViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ElementHTMLViewer.java
deleted file mode 100644
index a880931..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ElementHTMLViewer.java
+++ /dev/null
@@ -1,471 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.layout.BrowsingLayoutSettings;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.elements.AbstractProcessElementLayout;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.LocationAdapter;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.browser.OpenWindowListener;
-import org.eclipse.swt.browser.StatusTextEvent;
-import org.eclipse.swt.browser.StatusTextListener;
-import org.eclipse.swt.browser.WindowEvent;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Displays the HTML representation of a Method element in a SWT Browser.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ElementHTMLViewer {
-
-//	// The default HTML wrappers for disabling the "Display Tree Browser" link
-//	// in the HTML content pages.
-//	private static final String DEFAULT_CONTENT_WRAPPER_START = "<html><head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"></head><title>Rational Unfied Process</title>" //$NON-NLS-1$
-//			+ "<script language=\"javascript\">function init() { parent.ory_toc=\"disable\"; parent.contentframe.location=\""; //$NON-NLS-1$
-//
-//	private static final String DEFAULT_CONTENT_WRAPPER_END = "\"; }</script></head>" //$NON-NLS-1$
-//			+ "<frameset rows=\"100%,*\" frameborder=\"no\" border=\"0\" framespacing=\"0\" id=\"contentframeset\" name=\"contentframeset\">" //$NON-NLS-1$
-//			+ "<frame src=\"about:blank\" id=\"contentframe\" name=\"contentframe\" scrolling=\"auto\"/>" //$NON-NLS-1$
-//			+ "<frame src=\"about:blank\" id=\"blankframe\" name=\"blankframe\" onload=\"init()\"/>" //$NON-NLS-1$
-//			+ "</frameset></html>"; //$NON-NLS-1$
-
-//	// The default HTML wrappers for printing the process content pages.
-//	private static final String DEFAULT_PRINT_WRAPPER_START = DEFAULT_CONTENT_WRAPPER_START
-//			+ "print();"; //$NON-NLS-1$
-//
-//	private static final String DEFAULT_PRINT_WRAPPER_END = DEFAULT_CONTENT_WRAPPER_END;
-//
-//	private static final String PRINT_FILE = "print.html"; //$NON-NLS-1$
-
-	// The HTML wrappers for disabling the "Display Tree Browser" link in the
-	// HTML content pages.
-//	private String contentWrapperSart;
-//
-//	private String contentWrapperEnd;
-
-//	// The HTML wrappers for printing the HTML content pages.
-//	private String printWrapperSart;
-//
-//	private String printWrapperEnd;
-//
-//	// The built-in browser for printing the HTML pages.
-//	// don't use a second 
-//	private Browser printBrowser;
-
-	protected Browser browser = null;
-
-	protected Composite parent;
-
-	private String currentLocation = null;
-
-	// save the current text from the status listener
-	// we need this to open browser with this url 
-	// since under linux browser can't be opened automatically, which is really bad
-	private String currentText = null;
-	private HtmlBuilder htmlBuilder;
-
-	private Cursor waitCursor = null;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ElementHTMLViewer(Composite parent) {
-		this.parent = parent;
-		htmlBuilder = new HtmlBuilder();
-		createControl();
-	}
-
-	/**
-	 * Creates the SWT browser controls for viewing and printing the HTML
-	 * content pages.
-	 */
-	private void createControl() {
-		try {
-			browser = new Browser(parent, SWT.NONE);
-			browser.setLayoutData(new GridData(GridData.FILL_BOTH|GridData.GRAB_VERTICAL));
-			browser.addLocationListener(new LocationAdapter() {
-				public void changed(LocationEvent e) {
-					//System.out.println("location changed");
-				}
-
-				public void changing(LocationEvent e) {
-					//System.out.println("location changing...");
-					// Get the current location.
-					String location = getElementUrl(e.location);
-					if ( location == null || location.startsWith(ResourceHelper.URL_STR_JAVASCRIPT))
-					{
-						return;
-					}
-					if (isLocationChanged(location)) {
-						// Save the current location for printing purposes.
-						currentLocation = location;
-						generateHtml(currentLocation);
-					}
-				}
-			});
-
-			browser.addStatusTextListener(new StatusTextListener()
-			{
-				public void changed(StatusTextEvent event)
-				{
-					// Get the current text.
-					String text = event.text;
-					if (text != null && text.length() > 0)
-					{
-						// Save the current text for application launching purposes.
-						currentText = text;
-						//System.out.println("Status changed: " + text);
-					}
-				}
-			});
-			
-			browser.addOpenWindowListener(new OpenWindowListener(){
-
-				public void open(WindowEvent event) {
-					// handle open window.
-					// with mozilla in linux, open window does not work
-					//System.out.println("Open window event: " + event);
-					
-					// windows can launch the browser without problem
-					// linux needs more care
-					if (SWT.getPlatform().equals("win32")) //$NON-NLS-1$
-					{
-						return;
-					}
-					
-					Display.getCurrent().asyncExec(new Runnable()
-					{
-					    public void run()
-						{
-							try
-							{
-//								// if the url is a resource with relative path, find the absolute path
-//								if ( currentText.startsWith("file:") )
-//								{
-//									// get the file path from the 
-//								}
-																
-//								// open another swt browser since we have no (simple) way of creating a system default browser
-//								// the Eclipse guys hide all the good apis as internal
-								Shell shell = new Shell();
-								GridLayout layout = new GridLayout();
-								layout.marginHeight = 0;
-								layout.marginWidth = 0;
-								shell.setLayout(layout);
-								Browser popup_browser = new Browser(shell, SWT.NONE);
-								popup_browser.setLayoutData(new GridData(GridData.FILL_BOTH|GridData.GRAB_HORIZONTAL|GridData.GRAB_VERTICAL));
-								popup_browser.setUrl(currentText);
-																
-								shell.open();
-
-							}
-							catch (Exception e)
-							{
-								e.printStackTrace();
-							}
-						}
-					});
-				}});
-			
-//			// don't use a seperate browser for printing since this will lose the 
-//			// states of the current page, for example, the expanded sections, etc.
-//			// Jinhua Xi,  3/5/2007
-//			// Create the hidden browser used for printing the HTML content
-//			// pages.
-//			printBrowser = new Browser(parent, SWT.NONE);
-//			printBrowser.setSize(1, 1);
-//			printBrowser.setVisible(false);
-//
-//			// Linux: There is unused space in preview/browsing, which is in grey.
-//			// this is needed for linux
-//			GridData gd = new GridData();
-//			gd.heightHint = 1;
-//			printBrowser.setLayoutData(gd);
-			
-			
-			// Read the HTML wrappers for disabling the "Display Tree Browser"
-			// link in the HTML content pages.
-//			contentWrapperSart = HTMLWrappers
-//					.getString("CONTENT_WRAPPER_START"); //$NON-NLS-1$
-//			if (contentWrapperSart == null) {
-//				contentWrapperSart = DEFAULT_CONTENT_WRAPPER_START;
-//			}
-//			contentWrapperEnd = HTMLWrappers.getString("CONTENT_WRAPPER_END"); //$NON-NLS-1$
-//			if (contentWrapperEnd == null) {
-//				contentWrapperEnd = DEFAULT_CONTENT_WRAPPER_START;
-//			}
-
-//			// Read the HTML wrappers for printing the HTML content pages.
-//			printWrapperSart = HTMLWrappers.getString("PRINT_WRAPPER_START"); //$NON-NLS-1$
-//			if (printWrapperSart == null) {
-//				printWrapperSart = DEFAULT_PRINT_WRAPPER_START;
-//			}
-//			printWrapperEnd = HTMLWrappers.getString("PRINT_WRAPPER_END"); //$NON-NLS-1$
-//			if (printWrapperEnd == null) {
-//				printWrapperEnd = DEFAULT_PRINT_WRAPPER_END;
-//			}
-
-			waitCursor = parent.getShell().getDisplay().getSystemCursor(
-					SWT.CURSOR_WAIT);
-		} catch (Exception e) {
-			browser = null;
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	private boolean isLocationChanged(String location) {
-		if (location == null || currentLocation == null) {
-			return false;
-		}
-
-		if (File.separatorChar != '/') {
-			location = location.replace(File.separatorChar, '/');
-			String oldLocation = getUrl(currentLocation);
-
-			// Some times the current URL is a full path, so just compare the end.
-			
-			//  bug in IE6, the location in the location change event might be truncated if the url is too long, 
-			// could be up to 159 characters.
-			
-			return oldLocation.indexOf(location) != 0;
-		} else {
-			return !location.endsWith(currentLocation)
-					&& !currentLocation.endsWith(location);
-		}
-
-	}
-
-	/**
-	 * Returns the SWT browser that displays the HTML content pages.
-	 */
-	public Browser getBrowser() {
-		return browser;
-	}
-
-	/**
-	 * Sets focus to this control.
-	 */
-	public void setFocus() {
-		if (browser != null) {
-			browser.setFocus();
-		}
-	}
-
-	/**
-	 * Returns the HTML Builder.
-	 */
-	public HtmlBuilder getHtmlBuilder() {
-		
-		if ( htmlBuilder != null ) {
-			BrowsingLayoutSettings.INSTANCE.update(htmlBuilder);
-		}
-		return htmlBuilder;
-	}
-
-	/**
-	 * Sets the HTML Builder.
-	 */
-	public void setHtmlBuilder(HtmlBuilder builder) {
-		this.htmlBuilder = builder;
-	}
-
-	/**
-	 * Sets the Element Layout Manager.
-	 */
-	public void setLayoutManager(ElementLayoutManager layoutMgr) {
-		htmlBuilder.setLayoutManager(layoutMgr);
-	}
-
-
-	
-	/**
-	 * Displays the HTML representation for a Method element.
-	 */
-	public void showElementContent(Object raw_element) {
-
-		startWait();
-
-		try {
-			IElementLayout layout = null;
-			String file_url = "about:blank"; //$NON-NLS-1$
-			Object element = LibraryUtil.unwrap(raw_element);
-			if ( raw_element instanceof ActivityWrapperItemProvider ) {
-				ActivityWrapperItemProvider wrapper = (ActivityWrapperItemProvider)raw_element;
-				Object proc = wrapper.getTopItem();
-				if ( element instanceof MethodElement && proc instanceof org.eclipse.epf.uma.Process ) {
-					String path = AbstractProcessElementLayout.getPath(wrapper);
-					//System.out.println(topItem);
-					layout = getHtmlBuilder().getLayoutManager()
-						.createLayout((MethodElement)element, 
-								(org.eclipse.epf.uma.Process)proc, path);
-					file_url = getHtmlBuilder().generateHtml(layout);
-				}
-			} else if (element instanceof MethodElement) {
-					file_url = getHtmlBuilder().generateHtml((MethodElement)element);
-			}
-			
-			if ( file_url == null ) {
-				file_url = "about:blank"; //$NON-NLS-1$
-			}
-			// on linux, the file path need to be specified as file, otherwise it will be treated as url
-			// and casuign encoding/decoding issue
-			// Linux: Configuration names containing accented characters cannot be browsed.
-			else {			
-				if (!SWT.getPlatform().equals("win32") && !file_url.startsWith("file://") && //$NON-NLS-1$ //$NON-NLS-2$
-					!file_url.equals("about:blank")) //$NON-NLS-1$
-				{
-					file_url = "file://" + file_url; //$NON-NLS-1$
-				}
-				
-				// Bug 201335 - Refresh does not work correctly for process pages in browsing mode
-				// need to append the query string
-				if ( layout instanceof AbstractProcessElementLayout ) {
-					file_url += ((AbstractProcessElementLayout)layout).getQueryString();
-				}
-			}
-		
-			// Set the current location to avoid re-generating the HTML file in
-			// respond to a location change.
-			currentLocation = file_url;
-			browser.setUrl(file_url);
-		} catch (RuntimeException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-
-		endWait();
-	}
-
-	private void generateHtml(String url) {
-		startWait();
-		try {
-			getHtmlBuilder().generateHtml(url);
-		} catch (RuntimeException e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-
-		endWait();
-	}
-
-	/**
-	 * Returns the element URL.
-	 */
-	private String getElementUrl(String location) {
-		if (location == null || location.length() == 0
-				|| location.equals("about:blank")  //$NON-NLS-1$
-				|| location.toLowerCase().startsWith(ResourceHelper.URL_STR_JAVASCRIPT)) {
-			return null;
-		}
-
-		location = getUrl(location);
-		if (location.indexOf(ResourceHelper.MISSING_PAGES_FOLDER) >= 0) {
-			return null;
-		}
-
-		// make sure the url is an element url, check the guid
-		if ( ResourceHelper.getGuidFromFileName(location) == null )
-		{
-			return null;
-		}
-		return location;
-	}
-
-	/**
-	 * Returns the URL for the given location.
-	 */
-	private String getUrl(String location) {
-		String publish_dir = getHtmlBuilder().getPublishDir();
-		String url = fixPath(location);
-		int index = url.toLowerCase().indexOf(
-				fixPath(publish_dir).toLowerCase());
-		if (index >= 0) {
-			url = url.substring(index + publish_dir.length());
-		}
-		index = url.indexOf("#"); //$NON-NLS-1$
-		if (index > 0) {
-			url = url.substring(0, index);
-		}
-		return url;
-	}
-
-	private String fixPath(String path) {
-		try {
-			path = URLDecoder.decode(path, "utf-8"); //$NON-NLS-1$
-			if (File.separatorChar != '/') {
-				return path.replace(File.separatorChar, '/');
-			}
-			return path;
-		} catch (UnsupportedEncodingException e) {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Prints the current HTML page.
-	 */
-	public void print() {
-		boolean b = this.browser.execute("window.print();"); //$NON-NLS-1$
-//		if ( !b ) {
-//			final String printFile = htmlBuilder.getPublishDir() + PRINT_FILE;
-//			if (currentLocation != null) {
-//				StringBuffer wrapperHTML = new StringBuffer();
-//				wrapperHTML.append(printWrapperSart).append(currentLocation)
-//						.append(printWrapperEnd);
-//				String htmlText = wrapperHTML.toString();
-//				if (FileUtil.writeUTF8File(printFile, htmlText)) {
-//					printBrowser.setUrl(printFile);
-//				}
-//			}
-//		}
-	}
-
-	private void startWait() {
-		parent.getShell().setCursor(waitCursor);
-	}
-
-	private void endWait() {
-		parent.getShell().setCursor(null);
-	}
-
-	/**
-	 * Refreshes the content.
-	 * <p>
-	 * Regenerates the content before refreshing the browser.
-	 * 
-	 */
-	public void refresh() {
-		generateHtml(currentLocation);
-		browser.refresh();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ElementsViewContextHelp.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ElementsViewContextHelp.java
deleted file mode 100644
index bab2059..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ElementsViewContextHelp.java
+++ /dev/null
@@ -1,172 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * 
- * Context Help for element
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class ElementsViewContextHelp {
-
-	/**
-	 * Sets the help of the given selection
-	 * @param selection
-	 * @param uiComposite
-	 */
-	public static void setHelp(ISelection selection, Composite uiComposite) {
-		IStructuredSelection selected = (IStructuredSelection) selection;
-		// if multiple items selected, only the first item's context help will
-		// be displayed
-		Object obj = selected.getFirstElement();
-		// System.out.println("$$$ Setting help for the selection obj = " +
-		// obj);
-		setHelp(obj, uiComposite);
-	}
-
-	/**
-	 * Sets the help of the object
-	 * @param obj
-	 * @param uiComposite
-	 */
-	public static void setHelp(Object obj, Composite uiComposite) {
-		if (obj == null)
-			return;
-
-		obj = LibraryUtil.unwrap(obj);
-
-		if ((obj instanceof MethodPlugin)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof ContentPackage)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof Role)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof Task)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof WorkProduct)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof Guidance)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof Discipline)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof DisciplineGrouping)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(
-					uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof Domain)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof WorkProductType)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof RoleSet)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof Tool)) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-		if ((obj instanceof RoleSetGrouping)) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-
-		if (obj instanceof CustomCategory) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-
-		if (obj instanceof ProcessComponent) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-
-		if (obj instanceof Process) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(uiComposite,
-					AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-
-		if (obj instanceof MethodConfiguration) {
-			PlatformUI
-					.getWorkbench()
-					.getHelpSystem()
-					.setHelp(
-							uiComposite,
-							AuthoringUIHelpContexts.LIBRARY_VIEW_NODE_CONTEXT_NOT_IMPLEMENTED);
-			return;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/GrayingCheckboxTreeViewerWrapper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/GrayingCheckboxTreeViewerWrapper.java
deleted file mode 100644
index 5206f2a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/GrayingCheckboxTreeViewerWrapper.java
+++ /dev/null
@@ -1,641 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-
-/**
- * Wrapper around a org.eclipse.jface.viewers.CheckboxTreeViewer that supports graying of
- * parent elements with partial child selections
- * 
- * code taken from org.eclipse.jdt.internal.ui.jarpackager.CheckboxTreeAndListGroup
- * @author Jeff Hardy
- *
- */
-public class GrayingCheckboxTreeViewerWrapper implements ICheckStateListener, ISelectionChangedListener, ITreeViewerListener {
-	
-	protected AdapterFactoryContentProvider fTreeContentProvider;
-	protected AdapterFactoryLabelProvider fTreeLabelProvider;
-	
-	protected List<Object> fExpandedTreeNodes= new ArrayList<Object>();
-	protected List<Object> fCheckedStateStore= new ArrayList<Object>();
-	protected List<Object> fWhiteCheckedTreeItems= new ArrayList<Object>();
-	protected List<ICheckStateListener> fListeners= new ArrayList<ICheckStateListener>();
-	
-	// widget
-	protected CheckboxTreeViewer fTreeViewer;
-	
-	protected Object fRoot;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GrayingCheckboxTreeViewerWrapper(Composite parent, int height,
-			Object rootObject,
-			AdapterFactoryContentProvider treeContentProvider,
-			AdapterFactoryLabelProvider treeLabelProvider) {
-		
-		fRoot = rootObject;
-		fTreeContentProvider = treeContentProvider;
-		fTreeLabelProvider = treeLabelProvider;
-		createContents(parent, height);
-	}
-	
-	/**
-	 *	Lay out and initialize self's visual components.
-	 *
-	 *	@param parent org.eclipse.swt.widgets.Composite
-	 *	@param width int
-	 *	@param height int
-	 */
-	protected void createContents(Composite parent, int height) {
-		createTreeViewer(parent, height);
-		initialize();
-	}
-
-	protected void createTreeViewer(Composite parent, int height) {
-		Tree tree= new Tree(parent, SWT.CHECK | SWT.BORDER);
-		GridData data= new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL);
-		data.heightHint= height;
-		tree.setLayoutData(data);
-
-		fTreeViewer= new CheckboxTreeViewer(tree);
-		fTreeViewer.setUseHashlookup(true);
-		fTreeViewer.setContentProvider(fTreeContentProvider);
-		fTreeViewer.setLabelProvider(fTreeLabelProvider);
-		fTreeViewer.addTreeListener(this);
-		fTreeViewer.addCheckStateListener(this);
-		fTreeViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * This method must be called just before this window becomes visible.
-	 */
-	public void aboutToOpen() {
-		determineWhiteCheckedDescendents(fRoot);
-		checkNewTreeElements(getTreeChildren(fRoot));
-
-		//select the first element in the list
-		Object[] elements= getTreeChildren(fRoot);
-		Object primary= elements.length > 0 ? elements[0] : null;
-		if (primary != null) {
-			fTreeViewer.setSelection(new StructuredSelection(primary));
-		}
-		fTreeViewer.getControl().setFocus();
-	}
-	/**
-	 *	Adds the passed listener to self's collection of clients
-	 *	that listen for changes to element checked states
-	 *
-	 *	@param listener ICheckStateListener
-	 */
-	public void addCheckStateListener(ICheckStateListener listener) {
-		fListeners.add(listener);
-	}
-	
-	/**
-	 * Adds the receiver and all of it's ancestors to the checkedStateStore if they
-	 * are not already there.
-	 */
-	protected void addToHierarchyToCheckedStore(Object treeElement) {
-
-		// if this tree element is already gray then its ancestors all are as well
-		if (!fCheckedStateStore.contains(treeElement))
-			fCheckedStateStore.add(treeElement);
-
-		Object parent= fTreeContentProvider.getParent(treeElement);
-		if (parent != null)
-			addToHierarchyToCheckedStore(parent);
-		fTreeViewer.setExpandedState(treeElement, true);
-	}
-
-
-	/**
-	 *	Returns a boolean indicating whether all children of the passed tree element
-	 *	are currently white-checked
-	 *
-	 *	@return boolean
-	 *	@param treeElement java.lang.Object
-	 */
-	protected boolean areAllChildrenWhiteChecked(Object treeElement) {
-		Object[] children= getTreeChildren(treeElement);
-		for (int i= 0; i < children.length; ++i) {
-			if (!fWhiteCheckedTreeItems.contains(children[i]))
-				return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 *	Iterates through the passed elements which are being realized for the first
-	 *	time and check each one in the tree viewer as appropriate
-	 */
-	protected void checkNewTreeElements(Object[] elements) {
-		for (int i= 0; i < elements.length; ++i) {
-			Object currentElement= elements[i];
-			boolean checked= fCheckedStateStore.contains(currentElement);
-			fTreeViewer.setChecked(currentElement, checked);
-			fTreeViewer.setGrayed(
-				currentElement,
-				checked && !fWhiteCheckedTreeItems.contains(currentElement));
-		}
-	}
-	/**
-	*	An item was checked in one of self's two views.  Determine which
-	*	view this occurred in and delegate appropriately
-	*
-	*	@param event CheckStateChangedEvent
-	*/
-	public void checkStateChanged(final CheckStateChangedEvent event) {
-
-		//Potentially long operation - show a busy cursor
-		BusyIndicator.showWhile(fTreeViewer.getControl().getDisplay(), new Runnable() {
-			public void run() {
-				if (event.getCheckable().equals(fTreeViewer))
-					treeItemChecked(event.getElement(), event.getChecked());
-
-				notifyCheckStateChangeListeners(event);
-			}
-		});
-	}
-	
-	/**
-	 * Sets an item's checked state as if the user had clicked on it
-	 * @param treeElement
-	 * @param state
-	 */
-	public void selectTreeCheck(Object treeElement, boolean state) {
-		treeItemChecked(treeElement, state);
-	}
-
-	/**
-	 * Returns a boolean indicating whether the passed tree element should be
-	 * at LEAST gray-checked.  Note that this method does not consider whether
-	 * it should be white-checked, so a specified tree item which should be
-	 * white-checked will result in a <code>true</code> answer from this method.
-	 * To determine whether a tree item should be white-checked use method
-	 * #determineShouldBeWhiteChecked(Object).
-	 *
-	 * @param treeElement java.lang.Object
-	 * @return boolean
-	 * @see #determineShouldBeWhiteChecked(java.lang.Object)
-	 */
-	protected boolean determineShouldBeAtLeastGrayChecked(Object treeElement) {
-		// if any children of treeElement are still gray-checked then treeElement
-		// must remain gray-checked as well
-		Object[] children= getTreeChildren(treeElement);
-		for (int i= 0; i < children.length; ++i) {
-			if (fCheckedStateStore.contains(children[i]))
-				return true;
-		}
-
-		return false;
-	}
-	
-	/**
-	 * Returns a boolean indicating whether the passed tree item should be
-	 * white-checked.
-	 *
-	 * @return boolean
-	 * @param treeElement java.lang.Object
-	 */
-	protected boolean determineShouldBeWhiteChecked(Object treeElement) {
-		return areAllChildrenWhiteChecked(treeElement) && fCheckedStateStore.contains(treeElement);
-	}
-	
-	/**
-	 *	Recursively adds appropriate tree elements to the collection of
-	 *	known white-checked tree elements.
-	 *
-	 *	@param treeElement java.lang.Object
-	 */
-	protected void determineWhiteCheckedDescendents(Object treeElement) {
-		// always go through all children first since their white-checked
-		// statuses will be needed to determine the white-checked status for
-		// this tree element
-		Object[] children= getTreeChildren(treeElement);
-		for (int i= 0; i < children.length; ++i)
-			determineWhiteCheckedDescendents(children[i]);
-
-		// now determine the white-checked status for this tree element
-		if (determineShouldBeWhiteChecked(treeElement))
-			setWhiteChecked(treeElement, true);
-	}
-	
-	/**
-	 * Causes the tree viewer to expand all its items
-	 */
-	public void expandAll() {
-		fTreeViewer.expandAll();
-	}
-	
-	/**
-	 * Causes the tree viewer to collapse all its items
-	 */
-	public void collapseAll() {
-		fTreeViewer.collapseAll();
-	}
-
-	/**
-	 *	Answer a collection of all of the checked elements in the tree portion
-	 *	of self
-	 *
-	 *	@return java.util.Vector
-	 */
-	public Set<Object> getAllCheckedTreeItems() {
-		return new HashSet<Object>(fCheckedStateStore);
-	}
-	/**
-	 *	Answers the number of elements that have been checked by the
-	 *	user.
-	 *
-	 *	@return int
-	 */
-	public int getCheckedElementCount() {
-		return fCheckedStateStore.size();
-	}
-
-	/**
-	 * Gets the tree that displays the list for a folder
-	 * 
-	 * @return the tree used to show the folders
-	 */
-	public Tree getTree() {
-		return fTreeViewer.getTree();
-	}
-	
-	/**
-	 * Adds the given filter to the tree viewer and
-	 * triggers refiltering and resorting of the elements.
-	 *
-	 * @param filter a viewer filter
-	 */
-	public void addTreeFilter(ViewerFilter filter) {
-		fTreeViewer.addFilter(filter);
-	}
-
-	/**
-	 *	Logically gray-check all ancestors of treeItem by ensuring that they
-	 *	appear in the checked table
-	 */
-	protected void grayCheckHierarchy(Object treeElement) {
-
-		// if this tree element is already gray then its ancestors all are as well
-		if (fCheckedStateStore.contains(treeElement))
-			return; // no need to proceed upwards from here
-
-		fCheckedStateStore.add(treeElement);
-		if (determineShouldBeWhiteChecked(treeElement)) {
-			setWhiteChecked(treeElement, true);
-		}
-		Object parent= fTreeContentProvider.getParent(treeElement);
-		if (parent != null)
-			grayCheckHierarchy(parent);
-	}
-	
-	/**
-	 *	Sets the initial checked state of the passed element to true,
-	 *	as well as to all of its children and associated list elements
-	 */
-	public void initialCheckTreeItem(Object element) {
-		treeItemChecked(element, true);
-	}
-	/**
-	 *	Initializes this group's viewers after they have been laid out.
-	 */
-	protected void initialize() {
-		fTreeViewer.setInput(fRoot);
-	}
-
-	/**
-	 *	Notifies all checked state listeners that the passed element has had
-	 *	its checked state changed to the passed state
-	 */
-	protected void notifyCheckStateChangeListeners(CheckStateChangedEvent event) {
-		Iterator listenersEnum= fListeners.iterator();
-		while (listenersEnum.hasNext())
-			 ((ICheckStateListener) listenersEnum.next()).checkStateChanged(event);
-	}
-
-	/**
-	 *	Removes the passed listener from self's collection of clients
-	 *	that listen for changes to element checked states
-	 *
-	 *	@param listener ICheckStateListener
-	 */
-	public void removeCheckStateListener(ICheckStateListener listener) {
-		fListeners.remove(listener);
-	}
-	
-	/**
-	 *	Handles the selection of an item in the tree viewer
-	 *
-	 *	@param event ISelection
-	 */
-	public void selectionChanged(final SelectionChangedEvent event) {
-//		BusyIndicator.showWhile(getTree().getShell().getDisplay(), new Runnable() {
-//			public void run() {
-//				IStructuredSelection selection= (IStructuredSelection) event.getSelection();
-//				Object selectedElement= selection.getFirstElement();
-//				if (selectedElement == null) {
-//					return;
-//				} else {
-//				}
-//			}
-//		});
-	}
-
-	/**
-	 * Selects or deselect all of the elements in the tree depending on the value of the selection
-	 * boolean. Be sure to update the displayed files as well.
-	 */
-	public void setAllSelections(final boolean selection) {
-
-		//Potentially long operation - show a busy cursor
-		BusyIndicator.showWhile(fTreeViewer.getControl().getDisplay(), new Runnable() {
-			public void run() {
-				setTreeChecked(fRoot, selection);
-			}
-		});
-	}
-
-	/**
-	 * Sets the root of the widget to be new Root. Regenerate all of the tables and lists from this
-	 * value.
-	 * 
-	 * @param newRoot 
-	 */
-	public void setRoot(Object newRoot) {
-		this.fRoot= newRoot;
-		initialize();
-	}
-	
-	/**
-	 *	Sets the checked state of the passed tree element appropriately, and
-	 *	do so recursively to all of its child tree elements as well
-	 */
-	protected void setTreeChecked(Object treeElement, boolean state) {
-
-		if (state) {
-			fCheckedStateStore.add(treeElement);
-		} else
-			fCheckedStateStore.remove(treeElement);
-
-		setWhiteChecked(treeElement, state);
-		fTreeViewer.setChecked(treeElement, state);
-		fTreeViewer.setGrayed(treeElement, false);
-
-		// now logically check/uncheck all children as well
-		Object[] children= getTreeChildren(treeElement);
-		for (int i= 0; i < children.length; ++i) {
-			setTreeChecked(children[i], state);
-		}
-	}
-	/**
-	 *	Sets the tree viewer's providers to those passed
-	 *
-	 *	@param contentProvider ITreeContentProvider
-	 *	@param labelProvider ILabelProvider
-	 */
-	public void setTreeProviders(
-		ITreeContentProvider contentProvider,
-		ILabelProvider labelProvider) {
-		fTreeViewer.setContentProvider(contentProvider);
-		fTreeViewer.setLabelProvider(labelProvider);
-	}
-	/**
-	 *	Sets the sorter that is to be applied to self's tree viewer
-	 */
-	public void setTreeSorter(ViewerSorter sorter) {
-		fTreeViewer.setSorter(sorter);
-	}
-	/**
-	 *	Adjusts the collection of references to white-checked tree elements appropriately.
-	 *
-	 *	@param treeElement java.lang.Object
-	 *	@param isWhiteChecked boolean
-	 */
-	protected void setWhiteChecked(Object treeElement, boolean isWhiteChecked) {
-		if (isWhiteChecked) {
-			if (!fWhiteCheckedTreeItems.contains(treeElement))
-				fWhiteCheckedTreeItems.add(treeElement);
-		} else
-			fWhiteCheckedTreeItems.remove(treeElement);
-	}
-	/**
-	 *	Handle the collapsing of an element in a tree viewer
-	 */
-	public void treeCollapsed(TreeExpansionEvent event) {
-		// We don't need to do anything with this
-	}
-
-	/**
-	 *	Handles the expansionsion of an element in a tree viewer
-	 */
-	public void treeExpanded(TreeExpansionEvent event) {
-
-		Object item= event.getElement();
-
-		// First see if the children need to be given their checked state at all.  If they've
-		// already been realized then this won't be necessary
-		if (!fExpandedTreeNodes.contains(item)) {
-			fExpandedTreeNodes.add(item);
-			checkNewTreeElements(getTreeChildren(item));
-		}
-	}
-
-	/**
-	 *  Callback that's invoked when the checked status of an item in the tree
-	 *  is changed by the user.
-	 */
-	protected void treeItemChecked(Object treeElement, boolean state) {
-
-		// recursively adjust all child tree elements appropriately
-		setTreeChecked(treeElement, state);
-
-		Object parent= fTreeContentProvider.getParent(treeElement);
-		if (parent == null)
-			return;
-
-		// now update upwards in the tree hierarchy 
-		if (state)
-			grayCheckHierarchy(parent);
-		else
-			ungrayCheckHierarchy(parent);
-
-		updateHierarchy(treeElement);
-	}
-	/**
-	 *	Logically un-gray-check all ancestors of treeItem iff appropriate.
-	 */
-	protected void ungrayCheckHierarchy(Object treeElement) {
-		if (!determineShouldBeAtLeastGrayChecked(treeElement))
-			fCheckedStateStore.remove(treeElement);
-
-		Object parent= fTreeContentProvider.getParent(treeElement);
-		if (parent != null)
-			ungrayCheckHierarchy(parent);
-	}
-	/**
-	 *	Sets the checked state of self and all ancestors appropriately
-	 */
-	protected void updateHierarchy(Object treeElement) {
-
-		boolean whiteChecked= determineShouldBeWhiteChecked(treeElement);
-		boolean shouldBeAtLeastGray= determineShouldBeAtLeastGrayChecked(treeElement);
-
-		fTreeViewer.setChecked(treeElement, whiteChecked || shouldBeAtLeastGray);
-		setWhiteChecked(treeElement, whiteChecked);
-		if (whiteChecked)
-			fTreeViewer.setGrayed(treeElement, false);
-		else
-			fTreeViewer.setGrayed(treeElement, shouldBeAtLeastGray);
-
-		// proceed up the tree element hierarchy
-		Object parent= fTreeContentProvider.getParent(treeElement);
-		if (parent != null) {
-			updateHierarchy(parent);
-			if (whiteChecked || shouldBeAtLeastGray)
-				fTreeViewer.setExpandedState(parent, true);
-		}
-	}
-	
-	/**
-	 * Returns the result of running the given elements through the filters.
-	 *
-	 * @param elements the elements to filter
-	 * @return only the elements which all filters accept
-	 */
-	protected Object[] filter(ViewerFilter[] filters, Object[] elements) {
-		if (filters != null) {
-			ArrayList<Object> filtered = new ArrayList<Object>(elements.length);
-			for (int i = 0; i < elements.length; i++) {
-				boolean add = true;
-				for (int j = 0; j < filters.length; j++) {
-					add = filters[j].select(fTreeViewer, null, elements[i]);
-					if (!add)
-						break;
-				}
-				if (add)
-					filtered.add(elements[i]);
-			}
-			return filtered.toArray();
-		}
-		return elements;
-	}
-
-	protected Object[] getTreeChildren(Object element) {
-		return filter(fTreeViewer.getFilters(), fTreeContentProvider.getChildren(element));
-//		return fTreeContentProvider.getChildren(element);
-	}
-
-	public Set<Object> getWhiteCheckedTreeItems() {
-		return new HashSet<Object>(fWhiteCheckedTreeItems);
-	}
-	
-	/**
-	 * Update the selections of the tree elements in items to reflect the new
-	 * selections provided.
-	 * 
-	 * @param items with keys of Object (the tree element) and values of List (the selected
-	 * list elements).
-	 */
-	public void updateSelections(final List items) {
-
-		//Potentially long operation - show a busy cursor
-		BusyIndicator.showWhile(fTreeViewer.getControl().getDisplay(), new Runnable() {
-			public void run() {
-				fExpandedTreeNodes.clear();
-				handleUpdateSelection(items);
-			}
-		});
-	}
-
-	protected void handleUpdateSelection(List items) {
-		Iterator iterator= items.iterator();
-
-		//Update the store before the hierarchy to prevent updating parents before all of the children are done
-		while (iterator.hasNext()) {
-			Object item= iterator.next();
-			//Replace the items in the checked state store with those from the supplied items
-			if (!fCheckedStateStore.contains(item))
-				fCheckedStateStore.add(item);
-			// proceed up the tree element hierarchy
-			Object parent= fTreeContentProvider.getParent(item);
-			if (parent != null) {
-				addToHierarchyToCheckedStore(parent);
-			}
-		}
-
-		//Now update hierarchies
-		iterator= items.iterator();
-
-		while (iterator.hasNext()) {
-			Object item= iterator.next();
-			updateHierarchy(item);
-		}
-	}		
-	
-	/**
-	 * Checks if an element is grey checked.
-	 */
-	public boolean isTreeItemGreyChecked(Object object) {
-		return fTreeViewer.getGrayed(object);	
-	}	
-
-	/**
-	 * For a given element, expand its chidren to a level.
-	 */	
-	public void expandTreeToLevel(Object object, int level) {
-		fTreeViewer.expandToLevel(object, level);	
-	}
-	/**
-	 * @param selection
-	 */
-	public void setTreeSelection(ISelection selection) {
-		fTreeViewer.setSelection(selection);
-	}
-	
-	/**
-	 * Refreshes the content of the viewer.
-	 */
-	public void refresh() {
-		fExpandedTreeNodes.clear();
-		fTreeViewer.refresh();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/HTMLWrappers.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/HTMLWrappers.java
deleted file mode 100644
index e32c99d..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/HTMLWrappers.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * The resource bundle for the HTML wrappers.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class HTMLWrappers {
-
-	private final static ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(HTMLWrappers.class.getName());
-
-	/**
-	 * Default private constructor to prevent this class form being
-	 * instantiated.
-	 */
-	private HTMLWrappers() {
-	}
-
-	/**
-	 * Returns the localized string given the resource key.
-	 * 
-	 * @param key
-	 *            The resource key.
-	 * @return The localized string.
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * Returns the localized formatted message for the given resource key.
-	 * 
-	 * @param key
-	 *            The resource key.
-	 * @param args
-	 *            The message arguments.
-	 * @return The localized formatted message.
-	 */
-	public static String format(String key, Object[] args) {
-		return MessageFormat.format(getString(key), args);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/HTMLWrappers.properties b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/HTMLWrappers.properties
deleted file mode 100644
index 8e30671..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/HTMLWrappers.properties
+++ /dev/null
@@ -1,46 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-CONTENT_WRAPPER_START=\
-  <html>\
-  <head>\
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\
-  </head>\
-  <script language="javascript">\
-  function init() { parent.ory_toc="disable"; parent.contentframe.location="
-  
-CONTENT_WRAPPER_END=\
-  "; }\
-  </script>\
-  </head>\
-  <frameset rows="100%,*" frameborder="no" border="0" framespacing="0" id="contentframeset" name="contentframeset">\
-  <frame src="about:blank" id="contentframe" name="contentframe" scrolling="auto"/>\
-  <frame src="about:blank" id="blankframe" name="blankframe" onload="init()"/>\
-  </frameset>\
-  </html>
-
-PRINT_WRAPPER_START=\
-  <html>\
-  <head>\
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\
-  </head>\
-  <script language="javascript">\
-  function init() { parent.ory_toc="disable"; }\
-  </script>\
-  </head>\
-  <frameset rows="100%,*" frameborder="no" border="0" framespacing="0" id="printframeset" name="printframeset" onload="javascript:print()">\
-  <frame src="about:blank" id="blankframe" name="blankframe" onload="init()"/>\
-  <frame src="
-
-PRINT_WRAPPER_END=\
-  " id="printframe" name="printframe" scrolling="auto" onload="javascript:parent.printframe.focus()"/>\
-  </frameset>\
-  <html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LibraryView.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LibraryView.java
deleted file mode 100644
index a4473eb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LibraryView.java
+++ /dev/null
@@ -1,2227 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.action.CopyAction;
-import org.eclipse.emf.edit.ui.action.CutAction;
-import org.eclipse.emf.edit.ui.action.DeleteAction;
-import org.eclipse.emf.edit.ui.action.PasteAction;
-import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.UIActionDispatcher;
-import org.eclipse.epf.authoring.ui.actions.CreateMethodElementCommand;
-import org.eclipse.epf.authoring.ui.actions.ILibraryActionBarContributor;
-import org.eclipse.epf.authoring.ui.actions.LayoutActionGroup;
-import org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewCopyAction;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewCutAction;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewDeleteAction;
-import org.eclipse.epf.authoring.ui.actions.LibraryViewPasteAction;
-import org.eclipse.epf.authoring.ui.actions.NewPluginAction;
-import org.eclipse.epf.authoring.ui.actions.RenameAction;
-import org.eclipse.epf.authoring.ui.dialogs.MoveDialog;
-import org.eclipse.epf.authoring.ui.dialogs.SwitchConfigDialog;
-import org.eclipse.epf.authoring.ui.dialogs.VariabilitySelection;
-import org.eclipse.epf.authoring.ui.dnd.LibraryViewerDragAdapter;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.editors.IEditorKeeper;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditor;
-import org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput;
-import org.eclipse.epf.authoring.ui.editors.ProcessEditor;
-import org.eclipse.epf.authoring.ui.preferences.ApplicationPreferenceConstants;
-import org.eclipse.epf.authoring.ui.preferences.AuthoringUIPreferences;
-import org.eclipse.epf.authoring.ui.providers.MethodElementLabelDecorator;
-import org.eclipse.epf.authoring.ui.util.LibraryValidationMarkerHelper;
-import org.eclipse.epf.authoring.ui.util.RefreshHandler;
-import org.eclipse.epf.authoring.ui.util.UIHelper;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceException;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.PluginUIPackageContext;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.navigator.MethodLibraryItemProvider;
-import org.eclipse.epf.library.edit.navigator.PluginUIPackagesItemProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResource;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.persistence.PersistenceService;
-import org.eclipse.epf.library.project.MethodLibraryProject;
-import org.eclipse.epf.library.project.MethodLibraryProjectNature;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.util.ImportExportUtil;
-import org.eclipse.epf.library.xmi.XMILibraryManager;
-import org.eclipse.epf.library.xmi.XMILibraryUtil;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.refresh.IRefreshEvent;
-import org.eclipse.epf.persistence.refresh.IRefreshHandler;
-import org.eclipse.epf.persistence.refresh.IRefreshListener;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.LibrarySchedulingRule;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-import org.eclipse.epf.uma.provider.MethodPluginItemProvider;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProviderChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.HTMLTransfer;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.part.IShowInTarget;
-import org.eclipse.ui.part.ShowInContext;
-import org.eclipse.ui.views.markers.internal.MarkerAdapter;
-import org.eclipse.ui.views.navigator.ResourceNavigator;
-
-/**
- * The Library view.
- * <p>
- * Displays the physical representation of a Method Library.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LibraryView extends AbstractBaseView implements IRefreshHandler,
-		IShowInTarget {
-
-	/**
-	 * The view ID.
-	 */
-	public static final String VIEW_ID = LibraryView.class.getName();
-
-	private static boolean DEBUG = AuthoringUIPlugin.getDefault().isDebugging();
-
-	protected TreeViewer treeViewer;
-
-	protected IDoubleClickListener doubleClickListener = null;
-
-	private ISelection selection;
-	
-	private LayoutActionGroup fLayoutActionSet;
-	
-	private String PERFORM_ID = "org.eclipse.epf.authoring.view.LibraryView.performValidatorAction"; //$NON-NLS-1$
-	
-	private IAction performLibraryValidationAction = new Action(
-			AuthoringUIResources.Validate_method_library, AuthoringUIPlugin.getDefault().getImageDescriptor(
-			"full/etool16/validate_method_lib.gif")) { //$NON-NLS-1$
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			try {
-				ViewHelper.checkLibraryHealth();
-			} catch (Exception e) {
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			}
-		}		
-	};
-	
-	// Listen to process editor activation and prompt the user to load the
-	// the process's default Configuration into the Configuration view.
-	private IPartListener editorPartListener = new IPartListener() {
-
-		public void partOpened(IWorkbenchPart part) {
-		}
-
-		public void partDeactivated(IWorkbenchPart part) {
-		}
-
-		public void partClosed(IWorkbenchPart part) {
-		}
-
-		public void partBroughtToTop(IWorkbenchPart part) {
-		}
-
-		public void partActivated(IWorkbenchPart part) {
-			if (part instanceof IEditorPart) {
-				SwitchConfigDialog.run(Display
-						.getCurrent().getActiveShell(), (IEditorPart)part);
-			}
-		}
-
-	};
-
-	private long lastRefreshTimeStamp;
-
-	private IResourceChangeListener resourceListener = new IResourceChangeListener() {
-		public void resourceChanged(IResourceChangeEvent event) {
-			if (event.getType() == IResourceChangeEvent.PRE_CLOSE ||
-					event.getType() == IResourceChangeEvent.PRE_DELETE) {
-				// project about to be closed or deleted
-				IProject project = (IProject)event.getResource();
-				try {
-					if (project.exists() && project.isOpen() && project.hasNature(MethodLibraryProjectNature.NATURE_ID)) {
-						EditorChooser.getInstance().closeAllMethodEditors();
-						IProject currProject = MethodLibraryProject.findProject(LibraryService.getInstance().getCurrentMethodLibraryLocation());
-						if (project == currProject) {
-							LibraryService.getInstance().closeCurrentMethodLibrary();
-						}
-					}
-				} catch (CoreException cex) {
-					LibraryPlugin.getDefault().getLogger().logError(cex);
-				} catch (LibraryServiceException lex) {
-					LibraryPlugin.getDefault().getLogger().logError(lex);
-				}
-				return;
-				
-			}
-			IResourceDelta delta = event.getDelta();
-			if (delta == null)
-				return;
-						
-			try {
-				class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-					public boolean visit(IResourceDelta delta)
-							throws CoreException {
-						if ((delta.getFlags() & IResourceDelta.MARKERS) == IResourceDelta.MARKERS) {
-							switch (delta.getKind()) {
-							case IResourceDelta.ADDED:
-							case IResourceDelta.CHANGED:
-								// show Problems View
-								UIHelper.showProblemsView();
-								return false;
-							}
-						}
-						// watch for project move                                                         
-						else if (delta.getResource().getType() == IResource.PROJECT) {  
-							if (delta.getKind() == IResourceDelta.CHANGED) {
-								if (((delta.getFlags() & IResourceDelta.REPLACED) == 0) &&                
-										((delta.getFlags() & IResourceDelta.DESCRIPTION) != 0)) {
-									// tested using the Move.. command in the Resource Navigator view             
-									// the REPLACED flag only seemed to occur when the library was moved          
-									// outside of EPF and EPF was re-started, so make sure it's clear, otherwise  
-									// we reload the library right after loading it when starting EPF             
-									IProject project = (IProject) delta.getResource();
-									ILibraryManager libMgr = LibraryService.getInstance().getCurrentLibraryManager();
-									if(libMgr instanceof XMILibraryManager) {
-										XMILibraryManager xmiLibMgr = ((XMILibraryManager)libMgr);
-										if(project.equals(xmiLibMgr.getMethodLibraryProject())) {	
-											System.out.println();
-											xmiLibMgr.handleLibraryMoved();
-											return false;
-										}
-									}
-								} else if ((delta.getFlags() & IResourceDelta.OPEN) != 0) {
-									// project's open state was changed
-									IProject project = (IProject) delta.getResource();
-									if (project.isOpen() && project.hasNature(MethodLibraryProjectNature.NATURE_ID) &&
-											LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-										// project is now open, open the library
-										java.net.URI projectLocation = project.getLocationURI();
-										try {
-											LibraryService.getInstance().openMethodLibrary("xmi", projectLocation); //$NON-NLS-1$
-										} catch (Exception e) {
-											LibraryPlugin.getDefault().getLogger().logError(e);
-										}
-										return false;
-									}
-								}
-							}
-						}
-						return true;
-					}				
-				};
-				
-				ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-				delta.accept(visitor);
-
-			} catch (CoreException e) {
-				CommonPlugin.INSTANCE.log(e);
-			}
-
-		}
-
-	};
-
-	private IRefreshListener refreshListener = new IRefreshListener() {
-
-		public void notifyRefreshed(IRefreshEvent event) {
-			if (event.getRefreshedObjects() != null
-					&& !event.getRefreshedObjects().isEmpty()) {
-				Control ctrl = getViewer().getControl();
-				if (ctrl == null || ctrl.isDisposed())
-					return;
-
-				if (ctrl.getDisplay().getThread() == Thread.currentThread()) {
-					doRefresh(getSite().getShell());
-				} else {
-					ctrl.getDisplay().syncExec(new Runnable() {
-
-						public void run() {
-							doRefresh(null);
-						}
-
-					});
-				}
-			}
-		}
-
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryView() {
-		// read layout pref
-		if (PluginUIPackageContext.FLAT_LAYOUT.equals(ApplicationPreferenceConstants.getLayout())) {
-			PluginUIPackageContext.INSTANCE.setLayoutFlat();
-		} else if (PluginUIPackageContext.HIERARCHICAL_LAYOUT.equals(ApplicationPreferenceConstants.getLayout())) {
-			PluginUIPackageContext.INSTANCE.setLayoutHierarchical();
-		}
-
-	}
-	
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		
-		makeActions();
-		
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
-				AuthoringUIHelpContexts.LIBRARY_NAVIGATOR_VIEW_CONTEXT);
-
-		RefreshJob.getInstance().setRefreshHandler(this);
-	}
-	
-	private void makeActions() {
-		fLayoutActionSet= new LayoutActionGroup(this);
-		IActionBars actionBars= getViewSite().getActionBars();
-		fLayoutActionSet.fillActionBars(actionBars);
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		// This is required to make the global edit action work the first time.
-		actionBarContributor.setActiveView(this);
-
-		IStructuredSelection selected = (IStructuredSelection) getSelection();
-		if (selected.isEmpty())
-			actionBarContributor.disableGlobalEditMenu();
-		else
-			actionBarContributor.enableGlobalEditMenu();
-
-		if (treeViewer != null) {
-			treeViewer.getControl().setFocus();
-		}
-	}
-
-	/**
-	 * Returns the underlying tree viewer.
-	 */
-	public Viewer getViewer() {
-		return treeViewer;
-	}
-
-	/**
-	 * Creates the underlying tree viewer.
-	 */
-	public void createViewer(Composite parent) {
-		treeViewer = new TreeViewer(parent) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.viewers.StructuredViewer#handleLabelProviderChanged(org.eclipse.jface.viewers.LabelProviderChangedEvent)
-			 */
-			protected void handleLabelProviderChanged(
-					LabelProviderChangedEvent event) {
-				if (event.getElement() instanceof IResource
-						&& event.getSource() instanceof ILabelDecorator) {
-					this.refresh();
-					return;
-				}
-				super.handleLabelProviderChanged(event);
-			}
-		};
-
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.getNavigatorView_ComposedAdapterFactory();
-
-		// Create the command stack that will notify this editor as commands are
-		// executed.
-		BasicCommandStack commandStack = new BasicCommandStack();
-
-		// Add a listener to set the most recent command's affected objects to
-		// be the selection of the viewer with focus.
-		commandStack.addCommandStackListener(new CommandStackListener() {
-			public void commandStackChanged(final EventObject event) {
-				Runnable runnable = new Runnable() {
-					public void run() {
-						firePropertyChange(IEditorPart.PROP_DIRTY);
-
-						// Try to select the affected objects.
-						Command mostRecentCommand = ((CommandStack) event
-								.getSource()).getMostRecentCommand();
-						if (mostRecentCommand != null) {
-							setSelectionToViewer(mostRecentCommand
-									.getAffectedObjects());
-							
-							if(mostRecentCommand instanceof CreateMethodElementCommand) {								
-								// Work-around to refresh icons of newly created elements, whose decoration
-								// sometimes got out of sync.
-								//
-								Viewer viewer = getViewer();
-								if(viewer instanceof StructuredViewer) {
-									Object[] elements = mostRecentCommand
-											.getAffectedObjects().toArray();
-									((StructuredViewer)viewer).update(elements, null);
-								}
-							}
-						}
-						if (propertySheetPage != null
-								&& propertySheetPage.getControl() != null
-								&& !propertySheetPage.getControl().isDisposed()
-								&& propertySheetPage.getControl().isVisible()) {
-							propertySheetPage.refresh();
-						}
-					}
-				};
-				if (Display.getCurrent() != null) {
-					Display.getCurrent().asyncExec(runnable);
-				} else {
-					runnable.run();
-				}
-			}
-		});
-
-		// Create the editing domain with a special command stack.
-		ResourceSet resourceSet = PersistenceService.INSTANCE
-				.createResourceSet(Services.getDefaultLibraryPersistenceType());
-
-		editingDomain = new TraceableAdapterFactoryEditingDomain(
-				adapterFactory, commandStack, resourceSet);
-
-
-		treeViewer.setContentProvider(new AdapterFactoryContentProvider(
-				adapterFactory));
-
-		// treeViewer.setLabelProvider(new
-		// AdapterFactoryLabelProvider(adapterFactory));
-		treeViewer.setLabelProvider(new DecoratingLabelProvider(
-				new AdapterFactoryLabelProvider(adapterFactory),
-				new MethodElementLabelDecorator()));
-
-		// Add a double click listener for launching the Method editors.
-		doubleClickListener = new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				UIActionDispatcher.getInstance().handleDoubleClickEvent(event);
-			}
-		};
-		treeViewer.addDoubleClickListener(doubleClickListener);
-
-		getSite().getPage().addPartListener(editorPartListener);
-
-		ResourcesPlugin.getWorkspace()
-				.addResourceChangeListener(resourceListener);
-		
-		createContextMenuFor(treeViewer);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#setInputForViewer(Object)
-	 */
-	public void setInputForViewer(Object model) {
-		Control ctrl = this.getViewer().getControl();
-		if (ctrl.isDisposed()) {
-			return;
-		}
-		if (model == null || model instanceof MethodLibrary) {
-			// Prevent memory leak.
-			StructuredSelection emptySelection = new StructuredSelection();
-			actionDispatcher.setSelection(emptySelection);
-			UIActionDispatcher.getInstance().setSelection(emptySelection);
-
-			getViewer().setInput(model);
-			updateLastRefreshTimestamp();
-		} else {
-			AuthoringUIPlugin
-					.getDefault()
-					.getLogger()
-					.logError(
-							"Library viewer input is not a MethodLibrary object: " + model); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void updateLastRefreshTimestamp() {
-		lastRefreshTimeStamp = System.currentTimeMillis();
-	}
-
-	
-	/**
-	 * Returns this view.
-	 */
-	public static LibraryView getView() {
-//		return (LibraryView) ViewHelper.openView(VIEW_ID);
-		boolean show = ViewHelper.isViewInCurrentPerspective(VIEW_ID);
-		return (LibraryView)ViewHelper.findView(VIEW_ID, show);
-
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#setSelection(ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		((LibraryViewActionBarContributor) actionBarContributor)
-				.updateSelection(selection);
-
-		super.setSelection(selection);
-		this.selection = selection;		
-
-//		((LibraryViewActionBarContributor) actionBarContributor).checkLocked();
-		
-		// if only one element is selected, show path to its file in status line
-		//
-		IStatusLineManager statusLineManager = getViewSite().getActionBars()
-				.getStatusLineManager();
-		if (statusLineManager != null) {
-			String path = ""; //$NON-NLS-1$
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-				if (structuredSelection.size() == 1) {
-					Object o = TngUtil.unwrap(structuredSelection
-							.getFirstElement());
-					if (o instanceof EObject) {
-						Resource resource = ((EObject) o).eResource();
-						if (resource != null) {
-							URI uri = resource.getURI();
-							if (uri != null && uri.isFile()) {
-								path = uri.toFileString();
-								if (o instanceof ContentElement) {
-									ContentDescription content = ((ContentElement) o)
-											.getPresentation();
-									if (content != null) {
-										resource = content.eResource();
-										if (resource != null) {
-											URI contentURI = resource.getURI();
-											if (contentURI != null) {
-												path = path
-														+ ",." + File.separatorChar + contentURI.deresolve(uri).toFileString(); //$NON-NLS-1$
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-			statusLineManager.setMessage(path);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryReopened(MethodLibrary)
-	 */
-	public void libraryReopened(MethodLibrary library) {
-		refreshViews();
-	}
-	
-	@Override
-	public void librarySet(MethodLibrary library) {
-		super.librarySet(library);
-		ILibraryManager manager = (ILibraryManager) LibraryService
-		.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.registerEditingDomain(editingDomain);
-		
-			manager.addPropertyListener(new IPropertyListener() {
-				public void propertyChanged(Object source, int propId) {
-					// TODO: Replace hardcoded constant with variable.
-					if (propId == 1) {
-						firePropertyChange(PROP_DIRTY);
-					}
-				}
-			});
-		}
-	}
-
-	/**
-	 * The action bar for the library view
-	 */
-	class LibraryViewActionBarContributor extends LibraryActionBarContributor {
-
-		private IAction newPluginAction = new NewPluginAction(
-				AuthoringUIResources.new_plugin);
-
-		private IAction moveAction = new Action(AuthoringUIResources.move) {
-
-			private void doMove() {
-				Collection elementsToMove = new ArrayList();
-				IStructuredSelection selection = (IStructuredSelection) LibraryView.this.selection;
-				for (Iterator iter = selection.iterator(); iter.hasNext();) {
-					Object element = iter.next();
-					if (element instanceof MethodElement
-							|| (element = TngUtil.unwrap(element)) instanceof CustomCategory) {
-						// Handle CustomCategory specially.
-						EObject container = ((EObject) element).eContainer();
-						IStatus status = UserInteractionHelper.checkModify(
-								container, getSite().getShell());
-						if (container != null && !status.isOK()) {
-							AuthoringUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayError(
-											AuthoringUIResources.errorDialog_title,
-											AuthoringUIResources.errorDialog_moveError,
-											status);
-							return;
-						}
-						elementsToMove.add(element);
-					}
-				}
-
-				// TODO: Prompt the user the save editing changes for
-				// elements that will be moved.
-
-				// Remove elements from the move list if their containers are
-				// already in the move list.
-				for (Iterator iterator = elementsToMove.iterator(); iterator
-						.hasNext();) {
-					EObject element = (EObject) iterator.next();
-					boolean isContained = false;
-					check_contained: for (Iterator iter = elementsToMove
-							.iterator(); iter.hasNext();) {
-						Object e = (Object) iter.next();
-						if (UmaUtil.isContainedBy(element, e)) {
-							isContained = true;
-							break check_contained;
-						}
-					}
-					if (isContained) {
-						iterator.remove();
-					}
-				}
-
-				MoveDialog dlg = new MoveDialog(getSite().getShell(),
-						elementsToMove, editingDomain);
-				dlg.open();
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.Action#run()
-			 */
-			public void run() {
-				LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-				runner.setProgressMonitor(getActionBars()
-						.getStatusLineManager().getProgressMonitor());
-				runner.run(new IRunnableWithProgress() {
-
-					public void run(IProgressMonitor monitor)
-							throws InvocationTargetException,
-							InterruptedException {
-						doMove();
-					}
-
-				});
-			}
-		};
-
-		private RenameAction renameAction = new RenameAction();
-
-		private IAction replaceAction = new Action(
-				AuthoringUIResources.ElementsView_replaceAction_text) {
-
-			public void run() {
-				if (!getPage().closeAllEditors(true)) {
-					return;
-				}
-
-				final ProcessComponent procComp = (ProcessComponent) ((IStructuredSelection) selection)
-						.getFirstElement();
-				Process proc = procComp.getProcess();
-				final String typeStr;
-				if (proc instanceof CapabilityPattern) {
-					typeStr = AuthoringUIResources.ElementsView_20;
-				} else if (proc instanceof DeliveryProcess) {
-					typeStr = AuthoringUIResources.ElementsView_21;
-				} else {
-					typeStr = AuthoringUIResources.ElementsView_22;
-				}
-				DirectoryDialog dirDlg = new DirectoryDialog(getSite()
-						.getShell());
-				dirDlg.setText(AuthoringUIResources.ElementsView_replace_text);
-				dirDlg
-						.setMessage(MessageFormat
-								.format(
-										AuthoringUIResources.ElementsView_migration_dir_dlg_description_text,
-										new Object[] { typeStr }));
-				final String dir = dirDlg.open();
-				if (dir == null) {
-					return;
-				}
-
-				boolean ret = UserInteractionHelper
-						.runWithProgress(
-								new org.eclipse.epf.library.edit.util.IRunnableWithProgress() {
-
-									public void run(IProgressMonitor monitor)
-											throws InvocationTargetException,
-											InterruptedException {
-										try {
-											ImportExportUtil.replace(procComp,
-													dir);
-										} catch (Exception e) {
-											throw new WrappedException(e);
-										}
-									}
-								},
-								MessageFormat
-										.format(
-												AuthoringUIResources.ElementsView_replaceingwithformat_text,
-												new Object[] { typeStr }));
-
-				if (ret) {
-					// Reopen the library.
-					LibraryUIManager.getInstance().openLibrary(
-							LibraryService.getInstance()
-									.getCurrentMethodLibraryLocation());
-				}
-			}
-		};
-
-		private IAction openVariabilityDialogAction = new Action(
-				AuthoringUIResources.ElementsView_openVariabilityDialogAction_text) {
-			public void run() {
-				Object obj = TngUtil.unwrap(((IStructuredSelection) selection)
-						.getFirstElement());
-				if (obj instanceof VariabilityElement) {
-					VariabilityElement element = (VariabilityElement) obj;
-					VariabilitySelection variabilitySelection = new VariabilitySelection();
-					Object selectedObject = variabilitySelection
-							.getSelectedVariability(element);
-					if (selectedObject != null) {
-						EditorChooser.getInstance().openEditor(selectedObject);
-					}
-				}
-			}
-		};
-
-		private boolean locked;
-
-		private boolean canMove;
-
-		private IAction showInResourceNavigatorAction = new Action(
-				AuthoringUIResources.showInResourceNavigatorAction_label) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jface.action.Action#run()
-			 */
-			public void run() {
-				ResourceNavigator navigator;
-				try {
-					navigator = (ResourceNavigator) getPage().showView(
-							"org.eclipse.ui.views.ResourceNavigator"); //$NON-NLS-1$
-					Object obj = TngUtil
-							.unwrap(((IStructuredSelection) selection)
-									.getFirstElement());
-					IResource wsRes = PersistenceUtil.getWorkspaceResource(obj);
-					if (wsRes != null) {
-						navigator.getViewer().setSelection(
-								new StructuredSelection(wsRes), true);
-					}
-				} catch (PartInitException e) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		};
-
-		private boolean canRename;
-
-		/**
-		 * Creates a new instance.
-		 */
-		public LibraryViewActionBarContributor(EditingDomain editingDomain) {
-			super(editingDomain);
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#createDeleteAction()
-		 */
-		protected DeleteAction createDeleteAction() {
-			LibraryViewDeleteAction action = new LibraryViewDeleteAction() {
-				/**
-				 * @see org.eclipse.epf.authoring.ui.actions.ElementsViewPasteAction#updateSelection(IStructuredSelection)
-				 */
-				public boolean updateSelection(IStructuredSelection selection) {
-					if (locked) {
-						return false;
-					}
-					return super.updateSelection(selection);
-				}
-
-				public void run() {
-					String title = AuthoringUIResources.actions_LibraryActionBarContributor_deleteErrorTitle;
-					try {
-						super.run();
-					} catch (MessageException e) {
-						AuthoringUIPlugin.getDefault().getMsgDialog()
-								.displayError(title, e.getMessage());
-					} catch (Exception e) {
-						String details = TngUtil.toStackTraceString(e);
-						String message = AuthoringUIResources.actions_LibraryActionBarContributor_deleteErrorMessage;
-						String reason = AuthoringUIResources.actions_LibraryActionBarContributor_deleteErrorReason;
-						AuthoringUIPlugin.getDefault().getMsgDialog()
-								.displayError(title, message, reason, details,
-										e);
-					}
-				}
-
-				protected void deleteFailed() {
-					// Library need to be reloaded.
-					ViewHelper.reloadCurrentLibrary(getSite().getShell(), AuthoringUIResources.msg_reloadLibrary);
-
-					// User tried to select the old selection.
-					if (activeViewPart instanceof IViewerProvider) {
-						final ArrayList elements = new ArrayList();
-						for (Iterator iter = selection.iterator(); iter
-								.hasNext();) {
-							Object e = iter.next();
-							if (e instanceof MethodElement) {
-								String guid = ((MethodElement) e).getGuid();
-								ILibraryManager manager = LibraryService
-										.getInstance()
-										.getCurrentLibraryManager();
-								if (manager != null) {
-									MethodElement element = manager
-											.getMethodElement(guid);
-									if (element != null) {
-										elements.add(element);
-									}
-								}
-							}
-						}
-						if (!elements.isEmpty()) {
-							Viewer viewer = ((IViewerProvider) activeViewPart)
-									.getViewer();
-							viewer.setSelection(new StructuredSelection(
-									elements), true);
-						}
-					}
-				}
-			};
-			action.setProgressMonitor(getActionBars().getStatusLineManager()
-					.getProgressMonitor());
-			return action;
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#createCutAction()
-		 */
-		protected CutAction createCutAction() {
-			return new LibraryViewCutAction() {
-				/**
-				 * @see org.eclipse.epf.authoring.ui.actions.ElementsViewPasteAction#updateSelection(IStructuredSelection)
-				 */
-				public boolean updateSelection(IStructuredSelection selection) {
-					if (locked) {
-						return false;
-					}
-					return super.updateSelection(selection);
-				}
-			};
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#createCopyAction()
-		 */
-		protected CopyAction createCopyAction() {
-			return new LibraryViewCopyAction(){
-
-				@Override
-				public boolean updateSelection(IStructuredSelection selection) {
-					if( ViewHelper.hasCustomizedLocker((IStructuredSelection) selection) && locked ){	
-						return false;
-					}
-					return super.updateSelection(selection);
-				}
-				
-			};
-		}
-
-		/**
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#createPasteAction()
-		 */
-		protected PasteAction createPasteAction() {
-			LibraryViewPasteAction action = new LibraryViewPasteAction() {
-				/**
-				 * @see org.eclipse.epf.authoring.ui.actions.ElementsViewPasteAction#updateSelection(IStructuredSelection)
-				 */
-				public boolean updateSelection(IStructuredSelection selection) {
-					if (locked) {
-						return false;
-					}
-					return super.updateSelection(selection);
-				}
-			};
-			action.setProgressMonitor(getActionBars().getStatusLineManager()
-					.getProgressMonitor());
-			return action;
-		}
-
-		private void checkLocked() {
-			if (selection instanceof IStructuredSelection) {
-				boolean wasLocked = locked;
-//				locked = ViewHelper.isLocked((IStructuredSelection) selection);
-				if(ViewHelper.hasCustomizedLocker((IStructuredSelection) selection) ){					
-					locked = ViewHelper.isLockedWithCustomizedLocker((IStructuredSelection) selection);					
-				}else{
-					locked = ViewHelper.isLocked((IStructuredSelection) selection);
-				}
-				if (wasLocked != locked) {
-					deleteAction.setEnabled(deleteAction
-							.updateSelection((IStructuredSelection) selection));
-					cutAction.setEnabled(cutAction
-							.updateSelection((IStructuredSelection) selection));
-					pasteAction.setEnabled(pasteAction
-							.updateSelection((IStructuredSelection) selection));
-					boolean enabled = !locked;
-					renameAction.setEnabled(enabled);
-					moveAction.setEnabled(enabled);
-				}
-			}
-		}
-
-		void updateSelection(ISelection selection) {			
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			
-			renameAction.setActiveWorkbenchPart(LibraryView.this);
-			canRename = renameAction.updateSelection(sel);
-
-//			locked = ViewHelper.isLocked(sel);
-			if(ViewHelper.hasCustomizedLocker(sel) ){					
-				locked = ViewHelper.isLockedWithCustomizedLocker(sel);
-			}else{
-				locked = ViewHelper.isLocked(sel);
-			}
-			
-			boolean enabled = !locked;
-			if(canRename && !enabled) {
-				renameAction.setEnabled(enabled);
-			}
-			moveAction.setEnabled(enabled);
-
-			canMove = canMove(sel);
-
-			if (!locked && sel.size() == 1
-					&& sel.getFirstElement() instanceof ProcessComponent) {
-				replaceAction.setEnabled(true);
-			} else {
-				replaceAction.setEnabled(false);
-			}
-
-			if (sel.size() == 1) {
-				Object obj = TngUtil.unwrap(((IStructuredSelection) selection)
-						.getFirstElement());
-				openVariabilityDialogAction
-						.setEnabled(obj instanceof VariabilityElement
-								&& !TngUtil.isPredefined((MethodElement) obj));
-				showInResourceNavigatorAction
-						.setEnabled(obj instanceof MethodElement);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#enableGlobalEditMenu()
-		 */
-		public void enableGlobalEditMenu() {
-		}
-
-		/**
-		 * @see org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor#addGlobalActions(IMenuManager)
-		 */
-		protected void addGlobalActions(IMenuManager menuManager) {
-			super.addGlobalActions(menuManager);
-			menuManager.insertAfter("fixed-additions", newPluginAction); //$NON-NLS-1$
-		}
-
-		private boolean canMove(IStructuredSelection selection) {
-			for (Iterator iter = selection.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if ((element instanceof MethodElement)
-						&& !(element instanceof ContentCategory)
-						&& !(element instanceof MethodPlugin)
-						&& !(element instanceof MethodConfiguration)
-						&& !TngUtil.isPredefined((MethodElement) element)) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-		/**
-		 * Adds Separators for editor additions to the tool bar.
-		 */
-		public void contributeToToolBar(IToolBarManager toolBarManager) {
-//			toolBarManager.add(new Separator("method-settings")); //$NON-NLS-1$
-//			toolBarManager.add(new Separator("method-additions")); //$NON-NLS-1$
-			performLibraryValidationAction.setId(PERFORM_ID);
-			if (AuthoringUIPreferences.getEnableLibraryValidation()) {
-				toolBarManager.add(performLibraryValidationAction);
-			}
-			
-		}
-		
-		/**
-		 * @see LibraryActionBarContributor#menuAboutToShow(IMenuManager)
-		 */
-		public void menuAboutToShow(IMenuManager menuManager) {
-			checkLocked();
-			
-			
-
-			// Add our standard marker.
-			menuManager.add(new Separator("fixed-additions")); //$NON-NLS-1$
-			menuManager.add(new Separator("fixed-additions-end")); //$NON-NLS-1$
-			menuManager.add(new Separator("edit")); //$NON-NLS-1$
-
-			// Add the edit menu actions.
-			menuManager.add(new ActionContributionItem(libraryViewEditAction));
-			menuManager.add(new ActionContributionItem(copyAction));
-			menuManager.add(new ActionContributionItem(pasteAction));
-			menuManager.add(new Separator());
-			menuManager.add(new ActionContributionItem(deleteAction));
-			if (canRename) {
-				menuManager.add(new ActionContributionItem(renameAction));
-			}
-			if (canMove) {
-				menuManager.add(new ActionContributionItem(moveAction));
-			}
-
-			menuManager.add(new Separator("view")); //$NON-NLS-1$
-			if (openVariabilityDialogAction.isEnabled()) {
-				menuManager.add(new ActionContributionItem(
-						openVariabilityDialogAction));
-			}
-			if (showInResourceNavigatorAction.isEnabled()) {
-				menuManager.add(new ActionContributionItem(
-						showInResourceNavigatorAction));
-			}
-			menuManager.add(new Separator());
-
-			// Add our other standard marker where other plugins will contribute
-			// menu
-			//
-			menuManager.add(new Separator("additions")); //$NON-NLS-1$
-			menuManager.add(new Separator("additions-end")); //$NON-NLS-1$
-
-			addGlobalActions(menuManager);
-
-			if (!locked) {
-				MenuManager submenuManager = null;
-				submenuManager = new MenuManager(
-						AuthoringUIResources._UI_CreateChild_menu_item);
-				populateManager(submenuManager, createChildActions, null);
-				menuManager.insertBefore("fixed-additions", submenuManager); //$NON-NLS-1$
-			}
-
-//			menuManager.add(new Action("Test") {
-//				/*
-//				 * (non-Javadoc)
-//				 *
-//				 * @see org.eclipse.jface.action.Action#run()
-//				 */
-//				public void run() {
-//					// reload
-//					//
-////					ISelection selection = getSelection();
-////					if (selection instanceof IStructuredSelection) {
-////						Object object = ((IStructuredSelection) selection)
-////						.getFirstElement();
-////						object = TngUtil.unwrap(object);
-////						if (object instanceof InternalEObject) {
-////							InternalEObject e = ((InternalEObject) object);
-////							ILibraryResourceSet resourceSet = (ILibraryResourceSet) e
-////							.eResource().getResourceSet();
-////							resourceSet.unload(e);
-////							URI uri = e.eProxyURI();
-////							EObject newObject = resourceSet.getEObject(e, uri,
-////									true);
-////							refreshViews();
-////						}
-////					}
-//					
-//					// plugin/config folder
-//					//
-//					ILibraryPersister persister = LibraryServiceUtil.getCurrentPersister();
-//					if(persister instanceof IFileBasedLibraryPersister) {
-//						IFileBasedLibraryPersister filePersister = (IFileBasedLibraryPersister) persister;
-//						MethodLibrary library = LibraryService.getInstance().getCurrentMethodLibrary();
-//						try {
-//							File file = filePersister.createMethodPluginFolder("plugin100", library);
-//							System.out.println("plugin dir: " + file);
-//						}
-//						catch(Exception e) {
-//							e.printStackTrace();
-//						}
-//						try {
-//							File file = filePersister.getDefaultMethodConfigurationFolder(library);
-//							System.out.println("config dir: " + file);
-//						}
-//						catch(Exception e) {
-//							e.printStackTrace();
-//						}
-//					}
-//				}
-//			});
-			
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.authoring.ui.actions.LibraryActionBarContributor#refreshViewer(org.eclipse.jface.viewers.Viewer)
-		 */
-		protected void refreshViewer(final Viewer viewer) {
-			if (viewer == LibraryView.this.getViewer()) {
-				IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-					public void run(IProgressMonitor monitor)
-							throws InvocationTargetException,
-							InterruptedException {
-						monitor.beginTask("", 3); //$NON-NLS-1$
-						monitor
-								.subTask(AuthoringUIResources._UI_RefreshViewer_menu_item);
-						monitor.worked(1);
-						try {
-							// Refresh all loaded resources and load newly added resources
-							//
-							ILibraryManager manager = (ILibraryManager) LibraryService
-									.getInstance().getCurrentLibraryManager();
-							if (manager != null) {
-								ResourceSet resourceSet = manager
-										.getEditingDomain().getResourceSet();
-								ILibraryResourceSet libResourceSet;
-								if (resourceSet instanceof ILibraryResourceSet
-										&& (libResourceSet = (ILibraryResourceSet) resourceSet)
-												.getPersistenceType()
-												.equals(
-														Services.XMI_PERSISTENCE_TYPE)) {
-									
-									libResourceSet.loadNewResources();
-									
-									List removedResources = new ArrayList();
-									List changedResources = new ArrayList();
-									for (Iterator iter = new ArrayList(
-											resourceSet.getResources())
-											.iterator(); iter.hasNext();) {
-										Resource resource = (Resource) iter
-												.next();
-										String loc = resource.getURI()
-												.toFileString();
-										IResource wsRes = FileManager
-												.getResourceForLocation(loc);
-										if (wsRes == null) {
-											removedResources.add(resource);
-										} else if (!wsRes
-												.isSynchronized(IResource.DEPTH_ZERO)) {
-											changedResources.add(resource);
-										}
-									}
-									monitor.worked(2);
-									if (removedResources.isEmpty()
-											&& changedResources.isEmpty()) {
-										viewer.refresh();
-									} else {
-										doRefresh(removedResources,
-												changedResources, null, false);
-									}
-								} else {
-									viewer.refresh();
-								}
-							}
-						} finally {
-							monitor.done();
-						}
-					}
-
-				};
-				IRunnableContext context = new ProgressMonitorDialog(getSite()
-						.getShell());
-				try {
-					getSite().getWorkbenchWindow().getWorkbench()
-							.getProgressService().runInUI(context, runnable,
-									null);
-				} catch (Exception e) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					String title = AuthoringUIResources.ProcessEditor_refreshErrorTitle;
-					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-							title, e.toString(), e);
-				}
-				return;
-			}
-			super.refreshViewer(viewer);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#createActionBarContributor()
-	 */
-	public ILibraryActionBarContributor createActionBarContributor() {
-		ILibraryActionBarContributor actionBar = new LibraryViewActionBarContributor(
-				editingDomain);
-		return actionBar;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#createContextMenuFor(org.eclipse.jface.viewers.StructuredViewer)
-	 */
-	public void createContextMenuFor(final StructuredViewer viewer) {
-		super.createContextMenuFor(viewer);
-		int dndOperations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
-		Transfer[] transfers = new Transfer[] { HTMLTransfer.getInstance(),
-				TextTransfer.getInstance(), LocalTransfer.getInstance() };
-		viewer.addDragSupport(dndOperations, transfers,
-				new LibraryViewerDragAdapter(viewer));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#menuAboutToShow(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		super.menuAboutToShow(menuManager);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite)
-	 */
-	public void init(IViewSite site) throws PartInitException {
-		super.init(site);
-	
-		// add property change listener for library validation preference
-		AuthoringUIPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(new IPropertyChangeListener() {
-					public void propertyChange(PropertyChangeEvent event) {
-						if (event
-								.getProperty()
-								.equals(
-										AuthoringUIPreferences.ENABLE_LIBRARY_VALIDATION)) {
-							Boolean enabled = (Boolean) event.getNewValue();
-							IToolBarManager toolBarManager = getViewSite()
-								.getActionBars().getToolBarManager();
-					
-							if (enabled != null && enabled.booleanValue()) {
-								performLibraryValidationAction
-										.setId(PERFORM_ID);
-								toolBarManager.insertAfter("additions", performLibraryValidationAction); //$NON-NLS-1$
-							} else {
-								IContributionItem[] items = toolBarManager.getItems();
-								for (int i = 0; i < items.length; i++) {
-									IContributionItem item = (IContributionItem) items[i];
-									if (item.getId().equals(PERFORM_ID))
-										toolBarManager.remove(item);
-								}
-							}
-							toolBarManager.update(true);
-						}
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#dispose()
-	 */
-	public void dispose() {
-		RefreshJob.getInstance().setRefreshHandler(null);
-
-		if (fLayoutActionSet != null)	
-			fLayoutActionSet.dispose();
-
-		super.dispose();
-		if (doubleClickListener != null) {
-			treeViewer.removeDoubleClickListener(doubleClickListener);
-		}
-		
-	}
-
-	/**
-	 * @param obj
-	 *            ItemProvider
-	 * @return ProcessComponent associated with the given obj
-	 */
-	public ProcessComponent getProcessComponent(Object obj) {
-		Object parent;
-		for (parent = obj; (parent != null && !(parent instanceof ProcessComponent));) {
-			ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-					.adapt(parent, ITreeItemContentProvider.class);
-			parent = adapter.getParent(parent);
-		}
-		return (ProcessComponent) parent;
-	}
-
-	private static abstract class StatusWorkspaceModifyOperation extends
-			WorkspaceModifyOperation {
-
-		protected String errMsg;
-
-		public String getErrorMessage() {
-			return errMsg;
-		}
-	}
-
-	/**
-	 * opens a Method Library
-	 * 
-	 * @param path
-	 *            path to the library
-	 */
-	public void openLibrary(final String path) {
-		// Do the work within an operation because this is a long running
-		// activity that modifies the workbench.
-		StatusWorkspaceModifyOperation operation = new StatusWorkspaceModifyOperation() {
-
-			// This is the method that gets invoked when the operation runs.
-			public void execute(IProgressMonitor monitor) {
-				monitor.beginTask(AuthoringUIResources.openingLibraryTask_name,
-						2);
-				try {
-					monitor.worked(1);
-					LibraryService.getInstance().closeCurrentMethodLibrary();
-					MethodLibrary library = XMILibraryUtil
-							.openMethodLibrary(path);
-					LibraryService.getInstance().setCurrentMethodLibrary(
-							library);
-					LibraryUIPreferences.setSavedLibraryPath(path);
-				} catch (Exception ex) {
-					if (ex instanceof IOException) {
-						String message = ex.getMessage();
-						if (message.startsWith("###")) { //$NON-NLS-1$
-							String projectFileName = message.substring(3);
-							String prompt = AuthoringUIResources.bind(
-									AuthoringUIResources.ElementsView_35,
-									(new Object[] { projectFileName }));
-							if (MsgBox.prompt(prompt, SWT.RETRY | SWT.CANCEL) == SWT.RETRY) {
-								openLibrary(path);
-							}
-						}
-					} else {
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										AuthoringUIResources.errorDialog_title,
-										AuthoringUIResources.openLibraryError_msg,
-										ex);
-					}
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			// This runs the options, and shows progress.
-			new ProgressMonitorDialog(getSite().getShell()).run(true, false,
-					operation);
-			if (operation.getErrorMessage() == null) {
-				getSite().getPage().closeAllEditors(false);
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.AbstractBaseView#handleActivate(org.eclipse.ui.IWorkbenchPart)
-	 */
-	protected void handleActivate(IWorkbenchPart part) {
-		super.handleActivate(part);
-
-		// TODO: Review implementation.
-		// Make sure that the method library open is not closed.
-		XMILibraryUtil.openMethodLibraryProject(LibraryService.getInstance()
-				.getCurrentMethodLibrary(), getViewSite().getActionBars()
-				.getStatusLineManager().getProgressMonitor());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.authoring.ui.views.SaveableLibraryViewPart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		// This view should not participate in all the save commands.
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.SaveableLibraryViewPart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-	
-	/**
-	 * Used by org.eclipse.epf.authoring.ui.actions.LinkWithEditor Given an
-	 * object that is a MethodElement, selects that object in the Lib Nav
-	 * 
-	 * @param o
-	 */
-	public void setSelectionToViewer(Object object) {
-		Object o = TngUtil.unwrap(object);
-		if (!(o instanceof MethodElement))
-			return;
-		if (o instanceof MethodConfiguration) {
-			super.setSelectionToViewer(Arrays.asList(new Object[] { o }));
-			return;
-		}
-		try {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin((MethodElement) o);
-
-			MethodPluginItemProvider pluginAdapter = (MethodPluginItemProvider) TngUtil
-					.getAdapter(plugin, MethodPluginItemProvider.class);
-
-			MethodLibraryItemProvider libraryAdapter = (MethodLibraryItemProvider) TngUtil
-					.getAdapter(LibraryService.getInstance().getCurrentMethodLibrary(), MethodLibraryItemProvider.class);
-
-			// expand plugin packages
-			ItemProviderAdapter pluginTreeAdapter = libraryAdapter.getPluginItemProvider(plugin);
-			while (pluginTreeAdapter instanceof PluginUIPackagesItemProvider) {
-				treeViewer.setExpandedState(pluginTreeAdapter, true);
-				pluginTreeAdapter = ((PluginUIPackagesItemProvider)pluginTreeAdapter).getPluginItemProvider(plugin);
-			}
-			treeViewer.setExpandedState(plugin, true);
-
-			
-			if (o instanceof BreakdownElement) {				
-				Process proc = TngUtil.getOwningProcess((BreakdownElement)o);
-				if(proc != null) {
-					o = proc.eContainer();
-				}
-			}
-			if (o instanceof ProcessComponent || o instanceof ProcessPackage) {
-
-				treeViewer.setExpandedState(pluginAdapter.getChildren(plugin)
-						.toArray()[1], true);
-				// Expand the process packages.
-				expandTreeViewerPackages(((MethodElement) o).eContainer());
-
-			} else {
-				ITreeItemContentProvider methodContentPkg = (ITreeItemContentProvider) pluginAdapter
-						.getChildren(plugin).toArray()[0];
-				treeViewer.setExpandedState(methodContentPkg, true);
-
-				if (o instanceof CustomCategory) {					
-					CustomCategory rootCC = TngUtil
-							.getRootCustomCategory(plugin);
-										
-					// find the tree path to the custom category from the root custom category
-					//
-					final List<Object> treePath = new ArrayList<Object>();
-					for(CustomCategory cc = (CustomCategory) o; cc != rootCC;) {
-						treePath.add(0, cc);
-						cc = (CustomCategory) AssociationHelper.getCustomCategories(cc).get(0);						 
-					}
-					
-					o = expandTree(rootCC, treePath);
-					
-				} else if (o instanceof ContentCategory) {
-					Object stdCats = methodContentPkg.getChildren(o).toArray()[1];
-								
-					// find the tree path to the category from the root "Standard Categories" category
-					//
-					final List<Object> treePath = new ArrayList<Object>();
-					if (o instanceof Discipline) {
-						// disciplines can nest
-						Object dis = o;
-						do {
-							treePath.add(0, dis);
-							List parentDisc = AssociationHelper.getDiscipline((Discipline)dis);
-							if (parentDisc.isEmpty()) break;
-							dis = parentDisc.get(0);						 
-						} while (true);
-						// get discipline group
-						if (!AssociationHelper.getDisciplineGroups((Discipline)dis).isEmpty()) {
-							DisciplineGrouping dg = (DisciplineGrouping) AssociationHelper.getDisciplineGroups((Discipline)dis).get(0);
-							treePath.add(0, dg);
-						}
-						// get "Disciplines"
-						treePath.add(0, TngUtil.getDisciplineCategoriesItemProvider(plugin));
-						o = expandTree(stdCats, treePath);
-					} else if (o instanceof RoleSet) {
-						// rolesets cannot nest
-						treePath.add(0, o);
-						RoleSetGrouping rsg = (RoleSetGrouping) AssociationHelper.getRoleSetGroups((RoleSet)o).get(0);						 
-						treePath.add(0, rsg);
-						// get "RoleSets"
-						treePath.add(0, TngUtil.getRoleSetsItemProvider(plugin));
-						o = expandTree(stdCats, treePath);
-					} else {
-						treeViewer.setExpandedState(stdCats, true);
-					}
-
-				} else {
-					Object coreContent = methodContentPkg.getChildren(o)
-							.toArray()[0];
-					treeViewer.setExpandedState(coreContent, true);
-
-					// Expand the content packages.
-					expandTreeViewerPackages(((MethodElement) o).eContainer());
-				}
-			}
-		} catch (Exception ex) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(ex);
-		}
-
-		super.setSelectionToViewer(Arrays.asList(new Object[] { o }));
-
-		if(o instanceof ProcessComponent && object instanceof BreakdownElement) {
-			// open the process in its editor and select the breakdown element
-			//
-			IEditorKeeper.REFERENCE.getEditorKeeper().openEditor(o);
-			IEditorPart editor = getSite().getPage().findEditor(new MethodElementEditorInput((MethodElement) o));
-			if(editor instanceof ProcessEditor) {
-				ProcessEditor procEditor = ((ProcessEditor)editor);
-				String pageId;
-				if(object instanceof RoleDescriptor || object instanceof TeamProfile) {
-					pageId = ProcessEditor.TA_FORM_ID;
-				}
-				else if(object instanceof WorkProductDescriptor) {
-					pageId = ProcessEditor.WPBS_FORM_ID;
-				}
-				else {
-					pageId = ProcessEditor.WBS_FORM_ID;
-				}
-				procEditor.setActivePage(pageId);
-				procEditor.setSelectionToViewer(Collections.singletonList(object));
-			}
-		}
-	}
-	
-	private Object expandTree(Object root, List treePath) {
-		Object parent = root;
-		int size = treePath.size();
-		for (int i = 0; i < size; i++) {
-			Object e = treePath.get(i);
-			treeViewer.setExpandedState(parent, true);
-			// get wrapper
-			//
-			List notifyChangedListeners = TngUtil.getNotifyChangedListeners(adapterFactory, e);
-			if (!notifyChangedListeners.isEmpty()) {
-				find_wrapper:
-				for (Iterator iterator = notifyChangedListeners.iterator(); iterator.hasNext();) {
-					Object listener = iterator.next();
-					if(listener instanceof FeatureValueWrapperItemProvider
-							&& TngUtil.unwrap(listener) == e) {
-						FeatureValueWrapperItemProvider wrapper = (FeatureValueWrapperItemProvider) listener;
-						for(;wrapper != null && wrapper.getOwner() != parent; 
-							wrapper = TngUtil.getWrapper(wrapper.getNotifyChangedListeners(), e)) {									
-						}
-						if(wrapper != null) {
-							parent = wrapper;
-							break find_wrapper;
-						}
-					}
-				}
-			} else {
-				parent = e;
-			}
-		}
-		return parent;
-
-	}
-	
-	private void expandTreeViewerPackages(EObject e) {
-		if (e == null)
-			return;
-		if (e instanceof ContentPackage || e instanceof ProcessPackage) {
-			expandTreeViewerPackages(e.eContainer());
-			treeViewer.setExpandedState(e, true);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.persistence.util.IRefreshHandler#refresh(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void refresh(final IProgressMonitor monitor) {
-		Control ctrl = getViewer().getControl();
-		if (ctrl == null || ctrl.isDisposed())
-			return;
-
-		if (ctrl.getDisplay().getThread() == Thread.currentThread()) {
-			doRefresh(getSite().getShell());
-		} else {
-			ctrl.getDisplay().syncExec(new Runnable() {
-
-				public void run() {
-					doRefresh(null);
-				}
-
-			});
-		}
-
-	}
-
-	private void blockingRefresh(final ArrayList removedResources,
-			final ArrayList changedResources,
-			final Collection addedWorkspaceResources,
-			final boolean refreshViews, Shell shell) {
-		final IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-				monitor
-						.subTask(AuthoringUIResources._UI_RefreshViewer_menu_item);
-				monitor.worked(1);
-				try {
-					// monitor.worked(1);
-					doRefresh(removedResources, changedResources,
-							addedWorkspaceResources, refreshViews);
-				} finally {
-					monitor.done();
-				}
-			}
-
-		};
-
-		IRunnableContext context = new ProgressMonitorDialog(shell);
-		try {
-			getSite().getWorkbenchWindow().getWorkbench().getProgressService()
-					.runInUI(
-							context,
-							runnable,
-							new LibrarySchedulingRule(LibraryService
-									.getInstance().getCurrentMethodLibrary()));
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-			String title = AuthoringUIResources.ProcessEditor_refreshErrorTitle;
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(title,
-					e.toString(), e);
-		}
-	}
-
-	/**
-	 * Must be synchronized to avoid stepping on each other in reloading
-	 * resources/refreshing UI
-	 * 
-	 * @param removedResources
-	 * @param changedResources
-	 * @param addedWorkspaceResources
-	 *            collection of IResource objects that are just newly added to
-	 *            the library
-	 * @param refreshViews
-	 */
-	private synchronized void doRefresh(Collection removedResources,
-			Collection changedResources, Collection addedWorkspaceResources,
-			boolean refreshViews) {
-		HashSet editorsToRefresh = new HashSet();
-		if (!removedResources.isEmpty()) {
-			handleRemovedResources(removedResources, editorsToRefresh);
-			refreshViews = true;
-		}
-		if (!changedResources.isEmpty()) {
-			handleChangedResources(changedResources, editorsToRefresh,
-					refreshViews);
-		} else {
-			if (refreshViews) {
-				refreshViews();
-			}
-
-			if (!editorsToRefresh.isEmpty()) {
-				// refresh the editors that handleRemovedResources requested
-				//
-				for (Iterator iter = editorsToRefresh.iterator(); iter
-						.hasNext();) {
-					Object editor = iter.next();
-					if (editor instanceof MethodElementEditor) {
-						((MethodElementEditor) editor).refresh();
-					}
-				}
-			}
-		}
-		if (addedWorkspaceResources != null
-				&& !addedWorkspaceResources.isEmpty()) {
-			ILibraryManager mgr = LibraryService.getInstance()
-					.getCurrentLibraryManager();
-			if (mgr != null) {
-				ResourceSet resourceSet = mgr.getEditingDomain()
-						.getResourceSet();
-				if (resourceSet instanceof MultiFileResourceSetImpl) {
-					((MultiFileResourceSetImpl) resourceSet)
-							.loadNewResources(addedWorkspaceResources);
-					((MultiFileResourceSetImpl) resourceSet).getUnresolvedProxyMarkerManager().validateAllMarkers();
-				}
-			}
-		}
-	}
-
-	private boolean isViewObject(Object o) {
-		return o instanceof MethodElement
-				&& !(o instanceof ContentDescription
-						|| o instanceof ProcessElement || (o instanceof ProcessPackage && UmaUtil
-						.getProcessComponent((MethodElement) o) == null));
-	}
-
-	private void doRefresh(IRefreshEvent event, Shell shell) {
-		if (DEBUG) {
-			System.out
-					.println("Refreshed objects: " + event.getRefreshedObjects()); //$NON-NLS-1$
-		}
-		boolean refresh = false;
-		for (Iterator iter = event.getRefreshedObjects().iterator(); iter
-				.hasNext();) {
-			Object e = iter.next();
-			if (isViewObject(e)) {
-				refresh = true;
-				break;
-			}
-		}
-		if (refresh) {
-			refreshViews();
-		}
-	}
-
-	/**
-	 * Refreshes the Library View
-	 * 
-	 * @param shell
-	 */
-	private void doRefresh(Shell shell) {
-		final boolean refreshViews = !RefreshJob.getInstance()
-				.getReloadedBeforeRefreshResources().isEmpty()
-				|| !RefreshJob.getInstance().getAddedResources().isEmpty();
-		ArrayList removedResources = new ArrayList(RefreshJob.getInstance()
-				.getRemovedResources());
-		ArrayList changedResources = new ArrayList(RefreshJob.getInstance()
-				.getChangedResources());
-		ArrayList addedWsResources = new ArrayList(RefreshJob.getInstance()
-				.getAddedWorkspaceResources());
-
-		if (!removedResources.isEmpty() || !changedResources.isEmpty()
-				|| !addedWsResources.isEmpty() || refreshViews) {
-			blockingRefresh(removedResources, changedResources,
-					addedWsResources, refreshViews, shell);
-		}
-
-		if (!removedResources.isEmpty()) {
-			RefreshJob.getInstance().getRemovedResources().removeAll(
-					removedResources);
-		}
-		if (!changedResources.isEmpty()) {
-			RefreshJob.getInstance().getChangedResources().removeAll(
-					changedResources);
-		}
-		if (!addedWsResources.isEmpty()) {
-			RefreshJob.getInstance().getAddedWorkspaceResources().removeAll(
-					addedWsResources);
-		}
-		if (refreshViews) {
-			RefreshJob.getInstance().getReloadedBeforeRefreshResources()
-					.clear();
-			RefreshJob.getInstance().getAddedResources().clear();
-		}
-	}
-
-	/**
-	 * @param removedResources2
-	 */
-	private Collection handleRemovedResources(Collection removedResources,
-			Collection editorsToRefresh) {
-		IWorkbenchPage workbenchPage = getSite().getPage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		ArrayList dirtyEditorsWithConflict = new ArrayList();
-		ArrayList removedResourceList = new ArrayList(removedResources);
-		if (editorsToRefresh == null) {
-			editorsToRefresh = new ArrayList();
-		}
-		// find all editor with dirty conflict
-		//
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof MethodElementEditor && editor.isDirty()) {
-				MethodElementEditorInput input = (MethodElementEditorInput) editor
-						.getEditorInput();
-				Resource resource = input.getMethodElement() != null ? input
-						.getMethodElement().eResource() : null;
-				if (!removedResources.contains(resource)) {
-					Collection usedResources = ((MethodElementEditor) editor)
-							.getUsedResources();
-					check_resource: for (int j = 0; j < removedResourceList
-							.size(); j++) {
-						resource = (Resource) removedResourceList.get(j);
-						if (usedResources.contains(resource)) {
-							dirtyEditorsWithConflict.add(editor);
-							break check_resource;
-						}
-					}
-				} else {
-					editorsToRefresh.add(editor);
-				}
-			}
-		}
-
-		if (!dirtyEditorsWithConflict.isEmpty()) {
-			Object[] selected = selectDirtyEditors(dirtyEditorsWithConflict);
-			for (int i = 0; i < selected.length; i++) {
-				editorsToRefresh.add(selected[i]);
-			}
-		}
-
-		// Unload the removed resources.
-		PersistenceUtil.unload(removedResources);
-
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof MethodElementEditor && !editor.isDirty()) {
-				Collection usedResources = ((MethodElementEditor) editor)
-						.getUsedResources();
-				check_resource: for (int j = 0; j < removedResourceList.size(); j++) {
-					Resource resource = (Resource) removedResourceList.get(j);
-					if (usedResources.contains(resource)) {
-						editorsToRefresh.add(editor);
-						break check_resource;
-					}
-				}
-			}
-		}
-
-		return removedResources;
-	}
-
-	/**
-	 * 
-	 * @param changedResources
-	 * @return resources that have been reloaded
-	 */
-	private Collection handleChangedResources(Collection changedResources,
-			Collection editorsToRefresh, boolean forceRefreshViews) {
-		if (!forceRefreshViews) {
-			for (Iterator iter = changedResources.iterator(); iter.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				if (resource instanceof ILibraryResource
-						&& ((ILibraryResource) resource).getLoadStamp() > lastRefreshTimeStamp) {
-					forceRefreshViews = true;
-					break;
-				}
-			}
-		}
-		return handleChangedResources(changedResources, null,
-				forceRefreshViews, editorsToRefresh);
-	}
-
-	/**
-	 * updates Library View when resources change
-	 * 
-	 * @param changedResources
-	 * @param editorsNotToRefresh
-	 * @param forceRefreshViews
-	 * @param editorsToRefresh
-	 * @return List of changed resources
-	 */
-	public Collection handleChangedResources(Collection changedResources,
-			Collection editorsNotToRefresh, boolean forceRefreshViews,
-			Collection editorsToRefresh) {
-		Control ctrl = getViewer().getControl();
-		if (ctrl == null || ctrl.isDisposed())
-			return Collections.EMPTY_LIST;
-
-		IWorkbenchPage workbenchPage = getSite().getPage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		ArrayList<IEditorPart> dirtyEditorsWithConflict = new ArrayList<IEditorPart>();
-		ArrayList<Resource> changedResourceList = new ArrayList<Resource>(changedResources);
-		// find all editor with dirty conflict
-		//
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof MethodElementEditor && editor.isDirty()) {
-				Collection<Resource> usedResources = ((MethodElementEditor) editor)
-						.getUsedResources();
-				check_resource: for (int j = 0; j < changedResourceList.size(); j++) {
-					Resource resource = (Resource) changedResourceList.get(j);
-					if (usedResources.contains(resource)) {
-						dirtyEditorsWithConflict.add(editor);
-						break check_resource;
-					}
-				}
-			}
-		}
-		final ArrayList editorListToRefresh = new ArrayList();
-		if (editorsToRefresh != null) {
-			editorListToRefresh.addAll(editorsToRefresh);
-		}
-		if (!dirtyEditorsWithConflict.isEmpty()) {
-			Object[] result = selectDirtyEditors(dirtyEditorsWithConflict);
-			if(result != null) {
-				for (int i = 0; i < result.length; i++) {
-					Object editor = result[i];
-					if ((editorsNotToRefresh == null || !editorsNotToRefresh
-							.contains(editor))
-							&& (editorsToRefresh == null || !editorsToRefresh
-									.contains(editor))) {
-						editorListToRefresh.add(editor);
-						dirtyEditorsWithConflict.remove(editor);
-					}
-				}
-			}
-			// remove all resources used by dirty editors with conflict from the
-			// collection of changed resources after updating cached modification stamp
-			// so they will not be prompted to reload again until the next external change
-			//
-			for (int i = 0; i < dirtyEditorsWithConflict.size(); i++) {
-				MethodElementEditor editor = (MethodElementEditor) dirtyEditorsWithConflict
-						.get(i);				
-				Collection<Resource> usedResources = editor.getUsedResources();
-				usedResources.retainAll(changedResourceList);
-				editor.updateResourceInfos(usedResources);
-				editor.ovewriteResources(usedResources);
-				changedResourceList.removeAll(usedResources);
-			}
-		}
-
-		boolean refreshViews = false;
-		if (!changedResourceList.isEmpty()) {
-			for (int i = 0; i < editorReferences.length; i++) {
-				IEditorReference reference = editorReferences[i];
-				IEditorPart editor = reference.getEditor(true);
-				if (editor instanceof MethodElementEditor && !editor.isDirty()) {
-					Collection<Resource> usedResources = ((MethodElementEditor) editor)
-							.getUsedResources();
-					check_resource: for (int j = 0; j < changedResourceList
-							.size(); j++) {
-						Resource resource = (Resource) changedResourceList
-								.get(j);
-						if (usedResources.contains(resource)) {
-							editorListToRefresh.add(editor);
-							break check_resource;
-						}
-					}
-				}
-			}
-
-			// Reload the selected changed resources.
-			ILibraryManager manager = (ILibraryManager) LibraryService
-					.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				Collection<Resource> reloadedResources = manager
-						.reloadResources(changedResourceList);
-
-				refreshViews = !reloadedResources.isEmpty();
-			}
-		}
-		if (forceRefreshViews || refreshViews) {
-			refreshViews();
-		}
-		if (!editorListToRefresh.isEmpty()) {
-			for (int i = 0; i < editorListToRefresh.size(); i++) {
-				MethodElementEditor editor = (MethodElementEditor) editorListToRefresh
-						.get(i);
-				try {
-					editor.refresh();
-				} catch (Exception e) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-		return changedResourceList;
-	}
-
-	/**
-	 * Refreshes Library and Configuration views if necessary
-	 * 
-	 */
-	public synchronized void refreshViews() {
-		EObject input = (EObject) getViewer().getInput();
-		if (input != null) {
-			if (input.eIsProxy()) {
-				setInputForViewer(RefreshJob.getInstance().resolve(input));
-			} else {
-				ISelection selection = getViewer().getSelection();
-				getViewer().refresh();
-				updateLastRefreshTimestamp();
-				if (selection instanceof IStructuredSelection) {
-					IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-					Object o = null;
-					if (structuredSelection.size() == 1
-							&& (o = structuredSelection.getFirstElement()) instanceof EObject
-							&& ((EObject) o).eIsProxy()) {
-						o = RefreshJob.getInstance().resolve((EObject) o);
-						try {
-							setSelectionToViewer(o);
-						} catch (Exception e) {
-							AuthoringUIPlugin.getDefault().getLogger()
-									.logError(e);
-						}
-					} else {
-						ViewHelper.restoreSelection(getViewer(), selection);
-					}
-				}
-			}
-		}
-
-		ConfigurationView configView = ConfigurationView.getView();
-		if (configView != null) {
-			Control ctrl = configView.getViewer().getControl();
-			if (ctrl != null && !ctrl.isDisposed()) {
-				input = (EObject) configView.getViewer().getInput();
-				if (input != null) {
-					if (input.eIsProxy()) {
-						configView.setInputForViewer(RefreshJob.getInstance()
-								.resolve(input));
-					} else {
-						ISelection selection = configView.getViewer()
-								.getSelection();
-						configView.getViewer().refresh();
-						ViewHelper.restoreSelection(configView.getViewer(), selection);
-					}
-				}
-			}
-		}
-	}
-
-	private Object[] selectDirtyEditors(List<?> dirtyEditors) {
-		return RefreshHandler.selectDirtyEditors(dirtyEditors, getSite().getShell());
-	}
-
-	/**
-	 * rename an element
-	 * 
-	 * @param e
-	 *            element to rename
-	 * @param newName
-	 *            the new name
-	 */
-	public static void runRename(final NamedElement e, final String newName) {
-		Display.getDefault().syncExec(new Runnable() {
-			public void run() {
-				RenameAction.doRename(e, newName);
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IShowInTarget#show(org.eclipse.ui.part.ShowInContext)
-	 */
-	public boolean show(ShowInContext context) {
-		// special handling for ShowInContext from problems view
-		//
-		if (context.getInput() instanceof MarkerAdapter) {
-			IViewPart view = getViewSite().getPage().findView(
-					"org.eclipse.ui.views.ProblemView"); //$NON-NLS-1$
-			ISelectionProvider selectionProvider = view.getViewSite()
-					.getSelectionProvider();
-			StructuredSelection selection = (StructuredSelection) selectionProvider
-					.getSelection();
-			Object o = selection.getFirstElement();
-			if (o instanceof IMarker) {
-				IMarker marker = (IMarker) o;
-				try {
-					String guid = (String) marker
-							.getAttribute(LibraryValidationMarkerHelper.GUID);
-					if (guid != null) {
-						IResource wsRes = marker.getResource();
-						ILibraryManager libMgr = LibraryService.getInstance().getCurrentLibraryManager();						
-						Resource resource = libMgr.getEditingDomain().getResourceSet()
-								.getResource(
-										URI.createFileURI(wsRes.getLocation()
-												.toString()), false);
-						Object element;
-						if(resource != null) {
-							element = resource.getEObject(guid);
-						}
-						else {
-							element = libMgr.getMethodElement(guid);
-						}
-						if(element != null) {
-							setSelectionToViewer(element);
-							return true;
-						}
-					}
-				} catch (CoreException e) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-		ISelection contextSelection = context.getSelection();
-		if (context.getSelection() instanceof TreeSelection) {
-			// from search results view
-			TreeSelection sel = (TreeSelection)context.getSelection();
-			setSelectionToViewer(sel.getFirstElement());
-		} else if (contextSelection instanceof StructuredSelection) {
-			// from problems view, perhaps others?
-			StructuredSelection sel = (StructuredSelection)contextSelection;
-			Object firstObj = sel.getFirstElement();
-			if (firstObj instanceof IResource) {
-				IResource wsRes = (IResource)firstObj;
-				ILibraryManager libMgr = LibraryService.getInstance().getCurrentLibraryManager();						
-				Resource resource = libMgr.getEditingDomain().getResourceSet()
-						.getResource(
-								URI.createFileURI(wsRes.getLocation()
-										.toString()), false);
-				Object element = PersistenceUtil.getMethodElement(resource);
-				if(element != null) {
-					setSelectionToViewer(element);
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public String getViewId() {
-		return VIEW_ID;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LockerFactory.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LockerFactory.java
deleted file mode 100644
index 28984eb..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LockerFactory.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package org.eclipse.epf.authoring.ui.views;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.osgi.framework.Bundle;
-
-public class LockerFactory {
-
-	/**
-	 * The extension point namespace.
-	 */
-	public static final String EXTENSION_POINT_NAMESPACE = "org.eclipse.epf.authoring.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension point name.
-	 */
-	public static final String EXTENSION_POINT_NAME = "CustomizedLocker"; //$NON-NLS-1$
-
-	/**
-	 * The "class" attribute name.
-	 */
-	public static final String CLASS_ATTRIB_NAME = "class"; //$NON-NLS-1$
-
-	/**
-	 * The "id" attribute name.
-	 */
-	public static final String ID_ATTRIB_NAME = "id"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static LockerFactory instance = null;
-
-	// A map of library manager configuration elements.
-	private Map<String, LockerElement> lockerElements = new HashMap<String, LockerElement>();
-	
-	//A map to manage id and locker pairs.
-	private Map<String, AbstractLocker> lockerMap = new HashMap<String, AbstractLocker>();
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static LockerFactory getInstance() {
-		if(instance == null){
-			synchronized(LockerFactory.class){
-				if (instance == null) {
-					instance = new LockerFactory();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private LockerFactory() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				EXTENSION_POINT_NAMESPACE, EXTENSION_POINT_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-				IConfigurationElement[] configElements = extension
-				.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String className = configElement
-						.getAttribute(CLASS_ATTRIB_NAME);
-						String id = configElement
-						.getAttribute(ID_ATTRIB_NAME);
-						if (className != null && className.trim().length() > 0
-								&& id != null && id.trim().length() > 0) {							
-							LockerElement provider = lockerElements.get(id);
-							if(provider == null ) {
-								provider = new LockerElement(
-										bundle, className, id);
-								lockerElements.put(id, provider);
-							}
-						}
-					} catch (Exception e) {
-						LibraryPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-
-	public AbstractLocker getLocker(Object obj) {
-		if ( obj instanceof MethodElement ) {
-			MethodElement e = ((MethodElement)obj);			
-			if (e != null ) {
-				List props = e.getMethodElementProperty();
-				if ( props != null && props.size() > 0 ) {
-					for (Iterator itp = props.iterator(); itp.hasNext(); ) {
-						MethodElementProperty prop = (MethodElementProperty)itp.next();
-						String id = prop.getName();
-						AbstractLocker locker= getLocker(id);
-						if ( locker != null ) {						
-							return locker;
-						}
-					}
-				}	
-			}
-		}
-		return null;
-	}
-
-	private AbstractLocker getLocker(String id) {
-
-		if ( !lockerElements.containsKey(id) ) {
-			return null;
-		}
-
-		//return created instance
-		if(lockerMap.containsKey(id) ){
-			return lockerMap.get(id);
-		}
-		
-		LockerElement provider = (LockerElement) lockerElements.get(id);
-		try {
-			Class clazz = provider.bundle.loadClass(provider.className);
-			AbstractLocker lockerInstance = (AbstractLocker) clazz.newInstance();
-			lockerMap.put(id, lockerInstance);
-			return lockerInstance;
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-		}
-
-		return null;
-	}
-
-	private class LockerElement {
-		Bundle bundle;
-		String className;
-		String id;
-		private LockerElement(Bundle bundle, String className, String id) {
-			this.bundle = bundle;
-			this.className = className;
-			this.id = id;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ProcessTreeViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ProcessTreeViewer.java
deleted file mode 100644
index 3f78d80..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ProcessTreeViewer.java
+++ /dev/null
@@ -1,350 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor;
-import org.eclipse.epf.library.configuration.ActivityDeepCopyConfigurator;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.ActivityDropCommand;
-import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
-import org.eclipse.jface.viewers.ColumnViewerEditor;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
-import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.TreeViewerEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.Accessible;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.swt.widgets.Widget;
-
-
-/**
- * Displays the Process elements in a tree table viewer.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ProcessTreeViewer extends TreeViewer implements
-		IActionTypeProvider {
-	private static final String COPY_TXT = AuthoringUIResources.copy_text; 
-	private static final String EXTEND_TXT = AuthoringUIResources.extend_text; 
-	private static final String DEEP_COPY_TXT = AuthoringUIResources.deepCopy_text; 
-	
-	private static String getActionText(int actionType) {
-		switch (actionType) {
-		case COPY:
-			return COPY_TXT;
-		case EXTEND:
-			return EXTEND_TXT;
-		case DEEP_COPY:
-			return DEEP_COPY_TXT;
-		}
-		return null;
-	}
-
-	private int actionType = IActionTypeProvider.COPY;
-
-	private Menu actionTypePopup;
-
-	private Point actionTypePopupLocation;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessTreeViewer(Composite parent, int style) {
-		super(parent, style);
-
-		final Tree tree = getTree();
-		tree.setHeaderVisible(true);
-		tree.setLinesVisible(true);
-
-		addTreeListener(new ITreeViewerListener() {
-			public void treeCollapsed(TreeExpansionEvent event) {
-				setItemProviderExpanded(event.getElement(), false);
-			}
-
-			public void treeExpanded(TreeExpansionEvent event) {
-				setItemProviderExpanded(event.getElement(), true);
-			}
-		});
-		
-		Accessible accessible = tree.getAccessible();
-		accessible.addAccessibleListener (new AccessibleAdapter () {
-			public void getName (AccessibleEvent e) {
-				super.getName(e);
-				if (e.childID >= 0) {
-					TreeItem[] items = tree.getSelection();
-					if (items != null && items.length == 1) {
-						String stringToRead = ""; //$NON-NLS-1$
-						TreeItem item = (TreeItem) items[0];
-						if (item != null) {
-							TreeColumn[] columns = tree.getColumns();
-							for (int i = 0; i < columns.length; i++) {
-								TreeColumn column = columns[i];
-								stringToRead += column.getText() + " " //$NON-NLS-1$
-										+ item.getText(i);
-							}
-							e.result = stringToRead;
-						}
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * Set up colunms according to the given array of descriptors
-	 * @param columnDescriptors
-	 */
-	public void setupColumns(ColumnDescriptor[] columnDescriptors) {
-		// Remove all old TreeColumns.
-		TreeColumn[] cols = getTree().getColumns();
-		int size = cols.length;
-		for (int i = 0; i < size; i++) {
-			cols[i].dispose();
-		}
-
-		String[] colProps = new String[columnDescriptors.length];
-		for (int i = 0; i < columnDescriptors.length; i++) {
-			colProps[i] = columnDescriptors[i].id;
-			TreeColumn column = new TreeColumn(getTree(),
-					columnDescriptors[i].alignment);
-			column.setText(columnDescriptors[i].label);
-			column.setResizable(columnDescriptors[i].resizable);
-			column.setWidth(columnDescriptors[i].width);
-		}
-
-		setColumnProperties(colProps);
-
-	}
-
-	private void setItemProviderExpanded(Object element, boolean expand) {
-		Object adapter = getAdapterFactory().adapt(element,
-				ITreeItemContentProvider.class);
-		if (adapter instanceof IBSItemProvider) {
-			((IBSItemProvider) adapter).setExpanded(Boolean.valueOf(expand));
-		}
-	}
-
-	/**
-	 * @return the AdapterFactory
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return getContentProvider() == null ? null
-				: ((AdapterFactoryContentProvider) getContentProvider())
-						.getAdapterFactory();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.TableTreeViewer#setExpanded(Item, boolean)
-	 */
-	protected void setExpanded(Item node, boolean expand) {
-		super.setExpanded(node, expand);
-		Object adapter = getAdapterFactory().adapt(node.getData(),
-				ITreeItemContentProvider.class);
-		if (adapter instanceof IBSItemProvider) {
-			IBSItemProvider bsItemProvider = ((IBSItemProvider) adapter);
-			if (bsItemProvider.isExpanded() == null) {
-				bsItemProvider.setExpanded((Boolean.valueOf(expand)));
-			}
-		}
-	}
-
-	private void setExpanded(Item item, Object element) {
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) getAdapterFactory().adapt(element,
-				ITreeItemContentProvider.class);
-		if(adapter.hasChildren(element)) {
-			if (adapter instanceof IBSItemProvider) {
-				Boolean expand = ((IBSItemProvider) adapter).isExpanded();
-				if (expand != null) {
-					setExpandedState(item, expand.booleanValue());
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#internalRefresh(Widget,
-	 *      Object, boolean, boolean)
-	 */
-	protected void internalRefresh(Widget widget, Object element,
-			boolean doStruct, boolean updateLabels) {
-		super.internalRefresh(widget, element, doStruct, updateLabels);
-
-		if (doStruct) {
-			preserveExpandedState(widget);
-		}
-	}
-	
-	private void preserveExpandedState(Widget widget) {
-		if (widget instanceof Item) {
-			Item item = (Item) widget;
-			setExpanded(item, item.getData());
-		} else {
-			Item[] children = getChildren(widget);
-			for (int i = 0; i < children.length; i++) {
-				Item child = children[i];
-				if (child instanceof Item) {
-					Item item = (Item) child;
-					setExpanded(item, item.getData());
-				}
-			}
-		}
-	}
-	
-	@Override
-	protected void internalInitializeTree(Control widget) {
-		super.internalInitializeTree(widget);
-		preserveExpandedState(widget);
-	}
-
-	private Command command;
-
-	private IActionManager actionManager;
-
-	/**
-	 * @see org.eclipse.epf.library.edit.ui.IActionTypeProvider#getActionType()
-	 */
-//	public int getActionType() {
-//		if (actionTypePopup == null) {
-//			createActionTypePopup();
-//		}
-//
-//		Display.getCurrent().syncExec(new Runnable() {
-//
-//			public void run() {
-//				actionType = 0;
-//				actionTypePopup.setLocation(actionTypePopupLocation);
-//				actionTypePopup.setVisible(true);
-//			}
-//
-//		});
-//
-//		return actionType;
-//	}
-
-	private void createActionTypePopup(int[] choices) {
-		actionTypePopup = new Menu(getControl());
-		SelectionListener selectionListener = new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				MenuItem item = ((MenuItem) e.getSource());
-				String text = item.getText();
-				if (text == COPY_TXT) {
-					ProcessTreeViewer.this.actionType = IActionTypeProvider.COPY;
-				} else if (text == EXTEND_TXT) {
-					ProcessTreeViewer.this.actionType = IActionTypeProvider.EXTEND;
-				} else if (text == DEEP_COPY_TXT) {
-					ProcessTreeViewer.this.actionType = DEEP_COPY;
-				}
-
-				if (command instanceof ActivityDropCommand) {
-					ActivityDropCommand cmd = ((ActivityDropCommand) command);
-					cmd.setType(ProcessTreeViewer.this.actionType);
-					cmd.setLabel(text);
-					
-					if (ProcessTreeViewer.this.actionType == DEEP_COPY ) {
-						cmd.setActivityDeepCopyConfigurator(new ActivityDeepCopyConfigurator());
-					}
-					
-				}
-
-				if (actionManager != null
-						&& command instanceof IResourceAwareCommand) {
-					actionManager.execute((IResourceAwareCommand) command);
-				} else {
-					command.execute();
-				}
-
-				actionTypePopup.setVisible(false);
-			}
-
-		};
-		
-		for (int actionType : choices) {
-			MenuItem menuItem = new MenuItem(actionTypePopup, SWT.CASCADE);
-			menuItem.setText(getActionText(actionType));
-			menuItem.addSelectionListener(selectionListener);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.ui.IActionTypeProvider#setInputData(Object)
-	 */
-	public void setInputData(Object object) {
-		actionTypePopupLocation = (Point) object;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.ui.IActionTypeProvider#execute(org.eclipse.emf.common.command.Command, boolean)
-	 */
-	public void execute(Command cmd, int[] choices) {
-		createActionTypePopup(choices);
-
-		this.command = cmd;
-		actionTypePopup.setLocation(actionTypePopupLocation);
-		actionTypePopup.setVisible(true);
-	}
-
-	/**
-	 * Changes default behavior of activating text cell editor from single mouse click to double mouse click
-	 */
-	@Override
-	protected void hookEditingSupport(Control control) {
-		try {
-			TreeViewerEditor.create(this, new ColumnViewerEditorActivationStrategy(this) {
-				@Override
-				protected boolean isEditorActivationEvent(
-						ColumnViewerEditorActivationEvent event) {
-					return event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
-					|| event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
-					|| event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL;
-				}
-			},ColumnViewerEditor.DEFAULT);
-		}
-		catch(NullPointerException e) {
-			// work-around for a bug in org.eclipse.jface.viewers.TreeViewerEditor.create(TreeViewer, SWTFocusCellManager, ColumnViewerEditorActivationStrategy, int)
-			// that tried to call SWTFocusCellManager.init() even SWTFocusCellManager is null		
-		}
-		super.hookEditingSupport(control);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.ui.IActionTypeProvider#setActionManager(IActionManager)
-	 */
-	public void setActionManager(IActionManager actionMgr) {
-		actionManager = actionMgr;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ProcessViewer.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ProcessViewer.java
deleted file mode 100644
index 973bfb4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ProcessViewer.java
+++ /dev/null
@@ -1,196 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import org.eclipse.epf.authoring.ui.celleditors.AbstractCheckBoxCellEditor;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.swt.widgets.TreeItem;
-
-/**
- * Displays the Process elements in a tree table viewer.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ProcessViewer extends ProcessTreeViewer {
-
-	private String[] columnProperties;
-
-	private AbstractCheckBoxCellEditor[] checkBoxCellEditors = null;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessViewer(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * Return parent - underlying tree
-	 * 
-	 * @return parent
-	 */
-	public Composite getCellEditorParent() {
-		return getTree();
-	}
-
-	/**
-	 * Set check box cell editors
-	 * 
-	 * @param checkBoxCellEditors
-	 */
-	public void setCheckBoxCellEditors(
-			AbstractCheckBoxCellEditor[] checkBoxCellEditors) {
-		this.checkBoxCellEditors = checkBoxCellEditors;
-		for (int i = 0; i < checkBoxCellEditors.length; i++) {
-			AbstractCheckBoxCellEditor editor = checkBoxCellEditors[i];
-			if (editor == null)
-				continue;
-			editor.setColumnIndex(i);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.ProcessTreeViewer#hookControl(org.eclipse.swt.widgets.Control)
-	 */
-	protected void hookControl(Control control) {
-		super.hookControl(control);
-		getTree().addMouseListener(new MouseAdapter() {
-			public void mouseDown(MouseEvent e) {
-				modifyItem(e);
-			}
-		});
-		// getTree().addMouseMoveListener(new MouseMoveListener(){
-		// public void mouseMove(MouseEvent e){
-		// setUnsetEditor(e);
-		// }
-		// });
-		Listener paintListener = new Listener() {
-			public void handleEvent(Event event) {
-				switch (event.type) {
-				case SWT.PaintItem: {
-					// System.out.println("event.index = "+ event.index);
-					Image image = getCheckBoxCellEditorImage(event);
-					if (image == null)
-						return;
-					TreeColumn col = getTree().getColumn(event.index);
-					int x = event.x + col.getWidth() / 2;
-					Rectangle rect = image.getBounds();
-					int offset = Math.max(0, (event.height - rect.height) / 2);
-					event.gc.drawImage(image, x - rect.width / 2, event.y
-							+ offset);
-					break;
-				}
-				}
-			}
-		};
-		getTree().addListener(SWT.PaintItem, paintListener);
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.views.ProcessTreeViewer#doUpdateItem(org.eclipse.swt.widgets.Item,
-	 *      java.lang.Object)
-	 */
-	protected void doUpdateItem(Item item, Object element) {
-		super.doUpdateItem(item, element);
-
-		if (checkBoxCellEditors != null && columnProperties != null
-				&& columnProperties.length > 0) {
-			for (int i = 0; i < checkBoxCellEditors.length; i++) {
-				AbstractCheckBoxCellEditor editor = checkBoxCellEditors[i];
-				if (editor == null)
-					continue;
-				((TreeItem) item).setText(i, ""); //$NON-NLS-1$
-
-			}
-		}
-
-	}
-
-	private Image getCheckBoxCellEditorImage(Event event) {
-		return getCheckBoxCellEditorImage(event.index, (TreeItem) event.item);
-	}
-
-	private Image getCheckBoxCellEditorImage(int columnIndex, TreeItem item) {
-		if (checkBoxCellEditors == null
-				|| checkBoxCellEditors[columnIndex] == null)
-			return null;
-		return checkBoxCellEditors[columnIndex].getImage(item,
-				columnProperties[columnIndex]);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.TreeViewer#setCellModifier(org.eclipse.jface.viewers.ICellModifier)
-	 */
-	public void setCellModifier(ICellModifier modifier) {
-		super.setCellModifier(modifier);
-
-		if (checkBoxCellEditors != null) {
-			for (int i = 0; i < checkBoxCellEditors.length; i++) {
-				AbstractCheckBoxCellEditor editor = checkBoxCellEditors[i];
-				if (editor == null)
-					continue;
-				editor.setCellModifier(modifier);
-			}
-		}
-	}
-
-	/**
-	 * This method is used for mouse down listener
-	 * 
-	 * @param event
-	 */
-	private void modifyItem(MouseEvent event) {
-		Point pt = new Point(event.x, event.y);
-		TreeItem item = getTree().getItem(pt);
-		if (item == null)
-			return;
-
-		for (int i = 0; i < getTree().getColumnCount(); i++) {
-			Rectangle rect = item.getBounds(i);
-			if (rect.contains(pt)) {
-				Image image = getCheckBoxCellEditorImage(i, item);
-				if (image == null)
-					return;
-				Rectangle imgRect = image.getBounds();
-				int offset = Math.max(0, (rect.height - imgRect.height) / 2);
-				int x = rect.x + rect.width / 2 - imgRect.width / 2;
-				int y = rect.y + offset;
-				imgRect = new Rectangle(x, y, imgRect.width, imgRect.height);
-				if (imgRect.contains(pt)) {
-					checkBoxCellEditors[i].modify(item, columnProperties[i]);
-					return;
-				}
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.TreeViewer#setColumnProperties(java.lang.String[])
-	 */
-	public void setColumnProperties(String[] columnProperties) {
-		super.setColumnProperties(columnProperties);
-		this.columnProperties = columnProperties;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/SaveableLibraryViewPart.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/SaveableLibraryViewPart.java
deleted file mode 100644
index a1d38fd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/SaveableLibraryViewPart.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISaveablePart;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * The abstract class for all views that requires the support of saving a Method
- * Library via the Save action.
- * 
- * @author Phong Le
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class SaveableLibraryViewPart extends ViewPart implements
-		ISaveablePart {
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#doSave(IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (monitor != null) {
-			monitor
-					.beginTask(
-							AuthoringUIResources.savingLibraryTask_name, IProgressMonitor.UNKNOWN); 
-			String libPath = LibraryService.getInstance()
-					.getCurrentMethodLibraryLocation();
-			try {
-				LibraryService.getInstance().saveCurrentMethodLibrary();
-				firePropertyChange(IEditorPart.PROP_DIRTY);
-			} catch (Exception e) {
-				AuthoringUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayError(
-								AuthoringUIResources.saveLibraryDialog_title, 
-								AuthoringUIResources.bind(AuthoringUIResources.saveLibraryToError_msg, libPath), 
-								AuthoringUIResources.error_reason, 
-								e);
-			} finally {
-				monitor.done();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ViewHelper.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ViewHelper.java
deleted file mode 100644
index c6ec7e2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ViewHelper.java
+++ /dev/null
@@ -1,987 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.views;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A helper class for managing the views and editors in the Authoring
- * perspective.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public final class ViewHelper {
-
-	/**
-	 * Prompts the user to save the open library if it has been modified.
-	 * 
-	 * @return <code>true<code> if the user saved or discarded the change,
-	 * 		   <code>false</code> if the user cancelled the action that
-	 *         triggered this call.
-	 */
-	public static boolean promptSave() {
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null && manager.isMethodLibraryModified()) {
-			int ret = MsgBox.prompt(AuthoringUIResources.saveLibraryDialog_title, 
-					AuthoringUIResources.saveLibraryDialog_text, 
-					SWT.YES | SWT.NO | SWT.CANCEL);
-			switch (ret) {
-			case SWT.YES:
-				try {
-					LibraryService.getInstance().saveCurrentMethodLibrary();
-				} catch (Exception e) {
-					MsgDialog dialog = AuthoringUIPlugin.getDefault()
-							.getMsgDialog();
-					dialog
-							.displayError(
-									AuthoringUIResources.saveLibraryDialog_title, 
-									AuthoringUIResources.saveLibraryError_msg, 
-									AuthoringUIResources.error_reason, e); 
-
-					return dialog
-							.displayPrompt(
-									AuthoringUIResources.openLibraryDialog_title, 
-									AuthoringUIResources.openLibraryDialog_text); 
-				}
-				break;
-			case SWT.NO:
-				// Discard all changes by resetting all resources as unchanged.
-				manager.discardMethodLibraryChanges();
-				break;
-			case SWT.CANCEL:
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Prompts the user to save the open library if it has been modified.
-	 * 
-	 * @return the choice the user made when prompted to save - one of SWT.YES, SWT.NO, SWT.CANCEL
-	 */
-	public static int promptSaveInt() {
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null && manager.isMethodLibraryModified()) {
-			int ret = MsgBox.prompt(AuthoringUIResources.saveLibraryDialog_title, 
-					AuthoringUIResources.saveLibraryDialog_text, 
-					SWT.YES | SWT.NO | SWT.CANCEL);
-			switch (ret) {
-			case SWT.YES:
-				try {
-					LibraryService.getInstance().saveCurrentMethodLibrary();
-				} catch (Exception e) {
-					MsgDialog dialog = AuthoringUIPlugin.getDefault()
-							.getMsgDialog();
-					dialog
-							.displayError(
-									AuthoringUIResources.saveLibraryDialog_title, 
-									AuthoringUIResources.saveLibraryError_msg, 
-									AuthoringUIResources.error_reason, e); 
-				}
-				return SWT.YES;
-			case SWT.NO:
-				// Discard all changes by resetting all resources as unchanged.
-				manager.discardMethodLibraryChanges();
-				return SWT.NO;
-			case SWT.CANCEL:
-				return SWT.CANCEL;
-			}
-		}
-
-		return SWT.CANCEL;
-	}
-
-	/**
-	 * closes all editors on the active page
-	 *
-	 */
-	public static void closeAllEditors() {
-		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
-				.closeAllEditors(true);
-	}
-
-//	/**
-//	 * closes the MessageView (error view)
-//	 *
-//	 */
-//	public static void closeMessageView() {
-//		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
-//				.hideView(MessageView.getView());
-//	}
-
-	/**
-	 * handles a dangling object
-	 * @param object
-	 * @return
-	 * 			Object
-	 */
-	public static Object handleDangling(Object object) {
-		if (object instanceof MethodElement
-				&& ((EObject) object).eResource() == null) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-					AuthoringUIResources.errorDialog_title, 
-					AuthoringUIResources.bind(AuthoringUIResources.elementAlreadyDeletedError_msg, ((MethodElement) object).getName()));
-			return null;
-		} else if (object instanceof FeatureValueWrapperItemProvider) {
-			FeatureValueWrapperItemProvider adapter = (FeatureValueWrapperItemProvider) object;
-			Object value = adapter.getValue();
-			if (value instanceof MethodElement
-					&& ((EObject) value).eResource() == null) {
-				Object owner = TngUtil.unwrap(adapter.getParent(value));
-				if (owner instanceof ItemProviderAdapter) {
-					// This is a UI item provider.
-					owner = ((ItemProviderAdapter) owner).getTarget();
-				}
-				String ownerName = ((MethodElement) owner).getName();
-				EStructuralFeature feature = adapter.getFeature();
-				if (feature != null) {
-					if (AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayPrompt(
-									AuthoringUIResources.deleteDialog_title, 
-									AuthoringUIResources.bind(AuthoringUIResources.ViewHelper_alreadydeletedconfirm_text, ((MethodElement) value)
-									.getName(), ownerName))) { 
-						// Remove the association.
-						if (feature.isMany()) {
-							((Collection) ((EObject) owner).eGet(feature))
-									.remove(value);
-						}
-					}
-				} else {
-					AuthoringUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayError(
-									AuthoringUIResources.errorDialog_title, 
-									AuthoringUIResources.bind(AuthoringUIResources.elementAlreadyDeletedError_msg, ((MethodElement) value)
-									.getName()));
-				}
-				return null;
-			}
-		}
-		return object;
-	}
-
-	/* TODO: Is this still needed?
-	public static void loadAllAndSaveAll() {
-		final MethodLibrary lib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (lib == null)
-			return;
-
-		// Do the work within an operation because this is a long running
-		// activity that modifies the workbench.
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			// This is the method that gets invoked when the operation runs.
-			public void execute(IProgressMonitor monitor) {
-				monitor.beginTask(AuthoringUIResources
-						.getString("AuthoringUI.upgradingLibraryTask.name"), 3); //$NON-NLS-1$
-				try {
-					try {
-						monitor.worked(1);
-						monitor
-								.setTaskName(AuthoringUIResources
-										.getString("AuthoringUI.loadingLibraryElementsTask.name")); //$NON-NLS-1$
-						ModelStorage.loadAllProxies(lib);
-					} catch (Exception e) {
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										AuthoringUIResources
-												.getString("AuthoringUI.upgradeLibraryDialog.title"), //$NON-NLS-1$
-										AuthoringUIResources
-												.getString("AuthoringUI.upgradeLibraryError.msg"), //$NON-NLS-1$
-										AuthoringUIResources
-												.getString("AuthoringUI.upgradeLibraryError.reason"), //$NON-NLS-1$
-										e);
-						return;
-					}
-					try {
-						monitor.worked(1);
-						monitor
-								.setTaskName(AuthoringUIResources
-										.getString("AuthoringUI.savingUpgradedElementsTask.name")); //$NON-NLS-1$
-						MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) lib
-								.eResource().getResourceSet();
-						resourceSet.save(LibraryProcessor.getInstance()
-								.getSaveOptions(), true);
-					} catch (Exception e) {
-						AuthoringUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										AuthoringUIResources
-												.getString("AuthoringUI.upgradeLibraryDialog.title"), //$NON-NLS-1$
-										AuthoringUIResources
-												.getString("AuthoringUI.upgradeLibraryError.msg"), //$NON-NLS-1$
-										AuthoringUIResources
-												.getString("AuthoringUI.saveUpgradedLibraryError.reason"), //$NON-NLS-1$
-										e);
-					}
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			// Run the operation and display the progress.
-			new ProgressMonitorDialog(Display.getDefault().getActiveShell())
-					.run(true, false, operation);
-		} catch (Exception e) {
-			AuthoringUIPlugin
-					.getDefault()
-					.getMsgDialog()
-					.displayError(
-							AuthoringUIResources
-									.getString("AuthoringUI.upgradeLibraryDialog.title"), //$NON-NLS-1$
-							AuthoringUIResources
-									.getString("AuthoringUI.upgradeLibraryError.msg"), //$NON-NLS-1$
-							AuthoringUIResources
-									.getString("AuthoringUI.internalError.reason"), //$NON-NLS-1$
-							e);
-		}
-	}
-	*/
-
-	/**
-	 * Checks if the current selection is locked.
-	 */
-	public static boolean isLocked(IStructuredSelection selection) {
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			while (element instanceof ITreeItemContentProvider) {
-				element = ((ITreeItemContentProvider) element).getParent(null);
-			}
-			element = TngUtil.unwrap(element);
-			if (element instanceof EObject
-					&& TngUtil.isLocked((EObject) element)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-	
-	/**
-	 * Judge if there is a defined customized locker
-	 * @return true
-	 */
-	public static boolean hasCustomizedLocker(IStructuredSelection selection){
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			while (element instanceof ITreeItemContentProvider) {
-				element = ((ITreeItemContentProvider) element).getParent(null);
-			}			
-			element = TngUtil.unwrap(element);			
-			if (element instanceof EObject ) {	
-				AbstractLocker locker = null;
-				if(element instanceof MethodConfiguration ){
-					locker = LockerFactory.getInstance().getLocker(element);	
-				}else{
-					MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject)element);
-					if(plugin != null  ){
-						locker = LockerFactory.getInstance().getLocker(plugin);						
-					}
-				}				
-				if(locker != null ){
-					return true;
-				}				
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks if the current selection is locked.
-	 * If there is a customized locker, use it, otherwise check it with the locked flag of 
-	 * Method plugin
-	 * @param selection
-	 * @return
-	 */
-	public static boolean isLockedWithCustomizedLocker(IStructuredSelection selection) {
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {			
-			Object selectedItem = iter.next();
-			Object element = selectedItem;
-			while (element instanceof ITreeItemContentProvider) {
-				element = ((ITreeItemContentProvider) element).getParent(null);
-			}			
-			Object unwrapElement = TngUtil.unwrap(element);
-			
-			if (unwrapElement instanceof EObject ) {	
-				
-				if(element instanceof MethodConfiguration ){
-					AbstractLocker locker = LockerFactory.getInstance().getLocker(element);					
-					if(locker != null ){
-						if( locker.isLocked(element)){
-							return true;
-						}
-					}
-				}
-				
-				MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject)unwrapElement);
-				if(plugin != null ){
-					AbstractLocker locker = LockerFactory.getInstance().getLocker(plugin);					
-					if(locker != null ){
-						if( locker.isLocked(selectedItem)){
-							return true;
-						}
-					}else if( TngUtil.isLocked((EObject) unwrapElement)){
-						return true;
-					}
-				}				
-			}
-		}
-
-		return false;
-	}
-	
-	/**
-	 * Check whether the destination is locked by a customized locker.
-	 * Note: Some item could be locked by a extented locker.
-	 * @return
-	 */
-	public static boolean isExtendedLocked(Object destination) {
-		try {
-			if (destination == null) {
-				return false;
-			}
-			Object element = destination;
-			while (element instanceof ITreeItemContentProvider) {
-				element = ((ITreeItemContentProvider) element).getParent(null);
-			}
-			element = TngUtil.unwrap(element);
-			if (element instanceof EObject) {
-				MethodPlugin plugin = UmaUtil
-				.getMethodPlugin((EObject) element);
-				if (plugin != null) {
-					AbstractLocker locker = LockerFactory.getInstance()
-					.getLocker(plugin);
-					if (locker != null && locker.isLocked(destination)) {
-						return true;
-					}
-				}
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(e);
-		}
-		return false;
-	}
-
-	/**
-	 * Fixes the content description GUIDs.
-	 */
-	public static void fixContentDescriptionGUIDs() {
-		final MethodLibrary lib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (lib == null)
-			return;
-
-		org.eclipse.epf.library.edit.util.IRunnableWithProgress runnable = new org.eclipse.epf.library.edit.util.IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				HashSet modifiedResources = new HashSet();
-				for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-					InternalEObject element = (InternalEObject) iter.next();
-					if (element.eProxyURI() == null) {
-						if (element instanceof ContentDescription) {
-							ContentDescription content = (ContentDescription) element;
-							DescribableElement container = (DescribableElement) element
-									.eContainer();
-							if (container != null) {
-								String guid = UmaUtil.generateGUID(container
-										.getGuid());
-								if (!guid.equals(content.getGuid())) {
-									content.setGuid(guid);
-									modifiedResources.add(content.eResource());
-									modifiedResources
-											.add(container.eResource());
-								}
-							}
-						}
-					} else {
-						AuthoringUIPlugin
-								.getDefault()
-								.getLogger()
-								.logError(
-										"Unresolved proxy in '" + element.eResource().getURI().toFileString() + "': " + element); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-
-				monitor.subTask(AuthoringUIResources.savingFilesTask_name);
-				ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-				try {
-					for (Iterator iter = modifiedResources.iterator(); iter
-							.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						monitor.subTask(AuthoringUIResources.bind(AuthoringUIResources.savingTask_name, resource.getURI().toFileString()));
-						persister.save(resource);
-					}
-					persister.commit();
-				} catch (Exception e) {
-					persister.rollback();
-					throw new WrappedException(e);
-				}
-			}
-
-		};
-		UserInteractionHelper
-				.runWithProgress(
-						runnable,
-						AuthoringUIResources.fixingContentDescriptionGUIDsTask_name); 
-	}
-
-	private static String checkProxy(InternalEObject element, EReference ref,
-			Object value) {
-		if (value instanceof InternalEObject) {
-			InternalEObject eObj = (InternalEObject) value;
-			if (eObj.eIsProxy()) {
-				EObject resolved = element.eResolveProxy(eObj);
-				String errMsg = null;
-				if (resolved == eObj) {
-					errMsg = "Unresolved proxy"; //$NON-NLS-1$
-				} else if (!ref.getEType().isInstance(resolved)) {
-					errMsg = "Invalid data"; //$NON-NLS-1$
-				}
-				if (errMsg != null) {
-					String path;
-					if (element instanceof NamedElement) {
-						path = ref.getEType().getName()
-								+ "(" + Misc.getPathRelativeToLibrary((NamedElement) element) + ")." + ref.getName() + " = "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					} else {
-						path = ""; //$NON-NLS-1$
-					}
-					return errMsg
-							+ " in '" + element.eResource().getURI().toFileString() + "': " + path + resolved; //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Library health check
-	 *
-	 */
-	public static void checkLibraryHealth() {
-		final MethodLibrary lib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (lib == null)
-			return;
-
-		org.eclipse.epf.library.edit.util.IRunnableWithProgress runnable = new org.eclipse.epf.library.edit.util.IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				AuthoringUIPlugin.getDefault().getLogger().logInfo(
-						"++++ LIBRARY HEALTH CHECK REPORT - START +++"); //$NON-NLS-1$
-				StringWriter strWriter = new StringWriter();
-				PrintWriter printWriter = new PrintWriter(strWriter);
-				printWriter.println();
-				printWriter
-						.println("UNRESOLVED/INVALID PROXIES IN X-REFERENCES"); //$NON-NLS-1$
-				printWriter
-						.println("------------------------------------------"); //$NON-NLS-1$
-				for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-					InternalEObject element = (InternalEObject) iter.next();
-					if (element.eProxyURI() == null) {
-						if (element instanceof ContentDescription) {
-							ContentDescription content = (ContentDescription) element;
-							DescribableElement container = (DescribableElement) element
-									.eContainer();
-							if (container != null) {
-								String guid = UmaUtil.generateGUID(container
-										.getGuid());
-								if (!guid.equals(content.getGuid())) {
-									AuthoringUIPlugin
-											.getDefault()
-											.getLogger()
-											.logError(
-													"ContentDescription with invalid GUID: " + content.getGuid() + " in '" + content.eResource().getURI().toFileString() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-								}
-							} else {
-								AuthoringUIPlugin
-										.getDefault()
-										.getLogger()
-										.logError(
-												"ContentDescription without a container: " + content); //$NON-NLS-1$
-							}
-
-							if (content instanceof BreakdownElementDescription) {
-								// check if the content.xmi of the process is in
-								// the right place
-								ProcessComponent procComp = UmaUtil
-										.getProcessComponent(content);
-								if (procComp != null) {
-									String modelPath = procComp.eResource()
-											.getURI().toFileString();
-									File dir = new File(modelPath)
-											.getParentFile();
-									String contentPath = content.eResource()
-											.getURI().toFileString();
-
-									// System.out.println("model path: " +
-									// modelPath);
-									// System.out.println("content path: " +
-									// contentPath);
-									// System.out.println();
-
-									File contentDir = new File(contentPath)
-											.getParentFile();
-									if (!dir.equals(contentDir)) {
-										AuthoringUIPlugin
-												.getDefault()
-												.getLogger()
-												.logError(
-														"Content file of " + container.eClass().getName() + " '" + container.getName() + "' in '" + modelPath + " is misplaced: " + contentPath); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-									}
-								}
-							}
-						}
-
-						// check for unresolved proxies in cross references
-						ArrayList xReferences = new ArrayList(element.eClass()
-								.getEAllReferences());
-						xReferences.removeAll(element.eClass()
-								.getEAllContainments());
-						for (Iterator iterator = xReferences.iterator(); iterator
-								.hasNext();) {
-							EReference ref = (EReference) iterator.next();
-							Object value = element.eGet(ref, false);
-							if (ref.isMany()) {
-								if (value instanceof InternalEList) {
-									InternalEList list = (InternalEList) value;
-									for (Iterator iter1 = list.basicIterator(); iter1
-											.hasNext();) {
-										String msg = checkProxy(element, ref,
-												iter1.next());
-										if (msg != null) {
-											printWriter.println(msg);
-										}
-									}
-								}
-							} else {
-								String msg = checkProxy(element, ref, value);
-								if (msg != null) {
-									printWriter.println(msg);
-								}
-							}
-						}
-					} else {
-						AuthoringUIPlugin
-								.getDefault()
-								.getLogger()
-								.logError(
-										"Unresolved proxy in '" + element.eResource().getURI().toFileString() + "': " + element); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-
-				}
-				AuthoringUIPlugin.getDefault().getLogger().logError(
-						strWriter.toString());
-				AuthoringUIPlugin.getDefault().getLogger().logInfo(
-						"++++ LIBRARY HEALTH CHECK REPORT - END +++"); //$NON-NLS-1$
-			}
-
-		};
-		if (UserInteractionHelper
-				.runWithProgress(runnable, AuthoringUIResources.viewHelper_performHealthCheck)) { 
-			String title = AuthoringUIResources.viewHelperHealthCheckDialog_title; 
-			String message = AuthoringUIResources.viewHelperHealthCheckDialog_message; 
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayInfo(title,
-					message);
-		}
-	}
-
-	/**
-	 * removes invalid reference in the open library
-	 *
-	 */
-	public static void removeInvalidReferences() {
-		final MethodLibrary lib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (lib == null)
-			return;
-
-		org.eclipse.epf.library.edit.util.IRunnableWithProgress runnable = new org.eclipse.epf.library.edit.util.IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				HashSet modifiedResources = new HashSet();
-				for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-					InternalEObject element = (InternalEObject) iter.next();
-					if (element.eProxyURI() == null) {
-						ArrayList xReferences = new ArrayList(element.eClass()
-								.getEAllReferences());
-						xReferences.removeAll(element.eClass()
-								.getEAllContainments());
-						for (Iterator iterator = xReferences.iterator(); iterator
-								.hasNext();) {
-							EReference ref = (EReference) iterator.next();
-							Object value = element.eGet(ref, false);
-							if (ref.isMany()) {
-								if (value instanceof InternalEList) {
-									InternalEList list = (InternalEList) value;
-									ArrayList invalidProxies = new ArrayList();
-									for (Iterator iter1 = list.basicIterator(); iter1
-											.hasNext();) {
-										Object v = iter1.next();
-										if (isInvalidReference(element, ref, v)) {
-											invalidProxies.add(v);
-										}
-									}
-									if (!invalidProxies.isEmpty()) {
-										removeInvalidReferences(element, list,
-												invalidProxies);
-										modifiedResources.add(element
-												.eResource());
-									}
-								}
-							} else {
-								if (isInvalidReference(element, ref, value)) {
-									element.eSet(ref, null);
-									modifiedResources.add(element.eResource());
-								}
-							}
-						}
-					} else {
-						AuthoringUIPlugin
-								.getDefault()
-								.getLogger()
-								.logError(
-										"Unresolved proxy in '" + element.eResource().getURI().toFileString() + "': " + element); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-
-				monitor.subTask(AuthoringUIResources.savingFilesTask_name); 
-				ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-				try {
-					for (Iterator iter = modifiedResources.iterator(); iter
-							.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						monitor.subTask(AuthoringUIResources.bind(AuthoringUIResources.savingTask_name, resource.getURI().toFileString()));
-						persister.save(resource);
-					}
-					persister.commit();
-				} catch (Exception e) {
-					persister.rollback();
-					throw new WrappedException(e);
-				}
-			}
-
-			private boolean isInvalidReference(InternalEObject element,
-					EReference ref, Object value) {
-				if (value instanceof InternalEObject) {
-					InternalEObject eObj = (InternalEObject) value;
-					if (eObj.eIsProxy()) {
-						EObject resolved = element.eResolveProxy(eObj);
-						if (!ref.getEType().isInstance(resolved)) {
-							return true;
-						}
-					}
-				}
-				return false;
-			}
-
-			private void removeInvalidReferences(InternalEObject element,
-					InternalEList values, Collection invalidProxies) {
-				ArrayList list = new ArrayList(values.basicList());
-				list.removeAll(invalidProxies);
-				values.clear();
-				int max = list.size() - 1;
-				for (int i = max; i > -1; i--) {
-					list.set(i, element.eResolveProxy((InternalEObject) list
-							.get(i)));
-				}
-				values.addAll(list);
-			}
-
-		};
-		UserInteractionHelper.runWithProgress(runnable, AuthoringUIResources.deletingInvalidReferencesTask_name); 
-
-	}
-
-	/**
-	 * reloads the current library.  Used on a rollback error
-	 * @param shell
-	 */
-	public static void reloadCurrentLibaryOnRollbackError(Shell shell) {
-		reloadCurrentLibrary(shell, AuthoringUIResources.ViewHelper_reloadLibOnRollbackError);
-	}
-
-	/**
-	 * displays the message and reloads the current library 
-	 * @param shell
-	 * @param message
-	 */
-	public static void reloadCurrentLibrary(final Shell shell, final String message) {
-		Display display = MsgBox.getDisplay();
-		Runnable runnable = new Runnable() {
-
-			public void run() {
-				doReloadCurrentLibrary(shell, message); 
-			}
-			
-		};
-		if(display != null) {
-			display.asyncExec(runnable);
-		}
-		else {
-			runnable.run();
-		}		
-
-	}
-	
-	private static void doReloadCurrentLibrary(Shell shell, String message) {
-		if (shell == null) {
-			MsgBox.getDefaultShell();
-		}
-		String title = AuthoringUIResources.reloadDialog_title; 
-		if (message == null) {
-			message = AuthoringUIResources.reloadDialog_message; 
-		}
-		AuthoringUIPlugin.getDefault().getMsgDialog().displayInfo(title,
-				message);
-
-		// The library needs to be reloaded.
-		String libDir = LibraryService.getInstance()
-				.getCurrentMethodLibraryLocation();
-		LibraryUIManager.getInstance().openLibrary(libDir);
-	}
-
-	/**
-	 * opens the given viewId
-	 * @param viewId
-	 * @return
-	 * 			View
-	 */
-	public static IViewPart openView(String viewId) {
-		return findView(viewId, true);
-	}
-	
-	
-	/**
-	 * opens the given viewId
-	 * @param viewId
-	 * @return
-	 * 			View
-	 */
-	public static IViewPart findView(String viewId, boolean show) {
-		try {
-			IWorkbenchPage activePage = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage();
-			if (activePage != null) {
-				IViewPart view = activePage.findView(viewId);
-				if (view == null) {
-					
-					// always create the view
-					view = activePage.showView(viewId);					
-				}
-				
-				if ( !show ) {
-					activePage.hideView(view);
-				}
-				
-				return view;
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-					AuthoringUIResources.errorDialog_title, 
-					AuthoringUIResources.internalError_msg, 
-					e);
-		}
-		return null;
-
-	}
-	
-	public static boolean isViewInCurrentPerspective(String viewId) {		
-		String perspectiveId = PerspectiveUtil.getActivePerspectiveId();
-		return isViewInPerspective(viewId, perspectiveId);
-	}
-	
-	/**
-	 * Deciede whether the view definded in the perspective or not
-	 * 
-	 * @author david zhongwei
-	 * @param viewId
-	 * @param perpectiveId
-	 * @return
-	 */
-	public static boolean isViewInPerspective(String viewId, String perspectiveId) {
-		if (viewId == null || perspectiveId == null) {
-			return false;
-		}
-
-		final String NAMESPACE = "org.eclipse.ui";//$NON-NLS-1$
-		final String EXTENSIONPOINT_ID = "perspectiveExtensions";//$NON-NLS-1$
-		final String TARGET_ID = "targetID";//$NON-NLS-1$
-		final String VIEW = "view";//$NON-NLS-1$
-		final String ID = "id";//$NON-NLS-1$
-		final String VIEWSHORTCUT = "viewShortcut";//$NON-NLS-1$
-
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = null;
-		if (extensionRegistry != null) {
-			extensionPoint = extensionRegistry.getExtensionPoint(NAMESPACE, EXTENSIONPOINT_ID);
-		}
-
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				IConfigurationElement[] configElements = extension.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String id = configElement.getAttribute(TARGET_ID);
-						if (perspectiveId.equals(id)) {
-
-							// decide whether is defined in "view"
-							IConfigurationElement[] configElementsForView = configElement.getChildren(VIEW);
-							for (int k = 0; k < configElementsForView.length; k++) {
-								IConfigurationElement configurationElement = configElementsForView[k];
-								if (viewId.equals(configurationElement.getAttribute(ID))) {
-									return true;
-								}
-							}
-
-							// decide whether is defined in "viewShortcut"
-							IConfigurationElement[] configElementsForViewShortcut = configElement
-							        .getChildren(VIEWSHORTCUT);
-							for (int l = 0; l < configElementsForViewShortcut.length; l++) {
-								IConfigurationElement configurationElement = configElementsForViewShortcut[l];
-								if (viewId.equals(configurationElement.getAttribute(ID))) {
-									return true;
-								}
-							}
-
-						}
-					}
-					catch (Exception e) {
-						AuthoringUIPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-		return false;
-	}
-	
-	public static void refreshView(AbstractBaseView configView) {
-		Control ctrl = configView.getViewer().getControl();
-		if (ctrl != null && !ctrl.isDisposed()) {
-			Object input =  configView.getViewer().getInput();
-			if (input instanceof EObject) {
-				EObject eObject = (EObject) input;
-				if (eObject.eIsProxy()) {
-					configView.setInputForViewer(RefreshJob.getInstance()
-							.resolve(eObject));
-				} else {
-					ISelection selection = configView.getViewer()
-							.getSelection();
-					configView.getViewer().refresh();
-					restoreSelection(configView.getViewer(), selection);
-				}
-			}
-		}
-
-	}
-
-	public static void restoreSelection(Viewer viewer, ISelection selection) {
-		if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			boolean restore = false;
-			ArrayList resolvedList = new ArrayList();
-			for (Iterator iter = structuredSelection.iterator(); iter.hasNext();) {
-				Object object = iter.next();
-				if (object instanceof EObject) {
-					EObject eObj = (EObject) object;
-					if (eObj.eIsProxy()) {
-						eObj = RefreshJob.getInstance().resolve(eObj);
-						restore = true;
-					}
-					if (!eObj.eIsProxy()) {
-						resolvedList.add(eObj);
-					}
-				}
-			}
-			if (restore) {
-				viewer
-						.setSelection(new StructuredSelection(resolvedList),
-								true);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/package.html
deleted file mode 100644
index 9339bc9..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides views for the Authoring and Browsing perspectives.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/ConfigurationTableLabelProvider.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/ConfigurationTableLabelProvider.java
deleted file mode 100644
index f1a8dd3..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/ConfigurationTableLabelProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-
-/**
- * The label provider for the Configuration table in the Open Configuration
- * wizard.
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-public class ConfigurationTableLabelProvider extends LabelProvider implements
-		ITableLabelProvider {
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Image getColumnImage(Object element, int index) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object element, int index) {
-		MethodConfiguration config = (MethodConfiguration) element;
-		return config.getName();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationMainPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationMainPage.java
deleted file mode 100644
index 0f37bde..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationMainPage.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to enter a name and description for a new
- * method configuration.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class NewConfigurationMainPage extends BaseWizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = NewConfigurationMainPage.class
-			.getName();
-
-	protected Composite composite;
-
-	protected Text nameText;
-
-	protected Text briefDescText;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewConfigurationMainPage(String pageName) {
-		super(pageName);
-		setTitle(AuthoringUIResources.AuthoringUIPlugin_NewConfigurationMainPage_pageTitle);
-		setDescription(AuthoringUIResources.AuthoringUIPlugin_NewConfigurationMainPage_pageDescription);
-		setImageDescriptor(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/New.gif")); //$NON-NLS-1$		
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewConfigurationMainPage() {
-		this(PAGE_NAME);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		composite = createGridLayoutComposite(parent, 3);
-
-		createVerticallyAlignedLabel(composite, AuthoringUIText.NAME_TEXT);
-
-		nameText = createEditableText(composite, 2);
-
-		createVerticallyAlignedLabel(composite,
-				AuthoringUIText.DESCRIPTION_TEXT);
-
-		briefDescText = createEditableText(composite, 400, 80, 2);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-		String name = "new_config"; //$NON-NLS-1$
-		if(lib != null) {
-			name = TngUtil.getNextAvailableName(lib.getPredefinedConfigurations(), name);
-		}
-		nameText.setText(name); 
-	}
-
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {
-		nameText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (nameText != null) {
-			nameText.setFocus();
-			nameText.selectAll();
-		}
-		setPageComplete(isPageComplete());
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		String configName = getConfigurationName();
-
-		if (!validateConfigurationName(configName)) {
-			return false;
-		}
-
-		if (configurationExists(configName)) {
-			setErrorMessage(LibraryEditResources.duplicateElementNameError_simple_msg);
-			return false;
-		} else {
-			setErrorMessage(null);
-		}
-
-		return getErrorMessage() == null;
-	}
-
-	/**
-	 * Checks whether a method configuration with the same name already exists
-	 * in the current method library.
-	 * 
-	 * @param configName
-	 *            the name for a method configuration
-	 * @return <code>true</code> if a method configuration with the same name
-	 *         already exists
-	 */
-	protected boolean configurationExists(String configName) {
-		String[] configNames = LibraryServiceUtil
-				.getMethodConfigurationNames(LibraryService.getInstance()
-						.getCurrentMethodLibrary());
-		for (int i = 0; i < configNames.length; i++) {
-			if (configName.equalsIgnoreCase(configNames[i])) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Validates a method configuration name.
-	 * 
-	 * @param name
-	 *            the name of a method configuration
-	 * 
-	 * @return <code>true</code> if the configuration name is valid
-	 */
-	protected boolean validateConfigurationName(String name) {
-		// TODO: Call the configuration name validator when it is ready.
-		String errmsg = TngUtil.checkElementName(name,
-				LibraryUIText.TEXT_METHOD_CONFIGURATON);
-		if (errmsg != null) {
-			errmsg = errmsg.replaceAll("\n\n", " "); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		setErrorMessage(errmsg);
-		return errmsg == null;
-	}
-
-	/**
-	 * Gets the user specified the method configuration name.
-	 * 
-	 * @return the name for the new method configuration
-	 */
-	public String getConfigurationName() {
-		return nameText.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified method configuration brief description.
-	 * 
-	 * @return the brief description for the new method configuration
-	 */
-	public String getBriefDescription() {
-		return briefDescText.getText().trim();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationWizard.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationWizard.java
deleted file mode 100644
index 7439fbd..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationWizard.java
+++ /dev/null
@@ -1,280 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.ui.wizards.BaseWizard;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that guides the user to create a new Method Configuration.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class NewConfigurationWizard extends BaseWizard implements INewWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = NewConfigurationWizard.class
-			.getName();
-
-	/**
-	 * The New Method Configuration wizard extension point ID.
-	 */
-	public static final String WIZARD_EXTENSION_POINT_ID = "org.eclipse.epf.authoring.ui.newConfigurationWizard"; //$NON-NLS-1$	
-
-	// The main wizard page.
-	protected NewConfigurationMainPage mainPage;
-
-	// The new method configuration.
-	protected MethodConfiguration config;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewConfigurationWizard() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#getWizardExtenderExtensionPointId()
-	 */
-	public String getWizardExtenderExtensionPointId() {
-		return WIZARD_EXTENSION_POINT_ID;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		super.init(workbench, selection);
-		setWindowTitle(AuthoringUIResources.newConfigurationWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		if (wizardExtender == null) {
-			mainPage = createMainPage();
-			super.addPage(mainPage);
-		} else {
-			List<IWizardPage> wizardPages = new ArrayList<IWizardPage>();
-
-			IWizardPage page = wizardExtender
-					.getReplaceWizardPage(NewConfigurationMainPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				mainPage = createMainPage();
-				wizardPages.add(mainPage);
-			}
-
-			super.getNewWizardPages(wizardPages);
-
-			for (Iterator it = wizardPages.iterator(); it.hasNext();) {
-				IWizardPage wizardPage = (IWizardPage) it.next();
-				super.addPage(wizardPage);
-			}
-
-			wizardExtender.initWizardPages(wizardPages);
-		}
-	}
-
-	/**
-	 * Creates the main wizard page.
-	 * 
-	 * @return the main wizard page
-	 */
-	protected NewConfigurationMainPage createMainPage() {
-		return new NewConfigurationMainPage();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				AuthoringUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MethodConfiguration.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Sets the method configuration. This method is called when a method
-	 * configuration is created in the Library view via the context menu. Upon
-	 * completing this wizard, the newly created method configuration will be
-	 * initialized with the name and brief description entered by the user in
-	 * tis wizard.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 */
-	public void setMethodConfiguration(MethodConfiguration config) {
-		this.config = config;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#doFinish()
-	 */
-	public boolean doFinish() {
-		boolean ret = createMethodConfiguration(mainPage.getConfigurationName(),
-				mainPage.getBriefDescription(), mainPage);
-		if(ret) {
-			MethodLibrary library = LibraryService.getInstance()
-					.getCurrentMethodLibrary();
-			ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
-					.getCurrentPersister().getFailSafePersister();
-			try {
-				persister.save(library.eResource());
-				persister.commit();
-			} catch (Exception e) {
-				try {
-					persister.rollback();
-				}
-				catch(Exception ex) {
-					AuthoringUIPlugin.getDefault().getLogger().logError(ex);
-				}
-				AuthoringUIPlugin.getDefault().getLogger().logError(e);
-				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-						AuthoringUIResources.newConfigurationWizard_title,
-						AuthoringUIResources.internalError_msg, e);
-			}
-		}
-		return ret;
-	}
-
-	/**
-	 * Creates a new method configuration.
-	 * 
-	 * @param name
-	 *            the name for the new configuration
-	 * @param briefDesc
-	 *            the brief description for the new configuration
-	 * @param wizardPage
-	 *            the wizard page used for displaying error messages
-	 * @return <code>true</code> if the method configuration is created
-	 *         successfully
-	 */
-	public boolean createMethodConfiguration(String name, String briefDesc,
-			WizardPage wizardPage) {
-		if (name == null || name.length() == 0) {
-			throw new IllegalArgumentException();
-		}
-
-		try {
-			MethodLibrary library = LibraryService.getInstance()
-					.getCurrentMethodLibrary();
-
-			MethodConfiguration c = config == null ? UmaFactory.eINSTANCE.createMethodConfiguration() : config;
-			c.setName(name);
-			
-			if (! nameCheck(name, wizardPage, library, c)) {
-				return false;
-			}
-			
-			if (config == null) {
-				config = LibraryService.getInstance()
-						.createMethodConfiguration(name, library);
-			}
-
-			if (briefDesc != null) {
-				config.setBriefDescription(briefDesc);
-			}
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-					AuthoringUIResources.newConfigurationWizard_title,
-					AuthoringUIResources.internalError_msg, e);
-		}
-
-		return true;
-	}
-
-	private boolean nameCheck(String name, WizardPage wizardPage, 
-			MethodLibrary library, MethodConfiguration methodConfig) {
-		// Fix for bugzilla 178462.
-		String errmsg = null;
-		if (name.indexOf("&") > -1) { //$NON-NLS-1$
-			errmsg = NLS
-					.bind(
-							LibraryEditResources.invalidElementNameError4_msg,
-							name);
-		} else {
-			IValidator validator = IValidatorFactory.INSTANCE
-					.createNameValidator(library, methodConfig);
-			errmsg = validator.isValid(name);
-		}
-
-		if (errmsg != null) {
-			wizardPage.setErrorMessage(errmsg);
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Gets the newly created method confguration.
-	 * 
-	 * @return a new method configuration
-	 */
-	public MethodConfiguration getMethodConfiguration() {
-		return config;
-	}
-
-	private boolean superPerformFinish() {
-		return super.performFinish();
-	}
-
-	@Override
-	public boolean performFinish() {
-		final boolean[] resultHolder = new boolean[1];
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.run(new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				resultHolder[0] = superPerformFinish();
-			}
-			
-		});
-		return resultHolder[0];
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryMainPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryMainPage.java
deleted file mode 100644
index 6f6ac9e..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryMainPage.java
+++ /dev/null
@@ -1,205 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.library.LibraryManagerFactory;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to enter the name and brief description
- * for a new method library.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class NewLibraryMainPage extends BaseWizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = NewLibraryMainPage.class.getName();
-
-	private Shell shell;
-
-	private Combo libraryPathCombo;
-
-	private Button browseButton;
-
-	private Text briefDescText;
-
-	private String libraryType;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewLibraryMainPage() {
-		super(PAGE_NAME);
-		setTitle(AuthoringUIResources.newLibraryWizardMainPage_title);
-		setDescription(AuthoringUIResources.newLibraryWizardMainPage_description);
-		setImageDescriptor(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/New.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		shell = parent.getShell();
-
-		Composite composite = createGridLayoutComposite(parent, 3);
-
-		createLabel(composite, AuthoringUIResources.libraryPathLabel_text);
-
-		libraryPathCombo = createCombobox(composite);
-
-		browseButton = createButton(composite,
-				AuthoringUIText.BROWSE_BUTTON_TEXT);
-
-		createVerticallyAlignedLabel(composite,
-				AuthoringUIText.DESCRIPTION_TEXT);
-
-		briefDescText = createEditableText(composite, 400, 80, 1);
-
-		Map types = LibraryManagerFactory.getInstance().getLibraryTypes();
-		for (Iterator it = types.keySet().iterator(); it.hasNext();) {
-			libraryType = (String) it.next();
-			break;
-		}
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String defaultLibraryPath = LibraryUIPreferences
-				.getDefaultLibraryPath();
-		File defaultLibraryDir = new File(defaultLibraryPath);
-		String newLibraryPath = null;
-		for (int i = 1;; i++) {
-			File newLibraryDir = new File(defaultLibraryDir, "Library" + i); //$NON-NLS-1$
-			if (!newLibraryDir.exists()) {
-				newLibraryPath = newLibraryDir.getAbsolutePath();
-				break;
-			}
-		}
-
-		List<String> newLibraryPathsList = LibraryUIPreferences
-				.getNewLibraryPathsList();
-		if (newLibraryPath != null && newLibraryPath.length() > 0) {
-			newLibraryPathsList.add(0, newLibraryPath);
-		}
-		if (newLibraryPathsList.size() > 0) {
-			String[] newLibraryPaths = new String[newLibraryPathsList.size()];
-			newLibraryPathsList.toArray(newLibraryPaths);
-			libraryPathCombo.setItems(newLibraryPaths);
-			libraryPathCombo.setText(newLibraryPaths[0]);
-		}
-	}
-
-	/**
-	 * Adds event listeners to the wizard page controls.
-	 */
-	protected void addListeners() {
-		libraryPathCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-
-		libraryPathCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				DirectoryDialog dialog = new DirectoryDialog(shell, SWT.NONE);
-				dialog.setFilterPath(getLibraryPath());
-				String selectedDir = dialog.open();
-				if (selectedDir != null) {
-					libraryPathCombo.add(selectedDir, 0);
-					libraryPathCombo.setText(selectedDir);
-				}
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		return getLibraryName().length() > 0;
-	}
-
-	/**
-	 * Gets the library name.
-	 */
-	public String getLibraryName() {
-		String libPath = getLibraryPath();
-		String libName = new File(libPath).getName();
-		if (!libPath.equals(libName)) {
-			return libName;
-		} else {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the user specified library path.
-	 */
-	public String getLibraryPath() {
-		return libraryPathCombo.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified method library description.
-	 */
-	public String getLibraryDescription() {
-		return briefDescText.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified method library type.
-	 */
-	public String getLibraryType() {
-		return libraryType;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryWizard.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryWizard.java
deleted file mode 100644
index 410fc69..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryWizard.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.authoring.ui.AuthoringPerspective;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.xmi.XMILibraryManager;
-import org.eclipse.epf.library.xmi.XMILibraryUtil;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that guides the user to create a new method library.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class NewLibraryWizard extends Wizard implements INewWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = NewLibraryWizard.class.getName();
-
-	// The main wizard page.
-	private NewLibraryMainPage mainPage;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewLibraryWizard() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		setWindowTitle(AuthoringUIResources.newLibraryWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		SaveAllEditorsPage.addPageIfNeeded(this, true, null, null, null);
-		mainPage = new NewLibraryMainPage();
-		addPage(mainPage);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				AuthoringUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MethodLibrary.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		try {
-			String name = mainPage.getLibraryName();
-			String desc = mainPage.getLibraryDescription();
-			String type = mainPage.getLibraryType();
-			Map<String, Object> options = new HashMap<String, Object>();
-			File libraryPath = new File(mainPage.getLibraryPath());
-			options.put(XMILibraryManager.ARG_LIBRARY_PATH, libraryPath
-					.getAbsolutePath());
-
-			if (XMILibraryUtil.containsPluginOrConfigSpecExportFile(libraryPath
-					.getAbsolutePath())) {
-				throw new Exception(LibraryUIResources.openLibraryError_reason4);
-			}
-
-			MethodLibrary library = LibraryService.getInstance()
-					.createMethodLibrary(name, type, options);
-			if (library != null) {
-				if (desc.length() > 0) {
-					library.setBriefDescription(desc);
-				}
-				LibraryUIPreferences.addNewLibraryPath(libraryPath
-						.getAbsolutePath());
-				PerspectiveUtil
-						.openPerspective(AuthoringPerspective.PERSPECTIVE_ID);
-				return true;
-			}
-		} catch (Exception e) {
-			String reason = e.getMessage();
-			if (reason == null) {
-				reason = AuthoringUIResources.newLibraryInternlError_reason;
-			}
-			reason += "\n\n" + AuthoringUIResources.newLibraryError_advice; //$NON-NLS-1$
-			if (e.getMessage() != null) {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						AuthoringUIResources.newLibraryWizard_title,
-						AuthoringUIResources.newLibraryError_msg, reason);
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						AuthoringUIResources.newLibraryWizard_title,
-						AuthoringUIResources.newLibraryError_msg, reason, e);
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewPluginMainPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewPluginMainPage.java
deleted file mode 100644
index 45e0474..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewPluginMainPage.java
+++ /dev/null
@@ -1,255 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ModelStorage;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to specify the name, brief description,
- * authors and referenced mathod plug-ins for a new method plug-in.
- * 
- * @author Kelvin Low
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class NewPluginMainPage extends BaseWizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = NewPluginMainPage.class.getName();
-
-	protected Text nameText;
-
-	protected Text briefDescText;
-
-	protected Text authorsText;
-
-	protected CheckboxTableViewer referencedPluginsViewer;
-
-	protected List<MethodPlugin> plugins;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewPluginMainPage(String pageName) {
-		super(pageName);
-		setTitle(AuthoringUIResources.newPluginWizardPage_title);
-		setDescription(AuthoringUIResources.newPluginWizardPage_text);
-		setImageDescriptor(AuthoringUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/New.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewPluginMainPage() {
-		this(PAGE_NAME);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = createGridLayoutComposite(parent, 2);
-
-		createVerticallyAlignedLabel(composite, AuthoringUIText.NAME_TEXT);
-
-		nameText = createEditableText(composite);
-
-		createVerticallyAlignedLabel(composite,
-				AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-
-		briefDescText = createEditableText(composite, 400, 80, 1);
-
-		createVerticallyAlignedLabel(composite, AuthoringUIText.AUTHORS_TEXT);
-
-		authorsText = createEditableText(composite, 400, 40, 1);
-
-		createVerticallyAlignedLabel(composite,
-				AuthoringUIText.REFERENCED_PLUGINS_SECTION_NAME);
-
-		referencedPluginsViewer = CheckboxTableViewer.newCheckList(composite,
-				SWT.BORDER | SWT.FILL | SWT.HORIZONTAL);
-		GridData referencedPluginsGridData = new GridData(
-				GridData.FILL_HORIZONTAL);
-		referencedPluginsGridData.heightHint = 150;
-		referencedPluginsViewer.getTable().setLayoutData(
-				referencedPluginsGridData);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String name = "new_plug-in"; //$NON-NLS-1$
-		if (LibraryService.getInstance().getCurrentMethodLibrary() != null) {
-			name = TngUtil.getNextAvailableName(LibraryService.getInstance()
-					.getCurrentMethodLibrary().getMethodPlugins(), name);
-		}
-		nameText.setText(name);
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public Image getImage(Object element) {
-				return LibraryUIImages.IMG_METHOD_PLUGIN;
-			}
-
-			public String getText(Object element) {
-				if (element instanceof MethodPlugin) {
-					return ((MethodPlugin) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		};
-
-		referencedPluginsViewer.setLabelProvider(labelProvider);
-		referencedPluginsViewer.setSorter(new ViewerSorter());
-
-		plugins = ModelStorage.getBaseModels();
-		String[] items = new String[plugins.size()];
-		for (int i = 0; i < plugins.size(); i++) {
-			MethodPlugin plugin = (MethodPlugin) plugins.get(i);
-			items[i] = plugin.getName();
-		}
-
-		if (plugins != null) {
-			Iterator<MethodPlugin> it = plugins.iterator();
-			while (it.hasNext()) {
-				referencedPluginsViewer.add(it.next());
-			}
-		}
-	}
-
-	/**
-	 * Adds event listeners to the wizard page controls.
-	 */
-	protected void addListeners() {
-		nameText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (nameText != null) {
-			nameText.setFocus();
-			nameText.selectAll();
-		}
-		setPageComplete(isPageComplete());
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		return validatePluginName(getPluginName());
-	}
-
-	/**
-	 * Validates a method plug-in name.
-	 * 
-	 * @param name
-	 *            the name of a method plug-in
-	 * 
-	 * @return <code>true</code> if the plug-in name is valid
-	 */
-	protected boolean validatePluginName(String name) {
-		String errmsg = LibraryUtil.checkPluginName(null, getPluginName());
-		if (errmsg != null) {
-			// Remove newline characters from the message to fit it in the error
-			// message area of the wizard page.
-			errmsg = errmsg.replaceAll("\n\n", " "); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		setErrorMessage(errmsg);
-		return errmsg == null;
-	}
-
-	/**
-	 * Gets the user specified method plug-in name.
-	 * 
-	 * @return the name for the new method plug-in
-	 */
-	public String getPluginName() {
-		return nameText.getText() != null ? nameText.getText().trim() : null;
-	}
-
-	/**
-	 * Gets the user specified method plug-in brief description.
-	 * 
-	 * @return the brief description for the new method plug-in
-	 */
-	public String getBriefDescription() {
-		return briefDescText.getText();
-	}
-
-	/**
-	 * Gets the user specified method plug-in authors.
-	 * 
-	 * @return the authors for the new method plug-in
-	 */
-	public String getAuthors() {
-		return authorsText.getText();
-	}
-
-	/**
-	 * Gets the user specified referenced method plug-ins for the new method
-	 * plug-in.
-	 * 
-	 * @return a collection of referenced method plug-ins for the new method
-	 *         plug-in
-	 */
-	public Object[] getReferencedPlugins() {
-		return referencedPluginsViewer.getCheckedElements();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewPluginWizard.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewPluginWizard.java
deleted file mode 100644
index 9635cf8..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewPluginWizard.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.ui.wizards.BaseWizard;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that guides the user to create a new method Plug-in.
- * 
- * @author Kelvin Low
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class NewPluginWizard extends BaseWizard implements INewWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = NewPluginWizard.class.getName();
-
-	/**
-	 * The New Method Plug-in wizard extension point ID.
-	 */
-	public static final String WIZARD_EXTENSION_POINT_ID = "org.eclipse.epf.authoring.ui.newPluginWizard"; //$NON-NLS-1$	
-
-	// The main wizard page.
-	protected NewPluginMainPage mainPage;
-
-	// The new method plug-in.
-	protected MethodPlugin newPlugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewPluginWizard() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#getWizardExtenderExtensionPointId()
-	 */
-	public String getWizardExtenderExtensionPointId() {
-		return WIZARD_EXTENSION_POINT_ID;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		super.init(workbench, selection);
-		setWindowTitle(AuthoringUIResources.newPluginWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		if (wizardExtender == null) {
-			mainPage = createMainPage();
-			super.addPage(mainPage);
-		} else {
-			List<IWizardPage> wizardPages = new ArrayList<IWizardPage>();
-
-			IWizardPage page = wizardExtender
-					.getReplaceWizardPage(NewPluginMainPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				mainPage = createMainPage();
-				wizardPages.add(mainPage);
-			}
-
-			super.getNewWizardPages(wizardPages);
-
-			for (Iterator it = wizardPages.iterator(); it.hasNext();) {
-				IWizardPage wizardPage = (IWizardPage) it.next();
-				super.addPage(wizardPage);
-			}
-
-			wizardExtender.initWizardPages(wizardPages);
-		}
-	}
-
-	/**
-	 * Creates the main wizard page.
-	 * 
-	 * @return the main wizard page
-	 */
-	protected NewPluginMainPage createMainPage() {
-		return new NewPluginMainPage();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				AuthoringUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MethodPlugin.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#doFinish()
-	 */
-	public boolean doFinish() {
-		try {
-			newPlugin = LibraryServiceUtil.createMethodPlugin(mainPage
-					.getPluginName(), mainPage.getBriefDescription(), mainPage
-					.getAuthors(), mainPage.getReferencedPlugins());
-
-			initMethodPlugin(newPlugin);
-
-			return true;
-		} catch (Exception e) {
-			String reason = e.getMessage() != null ? e.getMessage()
-					: AuthoringUIResources.newPluginError_reason;
-			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
-					AuthoringUIResources.newPluginWizard_title,
-					AuthoringUIResources.newPluginError_msg, reason, e);
-		}
-
-		return false;
-	}
-
-	/**
-	 * Adds a new method plug-in to the current method library, updates the
-	 * Librray view and opens the method plug-in editor.
-	 * 
-	 * @param plugin
-	 *            a newly created method plug-in
-	 * @return <code>true</code> if the plug-in is initialized correctly
-	 */
-	public boolean initMethodPlugin(final MethodPlugin plugin) {
-		try {
-			ILibraryManager manager = (ILibraryManager) LibraryService
-					.getInstance().getCurrentLibraryManager();
-			if (manager != null) {
-				manager.addMethodPlugin(plugin);
-			}
-
-			Display.getCurrent().asyncExec(new Runnable() {
-				public void run() {
-					// Select the new method plug-in in the Library view.
-					List<MethodPlugin> selection = new ArrayList<MethodPlugin>();
-					selection.add(plugin);
-					LibraryView.getView().setSelectionToViewer(selection);
-
-					// Open the new method plug-in editor.
-					EditorChooser.getInstance().openEditor(newPlugin);
-				}
-			});
-
-			return true;
-		} catch (Exception e) {
-			AuthoringUIPlugin.getDefault().getLogger().logError(
-					"Failed to initialize method plug-in '" //$NON-NLS-1$
-							+ plugin.getName() + "'", e); //$NON-NLS-1$
-			return false;
-		}
-	}
-	
-	private boolean superPerformFinish() {
-		return super.performFinish();
-	}
-
-	@Override
-	public boolean performFinish() {
-		final boolean[] resultHolder = new boolean[1];
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.run(new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				resultHolder[0] = superPerformFinish();
-			}
-			
-		});
-		return resultHolder[0];
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SaveAllEditorsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SaveAllEditorsPage.java
deleted file mode 100644
index 4a2ce36..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SaveAllEditorsPage.java
+++ /dev/null
@@ -1,312 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.jface.dialogs.IPageChangedListener;
-import org.eclipse.jface.dialogs.PageChangedEvent;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.wizard.IWizardContainer;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * A wizard page that lists the currently open editors and prompts the user to
- * save them before performing an import or export operation.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class SaveAllEditorsPage extends BaseWizardPage {
-
-	private static final String SAVE_AND_CLOSE_PAGE_TITLE = AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_saveAndClosePageTitle;
-
-	private static final String SAVE_AND_CLOSE_PAGE_DESC = AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_saveAndClosePageDescription;
-
-	private static final String SAVE_PAGE_TITLE = AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_saveTitle;
-
-	private static final String SAVE_PAGE_DESC = AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_saveDescription;
-
-	private boolean doClose;
-
-	private CheckboxTableViewer ctrl_chkboxTableViewer;
-
-	private Button selectAll;
-
-	private Button deselectAll;
-
-	/**
-	 * Adds this wizard page to a wizard only when necessary.
-	 * This page will be added iff there are dirty method editors.
-	 * if doClose is true and there are no dirty editors, this method will
-	 * close all method editors.
-	 * 
-	 * @param wizard
-	 *            The wizard to which this page might be added.
-	 * @param doClose
-	 *            If <code>true</code>, this page will close editors when
-	 *            next is clicked. 
-	 * @return <code>true</code> if the page will be added to the wizard.
-	 */
-	public static boolean addPageIfNeeded(Wizard wizard, boolean doClose) {
-		if (isUnsavedEditor()) {
-			wizard.addPage(new SaveAllEditorsPage(doClose));
-			return true;
-		} else {
-			performClose(doClose);
-			return false;
-		}
-	}
-
-	/**
-	 * Adds this wizard page to a wizard only when necessary.
-	 * This page will be added iff there are dirty method editors.
-	 * if doClose is true and there are no dirty editors, this method will
-	 * close all method editors.
-	 * 
-	 * @param wizard
-	 *            The wizard which this page might be added.
-	 * @param doClose
-	 *            If <code>true</code>, this page will close editors when
-	 *            next is clicked. 
-	 * @return <code>true</code> if the page will be added to the wizard.
-	 */
-	public static boolean addPageIfNeeded(Wizard wizard, boolean doClose,
-			String title, String description, ImageDescriptor image) {
-		if (isUnsavedEditor()) {
-			SaveAllEditorsPage page = new SaveAllEditorsPage(doClose);
-			if (title != null) {
-				page.setTitle(title);
-			}
-			if (description != null) {
-				page.setDescription(description);
-			}
-			if (image != null) {
-				page.setImageDescriptor(image);
-			}
-			wizard.addPage(page);
-			return true;
-		} else {
-			performClose(doClose);
-			return false;
-		}
-	}
-
-	/**
-	 * Creates a new intance.
-	 */
-	public SaveAllEditorsPage(boolean close) {
-		super(SAVE_PAGE_TITLE);
-		this.doClose = close;
-		if (doClose) {
-			setTitle(SAVE_AND_CLOSE_PAGE_TITLE);
-			setDescription(SAVE_AND_CLOSE_PAGE_DESC);
-		} else {
-			setTitle(SAVE_PAGE_TITLE);
-			setDescription(SAVE_PAGE_DESC);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout(2, false));
-
-		ctrl_chkboxTableViewer = CheckboxTableViewer.newCheckList(container,
-				SWT.BORDER | SWT.FILL | SWT.HORIZONTAL);
-		ctrl_chkboxTableViewer.getTable().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		ctrl_chkboxTableViewer.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				IEditorReference ref = (IEditorReference) element;
-				return ref.getEditor(false).getTitle();
-			}
-
-			public Image getImage(Object element) {
-				IEditorReference ref = (IEditorReference) element;
-				return ref.getEditor(false).getTitleImage();
-			}
-		});
-		ctrl_chkboxTableViewer.setContentProvider(new ArrayContentProvider());
-		ctrl_chkboxTableViewer.setInput(EditorChooser.getInstance().getOpenMethodEditors().toArray());
-		ctrl_chkboxTableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement, Object element) {
-				if (element instanceof IEditorReference) {
-					if (((IEditorReference)element).isDirty())
-						return true;
-				}
-				return false;
-			}
-		});
-		ctrl_chkboxTableViewer.setAllChecked(true);
-
-		Composite buttonContainer = new Composite(container, SWT.NONE);
-		buttonContainer.setLayout(new GridLayout(1, true));
-		buttonContainer.setLayoutData(new GridData(SWT.DEFAULT, SWT.BEGINNING,
-				false, true));
-
-		selectAll = new Button(buttonContainer, SWT.PUSH);
-		selectAll
-				.setText(AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_SelectAllButtonLabel);
-		selectAll.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false,
-				true));
-
-		deselectAll = new Button(buttonContainer, SWT.PUSH);
-		deselectAll
-				.setText(AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_DeselectAllButtonLabel);
-		deselectAll.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false,
-				true));
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(true);
-	}
-
-	private void refresh () {
-		if (ctrl_chkboxTableViewer != null) {
-			ctrl_chkboxTableViewer.refresh();
-			if (ctrl_chkboxTableViewer.getTable() != null) {
-				if (ctrl_chkboxTableViewer.getTable().getItems() != null) {
-					if (ctrl_chkboxTableViewer.getTable().getItems().length == 0) {
-						if (ctrl_chkboxTableViewer.getControl() != null)
-							ctrl_chkboxTableViewer.getControl().setEnabled(false);
-						selectAll.setEnabled(false);
-						deselectAll.setEnabled(false);
-					}
-				}
-			}
-		}
-	}
-	
-	private void addListeners() {
-		if (getWizard() != null) {
-			IWizardContainer container = getWizard().getContainer();
-			if (container instanceof WizardDialog) {
-				((WizardDialog)container).addPageChangedListener(new IPageChangedListener() {
-					public void pageChanged(PageChangedEvent event) {
-						refresh();
-					}
-				});
-			}
-		}
-		selectAll.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ctrl_chkboxTableViewer.setAllChecked(true);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-		});
-
-		deselectAll.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ctrl_chkboxTableViewer.setAllChecked(false);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				widgetSelected(e);
-			}
-
-		});
-	}
-	
-	public boolean canFlipToNextPage() {
-		return true;
-	}
-
-	/**
-	 * Perform our save (and possibly close) operation
-	 */
-	public IWizardPage getNextPage() {
-		performSaveAndClose();
-		return super.getNextPage();
-	}
-	
-	protected void performSaveAndClose() {
-		Object[] checkedArray = ctrl_chkboxTableViewer.getCheckedElements();
-		for (int i = 0; i < checkedArray.length; i++) {
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().saveEditor(
-							((IEditorReference) checkedArray[i])
-									.getEditor(false), false);
-		}
-		performClose(doClose);
-	}
-	
-	protected static void performClose(boolean doClose) {
-		if (doClose) {
-			EditorChooser.getInstance().closeAllMethodEditors();
-		}
-	}
-
-	/**
-	 * Checked whether there is any unsaved editor open
-	 * 
-	 * @param doClose
-	 * @return true if there is an unsaved editor open
-	 * 	true if doClose is true and there is an open editor
-	 *  false otherwise
-	 */
-	private static boolean isUnsavedEditor() {
-		boolean anEditorIsDirty = false;
-		List<IEditorReference> methodEditors = EditorChooser.getInstance().getOpenMethodEditors();
-		for (Iterator<IEditorReference> iterator = methodEditors.iterator(); iterator.hasNext();) {
-			IEditorReference editor = iterator.next();
-			if (editor.isDirty()) {
-				anEditorIsDirty = true;
-				break;
-			}
-			
-		}
-		return anEditorIsDirty;
-	}
-	
-	private static boolean isOpenEditor(boolean doClose) {
-		List<IEditorReference> methodEditors = EditorChooser.getInstance().getOpenMethodEditors();
-		return doClose && methodEditors.size() > 0;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationChoices.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationChoices.java
deleted file mode 100644
index ed53a2a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationChoices.java
+++ /dev/null
@@ -1,281 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-
-/**
- * It stores and manages all choices for synchronization
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SynchronizationChoices {
-
-	public static int SYNC_NONE = 0;
-	public static int SYNC_FROM_CONETNT = 1;
-	public static int SYNC_FROM_PROCESS = 2;
-	
-	private Process selectedProcess;
-	private MethodConfiguration selectedConfig;
-	private int syncName= SYNC_FROM_CONETNT;
-	private int syncPresName= SYNC_FROM_CONETNT;
-	private int syncBriefDesc= SYNC_FROM_CONETNT;
-	private int syncOptInput= SYNC_FROM_CONETNT;
-	private int syncManInput= SYNC_FROM_CONETNT;
-	private int syncOutput= SYNC_FROM_CONETNT;
-	private int syncPrimPerformer= SYNC_FROM_CONETNT;
-	private int syncAddnPerformer= SYNC_FROM_CONETNT;
-	private int syncRespRole= SYNC_FROM_CONETNT;
-	private int syncContArtifact= SYNC_FROM_CONETNT;
-	private int syncDelivPart= SYNC_FROM_CONETNT;
-	private int syncSelStep= SYNC_FROM_CONETNT;
-	
-	public boolean isFinishPressed;
-
-	/**
-	 * Get selected process
-	 */
-	public Process getSelectedProcess() {
-		return selectedProcess;
-	}
-
-	/**
-	 * Set selected process
-	 * @param selectedProcess
-	 */
-	public void setSelectedProcess(Process selectedProcess) {
-		this.selectedProcess = selectedProcess;
-	}
-
-	/**
-	 * Get selected method configuration
-	 */
-	public MethodConfiguration getSelectedConfig() {
-		return selectedConfig;
-	}
-
-	/**
-	 * Set selected method configuration
-	 * @param selectedConfig
-	 */
-	public void setSelectedConfig(MethodConfiguration selectedConfig) {
-		this.selectedConfig = selectedConfig;
-	}
-
-	/**
-	 * Get option of synchronizing contained artifacts
-	 */
-	public int getSyncContArtifact() {
-		return syncContArtifact;
-	}
-
-	/**
-	 * Set option for synchronizing contained artifacts
-	 */
-	public void setSyncContArtifact(int syncContArtifact) {
-		this.syncContArtifact = syncContArtifact;
-	}
-
-	/**
-	 * Get option of synchronizing deliverable parts
-	 */
-	public int getSyncDelivPart() {
-		return syncDelivPart;
-	}
-
-	/**
-	 * Set option for synchronizing deliverable parts
-	 */
-	public void setSyncDelivPart(int syncDelivPart) {
-		this.syncDelivPart = syncDelivPart;
-	}
-
-	/**
-	 * Get option of synchronizing mandatory input
-	 */
-	public int getSyncManInput() {
-		return syncManInput;
-	}
-
-	/**
-	 * Set option for synchronizing mandatory input
-	 */
-	public void setSyncManInput(int syncManInput) {
-		this.syncManInput = syncManInput;
-	}
-
-	/**
-	 * Get option of synchronizing optional input
-	 */
-	public int getSyncOptInput() {
-		return syncOptInput;
-	}
-
-	/**
-	 * Set option for synchronizing optional input
-	 */
-	public void setSyncOptInput(int syncOptInput) {
-		this.syncOptInput = syncOptInput;
-	}
-
-	/**
-	 * Get option of synchronizing output
-	 */
-	public int getSyncOutput() {
-		return syncOutput;
-	}
-
-	/**
-	 * Set option for synchronizing output
-	 */
-	public void setSyncOutput(int syncOutput) {
-		this.syncOutput = syncOutput;
-	}
-
-	/**
-	 * Get option of synchronizing presentation name
-	 */
-	public int getSyncPresName() {
-		return syncPresName;
-	}
-
-	/**
-	 * Set option for synchronizing presetnation name
-	 */
-	public void setSyncPresName(int syncPresName) {
-		this.syncPresName = syncPresName;
-	}
-
-	/**
-	 * Get option of synchronizing responsible role
-	 */
-	public int getSyncRespRole() {
-		return syncRespRole;
-	}
-
-	/**
-	 * Set option for synchronizing responsible role
-	 */
-	public void setSyncRespRole(int syncRespRole) {
-		this.syncRespRole = syncRespRole;
-	}
-
-	/**
-	 * Get option of synchronizing steps
-	 */
-	public int getSyncSelStep() {
-		return syncSelStep;
-	}
-
-	/**
-	 * Set option for synchronizing steps
-	 */
-	public void setSyncSelStep(int syncSelStep) {
-		this.syncSelStep = syncSelStep;
-	}
-
-	/**
-	 * Returns boolean value based on wizard is completed or not
-	 */
-	public boolean isFinishPressed() {
-		return isFinishPressed;
-	}
-
-	/**
-	 * Set option based on wizard in completed or not
-	 */
-	public void setFinishPressed(boolean isFinishPressed) {
-		this.isFinishPressed = isFinishPressed;
-	}
-
-	/**
-	 * Get option of synchronizing additional performer
-	 */
-	public int getSyncAddnPerformer() {
-		return syncAddnPerformer;
-	}
-
-	/**
-	 * Set option for synchronizing additional performer
-	 */
-	public void setSyncAddnPerformer(int syncAddnPerformer) {
-		this.syncAddnPerformer = syncAddnPerformer;
-	}
-
-	/**
-	 * Get option of synchronizing primary performer
-	 */
-	public int getSyncPrimPerformer() {
-		return syncPrimPerformer;
-	}
-
-	/**
-	 * Set option for synchronizing primary performer
-	 */
-	public void setSyncPrimPerformer(int syncPrimPerformer) {
-		this.syncPrimPerformer = syncPrimPerformer;
-	}
-
-	/**
-	 * Displays all synchronization options/choices
-	 */
-	public String toString() {
-		
-		StringBuffer sbuf = new StringBuffer();
-		sbuf.append("[Process:" + ((selectedProcess != null)?selectedProcess.getName():"null") + ";"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		sbuf.append("Configuration:" + ((selectedConfig != null)?selectedConfig.getName():"null") + ";"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		sbuf.append("Name:" + syncName + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("PresName:" + syncPresName + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("BreifDesc:" + syncBriefDesc + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("OptInput:" + syncOptInput + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("ManInput:" + syncManInput + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("Output:" + syncOutput + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("PrimPerformer:" + syncPrimPerformer + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("AddnPerformers:" + syncAddnPerformer + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("RespRole:" + syncRespRole + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("ContArtifact:" + syncContArtifact + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("DelivPart:" + syncDelivPart + ";"); //$NON-NLS-1$ //$NON-NLS-2$
-		sbuf.append("SelStep:" + syncSelStep + "]"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		return sbuf.toString();
-	}
-
-	/**
-	 * Get option of synchronizing brief description
-	 */
-	public int getSyncBriefDesc() {
-		return syncBriefDesc;
-	}
-
-	/**
-	 * Set option for synchronizing brief description
-	 */
-	public void setSyncBriefDesc(int syncBriefDesc) {
-		this.syncBriefDesc = syncBriefDesc;
-	}
-
-	/**
-	 * Get option of synchronizing name
-	 */
-	public int getSyncName() {
-		return syncName;
-	}
-
-	/**
-	 * Set option for synchronizing name
-	 */
-	public void setSyncName(int syncName) {
-		this.syncName = syncName;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationDescriptionPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationDescriptionPage.java
deleted file mode 100644
index 4b205b4..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationDescriptionPage.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * The wizard page which describes custom synchronization.
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SynchronizationDescriptionPage extends BaseWizardPage {
-
-	private SynchronizationChoices syncChoices = null;
-	
-	private Text ctrl_explainText;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public SynchronizationDescriptionPage(String pageName,
-			SynchronizationChoices choices) {
-		super(pageName);
-		setTitle(AuthoringUIResources.synchronizationWizard_descriptionPage_title); 
-		setDescription(AuthoringUIResources.synchronizationWizard_descriptionPage_text); 
-		this.syncChoices = choices;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// Create the composite to hold the widgets.
-		Composite composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout(1, false));
-		
-		String explainText = AuthoringUIResources.synchronizationWizard_descriptionPage_explainText; 
-		ctrl_explainText = createMultiLineText(composite, " ", 400, 240, 1); //$NON-NLS-1$
-		ctrl_explainText.setText(explainText);
-		
-		setControl(composite);
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationOperation.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationOperation.java
deleted file mode 100644
index 45a40ed..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationOperation.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-/**
- * Runs synchonization operation
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SynchronizationOperation implements IRunnableWithProgress {
-
-	private SynchronizationChoices synchChoices;
-	private Collection elements;
-	
-	/**
-	 * Creates an instance
-	 * @param elements
-	 * 			List of elements to be synchronized
-	 * @param choices
-	 * 			Synchronization options
-	 */
-	public SynchronizationOperation(Collection elements, SynchronizationChoices choices) {
-		this.synchChoices = choices;
-		this.elements = elements;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException,
-			InterruptedException {
-		for (int i = 0; i < 5; i++) {
-			try {
-				Thread.sleep(1000);
-			} catch (Exception e) {}
-			System.out.println("$$$ woke up after 1 second sleep, #" + (i+1)); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationPreviewPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationPreviewPage.java
deleted file mode 100644
index 162a158..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationPreviewPage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * The wizard page which lets you preview elements to be synchonized
- * and also any additional information.
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SynchronizationPreviewPage extends BaseWizardPage {
-
-	private SynchronizationChoices syncChoices = null;
-	
-	private Text ctrl_previewText;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public SynchronizationPreviewPage(String pageName,
-			SynchronizationChoices choices) {
-		super(pageName);
-		setTitle(AuthoringUIResources.synchronizationWizard_previewPage_title); 
-		setDescription(AuthoringUIResources.synchronizationWizard_previewPage_text); 
-		this.syncChoices = choices;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// Create the composite to hold the widgets.
-		Composite composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout(1, false));
-		
-		String explainText = "Preview text coming here.\n\n" +								//$NON-NLS-1$
-				"\tThis has to be coming from some underlyin API call. This may be cut off if there is not enoug time."; //$NON-NLS-1$
-		ctrl_previewText = createMultiLineText(composite, " ", 400, 240, 1); //$NON-NLS-1$
-		ctrl_previewText.setText(explainText);
-		
-		setControl(composite);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationSelectConfigPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationSelectConfigPage.java
deleted file mode 100644
index 3a138a2..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationSelectConfigPage.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The wizard page which let user select method configuration during
- * synchronization
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SynchronizationSelectConfigPage extends BaseWizardPage implements ISelectionChangedListener {
-
-	private SynchronizationChoices syncChoices = null;
-	
-	private ComboViewer configComboViewer;
-	private MethodConfiguration[] validConfigurations;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public SynchronizationSelectConfigPage(String pageName,
-			SynchronizationChoices choices) {
-		super(pageName);
-		setTitle(AuthoringUIResources.synchronizationWizard_selectConfigPage_title); 
-		setDescription(AuthoringUIResources.synchronizationWizard_selectConfigPage_text); 
-		this.syncChoices = choices;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// Create the composite to hold the widgets.
-		Composite composite = new Composite(parent, SWT.NULL);
-		{
-			GridLayout layout = new GridLayout(2, false);
-			layout.marginWidth = 0;
-			layout.marginHeight = 0;
-			composite.setLayout(layout);
-		}
-		
-		// add an empty line
-		createLabel(composite, " ", 2); //$NON-NLS-1$
-		
-		createLabel(composite, AuthoringUIResources.synchronizationWizard_selectConfigPage_configLabel); 
-		
-		configComboViewer = new ComboViewer(composite, SWT.BORDER | SWT.READ_ONLY);
-		configComboViewer.getCombo().setLayoutData(
-				new GridData(GridData.BEGINNING | GridData.FILL_HORIZONTAL));
-		
-		ILabelProvider labelProvider = new LabelProvider() {
-			public String getText(Object element) {
-				if (element instanceof MethodElement) {
-					return ((MethodElement) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		};
-		configComboViewer.setLabelProvider(labelProvider);
-		
-		// get all valid configurations, and default one, and select and show the default one
-		Process selectedProcess = syncChoices.getSelectedProcess();
-		validConfigurations = (MethodConfiguration[])selectedProcess.getValidContext().toArray();
-		configComboViewer.add(validConfigurations);
-		MethodConfiguration defaultConfig = selectedProcess.getDefaultContext();
-		syncChoices.setSelectedConfig(defaultConfig);
-		StructuredSelection defaultSelection = new StructuredSelection(defaultConfig);
-		configComboViewer.setSelection(defaultSelection, true);
-		
-		addListeners(composite);
-		
-		setControl(composite);
-		
-//		System.out.println("$$$ init config =" + syncChoices.toString());
-	}
-
-	/**
-	 * Adds the listeners for the controls on this page.
-	 */
-	private void addListeners(final Composite composite) {
-		configComboViewer.addSelectionChangedListener(this);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		StructuredSelection selection = (StructuredSelection) event
-				.getSelection();
-		if (!selection.isEmpty()) {
-			Object[] config = selection.toArray();
-			syncChoices.setSelectedConfig((MethodConfiguration)config[0]);
-		} 
-		
-//		System.out.println("$$$ config =" + syncChoices.toString());
-	}
-
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationSelectDetailsPage.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationSelectDetailsPage.java
deleted file mode 100644
index cb17751..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationSelectDetailsPage.java
+++ /dev/null
@@ -1,454 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * The wizard page which let user select properties of method content to 
- * be considered for synchonization. 
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SynchronizationSelectDetailsPage extends BaseWizardPage implements Listener {
-
-	private SynchronizationChoices syncChoices = null;
-	
-	private Button bc_name;
-	private Button bc_presName;
-	private Button bc_briefDesc;
-	private Button bc_optInput;
-	private Button bc_manInput;
-	private Button bc_output;
-	private Button bc_primPerformer;
-	private Button bc_addnPerformer;
-	private Button bc_respRole;
-	private Button bc_contArtifact;
-	private Button bc_delivPart;
-	private Button bc_selStep;
-	
-//	private Button[] br_presName = new Button[2];
-//	private Button[] br_optInput = new Button[2];
-//	private Button[] br_manInput = new Button[2];
-//	private Button[] br_output = new Button[2];
-//	private Button[] br_respRole = new Button[2];
-//	private Button[] br_contArtifact = new Button[2];
-//	private Button[] br_delivPart = new Button[2];
-//	private Button[] br_selStep = new Button[2];
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public SynchronizationSelectDetailsPage(String pageName,
-			SynchronizationChoices choices) {
-		super(pageName);
-		setTitle(AuthoringUIResources.synchronizationWizard_selectDetailsPage_title); 
-		setDescription(AuthoringUIResources.synchronizationWizard_selectDetailsPage_text); 
-		this.syncChoices = choices;
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// Create the composite to hold the widgets.
-		Composite composite = new Composite(parent, SWT.NULL);
-		{
-//			GridLayout layout = new GridLayout(3, false);
-			GridLayout layout = new GridLayout(1, false);
-			layout.marginWidth = 0;
-			layout.marginHeight = 0;
-			composite.setLayout(layout);
-		}
-	
-		createLabel(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_properties_lable); 
-//		createLabel(composite, "Conetnt To Process  ");
-//		createLabel(composite, "  Process To Content");
-		
-		bc_name = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_name_lable); 
-		
-		bc_presName = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_presentationName_lable); 
-//		createTwoRadioGroup(composite, br_presName);
-		
-		bc_briefDesc = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_briefDesc_lable); 
-		
-		bc_optInput = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_optionalInouts_label); 
-//		createTwoRadioGroup(composite, br_optInput);
-		
-		bc_manInput = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_mandatoryInputs_lable); 
-//		createTwoRadioGroup(composite, br_manInput);
-		
-		bc_output = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_outputs_label); 
-//		createTwoRadioGroup(composite, br_output);
-		
-		bc_primPerformer = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_primaryPerformer_label); 
-		bc_addnPerformer = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_addnPerformers_lable); 
-		
-		bc_respRole = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_responsibleRoles_lable); 
-//		createTwoRadioGroup(composite, br_respRole);
-		
-		bc_contArtifact = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_contnArtifacts_label); 
-//		createTwoRadioGroup(composite, br_contArtifact);
-		
-		bc_delivPart = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_dilvedParts_label); 
-//		createTwoRadioGroup(composite, br_delivPart);
-		
-		bc_selStep = createCheckbox(composite, AuthoringUIResources.synchronizationWizard_selectDetailsPage_selSteps_label); 
-//		createTwoRadioGroup(composite, br_selStep);
-		
-		addListeners(composite);
-		setAllChecked();
-		
-		setControl(composite);
-		
-//		System.out.println("$$$ init detail =" + syncChoices.toString());
-	}
-	
-	private void setAllChecked() {
-		bc_name.setSelection(true);
-		bc_presName.setSelection(true);
-		bc_briefDesc.setSelection(true);
-		bc_optInput.setSelection(true);
-		bc_manInput.setSelection(true);
-		bc_output.setSelection(true);
-		bc_primPerformer.setSelection(true);
-		bc_addnPerformer.setSelection(true);
-		bc_respRole.setSelection(true);
-		bc_contArtifact.setSelection(true);
-		bc_delivPart.setSelection(true);
-		bc_selStep.setSelection(true);	
-	}
-	
-	/**
-	 * Adds the listeners for the controls on this page.
-	 */
-	private void addListeners(final Composite composite) {
-		bc_name.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_name.getSelection()) {
-						syncChoices.setSyncName(SynchronizationChoices.SYNC_FROM_CONETNT);
-				} else {
-					syncChoices.setSyncName(SynchronizationChoices.SYNC_NONE);
-				}
-				setPageComplete(isPageComplete());
-			}
-		});
-		bc_presName.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_presName.getSelection()) {
-//					br_presName[0].setEnabled(true);
-//					br_presName[1].setEnabled(true);
-//					if (br_presName[0].getSelection())
-						syncChoices.setSyncPresName(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncPresName(SynchronizationChoices.SYNC_FROM_PROCESS);
-				} else {
-//					br_presName[0].setEnabled(false);
-//					br_presName[1].setEnabled(false);
-					syncChoices.setSyncPresName(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-		bc_briefDesc.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_briefDesc.getSelection()) {
-						syncChoices.setSyncBriefDesc(SynchronizationChoices.SYNC_FROM_CONETNT);
-				} else {
-					syncChoices.setSyncBriefDesc(SynchronizationChoices.SYNC_NONE);
-				}
-				setPageComplete(isPageComplete());
-			}
-		});
-		bc_optInput.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_optInput.getSelection()) {
-//					br_optInput[0].setEnabled(true);
-//					br_optInput[1].setEnabled(true);
-//					if (br_optInput[0].getSelection())
-						syncChoices.setSyncOptInput(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncOptInput(SynchronizationChoices.SYNC_FROM_PROCESS);
-				} else {
-//					br_optInput[0].setEnabled(false);
-//					br_optInput[1].setEnabled(false);
-					syncChoices.setSyncOptInput(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-		
-		bc_manInput.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_manInput.getSelection()) {
-//					br_manInput[0].setEnabled(true);
-//					br_manInput[1].setEnabled(true);
-//					if (br_manInput[0].getSelection())
-						syncChoices.setSyncManInput(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncManInput(SynchronizationChoices.SYNC_FROM_PROCESS);
-//					
-				} else {
-//					br_manInput[0].setEnabled(false);
-//					br_manInput[1].setEnabled(false);
-					syncChoices.setSyncManInput(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-		
-		bc_output.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_output.getSelection()) {
-//					br_output[0].setEnabled(true);
-//					br_output[1].setEnabled(true);
-//					if (br_output[0].getSelection())
-						syncChoices.setSyncOutput(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncOutput(SynchronizationChoices.SYNC_FROM_PROCESS);
-				} else {
-//					br_output[0].setEnabled(false);
-//					br_output[1].setEnabled(false);
-					syncChoices.setSyncOutput(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-		
-		bc_primPerformer.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_primPerformer.getSelection()) {
-					syncChoices.setSyncPrimPerformer(SynchronizationChoices.SYNC_FROM_CONETNT);
-				} else {
-					syncChoices.setSyncPrimPerformer(SynchronizationChoices.SYNC_NONE);
-				}
-				setPageComplete(isPageComplete());
-			}
-		});
-		
-		bc_addnPerformer.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-					if (bc_addnPerformer.getSelection()) {
-						syncChoices.setSyncAddnPerformer(SynchronizationChoices.SYNC_FROM_CONETNT);
-					} else {
-						syncChoices.setSyncAddnPerformer(SynchronizationChoices.SYNC_NONE);
-					}
-					setPageComplete(isPageComplete());
-				}
-		});
-		
-		bc_respRole.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_respRole.getSelection()) {
-//					br_respRole[0].setEnabled(true);
-//					br_respRole[1].setEnabled(true);
-//					if (br_respRole[0].getSelection())
-						syncChoices.setSyncRespRole(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncRespRole(SynchronizationChoices.SYNC_FROM_PROCESS);
-				} else {
-//					br_respRole[0].setEnabled(false);
-//					br_respRole[1].setEnabled(false);
-					syncChoices.setSyncRespRole(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-		
-		bc_contArtifact.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_contArtifact.getSelection()) {
-//					br_contArtifact[0].setEnabled(true);
-//					br_contArtifact[1].setEnabled(true);
-//					if (br_contArtifact[0].getSelection())
-						syncChoices.setSyncContArtifact(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncContArtifact(SynchronizationChoices.SYNC_FROM_PROCESS);
-				} else {
-//					br_contArtifact[0].setEnabled(false);
-//					br_contArtifact[1].setEnabled(false);
-					syncChoices.setSyncContArtifact(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-		
-		bc_delivPart.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_delivPart.getSelection()) {
-//					br_delivPart[0].setEnabled(true);
-//					br_delivPart[1].setEnabled(true);
-//					if (br_delivPart[0].getSelection())
-						syncChoices.setSyncDelivPart(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncDelivPart(SynchronizationChoices.SYNC_FROM_PROCESS);
-				} else {
-//					br_delivPart[0].setEnabled(false);
-//					br_delivPart[1].setEnabled(false);
-					syncChoices.setSyncDelivPart(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-		
-		bc_selStep.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event event) {
-				if (bc_selStep.getSelection()) {
-//					br_selStep[0].setEnabled(true);
-//					br_selStep[1].setEnabled(true);
-//					if (br_selStep[0].getSelection())
-						syncChoices.setSyncSelStep(SynchronizationChoices.SYNC_FROM_CONETNT);
-//					else
-//						syncChoices.setSyncSelStep(SynchronizationChoices.SYNC_FROM_PROCESS);
-				} else {
-//					br_selStep[0].setEnabled(false);
-//					br_selStep[1].setEnabled(false);
-					syncChoices.setSyncSelStep(SynchronizationChoices.SYNC_NONE);
-				}
-//				System.out.println("$$$ " + syncChoices.toString());
-				setPageComplete(isPageComplete());
-			}
-		});
-
-//		br_presName[0].addListener(SWT.Selection, this);
-//		br_optInput[0].addListener(SWT.Selection, this);
-//		br_manInput[0].addListener(SWT.Selection, this);
-//		br_output[0].addListener(SWT.Selection, this);
-//		br_respRole[0].addListener(SWT.Selection, this);
-//		br_contArtifact[0].addListener(SWT.Selection, this);
-//		br_delivPart[0].addListener(SWT.Selection, this);
-//		br_selStep[0].addListener(SWT.Selection, this);
-//		
-//		br_presName[1].addListener(SWT.Selection, this);
-//		br_optInput[1].addListener(SWT.Selection, this);
-//		br_manInput[1].addListener(SWT.Selection, this);
-//		br_output[1].addListener(SWT.Selection, this);
-//		br_respRole[1].addListener(SWT.Selection, this);
-//		br_contArtifact[1].addListener(SWT.Selection, this);
-//		br_delivPart[1].addListener(SWT.Selection, this);
-//		br_selStep[1].addListener(SWT.Selection, this);
-	}
-	
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		
-//		if (event.widget == br_presName[0] && br_presName[0].getSelection()) { 
-//			syncChoices.setSyncPresName(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//		if (event.widget == br_optInput[0] && br_optInput[0].getSelection()) { 
-//			syncChoices.setSyncOptInput(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//		if (event.widget == br_manInput[0] && br_manInput[0].getSelection()) { 
-//			syncChoices.setSyncManInput(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//		if (event.widget == br_output[0] && br_output[0].getSelection()) { 
-//			syncChoices.setSyncOutput(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//		if (event.widget == br_respRole[0] && br_respRole[0].getSelection()) { 
-//			syncChoices.setSyncRespRole(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//		if (event.widget == br_contArtifact[0] && br_contArtifact[0].getSelection()) {
-//			syncChoices.setSyncContArtifact(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//		if (event.widget == br_delivPart[0] && br_delivPart[0].getSelection()) { 
-//			syncChoices.setSyncDelivPart(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//		if (event.widget == br_selStep[0] && br_selStep[0].getSelection()){ 
-//			syncChoices.setSyncSelStep(SynchronizationChoices.SYNC_FROM_CONETNT);
-//		}
-//
-//		if (event.widget == br_presName[1] && br_presName[1].getSelection()){ 
-//			syncChoices.setSyncPresName(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-//		if (event.widget == br_optInput[1] && br_optInput[1].getSelection()){ 
-//			syncChoices.setSyncOptInput(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-//		if (event.widget == br_manInput[1] && br_manInput[1].getSelection()){ 
-//			syncChoices.setSyncManInput(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-//		if (event.widget == br_output[1] && br_output[1].getSelection()){ 
-//			syncChoices.setSyncOutput(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-//		if (event.widget == br_respRole[1] && br_respRole[1].getSelection()){ 
-//			syncChoices.setSyncRespRole(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-//		if (event.widget == br_contArtifact[1] && br_contArtifact[1].getSelection()){
-//			syncChoices.setSyncContArtifact(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-//		if (event.widget == br_delivPart[1] && br_delivPart[1].getSelection()){ 
-//			syncChoices.setSyncDelivPart(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-//		if (event.widget == br_selStep[1] && br_selStep[1].getSelection()){
-//			syncChoices.setSyncSelStep(SynchronizationChoices.SYNC_FROM_PROCESS);
-//		}
-////		System.out.println("$$$ " + syncChoices.toString());
-	}
-	
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-//		System.out.println("$$$ DEBUG: " + syncChoices.toString());
-		if (syncChoices.getSyncName() > 0 ||
-			syncChoices.getSyncPresName() > 0 ||
-			syncChoices.getSyncBriefDesc() > 0 ||
-			syncChoices.getSyncOptInput() > 0 ||
-			syncChoices.getSyncManInput() > 0 ||
-			syncChoices.getSyncOutput() > 0 ||
-			syncChoices.getSyncPrimPerformer() > 0 ||
-			syncChoices.getSyncAddnPerformer() > 0 ||
-			syncChoices.getSyncRespRole() > 0 ||
-			syncChoices.getSyncContArtifact() > 0 ||
-			syncChoices.getSyncDelivPart() > 0 ||
-			syncChoices.getSyncSelStep() > 0) {
-			return true;
-		} else {
-			return false;
-		}
-		
-	}
-	
-//	private void createTwoRadioGroup(Composite parent, Button[] rbs) {
-//		Composite aGroup = new Composite(parent, SWT.NULL);
-//		
-//		GridLayout layout = new GridLayout(2, false);
-//		aGroup.setLayout(layout);
-//		
-//		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-//		gd.horizontalSpan = 2;
-//		aGroup.setLayoutData(gd);
-//		
-//		rbs[0] = createRadioButton(aGroup, "", 1, true); //$NON-NLS-1$
-//		rbs[1] = createRadioButton(aGroup, "", 1, false); //$NON-NLS-1$
-//		
-//		rbs[0].setEnabled(false);
-//		rbs[1].setEnabled(false);
-//	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationWizard.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationWizard.java
deleted file mode 100644
index d23c3ea..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/SynchronizationWizard.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.authoring.ui.wizards;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-
-/**
- * The wizard that guides user to do custom synchronization for process
- * descriptors from method elements.
- * 
- * @author BingXue Xu
- * @since 1.0
- *
- */
-public class SynchronizationWizard extends Wizard implements INewWizard {
-
-	private SynchronizationDescriptionPage descPage;
-	private SynchronizationSelectConfigPage selectConfigPage;
-	private SynchronizationSelectDetailsPage selectDetailsPage;
-//	private SynchronizationPreviewPage previewPage;
-	
-	private SynchronizationChoices syncChoices = null;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public SynchronizationWizard(SynchronizationChoices choices) {
-		super();
-		this.syncChoices = choices;
-		setWindowTitle(AuthoringUIResources.synchronizationWizard_title_text); 
-	}
-	
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		ImageDescriptor imageDescriptor = AuthoringUIPlugin.getDefault()
-				.getImageDescriptor("full/wizban/synchronization.gif"); //$NON-NLS-1$
-
-		descPage = new SynchronizationDescriptionPage(
-				"SynchronizationDescriptionPage", syncChoices); //$NON-NLS-1$
-		descPage.setImageDescriptor(imageDescriptor);
-		addPage(descPage);
-
-		selectConfigPage = new SynchronizationSelectConfigPage(
-				"SynchronizationSelectConfigPage", syncChoices); //$NON-NLS-1$
-		selectConfigPage.setImageDescriptor(imageDescriptor);
-		addPage(selectConfigPage);
-		
-		selectDetailsPage = new SynchronizationSelectDetailsPage(
-				"SynchronizationSelectDetailsPage", syncChoices); //$NON-NLS-1$
-		selectDetailsPage.setImageDescriptor(imageDescriptor);
-		addPage(selectDetailsPage);
-		
-//		previewPage = new SynchronizationPreviewPage(
-//				"SynchronizationPreviewPage", syncChoices); //$NON-NLS-1$
-//		previewPage.setImageDescriptor(imageDescriptor);
-//		addPage(previewPage);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		return (selectDetailsPage.isPageComplete());
-	}
-	
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		syncChoices.setFinishPressed(true);
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performCancel()
-	 */
-	public boolean performCancel() {
-		syncChoices.setFinishPressed(false);
-		return true;
-	}
-	
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/package.html b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/package.html
deleted file mode 100644
index 1c5600a..0000000
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides wizards for authoring method content and processes.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.base/.project b/1.5/plugins/org.eclipse.epf.base/.project
deleted file mode 100644
index d1be095..0000000
--- a/1.5/plugins/org.eclipse.epf.base/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.base</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.base/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.base/META-INF/MANIFEST.MF
deleted file mode 100644
index d4c8222..0000000
--- a/1.5/plugins/org.eclipse.epf.base/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %featurePluginName
-Bundle-SymbolicName: org.eclipse.epf.base; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.base/about.html b/1.5/plugins/org.eclipse.epf.base/about.html
deleted file mode 100644
index 4c99086..0000000
--- a/1.5/plugins/org.eclipse.epf.base/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</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.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.base/about.ini b/1.5/plugins/org.eclipse.epf.base/about.ini
deleted file mode 100644
index 604f4fa..0000000
--- a/1.5/plugins/org.eclipse.epf.base/about.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-#-------------------------------------------------------------------------------
-
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%featureText
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=application_32.gif
-
-# Property "appName" contains name of the application (translated)
-appName=%featureName
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-welcomePage=$nl$/welcome.xml
diff --git a/1.5/plugins/org.eclipse.epf.base/about.mappings b/1.5/plugins/org.eclipse.epf.base/about.mappings
deleted file mode 100644
index 0b80b3b..0000000
--- a/1.5/plugins/org.eclipse.epf.base/about.mappings
+++ /dev/null
@@ -1,8 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-# Usually generated at build time.
-
-0=@build-ID@
-1=1.2.0.2
diff --git a/1.5/plugins/org.eclipse.epf.base/about.properties b/1.5/plugins/org.eclipse.epf.base/about.properties
deleted file mode 100644
index 3d3677a..0000000
--- a/1.5/plugins/org.eclipse.epf.base/about.properties
+++ /dev/null
@@ -1,39 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Base
-
-featureText=EPF Base\n\
-\n\
-Version: {1} \n\
-Build Label: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n\
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/application_32.gif b/1.5/plugins/org.eclipse.epf.base/application_32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/1.5/plugins/org.eclipse.epf.base/application_32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.base/build.properties b/1.5/plugins/org.eclipse.epf.base/build.properties
deleted file mode 100644
index 4a074b8..0000000
--- a/1.5/plugins/org.eclipse.epf.base/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = .,\
-               META-INF/,\
-               about.html,\
-               about.ini,\
-               about.properties,\
-               application_32.gif,\
-               welcome.xml,\
-               plugin.properties,\
-               about.mappings,\
-               nl/
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/da/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/da/about.properties
deleted file mode 100644
index 1c69f60..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/da/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF - basis
-
-featureText=EPF Base\n\
-\n\
-Version: {1} \n\
-Byggeetiket: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007. All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/de/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/de/about.properties
deleted file mode 100644
index 99a81e8..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/de/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF - Basis
-
-featureText=EPF - Basis\n\
-\n\
-Version: {1} \n\
-Build-Kennung: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/es/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/es/about.properties
deleted file mode 100644
index 9dfb631..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/es/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Base
-
-featureText=EPF Base\n\
-\n\
-Versi\u00f3n: {1} \n\
-Etiqueta de build: {0}\n\
-\n\
-(c) Copyright Colaboradores de Eclipse y otros 2000, 2007.  Reservados todos los derechos.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/fr/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/fr/about.properties
deleted file mode 100644
index 6f2702f..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/fr/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=Base EPF
-
-featureText=EPF Base\n\
-\n\
-Version : {1} \n\
-Libell\u00e9 de version : {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/it/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/it/about.properties
deleted file mode 100644
index 87ddbdd..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/it/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Base
-
-featureText=EPF Base\n\
-\n\
-Versione: {1} \n\
-Etichetta build: {0}\n\
-\n\
-(c) Copyright Eclipse contributors e altri 2000, 2007.  Tutti i diritti riservati.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/ja/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/ja/about.properties
deleted file mode 100644
index 8d01d51..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/ja/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Base
-
-featureText=EPF Base\n\
-\n\
-\u30d0\u30fc\u30b8\u30e7\u30f3: {1} \n\
-\u30d3\u30eb\u30c9\u30fb\u30e9\u30d9\u30eb: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/ko/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/ko/about.properties
deleted file mode 100644
index 38c66f0..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/ko/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF \uae30\ubcf8
-
-featureText=EPF \uae30\ubcf8\n\
-\n\
-\ubc84\uc804: {1} \n\
-\ube4c\ub4dc \ub808\uc774\ube14: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/pt/BR/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/pt/BR/about.properties
deleted file mode 100644
index 7dfc9f2..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/pt/BR/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=Base EPF
-
-featureText=Base EPF\n\
-\n\
-Vers\u00e3o: {1} \n\
-Constru\u00e7\u00e3o: {0}\n\
-\n\
-(c) Copyright contribuidores Eclipse e outros 2000, 2007. Todos os Direitos Reservados.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/ru/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/ru/about.properties
deleted file mode 100644
index 9a7b92a..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/ru/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442 EPF
-
-featureText=\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442 EPF\n\
-\n\
-\u0412\u0435\u0440\u0441\u0438\u044f: {1} \n\
-\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/zh/CN/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/zh/CN/about.properties
deleted file mode 100644
index 694ab28..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/zh/CN/about.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Base
-
-featureText=EPF Base\n\
-\n\
-\u7248\u672c\uff1a{1} \n\
-\u5de5\u4f5c\u7248\u672c\u6807\u7b7e\uff1a{0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n \n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/nl/zh/TW/about.properties b/1.5/plugins/org.eclipse.epf.base/nl/zh/TW/about.properties
deleted file mode 100644
index ca20107..0000000
--- a/1.5/plugins/org.eclipse.epf.base/nl/zh/TW/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Base
-
-featureText=EPF Base\n\
-\n\
-\u7248\u672c\uff1a{1}\n\
-\u5efa\u7f6e\u6a19\u7c64\uff1a{0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.base/plugin.properties b/1.5/plugins/org.eclipse.epf.base/plugin.properties
deleted file mode 100644
index 6b7389c..0000000
--- a/1.5/plugins/org.eclipse.epf.base/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-featurePluginName=EPF Base Feature
-featurePluginNameNL=EPF Base Feature (NL1)
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.base/welcome.xml b/1.5/plugins/org.eclipse.epf.base/welcome.xml
deleted file mode 100644
index b640d04..0000000
--- a/1.5/plugins/org.eclipse.epf.base/welcome.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?> 
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<welcomePage 
-	title="Eclipse Process Framework">
-
-<intro>Welcome to Eclipse Process Framework
-</intro>
-
-<item><b>What is Eclipse Process Framework?</b>
-	
-</item>
-
-<item><b>Learn More</b>
-
-</item>
-
-</welcomePage>
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/.classpath b/1.5/plugins/org.eclipse.epf.common.ui/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/.project b/1.5/plugins/org.eclipse.epf.common.ui/.project
deleted file mode 100644
index 93ce6a0..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.common.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/.settings/org.eclipse.pde.core.prefs b/1.5/plugins/org.eclipse.epf.common.ui/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index dda8a84..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Fri Jan 04 15:09:09 PST 2008
-eclipse.preferences.version=1
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.common.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index c2c9375..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Ui Plug-in
-Bundle-SymbolicName: org.eclipse.epf.common.ui
-Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.epf.common.ui.CommonUIPlugin
-Import-Package: org.osgi.framework;version="1.3.0"
-Eclipse-LazyStart: true
-Require-Bundle: org.eclipse.ui;visibility:=reexport,
- org.eclipse.epf.common;visibility:=reexport
-Export-Package: org.eclipse.epf.common.ui,
- org.eclipse.epf.common.ui.util
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/build.properties b/1.5/plugins/org.eclipse.epf.common.ui/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/AbstractPlugin.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/AbstractPlugin.java
deleted file mode 100644
index 09ea8e9..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/AbstractPlugin.java
+++ /dev/null
@@ -1,533 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.AbstractActivator;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.I18nUtil;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * The abstract base class for all EPF plug-ins.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public abstract class AbstractPlugin extends AbstractUIPlugin {
-
-
-	// The relative path to the icons.
-	private static final String ICON_PATH = "icons/"; //$NON-NLS-1$;
-
-	// The logger hash map.
-	private static Map<String, Logger> loggers = new HashMap<String, Logger>();
-
-	// The message dialog hash map.
-	private static Map<String, MsgDialog> msgDialogs = new HashMap<String, MsgDialog>();
-
-	// The shared image hash map.
-	private static Map<String, Image> sharedImages = new HashMap<String, Image>();
-
-	// The resource bundle for this plug-in.
-	private ResourceBundle resourceBundle;
-
-	// This plug-in ID.
-	private String pluginId;
-
-	// The plug-in install URL.
-	private URL installURL;
-
-	// The plug-in install path.
-	private String installPath;
-
-	// The plug-in icon URL.
-	private URL iconURL;
-
-	// The profiling flag.
-	private boolean profiling;
-
-	/**
-	 * Default constructor.
-	 */
-	public AbstractPlugin() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		init(context);
-
-		// set the 
-		if (isDebugging()) {
-			getLogger().logInfo("Started " + pluginId); //$NON-NLS-1$			
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		// Free the shared images.
-		for (Iterator images = sharedImages.values().iterator(); images
-				.hasNext();) {
-			Image image = (Image) images.next();
-			if (image != null && !image.isDisposed()) {
-				image.dispose();
-			}
-		}
-
-		super.stop(context);
-
-		if (isDebugging()) {
-			getLogger().logInfo("Stopped " + pluginId); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Initializes this plug-in.
-	 * 
-	 * @param context
-	 *            The bundle context.
-	 */
-	protected void init(BundleContext context) throws Exception {
-		// Get the bundle for this plug-in.
-		Bundle bundle = getBundle();
-
-		// Get the resouce bundle for this plug-in.
-		resourceBundle = Platform.getResourceBundle(bundle);
-
-		// Get the ID for this plug-in.
-		pluginId = bundle.getSymbolicName();
-
-		if (isDebugging()) {
-			getLogger().logInfo("Initializing " + pluginId); //$NON-NLS-1$		
-		}
-
-		// Get the install path of this plug-in.
-		installURL = bundle.getEntry("/"); //$NON-NLS-1$
-
-		try {
-			installPath = FileLocator.resolve(installURL).getPath();
-		} catch (IOException e) {
-			installPath = Platform.getInstallLocation().getURL().getPath();
-		}
-
-		try {
-			iconURL = new URL(installURL, ICON_PATH);
-		} catch (IOException e) {
-		}
-
-		String symbolicName = bundle.getSymbolicName();
-		if (symbolicName != null) {
-			String key = symbolicName + "/profiling"; //$NON-NLS-1$
-			String value = InternalPlatform.getDefault().getOption(key);
-			profiling = value == null ? false : value.equalsIgnoreCase("true"); //$NON-NLS-1$
-		}
-
-		if (isDebugging()) {
-			getLogger().logInfo(
-					"Initialized " + pluginId + ", installPath=" + installPath); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * Returns the ID of this plug-in.
-	 * 
-	 * @return The ID of this plug-in.
-	 */
-	public String getId() {
-		return pluginId;
-	}
-
-	/**
-	 * Returns the install URL of this plug-in.
-	 * 
-	 * @param The
-	 *            install URL of this plug-in.
-	 */
-	public URL getInstallURL() {
-		return installURL;
-	}
-
-	/**
-	 * Returns the install path of this plug-in.
-	 * 
-	 * @param The
-	 *            install path of this plug-in.
-	 */
-	public String getInstallPath() {
-		return installPath;
-	}
-
-	/**
-	 * Loads and returns the localized properties of a Java properties file.
-	 * <p>
-	 * 
-	 * @param path
-	 *            The properties file path relative to the plug-in root.
-	 * @return A <code>Properties</code> object.
-	 */
-	public Properties getProperties(String path) throws IOException {
-		Properties props = new Properties();
-		if (path == null) {
-			return props;
-		}
-
-		String filePath = getLocalizedFile(path, true);
-		if (filePath != null) {
-			props.load(new FileInputStream(filePath));
-		}
-
-		return props;
-	}
-
-	/**
-	 * get the locale specific absolute file path name of the given file in the
-	 * plugin.
-	 * 
-	 * @param path
-	 *            The properties file path relative to the plug-in root.
-	 * @return String the locale specific absolute file path name of the given
-	 *         file.
-	 * @throws IOException
-	 */
-	public String getLocalizedFile(String path, boolean useDefault)
-			throws IOException {
-		String filePath = null;
-		String fileName = FileUtil.getFileName(path);
-		int index = path.lastIndexOf(fileName);
-		String pathName = path.substring(0, index);
-
-		Locale locale = Locale.getDefault();
-
-		Bundle bundle = getBundle();
-		Bundle[] bundles = Platform.getFragments(bundle);
-		if (bundles != null) {
-			for (int i = 0; i < bundles.length; i++) {
-				URL entry = bundles[i].getEntry(pathName);
-				if (entry != null) {
-					URL url = FileLocator.resolve(entry);
-					filePath = I18nUtil.getLocalizedFile(url.getPath()
-							+ fileName, locale); 
-					if (filePath != null) {
-						break;
-					}
-				}
-			}
-		}
-
-		if (filePath == null) {
-			URL entry = bundle.getEntry(path);
-			if (entry != null) {
-				URL url = FileLocator.resolve(entry);
-				filePath = I18nUtil.getLocalizedFile(url.getPath(), locale);
-				if (filePath == null && useDefault) {
-					filePath = url.getPath();
-				}
-			}
-		}
-
-		return filePath;
-	}
-
-	/**
-	 * for the given path in the plugin, find the localized files form the nl
-	 * fragemenets and copy the localized files to the destination folder
-	 * 
-	 * @param path
-	 *            String a relative path to the plugin root. The files in this
-	 *            folder will be iterated and their localized files will be
-	 *            copied over
-	 * @param toDir
-	 *            FIle the destination folder
-	 * @param recursive
-	 *            boolean recurively looking for files int the specified folder
-	 * @param useLocaleFileName
-	 *            boolean if true the locale specific file names will be used in
-	 *            the copied destination, otherwise, the locale specific file
-	 *            name will be renamed to the default one in the destination
-	 *            folder
-	 * @throws IOException
-	 */
-	public void copyLocalizedFiles(String path, File toDir, boolean recursive,
-			boolean useLocaleFileName) throws IOException {
-		String pluginPath = getInstallPath();
-		URI pluginUri = new File(pluginPath).toURI();
-		URI pathUri = new File(pluginPath, path).toURI();
-
-		List<File> files = new ArrayList<File>();
-		File f = new File(pluginPath, path);
-		FileUtil.getAllFiles(f, files, recursive);
-
-		// for each file found in the specified folder, get the localized file
-		for (Iterator it = files.iterator(); it.hasNext();) {
-			URI srcUri = ((File) it.next()).toURI();
-
-			// get the relative path of the file to the plugin root, then find
-			// the localized file
-			String relPath = pluginUri.relativize(srcUri).getPath();
-
-			// only get the locale specific file, don't include the default one
-			String localizedFile = getLocalizedFile(relPath, false);
-			if (localizedFile == null) {
-				continue;
-			}
-
-			// need to change the target file path to relative to the path
-			// instead of the plugin root
-			relPath = pathUri.relativize(srcUri).getPath();
-			File srcFile = new File(localizedFile);
-			File targetFile = new File(toDir, relPath);
-			File targetParent = targetFile.getParentFile();
-
-			// copy the file to the desitination
-			// if useLocaleFileName is true, the destination file name should
-			// also use the locale specific file name
-			if (useLocaleFileName) {
-				String fileName = srcFile.getName();
-				targetFile = new File(targetParent, fileName);
-			}
-
-			if (isDebugging()) {
-				System.out.println("Copying localized file: "); //$NON-NLS-1$
-				System.out.println("Source: " + srcFile); //$NON-NLS-1$
-				System.out.println("Target: " + targetFile); //$NON-NLS-1$
-				System.out.println(""); //$NON-NLS-1$
-			}
-
-			try {
-				if (!targetParent.exists()) {
-					targetParent.mkdirs();
-				}
-
-				if (!targetFile.exists()) {
-					targetFile.createNewFile();
-				}
-
-				FileUtil.copyFile(srcFile, targetFile);
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-
-	}
-
-	/**
-	 * Returns the localized resource.
-	 * 
-	 * @param key
-	 *            The resource key.
-	 * @return The localized resource.
-	 */
-	public String getString(String key) {
-		if (resourceBundle != null) {
-			try {
-				return resourceBundle.getString(key);
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the formatted localized message given the resource key and the
-	 * message argument.
-	 * 
-	 * @param key
-	 *            The resource key.
-	 * @param argument
-	 *            The message argument.
-	 * @return The formatted localized message.
-	 */
-	public String formatMessage(String key, Object argument) {
-		if (resourceBundle != null) {
-			try {
-				String msg = resourceBundle.getString(key);
-				Object[] arguments = { argument };
-				return MessageFormat.format(msg, arguments);
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the image URL given the relative path.
-	 * 
-	 * @param relativePath
-	 *            The image's path relative to the plug-in's root.
-	 * @return The image URL.
-	 */
-	public URL getImageURL(String relativePath) {
-		try {
-			URL url = new URL(iconURL, relativePath);
-			return FileLocator.resolve(url);
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * Returns the image descriptor given the relative path.
-	 * 
-	 * @param relativePath
-	 *            The image's path relative to the plug-in's root.
-	 * @return The image descriptor.
-	 */
-	public ImageDescriptor getImageDescriptor(String relativePath) {
-		try {
-			URL url = new URL(iconURL, relativePath);
-			return ImageDescriptor.createFromURL(url);
-		} catch (MalformedURLException e) {
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-	}
-
-	/**
-	 * Returns the image given the relative path.
-	 * <p>
-	 * Note: The returned image need to be freed by the caller.
-	 * 
-	 * @param relativePath
-	 *            The image's path relative to the plug-in's root.
-	 * @return The image.
-	 */
-	public Image getImage(String relativePath) {
-		Image image = null;
-
-		ImageDescriptor imageDescriptor = getImageDescriptor(relativePath);
-		if (imageDescriptor != null) {
-			image = imageDescriptor.createImage(false);
-		}
-
-		return image;
-	}
-
-	/**
-	 * Returns the shared image given the relative path.
-	 * <p>
-	 * Note: The returned image will be automatically freed when the plug-in
-	 * shuts down.
-	 * 
-	 * @param relativePath
-	 *            The image's path relative to the plug-in's root.
-	 * @return The image.
-	 */
-	public Image getSharedImage(String relativePath) {
-		Image image = (Image) sharedImages.get(relativePath);
-		if (image != null) {
-			return image;
-		}
-
-		ImageDescriptor imageDescriptor = getImageDescriptor(relativePath);
-		if (imageDescriptor != null) {
-			image = imageDescriptor.createImage(false);
-			if (image != null) {
-				sharedImages.put(relativePath, image);
-			}
-		}
-
-		return image;
-	}
-
-	/**
-	 * Returns the profiling flag.
-	 * 
-	 * @return <code>true</code> if profiling is enabled for this plu-in
-	 */
-	public boolean isProfiling() {
-		return profiling;
-	}
-
-	/**
-	 * Returns the logger given the plug-in ID.
-	 * 
-	 * @return The new or cached logger.
-	 */
-	public Logger getLogger() {
-		Logger logger = (Logger) loggers.get(pluginId);
-		if (logger == null) {
-			logger = new Logger(this);
-			loggers.put(pluginId, logger);
-		}
-		return logger;
-	}
-	
-	/**
-	 * Returns the message dialog given the plug-in ID.
-	 * 
-	 * @return The new or cached message dialog.
-	 */
-	public MsgDialog getMsgDialog(AbstractActivator plugin) {
-		MsgDialog msgDialog = (MsgDialog) msgDialogs.get(plugin.getId());
-		if (msgDialog == null) {
-			msgDialog = new MsgDialog(plugin, getWorkbench().getDisplay().getActiveShell());
-			msgDialogs.put(plugin.getId(), msgDialog);
-		}
-		return msgDialog;
-	}
-
-	
-	public MsgDialog getMsgDialog() {		
-		MsgDialog msgDialog = (MsgDialog) msgDialogs.get(getId());
-		if (msgDialog == null) {
-			msgDialog = new MsgDialog(this);
-			msgDialogs.put(getId(), msgDialog);
-		}
-		return msgDialog;
-	}
-	
-	/**
-	 * Returns the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated disaply. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null)
-			display = Display.getDefault();
-		return display;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/CommonUIPlugin.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/CommonUIPlugin.java
deleted file mode 100644
index b28084c..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/CommonUIPlugin.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.eclipse.epf.common.ui;
-
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.common.IMessageCallback;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.osgi.framework.BundleContext;
-
-public class CommonUIPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static CommonUIPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CommonUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		
-//		// set the preference store for the common plugin
-		PreferenceStoreWrapper storeWrapper = new PreferenceStoreWrapper(getPreferenceStore());
-		CommonPlugin.getDefault().setPreferenceStore(storeWrapper);
-		
-		// create the message callback context for the non-ui plugins
-		// this is the context for message callback
-		// for eclipse client, this is the Shell object
-		// shell object can't be shared acrooss thread, use a context provider instead
-		//CommonPlugin.getDefault().setContext(MsgBox.getDefaultShell());
-		
-		CommonPlugin.getDefault().setContextProvider(new ContextProvider());
-	
-		// create the MessageCallback to be accessible to the non-ui plugin
-		IMessageCallback msgCallback = new MessageCallback();
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Gets the shared instance.
-	 * 
-	 * @return the shared plug-in instance
-	 */
-	public static CommonUIPlugin getDefault() {
-		return plugin;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/ContextProvider.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/ContextProvider.java
deleted file mode 100644
index 17bf3c8..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/ContextProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.epf.common.ui;
-
-import org.eclipse.epf.common.IContextProvider;
-import org.eclipse.epf.common.ui.util.MsgBox;
-
-/**
- * content provider for non-ui plugins
- * 
- * @author Jinhua Xi
- * @since 1.5
- *
- */
-public class ContextProvider implements IContextProvider {
-
-	public Object getContext() {
-		//TODO: revisit
-		Object ctx = null;
-		try {
-			ctx = CommonUIPlugin.getDefault().getWorkbench().getDisplay().getActiveShell();
-		}
-		catch(Exception e) {
-			//
-		}
-		return ctx != null ? ctx : MsgBox.getDefaultShell();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/MessageCallback.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/MessageCallback.java
deleted file mode 100644
index b08351d..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/MessageCallback.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.eclipse.epf.common.ui;
-
-import org.eclipse.epf.common.AbstractActivator;
-import org.eclipse.epf.common.IMessageCallback;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-
-/**
- * message callback implementation
- * 
- * @author Jinhua Xi
- * @since 1.5
- *
- */
-public class MessageCallback implements IMessageCallback {
-
-	public void displayWarning(AbstractActivator plugin, String title, String msg, String reason) {
-		displayWarning(plugin, title, msg, reason, null, null);		
-	}
-	
-	public void displayWarning(AbstractActivator plugin, String msg, String reason, Throwable ex) {
-		displayWarning(plugin, msg, reason, null, ex);
-	}
-
-	public void displayWarning(AbstractActivator plugin, String msg, String reason,
-			String details, Throwable ex) {
-		String title = CommonUIPlugin.getDefault().getWorkbench().getDisplay().getActiveShell().getText();
-		displayWarning(plugin, title, msg, reason, details, ex);
-	}
-	
-	public void displayWarning(AbstractActivator plugin, String title, String msg, String reason,
-			String details, Throwable ex) {
-		MsgDialog dlg = CommonUIPlugin.getDefault().getMsgDialog(plugin);
-		dlg.displayWarning(title, msg, reason, details, ex);
-	}
-	
-	public void displayError(AbstractActivator plugin, String title, String msg) {
-		displayError(plugin, title, msg, null, null, null);
-	}
-	
-	public void displayError(AbstractActivator plugin, String title, String msg, Throwable ex) {
-		displayError(plugin, title, msg, null, null, ex);
-	}
-	public void displayError(AbstractActivator plugin, String title, String msg, String reason, String details, Throwable ex) {
-		MsgDialog dlg = CommonUIPlugin.getDefault().getMsgDialog(plugin);
-		dlg.displayError(title, msg, reason, details, ex);
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/PreferenceStoreWrapper.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/PreferenceStoreWrapper.java
deleted file mode 100644
index 81ee475..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/PreferenceStoreWrapper.java
+++ /dev/null
@@ -1,522 +0,0 @@
-package org.eclipse.epf.common.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeListenerWrapper;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * wrapper class for preference store
- * 
- * @author Jinhua Xi
- * @since 1.5
- *
- */
-public class PreferenceStoreWrapper implements IPreferenceStoreWrapper {
-	private IPreferenceStore store;
-	public PreferenceStoreWrapper(IPreferenceStore store) {
-		this.store = store;
-	}
-	
-	Map<IPropertyChangeListenerWrapper, IPropertyChangeListener> listenerMap = new HashMap<IPropertyChangeListenerWrapper, IPropertyChangeListener>();
-	
-	public IPreferenceStore getStore() {
-		return store;
-	}
-
-	public void addPropertyChangeListener(final IPropertyChangeListenerWrapper listener) {
-		// create a PropertyChangeListener and add to the store
-		IPropertyChangeListener pcl = new IPropertyChangeListener(){
-
-			public void propertyChange(PropertyChangeEvent event) {
-				PropertyChangeEventWrapper wrapper = new PropertyChangeEventWrapper(event);
-				listener.propertyChange(wrapper);
-				
-			}};
-		
-		listenerMap.put(listener, pcl);
-		store.addPropertyChangeListener(pcl);
-	}
-	
-	public void firePropertyChangeEvent(String name, Object oldValue,
-	            Object newValue) {
-		store.firePropertyChangeEvent(name, oldValue, newValue);
-	}
-
-    public void removePropertyChangeListener(IPropertyChangeListenerWrapper listener) {
-    	IPropertyChangeListener pcl = listenerMap.remove(listener);
-    	if ( pcl != null ) {
-    		store.removePropertyChangeListener(pcl);
-    	}
-    }
-
-	/**
-     * Returns the current value of the boolean-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>false</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a boolean.
-     *
-     * @param name the name of the preference
-     * @return the boolean-valued preference
-     */
-    public boolean getBoolean(String name) {
-    	return store.getBoolean(name);
-    }
-
-    /**
-     * Returns the default value for the boolean-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>false</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a boolean.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public boolean getDefaultBoolean(String name) {
-    	return store.getDefaultBoolean(name);
-    }
-
-    /**
-     * Returns the default value for the double-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0.0</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a double.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public double getDefaultDouble(String name) {
-    	return store.getDefaultDouble(name);
-    }
-
-    /**
-     * Returns the default value for the float-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0.0f</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a float.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public float getDefaultFloat(String name) {
-    	return store.getDefaultFloat(name);
-    }
-
-    /**
-     * Returns the default value for the integer-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as an integer.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public int getDefaultInt(String name) {
-    	return store.getDefaultInt(name);
-    }
-
-    /**
-     * Returns the default value for the long-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0L</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a long.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public long getDefaultLong(String name) {
-    	return store.getDefaultLong(name);
-    }
-
-    /**
-     * Returns the default value for the string-valued preference
-     * with the given name.
-     * Returns the default-default value (the empty string <code>""</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a string.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public String getDefaultString(String name) {
-    	return store.getDefaultString(name);
-    }
-
-    /**
-     * Returns the current value of the double-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0.0</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a double.
-     *
-     * @param name the name of the preference
-     * @return the double-valued preference
-     */
-    public double getDouble(String name) {
-    	return store.getDouble(name);
-    }
-
-    /**
-     * Returns the current value of the float-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0.0f</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a float.
-     *
-     * @param name the name of the preference
-     * @return the float-valued preference
-     */
-    public float getFloat(String name) {
-    	return store.getFloat(name);
-    }
-
-    /**
-     * Returns the current value of the integer-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as an integter.
-     *
-     * @param name the name of the preference
-     * @return the int-valued preference
-     */
-    public int getInt(String name) {
-    	return store.getInt(name);
-    }
-
-    /**
-     * Returns the current value of the long-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0L</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a long.
-     *
-     * @param name the name of the preference
-     * @return the long-valued preference
-     */
-    public long getLong(String name) {
-    	return store.getLong(name);
-    }
-
-    /**
-     * Returns the current value of the string-valued preference with the
-     * given name.
-     * Returns the default-default value (the empty string <code>""</code>)
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as a string.
-     *
-     * @param name the name of the preference
-     * @return the string-valued preference
-     */
-    public String getString(String name) {
-    	return store.getString(name);
-    }
-
-    /**
-     * Returns whether the current value of the preference with the given name
-     * has the default value.
-     *
-     * @param name the name of the preference
-     * @return <code>true</code> if the preference has a known default value
-     * and its current value is the same, and <code>false</code> otherwise
-     * (including the case where the preference is unknown to this store)
-     */
-    public boolean isDefault(String name) {
-    	return store.isDefault(name);
-    }
-
-    /**
-     * Returns whether the current values in this property store
-     * require saving.
-     *
-     * @return <code>true</code> if at least one of values of 
-     *  the preferences known to this store has changed and 
-     *  requires saving, and <code>false</code> otherwise.
-     */
-    public boolean needsSaving() {
-    	return store.needsSaving();
-    }
-
-    /**
-     * Sets the current value of the preference with the given name to
-     * the given string value without sending a property change.
-     * <p>
-     * This method does not fire a property change event and 
-     * should only be used for setting internal preferences 
-     * that are not meant to be processed by listeners.
-     * Normal clients should instead call #setValue.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void putValue(String name, String value) {
-    	store.putValue(name, value);
-    }
-
-    /**
-     * Sets the default value for the double-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, double value) {
-    	store.setDefault(name, value);
-    }
-
-    /**
-     * Sets the default value for the float-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, float value) {
-    	store.setDefault(name, value);
-    }
-
-    /**
-     * Sets the default value for the integer-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, int value) {
-    	store.setDefault(name, value);
-    }
-
-    /**
-     * Sets the default value for the long-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, long value) {
-    	store.setDefault(name, value);
-    }
-
-    /**
-     * Sets the default value for the string-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param defaultObject the new default value for the preference
-     */
-    public void setDefault(String name, String defaultObject) {
-    	store.setDefault(name, defaultObject);
-    }
-
-    /**
-     * Sets the default value for the boolean-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, boolean value) {
-    	store.setDefault(name, value);
-    }
-
-    /**
-     * Sets the current value of the preference with the given name back
-     * to its default value.
-     * <p>
-     * Note that the preferred way of re-initializing a preference to the
-     * appropriate default value is to call <code>setToDefault</code>.
-     * This is implemented by removing the named value from the store, 
-     * thereby exposing the default value.
-     * </p>
-     *
-     * @param name the name of the preference
-     */
-    public void setToDefault(String name) {
-    	store.setToDefault(name);
-    }
-
-    /**
-     * Sets the current value of the double-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, double value) {
-    	store.setValue(name, value);
-    }
-
-    /**
-     * Sets the current value of the float-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, float value) {
-    	store.setValue(name, value);
-    }
-
-    /**
-     * Sets the current value of the integer-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, int value) {
-    	store.setValue(name, value);
-    }
-
-    /**
-     * Sets the current value of the long-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, long value) {
-    	store.setValue(name, value);
-    }
-
-    /**
-     * Sets the current value of the string-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, String value) {
-    	store.setValue(name, value);
-    }
-
-    /**
-     * Sets the current value of the boolean-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, boolean value) {
-    	store.setValue(name, value);
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/PropertyChangeEventWrapper.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/PropertyChangeEventWrapper.java
deleted file mode 100644
index b6698e0..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/PropertyChangeEventWrapper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.eclipse.epf.common.ui;
-
-import org.eclipse.epf.common.preferences.IPropertyChangeEventWrapper;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * wrapper class for property change event
- * 
- * @author Jinhua Xi
- * @since 1.5
- *
- */
-public class PropertyChangeEventWrapper implements IPropertyChangeEventWrapper {
-
-	private PropertyChangeEvent event;
-	public PropertyChangeEventWrapper(PropertyChangeEvent event) {
-		this.event = event;
-	}
-	
-	   /**
-     * Returns the new value of the property.
-     *
-     * @return the new value, or <code>null</code> if not known
-     *  or not relevant (for instance if the property was removed).
-     */
-    public Object getNewValue() {
-        return this.event.getNewValue();
-    }
-
-    /**
-     * Returns the old value of the property.
-     *
-     * @return the old value, or <code>null</code> if not known
-     *  or not relevant (for instance if the property was just
-     *  added and there was no old value).
-     */
-    public Object getOldValue() {
-        return this.event.getOldValue();
-    }
-
-    /**
-     * Returns the name of the property that changed.
-     * <p>
-     * Warning: there is no guarantee that the property name returned
-     * is a constant string.  Callers must compare property names using
-     * equals, not ==.
-     * </p>
-     *
-     * @return the name of the property that changed
-     */
-    public String getProperty() {
-        return this.event.getProperty();
-    }
-    
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/ClipboardUtil.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/ClipboardUtil.java
deleted file mode 100644
index 2abf026..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/ClipboardUtil.java
+++ /dev/null
@@ -1,113 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.HTMLTransfer;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Display;
-import org.osgi.framework.Bundle;
-
-/**
- * Utility class for retrieving data from the clipboard.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ClipboardUtil {
-	
-	/**
-	 * The current clipboard.
-	 */
-	private static Clipboard clipboard;
-
-	private static final String SOURCE_URL = "SourceURL:"; //$NON-NLS-1$
-
-	private static Transfer htmlTransfer = null;
-
-	static {
-		if (SWT.getPlatform().equals("win32")) { //$NON-NLS-1$
-			try {
-				Bundle bundle = Platform
-						.getBundle("org.eclipse.epf.common.win32.win32.x86"); //$NON-NLS-1$
-				Class c = bundle
-						.loadClass("org.eclipse.epf.common.win32.Win32HTMLTransfer"); //$NON-NLS-1$
-				if (c != null) {
-					htmlTransfer = (Transfer) c.newInstance();
-				}
-			} catch (Exception e) {
-				htmlTransfer = null;
-			}
-		}
-	}
-
-	/**
-	 * Gets the HTML source URL from the current clipboard.
-	 * 
-	 * @return the HTML source URL or <code>null</code>
-	 */
-	public static String getHTMLSourceURL() {
-		if (htmlTransfer == null) {
-			return null;
-		}
-
-		Clipboard clipboard = new Clipboard(Display.getCurrent());
-		String sourceURL = null;
-		try {
-			String htmlContent = (String) clipboard.getContents(htmlTransfer);
-			if (htmlContent != null && htmlContent.length() > 0) {
-				int index = htmlContent.indexOf(SOURCE_URL);
-				if (index > 0) {
-					sourceURL = htmlContent.substring(index
-							+ SOURCE_URL.length());
-					sourceURL = sourceURL.substring(0, sourceURL
-							.indexOf(FileUtil.LINE_SEP));
-				}
-			}
-			if (sourceURL != null && sourceURL.indexOf("\\") != -1) { //$NON-NLS-1$
-				// IE provides sourceURL in form "file://C:\foo\bar.htm"
-				// but when the hrefs are resolved, files look like "file:///C:/foo/bar.htm"
-				URL url = new URL(sourceURL);
-				sourceURL = url.toExternalForm();
-				if (sourceURL.startsWith("file://") && !sourceURL.startsWith("file:///")) { //$NON-NLS-1$ //$NON-NLS-2$
-					// need to add a third / so rte.js can match the sourceURL to hrefs
-					sourceURL = "file:///" + sourceURL.substring(7); //$NON-NLS-1$
-				}
-			}
-			return sourceURL;
-		} catch (MalformedURLException urlEx) {
-			return sourceURL;
-		} finally {
-			clipboard.dispose();
-		}
-	}
-
-	/**
-	 * Copy the string to the clipboard.
-	 */
-	public static void copyTextHTMLToClipboard(String string) {
-		if (clipboard != null)
-			clipboard.dispose();
-		clipboard = new Clipboard(null);
-		clipboard.setContents(new Object[] { string, string },
-				new Transfer[] { TextTransfer.getInstance(), HTMLTransfer.getInstance() });
-		if (clipboard != null)
-			clipboard.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/CommonPreferences.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/CommonPreferences.java
deleted file mode 100644
index 867c630..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/CommonPreferences.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.epf.common.ui.util;
-
-import org.eclipse.epf.common.ui.CommonUIPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Manages the common preferences.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class CommonPreferences {
-
-	/**
-	 * Preference key for storing the preference history size.
-	 */
-	private static final String PREFERENCE_HISTORY_SIZE = "preferenceHistorySize"; //$NON-NLS-1$
-
-	// The plug-in specific preference store.
-	private static IPreferenceStore prefStore = CommonUIPlugin.getDefault()
-			.getPreferenceStore();
-
-	static {
-		// Initialize the default preference values.
-		prefStore.setDefault(PREFERENCE_HISTORY_SIZE,
-				getDefaultPreferenceHistorySize());
-	}
-
-	/**
-	 * Gets the default preference history size.
-	 */
-	public static int getDefaultPreferenceHistorySize() {
-		return 10;
-	}
-
-	/**
-	 * Gets the preference history size.
-	 */
-	public static int getPreferenceHistorySize() {
-		return prefStore.getInt(PREFERENCE_HISTORY_SIZE);
-	}
-
-	/**
-	 * Saves the preference history size.
-	 */
-	public static void setPreferenceHistorySize(int value) {
-		prefStore.setValue(PREFERENCE_HISTORY_SIZE, value);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/ErrorDialogNoReason.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/ErrorDialogNoReason.java
deleted file mode 100644
index a1271c6..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/ErrorDialogNoReason.java
+++ /dev/null
@@ -1,598 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IconAndMessageDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Displays an error dialog without the Details button.
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-public class ErrorDialogNoReason extends IconAndMessageDialog {
-
-	/**
-	 * Static to prevent opening of error dialogs for automated testing.
-	 */
-	public static final boolean AUTOMATED_MODE = false;
-
-	/**
-	 * Reserve room for this many list items.
-	 */
-	private static final int LIST_ITEM_COUNT = 7;
-
-	/**
-	 * The nesting indent.
-	 */
-	private static final String NESTING_INDENT = "  "; //$NON-NLS-1$
-
-	/**
-	 * The Details button.
-	 */
-	protected Button detailsButton;
-
-	/**
-	 * The title of the dialog.
-	 */
-	private String title;
-
-	/**
-	 * The SWT list control that displays the error details.
-	 */
-	private List list;
-
-	/**
-	 * Indicates whether the error details viewer is currently created.
-	 */
-	private boolean listCreated = false;
-
-	/**
-	 * Filter mask for determining which status items to display.
-	 */
-	private int displayMask = 0xFFFF;
-
-	/**
-	 * The main status object.
-	 */
-	private IStatus status;
-
-	/**
-	 * The current clipboard. To be disposed when closing the dialog.
-	 */
-	private Clipboard clipboard;
-
-	private boolean shouldIncludeTopLevelErrorInDetails = false;
-
-	/**
-	 * Creates an error dialog. Note that the dialog will have no visual
-	 * representation (no widgets) until it is told to open.
-	 * <p>
-	 * Normally one should use <code>openError</code> to create and open one
-	 * of these. This constructor is useful only if the error object being
-	 * displayed contains child items <it>and </it> you need to specify a mask
-	 * which will be used to filter the displaying of these children.
-	 * </p>
-	 * 
-	 * @param parentShell
-	 *            the shell under which to create this dialog
-	 * @param dialogTitle
-	 *            the title to use for this dialog, or <code>null</code> to
-	 *            indicate that the default title should be used
-	 * @param message
-	 *            the message to show in this dialog, or <code>null</code> to
-	 *            indicate that the error's message should be shown as the
-	 *            primary message
-	 * @param status
-	 *            the error to show to the user
-	 * @param displayMask
-	 *            the mask to use to filter the displaying of child items, as
-	 *            per <code>IStatus.matches</code>
-	 * @see org.eclipse.core.runtime.IStatus#matches(int)
-	 */
-	public ErrorDialogNoReason(Shell parentShell, String dialogTitle,
-			String message, IStatus status, int displayMask) {
-		super(parentShell);
-		this.title = dialogTitle == null ? JFaceResources
-				.getString("Problem_Occurred") : //$NON-NLS-1$
-				dialogTitle;
-		this.message = message == null ? status.getMessage() : message; 
-		this.status = status;
-		this.displayMask = displayMask;
-		setShellStyle(getShellStyle() | SWT.RESIZE);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog. Handles the pressing of the Ok
-	 * or Details button in this dialog. If the Ok button was pressed then close
-	 * this dialog. If the Details button was pressed then toggle the displaying
-	 * of the error details area. Note that the Details button will only be
-	 * visible if the error being displayed specifies child details.
-	 */
-	protected void buttonPressed(int id) {
-		if (id == IDialogConstants.DETAILS_ID) {
-			// was the details button pressed?
-			toggleDetailsArea();
-		} else {
-			super.buttonPressed(id);
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared in Window.
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		shell.setText(title);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Details buttons
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-		if (shouldShowDetailsButton()) {
-			detailsButton = createButton(parent, IDialogConstants.DETAILS_ID,
-					IDialogConstants.SHOW_DETAILS_LABEL, false);
-		}
-	}
-
-	/**
-	 * This implementation of the <code>Dialog</code> framework method creates
-	 * and lays out a composite and calls <code>createMessageArea</code> and
-	 * <code>createCustomArea</code> to populate it. Subclasses should
-	 * override <code>createCustomArea</code> to add contents below the
-	 * message.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		createMessageArea(parent);
-		// create a composite with standard margins and spacing
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		layout.numColumns = 2;
-		composite.setLayout(layout);
-		GridData childData = new GridData(GridData.FILL_BOTH);
-		childData.horizontalSpan = 2;
-		composite.setLayoutData(childData);
-		composite.setFont(parent.getFont());
-		return composite;
-	}
-
-	/*
-	 * @see IconAndMessageDialog#createDialogAndButtonArea(Composite)
-	 */
-	protected void createDialogAndButtonArea(Composite parent) {
-		super.createDialogAndButtonArea(parent);
-		if (this.dialogArea instanceof Composite) {
-			// Create a label if there are no children to force a smaller layout
-			Composite dialogComposite = (Composite) dialogArea;
-			if (dialogComposite.getChildren().length == 0)
-				new Label(dialogComposite, SWT.NULL);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IconAndMessageDialog#getImage()
-	 */
-	protected Image getImage() {
-		if (status != null) {
-			if (status.getSeverity() == IStatus.WARNING)
-				return getWarningImage();
-			if (status.getSeverity() == IStatus.INFO)
-				return getInfoImage();
-		}
-		// If it was not a warning or an error then return the error image
-		return getErrorImage();
-	}
-
-	/**
-	 * Create this dialog's drop-down list component.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return the drop-down list component
-	 */
-	protected List createDropDownList(Composite parent) {
-		// create the list
-		list = new List(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.MULTI);
-		// fill the list
-		populateList(list);
-		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL
-				| GridData.GRAB_VERTICAL);
-		data.heightHint = list.getItemHeight() * LIST_ITEM_COUNT;
-		data.horizontalSpan = 2;
-		list.setLayoutData(data);
-		list.setFont(parent.getFont());
-		Menu copyMenu = new Menu(list);
-		MenuItem copyItem = new MenuItem(copyMenu, SWT.NONE);
-		copyItem.addSelectionListener(new SelectionListener() {
-			/*
-			 * @see SelectionListener.widgetSelected (SelectionEvent)
-			 */
-			public void widgetSelected(SelectionEvent e) {
-				copyToClipboard();
-			}
-
-			/*
-			 * @see SelectionListener.widgetDefaultSelected(SelectionEvent)
-			 */
-			public void widgetDefaultSelected(SelectionEvent e) {
-				copyToClipboard();
-			}
-		});
-		copyItem.setText(JFaceResources.getString("copy")); //$NON-NLS-1$
-		list.setMenu(copyMenu);
-		listCreated = true;
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Window.
-	 */
-	/**
-	 * Extends <code>Window.open()</code>. Opens an error dialog to display
-	 * the error. If you specified a mask to filter the displaying of these
-	 * children, the error dialog will only be displayed if there is at least
-	 * one child status matching the mask.
-	 */
-	public int open() {
-		if (!AUTOMATED_MODE && shouldDisplay(status, displayMask)) {
-			return super.open();
-		}
-		setReturnCode(OK);
-		return OK;
-	}
-
-	/**
-	 * Opens an error dialog to display the given error. Use this method if the
-	 * error object being displayed does not contain child items, or if you wish
-	 * to display all such items without filtering.
-	 * 
-	 * @param parent
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param dialogTitle
-	 *            the title to use for this dialog, or <code>null</code> to
-	 *            indicate that the default title should be used
-	 * @param message
-	 *            the message to show in this dialog, or <code>null</code> to
-	 *            indicate that the error's message should be shown as the
-	 *            primary message
-	 * @param status
-	 *            the error to show to the user
-	 * @return the code of the button that was pressed that resulted in this
-	 *         dialog closing. This will be <code>Dialog.OK</code> if the OK
-	 *         button was pressed, or <code>Dialog.CANCEL</code> if this
-	 *         dialog's close window decoration or the ESC key was used.
-	 */
-	public static int openError(Shell parent, String dialogTitle,
-			String message, IStatus status) {
-		return openError(parent, dialogTitle, message, status, IStatus.OK
-				| IStatus.INFO | IStatus.WARNING | IStatus.ERROR);
-	}
-
-	/**
-	 * Opens an error dialog to display the given error. Use this method if the
-	 * error object being displayed contains child items <it>and </it> you wish
-	 * to specify a mask which will be used to filter the displaying of these
-	 * children. The error dialog will only be displayed if there is at least
-	 * one child status matching the mask.
-	 * 
-	 * @param parentShell
-	 *            the parent shell of the dialog, or <code>null</code> if none
-	 * @param title
-	 *            the title to use for this dialog, or <code>null</code> to
-	 *            indicate that the default title should be used
-	 * @param message
-	 *            the message to show in this dialog, or <code>null</code> to
-	 *            indicate that the error's message should be shown as the
-	 *            primary message
-	 * @param status
-	 *            the error to show to the user
-	 * @param displayMask
-	 *            the mask to use to filter the displaying of child items, as
-	 *            per <code>IStatus.matches</code>
-	 * @return the code of the button that was pressed that resulted in this
-	 *         dialog closing. This will be <code>Dialog.OK</code> if the OK
-	 *         button was pressed, or <code>Dialog.CANCEL</code> if this
-	 *         dialog's close window decoration or the ESC key was used.
-	 * @see org.eclipse.core.runtime.IStatus#matches(int)
-	 */
-	public static int openError(Shell parentShell, String title,
-			String message, IStatus status, int displayMask) {
-		ErrorDialogNoReason dialog = new ErrorDialogNoReason(parentShell,
-				title, message, status, displayMask);
-		return dialog.open();
-	}
-
-	/**
-	 * Populates the list using this error dialog's status object. This walks
-	 * the child static of the status object and displays them in a list. The
-	 * format for each entry is status_path : status_message If the status's
-	 * path was null then it (and the colon) are omitted.
-	 * 
-	 * @param listToPopulate
-	 *            The list to fill.
-	 */
-	private void populateList(List listToPopulate) {
-		populateList(listToPopulate, status, 0,
-				shouldIncludeTopLevelErrorInDetails);
-	}
-
-	/**
-	 * Populate the list with the messages from the given status. Traverse the
-	 * children of the status deeply and also traverse CoreExceptions that
-	 * appear in the status.
-	 * 
-	 * @param listToPopulate
-	 *            the list to populate
-	 * @param buildingStatus
-	 *            the status being displayed
-	 * @param nesting
-	 *            the nesting level (increases one level for each level of
-	 *            children)
-	 * @param includeStatus
-	 *            whether to include the buildingStatus in the display or just
-	 *            its children
-	 */
-	private void populateList(List listToPopulate, IStatus buildingStatus,
-			int nesting, boolean includeStatus) {
-
-		if (!buildingStatus.matches(displayMask)) {
-			return;
-		}
-
-		Throwable t = buildingStatus.getException();
-		boolean isCoreException = t instanceof CoreException;
-		boolean incrementNesting = false;
-
-		if (includeStatus) {
-			StringBuffer sb = new StringBuffer();
-			for (int i = 0; i < nesting; i++) {
-				sb.append(NESTING_INDENT); 
-			}
-			String message = buildingStatus.getMessage();
-			sb.append(message);
-			listToPopulate.add(sb.toString());
-			incrementNesting = true;
-		}
-
-		if (!isCoreException && t != null) {
-			// Include low-level exception message
-			StringBuffer sb = new StringBuffer();
-			for (int i = 0; i < nesting; i++) {
-				sb.append(NESTING_INDENT); 
-			}
-			String message = t.getLocalizedMessage();
-			if (message == null)
-				message = t.toString();
-
-			sb.append(message);
-			listToPopulate.add(sb.toString());
-			incrementNesting = true;
-		}
-
-		if (incrementNesting)
-			nesting++;
-
-		// Look for a nested core exception
-		if (isCoreException) {
-			CoreException ce = (CoreException) t;
-			IStatus eStatus = ce.getStatus();
-			// Only print the exception message if it is not contained in the
-			// parent message
-			if (message == null || message.indexOf(eStatus.getMessage()) == -1) {
-				populateList(listToPopulate, eStatus, nesting, true);
-			}
-		}
-
-		// Look for child status
-		IStatus[] children = buildingStatus.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			populateList(listToPopulate, children[i], nesting, true);
-		}
-	}
-
-	/**
-	 * Returns whether the given status object should be displayed.
-	 * 
-	 * @param status
-	 *            a status object
-	 * @param mask
-	 *            a mask as per <code>IStatus.matches</code>
-	 * @return <code>true</code> if the given status should be displayed, and
-	 *         <code>false</code> otherwise
-	 * @see org.eclipse.core.runtime.IStatus#matches(int)
-	 */
-	protected static boolean shouldDisplay(IStatus status, int mask) {
-		IStatus[] children = status.getChildren();
-		if (children == null || children.length == 0) {
-			return status.matches(mask);
-		}
-		for (int i = 0; i < children.length; i++) {
-			if (children[i].matches(mask))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Toggles the unfolding of the details area. This is triggered by the user
-	 * pressing the details button.
-	 */
-	private void toggleDetailsArea() {
-		Point windowSize = getShell().getSize();
-		Point oldSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		if (listCreated) {
-			list.dispose();
-			listCreated = false;
-			detailsButton.setText(IDialogConstants.SHOW_DETAILS_LABEL);
-		} else {
-			list = createDropDownList((Composite) getContents());
-			detailsButton.setText(IDialogConstants.HIDE_DETAILS_LABEL);
-		}
-		Point newSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		getShell()
-				.setSize(
-						new Point(windowSize.x, windowSize.y
-								+ (newSize.y - oldSize.y)));
-	}
-
-	/**
-	 * Put the details of the status of the error onto the stream.
-	 * 
-	 * @param buildingStatus
-	 * @param buffer
-	 * @param nesting
-	 */
-	private void populateCopyBuffer(IStatus buildingStatus,
-			StringBuffer buffer, int nesting) {
-		if (!buildingStatus.matches(displayMask)) {
-			return;
-		}
-		for (int i = 0; i < nesting; i++) {
-			buffer.append(NESTING_INDENT); 
-		}
-		buffer.append(buildingStatus.getMessage());
-		buffer.append("\n"); //$NON-NLS-1$
-
-		// Look for a nested core exception
-		Throwable t = buildingStatus.getException();
-		if (t instanceof CoreException) {
-			CoreException ce = (CoreException) t;
-			populateCopyBuffer(ce.getStatus(), buffer, nesting + 1);
-		}
-
-		IStatus[] children = buildingStatus.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			populateCopyBuffer(children[i], buffer, nesting + 1);
-		}
-	}
-
-	/**
-	 * Copy the contents of the statuses to the clipboard.
-	 */
-	private void copyToClipboard() {
-		if (clipboard != null)
-			clipboard.dispose();
-		StringBuffer statusBuffer = new StringBuffer();
-		populateCopyBuffer(status, statusBuffer, 0);
-		clipboard = new Clipboard(list.getDisplay());
-		clipboard.setContents(new Object[] { statusBuffer.toString() },
-				new Transfer[] { TextTransfer.getInstance() });
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#close()
-	 */
-	public boolean close() {
-		if (clipboard != null)
-			clipboard.dispose();
-		return super.close();
-	}
-
-	/**
-	 * Show the details portion of the dialog if it is not already visible. This
-	 * method will only work when it is invoked after the control of the dialog
-	 * has been set. In other words, after the <code>createContents</code>
-	 * method has been invoked and has returned the control for the content area
-	 * of the dialog. Invoking the method before the content area has been set
-	 * or after the dialog has been disposed will have no effect.
-	 * 
-	 * @since 3.1
-	 */
-	protected final void showDetailsArea() {
-		if (!listCreated) {
-			Control control = getContents();
-			if (control != null && !control.isDisposed())
-				toggleDetailsArea();
-		}
-	}
-
-	/**
-	 * Return whether the Details button should be included. This method is
-	 * invoked once when the dialog is built. By default, the Details button is
-	 * only included if the status used when creating the dialog was a
-	 * multi-status or if the status contains an exception. Subclasses may
-	 * override.
-	 * 
-	 * @return whether the Details button should be included
-	 * @since 3.1
-	 */
-	protected boolean shouldShowDetailsButton() {
-		return status.isMultiStatus() || status.getException() != null;
-	}
-
-	/**
-	 * Set the status displayed by this error dialog to the given status. This
-	 * only affects the status displayed by the Details list. The message, image
-	 * and title should be updated by the subclass, if desired.
-	 * 
-	 * @param status
-	 *            the status to be displayed in the details list
-	 * @since 3.1
-	 */
-	protected final void setStatus(IStatus status) {
-		if (this.status != status) {
-			this.status = status;
-		}
-		shouldIncludeTopLevelErrorInDetails = true;
-		if (listCreated) {
-			repopulateList();
-		}
-	}
-
-	/**
-	 * Repopulate the supplied list widget.
-	 */
-	private void repopulateList() {
-		if (list != null && !list.isDisposed()) {
-			list.removeAll();
-			populateList(list);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MenuUtil.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MenuUtil.java
deleted file mode 100644
index 658a661..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MenuUtil.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import org.eclipse.swt.widgets.MenuItem;
-
-/**
- * A helper class for retrieving Eclipse menus.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MenuUtil {
-
-	/**
-	 * Searches an array of menu items and returns the menu item that matches
-	 * the given menu text.
-	 * 
-	 * @param menuItems
-	 *            An array of menu items.
-	 * @param text
-	 *            The text to look for.
-	 * @return The menu item if found, <code>null</code> otherwise.
-	 */
-	public static MenuItem getMenuItem(MenuItem[] menuItems, String text) {
-		if (menuItems == null || text == null || text.length() == 0) {
-			return null;
-		}
-
-		for (int i = 0; i < menuItems.length; i++) {
-			if (menuItems[i].getText().startsWith(text)) {
-				return menuItems[i];
-			}
-		}
-
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MsgBox.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MsgBox.java
deleted file mode 100644
index 2c79eb3..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MsgBox.java
+++ /dev/null
@@ -1,123 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Helper class to display a message box.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public final class MsgBox {
-	/**
-	 * Use this method to show error message if you don't want long path to be
-	 * cut off.
-	 * 
-	 * @param msg
-	 */
-	public static final void nativeShowError(Shell shell, String msg) {
-		if (shell == null) {
-			shell = getDefaultShell();
-			if (shell == null) {
-				return;
-			}
-		}
-		MessageBox msgBox = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
-		msgBox.setMessage(msg);
-		msgBox.setText(shell.getText());
-		msgBox.open();
-	}
-
-	public static final void showError(String msg) {
-		showError(getDefaultShell(), msg);
-	}
-
-	public static final void showError(Shell shell, String msg) {
-		WrappedMessageDialog.openError(shell, shell == null ? null : shell
-				.getText(), msg);
-	}
-
-	public static final void showWarning(String msg) {
-		showWarning(getDefaultShell(), msg);
-	}
-
-	public static final void showWarning(Shell shell, String msg) {
-		WrappedMessageDialog.openWarning(shell, shell == null ? null : shell
-				.getText(), msg);
-	}
-
-	public static final Shell getDefaultShell() {
-		try {
-			Display d = Display.getCurrent();
-			if (d == null) {
-				d = Display.getDefault();
-			}
-
-			Shell s = null;
-			if (d != null) {
-				s = d.getActiveShell();
-			}
-
-			return s;
-		} catch (RuntimeException e) {
-			return null;
-		}
-	}
-
-	public static final Display getDisplay() {
-		try {
-			Display d = Display.getCurrent();
-			if (d == null) {
-				d = Display.getDefault();
-			}
-
-			return d;
-		} catch (RuntimeException e) {
-			return null;
-		}
-	}
-
-	public static final int prompt(String msg) {
-		return prompt(getDefaultShell(), msg);
-	}
-
-	public static final int prompt(Shell shell, String msg) {
-		return prompt(shell, null, msg, SWT.YES | SWT.NO | SWT.CANCEL);
-	}
-
-	public static final int prompt(String msg, int buttons) {
-		return prompt(getDefaultShell(), null, msg, buttons);
-	}
-
-	public static final int prompt(String title, String msg, int buttons) {
-		return prompt(getDefaultShell(), title, msg, buttons);
-	}
-
-	public static final int prompt(Shell shell, String msg, int buttons) {
-		return prompt(shell, null, msg, buttons);
-	}
-
-	public static final int prompt(Shell shell, String title, String msg,
-			int buttons) {
-		MessageBox msgBox = new MessageBox(shell, buttons | SWT.ICON_QUESTION);
-		msgBox.setText(title != null && title.length() > 0 ? title : shell
-				.getText());
-		msgBox.setMessage(msg);
-		return msgBox.open();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MsgDialog.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MsgDialog.java
deleted file mode 100644
index ab700b3..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/MsgDialog.java
+++ /dev/null
@@ -1,628 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.common.AbstractActivator;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A message dialog used for displaying error, warning, confirmation or
- * informational messages.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class MsgDialog {
-
-	// The plug-in instance.
-	private Plugin plugin;
-
-	// The plug-in ID.
-	private String pluginId;
-
-	// The plug-in logger.
-	private Logger logger;
-	
-	private Shell shell;
-
-	/**
-	 * Create a new instance given the plug-in instance.
-	 * 
-	 * @param plugin
-	 *            The plugin instance.
-	 */
-	public MsgDialog(AbstractPlugin plugin) {
-		this.plugin = plugin;
-		this.shell = plugin.getWorkbench().getDisplay().getActiveShell();
-		this.pluginId = plugin.getId();
-		this.logger = plugin.getLogger();
-	}
-
-	public MsgDialog(AbstractActivator plugin, Shell shell) {
-		this.plugin = plugin;
-		this.shell = shell;
-		this.pluginId = plugin.getId();
-		this.logger = plugin.getLogger();
-	}
-	
-	/**
-	 * Displays the given error message in an error dialog without the error
-	 * reason and Details button.
-	 * <p>
-	 * Note: The error message will be written to the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 */
-	public void displayError(String title, String msg) {
-		display(IStatus.ERROR, title, msg, null, null, null);
-	}
-
-	/**
-	 * Displays the given error message in an error dialog without the error
-	 * reason and Details button.
-	 * <p>
-	 * Note: The error message and the exception stack trace will be written to
-	 * the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param ex
-	 *            The exception associated with the error.
-	 */
-	public void displayError(String title, String msg, Throwable ex) {
-		display(IStatus.ERROR, title, msg, null, null, ex);
-	}
-
-	/**
-	 * Displays the given error message in an error dialog without the Details
-	 * button.
-	 * <p>
-	 * Note: The error message will be written to the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param reason
-	 *            The reason for the error.
-	 */
-	public void displayError(String title, String msg, String reason) {
-		display(IStatus.ERROR, title, msg, reason, null, null);
-	}
-
-	/**
-	 * Displays the given error message in an error dialog without the Details
-	 * button.
-	 * <p>
-	 * Note: The error message and the exception stack trace will be written to
-	 * the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param reason
-	 *            The reason for the error.
-	 * @param ex
-	 *            The exception associated with the error.
-	 */
-	public void displayError(String title, String msg, String reason,
-			Throwable ex) {
-		display(IStatus.ERROR, title, msg, reason, null, ex);
-	}
-
-	/**
-	 * Displays the given error message in an error dialog. The Details button
-	 * will be displayed if the <code>details</code> parameter it not null or
-	 * empty.
-	 * <p>
-	 * Note: The error message will be written to the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param reason
-	 *            The reason for the error.
-	 * @param details
-	 *            The error details.
-	 */
-	public void displayError(String title, String msg, String reason,
-			String details) {
-		display(IStatus.ERROR, title, msg, reason, details, null);
-	}
-
-	/**
-	 * Displays the given error message in an error dialog. The Details button
-	 * will be displayed if the <code>details</code> parameter it not null or
-	 * empty.
-	 * <p>
-	 * Note: The error message and the exception stack trace will be written to
-	 * the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param reason
-	 *            The reason for the error.
-	 * @param details
-	 *            The error details.
-	 * @param ex
-	 *            The exception associated with the error.
-	 */
-	public void displayError(String title, String msg, String reason,
-			String details, Throwable ex) {
-		display(IStatus.ERROR, title, msg, reason, details, ex);
-	}
-
-	/**
-	 * Displays the given error status in an error dialog.
-	 * <p>
-	 * Note: The error message and the exception stack trace will be written to
-	 * the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param status
-	 *            The error status.
-	 */
-	public int displayError(String title, IStatus status) {
-		return display(title, null, status);
-	}
-
-	/**
-	 * Displays the given error status in an error dialog.
-	 * <p>
-	 * Note: The error message and the exception stack trace will be written to
-	 * the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param status
-	 *            The error status.
-	 */
-	public int displayError(String title, String msg, IStatus status) {
-		return display(title, msg, status);
-	}
-
-	/**
-	 * Displays the given warning message in a warning dialog without the
-	 * warning reason and Details button.
-	 * <p>
-	 * Note: The waning message will be written to the log file.
-	 * 
-	 * @param title
-	 *            The title for the warning dialog.
-	 * @param msg
-	 *            The warning message.
-	 */
-	public void displayWarning(String title, String msg) {
-		display(IStatus.WARNING, title, msg, null, null, null);
-	}
-	
-	/**
-	 * Displays the given warning message in a warning dialog without the
-	 * warning reason and Details button.
-	 * <p>
-	 * Note: The warning message and the exception stack trace will be written
-	 * to the log file.
-	 * 
-	 * @param title
-	 *            The title for the warning dialog.
-	 * @param msg
-	 *            The warning message.
-	 * @param ex
-	 *            The exception associated with the warning.
-	 */
-	public void displayWarning(String title, String msg, Throwable ex) {
-		display(IStatus.WARNING, title, msg, null, null, ex);
-	}
-
-	/**
-	 * Displays the given warning message in a warning dialog without the
-	 * warning reason and Details button.
-	 * <p>
-	 * Note: The waning message will be written to the log file.
-	 * 
-	 * @param title
-	 *            The title for the warning dialog.
-	 * @param msg
-	 *            The warning message.
-	 * @param reason
-	 *            The reason for the warning.
-	 */
-	public void displayWarning(String title, String msg, String reason) {
-		display(IStatus.WARNING, title, msg, reason, null, null);
-	}
-
-	/**
-	 * Displays the given warning message in a warning dialog without the
-	 * warning reason and Details button.
-	 * <p>
-	 * Note: The warning message and the exception stack trace will be written
-	 * to the log file.
-	 * 
-	 * @param title
-	 *            The title for the warning dialog.
-	 * @param msg
-	 *            The warning message.
-	 * @param reason
-	 *            The reason for the warning.
-	 * @param ex
-	 *            The exception associated with the warning.
-	 */
-	public void displayWarning(String title, String msg, String reason,
-			Throwable ex) {
-		display(IStatus.WARNING, title, msg, reason, null, ex);
-	}
-
-	/**
-	 * Displays the given warning message in a warning dialog. The Details
-	 * button will be displayed if the <code>details</code> parameter it not
-	 * null or empty.
-	 * <p>
-	 * Note: The waning message will be written to the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The warning message.
-	 * @param reason
-	 *            The reason for the warning.
-	 * @param details
-	 *            The warning details.
-	 */
-	public void displayWarning(String title, String msg, String reason,
-			String details) {
-		display(IStatus.WARNING, title, msg, reason, details, null);
-	}
-
-	/**
-	 * Displays the given warning message in a warning dialog. The Details
-	 * button will be displayed if the <code>details</code> parameter it not
-	 * null or empty.
-	 * <p>
-	 * Note: The warning message and the exception stack trace will be written
-	 * to the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The warning message.
-	 * @param reason
-	 *            The reason for the warning.
-	 * @param details
-	 *            The warning details.
-	 * @param ex
-	 *            The exception associated with the warning.
-	 */
-	public void displayWarning(String title, String msg, String reason,
-			String details, Throwable ex) {
-		display(IStatus.WARNING, title, msg, reason, details, ex);
-	}
-
-	/**
-	 * Displays the given warning status in an error dialog.
-	 * <p>
-	 * Note: The warning message and the exception stack trace will be written
-	 * to the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param status
-	 *            The error status.
-	 */
-	public void displayWarning(String title, IStatus status) {
-		display(title, null, status);
-	}
-
-	/**
-	 * Displays the given warning status in an error dialog.
-	 * <p>
-	 * Note: The warning message and the exception stack trace will be written
-	 * to the log file.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param status
-	 *            The error status.
-	 */
-	public void displayWarning(String title, String msg, IStatus status) {
-		display(title, msg, status);
-	}
-
-	/**
-	 * Displays the given error or warning message in an error or warning
-	 * dialog. The Details button will be displayed if the <code>details</code>
-	 * parameter it not null or empty.
-	 * 
-	 * @param severity
-	 *            The severity, either IStatus.ERROR or IStatus.WARNING.
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param reason
-	 *            The reason for the error.
-	 * @param details
-	 *            The error details.
-	 * @param ex
-	 *            The exception associated with the error.
-	 */
-	public synchronized void display(int severity, String title, String msg,
-			String reason, String details, Throwable ex) {
-		if (msg == null && ex != null) {
-			msg = ex.getMessage();
-		}
-
-		if (msg == null) {
-			msg = ""; //$NON-NLS-1$
-		}
-
-		if (severity == IStatus.ERROR || severity == IStatus.WARNING) {
-			logger.logMsg(severity, msg, ex);
-		} else {
-			throw new IllegalArgumentException(
-					"severity argument must be IStatus.ERROR or IStatus.WARNING"); //$NON-NLS-1$
-		}
-
-		Image oldImage = org.eclipse.jface.dialogs.ErrorDialog
-				.getDefaultImage();
-		Image shellImage = getShellImage();
-		if (shellImage != null) {
-			ErrorDialog.setDefaultImage(shellImage);
-		}
-
-		//Shell shell = plugin.getWorkbench().getDisplay().getActiveShell();
-
-		if (details != null && details.length() > 0) {
-			MultiStatus mStatus = new MultiStatus(pluginId, IStatus.OK, reason,
-					ex);
-			Status status = new Status(severity, pluginId, IStatus.OK, details,
-					ex);
-			mStatus.add(status);
-			org.eclipse.jface.dialogs.ErrorDialog.openError(shell, title, msg,
-					mStatus);
-		} else if (reason != null && reason.length() > 0) {
-			Status status = new Status(severity, pluginId, IStatus.OK, reason,
-					ex);
-			org.eclipse.jface.dialogs.ErrorDialog.openError(shell, title, msg,
-					status);
-		} else {
-			if (severity == IStatus.ERROR) {
-				WrappedMessageDialog.openError(shell, title, msg);
-			} else if (severity == IStatus.WARNING) {
-				WrappedMessageDialog.openWarning(shell, title, msg);
-			}
-		}
-
-		if (shellImage != null) {
-			ErrorDialog.setDefaultImage(oldImage);
-		}
-	}
-
-	/**
-	 * Displays the given error or warning message in an error or warning
-	 * dialog. The Details button will be displayed if the <code>details</code>
-	 * parameter it not null or empty.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param status
-	 *            The error status.
-	 */
-	public synchronized int display(String title, IStatus status) {
-		return display(title, null, status);
-	}
-
-	/**
-	 * Displays the given error or warning message in an error or warning
-	 * dialog. The Details button will be displayed if the <code>details</code>
-	 * parameter it not null or empty.
-	 * 
-	 * @param title
-	 *            The title for the error dialog.
-	 * @param msg
-	 *            The error message.
-	 * @param status
-	 *            The error status.
-	 */
-	public synchronized int display(String title, String msg, IStatus status) {
-		if (status == null) {
-			throw new IllegalArgumentException("status argument cannot be null"); //$NON-NLS-1$
-		}
-
-		if (msg == null) {
-			msg = status.getMessage();
-		}
-		if (msg == null) {
-			msg = ""; //$NON-NLS-1$
-		}
-
-		int severity = status.getSeverity();
-		if (severity == IStatus.ERROR || severity == IStatus.WARNING) {
-			logger.logMsg(severity, msg, status.getException());
-		}
-
-		Image oldImage = org.eclipse.jface.dialogs.ErrorDialog
-				.getDefaultImage();
-		Image shellImage = getShellImage();
-		if (shellImage != null) {
-			ErrorDialog.setDefaultImage(shellImage);
-		}
-
-		//Shell shell = plugin.getWorkbench().getDisplay().getActiveShell();
-
-		int rc = org.eclipse.jface.dialogs.ErrorDialog.openError(shell, title,
-				msg, status);
-
-		if (shellImage != null) {
-			ErrorDialog.setDefaultImage(oldImage);
-		}
-
-		return rc;
-	}
-
-	/**
-	 * Displays the given message in a informational dialog with an "OK" button.
-	 * 
-	 * @param title
-	 *            The title for the information dialog.
-	 * @param msg
-	 *            The message to display.
-	 */
-	public void displayInfo(String title, String msg) {
-		if (msg == null) {
-			msg = ""; //$NON-NLS-1$
-		}
-
-		Image oldImage = WrappedMessageDialog.getDefaultImage();
-		Image shellImage = getShellImage();
-		if (shellImage != null) {
-			WrappedMessageDialog.setDefaultImage(shellImage);
-		}
-
-		//Shell shell = plugin.getWorkbench().getDisplay().getActiveShell();
-		WrappedMessageDialog.openInformation(shell, title, msg);
-
-		if (shellImage != null) {
-			WrappedMessageDialog.setDefaultImage(oldImage);
-		}
-	}
-
-	/**
-	 * Displays the given message in a question dialog with a "Yes" and "No"
-	 * button.
-	 * 
-	 * @param title
-	 *            The title for the information dialog.
-	 * @param msg
-	 *            The message to display.
-	 */
-	public boolean displayPrompt(String title, String msg) {
-		if (msg == null) {
-			msg = ""; //$NON-NLS-1$
-		}
-
-		Image oldImage = WrappedMessageDialog.getDefaultImage();
-		Image shellImage = getShellImage();
-		if (shellImage != null) {
-			WrappedMessageDialog.setDefaultImage(shellImage);
-		}
-
-		//Shell shell = plugin.getWorkbench().getDisplay().getActiveShell();
-		boolean result = WrappedMessageDialog.openQuestion(shell, title, msg);
-
-		if (shellImage != null) {
-			WrappedMessageDialog.setDefaultImage(oldImage);
-		}
-
-		return result;
-	}
-
-	/**
-	 * Displays the given message in a confirmation dialog with a "Yes" and
-	 * "Cancel" button.
-	 * 
-	 * @param title
-	 *            The title for the information dialog.
-	 * @param msg
-	 *            The message to display.
-	 */
-	public boolean displayConfirmation(String title, String msg) {
-		if (msg == null) {
-			msg = ""; //$NON-NLS-1$
-		}
-
-		Image oldImage = WrappedMessageDialog.getDefaultImage();
-		Image shellImage = getShellImage();
-		if (shellImage != null) {
-			WrappedMessageDialog.setDefaultImage(shellImage);
-		}
-
-		//Shell shell = plugin.getWorkbench().getDisplay().getActiveShell();
-		boolean result = WrappedMessageDialog.openConfirm(shell, title, msg);
-
-		if (shellImage != null) {
-			WrappedMessageDialog.setDefaultImage(oldImage);
-		}
-
-		return result;
-	}
-
-	public int displayConfirmation(String title, String msg, IStatus status) {
-		if (status == null) {
-			throw new IllegalArgumentException("status argument cannot be null"); //$NON-NLS-1$
-		}
-
-		if (msg == null) {
-			msg = status.getMessage();
-		}
-		if (msg == null) {
-			msg = ""; //$NON-NLS-1$
-		}
-
-		Image shellImage = getShellImage();
-		if (shellImage != null) {
-			ErrorDialogNoReason.setDefaultImage(shellImage);
-		}
-
-		//Shell shell = plugin.getWorkbench().getDisplay().getActiveShell();
-
-		int rc = ErrorDialogNoReason.openError(shell, title, msg, status);
-
-		return rc;
-
-	}
-
-	/**
-	 * Returns the image for the current shell.
-	 * 
-	 * @return The current shell image.
-	 */
-	private Image getShellImage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench != null) {
-			IWorkbenchWindow workbenchWindow = workbench
-					.getActiveWorkbenchWindow();
-			if (workbenchWindow != null) {
-				Shell shell = workbenchWindow.getShell();
-				if (shell != null) {
-					return shell.getImage();
-				}
-			}
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/PerspectiveUtil.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/PerspectiveUtil.java
deleted file mode 100644
index c81736f..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/PerspectiveUtil.java
+++ /dev/null
@@ -1,122 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveRegistry;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-
-/**
- * Utility class for accessing perspectives.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class PerspectiveUtil {
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private PerspectiveUtil() {
-	}
-
-	/**
-	 * Returns the ID of the active perspective.
-	 * 
-	 * @return The active perspective ID.
-	 */
-	public static String getActivePerspectiveId() {
-		IWorkbenchPage activePage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		if (activePage != null) {
-			IPerspectiveDescriptor activePerspective = activePage
-					.getPerspective();
-			return activePerspective.getId();
-		}
-		return null;
-	}
-
-	/**
-	 * Opens a perspective.
-	 * 
-	 * @param perspectiveId
-	 *            The perspective ID.
-	 * @return The previously active perspective.
-	 */
-	public static IPerspectiveDescriptor openPerspective(String perspectiveId) {
-		IWorkbenchPage activePage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		if (activePage != null) {
-			IPerspectiveRegistry registry = PlatformUI.getWorkbench()
-					.getPerspectiveRegistry();
-			IPerspectiveDescriptor oldPerspective = activePage.getPerspective();
-			if (!oldPerspective.getId().equals(perspectiveId)) {
-				IPerspectiveDescriptor perspective = registry
-						.findPerspectiveWithId(perspectiveId);
-				activePage.setPerspective(perspective);
-			}
-			return oldPerspective;
-		} else {
-			IWorkbenchWindow activeWindow = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			try {
-				PlatformUI.getWorkbench().showPerspective(
-						perspectiveId, activeWindow);
-			} catch (WorkbenchException e) {
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns true if the given perspective is already active.
-	 * 
-	 * @param perspectiveId
-	 *            The perspective ID.
-	 * @return
-	 */
-	public static boolean isActivePerspective(String perspectiveId) {
-		String activePerspectiveId = PerspectiveUtil.getActivePerspectiveId();
-		if (perspectiveId == null || activePerspectiveId == null) {
-			return false;
-		}
-		return activePerspectiveId.equalsIgnoreCase(perspectiveId);
-	}
-
-	/**
-	 * Returns the view part with the given view ID.
-	 * 
-	 * @param viewId
-	 *            The view ID.
-	 * @return The view part.
-	 */
-	public static IViewPart getView(String viewId) {
-		try {
-			IWorkbenchPage activePage = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage();
-			if (activePage != null) {
-				IViewPart view = activePage.findView(viewId);
-				if (view == null) {
-					view = activePage.showView(viewId);
-				}
-				return view;
-			}
-		} catch (Exception e) {
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/PreferenceUtil.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/PreferenceUtil.java
deleted file mode 100644
index aa80bc5..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/PreferenceUtil.java
+++ /dev/null
@@ -1,166 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * Utility class for accessing preferences.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class PreferenceUtil {
-
-	// The multi-string preference delimiter.
-	private static final String PREFERENCE_DELIMITER = ";"; //$NON-NLS-1$
-
-	/**
-	 * Gets a list containing string values associated with a named preference.
-	 * 
-	 * @param prefStore
-	 *            a preference store
-	 * @param name
-	 *            the preference name
-	 * @return a list of string values
-	 */
-	public static List<String> getList(IPreferenceStore prefStore, String name) {
-		List<String> values = new ArrayList<String>();
-		if (prefStore != null && name != null) {
-			String value = prefStore.getString(name);
-			StringTokenizer tokenizer = new StringTokenizer(value,
-					PREFERENCE_DELIMITER);
-			int tokenCount = tokenizer.countTokens();
-			for (int i = 0; i < tokenCount; i++) {
-				values.add(tokenizer.nextToken());
-			}
-		}
-		return values;
-	}
-
-	/**
-	 * Gets the string values associated with a named preference.
-	 * 
-	 * @param prefStore
-	 *            a preference store
-	 * @param name
-	 *            the preference name
-	 * @return a list of string preference values
-	 */
-	public static String[] getStringValues(IPreferenceStore prefStore,
-			String name) {
-		List<String> list = getList(prefStore, name);
-		String[] values = new String[list.size()];
-		list.toArray(values);
-		return values;
-	}
-
-	/**
-	 * Saves a list containing string values associated with a named preference.
-	 * 
-	 * @param prefStore
-	 *            a preference store
-	 * @param name
-	 *            the preference name
-	 * @param values
-	 *            a list of string values
-	 */
-	public static void setList(IPreferenceStore prefStore, String name,
-			List values) {
-		if (prefStore != null && name != null && values != null) {
-			StringBuffer buffer = new StringBuffer();
-			for (Iterator it = values.iterator(); it.hasNext();) {
-				String value = (String) it.next();
-				buffer.append(value);
-				buffer.append(PREFERENCE_DELIMITER);
-			}
-			prefStore.setValue(name, buffer.toString());
-		}
-	}
-
-	/**
-	 * Adds a string value to a list containing string values associated with a
-	 * named preference.
-	 * 
-	 * @param prefStore
-	 *            a preference store
-	 * @param name
-	 *            the preference name
-	 * @param value
-	 *            a string value
-	 * @param defaultValue
-	 *            a default string value that will be added to the end of the
-	 *            list
-	 */
-	public static void addToList(IPreferenceStore prefStore, String name,
-			String value, String defaultValue) {
-		if (prefStore != null && name != null && value != null) {
-			List<String> list = getList(prefStore, name);
-			list.remove(value);
-			list.add(0, value);
-			int preferenceHistorySize = CommonPreferences
-					.getPreferenceHistorySize();
-			if (list.size() > preferenceHistorySize) {
-				list = list.subList(0, 10);
-			}
-			if (list.size() == preferenceHistorySize && defaultValue != null
-					&& defaultValue.length() > 0) {
-				list.set(9, defaultValue);
-			}
-			setList(prefStore, name, list);
-		}
-	}
-
-	/**
-	 * Adds a string value to a list containing string values associated with a
-	 * named preference.
-	 * 
-	 * @param prefStore
-	 *            a preference store
-	 * @param name
-	 *            the preference name
-	 * @param value
-	 *            a string value
-	 */
-	public static void addToList(IPreferenceStore prefStore, String name,
-			String value) {
-		addToList(prefStore, name, value, null);
-	}
-
-	/**
-	 * Saves an array of string values associated with a named preference.
-	 * 
-	 * @param prefStore
-	 *            a preference store
-	 * @param name
-	 *            the preference name
-	 * @param values
-	 *            an array of string values
-	 */
-	public static void setStringValues(IPreferenceStore prefStore, String name,
-			String[] values) {
-		if (prefStore != null && name != null && values != null) {
-			StringBuffer buffer = new StringBuffer();
-			for (int i = 0; i < values.length; i++) {
-				buffer.append(values[i]);
-				buffer.append(PREFERENCE_DELIMITER);
-			}
-			prefStore.setValue(name, buffer.toString());
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/WrappedMessageDialog.java b/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/WrappedMessageDialog.java
deleted file mode 100644
index be5cf0f..0000000
--- a/1.5/plugins/org.eclipse.epf.common.ui/src/org/eclipse/epf/common/ui/util/WrappedMessageDialog.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.ui.util;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Displays a message dialog that displays wrapped text.
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-public class WrappedMessageDialog extends MessageDialog {
-
-	public WrappedMessageDialog(Shell parentShell, String dialogTitle,
-			Image dialogTitleImage, String dialogMessage, int dialogImageType,
-			String[] dialogButtonLabels, int defaultIndex) {
-		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage,
-				dialogImageType, dialogButtonLabels, defaultIndex);
-	}
-
-	protected Control createMessageArea(Composite composite) {
-
-		Control rComposite = super.createMessageArea(composite);
-
-		int minWidth = IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH;// + 300;
-		// TO-DO: need to revist the # of dialog display units and margin
-		// when in other languages
-		int charsPerLine = minWidth / 4 - 15;
-		GridData gd = (GridData) messageLabel.getLayoutData();
-		gd.minimumWidth = minWidth;
-		messageLabel.setText(addLineBreaks(message, charsPerLine));
-
-		return rComposite;
-	}
-
-	String addLineBreaks(String msg, int maxChars) {
-		// System.out.println("$$$ DEBUG: original message = " + msg);
-
-		if (msg == null)
-			return null;
-
-		StringBuffer strBuf = new StringBuffer();
-		int count = 0;
-		for (int i = 0; i < msg.length(); i++) {
-			strBuf.append(msg.charAt(i));
-			if (Character.isWhitespace(msg.charAt(i)))
-				count = 0;
-			else
-				count++;
-
-			if (count >= maxChars) {
-				if (!Character.isWhitespace(msg.charAt(i))) {
-					strBuf.append("\n"); //$NON-NLS-1$
-				}
-				count = 0;
-			}
-		}
-
-		// System.out.println("$$$ DEBUG: broken message = " +
-		// strBuf.toString());
-		return strBuf.toString();
-	}
-
-	public static boolean openConfirm(Shell parent, String title, String message) {
-		WrappedMessageDialog dialog = new WrappedMessageDialog(parent, title,
-				null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-						IDialogConstants.CANCEL_LABEL }, 0); // OK is the
-		// default
-		return dialog.open() == 0;
-	}
-
-	public static void openError(Shell parent, String title, String message) {
-		WrappedMessageDialog dialog = new WrappedMessageDialog(parent, title,
-				null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, ERROR, new String[] { IDialogConstants.OK_LABEL }, 0); // ok
-		// is
-		// the
-		// default
-		dialog.open();
-		return;
-	}
-
-	public static void openInformation(Shell parent, String title,
-			String message) {
-		WrappedMessageDialog dialog = new WrappedMessageDialog(parent, title,
-				null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, INFORMATION,
-				new String[] { IDialogConstants.OK_LABEL }, 0);
-		// ok is the default
-		dialog.open();
-		return;
-	}
-
-	public static boolean openQuestion(Shell parent, String title,
-			String message) {
-		WrappedMessageDialog dialog = new WrappedMessageDialog(parent, title,
-				null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, QUESTION, new String[] { IDialogConstants.YES_LABEL,
-						IDialogConstants.NO_LABEL }, 0); // yes is the
-		// default
-		return dialog.open() == 0;
-	}
-
-	public static void openWarning(Shell parent, String title, String message) {
-		WrappedMessageDialog dialog = new WrappedMessageDialog(parent, title,
-				null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, WARNING, new String[] { IDialogConstants.OK_LABEL }, 0); // ok
-		// is
-		// the
-		// default
-		dialog.open();
-		return;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/.classpath b/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/.project b/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/.project
deleted file mode 100644
index bf9a437..0000000
--- a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.common.win32.win32.x86</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/META-INF/MANIFEST.MF
deleted file mode 100644
index c4835f7..0000000
--- a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.common.win32.win32.x86
-Bundle-Version: 1.2.0.qualifier
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.swt
-Bundle-Vendor: %providerName
-Eclipse-PlatformFilter: (& (osgi.ws=win32) (osgi.os=win32) (osgi.arch=x86))
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/build.properties b/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/build.properties
deleted file mode 100644
index aa1a008..0000000
--- a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties
diff --git a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/plugin.properties b/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/plugin.properties
deleted file mode 100644
index d07f663..0000000
--- a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Win32 Common
-providerName=Eclipse.org
diff --git a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/src/org/eclipse/epf/common/win32/Win32HTMLTransfer.java b/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/src/org/eclipse/epf/common/win32/Win32HTMLTransfer.java
deleted file mode 100644
index f2538bc..0000000
--- a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/src/org/eclipse/epf/common/win32/Win32HTMLTransfer.java
+++ /dev/null
@@ -1,218 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.win32;
-
-import org.eclipse.swt.dnd.ByteArrayTransfer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.internal.ole.win32.COM;
-import org.eclipse.swt.internal.ole.win32.FORMATETC;
-import org.eclipse.swt.internal.ole.win32.IDataObject;
-import org.eclipse.swt.internal.ole.win32.STGMEDIUM;
-import org.eclipse.swt.internal.win32.OS;
-
-/**
- * The class <code>HTMLTransfer</code> provides a platform specific mechanism
- * for converting text in HTML format represented as a java <code>String</code>
- * to a platform specific representation of the data and vice versa. See
- * <code>Transfer</code> for additional information.
- * 
- * <p>
- * An example of a java <code>String</code> containing HTML text is shown
- * below:
- * </p>
- * 
- * <code><pre>
- *       String htmlData = &quot;
- * <p>
- *  This is a paragraph of text.
- * </p>
- *  &quot;;
- * </code></pre>
- */
-public class Win32HTMLTransfer extends ByteArrayTransfer {
-
-	static Win32HTMLTransfer _instance = new Win32HTMLTransfer();
-
-	static final String HTML_FORMAT = "HTML Format"; //$NON-NLS-1$
-
-	static final int HTML_FORMATID = registerType(HTML_FORMAT);
-
-	static final String NUMBER = "00000000"; //$NON-NLS-1$
-
-	static final String HEADER = "Version:0.9\r\nStartHTML:" + NUMBER //$NON-NLS-1$
-			+ "\r\nEndHTML:" + NUMBER + "\r\nStartFragment:" + NUMBER //$NON-NLS-1$ //$NON-NLS-2$
-			+ "\r\nEndFragment:" + NUMBER + "\r\n"; //$NON-NLS-1$ //$NON-NLS-2$
-
-	static final String PREFIX = "<html><body><!--StartFragment-->"; //$NON-NLS-1$
-
-	static final String SUFFIX = "<!--EndFragment--></body></html>"; //$NON-NLS-1$
-
-	static final String StartFragment = "StartFragment:"; //$NON-NLS-1$
-
-	static final String EndFragment = "EndFragment:"; //$NON-NLS-1$
-
-	public Win32HTMLTransfer() {
-	}
-
-	/**
-	 * Returns the singleton instance of the HTMLTransfer class.
-	 * 
-	 * @return the singleton instance of the HTMLTransfer class
-	 */
-	public static Win32HTMLTransfer getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * This implementation of <code>javaToNative</code> converts
-	 * HTML-formatted text represented by a java <code>String</code> to a
-	 * platform specific representation. For additional information see
-	 * <code>Transfer#javaToNative</code>.
-	 * 
-	 * @param object
-	 *            a java <code>String</code> containing HTML text
-	 * @param transferData
-	 *            an empty <code>TransferData</code> object; this object will
-	 *            be filled in on return with the platform specific format of
-	 *            the data
-	 */
-	public void javaToNative(Object object, TransferData transferData) {
-		if (!checkHTML(object) || !isSupportedType(transferData)) {
-			DND.error(DND.ERROR_INVALID_DATA);
-		}
-		String string = (String) object;
-		int count = string.length();
-		char[] chars = new char[count + 1];
-		string.getChars(0, count, chars, 0);
-		int codePage = OS.GetACP();
-		int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null,
-				0, null, null);
-		if (cchMultiByte == 0) {
-			transferData.stgmedium = new STGMEDIUM();
-			transferData.result = COM.DV_E_STGMEDIUM;
-			return;
-		}
-		int startHTML = HEADER.length();
-		int startFragment = startHTML + PREFIX.length();
-		int endFragment = startFragment + cchMultiByte - 1;
-		int endHTML = endFragment + SUFFIX.length();
-
-		StringBuffer buffer = new StringBuffer(HEADER);
-		int maxLength = NUMBER.length();
-		// startHTML
-		int start = buffer.toString().indexOf(NUMBER);
-		String temp = Integer.toString(startHTML);
-		buffer.replace(start + maxLength - temp.length(), start + maxLength,
-				temp);
-		// endHTML
-		start = buffer.toString().indexOf(NUMBER, start);
-		temp = Integer.toString(endHTML);
-		buffer.replace(start + maxLength - temp.length(), start + maxLength,
-				temp);
-		// startFragment
-		start = buffer.toString().indexOf(NUMBER, start);
-		temp = Integer.toString(startFragment);
-		buffer.replace(start + maxLength - temp.length(), start + maxLength,
-				temp);
-		// endFragment
-		start = buffer.toString().indexOf(NUMBER, start);
-		temp = Integer.toString(endFragment);
-		buffer.replace(start + maxLength - temp.length(), start + maxLength,
-				temp);
-
-		buffer.append(PREFIX);
-		buffer.append(string);
-		buffer.append(SUFFIX);
-
-		count = buffer.length();
-		chars = new char[count + 1];
-		buffer.getChars(0, count, chars, 0);
-		cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0,
-				null, null);
-		int lpMultiByteStr = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT,
-				cchMultiByte);
-		OS.WideCharToMultiByte(codePage, 0, chars, -1, lpMultiByteStr,
-				cchMultiByte, null, null);
-		transferData.stgmedium = new STGMEDIUM();
-		transferData.stgmedium.tymed = COM.TYMED_HGLOBAL;
-		transferData.stgmedium.unionField = lpMultiByteStr;
-		transferData.stgmedium.pUnkForRelease = 0;
-		transferData.result = COM.S_OK;
-		return;
-	}
-
-	/**
-	 * This implementation of <code>nativeToJava</code> converts a platform
-	 * specific representation of HTML text to a java <code>String</code>.
-	 * For additional information see <code>Transfer#nativeToJava</code>.
-	 * 
-	 * @param transferData
-	 *            the platform specific representation of the data to be been
-	 *            converted
-	 * @return a java <code>String</code> containing HTML text if the
-	 *         conversion was successful; otherwise null
-	 */
-	public Object nativeToJava(TransferData transferData) {
-		if (!isSupportedType(transferData) || transferData.pIDataObject == 0)
-			return null;
-		IDataObject data = new IDataObject(transferData.pIDataObject);
-		data.AddRef();
-		STGMEDIUM stgmedium = new STGMEDIUM();
-		FORMATETC formatetc = transferData.formatetc;
-		stgmedium.tymed = COM.TYMED_HGLOBAL;
-		transferData.result = data.GetData(formatetc, stgmedium);
-		data.Release();
-		if (transferData.result != COM.S_OK)
-			return null;
-		int hMem = stgmedium.unionField;
-
-		try {
-			int lpMultiByteStr = OS.GlobalLock(hMem);
-			if (lpMultiByteStr == 0)
-				return null;
-			try {
-				int codePage = OS.GetACP();
-				int cchWideChar = OS.MultiByteToWideChar(codePage,
-						OS.MB_PRECOMPOSED, lpMultiByteStr, -1, null, 0);
-				if (cchWideChar == 0)
-					return null;
-				char[] lpWideCharStr = new char[cchWideChar - 1];
-				OS
-						.MultiByteToWideChar(codePage, OS.MB_PRECOMPOSED,
-								lpMultiByteStr, -1, lpWideCharStr,
-								lpWideCharStr.length);
-				return new String(lpWideCharStr);
-			} finally {
-				OS.GlobalUnlock(hMem);
-			}
-		} finally {
-			OS.GlobalFree(hMem);
-		}
-	}
-
-	protected int[] getTypeIds() {
-		return new int[] { HTML_FORMATID };
-	}
-
-	protected String[] getTypeNames() {
-		return new String[] { HTML_FORMAT };
-	}
-
-	boolean checkHTML(Object object) {
-		return (object != null && object instanceof String && ((String) object)
-				.length() > 0);
-	}
-
-	protected boolean validate(Object object) {
-		return checkHTML(object);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/src/org/eclipse/epf/common/win32/package.html b/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/src/org/eclipse/epf/common/win32/package.html
deleted file mode 100644
index 9c54e77..0000000
--- a/1.5/plugins/org.eclipse.epf.common.win32.win32.x86/src/org/eclipse/epf/common/win32/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides windows-specific clipboard transfer services.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/.cdtproject b/1.5/plugins/org.eclipse.epf.common/.cdtproject
deleted file mode 100644
index 31dce0c..0000000
--- a/1.5/plugins/org.eclipse.epf.common/.cdtproject
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse-cdt version="2.0"?>
-
-<cdtproject>
-<data/>
-</cdtproject>
diff --git a/1.5/plugins/org.eclipse.epf.common/.classpath b/1.5/plugins/org.eclipse.epf.common/.classpath
deleted file mode 100644
index f32778b..0000000
--- a/1.5/plugins/org.eclipse.epf.common/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="lib" path="lib/jtidy-8.0-20060801.131059-3.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.common/.options b/1.5/plugins/org.eclipse.epf.common/.options
deleted file mode 100644
index 59f15f0..0000000
--- a/1.5/plugins/org.eclipse.epf.common/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Common plug-in
-org.eclipse.epf.common/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.common/.project b/1.5/plugins/org.eclipse.epf.common/.project
deleted file mode 100644
index 1f5dd59..0000000
--- a/1.5/plugins/org.eclipse.epf.common/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.common</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.common/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.common/META-INF/MANIFEST.MF
deleted file mode 100644
index 8d78a6e..0000000
--- a/1.5/plugins/org.eclipse.epf.common/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,23 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.common;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: common.jar, lib/jtidy-8.0-20060801.131059-3.jar
-Bundle-Activator: org.eclipse.epf.common.CommonPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: com.ibm.icu;visibility:=reexport,
- org.eclipse.core.resources;visibility:=reexport,
- org.eclipse.core.runtime;visibility:=reexport,
- org.apache.ant
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.common,
- org.eclipse.epf.common.html,
- org.eclipse.epf.common.plugin,
- org.eclipse.epf.common.preferences,
- org.eclipse.epf.common.serviceability,
- org.eclipse.epf.common.utils,
- org.eclipse.epf.common.xml
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-
diff --git a/1.5/plugins/org.eclipse.epf.common/about.html b/1.5/plugins/org.eclipse.epf.common/about.html
deleted file mode 100644
index 1b41bf4..0000000
--- a/1.5/plugins/org.eclipse.epf.common/about.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<META name="GENERATOR" content="IBM WebSphere Studio">
-<title>Plug-in License Agreement</title>
-</head>
-
-<body>
-
-<h3>Plug-in License Agreement</h3>
-
-<p>Use of this Plug-in is subject to the same terms and conditions which govern the use of the Product which included this Plug-in.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/build.properties b/1.5/plugins/org.eclipse.epf.common/build.properties
deleted file mode 100644
index fd82750..0000000
--- a/1.5/plugins/org.eclipse.epf.common/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.common.jar = src/
-output.common.jar = bin/
-bin.includes = common.jar,\
-               lib/,\
-               plugin.properties,\
-               META-INF/,\
-               about.html,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.common/lib/jtidy-8.0-20060801.131059-3.jar b/1.5/plugins/org.eclipse.epf.common/lib/jtidy-8.0-20060801.131059-3.jar
deleted file mode 100644
index 37fc970..0000000
--- a/1.5/plugins/org.eclipse.epf.common/lib/jtidy-8.0-20060801.131059-3.jar
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.common/plugin.properties b/1.5/plugins/org.eclipse.epf.common/plugin.properties
deleted file mode 100644
index c20fe9a..0000000
--- a/1.5/plugins/org.eclipse.epf.common/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Common
-providerName=Eclipse.org
diff --git a/1.5/plugins/org.eclipse.epf.common/plugin.xml b/1.5/plugins/org.eclipse.epf.common/plugin.xml
deleted file mode 100644
index 3b2a6fc..0000000
--- a/1.5/plugins/org.eclipse.epf.common/plugin.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="version" name="Version" schema="schema/org.eclipse.epf.common.version.exsd"/>
-   <extension-point id="commandLineRunners" name="CommandLineRunners" schema="schema/commandLineRunners.exsd"/>
-   <extension
-         id="epf"
-         point="org.eclipse.epf.common.version">
-         <versions
-         	class="org.eclipse.epf.common.serviceability.EPFVersions"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.common/schema/commandLineRunners.exsd b/1.5/plugins/org.eclipse.epf.common/schema/commandLineRunners.exsd
deleted file mode 100644
index 26fc73a..0000000
--- a/1.5/plugins/org.eclipse.epf.common/schema/commandLineRunners.exsd
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.common" id="commandLineRunners" name="CommandLineRunners"/>
-      </appInfo>
-      <documentation>
-         ICommandLineRunner object that can be accessed and run from RunUtil, provided with runnerId
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="commandLineRunner" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="commandLineRunner">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="runnerId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.common.utils.ICommandLineRunner
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         //------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.common/schema/org.eclipse.epf.common.version.exsd b/1.5/plugins/org.eclipse.epf.common/schema/org.eclipse.epf.common.version.exsd
deleted file mode 100644
index a5e25a9..0000000
--- a/1.5/plugins/org.eclipse.epf.common/schema/org.eclipse.epf.common.version.exsd
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.common">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.common" id="org.eclipse.epf.common.version" name="Version"/>
-      </appInfo>
-      <documentation>
-         Define schema/tool versions
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="versions" minOccurs="0" maxOccurs="1"/>
-            <element ref="libraryExtensionVersionCheck" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="versions">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.common.serviceability.Versions"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="libraryExtensionVersionCheck">
-      <complexType>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.common.serviceability.ILibraryExtensionVersionCheck"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/AbstractActivator.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/AbstractActivator.java
deleted file mode 100644
index 0c5de2f..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/AbstractActivator.java
+++ /dev/null
@@ -1,517 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.internal.runtime.InternalPlatform;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.I18nUtil;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/**
- * The abstract base class for all EPF plug-ins.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public abstract class AbstractActivator extends Plugin {
-
-	// The relative path to the icons.
-	private static final String ICON_PATH = "icons/"; //$NON-NLS-1$;
-
-	// The logger hash map.
-	private static Map<String, Logger> loggers = new HashMap<String, Logger>();
-
-	// The message dialog hash map.
-	//private static Map<String, MsgDialog> msgDialogs = new HashMap<String, MsgDialog>();
-
-	// The shared image hash map.
-	//private static Map<String, Image> sharedImages = new HashMap<String, Image>();
-
-	// The resource bundle for this plug-in.
-	private ResourceBundle resourceBundle;
-
-	// This plug-in ID.
-	private String pluginId;
-
-	// The plug-in install URL.
-	private URL installURL;
-
-	// The plug-in install path.
-	private String installPath;
-
-	// The plug-in icon URL.
-	protected URL iconURL;
-
-	// The profiling flag.
-	private boolean profiling;
-
-	/**
-	 * Default constructor.
-	 */
-	public AbstractActivator() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		init(context);
-
-		// set the 
-		if (isDebugging()) {
-			getLogger().logInfo("Started " + pluginId); //$NON-NLS-1$			
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		// Free the shared images.
-//		for (Iterator images = sharedImages.values().iterator(); images
-//				.hasNext();) {
-//			Image image = (Image) images.next();
-//			if (image != null && !image.isDisposed()) {
-//				image.dispose();
-//			}
-//		}
-
-		super.stop(context);
-
-		if (isDebugging()) {
-			getLogger().logInfo("Stopped " + pluginId); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Initializes this plug-in.
-	 * 
-	 * @param context
-	 *            The bundle context.
-	 */
-	protected void init(BundleContext context) throws Exception {
-		// Get the bundle for this plug-in.
-		Bundle bundle = getBundle();
-
-		// Get the resouce bundle for this plug-in.
-		resourceBundle = Platform.getResourceBundle(bundle);
-
-		// Get the ID for this plug-in.
-		pluginId = bundle.getSymbolicName();
-
-		if (isDebugging()) {
-			getLogger().logInfo("Initializing " + pluginId); //$NON-NLS-1$		
-		}
-
-		// Get the install path of this plug-in.
-		installURL = bundle.getEntry("/"); //$NON-NLS-1$
-
-		try {
-			installPath = FileLocator.resolve(installURL).getPath();
-		} catch (IOException e) {
-			installPath = Platform.getInstallLocation().getURL().getPath();
-		}
-
-		try {
-			iconURL = new URL(installURL, ICON_PATH);
-		} catch (IOException e) {
-		}
-
-		String symbolicName = bundle.getSymbolicName();
-		if (symbolicName != null) {
-			String key = symbolicName + "/profiling"; //$NON-NLS-1$
-			String value = InternalPlatform.getDefault().getOption(key);
-			profiling = value == null ? false : value.equalsIgnoreCase("true"); //$NON-NLS-1$
-		}
-
-		if (isDebugging()) {
-			getLogger().logInfo(
-					"Initialized " + pluginId + ", installPath=" + installPath); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * Returns the ID of this plug-in.
-	 * 
-	 * @return The ID of this plug-in.
-	 */
-	public String getId() {
-		return pluginId;
-	}
-
-	/**
-	 * Returns the install URL of this plug-in.
-	 * 
-	 * @param The
-	 *            install URL of this plug-in.
-	 */
-	public URL getInstallURL() {
-		return installURL;
-	}
-
-	/**
-	 * Returns the install path of this plug-in.
-	 * 
-	 * @param The
-	 *            install path of this plug-in.
-	 */
-	public String getInstallPath() {
-		return installPath;
-	}
-
-	/**
-	 * Loads and returns the localized properties of a Java properties file.
-	 * <p>
-	 * 
-	 * @param path
-	 *            The properties file path relative to the plug-in root.
-	 * @return A <code>Properties</code> object.
-	 */
-	public Properties getProperties(String path) throws IOException {
-		Properties props = new Properties();
-		if (path == null) {
-			return props;
-		}
-
-		String filePath = getLocalizedFile(path, true);
-		if (filePath != null) {
-			props.load(new FileInputStream(filePath));
-		}
-
-		return props;
-	}
-
-	/**
-	 * get the locale specific absolute file path name of the given file in the
-	 * plugin.
-	 * 
-	 * @param path
-	 *            The properties file path relative to the plug-in root.
-	 * @return String the locale specific absolute file path name of the given
-	 *         file.
-	 * @throws IOException
-	 */
-	public String getLocalizedFile(String path, boolean useDefault)
-			throws IOException {
-		String filePath = null;
-		String fileName = FileUtil.getFileName(path);
-		int index = path.lastIndexOf(fileName);
-		String pathName = path.substring(0, index);
-
-		Locale locale = Locale.getDefault();
-
-		Bundle bundle = getBundle();
-		Bundle[] bundles = Platform.getFragments(bundle);
-		if (bundles != null) {
-			for (int i = 0; i < bundles.length; i++) {
-				URL entry = bundles[i].getEntry(pathName);
-				if (entry != null) {
-					URL url = FileLocator.resolve(entry);
-					filePath = I18nUtil.getLocalizedFile(url.getPath()
-							+ fileName, locale); 
-					if (filePath != null) {
-						break;
-					}
-				}
-			}
-		}
-
-		if (filePath == null) {
-			URL entry = bundle.getEntry(path);
-			if (entry != null) {
-				URL url = FileLocator.resolve(entry);
-				filePath = I18nUtil.getLocalizedFile(url.getPath(), locale);
-				if (filePath == null && useDefault) {
-					filePath = url.getPath();
-				}
-			}
-		}
-
-		return filePath;
-	}
-
-	/**
-	 * for the given path in the plugin, find the localized files form the nl
-	 * fragemenets and copy the localized files to the destination folder
-	 * 
-	 * @param path
-	 *            String a relative path to the plugin root. The files in this
-	 *            folder will be iterated and their localized files will be
-	 *            copied over
-	 * @param toDir
-	 *            FIle the destination folder
-	 * @param recursive
-	 *            boolean recurively looking for files int the specified folder
-	 * @param useLocaleFileName
-	 *            boolean if true the locale specific file names will be used in
-	 *            the copied destination, otherwise, the locale specific file
-	 *            name will be renamed to the default one in the destination
-	 *            folder
-	 * @throws IOException
-	 */
-	public void copyLocalizedFiles(String path, File toDir, boolean recursive,
-			boolean useLocaleFileName) throws IOException {
-		String pluginPath = getInstallPath();
-		URI pluginUri = new File(pluginPath).toURI();
-		URI pathUri = new File(pluginPath, path).toURI();
-
-		List<File> files = new ArrayList<File>();
-		File f = new File(pluginPath, path);
-		FileUtil.getAllFiles(f, files, recursive);
-
-		// for each file found in the specified folder, get the localized file
-		for (Iterator it = files.iterator(); it.hasNext();) {
-			URI srcUri = ((File) it.next()).toURI();
-
-			// get the relative path of the file to the plugin root, then find
-			// the localized file
-			String relPath = pluginUri.relativize(srcUri).getPath();
-
-			// only get the locale specific file, don't include the default one
-			String localizedFile = getLocalizedFile(relPath, false);
-			if (localizedFile == null) {
-				continue;
-			}
-
-			// need to change the target file path to relative to the path
-			// instead of the plugin root
-			relPath = pathUri.relativize(srcUri).getPath();
-			File srcFile = new File(localizedFile);
-			File targetFile = new File(toDir, relPath);
-			File targetParent = targetFile.getParentFile();
-
-			// copy the file to the desitination
-			// if useLocaleFileName is true, the destination file name should
-			// also use the locale specific file name
-			if (useLocaleFileName) {
-				String fileName = srcFile.getName();
-				targetFile = new File(targetParent, fileName);
-			}
-
-			if (isDebugging()) {
-				System.out.println("Copying localized file: "); //$NON-NLS-1$
-				System.out.println("Source: " + srcFile); //$NON-NLS-1$
-				System.out.println("Target: " + targetFile); //$NON-NLS-1$
-				System.out.println(""); //$NON-NLS-1$
-			}
-
-			try {
-				if (!targetParent.exists()) {
-					targetParent.mkdirs();
-				}
-
-				if (!targetFile.exists()) {
-					targetFile.createNewFile();
-				}
-
-				FileUtil.copyFile(srcFile, targetFile);
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-
-	}
-
-	/**
-	 * Returns the localized resource.
-	 * 
-	 * @param key
-	 *            The resource key.
-	 * @return The localized resource.
-	 */
-	public String getString(String key) {
-		if (resourceBundle != null) {
-			try {
-				return resourceBundle.getString(key);
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the formatted localized message given the resource key and the
-	 * message argument.
-	 * 
-	 * @param key
-	 *            The resource key.
-	 * @param argument
-	 *            The message argument.
-	 * @return The formatted localized message.
-	 */
-	public String formatMessage(String key, Object argument) {
-		if (resourceBundle != null) {
-			try {
-				String msg = resourceBundle.getString(key);
-				Object[] arguments = { argument };
-				return MessageFormat.format(msg, arguments);
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the image URL given the relative path.
-	 * 
-	 * @param relativePath
-	 *            The image's path relative to the plug-in's root.
-	 * @return The image URL.
-	 */
-	public URL getImageURL(String relativePath) {
-		try {
-			URL url = new URL(iconURL, relativePath);
-			return FileLocator.resolve(url);
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-//	/**
-//	 * Returns the image descriptor given the relative path.
-//	 * 
-//	 * @param relativePath
-//	 *            The image's path relative to the plug-in's root.
-//	 * @return The image descriptor.
-//	 */
-//	public ImageDescriptor getImageDescriptor(String relativePath) {
-//		try {
-//			URL url = new URL(iconURL, relativePath);
-//			return ImageDescriptor.createFromURL(url);
-//		} catch (MalformedURLException e) {
-//			return ImageDescriptor.getMissingImageDescriptor();
-//		}
-//	}
-//
-//	/**
-//	 * Returns the image given the relative path.
-//	 * <p>
-//	 * Note: The returned image need to be freed by the caller.
-//	 * 
-//	 * @param relativePath
-//	 *            The image's path relative to the plug-in's root.
-//	 * @return The image.
-//	 */
-//	public Image getImage(String relativePath) {
-//		Image image = null;
-//
-//		ImageDescriptor imageDescriptor = getImageDescriptor(relativePath);
-//		if (imageDescriptor != null) {
-//			image = imageDescriptor.createImage(false);
-//		}
-//
-//		return image;
-//	}
-//
-//	/**
-//	 * Returns the shared image given the relative path.
-//	 * <p>
-//	 * Note: The returned image will be automatically freed when the plug-in
-//	 * shuts down.
-//	 * 
-//	 * @param relativePath
-//	 *            The image's path relative to the plug-in's root.
-//	 * @return The image.
-//	 */
-//	public Image getSharedImage(String relativePath) {
-//		Image image = (Image) sharedImages.get(relativePath);
-//		if (image != null) {
-//			return image;
-//		}
-//
-//		ImageDescriptor imageDescriptor = getImageDescriptor(relativePath);
-//		if (imageDescriptor != null) {
-//			image = imageDescriptor.createImage(false);
-//			if (image != null) {
-//				sharedImages.put(relativePath, image);
-//			}
-//		}
-//
-//		return image;
-//	}
-
-	/**
-	 * Returns the profiling flag.
-	 * 
-	 * @return <code>true</code> if profiling is enabled for this plu-in
-	 */
-	public boolean isProfiling() {
-		return profiling;
-	}
-
-	/**
-	 * Returns the logger given the plug-in ID.
-	 * 
-	 * @return The new or cached logger.
-	 */
-	public Logger getLogger() {
-		Logger logger = (Logger) loggers.get(pluginId);
-		if (logger == null) {
-			logger = new Logger(this);
-			loggers.put(pluginId, logger);
-		}
-		return logger;
-	}
-		
-	/**
-	 * Logs the given object or message.
-	 */
-	public void log(Object logEntry) {
-		if (logEntry instanceof Throwable) {
-			((Throwable) logEntry).printStackTrace(System.err);
-		} else {
-			System.err.println(logEntry);
-		}
-	}
-	
-	public IPreferenceStoreWrapper getPreferenceStore() {
-		return CommonPlugin.getDefault().storeWrapper;
-	}
-	
-	
-	public Object getContext() {
-		if ( CommonPlugin.getDefault().contextProvider != null ) {
-			return CommonPlugin.getDefault().contextProvider.getContext();
-		}
-		
-		return null;
-	}
-	
-	public IMessageCallback getMsgCallback() {
-		return CommonPlugin.getDefault().msgCallback;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/CommonPlugin.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/CommonPlugin.java
deleted file mode 100644
index 9040d82..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/CommonPlugin.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Common plug-in activator.
- */
-public class CommonPlugin extends AbstractActivator {
-
-	// The shared plug-in instance.
-	private static CommonPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CommonPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Gets the shared instance.
-	 * 
-	 * @return the shared plug-in instance
-	 */
-	public static CommonPlugin getDefault() {
-		return plugin;
-	}
-
-//	/**
-//	 * set the store wrapper before it's being used.
-//	 * @param storeWrapper
-//	 */
-	IPreferenceStoreWrapper storeWrapper = null;
-	public void setPreferenceStore(IPreferenceStoreWrapper storeWrapper) {
-		this.storeWrapper = storeWrapper;
-	}
-	
-	// this is the context for message callback
-	// for eclipse client, this is the Shell object
-	IContextProvider contextProvider = null;
-
-	public void setContextProvider(IContextProvider contextProvider) {
-		this.contextProvider = contextProvider;
-	}
-
-	IMessageCallback msgCallback = null;
-	public void setMsgCallback(IMessageCallback msgCallback) {
-		this.msgCallback = msgCallback;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/IContextProvider.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/IContextProvider.java
deleted file mode 100644
index 5997a2d..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/IContextProvider.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.eclipse.epf.common;
-
-public interface IContextProvider {
-	public Object getContext();
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/IMessageCallback.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/IMessageCallback.java
deleted file mode 100644
index a807dd1..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/IMessageCallback.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.epf.common;
-
-
-public interface IMessageCallback {
-
-	public void displayWarning(AbstractActivator plugin, String title, String msg, String reason);
-	public void displayWarning(AbstractActivator plugin, String msg, String reason, Throwable ex);
-	public void displayWarning(AbstractActivator plugin, String msg, String reason, String details, Throwable ex);
-	public void displayWarning(AbstractActivator plugin, String title, String msg, String reason, String details, Throwable ex);
-	
-	public void displayError(AbstractActivator plugin, String title, String msg);
-	public void displayError(AbstractActivator plugin, String title, String msg, Throwable ex);
-	public void displayError(AbstractActivator plugin, String title, String msg, String reason, String details, Throwable ex);
-	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/HTMLFormatter.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/HTMLFormatter.java
deleted file mode 100644
index 06875cf..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/HTMLFormatter.java
+++ /dev/null
@@ -1,288 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.html;
-
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.util.regex.Pattern;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.w3c.tidy.Tidy;
-
-/**
- * Pretty-formats HTML source and makes it XHTML compliant.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class HTMLFormatter {
-
-	private static final String HTML_BODY_START_TAG = "<body"; //$NON-NLS-1$
-
-	private static final String HTML_BODY_END_TAG = "</body>"; //$NON-NLS-1$
-
-	private static final int HTML_BODY_START_TAG_LENGTH = HTML_BODY_START_TAG
-			.length();
-
-	public static final String DIAGNOSTIC_SOURCE = "org.eclipse.epf.common.HTMLFormatter"; //$NON-NLS-1$
-
-	private int lineWidth;
-
-	private boolean indent;
-
-	private int indentSize;
-
-	private String lastErrorStr;
-	
-	private static final Pattern p_whitespace = Pattern.compile("^\\s+", Pattern.MULTILINE);
-
-	/*
-	 * String location = m.group(1);
-	 * String lineStr = m.group(2);
-	 * String columnStr = m.group(3);
-	 * String errorMsg = m.group(4);
-	 */
-	public static final Pattern jTidyErrorParser = Pattern
-			.compile(
-					"(line\\s+(\\d+)\\s+column\\s+(\\d+))\\s+-\\s+(.+)", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public HTMLFormatter() {
-		this(132, true, 4);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public HTMLFormatter(int lineWidth, boolean indent, int indentSize) {
-		this.lineWidth = lineWidth;
-		this.indent = indent;
-		this.indentSize = indentSize;
-	}
-
-	/**
-	 * Sets the maximum character width of a line.
-	 * 
-	 * @param lineWidth
-	 *            The line width (in number of characters).
-	 */
-	public void setLineWidth(int lineWidth) {
-		this.lineWidth = lineWidth;
-	}
-
-	/**
-	 * Enables or disables tags indent.
-	 * 
-	 * @param indent
-	 *            If true, ident the tags.
-	 */
-	public void setIndent(boolean indent) {
-		this.indent = indent;
-	}
-
-	/**
-	 * Sets the indent size.
-	 * 
-	 * @param indentSize
-	 *            The indent size (in number of characters).
-	 */
-	public void setIndentSize(int indentSize) {
-		this.indentSize = indentSize;
-	}
-
-	/**
-	 * Formats the given HTML source.
-	 * 
-	 * @param html
-	 *            The HTML source.
-	 * @return The pretty-formatted HTML source.
-	 */
-	public String formatHTML(String html) throws UnsupportedEncodingException {
-		return formatHTML(html, false, false, false, false);
-	}
-
-	/**
-	 * Formats the given HTML source.
-	 * 
-	 * @param html The HTML source.
-	 * @param returnBodyOnly if false, return full HTML document or body content based on what is passed in.  if true, always return body content only
-	 * @param forceOutput if true, return cleaned HTML even if errors. if false, will clean minor problems and return clean HTML, but on a major error, will set getLastErrorStr() and return passed-in html
-	 * @param makeBare set to true for cleaning MS HTML
-	 * @param word2000 set to true for cleaning MS Word 2000 HTML 
-	 * @return
-	 * @throws UnsupportedEncodingException
-	 */
-	public String formatHTML(String html, boolean returnBodyOnly, boolean forceOutput, boolean makeBare, boolean word2000) throws UnsupportedEncodingException {
-		lastErrorStr = null;
-		if (html == null || html.length() == 0) {
-			return html;
-		}
-		
-		html = removeLeadingWhitespace(html);
-
-		Tidy tidy = new Tidy();
-		tidy.setXHTML(true);
-		tidy.setDropEmptyParas(false);
-		tidy.setDropFontTags(false);
-		tidy.setQuiet(true);
-		tidy.setShowWarnings(false);
-		tidy.setSmartIndent(false);
-		tidy.setTidyMark(false);
-		tidy.setWraplen(lineWidth);
-		tidy.setIndentAttributes(false);
-		tidy.setIndentContent(indent);
-		tidy.setSpaces(indentSize);
-		tidy.setInputEncoding("UTF-16"); //$NON-NLS-1$
-		tidy.setOutputEncoding("UTF-16"); //$NON-NLS-1$
-		// this will add <p> around each text block (?that isn't in a block already?)
-//		tidy.setEncloseBlockText(true);
-		// setting this seemed to prevent JTidy from indenting the source
-//		tidy.setPrintBodyOnly(true);
-		
-		if (forceOutput) {
-			// output document even if errors are present
-			tidy.setForceOutput(true);
-		}
-		if (makeBare) {
-			// remove MS clutter
-			tidy.setMakeBare(true);
-		}
-		if (word2000) {
-			// draconian Word2000 cleaning
-			tidy.setWord2000(true);
-		}
-
-		Reader input = new StringReader(html);
-		Writer output = new StringWriter();
-
-		StringWriter sw = new StringWriter();
-		PrintWriter pw = new PrintWriter(sw);
-		tidy.setErrout(pw);
-		tidy.parse(input, output);
-		String error = sw.getBuffer().toString();
-		if (error != null && error.length() > 0
-				&& error.startsWith("line") && error.indexOf("column") > 0) { //$NON-NLS-1$ //$NON-NLS-2$
-			lastErrorStr = error;
-			if (!forceOutput) {
-				// if forceOutput is true, JTidy will return clean HTML so don't return here
-				return html;
-			}
-		}
-
-		String formattedHTML = output.toString();
-		formattedHTML = StrUtil.getEscapedHTML(formattedHTML);
-		
-		String htmlStartUpper = html.substring(0, Math.min(10, html.length())).toUpperCase();
-
-		if (returnBodyOnly || (!htmlStartUpper.startsWith("<!DOCTYPE") && !htmlStartUpper.startsWith("<HTML"))) { //$NON-NLS-1$ //$NON-NLS-2$
-			int startBodyTag = formattedHTML.indexOf(HTML_BODY_START_TAG);
-			int start = -1;
-			if (startBodyTag != -1) {
-				start = formattedHTML.indexOf(">",startBodyTag); //$NON-NLS-1$
-			}
-			int end = formattedHTML.indexOf(HTML_BODY_END_TAG);
-			if (start == -1 || end == -1) {
-				return ""; //$NON-NLS-1$
-			}
-			start += 1;
-			if (start >= end) {
-				return ""; //$NON-NLS-1$
-			}
-			start += FileUtil.LINE_SEP_LENGTH;
-			end -= FileUtil.LINE_SEP_LENGTH;
-			if (indent && indentSize > 0) {
-				end -= indentSize;
-			}
-			if (start >= end) {
-				return ""; //$NON-NLS-1$
-			}
-			String result = formattedHTML.substring(start, end);
-			if (indent && indentSize > 0) {
-				String indentStr = getIndentStr(indentSize * 2);
-				result = fixIndentation(result, indentStr);
-				return result;
-			}
-		}
-		return formattedHTML;
-	}
-		
-	/**
-	 * Returns the indent string.
-	 */
-	private static String getIndentStr(int indentLength) {
-		if (indentLength == 0) {
-			return ""; //$NON-NLS-1$
-		}
-		StringBuffer indentStr = new StringBuffer();
-		for (int i = 0; i < indentLength; i++) {
-			indentStr.append(' ');
-		}
-		return indentStr.toString();
-	}
-
-	public static final String PRE_TAG_START = "<pre>"; //$NON-NLS-1$
-
-	public static final String PRE_TAG_END = "</pre>"; //$NON-NLS-1$
-
-	public static final int PRE_TAG_END_LENGTH = PRE_TAG_END.length();
-
-	/**
-	 * Undo the JTidy indent, but ignore &lt;pre&gt; tags
-	 * 
-	 * @param html
-	 * @param indentStr
-	 * @return
-	 */
-	private static String fixIndentation(String html, String indentStr) {
-		if (html.startsWith(indentStr)) {
-			html = html.substring(indentStr.length());
-		}
-		StringBuffer strBuf = new StringBuffer();
-		int pre_index = -1;
-		int last_pre_end_index = -1;
-		while ((pre_index = html.indexOf(PRE_TAG_START, last_pre_end_index)) != -1) {
-			strBuf.append(html.substring(
-					last_pre_end_index < 0 ? 0 : last_pre_end_index
-							+ PRE_TAG_END_LENGTH, pre_index).replaceAll(
-					"\r\n" + indentStr, "\r\n")); //$NON-NLS-1$ //$NON-NLS-2$
-			last_pre_end_index = html.indexOf(PRE_TAG_END, pre_index);
-			if (last_pre_end_index != -1) {
-				strBuf.append(html.substring(pre_index, last_pre_end_index
-						+ PRE_TAG_END_LENGTH));
-			} else {
-				// found <pre>, but no ending </pre> - shouldn't ever get here
-				// append rest of string and return it
-				strBuf.append(html.substring(pre_index));
-				return strBuf.toString();
-			}
-		}
-		strBuf.append(html.substring(
-				last_pre_end_index < 0 ? 0 : last_pre_end_index
-						+ PRE_TAG_END_LENGTH).replaceAll("\r\n" + indentStr, //$NON-NLS-1$
-				"\r\n")); //$NON-NLS-1$
-		return strBuf.toString();
-	}
-
-	public String getLastErrorStr() {
-		return lastErrorStr;
-	}
-	
-	public static String removeLeadingWhitespace(String input) {
-		return p_whitespace.matcher(input).replaceAll("");
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/HTMLParser.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/HTMLParser.java
deleted file mode 100644
index 9e72489..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/HTMLParser.java
+++ /dev/null
@@ -1,209 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.html;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Properties;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.tidy.Tidy;
-
-/**
- * Extracts the title, meta tags and text from a HTML file or source.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class HTMLParser {
-
-	private static final int BUFFER_SIZE = 4096;
-
-	private static final String HTML_SCRIPT_TAG = "script"; //$NON-NLS-1$	
-
-	private static final String HTML_TITLE_TAG = "title"; //$NON-NLS-1$
-
-	private static final String HTML_META_TAG = "meta"; //$NON-NLS-1$
-
-	private Tidy tidy;
-
-	private String title;
-
-	private String summary;
-
-	private String text;
-
-	private Properties metaTags;
-
-	private StringBuffer htmlText;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public HTMLParser() {
-		try {
-			tidy = new Tidy();
-			tidy.setXHTML(true);
-			tidy.setDropEmptyParas(true);
-			tidy.setDropFontTags(true);
-			tidy.setQuiet(true);
-			tidy.setShowWarnings(false);
-			tidy.setSmartIndent(false);
-			tidy.setTidyMark(false);
-			tidy.setWraplen(132);
-			tidy.setIndentAttributes(false);
-			tidy.setIndentContent(false);
-			tidy.setSpaces(2);
-			tidy.setInputEncoding("UTF-8"); //$NON-NLS-1$
-			tidy.setOutputEncoding("UTF-8"); //$NON-NLS-1$
-		} catch (Exception e) {
-			tidy = null;
-		}
-	}
-
-	/**
-	 * Parses the given HTML file.
-	 */
-	public void parse(File file) throws Exception {
-		if (tidy == null || !file.exists() || !file.canRead()) {
-			return;
-		}
-
-		FileInputStream fis = new FileInputStream(file);
-		InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); //$NON-NLS-1$
-		BufferedReader br = new BufferedReader(isr);
-
-		StringBuffer textBuffer = new StringBuffer(BUFFER_SIZE);
-		char[] buffer = new char[BUFFER_SIZE];
-		int charsRead;
-		while ((charsRead = br.read(buffer, 0, BUFFER_SIZE)) > 0) {
-			textBuffer.append(buffer, 0, charsRead);
-		}
-
-		parse(textBuffer.toString());
-
-		if (br != null) {
-			try {
-				br.close();
-			} catch (IOException e) {
-			}
-		}
-	}
-
-	/**
-	 * Parses the given HTML source.
-	 */
-	protected void parse(String htmlSource) throws Exception {
-		title = ""; //$NON-NLS-1$
-		summary = ""; //$NON-NLS-1$
-		text = ""; //$NON-NLS-1$
-		metaTags = new Properties();
-
-		Document doc = getDocument(htmlSource);
-		if (doc != null) {
-			htmlText = new StringBuffer(1024);
-			extract(doc.getChildNodes());
-			text = htmlText.toString();
-		}
-	}
-
-	/**
-	 * Returns the title text.
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Returns the HTML meta tags.
-	 */
-	public Properties getMetaTags() {
-		return metaTags;
-	}
-
-	/**
-	 * Returns the summary.
-	 */
-	public String getSummary() {
-		return summary;
-	}
-
-	/**
-	 * Returns the body text.
-	 */
-	public String getText() {
-		return text;
-	}
-
-	/**
-	 * Returns the DOM document for the given HTML source.
-	 */
-	protected Document getDocument(String html) throws Exception {
-		if (html == null || html.length() == 0) {
-			return null;
-		}
-
-		ByteArrayInputStream input = new ByteArrayInputStream(html
-				.getBytes("UTF-8")); //$NON-NLS-1$	
-		ByteArrayOutputStream output = new ByteArrayOutputStream();
-
-		StringWriter sw = new StringWriter();
-		PrintWriter pw = new PrintWriter(sw);
-		tidy.setErrout(pw);
-
-		return tidy.parseDOM(input, output);
-	}
-
-	/**
-	 * Extracts the title, meta tags and body text from the given nodes.
-	 */
-	protected void extract(NodeList nodes) {
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Node node = nodes.item(i);
-			String nodeName = node.getNodeName();
-			switch (node.getNodeType()) {
-			case Node.ELEMENT_NODE:
-				if (!nodeName.equals(HTML_SCRIPT_TAG)) {
-					NamedNodeMap attrs = node.getAttributes();
-					for (int j = 0; j < attrs.getLength(); j++) {
-						Node attrNode = attrs.item(j);
-						String attrNodeName = attrNode.getNodeName();
-						String attrNodeValue = attrNode.getNodeValue();
-						if (attrNodeName.equals(HTML_TITLE_TAG)) {
-							title = attrNodeValue;
-						} else if (attrNodeName.equals(HTML_META_TAG)) {
-							metaTags.put(attrNodeName, attrNodeValue);
-						}
-					}
-					NodeList childNodes = node.getChildNodes();
-					if (childNodes != null && childNodes.getLength() > 0) {
-						extract(childNodes);
-					}
-				}
-				break;
-			case Node.TEXT_NODE:
-				htmlText.append(node.getNodeValue()).append(' ');
-				break;
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/package.html b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/package.html
deleted file mode 100644
index fc52bba..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/html/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides common HTML parsing and pretty-formating services.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/package.html b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/package.html
deleted file mode 100644
index 21f893e..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the activator for managing the Common plug-in's life cycle.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/plugin/package.html b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/plugin/package.html
deleted file mode 100644
index 6212269..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/plugin/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides common services for accessing a plug-in's install path, images, logger and resources.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPreferenceStoreWrapper.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPreferenceStoreWrapper.java
deleted file mode 100644
index c0f1896..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPreferenceStoreWrapper.java
+++ /dev/null
@@ -1,430 +0,0 @@
-package org.eclipse.epf.common.preferences;
-
-
-/**
- * wrapper interface for preference store
- * 
- * @author Jinhua Xi
- * @since 1.5
- *
- */
-public interface IPreferenceStoreWrapper {
-
-	//public Object getStore();
-	
-	public void addPropertyChangeListener(IPropertyChangeListenerWrapper listener);
-	public void firePropertyChangeEvent(String name, Object oldValue,
-	            Object newValue);
-    public void removePropertyChangeListener(IPropertyChangeListenerWrapper listener);
-
-	/**
-     * Returns the current value of the boolean-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>false</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a boolean.
-     *
-     * @param name the name of the preference
-     * @return the boolean-valued preference
-     */
-    public boolean getBoolean(String name);
-
-    /**
-     * Returns the default value for the boolean-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>false</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a boolean.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public boolean getDefaultBoolean(String name);
-
-    /**
-     * Returns the default value for the double-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0.0</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a double.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public double getDefaultDouble(String name);
-
-    /**
-     * Returns the default value for the float-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0.0f</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a float.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public float getDefaultFloat(String name);
-
-    /**
-     * Returns the default value for the integer-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as an integer.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public int getDefaultInt(String name);
-
-    /**
-     * Returns the default value for the long-valued preference
-     * with the given name.
-     * Returns the default-default value (<code>0L</code>) if there
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a long.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public long getDefaultLong(String name);
-
-    /**
-     * Returns the default value for the string-valued preference
-     * with the given name.
-     * Returns the default-default value (the empty string <code>""</code>) 
-     * is no default preference with the given name, or if the default 
-     * value cannot be treated as a string.
-     *
-     * @param name the name of the preference
-     * @return the default value of the named preference
-     */
-    public String getDefaultString(String name);
-
-    /**
-     * Returns the current value of the double-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0.0</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a double.
-     *
-     * @param name the name of the preference
-     * @return the double-valued preference
-     */
-    public double getDouble(String name);
-
-    /**
-     * Returns the current value of the float-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0.0f</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a float.
-     *
-     * @param name the name of the preference
-     * @return the float-valued preference
-     */
-    public float getFloat(String name);
-
-    /**
-     * Returns the current value of the integer-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as an integter.
-     *
-     * @param name the name of the preference
-     * @return the int-valued preference
-     */
-    public int getInt(String name);
-
-    /**
-     * Returns the current value of the long-valued preference with the
-     * given name.
-     * Returns the default-default value (<code>0L</code>) if there
-     * is no preference with the given name, or if the current value 
-     * cannot be treated as a long.
-     *
-     * @param name the name of the preference
-     * @return the long-valued preference
-     */
-    public long getLong(String name);
-
-    /**
-     * Returns the current value of the string-valued preference with the
-     * given name.
-     * Returns the default-default value (the empty string <code>""</code>)
-     * if there is no preference with the given name, or if the current value 
-     * cannot be treated as a string.
-     *
-     * @param name the name of the preference
-     * @return the string-valued preference
-     */
-    public String getString(String name);
-
-    /**
-     * Returns whether the current value of the preference with the given name
-     * has the default value.
-     *
-     * @param name the name of the preference
-     * @return <code>true</code> if the preference has a known default value
-     * and its current value is the same, and <code>false</code> otherwise
-     * (including the case where the preference is unknown to this store)
-     */
-    public boolean isDefault(String name);
-
-    /**
-     * Returns whether the current values in this property store
-     * require saving.
-     *
-     * @return <code>true</code> if at least one of values of 
-     *  the preferences known to this store has changed and 
-     *  requires saving, and <code>false</code> otherwise.
-     */
-    public boolean needsSaving();
-
-    /**
-     * Sets the current value of the preference with the given name to
-     * the given string value without sending a property change.
-     * <p>
-     * This method does not fire a property change event and 
-     * should only be used for setting internal preferences 
-     * that are not meant to be processed by listeners.
-     * Normal clients should instead call #setValue.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void putValue(String name, String value);
-
-    /**
-     * Sets the default value for the double-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, double value);
-
-    /**
-     * Sets the default value for the float-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, float value);
-
-    /**
-     * Sets the default value for the integer-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, int value);
-
-    /**
-     * Sets the default value for the long-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, long value);
-
-    /**
-     * Sets the default value for the string-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param defaultObject the new default value for the preference
-     */
-    public void setDefault(String name, String defaultObject);
-
-    /**
-     * Sets the default value for the boolean-valued preference with the
-     * given name. 
-     * <p>
-     * Note that the current value of the preference is affected if
-     * the preference's current value was its old default value, in which
-     * case it changes to the new default value. If the preference's current
-     * is different from its old default value, its current value is
-     * unaffected. No property change events are reported by changing default
-     * values.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new default value for the preference
-     */
-    public void setDefault(String name, boolean value);
-
-    /**
-     * Sets the current value of the preference with the given name back
-     * to its default value.
-     * <p>
-     * Note that the preferred way of re-initializing a preference to the
-     * appropriate default value is to call <code>setToDefault</code>.
-     * This is implemented by removing the named value from the store, 
-     * thereby exposing the default value.
-     * </p>
-     *
-     * @param name the name of the preference
-     */
-    public void setToDefault(String name);
-
-    /**
-     * Sets the current value of the double-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, double value);
-
-    /**
-     * Sets the current value of the float-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, float value);
-
-    /**
-     * Sets the current value of the integer-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, int value);
-
-    /**
-     * Sets the current value of the long-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, long value);
-
-    /**
-     * Sets the current value of the string-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, String value);
-
-    /**
-     * Sets the current value of the boolean-valued preference with the
-     * given name.
-     * <p>
-     * A property change event is reported if the current value of the 
-     * preference actually changes from its previous value. In the event
-     * object, the property name is the name of the preference, and the
-     * old and new values are wrapped as objects.
-     * </p>
-     * <p>
-     * Note that the preferred way of re-initializing a preference to its
-     * default value is to call <code>setToDefault</code>.
-     * </p>
-     *
-     * @param name the name of the preference
-     * @param value the new current value of the preference
-     */
-    public void setValue(String name, boolean value);
-    
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPropertyChangeEventWrapper.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPropertyChangeEventWrapper.java
deleted file mode 100644
index 99624fb..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPropertyChangeEventWrapper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.epf.common.preferences;
-
-/**
- * wrapper interface for property change event
- * 
- * @author Jinhua Xi
- * @since 1.5
- *
- */
-public interface IPropertyChangeEventWrapper {
-
-	   /**
-     * Returns the new value of the property.
-     *
-     * @return the new value, or <code>null</code> if not known
-     *  or not relevant (for instance if the property was removed).
-     */
-    public Object getNewValue();
-
-    /**
-     * Returns the old value of the property.
-     *
-     * @return the old value, or <code>null</code> if not known
-     *  or not relevant (for instance if the property was just
-     *  added and there was no old value).
-     */
-    public Object getOldValue();
-
-    /**
-     * Returns the name of the property that changed.
-     * <p>
-     * Warning: there is no guarantee that the property name returned
-     * is a constant string.  Callers must compare property names using
-     * equals, not ==.
-     * </p>
-     *
-     * @return the name of the property that changed
-     */
-    public String getProperty();
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPropertyChangeListenerWrapper.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPropertyChangeListenerWrapper.java
deleted file mode 100644
index 2f7bf66..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/preferences/IPropertyChangeListenerWrapper.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.eclipse.epf.common.preferences;
-
-/**
- * wrapper interface for property change listener
- * 
- * @author Jinhua Xi
- * @since 1.5
- *
- */
-public interface IPropertyChangeListenerWrapper {
-
-	 public void propertyChange(IPropertyChangeEventWrapper event);
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/DebugTrace.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/DebugTrace.java
deleted file mode 100644
index bb6ff47..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/DebugTrace.java
+++ /dev/null
@@ -1,104 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.serviceability;
-
-/**
- * Helper utility for printing debug traces to the console.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class DebugTrace {
-
-	/**
-	 * Prints a debug trace to the console.
-	 * 
-	 * @param instance
-	 *            a class instance
-	 * @param method
-	 *            a method name
-	 * @param msg
-	 *            a debug message
-	 * @param th
-	 *            a <code>Throwable</code> object
-	 */
-	public static void print(Object instance, String method, String msg,
-			Throwable th) {
-		StringBuffer debugMsg = new StringBuffer();
-		if (instance != null) {
-			debugMsg.append(instance.getClass().getName());
-			if (method != null) {
-				debugMsg.append('.').append(method);
-			}
-			debugMsg.append(": "); //$NON-NLS-1$
-		}
-		if (msg != null && msg.length() > 0) {
-			debugMsg.append(msg); 
-		}
-		System.out.println(debugMsg);
-		if (th != null) {
-			th.printStackTrace();
-		}
-	}
-
-	/**
-	 * Prints a debug trace to the console.
-	 * 
-	 * @param instance
-	 *            a class instance
-	 * @param method
-	 *            a method name
-	 * @param th
-	 *            a <code>Throwable</code> object
-	 */
-	public static void print(Object instance, String method, Throwable th) {
-		print(instance, method, null, th);
-	}
-
-	/**
-	 * Prints a debug trace to the console.
-	 * 
-	 * @param instance
-	 *            a class instance
-	 * @param method
-	 *            a method name
-	 * @param msg
-	 *            a debug message
-	 */
-	public static void print(Object instance, String method, String msg) {
-		print(instance, method, msg, null);
-	}
-
-	/**
-	 * Prints a debug trace to the console.
-	 * 
-	 * @param instance
-	 *            a class instance
-	 * @param method
-	 *            a method name
-	 */
-	public static void print(Object instance, String method) {
-		print(instance, method, null, null);
-	}
-
-	/**
-	 * Prints a debug trace to the console.
-	 * 
-	 * @param th
-	 *            a <code>Throwable</code> object
-	 */
-	public static void print(Throwable th) {
-		if (th != null) {
-			th.printStackTrace();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/EPFVersion.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/EPFVersion.java
deleted file mode 100644
index 434d0da..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/EPFVersion.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.serviceability;
-
-import org.osgi.framework.Version;
-
-/**
- * This class represents a single version of EPF Composer.
- * It contains all the versions of the sub-components of EPF.
- * 
- * @author Jeff Hardy
- * @sicne 1.0
- */
-public class EPFVersion {
-
-	// the tool version
-	protected Version toolVersion;
-	
-	// the library version
-	protected Version libraryVersion;
-	
-	// the schema version
-	protected Version xmlSchemaVersion;
-	
-	
-	public EPFVersion() {
-		this.toolVersion = Version.emptyVersion;
-		this.libraryVersion = Version.emptyVersion;
-		this.xmlSchemaVersion = Version.emptyVersion;
-	};
-	
-	public EPFVersion(String toolVersion, String libraryVersion, String xmlSchemaVersion) {
-		this.toolVersion = new Version(toolVersion);
-		this.libraryVersion = new Version(libraryVersion);
-		this.xmlSchemaVersion = new Version(xmlSchemaVersion);
-	}
-
-	/**
-	 * @return the tool version
-	 */
-	public Version getToolVersion() {
-		return toolVersion;
-	}
-
-	/**
-	 * @return the library version
-	 */
-	public Version getLibraryVersion() {
-		return libraryVersion;
-	}
-
-	/**
-	 * @return the XML schema version
-	 */
-	public Version getXMLSchemaVersion() {
-		return xmlSchemaVersion;
-	}
-	
-	/**
-	 * Compares the given tool version to this one
-	 * 
-	 * @see org.osgi.framework.Version#compareTo()
-	 * 
-	 * @param schemaVersion The schema version to be compared.
-	 * @return A negative integer if this tool version is less than the given one<br />
-	 * Zero if the this tool version is the same as the given one<br />
-	 * A positive integer if this tool version is greater than the given one<br />
-	 * 
-	 */
-	public int compareToolVersionTo(Version toolVersion) {
-		if (!VersionUtil.isVersionCheckingDisabled())
-			return getToolVersion().compareTo(toolVersion);
-		else 
-			return 0;
-	}
-	
-	/**
-	 * Compares the given library version to this one
-	 * 
-	 * @see org.osgi.framework.Version#compareTo()
-	 * 
-	 * @param schemaVersion The schema version to be compared.
-	 * @return A negative integer if this library version is less than the given one<br />
-	 * Zero if the this library version is the same as the given one<br />
-	 * A positive integer if this library version is greater than the given one<br />
-	 * 
-	 */
-	public int compareLibraryVersionTo(Version libraryVersion) {
-		if (!VersionUtil.isVersionCheckingDisabled())
-			return getLibraryVersion().compareTo(libraryVersion);
-		else 
-			return 0;
-	}
-
-	/**
-	 * Compares the given XML Schema version to this one
-	 * 
-	 * @see org.osgi.framework.Version#compareTo()
-	 * 
-	 * @param schemaVersion The schema version to be compared.
-	 * @return A negative integer if this XML Schema version is less than the given one<br />
-	 * Zero if the this XML Schema version is the same as the given one<br />
-	 * A positive integer if this XML Schema version is greater than the given one<br />
-	 * 
-	 */
-	public int compareXMLSchemaVersionTo(Version XMLSchemaVersion) {
-		if (!VersionUtil.isVersionCheckingDisabled())
-			return getXMLSchemaVersion().compareTo(XMLSchemaVersion);
-		else 
-			return 0;
-	}
-	
-	public String toString() {
-		return getToolVersion().toString() + "," + //$NON-NLS-1$
-		getLibraryVersion().toString() + "," + //$NON-NLS-1$
-		getXMLSchemaVersion().toString();
-	}
-	
-	public boolean equals(Object object) {
-		if (object == this) { // quicktest
-			return true;
-		}
-
-		if (!(object instanceof EPFVersion)) {
-			return false;
-		}
-
-		EPFVersion other = (EPFVersion) object;
-		return (getToolVersion().equals(other.getToolVersion())) && (getLibraryVersion().equals(other.getLibraryVersion()))
-				&& (getXMLSchemaVersion().equals(other.getXMLSchemaVersion()));
-	}
-	
-	@Override
-	public int hashCode() {
-		int result = toolVersion.hashCode();
-		result ^= libraryVersion.hashCode();
-		result ^= xmlSchemaVersion.hashCode();
-		return result;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/EPFVersions.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/EPFVersions.java
deleted file mode 100644
index d4ffea3..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/EPFVersions.java
+++ /dev/null
@@ -1,132 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.serviceability;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.osgi.framework.Version;
-
-/**
- * This class stores all of the version information for the known EPF versions.
- * 
- * @author Jeff Hardy
- * @since 1.0
- */
-public class EPFVersions {
-
-	public static final String TOOL_ID = "epf"; //$NON-NLS-1$
-
-	// the name space URI string for the TOOL_ID
-	private static String nsUri = "http://www.eclipse.org/epf"; //$NON-NLS-1$
-
-	// EPF 1.0
-	private static EPFVersion EPF_10 = new EPFVersion("1.0", //$NON-NLS-1$  tool version
-			"1.0.3.0", //$NON-NLS-1$  library version
-			"1.0.0"); //$NON-NLS-1$  xml schema version
-
-	// EPF 1.1 - This is EPF 1.2 Iteration 1
-	private static EPFVersion EPF_11 = new EPFVersion("1.1", //$NON-NLS-1$  tool version
-			"1.0.4.0", //$NON-NLS-1$  library version
-			"1.0.0"); //$NON-NLS-1$  xml schema version
-
-	// EPF 1.2 release
-	private static EPFVersion EPF_12 = new EPFVersion("1.2", //$NON-NLS-1$  tool version
-			"1.0.4.1", //$NON-NLS-1$  library version
-			"1.0.1"); //$NON-NLS-1$  xml schema version
-
-	private static EPFVersion currentVersion = EPF_12;
-
-	public EPFVersion getCurrentVersion() {
-		return currentVersion;
-	}
-
-	public EPFVersion getVersion(String toolVersion) {
-		if (toolVersion != null) {
-			for (Iterator iter = getAllVersions().iterator(); iter.hasNext();) {
-				EPFVersion ver = (EPFVersion) iter.next();
-				if (ver.getToolVersion().equals(new Version(toolVersion))) {
-					return ver;
-				}
-			}
-		}
-		return null;
-	}
-
-	public Collection getAllVersions() {
-		List<EPFVersion> versions = new ArrayList<EPFVersion>();
-		versions.add(EPF_10);
-		versions.add(EPF_11);
-		versions.add(EPF_12);
-		return versions;
-	}
-
-	/**
-	 * 
-	 * @param libraryVersion
-	 * @return the minimum tool version that uses the specified library version
-	 */
-	public EPFVersion getMinToolVersionForLibraryVersion(Version libraryVersion) {
-		for (Iterator iter = getAllVersions().iterator(); iter.hasNext();) {
-			EPFVersion versionInfo = (EPFVersion) iter.next();
-			if (versionInfo.getLibraryVersion().compareTo(libraryVersion) == 0) {
-				return versionInfo;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @return the minimum tool version that uses the current library version
-	 */
-	public EPFVersion getMinToolVersionForCurrentLibraryVersion() {
-		Version libraryVersion = getCurrentVersion().getLibraryVersion();
-		return getMinToolVersionForLibraryVersion(libraryVersion);
-	}
-
-	/**
-	 * 
-	 * @param xmlSchemaVersion
-	 * @return the minimum tool version that uses the specified XML Schema
-	 *         version
-	 */
-	public EPFVersion getMinToolVersionForXMLSchemaVersion(
-			Version xmlSchemaVersion) {
-		for (Iterator iter = getAllVersions().iterator(); iter.hasNext();) {
-			EPFVersion versionInfo = (EPFVersion) iter.next();
-			if (versionInfo.getXMLSchemaVersion().compareTo(xmlSchemaVersion) == 0) {
-				return versionInfo;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @return the minimum tool version that uses the current XML Schema version
-	 */
-	public EPFVersion getMinToolVersionForCurrentXMLSchemaVersion() {
-		Version xmlSchemaVersion = getCurrentVersion().getXMLSchemaVersion();
-		return getMinToolVersionForXMLSchemaVersion(xmlSchemaVersion);
-	}
-
-	/**
-	 * 
-	 * @return the name space URI string for the TOOL_ID
-	 */
-	public String getNsURI() {
-		return nsUri;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/ILibraryExtensionVersionCheck.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/ILibraryExtensionVersionCheck.java
deleted file mode 100644
index e8283ff..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/ILibraryExtensionVersionCheck.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.serviceability;
-
-import java.io.File;
-
-import org.eclipse.epf.common.serviceability.VersionUtil.VersionCheckInfo;
-
-/**
- * The interface for performing method library version check.
- * 
- * @author Jeff Hardy
- * @since 1.0
- */
-public interface ILibraryExtensionVersionCheck {
-
-	/**
-	 * Checks and returns the version information associated with a method
-	 * library.
-	 * 
-	 * @param file
-	 *            a method library XMI file
-	 * @return <code>null</code> if the library XMI file does not contain the
-	 *         version information of the tool that created it; or
-	 *         <code>VersionCheckInfo</code> object
-	 */
-	public VersionCheckInfo checkLibraryVersion(File libPath);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/Logger.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/Logger.java
deleted file mode 100644
index a2037c5..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/Logger.java
+++ /dev/null
@@ -1,132 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.serviceability;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Generic logger used for logging status messages, warning messages, error
- * messages, and exception stack traces.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class Logger {
-
-	// The plug-in instance.
-	private Plugin plugin;
-
-	// The plug-in ID.
-	private String pluginId;
-
-	/**
-	 * Create a new <code>Logger</code> given the plug-in instance.
-	 * 
-	 * @param plugin
-	 *            The plugin instance.
-	 */
-	public Logger(Plugin plugin) {
-		this.plugin = plugin;
-		this.pluginId = plugin.getBundle().getSymbolicName(); //plugin.getId();
-	}
-
-	/**
-	 * Logs the given error message.
-	 * 
-	 * @param msg
-	 *            The error message.
-	 */
-	public void logError(String msg) {
-		logMsg(IStatus.ERROR, msg, null);
-	}
-
-	/**
-	 * Logs the given exception.
-	 * 
-	 * @param ex
-	 *            The exception.
-	 */
-	public void logError(Throwable ex) {
-		logMsg(IStatus.ERROR, null, ex);
-	}
-
-	/**
-	 * Logs the given error message and exception.
-	 * 
-	 * @param msg
-	 *            The error message.
-	 * @param ex
-	 *            The exception.
-	 */
-	public void logError(String msg, Throwable ex) {
-		logMsg(IStatus.ERROR, msg, ex);
-	}
-
-	/**
-	 * Logs the given warning message.
-	 * 
-	 * @param msg
-	 *            The warning message.
-	 */
-	public void logWarning(String msg) {
-		logMsg(IStatus.WARNING, msg, null);
-	}
-
-	/**
-	 * Logs the given warning message and exception.
-	 * 
-	 * @param msg
-	 *            The warning message.
-	 * @param ex
-	 *            The exception.
-	 */
-	public void logWarning(String msg, Throwable ex) {
-		logMsg(IStatus.WARNING, msg, ex);
-	}
-
-	/**
-	 * Logs the given status message and exception.
-	 * 
-	 * @param msg
-	 *            The status message.
-	 */
-	public void logInfo(String msg) {
-		logMsg(IStatus.INFO, msg, null);
-	}
-
-	/**
-	 * Logs the given message and exception.
-	 * 
-	 * @param severity
-	 *            The severity.
-	 * @param msg
-	 *            The message.
-	 * @param ex
-	 *            The exception.
-	 */
-	public synchronized void logMsg(int severity, String msg, Throwable ex) {
-		if (msg == null && ex != null) {
-			msg = ex.getMessage(); 
-		}
-
-		if (msg == null) {
-			msg = ""; //$NON-NLS-1$
-		}
-
-		Status status = new Status(severity, pluginId, IStatus.OK, msg, ex);
-
-		// Call the Eclipse Logger.
-		plugin.getLog().log(status);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionMismatchException.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionMismatchException.java
deleted file mode 100644
index a773412..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionMismatchException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.serviceability;
-
-import org.osgi.framework.Version;
-
-/**
- * Signals that the current version of the tool is not compatible with the
- * method library it is trying to open.
- * 
- * @author Jeff Hardy
- * @since 1.0
- */
-public class VersionMismatchException extends RuntimeException {
-
-	private static final long serialVersionUID = 1L;
-
-	private Version expected;
-
-	private Version actual;
-
-	public VersionMismatchException(Version expected, String actual) {
-		super();
-		this.expected = expected;
-		if (actual == null) {
-			this.actual = Version.emptyVersion;
-		} else {
-			this.actual = new Version(actual);
-		}
-	}
-
-	public Version getActual() {
-		return actual;
-	}
-
-	public Version getExpected() {
-		return expected;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionUtil.java
deleted file mode 100644
index 54fae22..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionUtil.java
+++ /dev/null
@@ -1,478 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.serviceability;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.Version;
-
-/**
- * Provides utilities to query a method library schema and the version of the
- * tool that created it.
- * 
- * @author Jeff Hardy
- * @since 1.0
- */
-public class VersionUtil {
-
-	public static class VersionCheckInfo {
-		public VersionCheckInfo(String id, String toolVersion,
-				String currentMinToolVersion, int result) {
-			this.toolID = id;
-			this.toolVersion = toolVersion;
-			this.currentMinToolVersion = currentMinToolVersion;
-			this.result = result;
-		}
-
-		public String toolID;
-
-		public String toolVersion;
-
-		public String currentMinToolVersion;
-
-		/**
-		 * < 0: fileToolVersion is older than currentMinToolVersion <br/> == 0:
-		 * match <br/> > 0 : fileToolVersion is newer than currentMinToolVersion
-		 * <br/>
-		 */
-		public int result;
-	}
-
-	/**
-	 * The extension point namespace.
-	 */
-	public static final String EXTENSION_POINT_NAMESPACE = CommonPlugin.class
-			.getPackage().getName();
-
-	/**
-	 * The extension point name.
-	 */
-	public static final String EXTENSION_POINT_NAME = "version"; //$NON-NLS-1$
-
-	public static final String EXTENSION_VERSIONS_INFO = "versions"; //$NON-NLS-1$
-
-	public static final String EXTENSION_LIB_EXTENSION_CHECK = "libraryExtensionVersionCheck"; //$NON-NLS-1$
-
-	private static final String DISABLE_VERSION_CHECKING_PREF = "disable_version_checking"; //$NON-NLS-1$
-
-	public static Map<String, EPFVersions> versions = new LinkedHashMap<String, EPFVersions>();
-
-	public static Map<String, ILibraryExtensionVersionCheck> libExtCheckers = new LinkedHashMap<String, ILibraryExtensionVersionCheck>();
-
-	protected static boolean versionCheckingDisabled = false;
-
-	/**
-	 * List of toolIDs to check, in order
-	 */
-	private static List<String> toolIDsCheckList = new ArrayList<String>();
-
-	static {
-		toolIDsCheckList.add(EPFVersions.TOOL_ID);
-
-		// read properties file
-		try {
-			
-			// preference store is not accessible here,
-			// should pass the wrapper in when UI plugin is activated.
-			// Jinhua Xi, 01/03/2008
-			String valueStr = CommonPlugin.getDefault().getPreferenceStore()
-					.getString(DISABLE_VERSION_CHECKING_PREF);
-			versionCheckingDisabled = Boolean.valueOf(valueStr).booleanValue();
-			
-		} catch (MissingResourceException e) {
-			versionCheckingDisabled = false;
-		}
-
-		// Process the "org.eclipse.epf.common.version" extension point
-		// contributors.
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				EXTENSION_POINT_NAMESPACE, EXTENSION_POINT_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				initExtension(extension);
-			}
-		}
-
-	}
-
-	protected static void initExtension(IExtension extension) {
-		String extensionID = extension.getSimpleIdentifier();
-		String pluginId = extension.getNamespaceIdentifier();
-		Bundle bundle = Platform.getBundle(pluginId);
-		IConfigurationElement[] configElements = extension
-				.getConfigurationElements();
-		for (int j = 0; j < configElements.length; j++) {
-			IConfigurationElement configElement = configElements[j];
-			try {
-				if (EXTENSION_VERSIONS_INFO.equals(configElement.getName())) {
-					String className = configElement.getAttribute("class"); //$NON-NLS-1$
-					if (className != null) {
-						versions.put(extensionID, (EPFVersions) bundle
-								.loadClass(className).newInstance());
-						break;
-					}
-				}
-				if (EXTENSION_LIB_EXTENSION_CHECK.equals(configElement
-						.getName())) {
-					String className = configElement.getAttribute("class"); //$NON-NLS-1$
-					if (className != null) {
-						libExtCheckers.put(extensionID,
-								(ILibraryExtensionVersionCheck) bundle
-										.loadClass(className).newInstance());
-						break;
-					}
-				}
-			} catch (Exception e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return the map of Tool IDs-to-Versions class
-	 */
-	public static Map getVersionsMap() {
-		return Collections.unmodifiableMap(versions);
-	}
-
-	/**
-	 * 
-	 * @return a Set of all known Tool IDs
-	 */
-	public static Set<String> getAllToolIDs() {
-		return Collections.unmodifiableSet(versions.keySet());
-	}
-
-	/**
-	 * 
-	 * @param toolID
-	 * @return The Versions class for the given Tool ID
-	 */
-	public static EPFVersions getVersions(String toolID) {
-		return (EPFVersions) versions.get(toolID);
-	}
-
-	/**
-	 * 
-	 * @return true iff version checking is disabled
-	 */
-	public static boolean isVersionCheckingDisabled() {
-		return versionCheckingDisabled;
-	}
-
-	public static final Pattern p_XMIVersionPattern = Pattern.compile(
-			"(\\w+?):version=\"(.+?)\"", Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_XMLVersionAttributePattern = Pattern.compile(
-			"tool=\"(.*?)\"", Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_XMI_ELEMENT_START_TAG = Pattern
-			.compile("<?xml version=\".+?\" encoding=\".+?\"?>"); //$NON-NLS-1$
-
-	public static final String XML_ELEMENT_END_TAG = ">"; //$NON-NLS-1$
-
-	public static final String XMI_ATTRIBUTE_TAG = "xmi"; //$NON-NLS-1$
-
-	public static final String XML_ELEMENT_START_TAG = "<uma:MethodLibrary"; //$NON-NLS-1$
-
-	public static final String XML_VERSIONS_SEPARATOR = ";"; //$NON-NLS-1$
-
-	public static final String XML_TOOL_VERSION_SEPARATOR = "="; //$NON-NLS-1$
-
-	/**
-	 * Given an XML file, will read the tool="foo=a.b.c.d;bar=w.x.y.z"
-	 * attributes and return a map of the id-to-versions.
-	 * 
-	 * @param xmlFile
-	 *            file to process
-	 * @return null if no versions found; a map of the id-to-versions otherwise
-	 */
-	protected static Map readVersionsFromXMLFile(File xmlFile) {
-		Map<String, String> versions = new LinkedHashMap<String, String>();
-		StringBuffer buf = null;
-		try {
-			buf = FileUtil.readFile(xmlFile, FileUtil.ENCODING_UTF_8);
-		} catch (Exception ex) {
-			CommonPlugin.getDefault().getLogger().logError(ex);
-		}
-		if (buf != null) {
-			int xmiElementStartIdx = buf.indexOf(XML_ELEMENT_START_TAG);
-			if (xmiElementStartIdx != -1) {
-				int xmiElementEndIdx = buf.indexOf(XML_ELEMENT_END_TAG,
-						xmiElementStartIdx + XML_ELEMENT_START_TAG.length());
-				if (xmiElementEndIdx != -1) {
-					String rootElement = buf.substring(xmiElementStartIdx,
-							xmiElementEndIdx);
-					Matcher mAttribute = p_XMLVersionAttributePattern
-							.matcher(rootElement);
-					if (mAttribute.find()) {
-						String toolsAttribute = mAttribute.group(1);
-						if (toolsAttribute != null
-								&& toolsAttribute.length() > 0) {
-							String[] versionsArray = StrUtil.split(
-									toolsAttribute, XML_VERSIONS_SEPARATOR);
-							for (int i = 0; i < versionsArray.length; i++) {
-								if (versionsArray[i] != null
-										&& versionsArray[i].length() > 0) {
-									String[] versionInfoArray = StrUtil.split(
-											versionsArray[i],
-											XML_TOOL_VERSION_SEPARATOR);
-									if (versionInfoArray.length != 2)
-										continue;
-									String toolID = versionInfoArray[0];
-									String toolVersion = versionInfoArray[1];
-									if (toolID != null
-											&& toolID.trim().length() > 0
-											&& toolVersion != null
-											&& toolVersion.trim().length() > 0)
-										versions.put(toolID, toolVersion);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		if (versions.size() == 0) {
-			return null;
-		} else {
-			return versions;
-		}
-	}
-
-	/**
-	 * Given an XMI file, will read the foo:version="x.x.x" attributes and
-	 * return a map of the id-to-versions.
-	 * 
-	 * @param xmlFile
-	 *            file to process
-	 * @return null if no versions found; a map of the id-to-versions otherwise
-	 */
-	protected static Map readVersionsFromXMIFile(File xmiFile) {
-		Map<String, String> versions = new LinkedHashMap<String, String>();
-		StringBuffer buf = null;
-		try {
-			buf = FileUtil.readFile(xmiFile, FileUtil.ENCODING_UTF_8);
-		} catch (Exception ex) {
-			CommonPlugin.getDefault().getLogger().logError(ex);
-		}
-		if (buf != null) {
-			Matcher docStartMatcher = p_XMI_ELEMENT_START_TAG.matcher(buf);
-			if (docStartMatcher.find()) {
-				int docHeaderEndIdx = docStartMatcher.end();
-				int xmiElementEndIdx = buf.indexOf(XML_ELEMENT_END_TAG,
-						docHeaderEndIdx);
-				if (xmiElementEndIdx != -1) {
-					String rootElement = buf.substring(docHeaderEndIdx,
-							xmiElementEndIdx + 1);
-					Matcher m = p_XMIVersionPattern.matcher(rootElement);
-					while (m.find()) {
-						String toolID = m.group(1);
-						if (toolID.equals(XMI_ATTRIBUTE_TAG))
-							continue;
-						String toolVersion = m.group(2);
-						if (toolID != null && toolID.trim().length() > 0
-								&& toolVersion != null
-								&& toolVersion.trim().length() > 0)
-							versions.put(toolID, toolVersion);
-					}
-				}
-			}
-		}
-		if (versions.size() == 0) {
-			return null;
-		} else {
-			return versions;
-		}
-	}
-
-	/**
-	 * Given a file, will read version information and return a map of the
-	 * id-to-versions.
-	 * 
-	 * @param file
-	 *            file to process
-	 * @return null if no versions found; a map of the id-to-versions otherwise
-	 */
-	public static Map readVersionsFromFile(File file) {
-		if (file.getName().toUpperCase().endsWith("XMI")) { //$NON-NLS-1$
-			return readVersionsFromXMIFile(file);
-		} else if (file.getName().toUpperCase().endsWith("XML")) { //$NON-NLS-1$
-			return readVersionsFromXMLFile(file);
-		} else {
-			Map versions = readVersionsFromXMIFile(file);
-			if (versions != null)
-				return versions;
-			versions = readVersionsFromXMLFile(file);
-			if (versions != null)
-				return versions;
-		}
-		return null;
-	}
-
-	/**
-	 * Given a file, will compare with current XML Schema version.
-	 * 
-	 * @param file
-	 * @return null if file tool version can not be found; a VersionCheckInfo
-	 *         object otherwise
-	 */
-	public static VersionCheckInfo checkXMLVersion(File file) {
-		Map versionMap = VersionUtil.readVersionsFromFile(file);
-		if (versionMap == null) {
-			return null;
-		} else {
-			VersionCheckInfo vci = null;
-			for (Iterator iter = toolIDsCheckList.iterator(); iter.hasNext();) {
-				String toolID = (String) iter.next();
-				if (versionMap.get(toolID) != null) {
-					String toolVersion = (String) versionMap.get(toolID);
-					vci = _checkXMLVersion(toolID, toolVersion);
-					if (vci != null)
-						return vci;
-				}
-			}
-		}
-		return null;
-	}
-
-	private static VersionCheckInfo _checkXMLVersion(String toolID,
-			String toolVersion) {
-		// get the class that stores all the version info for this tool ID
-		EPFVersions versions = getVersions(toolID);
-		if (versions != null) {
-			EPFVersion minCurrVersion = versions
-					.getMinToolVersionForCurrentXMLSchemaVersion();
-			int result = minCurrVersion.compareToolVersionTo(new Version(
-					toolVersion));
-			String currentMinToolVersion = minCurrVersion.getToolVersion()
-					.toString();
-			return new VersionCheckInfo(toolID, toolVersion,
-					currentMinToolVersion, -result);
-		}
-		return null;
-	}
-
-	/**
-	 * Given a file, compares with current library schema version
-	 * 
-	 * @param file
-	 * @return null if file tool version can not be found; a VersionCheckInfo
-	 *         object otherwise
-	 */
-	public static VersionCheckInfo checkLibraryVersion(File file) {
-		if (file.getName().equals("library.xmi")) { //$NON-NLS-1$
-			// check library extensions first
-			for (Iterator iter = toolIDsCheckList.iterator(); iter.hasNext();) {
-				String toolID = (String) iter.next();
-				if (libExtCheckers.get(toolID) != null) {
-					VersionCheckInfo vci = null;
-					ILibraryExtensionVersionCheck extCheck = (ILibraryExtensionVersionCheck) libExtCheckers
-							.get(toolID);
-					vci = extCheck.checkLibraryVersion(file.getParentFile());
-					if (vci != null)
-						return vci;
-				}
-			}
-		}
-		Map versionMap = VersionUtil.readVersionsFromFile(file);
-		if (versionMap == null) {
-			return null;
-		} else {
-			VersionCheckInfo vci = null;
-			for (Iterator iter = toolIDsCheckList.iterator(); iter.hasNext();) {
-				String toolID = (String) iter.next();
-				if (versionMap.get(toolID) != null) {
-					String toolVersion = (String) versionMap.get(toolID);
-					vci = _checkLibVersion(toolID, toolVersion);
-					if (vci != null)
-						return vci;
-				}
-			}
-		}
-		return null;
-	}
-
-	private static VersionCheckInfo _checkLibVersion(String toolID,
-			String toolVersion) {
-		// get the class that stores all the version info for this tool ID
-		EPFVersions versions = getVersions(toolID);
-		if (versions != null) {
-			EPFVersion minCurrVersion = versions
-					.getMinToolVersionForCurrentLibraryVersion();
-			int result = minCurrVersion.compareToolVersionTo(new Version(
-					toolVersion));
-			String currentMinToolVersion = minCurrVersion.getToolVersion()
-					.toString();
-			return new VersionCheckInfo(toolID, toolVersion,
-					currentMinToolVersion, -result);
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @return the first toolID that is checked. In most cases, the ID of the
-	 *         currently running application
-	 */
-	public static String getPrimaryToolID() {
-		return (String) toolIDsCheckList.get(0);
-	}
-
-	/**
-	 * Adds a tool ID to the order of tools to check.
-	 * 
-	 * @param toolID
-	 *            toolID to add
-	 * @param toolIDfollowing
-	 *            if null, adds toolID to front of list. otherwise, adds toolID
-	 *            before the specified ID
-	 * @return false iff toolIDfollowing is not null and could not be found in
-	 *         list; true otherwise
-	 */
-	public static boolean addToolID(String toolID, String toolIDfollowing) {
-		if (toolIDfollowing != null) {
-			int idx = toolIDsCheckList.indexOf(toolIDfollowing);
-			if (idx != -1) {
-				toolIDsCheckList.add(idx, toolID);
-				return true;
-			} else {
-				return false;
-			}
-		}
-		toolIDsCheckList.add(0, toolID);
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionUtil.properties b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionUtil.properties
deleted file mode 100644
index a4f26e7..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/VersionUtil.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-versionCheckingEnabled=true
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/package.html b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/package.html
deleted file mode 100644
index 613347b..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/serviceability/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides common error handling, logging and versioning services.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/CommandLineRunUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/CommandLineRunUtil.java
deleted file mode 100644
index 01e5aa2..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/CommandLineRunUtil.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.osgi.framework.Bundle;
-
-/**
- * Utility class for excuting a ICommandLineRunner object's execute method
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class CommandLineRunUtil {
-	
-	private static CommandLineRunUtil instance = new CommandLineRunUtil();
-	private boolean needToRun = false;
-	
-	public static CommandLineRunUtil getInstance() {
-		return instance;
-	}
-	
-	public CommandLineRunUtil() {		
-	}	
-	
-	public boolean execute(String[] args) {
-		//For general case, args should be parsed here to call on right runnerId.
-		//for now, just hard code it with "commandLinePluginImporter"
-		executeCommandRunner(args, "commandLinePluginImporter");	//$NON-NLS-1$ 
-		return false;
-	}
-	
-	protected boolean executeCommandRunner(String[] args, String runnerId) {
-		ICommandLineRunner runner = getRunner(runnerId);
-		if (runner != null) {
-			return runner.execute(args);
-		}
-		return false;
-	}
-	
-	private static final ICommandLineRunner getRunner(String id) {
-		IExtensionRegistry extensionRegistry = Platform
-				.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry
-				.getExtensionPoint(
-						"org.eclipse.epf.common", "commandLineRunners"); //$NON-NLS-1$ //$NON-NLS-2$			
-		if (extensionPoint == null) {
-			return null;
-		}
-		
-		IExtension[] extensions = extensionPoint.getExtensions();
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension extension = extensions[i];
-			String pluginId = extension.getNamespaceIdentifier();
-			Bundle bundle = Platform.getBundle(pluginId);
-			IConfigurationElement[] configElements = extension
-					.getConfigurationElements();
-			for (int j = 0; j < configElements.length; j++) {
-				IConfigurationElement configElement = configElements[j];
-				String runnerId = configElement.getAttribute("runnerId"); //$NON-NLS-1$
-				if (runnerId == null) {
-					continue;
-				}
-				runnerId = runnerId.trim();
-				if (! runnerId.equals(id)) {
-					continue;
-				}
-				String className = configElement.getAttribute("class"); //$NON-NLS-1$
-				if (className == null) {
-					continue;
-				}
-				className = className.trim();
-				try {
-					ICommandLineRunner runner = (ICommandLineRunner) bundle.loadClass(className).newInstance();
-					return runner;
-				} catch (Exception e) {					
-				}
-			}
-		}	
-
-		return null;
-	}
-
-	public boolean isNeedToRun() {
-		return needToRun;
-	}
-
-	public void setNeedToRun(boolean needToRun) {
-		this.needToRun = needToRun;
-	}
-
-	public static void setInstance(CommandLineRunUtil instance) {
-		CommandLineRunUtil.instance = instance;
-	}
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/CommandLineRunner.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/CommandLineRunner.java
deleted file mode 100644
index 08d780b..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/CommandLineRunner.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.File;
-
-/**
- * Base implementation for ICommandLineRunner
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class CommandLineRunner implements ICommandLineRunner {
-	protected static boolean localDebug = true;
-	
-	private File inputFile;
-	
-	public boolean execute(String[] args) {
-		if (localDebug) {
-			System.out.println("LD> CommandLinePluginImporter.execute, args: "); //$NON-NLS-1$
-			for (int i = 0; i < args.length; i++) {
-				System.out.println("LD> args[" + i + "]: " + args[i]); //$NON-NLS-1$//$NON-NLS-2$
-			}
-		}
-		
-		for (int i = 0; i < args.length; i++) {
-			if (args[i].equalsIgnoreCase("-batch")) { //$NON-NLS-1$
-				if (i + 1 < args.length) {
-					String path = args[i + 1];
-					inputFile = new File(path);
-					if (!inputFile.exists()) {
-						String msg = "Cannot fine the file: " + path; //$NON-NLS-1$
-						System.out.println("Error> " + msg); //$NON-NLS-1$
-						return false;
-					}
-					break;
-				}
-			}
-		}
-						
-		return true;
-	}
-	
-	protected File getInputFile() {
-		return inputFile;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/FileUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/FileUtil.java
deleted file mode 100644
index a6f74b1..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/FileUtil.java
+++ /dev/null
@@ -1,1068 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.net.URL;
-import java.nio.CharBuffer;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-import java.nio.channels.OverlappingFileLockException;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CodingErrorAction;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.epf.common.CommonPlugin;
-
-/**
- * Utility class for managing directories and files.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class FileUtil {
-
-	/**
-	 * Platform-specific line separator.
-	 */
-	public static final String LINE_SEP = System.getProperty("line.separator"); //$NON-NLS-1$
-
-	/**
-	 * Platform-specific file separator.
-	 */
-	public static final String FILE_SEP = System.getProperty("file.separator"); //$NON-NLS-1$
-
-	/**
-	 * Platform-specific line separator length.
-	 */
-	public static final int LINE_SEP_LENGTH = LINE_SEP.length();
-
-	/**
-	 * UNC path prefix.
-	 */
-	public static final String UNC_PATH_PREFIX = "\\\\"; //$NON-NLS-1$
-
-	/**
-	 * UNC path prefix length.
-	 */
-	public static final int UNC_PATH_PREFIX_LENGTH = UNC_PATH_PREFIX.length();
-
-	/**
-	 * ISO-8859-1 encoding.
-	 */
-	public static final String ENCODING_ISO_8859_1 = "ISO-8859-1"; //$NON-NLS-1$
-
-	/**
-	 * UTF-8 encoding.
-	 */
-	public static final String ENCODING_UTF_8 = "UTF-8";//$NON-NLS-1$
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private FileUtil() {
-	}
-
-	/**
-	 * Returns the absolute path for a file or directory.
-	 * 
-	 * @param file
-	 *            a file or directory
-	 * @return the absolute path to the file or directory
-	 */
-	public static String getAbsolutePath(File file) {
-		return file.getAbsolutePath().replace('\\', '/');
-	}
-
-	/**
-	 * Returns the absolute path for a file or directory.
-	 * 
-	 * @param path
-	 *            a path to a file or directory
-	 * @return an absolute path to the file or directory
-	 */
-	public static String getAbsolutePath(String path) {
-		return getAbsolutePath(new File(path));
-	}
-
-	/**
-	 * Returns the absolute path for a URL.
-	 * 
-	 * @param url
-	 *            a URL
-	 * @return the absolute path of the URL
-	 */
-	public static String getAbsolutePath(URL url) {
-		String pathName = url.getFile().substring(1);
-		String result = NetUtil.decodeUrl(pathName, null);
-		return result;
-	}
-
-	/**
-	 * Returns the parent directory of a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @return the name of the parent directory
-	 */
-	public static String getParentDirectory(String path) {
-		return (new File(path)).getParent();
-	}
-
-	/**
-	 * Returns the file name and extension from a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @return the file name including the file extension
-	 */
-	public static String getFileName(String path) {
-		return getFileName(path, true);
-	}
-
-	/**
-	 * Returns the file name from a path, with or without the file extension.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @param withExtension
-	 *            if <code>true</code>, include the file extension in the
-	 *            result
-	 * @return the file name with or without the file extension
-	 */
-	public static String getFileName(String path, boolean withExtension) {
-		String normalizedPath = path.replace('\\', '/');
-
-		int prefixLength = 0;
-		if (normalizedPath.startsWith(NetUtil.FILE_URI_PREFIX)) {
-			prefixLength = NetUtil.FILE_URI_PREFIX_LENGTH;
-		} else if (normalizedPath.startsWith(NetUtil.HTTP_URI_PREFIX)) {
-			prefixLength = NetUtil.HTTP_URI_PREFIX_LENGTH;
-		}
-
-		String fileName;
-		int index = normalizedPath.lastIndexOf("/"); //$NON-NLS-1$
-		if (index < prefixLength) {
-			fileName = normalizedPath.substring(prefixLength);
-		} else {
-			fileName = path.substring(index + 1);
-		}
-
-		if (withExtension) {
-			return fileName;
-		}
-
-		index = fileName.indexOf("."); //$NON-NLS-1$
-		return (index > 0) ? fileName.substring(0, index) : fileName;
-	}
-
-	/**
-	 * Returns the relative path of a path from a base path.
-	 * 
-	 * @param path
-	 *            a path
-	 * @param basePath
-	 *            the base path
-	 * @return a relative path
-	 */
-	public static String getRelativePathToBase(File path, File basePath) {
-		try {
-			String dir = path.toURL().toExternalForm();
-			String baseDir = basePath.toURL().toExternalForm();
-			StringBuffer result = new StringBuffer();
-			if (dir.indexOf(baseDir) == 0) {
-				String delta = dir.substring(baseDir.length());
-				for (int i = 0; i < delta.length(); i++) {
-					if (delta.charAt(i) == '/') {
-						result.append("../"); //$NON-NLS-1$
-					}
-				}
-			}
-			return result.toString();
-		} catch (Exception e) {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	public static String getRelativePath(File path, File basePath) {
-		try {
-			String dir = path.toURL().toExternalForm();
-			String baseDir = appendSeparator(basePath.toURL().toExternalForm(),
-					"/"); //$NON-NLS-1$
-			StringBuffer result = new StringBuffer();
-			while (dir.indexOf(baseDir) == -1) {
-				basePath = basePath.getParentFile();
-				baseDir = appendSeparator(basePath.toURL().toExternalForm(),
-						"/"); //$NON-NLS-1$
-				result.append("../"); //$NON-NLS-1$
-			}
-			if (dir.indexOf(baseDir) == 0) {
-				String delta = dir.substring(baseDir.length());
-				result.append(delta);
-			}
-			return result.toString();
-		} catch (Exception e) {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Appends the platform specific path separator to the end of a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @return the path name appended with the platform specific path separator
-	 */
-	public static String appendSeparator(String path) {
-		return appendSeparator(path, File.separator);
-	}
-
-	/**
-	 * Appends the given path separator to the end of a path
-	 * 
-	 * @param path
-	 *            a path name
-	 * @param separator
-	 *            a path separator
-	 * @return the path name appended with the given separator
-	 */
-	public static String appendSeparator(String path, String separator) {
-		return path.endsWith(separator) ? path : path + separator;
-	}
-
-	/**
-	 * Removes the ending path separator from a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @return the path name minus the platform specific path separator
-	 */
-	public static String removeSeparator(String path) {
-		return path.endsWith(File.separator) ? path.substring(0,
-				path.length() - 1) : path;
-	}
-
-	/**
-	 * Removes the ending path separator from a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @return the path name minus the path separator "\\" or "/"
-	 */
-	public static String removeAllSeparator(String path) {
-		return path.endsWith("/") || path.endsWith("\\") ? path.substring(0, path.length() - 1) : path; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Removes the ending path separator from a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @param separator
-	 *            a path separator
-	 * @return the path name minus the separator
-	 */
-	public static String removeSeparator(String path, String separator) {
-		return path.endsWith(separator) ? path.substring(0, path.length() - 1)
-				: path;
-	}
-
-	/**
-	 * Replaces the file name with another in a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @param oldFileName
-	 *            the old file name
-	 * @param newFileName
-	 *            the new file name
-	 * @return the new path name with the new file name
-	 */
-	public static String replaceFileName(String path, String oldFileName,
-			String newFileName) {
-		int index = path.lastIndexOf(oldFileName);
-		return path.substring(0, index) + newFileName;
-	}
-
-	/**
-	 * Replaces the file extension with another in a path.
-	 * 
-	 * @param path
-	 *            a path name
-	 * @param oldFileExt
-	 *            rhe old file extension
-	 * @param newFileExt
-	 *            the new file extension
-	 * @return the new path with the new file extension
-	 */
-	public static String replaceExtension(String path, String oldExt,
-			String newExt) {
-		int index = path.lastIndexOf(oldExt);
-		return path.substring(0, index) + newExt;
-	}
-
-	/**
-	 * Returns the locale-specific path of a base path.
-	 * 
-	 * @param path
-	 *            a base path name
-	 * @param localeStr
-	 *            a locale string
-	 * @return the locale-specific path
-	 */
-	public static String getLocalePath(String path, String localeStr) {
-		if (StrUtil.isBlank(localeStr)) {
-			return path;
-		}
-		String fileName = getFileName(path);
-		return replaceFileName(path, fileName, localeStr + "/" + fileName); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the locale-specific path of a base path.
-	 * 
-	 * @param path
-	 *            a base path name
-	 * @param locale
-	 *            a locale object
-	 * @return the locale-specific path
-	 */
-	public static String getLocalePath(String path, Locale locale) {
-		return locale == null ? path : getLocalePath(path, locale.toString());
-	}
-
-	/**
-	 * Writes the given text to a text file.
-	 * 
-	 * @param fileName
-	 *            the target file name
-	 * @param text
-	 *            the text to write
-	 * @return <code>true</code> if the given text is written successfully to
-	 *         file
-	 */
-	public static boolean writeFile(String filename, String text) {
-		FileWriter writer = null;
-		try {
-			writer = new FileWriter(filename);
-			writer.write(text);
-			writer.flush();
-		} catch (IOException e) {
-		} finally {
-			if (writer != null) {
-				try {
-					writer.close();
-					return true;
-				} catch (Exception e) {
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Write the given text to a file with UTF-8 encoding.
-	 * 
-	 * @param fileName
-	 *            the target file name
-	 * @param text
-	 *            the text to write
-	 * @param append
-	 *            if <code>true</code>, append the text to the end of the
-	 *            file, if <code>false</code>, override the file
-	 * @return <code>true</code> if the given text is written successfully to
-	 *         file
-	 */
-	public static boolean writeUTF8File(String filename, String text) {
-		return writeUTF8File(filename, text, false);
-	}
-
-	/**
-	 * Write the given text to a file with UTF-8 encoding.
-	 * 
-	 * @param fileName
-	 *            the target file name
-	 * @param text
-	 *            the text to write
-	 * @param append
-	 *            if <code>true</code>, append the text to the end of the
-	 *            file, if <code>false</code>, override the file
-	 * @return <code>true</code> if the given text is written successfully to
-	 *         file
-	 */
-	public static boolean writeUTF8File(String filename, String text,
-			boolean append) {
-		OutputStreamWriter writer = null;
-		FileOutputStream fileOut = null;
-		try {
-			fileOut = new FileOutputStream(filename, append);
-			writer = new OutputStreamWriter(fileOut, ENCODING_UTF_8);
-			writer.write(text);
-			writer.flush();
-			fileOut.flush();
-		} catch (IOException e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-		} finally {
-			if (writer != null) {
-				try {
-					writer.close();
-					return true;
-				} catch (Exception e) {
-				}
-			}
-			if (fileOut != null) {
-				try {
-					fileOut.close();
-					return true;
-				} catch (Exception e) {
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Write the content of the given URI to an output stream.
-	 * 
-	 * @param uri
-	 *            the source URI
-	 * @param output
-	 *            the output stream
-	 */
-	public static void writeFile(String uri, OutputStream output)
-			throws IOException {
-		if (uri == null) {
-			return;
-		}
-
-		InputStream input = null;
-		try {
-			input = NetUtil.getInputStream(uri);
-			int bytesRead;
-			byte[] buf = new byte[4096];
-			while ((bytesRead = input.read(buf, 0, 4096)) > 0) {
-				output.write(buf, 0, bytesRead);
-			}
-			output.flush();
-		} finally {
-			if (input != null) {
-				try {
-					input.close();
-				} catch (Exception e) {
-				}
-			}
-		}
-	}
-
-	/**
-	 * Write the content of the given URI to a <code>PrintWriter</code>.
-	 * 
-	 * @param uri
-	 *            the source URI
-	 * @param writer
-	 *            the <code>PrintWriter</code> object
-	 */
-	public static void writeFile(String uri, PrintWriter pw) throws IOException {
-		if (uri == null) {
-			return;
-		}
-
-		InputStreamReader input = null;
-		try {
-			input = new InputStreamReader(NetUtil.getInputStream(uri));
-			int charsRead;
-			char[] buf = new char[4096];
-			while ((charsRead = input.read(buf, 0, 4096)) > 0) {
-				pw.write(buf, 0, charsRead);
-			}
-			pw.flush();
-		} finally {
-			if (input != null) {
-				try {
-					input.close();
-				} catch (Exception e) {
-				}
-			}
-		}
-	}
-
-	/**
-	 * Recursively delete all sub-directories and files in a directory except
-	 * for the directory itself.
-	 * 
-	 * @param dir
-	 *            the directory containing the sub-directories and files
-	 * @return <code>true</code> if the delete operation is successful
-	 */
-	public static boolean deleteAllFiles(String dir) {
-		boolean ret = true;
-		File targetDir = new File(dir);
-		File[] files = targetDir.listFiles();
-		if (files != null) {
-			for (int i = 0; i < files.length; i++) {
-				if (files[i].isDirectory()) {
-					ret = ret && deleteAllFiles(files[i].getAbsolutePath());
-				}
-				ret = ret && files[i].delete();
-			}
-		}
-
-		return ret;
-	}
-
-	/**
-	 * Recursively delete all sub-directories and files in a directory except
-	 * for the directory itself and the specified file.
-	 * 
-	 * @param dir
-	 *            the directory containing the sub-directories and files
-	 * @param filesNotToDelete
-	 *            a list of files and/or directories that should not be deleted
-	 * @return <code>true</code> if delete operation is successful
-	 */
-	public static boolean deleteAllFiles(String dir, List<File> filesNotToDelete) {
-		boolean ret = true;
-		File targetDir = new File(dir);
-		File[] files = targetDir.listFiles();
-		if (files != null) {
-			for (int i = 0; i < files.length; i++) {
-				if (!filesNotToDelete.contains(files[i])) {
-					if (files[i].isDirectory()) {
-						ret = ret
-								&& deleteAllFiles(files[i].getAbsolutePath(),
-										filesNotToDelete);
-					}
-					ret = ret && files[i].delete();
-				}
-			}
-		}
-
-		return ret;
-	}
-
-	/**
-	 * Copies the content of the source file to the target file. Will overwrite
-	 * an existing file if it has write permission
-	 * 
-	 * @param srcFile
-	 *            the source file or path
-	 * @param tgtFile
-	 *            the target file or path
-	 */
-	public static boolean copyFile(File srcFile, File tgtFile) {
-		try {
-			return copyfile(srcFile, tgtFile);
-		} catch (IOException ex) {
-			CommonPlugin.getDefault().getLogger().logError(ex);
-			return false;
-		}
-	}
-
-	/**
-	 * Copies the content of the source file to the target file.
-	 * 
-	 * @param srcFileName
-	 *            the source file name
-	 * @param tgtFileName
-	 *            the target file name
-	 */
-	public static boolean copyFile(String srcFileName, String tgtFileName) {
-		return copyFile(new File(srcFileName), new File(tgtFileName));
-	}
-
-	/**
-	 * Copies one file to another.
-	 * <p>
-	 * If both source and destination are directories, delegates to
-	 * copydirectory().
-	 * <p>
-	 * source must exist and be readable
-	 * <p>
-	 * cannot copy a directory to a file
-	 * <p>
-	 * will not copy if timestamps and filesize match, will overwrite otherwise
-	 * 
-	 * @param source
-	 *            the source file
-	 * @param dest
-	 *            the destination file
-	 * @throws IOException
-	 *             if an error occurs during the copy operation
-	 */
-	private static boolean copyfile(File source, File dest) throws IOException {
-		if (source.equals(dest))
-			// do not copy equal files
-			return false;
-
-		if (!source.exists() || !source.canRead()) {
-			// source does not exist or can't read
-			return false;
-		}
-
-		if (dest.exists() && !dest.canWrite()) {
-			// dest exists and cannot be written
-			return false;
-		}
-
-		if (source.isDirectory()) {
-			if (dest.isFile()) {
-				// can't copy a directory to a file
-				return false;
-			} else {
-				// delegate to copydirectory
-				return copydirectory(source, dest);
-			}
-		} else {
-			// source is a file
-			if (dest.isDirectory()) {
-				String sourceFileName = source.getName();
-				return copyfile(source, new File(dest, sourceFileName));
-			}
-			// both source and dest are files
-			boolean needCopy = true;
-			if (dest.exists()) {
-				needCopy = (dest.lastModified() != source.lastModified())
-						|| (dest.length() != source.length());
-			}
-
-			if (needCopy) {
-				FileInputStream input = null;
-				FileOutputStream output = null;
-
-				try {
-					input = new FileInputStream(source);
-					FileChannel in = input.getChannel();
-					if (!dest.exists()) {
-						dest.getParentFile().mkdirs();
-					}
-					output = new FileOutputStream(dest);
-					FileChannel out = output.getChannel();
-					out.transferFrom(in, 0, source.length());
-					dest.setLastModified(source.lastModified());
-					return true;
-				} finally {
-					if (input != null) {
-						try {
-							input.close();
-						} catch (IOException e) {
-						}
-					}
-					if (output != null) {
-						try {
-							output.close();
-						} catch (IOException e) {
-						}
-					}
-				}
-			} else {
-				// did not copy
-				// return true because dest file is same as source
-				return true;
-			}
-		}
-	}
-
-	/**
-	 * Copies the content of a directory to another directory.
-	 * 
-	 * @param srcDirName
-	 *            the source directory name
-	 * @param tgtDirName
-	 *            the target directory name
-	 */
-	public static boolean copyDir(File srcDir, File tgtDir) {
-		try {
-			return copydirectory(srcDir, tgtDir);
-		} catch (IOException ex) {
-			CommonPlugin.getDefault().getLogger().logError(ex);
-			return false;
-		}
-	}
-
-	/**
-	 * Copies the content of a directory to another directory.
-	 * 
-	 * @param srcDirName
-	 *            the source directory name
-	 * @param tgtDirName
-	 *            the target directory name
-	 */
-	public static boolean copyDir(String srcDirName, String tgtDirName) {
-		return copyDir(new File(srcDirName), new File(tgtDirName));
-	}
-
-	/**
-	 * Copies one directory to another - operates ONLY on directories.
-	 * <p>
-	 * Both source and dest must exist.
-	 */
-	private static boolean copydirectory(File sourceDir, File destDir)
-			throws IOException {
-		if (!sourceDir.exists() || !destDir.exists()) {
-			return false;
-		}
-
-		if (!sourceDir.isDirectory() || !destDir.isDirectory()) {
-			return false;
-		}
-
-		File[] files = sourceDir.listFiles();
-		if (files != null) {
-			for (int i = 0; i < files.length; i++) {
-				// calc destination name
-				String destName = destDir
-						+ File.separator
-						+ files[i].getAbsolutePath().substring(
-								sourceDir.getAbsolutePath().length() + 1);
-				if (files[i].isFile()) {
-					// copy the file
-					copyfile(files[i], new File(destName));
-				} else if (files[i].isDirectory()) {
-					// copy directory recursively
-					File destFile = new File(destName);
-					destFile.mkdirs();
-					copydirectory(files[i], destFile);
-				}
-			}
-		}
-		return true;
-	}
-
-	// for some reason, this guy locks the file, if you try to update the file,
-	// got the following exception
-	// java.io.FileNotFoundException:
-	// (The requested operation cannot be performed on a file with a user-mapped
-	// section open)
-	// need to handle later
-	public static CharBuffer readFile(File file) throws IOException {
-		FileInputStream input = null;
-		CharBuffer charBuffer = null;
-		try {
-			input = new FileInputStream(file);
-			FileChannel inChannel = input.getChannel();
-			int length = (int) inChannel.size();
-			MappedByteBuffer byteBuffer = inChannel.map(
-					FileChannel.MapMode.READ_ONLY, 0, length);
-			Charset charset = Charset.forName(ENCODING_ISO_8859_1);
-			CharsetDecoder decoder = charset.newDecoder();
-			charBuffer = decoder.decode(byteBuffer);
-		} finally {
-			if (input != null) {
-				try {
-					input.close();
-				} catch (IOException e) {
-				}
-			}
-		}
-		return charBuffer;
-	}
-
-	public static StringBuffer readFile(File file, String encoding)
-			throws IOException {
-
-		StringBuffer result = new StringBuffer();
-		FileInputStream fis = null;
-		InputStreamReader reader = null;
-		int size;
-		try {
-			Charset cs = Charset.forName(encoding);
-			CharsetDecoder csd = cs.newDecoder();
-			csd.onMalformedInput(CodingErrorAction.REPLACE);
-			char[] buffer = new char[1024];
-			fis = new FileInputStream(file);
-			reader = new InputStreamReader(fis, csd);
-			while ((size = reader.read(buffer, 0, 1024)) > 0) {
-				result.append(buffer, 0, size);
-			}
-		} catch (Exception e) {
-			// System.out.println(encoding);
-			e.printStackTrace();
-		} finally {
-			if (fis != null) {
-				fis.close();
-			}
-
-			if (reader != null) {
-				reader.close();
-			}
-		}
-
-		return result;
-	}
-	
-	public static long getSize(File file) {
-		FileInputStream fis = null;
-		try {
-			fis = new FileInputStream(file);
-			return fis.getChannel().size();			
-		}
-		catch (IOException e) {
-			//
-		}
-		finally {
-			try {
-				fis.close();
-			}
-			catch(Exception e) {
-				//
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * Uses Java 1.4's FileLock class to test for a file lock
-	 * 
-	 * @param file
-	 * @return
-	 */
-	public static boolean isFileLocked(File file) {
-		boolean isLocked = false;
-		FileOutputStream input = null;
-		FileLock lock = null;
-
-		if (!file.exists()) {
-			return false;
-		}
-		try {
-			input = new FileOutputStream(file);
-			FileChannel fileChannel = input.getChannel();
-
-			lock = fileChannel.tryLock();
-
-			if (lock == null)
-				isLocked = true;
-			else
-				lock.release();
-		} catch (Exception e) {
-			if (e instanceof SecurityException)
-				// Can't write to file.
-				isLocked = true;
-			else if (e instanceof FileNotFoundException)
-				isLocked = false;
-			else if (e instanceof IOException)
-				isLocked = true;
-			// OverlappingFileLockException means that this JVM has it locked
-			// therefore it is not locked to us
-			else if (e instanceof OverlappingFileLockException)
-				isLocked = false;
-			// Could not get a lock for some other reason.
-			else
-				isLocked = true;
-		} finally {
-			if (input != null) {
-				try {
-					input.close();
-				} catch (Exception ex) {
-				}
-			}
-		}
-		return isLocked;
-	}
-
-	/**
-	 * Locks a file for the current JVM. Will create the file if it does not
-	 * exist
-	 * 
-	 * @param file
-	 * @return a FileLock object, or null if file could not be locked
-	 */
-	public static FileLock lockFile(File file) {
-		FileOutputStream input = null;
-		FileLock lock = null;
-		try {
-			input = new FileOutputStream(file);
-			FileChannel fileChannel = input.getChannel();
-			lock = fileChannel.tryLock();
-
-			if (lock.isValid())
-				return lock;
-		} catch (Exception e) {
-			// Could not get a lock for some reason.
-			return null;
-		} finally {
-			try {
-				if (input != null && (lock == null || !lock.isValid())) {
-					input.close();
-				}
-			} catch (Exception ex) {
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets all files in a specified path.
-	 * 
-	 * @param path
-	 *            absolute path of a folder
-	 * @param fileList
-	 *            a list to collect the files
-	 * @param recursive
-	 *            if <code>true</code>, find the files in sub folders as well
-	 */
-	public static void getAllFiles(File path, List<File> fileList,
-			boolean recursive) {
-		if (path.isDirectory()) {
-			File[] files = path.listFiles();
-			if (files != null) {
-				for (int i = 0; i < files.length; i++) {
-					if (files[i].isFile()) {
-						fileList.add(files[i]);
-					} else if (recursive) {
-						getAllFiles(files[i], fileList, recursive);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Given a directory and extension, returns all files (recursively) whose
-	 * extension starts with a given extension.
-	 * 
-	 * @param file
-	 *            a directory
-	 * @param extension
-	 *            a file extension
-	 * @return a colleciton of <code>File</code> with the given extension
-	 */
-	public static List<File> fileList(File f, String extension) {
-		extension = extension.toUpperCase();
-		List<File> returnList = new ArrayList<File>();
-		try {
-			if (f.isDirectory()) {
-				String[] flist = f.list();
-				for (int i = 0; i < flist.length; ++i) {
-					File fc = new File(f.getPath(), flist[i]);
-					returnList.addAll(fileList(fc, extension));
-				}
-			} else {
-				if (extension != null) {
-					String name = f.getName().toUpperCase();
-					if (name.lastIndexOf(".") != -1) //$NON-NLS-1$
-						if (name
-								.substring(name.lastIndexOf(".") + 1).startsWith(extension)) { //$NON-NLS-1$
-							returnList.add(f);
-						}
-				} else
-					returnList.add(f);
-			}
-		} catch (Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-		}
-		return returnList;
-	}
-
-	/**
-	 * Given a directory and extension, returns all files (recursively) whose
-	 * extension does not starts with a given extension.
-	 * 
-	 * @param file
-	 *            a directory
-	 * @param extension
-	 *            a file extension
-	 * @return a colleciton of <code>File</code> without the given extension
-	 */
-	public static List<File> fileListExcludeExt(File f, String extension) {
-		List<File> returnList = new ArrayList<File>();
-		try {
-			if (f.isDirectory()) {
-				String[] flist = f.list();
-				for (int i = 0; i < flist.length; ++i) {
-					File fc = new File(f.getPath(), flist[i]);
-					returnList.addAll(fileListExcludeExt(fc, extension));
-				}
-			} else {
-				if (extension != null) {
-					String name = f.getName();
-					if (name.lastIndexOf(".") != -1) //$NON-NLS-1$
-						if (!(name.substring(name.lastIndexOf(".") + 1).startsWith(extension))) { //$NON-NLS-1$
-							returnList.add(f);
-						}
-				} else
-					returnList.add(f);
-			}
-		} catch (Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-		}
-		return returnList;
-	}
-
-	/**
-	 * Gets all file paths in the specified path.
-	 * 
-	 * @param path,
-	 *            absolute path of a folder
-	 * @param recursive
-	 *            if <code>true</code>, find the files in sub folders as well
-	 */
-	public static ArrayList<String> getAllFileAbsolutePaths(File path,
-			boolean recursive) {
-		ArrayList<File> files = new ArrayList<File>();
-		getAllFiles(path, files, recursive);
-		ArrayList<String> paths = new ArrayList<String>();
-		for (int i = 0; i < files.size(); i++) {
-			String absPath = ((File) files.get(i)).getAbsolutePath();
-			paths.add(absPath);
-		}
-		return paths;
-	}
-
-	/**
-	 * Moves a file from a directory to another.
-	 * <p>
-	 * Attempts to rename the file first. If that fails, will copy the
-	 * sourceFile to destFile and delete the sourceFile.
-	 * 
-	 * @param sourceFile
-	 *            the source file
-	 * @param destFile
-	 *            the destination file
-	 * @return
-	 */
-	public static boolean moveFile(File sourceFile, File destFile) {
-		try {
-			doMoveFile(sourceFile, destFile);
-			return true;
-		} catch (Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-			return false;
-		}
-	}
-
-	public static void doMoveFile(File sourceFile, File destFile) throws IOException {
-		// Try to rename the source file to the destination file.
-		if (!sourceFile.renameTo(destFile)) {
-			// Try to copy the source file to the destination file and
-			// delete
-			// the source file.
-			copyfile(sourceFile, destFile);
-			sourceFile.delete();
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/I18nUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/I18nUtil.java
deleted file mode 100644
index faf66b8..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/I18nUtil.java
+++ /dev/null
@@ -1,219 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.File;
-import java.text.MessageFormat;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Helper utiltiies for handling internationalization.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class I18nUtil {
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private I18nUtil() {
-	}
-
-	/**
-	 * Returns the localized string associated with a resource key.
-	 * 
-	 * @param resourceBundle
-	 *            A resource bundle.
-	 * @param key
-	 *            A resource key.
-	 * @return A localized string.
-	 */
-	public static String getString(ResourceBundle resourceBundle, String key) {
-		if (resourceBundle != null) {
-			try {
-				return resourceBundle.getString(key);
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given string.
-	 * 
-	 * @param resourceBundle
-	 *            A resource bundle.
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String formatString(ResourceBundle resourceBundle,
-			String key, Object data) {
-		if (resourceBundle != null) {
-			try {
-				String localizedStr = resourceBundle.getString(key);
-				return MessageFormat
-						.format(localizedStr, new Object[] { data });
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with two given string.
-	 * 
-	 * @param resourceBundle
-	 *            A resource bundle.
-	 * @param key
-	 *            A resource key.
-	 * @param data1
-	 *            An object.
-	 * @param data2
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String formatString(ResourceBundle resourceBundle,
-			String key, Object data1, Object data2) {
-		if (resourceBundle != null) {
-			try {
-				String localizedStr = resourceBundle.getString(key);
-				return MessageFormat.format(localizedStr, new Object[] { data1,
-						data2 });
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given string.
-	 * 
-	 * @param resourceBundle
-	 *            A resource bundle.
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An array of objects.
-	 * @return A formatted localized string.
-	 */
-	public static String formatString(ResourceBundle resourceBundle,
-			String key, Object[] data) {
-		if (resourceBundle != null) {
-			try {
-				String localizedStr = resourceBundle.getString(key);
-				return MessageFormat.format(localizedStr, data);
-			} catch (MissingResourceException e) {
-			}
-		}
-		return '[' + key + ']';
-	}
-
-	/**
-	 * Returns the localized integer value associated with a resource key.
-	 * 
-	 * @param resourceBundle
-	 *            A resource bundle.
-	 * @param key
-	 *            A resource key.
-	 * @param defaultValue
-	 *            The default value to return if the resource key cannot be
-	 *            located.
-	 * @return A localized interger value.
-	 */
-	public static int getInt(String intString,
-			int defaultValue) {
-		try {
-			if (intString != null) {
-				return Integer.parseInt(intString);
-			}
-		} catch (Exception e) {
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * Returns the localized version of a US English resource file.
-	 * 
-	 * @param path
-	 *            The absolute path to a resource file.
-	 * @param locale
-	 *            A locale.
-	 * @return The localized resource file. If none exists, return null.
-	 */
-	public static String getLocalizedFile(String path, Locale locale) {
-		if (locale.equals(Locale.US) || path == null) {
-			return null;
-		}
-
-		// Build the locale string array. This is used to construct the
-		// localized file names.
-		String language = locale.getLanguage();
-		String country = locale.getCountry();
-		String variant = locale.getVariant();
-
-		String[] localeStrs = new String[3];
-		if (variant != null && variant.length() > 0) {
-			localeStrs[0] = locale.toString();
-		}
-		if (country != null && country.length() > 0) {
-			localeStrs[1] = language + "_" + country; //$NON-NLS-1$
-		}
-		if (language != null) {
-			localeStrs[2] = language;
-		}
-
-		String dir = path.replace('\\', '/');
-		String fileName;
-
-		int pathIndex = dir.lastIndexOf("/"); //$NON-NLS-1$
-		if (pathIndex > 0) {
-			dir = path.substring(0, pathIndex + 1);
-			fileName = path.substring(pathIndex + 1);
-		} else {
-			fileName = dir;
-			dir = ""; //$NON-NLS-1$
-		}
-
-		String fileExt = ""; //$NON-NLS-1$		
-		int extIndex = fileName.lastIndexOf("."); //$NON-NLS-1$
-		if (extIndex > 0) {
-			fileExt = fileName.substring(extIndex);
-			fileName = fileName.substring(0, extIndex);
-		}
-
-		fileName = dir + fileName + "_"; //$NON-NLS-1$
-
-		// Look for the localized file.
-		for (int i = 0; i < 3; i++) {
-			if (localeStrs[i] != null) {
-				// Gets the localized path name.
-				String fname = fileName + localeStrs[i] + fileExt;
-				File file = new File(fname);
-				if (file.exists()) {
-					return fname;
-				}
-			}
-		}
-
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ICommandLineRunner.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ICommandLineRunner.java
deleted file mode 100644
index 734731f..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ICommandLineRunner.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-/**
- * Interface for excuting a command line
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public interface ICommandLineRunner {
-	boolean execute(String[] args);
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ImageUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ImageUtil.java
deleted file mode 100644
index 6f70ba5..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ImageUtil.java
+++ /dev/null
@@ -1,179 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.MediaTracker;
-import java.awt.font.FontRenderContext;
-import java.awt.font.LineBreakMeasurer;
-import java.awt.font.TextAttribute;
-import java.awt.font.TextLayout;
-import java.awt.geom.Point2D;
-import java.awt.image.BufferedImage;
-import java.text.AttributedCharacterIterator;
-import java.text.AttributedString;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Utility class for creating image files.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ImageUtil {
-
-	// The BufferedImage cache.
-	private static HashMap<String, BufferedImage> imageCache = new HashMap<String, BufferedImage>();
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private ImageUtil() {
-	}
-
-	/**
-	 * Creates a <code>BufferedImage</code> from the given image file.
-	 * 
-	 * @param imageFile
-	 *            an image file
-	 * @param c
-	 *            an AWT component
-	 */
-	public static BufferedImage getBufferedImage(String imageFile, Component c) {
-		if (imageFile == null || c == null) {
-			return null;
-		}
-
-		BufferedImage bufferedImage = (BufferedImage) imageCache.get(imageFile);
-		if (bufferedImage != null) {
-			return bufferedImage;
-		}
-
-		Image image = c.getToolkit().getImage(imageFile);
-		MediaTracker tracker = new MediaTracker(c);
-		tracker.addImage(image, 0);
-		try {
-			tracker.waitForAll();
-		} catch (InterruptedException e) {
-		}
-
-		bufferedImage = new BufferedImage(image.getWidth(c),
-				image.getHeight(c), BufferedImage.TYPE_INT_ARGB);
-
-		Graphics2D g2d = bufferedImage.createGraphics();
-		g2d.drawImage(image, 0, 0, c);
-		imageCache.put(imageFile, bufferedImage);
-
-		return bufferedImage;
-	}
-
-	/**
-	 * Returns <code>true</code> if the given image is loaded successfully.
-	 * 
-	 * @param image
-	 *            an AWT image
-	 * @param c
-	 *            an AWT component
-	 */
-	public static boolean waitForImage(Image image, Component c) {
-		MediaTracker tracker = new MediaTracker(c);
-		tracker.addImage(image, 0);
-		try {
-			tracker.waitForAll();
-		} catch (InterruptedException ie) {
-		}
-		return (!tracker.isErrorAny());
-	}
-
-	/**
-	 * Draws the given text.
-	 * 
-	 * @param g2d
-	 *            the <code>Graphics2D</code> context
-	 * @param text
-	 *            the text to be rendered
-	 * @param font
-	 *            the font used for rendering the text
-	 * @param color
-	 *            the color used for rendering the text
-	 * @param x
-	 *            the horizontal coordinate used for rendering the text
-	 * @param y
-	 *            the verticalcoordinate used for rendering the text
-	 */
-	public static void drawText(Graphics2D g2d, String text, Font font,
-			Color color, int x, int y) {
-		if (text == null || text.length() == 0) {
-			return;
-		}
-		g2d.setColor(color);
-		FontRenderContext frc = g2d.getFontRenderContext();
-		TextLayout textlayout = new TextLayout(text, font, frc);
-		textlayout.draw(g2d, x, y);
-	}
-
-	/**
-	 * Draws the given text and wraps it based on the given width.
-	 * 
-	 * @param g2d
-	 *            the <code>Graphics2D</code> context
-	 * @param text
-	 *            the text to be rendered
-	 * @param font
-	 *            the font used for rendering the text
-	 * @param color
-	 *            the color used for rendering the text
-	 * @param x
-	 *            the horizontal coordinate used for rendering the text
-	 * @param y
-	 *            the verticalcoordinate used for rendering the text
-	 * @param width
-	 *            the maximum width used for wrapping the text
-	 * @param maxLine
-	 *            the maximum number of line of wrapped text
-	 */
-	public static void drawText(Graphics2D g2d, String text, Font font,
-			Color color, int x, int y, float width, int maxLine) {
-		if (text == null || text.length() == 0) {
-			return;
-		}
-		float maxWrapWidth = width - 10;
-		g2d.setColor(color);
-		Point2D.Float pen = new Point2D.Float(x, y);
-		Map<TextAttribute, Font> attributes = new HashMap<TextAttribute, Font>();
-		attributes.put(TextAttribute.FONT, font);
-		AttributedCharacterIterator textIterator = new AttributedString(text,
-				attributes).getIterator();
-		FontRenderContext frc = g2d.getFontRenderContext();
-		LineBreakMeasurer measurer = new LineBreakMeasurer(textIterator, frc);
-		int line = 1;
-		while (line <= maxLine) {
-			TextLayout layout = measurer.nextLayout(maxWrapWidth);
-			if (layout == null)
-				break;
-			pen.y += layout.getAscent();
-			float dx = 0;
-			if (layout.isLeftToRight()) {
-				dx = (width - layout.getAdvance());
-			}
-			layout.draw(g2d, pen.x + dx / 2, pen.y);
-			pen.y += layout.getDescent() + layout.getLeading() - 1;
-			line++;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/MathUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/MathUtil.java
deleted file mode 100644
index 0c074ff..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/MathUtil.java
+++ /dev/null
@@ -1,25 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-/**
- * Utility class for performing math operations.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MathUtil {
-
-	public static final long ceil1000(long l) {
-		return (l - (l & 7));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/NetUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/NetUtil.java
deleted file mode 100644
index 0d2d150..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/NetUtil.java
+++ /dev/null
@@ -1,381 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-
-/**
- * Implements a utility class for managing URLs and URIs.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class NetUtil {
-
-	/**
-	 * FILE scheme.
-	 */
-	public final static String FILE_SCHEME = "file"; //$NON-NLS-1$
-
-	/**
-	 * File URI prefix.
-	 */
-	public final static String FILE_URI_PREFIX = FILE_SCHEME + ":/"; //$NON-NLS-1$
-
-	/**
-	 * File URI prefix size.
-	 */
-	public final static int FILE_URI_PREFIX_LENGTH = FILE_URI_PREFIX.length();
-
-	/**
-	 * HTTP scheme.
-	 */
-	public final static String HTTP_SCHEME = "http"; //$NON-NLS-1$
-
-	/**
-	 * HTTP URI prefix.
-	 */
-	public final static String HTTP_URI_PREFIX = HTTP_SCHEME + "://"; //$NON-NLS-1$
-
-	/**
-	 * HTTP URI prefix size.
-	 */
-	public final static int HTTP_URI_PREFIX_LENGTH = HTTP_URI_PREFIX.length();
-
-	public static final String FILE_PREFIX_2 = "file://"; //$NON-NLS-1$
-
-	public static final String FILE_PREFIX_3 = "file:///"; //$NON-NLS-1$
-
-	/**
-	 * A table of hex values.
-	 */
-	private final static String[] HEX_VALUES = {
-			"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%28", "%29", "%2A", "%2B", "%2C", "%2D", "%2E", "%2F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%38", "%39", "%3A", "%3B", "%3C", "%3D", "%3E", "%3F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%48", "%49", "%4A", "%4B", "%4C", "%4D", "%4E", "%4F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%58", "%59", "%5A", "%5B", "%5C", "%5D", "%5E", "%5F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%68", "%69", "%6A", "%6B", "%6C", "%6D", "%6E", "%6F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%78", "%79", "%7A", "%7B", "%7C", "%7D", "%7E", "%7F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-	};
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private NetUtil() {
-	}
-
-	/**
-	 * Returns the URI for the given file.
-	 * 
-	 * @param file
-	 *            The input file.
-	 * @return The URI for the given file.
-	 * @throws MalformedURLException
-	 *             if an error occur while constructing the URI for the given
-	 *             file.
-	 */
-	public static String getUri(File file) throws MalformedURLException {
-		String url = file.toURL().toExternalForm();
-		StringBuffer strBuf = new StringBuffer();
-		int urlLength = url.length();
-		for (int i = 0; i < urlLength; i++) {
-			char ch = url.charAt(i);
-			switch (ch) {
-			case ' ':
-				strBuf.append("%20"); //$NON-NLS-1$
-				break;
-			default:
-				strBuf.append(ch);
-				break;
-			}
-		}
-		return strBuf.toString();
-	}
-
-	/**
-	 * Resolves the given URI using the given the base URI.
-	 * 
-	 * @param uri
-	 *            The URI to resolve.
-	 * @param baseUri
-	 *            The base URI.
-	 * @return A fully formed URI.
-	 */
-	public static String resolveUri(String uri, String baseUri) {
-		if (uri == null) {
-			return null;
-		}
-
-		if (uri.startsWith("../")) { //$NON-NLS-1$
-			if (baseUri.endsWith("/")) { //$NON-NLS-1$
-				baseUri = baseUri.substring(0, baseUri.length() - 1);
-			}
-			while (uri.startsWith("../")) { //$NON-NLS-1$
-				uri = uri.substring(3);
-				int index = baseUri.lastIndexOf('/');
-				if (index > 0) {
-					baseUri = baseUri.substring(0, index);
-				}
-			}
-			uri = "/" + uri; //$NON-NLS-1$
-		}
-
-		if (uri.startsWith("/")) { //$NON-NLS-1$
-			return baseUri.endsWith("/") //$NON-NLS-1$
-					? baseUri + uri.substring(1) : baseUri + uri;
-		}
-
-		if (uri.startsWith(FILE_URI_PREFIX) || uri.startsWith(HTTP_URI_PREFIX)) {
-			return uri;
-		}
-
-		return baseUri.endsWith("/") ? baseUri + uri : baseUri + '/' + uri; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the input stream for the given URI.
-	 * 
-	 * @param uri
-	 *            The source URI.
-	 * @return The input stream for the given URI.
-	 * @throw MalformedURLException if a given XML document URI is invalid.
-	 * @throw IOException if an I/O error occur while accessing the URI.
-	 */
-	public static InputStream getInputStream(String uri)
-			throws MalformedURLException, IOException {
-		if (uri == null) {
-			return null;
-		}
-
-		if (uri.startsWith(HTTP_URI_PREFIX)) {
-			URL url = new URL(uri);
-			return url.openStream();
-		} else if (uri.startsWith(FILE_URI_PREFIX)) {
-			uri = uri.substring(FILE_URI_PREFIX_LENGTH);
-		}
-
-		return new FileInputStream(NetUtil.decodeUrl(uri, null));
-	}
-
-	/**
-	 * Returns the Java string represention (encoded in UTF-16) of the given URL
-	 * (encoded in the given encoding and ASCII-escaped).
-	 * 
-	 * @param url
-	 *            The URL to decode.
-	 * @param encoding
-	 *            The encoding of the URL.
-	 * @return The Java UTF-16 string respresentation.
-	 * @throws IllegalArgumentException
-	 *             if the given URL contain improperly escaped characters.
-	 */
-	public static String decodeUrl(String url, String encoding) {
-		if (url == null) {
-			return url;
-		}
-		
-		int len = url.length();
-		if (len == 0) {
-			return url;
-		}
-
-		// Unescape the url.
-		StringBuffer strBuf = new StringBuffer();
-		for (int i = 0; i < len; i++) {
-			char ch = url.charAt(i);
-			switch (ch) {
-			case '+':
-				strBuf.append(' ');
-				break;
-			case '%':
-				try {
-					strBuf.append((char) Integer.parseInt(url.substring(i + 1,
-							i + 3), 16));
-				} catch (NumberFormatException e) {
-					throw new IllegalArgumentException();
-				}
-				i += 2;
-				break;
-			default:
-				strBuf.append(ch);
-				break;
-			}
-		}
-
-		// Convert the un-escaped byte values to Java UTF-16 string.
-		String result = strBuf.toString();
-		if (encoding != null) {
-			try {
-				byte[] bytes = result.getBytes("8859_1"); //$NON-NLS-1$
-				result = new String(bytes, encoding);
-			} catch (UnsupportedEncodingException e) {
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Returns the ASCII-escaped representation (encoded in the specified
-	 * encoding) of the given URL (encoded in UTF-16).
-	 * 
-	 * @param url
-	 *            The URL to encode.
-	 * @param encoding
-	 *            The encoding of the URL.
-	 * @return the ASCII-escaped respresentation.
-	 * @throws IllegalArgumentException
-	 *             if the given URL contain improperly escaped characters.
-	 * @throws UnsupportedEncodingException
-	 *             if the given coding is unsupport.
-	 */
-	public static String encodeUrl(String url, String encoding)
-			throws UnsupportedEncodingException {
-		if (url == null) {
-			return url;
-		}		
-		int len = url.length();
-		if (len == 0) {
-			return url;
-		}
-
-		StringBuffer result = new StringBuffer();
-
-		byte[] bytes = url.getBytes(encoding);
-		for (int i = 0; i < bytes.length; i++) {
-			char ch = (char) bytes[i];
-
-			if (ch >= 'a' && ch <= 'z') {
-				result.append(ch);
-			} else if (ch >= 'A' && ch <= 'Z') {
-				result.append(ch);
-			} else if (ch >= '0' && ch <= '9') {
-				result.append(ch);
-			} else {
-				switch (ch) {
-				case '-':
-				case '_':
-				case '.':
-				case '!':
-				case '~':
-				case '*':
-				case '\'':
-				case '(':
-				case ')':
-					result.append(ch);
-					break;
-				default:
-					result.append(HEX_VALUES[ch & 0xFF]);
-					break;
-				}
-			}
-		}
-
-		return result.toString();
-	}
-
-	/**
-	 * Returns the ASCII-escaped representation of the given file URL.
-	 * 
-	 * @param fileURL
-	 *            The file URL to encode.
-	 * @return the ASCII-escaped respresentation.
-	 */
-	public static String encodeFileURL(String fileURL) {
-		String url = fileURL;
-		StringBuffer strBuf = new StringBuffer();
-		int urlLength = url.length();
-		for (int i = 0; i < urlLength; i++) {
-			char ch = url.charAt(i);
-			switch (ch) {
-			case ' ':
-				strBuf.append("%20"); //$NON-NLS-1$
-				break;
-			default:
-				strBuf.append(ch);
-				break;
-			}
-		}
-		return strBuf.toString();
-	}
-
-	/**
-	 * Returns the ASCII-escaped representation of the given file URL.
-	 * 
-	 * @param fileURL
-	 *            The file URL to encode.
-	 * @return the ASCII-escaped respresentation.
-	 */
-	public static String decodedFileUrl(String fileURL) {
-		String url = fileURL;
-		StringBuffer strBuf = new StringBuffer();
-		int urlLength = url.length();
-		for (int i = 0; i < urlLength; i++) {
-			char ch = url.charAt(i);
-			switch (ch) {
-			case '%':
-				try {
-					strBuf.append((char) Integer.parseInt(url.substring(i + 1,
-							i + 3), 16));
-				} catch (NumberFormatException e) {
-					throw new IllegalArgumentException();
-				}
-				i += 2;
-				break;
-			default:
-				strBuf.append(ch);
-				break;
-			}
-		}
-		return strBuf.toString();
-	}
-	
-	public static String decodeURL (String url) throws UnsupportedEncodingException {
-//		url = url.replaceAll("\\+", "%2B"); //$NON-NLS-1$
-		url = URLDecoder.decode(url, "UTF-8"); //$NON-NLS-1$
-		return url;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ProfilingUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ProfilingUtil.java
deleted file mode 100644
index 4b29acb..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ProfilingUtil.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.PrintStream;
-
-
-/**
- * Utility class for profiling
- * 
- * @author Weiping Lu
- * @since 1.0
- */
-
-public class ProfilingUtil {
-
-	public static boolean traceFootprint = false;
-	
-	private static PrintStream output = System.out;
-	
-	public static void setOutput(PrintStream ps) {
-		output = ps;
-	}
-	
-	public static void fullGC() {
-		Runtime rt = Runtime.getRuntime();
-		long isFree = rt.freeMemory();
-		long wasFree;
-		do {
-			wasFree = isFree;
-			rt.runFinalization();
-			rt.gc();
-			isFree = rt.freeMemory();
-		} while (isFree > wasFree);
-	}
-	
-	public static long traceUsedMemory(String location) {
-		Runtime rt = Runtime.getRuntime();
-		long usedMem = rt.totalMemory() - rt.freeMemory();
-		output.println("Footprint> " + location + ": " + usedMem/1000 + " K"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$	
-										
-		return usedMem;
-	}
-
-	public static long traceUsedMemoryDiff(String locationInfo, long currUsed, long PrevUsed) {
-		long diff = currUsed - PrevUsed;
-		output.println("Footprint> Diff, " + locationInfo + ": " + diff/1000 + " K\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-										
-		return diff;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/StrUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/StrUtil.java
deleted file mode 100644
index 7e220a6..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/StrUtil.java
+++ /dev/null
@@ -1,559 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.net.URI;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.CommonPlugin;
-
-import com.ibm.icu.lang.UCharacter;
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * A helper class for manuipulating strings.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class StrUtil {
-
-	public static final String TAB = "\t"; //$NON-NLS-1$
-
-	private static final String REGEXP_ANY_SPECIAL_CHARS = "(`|~|!|@|#|\\$|%|\\^|&|\\*|\\(|\\)|\\+|=|\\[|\\]|\\||\\:|\"|<|>|\\?|/|'|\\s|\\\\)+"; //$NON-NLS-1$
-
-	private static final String REGEXP_INVALID_PUBLISHED_PATH_CHARS = "(\\[|#|\\*|\\?|\"|<|>|\\||!|%|/|\\])+"; //$NON-NLS-1$
-
-	private static final String REGEXP_INVALID_PUBLISHED_PATH_CHARS_LINUX = "(\\[|#|\\*|\\?|\"|<|>|\\||!|%|\\])+"; //$NON-NLS-1$
-
-	private static final String REGEXP_INVALID_FILENAME_CHARS = "(\\[|#|/|\\\\|\\:|\\*|\\?|\"|<|>|\\||\\]|\\s)+"; //$NON-NLS-1$
-
-	private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
-			'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
-	public static final String LINE_FEED = System.getProperty("line.separator"); //$NON-NLS-1$
-
-	public static final String ESCAPED_LF = "&#xA;"; //$NON-NLS-1$
-
-	public static final String ESCAPED_CR = "&#xD;"; //$NON-NLS-1$
-
-	public static final String ESCAPED_LINE_FEED = LINE_FEED.replace(
-			"\n", ESCAPED_LF).replace("\r", ESCAPED_CR); //$NON-NLS-1$ //$NON-NLS-2$
-
-	public static final String LINE_FEED_REGEX = LINE_FEED.replaceAll(
-			"\\\\", "\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	public static final String ESCAPED_LINE_FEED_REGEX = ESCAPED_LINE_FEED;
-
-	public static final String HTML_BREAK = "<br/>";//$NON-NLS-1$
-
-	public static final String HTML_COPY = "&copy;";//$NON-NLS-1$
-
-	public static final String HTML_EURO = "&euro;";//$NON-NLS-1$ 	
-
-	public static final String HTML_REG = "&reg;";//$NON-NLS-1$ 
-
-	public static final String HTML_TRADEMARK = "&trade;";//$NON-NLS-1$
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private StrUtil() {
-	}
-
-	/**
-	 * Tests for null string.
-	 * <p>
-	 * A null string is defined as one that has an empty reference or has zero
-	 * length.
-	 * 
-	 * @param str
-	 *            a string
-	 * @return <code>true</code> if the given string is a null string
-	 */
-	public static boolean isNull(String str) {
-		return str == null || str.length() == 0;
-	}
-
-	/**
-	 * Tests for blank string.
-	 * <p>
-	 * A blank string is defined as one that has an empty reference or has zero
-	 * length after the leading and trailing space characters are trimmed.
-	 * 
-	 * @param str
-	 *            a string
-	 * @return <code>true</code> if the given string is a blank string
-	 */
-	public static boolean isBlank(String str) {
-		return str == null || str.trim().length() == 0;
-	}
-
-	/**
-	 * Removes the leading and trailing space characters from a string.
-	 * 
-	 * @param str
-	 *            a string
-	 * @return a string with no leading and trailing space characters
-	 */
-	public static String trim(String str) {
-		return str == null ? null : str.trim();
-	}
-
-	/**
-	 * Removes whitespace characters (TAB, CR, LF and SPACE) from a string.
-	 * 
-	 * @param str
-	 *            a string
-	 * @return a string with whitespace characters removed
-	 */
-	public static String removeWhiteSpaceChars(String str) {
-		int len = (str == null) ? 0 : str.length();
-		for (int i = 0; i < len; i++) {
-			switch (str.charAt(i)) {
-			case '\t':
-			case '\r':
-			case '\n':
-			case ' ':
-				break;
-			default:
-				return str;
-			}
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Splits a string into an array of string tokens.
-	 * 
-	 * @param str
-	 *            a string
-	 * @param sep
-	 *            a string containing the string separators
-	 * @param count
-	 *            the desired number of string tokens
-	 * @return an array of string tokens
-	 */
-	public static String[] split(String str, String sep, int count) {
-		if (str == null || count == 0 || count < -1) {
-			return null;
-		}
-
-		StringTokenizer tokenizer = new StringTokenizer(str, sep,
-				count == -1 ? false : true);
-
-		if (count == -1) {
-			count = tokenizer.countTokens();
-		}
-
-		String[] result = new String[count];
-		int i = 0;
-		while (tokenizer.hasMoreTokens()) {
-			String t = tokenizer.nextToken();
-			if (i < count) {
-				if ((t.length() == 1) && (sep.indexOf(t) != -1)) {
-					continue;
-				}
-				result[i++] = t;
-			} else {
-				result[count - 1] += t;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Splits a string into an array of string tokens.
-	 * 
-	 * @param str
-	 *            a string
-	 * @param sep
-	 *            a string containing the string separators
-	 * @return an array of string tokens
-	 */
-	public static String[] split(String str, String sep) {
-		return split(str, sep, -1);
-	}
-
-	/**
-	 * Replaces a substring within a string with another substring.
-	 * <p>
-	 * Note: Only the first occurrence of the substring will be replaced.
-	 * 
-	 * @param str
-	 *            a string
-	 * @param src
-	 *            the substring to replace
-	 * @param tgt
-	 *            the substring to use for the replacement
-	 * @return a string with the first substring replaced
-	 * 
-	 * TODO: Review implementation. Call String.replaceFirst() instead?
-	 */
-	public static String replace(String str, String src, String tgt) {
-		if ((str == null || str.length() == 0)
-				|| (src == null || src.length() == 0)) {
-			return str;
-		}
-
-		String tmpStr = str;
-		int index;
-		while ((index = tmpStr.indexOf(src)) != -1) {
-			tmpStr = tmpStr.substring(0, index) + tgt
-					+ tmpStr.substring(index + src.length());
-		}
-		return tmpStr;
-	}
-
-	/**
-	 * Returns the integer value of a string.
-	 * 
-	 * @param str
-	 *            a string
-	 * @param defaultValue
-	 *            a default integer value for the string
-	 * @return the integer value of the given string
-	 */
-	public static int getIntValue(String str, int defaultValue) {
-		if (StrUtil.isBlank(str)) {
-			return defaultValue;
-		}
-
-		try {
-			return Integer.parseInt(str);
-		} catch (NumberFormatException e) {
-			return defaultValue;
-		}
-	}
-
-	/**
-	 * Returns an array of bytes representing the UTF-8 encoding of a string.
-	 * 
-	 * @param str
-	 *            a string
-	 * @return a byte array containing the UTF-8 encoding of the given string
-	 */
-	public static byte[] getUTF8Bytes(String str) {
-		char[] c = str.toCharArray();
-		int len = c.length;
-		int count = 0;
-		for (int i = 0; i < len; i++) {
-			int ch = c[i];
-			if (ch <= 0x7f) {
-				count++;
-			} else if (ch <= 0x7ff) {
-				count += 2;
-			} else {
-				count += 3;
-			}
-		}
-
-		byte[] b = new byte[count];
-		int off = 0;
-		for (int i = 0; i < len; i++) {
-			int ch = c[i];
-			if (ch <= 0x7f) {
-				b[off++] = (byte) ch;
-			} else if (ch <= 0x7ff) {
-				b[off++] = (byte) ((ch >> 6) | 0xc0);
-				b[off++] = (byte) ((ch & 0x3f) | 0x80);
-			} else {
-				b[off++] = (byte) ((ch >> 12) | 0xe0);
-				b[off++] = (byte) (((ch >> 6) & 0x3f) | 0x80);
-				b[off++] = (byte) ((ch & 0x3f) | 0x80);
-			}
-		}
-		return b;
-	}
-
-	/**
-	 * Returns the hexidecimal character representation for an integer.
-	 * 
-	 * @param value
-	 *            an integer
-	 * @return the hexidecimal representation
-	 */
-	private static char toHex(int value) {
-		return HEX_DIGITS[(value & 0xF)];
-	}
-
-	/**
-	 * Returns the escaped Unicode representation of a string.
-	 * 
-	 * @param str
-	 *            a string
-	 * @param skipASCII
-	 *            if <code>true</code>, avoid escaping the ASCII characters
-	 * @return the escaped Unicode representation of the given string
-	 */
-	public static String toEscapedUnicode(String str, boolean skipASCII) {
-		int len = str.length();
-		StringBuffer result = new StringBuffer(len * 2);
-
-		for (int i = 0; i < len; i++) {
-			char ch = str.charAt(i);
-
-			if (skipASCII && ch < 0x007E) {
-				result.append(ch);
-			} else {
-				result.append("\\u"); //$NON-NLS-1$
-				result.append(toHex((ch >> 12) & 0xF));
-				result.append(toHex((ch >> 8) & 0xF));
-				result.append(toHex((ch >> 4) & 0xF));
-				result.append(toHex(ch & 0xF));
-			}
-		}
-
-		return result.toString();
-	}
-
-	/**
-	 * Returns the escaped HTML representation of a string.
-	 * 
-	 * @param html
-	 *            a HTML string
-	 * @return the escaped Unicode representation of the given HTML string
-	 */
-	public static String getEscapedHTML(String html) {
-		if (html == null || html.length() == 0) {
-			return ""; //$NON-NLS-1$
-		}
-
-		StringBuffer result = new StringBuffer();
-		int length = html.length();
-		for (int i = 0; i < length; i++) {
-			char ch = html.charAt(i);
-			switch (ch) {
-			case '%':
-				if (i + 4 < length) {
-					String hexStr = html.substring(i + 1, i + 5);
-					boolean validHextStr = true;
-					for (int j = 0; j < hexStr.length(); j++) {
-						char c = hexStr.charAt(j);
-						if (!(c >= '0' && c <= '9') || (c >= 'a' && c <= 'f')) {
-							validHextStr = false;
-							break;
-						}
-					}
-					if (validHextStr) {
-						try {
-							int codePoint = Integer.parseInt(hexStr, 16);
-							char[] c = UCharacter.toChars(codePoint);
-							result.append(c);
-							i += 4;
-							break;
-						} catch (Exception e) {
-						}
-					}
-				}
-				result.append(ch);
-				break;
-			case '\u00a9':
-				result.append(HTML_COPY);
-				break;
-			case '\u00ae':
-				result.append(HTML_REG);
-				break;
-			case '\u20ac':
-				result.append(HTML_EURO);
-				break;
-			case '\u2122':
-				result.append(HTML_TRADEMARK);
-				break;
-			default:
-				result.append(ch);
-				break;
-			}
-		}
-		return result.toString();
-	}
-
-	/**
-	 * Returns the plain text from HTML text.
-	 * <p>
-	 * Note: All HTML tags will be stripped.
-	 * 
-	 * @param html
-	 *            the HTML text.
-	 * @return the plain text representation of the given HTML text
-	 */
-	public static String getPlainText(String html) {
-		if (html == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		final Pattern p_plaintext_filter = Pattern.compile(
-				"<[^>]*?>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-		final Pattern p_plaintext_filter2 = Pattern.compile(
-				"&.{1,5}[^;];", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-		final Pattern p_plaintext_filter3 = Pattern.compile(
-				"\\s+", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-		String result = html.replaceAll(p_plaintext_filter.pattern(), " ") //$NON-NLS-1$
-				.replaceAll(p_plaintext_filter2.pattern(), " ") //$NON-NLS-1$
-				.replaceAll(p_plaintext_filter3.pattern(), " "); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * Converts a string into a valid file name.
-	 * 
-	 * @param str
-	 *            a string
-	 * @return a valid file name derived from the given string
-	 */
-	public static String makeValidFileName(String str) {
-		if (str == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getPlainText(str)
-				.replaceAll(REGEXP_INVALID_FILENAME_CHARS, " ").trim(); //$NON-NLS-1$ 
-	}
-
-	public static String removeSpecialCharacters(String str) {
-		if (str == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getPlainText(str)
-				.replaceAll(REGEXP_ANY_SPECIAL_CHARS, " ").trim(); //$NON-NLS-1$ 
-	}
-
-	/**
-	 * Returns true if the path does not contain any invalid filename
-	 * characters.
-	 * 
-	 * @param path
-	 *            the file path
-	 * @return <code>true</code> if the given path contains only valid
-	 *         filename characters
-	 */
-	public static boolean isValidPublishPath(String path) {
-		// return path.replaceAll(invalidPublishPathCharsRegExp,
-		// "").equals(path);
-
-		if (Platform.getOS().equals(Platform.WS_WIN32)) {
-			return path
-					.replaceAll(REGEXP_INVALID_PUBLISHED_PATH_CHARS, "").equals(path); //$NON-NLS-1$
-		}
-
-		// else default to Linux
-		return path
-				.replaceAll(REGEXP_INVALID_PUBLISHED_PATH_CHARS_LINUX, "").equals(path); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the lower-case of str unless the current locale is German
-	 * 
-	 * @param str
-	 * @return
-	 */
-	public static String toLower(String str) {
-		if (Platform.getNL().startsWith("de")) { //$NON-NLS-1$
-			return str;
-		}
-		return str.toLowerCase();
-	}
-
-	/**
-	 * escape the " and '
-	 * 
-	 * @param str
-	 * @return
-	 */
-	public static String escape(String str) {
-		return str.replaceAll("'", "\\\\\'").replaceAll("\"", "\\\\\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	}
-
-	/**
-	 * Converts a <code>List</code> to an String array.
-	 * 
-	 * @param list
-	 *            a <code>List</code>
-	 * @return a String array
-	 */
-	public static String[] convertListToStrArray(List list) {
-		if (list != null) {
-			int cnt = list.size();
-			String[] strArray = new String[cnt];
-
-			for (int i = 0; i < cnt; i++) {
-				String str = (String) list.get(i);
-				strArray[i] = new String(str);
-			}
-			return strArray;
-		} else {
-			return null;
-		}
-	}
-
-	public static boolean isValidName(String name) {
-		return name.replaceAll(REGEXP_ANY_SPECIAL_CHARS, "").equals(name); //$NON-NLS-1$		
-	}
-
-	/**
-	 * added some test code
-	 * 
-	 * @param args
-	 */
-	public static void main(String[] args) {
-
-		String text = "A&%      `&#           $~!@#$%^&*()_-+={}[\"]:|\\:;\"'<,>.?/ \t\r\nZ"; //$NON-NLS-1$
-
-		System.out.println("[" + text + "] <== text"); //$NON-NLS-1$ //$NON-NLS-2$
-		System.out.println("[" + text.replaceAll(REGEXP_ANY_SPECIAL_CHARS, " ") //$NON-NLS-1$ //$NON-NLS-2$
-				+ "] <== All"); //$NON-NLS-1$
-		System.out.println("[" //$NON-NLS-1$
-				+ text.replaceAll(REGEXP_INVALID_FILENAME_CHARS, " ") //$NON-NLS-1$
-				+ "] <== File Name"); //$NON-NLS-1$
-		System.out.println("[" //$NON-NLS-1$
-				+ text.replaceAll(REGEXP_INVALID_PUBLISHED_PATH_CHARS, " ") //$NON-NLS-1$
-				+ "] <== path"); //$NON-NLS-1$
-		System.out.println("[" //$NON-NLS-1$
-				+ text.replaceAll(REGEXP_INVALID_PUBLISHED_PATH_CHARS_LINUX,
-						" ") + "] <== path, Linux"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		System.out.println(""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Converts the platform line-separator (\n or \n\r or \r) to &lt;br/&gt;
-	 * 
-	 * @param text
-	 * @return
-	 */
-	public static String convertNewlinesToHTML(String text) {
-		if (text != null) {
-			text = text.replaceAll(LINE_FEED_REGEX, HTML_BREAK + LINE_FEED);
-			text = text.replaceAll(ESCAPED_LINE_FEED_REGEX, HTML_BREAK
-					+ ESCAPED_LINE_FEED);
-		}
-		return text;
-	}
-
-	public static URI toURI(String pathStr) {
-		if (pathStr != null && pathStr.length() > 0) {
-			IPath path = Path.fromOSString(pathStr);
-			try {
-				return path.toFile().toURI();
-			} catch (Exception e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ThreadUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ThreadUtil.java
deleted file mode 100644
index a5b423a..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ThreadUtil.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-/**
- * Utility class for handling threads.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ThreadUtil {
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private ThreadUtil() {
-	}
-
-	/**
-	 * Puts the current thread to sleep for a given duration.
-	 * 
-	 * @param time
-	 *            The duration in milliseconds.
-	 */
-	public static void pause(long time) {
-		try {
-			Thread.sleep(time);
-		} catch (InterruptedException e) {
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/Timer.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/Timer.java
deleted file mode 100644
index 89f298a..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/Timer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-import com.ibm.icu.util.Calendar;
-
-/**
- * A simple timer for tracking time.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class Timer {
-
-	private long initTime;
-
-	private long startTime;
-
-	private long endTime;
-
-	public Timer() {
-		start();
-		initTime = startTime;
-	}
-
-	public void start() {
-		startTime = Calendar.getInstance().getTimeInMillis();
-	}
-
-	public void stop() {
-		endTime = Calendar.getInstance().getTimeInMillis();
-	}
-
-	public int getTime() {
-		return (int) (endTime - startTime);
-	}
-
-	public int getTotalTime() {
-		return (int) (endTime - initTime);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/WarUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/WarUtil.java
deleted file mode 100644
index 92dcefb..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/WarUtil.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.War;
-import org.apache.tools.ant.types.FileSet;
-
-
-public class WarUtil {
-
-	/**
-	 * Creates a war file.
-	 * 
-	 * @param outputWarFile
-	 *            an absolute path to the target war file
-	 * @param webAppDirectory
-	 *            an absolute path to a directory containing the files and sub
-	 *            directories to be wared
-	 * @param monitor
-	 *            a progress monitor
-	 * @throws IOException
-	 *             if an error occurs while creating the zip file
-	 */
-	public static void buildWarFile(String outputWarFile, String webAppDirectory,
-			IProgressMonitor monitor) throws IOException {
-
-		try {
-			Project antProject = new Project();
-			antProject.init();
-			War warTask = new War();
-			warTask.setProject(antProject);
-			warTask.setDestFile(new File(outputWarFile));
-			warTask.setWebxml(new File(webAppDirectory + File.separator + "WEB-INF" //$NON-NLS-1$
-					+ File.separator + "web.xml")); //$NON-NLS-1$
-			FileSet webFiles = new FileSet();
-			webFiles.setDir(new File(webAppDirectory));
-			warTask.addFileset(webFiles);
-			warTask.execute();
-		} catch (Exception e) {
-			throw new IOException(e.getMessage());
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/XMLUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/XMLUtil.java
deleted file mode 100644
index c64778c..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/XMLUtil.java
+++ /dev/null
@@ -1,612 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXParseException;
-
-/**
- * Utility class for processing XML documents.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class XMLUtil {
-
-	/**
-	 * XML declaration.
-	 */
-	public final static String XML_DECLARATION = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$
-
-	/**
-	 * XML Escape characters.
-	 */
-	public final static String XML_AMP = "&amp;"; //$NON-NLS-1$
-
-	public final static String XML_BACKSLASH = "&#92;"; //$NON-NLS-1$	
-
-	public final static String XML_APOS = "&apos;"; //$NON-NLS-1$
-
-	public final static String XML_CR = "&#13;"; //$NON-NLS-1$
-
-	public final static String XML_GT = "&gt;"; //$NON-NLS-1$
-
-	public final static String XML_LT = "&lt;"; //$NON-NLS-1$
-
-	public final static String XML_LF = "&#10;"; //$NON-NLS-1$	
-
-	public final static String XML_QUOT = "&quot;"; //$NON-NLS-1$
-
-	public final static String XML_TAB = "&#9;"; //$NON-NLS-1$
-
-	private static final String CRLF = "\r\n"; //$NON-NLS-1$
-
-	private static final byte[] CRLF_BYTES = CRLF.getBytes();
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private XMLUtil() {
-	}
-
-	/**
-	 * Clones the given DOM node into the given DOM document.
-	 * 
-	 * @param node
-	 *            The DOM node to clone.
-	 * @param doc
-	 *            The target DOM document.
-	 * @return The cloned node in the target DOM document.
-	 */
-	public static Node cloneNode(Node node, Document doc) {
-		Node clone = null;
-		switch (node.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			clone = doc.createElement(node.getNodeName());
-			NamedNodeMap attrs = node.getAttributes();
-			for (int i = 0; i < attrs.getLength(); i++) {
-				Node attrNode = attrs.item(i);
-				Attr attrClone = doc.createAttribute(attrNode.getNodeName());
-				attrClone.setNodeValue(attrNode.getNodeValue());
-				((Element) clone).setAttributeNode(attrClone);
-			}
-
-			// Iterate through each child nodes.
-			NodeList childNodes = node.getChildNodes();
-			if (childNodes != null) {
-				for (int i = 0; i < childNodes.getLength(); i++) {
-					Node childNode = childNodes.item(i);
-					Node childClone = cloneNode(childNode, doc);
-					clone.appendChild(childClone);
-				}
-			}
-			break;
-
-		case Node.TEXT_NODE:
-		case Node.CDATA_SECTION_NODE:
-			clone = doc.createTextNode(node.getNodeName());
-			clone.setNodeValue(node.getNodeValue());
-			break;
-		}
-		return clone;
-	}
-
-	/**
-	 * Escapes a XML attribute to make it XML parser friendly.
-	 * 
-	 * @param str
-	 *            The XML attribute string.
-	 * @return The escaped string.
-	 */
-	public static String escapeAttr(String str) {
-		if (str == null || str.length() == 0)
-			return ""; //$NON-NLS-1$
-		StringBuffer sb = new StringBuffer();
-		int len = str.length();
-		for (int i = 0; i < len; i++) {
-			char ch = str.charAt(i);
-			switch (ch) {
-			case '<':
-				sb.append(XML_LT);
-				break;
-			case '&':
-				sb.append(XML_AMP);
-				break;
-			case '"':
-				sb.append(XML_QUOT);
-				break;
-			default:
-				sb.append(ch);
-				break;
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Escapes the given string to make it XML parser friendly.
-	 * 
-	 * @param str
-	 *            The source string.
-	 * @return The escaped string.
-	 */
-	public static String escape(String str) {
-		if (str == null || str.length() == 0)
-			return ""; //$NON-NLS-1$
-		StringBuffer sb = new StringBuffer();
-		int len = str.length();
-		for (int i = 0; i < len; i++) {
-			char ch = str.charAt(i);
-			switch (ch) {
-			case '<':
-				sb.append(XML_LT);
-				break;
-			case '>':
-				sb.append(XML_GT);
-				break;
-			case '&':
-				sb.append(XML_AMP);
-				break;
-			case '"':
-				sb.append(XML_QUOT);
-				break;
-			case '\'':
-				sb.append(XML_APOS);
-				break;
-			case '\r':
-				sb.append(XML_CR);
-				break;
-			case '\n':
-				sb.append(XML_LF);
-				break;
-			case '\\':
-				sb.append(XML_BACKSLASH);
-				break;
-			default:
-				sb.append(ch);
-				break;
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Escapes the given string to make it XML parser friendly.
-	 * 
-	 * @param str
-	 *            The source string.
-	 * @param ignoreCRLF
-	 *            If true, do not escape the CR and LF characters.
-	 * @return The escaped string.
-	 */
-	public static String escape(String str, boolean ignoreCRLF) {
-		if (str == null || str.length() == 0)
-			return ""; //$NON-NLS-1$
-		StringBuffer sb = new StringBuffer();
-		int len = str.length();
-		for (int i = 0; i < len; i++) {
-			char ch = str.charAt(i);
-			switch (ch) {
-			case '<':
-				sb.append(XML_LT);
-				break;
-			case '>':
-				sb.append(XML_GT);
-				break;
-			case '&':
-				// This is to avoid the double escaping (see Bugzilla 179921)
-				if (!str.startsWith(XML_LT+"p/", i) && !str.startsWith(XML_APOS, i) //$NON-NLS-1$ 
-						&& !str.startsWith(XML_AMP, i))
-					sb.append(XML_AMP);
-				else
-					sb.append(ch);
-				break;
-			case '"':
-				sb.append(XML_QUOT);
-				break;
-			case '\'':
-				sb.append(XML_APOS);
-				break;
-			case '\r':
-				if (ignoreCRLF)
-					sb.append(ch);
-				else
-					sb.append(XML_CR);
-				break;
-			case '\n':
-				if (ignoreCRLF)
-					sb.append(ch);
-				else
-					sb.append(XML_LF);
-				break;
-			default:
-				sb.append(ch);
-				break;
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Unescapes the given XML string.
-	 * 
-	 * @param str
-	 *            The source string.
-	 * @return The escaped string.
-	 */
-	public static String unescape(String str) {
-		if (str == null || str.length() == 0)
-			return ""; //$NON-NLS-1$
-		StringBuffer sb = new StringBuffer();
-		int len = str.length();
-		for (int i = 0; i < len; i++) {
-			char ch = str.charAt(i);
-			switch (ch) {
-			case '&':
-				if (str.startsWith(XML_LT, i)) {
-					sb.append('<');
-					i += 3;
-				} else if (str.startsWith(XML_GT, i)) {
-					sb.append('>');
-					i += 3;
-				} else if (str.startsWith(XML_AMP, i)) {
-					sb.append('&');
-					i += 4;
-				} else if (str.startsWith(XML_QUOT, i)) {
-					sb.append('"');
-					i += 5;
-				} else if (str.startsWith(XML_APOS, i)) {
-					sb.append("\'"); //$NON-NLS-1$
-					i += 5;
-				} else if (str.startsWith(XML_CR, i)) {
-					sb.append('\r');
-					i += 4;
-				} else if (str.startsWith(XML_LF, i)) {
-					sb.append('\n');
-					i += 4;
-				} else {
-					sb.append(ch);
-				}
-				break;
-			default:
-				sb.append(ch);
-				break;
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Writes the content of the given DOM document to the output stream.
-	 * 
-	 * @param xmlDoc
-	 *            The DOM document.
-	 * @param output
-	 *            The output stream.
-	 * @throws IOException
-	 *             if an I/O error occur while accessing the output stream.
-	 */
-	public static void writeDocument(Document xmlDoc, OutputStream output)
-			throws IOException {
-		DataOutputStream out = new DataOutputStream(output);
-		writeNode(xmlDoc, "", out); //$NON-NLS-1$
-		out.flush();
-	}
-
-	/**
-	 * Writes the content of the given DOM document to the PrintWriter.
-	 * 
-	 * @param xmlDoc
-	 *            The DOM document.
-	 * @param pw
-	 *            The PrintWriter object.
-	 * @throws IOException
-	 *             if an I/O error occur while accessing the output stream.
-	 */
-	public static void writeDocument(Document xmlDoc, PrintWriter pw)
-			throws IOException {
-		ByteArrayOutputStream os = new ByteArrayOutputStream();
-		DataOutputStream out = new DataOutputStream(os);
-		writeNode(xmlDoc, "", out); //$NON-NLS-1$
-		out.flush();
-		// FIXME! Need to specify encoding?
-		String s = os.toString();
-		pw.write(s);
-		pw.flush();
-	}
-
-	/**
-	 * Saves the content of the given DOM document to file.
-	 * 
-	 * @param xmlDoc
-	 *            The DOM document.
-	 * @param xmlFile
-	 *            The XML file.
-	 * @throws IOException
-	 *             if an I/O error occur while accessing the output stream.
-	 */
-	public static void saveDocument(Document xmlDoc, String xmlFile)
-			throws IOException {
-		DataOutputStream out = new DataOutputStream(new FileOutputStream(
-				xmlFile));
-		writeNode(xmlDoc, "", out); //$NON-NLS-1$
-		out.flush();
-		out.close();
-	}
-
-	/**
-	 * Saves the given XML string to the given file.
-	 * 
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param xmlFile
-	 *            The XML file.
-	 * @throws IOException
-	 *             if an I/O error occur while accessing the output stream.
-	 */
-	public static void saveDocument(String xmlStr, String xmlFile)
-			throws IOException {
-		DataOutputStream out = new DataOutputStream(new FileOutputStream(
-				xmlFile));
-		out.write(xmlStr.getBytes());
-		out.flush();
-		out.close();
-	}
-
-	/**
-	 * Writes the given DOM tree node to the given output stream.
-	 * 
-	 * @param node
-	 *            The DOM node.
-	 * @param indent
-	 *            The string indentation (containing space characters).
-	 * @param out
-	 *            The output stream.
-	 * @throws IOException
-	 *             if an I/O error occur while accessing the output stream.
-	 */
-	private static void writeNode(Node node, String indent, DataOutputStream out)
-			throws IOException {
-		String text;
-
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_NODE:
-			// Write the XML file signature.
-			out.write(StrUtil.getUTF8Bytes(XML_DECLARATION));
-			out.write(CRLF_BYTES);
-
-			// Iterate through each child nodes.
-			NodeList nodes = node.getChildNodes();
-			if (nodes != null) {
-				for (int i = 0; i < nodes.getLength(); i++) {
-					writeNode(nodes.item(i), "", out); //$NON-NLS-1$
-				}
-			}
-			break;
-
-		case Node.ELEMENT_NODE:
-			String name = node.getNodeName();
-			out.write(StrUtil.getUTF8Bytes(indent + "<" + name)); //$NON-NLS-1$
-			NamedNodeMap attrs = node.getAttributes();
-			for (int i = 0; i < attrs.getLength(); i++) {
-				Node attrNode = attrs.item(i);
-				out.write(StrUtil.getUTF8Bytes(" " + attrNode.getNodeName() //$NON-NLS-1$
-						+ "=\"" + escape(attrNode.getNodeValue()) + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			out.write(StrUtil.getUTF8Bytes(">")); //$NON-NLS-1$
-			out.write(CRLF_BYTES);
-
-			// Iterate through each child nodes.
-			NodeList childNodes = node.getChildNodes();
-			if (childNodes != null) {
-				for (int i = 0; i < childNodes.getLength(); i++) {
-					writeNode(childNodes.item(i), indent, out);
-				}
-			}
-			out.write(StrUtil.getUTF8Bytes(indent + "</" + name + ">")); //$NON-NLS-1$ //$NON-NLS-2$
-			out.write(CRLF_BYTES);
-
-			break;
-
-		case Node.TEXT_NODE:
-			text = StrUtil.removeWhiteSpaceChars(node.getNodeValue());
-			if (text.length() > 0) {
-				out.write(StrUtil.getUTF8Bytes(escape(text)));
-			}
-			break;
-
-		case Node.CDATA_SECTION_NODE:
-			text = StrUtil.removeWhiteSpaceChars(node.getNodeValue());
-			if (text.length() > 0) {
-				out.write(StrUtil.getUTF8Bytes("<![CDATA[")); //$NON-NLS-1$
-				out.write(StrUtil.getUTF8Bytes(text));
-				out.write(StrUtil.getUTF8Bytes("]]>")); //$NON-NLS-1$
-				out.write(CRLF_BYTES);
-			}
-			break;
-
-		case Node.PROCESSING_INSTRUCTION_NODE:
-			out.write(StrUtil.getUTF8Bytes("<?" + node.getNodeName() //$NON-NLS-1$
-					+ " " + node.getNodeValue() + "?>")); //$NON-NLS-1$ //$NON-NLS-2$
-			out.write(CRLF_BYTES);
-			break;
-
-		case Node.ENTITY_REFERENCE_NODE:
-			out.write(StrUtil.getUTF8Bytes("&" + node.getNodeName() + ";")); //$NON-NLS-1$ //$NON-NLS-2$
-			break;
-		}
-	}
-
-	/**
-	 * Returns the file location where the given SAX exception occurred.
-	 * 
-	 * @param e
-	 *            The SAX parse exception.
-	 * @return A string containing the file location where the exception
-	 *         occurred.
-	 */
-	public static String getLocationOfException(SAXParseException e) {
-		StringBuffer sb = new StringBuffer();
-		sb.append("row "); //$NON-NLS-1$
-		sb.append(e.getLineNumber());
-		sb.append(", col "); //$NON-NLS-1$
-		sb.append(e.getColumnNumber());
-
-		String systemId = e.getSystemId();
-		if (systemId != null) {
-			int index = systemId.lastIndexOf('/');
-			if (index != -1) {
-				systemId = systemId.substring(index + 1);
-			}
-			sb.append(" of XML document "); //$NON-NLS-1$
-			sb.append(systemId);
-		}
-
-		return sb.toString();
-	}
-
-	public static Document loadXml(File file) throws Exception {
-		DocumentBuilderFactory builderFactory = DocumentBuilderFactory
-				.newInstance();
-		DocumentBuilder builder = builderFactory.newDocumentBuilder();
-
-		return builder.parse(file);
-	}
-
-	public static Document createDocument() throws Exception {
-		DocumentBuilderFactory builderFactory = DocumentBuilderFactory
-				.newInstance();
-		DocumentBuilder builder = builderFactory.newDocumentBuilder();
-		return builder.newDocument();
-	}
-
-	/**
-	 * text of a leaf node, without child element
-	 * 
-	 * @param tag
-	 * @return String
-	 */
-	public static String getNodeText(Element tag) {
-		String text = tag.toString();
-		int i = text.indexOf(">"); //$NON-NLS-1$
-		int j = text.lastIndexOf("</"); //$NON-NLS-1$
-		if (i < 0 || j < 0 || j < i) {
-			return ""; //$NON-NLS-1$
-		}
-
-		return text.substring(i + 1, j);
-	}
-
-	public static String getChildText(Element tag, String childTagName) {
-		Element child = getFirstChild(tag, childTagName);
-		if (child != null) {
-			return getNodeText(child);
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	public static Element getFirstChild(Element tag, String childTagName) {
-		NodeList nodes = tag.getElementsByTagName(childTagName);
-		if (nodes == null || nodes.getLength() == 0) {
-			return null;
-		}
-
-		return (Element) nodes.item(0);
-	}
-
-	/**
-	 * iterator of all the children of the element
-	 * 
-	 * @param tag
-	 * @return Iterator
-	 */
-	public static Iterator childIterator(Element tag) {
-		NodeList nodes = tag.getChildNodes();
-
-		// NodeList contains no Element nodes such as text nodes, ignore those
-		List<Node> elements = new ArrayList<Node>();
-		if (nodes != null) {
-			int size = nodes.getLength();
-			for (int i = 0; i < size; i++) {
-				Node node = nodes.item(i);
-				if (node instanceof Element) {
-					elements.add(node);
-				}
-			}
-		}
-
-		return elements.iterator();
-	}
-
-	private static class NodeIterator implements Iterator {
-		int currentIndex = -1;
-
-		int size = 0;
-
-		NodeList nodes = null;
-
-		public NodeIterator(NodeList nodes) {
-			this.nodes = nodes;
-			if (nodes != null)
-				size = nodes.getLength();
-		}
-
-		public void remove() {
-			// Do nothing, this is a readonly iterator.
-		}
-
-		public boolean hasNext() {
-			return currentIndex + 1 < size;
-		}
-
-		public Object next() {
-			if (hasNext()) {
-				return nodes.item(++currentIndex);
-			}
-
-			return null;
-		}
-	}
-
-	/**
-	 * iterator of all the children of the element
-	 * 
-	 * @param tag
-	 * @return Iterator
-	 */
-	public static Iterator childIterator(Element tag, String childTagName) {
-		NodeList nodes = tag.getElementsByTagName(childTagName);
-		return new NodeIterator(nodes);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ZipUtil.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ZipUtil.java
deleted file mode 100644
index e8b730d..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/ZipUtil.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * Utility class for reading and writing zip files.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ZipUtil {
-
-	/**
-	 * Creates a zip file.
-	 * 
-	 * @param zipFilePath
-	 *            an absolute path to the target zip file
-	 * @param contentPath
-	 *            an absolute path to a directory containing the files and sub
-	 *            directories to be zipped
-	 * @param monitor
-	 *            a progress monitor
-	 * @throws IOException
-	 *             if an error occurs while creating the zip file
-	 */
-	public static void createZipFile(String zipFilePath, String contentPath,
-			IProgressMonitor monitor) throws IOException {
-		ZipOutputStream out = null;
-		try {
-			out = new ZipOutputStream(new FileOutputStream(
-					zipFilePath));
-			File contentDir = new File(contentPath);
-			populateZipFile(out, contentDir.getAbsolutePath(), contentDir,
-					monitor);
-		} catch (IOException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new IOException(e.getMessage());
-		}
-		finally {
-			if (out != null) {
-				try {
-					out.close();
-				}
-				catch (Exception e) {
-				}
-			}
-		}
-	}
-
-	/**
-	 * Populates a zip file with directories and files.
-	 * 
-	 * @param out
-	 *            a zip file output stream
-	 * @param rootPath
-	 *            a root path that is used to compute the relative paths of the
-	 *            zip content
-	 * @param file
-	 *            a file or directory
-	 * @param monitor
-	 *            a progress monitor
-	 */
-	public static void populateZipFile(ZipOutputStream out, String rootPath,
-			File file, IProgressMonitor monitor) throws IOException {
-		File[] files = file.listFiles();
-		if (files != null) {
-			for (int i = 0; i < files.length; i++) {
-				if (files[i].isDirectory()) {
-					populateZipFile(out, rootPath, files[i], monitor);
-				} else {
-					String filePath = files[i].getAbsolutePath();
-					FileInputStream in = new FileInputStream(filePath);
-					String relativePath = filePath
-							.substring(rootPath.length() + 1);
-					out.putNextEntry(new ZipEntry(relativePath));
-					byte[] buffer = new byte[1024];
-					int len;
-					while ((len = in.read(buffer)) > 0) {
-						out.write(buffer, 0, len);
-					}
-					out.closeEntry();
-					in.close();
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/package.html b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/package.html
deleted file mode 100644
index 7216baa..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides common clipboard, file, I18N, image, networking, string manipulation and threading services.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/AbstractSAXParser.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/AbstractSAXParser.java
deleted file mode 100644
index 4c91a1d..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/AbstractSAXParser.java
+++ /dev/null
@@ -1,216 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.xml;
-
-import java.io.File;
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * An abstract SAX parser that can be used to parse a single XML file or a
- * directory of XML files.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class AbstractSAXParser extends DefaultHandler {
-
-	/**
-	 * The logger used for logging warnings, errors and exceptions.
-	 */
-	protected Logger logger;
-
-	/**
-	 * The name of the current XML file being parsed.
-	 */
-	protected String xmlFile;
-
-	/**
-	 * The String buffer for accumulating text.
-	 */
-	protected StringBuffer strBuf;
-
-	/**
-	 * The XML validating flag.
-	 */
-	private boolean validating;
-
-	/**
-	 * Creates a new <code>AbstractSaxParser</code> given the validating flag.
-	 * 
-	 * @param logger
-	 *            The logger for logging warnings and errors.
-	 * @param validating
-	 *            If true, validate the XML document.
-	 */
-	public AbstractSAXParser(Logger logger, boolean validating) {
-		this.logger = logger;
-		this.validating = validating;
-	}
-
-	/**
-	 * Parses the given XML directory or file.
-	 * 
-	 * @param xmlPath
-	 *            The XML directory or file.
-	 */
-	public void parse(String xmlPath) {
-		String pathName = StrUtil.replace(xmlPath, "%20", " "); //$NON-NLS-1$ //$NON-NLS-2$
-		File path = new File(pathName);
-		File[] files = path.isFile() ? new File[] { path } : path.listFiles();
-		if (files != null) {
-			for (int i = 0; i < files.length; i++) {
-				if (!files[i].isDirectory()) {
-					try {
-						parseFile(files[i].getAbsoluteFile());
-					} catch (Exception e) {
-						if (logger != null) {
-							logger
-									.logError(
-											"Failed to parse \"" + files[i].getAbsolutePath() + '"', e); //$NON-NLS-1$						
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Parses the given XML file.
-	 * 
-	 * @param xmlFile
-	 *            The XML file.
-	 */
-	protected void parseFile(File xmlFile) throws ParserConfigurationException,
-			IOException, SAXException {
-		// Create the SAX parser factory.
-		SAXParserFactory spf = SAXParserFactory.newInstance();
-
-		// Set the XML validating flag.
-		spf.setValidating(validating);
-
-		// Create the SAX parser.
-		SAXParser saxParser = spf.newSAXParser();
-
-		// Get the SAX XML reader.
-		XMLReader xmlReader = saxParser.getXMLReader();
-
-		// Set the SAX parser handlers to this class.
-		xmlReader.setContentHandler(this);
-		xmlReader.setErrorHandler(this);
-
-		// Instruct the SAX parser to parse the given XML file.
-		this.xmlFile = xmlFile.getAbsolutePath();
-		xmlReader.parse(NetUtil.getUri(xmlFile));
-	}
-
-	/**
-	 * Called when the XML parser starts to parse the document.
-	 */
-	public void startDocument() {
-		strBuf = new StringBuffer();
-	}
-
-	/**
-	 * Called when the the XML parser encounters the chararacter data within a
-	 * text element.
-	 */
-	public void characters(char[] buffer, int start, int length) {
-		strBuf.append(buffer, start, length);
-	}
-
-	/**
-	 * Called when the parser starts to parse each new element.
-	 */
-	public abstract void startElement(String namespaceURL, String localName,
-			String qname, Attributes attributes);
-
-	/**
-	 * Called when the XML parser reaches the end of the an element.
-	 */
-	public abstract void endElement(String namespaceURL, String localName,
-			String qname);
-
-	/**
-	 * Called when the XML parser reaches the end of the document.
-	 */
-	public void endDocument() {
-	}
-
-	/**
-	 * Logs the SAX parsing warning.
-	 * 
-	 * @param e
-	 *            The SAX parse exception.
-	 */
-	public void warning(SAXParseException e) {
-		if (logger != null) {
-			logger
-					.logWarning("SAX parsing warning encountered at " //$NON-NLS-1$
-							+ XMLUtil.getLocationOfException(e)
-							+ ": " + e.getMessage()); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Logs the SAX parsing error.
-	 * 
-	 * @param e
-	 *            The SAX parse exception.
-	 */
-	public void error(SAXParseException e) {
-		if (logger != null) {
-			logger
-					.logError("SAX parsing error encountered at " //$NON-NLS-1$
-							+ XMLUtil.getLocationOfException(e)
-							+ ": " + e.getMessage()); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Logs the SAX non-recoverable error and exits.
-	 * 
-	 * @param e
-	 *            The SAX parse exception.
-	 */
-	public void fatalError(SAXParseException e) throws SAXException {
-		if (logger != null) {
-			logger
-					.logError("SAX parsing fatal error encountered at " //$NON-NLS-1$
-							+ XMLUtil.getLocationOfException(e)
-							+ ": " + e.getMessage()); //$NON-NLS-1$
-			logger.logError(e);
-		}
-	}
-
-	/**
-	 * Returns the current XML file that is being parsed.
-	 * 
-	 * @return The name of the XML file.
-	 */
-	public String getXMLFile() {
-		return xmlFile;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/XSLTProcessor.java b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/XSLTProcessor.java
deleted file mode 100644
index 589f6a8..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/XSLTProcessor.java
+++ /dev/null
@@ -1,449 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.common.xml;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.InputStream;
-import java.io.Writer;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.eclipse.epf.common.CommonPlugin;
-
-/**
- * A wrapper over the XSLT processor bundled with the JRE.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class XSLTProcessor {
-
-	// If true, cache the compiled the XSL transformer with the compiled XSL
-	// templates.
-	private static boolean cacheXSL;
-
-	// Caches the XSL transformers.
-	private static Map<String, CachedTransformer> transformerCache;
-
-	static {
-		String cacheXSLProperty = CommonPlugin.getDefault().getString(
-				"cacheXSL"); //$NON-NLS-1$
-		if (cacheXSLProperty != null && !cacheXSLProperty.startsWith("[")) { //$NON-NLS-1$
-			cacheXSL = Boolean.getBoolean(cacheXSLProperty);
-		} else {
-			cacheXSL = true;
-		}
-		if (cacheXSL) {
-			transformerCache = new HashMap<String, CachedTransformer>();
-		}
-
-		// Increase the entity expansion line limit to handle a larger number of
-		// XML entities.
-		System.setProperty("entityExpansionLimit", "1000000"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Default private constructor to prevent this class from being
-	 * instantiated.
-	 */
-	private XSLTProcessor() {
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL source, XML source, target
-	 * output and encoding.
-	 * 
-	 * @param xslSource
-	 *            The XSL source.
-	 * @param xmlSource
-	 *            The XML source.
-	 * @param output
-	 *            The output target.
-	 * @param params
-	 *            The parameters for the XSL transformation.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(Source xslSource, Source xmlSource,
-			Writer output, Properties params, String encoding) throws Exception {
-		if (xslSource != null && xmlSource != null) {
-			Transformer transformer = null;
-			String xslFile = xslSource.getSystemId();
-			if (cacheXSL && xslFile != null) {
-				CachedTransformer cachedTransformer = null;
-				synchronized (transformerCache) {
-					cachedTransformer = transformerCache.get(xslFile);
-					if (cachedTransformer == null) {
-						TransformerFactory factory = TransformerFactory
-								.newInstance();
-						transformer = factory.newTransformer(xslSource);
-						transformerCache.put(xslFile, new CachedTransformer(
-								transformer, params));
-					} else {
-						cachedTransformer.setParams(params);
-						transformer = cachedTransformer.getTransformer();
-					}
-				}
-			} else {
-				TransformerFactory factory = TransformerFactory.newInstance();
-				transformer = factory.newTransformer(xslSource);
-
-				if (params != null && params.size() > 0) {
-					for (Iterator<Object> i = params.keySet().iterator(); i
-							.hasNext();) {
-						String paramName = (String) i.next();
-						String paramValue = params.getProperty(paramName);
-						transformer.setParameter(paramName, paramValue);
-					}
-				}
-			}
-
-			if (encoding != null && encoding.length() > 0) {
-				transformer.setOutputProperty("encoding", encoding); //$NON-NLS-1$
-			} else {
-				transformer.setOutputProperty("encoding", "utf-8"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			transformer.transform(xmlSource, new StreamResult(output));
-		}
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL source, XML source, target
-	 * output and encoding.
-	 * 
-	 * @param xslSource
-	 *            The XSL source.
-	 * @param xmlSource
-	 *            The XML source.
-	 * @param output
-	 *            The output target.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(Source xslSource, Source xmlSource,
-			Writer output, String encoding) throws Exception {
-		transform(xslSource, xmlSource, output, null, encoding);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML source,
-	 * target output and encoding.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML source.
-	 * @param output
-	 *            The output target.
-	 * @param params
-	 *            The parameters for the XSL transformation.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(String xslUri, Source xmlSource,
-			Writer output, Properties params, String encoding) throws Exception {
-		InputStream xslInput = getXslInputStream(xslUri);
-		if (xslInput != null) {
-			StreamSource xslSource = new StreamSource(xslInput);
-			xslSource.setSystemId(new File(xslUri));
-			transform(xslSource, xmlSource, output, params, encoding);
-			try {
-				xslInput.close();
-			} catch (Exception e) {
-			}
-		}
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML source,
-	 * target output and encoding.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML source.
-	 * @param output
-	 *            The output target.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(String xslUri, Source xmlSource,
-			Writer output, String encoding) throws Exception {
-		transform(xslUri, xmlSource, output, null, encoding);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string,
-	 * target output and encoding.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param output
-	 *            The output target.
-	 * @param params
-	 *            The parameters for the XSL transformation.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(String xslUri, String xmlStr, Writer output,
-			Properties params, String encoding) throws Exception {
-		InputStream xslInput = getXslInputStream(xslUri);
-		if (xslInput != null) {
-			StreamSource xslSource = new StreamSource(xslInput);
-			xslSource.setSystemId(new File(xslUri));
-
-			byte[] xml = xmlStr.getBytes("utf-8"); //$NON-NLS-1$
-			ByteArrayInputStream xmlInput = new ByteArrayInputStream(xml);
-			StreamSource xmlSource = new StreamSource(xmlInput);
-
-			transform(xslSource, xmlSource, output, params, encoding);
-
-			try {
-				xslInput.close();
-				xmlInput.close();
-			} catch (Exception e) {
-			}
-		}
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string,
-	 * target output and encoding.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param output
-	 *            The output target.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(String xslUri, String xmlStr, Writer output,
-			String encoding) throws Exception {
-		transform(xslUri, xmlStr, output, null, encoding);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string,
-	 * target output and encoding.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param file
-	 *            The output file.
-	 * @param params
-	 *            The parameters for the XSL transformation.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(String xslUri, String xmlStr, File file,
-			Properties params, String encoding) throws Exception {
-		FileWriter output = new FileWriter(file);
-		if (output != null) {
-			transform(xslUri, xmlStr, output, params, encoding);
-			try {
-				output.close();
-			} catch (Exception e) {
-			}
-		}
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string,
-	 * target output and encoding.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param file
-	 *            The output file.
-	 * @param encoding
-	 *            The target encoding.
-	 */
-	public static void transform(String xslUri, String xmlStr, File file,
-			String encoding) throws Exception {
-		transform(xslUri, xmlStr, file, null, encoding);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML source
-	 * and target output.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML source.
-	 * @param params
-	 *            The parameters for the XSL transformation.
-	 * @param output
-	 *            The output target.
-	 */
-	public static void transform(String xslUri, Source xmlSource,
-			Properties params, Writer output) throws Exception {
-		transform(xslUri, xmlSource, output, params, null);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML source
-	 * and target output.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML source.
-	 * @param output
-	 *            The output target.
-	 */
-	public static void transform(String xslUri, Source xmlSource, Writer output)
-			throws Exception {
-		transform(xslUri, xmlSource, output, null, null);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string
-	 * and target output.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param params
-	 *            The parameters for the XSL transformation.
-	 * @param output
-	 *            The output target.
-	 */
-	public static void transform(String xslUri, String xmlStr,
-			Properties params, Writer output) throws Exception {
-		transform(xslUri, xmlStr, output, params, null);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string
-	 * and target output.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param output
-	 *            The output target.
-	 */
-	public static void transform(String xslUri, String xmlStr, Writer output)
-			throws Exception {
-		transform(xslUri, xmlStr, output, null, null);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string
-	 * and target output file.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param params
-	 *            The parameters for the XSL transformation.
-	 * @param output
-	 *            The output target.
-	 */
-	public static void transform(String xslUri, String xmlStr,
-			Properties params, File file) throws Exception {
-		transform(xslUri, xmlStr, file, params, null);
-	}
-
-	/**
-	 * Executes the XSL transformation given the XSL stylesheet URI, XML string
-	 * and target output file.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 * @param xmlStr
-	 *            The XML string.
-	 * @param output
-	 *            The output target.
-	 */
-	public static void transform(String xslUri, String xmlStr, File file)
-			throws Exception {
-		transform(xslUri, xmlStr, file, null, null);
-	}
-
-	/**
-	 * Returns the XSL input stream given the XSL stylesheet URI.
-	 * 
-	 * @param xslURI
-	 *            The XSL stylesheet URI.
-	 */
-	private static InputStream getXslInputStream(String xslUri) {
-		InputStream xslInput = null;
-		try {
-			xslInput = new FileInputStream(xslUri);
-		} catch (Exception e) {
-			if (xslInput == null) {
-				xslInput = XSLTProcessor.class.getClassLoader()
-						.getResourceAsStream(xslUri);
-			}
-		}
-		return xslInput;
-	}
-
-}
-
-/**
- * A cached XSL Transformer object.
- */
-class CachedTransformer {
-
-	private Transformer transformer;
-	private Properties params;
-
-	public CachedTransformer(Transformer transformer, Properties params) {
-		this.transformer = transformer;
-		setParams(params);
-	}
-
-	public Transformer getTransformer() {
-		return transformer;
-	}
-
-	public Properties getParams() {
-		return params;
-	}
-
-	public void setParams(Properties params) {
-		if (params != this.params) {
-			transformer.clearParameters();
-			for (Iterator<Object> i = params.keySet().iterator(); i.hasNext();) {
-				String paramName = (String) i.next();
-				String paramValue = params.getProperty(paramName);
-				transformer.setParameter(paramName, paramValue);
-			}
-			this.params = params;			
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/package.html b/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/package.html
deleted file mode 100644
index 82ca741..0000000
--- a/1.5/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/xml/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides XML and XSLT processing services.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/.classpath b/1.5/plugins/org.eclipse.epf.dataexchange/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/.project b/1.5/plugins/org.eclipse.epf.dataexchange/.project
deleted file mode 100644
index 21b9e88..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.dataexchange</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.dataexchange/META-INF/MANIFEST.MF
deleted file mode 100644
index 4f5ff86..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.dataexchange
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.library
-Export-Package: org.eclipse.epf.dataexchange.importing,
- org.eclipse.epf.dataexchange.internal.importing,
- org.eclipse.epf.dataexchange.util
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/build.properties b/1.5/plugins/org.eclipse.epf.dataexchange/build.properties
deleted file mode 100644
index 37d9849..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/plugin.properties b/1.5/plugins/org.eclipse.epf.dataexchange/plugin.properties
deleted file mode 100644
index d79b91b..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/plugin.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-pluginName=EPF Data Exchange Plug-in
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/LibraryService.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/LibraryService.java
deleted file mode 100644
index d143aeb..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/LibraryService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.importing;
-
-import java.util.Map;
-
-import org.eclipse.epf.dataexchange.internal.importing.LibraryServiceImpl;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * Library service for importing external library/plugins into the current library.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public interface LibraryService {
-
-	public static LibraryService INSTANCE = new LibraryServiceImpl();
-	/**
-	 * create a new MethodPlugin and add to the library, perform initialization as needed
-	 * @param name
-	 * @return MethodPlugin 
-	 */
-	public MethodPlugin createPlugin(String name, String guid) throws Exception;
-
-	/**
-	 * create a new MethodPlugin and add to the library, perform initialization as needed
-	 * @param name
-	 * @param guid
-	 * @param options
-	 * @return MethodPlugin
-	 */
-	public MethodPlugin createPlugin(String name, String guid, Map options) throws Exception;
-
-	
-	/**
-	 * create a MethodConfiguration for this library
-	 * @param name
-	 * @return MethodConfiguration
-	 */
-	public MethodConfiguration createConfiguration(String name, String guid);
-
-	/**
-	 * create a plugin service for the specified plugin
-	 * @param plugin MethodPlugin
-	 * @return PluginService
-	 */
-	public PluginService createPluginService(MethodPlugin plugin);
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/PluginService.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/PluginService.java
deleted file mode 100644
index e455635..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/PluginService.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.importing;
-
-import java.util.List;
-
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * Plugin service for importing external plugin data into the current library
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public interface PluginService {
-
-	public ContentPackage getContentPackageRoot();
-
-	/**
-	 * create a Discipline object add add to the system default Disciplines package
-	 * @param name
-	 * @return Discipline
-	 */
-	public Discipline createDiscipline();
-
-	/**
-	 * create a DisciplineGrouping object add add to the system default Disciplines package
-	 * @param name
-	 * @return DisciplineGrouping
-	 */
-	public DisciplineGrouping createDisciplineGrouping();
-
-	/**
-	 * create a Tool object add add to the system default Tools package
-	 * @param name
-	 * @return Tool
-	 */
-	public Tool createTool();
-
-	/**
-	 * create a Domain object add add to the system default Domains package
-	 * @param name
-	 * @return Domain
-	 */
-	public Domain createDomain();
-
-	/**
-	 * create a WorkProductType object add add to the system default WorkProductTypes package
-	 * @param name
-	 * @return WorkProductType
-	 */
-	public WorkProductType createWorkProductType();
-
-	/**
-	 * create a RoleSet object add add to the system default RoleSets package
-	 * @param name
-	 * @return RoleSet
-	 */
-	public RoleSet createRoleSet();
-
-	/**
-	 * create a RoleSetGrouping object add add to the system default RoleSets package
-	 * @param name
-	 * @return RoleSetGrouping
-	 */
-	public RoleSetGrouping createRoleSetGrouping();
-
-	/**
-	 * create a CustomCategory object add add to the system default CustomCategories package
-	 * @param name
-	 * @return CustomCategory
-	 */
-	public CustomCategory createCustomCategory(CustomCategory parent);
-
-	/**
-	 * create a CapabilityPattern object add add to the system default CapabilityPatterns package
-	 * perform other initializations as needed, such as create the containing ProcessComponent.
-	 * @param name
-	 * @return ProcessService a ProcessService that contains the created CapabilityPattern
-	 */
-	public CapabilityPattern createCapabilityPattern(MethodConfiguration defaultConfig);
-
-	/**
-	 * create a DeliveryProcess object add add to the system default DeliveryProcesses package.
-	 * perform other initializations as needed, such as create the containing ProcessComponent.
-	 * @param name
-	 * @return ProcessService a ProcessService that contains the created DeliveryProcess
-	 */
-	public DeliveryProcess createDeliveryProcess(MethodConfiguration defaultConfig);
-
-	/**
-	 * create a content package as the child of the internal root content package,
-	 * @return ContentPackageService a ContentPackageService that contains the created ContentPackage
-	 */
-	public ContentPackage createContentPackage(ContentPackage container);
-
-
-	/**
-	 * create a new child package
-	 * @return ContentPackageService a ContentPackageService for the created package
-	 */
-	//public ContentPackage createChildPackage(ContentPackage container);
-
-	public Artifact createArtifact(ContentPackage container);
-	public Checklist createChecklist(ContentPackage container);
-	public Concept createConcept(ContentPackage container);
-	public Deliverable createDeliverable(ContentPackage container);
-	public Example createExample(ContentPackage container);
-	public Guidance createGuidance(ContentPackage container);
-	public Outcome createOutcome(ContentPackage container);
-	public Practice createPractice(ContentPackage container);
-	public Report createReport(ContentPackage container);
-	public ReusableAsset createReusableAsset(ContentPackage container);
-	public Roadmap createRoadmap(ContentPackage container);
-	public Role createRole(ContentPackage container);
-	public SupportingMaterial createSupportingMaterial(ContentPackage container);
-	public Task createTask(ContentPackage container);
-	public Template createTemplate(ContentPackage container);
-	public TermDefinition createTermDefinition(ContentPackage container);
-	public ToolMentor createToolMentor(ContentPackage container);
-	public Whitepaper createWhitepaper(ContentPackage container);
-
-
-	/**
-	 * create a new Activity as a breakdown element of the servicing element.
-	 * @return Activity
-	 */
-	public Activity createActivity(Activity superActivity);
-
-	/**
-	 * create a new Phase as a breakdown element of the servicing element.
-	 * @return Phase
-	 */
-	public Phase createPhase(Activity superActivity);
-
-	/**
-	 * create a new Iteration as a breakdown element of the servicing element.
-	 * @return Iteration
-	 */
-	public Iteration createIteration(Activity superActivity);
-
-	/**
-	 * create a new Milestone as a breakdown element of the servicing element.
-	 * @return Milestone
-	 */
-	public Milestone createMilestone(Activity superActivity);
-
-
-	/**
-	 * add the task and create the breakdown elements associated with the task
-	 * call this method only when the cross references (Roles, workproducts) of the Task is already established.
-	 * @param element
-	 */
-	public void addTaskToActivity(Activity act, Task element);
-
-	public void addTasksToActivity(Activity act, List tasks);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/package.html b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/package.html
deleted file mode 100644
index 344bb89..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/importing/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the data exchange service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/LibraryServiceImpl.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/LibraryServiceImpl.java
deleted file mode 100644
index c45583d..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/LibraryServiceImpl.java
+++ /dev/null
@@ -1,144 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.internal.importing;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.dataexchange.importing.LibraryService;
-import org.eclipse.epf.dataexchange.importing.PluginService;
-import org.eclipse.epf.library.util.ModelStorage;
-import org.eclipse.epf.persistence.MethodLibraryPersister;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-
-/**
- * Library service for importing external library/plugins into the current
- * library.
- * 
- * @author Jinhua Xi
- * @since 1.0
- * 
- * TODO: Merge with org.eclipse.epf.library.LibraryService
- */
-public class LibraryServiceImpl implements LibraryService {
-
-	public LibraryServiceImpl() {
-	}
-
-	public MethodPlugin createPlugin(String name, String guid) throws Exception {
-		return createPlugin(name, guid, null);
-	}
-		
-	public MethodPlugin createPlugin(String name, String guid, Map options) throws Exception {	
-		MethodPlugin plugin = UmaFactory.eINSTANCE.createMethodPlugin();
-		plugin.setName(name);
-		plugin.setGuid(guid);
-
-		// initialize the plugin
-		plugin = ModelStorage.initialize(plugin);
-
-		// MUST save the plugin before process anything else
-		// this method call will cause resource refresh which is not desired in
-		// the importing process
-		MethodLibrary library = org.eclipse.epf.library.LibraryService
-				.getInstance().getCurrentMethodLibrary();
-				
-		library.getMethodPlugins().add(plugin);
-		
-		if (options != null) {
-			Map renameElementMap = (Map) options.get("renameElementMap");//$NON-NLS-1$
-			if (renameElementMap != null) {
-				ensureUniqueName(library, plugin, renameElementMap);	
-			}
-		}
-		
-		// 150063 - XML import: CP/DPs are unresovled after XML plugin import 
-		// need to save tht library and plugin resources specifically, can't use saveLibrary
-//		LibraryUtil.saveLibrary(library, false, false);
-		MethodLibraryPersister.INSTANCE.save(library.eResource());
-		MethodLibraryPersister.INSTANCE.save(plugin.eResource());
-
-		// still mark the resource as dirty
-		library.eResource().setModified(true);
-		plugin.eResource().setModified(true);
-		return plugin;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.LibraryService#createConfiguration(String, String)
-	 */
-	public MethodConfiguration createConfiguration(String name, String guid) {
-		MethodConfiguration config = UmaFactory.eINSTANCE
-				.createMethodConfiguration();
-		config.setName(name);
-		config.setGuid(guid);
-
-		MethodLibrary library = org.eclipse.epf.library.LibraryService
-				.getInstance().getCurrentMethodLibrary();
-		boolean oldNotify = library.eDeliver();
-		try {
-			library.eSetDeliver(false);
-			library.getPredefinedConfigurations().add(config);
-		} finally {
-			library.eSetDeliver(oldNotify);
-		}
-
-		return config;
-	}
-
-	/**
-	 * create a plugin service for the specified plugin
-	 * 
-	 * @param plugin
-	 *            MethodPlugin
-	 * @return PluginService
-	 */
-	public PluginService createPluginService(MethodPlugin plugin) {
-		return new PluginServiceImpl(plugin);
-	}
-	
-	//This is identical to LibraryImportManager.ensureUniqueName
-	//Should move to this code to a commom place so that both packages can access it.
-	private static void ensureUniqueName(EObject owner, MethodElement newObj, Map renameElementMap) {
-		if (owner == null) {
-			return;
-		}
-		Class cls = newObj.getClass();
-		Map nameMap = new HashMap();
-		for (int i=0; i < owner.eContents().size(); i++) {
-			Object oldObj = owner.eContents().get(i);
-			if (oldObj.getClass() == cls && oldObj != newObj) {
-				MethodElement oldElem = (MethodElement) oldObj;
-				nameMap.put(oldElem.getName(), oldElem);
-			}
-		}
-		String name = newObj.getName();
-		String renamed = name;
-		while (nameMap.containsKey(renamed)) {
-			renamed += "_renamed"; //$NON-NLS-1$
-		}
-		if (renamed != name) {
-			newObj.setName(renamed);
-			
-			Object[] entryVal = new Object[4];
-			entryVal[0] = newObj;
-			entryVal[1] = name;
-			entryVal[2] = nameMap.get(name);
-			entryVal[3] = renamed;
-			renameElementMap.put(newObj.getGuid(), entryVal);			
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/PluginServiceImpl.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/PluginServiceImpl.java
deleted file mode 100644
index 92594b8..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/PluginServiceImpl.java
+++ /dev/null
@@ -1,545 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.internal.importing;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.dataexchange.importing.PluginService;
-import org.eclipse.epf.library.edit.process.command.WBSDropCommand;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * Plugin service for importing external plugin data into the current library
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class PluginServiceImpl implements PluginService {
-
-	MethodPlugin plugin;
-
-	public PluginServiceImpl(MethodPlugin element)
-	{
-		plugin = element;
-	}
-
-	/**
-	 * get the method plughin
-	 * @return {@link MethodPlugin}
-	 */
-	public MethodPlugin getPlugin()
-	{
-		return (MethodPlugin)plugin;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#getContentPackageRoot()
-	 */
-	public ContentPackage getContentPackageRoot()
-	{
-		return UmaUtil.findContentPackage(plugin, ModelStructure.DEFAULT.coreContentPath);
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createDiscipline()
-	 */
-	public Discipline createDiscipline() {
-		Discipline d = UmaFactory.eINSTANCE.createDiscipline();
-		ContentPackage pkg = (ContentPackage)UmaUtil.findMethodPackage(getPlugin(), ModelStructure.DEFAULT.disciplineDefinitionPath);
-		pkg.getContentElements().add(d);
-
-		return d;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createDisciplineGrouping()
-	 */
-	public DisciplineGrouping createDisciplineGrouping() {
-		DisciplineGrouping d = UmaFactory.eINSTANCE.createDisciplineGrouping();
-		ContentPackage pkg = (ContentPackage)UmaUtil.findMethodPackage(getPlugin(), ModelStructure.DEFAULT.disciplineDefinitionPath);
-		pkg.getContentElements().add(d);
-
-		return d;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createTool()
-	 */
-	public Tool createTool() {
-		Tool tool = UmaFactory.eINSTANCE.createTool();
-		ContentPackage pkg = UmaUtil.findContentPackage(getPlugin(), ModelStructure.DEFAULT.toolPath);
-		((ContentPackage)pkg).getContentElements().add(tool);
-		return tool;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createDomain()
-	 */
-	public Domain createDomain() {
-		Domain d = UmaFactory.eINSTANCE.createDomain();
-		ContentPackage pkg = UmaUtil.findContentPackage(getPlugin(), ModelStructure.DEFAULT.domainPath);
-		((ContentPackage)pkg).getContentElements().add(d);
-		return d;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createWorkProductType()
-	 */
-	public WorkProductType createWorkProductType() {
-		WorkProductType w = UmaFactory.eINSTANCE.createWorkProductType();
-		ContentPackage pkg = UmaUtil.findContentPackage(getPlugin(), ModelStructure.DEFAULT.workProductTypePath);
-		((ContentPackage)pkg).getContentElements().add(w);
-		return w;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createRoleSet()
-	 */
-	public RoleSet createRoleSet() {
-		RoleSet r = UmaFactory.eINSTANCE.createRoleSet();
-		ContentPackage pkg = UmaUtil.findContentPackage(getPlugin(), ModelStructure.DEFAULT.roleSetPath);
-		((ContentPackage)pkg).getContentElements().add(r);
-		return r;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createRoleSetGrouping()
-	 */
-	public RoleSetGrouping createRoleSetGrouping() {
-		RoleSetGrouping r = UmaFactory.eINSTANCE.createRoleSetGrouping();
-		ContentPackage pkg = UmaUtil.findContentPackage(getPlugin(), ModelStructure.DEFAULT.roleSetPath);
-		((ContentPackage)pkg).getContentElements().add(r);
-		return r;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createCustomCategory(CustomCategory)
-	 */
-	public CustomCategory createCustomCategory(CustomCategory parent) {
-		ContentPackage pkg = UmaUtil.findContentPackage(getPlugin(), ModelStructure.DEFAULT.customCategoryPath);
-		CustomCategory c = UmaFactory.eINSTANCE.createCustomCategory();
-
-		// also need to add the category object into the parent package
-		pkg.getContentElements().add(c);
-		if ( parent != null )
-		{
-			((CustomCategory)parent).getCategorizedElements().add(c);
-		}
-		else
-		{
-			// add to the root category
-			TngUtil.getRootCustomCategory(getPlugin()).getCategorizedElements().add(c);
-		}
-
-		return c;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createCapabilityPattern(MethodConfiguration)
-	 */
-	public CapabilityPattern createCapabilityPattern(MethodConfiguration defaultConfig) {
-
-		CapabilityPattern cp = UmaFactory.eINSTANCE.createCapabilityPattern();
-		cp.setDefaultContext(defaultConfig);
-
-		ProcessPackage capabilityPatternPkgs = (ProcessPackage)UmaUtil.findMethodPackage(getPlugin(), ModelStructure.DEFAULT.capabilityPatternPath);
-		List items = capabilityPatternPkgs.getChildPackages();
-
-		// need to create a package for this capability pattern
-		//System.out.println("Create pkg, TODIO");
-		// to add a capability process, you need to create a ProcessComponent package to hold the process
-		org.eclipse.epf.uma.ProcessComponent pc = UmaFactory.eINSTANCE.createProcessComponent();
-		pc.setGuid(EcoreUtil.generateUUID());
-		items.add(pc);
-		pc.setProcess(cp);
-
-		return cp;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createDeliveryProcess(MethodConfiguration)
-	 */
-	public DeliveryProcess createDeliveryProcess(MethodConfiguration defaultConfig) {
-		DeliveryProcess dp = UmaFactory.eINSTANCE.createDeliveryProcess();
-		dp.setDefaultContext(defaultConfig);
-
-		// this is the package that stores all capability patterns
-		MethodPlugin plugin = getPlugin();
-		ProcessPackage deliveryProcessPkgs = (ProcessPackage)UmaUtil.findMethodPackage(plugin, ModelStructure.DEFAULT.deliveryProcessPath);
-		List items = deliveryProcessPkgs.getChildPackages();
-
-		// you need to create a ProcessComponent package to hold the process
-		org.eclipse.epf.uma.ProcessComponent pc = UmaFactory.eINSTANCE.createProcessComponent();
-		pc.setGuid(EcoreUtil.generateUUID());
-		items.add(pc);
-		pc.setProcess(dp);
-
-		return dp;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createContentPackage(ContentPackage)
-	 */
-	public ContentPackage createContentPackage(ContentPackage container) {
-
-		ContentPackage pkg = UmaFactory.eINSTANCE.createContentPackage();
-		if ( container == null)
-		{
-			container = UmaUtil.findContentPackage(getPlugin(), ModelStructure.DEFAULT.coreContentPath);
-		}
-		container.getChildPackages().add(pkg);
-		return pkg;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createArtifact(ContentPackage)
-	 */
-	public Artifact createArtifact(ContentPackage container) {
-		Artifact e = UmaFactory.eINSTANCE.createArtifact();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createChecklist(ContentPackage)
-	 */
-	public Checklist createChecklist(ContentPackage container) {
-		Checklist e = UmaFactory.eINSTANCE.createChecklist();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createConcept(ContentPackage)
-	 */
-	public Concept createConcept(ContentPackage container) {
-		Concept e = UmaFactory.eINSTANCE.createConcept();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createDeliverable(ContentPackage)
-	 */
-	public Deliverable createDeliverable(ContentPackage container) {
-		Deliverable e = UmaFactory.eINSTANCE.createDeliverable();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createExample(ContentPackage)
-	 */
-	public Example createExample(ContentPackage container) {
-		Example e = UmaFactory.eINSTANCE.createExample();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createGuidance(ContentPackage)
-	 */
-	public Guidance createGuidance(ContentPackage container) {
-		Guidance e = UmaFactory.eINSTANCE.createGuideline();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createOutcome(ContentPackage)
-	 */
-	public Outcome createOutcome(ContentPackage container) {
-		Outcome e = UmaFactory.eINSTANCE.createOutcome();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createPractice(ContentPackage)
-	 */
-	public Practice createPractice(ContentPackage container) {
-		Practice e = UmaFactory.eINSTANCE.createPractice();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createReport(ContentPackage)
-	 */
-	public Report createReport(ContentPackage container) {
-		Report e = UmaFactory.eINSTANCE.createReport();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createReusableAsset(ContentPackage)
-	 */
-	public ReusableAsset createReusableAsset(ContentPackage container) {
-		ReusableAsset e = UmaFactory.eINSTANCE.createReusableAsset();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createRoadmap(ContentPackage)
-	 */
-	public Roadmap createRoadmap(ContentPackage container) {
-		Roadmap e = UmaFactory.eINSTANCE.createRoadmap();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createRole(ContentPackage)
-	 */
-	public Role createRole(ContentPackage container) {
-		Role e = UmaFactory.eINSTANCE.createRole();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createSupportingMaterial(ContentPackage)
-	 */
-	public SupportingMaterial createSupportingMaterial(ContentPackage container) {
-		SupportingMaterial e = UmaFactory.eINSTANCE.createSupportingMaterial();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createTask(ContentPackage)
-	 */
-	public Task createTask(ContentPackage container) {
-		Task e = UmaFactory.eINSTANCE.createTask();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createTemplate(ContentPackage)
-	 */
-	public Template createTemplate(ContentPackage container) {
-		Template e = UmaFactory.eINSTANCE.createTemplate();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createTermDefinition(ContentPackage)
-	 */
-	public TermDefinition createTermDefinition(ContentPackage container) {
-		TermDefinition e = UmaFactory.eINSTANCE.createTermDefinition();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createToolMentor(ContentPackage)
-	 */
-	public ToolMentor createToolMentor(ContentPackage container) {
-		ToolMentor e = UmaFactory.eINSTANCE.createToolMentor();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createWhitepaper(ContentPackage)
-	 */
-	public Whitepaper createWhitepaper(ContentPackage container) {
-		Whitepaper e = UmaFactory.eINSTANCE.createWhitepaper();
-		container.getContentElements().add(e);
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createActivity(Activity)
-	 */
-	public Activity createActivity(Activity superActivity) {
-		Activity e = UmaFactory.eINSTANCE.createActivity();
-		superActivity.getBreakdownElements().add(e);
-
-		addActivityToContainer(e);
-		
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createPhase(Activity)
-	 */
-	public Phase createPhase(Activity superActivity) {
-		Phase e = UmaFactory.eINSTANCE.createPhase();
-		superActivity.getBreakdownElements().add(e);
-
-		addActivityToContainer(e);
-
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createIteration(Activity)
-	 */
-	public Iteration createIteration(Activity superActivity) {
-		Iteration e = UmaFactory.eINSTANCE.createIteration();
-		superActivity.getBreakdownElements().add(e);
-
-		addActivityToContainer(e);
-
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#createMilestone(Activity)
-	 */
-	public Milestone createMilestone(Activity superActivity) {
-		Milestone e = UmaFactory.eINSTANCE.createMilestone();
-		superActivity.getBreakdownElements().add(e);
-
-		return e;
-	}
-
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#addTaskToActivity(Activity, Task)
-	 */
-	public void addTaskToActivity(Activity act, Task task) {
-		addTasksToActivity(act, Collections.singletonList(task));
-	}
-	
-	/**
-	 * @see org.eclipse.epf.dataexchange.importing.PluginService#addTasksToActivity(Activity, List)
-	 */
-	public void addTasksToActivity(final Activity act, final List tasks) {
-		// this method does not work any moredue to later changes
-		// use our own code instead
-		//ProcessUtil.addTaskToActivity(task, act);
-		
-		// before doing the command, make sure the object is 
-		// in the default configuration of the owing process
-		// otherwise you will get msg box asking for that, which may cause error for background process
-		org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess(act);
-		MethodConfiguration config = proc.getDefaultContext();
-		if ( config != null ) {
-			
-			for (Iterator it = tasks.iterator(); it.hasNext(); ) {
-				Task task = (Task)it.next();			
-				MethodPackage pkg = (MethodPackage)task.eContainer();
-				List pkgs = config.getMethodPackageSelection();
-				if ( !pkgs.contains(pkg) ) {
-					pkgs.add(pkg);
-				}
-			}
-		}
-
-		SafeUpdateController.syncExec(new Runnable() {public void run() {
-			WBSDropCommand cmd = new WBSDropCommand(act, tasks);
-			try {
-					cmd.execute();
-			} catch (Exception ex) {
-				ex.printStackTrace();
-			}	
-			finally {
-				cmd.dispose();
-			}	
-	    }});
-	}
-
-	/**
-	 * get process component for the element
-	 * @param e BreakdownElement
-	 * @return ProcessComponent
-	 */
-	public static ProcessComponent getProcessComponent(BreakdownElement e) {
-		
-		if ( e.eContainer() == null ) {
-			Activity parent = e.getSuperActivities();
-			if ( parent == null ) {
-				return null;
-			}
-			
-			return getProcessComponent(parent);
-		}
-	
-		EObject container;
-		for (container = e.eContainer(); container != null
-				&& !(container instanceof ProcessComponent); container = container
-				.eContainer())
-			;
-
-		if ( container != null ) {
-			return ((ProcessComponent) container);
-		}
-		
-		return null;
-	}
-	
-	private void addActivityToContainer(Activity act) {
-		ProcessComponent pc = getProcessComponent(act);
-		if ( pc != null ) {
-			// create a process package for the activity
-			 ProcessPackage pkg = UmaFactory.eINSTANCE.createProcessPackage();
-			 pkg.setName(act.getName());
-			 pkg.setGuid(EcoreUtil.generateUUID());
-			 pc.getChildPackages().add(pkg);
-			 
-			 pkg.getProcessElements().add(act);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/package.html b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/package.html
deleted file mode 100644
index 2b01da3..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/internal/importing/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for the data exchange service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/BaseResourceHandler.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/BaseResourceHandler.java
deleted file mode 100644
index f674b46..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/BaseResourceHandler.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.util;
-
-import java.io.File;
-
-import org.eclipse.epf.common.utils.FileUtil;
-
-/**
- * content resource handler to process the respources in the content
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public abstract class BaseResourceHandler implements IResourceHandler {
-
-	protected File sourceLibRoot;
-	protected File targetLibRoot;
-
-	public BaseResourceHandler(File sourceLibRoot, File targetLibRoot) {
-		this.sourceLibRoot = sourceLibRoot;
-		this.targetLibRoot = targetLibRoot;
-	}
-	
-	public abstract UrlInfo resolveFileUrl(Object owner, String srcUrl) throws Exception;
-	
-	
-	/**
-	 * copying the resource file from the source library to the target
-	 * 
-	 * @param sourceFile the file path relative to the source root
-	 */
-	public void copyResource(String sourceFile) {
-		File src = new File(sourceLibRoot, sourceFile);
-		if ( src.exists() ) {
-			File tgt = new File(targetLibRoot, sourceFile);
-			FileUtil.copyFile(src, tgt);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/ContentProcessor.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/ContentProcessor.java
deleted file mode 100644
index 8079032..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/ContentProcessor.java
+++ /dev/null
@@ -1,246 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.util;
-
-import java.io.File;
-import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.common.utils.FileUtil;
-
-
-
-/**
- * content processer to fix references and copy resources to the target library location
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ContentProcessor {
-
-	protected static final Pattern p_src_ref = Pattern.compile("src\\s*=\\s*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-//	protected static final Pattern p_link_ref = Pattern.compile("<a\\s+?([^>]*)>(.*?)</a>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-	protected static final Pattern p_href_ref = Pattern.compile("href\\s*=\\s*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	IResourceHandler handler;
-	ILogger logger;
-	
-	public ContentProcessor(IResourceHandler handler, ILogger logger) {
-		this.handler = handler;
-		this.logger = logger;
-	}
-	
-	/**
-	 * resovle the resource string for the given owner. 
-	 * The owner is a method element, but can be either from uma model or xml model. 
-	 * @param owner
-	 * @param source
-	 * @return
-	 */
-	public String resolveResourceFiles(Object owner, String source) {
-		StringBuffer sb = new StringBuffer();
-
-		try
-		{
-			// process images and other src resources
-			Matcher m = p_src_ref.matcher(source);
-			while ( m.find() )
-			{
-				String url = m.group(1);
-				String new_url  = processResourceUrl(owner, url);
-				String replacement = "src=\"" + new_url + "\""; 		 //$NON-NLS-1$ //$NON-NLS-2$
-				m.appendReplacement(sb, fixReplacementStr(replacement));
-			}
-			m.appendTail(sb);
-			
-			// process hrefs
-			m = p_href_ref.matcher(sb.toString());
-			sb.setLength(0);
-			
-			while ( m.find() )
-			{
-				String url = m.group(1);
-				String mark = ""; //$NON-NLS-1$
-
-				int index = url.indexOf("#"); //$NON-NLS-1$
-				if ( index >= 0 )
-				{
-					mark = url.substring(index);
-					url = url.substring(0, index);
-				}
-
-				if ( url.length() > 0 )
-				{
-					url = processResourceUrl(owner, url);
-				}
-				m.appendReplacement(sb, fixReplacementStr("href=\"" + url + mark + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			m.appendTail(sb);
-			
-			// anything else ???
-			
-		}
-		catch (Exception ex)
-		{
-			ex.printStackTrace();
-		}
-		
-		//System.out.println(sb);
-		
-		return sb.toString();
-	}
-	
-	private String fixReplacementStr(String str) {
-		// escape the $ since it's treated as a group sequence
-		try {
-			int index = str.indexOf("$"); //$NON-NLS-1$
-			if ( index < 0 ) {
-				return str;
-			}
-			
-			StringBuffer b = new StringBuffer();
-			int start = 0;
-			while ( index >= 0 ) {
-				b.append(str.substring(start, index)).append("\\$"); //$NON-NLS-1$
-				start = index+1;
-				index = str.indexOf("$", start); //$NON-NLS-1$
-			}
-			
-			b.append(str.substring(start));
-			
-			return b.toString();
-		
-		} catch (RuntimeException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		
-		return str;
-	}
-	
-	protected boolean isFileUrl(String url)
-	{
-		//System.out.println("Processing image url [" + url + "]");
-		if ( 	url == null || url.length() == 0
-				|| url.startsWith("http") //$NON-NLS-1$
-				|| url.startsWith("www.") //$NON-NLS-1$
-				|| url.startsWith("mailto:") //$NON-NLS-1$
-				|| url.toLowerCase().indexOf("javascript:") >=0 ) //$NON-NLS-1$
-		{
-			return false;
-		}
-
-		return true;
-	}
-	
-	protected boolean isValidFilePath(File f) {
-		return (f != null) && f.exists();
-	}
-	
-
-	public String processResourceUrl(Object owner, String url)
-	{
-		if ( !isFileUrl(url) )
-		{
-			return url;
-		}
-
-		UrlInfo info = null;
-		try {
-			info = handler.resolveFileUrl(owner, url);
-		} catch (Exception ex) {
-			logger.logWarning("error processing url '" + url + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-			return url;
-		}
-		
-		if ( info.sourceFile == null || info.targetFile == null ) {
-			return url;
-		}
-		
-		if ( info.sourceFile.isFile() && info.sourceFile.exists() )
-		{
-			FileUtil.copyFile(info.sourceFile, info.targetFile);
-			
-			// return the fixed target url if the file exists 
-			// and is copied over to the target location
-			return info.targetUrl;
-		}
-
-		return url;
-	}
-
-
-	/**
-	 * process the url, update the result buffer, and return the associated element if any
-	 * @param source teh url text string
-	 * @param result StringBuffer
-	 * @return MethodElement the linked element or null
-	 */
-	protected void processUrlText(Object owner, String source)
-	{
-		Matcher m = p_href_ref.matcher(source);
-		if ( m.find() )
-		{
-			String url = m.group(1);
-			if ( url.toLowerCase().indexOf("javaScript:") < 0 ) //$NON-NLS-1$
-			{
-				int index = url.indexOf("#"); //$NON-NLS-1$
-				if ( index >= 0 )
-				{
-					url = url.substring(0, index);
-				}
-
-				if ( url.length() > 0 )
-				{
-					processResourceUrl(owner, url);
-				}
-			}
-		}
-	}
-	
-	public void copyResource(String sourceFile) {
-		handler.copyResource(sourceFile);
-	}
-	
-	public void copyResource(String sourceFile, EObject obj, org.eclipse.epf.uma.MethodPlugin umaPlugin) {
-		handler.copyResource(sourceFile, obj, umaPlugin);
-	}
-	
-	/**
-	 * this method is for resolveing the template attachment resources
-	 * The resource is a set of urls seperated by |
-	 * 
-	 * @param owner
-	 * @param urls
-	 * @return String
-	 */
-	public String resolveAttachmentResources(Object owner, String urls) {
-		if ( (urls != null) && urls.length() != 0 ) {
-			StringBuffer buffer = new StringBuffer();
-			StringTokenizer st = new StringTokenizer(urls, "|"); // this is hardcoded somehow //$NON-NLS-1$
-			while (st.hasMoreTokens() ) {
-				String url = st.nextToken();
-				url = processResourceUrl(owner, url);
-				if ( buffer.length() > 0 ) {
-					buffer.append("|"); //$NON-NLS-1$
-				}
-				buffer.append(url);
-			}
-			
-			return buffer.toString();
-		}
-		
-		return ""; //$NON-NLS-1$
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/DefaultLogger.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/DefaultLogger.java
deleted file mode 100644
index a214776..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/DefaultLogger.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.util;
-
-import java.io.PrintStream;
-
-public class DefaultLogger implements ILogger {
-
-	protected PrintStream info = System.out;
-	protected PrintStream warning = System.out;
-	protected PrintStream error = System.err;
-	public void logError(String message, Throwable th) {
-		error.println(message);
-		if ( th != null ) {
-			th.printStackTrace(error);
-		}	
-	}
-	public void logWarning(String message) {
-		warning.println(message);
-	}
-	public void logMessage(String message) {
-		info.println(message);
-	}
-
-	public void dispose() {
-		
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/FileLogger.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/FileLogger.java
deleted file mode 100644
index ba500bf..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/FileLogger.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.util;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-
-/**
- * file Logger class
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class FileLogger extends DefaultLogger {
-
-	public static final String ERROR_LOG_FILENAME = "error.log"; //$NON-NLS-1$
-
-	public static final String WARNING_LOG_FILENAME = "warning.log"; //$NON-NLS-1$
-
-	public static final String INFO_LOG_FILENAME = "info.log"; //$NON-NLS-1$
-
-	protected File logPath;
-
-	public FileLogger(File logPath) {
-		this.logPath = logPath;
-
-		if (!this.logPath.exists()) {
-			this.logPath.mkdirs();
-		}
-
-		super.info = getStream(new File(logPath, INFO_LOG_FILENAME));
-		super.warning = getStream(new File(logPath, WARNING_LOG_FILENAME));
-		super.error = getStream(new File(logPath, ERROR_LOG_FILENAME));
-
-	}
-
-	private PrintStream getStream(File f) {
-		try {
-			File dir = f.getParentFile();
-			dir.mkdirs();
-
-			if (!f.exists()) {
-				f.createNewFile();
-			}
-
-			return new PrintStream(new FileOutputStream(f), true);
-		} catch (Exception e) {
-
-		}
-
-		return null;
-	}
-
-	public void dispose() {
-		info.close();
-		warning.close();
-		error.close();
-
-	}
-	
-	public File getLogPath() {
-		return logPath;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/ILogger.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/ILogger.java
deleted file mode 100644
index 30f15bb..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/ILogger.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.util;
-
-/**
- * Logger interface for export and import
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public interface ILogger {
-
-	public void logError(String message, Throwable th);
-	
-	public void logWarning(String message);
-	
-	public void logMessage(String message);
-	
-	public void dispose();
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/IResourceHandler.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/IResourceHandler.java
deleted file mode 100644
index 5de1efa..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/IResourceHandler.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.util;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.uma.MethodPlugin;
-
-/**
- * Resource handler interface for xml export and import
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public interface IResourceHandler {
-
-	public UrlInfo resolveFileUrl(Object owner, String srcUrl) throws Exception;
-
-	/**
-	 * copying the resource file from the source library to the target
-	 * 
-	 * @param sourceFile the file path relative to the source root
-	 * @deprecated
-	 */
-	public void copyResource(String sourceFile);
-	
-	public void copyResource(String sourceFile, EObject obj, org.eclipse.epf.uma.MethodPlugin umaPlugin);
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/UrlInfo.java b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/UrlInfo.java
deleted file mode 100644
index 7c2e8c8..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/UrlInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.dataexchange.util;
-
-import java.io.File;
-
-/**
- * Data structure to store url info in content
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class UrlInfo {
-
-	public File sourceFile;
-	public File targetFile;
-	public String sourceUrl;
-	public String targetUrl;
-}
diff --git a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/package.html b/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/package.html
deleted file mode 100644
index b69c60f..0000000
--- a/1.5/plugins/org.eclipse.epf.dataexchange/src/org/eclipse/epf/dataexchange/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for the data exchange service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/.classpath b/1.5/plugins/org.eclipse.epf.diagram.ad/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/.options b/1.5/plugins/org.eclipse.epf.diagram.ad/.options
deleted file mode 100644
index a83308b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/.options
+++ /dev/null
@@ -1,7 +0,0 @@
-# Debugging options for the org.eclipse.epf.diagram.ad plug-in
-
-# Turn on general debugging for the org.eclipse.epf.diagram.ad plug-in
-org.eclipse.epf.diagram.ad/debug=false
-
-# Turn on debugging of visualID processing
-org.eclipse.epf.diagram.ad/debug/visualID=true
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/.project b/1.5/plugins/org.eclipse.epf.diagram.ad/.project
deleted file mode 100644
index 8bc658c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.diagram.ad</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.diagram.ad/META-INF/MANIFEST.MF
deleted file mode 100644
index 03fc73f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,51 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.diagram.ad; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.epf.diagram.ad,
- org.eclipse.epf.diagram.ad.edit.parts,
- org.eclipse.epf.diagram.ad.part,
- org.eclipse.epf.diagram.ad.providers
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jface,
- org.eclipse.ui.ide,
- org.eclipse.ui.views,
- org.eclipse.ui.workbench,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.emf.ecore,
- org.eclipse.emf.ecore.xmi,
- org.eclipse.emf.edit.ui,
- org.eclipse.gef;visibility:=reexport,
- org.eclipse.gmf.runtime.emf.core;visibility:=reexport,
- org.eclipse.gmf.runtime.emf.commands.core;visibility:=reexport,
- org.eclipse.gmf.runtime.emf.ui.properties;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui.providers;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui.providers.ide;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui.render;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui.resources.editor;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide;visibility:=reexport,
- org.eclipse.gmf.runtime.notation.providers,
- org.eclipse.uml2.uml;visibility:=reexport,
- org.eclipse.uml2.uml.edit;visibility:=reexport,
- org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.emf.ecore.edit;visibility:=reexport,
- org.eclipse.gmf.runtime.draw2d.ui;visibility:=reexport,
- org.eclipse.draw2d;visibility:=reexport,
- org.eclipse.epf.uma,
- org.eclipse.epf.library,
- org.eclipse.gmf.runtime.diagram.ui.geoshapes,
- org.eclipse.epf.diagram.core,
- org.eclipse.gmf.runtime.diagram.ui.actions,
- org.eclipse.gmf.runtime.diagram.ui.printing,
- org.eclipse.gmf.runtime.diagram.ui.printing.render,
- org.eclipse.epf.diagram.add,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/build.properties b/1.5/plugins/org.eclipse.epf.diagram.ad/build.properties
deleted file mode 100644
index 02a53f4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-bin.includes = .,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties,\
-               icons/
-jars.compile.order = .
-source.. = src/
-output.. = bin/
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/activity.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/activity.gif
deleted file mode 100644
index 77393e6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/iteration.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/iteration.gif
deleted file mode 100644
index 25c8a14..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/milestone.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/milestone.gif
deleted file mode 100644
index 576ff94..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/phase.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/phase.gif
deleted file mode 100644
index 55cb3cd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/taskdescriptor.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/taskdescriptor.gif
deleted file mode 100644
index 345d651..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/taskdescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/taskdescriptor1.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/taskdescriptor1.gif
deleted file mode 100644
index 345d651..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/diagram/taskdescriptor1.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/dtool16/ADEditor.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/dtool16/ADEditor.gif
deleted file mode 100644
index 250fafc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/dtool16/ADEditor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/etool16/ADEditor.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/etool16/ADEditor.gif
deleted file mode 100644
index fe56f14..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/etool16/ADEditor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Activity.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ActivityFinalNode.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ActivityFinalNode.gif
deleted file mode 100644
index ed49728..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ActivityFinalNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ActivityPartition.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ActivityPartition.gif
deleted file mode 100644
index e168dc3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ActivityPartition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ControlFlow.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ControlFlow.gif
deleted file mode 100644
index e30c223..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ControlFlow.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/DecisionNode.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/DecisionNode.gif
deleted file mode 100644
index b4a601c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/DecisionNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ForkNode.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ForkNode.gif
deleted file mode 100644
index 67c20b3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/ForkNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/InitialNode.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/InitialNode.gif
deleted file mode 100644
index f75cf78..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/InitialNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Iteration.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Iteration.gif
deleted file mode 100644
index 4311e46..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/JoinNode.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/JoinNode.gif
deleted file mode 100644
index f8c3a39..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/JoinNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/MergeNode.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/MergeNode.gif
deleted file mode 100644
index e74cb96..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/MergeNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Milestone.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Milestone.gif
deleted file mode 100644
index d9615eb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Phase.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Phase.gif
deleted file mode 100644
index 6deb9dd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/Phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/StructuredActivityNode.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/StructuredActivityNode.gif
deleted file mode 100644
index 260fb29..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/StructuredActivityNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/TaskDescriptor.gif
deleted file mode 100644
index 554e26e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/delete.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/delete.gif
deleted file mode 100644
index b6922ac..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/full/obj16/delete.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/obj16/UMLDiagramFile.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/obj16/UMLDiagramFile.gif
deleted file mode 100644
index 67aa2df..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/obj16/UMLDiagramFile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/wizban/NewUMLWizard.gif b/1.5/plugins/org.eclipse.epf.diagram.ad/icons/wizban/NewUMLWizard.gif
deleted file mode 100644
index 83e03bf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/icons/wizban/NewUMLWizard.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/messages.properties b/1.5/plugins/org.eclipse.epf.diagram.ad/messages.properties
deleted file mode 100644
index 4a8e09d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/messages.properties
+++ /dev/null
@@ -1,79 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-
-################################################################################
-# START NO TRANSLATION
-################################################################################
-# TODO: manually put keys and values
-UMLDiagramEditorUtil_OpenModelResourceErrorDialogTitle=Error
-UMLDiagramEditorUtil_OpenModelResourceErrorDialogMessage=Failed to load model file {0}
-UMLDiagramEditorUtil_CreateDiagramProgressTask=Creating diagram and model files
-UMLDiagramEditorUtil_CreateDiagramCommandLabel=Creating diagram and model
-UMLDocumentProvider_isModifiable=Updating cache failed
-UMLDocumentProvider_handleElementContentChanged=Failed to refresh hierarchy for changed resource
-UMLDocumentProvider_IncorrectInputError={1}
-UMLDocumentProvider_UnableToLoadResourceError=Unable to load diagram resource
-UMLDocumentProvider_NoDiagramInResourceError=Diagram is not present in resource
-UMLDocumentProvider_DiagramLoadingError=Error loading diagram
-UMLDocumentProvider_UnsynchronizedFileSaveError=The file has been changed on the file system
-UMLDocumentProvider_SaveDiagramTask=Saving diagram
-UMLDocumentProvider_SaveNextResourceTask=Saving {0}
-UMLInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle=Error
-UMLInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage=Model file loading failed
-UMLInitDiagramFileAction_InitDiagramFileWizardTitle=Initialize new {0} diagram file
-UMLInitDiagramFileAction_OpenModelFileDialogTitle=Select domain model
-UMLNewDiagramFileWizard_CreationPageName=Initialize new diagram file
-UMLNewDiagramFileWizard_CreationPageTitle=Diagram file
-UMLNewDiagramFileWizard_CreationPageDescription=Create new diagram based on {0} model content
-UMLNewDiagramFileWizard_RootSelectionPageName=Select diagram root element
-UMLNewDiagramFileWizard_RootSelectionPageTitle=Diagram root element
-UMLNewDiagramFileWizard_RootSelectionPageDescription=Select semantic model element to be depicted on diagram
-UMLNewDiagramFileWizard_RootSelectionPageSelectionTitle=Select diagram root element:
-UMLNewDiagramFileWizard_RootSelectionPageNoSelectionMessage=Diagram root element is not selected
-UMLNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage=Invalid diagram root element is selected
-UMLNewDiagramFileWizard_InitDiagramCommand=Initializing diagram contents
-UMLNewDiagramFileWizard_IncorrectRootError=Incorrect model object stored as a root resource object
-Flows1Group_title=Flows
-Flows1Group_desc=Creation tool for flows
-Nodes2Group_title=Nodes
-Nodes2Group_desc=Creation tool group for nodes
-ControlFlow1CreationTool_title=Control Flow
-ControlFlow1CreationTool_desc=Create new Control Flow
-ActivityPartition1CreationTool_title=Activity Partition
-ActivityPartition1CreationTool_desc=Create new Activity Partition
-StartNode2CreationTool_title=Start Node
-StartNode2CreationTool_desc=Create new Start Node
-ForkNode3CreationTool_title=Fork Node
-ForkNode3CreationTool_desc=Create new Fork Node
-MergeNode4CreationTool_title=Merge Node
-MergeNode4CreationTool_desc=Create new Merge Node
-DecisionNode5CreationTool_title=Decision Node
-DecisionNode5CreationTool_desc=Create new Decision Node
-EndNode6CreationTool_title=End Node
-EndNode6CreationTool_desc=Create new End Node
-JoinNode7CreationTool_title=Join Node
-JoinNode7CreationTool_desc=Create new Join Node
-Activity9CreationTool_title=Activity
-Activity9CreationTool_desc=Create new Activity
-Phase10CreationTool_title=Phase
-Phase10CreationTool_desc=Create new Phase
-Iteration11CreationTool_title=Iteration
-Iteration11CreationTool_desc=Create new Iteration
-TaskDescriptor12CreationTool_title=Task Descriptor
-TaskDescriptor12CreationTool_desc=Create new Task Descriptor
-Milestone13CreationTool_title=Milestone
-Milestone13CreationTool_desc=Create new Milestone
-ActivityPartitionPartitionCampartmentEditPart_title=PartitionCampartment
-ActivityPartitionPartitionCampartment2EditPart_title=PartitionCampartment
-CommandName_OpenDiagram=Open Diagram
-################################################################################
-# END NO TRANSLATION
-################################################################################
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfgen
deleted file mode 100644
index eae96d8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfgen
+++ /dev/null
@@ -1,925 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2006/GenModel" packageNamePrefix="org.eclipse.epf.diagram.ad"
-    modelID="AD"
-    sameFileForDiagramAndModel="true"
-    diagramFileExtension="xmi"
-    templateDirectory=""
-    copyrightText=" Copyright (c) 2005, 2006 IBM Corporation and others.&#xD;&#xA; All rights reserved. This program and the accompanying materials&#xD;&#xA; are made available under the terms of the Eclipse Public License v1.0&#xD;&#xA; which accompanies this distribution, and is available at&#xD;&#xA; http://www.eclipse.org/legal/epl-v10.html&#xD;&#xA;&#xD;&#xA; Contributors:&#xD;&#xA; IBM Corporation - initial implementation&#xD;&#xA;">
-  <diagram
-      visualID="79"
-      editPartClassName="ActivityEditPart"
-      itemSemanticEditPolicyClassName="ActivityItemSemanticEditPolicy"
-      notationViewFactoryClassName="ActivityViewFactory"
-      canonicalEditPolicyClassName="ActivityCanonicalEditPolicy"
-      iconProviderPriority="Low"
-      creationWizardIconPath="icons/diagram/activity.gif"
-      validationProviderClassName="ValidationProvider"
-      metricProviderClassName="MetricProvider"
-      validationDecoratorProviderClassName="ValidationDecoratorProvider">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="ActivityEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity"/>
-    <childNodes
-        visualID="2001"
-        editPartClassName="ActivityPartition2EditPart"
-        itemSemanticEditPolicyClassName="ActivityPartition2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartition2ViewFactory"
-        canonicalEditPolicyClassName="ActivityPartition2CanonicalEditPolicy"
-        compartments="//@diagram/@compartments.1"
-        graphicalNodeEditPolicyClassName="ActivityPartition2GraphicalNodeEditPolicy"
-        containers="//@diagram/@compartments.1 //@diagram/@compartments.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.7/@elementType"
-          editHelperAdviceClassName="ActivityPartitionEditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="XY_LAYOUT"
-          className="ActivityPartitionFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityPartitionFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityPartitionFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.XYLayout myGenLayoutManager = new org.eclipse.draw2d.XYLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.black&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ACTIVITYPARTITIONFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setBorder(&#xD;&#xA;new org.eclipse.draw2d.LineBorder()&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigurePartitionLabelFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fPartitionLabelFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigurePartitionLabelFigure() {&#xD;&#xA;&#x9;&#x9;return fPartitionLabelFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigurePartitionLabelFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fPartitionLabelFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ACTIVITYPARTITIONFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 255);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition/subpartition"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition/subpartition"/>
-      </modelFacet>
-      <labels
-          visualID="4006"
-          editPartClassName="ActivityPartitionNameEditPart"
-          itemSemanticEditPolicyClassName="ActivityPartitionNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityPartitionNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigurePartitionLabelFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern=""
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="ActivityFinalNodeEditPart"
-        itemSemanticEditPolicyClassName="ActivityFinalNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityFinalNodeViewFactory"
-        canonicalEditPolicyClassName="ActivityFinalNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ActivityFinalNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ActivityFinalNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="EndNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class EndNodeFigure extends org.eclipse.epf.diagram.ad.custom.figures.EndNodeFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public EndNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ENDNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(24), getMapMode().DPtoLP(24));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(24), getMapMode().DPtoLP(24));&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ENDNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityFinalNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          xsi:type="gmfgen:GenExternalNodeLabel"
-          visualID="4001"
-          editPartClassName="ActivityFinalNodeNameEditPart"
-          itemSemanticEditPolicyClassName="ActivityFinalNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityFinalNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:FigureViewmap"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern=""
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1002"
-        editPartClassName="MergeNodeEditPart"
-        itemSemanticEditPolicyClassName="MergeNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="MergeNodeViewFactory"
-        canonicalEditPolicyClassName="MergeNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="MergeNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="MergeNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="DecisionDiamondFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class DecisionDiamondFigure extends org.eclipse.epf.diagram.ad.custom.figures.DecisionNodeFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public DecisionDiamondFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(DECISIONDIAMONDFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureDiamondLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fDiamondLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureDiamondLabel() {&#xD;&#xA;&#x9;&#x9;return fDiamondLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureDiamondLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fDiamondLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color DECISIONDIAMONDFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 185, 205, 230);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/MergeNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="MergeNodeNameEditPart"
-          itemSemanticEditPolicyClassName="MergeNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="MergeNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="NodeNameFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class NodeNameFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public NodeNameFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1003"
-        editPartClassName="ForkNodeEditPart"
-        itemSemanticEditPolicyClassName="ForkNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="ForkNodeViewFactory"
-        canonicalEditPolicyClassName="ForkNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ForkNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ForkNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ForkNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ForkNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ForkNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(FORKNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color FORKNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <attributes
-            xsi:type="gmfgen:ResizeConstraints"
-            resizeHandles="24"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ForkNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1004"
-        editPartClassName="InitialNodeEditPart"
-        itemSemanticEditPolicyClassName="InitialNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="InitialNodeViewFactory"
-        canonicalEditPolicyClassName="InitialNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="InitialNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="InitialNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="InitialNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class InitialNodeFigure extends org.eclipse.draw2d.Ellipse {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public InitialNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(INITIALNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(20), getMapMode().DPtoLP(20));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(20), getMapMode().DPtoLP(20));&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color INITIALNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/InitialNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          xsi:type="gmfgen:GenExternalNodeLabel"
-          visualID="4003"
-          editPartClassName="InitialNodeNameEditPart"
-          itemSemanticEditPolicyClassName="InitialNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="InitialNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:FigureViewmap"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern=""
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1005"
-        editPartClassName="DecisionNodeEditPart"
-        itemSemanticEditPolicyClassName="DecisionNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="DecisionNodeViewFactory"
-        canonicalEditPolicyClassName="DecisionNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="DecisionNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="DecisionNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="DecisionDiamondFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class DecisionDiamondFigure extends org.eclipse.epf.diagram.ad.custom.figures.DecisionNodeFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public DecisionDiamondFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(DECISIONDIAMONDFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureDiamondLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fDiamondLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureDiamondLabel() {&#xD;&#xA;&#x9;&#x9;return fDiamondLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureDiamondLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fDiamondLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color DECISIONDIAMONDFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 185, 205, 230);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/DecisionNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          visualID="4004"
-          editPartClassName="DecisionNodeNameEditPart"
-          itemSemanticEditPolicyClassName="DecisionNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="DecisionNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="NodeNameFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class NodeNameFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public NodeNameFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1006"
-        editPartClassName="JoinNodeEditPart"
-        itemSemanticEditPolicyClassName="JoinNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="JoinNodeViewFactory"
-        canonicalEditPolicyClassName="JoinNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="JoinNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="JoinNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ForkNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ForkNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ForkNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(FORKNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color FORKNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <attributes
-            xsi:type="gmfgen:ResizeConstraints"
-            resizeHandles="24"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/JoinNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1007"
-        editPartClassName="StructuredActivityNodeEditPart"
-        itemSemanticEditPolicyClassName="StructuredActivityNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="StructuredActivityNodeViewFactory"
-        canonicalEditPolicyClassName="StructuredActivityNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="StructuredActivityNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="StructuredActivityNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="StructuredActivityNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class StructuredActivityNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public StructuredActivityNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Activity"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Activity&#xD;&#xA;"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4005"
-          editPartClassName="StructuredActivityNodeNameEditPart"
-          itemSemanticEditPolicyClassName="StructuredActivityNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="StructuredActivityNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1008"
-        editPartClassName="ActivityPartitionEditPart"
-        itemSemanticEditPolicyClassName="ActivityPartitionItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartitionViewFactory"
-        canonicalEditPolicyClassName="ActivityPartitionCanonicalEditPolicy"
-        compartments="//@diagram/@compartments.0"
-        graphicalNodeEditPolicyClassName="ActivityPartitionGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ActivityPartitionEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="XY_LAYOUT"
-          className="ActivityPartitionFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityPartitionFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityPartitionFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.XYLayout myGenLayoutManager = new org.eclipse.draw2d.XYLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.black&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ACTIVITYPARTITIONFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setBorder(&#xD;&#xA;new org.eclipse.draw2d.LineBorder()&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigurePartitionLabelFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fPartitionLabelFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigurePartitionLabelFigure() {&#xD;&#xA;&#x9;&#x9;return fPartitionLabelFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigurePartitionLabelFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fPartitionLabelFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ACTIVITYPARTITIONFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 255);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/group"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/group"/>
-      </modelFacet>
-      <labels
-          visualID="4007"
-          editPartClassName="ActivityPartitionName2EditPart"
-          itemSemanticEditPolicyClassName="ActivityPartitionName2ItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityPartitionName2ViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigurePartitionLabelFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern=""
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1009"
-        editPartClassName="ActivityParameterNodeEditPart"
-        itemSemanticEditPolicyClassName="ActivityParameterNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityParameterNodeViewFactory"
-        canonicalEditPolicyClassName="ActivityParameterNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ActivityParameterNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ActivityParameterNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ActivityParameterNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityParameterNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityParameterNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureActivityParameterNodeNameLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fActivityParameterNodeNameLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureActivityParameterNodeNameLabel() {&#xD;&#xA;&#x9;&#x9;return fActivityParameterNodeNameLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureActivityParameterNodeNameLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fActivityParameterNodeNameLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityParameterNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_TaskDescriptor"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_TaskDescriptor"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4008"
-          editPartClassName="ActivityParameterNodeNameEditPart"
-          itemSemanticEditPolicyClassName="ActivityParameterNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityParameterNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureActivityParameterNodeNameLabel"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1010"
-        editPartClassName="StructuredActivityNode2EditPart"
-        itemSemanticEditPolicyClassName="StructuredActivityNode2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="StructuredActivityNode2ViewFactory"
-        canonicalEditPolicyClassName="StructuredActivityNode2CanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="StructuredActivityNode2GraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.6/@elementType"
-          editHelperAdviceClassName="StructuredActivityNodeEditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="StructuredActivityNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class StructuredActivityNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public StructuredActivityNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Phase"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Phase"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4009"
-          editPartClassName="StructuredActivityNodeName2EditPart"
-          itemSemanticEditPolicyClassName="StructuredActivityNodeName2ItemSemanticEditPolicy"
-          notationViewFactoryClassName="StructuredActivityNodeName2ViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1011"
-        editPartClassName="StructuredActivityNode3EditPart"
-        itemSemanticEditPolicyClassName="StructuredActivityNode3ItemSemanticEditPolicy"
-        notationViewFactoryClassName="StructuredActivityNode3ViewFactory"
-        canonicalEditPolicyClassName="StructuredActivityNode3CanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="StructuredActivityNode3GraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.6/@elementType"
-          editHelperAdviceClassName="StructuredActivityNode2EditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="StructuredActivityNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class StructuredActivityNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public StructuredActivityNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Iteration"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Iteration"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4010"
-          editPartClassName="StructuredActivityNodeName3EditPart"
-          itemSemanticEditPolicyClassName="StructuredActivityNodeName3ItemSemanticEditPolicy"
-          notationViewFactoryClassName="StructuredActivityNodeName3ViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1012"
-        editPartClassName="ActivityParameterNode2EditPart"
-        itemSemanticEditPolicyClassName="ActivityParameterNode2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityParameterNode2ViewFactory"
-        canonicalEditPolicyClassName="ActivityParameterNode2CanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ActivityParameterNode2GraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.8/@elementType"
-          editHelperAdviceClassName="ActivityParameterNodeEditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ActivityParameterNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityParameterNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityParameterNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureActivityParameterNodeNameLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fActivityParameterNodeNameLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureActivityParameterNodeNameLabel() {&#xD;&#xA;&#x9;&#x9;return fActivityParameterNodeNameLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureActivityParameterNodeNameLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fActivityParameterNodeNameLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityParameterNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Milestone"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Milestone"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4011"
-          editPartClassName="ActivityParameterNodeName2EditPart"
-          itemSemanticEditPolicyClassName="ActivityParameterNodeName2ItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityParameterNodeName2ViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureActivityParameterNodeNameLabel"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="ControlFlowEditPart"
-        itemSemanticEditPolicyClassName="ControlFlowItemSemanticEditPolicy"
-        notationViewFactoryClassName="ControlFlowViewFactory">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ControlFlowEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ControlFlowFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ControlFlowFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ControlFlowFigure() {&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.draw2d.PolylineDecoration createTargetDecoration() {&#xD;&#xA;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xD;&#xA;// dispatchNext?&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, 1);&#xD;&#xA;&#x9;&#x9;pl.addPoint(0, 0);&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, -1);&#xD;&#xA;&#x9;&#x9;df.setTemplate(pl);&#xD;&#xA;&#x9;&#x9;df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;return df;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ControlFlow"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode/edge"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode/edge"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityEdge/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityEdge/target"/>
-      </modelFacet>
-      <labels
-          visualID="4012"
-          editPartClassName="ControlFlowNameEditPart"
-          itemSemanticEditPolicyClassName="ControlFlowNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ControlFlowNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="ControlFlowLabelFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ControlFlowLabelFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ControlFlowLabelFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern=""
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <compartments
-        visualID="5001"
-        editPartClassName="ActivityPartitionPartitionCampartmentEditPart"
-        itemSemanticEditPolicyClassName="ActivityPartitionPartitionCampartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartitionPartitionCampartmentViewFactory"
-        canonicalEditPolicyClassName="ActivityPartitionPartitionCampartmentCanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.0"
-        title="PartitionCampartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.7"
-        listLayout="false">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <compartments
-        visualID="5002"
-        editPartClassName="ActivityPartitionPartitionCampartment2EditPart"
-        itemSemanticEditPolicyClassName="ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartitionPartitionCampartment2ViewFactory"
-        canonicalEditPolicyClassName="ActivityPartitionPartitionCampartment2CanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.0"
-        title="PartitionCampartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@childNodes.0"
-        listLayout="false">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <palette>
-      <groups
-          title="Flows"
-          description="Creation tool for flows"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Control Flow"
-            description="Create new Control Flow"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ControlFlow.gif"
-            genLinks="//@diagram/@links.0"/>
-      </groups>
-      <groups
-          title="Nodes"
-          description="Creation tool group for nodes"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Activity Partition"
-            description="Create new Activity Partition"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ActivityPartition.gif"
-            genNodes="//@diagram/@topLevelNodes.7 //@diagram/@childNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Start Node"
-            description="Create new Start Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/InitialNode.gif"
-            genNodes="//@diagram/@topLevelNodes.3"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Fork Node"
-            description="Create new Fork Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ForkNode.gif"
-            genNodes="//@diagram/@topLevelNodes.2"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Merge Node"
-            description="Create new Merge Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/MergeNode.gif"
-            genNodes="//@diagram/@topLevelNodes.1"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Decision Node"
-            description="Create new Decision Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/DecisionNode.gif"
-            genNodes="//@diagram/@topLevelNodes.4"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="End Node"
-            description="Create new End Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ActivityFinalNode.gif"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Join Node"
-            description="Create new Join Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/JoinNode.gif"
-            genNodes="//@diagram/@topLevelNodes.5"/>
-        <entries
-            xsi:type="gmfgen:Separator"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Activity"
-            description="Create new Activity"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Activity.gif"
-            genNodes="//@diagram/@topLevelNodes.6"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Phase"
-            description="Create new Phase"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Phase.gif"
-            genNodes="//@diagram/@topLevelNodes.9"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Iteration"
-            description="Create new Iteration"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Iteration.gif"
-            genNodes="//@diagram/@topLevelNodes.10"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Task Descriptor"
-            description="Create new Task Descriptor"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/TaskDescriptor.gif"
-            genNodes="//@diagram/@topLevelNodes.8"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Milestone"
-            description="Create new Milestone"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Milestone.gif"
-            genNodes="//@diagram/@topLevelNodes.11"/>
-      </groups>
-    </palette>
-  </diagram>
-  <plugin
-      iD="org.eclipse.epf.diagram.ad"
-      name="EPF Activity Diagram"
-      provider="Eclipse.org"
-      version="1.2.0.qualifier"
-      printingEnabled="true"
-      activatorClassName="ActivityDiagramEditorPlugin"/>
-  <editor
-      className="ActivityDiagramEditor"/>
-  <domainGenModel
-      href="../../org.eclipse.uml2.uml/model/UML.genmodel#/"/>
-  <expressionProviders>
-    <providers
-        xsi:type="gmfgen:GenJavaExpressionProvider"
-        expressions="//@diagram/@topLevelNodes.6/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.6/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.8/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.8/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.9/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.9/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.10/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.10/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.11/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.11/@modelFacet/@modelElementInitializer/@initializers.0"/>
-  </expressionProviders>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfgraph b/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfgraph
deleted file mode 100644
index 862f8dd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfgraph
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgraph:Canvas xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgraph="http://www.eclipse.org/gmf/2006/GraphicalDefinition" name="uml">
-  <figures
-      name="Default">
-    <descriptors
-        name="StructuredActivityNodeFigure">
-      <actualFigure
-          xsi:type="gmfgraph:Rectangle"
-          name="StructuredActivityNodeFigure"
-          outline="false">
-        <children
-            xsi:type="gmfgraph:Label"
-            name="NodeNameFigure"
-            text=""/>
-      </actualFigure>
-      <accessors
-          figure="//@figures.0/@descriptors.0/@actualFigure/@children.0"/>
-    </descriptors>
-    <descriptors
-        name="ActivityPartitionFigure">
-      <actualFigure
-          xsi:type="gmfgraph:Rectangle"
-          name="ActivityPartitionFigure">
-        <layoutData
-            xsi:type="gmfgraph:XYLayoutData">
-          <size
-              dx="100"
-              dy="200"/>
-        </layoutData>
-        <layout
-            xsi:type="gmfgraph:XYLayout"/>
-        <foregroundColor
-            xsi:type="gmfgraph:ConstantColor"
-            value="black"/>
-        <backgroundColor
-            xsi:type="gmfgraph:RGBColor"
-            red="255"
-            green="255"
-            blue="255"/>
-        <preferredSize
-            dx="300"
-            dy="600"/>
-        <border
-            xsi:type="gmfgraph:LineBorder"/>
-        <size
-            x="300"
-            y="600"/>
-        <children
-            xsi:type="gmfgraph:Label"
-            name="PartitionLabelFigure"/>
-      </actualFigure>
-      <accessors
-          figure="//@figures.0/@descriptors.1/@actualFigure/@children.0"/>
-    </descriptors>
-    <descriptors
-        name="ControlFlowFigure">
-      <actualFigure
-          xsi:type="gmfgraph:PolylineConnection"
-          name="ControlFlowFigure"
-          targetDecoration="//@figures.0/@descriptors.2/@actualFigure/@children.0">
-        <children
-            xsi:type="gmfgraph:PolylineDecoration"
-            name="OpenArrow">
-          <template
-              x="-1"
-              y="1"/>
-          <template/>
-          <template
-              x="-1"
-              y="-1"/>
-        </children>
-        <children
-            xsi:type="gmfgraph:Label"
-            name="ControlFlowLabelFigure"
-            text=""/>
-      </actualFigure>
-      <accessors
-          figure="//@figures.0/@descriptors.2/@actualFigure/@children.1"/>
-    </descriptors>
-    <descriptors
-        name="ForkNodeFigure">
-      <actualFigure
-          xsi:type="gmfgraph:Rectangle"
-          name="ForkNodeFigure">
-        <backgroundColor
-            xsi:type="gmfgraph:RGBColor"
-            red="45"
-            green="85"
-            blue="130"/>
-        <preferredSize
-            dx="100"
-            dy="5"/>
-        <size
-            x="100"
-            y="5"/>
-      </actualFigure>
-    </descriptors>
-    <descriptors
-        name="EndNodeFigure">
-      <actualFigure
-          xsi:type="gmfgraph:CustomFigure"
-          name="EndNodeFigure"
-          qualifiedClassName="org.eclipse.epf.diagram.ad.custom.figures.EndNodeFigure">
-        <foregroundColor
-            xsi:type="gmfgraph:ConstantColor"
-            value="darkBlue"/>
-        <backgroundColor
-            xsi:type="gmfgraph:RGBColor"
-            red="45"
-            green="85"
-            blue="130"/>
-        <preferredSize
-            dx="24"
-            dy="24"/>
-        <size
-            x="24"
-            y="24"/>
-      </actualFigure>
-    </descriptors>
-    <descriptors
-        name="DecisionDiamondFigure">
-      <actualFigure
-          xsi:type="gmfgraph:CustomFigure"
-          name="DecisionDiamondFigure"
-          qualifiedClassName="org.eclipse.epf.diagram.ad.custom.figures.DecisionNodeFigure">
-        <foregroundColor
-            xsi:type="gmfgraph:ConstantColor"
-            value="darkBlue"/>
-        <backgroundColor
-            xsi:type="gmfgraph:RGBColor"
-            red="185"
-            green="205"
-            blue="230"/>
-        <preferredSize
-            dx="50"
-            dy="50"/>
-        <size
-            x="50"
-            y="50"/>
-        <children
-            xsi:type="gmfgraph:Label"
-            name="DiamondLabel"/>
-      </actualFigure>
-    </descriptors>
-    <descriptors
-        name="InitialNodeFigure">
-      <actualFigure
-          xsi:type="gmfgraph:Ellipse"
-          name="InitialNodeFigure">
-        <foregroundColor
-            xsi:type="gmfgraph:ConstantColor"
-            value="darkBlue"/>
-        <backgroundColor
-            xsi:type="gmfgraph:RGBColor"
-            red="45"
-            green="85"
-            blue="130"/>
-        <preferredSize
-            dx="20"
-            dy="20"/>
-        <size
-            x="20"
-            y="20"/>
-      </actualFigure>
-    </descriptors>
-    <descriptors
-        name="GenericLabelFigure">
-      <actualFigure
-          xsi:type="gmfgraph:Label"
-          name="GenericLabelFigure"/>
-    </descriptors>
-    <descriptors
-        name="ResizeableCompartmentFigureEx">
-      <actualFigure
-          xsi:type="gmfgraph:CustomFigure"
-          name="ResizeableCompartmentFigureEx"
-          qualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure"/>
-    </descriptors>
-    <descriptors
-        name="ActivityParameterNodeFigure">
-      <actualFigure
-          xsi:type="gmfgraph:Rectangle"
-          name="ActivityParameterNodeFigure"
-          outline="false">
-        <children
-            xsi:type="gmfgraph:Label"
-            name="ActivityParameterNodeNameLabel"/>
-      </actualFigure>
-      <accessors
-          figure="//@figures.0/@descriptors.9/@actualFigure/@children.0"/>
-    </descriptors>
-  </figures>
-  <nodes
-      name="StructuredActivityNode"
-      figure="StructuredActivityNodeFigure"/>
-  <nodes
-      name="ActivityPartition"
-      figure="ActivityPartitionFigure"/>
-  <nodes
-      name="InitialNode"
-      figure="InitialNodeFigure"/>
-  <nodes
-      name="ForkNode"
-      figure="ForkNodeFigure"
-      resizeConstraint="EAST_WEST"/>
-  <nodes
-      name="MergeNode"
-      figure="DecisionDiamondFigure"/>
-  <nodes
-      name="DecisionNode"
-      figure="DecisionDiamondFigure"/>
-  <nodes
-      name="ActivityFinalNode"
-      figure="EndNodeFigure"/>
-  <nodes
-      name="JoinNode"
-      figure="ForkNodeFigure"
-      resizeConstraint="EAST_WEST"/>
-  <nodes
-      name="ActivityParameterNode"
-      figure="ActivityParameterNodeFigure"/>
-  <connections
-      name="ControlFlow"
-      figure="ControlFlowFigure"/>
-  <compartments
-      name="PartitionCampartment"
-      figure="ResizeableCompartmentFigureEx"/>
-  <labels
-      name="NodeName"
-      figure="StructuredActivityNodeFigure"
-      accessor="//@figures.0/@descriptors.0/@accessors.0"/>
-  <labels
-      name="PartitionName"
-      figure="ActivityPartitionFigure"
-      accessor="//@figures.0/@descriptors.1/@accessors.0"/>
-  <labels
-      name="ControlFlowLabel"
-      figure="ControlFlowFigure"
-      resizeConstraint="EAST_WEST"
-      accessor="//@figures.0/@descriptors.2/@accessors.0"/>
-  <labels
-      name="MergeNodePolygonLabel"/>
-  <labels
-      name="GenericLabel"
-      figure="GenericLabelFigure"
-      resizeConstraint="EAST_WEST"
-      elementIcon="false"/>
-  <labels
-      name="ActivityNodeName"
-      figure="StructuredActivityNodeFigure"
-      elementIcon="false"
-      accessor="//@figures.0/@descriptors.0/@accessors.0"/>
-  <labels
-      name="InitialNodeName"
-      figure="StructuredActivityNodeFigure"
-      elementIcon="false"
-      accessor="//@figures.0/@descriptors.0/@accessors.0"/>
-  <labels
-      name="ForkNodeName"
-      figure="StructuredActivityNodeFigure"
-      elementIcon="false"
-      accessor="//@figures.0/@descriptors.0/@accessors.0"/>
-  <labels
-      name="DecisionNodeName"
-      figure="StructuredActivityNodeFigure"
-      elementIcon="false"
-      accessor="//@figures.0/@descriptors.0/@accessors.0"/>
-  <labels
-      name="ActivityParameterNodeName"
-      figure="ActivityParameterNodeFigure"
-      elementIcon="false"
-      accessor="//@figures.0/@descriptors.9/@accessors.0"/>
-</gmfgraph:Canvas>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfmap b/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfmap
deleted file mode 100644
index ec46954..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmfmap
+++ /dev/null
@@ -1,355 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfmap:Mapping xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:gmfmap="http://www.eclipse.org/gmf/2006/mappings"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityFinalNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#GenericLabel"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.5"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityFinalNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//MergeNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#DecisionNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.3"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#MergeNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ForkNode"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.2"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ForkNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//InitialNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#GenericLabel"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.1"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#InitialNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//DecisionNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#DecisionNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.4"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#DecisionNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//JoinNode"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.6"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#JoinNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode"/>
-      <domainSpecialization
-          body="getUmaType_Activity"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Activity&#xD;&#xA;"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.8"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#StructuredActivityNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/group"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityPartition"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#PartitionName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.0"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityPartition"/>
-      <children
-          compartment="//@nodes.7/@ownedChild/@compartments.0"
-          referencedChild="//@nodes.7/@ownedChild">
-        <containmentFeature
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityPartition/subpartition"/>
-      </children>
-      <compartments
-          children="//@nodes.7/@ownedChild/@children.0">
-        <compartment
-            href="epfdiagram.gmfgraph#PartitionCampartment"/>
-      </compartments>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityParameterNode"/>
-      <domainSpecialization
-          body="getUmaType_TaskDescriptor"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_TaskDescriptor"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityParameterNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.11"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityParameterNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode"/>
-      <domainSpecialization
-          body="getUmaType_Phase"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Phase"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.9"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#StructuredActivityNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode"/>
-      <domainSpecialization
-          body="getUmaType_Iteration"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Iteration"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.10"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#StructuredActivityNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityParameterNode"/>
-      <domainSpecialization
-          body="getUmaType_Milestone"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Milestone"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityParameterNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.12"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityParameterNode"/>
-    </ownedChild>
-  </nodes>
-  <links>
-    <domainMetaElement
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//ControlFlow"/>
-    <labelMappings
-        xsi:type="gmfmap:FeatureLabelMapping"
-        viewPattern="">
-      <diagramLabel
-          href="epfdiagram.gmfgraph#ControlFlowLabel"/>
-      <features
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-    </labelMappings>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode/edge"/>
-    <tool
-        xsi:type="gmftool:CreationTool"
-        href="epfdiagram.gmftool#//@palette/@tools.0/@tools.0"/>
-    <diagramLink
-        href="epfdiagram.gmfgraph#ControlFlow"/>
-    <sourceMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityEdge/source"/>
-    <linkMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityEdge/target"/>
-  </links>
-  <diagram>
-    <diagramCanvas
-        href="epfdiagram.gmfgraph#uml"/>
-    <domainModel
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#/"/>
-    <domainMetaElement
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity"/>
-    <palette
-        href="epfdiagram.gmftool#//@palette"/>
-  </diagram>
-</gmfmap:Mapping>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmftool b/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmftool
deleted file mode 100644
index 39e4696..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram.gmftool
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmftool:ToolRegistry xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <palette>
-    <tools
-        xsi:type="gmftool:ToolGroup"
-        title="Flows"
-        description="Creation tool for flows"
-        collapsible="true">
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Control Flow"
-          description="Create new Control Flow">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/ControlFlow.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-    </tools>
-    <tools
-        xsi:type="gmftool:ToolGroup"
-        title="Nodes"
-        description="Creation tool group for nodes"
-        collapsible="true"
-        active="//@palette/@tools.1">
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Activity Partition"
-          description="Create new Activity Partition">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/ActivityPartition.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Start Node"
-          description="Create new Start Node">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/InitialNode.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Fork Node"
-          description="Create new Fork Node">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/ForkNode.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Merge Node"
-          description="Create new Merge Node">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/MergeNode.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Decision Node"
-          description="Create new Decision Node">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/DecisionNode.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="End Node"
-          description="Create new End Node">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/ActivityFinalNode.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Join Node"
-          description="Create new Join Node">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/JoinNode.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:PaletteSeparator"/>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Activity"
-          description="Create new Activity">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/Activity.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Phase"
-          description="Create new Phase">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/Phase.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Iteration"
-          description="Create new Iteration">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/Iteration.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:BundleImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Task Descriptor"
-          description="Create new Task Descriptor">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/TaskDescriptor.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Milestone"
-          description="Create new Milestone">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/Milestone.gif"
-            bundle="org.eclipse.epf.diagramming"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-    </tools>
-  </palette>
-</gmftool:ToolRegistry>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram2.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram2.gmfgen
deleted file mode 100644
index 35072ca..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram2.gmfgen
+++ /dev/null
@@ -1,925 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel/2.0" packageNamePrefix="org.eclipse.epf.diagram.ad"
-    modelID="AD"
-    sameFileForDiagramAndModel="true"
-    diagramFileExtension="xmi"
-    templateDirectory=""
-    copyrightText=" Copyright (c) 2005, 2007 IBM Corporation and others.&#xD;&#xA; All rights reserved. This program and the accompanying materials&#xD;&#xA; are made available under the terms of the Eclipse Public License v1.0&#xD;&#xA; which accompanies this distribution, and is available at&#xD;&#xA; http://www.eclipse.org/legal/epl-v10.html&#xD;&#xA;&#xD;&#xA; Contributors:&#xD;&#xA; IBM Corporation - initial implementation&#xD;&#xA;">
-  <diagram
-      visualID="79"
-      editPartClassName="ActivityEditPart"
-      itemSemanticEditPolicyClassName="ActivityItemSemanticEditPolicy"
-      notationViewFactoryClassName="ActivityViewFactory"
-      canonicalEditPolicyClassName="ActivityCanonicalEditPolicy"
-      iconProviderPriority="Low"
-      creationWizardIconPath="icons/diagram/activity.gif"
-      validationProviderClassName="ValidationProvider"
-      metricProviderClassName="MetricProvider"
-      validationDecoratorProviderClassName="ValidationDecoratorProvider">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="ActivityEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity"/>
-    <childNodes
-        visualID="2001"
-        editPartClassName="ActivityPartition2EditPart"
-        itemSemanticEditPolicyClassName="ActivityPartition2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartition2ViewFactory"
-        canonicalEditPolicyClassName="ActivityPartition2CanonicalEditPolicy"
-        compartments="//@diagram/@compartments.1"
-        graphicalNodeEditPolicyClassName="ActivityPartition2GraphicalNodeEditPolicy"
-        containers="//@diagram/@compartments.1 //@diagram/@compartments.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.7/@elementType"
-          editHelperAdviceClassName="ActivityPartitionEditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="XY_LAYOUT"
-          className="ActivityPartitionFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityPartitionFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityPartitionFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.XYLayout myGenLayoutManager = new org.eclipse.draw2d.XYLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.black&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ACTIVITYPARTITIONFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setBorder(&#xD;&#xA;new org.eclipse.draw2d.LineBorder()&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigurePartitionLabelFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fPartitionLabelFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigurePartitionLabelFigure() {&#xD;&#xA;&#x9;&#x9;return fPartitionLabelFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigurePartitionLabelFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fPartitionLabelFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ACTIVITYPARTITIONFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 255);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition/subpartition"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition/subpartition"/>
-      </modelFacet>
-      <labels
-          visualID="4006"
-          editPartClassName="ActivityPartitionNameEditPart"
-          itemSemanticEditPolicyClassName="ActivityPartitionNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityPartitionNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigurePartitionLabelFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="ActivityFinalNodeEditPart"
-        itemSemanticEditPolicyClassName="ActivityFinalNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityFinalNodeViewFactory"
-        canonicalEditPolicyClassName="ActivityFinalNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ActivityFinalNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ActivityFinalNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="EndNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class EndNodeFigure extends org.eclipse.epf.diagram.ad.custom.figures.EndNodeFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public EndNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ENDNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(24), getMapMode().DPtoLP(24));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(24), getMapMode().DPtoLP(24));&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ENDNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityFinalNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          xsi:type="gmfgen:GenExternalNodeLabel"
-          visualID="4001"
-          editPartClassName="ActivityFinalNodeNameEditPart"
-          itemSemanticEditPolicyClassName="ActivityFinalNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityFinalNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:FigureViewmap"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1002"
-        editPartClassName="MergeNodeEditPart"
-        itemSemanticEditPolicyClassName="MergeNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="MergeNodeViewFactory"
-        canonicalEditPolicyClassName="MergeNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="MergeNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="MergeNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="DecisionDiamondFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class DecisionDiamondFigure extends org.eclipse.epf.diagram.ad.custom.figures.DecisionNodeFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public DecisionDiamondFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(DECISIONDIAMONDFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureDiamondLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fDiamondLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureDiamondLabel() {&#xD;&#xA;&#x9;&#x9;return fDiamondLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureDiamondLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fDiamondLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color DECISIONDIAMONDFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 185, 205, 230);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/MergeNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="MergeNodeNameEditPart"
-          itemSemanticEditPolicyClassName="MergeNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="MergeNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="NodeNameFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class NodeNameFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public NodeNameFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1003"
-        editPartClassName="ForkNodeEditPart"
-        itemSemanticEditPolicyClassName="ForkNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="ForkNodeViewFactory"
-        canonicalEditPolicyClassName="ForkNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ForkNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ForkNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ForkNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ForkNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ForkNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(FORKNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color FORKNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <attributes
-            xsi:type="gmfgen:ResizeConstraints"
-            resizeHandles="24"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ForkNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1004"
-        editPartClassName="InitialNodeEditPart"
-        itemSemanticEditPolicyClassName="InitialNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="InitialNodeViewFactory"
-        canonicalEditPolicyClassName="InitialNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="InitialNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="InitialNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="InitialNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class InitialNodeFigure extends org.eclipse.draw2d.Ellipse {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public InitialNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(INITIALNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(20), getMapMode().DPtoLP(20));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(20), getMapMode().DPtoLP(20));&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color INITIALNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/InitialNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          xsi:type="gmfgen:GenExternalNodeLabel"
-          visualID="4003"
-          editPartClassName="InitialNodeNameEditPart"
-          itemSemanticEditPolicyClassName="InitialNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="InitialNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:FigureViewmap"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1005"
-        editPartClassName="DecisionNodeEditPart"
-        itemSemanticEditPolicyClassName="DecisionNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="DecisionNodeViewFactory"
-        canonicalEditPolicyClassName="DecisionNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="DecisionNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="DecisionNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="DecisionDiamondFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class DecisionDiamondFigure extends org.eclipse.epf.diagram.ad.custom.figures.DecisionNodeFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public DecisionDiamondFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(DECISIONDIAMONDFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureDiamondLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fDiamondLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureDiamondLabel() {&#xD;&#xA;&#x9;&#x9;return fDiamondLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureDiamondLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fDiamondLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color DECISIONDIAMONDFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 185, 205, 230);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/DecisionNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-      <labels
-          visualID="4004"
-          editPartClassName="DecisionNodeNameEditPart"
-          itemSemanticEditPolicyClassName="DecisionNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="DecisionNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="NodeNameFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class NodeNameFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public NodeNameFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1006"
-        editPartClassName="JoinNodeEditPart"
-        itemSemanticEditPolicyClassName="JoinNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="JoinNodeViewFactory"
-        canonicalEditPolicyClassName="JoinNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="JoinNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="JoinNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ForkNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ForkNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ForkNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(FORKNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(5));&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color FORKNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 45, 85, 130);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <attributes
-            xsi:type="gmfgen:ResizeConstraints"
-            resizeHandles="24"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/JoinNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-      </modelFacet>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1007"
-        editPartClassName="StructuredActivityNodeEditPart"
-        itemSemanticEditPolicyClassName="StructuredActivityNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="StructuredActivityNodeViewFactory"
-        canonicalEditPolicyClassName="StructuredActivityNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="StructuredActivityNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="StructuredActivityNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="StructuredActivityNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class StructuredActivityNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public StructuredActivityNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Activity"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Activity&#xD;&#xA;"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4005"
-          editPartClassName="StructuredActivityNodeNameEditPart"
-          itemSemanticEditPolicyClassName="StructuredActivityNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="StructuredActivityNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1008"
-        editPartClassName="ActivityPartitionEditPart"
-        itemSemanticEditPolicyClassName="ActivityPartitionItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartitionViewFactory"
-        canonicalEditPolicyClassName="ActivityPartitionCanonicalEditPolicy"
-        compartments="//@diagram/@compartments.0"
-        graphicalNodeEditPolicyClassName="ActivityPartitionGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ActivityPartitionEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="XY_LAYOUT"
-          className="ActivityPartitionFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityPartitionFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityPartitionFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.XYLayout myGenLayoutManager = new org.eclipse.draw2d.XYLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.black&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ACTIVITYPARTITIONFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setPreferredSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));&#xD;&#xA;&#x9;&#x9;this.setBorder(&#xD;&#xA;new org.eclipse.draw2d.LineBorder()&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigurePartitionLabelFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fPartitionLabelFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigurePartitionLabelFigure() {&#xD;&#xA;&#x9;&#x9;return fPartitionLabelFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigurePartitionLabelFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fPartitionLabelFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ACTIVITYPARTITIONFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 255);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityPartition"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/group"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/group"/>
-      </modelFacet>
-      <labels
-          visualID="4007"
-          editPartClassName="ActivityPartitionName2EditPart"
-          itemSemanticEditPolicyClassName="ActivityPartitionName2ItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityPartitionName2ViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigurePartitionLabelFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1009"
-        editPartClassName="ActivityParameterNodeEditPart"
-        itemSemanticEditPolicyClassName="ActivityParameterNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityParameterNodeViewFactory"
-        canonicalEditPolicyClassName="ActivityParameterNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ActivityParameterNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ActivityParameterNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ActivityParameterNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityParameterNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityParameterNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureActivityParameterNodeNameLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fActivityParameterNodeNameLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureActivityParameterNodeNameLabel() {&#xD;&#xA;&#x9;&#x9;return fActivityParameterNodeNameLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureActivityParameterNodeNameLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fActivityParameterNodeNameLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityParameterNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_TaskDescriptor"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_TaskDescriptor"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4008"
-          editPartClassName="ActivityParameterNodeNameEditPart"
-          itemSemanticEditPolicyClassName="ActivityParameterNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityParameterNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureActivityParameterNodeNameLabel"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1010"
-        editPartClassName="StructuredActivityNode2EditPart"
-        itemSemanticEditPolicyClassName="StructuredActivityNode2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="StructuredActivityNode2ViewFactory"
-        canonicalEditPolicyClassName="StructuredActivityNode2CanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="StructuredActivityNode2GraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.6/@elementType"
-          editHelperAdviceClassName="StructuredActivityNodeEditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="StructuredActivityNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class StructuredActivityNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public StructuredActivityNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Phase"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Phase"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4009"
-          editPartClassName="StructuredActivityNodeName2EditPart"
-          itemSemanticEditPolicyClassName="StructuredActivityNodeName2ItemSemanticEditPolicy"
-          notationViewFactoryClassName="StructuredActivityNodeName2ViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1011"
-        editPartClassName="StructuredActivityNode3EditPart"
-        itemSemanticEditPolicyClassName="StructuredActivityNode3ItemSemanticEditPolicy"
-        notationViewFactoryClassName="StructuredActivityNode3ViewFactory"
-        canonicalEditPolicyClassName="StructuredActivityNode3CanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="StructuredActivityNode3GraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.6/@elementType"
-          editHelperAdviceClassName="StructuredActivityNode2EditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="StructuredActivityNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class StructuredActivityNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public StructuredActivityNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Iteration"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Iteration"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4010"
-          editPartClassName="StructuredActivityNodeName3EditPart"
-          itemSemanticEditPolicyClassName="StructuredActivityNodeName3ItemSemanticEditPolicy"
-          notationViewFactoryClassName="StructuredActivityNodeName3ViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1012"
-        editPartClassName="ActivityParameterNode2EditPart"
-        itemSemanticEditPolicyClassName="ActivityParameterNode2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityParameterNode2ViewFactory"
-        canonicalEditPolicyClassName="ActivityParameterNode2CanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="ActivityParameterNode2GraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:SpecializationType"
-          metamodelType="//@diagram/@topLevelNodes.8/@elementType"
-          editHelperAdviceClassName="ActivityParameterNodeEditHelperAdvice"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ActivityParameterNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ActivityParameterNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ActivityParameterNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureActivityParameterNodeNameLabel(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fActivityParameterNodeNameLabel; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureActivityParameterNodeNameLabel() {&#xD;&#xA;&#x9;&#x9;return fActivityParameterNodeNameLabel;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureActivityParameterNodeNameLabel(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fActivityParameterNodeNameLabel = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityParameterNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/Activity/node"/>
-        <modelElementSelector
-            body="getUmaType_Milestone"
-            language="java"/>
-        <modelElementInitializer
-            xsi:type="gmfgen:GenFeatureSeqInitializer">
-          <initializers
-              xsi:type="gmfgen:GenFeatureValueSpec"
-              body="createUmaType_Milestone"
-              language="java">
-            <feature
-                href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EModelElement/eAnnotations"/>
-          </initializers>
-        </modelElementInitializer>
-      </modelFacet>
-      <labels
-          visualID="4011"
-          editPartClassName="ActivityParameterNodeName2EditPart"
-          itemSemanticEditPolicyClassName="ActivityParameterNodeName2ItemSemanticEditPolicy"
-          notationViewFactoryClassName="ActivityParameterNodeName2ViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureActivityParameterNodeNameLabel"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="ControlFlowEditPart"
-        itemSemanticEditPolicyClassName="ControlFlowItemSemanticEditPolicy"
-        notationViewFactoryClassName="ControlFlowViewFactory">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="ControlFlowEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="ControlFlowFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ControlFlowFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ControlFlowFigure() {&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.draw2d.PolylineDecoration createTargetDecoration() {&#xD;&#xA;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xD;&#xA;// dispatchNext?&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, 1);&#xD;&#xA;&#x9;&#x9;pl.addPoint(0, 0);&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, -1);&#xD;&#xA;&#x9;&#x9;df.setTemplate(pl);&#xD;&#xA;&#x9;&#x9;df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;return df;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ControlFlow"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode/edge"/>
-        <childMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/StructuredActivityNode/edge"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityEdge/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/ActivityEdge/target"/>
-      </modelFacet>
-      <labels
-          visualID="4012"
-          editPartClassName="ControlFlowNameEditPart"
-          itemSemanticEditPolicyClassName="ControlFlowNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="ControlFlowNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="ControlFlowLabelFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class ControlFlowLabelFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public ControlFlowLabelFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.uml2.uml/model/UML.genmodel#//uml/NamedElement/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <compartments
-        visualID="5001"
-        editPartClassName="ActivityPartitionPartitionCampartmentEditPart"
-        itemSemanticEditPolicyClassName="ActivityPartitionPartitionCampartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartitionPartitionCampartmentViewFactory"
-        canonicalEditPolicyClassName="ActivityPartitionPartitionCampartmentCanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.0"
-        title="PartitionCampartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.7"
-        listLayout="false">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <compartments
-        visualID="5002"
-        editPartClassName="ActivityPartitionPartitionCampartment2EditPart"
-        itemSemanticEditPolicyClassName="ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy"
-        notationViewFactoryClassName="ActivityPartitionPartitionCampartment2ViewFactory"
-        canonicalEditPolicyClassName="ActivityPartitionPartitionCampartment2CanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.0"
-        title="PartitionCampartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@childNodes.0"
-        listLayout="false">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <palette>
-      <groups
-          title="Flows"
-          description="Creation tool for flows"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Control Flow"
-            description="Create new Control Flow"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ControlFlow.gif"
-            genLinks="//@diagram/@links.0"/>
-      </groups>
-      <groups
-          title="Nodes"
-          description="Creation tool group for nodes"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Activity Partition"
-            description="Create new Activity Partition"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ActivityPartition.gif"
-            genNodes="//@diagram/@topLevelNodes.7 //@diagram/@childNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Start Node"
-            description="Create new Start Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/InitialNode.gif"
-            genNodes="//@diagram/@topLevelNodes.3"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Fork Node"
-            description="Create new Fork Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ForkNode.gif"
-            genNodes="//@diagram/@topLevelNodes.2"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Merge Node"
-            description="Create new Merge Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/MergeNode.gif"
-            genNodes="//@diagram/@topLevelNodes.1"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Decision Node"
-            description="Create new Decision Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/DecisionNode.gif"
-            genNodes="//@diagram/@topLevelNodes.4"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="End Node"
-            description="Create new End Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/ActivityFinalNode.gif"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Join Node"
-            description="Create new Join Node"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/JoinNode.gif"
-            genNodes="//@diagram/@topLevelNodes.5"/>
-        <entries
-            xsi:type="gmfgen:Separator"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Activity"
-            description="Create new Activity"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Activity.gif"
-            genNodes="//@diagram/@topLevelNodes.6"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Phase"
-            description="Create new Phase"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Phase.gif"
-            genNodes="//@diagram/@topLevelNodes.9"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Iteration"
-            description="Create new Iteration"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Iteration.gif"
-            genNodes="//@diagram/@topLevelNodes.10"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Task Descriptor"
-            description="Create new Task Descriptor"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/TaskDescriptor.gif"
-            genNodes="//@diagram/@topLevelNodes.8"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Milestone"
-            description="Create new Milestone"
-            smallIconPath="/org.eclipse.epf.diagramming/icons/full/obj16/Milestone.gif"
-            genNodes="//@diagram/@topLevelNodes.11"/>
-      </groups>
-    </palette>
-  </diagram>
-  <plugin
-      iD="org.eclipse.epf.diagram.ad"
-      name="EPF Activity Diagram"
-      provider="Eclipse.org"
-      version="1.2.0.qualifier"
-      printingEnabled="true"
-      activatorClassName="ActivityDiagramEditorPlugin"/>
-  <editor
-      className="ActivityDiagramEditor"/>
-  <domainGenModel
-      href="../../org.eclipse.uml2.uml/model/UML.genmodel#/"/>
-  <expressionProviders>
-    <providers
-        xsi:type="gmfgen:GenJavaExpressionProvider"
-        expressions="//@diagram/@topLevelNodes.6/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.6/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.8/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.8/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.9/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.9/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.10/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.10/@modelFacet/@modelElementInitializer/@initializers.0 //@diagram/@topLevelNodes.11/@modelFacet/@modelElementSelector //@diagram/@topLevelNodes.11/@modelFacet/@modelElementInitializer/@initializers.0"/>
-  </expressionProviders>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram2.gmfmap b/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram2.gmfmap
deleted file mode 100644
index 70210ee..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/model/epfdiagram2.gmfmap
+++ /dev/null
@@ -1,359 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfmap:Mapping xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:gmfmap="http://www.eclipse.org/gmf/2005/mappings/2.0"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityFinalNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern=""
-          editPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#GenericLabel"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.5"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityFinalNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//MergeNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#DecisionNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.3"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#MergeNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ForkNode"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.2"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ForkNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//InitialNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern=""
-          editPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#GenericLabel"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.1"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#InitialNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//DecisionNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          editPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#DecisionNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.4"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#DecisionNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//JoinNode"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.6"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#JoinNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode"/>
-      <domainSpecialization
-          body="getUmaType_Activity"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Activity&#xD;&#xA;"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.8"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#StructuredActivityNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/group"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityPartition"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern=""
-          editPattern="">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#PartitionName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.0"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityPartition"/>
-      <children
-          compartment="//@nodes.7/@ownedChild/@compartments.0"
-          referencedChild="//@nodes.7/@ownedChild">
-        <containmentFeature
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityPartition/subpartition"/>
-      </children>
-      <compartments
-          children="//@nodes.7/@ownedChild/@children.0">
-        <compartment
-            href="epfdiagram.gmfgraph#PartitionCampartment"/>
-      </compartments>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityParameterNode"/>
-      <domainSpecialization
-          body="getUmaType_TaskDescriptor"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_TaskDescriptor"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityParameterNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.11"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityParameterNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode"/>
-      <domainSpecialization
-          body="getUmaType_Phase"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Phase"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.9"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#StructuredActivityNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode"/>
-      <domainSpecialization
-          body="getUmaType_Iteration"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Iteration"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.10"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#StructuredActivityNode"/>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity/node"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityParameterNode"/>
-      <domainSpecialization
-          body="getUmaType_Milestone"
-          language="java"/>
-      <domainInitializer
-          xsi:type="gmfmap:FeatureSeqInitializer">
-        <initializers
-            xsi:type="gmfmap:FeatureValueSpec"
-            body="createUmaType_Milestone"
-            language="java">
-          <feature
-              xsi:type="ecore:EReference"
-              href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EModelElement/eAnnotations"/>
-        </initializers>
-      </domainInitializer>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping">
-        <diagramLabel
-            href="epfdiagram.gmfgraph#ActivityParameterNodeName"/>
-        <features
-            href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-      </labelMappings>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="epfdiagram.gmftool#//@palette/@tools.1/@tools.12"/>
-      <diagramNode
-          href="epfdiagram.gmfgraph#ActivityParameterNode"/>
-    </ownedChild>
-  </nodes>
-  <links>
-    <domainMetaElement
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//ControlFlow"/>
-    <labelMappings
-        xsi:type="gmfmap:FeatureLabelMapping"
-        viewPattern=""
-        editPattern="">
-      <diagramLabel
-          href="epfdiagram.gmfgraph#ControlFlowLabel"/>
-      <features
-          href="../../org.eclipse.uml2.uml/model/UML.ecore#//NamedElement/name"/>
-    </labelMappings>
-    <containmentFeature
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//StructuredActivityNode/edge"/>
-    <tool
-        xsi:type="gmftool:CreationTool"
-        href="epfdiagram.gmftool#//@palette/@tools.0/@tools.0"/>
-    <diagramLink
-        href="epfdiagram.gmfgraph#ControlFlow"/>
-    <sourceMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityEdge/source"/>
-    <linkMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//ActivityEdge/target"/>
-  </links>
-  <diagram>
-    <diagramCanvas
-        href="epfdiagram.gmfgraph#uml"/>
-    <domainModel
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#/"/>
-    <domainMetaElement
-        href="../../org.eclipse.uml2.uml/model/UML.ecore#//Activity"/>
-    <palette
-        href="epfdiagram.gmftool#//@palette"/>
-  </diagram>
-</gmfmap:Mapping>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/plugin.properties b/1.5/plugins/org.eclipse.epf.diagram.ad/plugin.properties
deleted file mode 100644
index 2fb295b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/plugin.properties
+++ /dev/null
@@ -1,71 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-################################################################################
-# START NO TRANSLATION
-################################################################################
-preferences.general=AD Diagram
-preferences.appearance=Appearance
-preferences.connections=Connections
-preferences.printing=Printing
-preferences.rulersAndGrid=Rulers & Grid
-preferences.pathmaps=Path Maps
-
-editorName=AD Diagram Editor
-newWizardName=AD Diagram
-newWizardDesc=Creates AD diagram.
-
-initDiagramActionLabel=Initialize xmi diagram file
-loadResourceActionLabel=Load Resource...
-
-navigatorContentName=*.xmi diagram contents
-
-metatype.name.Activity_79=Undefined
-metatype.name.ActivityFinalNode_1001=ActivityFinalNode
-metatype.name.MergeNode_1002=MergeNode
-metatype.name.ForkNode_1003=ForkNode
-metatype.name.InitialNode_1004=InitialNode
-metatype.name.DecisionNode_1005=DecisionNode
-metatype.name.JoinNode_1006=JoinNode
-metatype.name.StructuredActivityNode_1007=StructuredActivityNode
-metatype.name.ActivityPartition_1008=ActivityPartition
-metatype.name.ActivityParameterNode_1009=ActivityParameterNode
-metatype.name.StructuredActivityNode_1010=StructuredActivityNode
-metatype.name.StructuredActivityNode_1011=StructuredActivityNode
-metatype.name.ActivityParameterNode_1012=ActivityParameterNode
-metatype.name.ActivityPartition_2001=ActivityPartition
-metatype.name.ControlFlow_3001=ControlFlow
-################################################################################
-# END NO TRANSLATION
-################################################################################
-
-
-pluginName=EPF Activity Diagram
-providerName=Eclipse.org
-
-#Needs Translation
-open_add_text=Open Activity Detail Diagram
-element_type_activity_partition=Activity Partition
-element_type_end_node=End Node
-element_type_merge_node=Merge Node
-element_type_fork_node=Fork Node
-element_type_start_node=Start Node
-element_type_decision_node=Decision Node
-element_type_join_node=Join Node
-element_type_activity=Activity
-element_type_phase=Phase
-element_type_iteration=Iteration
-element_type_task_descriptor=Task Descriptor
-element_type_milestone=Milestone
-element_type_control_flow=Control Flow
-
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/plugin.xml b/1.5/plugins/org.eclipse.epf.diagram.ad/plugin.xml
deleted file mode 100644
index dd3fef1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/plugin.xml
+++ /dev/null
@@ -1,531 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- Copyright (c) 2005, 2006 IBM Corporation and others.
- All rights reserved. This program and the accompanying materials
- are made available under the terms of the Eclipse Public License v1.0
- which accompanies this distribution, and is available at
- http://www.eclipse.org/legal/epl-v10.html
-
- Contributors:
- IBM Corporation - initial implementation
-
--->
-<plugin>
-
-   <extension point="org.eclipse.core.runtime.preferences">
-      <initializer class="org.eclipse.epf.diagram.ad.part.UMLDiagramPreferenceInitializer"/>
-   </extension>
-
-  <extension point="org.eclipse.team.core.fileTypes">
-      <fileTypes
-         type="text"
-         extension="xmi">
-      </fileTypes>
-  </extension>
-
-   <extension point="org.eclipse.emf.ecore.extension_parser">
-      <parser
-         type="xmi"
-         class="org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory">
-      </parser>
-   </extension>
-
-   <extension point="org.eclipse.ui.editors">
-     <editor
-        id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID"
-        name="Activity Diagram Editor"
-        icon="icons/full/etool16/ADEditor.gif"
-        class="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditor"
-        matchingStrategy="org.eclipse.epf.diagram.ad.part.UMLMatchingStrategy"
-        contributorClass="org.eclipse.epf.diagram.ad.part.UMLDiagramActionBarContributor">
-     </editor>
-   </extension>
-
-  <!-- <extension point="org.eclipse.ui.newWizards">
-  	  <wizard
-  	     name="Activity Diagram"
-  	     icon="icons/obj16/UMLDiagramFile.gif"
-  	     category="org.eclipse.ui.Examples"
-  	     class="org.eclipse.epf.diagram.ad.part.UMLCreationWizard"
-  	     id="org.eclipse.epf.diagram.ad.part.UMLCreationWizardID">
-  	  	 <description>
-  	  		Creates Activity diagram.
-  	  	 </description>  
-      </wizard>
-   </extension> -->
-
-   <extension point="org.eclipse.ui.popupMenus">
-     	<!-- <objectContribution
-            id="org.eclipse.epf.diagram.ad.ui.objectContribution.IFile1"
-            nameFilter="*.uml"
-            objectClass="org.eclipse.core.resources.IFile">
-         <action
-               label="Initialize xmi diagram file"
-               class="org.eclipse.epf.diagram.ad.part.UMLInitDiagramFileAction"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.ad.part.UMLInitDiagramFileActionID">
-         </action>
-      </objectContribution>  
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.epf.diagram.ad.ui.objectContribution.ActivityEditPart2"
-            objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart">
-         <action
-               class="org.eclipse.epf.diagram.ad.part.UMLLoadResourceAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.ad.part.UMLLoadResourceActionID"
-               label="Load Resource..."
-               menubarPath="additions">
-         </action>
-      </objectContribution> 
- -->
-  </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders">
-  	 <contributionItemProvider class="org.eclipse.epf.diagram.ad.providers.DiagramContributionItemProvider">
-         <Priority name="Low">
-         </Priority>
-         <partContribution id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID">
-            <partAction menubarPath="/file/print" id="printPreviewAction">
-            </partAction>
-         </partContribution>
-      </contributionItemProvider>
-      <contributionItemProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContributionItemProvider"
-            checkPluginLoaded="false">
-         <Priority name="Low"/>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-            <popupPredefinedItem id="deleteFromModelAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-            <popupPredefinedItem id="deleteFromModelAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionName2EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart"/>
-			<popupPredefinedItem id="deleteFromDiagramAction" remove="true"/> 
-            <popupPredefinedItem id="deleteFromModelAction" remove="true"/>
-         </popupContribution>
-      </contributionItemProvider> 
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.globalActionHandlerProviders">
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandlerProvider"
-         id="ADPresentation">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="delete"/>
-            </ElementType>
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
-               <GlobalActionId actionId="save"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-       <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.printing.render.providers.DiagramWithPrintGlobalActionHandlerProvider"
-         id="ADPresentationPrint">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="print"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.providers.ide.providers.DiagramIDEGlobalActionHandlerProvider"
-         id="ADPresentationIDE">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="bookmark"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <!--
-      <GlobalActionHandlerProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.render.providers.DiagramUIRenderGlobalActionHandlerProvider"
-            id="ADRender">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="cut"/>
-               <GlobalActionId actionId="copy"/>
-               <GlobalActionId actionId="paste"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      -->
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.core.viewProviders">
-      <viewProvider class="org.eclipse.epf.diagram.ad.providers.UMLViewProvider">
-         <Priority name="Lowest"/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Diagram" semanticHints="AD"/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Node" semanticHints=""/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Edge" semanticHints=""/>
-      </viewProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.ui.editpartProviders">
-      <editpartProvider class="org.eclipse.epf.diagram.ad.providers.UMLEditPartProvider">
-         <Priority name="Lowest"/>
-      </editpartProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.ui.paletteProviders">
-      <paletteProvider class="org.eclipse.epf.diagram.ad.providers.UMLPaletteProvider">
-         <Priority name="Lowest"/>
-         <editor id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID"/>
-      </paletteProvider>
-      <paletteProvider
-			class="org.eclipse.gmf.runtime.diagram.ui.providers.DefaultPaletteProvider">
-        <Priority name="Medium"/>
-        <editor id="org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID"/>
-        <contribution>
-            <predefinedEntry    
-            	id="geoshapeDrawer" path="/">
-             </predefinedEntry> 
-        </contribution>
-      </paletteProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.ui.modelingAssistantProviders">
-      <modelingAssistantProvider class="org.eclipse.epf.diagram.ad.providers.UMLModelingAssistantProvider">
-         <Priority name="Lowest"/>
-      </modelingAssistantProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.properties.propertiesProviders">
-      <PropertiesProvider
-            verifyPluginLoaded="false"
-            class="org.eclipse.epf.diagram.ad.providers.UMLPropertyProvider">
-         <Priority name="Lowest"/>
-      </PropertiesProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.iconProviders">
-      <IconProvider class="org.eclipse.epf.diagram.ad.providers.UMLIconProvider">
-         <Priority name="Low"/>
-      </IconProvider>
-      <IconProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.providers.GeoShapeIconProvider">
-         <Priority
-               name="Medium">
-         </Priority>
-         <object class="org.eclipse.gmf.runtime.notation.View(org.eclipse.gmf.runtime.notation)" id="GeoShape">
-        	 <method name="getType()" value="oval,triangle,rectangle,shadowRectangle,rectangle3D,roundRectangle,hexagon,octagon,pentagon,diamond,cylinder,line"/>
-	     </object>
-         <context elements="GeoShape">
-         </context>
-      </IconProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.parserProviders">
-      <ParserProvider class="org.eclipse.epf.diagram.ad.providers.UMLParserProvider">
-         <Priority name="Lowest"/>
-      </ParserProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypes">
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.Activity_79"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="Activity"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.ActivityEditHelper">
-            <param name="semanticHint" value="79"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <specializationType
-               id="org.eclipse.epf.diagram.ad.ActivityPartition_2001"
-               name="%element_type_activity_partition"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               edithelperadvice="org.eclipse.epf.diagram.ad.edit.helpers.ActivityPartitionEditHelperAdvice">
-            <specializes id="org.eclipse.epf.diagram.ad.ActivityPartition_1008"/>
-            <param name="semanticHint" value="2001"/>
-         </specializationType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.ActivityFinalNode_1001"
-               name="%element_type_end_node"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="ActivityFinalNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.ActivityFinalNodeEditHelper">
-            <param name="semanticHint" value="1001"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.MergeNode_1002"
-               name="%element_type_merge_node"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="MergeNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.MergeNodeEditHelper">
-            <param name="semanticHint" value="1002"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.ForkNode_1003"
-               name="%element_type_fork_node"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="ForkNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.ForkNodeEditHelper">
-            <param name="semanticHint" value="1003"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.InitialNode_1004"
-               name="%element_type_start_node"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="InitialNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.InitialNodeEditHelper">
-            <param name="semanticHint" value="1004"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.DecisionNode_1005"
-               name="%element_type_decision_node"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="DecisionNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.DecisionNodeEditHelper">
-            <param name="semanticHint" value="1005"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.JoinNode_1006"
-               name="%element_type_join_node"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="JoinNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.JoinNodeEditHelper">
-            <param name="semanticHint" value="1006"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.StructuredActivityNode_1007"
-               name="%element_type_activity"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="StructuredActivityNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.StructuredActivityNodeEditHelper">
-            <param name="semanticHint" value="1007"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.ActivityPartition_1008"
-               name="%element_type_activity_partition"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="ActivityPartition"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.ActivityPartitionEditHelper">
-            <param name="semanticHint" value="1008"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.ActivityParameterNode_1009"
-               name="%element_type_task_descriptor"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="ActivityParameterNode"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.ActivityParameterNodeEditHelper">
-            <param name="semanticHint" value="1009"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <specializationType
-               id="org.eclipse.epf.diagram.ad.StructuredActivityNode_1010"
-               name="%element_type_phase"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               edithelperadvice="org.eclipse.epf.diagram.ad.edit.helpers.StructuredActivityNodeEditHelperAdvice">
-            <specializes id="org.eclipse.epf.diagram.ad.StructuredActivityNode_1007"/>
-            <param name="semanticHint" value="1010"/>
-         </specializationType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <specializationType
-               id="org.eclipse.epf.diagram.ad.StructuredActivityNode_1011"
-               name="%element_type_iteration"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               edithelperadvice="org.eclipse.epf.diagram.ad.edit.helpers.StructuredActivityNode2EditHelperAdvice">
-            <specializes id="org.eclipse.epf.diagram.ad.StructuredActivityNode_1007"/>
-            <param name="semanticHint" value="1011"/>
-         </specializationType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <specializationType
-               id="org.eclipse.epf.diagram.ad.ActivityParameterNode_1012"
-               name="%element_type_milestone"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               edithelperadvice="org.eclipse.epf.diagram.ad.edit.helpers.ActivityParameterNodeEditHelperAdvice">
-            <specializes id="org.eclipse.epf.diagram.ad.ActivityParameterNode_1009"/>
-            <param name="semanticHint" value="1012"/>
-         </specializationType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/uml2/2.1.0/UML">
-         <metamodelType
-               id="org.eclipse.epf.diagram.ad.ControlFlow_3001"
-               name="%element_type_control_flow"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="ControlFlow"
-               edithelper="org.eclipse.epf.diagram.ad.edit.helpers.ControlFlowEditHelper">
-            <param name="semanticHint" value="3001"/>
-         </metamodelType>
-      </metamodel>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypeBindings">
-      <clientContext id="ADClientContext">
-         <enablement>
-            <test
-               property="org.eclipse.gmf.runtime.emf.core.editingDomain"
-               value="org.eclipse.epf.diagram.EditingDomain"/>
-         </enablement>
-      </clientContext> 
-      <binding context="ADClientContext">
-         <elementType ref="org.eclipse.epf.diagram.ad.Activity_79"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.ActivityPartition_2001"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.ActivityFinalNode_1001"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.MergeNode_1002"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.ForkNode_1003"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.InitialNode_1004"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.DecisionNode_1005"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.JoinNode_1006"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.StructuredActivityNode_1007"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.ActivityPartition_1008"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.ActivityParameterNode_1009"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.StructuredActivityNode_1010"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.StructuredActivityNode_1011"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.ActivityParameterNode_1012"/>
-         <elementType ref="org.eclipse.epf.diagram.ad.ControlFlow_3001"/>
-         <advice ref="org.eclipse.gmf.runtime.diagram.core.advice.notationDepdendents"/>
-         <elementType pattern=".*"/>
-      </binding>
-   </extension>
-   <extension
-         point="org.eclipse.epf.library.edit.nestedCommandProviders">
-      <nestedCommandProvider
-            class="org.eclipse.epf.diagram.ad.commands.NestedCommandProvider">
-      </nestedCommandProvider>
-   </extension>
-</plugin>
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/ADImages.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/ADImages.java
deleted file mode 100644
index e8b8a50..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/ADImages.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class ADImages {
-	public static final String ELCL16 = "full/elcl16/"; //$NON-NLS-1$
-	public static final String DLCL16 = "full/dlcl16/"; //$NON-NLS-1$
-	public static final String ETOOL16 = "full/etool16/"; //$NON-NLS-1$
-	public static final String DTOOL16 = "full/dtool16/"; //$NON-NLS-1$
-	
-	
-	public static final String IMG_PATH_EDITOR = ETOOL16 + "ADEditor.gif"; //$NON-NLS-1$	
-
-	public static final String DISABLED_IMG_PATH_EDITOR = DTOOL16 + "ADEditor.gif"; //$NON-NLS-1$	
-	
-	public static final ImageDescriptor DISABLED_IMG_DESC_EDITOR = ActivityDiagramEditorPlugin
-			.getDefault().getImageDescriptor(DISABLED_IMG_PATH_EDITOR);		
-	
-	public static final ImageDescriptor IMG_DESC_EDITOR = ActivityDiagramEditorPlugin
-			.getDefault().getImageDescriptor(IMG_PATH_EDITOR);		
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/ActivityDiagramPlugin.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/ActivityDiagramPlugin.java
deleted file mode 100644
index f85a100..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/ActivityDiagramPlugin.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class ActivityDiagramPlugin extends AbstractPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.diagram.ad"; //$NON-NLS-1$
-
-	// The shared instance
-	private static ActivityDiagramPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public ActivityDiagramPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static ActivityDiagramPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/commands/NestedCommandProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/commands/NestedCommandProvider.java
deleted file mode 100644
index 8d385e2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/commands/NestedCommandProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.commands;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.library.edit.command.INestedCommandProvider;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.util.TypeConverter.TypeConversionCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.ActivityNode;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class NestedCommandProvider implements INestedCommandProvider {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.INestedCommandProvider#createNestedCommand(org.eclipse.emf.common.command.Command)
-	 */
-	public Command createNestedCommand(Command command) {
-		if(command instanceof TypeConversionCommand) {
-			return createNestedCommandForTypeConversion(command);
-		}
-		return null;
-	}
-
-	private Command createNestedCommandForTypeConversion(Command command) {
-		// change type of activity node in diagram
-		//
-		Collection<?> result = command.getResult();
-		Activity activity = null;
-		if(!result.isEmpty()) {
-			Object e = result.iterator().next();
-			if(e instanceof Activity) {
-				activity = (Activity) e;
-			}
-			else {
-				return null;
-			}
-		}
-		if(activity != null) {
-			Process proc = TngUtil.getOwningProcess(activity);
-			if(proc != null) {
-				DiagramManager mgr = DiagramManager.getInstance(proc, this);
-				try {
-					String newType = BridgeHelper.getType(activity);					
-					List<Diagram> diagrams = mgr.getDiagrams(activity.getSuperActivities(), IDiagramManager.ACTIVITY_DIAGRAM);
-					SetTypeCommand cmd = new SetTypeCommand();
-					for (Diagram diagram : diagrams) {
-						org.eclipse.uml2.uml.Activity umlAct = (org.eclipse.uml2.uml.Activity) diagram.getElement();
-						for (ActivityNode node : umlAct.getNodes()) {
-							String uriStr = BridgeHelper.getEAnnotationDetail(node, BridgeHelper.UMA_URI);
-							if(uriStr != null) {
-								URI uri = URI.createURI(uriStr);
-								String guid = uri.fragment();
-								if(activity.getGuid().equals(guid)) {
-									View view = BridgeHelper.getView(diagram, node);
-									cmd.prepare(view, node, newType);
-								}
-							}
-						}
-					}
-					if(cmd.canExecute()) {
-						return cmd;
-					}
-				} catch (CoreException e) {
-					DiagramCorePlugin.getDefault().getLogger().logError(e);
-				}
-				finally {
-					mgr.removeConsumer(this);
-				}
-			}
-		}
-		return null;
-	}
-
-	public Command createRelatedObjects(Collection createdElements,
-			Command createCommand) {
-		return null;
-	}
-
-	public Command removeRelatedObjects(Collection deletedElements,
-			Command deleteCommand) {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/commands/SetTypeCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/commands/SetTypeCommand.java
deleted file mode 100644
index 5b4ce4d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/commands/SetTypeCommand.java
+++ /dev/null
@@ -1,245 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.commands;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class SetTypeCommand extends org.eclipse.emf.common.command.AbstractCommand implements
-		IResourceAwareCommand {
-	private Map<EModelElement, String> elementToNewTypeMap = new HashMap<EModelElement, String>();
-	private Map<EModelElement, String> elementToOldTypeMap;
-	private Map<View, String> viewToNewTypeMap = new HashMap<View, String>();
-	private Map<View, String> viewToOldTypeMap;
-
-	public Collection<Resource> getModifiedResources() {
-		HashSet<Resource> modifiedResources = new HashSet<Resource>();
-		for (EModelElement e : elementToNewTypeMap.keySet()) {
-			Resource resource = e.eResource();
-			if(resource != null) {
-				modifiedResources.add(resource);
-			}
-		}
-		return modifiedResources;
-	}
-
-	public void execute() {
-		if(elementToOldTypeMap == null) {
-			elementToOldTypeMap = new HashMap<EModelElement, String>();
-		}
-		else {
-			elementToOldTypeMap.clear();
-		}
-		for (Map.Entry<EModelElement, String> entry : elementToNewTypeMap.entrySet()) {
-			final EModelElement e = entry.getKey();
-			final String type = entry.getValue();
-			try {
-				String oldType = BridgeHelper.getEAnnotationDetail(e, BridgeHelper.UMA_TYPE);
-				TxUtil.runInTransaction(e, new Runnable() {
-
-					public void run() {
-						BridgeHelper.addEAnnotationType(e, type);
-					}
-					
-				});
-				elementToOldTypeMap.put(e, oldType);
-			} catch (Exception ex) {
-				DiagramCorePlugin.getDefault().getLogger().logError(ex);
-				throw new WrappedException(ex);
-			}
-		}
-		if(!viewToNewTypeMap.isEmpty()) {
-			if(viewToOldTypeMap == null) {
-				viewToOldTypeMap = new HashMap<View, String>();
-			}
-			else {
-				viewToOldTypeMap.clear();
-			}
-			for (Map.Entry<View, String> entry : viewToNewTypeMap.entrySet()) {
-				final View view = entry.getKey();
-				final String newType = entry.getValue();
-				final String oldType = view.getType();
-				try {
-					TxUtil.runInTransaction(view, new Runnable() {
-
-						public void run() {
-							String newNameType = String.valueOf(getViewNameType(Integer.parseInt(newType)));
-							String oldNameType = String.valueOf(getViewNameType(Integer.parseInt(oldType)));
-							view.setType(newType);
-							// set new type for node names
-							//
-							for (Iterator iterator = view.getChildren().iterator(); iterator
-									.hasNext();) {
-								View child = (View) iterator.next();
-								if(child.getType().equals(oldNameType)) {
-									child.setType(newNameType);
-								}
-							}
-						}
-						
-					});
-					viewToOldTypeMap.put(view, oldType);
-				} catch (Exception e) {
-					DiagramCorePlugin.getDefault().getLogger().logError(e);
-					throw new WrappedException(e);
-				}
-			}
-		}
-	}
-	
-	@Override
-	public void undo() {
-		if (elementToOldTypeMap != null && !elementToOldTypeMap.isEmpty()) {
-			for (Map.Entry<EModelElement, String> entry : elementToOldTypeMap
-					.entrySet()) {
-				final EModelElement e = entry.getKey();
-				final String type = entry.getValue();
-				try {
-					TxUtil.runInTransaction(e, new Runnable() {
-
-						public void run() {
-							BridgeHelper.addEAnnotationType(e, type);
-						}
-						
-					});
-				} catch (Exception ex) {
-					DiagramCorePlugin.getDefault().getLogger().logError(ex);
-					throw new WrappedException(ex);
-				}
-			}
-			elementToOldTypeMap.clear();
-		}
-		if(viewToOldTypeMap != null && !viewToOldTypeMap.isEmpty()) {
-			for (Map.Entry<View, String> entry : viewToOldTypeMap.entrySet()) {
-				final View view = entry.getKey();
-				final String oldType = entry.getValue();
-				try {
-					TxUtil.runInTransaction(view, new Runnable() {
-
-						public void run() {
-							String newNameType = String.valueOf(getViewNameType(Integer.parseInt(view.getType())));
-							String oldNameType = String.valueOf(getViewNameType(Integer.parseInt(oldType)));
-							view.setType(oldType);
-							// restore old type for node names
-							//
-							for (Iterator iterator = view.getChildren().iterator(); iterator
-									.hasNext();) {
-								View child = (View) iterator.next();
-								if(child.getType().equals(newNameType)) {
-									child.setType(oldNameType);
-								}
-							}
-						}
-						
-					});
-				} catch (Exception e) {
-					DiagramCorePlugin.getDefault().getLogger().logError(e);
-					throw new WrappedException(e);
-				}
-			}
-			viewToOldTypeMap.clear();
-		}
-	}
-
-	public void redo() {
-		execute();
-	}
-	
-	@Override
-	protected boolean prepare() {
-		return !elementToNewTypeMap.isEmpty();
-	}
-
-	public void prepare(View view, EModelElement e, String type) {
-		elementToNewTypeMap.put(e, type);
-		int viewType = getViewType(type);
-		if(viewType != -1) {
-			viewToNewTypeMap .put(view, String.valueOf(viewType));
-		}
-	}
-	
-	@Override
-	public void dispose() {
-		if(elementToNewTypeMap != null) {
-			elementToNewTypeMap.clear();
-		}
-		if(elementToOldTypeMap != null) {
-			elementToOldTypeMap.clear();
-		}
-		if(viewToNewTypeMap != null) {
-			viewToNewTypeMap.clear();
-		}
-		if(viewToOldTypeMap != null) {
-			viewToOldTypeMap.clear();
-		}
-	}
-	
-	public static int getViewType(String elementType) {
-		if(BridgeHelper.UMA_ACTIVITY.equals(elementType)) {
-			return StructuredActivityNodeEditPart.VISUAL_ID;
-		}
-		else if(BridgeHelper.UMA_PHASE.equals(elementType)) {
-			return StructuredActivityNode2EditPart.VISUAL_ID;
-		}
-		else if(BridgeHelper.UMA_ITERATION.equals(elementType)) {
-			return StructuredActivityNode3EditPart.VISUAL_ID;
-		}
-		else if(BridgeHelper.UMA_MILESTONE.equals(elementType)) {
-			return ActivityParameterNode2EditPart.VISUAL_ID;			
-		}
-		else if(BridgeHelper.UMA_TASK_DESCRIPTOR.equals(elementType)) {
-			return ActivityParameterNodeEditPart.VISUAL_ID;
-		}
-		return -1;
-	}	
-	
-	public static int getViewNameType(int viewType) {
-		switch(viewType) {
-		case StructuredActivityNodeEditPart.VISUAL_ID:
-			return StructuredActivityNodeNameEditPart.VISUAL_ID;
-		case StructuredActivityNode2EditPart.VISUAL_ID:
-			return StructuredActivityNodeName2EditPart.VISUAL_ID;
-		case StructuredActivityNode3EditPart.VISUAL_ID:
-			return StructuredActivityNodeName3EditPart.VISUAL_ID;
-		case ActivityParameterNodeEditPart.VISUAL_ID:
-			return ActivityParameterNodeNameEditPart.VISUAL_ID;			
-		case ActivityParameterNode2EditPart.VISUAL_ID:
-			return ActivityParameterNodeName2EditPart.VISUAL_ID;
-		}
-		return -1;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/ActivityPartitionDestroyCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/ActivityPartitionDestroyCommand.java
deleted file mode 100644
index a6a4b8a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/ActivityPartitionDestroyCommand.java
+++ /dev/null
@@ -1,117 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.commands;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature.Setting;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.emf.core.util.CrossReferenceAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-
-/**
- * DestroyCommand to destroy ActivityPartition and all the elements inside the partitions.
- * @author Shashidhar Kannoori
- *
- */
-public class ActivityPartitionDestroyCommand extends DestroyElementCommand {
-
-	
-	private EditPart host;
-
-	/**
-	 * @param request
-	 */
-	public ActivityPartitionDestroyCommand(DestroyElementRequest request, EditPart host) {
-		super(request);
-		this.host = host;
-	}
-	
-	protected EObject getElementToDestroy() {
-		View view = (View) host.getModel();
-		EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
-		if (annotation != null) {
-			return view;
-		}
-		return super.getElementToDestroy();
-	}
-	
-	protected void tearDownIncomingReferences(EObject destructee) {
-		
-//		moveChildrensToParent(destructee);
-		
-		CrossReferenceAdapter crossReferencer = CrossReferenceAdapter
-				.getExistingCrossReferenceAdapter(destructee);
-		if (crossReferencer != null) {
-			Collection inverseReferences = crossReferencer
-					.getInverseReferences(destructee);
-			if (inverseReferences != null) {
-				int size = inverseReferences.size();
-				if (size > 0) {
-					Setting setting;
-					EReference eRef;
-					Setting[] settings = (Setting[]) inverseReferences
-							.toArray(new Setting[size]);
-					for (int i = 0; i < size; ++i) {
-						setting = settings[i];
-						eRef = (EReference) setting
-								.getEStructuralFeature();
-						if (eRef.isChangeable()
-								&& (eRef.isDerived() == false)
-								&& (eRef.isContainment() == false)
-								&& (eRef.isContainer() == false)) {
-//							EcoreUtil.remove(setting.getEObject());
-							EcoreUtil.remove(setting.getEObject(), eRef,
-									destructee);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private void moveChildrensToParent(EObject destructee) {
-		if(destructee instanceof ActivityPartition){
-			ActivityPartition partition = (ActivityPartition)destructee;
-			Activity activity = partition.getInActivity();
-			List nodes = partition.getNodes();
-			
-			for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-				ActivityNode node = (ActivityNode) iter.next();
-				activity.getNodes().add(node);
-				node.getInPartitions().remove(partition);
-				//iter.remove();
-			}
-			for (Iterator iter = partition.getEdges().iterator(); iter.hasNext();) {
-				ActivityEdge edge = (ActivityEdge) iter.next();
-				activity.getEdges().add(edge);
-				edge.getInPartitions().remove(partition);
-				//iter.remove();
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateActivityNodeInActivityPartition.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateActivityNodeInActivityPartition.java
deleted file mode 100644
index a6c0b48..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateActivityNodeInActivityPartition.java
+++ /dev/null
@@ -1,180 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.commands;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.gmf.runtime.emf.core.util.PackageUtil;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- *
- */
-public class CreateActivityNodeInActivityPartition extends CreateElementCommand {
-
-	
-
-	/**
-	 * @param request
-	 */
-	public CreateActivityNodeInActivityPartition(CreateElementRequest request) {
-		super(request);
-	}
-	
-	/**
-	 * 
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	};
-
-	/**
-	 * @modified
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		if(container instanceof ActivityPartition){
-			container = container.eContainer();
-		}
-		return container;
-	}
-	public boolean canExecute() {
-		return super.canExecute();
-	}
-	
-	/**
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand#doExecute(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.runtime.IAdaptable)
-	 * @modified
-	 */
-	protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		IStatus status = null;
-		status = super.doExecute(monitor, info);
-		EObject newElement = getNewElement();
-		
-		if (newElement instanceof ActivityNode) 
-		{
-			EObject obj = getOriginalContainer();
-			if (obj instanceof ActivityPartition) {
-				// set inpartition 
-				((ActivityNode) newElement).getInPartitions().add((ActivityPartition) obj);
-			}
-		}
-		return status;
-	}
-	
-	
-
-	/**
-	 * @custom
-	 */
-	private EObject getOriginalContainer()
-	{
-		return ((CreateElementRequest) getRequest()).getContainer();
-	}
-	
-	/**
-	 * Gets the containment feature for the new element.
-	 * 
-	 * @return the containment feature
-	 * @modified
-	 */
-	protected EReference getContainmentFeature() {
-
-		/**
-		 * The containment feature in which the new element will be created.
-		 */
-		EReference containmentFeature=null;
-		if (containmentFeature == null) {
-			EClass classToEdit = getEClassToEdit();
-
-			if (classToEdit != null) {
-				IElementType type = getElementType();
-
-				if (type != null && type.getEClass() != null) {
-					containmentFeature = PackageUtil.findFeature(classToEdit,
-							type.getEClass());
-				}
-			}
-		}
-
-		return containmentFeature;
-	}
-	
-	@Override
-	protected EObject doDefaultElementCreation() {
-		// TODO Auto-generated method stub
-		EObject newElement = super.doDefaultElementCreation();
-		if(newElement instanceof StructuredActivityNode
-				|| newElement instanceof ActivityParameterNode){
-			if (newElement != null) {
-				BridgeHelper.setDefaultName((ActivityNode)newElement);
-			}
-		}
-		CreateElementRequest request = getCreateRequest();
-		
-		if(UMLElementTypes.StructuredActivityNode_1007 == request.getElementType()){
-			if (newElement != null) {
-				UMLElementTypes.Initializers.StructuredActivityNode_1007
-						.init(newElement);
-			}
-		}else if(UMLElementTypes.StructuredActivityNode_1010 == request
-						.getElementType()){
-			if (newElement != null) {
-				UMLElementTypes.Initializers.StructuredActivityNode_1010
-						.init(newElement);
-			}
-		}else if(UMLElementTypes.StructuredActivityNode_1011 == request
-						.getElementType()){
-			if (newElement != null) {
-				UMLElementTypes.Initializers.StructuredActivityNode_1011
-						.init(newElement);
-			}
-		}else if(UMLElementTypes.ActivityParameterNode_1009 == request
-						.getElementType()){
-			if (newElement != null) {
-				UMLElementTypes.Initializers.ActivityParameterNode_1009
-						.init(newElement);
-			}
-		}else if(UMLElementTypes.ActivityParameterNode_1012 == request
-						.getElementType()){
-			if (newElement != null) {
-				UMLElementTypes.Initializers.ActivityParameterNode_1012
-						.init(newElement);
-			}
-		}
-		
-		return newElement;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateIncomingControlFlowCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateIncomingControlFlowCommand.java
deleted file mode 100644
index cf1b5c8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateIncomingControlFlowCommand.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- *
- */
-public class CreateIncomingControlFlowCommand extends CreateRelationshipCommand {
-
-	/**
-	 * 
-	 * @param request
-	 * @param element
-	 */
-	public CreateIncomingControlFlowCommand(CreateRelationshipRequest request,
-			EObject element) {
-		super(request);
-		setElementToEdit(element);
-	}
-	/**
-	 * @param request
-	 */
-	public CreateIncomingControlFlowCommand(CreateRelationshipRequest request) {
-		super(request);
-		// TODO Auto-generated constructor stub
-	}
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-	
-	public boolean canExecute() {
-//		if(getSource() == null)
-//			return false;
-//		
-//		if (getEClassToEdit() == null) {
-//			return false;
-//		}
-//
-//		if (getContainmentFeature() != null) {
-//			EClassifier eClassifier = getContainmentFeature().getEType();
-//			boolean result = true;
-//
-//			if (eClassifier instanceof EClass) {
-//				result = ((EClass) eClassifier).isSuperTypeOf(getElementType()
-//						.getEClass());
-//			}
-//
-//			result = result
-//					&& PackageUtil.canReference(getEClassToEdit(),
-//							getContainmentFeature(), getElementType()
-//									.getEClass());
-//
-//			return result;
-//		}
-//		return false;
-		return super.canExecute();
-	}
-	protected EObject doDefaultElementCreation() {
-		ControlFlow newElement = (ControlFlow) super.doDefaultElementCreation();
-		if (newElement != null) {
-			newElement.setTarget((ActivityNode) getTarget());
-			newElement.setSource((ActivityNode) getSource());
-		}
-		return newElement;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateOutgoingControlFlowCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateOutgoingControlFlowCommand.java
deleted file mode 100644
index 3684760..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/commands/CreateOutgoingControlFlowCommand.java
+++ /dev/null
@@ -1,91 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gmf.runtime.emf.core.util.PackageUtil;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- *
- */
-public class CreateOutgoingControlFlowCommand extends CreateRelationshipCommand {
-
-	/**
-	 * 
-	 * @param request
-	 * @param element
-	 */
-	public CreateOutgoingControlFlowCommand(CreateRelationshipRequest request,
-			EObject element) {
-		super(request);
-		setElementToEdit(element);
-	}
-	/**
-	 * @param request
-	 */
-	public CreateOutgoingControlFlowCommand(CreateRelationshipRequest request) {
-		super(request);
-		// TODO Auto-generated constructor stub
-	}
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivityNode();
-	}
-	
-	public boolean canExecute() {
-		if(getSource() == null)
-			return false;
-		
-		if (getEClassToEdit() == null) {
-			return false;
-		}
-
-		if (getContainmentFeature() != null) {
-			EClassifier eClassifier = getContainmentFeature().getEType();
-			boolean result = true;
-
-			if (eClassifier instanceof EClass) {
-				result = ((EClass) eClassifier).isSuperTypeOf(getElementType()
-						.getEClass());
-			}
-
-			result = result
-					&& PackageUtil.canReference(getEClassToEdit(),
-							getContainmentFeature(), getElementType()
-									.getEClass());
-
-			return result;
-		}
-		return false;
-		//return super.canExecute();
-	}
-	
-	protected EObject doDefaultElementCreation() {
-		// TODO: Resolve the source and target properly.
-		ControlFlow newElement = (ControlFlow) super.doDefaultElementCreation();
-		if (newElement != null) {
-			newElement.setTarget((ActivityNode) getTarget());
-			newElement.setSource((ActivityNode) getSource());
-		}
-		return newElement;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/BreakdownElementNodeFigure.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/BreakdownElementNodeFigure.java
deleted file mode 100644
index 40cfc83..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/BreakdownElementNodeFigure.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.figures;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-
-/**
- * Customized figure for the BreakdownElement figures to show overlapped portion. 
- * @author Shashidhar Kannoori
- */
-public class BreakdownElementNodeFigure extends RectangleFigure {
-
-	/**
-	 * 
-	 */
-	public BreakdownElementNodeFigure() {
-		this.setOutline(false);
-		this.setOpaque(false);
-		createContents();
-	}
-
-	/**
-	 * @modified
-	 */
-	private void createContents() {
-		org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();
-		fig_0.setText(DiagramCoreResources.ActivityDiagram_New_Iteration);
-
-		DiagramCoreUtil.setLabelProperties(fig_0);
-
-		setFigureNodeNameFigure(fig_0);
-
-		Object layData0 = null;
-
-		this.add(fig_0, layData0);
-	}
-
-	/**
-	 * @generated
-	 */
-	private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNodeNameFigure;
-
-	/**
-	 * @generated
-	 */
-	public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNodeNameFigure() {
-		return fNodeNameFigure;
-	}
-
-	/**
-	 * @generated
-	 */
-	private void setFigureNodeNameFigure(
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig) {
-		fNodeNameFigure = fig;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean myUseLocalCoordinates = false;
-
-	/**
-	 * @generated
-	 */
-	protected boolean useLocalCoordinates() {
-		return myUseLocalCoordinates;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-		myUseLocalCoordinates = useLocalCoordinates;
-	}
-
-	@Override
-	public void paintFigure(Graphics graphics) {
-		if(isOpaque())
-			super.paintFigure(graphics);
-		return;
-	}	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/DecisionNodeFigure.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/DecisionNodeFigure.java
deleted file mode 100644
index a766583..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/DecisionNodeFigure.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.figures;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.IPolygonAnchorableFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-
-/**
- * @author Shashidhar Kannoori
- * Adopted from GMF's GeoShapes
- */
-public class DecisionNodeFigure extends DefaultSizeNodeFigure implements
-		IPolygonAnchorableFigure {
-
-	private int spacing;
-
-	/**
-	 * Constructor create a decision figure
-	 * 
-	 */
-	public DecisionNodeFigure(int width, int height, int spacing) {
-		super(width, height);
-		this.spacing = spacing;
-		createFigure(width, height);
-	}
-	/**
-	 * @param defSize
-	 */
-	public DecisionNodeFigure(Dimension defSize) {
-		super(defSize);
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param width
-	 * @param height
-	 */
-	public DecisionNodeFigure(int width, int height) {
-		super(width, height);
-		// TODO Auto-generated constructor stub
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.draw2d.ui.figures.IPolygonAnchorableFigure#getPolygonPoints()
-	 */
-	public PointList getPolygonPoints() {
-		// TODO Auto-generated method stub
-		return getPoints();
-	}
-	protected void paintFigure(Graphics g) {
-		PointList points = getPointList(getBounds().getCopy());
-		g.fillPolygon(points);
-		g.drawPolygon(points);
-	}
-	
-	/**
-	 * This method is used to compute the shapes polygon points.
-	 * This is currently based on the shapes bounding box.
-	 * 
-	 * @param rect the rectangle that the shape will fit in
-	 */
-	protected PointList getPointList(Rectangle rect) {
-		PointList points = new PointList();
-		
-		int halfX = rect.x + (rect.width / 2);
-		int halfY = rect.y + (rect.height / 2);
-		
-		Point p1 = new Point( halfX, rect.y );
-		Point p2 = new Point( rect.x + rect.width - 1, halfY );
-		Point p3 = new Point( halfX, rect.y + rect.height - 1 );
-		Point p4 = new Point( rect.x, halfY );
-		
-		points.addPoint( p1 );
-		points.addPoint( p2 );
-		points.addPoint( p3 );
-		points.addPoint( p4 );
-		points.addPoint( p1 );	
-		
-		return points;
-	}
-	
-	public IFigure getContentPane() {
-		return (IFigure) getChildren().get(0);
-	}
-	
-	public void createFigure(int width, int height){
-		setOpaque(true);
-		setLayoutManager(new StackLayout() {
-			public void layout(IFigure figure) {
-				Rectangle r = figure.getClientArea();
-				List children = figure.getChildren();
-				IFigure child;
-				Dimension d;
-				for (int i = 0; i < children.size(); i++) {
-					child = (IFigure)children.get(i);
-					d = child.getPreferredSize(r.width, r.height);
-					d.width = Math.min(d.width, r.width);
-					d.height = Math.min(d.height, r.height);
-					Rectangle childRect = new Rectangle(
-						r.x + (r.width - d.width)/2,
-						r.y + (r.height - d.height)/2,
-						d.width,
-						d.height);
-					child.setBounds(childRect);
-				}
-			}
-		});
-		
-		IFigure f = new Figure();
-		ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-		layout.setSpacing(spacing);
-		f.setLayoutManager(layout);
-		add(f);
-	}
-	
-	public PointList getPoints(){
-		return getPointList(getBounds().getCopy());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/EndNodeFigure.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/EndNodeFigure.java
deleted file mode 100644
index bac07a8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/EndNodeFigure.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.custom.figures;
-
-import org.eclipse.draw2d.Ellipse;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class EndNodeFigure extends Ellipse {
-
-	/**
-	 * Fills the ellipse.
-	 * 
-	 * @see org.eclipse.draw2d.Shape#fillShape(org.eclipse.draw2d.Graphics)
-	 */
-	protected void fillShape(Graphics graphics) {
-		Rectangle r = getBounds().getCopy();
-		r.shrink(r.width / 8, r.height / 8);
-		graphics.fillOval(r);
-	}
-
-	/**
-	 * Outlines the ellipse.
-	 * 
-	 * @see org.eclipse.draw2d.Shape#outlineShape(org.eclipse.draw2d.Graphics)
-	 */
-	protected void outlineShape(Graphics graphics) {
-		super.outlineShape(graphics);
-
-		Rectangle r = Rectangle.SINGLETON;
-		r.setBounds(getBounds());
-		r.shrink(getBounds().width / 8, getBounds().height / 8);
-		r.width--;
-		r.height--;
-		r.shrink((lineWidth - 1) / 2, (lineWidth - 1) / 2);
-		graphics.drawOval(r);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/RelativeXYAnchor.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/RelativeXYAnchor.java
deleted file mode 100644
index 3842857..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/figures/RelativeXYAnchor.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.custom.figures;
-
-import org.eclipse.draw2d.AbstractConnectionAnchor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * Provides relative anchor for a figure's location. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RelativeXYAnchor extends AbstractConnectionAnchor {
-
-	private Point relativeLocation;
-
-	public RelativeXYAnchor(IFigure figure, Point location, boolean isRelative) {
-		super(figure);
-		relativeLocation = location.getCopy();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.ConnectionAnchor#getLocation(Point)
-	 */
-	public Point getLocation(Point reference) {
-		Point p = relativeLocation.getCopy();
-		Rectangle r = getOwner().getBounds().getCopy();
-		p.performTranslate(r.x, r.y);
-		getOwner().translateToAbsolute(p);
-		return p;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.AbstractConnectionAnchor#getReferencePoint()
-	 */
-	public Point getReferencePoint() {
-		return getLocation(null);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityCreationEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityCreationEditPolicy.java
deleted file mode 100644
index eeae625..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityCreationEditPolicy.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.custom.policies;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class ActivityCreationEditPolicy extends CreationEditPolicy {
-	@Override
-	protected Command getReparentCommand(ChangeBoundsRequest request) {
-		Iterator editParts = request.getEditParts().iterator();
-		View container = (View)getHost().getAdapter(View.class);
-		EObject context = container == null ? null : ViewUtil.resolveSemanticElement(container);
-        CompositeCommand cc = new CompositeCommand(DiagramUIMessages.AddCommand_Label);
-		while ( editParts.hasNext() ) {
-			EditPart ep = (EditPart)editParts.next();
-			if ( ep instanceof LabelEditPart ) {
-				continue;
-			}
-			
-			View view = (View)ep.getAdapter(View.class);
-			if ( view == null ) {
-				continue;
-			}
-			EObject semantic = ViewUtil.resolveSemanticElement(view);
-			if ( semantic == null ) {
-				IGraphicalEditPart gep = (IGraphicalEditPart)ep;
-				if(shouldReparent(gep, request)) {
-					cc.compose(getReparentViewCommand(gep));
-				}
-			}
-			else if ( context != null && shouldReparent(semantic, context)) {
-				cc.compose(getReparentCommand((IGraphicalEditPart)ep));
-			}
-		}
-		return cc.isEmpty() ? null : new ICommandProxy(cc.reduce());
-	}
-
-	protected boolean shouldReparent(IGraphicalEditPart ep, ChangeBoundsRequest request) {
-		// replace parent only if the view does not have any parent yet or the
-		// bounds are not inside the current parent figure
-		//
-		View view = (View) ep.getModel();
-		if(view.eContainer() != null) {
-			Point location = ep.getFigure().getBounds().getLocation().getTranslated(request.getMoveDelta());
-			IFigure parentFig = ((GraphicalEditPart)ep.getParent()).getFigure();
-			Rectangle parentBounds = parentFig.getBounds();	
-			return !parentBounds.contains(location);
-		}
-		else {
-			return true;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionCreationEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionCreationEditPolicy.java
deleted file mode 100644
index 67d1541..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionCreationEditPolicy.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.policies;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CreateCommand;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * CreationEditPolicy for ActivityPartition.
- * 
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- */
-public class ActivityPartitionCreationEditPolicy extends CreationEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy#getCreateCommand(org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest)
-	 * @modified
-	 */
-	protected Command getCreateCommand(CreateViewRequest request) {
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		CompositeTransactionalCommand cc = new CompositeTransactionalCommand(
-				editingDomain, DiagramUIMessages.AddCommand_Label);
-
-		Iterator descriptors = request.getViewDescriptors().iterator();
-
-		while (descriptors.hasNext()) {
-			CreateViewRequest.ViewDescriptor descriptor = (CreateViewRequest.ViewDescriptor) descriptors
-					.next();
-			View containerView = (View) getHost().getModel();
-//			while(containerView.getElement() instanceof ActivityPartition){
-//				containerView = (View)containerView.eContainer();
-//			}
-			CreateCommand createCommand = new CreateCommand(editingDomain,
-					descriptor, containerView);
-
-			cc.compose(createCommand);
-		}
-	return new ICommandProxy(cc.reduce());
-	}
-	
-	/** Return a command to reparent both the semantic and view elements. */
-	/**
-	 * return a command to reparent both the semantic and view elements. 
-	 * @param request the request
-	 * @return command
-	 */
-	protected Command getReparentCommand(ChangeBoundsRequest request) {
-		Iterator editParts = request.getEditParts().iterator();
-		View container = (View)getHost().getAdapter(View.class);
-		EObject context = container == null ? null : ViewUtil.resolveSemanticElement(container);
-        CompositeCommand cc = new CompositeCommand(DiagramUIMessages.AddCommand_Label);
-		while ( editParts.hasNext() ) {
-			EditPart ep = (EditPart)editParts.next();
-			if ( ep instanceof LabelEditPart ) {
-				continue;
-			}
-			
-			View view = (View)ep.getAdapter(View.class);
-			if ( view == null ) {
-				continue;
-			}
-			
-			EObject semantic = ViewUtil.resolveSemanticElement(view);
-			if ( semantic == null ) {
-				cc.compose(getReparentViewCommand((IGraphicalEditPart)ep));
-				cc.compose(adjustLocationCommand((IGraphicalEditPart)ep, request));
-			}
-			else if ( context != null && shouldReparent(semantic, context)) {
-				cc.compose(getReparentCommand((IGraphicalEditPart)ep));
-				cc.compose(adjustLocationCommand((IGraphicalEditPart)ep, request));
-			}
-		}
-		return cc.isEmpty() ? null : new ICommandProxy(cc.reduce());
-	}
-	
-	@Override
-	protected ICommand getReparentCommand(IGraphicalEditPart gep) {
-		CompositeCommand cc = new CompositeCommand(DiagramUIMessages.AddCommand_Label); 
-		View container = (View)getHost().getModel();
-		EObject context = ViewUtil.resolveSemanticElement(container);
-		View view = (View)gep.getModel();
-		EObject element = ViewUtil.resolveSemanticElement(view);
-
-        TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-            .getEditingDomain();
-        
-        //
-		// semantic
-		if ( element != null ) {
-			Command moveSemanticCmd =
-				getHost().getCommand(
-					new EditCommandRequestWrapper(
-						new MoveRequest(editingDomain, context, UMLPackage.eINSTANCE.getActivityPartition_Node(), element)));
-            
-              if (moveSemanticCmd == null) {
-                  return org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand.INSTANCE;
-              }
-			
-			cc.compose ( new CommandProxy(moveSemanticCmd) );
-		}
-		//
-		// notation
-		cc.compose(getReparentViewCommand(gep));
-		// in case of moving into partition we have to change the coordinates of element
-		return cc;
-	}
-
-	private ICommand adjustLocationCommand(IGraphicalEditPart child,
-			ChangeBoundsRequest request) {
-		if (child instanceof ShapeEditPart) {
-			Point location = request.getMoveDelta();
-			Point childLocation = child.getFigure().getBounds().getLocation();
-			int x = childLocation.x + location.x
-					- ((ActivityPartitionEditPart)getHost()).getLocation().x;
-			int y = childLocation.y + location.y
-					- ((ActivityPartitionEditPart)getHost()).getLocation().y;
-
-			ICommand boundsCommand = new SetBoundsCommand(
-					((ShapeEditPart) child).getEditingDomain(),
-					DiagramUIMessages.SetLocationCommand_Label_Resize, //$NON-NLS-1$
-					new EObjectAdapter((View) child.getModel()),
-					new Point(x, y));
-
-			return boundsCommand;
-		}
-		return null;
-	}
-	
-	static ICommand createAdjustLocationCommand(IGraphicalEditPart child,
-			ChangeBoundsRequest request, IGraphicalEditPart newParent) {
-		if (child instanceof ShapeEditPart) {
-			Point location = request.getMoveDelta();
-			Point newLocation = child.getFigure().getBounds().getLocation().getCopy().translate(location);
-//			Dimension diff = ((GraphicalEditPart) child.getParent()).getFigure().getBounds()
-//					.getLocation().getDifference(
-//							newParent.getFigure().getBounds().getLocation());
-//			newLocation.translate(diff);
-//			newParent.getFigure().translateFromParent(newLocation);
-			ICommand boundsCommand = new SetBoundsCommand(
-					((ShapeEditPart) child).getEditingDomain(),
-					DiagramUIMessages.SetLocationCommand_Label_Resize, //$NON-NLS-1$
-					new EObjectAdapter((View) child.getModel()),
-					newLocation);
-
-			return boundsCommand;
-		}
-		return null;				
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionDelegationEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionDelegationEditPolicy.java
deleted file mode 100644
index ecf183b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionDelegationEditPolicy.java
+++ /dev/null
@@ -1,166 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.custom.policies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.AbstractEditPolicy;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ContainerEditPolicy;
-
-/**
- * ActivityPartition delegates to its compartment edit policy
- *   
- */
-public class ActivityPartitionDelegationEditPolicy extends
-        AbstractEditPolicy {
-
-    private EditPart childEditPart;
-    private EditPolicy childEditPolicy;
-    private final String childViewID;
-    private final String editPolicyID;
-    
-    
-    public ActivityPartitionDelegationEditPolicy(String childId, String editPolicyId) {
-        childViewID = childId;
-        editPolicyID = editPolicyId;
-    }
-    
-
-   /**
-    * (non-Javadoc)
-    * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#activate()
-    */
-    public void activate() {
-        childEditPart =
-            ((IGraphicalEditPart)getHost()).getChildBySemanticHint(childViewID);
-        if (childEditPart == null) {
-            return;
-        }
-        childEditPolicy = childEditPart.getEditPolicy(editPolicyID);
-        childEditPolicy.setHost(childEditPart);
-        childEditPolicy.activate();
-    }
-
-  /**
-   * (non-Javadoc)
-   * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#deactivate()
-   */
-    public void deactivate() {
-        if (childEditPolicy == null) {
-            return;
-        }
-        childEditPolicy.deactivate();
-        childEditPart = null;
-        childEditPolicy = null;
-    }
-
-
-   /**
-    * 
-    */
-    public void eraseSourceFeedback(Request request) {
-        if (childEditPolicy == null) {
-            return;
-        }
-        childEditPolicy.eraseSourceFeedback(request);
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-     * @modified
-     */
-    public void eraseTargetFeedback(Request request) {
-        if (childEditPolicy == null) {
-            return;
-        }
-        childEditPolicy.eraseTargetFeedback(request);
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-     * @modified
-     */
-    public Command getCommand(Request request) {
-        if (childEditPolicy == null) {
-            return null;
-        }
-        if(childEditPolicy instanceof ContainerEditPolicy && 
-        		request instanceof ChangeBoundsRequest){
-        	return null;
-        }
-        return childEditPolicy.getCommand(request);
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-     * @modified
-     */
-    public EditPart getTargetEditPart(Request request) {
-        if (childEditPolicy == null) {
-            return null;
-        }
-        return childEditPolicy.getTargetEditPart(request);
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showSourceFeedback(org.eclipse.gef.Request)
-     * @modified
-     */
-    public void showSourceFeedback(Request request) {
-        if (childEditPolicy == null) {
-            return;
-        }
-        childEditPolicy.showSourceFeedback(request);
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-     * @modified
-     */
-    public void showTargetFeedback(Request request) {
-        if (childEditPolicy == null) {
-            return;
-        }
-        childEditPolicy.showTargetFeedback(request);
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#understandsRequest(org.eclipse.gef.Request)
-     * @modified
-     */
-    public boolean understandsRequest(Request req) {
-        if (childEditPart == null) {
-            activate();
-        }
-        if (childEditPolicy == null) {
-            return false;
-        }
-        return childEditPolicy.understandsRequest(req);
-    }
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionLayoutEditPolicy.java
deleted file mode 100644
index 9db590e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityPartitionLayoutEditPolicy.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.custom.policies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-
-/**
- * XYLayoutPolicy for ActivityPartition to handle the move of children.
- * @author Shashidhar Kannoori
- * @written
- */
-public class ActivityPartitionLayoutEditPolicy extends XYLayoutEditPolicy {
-
-	protected EditPolicy createChildEditPolicy(EditPart child) {
-		EditPolicy result = super.createChildEditPolicy(child);
-		if (result == null) {
-			return new ResizableShapeEditPolicy();
-		}
-		return result;
-	}
-	protected Command getMoveChildrenCommand(Request request) {
-        return super.getMoveChildrenCommand(request);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityXYLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityXYLayoutEditPolicy.java
deleted file mode 100644
index 7e38545..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/ActivityXYLayoutEditPolicy.java
+++ /dev/null
@@ -1,293 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.policies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.diagram.core.commands.AddCommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
-import org.eclipse.gmf.runtime.notation.Bounds;
-import org.eclipse.gmf.runtime.notation.LayoutConstraint;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * 
- */
-public class ActivityXYLayoutEditPolicy extends XYLayoutEditPolicy {
-
-	/**
-	 * 
-	 */
-	public ActivityXYLayoutEditPolicy() {
-	}
-
-	protected Command createAddCommand(EditPart child, Object constraint) {
-		Object parent  = child.getParent();		
-		if ((parent instanceof ActivityPartitionEditPart) &&
-			( child instanceof ShapeEditPart && constraint instanceof Rectangle)) {
-			Rectangle rect = (Rectangle) constraint;
-			IFigure parentFigure = ((ActivityPartitionEditPart)parent).getFigure();			
-			View view = (View) child.getModel();
-			boolean adjustLocationNeeded = ViewUtil
-					.resolveSemanticElement(view) != null
-					|| parentFigure.getBounds().contains(rect.getLocation());
-			if(adjustLocationNeeded) {
-				int x = rect.x - ((ActivityPartitionEditPart) parent).getLocation().x;
-				int y = rect.y - ((ActivityPartitionEditPart) parent).getLocation().y;
-
-				ICommand boundsCommand = 
-					new SetBoundsCommand(((ShapeEditPart) child).getEditingDomain(),
-							DiagramUIMessages.SetLocationCommand_Label_Resize,  //$NON-NLS-1$
-							new EObjectAdapter(view),
-									new Point(x, y)); 
-
-					return new ICommandProxy(boundsCommand);
-			}
-		}
-		
-		return super.createAddCommand(child, constraint);
-	}
-
-	protected Command getMoveChildrenCommand(Request request) {
-		return super.getMoveChildrenCommand(request);
-	}
-
-
-	protected Command createChangeConstraintCommand(EditPart child,
-			Object constraint) {
-		return super.createChangeConstraintCommand(child, constraint);
-	}
-
-
-	protected Command createChangeConstraintCommand(
-			ChangeBoundsRequest request, EditPart child, Object constraint) {
-		Command cmd = super.createChangeConstraintCommand(request, child,
-				constraint);
-		if (child instanceof ActivityPartitionEditPart) {
-			List list = getNodesInPartition((ActivityPartitionEditPart) child);
-			if (list != null && !list.isEmpty()) {
-				for (Iterator iter = list.iterator(); iter.hasNext();) {
-					EditPart element = (EditPart) iter.next();
-					if (element instanceof ShapeNodeEditPart) {
-						ChangeBoundsRequest req = new ChangeBoundsRequest(
-								REQ_RESIZE_CHILDREN);
-						req.setEditParts(element);
-						req.setMoveDelta(request.getMoveDelta());
-						req.setSizeDelta(request.getSizeDelta());
-						req.setLocation(request.getLocation());
-						req.setExtendedData(request.getExtendedData());
-						req.setResizeDirection(request.getResizeDirection());
-						cmd = cmd.chain(element.getParent().getCommand(req));
-					}
-				}
-			}
-		}else{
-			EditPart parent = child.getParent();
-			if(parent instanceof DiagramEditPart){
-				List children = ((DiagramEditPart)parent).getChildren();
-				for (Iterator iter = children.iterator(); iter.hasNext();) {
-					EditPart part = (EditPart) iter.next();
-					if(part instanceof ActivityPartitionEditPart){
-						Node view = (Node)part.getModel();
-						LayoutConstraint lConstaint = view.getLayoutConstraint();
-						if(lConstaint instanceof Bounds){
-							Rectangle partitionConstraint = ((ActivityPartitionEditPart)part).getFigure().getBounds();
-							if(constraint instanceof Rectangle){
-								if(partitionConstraint.contains((Rectangle)constraint)){
-									request.setType(RequestConstants.REQ_CREATE);
-									cmd = cmd.chain(part.getCommand(request));
-								}
-							}
-						}else{
-							if (ActivityDiagramEditorPlugin.getInstance().isDebugging()) {
-								System.out.println("LayoutConstraint: "+ lConstaint);
-							}
-						}
-					}
-				}
-			}
-		}
-		return cmd;
-	}
-	
-	
-	private static List getNodesInPartition(ActivityPartitionEditPart child) {
-		List nodes = new ArrayList();
-		ActivityPartition partition = (ActivityPartition)((Node)child.getModel()).getElement();
-		List list = partition.getNodes();
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			nodes.add(findEditPartyByElement(child.getParent(), element));
-		}
-		return nodes;
-	}
-	
-	private static EditPart findEditPartyByElement(EditPart parent,
-			Object element) {
-		List list = parent.getChildren();
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			EditPart editPart = (EditPart) iter.next();
-			if (((Node) editPart.getModel()).getElement() == element) {
-				return editPart;
-			}
-		}
-		return null;
-	}
-
-	@Override
-	protected Command getAddCommand(Request request) {
-		CompoundCommand command = new CompoundCommand();
-		command.setDebugLabel("Add in ConstrainedLayoutEditPolicy with Reparent if necessary");//$NON-NLS-1$
-		command.add(super.getAddCommand(request));
-		
-		IGraphicalEditPart childPart;
-		if(request instanceof ChangeBoundsRequest && request.getType() == REQ_ADD){
-			ChangeBoundsRequest changeRequest =(ChangeBoundsRequest)request; 
-			List editParts = changeRequest.getEditParts();
-			for (int i = 0; i < editParts.size(); i++) {
-				childPart = (IGraphicalEditPart)editParts.get(i);
-				IGraphicalEditPart parent = (IGraphicalEditPart)childPart.getParent();
-				if(parent instanceof ActivityPartitionEditPart){
-					Point point = childPart.getFigure().getBounds().getLocation().getCopy();
-					point.translate(changeRequest.getMoveDelta());
-					if(!parent.getFigure().getBounds().contains(point)){
-						command.add(getReparentCommand(childPart, parent, changeRequest));
-					}
-				}
-			}
-		}
-		return command.unwrap();
-//		return null;
-	}
-	
-	
-	protected Command getReparentCommand(IGraphicalEditPart gep, IGraphicalEditPart oldParent,
-			ChangeBoundsRequest changeRequest) {
-		CompositeCommand cc = new CompositeCommand(DiagramUIMessages.AddCommand_Label); 
-		View container = (View)getHost().getModel();
-		EObject context = ViewUtil.resolveSemanticElement(container);
-		View view = (View)gep.getModel();
-		EObject element = ViewUtil.resolveSemanticElement(view);
-
-        TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-            .getEditingDomain();
-        
-		if ( element != null ) {
-			cc.compose(new ReparentingElementsCommand(new MoveRequest(editingDomain, context, UMLPackage.eINSTANCE.getActivity_Node(), element),
-					element,view, oldParent));
-			cc.compose(new AddCommand(gep.getEditingDomain(), new EObjectAdapter(container),
-					  new EObjectAdapter(view)));
-			cc.compose(adjustLocationCommand(gep, changeRequest));
-		}
-		return cc.isEmpty() ? null : new ICommandProxy(cc.reduce());
-	}
-	
-	
-	public class ReparentingElementsCommand extends EditElementCommand{
-
-		private final EObject moveElement;
-		private IGraphicalEditPart oldParent;
-		private View view;
-		
-		public ReparentingElementsCommand(MoveRequest req, EObject element, View view, 
-				IGraphicalEditPart oldParent) {
-			this("reparent on move", element, req);
-			this.oldParent = oldParent;
-			this.view = view;
-		}
-		
-		protected ReparentingElementsCommand(String label, EObject elementToEdit, 
-				IEditCommandRequest request) {
-			super(label, elementToEdit, request);
-			this.moveElement = elementToEdit; 
-		}
-
-		@Override
-		protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-			View parentView = (View)getHost().getModel();
-			if(parentView.getElement() instanceof Activity){
-				if(moveElement instanceof ActivityNode){
-					View oldParentView = (View)oldParent.getModel();
-					((ActivityNode)moveElement).getInPartitions().remove(oldParentView.getElement());
-				}
-			}
-			return null;
-		}
-		@Override
-		public boolean canExecute() {
-			if(moveElement != null) return true;
-			return false;
-		}
-	}
-	
-	private ICommand adjustLocationCommand(IGraphicalEditPart child,
-			ChangeBoundsRequest request) {
-		if (child instanceof ShapeEditPart) {
-			Point location = request.getMoveDelta().getCopy();
-			Point childLocation = child.getFigure().getBounds().getLocation();
-			location.x+=childLocation.x;
-			location.y+=childLocation.y;
-			ICommand boundsCommand = new SetBoundsCommand(
-					((ShapeEditPart) child).getEditingDomain(),
-					DiagramUIMessages.SetLocationCommand_Label_Resize, //$NON-NLS-1$
-					new EObjectAdapter((View) child.getModel()),
-					location);
-
-			return boundsCommand;
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/OpenADEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/OpenADEditPolicy.java
deleted file mode 100644
index 4bd2882..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/custom/policies/OpenADEditPolicy.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.ad.custom.policies;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.bridge.NodeAdapter;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.OpenEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Mouse double click on StructuredActivityEditPart should open diagram. 
- * @author Shashidhar Kannoori
- *
- */
-public class OpenADEditPolicy extends OpenEditPolicy {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.editpolicies.OpenEditPolicy#getOpenCommand(org.eclipse.gef.Request)
-	 */
-	@Override
-	protected Command getOpenCommand(Request request) {
-		EditPart targetEditPart = getTargetEditPart(request);
-		if (targetEditPart instanceof IGraphicalEditPart) {
-			Node view = (Node) targetEditPart.getModel();
-
-			DiagramEditPart diagramEditPart = DiagramCoreUtil.getDiagramEditPart(targetEditPart);
-			Diagram diagram = (Diagram) diagramEditPart.getModel();
-			DiagramAdapter diagramAdapter = BridgeHelper
-					.getDiagramAdapter(diagram.getElement());
-			EObject element = view.getElement();
-			NodeAdapter adapter = BridgeHelper
-					.getNodeAdapter(element);
-			if (adapter != null && adapter.getElement() instanceof Activity) {
-				Object selectedObject = adapter.getWrapper();
-				if (selectedObject == null) {
-					selectedObject = adapter.getElement();
-				}
-				GraphicalViewer viewer = (GraphicalViewer) diagramEditPart
-						.getViewer();
-				if (viewer != null) {
-					DiagramEditDomain domain = (DiagramEditDomain) viewer
-							.getEditDomain();
-					IWorkbenchPart part = domain.getDiagramEditorPart();
-					if (part != null) {
-						DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
-								selectedObject,
-								diagramAdapter.getSuppression(),
-								IDiagramManager.ACTIVITY_DIAGRAM);
-						try{
-						DiagramEditorUtil
-								.openDiagramEditor(
-										part.getSite().getPage(),
-										input,
-										ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT,
-										new NullProgressMonitor());
-						}catch(Exception e){
-							
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityFinalNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityFinalNodeCreateCommand.java
deleted file mode 100644
index d902c11..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityFinalNodeCreateCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public ActivityFinalNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityParameterNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityParameterNodeCreateCommand.java
deleted file mode 100644
index 38c6b0f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityParameterNodeCreateCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public ActivityParameterNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject doDefaultElementCreation() {
-		ActivityParameterNode newElement = (ActivityParameterNode) super
-				.doDefaultElementCreation();
-		if (newElement != null
-				&& UMLElementTypes.ActivityParameterNode_1009 == ((CreateElementRequest) getRequest())
-						.getElementType()) {
-			UMLElementTypes.Initializers.ActivityParameterNode_1009
-					.init(newElement);
-		}
-		if (newElement != null
-				&& UMLElementTypes.ActivityParameterNode_1012 == ((CreateElementRequest) getRequest())
-						.getElementType()) {
-			UMLElementTypes.Initializers.ActivityParameterNode_1012
-					.init(newElement);
-		}
-		return newElement;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityPartitionCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityPartitionCreateCommand.java
deleted file mode 100644
index b530977..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ActivityPartitionCreateCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityPartitionCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ControlFlowCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ControlFlowCreateCommand.java
deleted file mode 100644
index 305f7aa..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ControlFlowCreateCommand.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ControlFlowCreateCommand extends CreateRelationshipCommand {
-
-	/**
-	 * @generated
-	 */
-	private StructuredActivityNode myContainer;
-
-	/**
-	 * @generated
-	 */
-	private ActivityNode mySource;
-
-	/**
-	 * @generated
-	 */
-	private ActivityNode myTarget;
-
-	/**
-	 * @generated
-	 */
-	public ControlFlowCreateCommand(CreateRelationshipRequest req,
-			StructuredActivityNode container, ActivityNode source,
-			ActivityNode target) {
-		super(req);
-		super.setElementToEdit(container);
-		myContainer = container;
-		mySource = source;
-		myTarget = target;
-	}
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNode getContainer() {
-		return myContainer;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getSource() {
-		return mySource;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getTarget() {
-		return myTarget;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getStructuredActivityNode();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setElementToEdit(EObject element) {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject doDefaultElementCreation() {
-		ControlFlow newElement = (ControlFlow) super.doDefaultElementCreation();
-		if (newElement != null) {
-			newElement.setTarget(myTarget);
-			newElement.setSource(mySource);
-		}
-		return newElement;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ControlFlowReorientCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ControlFlowReorientCommand.java
deleted file mode 100644
index f976c09..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ControlFlowReorientCommand.java
+++ /dev/null
@@ -1,239 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.core.util.DiagramCoreValidation;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.DecisionNode;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.JoinNode;
-import org.eclipse.uml2.uml.MergeNode;
-
-/**
- * @generated
- * @author Shashidhar Kannoori
- * @since 1.2
- */
-public class ControlFlowReorientCommand extends EditElementCommand {
-
-	/**
-	 * @generated
-	 */
-	private final int reorientDirection;
-
-	/**
-	 * @generated
-	 */
-	private final EObject oldEnd;
-
-	/**
-	 * @generated
-	 */
-	private final EObject newEnd;
-
-	private EditPart host;
-
-	/**
-	 * @generated
-	 */
-	public ControlFlowReorientCommand(ReorientRelationshipRequest request) {
-		super(request.getLabel(), request.getRelationship(), request);
-		reorientDirection = request.getDirection();
-		oldEnd = request.getOldRelationshipEnd();
-		newEnd = request.getNewRelationshipEnd();
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean canExecute() {
-		if (!(getElementToEdit() instanceof ControlFlow)) {
-			return false;
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
-			return canReorientSource();
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
-			return canReorientTarget();
-		}
-		return false;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean canReorientSource() {
-		if (!(oldEnd instanceof ActivityNode && newEnd instanceof ActivityNode)) {
-			return false;
-		}
-		ActivityNode target = getLink().getTarget();
-//		if (!(getLink().eContainer() instanceof StructuredActivityNode)) {
-//			return false;
-//		}
-//		StructuredActivityNode container = (StructuredActivityNode) getLink()
-//				.eContainer();
-//		return UMLBaseItemSemanticEditPolicy.LinkConstraints
-//				.canExistControlFlow_3001(container, getNewSource(), target);
-		if(!canConnect((ActivityNode)newEnd, target))
-			return false;
-		
-		if (newEnd instanceof MergeNode || newEnd instanceof JoinNode) {
-			ActivityNode join = (ActivityNode) newEnd;
-			List<ActivityEdge> list = join.getOutgoings();
-			if (list != null && list.size() >= 1) {
-				return false;
-			}
-		}
-		
-		return true;
-		
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean canReorientTarget() {
-		if (!(oldEnd instanceof ActivityNode && newEnd instanceof ActivityNode)) {
-			return false;
-		}
-		ActivityNode source = getLink().getSource();
-//		if (!(getLink().eContainer() instanceof StructuredActivityNode)) {
-//			return false;
-//		}
-//		StructuredActivityNode container = (StructuredActivityNode) getLink()
-//				.eContainer();
-//		return UMLBaseItemSemanticEditPolicy.LinkConstraints
-//				.canExistControlFlow_3001(container, source, getNewTarget());
-		
-		if(!canConnect(source, (ActivityNode)newEnd))
-			return false;
-		
-		if (newEnd instanceof DecisionNode || newEnd instanceof ForkNode) {
-			ActivityNode join = (ActivityNode) newEnd;
-			List<ActivityEdge> list = join.getIncomings();
-			if (list != null && list.size() >= 1) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,
-			IAdaptable info) throws ExecutionException {
-		if (!canExecute()) {
-			throw new ExecutionException(
-					"Invalid arguments in reorient link command"); //$NON-NLS-1$
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
-			return reorientSource();
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
-			return reorientTarget();
-		}
-		throw new IllegalStateException();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult reorientSource() throws ExecutionException {
-		getLink().setSource(getNewSource());
-		return CommandResult.newOKCommandResult(getLink());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult reorientTarget() throws ExecutionException {
-		getLink().setTarget(getNewTarget());
-		return CommandResult.newOKCommandResult(getLink());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ControlFlow getLink() {
-		return (ControlFlow) getElementToEdit();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ActivityNode getOldSource() {
-		return (ActivityNode) oldEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ActivityNode getNewSource() {
-		return (ActivityNode) newEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ActivityNode getOldTarget() {
-		return (ActivityNode) oldEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ActivityNode getNewTarget() {
-		return (ActivityNode) newEnd;
-	}
-	
-	/*
-	 * @modified
-	 */
-	public void setHost(EditPart host){
-		this.host = host;
-	}
-	
-	/*
-	 * 
-	 */
-	public EditPart getHost(){
-		return this.host;
-	}
-	
-	private boolean canConnect(ActivityNode source, ActivityNode target){
-		if (!(getLink().eContainer() instanceof Activity)) {
-			return false;
-		}
-		if(DiagramCoreValidation.isDuplicateRelationship(source, target))
-			return false;
-		if(getHost() != null){
-			if (DiagramCoreValidation.canConnect((EditPart) getHost(), source, 
-					target) != null)
-				return false;
-		}
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/DecisionNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/DecisionNodeCreateCommand.java
deleted file mode 100644
index e47206d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/DecisionNodeCreateCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class DecisionNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public DecisionNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ForkNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ForkNodeCreateCommand.java
deleted file mode 100644
index 35861a2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/ForkNodeCreateCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ForkNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public ForkNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/InitialNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/InitialNodeCreateCommand.java
deleted file mode 100644
index e5342b8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/InitialNodeCreateCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class InitialNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public InitialNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/JoinNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/JoinNodeCreateCommand.java
deleted file mode 100644
index ceab697..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/JoinNodeCreateCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class JoinNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public JoinNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/MergeNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/MergeNodeCreateCommand.java
deleted file mode 100644
index 3b988d4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/MergeNodeCreateCommand.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class MergeNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public MergeNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/StructuredActivityNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/StructuredActivityNodeCreateCommand.java
deleted file mode 100644
index 891f208..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/StructuredActivityNodeCreateCommand.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return UMLPackage.eINSTANCE.getActivity();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject doDefaultElementCreation() {
-		StructuredActivityNode newElement = (StructuredActivityNode) super
-				.doDefaultElementCreation();
-		if (newElement != null
-				&& UMLElementTypes.StructuredActivityNode_1011 == ((CreateElementRequest) getRequest())
-						.getElementType()) {
-			UMLElementTypes.Initializers.StructuredActivityNode_1011
-					.init(newElement);
-		}
-		if (newElement != null
-				&& UMLElementTypes.StructuredActivityNode_1010 == ((CreateElementRequest) getRequest())
-						.getElementType()) {
-			UMLElementTypes.Initializers.StructuredActivityNode_1010
-					.init(newElement);
-		}
-		if (newElement != null
-				&& UMLElementTypes.StructuredActivityNode_1007 == ((CreateElementRequest) getRequest())
-						.getElementType()) {
-			UMLElementTypes.Initializers.StructuredActivityNode_1007
-					.init(newElement);
-		}
-		return newElement;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/UMLReorientConnectionViewCommand.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/UMLReorientConnectionViewCommand.java
deleted file mode 100644
index ed7cccd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/commands/UMLReorientConnectionViewCommand.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.commands;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class UMLReorientConnectionViewCommand extends
-		AbstractTransactionalCommand {
-
-	/**
-	 * @generated
-	 */
-	private IAdaptable edgeAdaptor;
-
-	/**
-	 * @generated
-	 */
-	public UMLReorientConnectionViewCommand(
-			TransactionalEditingDomain editingDomain, String label) {
-		super(editingDomain, label, null);
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getAffectedFiles() {
-		View view = (View) edgeAdaptor.getAdapter(View.class);
-		if (view != null) {
-			return getWorkspaceFiles(view);
-		}
-		return super.getAffectedFiles();
-	}
-
-	/**
-	 * @generated
-	 */
-	public IAdaptable getEdgeAdaptor() {
-		return edgeAdaptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setEdgeAdaptor(IAdaptable edgeAdaptor) {
-		this.edgeAdaptor = edgeAdaptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult doExecuteWithResult(
-			IProgressMonitor progressMonitor, IAdaptable info) {
-		assert null != edgeAdaptor : "Null child in UMLReorientConnectionViewCommand"; //$NON-NLS-1$
-		Edge edge = (Edge) getEdgeAdaptor().getAdapter(Edge.class);
-		assert null != edge : "Null edge in UMLReorientConnectionViewCommand"; //$NON-NLS-1$
-
-		View tempView = edge.getSource();
-		edge.setSource(edge.getTarget());
-		edge.setTarget(tempView);
-
-		return CommandResult.newOKCommandResult();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityEditHelper.java
deleted file mode 100644
index 1ef1553..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class ActivityEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityFinalNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityFinalNodeEditHelper.java
deleted file mode 100644
index cb2d727..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityFinalNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityParameterNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityParameterNodeEditHelper.java
deleted file mode 100644
index b2bbace..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityParameterNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityParameterNodeEditHelperAdvice.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityParameterNodeEditHelperAdvice.java
deleted file mode 100644
index d7ae33e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityParameterNodeEditHelperAdvice.java
+++ /dev/null
@@ -1,20 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeEditHelperAdvice extends
-		AbstractEditHelperAdvice {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityPartitionEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityPartitionEditHelper.java
deleted file mode 100644
index 217daaa..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityPartitionEditHelper.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.emf.core.util.PackageUtil;
-import org.eclipse.gmf.runtime.emf.type.core.commands.MoveElementsCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
-
-/**
- * @generated
- */
-public class ActivityPartitionEditHelper extends UMLBaseEditHelper {
-	@Override
-	protected ICommand getMoveCommand(MoveRequest req) {
-		// TODO Auto-generated method stub
-		//		return super.getMoveCommand(req);
-		MoveElementsCommand cmd = new MoveElementsCommand(req) {
-
-			@Override
-			public boolean canExecute() {
-				// TODO Auto-generated method stub
-				//return super.canExecute();
-				EObject container = getTargetContainer();
-
-				if (container == null || getElementsToMove() == null
-						|| getElementsToMove().isEmpty()) {
-					return false;
-				}
-
-				for (Iterator i = getElementsToMove().keySet().iterator(); i
-						.hasNext();) {
-					EObject element = (EObject) i.next();
-					EReference feature = getTargetFeature(element);
-
-					if (feature == null
-							|| !container.eClass().getEAllReferences()
-									.contains(feature)) {
-						// If the target feature doesn't exist in the target container,
-						// don't allow the move.
-						return false;
-					}
-
-					// IF the element is already in the target container...
-					if (container.equals(element.eContainer())
-							&& feature == element.eContainmentFeature()) {
-						// Don't allow the reparenting
-						return false;
-					}
-
-					// IF the element is the parent of the target container...
-					if (EcoreUtil.isAncestor(element, getTargetContainer())) {
-						// Don't allow the reparenting
-						return false;
-					}
-
-					// IF the container can not contain the element...
-					//					if (!PackageUtil.canContain(getTargetContainer().eClass(),
-					//							feature, element.eClass(), false)) {
-					//						// Don't allow the reparenting
-					//						return false;
-					//					}
-				}
-
-				return true;
-			}
-
-		};
-		return cmd;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityPartitionEditHelperAdvice.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityPartitionEditHelperAdvice.java
deleted file mode 100644
index 571eb2d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ActivityPartitionEditHelperAdvice.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice;
-
-/**
- * @generated
- */
-public class ActivityPartitionEditHelperAdvice extends AbstractEditHelperAdvice {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ControlFlowEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ControlFlowEditHelper.java
deleted file mode 100644
index df73dc6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ControlFlowEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class ControlFlowEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/DecisionNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/DecisionNodeEditHelper.java
deleted file mode 100644
index 48cc33e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/DecisionNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class DecisionNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ForkNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ForkNodeEditHelper.java
deleted file mode 100644
index da52708..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/ForkNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class ForkNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/InitialNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/InitialNodeEditHelper.java
deleted file mode 100644
index 26dc909..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/InitialNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class InitialNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/JoinNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/JoinNodeEditHelper.java
deleted file mode 100644
index cce75be..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/JoinNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class JoinNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/MergeNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/MergeNodeEditHelper.java
deleted file mode 100644
index b428a2b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/MergeNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class MergeNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNode2EditHelperAdvice.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNode2EditHelperAdvice.java
deleted file mode 100644
index 4d58cae..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNode2EditHelperAdvice.java
+++ /dev/null
@@ -1,20 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice;
-
-/**
- * @generated
- */
-public class StructuredActivityNode2EditHelperAdvice extends
-		AbstractEditHelperAdvice {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNodeEditHelper.java
deleted file mode 100644
index 0565120..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeEditHelper extends UMLBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNodeEditHelperAdvice.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNodeEditHelperAdvice.java
deleted file mode 100644
index 692a095..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/StructuredActivityNodeEditHelperAdvice.java
+++ /dev/null
@@ -1,20 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelperAdvice;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeEditHelperAdvice extends
-		AbstractEditHelperAdvice {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/UMLBaseEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/UMLBaseEditHelper.java
deleted file mode 100644
index e096082..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/helpers/UMLBaseEditHelper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.helpers;
-
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelper;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-
-/**
- * @generated
- */
-public class UMLBaseEditHelper extends AbstractEditHelper {
-
-	/**
-	 * @generated
-	 */
-	public static final String EDIT_POLICY_COMMAND = "edit policy command"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getInsteadCommand(IEditCommandRequest req) {
-		ICommand epCommand = (ICommand) req.getParameter(EDIT_POLICY_COMMAND);
-		req.setParameter(EDIT_POLICY_COMMAND, null);
-		ICommand ehCommand = super.getInsteadCommand(req);
-		if (epCommand == null) {
-			return ehCommand;
-		}
-		if (ehCommand == null) {
-			return epCommand;
-		}
-		CompositeCommand command = new CompositeCommand(null);
-		command.add(epCommand);
-		command.add(ehCommand);
-		return command;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getCreateCommand(CreateElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getCreateRelationshipCommand(
-			CreateRelationshipRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getDestroyElementCommand(DestroyElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getDestroyReferenceCommand(DestroyReferenceRequest req) {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityEditPart.java
deleted file mode 100644
index 118238b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityEditPart.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.diagram.ad.custom.policies.ActivityCreationEditPolicy;
-import org.eclipse.epf.diagram.ad.custom.policies.ActivityXYLayoutEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityEditPart extends DiagramEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final String MODEL_ID = "AD"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 79;
-
-	/**
-	 * @generated
-	 */
-	public ActivityEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityItemSemanticEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new ActivityCanonicalEditPolicy());
-
-		//		 modified START
-		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new ActivityXYLayoutEditPolicy());
-		installEditPolicy(
-				EditPolicyRoles.CREATION_ROLE,
-				new ActivityCreationEditPolicy());
-		// modified END
-	}
-
-	@Override
-	protected void handleNotificationEvent(Notification event) {
-		if (NotationPackage.Literals.VIEW__VISIBLE.equals(event.getFeature())) {
-			Object notifier = event.getNotifier();
-			if (notifier == getModel())
-				refreshVisibility();
-			else if (event.getNotifier() instanceof Node) {
-				refreshChildren();
-				DiagramEditorUtil.refreshConnectionEditParts(this);
-			}
-		} else
-			super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * GMF and GEF is not handling connections visibility properly. 
-	 * This is work-around solution to handle connections visibility.  
-	 * Visibility of edges need to set first and then nodes. 
-	 */
-	private void refreshConnections() {
-		// TODO Auto-generated method stub
-		Diagram act = (Diagram) getModel();
-		List edges = act.getEdges();
-		for (Iterator iter = edges.iterator(); iter.hasNext();) {
-			Edge edge = (Edge) iter.next();
-			if (edge.isVisible()) {
-				ConnectionEditPart part = createOrFindConnection(edge);
-				if (part != null) {
-					if (part.getSource() == null) {
-						for (Iterator iter1 = getChildren().iterator(); iter1
-								.hasNext();) {
-							EditPart element = (EditPart) iter1.next();
-							Object model = element.getModel();
-							if (edge.getSource() == model) {
-								if (element instanceof GraphicalEditPart) {
-									if (((GraphicalEditPart) element)
-											.getFigure().isVisible()) {
-										part.setSource(element);
-									} else {
-										part.setSource(null);
-									}
-								}
-							}
-						}
-					}
-					if (part.getTarget() == null) {
-						for (Iterator iter1 = getChildren().iterator(); iter1
-								.hasNext();) {
-							EditPart element = (EditPart) iter1.next();
-							Object model = element.getModel();
-							if (edge.getTarget() == model) {
-								if (element instanceof GraphicalEditPart) {
-									if (((GraphicalEditPart) element)
-											.getFigure().isVisible()) {
-										part.setTarget(element);
-									} else {
-										part.setTarget(null);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		try {
-			for (Iterator iter = edges.iterator(); iter.hasNext();) {
-				Edge edge = (Edge) iter.next();
-				org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart part = (org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart) createOrFindConnection(edge);
-				if ((part.getSource() == null || part.getTarget() == null)
-						&& part.getFigure() != null) {
-					part.getFigure().setVisible(false);
-					part.getFigure().revalidate();
-					part.deactivate();
-				}
-			}
-		} catch (Exception e) {
-			if (ActivityDiagramEditorPlugin.getInstance().isDebugging()) {
-				ActivityDiagramEditorPlugin.getInstance().getLogger().logError(
-						"Error occured while refresh the connection: " + e);
-			}
-		}
-	}
-	
-	/**
-	 * Moves complete diagram children to given delta. 
-	 * @param int  (X-axis delta)
-	 * @param int  (Y-axis delta)
-	 * 
-	 */
-	public void moveFigure(int moveX, int moveY) {
-		for (Iterator iter = this.getChildren().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child instanceof GraphicalEditPart) {
-				GraphicalEditPart part = (GraphicalEditPart) child;
-				Rectangle bounds = part.getFigure().getBounds();
-				Rectangle r = new Rectangle(new Point(bounds.x + moveX,
-						bounds.y + moveY), bounds.getSize());
-
-				// also need to move the bend points
-//				List list = part.getSourceConnections();
-//				for (Iterator itor = list.iterator(); itor.hasNext();) {
-//					ControlFlowEditPart linkpart = (ControlFlowEditPart) itor.next();
-//					Link link = (Link) linkpart.getModel();
-//					if (link.getBendpoints().size() > 0) {
-//						PointList plist = ((PolylineConnection) linkpart
-//								.getFigure()).getPoints();
-//						List points = new ArrayList();
-//						for (int i = 1; i < plist.size() - 1; i++) {
-//							Point p = plist.getPoint(i);
-//							p = p.translate(new Point(moveX, moveY));
-//
-//							org.eclipse.draw2d.AbsoluteBendpoint bp = new org.eclipse.draw2d.AbsoluteBendpoint(
-//									p);
-//							points.add(bp);
-//						}
-//
-//						linkpart.getConnectionFigure().setRoutingConstraint(
-//								points);
-//					}
-//				}
-
-				this.setLayoutConstraint(part, part.getFigure(), r);
-
-			} else {
-				// System.out.println("Part not moved: " + child); //$NON-NLS-1$
-			}
-		}
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityFinalNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityFinalNodeEditPart.java
deleted file mode 100644
index 05810bc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityFinalNodeEditPart.java
+++ /dev/null
@@ -1,323 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.StackLayout;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityFinalNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityFinalNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityFinalNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLExtNodeLabelHostLayoutEditPolicy;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gef.editparts.LayerManager;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-import org.eclipse.gef.requests.CreateRequest;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.LineStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeEditPart extends AbstractBorderedShapeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1001;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public ActivityFinalNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityFinalNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				if (child instanceof IBorderItemEditPart) {
-					return new BorderItemSelectionEditPolicy();
-				}
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		EndNodeFigure figure = new EndNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EndNodeFigure getPrimaryShape() {
-		return (EndNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addBorderItem(IFigure borderItemContainer,
-			IBorderItemEditPart borderItemEditPart) {
-		if (borderItemEditPart instanceof ActivityFinalNodeNameEditPart) {
-			BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
-					PositionConstants.SOUTH);
-			locator.setBorderItemOffset(new Dimension(-20, -20));
-			borderItemContainer.add(borderItemEditPart.getFigure(), locator);
-		} else {
-			super.addBorderItem(borderItemContainer, borderItemEditPart);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected NodeFigure createNodePlate() {
-		return new DefaultSizeNodeFigure(getMapMode().DPtoLP(24), getMapMode()
-				.DPtoLP(24));
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createMainFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(ActivityFinalNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	public class EndNodeFigure extends
-			org.eclipse.epf.diagram.ad.custom.figures.EndNodeFigure {
-
-		/**
-		 * @modified
-		 */
-		public EndNodeFigure() {
-
-			LineStyle linestyle = (LineStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.LINE_STYLE);
-			if (linestyle != null
-					&& linestyle.getLineColor() != DiagramConstants.LINE_COLOR_EDEFAULT) {
-				this.setForegroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(linestyle.getLineColor())));
-			} else {
-				this
-						.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue);
-			}
-
-			FillStyle style = (FillStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.FILL_STYLE);
-			if (style != null
-					&& style.getFillColor() != DiagramConstants.FILL_COLOR_EDEFAULT) {
-				this.setBackgroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(style.getFillColor())));
-			} else {
-				this.setBackgroundColor(ENDNODEFIGURE_BACK
-
-				);
-			}
-			this.setPreferredSize(getMapMode().DPtoLP(24), getMapMode().DPtoLP(
-					24));
-			this.setSize(getMapMode().DPtoLP(24), getMapMode().DPtoLP(24));
-
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color ENDNODEFIGURE_BACK = new Color(null, 45, 85, 130);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		// TODO Auto-generated method stub
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		} else if (NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setBackgroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setBackgroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getLineStyle_LineColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setForegroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setForegroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle().isInstance(
-				notification.getNotifier()))
-			refreshFont();
-		else if (notification.getFeature() == NotationPackage.eINSTANCE
-				.getView_Element()
-				&& ((EObject) notification.getNotifier()) == getNotationView())
-			handleMajorSemanticChange();
-		else
-			super.handleNotificationEvent(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityFinalNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityFinalNodeNameEditPart.java
deleted file mode 100644
index a536775..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityFinalNodeNameEditPart.java
+++ /dev/null
@@ -1,618 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeNameEditPart extends LabelEditPart implements
-		ITextAwareEditPart, IBorderItemEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4001;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	static {
-		registerSnapBackPosition(UMLVisualIDRegistry
-				.getType(ActivityFinalNodeNameEditPart.VISUAL_ID), new Point(0,
-				0));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ActivityFinalNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	public IBorderItemLocator getBorderItemLocator() {
-		IFigure parentFigure = getFigure().getParent();
-		if (parentFigure != null && parentFigure.getLayoutManager() != null) {
-			Object constraint = parentFigure.getLayoutManager().getConstraint(
-					getFigure());
-			return (IBorderItemLocator) constraint;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshBounds() {
-		int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Width())).intValue();
-		int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Height())).intValue();
-		getBorderItemLocator()
-				.setConstraint(new Rectangle(x, y, width, height));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(IFigure figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIcon() {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.ActivityFinalNode_1001;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), UMLEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		IFigure label = createFigurePrim();
-		defaultText = getLabelTextHelper(label);
-		return label;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigurePrim() {
-		return new WrapLabel();
-	}
-
-	/**
-	 * TODO: Disables direct edit for now until the issue with duplicate labels is fixed
-	 */
-	@Override
-	public void performRequest(Request request) {
-		if (RequestConstants.REQ_DIRECT_EDIT != request.getType()) {
-        	super.performRequest(request);
-        }
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNode2EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNode2EditPart.java
deleted file mode 100644
index b92cce5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNode2EditPart.java
+++ /dev/null
@@ -1,299 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityParameterNode2ItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityParameterNode2EditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1012;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public ActivityParameterNode2EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityParameterNode2ItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		ActivityParameterNodeFigure figure = new ActivityParameterNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ActivityParameterNodeFigure getPrimaryShape() {
-		return (ActivityParameterNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof ActivityParameterNodeName2EditPart) {
-			((ActivityParameterNodeName2EditPart) childEditPart)
-					.setLabel(getPrimaryShape()
-							.getFigureActivityParameterNodeNameLabel());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(ActivityParameterNodeName2EditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ActivityParameterNodeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public ActivityParameterNodeFigure() {
-
-			this.setOutline(false);
-			this.setOpaque(false);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-
-			DiagramCoreUtil.setLabelProperties(fig_0);
-			setFigureActivityParameterNodeNameLabel(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fActivityParameterNodeNameLabel;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureActivityParameterNodeNameLabel() {
-			return fActivityParameterNodeNameLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureActivityParameterNodeNameLabel(WrapLabel fig) {
-			fActivityParameterNodeNameLabel = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-		@Override
-		public void paintFigure(Graphics graphics) {
-			if (isOpaque())
-				super.paintFigure(graphics);
-			return;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeEditPart.java
deleted file mode 100644
index 9a0e6b0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeEditPart.java
+++ /dev/null
@@ -1,300 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityParameterNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1009;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public ActivityParameterNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityParameterNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		ActivityParameterNodeFigure figure = new ActivityParameterNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ActivityParameterNodeFigure getPrimaryShape() {
-		return (ActivityParameterNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof ActivityParameterNodeNameEditPart) {
-			((ActivityParameterNodeNameEditPart) childEditPart)
-					.setLabel(getPrimaryShape()
-							.getFigureActivityParameterNodeNameLabel());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(ActivityParameterNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ActivityParameterNodeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public ActivityParameterNodeFigure() {
-
-			this.setOutline(false);
-			this.setOpaque(false);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-
-			DiagramCoreUtil.setLabelProperties(fig_0);
-			setFigureActivityParameterNodeNameLabel(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fActivityParameterNodeNameLabel;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureActivityParameterNodeNameLabel() {
-			return fActivityParameterNodeNameLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureActivityParameterNodeNameLabel(WrapLabel fig) {
-			fActivityParameterNodeNameLabel = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-		@Override
-		public void paintFigure(Graphics graphics) {
-			if (isOpaque())
-				super.paintFigure(graphics);
-			return;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeName2EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeName2EditPart.java
deleted file mode 100644
index 29e9731..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeName2EditPart.java
+++ /dev/null
@@ -1,620 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.ValidatingTextDirectEditManager;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeName2EditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4011;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public ActivityParameterNodeName2EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/milestone.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		if (DiagramCoreUtil.isReadOnly(this))
-			return false;
-		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.ActivityParameterNode_1012;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new ValidatingTextDirectEditManager(this,
-					TextDirectEditManager.getTextCellEditorClass(this),
-					UMLEditPartFactory.getTextCellEditorLocator(this)) {
-
-				@Override
-				protected void performDirectEdit() {
-					((ActivityParameterNodeName2EditPart) getEditPart())
-							.performDirectEdit();
-				}
-
-				@Override
-				protected String validate(String txt) {
-					return DiagramCoreUtil.validStringForBreakdownElements(
-							getEditPart(), txt);
-				}
-
-			});
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeNameEditPart.java
deleted file mode 100644
index ed715ee..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityParameterNodeNameEditPart.java
+++ /dev/null
@@ -1,620 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.ValidatingTextDirectEditManager;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeNameEditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4008;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public ActivityParameterNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/taskdescriptor.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		if (DiagramCoreUtil.isReadOnly(this))
-			return false;
-		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.ActivityParameterNode_1009;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new ValidatingTextDirectEditManager(this,
-					TextDirectEditManager.getTextCellEditorClass(this),
-					UMLEditPartFactory.getTextCellEditorLocator(this)) {
-
-				@Override
-				protected void performDirectEdit() {
-					((ActivityParameterNodeNameEditPart) getEditPart())
-							.performDirectEdit();
-				}
-
-				@Override
-				protected String validate(String txt) {
-					return DiagramCoreUtil.validStringForBreakdownElements(
-							getEditPart(), txt);
-				}
-
-			});
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartition2EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartition2EditPart.java
deleted file mode 100644
index ea99aa6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartition2EditPart.java
+++ /dev/null
@@ -1,318 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-
-import org.eclipse.draw2d.XYLayout;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartition2CanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartition2GraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartition2ItemSemanticEditPolicy;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class ActivityPartition2EditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 2001;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartition2EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityPartition2ItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		XYLayoutEditPolicy lep = new XYLayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = super.createChildEditPolicy(child);
-				if (result == null) {
-					return new ResizableShapeEditPolicy();
-				}
-				return result;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		ActivityPartitionFigure figure = new ActivityPartitionFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionFigure getPrimaryShape() {
-		return (ActivityPartitionFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof ActivityPartitionNameEditPart) {
-			((ActivityPartitionNameEditPart) childEditPart)
-					.setLabel(getPrimaryShape().getFigurePartitionLabelFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			nodeShape.setLayoutManager(new FreeformLayout() {
-
-				public Object getConstraint(IFigure figure) {
-					Object result = constraints.get(figure);
-					if (result == null) {
-						result = new Rectangle(0, 0, -1, -1);
-					}
-					return result;
-				}
-			});
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(ActivityPartitionNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ActivityPartitionFigure extends RectangleFigure {
-
-		/**
-		 * @generated
-		 */
-		public ActivityPartitionFigure() {
-
-			XYLayout myGenLayoutManager = new XYLayout();
-
-			this.setLayoutManager(myGenLayoutManager);
-
-			this.setForegroundColor(ColorConstants.black
-
-			);
-			this.setBackgroundColor(ACTIVITYPARTITIONFIGURE_BACK
-
-			);
-			this.setPreferredSize(getMapMode().DPtoLP(300), getMapMode()
-					.DPtoLP(600));
-			this.setSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));
-			this.setBorder(new LineBorder());
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-			WrapLabel fig_0 = new WrapLabel();
-
-			setFigurePartitionLabelFigure(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fPartitionLabelFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigurePartitionLabelFigure() {
-			return fPartitionLabelFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigurePartitionLabelFigure(WrapLabel fig) {
-			fPartitionLabelFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color ACTIVITYPARTITIONFIGURE_BACK = new Color(null,
-			255, 255, 255);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionEditPart.java
deleted file mode 100644
index 42fcc99..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionEditPart.java
+++ /dev/null
@@ -1,392 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.XYLayout;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.custom.policies.ActivityPartitionCreationEditPolicy;
-import org.eclipse.epf.diagram.ad.custom.policies.ActivityPartitionDelegationEditPolicy;
-import org.eclipse.epf.diagram.ad.custom.policies.ActivityPartitionLayoutEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionPartitionCampartmentItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ResizableShapeEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.LineStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class ActivityPartitionEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1008;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		//		super.createDefaultEditPolicies();
-		//		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-		//				new ActivityPartitionItemSemanticEditPolicy());
-		//		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-		//				new ActivityPartitionGraphicalNodeEditPolicy());
-		//		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-		//				new ActivityPartitionCanonicalEditPolicy());
-		//		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-		installEditPolicy(EditPolicyRoles.CREATION_ROLE,
-				new ActivityPartitionCreationEditPolicy());
-		super.createDefaultEditPolicies();
-		removeEditPolicy(EditPolicy.LAYOUT_ROLE);
-		installEditPolicy(
-				EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityPartitionPartitionCampartmentItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new ActivityPartitionGraphicalNodeEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new ActivityPartitionCanonicalEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new ActivityPartitionLayoutEditPolicy());
-		installEditPolicy(
-				EditPolicy.CONTAINER_ROLE,
-				new ActivityPartitionDelegationEditPolicy(
-						UMLVisualIDRegistry
-								.getType(ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID),
-						EditPolicy.CONTAINER_ROLE));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		XYLayoutEditPolicy lep = new XYLayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = super.createChildEditPolicy(child);
-				if (result == null) {
-					return new ResizableShapeEditPolicy();
-				}
-				return result;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		ActivityPartitionFigure figure = new ActivityPartitionFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionFigure getPrimaryShape() {
-		return (ActivityPartitionFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof ActivityPartitionName2EditPart) {
-			((ActivityPartitionName2EditPart) childEditPart)
-					.setLabel(getPrimaryShape().getFigurePartitionLabelFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			nodeShape.setLayoutManager(new FreeformLayout() {
-
-				public Object getConstraint(IFigure figure) {
-					Object result = constraints.get(figure);
-					if (result == null) {
-						result = new Rectangle(0, 0, -1, -1);
-					}
-					return result;
-				}
-			});
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(ActivityPartitionName2EditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ActivityPartitionFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public ActivityPartitionFigure() {
-
-			org.eclipse.draw2d.XYLayout myGenLayoutManager = new org.eclipse.draw2d.XYLayout();
-
-			this.setLayoutManager(myGenLayoutManager);
-
-			LineStyle linestyle = (LineStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.LINE_STYLE);
-			if (linestyle != null) {
-				this.setForegroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(linestyle.getLineColor())));
-			} else {
-				this
-						.setForegroundColor(org.eclipse.draw2d.ColorConstants.black);
-			}
-
-			FillStyle style = (FillStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.FILL_STYLE);
-			if (style != null) {
-				this.setBackgroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(style.getFillColor())));
-			} else {
-				this.setBackgroundColor(ACTIVITYPARTITIONFIGURE_BACK);
-			}
-			this.setPreferredSize(getMapMode().DPtoLP(300), getMapMode()
-					.DPtoLP(600));
-			this.setSize(getMapMode().DPtoLP(300), getMapMode().DPtoLP(600));
-			this.setBorder(new org.eclipse.draw2d.LineBorder());
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-			WrapLabel fig_0 = new WrapLabel();
-
-			setFigurePartitionLabelFigure(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fPartitionLabelFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigurePartitionLabelFigure() {
-			return fPartitionLabelFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigurePartitionLabelFigure(WrapLabel fig) {
-			fPartitionLabelFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-		@Override
-		public void paintFigure(Graphics graphics) {
-			if (isOpaque())
-				super.paintFigure(graphics);
-			return;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color ACTIVITYPARTITIONFIGURE_BACK = new Color(null,
-			255, 255, 255);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		// TODO Auto-generated method stub
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		} else if (NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setBackgroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setBackgroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getLineStyle_LineColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setForegroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setForegroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle().isInstance(
-				notification.getNotifier()))
-			refreshFont();
-		else if (notification.getFeature() == NotationPackage.eINSTANCE
-				.getView_Element()
-				&& ((EObject) notification.getNotifier()) == getNotationView())
-			handleMajorSemanticChange();
-		else
-			super.handleNotificationEvent(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionName2EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionName2EditPart.java
deleted file mode 100644
index ea55276..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionName2EditPart.java
+++ /dev/null
@@ -1,656 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Collections;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.transaction.RunnableWithResult;
-
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.AccessibleEditPart;
-
-import org.eclipse.gef.requests.DirectEditRequest;
-
-import org.eclipse.gef.tools.DirectEditManager;
-
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-
-import org.eclipse.swt.SWT;
-
-import org.eclipse.swt.accessibility.AccessibleEvent;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class ActivityPartitionName2EditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4007;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionName2EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIcon() {
-		EObject parserElement = getParserElement();
-		if (parserElement == null) {
-			return null;
-		}
-		return UMLElementTypes.getImage(parserElement.eClass());
-	
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.ActivityPartition_1008;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), UMLEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-		refreshBounds();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshBounds() {
-		int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Width())).intValue();
-		int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Height())).intValue();
-		Dimension size = new Dimension(width, height);
-		int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		Point loc = new Point(x, y);
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), new Rectangle(loc, size));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		}
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionNameEditPart.java
deleted file mode 100644
index 0d7a634..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionNameEditPart.java
+++ /dev/null
@@ -1,655 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Collections;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.transaction.RunnableWithResult;
-
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.AccessibleEditPart;
-
-import org.eclipse.gef.requests.DirectEditRequest;
-
-import org.eclipse.gef.tools.DirectEditManager;
-
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-
-import org.eclipse.swt.SWT;
-
-import org.eclipse.swt.accessibility.AccessibleEvent;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class ActivityPartitionNameEditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4006;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIcon() {
-		EObject parserElement = getParserElement();
-		if (parserElement == null) {
-			return null;
-		}
-		return UMLElementTypes.getImage(parserElement.eClass());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.ActivityPartition_2001;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), UMLEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-		refreshBounds();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshBounds() {
-		int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Width())).intValue();
-		int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Height())).intValue();
-		Dimension size = new Dimension(width, height);
-		int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		Point loc = new Point(x, y);
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), new Rectangle(loc, size));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		}
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionPartitionCampartment2EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionPartitionCampartment2EditPart.java
deleted file mode 100644
index 96f8fd0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionPartitionCampartment2EditPart.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionPartitionCampartment2CanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeCompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartment2EditPart extends
-		ShapeCompartmentEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 5002;
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionPartitionCampartment2EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	public String getCompartmentName() {
-		return "";	//$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure createFigure() {
-		ResizableCompartmentFigure result = (ResizableCompartmentFigure) super
-				.createFigure();
-		result.setTitleVisibility(false);
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(
-				EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy());
-		installEditPolicy(EditPolicyRoles.CREATION_ROLE,
-				new CreationEditPolicy());
-		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,
-				new DragDropEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new ActivityPartitionPartitionCampartment2CanonicalEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	//public IFigure createFigure() {
-	//	IFigure result = super.createFigure();
-	//	result.setBorder(new LineBorder());
-	//	return result;
-	//}
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshBounds();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification notification) {
-		super.handleNotificationEvent(notification);
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshBounds() {
-		int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Width())).intValue();
-		int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Height())).intValue();
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), new Rectangle(x, y, width, height));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setRatio(Double ratio) {
-		// nothing to do -- parent layout does not accept Double constraints as ratio
-		// super.setRatio(ratio); 
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionPartitionCampartmentEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionPartitionCampartmentEditPart.java
deleted file mode 100644
index 2b8de9d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ActivityPartitionPartitionCampartmentEditPart.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionPartitionCampartmentCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ActivityPartitionPartitionCampartmentItemSemanticEditPolicy;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeCompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ContainerNodeEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartmentEditPart extends
-		ShapeCompartmentEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 5001;
-
-	/**
-	 * @generated
-	 */
-	public ActivityPartitionPartitionCampartmentEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	public String getCompartmentName() {
-		return "";	//$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure createFigure() {
-		ResizableCompartmentFigure result = (ResizableCompartmentFigure) super
-				.createFigure();
-		result.setTitleVisibility(false);
-		return result;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(
-				EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityPartitionPartitionCampartmentItemSemanticEditPolicy());
-		installEditPolicy(EditPolicyRoles.CREATION_ROLE,
-				new CreationEditPolicy());
-		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,
-				new DragDropEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new ActivityPartitionPartitionCampartmentCanonicalEditPolicy());
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new ContainerNodeEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, new XYLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	//public IFigure createFigure() {
-	//	IFigure result = super.createFigure();
-	//	result.setBorder(new LineBorder());
-	//	return result;
-	//}
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshBounds();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification notification) {
-		super.handleNotificationEvent(notification);
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshBounds() {
-		int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Width())).intValue();
-		int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Height())).intValue();
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), new Rectangle(x, y, width, height));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setRatio(Double ratio) {
-		// nothing to do -- parent layout does not accept Double constraints as ratio
-		// super.setRatio(ratio); 
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ControlFlowEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ControlFlowEditPart.java
deleted file mode 100644
index 0bc1ebb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ControlFlowEditPart.java
+++ /dev/null
@@ -1,119 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.draw2d.Connection;
-
-import org.eclipse.draw2d.PolylineDecoration;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.epf.diagram.ad.edit.policies.ControlFlowItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.DiagramCoreValidation;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class ControlFlowEditPart extends ConnectionNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 3001;
-
-	/**
-	 * @generated
-	 */
-	public ControlFlowEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ControlFlowItemSemanticEditPolicy());
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected Connection createConnectionFigure() {
-
-		return new ControlFlowFigure();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ControlFlowFigure extends PolylineConnectionEx {
-
-		/**
-		 * @generated
-		 */
-		public ControlFlowFigure() {
-
-			setTargetDecoration(createTargetDecoration());
-		}
-
-		/**
-		 * @generated
-		 */
-		private PolylineDecoration createTargetDecoration() {
-			PolylineDecoration df = new PolylineDecoration();
-			// dispatchNext?
-
-			PointList pl = new PointList();
-			pl.addPoint(-1, 1);
-			pl.addPoint(0, 0);
-			pl.addPoint(-1, -1);
-			df.setTemplate(pl);
-			df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));
-
-			return df;
-		}
-
-	}
-
-	@Override
-	protected void refreshForegroundColor() {
-		// TODO Auto-generated method stub
-		super.refreshForegroundColor();
-	}
-
-	@Override
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		if (DiagramCoreValidation.checkDelete((Edge) getModel()) != null) {
-			this.disableEditMode();
-		}
-	}
-
-	@Override
-	protected void setForegroundColor(Color color) {
-		Color overrideColor = DiagramCoreUtil.getLinkOverrideColor((Edge) getModel());
-		super.setForegroundColor(overrideColor != null ? overrideColor : color);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ControlFlowNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ControlFlowNameEditPart.java
deleted file mode 100644
index 4cc7cbe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ControlFlowNameEditPart.java
+++ /dev/null
@@ -1,630 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.ConnectionLocator;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class ControlFlowNameEditPart extends LabelEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4012;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	static {
-		registerSnapBackPosition(UMLVisualIDRegistry
-				.getType(ControlFlowNameEditPart.VISUAL_ID), new Point(0, 40));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ControlFlowNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	public int getKeyPoint() {
-		return ConnectionLocator.MIDDLE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(IFigure figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		//		ImageDescriptor descriptor = ActivityDiagramEditorPlugin.getInstance()
-		//				.getItemImageDescriptor(getParserElement());
-		//		if (descriptor == null) {
-		//			descriptor = ImageDescriptor.getMissingImageDescriptor();
-		//		}
-		//		return descriptor.createImage();
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.ControlFlow_3001;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), UMLEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		IFigure label = createFigurePrim();
-		defaultText = getLabelTextHelper(label);
-		return label;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigurePrim() {
-		return new ControlFlowLabelFigure();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ControlFlowLabelFigure extends WrapLabel {
-
-		/**
-		 * @generated
-		 */
-		public ControlFlowLabelFigure() {
-
-			this.setText("");
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/DecisionNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/DecisionNodeEditPart.java
deleted file mode 100644
index a0b99d3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/DecisionNodeEditPart.java
+++ /dev/null
@@ -1,322 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.StackLayout;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.custom.figures.DecisionNodeFigure;
-import org.eclipse.epf.diagram.ad.edit.policies.DecisionNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.DecisionNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.DecisionNodeItemSemanticEditPolicy;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-import org.eclipse.gef.requests.CreateRequest;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.LineStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class DecisionNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1005;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public DecisionNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new DecisionNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		DecisionDiamondFigure figure = new DecisionDiamondFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public DecisionDiamondFigure getPrimaryShape() {
-		return (DecisionDiamondFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(DecisionNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	public class DecisionDiamondFigure extends DecisionNodeFigure {
-
-		/**
-		 * @modified
-		 */
-		public DecisionDiamondFigure() {
-
-			super(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50),
-					getMapMode().DPtoLP(50)); //modified
-			LineStyle linestyle = (LineStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.LINE_STYLE);
-			if (linestyle != null
-					&& linestyle.getLineColor() != DiagramConstants.LINE_COLOR_EDEFAULT) {
-				this.setForegroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(linestyle.getLineColor())));
-			} else {
-				this
-						.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue);
-			}
-
-			FillStyle style = (FillStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.FILL_STYLE);
-			if (style != null
-					&& style.getFillColor() != DiagramConstants.FILL_COLOR_EDEFAULT) {
-				this.setBackgroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(style.getFillColor())));
-			} else {
-				this.setBackgroundColor(DECISIONDIAMONDFIGURE_BACK);
-			}
-			this.setPreferredSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(
-					50));
-			this.setSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));
-
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-			WrapLabel fig_0 = new WrapLabel();
-
-			setFigureDiamondLabel(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fDiamondLabel;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureDiamondLabel() {
-			return fDiamondLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureDiamondLabel(WrapLabel fig) {
-			fDiamondLabel = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color DECISIONDIAMONDFIGURE_BACK = new Color(null, 185,
-			205, 230);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		// TODO Auto-generated method stub
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		} else if (NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setBackgroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setBackgroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getLineStyle_LineColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setForegroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setForegroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle().isInstance(
-				notification.getNotifier()))
-			refreshFont();
-		else if (notification.getFeature() == NotationPackage.eINSTANCE
-				.getView_Element()
-				&& ((EObject) notification.getNotifier()) == getNotationView())
-			handleMajorSemanticChange();
-		else
-			super.handleNotificationEvent(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/DecisionNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/DecisionNodeNameEditPart.java
deleted file mode 100644
index fff3871..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/DecisionNodeNameEditPart.java
+++ /dev/null
@@ -1,670 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Collections;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-
-import org.eclipse.draw2d.geometry.Point;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.transaction.RunnableWithResult;
-
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.AccessibleEditPart;
-
-import org.eclipse.gef.requests.DirectEditRequest;
-
-import org.eclipse.gef.tools.DirectEditManager;
-
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-
-import org.eclipse.swt.SWT;
-
-import org.eclipse.swt.accessibility.AccessibleEvent;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class DecisionNodeNameEditPart extends CompartmentEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4004;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public DecisionNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(IFigure figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIcon() {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.DecisionNode_1005;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), UMLEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		IFigure label = createFigurePrim();
-		defaultText = getLabelTextHelper(label);
-		return label;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigurePrim() {
-		return new NodeNameFigure();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class NodeNameFigure extends WrapLabel {
-
-		/**
-		 * @generated
-		 */
-		public NodeNameFigure() {
-
-			this.setText("");
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ForkNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ForkNodeEditPart.java
deleted file mode 100644
index 16bc765..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/ForkNodeEditPart.java
+++ /dev/null
@@ -1,282 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.policies.ForkNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ForkNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.ForkNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-
-import org.eclipse.gef.requests.CreateRequest;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class ForkNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1003;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public ForkNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ForkNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		ForkNodeFigure figure = new ForkNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ForkNodeFigure getPrimaryShape() {
-		return (ForkNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected NodeFigure createNodePlate() {
-		return new DefaultSizeNodeFigure(getMapMode().DPtoLP(100), getMapMode()
-				.DPtoLP(5));
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPolicy getPrimaryDragEditPolicy() {
-		EditPolicy result = super.getPrimaryDragEditPolicy();
-		if (result instanceof ResizableEditPolicy) {
-			ResizableEditPolicy ep = (ResizableEditPolicy) result;
-			ep.setResizeDirections(PositionConstants.WEST
-					| PositionConstants.EAST);
-		}
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ForkNodeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public ForkNodeFigure() {
-
-			FillStyle style = (FillStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.FILL_STYLE);
-			if (style != null
-					&& style.getFillColor() != DiagramConstants.FILL_COLOR_EDEFAULT) {
-				setBackgroundColor(DiagramColorRegistry.getInstance().getColor(
-						new Integer(style.getFillColor())));
-			} else {
-				this.setBackgroundColor(FORKNODEFIGURE_BACK);
-			}
-			this.setPreferredSize(getMapMode().DPtoLP(100), getMapMode()
-					.DPtoLP(8));
-			this.setSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(8));
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color FORKNODEFIGURE_BACK = new Color(null, 45, 85, 130);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		// TODO Auto-generated method stub
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		} else if (NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setBackgroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setBackgroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getLineStyle_LineColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setForegroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setForegroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle().isInstance(
-				notification.getNotifier()))
-			refreshFont();
-		else if (notification.getFeature() == NotationPackage.eINSTANCE
-				.getView_Element()
-				&& ((EObject) notification.getNotifier()) == getNotationView())
-			handleMajorSemanticChange();
-		else
-			super.handleNotificationEvent(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/InitialNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/InitialNodeEditPart.java
deleted file mode 100644
index d402bae..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/InitialNodeEditPart.java
+++ /dev/null
@@ -1,321 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Ellipse;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.StackLayout;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.policies.InitialNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.InitialNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.InitialNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLExtNodeLabelHostLayoutEditPolicy;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gef.editparts.LayerManager;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-import org.eclipse.gef.requests.CreateRequest;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderedShapeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.BorderItemSelectionEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.figures.BorderItemLocator;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.LineStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class InitialNodeEditPart extends AbstractBorderedShapeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1004;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public InitialNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new InitialNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				if (child instanceof IBorderItemEditPart) {
-					return new BorderItemSelectionEditPolicy();
-				}
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		InitialNodeFigure figure = new InitialNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public InitialNodeFigure getPrimaryShape() {
-		return (InitialNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addBorderItem(IFigure borderItemContainer,
-			IBorderItemEditPart borderItemEditPart) {
-		if (borderItemEditPart instanceof InitialNodeNameEditPart) {
-			BorderItemLocator locator = new BorderItemLocator(getMainFigure(),
-					PositionConstants.SOUTH);
-			locator.setBorderItemOffset(new Dimension(-20, -20));
-			borderItemContainer.add(borderItemEditPart.getFigure(), locator);
-		} else {
-			super.addBorderItem(borderItemContainer, borderItemEditPart);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected NodeFigure createNodePlate() {
-		return new DefaultSizeNodeFigure(getMapMode().DPtoLP(20), getMapMode()
-				.DPtoLP(20));
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createMainFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(InitialNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	public class InitialNodeFigure extends Ellipse {
-
-		/**
-		 * @modified
-		 */
-		public InitialNodeFigure() {
-
-			LineStyle linestyle = (LineStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.LINE_STYLE);
-			if (linestyle != null
-					&& linestyle.getLineColor() != DiagramConstants.LINE_COLOR_EDEFAULT) {
-				this.setForegroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(linestyle.getLineColor())));
-			} else {
-				this
-						.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue);
-			}
-
-			FillStyle style = (FillStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.FILL_STYLE);
-			if (style != null
-					&& style.getFillColor() != DiagramConstants.FILL_COLOR_EDEFAULT) {
-				this.setBackgroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(style.getFillColor())));
-			} else {
-				this.setBackgroundColor(INITIALNODEFIGURE_BACK);
-			}
-			this.setPreferredSize(getMapMode().DPtoLP(20), getMapMode().DPtoLP(
-					20));
-			this.setSize(getMapMode().DPtoLP(20), getMapMode().DPtoLP(20));
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color INITIALNODEFIGURE_BACK = new Color(null, 45, 85,
-			130);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		// TODO Auto-generated method stub
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		} else if (NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setBackgroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setBackgroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getLineStyle_LineColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setForegroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setForegroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle().isInstance(
-				notification.getNotifier()))
-			refreshFont();
-		else if (notification.getFeature() == NotationPackage.eINSTANCE
-				.getView_Element()
-				&& ((EObject) notification.getNotifier()) == getNotationView())
-			handleMajorSemanticChange();
-		else
-			super.handleNotificationEvent(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/InitialNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/InitialNodeNameEditPart.java
deleted file mode 100644
index 344467e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/InitialNodeNameEditPart.java
+++ /dev/null
@@ -1,616 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IBorderItemEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.figures.IBorderItemLocator;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class InitialNodeNameEditPart extends LabelEditPart implements
-		ITextAwareEditPart, IBorderItemEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4003;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	static {
-		registerSnapBackPosition(UMLVisualIDRegistry
-				.getType(InitialNodeNameEditPart.VISUAL_ID), new Point(0, 0));
-	}
-
-	/**
-	 * @generated
-	 */
-	public InitialNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	public IBorderItemLocator getBorderItemLocator() {
-		IFigure parentFigure = getFigure().getParent();
-		if (parentFigure != null && parentFigure.getLayoutManager() != null) {
-			Object constraint = parentFigure.getLayoutManager().getConstraint(
-					getFigure());
-			return (IBorderItemLocator) constraint;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshBounds() {
-		int x = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int y = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		int width = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Width())).intValue();
-		int height = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getSize_Height())).intValue();
-		getBorderItemLocator()
-				.setConstraint(new Rectangle(x, y, width, height));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(IFigure figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIcon() {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.InitialNode_1004;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), UMLEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		IFigure label = createFigurePrim();
-		defaultText = getLabelTextHelper(label);
-		return label;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigurePrim() {
-		return new WrapLabel();
-	}
-
-	/**
-	 * TODO: Disables direct edit for now until the issue with duplicate labels is fixed
-	 */
-	@Override
-	public void performRequest(Request request) {
-		if (RequestConstants.REQ_DIRECT_EDIT != request.getType()) {
-        	super.performRequest(request);
-        }
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/JoinNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/JoinNodeEditPart.java
deleted file mode 100644
index 5fbffe5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/JoinNodeEditPart.java
+++ /dev/null
@@ -1,273 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.policies.JoinNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.JoinNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.JoinNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class JoinNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1006;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public JoinNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new JoinNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		ForkNodeFigure figure = new ForkNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ForkNodeFigure getPrimaryShape() {
-		return (ForkNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected NodeFigure createNodePlate() {
-		return new DefaultSizeNodeFigure(getMapMode().DPtoLP(100), getMapMode()
-				.DPtoLP(5));
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPolicy getPrimaryDragEditPolicy() {
-		EditPolicy result = super.getPrimaryDragEditPolicy();
-		if (result instanceof ResizableEditPolicy) {
-			ResizableEditPolicy ep = (ResizableEditPolicy) result;
-			ep.setResizeDirections(PositionConstants.WEST
-					| PositionConstants.EAST);
-		}
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class ForkNodeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public ForkNodeFigure() {
-
-			FillStyle style = (FillStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.FILL_STYLE);
-			if (style != null
-					&& style.getFillColor() != DiagramConstants.FILL_COLOR_EDEFAULT) {
-				setBackgroundColor(DiagramColorRegistry.getInstance().getColor(
-						new Integer(style.getFillColor())));
-			} else {
-				this.setBackgroundColor(FORKNODEFIGURE_BACK);
-			}
-			this.setPreferredSize(getMapMode().DPtoLP(100), getMapMode()
-					.DPtoLP(8));
-			this.setSize(getMapMode().DPtoLP(100), getMapMode().DPtoLP(8));
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color FORKNODEFIGURE_BACK = new Color(null, 45, 85, 130);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		// TODO Auto-generated method stub
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		} else if (NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setBackgroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setBackgroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getLineStyle_LineColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setForegroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setForegroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle().isInstance(
-				notification.getNotifier()))
-			refreshFont();
-		else if (notification.getFeature() == NotationPackage.eINSTANCE
-				.getView_Element()
-				&& ((EObject) notification.getNotifier()) == getNotationView())
-			handleMajorSemanticChange();
-		else
-			super.handleNotificationEvent(notification);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/MergeNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/MergeNodeEditPart.java
deleted file mode 100644
index d229a0a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/MergeNodeEditPart.java
+++ /dev/null
@@ -1,322 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.StackLayout;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.custom.figures.DecisionNodeFigure;
-import org.eclipse.epf.diagram.ad.edit.policies.MergeNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.MergeNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.MergeNodeItemSemanticEditPolicy;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-import org.eclipse.gef.requests.CreateRequest;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.LineStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class MergeNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1002;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public MergeNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new MergeNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		DecisionDiamondFigure figure = new DecisionDiamondFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public DecisionDiamondFigure getPrimaryShape() {
-		return (DecisionDiamondFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(MergeNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	public class DecisionDiamondFigure extends DecisionNodeFigure {
-
-		/**
-		 * @modified
-		 */
-		public DecisionDiamondFigure() {
-
-			super(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50),
-					getMapMode().DPtoLP(50)); //modified
-			LineStyle linestyle = (LineStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.LINE_STYLE);
-			if (linestyle != null
-					&& linestyle.getLineColor() != DiagramConstants.LINE_COLOR_EDEFAULT) {
-				this.setForegroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(linestyle.getLineColor())));
-			} else {
-				this
-						.setForegroundColor(org.eclipse.draw2d.ColorConstants.darkBlue);
-			}
-
-			FillStyle style = (FillStyle) getPrimaryView().getStyle(
-					NotationPackage.Literals.FILL_STYLE);
-			if (style != null
-					&& style.getFillColor() != DiagramConstants.FILL_COLOR_EDEFAULT) {
-				this.setBackgroundColor(DiagramColorRegistry.getInstance()
-						.getColor(new Integer(style.getFillColor())));
-			} else {
-				this.setBackgroundColor(DECISIONDIAMONDFIGURE_BACK);
-			}
-			this.setPreferredSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(
-					50));
-			this.setSize(getMapMode().DPtoLP(50), getMapMode().DPtoLP(50));
-
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-			WrapLabel fig_0 = new WrapLabel();
-
-			setFigureDiamondLabel(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fDiamondLabel;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureDiamondLabel() {
-			return fDiamondLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureDiamondLabel(WrapLabel fig) {
-			fDiamondLabel = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color DECISIONDIAMONDFIGURE_BACK = new Color(null, 185,
-			205, 230);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		// TODO Auto-generated method stub
-		Object feature = notification.getFeature();
-		if (NotationPackage.eINSTANCE.getSize_Width().equals(feature)
-				|| NotationPackage.eINSTANCE.getSize_Height().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_X().equals(feature)
-				|| NotationPackage.eINSTANCE.getLocation_Y().equals(feature)) {
-			refreshBounds();
-		} else if (NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setBackgroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setBackgroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getLineStyle_LineColor().equals(
-				feature)) {
-			Integer c = (Integer) notification.getNewValue();
-			setForegroundColor(DiagramColorRegistry.getInstance().getColor(c));
-			getPrimaryShape().setForegroundColor(
-					DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle().isInstance(
-				notification.getNotifier()))
-			refreshFont();
-		else if (notification.getFeature() == NotationPackage.eINSTANCE
-				.getView_Element()
-				&& ((EObject) notification.getNotifier()) == getNotationView())
-			handleMajorSemanticChange();
-		else
-			super.handleNotificationEvent(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/MergeNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/MergeNodeNameEditPart.java
deleted file mode 100644
index c321f02..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/MergeNodeNameEditPart.java
+++ /dev/null
@@ -1,670 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Collections;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-
-import org.eclipse.draw2d.geometry.Point;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.transaction.RunnableWithResult;
-
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-
-import org.eclipse.gef.AccessibleEditPart;
-
-import org.eclipse.gef.requests.DirectEditRequest;
-
-import org.eclipse.gef.tools.DirectEditManager;
-
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-
-import org.eclipse.swt.SWT;
-
-import org.eclipse.swt.accessibility.AccessibleEvent;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class MergeNodeNameEditPart extends CompartmentEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4002;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public MergeNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(IFigure figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIcon() {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.MergeNode_1002;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), UMLEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		IFigure label = createFigurePrim();
-		defaultText = getLabelTextHelper(label);
-		return label;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigurePrim() {
-		return new NodeNameFigure();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class NodeNameFigure extends WrapLabel {
-
-		/**
-		 * @generated
-		 */
-		public NodeNameFigure() {
-
-			this.setText("");
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNode2EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNode2EditPart.java
deleted file mode 100644
index 32cd425..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNode2EditPart.java
+++ /dev/null
@@ -1,307 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.epf.diagram.ad.custom.policies.OpenADEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNode2CanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNode2GraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNode2ItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class StructuredActivityNode2EditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1010;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNode2EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new StructuredActivityNode2ItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new StructuredActivityNode2GraphicalNodeEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new StructuredActivityNode2CanonicalEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-		installEditPolicy(EditPolicyRoles.OPEN_ROLE, new OpenADEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		StructuredActivityNodeFigure figure = new StructuredActivityNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeFigure getPrimaryShape() {
-		return (StructuredActivityNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof StructuredActivityNodeName2EditPart) {
-			((StructuredActivityNodeName2EditPart) childEditPart)
-					.setLabel(getPrimaryShape().getFigureNodeNameFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(StructuredActivityNodeName2EditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class StructuredActivityNodeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public StructuredActivityNodeFigure() {
-
-			this.setOutline(false);
-			this.setOpaque(false);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-			fig_0.setText(DiagramCoreResources.ActivityDiagram_New_Phase);
-
-			DiagramCoreUtil.setLabelProperties(fig_0);
-			setFigureNodeNameFigure(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fNodeNameFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureNodeNameFigure() {
-			return fNodeNameFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureNodeNameFigure(WrapLabel fig) {
-			fNodeNameFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-		@Override
-		public void paintFigure(Graphics graphics) {
-			if (isOpaque())
-				super.paintFigure(graphics);
-			return;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNode3EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNode3EditPart.java
deleted file mode 100644
index 4a6359a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNode3EditPart.java
+++ /dev/null
@@ -1,308 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.epf.diagram.ad.custom.policies.OpenADEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNode3CanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNode3GraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNode3ItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class StructuredActivityNode3EditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1011;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNode3EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new StructuredActivityNode3ItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new StructuredActivityNode3GraphicalNodeEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new StructuredActivityNode3CanonicalEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-		installEditPolicy(EditPolicyRoles.OPEN_ROLE, new OpenADEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		StructuredActivityNodeFigure figure = new StructuredActivityNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeFigure getPrimaryShape() {
-		return (StructuredActivityNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof StructuredActivityNodeName3EditPart) {
-			((StructuredActivityNodeName3EditPart) childEditPart)
-					.setLabel(getPrimaryShape().getFigureNodeNameFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(StructuredActivityNodeName3EditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class StructuredActivityNodeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public StructuredActivityNodeFigure() {
-
-			this.setOutline(false);
-			this.setOpaque(false);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-			fig_0.setText(DiagramCoreResources.ActivityDiagram_New_Iteration);
-
-			DiagramCoreUtil.setLabelProperties(fig_0);
-
-			setFigureNodeNameFigure(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fNodeNameFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureNodeNameFigure() {
-			return fNodeNameFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureNodeNameFigure(WrapLabel fig) {
-			fNodeNameFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-		@Override
-		public void paintFigure(Graphics graphics) {
-			if (isOpaque())
-				super.paintFigure(graphics);
-			return;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeEditPart.java
deleted file mode 100644
index 17a330e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeEditPart.java
+++ /dev/null
@@ -1,307 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.epf.diagram.ad.custom.policies.OpenADEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.StructuredActivityNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1007;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new StructuredActivityNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new StructuredActivityNodeGraphicalNodeEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new StructuredActivityNodeCanonicalEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-		installEditPolicy(EditPolicyRoles.OPEN_ROLE, new OpenADEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		StructuredActivityNodeFigure figure = new StructuredActivityNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeFigure getPrimaryShape() {
-		return (StructuredActivityNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof StructuredActivityNodeNameEditPart) {
-			((StructuredActivityNodeNameEditPart) childEditPart)
-					.setLabel(getPrimaryShape().getFigureNodeNameFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(UMLVisualIDRegistry
-				.getType(StructuredActivityNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class StructuredActivityNodeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public StructuredActivityNodeFigure() {
-
-			this.setOutline(false);
-			this.setOpaque(false);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-			fig_0.setText(DiagramCoreResources.ActivityDiagram_New_Activity);
-
-			DiagramCoreUtil.setLabelProperties(fig_0);
-			setFigureNodeNameFigure(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fNodeNameFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureNodeNameFigure() {
-			return fNodeNameFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureNodeNameFigure(WrapLabel fig) {
-			fNodeNameFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-		@Override
-		public void paintFigure(Graphics graphics) {
-			if (isOpaque())
-				super.paintFigure(graphics);
-			return;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeName2EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeName2EditPart.java
deleted file mode 100644
index 40ca3e6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeName2EditPart.java
+++ /dev/null
@@ -1,624 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.custom.policies.OpenADEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.ValidatingTextDirectEditManager;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeName2EditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4009;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeName2EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-		
-		installEditPolicy(EditPolicyRoles.OPEN_ROLE, new OpenADEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/phase.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		if (DiagramCoreUtil.isReadOnly(this))
-			return false;
-		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.StructuredActivityNode_1010;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new ValidatingTextDirectEditManager(this,
-					TextDirectEditManager.getTextCellEditorClass(this),
-					UMLEditPartFactory.getTextCellEditorLocator(this)) {
-
-				@Override
-				protected void performDirectEdit() {
-					((StructuredActivityNodeName2EditPart) getEditPart())
-							.performDirectEdit();
-				}
-
-				@Override
-				protected String validate(String txt) {
-					return DiagramCoreUtil.validStringForBreakdownElements(
-							getEditPart(), txt);
-				}
-
-			});
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeName3EditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeName3EditPart.java
deleted file mode 100644
index a7419b3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeName3EditPart.java
+++ /dev/null
@@ -1,624 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.custom.policies.OpenADEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.ValidatingTextDirectEditManager;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeName3EditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4010;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeName3EditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-		
-		installEditPolicy(EditPolicyRoles.OPEN_ROLE, new OpenADEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/iteration.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		if (DiagramCoreUtil.isReadOnly(this))
-			return false;
-		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.StructuredActivityNode_1011;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new ValidatingTextDirectEditManager(this,
-					TextDirectEditManager.getTextCellEditorClass(this),
-					UMLEditPartFactory.getTextCellEditorLocator(this)) {
-
-				@Override
-				protected void performDirectEdit() {
-					((StructuredActivityNodeName3EditPart) getEditPart())
-							.performDirectEdit();
-				}
-
-				@Override
-				protected String validate(String txt) {
-					return DiagramCoreUtil.validStringForBreakdownElements(
-							getEditPart(), txt);
-				}
-
-			});
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeNameEditPart.java
deleted file mode 100644
index d773beb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/StructuredActivityNodeNameEditPart.java
+++ /dev/null
@@ -1,626 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.ad.custom.policies.OpenADEditPolicy;
-import org.eclipse.epf.diagram.ad.edit.policies.UMLTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.ValidatingTextDirectEditManager;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeNameEditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4005;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public StructuredActivityNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-		
-		installEditPolicy(EditPolicyRoles.OPEN_ROLE, new OpenADEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/activity.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		if (DiagramCoreUtil.isReadOnly(this))
-			return false;
-		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return UMLElementTypes.StructuredActivityNode_1007;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new ValidatingTextDirectEditManager(this,
-					TextDirectEditManager.getTextCellEditorClass(this),
-					UMLEditPartFactory.getTextCellEditorLocator(this)) {
-
-				@Override
-				protected void performDirectEdit() {
-					((StructuredActivityNodeNameEditPart) getEditPart())
-							.performDirectEdit();
-				}
-
-				@Override
-				protected String validate(String txt) {
-					return DiagramCoreUtil.validStringForBreakdownElements(
-							getEditPart(), txt);
-				}
-
-			});
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof UMLTextSelectionEditPolicy) {
-			((UMLTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/UMLEditPartFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/UMLEditPartFactory.java
deleted file mode 100644
index e559964..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/UMLEditPartFactory.java
+++ /dev/null
@@ -1,241 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-/**
- * @generated
- */
-public class UMLEditPartFactory implements EditPartFactory {
-
-	/**
-	 * @generated
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-		if (model instanceof View) {
-			View view = (View) model;
-			switch (UMLVisualIDRegistry.getVisualID(view)) {
-
-			case ActivityEditPart.VISUAL_ID:
-				return new ActivityEditPart(view);
-
-			case ActivityFinalNodeEditPart.VISUAL_ID:
-				return new ActivityFinalNodeEditPart(view);
-
-			case ActivityFinalNodeNameEditPart.VISUAL_ID:
-				return new ActivityFinalNodeNameEditPart(view);
-
-			case MergeNodeEditPart.VISUAL_ID:
-				return new MergeNodeEditPart(view);
-
-			case MergeNodeNameEditPart.VISUAL_ID:
-				return new MergeNodeNameEditPart(view);
-
-			case ForkNodeEditPart.VISUAL_ID:
-				return new ForkNodeEditPart(view);
-
-			case InitialNodeEditPart.VISUAL_ID:
-				return new InitialNodeEditPart(view);
-
-			case InitialNodeNameEditPart.VISUAL_ID:
-				return new InitialNodeNameEditPart(view);
-
-			case DecisionNodeEditPart.VISUAL_ID:
-				return new DecisionNodeEditPart(view);
-
-			case DecisionNodeNameEditPart.VISUAL_ID:
-				return new DecisionNodeNameEditPart(view);
-
-			case JoinNodeEditPart.VISUAL_ID:
-				return new JoinNodeEditPart(view);
-
-			case StructuredActivityNodeEditPart.VISUAL_ID:
-				return new StructuredActivityNodeEditPart(view);
-
-			case StructuredActivityNodeNameEditPart.VISUAL_ID:
-				return new StructuredActivityNodeNameEditPart(view);
-
-			case ActivityPartitionEditPart.VISUAL_ID:
-				return new ActivityPartitionEditPart(view);
-
-			case ActivityPartitionName2EditPart.VISUAL_ID:
-				return new ActivityPartitionName2EditPart(view);
-
-			case ActivityParameterNodeEditPart.VISUAL_ID:
-				return new ActivityParameterNodeEditPart(view);
-
-			case ActivityParameterNodeNameEditPart.VISUAL_ID:
-				return new ActivityParameterNodeNameEditPart(view);
-
-			case StructuredActivityNode2EditPart.VISUAL_ID:
-				return new StructuredActivityNode2EditPart(view);
-
-			case StructuredActivityNodeName2EditPart.VISUAL_ID:
-				return new StructuredActivityNodeName2EditPart(view);
-
-			case StructuredActivityNode3EditPart.VISUAL_ID:
-				return new StructuredActivityNode3EditPart(view);
-
-			case StructuredActivityNodeName3EditPart.VISUAL_ID:
-				return new StructuredActivityNodeName3EditPart(view);
-
-			case ActivityParameterNode2EditPart.VISUAL_ID:
-				return new ActivityParameterNode2EditPart(view);
-
-			case ActivityParameterNodeName2EditPart.VISUAL_ID:
-				return new ActivityParameterNodeName2EditPart(view);
-
-			case ActivityPartition2EditPart.VISUAL_ID:
-				return new ActivityPartition2EditPart(view);
-
-			case ActivityPartitionNameEditPart.VISUAL_ID:
-				return new ActivityPartitionNameEditPart(view);
-
-			case ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID:
-				return new ActivityPartitionPartitionCampartmentEditPart(view);
-
-			case ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID:
-				return new ActivityPartitionPartitionCampartment2EditPart(view);
-
-			case ControlFlowEditPart.VISUAL_ID:
-				return new ControlFlowEditPart(view);
-
-			case ControlFlowNameEditPart.VISUAL_ID:
-				return new ControlFlowNameEditPart(view);
-			}
-		}
-		return createUnrecognizedEditPart(context, model);
-	}
-
-	/**
-	 * @generated
-	 */
-	private EditPart createUnrecognizedEditPart(EditPart context, Object model) {
-		// Handle creation of unrecognized child node EditParts here
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static CellEditorLocator getTextCellEditorLocator(
-			ITextAwareEditPart source) {
-		if (source.getFigure() instanceof WrapLabel)
-			return new TextCellEditorLocator((WrapLabel) source.getFigure());
-		else {
-			return new LabelCellEditorLocator((Label) source.getFigure());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	static private class TextCellEditorLocator implements CellEditorLocator {
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel wrapLabel;
-
-		/**
-		 * @generated
-		 */
-		public TextCellEditorLocator(WrapLabel wrapLabel) {
-			this.wrapLabel = wrapLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getWrapLabel() {
-			return wrapLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void relocate(CellEditor celleditor) {
-			Text text = (Text) celleditor.getControl();
-			Rectangle rect = getWrapLabel().getTextBounds().getCopy();
-			getWrapLabel().translateToAbsolute(rect);
-			if (getWrapLabel().isTextWrapped()
-					&& getWrapLabel().getText().length() > 0) {
-				rect.setSize(new Dimension(text.computeSize(rect.width,
-						SWT.DEFAULT)));
-			} else {
-				int avr = FigureUtilities.getFontMetrics(text.getFont())
-						.getAverageCharWidth();
-				rect.setSize(new Dimension(text.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT)).expand(avr * 2, 0));
-			}
-			if (!rect.equals(new Rectangle(text.getBounds()))) {
-				text.setBounds(rect.x, rect.y, rect.width, rect.height);
-			}
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class LabelCellEditorLocator implements CellEditorLocator {
-
-		/**
-		 * @generated
-		 */
-		private Label label;
-
-		/**
-		 * @generated
-		 */
-		public LabelCellEditorLocator(Label label) {
-			this.label = label;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Label getLabel() {
-			return label;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void relocate(CellEditor celleditor) {
-			Text text = (Text) celleditor.getControl();
-			Rectangle rect = getLabel().getTextBounds().getCopy();
-			getLabel().translateToAbsolute(rect);
-			int avr = FigureUtilities.getFontMetrics(text.getFont())
-					.getAverageCharWidth();
-			rect.setSize(new Dimension(text.computeSize(SWT.DEFAULT,
-					SWT.DEFAULT)).expand(avr * 2, 0));
-			if (!rect.equals(new Rectangle(text.getBounds()))) {
-				text.setBounds(rect.x, rect.y, rect.width, rect.height);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/UMLExtNodeLabelEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/UMLExtNodeLabelEditPart.java
deleted file mode 100644
index 772c598..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/parts/UMLExtNodeLabelEditPart.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.figures.LabelLocator;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class UMLExtNodeLabelEditPart extends LabelEditPart {
-
-	/**
-	 * @generated
-	 */
-	public UMLExtNodeLabelEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshBounds() {
-		IFigure refFigure = ((GraphicalEditPart) getParent()).getFigure();
-		int dx = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int dy = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		Point offset = new Point(dx, dy);
-		getFigure().getParent().setConstraint(getFigure(),
-				new LabelLocator(refFigure, offset, getKeyPoint()) {
-
-					public void relocate(IFigure target) {
-						Point location = getReferencePoint().getTranslated(
-								getOffset());
-						location.translate(-target.getBounds().width / 2, 0);
-						target.setLocation(location);
-						target.setSize(new Dimension(
-								target.getPreferredSize().width, target
-										.getPreferredSize().height));
-					}
-
-					protected Point getReferencePoint() {
-						return getLabelLocation(parent);
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	public Point getReferencePoint() {
-		return getLabelLocation(((GraphicalEditPart) getParent()).getFigure());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Point getLabelLocation(IFigure parent) {
-		return parent.getBounds().getBottom();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityCanonicalEditPolicy.java
deleted file mode 100644
index 6bb43c9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityCanonicalEditPolicy.java
+++ /dev/null
@@ -1,563 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityCanonicalEditPolicy extends CanonicalConnectionEditPolicy {
-	
-	@Override
-	public EObject getSemanticHost() {
-		return host().getModel() != null ? super.getSemanticHost() : null;
-	}
-	
-	@Override
-	protected void refreshOnActivate() {		
-		super.refreshOnActivate();
-		
-		EditPart ep = getHost();
-		if(ep instanceof DiagramEditPart) {
-			DiagramEditorUtil.initializeOnActivate((DiagramEditPart) ep);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		EObject modelObject = ((View) getHost().getModel()).getElement();
-		View viewObject = (View) getHost().getModel();
-		EObject nextValue;
-		int nodeVID;
-		for (Iterator values = ((Activity) modelObject).getNodes().iterator(); values
-				.hasNext();) {
-			nextValue = (EObject) values.next();
-			// modified START
-			// To avoid the ActivityNode show in duplicate places
-			if (nextValue instanceof ActivityNode) {
-				if (!((ActivityNode) nextValue).getInPartitions().isEmpty())
-					continue;
-			}
-			// modified END
-			nodeVID = UMLVisualIDRegistry
-					.getNodeVisualID(viewObject, nextValue);
-			switch (nodeVID) {
-			case ActivityFinalNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case MergeNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case ForkNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case InitialNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case DecisionNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case JoinNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case StructuredActivityNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case ActivityParameterNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case StructuredActivityNode2EditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case StructuredActivityNode3EditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case ActivityParameterNode2EditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			}
-		}
-		for (Iterator values = ((Activity) modelObject).getGroups().iterator(); values
-				.hasNext();) {
-			nextValue = (EObject) values.next();
-			nodeVID = UMLVisualIDRegistry
-					.getNodeVisualID(viewObject, nextValue);
-			if (ActivityPartitionEditPart.VISUAL_ID == nodeVID) {
-				result.add(nextValue);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldDeleteView(View view) {
-		if (view instanceof Edge) {
-			Object element = view.getElement();
-			if (element != null && element instanceof ActivityEdge) {
-				if (((ActivityEdge) element).getSource() == null
-						|| ((ActivityEdge) element).getTarget() == null)
-					return true;
-			}
-		}
-		return view.isSetElement()
-				&& view.getElement() != null
-				&& (view.getElement().eIsProxy() || (view.getElement() instanceof EModelElement && BridgeHelper
-						.getMethodElement((EModelElement) view.getElement()) != null));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected List getSemanticConnectionsList() {
-		//		return Collections.EMPTY_LIST;
-
-		Activity act = (Activity) ((View) getHost().getModel()).getElement();
-		return new ArrayList(act.getEdges());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject getSourceElement(EObject relationship) {
-		if (relationship instanceof ActivityEdge) {
-			return ((ActivityEdge) relationship).getSource();
-		}
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject getTargetElement(EObject relationship) {
-		if (relationship instanceof ActivityEdge) {
-			return ((ActivityEdge) relationship).getTarget();
-		}
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldIncludeConnection(Edge connector,
-			Collection children) {
-		return super.shouldIncludeConnection(connector, children);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshSemantic() {
-		List createdViews = new LinkedList();
-		createdViews.addAll(refreshSemanticChildren());
-		List createdConnectionViews = new LinkedList();
-		createdConnectionViews.addAll(refreshSemanticConnections());
-		createdConnectionViews.addAll(refreshConnections());
-
-		if (createdViews.size() > 1) {
-			// perform a layout of the container
-			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host()
-					.getEditingDomain(), createdViews, host());
-			executeCommand(new ICommandProxy(layoutCmd));
-		}
-
-		createdViews.addAll(createdConnectionViews);
-		makeViewsImmutable(createdViews);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Collection myLinkDescriptors = new LinkedList();
-
-	/**
-	 * @generated
-	 */
-	private Map myEObject2ViewMap = new HashMap();
-
-	/**
-	 * @generated
-	 */
-	private Collection refreshConnections() {
-		try {
-			collectAllLinks(getDiagram());
-			Collection existingLinks = new LinkedList(getDiagram().getEdges());
-			for (Iterator diagramLinks = existingLinks.iterator(); diagramLinks
-					.hasNext();) {
-				Edge nextDiagramLink = (Edge) diagramLinks.next();
-				EObject diagramLinkObject = nextDiagramLink.getElement();
-				EObject diagramLinkSrc = nextDiagramLink.getSource()
-						.getElement();
-				EObject diagramLinkDst = nextDiagramLink.getTarget()
-						.getElement();
-				int diagramLinkVisualID = UMLVisualIDRegistry
-						.getVisualID(nextDiagramLink);
-				for (Iterator modelLinkDescriptors = myLinkDescriptors
-						.iterator(); modelLinkDescriptors.hasNext();) {
-					LinkDescriptor nextLinkDescriptor = (LinkDescriptor) modelLinkDescriptors
-							.next();
-					if (diagramLinkObject == nextLinkDescriptor
-							.getLinkElement()
-							&& diagramLinkSrc == nextLinkDescriptor.getSource()
-							&& diagramLinkDst == nextLinkDescriptor
-									.getDestination()
-							&& diagramLinkVisualID == nextLinkDescriptor
-									.getVisualID()) {
-						diagramLinks.remove();
-						modelLinkDescriptors.remove();
-					}
-				}
-			}
-			deleteViews(existingLinks.iterator());
-			return createConnections(myLinkDescriptors);
-		} finally {
-			myLinkDescriptors.clear();
-			myEObject2ViewMap.clear();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void collectAllLinks(View view) {
-		EObject modelElement = view.getElement();
-		int diagramElementVisualID = UMLVisualIDRegistry.getVisualID(view);
-		switch (diagramElementVisualID) {
-		case ActivityFinalNodeEditPart.VISUAL_ID:
-		case MergeNodeEditPart.VISUAL_ID:
-		case ForkNodeEditPart.VISUAL_ID:
-		case InitialNodeEditPart.VISUAL_ID:
-		case DecisionNodeEditPart.VISUAL_ID:
-		case JoinNodeEditPart.VISUAL_ID:
-		case StructuredActivityNodeEditPart.VISUAL_ID:
-		case ActivityPartitionEditPart.VISUAL_ID:
-		case ActivityParameterNodeEditPart.VISUAL_ID:
-		case StructuredActivityNode2EditPart.VISUAL_ID:
-		case StructuredActivityNode3EditPart.VISUAL_ID:
-		case ActivityParameterNode2EditPart.VISUAL_ID:
-		case ActivityPartition2EditPart.VISUAL_ID:
-		case ActivityEditPart.VISUAL_ID: {
-			myEObject2ViewMap.put(modelElement, view);
-			storeLinks(modelElement, getDiagram());
-		}
-		default: {
-		}
-			for (Iterator children = view.getChildren().iterator(); children
-					.hasNext();) {
-				View childView = (View) children.next();
-				collectAllLinks(childView);
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private Collection createConnections(Collection linkDescriptors) {
-		if (linkDescriptors.isEmpty()) {
-			return Collections.EMPTY_LIST;
-		}
-		List adapters = new LinkedList();
-		for (Iterator linkDescriptorsIterator = linkDescriptors.iterator(); linkDescriptorsIterator
-				.hasNext();) {
-			final LinkDescriptor nextLinkDescriptor = (LinkDescriptor) linkDescriptorsIterator
-					.next();
-			EditPart sourceEditPart = getEditPartFor(nextLinkDescriptor
-					.getSource());
-			EditPart targetEditPart = getEditPartFor(nextLinkDescriptor
-					.getDestination());
-			if (sourceEditPart == null || targetEditPart == null) {
-				continue;
-			}
-			CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(
-					nextLinkDescriptor.getSemanticAdapter(), null,
-					ViewUtil.APPEND, false, ((IGraphicalEditPart) getHost())
-							.getDiagramPreferencesHint());
-			CreateConnectionViewRequest ccr = new CreateConnectionViewRequest(
-					descriptor);
-			ccr.setType(RequestConstants.REQ_CONNECTION_START);
-			ccr.setSourceEditPart(sourceEditPart);
-			sourceEditPart.getCommand(ccr);
-			ccr.setTargetEditPart(targetEditPart);
-			ccr.setType(RequestConstants.REQ_CONNECTION_END);
-			Command cmd = targetEditPart.getCommand(ccr);
-			if (cmd != null && cmd.canExecute()) {
-				executeCommand(cmd);
-				IAdaptable viewAdapter = (IAdaptable) ccr.getNewObject();
-				if (viewAdapter != null) {
-					adapters.add(viewAdapter);
-				}
-			}
-		}
-		return adapters;
-	}
-
-	/**
-	 * @generated
-	 */
-	private EditPart getEditPartFor(EObject modelElement) {
-		View view = (View) myEObject2ViewMap.get(modelElement);
-		if (view != null) {
-			return (EditPart) getHost().getViewer().getEditPartRegistry().get(
-					view);
-		}
-		return null;
-	}
-
-	/**
-	 *@generated
-	 */
-	private void storeLinks(EObject container, Diagram diagram) {
-		EClass containerMetaclass = container.eClass();
-		storeFeatureModelFacetLinks(container, containerMetaclass, diagram);
-		storeTypeModelFacetLinks(container, containerMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void storeTypeModelFacetLinks(EObject container,
-			EClass containerMetaclass) {
-		storeTypeModelFacetLinks_ControlFlow_3001(container, containerMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void storeTypeModelFacetLinks_ControlFlow_3001(EObject container,
-			EClass containerMetaclass) {
-		if (UMLPackage.eINSTANCE.getStructuredActivityNode().isSuperTypeOf(
-				containerMetaclass)) {
-			for (Iterator values = ((StructuredActivityNode) container)
-					.getEdges().iterator(); values.hasNext();) {
-				EObject nextValue = ((EObject) values.next());
-				int linkVID = UMLVisualIDRegistry
-						.getLinkWithClassVisualID(nextValue);
-				if (ControlFlowEditPart.VISUAL_ID == linkVID) {
-					Object structuralFeatureResult = ((ActivityEdge) nextValue)
-							.getTarget();
-					if (structuralFeatureResult instanceof EObject) {
-						EObject dst = (EObject) structuralFeatureResult;
-						structuralFeatureResult = ((ActivityEdge) nextValue)
-								.getSource();
-						if (structuralFeatureResult instanceof EObject) {
-							EObject src = (EObject) structuralFeatureResult;
-							myLinkDescriptors.add(new LinkDescriptor(src, dst,
-									nextValue,
-									UMLElementTypes.ControlFlow_3001, linkVID));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 *@generated
-	 */
-	private void storeFeatureModelFacetLinks(EObject container,
-			EClass containerMetaclass, Diagram diagram) {
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private Diagram getDiagram() {
-		return ((View) getHost().getModel()).getDiagram();
-	}
-
-	/**
-	 * @generated
-	 */
-	private class LinkDescriptor {
-
-		/**
-		 * @generated
-		 */
-		private EObject mySource;
-
-		/**
-		 * @generated
-		 */
-		private EObject myDestination;
-
-		/**
-		 * @generated
-		 */
-		private EObject myLinkElement;
-
-		/**
-		 * @generated
-		 */
-		private int myVisualID;
-
-		/**
-		 * @generated
-		 */
-		private IAdaptable mySemanticAdapter;
-
-		/**
-		 * @generated
-		 */
-		protected LinkDescriptor(EObject source, EObject destination,
-				EObject linkElement, IElementType elementType, int linkVID) {
-			this(source, destination, linkVID);
-			myLinkElement = linkElement;
-			final IElementType elementTypeCopy = elementType;
-			mySemanticAdapter = new EObjectAdapter(linkElement) {
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return elementTypeCopy;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-		}
-
-		/**
-		 * @generated
-		 */
-		protected LinkDescriptor(EObject source, EObject destination,
-				IElementType elementType, int linkVID) {
-			this(source, destination, linkVID);
-			myLinkElement = null;
-			final IElementType elementTypeCopy = elementType;
-			mySemanticAdapter = new IAdaptable() {
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return elementTypeCopy;
-					}
-					return null;
-				}
-			};
-		}
-
-		/**
-		 * @generated
-		 */
-		private LinkDescriptor(EObject source, EObject destination, int linkVID) {
-			mySource = source;
-			myDestination = destination;
-			myVisualID = linkVID;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getSource() {
-			return mySource;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getDestination() {
-			return myDestination;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getLinkElement() {
-			return myLinkElement;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected int getVisualID() {
-			return myVisualID;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected IAdaptable getSemanticAdapter() {
-			return mySemanticAdapter;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeCanonicalEditPolicy.java
deleted file mode 100644
index 9721b5d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 41040cd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeGraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeItemSemanticEditPolicy.java
deleted file mode 100644
index 0939b0f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityFinalNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityFinalNode;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-
-	/**
-	 * @see org.eclipse.epf.gmf.diagram.edit.policies.UMLBaseItemSemanticEditPolicy#getCreateOutgoing(org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest)
-	 * @modified
-	 */
-	protected Command getCreateOutgoing(CreateRelationshipRequest req) {
-
-		// Validation ActivityFinalNode node should allow only one outgoing connection.
-		if (req.getSource() instanceof ActivityFinalNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return super.getCreateOutgoing(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityItemSemanticEditPolicy.java
deleted file mode 100644
index 3048098..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.emf.commands.core.commands.DuplicateEObjectsCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
-import org.eclipse.epf.diagram.ad.edit.commands.ActivityFinalNodeCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ActivityParameterNodeCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ActivityPartitionCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.DecisionNodeCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ForkNodeCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.InitialNodeCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.JoinNodeCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.MergeNodeCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.StructuredActivityNodeCreateCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		if (UMLElementTypes.ActivityFinalNode_1001 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new ActivityFinalNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.MergeNode_1002 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new MergeNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.ForkNode_1003 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new ForkNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.InitialNode_1004 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new InitialNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.DecisionNode_1005 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new DecisionNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.JoinNode_1006 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new JoinNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.StructuredActivityNode_1007 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new StructuredActivityNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.ActivityPartition_1008 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Group());
-			}
-			return getMSLWrapper(new ActivityPartitionCreateCommand(req));
-		}
-		if (UMLElementTypes.ActivityParameterNode_1009 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new ActivityParameterNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.StructuredActivityNode_1010 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new StructuredActivityNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.StructuredActivityNode_1011 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new StructuredActivityNodeCreateCommand(req));
-		}
-		if (UMLElementTypes.ActivityParameterNode_1012 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Node());
-			}
-			return getMSLWrapper(new ActivityParameterNodeCreateCommand(req));
-		}
-		return super.getCreateCommand(req);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
-		//		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-		//				.getEditingDomain();
-		//		return getMSLWrapper(new DuplicateAnythingCommand(editingDomain, req));
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class DuplicateAnythingCommand extends
-			DuplicateEObjectsCommand {
-
-		/**
-		 * @generated
-		 */
-		public DuplicateAnythingCommand(
-				TransactionalEditingDomain editingDomain,
-				DuplicateElementsRequest req) {
-			super(editingDomain, req.getLabel(), req
-					.getElementsToBeDuplicated(), req
-					.getAllDuplicatedElementsMap());
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2CanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2CanonicalEditPolicy.java
deleted file mode 100644
index da127da..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2CanonicalEditPolicy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class ActivityParameterNode2CanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2GraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2GraphicalNodeEditPolicy.java
deleted file mode 100644
index 4b4f954..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2GraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class ActivityParameterNode2GraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2ItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2ItemSemanticEditPolicy.java
deleted file mode 100644
index f6e5656..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNode2ItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityParameterNode2ItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeCanonicalEditPolicy.java
deleted file mode 100644
index d01e2c1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeCanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 691d9fe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeGraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeItemSemanticEditPolicy.java
deleted file mode 100644
index f318009..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityParameterNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2CanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2CanonicalEditPolicy.java
deleted file mode 100644
index 528da83..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2CanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class ActivityPartition2CanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2GraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2GraphicalNodeEditPolicy.java
deleted file mode 100644
index d1e0c5f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2GraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class ActivityPartition2GraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2ItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2ItemSemanticEditPolicy.java
deleted file mode 100644
index 231ee32..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartition2ItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.Iterator;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartment2EditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityPartition2ItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		addDestroyChildNodesCommand(cc, req.isConfirmationRequired());
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addDestroyChildNodesCommand(CompoundCommand cmd,
-			boolean confirm) {
-		View view = (View) getHost().getModel();
-		for (Iterator it = view.getChildren().iterator(); it.hasNext();) {
-			Node node = (Node) it.next();
-			switch (UMLVisualIDRegistry.getVisualID(node)) {
-			case ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID:
-				for (Iterator cit = node.getChildren().iterator(); cit
-						.hasNext();) {
-					Node cnode = (Node) cit.next();
-					switch (UMLVisualIDRegistry.getVisualID(cnode)) {
-					case ActivityPartition2EditPart.VISUAL_ID:
-						cmd.add(getDestroyElementCommand(cnode, confirm));
-						break;
-					}
-				}
-				break;
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionCanonicalEditPolicy.java
deleted file mode 100644
index f5d998d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionCanonicalEditPolicy.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.ActivityNode;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class ActivityPartitionCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldDeleteView(View view) {
-		// Delete the view if activity partition is not part of the activitynode.
-		if(view.getElement() instanceof ActivityNode){
-			if(!((ActivityNode)view.getElement()).getInPartitions().contains(((View)getHost().getModel()).getElement()))
-				return true;
-		}
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-	/**
-	 * Override to avoid the duplicate links generation.
-	 * Set parent canonicalEditPolicy to false.
-	 */
-	@Override
-	public void enableRefresh(boolean enable) {
-		EditPart part  = getHost().getParent();
-		if(part instanceof ActivityEditPart){
-			Object view = part.getModel();
-			EObject semanticHost = ((View)view).getElement();
-			if (semanticHost != null) {
-				List ceps = CanonicalEditPolicy.getRegisteredEditPolicies(semanticHost);
-				for ( int i = 0; i < ceps.size(); i++ ) {
-					CanonicalEditPolicy cep = (CanonicalEditPolicy)ceps.get(i);
-					cep.enableRefresh(enable); 
-				}
-			}
-		}
-		super.enableRefresh(enable);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionGraphicalNodeEditPolicy.java
deleted file mode 100644
index c27cf2a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class ActivityPartitionGraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionItemSemanticEditPolicy.java
deleted file mode 100644
index 8b64281..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.Iterator;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartmentEditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityPartitionItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		addDestroyChildNodesCommand(cc, req.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addDestroyChildNodesCommand(CompoundCommand cmd,
-			boolean confirm) {
-		View view = (View) getHost().getModel();
-		for (Iterator it = view.getChildren().iterator(); it.hasNext();) {
-			Node node = (Node) it.next();
-			switch (UMLVisualIDRegistry.getVisualID(node)) {
-			case ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID:
-				for (Iterator cit = node.getChildren().iterator(); cit
-						.hasNext();) {
-					Node cnode = (Node) cit.next();
-					switch (UMLVisualIDRegistry.getVisualID(cnode)) {
-					case ActivityPartition2EditPart.VISUAL_ID:
-						cmd.add(getDestroyElementCommand(cnode, confirm));
-						break;
-					}
-				}
-				break;
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartment2CanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartment2CanonicalEditPolicy.java
deleted file mode 100644
index c950640..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartment2CanonicalEditPolicy.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.uml2.uml.ActivityPartition;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartment2CanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		EObject modelObject = ((View) getHost().getModel()).getElement();
-		View viewObject = (View) getHost().getModel();
-		EObject nextValue;
-		int nodeVID;
-		for (Iterator values = ((ActivityPartition) modelObject)
-				.getSubpartitions().iterator(); values.hasNext();) {
-			nextValue = (EObject) values.next();
-			nodeVID = UMLVisualIDRegistry
-					.getNodeVisualID(viewObject, nextValue);
-			if (ActivityPartition2EditPart.VISUAL_ID == nodeVID) {
-				result.add(nextValue);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			return view.isSetElement()
-					&& (view.getElement() == null || view.getElement()
-							.eIsProxy());
-		}
-		int nodeVID = UMLVisualIDRegistry.getVisualID(view);
-		switch (nodeVID) {
-		case ActivityPartition2EditPart.VISUAL_ID:
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy.java
deleted file mode 100644
index 44c76d6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.ad.edit.commands.ActivityPartitionCreateCommand;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartment2ItemSemanticEditPolicy
-		extends UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		if (UMLElementTypes.ActivityPartition_2001 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivityPartition_Subpartition());
-			}
-			return getMSLWrapper(new ActivityPartitionCreateCommand(req));
-		}
-		return super.getCreateCommand(req);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartmentCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartmentCanonicalEditPolicy.java
deleted file mode 100644
index e86b752..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartmentCanonicalEditPolicy.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.uml2.uml.ActivityPartition;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartmentCanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @modified
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		EObject modelObject = ((View) getHost().getModel()).getElement();
-		View viewObject = (View) getHost().getModel();
-		EObject nextValue;
-		int nodeVID;
-		// modified to check ActivityPartition or not. to avoid classcast exception.
-		if (modelObject instanceof ActivityPartition) {
-			for (Iterator values = ((ActivityPartition) modelObject)
-					.getSubpartitions().iterator(); values.hasNext();) {
-				nextValue = (EObject) values.next();
-				nodeVID = UMLVisualIDRegistry.getNodeVisualID(viewObject,
-						nextValue);
-				if (ActivityPartition2EditPart.VISUAL_ID == nodeVID) {
-					result.add(nextValue);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			return view.isSetElement()
-					&& (view.getElement() == null || view.getElement()
-							.eIsProxy());
-		}
-		int nodeVID = UMLVisualIDRegistry.getVisualID(view);
-		switch (nodeVID) {
-		case ActivityPartition2EditPart.VISUAL_ID:
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartmentItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartmentItemSemanticEditPolicy.java
deleted file mode 100644
index 315f1b2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ActivityPartitionPartitionCampartmentItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.ad.custom.commands.ActivityPartitionDestroyCommand;
-import org.eclipse.epf.diagram.ad.custom.commands.CreateActivityNodeInActivityPartition;
-import org.eclipse.epf.diagram.ad.edit.commands.ActivityPartitionCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.diagram.core.commands.AddCommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartmentItemSemanticEditPolicy extends UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		if (UMLElementTypes.ActivityPartition_2001 == req.getElementType()) {		
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE.getActivityPartition_Subpartition());
-			}
-			return getMSLWrapper(new CreateActivityPartition_2001Command(req));
-		}
-		
-		// modified START
-		Command command = getCreateActivityNodeCommand(req);
-		if (command != null) {
-			return command;
-		}
-		// modified END
-		return super.getCreateCommand(req);
-	}
-
-	/**
-	 * @modified
-	 */
-	private static class CreateActivityPartition_2001Command extends
-			CreateElementCommand {
-
-		/**
-		 * @generated
-		 */
-		public CreateActivityPartition_2001Command(CreateElementRequest req) {
-			super(req);
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EClass getEClassToEdit() {
-			return UMLPackage.eINSTANCE.getActivityPartition();
-		};
-
-		/**
-		 * @generated
-		 */
-		protected EObject getElementToEdit() {
-			EObject container = ((CreateElementRequest) getRequest())
-					.getContainer();
-			if (container instanceof View) {
-				container = ((View) container).getElement();
-			}
-			return container;
-		}
-	}
-	
-	
-	/**
-	 * @modified
-	 */
-	private Command getCreateActivityNodeCommand(CreateElementRequest req) {
-		if (UMLElementTypes.StructuredActivityNode_1007 == req.getElementType()
-				|| UMLElementTypes.StructuredActivityNode_1010 == req
-						.getElementType()
-				|| UMLElementTypes.StructuredActivityNode_1011 == req
-						.getElementType()
-				|| UMLElementTypes.MergeNode_1002 == req.getElementType()
-				|| UMLElementTypes.ForkNode_1003 == req.getElementType()
-				|| UMLElementTypes.InitialNode_1004 == req.getElementType()
-				|| UMLElementTypes.DecisionNode_1005 == req.getElementType()
-				|| UMLElementTypes.JoinNode_1006 == req.getElementType()
-				|| UMLElementTypes.ActivityFinalNode_1001 == req
-						.getElementType()
-				|| UMLElementTypes.ActivityParameterNode_1009 == req
-						.getElementType()
-				|| UMLElementTypes.ActivityParameterNode_1012 == req
-						.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivityPartition_Node());
-			}
-			return getMSLWrapper(new CreateActivityNodeInActivityPartition(req));
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.gmf.diagram.edit.policies.UMLBaseItemSemanticEditPolicy#getCreateOutgoing(org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest)
-	 * @modified
-	 */
-	protected Command getCreateOutgoing(CreateRelationshipRequest req) {
-		return UnexecutableCommand.INSTANCE;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.ad.edit.policies.UMLBaseItemSemanticEditPolicy#getDestroyElementCommand(org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest)
-	 * @modified
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		/* modify START */
-		CompositeCommand cc = new CompositeCommand(DiagramCoreResources.deleteCommand_label);
-		getReparentingCommand(req, cc);
-		cc.compose(new CommandProxy(getMSLWrapper(new ActivityPartitionDestroyCommand(req, getHost()))));
-		return cc.isEmpty() ? null : new ICommandProxy(cc.reduce());
-		/* modify END */
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.ad.edit.policies.UMLBaseItemSemanticEditPolicy#getDestroyReferenceCommand(org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest)
-	 * @modified
-	 */
-	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {
-		return super.getDestroyReferenceCommand(req);
-	}
-
-	
-	/**
-	 * Command to reparenting the elements to Activity before deleting the ActivityPartition.
- 	 *
-	 * @param request the request
-	 * @return command
-	 */
-	protected Command getReparentingCommand(DestroyElementRequest request, CompositeCommand cc) {
-		Iterator editParts = getHost().getChildren().iterator();
-		Object parent  =  ((EditPart)getHost()).getParent();
-		EReference feature = UMLPackage.eINSTANCE.getActivity_Node();
-		
-		if(!(parent instanceof ActivityEditPart)){
-			return UnexecutableCommand.INSTANCE;
-		}
-		
-		View container = (View)((EditPart)parent).getAdapter(View.class);
-		
-		EObject containerContext = container == null ? null : ViewUtil.resolveSemanticElement(container);
-		while ( editParts.hasNext() ) {
-			IGraphicalEditPart ep = (IGraphicalEditPart)editParts.next();
-			if ( ep instanceof LabelEditPart ) {
-				continue;
-			}
-			
-			View view = (View)ep.getAdapter(View.class);
-			if ( view == null ) {
-				continue;
-			}
-			
-			EObject semanticContext = ViewUtil.resolveSemanticElement(view);
-			if(semanticContext instanceof ActivityPartition)
-				continue;
-			
-			
-			 TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-	            .getEditingDomain();
-			 
-			if ( semanticContext == null ) {
-				AddCommand addCommand = new AddCommand(editingDomain, new EObjectAdapter(container),
-						  new EObjectAdapter(view));
-				cc.compose(addCommand);
-			}
-			else if ( containerContext != null ) {
-				if (containerContext.equals(semanticContext.eContainer())
-						&& feature == semanticContext.eContainmentFeature()) {
-					cc.compose(new ReparentingElementsCommand(request, semanticContext));
-					AddCommand addCommand = new AddCommand(editingDomain, new EObjectAdapter(container),
-							  new EObjectAdapter(view));
-					cc.compose(addCommand);
-				}
-				else{
-					Command moveSemanticCmd =
-					((ActivityEditPart)parent).getCommand(
-						new EditCommandRequestWrapper(
-							new MoveRequest(editingDomain, containerContext, 
-									UMLPackage.eINSTANCE.getActivity_Node(),
-									semanticContext)));
-					if(moveSemanticCmd  != null){
-						cc.compose(new CommandProxy(moveSemanticCmd));
-					}
-//					cc.compose(new ReparentingElementsCommand(request, semanticContext));
-					//move notation
-					AddCommand addCommand = new AddCommand(editingDomain, new EObjectAdapter(container),
-							  new EObjectAdapter(view));
-					cc.compose(addCommand);
-				}
-			}
-		}
-		return cc.isEmpty() ? null : new ICommandProxy(cc.reduce());
-	}
-	
-	public class ReparentingElementsCommand extends EditElementCommand{
-
-		private final EObject moveElement;
-		
-		public ReparentingElementsCommand(DestroyElementRequest req, EObject element) {
-			this(DiagramCoreResources.deleteCommand_label, element, req);
-		}
-		
-		protected ReparentingElementsCommand(String label, EObject elementToEdit, 
-				IEditCommandRequest request) {
-			super(label, elementToEdit, request);
-			this.moveElement = elementToEdit; 
-		}
-
-		@Override
-		protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-			View view = (View)getHost().getModel();
-			if(view.getElement() instanceof ActivityPartition){
-				if(moveElement instanceof ActivityNode){
-					((ActivityNode)moveElement).getInPartitions().remove(view.getElement());
-				}
-			}
-			return null;
-		}
-		@Override
-		public boolean canExecute() {
-			if(moveElement != null) return true;
-			return false;
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ControlFlowItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ControlFlowItemSemanticEditPolicy.java
deleted file mode 100644
index 5087e3d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ControlFlowItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-
-/**
- * @generated
- */
-public class ControlFlowItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		return getMSLWrapper(new DestroyElementCommand(req));
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeCanonicalEditPolicy.java
deleted file mode 100644
index de5f06f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class DecisionNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 6ae1790..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class DecisionNodeGraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeItemSemanticEditPolicy.java
deleted file mode 100644
index 9d33528..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/DecisionNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.DecisionNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class DecisionNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.ad.edit.policies.UMLBaseItemSemanticEditPolicy#getCreateIncomingComplete(org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest)
-	 * @modified
-	 */
-	protected Command getCreateIncomingComplete(CreateRelationshipRequest req) {
-		// allow maximum only one incoming connection to decision node from other activity node
-		//
-		if (req.getTarget() instanceof DecisionNode) {
-			DecisionNode decision = (DecisionNode) req.getTarget();			
-			for (ActivityEdge link : decision.getIncomings()) {
-				if(link.eContainer() != null && link.getSource() != null) {
-					return UnexecutableCommand.INSTANCE;
-				}
-			}
-		}
-		return super.getCreateIncomingComplete(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeCanonicalEditPolicy.java
deleted file mode 100644
index 9eaf804..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class ForkNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index ee5e1f8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class ForkNodeGraphicalNodeEditPolicy extends UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeItemSemanticEditPolicy.java
deleted file mode 100644
index 2f4eb6f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/ForkNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.List;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ForkNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.ad.edit.policies.UMLBaseItemSemanticEditPolicy#getCreateIncomingComplete(org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest)
-	 * @modified
-	 */
-	protected Command getCreateIncomingComplete(CreateRelationshipRequest req) {
-		if (req.getTarget() instanceof ForkNode) {
-			ForkNode fork = (ForkNode) req.getTarget();
-			List list = fork.getIncomings();
-			if (list != null && list.size() >= 1) {
-				return UnexecutableCommand.INSTANCE;
-			}
-		}
-		return super.getCreateIncomingComplete(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeCanonicalEditPolicy.java
deleted file mode 100644
index 2956da5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class InitialNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 862539b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class InitialNodeGraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeItemSemanticEditPolicy.java
deleted file mode 100644
index cbc00e0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/InitialNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.InitialNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class InitialNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-
-	/**
-	 * @see org.eclipse.epf.gmf.diagram.edit.policies.UMLBaseItemSemanticEditPolicy#getCreateIncomingComplete(org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest)
-	 * @modified
-	 */
-	protected Command getCreateIncomingComplete(CreateRelationshipRequest req) {
-		if (req.getTarget() instanceof InitialNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return super.getCreateIncomingComplete(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeCanonicalEditPolicy.java
deleted file mode 100644
index 7fb4669..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class JoinNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 319c65a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class JoinNodeGraphicalNodeEditPolicy extends UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeItemSemanticEditPolicy.java
deleted file mode 100644
index a21d2d1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/JoinNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.List;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.JoinNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class JoinNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-
-	/**
-	 * @see org.eclipse.epf.gmf.diagram.edit.policies.UMLBaseItemSemanticEditPolicy#getCreateOutgoing(org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest)
-	 * @modified
-	 */
-	protected Command getCreateOutgoing(CreateRelationshipRequest req) {
-		// Validation Join Node should allow only one outgoing connection.
-		if (req.getSource() instanceof JoinNode) {
-			JoinNode join = (JoinNode) req.getSource();
-			List list = join.getOutgoings();
-			if (list != null && list.size() >= 1) {
-				return UnexecutableCommand.INSTANCE;
-			}
-		}
-		return super.getCreateOutgoing(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeCanonicalEditPolicy.java
deleted file mode 100644
index a867ea4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class MergeNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 2559f86..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class MergeNodeGraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeItemSemanticEditPolicy.java
deleted file mode 100644
index 51899a7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/MergeNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.List;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.MergeNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class MergeNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-
-	/**
-	 * @see org.eclipse.epf.gmf.diagram.edit.policies.UMLBaseItemSemanticEditPolicy#getCreateOutgoing(org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest)
-	 * @modified
-	 */
-	protected Command getCreateOutgoing(CreateRelationshipRequest req) {
-
-		// Validation merge node should allow only one outgoing connection.
-		if (req.getSource() instanceof MergeNode) {
-			MergeNode join = (MergeNode) req.getSource();
-			List list = join.getOutgoings();
-			if (list != null && list.size() >= 1) {
-				return UnexecutableCommand.INSTANCE;
-			}
-		}
-		return super.getCreateOutgoing(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2CanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2CanonicalEditPolicy.java
deleted file mode 100644
index 7db3f33..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2CanonicalEditPolicy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class StructuredActivityNode2CanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2GraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2GraphicalNodeEditPolicy.java
deleted file mode 100644
index bd599de..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2GraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class StructuredActivityNode2GraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2ItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2ItemSemanticEditPolicy.java
deleted file mode 100644
index b377819..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode2ItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class StructuredActivityNode2ItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3CanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3CanonicalEditPolicy.java
deleted file mode 100644
index 7680d3c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3CanonicalEditPolicy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class StructuredActivityNode3CanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3GraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3GraphicalNodeEditPolicy.java
deleted file mode 100644
index 5e6788a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3GraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class StructuredActivityNode3GraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3ItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3ItemSemanticEditPolicy.java
deleted file mode 100644
index dc70e93..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNode3ItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class StructuredActivityNode3ItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeCanonicalEditPolicy.java
deleted file mode 100644
index c90175e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeCanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index d93cb08..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeGraphicalNodeEditPolicy extends
-		UMLGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeItemSemanticEditPolicy.java
deleted file mode 100644
index 1cfb938..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/StructuredActivityNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowCreateCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeItemSemanticEditPolicy extends
-		UMLBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-//		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-//			return req.getTarget() == null ? getCreateStartOutgoingControlFlow_3001Command(req)
-//					: getCreateCompleteIncomingControlFlow_3001Command(req);
-//		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingControlFlow_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof ActivityNode
-				|| false == targetEObject instanceof ActivityNode) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		ActivityNode source = (ActivityNode) sourceEObject;
-		ActivityNode target = (ActivityNode) targetEObject;
-		StructuredActivityNode container = (StructuredActivityNode) getRelationshipContainer(
-				source, UMLPackage.eINSTANCE.getStructuredActivityNode(), req
-						.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!UMLBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateControlFlow_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(UMLPackage.eINSTANCE
-					.getStructuredActivityNode_Edge());
-		}
-		return getMSLWrapper(new ControlFlowCreateCommand(req, container,
-				source, target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-//		switch (getVisualID(req)) {
-//		case ControlFlowEditPart.VISUAL_ID:
-//			return getMSLWrapper(new ControlFlowReorientCommand(req));
-//		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLBaseItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLBaseItemSemanticEditPolicy.java
deleted file mode 100644
index 55dcf43..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLBaseItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.ad.custom.commands.CreateIncomingControlFlowCommand;
-import org.eclipse.epf.diagram.ad.custom.commands.CreateOutgoingControlFlowCommand;
-import org.eclipse.epf.diagram.ad.edit.commands.ControlFlowReorientCommand;
-import org.eclipse.epf.diagram.ad.edit.helpers.UMLBaseEditHelper;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramCoreValidation;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.ReconnectRequest;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.SemanticEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IEditHelperContext;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class UMLBaseItemSemanticEditPolicy extends SemanticEditPolicy {
-
-	/**
-	 * Extended request data key to hold editpart visual id.
-	 * 
-	 * @generated
-	 */
-	public static final String VISUAL_ID_KEY = "visual_id"; //$NON-NLS-1$
-
-	/**
-	 * Add visual id of edited editpart to extended data of the request so
-	 * command switch can decide what kind of diagram element is being edited.
-	 * It is done in those cases when it's not possible to deduce diagram
-	 * element kind from domain element.
-	 * 
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof ReconnectRequest) {
-			Object view = ((ReconnectRequest) request).getConnectionEditPart()
-					.getModel();
-			if (view instanceof View) {
-				Integer id = new Integer(UMLVisualIDRegistry
-						.getVisualID((View) view));
-				request.getExtendedData().put(VISUAL_ID_KEY, id);
-			}
-		}
-		return super.getCommand(request);
-	}
-
-	/**
-	 * Returns visual id from request parameters.
-	 * 
-	 * @generated
-	 */
-	protected int getVisualID(IEditCommandRequest request) {
-		Object id = request.getParameter(VISUAL_ID_KEY);
-		return id instanceof Integer ? ((Integer) id).intValue() : -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSemanticCommand(IEditCommandRequest request) {
-		IEditCommandRequest completedRequest = completeRequest(request);
-		Object editHelperContext = completedRequest.getEditHelperContext();
-		if (editHelperContext instanceof View
-				|| (editHelperContext instanceof IEditHelperContext && ((IEditHelperContext) editHelperContext)
-						.getEObject() instanceof View)) {
-			// no semantic commands are provided for pure design elements
-			return null;
-		}
-		if (editHelperContext == null) {
-			editHelperContext = ViewUtil
-					.resolveSemanticElement((View) getHost().getModel());
-		}
-		IElementType elementType = ElementTypeRegistry.getInstance()
-				.getElementType(editHelperContext);
-		if (elementType == ElementTypeRegistry.getInstance().getType(
-				"org.eclipse.gmf.runtime.emf.type.core.default")) { //$NON-NLS-1$ 
-			elementType = null;
-		}
-		Command epCommand = getSemanticCommandSwitch(completedRequest);
-		if (epCommand != null) {
-			ICommand command = epCommand instanceof ICommandProxy ? ((ICommandProxy) epCommand)
-					.getICommand()
-					: new CommandProxy(epCommand);
-			completedRequest.setParameter(
-					UMLBaseEditHelper.EDIT_POLICY_COMMAND, command);
-		}
-		Command ehCommand = null;
-		if (elementType != null) {
-			ICommand command = elementType.getEditCommand(completedRequest);
-			if (command != null) {
-				if (!(command instanceof CompositeTransactionalCommand)) {
-					TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-							.getEditingDomain();
-					command = new CompositeTransactionalCommand(editingDomain,
-							null).compose(command);
-				}
-				ehCommand = new ICommandProxy(command);
-			}
-		}
-		boolean shouldProceed = true;
-		if (completedRequest instanceof DestroyRequest) {
-			shouldProceed = shouldProceed((DestroyRequest) completedRequest);
-		}
-		if (shouldProceed) {
-			if (completedRequest instanceof DestroyRequest) {
-				TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-						.getEditingDomain();
-				Command deleteViewCommand = new ICommandProxy(
-						new DeleteCommand(editingDomain, (View) getHost()
-								.getModel()));
-				ehCommand = ehCommand == null ? deleteViewCommand : ehCommand
-						.chain(deleteViewCommand);
-			}
-			return ehCommand;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSemanticCommandSwitch(IEditCommandRequest req) {
-		if (req instanceof CreateRelationshipRequest) {
-			return getCreateRelationshipCommand((CreateRelationshipRequest) req);
-		} else if (req instanceof CreateElementRequest) {
-			return getCreateCommand((CreateElementRequest) req);
-		} else if (req instanceof ConfigureRequest) {
-			return getConfigureCommand((ConfigureRequest) req);
-		} else if (req instanceof DestroyElementRequest) {
-			return getDestroyElementCommand((DestroyElementRequest) req);
-		} else if (req instanceof DestroyReferenceRequest) {
-			return getDestroyReferenceCommand((DestroyReferenceRequest) req);
-		} else if (req instanceof DuplicateElementsRequest) {
-			return getDuplicateCommand((DuplicateElementsRequest) req);
-		} else if (req instanceof GetEditContextRequest) {
-			return getEditContextCommand((GetEditContextRequest) req);
-		} else if (req instanceof MoveRequest) {
-			return getMoveCommand((MoveRequest) req);
-		} else if (req instanceof ReorientReferenceRelationshipRequest) {
-			return getReorientReferenceRelationshipCommand((ReorientReferenceRelationshipRequest) req);
-		} else if (req instanceof ReorientRelationshipRequest) {
-			return getReorientRelationshipCommand((ReorientRelationshipRequest) req);
-		} else if (req instanceof SetRequest) {
-			return getSetCommand((SetRequest) req);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getConfigureCommand(ConfigureRequest req) {
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		if (UMLElementTypes.ControlFlow_3001 == req.getElementType()) {
-			return req.getTarget() == null ? getCreateOutgoing(req)
-					: getCreateIncomingComplete(req);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSetCommand(SetRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getEditContextCommand(GetEditContextRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getMoveCommand(MoveRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getReorientReferenceRelationshipCommand(
-			ReorientReferenceRelationshipRequest req) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	/*
-	 * @modified
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		switch (getVisualID(req)) {
-		case ControlFlowEditPart.VISUAL_ID:
-			ControlFlowReorientCommand cmd = new ControlFlowReorientCommand(req);
-			cmd.setHost(getHost());
-			return getMSLWrapper(cmd);
-		}
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getMSLWrapper(ICommand cmd) {
-		return new ICommandProxy(cmd);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getSemanticElement() {
-		return ViewUtil.resolveSemanticElement((View) getHost().getModel());
-	}
-
-	/**
-	 * Finds container element for the new relationship of the specified type.
-	 * Default implementation goes up by containment hierarchy starting from the
-	 * specified element and returns the first element that is instance of the
-	 * specified container class.
-	 * 
-	 * @generated
-	 */
-	protected EObject getRelationshipContainer(Object uelement,
-			EClass containerClass, IElementType relationshipType) {
-		if (uelement instanceof EObject) {
-			EObject element = (EObject) uelement;
-			for (; element != null; element = element.eContainer()) {
-				if (containerClass.isSuperTypeOf(element.eClass())) {
-					return element;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns editing domain from the host edit part.
-	 * 
-	 * @generated
-	 */
-	protected TransactionalEditingDomain getEditingDomain() {
-		return ((IGraphicalEditPart) getHost()).getEditingDomain();
-	}
-
-	/**
-	 * Creates command to destroy the link.
-	 * 
-	 * @modified
-	 */
-	protected Command getDestroyElementCommand(View view, boolean confirm) {
-		EditPart editPart = (EditPart) getHost().getViewer()
-				.getEditPartRegistry().get(view);
-
-		// some views are suppressed and might not have a edit part
-		//
-		if(editPart == null) {
-			return null;
-		}
-		
-		DestroyElementRequest request = new DestroyElementRequest(
-				getEditingDomain(), confirm);
-		return editPart.getCommand(new EditCommandRequestWrapper(request,
-				Collections.EMPTY_MAP));
-	}
-
-	/**
-	 * Creates commands to destroy all host incoming and outgoing links.
-	 * 
-	 * @modified
-	 */
-	protected CompoundCommand getDestroyEdgesCommand(boolean confirm) {
-		CompoundCommand cmd = new CompoundCommand();
-		View view = (View) getHost().getModel();
-		for (Iterator it = view.getSourceEdges().iterator(); it.hasNext();) {
-			Command destroyCmd = getDestroyElementCommand((Edge) it.next(), confirm);
-			if(destroyCmd != null) {
-				cmd.add(destroyCmd);
-			}
-		}
-		for (Iterator it = view.getTargetEdges().iterator(); it.hasNext();) {
-			Command destroyCmd = getDestroyElementCommand((Edge) it.next(), confirm);
-			if(destroyCmd != null) {
-				cmd.add(destroyCmd);
-			}
-		}
-		return cmd;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static class LinkConstraints {
-		/**
-		 * @generated
-		 */
-		private static final String OPPOSITE_END_VAR = "oppositeEnd"; //$NON-NLS-1$
-
-		/**
-		 * @generated
-		 */
-		public static boolean canCreateControlFlow_3001(
-				StructuredActivityNode container, ActivityNode source,
-				ActivityNode target) {
-			return canExistControlFlow_3001(container, source, target);
-		}
-
-		/**
-		 * @generated
-		 */
-		public static boolean canExistControlFlow_3001(
-				StructuredActivityNode container, ActivityNode source,
-				ActivityNode target) {
-			return true;
-		}
-
-	}
-
-	/**
-	 * Children should override this, for any extra validations.
-	 * 
-	 * @modified
-	 */
-	protected Command getCreateIncomingComplete(CreateRelationshipRequest req) {
-		Command command;
-		if (req.getSource() == req.getTarget()) {
-			return new Command() {
-			};
-		}
-
-		if (!(req.getSource() instanceof ActivityNode)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getTarget() instanceof ActivityPartition) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		final EObject element = (EObject) req.getSource();
-		if (element == null || !(element instanceof ActivityNode)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (isDuplicateRelationship(req.getSource(), req.getTarget())) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		if (DiagramCoreValidation.canConnect((EditPart) getHost(), req
-				.getSource(), req.getTarget()) != null)
-			return UnexecutableCommand.INSTANCE;
-
-		if (element instanceof ActivityNode) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Edge());
-			}
-			command = getMSLWrapper(new CreateIncomingControlFlowCommand(req,
-					element.eContainer()));
-
-			// if (req.getTarget() != req.getSource()) {
-			// command = command.chain(new CreatePredecessorCommand(req));
-			// }
-			return command;
-
-		}
-		return null;
-	}
-
-	/**
-	 * Check if the link between two ends already exists.
-	 * 
-	 * @modified
-	 */
-	private boolean isDuplicateRelationship(EObject source, EObject target) {
-		EObject container = source.eContainer();
-		if (container instanceof Activity) {
-			Activity activity = (Activity) container;
-			List list = activity.getEdges();
-			for (Iterator iter = list.iterator(); iter.hasNext();) {
-				ActivityEdge element = (ActivityEdge) iter.next();
-				if ((element.getSource() == source)
-						&& element.getTarget() == target) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getCreateOutgoing(CreateRelationshipRequest req) {
-		if (!(req.getSource() instanceof ActivityNode)) {
-			return null;
-		}
-		final EObject element = (EObject) req.getTarget();
-		if (element == null || !(element instanceof ActivityNode)) {
-			return new Command() {
-			};
-		}
-		if (element instanceof ActivityNode) {
-			// TODO: check the same type, don't create connection.
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(UMLPackage.eINSTANCE
-						.getActivity_Edge());
-			}
-		}
-		return getMSLWrapper(new CreateOutgoingControlFlowCommand(req));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLExtNodeLabelHostLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLExtNodeLabelHostLayoutEditPolicy.java
deleted file mode 100644
index 6650d27..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLExtNodeLabelHostLayoutEditPolicy.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class UMLExtNodeLabelHostLayoutEditPolicy extends XYLayoutEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private LayoutEditPolicy realLayoutEditPolicy;
-
-	/**
-	 * @generated
-	 */
-	public LayoutEditPolicy getRealLayoutEditPolicy() {
-		return realLayoutEditPolicy;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setRealLayoutEditPolicy(LayoutEditPolicy realLayoutEditPolicy) {
-		this.realLayoutEditPolicy = realLayoutEditPolicy;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isExternalLabel(EditPart editPart) {
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected final List getExternalLabels(GroupRequest request) {
-		List editParts = new ArrayList();
-		if (request.getEditParts() != null) {
-			for (Iterator it = request.getEditParts().iterator(); it.hasNext();) {
-				EditPart editPart = (EditPart) it.next();
-				if (isExternalLabel(editPart)) {
-					editParts.add(editPart);
-				}
-			}
-		}
-		return editParts;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (REQ_MOVE_CHILDREN.equals(request.getType())) {
-			ChangeBoundsRequest cbRequest = (ChangeBoundsRequest) request;
-			List extLabels = getExternalLabels(cbRequest);
-			if (!extLabels.isEmpty()) {
-				List editParts = cbRequest.getEditParts();
-				Command cmd = null;
-				if (realLayoutEditPolicy != null
-						&& editParts.size() > extLabels.size()) {
-					List other = new ArrayList(editParts);
-					other.removeAll(extLabels);
-					cbRequest.setEditParts(other);
-					cmd = realLayoutEditPolicy.getCommand(request);
-				}
-				cbRequest.setEditParts(extLabels);
-				Command extLabelsCmd = getMoveChildrenCommand(request);
-				cbRequest.setEditParts(editParts);
-				return cmd == null ? extLabelsCmd : cmd.chain(extLabelsCmd);
-			}
-		}
-		if (request instanceof GroupRequest) {
-			List extLabels = getExternalLabels((GroupRequest) request);
-			if (!extLabels.isEmpty()) {
-				return null;
-			}
-		}
-		return realLayoutEditPolicy == null ? null : realLayoutEditPolicy
-				.getCommand(request);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getConstraintFor(ChangeBoundsRequest request,
-			GraphicalEditPart child) {
-		int dx = ((Integer) ViewUtil.getStructuralFeatureValue((View) child
-				.getModel(), NotationPackage.eINSTANCE.getLocation_X()))
-				.intValue();
-		int dy = ((Integer) ViewUtil.getStructuralFeatureValue((View) child
-				.getModel(), NotationPackage.eINSTANCE.getLocation_Y()))
-				.intValue();
-		Rectangle r = new Rectangle(dx, dy, 0, 0);
-		child.getFigure().translateToAbsolute(r);
-		r.translate(request.getMoveDelta());
-		child.getFigure().translateToRelative(r);
-		return r;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean understandsRequest(Request req) {
-		if (realLayoutEditPolicy != null
-				&& realLayoutEditPolicy.understandsRequest(req)) {
-			return true;
-		}
-		return super.understandsRequest(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateChild(EditPart child) {
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setHost(EditPart host) {
-		super.setHost(host);
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.setHost(host);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void activate() {
-		super.activate();
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.activate();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void deactivate() {
-		super.deactivate();
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.deactivate();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (realLayoutEditPolicy != null) {
-			return realLayoutEditPolicy.getTargetEditPart(request);
-		} else {
-			return super.getTargetEditPart(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void showSourceFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.showSourceFeedback(request);
-		} else {
-			super.showSourceFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void eraseSourceFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.eraseSourceFeedback(request);
-		} else {
-			super.eraseSourceFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void showTargetFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.showTargetFeedback(request);
-		} else {
-			super.showTargetFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.eraseTargetFeedback(request);
-		} else {
-			super.eraseTargetFeedback(request);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLGraphicalNodeEditPolicy.java
deleted file mode 100644
index cdbd490..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.diagram.core.edithelpers.CreateElementRequestAdapter;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.GraphicalNodeEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewAndElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.epf.diagram.ad.edit.commands.UMLReorientConnectionViewCommand;
-
-/**
- * @generated
- */
-public class UMLGraphicalNodeEditPolicy extends GraphicalNodeEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected IElementType getElementType(CreateConnectionRequest request) {
-		if (request instanceof CreateConnectionViewAndElementRequest) {
-			CreateElementRequestAdapter requestAdapter = ((CreateConnectionViewAndElementRequest) request)
-					.getConnectionViewAndElementDescriptor()
-					.getCreateElementRequestAdapter();
-			return (IElementType) requestAdapter.getAdapter(IElementType.class);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getConnectionWithReorientedViewCompleteCommand(
-			CreateConnectionRequest request) {
-		ICommandProxy c = (ICommandProxy) super
-				.getConnectionCompleteCommand(request);
-		CompositeCommand cc = (CompositeCommand) c.getICommand();
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		UMLReorientConnectionViewCommand rcvCommand = new UMLReorientConnectionViewCommand(
-				editingDomain, null);
-		rcvCommand.setEdgeAdaptor(getViewAdapter());
-		cc.compose(rcvCommand);
-		return c;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLReferenceConnectionEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLReferenceConnectionEditPolicy.java
deleted file mode 100644
index 7616949..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLReferenceConnectionEditPolicy.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.editparts.AbstractConnectionEditPart;
-import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.diagram.ui.requests.GroupRequestViaKeyboard;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @generated
- */
-public class UMLReferenceConnectionEditPolicy extends ConnectionEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_DIAGRAM_DLG_TITLE = DiagramUIMessages.PromptingDeleteAction_DeleteFromDiagramDialog_Title;
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_DIAGRAM_DLG_MESSAGE = DiagramUIMessages.PromptingDeleteAction_DeleteFromDiagramDialog_Message;
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_MODEL_DLG_TOGGLE_LABEL = DiagramUIMessages.MessageDialogWithToggle_DoNotPromptAgainToggle_label;
-
-	/**
-	 * @generated
-	 */
-	protected final Command getDeleteCommand(GroupRequest deleteRequest) {
-		boolean isDeleteFromKeyBoard = deleteRequest instanceof GroupRequestViaKeyboard;
-		if (shouldDeleteSemantic()) {
-			return createDeleteSemanticCommand(deleteRequest);
-		} else {
-			boolean proceedToDeleteView = true;
-			if (isDeleteFromKeyBoard) {
-				GroupRequestViaKeyboard groupRequestViaKeyboard = (GroupRequestViaKeyboard) deleteRequest;
-				if (groupRequestViaKeyboard.isShowInformationDialog()) {
-					proceedToDeleteView = showPrompt();
-					groupRequestViaKeyboard.setShowInformationDialog(false);
-					if (!(proceedToDeleteView))
-						return UnexecutableCommand.INSTANCE;
-				}
-			}
-			return createDeleteViewCommand(deleteRequest);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteSemantic() {
-		Assert.isTrue(getHost() instanceof AbstractConnectionEditPart);
-		AbstractConnectionEditPart cep = (AbstractConnectionEditPart) getHost();
-		boolean isCanonical = false;
-		if (cep.getSource() != null)
-			isCanonical = IsCanonical(cep.getSource());
-		if (cep.getTarget() != null)
-			return isCanonical ? isCanonical : IsCanonical(cep.getTarget());
-		return isCanonical;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean IsCanonical(EditPart ep) {
-		EditPart parent = ep.getParent();
-		return parent instanceof GraphicalEditPart ? ((GraphicalEditPart) parent)
-				.isCanonical()
-				: false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command createDeleteViewCommand(GroupRequest deleteRequest) {
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		return new ICommandProxy(new DeleteCommand(editingDomain,
-				(View) getHost().getModel()));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command createDeleteSemanticCommand(GroupRequest deleteRequest) {
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		EditCommandRequestWrapper semReq = new EditCommandRequestWrapper(
-				new DestroyElementRequest(editingDomain, false), deleteRequest
-						.getExtendedData());
-		Command semanticCmd = getHost().getCommand(semReq);
-		if (semanticCmd != null && semanticCmd.canExecute()) {
-			CompoundCommand cc = new CompoundCommand();
-			cc.add(semanticCmd);
-			return cc;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean showPrompt() {
-		boolean prompt = ((IPreferenceStore) ((IGraphicalEditPart) getHost())
-				.getDiagramPreferencesHint().getPreferenceStore())
-				.getBoolean(IPreferenceConstants.PREF_PROMPT_ON_DEL_FROM_DIAGRAM);
-		if (prompt)
-			if (showMessageDialog())
-				return true;
-			else
-				return false;
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean showMessageDialog() {
-		MessageDialogWithToggle dialog = MessageDialogWithToggle
-				.openYesNoQuestion(Display.getCurrent().getActiveShell(),
-						DELETE_FROM_DIAGRAM_DLG_TITLE,
-						DELETE_FROM_DIAGRAM_DLG_MESSAGE,
-						DELETE_FROM_MODEL_DLG_TOGGLE_LABEL, false,
-						(IPreferenceStore) ((IGraphicalEditPart) getHost())
-								.getDiagramPreferencesHint()
-								.getPreferenceStore(),
-						IPreferenceConstants.PREF_PROMPT_ON_DEL_FROM_DIAGRAM);
-		if (dialog.getReturnCode() == IDialogConstants.YES_ID)
-			return true;
-		else
-			return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof GroupRequestViaKeyboard) {
-			return getDeleteCommand((GroupRequest) request);
-		}
-		return super.getCommand(request);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLTextNonResizableEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLTextNonResizableEditPolicy.java
deleted file mode 100644
index c6f68e5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLTextNonResizableEditPolicy.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.handles.MoveHandle;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.NonResizableEditPolicyEx;
-import org.eclipse.gmf.runtime.diagram.ui.tools.DragEditPartsTrackerEx;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-	/**
- * @generated
- */
-public class UMLTextNonResizableEditPolicy extends NonResizableEditPolicyEx {
-
-	
-		/**
- * @generated
- */
-	private IFigure selectionFeedbackFigure;
-
-		/**
- * @generated
- */
-	private IFigure focusFeedbackFigure;
-
-		/**
- * @generated
- */
-	protected void showPrimarySelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			showSelection();
-			showFocus();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void showSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			hideSelection();
-			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
-			refreshSelectionFeedback();
-			hideFocus();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void hideSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(false);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (selectionFeedbackFigure != null) {
-				removeFeedback(selectionFeedbackFigure);
-				selectionFeedbackFigure = null;
-			}
-			hideFocus();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void showFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			hideFocus();
-			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
-			refreshFocusFeedback();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void hideFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (focusFeedbackFigure != null) {
-				removeFeedback(focusFeedbackFigure);
-				focusFeedbackFigure = null;
-			}
-		}
-	}
-
-		/**
- * @generated
- */
-	protected Rectangle getFeedbackBounds() {
-		Rectangle bounds;
-		if (getHostFigure() instanceof Label) {
-			bounds = ((Label) getHostFigure()).getTextBounds();
-			bounds.intersect(getHostFigure().getBounds());
-		} else {
-			bounds = getHostFigure().getBounds().getCopy();
-		}
-		getHostFigure().getParent().translateToAbsolute(bounds);
-		getFeedbackLayer().translateToRelative(bounds);
-		return bounds;
-	}
-
-		/**
- * @generated
- */
-	protected IFigure createSelectionFeedbackFigure() {
-		if (getHostFigure() instanceof Label) {
-			Label feedbackFigure = new Label();
-			feedbackFigure.setOpaque(true);
-			feedbackFigure.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			feedbackFigure.setForegroundColor(ColorConstants.menuForegroundSelected);
-			return feedbackFigure;
-		} else {
-			RectangleFigure feedbackFigure = new RectangleFigure();
-			feedbackFigure.setFill(false);
-			return feedbackFigure;
-		}
-	}
-
-		/**
- * @generated
- */
-	protected IFigure createFocusFeedbackFigure() {
-		return new Figure() {
-
-			protected void paintFigure(Graphics graphics) {
-				graphics.drawFocus(getBounds().getResized(-1, -1));
-			}
-		};
-	}
-
-		/**
- * @generated
- */
-	protected void updateLabel(Label target) {
-		Label source = (Label) getHostFigure();
-		target.setText(source.getText());
-		target.setTextAlignment(source.getTextAlignment());
-		target.setFont(source.getFont());
-	}
-
-		/**
- * @generated
- */
-	protected void refreshSelectionFeedback() {
-		if (selectionFeedbackFigure != null) {
-			if (selectionFeedbackFigure instanceof Label) {
-				updateLabel((Label) selectionFeedbackFigure);
-				selectionFeedbackFigure.setBounds(getFeedbackBounds());
-			} else {
-				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5, 5));
-			}
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void refreshFocusFeedback() {
-		if (focusFeedbackFigure != null) {
-			focusFeedbackFigure.setBounds(getFeedbackBounds());
-		}
-	}
-
-		/**
- * @generated
- */
-	public void refreshFeedback() {
-		refreshSelectionFeedback();
-		refreshFocusFeedback();
-	}
-
-		/**
- * @generated
- */
-	protected List createSelectionHandles() {
-		MoveHandle moveHandle =
-			new MoveHandle((GraphicalEditPart) getHost());
-		moveHandle.setBorder(null);
-		moveHandle.setDragTracker(new DragEditPartsTrackerEx(getHost()));
-		return Collections.singletonList(moveHandle);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLTextSelectionEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLTextSelectionEditPolicy.java
deleted file mode 100644
index 794befb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/edit/policies/UMLTextSelectionEditPolicy.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.edit.policies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editpolicies.SelectionEditPolicy;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-	/**
- * @generated
- */
-public class UMLTextSelectionEditPolicy extends SelectionEditPolicy {
-
-	
-		/**
- * @generated
- */
-	private IFigure selectionFeedbackFigure;
-
-		/**
- * @generated
- */
-	private IFigure focusFeedbackFigure;
-
-		/**
- * @generated
- */
-	protected void showPrimarySelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			showSelection();
-			showFocus();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void showSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			hideSelection();
-			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
-			refreshSelectionFeedback();
-			hideFocus();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void hideSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(false);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (selectionFeedbackFigure != null) {
-				removeFeedback(selectionFeedbackFigure);
-				selectionFeedbackFigure = null;
-			}
-			hideFocus();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void showFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			hideFocus();
-			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
-			refreshFocusFeedback();
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void hideFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (focusFeedbackFigure != null) {
-				removeFeedback(focusFeedbackFigure);
-				focusFeedbackFigure = null;
-			}
-		}
-	}
-
-		/**
- * @generated
- */
-	protected Rectangle getFeedbackBounds() {
-		Rectangle bounds;
-		if (getHostFigure() instanceof Label) {
-			bounds = ((Label) getHostFigure()).getTextBounds();
-			bounds.intersect(getHostFigure().getBounds());
-		} else {
-			bounds = getHostFigure().getBounds().getCopy();
-		}
-		getHostFigure().getParent().translateToAbsolute(bounds);
-		getFeedbackLayer().translateToRelative(bounds);
-		return bounds;
-	}
-
-		/**
- * @generated
- */
-	protected IFigure createSelectionFeedbackFigure() {
-		if (getHostFigure() instanceof Label) {
-			Label feedbackFigure = new Label();
-			feedbackFigure.setOpaque(true);
-			feedbackFigure.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			feedbackFigure.setForegroundColor(ColorConstants.menuForegroundSelected);
-			return feedbackFigure;
-		} else {
-			RectangleFigure feedbackFigure = new RectangleFigure();
-			feedbackFigure.setFill(false);
-			return feedbackFigure;
-		}
-	}
-
-		/**
- * @generated
- */
-	protected IFigure createFocusFeedbackFigure() {
-		return new Figure() {
-
-			protected void paintFigure(Graphics graphics) {
-				graphics.drawFocus(getBounds().getResized(-1, -1));
-			}
-		};
-	}
-
-		/**
- * @generated
- */
-	protected void updateLabel(Label target) {
-		Label source = (Label) getHostFigure();
-		target.setText(source.getText());
-		target.setTextAlignment(source.getTextAlignment());
-		target.setFont(source.getFont());
-	}
-
-		/**
- * @generated
- */
-	protected void refreshSelectionFeedback() {
-		if (selectionFeedbackFigure != null) {
-			if (selectionFeedbackFigure instanceof Label) {
-				updateLabel((Label) selectionFeedbackFigure);
-				selectionFeedbackFigure.setBounds(getFeedbackBounds());
-			} else {
-				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5, 5));
-			}
-		}
-	}
-
-		/**
- * @generated
- */
-	protected void refreshFocusFeedback() {
-		if (focusFeedbackFigure != null) {
-			focusFeedbackFigure.setBounds(getFeedbackBounds());
-		}
-	}
-
-		/**
- * @generated
- */
-	public void refreshFeedback() {
-		refreshSelectionFeedback();
-		refreshFocusFeedback();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/expressions/UMLAbstractExpression.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/expressions/UMLAbstractExpression.java
deleted file mode 100644
index abb39cb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/expressions/UMLAbstractExpression.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.expressions;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.ETypedElement;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public abstract class UMLAbstractExpression {
-	/**
-	 * @generated
-	 */
-	private static final boolean DISABLED_NO_IMPL_EXCEPTION_LOG = Boolean
-			.valueOf(
-					Platform.getDebugOption(ActivityDiagramEditorPlugin
-							.getInstance().getBundle().getSymbolicName()
-							+ "/debug/disableNoExprImplExceptionLog"))
-			.booleanValue();
-
-	/**
-	 * @generated
-	 */
-	private String body;
-
-	/**
-	 * @generated
-	 */
-	private EClassifier context;
-
-	/**
-	 * @generated
-	 */
-	private Map env;
-
-	/**
-	 * @generated
-	 */
-	private IStatus status = Status.OK_STATUS;
-
-	/**
-	 * @generated
-	 */
-	protected UMLAbstractExpression(EClassifier context) {
-		this.context = context;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected UMLAbstractExpression(String body, EClassifier context, Map env) {
-		this.body = body;
-		this.context = context;
-		this.env = env;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setStatus(int severity, String message, Throwable throwable) {
-		String pluginID = ActivityDiagramEditorPlugin.ID;
-		this.status = new Status(severity, pluginID, -1,
-				(message != null) ? message : "", throwable); //$NON-NLS-1$
-		if (!this.status.isOK()) {
-			ActivityDiagramEditorPlugin
-					.getInstance()
-					.logError(
-							"Expression problem:" + message + "body:" + body, throwable); //$NON-NLS-1$ //$NON-NLS-2$
-
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected abstract Object doEvaluate(Object context, Map env);
-
-	/**
-	 * @generated
-	 */
-	public Object evaluate(Object context) {
-		return evaluate(context, Collections.EMPTY_MAP);
-	}
-
-	/**
-	 * @generated
-	 */
-	public Object evaluate(Object context, Map env) {
-		if (context().isInstance(context)) {
-			try {
-				return doEvaluate(context, env);
-			} catch (Exception e) {
-				if (DISABLED_NO_IMPL_EXCEPTION_LOG
-						&& e instanceof NoImplException) {
-					return null;
-				}
-				ActivityDiagramEditorPlugin.getInstance().logError(
-						"Expression evaluation failure: " + body, e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IStatus getStatus() {
-		return status;
-	}
-
-	/**
-	 * @generated
-	 */
-	public String body() {
-		return body;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EClassifier context() {
-		return context;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Map environment() {
-		return env;
-	}
-
-	/**
-	 * @modified
-	 */
-	public void assignTo(EStructuralFeature feature, EObject target) {
-		//		modified to comment this out
-		evaluate(target);
-		//		value = (value != null) ? performCast(value, feature) : null;
-		//		if (feature.isMany()) {
-		//			Collection destCollection = (Collection) target.eGet(feature);
-		//			destCollection.clear();
-		//			if (value instanceof Collection) {
-		//				Collection valueCollection = (Collection) value;
-		//				for (Iterator it = valueCollection.iterator(); it.hasNext();) {
-		//					destCollection.add(performCast(it.next(), feature));
-		//				}
-		//			} else {
-		//				destCollection.add(value);
-		//			}
-		//			return;
-		//		}
-		//		target.eSet(feature, value);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object performCast(Object value, ETypedElement targetType) {
-		if (targetType.getEType() == null
-				|| targetType.getEType().getInstanceClass() == null) {
-			return value;
-		}
-		Class targetClass = targetType.getEType().getInstanceClass();
-		if (value != null && value instanceof Number) {
-			Number num = (Number) value;
-			Class valClass = value.getClass();
-			Class targetWrapperClass = targetClass;
-			if (targetClass.isPrimitive()) {
-				targetWrapperClass = EcoreUtil.wrapperClassFor(targetClass);
-			}
-			if (valClass.equals(targetWrapperClass)) {
-				return value;
-			}
-			if (Number.class.isAssignableFrom(targetWrapperClass)) {
-				if (targetWrapperClass.equals(Byte.class))
-					return new Byte(num.byteValue());
-				if (targetWrapperClass.equals(Integer.class))
-					return new Integer(num.intValue());
-				if (targetWrapperClass.equals(Short.class))
-					return new Short(num.shortValue());
-				if (targetWrapperClass.equals(Long.class))
-					return new Long(num.longValue());
-				if (targetWrapperClass.equals(BigInteger.class))
-					return BigInteger.valueOf(num.longValue());
-				if (targetWrapperClass.equals(Float.class))
-					return new Float(num.floatValue());
-				if (targetWrapperClass.equals(Double.class))
-					return new Double(num.doubleValue());
-				if (targetWrapperClass.equals(BigDecimal.class))
-					return new BigDecimal(num.doubleValue());
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final UMLAbstractExpression createNullExpression(
-			EClassifier context) {
-		return new UMLAbstractExpression(context) {
-			protected Object doEvaluate(Object context, Map env) {
-				// TODO - log entry about not provider available for this expression
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public static class NoImplException extends RuntimeException {
-		/**
-		 * @generated
-		 */
-		public NoImplException(String message) {
-			super(message);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ActivityDiagramEditor.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ActivityDiagramEditor.java
deleted file mode 100644
index e507ce9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ActivityDiagramEditor.java
+++ /dev/null
@@ -1,729 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.draw2d.DelegatingLayout;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.add.ADDImages;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.bridge.NodeAdapter;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramFileEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeConnectionRequest;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @modified
- * @author skannoor
- */
-public class ActivityDiagramEditor extends AbstractDiagramEditor {
-
-	/**
-	 * @generated
-	 */
-	public static final String ID = "org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public ActivityDiagramEditor() {
-		super(true);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void configureGraphicalViewer() {
-		super.configureGraphicalViewer();
-		DiagramRootEditPart root = (DiagramRootEditPart) getDiagramGraphicalViewer()
-				.getRootEditPart();
-		LayeredPane printableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		FreeformLayer extLabelsLayer = new FreeformLayer();
-		extLabelsLayer.setLayoutManager(new DelegatingLayout());
-//		printableLayers.addLayerAfter(extLabelsLayer,
-//				UMLEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
-//				LayerConstants.PRIMARY_LAYER);
-		LayeredPane scalableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.SCALABLE_LAYERS);
-		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
-		scaledFeedbackLayer.setEnabled(false);
-		scalableLayers.addLayerAfter(scaledFeedbackLayer,
-				LayerConstants.SCALED_FEEDBACK_LAYER,
-				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
-	}
-	
-	/**
-	 * @generated
-	 */
-//	protected PaletteRoot createPaletteRoot(PaletteRoot existingPaletteRoot) {
-//		PaletteRoot root = super.createPaletteRoot(existingPaletteRoot);
-//		new UMLPaletteFactory().fillPalette(root);
-//		return root;
-//	}
-
-	/**
-	 * @modified
-	 */
-	protected PreferencesHint getPreferencesHint() {
-		return new PreferencesHint(ActivityDiagramEditorPlugin.ID);
-	}
-
-	/**
-	 * @modified
-	 */
-	public Object getAdapter(Class type) {
-//		if (type == IPropertySheetPage.class) {
-//			return null;
-//		}
-		return super.getAdapter(type);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected IDocumentProvider getDocumentProvider(IEditorInput input) {
-//		if (input instanceof IFileEditorInput
-//				|| input instanceof URIEditorInput) {
-//			return ActivityDiagramEditorPlugin.getInstance()
-//					.getDocumentProvider();
-//		}
-		return super.getDocumentProvider(input);
-	}
-
-	/**
-	 * @modified
-	 */
-	public TransactionalEditingDomain getEditingDomain() {
-//		IDocument document = getEditorInput() != null ? getDocumentProvider()
-//				.getDocument(getEditorInput()) : null;
-//		if (document instanceof IDiagramDocument) {
-//			return ((IDiagramDocument) document).getEditingDomain();
-//		}
-//		return super.getEditingDomain();
-		return getDiagramManager().getEditingDomain();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setDocumentProvider(IEditorInput input) {
-//		if (input instanceof IFileEditorInput
-//				|| input instanceof URIEditorInput) {
-//			setDocumentProvider(ActivityDiagramEditorPlugin.getInstance()
-//					.getDocumentProvider());
-//		} else {
-//			super.setDocumentProvider(input);
-//		}
-		super.setDocumentProvider(input);
-	}
-
-	/**
-	 * @generated
-	 */
-//	public void gotoMarker(IMarker marker) {
-//		MarkerNavigationService.getInstance().gotoMarker(this, marker);
-//	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isSaveAsAllowed() {
-		return super.isSaveAsAllowed();
-	}
-
-	/**
-	 * @modified
-	 */
-	public void doSaveAs() {
-//		super.doSave(new NullProgressMonitor())
-		performSaveAs(new NullProgressMonitor());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performSaveAs(IProgressMonitor progressMonitor) {
-		Shell shell = getSite().getShell();
-		IEditorInput input = getEditorInput();
-		SaveAsDialog dialog = new SaveAsDialog(shell);
-		IFile original = input instanceof IFileEditorInput ? ((IFileEditorInput) input)
-				.getFile()
-				: null;
-		if (original != null) {
-			dialog.setOriginalFile(original);
-		}
-		dialog.create();
-		IDocumentProvider provider = getDocumentProvider();
-		if (provider == null) {
-			// editor has been programmatically closed while the dialog was open
-			return;
-		}
-		if (provider.isDeleted(input) && original != null) {
-			String message = NLS.bind(
-					"The original file ''{0}'' has been deleted.", original
-							.getName());
-			dialog.setErrorMessage(null);
-			dialog.setMessage(message, IMessageProvider.WARNING);
-		}
-		if (dialog.open() == Window.CANCEL) {
-			if (progressMonitor != null) {
-				progressMonitor.setCanceled(true);
-			}
-			return;
-		}
-		IPath filePath = dialog.getResult();
-		if (filePath == null) {
-			if (progressMonitor != null) {
-				progressMonitor.setCanceled(true);
-			}
-			return;
-		}
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IFile file = workspaceRoot.getFile(filePath);
-		final IEditorInput newInput = new FileEditorInput(file);
-		// Check if the editor is already open
-		IEditorMatchingStrategy matchingStrategy = getEditorDescriptor()
-				.getEditorMatchingStrategy();
-		IEditorReference[] editorRefs = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage()
-				.getEditorReferences();
-		for (int i = 0; i < editorRefs.length; i++) {
-			if (matchingStrategy.matches(editorRefs[i], newInput)) {
-				MessageDialog
-						.openWarning(shell, "Problem During Save As...",
-								"Save could not be completed. Target file is already open in another editor.");
-				return;
-			}
-		}
-		boolean success = false;
-		try {
-			provider.aboutToChange(newInput);
-			getDocumentProvider(newInput).saveDocument(progressMonitor,
-					newInput,
-					getDocumentProvider().getDocument(getEditorInput()), true);
-			success = true;
-		} catch (CoreException x) {
-			IStatus status = x.getStatus();
-			if (status == null || status.getSeverity() != IStatus.CANCEL) {
-				ErrorDialog.openError(shell, "Save Problems",
-						"Could not save file.", x.getStatus());
-			}
-		} finally {
-			provider.changed(newInput);
-			if (success) {
-				setInput(newInput);
-			}
-		}
-		if (progressMonitor != null) {
-			progressMonitor.setCanceled(!success);
-		}
-	}
-
-	/**
-	 * @param event
-	 */
-	protected void handleDoubleClick(Event event) {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-
-		// do nothing if 0 or more than 1 edit parts are selected
-		//
-		if (editParts.size() != 1)
-			return;
-
-		EditPart editPart = (EditPart) editParts.get(0);
-		Node node = (Node) editPart.getModel();
-		EObject model = node.getElement();
-		DiagramFileEditorInputProxy editorInput = (DiagramFileEditorInputProxy) getEditorInput();
-		DiagramEditorInput dInput = editorInput.getDiagramEditorInput();
-
-		if (model instanceof org.eclipse.uml2.uml.Activity) {
-			NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(model);
-			Object e = null;
-			// TODO: handle Wrapper change below line after wrapper implement
-			e = nodeAdapter.getElement();
-			if (e == null) {
-				e = BridgeHelper.getMethodElement((EModelElement) model);
-			}
-			if (e != null) {
-				//				IEditorPart parent = getSite().getPage().getActiveEditor();
-				DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
-						e, dInput.getSuppression(),
-						IDiagramManager.ACTIVITY_DIAGRAM);
-				DiagramEditorUtil.openDiagramEditor(getSite().getPage(), input,
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT,
-						new NullProgressMonitor());
-
-			}
-		}
-
-	}
-
-	@Override
-	protected void createActions() {
-		super.createActions();
-		IAction action = new Action(
-				DiagramCoreResources.ActivityDiagram_openActivityDetailDiagram_text) { //$NON-NLS-1$
-			public String getId() {
-				return DiagramConstants.OPEN_ACTIVITY_DETAIL_DIAGRAM;
-			}
-
-			public void run() {
-				try {
-					EditPart selectedPart = (EditPart) getGraphicalViewer()
-							.getSelectedEditParts().get(0);
-					//					IEditorPart parent = getSite().getPage().getActiveEditor();
-					if (selectedPart != null) {
-						Node view = (Node) selectedPart.getModel();
-						DiagramEditPart diagramEditPart = getDiagramEditPart();
-						Diagram diagram = (Diagram) diagramEditPart.getModel();
-						DiagramAdapter diagramAdapter = BridgeHelper
-								.getDiagramAdapter(diagram.getElement());
-
-						NodeAdapter adapter = BridgeHelper.getNodeAdapter(view
-								.getElement());
-						Object selectedObject = adapter.getWrapper();
-						if (selectedObject == null) {
-							selectedObject = adapter.getElement();
-						}
-						// IEditorPart parent =
-						// PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-						DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
-								selectedObject,
-								diagramAdapter.getSuppression(),
-								IDiagramManager.ACTIVITY_DETAIL_DIAGRAM);
-						DiagramEditorUtil
-								.openDiagramEditor(
-										getSite().getPage(),
-										input,
-										ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT,
-										new NullProgressMonitor());
-					}
-
-				} catch (RuntimeException e) {
-					e.printStackTrace();
-				}
-			}
-
-			public boolean isEnabled() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() != 1)
-					return false;
-				EditPart editPart = (EditPart) editParts.get(0);
-				View node = (View) editPart.getModel();
-				if (node != null
-						&& node.getElement() != null
-						&& node.getElement() instanceof org.eclipse.uml2.uml.StructuredActivityNode) {
-					if (enableADDMenu(node.getElement())) {
-						return true;
-					}
-				}
-				return false;
-			}
-		};
-		action.setImageDescriptor(ADDImages.IMG_DESC_EDITOR);
-		action.setDisabledImageDescriptor(ADDImages.DISABLED_IMG_DESC_EDITOR);
-		getActionRegistry().registerAction(action);
-
-		List<IElementType> elementTypes = new ArrayList<IElementType>();
-		elementTypes.clear();
-		elementTypes.add(UMLElementTypes.ActivityPartition_1008);
-		elementTypes.add(UMLElementTypes.ActivityPartition_2001);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Partition_Node_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_PARTITION,
-				DiagramCoreResources.ActivityDiagram_Partition_Node_tooltip,
-				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE
-						.getActivityPartition(),
-						UMLElementTypes.ActivityPartition_2001)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.InitialNode_1004);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_StartNode_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_START_NODE,
-				DiagramCoreResources.ActivityDiagram_StartNode_tooltip, //$NON-NLS-1$
-				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE
-						.getInitialNode(), UMLElementTypes.InitialNode_1004)); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.ForkNode_1003);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Fork_Node_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_FORK_NODE,
-				DiagramCoreResources.ActivityDiagram_Fork_Node_tooltip,
-				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE
-						.getForkNode(), UMLElementTypes.ForkNode_1003)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.JoinNode_1006);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Join_Node_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_JOIN_NODE,
-				DiagramCoreResources.ActivityDiagram_Join_Node_tooltip,
-				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE
-						.getJoinNode(), UMLElementTypes.JoinNode_1006)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.DecisionNode_1005);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_DecisionNode_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_DECISION_NODE,
-				DiagramCoreResources.ActivityDiagram_DecisionNode_tooltip,
-				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE
-						.getDecisionNode(), UMLElementTypes.DecisionNode_1005)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.MergeNode_1002);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Merge_Node_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_MERGE_NODE,
-				DiagramCoreResources.ActivityDiagram_Merge_Node_tooltip,
-				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE
-						.getDecisionNode(), UMLElementTypes.MergeNode_1002)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.ActivityFinalNode_1001);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_EndNode_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_END_NODE,
-				DiagramCoreResources.ActivityDiagram_EndNode_tooltip,
-				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE
-						.getActivityFinalNode(),
-						UMLElementTypes.ActivityFinalNode_1001)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.StructuredActivityNode_1007);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Activity_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_ACTIVITY,
-				DiagramCoreResources.ActivityDiagram_Activity_tooltip,
-				UMLElementTypes.getImageDescriptor(null,
-						UMLElementTypes.StructuredActivityNode_1007)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.StructuredActivityNode_1011);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Iteration_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_ITERATION,
-				DiagramCoreResources.ActivityDiagram_Iteration_tooltip,
-				UMLElementTypes.getImageDescriptor(null,
-						UMLElementTypes.StructuredActivityNode_1011)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.StructuredActivityNode_1010);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Phase_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_PHASE,
-				DiagramCoreResources.ActivityDiagram_Phase_tooltip,
-				UMLElementTypes.getImageDescriptor(null,
-						UMLElementTypes.StructuredActivityNode_1010)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.ActivityParameterNode_1009);
-		action = createAnAction(
-				DiagramCoreResources.AbstractDiagram_TaskDescriptor_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_TASK_DESCRIPTOR,
-				DiagramCoreResources.AbstractDiagram_TaskDescriptor_tooltip,
-				UMLElementTypes.getImageDescriptor(null,
-						UMLElementTypes.ActivityParameterNode_1009)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-		elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(UMLElementTypes.ActivityParameterNode_1012);
-		action = createAnAction(
-				DiagramCoreResources.ActivityDiagram_Milestone_text,
-				elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_MILESTONE,
-				DiagramCoreResources.ActivityDiagram_Milestone_tooltip,
-				UMLElementTypes.getImageDescriptor(null,
-						UMLElementTypes.ActivityParameterNode_1012)); //$NON-NLS-1$
-
-		getActionRegistry().registerAction(action);
-
-	}
-
-	protected boolean enableADDMenu(EObject element) {
-		NodeAdapter adapter = BridgeHelper
-				.getNodeAdapter((ActivityNode) element);
-		if (adapter != null) {
-			Object selectedObject = adapter.getWrapper();
-			if (selectedObject == null) {
-				selectedObject = adapter.getElement();
-			}
-			Activity activity = null;
-			List<BreakdownElement> list = new ArrayList<BreakdownElement>();
-
-			if (selectedObject instanceof Activity) {
-				activity = (Activity) selectedObject;
-			} else if (selectedObject instanceof ActivityWrapperItemProvider) {
-				activity = (Activity) ((ActivityWrapperItemProvider) selectedObject)
-						.getValue();
-			}
-			if (activity == null)
-				return false;
-			while (!activity.getVariabilityType().equals(
-					VariabilityType.NA_LITERAL)) {
-
-				VariabilityElement ve = activity.getVariabilityBasedOnElement();
-				list.addAll(activity.getBreakdownElements());
-
-				if ((ve != null) && (ve instanceof Activity)) {
-					activity = (Activity) ve;
-				} else {
-					break;
-				}
-			}
-			//Collect the breakdown elements to verifty taskdescriptors are
-			// not.
-			list.addAll(activity.getBreakdownElements());
-			Diagram diagram = getDiagram(activity,
-					IDiagramManager.ACTIVITY_DETAIL_DIAGRAM);
-
-			if (diagram == null
-					&& selectedObject instanceof ActivityWrapperItemProvider) {
-				return false;
-			} else {
-				// Iterate through the List, to find taskdescriptor and has
-				// primary role within current configuration.
-				// then enable the action.
-				DiagramAdapter diagramAdapter = BridgeHelper
-						.getDiagramAdapter(getDiagram().getElement());
-				Suppression suppression = diagramAdapter.getSuppression();
-				for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-					Object obj = iterator.next();
-					if (obj instanceof TaskDescriptor) {
-						if (suppression != null) {
-							if (suppression.isSuppressed(obj))
-								return false;
-						}
-						Object e = ((TaskDescriptor) obj)
-								.getPerformedPrimarilyBy();
-						if (suppression != null
-								&& diagramAdapter.getSuppression()
-										.isSuppressed(e)) {
-							return false;
-						}
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public void contributeToContextMenu(IMenuManager menu) {
-		super.contributeToContextMenu(menu);
-		addToMenu(menu, DiagramConstants.OPEN_ACTIVITY_DETAIL_DIAGRAM,
-				GEFActionConstants.MB_ADDITIONS, true, true);
-		IContributionItem item = menu.find(ActionIds.MENU_DIAGRAM_ADD);
-		if (item != null && item instanceof IMenuManager) {
-			IMenuManager addMenu = (IMenuManager) item;
-			String groupName = DiagramConstants.DIAGRAM_ADD_MENU_GENERAL_GROUP;
-			if (getGraphicalViewer().getSelectedEditParts().size() == 0) {
-				addToMenu(addMenu, null, groupName, true, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_PARTITION,
-						groupName, false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_START_NODE,
-						groupName, false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_END_NODE, groupName,
-						false, true);		
-				addToMenu(addMenu, DiagramConstants.CREATE_FORK_NODE,
-						groupName, false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_JOIN_NODE, 
-						groupName, false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_DECISION_NODE,
-						groupName, false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_MERGE_NODE,
-						groupName, true, true);	
-				addToMenu(addMenu, DiagramConstants.CREATE_ACTIVITY, groupName,
-						false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_ITERATION,
-						groupName, false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_PHASE, groupName,
-						false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_MILESTONE,
-						groupName, false, true);
-				addToMenu(addMenu, DiagramConstants.CREATE_TASK_DESCRIPTOR,
-						groupName, true, true);
-				
-			}
-		}
-	}
-
-	@Override
-	protected String getPartNamePrefix() {
-		MethodElement e = getMethodElementFromInput();
-		if (e instanceof Activity) {
-			return getTypeName((Activity) e) + ": "; //$NON-NLS-1$
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @return
-	 */
-	protected Image getPartImage() {
-		return ActivityDiagramEditorPlugin.getInstance().getSharedImage(
-				"full/etool16/ADEditor.gif"); //$NON-NLS-1$
-	}
-
-	private static String getTypeName(Activity act) {
-		if (act instanceof DeliveryProcess) {
-			return DiagramCoreResources.ActvitivityDiagram_DeliveryProcess_text; //$NON-NLS-1$
-		} else if (act instanceof CapabilityPattern) {
-			return DiagramCoreResources.ActvitivityDiagram_CapabilityPattern_text; //$NON-NLS-1$
-		} else if (act instanceof Phase) {
-			return DiagramCoreResources.ActvitivityDiagram_Phase_tex; //$NON-NLS-1$
-		} else if (act instanceof Iteration) {
-			return DiagramCoreResources.ActvitivityDiagram_Iteration_text; //$NON-NLS-1$
-		}
-		return DiagramCoreResources.ActvitivityDiagram_Activity_text; //$NON-NLS-1$
-	}
-
-	/**
-	 * Create edge for AD diagram
-	 * 
-	 * @param sourceNode
-	 * @param targetNode
-	 * @param actEdge
-	 * @return
-	 */
-	public Edge createEdge(Node sourceNode, Node targetNode,
-			ActivityEdge actEdge) {
-		if (actEdge instanceof ControlFlow) {
-			Edge edge = ViewService.createEdge(sourceNode, targetNode, actEdge,
-					new Integer(ControlFlowEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(edge, actEdge, new Integer(
-					ControlFlowNameEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			return edge;
-		}
-		return null;
-	}
-
-	protected CreateUnspecifiedTypeConnectionRequest getCreateControlFlowRequest() {
-		List<IElementType> list = new ArrayList<IElementType>();
-		list.add(UMLElementTypes.ControlFlow_3001);
-		CreateUnspecifiedTypeConnectionRequest connectionRequest = new CreateUnspecifiedTypeConnectionRequest(
-				list, false,
-				ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		return connectionRequest;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ActivityDiagramEditorPlugin.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ActivityDiagramEditorPlugin.java
deleted file mode 100644
index ad79979..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ActivityDiagramEditorPlugin.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.eclipse.epf.diagram.ad.ActivityDiagramPlugin;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.uml2.uml.edit.providers.UMLItemProviderAdapterFactory;
-import org.osgi.framework.BundleContext;
-
-/**
- * @modified
- */
-public class ActivityDiagramEditorPlugin extends ActivityDiagramPlugin {
-
-	/**
-	 * @generated
-	 */
-	public static final String ID = "org.eclipse.epf.diagram.ad"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final PreferencesHint DIAGRAM_PREFERENCES_HINT = new PreferencesHint(
-			ID);
-
-	/**
-	 * @generated
-	 */
-	private static ActivityDiagramEditorPlugin instance;
-
-	/**
-	 * @generated
-	 */
-	private ComposedAdapterFactory adapterFactory;
-
-	/**
-	 * @generated
-	 */
-	private UMLDocumentProvider myDocumentProvider;
-
-	/**
-	 * @generated
-	 */
-	public ActivityDiagramEditorPlugin() {
-	}
-
-	/**
-	 * @generated
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		instance = this;
-		PreferencesHint.registerPreferenceStore(DIAGRAM_PREFERENCES_HINT,
-				getPreferenceStore());
-		adapterFactory = createAdapterFactory();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void stop(BundleContext context) throws Exception {
-		adapterFactory.dispose();
-		adapterFactory = null;
-		instance = null;
-		super.stop(context);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ActivityDiagramEditorPlugin getInstance() {
-		return instance;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ComposedAdapterFactory createAdapterFactory() {
-		List factories = new ArrayList();
-		fillItemProviderFactories(factories);
-		return new ComposedAdapterFactory(factories);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void fillItemProviderFactories(List factories) {
-		factories.add(new UMLItemProviderAdapterFactory());
-		factories.add(new EcoreItemProviderAdapterFactory());
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-	}
-
-	/**
-	 * @generated
-	 */
-	public AdapterFactory getItemProvidersAdapterFactory() {
-		return adapterFactory;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ImageDescriptor getItemImageDescriptor(Object item) {
-		IItemLabelProvider labelProvider = (IItemLabelProvider) adapterFactory
-				.adapt(item, IItemLabelProvider.class);
-		if (labelProvider != null) {
-			return ExtendedImageRegistry.getInstance().getImageDescriptor(
-					labelProvider.getImage(item));
-		}
-		return null;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @generated
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getBundledImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin(ID, path);
-	}
-
-	/**
-	 * Respects images residing in any plug-in. If path is relative,
-	 * then this bundle is looked up for the image, otherwise, for absolute 
-	 * path, first segment is taken as id of plug-in with image
-	 *
-	 * @generated
-	 * @param path the path to image, either absolute (with plug-in id as first segment), or relative for bundled images
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor findImageDescriptor(String path) {
-		final IPath p = new Path(path);
-		if (p.isAbsolute() && p.segmentCount() > 1) {
-			return AbstractUIPlugin.imageDescriptorFromPlugin(p.segment(0), p
-					.removeFirstSegments(1).makeAbsolute().toString());
-		} else {
-			return getBundledImageDescriptor(p.makeAbsolute().toString());
-		}
-	}
-
-	/**
-	 * Returns string from plug-in's resource bundle
-	 * @modified
-	 */
-	public String getString(String key) {
-		return Platform.getResourceString(getInstance().getBundle(), "%" + key); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns an image for the image file at the given plug-in relative path.
-	 * Client do not need to dispose this image. Images will be disposed automatically.
-	 *
-	 * @generated
-	 * @param path the path
-	 * @return image instance
-	 */
-	public Image getBundledImage(String path) {
-		Image image = getImageRegistry().get(path);
-		if (image == null) {
-			getImageRegistry().put(path, getBundledImageDescriptor(path));
-			image = getImageRegistry().get(path);
-		}
-		return image;
-	}
-
-	/**
-	 * @generated
-	 */
-	public UMLDocumentProvider getDocumentProvider() {
-		if (myDocumentProvider == null) {
-			myDocumentProvider = new UMLDocumentProvider();
-		}
-		return myDocumentProvider;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void logError(String error) {
-		logError(error, null);
-	}
-
-	/**
-	 * @param throwable actual error or null could be passed
-	 * @generated
-	 */
-	public void logError(String error, Throwable throwable) {
-		if (error == null && throwable != null) {
-			error = throwable.getMessage();
-		}
-		getLog().log(
-				new Status(IStatus.ERROR, ActivityDiagramEditorPlugin.ID,
-						IStatus.OK, error, throwable));
-		debug(error, throwable);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void logInfo(String message) {
-		logInfo(message, null);
-	}
-
-	/**
-	 * @param throwable actual error or null could be passed
-	 * @generated
-	 */
-	public void logInfo(String message, Throwable throwable) {
-		if (message == null && throwable != null) {
-			message = throwable.getMessage();
-		}
-		getLog().log(
-				new Status(IStatus.INFO, ActivityDiagramEditorPlugin.ID,
-						IStatus.OK, message, throwable));
-		debug(message, throwable);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void debug(String message, Throwable throwable) {
-		if (!isDebugging()) {
-			return;
-		}
-		if (message != null) {
-			System.err.println(message);
-		}
-		if (throwable != null) {
-			throwable.printStackTrace();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/Messages.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/Messages.java
deleted file mode 100644
index a9bdc30..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/Messages.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @generated
- */
-public class Messages extends NLS {
-
-	/**
-	 * @generated
-	 */
-	static {
-		NLS.initializeMessages("messages", Messages.class); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	private Messages() {
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDiagramEditorUtil_OpenModelResourceErrorDialogTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDiagramEditorUtil_OpenModelResourceErrorDialogMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDiagramEditorUtil_CreateDiagramProgressTask;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDiagramEditorUtil_CreateDiagramCommandLabel;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_isModifiable;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_handleElementContentChanged;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_IncorrectInputError;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_UnableToLoadResourceError;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_NoDiagramInResourceError;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_DiagramLoadingError;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_UnsynchronizedFileSaveError;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_SaveDiagramTask;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLDocumentProvider_SaveNextResourceTask;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLInitDiagramFileAction_InitDiagramFileWizardTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLInitDiagramFileAction_OpenModelFileDialogTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_CreationPageName;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_CreationPageTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_CreationPageDescription;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_RootSelectionPageName;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_RootSelectionPageTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_RootSelectionPageDescription;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_RootSelectionPageSelectionTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_RootSelectionPageNoSelectionMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_InitDiagramCommand;
-
-	/**
-	 * @generated
-	 */
-	public static String UMLNewDiagramFileWizard_IncorrectRootError;
-
-	/**
-	 * @generated
-	 */
-	public static String Flows1Group_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Flows1Group_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String Nodes2Group_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Nodes2Group_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String ControlFlow1CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String ControlFlow1CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String ActivityPartition1CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String ActivityPartition1CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String StartNode2CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String StartNode2CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String ForkNode3CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String ForkNode3CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String MergeNode4CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String MergeNode4CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String DecisionNode5CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String DecisionNode5CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String EndNode6CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String EndNode6CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String JoinNode7CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String JoinNode7CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String Activity9CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Activity9CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String Phase10CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Phase10CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String Iteration11CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Iteration11CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String TaskDescriptor12CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String TaskDescriptor12CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String Milestone13CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Milestone13CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String ActivityPartitionPartitionCampartmentEditPart_title;
-
-	/**
-	 * @generated
-	 */
-	public static String ActivityPartitionPartitionCampartment2EditPart_title;
-
-	/**
-	 * @generated
-	 */
-	public static String CommandName_OpenDiagram;
-
-	//TODO: put accessor fields manually	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ModelElementSelectionPage.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ModelElementSelectionPage.java
deleted file mode 100644
index 5b029c3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/ModelElementSelectionPage.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.wizard.WizardPage;
-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.Label;
-
-/**
- * Wizard page that allows to select element from model.
- * 
- * @generated
- */
-public class ModelElementSelectionPage extends WizardPage {
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectedModelElement;
-
-	/**
-	 * @generated
-	 */
-	private TreeViewer modelVewer;
-
-	/**
-	 * @generated
-	 */
-	public ModelElementSelectionPage(String pageName) {
-		super(pageName);
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getModelElement() {
-		return selectedModelElement;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setModelElement(EObject modelElement) {
-		selectedModelElement = modelElement;
-		if (modelVewer != null) {
-			if (selectedModelElement != null) {
-				modelVewer.setInput(selectedModelElement.eResource());
-				modelVewer.setSelection(new StructuredSelection(
-						selectedModelElement));
-			} else {
-				modelVewer.setInput(null);
-			}
-			setPageComplete(validatePage());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		Composite plate = new Composite(parent, SWT.NONE);
-		plate.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		plate.setLayout(layout);
-		setControl(plate);
-
-		Label label = new Label(plate, SWT.NONE);
-		label.setText(getSelectionTitle());
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
-		modelVewer = new TreeViewer(plate, SWT.SINGLE | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER);
-		GridData layoutData = new GridData(GridData.FILL_BOTH);
-		layoutData.heightHint = 300;
-		layoutData.widthHint = 300;
-		modelVewer.getTree().setLayoutData(layoutData);
-		modelVewer.setContentProvider(new AdapterFactoryContentProvider(
-				ActivityDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory()));
-		modelVewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				ActivityDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory()));
-		if (selectedModelElement != null) {
-			modelVewer.setInput(selectedModelElement.eResource());
-			modelVewer.setSelection(new StructuredSelection(
-					selectedModelElement));
-		}
-		modelVewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				ModelElementSelectionPage.this
-						.updateSelection((IStructuredSelection) event
-								.getSelection());
-			}
-		});
-
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Override to provide custom model element description.
-	 * 
-	 * @generated
-	 */
-	protected String getSelectionTitle() {
-		return "Select model element:";
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateSelection(IStructuredSelection selection) {
-		selectedModelElement = null;
-		if (selection.size() == 1) {
-			Object selectedElement = selection.getFirstElement();
-			if (selectedElement instanceof IWrapperItemProvider) {
-				selectedElement = ((IWrapperItemProvider) selectedElement)
-						.getValue();
-			}
-			if (selectedElement instanceof FeatureMap.Entry) {
-				selectedElement = ((FeatureMap.Entry) selectedElement)
-						.getValue();
-			}
-			if (selectedElement instanceof EObject) {
-				selectedModelElement = (EObject) selectedElement;
-			}
-		}
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Override to provide specific validation of the selected model element.
-	 * 
-	 * @generated
-	 */
-	protected boolean validatePage() {
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLCreationWizard.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLCreationWizard.java
deleted file mode 100644
index 7ac52bb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLCreationWizard.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.EditorCreationWizard;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * @generated
- */
-public class UMLCreationWizard extends Wizard implements INewWizard {
-
-	/**
-	 * @generated
-	 */
-	private IWorkbench workbench;
-	/**
-	 * @generated
-	 */
-	protected IStructuredSelection selection;
-	/**
-	 * @generated
-	 */
-	protected UMLCreationWizardPage diagramModelFilePage;
-	/**
-	 * @generated
-	 */
-	protected Resource diagram;
-	/**
-	 * @generated
-	 */
-	private boolean openNewlyCreatedDiagramEditor = true;
-
-	/**
-	 * @generated
-	 */
-	public IWorkbench getWorkbench() {
-		return workbench;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IStructuredSelection getSelection() {
-		return selection;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final Resource getDiagram() {
-		return diagram;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final boolean isOpenNewlyCreatedDiagramEditor() {
-		return openNewlyCreatedDiagramEditor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setOpenNewlyCreatedDiagramEditor(
-			boolean openNewlyCreatedDiagramEditor) {
-		this.openNewlyCreatedDiagramEditor = openNewlyCreatedDiagramEditor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void addPages() {
-		diagramModelFilePage = new UMLCreationWizardPage(
-				"DiagramModelFile", getSelection(), "xmi"); //$NON-NLS-1$ //$NON-NLS-2$
-		diagramModelFilePage.setTitle("Create AD Diagram");
-		diagramModelFilePage
-				.setDescription("Select file that will contain diagram and domain models.");
-		addPage(diagramModelFilePage);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean performFinish() {
-		IRunnableWithProgress op = new WorkspaceModifyOperation(null) {
-
-			protected void execute(IProgressMonitor monitor)
-					throws CoreException, InterruptedException {
-				diagram = UMLDiagramEditorUtil.createDiagram(
-						diagramModelFilePage.getURI(), monitor);
-				if (isOpenNewlyCreatedDiagramEditor() && diagram != null) {
-					try {
-						UMLDiagramEditorUtil.openDiagram(diagram);
-					} catch (PartInitException e) {
-						ErrorDialog.openError(getContainer().getShell(),
-								"Error opening diagram editor", null, e
-										.getStatus());
-					}
-				}
-			}
-		};
-		try {
-			getContainer().run(false, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			if (e.getTargetException() instanceof CoreException) {
-				ErrorDialog.openError(getContainer().getShell(),
-						"Creation Problems", null, ((CoreException) e
-								.getTargetException()).getStatus());
-			} else {
-				ActivityDiagramEditorPlugin.getInstance().logError(
-						"Error creating diagram", e.getTargetException()); //$NON-NLS-1$
-			}
-			return false;
-		}
-		return diagram != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		this.workbench = workbench;
-		this.selection = selection;
-		setWindowTitle("New AD Diagram");
-		setDefaultPageImageDescriptor(ActivityDiagramEditorPlugin
-				.getBundledImageDescriptor("icons/wizban/NewUMLWizard.gif")); //$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLCreationWizardPage.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLCreationWizardPage.java
deleted file mode 100644
index 13c495e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLCreationWizardPage.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.EditorWizardPage;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-/**
- * @generated
- */
-public class UMLCreationWizardPage extends WizardNewFileCreationPage {
-
-	/**
-	 * @generated
-	 */
-	private final String fileExtension;
-
-	/**
-	 * @generated
-	 */
-	public UMLCreationWizardPage(String pageName,
-			IStructuredSelection selection, String fileExtension) {
-		super(pageName, selection);
-		this.fileExtension = fileExtension;
-	}
-
-	/**
-	 * Override to create files with this extension.
-	 * 
-	 * @generated
-	 */
-	protected String getExtension() {
-		return fileExtension;
-	}
-
-	/**
-	 * @generated
-	 */
-	public URI getURI() {
-		return URI.createPlatformResourceURI(getFilePath().toString(), false);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IPath getFilePath() {
-		IPath path = getContainerFullPath();
-		if (path == null) {
-			path = new Path(""); //$NON-NLS-1$
-		}
-		String fileName = getFileName();
-		if (fileName != null) {
-			path = path.append(fileName);
-		}
-		return path;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		setFileName(UMLDiagramEditorUtil.getUniqueFileName(
-				getContainerFullPath(), getFileName(), getExtension()));
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean validatePage() {
-		if (!super.validatePage()) {
-			return false;
-		}
-		String extension = getExtension();
-		if (extension != null
-				&& !getFilePath().toString().endsWith("." + extension)) {
-			setErrorMessage(NLS.bind(
-					"File name should have ''{0}'' extension.", extension));
-			return false;
-		}
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramActionBarContributor.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramActionBarContributor.java
deleted file mode 100644
index 6ae9830..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramActionBarContributor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramActionBarContributor;
-
-/**
- * @generated
- */
-public class UMLDiagramActionBarContributor extends DiagramActionBarContributor {
-
-	/**
-	 * @generated
-	 */
-	protected Class getEditorClass() {
-		return ActivityDiagramEditor.class;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getEditorId() {
-		return ActivityDiagramEditor.ID;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramEditorUtil.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramEditorUtil.java
deleted file mode 100644
index 9538c3d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramEditorUtil.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubProgressMonitor;
-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.ResourceSet;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.edit.ui.util.EditUIUtil;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.util.IDEEditorUtil;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
-import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.UMLFactory;
-
-/**
- * @generated
- */
-public class UMLDiagramEditorUtil {
-
-	/**
-	 * @generated
-	 */
-	private static Map ourSaveOptions = null;
-
-	/**
-	 * @generated
-	 */
-	public static Map getSaveOptions() {
-		if (ourSaveOptions == null) {
-			ourSaveOptions = new HashMap();
-			ourSaveOptions.put(XMIResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-			ourSaveOptions.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE,
-					Boolean.TRUE);
-			ourSaveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED,
-					Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
-		}
-		return ourSaveOptions;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static boolean openDiagram(Resource diagram)
-			throws PartInitException {
-		return EditUIUtil.openEditor((EObject) diagram.getContents().get(0));
-	}
-
-	/**
-	 * @generated
-	 */
-	public static void setCharset(IFile file) {
-		if (file == null) {
-			return;
-		}
-		try {
-			file.setCharset("UTF-8", new NullProgressMonitor()); //$NON-NLS-1$
-		} catch (CoreException e) {
-			ActivityDiagramEditorPlugin.getInstance().logError(
-					"Unable to set charset for file " + file.getFullPath(), e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getUniqueFileName(IPath containerFullPath,
-			String fileName, String extension) {
-		if (containerFullPath == null) {
-			containerFullPath = new Path(""); //$NON-NLS-1$
-		}
-		if (fileName == null || fileName.trim().length() == 0) {
-			fileName = "default"; //$NON-NLS-1$
-		}
-		IPath filePath = containerFullPath.append(fileName);
-		if (extension != null && !extension.equals(filePath.getFileExtension())) {
-			filePath = filePath.addFileExtension(extension);
-		}
-		extension = filePath.getFileExtension();
-		fileName = filePath.removeFileExtension().lastSegment();
-		int i = 1;
-		while (ResourcesPlugin.getWorkspace().getRoot().exists(filePath)) {
-			i++;
-			filePath = containerFullPath.append(fileName + i);
-			if (extension != null) {
-				filePath = filePath.addFileExtension(extension);
-			}
-		}
-		return filePath.lastSegment();
-	}
-
-	/**
-	 * Runs the wizard in a dialog.
-	 * 
-	 * @generated
-	 */
-	public static void runWizard(Shell shell, Wizard wizard, String settingsKey) {
-		IDialogSettings pluginDialogSettings = ActivityDiagramEditorPlugin
-				.getInstance().getDialogSettings();
-		IDialogSettings wizardDialogSettings = pluginDialogSettings
-				.getSection(settingsKey);
-		if (wizardDialogSettings == null) {
-			wizardDialogSettings = pluginDialogSettings
-					.addNewSection(settingsKey);
-		}
-		wizard.setDialogSettings(wizardDialogSettings);
-		WizardDialog dialog = new WizardDialog(shell, wizard);
-		dialog.create();
-		dialog.getShell().setSize(Math.max(500, dialog.getShell().getSize().x),
-				500);
-		dialog.open();
-	}
-
-	/**
-	 * This method should be called within a workspace modify operation since it creates resources.
-	 * @generated
-	 */
-	public static Resource createDiagram(URI diagramURI,
-			IProgressMonitor progressMonitor) {
-		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
-				.createEditingDomain();
-		progressMonitor.beginTask(
-				Messages.UMLDiagramEditorUtil_CreateDiagramProgressTask, 3);
-		final Resource diagramResource = editingDomain.getResourceSet()
-				.createResource(diagramURI);
-		final String diagramName = diagramURI.lastSegment();
-		AbstractTransactionalCommand command = new AbstractTransactionalCommand(
-				editingDomain,
-				Messages.UMLDiagramEditorUtil_CreateDiagramCommandLabel,
-				Collections.EMPTY_LIST) {
-			protected CommandResult doExecuteWithResult(
-					IProgressMonitor monitor, IAdaptable info)
-					throws ExecutionException {
-				Activity model = createInitialModel();
-				attachModelToResource(model, diagramResource);
-
-				Diagram diagram = ViewService.createDiagram(model,
-						ActivityEditPart.MODEL_ID,
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				if (diagram != null) {
-					diagramResource.getContents().add(diagram);
-					diagram.setName(diagramName);
-					diagram.setElement(model);
-				}
-
-				try {
-
-					diagramResource
-							.save(org.eclipse.epf.diagram.ad.part.UMLDiagramEditorUtil
-									.getSaveOptions());
-				} catch (IOException e) {
-
-					ActivityDiagramEditorPlugin.getInstance().logError(
-							"Unable to store model and diagram resources", e); //$NON-NLS-1$
-				}
-				return CommandResult.newOKCommandResult();
-			}
-		};
-		try {
-			OperationHistoryFactory.getOperationHistory().execute(command,
-					new SubProgressMonitor(progressMonitor, 1), null);
-		} catch (ExecutionException e) {
-			ActivityDiagramEditorPlugin.getInstance().logError(
-					"Unable to create model and diagram", e); //$NON-NLS-1$
-		}
-
-		setCharset(WorkspaceSynchronizer.getFile(diagramResource));
-		return diagramResource;
-	}
-
-	/**
-	 * Create a new instance of domain element associated with canvas.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static Activity createInitialModel() {
-		return UMLFactory.eINSTANCE.createActivity();
-	}
-
-	/**
-	 * Store model element in the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static void attachModelToResource(Activity model, Resource resource) {
-		resource.getContents().add(model);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static void selectElementsInDiagram(
-			IDiagramWorkbenchPart diagramPart, List/*EditPart*/editParts) {
-		diagramPart.getDiagramGraphicalViewer().deselectAll();
-
-		EditPart firstPrimary = null;
-		for (Iterator it = editParts.iterator(); it.hasNext();) {
-			EditPart nextPart = (EditPart) it.next();
-			diagramPart.getDiagramGraphicalViewer().appendSelection(nextPart);
-			if (firstPrimary == null && nextPart instanceof IPrimaryEditPart) {
-				firstPrimary = nextPart;
-			}
-		}
-
-		if (!editParts.isEmpty()) {
-			diagramPart.getDiagramGraphicalViewer().reveal(
-					firstPrimary != null ? firstPrimary : (EditPart) editParts
-							.get(0));
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private static int findElementsInDiagramByID(DiagramEditPart diagramPart,
-			EObject element, List editPartCollector) {
-		IDiagramGraphicalViewer viewer = (IDiagramGraphicalViewer) diagramPart
-				.getViewer();
-		final int intialNumOfEditParts = editPartCollector.size();
-
-		if (element instanceof View) { // support notation element lookup
-			EditPart editPart = (EditPart) viewer.getEditPartRegistry().get(
-					element);
-			if (editPart != null) {
-				editPartCollector.add(editPart);
-				return 1;
-			}
-		}
-
-		String elementID = EMFCoreUtil.getProxyID(element);
-		List associatedParts = viewer.findEditPartsForElement(elementID,
-				IGraphicalEditPart.class);
-		// perform the possible hierarchy disjoint -> take the top-most parts only
-		for (Iterator editPartIt = associatedParts.iterator(); editPartIt
-				.hasNext();) {
-			EditPart nextPart = (EditPart) editPartIt.next();
-			EditPart parentPart = nextPart.getParent();
-			while (parentPart != null && !associatedParts.contains(parentPart)) {
-				parentPart = parentPart.getParent();
-			}
-			if (parentPart == null) {
-				editPartCollector.add(nextPart);
-			}
-		}
-
-		if (intialNumOfEditParts == editPartCollector.size()) {
-			if (!associatedParts.isEmpty()) {
-				editPartCollector.add(associatedParts.iterator().next());
-			} else {
-				if (element.eContainer() != null) {
-					return findElementsInDiagramByID(diagramPart, element
-							.eContainer(), editPartCollector);
-				}
-			}
-		}
-		return editPartCollector.size() - intialNumOfEditParts;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static View findView(DiagramEditPart diagramEditPart,
-			EObject targetElement, LazyElement2ViewMap lazyElement2ViewMap) {
-		boolean hasStructuralURI = false;
-		if (targetElement.eResource() instanceof XMLResource) {
-			hasStructuralURI = ((XMLResource) targetElement.eResource())
-					.getID(targetElement) == null;
-		}
-
-		View view = null;
-		if (hasStructuralURI
-				&& !lazyElement2ViewMap.getElement2ViewMap().isEmpty()) {
-			view = (View) lazyElement2ViewMap.getElement2ViewMap().get(
-					targetElement);
-		} else if (findElementsInDiagramByID(diagramEditPart, targetElement,
-				lazyElement2ViewMap.editPartTmpHolder) > 0) {
-			EditPart editPart = (EditPart) lazyElement2ViewMap.editPartTmpHolder
-					.get(0);
-			lazyElement2ViewMap.editPartTmpHolder.clear();
-			view = editPart.getModel() instanceof View ? (View) editPart
-					.getModel() : null;
-		}
-
-		return (view == null) ? diagramEditPart.getDiagramView() : view;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static class LazyElement2ViewMap {
-		/**
-		 * @generated
-		 */
-		private Map element2ViewMap;
-
-		/**
-		 * @generated
-		 */
-		private View scope;
-
-		/**
-		 * @generated
-		 */
-		private Set elementSet;
-
-		/**
-		 * @generated
-		 */
-		public final List editPartTmpHolder = new ArrayList();
-
-		/**
-		 * @generated
-		 */
-		public LazyElement2ViewMap(View scope, Set elements) {
-			this.scope = scope;
-			this.elementSet = elements;
-		}
-
-		/**
-		 * @generated
-		 */
-		public final Map getElement2ViewMap() {
-			if (element2ViewMap == null) {
-				element2ViewMap = new HashMap();
-				// map possible notation elements to itself as these can't be found by view.getElement()
-				for (Iterator it = elementSet.iterator(); it.hasNext();) {
-					EObject element = (EObject) it.next();
-					if (element instanceof View) {
-						View view = (View) element;
-						if (view.getDiagram() == scope.getDiagram()) {
-							element2ViewMap.put(element, element); // take only those that part of our diagram
-						}
-					}
-				}
-
-				buildElement2ViewMap(scope, element2ViewMap, elementSet);
-			}
-			return element2ViewMap;
-		}
-
-		/**
-		 * @generated
-		 */
-		static Map buildElement2ViewMap(View parentView, Map element2ViewMap,
-				Set elements) {
-			if (elements.size() == element2ViewMap.size())
-				return element2ViewMap;
-
-			if (parentView.isSetElement()
-					&& !element2ViewMap.containsKey(parentView.getElement())
-					&& elements.contains(parentView.getElement())) {
-				element2ViewMap.put(parentView.getElement(), parentView);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-
-			for (Iterator it = parentView.getChildren().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			for (Iterator it = parentView.getSourceEdges().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			for (Iterator it = parentView.getSourceEdges().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			return element2ViewMap;
-		}
-	} //LazyElement2ViewMap	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramFileCreator.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramFileCreator.java
deleted file mode 100644
index d524a80..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramFileCreator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.util.IDEEditorFileCreator;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-
-/**
- * @generated
- */
-public class UMLDiagramFileCreator extends IDEEditorFileCreator {
-
-	/**
-	 * @generated
-	 */
-	private static UMLDiagramFileCreator INSTANCE = new UMLDiagramFileCreator();
-
-	/**
-	 * @generated
-	 */
-	public static DiagramFileCreator getInstance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getExtension() {
-		return ".xmi"; //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramPreferenceInitializer.java
deleted file mode 100644
index c52b41b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDiagramPreferenceInitializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @generated
- */
-public class UMLDiagramPreferenceInitializer extends
-		DiagramPreferenceInitializer {
-
-	/**
-	 * @generated
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin
-				.getInstance().getPreferenceStore();
-	}
-	
-	@Override
-	public void initializeDefaultPreferences() {
-		super.initializeDefaultPreferences();
-		DiagramCoreUtil.setDefaultFontPreference(getPreferenceStore());
-		DiagramCoreUtil.setDefaultLineStyle(getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDocumentProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDocumentProvider.java
deleted file mode 100644
index ead1d7e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLDocumentProvider.java
+++ /dev/null
@@ -1,1056 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import java.util.Map;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.ui.URIEditorInput;
-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.ResourceSet;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.emf.transaction.DemultiplexingListener;
-import org.eclipse.emf.transaction.NotificationFilter;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.AbstractDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.EditorStatusCodes;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.util.DiagramIOUtil;
-import org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * @generated
- */
-public class UMLDocumentProvider extends AbstractDocumentProvider implements
-		IDiagramDocumentProvider {
-
-	/**
-	 * @generated
-	 */
-	protected ElementInfo createElementInfo(Object element)
-			throws CoreException {
-		if (false == element instanceof FileEditorInput
-				&& false == element instanceof URIEditorInput) {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							ActivityDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.UMLDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-		IEditorInput editorInput = (IEditorInput) element;
-		IDiagramDocument document = (IDiagramDocument) createDocument(editorInput);
-
-		ResourceSetInfo info = new ResourceSetInfo(document, editorInput);
-		info.setModificationStamp(computeModificationStamp(info));
-		info.fStatus = null;
-		return info;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocument createDocument(Object element) throws CoreException {
-		if (false == element instanceof FileEditorInput
-				&& false == element instanceof URIEditorInput) {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							ActivityDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.UMLDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-		IDocument document = createEmptyDocument();
-		setDocumentContent(document, (IEditorInput) element);
-		setupDocument(element, document);
-		return document;
-	}
-
-	/**
-	 * Sets up the given document as it would be provided for the given element. The
-	 * content of the document is not changed. This default implementation is empty.
-	 * Subclasses may reimplement.
-	 * 
-	 * @param element the blue-print element
-	 * @param document the document to set up
-	 * @generated
-	 */
-	protected void setupDocument(Object element, IDocument document) {
-		// for subclasses
-	}
-
-	/**
-	 * @generated
-	 */
-	private long computeModificationStamp(ResourceSetInfo info) {
-		int result = 0;
-		for (Iterator it = info.getResourceSet().getResources().iterator(); it
-				.hasNext();) {
-			Resource nextResource = (Resource) it.next();
-			IFile file = WorkspaceSynchronizer.getFile(nextResource);
-			if (file != null) {
-				if (file.getLocation() != null) {
-					result += file.getLocation().toFile().lastModified();
-				} else {
-					result += file.getModificationStamp();
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocument createEmptyDocument() {
-		DiagramDocument document = new DiagramDocument();
-		document.setEditingDomain(createEditingDomain());
-		return document;
-	}
-
-	/**
-	 * @generated
-	 */
-	private TransactionalEditingDomain createEditingDomain() {
-		TransactionalEditingDomain editingDomain = DiagramEditingDomainFactory
-				.getInstance().createEditingDomain();
-		editingDomain.setID("org.eclipse.epf.diagram.ad.EditingDomain"); //$NON-NLS-1$
-		final NotificationFilter diagramResourceModifiedFilter = NotificationFilter
-				.createNotifierFilter(editingDomain.getResourceSet()).and(
-						NotificationFilter
-								.createEventTypeFilter(Notification.ADD)).and(
-						NotificationFilter.createFeatureFilter(
-								ResourceSet.class,
-								ResourceSet.RESOURCE_SET__RESOURCES));
-		editingDomain.getResourceSet().eAdapters().add(new Adapter() {
-
-			private Notifier myTarger;
-
-			public Notifier getTarget() {
-				return myTarger;
-			}
-
-			public boolean isAdapterForType(Object type) {
-				return false;
-			}
-
-			public void notifyChanged(Notification notification) {
-				if (diagramResourceModifiedFilter.matches(notification)) {
-					Object value = notification.getNewValue();
-					if (value instanceof Resource) {
-						((Resource) value).setTrackingModification(true);
-					}
-				}
-			}
-
-			public void setTarget(Notifier newTarget) {
-				myTarger = newTarget;
-			}
-
-		});
-
-		return editingDomain;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setDocumentContent(IDocument document, IEditorInput element)
-			throws CoreException {
-		IDiagramDocument diagramDocument = (IDiagramDocument) document;
-		TransactionalEditingDomain domain = diagramDocument.getEditingDomain();
-		if (element instanceof FileEditorInput) {
-			IStorage storage = ((FileEditorInput) element).getStorage();
-			Diagram diagram = DiagramIOUtil.load(domain, storage, true,
-					getProgressMonitor());
-			document.setContent(diagram);
-		} else if (element instanceof URIEditorInput) {
-			URI uri = ((URIEditorInput) element).getURI();
-			Resource resource = null;
-			try {
-				resource = domain.getResourceSet().getResource(
-						uri.trimFragment(), false);
-				if (resource == null) {
-					resource = domain.getResourceSet().createResource(
-							uri.trimFragment());
-				}
-				if (!resource.isLoaded()) {
-					try {
-						Map options = new HashMap(GMFResourceFactory
-								.getDefaultLoadOptions());
-						// @see 171060 
-						// options.put(org.eclipse.emf.ecore.xmi.XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
-						resource.load(options);
-					} catch (IOException e) {
-						resource.unload();
-						throw e;
-					}
-				}
-				if (resource == null) {
-					throw new RuntimeException(
-							Messages.UMLDocumentProvider_UnableToLoadResourceError);
-				}
-				if (uri.fragment() != null) {
-					EObject rootElement = resource.getEObject(uri.fragment());
-					if (rootElement instanceof Diagram) {
-						document.setContent((Diagram) rootElement);
-						return;
-					}
-				} else {
-					for (Iterator it = resource.getContents().iterator(); it
-							.hasNext();) {
-						Object rootElement = it.next();
-						if (rootElement instanceof Diagram) {
-							document.setContent((Diagram) rootElement);
-							return;
-						}
-					}
-				}
-				throw new RuntimeException(
-						Messages.UMLDocumentProvider_NoDiagramInResourceError);
-			} catch (Exception e) {
-				CoreException thrownExcp = null;
-				if (e instanceof CoreException) {
-					thrownExcp = (CoreException) e;
-				} else {
-					String msg = e.getLocalizedMessage();
-					thrownExcp = new CoreException(
-							new Status(
-									IStatus.ERROR,
-									ActivityDiagramEditorPlugin.ID,
-									0,
-									msg != null ? msg
-											: Messages.UMLDocumentProvider_DiagramLoadingError,
-									e));
-				}
-				throw thrownExcp;
-			}
-		} else {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							ActivityDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.UMLDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public long getModificationStamp(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			return computeModificationStamp(info);
-		}
-		return super.getModificationStamp(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isDeleted(Object element) {
-		IDiagramDocument document = getDiagramDocument(element);
-		if (document != null) {
-			Resource diagramResource = document.getDiagram().eResource();
-			if (diagramResource != null) {
-				IFile file = WorkspaceSynchronizer.getFile(diagramResource);
-				return file == null || file.getLocation() == null
-						|| !file.getLocation().toFile().exists();
-			}
-		}
-		return super.isDeleted(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public ResourceSetInfo getResourceSetInfo(Object editorInput) {
-		return (ResourceSetInfo) super.getElementInfo(editorInput);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void disposeElementInfo(Object element, ElementInfo info) {
-		if (info instanceof ResourceSetInfo) {
-			ResourceSetInfo resourceSetInfo = (ResourceSetInfo) info;
-			resourceSetInfo.dispose();
-		}
-		super.disposeElementInfo(element, info);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doValidateState(Object element, Object computationContext)
-			throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection files2Validate = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null && file.isReadOnly()) {
-					files2Validate.add(file);
-				}
-			}
-			ResourcesPlugin.getWorkspace().validateEdit(
-					(IFile[]) files2Validate.toArray(new IFile[files2Validate
-							.size()]), computationContext);
-		}
-
-		super.doValidateState(element, computationContext);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isReadOnly(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (info.isUpdateCache()) {
-				try {
-					updateCache(element);
-				} catch (CoreException ex) {
-					ActivityDiagramEditorPlugin.getInstance().logError(
-							Messages.UMLDocumentProvider_isModifiable, ex);
-					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
-				}
-			}
-			return info.isReadOnly();
-		}
-		return super.isReadOnly(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isModifiable(Object element) {
-		if (!isStateValidated(element)) {
-			if (element instanceof FileEditorInput
-					|| element instanceof URIEditorInput) {
-				return true;
-			}
-		}
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (info.isUpdateCache()) {
-				try {
-					updateCache(element);
-				} catch (CoreException ex) {
-					ActivityDiagramEditorPlugin.getInstance().logError(
-							Messages.UMLDocumentProvider_isModifiable, ex);
-					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
-				}
-			}
-			return info.isModifiable();
-		}
-		return super.isModifiable(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateCache(Object element) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null && file.isReadOnly()) {
-					info.setReadOnly(true);
-					info.setModifiable(false);
-					return;
-				}
-			}
-			info.setReadOnly(false);
-			info.setModifiable(true);
-			return;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doUpdateStateCache(Object element) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			info.setUpdateCache(true);
-		}
-		super.doUpdateStateCache(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isSynchronized(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			return info.isSynchronized();
-		}
-		return super.isSynchronized(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getResetRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()
-							.modifyRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getSaveRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(computeSchedulingRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getSynchronizeRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()
-							.refreshRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getValidateStateRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection files = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					files.add(file);
-				}
-			}
-			return ResourcesPlugin.getWorkspace().getRuleFactory()
-					.validateEditRule(
-							(IFile[]) files.toArray(new IFile[files.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ISchedulingRule computeSchedulingRule(IResource toCreateOrModify) {
-		if (toCreateOrModify.exists())
-			return ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(
-					toCreateOrModify);
-
-		IResource parent = toCreateOrModify;
-		do {
-			/*
-			 * XXX This is a workaround for
-			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=67601
-			 * IResourceRuleFactory.createRule should iterate the hierarchy
-			 * itself.
-			 */
-			toCreateOrModify = parent;
-			parent = toCreateOrModify.getParent();
-		} while (parent != null && !parent.exists());
-
-		return ResourcesPlugin.getWorkspace().getRuleFactory().createRule(
-				toCreateOrModify);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doSynchronize(Object element, IProgressMonitor monitor)
-			throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				handleElementChanged(info, nextResource, monitor);
-			}
-			return;
-		}
-		super.doSynchronize(element, monitor);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doSaveDocument(IProgressMonitor monitor, Object element,
-			IDocument document, boolean overwrite) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (!overwrite && !info.isSynchronized()) {
-				throw new CoreException(
-						new Status(
-								IStatus.ERROR,
-								ActivityDiagramEditorPlugin.ID,
-								IStatus.OK,
-								Messages.UMLDocumentProvider_UnsynchronizedFileSaveError,
-								null));
-			}
-			info.stopResourceListening();
-			fireElementStateChanging(element);
-			List resources = info.getResourceSet().getResources();
-			try {
-				monitor.beginTask(Messages.UMLDocumentProvider_SaveDiagramTask,
-						resources.size() + 1); //"Saving diagram"
-				for (Iterator it = resources.iterator(); it.hasNext();) {
-					Resource nextResource = (Resource) it.next();
-					monitor.setTaskName(NLS.bind(
-							Messages.UMLDocumentProvider_SaveNextResourceTask,
-							nextResource.getURI()));
-					if (nextResource.isLoaded()) {
-						try {
-							nextResource.save(UMLDiagramEditorUtil
-									.getSaveOptions());
-						} catch (IOException e) {
-							fireElementStateChangeFailed(element);
-							throw new CoreException(new Status(IStatus.ERROR,
-									ActivityDiagramEditorPlugin.ID,
-									EditorStatusCodes.RESOURCE_FAILURE, e
-											.getLocalizedMessage(), null));
-						}
-					}
-					monitor.worked(1);
-				}
-				monitor.done();
-			} catch (RuntimeException x) {
-				fireElementStateChangeFailed(element);
-				throw x;
-			} finally {
-				info.startResourceListening();
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleElementChanged(ResourceSetInfo info,
-			Resource changedResource, IProgressMonitor monitor) {
-		IFile file = WorkspaceSynchronizer.getFile(changedResource);
-		if (file != null) {
-			try {
-				file.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-			} catch (CoreException ex) {
-				ActivityDiagramEditorPlugin
-						.getInstance()
-						.logError(
-								Messages.UMLDocumentProvider_handleElementContentChanged,
-								ex);
-				// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.FileDocumentProvider_handleElementContentChanged
-			}
-		}
-		changedResource.unload();
-
-		fireElementContentAboutToBeReplaced(info.getEditorInput());
-		removeUnchangedElementListeners(info.getEditorInput(), info);
-		info.fStatus = null;
-		try {
-			setDocumentContent(info.fDocument, info.getEditorInput());
-		} catch (CoreException e) {
-			info.fStatus = e.getStatus();
-		}
-		if (!info.fCanBeSaved) {
-			info.setModificationStamp(computeModificationStamp(info));
-		}
-		addUnchangedElementListeners(info.getEditorInput(), info);
-		fireElementContentReplaced(info.getEditorInput());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleElementMoved(IEditorInput input, URI uri) {
-		if (input instanceof FileEditorInput) {
-			IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
-					new Path(URI.decode(uri.path())).removeFirstSegments(1));
-			fireElementMoved(input, newFile == null ? null
-					: new FileEditorInput(newFile));
-			return;
-		}
-		// TODO: append suffix to the URI! (use diagram as a parameter)
-		fireElementMoved(input, new URIEditorInput(uri));
-	}
-
-	/**
-	 * @generated
-	 */
-	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput,
-			TransactionalEditingDomain domain) {
-		return editorInput;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IDiagramDocument getDiagramDocument(Object element) {
-		IDocument doc = getDocument(element);
-		if (doc instanceof IDiagramDocument) {
-			return (IDiagramDocument) doc;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected class ResourceSetInfo extends ElementInfo {
-
-		/**
-		 * @generated
-		 */
-		private long myModificationStamp = IResource.NULL_STAMP;
-
-		/**
-		 * @generated
-		 */
-		private WorkspaceSynchronizer mySynchronizer;
-
-		/**
-		 * @generated
-		 */
-		private Collection myUnSynchronizedResources = new ArrayList();
-
-		/**
-		 * @generated
-		 */
-		private IDiagramDocument myDocument;
-
-		/**
-		 * @generated
-		 */
-		private IEditorInput myEditorInput;
-
-		/**
-		 * @generated
-		 */
-		private boolean myUpdateCache = true;
-
-		/**
-		 * @generated
-		 */
-		private boolean myModifiable = false;
-
-		/**
-		 * @generated
-		 */
-		private boolean myReadOnly = true;
-
-		/**
-		 * @generated
-		 */
-		private ResourceSetModificationListener myResourceSetListener;
-
-		/**
-		 * @generated
-		 */
-		public ResourceSetInfo(IDiagramDocument document,
-				IEditorInput editorInput) {
-			super(document);
-			myDocument = document;
-			myEditorInput = editorInput;
-			startResourceListening();
-			myResourceSetListener = new ResourceSetModificationListener(this);
-			getResourceSet().eAdapters().add(myResourceSetListener);
-		}
-
-		/**
-		 * @generated
-		 */
-		public long getModificationStamp() {
-			return myModificationStamp;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setModificationStamp(long modificationStamp) {
-			myModificationStamp = modificationStamp;
-		}
-
-		/**
-		 * @generated
-		 */
-		public ResourceSet getResourceSet() {
-			return myDocument.getEditingDomain().getResourceSet();
-		}
-
-		/**
-		 * @generated
-		 */
-		public IEditorInput getEditorInput() {
-			return myEditorInput;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void dispose() {
-			stopResourceListening();
-			getResourceSet().eAdapters().remove(myResourceSetListener);
-			for (Iterator it = getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource resource = (Resource) it.next();
-				resource.unload();
-			}
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isSynchronized() {
-			return myUnSynchronizedResources.size() == 0;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setUnSynchronized(Resource resource) {
-			myUnSynchronizedResources.add(resource);
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setSynchronized(Resource resource) {
-			myUnSynchronizedResources.remove(resource);
-		}
-
-		/**
-		 * @generated
-		 */
-		public final void stopResourceListening() {
-			mySynchronizer.dispose();
-			mySynchronizer = null;
-		}
-
-		/**
-		 * @generated
-		 */
-		public final void startResourceListening() {
-			mySynchronizer = new WorkspaceSynchronizer(myDocument
-					.getEditingDomain(), new SynchronizerDelegate());
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isUpdateCache() {
-			return myUpdateCache;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setUpdateCache(boolean update) {
-			myUpdateCache = update;
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isModifiable() {
-			return myModifiable;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setModifiable(boolean modifiable) {
-			myModifiable = modifiable;
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isReadOnly() {
-			return myReadOnly;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setReadOnly(boolean readOnly) {
-			myReadOnly = readOnly;
-		}
-
-		/**
-		 * @generated
-		 */
-		private class SynchronizerDelegate implements
-				WorkspaceSynchronizer.Delegate {
-
-			/**
-			 * @generated
-			 */
-			public void dispose() {
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceChanged(final Resource resource) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						handleElementChanged(ResourceSetInfo.this, resource,
-								null);
-					}
-				});
-				return true;
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceDeleted(Resource resource) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						fireElementDeleted(ResourceSetInfo.this
-								.getEditorInput());
-					}
-				});
-				return true;
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceMoved(Resource resource,
-					final URI newURI) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				if (myDocument.getDiagram().eResource() == resource) {
-					Display.getDefault().asyncExec(new Runnable() {
-						public void run() {
-							handleElementMoved(ResourceSetInfo.this
-									.getEditorInput(), newURI);
-						}
-					});
-				} else {
-					handleResourceDeleted(resource);
-				}
-				return true;
-			}
-
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private class ResourceSetModificationListener extends EContentAdapter {
-
-		/**
-		 * @generated
-		 */
-		private NotificationFilter myModifiedFilter;
-
-		/**
-		 * @generated
-		 */
-		private ResourceSetInfo myInfo;
-
-		/**
-		 * @generated
-		 */
-		public ResourceSetModificationListener(ResourceSetInfo info) {
-			myInfo = info;
-			myModifiedFilter = NotificationFilter.createEventTypeFilter(
-					Notification.SET).or(
-					NotificationFilter
-							.createEventTypeFilter(Notification.UNSET)).and(
-					NotificationFilter.createFeatureFilter(Resource.class,
-							Resource.RESOURCE__IS_MODIFIED));
-		}
-
-		/**
-		 * @generated
-		 */
-		public void notifyChanged(Notification notification) {
-			if (notification.getNotifier() instanceof ResourceSet) {
-				super.notifyChanged(notification);
-			}
-			if (!notification.isTouch()
-					&& myModifiedFilter.matches(notification)) {
-				if (notification.getNotifier() instanceof Resource) {
-					Resource resource = (Resource) notification.getNotifier();
-					if (resource.isLoaded()) {
-						boolean modified = false;
-						for (Iterator it = myInfo.getResourceSet()
-								.getResources().iterator(); it.hasNext()
-								&& !modified;) {
-							Resource nextResource = (Resource) it.next();
-							if (nextResource.isLoaded()) {
-								modified = nextResource.isModified();
-							}
-						}
-						boolean dirtyStateChanged = false;
-						synchronized (myInfo) {
-							if (modified != myInfo.fCanBeSaved) {
-								myInfo.fCanBeSaved = modified;
-								dirtyStateChanged = true;
-							}
-							if (!resource.isModified()) {
-								myInfo.setSynchronized(resource);
-							}
-						}
-						if (dirtyStateChanged) {
-							fireElementDirtyStateChanged(myInfo
-									.getEditorInput(), modified);
-
-							if (!modified) {
-								myInfo
-										.setModificationStamp(computeModificationStamp(myInfo));
-							}
-						}
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLInitDiagramFileAction.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLInitDiagramFileAction.java
deleted file mode 100644
index 41962ec..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLInitDiagramFileAction.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.core.resources.IFile;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
-
-import org.eclipse.jface.action.IAction;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-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.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @generated
- */
-public class UMLInitDiagramFileAction implements IObjectActionDelegate {
-
-	/**
-	 * @generated
-	 */
-	private IWorkbenchPart targetPart;
-
-	/**
-	 * @generated
-	 */
-	private URI domainModelURI;
-
-	/**
-	 * @generated
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		this.targetPart = targetPart;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		domainModelURI = null;
-		action.setEnabled(false);
-		if (selection instanceof IStructuredSelection == false
-				|| selection.isEmpty()) {
-			return;
-		}
-		IFile file = (IFile) ((IStructuredSelection) selection)
-				.getFirstElement();
-		domainModelURI = URI.createPlatformResourceURI(file.getFullPath()
-				.toString(), true);
-		action.setEnabled(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Shell getShell() {
-		return targetPart.getSite().getShell();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void run(IAction action) {
-		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
-				.createEditingDomain();
-		ResourceSet resourceSet = new ResourceSetImpl();
-		EObject diagramRoot = null;
-		try {
-			Resource resource = resourceSet.getResource(domainModelURI, true);
-			diagramRoot = (EObject) resource.getContents().get(0);
-		} catch (WrappedException ex) {
-			ActivityDiagramEditorPlugin.getInstance().logError(
-					"Unable to load resource: " + domainModelURI, ex); //$NON-NLS-1$
-		}
-		if (diagramRoot == null) {
-			MessageDialog
-					.openError(
-							getShell(),
-							Messages.UMLInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle,
-							Messages.UMLInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage);
-			return;
-		}
-		Wizard wizard = new UMLNewDiagramFileWizard(domainModelURI,
-				diagramRoot, editingDomain);
-		wizard.setWindowTitle(NLS.bind(
-				Messages.UMLInitDiagramFileAction_InitDiagramFileWizardTitle,
-				ActivityEditPart.MODEL_ID));
-		UMLDiagramEditorUtil.runWizard(getShell(), wizard, "InitDiagramFile"); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLLoadResourceAction.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLLoadResourceAction.java
deleted file mode 100644
index 862194e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLLoadResourceAction.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.emf.edit.ui.action.LoadResourceAction.LoadResourceDialog;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-/**
- * @generated
- */
-public class UMLLoadResourceAction implements IObjectActionDelegate {
-
-	/**
-	 * @generated
-	 */
-	private ActivityEditPart mySelectedElement;
-
-	/**
-	 * @generated
-	 */
-	private Shell myShell;
-
-	/**
-	 * @generated
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		myShell = targetPart.getSite().getShell();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void run(IAction action) {
-		LoadResourceDialog loadResourceDialog = new LoadResourceDialog(myShell,
-				mySelectedElement.getEditingDomain());
-		loadResourceDialog.open();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		mySelectedElement = null;
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			if (structuredSelection.size() == 1
-					&& structuredSelection.getFirstElement() instanceof ActivityEditPart) {
-				mySelectedElement = (ActivityEditPart) structuredSelection
-						.getFirstElement();
-			}
-		}
-		action.setEnabled(isEnabled());
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean isEnabled() {
-		return mySelectedElement != null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLMatchingStrategy.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLMatchingStrategy.java
deleted file mode 100644
index a0b86c6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLMatchingStrategy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import org.eclipse.emf.common.ui.URIEditorInput;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditorMatchingStrategy;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PartInitException;
-
-/**
- * @generated
- */
-public class UMLMatchingStrategy implements IEditorMatchingStrategy {
-
-	/**
-	 * @generated
-	 */
-	public boolean matches(IEditorReference editorRef, IEditorInput input) {
-		IEditorInput editorInput;
-		try {
-			editorInput = editorRef.getEditorInput();
-		} catch (PartInitException e) {
-			return false;
-		}
-
-		if (editorInput.equals(input)) {
-			return true;
-		}
-		if (editorInput instanceof URIEditorInput
-				&& input instanceof URIEditorInput) {
-			return ((URIEditorInput) editorInput).getURI().equals(
-					((URIEditorInput) input).getURI());
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLNewDiagramFileWizard.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLNewDiagramFileWizard.java
deleted file mode 100644
index 6f251b4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLNewDiagramFileWizard.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.io.IOException;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-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.ResourceSet;
-
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-
-import org.eclipse.gmf.runtime.diagram.core.services.view.CreateDiagramViewOperation;
-
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.notation.Diagram;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-
-import org.eclipse.osgi.util.NLS;
-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.Label;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @generated
- */
-public class UMLNewDiagramFileWizard extends Wizard {
-
-	/**
-	 * @generated
-	 */
-	private TransactionalEditingDomain myEditingDomain;
-
-	/**
-	 * @generated
-	 */
-	public UMLNewDiagramFileWizard(URI domainModelURI, EObject diagramRoot,
-			TransactionalEditingDomain editingDomain) {
-		assert domainModelURI != null : "Domain model uri must be specified"; //$NON-NLS-1$
-		assert diagramRoot != null : "Doagram root element must be specified"; //$NON-NLS-1$
-		assert editingDomain != null : "Editing domain must be specified"; //$NON-NLS-1$
-
-		myFileCreationPage = new WizardNewFileCreationPage(
-				Messages.UMLNewDiagramFileWizard_CreationPageName,
-				StructuredSelection.EMPTY);
-		myFileCreationPage
-				.setTitle(Messages.UMLNewDiagramFileWizard_CreationPageTitle);
-		myFileCreationPage.setDescription(NLS.bind(
-				Messages.UMLNewDiagramFileWizard_CreationPageDescription,
-				ActivityEditPart.MODEL_ID));
-		IPath filePath;
-		String fileName = domainModelURI.trimFileExtension().lastSegment();
-		if (domainModelURI.isPlatformResource()) {
-			filePath = new Path(domainModelURI.trimSegments(1)
-					.toPlatformString(true));
-		} else if (domainModelURI.isFile()) {
-			filePath = new Path(domainModelURI.trimSegments(1).toFileString());
-		} else {
-			// TODO : use some default path
-			throw new IllegalArgumentException(
-					"Unsupported URI: " + domainModelURI); //$NON-NLS-1$
-		}
-		myFileCreationPage.setContainerFullPath(filePath);
-		myFileCreationPage.setFileName(UMLDiagramEditorUtil.getUniqueFileName(
-				filePath, fileName, "xmi")); //$NON-NLS-1$
-
-		diagramRootElementSelectionPage = new DiagramRootElementSelectionPage(
-				Messages.UMLNewDiagramFileWizard_RootSelectionPageName);
-		diagramRootElementSelectionPage
-				.setTitle(Messages.UMLNewDiagramFileWizard_RootSelectionPageTitle);
-		diagramRootElementSelectionPage
-				.setDescription(Messages.UMLNewDiagramFileWizard_RootSelectionPageDescription);
-		diagramRootElementSelectionPage.setModelElement(diagramRoot);
-
-		myEditingDomain = editingDomain;
-	}
-
-	/**
-	 * @generated
-	 */
-	private WizardNewFileCreationPage myFileCreationPage;
-
-	/**
-	 * @generated
-	 */
-	private ModelElementSelectionPage diagramRootElementSelectionPage;
-
-	/**
-	 * @generated
-	 */
-	public void addPages() {
-		addPage(myFileCreationPage);
-		addPage(diagramRootElementSelectionPage);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean performFinish() {
-		List affectedFiles = new LinkedList();
-		IFile diagramFile = myFileCreationPage.createNewFile();
-		UMLDiagramEditorUtil.setCharset(diagramFile);
-		affectedFiles.add(diagramFile);
-		URI diagramModelURI = URI.createPlatformResourceURI(diagramFile
-				.getFullPath().toString(), true);
-		ResourceSet resourceSet = myEditingDomain.getResourceSet();
-		final Resource diagramResource = resourceSet
-				.createResource(diagramModelURI);
-		AbstractTransactionalCommand command = new AbstractTransactionalCommand(
-				myEditingDomain,
-				Messages.UMLNewDiagramFileWizard_InitDiagramCommand,
-				affectedFiles) {
-
-			protected CommandResult doExecuteWithResult(
-					IProgressMonitor monitor, IAdaptable info)
-					throws ExecutionException {
-				int diagramVID = UMLVisualIDRegistry
-						.getDiagramVisualID(diagramRootElementSelectionPage
-								.getModelElement());
-				if (diagramVID != ActivityEditPart.VISUAL_ID) {
-					return CommandResult
-							.newErrorCommandResult(Messages.UMLNewDiagramFileWizard_IncorrectRootError);
-				}
-				Diagram diagram = ViewService.createDiagram(
-						diagramRootElementSelectionPage.getModelElement(),
-						ActivityEditPart.MODEL_ID,
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				diagramResource.getContents().add(diagram);
-				diagramResource.getContents().add(diagram.getElement());
-				return CommandResult.newOKCommandResult();
-			}
-		};
-		try {
-			OperationHistoryFactory.getOperationHistory().execute(command,
-					new NullProgressMonitor(), null);
-			diagramResource.save(UMLDiagramEditorUtil.getSaveOptions());
-			UMLDiagramEditorUtil.openDiagram(diagramResource);
-		} catch (ExecutionException e) {
-			ActivityDiagramEditorPlugin.getInstance().logError(
-					"Unable to create model and diagram", e); //$NON-NLS-1$
-		} catch (IOException ex) {
-			ActivityDiagramEditorPlugin.getInstance().logError(
-					"Save operation failed for: " + diagramModelURI, ex); //$NON-NLS-1$
-		} catch (PartInitException ex) {
-			ActivityDiagramEditorPlugin.getInstance().logError(
-					"Unable to open editor", ex); //$NON-NLS-1$
-		}
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class DiagramRootElementSelectionPage extends
-			ModelElementSelectionPage {
-
-		/**
-		 * @generated
-		 */
-		protected DiagramRootElementSelectionPage(String pageName) {
-			super(pageName);
-		}
-
-		/**
-		 * @generated
-		 */
-		protected String getSelectionTitle() {
-			return Messages.UMLNewDiagramFileWizard_RootSelectionPageSelectionTitle;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected boolean validatePage() {
-			if (selectedModelElement == null) {
-				setErrorMessage(Messages.UMLNewDiagramFileWizard_RootSelectionPageNoSelectionMessage);
-				return false;
-			}
-			boolean result = ViewService
-					.getInstance()
-					.provides(
-							new CreateDiagramViewOperation(
-									new EObjectAdapter(selectedModelElement),
-									ActivityEditPart.MODEL_ID,
-									ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT));
-			setErrorMessage(result ? null
-					: Messages.UMLNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage);
-			return result;
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLPaletteFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLPaletteFactory.java
deleted file mode 100644
index 0fcefd3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLPaletteFactory.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.diagram.ad.providers.UMLElementTypes;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PaletteSeparator;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool;
-import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class UMLPaletteFactory {
-
-	/**
-	 * @generated
-	 */
-	public void fillPalette(PaletteRoot paletteRoot) {
-		paletteRoot.add(createFlows1Group());
-		paletteRoot.add(createNodes2Group());
-	}
-
-	/**
-	 * @modified
-	 */
-	private PaletteContainer createFlows1Group() {
-		PaletteContainer paletteContainer = new PaletteDrawer(
-				DiagramCoreResources.ActivityDiagram_Palette_flows_title);
-		paletteContainer
-				.setDescription(DiagramCoreResources.ActivityDiagram_Palette_flows_create_text);
-		paletteContainer.add(createControlFlow1CreationTool());
-		return paletteContainer;
-	}
-
-	/**
-	 * @modified
-	 */
-	private PaletteContainer createNodes2Group() {
-		PaletteContainer paletteContainer = new PaletteDrawer(
-				DiagramCoreResources.ActivityDiagram_Palette_nodes_titles);
-		paletteContainer
-				.setDescription(DiagramCoreResources.ActivityDiagram_Palette_nodes_group_text);
-		paletteContainer.add(createActivityPartition1CreationTool());
-		paletteContainer.add(createStartNode2CreationTool());
-		paletteContainer.add(createEndNode6CreationTool());
-		paletteContainer.add(createForkNode3CreationTool());
-		paletteContainer.add(createJoinNode7CreationTool());
-		paletteContainer.add(createDecisionNode5CreationTool());
-		paletteContainer.add(createMergeNode4CreationTool());
-		paletteContainer.add(new PaletteSeparator());
-		paletteContainer.add(createActivity9CreationTool());
-		paletteContainer.add(createIteration11CreationTool());
-		paletteContainer.add(createPhase10CreationTool());
-		paletteContainer.add(createMilestone13CreationTool());
-		paletteContainer.add(createTaskDescriptor12CreationTool());
-		return paletteContainer;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createControlFlow1CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.ControlFlow_3001);
-		LinkToolEntry entry = new LinkToolEntry(
-				DiagramCoreResources.ActivityDiagram_Palette_control_flow_text,
-				DiagramCoreResources.ActivityDiagram_Palette_control_flow_create_text, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getControlFlow(),
-				UMLElementTypes.ControlFlow_3001)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createActivityPartition1CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(2);
-		types.add(UMLElementTypes.ActivityPartition_1008);
-		types.add(UMLElementTypes.ActivityPartition_2001);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Partition_Node_text,
-				DiagramCoreResources.ActivityDiagram_Partition_Node_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getActivityPartition(),
-				UMLElementTypes.ActivityPartition_1008)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createStartNode2CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.InitialNode_1004);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_StartNode_text,
-				DiagramCoreResources.ActivityDiagram_StartNode_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getInitialNode(),
-				UMLElementTypes.InitialNode_1004)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createForkNode3CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.ForkNode_1003);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Fork_Node_text,
-				DiagramCoreResources.ActivityDiagram_Fork_Node_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getForkNode(),
-				UMLElementTypes.ForkNode_1003)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createMergeNode4CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.MergeNode_1002);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Merge_Node_text,
-				DiagramCoreResources.ActivityDiagram_Merge_Node_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getMergeNode(),
-				UMLElementTypes.MergeNode_1002)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createDecisionNode5CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.DecisionNode_1005);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_DecisionNode_text,
-				DiagramCoreResources.ActivityDiagram_DecisionNode_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getDecisionNode(),
-				UMLElementTypes.DecisionNode_1005)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createEndNode6CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.ActivityFinalNode_1001);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_EndNode_text, 
-				DiagramCoreResources.ActivityDiagram_EndNode_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getActivityFinalNode(),
-				UMLElementTypes.ActivityFinalNode_1001)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createJoinNode7CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.JoinNode_1006);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Join_Node_text,
-				DiagramCoreResources.ActivityDiagram_Join_Node_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(
-				UMLPackage.eINSTANCE.getJoinNode(),
-				UMLElementTypes.JoinNode_1006)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createActivity9CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.StructuredActivityNode_1007);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Activity_text, 
-				DiagramCoreResources.ActivityDiagram_Activity_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(null,
-				UMLElementTypes.StructuredActivityNode_1007)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createPhase10CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.StructuredActivityNode_1010);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Phase_text, 
-				DiagramCoreResources.ActivityDiagram_Phase_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(null,
-				UMLElementTypes.StructuredActivityNode_1010)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createIteration11CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.StructuredActivityNode_1011);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Iteration_text,
-				DiagramCoreResources.ActivityDiagram_Iteration_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(null,
-				UMLElementTypes.StructuredActivityNode_1011)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createTaskDescriptor12CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.ActivityParameterNode_1009);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.AbstractDiagram_TaskDescriptor_text,
-				DiagramCoreResources.AbstractDiagram_TaskDescriptor_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(null,
-				UMLElementTypes.ActivityParameterNode_1009)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createMilestone13CreationTool() {
-		List/* <IElementType> */types = new ArrayList/* <IElementType> */(1);
-		types.add(UMLElementTypes.ActivityParameterNode_1012);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.ActivityDiagram_Milestone_text,
-				DiagramCoreResources.ActivityDiagram_Milestone_tooltip, types);
-		entry.setSmallIcon(UMLElementTypes.getImageDescriptor(null,
-				UMLElementTypes.ActivityParameterNode_1012)); //$NON-NLS-1$
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class NodeToolEntry extends ToolEntry {
-
-		/**
-		 * @generated
-		 */
-		private final List elementTypes;
-
-		/**
-		 * @generated
-		 */
-		private NodeToolEntry(String title, String description,
-				List elementTypes) {
-			super(title, description, null, null);
-			this.elementTypes = elementTypes;
-		}
-
-		/**
-		 * @modified
-		 */
-		public Tool createTool() {
-			Tool tool = new UnspecifiedTypeCreationTool(elementTypes) {
-				@Override
-				protected void updateTargetRequest() {
-					CreateRequest req = getCreateRequest();
-					if (isInState(STATE_DRAG_IN_PROGRESS)) {
-						req.setSize(null);
-						req.setLocation(getLocation());
-					} else {
-						req.setSize(null);
-						req.setLocation(getLocation());
-					}
-				}
-			};
-			tool.setProperties(getToolProperties());
-			BridgeHelper.elementTypes.add((IElementType) elementTypes
-					.get(elementTypes.size() - 1));
-			return tool;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class LinkToolEntry extends ToolEntry {
-
-		/**
-		 * @generated
-		 */
-		private final List relationshipTypes;
-
-		/**
-		 * @generated
-		 */
-		private LinkToolEntry(String title, String description,
-				List relationshipTypes) {
-			super(title, description, null, null);
-			this.relationshipTypes = relationshipTypes;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Tool createTool() {
-			Tool tool = new UnspecifiedTypeConnectionTool(relationshipTypes);
-			tool.setProperties(getToolProperties());
-			return tool;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLVisualIDRegistry.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLVisualIDRegistry.java
deleted file mode 100644
index 1086ce0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/part/UMLVisualIDRegistry.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.part;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartment2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartmentEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.expressions.UMLAbstractExpression;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityFinalNode;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.DecisionNode;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.InitialNode;
-import org.eclipse.uml2.uml.JoinNode;
-import org.eclipse.uml2.uml.MergeNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * This registry is used to determine which type of visual object should be
- * created for the corresponding Diagram, Node, ChildNode or Link represented 
- * by a domain model object.
- *
- * @generated
- */
-public class UMLVisualIDRegistry {
-
-	/**
-	 * @generated
-	 */
-	private static final String DEBUG_KEY = ActivityDiagramEditorPlugin
-			.getInstance().getBundle().getSymbolicName()
-			+ "/debug/visualID"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static int getVisualID(View view) {
-		if (view instanceof Diagram) {
-			if (ActivityEditPart.MODEL_ID.equals(view.getType())) {
-				return ActivityEditPart.VISUAL_ID;
-			} else {
-				return -1;
-			}
-		}
-		return getVisualID(view.getType());
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getModelID(View view) {
-		View diagram = view.getDiagram();
-		while (view != diagram) {
-			EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
-			if (annotation != null) {
-				return (String) annotation.getDetails().get("modelID"); //$NON-NLS-1$
-			}
-			view = (View) view.eContainer();
-		}
-		return diagram != null ? diagram.getType() : null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getVisualID(String type) {
-		try {
-			return Integer.parseInt(type);
-		} catch (NumberFormatException e) {
-			if (Boolean.TRUE.toString().equalsIgnoreCase(
-					Platform.getDebugOption(DEBUG_KEY))) {
-				ActivityDiagramEditorPlugin.getInstance().logError(
-						"Unable to parse view type as a visualID number: "
-								+ type);
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getType(int visualID) {
-		return String.valueOf(visualID);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getDiagramVisualID(EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getDiagramVisualID(domainElement, domainElementMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private static int getDiagramVisualID(EObject domainElement,
-			EClass domainElementMetaclass) {
-		if (UMLPackage.eINSTANCE.getActivity().isSuperTypeOf(
-				domainElementMetaclass)
-				&& isDiagramActivity_79((Activity) domainElement)) {
-			return ActivityEditPart.VISUAL_ID;
-		}
-		return getUnrecognizedDiagramID(domainElement);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getNodeVisualID(View containerView, EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getNodeVisualID(containerView, domainElement,
-				domainElementMetaclass, null);
-	}
-
-	/**
-	 * @modified
-	 */
-	public static int getNodeVisualID(View containerView,
-			EObject domainElement, EClass domainElementMetaclass,
-			String semanticHint) {
-		String containerModelID = getModelID(containerView);
-		if (!ActivityEditPart.MODEL_ID.equals(containerModelID)) {
-			return -1;
-		}
-		int containerVisualID;
-		if (ActivityEditPart.MODEL_ID.equals(containerModelID)) {
-			containerVisualID = getVisualID(containerView);
-		} else {
-			if (containerView instanceof Diagram) {
-				containerVisualID = ActivityEditPart.VISUAL_ID;
-			} else {
-				return -1;
-			}
-		}
-		int nodeVisualID = semanticHint != null ? getVisualID(semanticHint)
-				: -1;
-		switch (containerVisualID) {
-		case ActivityFinalNodeEditPart.VISUAL_ID:
-			if (ActivityFinalNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityFinalNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityFinalNode_1001ChildNodeID(
-					domainElement, semanticHint);
-		case MergeNodeEditPart.VISUAL_ID:
-			if (MergeNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return MergeNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedMergeNode_1002ChildNodeID(domainElement,
-					semanticHint);
-		case ForkNodeEditPart.VISUAL_ID:
-			return getUnrecognizedForkNode_1003ChildNodeID(domainElement,
-					semanticHint);
-		case InitialNodeEditPart.VISUAL_ID:
-			if (InitialNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return InitialNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedInitialNode_1004ChildNodeID(domainElement,
-					semanticHint);
-		case DecisionNodeEditPart.VISUAL_ID:
-			if (DecisionNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return DecisionNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedDecisionNode_1005ChildNodeID(domainElement,
-					semanticHint);
-		case JoinNodeEditPart.VISUAL_ID:
-			return getUnrecognizedJoinNode_1006ChildNodeID(domainElement,
-					semanticHint);
-		case StructuredActivityNodeEditPart.VISUAL_ID:
-			if (StructuredActivityNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return StructuredActivityNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedStructuredActivityNode_1007ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityPartitionEditPart.VISUAL_ID:
-			if (ActivityPartitionName2EditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityPartitionName2EditPart.VISUAL_ID;
-			}
-			if (ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID;
-			}
-			if (StructuredActivityNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return StructuredActivityNodeEditPart.VISUAL_ID;
-			}
-			if (StructuredActivityNode2EditPart.VISUAL_ID == nodeVisualID) {
-				return StructuredActivityNode2EditPart.VISUAL_ID;
-			}
-			if (StructuredActivityNode3EditPart.VISUAL_ID == nodeVisualID) {
-				return StructuredActivityNode3EditPart.VISUAL_ID;
-			}
-			if (InitialNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return InitialNodeEditPart.VISUAL_ID;
-			}
-			if (ActivityFinalNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityFinalNodeEditPart.VISUAL_ID;
-			}
-			if (JoinNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return JoinNodeEditPart.VISUAL_ID;
-			}
-			if (ForkNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return ForkNodeEditPart.VISUAL_ID;
-			}
-			if (MergeNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return MergeNodeEditPart.VISUAL_ID;
-			}
-			if (DecisionNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return DecisionNodeEditPart.VISUAL_ID;
-			}
-			if (ActivityParameterNodeEditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityParameterNodeEditPart.VISUAL_ID;
-			}
-			if (ActivityParameterNode2EditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityParameterNode2EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityPartition_1008ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityParameterNodeEditPart.VISUAL_ID:
-			if (ActivityParameterNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityParameterNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityParameterNode_1009ChildNodeID(
-					domainElement, semanticHint);
-		case StructuredActivityNode2EditPart.VISUAL_ID:
-			if (StructuredActivityNodeName2EditPart.VISUAL_ID == nodeVisualID) {
-				return StructuredActivityNodeName2EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedStructuredActivityNode_1010ChildNodeID(
-					domainElement, semanticHint);
-		case StructuredActivityNode3EditPart.VISUAL_ID:
-			if (StructuredActivityNodeName3EditPart.VISUAL_ID == nodeVisualID) {
-				return StructuredActivityNodeName3EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedStructuredActivityNode_1011ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityParameterNode2EditPart.VISUAL_ID:
-			if (ActivityParameterNodeName2EditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityParameterNodeName2EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityParameterNode_1012ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityPartition2EditPart.VISUAL_ID:
-			if (ActivityPartitionNameEditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityPartitionNameEditPart.VISUAL_ID;
-			}
-			if (ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID == nodeVisualID) {
-				return ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityPartition_2001ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID:
-			if ((semanticHint == null || ActivityPartition2EditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getActivityPartition()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeActivityPartition_2001((ActivityPartition) domainElement))) {
-				return ActivityPartition2EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityPartitionPartitionCampartment_5001ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID:
-			if ((semanticHint == null || ActivityPartition2EditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getActivityPartition()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeActivityPartition_2001((ActivityPartition) domainElement))) {
-				return ActivityPartition2EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityPartitionPartitionCampartment_5002ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityEditPart.VISUAL_ID:
-			if ((semanticHint == null || ActivityFinalNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getActivityFinalNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeActivityFinalNode_1001((ActivityFinalNode) domainElement))) {
-				return ActivityFinalNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || MergeNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getMergeNode().isSuperTypeOf(
-							domainElementMetaclass)
-					&& (domainElement == null || isNodeMergeNode_1002((MergeNode) domainElement))) {
-				return MergeNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || ForkNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getForkNode().isSuperTypeOf(
-							domainElementMetaclass)
-					&& (domainElement == null || isNodeForkNode_1003((ForkNode) domainElement))) {
-				return ForkNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || InitialNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getInitialNode().isSuperTypeOf(
-							domainElementMetaclass)
-					&& (domainElement == null || isNodeInitialNode_1004((InitialNode) domainElement))) {
-				return InitialNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || DecisionNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getDecisionNode().isSuperTypeOf(
-							domainElementMetaclass)
-					&& (domainElement == null || isNodeDecisionNode_1005((DecisionNode) domainElement))) {
-				return DecisionNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || JoinNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getJoinNode().isSuperTypeOf(
-							domainElementMetaclass)
-					&& (domainElement == null || isNodeJoinNode_1006((JoinNode) domainElement))) {
-				return JoinNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || StructuredActivityNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getStructuredActivityNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeStructuredActivityNode_1007((StructuredActivityNode) domainElement))) {
-				return StructuredActivityNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || ActivityPartitionEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getActivityPartition()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeActivityPartition_1008((ActivityPartition) domainElement))) {
-				return ActivityPartitionEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || ActivityParameterNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getActivityParameterNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeActivityParameterNode_1009((ActivityParameterNode) domainElement))) {
-				return ActivityParameterNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || StructuredActivityNode2EditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getStructuredActivityNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeStructuredActivityNode_1010((StructuredActivityNode) domainElement))) {
-				return StructuredActivityNode2EditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || StructuredActivityNode3EditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getStructuredActivityNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeStructuredActivityNode_1011((StructuredActivityNode) domainElement))) {
-				return StructuredActivityNode3EditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || ActivityParameterNode2EditPart.VISUAL_ID == nodeVisualID)
-					&& UMLPackage.eINSTANCE.getActivityParameterNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeActivityParameterNode_1012((ActivityParameterNode) domainElement))) {
-				return ActivityParameterNode2EditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivity_79ChildNodeID(domainElement,
-					semanticHint);
-		case ControlFlowEditPart.VISUAL_ID:
-			if (ControlFlowNameEditPart.VISUAL_ID == nodeVisualID) {
-				return ControlFlowNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedControlFlow_3001LinkLabelID(semanticHint);
-		}
-		return -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getLinkWithClassVisualID(EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getLinkWithClassVisualID(domainElement, domainElementMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getLinkWithClassVisualID(EObject domainElement,
-			EClass domainElementMetaclass) {
-		if (UMLPackage.eINSTANCE.getControlFlow().isSuperTypeOf(
-				domainElementMetaclass)
-				&& (domainElement == null || isLinkWithClassControlFlow_3001((ControlFlow) domainElement))) {
-			return ControlFlowEditPart.VISUAL_ID;
-		} else {
-			return getUnrecognizedLinkWithClassID(domainElement);
-		}
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isDiagramActivity_79(Activity element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedDiagramID(EObject domainElement) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeActivityFinalNode_1001(
-			ActivityFinalNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeMergeNode_1002(MergeNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeForkNode_1003(ForkNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeInitialNode_1004(InitialNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeDecisionNode_1005(DecisionNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeJoinNode_1006(JoinNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeStructuredActivityNode_1007(
-			StructuredActivityNode element) {
-		return StructuredActivityNode_1007.matches(element);
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeActivityPartition_1008(
-			ActivityPartition element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeActivityParameterNode_1009(
-			ActivityParameterNode element) {
-		return ActivityParameterNode_1009.matches(element);
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeStructuredActivityNode_1010(
-			StructuredActivityNode element) {
-		return StructuredActivityNode_1010.matches(element);
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeStructuredActivityNode_1011(
-			StructuredActivityNode element) {
-		return StructuredActivityNode_1011.matches(element);
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeActivityParameterNode_1012(
-			ActivityParameterNode element) {
-		return ActivityParameterNode_1012.matches(element);
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeActivityPartition_2001(
-			ActivityPartition element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityFinalNode_1001ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedMergeNode_1002ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedForkNode_1003ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedInitialNode_1004ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedDecisionNode_1005ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedJoinNode_1006ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedStructuredActivityNode_1007ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityPartition_1008ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityParameterNode_1009ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedStructuredActivityNode_1010ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedStructuredActivityNode_1011ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityParameterNode_1012ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityPartition_2001ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityPartitionPartitionCampartment_5001ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityPartitionPartitionCampartment_5002ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivity_79ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedControlFlow_3001LinkLabelID(
-			String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedLinkWithClassID(EObject domainElement) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isLinkWithClassControlFlow_3001(ControlFlow element) {
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static final Matcher StructuredActivityNode_1007 = new Matcher(
-			new UMLAbstractExpression(UMLPackage.eINSTANCE
-					.getStructuredActivityNode()) {
-				protected Object doEvaluate(Object context, Map env) {
-					StructuredActivityNode self = (StructuredActivityNode) context;
-					return JavaMatchers.getUmaType_Activity(self);
-				}
-			});
-
-	/**
-	 * @generated
-	 */
-	private static final Matcher ActivityParameterNode_1009 = new Matcher(
-			new UMLAbstractExpression(UMLPackage.eINSTANCE
-					.getActivityParameterNode()) {
-				protected Object doEvaluate(Object context, Map env) {
-					ActivityParameterNode self = (ActivityParameterNode) context;
-					return JavaMatchers.getUmaType_TaskDescriptor(self);
-				}
-			});
-
-	/**
-	 * @generated
-	 */
-	private static final Matcher StructuredActivityNode_1010 = new Matcher(
-			new UMLAbstractExpression(UMLPackage.eINSTANCE
-					.getStructuredActivityNode()) {
-				protected Object doEvaluate(Object context, Map env) {
-					StructuredActivityNode self = (StructuredActivityNode) context;
-					return JavaMatchers.getUmaType_Phase(self);
-				}
-			});
-
-	/**
-	 * @generated
-	 */
-	private static final Matcher StructuredActivityNode_1011 = new Matcher(
-			new UMLAbstractExpression(UMLPackage.eINSTANCE
-					.getStructuredActivityNode()) {
-				protected Object doEvaluate(Object context, Map env) {
-					StructuredActivityNode self = (StructuredActivityNode) context;
-					return JavaMatchers.getUmaType_Iteration(self);
-				}
-			});
-
-	/**
-	 * @generated
-	 */
-	private static final Matcher ActivityParameterNode_1012 = new Matcher(
-			new UMLAbstractExpression(UMLPackage.eINSTANCE
-					.getActivityParameterNode()) {
-				protected Object doEvaluate(Object context, Map env) {
-					ActivityParameterNode self = (ActivityParameterNode) context;
-					return JavaMatchers.getUmaType_Milestone(self);
-				}
-			});
-
-	/**
-	 * @generated	
-	 */
-	static class Matcher {
-
-		/**
-		 * @generated	
-		 */
-		private UMLAbstractExpression condition;
-
-		/**
-		 * @generated	
-		 */
-		Matcher(UMLAbstractExpression conditionExpression) {
-			this.condition = conditionExpression;
-		}
-
-		/**
-		 * @generated	
-		 */
-		boolean matches(Object object) {
-			Object result = condition.evaluate(object);
-			return result instanceof Boolean
-					&& ((Boolean) result).booleanValue();
-		}
-	}// Matcher
-
-	/**
-	 * @generated
-	 */
-	private static class JavaMatchers {
-
-		/**
-		 * @modified
-		 */
-		private static Boolean getUmaType_Activity(StructuredActivityNode self) {
-			// TODO: implement this method
-			// Ensure that you remove @generated or mark it @generated NOT
-
-			Boolean bl = new Boolean(false);
-			String type = BridgeHelper.getEAnnotationType(self,
-					BridgeHelper.UMA_TYPE);
-			if (BridgeHelper.UMA_ACTIVITY.equalsIgnoreCase(type)) {
-				return bl.TRUE;
-			}
-			return bl;
-			//			throw new UMLAbstractExpression.NoImplException(
-			//					"No user java implementation provided in 'getUmaType_Activity' operation"); //$NON-NLS-1$
-		}
-
-		/**
-		 * @modified
-		 */
-		private static Boolean getUmaType_TaskDescriptor(
-				ActivityParameterNode self) {
-			// TODO: implement this method
-			// Ensure that you remove @generated or mark it @generated NOT
-
-			Boolean bl = new Boolean(false);
-			String type = BridgeHelper.getEAnnotationType(self,
-					BridgeHelper.UMA_TYPE);
-			if (BridgeHelper.UMA_TASK_DESCRIPTOR.equalsIgnoreCase(type)) {
-				return bl.TRUE;
-			}
-			return bl;
-			//			throw new UMLAbstractExpression.NoImplException(
-			//					"No user java implementation provided in 'getUmaType_TaskDescriptor' operation"); //$NON-NLS-1$
-		}
-
-		/**
-		 * @modified
-		 */
-		private static Boolean getUmaType_Phase(StructuredActivityNode self) {
-			// TODO: implement this method
-			// Ensure that you remove @generated or mark it @generated NOT
-
-			Boolean bl = new Boolean(false);
-			String type = BridgeHelper.getEAnnotationType(self,
-					BridgeHelper.UMA_TYPE);
-			if (BridgeHelper.UMA_PHASE.equalsIgnoreCase(type)) {
-				return bl.TRUE;
-			}
-			return bl;
-			//			throw new UMLAbstractExpression.NoImplException(
-			//					"No user java implementation provided in 'getUmaType_Phase' operation"); //$NON-NLS-1$
-		}
-
-		/**
-		 * @modified
-		 */
-		private static Boolean getUmaType_Iteration(StructuredActivityNode self) {
-			// TODO: implement this method
-			// Ensure that you remove @generated or mark it @generated NOT
-			Boolean bl = new Boolean(false);
-			String type = BridgeHelper.getEAnnotationType(self,
-					BridgeHelper.UMA_TYPE);
-			if (BridgeHelper.UMA_ITERATION.equalsIgnoreCase(type)) {
-				return bl.TRUE;
-			}
-			return bl;
-			//			throw new UMLAbstractExpression.NoImplException(
-			//					"No user java implementation provided in 'getUmaType_Iteration' operation"); //$NON-NLS-1$
-		}
-
-		/**
-		 * @modified
-		 */
-		private static Boolean getUmaType_Milestone(ActivityParameterNode self) {
-			// TODO: implement this method
-			// Ensure that you remove @generated or mark it @generated NOT
-
-			Boolean bl = new Boolean(false);
-			String type = BridgeHelper.getEAnnotationType(self,
-					BridgeHelper.UMA_TYPE);
-			if (BridgeHelper.UMA_MILESTONE.equalsIgnoreCase(type)) {
-				return bl.TRUE;
-			}
-			return bl;
-			//			throw new UMLAbstractExpression.NoImplException(
-			//					"No user java implementation provided in 'getUmaType_Milestone' operation"); //$NON-NLS-1$
-		}
-	}// JavaMatchers
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramAppearancePreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramAppearancePreferencePage.java
deleted file mode 100644
index b024be1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramAppearancePreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.preferences;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.AppearancePreferencePage;
-
-/**
- * @generated
- */
-public class DiagramAppearancePreferencePage extends AppearancePreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramAppearancePreferencePage() {
-		setPreferenceStore(ActivityDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramConnectionsPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramConnectionsPreferencePage.java
deleted file mode 100644
index ef0937f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramConnectionsPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.preferences;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.ConnectionsPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramConnectionsPreferencePage extends ConnectionsPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramConnectionsPreferencePage() {
-		setPreferenceStore(ActivityDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramGeneralPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramGeneralPreferencePage.java
deleted file mode 100644
index 369f2ef..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramGeneralPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.preferences;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramsPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramGeneralPreferencePage extends DiagramsPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramGeneralPreferencePage() {
-		setPreferenceStore(ActivityDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramPreferenceInitializer.java
deleted file mode 100644
index 9428cad..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramPreferenceInitializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @generated
- */
-public class DiagramPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * @generated
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = getPreferenceStore();
-		DiagramPrintingPreferencePage.initDefaults(store);
-		DiagramGeneralPreferencePage.initDefaults(store);
-		DiagramAppearancePreferencePage.initDefaults(store);
-		DiagramConnectionsPreferencePage.initDefaults(store);
-		DiagramRulersAndGridPreferencePage.initDefaults(store);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return ActivityDiagramEditorPlugin.getInstance().getPreferenceStore();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramPrintingPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramPrintingPreferencePage.java
deleted file mode 100644
index 1d3d29f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramPrintingPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.preferences;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.PrintingPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramPrintingPreferencePage extends PrintingPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramPrintingPreferencePage() {
-		setPreferenceStore(ActivityDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramRulersAndGridPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramRulersAndGridPreferencePage.java
deleted file mode 100644
index 9ac43bf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/preferences/DiagramRulersAndGridPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ad.preferences;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.RulerGridPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramRulersAndGridPreferencePage extends RulerGridPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramRulersAndGridPreferencePage() {
-		setPreferenceStore(ActivityDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/DiagramContributionItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/DiagramContributionItemProvider.java
deleted file mode 100644
index e71a628..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/DiagramContributionItemProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.AbstractContributionItemProvider;
-import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor;
-import org.eclipse.gmf.runtime.diagram.ui.printing.actions.PrintPreviewAction;
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.EnhancedPrintActionHelper;
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.RenderedPrintPreviewAction;
-import org.eclipse.jface.action.IAction;
-
-/**
- * @generated
- * 
- */
-public class DiagramContributionItemProvider extends
-		AbstractContributionItemProvider {
-
-	/**
-	 * @generated
-	 */
-	protected IAction createAction(String actionId,
-			IWorkbenchPartDescriptor partDescriptor) {
-
-		if (actionId.equals(PrintPreviewAction.ID)) {
-			return new RenderedPrintPreviewAction(
-					new EnhancedPrintActionHelper());
-		}
-		return super.createAction(actionId, partDescriptor);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/ElementInitializers.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/ElementInitializers.java
deleted file mode 100644
index c3de617..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/ElementInitializers.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.epf.diagram.ad.expressions.UMLAbstractExpression;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class ElementInitializers {
-
-	/**
-	 * @generated
-	 */
-	public static class Initializers {
-		/**
-		 * @generated
-		 */
-		public static final IObjectInitializer StructuredActivityNode_1007 = new ObjectInitializer(
-				UMLPackage.eINSTANCE.getStructuredActivityNode()) {
-			protected void init() {
-				add(createExpressionFeatureInitializer(EcorePackage.eINSTANCE
-						.getEModelElement_EAnnotations(),
-						new UMLAbstractExpression(UMLPackage.eINSTANCE
-								.getStructuredActivityNode()) {
-							protected Object doEvaluate(Object context, Map env) {
-								StructuredActivityNode self = (StructuredActivityNode) context;
-								return Java.createUmaType_Activity(self);
-							}
-						}));
-			}
-		}; // StructuredActivityNode_1007 ObjectInitializer		
-		/**
-		 * @generated
-		 */
-		public static final IObjectInitializer ActivityParameterNode_1009 = new ObjectInitializer(
-				UMLPackage.eINSTANCE.getActivityParameterNode()) {
-			protected void init() {
-				add(createExpressionFeatureInitializer(EcorePackage.eINSTANCE
-						.getEModelElement_EAnnotations(),
-						new UMLAbstractExpression(UMLPackage.eINSTANCE
-								.getActivityParameterNode()) {
-							protected Object doEvaluate(Object context, Map env) {
-								ActivityParameterNode self = (ActivityParameterNode) context;
-								return Java.createUmaType_TaskDescriptor(self);
-							}
-						}));
-			}
-		}; // ActivityParameterNode_1009 ObjectInitializer		
-		/**
-		 * @generated
-		 */
-		public static final IObjectInitializer StructuredActivityNode_1010 = new ObjectInitializer(
-				UMLPackage.eINSTANCE.getStructuredActivityNode()) {
-			protected void init() {
-				add(createExpressionFeatureInitializer(EcorePackage.eINSTANCE
-						.getEModelElement_EAnnotations(),
-						new UMLAbstractExpression(UMLPackage.eINSTANCE
-								.getStructuredActivityNode()) {
-							protected Object doEvaluate(Object context, Map env) {
-								StructuredActivityNode self = (StructuredActivityNode) context;
-								return Java.createUmaType_Phase(self);
-							}
-						}));
-			}
-		}; // StructuredActivityNode_1010 ObjectInitializer		
-		/**
-		 * @generated
-		 */
-		public static final IObjectInitializer StructuredActivityNode_1011 = new ObjectInitializer(
-				UMLPackage.eINSTANCE.getStructuredActivityNode()) {
-			protected void init() {
-				add(createExpressionFeatureInitializer(EcorePackage.eINSTANCE
-						.getEModelElement_EAnnotations(),
-						new UMLAbstractExpression(UMLPackage.eINSTANCE
-								.getStructuredActivityNode()) {
-							protected Object doEvaluate(Object context, Map env) {
-								StructuredActivityNode self = (StructuredActivityNode) context;
-								return Java.createUmaType_Iteration(self);
-							}
-						}));
-			}
-		}; // StructuredActivityNode_1011 ObjectInitializer		
-		/**
-		 * @generated
-		 */
-		public static final IObjectInitializer ActivityParameterNode_1012 = new ObjectInitializer(
-				UMLPackage.eINSTANCE.getActivityParameterNode()) {
-			protected void init() {
-				add(createExpressionFeatureInitializer(EcorePackage.eINSTANCE
-						.getEModelElement_EAnnotations(),
-						new UMLAbstractExpression(UMLPackage.eINSTANCE
-								.getActivityParameterNode()) {
-							protected Object doEvaluate(Object context, Map env) {
-								ActivityParameterNode self = (ActivityParameterNode) context;
-								return Java.createUmaType_Milestone(self);
-							}
-						}));
-			}
-		}; // ActivityParameterNode_1012 ObjectInitializer
-
-		/** 
-		 * @generated
-		 */
-		private Initializers() {
-		}
-
-		/** 
-		 * @generated
-		 */
-		public static interface IObjectInitializer {
-			/** 
-			 * @generated
-			 */
-			public void init(EObject instance);
-		}
-
-		/** 
-		 * @generated
-		 */
-		public static abstract class ObjectInitializer implements
-				IObjectInitializer {
-			/** 
-			 * @generated
-			 */
-			final EClass element;
-			/** 
-			 * @generated
-			 */
-			private List featureInitializers = new ArrayList();
-
-			/** 
-			 * @generated
-			 */
-			ObjectInitializer(EClass element) {
-				this.element = element;
-				init();
-			}
-
-			/**
-			 * @generated
-			 */
-			protected abstract void init();
-
-			/** 
-			 * @generated
-			 */
-			protected final IFeatureInitializer add(
-					IFeatureInitializer initializer) {
-				featureInitializers.add(initializer);
-				return initializer;
-			}
-
-			/** 
-			 * @generated
-			 */
-			public void init(EObject instance) {
-				for (Iterator it = featureInitializers.iterator(); it.hasNext();) {
-					IFeatureInitializer nextExpr = (IFeatureInitializer) it
-							.next();
-					try {
-						nextExpr.init(instance);
-					} catch (RuntimeException e) {
-						ActivityDiagramEditorPlugin.getInstance().logError(
-								"Feature initialization failed", e); //$NON-NLS-1$						
-					}
-				}
-			}
-		} // end of ObjectInitializer
-
-		/** 
-		 * @generated
-		 */
-		interface IFeatureInitializer {
-			/**
-			 * @generated
-			 */
-			void init(EObject contextInstance);
-		}
-
-		/**
-		 * @generated
-		 */
-		static IFeatureInitializer createNewElementFeatureInitializer(
-				EStructuralFeature initFeature,
-				ObjectInitializer[] newObjectInitializers) {
-			final EStructuralFeature feature = initFeature;
-			final ObjectInitializer[] initializers = newObjectInitializers;
-			return new IFeatureInitializer() {
-				public void init(EObject contextInstance) {
-					for (int i = 0; i < initializers.length; i++) {
-						EObject newInstance = initializers[i].element
-								.getEPackage().getEFactoryInstance().create(
-										initializers[i].element);
-						if (feature.isMany()) {
-							((Collection) contextInstance.eGet(feature))
-									.add(newInstance);
-						} else {
-							contextInstance.eSet(feature, newInstance);
-						}
-						initializers[i].init(newInstance);
-					}
-				}
-			};
-		}
-
-		/**
-		 * @generated
-		 */
-		static IFeatureInitializer createExpressionFeatureInitializer(
-				EStructuralFeature initFeature,
-				UMLAbstractExpression valueExpression) {
-			final EStructuralFeature feature = initFeature;
-			final UMLAbstractExpression expression = valueExpression;
-			return new IFeatureInitializer() {
-				public void init(EObject contextInstance) {
-					expression.assignTo(feature, contextInstance);
-				}
-			};
-		}
-
-		/** 
-		 * @generated
-		 */
-		static class Java {
-
-			/**
-			 * @modified
-			 */
-			private static EList<EAnnotation> createUmaType_Activity(
-					StructuredActivityNode self) {
-				return genericCreateType(self, BridgeHelper.UMA_ACTIVITY);
-			}
-
-			/**
-			 * @modified
-			 */
-			private static EList<EAnnotation> createUmaType_TaskDescriptor(
-					ActivityParameterNode self) {
-				return genericCreateType(self, BridgeHelper.UMA_TASK_DESCRIPTOR);
-			}
-
-			/**
-			 * @modified
-			 */
-			private static EList<EAnnotation> createUmaType_Phase(
-					StructuredActivityNode self) {
-
-				return genericCreateType(self, BridgeHelper.UMA_PHASE);
-			}
-
-			/**
-			 * @modified
-			 */
-			private static EList<EAnnotation> createUmaType_Iteration(
-					StructuredActivityNode self) {
-				return genericCreateType(self, BridgeHelper.UMA_ITERATION);
-			}
-
-			/**
-			 * @modified
-			 */
-			private static EList<EAnnotation> createUmaType_Milestone(
-					ActivityParameterNode self) {
-				return genericCreateType(self, BridgeHelper.UMA_MILESTONE);
-			}
-		} //Java
-	} // end of Initializers
-	
-	
-	/**
-	 * @param self
-	 * @param type
-	 * @return
-	 */
-	private static EList<EAnnotation> genericCreateType(ActivityNode self, String type){
-		EList<EAnnotation> list = BridgeHelper.addEAnnotationType(self,	type);
-		BridgeHelper.setDefaultName(self);
-		return list;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLAbstractParser.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLAbstractParser.java
deleted file mode 100644
index 2e0673d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLAbstractParser.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.text.MessageFormat;
-import java.text.ParsePosition;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EEnumLiteral;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public abstract class UMLAbstractParser implements IParser {
-
-	/**
-	 * @generated
-	 */
-	private String viewPattern;
-
-	/**
-	 * @generated
-	 */
-	private MessageFormat viewProcessor;
-
-	/**
-	 * @generated
-	 */
-	private String editPattern;
-
-	/**
-	 * @generated
-	 */
-	private MessageFormat editProcessor;
-
-	/**
-	 * @generated
-	 */
-	public String getViewPattern() {
-		return viewPattern;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getViewProcessor() {
-		return viewProcessor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setViewPattern(String viewPattern) {
-		this.viewPattern = viewPattern;
-		viewProcessor = createViewProcessor(viewPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat createViewProcessor(String viewPattern) {
-		return new MessageFormat(viewPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditPattern() {
-		return editPattern;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getEditProcessor() {
-		return editProcessor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setEditPattern(String editPattern) {
-		this.editPattern = editPattern;
-		editProcessor = createEditProcessor(editPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat createEditProcessor(String editPattern) {
-		return new MessageFormat(editPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getPrintString(IAdaptable adapter, int flags) {
-		return getStringByPattern(adapter, flags, getViewPattern(),
-				getViewProcessor());
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditString(IAdaptable adapter, int flags) {
-		return getStringByPattern(adapter, flags, getEditPattern(),
-				getEditProcessor());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected abstract String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor);
-
-	/**
-	 * @generated
-	 */
-	public IParserEditStatus isValidEditString(IAdaptable element,
-			String editString) {
-		ParsePosition pos = new ParsePosition(0);
-		Object[] values = getEditProcessor().parse(editString, pos);
-		if (values == null) {
-			return new ParserEditStatus(ActivityDiagramEditorPlugin.ID,
-					IParserEditStatus.UNEDITABLE, "Invalid input at "
-							+ pos.getErrorIndex());
-		}
-		return validateNewValues(values);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateNewValues(Object[] values) {
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, String newString,
-			int flags) {
-		Object[] values = getEditProcessor().parse(newString,
-				new ParsePosition(0));
-		if (values == null
-				|| validateNewValues(values).getCode() != IParserEditStatus.EDITABLE) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return getParseCommand(adapter, values);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected abstract ICommand getParseCommand(IAdaptable adapter,
-			Object[] values);
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor(IAdaptable element) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getModificationCommand(EObject element,
-			EStructuralFeature feature, Object value) {
-		value = getValidNewValue(feature, value);
-		if (value instanceof InvalidValue) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		SetRequest request = new SetRequest(element, feature, value);
-		return new SetValueCommand(request);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getValidValue(EStructuralFeature feature, Object value) {
-		EClassifier type = feature.getEType();
-		if (type instanceof EDataType) {
-			Class iClass = type.getInstanceClass();
-			if (String.class.equals(iClass)) {
-				if (value == null) {
-					value = ""; //$NON-NLS-1$
-				}
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getValidNewValue(EStructuralFeature feature, Object value) {
-		EClassifier type = feature.getEType();
-		if (type instanceof EDataType) {
-			Class iClass = type.getInstanceClass();
-			if (Boolean.TYPE.equals(iClass)) {
-				if (value instanceof Boolean) {
-					// ok
-				} else if (value instanceof String) {
-					value = Boolean.valueOf((String) value);
-				} else {
-					value = new InvalidValue(
-							"Value of type Boolean is expected");
-				}
-			} else if (Character.TYPE.equals(iClass)) {
-				if (value instanceof Character) {
-					// ok
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						value = new Character(s.charAt(0));
-					}
-				} else {
-					value = new InvalidValue(
-							"Value of type Character is expected");
-				}
-			} else if (Byte.TYPE.equals(iClass)) {
-				if (value instanceof Byte) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Byte(((Number) value).byteValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Byte.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Byte value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Byte is expected");
-				}
-			} else if (Short.TYPE.equals(iClass)) {
-				if (value instanceof Short) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Short(((Number) value).shortValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Short.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Short value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Short is expected");
-				}
-			} else if (Integer.TYPE.equals(iClass)) {
-				if (value instanceof Integer) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Integer(((Number) value).intValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Integer.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Integer value");
-						}
-					}
-				} else {
-					value = new InvalidValue(
-							"Value of type Integer is expected");
-				}
-			} else if (Long.TYPE.equals(iClass)) {
-				if (value instanceof Long) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Long(((Number) value).longValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Long.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Long value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Long is expected");
-				}
-			} else if (Float.TYPE.equals(iClass)) {
-				if (value instanceof Float) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Float(((Number) value).floatValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Float.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Float value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Float is expected");
-				}
-			} else if (Double.TYPE.equals(iClass)) {
-				if (value instanceof Double) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Double(((Number) value).doubleValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Double.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Double value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Double is expected");
-				}
-			} else if (type instanceof EEnum) {
-				if (value instanceof String) {
-					EEnumLiteral literal = ((EEnum) type)
-							.getEEnumLiteralByLiteral((String) value);
-					if (literal == null) {
-						value = new InvalidValue("Unknown literal: " + value);
-					} else {
-						value = literal.getInstance();
-					}
-				} else {
-					value = new InvalidValue("Value of type String is expected");
-				}
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected class InvalidValue {
-
-		private String description;
-
-		public InvalidValue(String description) {
-			this.description = description;
-		}
-
-		public String toString() {
-			return description;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLContributionItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLContributionItemProvider.java
deleted file mode 100644
index 08eabbe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLContributionItemProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.AbstractContributionItemProvider;
-
-import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor;
-
-import org.eclipse.gmf.runtime.diagram.ui.printing.actions.PrintPreviewAction;
-
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.EnhancedPrintActionHelper;
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.RenderedPrintPreviewAction;
-
-import org.eclipse.jface.action.IAction;
-
-/**
- * @generated
- */
-public class UMLContributionItemProvider extends
-		AbstractContributionItemProvider {
-
-	/**
-	 * @generated
-	 */
-	protected IAction createAction(String actionId,
-			IWorkbenchPartDescriptor partDescriptor) {
-		if (actionId.equals(PrintPreviewAction.ID)) {
-			return new RenderedPrintPreviewAction(
-					new EnhancedPrintActionHelper());
-		}
-		return super.createAction(actionId, partDescriptor);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLEditPartProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLEditPartProvider.java
deleted file mode 100644
index de0d0c1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLEditPartProvider.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.lang.ref.WeakReference;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.CreateGraphicEditPartOperation;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.IEditPartOperation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.ad.edit.parts.UMLEditPartFactory;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-/**
- * @generated
- */
-public class UMLEditPartProvider extends AbstractEditPartProvider {
-
-	/**
-	 * @generated
-	 */
-	private EditPartFactory factory;
-
-	/**
-	 * @generated
-	 */
-	private boolean allowCaching;
-
-	/**
-	 * @generated
-	 */
-	private WeakReference cachedPart;
-
-	/**
-	 * @generated
-	 */
-	private WeakReference cachedView;
-
-	/**
-	 * @generated
-	 */
-	public UMLEditPartProvider() {
-		setFactory(new UMLEditPartFactory());
-		setAllowCaching(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	public final EditPartFactory getFactory() {
-		return factory;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFactory(EditPartFactory factory) {
-		this.factory = factory;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final boolean isAllowCaching() {
-		return allowCaching;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected synchronized void setAllowCaching(boolean allowCaching) {
-		this.allowCaching = allowCaching;
-		if (!allowCaching) {
-			cachedPart = null;
-			cachedView = null;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IGraphicalEditPart createEditPart(View view) {
-		EditPart part = factory.createEditPart(null, view);
-		if (part instanceof IGraphicalEditPart) {
-			return (IGraphicalEditPart) part;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IGraphicalEditPart getCachedPart(View view) {
-		if (cachedView != null && cachedView.get() == view) {
-			return (IGraphicalEditPart) cachedPart.get();
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public synchronized IGraphicalEditPart createGraphicEditPart(View view) {
-		if (isAllowCaching()) {
-			IGraphicalEditPart part = getCachedPart(view);
-			cachedPart = null;
-			cachedView = null;
-			if (part != null) {
-				return part;
-			}
-		}
-		return createEditPart(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	public synchronized boolean provides(IOperation operation) {
-		if (operation instanceof CreateGraphicEditPartOperation) {
-			View view = ((IEditPartOperation) operation).getView();
-			if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-					.getModelID(view))) {
-				return false;
-			}
-			if (isAllowCaching() && getCachedPart(view) != null) {
-				return true;
-			}
-			IGraphicalEditPart part = createEditPart(view);
-			if (part != null) {
-				if (isAllowCaching()) {
-					cachedPart = new WeakReference(part);
-					cachedView = new WeakReference(view);
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLElementTypes.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLElementTypes.java
deleted file mode 100644
index e54ba1b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLElementTypes.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.ENamedElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.epf.diagram.ad.expressions.UMLAbstractExpression;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.gmf.runtime.common.ui.services.icon.IconService;
-import org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.providers.GeoShapeIconProvider;
-import org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.providers.GeoshapeConstants;
-import org.eclipse.gmf.runtime.diagram.ui.util.INotationType;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class UMLElementTypes extends ElementInitializers {
-
-	/**
-	 * @generated
-	 */
-	private UMLElementTypes() {
-	}
-
-	/**
-	 * @generated
-	 */
-	private static Map elements;
-
-	/**
-	 * @generated
-	 */
-	private static ImageRegistry imageRegistry;
-
-	/**
-	 * @generated
-	 */
-	private static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry();
-		}
-		return imageRegistry;
-	}
-	
-	private static GeoShapeIconProvider geoShapeIconProvider = null;
-
-	/**
-	 * @generated
-	 */
-	private static String getImageRegistryKey(ENamedElement element) {
-		return element.getName();
-	}
-
-	/**
-	 * @generated
-	 */
-	private static ImageDescriptor getProvidedImageDescriptor(
-			ENamedElement element) {
-		if (element instanceof EStructuralFeature) {
-			EStructuralFeature feature = ((EStructuralFeature) element);
-			EClass eContainingClass = feature.getEContainingClass();
-			EClassifier eType = feature.getEType();
-			if (eContainingClass != null && !eContainingClass.isAbstract()) {
-				element = eContainingClass;
-			} else if (eType instanceof EClass
-					&& !((EClass) eType).isAbstract()) {
-				element = eType;
-			}
-		}
-		if (element instanceof EClass) {
-			EClass eClass = (EClass) element;
-			if (!eClass.isAbstract()) {
-				return ActivityDiagramEditorPlugin.getInstance()
-						.getItemImageDescriptor(
-								eClass.getEPackage().getEFactoryInstance()
-										.create(eClass));
-			}
-		}
-		// TODO : support structural features
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ImageDescriptor getImageDescriptor(ENamedElement element) {
-		String key = getImageRegistryKey(element);
-		ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(key);
-		if (imageDescriptor == null) {
-			imageDescriptor = getProvidedImageDescriptor(element);
-			if (imageDescriptor == null) {
-				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-			getImageRegistry().put(key, imageDescriptor);
-		}
-		return imageDescriptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static Image getImage(ENamedElement element) {
-		String key = getImageRegistryKey(element);
-		Image image = getImageRegistry().get(key);
-		if (image == null) {
-			ImageDescriptor imageDescriptor = getProvidedImageDescriptor(element);
-			if (imageDescriptor == null) {
-				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-			getImageRegistry().put(key, imageDescriptor);
-			image = getImageRegistry().get(key);
-		}
-		return image;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ImageDescriptor getImageDescriptor(IAdaptable hint) {
-		ENamedElement element = getElement(hint);
-		if (element == null) {
-			return null;
-		}
-		return getImageDescriptor(element);
-	}
-
-	/**
-	 * @modified
-	 */
-	public static Image getImage(IAdaptable hint) {
-		if(isGeoShape(hint)){
-			return getGeoShapeIconProvider().getIcon(((INotationType)hint).getSemanticHint());
-		}
-		ENamedElement element = getElement(hint);
-		if (element == null) {
-			return null;
-		}
-		// modified START
-		Object type = hint.getAdapter(IElementType.class);
-		if (type != null) {
-			Image image = getImage(element, (IElementType) type);
-			if (image != null) {
-				return image;
-			}
-		}
-		// modified END
-		return getImage(element);
-	}
-
-	/**
-	 * Returns 'type' of the ecore object associated with the hint.
-	 * 
-	 * @generated
-	 */
-	public static ENamedElement getElement(IAdaptable hint) {
-		Object type = hint.getAdapter(IElementType.class);
-		if (elements == null) {
-			elements = new IdentityHashMap();
-
-			elements.put(Activity_79, UMLPackage.eINSTANCE.getActivity());
-
-			elements.put(ActivityFinalNode_1001, UMLPackage.eINSTANCE
-					.getActivityFinalNode());
-
-			elements.put(MergeNode_1002, UMLPackage.eINSTANCE.getMergeNode());
-
-			elements.put(ForkNode_1003, UMLPackage.eINSTANCE.getForkNode());
-
-			elements.put(InitialNode_1004, UMLPackage.eINSTANCE
-					.getInitialNode());
-
-			elements.put(DecisionNode_1005, UMLPackage.eINSTANCE
-					.getDecisionNode());
-
-			elements.put(JoinNode_1006, UMLPackage.eINSTANCE.getJoinNode());
-
-			elements.put(StructuredActivityNode_1007, UMLPackage.eINSTANCE
-					.getStructuredActivityNode());
-
-			elements.put(ActivityPartition_1008, UMLPackage.eINSTANCE
-					.getActivityPartition());
-
-			elements.put(ActivityParameterNode_1009, UMLPackage.eINSTANCE
-					.getActivityParameterNode());
-
-			elements.put(StructuredActivityNode_1010, UMLPackage.eINSTANCE
-					.getStructuredActivityNode());
-
-			elements.put(StructuredActivityNode_1011, UMLPackage.eINSTANCE
-					.getStructuredActivityNode());
-
-			elements.put(ActivityParameterNode_1012, UMLPackage.eINSTANCE
-					.getActivityParameterNode());
-
-			elements.put(ActivityPartition_2001, UMLPackage.eINSTANCE
-					.getActivityPartition());
-
-			elements.put(ControlFlow_3001, UMLPackage.eINSTANCE
-					.getControlFlow());
-		}
-		return (ENamedElement) elements.get(type);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType Activity_79 = getElementType("org.eclipse.epf.diagram.ad.Activity_79"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ActivityPartition_2001 = getElementType("org.eclipse.epf.diagram.ad.ActivityPartition_2001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ActivityFinalNode_1001 = getElementType("org.eclipse.epf.diagram.ad.ActivityFinalNode_1001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType MergeNode_1002 = getElementType("org.eclipse.epf.diagram.ad.MergeNode_1002"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ForkNode_1003 = getElementType("org.eclipse.epf.diagram.ad.ForkNode_1003"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType InitialNode_1004 = getElementType("org.eclipse.epf.diagram.ad.InitialNode_1004"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType DecisionNode_1005 = getElementType("org.eclipse.epf.diagram.ad.DecisionNode_1005"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType JoinNode_1006 = getElementType("org.eclipse.epf.diagram.ad.JoinNode_1006"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType StructuredActivityNode_1007 = getElementType("org.eclipse.epf.diagram.ad.StructuredActivityNode_1007"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ActivityPartition_1008 = getElementType("org.eclipse.epf.diagram.ad.ActivityPartition_1008"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ActivityParameterNode_1009 = getElementType("org.eclipse.epf.diagram.ad.ActivityParameterNode_1009"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType StructuredActivityNode_1010 = getElementType("org.eclipse.epf.diagram.ad.StructuredActivityNode_1010"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType StructuredActivityNode_1011 = getElementType("org.eclipse.epf.diagram.ad.StructuredActivityNode_1011"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ActivityParameterNode_1012 = getElementType("org.eclipse.epf.diagram.ad.ActivityParameterNode_1012"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ControlFlow_3001 = getElementType("org.eclipse.epf.diagram.ad.ControlFlow_3001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	private static IElementType getElementType(String id) {
-		return ElementTypeRegistry.getInstance().getType(id);
-	}
-
-	/**
-	 * @generated
-	 */
-	private static Set KNOWN_ELEMENT_TYPES;
-
-	/**
-	 * @generated
-	 */
-	public static boolean isKnownElementType(IElementType elementType) {
-		if (KNOWN_ELEMENT_TYPES == null) {
-			KNOWN_ELEMENT_TYPES = new HashSet();
-			KNOWN_ELEMENT_TYPES.add(Activity_79);
-			KNOWN_ELEMENT_TYPES.add(ActivityFinalNode_1001);
-			KNOWN_ELEMENT_TYPES.add(MergeNode_1002);
-			KNOWN_ELEMENT_TYPES.add(ForkNode_1003);
-			KNOWN_ELEMENT_TYPES.add(InitialNode_1004);
-			KNOWN_ELEMENT_TYPES.add(DecisionNode_1005);
-			KNOWN_ELEMENT_TYPES.add(JoinNode_1006);
-			KNOWN_ELEMENT_TYPES.add(StructuredActivityNode_1007);
-			KNOWN_ELEMENT_TYPES.add(ActivityPartition_1008);
-			KNOWN_ELEMENT_TYPES.add(ActivityParameterNode_1009);
-			KNOWN_ELEMENT_TYPES.add(StructuredActivityNode_1010);
-			KNOWN_ELEMENT_TYPES.add(StructuredActivityNode_1011);
-			KNOWN_ELEMENT_TYPES.add(ActivityParameterNode_1012);
-			KNOWN_ELEMENT_TYPES.add(ActivityPartition_2001);
-			KNOWN_ELEMENT_TYPES.add(ControlFlow_3001);
-		}
-		return KNOWN_ELEMENT_TYPES.contains(elementType);
-	}
-
-	/**
-	 * @modified
-	 */
-	public static Image getImage(ENamedElement element, IElementType type) {
-		String key = type.getId();
-		Image image = getImageRegistry().get(key);
-
-		if (image == null) {
-			ImageDescriptor imageDescriptor = null;
-			if (key.equals(StructuredActivityNode_1007.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Activity.gif"); //$NON-NLS-1$
-			} else if (key.equals(StructuredActivityNode_1010.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Phase.gif"); //$NON-NLS-1$
-			} else if (key.equals(StructuredActivityNode_1011.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Iteration.gif"); //$NON-NLS-1$
-			} else if (key.equals(ActivityParameterNode_1012.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Milestone.gif"); //$NON-NLS-1$
-			} else if (key.equals(ActivityParameterNode_1009.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/TaskDescriptor.gif"); //$NON-NLS-1$
-			}
-			if (imageDescriptor != null) {
-				getImageRegistry().put(key, imageDescriptor);
-				image = getImageRegistry().get(key);
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * @modified
-	 */
-	public static ImageDescriptor getImageDescriptor(ENamedElement element,
-			IElementType type) {
-		String key = type.getId();
-		ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(key);
-
-		if (imageDescriptor == null) {
-			imageDescriptor = null;
-			if (key.equals(StructuredActivityNode_1007.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Activity.gif"); //$NON-NLS-1$
-			} else if (key.equals(StructuredActivityNode_1010.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Phase.gif"); //$NON-NLS-1$
-			} else if (key.equals(StructuredActivityNode_1011.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Iteration.gif"); //$NON-NLS-1$
-			} else if (key.equals(ActivityParameterNode_1012.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/Milestone.gif"); //$NON-NLS-1$
-			} else if (key.equals(ActivityParameterNode_1009.getId())) {
-				imageDescriptor = ActivityDiagramEditorPlugin.getInstance()
-						.getImageDescriptor("full/obj16/TaskDescriptor.gif"); //$NON-NLS-1$
-			}
-			if (imageDescriptor != null) {
-				getImageRegistry().put(key, imageDescriptor);
-				imageDescriptor = getImageRegistry().getDescriptor(key);
-			} else {
-				imageDescriptor = getImageDescriptor(element);
-			}
-		}
-		return imageDescriptor;
-	}
-
-	private static boolean isGeoShape(IAdaptable hint) {
-		if(hint instanceof INotationType){
-			String x = ((INotationType)hint).getSemanticHint();
-			if(GeoshapeConstants.getSupportedShapes().contains(x))
-				return true;
-		}
-		return false;
-	}
-	
-	private static GeoShapeIconProvider getGeoShapeIconProvider(){
-		if(geoShapeIconProvider == null){
-			geoShapeIconProvider = new GeoShapeIconProvider();
-		}
-		return geoShapeIconProvider;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLIconProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLIconProvider.java
deleted file mode 100644
index babe1be..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLIconProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.icon.GetIconOperation;
-import org.eclipse.gmf.runtime.common.ui.services.icon.IIconProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class UMLIconProvider extends AbstractProvider implements IIconProvider {
-
-	/**
-	 * @generated
-	 */
-	public Image getIcon(IAdaptable hint, int flags) {
-		return UMLElementTypes.getImage(hint);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetIconOperation) {
-			return ((GetIconOperation) operation).execute(this) != null;
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLModelingAssistantProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLModelingAssistantProvider.java
deleted file mode 100644
index 57d3094..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLModelingAssistantProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.modelingassistant.ModelingAssistantProvider;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartment2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartmentEditPart;
-
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class UMLModelingAssistantProvider extends ModelingAssistantProvider {
-
-	/**
-	 * Modified to sync order with the palette.
-	 * @modified
-	 */
-	public List getTypesForPopupBar(IAdaptable host) {
-		IGraphicalEditPart editPart = (IGraphicalEditPart) host
-				.getAdapter(IGraphicalEditPart.class);
-		if (editPart instanceof ActivityPartitionPartitionCampartmentEditPart) {
-			List types = new ArrayList();
-			types.add(UMLElementTypes.ActivityPartition_2001);
-			return types;
-		}
-		if (editPart instanceof ActivityPartitionPartitionCampartment2EditPart) {
-			List types = new ArrayList();
-			types.add(UMLElementTypes.ActivityPartition_2001);
-			return types;
-		}
-		if (editPart instanceof ActivityEditPart) {
-			List types = new ArrayList();
-			types.add(UMLElementTypes.ActivityPartition_1008);
-			types.add(UMLElementTypes.InitialNode_1004);
-			types.add(UMLElementTypes.ActivityFinalNode_1001);
-			types.add(UMLElementTypes.ForkNode_1003);
-			types.add(UMLElementTypes.JoinNode_1006);
-			types.add(UMLElementTypes.DecisionNode_1005);
-			types.add(UMLElementTypes.MergeNode_1002);
-			types.add(UMLElementTypes.StructuredActivityNode_1007);
-			types.add(UMLElementTypes.StructuredActivityNode_1011);
-			types.add(UMLElementTypes.StructuredActivityNode_1010);
-			types.add(UMLElementTypes.ActivityParameterNode_1012);
-			types.add(UMLElementTypes.ActivityParameterNode_1009);
-			return types;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnSource(IAdaptable source) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnTarget(IAdaptable target) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnSourceAndTarget(IAdaptable source,
-			IAdaptable target) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getTypesForSource(IAdaptable target,
-			IElementType relationshipType) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getTypesForTarget(IAdaptable source,
-			IElementType relationshipType) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject selectExistingElementForSource(IAdaptable target,
-			IElementType relationshipType) {
-		return selectExistingElement(target, getTypesForSource(target,
-				relationshipType));
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject selectExistingElementForTarget(IAdaptable source,
-			IElementType relationshipType) {
-		return selectExistingElement(source, getTypesForTarget(source,
-				relationshipType));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectExistingElement(IAdaptable host, Collection types) {
-		if (types.isEmpty()) {
-			return null;
-		}
-		IGraphicalEditPart editPart = (IGraphicalEditPart) host
-				.getAdapter(IGraphicalEditPart.class);
-		if (editPart == null) {
-			return null;
-		}
-		Diagram diagram = (Diagram) editPart.getRoot().getContents().getModel();
-		Collection elements = new HashSet();
-		for (Iterator it = diagram.getElement().eAllContents(); it.hasNext();) {
-			EObject element = (EObject) it.next();
-			if (isApplicableElement(element, types)) {
-				elements.add(element);
-			}
-		}
-		if (elements.isEmpty()) {
-			return null;
-		}
-		return selectElement((EObject[]) elements.toArray(new EObject[elements
-				.size()]));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isApplicableElement(EObject element, Collection types) {
-		IElementType type = ElementTypeRegistry.getInstance().getElementType(
-				element);
-		return types.contains(type);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectElement(EObject[] elements) {
-		Shell shell = Display.getCurrent().getActiveShell();
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				ActivityDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory());
-		ElementListSelectionDialog dialog = new ElementListSelectionDialog(
-				shell, labelProvider);
-		dialog.setMessage("Available domain model elements:");
-		dialog.setTitle("Select domain model element");
-		dialog.setMultipleSelection(false);
-		dialog.setElements(elements);
-		EObject selected = null;
-		if (dialog.open() == Window.OK) {
-			selected = (EObject) dialog.getFirstResult();
-		}
-		return selected;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLPaletteProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLPaletteProvider.java
deleted file mode 100644
index 9fd2e5d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLPaletteProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.util.Map;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.diagram.ui.services.palette.IPaletteProvider;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.epf.diagram.ad.part.UMLPaletteFactory;
-
-/**
- * @generated
- */
-public class UMLPaletteProvider extends AbstractProvider implements
-		IPaletteProvider {
-
-	/**
-	 * @generated
-	 */
-	public void contributeToPalette(IEditorPart editor, Object content,
-			PaletteRoot root, Map predefinedEntries) {
-		UMLPaletteFactory factory = new UMLPaletteFactory();
-		factory.fillPalette(root);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setContributions(IConfigurationElement configElement) {
-		// no configuration
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		return false; // all logic is done in the service
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLParserProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLParserProvider.java
deleted file mode 100644
index 941e38e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLParserProvider.java
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.parser.GetParserOperation;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @generated
- */
-public class UMLParserProvider extends AbstractProvider implements
-		IParserProvider {
-
-	/**
-	 * @generated
-	 */
-	private IParser activityPartitionActivityPartitionName_4006Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getActivityPartitionActivityPartitionName_4006Parser() {
-		if (activityPartitionActivityPartitionName_4006Parser == null) {
-			activityPartitionActivityPartitionName_4006Parser = createActivityPartitionActivityPartitionName_4006Parser();
-		}
-		return activityPartitionActivityPartitionName_4006Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createActivityPartitionActivityPartitionName_4006Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser activityFinalNodeActivityFinalNodeName_4001Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getActivityFinalNodeActivityFinalNodeName_4001Parser() {
-		if (activityFinalNodeActivityFinalNodeName_4001Parser == null) {
-			activityFinalNodeActivityFinalNodeName_4001Parser = createActivityFinalNodeActivityFinalNodeName_4001Parser();
-		}
-		return activityFinalNodeActivityFinalNodeName_4001Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createActivityFinalNodeActivityFinalNodeName_4001Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser mergeNodeMergeNodeName_4002Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getMergeNodeMergeNodeName_4002Parser() {
-		if (mergeNodeMergeNodeName_4002Parser == null) {
-			mergeNodeMergeNodeName_4002Parser = createMergeNodeMergeNodeName_4002Parser();
-		}
-		return mergeNodeMergeNodeName_4002Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createMergeNodeMergeNodeName_4002Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser initialNodeInitialNodeName_4003Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getInitialNodeInitialNodeName_4003Parser() {
-		if (initialNodeInitialNodeName_4003Parser == null) {
-			initialNodeInitialNodeName_4003Parser = createInitialNodeInitialNodeName_4003Parser();
-		}
-		return initialNodeInitialNodeName_4003Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createInitialNodeInitialNodeName_4003Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser decisionNodeDecisionNodeName_4004Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getDecisionNodeDecisionNodeName_4004Parser() {
-		if (decisionNodeDecisionNodeName_4004Parser == null) {
-			decisionNodeDecisionNodeName_4004Parser = createDecisionNodeDecisionNodeName_4004Parser();
-		}
-		return decisionNodeDecisionNodeName_4004Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createDecisionNodeDecisionNodeName_4004Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser structuredActivityNodeStructuredActivityNodeName_4005Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getStructuredActivityNodeStructuredActivityNodeName_4005Parser() {
-		if (structuredActivityNodeStructuredActivityNodeName_4005Parser == null) {
-			structuredActivityNodeStructuredActivityNodeName_4005Parser = createStructuredActivityNodeStructuredActivityNodeName_4005Parser();
-		}
-		return structuredActivityNodeStructuredActivityNodeName_4005Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createStructuredActivityNodeStructuredActivityNodeName_4005Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser activityPartitionActivityPartitionName_4007Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getActivityPartitionActivityPartitionName_4007Parser() {
-		if (activityPartitionActivityPartitionName_4007Parser == null) {
-			activityPartitionActivityPartitionName_4007Parser = createActivityPartitionActivityPartitionName_4007Parser();
-		}
-		return activityPartitionActivityPartitionName_4007Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createActivityPartitionActivityPartitionName_4007Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser activityParameterNodeActivityParameterNodeName_4008Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getActivityParameterNodeActivityParameterNodeName_4008Parser() {
-		if (activityParameterNodeActivityParameterNodeName_4008Parser == null) {
-			activityParameterNodeActivityParameterNodeName_4008Parser = createActivityParameterNodeActivityParameterNodeName_4008Parser();
-		}
-		return activityParameterNodeActivityParameterNodeName_4008Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createActivityParameterNodeActivityParameterNodeName_4008Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser structuredActivityNodeStructuredActivityNodeName_4009Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getStructuredActivityNodeStructuredActivityNodeName_4009Parser() {
-		if (structuredActivityNodeStructuredActivityNodeName_4009Parser == null) {
-			structuredActivityNodeStructuredActivityNodeName_4009Parser = createStructuredActivityNodeStructuredActivityNodeName_4009Parser();
-		}
-		return structuredActivityNodeStructuredActivityNodeName_4009Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createStructuredActivityNodeStructuredActivityNodeName_4009Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser structuredActivityNodeStructuredActivityNodeName_4010Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getStructuredActivityNodeStructuredActivityNodeName_4010Parser() {
-		if (structuredActivityNodeStructuredActivityNodeName_4010Parser == null) {
-			structuredActivityNodeStructuredActivityNodeName_4010Parser = createStructuredActivityNodeStructuredActivityNodeName_4010Parser();
-		}
-		return structuredActivityNodeStructuredActivityNodeName_4010Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createStructuredActivityNodeStructuredActivityNodeName_4010Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser activityParameterNodeActivityParameterNodeName_4011Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getActivityParameterNodeActivityParameterNodeName_4011Parser() {
-		if (activityParameterNodeActivityParameterNodeName_4011Parser == null) {
-			activityParameterNodeActivityParameterNodeName_4011Parser = createActivityParameterNodeActivityParameterNodeName_4011Parser();
-		}
-		return activityParameterNodeActivityParameterNodeName_4011Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createActivityParameterNodeActivityParameterNodeName_4011Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser controlFlowControlFlowName_4012Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getControlFlowControlFlowName_4012Parser() {
-		if (controlFlowControlFlowName_4012Parser == null) {
-			controlFlowControlFlowName_4012Parser = createControlFlowControlFlowName_4012Parser();
-		}
-		return controlFlowControlFlowName_4012Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createControlFlowControlFlowName_4012Parser() {
-		UMLStructuralFeatureParser parser = new UMLStructuralFeatureParser(
-				UMLPackage.eINSTANCE.getNamedElement_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser getParser(int visualID) {
-		switch (visualID) {
-		case ActivityPartitionNameEditPart.VISUAL_ID:
-			return getActivityPartitionActivityPartitionName_4006Parser();
-		case ActivityFinalNodeNameEditPart.VISUAL_ID:
-			return getActivityFinalNodeActivityFinalNodeName_4001Parser();
-		case MergeNodeNameEditPart.VISUAL_ID:
-			return getMergeNodeMergeNodeName_4002Parser();
-		case InitialNodeNameEditPart.VISUAL_ID:
-			return getInitialNodeInitialNodeName_4003Parser();
-		case DecisionNodeNameEditPart.VISUAL_ID:
-			return getDecisionNodeDecisionNodeName_4004Parser();
-		case StructuredActivityNodeNameEditPart.VISUAL_ID:
-			return getStructuredActivityNodeStructuredActivityNodeName_4005Parser();
-		case ActivityPartitionName2EditPart.VISUAL_ID:
-			return getActivityPartitionActivityPartitionName_4007Parser();
-		case ActivityParameterNodeNameEditPart.VISUAL_ID:
-			return getActivityParameterNodeActivityParameterNodeName_4008Parser();
-		case StructuredActivityNodeName2EditPart.VISUAL_ID:
-			return getStructuredActivityNodeStructuredActivityNodeName_4009Parser();
-		case StructuredActivityNodeName3EditPart.VISUAL_ID:
-			return getStructuredActivityNodeStructuredActivityNodeName_4010Parser();
-		case ActivityParameterNodeName2EditPart.VISUAL_ID:
-			return getActivityParameterNodeActivityParameterNodeName_4011Parser();
-		case ControlFlowNameEditPart.VISUAL_ID:
-			return getControlFlowControlFlowName_4012Parser();
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser(IAdaptable hint) {
-		String vid = (String) hint.getAdapter(String.class);
-		if (vid != null) {
-			return getParser(UMLVisualIDRegistry.getVisualID(vid));
-		}
-		View view = (View) hint.getAdapter(View.class);
-		if (view != null) {
-			return getParser(UMLVisualIDRegistry.getVisualID(view));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetParserOperation) {
-			IAdaptable hint = ((GetParserOperation) operation).getHint();
-			if (UMLElementTypes.getElement(hint) == null) {
-				return false;
-			}
-			return getParser(hint) != null;
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLPropertyProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLPropertyProvider.java
deleted file mode 100644
index 114d370..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLPropertyProvider.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.properties.GetPropertySourceOperation;
-import org.eclipse.gmf.runtime.common.ui.services.properties.ICompositePropertySource;
-import org.eclipse.gmf.runtime.common.ui.services.properties.IPropertiesProvider;
-import org.eclipse.gmf.runtime.emf.ui.properties.providers.GenericEMFPropertiesProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-/**
- * @generated
- */
-public class UMLPropertyProvider extends GenericEMFPropertiesProvider implements
-		IPropertiesProvider {
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetPropertySourceOperation) {
-			Object object = ((GetPropertySourceOperation) operation)
-					.getObject();
-			return getSemanticElement(object) != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICompositePropertySource getPropertySource(Object object) {
-		EObject element = getSemanticElement(object);
-		if (element != null) {
-			return super.getPropertySource(element);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getSemanticElement(Object object) {
-		View view = null;
-		if (object instanceof View) {
-			view = (View) object;
-		} else if (object instanceof EditPart) {
-			EditPart editPart = (EditPart) object;
-			if (editPart.getModel() instanceof View) {
-				view = (View) editPart.getModel();
-			}
-		}
-		if (view != null
-				&& ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-						.getModelID(view))) {
-			return view.getElement();
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLStructuralFeatureParser.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLStructuralFeatureParser.java
deleted file mode 100644
index fab0716..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLStructuralFeatureParser.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.text.FieldPosition;
-import java.text.MessageFormat;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class UMLStructuralFeatureParser extends UMLAbstractParser {
-
-	/**
-	 * @generated
-	 */
-	public static final MessageFormat DEFAULT_PROCESSOR = new MessageFormat(
-			"{0}"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	private EStructuralFeature feature;
-
-	/**
-	 * @generated
-	 */
-	public UMLStructuralFeatureParser(EStructuralFeature feature) {
-		this.feature = feature;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getViewProcessor() {
-		MessageFormat processor = super.getViewProcessor();
-		return processor == null ? DEFAULT_PROCESSOR : processor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getEditProcessor() {
-		MessageFormat processor = super.getEditProcessor();
-		return processor == null ? DEFAULT_PROCESSOR : processor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getDomainElement(EObject element) {
-		return element;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		element = getDomainElement(element);
-		return getStringByPattern(element, feature, processor);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(EObject element,
-			EStructuralFeature feature, MessageFormat processor) {
-		Object value = element == null ? null : element.eGet(feature);
-		value = getValidValue(feature, value);
-		return processor.format(new Object[] { value }, new StringBuffer(),
-				new FieldPosition(0)).toString();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateValues(Object[] values) {
-		if (values.length > 1) {
-			return ParserEditStatus.UNEDITABLE_STATUS;
-		}
-		Object value = values.length == 1 ? values[0] : null;
-		value = getValidNewValue(feature, value);
-		if (value instanceof InvalidValue) {
-			return new ParserEditStatus(ActivityDiagramEditorPlugin.ID,
-					IParserEditStatus.UNEDITABLE, value.toString());
-		}
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, Object[] values) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		element = getDomainElement(element);
-		if (element == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		TransactionalEditingDomain editingDomain = TransactionUtil
-				.getEditingDomain(element);
-		if (editingDomain == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Object value = values.length == 1 ? values[0] : null;
-		ICommand command = getModificationCommand(element, feature, value);
-		return new CompositeTransactionalCommand(editingDomain, command
-				.getLabel(), Collections.singletonList(command));
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isAffectingEvent(Object event, int flags) {
-		if (event instanceof Notification) {
-			return isAffectingFeature(((Notification) event).getFeature());
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isAffectingFeature(Object eventFeature) {
-		return feature == eventFeature;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLStructuralFeaturesParser.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLStructuralFeaturesParser.java
deleted file mode 100644
index a8c688d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLStructuralFeaturesParser.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import java.text.FieldPosition;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class UMLStructuralFeaturesParser extends UMLAbstractParser {
-
-	/**
-	 * @generated
-	 */
-	private List features;
-
-	/**
-	 * @generated
-	 */
-	public UMLStructuralFeaturesParser(List features) {
-		this.features = features;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		List values = new ArrayList(features.size());
-		for (Iterator it = features.iterator(); it.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) it.next();
-			Object value = element.eGet(feature);
-			value = getValidValue(feature, value);
-			values.add(value);
-		}
-		return processor.format(values.toArray(new Object[values.size()]),
-				new StringBuffer(), new FieldPosition(0)).toString();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateValues(Object[] values) {
-		if (values.length != features.size()) {
-			return ParserEditStatus.UNEDITABLE_STATUS;
-		}
-		for (int i = 0; i < values.length; i++) {
-			Object value = getValidNewValue((EStructuralFeature) features
-					.get(i), values[i]);
-			if (value instanceof InvalidValue) {
-				return new ParserEditStatus(ActivityDiagramEditorPlugin.ID,
-						IParserEditStatus.UNEDITABLE, value.toString());
-			}
-		}
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, Object[] values) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		if (element == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		TransactionalEditingDomain editingDomain = TransactionUtil
-				.getEditingDomain(element);
-		if (editingDomain == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		CompositeTransactionalCommand command = new CompositeTransactionalCommand(
-				editingDomain, "Set Values"); //$NON-NLS-1$
-		for (int i = 0; i < values.length; i++) {
-			EStructuralFeature feature = (EStructuralFeature) features.get(i);
-			command
-					.compose(getModificationCommand(element, feature, values[i]));
-		}
-		return command;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isAffectingEvent(Object event, int flags) {
-		if (event instanceof Notification) {
-			Object feature = ((Notification) event).getFeature();
-			if (features.contains(feature)) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLViewProvider.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLViewProvider.java
deleted file mode 100644
index daa911e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/providers/UMLViewProvider.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gmf.runtime.diagram.core.providers.AbstractViewProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartment2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartmentEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.epf.diagram.ad.view.factories.ActivityFinalNodeNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityFinalNodeViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityParameterNode2ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityParameterNodeName2ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityParameterNodeNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityParameterNodeViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityPartition2ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityPartitionName2ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityPartitionNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityPartitionPartitionCampartment2ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityPartitionPartitionCampartmentViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityPartitionViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ActivityViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ControlFlowNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ControlFlowViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.DecisionNodeNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.DecisionNodeViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.ForkNodeViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.InitialNodeNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.InitialNodeViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.JoinNodeViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.MergeNodeNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.MergeNodeViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.StructuredActivityNode2ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.StructuredActivityNode3ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.StructuredActivityNodeName2ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.StructuredActivityNodeName3ViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.StructuredActivityNodeNameViewFactory;
-import org.eclipse.epf.diagram.ad.view.factories.StructuredActivityNodeViewFactory;
-
-/**
- * @generated
- */
-public class UMLViewProvider extends AbstractViewProvider {
-
-	/**
-	 * @generated
-	 */
-	protected Class getDiagramViewClass(IAdaptable semanticAdapter,
-			String diagramKind) {
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		if (ActivityEditPart.MODEL_ID.equals(diagramKind)
-				&& UMLVisualIDRegistry.getDiagramVisualID(semanticElement) != -1) {
-			return ActivityViewFactory.class;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Class getNodeViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		if (containerView == null) {
-			return null;
-		}
-		IElementType elementType = getSemanticElementType(semanticAdapter);
-		if (elementType != null
-				&& !UMLElementTypes.isKnownElementType(elementType)) {
-			return null;
-		}
-		EClass semanticType = getSemanticEClass(semanticAdapter);
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		int nodeVID = UMLVisualIDRegistry.getNodeVisualID(containerView,
-				semanticElement, semanticType, semanticHint);
-		switch (nodeVID) {
-		case ActivityFinalNodeEditPart.VISUAL_ID:
-			return ActivityFinalNodeViewFactory.class;
-		case ActivityFinalNodeNameEditPart.VISUAL_ID:
-			return ActivityFinalNodeNameViewFactory.class;
-		case MergeNodeEditPart.VISUAL_ID:
-			return MergeNodeViewFactory.class;
-		case MergeNodeNameEditPart.VISUAL_ID:
-			return MergeNodeNameViewFactory.class;
-		case ForkNodeEditPart.VISUAL_ID:
-			return ForkNodeViewFactory.class;
-		case InitialNodeEditPart.VISUAL_ID:
-			return InitialNodeViewFactory.class;
-		case InitialNodeNameEditPart.VISUAL_ID:
-			return InitialNodeNameViewFactory.class;
-		case DecisionNodeEditPart.VISUAL_ID:
-			return DecisionNodeViewFactory.class;
-		case DecisionNodeNameEditPart.VISUAL_ID:
-			return DecisionNodeNameViewFactory.class;
-		case JoinNodeEditPart.VISUAL_ID:
-			return JoinNodeViewFactory.class;
-		case StructuredActivityNodeEditPart.VISUAL_ID:
-			return StructuredActivityNodeViewFactory.class;
-		case StructuredActivityNodeNameEditPart.VISUAL_ID:
-			return StructuredActivityNodeNameViewFactory.class;
-		case ActivityPartitionEditPart.VISUAL_ID:
-			return ActivityPartitionViewFactory.class;
-		case ActivityPartitionName2EditPart.VISUAL_ID:
-			return ActivityPartitionName2ViewFactory.class;
-		case ActivityParameterNodeEditPart.VISUAL_ID:
-			return ActivityParameterNodeViewFactory.class;
-		case ActivityParameterNodeNameEditPart.VISUAL_ID:
-			return ActivityParameterNodeNameViewFactory.class;
-		case StructuredActivityNode2EditPart.VISUAL_ID:
-			return StructuredActivityNode2ViewFactory.class;
-		case StructuredActivityNodeName2EditPart.VISUAL_ID:
-			return StructuredActivityNodeName2ViewFactory.class;
-		case StructuredActivityNode3EditPart.VISUAL_ID:
-			return StructuredActivityNode3ViewFactory.class;
-		case StructuredActivityNodeName3EditPart.VISUAL_ID:
-			return StructuredActivityNodeName3ViewFactory.class;
-		case ActivityParameterNode2EditPart.VISUAL_ID:
-			return ActivityParameterNode2ViewFactory.class;
-		case ActivityParameterNodeName2EditPart.VISUAL_ID:
-			return ActivityParameterNodeName2ViewFactory.class;
-		case ActivityPartition2EditPart.VISUAL_ID:
-			return ActivityPartition2ViewFactory.class;
-		case ActivityPartitionNameEditPart.VISUAL_ID:
-			return ActivityPartitionNameViewFactory.class;
-		case ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID:
-			return ActivityPartitionPartitionCampartmentViewFactory.class;
-		case ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID:
-			return ActivityPartitionPartitionCampartment2ViewFactory.class;
-		case ControlFlowNameEditPart.VISUAL_ID:
-			return ControlFlowNameViewFactory.class;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Class getEdgeViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		IElementType elementType = getSemanticElementType(semanticAdapter);
-		if (elementType != null
-				&& !UMLElementTypes.isKnownElementType(elementType)) {
-			return null;
-		}
-		EClass semanticType = getSemanticEClass(semanticAdapter);
-		if (semanticType == null) {
-			return null;
-		}
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		int linkVID = UMLVisualIDRegistry.getLinkWithClassVisualID(
-				semanticElement, semanticType);
-		switch (linkVID) {
-		case ControlFlowEditPart.VISUAL_ID:
-			return ControlFlowViewFactory.class;
-		}
-		return getUnrecognizedConnectorViewClass(semanticAdapter,
-				containerView, semanticHint);
-	}
-
-	/**
-	 * @generated
-	 */
-	private IElementType getSemanticElementType(IAdaptable semanticAdapter) {
-		if (semanticAdapter == null) {
-			return null;
-		}
-		return (IElementType) semanticAdapter.getAdapter(IElementType.class);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Class getUnrecognizedConnectorViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		// Handle unrecognized child node classes here
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityFinalNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityFinalNodeNameViewFactory.java
deleted file mode 100644
index d8f06f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityFinalNodeNameViewFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractLabelViewFactory;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.diagram.ui.util.MeasurementUnitHelper;
-
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-
-import org.eclipse.gmf.runtime.notation.Location;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeNameViewFactory extends AbstractLabelViewFactory {
-
-	/**
-	 * @generated
-	 */
-	public View createView(IAdaptable semanticAdapter, View containerView,
-			String semanticHint, int index, boolean persisted,
-			PreferencesHint preferencesHint) {
-		Node view = (Node) super.createView(semanticAdapter, containerView,
-				semanticHint, index, persisted, preferencesHint);
-		Location location = (Location) view.getLayoutConstraint();
-		IMapMode mapMode = MeasurementUnitHelper.getMapMode(containerView
-				.getDiagram().getMeasurementUnit());
-		location.setX(mapMode.DPtoLP(0));
-		location.setY(mapMode.DPtoLP(5));
-		return view;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityFinalNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityFinalNodeViewFactory.java
deleted file mode 100644
index d42d76a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityFinalNodeViewFactory.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityFinalNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ActivityFinalNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(
-				semanticAdapter,
-				view,
-				UMLVisualIDRegistry
-						.getType(ActivityFinalNodeNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNode2ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNode2ViewFactory.java
deleted file mode 100644
index f6eeb96..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNode2ViewFactory.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityParameterNode2ViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ActivityParameterNode2EditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(
-				semanticAdapter,
-				view,
-				UMLVisualIDRegistry
-						.getType(ActivityParameterNodeName2EditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeName2ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeName2ViewFactory.java
deleted file mode 100644
index 148e278..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeName2ViewFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeName2ViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeNameViewFactory.java
deleted file mode 100644
index 25f9039..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeNameViewFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeNameViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeViewFactory.java
deleted file mode 100644
index 3044511..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityParameterNodeViewFactory.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityParameterNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ActivityParameterNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(
-				semanticAdapter,
-				view,
-				UMLVisualIDRegistry
-						.getType(ActivityParameterNodeNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartition2ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartition2ViewFactory.java
deleted file mode 100644
index 3a992bd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartition2ViewFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartition2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartment2EditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityPartition2ViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ActivityPartition2EditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(
-				semanticAdapter,
-				view,
-				UMLVisualIDRegistry
-						.getType(ActivityPartitionNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						UMLVisualIDRegistry
-								.getType(ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionName2ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionName2ViewFactory.java
deleted file mode 100644
index 062142c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionName2ViewFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.Location;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.util.MeasurementUnitHelper;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-
-/**
- * @generated
- */
-public class ActivityPartitionName2ViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		return styles;
-	}
-
-	/**
-	 * @see org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory#createView(org.eclipse.core.runtime.IAdaptable, org.eclipse.gmf.runtime.notation.View, java.lang.String, int, boolean, org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint)
-	 * @modified
-	 */
-	public View createView(IAdaptable semanticAdapter, View containerView,
-			String semanticHint, int index, boolean persisted,
-			PreferencesHint preferencesHint) {
-		Node view = (Node) super.createView(semanticAdapter, containerView,
-				semanticHint, index, persisted, preferencesHint);
-		Location location = (Location) view.getLayoutConstraint();
-		IMapMode mapMode = MeasurementUnitHelper.getMapMode(containerView
-				.getDiagram().getMeasurementUnit());
-		location.setX(mapMode.DPtoLP(0));
-		location.setY(mapMode.DPtoLP(5));
-		return view;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionNameViewFactory.java
deleted file mode 100644
index 924638b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionNameViewFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-
-/**
- * @generated
- */
-public class ActivityPartitionNameViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionPartitionCampartment2ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionPartitionCampartment2ViewFactory.java
deleted file mode 100644
index 1415560..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionPartitionCampartment2ViewFactory.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartment2EditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.ListCompartmentViewFactory;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
-
-import org.eclipse.gmf.runtime.notation.DrawerStyle;
-import org.eclipse.gmf.runtime.notation.LayoutConstraint;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.TitleStyle;
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartment2ViewFactory extends
-		ListCompartmentViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createSortingStyle());
-		styles.add(NotationFactory.eINSTANCE.createFilteringStyle());
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ActivityPartitionPartitionCampartment2EditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		setupCompartmentTitle(view);
-		setupCompartmentCollapsed(view);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutConstraint createLayoutConstraint() {
-		return NotationFactory.eINSTANCE.createBounds();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void initializeFromPreferences(View view) {
-		super.initializeFromPreferences(view);
-
-		IPreferenceStore store = (IPreferenceStore) getPreferencesHint()
-				.getPreferenceStore();
-
-		// fill color
-		RGB fillRGB = PreferenceConverter.getColor(store,
-				IPreferenceConstants.PREF_FILL_COLOR);
-		ViewUtil.setStructuralFeatureValue(view, NotationPackage.eINSTANCE
-				.getFillStyle_FillColor(), FigureUtilities
-				.RGBToInteger(fillRGB));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentTitle(View view) {
-		TitleStyle titleStyle = (TitleStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getTitleStyle());
-		if (titleStyle != null) {
-			titleStyle.setShowTitle(true);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentCollapsed(View view) {
-		DrawerStyle drawerStyle = (DrawerStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getDrawerStyle());
-		if (drawerStyle != null) {
-			drawerStyle.setCollapsed(false);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionPartitionCampartmentViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionPartitionCampartmentViewFactory.java
deleted file mode 100644
index f4b2328..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionPartitionCampartmentViewFactory.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartmentEditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.ListCompartmentViewFactory;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
-
-import org.eclipse.gmf.runtime.notation.DrawerStyle;
-import org.eclipse.gmf.runtime.notation.LayoutConstraint;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.TitleStyle;
-import org.eclipse.gmf.runtime.notation.View;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @generated
- */
-public class ActivityPartitionPartitionCampartmentViewFactory extends
-		ListCompartmentViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createSortingStyle());
-		styles.add(NotationFactory.eINSTANCE.createFilteringStyle());
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		setupCompartmentTitle(view);
-		setupCompartmentCollapsed(view);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutConstraint createLayoutConstraint() {
-		return NotationFactory.eINSTANCE.createBounds();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void initializeFromPreferences(View view) {
-		super.initializeFromPreferences(view);
-
-		IPreferenceStore store = (IPreferenceStore) getPreferencesHint()
-				.getPreferenceStore();
-
-		// fill color
-		RGB fillRGB = PreferenceConverter.getColor(store,
-				IPreferenceConstants.PREF_FILL_COLOR);
-		ViewUtil.setStructuralFeatureValue(view, NotationPackage.eINSTANCE
-				.getFillStyle_FillColor(), FigureUtilities
-				.RGBToInteger(fillRGB));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentTitle(View view) {
-		TitleStyle titleStyle = (TitleStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getTitleStyle());
-		if (titleStyle != null) {
-			titleStyle.setShowTitle(true);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentCollapsed(View view) {
-		DrawerStyle drawerStyle = (DrawerStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getDrawerStyle());
-		if (drawerStyle != null) {
-			drawerStyle.setCollapsed(false);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionViewFactory.java
deleted file mode 100644
index 24c9392..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityPartitionViewFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionPartitionCampartmentEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityPartitionViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ActivityPartitionEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(
-				semanticAdapter,
-				view,
-				UMLVisualIDRegistry
-						.getType(ActivityPartitionName2EditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						UMLVisualIDRegistry
-								.getType(ActivityPartitionPartitionCampartmentEditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityViewFactory.java
deleted file mode 100644
index aa2419c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ActivityViewFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.DiagramViewFactory;
-
-import org.eclipse.gmf.runtime.notation.MeasurementUnit;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityViewFactory extends DiagramViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createPageStyle());
-		styles.add(NotationFactory.eINSTANCE.createGuideStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View view, IAdaptable semanticAdapter,
-			String diagramKind) {
-		super.decorateView(view, semanticAdapter, diagramKind);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MeasurementUnit getMeasurementUnit() {
-		return MeasurementUnit.PIXEL_LITERAL;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ControlFlowNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ControlFlowNameViewFactory.java
deleted file mode 100644
index e1af0c4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ControlFlowNameViewFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractLabelViewFactory;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.diagram.ui.util.MeasurementUnitHelper;
-
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-
-import org.eclipse.gmf.runtime.notation.Location;
-
-/**
- * @generated
- */
-public class ControlFlowNameViewFactory extends AbstractLabelViewFactory {
-
-	/**
-	 * @generated
-	 */
-	public View createView(IAdaptable semanticAdapter, View containerView,
-			String semanticHint, int index, boolean persisted,
-			PreferencesHint preferencesHint) {
-		Node view = (Node) super.createView(semanticAdapter, containerView,
-				semanticHint, index, persisted, preferencesHint);
-		Location location = (Location) view.getLayoutConstraint();
-		IMapMode mapMode = MeasurementUnitHelper.getMapMode(containerView
-				.getDiagram().getMeasurementUnit());
-		location.setX(mapMode.DPtoLP(0));
-		location.setY(mapMode.DPtoLP(40));
-		return view;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ControlFlowViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ControlFlowViewFactory.java
deleted file mode 100644
index 034db79..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ControlFlowViewFactory.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcoreFactory;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.AbstractEMFOperation;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.common.core.util.Log;
-import org.eclipse.gmf.runtime.common.core.util.StringStatics;
-import org.eclipse.gmf.runtime.common.core.util.Trace;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions;
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIStatusCodes;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.ConnectionViewFactory;
-
-import org.eclipse.gmf.runtime.notation.Bendpoints;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ControlFlowViewFactory extends ConnectionViewFactory {
-
-	private static final Map options = new HashMap();
-	static {
-		options.put(Transaction.OPTION_UNPROTECTED, Boolean.TRUE);
-		options.put(Transaction.OPTION_NO_NOTIFICATIONS, Boolean.TRUE);
-		options.put(Transaction.OPTION_NO_TRIGGERS, Boolean.TRUE);
-	}
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createRoutingStyle());
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ControlFlowEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(semanticAdapter, view,
-				UMLVisualIDRegistry.getType(ControlFlowNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-	@Override
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.core.view.factories.ViewFactory#createView(org.eclipse.core.runtime.IAdaptable, org.eclipse.gmf.runtime.notation.View, java.lang.String, int, boolean, java.lang.String)
-	 * 
-	 * Override createView since there is a bug in 
-	 * org.eclipse.gmf.runtime.diagram.ui.view.factories.ConnectionViewFactory.java
-	 * @modified
-	 */
-	public View createView(final IAdaptable semanticAdapter,
-			final View containerView, final String semanticHint,
-			final int index, final boolean persisted,
-			final PreferencesHint preferencesHint) {
-
-		setPreferencesHint(preferencesHint);
-
-		final Edge edge = NotationFactory.eINSTANCE.createEdge();
-		List styles = createStyles(edge);
-		if (styles.size() > 0) {
-			edge.getStyles().addAll(styles);
-		}
-
-		Bendpoints bendPoints = createBendpoints();
-		if (bendPoints != null) {
-			edge.setBendpoints(bendPoints);
-		}
-
-		EObject semanticEl = semanticAdapter == null ? null
-				: (EObject) semanticAdapter.getAdapter(EObject.class);
-		if (semanticEl == null)
-			// enforce a set to NULL
-			edge.setElement(null);
-		else if (requiresElement(semanticAdapter, containerView)) {
-			edge.setElement(semanticEl);
-		}
-
-		edge.setType(semanticHint);
-
-		// decorate view assumes the view had been inserted already, so 
-		// we had to call insert child before calling decorate view
-		ViewUtil.insertChildView(containerView, edge, index, persisted);
-
-		TransactionalEditingDomain domain = getEditingDomain(semanticEl,
-				containerView);
-
-		if (domain != null) {
-			if (isUnProtectedSilentTransactionInProgress(domain)) {
-				// decorate view had to run as a silent operation other wise
-				// it will generate too many events
-				decorateView(containerView, edge, semanticAdapter,
-						semanticHint, index, true);
-
-			} else {
-				AbstractEMFOperation operation = new AbstractEMFOperation(
-						domain, StringStatics.BLANK, options) {
-
-					protected IStatus doExecute(IProgressMonitor monitor,
-							IAdaptable info) throws ExecutionException {
-						decorateView(containerView, edge, semanticAdapter,
-								semanticHint, index, true);
-
-						return Status.OK_STATUS;
-					}
-				};
-				try {
-					operation.execute(new NullProgressMonitor(), null);
-				} catch (ExecutionException e) {
-					Trace.catching(DiagramUIPlugin.getInstance(),
-							DiagramUIDebugOptions.EXCEPTIONS_CATCHING,
-							getClass(), "createView", e); //$NON-NLS-1$
-					Log.warning(DiagramUIPlugin.getInstance(),
-							DiagramUIStatusCodes.IGNORED_EXCEPTION_WARNING,
-							"createView", e); //$NON-NLS-1$
-				}
-			}
-		}
-
-		return edge;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/DecisionNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/DecisionNodeNameViewFactory.java
deleted file mode 100644
index 68b4d3b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/DecisionNodeNameViewFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class DecisionNodeNameViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/DecisionNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/DecisionNodeViewFactory.java
deleted file mode 100644
index efc77af..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/DecisionNodeViewFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class DecisionNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(DecisionNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						UMLVisualIDRegistry
-								.getType(DecisionNodeNameEditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ForkNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ForkNodeViewFactory.java
deleted file mode 100644
index 57e0e18..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/ForkNodeViewFactory.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ForkNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(ForkNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/InitialNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/InitialNodeNameViewFactory.java
deleted file mode 100644
index b47f7a3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/InitialNodeNameViewFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractLabelViewFactory;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.diagram.ui.util.MeasurementUnitHelper;
-
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-
-import org.eclipse.gmf.runtime.notation.Location;
-
-/**
- * @generated
- */
-public class InitialNodeNameViewFactory extends AbstractLabelViewFactory {
-
-	/**
-	 * @generated
-	 */
-	public View createView(IAdaptable semanticAdapter, View containerView,
-			String semanticHint, int index, boolean persisted,
-			PreferencesHint preferencesHint) {
-		Node view = (Node) super.createView(semanticAdapter, containerView,
-				semanticHint, index, persisted, preferencesHint);
-		Location location = (Location) view.getLayoutConstraint();
-		IMapMode mapMode = MeasurementUnitHelper.getMapMode(containerView
-				.getDiagram().getMeasurementUnit());
-		location.setX(mapMode.DPtoLP(0));
-		location.setY(mapMode.DPtoLP(5));
-		return view;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/InitialNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/InitialNodeViewFactory.java
deleted file mode 100644
index 85076bb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/InitialNodeViewFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class InitialNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(InitialNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(semanticAdapter, view,
-				UMLVisualIDRegistry.getType(InitialNodeNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/JoinNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/JoinNodeViewFactory.java
deleted file mode 100644
index 0afe3d4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/JoinNodeViewFactory.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-
-import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class JoinNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(JoinNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/MergeNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/MergeNodeNameViewFactory.java
deleted file mode 100644
index 7c4f179..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/MergeNodeNameViewFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class MergeNodeNameViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/MergeNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/MergeNodeViewFactory.java
deleted file mode 100644
index 8040c39..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/MergeNodeViewFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class MergeNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(MergeNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(semanticAdapter, view,
-				UMLVisualIDRegistry.getType(MergeNodeNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNode2ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNode2ViewFactory.java
deleted file mode 100644
index dbf6ade..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNode2ViewFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class StructuredActivityNode2ViewFactory extends
-		AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(StructuredActivityNode2EditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						UMLVisualIDRegistry
-								.getType(StructuredActivityNodeName2EditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNode3ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNode3ViewFactory.java
deleted file mode 100644
index baf32fe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNode3ViewFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class StructuredActivityNode3ViewFactory extends
-		AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(StructuredActivityNode3EditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						UMLVisualIDRegistry
-								.getType(StructuredActivityNodeName3EditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeName2ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeName2ViewFactory.java
deleted file mode 100644
index 37a34a3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeName2ViewFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeName2ViewFactory extends
-		BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeName3ViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeName3ViewFactory.java
deleted file mode 100644
index 4929ee3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeName3ViewFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeName3ViewFactory extends
-		BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeNameViewFactory.java
deleted file mode 100644
index f7bb7e8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeNameViewFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeNameViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeViewFactory.java
deleted file mode 100644
index 23616dc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ad/src/org/eclipse/epf/diagram/ad/view/factories/StructuredActivityNodeViewFactory.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.ad.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
-
-import org.eclipse.epf.diagram.ad.part.UMLVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class StructuredActivityNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = UMLVisualIDRegistry
-					.getType(StructuredActivityNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityEditPart.MODEL_ID.equals(UMLVisualIDRegistry
-				.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(
-				semanticAdapter,
-				view,
-				UMLVisualIDRegistry
-						.getType(StructuredActivityNodeNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/.classpath b/1.5/plugins/org.eclipse.epf.diagram.add/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/.options b/1.5/plugins/org.eclipse.epf.diagram.add/.options
deleted file mode 100644
index bb5df6d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/.options
+++ /dev/null
@@ -1,7 +0,0 @@
-# Debugging options for the org.eclipse.epf.diagram.add plug-in
-
-# Turn on general debugging for the org.eclipse.epf.diagram.add plug-in
-org.eclipse.epf.diagram.add/debug=false
-
-# Turn on debugging of visualID processing
-org.eclipse.epf.diagram.add/debug/visualID=true
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/.project b/1.5/plugins/org.eclipse.epf.diagram.add/.project
deleted file mode 100644
index 0f176f6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.diagram.add</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.diagram.add/META-INF/MANIFEST.MF
deleted file mode 100644
index 625df4c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,47 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.diagram.add; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.epf.diagram.add,
- org.eclipse.epf.diagram.add.edit.parts,
- org.eclipse.epf.diagram.add.part,
- org.eclipse.epf.diagram.add.providers,
- org.eclipse.epf.diagram.add.service
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jface,
- org.eclipse.ui.ide,
- org.eclipse.ui.views,
- org.eclipse.ui.workbench,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.emf.ecore,
- org.eclipse.emf.ecore.xmi,
- org.eclipse.emf.edit.ui,
- org.eclipse.gef;visibility:=reexport,
- org.eclipse.gmf.runtime.emf.core,
- org.eclipse.gmf.runtime.emf.commands.core,
- org.eclipse.gmf.runtime.emf.ui.properties,
- org.eclipse.gmf.runtime.diagram.ui,
- org.eclipse.gmf.runtime.diagram.ui.printing.render,
- org.eclipse.gmf.runtime.diagram.ui.printing,
- org.eclipse.gmf.runtime.diagram.ui.providers,
- org.eclipse.gmf.runtime.diagram.ui.providers.ide,
- org.eclipse.gmf.runtime.diagram.ui.render,
- org.eclipse.gmf.runtime.diagram.ui.resources.editor,
- org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide,
- org.eclipse.gmf.runtime.notation.providers,
- org.eclipse.epf.diagram.edit;visibility:=reexport,
- org.eclipse.epf.uma;visibility:=reexport,
- org.eclipse.epf.uma.edit;visibility:=reexport,
- org.eclipse.gmf.runtime.draw2d.ui;visibility:=reexport,
- org.eclipse.draw2d;visibility:=reexport,
- org.eclipse.epf.diagram.core,
- org.eclipse.epf.common,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/build.properties b/1.5/plugins/org.eclipse.epf.diagram.add/build.properties
deleted file mode 100644
index dd92db9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-bin.includes = .,\
-               icons/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties
-jars.compile.order = .
-source.. = src/
-output.. = bin/
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/RoleDescriptor.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/RoleDescriptor.gif
deleted file mode 100644
index 368c7b8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/RoleDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/TaskDescriptor.gif
deleted file mode 100644
index 554e26e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/WorkProductDescriptor.gif
deleted file mode 100644
index 0eea8cc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/diagram/WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/dlcl16/reset_diagram.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/dlcl16/reset_diagram.gif
deleted file mode 100644
index f73e674..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/dlcl16/reset_diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/dtool16/ADDEditor.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/dtool16/ADDEditor.gif
deleted file mode 100644
index 8444c10..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/dtool16/ADDEditor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/elcl16/reset_diagram.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/elcl16/reset_diagram.gif
deleted file mode 100644
index 4a9c8c6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/elcl16/reset_diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/etool16/ADDEditor.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/etool16/ADDEditor.gif
deleted file mode 100644
index 0167909..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/full/etool16/ADDEditor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/obj16/ModelDiagramFile.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/obj16/ModelDiagramFile.gif
deleted file mode 100644
index 33676a6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/obj16/ModelDiagramFile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/icons/wizban/NewModelWizard.gif b/1.5/plugins/org.eclipse.epf.diagram.add/icons/wizban/NewModelWizard.gif
deleted file mode 100644
index 3df85fe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/icons/wizban/NewModelWizard.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/messages.properties b/1.5/plugins/org.eclipse.epf.diagram.add/messages.properties
deleted file mode 100644
index 53c8913..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/messages.properties
+++ /dev/null
@@ -1,62 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2005, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-
-###########################################################################################
-# NO NEED TO TRANSLATE FOLLOWING PROPERTIES, SINCE WE DON'T USE IT FOR THIS RELEASE
-###########################################################################################
-
-# TODO: manually put keys and values
-sDiagramDiagramEditorUtil_OpenModelResourceErrorDialogTitle=Error
-DiagramDiagramEditorUtil_OpenModelResourceErrorDialogMessage=Failed to load model file {0}
-DiagramDiagramEditorUtil_CreateDiagramProgressTask=Creating diagram and model files
-DiagramDiagramEditorUtil_CreateDiagramCommandLabel=Creating diagram and model
-DiagramDocumentProvider_isModifiable=Updating cache failed
-DiagramDocumentProvider_handleElementContentChanged=Failed to refresh hierarchy for changed resource
-DiagramDocumentProvider_IncorrectInputError={1}
-DiagramDocumentProvider_UnableToLoadResourceError=Unable to load diagram resource
-DiagramDocumentProvider_NoDiagramInResourceError=Diagram is not present in resource
-DiagramDocumentProvider_DiagramLoadingError=Error loading diagram
-DiagramDocumentProvider_UnsynchronizedFileSaveError=The file has been changed on the file system
-DiagramDocumentProvider_SaveDiagramTask=Saving diagram
-DiagramDocumentProvider_SaveNextResourceTask=Saving {0}
-DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle=Error
-DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage=Model file loading failed
-DiagramInitDiagramFileAction_InitDiagramFileWizardTitle=Initialize new {0} diagram file
-DiagramInitDiagramFileAction_OpenModelFileDialogTitle=Select domain model
-DiagramNewDiagramFileWizard_CreationPageName=Initialize new diagram file
-DiagramNewDiagramFileWizard_CreationPageTitle=Diagram file
-DiagramNewDiagramFileWizard_CreationPageDescription=Create new diagram based on {0} model content
-DiagramNewDiagramFileWizard_RootSelectionPageName=Select diagram root element
-DiagramNewDiagramFileWizard_RootSelectionPageTitle=Diagram root element
-DiagramNewDiagramFileWizard_RootSelectionPageDescription=Select semantic model element to be depicted on diagram
-DiagramNewDiagramFileWizard_RootSelectionPageSelectionTitle=Select diagram root element:
-DiagramNewDiagramFileWizard_RootSelectionPageNoSelectionMessage=Diagram root element is not selected
-DiagramNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage=Invalid diagram root element is selected
-DiagramNewDiagramFileWizard_InitDiagramCommand=Initializing diagram contents
-DiagramNewDiagramFileWizard_IncorrectRootError=Incorrect model object stored as a root resource object
-Nodes1Group_title=Nodes
-Links2Group_title=Links
-RoleNode1CreationTool_title=RoleNode
-RoleNode1CreationTool_desc=Create new RoleNode
-RoleTaskComposite2CreationTool_title=RoleTaskComposite
-RoleTaskComposite2CreationTool_desc=Create new RoleTaskComposite
-TaskNode3CreationTool_title=TaskNode
-TaskNode3CreationTool_desc=Create new TaskNode
-WorkProductDescriptorNode4CreationTool_title=WorkProductDescriptorNode
-WorkProductDescriptorNode4CreationTool_desc=Create new WorkProducNode
-WorkProductComposite5CreationTool_title=WorkProductComposite
-WorkProductComposite5CreationTool_desc=Create new WorkProductComposite
-Link1CreationTool_title=Link
-Link1CreationTool_desc=Create new link
-RoleTaskCompositeRoleTaskCompartmentEditPart_title=RoleTaskCompartment
-WorkProductCompositeWorkProductCompartmentEditPart_title=WorkProductCompartment
-
-CommandName_OpenDiagram=Open Diagram
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfgen
deleted file mode 100644
index 7883b33..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfgen
+++ /dev/null
@@ -1,401 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel" packageNamePrefix="org.eclipse.epf.diagram.add"
-    modelID="ADD"
-    sameFileForDiagramAndModel="true"
-    diagramFileExtension="add"
-    templateDirectory="">
-  <diagram
-      visualID="79"
-      editPartClassName="ActivityDetailDiagramEditPart"
-      itemSemanticEditPolicyClassName="ActivityDetailDiagramItemSemanticEditPolicy"
-      notationViewFactoryClassName="ActivityDetailDiagramViewFactory"
-      iconProviderPriority="Low"
-      canonicalEditPolicyClassName="ActivityDetailDiagramCanonicalEditPolicy">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="ActivityDetailDiagramEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/ActivityDetailDiagram"/>
-    <childNodes
-        visualID="2001"
-        editPartClassName="RoleNodeEditPart"
-        itemSemanticEditPolicyClassName="RoleNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleNodeViewFactory"
-        canonicalEditPolicyClassName="RoleNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="RoleNodeGraphicalNodeEditPolicy"
-        containers="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="RoleNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="RoleNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class RoleNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public RoleNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ROLENODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&lt;...>&quot;);&#xD;&#xA;&#x9;&#x9;fig_0.setFont(&#xD;&#xA;&#x9;&#x9;&#x9;ROLENODENAMEFIGURE_FONT);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureRoleNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fRoleNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureRoleNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fRoleNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureRoleNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fRoleNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ROLENODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Font ROLENODENAMEFIGURE_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/RoleNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4001"
-          editPartClassName="RoleNodeNameEditPart"
-          itemSemanticEditPolicyClassName="RoleNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="RoleNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureRoleNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeature
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <childNodes
-        visualID="2002"
-        editPartClassName="TaskNodeEditPart"
-        itemSemanticEditPolicyClassName="TaskNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="TaskNodeViewFactory"
-        canonicalEditPolicyClassName="TaskNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="TaskNodeGraphicalNodeEditPolicy"
-        containers="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="TaskNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="TaskNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class TaskNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public TaskNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;this.setLineWidth(0);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(TASKNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&lt;...>&quot;);&#xD;&#xA;&#x9;&#x9;fig_0.setFont(&#xD;&#xA;&#x9;&#x9;&#x9;TASKNODENAMEFIGURE_FONT);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureTaskNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fTaskNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureTaskNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fTaskNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureTaskNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fTaskNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Font TASKNODENAMEFIGURE_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color TASKNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/TaskNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="TaskNodeNameEditPart"
-          itemSemanticEditPolicyClassName="TaskNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="TaskNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureTaskNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeature
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <childNodes
-        visualID="2003"
-        editPartClassName="WorkProductDescriptorNodeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductDescriptorNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductDescriptorNodeViewFactory"
-        canonicalEditPolicyClassName="WorkProductDescriptorNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="WorkProductDescriptorNodeGraphicalNodeEditPolicy"
-        containers="//@diagram/@topLevelNodes.1">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductDescriptorNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="WorkProductDescriptorNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class WorkProductDescriptorNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public WorkProductDescriptorNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(WORKPRODUCTDESCRIPTORNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&lt;...>&quot;);&#xD;&#xA;&#x9;&#x9;fig_0.setFont(&#xD;&#xA;&#x9;&#x9;&#x9;WORKPRODUCTNODENAMEFIGURE_FONT);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureWorkProductNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fWorkProductNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureWorkProductNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fWorkProductNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureWorkProductNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fWorkProductNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Font WORKPRODUCTNODENAMEFIGURE_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color WORKPRODUCTDESCRIPTORNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 205);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductDescriptorNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4003"
-          editPartClassName="WorkProductDescriptorNodeNameEditPart"
-          itemSemanticEditPolicyClassName="WorkProductDescriptorNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="WorkProductDescriptorNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureWorkProductNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeature
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="RoleTaskCompositeEditPart"
-        itemSemanticEditPolicyClassName="RoleTaskCompositeItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleTaskCompositeViewFactory"
-        childNodes="//@diagram/@childNodes.0 //@diagram/@childNodes.1"
-        canonicalEditPolicyClassName="RoleTaskCompositeCanonicalEditPolicy"
-        compartments="//@diagram/@compartments.0"
-        graphicalNodeEditPolicyClassName="RoleTaskCompositeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="RoleTaskCompositeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="TOOLBAR_LAYOUT"
-          className="RoleTaskCompositeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class RoleTaskCompositeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public RoleTaskCompositeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.ToolbarLayout myGenLayoutManager = new org.eclipse.draw2d.ToolbarLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;myGenLayoutManager.setStretchMinorAxis(false);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.ALIGN_CENTER);&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setSpacing(5);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setVertical(false);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ROLETASKCOMPOSITEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBorder(&#x9;&#xD;&#xA;new org.eclipse.draw2d.MarginBorder(getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0))&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ROLETASKCOMPOSITEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/RoleTaskComposite"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1002"
-        editPartClassName="WorkProductCompositeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductCompositeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductCompositeViewFactory"
-        childNodes="//@diagram/@childNodes.2"
-        canonicalEditPolicyClassName="WorkProductCompositeCanonicalEditPolicy"
-        compartments="//@diagram/@compartments.1"
-        graphicalNodeEditPolicyClassName="WorkProductCompositeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductCompositeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="TOOLBAR_LAYOUT"
-          className="WorkProductCompositeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class WorkProductCompositeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public WorkProductCompositeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.ToolbarLayout myGenLayoutManager = new org.eclipse.draw2d.ToolbarLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;myGenLayoutManager.setStretchMinorAxis(false);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.ALIGN_CENTER);&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setSpacing(5);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setVertical(true);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(WORKPRODUCTCOMPOSITEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBorder(&#x9;&#xD;&#xA;new org.eclipse.draw2d.MarginBorder(getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0))&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color WORKPRODUCTCOMPOSITEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 205);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductComposite"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="LinkEditPart"
-        itemSemanticEditPolicyClassName="LinkItemSemanticEditPolicy"
-        notationViewFactoryClassName="LinkViewFactory">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="LinkEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="LinkFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class LinkFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public LinkFigure() {&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.black&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.draw2d.PolylineDecoration createTargetDecoration() {&#xD;&#xA;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xD;&#xA;// dispatchNext?&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, 1);&#xD;&#xA;&#x9;&#x9;pl.addPoint(0, 0);&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, -1);&#xD;&#xA;&#x9;&#x9;df.setTemplate(pl);&#xD;&#xA;&#x9;&#x9;df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;return df;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/target"/>
-      </modelFacet>
-      <labels
-          visualID="4004"
-          editPartClassName="LinkNameEditPart"
-          itemSemanticEditPolicyClassName="LinkNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="LinkNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:FigureViewmap"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            editPattern="">
-          <metaFeature
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <compartments
-        visualID="5001"
-        editPartClassName="RoleTaskCompositeRoleTaskCompartmentEditPart"
-        itemSemanticEditPolicyClassName="RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleTaskCompositeRoleTaskCompartmentViewFactory"
-        canonicalEditPolicyClassName="RoleTaskCompositeRoleTaskCompartmentCanonicalEditPolicy"
-        title="RoleTaskCompartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <compartments
-        visualID="5002"
-        editPartClassName="WorkProductCompositeWorkProductCompartmentEditPart"
-        itemSemanticEditPolicyClassName="WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductCompositeWorkProductCompartmentViewFactory"
-        canonicalEditPolicyClassName="WorkProductCompositeWorkProductCompartmentCanonicalEditPolicy"
-        title="WorkProductCompartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.1">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <palette>
-      <groups
-          title="Nodes"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="RoleNode"
-            description="Create new RoleNode"
-            genNodes="//@diagram/@childNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="RoleTaskComposite"
-            description="Create new RoleTaskComposite"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="TaskNode"
-            description="Create new TaskNode"
-            genNodes="//@diagram/@childNodes.1"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="WorkProductDescriptorNode"
-            description="Create new WorkProducNode"
-            genNodes="//@diagram/@childNodes.2"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="WorkProductComposite"
-            description="Create new WorkProductComposite"
-            genNodes="//@diagram/@topLevelNodes.1"/>
-      </groups>
-      <groups
-          title="Links"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Link"
-            description="Create new link"
-            genLinks="//@diagram/@links.0"/>
-      </groups>
-    </palette>
-  </diagram>
-  <plugin
-      iD="org.eclipse.epf.diagram.add"
-      name="Activity Detail Diagram Plugin"
-      provider="EPF"
-      printingEnabled="true"
-      activatorClassName="ActivityDetailDiagramEditorPlugin"/>
-  <editor
-      className="ActivityDetailDiagramEditor"
-      iD="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"/>
-  <domainGenModel
-      href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#/"/>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfgraph b/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfgraph
deleted file mode 100644
index 65125c7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfgraph
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgraph:Canvas xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgraph="http://www.eclipse.org/gmf/2005/GraphicalDefinition" name="model">
-  <figures
-      name="Default">
-    <figures
-        xsi:type="gmfgraph:Rectangle"
-        referencingElements="RoleNode"
-        name="RoleNodeFigure"
-        outline="false">
-      <children
-          xsi:type="gmfgraph:Label"
-          referencingElements="RoleNodeName"
-          name="RoleNodeNameFigure"
-          text="&lt;...>">
-        <font
-            xsi:type="gmfgraph:BasicFont"
-            faceName="Arial"
-            height="8"/>
-      </children>
-      <backgroundColor
-          xsi:type="gmfgraph:RGBColor"
-          red="255"
-          green="255"
-          blue="156"/>
-    </figures>
-    <figures
-        xsi:type="gmfgraph:Rectangle"
-        referencingElements="RoleTaskComposite"
-        name="RoleTaskCompositeFigure">
-      <layout
-          xsi:type="gmfgraph:FlowLayout"
-          forceSingleLine="true"
-          majorAlignment="CENTER"
-          minorAlignment="CENTER"
-          minorSpacing="20"/>
-      <backgroundColor
-          xsi:type="gmfgraph:RGBColor"
-          red="255"
-          green="255"
-          blue="156"/>
-      <border
-          xsi:type="gmfgraph:MarginBorder"/>
-    </figures>
-    <figures
-        xsi:type="gmfgraph:Rectangle"
-        referencingElements="TaskNode"
-        name="TaskNodeFigure"
-        outline="false"
-        lineWidth="0">
-      <children
-          xsi:type="gmfgraph:Label"
-          referencingElements="TaskNodeName"
-          name="TaskNodeNameFigure"
-          text="&lt;...>">
-        <font
-            xsi:type="gmfgraph:BasicFont"
-            faceName="Arial"
-            height="8"/>
-      </children>
-      <backgroundColor
-          xsi:type="gmfgraph:RGBColor"
-          red="255"
-          green="255"
-          blue="156"/>
-    </figures>
-    <figures
-        xsi:type="gmfgraph:Rectangle"
-        referencingElements="WorkProductDescriptorNode"
-        name="WorkProductDescriptorNodeFigure"
-        outline="false">
-      <children
-          xsi:type="gmfgraph:Label"
-          referencingElements="WorkProductNodeName"
-          name="WorkProductNodeNameFigure"
-          text="&lt;...>">
-        <font
-            xsi:type="gmfgraph:BasicFont"
-            faceName="Arial"
-            height="8"/>
-      </children>
-      <backgroundColor
-          xsi:type="gmfgraph:RGBColor"
-          red="255"
-          green="255"
-          blue="205"/>
-    </figures>
-    <figures
-        xsi:type="gmfgraph:Rectangle"
-        referencingElements="WorkProductComposite"
-        name="WorkProductCompositeFigure">
-      <layout
-          xsi:type="gmfgraph:FlowLayout"
-          vertical="true"
-          forceSingleLine="true"
-          majorAlignment="CENTER"
-          minorAlignment="CENTER"
-          minorSpacing="20"/>
-      <backgroundColor
-          xsi:type="gmfgraph:RGBColor"
-          red="255"
-          green="255"
-          blue="205"/>
-      <border
-          xsi:type="gmfgraph:MarginBorder"/>
-    </figures>
-    <figures
-        xsi:type="gmfgraph:PolylineConnection"
-        referencingElements="Link"
-        name="LinkFigure"
-        targetDecoration="OpenArrow">
-      <children
-          xsi:type="gmfgraph:PolylineDecoration"
-          name="OpenArrow">
-        <template
-            x="-1"
-            y="1"/>
-        <template/>
-        <template
-            x="-1"
-            y="-1"/>
-      </children>
-      <children
-          xsi:type="gmfgraph:Label"
-          referencingElements="LinkNameLabel"
-          name="LinkNameFigure"/>
-      <foregroundColor
-          xsi:type="gmfgraph:ConstantColor"
-          value="black"/>
-    </figures>
-    <figures
-        xsi:type="gmfgraph:CustomFigure"
-        referencingElements="RoleTaskCompartment WorkProductCompartment"
-        name="ResizeableCompartmentFigureEx"
-        qualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure"
-        bundleName="org.eclipse.gmf.runtime.diagram.ui.figures"/>
-  </figures>
-  <nodes
-      name="RoleNode"
-      figure="RoleNodeFigure"/>
-  <nodes
-      name="TaskNode"
-      figure="TaskNodeFigure"/>
-  <nodes
-      name="WorkProductDescriptorNode"
-      figure="WorkProductDescriptorNodeFigure"/>
-  <nodes
-      name="RoleTaskComposite"
-      figure="RoleTaskCompositeFigure"/>
-  <nodes
-      name="WorkProductComposite"
-      figure="WorkProductCompositeFigure"/>
-  <connections
-      name="Link"
-      figure="LinkFigure"/>
-  <compartments
-      name="RoleTaskCompartment"
-      figure="ResizeableCompartmentFigureEx"/>
-  <compartments
-      name="WorkProductCompartment"
-      figure="ResizeableCompartmentFigureEx"/>
-  <labels
-      name="RoleNodeName"
-      figure="RoleNodeNameFigure"
-      elementIcon="false"/>
-  <labels
-      name="TaskNodeName"
-      figure="TaskNodeNameFigure"
-      elementIcon="false"/>
-  <labels
-      name="WorkProductNodeName"
-      figure="WorkProductNodeNameFigure"
-      elementIcon="false"/>
-  <labels
-      name="LinkNameLabel"
-      figure="LinkNameFigure"
-      elementIcon="false"/>
-</gmfgraph:Canvas>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfmap b/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfmap
deleted file mode 100644
index 61f36a3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmfmap
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfmap:Mapping xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:gmfmap="http://www.eclipse.org/gmf/2005/mappings"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//RoleTaskComposite"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="add.gmftool#//@palette/@tools.0/@tools.1"/>
-      <diagramNode
-          href="add.gmfgraph#RoleTaskComposite"/>
-      <children>
-        <containmentFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-        <ownedChild>
-          <domainMetaElement
-              href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//RoleNode"/>
-          <labelMappings>
-            <diagramLabel
-                href="add.gmfgraph#RoleNodeName"/>
-            <features
-                href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-          </labelMappings>
-          <tool
-              xsi:type="gmftool:CreationTool"
-              href="add.gmftool#//@palette/@tools.0/@tools.0"/>
-          <diagramNode
-              href="add.gmfgraph#RoleNode"/>
-        </ownedChild>
-      </children>
-      <children>
-        <containmentFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-        <ownedChild>
-          <domainMetaElement
-              href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//TaskNode"/>
-          <labelMappings>
-            <diagramLabel
-                href="add.gmfgraph#TaskNodeName"/>
-            <features
-                href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-          </labelMappings>
-          <tool
-              xsi:type="gmftool:CreationTool"
-              href="add.gmftool#//@palette/@tools.0/@tools.2"/>
-          <diagramNode
-              href="add.gmfgraph#TaskNode"/>
-        </ownedChild>
-      </children>
-      <compartments>
-        <compartment
-            href="add.gmfgraph#RoleTaskCompartment"/>
-      </compartments>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductComposite"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="add.gmftool#//@palette/@tools.0/@tools.4"/>
-      <diagramNode
-          href="add.gmfgraph#WorkProductComposite"/>
-      <children>
-        <containmentFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-        <ownedChild>
-          <domainMetaElement
-              href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductDescriptorNode"/>
-          <labelMappings>
-            <diagramLabel
-                href="add.gmfgraph#WorkProductNodeName"/>
-            <features
-                href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-          </labelMappings>
-          <tool
-              xsi:type="gmftool:CreationTool"
-              href="add.gmftool#//@palette/@tools.0/@tools.3"/>
-          <diagramNode
-              href="add.gmfgraph#WorkProductDescriptorNode"/>
-        </ownedChild>
-      </children>
-      <compartments>
-        <compartment
-            href="add.gmfgraph#WorkProductCompartment"/>
-      </compartments>
-    </ownedChild>
-  </nodes>
-  <links>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link"/>
-    <labelMappings
-        editPattern="">
-      <diagramLabel
-          href="add.gmfgraph#LinkNameLabel"/>
-      <features
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/name"/>
-    </labelMappings>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Node/outgoingConnections"/>
-    <tool
-        xsi:type="gmftool:CreationTool"
-        href="add.gmftool#//@palette/@tools.1/@tools.0"/>
-    <diagramLink
-        href="add.gmfgraph#Link"/>
-    <sourceMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/source"/>
-    <linkMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/target"/>
-  </links>
-  <diagram>
-    <diagramCanvas
-        href="add.gmfgraph#model"/>
-    <domainModel
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#/"/>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//ActivityDetailDiagram"/>
-    <palette
-        href="add.gmftool#//@palette"/>
-  </diagram>
-</gmfmap:Mapping>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmftool b/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmftool
deleted file mode 100644
index bb61e46..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/add.gmftool
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmftool:ToolRegistry xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <palette>
-    <tools
-        xsi:type="gmftool:ToolGroup"
-        title="Nodes"
-        collapsible="true">
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="RoleNode"
-          description="Create new RoleNode">
-        <smallIcon
-            xsi:type="gmftool:DefaultImage"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="RoleTaskComposite"
-          description="Create new RoleTaskComposite">
-        <smallIcon
-            xsi:type="gmftool:DefaultImage"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="TaskNode"
-          description="Create new TaskNode">
-        <smallIcon
-            xsi:type="gmftool:DefaultImage"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="WorkProductDescriptorNode"
-          description="Create new WorkProducNode">
-        <smallIcon
-            xsi:type="gmftool:DefaultImage"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="WorkProductComposite"
-          description="Create new WorkProductComposite">
-        <smallIcon
-            xsi:type="gmftool:DefaultImage"/>
-        <largeIcon
-            xsi:type="gmftool:DefaultImage"/>
-      </tools>
-    </tools>
-    <tools
-        xsi:type="gmftool:ToolGroup"
-        title="Links"
-        collapsible="true">
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Link"
-          description="Create new link"/>
-    </tools>
-  </palette>
-</gmftool:ToolRegistry>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/add2.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.add/model/add2.gmfgen
deleted file mode 100644
index c977140..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/add2.gmfgen
+++ /dev/null
@@ -1,591 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel/2.0">
-  <diagram
-      visualID="79"
-      editPartClassName="ActivityDetailDiagramEditPart"
-      itemSemanticEditPolicyClassName="ActivityDetailDiagramItemSemanticEditPolicy"
-      notationViewFactoryClassName="ActivityDetailDiagramViewFactory"
-      canonicalEditPolicyClassName="ActivityDetailDiagramCanonicalEditPolicy"
-      iconProviderPriority="Low"
-      validationProviderPriority="Low">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="ActivityDetailDiagramEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/ActivityDetailDiagram"/>
-    <childNodes
-        visualID="2001"
-        editPartClassName="RoleNodeEditPart"
-        itemSemanticEditPolicyClassName="RoleNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleNodeViewFactory"
-        canonicalEditPolicyClassName="RoleNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="RoleNodeGraphicalNodeEditPolicy"
-        createCommandClassName="RoleNodeCreateCommand"
-        containers="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="RoleNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="RoleNodeFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class RoleNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public RoleNodeFigure() {&#xA;&#x9;&#x9;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(false);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(1);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#x9;this.setBackgroundColor(ROLENODEFIGURE_BACK&#xA;);&#xA;&#x9;&#x9;createContents();&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void createContents(){&#xA;&#xA;&#xA;&#xA;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel roleNodeNameFigure0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xA;roleNodeNameFigure0.setText(&quot;&lt;...>&quot;);&#xA;&#xA;roleNodeNameFigure0.setFont(RoleNodeNameFigure_FONT);&#xA;&#xA;&#xA;&#xA;this.add(roleNodeNameFigure0);&#xA;setFigureRoleNodeNameFigure(roleNodeNameFigure0);&#xA;&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fRoleNodeNameFigure; &#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureRoleNodeNameFigure() {&#xA;&#x9;&#x9;return fRoleNodeNameFigure;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void setFigureRoleNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xA;&#x9;&#x9;fRoleNodeNameFigure = fig;&#xA;&#x9;}&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected boolean useLocalCoordinates() {&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Color ROLENODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Font RoleNodeNameFigure_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xA;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/RoleNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4001"
-          editPartClassName="RoleNodeNameEditPart"
-          itemSemanticEditPolicyClassName="RoleNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="RoleNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureRoleNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <childNodes
-        visualID="2002"
-        editPartClassName="TaskNodeEditPart"
-        itemSemanticEditPolicyClassName="TaskNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="TaskNodeViewFactory"
-        canonicalEditPolicyClassName="TaskNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="TaskNodeGraphicalNodeEditPolicy"
-        createCommandClassName="TaskNodeCreateCommand"
-        containers="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="TaskNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="TaskNodeFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class TaskNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public TaskNodeFigure() {&#xA;&#x9;&#x9;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(false);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(0);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#x9;this.setBackgroundColor(TASKNODEFIGURE_BACK&#xA;);&#xA;&#x9;&#x9;createContents();&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void createContents(){&#xA;&#xA;&#xA;&#xA;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel taskNodeNameFigure0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xA;taskNodeNameFigure0.setText(&quot;&lt;...>&quot;);&#xA;&#xA;taskNodeNameFigure0.setFont(TaskNodeNameFigure_FONT);&#xA;&#xA;&#xA;&#xA;this.add(taskNodeNameFigure0);&#xA;setFigureTaskNodeNameFigure(taskNodeNameFigure0);&#xA;&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fTaskNodeNameFigure; &#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureTaskNodeNameFigure() {&#xA;&#x9;&#x9;return fTaskNodeNameFigure;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void setFigureTaskNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xA;&#x9;&#x9;fTaskNodeNameFigure = fig;&#xA;&#x9;}&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected boolean useLocalCoordinates() {&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Color TASKNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Font TaskNodeNameFigure_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xA;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/TaskNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="TaskNodeNameEditPart"
-          itemSemanticEditPolicyClassName="TaskNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="TaskNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureTaskNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <childNodes
-        visualID="2003"
-        editPartClassName="WorkProductDescriptorNodeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductDescriptorNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductDescriptorNodeViewFactory"
-        canonicalEditPolicyClassName="WorkProductDescriptorNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="WorkProductDescriptorNodeGraphicalNodeEditPolicy"
-        createCommandClassName="WorkProductDescriptorNodeCreateCommand"
-        containers="//@diagram/@topLevelNodes.1">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductDescriptorNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="WorkProductDescriptorNodeFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class WorkProductDescriptorNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public WorkProductDescriptorNodeFigure() {&#xA;&#x9;&#x9;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(false);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(1);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#x9;this.setBackgroundColor(WORKPRODUCTDESCRIPTORNODEFIGURE_BACK&#xA;);&#xA;&#x9;&#x9;createContents();&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void createContents(){&#xA;&#xA;&#xA;&#xA;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel workProductNodeNameFigure0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xA;workProductNodeNameFigure0.setText(&quot;&lt;...>&quot;);&#xA;&#xA;workProductNodeNameFigure0.setFont(WorkProductNodeNameFigure_FONT);&#xA;&#xA;&#xA;&#xA;this.add(workProductNodeNameFigure0);&#xA;setFigureWorkProductNodeNameFigure(workProductNodeNameFigure0);&#xA;&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fWorkProductNodeNameFigure; &#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureWorkProductNodeNameFigure() {&#xA;&#x9;&#x9;return fWorkProductNodeNameFigure;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void setFigureWorkProductNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xA;&#x9;&#x9;fWorkProductNodeNameFigure = fig;&#xA;&#x9;}&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected boolean useLocalCoordinates() {&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Color WORKPRODUCTDESCRIPTORNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 205);&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Font WorkProductNodeNameFigure_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xA;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductDescriptorNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4003"
-          editPartClassName="WorkProductDescriptorNodeNameEditPart"
-          itemSemanticEditPolicyClassName="WorkProductDescriptorNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="WorkProductDescriptorNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureWorkProductNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="RoleTaskCompositeEditPart"
-        itemSemanticEditPolicyClassName="RoleTaskCompositeItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleTaskCompositeViewFactory"
-        canonicalEditPolicyClassName="RoleTaskCompositeCanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.0 //@diagram/@childNodes.1"
-        compartments="//@diagram/@compartments.0"
-        graphicalNodeEditPolicyClassName="RoleTaskCompositeGraphicalNodeEditPolicy"
-        createCommandClassName="RoleTaskCompositeCreateCommand">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="RoleTaskCompositeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="TOOLBAR_LAYOUT"
-          className="RoleTaskCompositeFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class RoleTaskCompositeFigure extends org.eclipse.draw2d.RectangleFigure {&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public RoleTaskCompositeFigure() {&#xA;&#x9;&#x9;&#xA;&#xA;&#x9;org.eclipse.draw2d.ToolbarLayout layoutThis = new org.eclipse.draw2d.ToolbarLayout();&#xA;&#x9;layoutThis.setStretchMinorAxis(false);&#xA;&#x9;layoutThis.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.&#xA;ALIGN_CENTER&#xA;&#xA;&#xA;);&#xA;&#xA;&#x9;layoutThis.setSpacing(5);&#xA;&#x9;layoutThis.setVertical(false);&#xA;&#xA;&#x9;this.setLayoutManager(layoutThis);&#xA;&#xA;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(true);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(1);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#x9;this.setBackgroundColor(ROLETASKCOMPOSITEFIGURE_BACK&#xA;);&#xA;this.setBorder(new org.eclipse.draw2d.MarginBorder()&#xA;);&#xA;&#x9;}&#xA;&#xA;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected boolean useLocalCoordinates() {&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Color ROLETASKCOMPOSITEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xA;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/RoleTaskComposite"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1002"
-        editPartClassName="WorkProductCompositeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductCompositeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductCompositeViewFactory"
-        canonicalEditPolicyClassName="WorkProductCompositeCanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.2"
-        compartments="//@diagram/@compartments.1"
-        graphicalNodeEditPolicyClassName="WorkProductCompositeGraphicalNodeEditPolicy"
-        createCommandClassName="WorkProductCompositeCreateCommand">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductCompositeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="TOOLBAR_LAYOUT"
-          className="WorkProductCompositeFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class WorkProductCompositeFigure extends org.eclipse.draw2d.RectangleFigure {&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public WorkProductCompositeFigure() {&#xA;&#x9;&#x9;&#xA;&#xA;&#x9;org.eclipse.draw2d.ToolbarLayout layoutThis = new org.eclipse.draw2d.ToolbarLayout();&#xA;&#x9;layoutThis.setStretchMinorAxis(false);&#xA;&#x9;layoutThis.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.&#xA;ALIGN_CENTER&#xA;&#xA;&#xA;);&#xA;&#xA;&#x9;layoutThis.setSpacing(5);&#xA;&#x9;layoutThis.setVertical(true);&#xA;&#xA;&#x9;this.setLayoutManager(layoutThis);&#xA;&#xA;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(true);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(1);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#x9;this.setBackgroundColor(WORKPRODUCTCOMPOSITEFIGURE_BACK&#xA;);&#xA;this.setBorder(new org.eclipse.draw2d.MarginBorder()&#xA;);&#xA;&#x9;}&#xA;&#xA;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected boolean useLocalCoordinates() {&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;/**&#xA; * @generated&#xA; */&#xA;static final org.eclipse.swt.graphics.Color WORKPRODUCTCOMPOSITEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 205);&#xA;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductComposite"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="LinkEditPart"
-        itemSemanticEditPolicyClassName="LinkItemSemanticEditPolicy"
-        notationViewFactoryClassName="LinkViewFactory"
-        createCommandClassName="LinkCreateCommand"
-        reorientCommandClassName="LinkReorientCommand">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="LinkEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="LinkFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class LinkFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public LinkFigure() {&#xA;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(true);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(1);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.black);&#xA;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private org.eclipse.draw2d.RotatableDecoration createTargetDecoration() {&#xA;&#x9;&#x9;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xA;df.setFill(true);&#xA;df.setFillXOR(false);&#xA;df.setOutline(true);&#xA;df.setOutlineXOR(false);&#xA;df.setLineWidth(1);&#xA;df.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xA;pl.addPoint(getMapMode().DPtoLP(-1)&#xA;, getMapMode().DPtoLP(1)&#xA;);&#xA;pl.addPoint(getMapMode().DPtoLP(0)&#xA;, getMapMode().DPtoLP(0)&#xA;);&#xA;pl.addPoint(getMapMode().DPtoLP(-1)&#xA;, getMapMode().DPtoLP(-1)&#xA;);&#xA;df.setTemplate(pl);&#xA;df.setScale(getMapMode().DPtoLP(7)&#xA;, getMapMode().DPtoLP(3)&#xA;);&#xA;&#x9;&#x9;return df;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/target"/>
-      </modelFacet>
-      <labels
-          visualID="4004"
-          editPartClassName="LinkNameEditPart"
-          itemSemanticEditPolicyClassName="LinkNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="LinkNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:FigureViewmap"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <compartments
-        visualID="5001"
-        editPartClassName="RoleTaskCompositeRoleTaskCompartmentEditPart"
-        itemSemanticEditPolicyClassName="RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleTaskCompositeRoleTaskCompartmentViewFactory"
-        canonicalEditPolicyClassName="RoleTaskCompositeRoleTaskCompartmentCanonicalEditPolicy"
-        title="RoleTaskCompartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <compartments
-        visualID="5002"
-        editPartClassName="WorkProductCompositeWorkProductCompartmentEditPart"
-        itemSemanticEditPolicyClassName="WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductCompositeWorkProductCompartmentViewFactory"
-        canonicalEditPolicyClassName="WorkProductCompositeWorkProductCompartmentCanonicalEditPolicy"
-        title="WorkProductCompartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.1">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <palette>
-      <groups
-          title="Nodes"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="RoleNode"
-            description="Create new RoleNode"
-            genNodes="//@diagram/@childNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="RoleTaskComposite"
-            description="Create new RoleTaskComposite"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="TaskNode"
-            description="Create new TaskNode"
-            genNodes="//@diagram/@childNodes.1"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="WorkProductDescriptorNode"
-            description="Create new WorkProducNode"
-            genNodes="//@diagram/@childNodes.2"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="WorkProductComposite"
-            description="Create new WorkProductComposite"
-            genNodes="//@diagram/@topLevelNodes.1"/>
-      </groups>
-      <groups
-          title="Links"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Link"
-            description="Create new link"
-            genLinks="//@diagram/@links.0"/>
-      </groups>
-    </palette>
-    <preferencePages
-        xsi:type="gmfgen:GenStandardPreferencePage"
-        iD="org.eclipse.epf.diagram.diagram.general"
-        name="Diagram Diagram">
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.appearance"
-          name="Appearance"
-          kind="Appearance"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.connections"
-          name="Connections"
-          kind="Connections"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.printing"
-          name="Printing"
-          kind="Printing"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.rulersAndGrid"
-          name="Rulers And Grid"
-          kind="RulersAndGrid"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.pathmaps"
-          name="Pathmaps"
-          kind="Pathmaps"/>
-    </preferencePages>
-  </diagram>
-  <plugin/>
-  <editor/>
-  <navigator>
-    <childReferences
-        child="//@diagram"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.0"
-        child="//@diagram/@childNodes.0"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.0"
-        child="//@diagram/@childNodes.1"/>
-    <childReferences
-        parent="//@diagram"
-        child="//@diagram/@topLevelNodes.0"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.1"
-        child="//@diagram/@childNodes.2"/>
-    <childReferences
-        parent="//@diagram"
-        child="//@diagram/@topLevelNodes.1"/>
-    <childReferences
-        parent="//@diagram"
-        child="//@diagram/@links.0"
-        groupName="links"
-        groupIcon="icons/linksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@topLevelNodes.0"
-        referenceType="out_target"
-        groupName="target"
-        groupIcon="icons/linkTargetNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.0"
-        child="//@diagram/@links.0"
-        referenceType="in_source"
-        groupName="incoming links"
-        groupIcon="icons/incomingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@topLevelNodes.1"
-        referenceType="out_target"
-        groupName="target"
-        groupIcon="icons/linkTargetNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.1"
-        child="//@diagram/@links.0"
-        referenceType="in_source"
-        groupName="incoming links"
-        groupIcon="icons/incomingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@childNodes.0"
-        referenceType="out_target"
-        groupName="target"
-        groupIcon="icons/linkTargetNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@childNodes.0"
-        child="//@diagram/@links.0"
-        referenceType="in_source"
-        groupName="incoming links"
-        groupIcon="icons/incomingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@childNodes.1"
-        referenceType="out_target"
-        groupName="target"
-        groupIcon="icons/linkTargetNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@childNodes.1"
-        child="//@diagram/@links.0"
-        referenceType="in_source"
-        groupName="incoming links"
-        groupIcon="icons/incomingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@childNodes.2"
-        referenceType="out_target"
-        groupName="target"
-        groupIcon="icons/linkTargetNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@childNodes.2"
-        child="//@diagram/@links.0"
-        referenceType="in_source"
-        groupName="incoming links"
-        groupIcon="icons/incomingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@topLevelNodes.0"
-        referenceType="in_source"
-        groupName="source"
-        groupIcon="icons/linkSourceNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.0"
-        child="//@diagram/@links.0"
-        referenceType="out_target"
-        groupName="outgoing links"
-        groupIcon="icons/outgoingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@topLevelNodes.1"
-        referenceType="in_source"
-        groupName="source"
-        groupIcon="icons/linkSourceNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.1"
-        child="//@diagram/@links.0"
-        referenceType="out_target"
-        groupName="outgoing links"
-        groupIcon="icons/outgoingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@childNodes.0"
-        referenceType="in_source"
-        groupName="source"
-        groupIcon="icons/linkSourceNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@childNodes.0"
-        child="//@diagram/@links.0"
-        referenceType="out_target"
-        groupName="outgoing links"
-        groupIcon="icons/outgoingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@childNodes.1"
-        referenceType="in_source"
-        groupName="source"
-        groupIcon="icons/linkSourceNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@childNodes.1"
-        child="//@diagram/@links.0"
-        referenceType="out_target"
-        groupName="outgoing links"
-        groupIcon="icons/outgoingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@childNodes.2"
-        referenceType="in_source"
-        groupName="source"
-        groupIcon="icons/linkSourceNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@childNodes.2"
-        child="//@diagram/@links.0"
-        referenceType="out_target"
-        groupName="outgoing links"
-        groupIcon="icons/outgoingLinksNavigatorGroup.gif"/>
-  </navigator>
-  <propertySheet>
-    <tabs
-        xsi:type="gmfgen:GenStandardPropertyTab"
-        iD="appearance"/>
-    <tabs
-        xsi:type="gmfgen:GenStandardPropertyTab"
-        iD="diagram"/>
-    <tabs
-        xsi:type="gmfgen:GenCustomPropertyTab"
-        iD="domain"
-        label="Core">
-      <filter
-          xsi:type="gmfgen:TypeTabFilter">
-        <types>org.eclipse.gmf.runtime.notation.View</types>
-        <types>org.eclipse.gef.EditPart</types>
-        <generatedTypes>abstractNavigatorItem</generatedTypes>
-      </filter>
-    </tabs>
-  </propertySheet>
-  <domainGenModel
-      href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#/"/>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/add2.gmfmap b/1.5/plugins/org.eclipse.epf.diagram.add/model/add2.gmfmap
deleted file mode 100644
index 84cf761..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/add2.gmfmap
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfmap:Mapping xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:gmfmap="http://www.eclipse.org/gmf/2005/mappings/2.0"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//RoleTaskComposite"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="add.gmftool#//@palette/@tools.0/@tools.1"/>
-      <diagramNode
-          href="add.gmfgraph#RoleTaskComposite"/>
-      <children>
-        <containmentFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-        <ownedChild>
-          <domainMetaElement
-              href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//RoleNode"/>
-          <labelMappings
-              xsi:type="gmfmap:FeatureLabelMapping">
-            <diagramLabel
-                href="add.gmfgraph#RoleNodeName"/>
-            <features
-                href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-          </labelMappings>
-          <tool
-              xsi:type="gmftool:CreationTool"
-              href="add.gmftool#//@palette/@tools.0/@tools.0"/>
-          <diagramNode
-              href="add.gmfgraph#RoleNode"/>
-        </ownedChild>
-      </children>
-      <children>
-        <containmentFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-        <ownedChild>
-          <domainMetaElement
-              href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//TaskNode"/>
-          <labelMappings
-              xsi:type="gmfmap:FeatureLabelMapping">
-            <diagramLabel
-                href="add.gmfgraph#TaskNodeName"/>
-            <features
-                href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-          </labelMappings>
-          <tool
-              xsi:type="gmftool:CreationTool"
-              href="add.gmftool#//@palette/@tools.0/@tools.2"/>
-          <diagramNode
-              href="add.gmfgraph#TaskNode"/>
-        </ownedChild>
-      </children>
-      <compartments>
-        <compartment
-            href="add.gmfgraph#RoleTaskCompartment"/>
-      </compartments>
-    </ownedChild>
-  </nodes>
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductComposite"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="add.gmftool#//@palette/@tools.0/@tools.4"/>
-      <diagramNode
-          href="add.gmfgraph#WorkProductComposite"/>
-      <children>
-        <containmentFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-        <ownedChild>
-          <domainMetaElement
-              href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductDescriptorNode"/>
-          <labelMappings
-              xsi:type="gmfmap:FeatureLabelMapping">
-            <diagramLabel
-                href="add.gmfgraph#WorkProductNodeName"/>
-            <features
-                href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-          </labelMappings>
-          <tool
-              xsi:type="gmftool:CreationTool"
-              href="add.gmftool#//@palette/@tools.0/@tools.3"/>
-          <diagramNode
-              href="add.gmfgraph#WorkProductDescriptorNode"/>
-        </ownedChild>
-      </children>
-      <compartments>
-        <compartment
-            href="add.gmfgraph#WorkProductCompartment"/>
-      </compartments>
-    </ownedChild>
-  </nodes>
-  <links>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link"/>
-    <labelMappings
-        xsi:type="gmfmap:FeatureLabelMapping"
-        editPattern="">
-      <diagramLabel
-          href="add.gmfgraph#LinkNameLabel"/>
-      <features
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/name"/>
-    </labelMappings>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Node/outgoingConnections"/>
-    <tool
-        xsi:type="gmftool:CreationTool"
-        href="add.gmftool#//@palette/@tools.1/@tools.0"/>
-    <diagramLink
-        href="add.gmfgraph#Link"/>
-    <sourceMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/source"/>
-    <linkMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/target"/>
-  </links>
-  <diagram>
-    <diagramCanvas
-        href="add.gmfgraph#model"/>
-    <domainModel
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#/"/>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//ActivityDetailDiagram"/>
-    <palette
-        href="add.gmftool#//@palette"/>
-  </diagram>
-</gmfmap:Mapping>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/add3.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.add/model/add3.gmfgen
deleted file mode 100644
index 271e361..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/add3.gmfgen
+++ /dev/null
@@ -1,402 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel/2.0" packageNamePrefix="org.eclipse.epf.diagram.add"
-    modelID="ADD"
-    sameFileForDiagramAndModel="true"
-    diagramFileExtension="xmi"
-    templateDirectory="">
-  <diagram
-      visualID="79"
-      editPartClassName="ActivityDetailDiagramEditPart"
-      itemSemanticEditPolicyClassName="ActivityDetailDiagramItemSemanticEditPolicy"
-      notationViewFactoryClassName="ActivityDetailDiagramViewFactory"
-      canonicalEditPolicyClassName="ActivityDetailDiagramCanonicalEditPolicy"
-      iconProviderPriority="Low">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="ActivityDetailDiagramEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/ActivityDetailDiagram"/>
-    <childNodes
-        visualID="2001"
-        editPartClassName="RoleNodeEditPart"
-        itemSemanticEditPolicyClassName="RoleNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleNodeViewFactory"
-        canonicalEditPolicyClassName="RoleNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="RoleNodeGraphicalNodeEditPolicy"
-        containers="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="RoleNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="RoleNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class RoleNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public RoleNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ROLENODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&lt;...>&quot;);&#xD;&#xA;&#x9;&#x9;fig_0.setFont(&#xD;&#xA;&#x9;&#x9;&#x9;ROLENODENAMEFIGURE_FONT);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureRoleNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fRoleNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureRoleNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fRoleNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureRoleNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fRoleNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ROLENODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Font ROLENODENAMEFIGURE_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/RoleNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4001"
-          editPartClassName="RoleNodeNameEditPart"
-          itemSemanticEditPolicyClassName="RoleNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="RoleNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureRoleNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <childNodes
-        visualID="2002"
-        editPartClassName="TaskNodeEditPart"
-        itemSemanticEditPolicyClassName="TaskNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="TaskNodeViewFactory"
-        canonicalEditPolicyClassName="TaskNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="TaskNodeGraphicalNodeEditPolicy"
-        containers="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="TaskNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="TaskNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class TaskNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public TaskNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;this.setLineWidth(0);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(TASKNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&lt;...>&quot;);&#xD;&#xA;&#x9;&#x9;fig_0.setFont(&#xD;&#xA;&#x9;&#x9;&#x9;TASKNODENAMEFIGURE_FONT);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureTaskNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fTaskNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureTaskNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fTaskNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureTaskNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fTaskNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Font TASKNODENAMEFIGURE_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color TASKNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/TaskNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="TaskNodeNameEditPart"
-          itemSemanticEditPolicyClassName="TaskNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="TaskNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureTaskNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <childNodes
-        visualID="2003"
-        editPartClassName="WorkProductDescriptorNodeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductDescriptorNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductDescriptorNodeViewFactory"
-        canonicalEditPolicyClassName="WorkProductDescriptorNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="WorkProductDescriptorNodeGraphicalNodeEditPolicy"
-        containers="//@diagram/@topLevelNodes.1">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductDescriptorNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="WorkProductDescriptorNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class WorkProductDescriptorNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public WorkProductDescriptorNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(WORKPRODUCTDESCRIPTORNODEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;&lt;...>&quot;);&#xD;&#xA;&#x9;&#x9;fig_0.setFont(&#xD;&#xA;&#x9;&#x9;&#x9;WORKPRODUCTNODENAMEFIGURE_FONT);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureWorkProductNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fWorkProductNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureWorkProductNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fWorkProductNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureWorkProductNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fWorkProductNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Font WORKPRODUCTNODENAMEFIGURE_FONT = new org.eclipse.swt.graphics.Font(org.eclipse.swt.widgets.Display.getCurrent(), &quot;Arial&quot;, 8, org.eclipse.swt.SWT.NORMAL);&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color WORKPRODUCTDESCRIPTORNODEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 205);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductDescriptorNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4003"
-          editPartClassName="WorkProductDescriptorNodeNameEditPart"
-          itemSemanticEditPolicyClassName="WorkProductDescriptorNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="WorkProductDescriptorNodeNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureWorkProductNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:StyleAttributes"
-              fixedFont="true"/>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </childNodes>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="RoleTaskCompositeEditPart"
-        itemSemanticEditPolicyClassName="RoleTaskCompositeItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleTaskCompositeViewFactory"
-        canonicalEditPolicyClassName="RoleTaskCompositeCanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.0 //@diagram/@childNodes.1"
-        compartments="//@diagram/@compartments.0"
-        graphicalNodeEditPolicyClassName="RoleTaskCompositeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="RoleTaskCompositeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="TOOLBAR_LAYOUT"
-          className="RoleTaskCompositeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class RoleTaskCompositeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public RoleTaskCompositeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.ToolbarLayout myGenLayoutManager = new org.eclipse.draw2d.ToolbarLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;myGenLayoutManager.setStretchMinorAxis(false);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.ALIGN_CENTER);&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setSpacing(5);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setVertical(false);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(ROLETASKCOMPOSITEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBorder(&#x9;&#xD;&#xA;new org.eclipse.draw2d.MarginBorder(getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0))&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color ROLETASKCOMPOSITEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 156);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/RoleTaskComposite"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-    </topLevelNodes>
-    <topLevelNodes
-        visualID="1002"
-        editPartClassName="WorkProductCompositeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductCompositeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductCompositeViewFactory"
-        canonicalEditPolicyClassName="WorkProductCompositeCanonicalEditPolicy"
-        childNodes="//@diagram/@childNodes.2"
-        compartments="//@diagram/@compartments.1"
-        graphicalNodeEditPolicyClassName="WorkProductCompositeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductCompositeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          layoutType="TOOLBAR_LAYOUT"
-          className="WorkProductCompositeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class WorkProductCompositeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public WorkProductCompositeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.ToolbarLayout myGenLayoutManager = new org.eclipse.draw2d.ToolbarLayout();&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;myGenLayoutManager.setStretchMinorAxis(false);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.ALIGN_CENTER);&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setSpacing(5);&#xD;&#xA;&#x9;&#x9;myGenLayoutManager.setVertical(true);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;this.setLayoutManager(myGenLayoutManager);&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setBackgroundColor(WORKPRODUCTCOMPOSITEFIGURE_BACK&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;this.setBorder(&#x9;&#xD;&#xA;new org.eclipse.draw2d.MarginBorder(getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0))&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public static final org.eclipse.swt.graphics.Color WORKPRODUCTCOMPOSITEFIGURE_BACK = new org.eclipse.swt.graphics.Color(null, 255, 255, 205);&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedBackground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductComposite"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="LinkEditPart"
-        itemSemanticEditPolicyClassName="LinkItemSemanticEditPolicy"
-        notationViewFactoryClassName="LinkViewFactory">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="LinkEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="LinkFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class LinkFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public LinkFigure() {&#xD;&#xA;&#x9;&#x9;this.setForegroundColor(org.eclipse.draw2d.ColorConstants.black&#xD;&#xA;&#xD;&#xA;);&#xD;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.draw2d.PolylineDecoration createTargetDecoration() {&#xD;&#xA;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xD;&#xA;// dispatchNext?&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, 1);&#xD;&#xA;&#x9;&#x9;pl.addPoint(0, 0);&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, -1);&#xD;&#xA;&#x9;&#x9;df.setTemplate(pl);&#xD;&#xA;&#x9;&#x9;df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;return df;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <attributes
-            xsi:type="gmfgen:StyleAttributes"
-            fixedForeground="true"/>
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/target"/>
-      </modelFacet>
-      <labels
-          visualID="4004"
-          editPartClassName="LinkNameEditPart"
-          itemSemanticEditPolicyClassName="LinkNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="LinkNameViewFactory">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:FigureViewmap"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <compartments
-        visualID="5001"
-        editPartClassName="RoleTaskCompositeRoleTaskCompartmentEditPart"
-        itemSemanticEditPolicyClassName="RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="RoleTaskCompositeRoleTaskCompartmentViewFactory"
-        canonicalEditPolicyClassName="RoleTaskCompositeRoleTaskCompartmentCanonicalEditPolicy"
-        title="RoleTaskCompartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.0">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <compartments
-        visualID="5002"
-        editPartClassName="WorkProductCompositeWorkProductCompartmentEditPart"
-        itemSemanticEditPolicyClassName="WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductCompositeWorkProductCompartmentViewFactory"
-        canonicalEditPolicyClassName="WorkProductCompositeWorkProductCompartmentCanonicalEditPolicy"
-        title="WorkProductCompartment"
-        canCollapse="false"
-        needsTitle="false"
-        node="//@diagram/@topLevelNodes.1">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <viewmap
-          xsi:type="gmfgen:FigureViewmap"
-          figureQualifiedClassName="org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-    </compartments>
-    <palette>
-      <groups
-          title="Nodes"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="RoleNode"
-            description="Create new RoleNode"
-            genNodes="//@diagram/@childNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="RoleTaskComposite"
-            description="Create new RoleTaskComposite"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="TaskNode"
-            description="Create new TaskNode"
-            genNodes="//@diagram/@childNodes.1"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="WorkProductDescriptorNode"
-            description="Create new WorkProducNode"
-            genNodes="//@diagram/@childNodes.2"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="WorkProductComposite"
-            description="Create new WorkProductComposite"
-            genNodes="//@diagram/@topLevelNodes.1"/>
-      </groups>
-      <groups
-          title="Links"
-          collapse="true">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Link"
-            description="Create new link"
-            genLinks="//@diagram/@links.0"/>
-      </groups>
-    </palette>
-  </diagram>
-  <plugin
-      iD="org.eclipse.epf.diagram.add"
-      name="Activity Detail Diagram Plugin"
-      provider="EPF"
-      version="1.2.0.qualifier"
-      printingEnabled="true"
-      activatorClassName="ActivityDetailDiagramEditorPlugin"/>
-  <editor
-      className="ActivityDetailDiagramEditor"
-      iD="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"/>
-  <domainGenModel
-      href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#/"/>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/model/diagram.ecore b/1.5/plugins/org.eclipse.epf.diagram.add/model/diagram.ecore
deleted file mode 100644
index 42e78b5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/model/diagram.ecore
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model"
-    nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore" nsPrefix="org.eclipse.epf.diagram.model">
-  <eClassifiers xsi:type="ecore:EClass" name="Diagram" eSuperTypes="#//NodeContainer"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Link" eSuperTypes="#//LinkedObject">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="source" eType="#//Node"
-        eOpposite="#//Node/outgoingConnections"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//Node"
-        eOpposite="#//Node/incomingConnections"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bendpoints" upperBound="-1"
-        eType="#//AbsoluteBendpoint"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourceEndPoint" eType="#//Point"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="targetEndPoint" eType="#//Point"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LinkedObject" abstract="true">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="object" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NamedNode" eSuperTypes="#//Node">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Node" abstract="true" eSuperTypes="#//LinkedObject">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="location" eType="#//Point"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="width" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-        defaultValueLiteral="-1"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="height" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-        defaultValueLiteral="-1"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="incomingConnections" upperBound="-1"
-        eType="#//Link" eOpposite="#//Link/target"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outgoingConnections" upperBound="-1"
-        eType="#//Link" containment="true" resolveProxies="false" eOpposite="#//Link/source"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="readOnly" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDiagram" eSuperTypes="#//Diagram"/>
-  <eClassifiers xsi:type="ecore:EClass" name="TypedNode" eSuperTypes="#//Node">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDependencyDiagram" eSuperTypes="#//Diagram"/>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductNode" eSuperTypes="#//NamedNode">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDetailDiagram" eSuperTypes="#//Diagram"/>
-  <eClassifiers xsi:type="ecore:EClass" name="NodeContainer" abstract="true" eSuperTypes="#//Node">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1"
-        eType="#//Node" containment="true" resolveProxies="false"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleNode" eSuperTypes="#//NamedNode"/>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleTaskComposite" eSuperTypes="#//NodeContainer"/>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskNode" eSuperTypes="#//NamedNode"/>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescriptorNode" eSuperTypes="#//NamedNode"/>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkBreakdownElementNode" eSuperTypes="#//NamedNode"/>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductComposite" eSuperTypes="#//NodeContainer">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="AbsoluteBendpoint" instanceClassName="org.eclipse.draw2d.AbsoluteBendpoint"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Point" instanceClassName="org.eclipse.draw2d.geometry.Point"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="RoleDescriptor" instanceClassName="org.eclipse.epf.uma.RoleDescriptor"/>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/plugin.properties b/1.5/plugins/org.eclipse.epf.diagram.add/plugin.properties
deleted file mode 100644
index 2e8c11e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/plugin.properties
+++ /dev/null
@@ -1,47 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-################################################################################
-# START NO TRANSLATION
-################################################################################
-preferences.general=ADD Diagram
-preferences.appearance=Appearance
-preferences.connections=Connections
-preferences.printing=Printing
-preferences.rulersAndGrid=Rulers & Grid
-preferences.pathmaps=Path Maps
-
-editorName=ADD Diagram Editor
-newWizardName=ADD Diagram
-newWizardDesc=Creates ADD diagram.
-
-initDiagramActionLabel=Initialize add diagram file
-loadResourceActionLabel=Load Resource...
-
-navigatorContentName=*.add diagram contents
-
-metatype.name.ActivityDetailDiagram_79=Undefined
-metatype.name.RoleTaskComposite_1001=RoleTaskComposite
-metatype.name.WorkProductComposite_1002=WorkProductComposite
-metatype.name.RoleNode_2001=RoleNode
-metatype.name.TaskNode_2002=TaskNode
-metatype.name.WorkProductDescriptorNode_2003=WorkProductDescriptorNode
-metatype.name.Link_3001=Link
-################################################################################
-# END NO TRANSLATION
-################################################################################
-
-pluginName=EPF Activity Detail Diagram
-providerName=Eclipse.org
-
-# Need translation
-element_type_control_flow=Control Flow
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/plugin.xml b/1.5/plugins/org.eclipse.epf.diagram.add/plugin.xml
deleted file mode 100644
index 9c569db8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/plugin.xml
+++ /dev/null
@@ -1,408 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<plugin>
-
-   <extension point="org.eclipse.core.runtime.preferences">
-      <initializer class="org.eclipse.epf.diagram.add.part.DiagramDiagramPreferenceInitializer"/>
-   </extension>
-
-  <extension point="org.eclipse.team.core.fileTypes">
-      <fileTypes
-         type="text"
-         extension="add">
-      </fileTypes>
-  </extension>
-
-   <extension point="org.eclipse.emf.ecore.extension_parser">
-      <parser
-         type="add"
-         class="org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory">
-      </parser>
-   </extension>
-
-   <extension point="org.eclipse.ui.editors">
-   <!--
-     <editor
-        id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"
-        name="GMF Activity Detail Diagram Editor"
-        icon="icons/obj16/ModelDiagramFile.gif"
-        extensions="add"
-        default="true"
-        class="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditor"
-        matchingStrategy="org.eclipse.epf.diagram.add.part.DiagramMatchingStrategy"
-        contributorClass="org.eclipse.epf.diagram.add.part.DiagramDiagramActionBarContributor">
-     </editor>
-   -->
-     <editor
-        id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"
-        name="Activity Detail Diagram Editor"
-        icon="icons/full/etool16/ADDEditor.gif"
-        extensions="add"
-        default="true"
-        class="org.eclipse.epf.diagram.add.part.ADDiagramEditor"
-        matchingStrategy="org.eclipse.epf.diagram.add.part.DiagramMatchingStrategy"
-        contributorClass="org.eclipse.epf.diagram.add.part.DiagramDiagramActionBarContributor">
-     </editor>    
-   </extension>
-
-   <!-- <extension point="org.eclipse.ui.newWizards">
-  	  <wizard
-  	     name="Activity Detail Diagram"
-  	     icon="icons/obj16/ModelDiagramFile.gif"
-  	     category="org.eclipse.ui.Examples"
-  	     class="org.eclipse.epf.diagram.add.part.DiagramCreationWizard"
-  	     id="org.eclipse.epf.diagram.add.part.DiagramCreationWizardID">
-  	  	 <description>
-  	  		Creates Activity Detail Diagram.
-  	  	 </description>  
-      </wizard>
-   </extension> -->
-
-   <extension point="org.eclipse.ui.popupMenus">
-      <!-- <objectContribution
-            id="org.eclipse.epf.diagram.add.ui.objectContribution.IFile1"
-            nameFilter="*.model"
-            objectClass="org.eclipse.core.resources.IFile">
-         <action
-               label="Initialize add diagram file"
-               class="org.eclipse.epf.diagram.add.part.DiagramInitDiagramFileAction"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.add.part.DiagramInitDiagramFileActionID">
-         </action>
-      </objectContribution>  
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.epf.diagram.add.ui.objectContribution.ActivityDetailDiagramEditPart2"
-            objectClass="org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.add.part.DiagramLoadResourceAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.add.part.DiagramLoadResourceActionID"
-               label="Load Resource..."
-               menubarPath="additions">
-         </action>
-      </objectContribution>    
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.epf.diagram.add.DeleteDiagram"
-            objectClass="org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.DeleteDiagramAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.core.actions.DeleteDiagramAction"
-               label="%DeleteDiagram_text"
-               menubarPath="additions"
-               state="false"
-               style="push"
-               tooltip="%DeleteDiagram_text"/>
-      </objectContribution>
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.epf.diagram.add.RefreshFromBaseAction"
-            objectClass="org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.RefreshFromBaseAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.core.actions.RefreshFromBaseAction"
-               label="%refreshFromBaseActivity_text"
-               menubarPath="additions"
-               state="false"
-               style="push"
-               tooltip="%refreshFromBaseActivity_text"/>
-      </objectContribution>
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.epf.diagram.add.RefreshAction"
-            objectClass="org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.RefreshAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.core.actions.RefreshAction"
-               label="%refresh_text"
-               menubarPath="additions"
-               state="false"
-               style="push"
-               tooltip="%refresh_text"/>
-      </objectContribution>         -->           
-  </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders">
-      <contributionItemProvider class="org.eclipse.epf.diagram.add.providers.DiagramContributionItemProvider">
-         <Priority name="Low">
-         </Priority>
-         <partContribution id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID">
-            <partAction menubarPath="/file/print" id="printPreviewAction">
-            </partAction>
-         </partContribution>
-      </contributionItemProvider>
-      <contributionItemProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContributionItemProvider"
-            checkPluginLoaded="false">
-         <Priority name="Low"/>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.RoleNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.TaskNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.LinkEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-                  <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.add.edit.parts.LinkNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-            <popupPredefinedItem id="deleteFromModelAction" remove="true"/>
-         </popupContribution>
-      </contributionItemProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.globalActionHandlerProviders">
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandlerProvider"
-         id="ADDPresentation">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="delete"/>
-            </ElementType>
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
-               <GlobalActionId actionId="save"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.printing.render.providers.DiagramWithPrintGlobalActionHandlerProvider"
-         id="ADDPresentationPrint">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="print"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.providers.ide.providers.DiagramIDEGlobalActionHandlerProvider"
-         id="ADDPresentationIDE">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="bookmark"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <!--
-      <GlobalActionHandlerProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.render.providers.DiagramUIRenderGlobalActionHandlerProvider"
-            id="ADDRender">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="cut"/>
-               <GlobalActionId actionId="copy"/>
-               <GlobalActionId actionId="paste"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      -->
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.core.viewProviders">
-      <viewProvider class="org.eclipse.epf.diagram.add.providers.DiagramViewProvider">
-         <Priority name="Lowest"/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Diagram" semanticHints="ADD"/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Node" semanticHints=""/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Edge" semanticHints=""/>
-      </viewProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.ui.editpartProviders">
-      <editpartProvider class="org.eclipse.epf.diagram.add.providers.DiagramEditPartProvider">
-         <Priority name="Lowest"/>
-      </editpartProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.ui.paletteProviders">
-      <paletteProvider class="org.eclipse.epf.diagram.add.providers.DiagramPaletteProvider">
-         <Priority name="Lowest"/>
-         <editor id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"/>
-      </paletteProvider>
-      <paletteProvider
-			class="org.eclipse.gmf.runtime.diagram.ui.providers.DefaultPaletteProvider">
-        <Priority name="Medium"/>
-        <editor id="org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"/>
-        <contribution>
-            <predefinedEntry    
-            	id="geoshapeDrawer"   path="/">
-            	<expand force="true"/>
-             </predefinedEntry> 
-        </contribution>
-      </paletteProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.ui.modelingAssistantProviders">
-      <modelingAssistantProvider class="org.eclipse.epf.diagram.add.providers.DiagramModelingAssistantProvider">
-         <Priority name="Lowest"/>
-      </modelingAssistantProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.properties.propertiesProviders">
-      <PropertiesProvider
-            verifyPluginLoaded="false"
-            class="org.eclipse.epf.diagram.add.providers.DiagramPropertyProvider">
-         <Priority name="Lowest"/>
-      </PropertiesProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.iconProviders">
-      <IconProvider class="org.eclipse.epf.diagram.add.providers.DiagramIconProvider">
-         <Priority name="Low"/>
-      </IconProvider>
-      <IconProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.providers.GeoShapeIconProvider">
-         <Priority
-               name="Medium">
-         </Priority>
-         <object class="org.eclipse.gmf.runtime.notation.View(org.eclipse.gmf.runtime.notation)" id="GeoShape">
-        	 <method name="getType()" value="oval,triangle,rectangle,shadowRectangle,rectangle3D,roundRectangle,hexagon,octagon,pentagon,diamond,cylinder,line"/>
-	     </object>
-         <context elements="GeoShape">
-         </context>
-      </IconProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.parserProviders">
-      <ParserProvider class="org.eclipse.epf.diagram.add.providers.DiagramParserProvider">
-         <Priority name="Lowest"/>
-      </ParserProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypes">
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.add.ActivityDetailDiagram_79"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="ActivityDetailDiagram"
-               edithelper="org.eclipse.epf.diagram.add.edit.helpers.ActivityDetailDiagramEditHelper">
-            <param name="semanticHint" value="79"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.add.RoleNode_2001"
-               name="RoleNode"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="RoleNode"
-               edithelper="org.eclipse.epf.diagram.add.edit.helpers.RoleNodeEditHelper">
-            <param name="semanticHint" value="2001"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.add.TaskNode_2002"
-               name="TaskNode"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="TaskNode"
-               edithelper="org.eclipse.epf.diagram.add.edit.helpers.TaskNodeEditHelper">
-            <param name="semanticHint" value="2002"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.add.WorkProductDescriptorNode_2003"
-               name="WorkProductDescriptorNode"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="WorkProductDescriptorNode"
-               edithelper="org.eclipse.epf.diagram.add.edit.helpers.WorkProductDescriptorNodeEditHelper">
-            <param name="semanticHint" value="2003"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.add.RoleTaskComposite_1001"
-               name="RoleTaskComposite"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="RoleTaskComposite"
-               edithelper="org.eclipse.epf.diagram.add.edit.helpers.RoleTaskCompositeEditHelper">
-            <param name="semanticHint" value="1001"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.add.WorkProductComposite_1002"
-               name="WorkProductComposite"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="WorkProductComposite"
-               edithelper="org.eclipse.epf.diagram.add.edit.helpers.WorkProductCompositeEditHelper">
-            <param name="semanticHint" value="1002"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.add.Link_3001"
-               name="%element_type_control_flow"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="Link"
-               edithelper="org.eclipse.epf.diagram.add.edit.helpers.LinkEditHelper">
-            <param name="semanticHint" value="3001"/>
-         </metamodelType>
-      </metamodel>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypeBindings">
-      <clientContext id="ADDClientContext">
-         <enablement>
-            <test
-               property="org.eclipse.gmf.runtime.emf.core.editingDomain"
-               value="org.eclipse.epf.diagram.EditingDomain"/>
-         </enablement>
-      </clientContext> 
-      <binding context="ADDClientContext">
-         <elementType ref="org.eclipse.epf.diagram.add.ActivityDetailDiagram_79"/>
-         <elementType ref="org.eclipse.epf.diagram.add.RoleNode_2001"/>
-         <elementType ref="org.eclipse.epf.diagram.add.TaskNode_2002"/>
-         <elementType ref="org.eclipse.epf.diagram.add.WorkProductDescriptorNode_2003"/>
-         <elementType ref="org.eclipse.epf.diagram.add.RoleTaskComposite_1001"/>
-         <elementType ref="org.eclipse.epf.diagram.add.WorkProductComposite_1002"/>
-         <elementType ref="org.eclipse.epf.diagram.add.Link_3001"/>
-         <advice ref="org.eclipse.gmf.runtime.diagram.core.advice.notationDepdendents"/>
-         <elementType pattern=".*"/>
-      </binding>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/ADDImages.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/ADDImages.java
deleted file mode 100644
index a4385ea..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/ADDImages.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class ADDImages {
-	public static final String ELCL16 = "full/elcl16/"; //$NON-NLS-1$
-	public static final String DLCL16 = "full/dlcl16/"; //$NON-NLS-1$
-	public static final String ETOOL16 = "full/etool16/"; //$NON-NLS-1$
-	public static final String DTOOL16 = "full/dtool16/"; //$NON-NLS-1$
-	
-	
-	public static final String IMG_PATH_RESET_DIAGRAM_LAYOUT = ELCL16 + "reset_diagram.gif"; //$NON-NLS-1$	
-	public static final String IMG_PATH_EDITOR = ETOOL16 + "ADDEditor.gif"; //$NON-NLS-1$	
-
-	public static final String DISABLED_IMG_PATH_RESET_DIAGRAM_LAYOUT = DLCL16 + "reset_diagram.gif"; //$NON-NLS-1$
-	public static final String DISABLED_IMG_PATH_EDITOR = DTOOL16 + "ADDEditor.gif"; //$NON-NLS-1$	
-	
-	public static final ImageDescriptor DISABLED_IMG_DESC_RESET_DIAGRAM_LAYOUT = ActivityDetailDiagramEditorPlugin
-			.getDefault().getImageDescriptor(
-					DISABLED_IMG_PATH_RESET_DIAGRAM_LAYOUT);
-	public static final ImageDescriptor DISABLED_IMG_DESC_EDITOR = ActivityDetailDiagramEditorPlugin
-			.getDefault().getImageDescriptor(DISABLED_IMG_PATH_EDITOR);		
-	
-	public static final ImageDescriptor IMG_DESC_RESET_DIAGRAM_LAYOUT = ActivityDetailDiagramEditorPlugin
-			.getDefault().getImageDescriptor(IMG_PATH_RESET_DIAGRAM_LAYOUT);
-	public static final ImageDescriptor IMG_DESC_EDITOR = ActivityDetailDiagramEditorPlugin
-			.getDefault().getImageDescriptor(IMG_PATH_EDITOR);		
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/ActivityDetailDiagramPlugin.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/ActivityDetailDiagramPlugin.java
deleted file mode 100644
index 4b5c7ad..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/ActivityDetailDiagramPlugin.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class ActivityDetailDiagramPlugin extends AbstractPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.diagram.add";	//$NON-NLS-1$
-
-	// The shared instance
-	private static ActivityDetailDiagramPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public ActivityDetailDiagramPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static ActivityDetailDiagramPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/DiagramReorientConnectionViewCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/DiagramReorientConnectionViewCommand.java
deleted file mode 100644
index 565dd93..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/DiagramReorientConnectionViewCommand.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class DiagramReorientConnectionViewCommand extends
-		AbstractTransactionalCommand {
-
-	/**
-	 * @generated
-	 */
-	private IAdaptable edgeAdaptor;
-
-	/**
-	 * @generated
-	 */
-	public DiagramReorientConnectionViewCommand(
-			TransactionalEditingDomain editingDomain, String label) {
-		super(editingDomain, label, null);
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getAffectedFiles() {
-		View view = (View) edgeAdaptor.getAdapter(View.class);
-		if (view != null) {
-			return getWorkspaceFiles(view);
-		}
-		return super.getAffectedFiles();
-	}
-
-	/**
-	 * @generated
-	 */
-	public IAdaptable getEdgeAdaptor() {
-		return edgeAdaptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setEdgeAdaptor(IAdaptable edgeAdaptor) {
-		this.edgeAdaptor = edgeAdaptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult doExecuteWithResult(
-			IProgressMonitor progressMonitor, IAdaptable info) {
-		assert null != edgeAdaptor : "Null child in DiagramReorientConnectionViewCommand"; //$NON-NLS-1$
-		Edge edge = (Edge) getEdgeAdaptor().getAdapter(Edge.class);
-		assert null != edge : "Null edge in DiagramReorientConnectionViewCommand"; //$NON-NLS-1$
-
-		View tempView = edge.getSource();
-		edge.setSource(edge.getTarget());
-		edge.setTarget(tempView);
-
-		return CommandResult.newOKCommandResult();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/LinkCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/LinkCreateCommand.java
deleted file mode 100644
index 50c0926..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/LinkCreateCommand.java
+++ /dev/null
@@ -1,104 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-
-/**
- * @generated
- */
-public class LinkCreateCommand extends CreateRelationshipCommand {
-
-	/**
-	 * @generated
-	 */
-	private Node myContainer;
-
-	/**
-	 * @generated
-	 */
-	private Node mySource;
-
-	/**
-	 * @generated
-	 */
-	private Node myTarget;
-
-	/**
-	 * @generated
-	 */
-	public LinkCreateCommand(CreateRelationshipRequest req, Node container,
-			Node source, Node target) {
-		super(req);
-		super.setElementToEdit(container);
-		myContainer = container;
-		mySource = source;
-		myTarget = target;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Node getContainer() {
-		return myContainer;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getSource() {
-		return mySource;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getTarget() {
-		return myTarget;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNode();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setElementToEdit(EObject element) {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject doDefaultElementCreation() {
-		Link newElement = (Link) super.doDefaultElementCreation();
-		if (newElement != null) {
-			newElement.setTarget(myTarget);
-			newElement.setSource(mySource);
-		}
-		return newElement;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/LinkReorientCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/LinkReorientCommand.java
deleted file mode 100644
index 04aa310..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/LinkReorientCommand.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.policies.DiagramBaseItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-
-/**
- * @generated
- */
-public class LinkReorientCommand extends EditElementCommand {
-
-	/**
-	 * @generated
-	 */
-	private final int reorientDirection;
-
-	/**
-	 * @generated
-	 */
-	private final EObject oldEnd;
-
-	/**
-	 * @generated
-	 */
-	private final EObject newEnd;
-
-	/**
-	 * @generated
-	 */
-	public LinkReorientCommand(ReorientRelationshipRequest request) {
-		super(request.getLabel(), request.getRelationship(), request);
-		reorientDirection = request.getDirection();
-		oldEnd = request.getOldRelationshipEnd();
-		newEnd = request.getNewRelationshipEnd();
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean canExecute() {
-		if (!(getElementToEdit() instanceof Link)) {
-			return false;
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
-			return canReorientSource();
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
-			return canReorientTarget();
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean canReorientSource() {
-		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
-			return false;
-		}
-		Node target = getLink().getTarget();
-		if (!(getLink().eContainer() instanceof Node)) {
-			return false;
-		}
-		Node container = (Node) getLink().eContainer();
-		return DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canExistLink_3001(container, getNewSource(), target);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean canReorientTarget() {
-		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
-			return false;
-		}
-		Node source = getLink().getSource();
-		if (!(getLink().eContainer() instanceof Node)) {
-			return false;
-		}
-		Node container = (Node) getLink().eContainer();
-		return DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canExistLink_3001(container, source, getNewTarget());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,
-			IAdaptable info) throws ExecutionException {
-		if (!canExecute()) {
-			throw new ExecutionException(
-					"Invalid arguments in reorient link command"); //$NON-NLS-1$
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
-			return reorientSource();
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
-			return reorientTarget();
-		}
-		throw new IllegalStateException();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult reorientSource() throws ExecutionException {
-		getLink().setSource(getNewSource());
-		return CommandResult.newOKCommandResult(getLink());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult reorientTarget() throws ExecutionException {
-		getLink().setTarget(getNewTarget());
-		return CommandResult.newOKCommandResult(getLink());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Link getLink() {
-		return (Link) getElementToEdit();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getOldSource() {
-		return (Node) oldEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getNewSource() {
-		return (Node) newEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getOldTarget() {
-		return (Node) oldEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getNewTarget() {
-		return (Node) newEnd;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/RoleNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/RoleNodeCreateCommand.java
deleted file mode 100644
index 2372e6b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/RoleNodeCreateCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class RoleNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public RoleNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNodeContainer();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/RoleTaskCompositeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/RoleTaskCompositeCreateCommand.java
deleted file mode 100644
index 56909a7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/RoleTaskCompositeCreateCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public RoleTaskCompositeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNodeContainer();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/TaskNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/TaskNodeCreateCommand.java
deleted file mode 100644
index 912c950..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/TaskNodeCreateCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class TaskNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public TaskNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNodeContainer();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/WorkProductCompositeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/WorkProductCompositeCreateCommand.java
deleted file mode 100644
index 1367e6b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/WorkProductCompositeCreateCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductCompositeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public WorkProductCompositeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNodeContainer();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/WorkProductDescriptorNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/WorkProductDescriptorNodeCreateCommand.java
deleted file mode 100644
index ca535d1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/commands/WorkProductDescriptorNodeCreateCommand.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeCreateCommand extends
-		CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public WorkProductDescriptorNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNodeContainer();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/ActivityDetailDiagramEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/ActivityDetailDiagramEditHelper.java
deleted file mode 100644
index d0e1fbb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/ActivityDetailDiagramEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-/**
- * @generated
- */
-public class ActivityDetailDiagramEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/DiagramBaseEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/DiagramBaseEditHelper.java
deleted file mode 100644
index 0b91dbf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/DiagramBaseEditHelper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelper;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-
-/**
- * @generated
- */
-public class DiagramBaseEditHelper extends AbstractEditHelper {
-
-	/**
-	 * @generated
-	 */
-	public static final String EDIT_POLICY_COMMAND = "edit policy command"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getInsteadCommand(IEditCommandRequest req) {
-		ICommand epCommand = (ICommand) req.getParameter(EDIT_POLICY_COMMAND);
-		req.setParameter(EDIT_POLICY_COMMAND, null);
-		ICommand ehCommand = super.getInsteadCommand(req);
-		if (epCommand == null) {
-			return ehCommand;
-		}
-		if (ehCommand == null) {
-			return epCommand;
-		}
-		CompositeCommand command = new CompositeCommand(null);
-		command.add(epCommand);
-		command.add(ehCommand);
-		return command;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getCreateCommand(CreateElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getCreateRelationshipCommand(
-			CreateRelationshipRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getDestroyElementCommand(DestroyElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getDestroyReferenceCommand(DestroyReferenceRequest req) {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/LinkEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/LinkEditHelper.java
deleted file mode 100644
index b0177c2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/LinkEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-/**
- * @generated
- */
-public class LinkEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/RoleNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/RoleNodeEditHelper.java
deleted file mode 100644
index 37ee62f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/RoleNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-/**
- * @generated
- */
-public class RoleNodeEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/RoleTaskCompositeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/RoleTaskCompositeEditHelper.java
deleted file mode 100644
index 16623ea..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/RoleTaskCompositeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/TaskNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/TaskNodeEditHelper.java
deleted file mode 100644
index c77b440..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/TaskNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-/**
- * @generated
- */
-public class TaskNodeEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/WorkProductCompositeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/WorkProductCompositeEditHelper.java
deleted file mode 100644
index e9d3550..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/WorkProductCompositeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-/**
- * @generated
- */
-public class WorkProductCompositeEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/WorkProductDescriptorNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/WorkProductDescriptorNodeEditHelper.java
deleted file mode 100644
index b446738..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/helpers/WorkProductDescriptorNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.helpers;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/ActivityDetailDiagramEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/ActivityDetailDiagramEditPart.java
deleted file mode 100644
index 4b1b967..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/ActivityDetailDiagramEditPart.java
+++ /dev/null
@@ -1,560 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.add.edit.policies.ActivityDetailDiagramCanonicalEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.ActivityDetailDiagramItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.IDiagramEditorInputProvider;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.NodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.util.MeasurementUnitHelper;
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-import org.eclipse.gmf.runtime.notation.Location;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @modified
- */
-public class ActivityDetailDiagramEditPart extends DiagramEditPart {
-
-	Point cachedPoint = new Point(-1, -1);
-
-	protected boolean debug = false;
-
-	static int cachedWidth = 10;
-
-	static int cachedHeight = 10;
-
-	int y = 60;
-
-	boolean xaxisbegin = false;
-
-	boolean loading = true;
-
-	final static int spacing = 40;
-
-	final static int yspacing = 20;
-
-	boolean miscellaneous = false;
-
-	int x = 10;
-
-	public static final String OUTPUTS = "outputs"; //$NON-NLS-1$
-
-	public static final String INPUTS = "inputs"; //$NON-NLS-1$
-
-	private List<EditPart> recentlyAddedParts = new ArrayList<EditPart>();
-
-	private IMapMode mapMode;
-	/**
-	 * @generated
-	 */
-	public static final String MODEL_ID = "ADD"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 79;
-
-	/**
-	 * @generated
-	 */
-	public ActivityDetailDiagramEditPart(View view) {
-		super(view);
-		
-		mapMode = MeasurementUnitHelper.getMapMode(view.getDiagram().getMeasurementUnit());
-	}
-	
-	private View getView() {
-		return (View) getModel();
-	}
-	
-	private void doLayout() {
-		EditPartViewer viewer = getViewer();
-		if(viewer instanceof IDiagramEditorInputProvider) {
-			IEditorPart editor = ((IDiagramEditorInputProvider)viewer).getEditor();
-			if(editor instanceof AbstractDiagramEditor) {
-				((AbstractDiagramEditor)editor).resetLayout();
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		Figure f = new FreeformLayer() {
-			protected void layout() {
-				if (hasMisplacedChildren()) {
-					resetChildrenLocations();
-				}
-				else {
-					super.layout();
-				}
-			}
-		};
-
-		f.setBorder(new MarginBorder(20));
-		f.setLayoutManager(new FreeformLayout());
-
-		return f;
-	}
-
-	/**
-	 * Checks whether there are any misplaced children
-	 * @return
-	 */
-	protected boolean hasMisplacedChildren() {
-		List locationList = new ArrayList();
-
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child instanceof EditPart) {
-				Object model = ((EditPart) child).getModel();
-				if (model instanceof Node) {
-					Node node = (Node) model;
-					Location p = (Location) node.getLayoutConstraint();
-					locationList.add(p);
-					if (debug) {
-						System.out.println("Node-" + node); //$NON-NLS-1$
-						System.out.println("loc-" + p); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		if (locationList.size() == 1)
-			return false;
-		if (locationList.size() > 0) {
-			boolean needToReset = true;
-
-			for (int i = 1; i < locationList.size(); i++) {
-				Location currentLoc = (Location) locationList.get(i);
-				Location previousLoc = (Location) locationList.get(i - 1);
-				if (!((currentLoc.getX() == previousLoc.getX() + 10) && (currentLoc
-						.getY() == previousLoc.getY() + 10))) {
-					needToReset = false;
-					break;
-				}
-			}
-			return needToReset;
-		}
-		return false;
-	}
-
-	/**
-	 * Reset all children locations
-	 * In this, All the Task's MandatoryInput workproducts placed on top and RoleTask 
-	 * composite in the middle. and Task's output workproducts bottom.
-	 * 
-	 * TODO - Have to revisit this method and do some cleanup
-	 * 
-	 */
-	protected void resetChildrenLocations() {
-
-		final int yspacing = 40;
-		List rolecompositeList = new ArrayList();
-		List inputworkproductCompositeList = new ArrayList();
-		List outputWorkProductCompositeList = new ArrayList();
-		List miscList = new ArrayList();
-		List taskList = new ArrayList();
-		this.recentlyAddedParts = new ArrayList();
-
-		//		HashMap map = new HashMap();
-
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			Node n = (Node) ((EditPart) child).getModel();
-			//			if (n.getLocation() == null || n.getLocation().x == -1) {
-			this.recentlyAddedParts.add((EditPart) child);
-			//			}
-			if (child instanceof RoleTaskCompositeEditPart) {
-				rolecompositeList.add(child);
-
-				List list = ((RoleTaskCompositeEditPart) child).getChildren();
-				for (Iterator it = list.iterator(); it.hasNext();) {
-					Object obj = it.next();
-					if (obj instanceof TaskNodeEditPart) {
-						View viewObj = (View) ((NodeEditPart) obj).getModel();
-						Object o = viewObj.getElement();
-						if (o instanceof TaskNode) {
-							taskList.add(o);
-						}
-					}
-
-				}
-			} else if (child instanceof WorkProductCompositeEditPart) {
-				WorkProductCompositeEditPart part = (WorkProductCompositeEditPart) child;
-				View viewObj = (View) ((NodeEditPart) part).getModel();
-				Object o = viewObj.getElement();
-
-				if (o instanceof WorkProductComposite) {
-					WorkProductComposite node = (WorkProductComposite) o;
-					if (node.getType() == WorkProductComposite.INPUTS) {
-						inputworkproductCompositeList.add(child);
-					} else if (node.getType() == WorkProductComposite.OUTPUTS) {
-						outputWorkProductCompositeList.add(child);
-					}
-					//					calcSize(child);
-				}
-			} else {
-				miscList.add(child);
-			}
-		}
-
-		// Set size for the rolecomposite.
-		if (!rolecompositeList.isEmpty()) {
-			for (Iterator itor = rolecompositeList.iterator(); itor.hasNext();) {
-				Object object = itor.next();
-				List list = ((RoleTaskCompositeEditPart) object).getChildren();
-				for (Iterator itor1 = list.iterator(); itor1.hasNext();) {
-					Object obj = itor1.next();
-					if (obj instanceof NodeEditPart) {
-						View viewObj = (View) ((NodeEditPart) obj).getModel();
-						Object objNode = viewObj.getElement();
-						if (objNode instanceof TaskNode) {
-							TaskNode taskNode = (TaskNode) objNode;
-
-							TaskDescriptor task = (TaskDescriptor) taskNode
-									.getObject();
-							for (Iterator wpitor = inputworkproductCompositeList
-									.iterator(); wpitor.hasNext();) {
-								WorkProductCompositeEditPart wpEditPart = (WorkProductCompositeEditPart) wpitor
-										.next();
-								WorkProductComposite wpCompositeNode = (WorkProductComposite) ((View) wpEditPart
-										.getModel()).getElement();
-								Object wpObject = wpCompositeNode.getObject();
-								if (wpObject != null && wpObject.equals(task)) {
-									int width = wpEditPart.getFigure()
-											.getPreferredSize().width;
-									int height = ((NodeEditPart) obj)
-											.getFigure().getPreferredSize().height;
-									((NodeEditPart) obj)
-											.getFigure()
-											.setPreferredSize(
-													new Dimension(width, height));
-									if (((WorkProductComposite) ((View) wpEditPart
-											.getModel()).getElement())
-											.getType() == WorkProductComposite.INPUTS) {
-										//										List inputList = (List) ((HashMap) map
-										//												.get(taskNode)).get(INPUTS);
-										//										inputList.add(wpEditPart);
-									} else if (((WorkProductComposite) ((View) wpEditPart
-											.getModel()).getElement())
-											.getType() == WorkProductComposite.OUTPUTS) {
-										//										List outputList = (List) ((HashMap) map
-										//												.get(taskNode)).get(OUTPUTS);
-										//										outputList.add(wpEditPart);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (!rolecompositeList.isEmpty()) {
-			for (int i = 0; i < rolecompositeList.size(); i++) {
-				List confirmedSeqInputList = new ArrayList();
-				List confirmedSeqOutputList = new ArrayList();
-				List list = ((RoleTaskCompositeEditPart) rolecompositeList
-						.get(i)).getChildren();
-				for (int j = 0; j < list.size(); j++) {
-					Object o = list.get(j);
-					if (o instanceof NodeEditPart) {
-						NodeEditPart task = (NodeEditPart) list.get(j);
-						if (((View) task.getModel()).getElement() instanceof TaskNode) {
-							TaskNode tasknode = (TaskNode) ((View) task
-									.getModel()).getElement();
-							for (int k = 0; k < inputworkproductCompositeList
-									.size(); k++) {
-								WorkProductComposite wpcomp = (WorkProductComposite) ((View) ((WorkProductCompositeEditPart) inputworkproductCompositeList
-										.get(k)).getModel()).getElement();
-
-								if (wpcomp != null && wpcomp.getObject().equals(
-										tasknode.getObject())) {
-									if (wpcomp.getType() == WorkProductComposite.INPUTS) {
-										confirmedSeqInputList
-												.add(inputworkproductCompositeList
-														.get(k));
-									}
-								}
-							}
-							for (int k = 0; k < outputWorkProductCompositeList
-									.size(); k++) {
-								WorkProductComposite wpcomp = (WorkProductComposite) ((View) ((WorkProductCompositeEditPart) outputWorkProductCompositeList
-										.get(k)).getModel()).getElement();
-
-								if (wpcomp.getObject().equals(
-										tasknode.getObject())) {
-									if (wpcomp.getType() == WorkProductComposite.OUTPUTS) {
-										confirmedSeqOutputList
-												.add(outputWorkProductCompositeList
-														.get(k));
-									}
-								}
-							}
-						}
-					}
-				}
-				if (!confirmedSeqInputList.isEmpty()) {
-					setObjectsLocations(confirmedSeqInputList);
-					y = cachedPoint.y + cachedHeight + yspacing;
-				}
-				List roleC = new ArrayList();
-				roleC.add(rolecompositeList.get(i));
-				setObjectsLocations(roleC);
-
-				y = cachedPoint.y + cachedHeight + yspacing;
-				if (!confirmedSeqOutputList.isEmpty()) {
-					setObjectsLocations(confirmedSeqOutputList);
-					y = cachedPoint.y + cachedHeight + yspacing;
-				}
-			}
-
-		}
-
-		//		if (!miscList.isEmpty()) {
-		//			if (debug) {
-		//				System.out.println("Print Size of misc: " + miscList.size()); //$NON-NLS-1$
-		//			}
-		//			if (!loading) {
-		//				miscellaneous = true;
-		//			}
-		//			setObjectsLocations(miscList);
-		//			miscellaneous = false;
-		//		}
-
-		final View view = getView();
-		try {
-			TxUtil.runInTransaction(view.getDiagram(), new Runnable() {
-
-				public void run() {
-					view.persist();
-					view.persistChildren();
-				}
-				
-			});
-		} catch (Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-		}
-		loading = false;
-
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new ActivityDetailDiagramItemSemanticEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new ActivityDetailDiagramCanonicalEditPolicy());
-	}
-
-	/**
-	 * It sets object location on cavas
-	 * @param list
-	 * 
-	 */
-	private void setObjectsLocations(List list) {
-		xaxisbegin = true;
-		x = 50;
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child instanceof GraphicalEditPart) {
-				final GraphicalEditPart part = (GraphicalEditPart) child;
-				final Node node = (Node) part.getModel();
-
-				if (node instanceof Node) {
-					final Location location = (Location) node.getLayoutConstraint();
-
-					if (debug) {
-						System.out.println("Node - " + part); //$NON-NLS-1$
-						System.out.println("Location - " + location); //$NON-NLS-1$
-					}
-
-					if (!xaxisbegin) {
-						x = cachedPoint.x + cachedWidth + spacing;
-					}
-
-					if (!loading && miscellaneous) {
-						location.setX(mapMode.DPtoLP(x));
-						location.setY(mapMode.DPtoLP(10));
-
-					} else {
-						try {
-							TxUtil.runInTransaction(getView().getDiagram(), new Runnable() {
-
-								public void run() {
-									location.setX(mapMode.DPtoLP(x));
-									location.setY(mapMode.DPtoLP(y));
-
-									if (part instanceof RoleTaskCompositeEditPart) {
-										((RoleTaskCompositeEditPart) part)
-												.updatebounds();
-									}
-									if (part instanceof WorkProductCompositeEditPart) {
-										((WorkProductCompositeEditPart) part)
-												.updatebounds();
-									}
-
-								}
-								
-							});
-						} catch (Exception e) {
-							CommonPlugin.getDefault().getLogger().logError(e);
-						}
-
-						if (debug)
-							System.out.println("NewLocation - " + location); //$NON-NLS-1$
-
-						if (!miscellaneous)
-							cachedPoint = new Point(location.getX(), location
-									.getY());
-						cachedWidth = part.getFigure().getPreferredSize().width;
-						if (part.getFigure().getPreferredSize().height > cachedHeight)
-							cachedHeight = part.getFigure().getPreferredSize().height;
-						xaxisbegin = false;
-						if (debug) {
-							//							System.out
-							//									.println("Point : " + new Point(x, y).toString() + "And width=" //$NON-NLS-1$ //$NON-NLS-2$
-							//											+ cachedWidth
-							//											+ ", Height=" + cachedHeight + ", Width of Viewer: " + viewerWidth); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Calculates and sets size of the given node
-	 * @param child
-	 * 
-	 * TODO - Not used currently, we need to see whether we need this method
-	 */
-	private void calcSize(Object child) {
-		List list = ((GraphicalEditPart) child).getChildren();
-		int largestWidth = 0;
-		int largestHeight = 0;
-		for (Iterator it = list.iterator(); it.hasNext();) {
-			Object obj = it.next();
-
-			if (obj instanceof NodeEditPart) {
-				View viewObj = (View) ((NodeEditPart) obj).getModel();
-				Object objNode = viewObj.getElement();
-				if (objNode instanceof WorkProductDescriptorNode) {
-					int nodeWidth = ((NodeEditPart) obj).getFigure()
-							.getPreferredSize().width;
-					int nodeHeight = ((NodeEditPart) obj).getFigure()
-							.getPreferredSize().height;
-					if (nodeWidth > largestWidth)
-						largestWidth = nodeWidth;
-					if (nodeHeight > largestHeight)
-						largestHeight = nodeHeight;
-				}
-			}
-
-		}
-		((WorkProductCompositeEditPart) child).getFigure().setPreferredSize(
-				new Dimension(largestWidth * 2 + 10, 20 + largestHeight
-						* (list.size() / 2 + 1)));
-	}
-
-	/**
-	 * Returns recently addded editparts. Usually called 
-	 * by diagram services to do autolayout adjustment.
-	 */
-	public List<EditPart> getRecentlyAddedParts() {
-		return recentlyAddedParts;
-	}
-
-	/**
-	 * Clear the recently added editparts from the list.
-	 */
-	public void clearRecentlyAddedParts() {
-		recentlyAddedParts.clear();
-	}
-
-	@Override
-	protected void handleNotificationEvent(Notification event) {
-		if (NotationPackage.Literals.VIEW__VISIBLE.equals(event.getFeature())) {
-			Object notifier = event.getNotifier();
-			if (notifier == getModel())
-				refreshVisibility();
-			else if (event.getNotifier() instanceof Node) {
-				refreshChildren();
-				DiagramEditorUtil.refreshConnectionEditParts(this);
-			}
-		} else
-			super.handleNotificationEvent(event);
-	}
-	
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/DiagramEditPartFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/DiagramEditPartFactory.java
deleted file mode 100644
index 48f5679..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/DiagramEditPartFactory.java
+++ /dev/null
@@ -1,194 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-/**
- * @generated
- */
-public class DiagramEditPartFactory implements EditPartFactory {
-
-	/**
-	 * @generated
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-		if (model instanceof View) {
-			View view = (View) model;
-			switch (DiagramVisualIDRegistry.getVisualID(view)) {
-
-			case ActivityDetailDiagramEditPart.VISUAL_ID:
-				return new ActivityDetailDiagramEditPart(view);
-
-			case RoleTaskCompositeEditPart.VISUAL_ID:
-				return new RoleTaskCompositeEditPart(view);
-
-			case WorkProductCompositeEditPart.VISUAL_ID:
-				return new WorkProductCompositeEditPart(view);
-
-			case RoleNodeEditPart.VISUAL_ID:
-				return new RoleNodeEditPart(view);
-
-			case RoleNodeNameEditPart.VISUAL_ID:
-				return new RoleNodeNameEditPart(view);
-
-			case TaskNodeEditPart.VISUAL_ID:
-				return new TaskNodeEditPart(view);
-
-			case TaskNodeNameEditPart.VISUAL_ID:
-				return new TaskNodeNameEditPart(view);
-
-			case WorkProductDescriptorNodeEditPart.VISUAL_ID:
-				return new WorkProductDescriptorNodeEditPart(view);
-
-			case WorkProductDescriptorNodeNameEditPart.VISUAL_ID:
-				return new WorkProductDescriptorNodeNameEditPart(view);
-
-			case RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID:
-				return new RoleTaskCompositeRoleTaskCompartmentEditPart(view);
-
-			case WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID:
-				return new WorkProductCompositeWorkProductCompartmentEditPart(
-						view);
-
-			case LinkEditPart.VISUAL_ID:
-				return new LinkEditPart(view);
-
-			case LinkNameEditPart.VISUAL_ID:
-				return new LinkNameEditPart(view);
-			}
-		}
-		return createUnrecognizedEditPart(context, model);
-	}
-
-	/**
-	 * @generated
-	 */
-	private EditPart createUnrecognizedEditPart(EditPart context, Object model) {
-		// Handle creation of unrecognized child node EditParts here
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static CellEditorLocator getTextCellEditorLocator(
-			ITextAwareEditPart source) {
-		if (source.getFigure() instanceof WrapLabel)
-			return new TextCellEditorLocator((WrapLabel) source.getFigure());
-		else {
-			return new LabelCellEditorLocator((Label) source.getFigure());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	static private class TextCellEditorLocator implements CellEditorLocator {
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel wrapLabel;
-
-		/**
-		 * @generated
-		 */
-		public TextCellEditorLocator(WrapLabel wrapLabel) {
-			this.wrapLabel = wrapLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getWrapLabel() {
-			return wrapLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void relocate(CellEditor celleditor) {
-			Text text = (Text) celleditor.getControl();
-			Rectangle rect = getWrapLabel().getTextBounds().getCopy();
-			getWrapLabel().translateToAbsolute(rect);
-			if (getWrapLabel().isTextWrapped()
-					&& getWrapLabel().getText().length() > 0) {
-				rect.setSize(new Dimension(text.computeSize(rect.width,
-						SWT.DEFAULT)));
-			} else {
-				int avr = FigureUtilities.getFontMetrics(text.getFont())
-						.getAverageCharWidth();
-				rect.setSize(new Dimension(text.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT)).expand(avr * 2, 0));
-			}
-			if (!rect.equals(new Rectangle(text.getBounds()))) {
-				text.setBounds(rect.x, rect.y, rect.width, rect.height);
-			}
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class LabelCellEditorLocator implements CellEditorLocator {
-
-		/**
-		 * @generated
-		 */
-		private Label label;
-
-		/**
-		 * @generated
-		 */
-		public LabelCellEditorLocator(Label label) {
-			this.label = label;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Label getLabel() {
-			return label;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void relocate(CellEditor celleditor) {
-			Text text = (Text) celleditor.getControl();
-			Rectangle rect = getLabel().getTextBounds().getCopy();
-			getLabel().translateToAbsolute(rect);
-			int avr = FigureUtilities.getFontMetrics(text.getFont())
-					.getAverageCharWidth();
-			rect.setSize(new Dimension(text.computeSize(SWT.DEFAULT,
-					SWT.DEFAULT)).expand(avr * 2, 0));
-			if (!rect.equals(new Rectangle(text.getBounds()))) {
-				text.setBounds(rect.x, rect.y, rect.width, rect.height);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/DiagramExtNodeLabelEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/DiagramExtNodeLabelEditPart.java
deleted file mode 100644
index 06723a4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/DiagramExtNodeLabelEditPart.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.figures.LabelLocator;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class DiagramExtNodeLabelEditPart extends LabelEditPart {
-
-	/**
-	 * @generated
-	 */
-	public DiagramExtNodeLabelEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshBounds() {
-		IFigure refFigure = ((GraphicalEditPart) getParent()).getFigure();
-		int dx = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int dy = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		Point offset = new Point(dx, dy);
-		getFigure().getParent().setConstraint(getFigure(),
-				new LabelLocator(refFigure, offset, getKeyPoint()) {
-
-					public void relocate(IFigure target) {
-						Point location = getReferencePoint().getTranslated(
-								getOffset());
-						location.translate(-target.getBounds().width / 2, 0);
-						target.setLocation(location);
-						target.setSize(new Dimension(
-								target.getPreferredSize().width, target
-										.getPreferredSize().height));
-					}
-
-					protected Point getReferencePoint() {
-						return getLabelLocation(parent);
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	public Point getReferencePoint() {
-		return getLabelLocation(((GraphicalEditPart) getParent()).getFigure());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Point getLabelLocation(IFigure parent) {
-		return parent.getBounds().getBottom();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/LinkEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/LinkEditPart.java
deleted file mode 100644
index e0ba2b7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/LinkEditPart.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.draw2d.Connection;
-
-import org.eclipse.draw2d.PolylineDecoration;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.epf.diagram.add.edit.policies.LinkItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.DiagramCoreValidation;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class LinkEditPart extends ConnectionNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 3001;
-
-	/**
-	 * @generated
-	 */
-	public LinkEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new LinkItemSemanticEditPolicy());
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected Connection createConnectionFigure() {
-
-		return new LinkFigure();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class LinkFigure extends PolylineConnectionEx {
-
-		/**
-		 * @generated
-		 */
-		public LinkFigure() {
-			this.setForegroundColor(ColorConstants.black
-
-			);
-			setTargetDecoration(createTargetDecoration());
-		}
-
-		/**
-		 * @generated
-		 */
-		private PolylineDecoration createTargetDecoration() {
-			PolylineDecoration df = new PolylineDecoration();
-			// dispatchNext?
-
-			PointList pl = new PointList();
-			pl.addPoint(-1, 1);
-			pl.addPoint(0, 0);
-			pl.addPoint(-1, -1);
-			df.setTemplate(pl);
-			df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));
-
-			return df;
-		}
-
-	}
-
-	@Override
-	protected void setForegroundColor(Color color) {
-		Color overrideColor = DiagramCoreUtil.getLinkOverrideColor((Edge) getModel());
-		super.setForegroundColor(overrideColor != null ? overrideColor : color);
-	}
-
-	@Override
-	public void deactivate() {
-		super.deactivate();
-	}
-
-	@Override
-	protected void setVisibility(boolean vis) {
-		super.setVisibility(vis);
-	}
-
-	@Override
-	public void activate() {
-		// TODO Auto-generated method stub
-		super.activate();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/LinkNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/LinkNameEditPart.java
deleted file mode 100644
index 1af0153..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/LinkNameEditPart.java
+++ /dev/null
@@ -1,586 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.ConnectionLocator;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.add.edit.policies.DiagramTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class LinkNameEditPart extends LabelEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4004;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	static {
-		registerSnapBackPosition(DiagramVisualIDRegistry
-				.getType(LinkNameEditPart.VISUAL_ID), new Point(0, 40));
-	}
-
-	/**
-	 * @generated
-	 */
-	public LinkNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	public int getKeyPoint() {
-		return ConnectionLocator.MIDDLE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(IFigure figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIcon() {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return DiagramElementTypes.Link_3001;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), DiagramEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		String fontName = DiagramConstants.getFontName(style);
-		if (style != null) {
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-		else
-			setFont(DiagramConstants.getDefaultFontData());
-	}
-	
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		IFigure label = createFigurePrim();
-		defaultText = getLabelTextHelper(label);
-		return label;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigurePrim() {
-		return new WrapLabel();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleNodeEditPart.java
deleted file mode 100644
index 67192f9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleNodeEditPart.java
+++ /dev/null
@@ -1,351 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.draw2d.GridLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.policies.RoleNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.RoleNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.RoleNodeItemSemanticEditPolicy;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-import org.eclipse.gef.requests.CreateRequest;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @generated
- */
-public class RoleNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 2001;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public RoleNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new RoleNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		RoleNodeFigure figure = new RoleNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public RoleNodeFigure getPrimaryShape() {
-		return (RoleNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof RoleNodeNameEditPart) {
-			((RoleNodeNameEditPart) childEditPart).setLabel(getPrimaryShape()
-					.getFigureRoleNodeNameFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(DiagramVisualIDRegistry
-				.getType(RoleNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class RoleNodeFigure extends RectangleFigure {
-
-		/**
-		 * @generated
-		 */
-		public RoleNodeFigure() {
-
-			this.setOutline(false);
-			this.setBackgroundColor(ROLENODEFIGURE_BACK
-
-			);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-			fig_0.setText(""); //$NON-NLS-1$
-			fig_0.setFont(ROLENODENAMEFIGURE_FONT);
-			DiagramCoreUtil.setLabelProperties(fig_0); // modified
-			setFigureRoleNodeNameFigure(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fRoleNodeNameFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureRoleNodeNameFigure() {
-			return fRoleNodeNameFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureRoleNodeNameFigure(WrapLabel fig) {
-			fRoleNodeNameFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-	
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color ROLENODEFIGURE_BACK = new Color(null, 255, 255,
-			156);
-
-	/**
-	 * @generated
-	 */
-	public static final Font ROLENODENAMEFIGURE_FONT = new Font(Display
-			.getCurrent(), "Arial", 8, SWT.NORMAL);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleNodeNameEditPart.java
deleted file mode 100644
index 6a7d218..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleNodeNameEditPart.java
+++ /dev/null
@@ -1,610 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.add.edit.policies.DiagramTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class RoleNodeNameEditPart extends CompartmentEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4001;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public RoleNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDetailDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/RoleDescriptor.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		return false;
-		//		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return DiagramElementTypes.RoleNode_2001;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), DiagramEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		String fontName = DiagramConstants.getFontName();
-		if (style != null) {
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-		else
-			setFont(DiagramConstants.getDefaultFontData());
-
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleTaskCompositeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleTaskCompositeEditPart.java
deleted file mode 100644
index 3dd28b3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleTaskCompositeEditPart.java
+++ /dev/null
@@ -1,325 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.policies.DiagramTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.RoleTaskCompositeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.RoleTaskCompositeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.RoleTaskCompositeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.core.figures.RaisedMarginBorder;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConstrainedToolbarLayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.requests.ArrangeRequest;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.Location;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1001;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public RoleTaskCompositeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		installEditPolicy(EditPolicyRoles.CREATION_ROLE,
-				new CreationEditPolicy());
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new RoleTaskCompositeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,
-				new DragDropEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new RoleTaskCompositeCanonicalEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-
-		ConstrainedToolbarLayoutEditPolicy lep = new ConstrainedToolbarLayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				if (child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE) == null) {
-					if (child instanceof ITextAwareEditPart) {
-						return new DiagramTextSelectionEditPolicy();
-					}
-				}
-				return super.createChildEditPolicy(child);
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		RoleTaskCompositeFigure figure = new RoleTaskCompositeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public RoleTaskCompositeFigure getPrimaryShape() {
-		return (RoleTaskCompositeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class RoleTaskCompositeFigure extends RectangleFigure {
-
-		/**
-		 * @@modified
-		 */
-		public RoleTaskCompositeFigure() {
-
-			org.eclipse.draw2d.ToolbarLayout myGenLayoutManager = new org.eclipse.draw2d.ToolbarLayout();
-			myGenLayoutManager.setStretchMinorAxis(false);
-			myGenLayoutManager
-					.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.ALIGN_CENTER);
-			myGenLayoutManager.setSpacing(20);
-			myGenLayoutManager.setVertical(false);
-
-			this.setLayoutManager(myGenLayoutManager);
-
-			this.setBackgroundColor(ROLETASKCOMPOSITEFIGURE_BACK
-
-			);
-			//			this.setBorder(new org.eclipse.draw2d.MarginBorder(getMapMode()
-			//					.DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0),
-			//					getMapMode().DPtoLP(0)));
-			this.setBorder(new RaisedMarginBorder());
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color ROLETASKCOMPOSITEFIGURE_BACK = new Color(null,
-			255, 255, 156);
-
-	/**
-	 * @modified
-	 */
-	public void updatebounds() {
-		Rectangle constraint = new Rectangle(0, 0, -1, -1);
-		Node node = (Node) this.getModel();
-		Location location = (Location) node.getLayoutConstraint();
-		if (location != null) {
-			constraint.setLocation(new Point(location.getX(), location.getY()));
-		}
-
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), constraint);
-	}
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		//		if(notification.getEventType() == Notification.SET){
-		//			ArrangeRequest arrangeRequest = new ArrangeRequest(ActionIds.ACTION_ARRANGE_ALL); List l = getChildren();
-		//			arrangeRequest.setPartsToArrange(l); 
-		//			Command arrangeCmd = getCommand(arrangeRequest); 
-		//			arrangeCmd.execute();
-		//			
-		//			Request request = new Request(RequestConstants.REQ_AUTOSIZE);
-		//			Command autoSizeCmd = getCommand(request);
-		//			if(autoSizeCmd != null){
-		//				autoSizeCmd.execute();
-		//			}
-		//		}
-		super.handleNotificationEvent(notification);
-	}
-
-	@Override
-	protected List getModelChildren() {
-		// TODO Auto-generated method stub
-		List<View> list = super.getModelChildren();
-
-		Comparator<View> c = new Comparator<View>() {
-			public int compare(View o1, View o2) {
-				Object model1 = ((View) o1).getElement();
-				Object model2 = ((View) o2).getElement();
-				if (model1 instanceof TaskNode && model2 instanceof TaskNode) {
-					if (((TaskNode) model1).getIndex() >= ((TaskNode) model2)
-							.getIndex())
-						return 1;
-					else
-						return -1;
-				}
-				return 0;
-			}
-		};
-		Collections.sort(list, c);
-		return list;
-	}
-	
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleTaskCompositeRoleTaskCompartmentEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleTaskCompositeRoleTaskCompartmentEditPart.java
deleted file mode 100644
index 4a0e3d7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/RoleTaskCompositeRoleTaskCompartmentEditPart.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.diagram.add.edit.policies.RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.add.part.Messages;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ListCompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeRoleTaskCompartmentEditPart extends
-		ListCompartmentEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 5001;
-
-	/**
-	 * @generated
-	 */
-	public RoleTaskCompositeRoleTaskCompartmentEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean hasModelChildrenChanged(Notification evt) {
-		return false;
-	}
-
-	/**
-	 * @modified
-	 */
-	public String getCompartmentName() {
-		return "";	//$NON-NLS-1$
-	}
-
-	/**
-	 * @modified
-	 */
-	public IFigure createFigure() {
-		ResizableCompartmentFigure result = (ResizableCompartmentFigure) super
-				.createFigure();
-
-		// remove the spacing
-		result.getScrollPane().getContents().setBorder(
-				new MarginBorder(0, 0, 0, 0));
-
-		result.setTitleVisibility(false);
-		result.setBorder(null);
-
-		// disable scrollpane
-		result.getScrollPane().setEnabled(false);
-
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(
-				EditPolicyRoles.SEMANTIC_ROLE,
-				new RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setRatio(Double ratio) {
-		// nothing to do -- parent layout does not accept Double constraints as ratio
-		// super.setRatio(ratio); 
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/TaskNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/TaskNodeEditPart.java
deleted file mode 100644
index f53ecfb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/TaskNodeEditPart.java
+++ /dev/null
@@ -1,387 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.GridData;
-import org.eclipse.draw2d.GridLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.policies.TaskNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.TaskNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.TaskNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.add.service.DiagramResetService;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.common.ui.services.action.global.GetGlobalActionHandlerOperation;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.NoteEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @generated
- */
-public class TaskNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 2002;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public TaskNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new TaskNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		TaskNodeFigure figure = new TaskNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public TaskNodeFigure getPrimaryShape() {
-		return (TaskNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof TaskNodeNameEditPart) {
-			((TaskNodeNameEditPart) childEditPart).setLabel(getPrimaryShape()
-					.getFigureTaskNodeNameFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(DiagramVisualIDRegistry
-				.getType(TaskNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class TaskNodeFigure extends RectangleFigure {
-
-		/**
-		 * @generated
-		 */
-		public TaskNodeFigure() {
-
-			this.setOutline(false);
-			this.setLineWidth(0);
-			this.setBackgroundColor(TASKNODEFIGURE_BACK
-
-			);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-			fig_0.setText(""); //$NON-NLS-1$
-			fig_0.setFont(TASKNODENAMEFIGURE_FONT);
-			DiagramCoreUtil.setLabelProperties(fig_0); // modified
-			setFigureTaskNodeNameFigure(fig_0);
-			fig_0.setTextWrapAlignment(PositionConstants.LEFT);
-			fig_0.setTextWrapWidth(100);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-		
-		/**
-		 * @generated
-		 */
-		private WrapLabel fTaskNodeNameFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureTaskNodeNameFigure() {
-			return fTaskNodeNameFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureTaskNodeNameFigure(WrapLabel fig) {
-			fTaskNodeNameFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Font TASKNODENAMEFIGURE_FONT = new Font(Display
-			.getCurrent(), "Arial", 8, SWT.NORMAL);
-
-	/**
-	 * @generated
-	 */
-	public static final Color TASKNODEFIGURE_BACK = new Color(null, 255, 255,
-			156);
-
-	@Override
-	protected void handleNotificationEvent(Notification notification) {
-		Object feature = notification.getFeature();
-		if(ModelPackage.eINSTANCE.getTaskNode_Index().equals(feature)){
-			EditPart parent = this.getParent();
-			if(parent instanceof RoleTaskCompositeEditPart ){
-				((RoleTaskCompositeEditPart)parent).refresh();
-				
-			}
-		}
-		super.handleNotificationEvent(notification);
-	}
-	
-	private void fireResetLayout(RoleTaskCompositeEditPart parent){
-		GraphicalViewer viewer = (GraphicalViewer)((RoleTaskCompositeEditPart)parent).getViewer();
-		ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart)viewer.getContents();
-		List<EditPart> local = new ArrayList<EditPart>();
-		if(dep.getChildren() != null && !dep.getChildren().isEmpty()){
-			for(Iterator iterator = dep.getChildren().iterator(); iterator.hasNext();){
-				Object next = iterator.next();
-				if(!(next instanceof NoteEditPart)){
-					local.add((EditPart)next);
-				}
-			}
-		}
-		dep.getRecentlyAddedParts().addAll(local);
-//		DiagramResetService service = new DiagramResetService(((DiagramGraphicalViewer)viewer).getE
-//				viewer, getEditDomain(), getActionRegistry());
-//		service.cleanUpDiagram();
-	}
-	
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/TaskNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/TaskNodeNameEditPart.java
deleted file mode 100644
index 7ca4b82..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/TaskNodeNameEditPart.java
+++ /dev/null
@@ -1,642 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Collections;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-
-import org.eclipse.draw2d.geometry.Point;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.transaction.RunnableWithResult;
-
-import org.eclipse.epf.diagram.add.edit.policies.DiagramTextSelectionEditPolicy;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-
-import org.eclipse.gef.AccessibleEditPart;
-
-import org.eclipse.gef.requests.DirectEditRequest;
-
-import org.eclipse.gef.tools.DirectEditManager;
-
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-
-import org.eclipse.jface.viewers.ICellEditorValidator;
-
-import org.eclipse.swt.SWT;
-
-import org.eclipse.swt.accessibility.AccessibleEvent;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class TaskNodeNameEditPart extends CompartmentEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4002;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public TaskNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDetailDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/TaskDescriptor.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @modified
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		if (text.length() < 16) {
-			int gap = 16 - text.length();
-			for (int i = 0; i < gap / 2; i++) {
-				text += " "; //$NON-NLS-1$
-			}
-			for (int i = 0; i < gap / 2; i++) {
-				text = " " + text; //$NON-NLS-1$
-			}
-		}
-		text = DiagramCoreUtil.wrap(text, 12);
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		return false;
-		//		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return DiagramElementTypes.TaskNode_2002;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), DiagramEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		String fontName = DiagramConstants.getFontName(style);
-		if (style != null) {
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-		else
-			setFont(DiagramConstants.getDefaultFontData());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductCompositeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductCompositeEditPart.java
deleted file mode 100644
index 82477e5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductCompositeEditPart.java
+++ /dev/null
@@ -1,274 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.policies.DiagramTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.WorkProductCompositeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.WorkProductCompositeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.WorkProductCompositeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.core.figures.RaisedMarginBorder;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.ConstrainedToolbarLayoutEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CreationEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.Location;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class WorkProductCompositeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1002;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public WorkProductCompositeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		installEditPolicy(EditPolicyRoles.CREATION_ROLE,
-				new CreationEditPolicy());
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new WorkProductCompositeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,
-				new DragDropEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new WorkProductCompositeCanonicalEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-
-		ConstrainedToolbarLayoutEditPolicy lep = new ConstrainedToolbarLayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				if (child.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE) == null) {
-					if (child instanceof ITextAwareEditPart) {
-						return new DiagramTextSelectionEditPolicy();
-					}
-				}
-				return super.createChildEditPolicy(child);
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		WorkProductCompositeFigure figure = new WorkProductCompositeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public WorkProductCompositeFigure getPrimaryShape() {
-		return (WorkProductCompositeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class WorkProductCompositeFigure extends RectangleFigure {
-
-		/**
-		 * @modified
-		 */
-		public WorkProductCompositeFigure() {
-
-			org.eclipse.draw2d.ToolbarLayout myGenLayoutManager = new org.eclipse.draw2d.ToolbarLayout();
-			myGenLayoutManager.setStretchMinorAxis(false);
-			myGenLayoutManager
-					.setMinorAlignment(org.eclipse.draw2d.ToolbarLayout.ALIGN_CENTER);
-			myGenLayoutManager.setSpacing(5);
-			myGenLayoutManager.setVertical(true);
-
-			this.setLayoutManager(myGenLayoutManager);
-
-			this.setBackgroundColor(WORKPRODUCTCOMPOSITEFIGURE_BACK
-
-			);
-			//			this.setBorder(new org.eclipse.draw2d.MarginBorder(getMapMode()
-			//					.DPtoLP(0), getMapMode().DPtoLP(0), getMapMode().DPtoLP(0),
-			//					getMapMode().DPtoLP(0)));
-			this.setBorder(new RaisedMarginBorder());
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Color WORKPRODUCTCOMPOSITEFIGURE_BACK = new Color(null,
-			255, 255, 205);
-
-	/**
-	 * @custom
-	 */
-	public void updatebounds() {
-		Rectangle constraint = new Rectangle(0, 0, -1, -1);
-		Node node = (Node) this.getModel();
-		Location location = (Location) node.getLayoutConstraint();
-		if (location != null) {
-			constraint.setLocation(new Point(location.getX(), location.getY()));
-		}
-		//		constraint.width = getNode().getWidth();
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this,
-				getFigure(), constraint);
-	}
-	
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductCompositeWorkProductCompartmentEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductCompositeWorkProductCompartmentEditPart.java
deleted file mode 100644
index 39a1a2a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductCompositeWorkProductCompartmentEditPart.java
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.epf.diagram.add.edit.policies.WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy;
-
-import org.eclipse.epf.diagram.add.part.Messages;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ListCompartmentEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
-
-/**
- * @generated
- */
-public class WorkProductCompositeWorkProductCompartmentEditPart extends
-		ListCompartmentEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 5002;
-
-	/**
-	 * @generated
-	 */
-	public WorkProductCompositeWorkProductCompartmentEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean hasModelChildrenChanged(Notification evt) {
-		return false;
-	}
-
-	/**
-	 * @modified
-	 */
-	public String getCompartmentName() {
-		return "";	//$NON-NLS-1$
-	}
-
-	/**
-	 * @modified
-	 */
-	public IFigure createFigure() {
-		ResizableCompartmentFigure result = (ResizableCompartmentFigure) super
-				.createFigure();
-
-		// remove the spacing
-		result.getScrollPane().getContents().setBorder(
-				new MarginBorder(0, 0, 0, 0));
-
-		result.setTitleVisibility(false);
-		result.setBorder(null);
-
-		// disable scrollpane & compartment title
-		result.getScrollPane().setEnabled(false);
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(
-				EditPolicyRoles.SEMANTIC_ROLE,
-				new WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setRatio(Double ratio) {
-		// nothing to do -- parent layout does not accept Double constraints as ratio
-		// super.setRatio(ratio); 
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductDescriptorNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductDescriptorNodeEditPart.java
deleted file mode 100644
index cae85fc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductDescriptorNodeEditPart.java
+++ /dev/null
@@ -1,351 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.policies.WorkProductDescriptorNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.WorkProductDescriptorNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.add.edit.policies.WorkProductDescriptorNodeItemSemanticEditPolicy;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-import org.eclipse.gef.requests.CreateRequest;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 2003;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public WorkProductDescriptorNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new WorkProductDescriptorNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		WorkProductDescriptorNodeFigure figure = new WorkProductDescriptorNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public WorkProductDescriptorNodeFigure getPrimaryShape() {
-		return (WorkProductDescriptorNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof WorkProductDescriptorNodeNameEditPart) {
-			((WorkProductDescriptorNodeNameEditPart) childEditPart)
-					.setLabel(getPrimaryShape()
-							.getFigureWorkProductNodeNameFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(DiagramVisualIDRegistry
-				.getType(WorkProductDescriptorNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class WorkProductDescriptorNodeFigure extends RectangleFigure {
-
-		/**
-		 * @generated
-		 */
-		public WorkProductDescriptorNodeFigure() {
-
-			this.setOutline(false);
-			this.setBackgroundColor(WORKPRODUCTDESCRIPTORNODEFIGURE_BACK
-
-			);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new WidenedWrapLabel();
-			fig_0.setText(""); //$NON-NLS-1$
-			fig_0.setFont(WORKPRODUCTNODENAMEFIGURE_FONT);
-
-			DiagramCoreUtil.setLabelProperties(fig_0); // modified
-			setFigureWorkProductNodeNameFigure(fig_0);
-			fig_0.setTextWrapAlignment(PositionConstants.LEFT);
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fWorkProductNodeNameFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureWorkProductNodeNameFigure() {
-			return fWorkProductNodeNameFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureWorkProductNodeNameFigure(WrapLabel fig) {
-			fWorkProductNodeNameFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-	
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final Font WORKPRODUCTNODENAMEFIGURE_FONT = new Font(Display
-			.getCurrent(), "Arial", 8, SWT.NORMAL);
-
-	/**
-	 * @generated
-	 */
-	public static final Color WORKPRODUCTDESCRIPTORNODEFIGURE_BACK = new Color(
-			null, 255, 255, 205);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductDescriptorNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductDescriptorNodeNameEditPart.java
deleted file mode 100644
index e084e27..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/parts/WorkProductDescriptorNodeNameEditPart.java
+++ /dev/null
@@ -1,610 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.add.edit.policies.DiagramTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeNameEditPart extends CompartmentEditPart
-		implements ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4003;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public WorkProductDescriptorNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Image getLabelIcon() {
-		return ActivityDetailDiagramEditorPlugin.getInstance().getSharedImage(
-				"diagram/WorkProductDescriptor.gif"); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * @modified
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		text = DiagramCoreUtil.wrap(text, 3);
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean isEditable() {
-		return false;
-		//		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return DiagramElementTypes.WorkProductDescriptorNode_2003;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), DiagramEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		String fontName = DiagramConstants.getFontName(style);
-		if (style != null) {
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-		else
-			setFont(DiagramConstants.getDefaultFontData());
-	}
-	
-	
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return (View) getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/ActivityDetailDiagramCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/ActivityDetailDiagramCanonicalEditPolicy.java
deleted file mode 100644
index 9eb689f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/ActivityDetailDiagramCanonicalEditPolicy.java
+++ /dev/null
@@ -1,492 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeEditPart;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityDetailDiagramCanonicalEditPolicy extends
-		CanonicalConnectionEditPolicy {
-
-	@Override
-	public EObject getSemanticHost() {
-		return host().getModel() != null ? super.getSemanticHost() : null;
-	}
-	
-	@Override
-	protected void refreshOnActivate() {		
-		super.refreshOnActivate();
-		
-		EditPart ep = getHost();
-		if(ep instanceof DiagramEditPart) {
-			DiagramEditorUtil.initializeOnActivate((DiagramEditPart) ep);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		EObject modelObject = ((View) getHost().getModel()).getElement();
-		View viewObject = (View) getHost().getModel();
-		EObject nextValue;
-		int nodeVID;
-		for (Iterator values = ((NodeContainer) modelObject).getNodes()
-				.iterator(); values.hasNext();) {
-			nextValue = (EObject) values.next();
-			nodeVID = DiagramVisualIDRegistry.getNodeVisualID(viewObject,
-					nextValue);
-			switch (nodeVID) {
-			case RoleTaskCompositeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case WorkProductCompositeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement()
-				&& view.getElement() != null
-				&& (view.getElement().eIsProxy() || view.getElement() instanceof Node);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-	private static void getConnections(Collection connections,
-			NodeContainer container) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			connections.addAll(node.getOutgoingConnections());
-			if (node instanceof NodeContainer) {
-				getConnections(connections, (NodeContainer) node);
-			}
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected List getSemanticConnectionsList() {
-		ActivityDetailDiagram add = (ActivityDetailDiagram) ((View) getHost()
-				.getModel()).getElement();
-		List connections = new ArrayList();
-		getConnections(connections, add);
-		return connections;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject getSourceElement(EObject relationship) {
-		if (relationship instanceof Link) {
-			return ((Link) relationship).getSource();
-		}
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject getTargetElement(EObject relationship) {
-		if (relationship instanceof Link) {
-			return ((Link) relationship).getTarget();
-		}
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldIncludeConnection(Edge connector,
-			Collection children) {
-		return super.shouldIncludeConnection(connector, children);
-	}
-
-	@Override
-	protected void refreshSemantic() {
-		List createdViews = new LinkedList();
-		createdViews.addAll(refreshSemanticChildren());
-		List createdConnectionViews = new LinkedList();
-		createdConnectionViews.addAll(refreshSemanticConnections());
-		createdConnectionViews.addAll(refreshConnections());
-
-		//		if (createdViews.size() > 1) {
-		//			// perform a layout of the container
-		//			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host()
-		//					.getEditingDomain(), createdViews, host());
-		//			executeCommand(new ICommandProxy(layoutCmd));
-		//		}
-
-		createdViews.addAll(createdConnectionViews);
-		makeViewsImmutable(createdViews);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Collection myLinkDescriptors = new LinkedList();
-
-	/**
-	 * @generated
-	 */
-	private Map myEObject2ViewMap = new HashMap();
-
-	/**
-	 * @generated
-	 */
-	private Collection refreshConnections() {
-		try {
-			collectAllLinks(getDiagram());
-			Collection existingLinks = new LinkedList(getDiagram().getEdges());
-			for (Iterator diagramLinks = existingLinks.iterator(); diagramLinks
-					.hasNext();) {
-				Edge nextDiagramLink = (Edge) diagramLinks.next();
-				EObject diagramLinkObject = nextDiagramLink.getElement();
-				EObject diagramLinkSrc = nextDiagramLink.getSource()
-						.getElement();
-				EObject diagramLinkDst = nextDiagramLink.getTarget()
-						.getElement();
-				int diagramLinkVisualID = DiagramVisualIDRegistry
-						.getVisualID(nextDiagramLink);
-				for (Iterator modelLinkDescriptors = myLinkDescriptors
-						.iterator(); modelLinkDescriptors.hasNext();) {
-					LinkDescriptor nextLinkDescriptor = (LinkDescriptor) modelLinkDescriptors
-							.next();
-					if (diagramLinkObject == nextLinkDescriptor
-							.getLinkElement()
-							&& diagramLinkSrc == nextLinkDescriptor.getSource()
-							&& diagramLinkDst == nextLinkDescriptor
-									.getDestination()
-							&& diagramLinkVisualID == nextLinkDescriptor
-									.getVisualID()) {
-						diagramLinks.remove();
-						modelLinkDescriptors.remove();
-					}
-				}
-			}
-			deleteViews(existingLinks.iterator());
-			return createConnections(myLinkDescriptors);
-		} finally {
-			myLinkDescriptors.clear();
-			myEObject2ViewMap.clear();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void collectAllLinks(View view) {
-		EObject modelElement = view.getElement();
-		int diagramElementVisualID = DiagramVisualIDRegistry.getVisualID(view);
-		switch (diagramElementVisualID) {
-		case RoleTaskCompositeEditPart.VISUAL_ID:
-		case WorkProductCompositeEditPart.VISUAL_ID:
-		case RoleNodeEditPart.VISUAL_ID:
-		case TaskNodeEditPart.VISUAL_ID:
-		case WorkProductDescriptorNodeEditPart.VISUAL_ID:
-		case ActivityDetailDiagramEditPart.VISUAL_ID: {
-			myEObject2ViewMap.put(modelElement, view);
-			storeLinks(modelElement, getDiagram());
-		}
-		default: {
-		}
-			for (Iterator children = view.getChildren().iterator(); children
-					.hasNext();) {
-				View childView = (View) children.next();
-				collectAllLinks(childView);
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private Collection createConnections(Collection linkDescriptors) {
-		if (linkDescriptors.isEmpty()) {
-			return Collections.EMPTY_LIST;
-		}
-		List adapters = new LinkedList();
-		for (Iterator linkDescriptorsIterator = linkDescriptors.iterator(); linkDescriptorsIterator
-				.hasNext();) {
-			final LinkDescriptor nextLinkDescriptor = (LinkDescriptor) linkDescriptorsIterator
-					.next();
-			EditPart sourceEditPart = getEditPartFor(nextLinkDescriptor
-					.getSource());
-			EditPart targetEditPart = getEditPartFor(nextLinkDescriptor
-					.getDestination());
-			if (sourceEditPart == null || targetEditPart == null) {
-				continue;
-			}
-			CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(
-					nextLinkDescriptor.getSemanticAdapter(), null,
-					ViewUtil.APPEND, false, ((IGraphicalEditPart) getHost())
-							.getDiagramPreferencesHint());
-			CreateConnectionViewRequest ccr = new CreateConnectionViewRequest(
-					descriptor);
-			ccr.setType(RequestConstants.REQ_CONNECTION_START);
-			ccr.setSourceEditPart(sourceEditPart);
-			sourceEditPart.getCommand(ccr);
-			ccr.setTargetEditPart(targetEditPart);
-			ccr.setType(RequestConstants.REQ_CONNECTION_END);
-			Command cmd = targetEditPart.getCommand(ccr);
-			if (cmd != null && cmd.canExecute()) {
-				executeCommand(cmd);
-				IAdaptable viewAdapter = (IAdaptable) ccr.getNewObject();
-				if (viewAdapter != null) {
-					adapters.add(viewAdapter);
-				}
-			}
-		}
-		return adapters;
-	}
-
-	/**
-	 * @generated
-	 */
-	private EditPart getEditPartFor(EObject modelElement) {
-		View view = (View) myEObject2ViewMap.get(modelElement);
-		if (view != null) {
-			return (EditPart) getHost().getViewer().getEditPartRegistry().get(
-					view);
-		}
-		return null;
-	}
-
-	/**
-	 *@generated
-	 */
-	private void storeLinks(EObject container, Diagram diagram) {
-		EClass containerMetaclass = container.eClass();
-		storeFeatureModelFacetLinks(container, containerMetaclass, diagram);
-		storeTypeModelFacetLinks(container, containerMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void storeTypeModelFacetLinks(EObject container,
-			EClass containerMetaclass) {
-		storeTypeModelFacetLinks_Link_3001(container, containerMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void storeTypeModelFacetLinks_Link_3001(EObject container,
-			EClass containerMetaclass) {
-		if (ModelPackage.eINSTANCE.getNode().isSuperTypeOf(containerMetaclass)) {
-			for (Iterator values = ((Node) container).getOutgoingConnections()
-					.iterator(); values.hasNext();) {
-				EObject nextValue = ((EObject) values.next());
-				int linkVID = DiagramVisualIDRegistry
-						.getLinkWithClassVisualID(nextValue);
-				if (LinkEditPart.VISUAL_ID == linkVID) {
-					Object structuralFeatureResult = ((Link) nextValue)
-							.getTarget();
-					if (structuralFeatureResult instanceof EObject) {
-						EObject dst = (EObject) structuralFeatureResult;
-						structuralFeatureResult = ((Link) nextValue)
-								.getSource();
-						if (structuralFeatureResult instanceof EObject) {
-							EObject src = (EObject) structuralFeatureResult;
-							myLinkDescriptors.add(new LinkDescriptor(src, dst,
-									nextValue, DiagramElementTypes.Link_3001,
-									linkVID));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 *@generated
-	 */
-	private void storeFeatureModelFacetLinks(EObject container,
-			EClass containerMetaclass, Diagram diagram) {
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private Diagram getDiagram() {
-		return ((View) getHost().getModel()).getDiagram();
-	}
-
-	/**
-	 * @generated
-	 */
-	private class LinkDescriptor {
-
-		/**
-		 * @generated
-		 */
-		private EObject mySource;
-
-		/**
-		 * @generated
-		 */
-		private EObject myDestination;
-
-		/**
-		 * @generated
-		 */
-		private EObject myLinkElement;
-
-		/**
-		 * @generated
-		 */
-		private int myVisualID;
-
-		/**
-		 * @generated
-		 */
-		private IAdaptable mySemanticAdapter;
-
-		/**
-		 * @generated
-		 */
-		protected LinkDescriptor(EObject source, EObject destination,
-				EObject linkElement, IElementType elementType, int linkVID) {
-			this(source, destination, linkVID);
-			myLinkElement = linkElement;
-			final IElementType elementTypeCopy = elementType;
-			mySemanticAdapter = new EObjectAdapter(linkElement) {
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return elementTypeCopy;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-		}
-
-		/**
-		 * @generated
-		 */
-		protected LinkDescriptor(EObject source, EObject destination,
-				IElementType elementType, int linkVID) {
-			this(source, destination, linkVID);
-			myLinkElement = null;
-			final IElementType elementTypeCopy = elementType;
-			mySemanticAdapter = new IAdaptable() {
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return elementTypeCopy;
-					}
-					return null;
-				}
-			};
-		}
-
-		/**
-		 * @generated
-		 */
-		private LinkDescriptor(EObject source, EObject destination, int linkVID) {
-			mySource = source;
-			myDestination = destination;
-			myVisualID = linkVID;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getSource() {
-			return mySource;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getDestination() {
-			return myDestination;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getLinkElement() {
-			return myLinkElement;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected int getVisualID() {
-			return myVisualID;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected IAdaptable getSemanticAdapter() {
-			return mySemanticAdapter;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/ActivityDetailDiagramItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/ActivityDetailDiagramItemSemanticEditPolicy.java
deleted file mode 100644
index 57d454d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/ActivityDetailDiagramItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,88 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.emf.commands.core.commands.DuplicateEObjectsCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
-import org.eclipse.epf.diagram.add.edit.commands.RoleTaskCompositeCreateCommand;
-import org.eclipse.epf.diagram.add.edit.commands.WorkProductCompositeCreateCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityDetailDiagramItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		if (DiagramElementTypes.RoleTaskComposite_1001 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(ModelPackage.eINSTANCE
-						.getNodeContainer_Nodes());
-			}
-			return getMSLWrapper(new RoleTaskCompositeCreateCommand(req));
-		}
-		if (DiagramElementTypes.WorkProductComposite_1002 == req
-				.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(ModelPackage.eINSTANCE
-						.getNodeContainer_Nodes());
-			}
-			return getMSLWrapper(new WorkProductCompositeCreateCommand(req));
-		}
-		return super.getCreateCommand(req);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
-		return null;
-		//		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-		//				.getEditingDomain();
-		//		return getMSLWrapper(new DuplicateAnythingCommand(editingDomain, req));
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class DuplicateAnythingCommand extends
-			DuplicateEObjectsCommand {
-
-		/**
-		 * @generated
-		 */
-		public DuplicateAnythingCommand(
-				TransactionalEditingDomain editingDomain,
-				DuplicateElementsRequest req) {
-			super(editingDomain, req.getLabel(), req
-					.getElementsToBeDuplicated(), req
-					.getAllDuplicatedElementsMap());
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramBaseItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramBaseItemSemanticEditPolicy.java
deleted file mode 100644
index 4f58d67..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramBaseItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,367 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import java.util.Collections;
-import java.util.Iterator;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.ReconnectRequest;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.SemanticEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IEditHelperContext;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.add.edit.helpers.DiagramBaseEditHelper;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-
-/**
- * @generated
- */
-public class DiagramBaseItemSemanticEditPolicy extends SemanticEditPolicy {
-
-	/**
-	 * Extended request data key to hold editpart visual id.
-	 * 
-	 * @generated
-	 */
-	public static final String VISUAL_ID_KEY = "visual_id"; //$NON-NLS-1$
-
-	/**
-	 * Add visual id of edited editpart to extended data of the request
-	 * so command switch can decide what kind of diagram element is being edited.
-	 * It is done in those cases when it's not possible to deduce diagram
-	 * element kind from domain element.
-	 * 
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof ReconnectRequest) {
-			Object view = ((ReconnectRequest) request).getConnectionEditPart()
-					.getModel();
-			if (view instanceof View) {
-				Integer id = new Integer(DiagramVisualIDRegistry
-						.getVisualID((View) view));
-				request.getExtendedData().put(VISUAL_ID_KEY, id);
-			}
-		}
-		return super.getCommand(request);
-	}
-
-	/**
-	 * Returns visual id from request parameters.
-	 * 
-	 * @generated
-	 */
-	protected int getVisualID(IEditCommandRequest request) {
-		Object id = request.getParameter(VISUAL_ID_KEY);
-		return id instanceof Integer ? ((Integer) id).intValue() : -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSemanticCommand(IEditCommandRequest request) {
-		IEditCommandRequest completedRequest = completeRequest(request);
-		Object editHelperContext = completedRequest.getEditHelperContext();
-		if (editHelperContext instanceof View
-				|| (editHelperContext instanceof IEditHelperContext && ((IEditHelperContext) editHelperContext)
-						.getEObject() instanceof View)) {
-			// no semantic commands are provided for pure design elements
-			return null;
-		}
-		if (editHelperContext == null) {
-			editHelperContext = ViewUtil
-					.resolveSemanticElement((View) getHost().getModel());
-		}
-		IElementType elementType = ElementTypeRegistry.getInstance()
-				.getElementType(editHelperContext);
-		if (elementType == ElementTypeRegistry.getInstance().getType(
-				"org.eclipse.gmf.runtime.emf.type.core.default")) { //$NON-NLS-1$ 
-			elementType = null;
-		}
-		Command epCommand = getSemanticCommandSwitch(completedRequest);
-		if (epCommand != null) {
-			ICommand command = epCommand instanceof ICommandProxy ? ((ICommandProxy) epCommand)
-					.getICommand()
-					: new CommandProxy(epCommand);
-			completedRequest.setParameter(
-					DiagramBaseEditHelper.EDIT_POLICY_COMMAND, command);
-		}
-		Command ehCommand = null;
-		if (elementType != null) {
-			ICommand command = elementType.getEditCommand(completedRequest);
-			if (command != null) {
-				if (!(command instanceof CompositeTransactionalCommand)) {
-					TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-							.getEditingDomain();
-					command = new CompositeTransactionalCommand(editingDomain,
-							null).compose(command);
-				}
-				ehCommand = new ICommandProxy(command);
-			}
-		}
-		boolean shouldProceed = true;
-		if (completedRequest instanceof DestroyRequest) {
-			shouldProceed = shouldProceed((DestroyRequest) completedRequest);
-		}
-		if (shouldProceed) {
-			if (completedRequest instanceof DestroyRequest) {
-				TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-						.getEditingDomain();
-				Command deleteViewCommand = new ICommandProxy(
-						new DeleteCommand(editingDomain, (View) getHost()
-								.getModel()));
-				ehCommand = ehCommand == null ? deleteViewCommand : ehCommand
-						.chain(deleteViewCommand);
-			}
-			return ehCommand;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSemanticCommandSwitch(IEditCommandRequest req) {
-		if (req instanceof CreateRelationshipRequest) {
-			return getCreateRelationshipCommand((CreateRelationshipRequest) req);
-		} else if (req instanceof CreateElementRequest) {
-			return getCreateCommand((CreateElementRequest) req);
-		} else if (req instanceof ConfigureRequest) {
-			return getConfigureCommand((ConfigureRequest) req);
-		} else if (req instanceof DestroyElementRequest) {
-			return getDestroyElementCommand((DestroyElementRequest) req);
-		} else if (req instanceof DestroyReferenceRequest) {
-			return getDestroyReferenceCommand((DestroyReferenceRequest) req);
-		} else if (req instanceof DuplicateElementsRequest) {
-			return getDuplicateCommand((DuplicateElementsRequest) req);
-		} else if (req instanceof GetEditContextRequest) {
-			return getEditContextCommand((GetEditContextRequest) req);
-		} else if (req instanceof MoveRequest) {
-			return getMoveCommand((MoveRequest) req);
-		} else if (req instanceof ReorientReferenceRelationshipRequest) {
-			return getReorientReferenceRelationshipCommand((ReorientReferenceRelationshipRequest) req);
-		} else if (req instanceof ReorientRelationshipRequest) {
-			return getReorientRelationshipCommand((ReorientRelationshipRequest) req);
-		} else if (req instanceof SetRequest) {
-			return getSetCommand((SetRequest) req);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getConfigureCommand(ConfigureRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSetCommand(SetRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getEditContextCommand(GetEditContextRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getMoveCommand(MoveRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getReorientReferenceRelationshipCommand(
-			ReorientReferenceRelationshipRequest req) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getMSLWrapper(ICommand cmd) {
-		return new ICommandProxy(cmd);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getSemanticElement() {
-		return ViewUtil.resolveSemanticElement((View) getHost().getModel());
-	}
-
-	/**
-	 * Finds container element for the new relationship of the specified type.
-	 * Default implementation goes up by containment hierarchy starting from
-	 * the specified element and returns the first element that is instance of
-	 * the specified container class.
-	 * 
-	 * @generated
-	 */
-	protected EObject getRelationshipContainer(Object uelement,
-			EClass containerClass, IElementType relationshipType) {
-		if (uelement instanceof EObject) {
-			EObject element = (EObject) uelement;
-			for (; element != null; element = element.eContainer()) {
-				if (containerClass.isSuperTypeOf(element.eClass())) {
-					return element;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns editing domain from the host edit part.
-	 * 
-	 * @generated
-	 */
-	protected TransactionalEditingDomain getEditingDomain() {
-		return ((IGraphicalEditPart) getHost()).getEditingDomain();
-	}
-
-	/**
-	 * Creates command to destroy the link.
-	 * 
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(View view, boolean confirm) {
-		EditPart editPart = (EditPart) getHost().getViewer()
-				.getEditPartRegistry().get(view);
-		DestroyElementRequest request = new DestroyElementRequest(
-				getEditingDomain(), confirm);
-		return editPart.getCommand(new EditCommandRequestWrapper(request,
-				Collections.EMPTY_MAP));
-	}
-
-	/**
-	 * Creates commands to destroy all host incoming and outgoing links.
-	 * 
-	 * @generated
-	 */
-	protected CompoundCommand getDestroyEdgesCommand(boolean confirm) {
-		CompoundCommand cmd = new CompoundCommand();
-		View view = (View) getHost().getModel();
-		for (Iterator it = view.getSourceEdges().iterator(); it.hasNext();) {
-			cmd.add(getDestroyElementCommand((Edge) it.next(), confirm));
-		}
-		for (Iterator it = view.getTargetEdges().iterator(); it.hasNext();) {
-			cmd.add(getDestroyElementCommand((Edge) it.next(), confirm));
-		}
-		return cmd;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static class LinkConstraints {
-
-		/**
-		 * @generated
-		 */
-		public static boolean canCreateLink_3001(Node container, Node source,
-				Node target) {
-			return canExistLink_3001(container, source, target);
-		}
-
-		/**
-		 * @generated
-		 */
-		public static boolean canExistLink_3001(Node container, Node source,
-				Node target) {
-			return true;
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramExtNodeLabelHostLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramExtNodeLabelHostLayoutEditPolicy.java
deleted file mode 100644
index 417810c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramExtNodeLabelHostLayoutEditPolicy.java
+++ /dev/null
@@ -1,229 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class DiagramExtNodeLabelHostLayoutEditPolicy extends XYLayoutEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private LayoutEditPolicy realLayoutEditPolicy;
-
-	/**
-	 * @generated
-	 */
-	public LayoutEditPolicy getRealLayoutEditPolicy() {
-		return realLayoutEditPolicy;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setRealLayoutEditPolicy(LayoutEditPolicy realLayoutEditPolicy) {
-		this.realLayoutEditPolicy = realLayoutEditPolicy;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isExternalLabel(EditPart editPart) {
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected final List getExternalLabels(GroupRequest request) {
-		List editParts = new ArrayList();
-		if (request.getEditParts() != null) {
-			for (Iterator it = request.getEditParts().iterator(); it.hasNext();) {
-				EditPart editPart = (EditPart) it.next();
-				if (isExternalLabel(editPart)) {
-					editParts.add(editPart);
-				}
-			}
-		}
-		return editParts;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (REQ_MOVE_CHILDREN.equals(request.getType())) {
-			ChangeBoundsRequest cbRequest = (ChangeBoundsRequest) request;
-			List extLabels = getExternalLabels(cbRequest);
-			if (!extLabels.isEmpty()) {
-				List editParts = cbRequest.getEditParts();
-				Command cmd = null;
-				if (realLayoutEditPolicy != null
-						&& editParts.size() > extLabels.size()) {
-					List other = new ArrayList(editParts);
-					other.removeAll(extLabels);
-					cbRequest.setEditParts(other);
-					cmd = realLayoutEditPolicy.getCommand(request);
-				}
-				cbRequest.setEditParts(extLabels);
-				Command extLabelsCmd = getMoveChildrenCommand(request);
-				cbRequest.setEditParts(editParts);
-				return cmd == null ? extLabelsCmd : cmd.chain(extLabelsCmd);
-			}
-		}
-		if (request instanceof GroupRequest) {
-			List extLabels = getExternalLabels((GroupRequest) request);
-			if (!extLabels.isEmpty()) {
-				return null;
-			}
-		}
-		return realLayoutEditPolicy == null ? null : realLayoutEditPolicy
-				.getCommand(request);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getConstraintFor(ChangeBoundsRequest request,
-			GraphicalEditPart child) {
-		int dx = ((Integer) ViewUtil.getStructuralFeatureValue((View) child
-				.getModel(), NotationPackage.eINSTANCE.getLocation_X()))
-				.intValue();
-		int dy = ((Integer) ViewUtil.getStructuralFeatureValue((View) child
-				.getModel(), NotationPackage.eINSTANCE.getLocation_Y()))
-				.intValue();
-		Rectangle r = new Rectangle(dx, dy, 0, 0);
-		child.getFigure().translateToAbsolute(r);
-		r.translate(request.getMoveDelta());
-		child.getFigure().translateToRelative(r);
-		return r;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean understandsRequest(Request req) {
-		if (realLayoutEditPolicy != null
-				&& realLayoutEditPolicy.understandsRequest(req)) {
-			return true;
-		}
-		return super.understandsRequest(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateChild(EditPart child) {
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setHost(EditPart host) {
-		super.setHost(host);
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.setHost(host);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void activate() {
-		super.activate();
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.activate();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void deactivate() {
-		super.deactivate();
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.deactivate();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (realLayoutEditPolicy != null) {
-			return realLayoutEditPolicy.getTargetEditPart(request);
-		} else {
-			return super.getTargetEditPart(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void showSourceFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.showSourceFeedback(request);
-		} else {
-			super.showSourceFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void eraseSourceFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.eraseSourceFeedback(request);
-		} else {
-			super.eraseSourceFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void showTargetFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.showTargetFeedback(request);
-		} else {
-			super.showTargetFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.eraseTargetFeedback(request);
-		} else {
-			super.eraseTargetFeedback(request);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramGraphicalNodeEditPolicy.java
deleted file mode 100644
index ace7bf8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.diagram.core.edithelpers.CreateElementRequestAdapter;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.GraphicalNodeEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewAndElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.epf.diagram.add.edit.commands.DiagramReorientConnectionViewCommand;
-
-/**
- * @generated
- */
-public class DiagramGraphicalNodeEditPolicy extends GraphicalNodeEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected IElementType getElementType(CreateConnectionRequest request) {
-		if (request instanceof CreateConnectionViewAndElementRequest) {
-			CreateElementRequestAdapter requestAdapter = ((CreateConnectionViewAndElementRequest) request)
-					.getConnectionViewAndElementDescriptor()
-					.getCreateElementRequestAdapter();
-			return (IElementType) requestAdapter.getAdapter(IElementType.class);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getConnectionWithReorientedViewCompleteCommand(
-			CreateConnectionRequest request) {
-		ICommandProxy c = (ICommandProxy) super
-				.getConnectionCompleteCommand(request);
-		CompositeCommand cc = (CompositeCommand) c.getICommand();
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		DiagramReorientConnectionViewCommand rcvCommand = new DiagramReorientConnectionViewCommand(
-				editingDomain, null);
-		rcvCommand.setEdgeAdaptor(getViewAdapter());
-		cc.compose(rcvCommand);
-		return c;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramReferenceConnectionEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramReferenceConnectionEditPolicy.java
deleted file mode 100644
index ad96fe8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramReferenceConnectionEditPolicy.java
+++ /dev/null
@@ -1,175 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.editparts.AbstractConnectionEditPart;
-import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.diagram.ui.requests.GroupRequestViaKeyboard;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @generated
- */
-public class DiagramReferenceConnectionEditPolicy extends ConnectionEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_DIAGRAM_DLG_TITLE = DiagramUIMessages.PromptingDeleteAction_DeleteFromDiagramDialog_Title;
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_DIAGRAM_DLG_MESSAGE = DiagramUIMessages.PromptingDeleteAction_DeleteFromDiagramDialog_Message;
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_MODEL_DLG_TOGGLE_LABEL = DiagramUIMessages.MessageDialogWithToggle_DoNotPromptAgainToggle_label;
-
-	/**
-	 * @generated
-	 */
-	protected final Command getDeleteCommand(GroupRequest deleteRequest) {
-		boolean isDeleteFromKeyBoard = deleteRequest instanceof GroupRequestViaKeyboard;
-		if (shouldDeleteSemantic()) {
-			return createDeleteSemanticCommand(deleteRequest);
-		} else {
-			boolean proceedToDeleteView = true;
-			if (isDeleteFromKeyBoard) {
-				GroupRequestViaKeyboard groupRequestViaKeyboard = (GroupRequestViaKeyboard) deleteRequest;
-				if (groupRequestViaKeyboard.isShowInformationDialog()) {
-					proceedToDeleteView = showPrompt();
-					groupRequestViaKeyboard.setShowInformationDialog(false);
-					if (!(proceedToDeleteView))
-						return UnexecutableCommand.INSTANCE;
-				}
-			}
-			return createDeleteViewCommand(deleteRequest);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteSemantic() {
-		Assert.isTrue(getHost() instanceof AbstractConnectionEditPart);
-		AbstractConnectionEditPart cep = (AbstractConnectionEditPart) getHost();
-		boolean isCanonical = false;
-		if (cep.getSource() != null)
-			isCanonical = IsCanonical(cep.getSource());
-		if (cep.getTarget() != null)
-			return isCanonical ? isCanonical : IsCanonical(cep.getTarget());
-		return isCanonical;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean IsCanonical(EditPart ep) {
-		EditPart parent = ep.getParent();
-		return parent instanceof GraphicalEditPart ? ((GraphicalEditPart) parent)
-				.isCanonical()
-				: false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command createDeleteViewCommand(GroupRequest deleteRequest) {
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		return new ICommandProxy(new DeleteCommand(editingDomain,
-				(View) getHost().getModel()));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command createDeleteSemanticCommand(GroupRequest deleteRequest) {
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		EditCommandRequestWrapper semReq = new EditCommandRequestWrapper(
-				new DestroyElementRequest(editingDomain, false), deleteRequest
-						.getExtendedData());
-		Command semanticCmd = getHost().getCommand(semReq);
-		if (semanticCmd != null && semanticCmd.canExecute()) {
-			CompoundCommand cc = new CompoundCommand();
-			cc.add(semanticCmd);
-			return cc;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean showPrompt() {
-		boolean prompt = ((IPreferenceStore) ((IGraphicalEditPart) getHost())
-				.getDiagramPreferencesHint().getPreferenceStore())
-				.getBoolean(IPreferenceConstants.PREF_PROMPT_ON_DEL_FROM_DIAGRAM);
-		if (prompt)
-			if (showMessageDialog())
-				return true;
-			else
-				return false;
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean showMessageDialog() {
-		MessageDialogWithToggle dialog = MessageDialogWithToggle
-				.openYesNoQuestion(Display.getCurrent().getActiveShell(),
-						DELETE_FROM_DIAGRAM_DLG_TITLE,
-						DELETE_FROM_DIAGRAM_DLG_MESSAGE,
-						DELETE_FROM_MODEL_DLG_TOGGLE_LABEL, false,
-						(IPreferenceStore) ((IGraphicalEditPart) getHost())
-								.getDiagramPreferencesHint()
-								.getPreferenceStore(),
-						IPreferenceConstants.PREF_PROMPT_ON_DEL_FROM_DIAGRAM);
-		if (dialog.getReturnCode() == IDialogConstants.YES_ID)
-			return true;
-		else
-			return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof GroupRequestViaKeyboard) {
-			return getDeleteCommand((GroupRequest) request);
-		}
-		return super.getCommand(request);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramTextNonResizableEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramTextNonResizableEditPolicy.java
deleted file mode 100644
index 8442fc9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramTextNonResizableEditPolicy.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.handles.MoveHandle;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.NonResizableEditPolicyEx;
-import org.eclipse.gmf.runtime.diagram.ui.tools.DragEditPartsTrackerEx;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-/**
- * @generated
- */
-public class DiagramTextNonResizableEditPolicy extends NonResizableEditPolicyEx {
-
-	/**
-	 * @generated
-	 */
-	private IFigure selectionFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	private IFigure focusFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	protected void showPrimarySelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			showSelection();
-			showFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			hideSelection();
-			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
-			refreshSelectionFeedback();
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(false);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (selectionFeedbackFigure != null) {
-				removeFeedback(selectionFeedbackFigure);
-				selectionFeedbackFigure = null;
-			}
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			hideFocus();
-			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
-			refreshFocusFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (focusFeedbackFigure != null) {
-				removeFeedback(focusFeedbackFigure);
-				focusFeedbackFigure = null;
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Rectangle getFeedbackBounds() {
-		Rectangle bounds;
-		if (getHostFigure() instanceof Label) {
-			bounds = ((Label) getHostFigure()).getTextBounds();
-			bounds.intersect(getHostFigure().getBounds());
-		} else {
-			bounds = getHostFigure().getBounds().getCopy();
-		}
-		getHostFigure().getParent().translateToAbsolute(bounds);
-		getFeedbackLayer().translateToRelative(bounds);
-		return bounds;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createSelectionFeedbackFigure() {
-		if (getHostFigure() instanceof Label) {
-			Label feedbackFigure = new Label();
-			feedbackFigure.setOpaque(true);
-			feedbackFigure
-					.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			feedbackFigure
-					.setForegroundColor(ColorConstants.menuForegroundSelected);
-			return feedbackFigure;
-		} else {
-			RectangleFigure feedbackFigure = new RectangleFigure();
-			feedbackFigure.setFill(false);
-			return feedbackFigure;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFocusFeedbackFigure() {
-		return new Figure() {
-
-			protected void paintFigure(Graphics graphics) {
-				graphics.drawFocus(getBounds().getResized(-1, -1));
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateLabel(Label target) {
-		Label source = (Label) getHostFigure();
-		target.setText(source.getText());
-		target.setTextAlignment(source.getTextAlignment());
-		target.setFont(source.getFont());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshSelectionFeedback() {
-		if (selectionFeedbackFigure != null) {
-			if (selectionFeedbackFigure instanceof Label) {
-				updateLabel((Label) selectionFeedbackFigure);
-				selectionFeedbackFigure.setBounds(getFeedbackBounds());
-			} else {
-				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5,
-						5));
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshFocusFeedback() {
-		if (focusFeedbackFigure != null) {
-			focusFeedbackFigure.setBounds(getFeedbackBounds());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshFeedback() {
-		refreshSelectionFeedback();
-		refreshFocusFeedback();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createSelectionHandles() {
-		MoveHandle moveHandle = new MoveHandle((GraphicalEditPart) getHost());
-		moveHandle.setBorder(null);
-		moveHandle.setDragTracker(new DragEditPartsTrackerEx(getHost()));
-		return Collections.singletonList(moveHandle);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramTextSelectionEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramTextSelectionEditPolicy.java
deleted file mode 100644
index 3563005..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/DiagramTextSelectionEditPolicy.java
+++ /dev/null
@@ -1,198 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editpolicies.SelectionEditPolicy;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-/**
- * @generated
- */
-public class DiagramTextSelectionEditPolicy extends SelectionEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private IFigure selectionFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	private IFigure focusFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	protected void showPrimarySelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			showSelection();
-			showFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			hideSelection();
-			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
-			refreshSelectionFeedback();
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(false);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (selectionFeedbackFigure != null) {
-				removeFeedback(selectionFeedbackFigure);
-				selectionFeedbackFigure = null;
-			}
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			hideFocus();
-			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
-			refreshFocusFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (focusFeedbackFigure != null) {
-				removeFeedback(focusFeedbackFigure);
-				focusFeedbackFigure = null;
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Rectangle getFeedbackBounds() {
-		Rectangle bounds;
-		if (getHostFigure() instanceof Label) {
-			bounds = ((Label) getHostFigure()).getTextBounds();
-			bounds.intersect(getHostFigure().getBounds());
-		} else {
-			bounds = getHostFigure().getBounds().getCopy();
-		}
-		getHostFigure().getParent().translateToAbsolute(bounds);
-		getFeedbackLayer().translateToRelative(bounds);
-		return bounds;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createSelectionFeedbackFigure() {
-		if (getHostFigure() instanceof Label) {
-			Label feedbackFigure = new Label();
-			feedbackFigure.setOpaque(true);
-			feedbackFigure
-					.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			feedbackFigure
-					.setForegroundColor(ColorConstants.menuForegroundSelected);
-			return feedbackFigure;
-		} else {
-			RectangleFigure feedbackFigure = new RectangleFigure();
-			feedbackFigure.setFill(false);
-			return feedbackFigure;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFocusFeedbackFigure() {
-		return new Figure() {
-
-			protected void paintFigure(Graphics graphics) {
-				graphics.drawFocus(getBounds().getResized(-1, -1));
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateLabel(Label target) {
-		Label source = (Label) getHostFigure();
-		target.setText(source.getText());
-		target.setTextAlignment(source.getTextAlignment());
-		target.setFont(source.getFont());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshSelectionFeedback() {
-		if (selectionFeedbackFigure != null) {
-			if (selectionFeedbackFigure instanceof Label) {
-				updateLabel((Label) selectionFeedbackFigure);
-				selectionFeedbackFigure.setBounds(getFeedbackBounds());
-			} else {
-				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5,
-						5));
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshFocusFeedback() {
-		if (focusFeedbackFigure != null) {
-			focusFeedbackFigure.setBounds(getFeedbackBounds());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshFeedback() {
-		refreshSelectionFeedback();
-		refreshFocusFeedback();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/LinkItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/LinkItemSemanticEditPolicy.java
deleted file mode 100644
index 37cb6ee..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/LinkItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-
-/**
- * @generated
- */
-public class LinkItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		return getMSLWrapper(new DestroyElementCommand(req));
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeCanonicalEditPolicy.java
deleted file mode 100644
index d97e439..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class RoleNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 3ac28ea..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-/**
- * @generated
- */
-public class RoleNodeGraphicalNodeEditPolicy extends
-		DiagramGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeItemSemanticEditPolicy.java
deleted file mode 100644
index 310db9d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.commands.LinkCreateCommand;
-import org.eclipse.epf.diagram.add.edit.commands.LinkReorientCommand;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-/**
- * @generated
- */
-public class RoleNodeItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		if (DiagramElementTypes.Link_3001 == req.getElementType()) {
-			return req.getTarget() == null ? getCreateStartOutgoingLink_3001Command(req)
-					: getCreateCompleteIncomingLink_3001Command(req);
-		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof Node
-				|| false == targetEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node target = (Node) targetEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(ModelPackage.eINSTANCE
-					.getNode_OutgoingConnections());
-		}
-		return getMSLWrapper(new LinkCreateCommand(req, container, source,
-				target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		switch (getVisualID(req)) {
-		case LinkEditPart.VISUAL_ID:
-			return getMSLWrapper(new LinkReorientCommand(req));
-		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeCanonicalEditPolicy.java
deleted file mode 100644
index 62e4f3e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		EObject modelObject = ((View) getHost().getModel()).getElement();
-		View viewObject = (View) getHost().getModel();
-		EObject nextValue;
-		int nodeVID;
-		for (Iterator values = ((NodeContainer) modelObject).getNodes()
-				.iterator(); values.hasNext();) {
-			nextValue = (EObject) values.next();
-			nodeVID = DiagramVisualIDRegistry.getNodeVisualID(viewObject,
-					nextValue);
-			switch (nodeVID) {
-			case RoleNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			case TaskNodeEditPart.VISUAL_ID: {
-				result.add(nextValue);
-				break;
-			}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement()
-				&& view.getElement() != null
-				&& (view.getElement().eIsProxy() || view.getElement() instanceof Node);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeGraphicalNodeEditPolicy.java
deleted file mode 100644
index b707255..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeGraphicalNodeEditPolicy extends
-		DiagramGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeItemSemanticEditPolicy.java
deleted file mode 100644
index 91a4ef0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,196 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import java.util.Iterator;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.commands.LinkCreateCommand;
-import org.eclipse.epf.diagram.add.edit.commands.LinkReorientCommand;
-import org.eclipse.epf.diagram.add.edit.commands.RoleNodeCreateCommand;
-import org.eclipse.epf.diagram.add.edit.commands.TaskNodeCreateCommand;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeRoleTaskCompartmentEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		if (DiagramElementTypes.RoleNode_2001 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(ModelPackage.eINSTANCE
-						.getNodeContainer_Nodes());
-			}
-			return getMSLWrapper(new RoleNodeCreateCommand(req));
-		}
-		if (DiagramElementTypes.TaskNode_2002 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(ModelPackage.eINSTANCE
-						.getNodeContainer_Nodes());
-			}
-			return getMSLWrapper(new TaskNodeCreateCommand(req));
-		}
-		return super.getCreateCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		addDestroyChildNodesCommand(cc, req.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addDestroyChildNodesCommand(CompoundCommand cmd,
-			boolean confirm) {
-		View view = (View) getHost().getModel();
-		for (Iterator it = view.getChildren().iterator(); it.hasNext();) {
-			org.eclipse.gmf.runtime.notation.Node node = (org.eclipse.gmf.runtime.notation.Node) it
-					.next();
-			switch (DiagramVisualIDRegistry.getVisualID(node)) {
-			case RoleNodeEditPart.VISUAL_ID:
-				cmd.add(getDestroyElementCommand(node, confirm));
-				break;
-			case TaskNodeEditPart.VISUAL_ID:
-				cmd.add(getDestroyElementCommand(node, confirm));
-				break;
-			case RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID:
-				for (Iterator cit = node.getChildren().iterator(); cit
-						.hasNext();) {
-					org.eclipse.gmf.runtime.notation.Node cnode = (org.eclipse.gmf.runtime.notation.Node) cit
-							.next();
-					switch (DiagramVisualIDRegistry.getVisualID(cnode)) {
-					}
-				}
-				break;
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		if (DiagramElementTypes.Link_3001 == req.getElementType()) {
-			return req.getTarget() == null ? getCreateStartOutgoingLink_3001Command(req)
-					: getCreateCompleteIncomingLink_3001Command(req);
-		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof Node
-				|| false == targetEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node target = (Node) targetEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(ModelPackage.eINSTANCE
-					.getNode_OutgoingConnections());
-		}
-		return getMSLWrapper(new LinkCreateCommand(req, container, source,
-				target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		switch (getVisualID(req)) {
-		case LinkEditPart.VISUAL_ID:
-			return getMSLWrapper(new LinkReorientCommand(req));
-		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeRoleTaskCompartmentCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeRoleTaskCompartmentCanonicalEditPolicy.java
deleted file mode 100644
index 7cb8308..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeRoleTaskCompartmentCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeRoleTaskCompartmentCanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy.java
deleted file mode 100644
index 24e64d6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeRoleTaskCompartmentItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeCanonicalEditPolicy.java
deleted file mode 100644
index 5196654..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class TaskNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 3bd26b8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-/**
- * @generated
- */
-public class TaskNodeGraphicalNodeEditPolicy extends
-		DiagramGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeItemSemanticEditPolicy.java
deleted file mode 100644
index 07ca2c3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/TaskNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.commands.LinkCreateCommand;
-import org.eclipse.epf.diagram.add.edit.commands.LinkReorientCommand;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-/**
- * @generated
- */
-public class TaskNodeItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		if (DiagramElementTypes.Link_3001 == req.getElementType()) {
-			return req.getTarget() == null ? getCreateStartOutgoingLink_3001Command(req)
-					: getCreateCompleteIncomingLink_3001Command(req);
-		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof Node
-				|| false == targetEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node target = (Node) targetEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(ModelPackage.eINSTANCE
-					.getNode_OutgoingConnections());
-		}
-		return getMSLWrapper(new LinkCreateCommand(req, container, source,
-				target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		switch (getVisualID(req)) {
-		case LinkEditPart.VISUAL_ID:
-			return getMSLWrapper(new LinkReorientCommand(req));
-		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeCanonicalEditPolicy.java
deleted file mode 100644
index f045947..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-
-/**
- * @generated
- */
-public class WorkProductCompositeCanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		EObject modelObject = ((View) getHost().getModel()).getElement();
-		View viewObject = (View) getHost().getModel();
-		EObject nextValue;
-		int nodeVID;
-		for (Iterator values = ((NodeContainer) modelObject).getNodes()
-				.iterator(); values.hasNext();) {
-			nextValue = (EObject) values.next();
-			nodeVID = DiagramVisualIDRegistry.getNodeVisualID(viewObject,
-					nextValue);
-			if (WorkProductDescriptorNodeEditPart.VISUAL_ID == nodeVID) {
-				result.add(nextValue);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement()
-				&& view.getElement() != null
-				&& (view.getElement().eIsProxy() || view.getElement() instanceof Node);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 41f6a39..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-/**
- * @generated
- */
-public class WorkProductCompositeGraphicalNodeEditPolicy extends
-		DiagramGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeItemSemanticEditPolicy.java
deleted file mode 100644
index 4830547..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import java.util.Iterator;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.commands.LinkCreateCommand;
-import org.eclipse.epf.diagram.add.edit.commands.LinkReorientCommand;
-import org.eclipse.epf.diagram.add.edit.commands.WorkProductDescriptorNodeCreateCommand;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeWorkProductCompartmentEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeEditPart;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-/**
- * @generated
- */
-public class WorkProductCompositeItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		if (DiagramElementTypes.WorkProductDescriptorNode_2003 == req
-				.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(ModelPackage.eINSTANCE
-						.getNodeContainer_Nodes());
-			}
-			return getMSLWrapper(new WorkProductDescriptorNodeCreateCommand(req));
-		}
-		return super.getCreateCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		addDestroyChildNodesCommand(cc, req.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addDestroyChildNodesCommand(CompoundCommand cmd,
-			boolean confirm) {
-		View view = (View) getHost().getModel();
-		for (Iterator it = view.getChildren().iterator(); it.hasNext();) {
-			org.eclipse.gmf.runtime.notation.Node node = (org.eclipse.gmf.runtime.notation.Node) it
-					.next();
-			switch (DiagramVisualIDRegistry.getVisualID(node)) {
-			case WorkProductDescriptorNodeEditPart.VISUAL_ID:
-				cmd.add(getDestroyElementCommand(node, confirm));
-				break;
-			case WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID:
-				for (Iterator cit = node.getChildren().iterator(); cit
-						.hasNext();) {
-					org.eclipse.gmf.runtime.notation.Node cnode = (org.eclipse.gmf.runtime.notation.Node) cit
-							.next();
-					switch (DiagramVisualIDRegistry.getVisualID(cnode)) {
-					}
-				}
-				break;
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		if (DiagramElementTypes.Link_3001 == req.getElementType()) {
-			return req.getTarget() == null ? getCreateStartOutgoingLink_3001Command(req)
-					: getCreateCompleteIncomingLink_3001Command(req);
-		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof Node
-				|| false == targetEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node target = (Node) targetEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(ModelPackage.eINSTANCE
-					.getNode_OutgoingConnections());
-		}
-		return getMSLWrapper(new LinkCreateCommand(req, container, source,
-				target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		switch (getVisualID(req)) {
-		case LinkEditPart.VISUAL_ID:
-			return getMSLWrapper(new LinkReorientCommand(req));
-		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeWorkProductCompartmentCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeWorkProductCompartmentCanonicalEditPolicy.java
deleted file mode 100644
index bc188b6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeWorkProductCompartmentCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class WorkProductCompositeWorkProductCompartmentCanonicalEditPolicy
-		extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy.java
deleted file mode 100644
index 05d8a3a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-
-/**
- * @generated
- */
-public class WorkProductCompositeWorkProductCompartmentItemSemanticEditPolicy
-		extends DiagramBaseItemSemanticEditPolicy {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeCanonicalEditPolicy.java
deleted file mode 100644
index d96fce4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeCanonicalEditPolicy extends
-		CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 4e43e48..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeGraphicalNodeEditPolicy extends
-		DiagramGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeItemSemanticEditPolicy.java
deleted file mode 100644
index e4a75ef..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/edit/policies/WorkProductDescriptorNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.edit.commands.LinkCreateCommand;
-import org.eclipse.epf.diagram.add.edit.commands.LinkReorientCommand;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		if (DiagramElementTypes.Link_3001 == req.getElementType()) {
-			return req.getTarget() == null ? getCreateStartOutgoingLink_3001Command(req)
-					: getCreateCompleteIncomingLink_3001Command(req);
-		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof Node
-				|| false == targetEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node target = (Node) targetEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(ModelPackage.eINSTANCE
-					.getNode_OutgoingConnections());
-		}
-		return getMSLWrapper(new LinkCreateCommand(req, container, source,
-				target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		switch (getVisualID(req)) {
-		case LinkEditPart.VISUAL_ID:
-			return getMSLWrapper(new LinkReorientCommand(req));
-		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ADDiagramEditor.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ADDiagramEditor.java
deleted file mode 100644
index a091e1c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ADDiagramEditor.java
+++ /dev/null
@@ -1,221 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.draw2d.DelegatingLayout;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.add.ADDImages;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.service.DiagramResetService;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.actions.DiagramActionsService;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.NoteEditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class ADDiagramEditor extends AbstractDiagramEditor {
-
-	DiagramActionsService actionService = null;
-	/**
-	 * @generated
-	 */
-	protected void configureGraphicalViewer() {
-		super.configureGraphicalViewer();
-		DiagramRootEditPart root = (DiagramRootEditPart) getDiagramGraphicalViewer()
-				.getRootEditPart();
-		LayeredPane printableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		FreeformLayer extLabelsLayer = new FreeformLayer();
-		extLabelsLayer.setLayoutManager(new DelegatingLayout());
-//		printableLayers.addLayerAfter(extLabelsLayer,
-//				DiagramEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
-//				LayerConstants.PRIMARY_LAYER);
-		LayeredPane scalableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.SCALABLE_LAYERS);
-		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
-		scaledFeedbackLayer.setEnabled(false);
-		scalableLayers.addLayerAfter(scaledFeedbackLayer,
-				LayerConstants.SCALED_FEEDBACK_LAYER,
-				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
-	}
-
-	@Override
-	protected void setGraphicalViewer(GraphicalViewer viewer) {
-		super.setGraphicalViewer(viewer);
-		if(actionService != null){
-			actionService.setGraphicalViewer(viewer);
-		}
-	}
-	/**
-	 * @author skannoor
-	 */
-	public void cleanUpDiagram() {
-		DiagramResetService service = new DiagramResetService(getDiagramManager().getEditingDomain(),
-				getGraphicalViewer(), getEditDomain(), getActionRegistry());
-		service.cleanUpDiagram();
-	}
-	
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#contributeToContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void contributeToContextMenu(IMenuManager menu) {
-		super.contributeToContextMenu(menu);
-
-		
-		boolean canModify = isEditable();
-
-		IAction action = getActionRegistry().getAction(DiagramConstants.RESET_DIAGRAM_LAYOUT);
-		if (action.isEnabled() && canModify) {
-			menu.insertBefore(ActionIds.ACTION_SHOW_PROPERTIES_VIEW, action);
-		}
-		IContributionItem item = menu.find(ActionIds.ACTION_TOOLBAR_ARRANGE_ALL);
-		if(item != null){
-			item.setVisible(false);
-		}
-		IContributionItem item1 = menu.find(ActionIds.MENU_FORMAT);
-		if(item1 != null){
-			if(item1 instanceof IMenuManager){
-				((IMenuManager)item1).setVisible(false);
-			}
-		}
-		
-	}
-
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.AbstractDiagramEditor#createActions()
-	 */
-	protected void createActions() {
-		super.createActions();
-		Action resetLayoutAction = new Action(
-				DiagramCoreResources.ActivityDetailDiagramEditor_ResetDiagramLayout_text) { //$NON-NLS-1$
-
-			public void run() {
-				//getActionRegistry().getAction(DiagramConstants.REFRESH).run();
-				DiagramEditorUtil.refresh(getDiagramEditPart(), new NullProgressMonitor());
-				if (getGraphicalViewer().getContents() instanceof ActivityDetailDiagramEditPart) {
-					ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-							.getContents();
-					List<EditPart> local = new ArrayList<EditPart>();
-					if(dep.getChildren() != null && !dep.getChildren().isEmpty()){
-						for(Iterator iterator = dep.getChildren().iterator(); iterator.hasNext();){
-							Object next = iterator.next();
-							if(!(next instanceof NoteEditPart)){
-								local.add((EditPart)next);
-							}
-						}
-					}
-					dep.getRecentlyAddedParts().addAll(local);
-					cleanUpDiagram();
-				}
-			}
-
-			public boolean isEnabled() {
-				return getGraphicalViewer().getSelectedEditParts().size() == 0;
-			}
-
-			public String getId() {
-				return DiagramConstants.RESET_DIAGRAM_LAYOUT;
-			}
-
-		};
-		resetLayoutAction.setDisabledImageDescriptor(ADDImages.DISABLED_IMG_DESC_RESET_DIAGRAM_LAYOUT);
-		resetLayoutAction.setImageDescriptor(ADDImages.IMG_DESC_RESET_DIAGRAM_LAYOUT);
-		getActionRegistry().registerAction(resetLayoutAction);
-	}
-	
-	public void resetLayout() {
-		if(((ActivityDetailDiagram)getDiagram().getElement()).isAutoLayout()){
-			IAction action = getActionRegistry().getAction(DiagramConstants.RESET_DIAGRAM_LAYOUT);
-			action.run();
-		}
-		else {
-			layoutRecentlyAdded();
-		}
-	}
-	
-	private void layoutRecentlyAdded() {
-		getGraphicalViewer().getContents().refresh();
-		getDiagramEditPart().getViewport().validate();
-		cleanUpDiagram();
-		EObject diagramElement = getDiagram().getElement();
-		if(diagramElement instanceof Diagram){
-			Activity activity = (Activity)((Diagram)diagramElement).getLinkedElement();
-			if(TngUtil.isLocked(activity)){
-				// Flush all commands, means will not save.
-				getCommandStack().flush();
-				// Fire dirty flag property change, no dirty flag on editor.
-				firePropertyChange(PROP_DIRTY);
-			}
-		}
-	}
-	
-	protected String getPartNamePrefix() {
-		return DiagramCoreResources.ActivityDetailDiagram_prefix; //$NON-NLS-1$
-	}
-	
-	/**
-	 * @return
-	 */
-	protected Image getPartImage() {
-		return ActivityDetailDiagramEditorPlugin.getInstance().getSharedImage(
-				"full/etool16/ADDEditor.gif"); //$NON-NLS-1$
-	}
-		
-	/**
-	 * Clients call this meethod if needed to refresh and do reset layout for 
-	 * activity detail diagram whose attribute is autolayout = true.
-	 */
-	public void runResetLayoutAction(){
-		layoutRecentlyAdded();
-		if(((ActivityDetailDiagram)getDiagram().getElement()).isAutoLayout()){
-			IAction action = getActionRegistry().getAction(DiagramConstants.RESET_DIAGRAM_LAYOUT);
-			action.run();
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ActivityDetailDiagramEditor.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ActivityDetailDiagramEditor.java
deleted file mode 100644
index e1287c2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ActivityDetailDiagramEditor.java
+++ /dev/null
@@ -1,229 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.ui.URIEditorInput;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.ui.editors.IMethodEditor;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * @generated
- */
-public class ActivityDetailDiagramEditor extends DiagramDocumentEditor
-		implements IGotoMarker, IMethodEditor {
-
-	/**
-	 * @generated
-	 */
-	public static final String ID = "org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public ActivityDetailDiagramEditor() {
-		super(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected PaletteRoot createPaletteRoot(PaletteRoot existingPaletteRoot) {
-		PaletteRoot root = super.createPaletteRoot(existingPaletteRoot);
-		new DiagramPaletteFactory().fillPalette(root);
-		return root;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setDocumentProvider(IEditorInput input) {
-		if (input instanceof IFileEditorInput
-				|| input instanceof URIEditorInput) {
-			setDocumentProvider(ActivityDetailDiagramEditorPlugin.getInstance()
-					.getDocumentProvider());
-		} else {
-			super.setDocumentProvider(input);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void gotoMarker(IMarker marker) {
-		MarkerNavigationService.getInstance().gotoMarker(this, marker);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isSaveAsAllowed() {
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void doSaveAs() {
-		performSaveAs(new NullProgressMonitor());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performSaveAs(IProgressMonitor progressMonitor) {
-		Shell shell = getSite().getShell();
-		IEditorInput input = getEditorInput();
-		SaveAsDialog dialog = new SaveAsDialog(shell);
-		IFile original = input instanceof IFileEditorInput ? ((IFileEditorInput) input)
-				.getFile()
-				: null;
-		if (original != null) {
-			dialog.setOriginalFile(original);
-		}
-		dialog.create();
-		IDocumentProvider provider = getDocumentProvider();
-		if (provider == null) {
-			// editor has been programmatically closed while the dialog was open
-			return;
-		}
-		if (provider.isDeleted(input) && original != null) {
-			String message = NLS.bind(
-					"The original file ''{0}'' has been deleted.", original
-							.getName());
-			dialog.setErrorMessage(null);
-			dialog.setMessage(message, IMessageProvider.WARNING);
-		}
-		if (dialog.open() == Window.CANCEL) {
-			if (progressMonitor != null) {
-				progressMonitor.setCanceled(true);
-			}
-			return;
-		}
-		IPath filePath = dialog.getResult();
-		if (filePath == null) {
-			if (progressMonitor != null) {
-				progressMonitor.setCanceled(true);
-			}
-			return;
-		}
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IFile file = workspaceRoot.getFile(filePath);
-		final IEditorInput newInput = new FileEditorInput(file);
-		// Check if the editor is already open
-		IEditorMatchingStrategy matchingStrategy = getEditorDescriptor()
-				.getEditorMatchingStrategy();
-		IEditorReference[] editorRefs = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage()
-				.getEditorReferences();
-		for (int i = 0; i < editorRefs.length; i++) {
-			if (matchingStrategy.matches(editorRefs[i], newInput)) {
-				MessageDialog
-						.openWarning(shell, "Problem During Save As...",
-								"Save could not be completed. Target file is already open in another editor.");
-				return;
-			}
-		}
-		boolean success = false;
-		try {
-			provider.aboutToChange(newInput);
-			getDocumentProvider(newInput).saveDocument(progressMonitor,
-					newInput,
-					getDocumentProvider().getDocument(getEditorInput()), true);
-			success = true;
-		} catch (CoreException x) {
-			IStatus status = x.getStatus();
-			if (status == null || status.getSeverity() != IStatus.CANCEL) {
-				ErrorDialog.openError(shell, "Save Problems",
-						"Could not save file.", x.getStatus());
-			}
-		} finally {
-			provider.changed(newInput);
-			if (success) {
-				setInput(newInput);
-			}
-		}
-		if (progressMonitor != null) {
-			progressMonitor.setCanceled(!success);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected PreferencesHint getPreferencesHint() {
-		return new PreferencesHint(ActivityDetailDiagramEditorPlugin.ID);
-	}
-
-	/**
-	 * @generated
-	 */
-	public Object getAdapter(Class type) {
-		if (type == IPropertySheetPage.class) {
-			return null;
-		}
-		return super.getAdapter(type);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocumentProvider getDocumentProvider(IEditorInput input) {
-		if (input instanceof IFileEditorInput
-				|| input instanceof URIEditorInput) {
-			return ActivityDetailDiagramEditorPlugin.getInstance()
-					.getDocumentProvider();
-		}
-		return super.getDocumentProvider(input);
-	}
-
-	/**
-	 * @generated
-	 */
-	public TransactionalEditingDomain getEditingDomain() {
-		IDocument document = getEditorInput() != null ? getDocumentProvider()
-				.getDocument(getEditorInput()) : null;
-		if (document instanceof IDiagramDocument) {
-			return ((IDiagramDocument) document).getEditingDomain();
-		}
-		return super.getEditingDomain();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ActivityDetailDiagramEditorPlugin.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ActivityDetailDiagramEditorPlugin.java
deleted file mode 100644
index 27c96e5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ActivityDetailDiagramEditorPlugin.java
+++ /dev/null
@@ -1,266 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.diagram.add.ActivityDetailDiagramPlugin;
-import org.eclipse.epf.diagram.model.provider.ModelItemProviderAdapterFactory;
-import org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory;
-
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * @modified
- */
-public class ActivityDetailDiagramEditorPlugin extends
-		ActivityDetailDiagramPlugin {
-
-	/**
-	 * @generated
-	 */
-	public static final String ID = "org.eclipse.epf.diagram.add"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final PreferencesHint DIAGRAM_PREFERENCES_HINT = new PreferencesHint(
-			ID);
-
-	/**
-	 * @generated
-	 */
-	private static ActivityDetailDiagramEditorPlugin instance;
-
-	/**
-	 * @generated
-	 */
-	private ComposedAdapterFactory adapterFactory;
-
-	/**
-	 * @generated
-	 */
-	private DiagramDocumentProvider myDocumentProvider;
-
-	/**
-	 * @generated
-	 */
-	public ActivityDetailDiagramEditorPlugin() {
-	}
-
-	/**
-	 * @generated
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		instance = this;
-		PreferencesHint.registerPreferenceStore(DIAGRAM_PREFERENCES_HINT,
-				getPreferenceStore());
-		adapterFactory = createAdapterFactory();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void stop(BundleContext context) throws Exception {
-		adapterFactory.dispose();
-		adapterFactory = null;
-		instance = null;
-		super.stop(context);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ActivityDetailDiagramEditorPlugin getInstance() {
-		return instance;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ComposedAdapterFactory createAdapterFactory() {
-		List factories = new ArrayList();
-		fillItemProviderFactories(factories);
-		return new ComposedAdapterFactory(factories);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void fillItemProviderFactories(List factories) {
-		factories.add(new ModelItemProviderAdapterFactory());
-		factories.add(new ModelItemProviderAdapterFactory());
-		factories.add(new UmaItemProviderAdapterFactory());
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-	}
-
-	/**
-	 * @generated
-	 */
-	public AdapterFactory getItemProvidersAdapterFactory() {
-		return adapterFactory;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ImageDescriptor getItemImageDescriptor(Object item) {
-		IItemLabelProvider labelProvider = (IItemLabelProvider) adapterFactory
-				.adapt(item, IItemLabelProvider.class);
-		if (labelProvider != null) {
-			return ExtendedImageRegistry.getInstance().getImageDescriptor(
-					labelProvider.getImage(item));
-		}
-		return null;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @generated
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getBundledImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin(ID, path);
-	}
-
-	/**
-	 * Respects images residing in any plug-in. If path is relative,
-	 * then this bundle is looked up for the image, otherwise, for absolute 
-	 * path, first segment is taken as id of plug-in with image
-	 *
-	 * @generated
-	 * @param path the path to image, either absolute (with plug-in id as first segment), or relative for bundled images
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor findImageDescriptor(String path) {
-		final IPath p = new Path(path);
-		if (p.isAbsolute() && p.segmentCount() > 1) {
-			return AbstractUIPlugin.imageDescriptorFromPlugin(p.segment(0), p
-					.removeFirstSegments(1).makeAbsolute().toString());
-		} else {
-			return getBundledImageDescriptor(p.makeAbsolute().toString());
-		}
-	}
-
-	/**
-	 * Returns string from plug-in's resource bundle
-	 * @generated
-	 */
-	public String getString(String key) {
-		return Platform.getResourceString(getInstance().getBundle(), "%" + key); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns an image for the image file at the given plug-in relative path.
-	 * Client do not need to dispose this image. Images will be disposed automatically.
-	 *
-	 * @generated
-	 * @param path the path
-	 * @return image instance
-	 */
-	public Image getBundledImage(String path) {
-		Image image = getImageRegistry().get(path);
-		if (image == null) {
-			getImageRegistry().put(path, getBundledImageDescriptor(path));
-			image = getImageRegistry().get(path);
-		}
-		return image;
-	}
-
-	/**
-	 * @generated
-	 */
-	public DiagramDocumentProvider getDocumentProvider() {
-		if (myDocumentProvider == null) {
-			myDocumentProvider = new DiagramDocumentProvider();
-		}
-		return myDocumentProvider;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void logError(String error) {
-		logError(error, null);
-	}
-
-	/**
-	 * @param throwable actual error or null could be passed
-	 * @generated
-	 */
-	public void logError(String error, Throwable throwable) {
-		if (error == null && throwable != null) {
-			error = throwable.getMessage();
-		}
-		getLog().log(
-				new Status(IStatus.ERROR, ActivityDetailDiagramEditorPlugin.ID,
-						IStatus.OK, error, throwable));
-		debug(error, throwable);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void logInfo(String message) {
-		logInfo(message, null);
-	}
-
-	/**
-	 * @param throwable actual error or null could be passed
-	 * @generated
-	 */
-	public void logInfo(String message, Throwable throwable) {
-		if (message == null && throwable != null) {
-			message = throwable.getMessage();
-		}
-		getLog().log(
-				new Status(IStatus.INFO, ActivityDetailDiagramEditorPlugin.ID,
-						IStatus.OK, message, throwable));
-		debug(message, throwable);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void debug(String message, Throwable throwable) {
-		if (!isDebugging()) {
-			return;
-		}
-		if (message != null) {
-			System.err.println(message);
-		}
-		if (throwable != null) {
-			throwable.printStackTrace();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramCreationWizard.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramCreationWizard.java
deleted file mode 100644
index 4b4cba8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramCreationWizard.java
+++ /dev/null
@@ -1,151 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.EditorCreationWizard;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * @generated
- */
-public class DiagramCreationWizard extends Wizard implements INewWizard {
-
-	/**
-	 * @generated
-	 */
-	private IWorkbench workbench;
-	/**
-	 * @generated
-	 */
-	protected IStructuredSelection selection;
-	/**
-	 * @generated
-	 */
-	protected DiagramCreationWizardPage diagramModelFilePage;
-	/**
-	 * @generated
-	 */
-	protected Resource diagram;
-	/**
-	 * @generated
-	 */
-	private boolean openNewlyCreatedDiagramEditor = true;
-
-	/**
-	 * @generated
-	 */
-	public IWorkbench getWorkbench() {
-		return workbench;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IStructuredSelection getSelection() {
-		return selection;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final Resource getDiagram() {
-		return diagram;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final boolean isOpenNewlyCreatedDiagramEditor() {
-		return openNewlyCreatedDiagramEditor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setOpenNewlyCreatedDiagramEditor(
-			boolean openNewlyCreatedDiagramEditor) {
-		this.openNewlyCreatedDiagramEditor = openNewlyCreatedDiagramEditor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void addPages() {
-		diagramModelFilePage = new DiagramCreationWizardPage(
-				"DiagramModelFile", getSelection(), "xmi"); //$NON-NLS-1$ //$NON-NLS-2$
-		diagramModelFilePage.setTitle("Create ADD Diagram");
-		diagramModelFilePage
-				.setDescription("Select file that will contain diagram and domain models.");
-		addPage(diagramModelFilePage);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean performFinish() {
-		IRunnableWithProgress op = new WorkspaceModifyOperation(null) {
-
-			protected void execute(IProgressMonitor monitor)
-					throws CoreException, InterruptedException {
-				diagram = DiagramDiagramEditorUtil.createDiagram(
-						diagramModelFilePage.getURI(), monitor);
-				if (isOpenNewlyCreatedDiagramEditor() && diagram != null) {
-					try {
-						DiagramDiagramEditorUtil.openDiagram(diagram);
-					} catch (PartInitException e) {
-						ErrorDialog.openError(getContainer().getShell(),
-								"Error opening diagram editor", null, e
-										.getStatus());
-					}
-				}
-			}
-		};
-		try {
-			getContainer().run(false, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			if (e.getTargetException() instanceof CoreException) {
-				ErrorDialog.openError(getContainer().getShell(),
-						"Creation Problems", null, ((CoreException) e
-								.getTargetException()).getStatus());
-			} else {
-				ActivityDetailDiagramEditorPlugin.getInstance().logError(
-						"Error creating diagram", e.getTargetException()); //$NON-NLS-1$
-			}
-			return false;
-		}
-		return diagram != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		this.workbench = workbench;
-		this.selection = selection;
-		setWindowTitle("New ADD Diagram");
-		setDefaultPageImageDescriptor(ActivityDetailDiagramEditorPlugin
-				.getBundledImageDescriptor("icons/wizban/NewModelWizard.gif")); //$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramCreationWizardPage.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramCreationWizardPage.java
deleted file mode 100644
index fef5e0d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramCreationWizardPage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.EditorWizardPage;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-/**
- * @generated
- */
-public class DiagramCreationWizardPage extends WizardNewFileCreationPage {
-
-	/**
-	 * @generated
-	 */
-	private final String fileExtension;
-
-	/**
-	 * @generated
-	 */
-	public DiagramCreationWizardPage(String pageName,
-			IStructuredSelection selection, String fileExtension) {
-		super(pageName, selection);
-		this.fileExtension = fileExtension;
-	}
-
-	/**
-	 * Override to create files with this extension.
-	 * 
-	 * @generated
-	 */
-	protected String getExtension() {
-		return fileExtension;
-	}
-
-	/**
-	 * @generated
-	 */
-	public URI getURI() {
-		return URI.createPlatformResourceURI(getFilePath().toString(), false);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IPath getFilePath() {
-		IPath path = getContainerFullPath();
-		if (path == null) {
-			path = new Path(""); //$NON-NLS-1$
-		}
-		String fileName = getFileName();
-		if (fileName != null) {
-			path = path.append(fileName);
-		}
-		return path;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		setFileName(DiagramDiagramEditorUtil.getUniqueFileName(
-				getContainerFullPath(), getFileName(), getExtension()));
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean validatePage() {
-		if (!super.validatePage()) {
-			return false;
-		}
-		String extension = getExtension();
-		if (extension != null
-				&& !getFilePath().toString().endsWith("." + extension)) {
-			setErrorMessage(NLS.bind(
-					"File name should have ''{0}'' extension.", extension));
-			return false;
-		}
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramActionBarContributor.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramActionBarContributor.java
deleted file mode 100644
index 4dbbfed..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramActionBarContributor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramActionBarContributor;
-
-/**
- * @generated
- */
-public class DiagramDiagramActionBarContributor extends
-		DiagramActionBarContributor {
-
-	/**
-	 * @generated
-	 */
-	protected Class getEditorClass() {
-		return ActivityDetailDiagramEditor.class;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getEditorId() {
-		return ActivityDetailDiagramEditor.ID;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramEditorUtil.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramEditorUtil.java
deleted file mode 100644
index 8f17e78..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramEditorUtil.java
+++ /dev/null
@@ -1,443 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubProgressMonitor;
-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.ResourceSet;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.edit.ui.util.EditUIUtil;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.util.IDEEditorUtil;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
-import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.gef.EditPart;
-
-/**
- * @generated
- */
-public class DiagramDiagramEditorUtil {
-
-	/**
-	 * @generated
-	 */
-	private static Map ourSaveOptions = null;
-
-	/**
-	 * @generated
-	 */
-	public static Map getSaveOptions() {
-		if (ourSaveOptions == null) {
-			ourSaveOptions = new HashMap();
-			ourSaveOptions.put(XMIResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-			ourSaveOptions.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE,
-					Boolean.TRUE);
-			ourSaveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED,
-					Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
-		}
-		return ourSaveOptions;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static boolean openDiagram(Resource diagram)
-			throws PartInitException {
-		return EditUIUtil.openEditor((EObject) diagram.getContents().get(0));
-	}
-
-	/**
-	 * @generated
-	 */
-	public static void setCharset(IFile file) {
-		if (file == null) {
-			return;
-		}
-		try {
-			file.setCharset("UTF-8", new NullProgressMonitor()); //$NON-NLS-1$
-		} catch (CoreException e) {
-			ActivityDetailDiagramEditorPlugin.getInstance().logError(
-					"Unable to set charset for file " + file.getFullPath(), e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getUniqueFileName(IPath containerFullPath,
-			String fileName, String extension) {
-		if (containerFullPath == null) {
-			containerFullPath = new Path(""); //$NON-NLS-1$
-		}
-		if (fileName == null || fileName.trim().length() == 0) {
-			fileName = "default"; //$NON-NLS-1$
-		}
-		IPath filePath = containerFullPath.append(fileName);
-		if (extension != null && !extension.equals(filePath.getFileExtension())) {
-			filePath = filePath.addFileExtension(extension);
-		}
-		extension = filePath.getFileExtension();
-		fileName = filePath.removeFileExtension().lastSegment();
-		int i = 1;
-		while (ResourcesPlugin.getWorkspace().getRoot().exists(filePath)) {
-			i++;
-			filePath = containerFullPath.append(fileName + i);
-			if (extension != null) {
-				filePath = filePath.addFileExtension(extension);
-			}
-		}
-		return filePath.lastSegment();
-	}
-
-	/**
-	 * Runs the wizard in a dialog.
-	 * 
-	 * @generated
-	 */
-	public static void runWizard(Shell shell, Wizard wizard, String settingsKey) {
-		IDialogSettings pluginDialogSettings = ActivityDetailDiagramEditorPlugin
-				.getInstance().getDialogSettings();
-		IDialogSettings wizardDialogSettings = pluginDialogSettings
-				.getSection(settingsKey);
-		if (wizardDialogSettings == null) {
-			wizardDialogSettings = pluginDialogSettings
-					.addNewSection(settingsKey);
-		}
-		wizard.setDialogSettings(wizardDialogSettings);
-		WizardDialog dialog = new WizardDialog(shell, wizard);
-		dialog.create();
-		dialog.getShell().setSize(Math.max(500, dialog.getShell().getSize().x),
-				500);
-		dialog.open();
-	}
-
-	/**
-	 * This method should be called within a workspace modify operation since it creates resources.
-	 * @generated
-	 */
-	public static Resource createDiagram(URI diagramURI,
-			IProgressMonitor progressMonitor) {
-		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
-				.createEditingDomain();
-		progressMonitor.beginTask(
-				Messages.DiagramDiagramEditorUtil_CreateDiagramProgressTask, 3);
-		final Resource diagramResource = editingDomain.getResourceSet()
-				.createResource(diagramURI);
-		final String diagramName = diagramURI.lastSegment();
-		AbstractTransactionalCommand command = new AbstractTransactionalCommand(
-				editingDomain,
-				Messages.DiagramDiagramEditorUtil_CreateDiagramCommandLabel,
-				Collections.EMPTY_LIST) {
-			protected CommandResult doExecuteWithResult(
-					IProgressMonitor monitor, IAdaptable info)
-					throws ExecutionException {
-				ActivityDetailDiagram model = createInitialModel();
-				attachModelToResource(model, diagramResource);
-
-				Diagram diagram = ViewService
-						.createDiagram(
-								model,
-								ActivityDetailDiagramEditPart.MODEL_ID,
-								ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				if (diagram != null) {
-					diagramResource.getContents().add(diagram);
-					diagram.setName(diagramName);
-					diagram.setElement(model);
-				}
-
-				try {
-
-					diagramResource
-							.save(org.eclipse.epf.diagram.add.part.DiagramDiagramEditorUtil
-									.getSaveOptions());
-				} catch (IOException e) {
-
-					ActivityDetailDiagramEditorPlugin.getInstance().logError(
-							"Unable to store model and diagram resources", e); //$NON-NLS-1$
-				}
-				return CommandResult.newOKCommandResult();
-			}
-		};
-		try {
-			OperationHistoryFactory.getOperationHistory().execute(command,
-					new SubProgressMonitor(progressMonitor, 1), null);
-		} catch (ExecutionException e) {
-			ActivityDetailDiagramEditorPlugin.getInstance().logError(
-					"Unable to create model and diagram", e); //$NON-NLS-1$
-		}
-
-		setCharset(WorkspaceSynchronizer.getFile(diagramResource));
-		return diagramResource;
-	}
-
-	/**
-	 * Create a new instance of domain element associated with canvas.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static ActivityDetailDiagram createInitialModel() {
-		return ModelFactory.eINSTANCE.createActivityDetailDiagram();
-	}
-
-	/**
-	 * Store model element in the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static void attachModelToResource(ActivityDetailDiagram model,
-			Resource resource) {
-		resource.getContents().add(model);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static void selectElementsInDiagram(
-			IDiagramWorkbenchPart diagramPart, List/*EditPart*/editParts) {
-		diagramPart.getDiagramGraphicalViewer().deselectAll();
-
-		EditPart firstPrimary = null;
-		for (Iterator it = editParts.iterator(); it.hasNext();) {
-			EditPart nextPart = (EditPart) it.next();
-			diagramPart.getDiagramGraphicalViewer().appendSelection(nextPart);
-			if (firstPrimary == null && nextPart instanceof IPrimaryEditPart) {
-				firstPrimary = nextPart;
-			}
-		}
-
-		if (!editParts.isEmpty()) {
-			diagramPart.getDiagramGraphicalViewer().reveal(
-					firstPrimary != null ? firstPrimary : (EditPart) editParts
-							.get(0));
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private static int findElementsInDiagramByID(DiagramEditPart diagramPart,
-			EObject element, List editPartCollector) {
-		IDiagramGraphicalViewer viewer = (IDiagramGraphicalViewer) diagramPart
-				.getViewer();
-		final int intialNumOfEditParts = editPartCollector.size();
-
-		if (element instanceof View) { // support notation element lookup
-			EditPart editPart = (EditPart) viewer.getEditPartRegistry().get(
-					element);
-			if (editPart != null) {
-				editPartCollector.add(editPart);
-				return 1;
-			}
-		}
-
-		String elementID = EMFCoreUtil.getProxyID(element);
-		List associatedParts = viewer.findEditPartsForElement(elementID,
-				IGraphicalEditPart.class);
-		// perform the possible hierarchy disjoint -> take the top-most parts only
-		for (Iterator editPartIt = associatedParts.iterator(); editPartIt
-				.hasNext();) {
-			EditPart nextPart = (EditPart) editPartIt.next();
-			EditPart parentPart = nextPart.getParent();
-			while (parentPart != null && !associatedParts.contains(parentPart)) {
-				parentPart = parentPart.getParent();
-			}
-			if (parentPart == null) {
-				editPartCollector.add(nextPart);
-			}
-		}
-
-		if (intialNumOfEditParts == editPartCollector.size()) {
-			if (!associatedParts.isEmpty()) {
-				editPartCollector.add(associatedParts.iterator().next());
-			} else {
-				if (element.eContainer() != null) {
-					return findElementsInDiagramByID(diagramPart, element
-							.eContainer(), editPartCollector);
-				}
-			}
-		}
-		return editPartCollector.size() - intialNumOfEditParts;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static View findView(DiagramEditPart diagramEditPart,
-			EObject targetElement, LazyElement2ViewMap lazyElement2ViewMap) {
-		boolean hasStructuralURI = false;
-		if (targetElement.eResource() instanceof XMLResource) {
-			hasStructuralURI = ((XMLResource) targetElement.eResource())
-					.getID(targetElement) == null;
-		}
-
-		View view = null;
-		if (hasStructuralURI
-				&& !lazyElement2ViewMap.getElement2ViewMap().isEmpty()) {
-			view = (View) lazyElement2ViewMap.getElement2ViewMap().get(
-					targetElement);
-		} else if (findElementsInDiagramByID(diagramEditPart, targetElement,
-				lazyElement2ViewMap.editPartTmpHolder) > 0) {
-			EditPart editPart = (EditPart) lazyElement2ViewMap.editPartTmpHolder
-					.get(0);
-			lazyElement2ViewMap.editPartTmpHolder.clear();
-			view = editPart.getModel() instanceof View ? (View) editPart
-					.getModel() : null;
-		}
-
-		return (view == null) ? diagramEditPart.getDiagramView() : view;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static class LazyElement2ViewMap {
-		/**
-		 * @generated
-		 */
-		private Map element2ViewMap;
-
-		/**
-		 * @generated
-		 */
-		private View scope;
-
-		/**
-		 * @generated
-		 */
-		private Set elementSet;
-
-		/**
-		 * @generated
-		 */
-		public final List editPartTmpHolder = new ArrayList();
-
-		/**
-		 * @generated
-		 */
-		public LazyElement2ViewMap(View scope, Set elements) {
-			this.scope = scope;
-			this.elementSet = elements;
-		}
-
-		/**
-		 * @generated
-		 */
-		public final Map getElement2ViewMap() {
-			if (element2ViewMap == null) {
-				element2ViewMap = new HashMap();
-				// map possible notation elements to itself as these can't be found by view.getElement()
-				for (Iterator it = elementSet.iterator(); it.hasNext();) {
-					EObject element = (EObject) it.next();
-					if (element instanceof View) {
-						View view = (View) element;
-						if (view.getDiagram() == scope.getDiagram()) {
-							element2ViewMap.put(element, element); // take only those that part of our diagram
-						}
-					}
-				}
-
-				buildElement2ViewMap(scope, element2ViewMap, elementSet);
-			}
-			return element2ViewMap;
-		}
-
-		/**
-		 * @generated
-		 */
-		static Map buildElement2ViewMap(View parentView, Map element2ViewMap,
-				Set elements) {
-			if (elements.size() == element2ViewMap.size())
-				return element2ViewMap;
-
-			if (parentView.isSetElement()
-					&& !element2ViewMap.containsKey(parentView.getElement())
-					&& elements.contains(parentView.getElement())) {
-				element2ViewMap.put(parentView.getElement(), parentView);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-
-			for (Iterator it = parentView.getChildren().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			for (Iterator it = parentView.getSourceEdges().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			for (Iterator it = parentView.getSourceEdges().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			return element2ViewMap;
-		}
-	} //LazyElement2ViewMap	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramFileCreator.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramFileCreator.java
deleted file mode 100644
index 451c19c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramFileCreator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.util.IDEEditorFileCreator;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-
-/**
- * @generated
- */
-public class DiagramDiagramFileCreator extends IDEEditorFileCreator {
-
-	/**
-	 * @generated
-	 */
-	private static DiagramDiagramFileCreator INSTANCE = new DiagramDiagramFileCreator();
-
-	/**
-	 * @generated
-	 */
-	public static DiagramFileCreator getInstance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getExtension() {
-		return ".add"; //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramPreferenceInitializer.java
deleted file mode 100644
index 458086f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDiagramPreferenceInitializer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @generated
- */
-public class DiagramDiagramPreferenceInitializer extends
-		DiagramPreferenceInitializer {
-
-	/**
-	 * @generated
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin
-				.getInstance().getPreferenceStore();
-	}
-	
-	@Override
-	public void initializeDefaultPreferences() {
-		super.initializeDefaultPreferences();
-		DiagramCoreUtil.setDefaultFontPreference(getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDocumentProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDocumentProvider.java
deleted file mode 100644
index c154dcf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramDocumentProvider.java
+++ /dev/null
@@ -1,1058 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import java.util.Map;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.ui.URIEditorInput;
-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.ResourceSet;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.emf.transaction.DemultiplexingListener;
-import org.eclipse.emf.transaction.NotificationFilter;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.AbstractDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.EditorStatusCodes;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.util.DiagramIOUtil;
-import org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * @generated
- */
-public class DiagramDocumentProvider extends AbstractDocumentProvider implements
-		IDiagramDocumentProvider {
-
-	/**
-	 * @generated
-	 */
-	protected ElementInfo createElementInfo(Object element)
-			throws CoreException {
-		if (false == element instanceof FileEditorInput
-				&& false == element instanceof URIEditorInput) {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							ActivityDetailDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.DiagramDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-		IEditorInput editorInput = (IEditorInput) element;
-		IDiagramDocument document = (IDiagramDocument) createDocument(editorInput);
-
-		ResourceSetInfo info = new ResourceSetInfo(document, editorInput);
-		info.setModificationStamp(computeModificationStamp(info));
-		info.fStatus = null;
-		return info;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocument createDocument(Object element) throws CoreException {
-		if (false == element instanceof FileEditorInput
-				&& false == element instanceof URIEditorInput) {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							ActivityDetailDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.DiagramDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-		IDocument document = createEmptyDocument();
-		setDocumentContent(document, (IEditorInput) element);
-		setupDocument(element, document);
-		return document;
-	}
-
-	/**
-	 * Sets up the given document as it would be provided for the given element. The
-	 * content of the document is not changed. This default implementation is empty.
-	 * Subclasses may reimplement.
-	 * 
-	 * @param element the blue-print element
-	 * @param document the document to set up
-	 * @generated
-	 */
-	protected void setupDocument(Object element, IDocument document) {
-		// for subclasses
-	}
-
-	/**
-	 * @generated
-	 */
-	private long computeModificationStamp(ResourceSetInfo info) {
-		int result = 0;
-		for (Iterator it = info.getResourceSet().getResources().iterator(); it
-				.hasNext();) {
-			Resource nextResource = (Resource) it.next();
-			IFile file = WorkspaceSynchronizer.getFile(nextResource);
-			if (file != null) {
-				if (file.getLocation() != null) {
-					result += file.getLocation().toFile().lastModified();
-				} else {
-					result += file.getModificationStamp();
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocument createEmptyDocument() {
-		DiagramDocument document = new DiagramDocument();
-		document.setEditingDomain(createEditingDomain());
-		return document;
-	}
-
-	/**
-	 * @generated
-	 */
-	private TransactionalEditingDomain createEditingDomain() {
-		TransactionalEditingDomain editingDomain = DiagramEditingDomainFactory
-				.getInstance().createEditingDomain();
-		editingDomain.setID("org.eclipse.epf.diagram.add.EditingDomain"); //$NON-NLS-1$
-		final NotificationFilter diagramResourceModifiedFilter = NotificationFilter
-				.createNotifierFilter(editingDomain.getResourceSet()).and(
-						NotificationFilter
-								.createEventTypeFilter(Notification.ADD)).and(
-						NotificationFilter.createFeatureFilter(
-								ResourceSet.class,
-								ResourceSet.RESOURCE_SET__RESOURCES));
-		editingDomain.getResourceSet().eAdapters().add(new Adapter() {
-
-			private Notifier myTarger;
-
-			public Notifier getTarget() {
-				return myTarger;
-			}
-
-			public boolean isAdapterForType(Object type) {
-				return false;
-			}
-
-			public void notifyChanged(Notification notification) {
-				if (diagramResourceModifiedFilter.matches(notification)) {
-					Object value = notification.getNewValue();
-					if (value instanceof Resource) {
-						((Resource) value).setTrackingModification(true);
-					}
-				}
-			}
-
-			public void setTarget(Notifier newTarget) {
-				myTarger = newTarget;
-			}
-
-		});
-
-		return editingDomain;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setDocumentContent(IDocument document, IEditorInput element)
-			throws CoreException {
-		IDiagramDocument diagramDocument = (IDiagramDocument) document;
-		TransactionalEditingDomain domain = diagramDocument.getEditingDomain();
-		if (element instanceof FileEditorInput) {
-			IStorage storage = ((FileEditorInput) element).getStorage();
-			Diagram diagram = DiagramIOUtil.load(domain, storage, true,
-					getProgressMonitor());
-			document.setContent(diagram);
-		} else if (element instanceof URIEditorInput) {
-			URI uri = ((URIEditorInput) element).getURI();
-			Resource resource = null;
-			try {
-				resource = domain.getResourceSet().getResource(
-						uri.trimFragment(), false);
-				if (resource == null) {
-					resource = domain.getResourceSet().createResource(
-							uri.trimFragment());
-				}
-				if (!resource.isLoaded()) {
-					try {
-						Map options = new HashMap(GMFResourceFactory
-								.getDefaultLoadOptions());
-						// @see 171060 
-						// options.put(org.eclipse.emf.ecore.xmi.XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
-						resource.load(options);
-					} catch (IOException e) {
-						resource.unload();
-						throw e;
-					}
-				}
-				if (resource == null) {
-					throw new RuntimeException(
-							Messages.DiagramDocumentProvider_UnableToLoadResourceError);
-				}
-				if (uri.fragment() != null) {
-					EObject rootElement = resource.getEObject(uri.fragment());
-					if (rootElement instanceof Diagram) {
-						document.setContent((Diagram) rootElement);
-						return;
-					}
-				} else {
-					for (Iterator it = resource.getContents().iterator(); it
-							.hasNext();) {
-						Object rootElement = it.next();
-						if (rootElement instanceof Diagram) {
-							document.setContent((Diagram) rootElement);
-							return;
-						}
-					}
-				}
-				throw new RuntimeException(
-						Messages.DiagramDocumentProvider_NoDiagramInResourceError);
-			} catch (Exception e) {
-				CoreException thrownExcp = null;
-				if (e instanceof CoreException) {
-					thrownExcp = (CoreException) e;
-				} else {
-					String msg = e.getLocalizedMessage();
-					thrownExcp = new CoreException(
-							new Status(
-									IStatus.ERROR,
-									ActivityDetailDiagramEditorPlugin.ID,
-									0,
-									msg != null ? msg
-											: Messages.DiagramDocumentProvider_DiagramLoadingError,
-									e));
-				}
-				throw thrownExcp;
-			}
-		} else {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							ActivityDetailDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.DiagramDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public long getModificationStamp(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			return computeModificationStamp(info);
-		}
-		return super.getModificationStamp(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isDeleted(Object element) {
-		IDiagramDocument document = getDiagramDocument(element);
-		if (document != null) {
-			Resource diagramResource = document.getDiagram().eResource();
-			if (diagramResource != null) {
-				IFile file = WorkspaceSynchronizer.getFile(diagramResource);
-				return file == null || file.getLocation() == null
-						|| !file.getLocation().toFile().exists();
-			}
-		}
-		return super.isDeleted(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public ResourceSetInfo getResourceSetInfo(Object editorInput) {
-		return (ResourceSetInfo) super.getElementInfo(editorInput);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void disposeElementInfo(Object element, ElementInfo info) {
-		if (info instanceof ResourceSetInfo) {
-			ResourceSetInfo resourceSetInfo = (ResourceSetInfo) info;
-			resourceSetInfo.dispose();
-		}
-		super.disposeElementInfo(element, info);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doValidateState(Object element, Object computationContext)
-			throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection files2Validate = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null && file.isReadOnly()) {
-					files2Validate.add(file);
-				}
-			}
-			ResourcesPlugin.getWorkspace().validateEdit(
-					(IFile[]) files2Validate.toArray(new IFile[files2Validate
-							.size()]), computationContext);
-		}
-
-		super.doValidateState(element, computationContext);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isReadOnly(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (info.isUpdateCache()) {
-				try {
-					updateCache(element);
-				} catch (CoreException ex) {
-					ActivityDetailDiagramEditorPlugin.getInstance().logError(
-							Messages.DiagramDocumentProvider_isModifiable, ex);
-					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
-				}
-			}
-			return info.isReadOnly();
-		}
-		return super.isReadOnly(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isModifiable(Object element) {
-		if (!isStateValidated(element)) {
-			if (element instanceof FileEditorInput
-					|| element instanceof URIEditorInput) {
-				return true;
-			}
-		}
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (info.isUpdateCache()) {
-				try {
-					updateCache(element);
-				} catch (CoreException ex) {
-					ActivityDetailDiagramEditorPlugin.getInstance().logError(
-							Messages.DiagramDocumentProvider_isModifiable, ex);
-					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
-				}
-			}
-			return info.isModifiable();
-		}
-		return super.isModifiable(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateCache(Object element) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null && file.isReadOnly()) {
-					info.setReadOnly(true);
-					info.setModifiable(false);
-					return;
-				}
-			}
-			info.setReadOnly(false);
-			info.setModifiable(true);
-			return;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doUpdateStateCache(Object element) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			info.setUpdateCache(true);
-		}
-		super.doUpdateStateCache(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isSynchronized(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			return info.isSynchronized();
-		}
-		return super.isSynchronized(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getResetRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()
-							.modifyRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getSaveRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(computeSchedulingRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getSynchronizeRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()
-							.refreshRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getValidateStateRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection files = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					files.add(file);
-				}
-			}
-			return ResourcesPlugin.getWorkspace().getRuleFactory()
-					.validateEditRule(
-							(IFile[]) files.toArray(new IFile[files.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ISchedulingRule computeSchedulingRule(IResource toCreateOrModify) {
-		if (toCreateOrModify.exists())
-			return ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(
-					toCreateOrModify);
-
-		IResource parent = toCreateOrModify;
-		do {
-			/*
-			 * XXX This is a workaround for
-			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=67601
-			 * IResourceRuleFactory.createRule should iterate the hierarchy
-			 * itself.
-			 */
-			toCreateOrModify = parent;
-			parent = toCreateOrModify.getParent();
-		} while (parent != null && !parent.exists());
-
-		return ResourcesPlugin.getWorkspace().getRuleFactory().createRule(
-				toCreateOrModify);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doSynchronize(Object element, IProgressMonitor monitor)
-			throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				handleElementChanged(info, nextResource, monitor);
-			}
-			return;
-		}
-		super.doSynchronize(element, monitor);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doSaveDocument(IProgressMonitor monitor, Object element,
-			IDocument document, boolean overwrite) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (!overwrite && !info.isSynchronized()) {
-				throw new CoreException(
-						new Status(
-								IStatus.ERROR,
-								ActivityDetailDiagramEditorPlugin.ID,
-								IStatus.OK,
-								Messages.DiagramDocumentProvider_UnsynchronizedFileSaveError,
-								null));
-			}
-			info.stopResourceListening();
-			fireElementStateChanging(element);
-			List resources = info.getResourceSet().getResources();
-			try {
-				monitor.beginTask(
-						Messages.DiagramDocumentProvider_SaveDiagramTask,
-						resources.size() + 1); //"Saving diagram"
-				for (Iterator it = resources.iterator(); it.hasNext();) {
-					Resource nextResource = (Resource) it.next();
-					monitor
-							.setTaskName(NLS
-									.bind(
-											Messages.DiagramDocumentProvider_SaveNextResourceTask,
-											nextResource.getURI()));
-					if (nextResource.isLoaded()) {
-						try {
-							nextResource.save(DiagramDiagramEditorUtil
-									.getSaveOptions());
-						} catch (IOException e) {
-							fireElementStateChangeFailed(element);
-							throw new CoreException(new Status(IStatus.ERROR,
-									ActivityDetailDiagramEditorPlugin.ID,
-									EditorStatusCodes.RESOURCE_FAILURE, e
-											.getLocalizedMessage(), null));
-						}
-					}
-					monitor.worked(1);
-				}
-				monitor.done();
-			} catch (RuntimeException x) {
-				fireElementStateChangeFailed(element);
-				throw x;
-			} finally {
-				info.startResourceListening();
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleElementChanged(ResourceSetInfo info,
-			Resource changedResource, IProgressMonitor monitor) {
-		IFile file = WorkspaceSynchronizer.getFile(changedResource);
-		if (file != null) {
-			try {
-				file.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-			} catch (CoreException ex) {
-				ActivityDetailDiagramEditorPlugin
-						.getInstance()
-						.logError(
-								Messages.DiagramDocumentProvider_handleElementContentChanged,
-								ex);
-				// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.FileDocumentProvider_handleElementContentChanged
-			}
-		}
-		changedResource.unload();
-
-		fireElementContentAboutToBeReplaced(info.getEditorInput());
-		removeUnchangedElementListeners(info.getEditorInput(), info);
-		info.fStatus = null;
-		try {
-			setDocumentContent(info.fDocument, info.getEditorInput());
-		} catch (CoreException e) {
-			info.fStatus = e.getStatus();
-		}
-		if (!info.fCanBeSaved) {
-			info.setModificationStamp(computeModificationStamp(info));
-		}
-		addUnchangedElementListeners(info.getEditorInput(), info);
-		fireElementContentReplaced(info.getEditorInput());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleElementMoved(IEditorInput input, URI uri) {
-		if (input instanceof FileEditorInput) {
-			IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
-					new Path(URI.decode(uri.path())).removeFirstSegments(1));
-			fireElementMoved(input, newFile == null ? null
-					: new FileEditorInput(newFile));
-			return;
-		}
-		// TODO: append suffix to the URI! (use diagram as a parameter)
-		fireElementMoved(input, new URIEditorInput(uri));
-	}
-
-	/**
-	 * @generated
-	 */
-	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput,
-			TransactionalEditingDomain domain) {
-		return editorInput;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IDiagramDocument getDiagramDocument(Object element) {
-		IDocument doc = getDocument(element);
-		if (doc instanceof IDiagramDocument) {
-			return (IDiagramDocument) doc;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected class ResourceSetInfo extends ElementInfo {
-
-		/**
-		 * @generated
-		 */
-		private long myModificationStamp = IResource.NULL_STAMP;
-
-		/**
-		 * @generated
-		 */
-		private WorkspaceSynchronizer mySynchronizer;
-
-		/**
-		 * @generated
-		 */
-		private Collection myUnSynchronizedResources = new ArrayList();
-
-		/**
-		 * @generated
-		 */
-		private IDiagramDocument myDocument;
-
-		/**
-		 * @generated
-		 */
-		private IEditorInput myEditorInput;
-
-		/**
-		 * @generated
-		 */
-		private boolean myUpdateCache = true;
-
-		/**
-		 * @generated
-		 */
-		private boolean myModifiable = false;
-
-		/**
-		 * @generated
-		 */
-		private boolean myReadOnly = true;
-
-		/**
-		 * @generated
-		 */
-		private ResourceSetModificationListener myResourceSetListener;
-
-		/**
-		 * @generated
-		 */
-		public ResourceSetInfo(IDiagramDocument document,
-				IEditorInput editorInput) {
-			super(document);
-			myDocument = document;
-			myEditorInput = editorInput;
-			startResourceListening();
-			myResourceSetListener = new ResourceSetModificationListener(this);
-			getResourceSet().eAdapters().add(myResourceSetListener);
-		}
-
-		/**
-		 * @generated
-		 */
-		public long getModificationStamp() {
-			return myModificationStamp;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setModificationStamp(long modificationStamp) {
-			myModificationStamp = modificationStamp;
-		}
-
-		/**
-		 * @generated
-		 */
-		public ResourceSet getResourceSet() {
-			return myDocument.getEditingDomain().getResourceSet();
-		}
-
-		/**
-		 * @generated
-		 */
-		public IEditorInput getEditorInput() {
-			return myEditorInput;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void dispose() {
-			stopResourceListening();
-			getResourceSet().eAdapters().remove(myResourceSetListener);
-			for (Iterator it = getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource resource = (Resource) it.next();
-				resource.unload();
-			}
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isSynchronized() {
-			return myUnSynchronizedResources.size() == 0;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setUnSynchronized(Resource resource) {
-			myUnSynchronizedResources.add(resource);
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setSynchronized(Resource resource) {
-			myUnSynchronizedResources.remove(resource);
-		}
-
-		/**
-		 * @generated
-		 */
-		public final void stopResourceListening() {
-			mySynchronizer.dispose();
-			mySynchronizer = null;
-		}
-
-		/**
-		 * @generated
-		 */
-		public final void startResourceListening() {
-			mySynchronizer = new WorkspaceSynchronizer(myDocument
-					.getEditingDomain(), new SynchronizerDelegate());
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isUpdateCache() {
-			return myUpdateCache;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setUpdateCache(boolean update) {
-			myUpdateCache = update;
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isModifiable() {
-			return myModifiable;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setModifiable(boolean modifiable) {
-			myModifiable = modifiable;
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isReadOnly() {
-			return myReadOnly;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setReadOnly(boolean readOnly) {
-			myReadOnly = readOnly;
-		}
-
-		/**
-		 * @generated
-		 */
-		private class SynchronizerDelegate implements
-				WorkspaceSynchronizer.Delegate {
-
-			/**
-			 * @generated
-			 */
-			public void dispose() {
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceChanged(final Resource resource) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						handleElementChanged(ResourceSetInfo.this, resource,
-								null);
-					}
-				});
-				return true;
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceDeleted(Resource resource) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						fireElementDeleted(ResourceSetInfo.this
-								.getEditorInput());
-					}
-				});
-				return true;
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceMoved(Resource resource,
-					final URI newURI) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				if (myDocument.getDiagram().eResource() == resource) {
-					Display.getDefault().asyncExec(new Runnable() {
-						public void run() {
-							handleElementMoved(ResourceSetInfo.this
-									.getEditorInput(), newURI);
-						}
-					});
-				} else {
-					handleResourceDeleted(resource);
-				}
-				return true;
-			}
-
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private class ResourceSetModificationListener extends EContentAdapter {
-
-		/**
-		 * @generated
-		 */
-		private NotificationFilter myModifiedFilter;
-
-		/**
-		 * @generated
-		 */
-		private ResourceSetInfo myInfo;
-
-		/**
-		 * @generated
-		 */
-		public ResourceSetModificationListener(ResourceSetInfo info) {
-			myInfo = info;
-			myModifiedFilter = NotificationFilter.createEventTypeFilter(
-					Notification.SET).or(
-					NotificationFilter
-							.createEventTypeFilter(Notification.UNSET)).and(
-					NotificationFilter.createFeatureFilter(Resource.class,
-							Resource.RESOURCE__IS_MODIFIED));
-		}
-
-		/**
-		 * @generated
-		 */
-		public void notifyChanged(Notification notification) {
-			if (notification.getNotifier() instanceof ResourceSet) {
-				super.notifyChanged(notification);
-			}
-			if (!notification.isTouch()
-					&& myModifiedFilter.matches(notification)) {
-				if (notification.getNotifier() instanceof Resource) {
-					Resource resource = (Resource) notification.getNotifier();
-					if (resource.isLoaded()) {
-						boolean modified = false;
-						for (Iterator it = myInfo.getResourceSet()
-								.getResources().iterator(); it.hasNext()
-								&& !modified;) {
-							Resource nextResource = (Resource) it.next();
-							if (nextResource.isLoaded()) {
-								modified = nextResource.isModified();
-							}
-						}
-						boolean dirtyStateChanged = false;
-						synchronized (myInfo) {
-							if (modified != myInfo.fCanBeSaved) {
-								myInfo.fCanBeSaved = modified;
-								dirtyStateChanged = true;
-							}
-							if (!resource.isModified()) {
-								myInfo.setSynchronized(resource);
-							}
-						}
-						if (dirtyStateChanged) {
-							fireElementDirtyStateChanged(myInfo
-									.getEditorInput(), modified);
-
-							if (!modified) {
-								myInfo
-										.setModificationStamp(computeModificationStamp(myInfo));
-							}
-						}
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramInitDiagramFileAction.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramInitDiagramFileAction.java
deleted file mode 100644
index cc6145e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramInitDiagramFileAction.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.core.resources.IFile;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
-
-import org.eclipse.jface.action.IAction;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-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.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @generated
- */
-public class DiagramInitDiagramFileAction implements IObjectActionDelegate {
-
-	/**
-	 * @generated
-	 */
-	private IWorkbenchPart targetPart;
-
-	/**
-	 * @generated
-	 */
-	private URI domainModelURI;
-
-	/**
-	 * @generated
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		this.targetPart = targetPart;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		domainModelURI = null;
-		action.setEnabled(false);
-		if (selection instanceof IStructuredSelection == false
-				|| selection.isEmpty()) {
-			return;
-		}
-		IFile file = (IFile) ((IStructuredSelection) selection)
-				.getFirstElement();
-		domainModelURI = URI.createPlatformResourceURI(file.getFullPath()
-				.toString(), true);
-		action.setEnabled(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Shell getShell() {
-		return targetPart.getSite().getShell();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void run(IAction action) {
-		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
-				.createEditingDomain();
-		ResourceSet resourceSet = new ResourceSetImpl();
-		EObject diagramRoot = null;
-		try {
-			Resource resource = resourceSet.getResource(domainModelURI, true);
-			diagramRoot = (EObject) resource.getContents().get(0);
-		} catch (WrappedException ex) {
-			ActivityDetailDiagramEditorPlugin.getInstance().logError(
-					"Unable to load resource: " + domainModelURI, ex); //$NON-NLS-1$
-		}
-		if (diagramRoot == null) {
-			MessageDialog
-					.openError(
-							getShell(),
-							Messages.DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle,
-							Messages.DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage);
-			return;
-		}
-		Wizard wizard = new DiagramNewDiagramFileWizard(domainModelURI,
-				diagramRoot, editingDomain);
-		wizard
-				.setWindowTitle(NLS
-						.bind(
-								Messages.DiagramInitDiagramFileAction_InitDiagramFileWizardTitle,
-								ActivityDetailDiagramEditPart.MODEL_ID));
-		DiagramDiagramEditorUtil.runWizard(getShell(), wizard,
-				"InitDiagramFile"); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramLoadResourceAction.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramLoadResourceAction.java
deleted file mode 100644
index 59732fc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramLoadResourceAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.emf.edit.ui.action.LoadResourceAction.LoadResourceDialog;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-/**
- * @generated
- */
-public class DiagramLoadResourceAction implements IObjectActionDelegate {
-
-	/**
-	 * @generated
-	 */
-	private ActivityDetailDiagramEditPart mySelectedElement;
-
-	/**
-	 * @generated
-	 */
-	private Shell myShell;
-
-	/**
-	 * @generated
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		myShell = targetPart.getSite().getShell();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void run(IAction action) {
-		LoadResourceDialog loadResourceDialog = new LoadResourceDialog(myShell,
-				mySelectedElement.getEditingDomain());
-		loadResourceDialog.open();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		mySelectedElement = null;
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			if (structuredSelection.size() == 1
-					&& structuredSelection.getFirstElement() instanceof ActivityDetailDiagramEditPart) {
-				mySelectedElement = (ActivityDetailDiagramEditPart) structuredSelection
-						.getFirstElement();
-			}
-		}
-		action.setEnabled(isEnabled());
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean isEnabled() {
-		return mySelectedElement != null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramMatchingStrategy.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramMatchingStrategy.java
deleted file mode 100644
index d41d1f7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramMatchingStrategy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.emf.common.ui.URIEditorInput;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditorMatchingStrategy;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PartInitException;
-
-/**
- * @generated
- */
-public class DiagramMatchingStrategy implements IEditorMatchingStrategy {
-
-	/**
-	 * @generated
-	 */
-	public boolean matches(IEditorReference editorRef, IEditorInput input) {
-		IEditorInput editorInput;
-		try {
-			editorInput = editorRef.getEditorInput();
-		} catch (PartInitException e) {
-			return false;
-		}
-
-		if (editorInput.equals(input)) {
-			return true;
-		}
-		if (editorInput instanceof URIEditorInput
-				&& input instanceof URIEditorInput) {
-			return ((URIEditorInput) editorInput).getURI().equals(
-					((URIEditorInput) input).getURI());
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramNewDiagramFileWizard.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramNewDiagramFileWizard.java
deleted file mode 100644
index 7e42c06..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramNewDiagramFileWizard.java
+++ /dev/null
@@ -1,257 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.io.IOException;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-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.ResourceSet;
-
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-
-import org.eclipse.gmf.runtime.diagram.core.services.view.CreateDiagramViewOperation;
-
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.notation.Diagram;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-
-import org.eclipse.osgi.util.NLS;
-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.Label;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @generated
- */
-public class DiagramNewDiagramFileWizard extends Wizard {
-
-	/**
-	 * @generated
-	 */
-	private TransactionalEditingDomain myEditingDomain;
-
-	/**
-	 * @generated
-	 */
-	public DiagramNewDiagramFileWizard(URI domainModelURI, EObject diagramRoot,
-			TransactionalEditingDomain editingDomain) {
-		assert domainModelURI != null : "Domain model uri must be specified"; //$NON-NLS-1$
-		assert diagramRoot != null : "Doagram root element must be specified"; //$NON-NLS-1$
-		assert editingDomain != null : "Editing domain must be specified"; //$NON-NLS-1$
-
-		myFileCreationPage = new WizardNewFileCreationPage(
-				Messages.DiagramNewDiagramFileWizard_CreationPageName,
-				StructuredSelection.EMPTY);
-		myFileCreationPage
-				.setTitle(Messages.DiagramNewDiagramFileWizard_CreationPageTitle);
-		myFileCreationPage.setDescription(NLS.bind(
-				Messages.DiagramNewDiagramFileWizard_CreationPageDescription,
-				ActivityDetailDiagramEditPart.MODEL_ID));
-		IPath filePath;
-		String fileName = domainModelURI.trimFileExtension().lastSegment();
-		if (domainModelURI.isPlatformResource()) {
-			filePath = new Path(domainModelURI.trimSegments(1)
-					.toPlatformString(true));
-		} else if (domainModelURI.isFile()) {
-			filePath = new Path(domainModelURI.trimSegments(1).toFileString());
-		} else {
-			// TODO : use some default path
-			throw new IllegalArgumentException(
-					"Unsupported URI: " + domainModelURI); //$NON-NLS-1$
-		}
-		myFileCreationPage.setContainerFullPath(filePath);
-		myFileCreationPage.setFileName(DiagramDiagramEditorUtil
-				.getUniqueFileName(filePath, fileName, "xmi")); //$NON-NLS-1$
-
-		diagramRootElementSelectionPage = new DiagramRootElementSelectionPage(
-				Messages.DiagramNewDiagramFileWizard_RootSelectionPageName);
-		diagramRootElementSelectionPage
-				.setTitle(Messages.DiagramNewDiagramFileWizard_RootSelectionPageTitle);
-		diagramRootElementSelectionPage
-				.setDescription(Messages.DiagramNewDiagramFileWizard_RootSelectionPageDescription);
-		diagramRootElementSelectionPage.setModelElement(diagramRoot);
-
-		myEditingDomain = editingDomain;
-	}
-
-	/**
-	 * @generated
-	 */
-	private WizardNewFileCreationPage myFileCreationPage;
-
-	/**
-	 * @generated
-	 */
-	private ModelElementSelectionPage diagramRootElementSelectionPage;
-
-	/**
-	 * @generated
-	 */
-	public void addPages() {
-		addPage(myFileCreationPage);
-		addPage(diagramRootElementSelectionPage);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean performFinish() {
-		List affectedFiles = new LinkedList();
-		IFile diagramFile = myFileCreationPage.createNewFile();
-		DiagramDiagramEditorUtil.setCharset(diagramFile);
-		affectedFiles.add(diagramFile);
-		URI diagramModelURI = URI.createPlatformResourceURI(diagramFile
-				.getFullPath().toString(), true);
-		ResourceSet resourceSet = myEditingDomain.getResourceSet();
-		final Resource diagramResource = resourceSet
-				.createResource(diagramModelURI);
-		AbstractTransactionalCommand command = new AbstractTransactionalCommand(
-				myEditingDomain,
-				Messages.DiagramNewDiagramFileWizard_InitDiagramCommand,
-				affectedFiles) {
-
-			protected CommandResult doExecuteWithResult(
-					IProgressMonitor monitor, IAdaptable info)
-					throws ExecutionException {
-				int diagramVID = DiagramVisualIDRegistry
-						.getDiagramVisualID(diagramRootElementSelectionPage
-								.getModelElement());
-				if (diagramVID != ActivityDetailDiagramEditPart.VISUAL_ID) {
-					return CommandResult
-							.newErrorCommandResult(Messages.DiagramNewDiagramFileWizard_IncorrectRootError);
-				}
-				Diagram diagram = ViewService
-						.createDiagram(
-								diagramRootElementSelectionPage
-										.getModelElement(),
-								ActivityDetailDiagramEditPart.MODEL_ID,
-								ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				diagramResource.getContents().add(diagram);
-				diagramResource.getContents().add(diagram.getElement());
-				return CommandResult.newOKCommandResult();
-			}
-		};
-		try {
-			OperationHistoryFactory.getOperationHistory().execute(command,
-					new NullProgressMonitor(), null);
-			diagramResource.save(DiagramDiagramEditorUtil.getSaveOptions());
-			DiagramDiagramEditorUtil.openDiagram(diagramResource);
-		} catch (ExecutionException e) {
-			ActivityDetailDiagramEditorPlugin.getInstance().logError(
-					"Unable to create model and diagram", e); //$NON-NLS-1$
-		} catch (IOException ex) {
-			ActivityDetailDiagramEditorPlugin.getInstance().logError(
-					"Save operation failed for: " + diagramModelURI, ex); //$NON-NLS-1$
-		} catch (PartInitException ex) {
-			ActivityDetailDiagramEditorPlugin.getInstance().logError(
-					"Unable to open editor", ex); //$NON-NLS-1$
-		}
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class DiagramRootElementSelectionPage extends
-			ModelElementSelectionPage {
-
-		/**
-		 * @generated
-		 */
-		protected DiagramRootElementSelectionPage(String pageName) {
-			super(pageName);
-		}
-
-		/**
-		 * @generated
-		 */
-		protected String getSelectionTitle() {
-			return Messages.DiagramNewDiagramFileWizard_RootSelectionPageSelectionTitle;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected boolean validatePage() {
-			if (selectedModelElement == null) {
-				setErrorMessage(Messages.DiagramNewDiagramFileWizard_RootSelectionPageNoSelectionMessage);
-				return false;
-			}
-			boolean result = ViewService
-					.getInstance()
-					.provides(
-							new CreateDiagramViewOperation(
-									new EObjectAdapter(selectedModelElement),
-									ActivityDetailDiagramEditPart.MODEL_ID,
-									ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT));
-			setErrorMessage(result ? null
-					: Messages.DiagramNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage);
-			return result;
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramPaletteFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramPaletteFactory.java
deleted file mode 100644
index c10e3c8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramPaletteFactory.java
+++ /dev/null
@@ -1,215 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import java.util.List;
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import java.util.ArrayList;
-
-import org.eclipse.epf.diagram.add.providers.DiagramElementTypes;
-
-import org.eclipse.gef.palette.PaletteDrawer;
-
-import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool;
-import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool;
-
-/**
- * @generated
- */
-public class DiagramPaletteFactory {
-
-	/**
-	 * @modified
-	 */
-	public void fillPalette(PaletteRoot paletteRoot) {
-		//		paletteRoot.add(createNodes1Group());
-		//		paletteRoot.add(createLinks2Group());
-	}
-
-	/**
-	 * @generated
-	 */
-	private PaletteContainer createNodes1Group() {
-		PaletteDrawer paletteContainer = new PaletteDrawer(
-				Messages.Nodes1Group_title);
-		paletteContainer.add(createRoleNode1CreationTool());
-		paletteContainer.add(createRoleTaskComposite2CreationTool());
-		paletteContainer.add(createTaskNode3CreationTool());
-		paletteContainer.add(createWorkProductDescriptorNode4CreationTool());
-		paletteContainer.add(createWorkProductComposite5CreationTool());
-		return paletteContainer;
-	}
-
-	/**
-	 * @generated
-	 */
-	private PaletteContainer createLinks2Group() {
-		PaletteDrawer paletteContainer = new PaletteDrawer(
-				Messages.Links2Group_title);
-		paletteContainer.add(createLink1CreationTool());
-		return paletteContainer;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ToolEntry createRoleNode1CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.RoleNode_2001);
-		NodeToolEntry entry = new NodeToolEntry(
-				Messages.RoleNode1CreationTool_title,
-				Messages.RoleNode1CreationTool_desc, types);
-		entry.setSmallIcon(DiagramElementTypes
-				.getImageDescriptor(DiagramElementTypes.RoleNode_2001));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ToolEntry createRoleTaskComposite2CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.RoleTaskComposite_1001);
-		NodeToolEntry entry = new NodeToolEntry(
-				Messages.RoleTaskComposite2CreationTool_title,
-				Messages.RoleTaskComposite2CreationTool_desc, types);
-		entry
-				.setSmallIcon(DiagramElementTypes
-						.getImageDescriptor(DiagramElementTypes.RoleTaskComposite_1001));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ToolEntry createTaskNode3CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.TaskNode_2002);
-		NodeToolEntry entry = new NodeToolEntry(
-				Messages.TaskNode3CreationTool_title,
-				Messages.TaskNode3CreationTool_desc, types);
-		entry.setSmallIcon(DiagramElementTypes
-				.getImageDescriptor(DiagramElementTypes.TaskNode_2002));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ToolEntry createWorkProductDescriptorNode4CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.WorkProductDescriptorNode_2003);
-		NodeToolEntry entry = new NodeToolEntry(
-				Messages.WorkProductDescriptorNode4CreationTool_title,
-				Messages.WorkProductDescriptorNode4CreationTool_desc, types);
-		entry
-				.setSmallIcon(DiagramElementTypes
-						.getImageDescriptor(DiagramElementTypes.WorkProductDescriptorNode_2003));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ToolEntry createWorkProductComposite5CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.WorkProductComposite_1002);
-		NodeToolEntry entry = new NodeToolEntry(
-				Messages.WorkProductComposite5CreationTool_title,
-				Messages.WorkProductComposite5CreationTool_desc, types);
-		entry
-				.setSmallIcon(DiagramElementTypes
-						.getImageDescriptor(DiagramElementTypes.WorkProductComposite_1002));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ToolEntry createLink1CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.Link_3001);
-		LinkToolEntry entry = new LinkToolEntry(
-				Messages.Link1CreationTool_title,
-				Messages.Link1CreationTool_desc, types);
-		entry.setSmallIcon(DiagramElementTypes
-				.getImageDescriptor(DiagramElementTypes.Link_3001));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class NodeToolEntry extends ToolEntry {
-
-		/**
-		 * @generated
-		 */
-		private final List elementTypes;
-
-		/**
-		 * @generated
-		 */
-		private NodeToolEntry(String title, String description,
-				List elementTypes) {
-			super(title, description, null, null);
-			this.elementTypes = elementTypes;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Tool createTool() {
-			Tool tool = new UnspecifiedTypeCreationTool(elementTypes);
-			tool.setProperties(getToolProperties());
-			return tool;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class LinkToolEntry extends ToolEntry {
-
-		/**
-		 * @generated
-		 */
-		private final List relationshipTypes;
-
-		/**
-		 * @generated
-		 */
-		private LinkToolEntry(String title, String description,
-				List relationshipTypes) {
-			super(title, description, null, null);
-			this.relationshipTypes = relationshipTypes;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Tool createTool() {
-			Tool tool = new UnspecifiedTypeConnectionTool(relationshipTypes);
-			tool.setProperties(getToolProperties());
-			return tool;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramVisualIDRegistry.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramVisualIDRegistry.java
deleted file mode 100644
index 365a5bc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/DiagramVisualIDRegistry.java
+++ /dev/null
@@ -1,468 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeRoleTaskCompartmentEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeWorkProductCompartmentEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeEditPart;
-
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeNameEditPart;
-
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * This registry is used to determine which type of visual object should be
- * created for the corresponding Diagram, Node, ChildNode or Link represented 
- * by a domain model object.
- *
- * @generated
- */
-public class DiagramVisualIDRegistry {
-
-	/**
-	 * @generated
-	 */
-	private static final String DEBUG_KEY = ActivityDetailDiagramEditorPlugin
-			.getInstance().getBundle().getSymbolicName()
-			+ "/debug/visualID"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static int getVisualID(View view) {
-		if (view instanceof Diagram) {
-			if (ActivityDetailDiagramEditPart.MODEL_ID.equals(view.getType())) {
-				return ActivityDetailDiagramEditPart.VISUAL_ID;
-			} else {
-				return -1;
-			}
-		}
-		return getVisualID(view.getType());
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getModelID(View view) {
-		View diagram = view.getDiagram();
-		while (view != diagram) {
-			EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
-			if (annotation != null) {
-				return (String) annotation.getDetails().get("modelID"); //$NON-NLS-1$
-			}
-			view = (View) view.eContainer();
-		}
-		return diagram != null ? diagram.getType() : null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getVisualID(String type) {
-		try {
-			return Integer.parseInt(type);
-		} catch (NumberFormatException e) {
-			if (Boolean.TRUE.toString().equalsIgnoreCase(
-					Platform.getDebugOption(DEBUG_KEY))) {
-				ActivityDetailDiagramEditorPlugin.getInstance().logError(
-						"Unable to parse view type as a visualID number: "	//$NON-NLS-1$
-								+ type);
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getType(int visualID) {
-		return String.valueOf(visualID);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getDiagramVisualID(EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getDiagramVisualID(domainElement, domainElementMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private static int getDiagramVisualID(EObject domainElement,
-			EClass domainElementMetaclass) {
-		if (ModelPackage.eINSTANCE.getActivityDetailDiagram().isSuperTypeOf(
-				domainElementMetaclass)
-				&& isDiagramActivityDetailDiagram_79((ActivityDetailDiagram) domainElement)) {
-			return ActivityDetailDiagramEditPart.VISUAL_ID;
-		}
-		return getUnrecognizedDiagramID(domainElement);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getNodeVisualID(View containerView, EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getNodeVisualID(containerView, domainElement,
-				domainElementMetaclass, null);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getNodeVisualID(View containerView,
-			EObject domainElement, EClass domainElementMetaclass,
-			String semanticHint) {
-		String containerModelID = getModelID(containerView);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID.equals(containerModelID)) {
-			return -1;
-		}
-		int containerVisualID;
-		if (ActivityDetailDiagramEditPart.MODEL_ID.equals(containerModelID)) {
-			containerVisualID = getVisualID(containerView);
-		} else {
-			if (containerView instanceof Diagram) {
-				containerVisualID = ActivityDetailDiagramEditPart.VISUAL_ID;
-			} else {
-				return -1;
-			}
-		}
-		int nodeVisualID = semanticHint != null ? getVisualID(semanticHint)
-				: -1;
-		switch (containerVisualID) {
-		case RoleTaskCompositeEditPart.VISUAL_ID:
-			if (RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID == nodeVisualID) {
-				return RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || RoleNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& ModelPackage.eINSTANCE.getRoleNode().isSuperTypeOf(
-							domainElementMetaclass)
-					&& (domainElement == null || isNodeRoleNode_2001((RoleNode) domainElement))) {
-				return RoleNodeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || TaskNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& ModelPackage.eINSTANCE.getTaskNode().isSuperTypeOf(
-							domainElementMetaclass)
-					&& (domainElement == null || isNodeTaskNode_2002((TaskNode) domainElement))) {
-				return TaskNodeEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedRoleTaskComposite_1001ChildNodeID(
-					domainElement, semanticHint);
-		case WorkProductCompositeEditPart.VISUAL_ID:
-			if (WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID == nodeVisualID) {
-				return WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || WorkProductDescriptorNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& ModelPackage.eINSTANCE.getWorkProductDescriptorNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeWorkProductDescriptorNode_2003((WorkProductDescriptorNode) domainElement))) {
-				return WorkProductDescriptorNodeEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedWorkProductComposite_1002ChildNodeID(
-					domainElement, semanticHint);
-		case RoleNodeEditPart.VISUAL_ID:
-			if (RoleNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return RoleNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedRoleNode_2001ChildNodeID(domainElement,
-					semanticHint);
-		case TaskNodeEditPart.VISUAL_ID:
-			if (TaskNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return TaskNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedTaskNode_2002ChildNodeID(domainElement,
-					semanticHint);
-		case WorkProductDescriptorNodeEditPart.VISUAL_ID:
-			if (WorkProductDescriptorNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return WorkProductDescriptorNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedWorkProductDescriptorNode_2003ChildNodeID(
-					domainElement, semanticHint);
-		case RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID:
-			return getUnrecognizedRoleTaskCompositeRoleTaskCompartment_5001ChildNodeID(
-					domainElement, semanticHint);
-		case WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID:
-			return getUnrecognizedWorkProductCompositeWorkProductCompartment_5002ChildNodeID(
-					domainElement, semanticHint);
-		case ActivityDetailDiagramEditPart.VISUAL_ID:
-			if ((semanticHint == null || RoleTaskCompositeEditPart.VISUAL_ID == nodeVisualID)
-					&& ModelPackage.eINSTANCE.getRoleTaskComposite()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeRoleTaskComposite_1001((RoleTaskComposite) domainElement))) {
-				return RoleTaskCompositeEditPart.VISUAL_ID;
-			}
-			if ((semanticHint == null || WorkProductCompositeEditPart.VISUAL_ID == nodeVisualID)
-					&& ModelPackage.eINSTANCE.getWorkProductComposite()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeWorkProductComposite_1002((WorkProductComposite) domainElement))) {
-				return WorkProductCompositeEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedActivityDetailDiagram_79ChildNodeID(
-					domainElement, semanticHint);
-		case LinkEditPart.VISUAL_ID:
-			if (LinkNameEditPart.VISUAL_ID == nodeVisualID) {
-				return LinkNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedLink_3001LinkLabelID(semanticHint);
-		}
-		return -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getLinkWithClassVisualID(EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getLinkWithClassVisualID(domainElement, domainElementMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getLinkWithClassVisualID(EObject domainElement,
-			EClass domainElementMetaclass) {
-		if (ModelPackage.eINSTANCE.getLink().isSuperTypeOf(
-				domainElementMetaclass)
-				&& (domainElement == null || isLinkWithClassLink_3001((Link) domainElement))) {
-			return LinkEditPart.VISUAL_ID;
-		} else {
-			return getUnrecognizedLinkWithClassID(domainElement);
-		}
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isDiagramActivityDetailDiagram_79(
-			ActivityDetailDiagram element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedDiagramID(EObject domainElement) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeRoleTaskComposite_1001(
-			RoleTaskComposite element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeWorkProductComposite_1002(
-			WorkProductComposite element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeRoleNode_2001(RoleNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeTaskNode_2002(TaskNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeWorkProductDescriptorNode_2003(
-			WorkProductDescriptorNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedRoleTaskComposite_1001ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedWorkProductComposite_1002ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedRoleNode_2001ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedTaskNode_2002ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedWorkProductDescriptorNode_2003ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedRoleTaskCompositeRoleTaskCompartment_5001ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedWorkProductCompositeWorkProductCompartment_5002ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedActivityDetailDiagram_79ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedLink_3001LinkLabelID(String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedLinkWithClassID(EObject domainElement) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isLinkWithClassLink_3001(Link element) {
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/Messages.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/Messages.java
deleted file mode 100644
index d81a719..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/Messages.java
+++ /dev/null
@@ -1,260 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @generated
- */
-public class Messages extends NLS {
-
-	/**
-	 * @generated
-	 */
-	static {
-		NLS.initializeMessages("messages", Messages.class); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	private Messages() {
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDiagramEditorUtil_OpenModelResourceErrorDialogTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDiagramEditorUtil_OpenModelResourceErrorDialogMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDiagramEditorUtil_CreateDiagramProgressTask;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDiagramEditorUtil_CreateDiagramCommandLabel;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_isModifiable;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_handleElementContentChanged;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_IncorrectInputError;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_UnableToLoadResourceError;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_NoDiagramInResourceError;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_DiagramLoadingError;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_UnsynchronizedFileSaveError;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_SaveDiagramTask;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramDocumentProvider_SaveNextResourceTask;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramInitDiagramFileAction_InitDiagramFileWizardTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramInitDiagramFileAction_OpenModelFileDialogTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_CreationPageName;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_CreationPageTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_CreationPageDescription;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_RootSelectionPageName;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_RootSelectionPageTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_RootSelectionPageDescription;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_RootSelectionPageSelectionTitle;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_RootSelectionPageNoSelectionMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_InitDiagramCommand;
-
-	/**
-	 * @generated
-	 */
-	public static String DiagramNewDiagramFileWizard_IncorrectRootError;
-
-	/**
-	 * @generated
-	 */
-	public static String Nodes1Group_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Links2Group_title;
-
-	/**
-	 * @generated
-	 */
-	public static String RoleNode1CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String RoleNode1CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String RoleTaskComposite2CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String RoleTaskComposite2CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String TaskNode3CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String TaskNode3CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String WorkProductDescriptorNode4CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String WorkProductDescriptorNode4CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String WorkProductComposite5CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String WorkProductComposite5CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String Link1CreationTool_title;
-
-	/**
-	 * @generated
-	 */
-	public static String Link1CreationTool_desc;
-
-	/**
-	 * @generated
-	 */
-	public static String RoleTaskCompositeRoleTaskCompartmentEditPart_title;
-
-	/**
-	 * @generated
-	 */
-	public static String WorkProductCompositeWorkProductCompartmentEditPart_title;
-
-	/**
-	 * @generated
-	 */
-	public static String CommandName_OpenDiagram;
-
-	//TODO: put accessor fields manually	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ModelElementSelectionPage.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ModelElementSelectionPage.java
deleted file mode 100644
index 0aeeed5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/part/ModelElementSelectionPage.java
+++ /dev/null
@@ -1,164 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.part;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.wizard.WizardPage;
-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.Label;
-
-/**
- * Wizard page that allows to select element from model.
- * 
- * @generated
- */
-public class ModelElementSelectionPage extends WizardPage {
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectedModelElement;
-
-	/**
-	 * @generated
-	 */
-	private TreeViewer modelVewer;
-
-	/**
-	 * @generated
-	 */
-	public ModelElementSelectionPage(String pageName) {
-		super(pageName);
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getModelElement() {
-		return selectedModelElement;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setModelElement(EObject modelElement) {
-		selectedModelElement = modelElement;
-		if (modelVewer != null) {
-			if (selectedModelElement != null) {
-				modelVewer.setInput(selectedModelElement.eResource());
-				modelVewer.setSelection(new StructuredSelection(
-						selectedModelElement));
-			} else {
-				modelVewer.setInput(null);
-			}
-			setPageComplete(validatePage());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		Composite plate = new Composite(parent, SWT.NONE);
-		plate.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		plate.setLayout(layout);
-		setControl(plate);
-
-		Label label = new Label(plate, SWT.NONE);
-		label.setText(getSelectionTitle());
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
-		modelVewer = new TreeViewer(plate, SWT.SINGLE | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER);
-		GridData layoutData = new GridData(GridData.FILL_BOTH);
-		layoutData.heightHint = 300;
-		layoutData.widthHint = 300;
-		modelVewer.getTree().setLayoutData(layoutData);
-		modelVewer.setContentProvider(new AdapterFactoryContentProvider(
-				ActivityDetailDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory()));
-		modelVewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				ActivityDetailDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory()));
-		if (selectedModelElement != null) {
-			modelVewer.setInput(selectedModelElement.eResource());
-			modelVewer.setSelection(new StructuredSelection(
-					selectedModelElement));
-		}
-		modelVewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				ModelElementSelectionPage.this
-						.updateSelection((IStructuredSelection) event
-								.getSelection());
-			}
-		});
-
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Override to provide custom model element description.
-	 * 
-	 * @generated
-	 */
-	protected String getSelectionTitle() {
-		return "Select model element:";
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateSelection(IStructuredSelection selection) {
-		selectedModelElement = null;
-		if (selection.size() == 1) {
-			Object selectedElement = selection.getFirstElement();
-			if (selectedElement instanceof IWrapperItemProvider) {
-				selectedElement = ((IWrapperItemProvider) selectedElement)
-						.getValue();
-			}
-			if (selectedElement instanceof FeatureMap.Entry) {
-				selectedElement = ((FeatureMap.Entry) selectedElement)
-						.getValue();
-			}
-			if (selectedElement instanceof EObject) {
-				selectedModelElement = (EObject) selectedElement;
-			}
-		}
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Override to provide specific validation of the selected model element.
-	 * 
-	 * @generated
-	 */
-	protected boolean validatePage() {
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramAppearancePreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramAppearancePreferencePage.java
deleted file mode 100644
index 1343051..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramAppearancePreferencePage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.preferences;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.AppearancePreferencePage;
-
-/**
- * @generated
- */
-public class DiagramAppearancePreferencePage extends AppearancePreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramAppearancePreferencePage() {
-		setPreferenceStore(ActivityDetailDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramConnectionsPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramConnectionsPreferencePage.java
deleted file mode 100644
index 06e26f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramConnectionsPreferencePage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.preferences;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.ConnectionsPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramConnectionsPreferencePage extends ConnectionsPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramConnectionsPreferencePage() {
-		setPreferenceStore(ActivityDetailDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramGeneralPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramGeneralPreferencePage.java
deleted file mode 100644
index b913397..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramGeneralPreferencePage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.preferences;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramsPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramGeneralPreferencePage extends DiagramsPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramGeneralPreferencePage() {
-		setPreferenceStore(ActivityDetailDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramPreferenceInitializer.java
deleted file mode 100644
index cc09e6a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramPreferenceInitializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @generated
- */
-public class DiagramPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * @modified
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = getPreferenceStore();
-		DiagramPrintingPreferencePage.initDefaults(store);
-		DiagramGeneralPreferencePage.initDefaults(store);
-		DiagramAppearancePreferencePage.initDefaults(store);
-		DiagramConnectionsPreferencePage.initDefaults(store);
-		DiagramRulersAndGridPreferencePage.initDefaults(store);
-		DiagramCoreUtil.setDefaultFontPreference(getPreferenceStore());
-		DiagramCoreUtil.setDefaultLineStyle(getPreferenceStore());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return ActivityDetailDiagramEditorPlugin.getInstance()
-				.getPreferenceStore();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramPrintingPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramPrintingPreferencePage.java
deleted file mode 100644
index 017061b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramPrintingPreferencePage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.preferences;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.PrintingPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramPrintingPreferencePage extends PrintingPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramPrintingPreferencePage() {
-		setPreferenceStore(ActivityDetailDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramRulersAndGridPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramRulersAndGridPreferencePage.java
deleted file mode 100644
index 98fcfb3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/preferences/DiagramRulersAndGridPreferencePage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.preferences;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.RulerGridPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramRulersAndGridPreferencePage extends RulerGridPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramRulersAndGridPreferencePage() {
-		setPreferenceStore(ActivityDetailDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramAbstractParser.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramAbstractParser.java
deleted file mode 100644
index 7592ca5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramAbstractParser.java
+++ /dev/null
@@ -1,399 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import java.text.MessageFormat;
-import java.text.ParsePosition;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EEnumLiteral;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public abstract class DiagramAbstractParser implements IParser {
-
-	/**
-	 * @generated
-	 */
-	private String viewPattern;
-
-	/**
-	 * @generated
-	 */
-	private MessageFormat viewProcessor;
-
-	/**
-	 * @generated
-	 */
-	private String editPattern;
-
-	/**
-	 * @generated
-	 */
-	private MessageFormat editProcessor;
-
-	/**
-	 * @generated
-	 */
-	public String getViewPattern() {
-		return viewPattern;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getViewProcessor() {
-		return viewProcessor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setViewPattern(String viewPattern) {
-		this.viewPattern = viewPattern;
-		viewProcessor = createViewProcessor(viewPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat createViewProcessor(String viewPattern) {
-		return new MessageFormat(viewPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditPattern() {
-		return editPattern;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getEditProcessor() {
-		return editProcessor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setEditPattern(String editPattern) {
-		this.editPattern = editPattern;
-		editProcessor = createEditProcessor(editPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat createEditProcessor(String editPattern) {
-		return new MessageFormat(editPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getPrintString(IAdaptable adapter, int flags) {
-		return getStringByPattern(adapter, flags, getViewPattern(),
-				getViewProcessor());
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditString(IAdaptable adapter, int flags) {
-		return getStringByPattern(adapter, flags, getEditPattern(),
-				getEditProcessor());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected abstract String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor);
-
-	/**
-	 * @generated
-	 */
-	public IParserEditStatus isValidEditString(IAdaptable element,
-			String editString) {
-		ParsePosition pos = new ParsePosition(0);
-		Object[] values = getEditProcessor().parse(editString, pos);
-		if (values == null) {
-			return new ParserEditStatus(ActivityDetailDiagramEditorPlugin.ID,
-					IParserEditStatus.UNEDITABLE, "Invalid input at "
-							+ pos.getErrorIndex());
-		}
-		return validateNewValues(values);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateNewValues(Object[] values) {
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, String newString,
-			int flags) {
-		Object[] values = getEditProcessor().parse(newString,
-				new ParsePosition(0));
-		if (values == null
-				|| validateNewValues(values).getCode() != IParserEditStatus.EDITABLE) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return getParseCommand(adapter, values);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected abstract ICommand getParseCommand(IAdaptable adapter,
-			Object[] values);
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor(IAdaptable element) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getModificationCommand(EObject element,
-			EStructuralFeature feature, Object value) {
-		value = getValidNewValue(feature, value);
-		if (value instanceof InvalidValue) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		SetRequest request = new SetRequest(element, feature, value);
-		return new SetValueCommand(request);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getValidValue(EStructuralFeature feature, Object value) {
-		EClassifier type = feature.getEType();
-		if (type instanceof EDataType) {
-			Class iClass = type.getInstanceClass();
-			if (String.class.equals(iClass)) {
-				if (value == null) {
-					value = ""; //$NON-NLS-1$
-				}
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getValidNewValue(EStructuralFeature feature, Object value) {
-		EClassifier type = feature.getEType();
-		if (type instanceof EDataType) {
-			Class iClass = type.getInstanceClass();
-			if (Boolean.TYPE.equals(iClass)) {
-				if (value instanceof Boolean) {
-					// ok
-				} else if (value instanceof String) {
-					value = Boolean.valueOf((String) value);
-				} else {
-					value = new InvalidValue(
-							"Value of type Boolean is expected");
-				}
-			} else if (Character.TYPE.equals(iClass)) {
-				if (value instanceof Character) {
-					// ok
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						value = new Character(s.charAt(0));
-					}
-				} else {
-					value = new InvalidValue(
-							"Value of type Character is expected");
-				}
-			} else if (Byte.TYPE.equals(iClass)) {
-				if (value instanceof Byte) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Byte(((Number) value).byteValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Byte.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Byte value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Byte is expected");
-				}
-			} else if (Short.TYPE.equals(iClass)) {
-				if (value instanceof Short) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Short(((Number) value).shortValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Short.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Short value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Short is expected");
-				}
-			} else if (Integer.TYPE.equals(iClass)) {
-				if (value instanceof Integer) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Integer(((Number) value).intValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Integer.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Integer value");
-						}
-					}
-				} else {
-					value = new InvalidValue(
-							"Value of type Integer is expected");
-				}
-			} else if (Long.TYPE.equals(iClass)) {
-				if (value instanceof Long) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Long(((Number) value).longValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Long.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Long value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Long is expected");
-				}
-			} else if (Float.TYPE.equals(iClass)) {
-				if (value instanceof Float) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Float(((Number) value).floatValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Float.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Float value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Float is expected");
-				}
-			} else if (Double.TYPE.equals(iClass)) {
-				if (value instanceof Double) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Double(((Number) value).doubleValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Double.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Double value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Double is expected");
-				}
-			} else if (type instanceof EEnum) {
-				if (value instanceof String) {
-					EEnumLiteral literal = ((EEnum) type)
-							.getEEnumLiteralByLiteral((String) value);
-					if (literal == null) {
-						value = new InvalidValue("Unknown literal: " + value);
-					} else {
-						value = literal.getInstance();
-					}
-				} else {
-					value = new InvalidValue("Value of type String is expected");
-				}
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected class InvalidValue {
-
-		private String description;
-
-		public InvalidValue(String description) {
-			this.description = description;
-		}
-
-		public String toString() {
-			return description;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramContributionItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramContributionItemProvider.java
deleted file mode 100644
index b32b01a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramContributionItemProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.AbstractContributionItemProvider;
-
-import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor;
-
-import org.eclipse.gmf.runtime.diagram.ui.printing.actions.PrintPreviewAction;
-
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.EnhancedPrintActionHelper;
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.RenderedPrintPreviewAction;
-
-import org.eclipse.jface.action.IAction;
-
-/**
- * @generated
- */
-public class DiagramContributionItemProvider extends
-		AbstractContributionItemProvider {
-
-	/**
-	 * @generated
-	 */
-	protected IAction createAction(String actionId,
-			IWorkbenchPartDescriptor partDescriptor) {
-		if (actionId.equals(PrintPreviewAction.ID)) {
-			return new RenderedPrintPreviewAction(
-					new EnhancedPrintActionHelper());
-		}
-		return super.createAction(actionId, partDescriptor);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramEditPartProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramEditPartProvider.java
deleted file mode 100644
index 48599c7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramEditPartProvider.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import java.lang.ref.WeakReference;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.CreateGraphicEditPartOperation;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.IEditPartOperation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.add.edit.parts.DiagramEditPartFactory;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-/**
- * @generated
- */
-public class DiagramEditPartProvider extends AbstractEditPartProvider {
-
-	/**
-	 * @generated
-	 */
-	private EditPartFactory factory;
-
-	/**
-	 * @generated
-	 */
-	private boolean allowCaching;
-
-	/**
-	 * @generated
-	 */
-	private WeakReference cachedPart;
-
-	/**
-	 * @generated
-	 */
-	private WeakReference cachedView;
-
-	/**
-	 * @generated
-	 */
-	public DiagramEditPartProvider() {
-		setFactory(new DiagramEditPartFactory());
-		setAllowCaching(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	public final EditPartFactory getFactory() {
-		return factory;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFactory(EditPartFactory factory) {
-		this.factory = factory;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final boolean isAllowCaching() {
-		return allowCaching;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected synchronized void setAllowCaching(boolean allowCaching) {
-		this.allowCaching = allowCaching;
-		if (!allowCaching) {
-			cachedPart = null;
-			cachedView = null;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IGraphicalEditPart createEditPart(View view) {
-		EditPart part = factory.createEditPart(null, view);
-		if (part instanceof IGraphicalEditPart) {
-			return (IGraphicalEditPart) part;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IGraphicalEditPart getCachedPart(View view) {
-		if (cachedView != null && cachedView.get() == view) {
-			return (IGraphicalEditPart) cachedPart.get();
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public synchronized IGraphicalEditPart createGraphicEditPart(View view) {
-		if (isAllowCaching()) {
-			IGraphicalEditPart part = getCachedPart(view);
-			cachedPart = null;
-			cachedView = null;
-			if (part != null) {
-				return part;
-			}
-		}
-		return createEditPart(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	public synchronized boolean provides(IOperation operation) {
-		if (operation instanceof CreateGraphicEditPartOperation) {
-			View view = ((IEditPartOperation) operation).getView();
-			if (!ActivityDetailDiagramEditPart.MODEL_ID
-					.equals(DiagramVisualIDRegistry.getModelID(view))) {
-				return false;
-			}
-			if (isAllowCaching() && getCachedPart(view) != null) {
-				return true;
-			}
-			IGraphicalEditPart part = createEditPart(view);
-			if (part != null) {
-				if (isAllowCaching()) {
-					cachedPart = new WeakReference(part);
-					cachedView = new WeakReference(view);
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramElementTypes.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramElementTypes.java
deleted file mode 100644
index aa25315..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramElementTypes.java
+++ /dev/null
@@ -1,247 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.ENamedElement;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-/**
- * @generated
- */
-public class DiagramElementTypes extends ElementInitializers {
-
-	/**
-	 * @generated
-	 */
-	private DiagramElementTypes() {
-	}
-
-	/**
-	 * @generated
-	 */
-	private static Map elements;
-
-	/**
-	 * @generated
-	 */
-	private static ImageRegistry imageRegistry;
-
-	/**
-	 * @generated
-	 */
-	private static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry();
-		}
-		return imageRegistry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static String getImageRegistryKey(ENamedElement element) {
-		return element.getName();
-	}
-
-	/**
-	 * @generated
-	 */
-	private static ImageDescriptor getProvidedImageDescriptor(
-			ENamedElement element) {
-		if (element instanceof EStructuralFeature) {
-			EStructuralFeature feature = ((EStructuralFeature) element);
-			EClass eContainingClass = feature.getEContainingClass();
-			EClassifier eType = feature.getEType();
-			if (eContainingClass != null && !eContainingClass.isAbstract()) {
-				element = eContainingClass;
-			} else if (eType instanceof EClass
-					&& !((EClass) eType).isAbstract()) {
-				element = eType;
-			}
-		}
-		if (element instanceof EClass) {
-			EClass eClass = (EClass) element;
-			if (!eClass.isAbstract()) {
-				return ActivityDetailDiagramEditorPlugin.getInstance()
-						.getItemImageDescriptor(
-								eClass.getEPackage().getEFactoryInstance()
-										.create(eClass));
-			}
-		}
-		// TODO : support structural features
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ImageDescriptor getImageDescriptor(ENamedElement element) {
-		String key = getImageRegistryKey(element);
-		ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(key);
-		if (imageDescriptor == null) {
-			imageDescriptor = getProvidedImageDescriptor(element);
-			if (imageDescriptor == null) {
-				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-			getImageRegistry().put(key, imageDescriptor);
-		}
-		return imageDescriptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static Image getImage(ENamedElement element) {
-		String key = getImageRegistryKey(element);
-		Image image = getImageRegistry().get(key);
-		if (image == null) {
-			ImageDescriptor imageDescriptor = getProvidedImageDescriptor(element);
-			if (imageDescriptor == null) {
-				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-			getImageRegistry().put(key, imageDescriptor);
-			image = getImageRegistry().get(key);
-		}
-		return image;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ImageDescriptor getImageDescriptor(IAdaptable hint) {
-		ENamedElement element = getElement(hint);
-		if (element == null) {
-			return null;
-		}
-		return getImageDescriptor(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static Image getImage(IAdaptable hint) {
-		ENamedElement element = getElement(hint);
-		if (element == null) {
-			return null;
-		}
-		return getImage(element);
-	}
-
-	/**
-	 * Returns 'type' of the ecore object associated with the hint.
-	 * 
-	 * @generated
-	 */
-	public static ENamedElement getElement(IAdaptable hint) {
-		Object type = hint.getAdapter(IElementType.class);
-		if (elements == null) {
-			elements = new IdentityHashMap();
-
-			elements.put(ActivityDetailDiagram_79, ModelPackage.eINSTANCE
-					.getActivityDetailDiagram());
-
-			elements.put(RoleTaskComposite_1001, ModelPackage.eINSTANCE
-					.getRoleTaskComposite());
-
-			elements.put(WorkProductComposite_1002, ModelPackage.eINSTANCE
-					.getWorkProductComposite());
-
-			elements.put(RoleNode_2001, ModelPackage.eINSTANCE.getRoleNode());
-
-			elements.put(TaskNode_2002, ModelPackage.eINSTANCE.getTaskNode());
-
-			elements.put(WorkProductDescriptorNode_2003, ModelPackage.eINSTANCE
-					.getWorkProductDescriptorNode());
-
-			elements.put(Link_3001, ModelPackage.eINSTANCE.getLink());
-		}
-		return (ENamedElement) elements.get(type);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType ActivityDetailDiagram_79 = getElementType("org.eclipse.epf.diagram.add.ActivityDetailDiagram_79"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType RoleNode_2001 = getElementType("org.eclipse.epf.diagram.add.RoleNode_2001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType TaskNode_2002 = getElementType("org.eclipse.epf.diagram.add.TaskNode_2002"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType WorkProductDescriptorNode_2003 = getElementType("org.eclipse.epf.diagram.add.WorkProductDescriptorNode_2003"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType RoleTaskComposite_1001 = getElementType("org.eclipse.epf.diagram.add.RoleTaskComposite_1001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType WorkProductComposite_1002 = getElementType("org.eclipse.epf.diagram.add.WorkProductComposite_1002"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType Link_3001 = getElementType("org.eclipse.epf.diagram.add.Link_3001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	private static IElementType getElementType(String id) {
-		return ElementTypeRegistry.getInstance().getType(id);
-	}
-
-	/**
-	 * @generated
-	 */
-	private static Set KNOWN_ELEMENT_TYPES;
-
-	/**
-	 * @generated
-	 */
-	public static boolean isKnownElementType(IElementType elementType) {
-		if (KNOWN_ELEMENT_TYPES == null) {
-			KNOWN_ELEMENT_TYPES = new HashSet();
-			KNOWN_ELEMENT_TYPES.add(ActivityDetailDiagram_79);
-			KNOWN_ELEMENT_TYPES.add(RoleTaskComposite_1001);
-			KNOWN_ELEMENT_TYPES.add(WorkProductComposite_1002);
-			KNOWN_ELEMENT_TYPES.add(RoleNode_2001);
-			KNOWN_ELEMENT_TYPES.add(TaskNode_2002);
-			KNOWN_ELEMENT_TYPES.add(WorkProductDescriptorNode_2003);
-			KNOWN_ELEMENT_TYPES.add(Link_3001);
-		}
-		return KNOWN_ELEMENT_TYPES.contains(elementType);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramIconProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramIconProvider.java
deleted file mode 100644
index 87955bc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramIconProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.icon.GetIconOperation;
-import org.eclipse.gmf.runtime.common.ui.services.icon.IIconProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class DiagramIconProvider extends AbstractProvider implements
-		IIconProvider {
-
-	/**
-	 * @generated
-	 */
-	public Image getIcon(IAdaptable hint, int flags) {
-		return DiagramElementTypes.getImage(hint);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetIconOperation) {
-			return ((GetIconOperation) operation).execute(this) != null;
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramModelingAssistantProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramModelingAssistantProvider.java
deleted file mode 100644
index 3d7bf75..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramModelingAssistantProvider.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.modelingassistant.ModelingAssistantProvider;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class DiagramModelingAssistantProvider extends ModelingAssistantProvider {
-
-	/**
-	 * @modified
-	 */
-	public List getTypesForPopupBar(IAdaptable host) {
-		IGraphicalEditPart editPart = (IGraphicalEditPart) host
-				.getAdapter(IGraphicalEditPart.class);
-		if (editPart instanceof RoleTaskCompositeEditPart) {
-			List types = new ArrayList();
-			//			types.add(DiagramElementTypes.RoleNode_2001);
-			//			types.add(DiagramElementTypes.TaskNode_2002);
-			return types;
-		}
-		if (editPart instanceof WorkProductCompositeEditPart) {
-			List types = new ArrayList();
-			//			types.add(DiagramElementTypes.WorkProductDescriptorNode_2003);
-			return types;
-		}
-		if (editPart instanceof ActivityDetailDiagramEditPart) {
-			List types = new ArrayList();
-			types.add(DiagramElementTypes.RoleTaskComposite_1001);
-			types.add(DiagramElementTypes.WorkProductComposite_1002);
-			return types;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnSource(IAdaptable source) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnTarget(IAdaptable target) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnSourceAndTarget(IAdaptable source,
-			IAdaptable target) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getTypesForSource(IAdaptable target,
-			IElementType relationshipType) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getTypesForTarget(IAdaptable source,
-			IElementType relationshipType) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject selectExistingElementForSource(IAdaptable target,
-			IElementType relationshipType) {
-		return selectExistingElement(target, getTypesForSource(target,
-				relationshipType));
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject selectExistingElementForTarget(IAdaptable source,
-			IElementType relationshipType) {
-		return selectExistingElement(source, getTypesForTarget(source,
-				relationshipType));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectExistingElement(IAdaptable host, Collection types) {
-		if (types.isEmpty()) {
-			return null;
-		}
-		IGraphicalEditPart editPart = (IGraphicalEditPart) host
-				.getAdapter(IGraphicalEditPart.class);
-		if (editPart == null) {
-			return null;
-		}
-		Diagram diagram = (Diagram) editPart.getRoot().getContents().getModel();
-		Collection elements = new HashSet();
-		for (Iterator it = diagram.getElement().eAllContents(); it.hasNext();) {
-			EObject element = (EObject) it.next();
-			if (isApplicableElement(element, types)) {
-				elements.add(element);
-			}
-		}
-		if (elements.isEmpty()) {
-			return null;
-		}
-		return selectElement((EObject[]) elements.toArray(new EObject[elements
-				.size()]));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isApplicableElement(EObject element, Collection types) {
-		IElementType type = ElementTypeRegistry.getInstance().getElementType(
-				element);
-		return types.contains(type);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectElement(EObject[] elements) {
-		Shell shell = Display.getCurrent().getActiveShell();
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				ActivityDetailDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory());
-		ElementListSelectionDialog dialog = new ElementListSelectionDialog(
-				shell, labelProvider);
-		dialog.setMessage("Available domain model elements:");
-		dialog.setTitle("Select domain model element");
-		dialog.setMultipleSelection(false);
-		dialog.setElements(elements);
-		EObject selected = null;
-		if (dialog.open() == Window.OK) {
-			selected = (EObject) dialog.getFirstResult();
-		}
-		return selected;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramPaletteProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramPaletteProvider.java
deleted file mode 100644
index a5bae49..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramPaletteProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import java.util.Map;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.diagram.ui.services.palette.IPaletteProvider;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.epf.diagram.add.part.DiagramPaletteFactory;
-
-/**
- * @generated
- */
-public class DiagramPaletteProvider extends AbstractProvider implements
-		IPaletteProvider {
-
-	/**
-	 * @generated
-	 */
-	public void contributeToPalette(IEditorPart editor, Object content,
-			PaletteRoot root, Map predefinedEntries) {
-		DiagramPaletteFactory factory = new DiagramPaletteFactory();
-		factory.fillPalette(root);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setContributions(IConfigurationElement configElement) {
-		// no configuration
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		return false; // all logic is done in the service
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramParserProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramParserProvider.java
deleted file mode 100644
index 8729503..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramParserProvider.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.parser.GetParserOperation;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.add.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeNameEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-/**
- * @generated
- */
-public class DiagramParserProvider extends AbstractProvider implements
-		IParserProvider {
-
-	/**
-	 * @generated
-	 */
-	private IParser roleNodeRoleNodeName_4001Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getRoleNodeRoleNodeName_4001Parser() {
-		if (roleNodeRoleNodeName_4001Parser == null) {
-			roleNodeRoleNodeName_4001Parser = createRoleNodeRoleNodeName_4001Parser();
-		}
-		return roleNodeRoleNodeName_4001Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createRoleNodeRoleNodeName_4001Parser() {
-		DiagramStructuralFeatureParser parser = new DiagramStructuralFeatureParser(
-				ModelPackage.eINSTANCE.getNamedNode_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser taskNodeTaskNodeName_4002Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getTaskNodeTaskNodeName_4002Parser() {
-		if (taskNodeTaskNodeName_4002Parser == null) {
-			taskNodeTaskNodeName_4002Parser = createTaskNodeTaskNodeName_4002Parser();
-		}
-		return taskNodeTaskNodeName_4002Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createTaskNodeTaskNodeName_4002Parser() {
-		DiagramStructuralFeatureParser parser = new DiagramStructuralFeatureParser(
-				ModelPackage.eINSTANCE.getNamedNode_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser workProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getWorkProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser() {
-		if (workProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser == null) {
-			workProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser = createWorkProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser();
-		}
-		return workProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createWorkProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser() {
-		DiagramStructuralFeatureParser parser = new DiagramStructuralFeatureParser(
-				ModelPackage.eINSTANCE.getNamedNode_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser linkLinkName_4004Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getLinkLinkName_4004Parser() {
-		if (linkLinkName_4004Parser == null) {
-			linkLinkName_4004Parser = createLinkLinkName_4004Parser();
-		}
-		return linkLinkName_4004Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createLinkLinkName_4004Parser() {
-		DiagramStructuralFeatureParser parser = new DiagramStructuralFeatureParser(
-				ModelPackage.eINSTANCE.getLink_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser getParser(int visualID) {
-		switch (visualID) {
-		case RoleNodeNameEditPart.VISUAL_ID:
-			return getRoleNodeRoleNodeName_4001Parser();
-		case TaskNodeNameEditPart.VISUAL_ID:
-			return getTaskNodeTaskNodeName_4002Parser();
-		case WorkProductDescriptorNodeNameEditPart.VISUAL_ID:
-			return getWorkProductDescriptorNodeWorkProductDescriptorNodeName_4003Parser();
-		case LinkNameEditPart.VISUAL_ID:
-			return getLinkLinkName_4004Parser();
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser(IAdaptable hint) {
-		String vid = (String) hint.getAdapter(String.class);
-		if (vid != null) {
-			return getParser(DiagramVisualIDRegistry.getVisualID(vid));
-		}
-		View view = (View) hint.getAdapter(View.class);
-		if (view != null) {
-			return getParser(DiagramVisualIDRegistry.getVisualID(view));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetParserOperation) {
-			IAdaptable hint = ((GetParserOperation) operation).getHint();
-			if (DiagramElementTypes.getElement(hint) == null) {
-				return false;
-			}
-			return getParser(hint) != null;
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramPropertyProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramPropertyProvider.java
deleted file mode 100644
index 922cc2f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramPropertyProvider.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.properties.GetPropertySourceOperation;
-import org.eclipse.gmf.runtime.common.ui.services.properties.ICompositePropertySource;
-import org.eclipse.gmf.runtime.common.ui.services.properties.IPropertiesProvider;
-import org.eclipse.gmf.runtime.emf.ui.properties.providers.GenericEMFPropertiesProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-/**
- * @generated
- */
-public class DiagramPropertyProvider extends GenericEMFPropertiesProvider
-		implements IPropertiesProvider {
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetPropertySourceOperation) {
-			Object object = ((GetPropertySourceOperation) operation)
-					.getObject();
-			return getSemanticElement(object) != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICompositePropertySource getPropertySource(Object object) {
-		EObject element = getSemanticElement(object);
-		if (element != null) {
-			return super.getPropertySource(element);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getSemanticElement(Object object) {
-		View view = null;
-		if (object instanceof View) {
-			view = (View) object;
-		} else if (object instanceof EditPart) {
-			EditPart editPart = (EditPart) object;
-			if (editPart.getModel() instanceof View) {
-				view = (View) editPart.getModel();
-			}
-		}
-		if (view != null
-				&& ActivityDetailDiagramEditPart.MODEL_ID
-						.equals(DiagramVisualIDRegistry.getModelID(view))) {
-			return view.getElement();
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramStructuralFeatureParser.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramStructuralFeatureParser.java
deleted file mode 100644
index 31924cf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramStructuralFeatureParser.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import java.text.FieldPosition;
-import java.text.MessageFormat;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class DiagramStructuralFeatureParser extends DiagramAbstractParser {
-
-	/**
-	 * @generated
-	 */
-	public static final MessageFormat DEFAULT_PROCESSOR = new MessageFormat(
-			"{0}"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	private EStructuralFeature feature;
-
-	/**
-	 * @generated
-	 */
-	public DiagramStructuralFeatureParser(EStructuralFeature feature) {
-		this.feature = feature;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getViewProcessor() {
-		MessageFormat processor = super.getViewProcessor();
-		return processor == null ? DEFAULT_PROCESSOR : processor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getEditProcessor() {
-		MessageFormat processor = super.getEditProcessor();
-		return processor == null ? DEFAULT_PROCESSOR : processor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getDomainElement(EObject element) {
-		return element;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		element = getDomainElement(element);
-		return getStringByPattern(element, feature, processor);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(EObject element,
-			EStructuralFeature feature, MessageFormat processor) {
-		Object value = element == null ? null : element.eGet(feature);
-		value = getValidValue(feature, value);
-		return processor.format(new Object[] { value }, new StringBuffer(),
-				new FieldPosition(0)).toString();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateValues(Object[] values) {
-		if (values.length > 1) {
-			return ParserEditStatus.UNEDITABLE_STATUS;
-		}
-		Object value = values.length == 1 ? values[0] : null;
-		value = getValidNewValue(feature, value);
-		if (value instanceof InvalidValue) {
-			return new ParserEditStatus(ActivityDetailDiagramEditorPlugin.ID,
-					IParserEditStatus.UNEDITABLE, value.toString());
-		}
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, Object[] values) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		element = getDomainElement(element);
-		if (element == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		TransactionalEditingDomain editingDomain = TransactionUtil
-				.getEditingDomain(element);
-		if (editingDomain == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Object value = values.length == 1 ? values[0] : null;
-		ICommand command = getModificationCommand(element, feature, value);
-		return new CompositeTransactionalCommand(editingDomain, command
-				.getLabel(), Collections.singletonList(command));
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isAffectingEvent(Object event, int flags) {
-		if (event instanceof Notification) {
-			return isAffectingFeature(((Notification) event).getFeature());
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isAffectingFeature(Object eventFeature) {
-		return feature == eventFeature;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramStructuralFeaturesParser.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramStructuralFeaturesParser.java
deleted file mode 100644
index 8785c45..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramStructuralFeaturesParser.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import java.text.FieldPosition;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class DiagramStructuralFeaturesParser extends DiagramAbstractParser {
-
-	/**
-	 * @generated
-	 */
-	private List features;
-
-	/**
-	 * @generated
-	 */
-	public DiagramStructuralFeaturesParser(List features) {
-		this.features = features;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		List values = new ArrayList(features.size());
-		for (Iterator it = features.iterator(); it.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) it.next();
-			Object value = element.eGet(feature);
-			value = getValidValue(feature, value);
-			values.add(value);
-		}
-		return processor.format(values.toArray(new Object[values.size()]),
-				new StringBuffer(), new FieldPosition(0)).toString();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateValues(Object[] values) {
-		if (values.length != features.size()) {
-			return ParserEditStatus.UNEDITABLE_STATUS;
-		}
-		for (int i = 0; i < values.length; i++) {
-			Object value = getValidNewValue((EStructuralFeature) features
-					.get(i), values[i]);
-			if (value instanceof InvalidValue) {
-				return new ParserEditStatus(
-						ActivityDetailDiagramEditorPlugin.ID,
-						IParserEditStatus.UNEDITABLE, value.toString());
-			}
-		}
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, Object[] values) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		if (element == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		TransactionalEditingDomain editingDomain = TransactionUtil
-				.getEditingDomain(element);
-		if (editingDomain == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		CompositeTransactionalCommand command = new CompositeTransactionalCommand(
-				editingDomain, "Set Values"); //$NON-NLS-1$
-		for (int i = 0; i < values.length; i++) {
-			EStructuralFeature feature = (EStructuralFeature) features.get(i);
-			command
-					.compose(getModificationCommand(element, feature, values[i]));
-		}
-		return command;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isAffectingEvent(Object event, int flags) {
-		if (event instanceof Notification) {
-			Object feature = ((Notification) event).getFeature();
-			if (features.contains(feature)) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramViewProvider.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramViewProvider.java
deleted file mode 100644
index 0d82b08..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/DiagramViewProvider.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gmf.runtime.diagram.core.providers.AbstractViewProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeRoleTaskCompartmentEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeNameEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeWorkProductCompartmentEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeEditPart;
-
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeNameEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.epf.diagram.add.view.factories.ActivityDetailDiagramViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.LinkNameViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.LinkViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.RoleNodeNameViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.RoleNodeViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.RoleTaskCompositeRoleTaskCompartmentViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.RoleTaskCompositeViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.TaskNodeNameViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.TaskNodeViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.WorkProductCompositeViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.WorkProductCompositeWorkProductCompartmentViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.WorkProductDescriptorNodeNameViewFactory;
-import org.eclipse.epf.diagram.add.view.factories.WorkProductDescriptorNodeViewFactory;
-
-/**
- * @generated
- */
-public class DiagramViewProvider extends AbstractViewProvider {
-
-	/**
-	 * @generated
-	 */
-	protected Class getDiagramViewClass(IAdaptable semanticAdapter,
-			String diagramKind) {
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		if (ActivityDetailDiagramEditPart.MODEL_ID.equals(diagramKind)
-				&& DiagramVisualIDRegistry.getDiagramVisualID(semanticElement) != -1) {
-			return ActivityDetailDiagramViewFactory.class;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Class getNodeViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		if (containerView == null) {
-			return null;
-		}
-		IElementType elementType = getSemanticElementType(semanticAdapter);
-		if (elementType != null
-				&& !DiagramElementTypes.isKnownElementType(elementType)) {
-			return null;
-		}
-		EClass semanticType = getSemanticEClass(semanticAdapter);
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		int nodeVID = DiagramVisualIDRegistry.getNodeVisualID(containerView,
-				semanticElement, semanticType, semanticHint);
-		switch (nodeVID) {
-		case RoleTaskCompositeEditPart.VISUAL_ID:
-			return RoleTaskCompositeViewFactory.class;
-		case WorkProductCompositeEditPart.VISUAL_ID:
-			return WorkProductCompositeViewFactory.class;
-		case RoleNodeEditPart.VISUAL_ID:
-			return RoleNodeViewFactory.class;
-		case RoleNodeNameEditPart.VISUAL_ID:
-			return RoleNodeNameViewFactory.class;
-		case TaskNodeEditPart.VISUAL_ID:
-			return TaskNodeViewFactory.class;
-		case TaskNodeNameEditPart.VISUAL_ID:
-			return TaskNodeNameViewFactory.class;
-		case WorkProductDescriptorNodeEditPart.VISUAL_ID:
-			return WorkProductDescriptorNodeViewFactory.class;
-		case WorkProductDescriptorNodeNameEditPart.VISUAL_ID:
-			return WorkProductDescriptorNodeNameViewFactory.class;
-		case RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID:
-			return RoleTaskCompositeRoleTaskCompartmentViewFactory.class;
-		case WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID:
-			return WorkProductCompositeWorkProductCompartmentViewFactory.class;
-		case LinkNameEditPart.VISUAL_ID:
-			return LinkNameViewFactory.class;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Class getEdgeViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		IElementType elementType = getSemanticElementType(semanticAdapter);
-		if (elementType != null
-				&& !DiagramElementTypes.isKnownElementType(elementType)) {
-			return null;
-		}
-		EClass semanticType = getSemanticEClass(semanticAdapter);
-		if (semanticType == null) {
-			return null;
-		}
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		int linkVID = DiagramVisualIDRegistry.getLinkWithClassVisualID(
-				semanticElement, semanticType);
-		switch (linkVID) {
-		case LinkEditPart.VISUAL_ID:
-			return LinkViewFactory.class;
-		}
-		return getUnrecognizedConnectorViewClass(semanticAdapter,
-				containerView, semanticHint);
-	}
-
-	/**
-	 * @generated
-	 */
-	private IElementType getSemanticElementType(IAdaptable semanticAdapter) {
-		if (semanticAdapter == null) {
-			return null;
-		}
-		return (IElementType) semanticAdapter.getAdapter(IElementType.class);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Class getUnrecognizedConnectorViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		// Handle unrecognized child node classes here
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/ElementInitializers.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/ElementInitializers.java
deleted file mode 100644
index c55f784..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/providers/ElementInitializers.java
+++ /dev/null
@@ -1,20 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.add.providers;
-
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class ElementInitializers {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/service/DiagramResetService.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/service/DiagramResetService.java
deleted file mode 100644
index 5d3bb3f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/service/DiagramResetService.java
+++ /dev/null
@@ -1,798 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.service;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart;
-import org.eclipse.epf.diagram.core.commands.ChangeBoundsCommand;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * Service class for reset the Activity Detail Diagram.
- * Code migrated from old diagram code.   
- * 
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- * @since 1.2
- **/
-public class DiagramResetService {
-
-	private DefaultEditDomain editDomain;
-
-	private GraphicalViewer graphicalViewer;
-
-	private ActionRegistry actionRegistry;
-
-	private InternalTransactionalEditingDomain transactionDomain;
-	
-	int delta = 0;
-	
-	private static final int IMG_HEIGHT = 32;
-
-	public DiagramResetService(InternalTransactionalEditingDomain transactionDomain, 
-			GraphicalViewer graphicalViewer, DefaultEditDomain editDomain,
-			ActionRegistry actionRegistry) {
-		this.transactionDomain = transactionDomain;
-		this.graphicalViewer = graphicalViewer;
-		this.editDomain = editDomain;
-		this.actionRegistry = actionRegistry;
-	}
-
-	private GraphicalViewer getGraphicalViewer() {
-		return graphicalViewer;
-	}
-
-	/**
-	 * Returns the command stack.
-	 * 
-	 * @return the command stack
-	 */
-	protected CommandStack getCommandStack() {
-		return getEditDomain().getCommandStack();
-	}
-
-	/**
-	 * Returns the edit domain.
-	 * 
-	 * @return the edit domain
-	 */
-	protected DefaultEditDomain getEditDomain() {
-		return editDomain;
-	}
-
-	/**
-	 * Lazily creates and returns the action registry.
-	 * 
-	 * @return the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		return actionRegistry;
-	}
-
-	/**
-	 * Method used only in ActivityDetailDiagram or any diagram need auto-layout.
-	 * Method will verify recently added editparts in the Activitydetaildiagram editpart
-	 * indirectly from WorkBreakdownStructure (means any descriptors created in wbs, corresponding
-	 * EditPart will get created in ActivityDetailDiagram Viewer) and does auto-layout
-	 * all the new added editparts and existing ones. 
-	 * 
-	 */
-	public void cleanUpDiagram() {
-		if (getGraphicalViewer().getContents() instanceof ActivityDetailDiagramEditPart) {
-			ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-					.getContents();
-			List children = dep.getRecentlyAddedParts();
-			
-			// If any oblique links rectify them to straight. 
-//			anyObliqueLinks(dep, children);
-			
-			if (!children.isEmpty()) {
-				Comparator<Object> comparator = new Comparator<Object>() {
-
-					public int compare(Object arg0, Object arg1) {
-						int rc = 0;
-						if (arg0 instanceof RoleTaskCompositeEditPart) {
-							if (!(arg1 instanceof RoleTaskCompositeEditPart))
-								rc = -1;
-						} else if (arg1 instanceof RoleTaskCompositeEditPart)
-							rc = 1;
-						return rc;
-					}
-					
-				};
-
-				Object[] array = children.toArray();
-				Arrays.sort(array, comparator);
-				for (int a = 0; a < array.length; a++) {
-					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[a];
-					adjustSize(ep);
-				}
-				
-				// force relayout after size adjustment
-				//
-				dep.getViewport().validate();
-				
-				for (int b = 0; b < array.length; b++) {
-					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[b];
-					cleanUp(ep);
-				}
-				for (int c = 0; c < array.length; c++) {
-					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[c];
-					reduceLinkLength(ep);
-				}
-//				for (int c = 0; c < array.length; c++) {
-//					AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) array[c];
-//					if(ep instanceof RoleTaskCompositeEditPart){
-//						resetSizes(ep, ep);
-//					}
-//				}
-				packDiagram();
-				dep.refresh();
-				dep.clearRecentlyAddedParts();
-				getGraphicalViewer().setSelection(new StructuredSelection());
-			}
-		}
-	}
-
-	/**
-	 * This method does a vertical alignment of all nodes with links
-	 */
-	private void cleanUp(AbstractGraphicalEditPart ep) {
-		if (!(ep instanceof WorkProductCompositeEditPart)) {
-			List sourceLinks = ep.getSourceConnections();
-			if (sourceLinks.size() > 0) {
-				for (int b = 0; b < sourceLinks.size(); b++) {
-					ConnectionNodeEditPart link = (ConnectionNodeEditPart) sourceLinks.get(b);
-					AbstractGraphicalEditPart target = (AbstractGraphicalEditPart) link
-							.getTarget();
-					int w = target.getFigure().getBounds().width;
-					int ew = ep.getFigure().getPreferredSize().width;
-					if (w < ew) {
-						Command c = new ChangeBoundsCommand(transactionDomain, ((Node) ep
-								.getModel()), target.getFigure().getBounds()
-								.getLocation(), w, target.getFigure().getPreferredSize().height);
-						getCommandStack().execute(c);
-						int h = target.getFigure().getPreferredSize().height;
-						target.getFigure()
-								.setPreferredSize(new Dimension(w, h));
-						target.getFigure().setSize(new Dimension(w, h));
-					}
-					List list = new ArrayList();
-					list.add(ep);
-					list.add(target);
-					verticalAlignToFirstSelected(list);
-				}
-			}
-			List targetLinks = ep.getTargetConnections();
-			if (targetLinks.size() > 0) {
-				for (int b = 0; b < targetLinks.size(); b++) {
-					ConnectionNodeEditPart link = (ConnectionNodeEditPart) targetLinks.get(b);
-					AbstractGraphicalEditPart source = (AbstractGraphicalEditPart) link
-							.getSource();
-					int w = source.getFigure().getBounds().width;
-					int ew = ep.getFigure().getPreferredSize().width;
-					if (w < ew) {
-						Command c = new ChangeBoundsCommand(transactionDomain,((Node) ep
-								.getModel()), source.getFigure().getBounds()
-								.getLocation(), w,-1);
-						getCommandStack().execute(c);
-						int h = source.getFigure().getPreferredSize().height;
-						source.getFigure()
-								.setPreferredSize(new Dimension(w, h));
-						source.getFigure().setSize(new Dimension(w, h));
-					}
-					List list = new ArrayList();
-					list.add(ep);
-					list.add(source);
-					verticalAlignToFirstSelected(list);
-				}
-			}
-			if (ep instanceof WorkProductCompositeEditPart || 
-					ep instanceof RoleTaskCompositeEditPart) {
-				List children = ep.getChildren();
-				for (int d = 0; d < children.size(); d++) {
-					AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) children
-							.get(d);
-					cleanUp(p);
-				}
-			}
-		}
-	}
-
-	/**
-	 *  For auto-layout, need to adjust connection(or link) length, based on
-	 *  connecting editparts(figures).
-	 * 
-	 */
-	private boolean reduceLinkLength(AbstractGraphicalEditPart part) {
-		boolean moved = false;
-		// only move new WorkProductComposite elements
-		if (part instanceof WorkProductCompositeEditPart) {
-			AbstractGraphicalEditPart linkedPart = null;
-			int position = PositionConstants.CENTER;
-			// is this element linked to another item?
-			if (part.getTargetConnections().size() > 0) {
-				linkedPart = (AbstractGraphicalEditPart) ((ConnectionNodeEditPart) part
-						.getTargetConnections().get(0)).getSource();
-				position = PositionConstants.NORTH;
-			} else if (part.getSourceConnections().size() > 0) {
-				linkedPart = (AbstractGraphicalEditPart) ((ConnectionNodeEditPart) part
-						.getSourceConnections().get(0)).getTarget();
-				position = PositionConstants.SOUTH;
-			}
-			if (linkedPart != null) {
-				if (!(linkedPart.getParent() instanceof DiagramEditPart)) {
-					linkedPart = (AbstractGraphicalEditPart) linkedPart
-							.getParent();
-				}
-				// get the part's position
-				Rectangle partBounds = part.getFigure().getBounds();
-				// get the linked part's position
-				Rectangle linkedPartBounds = linkedPart.getFigure().getBounds();
-				// determine in which direction is the linked part
-				// int position = partBounds.getPosition(linkedPartBounds
-				// .getLocation());
-				// assume it is below us, so this part moves up
-				int direction = -1;
-				if ((position & PositionConstants.NORTH) == PositionConstants.NORTH
-						|| (position & PositionConstants.CENTER) == PositionConstants.CENTER) {
-					// above us, move down
-					direction = 1;
-				}
-				// set new bounds for the part so that it sites just outside of
-				// the linked part
-				Rectangle testBounds = partBounds.getCopy();
-				if (direction == 1) {
-					testBounds.y = linkedPartBounds.y + linkedPartBounds.height
-							+ VERT_PIX_PADDING;
-				} else {
-					testBounds.y = linkedPartBounds.y - VERT_PIX_PADDING
-							- partBounds.height;
-				}
-				// set the new location for the part in the model
-				Point np = new Point(testBounds.x, testBounds.y);
-				part.getFigure().setLocation(np);
-				Command c = new ChangeBoundsCommand(transactionDomain,(Node) part.getModel(), np,
-						partBounds.width, -1);
-				getCommandStack().execute(c);
-			}
-		}
-		return moved;
-	}
-
-	/**
-	 * Method to adjust the size of editpart.  
-	 * 
-	 */
-	private void adjustSize(AbstractGraphicalEditPart ep) {
-		if (ep instanceof WorkProductCompositeEditPart) {
-			adjustSize((WorkProductCompositeEditPart) ep, 1);
-		}
-		else if (ep instanceof RoleTaskCompositeEditPart) {
-			adjustSize((RoleTaskCompositeEditPart) ep, 50);
-		}
-	}
-
-	protected final static int HORIZ_PIX_PADDING = 30;
-
-	protected final static int VERT_PIX_PADDING = 20;
-
-	/**
-	 * Adjusts the size of ContainerEditPart to accomodate number of editparts in a row,
-	 * push the remaining the editparts in two second row. 
-	 * This is useful for {@link ToolbarLayout}
-	 * 
-	 */
-	private void adjustSize(ShapeNodeEditPart ep, int horizCount) {
-		int requiredWidth = 0;
-		int rowMaxHeight = 0;
-		int rows = 0;
-		int widthSum = 0;
-		int heightSum = 0;
-		int column = 0;
-
-		delta = 0;
-		List children = ep.getChildren();
-		IFigure parentFigure  = ep.getFigure();
-		//TODO: need revisit transaction usage
-		try{
-		Transaction tx = ((InternalTransactionalEditingDomain)transactionDomain).startTransaction(false, Collections.EMPTY_MAP);
-		for (int p = 0; p < children.size();) {
-			if (column == 0) {
-				rows++;
-			}
-			if (column < horizCount) {
-				AbstractGraphicalEditPart child = (AbstractGraphicalEditPart) children
-						.get(p);
-				if(child instanceof RoleNodeEditPart || child instanceof TaskNodeEditPart){
-					resetSize((ShapeNodeEditPart)child, parentFigure);
-//					List list = new ArrayList();
-//					list.add(child.getModel());
-//					PersistViewsCommand cmd = new PersistViewsCommand(transactionDomain, list);
-//					cmd.execute(new NullProgressMonitor(), null);
-				}
-				Dimension d = child.getFigure().getPreferredSize();
-				widthSum += d.width;
-				if (d.height > rowMaxHeight) {
-					rowMaxHeight = d.height;
-				}
-				p++;
-				column++;
-			} else {
-				if (widthSum > requiredWidth) {
-					requiredWidth = widthSum;
-				}
-				heightSum += rowMaxHeight;
-				rowMaxHeight = 0;
-				widthSum = 0;
-				column = 0;
-			}
-		}
-		tx.commit();
-		}catch(Exception e){
-			
-		}
-		if (widthSum > requiredWidth) {
-			requiredWidth = widthSum;
-		}
-		heightSum += rowMaxHeight;
-		requiredWidth += HORIZ_PIX_PADDING
-				* Math.min(horizCount, children.size());
-		int requiredHeight = heightSum + (VERT_PIX_PADDING * rows);
-		Command cmd = new ChangeBoundsCommand(transactionDomain, ((Node) ep.getModel()), ep
-				.getFigure().getBounds().getLocation(), requiredWidth, requiredHeight);
-		getCommandStack().execute(cmd);
-		ep.getFigure().setPreferredSize(
-				new Dimension(requiredWidth, requiredHeight));
-		//((Node) ep.getModel()).setHeight(requiredHeight);
-		ep.getFigure().setSize(new Dimension(requiredWidth, requiredHeight));
-		ep.getFigure().getLayoutManager().layout(ep.getFigure());
-		// after layout, check the bottom-most child figure against the bottom
-		// of the container, adjust the bottom of the container is necessary
-		if (ep instanceof WorkProductCompositeEditPart && children.size() > 0) {
-			int totalCalculatedHeight = 0;
-			for (int i=0; i < children.size(); i++)		{
-				GraphicalEditPart part = (GraphicalEditPart) children.get(i);
-				Node nodeObj = (Node) part.getModel();
-				EObject o = nodeObj.getElement();				
-				totalCalculatedHeight += part.getFigure().getPreferredSize().height;
-			}
-			int height = totalCalculatedHeight + 20 + 5 * (children.size() - 1);
-			GraphicalEditPart last = (GraphicalEditPart) children.get(children
-					.size() - 1);
-			Point childBottom = last.getFigure().getBounds().getBottom();
-			Point parentBottom = ep.getFigure().getBounds().getBottom();
-			int delta = parentBottom.y - childBottom.y - (VERT_PIX_PADDING / 2);
-//			ep.getFigure().setPreferredSize(
-//					new Dimension(requiredWidth, requiredHeight - delta));
-//			cmd = new ChangeBoundsCommand(transactionDomain, ((Node) ep.getModel()), ep
-//					.getFigure().getBounds().getLocation(), -1, requiredHeight-delta);
-//			getCommandStack().execute(cmd);
-//			ep.getFigure().setSize(
-//					new Dimension(requiredWidth, requiredHeight - delta));
-			ep.getFigure().setPreferredSize(
-					new Dimension(requiredWidth, height));
-			cmd = new ChangeBoundsCommand(transactionDomain, ((Node) ep.getModel()), ep
-					.getFigure().getBounds().getLocation(), -1, height);
-			getCommandStack().execute(cmd);			
-			ep.getFigure().setSize(
-					new Dimension(requiredWidth, height));
-		}
-	}
-	
-	
-	
-	
-	private void resetSize(ShapeNodeEditPart ep, IFigure parentFigure){
-		
-		Node model = (Node)ep.getModel();
-		IGraphicalEditPart child = (IGraphicalEditPart)ep.getChildren().get(0);
-		NodeFigure nodeFigure = (NodeFigure)ep.getFigure();
-		List nodeFigureChildren =  nodeFigure.getChildren();
-		IFigure childFigure = (IFigure)nodeFigureChildren.get(0);
-		if(childFigure instanceof RectangleFigure){
-			IFigure labelFigure = (IFigure)((RectangleFigure)childFigure).getChildren().get(0);
-			if(labelFigure instanceof WrapLabel){
-				Dimension figDimension = labelFigure.getSize();
-				Dimension d = labelFigure.getPreferredSize();
-				Point p = nodeFigure.getLocation().getCopy();
-				p.x = p.x + delta;
-				nodeFigure.setLocation(p);
-				if (d.width > nodeFigure.getSize().width) {
-					// System.out.println("Node figure width: "+nodeFigure.getSize().width);
-					// System.out.println("Text width: "+ d.width);
-					delta += d.width - nodeFigure.getSize().width;
-				}
-				if(d.width > figDimension.width){
-					int width = d.width;
-					View view = ((View)child.getModel());
-					ViewUtil.setStructuralFeatureValue(view,
-							NotationPackage.eINSTANCE.getSize_Width(), new Integer(
-									width));
-					ViewUtil.setStructuralFeatureValue(model,
-							NotationPackage.eINSTANCE.getSize_Width(), new Integer(
-									width));
-					nodeFigure.setPreferredSize(new Dimension(width, nodeFigure.getPreferredSize().height));
-					childFigure.setPreferredSize(new Dimension(width, childFigure.getPreferredSize().height));
-					labelFigure.setPreferredSize(new Dimension(width, labelFigure.getPreferredSize().height));
-					nodeFigure.setSize(new Dimension(width, nodeFigure.getPreferredSize().height));
-					childFigure.setSize(new Dimension(width, childFigure.getPreferredSize().height));
-					labelFigure.setSize(new Dimension(width, labelFigure.getPreferredSize().height));
-
-//					nodeFigure.setConstraint(childFigure, new Rectangle(nodeFigure.getLocation().x,
-//							nodeFigure.getLocation().y, width, childFigure.getBounds().height));
-					// Change the location 
-//					System.out.println("child bounds before: " + nodeFigure.getBounds() +"delta: " + delta);					
-				}				
-			}
-		}
-	}
-	
-
-	protected void enumerateConnectedParts(AbstractGraphicalEditPart part,
-			List<EditPart> connected) {
-		// only add parts directly on the diagram surface
-		if (!connected.contains(part)) {
-			if (!(part.getParent() instanceof DiagramEditPart)) {
-				if (!connected.contains(part.getParent())) {
-					connected.add(part.getParent());
-				}
-			} else {
-				connected.add(part);
-			}
-			AbstractGraphicalEditPart linkedPart = null;
-			List children = part.getChildren();
-			for (int x = 0; x < children.size(); x++) {
-				AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) children
-						.get(x);
-				enumerateConnectedParts(p, connected);
-			}
-			// is this element linked to another item?
-			for (int x = 0; x < part.getTargetConnections().size(); x++) {
-				linkedPart = (AbstractGraphicalEditPart) ((ConnectionNodeEditPart) part
-						.getTargetConnections().get(x)).getSource();
-				enumerateConnectedParts(linkedPart, connected);
-			}
-			for (int x = 0; x < part.getSourceConnections().size(); x++) {
-				linkedPart = (AbstractGraphicalEditPart) ((ConnectionNodeEditPart) part
-						.getSourceConnections().get(x)).getTarget();
-				enumerateConnectedParts(linkedPart, connected);
-			}
-		}
-	}
-
-	/**
-	 * This method finds single elements and groups of elements, and positions
-	 * them starting from the top of the diagram and continuously down the page.
-	 */
-	private void packDiagram() {
-		ActivityDetailDiagramEditPart diagram = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-				.getContents();
-		// start at the top of the diagram
-		// Dimension diagramSize = diagram.getFigure().getSize();
-		// no new shapes can be moved above this y-axis value
-		int reserved = 0;
-		// these are elements without connections
-		List<EditPart> stragglers = new ArrayList<EditPart>();
-		// these are groups of elements connected with links
-		List<List> groups = new ArrayList<List>();
-		// these are top level parts on the diagram that have been added
-		List diagramParts = diagram.getRecentlyAddedParts();
-		for (int x = 0; x < diagramParts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) diagramParts
-					.get(x);
-			boolean found = false;
-			for (int g = 0; g < groups.size() && found == false; g++) {
-				List group = (List) groups.get(g);
-				if (group.contains(p)) {
-					found = true;
-					break;
-				}
-			}
-			if (!found) {
-				List<EditPart> connected = new ArrayList<EditPart>();
-				enumerateConnectedParts(p, connected);
-				if (connected.size() == 1) {
-					stragglers.add(p);
-				} else {
-					groups.add(connected);
-				}
-			}
-		}
-		// process each group closest to the top (min y value)
-		while (groups.size() > 0) {
-			List top = (List) groups.get(0);
-			int topY = getVerticalMinPart(top).getFigure().getBounds().y;
-			for (int x = 0; x < groups.size(); x++) {
-				List g = (List) groups.get(x);
-				int y = getVerticalMinPart(g).getFigure().getBounds().y;
-				if (y < topY) {
-					top = g;
-					topY = y;
-				}
-			}
-			int limit = reserved + 1;
-			int verticalDelta = limit - topY;
-			int leftX = getHorizontalMinPart(top).getFigure().getBounds().x;
-			int horizontalDelta = HORIZ_PIX_PADDING - leftX;
-			for (int x = 0; x < top.size(); x++) {
-				AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) top
-						.get(x);
-				Rectangle bounds = p.getFigure().getBounds();
-				ChangeBoundsCommand cbc = new ChangeBoundsCommand(transactionDomain,(Node) p
-						.getModel(), new Point(bounds.x + horizontalDelta,
-						bounds.y + verticalDelta), bounds.width, -1);
-				getCommandStack().execute(cbc);
-				p.getFigure().setLocation(
-						new Point(bounds.x + horizontalDelta, bounds.y
-								+ verticalDelta));
-				p.refresh();
-			}
-			int bottomY = getVerticalMaxPart(top).getFigure().getBounds()
-					.bottom();
-			reserved = bottomY + (VERT_PIX_PADDING * 2);
-			groups.remove(top);
-		}
-		int next = HORIZ_PIX_PADDING;
-		for (int x = 0; x < stragglers.size(); x++) {
-			int limit = reserved + 1;
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) stragglers
-					.get(x);
-			Rectangle bounds = p.getFigure().getBounds();
-			ChangeBoundsCommand cbc = new ChangeBoundsCommand(transactionDomain, (Node) p
-					.getModel(), new Point(next, limit), bounds.width, -1);
-			getCommandStack().execute(cbc);
-			p.getFigure().setLocation(new Point(next, limit));
-			p.refresh();
-			next += bounds.width + HORIZ_PIX_PADDING;
-		}
-	}
-
-	private AbstractGraphicalEditPart getVerticalMinPart(List parts) {
-		AbstractGraphicalEditPart rc = parts.size() > 0 ? (AbstractGraphicalEditPart) parts
-				.get(0)
-				: null;
-		for (int x = 0; x < parts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) parts
-					.get(x);
-			if (p.getFigure().getBounds().y < rc.getFigure().getBounds().y) {
-				rc = p;
-			}
-		}
-		return rc;
-	}
-
-	private AbstractGraphicalEditPart getHorizontalMinPart(List parts) {
-		AbstractGraphicalEditPart rc = parts.size() > 0 ? (AbstractGraphicalEditPart) parts
-				.get(0)
-				: null;
-		for (int x = 0; x < parts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) parts
-					.get(x);
-			if (p.getFigure().getBounds().x < rc.getFigure().getBounds().x) {
-				rc = p;
-			}
-		}
-		return rc;
-	}
-
-	private AbstractGraphicalEditPart getVerticalMaxPart(List parts) {
-		AbstractGraphicalEditPart rc = parts.size() > 0 ? (AbstractGraphicalEditPart) parts
-				.get(0)
-				: null;
-		for (int x = 0; x < parts.size(); x++) {
-			AbstractGraphicalEditPart p = (AbstractGraphicalEditPart) parts
-					.get(x);
-			if (p.getFigure().getBounds().bottom() > rc.getFigure().getBounds()
-					.bottom()) {
-				rc = p;
-			}
-		}
-		return rc;
-	}
-
-	public void verticalAlignToFirstSelected(List editParts) {
-		// get the selected items
-		//		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart alignToPart = null;
-		// find the first diagram part we can align to
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				if (alignToPart == null) {
-					// remember it and stop
-					alignToPart = ep;
-					break;
-				}
-			}
-		}
-		// loop through the elements and set their new position
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// we can skip the first one since this is an align-to
-				if (ep != alignToPart) {
-					// calculate the offset for centerline alignment
-					Rectangle bounds = ep.getFigure().getBounds();
-					Rectangle alignToPartBounds = alignToPart.getFigure().getBounds();					
-					Dimension ps = alignToPart.getFigure().getPreferredSize();					
-					int offset =  bounds.getCenter().x - alignToPartBounds.getCenter().x;
-					// is this inside a container?
-					if (!(ep.getParent() instanceof DiagramEditPart)) {
-						// adjust the offset since we are moving the
-						// container
-						ep = (AbstractGraphicalEditPart) ep.getParent();
-						Rectangle parentBounds = ep.getFigure().getBounds();
-						offset += bounds.x - parentBounds.x;
-						bounds = parentBounds;
-					}
-					// send the command to move the element
-					org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-							transactionDomain, (Node) ep.getModel(), new Point(
-									alignToPart.getFigure().getBounds().x
-											- offset, bounds.y), bounds.width,
-							-1);
-					getCommandStack().execute(c);
-					ep.getFigure().setLocation(
-							new Point(alignToPart.getFigure().getBounds().x
-									- offset, bounds.y));
-					Point sp = alignToPart.getFigure().getBounds().getCenter();
-					boolean connected = false;
-					// check if the part is connected via source connections
-					List list = ((ShapeNodeEditPart) alignToPart)
-							.getSourceConnections();
-					for (Iterator itor = list.iterator(); itor.hasNext();) {
-						ConnectionNodeEditPart lp = (ConnectionNodeEditPart) itor
-								.next();
-						if (lp.getTarget().equals(ep)) {
-							connected = true;
-							break;
-						}
-					}
-					// if not found above, check if it is connected via target connections
-					if (!connected) {
-						list = ((ShapeNodeEditPart) alignToPart)
-								.getTargetConnections();
-						for (Iterator itor = list.iterator(); itor.hasNext();) {
-							ConnectionNodeEditPart lp = (ConnectionNodeEditPart) itor
-									.next();
-							if (lp.getSource().equals(ep)) {
-								connected = true;
-								break;
-							}
-						}
-					}
-					Point p = new Point();
-					p.x = ((Integer) ViewUtil.getStructuralFeatureValue(
-							(View) ep.getModel(), NotationPackage.eINSTANCE
-									.getLocation_X())).intValue();
-					p.y = ((Integer) ViewUtil.getStructuralFeatureValue(
-							(View) ep.getModel(), NotationPackage.eINSTANCE
-									.getLocation_Y())).intValue();
-					Point tp = p.getCopy();
-					Point centerPoint = ep.getFigure().getBounds().getCenter();
-					int delta = sp.x - centerPoint.x;
-					tp.x = tp.x + delta;
-					c = new ChangeBoundsCommand(transactionDomain, (Node) ep
-							.getModel(), tp, ep.getFigure().getBounds().width,
-							-1);
-					getCommandStack().execute(c);
-					ep.getFigure().setLocation(new Point(tp.x, tp.y));
-				}
-			}
-		}
-	}
-	
-
-	/**
-	 * Return height of text of th enode
-	 * 
-	 * @param node
-	 * @return
-	 */
-	public static Dimension getTextDimension(String text) {
-		if (text != null){
-			Font f = DiagramConstants.DEFAULT_FONT;
-			Dimension d = FigureUtilities.getTextExtents(text, f);
-
-			if (d != null)
-				return d;
-		}
-		return null;
-	}
-	
-	private void anyObliqueLinks(ActivityDetailDiagramEditPart dep,
-			List recentlyAddedChildren) {
-		List children = dep.getChildren();
-		for (Iterator iterator = children.iterator(); iterator.hasNext();) {
-			IGraphicalEditPart part = (IGraphicalEditPart) iterator.next();
-			if(part instanceof RoleTaskCompositeEditPart){
-				List grandChildren = ((RoleTaskCompositeEditPart)part).getChildren();
-				for (Iterator iterator2 = grandChildren.iterator(); iterator2
-						.hasNext();) {
-					ShapeNodeEditPart child = (ShapeNodeEditPart) iterator2
-							.next();
-					if (child instanceof TaskNodeEditPart) {
-						Point p = child.getFigure().getBounds().getCenter();
-						List connected = child.getTargetConnections();
-						if (!connected.isEmpty()) {
-							AbstractGraphicalEditPart linkedPart = (AbstractGraphicalEditPart) ((ConnectionNodeEditPart) connected
-									.get(0)).getSource();
-							Point pt = linkedPart.getFigure().getBounds()
-									.getCenter();
-							if (p.x != pt.x) {
-								if (!recentlyAddedChildren.contains(part)) {
-									recentlyAddedChildren.add(part);
-								}
-							}
-						}
-						connected = child.getSourceConnections();
-						if (!connected.isEmpty()) {
-							AbstractGraphicalEditPart linkedPart = (AbstractGraphicalEditPart) ((ConnectionNodeEditPart)connected
-									.get(0)).getSource();
-							Point ps = linkedPart.getFigure().getBounds()
-									.getCenter();
-							if (p.x != ps.x) {
-								if (!recentlyAddedChildren.contains(part)) {
-									recentlyAddedChildren.add(part);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/ActivityDetailDiagramViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/ActivityDetailDiagramViewFactory.java
deleted file mode 100644
index ae5a971..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/ActivityDetailDiagramViewFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.DiagramViewFactory;
-
-import org.eclipse.gmf.runtime.notation.MeasurementUnit;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class ActivityDetailDiagramViewFactory extends DiagramViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createPageStyle());
-		styles.add(NotationFactory.eINSTANCE.createGuideStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View view, IAdaptable semanticAdapter,
-			String diagramKind) {
-		super.decorateView(view, semanticAdapter, diagramKind);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MeasurementUnit getMeasurementUnit() {
-		return MeasurementUnit.PIXEL_LITERAL;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/LinkNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/LinkNameViewFactory.java
deleted file mode 100644
index a49609e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/LinkNameViewFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractLabelViewFactory;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.diagram.ui.util.MeasurementUnitHelper;
-
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-
-import org.eclipse.gmf.runtime.notation.Location;
-
-/**
- * @generated
- */
-public class LinkNameViewFactory extends AbstractLabelViewFactory {
-
-	/**
-	 * @generated
-	 */
-	public View createView(IAdaptable semanticAdapter, View containerView,
-			String semanticHint, int index, boolean persisted,
-			PreferencesHint preferencesHint) {
-		Node view = (Node) super.createView(semanticAdapter, containerView,
-				semanticHint, index, persisted, preferencesHint);
-		Location location = (Location) view.getLayoutConstraint();
-		IMapMode mapMode = MeasurementUnitHelper.getMapMode(containerView
-				.getDiagram().getMeasurementUnit());
-		location.setX(mapMode.DPtoLP(0));
-		location.setY(mapMode.DPtoLP(40));
-		return view;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/LinkViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/LinkViewFactory.java
deleted file mode 100644
index 440d726..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/LinkViewFactory.java
+++ /dev/null
@@ -1,176 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcoreFactory;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.AbstractEMFOperation;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-import org.eclipse.gmf.runtime.common.core.util.Log;
-import org.eclipse.gmf.runtime.common.core.util.StringStatics;
-import org.eclipse.gmf.runtime.common.core.util.Trace;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions;
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIStatusCodes;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.ConnectionViewFactory;
-import org.eclipse.gmf.runtime.notation.Bendpoints;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class LinkViewFactory extends ConnectionViewFactory {
-
-	private static final Map options = new HashMap();
-	static {
-		options.put(Transaction.OPTION_UNPROTECTED, Boolean.TRUE);
-		options.put(Transaction.OPTION_NO_NOTIFICATIONS, Boolean.TRUE);
-		options.put(Transaction.OPTION_NO_TRIGGERS, Boolean.TRUE);
-	}
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createRoutingStyle());
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(LinkEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(semanticAdapter, view,
-				DiagramVisualIDRegistry.getType(LinkNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-	@Override
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.core.view.factories.ViewFactory#createView(org.eclipse.core.runtime.IAdaptable, org.eclipse.gmf.runtime.notation.View, java.lang.String, int, boolean, java.lang.String)
-	 * 
-	 * Override createView since there is a bug in 
-	 * org.eclipse.gmf.runtime.diagram.ui.view.factories.ConnectionViewFactory.java
-	 */
-	public View createView(final IAdaptable semanticAdapter,
-			final View containerView, final String semanticHint,
-			final int index, final boolean persisted,
-			final PreferencesHint preferencesHint) {
-
-		setPreferencesHint(preferencesHint);
-
-		final Edge edge = NotationFactory.eINSTANCE.createEdge();
-		List styles = createStyles(edge);
-		if (styles.size() > 0) {
-			edge.getStyles().addAll(styles);
-		}
-
-		Bendpoints bendPoints = createBendpoints();
-		if (bendPoints != null) {
-			edge.setBendpoints(bendPoints);
-		}
-
-		EObject semanticEl = semanticAdapter == null ? null
-				: (EObject) semanticAdapter.getAdapter(EObject.class);
-		if (semanticEl == null)
-			// enforce a set to NULL
-			edge.setElement(null);
-		else if (requiresElement(semanticAdapter, containerView)) {
-			edge.setElement(semanticEl);
-		}
-
-		edge.setType(semanticHint);
-
-		// decorate view assumes the view had been inserted already, so 
-		// we had to call insert child before calling decorate view
-		ViewUtil.insertChildView(containerView, edge, index, persisted);
-
-		TransactionalEditingDomain domain = getEditingDomain(semanticEl,
-				containerView);
-
-		if (domain != null) {
-			if (isUnProtectedSilentTransactionInProgress(domain)) {
-				// decorate view had to run as a silent operation other wise
-				// it will generate too many events
-				decorateView(containerView, edge, semanticAdapter,
-						semanticHint, index, true);
-
-			} else {
-				AbstractEMFOperation operation = new AbstractEMFOperation(
-						domain, StringStatics.BLANK, options) {
-
-					protected IStatus doExecute(IProgressMonitor monitor,
-							IAdaptable info) throws ExecutionException {
-						decorateView(containerView, edge, semanticAdapter,
-								semanticHint, index, true);
-
-						return Status.OK_STATUS;
-					}
-				};
-				try {
-					operation.execute(new NullProgressMonitor(), null);
-				} catch (ExecutionException e) {
-					Trace.catching(DiagramUIPlugin.getInstance(),
-							DiagramUIDebugOptions.EXCEPTIONS_CATCHING,
-							getClass(), "createView", e); //$NON-NLS-1$
-					Log.warning(DiagramUIPlugin.getInstance(),
-							DiagramUIStatusCodes.IGNORED_EXCEPTION_WARNING,
-							"createView", e); //$NON-NLS-1$
-				}
-			}
-		}
-
-		return edge;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleNodeNameViewFactory.java
deleted file mode 100644
index ed6539d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleNodeNameViewFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class RoleNodeNameViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleNodeViewFactory.java
deleted file mode 100644
index 1eb7281..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleNodeViewFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleNodeNameEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class RoleNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(RoleNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						DiagramVisualIDRegistry
-								.getType(RoleNodeNameEditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleTaskCompositeRoleTaskCompartmentViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleTaskCompositeRoleTaskCompartmentViewFactory.java
deleted file mode 100644
index 778da43..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleTaskCompositeRoleTaskCompartmentViewFactory.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeRoleTaskCompartmentEditPart;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.ListCompartmentViewFactory;
-
-import org.eclipse.gmf.runtime.notation.DrawerStyle;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.TitleStyle;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeRoleTaskCompartmentViewFactory extends
-		ListCompartmentViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createSortingStyle());
-		styles.add(NotationFactory.eINSTANCE.createFilteringStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		setupCompartmentTitle(view);
-		setupCompartmentCollapsed(view);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentTitle(View view) {
-		TitleStyle titleStyle = (TitleStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getTitleStyle());
-		if (titleStyle != null) {
-			titleStyle.setShowTitle(true);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentCollapsed(View view) {
-		DrawerStyle drawerStyle = (DrawerStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getDrawerStyle());
-		if (drawerStyle != null) {
-			drawerStyle.setCollapsed(false);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleTaskCompositeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleTaskCompositeViewFactory.java
deleted file mode 100644
index e6ae50e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/RoleTaskCompositeViewFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeRoleTaskCompartmentEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class RoleTaskCompositeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		// 		modified not to create compartment
-		//		getViewService()
-		//				.createNode(
-		//						semanticAdapter,
-		//						view,
-		//						DiagramVisualIDRegistry
-		//								.getType(RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID),
-		//						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/TaskNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/TaskNodeNameViewFactory.java
deleted file mode 100644
index b94d611..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/TaskNodeNameViewFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class TaskNodeNameViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/TaskNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/TaskNodeViewFactory.java
deleted file mode 100644
index d2cfc82..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/TaskNodeViewFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.TaskNodeNameEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class TaskNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(TaskNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						DiagramVisualIDRegistry
-								.getType(TaskNodeNameEditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductCompositeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductCompositeViewFactory.java
deleted file mode 100644
index 3dc7c13..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductCompositeViewFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeWorkProductCompartmentEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductCompositeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		//		modified - not to create compartment
-		//		getViewService()
-		//				.createNode(
-		//						semanticAdapter,
-		//						view,
-		//						DiagramVisualIDRegistry
-		//								.getType(WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID),
-		//						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductCompositeWorkProductCompartmentViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductCompositeWorkProductCompartmentViewFactory.java
deleted file mode 100644
index 68ca801..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductCompositeWorkProductCompartmentViewFactory.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeWorkProductCompartmentEditPart;
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.ListCompartmentViewFactory;
-
-import org.eclipse.gmf.runtime.notation.DrawerStyle;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.TitleStyle;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductCompositeWorkProductCompartmentViewFactory extends
-		ListCompartmentViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createSortingStyle());
-		styles.add(NotationFactory.eINSTANCE.createFilteringStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		setupCompartmentTitle(view);
-		setupCompartmentCollapsed(view);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentTitle(View view) {
-		TitleStyle titleStyle = (TitleStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getTitleStyle());
-		if (titleStyle != null) {
-			titleStyle.setShowTitle(true);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setupCompartmentCollapsed(View view) {
-		DrawerStyle drawerStyle = (DrawerStyle) view
-				.getStyle(NotationPackage.eINSTANCE.getDrawerStyle());
-		if (drawerStyle != null) {
-			drawerStyle.setCollapsed(false);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductDescriptorNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductDescriptorNodeNameViewFactory.java
deleted file mode 100644
index f4b683c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductDescriptorNodeNameViewFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeNameViewFactory extends
-		BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductDescriptorNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductDescriptorNodeViewFactory.java
deleted file mode 100644
index fdc13ca..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.add/src/org/eclipse/epf/diagram/add/view/factories/WorkProductDescriptorNodeViewFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.add.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductDescriptorNodeNameEditPart;
-
-import org.eclipse.epf.diagram.add.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductDescriptorNodeViewFactory extends
-		AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(WorkProductDescriptorNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!ActivityDetailDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", ActivityDetailDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService()
-				.createNode(
-						semanticAdapter,
-						view,
-						DiagramVisualIDRegistry
-								.getType(WorkProductDescriptorNodeNameEditPart.VISUAL_ID),
-						ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/.classpath b/1.5/plugins/org.eclipse.epf.diagram.core/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/.options b/1.5/plugins/org.eclipse.epf.diagram.core/.options
deleted file mode 100644
index 45ac5e0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Diagram Core plug-in
-org.eclipse.epf.diagram.core/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/.project b/1.5/plugins/org.eclipse.epf.diagram.core/.project
deleted file mode 100644
index 5b7c139..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.diagram.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.diagram.core/META-INF/MANIFEST.MF
deleted file mode 100644
index ae8ab19..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.diagram.core;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.diagram.core.DiagramCorePlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.uml2.uml,
- org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide,
- org.eclipse.gmf.runtime.diagram.ui.properties,
- org.eclipse.gmf.runtime.diagram.ui.providers,
- org.eclipse.epf.library.ui;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui.actions,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.diagram.core,
- org.eclipse.epf.diagram.core.actions,
- org.eclipse.epf.diagram.core.bridge,
- org.eclipse.epf.diagram.core.commands,
- org.eclipse.epf.diagram.core.figures,
- org.eclipse.epf.diagram.core.part,
- org.eclipse.epf.diagram.core.part.util,
- org.eclipse.epf.diagram.core.providers,
- org.eclipse.epf.diagram.core.resources,
- org.eclipse.epf.diagram.core.services,
- org.eclipse.epf.diagram.core.util
-Bundle-Vendor: %providerName
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/build.properties b/1.5/plugins/org.eclipse.epf.diagram.core/build.properties
deleted file mode 100644
index d24082b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               plugin.xml,\
-               icons/
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/delete_diagram.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/delete_diagram.gif
deleted file mode 100644
index 45b0a52..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/delete_diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/refresh.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/refresh.gif
deleted file mode 100644
index 6fa899b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/refresh.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/refresh_base.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/refresh_base.gif
deleted file mode 100644
index a76e8ac..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/dlcl16/refresh_base.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/delete.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/delete.gif
deleted file mode 100644
index b6922ac..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/delete.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/delete_diagram.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/delete_diagram.gif
deleted file mode 100644
index b6922ac..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/delete_diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/refresh.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/refresh.gif
deleted file mode 100644
index 00c7141..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/refresh.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/refresh_base.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/refresh_base.gif
deleted file mode 100644
index 8b90943..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/elcl16/refresh_base.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/icons/link.gif b/1.5/plugins/org.eclipse.epf.diagram.core/icons/link.gif
deleted file mode 100644
index 18f408c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/icons/link.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/plugin.properties b/1.5/plugins/org.eclipse.epf.diagram.core/plugin.properties
deleted file mode 100644
index d464220..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/plugin.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Diagram Core
-providerName=Eclipse.org
-
-DeleteDiagram_text=Delete Diagram
-refreshFromBaseActivity_text=Refresh from Base Activity
-refresh_text=Refresh
-open_add_text=Open Activity Detail Diagram
-delete_text=Delete
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/plugin.xml b/1.5/plugins/org.eclipse.epf.diagram.core/plugin.xml
deleted file mode 100644
index fc77e7d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/plugin.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.epf.library.edit.nestedCommandProviders">
-      <nestedCommandProvider class="org.eclipse.epf.diagram.core.commands.NestedCommandProvider"/>
-  </extension>
-
-	<extension point="org.eclipse.ui.popupMenus">
-	 <objectContribution
-            adaptable="true"
-            id="org.eclipse.epf.diagram.core.DeleteDiagram"
-            objectClass="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.DeleteDiagramAction"
-               enablesFor="1"
-               icon="icons/elcl16/delete_diagram.gif"
-               id="org.eclipse.epf.diagram.core.actions.DeleteDiagramAction"
-               label="%DeleteDiagram_text"
-               menubarPath="additions"
-               style="push"
-               tooltip="%DeleteDiagram_text"/>
-      </objectContribution> 
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.epf.diagram.core.RefreshFromBaseAction"
-            objectClass="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.RefreshFromBaseAction"
-               enablesFor="1"
-               icon="icons/elcl16/refresh_base.gif"
-               id="org.eclipse.epf.diagram.core.actions.RefreshFromBaseAction"
-               label="%refreshFromBaseActivity_text"
-               menubarPath="additions"
-               style="push"
-               tooltip="%refreshFromBaseActivity_text"/>
-      </objectContribution>
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.epf.diagram.core.RefreshAction"
-            objectClass="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.RefreshAction"
-               enablesFor="1"
-               icon="icons/elcl16/refresh.gif"
-               id="org.eclipse.epf.diagram.core.actions.RefreshAction"
-               label="%refresh_text"
-               menubarPath="additions"
-               style="push"
-               tooltip="%refresh_text"/>
-      </objectContribution>
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.epf.diagram.core.DeleteDiagramElementAction"
-            objectClass="org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.DeleteElementActionDelegate"
-               enablesFor="*"
-               icon="icons/elcl16/delete.gif"
-               id="org.eclipse.epf.diagram.core.actions.DeleteDiagramElementAction"
-               label="%delete_text"
-               menubarPath="additions"
-               overrideActionId="deleteFromDiagramAction"
-               style="push"
-               tooltip="%delete_text"/>
-      </objectContribution>
-  </extension>
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/DiagramCorePlugin.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/DiagramCorePlugin.java
deleted file mode 100644
index 058c7d4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/DiagramCorePlugin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class DiagramCorePlugin extends AbstractPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.diagram.core"; //$NON-NLS-1$
-
-	// The shared instance
-	private static DiagramCorePlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public DiagramCorePlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static DiagramCorePlugin getDefault() {
-		return plugin;
-	}
-	
-	public static String getPluginId(){
-		return PLUGIN_ID;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/DiagramCoreResources.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/DiagramCoreResources.java
deleted file mode 100644
index b79f3fb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/DiagramCoreResources.java
+++ /dev/null
@@ -1,155 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.2
- *
- */
-public class DiagramCoreResources extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.epf.diagram.core.Resources";//$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public DiagramCoreResources() {
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, DiagramCoreResources.class);
-	}
-	
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given object.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String bind(String key, Object data) {
-		return NLS.bind(key, new Object[] { data });
-	}
-	
-	public static String ActivityDiagram_Palette_flows_title;
-	public static String ActivityDiagram_Palette_flows_create_text;
-	public static String ActivityDiagram_Palette_control_flow_create_text;
-	public static String ActivityDiagram_Palette_control_flow_text;
-	public static String ActivityDiagram_Palette_nodes_group_text;
-	public static String ActivityDiagram_Palette_nodes_titles;
-	public static String previous_name_null1;
-	public static String err_name_empty;
-	public static String moveAction_label;
-	public static String AbstractDiagram_Select_text;
-	public static String AbstractDiagram_Select_tooltip;
-	public static String AbstractDiagram_AddNode_title;
-	public static String AbstractDiagram_AddNode_err_msg;
-	public static String AbstractDiagram_Link_text;
-	public static String AbstractDiagram_Link_select;
-	public static String AbstractDiagram_Link_tooltip;
-	public static String ActivityDiagram_StartNode_text;
-	public static String ActivityDiagram_StartNode_tooltip;
-	public static String AbstractDiagram_FreeText_text;
-	public static String AbstractDiagram_FreeText_tooltip;
-	public static String ActivityDiagram_SyncBar_text;
-	public static String ActivityDiagram_SyncBar_tooltip;
-	public static String ActivityDiagram_DecisionNode_text;
-	public static String ActivityDiagram_DecisionNode_tooltip;
-	public static String ActivityDiagram_EndNode_text;
-	public static String ActivityDetailDiagram_prefix;
-	public static String ActivityDiagram_EndNode_tooltip;
-	public static String ActivityDiagram_Activity_text;
-	public static String ActivityDiagram_Activity_tooltip;
-	public static String ActivityDiagram_Iteration_text;
-	public static String ActivityDiagram_Iteration_tooltip;
-	public static String ActivityDiagram_Phase_text;
-	public static String ActivityDiagram_Phase_tooltip;
-	public static String AbstractDiagram_TaskDescriptor_text;
-	public static String AbstractDiagram_RoleDescriptor_text;
-	public static String Progress_Saving_message;
-	public static String Warning_Saving_Diagram;
-	public static String WorkProductDependencyDiagram_prefix;
-	public static String AbstractDiagram_RoleDescriptor_tooltip;
-	public static String AbstractDiagram_TaskDescriptor_tooltip;
-	public static String ActvitivityDiagram_DeliveryProcess_text;
-	public static String ActvitivityDiagram_CapabilityPattern_text;
-	public static String ActvitivityDiagram_Phase_tex;
-	public static String ActvitivityDiagram_Iteration_text;
-	public static String ActvitivityDiagram_Activity_text;
-	public static String AbstractDiagram_WorkProductDescriptor_text;
-	public static String AbstractDiagram_WorkProductDescriptor_tooltip;
-	public static String AbstractDiagramEditor_alignMenu_text;
-	public static String AbstractDiagramEditor_refreshFromBaseActivity_text;
-	public static String AbstractDiagramEditor_formatTextBoxActivity_text;
-	public static String AbstractDiagramEditor_hAlignAverageAction_text;
-	public static String AbstractDiagramEditor_hAlignFirstSelectedAction_text;
-	public static String AbstractDiagramEditor_vAlignAverageAction_text;
-	public static String AbstractDiagramEditor_vAlignFirstSelectedAction_text;
-	public static String AbstractDiagramEditor_Save_text;
-	public static String AbstractDiagramEditor_Save_message;
-	public static String AbstractDiagramEditor_MoveNode_label;
-	public static String AbstractDiagramEditorrefreshfrombase;
-	public static String AbstractDiagram_BendPoint_create;
-	public static String ActivityDiagram_openActivityDetailDiagram_text;
-	public static String refreshAction_label;
-	public static String refreshFromBaseCmd_label;
-	public static String diagram_saveError;
-	public static String DeleteDiagram_text;
-	public static String DeleteDiagram_prompt;
-	public static String align_bend_point_text;
-	public static String ConfigurationEditorInput_configeditor0;
-	public static String diagram_node_property_value_problem_msg;
-	public static String diagram_errorDialog_title;
-	public static String ActivityDetailDiagramEditor_ResetDiagramLayout_text;
-	public static String errorDialog_title;
-	public static String command_cannotEdit;
-	public static String AbstractDiagramEditor_ParentEditorClose_title;
-	public static String AbstractDiagramEditor_ParentEditorClose_text;
-	
-	public static String DiagramValidation_err_cannot_connect_text;
-	public static String DiagramValidation_err_samepredandsuc_text;
-	public static String DiagramValidation_err_cannot_delete_text;
-	public static String deleteCommand_label;
-	public static String deleteLinkCommand_label;
-
-	public static String ActivityDiagram_Milestone_text;
-	public static String ActivityDiagram_Milestone_tooltip;
-	public static String ActivityDiagram_Join_Node_text;
-	public static String ActivityDiagram_Join_Node_tooltip;
-	public static String ActivityDiagram_Merge_Node_text;
-	public static String ActivityDiagram_Merge_Node_tooltip;
-	public static String ActivityDiagram_Fork_Node_text;
-	public static String ActivityDiagram_Fork_Node_tooltip;
-	public static String ActivityDiagram_Partition_Node_text;
-	public static String ActivityDiagram_Partition_Node_tooltip;
-	
-	public static String ActivityDiagram_New_Task_Descriptor;
-	public static String ActivityDiagram_New_Milestone;
-	public static String WPDD_New_WorkProductDescriptor;
-	public static String ActivityDiagram_New_Activity;
-	public static String ActivityDiagram_New_Phase;
-	public static String ActivityDiagram_New_Iteration;
-
-	
-	public static String ActivityDiagram_kind;
-	public static String ActivityDetail_Diagram_kind;
-	public static String WorkProductDependency_Diagram_kind;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/Resources.properties b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/Resources.properties
deleted file mode 100644
index eb7cdce..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/Resources.properties
+++ /dev/null
@@ -1,122 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Complete new strings need translation.
-previous_name_null1=Undo of a name change is not allowed if the previous name is null.
-err_name_empty=The name cannot be empty. Please specify a valid name.
-moveAction_label=Move
-
-AbstractDiagram_Select_text=Select
-AbstractDiagram_Select_tooltip=Select node or link
-AbstractDiagram_AddNode_title=Add Node
-AbstractDiagram_AddNode_err_msg=IXRD0002W: Adding a node to diagram failed
-AbstractDiagram_Link_text=Link
-AbstractDiagram_Link_select=Select Link
-AbstractDiagram_Link_tooltip=Create new link
-ActivityDiagram_StartNode_text=Start Node
-ActivityDiagram_StartNode_tooltip=Create a Start Node
-AbstractDiagram_FreeText_text=Free Text
-AbstractDiagram_FreeText_tooltip=Create new free text
-ActivityDiagram_SyncBar_text=Synchronization Bar
-ActivityDiagram_SyncBar_tooltip=Create new synchronization bar
-ActivityDiagram_DecisionNode_text=Decision Node
-ActivityDiagram_DecisionNode_tooltip=Create a Decision Node
-ActivityDiagram_EndNode_text=End Node
-ActivityDetailDiagram_prefix=Activity Detail:
-ActivityDiagram_EndNode_tooltip=Create an End Node
-ActivityDiagram_Activity_text=Activity
-ActivityDiagram_Activity_tooltip=Create an Activity
-ActivityDiagram_Iteration_text=Iteration
-ActivityDiagram_Iteration_tooltip=Create an Iteration
-ActivityDiagram_Phase_text=Phase
-ActivityDiagram_Phase_tooltip=Create a Phase
-AbstractDiagram_TaskDescriptor_text=Task Descriptor
-AbstractDiagram_RoleDescriptor_text=Role Descriptor
-WorkProductDependencyDiagram_prefix=Work Product Dependency Diagram:
-AbstractDiagram_RoleDescriptor_tooltip=Create a Role Descriptor
-AbstractDiagram_TaskDescriptor_tooltip=Create a Task Descriptor
-ActvitivityDiagram_DeliveryProcess_text=Delivery Process
-ActvitivityDiagram_CapabilityPattern_text=Capability Pattern
-ActvitivityDiagram_Phase_tex=Phase
-ActvitivityDiagram_Iteration_text=Iteration
-ActvitivityDiagram_Activity_text=Activity
-AbstractDiagram_WorkProductDescriptor_text=Work Product Descriptor
-AbstractDiagram_WorkProductDescriptor_tooltip=Create a Work Product Descriptor
-
-AbstractDiagramEditor_alignMenu_text=Align
-AbstractDiagramEditor_refreshFromBaseActivity_text=Refresh from Base Activity
-AbstractDiagramEditor_formatTextBoxActivity_text=Format Text Box...
-AbstractDiagramEditor_hAlignAverageAction_text=Horizontally to Average
-AbstractDiagramEditor_hAlignFirstSelectedAction_text=Horizontally to First Selected
-AbstractDiagramEditor_vAlignAverageAction_text=Vertically to Average
-AbstractDiagramEditor_vAlignFirstSelectedAction_text=Vertically to First Selected
-AbstractDiagramEditor_Save_text=Save
-AbstractDiagramEditor_Save_message=Saving {0}
-AbstractDiagramEditor_MoveNode_label=Move Node
-AbstractDiagramEditorrefreshfrombase=Refresh From Base
-AbstractDiagram_BendPoint_create=Create Bendpoint
-
-ActivityDiagram_openActivityDetailDiagram_text=Open Activity Detail Diagram
-refreshAction_label=Refresh
-refreshFromBaseCmd_label=Refresh From Base
-diagram_saveError=IUPD0001W: Saving diagram failed
-
-DeleteDiagram_text=Delete Diagram
-DeleteDiagram_prompt=Are you sure you want to close and delete this diagram?\nThis change is permanent and cannot be undone.
-align_bend_point_text=Align Bend Point
-ConfigurationEditorInput_configeditor0=Configuration Editor
-diagram_node_property_value_problem_msg=Error in the node's property value.
-diagram_errorDialog_title=Error
-
-ActivityDetailDiagramEditor_ResetDiagramLayout_text=Reset Diagram Layout
-errorDialog_title=Error
-command_cannotEdit=IUPD0003E: Cannot edit diagram
-
-AbstractDiagramEditor_ParentEditorClose_title=Parent Editor Closed
-AbstractDiagramEditor_ParentEditorClose_text={0} has closed. Would you also like to close {1}?
-
-#Below three strings moved from AuthoringUI resources.properties.
-DiagramValidation_err_cannot_connect_text=IUPA0032W: Cannot connect
-DiagramValidation_err_samepredandsuc_text=IUPA0033W: Cannot have the same breakdown element as predecessor and successor
-DiagramValidation_err_cannot_delete_text=Cannot delete
-deleteCommand_label=Delete
-deleteLinkCommand_label=Delete Connection
-
-ActivityDiagram_Milestone_text=Milestone
-ActivityDiagram_Milestone_tooltip=Create a Milestone
-ActivityDiagram_Join_Node_text=Join Node
-ActivityDiagram_Join_Node_tooltip=Create a Join Node
-ActivityDiagram_Merge_Node_text=Merge Node
-ActivityDiagram_Merge_Node_tooltip=Create a Merge Node
-ActivityDiagram_Fork_Node_text=Fork Node
-ActivityDiagram_Fork_Node_tooltip=Create a Fork Node
-ActivityDiagram_Partition_Node_text=Activity Partition
-ActivityDiagram_Palette_flows_title=Flows
-ActivityDiagram_Palette_nodes_titles=Nodes
-ActivityDiagram_Palette_flows_create_text=Creation tool for flows
-ActivityDiagram_Palette_nodes_group_text=Creation tool group for nodes
-ActivityDiagram_Palette_control_flow_text=Control Flow
-ActivityDiagram_Palette_control_flow_create_text=Create a Control Flow
-ActivityDiagram_Partition_Node_tooltip=Create an Activity Partition
-
-ActivityDiagram_New_Task_Descriptor=New Task Descriptor
-ActivityDiagram_New_Milestone=New Milestone
-WPDD_New_WorkProductDescriptor=New Work Product Descriptor
-ActivityDiagram_New_Activity=New Activity
-ActivityDiagram_New_Phase=New Phase
-ActivityDiagram_New_Iteration=New Iteration
-Progress_Saving_message=Saving {0}
-Warning_Saving_Diagram=IUPD0001W: Saving diagram failed
-
-ActivityDiagram_kind=Activity Diagram
-ActivityDetail_Diagram_kind=Activity Detail Diagram
-WorkProductDependency_Diagram_kind=Work Product Dependency Diagram
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/AccessibilityMoveAction.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/AccessibilityMoveAction.java
deleted file mode 100644
index 244e485..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/AccessibilityMoveAction.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.actions;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.commands.ChangeBoundsCommand;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Action class to move diagram elements in diagram area using keyboard up, down, left, right keys.
- * Useful for Accessibility, and also does move bendpoints of control flow.
- * 
- * @author Shashidhar Kannoori
- */
-public class AccessibilityMoveAction extends DiagramAction {
-
-	public static final String MOVE_LEFT_ACTION = "move_left_action";
-	public static final String MOVE_RIGHT_ACTION = "move_right_action";
-	public static final String MOVE_DOWN_ACTION = "move_down_action";
-	public static final String MOVE_UP_ACTION = "move_up_action";
-	
-	private int direction;
-	
-
-	/**
-	 * @param workbenchPage
-	 */
-	public AccessibilityMoveAction(IWorkbenchPage workbenchPage) {
-		super(workbenchPage);
-	}
-
-	/**
-	 * @param workbenchpart
-	 */
-	public AccessibilityMoveAction(IWorkbenchPart workbenchpart, int direction) {
-		super(workbenchpart);
-		this.direction = direction;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#createTargetRequest()
-	 */
-	@Override
-	protected Request createTargetRequest() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#isSelectionListener()
-	 */
-	@Override
-	protected boolean isSelectionListener() {
-		return true;
-	}
-
-	@Override
-	public void init() {
-		super.init();
-		setId(DiagramConstants.MOVE_ACTION);
-		
-	}
-	
-	public void setDirection(int direction){
-		this.direction = direction;
-	}
-	
-	@Override
-	protected Command getCommand() {
-		List list = getSelectedObjects();
-		CompositeCommand cc = new CompositeCommand(DiagramCoreResources.AbstractDiagramEditor_MoveNode_label);
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object part = iterator.next();
-			if(part instanceof GraphicalEditPart){
-				Command c = move(direction, (GraphicalEditPart)part);
-				if(c != null){
-					cc.compose(new CommandProxy(c));
-				}
-			}
-		}
-		return cc.isEmpty() ? null : new ICommandProxy(cc.reduce());
-	}
-	
-	public Command move(int direction, GraphicalEditPart part) {
-		if (part.getModel() instanceof Node) {
-			View view = (View) part.getModel();
-			Object x = ViewUtil.getStructuralFeatureValue(view,
-					NotationPackage.eINSTANCE.getLocation_X());
-			Object y = ViewUtil.getStructuralFeatureValue(view,
-					NotationPackage.eINSTANCE.getLocation_Y());
-			Point point = new Point(((Integer) x).intValue(), ((Integer) y).intValue());
-			int newx = point.x;
-			int newy = point.y;
-			int presslength = 1;
-			switch (direction) {
-			case PositionConstants.EAST:
-				newx = point.x + presslength;
-				break;
-			case PositionConstants.SOUTH:
-				newy += presslength;
-				break;
-			case PositionConstants.NORTH:
-				newy -= presslength;
-				break;
-			case PositionConstants.WEST:
-				newx -= presslength;
-				break;
-			default:
-				break;
-			}
-			org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(
-					getEditingDomain(),
-					view, new Point(newx, newy), -1, -1);
-
-			return c;
-		}
-		return null;
-	}
-
-	public Command moveBendPoint(int direction, ConnectionEditPart part){
-		// TODO- check adding more bendpoint, capture bendpoint
-		// index on fly
-		if (part.getModel() instanceof Edge) {
-			Edge edge = (Edge) part.getModel();
-			RelativeBendpoints bPoints = (RelativeBendpoints)edge.getBendpoints();
-			List blist = bPoints.getPoints();
-			int index = 0;
-			if (blist != null && blist.size() > 0) {
-				AbsoluteBendpoint point = (AbsoluteBendpoint) blist
-						.get(index);
-				int newx = point.x;
-				int newy = point.y;
-				int presslength = 5;
-				switch (direction) {
-				case 1:
-					newx = point.x + presslength;
-					break;
-				case 2:
-					newy += presslength;
-					break;
-				case 3:
-					newy -= presslength;
-					break;
-				case 4:
-					newx -= presslength;
-					break;
-				default:
-					break;
-				}
-				//TODO: implement the movebendpoint command.
-//				org.eclipse.gef.commands.Command c = new MoveBendpointCommand(
-//						link, new Point(newx, newy), index);
-//				getCommandStack().execute(c);
-			}
-		}
-		return null;
-	}
-	public TransactionalEditingDomain getEditingDomain(){
-		return ((AbstractDiagramEditor)getDiagramWorkbenchPart()).getEditingDomain();
-	}
-	
-	@Override
-	public String getId() {
-		switch(direction){
-		case PositionConstants.EAST:
-			return MOVE_RIGHT_ACTION;
-		case PositionConstants.SOUTH:
-			return MOVE_DOWN_ACTION;
-		case PositionConstants.NORTH:
-			return MOVE_UP_ACTION;
-		case PositionConstants.WEST:
-			return MOVE_LEFT_ACTION;
-		}
-		return DiagramConstants.MOVE_ACTION;
-	}
-	
-	@Override
-	public boolean isEnabled() {
-		if(TngUtil.isLocked(getOwningProcess()))
-				return false;
-		if(BridgeHelper.isReadOnly(((AbstractDiagramEditor)getDiagramWorkbenchPart()).getDiagram()))
-				return false;
-		if(getSelectedObjects().isEmpty()) return false;
-		return super.isEnabled();
-	}
-	
-	private org.eclipse.epf.uma.Process getOwningProcess(){
-		IWorkbenchPart targetPart = getDiagramWorkbenchPart();
-		if(targetPart != null){
-			Diagram d = ((AbstractDiagramEditor)targetPart).getDiagram();
-			DiagramAdapter adapter = BridgeHelper.getDiagramAdapter(d.getElement());
-			if(adapter != null){
-				return TngUtil.getOwningProcess(adapter.getActivity());
-			}
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/ActionDelegate.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/ActionDelegate.java
deleted file mode 100644
index f069940..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/ActionDelegate.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramCommandStack;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * 
- * @author Shashidhar Kannoori
- *
- */
-public abstract class ActionDelegate extends Action implements IObjectActionDelegate {
-
-	protected IWorkbenchPart targetPart;
-	protected List<EditPart> selectedParts = new ArrayList<EditPart>();
-	protected Request targetRequest;
-
-	public ActionDelegate(){
-		
-	}
-	/**
-	 * 
-	 */
-	public ActionDelegate(IAction action, IWorkbenchPart targetPart) {
-		this.targetPart = targetPart;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		// TODO Auto-generated method stub
-		this.targetPart = targetPart;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		// TODO Auto-generated method stub
-		execute(getCommand(), new NullProgressMonitor());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		dropMenuItems();
-		selectedParts.clear();
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			if (structuredSelection.size() >0
-					&& structuredSelection.getFirstElement() instanceof EditPart) {
-				selectedParts.addAll(structuredSelection.toList());
-			}
-		}
-	}
-	
-	/**
-	 * gives access to the diagram command stack
-	 * 
-	 * @return the diagram command stack
-	 */
-	protected DiagramCommandStack getDiagramCommandStack() {
-		Object stack = targetPart.getAdapter(CommandStack.class);
-		return (stack instanceof DiagramCommandStack) ? (DiagramCommandStack) stack
-			: null;
-	}
-	
-	protected final IWorkbenchPart getWorkbenchPart() {
-		return targetPart;
-	}
-	
-	/**
-	 * Gets the contextmenuprovider.
-	 * @return
-	 */
-	protected DiagramContextMenuProvider getDiagramContextMenuProvider() {
-		if(targetPart != null){
-			DiagramGraphicalViewer viewer = (DiagramGraphicalViewer) targetPart
-				.getAdapter(GraphicalViewer.class);
-			DiagramContextMenuProvider provider = (DiagramContextMenuProvider) viewer
-				.getContextMenu();
-			return provider;
-		}
-		return null;
-	}
-	
-	/**
-	 * Executes the given {@link Command}.
-	 * 
-	 * @param command
-	 *            the command to execute
-	 * @param progressMonitor
-	 *            the progress monitor to use during execution
-	 */
-	protected final void execute(Command command,
-			IProgressMonitor progressMonitor) {
-		if (command == null || !command.canExecute())
-			return;
-		if (getDiagramCommandStack() != null)
-			getDiagramCommandStack().execute(command, progressMonitor);
-	}
-	
-	protected abstract Command getCommand();
-	
-	protected void dropMenuItems(){
-	}
-	
-	 /**
-     * Gets editing domain
-     * 
-     * @return my editing domain
-     */
-    protected TransactionalEditingDomain getEditingDomain() {
-        
-        // try adapting the workbench part
-        IWorkbenchPart part = getWorkbenchPart();
-
-        if (part != null) {
-            IEditingDomainProvider edProvider = (IEditingDomainProvider) part
-                .getAdapter(IEditingDomainProvider.class);
-
-            if (edProvider != null) {
-            	EditingDomain domain = edProvider.getEditingDomain();
-            	
-            	if (domain instanceof TransactionalEditingDomain) {
-            		return (TransactionalEditingDomain) domain;
-            	}
-            }
-        }
-        return null;
-    }
-    
-    /**
-	 * Gets a request to be addressed to the operation set
-	 * 
-	 * @return a target request
-	 */
-	protected Request getTargetRequest() {
-		if (targetRequest == null)
-			targetRequest = createTargetRequest();
-		return targetRequest;
-	}
-
-	/**
-	 * Creates a new target request
-	 * 
-	 * @return the new target request
-	 */
-	protected abstract Request createTargetRequest();
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/CreateElementAction.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/CreateElementAction.java
deleted file mode 100644
index 206ec98..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/CreateElementAction.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.actions;
-
-import java.lang.annotation.ElementType;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeRequest;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @author Shashidhar Kannoori
- *
- */
-public class CreateElementAction extends Action {
-
-	private IWorkbenchPart targetPart;
-	private List elementTypes = new ArrayList<ElementType>();
-	private PreferencesHint preferenceHint = null;
-	/**
-	 * 
-	 */
-	public CreateElementAction(IWorkbenchPart targetPart, String text) {
-		super(text);
-		this.targetPart = targetPart;
-	}
-
-	@Override
-	public void run() {
-		Request req= new CreateUnspecifiedTypeRequest(getElementTypes(), getPreferenceHint());
-		DiagramEditPart diagramEditPart = getDiagramEditPart();
-		if(diagramEditPart.isEditModeEnabled()){
-			Command cmd = getDiagramEditPart().getCommand(req);
-			if(cmd.canExecute()){
-				cmd.execute();
-				if(cmd instanceof ICommandProxy){
-					CommandResult results = ((ICommandProxy)cmd).getICommand().getCommandResult();
-					System.out.println(results);
-				}
-			}
-		}
-		
-	}
-	
-	private DiagramEditPart getDiagramEditPart(){
-		if(targetPart != null && targetPart instanceof AbstractDiagramEditor){
-			return ((AbstractDiagramEditor)targetPart).getDiagramEditPart();
-		}
-		return null;
-	}
-
-	public List getElementTypes() {
-		return elementTypes;
-	}
-
-	public void setElementTypes(List elementTypes) {
-		this.elementTypes = elementTypes;
-	}
-
-	public PreferencesHint getPreferenceHint() {
-		return preferenceHint;
-	}
-
-	public void setPreferenceHint(PreferencesHint preferenceHint) {
-		this.preferenceHint = preferenceHint;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DelegateAction.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DelegateAction.java
deleted file mode 100644
index 97bccce..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DelegateAction.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.actions;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.gmf.runtime.common.ui.action.AbstractActionHandler;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * IAction to delegate to IObjectActionDelegate. 
- * @author Shashidhar Kannoori
- */
-public class DelegateAction extends AbstractActionHandler {
-
-	private IActionDelegate delegate;
-	private IWorkbenchPart part;
-	
-	public DelegateAction(IWorkbenchPage page) {
-		super(page.getActivePart());
-		this.part = page.getActivePart();
-	}
-	/**
-	 * 
-	 */
-	public DelegateAction(IWorkbenchPart part, String id) {
-		//super(text);
-		super(part);
-		this.part = part;
-		createDelegate(id);
-	}
-	
-	@Override
-	public void run() {
-		runWithEvent(null);
-	}
-	@Override
-	public void runWithEvent(Event event) {
-		if(delegate != null){
-			refresh();
-			delegate.run(this);
-		}
-		// Reset action and delegate actions, because selectionChanged listeners don't notify here.
-		if(delegate instanceof ActionDelegate){
-			((ActionDelegate)delegate).setEnabled(true);
-		}
-		setEnabled(true);
-	}
-
-	@Override
-	protected void doRun(IProgressMonitor progressMonitor) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void refresh() {
-		ISelection selection = part.getSite().getSelectionProvider().getSelection();
-		if(selection == null){
-			selection = StructuredSelection.EMPTY;
-		}
-		delegate.selectionChanged(this, selection);
-	}
-
-	private void createDelegate(String id){
-		if(id.equals(ActionFactory.DELETE.getId())){
-			delegate = new DeleteElementActionDelegate(this,part);
-		}
-	}
-	@Override
-	public boolean isEnabled() {
-		refresh();
-		return ((ActionDelegate)delegate).isEnabled();
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteDiagramAction.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteDiagramAction.java
deleted file mode 100644
index ac7f567..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteDiagramAction.java
+++ /dev/null
@@ -1,145 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.actions;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.NodeAdapter;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.uml2.uml.Activity;
-
-/**
- * Deletes the diagram.
- * @author Shashidhar Kannoori
- */
-public class DeleteDiagramAction extends ActionDelegate {
-
-	public DeleteDiagramAction(){
-		super();
-	}
-	public DeleteDiagramAction(IAction action, IWorkbenchPart targetPart) {
-		super(action, targetPart);
-	}
-
-	private EditPart mySelectedElement;
-	//private IWorkbenchPart targetPart;
-	/**
-	 * 
-	 */
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-//	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-//		// TODO Auto-generated method stub
-//		this.targetPart = targetPart;
-//	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if (DiagramCorePlugin
-				.getDefault()
-				.getMsgDialog()
-				.displayPrompt(
-						DiagramCoreResources.DeleteDiagram_text, //$NON-NLS-1$
-						DiagramCoreResources.DeleteDiagram_prompt)) { //$NON-NLS-1$
-			if(mySelectedElement != null){
-				Diagram diagram = (Diagram)mySelectedElement.getModel();
-				if(diagram != null){
-					try{
-						DiagramHelper.deleteDiagram(diagram, true);
-						targetPart.getSite().getPage().closeEditor(
-								targetPart.getSite().getPage().getActiveEditor(), false);
-					} catch(Exception ex) {
-						DiagramCorePlugin.getDefault().getLogger().logError(ex);
-					}
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		dropMenuItems();
-		mySelectedElement = null;
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			if (structuredSelection.size() == 1
-					&& structuredSelection.getFirstElement() instanceof EditPart) {
-				mySelectedElement = (EditPart) structuredSelection
-						.getFirstElement();
-			}
-		}
-		if(mySelectedElement != null){
-			action.setChecked(false);
-			if(mySelectedElement instanceof DiagramEditPart){
-				if(!((DiagramEditPart)mySelectedElement).isEditModeEnabled()){
-					action.setEnabled(false);
-					IContributionItem item = getDiagramContextMenuProvider().find(ActionIds.MENU_EDIT);
-					if(item != null) item.setVisible(false); 
-				}
-			}
-			
-			Diagram diagram = (Diagram)mySelectedElement.getModel();
-			if(diagram != null){
-				EObject model = diagram.getElement();
-				if(model instanceof Activity){
-					NodeAdapter adapter= BridgeHelper.getNodeAdapter(model);
-					if(adapter != null && adapter.isTargetReadOnly()){
-						action.setEnabled(false);
-						IContributionItem item = getDiagramContextMenuProvider().find(ActionIds.MENU_EDIT);
-						if(item != null) item.setVisible(false); 
-					}
-				}else if(model instanceof org.eclipse.epf.diagram.model.Diagram){
-//					if(((org.eclipse.epf.diagram.model.Diagram)diagram).isReadOnly()){
-//						action.setEnabled(false);
-//					}
-				}
-				
-			}
-		}else{
-			action.setEnabled(false);
-		}
-	}
-
-	@Override
-	protected Request createTargetRequest() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	protected Command getCommand() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteElementAction.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteElementAction.java
deleted file mode 100644
index 5d11a10..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteElementAction.java
+++ /dev/null
@@ -1,347 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.ui.actions.ProcessDeleteAction;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.actions.AbstractDeleteFromAction;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Replaces the default the Delete from Model and Delete from Diagram actions of GMF.
- * Delete the diagram element and its associated diagram and references. 
- * @author Shashidhar Kannoori.
- */
-public class DeleteElementAction extends AbstractDeleteFromAction {
-
-	boolean removeModel = true;
-	/** the target request */
-	private Request secondaryTargetRequest;
-	/**
-	 * @param part
-	 */
-	public DeleteElementAction(IWorkbenchPart part) {
-		super(part);
-		
-	}
-	@Override
-	protected boolean calculateEnabled() {
-		
-		List operationSet = getOperationSet();
-		if (operationSet.isEmpty()) {
-			return false;
-		}
-		Request request = getTargetRequest();
-		Iterator editParts = operationSet.iterator();
-		while (editParts.hasNext()) {
-			EditPart editPart = (EditPart) editParts.next();
-			// disable on diagram links 
-			if (editPart instanceof IGraphicalEditPart) {
-				IGraphicalEditPart gEditPart = (IGraphicalEditPart) editPart;
-				View view = (View) gEditPart.getModel();
-				EObject element = ViewUtil.resolveSemanticElement(view);
-				if ((element.eIsProxy())
-					|| (element instanceof Diagram)
-					|| BridgeHelper.isReadOnly(view)) {
-					return false;
-				}
-			} else {
-				Command curCommand = editPart.getCommand(request);
-				if (curCommand == null || (curCommand.canExecute() == false)) {
-					return false;
-				}
-			}
-		}
-		//return super.calculateEnabled();
-		return true;
-	}
-	
-	@Override
-	public boolean isEnabled() {
-		setEnabled(true);
-		List list = getSelectedObjects();
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			EditPart element = (EditPart) iter.next();
-			View view = (View)element.getModel();
-			if(BridgeHelper.isReadOnly(view)){
-				setEnabled(false);
-				return false;
-			}
-		}
-		return super.isEnabled();
-	}
-	
-	
-	
-	protected Request createTargetRequest() {
-		return 	new EditCommandRequestWrapper(new DestroyElementRequest(getEditingDomain(), false));
-	}
-	
-	 /**
-     * Gets editing domain
-     * 
-     * @return my editing domain
-     */
-    protected TransactionalEditingDomain getEditingDomain() {
-        
-        // try adapting the workbench part
-        IWorkbenchPart part = getWorkbenchPart();
-
-        if (part != null) {
-            IEditingDomainProvider edProvider = (IEditingDomainProvider) part
-                .getAdapter(IEditingDomainProvider.class);
-
-            if (edProvider != null) {
-            	EditingDomain domain = edProvider.getEditingDomain();
-            	
-            	if (domain instanceof TransactionalEditingDomain) {
-            		return (TransactionalEditingDomain) domain;
-            	}
-            }
-        }
-        return null;
-    }
-
-	@Override
-	protected boolean isSelectionListener() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-	
-	@Override
-	protected Request getTargetRequest() {
-		// TODO Auto-generated method stub
-		return super.getTargetRequest();
-	}
-	
-	protected boolean showInContextMenu(){
-		List operationSet = getOperationSet();
-		if (operationSet.isEmpty()) {
-			return false;
-		}
-		Request request = getTargetRequest();
-		Iterator editParts = operationSet.iterator();
-		while (editParts.hasNext()) {
-			EditPart editPart = (EditPart) editParts.next();
-			// disable on diagram links 
-			if (editPart instanceof IGraphicalEditPart) {
-				IGraphicalEditPart gEditPart = (IGraphicalEditPart) editPart;
-				View view = (View) gEditPart.getModel();
-				EObject element = ViewUtil.resolveSemanticElement(view);
-				if ((element.eIsProxy())
-					|| (element instanceof Diagram)) {
-					return false;
-				}
-			} else {
-				Command curCommand = editPart.getCommand(request);
-				if (curCommand == null || (curCommand.canExecute() == false)) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-	
-	@Override
-	protected Command getCommand(Request request) {
-		//return super.getCommand(request);
-		List operationSet = getOperationSet();
-		Iterator editParts = operationSet.iterator();
-		CompositeTransactionalCommand command =
-			new CompositeTransactionalCommand(getEditingDomain(), getCommandLabel());
-		while (editParts.hasNext()) {
-			EditPart editPart = (EditPart) editParts.next();
-			// disable on diagram links 
-			if (editPart instanceof IGraphicalEditPart){
-				IGraphicalEditPart gEditPart = 
-					(IGraphicalEditPart) editPart;
-				View view = (View)gEditPart.getModel();
-				EObject element = ViewUtil.resolveSemanticElement(view);
-				if(element instanceof Diagram)
-					return null;
-			}
-			Command curCommand = null;
-			if(editPart instanceof IGraphicalEditPart && isCanonical((IGraphicalEditPart)editPart)){
-				curCommand = editPart.getCommand(request);
-			}else{
-				curCommand = editPart.getCommand(getSecondaryTargetRequest());
-			}
-			if (curCommand != null) {
-				command.compose(new CommandProxy(curCommand));				
-			}
-		}
-		
-		if ((command.isEmpty())
-			|| (command.size() != operationSet.size())){
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new ICommandProxy(command);
-	}
-	@Override
-	protected void doRun(IProgressMonitor progressMonitor) {
-		
-		List operationSet = getOperationSet();
-		List<BreakdownElement> elements = new ArrayList<BreakdownElement>();
-		for (Iterator iter = operationSet.iterator(); iter
-				.hasNext();) {
-			Object editPart = iter.next();
-			if (editPart instanceof EditPart) {
-				Object obj = ((EditPart) editPart).getModel();
-				if (obj instanceof Node) {
-					MethodElement element = BridgeHelper.getMethodElement((Node)obj);
-					if (element != null && element instanceof BreakdownElement) {
-						elements.add((BreakdownElement)element);
-					}
-				}
-			}
-		}
-		if (!elements.isEmpty()) {
-			ProcessDeleteAction deleteAction = new ProcessDeleteAction() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.epf.authoring.ui.actions.MethodElementDeleteAction#createCommand(java.util.Collection)
-				 */
-				public org.eclipse.emf.common.command.Command createCommand(
-						Collection selection) {
-					domain = null;
-					for (Iterator iter = selection.iterator(); iter
-							.hasNext();) {
-						Object element = iter.next();
-						if (element instanceof WorkProductDescriptor) {
-							domain = new AdapterFactoryEditingDomain(
-									TngAdapterFactory.INSTANCE
-											.getPBS_ComposedAdapterFactory(),
-									new BasicCommandStack());
-							break;
-						}
-					}
-					if (domain == null) {
-						domain = new AdapterFactoryEditingDomain(
-								TngAdapterFactory.INSTANCE
-										.getWBS_ComposedAdapterFactory(),
-								new BasicCommandStack());
-					}
-					return super.createCommand(selection);
-				}
-
-			};
-			deleteAction.updateSelection(new StructuredSelection(
-					elements));
-			deleteAction.run();
-			if (deleteAction.isDeletionConfirmed()) {
-				super.doRun(progressMonitor);
-
-				// save the editor
-				// 
-				BusyIndicator.showWhile(getWorkbenchPart().getSite().getShell()
-						.getDisplay(), new Runnable() {
-
-					public void run() {
-						((AbstractDiagramEditor)getWorkbenchPart()).doSave(new NullProgressMonitor());
-					}
-				});
-			}
-
-		} else {
-			super.doRun(progressMonitor);
-		}
-	}
-	
-	@Override
-	public void init() {
-		super.init();
-		setId(ActionFactory.DELETE.getId());
-		setText(DiagramCoreResources.deleteCommand_label);
-		setToolTipText(DiagramCoreResources.deleteCommand_label);
-		ISharedImages workbenchImages = PlatformUI.getWorkbench().getSharedImages();
-		setHoverImageDescriptor(
-			workbenchImages.getImageDescriptor(
-				ISharedImages.IMG_TOOL_DELETE));
-		setImageDescriptor(
-			workbenchImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		setDisabledImageDescriptor(
-			workbenchImages.getImageDescriptor(
-				ISharedImages.IMG_TOOL_DELETE_DISABLED));
-	}
-	
-	@Override
-	protected List createOperationSet() {
-		// TODO Auto-generated method stub
-		return super.createOperationSet();
-	}
-	
-	/**
-	 * @param gep
-	 * @return
-	 */
-	private boolean isCanonical(IGraphicalEditPart gep) {
-		EditPart parent = gep.getParent();
-		if (parent instanceof IGraphicalEditPart) {
-			CanonicalEditPolicy cep = (CanonicalEditPolicy)parent.getEditPolicy(EditPolicyRoles.CANONICAL_ROLE);
-			if ( cep != null ) {
-				if (cep.isEnabled())
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	public Request getSecondaryTargetRequest(){
-		if(secondaryTargetRequest == null){
-			secondaryTargetRequest = new GroupRequest(
-					RequestConstants.REQ_DELETE);
-		}
-		return secondaryTargetRequest;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteElementActionDelegate.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteElementActionDelegate.java
deleted file mode 100644
index 28e846c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DeleteElementActionDelegate.java
+++ /dev/null
@@ -1,306 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.commands.DeleteDiagramCommand;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.util.DiagramCoreValidation;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.actions.ProcessDeleteAction;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IWorkbenchPart;
-
-
-/**
- * Replaces the default the Delete from Model and Delete from Diagram actions of GMF.
- * Delete the diagram element and its associated diagram and references. 
- * @author Shashidhar Kannoori.
- */
-public class DeleteElementActionDelegate extends ActionDelegate {
-
-	public DeleteElementActionDelegate() {
-		super();
-	}
-	public DeleteElementActionDelegate(IAction action, IWorkbenchPart targetPart) {
-		super(action, targetPart);
-	}
-
-
-	@Override
-	protected Command getCommand() {
-		targetRequest = null;
-		Request request = getTargetRequest();
-		Iterator<EditPart> editParts = selectedParts.iterator();
-		
-		List<Activity> activities = new ArrayList<Activity>();
-		
-		
-		org.eclipse.epf.uma.Process targetProcess = getOwningProcess();
-		
-		// Delete the diagram element and diagram model.
-		CompositeTransactionalCommand command =
-			new CompositeTransactionalCommand(getEditingDomain(), DiagramCoreResources.deleteCommand_label){
-			@Override
-			public boolean canUndo() {
-				Iterator<EditPart> editParts = selectedParts.iterator();
-				while (editParts.hasNext()) {
-					EditPart editPart = (EditPart) editParts.next();
-					// disable on diagram links 
-					if (editPart instanceof IGraphicalEditPart) {
-						IGraphicalEditPart gEditPart = (IGraphicalEditPart) editPart;
-						View view = (View) gEditPart.getModel();
-						EObject element = ViewUtil.resolveSemanticElement(view);
-						if (view instanceof Diagram || element instanceof Diagram)
-							continue;
-
-						MethodElement e = BridgeHelper.getMethodElement(view);
-						if (e != null && e instanceof Activity) {
-							return false;
-						}
-					}
-				}
-				return true;
-			}
-		};
-		while (editParts.hasNext()) {
-			EditPart editPart = (EditPart) editParts.next();
-			// disable on diagram links 
-			if (editPart instanceof IGraphicalEditPart) {
-				IGraphicalEditPart gEditPart = (IGraphicalEditPart) editPart;
-				View view = (View) gEditPart.getModel();
-				EObject element = ViewUtil.resolveSemanticElement(view);
-				if (view instanceof Diagram || element instanceof Diagram)
-					return null;
-
-				MethodElement e = BridgeHelper.getMethodElement(view);
-				if (e != null && e instanceof Activity) {
-					activities.add((Activity) e);
-				}
-
-				Command curCommand = null;
-				if (editPart instanceof IGraphicalEditPart
-						&& isCanonical((IGraphicalEditPart) editPart)) {
-					curCommand = editPart.getCommand(request);
-				} else {
-					curCommand = editPart
-							.getCommand(getSecondaryTargetRequest());
-				}
-				if(curCommand == null && isDiagramUIObject(view)){
-					curCommand = editPart
-					.getCommand(getSecondaryTargetRequest());
-				}
-				if (curCommand != null) {
-					command.compose(new CommandProxy(curCommand));
-				}
-			}
-		}
-		if ((command.isEmpty())
-			|| (command.size() != selectedParts.size())){
-			return UnexecutableCommand.INSTANCE;
-		}
-		// Delete the related diagram of deleted Activity
-		if(!activities.isEmpty()){
-			new DeleteDiagramCommand(activities, targetProcess).execute();
-		}
-		return new ICommandProxy(command);
-	}
-
-	private boolean isDiagramUIObject(View view) {
-		return view.getElement() == null;
-	}
-	@Override
-	protected Request createTargetRequest() {
-		return 	new EditCommandRequestWrapper(new DestroyElementRequest(getEditingDomain(), false));
-	}
-	@Override
-	public void selectionChanged(IAction action, ISelection selection) {
-		setEnabled(true);
-		super.selectionChanged(action, selection);
-		for (Iterator iter = selectedParts.iterator(); iter.hasNext();) {
-			EditPart element = (EditPart) iter.next();
-			View view = (View)element.getModel();
-			if(view.getElement() == null) {
-				// this view is not associated with any model
-				// it can be deleted
-				//
-				continue;
-			}
-			if(view instanceof Diagram 
-					|| BridgeHelper.isReadOnly(view)
-					|| TngUtil.isLocked(getOwningProcess())
-					|| (view.getElement() instanceof org.eclipse.epf.diagram.model.LinkedObject && 
-							view.getDiagram().getElement() instanceof ActivityDetailDiagram)
-					|| (BridgeHelper.getMethodElement(view) != null &&
-							BridgeHelper.isInherited(view))
-							) {
-				action.setEnabled(false);
-				setEnabled(false);
-				break;
-			}
-			if(view instanceof Edge){
-				if(DiagramCoreValidation.checkDelete((Edge)view) != null){
-					action.setEnabled(false);
-					setEnabled(false);
-					break;
-				}
-			}
-		}
-	}
-	
-	@Override
-	public void run(IAction action) {
-		if(!isEnabled()) return;
-		List<BreakdownElement> elements = new ArrayList<BreakdownElement>();
-		for (Iterator iter = selectedParts.iterator(); iter
-				.hasNext();) {
-			Object editPart = iter.next();
-			if (editPart instanceof EditPart) {
-				Object obj = ((EditPart) editPart).getModel();
-				if (obj instanceof Node) {
-					MethodElement element = BridgeHelper.getMethodElement((Node)obj);
-					if (element != null && element instanceof BreakdownElement) {
-						elements.add((BreakdownElement)element);
-					}
-				}
-			}
-		}
-		if (!elements.isEmpty()) {
-			ProcessDeleteAction deleteAction = new ProcessDeleteAction() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.epf.authoring.ui.actions.MethodElementDeleteAction#createCommand(java.util.Collection)
-				 */
-				public org.eclipse.emf.common.command.Command createCommand(
-						Collection selection) {
-					domain = null;
-					for (Iterator iter = selection.iterator(); iter
-							.hasNext();) {
-						Object element = iter.next();
-						if (element instanceof WorkProductDescriptor) {
-							domain = new AdapterFactoryEditingDomain(
-									TngAdapterFactory.INSTANCE
-											.getPBS_ComposedAdapterFactory(),
-									new BasicCommandStack());
-							break;
-						}
-					}
-					if (domain == null) {
-						domain = new AdapterFactoryEditingDomain(
-								TngAdapterFactory.INSTANCE
-										.getWBS_ComposedAdapterFactory(),
-								new BasicCommandStack());
-					}
-					return super.createCommand(selection);
-				}
-
-			};
-			deleteAction.updateSelection(new StructuredSelection(
-					elements));
-			deleteAction.run();
-			if (deleteAction.isDeletionConfirmed()) {
-				super.run(action);
-
-				// save the editor
-				// 
-				BusyIndicator.showWhile(targetPart.getSite().getShell()
-						.getDisplay(), new Runnable() {
-
-					public void run() {
-						((AbstractDiagramEditor)targetPart).doSave(new NullProgressMonitor());
-						if(getDiagramCommandStack() != null){
-							getDiagramCommandStack().flush();
-						}
-					}
-				});
-			}
-
-		} else {
-			super.run(action);
-		}
-	}
-	
-	/**
-	 * @param gep
-	 * @return
-	 */
-	private boolean isCanonical(IGraphicalEditPart gep) {
-		EditPart parent = gep.getParent();
-		if (parent instanceof IGraphicalEditPart) {
-			CanonicalEditPolicy cep = (CanonicalEditPolicy)parent.getEditPolicy(EditPolicyRoles.CANONICAL_ROLE);
-			if ( cep != null ) {
-				if (cep.isEnabled())
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	public Request getSecondaryTargetRequest(){
-		if(secondaryTargetRequest == null){
-			secondaryTargetRequest = new GroupRequest(
-					RequestConstants.REQ_DELETE);
-		}
-		return secondaryTargetRequest;
-	}
-	private Request secondaryTargetRequest;
-	
-	private org.eclipse.epf.uma.Process getOwningProcess(){
-		if(targetPart != null){
-			Diagram d = ((AbstractDiagramEditor)targetPart).getDiagram();
-			DiagramAdapter adapter = BridgeHelper.getDiagramAdapter(d.getElement());
-			if(adapter != null){
-				return TngUtil.getOwningProcess(adapter.getActivity());
-			}
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DiagramActionsService.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DiagramActionsService.java
deleted file mode 100644
index 00bf709..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/DiagramActionsService.java
+++ /dev/null
@@ -1,593 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.actions;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.commands.ChangeBoundsCommand;
-import org.eclipse.epf.diagram.core.commands.ReconnectLinkCommand;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-
-/**
- * Service class to allow create and register common actions to the action
- * register. Code is migrate from old method of diagramming.
- * 
- * @author Shashidhar Kannoori
- * @since 1.2
- */
-public class DiagramActionsService {
-
-	public static final String ALIGN_HORZ_AVERAGE = "align_horizontal_to_average"; //$NON-NLS-1$
-
-	public static final String ALIGN_HORZ_FIRST_SELECTED = "align_horizontal_to_first_selection"; //$NON-NLS-1$
-
-	public static final String ALIGN_VERT_AVERAGE = "align_vertical_to_average"; //$NON-NLS-1$
-
-	public static final String ALIGN_VERT_FIRST_SELECTED = "align_vertical_to_first_selection"; //$NON-NLS-1$
-
-	private DefaultEditDomain editDomain;
-
-	private GraphicalViewer graphicalViewer;
-
-	private ActionRegistry actionRegistry;
-	
-	private InternalTransactionalEditingDomain transactionDomain;
-
-	/**
-	 * Constructor 
-	 * @param graphicalViewer {@link GraphicalViewer}
-	 * @param editDomain 	{@link DefaultEditDomain}
-	 * @param actionRegistry 	{@link ActionRegistry}
-	 */
-	public DiagramActionsService(InternalTransactionalEditingDomain transactionDomain, GraphicalViewer graphicalViewer,
-			DefaultEditDomain editDomain, ActionRegistry actionRegistry) {
-		this.transactionDomain = transactionDomain;
-		this.graphicalViewer = graphicalViewer;
-		this.editDomain = editDomain;
-		this.actionRegistry = actionRegistry;
-	}
-
-	/**
-	 * Sets the GraphicalViewer.
-	 */
-	public void setGraphicalViewer(GraphicalViewer graphicalViewer) {
-		this.graphicalViewer = graphicalViewer;
-	}
-
-	/**
-	 * returns GraphicalViewer
-	 */
-	private GraphicalViewer getGraphicalViewer() {
-		return graphicalViewer;
-	}
-
-	/**
-	 * Returns the command stack.
-	 * 
-	 * @return the command stack
-	 */
-	protected CommandStack getCommandStack() {
-		return getEditDomain().getCommandStack();
-	}
-
-	/**
-	 * Returns the edit domain.
-	 * 
-	 * @return the edit domain
-	 */
-	protected DefaultEditDomain getEditDomain() {
-		return editDomain;
-	}
-
-	protected ActionRegistry getActionRegistry() {
-		return actionRegistry;
-	}
-
-	/**
-	 * Register HorizontalAlignAverageAction action. 
-	 * HorizontalAignAverage Action aligns selected editparts to horizontal average.  
-	 */
-	public IAction registerHorizontalAlignAverageAction() {
-		// align horizontally to average y-value of all nodes
-		IAction hAlignAverageAction = new Action(
-				DiagramCoreResources.AbstractDiagramEditor_hAlignAverageAction_text) { //$NON-NLS-1$
-			public void run() {
-				horizAlignToAverageSelected();
-			}
-
-			public String getId() {
-				return ALIGN_HORZ_AVERAGE;
-			}
-		};
-		getActionRegistry().registerAction(hAlignAverageAction);
-
-		return hAlignAverageAction;
-	}
-	
-	/**
-	 * Register HorizontalAlignFirstSelectedAction action. 
-	 * HorizontalAlignFirstSelectedAction aligns selected editparts with 
-	 * respect to first selected editpart. 
-	 */
-
-	public IAction registerHorizontalAlignFirstSelectedAction() {
-		// align horizontally to y-value of first selected node
-		IAction hAlignFirstSelectedAction = new Action(
-				DiagramCoreResources.AbstractDiagramEditor_hAlignFirstSelectedAction_text) { //$NON-NLS-1$
-			public void run() {
-				horzAlignToFirstSelected();
-			}
-
-			public String getId() {
-				return ALIGN_HORZ_FIRST_SELECTED;
-			}
-		};
-		getActionRegistry().registerAction(hAlignFirstSelectedAction);
-
-		return hAlignFirstSelectedAction;
-	}
-	
-	/**
-	 * Register vertialAlignAverageAction action. 
-	 * vertialAlignAverageAction aligns selected editparts vertically w.r.t average.
-	 * 
-	 */
-	
-	public IAction registerVerticalAlignAverageAction() {
-		// align vertically to average x-value of all selected nodes
-		IAction vAlignAverageAction = new Action(
-				DiagramCoreResources.AbstractDiagramEditor_vAlignAverageAction_text) { //$NON-NLS-1$
-			public void run() {
-				verticalAlignToAverageSelected();
-			}
-
-			public String getId() {
-				return ALIGN_VERT_AVERAGE;
-			}
-		};
-		getActionRegistry().registerAction(vAlignAverageAction);
-
-		return vAlignAverageAction;
-	}
-
-	/**
-	 * Register vertialAlignFirstSelectedAction action. 
-	 * vertialAlignFirstSelectedAction aligns selected editparts vertically w.r.t first selected.
-	 * 
-	 */
-
-	public IAction registerVerticalAlignFirstSelectedAction() {
-		// align vertically to x-value of first selected node
-		IAction vAlignFirstSelectedAction = new Action(
-				DiagramCoreResources.AbstractDiagramEditor_vAlignFirstSelectedAction_text) { //$NON-NLS-1$
-			public void run() {
-				verticalAlignToFirstSelected();
-			}
-
-			public String getId() {
-				return ALIGN_VERT_FIRST_SELECTED;
-			}
-		};
-		getActionRegistry().registerAction(vAlignFirstSelectedAction);
-
-		return vAlignFirstSelectedAction;
-	}
-
-	// /////////////////////////////////////////////////////////////////////////////////////////////////
-	// action methods
-	// /////////////////////////////////////////////////////////////////////////////////////////////////
-	
-	/** 
-	 * Action implementation method for horizontalAlignFirsteSElectedAction.
-	 * 
-	 */
-	public void horzAlignToFirstSelected() {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart firstPart = null;
-		// loop through all selected items, remember the y-value of the
-		// first node,
-		// set the following nodes to the same y-value
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// remember the first part we move
-				if (firstPart == null) {
-					firstPart = ep;
-				} else {
-					// calculate the offset for centerline alignment
-					Rectangle bounds = ep.getFigure().getBounds();
-					int offset = (int) ((double) (bounds.height - firstPart
-							.getFigure().getBounds().height) / 2.0);
-					// is this node in a container?
-					if (!(ep.getParent() instanceof DiagramEditPart)) {
-						// need to move the container, adjust the offset
-						ep = (AbstractGraphicalEditPart) ep.getParent();
-						Rectangle parentBounds = ep.getFigure().getBounds();
-						offset += bounds.y - parentBounds.y;
-						bounds = parentBounds;
-					}
-					// send the command to move the node
-					org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(transactionDomain,
-							(Node) ep.getModel(), new Point(bounds.x, firstPart
-									.getFigure().getBounds().y
-									- offset), bounds.width, -1);
-					getCommandStack().execute(c);
-				}
-			}
-		}
-	}
-	
-	/** 
-	 * Action implementation method for horizontalAlignAverageAction.
-	 * 
-	 */
-	public void horizAlignToAverageSelected() {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart firstPart = null;
-		int total = 0;
-		int ysum = 0;
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// remember the first part we move
-				if (firstPart == null) {
-					firstPart = ep;
-				}
-				ysum += ep.getFigure().getBounds().y;
-				total++;
-			}
-		}
-		// calculate the average y-value for all nodes
-		int yave = (int) ((double) ysum / (double) total);
-		// loop through all the nodes again and set them
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// calculate the height difference, so that elements are aligned
-				// through the centerline
-				Rectangle bounds = ep.getFigure().getBounds();
-				int offset = (int) ((double) (bounds.height - firstPart
-						.getFigure().getBounds().height) / 2.0);
-				// is this node inside a container?
-				if (!(ep.getParent() instanceof DiagramEditPart)) {
-					// we need to move the container, adjust the offset
-					ep = (AbstractGraphicalEditPart) ep.getParent();
-					Rectangle parentBounds = ep.getFigure().getBounds();
-					offset += bounds.y - parentBounds.y;
-					bounds = parentBounds;
-				}
-				// send the command to move the node
-				org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(transactionDomain,
-						(Node) ep.getModel(),
-						new Point(bounds.x, yave - offset), bounds.width, -1);
-				getCommandStack().execute(c);
-			}
-		}
-
-	}
-	/** 
-	 * Action implementation method for verticalAlignToAverageAction.
-	 * 
-	 */
-
-	public void verticalAlignToAverageSelected() {
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart firstPart = null;
-		int total = 0;
-		int xsum = 0;
-		// loop through the selected parts
-		for (int a = 0; a < editParts.size(); a++) {
-			// we are only interested in nodes and containers
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				if (firstPart == null) {
-					firstPart = ep;
-				}
-				// sum the x coordinates of each element
-				xsum += ep.getFigure().getBounds().x;
-				// remember how many selected elements applied to this operation
-				total++;
-			}
-		}
-		// calculate the average x-value for all nodes
-		int xave = (int) ((double) xsum / (double) total);
-		// loop through all the nodes again and set them
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// calculate the offset for centerline alignment
-				Rectangle bounds = ep.getFigure().getBounds();
-				int offset = (int) ((double) (bounds.width - firstPart
-						.getFigure().getBounds().width) / 2.0);
-				// are we inside a container?
-				if (!(ep.getParent() instanceof DiagramEditPart)) {
-					// adjust the offset since we have to move the container
-					ep = (AbstractGraphicalEditPart) ep.getParent();
-					Rectangle parentBounds = ep.getFigure().getBounds();
-					offset += bounds.x - parentBounds.x;
-					bounds = parentBounds;
-				}
-				// send the command to move the element
-				org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(transactionDomain,
-						(Node) ep.getModel(),
-						new Point(xave - offset, bounds.y), bounds.width, -1);
-				getCommandStack().execute(c);
-			}
-		}
-
-	}
-	/** 
-	 * Action implementation method for verticalAlignToFirstSelectedAction.
-	 * 
-	 */
-
-	public void verticalAlignToFirstSelected() {
-		// get the selected items
-		List editParts = getGraphicalViewer().getSelectedEditParts();
-		AbstractGraphicalEditPart alignToPart = null;
-		// find the first diagram part we can align to
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				if (alignToPart == null) {
-					// remember it and stop
-					alignToPart = ep;
-					break;
-				}
-			}
-		}
-		// loop through the elements and set their new position
-		for (int a = 0; a < editParts.size(); a++) {
-			if (editParts.get(a) instanceof ShapeNodeEditPart) {
-				AbstractGraphicalEditPart ep = (AbstractGraphicalEditPart) editParts
-						.get(a);
-				// we can skip the first one since this is an align-to
-				if (ep != alignToPart
-						&& !(DiagramCoreUtil.isSyncBar(alignToPart))) {
-					// calculate the offset for centerline alignment
-					if (!(DiagramCoreUtil.isSyncBar(ep))) {
-						Rectangle bounds = ep.getFigure().getBounds();
-						int offset = (int) ((double) (bounds.width - alignToPart
-								.getFigure().getBounds().width) / 2.0);
-						// is this inside a container?
-						if (!(ep.getParent() instanceof DiagramEditPart)) {
-							// adjust the offset since we are moving the
-							// container
-							ep = (AbstractGraphicalEditPart) ep.getParent();
-							Rectangle parentBounds = ep.getFigure().getBounds();
-							offset += bounds.x - parentBounds.x;
-							bounds = parentBounds;
-						}
-						// send the command to move the element
-						org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(transactionDomain,
-								(Node) ep.getModel(), new Point(alignToPart
-										.getFigure().getBounds().x
-										- offset, bounds.y), bounds.width, -1);
-						getCommandStack().execute(c);
-						ep.getFigure().setLocation(
-								new Point(alignToPart.getFigure().getBounds().x
-										- offset, bounds.y));
-					} else {
-						Point tp = ep.getFigure().getBounds().getCenter();
-						boolean connected = false;
-						boolean source = false;
-						Point endPoint = null;
-						ConnectionNodeEditPart lp = null;
-						// check target connections
-						List list = ((ShapeNodeEditPart) ep).getTargetConnections();
-						for (Iterator itor = list.iterator(); itor.hasNext();) {
-							lp = (ConnectionNodeEditPart) itor.next();
-							if (lp.getSource().equals(alignToPart)) {
-								connected = true;
-								break;
-							}
-						}
-						// check source connections if not found in target connections
-						if (!connected) {
-							list = ((ShapeNodeEditPart) ep).getSourceConnections();
-							for (Iterator itor = list.iterator(); itor
-									.hasNext();) {
-								lp = (ConnectionNodeEditPart) itor.next();
-								if (lp.getTarget().equals(alignToPart)) {
-									connected = true;
-									source = true;
-									break;
-								}
-							}
-						}
-						if (connected && (alignToPart instanceof ShapeNodeEditPart)) {
-									Point centerPoint = alignToPart.getFigure()
-											.getBounds().getCenter();
-									int delta = centerPoint.x - tp.x;
-							endPoint.x += delta;
-									ReconnectLinkCommand c = new ReconnectLinkCommand(transactionDomain,
-									(Edge) lp.getModel(), (Node) ep.getModel(),
-									source);
-							c.setEndPoint(endPoint);
-									getCommandStack().execute(c);
-						}
-
-					}
-				}
-				// If first selected edit part is syncbarnodeeditpart, need to
-				// handle differently
-				if (ep != alignToPart
-						&& !(DiagramCoreUtil.isSyncBar(alignToPart))) {
-
-					Point sp = alignToPart.getFigure().getBounds()
-							.getCenter();
-					boolean connected = false;
-					// check if the part is connected via source connections
-					List list = ((ShapeNodeEditPart) alignToPart)
-							.getSourceConnections();
-					for (Iterator itor = list.iterator(); itor.hasNext();) {
-						ConnectionNodeEditPart lp = (ConnectionNodeEditPart) itor.next();
-						if (lp.getTarget().equals(ep)) {
-							connected = true;
-							break;
-						}
-					}
-					// if not found above, check if it is connected via target connections
-					if (!connected) {
-						list = ((ShapeNodeEditPart) alignToPart)
-								.getTargetConnections();
-						for (Iterator itor = list.iterator(); itor.hasNext();) {
-							ConnectionNodeEditPart lp = (ConnectionNodeEditPart) itor.next();
-							if (lp.getSource().equals(ep)) {
-								connected = true;
-								break;
-							}
-						}
-					}
-					if (DiagramCoreUtil.isSyncBar(ep)) {
-						Point p = new Point();
-						p.x = ((Integer) ViewUtil.getStructuralFeatureValue((View)ep.getModel(),
-								NotationPackage.eINSTANCE.getLocation_X())).intValue();
-						p.y = ((Integer) ViewUtil.getStructuralFeatureValue((View)ep.getModel(),
-								NotationPackage.eINSTANCE.getLocation_Y())).intValue();
-						Point tp = p.getCopy();
-						Point alignToCenter = alignToPart.getFigure().getBounds().getCenter();
-						Point centerPoint = ep.getFigure().getBounds().getCenter();
-						int delta = alignToCenter.x - centerPoint.x;
-						tp.x = tp.x + delta;
-						org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(transactionDomain,
-								(Node) ep.getModel(), tp, ep.getFigure()
-										.getBounds().width, -1);
-						getCommandStack().execute(c);
-						ep.getFigure().setLocation(new Point(tp.x, tp.y));
-					} else if (ep instanceof ShapeNodeEditPart) {
-						Point p = new Point();
-						p.x = ((Integer) ViewUtil.getStructuralFeatureValue((View)ep.getModel(),
-								NotationPackage.eINSTANCE.getLocation_X())).intValue();
-						p.y = ((Integer) ViewUtil.getStructuralFeatureValue((View)ep.getModel(),
-								NotationPackage.eINSTANCE.getLocation_Y())).intValue();
-						Point tp = p.getCopy();
-						Point centerPoint = ep.getFigure().getBounds()
-								.getCenter();
-						int delta = sp.x - centerPoint.x;
-						tp.x = tp.x + delta;
-						org.eclipse.gef.commands.Command c = new ChangeBoundsCommand(transactionDomain,
-								(Node) ep.getModel(), tp, ep.getFigure()
-										.getBounds().width, -1);
-						getCommandStack().execute(c);
-						ep.getFigure().setLocation(new Point(tp.x, tp.y));
-					}
-				}
-			}
-		}
-	}
-	
-	public void createAlignMenu(IMenuManager menu, boolean canModify) {
-		// create a new menu manager for the cascading menu
-		
-		IContributionItem formatMenu = menu.find(ActionIds.MENU_FORMAT);
-		
-		MenuManager alignMenuManager = null;
-		if (alignMenuManager == null) {
-			alignMenuManager = new MenuManager(
-					DiagramCoreResources.AbstractDiagramEditor_alignMenu_text) { //$NON-NLS-1$
-
-				public boolean isEnabled() {
-					int total = 0;
-					// enable the menu only if 2 or more nodes or node
-					// containers
-					// are selected
-					List editParts = graphicalViewer.getSelectedEditParts();
-					// need at least two things selected to align
-					if (editParts.size() > 1) {
-						for (int a = 0; a < editParts.size(); a++) {
-							EditPart editPart = (EditPart) editParts.get(a);
-							// we can align nodes and containers
-							if (editPart instanceof ShapeNodeEditPart) {
-								// add up the elements we need, there may be
-								// more
-								// elements selected (links, etc.)
-								total++;
-								if (total > 1) {
-									// we only need to know there is more than
-									// 1, so
-									// we can stop here
-									break;
-								}
-							}
-						}
-					}
-					return total > 1;
-				}
-			};
-		}
-		if (formatMenu != null && formatMenu instanceof IMenuManager 
-				&& alignMenuManager.isEnabled() && canModify) {
-			IContributionItem item =  ((IMenuManager)formatMenu).find(ActionIds.MENU_ALIGN);
-			if(item != null && item instanceof IMenuManager){
-				IMenuManager alignMenu = (IMenuManager)item;
-				alignMenu.add(getActionRegistry().getAction(
-						DiagramActionsService.ALIGN_HORZ_AVERAGE));
-				alignMenu.add(getActionRegistry().getAction(
-						DiagramActionsService.ALIGN_HORZ_FIRST_SELECTED));
-				alignMenu.add(getActionRegistry().getAction(
-						DiagramActionsService.ALIGN_VERT_AVERAGE));
-				alignMenu.add(getActionRegistry().getAction(
-						DiagramActionsService.ALIGN_VERT_FIRST_SELECTED));
-			}
-		}else{
-			alignMenuManager.add(getActionRegistry().getAction(
-					DiagramActionsService.ALIGN_HORZ_AVERAGE));
-			alignMenuManager.add(getActionRegistry().getAction(
-					DiagramActionsService.ALIGN_HORZ_FIRST_SELECTED));
-			alignMenuManager.add(getActionRegistry().getAction(
-					DiagramActionsService.ALIGN_VERT_AVERAGE));
-			alignMenuManager.add(getActionRegistry().getAction(
-					DiagramActionsService.ALIGN_VERT_FIRST_SELECTED));
-			if (alignMenuManager.isEnabled() && canModify) {
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-								new Separator());
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS, alignMenuManager);
-				menu.appendToGroup(GEFActionConstants.MB_ADDITIONS,
-								new Separator());
-			}
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/EditorActionDelegate.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/EditorActionDelegate.java
deleted file mode 100644
index 5af9975..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/EditorActionDelegate.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.eclipse.epf.diagram.core.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.library.edit.command.ActionManager;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IEditorActionDelegate;
-import org.eclipse.ui.IEditorPart;
-
-public class EditorActionDelegate implements IEditorActionDelegate {
-
-	protected IEditorPart targetEditor;
-	protected List<EditPart> selectedParts = new ArrayList<EditPart>();
-
-	
-	public EditorActionDelegate() {
-	}
-
-	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-		this.targetEditor = targetEditor;
-	}
-
-	public void run(IAction action) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		selectedParts.clear();
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			if (structuredSelection.size() >0
-					&& structuredSelection.getFirstElement() instanceof IGraphicalEditPart) {
-				selectedParts.addAll(structuredSelection.toList());
-			}
-		}
-	}
-	
-	protected ActionManager getActionManager(){
-		if(targetEditor != null && targetEditor instanceof AbstractDiagramEditor){
-			Diagram diagram = ((AbstractDiagramEditor)targetEditor).getDiagram();
-			if(diagram != null){
-				DiagramAdapter adapter = BridgeHelper.getDiagramAdapter(diagram.getElement());
-				if(adapter != null){
-					return (ActionManager)adapter.getActionManager();
-				}
-			}
-		}
-		return null;
-	}
-	
-	 /**
-     * Gets editing domain
-     * 
-     * @return my editing domain
-     */
-    protected TransactionalEditingDomain getEditingDomain() {
-        
-        // try adapting the workbench part
-        IEditorPart part = targetEditor;
-
-        if (part != null) {
-            IEditingDomainProvider edProvider = (IEditingDomainProvider) part
-                .getAdapter(IEditingDomainProvider.class);
-
-            if (edProvider != null) {
-            	EditingDomain domain = edProvider.getEditingDomain();
-            	
-            	if (domain instanceof TransactionalEditingDomain) {
-            		return (TransactionalEditingDomain) domain;
-            	}
-            }
-        }
-        return null;
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/RefreshAction.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/RefreshAction.java
deleted file mode 100644
index c01bb80..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/RefreshAction.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.actions;
-
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Refresh action refreshes the DiagramEditPart, performs deactivate and activate. 
- * 
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- */
-public class RefreshAction implements IObjectActionDelegate {
-	private IDiagramWorkbenchPart activePart;
-
-	public RefreshAction() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		if(targetPart instanceof IDiagramWorkbenchPart) {
-			activePart = ((IDiagramWorkbenchPart)targetPart);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if(activePart != null) {
-			if(activePart instanceof AbstractDiagramEditor) {
-				AbstractDiagramEditor editor = ((AbstractDiagramEditor)activePart); 
-				editor.refresh();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/RefreshFromBaseAction.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/RefreshFromBaseAction.java
deleted file mode 100644
index 3568320..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/actions/RefreshFromBaseAction.java
+++ /dev/null
@@ -1,649 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.command.CopyCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.core.services.DiagramService;
-import org.eclipse.epf.diagram.model.impl.NodeImpl;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ObjectNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-
-/**
- * Action to refresh the latest changes from base activity diagram into 
- * extend's Activity diagram. Action will keep the existing immediate children's 
- * information of extend diagram, only refresh the base diagram's related information. 
- * @author Shashidhar Kannoori
- */
-public class RefreshFromBaseAction implements IObjectActionDelegate {
-
-	private EditPart editPart;
-	private IWorkbenchPart targetPart;
-	/**
-	 * 
-	 */
-	public RefreshFromBaseAction() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		this.targetPart = targetPart;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		refreshFromBaseCommand.execute();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		editPart = null;
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			if (structuredSelection.size() == 1
-					&& structuredSelection.getFirstElement() instanceof EditPart) {
-				editPart = (EditPart) structuredSelection
-						.getFirstElement();
-			}
-		}
-		if(editPart != null){
-			action.setChecked(false);
-			// Check if diagram readonly.
-			if(editPart instanceof DiagramEditPart){
-				if(!((DiagramEditPart)editPart).isEditModeEnabled()){
-					action.setEnabled(false);
-					return;
-				}
-			}
-
-			// Checked variability 
-			Diagram diagram = (Diagram)editPart.getModel();
-			EObject model = diagram.getElement();
-			Activity e = null;
-			if(model instanceof org.eclipse.uml2.uml.Activity){
-				e = (Activity)BridgeHelper.getMethodElement((EModelElement)model);
-			}else if(model instanceof org.eclipse.epf.diagram.model.Diagram){
-				e = (Activity)((org.eclipse.epf.diagram.model.Diagram)model).getLinkedElement();
-			}
-			if(e != null){
-				if(e instanceof Activity){
-					if(((Activity)e).getVariabilityBasedOnElement() == null
-							|| (((Activity)e).getVariabilityBasedOnElement() != null
-							&& ((Activity)e).getVariabilityType() != VariabilityType.EXTENDS_LITERAL)){
-						action.setEnabled(false);
-						return;
-					}
-				}
-
-			}
-		}else{
-			action.setEnabled(false);
-		}
-	}
-	
-	/**
-	 * Refresh base from previous graphical editor code.
-	 * TODO: handle consumer (set)
-	 * 
-	 */
-	private Command refreshFromBaseCommand = new Command(DiagramCoreResources.AbstractDiagramEditorrefreshfrombase) { //$NON-NLS-1$
-		private ArrayList oldContent = new ArrayList();
-
-		public void execute() {
-			Diagram diagram = (Diagram) editPart.getModel();
-			
-			EditPart parent = editPart.getParent();
-			// back up old diagram content
-			//
-			oldContent.clear();
-			oldContent.addAll(diagram.getPersistedChildren());
-
-			boolean refreshed = //DiagramHelper.refreshFromBase(diagram);
-				refreshFromBase(diagram);
-			if(!refreshed) return;
-			
-			if (editPart.isActive()) {
-				editPart.deactivate();
-			}
-			//diagram.removeConsumer(this);
-			//createEditPart();
-			editPart = (EditPart)EditPartService.getInstance().createGraphicEditPart(diagram);
-			editPart.setParent(parent);
-			parent.getViewer().setContents(editPart);
-		}
-
-		public void undo() {
-			Diagram diagram = (Diagram) editPart.getModel();
-			diagram.getChildren().clear();
-			diagram.getChildren().addAll(oldContent);
-			if (editPart.isActive()) {
-				editPart.deactivate();
-			}
-			//diagram.removeConsumer(this);
-			editPart = (EditPart)EditPartService.getInstance().createGraphicEditPart(diagram);
-			getGraphicalViewer().setContents(editPart);
-			editPart.activate();
-		}
-	};
-	
-	private GraphicalViewer getGraphicalViewer(){
-		return (GraphicalViewer)editPart.getRoot().getViewer();
-	}
-	
-	public boolean refreshFromBase(final Diagram diagram) {
-		final boolean[] resultHolder = new boolean[1];
-		try {
-			TxUtil.runInTransaction(diagram, new Runnable() {
-
-				public void run() {
-					resultHolder[0] = doRefreshFromBase(diagram);
-				}
-				
-			});			
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-		return resultHolder[0];
-	}
-	
-	public boolean refreshFromBase(final Diagram diagram, final Activity activity) {
-		final boolean[] resultHolder = new boolean[1];
-		try {
-			TxUtil.runInTransaction(diagram, new Runnable() {
-
-				public void run() {
-					resultHolder[0] = doRefreshFromBase(diagram, activity);
-				}
-				
-			});			
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-		return resultHolder[0];
-	}
-
-	private static interface IDiagramAssociationHelper {
-		/**
-		 * Gets the {@link MethodElement} that the given {@link Node} represents.
-		 * 
-		 * @param node
-		 * @param resourceSet the resource set of the library
-		 * @return
-		 */
-		MethodElement getMethodElement(Node node, ResourceSet resourceSet);
-		
-		/**
-		 * Finds in the given diagram the node that represents the given {@link MethodElement}.
-		 *  
-		 * @param diagram
-		 * @param e
-		 * @return
-		 */
-		Node findNode(Diagram diagram, MethodElement e);
-				
-		/**
-		 * Re-associates activity nodes in the base diagram copy with corresponding
-		 * locally contributors or replacers if there is any.
-		 * 
-		 * @param activity
-		 * @param copyOfBaseDiagram
-		 */
-		void reassociate(Activity activity, Diagram copyOfBaseDiagram);
-		
-		void addNodeModels(EObject diagramModel, Collection<?> nodeModels);
-		
-		void addEdgeModels(EObject diagramModel, Collection<?> edgeModels);
-		
-		void removeNodeModel(EObject diagramModel, EObject nodeModel);
-		
-		void removeEdgeModel(EObject diagramModel, EObject edgeModel);
-
-		Collection<?> getNodeModels(EObject element);
-
-		Collection<?> getEdgeModels(EObject element);
-	}
-	
-	private static final IDiagramAssociationHelper ADAssociationHelper = new IDiagramAssociationHelper() {
-
-		public Node findNode(Diagram diagram, MethodElement e) {
-			return DiagramHelper.findNode(diagram, e);
-		}
-
-		public MethodElement getMethodElement(Node node, ResourceSet resourceSet) {
-			EObject umlObject = node.getElement();
-			if (umlObject instanceof StructuredActivityNode
-					|| umlObject instanceof ObjectNode) {
-				MethodElement e = BridgeHelper
-						.getMethodElement((ActivityNode) umlObject);
-				if (e == null && resourceSet != null) {
-					// base diagram is not open, try to get from
-					// annotation
-					//
-					e = BridgeHelper
-							.getMethodElementFromAnnotation(
-									(EModelElement) umlObject, resourceSet);
-				}
-				return e;
-			}
-			return null;
-		}
-
-		public void reassociate(Activity activity, Diagram copyOfBaseDiagram) {
-			DiagramHelper.reassociate(activity, copyOfBaseDiagram);
-		}
-
-		public void addEdgeModels(EObject diagramModel, Collection<?> edgeModels) {
-			if(!(diagramModel instanceof org.eclipse.uml2.uml.Activity)) {
-				return;
-			}
-			DiagramAdapter diagramAdapter = BridgeHelper.getDiagramAdapter(diagramModel);
-			boolean oldNotify = false;
-			if(diagramAdapter != null) {
-				oldNotify = diagramAdapter.isNotificationEnabled();
-				diagramAdapter.setNotificationEnabled(false);
-			}
-			try {
-				((org.eclipse.uml2.uml.Activity) diagramModel).getEdges().addAll((Collection<? extends ActivityEdge>) edgeModels);
-			}
-			finally {
-				if(diagramAdapter != null) {
-					diagramAdapter.setNotificationEnabled(oldNotify);
-				}
-			}
-		}
-
-		public void addNodeModels(EObject diagramModel, Collection<?> nodeModels) {
-			if(!(diagramModel instanceof org.eclipse.uml2.uml.Activity)) {
-				return;
-			}
-			DiagramAdapter diagramAdapter = BridgeHelper.getDiagramAdapter(diagramModel);
-			boolean oldNotify = false;
-			if(diagramAdapter != null) {
-				oldNotify = diagramAdapter.isNotificationEnabled();
-				diagramAdapter.setNotificationEnabled(false);
-			}
-			try {
-				((org.eclipse.uml2.uml.Activity) diagramModel).getNodes().addAll((Collection<? extends ActivityNode>) nodeModels);
-			}
-			finally {
-				if(diagramAdapter != null) {
-					diagramAdapter.setNotificationEnabled(oldNotify);
-				}
-			}
-		}
-
-		public void removeEdgeModel(EObject diagramModel, EObject edgeModel) {
-			if(!(diagramModel instanceof org.eclipse.uml2.uml.Activity)) {
-				return;
-			}
-			DiagramAdapter diagramAdapter = BridgeHelper.getDiagramAdapter(diagramModel);
-			boolean oldNotify = false;
-			if(diagramAdapter != null) {
-				oldNotify = diagramAdapter.isNotificationEnabled();
-				diagramAdapter.setNotificationEnabled(false);
-			}
-			try {
-				((org.eclipse.uml2.uml.Activity) diagramModel).getEdges().remove(edgeModel);
-			}
-			finally {
-				if(diagramAdapter != null) {
-					diagramAdapter.setNotificationEnabled(oldNotify);
-				}
-			}
-		}
-
-		public void removeNodeModel(EObject diagramModel, EObject nodeModel) {
-			if(!(diagramModel instanceof org.eclipse.uml2.uml.Activity)) {
-				return;
-			}
-			DiagramAdapter diagramAdapter = BridgeHelper.getDiagramAdapter(diagramModel);
-			boolean oldNotify = false;
-			if(diagramAdapter != null) {
-				oldNotify = diagramAdapter.isNotificationEnabled();
-				diagramAdapter.setNotificationEnabled(false);
-			}
-			try {
-				((org.eclipse.uml2.uml.Activity) diagramModel).getNodes().remove(nodeModel);
-			}
-			finally {
-				if(diagramAdapter != null) {
-					diagramAdapter.setNotificationEnabled(oldNotify);
-				}
-			}
-		}
-
-		public Collection<?> getEdgeModels(EObject element) {
-			if(element instanceof org.eclipse.uml2.uml.Activity) {
-				return ((org.eclipse.uml2.uml.Activity) element).getEdges();
-			}
-			return Collections.EMPTY_LIST;
-		}
-
-		public Collection<?> getNodeModels(EObject element) {
-			if(element instanceof org.eclipse.uml2.uml.Activity) {
-				return ((org.eclipse.uml2.uml.Activity) element).getNodes();
-			}
-			return Collections.EMPTY_LIST;
-		}
-
-	};
-	
-	private static final IDiagramAssociationHelper diagramAssociationHelper = new IDiagramAssociationHelper() {
-
-		public Node findNode(Diagram diagram, MethodElement e) {
-			return DiagramHelper.findNodeInModelDiagram(diagram, e);
-		}
-
-		public MethodElement getMethodElement(Node node, ResourceSet resourceSet) {
-			EObject element = node.getElement();
-			return element instanceof org.eclipse.epf.diagram.model.Node? 
-					((org.eclipse.epf.diagram.model.Node) element).getLinkedElement() : null;
-		}
-
-		public void reassociate(Activity activity, Diagram copyOfBaseDiagram) {
-			// TODO Auto-generated method stub
-			
-		}
-		
-		public void addNodeModels(EObject diagramModel, Collection<?> nodeModels) {
-			if(!(diagramModel instanceof org.eclipse.epf.diagram.model.Diagram)) {
-				return;
-			}
-			org.eclipse.epf.diagram.model.Diagram diagram = (org.eclipse.epf.diagram.model.Diagram) diagramModel;
-			boolean oldNotify = ((NodeImpl)diagram).isNotificationEnabled();
-			try {
-				((NodeImpl)diagram).setNotificationEnabled(false);
-				diagram.getNodes().addAll((Collection<? extends org.eclipse.epf.diagram.model.Node>) nodeModels);
-			}
-			finally {
-				((NodeImpl)diagram).setNotificationEnabled(oldNotify);
-			}
-		}
-
-		public void addEdgeModels(EObject diagramModel, Collection<?> edgeModels) {
-			//
-		}
-
-		public void removeEdgeModel(EObject diagramModel, EObject edgeModel) {
-		}
-
-		public void removeNodeModel(EObject diagramModel, EObject nodeModel) {
-			if(!(diagramModel instanceof org.eclipse.epf.diagram.model.Diagram)) {
-				return;
-			}
-			org.eclipse.epf.diagram.model.Diagram diagram = (org.eclipse.epf.diagram.model.Diagram) diagramModel;
-			boolean oldNotify = ((NodeImpl)diagram).isNotificationEnabled();
-			try {
-				((NodeImpl)diagram).setNotificationEnabled(false);
-				diagram.getNodes().remove(nodeModel);
-			}
-			finally {
-				((NodeImpl)diagram).setNotificationEnabled(oldNotify);
-			}
-		}
-
-		public Collection<?> getEdgeModels(EObject element) {
-			return Collections.EMPTY_LIST;
-		}
-
-		public Collection<?> getNodeModels(EObject element) {
-			if(element instanceof org.eclipse.epf.diagram.model.Diagram) {
-				return ((org.eclipse.epf.diagram.model.Diagram) element).getNodes();
-			}
-			return Collections.EMPTY_LIST;
-		}
-		
-	};
-	
-	/**
-	 * Checks if the given node is one of the specified nodes or their children.
-	 * 
-	 * @param nodes
-	 * @param node
-	 */
-	private static boolean contains(Collection<?> nodes, View node) {
-		if(nodes.contains(node)) {
-			return true;
-		}
-		for (Object child : nodes) {
-			if(child instanceof Node && contains(((Node) child).getChildren(), node)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean doRefreshFromBase(Diagram diagram) {
-		Activity act = null;
-		EObject model = diagram.getElement();
-		if (model instanceof org.eclipse.uml2.uml.Activity) {
-			act = (Activity) BridgeHelper
-					.getMethodElement((EModelElement) model);
-		} else if (model instanceof org.eclipse.epf.diagram.model.Diagram) {
-			act = (Activity) ((org.eclipse.epf.diagram.model.Diagram) model)
-					.getLinkedElement();
-		}
-		if (act == null)
-			return false;
-		
-		return doRefreshFromBase(diagram, act);
-		
-	}
-	
-	private boolean doRefreshFromBase(Diagram diagram, Activity act) {
-		EObject model = diagram.getElement();
-		Activity base = (Activity) act.getVariabilityBasedOnElement();
-		if (base == null
-				|| act.getVariabilityType() == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-			return false;
-		}
-		int type = DiagramHelper.getDiagramType(diagram);
-		DiagramService diagramSvc = new DiagramService();
-		try {
-			Diagram baseDiagram = diagramSvc.getBaseDiagram(act, type);
-			if (baseDiagram == null)
-				return false;
-
-			Collection<Node> oldNodes = new HashSet<Node>();
-			Collection<Edge> oldEdges = new HashSet<Edge>();
-			Diagram baseCopy = DiagramHelper.copyDiagram(TransactionUtil
-					.getEditingDomain(diagram), baseDiagram);
-			
-			IDiagramAssociationHelper helper = type == IDiagramManager.ACTIVITY_DIAGRAM ? ADAssociationHelper
-					: diagramAssociationHelper; 
-			
-			boolean notification = model.eDeliver();
-			try {
-//				model.eSetDeliver(false);
-				ResourceSet resourceSet = base.eResource().getResourceSet();
-				// Collect the base nodes that exist in extend diagram
-				for (Iterator<?> iter = baseDiagram.getChildren().iterator(); iter
-						.hasNext();) {
-					Node baseNode = (Node) iter.next();
-					MethodElement e = helper.getMethodElement(baseNode, resourceSet);
-					if (e != null) {
-						Node node = helper.findNode(diagram, e);
-						if (node != null) {
-							oldNodes.add(node);
-						}
-					}
-				}
-
-				// Collect old inherited UI nodes && nodes of
-				// contributor/replacer
-				List<?> children = diagram.getChildren();
-				for (Iterator<?> iter = children.iterator(); iter.hasNext();) {
-					Node node = (Node) iter.next();
-					if (BridgeHelper.isInherited(node)) {
-						oldNodes.add(node);
-					} else {
-						MethodElement e = helper.getMethodElement(node, resourceSet);
-						if (e instanceof Activity
-								&& ((Activity) e).getVariabilityBasedOnElement() != null) {
-							// node is of contributor or replacer
-							//
-							oldNodes.add(node);
-						}
-					}
-				}
-
-				// Collect the edges thats exists in extend diagram
-				for (Iterator<?> iter = diagram.getEdges().iterator(); iter
-						.hasNext();) {
-					Edge edge = (Edge) iter.next();
-					if (contains(oldNodes, edge.getSource())
-							&& contains(oldNodes, edge.getTarget())) {
-						oldEdges.add(edge);
-					}
-				}
-
-				// remove the old base nodes and edges that exists in the
-				// extend diagram.
-				for (Node node : oldNodes) {
-					diagram.removeChild(node);
-					helper.removeNodeModel(model, node.getElement());
-				}
-				for (Edge edge : oldEdges) {
-					diagram.removeEdge(edge);
-					helper.removeEdgeModel(model, edge.getElement());
-				}
-
-				// replace associated base element with
-				// contributing/replacing
-				// element
-				//
-				helper.reassociate(act, baseCopy);
-
-				// Mark inherited
-				for (Object obj : baseCopy.getChildren()) {
-					BridgeHelper.markInherited((View) obj);
-				}
-				for (Object obj : baseCopy.getEdges()) {
-					BridgeHelper.markInherited((View) obj);
-				}
-				
-				// Add all new nodes and edges from base copy to extend diagram.
-				//
-				diagram.getPersistedChildren().addAll(
-						baseCopy.getChildren());
-				diagram.getPersistedEdges().addAll(
-						baseCopy.getEdges());
-				Collection<?> baseNodeModels = helper.getNodeModels(baseCopy.getElement());
-				if(baseNodeModels != null && !baseNodeModels.isEmpty()) {
-					helper.addNodeModels(model, baseNodeModels);
-				}					
-				Collection<?> baseEdgeModels = helper.getEdgeModels(baseCopy
-						.getElement());
-				if (baseEdgeModels != null && !baseEdgeModels.isEmpty()) {
-					helper.addEdgeModels(model, baseEdgeModels);
-				}
-
-				// TODO: handle the missed links.
-
-				// ActivityDiagramAdapter adapter =
-				// (ActivityDiagramAdapter)BridgeHelper.getNodeAdapter(umlActivity);
-				// adapter.populateDiagram();
-				// if(targetPart instanceof AbstractDiagramEditor){
-				// DiagramEditorUtil.resetEditor((AbstractDiagramEditor)targetPart);
-				// }
-			} finally {
-				// reset the notification.
-				model.eSetDeliver(notification);
-			}
-
-			try {
-				if (targetPart instanceof AbstractDiagramEditor) {
-					DiagramEditorUtil
-							.resetEditor((AbstractDiagramEditor) targetPart);
-				}
-				// diagram.eResource().save(null);
-			} catch (Exception e) {
-
-			}
-		} finally {
-			diagramSvc.dispose();
-		}
-		return true;
-	}
-	
-	public static org.eclipse.emf.common.command.Command copyDiagram(EditingDomain domain, Diagram diagram) {
-		ArrayList list = new ArrayList();
-		list.add(diagram.getElement());
-		list.add(diagram);
-		org.eclipse.emf.common.command.Command cmd = CopyCommand.create(domain, list);
-		cmd.execute();
-//		for (Iterator iter = cmd.getResult().iterator(); iter.hasNext();) {
-//			Object element = (Object) iter.next();
-//			if(element instanceof Diagram) {
-//				return (Diagram) element;
-//			}
-//		}
-		return cmd;
-		//return null;
-	}
-	
-	public void initialize(){
-		if(targetPart instanceof AbstractDiagramEditor){
-			AbstractDiagramEditor editor = (AbstractDiagramEditor)targetPart;
-			DiagramEditPart part = editor.getDiagramEditPart();
-			
-		}
-		
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/ActivityDiagramAdapter.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/ActivityDiagramAdapter.java
deleted file mode 100644
index 0d2f282..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/ActivityDiagramAdapter.java
+++ /dev/null
@@ -1,765 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.bridge;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.WBSActivityItemProvider;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.ControlNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLFactory;
-
-/**
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- *
- * @since 1.2
- */
-public class ActivityDiagramAdapter extends DiagramAdapter {
-	
-	public ActivityDiagramAdapter(BreakdownElementWrapperItemProvider wrapper) {
-		super(wrapper);
-	}
-
-	/**
-	 * @param e
-	 */
-	public ActivityDiagramAdapter(Activity e) {
-		super(e);
-	}
-
-	protected ActivityNode addNode(Collection nodes, Object obj) {
-		if (obj instanceof Activity) {
-			Activity act = (Activity) obj;
-			VariabilityElement base = act.getVariabilityBasedOnElement();
-			if (base != null) {
-				// find existing node for base and link it to the activity
-				//
-				org.eclipse.uml2.uml.Activity diagram = getDiagram();
-				ActivityNode baseNode = BridgeHelper.findNode(diagram, base);
-				if (baseNode == null) {
-					baseNode = BridgeHelper.findNode(diagram, act);
-				}
-				if (baseNode != null) {
-					// disassociate with the base
-					//
-					NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(baseNode);
-					if(nodeAdapter != null) {
-						nodeAdapter.dispose();
-					}
-					
-					// associate base node with the activity
-					//
-					nodeAdapter = createNodeAdapter(act);
-					if(nodeAdapter != null) {
-						initializeNodeAdapter(nodeAdapter);
-						baseNode.eAdapters().add(nodeAdapter);
-						nodeAdapter.updateView();
-//						if(ProcessUtil.isExtendingOrLocallyContributing(act)) {
-							BridgeHelper.associate(baseNode, act);
-							if(BridgeHelper.isInherited(nodeAdapter.getView())){
-								BridgeHelper.unmarkInHerited(nodeAdapter.getView());
-							}
-							nodeAdapter.setTargetReadOnly(false);
-//						}
-					}
-					
-					return null;
-				}
-			}
-		}
-		return super.addNode(nodes, obj);
-	}
-	
-	protected NodeAdapter createNodeAdapter(MethodElement e) {
-		if(e instanceof WorkBreakdownElement) {
-			return new WorkBreakdownElementNodeAdapter(e);
-		}
-		return null;
-	}
-	
-	protected void addToUmaModel(int position, ActivityNode addedNode) {
-		MethodElement e = BridgeHelper.getMethodElement(addedNode);
-		if(e == null) {
-			return;
-		}
-		Activity act = (Activity) getElement();
-
-		// translate ActivityNode index to Activity index
-		//
-		int i = toActivityIndex(position);
-
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(addedNode);
-		boolean notify = nodeAdapter.notificationEnabled;
-		try {
-			nodeAdapter.notificationEnabled = false;
-			getActionManager().doAction(IActionManager.ADD, act, UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS, e, i);
-			BridgeHelper.addEAnnotation(addedNode, e);
-		}
-		finally {
-			nodeAdapter.notificationEnabled = notify;
-		}
-
-		super.addToUmaModel(position, addedNode);
-	}
-	
-	private int toActivityIndex(int index) {
-		if (index == -1)
-			return index;
-		int size = getNodes().size();
-		int i = index + 1;
-		if (i == size)
-			return -1;
-		ActivityNode node = (ActivityNode) getNodes().get(i);
-		if (node == null)
-			return -1;
-
-		for (; !(BridgeHelper.getMethodElement(node) instanceof BreakdownElement) && i < size; i++) {
-			node = (ActivityNode) getNodes().get(i);
-		}
-		if (i == size)
-			return -1;
-		Activity act = (Activity) getElement();
-		return act.getBreakdownElements().indexOf(BridgeHelper.getMethodElement(node));
-	}
-
-	protected List getBreakdownElementTypes() {
-		return Collections.singletonList(WorkBreakdownElement.class);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.core.bridge.DiagramAdapter#newNode(org.eclipse.epf.uma.MethodElement)
-	 */
-	protected ActivityNode newNode(MethodElement e) {
-		ActivityNode node = null;
-		if(e instanceof Activity ) {
-			node = UMLFactory.eINSTANCE.createStructuredActivityNode();
-		}
-		else if(e instanceof TaskDescriptor || e instanceof Milestone) {
-			node = UMLFactory.eINSTANCE.createActivityParameterNode();
-		}
-		else if(e instanceof WorkBreakdownElement) {
-			node = UMLFactory.eINSTANCE.createStructuredActivityNode();
-		}
-		if(node != null) {
-			BridgeHelper.associate(node, e);
-		}
-		return node;
-	}
-	
-	
-	private boolean isValid(ActivityEdge link) {
-		if (link.getSource() == null || link.getTarget() == null
-				|| !getNodes().contains(link.getSource())
-				|| !getNodes().contains(link.getTarget())) {
-			return false;
-		}
-		return true;
-	}
-	
-	private static boolean isValidWorkOrder(WorkOrder wo, Object pred) {
-		if (wo.getPred() == pred) {
-			return true;
-		}
-
-		if (pred instanceof Activity) {
-			Activity act = (Activity) pred;
-			// check if predecessor reference in the given work order is base of
-			// pred
-			//
-			for (VariabilityElement ve = act.getVariabilityBasedOnElement(); ve != null; ve = ve
-					.getVariabilityBasedOnElement()) {
-				if (ve == wo.getPred()) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-	
-	/**
-	 * Checks if Node src can reach Node target as the first ActivityNode in the
-	 * diagram
-	 * 
-	 * @param predNode
-	 * @param node
-	 * @return
-	 */
-	private static boolean canReachAsFirstActivityNode(ActivityNode predNode, ActivityNode node) {
-		for (Iterator iter = predNode.getOutgoings().iterator(); iter
-				.hasNext();) {
-			ActivityEdge link = (ActivityEdge) iter.next();
-			if (link.getTarget() == node) {
-				return true;
-			}
-			if (link.getTarget() instanceof ControlNode
-					&& canReachAsFirstActivityNode(link.getTarget(), node)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	AdapterFactory getAdapterFactory(){
-		AdapterFactory adapterFactory = null;
-		if (filter == null) {
-			adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-		} else if (filter instanceof IAdapterFactoryFilter) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) ((IAdapterFactoryFilter) filter)
-					.getWBSAdapterFactory();
-		}
-		return adapterFactory;
-	}
-	
-	@Override
-	protected void populateLinks(List<ActivityNode> selectedNodes) {
-		if(selectedNodes.isEmpty()) {
-			return;
-		}
-		
-		super.populateLinks(selectedNodes);
-
-		// remove the invalid links
-		//
-		for (ActivityNode node : selectedNodes) {
-			WorkBreakdownElement wbe = null;
-			MethodElement me;
-			if ((me = BridgeHelper.getMethodElement(node)) instanceof WorkBreakdownElement) {
-				wbe = (WorkBreakdownElement) me;
-			}
-			ArrayList<ActivityEdge> linksToRemove = new ArrayList<ActivityEdge>();
-			linkListWalk: for (Iterator iterator = node
-					.getIncomings().iterator(); iterator.hasNext();) {
-				ActivityEdge link = (ActivityEdge) iterator.next();
-				if (!isValid(link)) {
-					linksToRemove.add(link);
-				}
-
-				if (wbe != null) {
-					// TODO: need revisit to check the valid connection from a
-					// ForkNode or JoinNode
-					//
-					
-					if (link.getSource() != null && link.getSource() instanceof ControlNode)
-						continue linkListWalk;
-
-					Object pred = BridgeHelper.getMethodElement(link.getSource());
-					boolean workOrderFound = false;
-					find_WorkOrder: for (Iterator iterator1 = wbe
-							.getLinkToPredecessor().iterator(); iterator1
-							.hasNext();) {
-						WorkOrder wo = (WorkOrder) iterator1.next();
-						if (isValidWorkOrder(wo, pred)) {
-							workOrderFound = true;
-							break find_WorkOrder;
-						}
-					}
-					if (!workOrderFound) {
-						// invalid link, remove it
-						//
-						linksToRemove.add(link);
-					}
-				}
-			}
-
-			for (ActivityEdge link : linksToRemove) {
-				BridgeHelper.removeLink(link);
-			}
-			linksToRemove.clear();
-
-			for (Iterator iterator = node.getOutgoings().iterator(); iterator
-					.hasNext();) {
-				ActivityEdge link = (ActivityEdge) iterator.next();
-				if (!isValid(link)) {
-					linksToRemove.add(link);
-				}
-			}
-
-			for (Iterator iterator = linksToRemove.iterator(); iterator
-					.hasNext();) {
-				ActivityEdge link = (ActivityEdge) iterator.next();
-				BridgeHelper.removeLink(link);
-			}
-			linksToRemove.clear();
-			linksToRemove = null;
-		}
-
-		// Check the links of each ActivityNode
-		// set the WorkOrder to the link if needed
-		// add new link for those WorkOrders that still don't have the
-		// corresponding link
-		//
-		AdapterFactory adapterFactory = getAdapterFactory();
-		
-		for (ActivityNode node : selectedNodes) {
-			MethodElement e;
-			if ((e = BridgeHelper.getMethodElement(node)) instanceof WorkBreakdownElement) {
-				List list = new ArrayList(); 
-				// Get the raw data of workorders for object.
-				WorkBreakdownElement local = (WorkBreakdownElement) e;
-				list.addAll(local.getLinkToPredecessor());
-				
-				// Get the Predecessor List on top of raw data, this is need for in case of extend.
-				ITreeItemContentProvider adapter = null;
-				adapter = (ITreeItemContentProvider)adapterFactory
-									.adapt(local, ITreeItemContentProvider.class);
-				if(adapter instanceof IBSItemProvider){
-					list.addAll(((IBSItemProvider)adapter).getPredecessors());
-				}
-				
-				// Iterate work orders and create links.
-				for (Iterator iterator = list.iterator(); iterator
-						.hasNext();) {
-					Object next = iterator.next();
-					WorkOrder workOrder = null;
-					BreakdownElement pred = null;
-					if(next instanceof WorkOrder){
-						workOrder = (WorkOrder)next;
-						pred = workOrder.getPred();
-					}
-					if(next instanceof WBSActivityItemProvider){
-						pred = (BreakdownElement)((WBSActivityItemProvider)next).getTarget(); 
-					}
-					
-					if (pred != null && pred instanceof WorkBreakdownElement) {
-						ActivityNode predNode = BridgeHelper.findNode(getDiagram(),
-								pred, true);
-						if (predNode != null) {
-							// check if there is a link for this work order
-							// already
-							//
-							boolean linkFound = false;
-							find_link: for (Iterator iterator1 = node
-									.getIncomings().iterator(); iterator1
-									.hasNext();) {
-								ActivityEdge link = (ActivityEdge) iterator1.next();
-								if (link.getSource() == predNode) {
-									// link already exists
-									// check if work order is set to this link
-									//
-									linkFound = true;
-//									MethodElement me = BridgeHelper.getMethodElement(link);
-									if (link == null) {
-										BridgeHelper.setSemanticModel(
-												link, workOrder);
-									}
-									break find_link;
-								}
-							}
-							if (!linkFound) {
-								// check if this WorkOrder can be represented
-								// via links of TypedNodes
-								//
-								if (!canReachAsFirstActivityNode(predNode, node)) {
-									// add new link for this work order
-									//
-									NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-									NodeAdapter predNodeAdapter = BridgeHelper.getNodeAdapter(predNode);
-									if(nodeAdapter != null && predNodeAdapter != null) {
-										boolean oldNotify = nodeAdapter.notificationEnabled;
-										boolean predNodeNotify = predNodeAdapter.notificationEnabled;
-										try {
-											nodeAdapter.notificationEnabled = false;
-											predNodeAdapter.notificationEnabled = false;
-											nodeAdapter.addIncomingConnection(pred); 
-										} finally {
-											nodeAdapter.notificationEnabled = oldNotify;
-											predNodeAdapter.notificationEnabled = predNodeNotify;
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		cleanDuplicateLinks(selectedNodes);
-	}
-
-	private void cleanDuplicateLinks(List<ActivityNode> selectedNodes) {
-		List<ActivityEdge> duplicateLinks = new ArrayList<ActivityEdge>();
-		for (ActivityNode wbNode : selectedNodes) {
-			if(wbNode.getIncomings() != null){
-				findDuplicateLinks(duplicateLinks, wbNode.getIncomings());
-			}
-			if(wbNode.getOutgoings() !=null){
-				findDuplicateLinks(duplicateLinks, wbNode.getOutgoings());
-			}
-		}
-		for (ActivityEdge link : duplicateLinks) {
-			BridgeHelper.removeLink(link);
-		}
-		duplicateLinks.clear();
-		duplicateLinks = null;
-	}
-
-	private void findDuplicateLinks(List duplicateLinks, List links) {
-		for (int i = 0; i < links.size(); i++) {
-			ActivityEdge link = (ActivityEdge) links.get(i);
-			if(!duplicateLinks.contains(link)){
-				for (int j = i + 1; j < links.size(); j++) {
-					ActivityEdge link1 = (ActivityEdge) links.get(j);
-					if (link1.getSource() == link.getSource()
-							&& link1.getTarget() == link.getTarget()) {
-						duplicateLinks.add(link1);
-					}
-				}
-			}
-		}
-	}
-
-	protected Collection populateNodes() {
-		HashSet selectedNodes = new HashSet();
-		Collection children = getChildren();
-
-		// associate control nodes
-		//
-		selectedNodes.addAll(associateControlNodes(children));
-		
-		// add WorkBreakdownElementNodes
-		//
-		selectedNodes.addAll(addElementNodes(children));
-		
-		return selectedNodes;
-	}
-	
-	private List associateControlNodes(Collection methodElements) {
-		List ctrlNodes = new ArrayList();
-		for (Iterator iter = getDiagram().getNodes().iterator(); iter.hasNext();) {
-			ActivityNode node = (ActivityNode) iter.next();
-			if(node instanceof ControlNode) {
-//				// select this control node for the diagram only if it has a target node or source node,
-//				// direct or indirect, that is associated with a method element in the specified
-//				// method element collection
-//				//
-//				Collection actNodes = new ArrayList();
-//				BridgeHelper.getTargetNodes(actNodes, node, WorkBreakdownElement.class);
-//				BridgeHelper.getSourceNodes(actNodes, node, WorkBreakdownElement.class);
-//				if(!actNodes.isEmpty()) {
-//					for (Iterator iterator = actNodes.iterator(); iterator
-//							.hasNext();) {
-//						ActivityNode elementNode = (ActivityNode) iterator.next();
-//						if(methodElements.contains(BridgeHelper.getMethodElement(elementNode))) {
-//							if(addNodeAdapterTo(node) != null) {
-//								ctrlNodes.add(node);
-//							}
-//						}
-//					}
-//				}
-				
-				if(addNodeAdapterTo(node) != null) {
-					ctrlNodes.add(node);
-				}
-			}
-		}
-		return ctrlNodes;
-	}
-
-	/**
-	 * Adds element nodes for the specified method elements if they don't exist yet.
-	 * 
-	 * @param methodElements
-	 */
-	private List addElementNodes(Collection methodElements) {	
-		ArrayList nodes = new ArrayList();
-		ArrayList newNodes = new ArrayList();
-		for (Iterator iter = methodElements.iterator(); iter.hasNext();) {
-			Object e = iter.next();
-			Object child = TngUtil.unwrap(e);
-			if (child instanceof WorkBreakdownElement) {
-				ActivityNode node = BridgeHelper.findNode(getDiagram(), child);
-				if(node == null) {
-					node = toNode((MethodElement) child);
-					newNodes.add(node);
-				}
-				else {
-					// synchronize name with linked element
-					//
-					String name = BridgeHelper.getNodeName((MethodElement) child);
-					if(!name.equals(node.getName())) {
-						node.setName(name);
-					}
-					
-					addNodeAdapterTo(node);
-				}
-				nodes.add(node);
-				if (e instanceof BreakdownElementWrapperItemProvider && !isTargetReadOnly()) {
-					BreakdownElementWrapperItemProvider wrapper = ((BreakdownElementWrapperItemProvider) e);
-					if (wrapper.isReadOnly()) {
-						NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-						nodeAdapter.wrapper = wrapper;
-						// readOnly attribute is still needed
-						// after introduction of wrapper. 
-						// For example, we can have a node adapter for a read-only base activity
-						// without supplying wrapper for this base activity.
-						//
-						nodeAdapter.basicSetTargetReadOnly(true);
-					}
-				}
-			}
-		}
-		getNodes().addAll(newNodes);		
-		return nodes;
-	}
-
-	/**
-	 * Moved code from getChildren. getAdapter() will return Adapter,
-	 * which will allow us to find itemprovider for the children. 
-	 * 
-	 * @return
-	 */
-	private ITreeItemContentProvider getAdapter(){
-		ITreeItemContentProvider adapter = null;
-		if (wrapper != null) {
-			adapter = wrapper;
-		} else {
-			adapter = (ITreeItemContentProvider) getAdapterFactory().adapt(
-					getElement(), ITreeItemContentProvider.class);
-		}
-		return adapter;
-	}
-
-	public Collection getChildren() {
-		ITreeItemContentProvider adapter = getAdapter();
-		if (adapter != null) {
-			
-			//Turn off the VariabilityInfo for the activity diagram.
-			Object obj = null;
-			boolean enableVariabilityInfo = false;
-			if(adapter instanceof ActivityWrapperItemProvider){
-				obj = ((ActivityWrapperItemProvider)adapter).getDelegatingItemProvider();
-			}
-			if(adapter instanceof BSActivityItemProvider){
-				obj = adapter;
-			}
-			
-			if(obj instanceof BSActivityItemProvider){
-				enableVariabilityInfo = ((BSActivityItemProvider)obj).isEnableVariabilityInfo();
-				((BSActivityItemProvider)obj).setEnableVariabilityInfo(false);
-			}
-			// end of variability info 
-			
-			
-			// return adapter.getChildren(getObject());
-			// commented above line, For diagrams - rollup should be false, for
-			// handling rollup state below code.
-			List children = new ArrayList();
-			extractChildren(adapter, getElement(), children);
-			
-			// reset variabilityinfo status back
-			if(obj instanceof BSActivityItemProvider){
-				((BSActivityItemProvider)obj).setEnableVariabilityInfo(enableVariabilityInfo);
-			}
-			
-			return children;
-		} else {
-			return Collections.EMPTY_LIST;
-		}
-	}
-
-	protected boolean removeNode(Object obj) {
-		if (obj instanceof Activity) {
-			Activity act = (Activity) obj;
-			VariabilityElement base = act.getVariabilityBasedOnElement();
-			if (base != null) {
-				org.eclipse.uml2.uml.Activity diagram = getDiagram();
-				
-				// find existing node for the old activity and relink it to its
-				// base
-				//
-				ActivityNode node = BridgeHelper.findNode(diagram, act);
-				if(node == null) {
-					node = BridgeHelper.findNode(diagram, base);
-				}
-				if (node != null) {
-					// disassociate with the old activity
-					//
-					NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-					if(nodeAdapter != null) {
-						nodeAdapter.dispose();
-					}
-					
-					// associate node with the base activity
-					//
-					nodeAdapter = createNodeAdapter(base);
-					if(nodeAdapter != null) {
-						initializeNodeAdapter(nodeAdapter);
-						nodeAdapter.basicSetTargetReadOnly(true);
-						node.eAdapters().add(nodeAdapter);
-						nodeAdapter.updateView();
-						if(!BridgeHelper.isInherited(nodeAdapter.getView())){
-							BridgeHelper.markInherited(nodeAdapter.getView());
-						}
-					}
-
-					return false;
-				}
-			}
-		}
-		return super.removeNode(obj);
-	}
-
-	protected NodeAdapter addNodeAdapterTo(ActivityNode node) {
-		NodeAdapter adapter = BridgeHelper.getNodeAdapter(node);
-		if(adapter != null) {
-			return adapter;
-		}
-		if(node instanceof ControlNode) {
-			adapter = new ControlNodeAdapter();
-		}
-		else {
-			MethodElement e = BridgeHelper.getMethodElement(node);
-			if(e == null) {
-				if(node instanceof StructuredActivityNode) {
-					String type = BridgeHelper.getType((StructuredActivityNode)node);
-					if (BridgeHelper.UMA_PHASE.equals(type)) {
-						e = UmaFactory.eINSTANCE.createPhase();
-					}
-					else if (BridgeHelper.UMA_ITERATION.equals(type)) {
-						e = UmaFactory.eINSTANCE.createIteration();
-					}
-					else {
-						e = UmaFactory.eINSTANCE.createActivity();
-					}
-				}
-				else if(node instanceof ActivityParameterNode) {
-					String type = BridgeHelper.getType((ActivityParameterNode)node);
-					if(BridgeHelper.UMA_MILESTONE.equals(type)) {
-						e = UmaFactory.eINSTANCE.createMilestone();
-					}
-					else {
-						e = UmaFactory.eINSTANCE.createTaskDescriptor();
-					}
-				}
-			}
-			if(e != null) {
-				adapter = new WorkBreakdownElementNodeAdapter(e);
-			}
-		}
-		if(adapter != null) {
-			initializeNodeAdapter(adapter);
-			node.eAdapters().add(adapter);
-			return adapter;
-		}
-		return null;
-	}
-	
-	private ActivityNode reassociateBaseNode(Activity act) {
-		VariabilityElement base = act.getVariabilityBasedOnElement();
-		if (base != null) {
-			// find existing node for base and link it to the activity
-			//
-			org.eclipse.uml2.uml.Activity diagram = getDiagram();
-			ActivityNode baseNode = BridgeHelper.findNode(diagram, base);
-			if (baseNode == null) {
-				baseNode = BridgeHelper.findNode(diagram, act);
-			}
-			if (baseNode != null) {
-				// disassociate with the base
-				//
-				NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(baseNode);
-				if(nodeAdapter != null) {
-					nodeAdapter.dispose();
-				}
-				
-				// associate base node with the activity
-				//
-				nodeAdapter = createNodeAdapter(act);
-				if(nodeAdapter != null) {
-					initializeNodeAdapter(nodeAdapter);
-					baseNode.eAdapters().add(nodeAdapter);
-					nodeAdapter.updateView();
-//					if(ProcessUtil.isExtendingOrLocallyContributing(act)) {
-						BridgeHelper.associate(baseNode, act);
-						if(BridgeHelper.isInherited(nodeAdapter.getView())){
-							BridgeHelper.unmarkInHerited(nodeAdapter.getView());
-						}
-						nodeAdapter.setTargetReadOnly(false);
-//					}
-				}
-				
-				return baseNode;
-			}
-		}
-		
-		return null;
-	}
-
-	@Override
-	protected void replaceNode(Object oldElement, Object newElement) {
-		if(newElement instanceof MethodElement) {
-			// find existing node for old element and link it to the new element
-			//
-			org.eclipse.uml2.uml.Activity diagram = getDiagram();
-			ActivityNode oldNode = BridgeHelper.findNode(diagram, oldElement);
-			if (oldNode != null) {
-				// disassociate with the old element
-				//
-				NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(oldNode);
-				if(nodeAdapter != null) {
-					nodeAdapter.dispose();
-				}
-
-				// associate base node with the new element
-				//
-				MethodElement e = (MethodElement) newElement;
-				nodeAdapter = createNodeAdapter(e);
-				if(nodeAdapter != null) {
-					initializeNodeAdapter(nodeAdapter);
-					oldNode.eAdapters().add(nodeAdapter);
-					nodeAdapter.updateView();
-					BridgeHelper.associate(oldNode, e);
-				}
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/BridgeHelper.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/BridgeHelper.java
deleted file mode 100644
index 3c7201d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/BridgeHelper.java
+++ /dev/null
@@ -1,903 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.bridge;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcoreFactory;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.model.DiagramResources;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResource;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.ControlNode;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.JoinNode;
-
-/**
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * 
- * @since 1.2
- */
-public final class BridgeHelper {
-
-	public static final String UMA_ELEMENT = "uma_element"; //$NON-NLS-1$
-
-	public static final String UMA_URI = "uri"; //$NON-NLS-1$
-	
-	public static final String UMA_TYPE = "type"; //$NON-NLS-1$
-	
-	public static final String UMA_PHASE = "Phase"; //$NON-NLS-1$
-	
-	public static final String UMA_ITERATION = "Iteration"; //$NON-NLS-1$
-	
-	public static final String UMA_ACTIVITY = "Activity"; //$NON-NLS-1$
-	
-	public static final String UMA_TASK_DESCRIPTOR = "Task"; //$NON-NLS-1$
-	
-	public static final String UMA_MILESTONE = "Milestone"; //$NON-NLS-1$
-	
-	public static final String ANNOTATION_INHERIRED = "inherited"; //$NON-NLS-1$
-	
-	public static List<IElementType> elementTypes = new ArrayList<IElementType>();
-	
-	public static Map<String, EClass> typeStringToEClass = new HashMap<String, EClass>();
-	
-	private static final boolean DEBUG = DiagramCorePlugin.getDefault().isDebugging();
-	
-	static {
-		typeStringToEClass.put(UMA_PHASE, UmaPackage.Literals.PHASE);
-		typeStringToEClass.put(UMA_ITERATION, UmaPackage.Literals.ITERATION);
-		typeStringToEClass.put(UMA_ACTIVITY, UmaPackage.Literals.ACTIVITY);
-		typeStringToEClass.put(UMA_TASK_DESCRIPTOR, UmaPackage.Literals.TASK_DESCRIPTOR);
-		typeStringToEClass.put(UMA_MILESTONE, UmaPackage.Literals.MILESTONE);
-	}
-	
-	public static void setSemanticModel(ActivityEdge link, WorkOrder workOrder) {
-		// TODO Auto-generated method stub
-	}
-
-	public static boolean isReadOnly(View view) {
-		NodeAdapter nodeAdapter = BridgeHelper
-				.getNodeAdapter(view.getElement());
-		if(nodeAdapter != null) {
-			return nodeAdapter.isTargetReadOnly();
-		}
-		if(view.getElement() instanceof Node) {
-			return ((Node)view.getElement()).isReadOnly();
-		}
-		
-		return false;
-	}
-	
-	/**
-	 * Gets the method element that the given view represents.
-	 * 
-	 * @param node
-	 * @return method element that the view is representing or <code>null</code>
-	 *         if the view does not represent any method element or the diagram
-	 *         of the view currently is not opened in a diagram editor.
-	 */
-	public static MethodElement getMethodElement(View view) {
-		return getMethodElement(view.getElement());
-	}	
-	
-	/**
-	 * Gets the method element that the given diagram model object represents.
-	 * 
-	 * @param modelObject
-	 * @return method element that the model object is representing or <code>null</code>
-	 *         if the model object does not represent any method element or the diagram
-	 *         of the model object currently is not opened in a diagram editor.
-	 */
-	public static MethodElement getMethodElement(EObject modelObject) {
-		if(modelObject instanceof LinkedObject) {
-			return ((LinkedObject)modelObject).getLinkedElement();
-		}
-		else if(modelObject instanceof EModelElement) {
-			return getMethodElement((EModelElement) modelObject);
-		}
-		return null;
-	}
-	
-	public static MethodElement getMethodElement(View view, org.eclipse.epf.uma.Activity owner) {
-		EObject modelObject = view.getElement();
-		if(modelObject instanceof LinkedObject) {
-			return ((LinkedObject)modelObject).getLinkedElement();
-		}
-		else if(modelObject instanceof EModelElement) {
-			Resource resource = owner.eResource();
-			if(resource != null && resource.getResourceSet() != null) {
-				return getMethodElementFromAnnotation((EModelElement) modelObject, resource.getResourceSet());
-			}
-		}
-		return null;
-	}
-	
-	public static boolean isSuppressed(View view) {
-		EObject element = view.getElement();
-		if(element instanceof NamedNode) {
-			return ((NamedNode)element).isSuppressed();
-		}
-		else if(element instanceof EModelElement) {
-			NodeAdapter nodeAdapter = getNodeAdapter(element);
-			if(nodeAdapter != null) {
-				Object o = nodeAdapter.getWrapper();
-				if(o == null) {
-					o = nodeAdapter.getElement();
-				}
-				org.eclipse.epf.uma.Activity activity = (org.eclipse.epf.uma.Activity) getMethodElement(view.getDiagram());
-				Process proc = TngUtil.getOwningProcess(activity);
-				Suppression suppression = Suppression.getSuppression(proc);
-				return suppression.isSuppressed(o);
-			}
-		}
-		return false;
-	}
-	
-//	public static Object getSemanticModel(View view) {
-//		EObject element = view.getElement();
-//		if(element instanceof EModelElement) {
-//			return getSemanticModelFromAnnotation(element, process, adapterFactory);
-//		}
-//		else if(element instanceof )
-//			
-//		}
-//	}
-	
-	public static void removeLink(ActivityEdge link) {
-		// TODO: still need to disable notification before removing link???
-		Activity activity = link.getActivity();
-		ActivityNode sourceNode = link.getSource();
-		ActivityNode targetNode = link.getTarget();
-		boolean srcNotify = sourceNode != null ? sourceNode.eDeliver() : false;
-		boolean targetNotify = targetNode != null ? targetNode.eDeliver()
-				: false;
-		try {
-			if (sourceNode != null) {
-				sourceNode.eSetDeliver(false);
-			}
-			if (targetNode != null) {
-				targetNode.eSetDeliver(false);
-			}
-			link.setSource(null);
-			link.setTarget(null);
-			if(activity != null){
-				activity.getEdges().remove(link);
-			}
-		} finally {
-			if (sourceNode != null) {
-				sourceNode.eSetDeliver(srcNotify);
-			}
-			if (targetNode != null) {
-				targetNode.eSetDeliver(targetNotify);
-			}
-		}
-	}
-
-	/**
-	 * Finds node whose linked object or one of its base is the given object
-	 * 
-	 * @param container
-	 * @param object
-	 * @return
-	 */
-	public static ActivityNode findNode(Activity container, Object object,
-			boolean checkBase) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			ActivityNode node = (ActivityNode) iter.next();
-			MethodElement e = BridgeHelper.getMethodElement(node);
-			if (object == e) {
-				return node;
-			} else if (checkBase && e instanceof VariabilityElement) {
-				for (VariabilityElement ve = ((VariabilityElement) e)
-						.getVariabilityBasedOnElement(); ve != null; ve = ve
-						.getVariabilityBasedOnElement()) {
-					if (ve == object) {
-						return node;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public static boolean isSynchBar(ActivityNode node) {
-		return node instanceof ForkNode || node instanceof JoinNode;
-	}
-
-	/**
-	 * Finds node whose linked object is the given object
-	 * 
-	 * @return
-	 */
-	public static ActivityNode findNode(Activity container, Object object) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			ActivityNode node = (ActivityNode) iter.next();
-			if (object == BridgeHelper.getMethodElement(node)) {
-				return node;
-			}
-		}
-		return null;
-	}
-
-	public static URI getProxyURI(MethodElement e) {
-		Resource resource = e.eResource();
-		if (resource instanceof ILibraryResource) {
-			return ((ILibraryResource) resource).getProxyURI(e);
-		} else if (resource != null) {
-			return resource.getURI().appendFragment(e.getGuid());
-		}
-		return null;
-	}
-	
-	/**
-	 * Associates a {@link EModelElement} with a {@link MethodElement} by
-	 * creating or updating the UMA_ELEMENT annotation of the given
-	 * {@link EModelElement}.
-	 * 
-	 * @param element
-	 * @param me
-	 * @return true if successful, false otherwise
-	 * @see #addEAnnotation(EModelElement, MethodElement)
-	 */
-	public static boolean associate(EModelElement element, MethodElement me) {
-		EAnnotation annotation = addEAnnotation(element, me);
-		if(annotation != null) {
-			String type = getType(me);
-			if(type != null) {
-				annotation.getDetails().put(UMA_TYPE, type);
-			}
-			return true;
-		}
-		return false;
-	}
-	
-	public static EClass getType(String type) {
-		return typeStringToEClass.get(type);
-	}
-	
-	public static String getType(MethodElement me) {
-		if(me instanceof Phase) {
-			return UMA_PHASE;
-		}
-		else if(me instanceof Iteration) {
-			return UMA_ITERATION;
-		}
-		else if(me instanceof Milestone) {
-			return UMA_MILESTONE;
-		}
-		else if(me instanceof org.eclipse.epf.uma.Activity) {
-			return UMA_ACTIVITY;
-		}
-		else if(me instanceof TaskDescriptor) {
-			return UMA_TASK_DESCRIPTOR;
-		}
-		return null;
-	}
-	
-//	/**
-//	 * Creates or updates the UMA_ELEMENT annotation for the given
-//	 * {@link EModelElement} with the given method element or its wrapper
-//	 * 
-//	 * @param element
-//	 * @param me
-//	 * @return
-//	 */
-//	public static EAnnotation addEAnnotation(EModelElement element, Object breakdownElementOrWrapper) {
-//		String uriStr = null;
-//		if(breakdownElementOrWrapper instanceof MethodElement) {
-//			URI uri = getProxyURI((MethodElement) breakdownElementOrWrapper);
-//			if(uri != null) {
-//				uriStr = uri.toString();
-//			}
-//		}
-//		else if(breakdownElementOrWrapper instanceof BreakdownElementWrapperItemProvider){
-//			uriStr = Suppression.getPath((BreakdownElementWrapperItemProvider) breakdownElementOrWrapper);
-//		}
-//		if(uriStr != null) {
-//			EAnnotation eAnnotation = element.getEAnnotation(UMA_ELEMENT);
-//			if (eAnnotation == null) {
-//				eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
-//				eAnnotation.setSource(UMA_ELEMENT);
-//				element.getEAnnotations().add(eAnnotation);
-//			}
-//			eAnnotation.getDetails().put(UMA_URI, uriStr);
-//			return eAnnotation;
-//		}
-//		return null;
-//	}
-	
-	/**
-	 * Creates or updates the UMA_ELEMENT annotation for the given
-	 * {@link EModelElement} with the given method element
-	 * 
-	 * @param element
-	 * @param me
-	 * @return
-	 */
-	public static EAnnotation addEAnnotation(EModelElement element,
-			MethodElement me) {
-		URI uri = getProxyURI(me);
-		if (uri != null) {
-			EAnnotation eAnnotation = element.getEAnnotation(UMA_ELEMENT);
-			if (eAnnotation == null) {
-				eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
-				eAnnotation.setSource(UMA_ELEMENT);
-				element.getEAnnotations().add(eAnnotation);
-			}
-			eAnnotation.getDetails().put(UMA_URI, uri.toString());
-			return eAnnotation;
-		}
-		return null;
-	}
-
-	private static Activity getActivity(EModelElement e) {
-		EObject o = e;
-		for(; o != null && !(o instanceof Activity); o = o.eContainer());
-		return (Activity) o;
-	}
-	
-//	public static Object getSemanticModelFromAnnotation(EModelElement model, Process process, AdapterFactory adapterFactory) {
-//		EAnnotation eAnnotation = model.getEAnnotation(UMA_ELEMENT);
-//		if (eAnnotation != null) {
-//			String uriStr = (String) eAnnotation.getDetails().get(UMA_URI);
-//			if (uriStr != null) {
-//				URI uri = URI.createURI(uriStr);
-//				if(MultiFileURIConverter.SCHEME.equals(uri.scheme())) {
-//					EObject o = process.eResource().getResourceSet().getEObject(uri, false);
-//					if (o instanceof MethodElement) {
-//						return (MethodElement) o;
-//					} else {
-//						// TODO: log error
-//						System.err.println("Not a method element: " + o); //$NON-NLS-1$
-//					}
-//				}
-//				else {
-//					// must be a wrapper path
-//					//
-//					String[] guidPath = uri.segments();
-//					return Suppression.getSuppression(process).getObjectByPath(guidPath, adapterFactory);
-//				}
-//			}
-//		}
-//		return null;
-//	}
-	
-	public static MethodElement getMethodElementFromAnnotation(EModelElement node, ResourceSet resourceSet) {
-		EAnnotation eAnnotation = node.getEAnnotation(UMA_ELEMENT);
-		if (eAnnotation != null) {
-			String uri = (String) eAnnotation.getDetails().get(UMA_URI);
-			if (uri != null) {
-				EObject o = resourceSet.getEObject(
-						URI.createURI(uri), false);
-				if (o instanceof MethodElement) {
-					return (MethodElement) o;
-				} else {
-					if(DEBUG) {
-						System.err.println("Not a method element: " + o); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Gets the method element that the given diagram model object represents
-	 * and stores the linkage info in its annotation.
-	 * 
-	 * @param node
-	 *            the diagram model object
-	 * @return method element that the model object is representing or
-	 *         <code>null</code> if the model object does not represent any
-	 *         method element or the diagram of the model object currently is
-	 *         not opened in a diagram editor.
-	 */
-	public static MethodElement getMethodElementFromAnnotation(EModelElement node) {		
-		Activity diagram = getActivity(node);
-		if(diagram == null) {
-			return null;
-		}
-		NodeAdapter nodeAdapter = getNodeAdapter(diagram);
-		if(nodeAdapter == null || nodeAdapter.getElement() == null) {
-			return null;
-		}
-		Resource resource = nodeAdapter.getElement().eResource();
-		if (resource != null && resource.getResourceSet() != null) {
-			return getMethodElementFromAnnotation(node, resource.getResourceSet());
-		}
-		return null;
-	}
-	
-	public static MethodElement getMethodElement(EModelElement node) {
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-		return nodeAdapter != null ? nodeAdapter.getElement()
-				: getMethodElementFromAnnotation(node);
-	}
-
-	public static NodeAdapter getNodeAdapter(EObject node) {
-		if (node != null) {
-			for (Iterator iter = node.eAdapters().iterator(); iter.hasNext();) {
-				Object adapter = (Object) iter.next();
-				if (adapter instanceof NodeAdapter) {
-					return (NodeAdapter) adapter;
-				}
-			}
-		}
-		return null;
-	}
-	
-	public static DiagramAdapter getDiagramAdapter(EObject node) {
-		for (Iterator iter = node.eAdapters().iterator(); iter.hasNext();) {
-			Object adapter = (Object) iter.next();
-			if (adapter instanceof DiagramAdapter) {
-				return (DiagramAdapter) adapter;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Method to get the sources of SyncBar (ForkNode or JoinNode) inComming
-	 * connections and if syncbar have incoming connection from decision point,
-	 * and decision point have incomming connections (workbreaddown elemtns)
-	 * collections will ignore all the incoming connection from decision point.
-	 * @return
-	 */
-	public static void getSyncBarSourceNodes(ActivityNode node,
-			Collection actNodes) {
-		for (Iterator iter = node.getIncomings().iterator(); iter.hasNext();) {
-			ActivityEdge link = (ActivityEdge) iter.next();
-			ActivityNode source = link.getSource();
-			if (getMethodElement(source) instanceof WorkBreakdownElement) {
-				actNodes.add(source);
-			} else if (isSynchBar(source)) {
-				getSyncBarSourceNodes(source, actNodes);
-			}
-		}
-	}
-
-	/**
-	 * Gets all nodes with the given type that are direct or indirect targets of
-	 * the given node.
-	 * 
-	 * @param actNodes
-	 * @param node
-	 * @param type
-	 *            the type of method element associated with the view
-	 */
-	public static void getTargetNodes(Collection actNodes, ActivityNode node,
-			Class type) {
-		if (node != null) {
-			for (Iterator iter = node.getOutgoings().iterator(); iter.hasNext();) {
-				ActivityEdge link = (ActivityEdge) iter.next();
-				ActivityNode target = link.getTarget();
-				if (type.isInstance(getMethodElement(target))) {
-					actNodes.add(target);
-				} else if (target instanceof ControlNode) {
-					getTargetNodes(actNodes, target, type);
-				}
-			}
-		}
-	}
-	
-	public static void getSuccessorNodes(Collection<ActivityNode> actNodes, ActivityNode node) {
-		if (node != null) {
-			for (ActivityEdge link : node.getOutgoings()) {
-				ActivityNode target = link.getTarget();
-				if (getMethodElement(target) instanceof WorkBreakdownElement) {
-					actNodes.add(target);
-				} else if (isSynchBar(target)) {
-					getSuccessorNodes(actNodes, target);
-				}
-			}
-		}		
-	}
-	
-	public static void getPredecessorNodes(Collection<ActivityNode> actNodes, ActivityNode node) {
-		if (node != null) {
-			for (ActivityEdge link : node.getIncomings()) {
-				ActivityNode source = link.getSource();
-				if (getMethodElement(source) instanceof WorkBreakdownElement) {
-					actNodes.add(source);
-				} else if (isSynchBar(source)) {
-					getPredecessorNodes(actNodes, source);
-				}
-			}
-		}		
-	}
-	
-	/**
-	 * Gets all nodes with the given type that are direct or indirect sources of
-	 * the given node.
-	 * 
-	 * @param actNodes
-	 * @param node
-	 * @param type
-	 *            the type of method element associated with the view
-	 */
-
-	public static void getSourceNodes(Collection actNodes, ActivityNode node,
-			Class type) {
-		if (node != null) {
-			for (Iterator iter = node.getIncomings().iterator(); iter.hasNext();) {
-				ActivityEdge link = (ActivityEdge) iter.next();
-				ActivityNode source = link.getSource();
-				if (type.isInstance(getMethodElement(source))) {
-					actNodes.add(source);
-				} else if (source instanceof ControlNode) {
-					getSourceNodes(actNodes, source, type);
-				}
-			}
-		}
-	}
-	
-	/*
-	 * Method to collect synchronization bar outgoing connection
-	 * except any connection going to decision points.  
-	 */
-	public static void getSyncBarTargetNodes(ActivityNode typedNode, Collection actNodes){
-		for (Iterator iter = typedNode.getOutgoings().iterator(); iter.hasNext();) {
-				ActivityEdge link = (ActivityEdge) iter.next();
-				ActivityNode target = link.getTarget();
-				if(BridgeHelper.getMethodElement(target) instanceof WorkBreakdownElement){
-					actNodes.add(target);
-				} else if (isSynchBar(target)) {
-					getSyncBarTargetNodes(target, actNodes);
-				}
-		}
-	}
-	
-	/**
-	 * Method to check before deleting a link. If duplicate predecessor exists
-	 * in the legacy data, check if deleting link should remove all the
-	 * predecessors or not by verifying if target or indirect target have direct
-	 * or indirect links.
-	 */
-	public static boolean canRemoveAllPreds(ActivityEdge link, ActivityNode oldSource,
-			ActivityNode oldTarget) {
-		MethodElement targetElement = getMethodElement(oldTarget);
-		if (targetElement instanceof WorkBreakdownElement) {
-			List inlist = oldTarget.getIncomings();
-			for (Iterator itor = inlist.iterator(); itor.hasNext();) {
-				ActivityEdge incominglink = (ActivityEdge) itor.next();
-				// RATLC00384245 : Predecessor changes should be done only in
-				// case of Synchronization Bar.
-				if (isSynchBar(incominglink.getSource())) {
-					Collection col = new ArrayList(); 
-					getSourceNodes(col, incominglink.getSource(),
-							WorkBreakdownElement.class);
-					if (col.contains(oldSource)) {
-						return false;
-					}
-				} else if (incominglink.getSource() != null &&
-						getMethodElement(incominglink.getSource()) instanceof WorkBreakdownElement) {
-					if (incominglink.getSource().equals(oldSource))
-						return false;
-				}
-			}
-		}
-		return true;
-	}
-	
-	public static void markInherited(EModelElement element) {
-		EAnnotation eAnnotation = element.getEAnnotation(ANNOTATION_INHERIRED);
-		if (eAnnotation == null) {
-			eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
-			eAnnotation.setSource(ANNOTATION_INHERIRED);
-			element.getEAnnotations().add(eAnnotation);
-		}
-	}
-	public static void unmarkInHerited(EModelElement element) {
-		EAnnotation eAnnotation = element.getEAnnotation(ANNOTATION_INHERIRED);
-		if (eAnnotation != null) {
-			element.getEAnnotations().remove(eAnnotation);
-		}
-	}
-	
-
-	public static Diagram copyDiagram(Diagram baseDiagram) {
-		Diagram copy = (Diagram) EcoreUtil.copy(baseDiagram);
-
-		// HACK:
-		// go thru the nodes of the diagram copy, if any node is a UI-only node
-		// (see TypedNode)
-		// save the GUID of the original one in its briefDescription to remember
-		// who is base.
-		//
-//		int size = copy.getContained().size();
-//		for (int i = 0; i < size; i++) {
-//			GraphNode gNode = (GraphNode) copy.getContained().get(i);
-//			if (GraphicalDataHelper.isUIGraphNode(gNode)) {
-//				gNode.setBriefDescription(((DiagramElement) baseDiagram
-//						.getContained().get(i)).getGuid());
-//			}
-//		}
-		List children = copy.getChildren();
-		int size = children.size();		
-		for (int i = 0; i < size; i++) {
-			View view = (View) children.get(i);
-			markInherited(view);
-		}
-
-		return copy;
-	}
-
-	public static EList addEAnnotationDetail(EModelElement element, String detailName, String detailValue ) {
-		EAnnotation eAnnotation = element.getEAnnotation(UMA_ELEMENT);
-		if (eAnnotation == null) {
-			eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation();
-			eAnnotation.setSource(UMA_ELEMENT);
-			// detail must be put before the new annotation can be added to the annotation list
-			// so any adapter that listen to change in the annotation list can get the details
-			// when it gets notified.
-			//
-			eAnnotation.getDetails().put(UMA_TYPE, detailValue);
-			element.getEAnnotations().add(eAnnotation);
-		}
-		else {
-			eAnnotation.getDetails().put(UMA_TYPE, detailValue);
-		}		
-		return element.getEAnnotations();
-	}
-	
-	/**
-	 * Creates and/or adds the eAnnotation detail for type. {@link BridgeHelper.UMA_TYPE}
-	 * @param element
-	 * @param type
-	 */
-	public static EList addEAnnotationType(EModelElement element, String type) {
-		EList result = addEAnnotationDetail(element, UMA_TYPE, type);
-		
-		if(element instanceof ActivityNode) {
-			ActivityNode node = (ActivityNode) element;
-//			ActivityParameterNode node = (ActivityParameterNode) element;
-			MethodElement e = BridgeHelper.getMethodElement(node);				
-			if(e instanceof BreakdownElement && 
-					type != null && !type.equals(BridgeHelper.getType(e))) {
-				// replace the currently linked method element with the right one
-				//
-				EClass rightType = getType(type);
-				if(rightType != null) {
-					BreakdownElement rightElement = (BreakdownElement) UmaFactory.eINSTANCE.create(rightType);
-					org.eclipse.epf.uma.Activity activity = ((BreakdownElement)e).getSuperActivities();
-					if(activity != null) {
-						List list = activity.getBreakdownElements();
-						list.set(list.indexOf(e), rightElement);
-						ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-						if (pkg != null) {
-							pkg.getProcessElements().add(rightElement);
-							// Also set the rightElement to its own process package.
-							List childPkgs = pkg.getChildPackages();
-							if (!childPkgs.isEmpty()) {
-								for (Iterator iter = pkg.getChildPackages()
-										.iterator(); iter.hasNext();) {
-									ProcessPackage child = (ProcessPackage) iter
-									.next();
-									List<ProcessElement> pList = child
-									.getProcessElements();
-									if (!pList.isEmpty()) {
-										if (pList.contains(e)) {
-											pList.set(pList.indexOf(e),
-													rightElement);
-										}
-									}
-								}
-							}
-						}
-
-						// associate the new method element with the node
-						//
-						associate(node, rightElement);
-						// remove old node adapter and add new one
-						//
-						NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-						if(nodeAdapter != null) {
-							nodeAdapter.dispose();
-						}					
-						DiagramAdapter diagramAdapter = (DiagramAdapter) getNodeAdapter(node.getActivity());
-						diagramAdapter.addNodeAdapterTo(node);
-					}
-				}
-
-			}
-		}
-
-		return result;
-	}
-	
-	/**
-	 * To get the eAnnotation detail based on name. (eg: type)
-	 * @deprecated replaced with {@link #getEAnnotationDetail(EModelElement, String)}
-	 */
-	public static String getEAnnotationType(EModelElement element, String detailName) {
-		return getEAnnotationDetail(element, detailName);
-	}
-	
-	public static String getEAnnotationDetail(EModelElement element, String detailName) {
-		EAnnotation eAnnotation = element.getEAnnotation(UMA_ELEMENT);
-		if(eAnnotation != null){
-			return (String)eAnnotation.getDetails().get(detailName);
-		}
-		return null;
-	}
-	
-	public static String getType(ActivityNode node) {
-		return getEAnnotationDetail(node, UMA_TYPE);
-	}
-	
-	/**
-	 * 
-	 * @param e
-	 * @return one of the type constants: {@link #UMA_ACTIVITY},
-	 *         {@link #UMA_ITERATION}, {@link #UMA_MILESTONE},
-	 *         {@link #UMA_PHASE}, {@link #UMA_TASK_DESCRIPTOR},
-	 */
-	public static String getType(BreakdownElement e) {
-		if(e instanceof Iteration) {
-			return UMA_ITERATION;
-		}
-		else if(e instanceof Phase) {
-			return UMA_PHASE;
-		}
-		else if(e instanceof org.eclipse.epf.uma.Activity) {
-			return UMA_ACTIVITY;
-		}
-		else if(e instanceof Milestone) {
-			return UMA_MILESTONE;
-		}
-		else if(e instanceof TaskDescriptor) {
-			return UMA_TASK_DESCRIPTOR;
-		}
-		else {
-			return null;
-		}
-	}
-	
-	public static boolean isInherited(EModelElement e){
-		EAnnotation eAnnotation = e.getEAnnotation(ANNOTATION_INHERIRED);
-		if (eAnnotation != null) {
-			String source = eAnnotation.getSource();
-			if(source != null && source.length() > 0){
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private static EClass getEClassFromType(String annotationType) {
-		if(UMA_ACTIVITY.equals(annotationType)) {
-			return UmaPackage.eINSTANCE.getActivity();
-		}
-		else if(UMA_ITERATION.equals(annotationType)) {
-			return UmaPackage.eINSTANCE.getIteration();
-		} else if(UMA_MILESTONE.equals(annotationType)) {
-			return UmaPackage.eINSTANCE.getMilestone();
-		} else if(UMA_PHASE.equals(annotationType)) {
-			return UmaPackage.eINSTANCE.getPhase();
-		} else if(UMA_TASK_DESCRIPTOR.equals(annotationType)) {
-			return UmaPackage.eINSTANCE.getTaskDescriptor();
-		}
-		return null;
-	}
-	
-	public static void setDefaultName(ActivityNode node) {
-		Activity parentAct = node.getActivity();
-		MethodElement element = BridgeHelper.getMethodElement(parentAct);
-		MethodElement obj = BridgeHelper.getMethodElement(node);
-		int classID = obj.eClass().getClassifierID();
-		org.eclipse.epf.uma.Activity act = (org.eclipse.epf.uma.Activity) element;
-		ArrayList siblings = new ArrayList();
-		for (Iterator iter = act.getBreakdownElements().iterator(); iter
-				.hasNext();) {
-			BreakdownElement e = (BreakdownElement) iter.next();
-			if (e.eClass().getClassifierID() == classID) {
-				siblings.add(e);
-			}
-		}
-		String baseName = MessageFormat
-				.format(
-						DiagramResources.defaultBaseName, new Object[] { TngUtil.getTypeText(obj.eClass().getName()) }); 
-		TngUtil.setDefaultName(siblings, obj, baseName);
-		node.setName(obj.getName());
-	}
-	
-	public static View getView(View diagram, Object node) {
-		for (Iterator iter = diagram.getChildren().iterator(); iter.hasNext();) {
-			View child = (View) iter.next();
-			if(child.getElement() == node) {
-				return child;
-			}
-			if(child.getElement() instanceof ActivityPartition){
-				for (Iterator iterator = child.getChildren().iterator(); iterator
-						.hasNext();) {
-					View element = (View) iterator.next();
-					if(element.getElement() == node) {
-						return child;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets node name for the given method element.
-	 * 
-	 * @param e
-	 * @return
-	 */
-	public static String getNodeName(MethodElement e) {
-		if(e instanceof BreakdownElement) {
-			return ProcessUtil.getPresentationName((BreakdownElement) e);
-		}
-		else if(e instanceof DescribableElement) {
-			return ((DescribableElement)e).getPresentationName();
-		}
-		else {
-			return e.getName();
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/ControlNodeAdapter.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/ControlNodeAdapter.java
deleted file mode 100644
index 85ed34a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/ControlNodeAdapter.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.bridge;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlNode;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class ControlNodeAdapter extends NodeAdapter {
-
-	protected boolean addToUMA(ActivityEdge link) {
-		if (!super.addToUMA(link))
-			return false;
-
-		MethodElement srcElement = BridgeHelper.getMethodElement(link.getSource());
-		if (srcElement instanceof WorkBreakdownElement) {
-			if (BridgeHelper.isSynchBar(link.getTarget())) {
-				Collection targetActNodes = new ArrayList();
-				BridgeHelper.getSyncBarTargetNodes(link
-						.getTarget(), targetActNodes);
-				for (Iterator iter = targetActNodes.iterator(); iter.hasNext();) {
-					ActivityNode node = (ActivityNode) iter.next();
-					WorkBreakdownElement targetElement = (WorkBreakdownElement) BridgeHelper.getMethodElement(node);
-					if (UmaUtil.findWorkOrder(targetElement, srcElement) == null) {
-						addDefaultWorkOrder(node, (WorkBreakdownElement) srcElement);
-					}
-				}
-			}
-		} else if (BridgeHelper.isSynchBar(link.getSource())) {
-			// Predecessor should be created only in case of
-			// Syncronization Bar, not for DecisionPoint.
-			Collection srcActNodes = new ArrayList();
-			BridgeHelper.getSyncBarSourceNodes(link.getSource(), srcActNodes);
-			Collection targetActNodes = new ArrayList();
-			BridgeHelper.getSyncBarTargetNodes(link.getTarget(), targetActNodes);
-
-			for (Iterator iter = targetActNodes.iterator(); iter.hasNext();) {
-				ActivityNode node = ((ActivityNode) iter.next());
-				for (Iterator iterator = srcActNodes.iterator(); iterator
-				.hasNext();) {
-					WorkBreakdownElement pred = (WorkBreakdownElement) BridgeHelper
-						.getMethodElement((ActivityNode) iterator.next());
-					if (UmaUtil.findWorkOrder((WorkBreakdownElement) BridgeHelper
-							.getMethodElement(node), pred) == null) {
-						addDefaultWorkOrder(node, pred);
-					}
-				}
-			}
-		}
-
-		return true;
-	}
-	
-	protected void removeFromUMA(ActivityEdge link, ActivityNode oldSource, ActivityNode oldTarget) {
-		Collection srcActNodes = new ArrayList();			
-		BridgeHelper.getSourceNodes(srcActNodes, oldSource, WorkBreakdownElement.class);
-		MethodElement targetElement = BridgeHelper.getMethodElement(oldTarget);
-		if (targetElement instanceof WorkBreakdownElement) {
-			WorkBreakdownElement targetWbe = (WorkBreakdownElement) targetElement;
-			for (Iterator iterator = srcActNodes.iterator(); iterator.hasNext();) {
-				// Object pred = ((Node) iterator.next()).getObject();
-				// GraphicalDataHelper.removeWorkOrder((NamedNodeImpl)
-				// oldTarget, pred);
-				ActivityNode node = (ActivityNode) iterator.next();
-				if (BridgeHelper.canRemoveAllPreds(link, node, oldTarget)) {
-					MethodElement srcElement = BridgeHelper.getMethodElement(node);					
-					WorkOrder wo;
-					while ((wo = UmaUtil.findWorkOrder(targetWbe, srcElement)) != null) {
-						getActionManager().doAction(IActionManager.REMOVE, targetWbe, 
-								UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR, wo, -1);
-					}
-				}
-			}
-		} else if (oldTarget instanceof ControlNode) {
-			Collection targetActNodes = new ArrayList();
-			BridgeHelper.getTargetNodes(targetActNodes,
-					oldTarget, WorkBreakdownElement.class);
-
-			// remove the work orders of target activities that have the
-			// predecessor in srcActNodes
-			//
-			for (Iterator iter = targetActNodes.iterator(); iter.hasNext();) {
-				ActivityNode node = ((ActivityNode) iter.next());
-				for (Iterator iterator = srcActNodes.iterator(); iterator
-						.hasNext();) {
-					// Object pred = ((Node) iterator.next()).getObject();
-					// GraphicalDataHelper.removeWorkOrder(node, pred);
-					ActivityNode prednode = (ActivityNode) iterator.next();
-					if (BridgeHelper.canRemoveAllPreds(link, prednode,
-							node)) {
-						WorkBreakdownElement targetE = (WorkBreakdownElement) BridgeHelper.getMethodElement(node);
-						MethodElement srcElement = BridgeHelper.getMethodElement(prednode);
-						WorkOrder wo;
-						while ((wo = UmaUtil.findWorkOrder(targetE, srcElement)) != null) {
-							getActionManager().doAction(IActionManager.REMOVE, targetE, 
-									UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR, wo, -1);
-						}
-					}
-				}
-			}
-		}
-
-		super.removeFromUMA(link, oldSource, oldTarget);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/DiagramAdapter.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/DiagramAdapter.java
deleted file mode 100644
index c6acf5d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/DiagramAdapter.java
+++ /dev/null
@@ -1,620 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.bridge;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.transaction.RollbackException;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.ActionManager;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Phong Nguyen Le
- * 
- * @since 1.2
- */
-public class DiagramAdapter extends NodeAdapter {
-
-	private Activity baseAct;
-
-	protected IFilter filter;
-
-	private Suppression suppression;
-
-	protected long umaLastModified;
-
-
-	public DiagramAdapter(BreakdownElementWrapperItemProvider wrapper) {
-		this((Activity) TngUtil.unwrap(wrapper));
-		this.wrapper = wrapper;
-		basicSetTargetReadOnly(wrapper.isReadOnly());
-	}
-
-	public DiagramAdapter(Activity e) {
-		super(e);
-
-		// listens to change in the base activity if there is any
-		//
-		if (ProcessUtil.isExtendingOrLocallyContributing(e)) {
-			baseAct = (Activity) e.getVariabilityBasedOnElement();
-			baseAct.eAdapters().add(methodElementAdapter);
-		}
-	}
-
-	public void dispose() {
-		// dispose all node adapters of the child nodes
-		//
-		for (Iterator<?> iter = getNodes().iterator(); iter.hasNext();) {
-			ActivityNode node = (ActivityNode) iter.next();
-			NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-			if (nodeAdapter != null) {
-				nodeAdapter.dispose();
-			}
-		}
-
-		super.dispose();
-		
-		if (baseAct != null) {
-			baseAct.eAdapters().remove(methodElementAdapter);
-		}
-
-	}
-
-	protected class ActivityAdapter extends MethodElementAdapter {
-		protected Collection handleNotification(Notification msg) {
-			Collection newNodesToRefresh = new ArrayList();
-			switch (msg.getFeatureID(Activity.class)) {
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					ActivityNode node = (ActivityNode) addNode(msg
-							.getNewValue());
-					if (node != null) {
-						if (msg.getNotifier() == baseAct) {
-							BridgeHelper.getNodeAdapter(node)
-									.basicSetTargetReadOnly(true);
-							newNodesToRefresh.add(node);
-						}
-					}
-					break;
-				case Notification.REMOVE:
-					removeNode(msg.getOldValue());
-					break;
-				case Notification.ADD_MANY:
-					Collection nodes = addNodes((Collection) msg.getNewValue());
-					if (msg.getNotifier() == baseAct) {
-						for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-							node = (ActivityNode) iter.next();
-							BridgeHelper.getNodeAdapter(node)
-									.basicSetTargetReadOnly(true);
-							newNodesToRefresh.add(node);
-						}
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					removeNodes((Collection) msg.getOldValue());
-					break;
-				case Notification.MOVE:
-					moveNode(msg.getNewValue());
-					break;
-				case Notification.SET:
-					replaceNode(msg.getOldValue(), msg.getNewValue());
-					break;
-				}
-				break;
-			default:
-				return super.handleNotification(msg);
-			}
-			return newNodesToRefresh;
-		}
-	}
-	
-	protected void handleNotification(Notification msg) {
-		switch(msg.getFeatureID(org.eclipse.uml2.uml.Activity.class)) {
-		case UMLPackage.ACTIVITY__NODE:
-			Collection collection;
-			switch (msg.getEventType()) {
-			case Notification.ADD:
-				nodeAdded(msg.getPosition(), (ActivityNode) msg
-						.getNewValue());
-				return;
-			case Notification.REMOVE:
-				nodeRemoved((ActivityNode) msg.getOldValue());
-				return;
-			case Notification.ADD_MANY:
-				collection = (Collection) msg.getNewValue();
-				for (Iterator iter = collection.iterator(); iter
-				.hasNext();) {
-					ActivityNode node = (ActivityNode) iter.next();
-					nodeAdded(msg.getPosition(), node);
-				}
-
-				return;
-			case Notification.REMOVE_MANY:
-				collection = (Collection) msg.getOldValue();
-				for (Iterator iter = collection.iterator(); iter
-				.hasNext();) {
-					nodeRemoved((ActivityNode) iter.next());
-				}
-				return;
-			}
-		}
-		
-		super.handleNotification(msg);
-	}
-
-	protected void replaceNode(Object oldElement, Object newElement) {
-		
-	}
-
-	protected MethodElementAdapter createMethodElementAdapter() {
-		return new ActivityAdapter();
-	}
-
-	protected final void populateLinks() {
-		populateLinks(getNodes());
-	}
-	
-	protected void populateLinks(List<ActivityNode> selectedNodes) {
-		// fill outgoing/incoming connection lists of all nodes
-		//
-		int size = selectedNodes.size();
-		boolean[] notifies = new boolean[size];
-		try {
-			// disable notification for all nodes in this diagram to avoid
-			// unwanted concurrent modification of their connection list
-			//
-			for (int i = 0; i < size; i++) {
-				ActivityNode node = selectedNodes.get(i);
-				notifies[i] = node.eDeliver();
-				node.eSetDeliver(false);
-			}
-			for (ActivityNode node : selectedNodes) {
-				populateLinks(node, false);
-			}
-		} finally {
-			// restore notification flag
-			//
-			for (int i = 0; i < size; i++) {
-				selectedNodes.get(i).eSetDeliver(notifies[i]);
-			}
-		}
-	}
-
-	protected List getNodes() {
-		org.eclipse.uml2.uml.Activity diagram = getDiagram();
-		return diagram != null ? getDiagram().getNodes() : Collections.emptyList();
-	}
-	
-	protected org.eclipse.uml2.uml.Activity getDiagram() {
-		return (org.eclipse.uml2.uml.Activity) getTarget();
-	}
-
-	protected boolean removeNode(Object obj) {
-		if (!TngUtil.isInstanceOf(getBreakdownElementTypes(), obj))
-			return false;
-
-		ActivityNode node = BridgeHelper.findNode(getDiagram(), obj);
-		if (node == null)
-			return false;
-
-		for (Iterator iter = node.getOutgoings().iterator(); iter.hasNext();) {
-			ActivityEdge link = (ActivityEdge) iter.next();
-			link.setTarget(null);
-		}
-
-		for (Iterator iter = node.getIncomings().iterator(); iter.hasNext();) {
-			ActivityEdge link = (ActivityEdge) iter.next();
-			link.setSource(null);
-		}
-		node.getOutgoings().clear();
-		node.getIncomings().clear();
-
-		getNodes().remove(node);
-		return true;
-	}
-
-	protected void removeNodes(Collection collection) {
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			removeNode(iter.next());
-		}
-	}
-
-	protected ActivityNode addNode(Object obj) {
-		ActivityNode node = addNode(getNodes(), obj);
-		if (node == null)
-			return node;
-		populateLinks(node, true);
-		return node;
-	}
-
-	protected Collection addNodes(Collection collection) {
-		List nodes = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			addNode(nodes, iter.next());
-		}
-
-		// use addAll() to avoid unnecessary notifications
-		//
-		getNodes().addAll(nodes);
-		return nodes;
-	}
-
-	/**
-	 * In Process WBS, if breakdownelement is moved up or down, diagram should
-	 * be updated accordingly. Sub-class should override this method if diagram
-	 * needs update on move.
-	 * 
-	 * @param newValue
-	 */
-	public void moveNode(Object oldValue) {
-	}
-
-	/**
-	 * Populates the incoming/outgoing links of the given node
-	 * 
-	 * @param node
-	 */
-	protected void populateLinks(ActivityNode node, boolean disableNotification) {
-		// int size = 0;
-		// boolean[] notifies = null;
-		// try {
-		// if (disableNotification) {
-		// size = getNodes().size();
-		// notifies = new boolean[size];
-		// // disable notification for all nodes in this diagram to avoid
-		// // unwanted concurrent modification of their connection list
-		// //
-		// for (int i = 0; i < size; i++) {
-		// Node child = ((Node) getNodes().get(i));
-		// notifies[i] = child.eDeliver();
-		// child.eSetDeliver(false);
-		// }
-		// }
-		//
-		// GraphNode graphNode = node.getGraphNode();
-		// if (graphNode != null) {
-		// GraphicalDataHelper.fillConnections(node, graphNode);
-		// }
-		// } finally {
-		// if (disableNotification) {
-		// // restore notification flag
-		// //
-		// for (int i = 0; i < size; i++) {
-		// ((EObject) getNodes().get(i)).eSetDeliver(notifies[i]);
-		// }
-		// }
-		// }
-	}
-
-	/**
-	 * Creates new node for this diagram for the given MethodElement.
-	 * 
-	 * @param e
-	 * @return
-	 */
-	protected ActivityNode toNode(MethodElement e) {
-		ActivityNode node = newNode(e);
-		if (node == null)
-			return null;
-		initializeNode(node, e);
-		return node;
-	}
-	
-	protected void initializeNodeAdapter(NodeAdapter nodeAdapter) {
-		nodeAdapter.setEditingDomain(domain);
-		nodeAdapter.actionManager = actionManager;
-	}
-	
-	private void initializeNode(ActivityNode node, MethodElement e) {
-		String name = BridgeHelper.getNodeName(e);
-		node.setName(name);		
-
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-		if (nodeAdapter != null && nodeAdapter.getElement() != e) {
-			nodeAdapter.dispose();
-			nodeAdapter = null;
-		}
-		if (nodeAdapter == null) {
-			nodeAdapter = createNodeAdapter(e);
-			initializeNodeAdapter(nodeAdapter);
-			node.eAdapters().add(nodeAdapter);
-		}
-	}
-
-	protected NodeAdapter createNodeAdapter(MethodElement e) {
-		return null;
-	}
-
-	protected ActivityNode newNode(MethodElement e) {
-		return null;
-	}
-
-	/**
-	 * Creates a new node for the given method element <code>obj</code> and
-	 * add it to the given collection of nodes
-	 * 
-	 * @param nodes
-	 * @param obj
-	 *            method element
-	 * @return
-	 */
-	protected ActivityNode addNode(Collection nodes, Object obj) {
-		if (TngUtil.isInstanceOf(getBreakdownElementTypes(), obj)) {
-			ActivityNode node = toNode((MethodElement) obj);
-			if (node != null) {
-				nodes.add(node);
-				return node;
-			}
-		}
-		return null;
-	}
-
-	protected List getBreakdownElementTypes() {
-		return Collections.singletonList(BreakdownElement.class);
-	}
-
-	public Activity getActivity() {
-		return (Activity) element;
-	}
-
-	protected void removeFromUmaModel(ActivityNode removedNode) {
-		Object e;
-		if ((e = BridgeHelper.getMethodElement(removedNode)) instanceof BreakdownElement) {
-			getActionManager().doAction(IActionManager.REMOVE, getActivity(), 
-					UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS, e, -1);
-		}
-
-		super.removeFromUmaModel(removedNode);
-	}
-
-	protected void extractChildren(ITreeItemContentProvider adapter, Object object, Collection children) {
-		// disable rollup before getting the children
-		//
-		boolean oldRolledUp = false;
-		if(adapter instanceof BSActivityItemProvider) {
-			BSActivityItemProvider itemProvider = (BSActivityItemProvider)adapter;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.basicSetRolledUp(false);
-		}
-		else if(adapter instanceof IBSItemProvider){
-			IBSItemProvider itemProvider = (IBSItemProvider)adapter;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.setRolledUp(false);
-		}
-		
-		try {
-			// filter out the suppressed elements
-			//
-			for (Iterator iter = adapter.getChildren(object).iterator(); iter.hasNext();) {
-				Object child = iter.next();
-				if(!getSuppression().isSuppressed(child)) {
-					children.add(child);
-				}
-			}
-			
-			// don't filter suppressed elements
-			//
-			//children.addAll(adapter.getChildren(object));
-		}
-		finally {
-			// restore the rolled-up flag
-			//
-			if(adapter instanceof IBSItemProvider) {
-				((IBSItemProvider)adapter).setRolledUp(oldRolledUp);
-			}
-		}
-	}
-	
-	public Suppression getSuppression() {
-		return suppression;
-	}
-
-	public void setSuppression(Suppression suppression) {
-		this.suppression = suppression;
-	}	
-	
-	private void updateView(Collection<?> selectedNodes) throws InterruptedException, RollbackException {
-		updateView(getView(), selectedNodes);
-	}
-	
-	private static void updateView(View view, Collection<?> selectedNodes) {
-		// show the selected nodes and hide all the other
-		//	
-		for (Iterator<?> iter = view.getChildren().iterator(); iter.hasNext();) {
-			View node = (View) iter.next();
-			if(selectedNodes.contains(node.getElement())) {
-				NodeAdapter adapter = BridgeHelper.getNodeAdapter(node.getElement());
-				if(adapter != null) {
-					adapter.updateView();
-				}
-//				if(!node.isVisible()) {
-					node.setVisible(true);
-//				}
-			}
-			else {
-				if(node.getElement() instanceof ActivityNode) {
-					if(node.isVisible()) {
-						node.setVisible(false);
-					}
-				}
-				else if(node.getElement() instanceof ActivityPartition) {
-					updateView(node, selectedNodes);
-				}
-				else {
-					if(!node.isVisible()) {
-						node.setVisible(true);
-					}
-				}
-			}
-		}	
-	}
-	
-	private void updateEdges(Collection selectedNodes) throws InterruptedException, RollbackException {
-		for (Iterator iter = getView().getChildren().iterator(); iter.hasNext();) {
-			View node = (View) iter.next();
-			if(selectedNodes.contains(node.getElement())) {
-				NodeAdapter adapter = BridgeHelper.getNodeAdapter(node.getElement());
-				adapter.updateView();
-//				if(!node.isVisible()) {
-					node.setVisible(true);
-					setEdgeVisibility(node, true);
-//				}
-			}
-			else {
-				if(node.getElement() instanceof ActivityNode) {
-					if(node.isVisible()) {
-						setEdgeVisibility(node, false);
-					}
-				}
-				else {
-					if(!node.isVisible()) {
-						node.setVisible(true);
-						setEdgeVisibility(node, true);
-					}
-				}
-			}
-		}	
-	}
-	
-	private void setEdgeVisibility(View view, boolean visibility){
-		Diagram diagram = view.getDiagram();
-		for (Iterator iterator = diagram.getEdges().iterator(); iterator
-				.hasNext();) {
-			Edge edge = (Edge) iterator.next();
-			if(edge.getSource() == view || edge.getTarget() == view){
-				if(visibility){
-					view.setVisible(true);
-				}
-				edge.setVisible(visibility);
-			}
-		}
-	}
-	/**
-	 * Populates the diagram with the data from the UMA model. Subclass should
-	 * override this method.
-	 */
-	public void populateDiagram() {
-		boolean notify = notificationEnabled;
-		try {
-			notificationEnabled = false;
-			final List<ActivityNode> selectedNodes = new ArrayList<ActivityNode>();
-			org.eclipse.uml2.uml.Activity diagram = getDiagram();			
-			TxUtil.runInTransaction(diagram, new Runnable() {
-
-				public void run() {
-					selectedNodes.addAll(populateNodes());
-					populateLinks(selectedNodes);
-				}
-				
-			});
-			
-			// add this diagram to the consumer list of all nodes so they will not
-			// be disposed
-			// before this diagram.
-			//
-			for (ActivityNode node : selectedNodes) {
-				NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-				if(nodeAdapter != null) {
-					nodeAdapter.addConsumer(this);
-				}
-			}
-			
-			TxUtil.runInTransaction(diagram, new Runnable() {
-
-				public void run() {
-					try {
-						updateEdges(selectedNodes);
-						updateView(selectedNodes);
-					} catch(Exception e) {
-						DiagramCorePlugin.getDefault().getLogger().logError(e);
-					}
-				}
-				
-			});
-		}
-		catch(Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-		finally {
-			notificationEnabled = notify;
-		}
-	}
-	
-	protected Collection populateNodes() {
-		return Collections.EMPTY_LIST;
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-	
-	public IActionManager getActionManager() {
-		if(actionManager == null) {
-			actionManager = new ActionManager() {
-				public boolean doAction(int actionType, EObject object, EStructuralFeature feature, Object value, int index) {
-					boolean ret = super.doAction(actionType, object, feature, value, index);
-					if(ret) {
-						umaLastModified = System.currentTimeMillis();
-					}
-					return ret;
-				}
-			};
-		}
-		return actionManager;
-	}
-	
-	public long getUmaLastModified() {
-		return umaLastModified;
-	}
-
-	public IFilter getFilter() {
-		return filter;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/NodeAdapter.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/NodeAdapter.java
deleted file mode 100644
index eef88f8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/NodeAdapter.java
+++ /dev/null
@@ -1,646 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.bridge;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlNode;
-import org.eclipse.uml2.uml.UMLFactory;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class NodeAdapter extends AdapterImpl {
-	
-	protected class MethodElementAdapter extends AdapterImpl //implements INodeChangeListener 
-	{
-		/**
-		 * 
-		 * @param msg
-		 * @return New nodes whose views need refresh after they have been created
-		 */
-		protected Collection handleNotification(Notification msg) {
-			switch (msg.getFeatureID(DescribableElement.class)) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-				setName(msg.getNewStringValue());
-				break;
-			}
-			return Collections.EMPTY_LIST;
-		}
-		
-		public void notifyChanged(final Notification msg) {
-			if(domain == null || domain.getChangeRecorder() == null) {
-				return;
-			}
-
-			if (!notificationEnabled)
-				return;
-			notificationEnabled = false;
-			try {
-				final Collection<ActivityNode> newNodesToRefresh = new ArrayList<ActivityNode>();
-				TxUtil.runInTransaction(domain, new Runnable() {
-
-					public void run() {
-						newNodesToRefresh.addAll(handleNotification(msg));
-					}
-					
-				});
-				if(!newNodesToRefresh.isEmpty()) {
-					TxUtil.runInTransaction(domain, new Runnable() {
-
-						public void run() {
-							for (ActivityNode node : newNodesToRefresh) {
-								BridgeHelper.getNodeAdapter(node).updateView();
-							}
-						}
-						
-					});
-				}
-			}
-			catch(Exception e) {
-				e.printStackTrace();
-			} finally {
-				notificationEnabled = true;
-			}
-		}
-
-		public NodeAdapter getNodeAdapter() {
-			return NodeAdapter.this;
-		}
-
-	}
-	
-	protected MethodElement element;
-	protected boolean notificationEnabled = true;
-	private Collection consumers = new ArrayList();
-	protected MethodElementAdapter methodElementAdapter;
-	private boolean targetReadOnly;
-	protected BreakdownElementWrapperItemProvider wrapper;
-	protected InternalTransactionalEditingDomain domain;
-	private View view;
-	protected IActionManager actionManager;
-	
-	protected NodeAdapter() {
-		
-	}
-	
-	public IActionManager getActionManager() {
-		if(actionManager != null) {
-			return actionManager;
-		}
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(getNode().getActivity());
-		return nodeAdapter.getActionManager();
-	}
-	
-	public NodeAdapter(BreakdownElementWrapperItemProvider wrapper) {
-		this((MethodElement) TngUtil.unwrap(wrapper));
-		this.wrapper = wrapper;
-		targetReadOnly = wrapper.isReadOnly();
-	}
-
-	public NodeAdapter(MethodElement e) {
-		element = e;
-		methodElementAdapter = createMethodElementAdapter();
-		e.eAdapters().add(methodElementAdapter);		
-	}			
-	
-	public View getView() {
-		if(view != null) {
-			return view;
-		}
-		View diagramView = getDiagramView();
-		if(diagramView != null) {
-			return BridgeHelper.getView(diagramView, getNode());
-		}
-		return null;
-	}
-	
-	private View getDiagramView() {
-		Activity diagram = getDiagram();
-		if(diagram != null) {
-			NodeAdapter adapter = BridgeHelper.getNodeAdapter(diagram);
-			if(adapter != null) {
-				return adapter.getView();
-			}
-		}
-		return null;
-	}
-
-	public void setView(View view) {
-		this.view = view;
-	}
-
-	public void setEditingDomain(InternalTransactionalEditingDomain domain) {
-		this.domain = domain;
-	}
-			
-	public boolean isTargetReadOnly() {
-		if(targetReadOnly)  {
-			return targetReadOnly;
-		}
-		Activity activity = getDiagram();
-		if(activity != target) {
-			NodeAdapter diagramAdapter = BridgeHelper.getNodeAdapter(activity);
-			if(diagramAdapter != null && diagramAdapter.isTargetReadOnly()) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	protected void basicSetTargetReadOnly(boolean b) {
-		targetReadOnly = b;
-	}
-
-	protected void setTargetReadOnly(boolean targetReadOnly) {
-		boolean updateView = this.targetReadOnly != targetReadOnly;
-		this.targetReadOnly = targetReadOnly;
-		if(updateView) {
-			updateView();
-		}
-	}		
-
-	protected void updateView() {
-		View node = getView();
-		if(node != null) {
-//			node.setMutable(!isTargetReadOnly());
-			FontStyle style = (FontStyle) node.getStyle(NotationPackage.Literals.FONT_STYLE);
-//			if(style != null) {
-//				Color color = isTargetReadOnly() ? DiagramConstants.READ_ONLY_FONT_COLOR : DiagramConstants.DEFAULT_FONT_COLOR;
-//				style.setFontColor(FigureUtilities.RGBToInteger(color.getRGB()).intValue());
-//			}
-			if(style == null) {
-				node.createStyle(NotationPackage.Literals.FONT_STYLE);
-			}
-		}
-	}
-
-	protected MethodElementAdapter createMethodElementAdapter() {
-		return new MethodElementAdapter();
-	}
-	
-	protected ActivityNode getNode() {
-		if(target instanceof ActivityNode) {
-			return (ActivityNode) target;
-		}
-		return null;
-	}
-	
-	protected Activity getDiagram() {
-		if(target instanceof Activity) {
-			return (Activity) target;
-		}
-		ActivityNode node = getNode();
-		return node != null ? node.getActivity() : null;
-	}
-	
-	protected ActivityEdge addIncomingConnection(MethodElement source) {
-		ActivityNode srcNode = BridgeHelper.findNode(getDiagram(), source, true);
-		if (srcNode == null)
-			return null;
-
-		// disable notification of srcNode before associate it with the link
-		// so it will not create duplicate UMA data
-		//
-		NodeAdapter srcNodeAdapter = BridgeHelper.getNodeAdapter(srcNode);
-		boolean notify = srcNodeAdapter != null ? srcNodeAdapter.notificationEnabled : false;
-		try {
-			if(srcNodeAdapter != null) srcNodeAdapter.notificationEnabled = false;
-			ActivityEdge edge = UMLFactory.eINSTANCE.createControlFlow();
-			edge.setSource(srcNode);
-			edge.setTarget(getNode());
-			getDiagram().getEdges().add(edge);
-			return edge;
-		} finally {
-			if(srcNodeAdapter != null) srcNodeAdapter.notificationEnabled = notify;
-		}
-	}
-
-	protected ActivityEdge addOutgoingConnection(MethodElement target) {
-		ActivityNode targetNode = BridgeHelper.findNode(getDiagram(), target);
-		if (targetNode == null)
-			return null;
-			
-		// disable notification of targetNode before associate it with the link
-		// so it will not create duplicate UMA data
-		//
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(targetNode);
-		boolean notify = nodeAdapter != null ? nodeAdapter.notificationEnabled : false;
-		try {
-			if(nodeAdapter != null) nodeAdapter.notificationEnabled = false;
-			ActivityEdge edge = getDiagram().createEdge("", UMLPackage.Literals.CONTROL_FLOW); //$NON-NLS-1$
-			edge.setSource(getNode());
-			edge.setTarget(targetNode);
-			return edge;
-		} finally {
-			if(nodeAdapter != null) nodeAdapter.notificationEnabled = notify;
-		}
-	}
-	
-	/**
-	 * Adds the given consumer to the consumer list of this node.
-	 * 
-	 * @param consumer
-	 */
-	public void addConsumer(Object consumer) {
-		if (!consumers.contains(consumer)) {
-			consumers.add(consumer);
-		}
-	}
-	
-	/**
-	 * Removes the given consumer from the consumer list of this node. Disposes
-	 * the node if it does not have any more consumer after this call. Disposing
-	 * a node will take care of removing this node's listener from the UMA
-	 * object and all the adapters that had been added to the adapter list of
-	 * this node.
-	 * 
-	 * @param consumer
-	 */
-	public void removeConsumer(Object consumer) {
-		consumers.remove(consumer);
-		if (consumers.isEmpty()) {
-			// no more consumer of this node, it should be disposed
-			dispose();
-		}
-	}
-	
-	public void dispose() {
-		// set domain to null before removing methodElementAdapter from the
-		// method element so methodElement can skip handling REMOVE_ADAPTER event
-		// that sometimes requires new transaction to be created and causes dead-lock
-		//
-		domain = null;
-		EObject obj = element;
-		if (obj != null) {
-			if (methodElementAdapter != null) {
-				obj.eAdapters().remove(methodElementAdapter);
-			}
-		}
-		if(target != null) {
-			target.eAdapters().remove(this);
-		}
-		
-		element = null;
-	}
-	
-	public void setName(String newStringValue) {
-		ActivityNode e = getNode();
-		if(e != null) {
-			e.setName(newStringValue);
-		}
-	}
-	
-	protected void handleNotification(Notification msg) {
-		switch(msg.getFeatureID(ActivityNode.class)) {
-		case UMLPackage.ACTIVITY_NODE__NAME:
-			if (msg.getEventType() == Notification.SET
-					&& getElement() instanceof BreakdownElement) {
-				String newName = msg.getNewStringValue();
-				BreakdownElement e = ((BreakdownElement) getElement());
-				e.setPresentationName(newName);
-				if (StrUtil.isBlank(e.getName())) {
-					e.setName(newName);
-				}
-			}
-			return;
-		case UMLPackage.ACTIVITY_NODE__INCOMING: // incoming connections
-			ActivityEdge link;
-			switch (msg.getEventType()) {
-			case Notification.ADD:
-				link = (ActivityEdge) msg.getNewValue();
-				addToUMA(link);
-				return;
-			case Notification.ADD_MANY:
-				for (Iterator iter = ((Collection) msg.getNewValue())
-						.iterator(); iter.hasNext();) {
-					addToUMA((ActivityEdge) iter.next());
-				}
-				break;
-			case Notification.REMOVE:
-				link = (ActivityEdge) msg.getOldValue();
-				if (link.getSource() != null) {
-					NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(link.getSource());
-					if(nodeAdapter != null) {
-						nodeAdapter.removeFromUMA(link, link
-								.getSource(), (ActivityNode) msg.getNotifier());
-					}
-				}
-				break;
-			case Notification.REMOVE_MANY:
-				for (Iterator iter = ((Collection) msg.getOldValue())
-						.iterator(); iter.hasNext();) {
-					link = (ActivityEdge) iter.next();
-					if (link.getSource() != null) {
-						NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(link.getSource());
-						if(nodeAdapter != null) {
-							nodeAdapter.removeFromUMA(link,
-									link.getSource(), (ActivityNode) msg.getNotifier());
-						}
-					}
-				}
-				break;
-			}
-			return;
-		case UMLPackage.ACTIVITY_NODE__OUTGOING:
-			switch (msg.getEventType()) {
-			case Notification.ADD:
-				link = (ActivityEdge) msg.getNewValue();
-				if (link.getTarget() != null) {
-					NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(link.getTarget());
-					if(nodeAdapter != null) {
-						nodeAdapter.addToUMA(link);
-					}
-				}
-				break;
-			case Notification.ADD_MANY:
-				for (Iterator iter = ((Collection) msg.getNewValue())
-						.iterator(); iter.hasNext();) {
-					link = (ActivityEdge) iter.next();
-					NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(link.getTarget());
-					if(nodeAdapter != null) {
-						nodeAdapter.addToUMA(link);
-					}
-				}
-				break;
-			case Notification.REMOVE:
-				link = (ActivityEdge) msg.getOldValue();
-				if (link.getTarget() != null) {
-					removeFromUMA(link, (ActivityNode) msg.getNotifier(), link
-							.getTarget());
-				}
-				break;
-			case Notification.REMOVE_MANY:
-				for (Iterator iter = ((Collection) msg.getOldValue())
-						.iterator(); iter.hasNext();) {
-					link = (ActivityEdge) iter.next();
-					if (link.getTarget() != null) {
-						removeFromUMA(link, (ActivityNode) msg.getNotifier(), link
-								.getTarget());
-					}
-				}
-				break;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		if (!notificationEnabled)
-			return;
-		notificationEnabled = false;
-		try {
-			handleNotification(msg);
-		} finally {
-			notificationEnabled = true;
-		}
-	}
-	
-	/**
-	 * Adds the data for the newly added node to the UMA model Subclass should
-	 * override this method.
-	 * 
-	 * @param position
-	 * @param newValue
-	 */
-	protected void addToUmaModel(int position, ActivityNode node) {		
-//TODO: review
-//		if (addedNode.getGraphNode() == null) {
-//			// this node is readded after undo
-//			//
-//			((NodeImpl) addedNode).basicSetObject(addedNode.getObject());
-//		}
-	}
-
-	protected void nodeAdded(int index, ActivityNode node) {
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-		if(nodeAdapter == null) {
-			nodeAdapter = addNodeAdapterTo(node);
-		}
-		addToUmaModel(index, node);		
-		if(nodeAdapter != null) {
-			nodeAdapter.addConsumer(this);
-		}
-	}
-	
-	protected NodeAdapter addNodeAdapterTo(ActivityNode node) {
-		return null;
-	}
-	
-	/**
-	 * Removes the data for the removed node from the UMA model Subclass should
-	 * override this method.
-	 * 
-	 * @param node
-	 */
-	protected void removeFromUmaModel(ActivityNode node) {
-	}
-	
-	protected void nodeRemoved(ActivityNode node) {
-		removeFromUmaModel(node);
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-		if(nodeAdapter != null) {
-			nodeAdapter.removeConsumer(this);
-		}
-	}
-
-	protected boolean addToUMA(ActivityEdge link) {
-		if (link.getTarget() == null || link.getSource() == null)
-			return false;		
-		return true;
-	}
-	
-	protected void removeFromUMA(ActivityEdge link, ActivityNode oldSource, ActivityNode oldTarget) {
-		MethodElement targetElement = BridgeHelper.getMethodElement(oldTarget);
-		if (targetElement instanceof WorkBreakdownElement) {
-			// this is a direct link
-			// remove WorkOrder
-			//
-			NodeAdapter targetNodeAdapter = BridgeHelper.getNodeAdapter(oldTarget);
-			boolean notify = targetNodeAdapter != null ? targetNodeAdapter.notificationEnabled : false;
-			try {
-				if(targetNodeAdapter != null) {
-					targetNodeAdapter.notificationEnabled = false;
-				}
-				if (BridgeHelper.canRemoveAllPreds(link, oldSource,
-						oldTarget)) {
-					Object pred = BridgeHelper.getMethodElement(oldSource);
-					if(pred instanceof WorkBreakdownElement) {
-						WorkBreakdownElement e = (WorkBreakdownElement) BridgeHelper.getMethodElement(oldTarget);
-						Collection<WorkOrder> workOrders = UmaUtil.findWorkOrder(e, (WorkBreakdownElement) pred, true);
-						if(!workOrders.isEmpty()) {
-							getActionManager().doAction(IActionManager.REMOVE_MANY, e, 
-									UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR, workOrders, -1);
-						}
-					}
-				}
-			} finally {
-				if(targetNodeAdapter != null) {
-					targetNodeAdapter.notificationEnabled = notify;
-				}
-			}
-		} else if(oldTarget instanceof ControlNode && BridgeHelper.isSynchBar(oldTarget)) {
-			// get all the WorkBreakdownElementNodes that this synch bar is
-			// coming to and
-			// remove the WorkOrders with this WorkBreakdownElementNode's
-			// activity as predecessor from them
-			//
-			Collection<ActivityNode> actNodes = new ArrayList<ActivityNode>();
-			BridgeHelper.getSuccessorNodes(actNodes, oldTarget);
-			for (ActivityNode node : actNodes) {
-				WorkBreakdownElement e = (WorkBreakdownElement) BridgeHelper.getMethodElement(node);
-				NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-				boolean notify = nodeAdapter != null ? nodeAdapter.notificationEnabled : false;
-				try {
-					if(nodeAdapter != null) {
-						nodeAdapter.notificationEnabled = false;
-					}
-					if (BridgeHelper.canRemoveAllPreds(link, oldSource, node)) {
-						WorkOrder wo;
-						while ((wo = UmaUtil.findWorkOrder(e, BridgeHelper.getMethodElement(oldSource))) != null) {
-							getActionManager().doAction(IActionManager.REMOVE, e, 
-									UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR, wo, -1);
-						}
-					}
-				} finally {
-					if(nodeAdapter != null) {
-						nodeAdapter.notificationEnabled = notify;
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * addDefaultWorkOrder is moved from
-	 * GraphicalDataHelper.addDefaultWorkOrder(NamedNodeImpl,
-	 * WorkbreakdownElement) Method will set notificationEnabled flag to false
-	 * of all adapters of type MethodElementAdapter of Successor object before
-	 * creating a WorkOrder object. After creation of WorkOrder (Predecessor
-	 * link) restores the notificationEnabled flag of Successor's adapters of
-	 * type MethodElementAdapter.
-	 * 
-	 * eg: If an Activity "actA" is extended in another CP. Base "actA" AD
-	 * diagram is opened, and Extended "actA" AD Diagram is opened. On creating
-	 * predecessor link between any two child activities, creates a extra link
-	 * in Extended "actA" AD diagram, because creating workorder will notify the
-	 * extended "actA" diagram to draw a link. To avoid duplicate links in the
-	 * extended activity diagram, we have to set notificationEnabled flag to
-	 * false, before creating a WorkOrder object.
-	 * 
-	 */
-	public WorkOrder addDefaultWorkOrder(ActivityNode node,
-			WorkBreakdownElement predBreakdownElement) {
-		NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(node);
-		boolean notify = nodeAdapter.notificationEnabled;
-		Map map = new HashMap();
-		MethodElement e = nodeAdapter.getElement();
-		List list = e.eAdapters();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof MethodElementAdapter) {
-				NodeAdapter otherNodeAdapter = (NodeAdapter) ((MethodElementAdapter) obj)
-						.getNodeAdapter();
-				boolean predNotification = nodeAdapter.notificationEnabled;
-				otherNodeAdapter.notificationEnabled = false;
-				map.put(otherNodeAdapter, new Boolean(predNotification));
-			}
-		}
-		try {
-			nodeAdapter.notificationEnabled = false;
-			WorkOrder wo = UmaUtil.createDefaultWorkOrder((WorkBreakdownElement) e, predBreakdownElement, false);
-			getActionManager().doAction(IActionManager.ADD, e, 
-					UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR, wo, -1);
-			return wo;
-		} finally {
-			nodeAdapter.setNotificationEnabled(notify);
-			Set set = map.keySet();
-			for (Iterator iter = set.iterator(); iter.hasNext();) {
-				Object object = iter.next();
-				Object obj = map.get(object);
-				if (obj instanceof Boolean) {
-					boolean prednot = ((Boolean) obj).booleanValue();
-					((NodeAdapter) object).notificationEnabled = prednot;
-				}
-			}
-		}
-	}
-
-	public void setNotificationEnabled(boolean notify) {
-		notificationEnabled = notify;
-	}
-	
-	public boolean isNotificationEnabled() {
-		return notificationEnabled;
-	}
-	
-	public MethodElement getElement() {
-		return element;
-	}
-
-	public void setTarget(Notifier newTarget) {
-		if(newTarget == null) {
-			dispose();
-		}
-		super.setTarget(newTarget);
-	}
-	
-	public BreakdownElementWrapperItemProvider getWrapper() {
-		return wrapper;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/WorkBreakdownElementNodeAdapter.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/WorkBreakdownElementNodeAdapter.java
deleted file mode 100644
index 3e59160..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/bridge/WorkBreakdownElementNodeAdapter.java
+++ /dev/null
@@ -1,295 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.bridge;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class WorkBreakdownElementNodeAdapter extends NodeAdapter {
-	private class WorkBreakdownElementAdapter extends MethodElementAdapter {
-		protected Collection handleNotification(Notification msg) {
-			WorkOrder obj;
-			switch (msg.getFeatureID(WorkBreakdownElement.class)) {
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR:
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					obj = (WorkOrder) msg.getNewValue();
-					addIncomingConnection(obj.getPred());
-					break;
-				case Notification.REMOVE:
-					obj = (WorkOrder) msg.getOldValue();
-					removeIncomingConnection(obj.getPred());
-					break;
-				case Notification.ADD_MANY:
-					Collection collection = (Collection) msg.getNewValue();
-					for (Iterator iter = collection.iterator(); iter.hasNext();) {
-						obj = (WorkOrder) iter.next();
-						addIncomingConnection(obj.getPred());
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					collection = (Collection) msg.getOldValue();
-					for (Iterator iter = collection.iterator(); iter.hasNext();) {
-						obj = (WorkOrder) iter.next();
-						removeIncomingConnection(obj.getPred());
-					}
-					break;
-				}
-				break;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__SUPPRESSED:
-				switch (msg.getEventType()) {
-				case Notification.SET:
-//					Boolean b = (Boolean)msg.getNewValue();
-//					handleSuppressed(b.booleanValue());
-					break;
-				}
-				break;
-			default:
-				return super.handleNotification(msg);
-			}
-			return Collections.EMPTY_LIST;
-		}
-	}
-
-	/**
-	 * @param e
-	 */
-	public WorkBreakdownElementNodeAdapter(MethodElement e) {
-		super(e);
-	}
-
-	public void handleSuppressed(boolean b) {
-		if(b){
-			List incomings = getNode().getIncomings();
-			for (int i =0; i<incomings.size(); i++) {
-				Object obj = incomings.get(i);
-				ActivityEdge link = null;
-				if(obj != null ){
-					link = (ActivityEdge)obj;
-				}
-				if(link != null && link.getSource() != null){
-					NodeAdapter sourceNodeAdapter = BridgeHelper.getNodeAdapter(link.getSource());
-					boolean oldNotify1 = sourceNodeAdapter != null ? sourceNodeAdapter.notificationEnabled : false;
-					try {
-						if(sourceNodeAdapter != null) sourceNodeAdapter.notificationEnabled = false;
-						link.setTarget(null);
-						getNode().getIncomings().remove(link);
-					} finally {
-						if(sourceNodeAdapter != null) sourceNodeAdapter.notificationEnabled = oldNotify1;
-					}
-				}
-			}
-			List outGoings = getNode().getOutgoings();
-			for (int i =0; i<outGoings.size(); i++) {
-				Object obj = outGoings.get(i);
-				ActivityEdge link = null;
-				if(obj != null ){
-					link = (ActivityEdge)obj;
-				}
-				if(link != null && link.getTarget() != null){
-					NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(link.getTarget());
-					boolean oldNotify1 = nodeAdapter != null ? nodeAdapter.notificationEnabled : false;
-					try {
-						if(nodeAdapter != null) nodeAdapter.notificationEnabled = false;
-						link.setSource(null);
-						getNode().getIncomings().remove(link);
-					} finally {
-						if(nodeAdapter != null) nodeAdapter.notificationEnabled = oldNotify1;
-					}
-				}
-			}
-		}else{
-			List nodes = getDiagram().getNodes();
-			for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-				ActivityNode element = (ActivityNode) iter.next();
-				if(element != getNode() && target instanceof MethodElement){
-					MethodElement me = BridgeHelper.getMethodElement(element);
-					if(me != null){
-						addIncomingConnection(me);
-						addOutgoingConnection(me);
-					}
-				}
-			}
-		}
-	}
-
-	protected MethodElementAdapter createMethodElementAdapter() {
-		return new WorkBreakdownElementAdapter();
-	}
-	
-	protected boolean addToUMA(ActivityEdge link) {
-		if (!super.addToUMA(link))
-			return false;
-		
-		MethodElement e = BridgeHelper.getMethodElement(link.getSource());
-		if (e instanceof WorkBreakdownElement) {
-			// this is a direct link
-			// add new WorkOrder object to UMA
-			//
-			WorkOrder order = null;
-			WorkBreakdownElement succ = (WorkBreakdownElement) BridgeHelper.getMethodElement(link.getTarget());
-			WorkBreakdownElement pred = (WorkBreakdownElement) e;
-			if (UmaUtil.findWorkOrder(succ, pred) == null) {
-				NodeAdapter sourceNodeAdapter = BridgeHelper.getNodeAdapter(link.getSource());	
-				// node adapter can be NULL if the node is not currently visible in the diagram
-				//
-				boolean sourceNotify = sourceNodeAdapter != null ? sourceNodeAdapter.notificationEnabled : false;
-				try {
-					if(sourceNodeAdapter != null) sourceNodeAdapter.notificationEnabled = false;
-					//Create a workorder and disable notification flag.
-					order = addDefaultWorkOrder(link.getTarget(), pred);
-				} finally {
-					if(sourceNodeAdapter != null) sourceNodeAdapter.notificationEnabled = sourceNotify;
-				}
-			}
-
-			// set the WorkOrder as the element of the SemanticModel of the
-			// link's GraphEdge
-			BridgeHelper.setSemanticModel(link, order);
-		} 
-		else if (BridgeHelper.isSynchBar(link.getSource())) {
-			// get all WorkBreakdownElementNodes that are comming to this
-			// TypedNode, both directly and indirectly
-			// and create work orders with their activity as predecessor
-			//
-
-			// Predecessor should be created only in case of
-			// Syncronization Bar, not for DecisionPoint.
-			// TODO: review
-			
-				
-				Collection actNodes = new ArrayList();
-				// Get the collection incoming connection of syncbar 
-				// excluding decisionpoint incoming connection
-				BridgeHelper.getSyncBarSourceNodes(link.getSource(), actNodes);
-				WorkBreakdownElement succ = (WorkBreakdownElement) BridgeHelper.getMethodElement(link.getTarget());
-				for (Iterator iter = actNodes.iterator(); iter.hasNext();) {
-					ActivityNode node = (ActivityNode) iter.next();
-					WorkBreakdownElement pred = (WorkBreakdownElement) BridgeHelper.getMethodElement(node);
-					if (UmaUtil.findWorkOrder(succ, pred) == null) {
-						NodeAdapter sourceNode = BridgeHelper.getNodeAdapter(node);
-						boolean sourceNotify = sourceNode.notificationEnabled;
-						try {
-							sourceNode.notificationEnabled = false;
-							// Create a workorder and disable notification flag.
-							addDefaultWorkOrder(link.getTarget(), pred);
-						} finally {
-							sourceNode.notificationEnabled = sourceNotify;
-						}
-					}
-				}
-		}
-		return true;
-	}
-	
-	protected ActivityEdge addIncomingConnection(MethodElement source) {
-		ActivityEdge link = super.addIncomingConnection(source);
-		if (link == null)
-			return link;
-
-		WorkOrder workOrder = UmaUtil.findWorkOrder(
-				(WorkBreakdownElement) getElement(), source);
-		BridgeHelper.setSemanticModel(link, workOrder);
-
-		return link;
-	}
-
-	protected ActivityEdge addOutgoingConnection(MethodElement target) {
-		ActivityEdge link = super.addOutgoingConnection(target);
-
-		WorkOrder workOrder = UmaUtil.findWorkOrder(
-				(WorkBreakdownElement) target, getElement());
-		BridgeHelper.setSemanticModel(link, workOrder);
-
-		return link;
-	}
-
-	protected boolean removeIncomingConnection(MethodElement source) {
-		// look for the incoming connection with source as linked object of the
-		// source node
-		//
-		for (ActivityEdge link : getNode().getIncomings()) {
-			if (link.getSource() != null
-					&& BridgeHelper.getMethodElement(link.getSource()) == source) {
-				// disable internal notification of the source node
-				//
-				NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(link.getSource());
-				boolean oldNotify = nodeAdapter != null ? nodeAdapter.notificationEnabled : false;
-				try {
-					if(nodeAdapter != null) nodeAdapter.notificationEnabled = false;
-					link.setSource(null);
-				} finally {
-					if(nodeAdapter != null) nodeAdapter.notificationEnabled = oldNotify;
-				}
-				link.setTarget(null);
-				BridgeHelper.setSemanticModel(link, null);
-				getDiagram().getEdges().remove(link);
-				return true;
-			}
-		}
-		return false;
-	}
-	
-//	@Override
-//	protected void handleNotification(Notification msg) {
-//		switch(msg.getFeatureID(ActivityParameterNode.class)) {
-//		case UMLPackage.ACTIVITY_PARAMETER_NODE__EANNOTATIONS:
-//			switch(msg.getEventType()) {
-//			case Notification.ADD:
-//				ActivityParameterNode node = (ActivityParameterNode) msg.getNotifier();
-//				String type = BridgeHelper.getType(node);
-//				MethodElement e = BridgeHelper.getMethodElement(node);				
-//				if(e instanceof BreakdownElement && 
-//						type != null && !type.equals(BridgeHelper.getType(e))) {
-//					// replace the currently linked method element with the right one
-//					//
-//					EClass rightType = BridgeHelper.getType(type);
-//					if(rightType != null) {
-//						Object rightElement = UmaFactory.eINSTANCE.create(rightType);
-//						List list = ((BreakdownElement)e).getSuperActivities().getBreakdownElements();
-//						list.set(list.indexOf(e), rightElement);
-//						return;
-//					}
-//					
-//				}
-//			}
-//		}
-//		
-//		super.handleNotification(msg);
-//	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/ChangeBoundsCommand.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/ChangeBoundsCommand.java
deleted file mode 100644
index fdaaf51..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/ChangeBoundsCommand.java
+++ /dev/null
@@ -1,183 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.commands;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * Command for change view dimensions.
- * 
- * @author Shashidhar Kannoori
- * @since 1.2
- */
-public class ChangeBoundsCommand extends Command implements
-		IResourceAwareCommand {
-
-	private static final String label = "change bounds command label";
-
-	private TransactionalEditingDomain domain;
-
-	private View view;
-
-	private int width;
-
-	private int height;
-
-	private Point location;
-
-	private Point oldLocation;
-
-	private int oldWidth;
-
-	private int oldHeight;
-
-	/**
-	 * 
-	 */
-	public ChangeBoundsCommand(TransactionalEditingDomain domain, View view,
-			Point location, int width, int height) {
-		super(label);
-		this.domain = domain;
-		this.view = view;
-		this.width = width;
-		this.height = height;
-		this.location = location;
-	}
-
-	@Override
-	public boolean canExecute() {
-		return (this.width != 0 || this.height != 0);
-	}
-
-	@Override
-	public void execute() {
-		try {
-			TxUtil.runInTransaction(domain, new Runnable() {
-
-				public void run() {
-					oldLocation = new Point();
-					Object x =  ViewUtil.getStructuralFeatureValue(view,
-							NotationPackage.eINSTANCE.getLocation_X());
-					if(x != null){
-						oldLocation.x = ((Integer)x).intValue();
-					}
-					Object y = ViewUtil.getStructuralFeatureValue(view,
-							NotationPackage.eINSTANCE.getLocation_Y());
-					if(y != null){
-						oldLocation.y = ((Integer) y).intValue();
-					}
-					oldWidth = ((Integer) ViewUtil.getStructuralFeatureValue(view,
-							NotationPackage.eINSTANCE.getSize_Width())).intValue();
-					oldHeight = ((Integer) ViewUtil.getStructuralFeatureValue(view,
-							NotationPackage.eINSTANCE.getSize_Height())).intValue();
-
-					if (location != null) {
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getLocation_X(), new Integer(
-										location.x));
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getLocation_Y(), new Integer(
-										location.y));
-					}
-					if (width > 0) {
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getSize_Width(), new Integer(
-										width));
-					}
-					if (height > 0) {
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getSize_Height(),
-								new Integer(height));
-					}
-				}
-				
-			});
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError("Error in changebounds command :",  e); //$NON-NLS-1$ 
-			undo();
-		}
-	}
-
-	@Override
-	public void undo() {
-		try {
-			TxUtil.runInTransaction(domain, new Runnable() {
-
-				public void run() {
-					if (oldLocation != null) {
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getLocation_X(), new Integer(
-										location.x));
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getLocation_Y(), new Integer(
-										location.y));
-					}
-					if (oldWidth != width) {
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getSize_Width(), new Integer(
-										width));
-					}
-					if (oldHeight > height) {
-						ViewUtil.setStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getSize_Height(),
-								new Integer(height));
-					}
-				}
-				
-			});
-		} catch (Exception e) {
-			
-		}
-	}
-
-	public Collection getModifiedResources() {
-		Set<Resource> set = new HashSet<Resource>();
-		set.add(view.eResource());
-		if (!set.isEmpty())
-			return set;
-		return Collections.EMPTY_LIST;
-	}
-
-	public org.eclipse.emf.common.command.Command chain(
-			org.eclipse.emf.common.command.Command command) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Collection getAffectedObjects() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public String getDescription() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Collection getResult() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/CopyDiagramCommand.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/CopyDiagramCommand.java
deleted file mode 100644
index 4cf80de..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/CopyDiagramCommand.java
+++ /dev/null
@@ -1,355 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.core.commands;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.core.services.DiagramService;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-
-/**
- * 
- * It does copy the diagram for the activity
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class CopyDiagramCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private Collection<?> elements;
-
-	private Map<EObject, EObject> copyToOriginalMap;
-
-	private Collection<Diagram> copiedElements;
-
-	private static final boolean DEBUG = DiagramCorePlugin.getDefault()
-			.isDebugging();
-
-	private Process targetProcess;
-
-	private DiagramManager mgr;
-	private InternalTransactionalEditingDomain domain;
-
-	private Map<EObject, EObject> originalToCopyMap;
-	
-	private CopyDiagramCommand(Collection<?> elements, Process targetProcess) {
-		this.elements = elements;
-		this.targetProcess = targetProcess;
-
-		// get diagram manager and domain
-		mgr = DiagramManager.getInstance(targetProcess, this);
-		domain = mgr.getEditingDomain();				
-	}
-	
-	public CopyDiagramCommand(Collection<?> elements, Helper copyHelper,
-			Process targetProcess) {
-		this(elements, targetProcess);
-		this.originalToCopyMap = copyHelper;
-	}
-	
-	public CopyDiagramCommand(Collection<?> elements, Map<EObject, EObject> copyToOriginalMap,
-			Process targetProcess) {
-		this(elements, targetProcess);
-		this.copyToOriginalMap = copyToOriginalMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		try {
-			TxUtil.runInTransaction(domain, new Runnable() {
-
-				public void run() {
-					doExecute();
-				}
-				
-			});
-		} catch (ExecutionException e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-	
-	protected Map<?, ?> getCopyToOriginalMap() {
-		if(copyToOriginalMap == null && originalToCopyMap != null) {
-			copyToOriginalMap = new HashMap<EObject, EObject>();
-			for (Map.Entry<EObject, EObject> entry : originalToCopyMap.entrySet()) {
-				copyToOriginalMap.put(entry.getValue(), entry.getKey());
-			}
-		}
-		return copyToOriginalMap;
-	}
-	
-	private void doExecute() {		
-		if (copiedElements == null) {
-			copiedElements = new ArrayList<Diagram>();
-		} else {
-			copiedElements.clear();
-		}
-
-		DiagramService diagramSvc = new DiagramService();
-		try {
-			for (Object e : elements) {
-				Object orig = getCopyToOriginalMap().get(e);
-				if (orig != null && orig instanceof Activity && e != null
-						&& e instanceof Activity) {
-					Activity copyActivity = (Activity) e;
-					Activity origActivity = (Activity) orig;
-
-					Collection<Diagram> diagrams = diagramSvc.getDiagrams(origActivity);
-					if (diagrams != null && !diagrams.isEmpty()) {
-						for (Diagram diagram : diagrams) {
-							if (diagram != null) {
-								// copy the diagram
-								Diagram diagramCopy = (Diagram) DiagramHelper
-										.copyDiagram(domain, diagram);
-
-								// update children references
-								updateReferences(diagramCopy);
-
-								// associate with the activity
-								int diagramType = DiagramHelper
-										.getDiagramType(diagramCopy);
-								mgr.associate(diagramCopy, diagramType,
-										(Activity) copyActivity);
-
-								copiedElements.add(diagramCopy);
-							}
-						}
-					}
-				}
-			}
-		} catch (Exception ex) {
-			DiagramCorePlugin.getDefault().getLogger().logError(ex);
-			if (DEBUG) {
-				ex.printStackTrace();
-			}
-		} finally {
-			diagramSvc.dispose();
-		}
-	}
-	
-	/**
-	 * Update eAnnotations references
-	 * 
-	 * @param copy
-	 */
-	public void updateReferences(Diagram copy) {
-		int diagramType = DiagramHelper.getDiagramType(copy);
-		List<Object> children = new ArrayList<Object>();
-		// collect all children first e.g. for ActivityPartition
-		// we don't have partition into partition so just getting one level sub-children
-		// are enough for now.
-		for (Iterator<?> itor = copy.getChildren().iterator(); itor.hasNext();) {
-			Node node = (Node) itor.next();
-			EObject obj = node.getElement();
-			children.add(node);
-			if (obj instanceof ActivityPartition){
-				children.addAll(node.getChildren());
-			}
-		}
-		for (Iterator<?> itor = children.iterator(); itor.hasNext();) {
-
-			Node node = (Node) itor.next();
-			EObject obj = node.getElement();
-
-			if (diagramType == IDiagramManager.ACTIVITY_DIAGRAM) {
-				if (obj instanceof StructuredActivityNode
-						|| obj instanceof ActivityParameterNode) {
-					EModelElement modelElement = (EModelElement) obj;
-					MethodElement me = BridgeHelper
-							.getMethodElementFromAnnotation(modelElement,
-									targetProcess.eResource().getResourceSet());
-
-					Object mappedMethodElement = getCopiedElement(me);
-					if (mappedMethodElement != null) {
-						BridgeHelper.addEAnnotation(modelElement,
-								(MethodElement) mappedMethodElement);
-					}
-
-				}
-			} else if (diagramType == IDiagramManager.ACTIVITY_DETAIL_DIAGRAM) {
-				if (obj instanceof NodeContainer) {
-					NodeContainer nodeContainer = (NodeContainer) obj;
-					// do mapping for nodecontainer
-					MethodElement me = nodeContainer.getLinkedElement();
-					Object mappedMethodElement = getCopiedElement(me);
-					if (mappedMethodElement != null) {
-						nodeContainer
-								.setLinkedElement((MethodElement) mappedMethodElement);
-					}
-
-					// do mapping for its children
-					List<?> nodes = nodeContainer.getNodes();
-
-					for (int i = 0; i < nodes.size(); i++) {
-						NamedNode namedNode = (NamedNode) nodes.get(i);
-						me = namedNode.getLinkedElement();
-
-						mappedMethodElement = getCopiedElement(me);
-						if (mappedMethodElement != null) {
-							namedNode
-									.setLinkedElement((MethodElement) mappedMethodElement);
-						}
-					}
-				}
-			} else if (diagramType == IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM) {
-				if (obj instanceof NamedNode) {
-					NamedNode namedNode = (NamedNode) obj;
-					MethodElement me = namedNode.getLinkedElement();
-
-					Object mappedMethodElement = getCopiedElement(me);
-					if (mappedMethodElement != null) {
-						namedNode
-								.setLinkedElement((MethodElement) mappedMethodElement);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Get copied element from the map
-	 * 
-	 * @param element
-	 * @return
-	 */
-	private Object getCopiedElement(Object element) {
-		if(originalToCopyMap == null && copyToOriginalMap != null) {
-			originalToCopyMap = new HashMap<EObject, EObject>();
-			for (Map.Entry<EObject, EObject> entry : copyToOriginalMap.entrySet()) {
-				originalToCopyMap.put(entry.getValue(), entry.getKey());
-			}
-		}
-		return originalToCopyMap != null ? originalToCopyMap.get(element) : null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		if (!(copiedElements == null || copiedElements.isEmpty())) {
-			try {
-				TxUtil.runInTransaction(domain, new Runnable() {
-
-					public void run() {
-						try {
-							for (Diagram diagram : copiedElements) {
-								mgr.getResource().getContents()
-										.remove(diagram.getElement());
-								mgr.getResource().getContents().remove(diagram);
-							}
-						} catch (CoreException e) {
-							throw new WrappedException(e);
-						}
-					}
-					
-				});
-				copiedElements.clear();
-			} catch (Exception ex) {
-				DiagramCorePlugin.getDefault().getLogger().logError(ex);
-				if (DEBUG) {
-					ex.printStackTrace();
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection<Resource> getModifiedResources() {
-		if (copiedElements == null || copiedElements.isEmpty()) {
-			// command is not executed yet
-			return Collections.emptyList();
-		}
-		HashSet<Resource> modifiedResources = new HashSet<Resource>();
-
-		for (Diagram diagram : copiedElements) {
-			if(diagram != null && diagram.eResource() != null)
-				modifiedResources.add(diagram.eResource());
-		}
-
-		return modifiedResources;
-	}
-	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose() {
-		if (mgr != null)
-			mgr.removeConsumer(this);
-
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/CopyDiagramForDeepCopyCommand.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/CopyDiagramForDeepCopyCommand.java
deleted file mode 100644
index d2f42b8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/CopyDiagramForDeepCopyCommand.java
+++ /dev/null
@@ -1,487 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.core.commands;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.core.services.DiagramService;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.command.CopyHelper;
-import org.eclipse.epf.library.edit.util.ConfigurationSetter;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.ActivityPartition;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * 
- * Updates diagrams of the activity's deep copies.
- * 
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class CopyDiagramForDeepCopyCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private Collection<?> elements;
-
-	private Map<?,?> copyToOriginalMap;
-
-	private Collection<Diagram> copiedElements;
-
-	private static final boolean DEBUG = DiagramCorePlugin.getDefault()
-			.isDebugging();
-
-	private Process targetProcess;
-
-	private DiagramManager mgr;
-	private InternalTransactionalEditingDomain domain;
-
-	private CopyHelper copyHelper;
-
-	private MethodConfiguration config;
-
-	private Process srcProcess;
-
-	private HashMap<BreakdownElement, String> copyToWrapperPathMap;
-	
-	public CopyDiagramForDeepCopyCommand(Collection<?> elements, Map<?, ?> copyToOriginalMap,
-			Process srcProcess, Process targetProcess, CopyHelper copyHelper,
-			MethodConfiguration config) {
-		this.copyHelper = copyHelper;
-		this.config = config;
-		this.srcProcess = srcProcess;
-		this.elements = elements;
-		this.copyToOriginalMap = copyToOriginalMap;
-		this.targetProcess = targetProcess;
-
-		// get diagram manager and domain
-		mgr = DiagramManager.getInstance(targetProcess, this);
-		domain = mgr.getEditingDomain();
-	}	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		try {
-			TxUtil.runInTransaction(domain, new Runnable() {
-
-				public void run() {
-					doExecute();
-				}
-				
-			});
-		} catch (ExecutionException e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-	
-	private void doExecute() {		
-		if (copiedElements == null) {
-			copiedElements = new ArrayList<Diagram>();
-		} else {
-			copiedElements.clear();
-		}
-		copyToWrapperPathMap = new HashMap<BreakdownElement, String>();
-		if (copyHelper != null) {
-			for (Map.Entry<String, BreakdownElement> entry : copyHelper
-					.getWrapperPathToCopyMap().entrySet()) {
-				copyToWrapperPathMap.put(entry.getValue(), entry.getKey());
-			}
-		}
-		DiagramService diagramSvc = new DiagramService();
-		try {			
-			for (Object e : elements) {
-				Object orig = copyToOriginalMap.get(e);
-				if (orig != null && orig instanceof Activity && e != null
-						&& e instanceof Activity) {
-					Activity copyActivity = (Activity) e;
-					Activity origActivity = (Activity) orig;
-
-					Collection<Diagram> diagrams = diagramSvc.getDiagrams(origActivity);
-					if (diagrams != null && !diagrams.isEmpty()) {
-						for (Diagram diagram : diagrams) {
-							if (diagram != null) {
-								// copy the diagram
-								Diagram diagramCopy = (Diagram) DiagramHelper
-										.copyDiagram(domain, diagram);
-
-								// update children references
-								updateReferences(diagramCopy, copyActivity, origActivity);
-
-								// associate with the activity
-								int diagramType = DiagramHelper
-										.getDiagramType(diagramCopy);
-								mgr.associate(diagramCopy, diagramType,
-										(Activity) copyActivity);
-
-								copiedElements.add(diagramCopy);
-							}
-						}
-					}
-				}
-			}
-		} catch (Exception ex) {
-			DiagramCorePlugin.getDefault().getLogger().logError(ex);
-			if (DEBUG) {
-				ex.printStackTrace();
-			}
-		} finally {
-			diagramSvc.dispose();
-		}
-	}
-	
-	private void clearReadOnly(org.eclipse.epf.diagram.model.Node node) {
-		node.setReadOnly(false);
-		if (node instanceof NodeContainer) {
-			for (Iterator iter = ((NodeContainer)node).getNodes().iterator(); iter.hasNext();) {
-				org.eclipse.epf.diagram.model.Node child = (org.eclipse.epf.diagram.model.Node) iter.next();
-				child.setReadOnly(false);
-			}
-		}
-	}	
-	
-	private BreakdownElementWrapperItemProvider getOriginalWrapper(Activity copy) {
-		String wrapperPath = copyToWrapperPathMap.get(copy);
-		if(wrapperPath == null) {
-			return null;
-		}
-		if(srcProcess != null) {
-			Suppression suppression = Suppression.getSuppression(srcProcess);
-			AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-			ConfigurationSetter configSetter = new ConfigurationSetter(adapterFactory);
-			try {
-				configSetter.set(config);
-				StringTokenizer tokens = new StringTokenizer(wrapperPath, "/"); //$NON-NLS-1$
-				ArrayList<String> guidList = new ArrayList<String>();
-				while(tokens.hasMoreTokens()) {
-					guidList.add(tokens.nextToken());
-				}
-				String[] guidPath = new String[guidList.size()];
-				guidList.toArray(guidPath);
-				Object o = suppression.getObjectByPath(guidPath, adapterFactory);
-				if(o instanceof BreakdownElementWrapperItemProvider) {
-					return (BreakdownElementWrapperItemProvider) o;
-				}
-				else {
-					System.out
-							.println("CopyDiagramCommand.getOriginalWrapper(): invalid wrapper for copy activity: " + o); //$NON-NLS-1$
-				}
-			}
-			finally {
-				configSetter.restore();
-			}
-		}
-		return null;
-	}
-	
-	private Collection<BreakdownElement> getBreakdownElements(Activity origActivity, Activity copyActivity) {
-		BreakdownElementWrapperItemProvider wrapper = getOriginalWrapper(copyActivity);
-		Object object = wrapper != null ? wrapper : origActivity;
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-		ConfigurationSetter configSetter = new ConfigurationSetter(adapterFactory);
-		try {
-			configSetter.set(config);
-			ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(object, ITreeItemContentProvider.class);					
-			Collection<?> origChildren = ip.getChildren(origActivity);
-			Collection<BreakdownElement> elements = new ArrayList<BreakdownElement>();
-			for(Object origChild : origChildren) {
-				Object e = TngUtil.unwrap(origChild);
-				if(e instanceof BreakdownElement) {
-					elements.add((BreakdownElement) e);
-				}
-			}
-			return elements;
-		}
-		finally {
-			configSetter.restore();
-		}
-	}
-	
-	private static BreakdownElement getBreakdownElement(Collection<BreakdownElement> elements, Activity base) {
-		for (BreakdownElement e : elements) {
-			if(e instanceof VariabilityElement) {
-				boolean found = false;
-				find_base:
-				for(VariabilityElement ve = (VariabilityElement) e; ve.getVariabilityBasedOnElement() != null; ve = ve.getVariabilityBasedOnElement()) {
-					if(ve.getVariabilityBasedOnElement() == base) {
-						found = true;
-						break find_base;
-					}
-				}
-				if(found) {
-					return (BreakdownElement) e;
-				}
-			}
-		}
-		return null;
-	}
-	
-	private class CopyFinder {
-		private Activity origActivity;
-		private Activity copyActivity;
-		private Map<BreakdownElement, BreakdownElement> originalToCopyMap;
-		private Collection<BreakdownElement> elements;
-		
-		private CopyFinder(Activity origActivity, Activity copyActivity) {
-			this.origActivity = origActivity;
-			this.copyActivity = copyActivity;
-		}
-		
-		public Map<BreakdownElement, BreakdownElement> getOriginalToCopyMap() {
-			if(originalToCopyMap == null) {
-				originalToCopyMap = new HashMap<BreakdownElement, BreakdownElement>();
-				for (Iterator iterator = copyActivity.getBreakdownElements().iterator(); iterator.hasNext();) {
-					BreakdownElement e = (BreakdownElement) iterator.next();
-					BreakdownElement orig = (BreakdownElement) copyHelper.getOriginal(e);
-					originalToCopyMap.put(orig, e);
-				}
-			}
-			return originalToCopyMap;
-		}
-		
-		BreakdownElement findCopy(BreakdownElement original) {
-			Object copy = getOriginalToCopyMap().get(original);
-			if(copy == null) {
-				if(original instanceof Activity) {
-					// me must be a base element of a local contributor or replacer
-					// 
-					if(elements == null) {
-						elements = getBreakdownElements(origActivity, copyActivity);
-					}
-					copy = getBreakdownElement(elements, (Activity) original);
-				}
-			}
-			return (BreakdownElement) copy;
-		}
-	}
-
-	/**
-	 * Update eAnnotations references
-	 * 
-	 * @param copy
-	 * @param origActivity 
-	 * @param copyActivity 
-	 */
-	public void updateReferences(Diagram copy, Activity copyActivity, Activity origActivity) {
-		int diagramType = DiagramHelper.getDiagramType(copy);
-		CopyFinder copyFinder = new CopyFinder(origActivity, copyActivity);
-		List<Object> children = new ArrayList<Object>();
-		// collect all children first e.g. for ActivityPartition
-		// we don't have partition into partition so just getting one level sub-children
-		// are enough for now.
-		for (Iterator<?> itor = copy.getChildren().iterator(); itor.hasNext();) {
-			Node node = (Node) itor.next();
-			EObject obj = node.getElement();
-			children.add(node);
-			if (obj instanceof ActivityPartition){
-				children.addAll(node.getChildren());
-			}
-		}
-		for (Iterator<?> itor = children.iterator(); itor.hasNext();) {
-			Node node = (Node) itor.next();
-			EObject obj = node.getElement();
-
-			if (diagramType == IDiagramManager.ACTIVITY_DIAGRAM) {
-				if (obj instanceof StructuredActivityNode
-						|| obj instanceof ActivityParameterNode) {
-					EModelElement modelElement = (EModelElement) obj;
-					MethodElement me = BridgeHelper
-							.getMethodElementFromAnnotation(modelElement,
-									targetProcess.eResource().getResourceSet());
-					if(me instanceof BreakdownElement) {						
-						BreakdownElement mappedMethodElement = copyFinder.findCopy((BreakdownElement) me);
-
-						if (mappedMethodElement != null) {
-							BridgeHelper.addEAnnotation(modelElement, mappedMethodElement);
-						}
-					}
-				}
-			} else if (diagramType == IDiagramManager.ACTIVITY_DETAIL_DIAGRAM) {
-				if(obj instanceof org.eclipse.epf.diagram.model.Node) {
-					clearReadOnly((org.eclipse.epf.diagram.model.Node)obj);
-				}
-				if (obj instanceof NodeContainer) {
-					NodeContainer nodeContainer = (NodeContainer) obj;
-					// do mapping for nodecontainer
-					MethodElement me = nodeContainer.getLinkedElement();
-					Object mappedMethodElement = null;
-					if(me instanceof BreakdownElement) {
-						mappedMethodElement = copyFinder.findCopy((BreakdownElement) me);
-						if (mappedMethodElement != null) {
-							nodeContainer
-							.setLinkedElement((MethodElement) mappedMethodElement);
-						}
-					}
-
-					// do mapping for its children
-					List<?> nodes = nodeContainer.getNodes();
-
-					for (int i = 0; i < nodes.size(); i++) {
-						NamedNode namedNode = (NamedNode) nodes.get(i);
-						me = namedNode.getLinkedElement();
-						if (me instanceof BreakdownElement) {
-							mappedMethodElement = copyFinder
-									.findCopy((BreakdownElement) me);
-							if (mappedMethodElement != null) {
-								namedNode
-										.setLinkedElement((MethodElement) mappedMethodElement);
-							}
-						}
-					}
-				}
-			} else if (diagramType == IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM) {
-				if(obj instanceof org.eclipse.epf.diagram.model.Node) {
-					clearReadOnly((org.eclipse.epf.diagram.model.Node)obj);
-				}
-				if (obj instanceof NamedNode) {
-					NamedNode namedNode = (NamedNode) obj;
-					MethodElement me = namedNode.getLinkedElement();
-					if (me instanceof BreakdownElement) {
-						Object mappedMethodElement = copyFinder.findCopy((BreakdownElement) me);
-						if (mappedMethodElement != null) {
-							namedNode
-									.setLinkedElement((MethodElement) mappedMethodElement);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		if (!(copiedElements == null || copiedElements.isEmpty())) {
-			try {
-				TxUtil.runInTransaction(domain, new Runnable() {
-
-					public void run() {
-						try {
-							for (Iterator iter = copiedElements.iterator(); iter.hasNext();) {
-								Diagram diagram = (Diagram) iter.next();
-
-								mgr.getResource().getContents()
-										.remove(diagram.getElement());
-								mgr.getResource().getContents().remove(diagram);
-							}
-						} catch (CoreException e) {
-							throw new WrappedException(e);
-						}
-					}
-					
-				});
-				copiedElements.clear();
-			} catch (Exception ex) {
-				DiagramCorePlugin.getDefault().getLogger().logError(ex);
-				if (DEBUG) {
-					ex.printStackTrace();
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		if (copiedElements == null || copiedElements.isEmpty()) {
-			// command is not executed yet
-			return Collections.EMPTY_LIST;
-		}
-		HashSet<Object> modifiedResources = new HashSet<Object>();
-
-		for (Iterator iter = copiedElements.iterator(); iter.hasNext();) {
-			Diagram diagram = (Diagram) iter.next();
-			if(diagram != null && diagram.eResource() != null)
-				modifiedResources.add(diagram.eResource());
-		}
-
-		return modifiedResources;
-	}
-	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose() {
-		if (mgr != null)
-			mgr.removeConsumer(this);
-
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/DeleteDiagramCommand.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/DeleteDiagramCommand.java
deleted file mode 100644
index ef18138..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/DeleteDiagramCommand.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.commands;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.core.services.DiagramService;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.gmf.runtime.common.ui.services.editor.EditorService;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Command to delete the diagram/diagram element of given Activity/CP, this command is performed
- * through nested commands in {@link DeleteMethodElementCommand}.  
- * @author Shashidhar Kannoori
- */
-public class DeleteDiagramCommand extends AbstractCommand implements IResourceAwareCommand {
-
-	private Collection elementsToRemove;
-	private Process targetProcess;
-	private DiagramManager dMgr = null;
-
-	/**
-	 * 
-	 */
-	public DeleteDiagramCommand(Collection elementsToRemove, Process targetProcess) {
-		this.elementsToRemove = elementsToRemove;
-		this.targetProcess = targetProcess;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		DiagramService diagramSvc = new DiagramService();
-		try {
-			for (Iterator iter = elementsToRemove.iterator(); iter.hasNext();) {
-				MethodElement element = (MethodElement) iter.next();
-				if (element instanceof Activity) {
-					Collection<Diagram> diagrams = diagramSvc
-							.getDiagrams((Activity) element);
-					for (Iterator iterator = diagrams.iterator(); iterator
-							.hasNext();) {
-						Diagram diagram = (Diagram) iterator.next();
-						if (diagram != null) {
-							// Before deleting close opened diagram editors.
-							closeDiagramEditor(diagram);
-							// Delete Diagram.
-							DiagramHelper.deleteDiagram(diagram, true);
-						}
-					}
-				}
-			}
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-		finally {
-			diagramSvc.dispose();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-	
-	private DiagramManager getDiagramManager() {
-		if(dMgr == null) {
-			dMgr = DiagramManager.getInstance(targetProcess, this);
-		}
-		return dMgr;
-	}
-
-	public Collection getModifiedResources() {
-		DiagramManager dMgr = getDiagramManager();
-		HashSet<Object> modifiedResources = new HashSet<Object>();
-		boolean fileExist = true;
-		try {
-			if (dMgr != null && dMgr.getResource() != null
-					&& !dMgr.getResource().getContents().isEmpty()) {
-				File file = new File(FileManager.toFileString(dMgr
-						.getResource().getURI()));
-				if (!file.exists())
-					fileExist = false;
-				if (fileExist)
-					modifiedResources.add(dMgr.getResource());
-			}
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-		return modifiedResources;
-	}
-	
-	@Override
-	public boolean canExecute() {
-		return targetProcess != null;
-	}
-	
-	@Override
-	public void dispose() {
-		if(dMgr != null){
-			dMgr.removeConsumer(this);
-		}
-		super.dispose();
-	}
-	
-	private void closeDiagramEditor(Diagram diagram){
-		List editors = EditorService.getInstance().getRegisteredEditorParts();
-		Iterator it = editors.iterator();
-		while (it.hasNext()) {
-			Object obj = it.next();
-
-			if (obj instanceof DiagramEditor) {
-				DiagramEditor diagramEditor = ((DiagramEditor) obj);
-				if (diagramEditor.getDiagram().equals(diagram)) {
-					//it's already open, just close it.
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-						.getActivePage().activate(diagramEditor);
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().closeEditor(diagramEditor, false);
-				}
-			}
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/DeleteDiagramNodeCommand.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/DeleteDiagramNodeCommand.java
deleted file mode 100644
index c618399..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/DeleteDiagramNodeCommand.java
+++ /dev/null
@@ -1,129 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.commands;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.services.DiagramService;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * Command to delete diagram nodes of the deleted breakdown elements.
- * 
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class DeleteDiagramNodeCommand extends AbstractCommand implements IResourceAwareCommand {
-	
-	private Activity activity;
-	private Collection<?> breakdownElements;
-	private DiagramService diagramSvc;
-
-	public DeleteDiagramNodeCommand(Activity activity, Collection<?> breakdownElements) {
-		this.activity = activity;
-		this.breakdownElements = breakdownElements;
-	}
-
-	public Collection<Resource> getModifiedResources() {
-		if(diagramSvc != null) {
-			org.eclipse.epf.diagram.core.services.DiagramManager mgr = diagramSvc.getDiagramManager(activity);
-			if(mgr != null) {
-				try {
-					Resource resource = mgr.getResource();
-					if(resource != null) {
-						return Collections.singleton(resource);
-					}
-				} catch (CoreException e) {
-					DiagramCorePlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	public void execute() {
-		Collection<Diagram> diagrams = diagramSvc.getDiagrams(activity);
-		Collection<View> viewsToDelete = new ArrayList<View>();
-		for (Diagram diagram : diagrams) {
-			AbstractTreeIterator<View> iterator = new AbstractTreeIterator<View>(diagram, false) {
-
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected Iterator<? extends View> getChildren(Object object) {
-					if(object instanceof View) {
-						return ((View)object).getChildren().iterator();
-					}
-					return Collections.EMPTY_LIST.iterator();
-				}
-
-			};
-			while(iterator.hasNext()) {
-				View view = iterator.next();
-				if(breakdownElements.contains(BridgeHelper.getMethodElement(view, activity))) {
-					viewsToDelete.add(view);
-				}
-			}
-		}
-		if(!viewsToDelete.isEmpty()) {
-			for (View view : viewsToDelete) {
-				ViewUtil.destroy(view);
-			}
-		}
-	}
-
-	public void redo() {
-		execute();
-	}
-	
-	@Override
-	public boolean canUndo() {
-		return false;
-	}
-	
-	@Override
-	protected boolean prepare() {		
-		diagramSvc = new DiagramService();
-		Collection<Diagram> diagrams = diagramSvc.getDiagrams(activity);
-		return !diagrams.isEmpty();
-	}
-
-	@Override
-	public void dispose() {
-		activity = null;
-		breakdownElements = null;
-		diagramSvc.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/NestedCommandProvider.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/NestedCommandProvider.java
deleted file mode 100644
index c14596c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/NestedCommandProvider.java
+++ /dev/null
@@ -1,438 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.commands;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.command.INestedCommandProvider;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.command.ResourceAwareCompoundCommand;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.command.ActivityDropCommand;
-import org.eclipse.epf.library.edit.process.command.CopyHelper;
-import org.eclipse.epf.library.edit.process.command.ProcessDeepCopyCommand;
-import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
-import org.eclipse.epf.library.edit.util.ActivityHandler;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class NestedCommandProvider implements INestedCommandProvider {
-
-	private static final boolean DEBUG = DiagramCorePlugin.getDefault()
-			.isDebugging();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.INestedCommandProvider#createNestedCommand(org.eclipse.emf.common.command.Command)
-	 */
-	public Command createNestedCommand(Command command) {
-		if (command instanceof ActivityDropCommand) {
-			ActivityDropCommand cmd = (ActivityDropCommand) command;
-			if (IActionTypeProvider.COPY == cmd.getType())
-				return createNestedCommandForCopy(cmd);
-			else if (IActionTypeProvider.DEEP_COPY == cmd.getType())
-				return createNestedCommandForDeepCopy(cmd);
-		}
-		else if (command instanceof ProcessDeepCopyCommand) {
-			ProcessDeepCopyCommand cmd = (ProcessDeepCopyCommand) command;
-			Process deepCopy = null;
-			Collection<?> result = cmd.getResult();
-			if(!result.isEmpty()) {
-				deepCopy = (Process) result.iterator().next();
-			}
-			if(deepCopy != null) {
-				Collection<Activity> deepCopies = new ArrayList<Activity>();
-				deepCopies.add(deepCopy);
-				return createNestedCommandForDeepCopy(deepCopies, cmd.getTargetProcess(), 
-						cmd.getCopyHelper(), cmd.getMethodConfiguration(), true);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Create nested command for Drag & Drop Copy
-	 * 
-	 * @param command
-	 * @return
-	 */
-	private Command createNestedCommandForCopy(ActivityDropCommand command) {
-		Collection<Resource> modifiedResources = ((ActivityDropCommand) command).getModifiedResources(); 
-		if (modifiedResources != null && !modifiedResources.isEmpty()) {
-			CompoundCommand cmd = new ResourceAwareCompoundCommand(
-					CompoundCommand.MERGE_COMMAND_ALL);
-
-			Helper copiedHelper = command.getActivityHandler().getCopyHelper();
-			Activity targetActivity = command.getActivity();
-			Process targetProc = TngUtil.getOwningProcess(targetActivity);
-			if (targetProc != null) {
-				try {
-					cmd.append(new CopyDiagramCommand(copiedHelper.values(),
-							copiedHelper, targetProc));
-				
-				} catch (Exception ex) {
-					CommonPlugin.getDefault().getLogger().logError(ex);
-					if (DEBUG) {
-						ex.printStackTrace();
-					}
-				} finally {
-	
-				}
-			}
-			if (!cmd.isEmpty()) {
-				return cmd;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Created nested command for Drag and Drop Deep copy
-	 * 
-	 * @param command
-	 * @return
-	 */
-	private Command createNestedCommandForDeepCopy(ActivityDropCommand command) {
-		ActivityHandler activityHandler = ((ActivityDropCommand) command)
-				.getActivityHandler();
-		if (activityHandler != null
-				&& !activityHandler.getDeepCopies().isEmpty()) {
-			return createNestedCommandForDeepCopy(activityHandler
-					.getDeepCopies(), activityHandler.getTargetProcess(),
-					activityHandler.getDeepCopyHelper(), activityHandler.getDeepCopyConfig(), false);
-		}
-		return null;
-	}
-	
-	private Command createNestedCommandForDeepCopy(
-			Collection<Activity> deepCopies, final Process targetProc,
-			CopyHelper copyHelper, MethodConfiguration config,
-			boolean saveDiagram) {
-		CompoundCommand cmd;
-		if (saveDiagram) {
-			cmd = new ResourceAwareCompoundCommand(
-					CompoundCommand.MERGE_COMMAND_ALL) {
-				@Override
-				public void execute() {
-					super.execute();
-
-					// save diagram file
-					//
-					if (org.eclipse.epf.diagram.core.services.DiagramManager
-							.hasDiagramManager(targetProc)) {
-						org.eclipse.epf.diagram.core.services.DiagramManager mgr = org.eclipse.epf.diagram.core.services.DiagramManager
-								.getInstance(targetProc, this);
-						ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
-								.getPersisterFor(targetProc.eResource())
-								.getFailSafePersister();
-						try {
-							Resource resource = mgr.getResource();
-							persister.save(resource);
-							persister.commit();
-						} catch (Exception e) {
-							DiagramCorePlugin.getDefault().getLogger()
-									.logError(e);
-							try {
-								persister.rollback();
-							} catch (Exception ex) {
-								DiagramCorePlugin.getDefault().getLogger()
-										.logError(ex);
-							}
-						} finally {
-							mgr.removeConsumer(this);
-						}
-					}
-				}
-			};
-		} else {
-			cmd = new ResourceAwareCompoundCommand(
-					CompoundCommand.MERGE_COMMAND_ALL);
-		}
-		for (Activity copyAct : deepCopies) {
-			Activity origAct = (Activity) copyHelper.getOriginal(copyAct);
-			Process srcProc = TngUtil.getOwningProcess(origAct);
-			Map<Activity, Activity> copyToOriginalMap = new HashMap<Activity, Activity>();
-			Iterator<BreakdownElement> copyTree = new AbstractTreeIterator<BreakdownElement>(
-					copyAct) {
-
-				@Override
-				protected Iterator<? extends BreakdownElement> getChildren(
-						Object object) {
-					if (object instanceof Activity) {
-						return ((Activity) object).getBreakdownElements()
-								.iterator();
-					}
-					return Collections.EMPTY_LIST.iterator();
-				}
-
-			};
-			while (copyTree.hasNext()) {
-				BreakdownElement e = copyTree.next();
-				if (e instanceof Activity) {
-					Object orig = copyHelper.getOriginal(e);
-					if (orig == null) {
-						System.out
-								.println("NestedCommandProvider.createNestedCommandForDeepCopy(): FATAL ERROR: could not find source activity of deep copy: " + e); //$NON-NLS-1$
-					} else {
-						copyToOriginalMap.put((Activity) e, (Activity) orig);
-					}
-				}
-			}
-			cmd.append(new CopyDiagramForDeepCopyCommand(copyToOriginalMap.keySet(),
-					copyToOriginalMap, srcProc, targetProc, copyHelper, config));
-		}
-		return !cmd.isEmpty() ? cmd : null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.INestedCommandProvider#createRelatedObjects(java.util.Collection,
-	 *      org.eclipse.emf.common.command.Command)
-	 */
-	public Command createRelatedObjects(Collection createdElements,
-			Command createCommand) {
-
-		CompoundCommand cmd = new ResourceAwareCompoundCommand(
-				CompoundCommand.MERGE_COMMAND_ALL);
-		if (createCommand instanceof MethodElementAddCommand) {
-
-			MethodElementAddCommand meCommand = ((MethodElementAddCommand) createCommand);
-			Command addCommand = meCommand.getCommand();
-			if (addCommand instanceof AddCommand) {
-				EditingDomain ed = ((AddCommand) addCommand).getDomain();
-				
-				if (((AddCommand)addCommand).getOwner() instanceof ProcessPackage) {
-					if (ed instanceof TraceableAdapterFactoryEditingDomain) {
-						Map copyToOriginalMap = ((TraceableAdapterFactoryEditingDomain) ed)
-								.getCopyToOriginalMap();
-						if (!copyToOriginalMap.isEmpty()) {
-							Collection affects = meCommand.getAffectedObjects();
-							for (Iterator iter = affects.iterator(); iter
-									.hasNext();) {
-								MethodElement element = (MethodElement) iter
-										.next();
-								if (element instanceof ProcessComponent) {
-									cmd.append(new CopyDiagramCommand(
-											copyToOriginalMap.keySet(),
-											copyToOriginalMap,
-											((ProcessComponent) element)
-													.getProcess()));
-								}
-							}
-						}
-					}
-				} else {
-					// Copy/paste within the process editor
-					if (ed instanceof TraceableAdapterFactoryEditingDomain) {
-						Map originalToCopyMap = ((TraceableAdapterFactoryEditingDomain) ed)
-								.getOriginalToClipboardMap();
-						Map copyToOriginalMap = new HashMap();
-						Object owner = ((AddCommand) addCommand).getOwner();
-						Process targetProc = TngUtil.getOwningProcess(owner);
-						if (targetProc != null) {
-							for (Iterator iter = originalToCopyMap.keySet()
-									.iterator(); iter.hasNext();) {
-								Object key = iter.next();
-								Object val = originalToCopyMap.get(key);
-	
-								copyToOriginalMap.put(val, key);
-							}
-	
-							cmd.append(new CopyDiagramCommand(copyToOriginalMap.keySet(),
-									copyToOriginalMap, targetProc));
-						}
-					}
-				}
-			}
-		}
-		if (!cmd.isEmpty()) {
-			return cmd;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.INestedCommandProvider#removeRelatedObjects(java.util.Collection,
-	 *      org.eclipse.emf.common.command.Command)
-	 */
-	public Command removeRelatedObjects(Collection deletedElements,
-			Command deleteCommand) {
-		CompoundCommand cmd = new ResourceAwareCompoundCommand(
-				CompoundCommand.MERGE_COMMAND_ALL);
-		if(deleteCommand instanceof DeleteMethodElementCommand){
-			Command removeCommand = ((DeleteMethodElementCommand)deleteCommand).getCommand();
-			List<RemoveCommand> removeCommands = null;
-			if(removeCommand instanceof RemoveCommand){
-				removeCommands = Collections.singletonList((RemoveCommand)removeCommand);
-			}
-			else if(removeCommand instanceof CompoundCommand) {
-				removeCommands = new ArrayList<RemoveCommand>();
-				for (Command command : ((CompoundCommand)removeCommand).getCommandList()) {
-					if(command instanceof RemoveCommand) {
-						removeCommands.add((RemoveCommand) command);
-					}
-				}
-			}
-			if(removeCommands != null && !removeCommands.isEmpty()) {
-				Object owner = removeCommands.get(0).getOwner();
-				if(owner instanceof Activity) {
-					Process process = TngUtil.getOwningProcess((Activity)owner);
-					Collection<Activity> allElements = new HashSet<Activity>();
-					for (Iterator iter = deletedElements.iterator(); iter
-					.hasNext();) {
-						Object element = iter.next();
-						if (element instanceof Activity) {
-							Iterator iterator = new AbstractTreeIterator<Object>(element) {
-
-								private static final long serialVersionUID = 1L;
-
-								@Override
-								protected Iterator<? extends Object> getChildren(
-										Object object) {
-									if(object instanceof Activity) {
-										return ((Activity)object).getBreakdownElements().iterator();
-									}
-									else {
-										return Collections.emptyList().iterator();
-									}
-								}
-
-							};
-							while(iterator.hasNext()) {
-								Object e = iterator.next();
-								if(e instanceof Activity) {
-									allElements.add((Activity) e);
-								}
-							}
-						} 
-					}					
-					if(!allElements.isEmpty()){
-						cmd.append(new DeleteDiagramCommand(allElements, process));
-					}
-
-					for (RemoveCommand command : removeCommands) {
-						if(command.getOwner() instanceof Activity) {
-							DeleteDiagramNodeCommand deleteDiagramNodeCommand = new DeleteDiagramNodeCommand(
-									(Activity) command.getOwner(), command.getCollection());
-							if(deleteDiagramNodeCommand.canExecute()) {
-								cmd.append(deleteDiagramNodeCommand);
-							}
-						}
-					}
-				}
-			}
-		}
-		if(!deletedElements.isEmpty()){
-			for (Iterator iter = deletedElements.iterator(); iter.hasNext();) {
-				Object element = (Object) iter.next();
-				if(element instanceof ProcessComponent){
-					ProcessComponent pc = (ProcessComponent)element;
-					Process process = pc.getProcess();
-					closeDiagramEditors(process);
-				}
-			}
-		}
-		if(!cmd.isEmpty()){
-			return cmd;
-		}
-		return null;
-	}
-	
-	/**
-	 * Closes Diagram Editors if the owning process is deleted.
-	 * @param process
-	 */
-	private void closeDiagramEditors(Process process) {
-		IWorkbenchPage workbenchPage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		ArrayList<IEditorReference> editorsToClose = new ArrayList<IEditorReference>();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference editorRef = editorReferences[i];
-			IEditorInput editorInput;
-			try {
-				editorInput = editorRef.getEditorInput();
-				if (editorInput instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput input = ((DiagramEditorInputProxy) editorInput)
-							.getDiagramEditorInput();
-					Object wrapper = input.getWrapper();
-					Object owningProcess = null;
-					if (wrapper != null) {
-						if (wrapper instanceof BreakdownElementWrapperItemProvider) {
-							owningProcess = TngUtil
-									.getOwningProcess(((BreakdownElementWrapperItemProvider) wrapper));
-						}
-					} else {
-						wrapper = input.getMethodElement();
-						if (wrapper instanceof BreakdownElement) {
-							owningProcess = TngUtil
-									.getOwningProcess(((BreakdownElement) wrapper));
-						}
-					}
-					if (owningProcess == owningProcess) {
-						editorsToClose.add(editorRef);
-					}
-				}
-			} catch (PartInitException e) {
-				DiagramCorePlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		if(!editorsToClose.isEmpty()) {
-			IEditorReference[] refs = new IEditorReference[editorsToClose.size()];
-			editorsToClose.toArray(refs);
-			workbenchPage.closeEditors(refs, false);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/ReconnectLinkCommand.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/ReconnectLinkCommand.java
deleted file mode 100644
index 2725a1a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/commands/ReconnectLinkCommand.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.commands;
-
-import java.util.Collections;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.util.DiagramCoreValidation;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.2
- */
-public class ReconnectLinkCommand extends Command {
-
-	private boolean isSource;
-
-	private Edge link;
-
-	private Node newNode, oldNode;
-
-	private int viewIndex;
-
-	private Point endPoint;
-
-	private InternalTransactionalEditingDomain domain;
-
-	private static final String LABEL = "Reconnect Link"; //$NON-NLS-1$
-
-	public ReconnectLinkCommand(InternalTransactionalEditingDomain domain, Edge link, Node newNode, boolean isSource) {
-		super(LABEL);
-		this.domain = domain;
-		this.link = link;
-		this.newNode = newNode;
-		this.isSource = isSource;
-	}
-
-	public void setEndPoint(Point p) {
-		endPoint = p.getCopy();
-	}
-
-	public boolean canExecute() {
-		boolean result = link != null && newNode != null;
-		if (!result) {
-			return false;
-		}
-		if (isSource) {
-			return DiagramCoreValidation.checkReconnect(newNode, (Node)link.getTarget(), link) == null;
-		} else {
-			return DiagramCoreValidation.checkReconnect((Node)link.getSource(), newNode, link) == null;
-		}
-	}
-
-	public void execute() {
-
-		// Link
-		try {
-			TxUtil.runInTransaction(domain, new Runnable() {
-
-				public void run() {
-					if (isSource) {
-						oldNode = (Node) link.getSource();
-						if (oldNode != null) { // safety check to handle dangling link
-							viewIndex = oldNode.getTargetEdges().indexOf(link);
-						}
-						link.setSource(newNode);
-					} else {
-						oldNode = (Node) link.getTarget();
-						if (oldNode != null) { // safety check to handle dangling link
-							viewIndex = oldNode.getSourceEdges().indexOf(link);
-						}
-						link.setTarget(newNode);
-					}
-				}
-				
-			});
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError("Error while re-connect the link :", e); //$NON-NLS-1$
-		}
-	}
-
-	public void undo() {
-		if (isSource) {
-			newNode.getTargetEdges().remove(link);
-			oldNode.getTargetEdges().add(viewIndex, link);
-		} else {
-			newNode.getSourceEdges().remove(link);
-			oldNode.getSourceEdges().add(viewIndex, link);
-		}
-		oldNode = null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/figures/RaisedMarginBorder.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/figures/RaisedMarginBorder.java
deleted file mode 100644
index 2f58c6c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/figures/RaisedMarginBorder.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package  org.eclipse.epf.diagram.core.figures;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- *  A border with a raised margin.
- *  
- * @author Kelvin Low
- * @since 1.0
- */
-public class RaisedMarginBorder extends MarginBorder {
-
-	private static final Insets DEFAULT_INSETS = new Insets(10, 10, 10, 10);
-
-	public RaisedMarginBorder() {
-		this(DEFAULT_INSETS);
-	}
-
-	public RaisedMarginBorder(Insets insets) {
-		super(insets);
-	}
-
-	public RaisedMarginBorder(int t, int l, int b, int r) {
-		super(t, l, b, r);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Border#getInsets(IFigure)
-	 */
-	public Insets getInsets(IFigure figure) {
-		return insets;
-	}
-	
-	/**
-	 * @see org.eclipse.draw2d.Border#isOpaque()
-	 */	
-	public boolean isOpaque() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-	 */
-	public void paint(IFigure figure, Graphics g, Insets insets) {
-		g.setLineStyle(Graphics.LINE_SOLID);
-		g.setLineWidth(1);
-		g.setForegroundColor(ColorConstants.buttonLightest);
-		Rectangle r = getPaintRectangle(figure, insets);
-		r.resize(-1, -1);
-		g.drawLine(r.x, r.y, r.right(), r.y);
-		g.drawLine(r.x, r.y, r.x, r.bottom());
-		g.setForegroundColor(ColorConstants.buttonDarker);
-		g.drawLine(r.x, r.bottom(), r.right(), r.bottom());
-		g.drawLine(r.right(), r.y, r.right(), r.bottom());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/figures/WidenedWrapLabel.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/figures/WidenedWrapLabel.java
deleted file mode 100644
index e816576..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/figures/WidenedWrapLabel.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.figures;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-/**
- * Temporary replacement for {@link WrapLabel} until the text cut-off issue is fixed.
- * 
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class WidenedWrapLabel extends WrapLabel {
-	public static final float DELTA_FACTOR = 0.05f;
-	
-	private Dimension textSize;
-	private Dimension adjustedTextSize;
-	
-	public WidenedWrapLabel() {
-		super();
-	}
-	
-	
-	@Override
-	public Dimension getTextSize(int wHint, int hHint) {
-		Dimension newTextSize = super.getTextSize(wHint, hHint);
-		if(newTextSize != null && newTextSize != textSize) {
-			textSize = newTextSize;
-			
-			// work-around: increase the text size to avoid text cut-off
-			//
-			adjustedTextSize = textSize.getExpanded((int) Math.ceil(textSize.width * DELTA_FACTOR), 4);
-		}
-		return adjustedTextSize;
-	}
-	
-	@Override
-	protected Point getTextLocation() {
-		Point p = super.getTextLocation();
-		Rectangle r = getBounds();
-		Dimension ts = getTextSize(r.width, r.height);
-		if(r.width <= ts.width) {
-			p.x = 0;
-			if(!getText().equalsIgnoreCase(getSubStringText())) {
-				invalidate();
-			}
-		}
-		return p;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/AbstractDiagramEditor.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/AbstractDiagramEditor.java
deleted file mode 100644
index a02fa85..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/AbstractDiagramEditor.java
+++ /dev/null
@@ -1,941 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.core.part;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.actions.AccessibilityMoveAction;
-import org.eclipse.epf.diagram.core.actions.CreateElementAction;
-import org.eclipse.epf.diagram.core.actions.DelegateAction;
-import org.eclipse.epf.diagram.core.actions.DiagramActionsService;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.providers.DiagramContextMenuProvider;
-import org.eclipse.epf.diagram.core.providers.SharedResourceDiagramDocumentProvider;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.core.services.DiagramService;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceListener;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.ui.IMethodElementProvider;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.ui.editors.IMethodEditor;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.KeyHandler;
-import org.eclipse.gef.KeyStroke;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.gmf.runtime.common.core.util.StringStatics;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.actions.internal.SelectAllAction;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeConnectionRequest;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.editor.FileDiagramEditor;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.services.IDisposable;
-import org.eclipse.uml2.uml.ActivityNode;
-
-/**
- * @author Phong Nguyen Le
- * @author skannoor
- * @since 1.2
- */
-public abstract class AbstractDiagramEditor extends FileDiagramEditor implements IGotoMarker, IMethodEditor {
-
-	private DiagramManager diagramMgr;
-	private DiagramActionsService actionService = null;
-	
-	private long fModificationStamp;
-	private Activity activity;
-	private AdapterImpl titleAdapter;
-
-	private IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
-
-		public void resourceChanged(IResourceChangeEvent event) {
-			if(event.getSource() == diagramMgr) {
-				IDocumentProvider docProvider = getDocumentProvider();
-				if(docProvider instanceof SharedResourceDiagramDocumentProvider) {
-					if(!isDirty()) {
-						((SharedResourceDiagramDocumentProvider)docProvider).handleElementContentChanged(getEditorInput());
-					}
-				}				
-			}
-		}
-		
-	};
-	
-	// Listeners to refresh diagram if configuration got changed
-	//
-	private ILibraryChangeListener libraryListener = new ILibraryChangeListener() {
-		public void libraryChanged(int option, Collection collection) {
-			switch (option) {
-			case ILibraryChangeListener.OPTION_CHANGED: {
-				if (collection != null && collection.contains(currentConfig)) {
-					MethodConfiguration config = ProcessAuthoringConfigurator.INSTANCE.getMethodConfiguration();
-					try {
-						ProcessAuthoringConfigurator.INSTANCE.setMethodConfiguration(currentConfig);					
-						refresh();
-					}
-					finally {
-						ProcessAuthoringConfigurator.INSTANCE.setMethodConfiguration(config);
-					}
-				}		
-				break;
-			}
-			// handled by libSvcListener
-			//
-//			case ILibraryChangeListener.OPTION_CONFIGURATION_SELECTED: {
-//				configChanged();
-//				break;
-//			}
-			}
-		}
-	};
-	
-	private ILibraryServiceListener libSvcListener = new LibraryServiceListener() {
-
-		public void configurationSet(MethodConfiguration config) {
-			configChanged();
-		}
-
-	};
-
-	private MethodConfiguration currentConfig;
-
-	//TODO: if this flag is set, refresh diagram if needed when the editor is activated 
-	private boolean needRefresh;
-	private DiagramService diagramSvc;
-
-	public AbstractDiagramEditor() {
-		super(true);
-	}
-	
-	public AbstractDiagramEditor(boolean hasFlyoutPalette) {
-		super(hasFlyoutPalette);
-	}
-
-	protected String getEditingDomainID() {
-		return "org.eclipse.epf.diagram.EditingDomain"; //$NON-NLS-1$
-	}
-
-	protected DiagramManager getDiagramManager() {
-		if (diagramMgr == null) {
-			org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess(activity);
-			diagramMgr = DiagramManager.getInstance(proc, this);
-			diagramMgr.addResourceChangeListener(resourceChangeListener);
-		}
-		return diagramMgr;
-	}
-	
-	protected DiagramService getDiagramService() {
-		if(diagramSvc == null) {
-			diagramSvc = new DiagramService();
-		}
-		return diagramSvc;
-	}
-
-	protected TransactionalEditingDomain createEditingDomain() {
-		TransactionalEditingDomain domain = getDiagramManager().getEditingDomain();
-		domain.setID(getEditingDomainID());
-		return domain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor#setDocumentProvider(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setDocumentProvider(IEditorInput input) {
-		setDocumentProvider(new SharedResourceDiagramDocumentProvider(getDiagramManager()) {
-			@Override
-			protected void doSynchronize(Object element, IProgressMonitor monitor) throws CoreException {
-				// reload diagram's resource
-				//
-				DiagramManager mgr = getDiagramManager();
-				try {
-					mgr.removeResourceChangeListener(resourceChangeListener);
-					mgr.reload();
-				} catch (IOException e) {
-					throw new CoreException(new Status(IStatus.ERROR, DiagramCorePlugin.getPluginId(),
-							0, "Error reloading diagram", e)); //$NON-NLS-1$
-				}
-				finally {
-					mgr.addResourceChangeListener(resourceChangeListener);
-				}
-				super.doSynchronize(element, monitor);
-			}
-		});		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor#doSetInput(org.eclipse.ui.IEditorInput, boolean)
-	 * @custom
-	 */
-	public void doSetInput(IEditorInput input, boolean releaseEditorContents)
-			throws CoreException {
-		activity = (Activity) getMethodElement(input);
-		DiagramEditorInputProxy inputProxy = null;
-		if (input instanceof DiagramEditorInputProxy) {
-			inputProxy = (DiagramEditorInputProxy) input;
-			inputProxy.setTransactionalEditingDomain(createEditingDomain());
-		}
-		super.doSetInput(input, releaseEditorContents);
-		if(isEditable() && inputProxy != null && !inputProxy.isNewDiagram()) {
-			getDiagramManager().backupDiagram(activity, getDiagram());
-		}
-		initializeTitle(input);
-	}
-
-	/**
-	 * Initializes the editor's title based on the given editor input.
-	 *
-	 * @param input the editor input to be used
-	 * @custom
-	 */
-	private void initializeTitle(IEditorInput input) {
-
-		String title = ""; //$NON-NLS-1$
-		if (input != null) {
-			DiagramFileEditorInputProxy fileInput = (DiagramFileEditorInputProxy) input;
-			DiagramEditorInput diagramInput = fileInput.getDiagramEditorInput();
-			MethodElement inputElement = diagramInput.getMethodElement();
-			if (inputElement != null) {
-				//title = inputElement.getName();
-				title = getPartNamePrefix() + 
-							inputElement.getName()+
-							StringStatics.COMMA + StringStatics.SPACE + 
-							diagramInput.getSuppression().getProcess().getName(); 
-//				ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-//						TngAdapterFactory.INSTANCE
-//								.getNavigatorView_ComposedAdapterFactory());
-				Image titleImage = getPartImage();				
-				setTitleImage(titleImage);
-			}
-		}
-		setPartName(title);
-		firePropertyChange(PROP_DIRTY);
-	}
-
-	/**
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor#sanityCheckState(org.eclipse.ui.IEditorInput)
-	 * @custom
-	 */
-	protected void sanityCheckState(IEditorInput input) {
-		IDocumentProvider p = getDocumentProvider();
-		if (p == null)
-			return;
-
-		long stamp = p.getModificationStamp(input);
-		if (stamp != fModificationStamp) {
-			fModificationStamp = stamp;
-			if (!p.isSynchronized(input)) {
-				handleEditorInputChanged();
-				if(!p.isSynchronized(input) && p instanceof SharedResourceDiagramDocumentProvider) {
-					((SharedResourceDiagramDocumentProvider)p).allowEditing(input);
-				}
-			}
-		}
-		updateState(getEditorInput());
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor#dispose()
-	 */
-	public void dispose() {
-		Diagram diagram = getDiagram();
-		
-		// if changes discarded, reverse to saved
-		//		
-		if(isDirty()) {
-			reverseToSaved();
-		}		
-		
-		if(titleAdapter != null){
-			MethodElement e = getMethodElement(getEditorInput());
-			if(e != null){
-				e.eAdapters().remove(titleAdapter);
-			}
-			titleAdapter = null;
-		}
-		
-		if(diagramMgr != null) {
-			if(activity != null && diagram != null) {
-				diagramMgr.removeDiagramBackup(activity, diagram.getType());
-			}
-			diagramMgr.removeResourceChangeListener(resourceChangeListener);
-			diagramMgr.removeConsumer(this);
-		}		
-		
-		if(diagramSvc != null) {
-			diagramSvc.dispose();
-		}
-				
-		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.removeListener(libraryListener);
-		}
-		LibraryService.getInstance().removeListener(libSvcListener);
-		
-		// Remove the adapter from the uml activity if editor is closed.
-		if(getDiagram().getElement() instanceof org.eclipse.uml2.uml.Activity){
-			org.eclipse.uml2.uml.Activity act = (org.eclipse.uml2.uml.Activity)getDiagram().getElement();
-			if(act != null && getDiagramAdapter() != null){
-				act.eAdapters().remove(getDiagramAdapter());
-			}
-		}
-		
-		// dispose the input
-		//
-		IEditorInput input = getEditorInput();
-		if(input instanceof IDisposable) {
-			((IDisposable)input).dispose();
-		}
-		
-		DiagramEditPart editPart = getDiagramEditPart();
-		if(editPart != null) {
-			editPart.setModel(null);
-		}
-
-		super.dispose();
-	
-	}
-
-	private DiagramAdapter getDiagramAdapter() {
-		View view = ((View) getDiagramEditPart().getModel());
-		return view != null ? (DiagramAdapter) BridgeHelper
-				.getNodeAdapter(view.getElement()) : null;
-	}
-
-	private void reverseToSaved() {
-		try {
-			IDocumentProvider p = getDocumentProvider();
-			if(p instanceof SharedResourceDiagramDocumentProvider) {
-				((SharedResourceDiagramDocumentProvider)p).reverseToSaved(getEditorInput());
-			}
-			
-			DiagramAdapter adapter = getDiagramAdapter();
-			if(adapter == null) {
-				//TODO: reverse to saved for ADD and WPDD
-				return;
-			}
-			IActionManager actionMgr = adapter.getActionManager();
-			boolean dirty = actionMgr.isSaveNeeded();
-			if (dirty) {
-				actionMgr.undoAll();
-//				getOperationHistory().undo(getUndoContext(), new NullProgressMonitor(), null);
-//				getOperationHistory().dispose(getUndoContext(), true, true, true);
-			}
-			getActionManager().clear();
-
-			// save the undone changes only if the resource has been changed outside this editor
-			//
-			boolean saveNeeded = dirty
-			&& getLastModified() > adapter.getUmaLastModified();
-			MethodElement me;
-			if (saveNeeded && (me = getMethodElementFromInput()) != null) {
-				ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
-				.getCurrentPersister().getFailSafePersister();
-				try {
-					persister.save(me.eResource());
-					persister.commit();
-				} catch (Exception e) {
-					CommonPlugin.getDefault().getLogger().logError(e);
-					try {
-						persister.rollback();
-					} catch (Exception ex) {
-						//TODO: reload library needed
-						//					ViewHelper.reloadCurrentLibrary(getSite().getShell(), null);
-						ex.printStackTrace();
-					}
-				}
-			}
-		}
-		catch(Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-			e.printStackTrace();
-		}
-	}
-
-	private Process getProcess() {
-		Object input = getEditorInput();
-		if (input instanceof IDiagramFileEditorInputProxy) {
-			return ((IDiagramFileEditorInputProxy) input)
-					.getDiagramEditorInput().getSuppression().getProcess();
-		}
-		return null;
-	}
-	
-	protected MethodElement getMethodElementFromInput() {
-		return getMethodElement(getEditorInput());
-	}
-	
-	private static MethodElement getMethodElement(IEditorInput input) {
-		if (input instanceof DiagramFileEditorInputProxy) {
-			return ((DiagramFileEditorInputProxy) input)
-					.getDiagramEditorInput().getMethodElement();
-		}
-		return null;
-	}
-
-	private long getLastModified() {
-		Resource resource = getMethodElementFromInput().eResource();
-		if (resource != null && resource.getURI().isFile()) {
-			File file = new File(resource.getURI().toFileString());
-			return file.lastModified();
-		}
-		return -1;
-	}
-
-	public void doSave(IProgressMonitor progressMonitor) {
-		DiagramAdapter diagramAdapter = getDiagramAdapter();
-		if(diagramAdapter != null) {
-			IActionManager actionMgr = getDiagramAdapter().getActionManager();
-			if (actionMgr != null && actionMgr.isSaveNeeded()) {
-				try {
-					progressMonitor.beginTask("Saving", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-					ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
-					.getCurrentPersister().getFailSafePersister();
-					try {
-						for (Iterator iter = actionMgr.getModifiedResources()
-								.iterator(); iter.hasNext();) {
-							Resource resource = (Resource) iter.next();
-							progressMonitor.setTaskName(NLS.bind(DiagramCoreResources.Progress_Saving_message,
-									resource.getURI().isFile() ? resource.getURI()
-											.toFileString() : "")); //$NON-NLS-1$
-							persister.save(resource);
-						}
-						persister.commit();
-						actionMgr.saveIsDone();
-					} catch (Exception e) {
-						CommonPlugin.getDefault().getLogger().logError(e);
-						try {
-							persister.rollback();
-						} catch (Exception ex) {
-							CommonPlugin.getDefault().getLogger().logError(ex);
-							//						ViewHelper
-							//						.reloadCurrentLibaryOnRollbackError(getSite()
-							//						.getShell());
-							return;
-						}
-						
-						/*
-						 * NO UI module should not involve with UI classes
-						 * use callback to handle such kind of situation
-						 * Jinhua Xi, 01/13/08
-						*/
-//						CommonPlugin.getDefault().getMsgDialog().displayWarning(
-//								getSite().getShell().getText(),
-//								DiagramCoreResources.Warning_Saving_Diagram, e.getMessage(),
-//								e);
-						CommonPlugin.getDefault().getMsgCallback().displayWarning(
-								CommonPlugin.getDefault(), 
-								DiagramCoreResources.Warning_Saving_Diagram, e.getMessage(),
-								e);
-					
-						return;
-					}
-
-				} finally {
-					progressMonitor.done();
-				}
-
-			}
-		}
-
-		super.doSave(progressMonitor);
-	}
-	
-	private class DiagramGraphicalViewerEx extends DiagramGraphicalViewer implements IDiagramEditorInputProvider {
-
-		public DiagramEditorInput getDiagramEditorInput() {
-			return ((IDiagramFileEditorInputProxy)getEditorInput()).getDiagramEditorInput();
-		}
-
-		public IEditorPart getEditor() {
-			return AbstractDiagramEditor.this;
-		}				
-	}
-	
-	@Override
-	protected ScrollingGraphicalViewer createScrollingGraphicalViewer() {
-		return new DiagramGraphicalViewerEx();
-	}
-	
-	@Override
-	protected void configureGraphicalViewer() {
-		super.configureGraphicalViewer();
-		
-		currentConfig = LibraryService.getInstance().getCurrentMethodConfiguration();
-		
-		// listen to change for current selection of MethodConfiguration or changes in 
-		// current configuration.
-		//
-		LibraryService.getInstance().addListener(libSvcListener);
-		ILibraryManager manager = LibraryService.getInstance().getCurrentLibraryManager();
-		if (manager != null) {
-			manager.addListener(libraryListener);
-		}
-		getGraphicalControl().addListener(SWT.MouseDoubleClick, new Listener() {
-			public void handleEvent(Event event) {
-				handleDoubleClick(event);
-			}
-		});
-		IDiagramGraphicalViewer viewer =  getDiagramGraphicalViewer();
-        ContextMenuProvider provider = new DiagramContextMenuProvider(this,
-                getDiagramGraphicalViewer());
-            viewer.setContextMenu(provider);
-            getSite().registerContextMenu(ActionIds.DIAGRAM_EDITOR_CONTEXT_MENU,
-                provider, viewer);
-		if(actionService != null){
-			actionService.setGraphicalViewer(viewer);
-		}
-		
-		titleAdapter = new AdapterImpl(){
-			@Override
-			public void notifyChanged(Notification msg) {
-				switch (msg.getFeatureID(MethodElement.class)) {
-				case UmaPackage.METHOD_ELEMENT__NAME:
-//					setName(msg.getNewStringValue());
-					initializeTitle(getEditorInput());
-					break;
-				}
-			}
-		};
-		MethodElement e = getMethodElement(getEditorInput());
-		if(e != null && titleAdapter != null){
-			e.eAdapters().add(titleAdapter);
-		}
-	}
-		
-	private void configChanged() {
-		MethodConfiguration config = LibraryService.getInstance().getCurrentMethodConfiguration();
-		if(currentConfig != config) {
-			// refresh only if the active part is this diagram editor or process editor of the process
-			// that owns this diagram
-			//
-			IWorkbenchPart activePart = getSite().getWorkbenchWindow().getPartService().getActivePart();
-			boolean refresh = activePart == this;
-			if(!refresh) {
-				if(activePart instanceof IEditorPart) {
-					IEditorInput input = ((IEditorPart)activePart).getEditorInput();
-					if(input instanceof IMethodElementProvider) {
-						Object e = ((IMethodElementProvider)input).getMethodElement();
-						if(e instanceof ProcessComponent) {
-							refresh = e instanceof ProcessComponent && 
-							getProcess() == ((ProcessComponent)e).getProcess();
-						}
-					}
-				}
-			}
-			if(refresh) {
-				currentConfig = config;
-				refresh();
-				needRefresh = false;
-			}
-			else {
-				needRefresh = true;
-			}
-		}
-	}
-	
-	public void refresh() {
-		if(getDocumentProvider() instanceof SharedResourceDiagramDocumentProvider){
-			SharedResourceDiagramDocumentProvider docProvider = ((SharedResourceDiagramDocumentProvider)getDocumentProvider());
-			DiagramEditPart editPart = getDiagramEditPart();
-			boolean wasDirty = isDirty();
-			boolean wasBaseDirty = false;
-			IEditorPart baseEditor = null;
-			final boolean isInherited = DiagramEditorUtil.isInherited(editPart);
-			if(isInherited) {
-				MethodElement element = BridgeHelper.getMethodElement(editPart.getDiagramView());
-				String type = editPart.getDiagramView().getType();
-				
-				// try to find the dirty flag of base diagram editor
-				//
-				IEditorReference[] editorRefs = getSite().getPage().getEditorReferences();
-				for (int i = 0; i < editorRefs.length; i++) {
-					IEditorReference ref = editorRefs[i];
-					try {
-						if(ref.getEditorInput() instanceof IDiagramFileEditorInputProxy) {
-							DiagramEditorInput input = ((IDiagramFileEditorInputProxy)ref.getEditorInput()).getDiagramEditorInput();
-							if(input.getWrapper() == null && input.getMethodElement() == element &&
-									DiagramManager.getDiagramType(type) == input.getDiagramType()) {
-								IEditorPart editor = ref.getEditor(false);
-								if(editor != null) {
-									wasBaseDirty = editor.isDirty();
-									baseEditor = editor;
-									break;
-								}
-							}
-						}
-					} catch (PartInitException e) {
-						DiagramCorePlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-
-			docProvider.setContent(getEditorInput());
-			if(wasDirty) {
-				docProvider.setCanSaveDocument(getEditorInput());
-			}
-			// editors can become dirty after refresh
-			// clear dirty flag
-			//
-			else if(isDirty()) {
-				((SharedResourceDiagramDocumentProvider) getDocumentProvider())
-						.markDocumentAsSaved((IFileEditorInput)getEditorInput());
-			}
-			if(baseEditor != null && !wasBaseDirty) {
-				((SharedResourceDiagramDocumentProvider)((DiagramDocumentEditor)baseEditor).getDocumentProvider())
-					.markDocumentAsSaved((IFileEditorInput) baseEditor.getEditorInput());
-			}
-			updateState(getEditorInput());
-		}
-	}
-	
-	// Does nothing but for override. 
-	protected void handleDoubleClick(Event event) {
-	}
-	
-	@Override
-	public boolean isDirty() {
-		if(!DiagramEditorUtil.isModifiable(getEditorInput())){
-			return false;
-		}
-		return super.isDirty();
-	}
-	
-	@Override
-	public boolean isEditable() {
-		if(getDocumentProvider() instanceof SharedResourceDiagramDocumentProvider){
-			return !((SharedResourceDiagramDocumentProvider)getDocumentProvider()).getLockedState();
-		}
-		return true;
-	}
-	
-	@Override
-	protected KeyHandler getKeyHandler() {
-		KeyHandler keyHandler =  super.getKeyHandler();
-		if(keyHandler != null){
-			ActionRegistry registry = getActionRegistry();
-			IAction action = registry.getAction(ActionFactory.DELETE.getId());
-			
-			if(action != null && !(action instanceof DelegateAction)){
-				getActionRegistry().removeAction(action);
-				getSelectionActions().remove(action);
-				action = new DelegateAction((IWorkbenchPart)this,ActionFactory.DELETE.getId());
-				action.setId(ActionFactory.DELETE.getId());
-				getActionRegistry().registerAction(action);
-				getSelectionActions().add(action.getId());
-			}
-            keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0),
-            	getActionRegistry().getAction(ActionFactory.DELETE.getId()));
-            keyHandler.put(KeyStroke.getPressed(SWT.BS, 8, 0),
-                    getActionRegistry().getAction(ActionFactory.DELETE.getId()));
-            keyHandler.put(/* CTRL + D */
-                        KeyStroke.getPressed((char) 0x04, 100, SWT.CTRL),
-                            getActionRegistry().getAction(
-                               ActionFactory.DELETE.getId()));
-            getActionRegistry().registerAction(new AccessibilityMoveAction(this,PositionConstants.SOUTH));
-            AccessibilityMoveAction moveAction = ((AccessibilityMoveAction)getActionRegistry().getAction(AccessibilityMoveAction.MOVE_DOWN_ACTION));
-            keyHandler.put(KeyStroke.getPressed(SWT.ARROW_DOWN, SWT.CTRL),
-            		moveAction);
-            
-            getActionRegistry().registerAction(new AccessibilityMoveAction(this,PositionConstants.NORTH));
-            moveAction = ((AccessibilityMoveAction)getActionRegistry().getAction(AccessibilityMoveAction.MOVE_UP_ACTION));
-            keyHandler.put(KeyStroke.getPressed(SWT.ARROW_UP, SWT.CTRL),
-            		moveAction);
-            
-            getActionRegistry().registerAction(new AccessibilityMoveAction(this,PositionConstants.WEST));
-            moveAction = ((AccessibilityMoveAction)getActionRegistry().getAction(AccessibilityMoveAction.MOVE_LEFT_ACTION));
-            keyHandler.put(KeyStroke.getPressed(SWT.ARROW_LEFT, SWT.CTRL),
-            		moveAction);
-            
-            getActionRegistry().registerAction(new AccessibilityMoveAction(this,PositionConstants.EAST));
-            moveAction = ((AccessibilityMoveAction)getActionRegistry().getAction(AccessibilityMoveAction.MOVE_RIGHT_ACTION));
-            keyHandler.put(KeyStroke.getPressed(SWT.ARROW_RIGHT, SWT.CTRL),
-            		moveAction);
-            
-            /* CTRL + A */
-            action = SelectAllAction.createSelectAllAction(getEditorSite()
-					.getWorkbenchWindow().getActivePage());
-            getActionRegistry().registerAction(action);
-            getSelectionActions().add(action.getId());
-			keyHandler.put(
-            		KeyStroke.getReleased((char) 0x1, 97, SWT.CTRL),
-            		action);
-			// Key pressed event for CTRL + A is not triggered, use key released event for now
-			//
-			keyHandler.put(
-            		KeyStroke.getReleased((char) 0x1, 97, SWT.CTRL),
-            		action);
- 		}
-		
-		return keyHandler;
-	}
-	
-	
-	@Override
-	protected void createActions() {
-		super.createActions();
-		createControlFlowAction();
-		
-		// Register alignment actions:
-		actionService = new DiagramActionsService(
-				getDiagramManager().getEditingDomain(),
-				getGraphicalViewer(),
-				getEditDomain(), getActionRegistry());
-		actionService.registerHorizontalAlignAverageAction();
-		actionService.registerHorizontalAlignFirstSelectedAction();
-		actionService.registerVerticalAlignAverageAction();
-		actionService.registerVerticalAlignFirstSelectedAction();
-		
-	}
-	
-	protected IAction createAnAction(String actionName,
-			List<IElementType> elementType, String actionId,
-			String tooltipString, ImageDescriptor imagedesc) {
-		CreateElementAction action = new CreateElementAction(this, actionName);
-		action.setElementTypes(elementType);
-		action.setPreferenceHint(getPreferencesHint());
-		action.setImageDescriptor(imagedesc);
-		action.setToolTipText(tooltipString);
-		action.setId(actionId);
-		return action;
-	}
-	
-	public void contributeToContextMenu(IMenuManager menu) {
-		if(actionService != null){
-			actionService.createAlignMenu(menu, isEditable());
-		}
-		addToMenu(menu, DiagramConstants.CREATE_LINK,
-				GEFActionConstants.MB_ADDITIONS, true, true);
-	}
-	
-	protected void addToMenu(IMenuManager menu, String id, String groupName, 
-			boolean separator, boolean append) {
-		boolean canModify = isEditable();
-		if (id != null) {
-			IAction action = getActionRegistry().getAction(id);
-			if (action != null && action.isEnabled() && canModify) {
-				if (append) {
-					menu.appendToGroup(groupName, action);
-				} else {
-					menu.prependToGroup(groupName, action);
-				}
-				if (separator) {
-					menu.insertAfter(id, new Separator());
-				}
-			}
-		}else{
-			if(separator && canModify){
-				if(append){
-					menu.appendToGroup(groupName, new Separator());
-				}else{
-					menu.prependToGroup(groupName, new Separator());
-				}
-			}
-		}
-	}
-	
-	/**
-	 * To reset the layout of the diagram.
-	 */
-	public void resetLayout(){
-		// does nothing. client should implement.
-	}
-	
-	
-	/**
-	 * Refresh diagram
-	 */
-	public void refreshDiagram(){
-		refresh();
-	}
-	
-	protected abstract String getPartNamePrefix();
-	
-	protected abstract Image getPartImage();
-	
-	private void createControlFlowAction(){
-		IAction linkAction = new Action(DiagramCoreResources.ActivityDiagram_Palette_control_flow_create_text) { //$NON-NLS-1$
-			public void run() {
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() == 2) {
-					EditPart sourceEditPart = (EditPart) editParts.get(0);
-					EditPart targetEditPart = (EditPart) editParts.get(1);
-					
-					View sourceModel = (View)sourceEditPart.getModel();
-					View targetModel = (View)targetEditPart.getModel();
-					
-					if(BridgeHelper.isReadOnly(sourceModel) 
-							|| BridgeHelper.isReadOnly(targetModel))
-						return;
-					
-					CreateUnspecifiedTypeConnectionRequest connectionRequest = 
-						getCreateControlFlowRequest();
-					if (connectionRequest != null) {
-						connectionRequest.setSourceEditPart(null);
-						connectionRequest.setTargetEditPart(targetEditPart);
-						connectionRequest
-								.setType(RequestConstants.REQ_CONNECTION_START);
-						connectionRequest.setLocation(new Point(0, 0));
-						sourceEditPart.getCommand(connectionRequest);
-
-						connectionRequest.setSourceEditPart(sourceEditPart);
-						connectionRequest.setTargetEditPart(targetEditPart);
-						connectionRequest
-								.setType(RequestConstants.REQ_CONNECTION_END);
-						connectionRequest.setLocation(new Point(0, 0));
-
-						DiagramEditPart diagramEditPart = getDiagramEditPart();
-						if (diagramEditPart.isEditModeEnabled()) {
-							Command cmd = targetEditPart
-									.getCommand(connectionRequest);
-							if (cmd != null && cmd.canExecute()) {
-								cmd.execute();
-							}
-						}
-					}
-				}
-			}
-
-			public boolean isEnabled() {
-				if(getCreateControlFlowRequest()== null) return false;
-				List editParts = getGraphicalViewer().getSelectedEditParts();
-				if (editParts.size() == 2) {
-					EditPart sourceEditPart = (EditPart) editParts.get(0);
-					EditPart targetEditPart = (EditPart) editParts.get(1);
-
-					View sourceModel = (View) sourceEditPart.getModel();
-					View targetModel = (View) targetEditPart.getModel();
-					if(BridgeHelper.isReadOnly(sourceModel) 
-							|| BridgeHelper.isReadOnly(targetModel))
-						return false;
-					
-					for (Iterator iter = getDiagram().getEdges().iterator(); iter.hasNext();) {
-						Edge edge = (Edge) iter.next();
-						if(edge.getSource()== sourceModel && edge.getTarget() == targetModel){
-							return false;
-						}
-					}
-					
-					if (sourceModel.getElement() instanceof ActivityNode
-							| sourceModel.getElement() instanceof NamedNode
-							|| targetModel.getElement() instanceof ActivityNode
-							|| targetModel.getElement() instanceof NamedNode) {
-						return true;
-					}
-					
-				}
-				return false;
-			}
-
-			public String getId() {
-				return DiagramConstants.CREATE_LINK;
-			}
-			@Override
-			public ImageDescriptor getImageDescriptor() {
-				return DiagramConstants.CONTROL_FLOW_IMAGE_DESCRIPTOR;
-			}
-		};
-		getActionRegistry().registerAction(linkAction);
-	}
-
-	/**
-	 * Does nothing client should implement.
-	 * @return
-	 */
-	protected CreateUnspecifiedTypeConnectionRequest getCreateControlFlowRequest() {
-		return null;
-	}
-	
-	protected Diagram getDiagram(Activity activity, int type) {
-		return getDiagramService().getDiagram(activity, type);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramEditorInput.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramEditorInput.java
deleted file mode 100644
index 8a574f4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramEditorInput.java
+++ /dev/null
@@ -1,175 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- *
- */
-package org.eclipse.epf.diagram.core.part;
-
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * DiagramEditor Input for {@link BreakdownElement} 
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- */
-public class DiagramEditorInput implements IEditorInput {
-
-	private MethodElement methodElement;
-
-	private ImageDescriptor imageDescriptor = null;
-	
-	private Suppression suppression;
-
-	private BreakdownElementWrapperItemProvider wrapper;
-
-	private int diagramType;
-
-	/**
-	 * Creates an instance of DiagramEditorInput for activity diagram
-	 * @param object
-	 * @deprecated use {@link #DiagramEditorInput(Object, Suppression, int)}
-	 */
-	public DiagramEditorInput(Object object, Suppression suppression) {
-		this(object, suppression, IDiagramManager.ACTIVITY_DIAGRAM);
-	}
-	
-	/**
-	 * 
-	 * @param object
-	 * @param suppression
-	 * @param diagramType
-	 *            can be one of the constants:
-	 *            {@link IDiagramManager#ACTIVITY_DIAGRAM},
-	 *            {@link IDiagramManager#ACTIVITY_DETAIL_DIAGRAM},
-	 *            {@link IDiagramManager#WORK_PRODUCT_DEPENDENCY_DIAGRAM}
-	 */
-	public DiagramEditorInput(Object object, Suppression suppression, int diagramType) {
-		methodElement = (MethodElement) TngUtil.unwrap(object);
-		if (object instanceof BreakdownElementWrapperItemProvider) {
-			wrapper = (BreakdownElementWrapperItemProvider) object;
-		}
-		this.suppression = suppression;
-		this.diagramType = diagramType;
-	}
-	
-	public int getDiagramType() {
-		return diagramType;
-	}
-
-	/**
-	 * @return Returns the suppression.
-	 */
-	public Suppression getSuppression() {
-		return suppression;
-	}
-
-	/**
-	 * @return Returns the wrapper.
-	 */
-	public BreakdownElementWrapperItemProvider getWrapper() {
-		return wrapper;
-	}
-
-	/**
-	 * @see org.eclipse.epf.authoring.ui.editors.MethodElementEditorInput#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (getClass().isInstance(obj)) {
-			DiagramEditorInput other = (DiagramEditorInput) obj;
-			return getMethodElement() == other.getMethodElement()
-					&& ((suppression == null && other.getSuppression() == null) || 
-							(suppression.getProcess() == other.getSuppression().getProcess()))
-					&& getDiagramType() == other.getDiagramType();
-		}
-		return false;
-	}
-	
-	@Override
-	public int hashCode() {
-		int result = getMethodElement().hashCode();
-		result ^= suppression.getProcess().hashCode();
-		result ^= getDiagramType();
-		return result;
-	}
-	
-	public DiagramEditorInput(MethodElement e) {
-		methodElement = e;
-	}
-
-	public MethodElement getMethodElement() {
-		return methodElement;
-	}
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#exists()
-	 */
-	public boolean exists() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return imageDescriptor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#getName()
-	 */
-	public String getName() {
-		return methodElement.getName();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#getPersistable()
-	 */
-	public IPersistableElement getPersistable() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramEditorInputProxy.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramEditorInputProxy.java
deleted file mode 100644
index 2e8f84d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramEditorInputProxy.java
+++ /dev/null
@@ -1,215 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.part;
-
-import java.io.InputStream;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.services.IDisposable;
-
-/**
- * @author Phong Nguyen Le
- * 
- * @since 1.2
- */
-public class DiagramEditorInputProxy extends DiagramFileEditorInputProxy implements IDisposable
-{
-	private static final boolean DEBUG = DiagramCorePlugin.getDefault().isDebugging();
-	
-	private Diagram diagram;
-
-	private PreferencesHint preferenceHint;
-
-	private boolean isNewDiagram;
-	
-	public DiagramEditorInputProxy(DiagramEditorInput input, PreferencesHint hint) {
-		super(input);
-		this.preferenceHint = hint;
-	}
-	
-	public void dispose() {
-		diagram = null;
-	}
-	
-	private Resource getResource() {
-		if(diagram == null || diagram.eResource() == null) {
-			Activity act = (Activity) getDiagramEditorInput().getMethodElement();
-			org.eclipse.epf.uma.Process process = TngUtil.getOwningProcess(act);
-			if(process != null) {
-				DiagramManager mgr = DiagramManager.getInstance(process, this);
-				try {
-					int diagramType = getDiagramEditorInput().getDiagramType();
-					List<Diagram> list = mgr.getDiagrams(act, diagramType);
-					if(list.isEmpty()) {
-						diagram = mgr.createDiagram(act, diagramType, preferenceHint);
-						isNewDiagram = diagram != null;
-					}
-					else {
-						diagram = (Diagram) list.get(0);
-					}
-				}
-				catch(Exception e) {
-					CommonPlugin.getDefault().getLogger().logError(e);
-					if(DEBUG) {
-						e.printStackTrace();
-					}
-				}
-				finally {
-					mgr.removeConsumer(this);
-				}
-			}
-		}
-		return diagram != null ? diagram.eResource() : null;
-	}
-	
-	public IFile getFile() {
-		Resource resource = getResource();
-		if(resource != null) {
-			return WorkspaceSynchronizer.getFile(resource);
-		}
-		return null;
-	}
-	
-	public IStorage getStorage() throws CoreException {
-		final Resource resource = getResource();
-		if(resource != null) {
-			return new org.eclipse.epf.diagram.core.resources.IDiagramStorage() {
-				private IFile file;
-				
-				private IFile getFile() {
-					if(file == null) {
-						file = DiagramEditorInputProxy.this.getFile();
-					}
-					return file;
-				}
-
-				public InputStream getContents() throws CoreException {
-					return null;
-				}
-
-				public IPath getFullPath() {
-					return getFile().getFullPath();
-				}
-
-				public String getName() {
-					return resource.getURI().toString();
-				}
-
-				public boolean isReadOnly() {
-					return getFile().isReadOnly();
-				}
-
-				public Object getAdapter(Class adapter) {
-					return getFile().getAdapter(adapter);
-				}
-
-				public Diagram getDiagram() {
-					return diagram;
-				}
-				
-			};
-		}
-		return null;
-	}
-	
-	public String getName() {
-		try {
-			return getDiagramEditorInput().getMethodElement().getName();
-		}
-		catch(NullPointerException e) {
-			return null;
-		}
-	}
-	
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-	
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.core.part.DiagramFileEditorInputProxy#exists()
-	 */
-	public boolean exists() {
-		// don't show this input in the list of recently open files
-		//
-		return false;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.core.part.DiagramFileEditorInputProxy#getPath()
-	 */
-	public IPath getPath() {
-		return getFile().getLocation();
-	}
-	
-	public Object getAdapter(Class adapter) {
-		IFile file = getFile();
-		if(file != null) {
-			if(adapter == IFile.class) {
-				return file;
-			}
-			else {
-				return file.getAdapter(adapter);
-			}
-		}
-		return null;
-	}	
-	
-	@Override
-	public boolean equals(Object obj) {
-		if(obj == this) {
-			return true;
-		}
-		if(obj instanceof DiagramEditorInputProxy) {
-			return getDiagramEditorInput().equals(((DiagramEditorInputProxy)obj).getDiagramEditorInput());
-		}
-		return false;
-	}
-	
-	@Override
-	public int hashCode() {
-		return getDiagramEditorInput().hashCode();
-	}
-	
-	public PreferencesHint getPreferenceHint() {
-		return preferenceHint;
-	}
-	
-	public boolean isNewDiagram() {
-		return isNewDiagram;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramFileEditorInputProxy.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramFileEditorInputProxy.java
deleted file mode 100644
index caa71e9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/DiagramFileEditorInputProxy.java
+++ /dev/null
@@ -1,154 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.part;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInputFactory;
-
-/**
- * @author Shashidhar Kannoori
- *
- */
-public class DiagramFileEditorInputProxy implements
-		IDiagramFileEditorInputProxy {
-
-	private DiagramEditorInput diagramEditorInput;
-    private IFile file;
-    private TransactionalEditingDomain domain;
-
-	protected DiagramFileEditorInputProxy(DiagramEditorInput input) {
-		this.diagramEditorInput = input;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.core.part.IDiagramFileEditorInputProxy#getDiagramEditorInput()
-	 */
-	public DiagramEditorInput getDiagramEditorInput() {
-		return diagramEditorInput;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.MEditingDomainElement#getEditingDomain()
-	 */
-	public TransactionalEditingDomain getEditingDomain() {
-		// TODO Auto-generated method stub
-		return domain;
-	}
-
-	/* (non-Javadoc)
-     * Method declared on IEditorInput.
-     */
-    public boolean exists() {
-        return file.exists();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IAdaptable.
-     */
-    public Object getAdapter(Class adapter) {
-        if (adapter == IFile.class) {
-			return file;
-		}
-        return file.getAdapter(adapter);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IPersistableElement.
-     */
-    public String getFactoryId() {
-        return FileEditorInputFactory.getFactoryId();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IDiagramFileEditorInput.
-     */
-    public IFile getFile() {
-        return file;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IEditorInput.
-     */
-    public ImageDescriptor getImageDescriptor() {
-        IContentType contentType = IDE.getContentType(file);
-		return PlatformUI.getWorkbench().getEditorRegistry()
-                .getImageDescriptor(file.getName(), contentType);
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IEditorInput.
-     */
-    public String getName() {
-        return file.getName();
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IEditorInput.
-     */
-    public IPersistableElement getPersistable() {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IStorageEditorInput.
-     */
-    public IStorage getStorage() throws CoreException {
-        return file;
-    }
-
-    /* (non-Javadoc)
-     * Method declared on IEditorInput.
-     */
-    public String getToolTipText() {
-        return diagramEditorInput.getMethodElement().getName();
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPersistable#saveState(org.eclipse.ui.IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		// TODO Auto-generated method stub
-
-	}
-	public void setTransactionalEditingDomain(TransactionalEditingDomain domain){
-		this.domain = domain;
-	}
-
-	   /* (non-Javadoc)
-     * Method declared on IPathEditorInput
-     * @since 3.0
-     * @issue consider using an internal adapter for IPathEditorInput rather than adding this as API
-     */
-    public IPath getPath() {
-        return file.getLocation();
-    }
-    
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    public String toString() {
-        return getClass().getName() + "(" + getFile().getFullPath() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/IDiagramEditorInputProvider.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/IDiagramEditorInputProvider.java
deleted file mode 100644
index 6157e97..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/IDiagramEditorInputProvider.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.part;
-
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public interface IDiagramEditorInputProvider {
-	DiagramEditorInput getDiagramEditorInput();
-	IEditorPart getEditor();
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/IDiagramFileEditorInputProxy.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/IDiagramFileEditorInputProxy.java
deleted file mode 100644
index fbb557a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/IDiagramFileEditorInputProxy.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.part;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.MEditingDomainElement;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPathEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * @author Shashidhar Kannoori
- *
- */
-public interface IDiagramFileEditorInputProxy extends MEditingDomainElement,
-		IFileEditorInput, IPathEditorInput, IPersistableElement {
-	
-	public DiagramEditorInput getDiagramEditorInput();
-	
-	public void setTransactionalEditingDomain(TransactionalEditingDomain domain);
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/util/DiagramEditorUtil.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/util/DiagramEditorUtil.java
deleted file mode 100644
index a92f648..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/part/util/DiagramEditorUtil.java
+++ /dev/null
@@ -1,901 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.part.util;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.emf.workspace.AbstractEMFOperation;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.bridge.ActivityDiagramAdapter;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.core.bridge.NodeAdapter;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.DiagramFileEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.IDiagramEditorInputProvider;
-import org.eclipse.epf.diagram.core.part.IDiagramFileEditorInputProxy;
-import org.eclipse.epf.diagram.core.providers.SharedResourceDiagramDocumentProvider;
-import org.eclipse.epf.diagram.core.resources.IDiagramStorage;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.impl.DiagramImpl;
-import org.eclipse.epf.diagram.model.impl.NodeImpl;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gmf.runtime.common.core.util.StringStatics;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * @author Phong Nguyen Le
- * @author skannoor
- * @since 1.2
- */
-public class DiagramEditorUtil {
-	private static final String AD_EDITOR_ID = "org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorID"; //$NON-NLS-1$
-	private static final String ADD_EDITOR_ID = "org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorID"; //$NON-NLS-1$
-	private static final String WPDD_EDITOR_ID = "org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID"; //$NON-NLS-1$
-
-	public static String getEditorId(int diagramType) {
-		switch(diagramType) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return AD_EDITOR_ID;
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return ADD_EDITOR_ID;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return WPDD_EDITOR_ID;
-		}
-		return null;
-	}
-
-	public static IEditorPart openDiagramEditor(IWorkbenchPage page, DiagramEditorInput input, PreferencesHint hint, IProgressMonitor progressMonitor) {
-		DiagramEditorInputProxy inputProxy = new DiagramEditorInputProxy(input, hint);
-
-		IEditorPart editorPart = null;
-		try {
-			editorPart = page.openEditor(inputProxy, getEditorId(input.getDiagramType()), true);
-		} catch (Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-		}
-
-		if(editorPart instanceof AbstractDiagramEditor){
-			if(input.getDiagramType() == IDiagramManager.ACTIVITY_DETAIL_DIAGRAM) {
-				AbstractDiagramEditor editor = ((AbstractDiagramEditor)editorPart);
-				editor.resetLayout();
-				// TODO: has to call resetLayout twice here so it can layout properly
-				// need to improve this method
-				//
-				editor.resetLayout();
-			}
-			
-			IDocumentProvider docProvider = ((DiagramDocumentEditor)editorPart).getDocumentProvider();
-
-			// set the document as savable if the diagram is new
-			//
-			org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess(input.getMethodElement());
-			if(proc != null) {
-				DiagramManager mgr = null;
-				Object consumer = new Object();
-				try {
-					mgr = DiagramManager.getInstance(proc, consumer);
-					if(mgr != null && inputProxy.isNewDiagram()) {
-						docProvider.setCanSaveDocument(inputProxy);
-					}
-				}
-				finally {
-					if(mgr != null) {
-						mgr.removeConsumer(consumer);
-					}
-				}
-			}
-
-			// initialization might have made the document dirty
-			// this will clear dirty flag of the editor
-			//
-			if (docProvider instanceof SharedResourceDiagramDocumentProvider
-					&& editorPart.isDirty()
-					&& !inputProxy.isNewDiagram()) {
-				((SharedResourceDiagramDocumentProvider) docProvider)
-				.markDocumentAsSaved(inputProxy);
-			}			
-
-			// Check whether diagram is read-only and plug-in is locked. 
-			//
-			if(!isModifiable(inputProxy)){
-				((SharedResourceDiagramDocumentProvider)((AbstractDiagramEditor)editorPart).getDocumentProvider()).lock(true);
-				DiagramEditPart editPart = ((IDiagramWorkbenchPart)editorPart).getDiagramEditPart();
-				editPart.disableEditMode();
-			}
-		}
-		return editorPart;
-	}
-	
-	public static void refreshVisual(DiagramEditPart editPart) {
-		// refresh labels
-		//
-		Iterator<Object> iter = new AbstractTreeIterator<Object>(editPart, false) {
-
-			/**
-			 * 
-			 */
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected Iterator<?> getChildren(Object object) {
-				if(object instanceof EditPart) {
-					return ((EditPart)object).getChildren().iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-			
-		};
-		while(iter.hasNext()) {
-			Object child = iter.next();
-			if(child instanceof ITextAwareEditPart || child instanceof ConnectionNodeEditPart) {
-				((EditPart)child).refresh();
-			}
-		}
-
-		// refresh connections
-		//
-		for (Iterator iterator = editPart.getConnections().iterator(); iterator.hasNext();) {
-			ConnectionEditPart conn = (ConnectionEditPart) iterator.next();
-			conn.refresh();
-		}
-	}
-	
-	public static void refreshLabels(DiagramEditPart editPart) {
-//		// make sure that the edit part figure is large enough to show the icon and all the text
-//		//
-//		for (Iterator iterator = editPart.getChildren().iterator(); iterator.hasNext();) {
-//			Object child = (Object) iterator.next();
-//			if(child instanceof GraphicalEditPart) {
-//				IFigure f = ((GraphicalEditPart)child).getFigure();
-//				if(f instanceof DefaultSizeNodeFigure) {
-//					Object f2 = ((DefaultSizeNodeFigure)f).getChildren().get(0);
-//				if(f2 instanceof RectangleFigure) {
-//					RectangleFigure figure = (RectangleFigure) f2;
-//					List children = ((RectangleFigure)figure).getChildren();
-//					if(!children.isEmpty()) {
-//						Object l = children.get(0);
-//						if(l instanceof WrapLabel) {
-//							WrapLabel label = ((WrapLabel)l);
-//							Rectangle r = figure.getBounds();
-//							Dimension d = figure.getPreferredSize();
-//							Rectangle textR = label.getTextBounds();							
-//////							textR.width += (textR.width * WidenedWrapLabel.DELTA_FACTOR);
-////							textR.width += 20;
-////							if(r.width < d.width || r.height < d.height) {
-////								WrapLabel label = ((WrapLabel)l);
-////								label.invalidate();
-////								figure.setBounds(r.union(textR));	
-//////								System.out.println(label.getSubStringText());
-////							}
-////							if("Design the Solution".equals(label.getText())) {		
-//								System.out.println("Text: '" + label.getText() + "'");
-//								System.out.println("Label font: " + label.getFont());
-//								System.out.println("Default font: " + DiagramConstants.DEFAULT_FONT);
-//								System.out.println("Calculated text size: " + DiagramCoreUtil.getTextSizeInWrapLabel(label.getText(), null, r.width, r.height, null));
-//								System.out.println("Current text width: " + textR.width);
-//								System.out.println("Node width: " + r.width);
-////							}
-//						}
-//					}
-//				}
-//				}
-//			}			
-//		}
-		
-		Iterator iter = new AbstractTreeIterator(editPart, false) {
-
-			@Override
-			protected Iterator getChildren(Object object) {
-				if(object instanceof EditPart) {
-					return ((EditPart)object).getChildren().iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-			
-		};
-		while(iter.hasNext()) {
-			Object child = iter.next();
-			if(child instanceof ITextAwareEditPart) {
-				((ITextAwareEditPart)child).refresh();
-			}
-		}
-	}
-	
-	private static Diagram getDiagram(DiagramEditorInputProxy inputProxy) throws CoreException {
-		IStorage storage = inputProxy.getStorage();
-		return storage instanceof IDiagramStorage ? ((IDiagramStorage)storage).getDiagram() : null;
-	}
-	
-	private static boolean doInitialize(
-			final DiagramEditorInputProxy inputProxy,
-			IProgressMonitor monitor) throws CoreException {
-		final Diagram model = getDiagram(inputProxy);
-		if(model == null) {
-			return false;
-		}
-		if(DiagramManager.AD_kind.equals(model.getType())) {
-			ActivityDiagramAdapter adapter = (ActivityDiagramAdapter) BridgeHelper.getNodeAdapter(model.getElement());
-			if(adapter == null) {
-				adapter = new ActivityDiagramAdapter(
-								(Activity) inputProxy
-										.getDiagramEditorInput().getMethodElement());
-				adapter
-						.setEditingDomain((InternalTransactionalEditingDomain) TransactionUtil
-								.getEditingDomain(model));
-				adapter.setSuppression(inputProxy
-						.getDiagramEditorInput().getSuppression());
-				adapter.setView(model);
-				model.getElement().eAdapters().add(adapter);
-			}
-			adapter.populateDiagram();
-			return true;
-		}
-		else if(DiagramManager.ADD_kind.equals(model.getType())
-				|| DiagramManager.WPD_kind.equals(model.getType())) {
-			TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(model);
-			AbstractEMFOperation op = new AbstractEMFOperation(domain, StringStatics.BLANK) {
-			
-				@Override
-				protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info)
-						throws ExecutionException {
-					org.eclipse.epf.diagram.model.Diagram d = 
-						(org.eclipse.epf.diagram.model.Diagram) model.getElement();
-					DiagramEditorInput input = inputProxy.getDiagramEditorInput();
-					d.setSuppression(input.getSuppression());
-					d.setLinkedElement(input.getMethodElement());
-					d.setObject(d.getLinkedElement());
-
-					return Status.OK_STATUS;
-				}
-			
-			};
-			try {
-				op.execute(monitor, null);
-				return true;
-			} catch (ExecutionException e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			}
-		} 
-		return false;
-	}
-	
-	public static void initializeOnActivate(DiagramEditPart editPart) {
-		if(editPart.getViewer() instanceof IDiagramEditorInputProvider) {
-			IEditorPart editor = ((IDiagramEditorInputProvider)editPart.getViewer()).getEditor();
-			if(editor != null && editor.getEditorInput() instanceof DiagramEditorInputProxy) {
-				DiagramEditorInputProxy inputProxy = (DiagramEditorInputProxy) editor.getEditorInput();
-				IProgressMonitor monitor = new NullProgressMonitor();
-				try {
-					if(doInitialize(inputProxy, monitor)) {
-						doRefresh(editPart, monitor, false);
-						refreshVisual(editPart);
-					}
-				} catch (CoreException e) {
-					DiagramCorePlugin.getDefault().getLogger().logError(e);
-				}
-				
-			}
-		}
-	}
-
-	public static void initialize(final DiagramEditPart editPart, final DiagramEditorInputProxy inputProxy, IProgressMonitor monitor) {		
-		try {
-			if(doInitialize(inputProxy, monitor)) {
-				refresh(editPart, monitor);
-				refreshLabels(editPart);
-			}
-		} catch (CoreException e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-	}
-	private static void updateEdges(View view){
-		boolean allVisible = false;
-		for (Iterator iter = view.getChildren().iterator(); iter.hasNext();) {
-			View child = (View) iter.next();
-			if(child.getElement() instanceof NodeImpl) {
-				NodeImpl node = (NodeImpl)child.getElement();
-				if(!node.isVisible()){
-					setEdgeVisibility(view, node.isVisible());
-				}else{
-					child.setVisible(node.isVisible());
-					setEdgeVisibility(child, true);
-				}
-				if(node instanceof NamedNode) {
-					FontStyle style = (FontStyle) child.getStyle(NotationPackage.Literals.FONT_STYLE);
-					if(style == null) {
-						style = (FontStyle) child.createStyle(NotationPackage.Literals.FONT_STYLE);
-					}
-				}
-				if(child.isVisible() && child.getElement() instanceof NodeContainer) {
-					updateEdges(child);
-				}
-				if(node.isVisible()){
-					allVisible = true;
-				}
-			}
-		}
-		if(view.getElement() instanceof NodeContainer 
-				&& !(view.getElement() instanceof ActivityDetailDiagram)
-				&& !(view.getElement() instanceof WorkProductDependencyDiagram)){
-			setEdgeVisibility(view, allVisible);
-		}
-		
-	}
-	
-	private static void setEdgeVisibility(View view, boolean visibility){
-		Diagram diagram = view.getDiagram();
-		for (Iterator iterator = diagram.getEdges().iterator(); iterator
-				.hasNext();) {
-			Edge edge = (Edge) iterator.next();
-			if(edge.getSource() == view || edge.getTarget() == view){
-				if(visibility){
-					view.setVisible(true);
-				}
-				edge.setVisible(visibility);
-			}
-		}
-	}
-	
-	private static void updateView(View view) {
-		boolean allVisible = false;
-		for (Iterator iter = view.getChildren().iterator(); iter.hasNext();) {
-			View child = (View) iter.next();
-			if(child.getElement() instanceof NodeImpl) {
-				NodeImpl node = (NodeImpl)child.getElement();
-				child.setVisible(node.isVisible());
-				if(node instanceof NamedNode) {
-					FontStyle style = (FontStyle) child.getStyle(NotationPackage.Literals.FONT_STYLE);
-					if(style == null) {
-						style = (FontStyle) child.createStyle(NotationPackage.Literals.FONT_STYLE);
-					}
-				}
-				if(child.isVisible() && child.getElement() instanceof NodeContainer) {
-					updateView(child);
-				}
-				if(node.isVisible()){
-					allVisible = true;
-				}
-			}
-		}
-		
-		if(view.getElement() instanceof NodeContainer 
-				&& !(view.getElement() instanceof ActivityDetailDiagram)
-				&& !(view.getElement() instanceof WorkProductDependencyDiagram)) {
-//			if(!allVisible) {
-//				System.out.println();
-//			}
-			view.setVisible(allVisible);
-		}
-	}
-	
-	public static boolean isInherited(EditPart editPart) {
-		EditPartViewer viewer = editPart.getViewer();
-		if(viewer instanceof IDiagramEditorInputProvider) {
-			DiagramEditorInput input = ((IDiagramEditorInputProvider)viewer).getDiagramEditorInput();
-			return isInherited(input);
-		}
-		return false;
-	}
-	
-	private static boolean isInherited(DiagramEditorInput input) {
-		return input != null && input.getWrapper() != null
-				&& input.getWrapper().isInherited();
-	}
-	
-	private static Collection getSemanticChildren(DiagramEditPart editPart) {
-		EditPartViewer viewer = editPart.getViewer();
-		if(viewer instanceof IDiagramEditorInputProvider) {
-			DiagramEditorInput input = ((IDiagramEditorInputProvider)viewer).getDiagramEditorInput();
-			if(input != null && input.getWrapper() != null &&
-					input.getWrapper().isInherited()) {
-				Object model = editPart.getModel();
-				if(model instanceof View) {
-					Collection children = null;
-					Diagram diagram = editPart.getDiagramView();
-					String type = diagram.getType();
-					if(DiagramManager.AD_kind.equals(type)) {
-						DiagramAdapter da = ((DiagramAdapter)BridgeHelper.getNodeAdapter(diagram.getElement()));
-						if(da != null) {
-							BreakdownElementWrapperItemProvider wrapper = input.getWrapper();
-							if(TngUtil.getBestAdapterFactory(wrapper.getAdapterFactory()) != TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory()) {
-								List wrappers = ProcessUtil.getWrappers(wrapper, new AdapterFactory[] {
-										TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory()});
-								wrapper = (BreakdownElementWrapperItemProvider) wrappers.get(0);
-							}
-							ActivityDiagramAdapter adapter = null;
-							try {
-								adapter = new ActivityDiagramAdapter(wrapper);
-								adapter.setFilter(da.getFilter());
-								adapter.setSuppression(Suppression.getSuppression(TngUtil.getOwningProcess(wrapper)));
-								children = adapter.getChildren();
-							}
-							finally {
-								if(adapter != null) {
-									adapter.dispose();
-								}
-							}
-						}
-					}
-					else if(DiagramManager.ADD_kind.equals(type) || DiagramManager.WPD_kind.equals(type)) {
-						DiagramImpl d;
-						if(DiagramManager.ADD_kind.equals(type)) {
-							d = (DiagramImpl) ModelFactory.eINSTANCE.createActivityDetailDiagram();
-						}
-						else {
-							d = (DiagramImpl) ModelFactory.eINSTANCE.createWorkProductDependencyDiagram();
-						}						
-						DiagramImpl diagramInUse = ((DiagramImpl)diagram.getElement());
-						Suppression suppression = diagramInUse.getSuppression();
-						if(suppression != null) {
-							d.setWrapper(input.getWrapper());
-							d.setFilter(diagramInUse.getFilter());
-							d.setSuppression(diagramInUse.getSuppression());
-							children = d.getChildren();
-						}
-					}
-					return children;
-				}
-			}
-		}
-		return null;
-	}
-	
-	public static void refreshConnections(DiagramEditPart editPart) {
-		Diagram diagram = editPart.getDiagramView();
-		for (Iterator iter = diagram.getEdges().iterator(); iter.hasNext();) {
-			Edge edge = (Edge) iter.next();
-			boolean visible = edge.getSource() != null && edge.getSource().isVisible()
-				&& edge.getTarget() != null && edge.getTarget().isVisible();
-			if(edge.isVisible() != visible) {
-				edge.setVisible(visible);
-			}
-		};
-		
-	}
-	
-	private static void refreshChildren(DiagramEditPart editPart) {
-		Collection semanticChildren = getSemanticChildren(editPart);
-		if(semanticChildren != null) {
-			refreshChildren(editPart, semanticChildren);
-			refreshConnections(editPart);
-		}
-	}
-	
-	
-	public static void filterChildren(EditPart editPart, Collection children) {
-		DiagramEditPart diagramEditPart = DiagramCoreUtil.getDiagramEditPart(editPart);
-		Collection semanticChildren = getSemanticChildren(diagramEditPart);
-		if(semanticChildren == null) {
-			children.clear();
-		}
-		else {
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				 EObject child = (EObject) iter.next();
-				 MethodElement e = BridgeHelper.getMethodElement(child);
-				 if(getWrapper(e, semanticChildren) == null) {
-					 iter.remove();
-				 }
-			}
-		}
-	}
-	
-	private static Object getWrapper(MethodElement e, Collection semanticChildren) {
-		for (Iterator iterator = semanticChildren.iterator(); iterator.hasNext();) {
-			Object c = (Object) iterator.next();
-			if(TngUtil.unwrap(c) == e) {
-				return c;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Refreshes edit part of an inherited element.
-	 * 
-	 * @param editPart
-	 */
-	private static void refreshChildren(EditPart editPart, Collection semanticChildren) {		
-		// special handling for edit part of RoleTaskComposite that should not be shown if
-		// none of its tasks are visible
-		//
-		boolean isRoleTaskComposite = false;
-		boolean hasTask = false;
-		Object model = editPart.getModel();
-		if(model instanceof View && ((View)model).getElement() instanceof RoleTaskComposite) {
-			isRoleTaskComposite = true;
-		}
-		
-		for (Iterator<?> iter = editPart.getChildren().iterator(); iter
-		.hasNext();) {
-			Object child = (Object) iter.next();
-			if(child instanceof EditPart) {
-				boolean refreshChildren = true;
-				EditPart childEditPart = ((EditPart)child);
-				Object m = childEditPart.getModel();
-				if(m instanceof View) {
-					View v = (View) m;
-					MethodElement e = BridgeHelper.getMethodElement(v);
-					if(e != null) {
-						Object object = getWrapper(e, semanticChildren);
-						boolean visible = object != null;
-						if(v.isVisible() != visible) {
-							v.setVisible(visible);
-						}
-						if(!visible) {
-							refreshChildren = false;
-						}
-						else if(isRoleTaskComposite && !hasTask && e instanceof TaskDescriptor) {
-							hasTask = true;
-						}
-					}
-					else {
-						// this is a non-UMA node like control node, text node, figure...
-						// 
-					}
-				}
-				if(refreshChildren) {
-					refreshChildren(childEditPart, semanticChildren);
-				}
-			}
-		}
-		
-		if(isRoleTaskComposite && !hasTask) {
-			((View)editPart.getModel()).setVisible(false);
-		}
-	}
-	
-	public static void doRefresh(final DiagramEditPart editPart, IProgressMonitor monitor, final boolean refreshData) {
-		final boolean isInherited = isInherited(editPart);
-		final Diagram diagram = (Diagram) editPart.getModel();
-		if(diagram.getElement() instanceof org.eclipse.epf.diagram.model.Diagram) {
-			TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(diagram);
-			AbstractEMFOperation op = new AbstractEMFOperation(domain, StringStatics.BLANK) {
-				@Override
-				protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info)
-				throws ExecutionException {
-					if(refreshData) {
-						// refresh the data
-						//
-						org.eclipse.epf.diagram.model.Diagram d = (org.eclipse.epf.diagram.model.Diagram) diagram.getElement();
-						d.setObject(d.getLinkedElement());
-					}
-					
-					// show/hide nodes according updated data
-					//
-					if(isInherited) {
-						refreshChildren(editPart);
-					}
-					else {
-						updateEdges(diagram);
-						updateView(diagram);
-					}
-					
-					return Status.OK_STATUS;
-				}	
-
-			};
-			try {
-				op.execute(monitor, null);				
-			} catch (ExecutionException e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			}		
-		}
-		else {
-			NodeAdapter adapter = BridgeHelper.getNodeAdapter(diagram.getElement());
-			if(adapter instanceof DiagramAdapter) {
-				if(refreshData) {
-					((DiagramAdapter)adapter).populateDiagram();
-				}
-				if(isInherited) {
-					try {
-						new AbstractEMFOperation(TransactionUtil.getEditingDomain(diagram), StringStatics.BLANK) {
-
-							@Override
-							protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-								refreshChildren(editPart);
-								return Status.OK_STATUS;
-							}
-							
-						}.execute(monitor, null);
-					} catch (ExecutionException e) {
-						DiagramCorePlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-	
-	public static void refresh(final DiagramEditPart editPart, IProgressMonitor monitor) {
-		IDiagramEditorInputProvider p = ((IDiagramEditorInputProvider)editPart.getViewer()); 
-		boolean wasDirty = p.getEditor() != null ? p.getEditor().isDirty() : false;
-		boolean wasBaseDirty = false;
-		IEditorPart baseEditor = null;
-		final boolean isInherited = isInherited(editPart);
-		if(isInherited) {
-			MethodElement element = BridgeHelper.getMethodElement(editPart.getDiagramView());
-			String type = editPart.getDiagramView().getType();
-			
-			if(p.getEditor() != null) {
-				// try to find the dirty flag of base diagram editor
-				//
-				IEditorReference[] editorRefs = p.getEditor().getSite().getPage().getEditorReferences();
-				for (int i = 0; i < editorRefs.length; i++) {
-					IEditorReference ref = editorRefs[i];
-					try {
-						if(ref.getEditorInput() instanceof IDiagramFileEditorInputProxy) {
-							DiagramEditorInput input = ((IDiagramFileEditorInputProxy)ref.getEditorInput()).getDiagramEditorInput();
-							if(input.getWrapper() == null && input.getMethodElement() == element &&
-									DiagramManager.getDiagramType(type) == input.getDiagramType()) {
-								IEditorPart editor = ref.getEditor(false);
-								if(editor != null) {
-									wasBaseDirty = editor.isDirty();
-									baseEditor = editor;
-									break;
-								}
-							}
-						}
-					} catch (PartInitException e) {
-						DiagramCorePlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-		
-		doRefresh(editPart, monitor, true);
-		
-		// editors can become dirty after refresh
-		// clear dirty flag
-		//
-		if(!wasDirty && p.getEditor() != null && p.getEditor().isDirty()) {
-			((SharedResourceDiagramDocumentProvider)((DiagramDocumentEditor)p.getEditor()).getDocumentProvider())
-				.markDocumentAsSaved((IFileEditorInput) p.getEditor().getEditorInput());
-		}
-		if(baseEditor != null && !wasBaseDirty) {
-			((SharedResourceDiagramDocumentProvider)((DiagramDocumentEditor)baseEditor).getDocumentProvider())
-				.markDocumentAsSaved((IFileEditorInput) baseEditor.getEditorInput());
-		}
-	}
-	
-	public static void refresh(final DiagramEditPart editPart, IProgressMonitor monitor, boolean isinherited){
-		
-		final boolean isInherited = isInherited(editPart);
-		final Diagram diagram = (Diagram) editPart.getModel();
-		if(diagram.getElement() instanceof org.eclipse.epf.diagram.model.Diagram) {
-			try {
-				TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(diagram);
-				TxUtil.runInTransaction(diagram.getElement(), new Runnable() {
-
-					public void run() {
-						// refresh the data
-						//
-						org.eclipse.epf.diagram.model.Diagram d = (org.eclipse.epf.diagram.model.Diagram) diagram.getElement();
-						d.setObject(d.getLinkedElement());
-					}
-					
-				});
-				
-				TxUtil.runInTransaction(domain, new Runnable() {
-
-					public void run() {
-						// show/hide nodes according updated data
-						//
-						if(isInherited) {
-							refreshChildren(editPart);
-						}
-						else {
-							updateEdges(diagram);
-							updateView(diagram);
-						}
-					}
-					
-				});
-			} catch (Exception e) {
-				DiagramCorePlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		else {
-			NodeAdapter adapter = BridgeHelper.getNodeAdapter(diagram.getElement());
-			if(adapter instanceof DiagramAdapter) {
-				((DiagramAdapter)adapter).populateDiagram();
-				if(isInherited) {
-					try {
-						new AbstractEMFOperation(TransactionUtil.getEditingDomain(diagram), StringStatics.BLANK) {
-
-							@Override
-							protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-								refreshChildren(editPart);
-								return Status.OK_STATUS;
-							}
-							
-						}.execute(monitor, null);
-					} catch (ExecutionException e) {
-						DiagramCorePlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-	
-	public static void resetEditor(AbstractDiagramEditor editor){
-		if(editor.isEditable()){
-			DiagramEditPart editPart =editor.getDiagramEditPart();
-			IEditorInput input = editor.getEditorInput();
-			if(input instanceof DiagramEditorInputProxy ){
-				initialize(editPart, (DiagramEditorInputProxy)input, 
-						new NullProgressMonitor());
-			}
-		}
-	}
-	
-	public static boolean isModifiable(Object element) {
-		if(element instanceof DiagramFileEditorInputProxy){
-				DiagramFileEditorInputProxy input = (DiagramFileEditorInputProxy)element;
-				if(input != null){
-					DiagramEditorInput dInput = input.getDiagramEditorInput();
-					if(dInput != null){
-						MethodElement e = dInput.getMethodElement();
-						// Check for plugin lock.
-						if(e != null){
-							if(TngUtil.isLocked(e)) 
-								return false;
-						}
-						// Check wrapper is readonly.
-						Object wrapper = dInput.getWrapper();
-						if(wrapper != null && ((BreakdownElementWrapperItemProvider)wrapper).isReadOnly()){
-							return false;
-						}
-					}
-				}
-			}
-		return true;
-	}
-	
-	/**
-	 * GMF and GEF is not handling connections visibility properly. 
-	 * This is work-around solution to handle connections visibility.  
-	 * Visibility of edges need to set first and then nodes. 
-	 * defect opened for this: 
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=184081
-	 */
-	public static void refreshConnectionEditParts(DiagramEditPart diagramEditPart) {
-
-		GraphicalViewer viewer = (GraphicalViewer)diagramEditPart.getViewer();
-		Diagram act = (Diagram)diagramEditPart.getModel();
-		List edges = act.getEdges();
-		for (Iterator iter = edges.iterator(); iter.hasNext();) {
-			Edge edge = (Edge) iter.next();
-			if(edge.isVisible()){
-				ConnectionEditPart part = (ConnectionEditPart)viewer.getEditPartRegistry().get(edge); 
-					
-				if(part != null){
-					if(part.getSource() == null){
-						for (Iterator iter1 = diagramEditPart.getChildren().iterator(); iter1.hasNext();) {
-							EditPart element = (EditPart) iter1.next();
-							Object model = element.getModel();
-							if(edge.getSource() == model){
-								if(element instanceof GraphicalEditPart){
-									if(((GraphicalEditPart)element).getFigure().isVisible()){
-										part.setSource(element);
-									}else{
-										part.setSource(null);
-									}
-								}
-							}
-						}
-					}
-					if(part.getTarget() == null){
-						for (Iterator iter1 = diagramEditPart.getChildren().iterator(); iter1.hasNext();) {
-							EditPart element = (EditPart) iter1.next();
-							Object model = element.getModel();
-							if(edge.getTarget() == model){
-								if(element instanceof GraphicalEditPart){
-									if(((GraphicalEditPart)element).getFigure().isVisible()){
-										part.setTarget(element);
-									}else{
-										part.setTarget(null);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		
-		try{
-		for (Iterator iter = edges.iterator(); iter.hasNext();) {
-			Edge edge = (Edge) iter.next();
-				org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart part = 
-					(org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart)viewer.getEditPartRegistry().get(edge); 
-				if(part != null && (part.getSource() == null || part.getTarget() == null)
-						&& part.getFigure() != null){
-					part.getFigure().setVisible(false);
-				    part.getFigure().revalidate();
-					part.deactivate();
-				}
-		}
-		}catch(Exception e){
-			if(DiagramCorePlugin.getDefault().isDebugging()){
-				DiagramCorePlugin.getDefault().getLogger().logError("Error occured while refresh the connection: "+ e); //$NON-NLS-1$
-				e.printStackTrace();
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/AccessibleDiagramModificationListener.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/AccessibleDiagramModificationListener.java
deleted file mode 100644
index 98e260c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/AccessibleDiagramModificationListener.java
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.providers;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.AbstractDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
-import org.eclipse.gmf.runtime.notation.Diagram;
-
-/**
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * 
- * @since 1.2
- */
-public class AccessibleDiagramModificationListener extends
-		DiagramModificationListener {
-
-	public AccessibleDiagramModificationListener(
-			AbstractDocumentProvider documentProvider, DiagramDocument document) {
-		super(documentProvider, document);
-	}
-
-	public Diagram getDiagram() {
-		DiagramDocument doc = getDiagramDocument();
-		return doc != null ? doc.getDiagram() : null;
-	}		
-
-	@Override
-	public void notifyChanged(Notification notification) {
-		if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-			Object feature = notification.getFeature();
-			if(feature instanceof EStructuralFeature && ((EStructuralFeature)feature).isTransient()) {
-				return;
-			}
-			Object notifier = notification.getNotifier();
-			if (notifier instanceof EObject
-					&& (UmaUtil.isContainedBy((EObject) notifier, getDiagram()) || UmaUtil
-							.isContainedBy((EObject) notifier, getDiagram()
-									.getElement()))) {
-				getDiagramDocument().setContent(
-						getDiagramDocument().getContent());
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/DiagramContextMenuProvider.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/DiagramContextMenuProvider.java
deleted file mode 100644
index da21c97..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/DiagramContextMenuProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.providers;
-
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Class to handle the popupmenu items 
- * @author Shashidhar Kannoori
- */
-public class DiagramContextMenuProvider extends
-		org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider {
-
-	/**
-	 * @param part
-	 * @param viewer
-	 */
-	public DiagramContextMenuProvider(IWorkbenchPart part, EditPartViewer viewer) {
-		super(part, viewer);
-	}
-	
-	@Override
-	public void menuAboutToShow(IMenuManager menu) {
-		super.menuAboutToShow(menu);
-		IContributionItem item =  find(ActionIds.ACTION_DELETE_FROM_DIAGRAM);
-		if(item != null)
-		item.setVisible(false);
-
-		IContributionItem item1=  find(ActionIds.ACTION_DELETE_FROM_MODEL);
-		if(item1 != null)
-		item1.setVisible(false);
-		
-		IContributionItem item2 = find(ActionIds.MENU_NAVIGATE);
-		if(item2 != null)
-		item2.setVisible(false);
-		
-		IContributionItem item3 = find(ActionFactory.PROPERTIES.getId());
-		if(item3 != null)
-		item3.setVisible(false);
-		
-		EditDomain domain = getViewer().getEditDomain();
-		if(domain instanceof DiagramEditDomain){
-			IEditorPart part=  ((DiagramEditDomain)domain).getEditorPart();
-			if(part instanceof AbstractDiagramEditor){
-				((AbstractDiagramEditor)part).contributeToContextMenu(menu);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/DiagramContributionItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/DiagramContributionItemProvider.java
deleted file mode 100644
index b6a8ca9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/DiagramContributionItemProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.providers;
-
-import org.eclipse.epf.diagram.core.actions.DelegateAction;
-import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * Core diagram contribution item provider. 
- * It provides contributions generic to EPF diagram editors
- * @author Shashidhar Kannoori
- *
- */
-public class DiagramContributionItemProvider
-		extends
-		org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContributionItemProvider {
-
-
-	@Override
-	protected IAction createAction(String actionId, IWorkbenchPartDescriptor partDescriptor) {
-		if(actionId.equals(ActionFactory.DELETE.getId())){
-			return new DelegateAction(partDescriptor.getPartPage());
-		}
-		return super.createAction(actionId, partDescriptor);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/SharedResourceDiagramDocumentProvider.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/SharedResourceDiagramDocumentProvider.java
deleted file mode 100644
index 67582f7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/providers/SharedResourceDiagramDocumentProvider.java
+++ /dev/null
@@ -1,489 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.providers;
-
-import java.util.Iterator;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.IDiagramFileEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.core.services.FileSynchronizer;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.gmf.runtime.common.core.util.Log;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.StorageDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.WorkspaceOperationRunner;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.EditorIDEPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.EditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.EditorStatusCodes;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IStorageEditorInput;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class SharedResourceDiagramDocumentProvider extends StorageDiagramDocumentProvider 
-{
-	private static class FileDiagramDocumentProviderEx extends FileDiagramDocumentProvider {
-		@Override
-		protected ISchedulingRule getSaveRule(Object element) {
-			if (element instanceof IFileEditorInput) {
-				IFileEditorInput input= (IFileEditorInput) element;
-				return computeSaveSchedulingRule(input.getFile());
-			}
-			return null;
-		}
-		
-		/**
-		 * Computes the scheduling rule needed to create or modify a resource. If
-		 * the resource exists, its modify rule is returned. If it does not, the
-		 * resource hierarchy is iterated towards the workspace root to find the
-		 * first parent of <code>toCreateOrModify</code> that exists. Then the
-		 * 'create' rule for the last non-existing resource is returned.
-		 *
-		 * @param toCreateOrModify the resource to create or modify
-		 * @return the minimal scheduling rule needed to modify or create a resource
-		 */
-		private ISchedulingRule computeSaveSchedulingRule(IResource toCreateOrModify) {
-			if (toCreateOrModify.exists() && toCreateOrModify.isSynchronized(IResource.DEPTH_ZERO))
-				return fResourceRuleFactory.refreshRule(toCreateOrModify);
-
-			IResource parent= toCreateOrModify;
-			do {
-				 /*
-				 * XXX This is a workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=67601
-				 * IResourceRuleFactory.createRule should iterate the hierarchy itself.
-				 */
-				toCreateOrModify= parent;
-				parent= toCreateOrModify.getParent();
-			} while (parent != null && !parent.exists() && !parent.isSynchronized(IResource.DEPTH_ZERO));
-
-			return fResourceRuleFactory.createRule(toCreateOrModify);
-		}
-		
-		@Override
-		protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
-			return super.getOperationRunner(monitor);
-		}
-	}
-	
-	private static final FileDiagramDocumentProviderEx fileDiagramDocumentProvider = new FileDiagramDocumentProviderEx();
-	
-	//a StorageInfo with a DiagramModificationListener 
-	private class DiagramStorageInfo extends StorageInfo {
-
-		DiagramModificationListener fListener;
-		public DiagramStorageInfo(IDocument document, DiagramModificationListener listener) {
-			super(document);
-			fListener = listener;
-		}
-		
-	}
-
-	private WorkspaceOperationRunner fOperationRunner;
-	private DiagramManager fDiagramMgr;
-	private boolean locked = false;
-
-	public SharedResourceDiagramDocumentProvider(DiagramManager diagramMgr) {
-		super();
-		fDiagramMgr = diagramMgr;
-	}
-	
-	@Override
-	protected boolean setDocumentContent(IDocument document, IEditorInput editorInput) throws CoreException {
-		if(document instanceof IDiagramDocument) {
-			((IDiagramDocument)document).setEditingDomain(fDiagramMgr.getEditingDomain());
-		}
-		return super.setDocumentContent(document, editorInput);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.StorageDiagramDocumentProvider#setDocumentContentFromStorage(org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument, org.eclipse.core.resources.IStorage)
-	 */
-	protected void setDocumentContentFromStorage(IDocument document, IStorage storage) throws CoreException {
-		Diagram diagram = (Diagram)document.getContent();
-		if(diagram != null) {
-			Resource resource = diagram.eResource();
-			IFile resourceFile = WorkspaceSynchronizer.getFile(resource);
-			// unload if the resourceFile and storage is same.
-			// if not same throw exception.
-			if(resourceFile != null) {
-				if(resourceFile.equals(storage)) {
-					document.setContent(null);
-				} else {
-					throw new CoreException(new Status(IStatus.ERROR, EditorIDEPlugin.getPluginId(), EditorStatusCodes.ERROR, EditorMessages.FileDocumentProvider_handleElementContentChanged, null));
-				}
-			}
-		}
-		document.setContent(((org.eclipse.epf.diagram.core.resources.IDiagramStorage)storage).getDiagram());
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.StorageDiagramDocumentProvider#disposeElementInfo(java.lang.Object, org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.AbstractDocumentProvider.ElementInfo)
-	 */
-	@Override
-	protected void disposeElementInfo(Object element, ElementInfo info) {
-		((DiagramStorageInfo)info).fListener.stopListening();
-	}
-
-	@Override
-	protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {
-		final Diagram diagram = (Diagram) document.getContent();
-		//TODO: handle case where user did not refresh diagram after diagram's resource has been reloaded
-		// diagram does not have a resource in this case
-		// if overwrite allowed, this diagram should replace the diagram in the reloaded resource.
-		//
-		Resource resource = diagram.eResource();
-		if (!overwrite) {
-			DiagramManager.checkSynchronizationState(resource);
-		}		
-		IStatus status = Services.getAccessController().checkModify(new Resource[] {resource}, MsgBox.getDefaultShell());
-		if(!status.isOK()) {
-			throw new CoreException(status);
-		}
-		
-		// inform about the upcoming content change
-		fireElementStateChanging(element);
-		
-		if(diagram.getElement() instanceof org.eclipse.epf.diagram.model.Diagram) {
-			try {
-				TxUtil.runInTransaction(diagram, new Runnable() {
-
-					public void run() {
-						diagram.persistChildren();
-						for (Object child : diagram.getChildren()) {
-							((View) child).persistChildren();
-						}
-					}
-					
-				});
-			} catch (ExecutionException e) {
-				DiagramCorePlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		
-		FailSafeMethodLibraryPersister persister = Services.getLibraryPersister(Services.XMI_PERSISTENCE_TYPE).getFailSafePersister();
-		try {
-//			resource.save(Collections.EMPTY_MAP);
-			persister.save(resource);
-			persister.commit();
-		} catch (Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-			
-			persister.rollback();
-			
-			// inform about failure
-			fireElementStateChangeFailed(element);
-			throw new CoreException(new Status(IStatus.ERROR, DiagramCorePlugin.PLUGIN_ID
-					, EditorStatusCodes.RESOURCE_FAILURE, e
-					.getLocalizedMessage(), null));
-		}
-		
-		try {
-			fDiagramMgr.removeDiagramBackup(getActivity((IEditorInput) element), diagram.getType());
-			if(DiagramManager.ADD_kind.equals(diagram.getType())
-					|| DiagramManager.WPD_kind.equals(diagram.getType())) {
-				org.eclipse.epf.diagram.model.Diagram d = (org.eclipse.epf.diagram.model.Diagram) diagram.getElement();
-				d.setNew(false);
-			}
-		} catch (RuntimeException x) {
-			// inform about failure
-			fireElementStateChangeFailed(element);
-			throw x;
-		}
-		
-		if(monitor != null) {
-			monitor.done();
-		}
-		
-		logResourceErrorsAndWarnings(resource);
-	}
-	
-	private static void logResourceErrorsAndWarnings(Resource resource) {
-		for (Iterator iter = resource.getErrors().iterator(); iter.hasNext();) {
-			Resource.Diagnostic diagnostic = (Resource.Diagnostic) iter.next();
-			Log.error(EditorPlugin.getInstance(), EditorStatusCodes.ERROR, diagnostic.getMessage());				
-		}
-
-		for (Iterator iter = resource.getWarnings().iterator(); iter.hasNext();) {
-			Resource.Diagnostic diagnostic = (Resource.Diagnostic) iter.next();
-			Log.warning(EditorPlugin.getInstance(), EditorStatusCodes.WARNING, diagnostic.getMessage());				
-		}
-	}
-
-	@Override
-	public long getModificationStamp(Object element) {
-		if (element instanceof IFileEditorInput) {
-			IFileEditorInput input= (IFileEditorInput) element;
-			return FileSynchronizer.computeModificationStamp(input.getFile());
-		}
-
-		return super.getModificationStamp(element);
-	}
-	
-	public void setContent(IEditorInput input) {
-		ElementInfo info = getElementInfo(input);
-		if (info == null)
-			return;
-
-		IDocument document = createEmptyDocument();
-		IStatus status = null;
-
-		try {
-			setDocumentContent(document, input);
-		} catch (CoreException x) {
-			status = x.getStatus();
-		}
-		
-		Object newContent= document.getContent();
-		
-		// set the new content and fire content related events
-		fireElementContentAboutToBeReplaced(input);
-
-		removeUnchangedElementListeners(input, info);
-
-		info.fDocument.removeDocumentListener(info);
-		info.fDocument.setContent(newContent);
-		info.fCanBeSaved = false;
-		info.fStatus = status;
-
-		addUnchangedElementListeners(input, info);
-
-		fireElementContentReplaced(input);
-	}
-		
-	/**
-	 * Updates the element info to a change of the file content and sends out
-	 * appropriate notifications.
-	 *
-	 * @param input the input of a document editor
-	 */
-	public void handleElementContentChanged(IEditorInput input) {
-		ElementInfo info = getElementInfo(input);
-		if (info == null)
-			return;
-
-		IDocument document= createEmptyDocument();
-		IStatus status= null;
-
-		try {
-			setDocumentContent(document, input);
-		} catch (CoreException x) {
-			status= x.getStatus();
-		}
-
-		Object newContent= document.getContent();
-
-		if ( !newContent.equals(info.fDocument.getContent())) {
-
-			// set the new content and fire content related events
-			fireElementContentAboutToBeReplaced(input);
-
-			removeUnchangedElementListeners(input, info);
-
-			info.fDocument.removeDocumentListener(info);
-			info.fDocument.setContent(newContent);
-			info.fCanBeSaved= false;
-			info.fStatus= status;
-
-			addUnchangedElementListeners(input, info);
-
-			fireElementContentReplaced(input);
-
-		} else {
-			
-			handleExistingDocumentSaved(input, info, status);
-
-		}
-	}
-
-	private void handleExistingDocumentSaved(IEditorInput input, ElementInfo info, IStatus status) {
-		removeUnchangedElementListeners(input, info);
-
-		// fires only the dirty state related event
-		info.fCanBeSaved= false;
-		info.fStatus= status;
-
-		addUnchangedElementListeners(input, info);
-
-		fireElementDirtyStateChanged(input, false);		
-	}
-
-	public void markDocumentAsSaved(IFileEditorInput input) {
-		ElementInfo info = getElementInfo(input);
-		if (info == null)
-			return;
-		handleExistingDocumentSaved(input, info, null);
-	}
-	
-	@Override
-	protected void doSynchronize(Object element, IProgressMonitor monitor) throws CoreException {
-		if(element instanceof IEditorInput) {
-			handleElementContentChanged((IEditorInput) element);
-			return;
-		}
-		super.doSynchronize(element, monitor);
-	}
-	
-	@Override
-	public boolean isSynchronized(Object element) {
-		ElementInfo info = getElementInfo(element);
-		if(info.fDocument instanceof IDiagramDocument) {
-			Diagram diagram = ((IDiagramDocument)info.fDocument).getDiagram();
-			if(diagram != null) {
-				Resource resource = diagram.eResource();
-				// a diagram that does not have a resource is considered as out-of-synch
-				// because its resource must have been reloaded.
-				//
-				return resource != null && DiagramManager.isSynchronized(resource);
-			}
-		}
-		return super.isSynchronized(element);
-	}
-
-	@Override
-	public ElementInfo createNewElementInfo(IDocument document) {
-		DiagramModificationListener listener = new AccessibleDiagramModificationListener(this, (DiagramDocument)document);
-		DiagramStorageInfo info = new DiagramStorageInfo(document, listener);
-		listener.startListening();
-		return info;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.editor.AbstractDocumentProvider#getOperationRunner(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
-		return fileDiagramDocumentProvider.getOperationRunner(monitor);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.ui.editor.AbstractDocumentProvider#getSaveRule(java.lang.Object)
-	 */
-	protected ISchedulingRule getSaveRule(Object element) {
-		return fileDiagramDocumentProvider.getSaveRule(element);
-	}
-
-	/**
-	 * Allows editing even the document is out of synch.
-	 * 
-	 * @param input
-	 */
-	public void allowEditing(IEditorInput input) {
-		ElementInfo info = getElementInfo(input);
-		if(info.fDocument instanceof IDiagramDocument) {
-			Diagram diagram = ((IDiagramDocument)info.fDocument).getDiagram();
-			if(diagram != null && diagram.eResource() == null 
-					&& input instanceof IDiagramFileEditorInputProxy) {
-				Activity act = getActivity(input);
-				if(act != null) {
-					fDiagramMgr.replaceTemporarily(act, diagram);
-				}
-			}
-		}
-	}
-	
-	private static Activity getActivity(IEditorInput input) {
-		return (Activity) ((IDiagramFileEditorInputProxy)input).getDiagramEditorInput().getMethodElement();
-	}
-
-	public void reverseToSaved(IEditorInput input) {
-		ElementInfo info = getElementInfo(input);
-		if(info.fDocument instanceof IDiagramDocument) {
-			Diagram diagram = ((IDiagramDocument)info.fDocument).getDiagram();
-			if(diagram != null && diagram.eResource() != null 
-					&& input instanceof DiagramEditorInputProxy) {
-				Activity act = getActivity(input);
-				if(act != null) {
-					fDiagramMgr.reverseToSaved(act, diagram, ((DiagramEditorInputProxy)input).getPreferenceHint());
-				}
-			}
-		}
-	}
-	
-	/**
-	 * If a plugin is locked, diagram editor and document provider
-	 * should be locked, this is done after loading the diagram editor
-	 * using this method.
-	 * @param lock
-	 */
-	public void lock(boolean lock){
-		locked =lock; 
-	}
-	
-	@Override
-	protected void updateCache(IStorageEditorInput input) throws CoreException {
-		super.updateCache(input);
-		StorageInfo info= (StorageInfo) getElementInfo(input);
-		if (info != null) {
-			if(locked && info.fIsModifiable)
-				info.fIsModifiable= !locked;
-		}
-	}
-	
-	/**
-	 * 
-	 * returns the locked state of plugin. 
-	 * locked state is  set using lock(boolean lock) method. 
-	 * @return
-	 */
-	public boolean getLockedState(){
-		return locked;
-	}
-	
-	@Override
-	public boolean isModifiable(Object element) {
-		if(!DiagramEditorUtil.isModifiable(element)) {
-			return false;
-		}
-		return super.isModifiable(element);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/resources/IDiagramStorage.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/resources/IDiagramStorage.java
deleted file mode 100644
index a9605c3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/resources/IDiagramStorage.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.resources;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.gmf.runtime.notation.Diagram;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public interface IDiagramStorage extends IStorage {
-	Diagram getDiagram();
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramHelper.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramHelper.java
deleted file mode 100644
index 23b516f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramHelper.java
+++ /dev/null
@@ -1,313 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.services;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.CopyCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class DiagramHelper {
-	
-	public static final int[] DIAGRAM_TYPES = { IDiagramManager.ACTIVITY_DIAGRAM,
-		IDiagramManager.ACTIVITY_DETAIL_DIAGRAM, IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM };
-
-	
-	public static int getDiagramType(Diagram diagram){
-		String typeStr = diagram.getType();
-		if(typeStr.equals(DiagramManager.AD_kind)){
-			return IDiagramManager.ACTIVITY_DIAGRAM;
-		}
-		if(typeStr.equals(DiagramManager.ADD_kind)){
-			return IDiagramManager.ACTIVITY_DETAIL_DIAGRAM;
-		}
-		if(typeStr.equals(DiagramManager.WPD_kind)){
-			return IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM;
-		}
-		return -1;
-	}
-	
-	public static Node findNode(Diagram diagram, Object object) {
-		if (object == null)
-			return null;
-		for (Iterator iter = diagram.getChildren().iterator(); iter.hasNext();) {
-			View view = (View) iter.next();			
-			if (view instanceof Node && view.getElement() != null) {
-				Object e = null;
-				if (object instanceof MethodElement && view.getElement() instanceof EModelElement) {
-					EModelElement modelElement = (EModelElement) view.getElement();
-					e = BridgeHelper.getMethodElement(modelElement);
-					if(e == null) {
-						// diagram is not open yet, try to resolve the element from URI stored in the node's annotation
-						//
-						Resource resource = ((MethodElement)object).eResource();
-						if(resource.getResourceSet() != null) {
-							e = BridgeHelper.getMethodElementFromAnnotation(modelElement, resource.getResourceSet());
-						}
-					}
-				} else {
-					e = view.getElement();
-				}
-				if (object.equals(e)) {
-					return (Node) view;
-				}
-			}
-		}
-		return null;
-	}
-	
-	public static Node findNodeInModelDiagram(Diagram diagram, MethodElement e){
-		for (Iterator iter = diagram.getChildren().iterator(); iter.hasNext();) {
-			View view = (View) iter.next();
-			if(view instanceof Node){
-				Object ex = null;
-				EObject model = view.getElement();
-				if(model instanceof org.eclipse.epf.diagram.model.Node){
-					ex = ((org.eclipse.epf.diagram.model.Node)model).getLinkedElement();
-					if(ex != null && ex == e){
-						return (Node)view;
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Deletes the diagram and saves immediately.
-	 * @param diagram
-	 * @throws Exception
-	 */
-	public static void deleteDiagram(final Diagram diagram, boolean save)
-			throws Exception {
-		if (diagram == null)
-			return;
-
-		boolean fileExist = true;
-		File file = null;
-		Object linkedObject = null;
-		Process process = null;
-		if (diagram.getElement() instanceof org.eclipse.uml2.uml.Activity) {
-			DiagramAdapter adapter = BridgeHelper.getDiagramAdapter(diagram
-					.getElement());
-			if (adapter != null) {
-				linkedObject = adapter.getWrapper();
-				if (linkedObject == null) {
-					linkedObject = adapter.getElement();
-				}
-			}
-		} else {
-			org.eclipse.epf.diagram.model.Diagram diagramModel = (org.eclipse.epf.diagram.model.Diagram) diagram
-					.getElement();
-			linkedObject = diagramModel.getLinkedElement();
-		}
-
-		if (linkedObject != null) {
-			process = TngUtil.getOwningProcess(linkedObject);
-			String filePath = DiagramManager.getDiagramFilePath(process);
-			file = new File(filePath);
-			if (!file.exists())
-				fileExist = false;
-		}
-		final Resource resource = diagram.eResource();
-		if (file == null && resource != null) {
-			file = new File(FileManager.toFileString(resource
-					.getURI()));
-			if (!file.exists())
-				fileExist = false;
-		}
-
-		if (resource != null) {
-			TxUtil.runInTransaction(diagram, new Runnable() {
-
-				public void run() {
-					resource.getContents().remove(diagram.getElement());
-					resource.getContents().remove(diagram);
-					UmaUtil.removeAllAdapters(diagram.getElement());
-					UmaUtil.removeAllAdapters(diagram);
-				}
-				
-			});
-			
-			if (!fileExist)
-				return;
-
-			if (save) {
-//				if (resource.getContents().isEmpty()) {
-//					if (file != null) {
-//						if (process != null
-//								&& DiagramManager.hasDiagramManager(process)) {
-//							Object consumer = new Object();
-//							DiagramManager mgr = DiagramManager.getInstance(
-//									process, consumer);
-//							mgr.dispose();
-//						}
-//						Services.getFileManager()
-//								.delete(file.getAbsolutePath());
-//					}
-//				}
-//				else {
-					FailSafeMethodLibraryPersister persister = Services
-							.getLibraryPersister(Services.XMI_PERSISTENCE_TYPE)
-							.getFailSafePersister();
-					try {
-						persister.save(resource);
-						persister.commit();
-					} catch (Exception e) {
-						CommonPlugin.getDefault().getLogger().logError(e);
-						persister.rollback();
-						throw new CoreException(new Status(IStatus.ERROR,
-								DiagramCorePlugin.PLUGIN_ID, 1, e
-										.getLocalizedMessage(), null));
-					}
-//				}
-			}
-		}
-	}
-	
-	/**
-	 * Convenient method to get editing domain
-	 * @return
-	 */
-	public static InternalTransactionalEditingDomain getEditingDomain(){
-		return (InternalTransactionalEditingDomain) DiagramEditingDomainFactory.getInstance()
-		.createEditingDomain();
-	}
-	
-	public static InternalTransactionalEditingDomain getEditingDomain(Diagram diagram){
-		if(diagram == null) return getEditingDomain();
-		Resource resource = diagram.eResource();
-		if(resource == null) return getEditingDomain();
-		return (InternalTransactionalEditingDomain)DiagramEditingDomainFactory.getInstance().getEditingDomain(resource.getResourceSet());
-	}
-	
-	/**
-	 * Gets all available diagrams of the specified activity.
-	 * 
-	 * @param act
-	 * @return
-	 */
-	public static Collection<Diagram> getDiagrams(Activity act, DiagramManager mgr) {
-		try {
-			ArrayList<Diagram> diagrams = new ArrayList<Diagram>();
-			for (int i = 0; i < DIAGRAM_TYPES.length; i++) {
-				List<Diagram> list = mgr.getDiagrams(act, DIAGRAM_TYPES[i]);
-				if (!list.isEmpty()) {
-					diagrams.addAll(list);
-				}
-			}
-			return diagrams;
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-			return Collections.emptyList();
-		}
-	}
-	
-	public static String getDiagramTypeString(Diagram diagram){
-		String typeStr = diagram.getType();
-		if(typeStr.equals(DiagramManager.AD_kind)){
-			return DiagramCoreResources.ActivityDiagram_kind;
-		}
-		if(typeStr.equals(DiagramManager.ADD_kind)){
-			return DiagramCoreResources.ActivityDetail_Diagram_kind;
-		}
-		if(typeStr.equals(DiagramManager.WPD_kind)){
-			return DiagramCoreResources.WorkProductDependency_Diagram_kind;
-		}
-		return "";  //$NON-NLS-1$
-	}
-	
-	public static Diagram copyDiagram(EditingDomain domain, Diagram diagram) {
-		ArrayList<Object> list = new ArrayList<Object>();
-		list.add(diagram.getElement());
-		list.add(diagram);
-		Command cmd = CopyCommand.create(domain, list);
-		cmd.execute();
-		for (Iterator<?> iter = cmd.getResult().iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if(element instanceof Diagram) {
-				Diagram copy = (Diagram) element;
-				return copy;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Reassociates activity nodes in the base diagram copy with corresponding
-	 * locally contributors or replacers if there is any.
-	 * 
-	 * @param activity
-	 * @param copyOfBaseDiagram
-	 */
-	public static void reassociate(Activity activity, Diagram copyOfBaseDiagram) {
-		for (Iterator iter = activity.getBreakdownElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Activity) {
-				VariabilityElement baseElement = ((Activity) element)
-						.getVariabilityBasedOnElement();
-				if (baseElement != null) {
-					Node node = DiagramHelper.findNode(copyOfBaseDiagram,
-							baseElement);
-					if (node != null) {
-						EObject umlObj = node.getElement();
-						BridgeHelper.addEAnnotation((EModelElement) umlObj,
-								(MethodElement) element);
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramManager.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramManager.java
deleted file mode 100644
index 9f630bc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramManager.java
+++ /dev/null
@@ -1,1267 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.services;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.internal.events.ResourceChangeEvent;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.emf.workspace.AbstractEMFOperation;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.providers.AccessibleDiagramModificationListener;
-import org.eclipse.epf.diagram.core.services.FileSynchronizer.FileInfo;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.impl.DiagramImpl;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceListener;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResource;
-import org.eclipse.epf.library.persistence.internal.IFailSafeSavable;
-import org.eclipse.epf.library.persistence.util.ExtendedResourceSet;
-import org.eclipse.epf.persistence.FailSafePersistenceHelper;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.MultiFileURIConverter;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.gmf.runtime.common.core.util.StringStatics;
-import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.util.DiagramIOUtil;
-import org.eclipse.gmf.runtime.emf.core.internal.util.EMFCoreConstants;
-import org.eclipse.gmf.runtime.emf.core.resources.GMFHelper;
-import org.eclipse.gmf.runtime.emf.core.resources.GMFResource;
-import org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.uml2.uml.UMLFactory;
-
-/**
- * @author Phong Nguyen Le
- * 
- * @since 1.2
- */
-public class DiagramManager {	
-	private static final boolean DEBUG = DiagramCorePlugin.getDefault().isDebugging();
-	
-	private static final String DIAGRAM_FILENAME_WITHOUT_EXTENSION = "diagram"; //$NON-NLS-1$
-	
-	private static final String DIAGRAM_FILENAME = DIAGRAM_FILENAME_WITHOUT_EXTENSION + MultiFileSaveUtil.DEFAULT_FILE_EXTENSION;
-
-	private static final Map<Process, DiagramManager> processToDiagramManagerMap = new HashMap<Process, DiagramManager>();
-	
-	private static ILibraryServiceListener libSvcListener;
-	
-	private static final FileSynchronizer fileSynchronizer = new FileSynchronizer() {
-		@Override
-		protected Collection<IFile> handleChangedFiles(Collection<IFile> changedFiles) {
-			try {
-				Collection<DiagramManager> mgrs = getDiagramManagers();
-				if(!mgrs.isEmpty()) {
-					Collection<IFile> handledFiles = new ArrayList<IFile>();
-					for (DiagramManager mgr : mgrs) {
-						Resource resource = mgr.getResource(false);
-						if(resource != null && resource.isLoaded()) {
-							IFile file = WorkspaceSynchronizer.getFile(mgr.getResource());
-							if(changedFiles.contains(file)) {
-								try {									
-									mgr.reload();
-									handledFiles.add(file);
-								} catch (IOException e) {
-									CommonPlugin.getDefault().getLogger().logError(e);
-									if(DEBUG) {
-										e.printStackTrace();
-									}
-								}
-							}
-						}
-					}
-					return handledFiles;
-				}
-			}
-			catch(CoreException e) {
-				handleCoreException(e, e.getMessage());
-			}
-			return Collections.emptyList();
-		}
-		
-		@Override
-		protected Map<IFile, IPath> handleMovedFiles(Map<IFile, IPath> movedFileToNewPathMap) {
-			for (Map.Entry<IFile, IPath> entry : movedFileToNewPathMap.entrySet()) {
-				IFile iFile = entry.getKey();
-				if(DIAGRAM_FILENAME.equals(iFile.getName())) {
-					synchronized (processToDiagramManagerMap) {
-						DiagramManager mgr = getDiagramManager(iFile);
-						if(mgr != null) {
-							mgr.updateResourceURI();
-						}
-					}
-				}
-			}
-			return super.handleMovedFiles(movedFileToNewPathMap);
-		}
-		
-		@Override
-		protected Collection handleDeletedFiles(Collection<IFile> deletedFiles) {
-			// TODO Auto-generated method stub
-			return super.handleDeletedFiles(deletedFiles);
-		}
-	};
-
-	public static final String ADD_kind = "ADD"; //$NON-NLS-1$
-
-	public static final String AD_kind = "AD"; //$NON-NLS-1$
-
-	public static final String WPD_kind = "WPDD"; //$NON-NLS-1$	
-	
-	private static DiagramManager getDiagramManager(IFile iFile) {
-		for (Iterator iterator = processToDiagramManagerMap.values().iterator(); iterator
-		.hasNext();) {
-			DiagramManager mgr = (DiagramManager) iterator.next();
-			if(mgr.resource != null && iFile.equals(WorkspaceSynchronizer.getFile(mgr.resource))) {
-				return mgr;
-			}
-		}
-		return null;
-	}
-	
-	public static void disposeDiagramManagers(MethodLibrary library) {
-		synchronized(processToDiagramManagerMap) {
-			for (Iterator<Map.Entry<Process, DiagramManager>> iterator = processToDiagramManagerMap.entrySet().iterator(); iterator.hasNext();) {
-				Map.Entry<Process, DiagramManager> entry = iterator.next();
-				if(UmaUtil.getMethodLibrary(entry.getKey()) == library) {
-					entry.getValue().doDispose();
-					iterator.remove();
-				}
-			}
-		}
-	}
-	
-	private static synchronized void setupLibraryServiceListener() {
-		if(libSvcListener == null) {
-			libSvcListener = new LibraryServiceListener() {
-				
-				@Override
-				public void libraryClosed(MethodLibrary library) {
-					disposeDiagramManagers(library);
-				}
-				
-				@Override
-				public void libraryReopened(MethodLibrary library) {
-					disposeDiagramManagers(library);
-				}
-			};
-			LibraryService.getInstance().addListener(libSvcListener);
-		}
-	}
-	
-	/**
-	 * Gets a instance of DiagramManager for the specified process. Caller must
-	 * release the returned DiagramManager instance when it's no longer needed
-	 * using {@link #removeConsumer(Object)}.
-	 * 
-	 * @param process
-	 * @return
-	 */
-	public static final DiagramManager getInstance(Process process, Object consumer) {
-		if(DEBUG) {
-			if(process.eIsProxy()) {
-				System.err.println("Process is a proxy: " + process); //$NON-NLS-1$
-			}
-		}
-		assert process != null && consumer != null && !process.eIsProxy();
-		setupLibraryServiceListener();
-		DiagramManager mgr = (DiagramManager) processToDiagramManagerMap.get(process);
-		if(mgr != null && mgr.isDisposed()) {
-			processToDiagramManagerMap.remove(process);
-			mgr = null;
-		}
-		if(mgr == null) {
-			synchronized(processToDiagramManagerMap) {
-				mgr = (DiagramManager) processToDiagramManagerMap.get(process);
-				if(mgr == null) {
-					mgr = new DiagramManager(process);
-					processToDiagramManagerMap.put(process, mgr);
-					if(!fileSynchronizer.fIsInstalled) {
-						fileSynchronizer.install();
-					}
-				}
-			}			
-		}
-		mgr.addConsumer(consumer);
-		return mgr;
-	}
-	
-	/**
-	 * Checks if an diagram manager for the given process already exists.
-	 * 
-	 * @param process
-	 * @return
-	 */
-	public static final boolean hasDiagramManager(Process process) {
-		return processToDiagramManagerMap.containsKey(process);
-	}
-	
-	public static boolean disposeDiagramManager(Process process) {
-		synchronized (processToDiagramManagerMap) {
-			DiagramManager mgr = processToDiagramManagerMap.get(process);
-			if(mgr != null) {
-				mgr.doDispose();
-				processToDiagramManagerMap.remove(process);
-				return true;
-			}
-			return false;
-		}
-	}
-	
-	@SuppressWarnings("unchecked")
-	public static Collection<DiagramManager> getDiagramManagers() {
-		ArrayList<DiagramManager> mgrs;
-		synchronized(processToDiagramManagerMap) {
-			mgrs = new ArrayList<DiagramManager>(processToDiagramManagerMap.values());
-		}
-		return mgrs.isEmpty() ? Collections.EMPTY_LIST : mgrs;
-	}
-	
-	private class GMFResourceEx extends GMFResource implements IFailSafeSavable {
-
-		private FailSafePersistenceHelper failSafePersistenceHelper;
-
-		public GMFResourceEx(URI uri) {
-			super(uri);
-		}
-		
-		@Override
-		protected XMLHelper createXMLHelper() {					
-			return new GMFHelper(this) {
-				
-				protected URI getHREF(Resource otherResource, EObject obj) {
-					if(otherResource instanceof ILibraryResource) {
-						return ((ILibraryResource)otherResource).getProxyURI(obj);
-					}
-					return super.getHREF(otherResource, obj);
-				}
-				
-			};
-		}
-		
-		public void updateInfo() {
-			IFile file = WorkspaceSynchronizer.getFile(this);
-			if(DiagramManager.this.resourceIsNew) {
-				DiagramManager.this.resourceIsNew = false;
-				fileSynchronizer.monitor(file);
-			}
-			fileSynchronizer.updateModificationStamp(file);
-			try {
-				file.refreshLocal(IResource.DEPTH_ZERO, null);
-			} catch (CoreException e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		
-		@Override
-		public void save(Map options) throws IOException {
-			super.save(options);
-			if(!hasTempURI()) {
-				updateInfo();
-			}
-		}
-		
-		private Adapter superCreateModificationAdapter() {
-			return super.createModificationTrackingAdapter();
-		}
-		
-		@Override
-		protected Adapter createModificationTrackingAdapter() {
-			return new AdapterImpl() {
-				private Adapter delegate = superCreateModificationAdapter();
-				
-				@Override
-				public void notifyChanged(Notification msg) {
-					delegate.notifyChanged(msg);
-					notifyDiagramChangeListeners(msg);
-				}
-			};
-		}
-		
-		/**
-		 * Don't notify DiagramModificationListener about resource modification event but rather
-		 * let {@link #notifyDiagramChangeListeners(Notification) handle it.
-		 */
-		@Override
-		public void eNotify(Notification notification) {
-			if(isLoaded() && notification.getNotifier() instanceof Resource 
-					&& notification.getFeatureID(Resource.class) == Resource.RESOURCE__IS_MODIFIED
-					&& notification.getEventType() == Notification.SET) {
-				if (eAdapters != null && eDeliver())
-				{
-					int size = eAdapters.size();
-					if (size > 0)
-					{
-						Adapter [] adapters = (Adapter [])eAdapters.data();
-						for (int i = 0; i < size; ++i)
-						{
-							Adapter adapter = adapters[i];
-							if(!(adapter instanceof AccessibleDiagramModificationListener)) {
-								adapter.notifyChanged(notification);
-							}
-						}
-					}
-				}
-			}
-			else {
-				super.eNotify(notification);
-			}
-		}
-
-		protected void notifyDiagramChangeListeners(Notification msg) {
-			BasicEList<Adapter> eAdapters = eBasicAdapters();
-			if (eAdapters != null && eDeliver())
-			{
-				int size = eAdapters.size();
-				if (size > 0)
-				{
-					Adapter [] adapters = (Adapter [])eAdapters.data();
-					for (int i = 0; i < size; ++i)
-					{
-						Adapter adapter = adapters[i];
-						if(adapter instanceof AccessibleDiagramModificationListener) {
-							adapter.notifyChanged(msg);
-						}
-					}
-				}
-			}
-		}
-		
-		private FailSafePersistenceHelper getFailSafePersistenceHelper() {
-			if(failSafePersistenceHelper == null) {
-				// id format: <process_guid>diagram
-				String id = DiagramManager.this.process.getGuid() + DIAGRAM_FILENAME_WITHOUT_EXTENSION;
-				failSafePersistenceHelper = new FailSafePersistenceHelper(this, id);
-				failSafePersistenceHelper.setCommitEmptyResource(true);
-			}
-			return failSafePersistenceHelper;
-		}
-
-		public void commit() {
-			getFailSafePersistenceHelper().commit();
-		}
-
-		public void deleteBackup() {
-			getFailSafePersistenceHelper().deleteBackup();
-		}
-
-		public boolean hasTempURI() {
-			return getFailSafePersistenceHelper().hasTempURI();
-		}
-
-		public boolean restore() {
-			return getFailSafePersistenceHelper().restore();
-		}
-
-		public void setTxID(String txID) {
-			getFailSafePersistenceHelper().setTempURI(txID);
-		}
-
-		public void txFinished(boolean successful) {
-			getFailSafePersistenceHelper().txFinished(successful);
-			if(successful) {
-				updateInfo();
-			}
-		}
-		
-		@Override
-		protected void doUnload() {
-			super.doUnload();
-			
-		    Iterator<EObject> allContents = getAllProperContents(unloadingContents);
-		    List<EObject> list = new ArrayList<EObject>();
-			while (allContents.hasNext()) {
-				list.add(allContents.next());
-			}
-			for (EObject object : list) {
-				EcoreUtil.remove(object);
-			}
-		}
-		
-	}
-	
-	private class GMFExtendedResourceSet extends ExtendedResourceSet {
-		@Override
-		protected int getURIType(URI uri) {
-			if(MultiFileURIConverter.SCHEME.equals(uri.scheme())) {
-				return URI_TYPE_EXTERNAL;
-			}
-			if(DIAGRAM_FILENAME.equals(uri.lastSegment())) {
-				return URI_TYPE_LOCAL;
-			}
-			return URI_TYPE_EXTERNAL;
- 		}
-		
-		@SuppressWarnings("unchecked")
-		@Override
-		public Resource createResource(URI uri) {
-			XMIResource resource = new GMFResourceEx(uri);
-
-			resource.getDefaultLoadOptions().putAll(GMFResourceFactory.getDefaultLoadOptions());
-			resource.getDefaultSaveOptions().putAll(GMFResourceFactory.getDefaultSaveOptions());
-
-			if (!resource.getEncoding().equals(EMFCoreConstants.XMI_ENCODING))
-				resource.setEncoding(EMFCoreConstants.XMI_ENCODING);
-
-			getResources().add(resource);
-			
-			return resource;
-		}
-		
-	}
-
-	/**
-	 * Reference count to this diagram manager
-	 */
-	private Process process;
-	
-	private Resource resource;
-	
-	private InternalTransactionalEditingDomain editingDomain;
-
-	private IProgressMonitor monitor;
-
-	private boolean resourceIsNew;
-	
-	private List<IResourceChangeListener> resourceChangeListeners = new UniqueEList<IResourceChangeListener>();
-
-	private ExtendedResourceSet resourceSet;
-
-	private HashMap<Activity, Map<String, Diagram>> activityToSavedDiagramMap; 
-	
-	protected UniqueEList<Object> consumers = new UniqueEList<Object>();
-	
-	private DiagramManager(Process process) {
-		this.process = process;
-	}
-	
-	public Process getProcess() {
-		return process;
-	}
-	
-	public void addResourceChangeListener(IResourceChangeListener listener) {
-		if(!resourceChangeListeners.contains(listener)) {
-			resourceChangeListeners.add(listener);
-		}
-	}
-	
-	public void removeResourceChangeListener(IResourceChangeListener listener) {
-		resourceChangeListeners.remove(listener);
-	}
-	
-	public synchronized boolean addConsumer(Object consumer) {
-		return consumers.add(consumer);
-	}
-	
-	/**
-	 * Removes the given consumer from the consumer list of this diagram manager. Unload
-	 * this diagram manager if it does not have any more consumer after this call. 
-	 */
-	public synchronized boolean removeConsumer(Object consumer) {
-		boolean ret = consumers.remove(consumer);
-		if(ret && consumers.isEmpty()) {
-			synchronized(processToDiagramManagerMap) {
-				processToDiagramManagerMap.remove(process);
-				if(processToDiagramManagerMap.isEmpty()) {
-					fileSynchronizer.uninstall();
-				}
-			}
-			doDispose();
-		}
-		return ret;
-	}
-	
-	public boolean isNewResource() {
-		return resourceIsNew;
-	}
-	
-	public void setResourceIsNew(boolean resourceIsNew) {
-		this.resourceIsNew = resourceIsNew;
-	}
-	
-	public InternalTransactionalEditingDomain getEditingDomain() {
-		if (editingDomain == null && !isDisposed()) {
-			editingDomain = createEditingDomain();
-			resourceSet = (ExtendedResourceSet) editingDomain.getResourceSet();
-		}
-		return editingDomain;
-	}
-	
-	private InternalTransactionalEditingDomain createEditingDomain() {
-		GMFExtendedResourceSet resourceSet = new GMFExtendedResourceSet();
-		resourceSet.add(process.eResource().getResourceSet());
-		return (InternalTransactionalEditingDomain) DiagramEditingDomainFactory.getInstance()
-				.createEditingDomain(resourceSet);
-	}
-	
-	private void doDispose() {
-		if(resource != null) {
-			IFile file = WorkspaceSynchronizer.getFile(resource);
-			if(file != null) {
-				fileSynchronizer.unmonitor(file);				
-			}
-			resource = null;
-		}
-
-		resourceChangeListeners.clear();
-		
-		if(editingDomain != null) {
-			resourceSet.dispose();
-			resourceSet = null;
-
-			editingDomain.dispose();
-			editingDomain = null;			
-		}	
-		
-		consumers.clear();
-		
-		if(activityToSavedDiagramMap != null) {
-			activityToSavedDiagramMap.clear();
-		}
-		
-		process = null;
-	}
-	
-	public void dispose() {
-		synchronized (processToDiagramManagerMap) {
-			processToDiagramManagerMap.remove(process);
-		}
-		doDispose();
-	}
-	
-	public boolean isDisposed() {
-		return process == null;
-	}
-	
-	/**
-	 * Gets diagrams of the given type for the specified activity
-	 * <code>act</code>
-	 * 
-	 * @param act
-	 * @param type
-	 *            must be one of the following constants:
-	 *            {@link IDiagramManager#ACTIVITY_DIAGRAM},
-	 *            {@link IDiagramManager#ACTIVITY_DETAIL_DIAGRAM},
-	 *            {@link IDiagramManager#WORK_PRODUCT_DEPENDENCY_DIAGRAM}
-	 * @return
-	 * @throws CoreException
-	 */
-	public List<Diagram> getDiagrams(Activity act, int type) throws CoreException {
-		checkActivity(act);
-		Resource resource = getResource(false);
-		if(resource != null) {
-			ArrayList<Diagram> diagrams = new ArrayList<Diagram>();
-			for (EObject o : resource.getContents()) {
-				if(o instanceof Diagram) {
-					Diagram diagram = (Diagram) o;
-					String typeStr = getDiagramTypeString(type);
-					if(typeStr.equals(diagram.getType()) && isDiagramOf(diagram, act)) {
-						EObject model = diagram.getElement();
-						if(model instanceof DiagramImpl) {
-							// disable creation of UMA graphical data
-							//
-							((DiagramImpl)model).setGraphicalDataRequired(false);
-						}
-						diagrams.add(diagram);
-					}
-				}
-			}
-			if(!diagrams.isEmpty()) {
-				return diagrams;
-			}
-		}
-		return Collections.emptyList();
-	}
-	
-	private static void markInherited(Diagram diagram) {
-		List<?> children = diagram.getChildren();
-		int size = children.size();		
-		for (int i = 0; i < size; i++) {
-			View view = (View) children.get(i);
-			BridgeHelper.markInherited(view);
-		}
-		for (Object edge : diagram.getEdges()) {
-			BridgeHelper.markInherited((View) edge);
-		}
-	}
-	
-	private static String getDiagramTypeString(int diagramType) {
-		switch(diagramType) {
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return ADD_kind;
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return AD_kind;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return WPD_kind;
-		}
-		return null;
-	}
-	
-	public static int getDiagramType(String typeStr) {
-		if(AD_kind.equals(typeStr)) {
-			return IDiagramManager.ACTIVITY_DIAGRAM;			
-		}
-		else if(ADD_kind.equals(typeStr)) {
-			return IDiagramManager.ACTIVITY_DETAIL_DIAGRAM;			
-		}
-		else if(WPD_kind.equals(typeStr)) {
-			return IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM;
-		}
-		return -1;
-	}
-	
-	/**
-	 * Associates a new diagram with the given activity
-	 * 
-	 * @param diagram
-	 * @param type
-	 * @param activity
-	 * @throws CoreException 
-	 */
-	public void associate(Diagram newDiagram, int type, Activity activity) throws CoreException {
-		switch(type) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			associateAD(newDiagram, activity);
-			return;
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			associateADD(newDiagram, activity);
-			return;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			associateWPD(newDiagram, activity);	
-		}
-	}
-	
-	private void associateWPD(Diagram copy, Activity activity) throws CoreException {
-		// TODO - consolidate one method with ADD.
-		if(copy.getElement() instanceof WorkProductDependencyDiagram) {
-			((WorkProductDependencyDiagram)copy.getElement()).setLinkedElement(activity);
-			((DiagramImpl)copy.getElement()).setGraphicalDataRequired(false);
-		}
-		getResource().getContents().add(copy.getElement());
-		getResource().getContents().add(copy);	
-	}
-
-	private void associateAD(Diagram copy, Activity act) throws CoreException {
-		if(copy.getElement() instanceof EModelElement) {
-			BridgeHelper.associate((EModelElement) copy.getElement(), act);
-		}
-		getResource().getContents().add(copy.getElement());
-		getResource().getContents().add(copy);
-	}
-	
-	private void associateADD(Diagram copy, Activity activity) throws CoreException {
-		if(copy.getElement() instanceof ActivityDetailDiagram) {
-			((ActivityDetailDiagram)copy.getElement()).setLinkedElement(activity);
-			((DiagramImpl)copy.getElement()).setGraphicalDataRequired(false);
-		}
-		getResource().getContents().add(copy.getElement());
-		getResource().getContents().add(copy);		
-	}
-	
-	private Diagram copyDiagram(Diagram diagram, Activity targetActivity) {
-		Diagram copy = DiagramHelper.copyDiagram(getEditingDomain(), diagram);
-		DiagramHelper.reassociate(targetActivity, copy);
-		return copy;
-	}
-
-	public Diagram createDiagram(final Activity act, final int type, final PreferencesHint hint) throws CoreException {
-		checkActivity(act);
-		// check if this activity contributes/extends other activity and try
-		// copy
-		// the existing diagram from the base
-		//
-		if (ProcessUtil.isExtendingOrLocallyContributing(act)) {
-			Activity baseAct = (Activity) act.getVariabilityBasedOnElement();
-			DiagramManager mgr = DiagramManager.getInstance(TngUtil.getOwningProcess(baseAct), this);
-			try {
-				List baseDiagrams = mgr.getDiagrams(baseAct, type);
-				if(!baseDiagrams.isEmpty()) {
-					Diagram baseDiagram = (Diagram) baseDiagrams.get(0);
-					if (baseDiagram != null) {
-						final Diagram copy = copyDiagram(baseDiagram, act);
-						TxUtil.runInTransaction(getEditingDomain(), new Runnable() {
-
-							public void run() {
-								markInherited(copy);
-								try {
-									associate(copy, type, act);
-								} catch (CoreException e) {
-									throw new WrappedException(e);
-								}
-							}
-							
-						});
-						return copy;
-					}
-				}
-			} catch(Exception e){
-				CommonPlugin.getDefault().getLogger().logError("Error in retrieving base diagram: ", e); //$NON-NLS-1$
-			}
-			finally {
-				if(mgr != null) {
-					mgr.removeConsumer(this);
-				}
-			}
-		}
-				
-		
-		final Diagram[] resultHolder = new Diagram[1];
-		try {
-			TxUtil.runInTransaction(getEditingDomain(), new Runnable() {
-
-				public void run() {
-					try {
-						resultHolder[0] = doCreateDiagram(act, type, hint);
-					} catch (CoreException e) {
-						throw new WrappedException(e);
-					}
-				}
-				
-			});
-		} catch (Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-			if(DEBUG) {
-				e.printStackTrace();
-			}
-		}
-		return resultHolder[0];
-	}
-	
-	private Diagram doCreateDiagram(Activity act, int type, PreferencesHint hint) throws CoreException {
-		switch(type) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return createAD(act, hint);
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return createADD(act, hint);
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return createWPDD(act, hint);
-		}
-		return null;
-	}
-
-	private Diagram createWPDD(Activity act, PreferencesHint hint)
-			throws CoreException {
-		// ProcessPackage model = (ProcessPackage) act.eContainer();
-		WorkProductDependencyDiagram model = ModelFactory.eINSTANCE
-				.createWorkProductDependencyDiagram();
-		if (model instanceof DiagramImpl) {
-			// disable creation of UMA graphical data
-			//
-			((DiagramImpl) model).setGraphicalDataRequired(false);
-		}
-		model.setNew(true);
-		Diagram diagram = ViewService
-				.createDiagram(
-						model,
-						getDiagramTypeString(IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM),
-						hint);
-		if (diagram != null) {
-			diagram.setName(act.getName());
-			model.setLinkedElement(act);
-			getResource().getContents().add(model);
-			getResource().getContents().add(diagram);
-
-			// add ResourceDomainLink to the method library resource set
-			//
-			// EcoreUtil.getAdapter(getResource().getResourceSet().eAdapters(),
-			// ResourceDo)
-		}
-		return diagram;
-	}
-
-	private Diagram createADD(Activity act, PreferencesHint hint)
-			throws CoreException {
-		ActivityDetailDiagram model = ModelFactory.eINSTANCE
-				.createActivityDetailDiagram();
-		if (model instanceof DiagramImpl) {
-			// disable creation of UMA graphical data
-			//
-			((DiagramImpl) model).setGraphicalDataRequired(false);
-		}
-		model.setNew(true);
-		Diagram diagram = ViewService.createDiagram(model,
-				getDiagramTypeString(IDiagramManager.ACTIVITY_DETAIL_DIAGRAM),
-				hint);
-		if (diagram != null) {
-			model.setLinkedElement(act);
-			diagram.setName(act.getName());
-			getResource().getContents().add(model);
-			getResource().getContents().add(diagram);
-		}
-		return diagram;
-	}
-
-	private Diagram createAD(Activity act, PreferencesHint hint) throws CoreException {
-		org.eclipse.uml2.uml.Activity model = UMLFactory.eINSTANCE
-				.createActivity();
-		Diagram diagram = ViewService.createDiagram(model,
-				getDiagramTypeString(IDiagramManager.ACTIVITY_DIAGRAM), hint);
-		if (diagram != null) {
-			BridgeHelper.associate(model, act);
-			diagram.setName(act.getName());
-			model.setName(act.getName());
-			getResource().getContents().add(model);
-			getResource().getContents().add(diagram);
-		}
-		return diagram;
-	}
-
-	private IProgressMonitor getMonitor() {
-		if(monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		return monitor;
-	}
-	
-	public static String getDiagramFilePath(Process process) {
-		try {
-			ProcessComponent procComp = (ProcessComponent) process.eContainer();
-			if(procComp == null) {
-				return null;
-			}
-			if(UmaUtil.hasDirectResource(procComp)) {
-				// existing process
-				//
-				return new File(new File(FileManager.toFileString(process.eResource().getURI())).getParentFile(), DIAGRAM_FILENAME).getCanonicalPath();
-			}
-			else {
-				// new process that has not been saved yet
-				//
-				URI uri = MultiFileSaveUtil.createURI(procComp, procComp.eResource().getResourceSet());
-				return new File(new File(uri.toFileString()).getParentFile(),
-								DIAGRAM_FILENAME).getCanonicalPath();
-			}
-		} catch (IOException e) {
-			e.printStackTrace();
-			return null;
-		}		
-	}
-	
-	public void reload() throws IOException {
-		if(resource == null) {
-			return;
-		}
-		resource.unload();
-		resource.load(Collections.EMPTY_MAP);
-		IFile file = WorkspaceSynchronizer.getFile(resource);
-		fileSynchronizer.updateModificationStamp(file);
-		notifyReloaded();
-	}
-	
-	public Resource getResource() throws CoreException {
-		if(resource == null) {
-			resource = getResource(true);
-		}
-		return resource;
-	}	
-	
-	private static URI createDiagramResourceURI(String path) {
-		IFile diagramFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(path));
-		return URI.createPlatformResourceURI(diagramFile
-				.getFullPath().toString());
-	}
-	
-	private static Resource loadDiagramResource(IFile fFile,
-			EditingDomain domain, Map loadOptions, IProgressMonitor monitor)
-			throws CoreException, IOException {
-		fFile.refreshLocal(IResource.DEPTH_ZERO, monitor);
-		URI uri = URI.createPlatformResourceURI(fFile.getFullPath()
-            .toString(), true);
-		
-		Resource resource = domain.getResourceSet().getResource(uri, false);
-		
-		if (resource == null) {
-			resource = domain.getResourceSet().createResource(uri);
-		}
-		
-		if (!resource.isLoaded()) {
-			Map loadingOptions = new HashMap(GMFResourceFactory.getDefaultLoadOptions());
-			
-            // propogate passed in options to the defaults
-            Iterator iter = loadOptions.keySet().iterator();
-            while (iter.hasNext()) {
-                Object key = iter.next();
-                loadingOptions.put(key, loadOptions.get(key));
-            }
-            
-            try {
-            	resource.load(loadingOptions);
-            } catch (IOException e) {
-            	resource.unload();
-            	throw e;
-            }
-		}
-					
-		return resource;
-
-	}
-	
-	private Resource getResource(boolean create) throws CoreException {
-		if(resource == null) {
-			String path = getDiagramFilePath(process);	
-			if(path != null) {
-				IResource wsRes = FileManager.getResourceForLocation(path);
-				if(wsRes instanceof IFile) {
-					IFile file = (IFile) wsRes;
-					try {						
-						Diagram diagram = DiagramIOUtil.load(getEditingDomain(), file, true, getMonitor());					
-						resource = diagram.eResource();
-					}
-					catch(CoreException e) {
-						// handled exception that is thrown if resource does not have any diagram
-						//
-						if(org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.l10n.EditorMessages.Diagram_NO_DIAGRAM_IN_RESOURCE
-								.equals(e.getMessage())) {
-							try {
-								resource = loadDiagramResource(file, getEditingDomain(), Collections.EMPTY_MAP, getMonitor());
-							} catch (IOException e1) {
-								if(DEBUG) {
-									DiagramCorePlugin.getDefault().getLogger().logError(e);
-								}
-								throw new CoreException(new Status(IStatus.ERROR, DiagramCorePlugin.PLUGIN_ID, e1.getMessage(), e1));
-							}
-						}
-						else {
-							throw e;
-						}
-					}
-					fileSynchronizer.monitor(file);
-				}
-				else if(create) {
-					resource = getEditingDomain().getResourceSet().createResource(
-							createDiagramResourceURI(path));
-					resourceIsNew = true;
-					
-					try {
-						TxUtil.runInTransaction(getEditingDomain(), new Runnable() {
-
-							public void run() {
-								resource.getContents().clear();
-							}
-							
-						});
-					} catch (Exception e) {
-						DiagramCorePlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-		else if(!resource.isLoaded()) {
-			try {
-				resource.load(Collections.EMPTY_MAP);
-				notifyReloaded();
-			} catch (IOException e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-				if(DEBUG) {
-					e.printStackTrace();
-				}
-			}
-		}
-		return resource;
-	}
-
-	private void notifyReloaded() {
-		for (Iterator iter = resourceChangeListeners.iterator(); iter.hasNext();) {
-			IResourceChangeListener listener = (IResourceChangeListener) iter.next();
-			try {
-				listener.resourceChanged(new ResourceChangeEvent(this, IResourceChangeEvent.POST_CHANGE, 0, null));
-			}
-			catch(Exception e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-				if(DEBUG) {
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-
-	private void checkActivity(Activity act) {		
-		Process proc = TngUtil.getOwningProcess(act);
-		if(proc != process) {
-			throw new IllegalArgumentException("The specified activity does not belong to the process of this diagram manager."); //$NON-NLS-1$
-		}
-	}	
-	
-	private static boolean isDiagramOf(Diagram diagram, Activity act) {
-		if(AD_kind.equals(diagram.getType())) {
-			return BridgeHelper.getMethodElementFromAnnotation((EModelElement) diagram.getElement(), act.eResource().getResourceSet()) == act;
-		}
-		else if(ADD_kind.equals(diagram.getType())) {
-			EObject model = diagram.getElement();
-			return model instanceof ActivityDetailDiagram && ((ActivityDetailDiagram)model).getLinkedElement() == act;
-		}
-		else if(WPD_kind.equals(diagram.getType())) {
-			EObject model = diagram.getElement();
-			return model instanceof WorkProductDependencyDiagram && ((WorkProductDependencyDiagram)model).getLinkedElement() == act;
-		}
-		return false;
-	}
-	
-	/**
-	 * Checks whether the given resource has been changed on the
-	 * local file system by comparing the actual time stamp with the
-	 * cached one. If the resource has been changed, a <code>CoreException</code>
-	 * is thrown.
-	 *
-	 * @param cachedModificationStamp the cached modification stamp
-	 * @param resource the resource to check
-	 * @throws org.eclipse.core.runtime.CoreException if resource has been changed on the file system
-	 */
-	public static void checkSynchronizationState(Resource resource) throws CoreException {
-		if(!isSynchronized(resource)) {
-			Status status= new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IResourceStatus.OUT_OF_SYNC_LOCAL, EditorMessages.FileDocumentProvider_error_out_of_sync, null);
-			throw new CoreException(status);
-		}
-	}
-	
-	public static boolean isSynchronized(Resource resource) {
-		IFile file = WorkspaceSynchronizer.getFile(resource);
-		if(file != null) {
-			// don't refresh to prevent resource from automatically reloaded
-			//
-//			file.refreshLocal(IResource.DEPTH_ZERO, monitor);
-			FileInfo info = fileSynchronizer.getFileInfo(file);
-			if(info != null) {
-				return info.fModificationStamp == FileSynchronizer.computeModificationStamp(file);
-			}
-		}
-		return true;
-	}
-	
-	private Map<Activity, Map<String, Diagram>> getActivityToSavedDiagramsMap() {
-		if(activityToSavedDiagramMap == null) {
-			activityToSavedDiagramMap = new HashMap<Activity, Map<String, Diagram>>();
-		}
-		return activityToSavedDiagramMap;
-	}
-	
-	private Diagram getDiagramBackup(Activity act, String type) {
-		if(activityToSavedDiagramMap != null) {
-			Map<String, Diagram> typeToDiagamMap = activityToSavedDiagramMap.get(act);
-			if(typeToDiagamMap != null) {
-				return (Diagram) typeToDiagamMap.get(type);
-			}
-		}
-		return null;
-	}
-	
-	public void replaceTemporarily(final Activity act, final Diagram diagram) {
-		try {
-			new AbstractEMFOperation(getEditingDomain(), StringStatics.BLANK) {
-
-				@Override
-				protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-					try {
-						List diagrams = getDiagrams(act, getDiagramType(diagram.getType()));
-						if(!diagrams.isEmpty()) {
-							Diagram savedDiagram = (Diagram) diagrams.get(0);
-							Map<String, Diagram> typeToDiagamMap = getActivityToSavedDiagramsMap().get(act);	
-							if(typeToDiagamMap == null) {
-								typeToDiagamMap = new HashMap<String, Diagram>();
-								getActivityToSavedDiagramsMap().put(act, typeToDiagamMap);
-							}
-							if(typeToDiagamMap.get(diagram.getType()) == null) {
-								typeToDiagamMap.put(diagram.getType(), savedDiagram);
-							}
-							((InternalEObject) diagram).eSetProxyURI(null);
-							for (Iterator iter = diagram.eAllContents(); iter
-							.hasNext(); ((InternalEObject) iter.next()).eSetProxyURI(null));
-							((InternalEObject) diagram.getElement()).eSetProxyURI(null);
-							for (Iterator iter = diagram.getElement().eAllContents(); iter
-							.hasNext(); ((InternalEObject) iter.next()).eSetProxyURI(null));							
-							resource.getContents().set(resource.getContents().indexOf(savedDiagram), diagram);
-							resource.getContents().set(resource.getContents().indexOf(savedDiagram.getElement()), diagram.getElement());				
-						}
-						else {
-							resource.getContents().add(diagram.getElement());
-							resource.getContents().add(diagram);
-						}
-					} catch (CoreException e) {
-						CommonPlugin.getDefault().getLogger().logError(e);			
-					}
-					return Status.OK_STATUS;
-				}
-				
-			}.execute(new NullProgressMonitor(), null);
-		} catch (ExecutionException e1) {
-			CommonPlugin.getDefault().getLogger().logError(e1);
-		}
-	}
-	
-	private Diagram getSavedDiagram(Activity act, Diagram diagram) {
-		Diagram savedDiagram = getDiagramBackup(act, diagram.getType());
-//		if(savedDiagram == null) {
-//			// try to load diagram from file
-//			//
-//			IFile file = WorkspaceSynchronizer.getFile(resource);
-//			if(file != null) {
-//				TransactionalEditingDomain domain = createEditingDomain();
-//				try {
-//					Diagram d = DiagramIOUtil.load(domain, file, true, getMonitor());
-//					if(d != null) {
-//						int index = resource.getContents().indexOf(diagram);
-//						savedDiagram = (Diagram) d.eResource().getContents().get(index);
-//					}
-//				} catch (CoreException e) {
-//					DiagramCorePlugin.getDefault().getLogger().logError(e);
-//				} finally {
-//					if(domain != null) {
-//						domain.dispose();
-//					}
-//				}
-//			}
-//		}
-		return savedDiagram;
-	}
-
-	public synchronized boolean reverseToSaved(final Activity act, final Diagram diagram, PreferencesHint hint) {
-		final Diagram savedDiagram = getSavedDiagram(act, diagram);
-		try {
-			new AbstractEMFOperation(getEditingDomain(), StringStatics.BLANK) {
-
-				@Override
-				protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-					if(savedDiagram != null) {
-						// restore diagram to its backup
-						//
-						resource.getContents().set(resource.getContents().indexOf(diagram), savedDiagram);
-						resource.getContents().set(resource.getContents().indexOf(diagram.getElement()), savedDiagram.getElement());
-						removeDiagramBackup(act, diagram.getType());
-					}
-					else {
-						// diagram is newly created, remove it from resource
-						//
-						resource.getContents().remove(diagram.getElement());
-						resource.getContents().remove(diagram);
-					}
-					
-					ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil
-							.getPersisterFor(act.eResource())
-							.getFailSafePersister();
-					try {
-						persister.save(resource);
-						persister.commit();
-					} catch (Exception e) {
-						DiagramCorePlugin.getDefault().getLogger().logError(e);
-						try {
-							persister.rollback();
-						}
-						catch(Exception ex) {}
-						throw new ExecutionException(e.getMessage(), e);
-					}
-					return Status.OK_STATUS;
-				}
-				
-			}.execute(new NullProgressMonitor(), null);
-			return true;
-		} catch (ExecutionException e1) {
-			CommonPlugin.getDefault().getLogger().logError(e1);
-		}
-		return false;		
-	}
-
-	/**
-	 * Updates URI of diagram resource after the URI of process resource has been changed.
-	 */
-	public void updateResourceURI() {
-		if(resource == null) {
-			return;
-		}
-		File folder = new File(FileManager.toFileString(resource.getURI())).getParentFile();
-		File procFolder = new File(process.eResource().getURI().toFileString()).getParentFile();
-		if(!folder.equals(procFolder)) {
-			String path = getDiagramFilePath(process);
-			if(path != null && new File(path).exists()) {
-				resource.setURI(createDiagramResourceURI(path));
-			}
-		}
-	}
-
-	public void backupDiagram(Activity activity, Diagram diagram) {
-		Map<String, Diagram> typeToDiagamMap = getActivityToSavedDiagramsMap().get(activity);	
-		if(typeToDiagamMap == null) {
-			typeToDiagamMap = new HashMap<String, Diagram>();
-			getActivityToSavedDiagramsMap().put(activity, typeToDiagamMap);
-		}
-		typeToDiagamMap.put(diagram.getType(), DiagramHelper.copyDiagram(getEditingDomain(), diagram));
-	}
-
-	public Diagram removeDiagramBackup(Activity act, String type) {
-		if(activityToSavedDiagramMap != null) {
-			Map<String, Diagram> typeToDiagamMap = activityToSavedDiagramMap.get(act);
-			if(typeToDiagamMap != null) {
-				return (Diagram) typeToDiagamMap.remove(type);
-			}
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramService.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramService.java
deleted file mode 100644
index cb1a8a9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/DiagramService.java
+++ /dev/null
@@ -1,97 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.services;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.gmf.runtime.notation.Diagram;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class DiagramService {
-
-	private Set<DiagramManager> diagramManagers = new HashSet<DiagramManager>();
-
-	/**
-	 * 
-	 */
-	public DiagramService() {
-	}
-	
-	public void dispose() {
-		for (DiagramManager mgr : diagramManagers) {
-			mgr.removeConsumer(this);
-		}
-	}
-
-	public DiagramManager getDiagramManager(Activity act) {
-		Process proc = TngUtil.getOwningProcess(act);
-		if(proc != null) {
-			DiagramManager mgr = DiagramManager.getInstance(TngUtil.getOwningProcess(act), this);
-			diagramManagers.add(mgr);
-			return mgr;
-		}
-		return null;
-	}
-	
-	public Collection<Diagram> getDiagrams(Activity act) {
-		DiagramManager mgr = getDiagramManager(act);
-		return mgr != null ? DiagramHelper.getDiagrams(act, mgr) : Collections.EMPTY_LIST;
-	}
-	
-	/**
-	 * Returns base diagram.
-	 * @param act
-	 * @param type
-	 * @return
-	 */
-	
-	public Diagram getBaseDiagram(Activity act, int type) {		
-		if (ProcessUtil.isExtendingOrLocallyContributing(act)) {
-			try {
-				Activity baseAct = (Activity) act
-						.getVariabilityBasedOnElement();
-				DiagramManager mgr = getDiagramManager(baseAct);
-				List<Diagram> baseDiagrams = mgr.getDiagrams(baseAct, type);
-				if(!baseDiagrams.isEmpty()) {
-					return baseDiagrams.get(0);
-				}
-			} catch (Exception e) {
-				DiagramCorePlugin.getDefault().getLogger().logError(
-						"Error in getting base diagram: ", e); //$NON-NLS-1$
-			}
-		}
-		return null;
-	}
-
-	public Diagram getDiagram(Activity act, int type) {
-		try {
-			DiagramManager mgr = getDiagramManager(act);
-			List<Diagram> diagrams = mgr.getDiagrams(act, type);
-			return diagrams.isEmpty() ? null : diagrams.get(0);
-		}
-		catch(Exception e) {
-			DiagramCorePlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/FileSynchronizer.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/FileSynchronizer.java
deleted file mode 100644
index e8492ec..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/services/FileSynchronizer.java
+++ /dev/null
@@ -1,302 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.services;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.osgi.framework.Bundle;
-
-/**
- * Synchronizes the document with external resource changes.
- * 
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class FileSynchronizer implements IResourceChangeListener {
-
-	/**
-	 * Bundle of all required information to allow files as underlying document resources.
-	 */
-	protected class FileInfo //extends StorageInfo 
-	{
-		/** The time stamp at which this provider changed the file. */
-		public long fModificationStamp= IResource.NULL_STAMP;
-		public boolean fCanBeSaved;
-		public IFile fFile;
-
-		/**
-		 * Creates and returns a new file info.
-		 *
-		 * @param document the document
-		 * @param model the annotation model
-		 * @param fileSynchronizer the file synchronizer
-		 */
-		public FileInfo(IFile file) {
-			fFile = file;
-		}
-	}
-
-	/**
-	 * A flag indicating whether this synchronizer is installed or not.
-	 *
-	 * 
-	 */
-	protected boolean fIsInstalled= false;
-	
-	/** Element information of all connected elements */
-	private Map fFileInfoMap= new HashMap();
-
-
-	/**
-	 * Creates a new file synchronizer. Is not yet installed on a resource.
-	 */
-	public FileSynchronizer() {
-		install();
-	}
-
-	void updateModificationStamp(IFile file) {
-		FileInfo info = getFileInfo(file);
-		if(info != null) {
-			info.fModificationStamp = computeModificationStamp(file);
-		}
-	}
-	
-	/**
-	 * Returns the element info object for the given element.
-	 *
-	 * @param element the element
-	 * @return the element info object, or <code>null</code> if none
-	 */
-	protected FileInfo getFileInfo(Object element) {
-		return (FileInfo) fFileInfoMap.get(element);
-	}
-
-	/**
-	 * Installs the synchronizer on the input's file.
-	 */
-	public void install() {
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
-		fIsInstalled= true;
-	}
-
-	/**
-	 * Uninstalls the synchronizer from the input's file.
-	 */
-	public void uninstall() {
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-		fIsInstalled= false;
-	}
-
-	/*
-	 * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent e) {
-		IResourceDelta delta= e.getDelta();
-		try {
-			if (delta != null && fIsInstalled) {
-				ResourceDeltaVisistor visitor = new ResourceDeltaVisistor();
-				delta.accept(visitor);
-				Runnable runnable = visitor.getRunnable();
-				if(runnable != null) {
-					update(runnable);
-				}
-			} 
-		} catch (CoreException x) {
-			handleCoreException(x, EditorMessages.FileDocumentProvider_resourceChanged);
-		}
-	}
-
-	/**
-	 * Defines the standard procedure to handle <code>CoreExceptions</code>. Exceptions
-	 * are written to the plug-in log.
-	 *
-	 * @param exception the exception to be logged
-	 * @param message the message to be logged
-	 * 
-	 */
-	protected void handleCoreException(CoreException exception, String message) {
-
-		Bundle bundle = Platform.getBundle(PlatformUI.PLUGIN_ID);
-		ILog log= Platform.getLog(bundle);
-
-		if (message != null)
-			log.log(new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, 0, message, exception));
-		else
-			log.log(exception.getStatus());
-	}
-	
-	/**
-	 * Computes the initial modification stamp for the given resource.
-	 *
-	 * @param resource the resource
-	 * @return the modification stamp
-	 */
-	public static long computeModificationStamp(IResource resource) {
-		if(resource == null) {
-			System.err.println("FATAL ERROR: resource is null."); //$NON-NLS-1$
-			return 0;
-		}
-		long modificationStamp= resource.getModificationStamp();
-
-		IPath path= resource.getLocation();
-		if (path == null)
-			return modificationStamp;
-
-		modificationStamp= path.toFile().lastModified();
-		return modificationStamp;
-	}
-	
-	private class ResourceDeltaVisistor implements IResourceDeltaVisitor {
-		private Collection<IFile> changedFiles = new ArrayList<IFile>();
-		private Map<IFile, IPath> movedFileToNewPathMap = new HashMap<IFile, IPath>();
-		private Collection<IFile> deletedFiles = new ArrayList<IFile>();
-
-		/*
-		 * @see IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) throws CoreException {
-			if (delta == null)
-				return false;
-
-			switch (delta.getKind()) {
-				case IResourceDelta.CHANGED:
-					FileInfo info= (FileInfo) getFileInfo(delta.getResource());
-					if (info == null || info.fCanBeSaved)
-						break;
-					IFile file = (IFile) delta.getResource();
-					boolean isSynchronized= computeModificationStamp(file) == info.fModificationStamp;
-					if (((IResourceDelta.ENCODING & delta.getFlags()) != 0 && isSynchronized) || ((IResourceDelta.CONTENT & delta.getFlags()) != 0 && !isSynchronized)) {
-						changedFiles.add(file);
-					}
-					break;
-
-				case IResourceDelta.REMOVED:
-					if ((IResourceDelta.MOVED_TO & delta.getFlags()) != 0) {
-						info= (FileInfo) getFileInfo(delta.getResource());
-						if (info == null)
-							break;
-						final IPath path= delta.getMovedToPath();
-						movedFileToNewPathMap.put((IFile) delta.getResource(), path);
-					} else {
-						info= (FileInfo) getFileInfo(delta.getResource());
-						if (info != null && !info.fCanBeSaved) {
-							deletedFiles.add((IFile) delta.getResource());
-						}
-					}
-					break;
-			}
-
-			return true;
-		}
-		
-		public Runnable getRunnable() {
-			if(changedFiles.isEmpty() && movedFileToNewPathMap.isEmpty() && deletedFiles.isEmpty()) {
-				return null;
-			}
-			
-			return new Runnable() {
-
-				public void run() {
-					handleChanged(ResourceDeltaVisistor.this);
-				}
-				
-			};
-		}
-	}
-
-	/**
-	 * Posts the update code "behind" the running operation.
-	 *
-	 * @param runnable the update code
-	 */
-	protected void update(Runnable runnable) {
-		IWorkbench workbench= PlatformUI.getWorkbench();
-		IWorkbenchWindow[] windows= workbench.getWorkbenchWindows();
-		if (windows != null && windows.length > 0) {
-			Display display= windows[0].getShell().getDisplay();
-			display.asyncExec(runnable);
-		} else {
-			runnable.run();
-		}
-	}
-	
-	public void monitor(IFile file) {
-		FileInfo info= (FileInfo) fFileInfoMap.get(file);
-		if (info == null) {
-			info = new FileInfo(file);
-			info.fModificationStamp = computeModificationStamp(file);
-			fFileInfoMap.put(file, info);
-		}
-	}
-	
-	public void unmonitor(IFile file) {
-		fFileInfoMap.remove(file);
-	}
-	
-	protected void handleChanged(ResourceDeltaVisistor visitor) {
-		if(!visitor.changedFiles.isEmpty()) {
-			handleChangedFiles(visitor.changedFiles);
-		}
-		if(!visitor.movedFileToNewPathMap.isEmpty()) {
-			handleMovedFiles(visitor.movedFileToNewPathMap);
-		}
-		if(!visitor.deletedFiles.isEmpty()) {
-			handleDeletedFiles(visitor.deletedFiles);
-		}
-	}
-
-	protected Collection handleDeletedFiles(Collection<IFile> deletedFiles) {
-		return Collections.EMPTY_LIST;
-	}
-
-	protected Map<IFile, IPath> handleMovedFiles(Map<IFile, IPath> movedFileToNewPathMap) {
-		return Collections.EMPTY_MAP;
-	}
-
-	protected Collection handleChangedFiles(Collection<IFile> changedFiles) {
-		return Collections.EMPTY_LIST;
-	}
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramConstants.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramConstants.java
deleted file mode 100644
index f5eca96..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramConstants.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.diagram.core.util;
-
-import java.util.Locale;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.2
- *
- */
-public class DiagramConstants {
-
-	public static final String diagramDeleteActionID = "deleteDiagram"; //$NON-NLS-1$
-	public static final String Delete_Diagram_Element="deleteDiagramElement"; //$NON-NLS-1$
-	public static final String DELETE_DIAGRAM_ID= "org.eclipse.epf.diagram.core.actions.DeleteDiagramAction"; //$NON-NLS-1$
-	public static final String RESET_DIAGRAM_LAYOUT = "reset_diagram_layout"; //$NON-NLS-1$
-	public static final String REFRESH = "org.eclipse.epf.diagram.core.actions.RefreshAction"; //$NON-NLS-1$
-	public static final String DIAGRAM_ADD_MENU_GENERAL_GROUP = "addDiagramGeneralGroup"; //$NON-NLS-1$
-	public static final String REPARENT_COMMAND = "reparent command"; //$NON-NLS-1$
-	
-	public static final Color READ_ONLY_FONT_COLOR = ColorConstants.darkGreen;
-	public static final Color DEFAULT_FONT_COLOR = ColorConstants.black;
-	public static final Color SUPPRESSED_FONT_COLOR = ColorConstants.gray;
-	
-	
-	// For default fonts.
-	public static final String DEFAULT_FONT_NAME = getFontName();
-
-	public static final int DEFAULT_FONT_SIZE = 8;
-
-	public static final Font DEFAULT_FONT = new Font(null, DEFAULT_FONT_NAME,
-			DEFAULT_FONT_SIZE, java.awt.Font.PLAIN);
-
-	public static final Font DEFAULT_FONT_ITALIC = new Font(null,
-			DEFAULT_FONT_NAME, DEFAULT_FONT_SIZE, java.awt.Font.ITALIC);
-
-	public static final String WIN_2K = "Windows 2000"; //$NON-NLS-1$
-
-	public static final String getFontName() {
-		String name = "Arial"; //$NON-NLS-1$
-
-		// Corrupted Japanese characters in Activity Diagrams
-		String currentLocale = Platform.getNL();
-		if (currentLocale != null
-				&& currentLocale.startsWith(Locale.JAPANESE.getLanguage())) {
-			if (WIN_2K.equalsIgnoreCase(System.getProperty("os.name"))) { //$NON-NLS-1$
-				name = LibraryResources.roleDiagramFont_name_win32;
-			}
-		}
-		return name;
-	}
-	
-	public static final String getFontName(FontStyle style) {
-		String name = "Arial"; //$NON-NLS-1$
-		if (style != null) {	
-			name = style.getFontName();
-		}
-
-		// Corrupted Japanese characters in Activity Diagrams
-		String currentLocale = Platform.getNL();
-		if (currentLocale != null
-				&& currentLocale.startsWith(Locale.JAPANESE.getLanguage())) {
-			if (WIN_2K.equalsIgnoreCase(System.getProperty("os.name"))) { //$NON-NLS-1$
-				name = LibraryResources.roleDiagramFont_name_win32_ja;
-			}
-		}
-		return name;
-	}
-	
-	
-	/**
-	 * Get default font data
-	 * @return
-	 */
-	public static final FontData getDefaultFontData() {
-	
-		String fontName = DEFAULT_FONT_NAME;
-		
-		// Corrupted Japanese characters in Activity Diagrams
-		String currentLocale = Platform.getNL();
-		if (currentLocale != null
-				&& currentLocale.startsWith(Locale.JAPANESE.getLanguage())) {
-			if (WIN_2K.equalsIgnoreCase(System.getProperty("os.name"))) { //$NON-NLS-1$
-				fontName = LibraryResources.roleDiagramFont_name_win32_ja;
-			}
-		}
-		FontData fontData = new FontData(fontName, DEFAULT_FONT_SIZE, SWT.NORMAL);
-		return fontData;
-	}
-	
-	public static final String CREATE_START_NODE = "create_start_node"; //$NON-NLS-1$
-
-	public static final String CREATE_END_NODE = "create_end_node"; //$NON-NLS-1$
-
-	public static final String CREATE_JOIN_NODE = "create_join_node"; //$NON-NLS-1$
-
-	public static final String CREATE_DECISION_NODE = "create_decision_node"; //$NON-NLS-1$
-
-	public static final String CREATE_ACTIVITY = "create_activity"; //$NON-NLS-1$
-
-	public static final String CREATE_PHASE = "create_phase"; //$NON-NLS-1$
-
-	public static final String CREATE_ITERATION = "create_iteration"; //$NON-NLS-1$
-
-	public static final String CREATE_TASK_DESCRIPTOR = "create_task_descriptor"; //$NON-NLS-1$
-
-	public static final String CREATE_MILESTONE = "create_milestone"; //$NON-NLS-1$
-	
-	public static final String CREATE_FORK_NODE="create_fork_node"; //$NON-NLS-1$
-	
-	public static final String CREATE_MERGE_NODE="create_merge_node"; //$NON-NLS-1$
-	
-	public static final String CREATE_PARTITION ="create_partition"; //$NON-NLS-1$
-	
-	public static final String OPEN_ACTIVITY_DETAIL_DIAGRAM = "open_activity_detail_diagram"; //$NON-NLS-1$
-	
-	public static final String CREATE_WORK_PRODUCT_DESCRIPTOR_NODE="create_work_product_descriptor"; //$NON-NLS-1$
-	
-	public static final String CREATE_LINK = "create_diagram_link"; //$NON-NLS-1$
-
-	public static final String MOVE_ACTION = "move_action_id"; //$NON-NLS-1$
-
-	/**
-	 * Below defaults variables are to exclude from diagram.
-	 */
-	public static final int FILL_COLOR_EDEFAULT = 16777215;
-	public static final int LINE_COLOR_EDEFAULT = 11579568;
-	
-	public static final ImageDescriptor CONTROL_FLOW_IMAGE_DESCRIPTOR = DiagramCorePlugin.getDefault()
-										.getImageDescriptor("link.gif"); //$NON-NLS-1$
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramCoreUtil.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramCoreUtil.java
deleted file mode 100644
index 6582210..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramCoreUtil.java
+++ /dev/null
@@ -1,377 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.util;
-
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Translatable;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.core.bridge.ActivityDiagramAdapter;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.figures.WidenedWrapLabel;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.IDiagramEditorInputProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeTypes;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.uml2.uml.ActivityNode;
-
-import com.ibm.icu.text.BreakIterator;
-
-
-/**
- * Utility class to be used for EPF diagram
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * 
- * @since 1.2
- */
-public final class DiagramCoreUtil {
-	
-
-	/**
-	 * Set label properties for the given label figure
-	 * @param fig_0
-	 */
-	public static void setLabelProperties(WrapLabel labelFigure){
-		labelFigure.setFont(DiagramConstants.DEFAULT_FONT);
-		labelFigure.setIconAlignment(PositionConstants.TOP);
-		labelFigure.setLabelAlignment(PositionConstants.TOP);
-		labelFigure.setTextAlignment(PositionConstants.TOP);
-		labelFigure.setTextPlacement(PositionConstants.SOUTH);
-		labelFigure.setTextWrap(true);
-		labelFigure.setTextWrapAlignment(PositionConstants.CENTER);
-		
-	}
-	
-	/**
-	 * Set the default font for this preference store.
-	 * @param store IPreferenceStore
-	 */
-	public static void setDefaultFontPreference(IPreferenceStore store){
-		FontData fontDataArray[] =
-            JFaceResources.getDefaultFont().getFontData();
-        FontData fontData = fontDataArray[0];
-        fontData.setHeight(DiagramConstants.DEFAULT_FONT_SIZE);
-        fontData.setName(DiagramConstants.DEFAULT_FONT_NAME);
-        PreferenceConverter.setDefault(
-            store,
-            IPreferenceConstants.PREF_DEFAULT_FONT,
-            fontData);	
-	}
-	
-	public static String validStringForBreakdownElements(EditPart part, String txt){
-		Object obj = part.getModel();
-		if (obj instanceof Node) {
-			Node node = (Node) obj;
-			EObject umlE = node.getElement();
-			Object e = BridgeHelper.getMethodElement((EModelElement)umlE);
-			EObject umlA = node.getDiagram().getElement();
-			ActivityDiagramAdapter adapter = (ActivityDiagramAdapter)BridgeHelper.getNodeAdapter(umlA);
-			if(adapter != null){
-				if (e instanceof Activity) {
-					return TngUtil.checkWBSActivityPresentationName(e, txt, adapter.getSuppression());
-				}
-				else {
-					return TngUtil
-						.checkWorkBreakdownElementPresentationName(e,
-								txt, adapter.getSuppression());
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Gets font color for the given edit part. The color is depending on the state (suppression, read-only...)
-	 * of the semantic model element.
-	 * 
-	 * @param view
-	 * @return
-	 */
-	public static Color getFontColor(AbstractEditPart editPart) {
-		Object object = null;
-		
-		// By default publishing mode is false. If publish mode is set return black color.
-		if(LibraryUtil.PUBLISH_MODE){
-			return null;
-		}
-		
-		EditPartViewer viewer = editPart.getViewer();
-		if(viewer instanceof IDiagramEditorInputProvider) {
-			DiagramEditorInput input = ((IDiagramEditorInputProvider)viewer).getDiagramEditorInput();
-			// use the following commented out code only if suppressed elements should be shown in gray
-			//
-//			if(input != null && input.getWrapper() != null &&
-//					input.getWrapper().isInherited()) {
-//				Object model = editPart.getModel();
-//				if(model instanceof View) {
-//					Collection children = null;
-//					Diagram diagram = getDiagramEditPart(editPart).getDiagramView();
-//					String type = diagram.getType();
-//					if(DiagramManager.AD_kind.equals(type)) {
-//						DiagramAdapter da = ((DiagramAdapter)BridgeHelper.getNodeAdapter(diagram.getElement()));
-//						if(da != null) {
-//							ActivityDiagramAdapter adapter = new ActivityDiagramAdapter(input.getWrapper());
-//							adapter.setFilter(da.getFilter());
-//							adapter.setSuppression(da.getSuppression());
-//							children = adapter.getChildren();
-//						}
-//					}
-//					else if(DiagramManager.ADD_kind.equals(type) || DiagramManager.WPD_kind.equals(type)) {
-//						DiagramImpl d;
-//						if(DiagramManager.ADD_kind.equals(type)) {
-//							d = (DiagramImpl) ModelFactory.eINSTANCE.createActivityDetailDiagram();
-//						}
-//						else {
-//							d = (DiagramImpl) ModelFactory.eINSTANCE.createWorkProductDependencyDiagram();
-//						}						
-//						DiagramImpl diagramInUse = ((DiagramImpl)diagram.getElement());
-//						Suppression suppression = diagramInUse.getSuppression();
-//						if(suppression != null) {
-//							d.setWrapper(input.getWrapper());
-//							d.setFilter(diagramInUse.getFilter());
-//							d.setSuppression(diagramInUse.getSuppression());
-//							children = d.getChildren();
-//						}
-//					}
-//					if(children != null) {
-//						MethodElement e = BridgeHelper.getMethodElement((View) model);
-//						find_wrapper:
-//							for (Iterator iter = children.iterator(); iter.hasNext();) {
-//								Object child = (Object) iter.next();
-//								if(TngUtil.unwrap(child) == e) {
-//									object = child;
-//									break find_wrapper;
-//								}
-//							}
-//						if(object != null) {
-//							org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess(input.getWrapper());
-//							if(Suppression.getSuppression(proc).isSuppressed(object)) {
-//								return DiagramConstants.SUPPRESSED_FONT_COLOR;
-//							}
-//							else {
-//								return DiagramConstants.READ_ONLY_FONT_COLOR;
-//							}
-//						}
-//					}
-//				}
-//			}
-			
-			if(input != null && input.getWrapper() != null) {
-				return DiagramConstants.READ_ONLY_FONT_COLOR;
-			}
-		}
-		
-		Object model = editPart.getModel();
-		if(model instanceof View) {
-			return DiagramCoreUtil.getFontColor((View) model);
-		}
-	
-		return null;
-	}
-	
-	/**
-	 * Gets font color for the given view. The color is depending on the state (suppression, read-only...)
-	 * of the semantic model element.
-	 * 
-	 * @param view
-	 * @return
-	 */
-	private static Color getFontColor(View view) {
-//		if (BridgeHelper.isSuppressed(view)) {
-//			return DiagramConstants.SUPPRESSED_FONT_COLOR;
-//		}
-		if (BridgeHelper.isReadOnly(view)) {
-			return DiagramConstants.READ_ONLY_FONT_COLOR;
-		}
-//		else {
-//			return DiagramConstants.DEFAULT_FONT_COLOR;
-//		}
-		return null;
-	}
-	
-	public static DiagramEditPart getDiagramEditPart(EditPart editPart) {
-		for(;editPart != null && !(editPart instanceof DiagramEditPart); editPart = editPart.getParent());
-		return (DiagramEditPart) editPart;
-	}
-	
-	public static boolean isReadOnly(AbstractEditPart editPart){
-		Object model = editPart.getModel();
-		if(model instanceof View) {
-			return BridgeHelper.isReadOnly((View)model);
-		}
-		return false;
-	}
-	
-	public static boolean isSyncBar(EditPart part){
-		if(part instanceof IGraphicalEditPart){
-			View node = (View)part.getModel();
-			Object obj = node.getElement();
-			if(obj instanceof ActivityNode){
-				return BridgeHelper.isSynchBar((ActivityNode)obj);
-			}
-		}
-		return false;
-	}
-	
-	public static String wrap(String s, int wrapWidth) {
-		String wrapped = ""; //$NON-NLS-1$
-		BreakIterator bi = BreakIterator.getLineInstance();
-		String remaining = s;
-		while (true) {
-			if (remaining.length() <= wrapWidth) {
-				wrapped += remaining;
-				break;
-			} else {
-				bi.setText(remaining);
-				int pos = bi.following(wrapWidth);
-				if (pos == BreakIterator.DONE) {
-					wrapped += remaining;
-					break;
-				} else {
-					if (pos >= remaining.length()) {
-						wrapped += remaining;
-						break;
-					} else {
-						wrapped += remaining.substring(0, pos) + "\n"; //$NON-NLS-1$
-						remaining = remaining.substring(pos);
-					}
-				}
-			}
-		}
-		return wrapped;
-	}
-	
-	/**
-	 * Set the default font for this preference store.
-	 * @param store IPreferenceStore
-	 */
-	public static void setDefaultLineStyle(IPreferenceStore store){
-        PreferenceConverter.setDefault(
-            store,
-            IPreferenceConstants.PREF_LINE_COLOR,
-            PreferenceConverter.COLOR_DEFAULT_DEFAULT);	
-	}
-	
-	/**
-	 * Return text height based on text, font and width of boundries text is in
-	 * @param text
-	 * @param fontStyle
-	 * @param width
-	 * @return
-	 */
-	public static int getTextHeight(String text, FontStyle fontStyle, int width) {
-		Font font = null;
-		String fontName = null;
-		int fontHeight = 0;
-		
-		if (fontStyle != null) {
-			fontName = fontStyle.getFontName();
-			fontHeight = fontStyle.getFontHeight();
-			if (fontName == null)
-				fontName = DiagramConstants.getFontName();
-			if (fontHeight == 0)
-				fontHeight = DiagramConstants.DEFAULT_FONT_SIZE;
-			
-			font = new Font(null, fontName, fontHeight, java.awt.Font.PLAIN);
-		}
-		else 
-			font = DiagramConstants.DEFAULT_FONT;
-
-		Dimension d;
-		try {
-			d = FigureUtilities.getTextExtents(text, font);
-		}
-		finally {
-			if(font != null && font != DiagramConstants.DEFAULT_FONT) {
-				font.dispose();
-			}
-		}
-
-		int noOfLines = 0;
-		if (d != null && d.width > 0) {
-			int div = d.width / width;
-			int mod = d.width % width;
-			if (mod != 0)
-				div++;
-			noOfLines = div;
-			return noOfLines * fontHeight;
-		}
-		return 0;
-	}
-
-	public static Dimension getTextSizeInWrapLabel(String text, Font f, int wHint, int hHint, IMapMode mapMode) {
-		class MyWrapLabel extends WidenedWrapLabel implements IMapMode {
-			private IMapMode mapMode;
-
-			public MyWrapLabel(IMapMode mapMode) {
-				this.mapMode = mapMode != null ? mapMode : MapModeTypes.IDENTITY_MM;
-			}
-
-			public int DPtoLP(int deviceUnit) {
-				return mapMode.DPtoLP(deviceUnit);
-			}
-
-			public Translatable DPtoLP(Translatable t) {
-				return mapMode.DPtoLP(t);
-			}
-
-			public int LPtoDP(int logicalUnit) {
-				return mapMode.LPtoDP(logicalUnit);
-			}
-
-			public Translatable LPtoDP(Translatable t) {
-				return mapMode.LPtoDP(t);
-			}
-			
-		};
-		MyWrapLabel label = new MyWrapLabel(mapMode);
-		DiagramCoreUtil.setLabelProperties(label);		
-		label.setText(text);
-		if(f != null) {
-			label.setFont(f);
-		}
-		return label.getTextSize(wHint, hHint);
-	}
-	
-	public static Color getLinkOverrideColor(Edge edge) {
-		return !LibraryUtil.PUBLISH_MODE && DiagramCoreValidation.isReadOnly(edge)? 
-				DiagramConstants.READ_ONLY_FONT_COLOR : null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramCoreValidation.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramCoreValidation.java
deleted file mode 100644
index 567ae8e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/DiagramCoreValidation.java
+++ /dev/null
@@ -1,504 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.core.util;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.internal.localstore.IsSynchronizedVisitor;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.bridge.NodeAdapter;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlNode;
-import org.eclipse.uml2.uml.FinalNode;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.InitialNode;
-import org.eclipse.uml2.uml.JoinNode;
-
-/**
- * Validating routines for diagram editing
- * 
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class DiagramCoreValidation {
-
-	private static final String errMsg_CanNotConnect = DiagramCoreResources.DiagramValidation_err_cannot_connect_text; //$NON-NLS-1$
-
-	private static final String errMsg_SamePredAndSucc = DiagramCoreResources.DiagramValidation_err_samepredandsuc_text; //$NON-NLS-1$
-
-	private static final String errMsg_CanNotDelete = DiagramCoreResources.DiagramValidation_err_cannot_delete_text; //$NON-NLS-1$
-
-	
-	public static String isTargetReadonly(EditPart part){
-		View view = (View)part.getModel();
-		if(BridgeHelper.isReadOnly(view)) return errMsg_CanNotConnect;
-		return null;
-	}
-	
-	public static String canConnect(EditPart targetEditPart, EObject sourceElement, EObject targetElement){
-		
-		if(targetEditPart == null) return errMsg_CanNotConnect;
-		
-		EditPart part = targetEditPart.getParent();
-		Diagram diagram = null;
-		while(part != null && !(part instanceof DiagramEditPart)){
-				part  = part.getParent();
-		}
-		if(part instanceof DiagramEditPart){
-			diagram = (Diagram)((DiagramEditPart)part).getModel();
-		}
-
-		if(diagram == null) return errMsg_CanNotConnect;
-		return checkConnect(diagram,  sourceElement, targetElement);
-	}
-	
-	public static String checkConnect(Diagram diagram, EObject sourceElement, EObject targetElement){
-		switch(DiagramHelper.getDiagramType(diagram)){
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			if(alwaysAllowed(sourceElement, targetElement)) {
-				return null;
-			}
-			
-			// If target Diagram is read-only - do not connect
-			if(BridgeHelper.isReadOnly(diagram)) return errMsg_CanNotConnect;
-				
-			NodeAdapter sourceAdapter = BridgeHelper.getNodeAdapter(sourceElement);
-			NodeAdapter targetAdapter = BridgeHelper.getNodeAdapter(targetElement);
-			
-			// if adapters of source and target is null - no connect.
-			if(sourceAdapter == null || targetAdapter == null) return errMsg_CanNotConnect;
-			
-			Diagram sourceDiagram = sourceAdapter.getView().getDiagram();
-			
-			// If source and target diagrams not equal - do not connect.
-			if (!diagram.equals(sourceDiagram))
-								return errMsg_CanNotConnect;
-
-			AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-					.getWBS_ComposedAdapterFactory();
-			Object adapter = adapterFactory.adapt(BridgeHelper.getMethodElement(sourceDiagram)
-					, ITreeItemContentProvider.class);
-			Object proc = null;
-			if (adapter instanceof IBSItemProvider) {
-				proc = ((IBSItemProvider) adapter).getTopItem();
-			}
-			// get all breakdown elements in this process
-			//
-			List<Object> allElements = new ArrayList<Object>();
-			for (Iterator iter = new AdapterFactoryTreeIterator(adapterFactory,
-					proc); iter.hasNext();) {
-				Object obj = iter.next();
-				allElements.add(TngUtil.unwrap(obj));
-			}
-			if(proc != null){
-				EObject source = sourceAdapter.getElement();
-
-				EObject target = null;
-				if (targetAdapter != null) {
-					target = targetAdapter.getElement();
-				}
-				if (source instanceof 
-						WorkBreakdownElement) {
-					if (target instanceof WorkBreakdownElement) {
-						if (ProcessUtil.checkCircular(
-								(WorkBreakdownElement) target,
-								(WorkBreakdownElement) source, allElements))
-							return errMsg_SamePredAndSucc;
-
-						if (targetAdapter.isTargetReadOnly())
-							return errMsg_CanNotConnect;
-					} else {
-						Collection<ActivityNode> actNodes = new ArrayList<ActivityNode>();
-						BridgeHelper.getSuccessorNodes(actNodes,
-								(ActivityNode) targetElement);
-						for (ActivityNode node : actNodes) {
-							if (BridgeHelper.getNodeAdapter(node).isTargetReadOnly())
-								return errMsg_CanNotConnect;
-							if (ProcessUtil.checkCircular(
-									(WorkBreakdownElement) BridgeHelper
-											.getMethodElement(node),
-									(WorkBreakdownElement) source, allElements)) {
-								return errMsg_SamePredAndSucc;
-							}
-						}
-					}
-				} else {
-					if (target instanceof WorkBreakdownElement) {
-						Collection<ActivityNode> srcNodes = new ArrayList<ActivityNode>();
-						BridgeHelper.getPredecessorNodes(srcNodes,
-								(ActivityNode) sourceElement);
-						if (!srcNodes.isEmpty()) {
-							if (targetAdapter.isTargetReadOnly())
-								return errMsg_CanNotConnect;
-							for (ActivityNode predNode : srcNodes) {
-								MethodElement pred = BridgeHelper
-										.getMethodElement(predNode);
-								if (ProcessUtil.checkCircular(
-										(WorkBreakdownElement) target,
-										(WorkBreakdownElement) pred,
-										allElements)) {
-									return errMsg_SamePredAndSucc;
-								}
-							}
-						}
-					} else {
-						if (checkSyncBarCircularLooop((ActivityNode)sourceElement,
-								(ActivityNode) targetElement) != null) {
-							return errMsg_CanNotConnect;
-						}
-
-						// should not allow incoming connection to start node
-						// and FreeText.
-						if (targetElement instanceof InitialNode) {
-							return errMsg_CanNotConnect;
-						}
-
-						Collection<ActivityNode> srcNodes = new ArrayList<ActivityNode>(); 
-						BridgeHelper.getPredecessorNodes(srcNodes, (ActivityNode) sourceElement);
-						if (!srcNodes.isEmpty()) {
-							Collection<ActivityNode> targetNodes = new ArrayList<ActivityNode>();
-							BridgeHelper.getSuccessorNodes(targetNodes,
-									(ActivityNode) target);
-							for (ActivityNode node : targetNodes) {
-								NodeAdapter nodeAdapter = BridgeHelper
-										.getNodeAdapter(node);
-								if (nodeAdapter.isTargetReadOnly())
-									return errMsg_CanNotConnect;
-								WorkBreakdownElement succ = (WorkBreakdownElement) nodeAdapter
-										.getElement();
-								for (ActivityNode prednode : srcNodes) {
-									NodeAdapter predAdapter = BridgeHelper
-											.getNodeAdapter(prednode);
-									WorkBreakdownElement pred = (WorkBreakdownElement) predAdapter
-											.getElement();
-									if (ProcessUtil.checkCircular(succ, pred,
-											allElements)) {
-										return errMsg_SamePredAndSucc;
-									}
-								}
-							}
-						}
-					}
-				}
-				
-			}
-		}
-			
-		return null;
-	}
-	
-	/*
-	 * To avoid circular looping between synchronization bars. If SycnBar1 ->
-	 * SyncBar2 (connected) then SyncBar2 -> SyncBar1 cannot connect. if
-	 * syncbar1 -> syncbar2->syncbar3 then syncbar3 -> syncbar1 disallowed.
-	 * 
-	 */
-	public static String checkSyncBarCircularLooop(ActivityNode sNode,
-			ActivityNode tNode) {
-		List list = tNode.getOutgoings();
-		if (!list.isEmpty() && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				ActivityEdge link = (ActivityEdge) iterator.next();
-				ActivityNode typednode = link.getTarget();
-				if (sNode.equals(typednode))
-					return errMsg_CanNotConnect;
-				if (typednode instanceof ControlNode) {
-					return checkSyncBarCircularLooop(sNode,
-							(ControlNode)typednode);
-				}
-			}
-		}
-		return null;
-	}
-	
-	/*
-	 * Method to Check if SyncBar inComming connections have 
-	 * any source is a readonly. 
-	 * @return
-	 */
-	public static String checkSyncBarIncomingLinks(ActivityNode typedNode){
-		for (Iterator iter = typedNode.getIncomings().iterator(); iter.hasNext();) {
-			ActivityEdge link = (ActivityEdge) iter.next();
-			ActivityNode source = link.getSource();
-			NodeAdapter adapter = BridgeHelper.getNodeAdapter(source);
-			if (adapter != null) {
-				if(adapter.getElement() instanceof WorkBreakdownElement){
-					if(adapter.isTargetReadOnly())
-						return errMsg_CanNotDelete;
-				}else if(source instanceof ControlNode){
-					if(source instanceof ForkNode || source instanceof JoinNode)
-						if(checkSyncBarIncomingLinks(source)!= null)
-							return errMsg_CanNotDelete;
-				}
-			}
-		}
-		return null;
-	}
-	/*
-	 *Method to check if synchronization bar outgoing connection
-	 *has any target is readonly.  
-	 */
-	public static String checkSyncBarOutgoingLinks(ActivityNode typedNode){
-		for (Iterator iter = typedNode.getOutgoings().iterator(); iter.hasNext();) {
-			ActivityEdge link = (ActivityEdge) iter.next();
-			ActivityNode target = link.getTarget();
-			NodeAdapter adapter = BridgeHelper.getNodeAdapter(target);
-			if (adapter != null) {
-				if(adapter.getElement() instanceof WorkBreakdownElement){
-					if(adapter.isTargetReadOnly())
-						return errMsg_CanNotDelete;
-				}else if(target instanceof ControlNode){
-					if(target instanceof ForkNode || target instanceof JoinNode)
-						if(checkSyncBarOutgoingLinks(target)!= null)
-							return errMsg_CanNotDelete;
-				}
-			}
-		}
-		return null;
-	}
-	
-	
-	public static String checkDelete(Node node) {
-		if (BridgeHelper.isReadOnly(node))
-			return errMsg_CanNotDelete;
-		Diagram diagram = node.getDiagram();
-		if (diagram instanceof ActivityDiagram) {
-			if (node.getElement() instanceof ControlNode) {
-				
-				Collection<ActivityNode> targetNodes = new ArrayList<ActivityNode>(); 
-				BridgeHelper.getSuccessorNodes(targetNodes, (ActivityNode)node.getElement());
-						
-				for (ActivityNode targetNode : targetNodes) {
-					NodeAdapter adapter = BridgeHelper.getNodeAdapter(targetNode);
-					if(adapter != null && adapter.isTargetReadOnly()){
-						return errMsg_CanNotDelete;
-					}
-				}
-			}
-		} else if (diagram instanceof ActivityDetailDiagram) {
-			if (node.getElement() instanceof RoleNode) {
-				return errMsg_CanNotDelete;
-			}
-		}
-		return null;
-	}
-	
-	public static String checkReconnect(Node source, Node target, Edge link) {
-		if (source.getDiagram() instanceof ActivityDiagram) {
-			if (link.getTarget() != null) {
-				if (BridgeHelper.isReadOnly(link.getTarget())) {
-					return errMsg_CanNotConnect;
-				} else {
-					if (link.getTarget() instanceof TypedNode) {
-						Collection targetNodes = GraphicalDataHelper
-								.getTargetNodes((TypedNode) link.getTarget(),
-										WorkBreakdownElementNode.class);
-						for (Iterator iter = targetNodes.iterator(); iter
-								.hasNext();) {
-							Node node = (Node) iter.next();
-							if (BridgeHelper.isReadOnly(node)) {
-								return errMsg_CanNotConnect;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		return checkConnect(source, target, link);
-	}
-	
-	/*
-	 * Method will not allow multiple link between two nodes. Needs to call
-	 * CreakLinkCommand and ReconnectLinkCommand. Any action on a Link should
-	 * call this checkConnect(Node source, Node target, Link link) before allow
-	 * to connect.
-	 */
-	public static String checkConnect(Node source, Node target, Edge link) {
-
-		if (source == target && !(BridgeHelper.getMethodElement(source) instanceof Activity)) {
-			return errMsg_CanNotConnect;
-		}
-
-		List links = source.getTargetEdges();
-		if (links != null) {
-			// This is need for reconnect to same target node.
-			if (links.contains(link)) {
-				if (link.getTarget().equals(target)) {
-					return null;
-				}
-			}
-		// This is need for new connect and reconnect to different target node.
-		for (Iterator iter = links.iterator(); iter.hasNext();) {
-			Link linkx = (Link) iter.next();
-			Object linkxtarget = linkx.getTarget();
-			if (linkxtarget != null && linkxtarget.equals(target)) {
-				return errMsg_CanNotConnect;
-				}
-			}
-		}
-		return checkConnect(source.getDiagram(), source.getElement(), target.getElement());
-	}
-	
-	private static boolean alwaysAllowed(Object sourceElement, Object targetElement) {
-		return sourceElement instanceof InitialNode 
-		|| targetElement instanceof FinalNode
-		|| (sourceElement instanceof ControlNode && !BridgeHelper.isSynchBar((ControlNode)sourceElement))
-		|| (targetElement instanceof ControlNode && !BridgeHelper.isSynchBar((ControlNode)targetElement));
-	}
-	
-	public static String checkDelete(Edge edge) {
-
-		View source = edge.getSource();
-		View target = edge.getTarget();
-
-		if(target != null){
-			Diagram diagram = target.getDiagram();
-			switch(DiagramHelper.getDiagramType(diagram)){
-			case IDiagramManager.ACTIVITY_DIAGRAM:				
-				EObject sourceElement = source.getElement();
-				EObject targetElement = target.getElement();
-				if(alwaysAllowed(sourceElement, targetElement)) {
-					return null;
-				}
-				// check if this edge is representing any work order
-				//
-				if (sourceElement instanceof ActivityNode
-						&& BridgeHelper.getMethodElement(sourceElement) == null) {
-					Collection<ActivityNode> actNodes = new ArrayList<ActivityNode>();
-					BridgeHelper.getSourceNodes(actNodes,
-							(ActivityNode) sourceElement,
-							WorkBreakdownElement.class);
-					if (actNodes.isEmpty()) {
-						return null;
-					}
-				}
-				
-				// the edge does represent a work order
-				
-				if(BridgeHelper.isReadOnly(target)){
-					return errMsg_CanNotDelete;
-				}
-				
-				if(targetElement instanceof ActivityNode){
-					// target does not represent a work breakdown element
-					// disallow deletion of the edge if one of the target nodes of the target is read-only or inherited
-					//
-					Collection<ActivityNode> actNodes = new ArrayList<ActivityNode>();
-					BridgeHelper.getSuccessorNodes(actNodes, (ActivityNode) targetElement);
-					for (ActivityNode activityNode : actNodes) {
-						View view = BridgeHelper.getView(diagram, activityNode);
-						if(view != null && BridgeHelper.isReadOnly(view)) {
-							return errMsg_CanNotDelete;
-						}
-					}
-				}
-				
-				if(targetElement instanceof ActivityNode && BridgeHelper.isSynchBar((ActivityNode)targetElement)){
-					return checkSyncBarOutgoingLinks((ActivityNode)targetElement);
-				}
-				return null;
-			case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-				return errMsg_CanNotDelete;
-				
-			case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-				if(BridgeHelper.isReadOnly(target))
-					return errMsg_CanNotDelete;
-				return null;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Check to see link is readonly.
-	 */
-	public static boolean isReadOnly(Edge edge) {
-		
-		View target = edge.getTarget();
-		View source = edge.getSource();
-		if (target != null
-				&& target.getDiagram().getElement() instanceof ActivityDetailDiagram) {
-			if(source != null){
-				Object sourceElement = source.getElement();
-				if(sourceElement != null && sourceElement instanceof TaskNode
-						&& ((TaskNode)sourceElement).isReadOnly()){
-					return true;
-				}
-			}
-			if(target != null){
-				Object targetElement = target.getElement();
-				if(targetElement != null && targetElement instanceof TaskNode
-						&& ((TaskNode)targetElement).isReadOnly()){
-					return true;
-				}
-			}
-		}else{
-			return checkDelete(edge) != null;
-		}
-		return false;
-	}
-	
-	/**
-	 * Check if any duplicate links between two ends already exists.
-	 * 	 
-	 * */
-	public static boolean isDuplicateRelationship(EObject source, EObject target) {
-		EObject container = source.eContainer();
-		if (container instanceof org.eclipse.uml2.uml.Activity) {
-			org.eclipse.uml2.uml.Activity activity = (org.eclipse.uml2.uml.Activity) container;
-			List<ActivityEdge> list = activity.getEdges();
-			for (Iterator<ActivityEdge> iter = list.iterator(); iter.hasNext();) {
-				ActivityEdge element = (ActivityEdge) iter.next();
-				if ((element.getSource() == source)
-						&& element.getTarget() == target) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/ValidatingTextDirectEditManager.java b/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/ValidatingTextDirectEditManager.java
deleted file mode 100644
index 8ccac84..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.core/src/org/eclipse/epf/diagram/core/util/ValidatingTextDirectEditManager.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.core.util;
-
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.diagram.core.DiagramCorePlugin;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.uml2.uml.ActivityNode;
-
-/**
- * Manages and validates the direct editing of editpart. Prompts accordingly.  
- * Should implement abstract methods when extends.
- */
-public abstract class ValidatingTextDirectEditManager extends TextDirectEditManager {
-
-	public ValidatingTextDirectEditManager(GraphicalEditPart source, Class editorType, CellEditorLocator locator) {
-		super(source, editorType, locator);
-	}
-	
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#commit()
-	 */
-	protected void commit() {
-		String msg = validate((String) getCellEditor().getValue());
-		if (msg != null) {
-			bringDown(false);
-			Display.getCurrent().asyncExec(
-					new PromptEdit(this, msg));
-			return;
-		}
-		super.commit();
-	}
-	
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		bringDown(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown(boolean check) {
-		super.bringDown();
-		if (check) {
-			Node node = (Node) getEditPart().getModel();
-			EObject aNode = node.getElement();
-			String name = null;
-			if (aNode instanceof ActivityNode) {
-				name = ((ActivityNode)aNode).getName();
-				Object wbelement = BridgeHelper.getMethodElement((EModelElement)aNode);
-				if (wbelement instanceof Activity
-						&& ProcessUtil
-								.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
-					name = ProcessUtil
-							.getPresentationName((BreakdownElement) wbelement);
-				}
-
-			}else if(aNode instanceof NamedNode){
-				NamedNode nameNode = (NamedNode) aNode;
-				name = nameNode.getName();
-				if (node instanceof WorkBreakdownElementNode) {
-					Object wbelement = nameNode.getObject();
-					if (wbelement instanceof Activity
-							&& ProcessUtil
-									.isExtendingOrLocallyContributing((BreakdownElement) wbelement)) {
-						name = ProcessUtil
-								.getPresentationName((BreakdownElement) wbelement);
-					}
-
-				}
-			}
-			
-			if (name == null || name.trim().length() == 0) {
-				Display.getCurrent().asyncExec(
-						new PromptEdit(this,DiagramCoreResources.err_name_empty)); //$NON-NLS-1$
-			}
-		}
-	}
-
-
-	static class PromptEdit implements Runnable {
-
-		private ValidatingTextDirectEditManager manager;
-
-		private String msg;
-
-		PromptEdit(ValidatingTextDirectEditManager manager, String msg) {
-			this.manager = manager;
-			this.msg = msg;
-		}
-
-		/**
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			String title = DiagramCoreResources.diagram_errorDialog_title;
-			MsgDialog dialog = DiagramCorePlugin.getDefault().getMsgDialog();
-			dialog.displayError(title, msg); //$NON-NLS-1$
-			manager.performDirectEdit();
-		}
-
-	}
-	
-	/**
-	 * Checks if the given text is valid. Subclasses can override this method.
-	 * 
-	 * @param txt
-	 * @return null if the given text is valid, an error message otherwise
-	 */
-	protected abstract String validate(String txt);
-	
-	protected abstract void performDirectEdit();
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/.classpath b/1.5/plugins/org.eclipse.epf.diagram.edit/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/.project b/1.5/plugins/org.eclipse.epf.diagram.edit/.project
deleted file mode 100644
index 7e09fda..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.diagram.edit</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.diagram.edit/META-INF/MANIFEST.MF
deleted file mode 100644
index 6ce7195..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.diagram.edit; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.epf.diagram.model.provider.DiagramEditPlugin$Implementation
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.epf.diagram.model.provider
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.edit;visibility:=reexport,
- org.eclipse.epf.uma;visibility:=reexport,
- org.eclipse.epf.uma.edit;visibility:=reexport,
- org.eclipse.epf.diagram.model,
- org.eclipse.draw2d
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/build.properties b/1.5/plugins/org.eclipse.epf.diagram.edit/build.properties
deleted file mode 100644
index debd4f0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-# <copyright>
-# </copyright>
-#
-# $Id: build.properties,v 1.1 2008/01/15 08:53:18 jtham Exp $
-
-bin.includes = .,\
-               icons/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties
-jars.compile.order = .
-source.. = src/
-output.. = bin/
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_ActivityDetailDiagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_ActivityDetailDiagram.gif
deleted file mode 100644
index 1e49376..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_ActivityDetailDiagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_ActivityDiagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_ActivityDiagram.gif
deleted file mode 100644
index f2b0a1e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_ActivityDiagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_Diagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_Diagram.gif
deleted file mode 100644
index d8b262a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_Diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_NamedNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_NamedNode.gif
deleted file mode 100644
index 845e9f4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_NamedNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_RoleNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_RoleNode.gif
deleted file mode 100644
index d82f226..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_RoleNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_RoleTaskComposite.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_RoleTaskComposite.gif
deleted file mode 100644
index 9dc67ff..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_RoleTaskComposite.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_TaskNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_TaskNode.gif
deleted file mode 100644
index 9dc67ff..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_TaskNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_TypedNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_TypedNode.gif
deleted file mode 100644
index 7387309..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_TypedNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkBreakdownElementNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkBreakdownElementNode.gif
deleted file mode 100644
index c970d5d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkBreakdownElementNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductComposite.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductComposite.gif
deleted file mode 100644
index b93b3d2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductComposite.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductDependencyDiagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductDependencyDiagram.gif
deleted file mode 100644
index bace122..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductDependencyDiagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductDescriptorNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductDescriptorNode.gif
deleted file mode 100644
index 1230fa4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductDescriptorNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductNode.gif
deleted file mode 100644
index 7be6ec4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNodeContainer_nodes_WorkProductNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNode_outgoingConnections_Link.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNode_outgoingConnections_Link.gif
deleted file mode 100644
index 889f3af..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/ctool16/CreateNode_outgoingConnections_Link.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/ActivityDetailDiagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/ActivityDetailDiagram.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/ActivityDetailDiagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/ActivityDiagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/ActivityDiagram.gif
deleted file mode 100644
index 5915591..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/ActivityDiagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/Diagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/Diagram.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/Diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/Link.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/Link.gif
deleted file mode 100644
index 18f408c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/Link.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/NamedNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/NamedNode.gif
deleted file mode 100644
index a17dc7d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/NamedNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/RoleNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/RoleNode.gif
deleted file mode 100644
index cb1755a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/RoleNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/RoleTaskComposite.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/RoleTaskComposite.gif
deleted file mode 100644
index e4b530e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/RoleTaskComposite.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/TaskNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/TaskNode.gif
deleted file mode 100644
index e4b530e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/TaskNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/TypedNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/TypedNode.gif
deleted file mode 100644
index afb82ea..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/TypedNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkBreakdownElementNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkBreakdownElementNode.gif
deleted file mode 100644
index c00aedf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkBreakdownElementNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductComposite.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductComposite.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductComposite.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductDependencyDiagram.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductDependencyDiagram.gif
deleted file mode 100644
index 94c953e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductDependencyDiagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductDescriptorNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductDescriptorNode.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductDescriptorNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductNode.gif b/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductNode.gif
deleted file mode 100644
index badaab0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/icons/full/obj16/WorkProductNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/plugin.properties b/1.5/plugins/org.eclipse.epf.diagram.edit/plugin.properties
deleted file mode 100644
index 0e95b25..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/plugin.properties
+++ /dev/null
@@ -1,85 +0,0 @@
-# <copyright>
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-# </copyright>
-#
-# $Id: plugin.properties,v 1.1 2008/01/15 08:53:18 jtham Exp $
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-# NLS_MESSAGEFORMAT_VAR
-
-pluginName=EPF Diagram Edit Support
-providerName=Eclipse.org
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_text3 = {1}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_Diagram_type = Diagram
-_UI_Link_type = Link
-_UI_LinkedObject_type = Linked Object
-_UI_NamedNode_type = Named Node
-_UI_Node_type = Node
-_UI_ActivityDiagram_type = Activity Diagram
-_UI_TypedNode_type = Typed Node
-_UI_WorkProductDependencyDiagram_type = Work Product Dependency Diagram
-_UI_WorkProductNode_type = Work Product Node
-_UI_ActivityDetailDiagram_type = Activity Detail Diagram
-_UI_NodeContainer_type = Node Container
-_UI_RoleNode_type = Role Node
-_UI_RoleTaskComposite_type = Role Task Composite
-_UI_TaskNode_type = Task Node
-_UI_WorkProductDescriptorNode_type = Work Product Descriptor Node
-_UI_WorkBreakdownElementNode_type = Work Breakdown Element Node
-_UI_WorkProductComposite_type = Work Product Composite
-_UI_Unknown_type = Object
-
-_UI_Unknown_datatype= Value
-
-_UI_Link_source_feature = Source
-_UI_Link_target_feature = Target
-_UI_Link_bendpoints_feature = Bendpoints
-_UI_Link_sourceEndPoint_feature = Source End Point
-_UI_Link_targetEndPoint_feature = Target End Point
-_UI_LinkedObject_linkedElement_feature = Linked Element
-_UI_LinkedObject_object_feature = Object
-_UI_NamedNode_name_feature = Name
-_UI_Node_location_feature = Location
-_UI_Node_width_feature = Width
-_UI_Node_height_feature = Height
-_UI_Node_incomingConnections_feature = Incoming Connections
-_UI_Node_outgoingConnections_feature = Outgoing Connections
-_UI_Node_readOnly_feature = Read Only
-_UI_TypedNode_type_feature = Type
-_UI_WorkProductNode_type_feature = Type
-_UI_NodeContainer_nodes_feature = Nodes
-_UI_WorkProductComposite_type_feature = Type
-_UI_Unknown_feature = Unspecified
-
-_UI_Link_name_feature = Name
-_UI_ActivityDetailDiagram_autoLayout_feature = Auto Layout
-_UI_TaskNode_index_feature = Index
-_UI_RoleTaskComposite_rowIndex_feature = Row Index
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/plugin.xml b/1.5/plugins/org.eclipse.epf.diagram.edit/plugin.xml
deleted file mode 100644
index 22c50d0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/plugin.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- <copyright>
- </copyright>
-
- $Id: plugin.xml,v 1.1 2008/01/15 08:53:18 jtham Exp $
--->
-
-<plugin>
-    
-  <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-    <factory 
-       uri = "http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore" 
-       class = "org.eclipse.epf.diagram.model.provider.ModelItemProviderAdapterFactory" 
-       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/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ActivityDetailDiagramItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ActivityDetailDiagramItemProvider.java
deleted file mode 100644
index b623c47..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ActivityDetailDiagramItemProvider.java
+++ /dev/null
@@ -1,174 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ActivityDetailDiagramItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.ActivityDetailDiagram;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.ActivityDetailDiagram} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ActivityDetailDiagramItemProvider
-	extends DiagramItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityDetailDiagramItemProvider(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);
-
-			addAutoLayoutPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Auto Layout feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAutoLayoutPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ActivityDetailDiagram_autoLayout_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ActivityDetailDiagram_autoLayout_feature", "_UI_ActivityDetailDiagram_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ActivityDetailDiagram.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ActivityDetailDiagram")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((ActivityDetailDiagram)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ActivityDetailDiagram_type") : //$NON-NLS-1$
-			getString("_UI_ActivityDetailDiagram_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(ActivityDetailDiagram.class)) {
-			case ModelPackage.ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ActivityDiagramItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ActivityDiagramItemProvider.java
deleted file mode 100644
index c523eb2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ActivityDiagramItemProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ActivityDiagramItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.ActivityDiagram;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.ActivityDiagram} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ActivityDiagramItemProvider
-	extends DiagramItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityDiagramItemProvider(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 ActivityDiagram.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ActivityDiagram")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((ActivityDiagram)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ActivityDiagram_type") : //$NON-NLS-1$
-			getString("_UI_ActivityDiagram_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/DiagramEditPlugin.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/DiagramEditPlugin.java
deleted file mode 100644
index 11d80bb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/DiagramEditPlugin.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DiagramEditPlugin.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-import org.eclipse.emf.common.EMFPlugin;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-
-/**
- * This is the central singleton for the Diagram edit plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public final class DiagramEditPlugin extends EMFPlugin {
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final DiagramEditPlugin INSTANCE = new DiagramEditPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramEditPlugin() {
-		super
-		  (new ResourceLocator [] {
-		     UmaEditPlugin.INSTANCE,
-		   });
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static class Implementation extends EclipsePlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/DiagramItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/DiagramItemProvider.java
deleted file mode 100644
index 2f66119..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/DiagramItemProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DiagramItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.Diagram;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.Diagram} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DiagramItemProvider
-	extends NodeContainerItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramItemProvider(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 Diagram.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/Diagram")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((Diagram)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Diagram_type") : //$NON-NLS-1$
-			getString("_UI_Diagram_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/LinkItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/LinkItemProvider.java
deleted file mode 100644
index 8cbec20..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/LinkItemProvider.java
+++ /dev/null
@@ -1,265 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: LinkItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.Link} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LinkItemProvider
-	extends LinkedObjectItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LinkItemProvider(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);
-
-			addNamePropertyDescriptor(object);
-			addTargetPropertyDescriptor(object);
-			addBendpointsPropertyDescriptor(object);
-			addSourceEndPointPropertyDescriptor(object);
-			addTargetEndPointPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Link_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Link_name_feature", "_UI_Link_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.LINK__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Target feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTargetPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Link_target_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Link_target_feature", "_UI_Link_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.LINK__TARGET,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Bendpoints feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBendpointsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Link_bendpoints_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Link_bendpoints_feature", "_UI_Link_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.LINK__BENDPOINTS,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Source End Point feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSourceEndPointPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Link_sourceEndPoint_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Link_sourceEndPoint_feature", "_UI_Link_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.LINK__SOURCE_END_POINT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Target End Point feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTargetEndPointPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Link_targetEndPoint_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Link_targetEndPoint_feature", "_UI_Link_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.LINK__TARGET_END_POINT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns Link.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/Link")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((Link)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Link_type") : //$NON-NLS-1$
-			getString("_UI_Link_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(Link.class)) {
-			case ModelPackage.LINK__NAME:
-			case ModelPackage.LINK__BENDPOINTS:
-			case ModelPackage.LINK__SOURCE_END_POINT:
-			case ModelPackage.LINK__TARGET_END_POINT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/LinkedObjectItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/LinkedObjectItemProvider.java
deleted file mode 100644
index 64ec820..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/LinkedObjectItemProvider.java
+++ /dev/null
@@ -1,151 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: LinkedObjectItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.LinkedObject} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LinkedObjectItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LinkedObjectItemProvider(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);
-
-			addLinkedElementPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Linked Element feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLinkedElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LinkedObject_linkedElement_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_LinkedObject_linkedElement_feature", "_UI_LinkedObject_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.LINKED_OBJECT__LINKED_ELEMENT,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		return getString("_UI_LinkedObject_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ModelItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ModelItemProviderAdapterFactory.java
deleted file mode 100644
index 3883c60..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/ModelItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,525 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ModelItemProviderAdapterFactory.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.epf.diagram.model.util.ModelAdapterFactory;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ModelItemProviderAdapterFactory extends ModelAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
-	/**
-	 * This keeps track of the root adapter factory that delegates to this adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-	/**
-	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-	/**
-	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Collection<Object> supportedTypes = new ArrayList<Object>();
-
-	/**
-	 * This constructs an instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ModelItemProviderAdapterFactory() {
-		supportedTypes.add(IEditingDomainItemProvider.class);
-		supportedTypes.add(IStructuredItemContentProvider.class);
-		supportedTypes.add(ITreeItemContentProvider.class);
-		supportedTypes.add(IItemLabelProvider.class);
-		supportedTypes.add(IItemPropertySource.class);
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.Diagram} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DiagramItemProvider diagramItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.Diagram}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createDiagramAdapter() {
-		if (diagramItemProvider == null) {
-			diagramItemProvider = new DiagramItemProvider(this);
-		}
-
-		return diagramItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.Link} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LinkItemProvider linkItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.Link}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createLinkAdapter() {
-		if (linkItemProvider == null) {
-			linkItemProvider = new LinkItemProvider(this);
-		}
-
-		return linkItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.NamedNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NamedNodeItemProvider namedNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.NamedNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createNamedNodeAdapter() {
-		if (namedNodeItemProvider == null) {
-			namedNodeItemProvider = new NamedNodeItemProvider(this);
-		}
-
-		return namedNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.ActivityDiagram} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityDiagramItemProvider activityDiagramItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.ActivityDiagram}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createActivityDiagramAdapter() {
-		if (activityDiagramItemProvider == null) {
-			activityDiagramItemProvider = new ActivityDiagramItemProvider(this);
-		}
-
-		return activityDiagramItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.TypedNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TypedNodeItemProvider typedNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.TypedNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createTypedNodeAdapter() {
-		if (typedNodeItemProvider == null) {
-			typedNodeItemProvider = new TypedNodeItemProvider(this);
-		}
-
-		return typedNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.WorkProductDependencyDiagram} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDependencyDiagramItemProvider workProductDependencyDiagramItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.WorkProductDependencyDiagram}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createWorkProductDependencyDiagramAdapter() {
-		if (workProductDependencyDiagramItemProvider == null) {
-			workProductDependencyDiagramItemProvider = new WorkProductDependencyDiagramItemProvider(this);
-		}
-
-		return workProductDependencyDiagramItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.WorkProductNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductNodeItemProvider workProductNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.WorkProductNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createWorkProductNodeAdapter() {
-		if (workProductNodeItemProvider == null) {
-			workProductNodeItemProvider = new WorkProductNodeItemProvider(this);
-		}
-
-		return workProductNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.ActivityDetailDiagram} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityDetailDiagramItemProvider activityDetailDiagramItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.ActivityDetailDiagram}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createActivityDetailDiagramAdapter() {
-		if (activityDetailDiagramItemProvider == null) {
-			activityDetailDiagramItemProvider = new ActivityDetailDiagramItemProvider(this);
-		}
-
-		return activityDetailDiagramItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.RoleNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleNodeItemProvider roleNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.RoleNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createRoleNodeAdapter() {
-		if (roleNodeItemProvider == null) {
-			roleNodeItemProvider = new RoleNodeItemProvider(this);
-		}
-
-		return roleNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.RoleTaskComposite} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleTaskCompositeItemProvider roleTaskCompositeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.RoleTaskComposite}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createRoleTaskCompositeAdapter() {
-		if (roleTaskCompositeItemProvider == null) {
-			roleTaskCompositeItemProvider = new RoleTaskCompositeItemProvider(this);
-		}
-
-		return roleTaskCompositeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.TaskNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskNodeItemProvider taskNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.TaskNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createTaskNodeAdapter() {
-		if (taskNodeItemProvider == null) {
-			taskNodeItemProvider = new TaskNodeItemProvider(this);
-		}
-
-		return taskNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.WorkProductDescriptorNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDescriptorNodeItemProvider workProductDescriptorNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.WorkProductDescriptorNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createWorkProductDescriptorNodeAdapter() {
-		if (workProductDescriptorNodeItemProvider == null) {
-			workProductDescriptorNodeItemProvider = new WorkProductDescriptorNodeItemProvider(this);
-		}
-
-		return workProductDescriptorNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.WorkBreakdownElementNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkBreakdownElementNodeItemProvider workBreakdownElementNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.WorkBreakdownElementNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createWorkBreakdownElementNodeAdapter() {
-		if (workBreakdownElementNodeItemProvider == null) {
-			workBreakdownElementNodeItemProvider = new WorkBreakdownElementNodeItemProvider(this);
-		}
-
-		return workBreakdownElementNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.diagram.model.WorkProductComposite} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductCompositeItemProvider workProductCompositeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.diagram.model.WorkProductComposite}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter createWorkProductCompositeAdapter() {
-		if (workProductCompositeItemProvider == null) {
-			workProductCompositeItemProvider = new WorkProductCompositeItemProvider(this);
-		}
-
-		return workProductCompositeItemProvider;
-	}
-
-	/**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-	}
-
-	/**
-	 * This sets the composed adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean isFactoryForType(Object type) {
-		return supportedTypes.contains(type) || super.isFactoryForType(type);
-	}
-
-	/**
-	 * This implementation substitutes the factory itself as the key for the adapter.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object adapt(Object object, Object type) {
-		if (isFactoryForType(type)) {
-			Object adapter = super.adapt(object, type);
-			if (!(type instanceof Class) || (((Class<?>)type).isInstance(adapter))) {
-				return adapter;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * This adds a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-	/**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-	/**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		changeNotifier.fireNotifyChanged(notification);
-
-		if (parentAdapterFactory != null) {
-			parentAdapterFactory.fireNotifyChanged(notification);
-		}
-	}
-
-	/**
-	 * This disposes all of the item providers created by this factory. 
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void dispose() {
-		if (diagramItemProvider != null) diagramItemProvider.dispose();
-		if (linkItemProvider != null) linkItemProvider.dispose();
-		if (namedNodeItemProvider != null) namedNodeItemProvider.dispose();
-		if (activityDiagramItemProvider != null) activityDiagramItemProvider.dispose();
-		if (typedNodeItemProvider != null) typedNodeItemProvider.dispose();
-		if (workProductDependencyDiagramItemProvider != null) workProductDependencyDiagramItemProvider.dispose();
-		if (workProductNodeItemProvider != null) workProductNodeItemProvider.dispose();
-		if (activityDetailDiagramItemProvider != null) activityDetailDiagramItemProvider.dispose();
-		if (roleNodeItemProvider != null) roleNodeItemProvider.dispose();
-		if (roleTaskCompositeItemProvider != null) roleTaskCompositeItemProvider.dispose();
-		if (taskNodeItemProvider != null) taskNodeItemProvider.dispose();
-		if (workProductDescriptorNodeItemProvider != null) workProductDescriptorNodeItemProvider.dispose();
-		if (workBreakdownElementNodeItemProvider != null) workBreakdownElementNodeItemProvider.dispose();
-		if (workProductCompositeItemProvider != null) workProductCompositeItemProvider.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NamedNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NamedNodeItemProvider.java
deleted file mode 100644
index 52f7657..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NamedNodeItemProvider.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: NamedNodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.NamedNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NamedNodeItemProvider
-	extends NodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NamedNodeItemProvider(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);
-
-			addNamePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NamedNode_name_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_NamedNode_name_feature", "_UI_NamedNode_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.NAMED_NODE__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns NamedNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NamedNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((NamedNode)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NamedNode_type") : //$NON-NLS-1$
-			getString("_UI_NamedNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(NamedNode.class)) {
-			case ModelPackage.NAMED_NODE__NAME:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NodeContainerItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NodeContainerItemProvider.java
deleted file mode 100644
index 8ad9b30..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NodeContainerItemProvider.java
+++ /dev/null
@@ -1,233 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: NodeContainerItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NodeContainer;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.NodeContainer} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NodeContainerItemProvider
-	extends NodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NodeContainerItemProvider(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 specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(ModelPackage.Literals.NODE_CONTAINER__NODES);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((NodeContainer)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NodeContainer_type") : //$NON-NLS-1$
-			getString("_UI_NodeContainer_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(NodeContainer.class)) {
-			case ModelPackage.NODE_CONTAINER__NODES:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		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);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createDiagram()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createNamedNode()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createActivityDiagram()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createTypedNode()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createWorkProductDependencyDiagram()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createWorkProductNode()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createActivityDetailDiagram()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createRoleNode()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createRoleTaskComposite()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createTaskNode()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createWorkProductDescriptorNode()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createWorkBreakdownElementNode()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE_CONTAINER__NODES,
-				 ModelFactory.eINSTANCE.createWorkProductComposite()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NodeItemProvider.java
deleted file mode 100644
index 95a3ce7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/NodeItemProvider.java
+++ /dev/null
@@ -1,296 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: NodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.Node} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NodeItemProvider
-	extends LinkedObjectItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NodeItemProvider(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);
-
-			addLocationPropertyDescriptor(object);
-			addWidthPropertyDescriptor(object);
-			addHeightPropertyDescriptor(object);
-			addIncomingConnectionsPropertyDescriptor(object);
-			addReadOnlyPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Location feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLocationPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Node_location_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Node_location_feature", "_UI_Node_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.NODE__LOCATION,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Width feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWidthPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Node_width_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Node_width_feature", "_UI_Node_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.NODE__WIDTH,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Height feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addHeightPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Node_height_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Node_height_feature", "_UI_Node_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.NODE__HEIGHT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Incoming Connections feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIncomingConnectionsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Node_incomingConnections_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Node_incomingConnections_feature", "_UI_Node_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.NODE__INCOMING_CONNECTIONS,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Read Only feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReadOnlyPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_Node_readOnly_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_Node_readOnly_feature", "_UI_Node_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.NODE__READ_ONLY,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(ModelPackage.Literals.NODE__OUTGOING_CONNECTIONS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((Node)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_Node_type") : //$NON-NLS-1$
-			getString("_UI_Node_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(Node.class)) {
-			case ModelPackage.NODE__LOCATION:
-			case ModelPackage.NODE__WIDTH:
-			case ModelPackage.NODE__HEIGHT:
-			case ModelPackage.NODE__READ_ONLY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		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);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(ModelPackage.Literals.NODE__OUTGOING_CONNECTIONS,
-				 ModelFactory.eINSTANCE.createLink()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/RoleNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/RoleNodeItemProvider.java
deleted file mode 100644
index bee74d0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/RoleNodeItemProvider.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleNodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.epf.diagram.model.RoleNode;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.RoleNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoleNodeItemProvider
-	extends NamedNodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleNodeItemProvider(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 RoleNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RoleNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((RoleNode)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RoleNode_type") : //$NON-NLS-1$
-			getString("_UI_RoleNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/RoleTaskCompositeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/RoleTaskCompositeItemProvider.java
deleted file mode 100644
index 056824c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/RoleTaskCompositeItemProvider.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleTaskCompositeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.RoleTaskComposite} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoleTaskCompositeItemProvider
-	extends NodeContainerItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleTaskCompositeItemProvider(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);
-
-			addRowIndexPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Row Index feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRowIndexPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RoleTaskComposite_rowIndex_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_RoleTaskComposite_rowIndex_feature", "_UI_RoleTaskComposite_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.ROLE_TASK_COMPOSITE__ROW_INDEX,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns RoleTaskComposite.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RoleTaskComposite")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((RoleTaskComposite)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RoleTaskComposite_type") : //$NON-NLS-1$
-			getString("_UI_RoleTaskComposite_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(RoleTaskComposite.class)) {
-			case ModelPackage.ROLE_TASK_COMPOSITE__ROW_INDEX:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/TaskNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/TaskNodeItemProvider.java
deleted file mode 100644
index 65279cd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/TaskNodeItemProvider.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TaskNodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.TaskNode;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.TaskNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TaskNodeItemProvider
-	extends NamedNodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskNodeItemProvider(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);
-
-			addIndexPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Index feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIndexPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_TaskNode_index_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_TaskNode_index_feature", "_UI_TaskNode_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.TASK_NODE__INDEX,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns TaskNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TaskNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((TaskNode)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_TaskNode_type") : //$NON-NLS-1$
-			getString("_UI_TaskNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(TaskNode.class)) {
-			case ModelPackage.TASK_NODE__INDEX:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/TypedNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/TypedNodeItemProvider.java
deleted file mode 100644
index b4a2260..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/TypedNodeItemProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TypedNodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.TypedNode;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.TypedNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TypedNodeItemProvider
-	extends NodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TypedNodeItemProvider(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);
-
-			addTypePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_TypedNode_type_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_TypedNode_type_feature", "_UI_TypedNode_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.TYPED_NODE__TYPE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns TypedNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TypedNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((TypedNode)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_TypedNode_type") : //$NON-NLS-1$
-			getString("_UI_TypedNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(TypedNode.class)) {
-			case ModelPackage.TYPED_NODE__TYPE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkBreakdownElementNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkBreakdownElementNodeItemProvider.java
deleted file mode 100644
index a55487d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkBreakdownElementNodeItemProvider.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkBreakdownElementNodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.epf.diagram.model.WorkBreakdownElementNode;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.WorkBreakdownElementNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkBreakdownElementNodeItemProvider
-	extends NamedNodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkBreakdownElementNodeItemProvider(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 WorkBreakdownElementNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/WorkBreakdownElementNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((WorkBreakdownElementNode)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_WorkBreakdownElementNode_type") : //$NON-NLS-1$
-			getString("_UI_WorkBreakdownElementNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductCompositeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductCompositeItemProvider.java
deleted file mode 100644
index b7fd77b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductCompositeItemProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductCompositeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.WorkProductComposite} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductCompositeItemProvider
-	extends NodeContainerItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductCompositeItemProvider(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);
-
-			addTypePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_WorkProductComposite_type_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_WorkProductComposite_type_feature", "_UI_WorkProductComposite_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.WORK_PRODUCT_COMPOSITE__TYPE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns WorkProductComposite.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/WorkProductComposite")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((WorkProductComposite)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_WorkProductComposite_type") : //$NON-NLS-1$
-			getString("_UI_WorkProductComposite_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(WorkProductComposite.class)) {
-			case ModelPackage.WORK_PRODUCT_COMPOSITE__TYPE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductDependencyDiagramItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductDependencyDiagramItemProvider.java
deleted file mode 100644
index 94945b9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductDependencyDiagramItemProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductDependencyDiagramItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-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.epf.diagram.model.WorkProductDependencyDiagram;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.WorkProductDependencyDiagram} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductDependencyDiagramItemProvider
-	extends DiagramItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDependencyDiagramItemProvider(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 WorkProductDependencyDiagram.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/WorkProductDependencyDiagram")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Point labelValue = ((WorkProductDependencyDiagram)object).getLocation();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ?
-			getString("_UI_WorkProductDependencyDiagram_type") : //$NON-NLS-1$
-			getString("_UI_WorkProductDependencyDiagram_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductDescriptorNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductDescriptorNodeItemProvider.java
deleted file mode 100644
index 233a441..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductDescriptorNodeItemProvider.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductDescriptorNodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.epf.diagram.model.WorkProductDescriptorNode;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.WorkProductDescriptorNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductDescriptorNodeItemProvider
-	extends NamedNodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescriptorNodeItemProvider(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 WorkProductDescriptorNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/WorkProductDescriptorNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((WorkProductDescriptorNode)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_WorkProductDescriptorNode_type") : //$NON-NLS-1$
-			getString("_UI_WorkProductDescriptorNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductNodeItemProvider.java
deleted file mode 100644
index 6c76694..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.edit/src/org/eclipse/epf/diagram/model/provider/WorkProductNodeItemProvider.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductNodeItemProvider.java,v 1.1 2008/01/15 08:53:03 jtham Exp $
- */
-package org.eclipse.epf.diagram.model.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.common.util.ResourceLocator;
-
-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.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.diagram.model.WorkProductNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductNodeItemProvider
-	extends NamedNodeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductNodeItemProvider(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);
-
-			addTypePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_WorkProductNode_type_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_WorkProductNode_type_feature", "_UI_WorkProductNode_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 ModelPackage.Literals.WORK_PRODUCT_NODE__TYPE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns WorkProductNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/WorkProductNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((WorkProductNode)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_WorkProductNode_type") : //$NON-NLS-1$
-			getString("_UI_WorkProductNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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);
-
-		switch (notification.getFeatureID(WorkProductNode.class)) {
-			case ModelPackage.WORK_PRODUCT_NODE__TYPE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		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);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return DiagramEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/.classpath b/1.5/plugins/org.eclipse.epf.diagram.model/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/.project b/1.5/plugins/org.eclipse.epf.diagram.model/.project
deleted file mode 100644
index dadf144..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.diagram.model</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.diagram.model/META-INF/MANIFEST.MF
deleted file mode 100644
index d9d79c0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.diagram.model;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.library.edit,
- org.eclipse.core.runtime,
- org.eclipse.draw2d,
- org.eclipse.emf.transaction,
- org.eclipse.emf.workspace
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.diagram.model,
- org.eclipse.epf.diagram.model.impl,
- org.eclipse.epf.diagram.model.util
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/build.properties b/1.5/plugins/org.eclipse.epf.diagram.model/build.properties
deleted file mode 100644
index a72e3cd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .project,\
-               META-INF/,\
-               plugin.properties,\
-               plugin.xml
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/model/diagram.ecore b/1.5/plugins/org.eclipse.epf.diagram.model/model/diagram.ecore
deleted file mode 100644
index 51fa4d3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/model/diagram.ecore
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model"
-    nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore" nsPrefix="org.eclipse.epf.diagram.model">
-  <eClassifiers xsi:type="ecore:EClass" name="Diagram" eSuperTypes="#//NodeContainer"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Link" eSuperTypes="#//LinkedObject">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="source" eType="#//Node"
-        eOpposite="#//Node/outgoingConnections"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="target" eType="#//Node"
-        eOpposite="#//Node/incomingConnections"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bendpoints" upperBound="-1"
-        eType="#//AbsoluteBendpoint" transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sourceEndPoint" eType="#//Point"
-        transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="targetEndPoint" eType="#//Point"
-        transient="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LinkedObject" abstract="true">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="linkedElement" eType="ecore:EClass ../../org.eclipse.epf.uma/model/1.0.4/uma.ecore#//MethodElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NamedNode" eSuperTypes="#//Node">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Node" abstract="true" eSuperTypes="#//LinkedObject">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="location" eType="#//Point"
-        transient="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="width" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-        transient="true" defaultValueLiteral="-1"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="height" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-        transient="true" defaultValueLiteral="-1"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="incomingConnections" upperBound="-1"
-        eType="#//Link" eOpposite="#//Link/target"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outgoingConnections" upperBound="-1"
-        eType="#//Link" containment="true" resolveProxies="false" eOpposite="#//Link/source"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="readOnly" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDiagram" eSuperTypes="#//Diagram"/>
-  <eClassifiers xsi:type="ecore:EClass" name="TypedNode" eSuperTypes="#//Node">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDependencyDiagram" eSuperTypes="#//Diagram"/>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductNode" eSuperTypes="#//NamedNode">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDetailDiagram" eSuperTypes="#//Diagram">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="autoLayout" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NodeContainer" abstract="true" eSuperTypes="#//Node">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nodes" upperBound="-1"
-        eType="#//Node" containment="true" resolveProxies="false"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleNode" eSuperTypes="#//NamedNode"/>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleTaskComposite" eSuperTypes="#//NodeContainer">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rowIndex" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskNode" eSuperTypes="#//NamedNode">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="index" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-        defaultValueLiteral="-1"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescriptorNode" eSuperTypes="#//NamedNode"/>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkBreakdownElementNode" eSuperTypes="#//NamedNode"/>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductComposite" eSuperTypes="#//NodeContainer">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="AbsoluteBendpoint" instanceClassName="org.eclipse.draw2d.AbsoluteBendpoint"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Point" instanceClassName="org.eclipse.draw2d.geometry.Point"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="RoleDescriptor" instanceClassName="org.eclipse.epf.uma.RoleDescriptor"/>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/model/diagram.genmodel b/1.5/plugins/org.eclipse.epf.diagram.model/model/diagram.genmodel
deleted file mode 100644
index 2597d34..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/model/diagram.genmodel
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.epf.diagram.model/src"
-    editDirectory="/org.eclipse.epf.diagram.edit/src" modelPluginID="org.eclipse.epf.diagram.model"
-    modelName="Diagram" nonNLSMarkers="true" importerID="org.eclipse.emf.importer.java"
-    complianceLevel="5.0" copyrightFields="false" usedGenPackages="../../org.eclipse.epf.uma/model/1.0.4/uma.genmodel#//uma">
-  <foreignModel>@model</foreignModel>
-  <genPackages prefix="Model" basePackage="org.eclipse.epf.diagram" disposableProviderFactory="true"
-      ecorePackage="diagram.ecore#/">
-    <genDataTypes ecoreDataType="diagram.ecore#//AbsoluteBendpoint"/>
-    <genDataTypes ecoreDataType="diagram.ecore#//Point"/>
-    <genDataTypes ecoreDataType="diagram.ecore#//RoleDescriptor"/>
-    <genClasses ecoreClass="diagram.ecore#//Diagram" labelFeature="#//model/Node/location"/>
-    <genClasses ecoreClass="diagram.ecore#//Link">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Link/name"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference diagram.ecore#//Link/source"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference diagram.ecore#//Link/target"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Link/bendpoints"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Link/sourceEndPoint"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Link/targetEndPoint"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="diagram.ecore#//LinkedObject">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference diagram.ecore#//LinkedObject/linkedElement"/>
-    </genClasses>
-    <genClasses ecoreClass="diagram.ecore#//NamedNode">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//NamedNode/name"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="diagram.ecore#//Node">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Node/location"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Node/width"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Node/height"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference diagram.ecore#//Node/incomingConnections"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference diagram.ecore#//Node/outgoingConnections"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//Node/readOnly"/>
-    </genClasses>
-    <genClasses ecoreClass="diagram.ecore#//ActivityDiagram"/>
-    <genClasses ecoreClass="diagram.ecore#//TypedNode">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//TypedNode/type"/>
-    </genClasses>
-    <genClasses ecoreClass="diagram.ecore#//WorkProductDependencyDiagram"/>
-    <genClasses ecoreClass="diagram.ecore#//WorkProductNode">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//WorkProductNode/type"/>
-    </genClasses>
-    <genClasses ecoreClass="diagram.ecore#//ActivityDetailDiagram">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//ActivityDetailDiagram/autoLayout"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="diagram.ecore#//NodeContainer">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference diagram.ecore#//NodeContainer/nodes"/>
-    </genClasses>
-    <genClasses ecoreClass="diagram.ecore#//RoleNode"/>
-    <genClasses ecoreClass="diagram.ecore#//RoleTaskComposite">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//RoleTaskComposite/rowIndex"/>
-    </genClasses>
-    <genClasses ecoreClass="diagram.ecore#//TaskNode">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//TaskNode/index"/>
-    </genClasses>
-    <genClasses ecoreClass="diagram.ecore#//WorkProductDescriptorNode"/>
-    <genClasses ecoreClass="diagram.ecore#//WorkBreakdownElementNode"/>
-    <genClasses ecoreClass="diagram.ecore#//WorkProductComposite">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute diagram.ecore#//WorkProductComposite/type"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/plugin.properties b/1.5/plugins/org.eclipse.epf.diagram.model/plugin.properties
deleted file mode 100644
index bdf330d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Diagram Model
-providerName=Eclipse.org
-
-# ====================================================================
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/plugin.xml b/1.5/plugins/org.eclipse.epf.diagram.model/plugin.xml
deleted file mode 100644
index 0a3a1d7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/plugin.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore" 
-       class = "org.eclipse.epf.diagram.model.ModelPackage" />
-  </extension>
-  <extension
-        point="org.eclipse.epf.library.edit.diagramManager">
-     <diagramManager class="org.eclipse.epf.diagram.model.util.DiagramManager"/>
-  </extension>
-
-</plugin>
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ActivityDetailDiagram.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ActivityDetailDiagram.java
deleted file mode 100644
index e324775..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ActivityDetailDiagram.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * Interface for activity detail diagram model object
- * 
- * @author Phong Nguyen Le
- * @since  1.0
- * @model
- */
-public interface ActivityDetailDiagram extends Diagram {
-
-	/**
-	 * Returns the value of the '<em><b>Auto Layout</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Auto Layout</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Auto Layout</em>' attribute.
-	 * @see #setAutoLayout(boolean)
-	 * @see org.eclipse.epf.diagram.model.ModelPackage#getActivityDetailDiagram_AutoLayout()
-	 * @model
-	 * @generated
-	 */
-	boolean isAutoLayout();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.ActivityDetailDiagram#isAutoLayout <em>Auto Layout</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Auto Layout</em>' attribute.
-	 * @see #isAutoLayout()
-	 * @generated
-	 */
-	void setAutoLayout(boolean value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ActivityDiagram.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ActivityDiagram.java
deleted file mode 100644
index a22b037..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ActivityDiagram.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * Interface for activity diagram model object
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface ActivityDiagram extends Diagram {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Diagram.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Diagram.java
deleted file mode 100644
index 75cecfd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Diagram.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-
-/**
- * Base diagram interface
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface Diagram extends NodeContainer {
-
-	/**
-	 * Gets the UMA model object for this diagram
-	 * 
-	 * @return
-	 */
-	org.eclipse.epf.uma.Diagram getUMADiagram();
-
-	/**
-	 * Sets default name for new node
-	 * 
-	 * @param newNode
-	 */
-	void setDefaultName(NamedNode newNode);
-
-	/**
-	 * Sets a suppression instance for this diagram
-	 * 
-	 * @param suppression
-	 */
-	void setSuppression(Suppression suppression);
-
-	/**
-	 * Gets the suppression instance used in this diagram
-	 * 
-	 * @return
-	 */
-	Suppression getSuppression();
-
-	/**
-	 * Sets filter used to to filter diagram elements in this diagram
-	 * 
-	 * @param filter
-	 */
-	void setFilter(IFilter filter);
-
-	/**
-	 * Checks if this diagram is newly created and not saved yet)
-	 * 
-	 * @return
-	 */
-	boolean isNew();
-
-	/**
-	 * Sets or unsets the isNew flag of this diagram
-	 * 
-	 * @param n
-	 * @see #isNew()
-	 */
-	void setNew(boolean n);
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/DiagramResources.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/DiagramResources.java
deleted file mode 100644
index 15d5077..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/DiagramResources.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The resource class of diagram plugin
- * 
- * @since  1.0
- */
-public final class DiagramResources extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.epf.diagram.model.Resources";//$NON-NLS-1$
-
-	private DiagramResources() {
-		// Do not instantiate
-	}
-
-	public static String type_activity;
-	public static String defaultBaseName;
-	public static String type_WPD;
-	public static String type_activityDetail;
-	public static String addFreeTxt;
-	public static String type_unknown;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, DiagramResources.class);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Link.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Link.java
deleted file mode 100644
index d9bf67e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Link.java
+++ /dev/null
@@ -1,125 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.util.EList;
-
-/**
- * This interface represents model object for a link between diagram nodes
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface Link extends LinkedObject {
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.epf.diagram.model.ModelPackage#getLink_Name()
-	 * @model default=""
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Link#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Gets the source node of this link.
-	 * 
-	 * @model
-	 */
-	Node getSource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Link#getSource <em>Source</em>}' container reference.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source</em>' container reference.
-	 * @see #getSource()
-	 * @generated
-	 */
-	void setSource(Node value);
-
-	/**
-	 * Gets the target node of this link
-	 * 
-	 * @model
-	 */
-	Node getTarget();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Link#getTarget <em>Target</em>}' reference.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Target</em>' reference.
-	 * @see #getTarget()
-	 * @generated
-	 */
-	void setTarget(Node value);
-
-	/**
-	 * Gets the list of bend points in this link
-	 * 
-	 * @model type="org.eclipse.draw2d.AbsoluteBendpoint" lower="0" transient="true"
-	 */
-	EList<AbsoluteBendpoint> getBendpoints();
-
-	/**
-	 * Gets the end point of this link in the source node
-	 * 
-	 * @model transient="true"
-	 * @return
-	 */
-	Point getSourceEndPoint();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Link#getSourceEndPoint <em>Source End Point</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source End Point</em>' attribute.
-	 * @see #getSourceEndPoint()
-	 * @generated
-	 */
-	void setSourceEndPoint(Point value);
-
-	/**
-	 * Gets the end point of this link in target node
-	 * 
-	 * @model transient="true"
-	 * @return
-	 */
-	Point getTargetEndPoint();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Link#getTargetEndPoint <em>Target End Point</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Target End Point</em>' attribute.
-	 * @see #getTargetEndPoint()
-	 * @generated
-	 */
-	void setTargetEndPoint(Point value);
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/LinkedObject.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/LinkedObject.java
deleted file mode 100644
index e93926d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/LinkedObject.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * This interface represents objects that is linked with other object in a
- * difference model
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model abstract="true"
- */
-public interface LinkedObject extends EObject {
-
-	Object getObject();
-
-	void setObject(Object value);
-
-	/**
-	 * @model
-	 */
-	MethodElement getLinkedElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.LinkedObject#getLinkedElement <em>Linked Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Linked Element</em>' reference.
-	 * @see #getLinkedElement()
-	 * @generated
-	 */
-	void setLinkedElement(MethodElement value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ModelFactory.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ModelFactory.java
deleted file mode 100644
index 738f9d1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ModelFactory.java
+++ /dev/null
@@ -1,167 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-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.epf.diagram.model.ModelPackage
- * @generated
- */
-public interface ModelFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    ModelFactory eINSTANCE = org.eclipse.epf.diagram.model.impl.ModelFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Diagram</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Diagram</em>'.
-	 * @generated
-	 */
-    Diagram createDiagram();
-
-	/**
-	 * Returns a new object of class '<em>Link</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Link</em>'.
-	 * @generated
-	 */
-    Link createLink();
-
-	/**
-	 * Returns a new object of class '<em>Named Node</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Named Node</em>'.
-	 * @generated
-	 */
-    NamedNode createNamedNode();
-
-	/**
-	 * Returns a new object of class '<em>Activity Diagram</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Activity Diagram</em>'.
-	 * @generated
-	 */
-    ActivityDiagram createActivityDiagram();
-
-	/**
-	 * Returns a new object of class '<em>Typed Node</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Typed Node</em>'.
-	 * @generated
-	 */
-    TypedNode createTypedNode();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Dependency Diagram</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Dependency Diagram</em>'.
-	 * @generated
-	 */
-	WorkProductDependencyDiagram createWorkProductDependencyDiagram();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Node</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Node</em>'.
-	 * @generated
-	 */
-	WorkProductNode createWorkProductNode();
-
-	/**
-	 * Returns a new object of class '<em>Activity Detail Diagram</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Activity Detail Diagram</em>'.
-	 * @generated
-	 */
-	ActivityDetailDiagram createActivityDetailDiagram();
-
-	/**
-	 * Returns a new object of class '<em>Role Node</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Node</em>'.
-	 * @generated
-	 */
-	RoleNode createRoleNode();
-
-	/**
-	 * Returns a new object of class '<em>Role Task Composite</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Task Composite</em>'.
-	 * @generated
-	 */
-	RoleTaskComposite createRoleTaskComposite();
-
-	/**
-	 * Returns a new object of class '<em>Task Node</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task Node</em>'.
-	 * @generated
-	 */
-	TaskNode createTaskNode();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Descriptor Node</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Descriptor Node</em>'.
-	 * @generated
-	 */
-	WorkProductDescriptorNode createWorkProductDescriptorNode();
-
-	/**
-	 * Returns a new object of class '<em>Work Breakdown Element Node</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Breakdown Element Node</em>'.
-	 * @generated
-	 */
-	WorkBreakdownElementNode createWorkBreakdownElementNode();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Composite</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Composite</em>'.
-	 * @generated
-	 */
-	WorkProductComposite createWorkProductComposite();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-    ModelPackage getModelPackage();
-
-} //ModelFactory
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ModelPackage.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ModelPackage.java
deleted file mode 100644
index bdf0ad9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/ModelPackage.java
+++ /dev/null
@@ -1,2436 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-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.epf.diagram.model.ModelFactory
- * @model kind="package"
- * @generated
- */
-public interface ModelPackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String eNAME = "model"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String eNS_URI = "http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String eNS_PREFIX = "org.eclipse.epf.diagram.model"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    ModelPackage eINSTANCE = org.eclipse.epf.diagram.model.impl.ModelPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.NodeContainerImpl <em>Node Container</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.NodeContainerImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getNodeContainer()
-	 * @generated
-	 */
-	int NODE_CONTAINER = 10;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.LinkedObjectImpl <em>Linked Object</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.LinkedObjectImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getLinkedObject()
-	 * @generated
-	 */
-    int LINKED_OBJECT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.DiagramImpl <em>Diagram</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getDiagram()
-	 * @generated
-	 */
-    int DIAGRAM = 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.LinkImpl <em>Link</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.LinkImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getLink()
-	 * @generated
-	 */
-    int LINK = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.NodeImpl <em>Node</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getNode()
-	 * @generated
-	 */
-    int NODE = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.NamedNodeImpl <em>Named Node</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.NamedNodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getNamedNode()
-	 * @generated
-	 */
-    int NAMED_NODE = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.ActivityDiagramImpl <em>Activity Diagram</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.ActivityDiagramImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getActivityDiagram()
-	 * @generated
-	 */
-    int ACTIVITY_DIAGRAM = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.TypedNodeImpl <em>Typed Node</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.TypedNodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getTypedNode()
-	 * @generated
-	 */
-    int TYPED_NODE = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductDependencyDiagramImpl <em>Work Product Dependency Diagram</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.WorkProductDependencyDiagramImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductDependencyDiagram()
-	 * @generated
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM = 7;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductNodeImpl <em>Work Product Node</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.WorkProductNodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductNode()
-	 * @generated
-	 */
-	int WORK_PRODUCT_NODE = 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.ActivityDetailDiagramImpl <em>Activity Detail Diagram</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.ActivityDetailDiagramImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getActivityDetailDiagram()
-	 * @generated
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM = 9;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.RoleNodeImpl <em>Role Node</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.RoleNodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getRoleNode()
-	 * @generated
-	 */
-	int ROLE_NODE = 11;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.RoleTaskCompositeImpl <em>Role Task Composite</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.RoleTaskCompositeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getRoleTaskComposite()
-	 * @generated
-	 */
-	int ROLE_TASK_COMPOSITE = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.TaskNodeImpl <em>Task Node</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.TaskNodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getTaskNode()
-	 * @generated
-	 */
-	int TASK_NODE = 13;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductDescriptorNodeImpl <em>Work Product Descriptor Node</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.WorkProductDescriptorNodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductDescriptorNode()
-	 * @generated
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE = 14;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LINKED_OBJECT__LINKED_ELEMENT = 0;
-
-	/**
-	 * The number of structural features of the '<em>Linked Object</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LINKED_OBJECT_FEATURE_COUNT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE__LINKED_ELEMENT = LINKED_OBJECT__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NODE__LOCATION = LINKED_OBJECT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NODE__WIDTH = LINKED_OBJECT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NODE__HEIGHT = LINKED_OBJECT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NODE__INCOMING_CONNECTIONS = LINKED_OBJECT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NODE__OUTGOING_CONNECTIONS = LINKED_OBJECT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE__READ_ONLY = LINKED_OBJECT_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Node</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NODE_FEATURE_COUNT = LINKED_OBJECT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__LINKED_ELEMENT = NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__LOCATION = NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__WIDTH = NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__HEIGHT = NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__INCOMING_CONNECTIONS = NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__OUTGOING_CONNECTIONS = NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__READ_ONLY = NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER__NODES = NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Node Container</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NODE_CONTAINER_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__LINKED_ELEMENT = NODE_CONTAINER__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__LOCATION = NODE_CONTAINER__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__WIDTH = NODE_CONTAINER__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__HEIGHT = NODE_CONTAINER__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__INCOMING_CONNECTIONS = NODE_CONTAINER__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__OUTGOING_CONNECTIONS = NODE_CONTAINER__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__READ_ONLY = NODE_CONTAINER__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DIAGRAM__NODES = NODE_CONTAINER__NODES;
-
-	/**
-	 * The number of structural features of the '<em>Diagram</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DIAGRAM_FEATURE_COUNT = NODE_CONTAINER_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LINK__LINKED_ELEMENT = LINKED_OBJECT__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LINK__NAME = LINKED_OBJECT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Source</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LINK__SOURCE = LINKED_OBJECT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Target</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LINK__TARGET = LINKED_OBJECT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Bendpoints</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LINK__BENDPOINTS = LINKED_OBJECT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Source End Point</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LINK__SOURCE_END_POINT = LINKED_OBJECT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Target End Point</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LINK__TARGET_END_POINT = LINKED_OBJECT_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Link</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LINK_FEATURE_COUNT = LINKED_OBJECT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMED_NODE__LINKED_ELEMENT = NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAMED_NODE__LOCATION = NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAMED_NODE__WIDTH = NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAMED_NODE__HEIGHT = NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAMED_NODE__INCOMING_CONNECTIONS = NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAMED_NODE__OUTGOING_CONNECTIONS = NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMED_NODE__READ_ONLY = NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAMED_NODE__NAME = NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Named Node</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAMED_NODE_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DIAGRAM__LINKED_ELEMENT = DIAGRAM__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DIAGRAM__LOCATION = DIAGRAM__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DIAGRAM__WIDTH = DIAGRAM__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DIAGRAM__HEIGHT = DIAGRAM__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DIAGRAM__INCOMING_CONNECTIONS = DIAGRAM__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DIAGRAM__OUTGOING_CONNECTIONS = DIAGRAM__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DIAGRAM__READ_ONLY = DIAGRAM__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int ACTIVITY_DIAGRAM__NODES = DIAGRAM__NODES;
-
-	/**
-	 * The number of structural features of the '<em>Activity Diagram</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int ACTIVITY_DIAGRAM_FEATURE_COUNT = DIAGRAM_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TYPED_NODE__LINKED_ELEMENT = NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int TYPED_NODE__LOCATION = NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int TYPED_NODE__WIDTH = NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int TYPED_NODE__HEIGHT = NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int TYPED_NODE__INCOMING_CONNECTIONS = NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int TYPED_NODE__OUTGOING_CONNECTIONS = NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TYPED_NODE__READ_ONLY = NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int TYPED_NODE__TYPE = NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Typed Node</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int TYPED_NODE_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__LINKED_ELEMENT = DIAGRAM__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__LOCATION = DIAGRAM__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__WIDTH = DIAGRAM__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__HEIGHT = DIAGRAM__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__INCOMING_CONNECTIONS = DIAGRAM__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__OUTGOING_CONNECTIONS = DIAGRAM__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__READ_ONLY = DIAGRAM__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM__NODES = DIAGRAM__NODES;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Dependency Diagram</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DEPENDENCY_DIAGRAM_FEATURE_COUNT = DIAGRAM_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__LINKED_ELEMENT = NAMED_NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__LOCATION = NAMED_NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__WIDTH = NAMED_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__HEIGHT = NAMED_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__INCOMING_CONNECTIONS = NAMED_NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__OUTGOING_CONNECTIONS = NAMED_NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__READ_ONLY = NAMED_NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__NAME = NAMED_NODE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE__TYPE = NAMED_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Node</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_NODE_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__LINKED_ELEMENT = DIAGRAM__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__LOCATION = DIAGRAM__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__WIDTH = DIAGRAM__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__HEIGHT = DIAGRAM__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__INCOMING_CONNECTIONS = DIAGRAM__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__OUTGOING_CONNECTIONS = DIAGRAM__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__READ_ONLY = DIAGRAM__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__NODES = DIAGRAM__NODES;
-
-	/**
-	 * The feature id for the '<em><b>Auto Layout</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT = DIAGRAM_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Activity Detail Diagram</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DETAIL_DIAGRAM_FEATURE_COUNT = DIAGRAM_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__LINKED_ELEMENT = NAMED_NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__LOCATION = NAMED_NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__WIDTH = NAMED_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__HEIGHT = NAMED_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__INCOMING_CONNECTIONS = NAMED_NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__OUTGOING_CONNECTIONS = NAMED_NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__READ_ONLY = NAMED_NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE__NAME = NAMED_NODE__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Role Node</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_NODE_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__LINKED_ELEMENT = NODE_CONTAINER__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__LOCATION = NODE_CONTAINER__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__WIDTH = NODE_CONTAINER__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__HEIGHT = NODE_CONTAINER__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__INCOMING_CONNECTIONS = NODE_CONTAINER__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__OUTGOING_CONNECTIONS = NODE_CONTAINER__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__READ_ONLY = NODE_CONTAINER__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__NODES = NODE_CONTAINER__NODES;
-
-	/**
-	 * The feature id for the '<em><b>Row Index</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE__ROW_INDEX = NODE_CONTAINER_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Role Task Composite</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_TASK_COMPOSITE_FEATURE_COUNT = NODE_CONTAINER_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__LINKED_ELEMENT = NAMED_NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__LOCATION = NAMED_NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__WIDTH = NAMED_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__HEIGHT = NAMED_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__INCOMING_CONNECTIONS = NAMED_NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__OUTGOING_CONNECTIONS = NAMED_NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__READ_ONLY = NAMED_NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__NAME = NAMED_NODE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Index</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE__INDEX = NAMED_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Task Node</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_NODE_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__LINKED_ELEMENT = NAMED_NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__LOCATION = NAMED_NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__WIDTH = NAMED_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__HEIGHT = NAMED_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__INCOMING_CONNECTIONS = NAMED_NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__OUTGOING_CONNECTIONS = NAMED_NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__READ_ONLY = NAMED_NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE__NAME = NAMED_NODE__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Descriptor Node</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_NODE_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.WorkBreakdownElementNodeImpl <em>Work Breakdown Element Node</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.WorkBreakdownElementNodeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkBreakdownElementNode()
-	 * @generated
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE = 15;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__LINKED_ELEMENT = NAMED_NODE__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__LOCATION = NAMED_NODE__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__WIDTH = NAMED_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__HEIGHT = NAMED_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__INCOMING_CONNECTIONS = NAMED_NODE__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__OUTGOING_CONNECTIONS = NAMED_NODE__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__READ_ONLY = NAMED_NODE__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE__NAME = NAMED_NODE__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Work Breakdown Element Node</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_NODE_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductCompositeImpl <em>Work Product Composite</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.diagram.model.impl.WorkProductCompositeImpl
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductComposite()
-	 * @generated
-	 */
-	int WORK_PRODUCT_COMPOSITE = 16;
-
-	/**
-	 * The feature id for the '<em><b>Linked Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__LINKED_ELEMENT = NODE_CONTAINER__LINKED_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Location</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__LOCATION = NODE_CONTAINER__LOCATION;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__WIDTH = NODE_CONTAINER__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__HEIGHT = NODE_CONTAINER__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Incoming Connections</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__INCOMING_CONNECTIONS = NODE_CONTAINER__INCOMING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing Connections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__OUTGOING_CONNECTIONS = NODE_CONTAINER__OUTGOING_CONNECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__READ_ONLY = NODE_CONTAINER__READ_ONLY;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__NODES = NODE_CONTAINER__NODES;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE__TYPE = NODE_CONTAINER_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Composite</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_COMPOSITE_FEATURE_COUNT = NODE_CONTAINER_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '<em>Absolute Bendpoint</em>' data type.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.draw2d.AbsoluteBendpoint
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getAbsoluteBendpoint()
-	 * @generated
-	 */
-    int ABSOLUTE_BENDPOINT = 17;
-
-	/**
-	 * The meta object id for the '<em>Point</em>' data type.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.draw2d.geometry.Point
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getPoint()
-	 * @generated
-	 */
-    int POINT = 18;
-
-
-	/**
-	 * The meta object id for the '<em>Role Descriptor</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.RoleDescriptor
-	 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getRoleDescriptor()
-	 * @generated
-	 */
-	int ROLE_DESCRIPTOR = 19;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.Diagram <em>Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Diagram</em>'.
-	 * @see org.eclipse.epf.diagram.model.Diagram
-	 * @generated
-	 */
-    EClass getDiagram();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.Link <em>Link</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Link</em>'.
-	 * @see org.eclipse.epf.diagram.model.Link
-	 * @generated
-	 */
-    EClass getLink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.Link#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.diagram.model.Link#getName()
-	 * @see #getLink()
-	 * @generated
-	 */
-	EAttribute getLink_Name();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.diagram.model.Link#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Source</em>'.
-	 * @see org.eclipse.epf.diagram.model.Link#getSource()
-	 * @see #getLink()
-	 * @generated
-	 */
-    EReference getLink_Source();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.diagram.model.Link#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Target</em>'.
-	 * @see org.eclipse.epf.diagram.model.Link#getTarget()
-	 * @see #getLink()
-	 * @generated
-	 */
-    EReference getLink_Target();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.diagram.model.Link#getBendpoints <em>Bendpoints</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Bendpoints</em>'.
-	 * @see org.eclipse.epf.diagram.model.Link#getBendpoints()
-	 * @see #getLink()
-	 * @generated
-	 */
-    EAttribute getLink_Bendpoints();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.Link#getSourceEndPoint <em>Source End Point</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Source End Point</em>'.
-	 * @see org.eclipse.epf.diagram.model.Link#getSourceEndPoint()
-	 * @see #getLink()
-	 * @generated
-	 */
-	EAttribute getLink_SourceEndPoint();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.Link#getTargetEndPoint <em>Target End Point</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Target End Point</em>'.
-	 * @see org.eclipse.epf.diagram.model.Link#getTargetEndPoint()
-	 * @see #getLink()
-	 * @generated
-	 */
-	EAttribute getLink_TargetEndPoint();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.LinkedObject <em>Linked Object</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Linked Object</em>'.
-	 * @see org.eclipse.epf.diagram.model.LinkedObject
-	 * @generated
-	 */
-    EClass getLinkedObject();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.diagram.model.LinkedObject#getLinkedElement <em>Linked Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Linked Element</em>'.
-	 * @see org.eclipse.epf.diagram.model.LinkedObject#getLinkedElement()
-	 * @see #getLinkedObject()
-	 * @generated
-	 */
-	EReference getLinkedObject_LinkedElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.NamedNode <em>Named Node</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Named Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.NamedNode
-	 * @generated
-	 */
-    EClass getNamedNode();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.NamedNode#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.diagram.model.NamedNode#getName()
-	 * @see #getNamedNode()
-	 * @generated
-	 */
-    EAttribute getNamedNode_Name();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.Node <em>Node</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.Node
-	 * @generated
-	 */
-    EClass getNode();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.Node#getLocation <em>Location</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Location</em>'.
-	 * @see org.eclipse.epf.diagram.model.Node#getLocation()
-	 * @see #getNode()
-	 * @generated
-	 */
-    EAttribute getNode_Location();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.Node#getWidth <em>Width</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Width</em>'.
-	 * @see org.eclipse.epf.diagram.model.Node#getWidth()
-	 * @see #getNode()
-	 * @generated
-	 */
-    EAttribute getNode_Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.Node#getHeight <em>Height</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Height</em>'.
-	 * @see org.eclipse.epf.diagram.model.Node#getHeight()
-	 * @see #getNode()
-	 * @generated
-	 */
-    EAttribute getNode_Height();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.diagram.model.Node#getIncomingConnections <em>Incoming Connections</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Incoming Connections</em>'.
-	 * @see org.eclipse.epf.diagram.model.Node#getIncomingConnections()
-	 * @see #getNode()
-	 * @generated
-	 */
-    EReference getNode_IncomingConnections();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.diagram.model.Node#getOutgoingConnections <em>Outgoing Connections</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Outgoing Connections</em>'.
-	 * @see org.eclipse.epf.diagram.model.Node#getOutgoingConnections()
-	 * @see #getNode()
-	 * @generated
-	 */
-    EReference getNode_OutgoingConnections();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.Node#isReadOnly <em>Read Only</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Read Only</em>'.
-	 * @see org.eclipse.epf.diagram.model.Node#isReadOnly()
-	 * @see #getNode()
-	 * @generated
-	 */
-	EAttribute getNode_ReadOnly();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.ActivityDiagram <em>Activity Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Activity Diagram</em>'.
-	 * @see org.eclipse.epf.diagram.model.ActivityDiagram
-	 * @generated
-	 */
-    EClass getActivityDiagram();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.TypedNode <em>Typed Node</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Typed Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.TypedNode
-	 * @generated
-	 */
-    EClass getTypedNode();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.TypedNode#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.diagram.model.TypedNode#getType()
-	 * @see #getTypedNode()
-	 * @generated
-	 */
-    EAttribute getTypedNode_Type();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.WorkProductDependencyDiagram <em>Work Product Dependency Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Dependency Diagram</em>'.
-	 * @see org.eclipse.epf.diagram.model.WorkProductDependencyDiagram
-	 * @generated
-	 */
-	EClass getWorkProductDependencyDiagram();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.WorkProductNode <em>Work Product Node</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.WorkProductNode
-	 * @generated
-	 */
-	EClass getWorkProductNode();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.WorkProductNode#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.diagram.model.WorkProductNode#getType()
-	 * @see #getWorkProductNode()
-	 * @generated
-	 */
-	EAttribute getWorkProductNode_Type();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.ActivityDetailDiagram <em>Activity Detail Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Activity Detail Diagram</em>'.
-	 * @see org.eclipse.epf.diagram.model.ActivityDetailDiagram
-	 * @generated
-	 */
-	EClass getActivityDetailDiagram();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.ActivityDetailDiagram#isAutoLayout <em>Auto Layout</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Auto Layout</em>'.
-	 * @see org.eclipse.epf.diagram.model.ActivityDetailDiagram#isAutoLayout()
-	 * @see #getActivityDetailDiagram()
-	 * @generated
-	 */
-	EAttribute getActivityDetailDiagram_AutoLayout();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.NodeContainer <em>Node Container</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Node Container</em>'.
-	 * @see org.eclipse.epf.diagram.model.NodeContainer
-	 * @generated
-	 */
-	EClass getNodeContainer();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.diagram.model.NodeContainer#getNodes <em>Nodes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Nodes</em>'.
-	 * @see org.eclipse.epf.diagram.model.NodeContainer#getNodes()
-	 * @see #getNodeContainer()
-	 * @generated
-	 */
-	EReference getNodeContainer_Nodes();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.RoleNode <em>Role Node</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.RoleNode
-	 * @generated
-	 */
-	EClass getRoleNode();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.RoleTaskComposite <em>Role Task Composite</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Task Composite</em>'.
-	 * @see org.eclipse.epf.diagram.model.RoleTaskComposite
-	 * @generated
-	 */
-	EClass getRoleTaskComposite();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.RoleTaskComposite#getRowIndex <em>Row Index</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Row Index</em>'.
-	 * @see org.eclipse.epf.diagram.model.RoleTaskComposite#getRowIndex()
-	 * @see #getRoleTaskComposite()
-	 * @generated
-	 */
-	EAttribute getRoleTaskComposite_RowIndex();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.TaskNode <em>Task Node</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.TaskNode
-	 * @generated
-	 */
-	EClass getTaskNode();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.TaskNode#getIndex <em>Index</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Index</em>'.
-	 * @see org.eclipse.epf.diagram.model.TaskNode#getIndex()
-	 * @see #getTaskNode()
-	 * @generated
-	 */
-	EAttribute getTaskNode_Index();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.WorkProductDescriptorNode <em>Work Product Descriptor Node</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Descriptor Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.WorkProductDescriptorNode
-	 * @generated
-	 */
-	EClass getWorkProductDescriptorNode();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.WorkBreakdownElementNode <em>Work Breakdown Element Node</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Breakdown Element Node</em>'.
-	 * @see org.eclipse.epf.diagram.model.WorkBreakdownElementNode
-	 * @generated
-	 */
-	EClass getWorkBreakdownElementNode();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.diagram.model.WorkProductComposite <em>Work Product Composite</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Composite</em>'.
-	 * @see org.eclipse.epf.diagram.model.WorkProductComposite
-	 * @generated
-	 */
-	EClass getWorkProductComposite();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.diagram.model.WorkProductComposite#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.diagram.model.WorkProductComposite#getType()
-	 * @see #getWorkProductComposite()
-	 * @generated
-	 */
-	EAttribute getWorkProductComposite_Type();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.draw2d.AbsoluteBendpoint <em>Absolute Bendpoint</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Absolute Bendpoint</em>'.
-	 * @see org.eclipse.draw2d.AbsoluteBendpoint
-	 * @model instanceClass="org.eclipse.draw2d.AbsoluteBendpoint"
-	 * @generated
-	 */
-    EDataType getAbsoluteBendpoint();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.draw2d.geometry.Point <em>Point</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Point</em>'.
-	 * @see org.eclipse.draw2d.geometry.Point
-	 * @model instanceClass="org.eclipse.draw2d.geometry.Point"
-	 * @generated
-	 */
-    EDataType getPoint();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.epf.uma.RoleDescriptor <em>Role Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Role Descriptor</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescriptor
-	 * @model instanceClass="org.eclipse.epf.uma.RoleDescriptor"
-	 * @generated
-	 */
-	EDataType getRoleDescriptor();
-
-	/**
-	 * 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
-	 */
-    ModelFactory getModelFactory();
-
-	/**
-	 * <!-- 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.epf.diagram.model.impl.DiagramImpl <em>Diagram</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getDiagram()
-		 * @generated
-		 */
-		EClass DIAGRAM = eINSTANCE.getDiagram();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.LinkImpl <em>Link</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.LinkImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getLink()
-		 * @generated
-		 */
-		EClass LINK = eINSTANCE.getLink();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute LINK__NAME = eINSTANCE.getLink_Name();
-
-		/**
-		 * The meta object literal for the '<em><b>Source</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference LINK__SOURCE = eINSTANCE.getLink_Source();
-
-		/**
-		 * The meta object literal for the '<em><b>Target</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference LINK__TARGET = eINSTANCE.getLink_Target();
-
-		/**
-		 * The meta object literal for the '<em><b>Bendpoints</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute LINK__BENDPOINTS = eINSTANCE.getLink_Bendpoints();
-
-		/**
-		 * The meta object literal for the '<em><b>Source End Point</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute LINK__SOURCE_END_POINT = eINSTANCE.getLink_SourceEndPoint();
-
-		/**
-		 * The meta object literal for the '<em><b>Target End Point</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute LINK__TARGET_END_POINT = eINSTANCE.getLink_TargetEndPoint();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.LinkedObjectImpl <em>Linked Object</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.LinkedObjectImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getLinkedObject()
-		 * @generated
-		 */
-		EClass LINKED_OBJECT = eINSTANCE.getLinkedObject();
-
-		/**
-		 * The meta object literal for the '<em><b>Linked Element</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference LINKED_OBJECT__LINKED_ELEMENT = eINSTANCE.getLinkedObject_LinkedElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.NamedNodeImpl <em>Named Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.NamedNodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getNamedNode()
-		 * @generated
-		 */
-		EClass NAMED_NODE = eINSTANCE.getNamedNode();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NAMED_NODE__NAME = eINSTANCE.getNamedNode_Name();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.NodeImpl <em>Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.NodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getNode()
-		 * @generated
-		 */
-		EClass NODE = eINSTANCE.getNode();
-
-		/**
-		 * The meta object literal for the '<em><b>Location</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NODE__LOCATION = eINSTANCE.getNode_Location();
-
-		/**
-		 * The meta object literal for the '<em><b>Width</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NODE__WIDTH = eINSTANCE.getNode_Width();
-
-		/**
-		 * The meta object literal for the '<em><b>Height</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NODE__HEIGHT = eINSTANCE.getNode_Height();
-
-		/**
-		 * The meta object literal for the '<em><b>Incoming Connections</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference NODE__INCOMING_CONNECTIONS = eINSTANCE.getNode_IncomingConnections();
-
-		/**
-		 * The meta object literal for the '<em><b>Outgoing Connections</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference NODE__OUTGOING_CONNECTIONS = eINSTANCE.getNode_OutgoingConnections();
-
-		/**
-		 * The meta object literal for the '<em><b>Read Only</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NODE__READ_ONLY = eINSTANCE.getNode_ReadOnly();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.ActivityDiagramImpl <em>Activity Diagram</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.ActivityDiagramImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getActivityDiagram()
-		 * @generated
-		 */
-		EClass ACTIVITY_DIAGRAM = eINSTANCE.getActivityDiagram();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.TypedNodeImpl <em>Typed Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.TypedNodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getTypedNode()
-		 * @generated
-		 */
-		EClass TYPED_NODE = eINSTANCE.getTypedNode();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TYPED_NODE__TYPE = eINSTANCE.getTypedNode_Type();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductDependencyDiagramImpl <em>Work Product Dependency Diagram</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.WorkProductDependencyDiagramImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductDependencyDiagram()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_DEPENDENCY_DIAGRAM = eINSTANCE.getWorkProductDependencyDiagram();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductNodeImpl <em>Work Product Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.WorkProductNodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductNode()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_NODE = eINSTANCE.getWorkProductNode();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_NODE__TYPE = eINSTANCE.getWorkProductNode_Type();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.ActivityDetailDiagramImpl <em>Activity Detail Diagram</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.ActivityDetailDiagramImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getActivityDetailDiagram()
-		 * @generated
-		 */
-		EClass ACTIVITY_DETAIL_DIAGRAM = eINSTANCE.getActivityDetailDiagram();
-
-		/**
-		 * The meta object literal for the '<em><b>Auto Layout</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT = eINSTANCE.getActivityDetailDiagram_AutoLayout();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.NodeContainerImpl <em>Node Container</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.NodeContainerImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getNodeContainer()
-		 * @generated
-		 */
-		EClass NODE_CONTAINER = eINSTANCE.getNodeContainer();
-
-		/**
-		 * The meta object literal for the '<em><b>Nodes</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference NODE_CONTAINER__NODES = eINSTANCE.getNodeContainer_Nodes();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.RoleNodeImpl <em>Role Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.RoleNodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getRoleNode()
-		 * @generated
-		 */
-		EClass ROLE_NODE = eINSTANCE.getRoleNode();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.RoleTaskCompositeImpl <em>Role Task Composite</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.RoleTaskCompositeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getRoleTaskComposite()
-		 * @generated
-		 */
-		EClass ROLE_TASK_COMPOSITE = eINSTANCE.getRoleTaskComposite();
-
-		/**
-		 * The meta object literal for the '<em><b>Row Index</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_TASK_COMPOSITE__ROW_INDEX = eINSTANCE.getRoleTaskComposite_RowIndex();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.TaskNodeImpl <em>Task Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.TaskNodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getTaskNode()
-		 * @generated
-		 */
-		EClass TASK_NODE = eINSTANCE.getTaskNode();
-
-		/**
-		 * The meta object literal for the '<em><b>Index</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_NODE__INDEX = eINSTANCE.getTaskNode_Index();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductDescriptorNodeImpl <em>Work Product Descriptor Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.WorkProductDescriptorNodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductDescriptorNode()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_DESCRIPTOR_NODE = eINSTANCE.getWorkProductDescriptorNode();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.WorkBreakdownElementNodeImpl <em>Work Breakdown Element Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.WorkBreakdownElementNodeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkBreakdownElementNode()
-		 * @generated
-		 */
-		EClass WORK_BREAKDOWN_ELEMENT_NODE = eINSTANCE.getWorkBreakdownElementNode();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.diagram.model.impl.WorkProductCompositeImpl <em>Work Product Composite</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.diagram.model.impl.WorkProductCompositeImpl
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getWorkProductComposite()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_COMPOSITE = eINSTANCE.getWorkProductComposite();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_COMPOSITE__TYPE = eINSTANCE.getWorkProductComposite_Type();
-
-		/**
-		 * The meta object literal for the '<em>Absolute Bendpoint</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.draw2d.AbsoluteBendpoint
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getAbsoluteBendpoint()
-		 * @generated
-		 */
-		EDataType ABSOLUTE_BENDPOINT = eINSTANCE.getAbsoluteBendpoint();
-
-		/**
-		 * The meta object literal for the '<em>Point</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.draw2d.geometry.Point
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getPoint()
-		 * @generated
-		 */
-		EDataType POINT = eINSTANCE.getPoint();
-
-		/**
-		 * The meta object literal for the '<em>Role Descriptor</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.RoleDescriptor
-		 * @see org.eclipse.epf.diagram.model.impl.ModelPackageImpl#getRoleDescriptor()
-		 * @generated
-		 */
-		EDataType ROLE_DESCRIPTOR = eINSTANCE.getRoleDescriptor();
-
-	}
-
-} //ModelPackage
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/NamedNode.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/NamedNode.java
deleted file mode 100644
index edc3cd6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/NamedNode.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * A diagram node with name
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface NamedNode extends Node {
-	/**
-	 * Gets node name
-	 * 
-	 * @return the name of this node
-	 * @model
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.NamedNode#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Gets the suppression status of this node
-	 * 
-	 * @return <code>true</code> if it is suppressed, <code>false</code>
-	 *         otherwise
-	 */
-	boolean isSuppressed();
-
-	/**
-	 * Gets the wrapper of the method element that this node represents
-	 * 
-	 * @return the wrapper
-	 */
-	Object getWrapper();
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Node.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Node.java
deleted file mode 100644
index aeda2ae..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Node.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.uma.GraphNode;
-
-/**
- * The diagram node
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model abstract="true"
- */
-public interface Node extends LinkedObject {
-
-	/**
-	 * Gets location of this node
-	 * 
-	 * @model transient="true"
-	 */
-	Point getLocation();
-
-	/**
-	 * Gets width
-	 * 
-	 * @model default="-1" transient="true"
-	 */
-	int getWidth();
-
-	/**
-	 * Gets height
-	 * 
-	 * @return the height
-	 * @model default="-1" transient="true"
-	 */
-	int getHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Node#getHeight <em>Height</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Height</em>' attribute.
-	 * @see #getHeight()
-	 * @generated
-	 */
-	void setHeight(int value);
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Node#getWidth <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Width</em>' attribute.
-	 * @see #getWidth()
-	 * @generated
-	 */
-	void setWidth(int value);
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Node#getLocation <em>Location</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Location</em>' attribute.
-	 * @see #getLocation()
-	 * @generated
-	 */
-	void setLocation(Point value);
-
-	/**
-	 * Gets incoming links
-	 * 
-	 * @model type="Link" opposite="target" lower="0"
-	 */
-	EList<Link> getIncomingConnections();
-
-	/**
-	 * Gets outgoing links
-	 * 
-	 * @model type="Link" containment="true" opposite="source" lower="0"
-	 */
-	EList<Link> getOutgoingConnections();
-
-	/**
-	 * Checks if this node is read-only
-	 * 
-	 * @model
-	 */
-	boolean isReadOnly();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.Node#isReadOnly <em>Read Only</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Read Only</em>' attribute.
-	 * @see #isReadOnly()
-	 * @generated
-	 */
-	void setReadOnly(boolean value);
-
-	/**
-	 * Gets the diagram of this node
-	 * 
-	 * @return
-	 */
-	Diagram getDiagram();
-
-	/**
-	 * Sets diagram for this node
-	 * 
-	 * @param diagram
-	 */
-	void setDiagram(Diagram diagram);
-
-	/**
-	 * Gets the GraphNode associated with this node.
-	 * 
-	 * @return
-	 */
-	GraphNode getGraphNode();
-
-	/**
-	 * Gets the type of method element adapter. Method element adapter is a node
-	 * internal {@link Adapter adapter} that is listening on changes of linked
-	 * method element or its wrapper to update the node accordingly.
-	 * 
-	 * @return the class of the method element adapter of this node
-	 */
-	Class getMethodElementAdapterType();
-
-	/**
-	 * This method is used to set the UMA diagram for the new node so it can
-	 * find the GraphNode for the linked method element.
-	 * 
-	 * @param umaDiagram
-	 */
-	void setUMADiagram(org.eclipse.epf.uma.Diagram umaDiagram);
-
-	/**
-	 * Sets the graph node that is the container of the
-	 * {@link #getGraphNode() linked graph node}
-	 * 
-	 * @param umaContainer
-	 */
-	void setUMAContainer(GraphNode umaContainer);
-
-	/**
-	 * Adds the given consumer to the consumer list of this node.
-	 * 
-	 * @param consumer
-	 */
-	void addConsumer(Object consumer);
-
-	/**
-	 * Removes the given consumer from the consumer list of this node. Disposes
-	 * the node if it does not have any more consumer after this call. Disposing
-	 * a node will take care of removing this node's listener from the UMA
-	 * object and all the adapters that had been added to the adapter list of
-	 * this node.
-	 * 
-	 * @param consumer
-	 */
-	void removeConsumer(Object consumer);
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/NodeContainer.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/NodeContainer.java
deleted file mode 100644
index d1ddf59..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/NodeContainer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * A composite node that can contain child nodes
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model abstract="true"
- */
-public interface NodeContainer extends Node {
-	/**
-	 * Gets child nodes
-	 * 
-	 * @model containment="true" type="Node"
-	 */
-	EList<Node> getNodes();
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Resources.properties b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Resources.properties
deleted file mode 100644
index ddeae52..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/Resources.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-type_activity=Activity Diagram
-defaultBaseName=New {0}
-type_WPD=Work Product Dependency Diagram
-type_activityDetail=Activity Detail Diagram
-addFreeTxt=Add Free Text
-type_unknown=Unknown
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/RoleNode.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/RoleNode.java
deleted file mode 100644
index caa4673..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/RoleNode.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * Node that represents a role in diagram
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface RoleNode extends NamedNode {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/RoleTaskComposite.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/RoleTaskComposite.java
deleted file mode 100644
index 59636ef..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/RoleTaskComposite.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * A container that groups a RoleNode and TaskNodes whose tasks the Role performs.
- * The linked object for RoleTaskComposite is RoleDescriptor.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface RoleTaskComposite extends NodeContainer {
-	/**
-	 * Returns the value of the '<em><b>Row Index</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Row Index</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Row Index</em>' attribute.
-	 * @see #setRowIndex(int)
-	 * @see org.eclipse.epf.diagram.model.ModelPackage#getRoleTaskComposite_RowIndex()
-	 * @model
-	 * @generated
-	 */
-	int getRowIndex();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.RoleTaskComposite#getRowIndex <em>Row Index</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Row Index</em>' attribute.
-	 * @see #getRowIndex()
-	 * @generated
-	 */
-	void setRowIndex(int value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/TaskNode.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/TaskNode.java
deleted file mode 100644
index a0413e6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/TaskNode.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * Node that represents a task in diagram
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface TaskNode extends NamedNode {
-
-	/**
-	 * Returns the value of the '<em><b>Index</b></em>' attribute.
-	 * The default value is <code>"-1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Index</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Index</em>' attribute.
-	 * @see #setIndex(int)
-	 * @see org.eclipse.epf.diagram.model.ModelPackage#getTaskNode_Index()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getIndex();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.TaskNode#getIndex <em>Index</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Index</em>' attribute.
-	 * @see #getIndex()
-	 * @generated
-	 */
-	void setIndex(int value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/TypedNode.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/TypedNode.java
deleted file mode 100644
index 5c0f4ca..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/TypedNode.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * Node that is not linked to any method element (not a {@link LinkedObject}).
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface TypedNode extends Node {
-	static final int SYNCH_BAR = 1;
-
-	static final int DECISION = 2;
-
-	static final int START = 3;
-
-	static final int END = 4;
-
-	static final int STICKY_NOTE = 5;
-
-	static final int FREE_TEXT = 6;
-
-	/**
-	 * Gets type. The type must be one of the constants defined in this
-	 * interface.
-	 * 
-	 * @model
-	 */
-	int getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.TypedNode#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(int value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkBreakdownElementNode.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkBreakdownElementNode.java
deleted file mode 100644
index e2714fa..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkBreakdownElementNode.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.epf.uma.WorkBreakdownElement;
-
-/**
- * Node that represents a {@link WorkBreakdownElement}
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface WorkBreakdownElementNode extends NamedNode {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductComposite.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductComposite.java
deleted file mode 100644
index dc12610..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductComposite.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * Node that represents a group of {@link WorkProduct}
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- * @model
- */
-public interface WorkProductComposite extends NodeContainer {
-
-	public static final int INPUTS = 1;
-
-	public static final int OUTPUTS = 2;
-
-	/**
-	 * Gets type.
-	 * 
-	 * @return {@link #INPUTS} or {@link #OUTPUTS}
-	 * @model
-	 */
-	int getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.WorkProductComposite#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(int value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductDependencyDiagram.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductDependencyDiagram.java
deleted file mode 100644
index 97db81a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductDependencyDiagram.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * This interface represents the model of the Work Product Dependency diagram
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface WorkProductDependencyDiagram extends Diagram {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductDescriptorNode.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductDescriptorNode.java
deleted file mode 100644
index dc48129..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductDescriptorNode.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * Node for WorkProductDescriptor in ActivityDetailDiagram.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface WorkProductDescriptorNode extends NamedNode {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductNode.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductNode.java
deleted file mode 100644
index 35d4fad..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/WorkProductNode.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model;
-
-/**
- * This class represents a node in Work Product Dependency Diagram
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface WorkProductNode extends NamedNode {
-
-	public static final int ARTIFACT = 1;
-
-	public static final int DELIVERABLE = 2;
-
-	public static final int OUTCOME = 3;
-
-	/**
-	 * Gets the work product type of this node. This must be one of the
-	 * following constants: {@link #ARTIFACT}, {@link #DELIVERABLE}, {@link #OUTCOME}
-	 * 
-	 * @model
-	 */
-	int getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.diagram.model.WorkProductNode#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(int value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ActivityDetailDiagramImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ActivityDetailDiagramImpl.java
deleted file mode 100644
index c361d21..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ActivityDetailDiagramImpl.java
+++ /dev/null
@@ -1,955 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.IActivityDetailDiagramChangeListener;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Activity Detail Diagram</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.ActivityDetailDiagramImpl#isAutoLayout <em>Auto Layout</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActivityDetailDiagramImpl extends DiagramImpl implements
-		ActivityDetailDiagram {
-	/**
-	 * The default value of the '{@link #isAutoLayout() <em>Auto Layout</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAutoLayout()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean AUTO_LAYOUT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isAutoLayout() <em>Auto Layout</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAutoLayout()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean autoLayout = AUTO_LAYOUT_EDEFAULT;
-
-	private class ActivityDetailDiagramChangeListener extends ActivityAdapter
-			implements IActivityDetailDiagramChangeListener {
-		// /* (non-Javadoc)
-		// * @see
-		// org.eclipse.epf.diagram.model.impl.DiagramImpl.ActivityAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		// */
-		// public void notifyChanged(Notification msg) {
-		// if(!notificationEnabled) return;
-		// notificationEnabled = false;
-		// try {
-		// Object obj;
-		// switch(msg.getFeatureID(Activity.class)) {
-		// case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-		// repopulateDiagram();
-		// break;
-		// }
-		// }
-		// finally {
-		// notificationEnabled = true;
-		// }
-		//
-		// }
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected ActivityDetailDiagramImpl() {
-		super();
-
-		diagramChangeListener = new ActivityDetailDiagramChangeListener();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT:
-				return isAutoLayout() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT:
-				setAutoLayout(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT:
-				setAutoLayout(AUTO_LAYOUT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT:
-				return autoLayout != AUTO_LAYOUT_EDEFAULT;
-		}
-		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(" (autoLayout: "); //$NON-NLS-1$
-		result.append(autoLayout);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * 
-	 */
-	public void repopulateDiagram() {
-		// clear diagram
-		//
-
-		int size = getNodes().size();
-
-		// disable notification for all nodes in this diagram to avoid unwanted
-		// concurrent modification of their connection list
-		//
-		for (int i = 0; i < size; i++) {
-			NodeImpl node = ((NodeImpl) getNodes().get(i));
-			node.notificationEnabled = false;
-		}
-		for (Iterator iteration = getNodes().iterator(); iteration.hasNext();) {
-			Node node = (Node) iteration.next();
-
-			// clear all links
-			//
-			for (Iterator iter = node.getOutgoingConnections().iterator(); iter
-					.hasNext();) {
-				Link link = (Link) iter.next();
-				link.setTarget(null);
-			}
-
-			for (Iterator iter = node.getIncomingConnections().iterator(); iter
-					.hasNext();) {
-				Link link = (Link) iter.next();
-				link.setSource(null);
-			}
-			node.getOutgoingConnections().clear();
-			node.getIncomingConnections().clear();
-		}
-
-		getNodes().clear();
-
-		populateDiagram();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.ACTIVITY_DETAIL_DIAGRAM;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public boolean isAutoLayout() {
-		if(isGraphicalDataRequired()) {
-			return GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_TRUE.equals(
-					GraphicalDataHelper.getAutoLayoutFlag(this));
-		}
-		return autoLayout;
-	}
-
-
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAutoLayout(boolean newAutoLayout) {
-		boolean oldAutoLayout = autoLayout;
-		autoLayout = newAutoLayout;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT, oldAutoLayout, autoLayout));
-	}
-	
-	public void doSetAutoLayout(boolean newAutoLayout) {
-		if(isGraphicalDataRequired()) {
-			GraphicalDataHelper.createProperty(this.graphNode, 
-					GraphicalDataHelper.PROP_AUTO_LAYOUT, 
-					String.valueOf(newAutoLayout));
-		}
-		else {
-			setAutoLayout(newAutoLayout);
-		}
-	}
-	
-	@Override
-	public Collection getChildren() {
-		return getAllBreakdownElements(true);
-	}
-
-	/**
-	 * Gets all breakdown elements or their wrappers for the activity of this
-	 * diagram
-	 * 
-	 * @return
-	 */
-	Collection getAllBreakdownElements(boolean filterSuppressed) {
-		ArrayList breakdownElements = new ArrayList();
-		AdapterFactory[] adapterFactories;
-		if (filter instanceof IAdapterFactoryFilter) {
-			IAdapterFactoryFilter adapterFactoryFilter = (IAdapterFactoryFilter) filter;
-			adapterFactories = new AdapterFactory[] {
-					adapterFactoryFilter.getWBSAdapterFactory(),
-					adapterFactoryFilter.getTBSAdapterFactory(),
-					adapterFactoryFilter.getWPBSAdapterFactory() };
-		} else {
-			adapterFactories = DEFAULT_ADAPTER_FACTORIES;
-		}
-		if (wrapper != null) {
-			List wrappers = ProcessUtil.getWrappers(wrapper, adapterFactories);
-			for (Iterator iter = wrappers.iterator(); iter.hasNext();) {
-				BreakdownElementWrapperItemProvider w = (BreakdownElementWrapperItemProvider) iter
-						.next();
-				extractChildren(w, w, breakdownElements, filterSuppressed);
-			}
-		} else {
-			for (int i = 0; i < adapterFactories.length; i++) {
-				AdapterFactory adapterFactory = adapterFactories[i];
-				if (getObject() != null) {
-					if (adapterFactory != null) {
-						ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-								.adapt(getObject(),
-										ITreeItemContentProvider.class);
-						extractChildren(adapter, getObject(),
-								breakdownElements, filterSuppressed);
-					}
-				}
-			}
-		}
-		
-		// add descriptors of subartifacts
-		//
-		AdapterFactory wpbsAdapterFactory = adapterFactories[2];
-		for (Iterator<?> iterator = new ArrayList(breakdownElements).iterator(); iterator
-				.hasNext();) {
-			Object child = iterator.next();
-			Object e = TngUtil.unwrap(child);
-			if(e instanceof WorkProductDescriptor) {
-				WorkProduct wp = ((WorkProductDescriptor)e).getWorkProduct();
-				if(wp instanceof Artifact
-						// FIXME: need to used realized list of subartifacts after similar fix is made in
-						// org.eclipse.epf.library.edit.process.WorkProductDescriptorItemProvider.java
-						//
-						&& !((Artifact)wp).getContainedArtifacts().isEmpty() 
-				) {
-					collectSubartifactDescriptors(child, filterSuppressed, breakdownElements, wpbsAdapterFactory);
-				}
-			}
-		}
-		
-		return breakdownElements;
-	}
-
-	private void collectSubartifactDescriptors(Object child,
-			boolean filterSuppressed, ArrayList<Object> breakdownElements,
-			AdapterFactory wpbsAdapterFactory) {
-		// disable rollup before getting the children
-		//
-		boolean oldRolledUp = false;
-		IBSItemProvider adapter = null;
-		if(child instanceof BSActivityItemProvider) {
-			BSActivityItemProvider itemProvider = (BSActivityItemProvider) child;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.basicSetRolledUp(false);
-			adapter = itemProvider;
-		}
-		else if(adapter instanceof IBSItemProvider){
-			IBSItemProvider itemProvider = (IBSItemProvider) child;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.setRolledUp(false);
-			adapter = itemProvider;
-		}
-		
-		try {
-
-			AdapterFactoryTreeIterator<Object> iter = new AdapterFactoryTreeIterator<Object>(
-					wpbsAdapterFactory, child, false);
-			while (iter.hasNext()) {
-				Object o = iter.next();
-				if(filterSuppressed) {
-					if(!getSuppression().isSuppressed(o)) {
-						breakdownElements.add(o);
-					}
-				}
-				else {
-					breakdownElements.add(o);
-				}
-			}
-		} finally {
-			// restore rolled-up flag
-			//
-			if (adapter != null) {
-				adapter.setRolledUp(oldRolledUp);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#populateNodes()
-	 */
-	protected void populateNodes() {
-		boolean oldNotify = notificationEnabled;
-		try {
-			notificationEnabled = false;
-			Activity act = (Activity) getObject();
-			if (act == null)
-				return;
-
-			if (isGraphicalDataRequired()) {
-				// to populate the typednode.
-				super.populateNodes();
-			}
-
-			if (filter == null) {
-				filter = ((ConfigurableComposedAdapterFactory) DEFAULT_ADAPTER_FACTORIES[0])
-						.getFilter();
-			}
-
-			// Node newNode = null;
-			ArrayList nodes = new ArrayList();
-			Collection breakdownElements = getAllBreakdownElements(true);
-			Collection roleDescriptors = new HashSet();
-			for (Iterator iterator = breakdownElements.iterator(); iterator
-					.hasNext();) {
-				Object object = iterator.next();
-				Object element = TngUtil.unwrap(object);
-				if (element instanceof TaskDescriptor) {
-					TaskDescriptor descriptor = (TaskDescriptor) element;
-					RoleDescriptor roleDescriptor = descriptor
-							.getPerformedPrimarilyBy();
-					if (roleDescriptor != null
-							&& filter.accept(roleDescriptor)
-							// TODO: need to check if the role descriptor is
-							// inherited and locally suppressed
-							// if locally suppressed, check the wrapper of the
-							// role descriptor
-							//
-							&& !roleDescriptor.getSuppressed().booleanValue()
-							&& !roleDescriptors.contains(roleDescriptor)) {
-						roleDescriptors.add(roleDescriptor);
-						// newNode = createRoleTaskComposite(roleDescriptor);
-						// if(newNode != null) {
-						// if(ProcessUtil.isInherited(object)) {
-						// // task descriptor is inherited, its primary
-						// performer is not local
-						// // set role node of the RoleTaskComposite to
-						// read-only
-						// //
-						// Node roleNode = (Node)
-						// ((NodeContainer)newNode).getNodes().get(0);
-						// roleNode.setReadOnly(true);
-						// }
-						// nodes.add(newNode);
-						// }
-						createRoleTaskCompositeRows(roleDescriptor, object,
-								nodes);
-					}
-					if (roleDescriptors.contains(roleDescriptor)) {
-						createTaskInputOutputNodes(descriptor, nodes);
-					}
-				}
-			}
-			selectNodes(nodes);
-		} finally {
-			notificationEnabled = oldNotify;
-		}
-	}
-	
-	private static int getNumberOfRows(int totalTasks, int tasksPerRow) {
-		int n = totalTasks / tasksPerRow;
-		return (tasksPerRow * n) == totalTasks ? n : n + 1;
-	}
-
-    private void createRoleTaskCompositeRows(RoleDescriptor roleDescriptor, 
-    		Object object, List nodes) {
-    	
-    	int tasksPerRow = GraphicalDataHelper.getTasksPerRow();
-    	List<?> primaryTaskDescriptors = //AssociationHelper.getPrimaryTaskDescriptors(roleDescriptor);
-    		getRealizedPrimaryTaskDescriptors(roleDescriptor);
-    	int totalTasks = primaryTaskDescriptors.size();
-    	
-    	if (tasksPerRow > 0 && totalTasks > 0 && totalTasks > tasksPerRow
-				&& isAutoLayout()) {
-			for (int i = 0; i < getNumberOfRows(totalTasks, tasksPerRow); i++) {
-				Node newNode = createRoleTaskComposite(roleDescriptor, i);
-				if (newNode != null) {
-					if (ProcessUtil.isInherited(object)) {
-						// task descriptor is inherited, its primary performer
-						// is not local
-						// set role node of the RoleTaskComposite to read-only
-						//
-						List<Node> nods = ((NodeContainer) newNode).getNodes();
-						if (!nods.isEmpty()) {
-							Node roleNode = (Node) nods.get(0);
-							roleNode.setReadOnly(true);
-						}
-					}
-					nodes.add(newNode);
-				}
-			}
-		} else {
-			Node newNode = createRoleTaskComposite(roleDescriptor);
-			if (newNode != null) {
-				if (ProcessUtil.isInherited(object)) {
-					// task descriptor is inherited, its primary performer is
-					// not local
-					// set role node of the RoleTaskComposite to read-only
-					//
-					List<Node> nods = ((NodeContainer) newNode).getNodes();
-					if (!nods.isEmpty()) {
-						Node roleNode = (Node) nods.get(0);
-						roleNode.setReadOnly(true);
-					}
-				}
-				nodes.add(newNode);
-			}
-		}
-    	
-	}
-
-	/**
-	 * @param taskDescriptor
-	 * @return
-	 */
-	Node createNode(TaskDescriptor taskDescriptor) {
-		Node node = ModelFactory.eINSTANCE.createTaskNode();
-		node.setUMAContainer(getGraphNode());
-		node.setDiagram(this);
-		node.setObject(taskDescriptor);
-		return node;
-	}
-
-	/**
-	 * @param descriptor
-	 * @return
-	 */
-	Node createNode(WorkProductDescriptor descriptor) {
-		Node node = ModelFactory.eINSTANCE.createWorkProductDescriptorNode();
-		node.setUMAContainer(getGraphNode());
-		node.setDiagram(this);
-		node.setObject(descriptor);
-		return node;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#populateLinks()
-	 */
-	protected void populateLinks() {
-		populateLinks(getNodes(), true);
-	}
-
-	/**
-	 * @param newNodes
-	 * @param disableNotification
-	 */
-	protected void populateLinks(Collection newNodes, boolean disableNotification) {
-		// fill outgoing/incoming connection lists of all nodes
-		//
-		int size = getNodes().size();
-		boolean[] notifies = new boolean[size];
-		try {
-			if (disableNotification)
-				// disable notification for all nodes in this diagram to avoid
-				// unwanted concurrent modification of their connection list
-				//
-				for (int i = 0; i < size; i++) {
-					Node node = ((Node) getNodes().get(i));
-					notifies[i] = node.eDeliver();
-					node.eSetDeliver(false);
-				}
-
-			for (Iterator iter = newNodes.iterator(); iter.hasNext();) {
-				Node child = (Node) iter.next();
-				if (child instanceof WorkProductComposite) {
-					// WorkProductComposite workproductComposite =
-					// (WorkProductComposite) child.getObject();
-					WorkProductComposite workproductComposite = (WorkProductComposite) child;
-					if (workproductComposite.getType() == WorkProductComposite.INPUTS) {
-						Object object = workproductComposite.getObject();
-						if (object instanceof TaskDescriptor) {
-							Node node = GraphicalDataHelper.findNode(this,
-									object, TaskNode.class);
-							if(node != null && GraphicalDataHelper.findLink(child, object) == null) {
-								Link link = ModelFactory.eINSTANCE.createLink();
-								link.setSource(child);
-								link.setTarget(node);
-								if(isGraphicalDataRequired()) {
-									GraphicalDataHelper.addGraphicalData(link);
-								}
-							}
-						}
-					}
-					if (workproductComposite.getType() == WorkProductComposite.OUTPUTS) {
-						Object object = workproductComposite.getObject();
-						if (object instanceof TaskDescriptor) {
-							Node node = GraphicalDataHelper.findNode(this,
-									object, TaskNode.class);
-							if(node != null && GraphicalDataHelper.findLink(node, object) == null) {
-								Link link = ModelFactory.eINSTANCE.createLink();
-								link.setSource(node);
-								link.setTarget(child);
-								if(isGraphicalDataRequired()) {
-									GraphicalDataHelper.addGraphicalData(link);
-								}
-							}
-						}
-					}
-				}
-			}
- 		} finally {
-			if (disableNotification)
-				// restore notification flag
-				//
-				for (int i = 0; i < size; i++) {
-					((EObject) getNodes().get(i)).eSetDeliver(notifies[i]);
-				}
-		}
-
-	}
-	
-	private RoleTaskComposite doCreateRoleTaskComposite(RoleDescriptor roleDescriptor, int index) {
-		RoleTaskComposite roleTaskComposite = null;
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (element instanceof RoleTaskComposite) {
-				RoleTaskComposite rtc = (RoleTaskComposite) element;
-				if(rtc.getLinkedElement() == roleDescriptor && rtc.getRowIndex() == index) {
-					roleTaskComposite = rtc;
-					break;
-				}
-			}
-		}
-
-		if (roleTaskComposite == null) {
-			roleTaskComposite = ModelFactory.eINSTANCE
-					.createRoleTaskComposite();
-			roleTaskComposite.setUMAContainer(getGraphNode());
-			roleTaskComposite.setDiagram(this);
-		}
-		return roleTaskComposite;
-	}
-
-	public RoleTaskComposite createRoleTaskComposite(
-			RoleDescriptor roleDescriptor) {
-		RoleTaskComposite roleTaskComposite = doCreateRoleTaskComposite(roleDescriptor,0);
-		roleTaskComposite.setObject(roleDescriptor);
-		return roleTaskComposite;
-	}
-	
-	public RoleTaskComposite createRoleTaskComposite(
-			RoleDescriptor roleDescriptor, int rowIndex) {
-		RoleTaskComposite roleTaskComposite = doCreateRoleTaskComposite(roleDescriptor, rowIndex);
-		((RoleTaskCompositeImpl)roleTaskComposite).setRowIndex(rowIndex);
-		roleTaskComposite.setObject(roleDescriptor);
-		return roleTaskComposite;
-	}
-
-	public WorkProductComposite createWorkProductComposite(
-			TaskDescriptor taskDescriptor, int type) {
-		WorkProductComposite workproductComposite = null;
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (element instanceof WorkProductComposite) {
-				WorkProductComposite wpc = (WorkProductComposite) element;
-				if(wpc.getLinkedElement() == taskDescriptor && wpc.getType() == type) {					
-					workproductComposite = wpc;
-					break;
-				}
-			}
-		}
-		if(workproductComposite == null) {
-			workproductComposite = ModelFactory.eINSTANCE
-			.createWorkProductComposite();
-			workproductComposite.setType(type);
-		}
-		workproductComposite.setUMAContainer(getGraphNode());
-		workproductComposite.setDiagram(this);
-		workproductComposite.setObject(taskDescriptor);
-		return workproductComposite;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#getType()
-	 */
-	protected int getType() {
-		return GraphicalDataHelper.ACTIVITY_DETAIL_DIAGRAM;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#getDiagramChangeListenerType()
-	 */
-	protected Class getDiagramChangeListenerType() {
-		return IActivityDetailDiagramChangeListener.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#getBreakdownElementType()
-	 */
-	protected Class getBreakdownElementType() {
-		return Descriptor.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#toNode(org.eclipse.epf.uma.MethodElement)
-	 */
-	protected Node toNode(MethodElement e) {
-		if (e instanceof RoleDescriptor) {
-			List list = //AssociationHelper.getPrimaryTaskDescriptors((RoleDescriptor) e);
-				getRealizedPrimaryTaskDescriptors((RoleDescriptor)e);
-			if(!list.isEmpty()) {
-				for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-					Object obj = iterator.next();
-					if (obj instanceof TaskDescriptor) {
-						createTaskInputOutputNodes((TaskDescriptor) obj, getNodes());
-					}
-				}
-				return createRoleTaskComposite((RoleDescriptor) e);
-			}
-		} else if (e instanceof TaskDescriptor) {
-			createTaskInputOutputNodes((TaskDescriptor) e, getNodes());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#addNode(java.lang.Object)
-	 */
-	protected Node addNode(Object obj) {
-		if (filter == null) {
-			filter = ((ConfigurableComposedAdapterFactory) DEFAULT_ADAPTER_FACTORIES[0])
-					.getFilter();
-		}
-		if (obj instanceof TaskDescriptor
-				&& !filter.accept(((TaskDescriptor) obj)
-						.getPerformedPrimarilyBy()))
-			return null;
-		Node node = null;
-		if (obj instanceof TaskDescriptor) {
-			RoleDescriptor roleDescriptor = ((TaskDescriptor) obj)
-					.getPerformedPrimarilyBy();
-			node = findNode(this, roleDescriptor);
-			if (node == null) {
-				node = createRoleTaskComposite(roleDescriptor);
-				getNodes().add(node);
-			} else {
-				node = super.addNode(getNodes(), obj);
-			}
-		} else {
-			node = super.addNode(getNodes(), obj);
-		}
-		if (node != null) {
-			populateLinks(Collections.singletonList(node), false);
-		}
-		return node;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#addNodes(java.util.Collection)
-	 */
-	protected Collection addNodes(Collection collection) {
-		Collection nodes = super.addNodes(collection);
-		if (!nodes.isEmpty()) {
-			populateLinks(nodes, false);
-		}
-		return nodes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#removeFromUmaModel(org.eclipse.epf.diagram.model.Node)
-	 */
-	protected void removeFromUmaModel(Node removedNode) {
-		// if the removed node is a TaskNode that had been moved to a
-		// RoleTaskComposite
-		// then its TaskDescriptor will not be removed from model
-		//
-		if (GraphicalDataHelper.findNode(this, removedNode.getObject()) != null) {
-			return;
-		}
-		if (removedNode instanceof RoleTaskComposite
-				|| removedNode instanceof WorkProductComposite)
-			return;
-
-		super.removeFromUmaModel(removedNode);
-	}
-
-	protected void addToUmaModel(int position, Node addedNode) {
-		super.addToUmaModel(position, addedNode);
-
-		if (addedNode.getObject() instanceof BreakdownElement) {
-			Activity act = (Activity) getObject();
-			// translate Node index to Activity index
-			int i = toActivityIndex(position);
-			System.out
-					.println("ActivityDetailDiagram.addToUmaModel(): WorkBreakdownElement index: " + i); //$NON-NLS-1$
-			if (i == -1) {
-				act.getBreakdownElements().add(addedNode.getObject());
-			} else {
-				act.getBreakdownElements().add(i, addedNode.getObject());
-			}
-		}
-
-	}
-
-	private int toActivityIndex(int index) {
-		if (index == -1)
-			return index;
-		int size = getNodes().size();
-		int i = index + 1;
-		if (i == size)
-			return -1;
-		Node node = (Node) getNodes().get(i);
-		if (node == null)
-			return -1;
-
-		for (; !(node.getObject() instanceof BreakdownElement) && i < size; i++) {
-			node = (Node) getNodes().get(i);
-		}
-		if (i == size)
-			return -1;
-		Activity act = (Activity) getObject();
-		return act.getBreakdownElements().indexOf(node.getObject());
-
-	}
-
-	public Node findNode(ActivityDetailDiagram diagram, Object object) {
-		for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (object == element.getObject()) {
-				return element;
-			}
-		}
-		return null;
-	}
-	
-	private static final AdapterFactory[] DEFAULT_ADAPTER_FACTORIES = {			
-		TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory(),
-		TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory(),
-		TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory() 
-	}; 
-	
-	public void createTaskInputOutputNodes(TaskDescriptor descriptor, Collection nodes) {
-		Node newNode = null;
-		if (!descriptor.getMandatoryInput().isEmpty()) {
-			newNode = createWorkProductComposite(descriptor,
-					WorkProductComposite.INPUTS);
-			nodes.add(newNode);
-		}
-		if (!descriptor.getOutput().isEmpty()) {
-			newNode = createWorkProductComposite(descriptor,
-					WorkProductComposite.OUTPUTS);
-			nodes.add(newNode);
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#setNew(boolean)
-	 */
-	public void setNew(boolean n) {
-		super.setNew(n);
-		if(n){
-			doSetAutoLayout(true);
-		}
-	}
-	
-	@Override
-	/**
-	 * Enable this code, once the task index is fixed in the roletaskcomposite.
-	 */
-	public void moveNode(Object movedObject, int position, Object oldPosition) {
-		if(!(movedObject instanceof TaskDescriptor))
-			return;
-		TaskDescriptor taskDescriptor = (TaskDescriptor)movedObject;
-		
-		if (!filter.accept(taskDescriptor.getPerformedPrimarilyBy()))
-			return;
-		
-		RoleDescriptor roleDescriptor = ((TaskDescriptor) movedObject)
-											.getPerformedPrimarilyBy();
-		Node roleNode = findNode(this, roleDescriptor);
-		if(roleNode == null) return;
-		
-		int oldPos = 0;
-		if(oldPosition instanceof Integer){
-			oldPos = ((Integer)oldPosition).intValue();
-		}
-		TaskNode taskNode = (TaskNode)GraphicalDataHelper.findNode(
-				(NodeContainer)roleNode, taskDescriptor,
-				TaskNode.class);
-		
-		//move up
-		if(oldPos > position){
-			int i = taskNode.getIndex();
-			Node prevNode = findTaskNode((RoleTaskComposite)roleNode, i-1);
-			if(prevNode != null){
-				taskNode.setIndex(i-1);
-				((TaskNode)prevNode).setIndex(i);
-			}
-			
-		}else{
-			// move down
-			int i = taskNode.getIndex();
-			Node nextNode = findTaskNode((RoleTaskComposite)roleNode, i+1);
-			if(nextNode != null){
-				taskNode.setIndex(i+1);
-				((TaskNode)nextNode).setIndex(i);
-			}
-		}
-		
-	}
-	
-	private Node findTaskNode(RoleTaskComposite container, int index) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if(element instanceof TaskNode){
-				if(((TaskNode)element).getIndex() == index){
-					return element;
-				}
-			}
-		}
-		return null;
-	}
-	
-	public List getRealizedPrimaryTaskDescriptors(RoleDescriptor r){
-		List list = new ArrayList();
-		if(r != null){
-			List actualList = AssociationHelper.getPrimaryTaskDescriptors(r);
-			Collection collection = getAllBreakdownElements(true);
-			for(Iterator iterator = actualList.iterator(); iterator.hasNext();){
-				Object e = iterator.next();
-				if(TngUtil.contains(collection, e)){
-					list.add(e);
-				}
-			}
-		}
-		return list;
-	}
-	
-} // ActivityDetailDiagramImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ActivityDiagramImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ActivityDiagramImpl.java
deleted file mode 100644
index a4fc78c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ActivityDiagramImpl.java
+++ /dev/null
@@ -1,633 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.IActivityDiagramChangeListener;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.WBSActivityItemProvider;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Activity Diagram</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ActivityDiagramImpl extends DiagramImpl implements ActivityDiagram {
-	private class ActivityDiagramChangeListener extends ActivityAdapter
-			implements IActivityDiagramChangeListener {
-
-	};
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected ActivityDiagramImpl() {
-		super();
-
-		diagramChangeListener = new ActivityDiagramChangeListener();
-	}
-
-	protected Class getDiagramChangeListenerType() {
-		return IActivityDiagramChangeListener.class;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.ACTIVITY_DIAGRAM;
-	}
-
-	protected void populateNodes() {
-		// Activity act = (Activity) getObject();
-		org.eclipse.epf.uma.Diagram diagram = getUMADiagram();
-
-		// add TypedNodes
-		//
-		List typedNodes = new ArrayList();
-		for (Iterator iter = diagram.getContained().iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			int type = getType(element);
-			if (type > 0) {
-				TypedNode node = ModelFactory.eINSTANCE.createTypedNode();
-				node.setType(type);
-				node.setObject(element);
-				typedNodes.add(node);
-			}
-		}
-		getNodes().addAll(typedNodes);
-
-		// add WorkBreakdownElementNodes
-		//
-		addElementNodes();
-	}
-
-	private static boolean isValidWorkOrder(WorkOrder wo, Object pred) {
-		if (wo.getPred() == pred) {
-			return true;
-		}
-
-		if (pred instanceof Activity) {
-			Activity act = (Activity) pred;
-			// check if predecessor reference in the given work order is base of
-			// pred
-			//
-			for (VariabilityElement ve = act.getVariabilityBasedOnElement(); ve != null; ve = ve
-					.getVariabilityBasedOnElement()) {
-				if (ve == wo.getPred()) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	private boolean isValid(Link link) {
-		if (link.getSource() == null || link.getTarget() == null
-				|| !getNodes().contains(link.getSource())
-				|| !getNodes().contains(link.getTarget())) {
-			return false;
-		}
-		return true;
-	}
-
-	protected void populateLinks() {
-		super.populateLinks();
-
-		// remove the invalid links
-		//
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node node = ((Node) iter.next());
-			WorkBreakdownElement wbe = null;
-			if (node.getObject() instanceof WorkBreakdownElement) {
-				wbe = (WorkBreakdownElement) node.getObject();
-			}
-			ArrayList linksToRemove = new ArrayList();
-			linkListWalk: for (Iterator iterator = node
-					.getIncomingConnections().iterator(); iterator.hasNext();) {
-				Link link = (Link) iterator.next();
-				if (!isValid(link)) {
-					linksToRemove.add(link);
-				}
-
-				if (wbe != null) {
-					// TODO: need revisit to check the valid connection from a
-					// TypedNode
-					//
-					if (link.getSource() instanceof TypedNode)
-						continue linkListWalk;
-
-					Object pred = link.getSource().getObject();
-					boolean workOrderFound = false;
-					find_WorkOrder: for (Iterator iterator1 = wbe
-							.getLinkToPredecessor().iterator(); iterator1
-							.hasNext();) {
-						WorkOrder wo = (WorkOrder) iterator1.next();
-						if (isValidWorkOrder(wo, pred)) {
-							workOrderFound = true;
-							break find_WorkOrder;
-						}
-					}
-					if (!workOrderFound) {
-						// invalid link, remove it
-						//
-						linksToRemove.add(link);
-					}
-				}
-			}
-
-			for (Iterator iterator = linksToRemove.iterator(); iterator
-					.hasNext();) {
-				Link link = (Link) iterator.next();
-				GraphicalDataHelper.removeLink(link);
-			}
-			linksToRemove.clear();
-
-			for (Iterator iterator = node.getOutgoingConnections().iterator(); iterator
-					.hasNext();) {
-				Link link = (Link) iterator.next();
-				if (!isValid(link)) {
-					linksToRemove.add(link);
-				}
-			}
-
-			for (Iterator iterator = linksToRemove.iterator(); iterator
-					.hasNext();) {
-				Link link = (Link) iterator.next();
-				GraphicalDataHelper.removeLink(link);
-			}
-			linksToRemove.clear();
-			linksToRemove = null;
-		}
-
-		// Check the links of each ActivityNode
-		// set the WorkOrder to the link if needed
-		// add new link for those WorkOrders that still don't have the
-		// corresponding link
-		//
-		AdapterFactory adapterFactory = getAdapterFactory();
-		
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node node = ((Node) iter.next());
-			if (node.getObject() instanceof WorkBreakdownElement) {
-				List list = new ArrayList(); 
-				// Get the raw data of workorders for object.
-				WorkBreakdownElement local = (WorkBreakdownElement) node.getObject();
-				list.addAll(local.getLinkToPredecessor());
-				
-				// Get the Predecessor List on top of raw data, this is need for in case of extend.
-				ITreeItemContentProvider adapter = null;
-				adapter = (ITreeItemContentProvider)adapterFactory
-									.adapt(local, ITreeItemContentProvider.class);
-				if(adapter instanceof IBSItemProvider){
-					list.addAll(((IBSItemProvider)adapter).getPredecessors());
-				}
-				
-				// Iterate work orders and create links.
-				for (Iterator iterator = list.iterator(); iterator
-						.hasNext();) {
-					Object next = iterator.next();
-					WorkOrder workOrder = null;
-					BreakdownElement pred = null;
-					if(next instanceof WorkOrder){
-						workOrder = (WorkOrder)next;
-						pred = workOrder.getPred();
-					}
-					if(next instanceof WBSActivityItemProvider){
-						pred = (BreakdownElement)((WBSActivityItemProvider)next).getTarget(); 
-					}
-					
-					if (pred != null && pred instanceof WorkBreakdownElement) {
-						Node predNode = GraphicalDataHelper.findNode(this,
-								pred, true);
-						if (predNode != null) {
-							// check if there is a link for this work order
-							// already
-							//
-							boolean linkFound = false;
-							find_link: for (Iterator iterator1 = node
-									.getIncomingConnections().iterator(); iterator1
-									.hasNext();) {
-								Link link = (Link) iterator1.next();
-								if (link.getSource() == predNode) {
-									// link already exists
-									// check if work order is set to this link
-									//
-									linkFound = true;
-									GraphEdge edge = (GraphEdge) link
-											.getObject();
-									if (edge.getSemanticModel() == null) {
-										GraphicalDataHelper.setSemanticModel(
-												link, workOrder);
-									}
-									break find_link;
-								}
-							}
-							if (!linkFound) {
-								// check if this WorkOrder can be represented
-								// via links of TypedNodes
-								//
-								if (!canReachAsFirstActivityNode(predNode, node)) {
-									// add new link for this work order
-									//
-									NamedNodeImpl nodeImpl = ((NamedNodeImpl) node);
-									NamedNodeImpl predNodeImpl = (NamedNodeImpl) predNode;
-									boolean oldNotify = nodeImpl.notificationEnabled;
-									boolean predNodeNotify = predNodeImpl.notificationEnabled;
-									try {
-										nodeImpl.notificationEnabled = false;
-										predNodeImpl.notificationEnabled = false;
-										nodeImpl.addIncomingConnection(pred); 
-									} finally {
-										nodeImpl.notificationEnabled = oldNotify;
-										predNodeImpl.notificationEnabled = predNodeNotify;
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		cleanDuplicateLinks();
-	}
-
-	private void cleanDuplicateLinks() {
-		List duplicateLinks = new ArrayList();
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Object node = iter.next();
-			if (node instanceof Node) {
-				Node wbNode = (Node) node;
-				if(wbNode.getIncomingConnections() != null){
-					findDuplicateLinks(duplicateLinks, wbNode.getIncomingConnections());
-				}
-				if(wbNode.getOutgoingConnections() !=null){
-					findDuplicateLinks(duplicateLinks, wbNode.getOutgoingConnections());
-				}
-			}
-			
-		}
-		for (Iterator iterator = duplicateLinks.iterator(); iterator.hasNext();) {
-			Link link = (Link) iterator.next();
-			GraphicalDataHelper.removeLink(link);
-		}
-		duplicateLinks.clear();
-		duplicateLinks = null;
-	}
-
-	private void findDuplicateLinks(List duplicateLinks, List links) {
-		for (int i = 0; i < links.size(); i++) {
-			Link link = (Link) links.get(i);
-			if(!duplicateLinks.contains(link)){
-				for (int j = i + 1; j < links.size(); j++) {
-					Link link1 = (Link) links.get(j);
-					if (link1.getSource() == link.getSource()
-							&& link1.getTarget() == link.getTarget()) {
-						duplicateLinks.add(link1);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Checks if Node src can reach Node target as the first ActivityNode in the
-	 * diagram
-	 * 
-	 * @param src
-	 * @param target
-	 * @return
-	 */
-	private static boolean canReachAsFirstActivityNode(Node src, Node target) {
-		for (Iterator iter = src.getOutgoingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			if (link.getTarget() == target) {
-				return true;
-			}
-			if (link.getTarget() instanceof TypedNode
-					&& canReachAsFirstActivityNode(link.getTarget(), target)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	// private List toNodes(List activities) {
-	// List list = new ArrayList();
-	// for (Iterator iter = activities.iterator(); iter.hasNext();) {
-	// list.add(toNode((MethodElement) iter.next()));
-	// }
-	// return list;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#newNode()
-	 */
-	protected Node newNode() {
-		return ModelFactory.eINSTANCE.createWorkBreakdownElementNode();
-	}
-
-	public Collection getChildren() {
-		ITreeItemContentProvider adapter = getAdapter();
-		if (adapter != null) {
-			
-			//Turn off the VariabilityInfo for the activity diagram.
-			Object obj = null;
-			boolean enableVariabilityInfo = false;
-			if(adapter instanceof ActivityWrapperItemProvider){
-				obj = ((ActivityWrapperItemProvider)adapter).getDelegatingItemProvider();
-			}
-			if(adapter instanceof BSActivityItemProvider){
-				obj = adapter;
-			}
-			
-			if(obj instanceof BSActivityItemProvider){
-				enableVariabilityInfo = ((BSActivityItemProvider)obj).isEnableVariabilityInfo();
-				((BSActivityItemProvider)obj).setEnableVariabilityInfo(false);
-			}
-			// end of variability info 
-			
-			
-			// return adapter.getChildren(getObject());
-			// commented above line, For diagrams - rollup should be false, for
-			// handling rollup state below code.
-			List children = new ArrayList();
-			extractChildren(adapter, getObject(), children, true);
-			
-			// reset variabilityinfo status back
-			if(obj instanceof BSActivityItemProvider){
-				((BSActivityItemProvider)obj).setEnableVariabilityInfo(enableVariabilityInfo);
-			}
-			
-			return children;
-		} else {
-			return Collections.EMPTY_LIST;
-		}
-	}
-
-	private void addElementNodes() {
-
-		ArrayList nodes = new ArrayList();
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			Object e = iter.next();
-			Object child = TngUtil.unwrap(e);
-			if (child instanceof WorkBreakdownElement) {
-				NamedNodeImpl node = (NamedNodeImpl) toNode((MethodElement) child);
-				if (e instanceof BreakdownElementWrapperItemProvider) {
-					BreakdownElementWrapperItemProvider wrapper = ((BreakdownElementWrapperItemProvider) e);
-					if (wrapper.isReadOnly()) {
-						node.itemProvider = wrapper;
-						// TODO: check if readOnly attribute is still needed
-						// after introduction of itemProvider
-						//
-						node.readOnly = true;
-					}
-				}
-				nodes.add(node);
-			}
-		}
-
-		getNodes().addAll(nodes);
-	}
-
-	private static int getType(Object obj) {
-		if (obj instanceof GraphNode) {
-			GraphNode node = (GraphNode) obj;
-			SemanticModelBridge modelBridge = node.getSemanticModel();
-			if (modelBridge instanceof SimpleSemanticModelElement) {
-				String type = ((SimpleSemanticModelElement) modelBridge)
-						.getTypeInfo();
-				if (GraphicalDataHelper.GRAPH_NODE_SYNCH_BAR.equals(type)) {
-					return TypedNode.SYNCH_BAR;
-				} else if (GraphicalDataHelper.GRAPH_NODE_DECISION.equals(type)) {
-					return TypedNode.DECISION;
-				} else if (GraphicalDataHelper.GRAPH_NODE_END.equals(type)) {
-					return TypedNode.END;
-				} else if (GraphicalDataHelper.GRAPH_NODE_START.equals(type)) {
-					return TypedNode.START;
-				} else if (GraphicalDataHelper.GRAPH_NODE_FREE_TEXT
-						.equals(type)) {
-					return TypedNode.FREE_TEXT;
-				}
-			}
-		}
-		return -1;
-	}
-
-	protected int getType() {
-		return GraphicalDataHelper.ACTIVITY_DIAGRAM;
-	}
-
-	protected List getBreakdownElementTypes() {
-		return Collections.singletonList(WorkBreakdownElement.class);
-	}
-
-	private int toActivityIndex(int index) {
-		if (index == -1)
-			return index;
-		int size = getNodes().size();
-		int i = index + 1;
-		if (i == size)
-			return -1;
-		Node node = (Node) getNodes().get(i);
-		if (node == null)
-			return -1;
-
-		for (; !(node.getObject() instanceof BreakdownElement) && i < size; i++) {
-			node = (Node) getNodes().get(i);
-		}
-		if (i == size)
-			return -1;
-		Activity act = (Activity) getObject();
-		return act.getBreakdownElements().indexOf(node.getObject());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#addToUmaModel(int,
-	 *      org.eclipse.epf.diagram.model.Node)
-	 */
-	protected void addToUmaModel(int position, Node addedNode) {
-		if (addedNode.getObject() instanceof BreakdownElement) {
-			Activity act = (Activity) getObject();
-
-			// translate ActivityNode index to Activity index
-			//
-			int i = toActivityIndex(position);
-			// System.out.println("DiagramImpl.addToUmaModel():
-			// WorkBreakdownElement index: " + i);
-			if (i == -1) {
-				act.getBreakdownElements().add(addedNode.getObject());
-			} else {
-				act.getBreakdownElements().add(i, addedNode.getObject());
-			}
-		}
-
-		super.addToUmaModel(position, addedNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#addNode(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected Node addNode(Collection nodes, Object obj) {
-		if (obj instanceof Activity) {
-			Activity act = (Activity) obj;
-			VariabilityElement base = act.getVariabilityBasedOnElement();
-			if (base != null) {
-				// find existing node for base and link it to the activity
-				//
-				NodeImpl baseNode = (NodeImpl) GraphicalDataHelper.findNode(
-						this, base);
-				if (baseNode != null) {
-					GraphNode graphNode = baseNode.getGraphNode();
-					UMASemanticModelBridge bridge = (UMASemanticModelBridge) graphNode
-							.getSemanticModel();
-					if (bridge.getElement() != act) {
-						bridge.setElement(act);
-					}
-				} else {
-					baseNode = (NodeImpl) GraphicalDataHelper.findNode(this,
-							act);
-				}
-				if (baseNode != null) {
-					// disassociate with the base
-					//
-					if (baseNode.methodElementAdapter != null) {
-						base.eAdapters().remove(baseNode.methodElementAdapter);
-					}
-
-					baseNode.basicSetObject(act);
-					baseNode.setReadOnly(false);
-
-					return null;
-				}
-			}
-		}
-		return super.addNode(nodes, obj);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.DiagramImpl#removeNode(java.lang.Object)
-	 */
-	protected boolean removeNode(Object obj) {
-		if (obj instanceof Activity) {
-			Activity act = (Activity) obj;
-			VariabilityElement base = act.getVariabilityBasedOnElement();
-			if (base != null) {
-				// find existing node for the old activity and relink it to its
-				// base
-				//
-				NodeImpl node = (NodeImpl) GraphicalDataHelper.findNode(this,
-						act);
-				if (node != null) {
-					GraphNode graphNode = node.getGraphNode();
-					UMASemanticModelBridge bridge = (UMASemanticModelBridge) graphNode
-							.getSemanticModel();
-					if (bridge.getElement() != base) {
-						bridge.setElement(base);
-					}
-				} else {
-					node = (NodeImpl) GraphicalDataHelper.findNode(this, base);
-				}
-				if (node != null) {
-					// disassociate with the old activity
-					//
-					if (node.methodElementAdapter != null) {
-						act.eAdapters().remove(node.methodElementAdapter);
-					}
-
-					node.basicSetObject(base);
-					node.setReadOnly(true);
-
-					return false;
-				}
-			}
-		}
-		return super.removeNode(obj);
-	}
-	/**
-	 * Moved code from getChildren. getAdapter() will return Adapter,
-	 * which will allow us to find itemprovider for the children. 
-	 * 
-	 * @return
-	 */
-	private ITreeItemContentProvider getAdapter(){
-		ITreeItemContentProvider adapter = null;
-		if (wrapper != null) {
-			adapter = wrapper;
-		} else {
-			
-			adapter =(ITreeItemContentProvider)getAdapterFactory().adapt(
-					getObject(), ITreeItemContentProvider.class);
-		}
-		return adapter;
-	}
-	
-	private AdapterFactory getAdapterFactory(){
-		AdapterFactory adapterFactory = null;
-		if (filter == null) {
-			adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-		} else if (filter instanceof IAdapterFactoryFilter) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) ((IAdapterFactoryFilter) filter)
-					.getWBSAdapterFactory();
-		}
-		return adapterFactory;
-	}
-} // ActivityDiagramImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/DiagramImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/DiagramImpl.java
deleted file mode 100644
index 71bae71..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/DiagramImpl.java
+++ /dev/null
@@ -1,689 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.DiagramResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.diagram.model.util.IDiagramChangeListener;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Diagram</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class DiagramImpl extends NodeContainerImpl implements Diagram {
-
-	private boolean newDiagram;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DiagramImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.DIAGRAM;
-	}
-
-	// -------------------//
-	// Start custom code //
-	// -------------------//
-
-	protected class ActivityAdapter extends TransactionalNodeLink implements
-			IDiagramChangeListener {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.diagram.model.util.IDiagramChangeListener#getDiagram()
-		 */
-		public Diagram getDiagram() {
-			return DiagramImpl.this;
-		}
-
-		@Override
-		protected void handleNotification(Notification msg) {
-			switch (msg.getFeatureID(Activity.class)) {
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					Node node = (Node) addNode(msg.getNewValue());
-					if (node != null) {
-					if (msg.getNotifier() == baseAct) {
-						node.setReadOnly(true);
-						}
-					}
-					break;
-				case Notification.REMOVE:
-					removeNode(msg.getOldValue());
-					break;
-				case Notification.ADD_MANY:
-					Collection nodes = addNodes((Collection) msg
-							.getNewValue());
-					if (msg.getNotifier() == baseAct) {
-						for (Iterator iter = nodes.iterator(); iter
-								.hasNext();) {
-							node = (NodeImpl) iter.next();
-							node.setReadOnly(true);
-						}
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					removeNodes((Collection) msg.getOldValue());
-					break;
-				case Notification.MOVE:
-					moveNode(msg.getNewValue(), msg.getPosition(), msg.getOldValue());
-					break;
-				}
-				break;
-			}
-		}
-
-	}
-
-	protected IDiagramChangeListener diagramChangeListener;
-
-	private Activity baseAct;
-
-	private Object diagramAdapter = new AdapterImpl() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			if (!notificationEnabled)
-				return;
-			notificationEnabled = false;
-			try {
-				//Activity act = (Activity) getObject();
-				switch (msg.getFeatureID(Diagram.class)) {
-				case ModelPackage.DIAGRAM__NODES:
-					// System.out.println(".notifyChanged(): index=" +
-					// msg.getPosition());
-					Collection collection;
-					switch (msg.getEventType()) {
-					case Notification.ADD:
-						nodeAdded(msg.getPosition(), (Node) msg
-								.getNewValue());
-						return;
-					case Notification.REMOVE:
-						nodeRemoved((Node) msg.getOldValue());
-						return;
-					case Notification.ADD_MANY:
-						collection = (Collection) msg.getNewValue();
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							Node node = (Node) iter.next();
-							nodeAdded(msg.getPosition(), node);
-						}
-
-						return;
-					case Notification.REMOVE_MANY:
-						collection = (Collection) msg.getOldValue();
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							nodeRemoved((Node) iter.next());
-						}
-						return;
-					}
-
-				}
-			} finally {
-				notificationEnabled = true;
-			}
-		}
-	};
-
-	protected Node addNode(Object obj) {
-		Node node = addNode(getNodes(), obj);
-		if (node == null)
-			return node;
-		populateLinks(node, true);
-		return node;
-	}
-
-	protected Node addNode(Collection nodes, Object obj) {
-		if (TngUtil.isInstanceOf(getBreakdownElementTypes(), obj)) {
-			Node node = toNode((MethodElement) obj);
-			if (node != null) {
-				nodes.add(node);
-				return node;
-			}
-		}
-		return null;
-	}
-
-	protected Collection addNodes(Collection collection) {
-		List nodes = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			addNode(nodes, iter.next());
-		}
-
-		// use addAll() to avoid unnecessary notifications
-		//
-		getNodes().addAll(nodes);
-		return nodes;
-	}
-
-	/**
-	 * @param obj
-	 */
-	protected boolean removeNode(Object obj) {
-		if (!TngUtil.isInstanceOf(getBreakdownElementTypes(), obj))
-			return false;
-
-		Node node = GraphicalDataHelper.findNode(this, obj);
-		if (node == null)
-			return false;
-
-		for (Iterator iter = node.getOutgoingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			link.setTarget(null);
-		}
-
-		for (Iterator iter = node.getIncomingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			link.setSource(null);
-		}
-		node.getOutgoingConnections().clear();
-		node.getIncomingConnections().clear();
-
-		getNodes().remove(node);
-		return true;
-	}
-
-	protected void removeNodes(Collection collection) {
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			removeNode(iter.next());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Diagram#getUMADiagram()
-	 */
-	public org.eclipse.epf.uma.Diagram getUMADiagram() {
-		return (org.eclipse.epf.uma.Diagram) getGraphNode();
-	}
-
-	protected Class getDiagramChangeListenerType() {
-		return IDiagramChangeListener.class;
-	}
-
-	protected List getBreakdownElementTypes() {
-		return Collections.singletonList(BreakdownElement.class);
-	}
-
-	protected int getType() {
-		return -1;
-	}
-
-	protected void nodeAdded(int index, Node node) {
-		addToUmaModel(index, node);
-		node.addConsumer(this);
-	}
-
-	protected void nodeRemoved(Node node) {
-		removeFromUmaModel(node);
-		node.removeConsumer(this);
-	}
-
-	public boolean isNew() {
-		return this.newDiagram;
-	}
-
-	public void setNew(boolean n) {
-		this.newDiagram = n;
-	}
-
-	/**
-	 * NOTE: this method is re-entrant, make sure to handle the data correctly to avoid memory leak and data corruption
-	 * 
-	 * @param newObject
-	 *            must be an Activity
-	 */
-	public void setObject(Object newObject) {
-		if (newObject instanceof BreakdownElementWrapperItemProvider
-				&& ((BreakdownElementWrapperItemProvider) newObject)
-						.isReadOnly()) {
-			wrapper = (BreakdownElementWrapperItemProvider) newObject;
-			setReadOnly(true);
-		}
-		newObject = TngUtil.unwrap(newObject);
-
-		object = newObject;
-
-		// add diagram change listener to the linked object. Remove the old
-		// listener if there is any.
-		// But first keep the old listener to help find the UMA diagram of the
-		// activity quickly.
-		//
-		Activity e = (Activity) newObject;		
-		if(ProcessUtil.isExtendingOrLocallyContributing(e)) {
-			baseAct = (Activity) e.getVariabilityBasedOnElement();
-		}
-		baseAct = null;
-		
-		if(newObject == null) {
-			return;
-		}
-
-		// set the UMA diagram for this diagram
-		//
-		if(isGraphicalDataRequired()) {
-			graphNode = GraphicalDataManager.getInstance().getUMADiagram(e,
-					getType(), false);
-			// set the flag to indicate this is a new diagram or not
-			if (graphNode == null) {
-				graphNode = GraphicalDataManager.getInstance().getUMADiagram(e,
-						getType(), true);
-				setNew(true);
-			}
-		}
-
-		if(!e.eAdapters().contains(diagramChangeListener)) {
-			e.eAdapters().add(diagramChangeListener);
-		}
-		if (baseAct != null && !baseAct.eAdapters().contains(diagramChangeListener)) {
-			baseAct.eAdapters().add(diagramChangeListener);
-		}
-
-		populateDiagram();
-
-		if(!eAdapters().contains(diagramAdapter)) {
-			this.eAdapters().add((Adapter) diagramAdapter);
-		}
-
-	}
-
-	/**
-	 * Populates the diagram with the data from the UMA model. Subclass should
-	 * override this method.
-	 */
-	protected void populateDiagram() {
-		populateNodes();
-		populateLinks();
-
-		// add this diagram to the consumer list of all nodes so they will not
-		// be disposed
-		// before this diagram.
-		//
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			NodeImpl node = (NodeImpl) iter.next();
-			node.addConsumer(this);
-		}
-	}
-
-	/**
-	 * Populates the incoming/outgoing links of the given node
-	 * 
-	 * @param node
-	 */
-	protected void populateLinks(Node node, boolean disableNotification) {
-		int size = 0;
-		boolean[] notifies = null;
-		try {
-			if (disableNotification) {
-				size = getNodes().size();
-				notifies = new boolean[size];
-				// disable notification for all nodes in this diagram to avoid
-				// unwanted concurrent modification of their connection list
-				//
-				for (int i = 0; i < size; i++) {
-					Node child = ((Node) getNodes().get(i));
-					notifies[i] = child.eDeliver();
-					child.eSetDeliver(false);
-				}
-			}
-
-			GraphNode graphNode = node.getGraphNode();
-			if (graphNode != null) {
-				GraphicalDataHelper.fillConnections(node, graphNode);
-			}
-		} finally {
-			if (disableNotification) {
-				// restore notification flag
-				//
-				for (int i = 0; i < size; i++) {
-					((EObject) getNodes().get(i)).eSetDeliver(notifies[i]);
-				}
-			}
-		}
-	}
-
-	protected void populateNodes() {		
-		org.eclipse.epf.uma.Diagram diagram = getUMADiagram();
-		if(diagram != null) {
-			List typedNodes = new ArrayList();
-			for (Iterator iter = diagram.getContained().iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				int type = getType(element);
-				if (type > 0) {
-					TypedNode node = ModelFactory.eINSTANCE.createTypedNode();
-					node.setType(type);
-					node.setObject(element);
-					typedNodes.add(node);
-				}
-			}
-			getNodes().addAll(typedNodes);
-		}
-	}
-
-	private static int getType(Object obj) {
-		if (obj instanceof GraphNode) {
-			GraphNode node = (GraphNode) obj;
-			SemanticModelBridge modelBridge = node.getSemanticModel();
-			if (modelBridge instanceof SimpleSemanticModelElement) {
-				String type = ((SimpleSemanticModelElement) modelBridge)
-						.getTypeInfo();
-				if (GraphicalDataHelper.GRAPH_NODE_SYNCH_BAR.equals(type)) {
-					return TypedNode.SYNCH_BAR;
-				} else if (GraphicalDataHelper.GRAPH_NODE_DECISION.equals(type)) {
-					return TypedNode.DECISION;
-				} else if (GraphicalDataHelper.GRAPH_NODE_END.equals(type)) {
-					return TypedNode.END;
-				} else if (GraphicalDataHelper.GRAPH_NODE_START.equals(type)) {
-					return TypedNode.START;
-				} else if (GraphicalDataHelper.GRAPH_NODE_FREE_TEXT
-						.equals(type)) {
-					return TypedNode.FREE_TEXT;
-				}
-			}
-		}
-		return -1;
-	}
-
-	protected void populateLinks() {
-		// fill outgoing/incoming connection lists of all nodes
-		//
-		int size = getNodes().size();
-		boolean[] notifies = new boolean[size];
-		try {
-			// disable notification for all nodes in this diagram to avoid
-			// unwanted concurrent modification of their connection list
-			//
-			for (int i = 0; i < size; i++) {
-				Node node = ((Node) getNodes().get(i));
-				notifies[i] = node.eDeliver();
-				node.eSetDeliver(false);
-			}
-			for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-				Node node = (Node) iter.next();
-				populateLinks(node, false);
-			}
-		} finally {
-			// restore notification flag
-			//
-			for (int i = 0; i < size; i++) {
-				((EObject) getNodes().get(i)).eSetDeliver(notifies[i]);
-			}
-		}
-
-	}
-
-	/**
-	 * Removes the data for the removed node from the UMA model Subclass should
-	 * override this method.
-	 * 
-	 * @param removedNode
-	 */
-	protected void removeFromUmaModel(Node removedNode) {
-		Activity act = (Activity) getObject();
-		if (removedNode.getObject() instanceof BreakdownElement) {
-			act.getBreakdownElements().remove(removedNode.getObject());
-		}
-		
-		if(getUMADiagram() != null) {
-			getUMADiagram().getContained().remove(removedNode.getGraphNode());
-		}
-	}
-
-	/**
-	 * Adds the data for the newly added node to the UMA model Subclass should
-	 * override this method.
-	 * 
-	 * @param position
-	 * @param newValue
-	 */
-	protected void addToUmaModel(int position, Node addedNode) {
-
-		if (addedNode.getGraphNode() == null) {
-			// this node is readded after undo
-			//
-			((NodeImpl) addedNode).basicSetObject(addedNode.getObject());
-		}
-		
-		if(getUMADiagram() != null) {
-			getUMADiagram().getContained().add(addedNode.getGraphNode());
-		}
-	}
-
-	/**
-	 * Creates new node for this diagram for the given MethodElement.
-	 * 
-	 * @param e
-	 * @return
-	 */
-	protected Node toNode(MethodElement e) {
-		Node node = newNode();
-		if (node == null)
-			return null;
-		node.setUMADiagram(getUMADiagram());
-		node.setDiagram(this);
-		node.setObject(e);
-		return node;
-	}
-
-	protected Node newNode() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Node#getMethodElementAdapterType()
-	 */
-	public Class getMethodElementAdapterType() {
-		return getDiagramChangeListenerType();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#dispose()
-	 */
-	protected void dispose() {
-		if (diagramChangeListener != null) {
-			Activity e = (Activity) getObject();
-			if (baseAct != null) {
-				baseAct.eAdapters().remove(diagramChangeListener);
-			}
-			if(e != null) {
-				e.eAdapters().remove(diagramChangeListener);
-			}
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Diagram#setDefaultName(org.eclipse.epf.diagram.model.NamedNode)
-	 */
-	public void setDefaultName(NamedNode newNode) {
-		MethodElement obj = (MethodElement) newNode.getObject();
-		int classID = obj.eClass().getClassifierID();
-		Activity act = (Activity) getObject();
-		ArrayList siblings = new ArrayList();
-		for (Iterator iter = act.getBreakdownElements().iterator(); iter
-				.hasNext();) {
-			BreakdownElement e = (BreakdownElement) iter.next();
-			if (e.eClass().getClassifierID() == classID) {
-				siblings.add(e);
-			}
-		}
-		String baseName = MessageFormat
-				.format(
-						DiagramResources.defaultBaseName, new Object[] { TngUtil.getTypeText(obj.eClass().getName()) }); 
-		TngUtil.setDefaultName(siblings, obj, baseName);
-		newNode.setName(obj.getName());
-	}
-	
-	protected void extractChildren(ITreeItemContentProvider adapter, Object object, Collection children,
-			boolean filterSuppressed) {
-		// disable rollup before getting the children
-		//
-		boolean oldRolledUp = false;
-		if(adapter instanceof BSActivityItemProvider) {
-			BSActivityItemProvider itemProvider = (BSActivityItemProvider)adapter;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.basicSetRolledUp(false);
-		}
-		else if(adapter instanceof IBSItemProvider){
-			IBSItemProvider itemProvider = (IBSItemProvider)adapter;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.setRolledUp(false);
-		}
-		
-		try {
-			// filter out the suppressed elements
-			//
-			if (adapter != null) {
-				if(filterSuppressed){
-					for (Iterator iter = adapter.getChildren(object).iterator(); iter.hasNext();) {
-						Object child = iter.next();
-						if(!getSuppression().isSuppressed(child)) {
-							children.add(child);
-						}
-					}
-				}else{
-					// don't filter suppressed elements
-					//
-					children.addAll(adapter.getChildren(object));
-				}
-			}
-		}
-		finally {
-			// restore the rolled-up flag
-			//
-			if(adapter instanceof IBSItemProvider) {
-				((IBSItemProvider)adapter).setRolledUp(oldRolledUp);
-			}
-		}
-	}
-
-	public Suppression getSuppression() {
-		return suppression;
-	}
-
-	public void setSuppression(Suppression suppression) {
-		this.suppression = suppression;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Diagram#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/**
-	 * In Process WBS, if breakdownelement is moved
-	 * up or down, diagram should be updated accordingly. 
-	 * Sub-class should override this method if diagram needs update on move. 
-	 * @param newValue
-	 * @param newposition int
-	 * @param oldPosition Object(Integer)
-	 */
-	public void moveNode(Object movedObject, int position, Object oldPosition) {
-	}
-		
-	public boolean isGraphicalDataRequired() {
-		return graphicalDataRequired;
-	}
-
-	public void setGraphicalDataRequired(boolean graphicalDataRequired) {
-		this.graphicalDataRequired = graphicalDataRequired;
-	}
-		
-	public IFilter getFilter() {
-		return filter;
-	}
-	
-	public void setWrapper(BreakdownElementWrapperItemProvider wrapper) {
-		this.wrapper = wrapper;
-	}
-	
-	public Collection getChildren() {
-		return Collections.EMPTY_LIST;
-	}
-	
-	private Suppression suppression;
-
-	protected BreakdownElementWrapperItemProvider wrapper;
-
-	protected IFilter filter;
-	
-	private boolean graphicalDataRequired = true;
-
-} // DiagramImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/LinkImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/LinkImpl.java
deleted file mode 100644
index 30f91f7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/LinkImpl.java
+++ /dev/null
@@ -1,642 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Link</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.LinkImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.LinkImpl#getSource <em>Source</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.LinkImpl#getTarget <em>Target</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.LinkImpl#getBendpoints <em>Bendpoints</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.LinkImpl#getSourceEndPoint <em>Source End Point</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.LinkImpl#getTargetEndPoint <em>Target End Point</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LinkImpl extends LinkedObjectImpl implements Link {
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTarget() <em>Target</em>}' reference.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getTarget()
-	 * @generated
-	 * @ordered
-	 */
-	protected Node target;
-
-	/**
-	 * The cached value of the '{@link #getBendpoints() <em>Bendpoints</em>}' attribute list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getBendpoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<AbsoluteBendpoint> bendpoints;
-
-	/**
-	 * The default value of the '{@link #getSourceEndPoint() <em>Source End Point</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getSourceEndPoint()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Point SOURCE_END_POINT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSourceEndPoint() <em>Source End Point</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getSourceEndPoint()
-	 * @generated
-	 * @ordered
-	 */
-	protected Point sourceEndPoint = SOURCE_END_POINT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTargetEndPoint() <em>Target End Point</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getTargetEndPoint()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Point TARGET_END_POINT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTargetEndPoint() <em>Target End Point</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getTargetEndPoint()
-	 * @generated
-	 * @ordered
-	 */
-	protected Point targetEndPoint = TARGET_END_POINT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LinkImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.LINK;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LINK__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Node getSource() {
-		if (eContainerFeatureID != ModelPackage.LINK__SOURCE) return null;
-		return (Node)eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSource(Node newSource, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject)newSource, ModelPackage.LINK__SOURCE, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSource(Node newSource) {
-		if (newSource != eInternalContainer() || (eContainerFeatureID != ModelPackage.LINK__SOURCE && newSource != null)) {
-			if (EcoreUtil.isAncestor(this, newSource))
-				throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newSource != null)
-				msgs = ((InternalEObject)newSource).eInverseAdd(this, ModelPackage.NODE__OUTGOING_CONNECTIONS, Node.class, msgs);
-			msgs = basicSetSource(newSource, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LINK__SOURCE, newSource, newSource));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Node getTarget() {
-		if (target != null && target.eIsProxy()) {
-			InternalEObject oldTarget = (InternalEObject)target;
-			target = (Node)eResolveProxy(oldTarget);
-			if (target != oldTarget) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.LINK__TARGET, oldTarget, target));
-			}
-		}
-		return target;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Node basicGetTarget() {
-		return target;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTarget(Node newTarget, NotificationChain msgs) {
-		Node oldTarget = target;
-		target = newTarget;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ModelPackage.LINK__TARGET, oldTarget, newTarget);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTarget(Node newTarget) {
-		if (newTarget != target) {
-			NotificationChain msgs = null;
-			if (target != null)
-				msgs = ((InternalEObject)target).eInverseRemove(this, ModelPackage.NODE__INCOMING_CONNECTIONS, Node.class, msgs);
-			if (newTarget != null)
-				msgs = ((InternalEObject)newTarget).eInverseAdd(this, ModelPackage.NODE__INCOMING_CONNECTIONS, Node.class, msgs);
-			msgs = basicSetTarget(newTarget, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LINK__TARGET, newTarget, newTarget));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<AbsoluteBendpoint> getBendpoints() {
-		if (bendpoints == null) {
-			bendpoints = new EDataTypeUniqueEList<AbsoluteBendpoint>(AbsoluteBendpoint.class, this, ModelPackage.LINK__BENDPOINTS);
-		}
-		return bendpoints;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point getSourceEndPoint() {
-		return sourceEndPoint;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourceEndPoint(Point newSourceEndPoint) {
-		Point oldSourceEndPoint = sourceEndPoint;
-		sourceEndPoint = newSourceEndPoint;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LINK__SOURCE_END_POINT, oldSourceEndPoint, sourceEndPoint));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point getTargetEndPoint() {
-		return targetEndPoint;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTargetEndPoint(Point newTargetEndPoint) {
-		Point oldTargetEndPoint = targetEndPoint;
-		targetEndPoint = newTargetEndPoint;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LINK__TARGET_END_POINT, oldTargetEndPoint, targetEndPoint));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ModelPackage.LINK__SOURCE:
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return basicSetSource((Node)otherEnd, msgs);
-			case ModelPackage.LINK__TARGET:
-				if (target != null)
-					msgs = ((InternalEObject)target).eInverseRemove(this, ModelPackage.NODE__INCOMING_CONNECTIONS, Node.class, msgs);
-				return basicSetTarget((Node)otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ModelPackage.LINK__SOURCE:
-				return basicSetSource(null, msgs);
-			case ModelPackage.LINK__TARGET:
-				return basicSetTarget(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-			case ModelPackage.LINK__SOURCE:
-				return eInternalContainer().eInverseRemove(this, ModelPackage.NODE__OUTGOING_CONNECTIONS, Node.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.LINK__NAME:
-				return getName();
-			case ModelPackage.LINK__SOURCE:
-				return getSource();
-			case ModelPackage.LINK__TARGET:
-				if (resolve) return getTarget();
-				return basicGetTarget();
-			case ModelPackage.LINK__BENDPOINTS:
-				return getBendpoints();
-			case ModelPackage.LINK__SOURCE_END_POINT:
-				return getSourceEndPoint();
-			case ModelPackage.LINK__TARGET_END_POINT:
-				return getTargetEndPoint();
-		}
-		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 ModelPackage.LINK__NAME:
-				setName((String)newValue);
-				return;
-			case ModelPackage.LINK__SOURCE:
-				setSource((Node)newValue);
-				return;
-			case ModelPackage.LINK__TARGET:
-				setTarget((Node)newValue);
-				return;
-			case ModelPackage.LINK__BENDPOINTS:
-				getBendpoints().clear();
-				getBendpoints().addAll((Collection<? extends AbsoluteBendpoint>)newValue);
-				return;
-			case ModelPackage.LINK__SOURCE_END_POINT:
-				setSourceEndPoint((Point)newValue);
-				return;
-			case ModelPackage.LINK__TARGET_END_POINT:
-				setTargetEndPoint((Point)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.LINK__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case ModelPackage.LINK__SOURCE:
-				setSource((Node)null);
-				return;
-			case ModelPackage.LINK__TARGET:
-				setTarget((Node)null);
-				return;
-			case ModelPackage.LINK__BENDPOINTS:
-				getBendpoints().clear();
-				return;
-			case ModelPackage.LINK__SOURCE_END_POINT:
-				setSourceEndPoint(SOURCE_END_POINT_EDEFAULT);
-				return;
-			case ModelPackage.LINK__TARGET_END_POINT:
-				setTargetEndPoint(TARGET_END_POINT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.LINK__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case ModelPackage.LINK__SOURCE:
-				return getSource() != null;
-			case ModelPackage.LINK__TARGET:
-				return target != null;
-			case ModelPackage.LINK__BENDPOINTS:
-				return bendpoints != null && !bendpoints.isEmpty();
-			case ModelPackage.LINK__SOURCE_END_POINT:
-				return SOURCE_END_POINT_EDEFAULT == null ? sourceEndPoint != null : !SOURCE_END_POINT_EDEFAULT.equals(sourceEndPoint);
-			case ModelPackage.LINK__TARGET_END_POINT:
-				return TARGET_END_POINT_EDEFAULT == null ? targetEndPoint != null : !TARGET_END_POINT_EDEFAULT.equals(targetEndPoint);
-		}
-		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(" (name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(", bendpoints: "); //$NON-NLS-1$
-		result.append(bendpoints);
-		result.append(", sourceEndPoint: "); //$NON-NLS-1$
-		result.append(sourceEndPoint);
-		result.append(", targetEndPoint: "); //$NON-NLS-1$
-		result.append(targetEndPoint);
-		result.append(')');
-		return result.toString();
-	}
-
-	public void setObject(Object newObject) {
-		super.setObject(newObject);
-
-		if (newObject == null)
-			return;
-
-		GraphEdge edge = (GraphEdge) newObject;
-
-		// copy bendpoints from edge
-		//
-		for (Iterator iter = edge.getWaypoints().iterator(); iter.hasNext();) {
-			getBendpoints().add(
-					new AbsoluteBendpoint(GraphicalDataHelper
-							.toPoint((org.eclipse.epf.uma.Point) iter.next())));
-		}
-
-		// copy end points from GraphConnectors
-		//
-		if (getSourceGraphConnector().getPosition() != null) {
-			sourceEndPoint = GraphicalDataHelper
-					.toPoint(getSourceGraphConnector().getPosition());
-		}
-		if (getTargetGraphConnector().getPosition() != null) {
-			targetEndPoint = GraphicalDataHelper
-					.toPoint(getTargetGraphConnector().getPosition());
-		}
-				
-		eAdapters().add(new AdapterImpl() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-			 */
-			public void notifyChanged(Notification msg) {
-				Point p;
-				GraphEdge edge = (GraphEdge) getObject();
-				switch (msg.getFeatureID(Link.class)) {
-				case ModelPackage.LINK__BENDPOINTS:
-					switch (msg.getEventType()) {
-					case Notification.ADD:
-						p = (AbsoluteBendpoint) msg.getNewValue();
-						int index = msg.getPosition();
-						org.eclipse.epf.uma.Point umaPoint = GraphicalDataHelper
-								.newModelPoint(p.x, p.y);
-						if (index == Notification.NO_INDEX) {
-							edge.getWaypoints().add(umaPoint);
-						} else {
-							edge.getWaypoints().add(index, umaPoint);
-						}
-						return;
-					case Notification.REMOVE:
-						// p = (AbsoluteBendpoint) msg.getOldValue();
-						// edge.getWaypoints().remove(GraphicalDataHelper.newModelPoint(p.x,
-						// p.y));
-
-						index = msg.getPosition();
-						if (index == Notification.NO_INDEX) {
-							edge.getWaypoints().remove(msg.getPosition());
-						} else {
-							edge.getWaypoints().remove(index);
-						}
-
-						return;
-					case Notification.ADD_MANY:
-						Collection collection = (Collection) msg.getNewValue();
-						ArrayList umaPoints = new ArrayList();
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							p = (AbsoluteBendpoint) iter.next();
-							umaPoints.add(GraphicalDataHelper.newModelPoint(
-									p.x, p.y));
-						}
-						index = msg.getPosition();
-						if (index == Notification.NO_INDEX) {
-							edge.getWaypoints().addAll(umaPoints);
-						} else {
-							edge.getWaypoints().addAll(index, umaPoints);
-						}
-						return;
-					// case Notification.REMOVE_MANY:
-					// collection = (Collection) msg.getOldValue();
-					// for (Iterator iter = collection.iterator(); iter
-					// .hasNext();) {
-					// p = (AbsoluteBendpoint) msg.getOldValue();
-					// edge.getWaypoints().remove(GraphicalDataHelper.newModelPoint(p.x,
-					// p.y));
-					// }
-					// return;
-					case Notification.SET:
-						p = (AbsoluteBendpoint) msg.getNewValue();
-//						Point oldp = (AbsoluteBendpoint) msg.getOldValue();
-						int pointIndex = msg.getPosition();
-						org.eclipse.epf.uma.Point newUmaPoint = GraphicalDataHelper
-								.newModelPoint(p.x, p.y);
-//						org.eclipse.epf.uma.Point oldUmaPoint = GraphicalDataHelper
-//								.newModelPoint(oldp.x, oldp.y);
-						if (pointIndex == Notification.NO_INDEX) {
-							System.out
-									.println("Index for bendpoint is -1, Cannot set the bend point location."); //$NON-NLS-1$
-						} else {
-							edge.getWaypoints().remove(pointIndex);
-							edge.getWaypoints().add(pointIndex, newUmaPoint);
-						}
-						return;
-					}
-					return;
-				case ModelPackage.LINK__SOURCE_END_POINT:
-					p = (Point) msg.getNewValue();
-					// System.out.println(".notifyChanged(): new source end
-					// point: " + p + ". " + getSource());
-					if (p != null) {
-						// translate to relative position
-						//
-						// p.translate(getSource().getLocation().getNegated());
-						getSourceGraphConnector().setPosition(
-								GraphicalDataHelper.newModelPoint(p.x, p.y));
-					}
-					return;
-				case ModelPackage.LINK__TARGET_END_POINT:
-					p = (Point) msg.getNewValue();
-					// System.out.println(".notifyChanged(): new target end
-					// point: " + p + ". " + getTarget());
-					if (p != null) {
-						// translate to relative position
-						//
-						// p.translate(LinkImpl.this.getTarget().getLocation().getNegated());
-						getTargetGraphConnector().setPosition(
-								GraphicalDataHelper.newModelPoint(p.x, p.y));
-					}
-					return;
-				case ModelPackage.LINK__SOURCE:
-					// TODO
-					return;
-				case ModelPackage.LINK__TARGET:
-					// TODO
-					return;
-				}
-			}
-		});
-	}
-
-	private GraphConnector getSourceGraphConnector() {
-		return (GraphConnector) ((GraphEdge) getObject()).getAnchor().get(0);
-	}
-
-	private GraphConnector getTargetGraphConnector() {
-		return (GraphConnector) ((GraphEdge) getObject()).getAnchor().get(1);
-	}
-
-} // LinkImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/LinkedObjectImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/LinkedObjectImpl.java
deleted file mode 100644
index 3ae92cf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/LinkedObjectImpl.java
+++ /dev/null
@@ -1,174 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Linked Object</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.LinkedObjectImpl#getLinkedElement <em>Linked Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class LinkedObjectImpl extends EObjectImpl implements
-		LinkedObject {
-	/**
-	 * The cached value of the '{@link #getLinkedElement() <em>Linked Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkedElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected MethodElement linkedElement;
-	protected Object object;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LinkedObjectImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.LINKED_OBJECT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElement getLinkedElement() {
-		if (linkedElement != null && ((EObject)linkedElement).eIsProxy()) {
-			InternalEObject oldLinkedElement = (InternalEObject)linkedElement;
-			linkedElement = (MethodElement)eResolveProxy(oldLinkedElement);
-			if (linkedElement != oldLinkedElement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.LINKED_OBJECT__LINKED_ELEMENT, oldLinkedElement, linkedElement));
-			}
-		}
-		return linkedElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElement basicGetLinkedElement() {
-		return linkedElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLinkedElement(MethodElement newLinkedElement) {
-		MethodElement oldLinkedElement = linkedElement;
-		linkedElement = newLinkedElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LINKED_OBJECT__LINKED_ELEMENT, oldLinkedElement, linkedElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.LINKED_OBJECT__LINKED_ELEMENT:
-				if (resolve) return getLinkedElement();
-				return basicGetLinkedElement();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.LINKED_OBJECT__LINKED_ELEMENT:
-				setLinkedElement((MethodElement)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.LINKED_OBJECT__LINKED_ELEMENT:
-				setLinkedElement((MethodElement)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.LINKED_OBJECT__LINKED_ELEMENT:
-				return linkedElement != null;
-		}
-		return super.eIsSet(featureID);
-	}
-	
-	public Object getObject() {
-		return object;
-	}
-	
-	public void setObject(Object newObject) {
-		this.object = newObject;
-	}
-
-} // LinkedObjectImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ModelFactoryImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ModelFactoryImpl.java
deleted file mode 100644
index cac44aa..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ModelFactoryImpl.java
+++ /dev/null
@@ -1,335 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-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.epf.diagram.model.*;
-
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.uma.RoleDescriptor;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--
- * end-user-doc -->
- * @generated
- */
-public class ModelFactoryImpl extends EFactoryImpl implements ModelFactory {
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ModelFactory init() {
-		try {
-			ModelFactory theModelFactory = (ModelFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore"); //$NON-NLS-1$ 
-			if (theModelFactory != null) {
-				return theModelFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new ModelFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public ModelFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case ModelPackage.DIAGRAM: return createDiagram();
-			case ModelPackage.LINK: return createLink();
-			case ModelPackage.NAMED_NODE: return createNamedNode();
-			case ModelPackage.ACTIVITY_DIAGRAM: return createActivityDiagram();
-			case ModelPackage.TYPED_NODE: return createTypedNode();
-			case ModelPackage.WORK_PRODUCT_DEPENDENCY_DIAGRAM: return createWorkProductDependencyDiagram();
-			case ModelPackage.WORK_PRODUCT_NODE: return createWorkProductNode();
-			case ModelPackage.ACTIVITY_DETAIL_DIAGRAM: return createActivityDetailDiagram();
-			case ModelPackage.ROLE_NODE: return createRoleNode();
-			case ModelPackage.ROLE_TASK_COMPOSITE: return createRoleTaskComposite();
-			case ModelPackage.TASK_NODE: return createTaskNode();
-			case ModelPackage.WORK_PRODUCT_DESCRIPTOR_NODE: return createWorkProductDescriptorNode();
-			case ModelPackage.WORK_BREAKDOWN_ELEMENT_NODE: return createWorkBreakdownElementNode();
-			case ModelPackage.WORK_PRODUCT_COMPOSITE: return createWorkProductComposite();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case ModelPackage.ABSOLUTE_BENDPOINT:
-				return createAbsoluteBendpointFromString(eDataType, initialValue);
-			case ModelPackage.POINT:
-				return createPointFromString(eDataType, initialValue);
-			case ModelPackage.ROLE_DESCRIPTOR:
-				return createRoleDescriptorFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case ModelPackage.ABSOLUTE_BENDPOINT:
-				return convertAbsoluteBendpointToString(eDataType, instanceValue);
-			case ModelPackage.POINT:
-				return convertPointToString(eDataType, instanceValue);
-			case ModelPackage.ROLE_DESCRIPTOR:
-				return convertRoleDescriptorToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Diagram createDiagram() {
-		DiagramImpl diagram = new DiagramImpl();
-		return diagram;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Link createLink() {
-		LinkImpl link = new LinkImpl();
-		return link;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NamedNode createNamedNode() {
-		NamedNodeImpl namedNode = new NamedNodeImpl();
-		return namedNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityDiagram createActivityDiagram() {
-		ActivityDiagramImpl activityDiagram = new ActivityDiagramImpl();
-		return activityDiagram;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TypedNode createTypedNode() {
-		TypedNodeImpl typedNode = new TypedNodeImpl();
-		return typedNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDependencyDiagram createWorkProductDependencyDiagram() {
-		WorkProductDependencyDiagramImpl workProductDependencyDiagram = new WorkProductDependencyDiagramImpl();
-		return workProductDependencyDiagram;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductNode createWorkProductNode() {
-		WorkProductNodeImpl workProductNode = new WorkProductNodeImpl();
-		return workProductNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityDetailDiagram createActivityDetailDiagram() {
-		ActivityDetailDiagramImpl activityDetailDiagram = new ActivityDetailDiagramImpl();
-		return activityDetailDiagram;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleNode createRoleNode() {
-		RoleNodeImpl roleNode = new RoleNodeImpl();
-		return roleNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleTaskComposite createRoleTaskComposite() {
-		RoleTaskCompositeImpl roleTaskComposite = new RoleTaskCompositeImpl();
-		return roleTaskComposite;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskNode createTaskNode() {
-		TaskNodeImpl taskNode = new TaskNodeImpl();
-		return taskNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescriptorNode createWorkProductDescriptorNode() {
-		WorkProductDescriptorNodeImpl workProductDescriptorNode = new WorkProductDescriptorNodeImpl();
-		return workProductDescriptorNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkBreakdownElementNode createWorkBreakdownElementNode() {
-		WorkBreakdownElementNodeImpl workBreakdownElementNode = new WorkBreakdownElementNodeImpl();
-		return workBreakdownElementNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductComposite createWorkProductComposite() {
-		WorkProductCompositeImpl workProductComposite = new WorkProductCompositeImpl();
-		return workProductComposite;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AbsoluteBendpoint createAbsoluteBendpointFromString(EDataType eDataType, String initialValue) {
-		return (AbsoluteBendpoint)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertAbsoluteBendpointToString(EDataType eDataType,
-			Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point createPointFromString(EDataType eDataType, String initialValue) {
-		return (Point)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertPointToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescriptor createRoleDescriptorFromString(EDataType eDataType, String initialValue) {
-		return (RoleDescriptor)super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertRoleDescriptorToString(EDataType eDataType,
-			Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ModelPackage getModelPackage() {
-		return (ModelPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	@Deprecated
-	public static ModelPackage getPackage() {
-		return ModelPackage.eINSTANCE;
-	}
-
-} // ModelFactoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ModelPackageImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ModelPackageImpl.java
deleted file mode 100644
index 986faed..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/ModelPackageImpl.java
+++ /dev/null
@@ -1,772 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.uma.RoleDescriptor;
-
-
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Package</b>. <!--
- * end-user-doc -->
- * @generated
- */
-public class ModelPackageImpl extends EPackageImpl implements ModelPackage {
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass diagramEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass linkEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass linkedObjectEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass namedNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass nodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityDiagramEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass typedNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductDependencyDiagramEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityDetailDiagramEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass nodeContainerEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleTaskCompositeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductDescriptorNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workBreakdownElementNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductCompositeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType absoluteBendpointEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType pointEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType roleDescriptorEDataType = 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.epf.diagram.model.ModelPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private ModelPackageImpl() {
-		super(eNS_URI, ModelFactory.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.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static ModelPackage init() {
-		if (isInited) return (ModelPackage)EPackage.Registry.INSTANCE.getEPackage(ModelPackage.eNS_URI);
-
-		// Obtain or create and register package
-		ModelPackageImpl theModelPackage = (ModelPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof ModelPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new ModelPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		UmaPackage.eINSTANCE.eClass();
-
-		// Create package meta-data objects
-		theModelPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theModelPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theModelPackage.freeze();
-
-		return theModelPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDiagram() {
-		return diagramEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLink() {
-		return linkEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLink_Name() {
-		return (EAttribute)linkEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLink_Source() {
-		return (EReference)linkEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLink_Target() {
-		return (EReference)linkEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLink_Bendpoints() {
-		return (EAttribute)linkEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLink_SourceEndPoint() {
-		return (EAttribute)linkEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLink_TargetEndPoint() {
-		return (EAttribute)linkEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLinkedObject() {
-		return linkedObjectEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLinkedObject_LinkedElement() {
-		return (EReference)linkedObjectEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNamedNode() {
-		return namedNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNamedNode_Name() {
-		return (EAttribute)namedNodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNode() {
-		return nodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNode_Location() {
-		return (EAttribute)nodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNode_Width() {
-		return (EAttribute)nodeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNode_Height() {
-		return (EAttribute)nodeEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNode_IncomingConnections() {
-		return (EReference)nodeEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNode_OutgoingConnections() {
-		return (EReference)nodeEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNode_ReadOnly() {
-		return (EAttribute)nodeEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityDiagram() {
-		return activityDiagramEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTypedNode() {
-		return typedNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTypedNode_Type() {
-		return (EAttribute)typedNodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductDependencyDiagram() {
-		return workProductDependencyDiagramEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductNode() {
-		return workProductNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductNode_Type() {
-		return (EAttribute)workProductNodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityDetailDiagram() {
-		return activityDetailDiagramEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityDetailDiagram_AutoLayout() {
-		return (EAttribute)activityDetailDiagramEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNodeContainer() {
-		return nodeContainerEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNodeContainer_Nodes() {
-		return (EReference)nodeContainerEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleNode() {
-		return roleNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleTaskComposite() {
-		return roleTaskCompositeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleTaskComposite_RowIndex() {
-		return (EAttribute)roleTaskCompositeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTaskNode() {
-		return taskNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskNode_Index() {
-		return (EAttribute)taskNodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductDescriptorNode() {
-		return workProductDescriptorNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkBreakdownElementNode() {
-		return workBreakdownElementNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductComposite() {
-		return workProductCompositeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductComposite_Type() {
-		return (EAttribute)workProductCompositeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getAbsoluteBendpoint() {
-		return absoluteBendpointEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getPoint() {
-		return pointEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getRoleDescriptor() {
-		return roleDescriptorEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ModelFactory getModelFactory() {
-		return (ModelFactory)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
-		diagramEClass = createEClass(DIAGRAM);
-
-		linkEClass = createEClass(LINK);
-		createEAttribute(linkEClass, LINK__NAME);
-		createEReference(linkEClass, LINK__SOURCE);
-		createEReference(linkEClass, LINK__TARGET);
-		createEAttribute(linkEClass, LINK__BENDPOINTS);
-		createEAttribute(linkEClass, LINK__SOURCE_END_POINT);
-		createEAttribute(linkEClass, LINK__TARGET_END_POINT);
-
-		linkedObjectEClass = createEClass(LINKED_OBJECT);
-		createEReference(linkedObjectEClass, LINKED_OBJECT__LINKED_ELEMENT);
-
-		namedNodeEClass = createEClass(NAMED_NODE);
-		createEAttribute(namedNodeEClass, NAMED_NODE__NAME);
-
-		nodeEClass = createEClass(NODE);
-		createEAttribute(nodeEClass, NODE__LOCATION);
-		createEAttribute(nodeEClass, NODE__WIDTH);
-		createEAttribute(nodeEClass, NODE__HEIGHT);
-		createEReference(nodeEClass, NODE__INCOMING_CONNECTIONS);
-		createEReference(nodeEClass, NODE__OUTGOING_CONNECTIONS);
-		createEAttribute(nodeEClass, NODE__READ_ONLY);
-
-		activityDiagramEClass = createEClass(ACTIVITY_DIAGRAM);
-
-		typedNodeEClass = createEClass(TYPED_NODE);
-		createEAttribute(typedNodeEClass, TYPED_NODE__TYPE);
-
-		workProductDependencyDiagramEClass = createEClass(WORK_PRODUCT_DEPENDENCY_DIAGRAM);
-
-		workProductNodeEClass = createEClass(WORK_PRODUCT_NODE);
-		createEAttribute(workProductNodeEClass, WORK_PRODUCT_NODE__TYPE);
-
-		activityDetailDiagramEClass = createEClass(ACTIVITY_DETAIL_DIAGRAM);
-		createEAttribute(activityDetailDiagramEClass, ACTIVITY_DETAIL_DIAGRAM__AUTO_LAYOUT);
-
-		nodeContainerEClass = createEClass(NODE_CONTAINER);
-		createEReference(nodeContainerEClass, NODE_CONTAINER__NODES);
-
-		roleNodeEClass = createEClass(ROLE_NODE);
-
-		roleTaskCompositeEClass = createEClass(ROLE_TASK_COMPOSITE);
-		createEAttribute(roleTaskCompositeEClass, ROLE_TASK_COMPOSITE__ROW_INDEX);
-
-		taskNodeEClass = createEClass(TASK_NODE);
-		createEAttribute(taskNodeEClass, TASK_NODE__INDEX);
-
-		workProductDescriptorNodeEClass = createEClass(WORK_PRODUCT_DESCRIPTOR_NODE);
-
-		workBreakdownElementNodeEClass = createEClass(WORK_BREAKDOWN_ELEMENT_NODE);
-
-		workProductCompositeEClass = createEClass(WORK_PRODUCT_COMPOSITE);
-		createEAttribute(workProductCompositeEClass, WORK_PRODUCT_COMPOSITE__TYPE);
-
-		// Create data types
-		absoluteBendpointEDataType = createEDataType(ABSOLUTE_BENDPOINT);
-		pointEDataType = createEDataType(POINT);
-		roleDescriptorEDataType = createEDataType(ROLE_DESCRIPTOR);
-	}
-
-	/**
-	 * <!-- 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
-		UmaPackage theUmaPackage = (UmaPackage)EPackage.Registry.INSTANCE.getEPackage(UmaPackage.eNS_URI);
-
-		// Create type parameters
-
-		// Set bounds for type parameters
-
-		// Add supertypes to classes
-		diagramEClass.getESuperTypes().add(this.getNodeContainer());
-		linkEClass.getESuperTypes().add(this.getLinkedObject());
-		namedNodeEClass.getESuperTypes().add(this.getNode());
-		nodeEClass.getESuperTypes().add(this.getLinkedObject());
-		activityDiagramEClass.getESuperTypes().add(this.getDiagram());
-		typedNodeEClass.getESuperTypes().add(this.getNode());
-		workProductDependencyDiagramEClass.getESuperTypes().add(this.getDiagram());
-		workProductNodeEClass.getESuperTypes().add(this.getNamedNode());
-		activityDetailDiagramEClass.getESuperTypes().add(this.getDiagram());
-		nodeContainerEClass.getESuperTypes().add(this.getNode());
-		roleNodeEClass.getESuperTypes().add(this.getNamedNode());
-		roleTaskCompositeEClass.getESuperTypes().add(this.getNodeContainer());
-		taskNodeEClass.getESuperTypes().add(this.getNamedNode());
-		workProductDescriptorNodeEClass.getESuperTypes().add(this.getNamedNode());
-		workBreakdownElementNodeEClass.getESuperTypes().add(this.getNamedNode());
-		workProductCompositeEClass.getESuperTypes().add(this.getNodeContainer());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(diagramEClass, Diagram.class, "Diagram", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(linkEClass, Link.class, "Link", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getLink_Name(), ecorePackage.getEString(), "name", "", 0, 1, Link.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(getLink_Source(), this.getNode(), this.getNode_OutgoingConnections(), "source", null, 0, 1, Link.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getLink_Target(), this.getNode(), this.getNode_IncomingConnections(), "target", null, 0, 1, Link.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getLink_Bendpoints(), this.getAbsoluteBendpoint(), "bendpoints", null, 0, -1, Link.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getLink_SourceEndPoint(), this.getPoint(), "sourceEndPoint", null, 0, 1, Link.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getLink_TargetEndPoint(), this.getPoint(), "targetEndPoint", null, 0, 1, Link.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(linkedObjectEClass, LinkedObject.class, "LinkedObject", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getLinkedObject_LinkedElement(), theUmaPackage.getMethodElement(), null, "linkedElement", null, 0, 1, LinkedObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(namedNodeEClass, NamedNode.class, "NamedNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getNamedNode_Name(), ecorePackage.getEString(), "name", null, 0, 1, NamedNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(nodeEClass, Node.class, "Node", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getNode_Location(), this.getPoint(), "location", null, 0, 1, Node.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getNode_Width(), ecorePackage.getEInt(), "width", "-1", 0, 1, Node.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getNode_Height(), ecorePackage.getEInt(), "height", "-1", 0, 1, Node.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(getNode_IncomingConnections(), this.getLink(), this.getLink_Target(), "incomingConnections", null, 0, -1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getNode_OutgoingConnections(), this.getLink(), this.getLink_Source(), "outgoingConnections", null, 0, -1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getNode_ReadOnly(), ecorePackage.getEBoolean(), "readOnly", null, 0, 1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(activityDiagramEClass, ActivityDiagram.class, "ActivityDiagram", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(typedNodeEClass, TypedNode.class, "TypedNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getTypedNode_Type(), ecorePackage.getEInt(), "type", null, 0, 1, TypedNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(workProductDependencyDiagramEClass, WorkProductDependencyDiagram.class, "WorkProductDependencyDiagram", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(workProductNodeEClass, WorkProductNode.class, "WorkProductNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getWorkProductNode_Type(), ecorePackage.getEInt(), "type", null, 0, 1, WorkProductNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(activityDetailDiagramEClass, ActivityDetailDiagram.class, "ActivityDetailDiagram", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getActivityDetailDiagram_AutoLayout(), ecorePackage.getEBoolean(), "autoLayout", null, 0, 1, ActivityDetailDiagram.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(nodeContainerEClass, NodeContainer.class, "NodeContainer", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getNodeContainer_Nodes(), this.getNode(), null, "nodes", null, 0, -1, NodeContainer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(roleNodeEClass, RoleNode.class, "RoleNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(roleTaskCompositeEClass, RoleTaskComposite.class, "RoleTaskComposite", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getRoleTaskComposite_RowIndex(), ecorePackage.getEInt(), "rowIndex", null, 0, 1, RoleTaskComposite.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(taskNodeEClass, TaskNode.class, "TaskNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getTaskNode_Index(), ecorePackage.getEInt(), "index", "-1", 0, 1, TaskNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(workProductDescriptorNodeEClass, WorkProductDescriptorNode.class, "WorkProductDescriptorNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(workBreakdownElementNodeEClass, WorkBreakdownElementNode.class, "WorkBreakdownElementNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(workProductCompositeEClass, WorkProductComposite.class, "WorkProductComposite", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getWorkProductComposite_Type(), ecorePackage.getEInt(), "type", null, 0, 1, WorkProductComposite.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		// Initialize data types
-		initEDataType(absoluteBendpointEDataType, AbsoluteBendpoint.class, "AbsoluteBendpoint", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(pointEDataType, Point.class, "Point", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(roleDescriptorEDataType, RoleDescriptor.class, "RoleDescriptor", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} // ModelPackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NamedNodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NamedNodeImpl.java
deleted file mode 100644
index d984a76..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NamedNodeImpl.java
+++ /dev/null
@@ -1,492 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Named Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NamedNodeImpl#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NamedNodeImpl extends NodeImpl implements NamedNode {
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NamedNodeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.NAMED_NODE;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.NAMED_NODE__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.NAMED_NODE__NAME:
-				return getName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.NAMED_NODE__NAME:
-				setName((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.NAMED_NODE__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.NAMED_NODE__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-		}
-		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(" (name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(')');
-		return result.toString();
-	}
-
-	// -------------------//
-	// Start custom code  //
-	// -------------------//
-
-	protected class MethodElementAdapter extends TransactionalNodeLink {
-		protected void handleNotification(Notification msg) {
-			switch (msg.getFeatureID(DescribableElement.class)) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-				setName(msg.getNewStringValue());
-				return;
-			}
-		}
-		
-		public void notifyChanged(final Notification msg) {
-			if (!notificationEnabled)
-				return;
-			notificationEnabled = false;
-			try {
-				TxUtil.runInTransaction(getNode(), 
-						new Runnable() {
-
-							public void run() {
-								handleNotification(msg);
-							}
-					
-				});
-			} catch (Exception e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			} finally {
-				notificationEnabled = true;
-			}
-		}
-
-		public Node getNode() {
-			return NamedNodeImpl.this;
-		}
-
-	}
-
-	protected Link addIncomingConnection(MethodElement source) {
-		Node srcNode = findNode(source);
-		if (srcNode == null)
-			return null;
-		Link link = ModelFactory.eINSTANCE.createLink();
-		link.setTarget(this);
-
-		// disable notification of srcNode before associate it with the link
-		// so it will not create duplicate UMA data
-		//
-		NodeImpl srcNodeImpl = (NodeImpl) srcNode;
-		boolean notify = srcNodeImpl.notificationEnabled;
-		try {
-			srcNodeImpl.notificationEnabled = false;
-			link.setSource(srcNode);
-		} finally {
-			srcNodeImpl.notificationEnabled = notify;
-		}
-
-		if(isGraphicalDataRequired()) {
-			GraphicalDataHelper.addGraphicalData(link);
-		}
-		return link;
-	}
-
-	protected Node findNode(MethodElement linkedElement) {
-		return GraphicalDataHelper.findNode(getDiagram(), linkedElement);
-	}
-
-	protected Link addOutgoingConnection(MethodElement target) {
-		Node targetNode = findNode(target);
-		if (targetNode == null)
-			return null;
-		Link link = ModelFactory.eINSTANCE.createLink();
-
-		// disable notification of targetNode before associate it with the link
-		// so it will not create duplicate UMA data
-		//
-		NodeImpl nodeImpl = (NodeImpl) targetNode;
-		boolean notify = nodeImpl.notificationEnabled;
-		try {
-			nodeImpl.notificationEnabled = false;
-			link.setTarget(targetNode);
-		} finally {
-			nodeImpl.notificationEnabled = notify;
-		}
-
-		link.setSource(this);
-		if(isGraphicalDataRequired()) {
-			GraphicalDataHelper.addGraphicalData(link);
-		}
-		return link;
-	}
-
-	protected boolean removeIncomingConnection(MethodElement source) {
-		// look for the incoming connection with source as linked object of the
-		// source node
-		//
-		for (Iterator iter = getIncomingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			if (link.getSource() != null
-					&& link.getSource().getObject() == source) {
-				GraphicalDataHelper.removeGraphicalData(link);
-				// disable internal notification of the source node
-				//
-				NodeImpl sourceNode = (NodeImpl) link.getSource();
-				boolean oldNotify = sourceNode.notificationEnabled;
-				try {
-					sourceNode.notificationEnabled = false;
-					link.setSource(null);
-				} finally {
-					sourceNode.notificationEnabled = oldNotify;
-				}
-				link.setTarget(null);
-				link.setObject(null);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	protected boolean removeOutgoingConnection(MethodElement target) {
-		// look for the incoming connection with source as linked object of the
-		// source node
-		//
-		for (Iterator iter = getOutgoingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			if (link.getTarget() != null
-					&& link.getTarget().getObject() == target) {
-				GraphicalDataHelper.removeGraphicalData(link);
-				// disable internal notification of the source node
-				//
-				NodeImpl targetNode = (NodeImpl) link.getTarget();
-				boolean oldNotify = targetNode.notificationEnabled;
-				try {
-					targetNode.notificationEnabled = false;
-					link.setTarget(null);
-				} finally {
-					targetNode.notificationEnabled = oldNotify;
-				}
-				link.setSource(null);
-				link.setObject(null);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public void setObject(Object newObject) {
-		super.setObject(newObject);
-
-		if (newObject == null)
-			return;
-		String name = null;
-
-		// use presentation name
-		if (newObject instanceof DescribableElement) {
-			DescribableElement element = (DescribableElement) newObject;
-			name = ProcessUtil.getPresentationName((BreakdownElement) element);
-		}
-
-		// if it's blank then use name
-		if (StrUtil.isBlank(name)) {
-			MethodElement element = (MethodElement) newObject;
-			name = element.getName();
-		}
-
-		this.name = name;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#basicSetObject(java.lang.Object)
-	 */
-	protected void basicSetObject(Object newObject) {
-		super.basicSetObject(newObject);
-
-		if (newObject instanceof VariabilityElement
-				&& ProcessUtil
-						.isExtendingOrLocallyContributing((BreakdownElement) newObject)) {
-			// listen to change in the base
-			//
-			VariabilityElement base = ((VariabilityElement) newObject)
-					.getVariabilityBasedOnElement();
-			if (base != null) {
-				if (baseListener == null) {
-					baseListener = new AdapterImpl() {
-						public void notifyChanged(Notification msg) {
-							switch (msg.getFeatureID(DescribableElement.class)) {
-							case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-								DescribableElement e = (DescribableElement) getObject();
-								if (StrUtil.isBlank(e.getPresentationName())) {
-									String oldName = name;
-									name = msg.getNewStringValue();
-									if (!name.equals(oldName)) {
-									eNotify(new ENotificationImpl(
-											NamedNodeImpl.this, -1,
-											ModelPackage.NAMED_NODE__NAME,
-											oldName, name));
-									}
-								}
-								break;
-							}
-						}
-					};
-				}
-				base.eAdapters().add(baseListener);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#dispose()
-	 */
-	protected void dispose() {
-		EObject obj = (EObject) getObject();
-		if (obj != null) {
-			if (baseListener != null) {
-				obj.eAdapters().remove(baseListener);
-			}
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#createNodeAdapter()
-	 */
-	protected Adapter createNodeAdapter() {
-		return new NodeAdapter() {
-			public void notifyChanged(Notification msg) {
-				if (!notificationEnabled)
-					return;
-				notificationEnabled = false;
-				try {
-					switch (msg.getFeatureID(NamedNode.class)) {
-					case ModelPackage.NAMED_NODE__NAME:
-						if (msg.getEventType() == Notification.SET
-								&& getObject() instanceof BreakdownElement) {
-							String newName = msg.getNewStringValue();
-							BreakdownElement e = ((BreakdownElement) getObject());
-							e.setPresentationName(newName);
-							if (StrUtil.isBlank(e.getName())) {
-								e.setName(newName);
-							}
-						}
-						return;
-					}
-					super.notifyChanged(msg);
-				} finally {
-					notificationEnabled = true;
-				}
-
-			}
-		};
-
-	}
-
-	public boolean isNotificationEnabled() {
-		return notificationEnabled;
-	}
-
-	public void setNotificationEnabled(boolean notificationEnabled) {
-		this.notificationEnabled = notificationEnabled;
-	}
-
-	public boolean isSuppressed() {
-		Suppression suppression = getDiagram().getSuppression();
-		if (suppression != null) {
-			Object o = itemProvider != null ? itemProvider : getLinkedElement();
-			return getDiagram().getSuppression().isSuppressed(o);
-		}
-		return false;
-	}
-	public Object getWrapper() {
-		return itemProvider;
-	}
-
-	/**
-	 * Sets the item provider for the this node if there is a read-only wrapper
-	 * for the node in the given element collection
-	 * 
-	 * @param node
-	 * @param allElements
-	 */
-	void setItemProvider(Collection allElements) {
-		Object object = GraphicalDataHelper.findElement(allElements,
-				getObject());
-		if (object instanceof BreakdownElementWrapperItemProvider) {
-			BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) object;
-			if (wrapper.isReadOnly()) {
-				itemProvider = wrapper;
-				readOnly = true;
-			}
-		}
-	}
-
-	private AdapterImpl baseListener;
-
-	/**
-	 * Item provider of the linked object
-	 */
-	protected BreakdownElementWrapperItemProvider itemProvider;
-
-} // NamedNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NodeContainerImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NodeContainerImpl.java
deleted file mode 100644
index 0ddf230..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NodeContainerImpl.java
+++ /dev/null
@@ -1,231 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-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.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Node Container</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NodeContainerImpl#getNodes <em>Nodes</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class NodeContainerImpl extends NodeImpl implements
-		NodeContainer {
-	/**
-	 * The cached value of the '{@link #getNodes() <em>Nodes</em>}' containment reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getNodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<Node> nodes;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NodeContainerImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.NODE_CONTAINER;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<Node> getNodes() {
-		if (nodes == null) {
-			nodes = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.NODE_CONTAINER__NODES);
-		}
-		return nodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ModelPackage.NODE_CONTAINER__NODES:
-				return ((InternalEList<?>)getNodes()).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 ModelPackage.NODE_CONTAINER__NODES:
-				return getNodes();
-		}
-		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 ModelPackage.NODE_CONTAINER__NODES:
-				getNodes().clear();
-				getNodes().addAll((Collection<? extends Node>)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.NODE_CONTAINER__NODES:
-				getNodes().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.NODE_CONTAINER__NODES:
-				return nodes != null && !nodes.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#setReadOnly(boolean)
-	 */
-	public void setReadOnly(boolean newReadOnly) {
-		super.setReadOnly(newReadOnly);
-		if (newReadOnly) {
-			for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-				Node child = (Node) iter.next();
-				child.setReadOnly(newReadOnly);
-			}
-		}
-	}
-
-	/**
-	 * @param removedNodes
-	 */
-	protected void pushBackToDiagram(Collection removedNodes) {
-		ActivityDetailDiagramImpl diagram = (ActivityDetailDiagramImpl) getDiagram();
-		Collection breakdownElements = diagram.getAllBreakdownElements(true);
-		for (Iterator iter = removedNodes.iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if (!breakdownElements.contains(node.getObject())) {
-				iter.remove();
-			}
-		}
-		// for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();)
-		// {
-		// Object node = iter.next();
-		// if(node instanceof RoleTaskComposite){
-		// List list = ((RoleTaskComposite)node).getNodes();
-		// boolean destroy = true;
-		// for(Iterator iterator = list.iterator(); iterator.hasNext();){
-		// Object obj = iterator.next();
-		// if(obj instanceof TaskNode) destroy = false;
-		// }
-		// if(destroy) iter.remove();
-		// }
-		// }
-		if (!removedNodes.isEmpty()) {
-			diagram.getNodes().addAll(removedNodes);
-		}
-	}
-	
-	protected void selectNodes(Collection nodes) {
-		if (!nodes.isEmpty()) {
-			for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-				NodeImpl node = (NodeImpl) iter.next();
-				node.visible = true;
-			}
-			for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-				NodeImpl node = (NodeImpl) iter.next();
-				if(!nodes.contains(node)) {
-					node.visible = false;
-				}
-			}
-			getNodes().addAll(nodes);
-		}
-		else {
-			for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-				NodeImpl node = (NodeImpl) iter.next();
-				node.visible = false;
-			}
-		}
-	}
-	
-	@Override
-	protected void dispose() {
-		// dispose all nodes
-		//
-		for (Object node : new ArrayList<Node>(nodes)) {		
-			((NodeImpl)node).dispose();
-		}
-		
-		super.dispose();
-	}
-	
-} // NodeContainerImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NodeImpl.java
deleted file mode 100644
index 4c9f571..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/NodeImpl.java
+++ /dev/null
@@ -1,899 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.impl.NamedNodeImpl.MethodElementAdapter;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.diagram.model.util.INodeChangeListener;
-import org.eclipse.epf.diagram.model.util.TxUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getLocation <em>Location</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getWidth <em>Width</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getHeight <em>Height</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getIncomingConnections <em>Incoming Connections</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#getOutgoingConnections <em>Outgoing Connections</em>}</li>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.NodeImpl#isReadOnly <em>Read Only</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class NodeImpl extends LinkedObjectImpl implements Node {
-	/**
-	 * The default value of the '{@link #getLocation() <em>Location</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Point LOCATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLocation() <em>Location</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected Point location = LOCATION_EDEFAULT;
-
-	/**
-	 * 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 = -1;
-
-	/**
-	 * 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;
-
-	/**
-	 * The default value of the '{@link #getHeight() <em>Height</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int HEIGHT_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getHeight() <em>Height</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int height = HEIGHT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getIncomingConnections() <em>Incoming Connections</em>}' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getIncomingConnections()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<Link> incomingConnections;
-
-	/**
-	 * The cached value of the '{@link #getOutgoingConnections() <em>Outgoing Connections</em>}' containment reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getOutgoingConnections()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<Link> outgoingConnections;
-
-	/**
-	 * The default value of the '{@link #isReadOnly() <em>Read Only</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #isReadOnly()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean READ_ONLY_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isReadOnly() <em>Read Only</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #isReadOnly()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean readOnly = READ_ONLY_EDEFAULT;
-
-	private Adapter nodeAdapter;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NodeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.NODE;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point getLocation() {
-		return location;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLocation(Point newLocation) {
-		Point oldLocation = location;
-		location = newLocation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.NODE__LOCATION, oldLocation, location));
-	}
-
-	/**
-	 * <!-- 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;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.NODE__WIDTH, oldWidth, width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getHeight() {
-		return height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHeight(int newHeight) {
-		int oldHeight = height;
-		height = newHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.NODE__HEIGHT, oldHeight, height));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<Link> getIncomingConnections() {
-		if (incomingConnections == null) {
-			incomingConnections = new EObjectWithInverseResolvingEList<Link>(Link.class, this, ModelPackage.NODE__INCOMING_CONNECTIONS, ModelPackage.LINK__TARGET);
-		}
-		return incomingConnections;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<Link> getOutgoingConnections() {
-		if (outgoingConnections == null) {
-			outgoingConnections = new EObjectContainmentWithInverseEList<Link>(Link.class, this, ModelPackage.NODE__OUTGOING_CONNECTIONS, ModelPackage.LINK__SOURCE);
-		}
-		return outgoingConnections;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (location: "); //$NON-NLS-1$
-		result.append(location);
-		result.append(", width: "); //$NON-NLS-1$
-		result.append(width);
-		result.append(", height: "); //$NON-NLS-1$
-		result.append(height);
-		result.append(", readOnly: "); //$NON-NLS-1$
-		result.append(readOnly);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * Adds incoming connection
-	 * 
-	 * @param link
-	 * @return
-	 */
-	protected boolean addToUMA(Link link) {
-		if (link.getTarget() == null || link.getSource() == null)
-			return false;
-		if(isGraphicalDataRequired()) {
-			GraphicalDataHelper.addGraphicalData(link);
-		}
-		return true;
-	}
-
-	/**
-	 * Removes outgoing connection
-	 * 
-	 * @param link
-	 * @param oldSource
-	 * @param oldTarget
-	 */
-	protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) {
-		// GraphicalDataManager.getInstance().removeGraphConnectorPair(oldSource.getGraphNode(),
-		// oldTarget.getGraphNode());
-		
-		GraphicalDataHelper.removeGraphicalData(link);
-	}
-
-	protected org.eclipse.epf.uma.Diagram getUMADiagram() {
-		if (getDiagram() == null)
-			return umaDiagram;
-		return getDiagram().getUMADiagram();
-	}
-
-	protected GraphNode getUMAContainer() {
-		Node container = (Node) eContainer();
-		if (container == null)
-			return umaContainer;
-		return container.getGraphNode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Node#setUMAContainer(org.eclipse.epf.uma.GraphNode)
-	 */
-	public void setUMAContainer(GraphNode umaContainer) {
-		this.umaContainer = umaContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.ActivityNode#setUMADiagram(org.eclipse.epf.uma.Diagram)
-	 */
-	public void setUMADiagram(org.eclipse.epf.uma.Diagram umaDiagram) {
-		this.umaDiagram = umaDiagram;
-		umaContainer = umaDiagram;
-	}
-
-	protected class NodeAdapter extends AdapterImpl {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			switch (msg.getFeatureID(Node.class)) {
-			case ModelPackage.NODE__WIDTH:
-				getGraphNode().getSize().setWidth(
-						new Double(msg.getNewIntValue()));
-				return;
-
-			case ModelPackage.NODE__HEIGHT:
-				if (getGraphNode() != null) {
-					getGraphNode().getSize().setHeight(
-							new Double(msg.getNewIntValue()));
-				}
-				return;
-
-			case ModelPackage.NODE__LOCATION:
-				if (getGraphNode() != null && msg.getNewValue() != null) {
-					Point p = (Point) msg.getNewValue();
-					getGraphNode().getPosition().setX(new Double(p.x));
-					getGraphNode().getPosition().setY(new Double(p.y));
-				}
-				return;
-
-			case ModelPackage.NODE__INCOMING_CONNECTIONS:
-				Link link;
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					link = (Link) msg.getNewValue();
-					addToUMA(link);
-					return;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						addToUMA((Link) iter.next());
-					}
-					break;
-				case Notification.REMOVE:
-					link = (Link) msg.getOldValue();
-					if (link.getSource() != null) {
-						((NodeImpl) link.getSource()).removeFromUMA(link, link
-								.getSource(), (Node) msg.getNotifier());
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					for (Iterator iter = ((Collection) msg.getOldValue())
-							.iterator(); iter.hasNext();) {
-						link = (Link) iter.next();
-						if (link.getSource() != null) {
-							((NodeImpl) link.getSource()).removeFromUMA(link,
-									link.getSource(), (Node) msg.getNotifier());
-						}
-					}
-					break;
-				}
-				return;
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					link = (Link) msg.getNewValue();
-					if (link.getTarget() != null) {
-						((NodeImpl) link.getTarget()).addToUMA(link);
-					}
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						link = (Link) iter.next();
-						if (link.getTarget() != null) {
-							((NodeImpl) link.getTarget()).addToUMA(link);
-						}
-					}
-					break;
-				case Notification.REMOVE:
-					link = (Link) msg.getOldValue();
-					if (link.getTarget() != null) {
-						removeFromUMA(link, (Node) msg.getNotifier(), link
-								.getTarget());
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					for (Iterator iter = ((Collection) msg.getOldValue())
-							.iterator(); iter.hasNext();) {
-						link = (Link) iter.next();
-						if (link.getTarget() != null) {
-							removeFromUMA(link, (Node) msg.getNotifier(), link
-									.getTarget());
-						}
-					}
-					break;
-				}
-				return;
-
-			}
-		}
-
-	}
-	
-	/**
-	 * Loads graphnode data and associates the adapters.
-	 * @param newObject
-	 */
-	protected void basicSetObject(Object newObject) {
-		if (newObject == null)
-			return;
-
-		this.object = newObject;
-		MethodElement element = (MethodElement) newObject;
-		
-		graphNode = getGraphNode(element);
-
-		// System.out.println("NodeImpl.setObject(): element: '" +
-		// element.getName() + "', graphNode: " + graphNode);
-
-		if(graphNode != null) {
-			// populate/synch data
-			//
-			if (height == HEIGHT_EDEFAULT) {
-				setHeight(graphNode.getSize().getHeight().intValue());
-			} else {
-				graphNode.getSize().setHeight(new Double(height));
-			}
-
-			if (width == WIDTH_EDEFAULT) {
-				setWidth(graphNode.getSize().getWidth().intValue());
-			} else {
-				graphNode.getSize().setWidth(new Double(width));
-			}
-
-			if (location == LOCATION_EDEFAULT) {
-				setLocation(GraphicalDataHelper.toPoint(graphNode.getPosition()));
-			} else {
-				graphNode.getPosition().setX(new Double(location.x));
-				graphNode.getPosition().setY(new Double(location.y));
-			}
-		}
-
-		// add methodElementAdapter
-		//
-		getMethodElementAdapter();
-		if (methodElementAdapter != null && !element.eAdapters().contains(methodElementAdapter)) {
-			element.eAdapters().add(methodElementAdapter);
-		}
-
-		if(nodeAdapter == null) {
-			nodeAdapter = createNodeAdapter();
-		}
-		if(nodeAdapter != null && !eAdapters().contains(nodeAdapter)) {
-			eAdapters().add(nodeAdapter);
-		}
-				
-		Object e = TngUtil.unwrap(object);
-		if(e instanceof MethodElement) {
-			setLinkedElement((MethodElement) e);
-		}
-	}
-	
-	protected abstract class TransactionalNodeLink extends AdapterImpl 
-	implements INodeChangeListener
-	{
-		public void notifyChanged(final Notification msg) {
-			if(msg.getEventType() == Notification.REMOVING_ADAPTER) {
-				return;
-			}
-			if (!notificationEnabled)
-				return;
-			notificationEnabled = false;
-			try {
-				TxUtil.runInTransaction(getNode(), 
-						new Runnable() {
-
-							public void run() {
-								handleNotification(msg);
-							}
-					
-				});
-			} catch (Exception e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			} finally {
-				notificationEnabled = true;
-			}
-		}
-
-		protected abstract void handleNotification(Notification msg);
-
-		public Node getNode() {
-			return NodeImpl.this;
-		}
-	}
-
-	
-	/**
-	 * Subclass can override this method to provide MethodElementAdapter that will synchronize
-	 * the change from method element to the node.
-	 * 
-	 * @return the method element adapter of this node
-	 */
-	protected Object getMethodElementAdapter() {
-		return methodElementAdapter;
-	}
-
-	public GraphNode getGraphNode(MethodElement methodElement){
-		if(isGraphicalDataRequired()) {
-			return GraphicalDataManager.getInstance().getGraphNode(
-					getUMADiagram(), methodElement);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.LinkedObjectImpl#setObject(java.lang.Object)
-	 */
-	public void setObject(Object newObject) {
-		super.setObject(newObject);
-		
-		basicSetObject(newObject);
-	}
-
-	/**
-	 * @return
-	 */
-	protected Adapter createNodeAdapter() {
-		return new NodeAdapter();
-	}
-
-	public GraphNode getGraphNode() {
-		return graphNode;
-	}
-
-	// TODO: force subclass to implement this method
-	public Class getMethodElementAdapterType() {
-		return INodeChangeListener.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Node#getDiagram()
-	 */
-	public Diagram getDiagram() {
-		EObject parent = eContainer;
-		for (; parent != null && !(parent instanceof Diagram); parent = parent
-				.eContainer())
-			;
-		if (parent instanceof Diagram) {
-			return (Diagram) parent;
-		}
-		return diagram;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Node#setDiagram(org.eclipse.epf.diagram.model.Diagram)
-	 */
-	public void setDiagram(Diagram diagram) {
-		this.diagram = diagram;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Node#addConsumer(java.lang.Object)
-	 */
-	public void addConsumer(Object consumer) {
-		if (!consumers.contains(consumer)) {
-			consumers.add(consumer);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.Node#removeConsumer(java.lang.Object)
-	 */
-	public void removeConsumer(Object consumer) {
-		consumers.remove(consumer);
-		if (consumers.isEmpty()) {
-			// no more consumer of this node, it should be disposed
-			dispose();
-		}
-	}
-
-	protected void dispose() {
-		EObject obj = (EObject) getObject();
-		if (obj != null) {
-			if (methodElementAdapter != null) {
-				obj.eAdapters().remove(methodElementAdapter);
-			}
-		}
-
-		if(nodeAdapter != null) {
-			eAdapters().remove(nodeAdapter);
-		}
-
-		umaContainer = null;
-		umaDiagram = null;
-		graphNode = null;
-		
-		if(outgoingConnections != null) {
-			for (Object link : outgoingConnections) {
-				((Link)link).eAdapters().clear();
-			}
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReadOnly(boolean newReadOnly) {
-		boolean oldReadOnly = readOnly;
-		readOnly = newReadOnly;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.NODE__READ_ONLY, oldReadOnly, readOnly));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-		@Override
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ModelPackage.NODE__INCOMING_CONNECTIONS:
-				return ((InternalEList<InternalEObject>)(InternalEList<?>)getIncomingConnections()).basicAdd(otherEnd, msgs);
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				return ((InternalEList<InternalEObject>)(InternalEList<?>)getOutgoingConnections()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ModelPackage.NODE__INCOMING_CONNECTIONS:
-				return ((InternalEList<?>)getIncomingConnections()).basicRemove(otherEnd, msgs);
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				return ((InternalEList<?>)getOutgoingConnections()).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 ModelPackage.NODE__LOCATION:
-				return getLocation();
-			case ModelPackage.NODE__WIDTH:
-				return new Integer(getWidth());
-			case ModelPackage.NODE__HEIGHT:
-				return new Integer(getHeight());
-			case ModelPackage.NODE__INCOMING_CONNECTIONS:
-				return getIncomingConnections();
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				return getOutgoingConnections();
-			case ModelPackage.NODE__READ_ONLY:
-				return isReadOnly() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		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 ModelPackage.NODE__LOCATION:
-				setLocation((Point)newValue);
-				return;
-			case ModelPackage.NODE__WIDTH:
-				setWidth(((Integer)newValue).intValue());
-				return;
-			case ModelPackage.NODE__HEIGHT:
-				setHeight(((Integer)newValue).intValue());
-				return;
-			case ModelPackage.NODE__INCOMING_CONNECTIONS:
-				getIncomingConnections().clear();
-				getIncomingConnections().addAll((Collection<? extends Link>)newValue);
-				return;
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				getOutgoingConnections().clear();
-				getOutgoingConnections().addAll((Collection<? extends Link>)newValue);
-				return;
-			case ModelPackage.NODE__READ_ONLY:
-				setReadOnly(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.NODE__LOCATION:
-				setLocation(LOCATION_EDEFAULT);
-				return;
-			case ModelPackage.NODE__WIDTH:
-				setWidth(WIDTH_EDEFAULT);
-				return;
-			case ModelPackage.NODE__HEIGHT:
-				setHeight(HEIGHT_EDEFAULT);
-				return;
-			case ModelPackage.NODE__INCOMING_CONNECTIONS:
-				getIncomingConnections().clear();
-				return;
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				getOutgoingConnections().clear();
-				return;
-			case ModelPackage.NODE__READ_ONLY:
-				setReadOnly(READ_ONLY_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.NODE__LOCATION:
-				return LOCATION_EDEFAULT == null ? location != null : !LOCATION_EDEFAULT.equals(location);
-			case ModelPackage.NODE__WIDTH:
-				return width != WIDTH_EDEFAULT;
-			case ModelPackage.NODE__HEIGHT:
-				return height != HEIGHT_EDEFAULT;
-			case ModelPackage.NODE__INCOMING_CONNECTIONS:
-				return incomingConnections != null && !incomingConnections.isEmpty();
-			case ModelPackage.NODE__OUTGOING_CONNECTIONS:
-				return outgoingConnections != null && !outgoingConnections.isEmpty();
-			case ModelPackage.NODE__READ_ONLY:
-				return readOnly != READ_ONLY_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	private Collection consumers = new ArrayList();
-
-	private GraphNode umaContainer;
-
-	private org.eclipse.epf.uma.Diagram umaDiagram;
-
-	private Diagram diagram;
-
-	protected GraphNode graphNode;
-
-	protected boolean notificationEnabled = true;
-
-	protected INodeChangeListener methodElementAdapter;
-
-	protected boolean visible = true;
-	
-	/**
-	 * addDefaultWorkOrder is moved from
-	 * GraphicalDataHelper.addDefaultWorkOrder(NamedNodeImpl,
-	 * WorkbreakdownElement) Method will set notificationEnabled flag to false
-	 * of all adapters of type MethodElementAdapter of Successor object before
-	 * creating a WorkOrder object. After creation of WorkOrder (Predecessor
-	 * link) restores the notificationEnabled flag of Successor's adapters of
-	 * type MethodElementAdapter.
-	 * 
-	 * eg: If an Activity "actA" is extended in another CP. Base "actA" AD
-	 * diagram is opened, and Extended "actA" AD Diagram is opened. On creating
-	 * predecessor link between any two child activities, creates a extra link
-	 * in Extended "actA" AD diagram, because creating workorder will notify the
-	 * extended "actA" diagram to draw a link. To avoid duplicate links in the
-	 * extended activity diagram, we have to set notificationEnabled flag to
-	 * false, before creating a WorkOrder object.
-	 * 
-	 */
-	public WorkOrder addDefaultWorkOrder(NamedNodeImpl node,
-			WorkBreakdownElement predBreakdownElement) {
-		boolean notify = node.isNotificationEnabled();
-		Map map = new HashMap();
-		List list = ((WorkBreakdownElement) node.getObject()).eAdapters();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof MethodElementAdapter) {
-				NodeImpl nodeobj = (NodeImpl) ((MethodElementAdapter) obj)
-						.getNode();
-				boolean predNotification = node.notificationEnabled;
-				((NodeImpl) (((MethodElementAdapter) obj).getNode())).notificationEnabled = false;
-				map.put(nodeobj, new Boolean(predNotification));
-			}
-		}
-		try {
-			node.setNotificationEnabled(false);
-			return UmaUtil.createDefaultWorkOrder((WorkBreakdownElement) node
-					.getObject(), predBreakdownElement);
-		} finally {
-			node.setNotificationEnabled(notify);
-			Set set = map.keySet();
-			for (Iterator iter = set.iterator(); iter.hasNext();) {
-				Object object = iter.next();
-				Object obj = map.get(object);
-				if (obj instanceof Boolean) {
-					boolean prednot = ((Boolean) obj).booleanValue();
-					((NodeImpl) object).notificationEnabled = prednot;
-				}
-			}
-		}
-	}
-	
-	protected boolean isGraphicalDataRequired() {
-		DiagramImpl diagram = (DiagramImpl) getDiagram();
-		return diagram.isGraphicalDataRequired();
-	}
-	
-	public boolean isVisible() {
-		return visible ;
-	}
-
-	public boolean isNotificationEnabled() {
-		return notificationEnabled;
-	}
-
-	public void setNotificationEnabled(boolean notificationEnabled) {
-		this.notificationEnabled = notificationEnabled;
-	}
-	
-} // NodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/RoleNodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/RoleNodeImpl.java
deleted file mode 100644
index 350200c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/RoleNodeImpl.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.RoleNode;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Role Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class RoleNodeImpl extends NamedNodeImpl implements RoleNode {
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected RoleNodeImpl() {
-		super();
-
-		methodElementAdapter = new RoleDescriptorAdapter();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.ROLE_NODE;
-	}
-
-	private class RoleDescriptorAdapter extends MethodElementAdapter {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#getMethodElementAdapterType()
-	 */
-	public Class getMethodElementAdapterType() {
-		return RoleDescriptorAdapter.class;
-	}
-} // RoleNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/RoleTaskCompositeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/RoleTaskCompositeImpl.java
deleted file mode 100644
index ef46e82..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/RoleTaskCompositeImpl.java
+++ /dev/null
@@ -1,786 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.util.OppositeFeatureNotification;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Role Task Composite</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.RoleTaskCompositeImpl#getRowIndex <em>Row Index</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleTaskCompositeImpl extends NodeContainerImpl implements
-		RoleTaskComposite {
-	
-	/**
-	 * The default value of the '{@link #getRowIndex() <em>Row Index</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRowIndex()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int ROW_INDEX_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getRowIndex() <em>Row Index</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRowIndex()
-	 * @generated
-	 * @ordered
-	 */
-	protected int rowIndex = ROW_INDEX_EDEFAULT;
-
-//	private int rowIndex;
-	
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected RoleTaskCompositeImpl() {
-		super();
-
-		methodElementAdapter = new RoleDescriptorAdapter();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.ROLE_TASK_COMPOSITE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getRowIndex() {
-		return rowIndex;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRowIndex(int newRowIndex) {
-		int oldRowIndex = rowIndex;
-		rowIndex = newRowIndex;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.ROLE_TASK_COMPOSITE__ROW_INDEX, oldRowIndex, rowIndex));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.ROLE_TASK_COMPOSITE__ROW_INDEX:
-				return new Integer(getRowIndex());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.ROLE_TASK_COMPOSITE__ROW_INDEX:
-				setRowIndex(((Integer)newValue).intValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.ROLE_TASK_COMPOSITE__ROW_INDEX:
-				setRowIndex(ROW_INDEX_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.ROLE_TASK_COMPOSITE__ROW_INDEX:
-				return rowIndex != ROW_INDEX_EDEFAULT;
-		}
-		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(" (rowIndex: "); //$NON-NLS-1$
-		result.append(rowIndex);
-		result.append(')');
-		return result.toString();
-	}
-
-	private static boolean contains(Collection mixedCollection, Object element) {
-		for (Iterator iter = mixedCollection.iterator(); iter.hasNext();) {
-			if( element == TngUtil.unwrap(iter.next()) ) {
-				return true;
-			}		
-		}
-		return false;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#setObject(java.lang.Object)
-	 */
-	public void setObject(Object newObject) {
-		super.setObject(newObject);
-		populateNodes(newObject);
-//		if (newObject instanceof RoleDescriptor) {
-//			RoleDescriptor roleDescriptor = (RoleDescriptor) newObject;
-//			ActivityDetailDiagramImpl diagram = (ActivityDetailDiagramImpl) getDiagram();
-//			Collection allElements = diagram.getAllBreakdownElements();
-//			List primaryTaskDescriptors = AssociationHelper.getPrimaryTaskDescriptors(roleDescriptor);
-//			if (!primaryTaskDescriptors.isEmpty()) { // overriding
-//																	
-//				// use list to maintain order of
-//				// taskdescriptors.
-//				List taskDescriptors = new ArrayList();
-//				taskDescriptors.addAll(primaryTaskDescriptors);
-//				// taskDescriptors.addAll(roleDescriptor.getPerformsAdditionally());
-//				// taskDescriptors.addAll(roleDescriptor.getAssistsIn());
-//
-//				HashSet selectedDescriptors = new HashSet();
-//				List taskNodes = new ArrayList();
-//				
-//				String autolayout = GraphicalDataHelper.getAutoLayoutFlag((ActivityDetailDiagram)getDiagram()); 
-//				if(autolayout != null){
-//					int index = 0;
-//					for (Iterator iter = allElements.iterator(); iter.hasNext();) {
-//						Object obj = iter.next();
-//						obj = TngUtil.unwrap(obj);
-//						if (obj instanceof TaskDescriptor
-//								&& TngUtil.contains(taskDescriptors, obj)) {
-//							TaskDescriptor taskDescriptor = (TaskDescriptor) obj;
-//
-//							// eliminate descriptor that is duplicate,
-//							// suppressed or filtered out
-//							//
-//							if (!selectedDescriptors.contains(taskDescriptor)
-//							// && contains(allElements, taskDescriptor) // make
-//							// sure that task descriptor is of the owning
-//							// activity
-//							) {
-//								selectedDescriptors.add(taskDescriptor);
-//								Node node = GraphicalDataHelper.findNode(
-//										this, taskDescriptor,
-//										TaskNode.class);
-//								if (node == null) {
-//									node = ModelFactory.eINSTANCE
-//											.createTaskNode();
-//									node.setDiagram(getDiagram());
-//									node.setObject(taskDescriptor);
-//									((NamedNodeImpl) node)
-//											.setItemProvider(allElements);
-//									if(GraphicalDataHelper.findProperty(node.getGraphNode(), 
-//											GraphicalDataHelper.PROP_INDEX) == null
-//											|| GraphicalDataHelper.isAutoLayout((ActivityDetailDiagram)getDiagram())){
-//										GraphicalDataHelper.createProperty(node
-//											.getGraphNode(),
-//											GraphicalDataHelper.PROP_INDEX,
-//											new Integer(index).toString());
-//										index++;
-//									}
-//									
-//								}
-//								taskNodes.add(node);
-//							}
-//						}
-//					}
-//					// Sort the taskNode based on their index if autolayout is
-//					// false
-//					if (GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_FALSE
-//							.equals(autolayout)) {
-//						Collections.sort(taskNodes, comparator);
-//					}
-//			  }else{
-//					for (Iterator iter = taskDescriptors.iterator(); iter.hasNext();) {
-//						TaskDescriptor taskDescriptor = (TaskDescriptor) iter.next();
-//						
-//						// eliminate descriptor that is duplicate, suppressed or filtered out
-//						//
-//						if(!selectedDescriptors.contains(taskDescriptor)
-//								&& contains(allElements, taskDescriptor) // make sure that task descriptor is of the owning activity
-//						) {
-//							selectedDescriptors.add(taskDescriptor);					
-//						Node node = GraphicalDataHelper.findNode(getDiagram(),
-//									taskDescriptor, TaskNode.class);
-//						if (node == null) {
-//							node = ModelFactory.eINSTANCE.createTaskNode();
-//							node.setDiagram(getDiagram());
-//							node.setObject(taskDescriptor);
-//							((NamedNodeImpl) node).setItemProvider(allElements);
-//						}
-//						taskNodes.add(node);
-//						}
-//					}
-//				}
-//				if(!taskNodes.isEmpty()) {
-//					// add role node
-//					//
-//					Node node = (NamedNodeImpl) ModelFactory.eINSTANCE.createRoleNode();
-//					node.setDiagram(getDiagram());
-//					node.setObject(roleDescriptor);
-//					((NamedNodeImpl) node).setItemProvider(allElements);
-//					getNodes().add(node);
-//					// add task nodes
-//					//
-//					getNodes().addAll(taskNodes);
-//				}
-//			}
-//		}
-
-		
-	}
-	
-	public GraphNode getGraphNode(MethodElement methodElement) {
-		if(isGraphicalDataRequired()) {
-			if (getUMADiagram() == null) {
-				// new MethodElement
-				//
-				return GraphicalDataManager.getInstance().createGraphNode(methodElement);
-			}
-			GraphNode node = findGraphNode(getUMADiagram(), methodElement);
-			if (node == null) {
-				node = GraphicalDataManager.getInstance().createGraphNode(methodElement);
-				// createGraphConnectors(node, getUMADiagram());
-				getUMADiagram().getContained().add(node);
-			}
-			String autolayout = GraphicalDataHelper.getAutoLayoutFlag((ActivityDetailDiagram)getDiagram());
-			if(autolayout != null){
-				GraphicalDataHelper.createProperty(node, GraphicalDataHelper.PROP_INDEX, new Integer(rowIndex).toString());
-			}
-			return node;
-		}
-		return null;
-	}
-
-	public GraphNode findGraphNode(Diagram diagram, Object methodElement) {
-		for (Iterator iter = diagram.getContained().iterator(); iter.hasNext();) {
-			GraphNode element = (GraphNode) iter.next();
-			if (element.getSemanticModel() instanceof UMASemanticModelBridge
-					&& methodElement == ((UMASemanticModelBridge) element
-							.getSemanticModel()).getElement()) {
-
-				Property property = GraphicalDataHelper.findProperty(element, GraphicalDataHelper.PROP_INDEX);
-				
-				if (property != null) {
-					String index = property.getValue();
-					if (index != null) {
-						if (getRowIndex() == new Integer(index).intValue())
-							return element;
-					}
-				}else{
-					return element;
-				}
-			}
-		}
-		return null;
-	}
-	
-//	public GraphNode createGraphNode(MethodElement element) {
-//		GraphNode node = GraphicalDataManager.getInstance().createGraphNode(element);
-//		GraphicalDataHelper.createProperty(node,
-//				GraphicalDataHelper.PROP_INDEX, new Integer(rowIndex)
-//						.toString());
-//		return node;
-//	}
-	
-	private class RoleDescriptorAdapter extends TransactionalNodeLink {
-
-		@Override
-		protected void handleNotification(Notification msg) {
-			if(msg instanceof OppositeFeatureNotification) {
-				Object feature = ((OppositeFeatureNotification)msg).getOppsiteFeature();
-				if(feature == AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors) {
-					switch (msg.getEventType()) {
-					case Notification.ADD:
-						addNode((TaskDescriptor) msg.getNewValue());
-						break;
-					case Notification.REMOVE:
-						removeNode(msg.getOldValue());
-						break;
-					case Notification.ADD_MANY:
-						addNode((Collection) msg.getNewValue());
-						break;
-					case Notification.REMOVE_MANY:
-						removeNode((Collection) msg.getOldValue());
-						break;						
-					}
-					return;
-				}
-			}
-			switch (msg.getFeatureID(Activity.class)) {
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-				switch (msg.getEventType()) {
-				case Notification.MOVE:
-//					System.out.println("MOVEEEEEEED");
-					break;
-				}
-				break;
-			}
-		}
-
-	}
-
-	/**
-	 * @param oldValue
-	 */
-	private void removeNode(Object oldValue) {
-		org.eclipse.epf.diagram.model.Diagram diagram = getDiagram();
-		if(diagram == null) {
-			System.err.println("RoleTaskCompositeImpl.removeNode(): [ERROR] no diagram");
-		}
-		Collection removedNodes = new HashSet();
-		for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if (oldValue instanceof TaskDescriptor) {
-				if (node instanceof RoleNode) {
-					ActivityDetailDiagramImpl d = (ActivityDetailDiagramImpl)getDiagram();
-					List list = d.getRealizedPrimaryTaskDescriptors((RoleDescriptor) node.getObject());
-					if (list == null || list.size() < 1) {
-						iter.remove();
-						removedNodes.add(node);
-					}
-				}
-			}
-			if (node.getObject() == oldValue) {
-				iter.remove();
-				removedNodes.add(node);
-				if (oldValue instanceof TaskDescriptor) {
-					Node wpnode = GraphicalDataHelper.findNode(
-							(ActivityDetailDiagram) getDiagram(), oldValue);
-					getDiagram().getNodes().remove(wpnode);
-					wpnode = GraphicalDataHelper.findNode(
-							(ActivityDetailDiagram) getDiagram(), oldValue);
-					getDiagram().getNodes().remove(wpnode);
-				}
-			}
-		}
-		if (nodes.isEmpty()) {
-			getDiagram().getNodes().remove(this);
-		}
-		// pushBackToDiagram(removedNodes);
-	}
-
-	/**
-	 * @param descriptor
-	 */
-	private void addNode(TaskDescriptor descriptor) {
-		addNode(getNodes(), descriptor);
-	}
-
-	private void addNode(Collection nodes, TaskDescriptor descriptor) {
-		if(descriptor.getSuperActivities() == null) {
-			return;
-		}
-		ActivityDetailDiagramImpl diagram = (ActivityDetailDiagramImpl) getDiagram();
-		Node node = GraphicalDataHelper.findNode(this,
-				descriptor, TaskNode.class);
-		if (node == null) {
-			node = diagram.createNode(descriptor);
-			if(node != null) {
-				int i = getNextIndex(getNodes());
-				if (node instanceof TaskNodeImpl) {
-					((TaskNodeImpl) node).doSetIndex(i + 1);
-				}
-				nodes.add(node);
-				Collection inputOutputNodes = new ArrayList();
-				diagram.createTaskInputOutputNodes(descriptor, inputOutputNodes);				
-				if (!inputOutputNodes.isEmpty()) {
-					diagram.getNodes().addAll(inputOutputNodes);
-					diagram.populateLinks(inputOutputNodes, false);
-				}
-			}
- 		}
-	}
-
-	/**
-	 * @param oldValue
-	 */
-	private void removeNode(Collection elements) {
-		Collection nodes = new ArrayList();
-		for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if (elements.contains(node.getObject())) {
-				nodes.add(node);
-			}
-		}
-		getNodes().removeAll(nodes);
-		// pushBackToDiagram(nodes);
-	}
-
-	/**
-	 * @param newValue
-	 */
-	private void addNode(Collection elements) {
-		Collection nodes = new ArrayList();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			TaskDescriptor descriptor = (TaskDescriptor) iter.next();
-			addNode(nodes, descriptor);
-		}
-
-		getNodes().addAll(nodes);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#getMethodElementAdapterType()
-	 */
-	public Class getMethodElementAdapterType() {
-		return RoleDescriptorAdapter.class;
-	}
-	
-	/**
-	 * @return
-	 */
-	private int getNextIndex(List nodes) {
-		int index = 0;
-		for(Iterator iterator = nodes.iterator(); iterator.hasNext();){
-			Object obj = iterator.next();			
-//			if(obj instanceof Node){
-//				Node node = (Node)obj;
-//				//String temp = GraphicalDataHelper.findProperty(node.getGraphNode(), GraphicalDataHelper.PROP_INDEX).getValue();
-//				List list = node.getGraphNode().getList(UmaPackage.GRAPH_NODE__PROPERTY);
-//				if(list != null && !list.isEmpty()){
-//					for (int i = list.size() - 1; i > -1; i--) {
-//						Property prop = (Property) list.get(i);
-//						if (GraphicalDataHelper.PROP_INDEX.equals(prop.getKey())){
-//							int temp  = Integer.parseInt(prop.getValue());
-//							if(temp > index ) index = temp;
-//						}
-//					}
-//				}
-//			}
-			if(obj instanceof TaskNodeImpl) {
-				int id = ((TaskNodeImpl)obj).doGetIndex();
-				if(id > index) {
-					index = id;
-				}
-			}
-		}
-		return index;
-	}
-	
-	private static final Comparator comparator = new Comparator() {
-
-		public int compare(Object obj1, Object obj2) {
-			if (obj1 == obj2)
-				return 0;
-			if(obj1 instanceof TaskNodeImpl && obj2 instanceof TaskNodeImpl){
-				TaskNodeImpl node1 = (TaskNodeImpl)obj1;
-				TaskNodeImpl node2 = (TaskNodeImpl)obj2;
-				if(node1.doGetIndex() >  node2.doGetIndex())
-					return 1;
-			}
-			return 0;
-		}
-
-	};
-
-	public void createTaskInputOutputNodes(TaskDescriptor descriptor, Collection nodes) {
-		Node newNode = null;
-		if (!descriptor.getMandatoryInput().isEmpty()) {
-			newNode = createWorkProductComposite(descriptor,
-					WorkProductComposite.INPUTS);
-			nodes.add(newNode);
-		}
-		if (!descriptor.getOutput().isEmpty()) {
-			newNode = createWorkProductComposite(descriptor,
-					WorkProductComposite.OUTPUTS);
-			nodes.add(newNode);
-		}
-	}
-	
-	public WorkProductComposite createWorkProductComposite(
-			TaskDescriptor taskDescriptor, int type) {
-		WorkProductComposite workproductComposite = ModelFactory.eINSTANCE
-				.createWorkProductComposite();
-		workproductComposite.setUMAContainer(getGraphNode());
-		workproductComposite.setDiagram(getDiagram());
-		workproductComposite.setType(type);
-		workproductComposite.setObject(taskDescriptor);
-		return workproductComposite;
-	}
-	
-	private TaskNode createTaskNode(TaskDescriptor td) {
-		TaskNode taskNode = null;
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if(node instanceof TaskNode) {
-				TaskNode tn = (TaskNode) node;
-				if(tn.getLinkedElement() == td) {
-					taskNode = tn;
-					break;
-				}
-			}
-		}
-		if(taskNode == null) {
-			taskNode = ModelFactory.eINSTANCE.createTaskNode();
-			taskNode.setDiagram(getDiagram());
-		}
-		taskNode.setObject(td);
-		return taskNode;
-	}
-	
-	private RoleNode createRoleNode(RoleDescriptor rd) {
-		RoleNode roleNode = null;
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if(node instanceof RoleNode) {
-				RoleNode rn = (RoleNode) node;
-				if(rn.getLinkedElement() == rd) {
-					roleNode = rn;
-					break;
-				}
-			}
-		}
-		if(roleNode == null) {
-			roleNode = ModelFactory.eINSTANCE.createRoleNode();
-			roleNode.setDiagram(getDiagram());
-			roleNode.setObject(rd);
-		}
-		return roleNode;
-	}
-	
-	public void populateNodes(Object newObject){
-		
-		if (newObject instanceof RoleDescriptor) {
-			RoleDescriptor roleDescriptor = (RoleDescriptor) newObject;
-			ActivityDetailDiagramImpl diagram = (ActivityDetailDiagramImpl) getDiagram();
-			Collection allElements = diagram.getAllBreakdownElements(true);
-			List taskNodes = new ArrayList();
-			List primaryTaskDescriptors = AssociationHelper.getPrimaryTaskDescriptors(roleDescriptor);
-			if (!primaryTaskDescriptors.isEmpty()) { // overriding
-																	
-				List taskDescriptors = new ArrayList();
-				taskDescriptors.addAll(primaryTaskDescriptors);
-				HashSet selectedDescriptors = new HashSet();
-				boolean autoLayout = ((ActivityDetailDiagramImpl)getDiagram()).isAutoLayout();
-				if(autoLayout) {
-					int index = 0;
-					int rowTasksCount = 0;
-					int startCount = 0;
-					
-					for (Iterator iter = allElements.iterator(); iter.hasNext();) {
-						Object obj = iter.next();
-						obj = TngUtil.unwrap(obj);
-						if (obj instanceof TaskDescriptor
-								&& TngUtil.contains(taskDescriptors, obj)) {
-							TaskDescriptor taskDescriptor = (TaskDescriptor) obj;
-							
-							if(startCount < rowIndex * GraphicalDataHelper.getTasksPerRow()){
-								startCount++;
-							} else {
-
-								if (!selectedDescriptors
-										.contains(taskDescriptor)) {
-									selectedDescriptors.add(taskDescriptor);
-									Node node = GraphicalDataHelper.findNode(
-											this, taskDescriptor,
-											TaskNode.class);
-									if (node == null) {
-//										node = createTaskNode(taskDescriptor,
-//												index, allElements);
-										node = createTaskNode(taskDescriptor);
-										TaskNodeImpl tn = (TaskNodeImpl) node;
-										if (autoLayout || tn.doGetIndex() == -1) {
-											tn.doSetIndex(index);
-//											index++;
-										}
-										//return node;
-									}
-									else {
-										// this will make sure that link between the node and linked element is established
-										//
-										node.setObject(taskDescriptor);
-									}
-									((NamedNodeImpl) node).setItemProvider(allElements);
-
-									if (rowTasksCount < GraphicalDataHelper
-											.getTasksPerRow()) {
-										taskNodes.add(node);
-										if(node instanceof TaskNode){
-											((TaskNode)node).setIndex(index);
-											index++;
-										}
-										rowTasksCount++;
-									} else {
-										break;
-									}
-								}
-							}
-						}
-					}
-					// Sort the taskNode based on their index if autolayout is
-					// false
-					if (!autoLayout) {
-						Collections.sort(taskNodes, comparator);
-					}
-				} else {
-					List oldTaskDescriptors = new ArrayList();
-					Diagram umaDiagram = getUMADiagram();
-					if(umaDiagram != null) {
-						// Lame way of doing this, to fix a defect of 1.0 to 1.0.1 migration				  
-						List graphNodes = umaDiagram.getContained();
-						for (Iterator iter = graphNodes.iterator(); iter.hasNext();) {
-							GraphNode element = (GraphNode) iter.next();
-							Object bridge = element.getSemanticModel();
-							if(bridge instanceof UMASemanticModelBridge){
-								Object taskObject = ((UMASemanticModelBridge)bridge).getElement();
-								List list = element.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-								Property property = GraphicalDataHelper.getPropertyByKey(list,
-										GraphicalDataHelper.PROP_WORK_PRODUCT_COMPOSITE_TYPE);
-								if (taskDescriptors.contains(taskObject) && property == null) {
-									oldTaskDescriptors.add(taskObject);
-								}
-							}
-						}
-					}
-					else {
-						for (Iterator iter = getNodes().iterator(); iter
-								.hasNext();) {
-							Node node = (Node) iter.next();
-							if(node.getLinkedElement() instanceof TaskDescriptor) {
-								oldTaskDescriptors.add(node.getLinkedElement());
-							}
-						}
-					}
-					for (Iterator iter = oldTaskDescriptors.iterator(); iter.hasNext();) {
-						TaskDescriptor taskDescriptor = (TaskDescriptor) iter.next();
-
-						// eliminate descriptor that is duplicate, suppressed or filtered out
-						//
-						if(!selectedDescriptors.contains(taskDescriptor)
-								&& contains(allElements, taskDescriptor) // make sure that task descriptor is of the owning activity
-						) {
-							selectedDescriptors.add(taskDescriptor);					
-							Node node = GraphicalDataHelper.findNode(getDiagram(),
-									taskDescriptor, TaskNode.class);
-							if (node == null) {
-								node = createTaskNode(taskDescriptor);
-								((NamedNodeImpl) node).setItemProvider(allElements);
-							}
-							taskNodes.add(node);
-						}
-					}
-				}
-			}
-			if(!taskNodes.isEmpty()) {
-				// add role node
-				//
-				NamedNodeImpl namedNode = ((NamedNodeImpl) createRoleNode(roleDescriptor));
-				namedNode.visible = true;
-				namedNode.setItemProvider(allElements);
-				getNodes().add(namedNode);		
-				taskNodes.add(namedNode);
-			}
-			selectNodes(taskNodes);
-		}
-		
-	}
-	
-//	public Node createTaskNode(TaskDescriptor taskDescriptor, int index, Collection allElements) {
-//		Node node = ModelFactory.eINSTANCE.createTaskNode();
-//		node.setDiagram(getDiagram());
-//		node.setObject(taskDescriptor);
-//		((NamedNodeImpl) node).setItemProvider(allElements);
-//		if (GraphicalDataHelper.findProperty(node.getGraphNode(),
-//				GraphicalDataHelper.PROP_INDEX) == null
-//				|| GraphicalDataHelper
-//						.isAutoLayout((ActivityDetailDiagram) getDiagram())) {
-//			GraphicalDataHelper.createProperty(node.getGraphNode(),
-//					GraphicalDataHelper.PROP_INDEX, new Integer(index)
-//							.toString());
-//			index++;
-//		}
-//		return node;
-//	}
-	
-} // RoleTaskCompositeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/TaskNodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/TaskNodeImpl.java
deleted file mode 100644
index c5a21e1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/TaskNodeImpl.java
+++ /dev/null
@@ -1,389 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Task Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.TaskNodeImpl#getIndex <em>Index</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskNodeImpl extends NamedNodeImpl implements TaskNode {
-	/**
-	 * The default value of the '{@link #getIndex() <em>Index</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIndex()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int INDEX_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getIndex() <em>Index</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIndex()
-	 * @generated
-	 * @ordered
-	 */
-	protected int index = INDEX_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected TaskNodeImpl() {
-		super();
-
-		methodElementAdapter = new TaskDescriptorAdapter();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.TASK_NODE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getIndex() {
-		return index;
-	}
-	
-	public int doGetIndex() {
-		if(isGraphicalDataRequired()) {
-			Property prop = GraphicalDataHelper.getProperty(this, GraphicalDataHelper.PROP_INDEX);
-			if(prop != null) {
-				try {
-					int i = Integer.parseInt(prop.getValue());
-					return i;
-				}
-				catch(NumberFormatException e) {
-					//
-				}
-			}
-		}
-		return getIndex();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIndex(int newIndex) {
-		int oldIndex = index;
-		index = newIndex;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TASK_NODE__INDEX, oldIndex, index));
-	}
-	
-	public void doSetIndex(int newIndex) {
-		if(isGraphicalDataRequired()) {
-			GraphicalDataHelper.createProperty(getGraphNode(), 
-					GraphicalDataHelper.PROP_INDEX, String.valueOf(newIndex));
-		}
-		else {
-			setIndex(newIndex);
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.TASK_NODE__INDEX:
-				return new Integer(getIndex());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.TASK_NODE__INDEX:
-				setIndex(((Integer)newValue).intValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.TASK_NODE__INDEX:
-				setIndex(INDEX_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.TASK_NODE__INDEX:
-				return index != INDEX_EDEFAULT;
-		}
-		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(" (index: "); //$NON-NLS-1$
-		result.append(index);
-		result.append(')');
-		return result.toString();
-	}
-
-	private class TaskDescriptorAdapter extends MethodElementAdapter {
-		
-		@Override
-		protected void handleNotification(Notification msg) {
-			boolean handled = false;
-			switch (msg.getFeatureID(TaskDescriptor.class)) {
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				handled = true;
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				handled = true;
-				break;				
-			}
-			if(handled && (msg.getEventType() == Notification.ADD || msg.getEventType() == Notification.ADD_MANY)) { 
-				ActivityDetailDiagramImpl diagram = (ActivityDetailDiagramImpl) getDiagram();
-				if(diagram != null) {
-//					diagram.setObject(diagram.getObject());
-					Collection inputOuputNodes = new ArrayList();
-					diagram.createTaskInputOutputNodes((TaskDescriptor) msg.getNotifier(), inputOuputNodes);
-					if(!inputOuputNodes.isEmpty()) {
-						diagram.getNodes().addAll(inputOuputNodes);
-						diagram.populateLinks(inputOuputNodes, false);
-					}
-				}
-				return;
-			}
-
-//			MethodElement obj;
-//			switch (msg.getFeatureID(TaskDescriptor.class)) {
-//			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-//			case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-//			case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-//				switch (msg.getEventType()) {
-//				case Notification.ADD:
-//					obj = (MethodElement) msg.getNewValue();
-//					addIncomingConnection(obj);
-//					return;
-//				case Notification.REMOVE:
-//					obj = (MethodElement) msg.getOldValue();
-//					removeIncomingConnection(obj);
-//					return;
-//				case Notification.ADD_MANY:
-//					Collection collection = (Collection) msg.getNewValue();
-//					for (Iterator iter = collection.iterator(); iter
-//							.hasNext();) {
-//						obj = (MethodElement) iter.next();
-//						addIncomingConnection(obj);
-//					}
-//					return;
-//				case Notification.REMOVE_MANY:
-//					collection = (Collection) msg.getOldValue();
-//					for (Iterator iter = collection.iterator(); iter
-//							.hasNext();) {
-//						obj = (MethodElement) iter.next();
-//						removeIncomingConnection(obj);
-//					}
-//					return;
-//				}
-//				break;
-//			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-//				switch (msg.getEventType()) {
-//				case Notification.ADD:
-//					obj = (MethodElement) msg.getNewValue();
-//					addOutgoingConnection(obj);
-//					return;
-//				case Notification.REMOVE:
-//					obj = (MethodElement) msg.getOldValue();
-//					removeOutgoingConnection(obj);
-//					return;
-//				case Notification.ADD_MANY:
-//					Collection collection = (Collection) msg.getNewValue();
-//					for (Iterator iter = collection.iterator(); iter
-//							.hasNext();) {
-//						obj = (MethodElement) iter.next();
-//						addOutgoingConnection(obj);
-//					}
-//					return;
-//				case Notification.REMOVE_MANY:
-//					collection = (Collection) msg.getOldValue();
-//					for (Iterator iter = collection.iterator(); iter
-//							.hasNext();) {
-//						obj = (MethodElement) iter.next();
-//						removeOutgoingConnection(obj);
-//					}
-//					return;
-//				}
-//				break;
-//			}
-
-			super.handleNotification(msg);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.diagram.model.util.INodeChangeListener#getNode()
-		 */
-		public Node getNode() {
-			return TaskNodeImpl.this;
-		}
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.epf.diagram.model.impl.NamedNodeImpl#setObject(java.lang.Object)
-	// */
-	// public void setObject(Object newObject) {
-	// Object oldObject = object;
-	// object = newObject;
-	// if (eNotificationRequired())
-	// eNotify(new ENotificationImpl(this, Notification.SET,
-	// ModelPackage.LINKED_OBJECT__OBJECT, oldObject, object));
-	//
-	// if(newObject == null) return;
-	//		
-	// MethodElement element = (MethodElement) newObject;
-	// if(element != null && getMethodElementAdapterType() != null) {
-	// // remove old methodElementAdapter
-	// //
-	// Object oldAdapter = UmaUtil.getAdapter(element,
-	// getMethodElementAdapterType());
-	// if(oldAdapter != null) {
-	// element.eAdapters().remove(oldAdapter);
-	// }
-	// }
-	// graphNode =
-	// GraphicalDataManager.getInstance().getGraphNode(getUMADiagram(),
-	// element);
-	//        
-	// // System.out.println("NodeImpl.setObject(): element: '" +
-	// element.getName() + "', graphNode: " + graphNode);
-	//        
-	// // populate data
-	// //
-	// setHeight(graphNode.getSize().getHeight().intValue());
-	// setLocation(GraphicalDataHelper.toPoint(graphNode.getPosition()));
-	// setWidth(graphNode.getSize().getWidth().intValue());
-	//        
-	// // add methodElementAdapter
-	// //
-	// if(methodElementAdapter != null) {
-	// element.eAdapters().add(methodElementAdapter);
-	// }
-	//        
-	// this.eAdapters().add(createNodeAdapter());
-	//
-	// setName(element.getName());
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#addToUMA(org.eclipse.epf.diagram.model.Link)
-	 */
-	protected boolean addToUMA(Link link) {
-		if (!super.addToUMA(link))
-			return false;
-
-		//TaskDescriptor taskDesc = (TaskDescriptor) getObject();
-		NodeImpl nodeImpl = (NodeImpl) link.getSource();
-		boolean notify = notificationEnabled;
-		boolean notifySource = nodeImpl.notificationEnabled;
-		try {
-			notificationEnabled = false;
-			nodeImpl.notificationEnabled = false;
-			// taskDesc.getMandatoryInput().add(link.getSource().getObject());
-		} finally {
-			notificationEnabled = notify;
-			nodeImpl.notificationEnabled = notifySource;
-		}
-
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#removeFromUMA(org.eclipse.epf.diagram.model.Link,
-	 *      org.eclipse.epf.diagram.model.Node, org.eclipse.epf.diagram.model.Node)
-	 */
-	protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) {
-		TaskDescriptor taskDesc = (TaskDescriptor) getObject();
-		taskDesc.getOutput().remove(link.getTarget().getObject());
-
-		super.removeFromUMA(link, oldSource, oldTarget);
-	}
-
-} // TaskNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/TypedNodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/TypedNodeImpl.java
deleted file mode 100644
index b9f9fa3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/TypedNodeImpl.java
+++ /dev/null
@@ -1,383 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Point;
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Typed Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.TypedNodeImpl#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TypedNodeImpl extends NodeImpl implements TypedNode {
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int TYPE_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected int type = TYPE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TypedNodeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.TYPED_NODE;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(int newType) {
-		int oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TYPED_NODE__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.TYPED_NODE__TYPE:
-				return new Integer(getType());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.TYPED_NODE__TYPE:
-				setType(((Integer)newValue).intValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.TYPED_NODE__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.TYPED_NODE__TYPE:
-				return type != TYPE_EDEFAULT;
-		}
-		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(" (type: "); //$NON-NLS-1$
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-	protected void basicSetObject(Object newObject) {
-		//populate data from linked GraphNode
-		// 
-		graphNode = (GraphNode) newObject;
-		setWidth(graphNode.getSize().getWidth().intValue());
-		setHeight(graphNode.getSize().getHeight().intValue());
-		setLocation(GraphicalDataHelper.toPoint(graphNode.getPosition()));
-//		 this.eAdapters().add(new AdapterImpl() {
-		// /* (non-Javadoc)
-		// * @see
-		// org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		// */
-		// public void notifyChanged(Notification msg) {
-		// GraphNode graphNode = (GraphNode) getObject();
-		// switch(msg.getFeatureID(TypedNode.class)) {
-		// case ModelPackage.TYPED_NODE__WIDTH:
-		// graphNode.getSize().setWidth(new Double(msg.getNewIntValue()));
-		// return;
-		//                    
-		// case ModelPackage.TYPED_NODE__HEIGHT:
-		// graphNode.getSize().setHeight(new Double(msg.getNewIntValue()));
-		// return;
-		//                        
-		// case ModelPackage.TYPED_NODE__LOCATION:
-		// Point p = (Point) msg.getNewValue();
-		// System.out.println("TypedNodeImpl$.notifyChanged(): new location: " +
-		// p + ". " + TypedNodeImpl.this);
-		// graphNode.getPosition().setX(new Double(p.x));
-		// graphNode.getPosition().setY(new Double(p.y));
-		// return;
-		//                    
-		// case ModelPackage.TYPED_NODE__INCOMING_CONNECTIONS:
-		// Link link;
-		// switch(msg.getEventType()) {
-		// case Notification.ADD:
-		// addToUMA((Link) msg.getNewValue());
-		// break;
-		// case Notification.ADD_MANY:
-		// for (Iterator iter = ((Collection)msg.getNewValue()).iterator(); iter
-		// .hasNext();) {
-		// addToUMA((Link) iter.next());
-		// }
-		// break;
-		// case Notification.REMOVE:
-		// link = (Link) msg.getOldValue();
-		// if(link.getSource() != null) {
-		// ((NodeImpl)link.getSource()).removeFromUMA(link, link.getSource(),
-		// (Node)msg.getNotifier());
-		// }
-		// break;
-		// case Notification.REMOVE_MANY:
-		// for (Iterator iter = ((Collection)msg.getOldValue()).iterator(); iter
-		// .hasNext();) {
-		// link = (Link) iter.next();
-		// if(link.getSource() != null) {
-		// ((NodeImpl)link.getSource()).removeFromUMA(link, link.getSource(),
-		// (Node)msg.getNotifier());
-		// }
-		// }
-		// break;
-		// }
-		// return;
-		//
-		// case ModelPackage.TYPED_NODE__OUTGOING_CONNECTIONS:
-		// switch(msg.getEventType()) {
-		// case Notification.ADD:
-		// addToUMA((Link) msg.getNewValue());
-		// break;
-		// case Notification.ADD_MANY:
-		// for (Iterator iter = ((Collection)msg.getNewValue()).iterator(); iter
-		// .hasNext();) {
-		// addToUMA((Link) iter.next());
-		// }
-		// break;
-		//
-		// case Notification.REMOVE:
-		// link = (Link) msg.getOldValue();
-		// if(link.getTarget() != null) {
-		// removeFromUMA(link, (Node)msg.getNotifier(), link.getTarget());
-		// }
-		// break;
-		// case Notification.REMOVE_MANY:
-		// for (Iterator iter = ((Collection)msg.getOldValue()).iterator(); iter
-		// .hasNext();) {
-		// link = (Link) iter.next();
-		// if(link.getTarget() != null) {
-		// removeFromUMA(link, (Node)msg.getNotifier(), link.getTarget());
-		// }
-		// }
-		// break;
-		// }
-		// return;
-		// }
-		// }
-		//
-		// });
-		eAdapters().add(new NodeAdapter());
-	}
-	
-	public Class getMethodElementAdapterType() {
-		return null;
-	}
-
-	protected boolean addToUMA(Link link) {
-		if (!super.addToUMA(link))
-			return false;
-
-		if (link.getSource() instanceof WorkBreakdownElementNode) {
-			if (link.getTarget() instanceof TypedNode
-					&& ((TypedNode) link.getTarget()).getType() == TypedNode.SYNCH_BAR) {
-				Collection targetActNodes = new ArrayList();
-				GraphicalDataHelper.getSyncBarTargetNodes((TypedNode) link
-						.getTarget(), targetActNodes);
-				for (Iterator iter = targetActNodes.iterator(); iter.hasNext();) {
-					NamedNodeImpl node = ((NamedNodeImpl) iter.next());
-					if (UmaUtil.findWorkOrder((WorkBreakdownElement) node
-							.getObject(), (WorkBreakdownElement) link
-							.getSource().getObject()) == null) {
-						addDefaultWorkOrder(node, (WorkBreakdownElement) link
-								.getSource().getObject());
-					}
-				}
-			}
-		} else if (link.getSource() instanceof TypedNode) {
-			// Predecessor should be created only in case of
-			// Syncronization Bar, not for DecisionPoint.
-			if (((TypedNode) link.getSource()).getType() == TypedNode.SYNCH_BAR) {
-				Collection srcActNodes = new ArrayList();
-				GraphicalDataHelper.getSyncBarSourceNodes((TypedNode) link
-						.getSource(), srcActNodes);
-				Collection targetActNodes = new ArrayList();
-				GraphicalDataHelper.getSyncBarTargetNodes((TypedNode) link
-						.getTarget(), targetActNodes);
-
-				for (Iterator iter = targetActNodes.iterator(); iter.hasNext();) {
-					NamedNodeImpl node = ((NamedNodeImpl) iter.next());
-					for (Iterator iterator = srcActNodes.iterator(); iterator
-							.hasNext();) {
-						WorkBreakdownElement pred = (WorkBreakdownElement) ((Node) iterator
-								.next()).getObject();
-						if (UmaUtil.findWorkOrder((WorkBreakdownElement) node
-								.getObject(), pred) == null) {
-							addDefaultWorkOrder(node, pred);
-						}
-					}
-				}
-			}
-		}
-
-		return true;
-	}
-
-	protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) {
-		TypedNode typedNode = (TypedNode) oldSource;
-		Collection srcActNodes = GraphicalDataHelper.getSourceNodes(typedNode,
-				WorkBreakdownElementNode.class);
-
-		if (oldTarget instanceof WorkBreakdownElementNode) {
-			for (Iterator iterator = srcActNodes.iterator(); iterator.hasNext();) {
-				// Object pred = ((Node) iterator.next()).getObject();
-				// GraphicalDataHelper.removeWorkOrder((NamedNodeImpl)
-				// oldTarget, pred);
-				Node node = (Node) iterator.next();
-				if (GraphicalDataHelper
-						.canRemoveAllPreds(link, node, oldTarget)) {
-					while (UmaUtil.findWorkOrder(
-							(WorkBreakdownElement) oldTarget.getObject(),
-							(WorkBreakdownElement) node.getObject()) != null) {
-						UmaUtil.removeWorkOrder(
-								(WorkBreakdownElement) oldTarget.getObject(),
-								(WorkBreakdownElement) node.getObject());
-					}
-				}
-			}
-		} else if (oldTarget instanceof TypedNode) {
-			Collection targetActNodes = GraphicalDataHelper.getTargetNodes(
-					(TypedNode) oldTarget, WorkBreakdownElementNode.class);
-
-			// remove the work orders of target activities that have the
-			// predecessor in srcActNodes
-			//
-			for (Iterator iter = targetActNodes.iterator(); iter.hasNext();) {
-				NamedNodeImpl node = ((NamedNodeImpl) iter.next());
-				for (Iterator iterator = srcActNodes.iterator(); iterator
-						.hasNext();) {
-					// Object pred = ((Node) iterator.next()).getObject();
-					// GraphicalDataHelper.removeWorkOrder(node, pred);
-					Node prednode = (Node) iterator.next();
-					if (GraphicalDataHelper.canRemoveAllPreds(link, prednode,
-							node)) {
-						while (UmaUtil.findWorkOrder(
-								(WorkBreakdownElement) node.getObject(),
-								(WorkBreakdownElement) prednode.getObject()) != null) {
-							UmaUtil
-									.removeWorkOrder(
-											(WorkBreakdownElement) node
-													.getObject(),
-											(WorkBreakdownElement) prednode
-													.getObject());
-						}
-					}
-				}
-			}
-		}
-
-		super.removeFromUMA(link, oldSource, oldTarget);
-	}
-} // TypedNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkBreakdownElementNodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkBreakdownElementNodeImpl.java
deleted file mode 100644
index f298080..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkBreakdownElementNodeImpl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Point;
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Work Breakdown Element Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class WorkBreakdownElementNodeImpl extends NamedNodeImpl implements
-		WorkBreakdownElementNode {
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected WorkBreakdownElementNodeImpl() {
-		super();
-
-		methodElementAdapter = new WorkBreakdownElementAdapter();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.WORK_BREAKDOWN_ELEMENT_NODE;
-	}
-
-	private class WorkBreakdownElementAdapter extends MethodElementAdapter {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			if (!notificationEnabled)
-				return;
-			notificationEnabled = false;
-			try {
-				WorkOrder obj;
-				switch (msg.getFeatureID(WorkBreakdownElement.class)) {
-				case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR:
-					switch (msg.getEventType()) {
-					case Notification.ADD:
-						obj = (WorkOrder) msg.getNewValue();
-						addIncomingConnection(obj.getPred());
-						return;
-					case Notification.REMOVE:
-						obj = (WorkOrder) msg.getOldValue();
-						removeIncomingConnection(obj.getPred());
-						return;
-					case Notification.ADD_MANY:
-						Collection collection = (Collection) msg.getNewValue();
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							obj = (WorkOrder) iter.next();
-							addIncomingConnection(obj.getPred());
-						}
-						return;
-					case Notification.REMOVE_MANY:
-						collection = (Collection) msg.getOldValue();
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							obj = (WorkOrder) iter.next();
-							removeIncomingConnection(obj.getPred());
-						}
-						return;
-					}
-					break;
-
-				}
-			} finally {
-				notificationEnabled = true;
-			}
-
-			super.notifyChanged(msg);
-		}
-
-	}
-
-	protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) {
-		if (oldTarget instanceof WorkBreakdownElementNode) {
-			// this is a direct link
-			// remove WorkOrder
-			//
-			// GraphEdge edge = (GraphEdge) link.getObject();
-			// WorkOrder order = (WorkOrder)
-			// ((UMASemanticModelBridge)edge.getSemanticModel()).getElement();
-			// WorkBreakdownElement be = UmaUtil.getOwner(order);
-			// if(be != null) {
-			NamedNodeImpl target = (NamedNodeImpl) oldTarget;
-			boolean notify = target.notificationEnabled;
-			try {
-				target.notificationEnabled = false;
-				// be.getLinkToPredecessor().remove(order);
-				if (GraphicalDataHelper.canRemoveAllPreds(link, oldSource,
-						oldTarget)) {
-					while (UmaUtil.findWorkOrder((WorkBreakdownElement) target
-							.getObject(), oldSource.getObject()) != null) {
-						UmaUtil.removeWorkOrder((WorkBreakdownElement) target
-								.getObject(), oldSource.getObject());
-					}
-				}
-			} finally {
-				target.notificationEnabled = notify;
-			}
-			// }
-		} else if (oldTarget instanceof TypedNode) {
-			// get all the WorkBreakdownElementNodes that this TypedNode are
-			// coming to and
-			// remove the WorkOrders with this WorkBreakdownElementNode's
-			// activity as predecessor from them
-			//
-			Collection actNodes = GraphicalDataHelper.getTargetNodes(
-					(TypedNode) oldTarget, WorkBreakdownElementNode.class);
-			for (Iterator iter = actNodes.iterator(); iter.hasNext();) {
-				NamedNodeImpl node = (NamedNodeImpl) iter.next();
-				WorkBreakdownElement e = (WorkBreakdownElement) node
-						.getObject();
-				boolean notify = node.notificationEnabled;
-				try {
-					node.notificationEnabled = false;
-					if (GraphicalDataHelper.canRemoveAllPreds(link, oldSource,
-							node)) {
-						while (UmaUtil.findWorkOrder(e, oldSource.getObject()) != null) {
-							UmaUtil.removeWorkOrder(e, oldSource.getObject());
-						}
-					}
-				} finally {
-					node.notificationEnabled = notify;
-				}
-			}
-		}
-		// remove graphical data from UMA model
-		//
-		super.removeFromUMA(link, oldSource, oldTarget);
-	}
-
-	/**
-	 * @param link
-	 */
-	protected boolean addToUMA(Link link) {
-		if (!super.addToUMA(link))
-			return false;
-
-		Node src = link.getSource();
-		if (src instanceof WorkBreakdownElementNode) {
-			// this is a direct link
-			// add new WorkOrder object to UMA
-			//
-			WorkOrder order = null;
-			WorkBreakdownElement succ = (WorkBreakdownElement) link.getTarget()
-					.getObject();
-			WorkBreakdownElement pred = (WorkBreakdownElement) src.getObject();
-			if (UmaUtil.findWorkOrder(succ, pred) == null) {
-				NodeImpl sourceNode = ((NodeImpl) src);
-				boolean sourceNotify = sourceNode.notificationEnabled;
-				try {
-					sourceNode.notificationEnabled = false;
-					//UmaUtil.createDefaultWorkOrder(succ, pred);
-					//Create a workorder and disable notification flag.
-					addDefaultWorkOrder((NamedNodeImpl)link.getTarget(), pred);
-				} finally {
-					sourceNode.notificationEnabled = sourceNotify;
-				}
-			}
-
-			// set the WorkOrder as the element of the SemanticModel of the
-			// link's GraphEdge
-			//
-			GraphicalDataHelper.setSemanticModel(link, order);
-		} else if (src instanceof TypedNode) {
-			// get all WorkBreakdownElementNodes that are comming to this
-			// TypedNode, both directly and indirectly
-			// and create work orders with their activity as predecessor
-			//
-
-			// Predecessor should be created only in case of
-			// Syncronization Bar, not for DecisionPoint.
-			if (((TypedNode) src).getType() == TypedNode.SYNCH_BAR) {
-				
-				Collection actNodes = new ArrayList();
-				// Get the collection incoming connection of syncbar 
-				// excluding decisionpoint incoming connection
-				GraphicalDataHelper.getSyncBarSourceNodes((TypedNode)src, actNodes);
-				WorkBreakdownElement succ = (WorkBreakdownElement) link
-						.getTarget().getObject();
-				for (Iterator iter = actNodes.iterator(); iter.hasNext();) {
-					Node node = (Node) iter.next();
-					WorkBreakdownElement pred = (WorkBreakdownElement) node
-							.getObject();
-					if (UmaUtil.findWorkOrder(succ, pred) == null) {
-						NodeImpl sourceNode = ((NodeImpl) node);
-						boolean sourceNotify = sourceNode.notificationEnabled;
-						try {
-							sourceNode.notificationEnabled = false;
-							//UmaUtil.createDefaultWorkOrder(succ, pred);
-							// Create a workorder and disable notification flag.
-							addDefaultWorkOrder((NamedNodeImpl)link.getTarget(),pred);
-						} finally {
-							sourceNode.notificationEnabled = sourceNotify;
-						}
-					}
-				}
-			}
-		}
-
-		return true;
-	}
-
-	protected Link addIncomingConnection(MethodElement source) {
-		Link link = super.addIncomingConnection(source);
-		if (link == null)
-			return link;
-
-		WorkOrder workOrder = UmaUtil.findWorkOrder(
-				(WorkBreakdownElement) getObject(), source);
-		GraphicalDataHelper.setSemanticModel(link, workOrder);
-
-		return link;
-	}
-
-	protected Link addOutgoingConnection(MethodElement target) {
-		Link link = super.addOutgoingConnection(target);
-
-		WorkOrder workOrder = UmaUtil.findWorkOrder(
-				(WorkBreakdownElement) target, getObject());
-		GraphicalDataHelper.setSemanticModel(link, workOrder);
-
-		return link;
-	}
-
-} // WorkBreakdownElementNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductCompositeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductCompositeImpl.java
deleted file mode 100644
index 3740974..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductCompositeImpl.java
+++ /dev/null
@@ -1,553 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Work Product Composite</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.WorkProductCompositeImpl#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductCompositeImpl extends NodeContainerImpl implements
-		WorkProductComposite {
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int TYPE_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected int type = TYPE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductCompositeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.WORK_PRODUCT_COMPOSITE;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(int newType) {
-		int oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.WORK_PRODUCT_COMPOSITE__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_COMPOSITE__TYPE:
-				return new Integer(getType());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_COMPOSITE__TYPE:
-				setType(((Integer)newValue).intValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_COMPOSITE__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_COMPOSITE__TYPE:
-				return type != TYPE_EDEFAULT;
-		}
-		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(" (type: "); //$NON-NLS-1$
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-	private class TaskDescriptorAdapter extends TransactionalNodeLink {
-		protected void handleNotification(Notification msg) {
-			doHandleNotification(msg);
-			if(WorkProductCompositeImpl.this.getNodes().isEmpty()) {				
-				// refresh diagram
-				//
-				org.eclipse.epf.diagram.model.Diagram diagram = getDiagram();
-				if(diagram != null) {
-					diagram.getNodes().remove(WorkProductCompositeImpl.this);
-					diagram.setObject(diagram.getObject());
-				}				
-			}
-		}
-		
-		private void doHandleNotification(Notification msg) {
-			switch (msg.getFeatureID(TaskDescriptor.class)) {
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					Object obj = msg.getNewValue();
-					if (obj != null && type == WorkProductComposite.OUTPUTS) {
-						addNode(obj);
-					}
-					return;
-				case Notification.REMOVE:
-					obj = msg.getOldValue();
-					if (obj != null && type == WorkProductComposite.OUTPUTS) {
-						removeNode(obj);
-					}
-					return;
-				}
-				break;
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					Object obj = msg.getNewValue();
-					if (obj != null && type == WorkProductComposite.INPUTS) {
-						addNode(obj);
-					}
-					return;
-				case Notification.REMOVE:
-					obj = msg.getOldValue();
-					if (obj != null && type == WorkProductComposite.INPUTS) {
-						removeNode(obj);
-					}
-					return;
-				}
-				break;
-			}
-		}
-		
-	}
-
-	private IFilter getFilter() {
-		DiagramImpl diagram = (DiagramImpl) getDiagram();
-		if (diagram.filter == null) {
-			ConfigurableComposedAdapterFactory adapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.getPBS_ComposedAdapterFactory();
-			return adapterFactory.getFilter();
-		} else {
-			return diagram.filter;
-		}
-	}
-	public void setObject(Object newObject) {
-		
-		super.setObject(newObject);
-		populateNodes(newObject);
-		
-	}
-
-	protected void basicSetObject(Object newObject) {
-
-		super.basicSetObject(newObject);
-		
-		if(isGraphicalDataRequired()) {
-			// Set the Type information for workproduct composite.
-			if (type == TYPE_EDEFAULT) {
-				List list = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-				Property property = GraphicalDataHelper.getPropertyByKey(list,
-						GraphicalDataHelper.PROP_WORK_PRODUCT_COMPOSITE_TYPE);
-				if (property != null) {
-					property.setValue(property.getValue());
-					list.add(property);
-				}
-			} else {
-				List list = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-				Property property = GraphicalDataHelper.getPropertyByKey(list,
-						GraphicalDataHelper.PROP_WORK_PRODUCT_COMPOSITE_TYPE);
-				if (property != null) {
-					property.setValue(new Integer(getType()).toString());
-					list.add(property);
-				}
-			}
-		}
-	}
-	
-	private WorkProductDescriptorNode createWorkProductDescriptorNode(WorkProductDescriptor wpd) {
-		WorkProductDescriptorNode wpdNode = null;
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if(node instanceof WorkProductDescriptorNode && node.getLinkedElement() == wpd) {
-				wpdNode = (WorkProductDescriptorNode) node;
-			}
-		}
-		if(wpdNode == null) {
-			wpdNode = ModelFactory.eINSTANCE.createWorkProductDescriptorNode();
-			wpdNode.setDiagram(getDiagram());
-		}
-		wpdNode.setObject(wpd);
-		return wpdNode;
-	}
-	
-	public void populateNodes(Object newObject){
-		if (newObject instanceof TaskDescriptor) {
-			List wplist = new ArrayList();
-			if (getType() == WorkProductComposite.INPUTS) {
-				if (!((TaskDescriptor) newObject).getMandatoryInput().isEmpty())
-					wplist.addAll(((TaskDescriptor) newObject)
-							.getMandatoryInput());
-			} else {
-				if (!((TaskDescriptor) newObject).getOutput().isEmpty())
-					wplist.addAll(((TaskDescriptor) newObject).getOutput());
-			}
-
-			IFilter filter = getFilter();
-			Collection allElements = ((ActivityDetailDiagramImpl)getDiagram())
-										.getAllBreakdownElements(false);
-			AdapterFactory adapterFactory = getAdapterFactory();
-			
-			ArrayList nodes = new ArrayList();
-			Suppression suppression = getDiagram().getSuppression();
-//			Suppression suppression =  new Suppression(TngUtil.getOwningProcess(getObject()));
-			for (Iterator iter = wplist.iterator(); iter.hasNext();) {
-				WorkProductDescriptor wpDescriptor = (WorkProductDescriptor) iter
-						.next();			
-				if (filter == null || filter.accept(wpDescriptor)) {
-					
-					Object wrapper = null;
-//					if(adapterFactory != null){
-//						wrapper = adapterFactory.adapt(wpDescriptor, ITreeItemContentProvider.class);
-//					}
-					for (Iterator iterator = allElements.iterator(); iterator
-							.hasNext();) {
-						Object element = (Object) iterator.next();
-						if(TngUtil.unwrap(element) == wpDescriptor){
-							wrapper = element;
-						}
-					}
-					if(wrapper == null && adapterFactory != null){
-						wrapper = adapterFactory.adapt(wpDescriptor, ITreeItemContentProvider.class);
-					}
-					if(wrapper == null){
-						wrapper = wpDescriptor;
-					}
-					if (!suppression.isSuppressed(wrapper)) {
-						Node node = GraphicalDataHelper.findNode(this,
-								wpDescriptor);
-						if (node == null) {
-							node = createWorkProductDescriptorNode(wpDescriptor);
-						}
-						else {
-							// this will make sure that link between the node and linked element is established
-							//
-							node.setObject(wpDescriptor);
-						}
-						((NamedNodeImpl) node).setItemProvider(allElements);
-						nodes.add(node);
-					}
-				}
-			}
-
-			selectNodes(nodes);
-		}
-	}
-	
-	public void addNode(Collection collection) {
-		Collection nodes = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			WorkProductDescriptor descriptor = (WorkProductDescriptor) iter
-					.next();
-			addNode(nodes, descriptor);
-		}
-
-		getNodes().addAll(nodes);
-	}
-
-	public void removeNode(Object oldValue) {
-		Collection removedNodes = new HashSet();
-		if (oldValue instanceof TaskDescriptor) {
-			Node node = findNode((ActivityDetailDiagram) getDiagram(),
-					getObject());
-			getDiagram().getNodes().remove(node);
-		}
-		for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if (node.getObject() == oldValue) {
-				iter.remove();
-				removedNodes.add(node);
-			}
-		}
-		// pushBackToDiagram(removedNodes);
-	}
-
-	public void addNode(Object descriptor) {
-		addNode(getNodes(), descriptor);
-	}
-
-	private void addNode(Collection nodes, Object descriptor) {
-		
-		if (descriptor instanceof TaskDescriptor) {
-			Node node = findNode((ActivityDetailDiagram) getDiagram(),
-					descriptor);
-			if (node == null) {
-				node = ((ActivityDetailDiagramImpl) getDiagram())
-						.createWorkProductComposite(
-								(TaskDescriptor) descriptor, this.type);
-				getDiagram().getNodes().add(node);
-			}
-		}
-		if(descriptor instanceof WorkProductDescriptor){
-			ActivityDetailDiagramImpl diagram = (ActivityDetailDiagramImpl) getDiagram();
-			Node node = GraphicalDataHelper.findNode(this ,
-					descriptor);
-			if (node == null) {
-				if (descriptor instanceof WorkProductDescriptor){
-					node = diagram.createNode((WorkProductDescriptor) descriptor);
-				}
-				nodes.add(node);
-			}
-		}
-	}
-
-	/**
-	 * @param oldValue
-	 */
-//	private void removeNode(Collection elements) {
-//		Collection nodes = new ArrayList();
-//		for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-//			Node node = (Node) iter.next();
-//			if (elements.contains(node.getObject())) {
-//				nodes.add(node);
-//			}
-//		}
-//		getNodes().removeAll(nodes);
-//		pushBackToDiagram(nodes);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#getMethodElementAdapterType()
-	 */
-	public Class getMethodElementAdapterType() {
-		return TaskDescriptorAdapter.class;
-	}
-
-	public Point getLocation() {
-		if (getType() == WorkProductComposite.INPUTS) {
-			return super.getLocation();
-		}
-		if (getType() == WorkProductComposite.OUTPUTS) {
-			return super.getLocation();
-		} else {
-			return new Point(-1, -1);
-		}
-	}
-
-	public GraphNode getGraphNode(MethodElement methodElement) {
-		if(isGraphicalDataRequired()) {
-			if (getUMADiagram() == null) {
-				// new MethodElement
-				//
-				return createGraphNode(methodElement);
-			}
-			GraphNode node = findGraphNode(getUMADiagram(), methodElement);
-			if (node == null) {
-				node = createGraphNode(methodElement);
-				// createGraphConnectors(node, getUMADiagram());
-				getUMADiagram().getContained().add(node);
-			}
-			return node;
-		}
-		return null;
-	}
-
-	public GraphNode findGraphNode(Diagram diagram, Object methodElement) {
-		for (Iterator iter = diagram.getContained().iterator(); iter.hasNext();) {
-			GraphNode element = (GraphNode) iter.next();
-			if (element.getSemanticModel() instanceof UMASemanticModelBridge
-					&& methodElement == ((UMASemanticModelBridge) element
-							.getSemanticModel()).getElement()) {
-
-				List list = element.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-				Property property = GraphicalDataHelper.getPropertyByKey(list,
-						GraphicalDataHelper.PROP_WORK_PRODUCT_COMPOSITE_TYPE);
-				if (property != null) {
-					String typeString = property.getValue();
-					if (typeString != null) {
-						if (getType() == new Integer(typeString).intValue())
-							return element;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	private GraphNode createGraphNode(MethodElement element) {
-		GraphNode graphNode = UmaFactory.eINSTANCE.createGraphNode();
-		UMASemanticModelBridge modelBridge = UmaFactory.eINSTANCE
-				.createUMASemanticModelBridge();
-		modelBridge.setElement(element);
-		graphNode.setSemanticModel(modelBridge);
-		org.eclipse.epf.uma.Point point = UmaFactory.eINSTANCE.createPoint();
-		point.setX(new Double(-1));
-		point.setY(new Double(-1));
-		graphNode.setPosition(point);
-		org.eclipse.epf.uma.Dimension dim = UmaFactory.eINSTANCE.createDimension();
-		dim.setWidth(new Double(-1));
-		dim.setHeight(new Double(-1));
-		graphNode.setSize(dim);
-
-		// For setting type of WorkProductComposite
-		Property property = UmaFactory.eINSTANCE.createProperty();
-		property.setKey(GraphicalDataHelper.PROP_WORK_PRODUCT_COMPOSITE_TYPE);
-		property.setValue(new Integer(getType()).toString()); //$NON-NLS-1$
-		List list = new ArrayList();
-		list.add(property);
-		graphNode.set(UmaPackage.GRAPH_NODE__PROPERTY, list);
-		return graphNode;
-	}
-
-	public Node findNode(ActivityDetailDiagram diagram, Object object) {
-		for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (object == element.getObject()
-					&& element instanceof WorkProductComposite) {
-				if (((WorkProductComposite) element).getType() == this.type)
-					return element;
-			}
-		}
-		return null;
-	}
-	
-	@Override
-	protected Object getMethodElementAdapter() {
-		if(methodElementAdapter == null) {
-			methodElementAdapter = new TaskDescriptorAdapter();
-		}
-		return methodElementAdapter;
-	}
-	
-	private AdapterFactory getAdapterFactory(){
-		AdapterFactory adapterFactory = null;
-		IFilter filter = getFilter();
-		if (filter == null) {
-			adapterFactory = TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory();
-		} else if (filter instanceof IAdapterFactoryFilter) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) ((IAdapterFactoryFilter) filter)
-					.getWPBSAdapterFactory();
-		}
-		return adapterFactory;
-	}
-} // WorkProductCompositeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductDependencyDiagramImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductDependencyDiagramImpl.java
deleted file mode 100644
index e20473c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductDependencyDiagramImpl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.diagram.model.util.IWPDDiagramChangeListener;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Work Product Dependency Diagram</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class WorkProductDependencyDiagramImpl extends DiagramImpl implements
-		WorkProductDependencyDiagram {
-	private class WPDDiagramChangeListener extends ActivityAdapter implements
-			IWPDDiagramChangeListener {
-
-	};
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected WorkProductDependencyDiagramImpl() {
-		super();
-
-		diagramChangeListener = new WPDDiagramChangeListener();
-	}
-
-	protected Class getDiagramChangeListenerType() {
-		return IWPDDiagramChangeListener.class;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.WORK_PRODUCT_DEPENDENCY_DIAGRAM;
-	}
-
-	private static final AdapterFactory[] DEFAULT_ADAPTER_FACTORIES = {			
-		TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory() 
-	}; 
-
-	//
-	// Start custom code
-	//
-	public Collection getChildren() {
-		ITreeItemContentProvider adapter = null;
-		AdapterFactory adapterFactory = null;
-		if (wrapper != null) {
-			//https://bugs.eclipse.org/bugs/show_bug.cgi?id=147552
-			List wrappers = ProcessUtil.getWrappers(wrapper, DEFAULT_ADAPTER_FACTORIES);
-			if(wrappers != null && wrappers.size() > 0){
-				adapter = (ITreeItemContentProvider)wrappers.get(0);
-			}
-		} else {
-			if (filter == null) {
-				adapter = (ITreeItemContentProvider) TngAdapterFactory.INSTANCE
-						.getPBS_ComposedAdapterFactory().adapt(getObject(),
-								ITreeItemContentProvider.class);
-			} else if (filter instanceof IAdapterFactoryFilter) {
-				adapterFactory = ((IAdapterFactoryFilter) filter)
-						.getWPBSAdapterFactory();
-				adapter = (ITreeItemContentProvider) adapterFactory.adapt(
-						getObject(), ITreeItemContentProvider.class);
-			}
-		}
-		if (adapter != null) {
-			// return adapter.getChildren(getObject());
-			// commented above line, For diagrams - rollup should be false, for
-			// handling rollup state below code.
-			List children = new ArrayList();
-			extractChildren(adapter, getObject(), children, true);
-			return children;
-		} else {
-			return Collections.EMPTY_LIST;
-		}
-	}
-
-	protected void populateNodes() {
-		// Activity act = (Activity) getObject();
-
-		// get all WorkProductDescriptors under the activity
-		//
-		super.populateNodes();
-		// ITreeItemContentProvider adapter = (ITreeItemContentProvider)
-		// TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory().adapt(act,
-		// ITreeItemContentProvider.class);
-
-		// ArrayList wpDescriptors = new ArrayList();
-		ArrayList nodes = new ArrayList();
-		for (Iterator iter = getChildren().iterator(); iter.hasNext();) {
-			Object e = iter.next();
-			Object element = TngUtil.unwrap(e);
-			if (element instanceof WorkProductDescriptor) {
-				WorkProductNode node = (WorkProductNode) GraphicalDataHelper.findNode(this, element);
-				if(node == null) {
-					node = (WorkProductNode) toNode((MethodElement) element);
-				}
-				if (e instanceof BreakdownElementWrapperItemProvider) {
-					BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) e;
-					if (wrapper.isReadOnly()) {
-						((NamedNodeImpl) node).itemProvider = wrapper;
-						node.setReadOnly(true);
-					}
-				}
-				if (((WorkProductDescriptor) element).getWorkProduct() instanceof Artifact) {
-					node.setType(1);
-				}
-				if (((WorkProductDescriptor) element).getWorkProduct() instanceof Deliverable) {
-					node.setType(2);
-				}
-				if (((WorkProductDescriptor) element).getWorkProduct() instanceof Outcome) {
-					node.setType(3);
-				}
-				nodes.add(node);
-			}
-		}
-		selectNodes(nodes);
-	}
-	protected Node toNode(MethodElement e) {
-		if(e instanceof WorkProductDescriptor){
-			return super.toNode(e);
-		}
-		return null;
-	}
-
-	protected Node newNode() {
-		return ModelFactory.eINSTANCE.createWorkProductNode();
-	}
-
-	protected int getType() {
-		return GraphicalDataHelper.WORK_PRODUCT_DEPENDENCY_DIAGRAM;
-	}
-
-	protected Class getBreakdownElementType() {
-		return WorkProductDescriptor.class;
-	}
-
-	protected void addToUmaModel(int position, Node addedNode) {		
-		if (addedNode.getObject() instanceof BreakdownElement) {
-			((Activity) getObject()).getBreakdownElements().add(
-					addedNode.getObject());
-		}
-		super.addToUmaModel(position, addedNode);
-	}
-	
-	@Override
-	protected void nodeAdded(int index, Node node) {
-		if(node.getObject() == null) {
-			if(node instanceof WorkProductNode) {
-				node.setObject(UmaFactory.eINSTANCE.createWorkProductDescriptor());
-			}
-		}
-		super.nodeAdded(index, node);
-	}
-	@Override
-	protected void populateLinks() {
-		super.populateLinks();
-		
-		// Clean up un-used the links.
-		for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-			Node node = ((Node) iter.next());
-			ArrayList<Link> linksToRemove = new ArrayList<Link>();
-			for (Iterator iterator = node
-					.getIncomingConnections().iterator(); iterator.hasNext();) {
-				Link link = (Link) iterator.next();
-				if (!isValid(link)) {
-					linksToRemove.add(link);
-				}
-			}
-			for (Iterator iterator = linksToRemove.iterator(); iterator
-					.hasNext();) {
-				Link link = (Link) iterator.next();
-				GraphicalDataHelper.removeLink(link);
-			}
-			linksToRemove.clear();
-			linksToRemove = null;
-		}
-		// Refresh links based on model info.
-		for(Iterator iter = getNodes().iterator(); iter.hasNext();){
-			Node node = ((Node)iter.next());
-			Object wbe = null;
-			//wbe = (WorkProductDescriptor) node.getObject();
-			//if(wbe != null){
-			wbe =  node.getObject();
-			if(wbe instanceof WorkProductDescriptor){
-				List impactedBy = ((WorkProductDescriptor)wbe).getImpactedBy();
-				if(!impactedBy.isEmpty()){
-					for(Iterator iter1 = impactedBy.iterator(); iter1.hasNext();){
-						WorkProductDescriptor source = (WorkProductDescriptor)iter1.next();
-						Link link = findLink(node, source);
-						if(link == null){
-							NamedNodeImpl nodeImpl = ((NamedNodeImpl) node);
-							boolean oldNotify = nodeImpl.notificationEnabled;
-							try {
-								nodeImpl.notificationEnabled = false;
-								nodeImpl.addIncomingConnection(source); 
-							} finally {
-								nodeImpl.notificationEnabled = oldNotify;
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private boolean isValid(Link link) {
-		if (link.getSource() == null || link.getTarget() == null
-				|| !getNodes().contains(link.getSource())
-				|| !getNodes().contains(link.getTarget())) {
-			return false;
-		}
-		return true;
-	}
-	
-	public Link findLink(Node target, Object sourceLinkedElement) {
-		for (Iterator iter = target.getIncomingConnections().iterator(); iter.hasNext();) {
-			Link link = (Link) iter.next();
-			Node source = link.getSource();
-			if(source.getLinkedElement() == sourceLinkedElement) {
-				return link;
-			}
-		}
-		return null;
-	}
-} // WorkProductDependencyDiagramImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductDescriptorNodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductDescriptorNodeImpl.java
deleted file mode 100644
index e36c0d6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductDescriptorNodeImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Work Product Descriptor Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class WorkProductDescriptorNodeImpl extends NamedNodeImpl implements
-		WorkProductDescriptorNode {
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected WorkProductDescriptorNodeImpl() {
-		super();
-
-		methodElementAdapter = new WorkProductDescriptorAdapter();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.WORK_PRODUCT_DESCRIPTOR_NODE;
-	}
-
-	private class WorkProductDescriptorAdapter extends MethodElementAdapter {
-		
-		@Override
-		protected void handleNotification(Notification msg) {
-			switch (msg.getFeatureID(WorkProductDescriptor.class)) {
-			case UmaPackage.WORK_PRODUCT__SUPPRESSED:
-				switch (msg.getEventType()) {
-				case Notification.SET:
-					Boolean b = (Boolean)msg.getNewValue();
-					// TODO: implement handling suppress.
-				}
-			}
-			super.handleNotification(msg);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.diagram.model.impl.NamedNodeImpl.MethodElementAdapter#getNode()
-		 */
-		public Node getNode() {
-			return WorkProductDescriptorNodeImpl.this;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NamedNodeImpl#findNode(org.eclipse.epf.uma.MethodElement)
-	 */
-	protected Node findNode(MethodElement linkedElement) {
-		return GraphicalDataHelper.findNode(
-				(ActivityDetailDiagram) getDiagram(), linkedElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#getMethodElementAdapterType()
-	 */
-	public Class getMethodElementAdapterType() {
-		return WorkProductDescriptorAdapter.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#addToUMA(org.eclipse.epf.diagram.model.Link)
-	 */
-	protected boolean addToUMA(Link link) {
-		if (!super.addToUMA(link))
-			return false;
-
-		WorkProductDescriptor wpd = (WorkProductDescriptor) getObject();
-
-		// disable notification of source node before changing the UMA object
-		// associated with it
-		// so it will not create duplicate links
-		//
-		NodeImpl nodeImpl = (NodeImpl) link.getSource();
-		boolean notify = nodeImpl.notificationEnabled;
-		boolean notifyTarget = notificationEnabled;
-		try {
-			nodeImpl.notificationEnabled = false;
-			notificationEnabled = false;
-//			wpd.getOutputFrom().add(link.getSource().getObject());
-			TaskDescriptor taskDesc = (TaskDescriptor) link.getSource().getObject();
-			if(taskDesc != null) {
-				taskDesc.getOutput().add(wpd);
-			}
-		} finally {
-			nodeImpl.notificationEnabled = notify;
-			notificationEnabled = notifyTarget;
-		}
-
-		// TaskDescriptor td = (TaskDescriptor) link.getSource().getObject();
-		// td.getOutput().add(getObject());
-
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.model.impl.NodeImpl#removeFromUMA(org.eclipse.epf.diagram.model.Link,
-	 *      org.eclipse.epf.diagram.model.Node, org.eclipse.epf.diagram.model.Node)
-	 */
-	protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) {
-		WorkProductDescriptor wpd = (WorkProductDescriptor) getObject();
-//		wpd.getMandatoryInputTo().remove(oldTarget.getObject());
-		TaskDescriptor taskDesc = (TaskDescriptor) oldTarget.getObject();
-		if(taskDesc != null) {
-			taskDesc.getMandatoryInput().remove(wpd);
-		}
-
-		super.removeFromUMA(link, oldSource, oldTarget);
-	}
-	
-	@Override
-	protected void dispose() {
-		super.dispose();
-	}
-} // WorkProductDescriptorNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductNodeImpl.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductNodeImpl.java
deleted file mode 100644
index ddb6d43..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/WorkProductNodeImpl.java
+++ /dev/null
@@ -1,314 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Point;
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Work Product Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.diagram.model.impl.WorkProductNodeImpl#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductNodeImpl extends NamedNodeImpl implements
-		WorkProductNode {
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int TYPE_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected int type = TYPE_EDEFAULT;
-
-	private class WorkProductDescriptorAdapter extends MethodElementAdapter {
-
-		public Node getNode() {
-			return WorkProductNodeImpl.this;
-		}
-
-		public void notifyChanged(Notification msg) {
-			if (!notificationEnabled)
-				return;
-			notificationEnabled = false;
-
-			try {
-				switch (msg.getFeatureID(WorkProductDescriptor.class)) {
-				case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-					MethodElement obj;
-					switch (msg.getEventType()) {
-					case Notification.ADD:
-						obj = (MethodElement) msg.getNewValue();
-						addIncomingConnection(obj);
-						return;
-					case Notification.REMOVE:
-						obj = (MethodElement) msg.getOldValue();
-						removeIncomingConnection(obj);
-						return;
-					case Notification.ADD_MANY:
-						Collection collection = (Collection) msg.getNewValue();
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							obj = (MethodElement) iter.next();
-							addIncomingConnection(obj);
-						}
-						return;
-					case Notification.REMOVE_MANY:
-						collection = (Collection) msg.getOldValue();
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							obj = (MethodElement) iter.next();
-							removeIncomingConnection(obj);
-						}
-						return;
-					}
-				case UmaPackage.WORK_PRODUCT__SUPPRESSED:
-					switch (msg.getEventType()) {
-					case Notification.SET:
-						Boolean b = (Boolean)msg.getNewValue();
-						if(b.booleanValue()==true){
-							removeLinks();
-						}
-					}
-				}
-				super.notifyChanged(msg);
-			} finally {
-				notificationEnabled = true;
-			}
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 */
-	protected WorkProductNodeImpl() {
-		super();
-
-		methodElementAdapter = new WorkProductDescriptorAdapter();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ModelPackage.Literals.WORK_PRODUCT_NODE;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(int newType) {
-		int oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.WORK_PRODUCT_NODE__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_NODE__TYPE:
-				return new Integer(getType());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_NODE__TYPE:
-				setType(((Integer)newValue).intValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_NODE__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case ModelPackage.WORK_PRODUCT_NODE__TYPE:
-				return type != TYPE_EDEFAULT;
-		}
-		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(" (type: "); //$NON-NLS-1$
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-	protected boolean addToUMA(Link link) {
-		if (!super.addToUMA(link))
-			return false;
-
-		WorkProductDescriptor descriptor = (WorkProductDescriptor) link
-				.getSource().getObject();
-
-		NodeImpl source = (NodeImpl) link.getSource();
-		NodeImpl target = (NodeImpl) link.getTarget();
-		boolean notifySource = source.notificationEnabled;
-		boolean notifyTarget = target.notificationEnabled;
-		try {
-			source.notificationEnabled = target.notificationEnabled = false;
-			descriptor.getImpacts().add(link.getTarget().getObject());
-		} finally {
-			source.notificationEnabled = notifySource;
-			target.notificationEnabled = notifyTarget;
-		}
-
-		return true;
-	}
-
-	protected void removeFromUMA(Link link, Node oldSource, Node oldTarget) {
-		WorkProductDescriptor descriptor = (WorkProductDescriptor) oldTarget
-				.getObject();
-		// disable internal notification of the target node before removing its
-		// descriptor from the dependency list
-		//
-		NamedNodeImpl nodeImpl = (NamedNodeImpl) oldSource;
-		boolean notify = nodeImpl.notificationEnabled;
-		try {
-			nodeImpl.notificationEnabled = false;
-			descriptor.getImpactedBy().remove(nodeImpl.getObject());
-		} finally {
-			nodeImpl.notificationEnabled = notify;
-		}
-
-		super.removeFromUMA(link, oldSource, oldTarget);
-	}
-
-	protected void removeLinks() {
-		for (Iterator iter = getIncomingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			if (link.getSource() != null) {
-				GraphicalDataHelper.removeGraphicalData(link);
-				// disable internal notification of the source node
-				//
-				NodeImpl sourceNode = (NodeImpl) link.getSource();
-				boolean oldNotify = sourceNode.notificationEnabled;
-				try {
-					sourceNode.notificationEnabled = false;
-					link.setSource(null);
-				} finally {
-					sourceNode.notificationEnabled = oldNotify;
-				}
-				//link.setTarget(null);
-				link.setObject(null);
-			}
-		}
-
-		for (Iterator iter = getOutgoingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			if (link.getTarget() != null) {
-				GraphicalDataHelper.removeGraphicalData(link);
-				// disable internal notification of the source node
-				//
-				NodeImpl targetNode = (NodeImpl) link.getTarget();
-				boolean oldNotify = targetNode.notificationEnabled;
-				try {
-					targetNode.notificationEnabled = false;
-					link.setTarget(null);
-				} finally {
-					targetNode.notificationEnabled = oldNotify;
-				}
-				//link.setSource(null);
-				link.setObject(null);
-			}
-		}
-	}
-} // WorkProductNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/package.html b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/package.html
deleted file mode 100644
index 3b1df16..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for the activity diagram model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/package.html b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/package.html
deleted file mode 100644
index c69d95e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the activity diagram model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/DiagramInfo.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/DiagramInfo.java
deleted file mode 100644
index 2112a5f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/DiagramInfo.java
+++ /dev/null
@@ -1,350 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.library.edit.util.ConstraintManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.SupportingMaterial;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * This class stores diagram publish options and references to user-specified
- * diagrams to replace the activity diagram, activity detail diagram, or work
- * product dependency diagram for an activity.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DiagramInfo {
-	private static final String AD_IMAGE_URI = "ad_image_uri"; //$NON-NLS-1$
-
-	private static final String ADD_IMAGE_URI = "add_image_uri"; //$NON-NLS-1$
-
-	private static final String WPD_IMAGE_URI = "wpd_image_uri"; //$NON-NLS-1$
-
-	private static final String PUBLISH_AD_IMAGE = "publish_ad_image"; //$NON-NLS-1$
-
-	private static final String PUBLISH_ADD_IMAGE = "publish_add_image"; //$NON-NLS-1$
-
-	private static final String PUBLISH_WPD_IMAGE = "publish_wpd_image"; //$NON-NLS-1$
-
-	private static final String DELIMITER = "|"; //$NON-NLS-1$
-
-	private Activity activity;
-
-	private String AD_ImageURI;
-
-	private String ADD_ImageURI;
-
-	private String WPD_ImageURI;
-
-	private boolean publishADImage;
-
-	private boolean publishADDImage;
-
-	private boolean publishWPDImage;
-
-	private Constraint constraint;
-
-	private SupportingMaterial activityDiagram;
-
-	private SupportingMaterial activityDetailDiagram;
-
-	private SupportingMaterial wpdDiagram;
-
-	/**
-	 * Constructs and loads a DiagramInfo instance for a given activity
-	 * 
-	 * @param activity
-	 */
-	public DiagramInfo(Activity activity) {
-		this.activity = activity;
-		refresh();
-	}
-
-	private DiagramInfo() {
-		AD_ImageURI = ADD_ImageURI = WPD_ImageURI = ""; //$NON-NLS-1$
-	}
-
-	private DiagramInfo load() {
-		DiagramInfo info = new DiagramInfo();
-		for (StringTokenizer tokens = new StringTokenizer(constraint.getBody(),
-				DELIMITER); tokens.hasMoreTokens();) {
-			String token = tokens.nextToken();
-			int id = token.indexOf('=');
-			int max = token.length() - 1;
-			if (id != -1 && id < max) {
-				String key = token.substring(0, id);
-				if (key.equalsIgnoreCase(AD_IMAGE_URI)) {
-					info.AD_ImageURI = token.substring(id + 1);
-				} else if (key.equalsIgnoreCase(ADD_IMAGE_URI)) {
-					info.ADD_ImageURI = token.substring(id + 1);
-				} else if (key.equalsIgnoreCase(WPD_IMAGE_URI)) {
-					info.WPD_ImageURI = token.substring(id + 1);
-				} else if (key.equalsIgnoreCase(PUBLISH_AD_IMAGE)) {
-					info.publishADImage = Boolean.valueOf(
-							token.substring(id + 1)).booleanValue();
-				} else if (key.equalsIgnoreCase(PUBLISH_ADD_IMAGE)) {
-					info.publishADDImage = Boolean.valueOf(
-							token.substring(id + 1)).booleanValue();
-				} else if (key.equalsIgnoreCase(PUBLISH_WPD_IMAGE)) {
-					info.publishWPDImage = Boolean.valueOf(
-							token.substring(id + 1)).booleanValue();
-				}
-			}
-		}
-		return info;
-	}
-
-	private void save() {
-		if (constraint == null) {
-			constraint = ConstraintManager.getConstraint(activity,
-					ConstraintManager.ACITIVY_DIAGRAM, true);
-		}
-		if (activityDiagram != null) {
-			AD_ImageURI = activityDiagram.getGuid();
-		}
-		if (activityDetailDiagram != null) {
-			ADD_ImageURI = activityDetailDiagram.getGuid();
-		}
-		if (wpdDiagram != null) {
-			WPD_ImageURI = wpdDiagram.getGuid();
-		}
-
-		DiagramInfo info = load();
-
-		if (AD_ImageURI != null) {
-			info.AD_ImageURI = AD_ImageURI;
-		}
-		if (ADD_ImageURI != null) {
-			info.ADD_ImageURI = ADD_ImageURI;
-		}
-		if (WPD_ImageURI != null) {
-			info.WPD_ImageURI = WPD_ImageURI;
-		}
-		info.publishADImage = publishADImage;
-		info.publishADDImage = publishADDImage;
-		info.publishWPDImage = publishWPDImage;
-
-		String str = new StringBuffer(AD_IMAGE_URI).append('=').append(
-				info.AD_ImageURI).append(DELIMITER).append(PUBLISH_AD_IMAGE)
-				.append('=').append(String.valueOf(info.publishADImage))
-				.append(DELIMITER).append(ADD_IMAGE_URI).append('=').append(
-						String.valueOf(info.ADD_ImageURI)).append(DELIMITER)
-				.append(PUBLISH_ADD_IMAGE).append('=').append(
-						String.valueOf(info.publishADDImage)).append(DELIMITER)
-				.append(WPD_IMAGE_URI).append('=').append(
-						String.valueOf(info.WPD_ImageURI)).append(DELIMITER)
-				.append(PUBLISH_WPD_IMAGE).append('=').append(
-						String.valueOf(info.publishWPDImage)).toString();
-
-		constraint.setBody(str);
-	}
-
-	/**
-	 * Refreshes this DiagramInfo object from the model
-	 * 
-	 */
-	public void refresh() {
-		constraint = ConstraintManager.getConstraint(activity,
-				ConstraintManager.ACITIVY_DIAGRAM, false);
-		if (constraint == null) {
-			return;
-		}
-
-		DiagramInfo info = load();
-
-		AD_ImageURI = info.AD_ImageURI;
-		ADD_ImageURI = info.ADD_ImageURI;
-		WPD_ImageURI = info.WPD_ImageURI;
-		publishADImage = info.publishADImage;
-		publishADDImage = info.publishADDImage;
-		publishWPDImage = info.publishWPDImage;
-
-		activityDiagram = getSupportingMaterial(AD_ImageURI);
-		activityDetailDiagram = getSupportingMaterial(ADD_ImageURI);
-		wpdDiagram = getSupportingMaterial(WPD_ImageURI);
-	}
-
-	public String getAD_ImageURI() {
-		return AD_ImageURI;
-	}
-
-	public String getADD_ImageURI() {
-		return ADD_ImageURI;
-	}
-
-	public String getWPD_ImageURI() {
-		return WPD_ImageURI;
-	}
-
-	/**
-	 * Gets the option to publish user-specified activity detail diagram
-	 * instead.
-	 * 
-	 * @return
-	 * @see #getActivityDetailDiagram()
-	 */
-	public boolean canPublishADDImage() {
-		return publishADDImage;
-	}
-
-	/**
-	 * Sets the option to publish user-specified activity detail diagram
-	 * instead.
-	 * 
-	 * @param publishADDImage
-	 */
-	public void setPublishADDImage(boolean publishADDImage) {
-		this.publishADDImage = publishADDImage;
-		save();
-	}
-
-	/**
-	 * Gets the option to publish user-specified activity diagram instead.
-	 * 
-	 * @return
-	 * @see #getActivityDiagram()
-	 */
-	public boolean canPublishADImage() {
-		return publishADImage;
-	}
-
-	/**
-	 * Sets the option to publish user-specified image for activity diagram
-	 * instead of the activity diagram
-	 * 
-	 * @param publishADImage
-	 */
-	public void setPublishADImage(boolean publishADImage) {
-		this.publishADImage = publishADImage;
-		save();
-	}
-
-	/**
-	 * Gets the option to publish user-specified work product dependency diagram
-	 * instead.
-	 * 
-	 * @return
-	 * @see #getWPDDiagram()
-	 */
-	public boolean canPublishWPDImage() {
-		return publishWPDImage;
-	}
-
-	/**
-	 * Sets the option to publish user-specified image for work product
-	 * dependency diagram instead of the work product dependency diagram
-	 * 
-	 * @param publishWPDImage
-	 */
-	public void setPublishWPDImage(boolean publishWPDImage) {
-		this.publishWPDImage = publishWPDImage;
-		save();
-	}
-
-	public SupportingMaterial getActivityDiagram() {
-		return activityDiagram;
-	}
-
-	/**
-	 * Gets user-specified activity detail diagram.
-	 * 
-	 * @return a {@link SupportingMaterial} with the digram in its main
-	 *         description
-	 */
-	public SupportingMaterial getActivityDetailDiagram() {
-		return activityDetailDiagram;
-	}
-
-	/**
-	 * Gets user-specified work product dependency diagram.
-	 * 
-	 * @return a {@link SupportingMaterial} with the digram in its main
-	 *         description
-	 */
-	public SupportingMaterial getWPDDiagram() {
-		return wpdDiagram;
-	}
-
-	public void setWPDDiagram(SupportingMaterial wpdDiagram) {
-		if (this.wpdDiagram != wpdDiagram) {
-			SupportingMaterial old = this.wpdDiagram;
-			this.wpdDiagram = wpdDiagram;
-			update(old, wpdDiagram);
-		}
-	}
-
-	public void setActivityDetailDiagram(
-			SupportingMaterial activityDetailDiagram) {
-		if (this.activityDetailDiagram != activityDetailDiagram) {
-			SupportingMaterial old = this.activityDetailDiagram;
-			this.activityDetailDiagram = activityDetailDiagram;
-			update(old, activityDetailDiagram);
-		}
-	}
-
-	public void setActivityDiagram(SupportingMaterial activityDiagram) {
-		if (this.activityDiagram != activityDiagram) {
-			SupportingMaterial old = this.activityDiagram;
-			this.activityDiagram = activityDiagram;
-			update(old, activityDiagram);
-		}
-	}
-
-	/**
-	 * Gets the SupportingMaterial object for the diagram with the given URI
-	 * 
-	 * @param diagramURI
-	 * @return null of the SupportingMaterial object could not be found in the
-	 *         library
-	 */
-	private SupportingMaterial getSupportingMaterial(String diagramURI) {
-		// diagramURI is the GUID of the supporting material that must be in the
-		// list
-		// of supporting materials of the activity
-		//
-		for (Iterator iter = activity.getSupportingMaterials().iterator(); iter
-				.hasNext();) {
-			SupportingMaterial e = (SupportingMaterial) iter.next();
-			if (e.getGuid().equals(diagramURI)) {
-				return e;
-			}
-		}
-		return null;
-	}
-
-	private void update(SupportingMaterial old, SupportingMaterial neu) {
-		if (old != null) {
-			activity.getSupportingMaterials().remove(old);
-		}
-		if (neu != null) {
-			activity.getSupportingMaterials().add(neu);
-		}
-		save();
-	}
-
-	/**
-	 * Checks if the given supporting material is a user-defined diagram of this
-	 * DiagramInfo's activity
-	 * 
-	 * @param sm
-	 * @return
-	 */
-	public boolean isDiagram(SupportingMaterial sm) {
-		return sm != null
-				&& (sm == activityDiagram || sm == activityDetailDiagram || sm == wpdDiagram);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/DiagramManager.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/DiagramManager.java
deleted file mode 100644
index 7833b68..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/DiagramManager.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Diagram;
-
-/**
- * Extension to contribute to extension point
- * "org.eclipse.epf.library.edit.diagramManager"
- * 
- * @author Phong Nguyen Le - Jun 27, 2006
- * @since 1.0
- */
-public class DiagramManager implements IDiagramManager {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.util.IDiagramManager#getDiagram(org.eclipse.epf.uma.Activity,
-	 *      int)
-	 */
-	public Diagram getDiagram(Activity act, int type) {
-		return GraphicalDataManager.getInstance().getUMADiagram(act, type,
-				false);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/GraphicalDataHelper.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/GraphicalDataHelper.java
deleted file mode 100644
index 68fb9de..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/GraphicalDataHelper.java
+++ /dev/null
@@ -1,1147 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.DiagramResources;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.impl.NamedNodeImpl;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.process.WorkProductDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class GraphicalDataHelper {
-	/** Diagram type constants */
-	public static final int ACTIVITY_DIAGRAM = IDiagramManager.ACTIVITY_DIAGRAM;
-
-	public static final int WORK_PRODUCT_DEPENDENCY_DIAGRAM = IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM;
-
-	public static final int ACTIVITY_DETAIL_DIAGRAM = IDiagramManager.ACTIVITY_DETAIL_DIAGRAM;
-
-	static final int[] DIAGRAM_TYPES = { ACTIVITY_DIAGRAM,
-			ACTIVITY_DETAIL_DIAGRAM, WORK_PRODUCT_DEPENDENCY_DIAGRAM };
-
-	static final String[] DIAGRAM_TYPE_TEXTS = {
-			DiagramResources.type_activity, DiagramResources.type_WPD, DiagramResources.type_activityDetail }; 
-
-	/** Property names */
-	public static final String PROP_TYPE = "type"; //$NON-NLS-1$
-
-	public static final String PROP_WORK_PRODUCT_COMPOSITE_TYPE = "wpCompositeType"; //$NON-NLS-1$
-	
-	/** property names for activity detail diagram **/
-	public static final String PROP_AUTO_LAYOUT = "autolayout"; //$NON-NLS-1$
-	
-	public static final String PROP_INDEX = "index"; //$NON-NLS-1$
-	
-	/** property values constants for autolayout **/
-	
-	public static final String PROP_AUTO_LAYOUT_VALUE_TRUE = "true"; //$NON-NLS-1$
-	
-	public static final String PROP_AUTO_LAYOUT_VALUE_FALSE = "false"; //$NON-NLS-1$
-	
-	/** Type info for UI node (@see TypedNode) */
-	public static final String GRAPH_NODE_SYNCH_BAR = "synchnonization bar"; //$NON-NLS-1$
-
-	public static final String GRAPH_NODE_START = "start node"; //$NON-NLS-1$
-
-	public static final String GRAPH_NODE_END = "end node"; //$NON-NLS-1$
-
-	public static final String GRAPH_NODE_DECISION = "decision node"; //$NON-NLS-1$
-
-	public static final String GRAPH_NODE_FREE_TEXT = "free text"; //$NON-NLS-1$
-
-	/** Diagram type string constants */
-	public static final String DIAGRAM_WORKFLOW = "Workflow"; //$NON-NLS-1$
-
-	public static final String DIAGRAM_WORK_PRODUCT_DEPENDENCY = "Work Product Dependency"; //$NON-NLS-1$
-
-	public static final String DIAGRAM_ACTIVITY_DETAIL = "Activity Detail"; //$NON-NLS-1$
-	
-	public static final String ADD_DIAGRAM_TASKS_PER_ROW = "ACTIVITY_DETAIL_DIAGRAM_TASKS_PER_ROW"; //$NON-NLS-1$
-
-	public static Point toPoint(org.eclipse.epf.uma.Point p) {
-		return new Point(p.getX().doubleValue(), p.getY().doubleValue());
-	}
-
-	public static org.eclipse.epf.uma.Point newModelPoint(int x, int y) {
-		org.eclipse.epf.uma.Point p = UmaFactory.eINSTANCE.createPoint();
-		p.setX(new Double(x));
-		p.setY(new Double(y));
-		return p;
-	}
-
-	public static Property findProperty(GraphNode node, String propKey) {
-		for (int i = node.getProperty().size() - 1; i > -1; i--) {
-			Property prop = (Property) node.getProperty().get(i);
-			if (propKey.equals(prop.getKey()))
-				return prop;
-		}
-		return null;
-	}
-
-	/**
-	 * @param width
-	 * @param height
-	 * @return
-	 */
-	public static Dimension newModelDimension(int width, int height) {
-		Dimension size = UmaFactory.eINSTANCE.createDimension();
-		size.setWidth(new Double(width));
-		size.setHeight(new Double(height));
-		return size;
-	}
-
-	public static void fillConnections(Node node, GraphNode graphNode) {
-		boolean old = node.eDeliver();
-		try {
-			node.eSetDeliver(false);
-			org.eclipse.epf.diagram.model.Diagram diagram = (org.eclipse.epf.diagram.model.Diagram) node
-					.eContainer();
-			for (Iterator iter = graphNode.getAnchorage().iterator(); iter
-					.hasNext();) {
-				GraphConnector conn = ((GraphConnector) iter.next());
-				for (Iterator iterator = conn.getGraphEdge().iterator(); iterator
-						.hasNext();) {
-					GraphEdge edge = (GraphEdge) iterator.next();
-					if(edge.getAnchor().size() > 1) { 
-						GraphConnector targetConnector;
-						Link link = null;
-						if (edge.eContainer() == graphNode) {
-							targetConnector = (GraphConnector) edge.getAnchor()
-							.get(1);
-							GraphNode targetGraphNode = (GraphNode) targetConnector
-							.eContainer();
-							if (graphNode.eContainer() == targetGraphNode
-									.eContainer()) {
-								Object linkedObject = targetGraphNode;
-								if (targetGraphNode.getSemanticModel() instanceof UMASemanticModelBridge) {
-									linkedObject = ((UMASemanticModelBridge) targetGraphNode
-											.getSemanticModel()).getElement();
-								}
-								if(linkedObject != null){
-									Node targetNode = findNode(diagram, linkedObject);
-									link = ModelFactory.eINSTANCE.createLink();
-									link.setSource(node);
-									link.setTarget(targetNode);
-									link.setObject(edge);
-								}else{
-									if(LibraryEditPlugin.getDefault().isDebugging()){
-										System.out.println("Linked object is null: for: "+ node.getGraphNode() + //$NON-NLS-1$
-												": for graphConnector: "+	targetConnector); //$NON-NLS-1$
-									}
-								}
-							}
-						}
-					}
-				}
-
-			}
-		} finally {
-			node.eSetDeliver(old);
-		}
-	}
-
-	public static Node findNode(org.eclipse.epf.diagram.model.Diagram diagram,
-			GraphNode gNode, Class adapterType) {
-		SemanticModelBridge bridge = gNode.getSemanticModel();
-		if (bridge instanceof UMASemanticModelBridge) {
-			INodeChangeListener listener = (INodeChangeListener) UmaUtil
-					.getAdapter(((UMASemanticModelBridge) bridge).getElement(),
-							adapterType);
-			return listener.getNode();
-		}
-
-		// gNode is not a activity's GraphNode. Try to find a Node with gNode as
-		// a linked object in the diagram.
-		//
-		for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (gNode == element.getObject()) {
-				return element;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds node whose linked object is the given object
-	 * 
-	 * @return
-	 */
-	public static Node findNode(NodeContainer container, Object object) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (object == element.getObject() || object == element.getLinkedElement()) {
-				return element;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds node whose linked object or one of its base is the given object
-	 * 
-	 * @param container
-	 * @param object
-	 * @return
-	 */
-	public static Node findNode(NodeContainer container, Object object,
-			boolean checkBase) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			if (object == node.getObject()) {
-				return node;
-			} else if (checkBase
-					&& node.getObject() instanceof VariabilityElement) {
-				for (VariabilityElement ve = ((VariabilityElement) node
-						.getObject()).getVariabilityBasedOnElement(); ve != null; ve = ve
-						.getVariabilityBasedOnElement()) {
-					if (ve == object) {
-						return node;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public static Node findNode(ActivityDetailDiagram diagram, Object object) {
-		Node node = null;
-		for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (element instanceof RoleTaskComposite 
-					|| element instanceof WorkProductComposite) {
-				node = findNode((NodeContainer) element, object);
-				if (node != null)
-					return node;
-			}
-			if (object == element.getObject()) {
-				return element;
-			}
-		}
-		return null;
-	}
-	
-	public static Node findNode(ActivityDetailDiagram diagram, Object object, Class type) {
-		Node node = null;
-		for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (element instanceof RoleTaskComposite 
-					|| element instanceof WorkProductComposite) {
-				node = findNode((NodeContainer) element, object);
-				if (node != null)
-					return node;
-			}
-			if (object == element.getObject() && type.isInstance(element)) {
-				return element;
-			}
-		}
-		return null;
-	}
-	
-	public static Link findLink(Node source, Object targetLinkedElement) {
-		for (Iterator iter = source.getOutgoingConnections().iterator(); iter.hasNext();) {
-			Link link = (Link) iter.next();
-			Node target = link.getTarget();
-			if(target != null && target.getLinkedElement() == targetLinkedElement) {
-				return link;
-			}
-		}
-		return null;
-	}
-
-	private static String getTypeString(int type) {
-		switch (type) {
-		case TypedNode.DECISION:
-			return GRAPH_NODE_DECISION;
-		case TypedNode.END:
-			return GRAPH_NODE_END;
-		case TypedNode.START:
-			return GRAPH_NODE_START;
-		case TypedNode.SYNCH_BAR:
-			return GRAPH_NODE_SYNCH_BAR;
-		case TypedNode.FREE_TEXT:
-			return GRAPH_NODE_FREE_TEXT;
-		}
-		return null;
-	}
-
-	public static GraphNode newTypedGraphNode(int type) {
-		GraphNode graphNode = UmaFactory.eINSTANCE.createGraphNode();
-		SimpleSemanticModelElement bridge = UmaFactory.eINSTANCE
-				.createSimpleSemanticModelElement();
-		bridge.setTypeInfo(getTypeString(type));
-		graphNode.setSemanticModel(bridge);
-		org.eclipse.epf.uma.Point point = UmaFactory.eINSTANCE.createPoint();
-		point.setX(new Double(-1));
-		point.setY(new Double(-1));
-		graphNode.setPosition(point);
-		org.eclipse.epf.uma.Dimension dim = UmaFactory.eINSTANCE.createDimension();
-		dim.setWidth(new Double(-1));
-		dim.setHeight(new Double(-1));
-		graphNode.setSize(dim);
-
-		if (type == TypedNode.FREE_TEXT) {
-			graphNode.setName(DiagramResources.addFreeTxt); 
-		}
-		if (type == TypedNode.FREE_TEXT) {
-			Property property = UmaFactory.eINSTANCE.createProperty();
-			property.setKey(GRAPH_NODE_FREE_TEXT);
-			property.setValue(DiagramResources.addFreeTxt); 
-			List list = new ArrayList();
-			list.add(property);
-			graphNode.set(UmaPackage.GRAPH_NODE__PROPERTY, list);
-		}
-
-		return graphNode;
-	}
-
-	/**
-	 * @param link
-	 */
-	public static void removeGraphicalData(Link link) {
-		// GraphicalDataManager.getInstance().removeGraphConnectorPair(link.getSource().getGraphNode(),
-		// link.getTarget().getGraphNode());
-		
-		GraphEdge edge = (GraphEdge) link.getObject();
-		if(edge != null) {
-			GraphicalDataManager.getInstance().removeGraphEdge(edge);
-		}
-	}
-
-	/**
-	 * @param link
-	 */
-	public static void addGraphicalData(Link link) {
-		GraphEdge edge = (GraphEdge) link.getObject();
-		if (edge == null) {
-			// new link
-			//
-			edge = GraphicalDataManager.getInstance().addGraphConnectorPair(
-					link.getSource().getGraphNode(),
-					link.getTarget().getGraphNode());
-			link.setObject(edge);
-
-			// save the source end point and target end point from the given
-			// link
-			//
-			link.setSourceEndPoint(link.getSourceEndPoint());
-			link.setTargetEndPoint(link.getTargetEndPoint());
-		} else {
-			// undo deleted link
-			//
-			GraphNode srcNode = link.getSource().getGraphNode();
-			GraphNode targetNode = link.getTarget().getGraphNode();
-			Object srcConnector = edge.getAnchor().get(0);
-			srcNode.getAnchorage().add(srcConnector);
-			srcNode.getContained().add(edge);
-			Object targetConnector = edge.getAnchor().get(1);
-			targetNode.getAnchorage().add(targetConnector);
-		}
-	}
-
-	public static void setSemanticModel(Link link, WorkOrder workOrder) {
-		// set the WorkOrder as the element of the SemanticModel of the link's
-		// GraphEdge
-		//
-		GraphEdge edge = (GraphEdge) link.getObject();
-		UMASemanticModelBridge bridge = UmaFactory.eINSTANCE
-				.createUMASemanticModelBridge();
-		bridge.setElement(workOrder);
-		edge.setSemanticModel(bridge);
-	}
-
-	// public static Collection getSourceActivityNodes(TypedNode typedNode) {
-	// List actNodes = new ArrayList();
-	// getSourceActivityNodes(actNodes, typedNode);
-	// return actNodes;
-	// }
-
-	public static Collection getSourceNodes(TypedNode typedNode, Class type) {
-		List actNodes = new ArrayList();
-		getSourceNodes(actNodes, typedNode, type);
-		return actNodes;
-	}
-
-	// public static void getSourceActivityNodes(Collection actNodes, TypedNode
-	// typedNode) {
-	// for (Iterator iter = typedNode.getIncomingConnections().iterator();
-	// iter.hasNext();) {
-	// Link link = (Link)iter.next();
-	// Node source = link.getSource();
-	// if(source instanceof ActivityNode) {
-	// actNodes.add(source);
-	// }
-	// else if(source instanceof TypedNode) {
-	// getSourceActivityNodes(actNodes, (TypedNode) source);
-	// }
-	// }
-	// }
-
-	// public static Collection getTargetActivityNodes(TypedNode typedNode) {
-	// List actNodes = new ArrayList();
-	// getTargetActivityNodes(actNodes, typedNode);
-	// return actNodes;
-	// }
-
-	public static Collection getTargetNodes(TypedNode typedNode, Class type) {
-		List actNodes = new ArrayList();
-		getTargetNodes(actNodes, typedNode, type);
-		return actNodes;
-	}
-
-	// public static void getTargetActivityNodes(Collection actNodes, TypedNode
-	// typedNode) {
-	// for (Iterator iter = typedNode.getOutgoingConnections().iterator();
-	// iter.hasNext();) {
-	// Link link = (Link)iter.next();
-	// Node target = link.getTarget();
-	// if(target instanceof ActivityNode) {
-	// actNodes.add(target);
-	// }
-	// else if(target instanceof TypedNode) {
-	// getTargetActivityNodes(actNodes, (TypedNode) target);
-	// }
-	// }
-	// }
-
-	/**
-	 * Gets all nodes with the given type that are direct or indirect targets of
-	 * the given source typedNode.
-	 * 
-	 * @param actNodes
-	 * @param typedNode
-	 * @param type
-	 */
-	public static void getTargetNodes(Collection actNodes, TypedNode typedNode,
-			Class type) {
-		for (Iterator iter = typedNode.getOutgoingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			Node target = link.getTarget();
-			if (type.isInstance(target)) {
-				actNodes.add(target);
-			} else if (target instanceof TypedNode) {
-				getTargetNodes(actNodes, (TypedNode) target, type);
-			}
-		}
-	}
-
-	public static void getSourceNodes(Collection actNodes, TypedNode typedNode,
-			Class type) {
-		for (Iterator iter = typedNode.getIncomingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			Node source = link.getSource();
-			if (type.isInstance(source)) {
-				actNodes.add(source);
-			} else if (source instanceof TypedNode) {
-				getSourceNodes(actNodes, (TypedNode) source, type);
-			}
-		}
-	}
-
-	public static Node getFirstSourceNode(TypedNode typedNode, Class type) {
-		for (Iterator iter = typedNode.getIncomingConnections().iterator(); iter
-				.hasNext();) {
-			Link link = (Link) iter.next();
-			Node source = link.getSource();
-			if (type.isInstance(source)) {
-				return source;
-			} else if (source instanceof TypedNode) {
-				source = getFirstSourceNode((TypedNode) source, type);
-				if (source != null)
-					return source;
-			}
-		}
-		return null;
-	}
-
-	public static WorkOrder removeWorkOrder(NamedNodeImpl node,
-			Object predBreakdownElement) {
-		boolean notify = node.isNotificationEnabled();
-		try {
-			node.setNotificationEnabled(false);
-			return UmaUtil.removeWorkOrder((WorkBreakdownElement) node
-					.getObject(), predBreakdownElement);
-		} finally {
-			node.setNotificationEnabled(notify);
-		}
-	}
-
-	public static WorkOrder addDefaultWorkOrder(NamedNodeImpl node,
-			WorkBreakdownElement predBreakdownElement) {
-		boolean notify = node.isNotificationEnabled();
-		try {
-			node.setNotificationEnabled(false);
-			return UmaUtil.createDefaultWorkOrder((WorkBreakdownElement) node
-					.getObject(), predBreakdownElement);
-		} finally {
-			node.setNotificationEnabled(notify);
-		}
-
-	}
-
-	/**
-	 * @param taskDescriptor
-	 * @return
-	 */
-	public static boolean hasNoRoleDescriptorAssociated(
-			TaskDescriptor taskDescriptor) {
-		return taskDescriptor.getPerformedPrimarilyBy() == null;
-		// commented - requirements not to allow additional performer and
-		// assisted by in diagrams.
-		// && taskDescriptor.getAdditionallyPerformedBy().isEmpty();
-		// && taskDescriptor.getAssistedBy().isEmpty();
-	}
-
-	/**
-	 * @param diagram
-	 * @param node
-	 * @return
-	 */
-	public static boolean contains(NodeContainer container, Node node) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child == node)
-				return true;
-			if (child instanceof NodeContainer
-					&& contains((NodeContainer) child, node)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public static boolean refreshFromBase(Diagram diagram) {
-		// find the base diagram
-		//
-		SemanticModelBridge modelBridge = diagram.getSemanticModel();
-		if (modelBridge instanceof UMASemanticModelBridge) {
-			UMASemanticModelBridge umaModelBridge = ((UMASemanticModelBridge) modelBridge);
-			Activity act = (Activity) umaModelBridge.getElement();
-			Activity base = (Activity) act.getVariabilityBasedOnElement();
-			if (base == null
-					|| act.getVariabilityType() == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-				return false;
-			}
-			int diagramType = GraphicalDataManager.getInstance()
-					.getDiagramType(diagram);
-			switch (diagramType) {
-			case ACTIVITY_DIAGRAM: {
-				Diagram baseDiagram = GraphicalDataManager.getInstance()
-						.getUMADiagram(base, diagramType, false);
-				if (baseDiagram == null)
-					return false;
-				List oldNodes = new ArrayList();
-				Diagram copy = copyDiagram(baseDiagram);
-				for (Iterator iter = baseDiagram.getContained().iterator(); iter
-						.hasNext();) {
-					GraphNode baseNode = (GraphNode) iter.next();
-					modelBridge = baseNode.getSemanticModel();
-					if (modelBridge instanceof UMASemanticModelBridge) {
-						// this is a element's node
-						MethodElement e = ((UMASemanticModelBridge) modelBridge)
-								.getElement();
-						GraphNode node = GraphicalDataManager.findGraphNode(
-								diagram, e);
-						if (node != null) {
-							oldNodes.add(node);
-						}
-					} else if (isUIGraphNode(baseNode)) {
-						GraphNode node = findUIGraphNode(diagram, baseNode
-								.getGuid());
-						if (node != null) {
-							oldNodes.add(node);
-						}
-					}
-				}
-
-				// // remove all the GraphEdges of the old nodes
-				// //
-				// List removeEdges = new ArrayList();
-				// for (Iterator iter = oldNodes.iterator(); iter.hasNext();) {
-				// GraphNode node = (GraphNode) iter.next();
-				// for (Iterator iterator = node.getContained().iterator();
-				// iterator.hasNext();) {
-				// Object element = iterator.next();
-				// if(element instanceof GraphEdge) {
-				// removeEdges.add(element);
-				// }
-				// }
-				// }
-				// if(!removeEdges.isEmpty()) {
-				// for (Iterator iter = removeEdges.iterator(); iter
-				// .hasNext();) {
-				// GraphicalDataManager.getInstance().removeGraphEdge((GraphEdge)
-				// iter.next());
-				// }
-				// }
-
-				// remove old nodes
-				//
-				diagram.getContained().removeAll(oldNodes);
-
-				// remove unused old UI nodes && nodes of contributor/replacer
-				for (Iterator iter = diagram.getContained().iterator(); iter
-						.hasNext();) {
-					GraphNode node = (GraphNode) iter.next();
-					if (isUIGraphNode(node)
-							&& node.getBriefDescription() != null
-							&& node.getBriefDescription().length() > 0
-					// && node.getContained().isEmpty()
-					) {
-						iter.remove();
-					} else {
-						SemanticModelBridge bridge = node.getSemanticModel();
-						if (bridge instanceof UMASemanticModelBridge) {
-							MethodElement e = ((UMASemanticModelBridge) bridge)
-									.getElement();
-							if (e instanceof Activity
-									&& ((Activity) e)
-											.getVariabilityBasedOnElement() != null) {
-								iter.remove();
-							}
-						}
-					}
-				}
-
-				// replace associated base element with contributing/replacing
-				// element
-				//
-				for (Iterator iter = act.getBreakdownElements().iterator(); iter
-						.hasNext();) {
-					Object element = iter.next();
-					if (element instanceof Activity) {
-						VariabilityElement baseElement = ((Activity) element)
-								.getVariabilityBasedOnElement();
-						GraphNode node = GraphicalDataManager.findGraphNode(
-								copy, baseElement);
-						if (node != null) {
-							UMASemanticModelBridge bridge = (UMASemanticModelBridge) node
-									.getSemanticModel();
-							bridge.setElement((MethodElement) element);
-						}
-					}
-				}
-
-				// add new nodes
-				//
-				diagram.getContained().addAll(copy.getContained());
-
-				break;
-			}
-			default: {
-				Diagram baseDiagram = GraphicalDataManager.getInstance()
-						.getUMADiagram(base, diagramType, false);
-				if (baseDiagram == null)
-					return false;
-				List oldNodes = new ArrayList();
-				Diagram copy = copyDiagram(baseDiagram);
-				for (Iterator iter = baseDiagram.getContained().iterator(); iter
-						.hasNext();) {
-					GraphNode baseNode = (GraphNode) iter.next();
-					modelBridge = baseNode.getSemanticModel();
-					if (modelBridge instanceof UMASemanticModelBridge) {
-						// this is a element's node
-						MethodElement e = ((UMASemanticModelBridge) modelBridge)
-								.getElement();
-						GraphNode node = GraphicalDataManager.findGraphNode(
-								diagram, e);
-						if (node != null) {
-							oldNodes.add(node);
-						}
-					}
-				}
-
-				// remove old nodes
-				//
-				diagram.getContained().removeAll(oldNodes);
-
-				// add new nodes
-				//
-				diagram.getContained().addAll(copy.getContained());
-
-				break;
-			}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param diagram
-	 * @param baseGuid
-	 *            the GUID of the base UI GraphNode
-	 * @return
-	 */
-	private static GraphNode findUIGraphNode(Diagram diagram, String baseGuid) {
-		for (Iterator iter = diagram.getContained().iterator(); iter.hasNext();) {
-			GraphNode node = (GraphNode) iter.next();
-			if (isUIGraphNode(node)
-					&& baseGuid.equals(node.getBriefDescription())) {
-				return node;
-			}
-		}
-		return null;
-	}
-
-	public static boolean isUIGraphNode(GraphNode gNode) {
-		SemanticModelBridge modelBridge = gNode.getSemanticModel();
-		if (modelBridge instanceof SimpleSemanticModelElement) {
-			String typeInfo = ((SimpleSemanticModelElement) modelBridge)
-					.getTypeInfo();
-			if (typeInfo.equals(GRAPH_NODE_DECISION)
-					|| typeInfo.equals(GRAPH_NODE_END)
-					|| typeInfo.equals(GRAPH_NODE_START)
-					|| typeInfo.equals(GRAPH_NODE_SYNCH_BAR)
-					|| typeInfo.equals(GRAPH_NODE_FREE_TEXT)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public static Diagram copyDiagram(Diagram baseDiagram) {
-		Diagram copy = (Diagram) TngUtil.copy(baseDiagram);
-
-		// HACK:
-		// go thru the nodes of the diagram copy, if any node is a UI-only node
-		// (see TypedNode)
-		// save the GUID of the original one in its briefDescription to remember
-		// who is base.
-		//
-		int size = copy.getContained().size();
-		for (int i = 0; i < size; i++) {
-			GraphNode gNode = (GraphNode) copy.getContained().get(i);
-			if (GraphicalDataHelper.isUIGraphNode(gNode)) {
-				gNode.setBriefDescription(((DiagramElement) baseDiagram
-						.getContained().get(i)).getGuid());
-			}
-		}
-
-		return copy;
-	}
-
-	/**
-	 * Gets all diagrams of this activities.
-	 * 
-	 * @param selectedActivity
-	 * @return
-	 */
-	public static Collection getDiagrams(Activity act) {
-		return getDiagrams(act, false);
-	}
-
-	public static Collection getDiagrams(Activity act, boolean create) {
-		ArrayList diagrams = new ArrayList();
-		for (int i = 0; i < DIAGRAM_TYPES.length; i++) {
-			Diagram diagram = GraphicalDataManager.getInstance().getUMADiagram(
-					act, DIAGRAM_TYPES[i], create);
-			if (diagram != null) {
-				diagrams.add(diagram);
-			}
-		}
-		return diagrams;
-	}
-
-	public static String getDiagramTypeText(Diagram diagram) {
-		int type = GraphicalDataManager.getInstance().getDiagramType(diagram);
-		if (type != -1) {
-			return DIAGRAM_TYPE_TEXTS[type];
-		}
-		return DiagramResources.type_unknown; 
-	}
-
-	/**
-	 * Sets or unsets suppressed flag of all diagrams in the given process
-	 * 
-	 * @param proc
-	 */
-	public static void setAllDiagramSuppressed(Process proc, boolean suppressed) {
-		Iterator iter = new AbstractTreeIterator(proc) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = -618949014476371114L;
-
-			protected Iterator getChildren(Object object) {
-				Activity act = (Activity) object;
-				ArrayList children = new ArrayList();
-				for (Iterator iterator = act.getBreakdownElements().iterator(); iterator
-						.hasNext();) {
-					Object element = iterator.next();
-					if (element instanceof Activity) {
-						children.add(element);
-					}
-				}
-				return children.iterator();
-			}
-
-		};
-
-		while (iter.hasNext()) {
-			Collection diagrams = getDiagrams((Activity) iter.next(),
-					suppressed);
-			for (Iterator iterator = diagrams.iterator(); iterator.hasNext();) {
-				Diagram diagram = (Diagram) iterator.next();
-				diagram.setSuppressed(Boolean.valueOf(suppressed));
-			}
-		}
-	}
-
-	// public static boolean removeUMAPoint(Collection umaPoints, int x, int y)
-	// {
-	// for (Iterator iter = umaPoints.iterator(); iter.hasNext();) {
-	// org.eclipse.epf.uma.Point p = (org.eclipse.epf.uma.Point) iter.next();
-	// if(p.getX().intValue() == x && p.getY().intValue() == y) {
-	// iter.remove();
-	// return true;
-	// }
-	// }
-	// return false;
-	// }
-
-	public static void removeLink(Link link) {
-		Node sourceNode = link.getSource();
-		Node targetNode = link.getTarget();
-		boolean srcNotify = sourceNode != null ? sourceNode.eDeliver() : false;
-		boolean targetNotify = targetNode != null ? targetNode.eDeliver()
-				: false;
-		try {
-			if (sourceNode != null) {
-				sourceNode.eSetDeliver(false);
-			}
-			if (targetNode != null) {
-				targetNode.eSetDeliver(false);
-			}
-			link.setSource(null);
-			link.setTarget(null);
-		} finally {
-			if (sourceNode != null) {
-				sourceNode.eSetDeliver(srcNotify);
-			}
-			if (targetNode != null) {
-				targetNode.eSetDeliver(targetNotify);
-			}
-		}
-	}
-
-	/**
-	 * Finds the object or its wrapper in the given collection
-	 * 
-	 * @param allElements
-	 * @param e
-	 * @return
-	 */
-	public static Object findElement(Collection allElements, Object e) {
-		for (Iterator iter = allElements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (e == TngUtil.unwrap(element)) {
-				return element;
-			}
-			// If object (e) is a workproduct descriptor( sub-artifact)
-			// passed collection donot have wrapper for sub-artifact, check the
-			// container artifact's wrapper.
-			//https://bugs.eclipse.org/bugs/show_bug.cgi?id=155914
-			if(element instanceof WorkProductDescriptorWrapperItemProvider){
-				Object childElement = findElement(((WorkProductDescriptorWrapperItemProvider)element).getChildren(element), e);
-				if(childElement != null){
-					return childElement;
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * Method to check if any duplicate predecessor in the predecessors list of
-	 * WorkBreakdownElement.
-	 */
-	public static boolean anyDuplicatePredecessors(WorkBreakdownElement e) {
-		List list = new ArrayList();
-		List predlist = new ArrayList();
-		getPreds(e, predlist);
-		for (Iterator itor = predlist.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (!list.contains(obj)) {
-				list.add(obj);
-			} else {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * Utility method to get all the predecessors activities instead of
-	 * workorders.
-	 */
-	public static void getPreds(WorkBreakdownElement e, List list) {
-		List predlist = e.getLinkToPredecessor();
-		for (Iterator itor = predlist.iterator(); itor.hasNext();) {
-			WorkOrder workorder = (WorkOrder) itor.next();
-			list.add(workorder.getPred());
-		}
-	}
-
-	/*
-	 * Method to check before deleting a link. If duplicate predecessor exists
-	 * in the legacy data, check if deleting link should remove all the
-	 * predecessors or not by verifying if target or indirect target have direct
-	 * or indirect links.
-	 */
-	public static boolean canRemoveAllPreds(Link link, Node oldSource,
-			Node oldTarget) {
-
-		if (oldTarget instanceof WorkBreakdownElementNode) {
-			List inlist = oldTarget.getIncomingConnections();
-			for (Iterator itor = inlist.iterator(); itor.hasNext();) {
-				Link incominglink = (Link) itor.next();
-				// RATLC00384245 : Predecessor changes should be done only in
-				// case of Synchronization Bar.
-				if (incominglink.getSource() instanceof TypedNode
-						&& ((TypedNode) incominglink.getSource()).getType() == TypedNode.SYNCH_BAR) {
-					Collection col = GraphicalDataHelper.getSourceNodes(
-							(TypedNode) incominglink.getSource(),
-							WorkBreakdownElementNode.class);
-					if (col.contains(oldSource)) {
-						return false;
-					}
-				} else if (incominglink.getSource() instanceof WorkBreakdownElementNode) {
-					if (incominglink.getSource().equals(oldSource))
-						return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * Method to get the sources of SyncBar inComming connections
-	 * and if syncbar have incoming connection from decision point, 
-	 * and decision point have incomming connections (workbreaddown elemtns)
-	 * collections will ignore all the incoming connection from decision point.  
-	 * @return
-	 */
-	public static void getSyncBarSourceNodes(TypedNode typedNode, Collection actNodes){
-		for (Iterator iter = typedNode.getIncomingConnections().iterator(); iter.hasNext();) {
-				Link link = (Link) iter.next();
-				Node source = link.getSource();
-				if(source instanceof WorkBreakdownElementNode){
-					actNodes.add(source);
-				}else if(source instanceof TypedNode){
-					if(((TypedNode)source).getType() == TypedNode.SYNCH_BAR)
-						getSyncBarSourceNodes((TypedNode)source,actNodes);
-				}
-		}
-	}
-	/*
-	 * Method to collect synchronization bar outgoing connection
-	 * except any connection going from decision points.  
-	 */
-	public static void getSyncBarTargetNodes(TypedNode typedNode, Collection actNodes){
-		for (Iterator iter = typedNode.getOutgoingConnections().iterator(); iter.hasNext();) {
-				Link link = (Link) iter.next();
-				Node target = link.getTarget();
-				if(target instanceof WorkBreakdownElementNode){
-					actNodes.add(target);
-				}else if(target instanceof TypedNode){
-					if(((TypedNode)target).getType() == TypedNode.SYNCH_BAR)
-						getSyncBarTargetNodes((TypedNode)target, actNodes);
-				}
-		}
-	}
-	
-	public static Node findNode(NodeContainer container, Object object, Class nodeType) {
-		for (Iterator iter = container.getNodes().iterator(); iter.hasNext();) {
-			Node element = (Node) iter.next();
-			if (object == element.getObject() && nodeType.isInstance(element)) {
-				return element;
-			}
-		}
-		return null;
-	}
-	
-
-	/**
-	 * Convenient method to add a property to GraphNode property list
-	 * (UmaPackage.GRAPH_NODE__PROPERTY) Verifies property exists or not, if not
-	 * creates a property with given key and value. and set into graph node
-	 * property list, if exists just sets value for property.
-	 * 
-	 * @param graphNode
-	 * @param key
-	 * @param value
-	 * @return Property
-	 * @author skannoor
-	 */
-	public static Property createProperty(GraphNode graphNode, String key,
-			String value) {
-		Property property = null;
-		if (graphNode != null) {
-			property = findProperty(graphNode, key);
-		}
-		if (property == null) {
-			property = UmaFactory.eINSTANCE.createProperty();
-			property.setKey(key);
-			property.setValue(value);
-			List list = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-			if (list == null) {
-				list = new ArrayList();
-				graphNode.set(UmaPackage.GRAPH_NODE__PROPERTY, list);
-			}
-			list.add(property);
-		} else {
-			property.setValue(value);
-		}
-		return property;
-	}
-	
-	/**
-	 * Accesible method for ActivityDetailDiagram, to get a autolayout flag from
-	 * GraphhNode property list. return string can be
-	 * GraphicalDataHelper.PROP_AUTOLAYOUT_VALUE_TRUE,
-	 * GraphicalDataHelper.PROP_AUTOLAYOUT_VALUE_FALSE, or null.
-	 * 
-	 * @param diagram
-	 * @return String
-	 */
-	public static String getAutoLayoutFlag(ActivityDetailDiagram diagram) {
-		String flag = null;
-		GraphNode graphNode = diagram.getGraphNode();
-		if (graphNode != null) {
-			List propList = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-			if (propList != null && propList.size() > 0) {
-				Property property = GraphicalDataHelper.findProperty(graphNode,
-						GraphicalDataHelper.PROP_AUTO_LAYOUT);
-				if (property != null) {
-					flag = property.getValue();
-				}
-			}
-		}
-		return flag;
-	}
-	
-	public static boolean isAutoLayout(ActivityDetailDiagram diagram){
-		GraphNode graphNode = diagram.getGraphNode();
-		if(graphNode != null){
-			List propList = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-			if(propList != null && propList.size() > 0){
-				Property property = GraphicalDataHelper.findProperty(
-					graphNode, GraphicalDataHelper.PROP_AUTO_LAYOUT);
-				if(property != null){
-					String temp = property.getValue();
-					if(temp != null && temp != "" &&  //$NON-NLS-1$
-							(GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_TRUE.equals(temp)
-									|| GraphicalDataHelper.PROP_AUTO_LAYOUT_VALUE_FALSE.equals(temp))){
-						return new Boolean(temp).booleanValue();
-					}
-				}
-			}
-		}
-		return false;
-	}
-	
-	public static int getTasksPerRow(){
-		String count = LibraryEditPlugin.getDefault().getPreferenceStore()
-				.getString(GraphicalDataHelper.ADD_DIAGRAM_TASKS_PER_ROW);
-		if (count != null && count.length() > 0) {
-			try {
-				int i = Integer.parseInt(count);
-				return i;
-			} catch (NumberFormatException ne) {
-				return 10;
-			}
-		}
-		return 10;
-	}
-
-	/**
-	 * @param list the list of {@link Property} objects
-	 * @param key
-	 * @return
-	 */
-	public static Property getPropertyByKey(List list, String key) {
-		if (!list.isEmpty()) {
-			for (Iterator iror = list.iterator(); iror.hasNext();) {
-				Property property = (Property) iror.next();
-				if (property != null) {
-					if (property.getKey().equals(key)) {
-						return property;
-					}
-//						else {
-//						return null;
-//					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public static Property getProperty(Node node, String key) {
-		GraphNode graphNode = node.getGraphNode();
-		if (graphNode != null) {
-			List list = graphNode.getProperty();
-			if (list != null && !list.isEmpty()) {
-				for (int i = list.size() - 1; i > -1; i--) {
-					Property prop = (Property) list.get(i);
-					if (key.equals(prop.getKey())) {
-						return prop;
-					}
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/GraphicalDataManager.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/GraphicalDataManager.java
deleted file mode 100644
index cf4d97b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/GraphicalDataManager.java
+++ /dev/null
@@ -1,646 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.library.edit.ICommandListener;
-import org.eclipse.epf.library.edit.process.command.VaryActivityCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * Diagram data stored in UMA: SemanticModelBridge .Presentation diagram type,
- * its value can be one of following constants defined in GraphicalDataHelper
- * DIAGRAM_WORKFLOW, DIAGRAM_WORK_PRODUCT_DEPENDENCY, DIAGRAM_ACTIVITY_DETAIL
- * 
- * UMASemanticModelBridge .Element BreakdownElement that the DiagramElement of
- * this SemanticModelBridge represents
- * 
- * SimpleSemanticModelElement .TypeInfo type information for TypedNode, its
- * value can be one of the constants defined in GraphicalDataHelper
- * wpCompositeType WorkProductComposite type
- * 
- * DiagramElement .Property (list of properties)
- * 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class GraphicalDataManager {
-	private static final String[] diagramPresentations = new String[] {
-			GraphicalDataHelper.DIAGRAM_WORKFLOW,
-			GraphicalDataHelper.DIAGRAM_WORK_PRODUCT_DEPENDENCY,
-			GraphicalDataHelper.DIAGRAM_ACTIVITY_DETAIL };
-
-	private static final Class[] childTypes = new Class[] { Activity.class,
-			WorkProductDescriptor.class, Descriptor.class };
-
-	private static final Class[] diagramChangeListenerClasses = new Class[] {
-			IActivityDiagramChangeListener.class,
-			IWPDDiagramChangeListener.class,
-			IActivityDetailDiagramChangeListener.class };
-
-	private static GraphicalDataManager instance = null;
-
-	//private Map graphicalDataMap = new HashMap();
-
-	private List<ICommandListener> commandListeners;
-
-	private GraphicalDataManager() {
-	}
-
-	public static GraphicalDataManager getInstance() {
-		if (instance == null) {
-			synchronized (GraphicalDataManager.class) {
-				if (instance == null) {
-					instance = new GraphicalDataManager();
-				}
-			}
-		}
-		return instance;
-	}
-
-	// public GraphNode getGraphNode(Activity act, int diagramType, Activity
-	// parent) {
-	// // ItemProviderAdapter adapter = (ItemProviderAdapter)
-	// TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory().adapt(act,
-	// ITreeItemContentProvider.class);
-	// // Object parent = adapter.getParent(act);
-	// // if(parent instanceof Activity) {
-	// if(parent == null) {
-	// // new Activity
-	// //
-	// return createGraphNode(act);
-	// }
-	// if(!act.getSuperActivities().contains(parent)) {
-	// throw new IllegalArgumentException("Invalid super activity for " + act +
-	// ": " + parent);
-	// }
-	// Activity parentAct = (Activity) parent;
-	// Diagram diagram = getDiagram(parentAct, diagramType).getUMADiagram();
-	// return getGraphNode(diagram, act);
-	// }
-
-	/**
-	 * Gets the GraphNode of the given method element for the given diagram.
-	 * Create the GraphNode if it does not exist yet.
-	 * 
-	 * @param diagram
-	 * @param methodElement
-	 * @return
-	 */
-	public GraphNode getGraphNode(Diagram diagram, MethodElement methodElement) {
-		if (diagram == null) {
-			// new MethodElement
-			//
-			return createGraphNode(methodElement);
-		}
-		GraphNode node = findGraphNode(diagram, methodElement);
-		if (node == null) {
-			node = createGraphNode(methodElement);
-			createGraphConnectors(node, diagram);
-			diagram.getContained().add(node);
-		}
-		return node;
-	}
-
-	public static GraphNode findGraphNode(Diagram diagram, Object methodElement) {
-		for (Iterator iter = diagram.getContained().iterator(); iter.hasNext();) {
-			GraphNode element = (GraphNode) iter.next();
-			if (element.getSemanticModel() instanceof UMASemanticModelBridge
-					&& methodElement == ((UMASemanticModelBridge) element
-							.getSemanticModel()).getElement()) {
-				return element;
-			}
-		}
-		return null;
-	}
-
-	// public DiagramElement getDiagramElement(Object object) {
-	// if(object instanceof Activity) {
-	// return getGraphNode((Activity) object);
-	// }
-	// else if(object instanceof WorkOrder) {
-	// WorkOrder workOrder = (WorkOrder) object;
-	// BreakdownElement be = workOrder.getPred();
-	// if(be instanceof Activity) {
-	// GraphNode graphNode = getGraphNode((Activity) be);
-	// List list = graphNode.getContained();
-	// Polyline polyline = null;
-	// for(int i = 0; i < list.size(); i++) {
-	// Object obj = list.get(i);
-	// if(obj instanceof Polyline) {
-	// polyline = (Polyline) obj;
-	// break;
-	// }
-	// }
-	// if(polyline == null) {
-	// polyline = UmaFactory.eINSTANCE.createPolyline();
-	// list.add(0, polyline);
-	// }
-	// return polyline;
-	// }
-	// }
-	// return null;
-	// }
-
-	/**
-	 * @param object
-	 * @return
-	 */
-	private Diagram createDiagram(Activity act, int diagramType) {
-		// check if this activity contributes/extends other activity and try
-		// copy
-		// the existing diagram from the base
-		//
-		if (ProcessUtil.isExtendingOrLocallyContributing(act)) {
-			Diagram baseDiagram = getUMADiagram((Activity) act
-					.getVariabilityBasedOnElement(), diagramType, false);
-			if (baseDiagram != null) {
-				Diagram copy = GraphicalDataHelper.copyDiagram(baseDiagram);
-
-				UMASemanticModelBridge modelBridge = (UMASemanticModelBridge) copy
-						.getSemanticModel();
-				modelBridge.setElement(act);
-				return copy;
-			}
-		}
-
-		Diagram diagram = UmaFactory.eINSTANCE.createDiagram();
-		UMASemanticModelBridge modelBridge = UmaFactory.eINSTANCE
-				.createUMASemanticModelBridge();
-		modelBridge.setElement(act);
-		modelBridge.setPresentation(diagramPresentations[diagramType]);
-		diagram.setSemanticModel(modelBridge);
-
-		// getDiagram(act, diagramType).setUMADiagram(diagram);
-
-		populateDiagram(diagram, act, diagramType);
-
-		return diagram;
-	}
-
-	private void populateDiagram(Diagram diagram, Activity act, int diagramType) {
-		// create GraphNode for each BreakdownElement and add it to the diagram
-		//
-		List nodes = new ArrayList();
-		for (Iterator iter = act.getBreakdownElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (childTypes[diagramType].isInstance(element)) {
-				GraphNode node = createGraphNode((MethodElement) element);
-				diagram.getContained().add(node);
-				nodes.add(node);
-			}
-		}
-
-		// create GraphConnectors for each BreakdownElement
-		//
-		for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-			GraphNode node = (GraphNode) iter.next();
-			createGraphConnectors(node, diagram, diagramType);
-		}
-	}
-
-//	private void populateActivityDiagram(Diagram diagram, Activity act) {
-//		// create GraphNode for each child activity and add it to the diagram
-//		// 
-//		List nodes = new ArrayList();
-//		for (Iterator iter = act.getBreakdownElements().iterator(); iter
-//				.hasNext();) {
-//			Object element = (Object) iter.next();
-//			if (element instanceof Activity) {
-//				Activity childAct = (Activity) element;
-//				GraphNode node = createGraphNode(childAct);
-//				diagram.getContained().add(node);
-//				nodes.add(node);
-//			}
-//		}
-//
-//		// create GraphConnectors for each child activity
-//		//
-//		for (Iterator iter = nodes.iterator(); iter.hasNext();) {
-//			GraphNode node = (GraphNode) iter.next();
-//			createGraphConnectors(node, diagram);
-//		}
-//	}
-
-	/**
-	 * @param act
-	 * @param diagramType
-	 * @return
-	 */
-	public IDiagramChangeListener getDiagramChangeListener(Activity act,
-			int diagramType) {
-		for (Iterator iter = act.eAdapters().iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if (diagramChangeListenerClasses[diagramType].isInstance(element)) {
-				return (IDiagramChangeListener) element;
-			}
-		}
-
-		return null;
-	}
-
-	public GraphNode createGraphNode(MethodElement element) {
-		GraphNode graphNode = UmaFactory.eINSTANCE.createGraphNode();
-		UMASemanticModelBridge modelBridge = UmaFactory.eINSTANCE
-				.createUMASemanticModelBridge();
-		modelBridge.setElement(element);
-		graphNode.setSemanticModel(modelBridge);
-		org.eclipse.epf.uma.Point point = UmaFactory.eINSTANCE.createPoint();
-		point.setX(new Double(-1));
-		point.setY(new Double(-1));
-		graphNode.setPosition(point);
-		org.eclipse.epf.uma.Dimension dim = UmaFactory.eINSTANCE.createDimension();
-		dim.setWidth(new Double(-1));
-		dim.setHeight(new Double(-1));
-		graphNode.setSize(dim);
-
-		return graphNode;
-	}
-
-	public GraphEdge addGraphConnectorPair(Diagram diagram,
-			GraphNode graphNode, WorkOrder element) {
-		GraphConnector srcConnector = UmaFactory.eINSTANCE
-				.createGraphConnector();
-		graphNode.getAnchorage().add(srcConnector);
-		GraphEdge edge = UmaFactory.eINSTANCE.createGraphEdge();
-		UMASemanticModelBridge bridge = UmaFactory.eINSTANCE
-				.createUMASemanticModelBridge();
-		bridge.setElement(element);
-		edge.setSemanticModel(bridge);
-		graphNode.getContained().add(edge);
-		edge.getAnchor().add(srcConnector);
-
-		GraphNode succNode = getGraphNode(diagram, UmaUtil
-				.getOwningActivity(element));
-		GraphConnector targetConnector = UmaFactory.eINSTANCE
-				.createGraphConnector();
-		succNode.getAnchorage().add(targetConnector);
-		edge.getAnchor().add(targetConnector);
-		return edge;
-	}
-
-	public GraphEdge addGraphConnectorPair(GraphNode srcNode,
-			GraphNode targetNode) {
-		GraphConnector srcConnector = UmaFactory.eINSTANCE
-				.createGraphConnector();
-		srcNode.getAnchorage().add(srcConnector);
-		GraphEdge edge = UmaFactory.eINSTANCE.createGraphEdge();
-		srcNode.getContained().add(edge);
-		edge.getAnchor().add(srcConnector);
-
-		GraphConnector targetConnector = UmaFactory.eINSTANCE
-				.createGraphConnector();
-		targetNode.getAnchorage().add(targetConnector);
-		edge.getAnchor().add(targetConnector);
-		return edge;
-	}
-
-	public void removeGraphEdge(GraphEdge edge) {
-		EcoreUtil.remove(edge);
-		for (Iterator iter = edge.getAnchor().iterator(); iter.hasNext();) {
-			GraphConnector conn = (GraphConnector) iter.next();
-			EcoreUtil.remove(conn);
-		}
-	}
-
-	// public void removeGraphConnectorPair(GraphNode srcNode, GraphNode
-	// targetNode) {
-	// // find the source GraphConnector and remove it, its GraphEdge, and its
-	// target GraphConnector
-	// //
-	// for (Iterator iter = srcNode.getAnchorage().iterator(); iter.hasNext();)
-	// {
-	// GraphConnector connector = (GraphConnector) iter.next();
-	// for (Iterator iterator = connector.getGraphEdge().iterator(); iterator
-	// .hasNext();) {
-	// GraphEdge edge = (GraphEdge) iterator.next();
-	// Object targetConnector = edge.getAnchor().get(1);
-	// if(targetNode.getAnchorage().remove(targetConnector)) {
-	// srcNode.getContained().remove(edge);
-	// // don't remove the edge from connector to support undo
-	// //
-	// // iterator.remove();
-	// }
-	// }
-	// if(connector.getGraphEdge().isEmpty()) {
-	// iter.remove();
-	// }
-	// }
-	// }
-
-	public void removeGraphConnectionPair(GraphNode graphNode,
-			WorkOrder workOrder) {
-		for (Iterator iter = graphNode.getAnchorage().iterator(); iter
-				.hasNext();) {
-			GraphConnector conn = (GraphConnector) iter.next();
-			GraphEdge edge = (GraphEdge) conn.getGraphEdge().get(0);
-			if (edge.eContainer() == graphNode) {
-				GraphConnector conn2 = (GraphConnector) edge.getAnchor().get(1);
-				SemanticModelBridge bridge = conn2.getGraphElement()
-						.getSemanticModel();
-				if (bridge instanceof UMASemanticModelBridge
-						&& ((UMASemanticModelBridge) bridge).getElement() == UmaUtil
-								.getOwningActivity(workOrder)) {
-					conn2.getGraphElement().getAnchorage().remove(conn2);
-					iter.remove();
-					graphNode.getContained().remove(edge);
-					return;
-				}
-			}
-		}
-	}
-
-	private void createGraphConnectors(GraphNode graphNode, Diagram diagram) {
-		createGraphConnectors(graphNode, diagram, getDiagramType(diagram));
-	}
-
-	int getDiagramType(Diagram diagram) {
-		String typeStr = diagram.getSemanticModel().getPresentation();
-		for (int i = 0; i < diagramPresentations.length; i++) {
-			if (diagramPresentations[i].equals(typeStr))
-				return i;
-		}
-		return -1;
-	}
-
-	private void createGraphConnectors(GraphNode graphNode, Diagram diagram,
-			int diagramType) {
-		MethodElement e = ((UMASemanticModelBridge) graphNode
-				.getSemanticModel()).getElement();
-		switch (diagramType) {
-		case GraphicalDataHelper.ACTIVITY_DIAGRAM:
-			if (e instanceof Activity) {
-				Activity act = (Activity) e;
-				// create connectors
-				//
-				// List list = act.getLinkToPredecessor();
-				// int size = list.size();
-				//				
-				// Activity parent = (Activity)
-				// ((UMASemanticModelBridge)diagram.getSemanticModel()).getElement();
-				// List breakdownElements = parent.getBreakdownElements();
-				// for(int i = 0; i < size; i++) {
-				// WorkOrder workOrder = (WorkOrder) list.get(i);
-				// if(breakdownElements.contains(workOrder.getPred())) {
-				// addGraphConnectorPair(diagram, graphNode, workOrder);
-				// }
-				// }
-
-				for (Iterator iter = act.getLinkToPredecessor().iterator(); iter
-						.hasNext();) {
-					WorkOrder workOrder = (WorkOrder) iter.next();
-					GraphNode srcNode = findGraphNode(diagram, workOrder
-							.getPred());
-					if (srcNode != null) {
-						addGraphConnectorPair(srcNode, graphNode);
-					}
-				}
-			}
-
-			break;
-		case GraphicalDataHelper.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			if (e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor descriptor = (WorkProductDescriptor) e;
-				for (Iterator iter = descriptor.getImpacts().iterator(); iter
-						.hasNext();) {
-					WorkProductDescriptor impactedDescriptor = (WorkProductDescriptor) iter
-							.next();
-					GraphNode targetNode = GraphicalDataManager.findGraphNode(
-							diagram, impactedDescriptor);
-					if (targetNode != null) {
-						addGraphConnectorPair(graphNode, targetNode);
-					}
-				}
-			}
-
-			break;
-		}
-
-	}
-
-	/**
-	 * Gets the UMA diagram from the UMA model for the given activity.
-	 * 
-	 * @param e
-	 * @param diagramType
-	 *            one of the diagram type constants defined in
-	 *            {@link GraphicalDataHelper GraphicalDataHelper }
-	 * @param create
-	 *            if true, new UMA diagram will be created if the activity does
-	 *            not have one already.
-	 * @return
-	 * @see GraphicalDataHelper#ACTIVITY_DIAGRAM
-	 * @see GraphicalDataHelper#ACTIVITY_DETAIL_DIAGRAM
-	 * @see GraphicalDataHelper#WORK_PRODUCT_DEPENDENCY_DIAGRAM
-	 */
-	public Diagram getUMADiagram(Activity e, int diagramType, boolean create) {
-		Diagram diagram = null;
-
-		// // look for IDiagramChangeListener in activity's adapter list first
-		// IDiagramChangeListener listener = (IDiagramChangeListener)
-		// UmaUtil.getAdapter(e, diagramListenerType);
-		// if(listener != null) {
-		// diagram = listener.getDiagram().getUMADiagram();
-		// if(diagram != null) return diagram;
-		// }
-
-		Object container = e.eContainer();
-		if (container != null) {
-			ProcessPackage pkg = (ProcessPackage) container;
-			for (Iterator iter = pkg.getDiagrams().iterator(); iter.hasNext();) {
-				diagram = (Diagram) iter.next();
-				SemanticModelBridge modelBridge = diagram.getSemanticModel();
-				if (modelBridge != null
-						&& modelBridge instanceof UMASemanticModelBridge
-						&& e == ((UMASemanticModelBridge) modelBridge)
-								.getElement()
-						&& diagramPresentations[diagramType]
-								.equals(((UMASemanticModelBridge) modelBridge)
-										.getPresentation())) {
-					return diagram;
-				}
-			}
-		}
-
-		if (create) {
-			// could not find it, create new one
-			//
-			diagram = createDiagram(e, diagramType);
-			if (container != null) {
-				((ProcessPackage) container).getDiagrams().add(diagram);
-			}
-			return diagram;
-		}
-		return null;
-	}
-
-	// public Diagram getUMADiagram(Activity act, int diagramType) {
-	// Diagram diagram = null;
-	//        
-	// // look for IDiagramChangeListener in activity's adapter list first
-	// IDiagramChangeListener listener = getDiagramChangeListener(act,
-	// diagramType);
-	// if(listener != null) {
-	// diagram = listener.getDiagram().getUMADiagram();
-	// if(diagram != null) return diagram;
-	// }
-	// Object container = act.eContainer();
-	// if(container != null) {
-	// ProcessPackage pkg = (ProcessPackage) container;
-	// for (Iterator iter = pkg.getDiagrams().iterator(); iter.hasNext();) {
-	// diagram = (Diagram) iter.next();
-	// SemanticModelBridge modelBridge = diagram.getSemanticModel();
-	// if(modelBridge != null && modelBridge instanceof UMASemanticModelBridge
-	// && act == ((UMASemanticModelBridge)modelBridge).getElement()
-	// &&
-	// diagramPresentations[diagramType].equals(((UMASemanticModelBridge)modelBridge).getPresentation()))
-	// {
-	// return diagram;
-	// }
-	// }
-	// }
-	//        
-	// // could not find it, create new one
-	// //
-	// return createDiagram(act, diagramType);
-	// }
-
-	/**
-	 * @param act
-	 * @return
-	 */
-	public org.eclipse.epf.diagram.model.Diagram getDiagram(Activity act,
-			int diagramType) {
-		IDiagramChangeListener listener = getDiagramChangeListener(act,
-				diagramType);
-		return listener == null ? null : listener.getDiagram();
-	}
-
-	/**
-	 * Gets list of command listeners that will handle the diagram related changes of the commands of interesses
-	 * 
-	 * @return
-	 * @see ICommandListener
-	 */
-	public List<ICommandListener> getCommandListeners() {
-		if (commandListeners == null) {
-			commandListeners = new ArrayList<ICommandListener>();
-		}
-
-		commandListeners.add(new ICommandListener() {
-			
-			public void notifyExecuted(Command command) {
-				// get contributor/replacer of the activity
-				//
-				Activity act = (Activity) command.getResult().iterator().next();
-				Activity base = (Activity) act.getVariabilityBasedOnElement();
-				if (base != null) {
-					Activity parentAct = act.getSuperActivities();
-					Diagram diagram = getUMADiagram(parentAct,
-							GraphicalDataHelper.ACTIVITY_DIAGRAM, false);
-					if (diagram != null) {
-						// find existing node for base and link it to the
-						// contributore/replacer of the activity
-						//
-						GraphNode graphNode = findGraphNode(diagram, base);
-						if (graphNode != null) {
-							UMASemanticModelBridge bridge = (UMASemanticModelBridge) graphNode
-									.getSemanticModel();
-							if (bridge.getElement() != act) {
-								bridge.setElement(act);
-							}
-						}
-					}
-					
-					if(act.getVariabilityType() == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-						// copy diagrams and their publishing options
-						//
-						for (int i = 0; i < GraphicalDataHelper.DIAGRAM_TYPES.length; i++) {
-							int diagramType = GraphicalDataHelper.DIAGRAM_TYPES[i];
-							diagram = getUMADiagram(base, diagramType, false);
-							if (diagram != null) {
-								Diagram copy = getUMADiagram(act, diagramType, true);
-								copy.setSuppressed(diagram.getSuppressed());
-							}
-						}
-					}
-				}
-			}
-
-			public Class getCommandType() {
-				return VaryActivityCommand.class;
-			}
-
-			public void preUndo(Command command) {
-				// get old contributor/replacer of the activity
-				//
-				Activity act = (Activity) command.getResult().iterator().next();
-//				VaryActivityCommand cmd = (VaryActivityCommand) command;
-//				BreakdownElementWrapperItemProvider adapter = cmd.getWrapper();
-				VariabilityElement baseAct = act.getVariabilityBasedOnElement();
-				if (baseAct != null) {
-					Activity parentAct = act.getSuperActivities();
-					Diagram diagram = getUMADiagram(parentAct,
-							GraphicalDataHelper.ACTIVITY_DIAGRAM, false);
-					if (diagram != null) {
-						// find existing node for the old contributore/replacer
-						// old and relink it to the base activity
-						//
-						GraphNode graphNode = findGraphNode(diagram, act);
-						if (graphNode != null) {
-							UMASemanticModelBridge bridge = (UMASemanticModelBridge) graphNode
-									.getSemanticModel();
-							if (bridge.getElement() != baseAct) {
-								bridge.setElement(baseAct);
-							}
-						}
-					}
-				}
-			}
-
-			public void preExecute(Command command) {
-				
-			}
-
-			public void postUndo(Command command) {
-				// TODO Auto-generated method stub
-				
-			}
-
-		});
-
-		return commandListeners;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityDetailDiagramChangeListener.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityDetailDiagramChangeListener.java
deleted file mode 100644
index a70ea56..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityDetailDiagramChangeListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-/**
- * Diagram change listener for activity detail diagram
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IActivityDetailDiagramChangeListener extends
-		IDiagramChangeListener {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityDiagramChangeListener.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityDiagramChangeListener.java
deleted file mode 100644
index ba2adc2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityDiagramChangeListener.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-/**
- * Diagram change listener for activity diagram
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IActivityDiagramChangeListener extends IDiagramChangeListener {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityNodeChangeListener.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityNodeChangeListener.java
deleted file mode 100644
index 41cce32..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IActivityNodeChangeListener.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-/**
- * Node change listener for activity node
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IActivityNodeChangeListener extends INodeChangeListener {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IAdapterFactoryFilter.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IAdapterFactoryFilter.java
deleted file mode 100644
index a5b094c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IAdapterFactoryFilter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import org.eclipse.epf.library.edit.IAdapterFactoryProvider;
-import org.eclipse.epf.library.edit.IFilter;
-
-/**
- * Filter that provides adapter factories for different views of process
- * breakdown structure.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IAdapterFactoryFilter extends IFilter, IAdapterFactoryProvider {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IDiagramChangeListener.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IDiagramChangeListener.java
deleted file mode 100644
index eb189a8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IDiagramChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.epf.diagram.model.Diagram;
-
-/**
- * Adapter to listen to diagram changes
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IDiagramChangeListener extends Adapter {
-	Diagram getDiagram();
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/INodeChangeListener.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/INodeChangeListener.java
deleted file mode 100644
index 3480d05..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/INodeChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.epf.diagram.model.Node;
-
-/**
- * Adapter to listen to changes in diagram node
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface INodeChangeListener extends Adapter {
-	Node getNode();
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IWPDDiagramChangeListener.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IWPDDiagramChangeListener.java
deleted file mode 100644
index 1c602e5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/IWPDDiagramChangeListener.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-/**
- * Diagram change listener for work product dependency diagram.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IWPDDiagramChangeListener extends IDiagramChangeListener {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/ModelAdapterFactory.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/ModelAdapterFactory.java
deleted file mode 100644
index 7b84d8b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/ModelAdapterFactory.java
+++ /dev/null
@@ -1,433 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.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.epf.diagram.model.*;
-
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-
-
-/**
- * <!-- 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.epf.diagram.model.ModelPackage
- * @generated
- */
-public class ModelAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected static ModelPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ModelAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = ModelPackage.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 the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ModelSwitch<Adapter> modelSwitch =
-		new ModelSwitch<Adapter>() {
-			@Override
-			public Adapter caseDiagram(Diagram object) {
-				return createDiagramAdapter();
-			}
-			@Override
-			public Adapter caseLink(Link object) {
-				return createLinkAdapter();
-			}
-			@Override
-			public Adapter caseLinkedObject(LinkedObject object) {
-				return createLinkedObjectAdapter();
-			}
-			@Override
-			public Adapter caseNamedNode(NamedNode object) {
-				return createNamedNodeAdapter();
-			}
-			@Override
-			public Adapter caseNode(Node object) {
-				return createNodeAdapter();
-			}
-			@Override
-			public Adapter caseActivityDiagram(ActivityDiagram object) {
-				return createActivityDiagramAdapter();
-			}
-			@Override
-			public Adapter caseTypedNode(TypedNode object) {
-				return createTypedNodeAdapter();
-			}
-			@Override
-			public Adapter caseWorkProductDependencyDiagram(WorkProductDependencyDiagram object) {
-				return createWorkProductDependencyDiagramAdapter();
-			}
-			@Override
-			public Adapter caseWorkProductNode(WorkProductNode object) {
-				return createWorkProductNodeAdapter();
-			}
-			@Override
-			public Adapter caseActivityDetailDiagram(ActivityDetailDiagram object) {
-				return createActivityDetailDiagramAdapter();
-			}
-			@Override
-			public Adapter caseNodeContainer(NodeContainer object) {
-				return createNodeContainerAdapter();
-			}
-			@Override
-			public Adapter caseRoleNode(RoleNode object) {
-				return createRoleNodeAdapter();
-			}
-			@Override
-			public Adapter caseRoleTaskComposite(RoleTaskComposite object) {
-				return createRoleTaskCompositeAdapter();
-			}
-			@Override
-			public Adapter caseTaskNode(TaskNode object) {
-				return createTaskNodeAdapter();
-			}
-			@Override
-			public Adapter caseWorkProductDescriptorNode(WorkProductDescriptorNode object) {
-				return createWorkProductDescriptorNodeAdapter();
-			}
-			@Override
-			public Adapter caseWorkBreakdownElementNode(WorkBreakdownElementNode object) {
-				return createWorkBreakdownElementNodeAdapter();
-			}
-			@Override
-			public Adapter caseWorkProductComposite(WorkProductComposite object) {
-				return createWorkProductCompositeAdapter();
-			}
-			@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.epf.diagram.model.Diagram <em>Diagram</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.epf.diagram.model.Diagram
-	 * @generated
-	 */
-    public Adapter createDiagramAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.Link <em>Link</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.epf.diagram.model.Link
-	 * @generated
-	 */
-    public Adapter createLinkAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.LinkedObject <em>Linked Object</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.epf.diagram.model.LinkedObject
-	 * @generated
-	 */
-    public Adapter createLinkedObjectAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.NamedNode <em>Named Node</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.epf.diagram.model.NamedNode
-	 * @generated
-	 */
-    public Adapter createNamedNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.Node <em>Node</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.epf.diagram.model.Node
-	 * @generated
-	 */
-    public Adapter createNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.ActivityDiagram <em>Activity Diagram</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.epf.diagram.model.ActivityDiagram
-	 * @generated
-	 */
-    public Adapter createActivityDiagramAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.TypedNode <em>Typed Node</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.epf.diagram.model.TypedNode
-	 * @generated
-	 */
-    public Adapter createTypedNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.WorkProductDependencyDiagram <em>Work Product Dependency Diagram</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.epf.diagram.model.WorkProductDependencyDiagram
-	 * @generated
-	 */
-	public Adapter createWorkProductDependencyDiagramAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.WorkProductNode <em>Work Product Node</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.epf.diagram.model.WorkProductNode
-	 * @generated
-	 */
-	public Adapter createWorkProductNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.ActivityDetailDiagram <em>Activity Detail Diagram</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.epf.diagram.model.ActivityDetailDiagram
-	 * @generated
-	 */
-	public Adapter createActivityDetailDiagramAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.NodeContainer <em>Node Container</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.epf.diagram.model.NodeContainer
-	 * @generated
-	 */
-	public Adapter createNodeContainerAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.RoleNode <em>Role Node</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.epf.diagram.model.RoleNode
-	 * @generated
-	 */
-	public Adapter createRoleNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.RoleTaskComposite <em>Role Task Composite</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.epf.diagram.model.RoleTaskComposite
-	 * @generated
-	 */
-	public Adapter createRoleTaskCompositeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.TaskNode <em>Task Node</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.epf.diagram.model.TaskNode
-	 * @generated
-	 */
-	public Adapter createTaskNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.WorkProductDescriptorNode <em>Work Product Descriptor Node</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.epf.diagram.model.WorkProductDescriptorNode
-	 * @generated
-	 */
-	public Adapter createWorkProductDescriptorNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.WorkBreakdownElementNode <em>Work Breakdown Element Node</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.epf.diagram.model.WorkBreakdownElementNode
-	 * @generated
-	 */
-	public Adapter createWorkBreakdownElementNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.diagram.model.WorkProductComposite <em>Work Product Composite</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.epf.diagram.model.WorkProductComposite
-	 * @generated
-	 */
-	public Adapter createWorkProductCompositeAdapter() {
-		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;
-	}
-
-} //ModelAdapterFactory
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/ModelSwitch.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/ModelSwitch.java
deleted file mode 100644
index c2e88cd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/ModelSwitch.java
+++ /dev/null
@@ -1,533 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.model.*;
-
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.RoleNode;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.TaskNode;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkBreakdownElementNode;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.WorkProductDescriptorNode;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-
-
-/**
- * <!-- 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.epf.diagram.model.ModelPackage
- * @generated
- */
-public class ModelSwitch<T> {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected static ModelPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ModelSwitch() {
-		if (modelPackage == null) {
-			modelPackage = ModelPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * 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
-	 */
-    public T doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * 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
-	 */
-    protected T doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List<EClass> eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch(eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * 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
-	 */
-    protected T doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case ModelPackage.DIAGRAM: {
-				Diagram diagram = (Diagram)theEObject;
-				T result = caseDiagram(diagram);
-				if (result == null) result = caseNodeContainer(diagram);
-				if (result == null) result = caseNode(diagram);
-				if (result == null) result = caseLinkedObject(diagram);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.LINK: {
-				Link link = (Link)theEObject;
-				T result = caseLink(link);
-				if (result == null) result = caseLinkedObject(link);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.LINKED_OBJECT: {
-				LinkedObject linkedObject = (LinkedObject)theEObject;
-				T result = caseLinkedObject(linkedObject);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.NAMED_NODE: {
-				NamedNode namedNode = (NamedNode)theEObject;
-				T result = caseNamedNode(namedNode);
-				if (result == null) result = caseNode(namedNode);
-				if (result == null) result = caseLinkedObject(namedNode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.NODE: {
-				Node node = (Node)theEObject;
-				T result = caseNode(node);
-				if (result == null) result = caseLinkedObject(node);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.ACTIVITY_DIAGRAM: {
-				ActivityDiagram activityDiagram = (ActivityDiagram)theEObject;
-				T result = caseActivityDiagram(activityDiagram);
-				if (result == null) result = caseDiagram(activityDiagram);
-				if (result == null) result = caseNodeContainer(activityDiagram);
-				if (result == null) result = caseNode(activityDiagram);
-				if (result == null) result = caseLinkedObject(activityDiagram);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.TYPED_NODE: {
-				TypedNode typedNode = (TypedNode)theEObject;
-				T result = caseTypedNode(typedNode);
-				if (result == null) result = caseNode(typedNode);
-				if (result == null) result = caseLinkedObject(typedNode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.WORK_PRODUCT_DEPENDENCY_DIAGRAM: {
-				WorkProductDependencyDiagram workProductDependencyDiagram = (WorkProductDependencyDiagram)theEObject;
-				T result = caseWorkProductDependencyDiagram(workProductDependencyDiagram);
-				if (result == null) result = caseDiagram(workProductDependencyDiagram);
-				if (result == null) result = caseNodeContainer(workProductDependencyDiagram);
-				if (result == null) result = caseNode(workProductDependencyDiagram);
-				if (result == null) result = caseLinkedObject(workProductDependencyDiagram);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.WORK_PRODUCT_NODE: {
-				WorkProductNode workProductNode = (WorkProductNode)theEObject;
-				T result = caseWorkProductNode(workProductNode);
-				if (result == null) result = caseNamedNode(workProductNode);
-				if (result == null) result = caseNode(workProductNode);
-				if (result == null) result = caseLinkedObject(workProductNode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.ACTIVITY_DETAIL_DIAGRAM: {
-				ActivityDetailDiagram activityDetailDiagram = (ActivityDetailDiagram)theEObject;
-				T result = caseActivityDetailDiagram(activityDetailDiagram);
-				if (result == null) result = caseDiagram(activityDetailDiagram);
-				if (result == null) result = caseNodeContainer(activityDetailDiagram);
-				if (result == null) result = caseNode(activityDetailDiagram);
-				if (result == null) result = caseLinkedObject(activityDetailDiagram);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.NODE_CONTAINER: {
-				NodeContainer nodeContainer = (NodeContainer)theEObject;
-				T result = caseNodeContainer(nodeContainer);
-				if (result == null) result = caseNode(nodeContainer);
-				if (result == null) result = caseLinkedObject(nodeContainer);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.ROLE_NODE: {
-				RoleNode roleNode = (RoleNode)theEObject;
-				T result = caseRoleNode(roleNode);
-				if (result == null) result = caseNamedNode(roleNode);
-				if (result == null) result = caseNode(roleNode);
-				if (result == null) result = caseLinkedObject(roleNode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.ROLE_TASK_COMPOSITE: {
-				RoleTaskComposite roleTaskComposite = (RoleTaskComposite)theEObject;
-				T result = caseRoleTaskComposite(roleTaskComposite);
-				if (result == null) result = caseNodeContainer(roleTaskComposite);
-				if (result == null) result = caseNode(roleTaskComposite);
-				if (result == null) result = caseLinkedObject(roleTaskComposite);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.TASK_NODE: {
-				TaskNode taskNode = (TaskNode)theEObject;
-				T result = caseTaskNode(taskNode);
-				if (result == null) result = caseNamedNode(taskNode);
-				if (result == null) result = caseNode(taskNode);
-				if (result == null) result = caseLinkedObject(taskNode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.WORK_PRODUCT_DESCRIPTOR_NODE: {
-				WorkProductDescriptorNode workProductDescriptorNode = (WorkProductDescriptorNode)theEObject;
-				T result = caseWorkProductDescriptorNode(workProductDescriptorNode);
-				if (result == null) result = caseNamedNode(workProductDescriptorNode);
-				if (result == null) result = caseNode(workProductDescriptorNode);
-				if (result == null) result = caseLinkedObject(workProductDescriptorNode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.WORK_BREAKDOWN_ELEMENT_NODE: {
-				WorkBreakdownElementNode workBreakdownElementNode = (WorkBreakdownElementNode)theEObject;
-				T result = caseWorkBreakdownElementNode(workBreakdownElementNode);
-				if (result == null) result = caseNamedNode(workBreakdownElementNode);
-				if (result == null) result = caseNode(workBreakdownElementNode);
-				if (result == null) result = caseLinkedObject(workBreakdownElementNode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ModelPackage.WORK_PRODUCT_COMPOSITE: {
-				WorkProductComposite workProductComposite = (WorkProductComposite)theEObject;
-				T result = caseWorkProductComposite(workProductComposite);
-				if (result == null) result = caseNodeContainer(workProductComposite);
-				if (result == null) result = caseNode(workProductComposite);
-				if (result == null) result = caseLinkedObject(workProductComposite);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Diagram</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>Diagram</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public T caseDiagram(Diagram object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Link</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>Link</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public T caseLink(Link object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Linked Object</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>Linked Object</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public T caseLinkedObject(LinkedObject object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Named Node</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>Named Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public T caseNamedNode(NamedNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Node</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>Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public T caseNode(Node object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Activity Diagram</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>Activity Diagram</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public T caseActivityDiagram(ActivityDiagram object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Typed Node</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>Typed Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public T caseTypedNode(TypedNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Work Product Dependency Diagram</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>Work Product Dependency Diagram</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseWorkProductDependencyDiagram(WorkProductDependencyDiagram object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Work Product Node</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>Work Product Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseWorkProductNode(WorkProductNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Activity Detail Diagram</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>Activity Detail Diagram</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseActivityDetailDiagram(ActivityDetailDiagram object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Node Container</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>Node Container</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseNodeContainer(NodeContainer object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Role Node</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>Role Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseRoleNode(RoleNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Role Task Composite</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>Role Task Composite</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseRoleTaskComposite(RoleTaskComposite object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Task Node</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>Task Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseTaskNode(TaskNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Work Product Descriptor Node</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>Work Product Descriptor Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseWorkProductDescriptorNode(WorkProductDescriptorNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Work Breakdown Element Node</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>Work Breakdown Element Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseWorkBreakdownElementNode(WorkBreakdownElementNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Work Product Composite</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>Work Product Composite</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseWorkProductComposite(WorkProductComposite 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
-	 */
-    public T defaultCase(EObject object) {
-		return null;
-	}
-
-} //ModelSwitch
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/TxUtil.java b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/TxUtil.java
deleted file mode 100644
index e029a95..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/TxUtil.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.model.util;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.emf.workspace.AbstractEMFOperation;
-import org.eclipse.epf.common.CommonPlugin;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public final class TxUtil {
-
-	public static final Map DEFAULT_TX_OPTIONS = new HashMap();
-	
-	static {
-		TxUtil.DEFAULT_TX_OPTIONS.put(Transaction.OPTION_UNPROTECTED, Boolean.TRUE);
-	}
-
-	public static final void runInTransaction(EObject objectToModify,
-			Runnable modifyOperation) throws ExecutionException {
-		TransactionalEditingDomain domain = null;
-		try {
-			domain = TransactionUtil.getEditingDomain(objectToModify);
-		}
-		catch(Exception e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-		}
-				
-		if (domain == null) {
-			modifyOperation.run();
-		} else {
-			runInTransaction(domain, modifyOperation);
-		}
-	}
-	
-	public static final void runInTransaction(TransactionalEditingDomain domain,
-			final Runnable modifyOperation) throws ExecutionException {
-		new AbstractEMFOperation(domain, "", DEFAULT_TX_OPTIONS) { //$NON-NLS-1$
-
-			@Override
-			protected IStatus doExecute(IProgressMonitor monitor,
-					IAdaptable info) throws ExecutionException {
-				modifyOperation.run();
-				return Status.OK_STATUS;
-			}
-
-		}.execute(new NullProgressMonitor(), null);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/package.html b/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/package.html
deleted file mode 100644
index e17c8a7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.model/src/org/eclipse/epf/diagram/model/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for accessing the activity diagram model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/.classpath b/1.5/plugins/org.eclipse.epf.diagram.ui/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/.project b/1.5/plugins/org.eclipse.epf.diagram.ui/.project
deleted file mode 100644
index 91d1e3f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.diagram.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.diagram.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index e261965..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.diagram.ui
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.diagram.ui.DiagramUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.epf.library,
- org.eclipse.epf.diagram.core;visibility:=reexport,
- org.eclipse.epf.diagram.add,
- org.eclipse.epf.diagram.wpdd,
- org.eclipse.epf.diagram.ad;visibility:=reexport,
- org.eclipse.gmf.runtime.diagram.ui.actions;visibility:=reexport,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.diagram.ui,
- org.eclipse.epf.diagram.ui.service,
- org.eclipse.epf.diagram.ui.viewer
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/build.properties b/1.5/plugins/org.eclipse.epf.diagram.ui/build.properties
deleted file mode 100644
index 30b2fc4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.diagram.ui/plugin.properties
deleted file mode 100644
index d1a054d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Diagram UI
-providerName=Eclipse.org
-
-# ====================================================================
-
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.diagram.ui/plugin.xml
deleted file mode 100644
index 33ca93c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/plugin.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/DiagramUIPlugin.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/DiagramUIPlugin.java
deleted file mode 100644
index 5e2fabe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/DiagramUIPlugin.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class DiagramUIPlugin extends AbstractPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.diagram.ui";  //$NON-NLS-1$
-
-	// The shared instance
-	private static DiagramUIPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public DiagramUIPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static DiagramUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/actions/CustomArrangeAction.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/actions/CustomArrangeAction.java
deleted file mode 100644
index 92efdcd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/actions/CustomArrangeAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.diagram.ui.actions;
-
-import java.util.List;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.actions.internal.ArrangeAction;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramCommandStack;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditDomain;
-import org.eclipse.ui.IWorkbenchPage;
-
-/**
- * @author skannoor
- *
- */
-public class CustomArrangeAction extends ArrangeAction {
-
-	
-	private DiagramEditPart diagramEditPart;
-	private GraphicalViewer viewer;
-
-	/**
-	 * @param workbenchPage
-	 * @param selectionOnly
-	 */
-	public CustomArrangeAction(IWorkbenchPage workbenchPage,
-			boolean selectionOnly, DiagramEditPart diagramEditPart, GraphicalViewer viewer) {
-		super(workbenchPage, selectionOnly);
-		this.diagramEditPart = diagramEditPart;
-		this.viewer = viewer;
-		// TODO Auto-generated constructor stub
-	}
-
-	@Override
-	protected List getSelectedObjects() {
-		return diagramEditPart.getChildren();
-	}
-	
-	@Override
-	protected DiagramEditPart getDiagramEditPart() {
-		return diagramEditPart;
-	}
-	@Override
-	protected DiagramCommandStack getDiagramCommandStack() {
-		return new DiagramCommandStack((IDiagramEditDomain)viewer.getEditDomain());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramEditorHelper.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramEditorHelper.java
deleted file mode 100644
index c3724fa..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramEditorHelper.java
+++ /dev/null
@@ -1,484 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.service;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.add.part.ADDiagramEditor;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.epf.library.edit.ICommandListener;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.DiagramOptions;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-
-/**
- * Helper class for diagram editor.
- * 
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class DiagramEditorHelper {
-	private Map<Process, DiagramManager> processToDiagramManagerMap = new HashMap<Process, DiagramManager>();
-	
-	public DiagramEditorHelper() {
-	}
-	
-	public DiagramManager getDiagramManager(Process proc) {
-		DiagramManager mgr = processToDiagramManagerMap.get(proc);
-		if(mgr != null && mgr.isDisposed()) {
-			processToDiagramManagerMap.remove(proc);
-			mgr = null;
-		}
-		if(mgr == null) {
-			synchronized (processToDiagramManagerMap) {
-				mgr = processToDiagramManagerMap.get(proc);
-				if(mgr == null) {
-					mgr = DiagramManager.getInstance(proc, this);
-					processToDiagramManagerMap.put(proc, mgr);
-				}
-			}
-		}
-		return mgr;
-	}	
-	
-	public void openDiagram(IEditorPart part, int diagramType, Object selectedObject, Suppression suppression) {
-		try {
-			DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
-					selectedObject, suppression, diagramType);
-			DiagramEditorUtil.openDiagramEditor(part.getSite().getPage(), input, getDiagramPreferencesHint(diagramType), new NullProgressMonitor());					
-		} catch (RuntimeException e) {
-			DiagramUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-	
-	public org.eclipse.gmf.runtime.notation.Diagram getDiagram(Activity activity, int type) {
-		org.eclipse.gmf.runtime.notation.Diagram diagram = null;
-		DiagramManager dMgr = getDiagramManager(TngUtil.getOwningProcess(activity));
-		if (dMgr != null) {
-			try {
-				List<Diagram> list = dMgr.getDiagrams(activity, type);
-				if (!list.isEmpty()) {
-					diagram = (org.eclipse.gmf.runtime.notation.Diagram) list.get(0);
-				}
-			} catch (Exception e) {
-				DiagramUIPlugin.getDefault().getLogger().logError(
-						"Core error retrieving a diagram in process editor:", e); //$NON-NLS-1$
-			} 
-		}
-		return diagram;
-	}
-	
-	/**
-	 * 
-	 * @param act
-	 * @return
-	 */
-	public Collection getDiagrams(Activity act) {
-
-		DiagramManager mgr = getDiagramManager(TngUtil.getOwningProcess(act));
-		try{
-			ArrayList<Diagram> diagrams = new ArrayList<Diagram>();
-			for (int i = 0; i < DiagramHelper.DIAGRAM_TYPES.length; i++) {
-				List<Diagram> list = mgr.getDiagrams(act, DiagramHelper.DIAGRAM_TYPES[i]);
-				if (!list.isEmpty()) {
-					diagrams.addAll(list);
-				}
-			}
-			return diagrams;
-		}catch(Exception e){
-			return Collections.EMPTY_LIST;
-		}
-	}
-	
-	public void dispose(){
-		for (DiagramManager mgr : processToDiagramManagerMap.values()) {
-			try {
-				mgr.removeConsumer(this);
-			}
-			catch(Exception e) {
-				//
-			}
-		}
-	}
-	
-	public static int getDiagramType(Diagram diagram){
-		return DiagramHelper.getDiagramType(diagram);
-	}
-	
-	public static String getDiagramTypeString(Diagram diagram){
-		return DiagramHelper.getDiagramTypeString(diagram);
-	}
-	
-	public static PreferencesHint getDiagramPreferencesHint(int diagramType) {
-		switch(diagramType) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		}
-		return null;
-	}
-	
-	/**
-	 * Close diagram editors
-	 * 
-	 * @param closeElement
-	 * @param closeEditorRefs
-	 */
-	public static void closeDiagramEditors(Object closeElement, 
-			java.util.List<IEditorReference> closedEditorRefs) {
-		IWorkbenchPage workbenchPage = DiagramUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow()
-				.getActivePage();
-		if(workbenchPage == null) {
-			return;
-		}
-		IEditorReference[] editorReferences = workbenchPage.getEditorReferences();
-		if(closedEditorRefs == null) {
-			closedEditorRefs = new ArrayList<IEditorReference>();
-		}
-		ArrayList<IEditorReference> closeEditorRefs = new ArrayList<IEditorReference>();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				Object element = null;
-				if (input instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
-					if (diagramInput.getWrapper() != null) {
-						element = diagramInput.getWrapper();
-						if(element instanceof BreakdownElementWrapperItemProvider){
-							// close the parent editor too, if opened.
-							Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(element);
-							if(parent instanceof BreakdownElementWrapperItemProvider){
-								if(element.equals(closeElement))
-									closeDiagramEditors(parent, closedEditorRefs);
-							}
-						}
-					} else {
-						element = diagramInput.getMethodElement();
-					}
-				} 
-				if (element != null) {
-					if (element.equals(closeElement)) {
-						closeEditorRefs.add(reference);
-					} else {
-						// check whether element is child of closeElement
-						// directly/indirectly
-						if (closeElement instanceof Activity) {
-							Collection collection = new ArrayList();
-							ProcessUtil.getChildElements(
-									(Activity) closeElement, Activity.class,
-									collection);
-							if (collection.contains(element)) {
-								closeEditorRefs.add(reference);
-							}
-						}
-					}
-				}
-			}
-		}
-		int size = closeEditorRefs.size();
-		IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			references[i] = (IEditorReference) closeEditorRefs.get(i);
-		}
-		workbenchPage.closeEditors(references, false);
-		references = null;
-	}
-	
-	/**
-	 * Diagram editors of object itself will be closed. And Parent diagram
-	 * editors will be refreshed.
-	 * 
-	 */
-	public static void refreshParentDiagramEditors(Object refreshElement,
-			java.util.List<IEditorReference> openEditorRefs, boolean parentRefresh) {
-		openEditorRefs = new ArrayList<IEditorReference>();
-		// Now refresh object's parent's diagrams.
-		IWorkbenchPage workbenchPage = DiagramUIPlugin.getDefault()
-				.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IEditorReference[] editorReferences = workbenchPage
-				.getEditorReferences();
-		for (int i = 0; i < editorReferences.length; i++) {
-			IEditorReference reference = editorReferences[i];
-			IEditorPart editor = reference.getEditor(true);
-			if (editor != null) {
-				IEditorInput input = editor.getEditorInput();
-				Object element = null;
-				if (input instanceof DiagramEditorInputProxy) {
-					DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input)
-							.getDiagramEditorInput();
-					if (diagramInput.getWrapper() != null) {
-						element = diagramInput.getWrapper();
-						if(parentRefresh){
-							if (element instanceof BreakdownElementWrapperItemProvider) {
-							Object parent = ((BreakdownElementWrapperItemProvider) element)
-									.getParent(null);
-							if (parent instanceof BreakdownElementWrapperItemProvider) {
-								if (element.equals(refreshElement))
-									refreshParentDiagramEditors(parent,
-											openEditorRefs, parentRefresh);
-							}
-							}
-						}
-					} else {
-						element = diagramInput.getMethodElement();
-					}
-				}
-				if (element != null) {
-					if (element instanceof Activity) {
-						if(!parentRefresh){
-							if(element == refreshElement){
-								openEditorRefs.add(reference);
-							}
-						}
-						if (((Activity) element).getBreakdownElements()
-								.contains(refreshElement))
-							openEditorRefs.add(reference);
-						else if (refreshElement instanceof BreakdownElementWrapperItemProvider) {
-							Object localRefreshElement = refreshElement;
-							while ((localRefreshElement instanceof BreakdownElementWrapperItemProvider)
-									&& ((BreakdownElementWrapperItemProvider) localRefreshElement)
-											.getOwner() != null) {
-								if (((BreakdownElementWrapperItemProvider) localRefreshElement)
-										.getOwner().equals(element)) {
-									openEditorRefs.add(reference);
-								}
-								localRefreshElement = ((BreakdownElementWrapperItemProvider) localRefreshElement)
-										.getOwner();
-							}
-						}
-						if(((Activity) element).getVariabilityBasedOnElement() != null){
-							Activity base = (Activity)((Activity) element).getVariabilityBasedOnElement();
-							if (((Activity) base).getBreakdownElements()
-									.contains(refreshElement))
-								openEditorRefs.add(reference);
-						}
-					} else if (element instanceof BreakdownElementWrapperItemProvider) {
-						Collection c = ((BreakdownElementWrapperItemProvider) element)
-								.getChildren(element);
-						if (c != null && c.contains(refreshElement)) {
-							openEditorRefs.add(reference);
-						}
-					}
-
-				}
-			}
-		}
-		int size = openEditorRefs.size();
-		// IEditorReference[] references = new IEditorReference[size];
-		for (int i = 0; i < size; i++) {
-			IEditorReference reference = (IEditorReference) openEditorRefs
-					.get(i);
-			IEditorPart editor = reference.getEditor(true);
-			if (editor instanceof AbstractDiagramEditor) {
-				((AbstractDiagramEditor) editor).refreshDiagram();
-				if(editor instanceof ADDiagramEditor){
-					((ADDiagramEditor)editor).runResetLayoutAction();
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Gets list of command listeners that will handle the diagram related changes of the commands of interesses
-	 * 
-	 * @return
-	 * @see ICommandListener
-	 */
-//	public static List<ICommandListener> getCommandListeners() {
-//		if (commandListeners == null) {
-//			commandListeners = new ArrayList<ICommandListener>();
-//		}
-//
-//		commandListeners.add(new ICommandListener() {
-//			
-//			public void notifyExecuted(Command command) {
-//				// get contributor/replacer of the activity
-//				//
-//				if(true) return;
-//				Activity act = (Activity) command.getResult().iterator().next();
-//				Activity base = (Activity) act.getVariabilityBasedOnElement();
-//				DiagramManager dMgr = null;
-//				DiagramManager baseMgr = null;
-//				try {
-//					if (base != null) {
-//						Activity parentAct = act.getSuperActivities();
-//						dMgr = DiagramManager.getInstance(TngUtil
-//								.getOwningProcess(parentAct));
-//						Diagram diagram = null;
-//						List<Diagram> diagrams = dMgr.getDiagrams(parentAct,
-//								IDiagramManager.ACTIVITY_DIAGRAM);
-//						if (!diagrams.isEmpty()) {
-//							diagram = diagrams.get(0);
-//						}
-//						if (diagram != null) {
-//							// find existing node for base and link it to the
-//							// contributore/replacer of the activity
-//							Node node = findNode(diagram, base);
-//							if (node != null) {
-//								NodeAdapter adapter = BridgeHelper
-//										.getNodeAdapter(node.getElement());
-//								if (adapter != null
-//										&& adapter.getElement() != act) {
-//									BridgeHelper.associate((EModelElement) node
-//											.getElement(), act);
-//									BridgeHelper
-//											.unmarkInHerited((EModelElement) node
-//													.getElement());
-//								}
-//							}
-//						}
-//						if (act.getVariabilityType() == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-//							// copy diagrams and their publishing options
-//							baseMgr = DiagramManager
-//									.getInstance(TngUtil.getOwningProcess(base));
-//							for (int i = 0; i < DiagramHelper.DIAGRAM_TYPES.length; i++) {
-//								int diagramType = DiagramHelper.DIAGRAM_TYPES[i];
-//								List baseDiagrams = baseMgr.getDiagrams(base,
-//										diagramType);
-//								if (!baseDiagrams.isEmpty() && baseDiagrams.get(0) != null) {
-//									Diagram copy = baseMgr.createDiagram(act,
-//											diagramType, null);
-//									if (isPublishDiagram(base, diagramType)) {
-//										setDiagramOptions(act, diagramType);
-//									}
-//								}
-//							}
-//						}
-//					}
-//				}catch(Exception e){
-//					
-//				}
-//				finally{
-//					if(dMgr != null){
-//						dMgr.release();
-//					}
-//					if(baseMgr != null){
-//						dMgr.release();
-//					}
-//				}
-//			}
-//
-//			public Class getCommandType() {
-//				return VaryActivityCommand.class;
-//			}
-//
-//			public void preUndo(Command command) {
-//				// get old contributor/replacer of the activity
-//				//
-//				if(true) return;
-//				Activity act = (Activity) command.getResult().iterator().next();
-//				VariabilityElement baseAct = act.getVariabilityBasedOnElement();
-//				if (baseAct != null) {
-//					Activity parentAct = act.getSuperActivities();
-//					DiagramManager dMgr = DiagramManager.getInstance(TngUtil.getOwningProcess(parentAct));
-//					Diagram diagram = null; 
-//					try {
-//						List diagrams = dMgr.getDiagrams(parentAct,
-//								GraphicalDataHelper.ACTIVITY_DIAGRAM);
-//						diagram = (Diagram) diagrams.get(0);
-//						if (diagram != null) {
-//							// find existing node for the old
-//							// contributore/replacer
-//							// old and relink it to the base activity
-//							Node node = findNode(diagram, act);
-//							if (node != null) {
-//								NodeAdapter adapter = BridgeHelper
-//										.getNodeAdapter(node.getElement());
-//								if (adapter != null
-//										&& adapter.getElement() != baseAct) {
-//									BridgeHelper.associate((EModelElement) node
-//											.getElement(), baseAct);
-//									BridgeHelper
-//											.markInherited((EModelElement) node
-//													.getElement());
-//								}
-//							}
-//						}
-//						// remove diagrams 
-//						
-//						
-//					}catch(Exception e){
-//						
-//					}
-//					finally {
-//							
-//					}
-//				}
-//			}
-//
-//			public void preExecute(Command command) {
-//				
-//			}
-//
-//		});
-//
-//		return commandListeners;
-//	}
-	
-	public static void setDiagramOptions(Activity activity , int diagramType){
-		switch(diagramType){
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			DiagramOptions.setPublishAD(activity, false);
-			break;
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			DiagramOptions.setPublishADD(activity, false);
-			break;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			DiagramOptions.setPublishWPDD(activity, false);
-			break;	
-		}
-	}
-	
-	public static boolean isPublishDiagram(Activity activity, int diagramType){
-		switch(diagramType){
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return DiagramOptions.isPublishAD(activity);
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return DiagramOptions.isPublishADD(activity);
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return DiagramOptions.isPublishWPDD(activity);
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramEditorStatePreserver.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramEditorStatePreserver.java
deleted file mode 100644
index cadfcb0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramEditorStatePreserver.java
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.service;
-
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.providers.SharedResourceDiagramDocumentProvider;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class DiagramEditorStatePreserver {
-	private IEditorReference diagramEditorRef;
-	private boolean dirty;
-
-	public DiagramEditorStatePreserver(Object activityOrWrapper, Suppression suppression, int diagramType) {
-		IEditorInput input = new DiagramEditorInputProxy(
-				new DiagramEditorInput(activityOrWrapper, suppression, diagramType), 
-				DiagramEditorHelper.getDiagramPreferencesHint(diagramType));
-		try {
-			IEditorReference[] editorRefs = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getActivePage()
-					.getEditorReferences();
-			String editorId = DiagramEditorUtil.getEditorId(diagramType);
-			for (int i = 0; i < editorRefs.length; i++) {
-				IEditorReference editorRef = editorRefs[i];
-				if(input.equals(editorRef.getEditorInput()) && editorRef.equals(editorId)) {
-					IEditorPart editor = editorRef.getEditor(false);
-					if(editor instanceof AbstractDiagramEditor) {
-						diagramEditorRef = editorRef;		
-						break;
-					}
-				}
-			}
-			if(diagramEditorRef != null) {
-				dirty = diagramEditorRef.getEditor(false).isDirty();
-			}
-		} catch (Exception e) {
-			//
-		}
-	}
-	
-	public void restore() {
-		try {
-			if (diagramEditorRef != null && !dirty) {
-				AbstractDiagramEditor editor = (AbstractDiagramEditor) diagramEditorRef
-						.getEditor(false);
-				if (editor != null && editor.isDirty()) {
-					IDocumentProvider docProvider = ((AbstractDiagramEditor) editor)
-							.getDocumentProvider();
-
-					// this will clear dirty flag of the editor
-					//
-					if (docProvider instanceof SharedResourceDiagramDocumentProvider) {
-						((SharedResourceDiagramDocumentProvider) docProvider)
-								.markDocumentAsSaved((IFileEditorInput) diagramEditorRef
-										.getEditorInput());
-					}
-
-				}
-			}
-		} catch (Exception e) {
-			DiagramUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramImageService.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramImageService.java
deleted file mode 100644
index b4d8802..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramImageService.java
+++ /dev/null
@@ -1,999 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.service;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.services.DiagramHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.diagram.ui.viewer.AbstractDiagramGraphicalViewer;
-import org.eclipse.epf.diagram.ui.viewer.NewActivityDetailDiagramViewer;
-import org.eclipse.epf.diagram.ui.viewer.NewActivityDiagramViewer;
-import org.eclipse.epf.diagram.ui.viewer.NewWPDependencyDiagramViewer;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.IMethodConfigurationProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.VariabilityInfo;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.DiagramOptions;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ProcessAdapterFactoryFilter;
-import org.eclipse.epf.library.layout.diagram.DiagramInfo;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.ImageLoader;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Provides service methods for creating diagram images for activity elements
- *   
- * @author Shashidhar Kannoori
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DiagramImageService implements IDiagramImageService {
-
-	static boolean debug  = DiagramUIPlugin.getDefault().isDebugging();
-	
-	private Composite parent = null;
-
-	private Composite holder = null;
-
-	private File pubDir;
-	
-	private boolean forXMLExport = false;
-
-	private static Map<String, Integer> typeMap = new HashMap<String, Integer>();
-
-	private DiagramInfo diagramInfo = null;
-
-	private boolean publishUncreatedADD = true;
-	
-	private boolean publishADForActivityExtension = true;
-	
-	private boolean exist = true;
-	
-	private MethodConfiguration config = null;
-
-
-	static {
-		typeMap.put(ResourceHelper.DIAGRAM_TYPE_WORKFLOW, new Integer(
-				IDiagramManager.ACTIVITY_DIAGRAM));
-		typeMap.put(ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL, new Integer(
-				IDiagramManager.ACTIVITY_DETAIL_DIAGRAM));
-		typeMap.put(ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY, new Integer(
-				IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM));
-	}
-
-	public static int getIntType(String diagramType) {
-		Integer type = (Integer) typeMap.get(diagramType);
-		if (type != null) {
-			return type.intValue();
-		}
-
-		return -1;
-	}
-	public static PreferencesHint getPreferenceHint(String diagramType){
-		int type = getIntType(diagramType);
-		switch (type) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		default:
-			return null;
-		}
-		
-	}
-	public static String getStringType(int type) {
-		switch(type) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY;
-		}
-		return null;
-	}
-
-	Shell shell = null;
-
-	private Set<DiagramManager> diagramManagers = new HashSet<DiagramManager>();
-
-//	public DiagramImageService() {
-//		this(null, new File(LibraryService.getInstance().getCurrentMethodLibraryPath()));
-//	}
-
-	public DiagramImageService(File pubDir) {
-		this(null, pubDir);
-	}
-
-	public DiagramImageService(Composite parent, File pubDir) {
-		this.parent = parent;
-		this.pubDir = pubDir;
-	}
-
-	private AbstractDiagramGraphicalViewer getDiagramViewer(int diagramType, Object wrapper) {
-		// if the shell window is distroyed, recreate it
-		if ((this.shell != null) && this.shell.isDisposed()) {
-			this.parent = null;
-			this.shell = null;
-		}
-		getViewerHolder(parent);
-
-		switch (diagramType) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			return new NewActivityDiagramViewer(holder, wrapper);
-
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			return new NewActivityDetailDiagramViewer(holder,wrapper);
-
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			return new NewWPDependencyDiagramViewer(holder,wrapper);
-
-		default:
-			return null;
-		}
-	}
-
-	private void getViewerHolder(Composite parent) {
-		if (parent == null) {
-			if (shell == null || shell.isDisposed()) {
-				shell = createShell();
-			}
-			shell.open();
-			parent = shell;
-		}
-
-		if (holder != null) {
-			holder.dispose();
-		}
-
-		holder = new Composite(parent, SWT.NONE);
-		holder.setLayoutData(new GridData(1, 1)); // size can't be 0,0
-		// otherwise the diagram
-		// will not be painted
-		holder.setLayout(new GridLayout());
-		holder.setVisible(false);
-	}
-
-	private Shell createShell() {
-		Shell shell = null;
-		Display d = Display.getDefault();
-		shell = new Shell(d);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		shell.setLayout(layout);
-		shell.setBounds(0, 0, 0, 0);
-		shell.setVisible(false);
-		return shell;
-	}
-
-	public void dispose() {
-		if ((shell != null) && (!shell.isDisposed())) {
-			shell.close();
-			shell.dispose();
-		}
-		
-		for (DiagramManager mgr : diagramManagers) {
-			mgr.removeConsumer(this);
-		}
-	}
-
-	/**
-	 * save the element diagram image and returns the image file url.
-	 * 
-	 * @param wrapper
-	 * @param imgPath
-	 * @param diagramType
-	 * @param filter
-	 *            IFilter
-	 * @param sup
-	 *            Suppression
-	 * @return String the image path relative to the publishing dir
-	 * 
-	 * @see org.eclipse.epf.library.layout.diagram.IActivityDiagramService#saveDiagram(java.lang.Object, java.lang.String, java.lang.String, org.eclipse.epf.library.edit.IFilter, org.eclipse.epf.library.edit.util.Suppression)
-	 */
-	public DiagramInfo saveDiagram(final Object wrapper, final String imgPath, 
-			final String diagramType, final IFilter filter,
-			final Suppression sup) {
-		// initialize the diagramInfo
-		diagramInfo = null;
-
-		// grab the UI thread to avoid thread access error
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				__internal_saveDiagram(wrapper, imgPath, diagramType, filter, sup);
-			}
-		});
-
-		return diagramInfo;
-	}
-
-	private boolean hasUserDefinedDiagram(Activity e, String imgPath, int type)
-			throws Exception {
-		// if there is a user defined diagram, use it
-		org.eclipse.epf.diagram.model.util.DiagramInfo info = new org.eclipse.epf.diagram.model.util.DiagramInfo(
-				(Activity) e);
-		switch (type) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			if (info.canPublishADImage()) {
-				return (info.getActivityDiagram() != null)
-						&& info.canPublishADImage();
-			}
-			break;
-
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			if (info.canPublishADDImage()) {
-				return (info.getActivityDetailDiagram() != null)
-						&& info.canPublishADDImage();
-			}
-			break;
-
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			if (info.canPublishWPDImage()) {
-				return (info.getWPDDiagram() != null)
-						&& info.canPublishWPDImage();
-			}
-			break;
-
-		default:
-			break;
-		}
-
-		return false;
-	}
-	
-	private void __internal_saveDiagram(Object wrapper, final String imgPath,
-			String diagramType, IFilter filter, Suppression sup) {
-		if (sup.isSuppressed(wrapper)) {
-			return;
-		}
-		// DiagramInfo diagramInfo = null;
-
-		int type = getIntType(diagramType);
-		if (type < 0) {
-			return;
-		}
-		_internal_generateImage(wrapper, imgPath, type, filter, sup, true, true);
-	}
-	
-	/**
-	 * Creates a diagram JPEG for given Activity and  
-	 * 
-	 * @param wrapper
-	 * @param imgPath
-	 * @param diagramType
-	 * @param filter
-	 * @param sup
-	 * @return
-	 */
-	public String generateDiagramImage(final Object wrapper, final String imgPath, 
-			final int diagramType, final IFilter filter,
-			final Suppression sup, final boolean realizedDiagram){
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				_internal_generateImage(wrapper, imgPath, diagramType, filter, sup, false, realizedDiagram);
-			}
-		});
-		return imgPath;
-	}
-	
-	/**
-	 * Method to create a diagram viewer and generate image and saves the image.
-	 * 
-	 * 
-	 * @param wrapper
-	 * @param imgPath
-	 * @param diagramType
-	 * @param filter
-	 * @param sup
-	 * @param calculateDiagramInfo
-	 */
-	private void _internal_generateImage(Object wrapper, final String imgPath,
-			int type, IFilter filter, Suppression sup, boolean calculateDiagramInfo,
-			boolean realizedDiagram){
-		
-		exist = true;
-		Image image = null;
-		
-		Object o = TngUtil.unwrap(wrapper);
-		if (!(o instanceof Activity)) {
-			return;
-		}
-
-		Activity e = (Activity) o;
-		
-		AbstractDiagramGraphicalViewer viewer = null;
-
-		// keep the dirty flag and reset back to avoid make the library dirty
-		boolean dirtyFlag = e.eResource().isModified();
-
-		try {
-			
-			Object object = canCreateImage(wrapper, imgPath, type, filter, sup);
-			if(realizedDiagram && object == null){
-				return;
-			}else{
-				wrapper = object;
-			}
-			try {
-				viewer = getDiagramViewer(type, wrapper);
-				if(config != null){
-					viewer.setMethodConfiguration(config);
-				}
-				EditPart diagramEditPart = viewer.loadDiagram(wrapper, !exist, filter, sup);
-				if(diagramEditPart == null){
-					if(debug){
-						DiagramUIPlugin.getDefault().getLogger().
-						logError("Publishing: DiagramImageService viewer EditPart is null: "+wrapper);	//$NON-NLS-1$
-					}
-					return;
-				}else{
-					if(diagramEditPart.getChildren().isEmpty())
-						return;
-				}
-				if(calculateDiagramInfo){
-					diagramInfo = viewer.getDiagramInfo();
-				}
-				image = viewer.createDiagramImage();
-				if (image != null) {
-					// save the image
-					File f = new File(pubDir, imgPath);
-
-					// make sure the file is created otherwise exception
-					File parent = f.getParentFile();
-					if (!parent.exists()) {
-						parent.mkdirs();
-					}
-
-					if (!f.exists()) {
-						f.createNewFile();
-					}
-					OutputStream os = new FileOutputStream(f);
-					ImageLoader loader = new ImageLoader();
-					loader.data = new ImageData[] { image.getImageData() };
-					loader.save(os, SWT.IMAGE_JPEG);					
-				} else {
-					DiagramUIPlugin.getDefault().getLogger().logError(
-							"Failed to create diagram image for" + e); //$NON-NLS-1$
-				}
-				if (calculateDiagramInfo && diagramInfo != null && !diagramInfo.isEmpty()) {
-					diagramInfo.setImageFilePath(imgPath);
-				}
-			} catch (RuntimeException e1) {
-				e1.printStackTrace();
-			}
-
-			// delete the newly created diagram from the library
-			if (!exist) {
-				Diagram d = getDiagram(e, type);
-				if (d != null) {
-					DiagramHelper.deleteDiagram(d, false);
-				}
-			}
-		} catch (Exception ex) {
-			DiagramUIPlugin.getDefault().getLogger().logError("Exception"+e); //$NON-NLS-1$
-		} finally {
-			try {
-				// restore the dirty flag
-				e.eResource().setModified(dirtyFlag);
-
-				if (viewer != null) {
-					viewer.dispose();
-				}
-				if (image != null) {
-					image.dispose();
-				}
-			} catch (RuntimeException e1) {
-				e1.printStackTrace();
-			}
-		}
-	}
-	
-
-	private Object canCreateImage(Object wrapper, final String imgPath,
-			int type, IFilter filter, Suppression suppression){
-
-		Object o = TngUtil.unwrap(wrapper);
-		if (!(o instanceof Activity)) {
-			return null;
-		}
-		try{
-			//MethodElement e = (MethodElement)o;
-			Activity e = (Activity) o;
-			if (hasUserDefinedDiagram((Activity) e, imgPath, type)) {
-				return null;
-			}
-			// Check diagram exists, don't generate for suppressed.
-			Diagram d = getDiagram(e, type);
-
-			// Check publishing options.
-			exist = (d != null);
-			
-			if (isForXMLExport()) {
-				if (exist && canPublishDiagram(d,e)) {
-					return e;
-				}				
-				return null;
-			}
-			
-			if (exist) {
-				
-				if(!canPublishDiagram(d,e)) return null;
-				
-				if (type == IDiagramManager.ACTIVITY_DIAGRAM ) {
-					
-					// If an extension has its own diagram. Base is replaced or
-					// contributed.extension diagram shows realized element in undefined
-					// location. In publishing don't display extension diagram even if it has
-					// its own diagram if realized elements are coming in through
-					// variability.
-					if ( isBreakdownElementsReplaced(e, filter) ) {
-						return null;
-					}
-				
-					// if the object is a wrapper, the diagram is from it's base,
-					// don't show the AD id the preference is not set
-					if ( (e != wrapper) && !publishADForActivityExtension ) {
-						return null;
-					}
-
-					// Check variability and base's variability.
-//					VariabilityElement calculatedBase = checkVariability(e,
-//							filter, type);
-//					if (calculatedBase != null) {
-//						wrapper = calculatedBase;
-//					}
-					
-				} else if ( type == IDiagramManager.ACTIVITY_DETAIL_DIAGRAM) {
-					if ( (e != wrapper) && !publishUncreatedADD ) {
-						return null;
-					}
-				}
-				
-			} else {
-
-				if ((type == IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM))
-					return null;
-
-				// For Activity Diagram un opened extension publish.
-				if (type == IDiagramManager.ACTIVITY_DIAGRAM) {
-					// If option is not checked, don't generate a diagram
-					if (!publishADForActivityExtension)
-						return null;
-
-					// If extension is modified don't generate it.
-					if (!e.getBreakdownElements().isEmpty())
-						return null;
-					
-					// Check any child is suppressed. 
-					// if any child is suppresed don't generate diagram
-					if(anyChildrenSuppressed(wrapper, filter, suppression)) 
-						return null;
-					
-					// Check variability and base's variability.
-					VariabilityElement calculatedBase = checkVariability(e,
-							filter, type);
-					if (calculatedBase == null) {
-						return null;
-					}
-
-					wrapper = calculatedBase;
-					e = (Activity) calculatedBase;
-					exist = true;
-				}
-
-				if (publishUncreatedADD == false
-						&& type == IDiagramManager.ACTIVITY_DETAIL_DIAGRAM) {
-					boolean contributorexist = false;
-					// This is need, if contributor has a ADD diagram, base don't
-					// base should generate ADD in browsing.
-					MethodConfiguration config = null;
-					if (filter instanceof ProcessAdapterFactoryFilter) {
-						config = ((ProcessAdapterFactoryFilter) filter)
-								.getMethodConfiguration();
-					}
-					if (config == null)
-						return null;
-
-					// Get immediate contributors first, and check immediate
-					// contributors
-					// have anything extra breakdown elements.
-					List list = ConfigurationHelper.getContributors(e, config);
-					if (e instanceof Activity) {
-						Iterator iterator = list.iterator();
-						if (iterator != null) {
-							while (iterator.hasNext()) {
-								Object act = iterator.next();
-								if (act != null) {
-									Diagram dx = getDiagram((Activity)act, type);
-									if (dx != null) {
-										contributorexist = true;
-										break;
-									}
-								}
-							}
-						}
-					}
-					if (!contributorexist)
-						return null;
-				}
-			}
-		}catch(Exception e){
-			return null;
-		}
-		return wrapper;
-	}
-
-	private boolean canPublishDiagram(Diagram diagram, Activity activity) {
-		switch (DiagramHelper.getDiagramType(diagram)) {
-		case IDiagramManager.ACTIVITY_DIAGRAM:
-			if (DiagramOptions.isPublishAD(activity)) {
-				return true;
-			}
-			break;
-		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-			if (DiagramOptions.isPublishADD(activity)) {
-				return true;
-			}
-			break;
-		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-			if (DiagramOptions.isPublishWPDD(activity)) {
-				return true;
-			}
-			break;
-		}
-		return false;
-	}
-	
-	private boolean anyChildrenSuppressed(Object wrapper, IFilter filter, Suppression suppression) {
-		ITreeItemContentProvider adapter = getAdapter(wrapper, filter);
-		boolean oldRolledUp = false;
-		if(adapter instanceof BSActivityItemProvider) {
-			BSActivityItemProvider itemProvider = (BSActivityItemProvider)adapter;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.basicSetRolledUp(false);
-		}
-		else if(adapter instanceof IBSItemProvider){
-			IBSItemProvider itemProvider = (IBSItemProvider)adapter;
-			oldRolledUp = itemProvider.isRolledUp();
-			itemProvider.setRolledUp(false);
-		}
-		
-		try {
-			// filter out the suppressed elements
-			//
-			Object element = TngUtil.unwrap(wrapper);
-			for (Iterator iter = adapter.getChildren(element).iterator(); iter.hasNext();) {
-				Object child = iter.next();
-				if(suppression.isSuppressed(child)) {
-					return true;
-				}
-			}
-		}
-		finally {
-			// restore the rolled-up flag
-			//
-			if(adapter instanceof IBSItemProvider) {
-				((IBSItemProvider)adapter).setRolledUp(oldRolledUp);
-			}
-		}
-		
-		return false;
-	}
-	
-	/**
-	 * Moved code from getChildren. getAdapter() will return Adapter,
-	 * which will allow us to find itemprovider for the children. 
-	 * 
-	 * @return
-	 */
-	private ITreeItemContentProvider getAdapter(Object wrapper, IFilter filter){
-		ITreeItemContentProvider adapter = null;
-		if (wrapper instanceof BreakdownElementWrapperItemProvider) {
-			adapter = (BreakdownElementWrapperItemProvider)wrapper;
-		} else {
-			adapter = (ITreeItemContentProvider) getAdapterFactory(filter).adapt(
-					wrapper, ITreeItemContentProvider.class);
-		}
-		return adapter;
-	}
-	
-	AdapterFactory getAdapterFactory(IFilter filter){
-		AdapterFactory adapterFactory = null;
-		if (filter == null) {
-			adapterFactory = TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-		} else if (filter instanceof IAdapterFactoryFilter) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) ((IAdapterFactoryFilter) filter)
-					.getWBSAdapterFactory();
-		}
-		return adapterFactory;
-	}
-	
-	private VariabilityElement checkVariability(VariabilityElement e, IFilter filter,
-			int type) {
-
-		MethodConfiguration config = null;
-		if (filter instanceof ProcessAdapterFactoryFilter) {
-			config = ((ProcessAdapterFactoryFilter) filter)
-					.getMethodConfiguration();
-		}
-		if (config == null)
-			return null;
-
-		// Get immediate contributors first, and check immediate contributors
-		// have anything extra breakdown elements.
-		List list = ConfigurationHelper.getContributors(e, config);
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object next = iterator.next();
-			if (next instanceof Activity) {
-				if (!((Activity) next).getBreakdownElements().isEmpty())
-					return null;
-			}
-		}
-
-		// Get all Contributors from parent chain and contributor chain for the
-		// element e.
-		VariabilityInfo eInfo = ((ProcessAdapterFactoryFilter) filter)
-				.getVariabilityInfo((VariabilityElement) e);
-		List contributors = eInfo.getContributors();
-
-		VariabilityElement ve = e.getVariabilityBasedOnElement();
-		if (ve == null) {
-			return null;
-		}
-		
-		Activity replacer = (Activity) ConfigurationHelper.getReplacer(ve,
-				config);
-		if (replacer != null) {
-			ve = replacer;
-			Diagram replacerDiagram = getDiagram(replacer, type);
-			if (replacerDiagram != null) {
-				return replacer;
-			} else {
-				return null;
-			}
-		} else {
-			Diagram baseDiagram = getDiagram((Activity) ve, type);
-			if (baseDiagram != null) {
-				
-				// Check first if baseDiagram is suppressed.
-				if(BridgeHelper.isSuppressed(baseDiagram)) return null;
-				
-				// Find the contributors of Base
-				VariabilityInfo veInfo = ((ProcessAdapterFactoryFilter) filter)
-						.getVariabilityInfo((VariabilityElement) ve);
-				List veContributors = veInfo.getContributors();
-				if (contributors.size() != veContributors.size()) {
-					for (Iterator iterator = contributors.iterator(); iterator
-							.hasNext();) {
-						Object next = iterator.next();
-						if (!veContributors.contains(next)) {
-							if (!((Activity) next).getBreakdownElements()
-									.isEmpty()) {
-								return null;
-							}
-						}
-					}
-				}
-				
-				return ve;
-				
-			}else{
-				// If no base diagram, check base of base had any diagram.
-				return checkVariability(ve, filter, type);
-			}
-		}
-		
-	}
-	
-	public VariabilityElement checkVariability(VariabilityElement e, IFilter filter,
-			int type, boolean checkUDD) {
-
-		MethodConfiguration config = null;
-		org.eclipse.epf.diagram.model.util.DiagramInfo uddInfo = null;
-		
-		if (filter instanceof ProcessAdapterFactoryFilter) {
-			config = ((ProcessAdapterFactoryFilter) filter)
-					.getMethodConfiguration();
-		}
-		if (config == null)
-			return null;
-
-		// Get immediate contributors first, and check immediate contributors
-		// have anything extra breakdown elements.
-		List list = ConfigurationHelper.getContributors(e, config);
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object next = iterator.next();
-			if (next instanceof Activity) {
-				if (!((Activity) next).getBreakdownElements().isEmpty())
-					return null;
-			}
-		}
-
-		// Get all Contributors from parent chain and contributor chain for the
-		// element e.
-		VariabilityInfo eInfo = ((ProcessAdapterFactoryFilter) filter)
-				.getVariabilityInfo((VariabilityElement) e);
-		List contributors = eInfo.getContributors();
-
-		VariabilityElement ve = e.getVariabilityBasedOnElement();
-		if (ve == null) {
-			return null;
-		}
-		
-		Activity replacer = (Activity) ConfigurationHelper.getReplacer(ve,
-				config);
-		if (replacer != null) {
-			ve = replacer;
-			Diagram replacerDiagram = getDiagram(replacer, type);
-			if(checkUDD){
-				uddInfo = new org.eclipse.epf.diagram.model.util.DiagramInfo(replacer);
-				if(uddInfo.canPublishADImage() && uddInfo.getActivityDiagram() != null){
-					return replacer;
-				}
-			}else{
-				if (replacerDiagram != null) {
-					return replacer;
-				}
-			}
-			return null;
-		} else {
-			
-			Diagram baseDiagram = null;
-			if(checkUDD){
-				uddInfo = new org.eclipse.epf.diagram.model.util.DiagramInfo((Activity)ve);
-			}else{
-				baseDiagram = getDiagram((Activity) ve, type);
-			}
-			
-			if (baseDiagram != null || (uddInfo != null && uddInfo.canPublishADImage() && uddInfo.getActivityDiagram() != null)) {
-				
-				// Check first if baseDiagram is suppressed.
-//				if(BridgeHelper.isSuppressed(baseDiagram)) return null;
-				
-				// Find the contributors of Base
-				VariabilityInfo veInfo = ((ProcessAdapterFactoryFilter) filter)
-						.getVariabilityInfo((VariabilityElement) ve);
-				List veContributors = veInfo.getContributors();
-				if (contributors.size() != veContributors.size()) {
-					for (Iterator iterator = contributors.iterator(); iterator
-							.hasNext();) {
-						Object next = iterator.next();
-						if (!veContributors.contains(next)) {
-							if (!((Activity) next).getBreakdownElements()
-									.isEmpty()) {
-								return null;
-							}
-						}
-					}
-				}
-				
-				return ve;
-				
-			}else{
-				// If no base diagram, check base of base had any diagram.
-				return checkVariability(ve, filter, type);
-			}
-		}
-		
-	}
-	
-
-	/**
-	 * Set the window's preference attribute for Activity Detail Diagram.
-	 * 
-	 */
-	public void setPublishedUnCreatedADD(boolean flag) {
-		this.publishUncreatedADD = flag;
-	}
-	/**
-	 * Set the window's preference attribute for Acitivyt Diagram
-	 * 
-	 */
-	
-	public void setPublishADForActivityExtension(boolean flag){
-		this.publishADForActivityExtension = flag;
-	}
-
-//	private DiagramGenerator createDiagramImage(DiagramEditPart diagramEP, ImageFileFormat fileFormat)
-//	throws CoreException {
-//		CopyToImageUtil util = new CopyToImageUtil();
-//		DiagramGenerator dGen = util.copyToImage(diagramEP, new Path(pubDir.getPath()), fileFormat, new NullProgressMonitor());
-//		dGen.createAWTImageForDiagram();
-//		return dGen;
-//	}
-	
-	public Diagram getDiagram(Activity e, int type){
-		DiagramManager dMgr = getDiagramManager(e);
-		Diagram diagram = null;
-		if (dMgr != null) {
-			try {
-				List<Diagram> list = dMgr.getDiagrams(e, type);
-				if (!list.isEmpty()) {
-					diagram = (Diagram) list.get(0);
-				}
-			} catch (Exception ex) {
-				DiagramUIPlugin.getDefault().getLogger().logError(
-						"Error in getDiagram()" + ex.getMessage()); //$NON-NLS-1$
-			}
-		}
-		return diagram;
-	}
-	
-	private DiagramManager getDiagramManager(Activity e) {
-		DiagramManager mgr = DiagramManager.getInstance(TngUtil.getOwningProcess(e), this);
-		diagramManagers .add(mgr);
-		return mgr;
-	}
-	
-	/**
-	 * gets the method configuration  
-	 * @return
-	 */
-	public MethodConfiguration getConfig() {
-		return config;
-	}
-	/**
-	 * sets the method configuration.
-	 * @param config
-	 */
-	public void setConfig(MethodConfiguration config) {
-		this.config = config;
-	}
-	
-
-	/**
-	 * Checks any breakdownelements of an Activity has a replacer.
-	 * 
-	 * @param element
-	 *              VariabilityElement the element
-	 * @param config 
-	 * 				MethodConfiguration
-	 * @return VariabilityElement the replacer if there is one and ONLY one,
-	 *         null otherwise
-	 */
-	private boolean isBreakdownElementsReplaced(Activity activity,
-			IFilter filter) {
-		
-		MethodConfiguration config = null;
-		if (filter instanceof IMethodConfigurationProvider) {
-			config = ((IMethodConfigurationProvider) filter)
-					.getMethodConfiguration();
-		}
-		if (config == null)
-			return true;
-		
-		for (Iterator iter = activity.getBreakdownElements().iterator(); iter
-				.hasNext();) {
-			BreakdownElement element = (BreakdownElement) iter.next();
-			if (element instanceof Activity) {
-				if(ConfigurationHelper.getReplacer((Activity)element, config) != null)
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	
-	/**
-	 * Method to get a DiagramViewer for given activity.  
-	 * Without doing realization and doesn't check for diagram exists or not. 
-	 */
-	
-	public AbstractDiagramGraphicalViewer getDiagramViewer(final Object wrapper,
-			final int type, final IFilter filter,
-			final Suppression sup){
-		Object o = TngUtil.unwrap(wrapper);
-		if (!(o instanceof Activity)) {
-			return null;
-		}
-
-		Activity e = (Activity) o;
-		
-		AbstractDiagramGraphicalViewer viewer = null;
-		if (type < 0) {
-			return null;
-		}
-		viewer = getDiagramViewer(type, wrapper);
-		return viewer;
-	}
-	
-	public Activity getRealizedForUnmodified(Object wrapper, IFilter filter, 
-			Suppression suppression){
-		Activity activity = (Activity)TngUtil.unwrap(wrapper);
-		if ( activity == null ) {
-			return null;
-		}
-		
-		if (!publishADForActivityExtension)
-			return null;
-		// If extension is modified don't generate it.
-		if (!activity.getBreakdownElements().isEmpty())
-			return null;
-		
-		// Check any child is suppressed. 
-		// if any child is suppresed don't generate diagram
-		if(anyChildrenSuppressed(activity, filter, suppression)) 
-			return null;
-		
-		// Check variability and base's variability.
-		VariabilityElement calculatedBase = checkVariability(activity,
-				filter, IDiagramManager.ACTIVITY_DIAGRAM, true);
-		if (calculatedBase == null) {
-			return null;
-		}
-
-		wrapper = calculatedBase;
-		return (Activity)wrapper;
-	}
-	
-	/**
-	 * @param pubDir
-	 */
-	public void setPubDir(File pubDir) {
-		this.pubDir = pubDir;
-	}
-	
-	private boolean isForXMLExport() {
-		return forXMLExport;
-	}
-	
-	/**
-	 * @param forXMLExport
-	 */
-	public void setForXMLExport(boolean forXMLExport) {
-		this.forXMLExport = forXMLExport;
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramUIService.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramUIService.java
deleted file mode 100644
index 5e4a3c5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/DiagramUIService.java
+++ /dev/null
@@ -1,484 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.service;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.uml2.uml.ActivityFinalNode;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.DecisionNode;
-import org.eclipse.uml2.uml.FinalNode;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.InitialNode;
-import org.eclipse.uml2.uml.JoinNode;
-import org.eclipse.uml2.uml.MergeNode;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLFactory;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * A UI service for external ecore map to acess EPF Diagrams and creating
- * diagram elements.
- * 
- * @author Chinh Vo
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class DiagramUIService implements IDiagramUIService {
-
-	static boolean debug = DiagramUIPlugin.getDefault().isDebugging();
-
-	public static HashMap<String, Class> nodeTypesMap = new HashMap<String, Class>();
-
-	public DiagramUIService() {
-
-		nodeTypesMap.put(IDiagramUIService.ACTIVITY_NODE, Activity.class);
-		nodeTypesMap.put(IDiagramUIService.PHASE_NODE, Phase.class);
-		nodeTypesMap.put(IDiagramUIService.ITERATION_NODE, Iteration.class);
-		nodeTypesMap.put(IDiagramUIService.TASK_DESCRIPTOR_NODE,
-				TaskDescriptor.class);
-		nodeTypesMap.put(IDiagramUIService.MILESTONE_NODE, Milestone.class);
-		nodeTypesMap.put(IDiagramUIService.INITIAL_NODE, InitialNode.class);
-		nodeTypesMap.put(IDiagramUIService.FINAL_NODE, FinalNode.class);
-		nodeTypesMap.put(IDiagramUIService.FORK_NODE, ForkNode.class);
-		nodeTypesMap.put(IDiagramUIService.JOIN_NODE, JoinNode.class);
-		nodeTypesMap.put(IDiagramUIService.MERGE_NODE, MergeNode.class);
-		nodeTypesMap.put(IDiagramUIService.DECISION_NODE, DecisionNode.class);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createActivityDiagram(org.eclipse.epf.uma.Activity)
-	 */
-	public Diagram createActivityDiagram(Activity activity) {	
-		EObject umlActivity = UMLFactory.eINSTANCE.create(UMLPackage.eINSTANCE
-				.getActivity());
-		if (umlActivity instanceof org.eclipse.uml2.uml.Activity) {
-			((org.eclipse.uml2.uml.Activity)umlActivity).setName(activity.getName());
-		}
-		if (umlActivity instanceof EModelElement) {
-			BridgeHelper.associate((EModelElement) umlActivity, activity);
-		}
-		
-		// Create diagram
-		Diagram diagram = ViewService.createDiagram(umlActivity, DiagramManager.AD_kind,
-				ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		diagram.setElement(umlActivity);
-		if (umlActivity instanceof org.eclipse.uml2.uml.Activity) {
-			diagram.setName(activity.getName());
-		}
-		return diagram;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createEdge(org.eclipse.gmf.runtime.notation.Diagram,
-	 *      org.eclipse.gmf.runtime.notation.View,
-	 *      org.eclipse.gmf.runtime.notation.View)
-	 */
-	public Edge createEdge(Diagram diagram, View source, View target,
-			String linkName) {
-		org.eclipse.uml2.uml.Activity parentActivity = null;
-		EObject obj = diagram.getElement();
-		if (obj instanceof org.eclipse.uml2.uml.Activity) {
-			parentActivity = (org.eclipse.uml2.uml.Activity) obj;
-		}
-		if (parentActivity != null) {
-			ControlFlow flow = (org.eclipse.uml2.uml.ControlFlow) parentActivity
-					.createEdge(linkName = (linkName != null) ? linkName : "",	//$NON-NLS-1$
-							UMLPackage.eINSTANCE.getControlFlow());
-			if (source != null) {
-				if (source.getElement() != null && source.getElement() instanceof ActivityNode)
-					flow.setSource((ActivityNode) source.getElement());
-			}
-			if (target != null) {
-				if (target.getElement() != null && target.getElement() instanceof ActivityNode)
-					flow.setTarget((ActivityNode) target.getElement());
-			}
-			if (flow instanceof ControlFlow) {
-				Edge edge = ViewService.createEdge(source, target, flow,
-						new Integer(ControlFlowEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(edge, flow, new Integer(
-						ControlFlowNameEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				
-				if (source != null) {
-					edge.setSource(source);				
-				}
-				if (target != null) {
-					edge.setTarget(target);					
-				}
-				return edge;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createNode(org.eclipse.gmf.runtime.notation.Diagram,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public Node createNode(Diagram diagram, String nodeType, String nodeName) {
-		org.eclipse.uml2.uml.Activity parentActivity = null;
-		Node notationNode = null;
-		EObject obj = diagram.getElement();
-		if (obj instanceof org.eclipse.uml2.uml.Activity) {
-			parentActivity = (org.eclipse.uml2.uml.Activity) obj;
-		}
-
-		if (parentActivity != null) {
-			if (nodeType == INITIAL_NODE) {
-				ActivityNode umlNode = (InitialNode) parentActivity.createNode(
-						nodeName = (nodeName != null) ? nodeName : "",	//$NON-NLS-1$
-						UMLPackage.eINSTANCE.getInitialNode());
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(InitialNodeEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						InitialNodeNameEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (nodeType == FINAL_NODE) {
-				ActivityNode umlNode = (ActivityFinalNode) parentActivity
-						.createNode(nodeName = (nodeName != null) ? nodeName
-								: "", UMLPackage.eINSTANCE.getActivityFinalNode());	//$NON-NLS-1$
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(ActivityFinalNodeEditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						ActivityFinalNodeNameEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (nodeType == FORK_NODE) {
-				ActivityNode umlNode = (ForkNode) parentActivity.createNode(
-						nodeName = (nodeName != null) ? nodeName : "",	//$NON-NLS-1$
-						UMLPackage.eINSTANCE.getForkNode());
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(ForkNodeEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (nodeType == JOIN_NODE) {
-				ActivityNode umlNode = (JoinNode) parentActivity.createNode(
-						nodeName = (nodeName != null) ? nodeName : "",	//$NON-NLS-1$
-						UMLPackage.eINSTANCE.getJoinNode());
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(JoinNodeEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (nodeType == DECISION_NODE) {
-				ActivityNode umlNode = (DecisionNode) parentActivity
-						.createNode(nodeName = (nodeName != null) ? nodeName
-								: "", UMLPackage.eINSTANCE.getDecisionNode());	//$NON-NLS-1$
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(DecisionNodeEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						DecisionNodeNameEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (nodeType == MERGE_NODE) {
-				ActivityNode umlNode = (MergeNode) parentActivity.createNode(
-						nodeName = (nodeName != null) ? nodeName : "",			//$NON-NLS-1$
-						UMLPackage.eINSTANCE.getMergeNode());
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(MergeNodeEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						MergeNodeNameEditPart.VISUAL_ID).toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			}
-		}
-
-		return notationNode;
-	}
-
-	/*	
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#createNode(org.eclipse.gmf.runtime.notation.Diagram,
-	 *      org.eclipse.epf.uma.WorkBreakdownElement)
-	 */
-	public Node createNode(Diagram diagram, WorkBreakdownElement e) {
-		org.eclipse.uml2.uml.Activity parentActivity = null;
-		Node notationNode = null;
-		EObject obj = diagram.getElement();
-		if (obj instanceof org.eclipse.uml2.uml.Activity) {
-			parentActivity = (org.eclipse.uml2.uml.Activity) obj;
-		}
-		String name = "";
-		if(e.getPresentationName() != null){
-			name = e.getPresentationName();
-		}else{
-			name = e.getName();
-		}
-		
-		if (parentActivity != null) {
-			if (e instanceof Phase) {
-				// Phase
-				ActivityNode umlNode = (StructuredActivityNode) parentActivity
-						.createNode(name,
-								UMLPackage.eINSTANCE
-										.getStructuredActivityNode());
-
-				BridgeHelper.associate(umlNode, ((MethodElement) e));
-
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(StructuredActivityNode2EditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						StructuredActivityNodeName2EditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-
-			} else if (e instanceof Iteration) {
-				// Iteration
-				ActivityNode umlNode = (StructuredActivityNode) parentActivity
-						.createNode(name,
-								UMLPackage.eINSTANCE
-										.getStructuredActivityNode());
-
-				BridgeHelper.associate(umlNode, ((MethodElement) e));
-
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(StructuredActivityNode3EditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						StructuredActivityNodeName3EditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (e instanceof Activity) {
-				// Activity
-				ActivityNode umlNode = (StructuredActivityNode) parentActivity
-						.createNode(name,
-								UMLPackage.eINSTANCE
-										.getStructuredActivityNode());
-
-				BridgeHelper.associate(umlNode, ((MethodElement) e));
-
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(StructuredActivityNodeEditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						StructuredActivityNodeNameEditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (e instanceof TaskDescriptor) {
-				// Task descriptor
-				ActivityNode umlNode = (ActivityParameterNode) parentActivity
-						.createNode(name,
-								UMLPackage.eINSTANCE.getActivityParameterNode());
-
-				BridgeHelper.associate(umlNode, ((MethodElement) e));
-
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(ActivityParameterNodeEditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService
-						.createNode(
-								notationNode,
-								umlNode,
-								new Integer(
-										ActivityParameterNodeNameEditPart.VISUAL_ID)
-										.toString(),
-								ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (e instanceof Milestone) {
-				// Milestone
-				ActivityNode umlNode = (ActivityParameterNode) parentActivity
-						.createNode(name,
-								UMLPackage.eINSTANCE.getActivityParameterNode());
-
-				BridgeHelper.associate(umlNode, ((MethodElement) e));
-
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(ActivityParameterNode2EditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						ActivityParameterNodeName2EditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			}
-		}
-
-		return notationNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#getEdges(org.eclipse.gmf.runtime.notation.Diagram)
-	 */
-	public EList getEdges(Diagram diagram) {
-		return diagram.getPersistedEdges();
-	}
-
-	/**
-	 * Returns all diagram nodes in the diagram
-	 * 
-	 * @param diagram
-	 * @param nodeType
-	 * @return
-	 */
-	public EList getAllNodes(Diagram diagram) {
-		if (diagram != null) {
-			return diagram.getPersistedChildren();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.diagram.ui.service.IDiagramUIService#getNodes(org.eclipse.gmf.runtime.notation.Diagram,
-	 *      org.eclipse.epf.uma.Activity, java.lang.String)
-	 */
-	public List<Node> getNodes(Diagram diagram, Activity activity,
-			String nodeType) {
-		List<Node> nodes = new ArrayList<Node>();
-		if (diagram != null) {
-			List allNodes = diagram.getPersistedChildren();
-
-			for (Iterator iter = allNodes.iterator(); iter.hasNext();) {
-				Node node = (Node) iter.next();
-				EObject element = node.getElement();
-				Class classType = (Class) nodeTypesMap.get(nodeType);
-				if (element instanceof EModelElement) {
-					MethodElement ex = BridgeHelper
-							.getMethodElementFromAnnotation(
-									(EModelElement) element, activity
-											.eResource().getResourceSet());
-					if (ex != null && classType.isInstance(ex)) {
-						nodes.add(node);
-					} else {
-						if (classType != null && classType.isInstance(element)) {
-							nodes.add(node);
-						}
-					}
-				}
-			}
-		}
-		return nodes;
-	}
-
-//	private static Diagram getDiagram(Activity activity, int type,
-//			boolean create) {
-//		Diagram diagram = null;
-//		DiagramManager dMgr = DiagramManager.getInstance(TngUtil
-//				.getOwningProcess(activity));
-//
-//		if (dMgr != null) {
-//			try {
-//				List list = dMgr.getDiagrams(activity, type);
-//				if (!list.isEmpty()) {
-//					diagram = (Diagram) list.get(0);
-//				}
-//				if (diagram == null && create) {
-//					diagram = dMgr.createDiagram(activity, type,
-//							getDiagramPreferencesHint(type));
-//				}
-//			} catch (Exception e) {
-//				if (debug) {
-//					System.out.println("Core error creating a diagram:" //$NON-NLS-1$
-//							+ e.getLocalizedMessage());
-//				}
-//				DiagramUIPlugin.getDefault().getLogger().logError(
-//						"Core error creating a diagram:", e); //$NON-NLS-1$
-//			} finally {
-//				if (dMgr != null) {
-//					dMgr.release();
-//				}
-//			}
-//		}
-//		return diagram;
-//	}
-
-//	public static PreferencesHint getDiagramPreferencesHint(int diagramType) {
-//		switch (diagramType) {
-//		case IDiagramManager.ACTIVITY_DIAGRAM:
-//			return ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-//		case IDiagramManager.ACTIVITY_DETAIL_DIAGRAM:
-//			return ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-//		case IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM:
-//			return WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-//		}
-//		return null;
-//	}
-
-//	public static void openDiagram(IEditorPart part, int diagramType,
-//			Object selectedObject, Suppression suppression) {
-//		try {
-//			DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
-//					selectedObject, suppression, diagramType);
-//			DiagramEditorUtil.openDiagramEditor(part.getSite().getPage(),
-//					input, getDiagramPreferencesHint(diagramType),
-//					new NullProgressMonitor());
-//		} catch (RuntimeException e) {
-//			DiagramUIPlugin.getDefault().getLogger().logError(e);
-//		}
-//	}
-
-//	public static Diagram getDiagram(Activity activity, int type) {
-//		return getDiagram(activity, type, false);
-//	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/IDiagramImageService.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/IDiagramImageService.java
deleted file mode 100644
index 5d433b0..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/IDiagramImageService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.service;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.layout.diagram.IActivityDiagramService;
-
-/**
- * Interface for the generating diagram image.  
- * @author Shashidhar Kannoori
- */
-public interface IDiagramImageService extends IActivityDiagramService {
-
-	/**
-	 * Generates the diagram image for given activity and returns diagram image path string.
-	 * This method don't calculate the image map for generated diagram image.  In order to calculate
-	 * Image for generated diagram use {@link IActivityDiagramService}'s saveDiagram(Object wraper, String imgPath, String diagramType,
-			IFilter filter, Suppression sup); 
-	 * @param wrapper
-	 * @param imgPath
-	 * @param diagramType
-	 * @param filter
-	 * @param sup
-	 * @param realizedDiagram
-	 * @return
-	 */
-	public String generateDiagramImage(final Object wrapper, final String imgPath, 
-			final int diagramType, final IFilter filter,
-			final Suppression sup, final boolean realizedDiagram);
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/IDiagramUIService.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/IDiagramUIService.java
deleted file mode 100644
index 4646a64..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/service/IDiagramUIService.java
+++ /dev/null
@@ -1,118 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.service;
-
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * Class for mapping between Activity Diagram
- * 
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @author Chinh Vo
- * @since 1.2
- */
-public interface IDiagramUIService {
-
-	public static final String ACTIVITY_NODE = "Activity";	//$NON-NLS-1$
-
-	public static final String PHASE_NODE = "Phase";		//$NON-NLS-1$
-
-	public static final String ITERATION_NODE = "Iteration";	//$NON-NLS-1$
-
-	public static final String TASK_DESCRIPTOR_NODE = "TaskDescriptor"; //$NON-NLS-1$
-
-	public static final String MILESTONE_NODE = "Milestone";	//$NON-NLS-1$
-
-	public static final String INITIAL_NODE = "InitialNode";	//$NON-NLS-1$
-
-	public static final String FINAL_NODE = "FinalNode";		//$NON-NLS-1$
-
-	public static final String FORK_NODE = "ForkNode";			//$NON-NLS-1$
-
-	public static final String JOIN_NODE = "JoinNode";			//$NON-NLS-1$
-
-	public static final String MERGE_NODE = "MergeNode";		//$NON-NLS-1$
-
-	public static final String DECISION_NODE = "DecisionNode";	//$NON-NLS-1$
-
-	
-	/**
-	 * Returns all diagram nodes in the diagram
-	 * @param diagram
-	 * @return
-	 */
-	public EList getAllNodes(Diagram diagram);
-
-	/**
-	 * Return diagram node for given node type under given activity and diagram
-	 * @param diagram
-	 * @param activity
-	 * @param nodeType
-	 * 			e.g. IDiagramUIService.ACTIVITY_NODE, etc
-	 * @return
-	 */
-	public List<Node> getNodes(Diagram diagram, Activity activity,
-			String nodeType);
-
-	/**
-	 * To create a link
-	 * 
-	 * @param diagram
-	 * @param source
-	 * @param target
-	 * @param linkName
-	 * @return
-	 */
-	public Edge createEdge(Diagram diagram, View source, View target, String linkName);
-
-	/**
-	 * Creates diagam node for the given node type
-	 * 
-	 * @param diagram
-	 * @param nodeType
-	 * @param nodeName
-	 * @return
-	 */
-	public Node createNode(Diagram diagram, String nodeType, String nodeName);
-
-	/**
-	 * Create diagram node for the given work breakdown element
-	 * @param diagram
-	 * @param wbeElement
-	 * @return
-	 */
-	public Node createNode(Diagram diagram, WorkBreakdownElement wbeElement);
-
-	/**
-	 * Returns all edges in the diagram
-	 * @param diagram
-	 * @return
-	 */
-	public EList getEdges(Diagram diagram);
-
-	/**
-	 * Creates an activity diagram for the given activity.
-	 * 
-	 * @param activity
-	 * @return
-	 */
-	public Diagram createActivityDiagram(Activity activity);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/AbstractDiagramGraphicalViewer.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/AbstractDiagramGraphicalViewer.java
deleted file mode 100644
index 7dff1a8..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/AbstractDiagramGraphicalViewer.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.viewer;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.SWTGraphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.diagram.DiagramInfo;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editparts.LayerManager;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-
-/**
- * The abstract base class for a graphical viewer of the element diagram.
- * 
- * @author Jinhua Xi
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public abstract class AbstractDiagramGraphicalViewer {
-
-	protected Composite parent;
-
-	protected GraphicalViewer graphicalViewer;
-
-	protected Object wrapper;
-
-	public AbstractDiagramGraphicalViewer(Composite parent) {
-		this.parent = parent;
-		createGraphicalViewer();
-	}
-
-	public AbstractDiagramGraphicalViewer(Composite parent, Object wrapper) {
-		this.parent = parent;
-		this.wrapper = wrapper;
-		createGraphicalViewer();
-	}
-	/**
-	 * Creates the GraphicalViewer on the specified <code>Composite</code>
-	 * 
-	 */
-	protected void createGraphicalViewer() {
-		this.graphicalViewer = new ScrollingGraphicalViewer();
-		this.graphicalViewer.createControl(parent);
-		configureGraphicalViewer();
-	}
-
-	/**
-	 * Returns the graphical viewer.
-	 * 
-	 * @return the graphical viewer
-	 */
-	public GraphicalViewer getGraphicalViewer() {
-		return graphicalViewer;
-	}
-
-	protected void configureGraphicalViewer() {
-		getGraphicalViewer().getControl().setBackground(
-				ColorConstants.listBackground);
-		ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer) getGraphicalViewer();
-
-		ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart();
-		viewer.setRootEditPart(root);
-		viewer.setEditPartFactory(createEditPartFactory());
-	}
-
-	protected IFigure getFigure() {
-		GraphicalViewer viewer = getGraphicalViewer();
-
-		// find the figure to be saved
-		LayerManager lm = (LayerManager) viewer.getEditPartRegistry().get(
-				LayerManager.ID);
-		IFigure figure = lm.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		return figure;
-	}
-
-	protected void setSuppressionToDiagram(Diagram diagram) {
-		Object e = diagram.getObject();
-		if (e instanceof BreakdownElement) {
-			Process proc = TngUtil.getOwningProcess((BreakdownElement) e);
-			if (proc != null) {
-				diagram.setSuppression(Suppression.getSuppression(proc));
-			}
-		}
-	}
-	
-	/**
-	 * Creates diagram image from figure created in loadDiagram method.
-	 * 
-	 */
-	public Image createDiagramImage() {
-		IFigure figure = getFigure();
-
-		SWTGraphics graphics = null;
-		GC gc = null;
-		Image image = null;
-
-		try {
-			Rectangle bounds = figure.getBounds();
-			int height = bounds.height;
-			int width = bounds.width;
-
-			// create a new image and repaint the graph
-			final Display display = Display.getDefault();
-			image = new Image(display, width, height);
-			gc = new GC(image);
-			graphics = new SWTGraphics(gc);
-			figure.paint(graphics);
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		} finally {
-			// release resources
-			if (graphics != null)
-				graphics.dispose();
-			if (gc != null)
-				gc.dispose();
-		}
-
-		return image;
-	}
-
-	public void dispose() {
-		try {
-			if (graphicalViewer != null) {
-				Control ctrl = graphicalViewer.getControl();
-				if (ctrl != null) {
-					ctrl.dispose();
-				}
-
-				EditPart editPart = graphicalViewer.getContents();
-				if(editPart != null) {
-					editPart.setModel(null);
-				}
-
-				graphicalViewer = null;
-			}
-			
-		} catch (RuntimeException e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	protected abstract EditPartFactory createEditPartFactory();
-
-	protected abstract EditPart createEditPart(Object e, IFilter filter,
-			Suppression sup);
-
-	protected abstract String getDiagramType();
-
-	protected void cleanUpDiagram() {
-		// default implementation does nothing
-	}
-	
-	public abstract DiagramInfo getDiagramInfo();
-	public abstract EditPart loadDiagram(Object wrapper, boolean needReset,
-			IFilter filter, Suppression sup);
-
-	public abstract void setMethodConfiguration(MethodConfiguration config);
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/AbstractDiagramGraphicalViewerEx.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/AbstractDiagramGraphicalViewerEx.java
deleted file mode 100644
index 9ce7863..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/AbstractDiagramGraphicalViewerEx.java
+++ /dev/null
@@ -1,469 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.viewer;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.DelegatingLayout;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.emf.workspace.AbstractEMFOperation;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityEditPart;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
-import org.eclipse.epf.diagram.core.part.IDiagramEditorInputProvider;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.model.LinkedObject;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.diagram.ui.service.DiagramImageService;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.diagram.DiagramInfo;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.image.ImageFileFormat;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @author Shashidhar Kannoori
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public abstract class AbstractDiagramGraphicalViewerEx extends
-		AbstractDiagramGraphicalViewer {
-	
-	protected class DiagramGraphicalViewerEx extends DiagramGraphicalViewer implements IDiagramEditorInputProvider {
-		private DiagramEditorInput input;
-		public DiagramEditorInput getDiagramEditorInput() {
-			if(input == null) {
-				input = new DiagramEditorInput(wrapper, null, DiagramImageService.getIntType(getDiagramType()));
-			}
-			return input;
-		}
-
-		public IEditorPart getEditor() {
-			return null;
-		}
-		
-	};
-
-	protected GraphicalEditPart part = null;
-	protected Diagram diagram;
-	protected DiagramManager dmgr;
-	protected boolean debug = DiagramUIPlugin.getDefault().isDebugging(); 
-	protected MethodConfiguration config = null;
-
-	public AbstractDiagramGraphicalViewerEx(Composite parent, Object wrapper) {
-		super(parent, wrapper);
-	}
-
-	/**
-	 * Creates diagram for given object (only for {@link Activity} and packs the bounds.
-	 * 
-	 * @param wrapper 	{@link Object} 	
-	 * @param needReset boolean
-	 * @param filter 	{@link IFilter}
-	 * @param sup		{@link Suppression}
-	 */
-	public EditPart loadDiagram(Object wrapper, boolean needReset,
-			IFilter filter, Suppression sup) {
-		// initialize the viewer with the edit part
-		EditPart editPart = createEditPart(wrapper, filter, sup);
-		if(editPart == null){
-			if (debug) {
-				System.err.println("Editpart is null: "+ wrapper); //$NON-NLS-1$
-			}
-			return editPart;
-		}
-		this.graphicalViewer.setContents(editPart);
-		DiagramEditPart diagramEditPart = (DiagramEditPart)editPart;		
-		org.eclipse.emf.ecore.resource.Resource resource = diagramEditPart.getDiagramView().eResource();
-		boolean oldDeliver = resource.eDeliver();
-		try {
-			// disable notification on the resource change during refresh to
-			// avoid making the diagram editor dirty
-			//
-			if(resource != null) {
-				resource.eSetDeliver(false);
-			}
-			refresh(diagramEditPart);
-		}
-		finally {
-			if(resource != null) {
-				resource.eSetDeliver(oldDeliver);
-			}
-		}
-		
-		// ask for immediate update of the control so that the diagram figure
-		// will be computed
-		parent.pack(true);
-		if(editPart != null){
-			if(debug){
-				for (Iterator<?> iterator = editPart.getChildren().iterator(); iterator.hasNext();) {
-					EditPart name = (EditPart) iterator.next();
-					View view = (View)name.getModel();
-					System.out.println(view.getType() +":" + ViewUtil.getStructuralFeatureValue(view,
-						NotationPackage.eINSTANCE.getLocation_X()) + "," + ViewUtil.getStructuralFeatureValue(view,
-								NotationPackage.eINSTANCE.getLocation_Y()));
-				}
-			}
-		}
-
-		// This check is needed for browsing, in order to render activity contributing's
-		// children.  In processAuthoring we don't do realization, in order to displayed 
-		// realized elements, we have to cleanup ADD diagram and recreate. needtoReset or cleanupdiagram.
-		// Only for activity detail diagram.
-		Object o = TngUtil.unwrap(wrapper);
-		if(o instanceof VariabilityElement && getDiagramType() != null && 
-				getDiagramType().equalsIgnoreCase(ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL)){
-			if(TngUtil.hasContributor((VariabilityElement)o)){
-				needReset = true;
-			}
-		}
-		
-		if (needReset) {
-			cleanUpDiagram();
-			parent.pack(true);
-		}
-		IFigure figure = getFigure();
-		if (figure != null) {
-			Rectangle bounds = figure.getBounds();
-			if (bounds.x < 0 || bounds.y < 0) {
-				if(editPart instanceof ActivityEditPart){
-					((ActivityEditPart) editPart).moveFigure(-bounds.x, -bounds.y);
-				}
-				parent.pack(true);
-
-				bounds = figure.getBounds();
-			}
-		}
-
-		return editPart;
-	}
-
-	
-	/**
-	 * returns {@link DiagramInfo}
-	 * 
-	 */
-	public DiagramInfo getDiagramInfo() {
-		DiagramInfo diagramInfo = null;
-
-		Object element = part.getModel();
-		if (element instanceof LinkedObject) {
-			element = ((LinkedObject) element).getObject();
-		}
-		if(element instanceof View){
-			 element = ((View)element).getElement();
-			if(element != null && element instanceof EModelElement){
-				element = BridgeHelper.getMethodElement((EModelElement)element);
-			}
-			if(element instanceof Node){
-				element = ((Node)element).getLinkedElement();
-			}
-		}
-
-		if (element instanceof MethodElement) {
-			diagramInfo = new DiagramInfo(getDiagramType(),
-					(MethodElement) element);
-			loadDiagramInfo(part, diagramInfo);
-		}
-
-		return diagramInfo;
-	}
-	
-	public void createDiagramImage(ImageFileFormat imageFileFormat){
-//		CopyToImageUtil im = new CopyToImageUtil();
-		//im.copyToImage(part, destination, format, monitor)
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#createEditPartFactory()
-	 */
-	@Override
-	protected EditPartFactory createEditPartFactory() {
-		return EditPartService.getInstance();
-	}
-	
-	
-	/**
-	 * 
-	 */
-	protected void configureGraphicalViewer() {
-		getGraphicalViewer().getControl().setBackground(
-				ColorConstants.listBackground);
-		DiagramGraphicalViewer viewer = (DiagramGraphicalViewer) getGraphicalViewer();
-
-		DiagramRootEditPart root = (DiagramRootEditPart) EditPartService
-				.getInstance().createRootEditPart(getDiagram());
-//		LayeredPane printableLayers = (LayeredPane) root
-//				.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		FreeformLayer extLabelsLayer = new FreeformLayer();
-		extLabelsLayer.setLayoutManager(new DelegatingLayout());
-//		printableLayers.addLayerAfter(extLabelsLayer,
-//				UMLEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
-//				LayerConstants.PRIMARY_LAYER);
-		LayeredPane scalableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.SCALABLE_LAYERS);
-		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
-		scaledFeedbackLayer.setEnabled(false);
-		scalableLayers.addLayerAfter(scaledFeedbackLayer,
-				LayerConstants.SCALED_FEEDBACK_LAYER,
-				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
-		viewer.setRootEditPart(root);
-		viewer.setEditPartFactory(createEditPartFactory());
-		
-		// Set editing domain
-//		DiagramEditDomain editDomain = new DiagramEditDomain(null);
-//        editDomain.setCommandStack(
-//            new DiagramCommandStack(editDomain));
-//
-//        viewer.setEditDomain(editDomain);
-        
-//        PreferencesHint preferencesHint = DiagramImageService.getPreferenceHint(
-//        		getDiagramType());
-//        if (root instanceof IDiagramPreferenceSupport) {
-//            if (preferencesHint == null) {
-//                preferencesHint = ((IDiagramPreferenceSupport) root)
-//                    .getPreferencesHint();
-//            } else {
-//                ((IDiagramPreferenceSupport) root)
-//                    .setPreferencesHint(preferencesHint);
-//            }
-//            viewer
-//                .hookWorkspacePreferenceStore((IPreferenceStore) preferencesHint
-//                    .getPreferenceStore());
-//        }
-//        
-//        DiagramEventBroker.startListening(TransactionUtil.getEditingDomain(diagram));
-//        viewer.setContents(diagram);
-	}
-	
-	/*
-	 * 
-	 */
-	protected Diagram getDiagram(){
-		if (diagram == null) {
-			try {
-				if (diagram == null) {
-					Object o = TngUtil.unwrap(wrapper);
-					if (o instanceof Activity) {
-						Activity act = (Activity) o;
-						dmgr = DiagramManager.getInstance(TngUtil
-								.getOwningProcess(act), this);
-						List<Diagram> list = dmgr.getDiagrams(act, DiagramImageService
-								.getIntType(getDiagramType()));
-						if (!list.isEmpty()) {
-							diagram = (Diagram) list.get(0);
-						} else {
-							if (debug) {
-								System.out
-										.println("Diagram is empty for " + act); //$NON-NLS-1$
-							}
-						}
-					}
-				}
-
-			} catch (Exception e) {
-				if (debug) {
-					e.printStackTrace();
-				}
-			}
-			if (diagram == null) {
-				if (debug) {
-					System.out
-							.println("Creating diagram of  " + getDiagramType()); //$NON-NLS-1$
-				}
-				try {
-					diagram = dmgr.createDiagram((Activity) TngUtil
-							.unwrap(wrapper), DiagramImageService
-							.getIntType(getDiagramType()), DiagramImageService
-							.getPreferenceHint(getDiagramType()));
-				} catch (Exception e) {
-
-				}
-			}
-			
-			if(diagram != null) {
-				EObject e = diagram.getElement();
-				if(e instanceof Node) {
-					((Node)e).addConsumer(this);
-				}
-			}
-		}
-		return diagram;
-	}
-	
-	@Override
-	protected void createGraphicalViewer() {
-		this.graphicalViewer = new DiagramGraphicalViewerEx();
-		this.graphicalViewer.createControl(parent);
-		configureGraphicalViewer();
-	}
-	
-	protected void loadDiagramInfo(GraphicalEditPart part, DiagramInfo diagramInfo) {
-		List<?> children = part.getChildren();
-		for (Iterator<?> it = children.iterator(); it.hasNext();) {
-			Object o = it.next();
-
-			if (o instanceof GraphicalEditPart) {
-				part = (GraphicalEditPart) o;
-				Object model = part.getModel();
-				Object e = model;
-				if (e instanceof LinkedObject) {
-					e = ((LinkedObject) e).getObject();
-				}
-				if (e instanceof View) {
-					e = ((View) e).getElement();
-					if (e instanceof Node) {
-						if (e instanceof NodeContainer) {
-							loadDiagramInfo((GraphicalEditPart) o, diagramInfo);
-						}
-						e = ((Node) e).getLinkedElement();
-					}
-					if (e != null && e instanceof EModelElement) {
-						e = BridgeHelper.getMethodElement((EModelElement) e);
-					}
-				}
-
-				if (e instanceof DiagramElement) {
-					continue;
-				}
-
-				if (e instanceof MethodElement) {
-					boolean suppressed;
-					if (model instanceof NamedNode) {
-						suppressed = ((NamedNode) model).isSuppressed();
-					} else {
-						suppressed = ((MethodElement) e).getSuppressed()
-								.booleanValue();
-					}
-
-					IFigure f = part.getFigure();
-					Rectangle bounds = f.getBounds();
-
-					String altTag = null;
-					if (f instanceof WrapLabel) {
-						altTag = ((WrapLabel) f).getText();
-					}
-					diagramInfo.addArea((MethodElement) e, bounds.x, bounds.y,
-							bounds.width, bounds.height, altTag, suppressed);
-
-				}
-			} else {
-			}
-		}
-	}
-	
-	@Override
-	public void dispose() {
-		super.dispose();
-		
-		if(dmgr != null){
-			dmgr.removeConsumer(this);
-		}
-		if(diagram != null) {
-			EObject e = diagram.getElement();
-			if(e instanceof Node) {
-				((Node)e).removeConsumer(this);
-			}
-		}
-	}
-	
-	protected void refresh(DiagramEditPart editPart){
-		try {
-			DiagramEditorUtil.refresh(editPart, new NullProgressMonitor(), true);
-			DiagramEditorUtil.refreshLabels(editPart);
-		} catch(Exception e) {
-			if(debug){
-				System.out.println("Error diagram refresh while publishing : " + e);	 //$NON-NLS-1$
-			}
-		}
-	}
-	
-	public void updateDiagramElement(final org.eclipse.gmf.runtime.notation.Diagram model, final MethodElement element,  
-			final Suppression sup, final MethodConfiguration configuration, final IFilter filter, IProgressMonitor monitor){
-		TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(model);
-		AbstractEMFOperation op = new AbstractEMFOperation(domain, "") {	//$NON-NLS-1$
-		
-			@Override
-			protected IStatus doExecute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-				org.eclipse.epf.diagram.model.Diagram d = 
-					(org.eclipse.epf.diagram.model.Diagram) model.getElement();
-				d.setSuppression(sup);
-				if(filter == null && configuration != null){
-					ProcessConfigurator p = new ProcessConfigurator(config);
-					d.setFilter(p);
-				}else{
-					d.setFilter(filter);
-				}
-				d.setLinkedElement(element);
-				
-				return Status.OK_STATUS;
-			}
-		
-		};
-		try {
-			op.execute(monitor, null);
-		} catch (ExecutionException e) {
-			CommonPlugin.getDefault().getLogger().logError(e);
-		}
-		
-	}
-	
-	public void setMethodConfiguration(MethodConfiguration config) {
-		this.config = config;
-	}
-	
-	public MethodConfiguration getMethodConfiguration(){
-		return config;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewActivityDetailDiagramViewer.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewActivityDetailDiagramViewer.java
deleted file mode 100644
index b35175c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewActivityDetailDiagramViewer.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.viewer;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.epf.diagram.add.edit.parts.ActivityDetailDiagramEditPart;
-import org.eclipse.epf.diagram.add.service.DiagramResetService;
-import org.eclipse.epf.diagram.core.actions.DiagramActionsService;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The graphical viewer for the ActivityDetail diagram.
- * 
- * @author Jinhua Xi
- * @author Shashidhar Kannoori
- */
-public class NewActivityDetailDiagramViewer extends
-		AbstractDiagramGraphicalViewerEx {
-
-	/**
-	 * @param parent
-	 * @param wrapper
-	 */
-	public NewActivityDetailDiagramViewer(Composite parent, Object wrapper) {
-		super(parent, wrapper);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#createEditPart(java.lang.Object, org.eclipse.epf.library.edit.IFilter, org.eclipse.epf.library.edit.util.Suppression)
-	 */
-	@Override
-	protected EditPart createEditPart(Object wrapper, IFilter filter, Suppression sup) {
-		Activity e = null;
-		if (wrapper instanceof ActivityWrapperItemProvider) {
-			e = (Activity) TngUtil.unwrap(wrapper);
-		} else if (wrapper instanceof Activity) {
-			e = (Activity) wrapper;
-		}
-		if(e instanceof Activity){
-			updateDiagramElement(diagram, (MethodElement)e, sup, getMethodConfiguration(),
-					filter,
-					new NullProgressMonitor());
-			DiagramEditDomain domain = new DiagramEditDomain(null);
-			((IDiagramGraphicalViewer)graphicalViewer).setEditDomain(domain);
-			part = EditPartService.getInstance().createGraphicEditPart(diagram);
-			if(part == null){
-				DiagramUIPlugin.getDefault().getLogger().
-				logError("Publishing: Activity Detail Diagram EditPart creation failed for : "+e); //$NON-NLS-1$
-			}
-			return part;
-		}
-		return part;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#getDiagramType()
-	 */
-	@Override
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL;
-	}
-
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#cleanUpDiagram()
-	 */
-	protected void cleanUpDiagram() {
-		ActivityDetailDiagramEditPart dep = (ActivityDetailDiagramEditPart) getGraphicalViewer()
-				.getContents();
-		if (dep != null) {
-			dep.getRecentlyAddedParts().addAll(dep.getChildren());
-
-			// clean up the diagram
-			DefaultEditDomain editingDomain = new DefaultEditDomain(null);
-			ActionRegistry actionRegistry = new ActionRegistry();
-
-			DiagramActionsService actionService = new DiagramActionsService(
-					dmgr.getEditingDomain(), getGraphicalViewer(),
-					editingDomain, actionRegistry);
-			actionService.registerVerticalAlignFirstSelectedAction();
-
-			DiagramResetService service = new DiagramResetService(dmgr
-					.getEditingDomain(), getGraphicalViewer(), editingDomain,
-					actionRegistry);
-			service.cleanUpDiagram();
-			// TODO: need to improve this function. Have to call it twice right now
-			// so it can layout the diagram correctly.
-			service.cleanUpDiagram();			
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewActivityDiagramViewer.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewActivityDiagramViewer.java
deleted file mode 100644
index c1dcb54..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewActivityDiagramViewer.java
+++ /dev/null
@@ -1,212 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.viewer;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.DelegatingLayout;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityPartitionEditPart;
-import org.eclipse.epf.diagram.core.bridge.ActivityDiagramAdapter;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.diagram.DiagramInfo;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * The graphical viewer for the Activity diagram.
- * 
- * @author Jinhua Xi
- * @author Shashidhar Kannoori
- * @since 1.2
- */
-public class NewActivityDiagramViewer extends AbstractDiagramGraphicalViewerEx {
-
-
-
-	/**
-	 * @param parent
-	 */
-	public NewActivityDiagramViewer(Composite parent, Object act) {
-		super(parent,act);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#createEditPart(java.lang.Object, org.eclipse.epf.library.edit.IFilter, org.eclipse.epf.library.edit.util.Suppression)
-	 */
-	@Override
-	protected EditPart createEditPart(Object wrapper, IFilter filter, Suppression sup) {
-		Activity e = null;
-		ActivityDiagramAdapter adapter = null;
-		if (wrapper instanceof ActivityWrapperItemProvider) {
-			e = (Activity) TngUtil.unwrap(wrapper);
-			adapter = new ActivityDiagramAdapter(
-					(ActivityWrapperItemProvider) wrapper);
-		} else {
-			if (wrapper instanceof Activity) {
-				e = (Activity) wrapper;
-				adapter = new ActivityDiagramAdapter(e);
-			}
-		}
-		if (adapter != null) {
-			try {
-				adapter.setView(diagram);
-				adapter.setFilter(filter);
-				adapter.setSuppression(sup);
-				adapter.setEditingDomain((InternalTransactionalEditingDomain) TransactionUtil
-								.getEditingDomain(diagram.getElement()));
-				diagram.getElement().eAdapters().add(adapter);
-				DiagramEditDomain domain = new DiagramEditDomain(null);
-				((IDiagramGraphicalViewer) graphicalViewer)
-						.setEditDomain(domain);
-				part = EditPartService.getInstance().createGraphicEditPart(
-						diagram);
-				if (part == null) {
-					DiagramUIPlugin.getDefault().getLogger().logError(
-							"Publishing: Activity Diagram EditPart creation failed for : "	//$NON-NLS-1$
-									+ e);
-				}
-				return part;
-
-			} catch (Exception ex) {
-				ex.printStackTrace();
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#getDiagramType()
-	 */
-	@Override
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
-	}
-
-	/**
-	 * 
-	 */
-	protected void loadDiagramInfo(GraphicalEditPart part, DiagramInfo diagramInfo) {
-		List children = part.getChildren();
-		for (Iterator it = children.iterator(); it.hasNext();) {
-			Object o = it.next();
-			if (o instanceof ActivityPartitionEditPart)
-			{
-				ActivityPartitionEditPart partition = (ActivityPartitionEditPart) o;
-				List partitionChildren = partition.getChildren();
-				for (Iterator i = partitionChildren.iterator(); i.hasNext();)
-				{
-					Object o1 = i.next();
-					if (o1 instanceof GraphicalEditPart){
-						loadDiagramInfo((GraphicalEditPart) o1, diagramInfo);
-					}
-				}
-				
-			} else if (o instanceof GraphicalEditPart) {
-				part = (GraphicalEditPart) o;
-				Object model = part.getModel();
-				Object e = model;
-				
-				if(e instanceof View){
-					EModelElement ex = (EModelElement)((View)e).getElement();
-					if(ex != null){
-						e = BridgeHelper.getMethodElement(ex);
-					}
-				}
-				
-				if (e instanceof MethodElement) {
-					boolean suppressed;
-					if (model instanceof Node) {
-						suppressed = ((MethodElement)BridgeHelper.getMethodElement((EModelElement)((Node)model).getElement())).getSuppressed().booleanValue();
-					} else {
-						suppressed = ((MethodElement) e).getSuppressed()
-								.booleanValue();
-					}
-
-					IFigure f = part.getFigure();
-					Rectangle bounds = f.getBounds();
-
-					String altTag = null;
-					if (f instanceof WrapLabel) {
-						altTag = ((WrapLabel) f).getText();
-					}
-					diagramInfo.addArea((MethodElement) e, bounds.x,
-						bounds.y, bounds.width, bounds.height, altTag, suppressed);
-
-				}
-				else
-					diagramInfo.addGraphicalNodes();
-			} 
-		}
-	}
-	
-	@Override
-	protected void createGraphicalViewer() {
-		this.graphicalViewer = new DiagramGraphicalViewer();
-		this.graphicalViewer.createControl(parent);
-		configureGraphicalViewer();
-	}
-	
-	/**
-	 * 
-	 */
-	protected void configureGraphicalViewer() {
-		getGraphicalViewer().getControl().setBackground(
-				ColorConstants.listBackground);
-		DiagramGraphicalViewer viewer = (DiagramGraphicalViewer) getGraphicalViewer();
-
-		DiagramRootEditPart root = (DiagramRootEditPart) EditPartService
-				.getInstance().createRootEditPart(getDiagram());
-		LayeredPane printableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		FreeformLayer extLabelsLayer = new FreeformLayer();
-		extLabelsLayer.setLayoutManager(new DelegatingLayout());
-//		printableLayers.addLayerAfter(extLabelsLayer,
-//				UMLEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
-//				LayerConstants.PRIMARY_LAYER);
-		LayeredPane scalableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.SCALABLE_LAYERS);
-		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
-		scaledFeedbackLayer.setEnabled(false);
-		scalableLayers.addLayerAfter(scaledFeedbackLayer,
-				LayerConstants.SCALED_FEEDBACK_LAYER,
-				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
-		viewer.setRootEditPart(root);
-		viewer.setEditPartFactory(createEditPartFactory());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewWPDependencyDiagramViewer.java b/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewWPDependencyDiagramViewer.java
deleted file mode 100644
index 02bbdd5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.ui/src/org/eclipse/epf/diagram/ui/viewer/NewWPDependencyDiagramViewer.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.ui.viewer;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.draw2d.DelegatingLayout;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.epf.diagram.ui.DiagramUIPlugin;
-import org.eclipse.epf.diagram.wpdd.edit.parts.DiagramEditPartFactory;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.EditPartService;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- *  The graphical viewer for the WorkProduct Dependency diagram.
- *  
- * @author Jinhua Xi
- * @author Shashidhar Kannoori
- */
-public class NewWPDependencyDiagramViewer extends
-		AbstractDiagramGraphicalViewerEx {
-
-	/**
-	 * @param parent
-	 * @param wrapper
-	 */
-	public NewWPDependencyDiagramViewer(Composite parent, Object wrapper) {
-		super(parent, wrapper);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#createEditPart(java.lang.Object, org.eclipse.epf.library.edit.IFilter, org.eclipse.epf.library.edit.util.Suppression)
-	 */
-	@Override
-	protected EditPart createEditPart(Object wrapper, IFilter filter, Suppression sup) {
-		Activity e = null;
-		if(wrapper instanceof ActivityWrapperItemProvider){
-			e = (Activity)TngUtil.unwrap(wrapper);
-		}else if(wrapper instanceof Activity){
-			e = (Activity)wrapper;
-		}
-		if(e instanceof Activity){
-			updateDiagramElement(diagram, (MethodElement)e, sup, getMethodConfiguration(),
-					filter,
-					new NullProgressMonitor());
-			DiagramEditDomain domain = new DiagramEditDomain(null);
-			((IDiagramGraphicalViewer)graphicalViewer).setEditDomain(domain);
-			part = EditPartService.getInstance().createGraphicEditPart(diagram);
-			if(part == null){
-				DiagramUIPlugin.getDefault().getLogger().
-				logError("Publishing: WorkProduct Diagram EditPart creation failed for : "+e); //$NON-NLS-1$
-			}
-			return part;
-		}
-		return part;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.gef.viewer.AbstractDiagramGraphicalViewer#getDiagramType()
-	 */
-	@Override
-	protected String getDiagramType() {
-		return ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY;
-	}
-	@Override
-	protected void configureGraphicalViewer() {
-		DiagramGraphicalViewer viewer = (DiagramGraphicalViewer) getGraphicalViewer();
-		DiagramRootEditPart root = (DiagramRootEditPart) EditPartService
-		.getInstance().createRootEditPart(getDiagram());
-		LayeredPane printableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		FreeformLayer extLabelsLayer = new FreeformLayer();
-		extLabelsLayer.setLayoutManager(new DelegatingLayout());
-//		printableLayers.addLayerAfter(extLabelsLayer,
-//				DiagramEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
-//				LayerConstants.PRIMARY_LAYER);
-		LayeredPane scalableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.SCALABLE_LAYERS);
-		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
-		scaledFeedbackLayer.setEnabled(false);
-		scalableLayers.addLayerAfter(scaledFeedbackLayer,
-				LayerConstants.SCALED_FEEDBACK_LAYER,
-				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
-		viewer.setRootEditPart(root);
-		viewer.setEditPartFactory(createEditPartFactory());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/.classpath b/1.5/plugins/org.eclipse.epf.diagram.wpdd/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/.options b/1.5/plugins/org.eclipse.epf.diagram.wpdd/.options
deleted file mode 100644
index 6db6150..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/.options
+++ /dev/null
@@ -1,7 +0,0 @@
-# Debugging options for the org.eclipse.epf.diagram.wpdd plug-in
-
-# Turn on general debugging for the org.eclipse.epf.diagram.wpdd plug-in
-org.eclipse.epf.diagram.wpdd/debug=false
-
-# Turn on debugging of visualID processing
-org.eclipse.epf.diagram.wpdd/debug/visualID=true
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/.project b/1.5/plugins/org.eclipse.epf.diagram.wpdd/.project
deleted file mode 100644
index 157ae45..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.diagram.wpdd</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.diagram.wpdd/META-INF/MANIFEST.MF
deleted file mode 100644
index 0dd0414..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,44 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.diagram.wpdd; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.epf.diagram.wpdd.edit.parts, 
- org.eclipse.epf.diagram.wpdd.part,
- org.eclipse.epf.diagram.wpdd.providers
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jface,
- org.eclipse.ui.ide,
- org.eclipse.ui.views,
- org.eclipse.emf.ecore,
- org.eclipse.emf.ecore.xmi,
- org.eclipse.emf.edit.ui,
- org.eclipse.gef;visibility:=reexport,
- org.eclipse.gmf.runtime.emf.core,
- org.eclipse.gmf.runtime.emf.commands.core,
- org.eclipse.gmf.runtime.emf.ui.properties,
- org.eclipse.gmf.runtime.diagram.ui,
- org.eclipse.gmf.runtime.diagram.ui.printing.render,
- org.eclipse.gmf.runtime.diagram.ui.printing,
- org.eclipse.gmf.runtime.diagram.ui.properties,
- org.eclipse.gmf.runtime.diagram.ui.providers,
- org.eclipse.gmf.runtime.diagram.ui.providers.ide,
- org.eclipse.gmf.runtime.diagram.ui.render,
- org.eclipse.gmf.runtime.diagram.ui.resources.editor,
- org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide,
- org.eclipse.gmf.runtime.notation.providers,
- org.eclipse.epf.diagram.edit;visibility:=reexport,
- org.eclipse.epf.uma;visibility:=reexport,
- org.eclipse.epf.uma.edit;visibility:=reexport,
- org.eclipse.gmf.runtime.draw2d.ui;visibility:=reexport,
- org.eclipse.draw2d;visibility:=reexport,
- org.eclipse.epf.diagram.core,
- org.eclipse.epf.diagram.model,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/build.properties b/1.5/plugins/org.eclipse.epf.diagram.wpdd/build.properties
deleted file mode 100644
index dd92db9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-bin.includes = .,\
-               icons/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties
-jars.compile.order = .
-source.. = src/
-output.. = bin/
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/diagram/workproductdescriptor.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/diagram/workproductdescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/diagram/workproductdescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/dtool16/WPDDEditor.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/dtool16/WPDDEditor.gif
deleted file mode 100644
index d5f5c7a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/dtool16/WPDDEditor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/etool16/WPDDEditor.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/etool16/WPDDEditor.gif
deleted file mode 100644
index 18612f4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/etool16/WPDDEditor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/obj16/WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/obj16/WorkProductDescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/obj16/WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/obj16/link_pal16.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/obj16/link_pal16.gif
deleted file mode 100644
index 18f408c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/full/obj16/link_pal16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/obj16/ModelDiagramFile.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/obj16/ModelDiagramFile.gif
deleted file mode 100644
index 33676a6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/obj16/ModelDiagramFile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/obj16/UmaDiagramFile.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/obj16/UmaDiagramFile.gif
deleted file mode 100644
index 9e229cf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/obj16/UmaDiagramFile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/wizban/NewModelWizard.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/wizban/NewModelWizard.gif
deleted file mode 100644
index 3df85fe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/wizban/NewModelWizard.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/wizban/NewUmaWizard.gif b/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/wizban/NewUmaWizard.gif
deleted file mode 100644
index f305b72..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/icons/wizban/NewUmaWizard.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/messages.properties b/1.5/plugins/org.eclipse.epf.diagram.wpdd/messages.properties
deleted file mode 100644
index 0a42242..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/messages.properties
+++ /dev/null
@@ -1,53 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-
-################################################################################
-# START NO TRANSLATION
-################################################################################
-# TODO: manually put keys and values
-DiagramDiagramEditorUtil_OpenModelResourceErrorDialogTitle=Error
-DiagramDiagramEditorUtil_OpenModelResourceErrorDialogMessage=Failed to load model file {0}
-DiagramDiagramEditorUtil_CreateDiagramProgressTask=Creating diagram and model files
-DiagramDiagramEditorUtil_CreateDiagramCommandLabel=Creating diagram and model
-DiagramDocumentProvider_isModifiable=Updating cache failed
-DiagramDocumentProvider_handleElementContentChanged=Failed to refresh hierarchy for changed resource
-DiagramDocumentProvider_IncorrectInputError={1}
-DiagramDocumentProvider_UnableToLoadResourceError=Unable to load diagram resource
-DiagramDocumentProvider_NoDiagramInResourceError=Diagram is not present in resource
-DiagramDocumentProvider_DiagramLoadingError=Error loading diagram
-DiagramDocumentProvider_UnsynchronizedFileSaveError=The file has been changed on the file system
-DiagramDocumentProvider_SaveDiagramTask=Saving diagram
-DiagramDocumentProvider_SaveNextResourceTask=Saving {0}
-DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle=Error
-DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage=Model file loading failed
-DiagramInitDiagramFileAction_InitDiagramFileWizardTitle=Initialize new {0} diagram file
-DiagramInitDiagramFileAction_OpenModelFileDialogTitle=Select domain model
-DiagramNewDiagramFileWizard_CreationPageName=Initialize new diagram file
-DiagramNewDiagramFileWizard_CreationPageTitle=Diagram file
-DiagramNewDiagramFileWizard_CreationPageDescription=Create new diagram based on {0} model content
-DiagramNewDiagramFileWizard_RootSelectionPageName=Select diagram root element
-DiagramNewDiagramFileWizard_RootSelectionPageTitle=Diagram root element
-DiagramNewDiagramFileWizard_RootSelectionPageDescription=Select semantic model element to be depicted on diagram
-DiagramNewDiagramFileWizard_RootSelectionPageSelectionTitle=Select diagram root element:
-DiagramNewDiagramFileWizard_RootSelectionPageNoSelectionMessage=Diagram root element is not selected
-DiagramNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage=Invalid diagram root element is selected
-DiagramNewDiagramFileWizard_InitDiagramCommand=Initializing diagram contents
-DiagramNewDiagramFileWizard_IncorrectRootError=Incorrect model object stored as a root resource object
-Model1Group_title=model
-ControlFlow1CreationTool_title=Control Flow
-ControlFlow1CreationTool_desc=Create new Control Flow
-WorkProductDescriptor2CreationTool_title=Work Product Descriptor
-WorkProductDescriptor2CreationTool_desc=Create new work product descriptor
-
-CommandName_OpenDiagram=Open Diagram
-################################################################################
-# END NO TRANSLATION
-################################################################################
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfgen
deleted file mode 100644
index 1bdfd1f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfgen
+++ /dev/null
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel" packageNamePrefix="org.eclipse.epf.diagram.wpdd"
-    modelID="WPDD"
-    sameFileForDiagramAndModel="true"
-    diagramFileExtension="wpdd">
-  <diagram
-      visualID="79"
-      editPartClassName="WorkProductDependencyDiagramEditPart"
-      itemSemanticEditPolicyClassName="WorkProductDependencyDiagramItemSemanticEditPolicy"
-      notationViewFactoryClassName="WorkProductDependencyDiagramViewFactory"
-      iconProviderPriority="Low"
-      canonicalEditPolicyClassName="WorkProductDependencyDiagramCanonicalEditPolicy">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="WorkProductDependencyDiagramEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductDependencyDiagram"/>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="WorkProductNodeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductNodeViewFactory"
-        canonicalEditPolicyClassName="WorkProductNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="WorkProductNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="WorkProductNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class WorkProductNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public WorkProductNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;New Work Product Descriptor&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNamedNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNamedNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNamedNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNamedNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNamedNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNamedNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4001"
-          editPartClassName="WorkProductNodeNameEditPart"
-          itemSemanticEditPolicyClassName="WorkProductNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="WorkProductNodeNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNamedNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="">
-          <metaFeature
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="LinkEditPart"
-        itemSemanticEditPolicyClassName="LinkItemSemanticEditPolicy"
-        notationViewFactoryClassName="LinkViewFactory">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="LinkEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="LinkFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class LinkFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public LinkFigure() {&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.draw2d.PolylineDecoration createTargetDecoration() {&#xD;&#xA;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xD;&#xA;// dispatchNext?&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, 1);&#xD;&#xA;&#x9;&#x9;pl.addPoint(0, 0);&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, -1);&#xD;&#xA;&#x9;&#x9;df.setTemplate(pl);&#xD;&#xA;&#x9;&#x9;df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;return df;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/target"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="LinkNameEditPart"
-          itemSemanticEditPolicyClassName="LinkNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="LinkNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="LinkNameFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class LinkNameFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public LinkNameFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern=""
-            editPattern="">
-          <metaFeature
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <palette>
-      <groups
-          title="model">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Control Flow"
-            description="Create new Control Flow"
-            smallIconPath="/org.eclipse.epf.diagram.wpdd/icons/full/obj16/link_pal16.gif"
-            genLinks="//@diagram/@links.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Work Product Descriptor"
-            description="Create new work product descriptor"
-            smallIconPath="/org.eclipse.epf.diagram.wpdd/icons/full/obj16/WorkProductDescriptor.gif"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-      </groups>
-    </palette>
-  </diagram>
-  <plugin
-      iD="org.eclipse.epf.diagram.wpdd"
-      name="Work Product Dependency Diagram Plugin"
-      provider="EPF"
-      printingEnabled="true"
-      activatorClassName="WPDDiagramEditorPlugin"/>
-  <editor
-      className="WorkProductDependencyDiagramEditor"/>
-  <domainGenModel
-      href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#/"/>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfgraph b/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfgraph
deleted file mode 100644
index 565d23f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfgraph
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgraph:Canvas xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgraph="http://www.eclipse.org/gmf/2005/GraphicalDefinition" name="model">
-  <figures
-      name="Default">
-    <figures
-        xsi:type="gmfgraph:PolylineConnection"
-        referencingElements="Link"
-        name="LinkFigure"
-        targetDecoration="OpenArrow">
-      <children
-          xsi:type="gmfgraph:PolylineDecoration"
-          name="OpenArrow">
-        <template
-            x="-1"
-            y="1"/>
-        <template/>
-        <template
-            x="-1"
-            y="-1"/>
-      </children>
-      <children
-          xsi:type="gmfgraph:Label"
-          referencingElements="LinkName"
-          name="LinkNameFigure"
-          text=""/>
-    </figures>
-    <figures
-        xsi:type="gmfgraph:Rectangle"
-        referencingElements="WorkProductNode"
-        name="WorkProductNodeFigure"
-        outline="false">
-      <children
-          xsi:type="gmfgraph:Label"
-          referencingElements="NamedNodeName"
-          name="NamedNodeNameFigure"
-          text="New Work Product Descriptor"/>
-    </figures>
-  </figures>
-  <nodes
-      name="WorkProductNode"
-      figure="WorkProductNodeFigure"/>
-  <connections
-      name="Link"
-      figure="LinkFigure"/>
-  <labels
-      name="LinkName"
-      figure="LinkNameFigure"/>
-  <labels
-      name="NamedNodeName"
-      figure="NamedNodeNameFigure"/>
-</gmfgraph:Canvas>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfmap b/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfmap
deleted file mode 100644
index 9fd9f4b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmfmap
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfmap:Mapping xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:gmfmap="http://www.eclipse.org/gmf/2005/mappings"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductNode"/>
-      <labelMappings
-          viewPattern="">
-        <diagramLabel
-            href="wpdd.gmfgraph#NamedNodeName"/>
-        <features
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-      </labelMappings>
-      <contextMenu
-          href="wpdd.gmftool#//@allMenus.0"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="wpdd.gmftool#//@palette/@tools.0/@tools.1"/>
-      <diagramNode
-          href="wpdd.gmfgraph#WorkProductNode"/>
-    </ownedChild>
-  </nodes>
-  <links>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link"/>
-    <labelMappings
-        viewPattern=""
-        editPattern="">
-      <diagramLabel
-          href="wpdd.gmfgraph#LinkName"/>
-      <features
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/name"/>
-    </labelMappings>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Node/outgoingConnections"/>
-    <tool
-        xsi:type="gmftool:CreationTool"
-        href="wpdd.gmftool#//@palette/@tools.0/@tools.0"/>
-    <diagramLink
-        href="wpdd.gmfgraph#Link"/>
-    <sourceMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/source"/>
-    <linkMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/target"/>
-  </links>
-  <diagram>
-    <diagramCanvas
-        href="wpdd.gmfgraph#model"/>
-    <domainModel
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#/"/>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductDependencyDiagram"/>
-    <palette
-        href="wpdd.gmftool#//@palette"/>
-  </diagram>
-</gmfmap:Mapping>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmftool b/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmftool
deleted file mode 100644
index db9792a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd.gmftool
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmftool:ToolRegistry xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <allMenus
-      xsi:type="gmftool:ContextMenu"
-      default="//@allMenus.0/@items.0">
-    <items
-        xsi:type="gmftool:MenuAction"
-        title="WorkProduct Node"
-        kind="CUSTOM"
-        hotKey="ALT+W"/>
-  </allMenus>
-  <palette>
-    <tools
-        xsi:type="gmftool:ToolGroup"
-        title="model">
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Control Flow"
-          description="Create new Control Flow">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/link_pal16.gif"
-            bundle="org.eclipse.epf.diagram.wpdd"/>
-      </tools>
-      <tools
-          xsi:type="gmftool:CreationTool"
-          title="Work Product Descriptor"
-          description="Create new work product descriptor">
-        <smallIcon
-            xsi:type="gmftool:BundleImage"
-            path="icons/full/obj16/WorkProductDescriptor.gif"
-            bundle="org.eclipse.epf.diagram.wpdd"/>
-      </tools>
-    </tools>
-  </palette>
-</gmftool:ToolRegistry>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd2.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd2.gmfgen
deleted file mode 100644
index 657e0ce..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd2.gmfgen
+++ /dev/null
@@ -1,238 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel/2.0">
-  <diagram
-      visualID="79"
-      editPartClassName="WorkProductDependencyDiagramEditPart"
-      itemSemanticEditPolicyClassName="WorkProductDependencyDiagramItemSemanticEditPolicy"
-      notationViewFactoryClassName="WorkProductDependencyDiagramViewFactory"
-      canonicalEditPolicyClassName="WorkProductDependencyDiagramCanonicalEditPolicy"
-      iconProviderPriority="Low"
-      validationProviderPriority="Low">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="WorkProductDependencyDiagramEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductDependencyDiagram"/>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="WorkProductNodeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductNodeViewFactory"
-        canonicalEditPolicyClassName="WorkProductNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="WorkProductNodeGraphicalNodeEditPolicy"
-        createCommandClassName="WorkProductNodeCreateCommand">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="WorkProductNodeFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class WorkProductNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public WorkProductNodeFigure() {&#xA;&#x9;&#x9;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(false);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(1);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#x9;&#x9;createContents();&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void createContents(){&#xA;&#xA;&#xA;&#xA;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel namedNodeNameFigure0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xA;namedNodeNameFigure0.setText(&quot;New Work Product Descriptor&quot;);&#xA;&#xA;this.add(namedNodeNameFigure0);&#xA;setFigureNamedNodeNameFigure(namedNodeNameFigure0);&#xA;&#xA;&#x9;}&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNamedNodeNameFigure; &#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNamedNodeNameFigure() {&#xA;&#x9;&#x9;return fNamedNodeNameFigure;&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private void setFigureNamedNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xA;&#x9;&#x9;fNamedNodeNameFigure = fig;&#xA;&#x9;}&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected boolean useLocalCoordinates() {&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4001"
-          editPartClassName="WorkProductNodeNameEditPart"
-          itemSemanticEditPolicyClassName="WorkProductNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="WorkProductNodeNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNamedNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="LinkEditPart"
-        itemSemanticEditPolicyClassName="LinkItemSemanticEditPolicy"
-        notationViewFactoryClassName="LinkViewFactory"
-        createCommandClassName="LinkCreateCommand"
-        reorientCommandClassName="LinkReorientCommand">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="LinkEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="LinkFigure"
-          classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class LinkFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public LinkFigure() {&#xA;&#x9;&#x9;this.setFill(true);&#xA;this.setFillXOR(false);&#xA;this.setOutline(true);&#xA;this.setOutlineXOR(false);&#xA;this.setLineWidth(1);&#xA;this.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xA;&#x9;}&#xA;&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;private org.eclipse.draw2d.RotatableDecoration createTargetDecoration() {&#xA;&#x9;&#x9;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xA;df.setFill(true);&#xA;df.setFillXOR(false);&#xA;df.setOutline(true);&#xA;df.setOutlineXOR(false);&#xA;df.setLineWidth(1);&#xA;df.setLineStyle(org.eclipse.draw2d.Graphics.LINE_SOLID);&#xA;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xA;pl.addPoint(getMapMode().DPtoLP(-1)&#xA;, getMapMode().DPtoLP(1)&#xA;);&#xA;pl.addPoint(getMapMode().DPtoLP(0)&#xA;, getMapMode().DPtoLP(0)&#xA;);&#xA;pl.addPoint(getMapMode().DPtoLP(-1)&#xA;, getMapMode().DPtoLP(-1)&#xA;);&#xA;df.setTemplate(pl);&#xA;df.setScale(getMapMode().DPtoLP(7)&#xA;, getMapMode().DPtoLP(3)&#xA;);&#xA;&#x9;&#x9;return df;&#xA;&#x9;}&#xA;&#xA;}&#xA;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/target"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="LinkNameEditPart"
-          itemSemanticEditPolicyClassName="LinkNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="LinkNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="LinkNameFigure"
-            classBody="&#xA;/**&#xA; * @generated&#xA; */&#xA;public class LinkNameFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xA;&#x9;/**&#xA;&#x9; * @generated&#xA;&#x9; */&#xA;&#x9;public LinkNameFigure() {&#xA;&#x9;&#x9;&#x9;&#x9;this.setText(&quot;&quot;);&#xA;&#x9;}&#xA;&#xA;&#xA;&#xA;}&#xA;&#xA;">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <palette>
-      <groups
-          title="model">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Control Flow"
-            description="Create new Control Flow"
-            smallIconPath="/org.eclipse.epf.diagram.wpdd/icons/full/obj16/link_pal16.gif"
-            genLinks="//@diagram/@links.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Work Product Descriptor"
-            description="Create new work product descriptor"
-            smallIconPath="/org.eclipse.epf.diagram.wpdd/icons/full/obj16/WorkProductDescriptor.gif"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-      </groups>
-    </palette>
-    <preferencePages
-        xsi:type="gmfgen:GenStandardPreferencePage"
-        iD="org.eclipse.epf.diagram.diagram.general"
-        name="Diagram Diagram">
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.appearance"
-          name="Appearance"
-          kind="Appearance"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.connections"
-          name="Connections"
-          kind="Connections"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.printing"
-          name="Printing"
-          kind="Printing"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.rulersAndGrid"
-          name="Rulers And Grid"
-          kind="RulersAndGrid"/>
-      <children
-          xsi:type="gmfgen:GenStandardPreferencePage"
-          iD="org.eclipse.epf.diagram.diagram.pathmaps"
-          name="Pathmaps"
-          kind="Pathmaps"/>
-    </preferencePages>
-  </diagram>
-  <plugin/>
-  <editor/>
-  <navigator>
-    <childReferences
-        child="//@diagram"/>
-    <childReferences
-        parent="//@diagram"
-        child="//@diagram/@topLevelNodes.0"/>
-    <childReferences
-        parent="//@diagram"
-        child="//@diagram/@links.0"
-        groupName="links"
-        groupIcon="icons/linksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@topLevelNodes.0"
-        referenceType="out_target"
-        groupName="target"
-        groupIcon="icons/linkTargetNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.0"
-        child="//@diagram/@links.0"
-        referenceType="in_source"
-        groupName="incoming links"
-        groupIcon="icons/incomingLinksNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@links.0"
-        child="//@diagram/@topLevelNodes.0"
-        referenceType="in_source"
-        groupName="source"
-        groupIcon="icons/linkSourceNavigatorGroup.gif"/>
-    <childReferences
-        parent="//@diagram/@topLevelNodes.0"
-        child="//@diagram/@links.0"
-        referenceType="out_target"
-        groupName="outgoing links"
-        groupIcon="icons/outgoingLinksNavigatorGroup.gif"/>
-  </navigator>
-  <propertySheet>
-    <tabs
-        xsi:type="gmfgen:GenStandardPropertyTab"
-        iD="appearance"/>
-    <tabs
-        xsi:type="gmfgen:GenStandardPropertyTab"
-        iD="diagram"/>
-    <tabs
-        xsi:type="gmfgen:GenCustomPropertyTab"
-        iD="domain"
-        label="Core">
-      <filter
-          xsi:type="gmfgen:TypeTabFilter">
-        <types>org.eclipse.gmf.runtime.notation.View</types>
-        <types>org.eclipse.gef.EditPart</types>
-        <generatedTypes>abstractNavigatorItem</generatedTypes>
-      </filter>
-    </tabs>
-  </propertySheet>
-  <domainGenModel
-      href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#/"/>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd2.gmfmap b/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd2.gmfmap
deleted file mode 100644
index a2f1cc5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd2.gmfmap
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfmap:Mapping xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:gmfmap="http://www.eclipse.org/gmf/2005/mappings/2.0"
-    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
-  <nodes>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NodeContainer/nodes"/>
-    <ownedChild>
-      <domainMetaElement
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductNode"/>
-      <labelMappings
-          xsi:type="gmfmap:FeatureLabelMapping"
-          viewPattern="">
-        <diagramLabel
-            href="wpdd.gmfgraph#NamedNodeName"/>
-        <features
-            href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//NamedNode/name"/>
-      </labelMappings>
-      <contextMenu
-          href="wpdd.gmftool#//@allMenus.0"/>
-      <tool
-          xsi:type="gmftool:CreationTool"
-          href="wpdd.gmftool#//@palette/@tools.0/@tools.1"/>
-      <diagramNode
-          href="wpdd.gmfgraph#WorkProductNode"/>
-    </ownedChild>
-  </nodes>
-  <links>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link"/>
-    <labelMappings
-        xsi:type="gmfmap:FeatureLabelMapping"
-        viewPattern=""
-        editPattern="">
-      <diagramLabel
-          href="wpdd.gmfgraph#LinkName"/>
-      <features
-          href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/name"/>
-    </labelMappings>
-    <containmentFeature
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Node/outgoingConnections"/>
-    <tool
-        xsi:type="gmftool:CreationTool"
-        href="wpdd.gmftool#//@palette/@tools.0/@tools.0"/>
-    <diagramLink
-        href="wpdd.gmfgraph#Link"/>
-    <sourceMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/source"/>
-    <linkMetaFeature
-        xsi:type="ecore:EReference"
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//Link/target"/>
-  </links>
-  <diagram>
-    <diagramCanvas
-        href="wpdd.gmfgraph#model"/>
-    <domainModel
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#/"/>
-    <domainMetaElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.ecore#//WorkProductDependencyDiagram"/>
-    <palette
-        href="wpdd.gmftool#//@palette"/>
-  </diagram>
-</gmfmap:Mapping>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd3.gmfgen b/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd3.gmfgen
deleted file mode 100644
index 5399351..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/model/wpdd3.gmfgen
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<gmfgen:GenEditorGenerator xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel/2.0" packageNamePrefix="org.eclipse.epf.diagram.wpdd"
-    modelID="WPDD"
-    sameFileForDiagramAndModel="true"
-    diagramFileExtension="wpdd">
-  <diagram
-      visualID="79"
-      editPartClassName="WorkProductDependencyDiagramEditPart"
-      itemSemanticEditPolicyClassName="WorkProductDependencyDiagramItemSemanticEditPolicy"
-      notationViewFactoryClassName="WorkProductDependencyDiagramViewFactory"
-      canonicalEditPolicyClassName="WorkProductDependencyDiagramCanonicalEditPolicy"
-      iconProviderPriority="Low">
-    <diagramRunTimeClass
-        href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Diagram"/>
-    <elementType
-        xsi:type="gmfgen:MetamodelType"
-        editHelperClassName="WorkProductDependencyDiagramEditHelper"/>
-    <viewmap
-        xsi:type="gmfgen:FigureViewmap"
-        figureQualifiedClassName="org.eclipse.draw2d.FreeformLayer"/>
-    <domainDiagramElement
-        href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductDependencyDiagram"/>
-    <topLevelNodes
-        visualID="1001"
-        editPartClassName="WorkProductNodeEditPart"
-        itemSemanticEditPolicyClassName="WorkProductNodeItemSemanticEditPolicy"
-        notationViewFactoryClassName="WorkProductNodeViewFactory"
-        canonicalEditPolicyClassName="WorkProductNodeCanonicalEditPolicy"
-        graphicalNodeEditPolicyClassName="WorkProductNodeGraphicalNodeEditPolicy">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="WorkProductNodeEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="WorkProductNodeFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class WorkProductNodeFigure extends org.eclipse.draw2d.RectangleFigure {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public WorkProductNodeFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;this.setOutline(false);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;&#x9;org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();&#xD;&#xA;fig_0.setText(&quot;New Work Product Descriptor&quot;);&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setFigureNamedNodeNameFigure(fig_0);&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;&#x9;Object layData0 = null;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.add(fig_0, layData0);&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fNamedNodeNameFigure; &#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel getFigureNamedNodeNameFigure() {&#xD;&#xA;&#x9;&#x9;return fNamedNodeNameFigure;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void setFigureNamedNodeNameFigure(org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig){&#xD;&#xA;&#x9;&#x9;fNamedNodeNameFigure = fig;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet>
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/WorkProductNode"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NodeContainer/nodes"/>
-      </modelFacet>
-      <labels
-          visualID="4001"
-          editPartClassName="WorkProductNodeNameEditPart"
-          itemSemanticEditPolicyClassName="WorkProductNodeNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="WorkProductNodeNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:ParentAssignedViewmap"
-            getterName="getFigureNamedNodeNameFigure"
-            figureQualifiedClassName="org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel"/>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/NamedNode/name"/>
-        </modelFacet>
-      </labels>
-    </topLevelNodes>
-    <links
-        visualID="3001"
-        editPartClassName="LinkEditPart"
-        itemSemanticEditPolicyClassName="LinkItemSemanticEditPolicy"
-        notationViewFactoryClassName="LinkViewFactory">
-      <diagramRunTimeClass
-          href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Edge"/>
-      <elementType
-          xsi:type="gmfgen:MetamodelType"
-          editHelperClassName="LinkEditHelper"/>
-      <viewmap
-          xsi:type="gmfgen:InnerClassViewmap"
-          className="LinkFigure"
-          classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class LinkFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public LinkFigure() {&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;setTargetDecoration(createTargetDecoration());&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private org.eclipse.draw2d.PolylineDecoration createTargetDecoration() {&#xD;&#xA;org.eclipse.draw2d.PolylineDecoration df = new org.eclipse.draw2d.PolylineDecoration();&#xD;&#xA;// dispatchNext?&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;org.eclipse.draw2d.geometry.PointList pl = new org.eclipse.draw2d.geometry.PointList();&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, 1);&#xD;&#xA;&#x9;&#x9;pl.addPoint(0, 0);&#xD;&#xA;&#x9;&#x9;pl.addPoint(-1, -1);&#xD;&#xA;&#x9;&#x9;df.setTemplate(pl);&#xD;&#xA;&#x9;&#x9;df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;return df;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-        <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-        <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-      </viewmap>
-      <modelFacet
-          xsi:type="gmfgen:TypeLinkModelFacet">
-        <metaClass
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link"/>
-        <containmentMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <childMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Node/outgoingConnections"/>
-        <sourceMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/source"/>
-        <targetMetaFeature
-            href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/target"/>
-      </modelFacet>
-      <labels
-          visualID="4002"
-          editPartClassName="LinkNameEditPart"
-          itemSemanticEditPolicyClassName="LinkNameItemSemanticEditPolicy"
-          notationViewFactoryClassName="LinkNameViewFactory"
-          elementIcon="true">
-        <diagramRunTimeClass
-            href="../../../plugin/org.eclipse.gmf.runtime.notation/model/notation.genmodel#//notation/Node"/>
-        <viewmap
-            xsi:type="gmfgen:InnerClassViewmap"
-            className="LinkNameFigure"
-            classBody="&#xD;&#xA;&#xD;&#xA;/**&#xD;&#xA; * @generated&#xD;&#xA; */&#xD;&#xA;public class LinkNameFigure extends org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel {&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;public LinkNameFigure() {&#x9;&#xD;&#xA;&#x9;&#x9;&#xD;&#xA;&#xD;&#xA;&#x9;&#x9;this.setText(&quot;&quot;);&#xD;&#xA;&#x9;&#x9;createContents();&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private void createContents(){&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;private boolean myUseLocalCoordinates = false;&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected boolean useLocalCoordinates() {&#xD;&#xA;&#x9;&#x9;return myUseLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#xD;&#xA;&#x9;/**&#xD;&#xA;&#x9; * @generated&#xD;&#xA;&#x9; */&#xD;&#xA;&#x9;protected void setUseLocalCoordinates(boolean useLocalCoordinates) {&#xD;&#xA;&#x9;&#x9;myUseLocalCoordinates = useLocalCoordinates;&#xD;&#xA;&#x9;}&#xD;&#xA;&#x9;&#xD;&#xA;&#xD;&#xA;}&#xD;&#xA;&#x9;&#xD;&#xA;">
-          <attributes
-              xsi:type="gmfgen:LabelOffsetAttributes"
-              y="40"/>
-          <requiredPluginIDs>org.eclipse.draw2d</requiredPluginIDs>
-          <requiredPluginIDs>org.eclipse.gmf.runtime.draw2d.ui</requiredPluginIDs>
-        </viewmap>
-        <modelFacet
-            xsi:type="gmfgen:FeatureLabelModelFacet"
-            viewPattern="{0}"
-            editPattern="">
-          <metaFeatures
-              href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#//model/Link/name"/>
-        </modelFacet>
-      </labels>
-    </links>
-    <palette>
-      <groups
-          title="model">
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Control Flow"
-            description="Create new Control Flow"
-            smallIconPath="/org.eclipse.epf.diagram.wpdd/icons/full/obj16/link_pal16.gif"
-            genLinks="//@diagram/@links.0"/>
-        <entries
-            xsi:type="gmfgen:ToolEntry"
-            title="Work Product Descriptor"
-            description="Create new work product descriptor"
-            smallIconPath="/org.eclipse.epf.diagram.wpdd/icons/full/obj16/WorkProductDescriptor.gif"
-            genNodes="//@diagram/@topLevelNodes.0"/>
-      </groups>
-    </palette>
-  </diagram>
-  <plugin
-      iD="org.eclipse.epf.diagram.wpdd"
-      name="Work Product Dependency Diagram Plugin"
-      provider="EPF"
-      printingEnabled="true"
-      activatorClassName="WPDDiagramEditorPlugin"/>
-  <editor
-      className="WorkProductDependencyDiagramEditor"/>
-  <propertySheet>
-    <tabs
-        xsi:type="gmfgen:GenStandardPropertyTab"
-        iD="Testing 123"
-        label="Testing 123"/>
-    <tabs
-        xsi:type="gmfgen:GenStandardPropertyTab"
-        iD="Advanced"
-        label="Advanced"/>
-  </propertySheet>
-  <domainGenModel
-      href="../../org.eclipse.epf.diagram.model/model/diagram.genmodel#/"/>
-</gmfgen:GenEditorGenerator>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/plugin.properties b/1.5/plugins/org.eclipse.epf.diagram.wpdd/plugin.properties
deleted file mode 100644
index 9a0f09f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/plugin.properties
+++ /dev/null
@@ -1,48 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-################################################################################
-# START NO TRANSLATION
-################################################################################
-preferences.general=WPDD Diagram
-preferences.appearance=Appearance
-preferences.connections=Connections
-preferences.printing=Printing
-preferences.rulersAndGrid=Rulers & Grid
-preferences.pathmaps=Path Maps
-
-editorName=WPDD Diagram Editor
-newWizardName=WPDD Diagram
-newWizardDesc=Creates WPDD diagram.
-
-initDiagramActionLabel=Initialize wpdd diagram file
-loadResourceActionLabel=Load Resource...
-
-navigatorContentName=*.wpdd diagram contents
-
-metatype.name.WorkProductDependencyDiagram_79=Undefined
-metatype.name.WorkProductNode_1001=WorkProductNode
-metatype.name.Link_3001=Link
-
-tab.Testing.123=Testing 123
-tab.Advanced=Advanced
-################################################################################
-# END NO TRANSLATION
-################################################################################
-
-
-pluginName=EPF Work Product Dependency Diagram
-providerName=Eclipse.org
-
-
-# Need translation
-element_type_control_flow=Control Flow
-element_type_workproduct_descriptor=Work Product Descriptor
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/plugin.xml b/1.5/plugins/org.eclipse.epf.diagram.wpdd/plugin.xml
deleted file mode 100644
index d2fab8d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/plugin.xml
+++ /dev/null
@@ -1,339 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<plugin>
-
-   <extension point="org.eclipse.core.runtime.preferences">
-      <initializer class="org.eclipse.epf.diagram.wpdd.part.DiagramDiagramPreferenceInitializer"/>
-   </extension>
-
-  <extension point="org.eclipse.team.core.fileTypes">
-      <fileTypes
-         type="text"
-         extension="wpdd">
-      </fileTypes>
-  </extension>
-
-   <extension point="org.eclipse.emf.ecore.extension_parser">
-      <parser
-         type="wpdd"
-         class="org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory">
-      </parser>
-   </extension>
-
-   <extension point="org.eclipse.ui.editors">
-   <!--
-     <editor
-        id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID"
-        name="WPDD Diagram Editor"
-        icon="icons/obj16/ModelDiagramFile.gif"
-        extensions="wpdd"
-        default="true"
-        class="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditor"
-        matchingStrategy="org.eclipse.epf.diagram.wpdd.part.DiagramMatchingStrategy"
-        contributorClass="org.eclipse.epf.diagram.wpdd.part.DiagramDiagramActionBarContributor">
-     </editor>
-     -->
-     <editor
-        id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID"
-        name="Work Product Dependency Diagram Editor"
-        icon="icons/full/etool16/WPDDEditor.gif"
-        extensions="wpdd"
-        default="true"
-        class="org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditor"
-        matchingStrategy="org.eclipse.epf.diagram.wpdd.part.DiagramMatchingStrategy"
-        contributorClass="org.eclipse.epf.diagram.wpdd.part.DiagramDiagramActionBarContributor">
-     </editor>
-   </extension>
-
-	<!--
-   <extension point="org.eclipse.ui.newWizards">
-  	  <wizard
-  	     name="WPDD Diagram"
-  	     icon="icons/obj16/ModelDiagramFile.gif"
-  	     category="org.eclipse.ui.Examples"
-  	     class="org.eclipse.epf.diagram.wpdd.part.DiagramCreationWizard"
-  	     id="org.eclipse.epf.diagram.wpdd.part.DiagramCreationWizardID">
-  	  	 <description>
-  	  		Creates WPDD diagram.
-  	  	 </description>  
-      </wizard>
-   </extension>
-   -->
-
-   <extension point="org.eclipse.ui.popupMenus">
-     <!-- <objectContribution
-            id="org.eclipse.epf.diagram.wpdd.ui.objectContribution.IFile1"
-            nameFilter="*.model"
-            objectClass="org.eclipse.core.resources.IFile">
-         <action
-               label="Initialize wpdd diagram file"
-               class="org.eclipse.epf.diagram.wpdd.part.DiagramInitDiagramFileAction"
-               menubarPath="additions"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.wpdd.part.DiagramInitDiagramFileActionID">
-         </action>
-      </objectContribution>  
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.epf.diagram.wpdd.ui.objectContribution.WorkProductDependencyDiagramEditPart2"
-            objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.wpdd.part.DiagramLoadResourceAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.wpdd.part.DiagramLoadResourceActionID"
-               label="Load Resource..."
-               menubarPath="additions">
-         </action>
-      </objectContribution>  
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.epf.diagram.wpdd.DeleteDiagram"
-            objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.DeleteDiagramAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.core.actions.DeleteDiagramAction"
-               label="%DeleteDiagram_text"
-               menubarPath="additions"
-               state="false"
-               style="push"
-               tooltip="%DeleteDiagram_text"/>
-      </objectContribution>
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.epf.diagram.wpdd.RefreshFromBaseAction"
-            objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.RefreshFromBaseAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.core.actions.RefreshFromBaseAction"
-               label="%refreshFromBaseActivity_text"
-               menubarPath="additions"
-               state="false"
-               style="push"
-               tooltip="%refreshFromBaseActivity_text"/>
-      </objectContribution>
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.epf.diagram.wpdd.RefreshAction"
-            objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart">
-         <action
-               class="org.eclipse.epf.diagram.core.actions.RefreshAction"
-               enablesFor="1"
-               id="org.eclipse.epf.diagram.core.actions.RefreshAction"
-               label="%refresh_text"
-               menubarPath="additions"
-               state="false"
-               style="push"
-               tooltip="%refresh_text"/>
-      </objectContribution>   -->                   
-  </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.contributionItemProviders">
-      <contributionItemProvider class="org.eclipse.epf.diagram.wpdd.providers.DiagramContributionItemProvider">
-         <Priority name="Low">
-         </Priority>
-         <partContribution id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID">
-            <partAction menubarPath="/file/print" id="printPreviewAction">
-            </partAction>
-         </partContribution>
-      </contributionItemProvider>
-     <!-- <contributionItemProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContributionItemProvider"
-            checkPluginLoaded="false">
-         <Priority name="Low"/>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-         </popupContribution>
-         <popupContribution class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider">
-            <popupStructuredContributionCriteria objectClass="org.eclipse.epf.diagram.wpdd.edit.parts.LinkNameEditPart"/>
-            <popupPredefinedItem id="deleteFromDiagramAction" remove="true"/>
-            <popupPredefinedItem id="deleteFromModelAction" remove="true"/>
-         </popupContribution>
-      </contributionItemProvider>
-      -->
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.action.globalActionHandlerProviders">
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.providers.DiagramGlobalActionHandlerProvider"
-         id="WPDDPresentation">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="delete"/>
-            </ElementType>
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart">
-               <GlobalActionId actionId="save"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.printing.render.providers.DiagramWithPrintGlobalActionHandlerProvider"
-         id="WPDDPresentationPrint">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="print"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <GlobalActionHandlerProvider
-         class="org.eclipse.gmf.runtime.diagram.ui.providers.ide.providers.DiagramIDEGlobalActionHandlerProvider"
-         id="WPDDPresentationIDE">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="bookmark"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      <!--
-      <GlobalActionHandlerProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.render.providers.DiagramUIRenderGlobalActionHandlerProvider"
-            id="WPDDRender">
-         <Priority name="Lowest"/>
-         <ViewId id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID">
-            <ElementType class="org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart">
-               <GlobalActionId actionId="cut"/>
-               <GlobalActionId actionId="copy"/>
-               <GlobalActionId actionId="paste"/>
-            </ElementType>
-         </ViewId>
-      </GlobalActionHandlerProvider>
-      -->
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.core.viewProviders">
-      <viewProvider class="org.eclipse.epf.diagram.wpdd.providers.DiagramViewProvider">
-         <Priority name="Lowest"/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Diagram" semanticHints="WPDD"/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Node" semanticHints=""/>
-         <context viewClass="org.eclipse.gmf.runtime.notation.Edge" semanticHints=""/>
-      </viewProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.ui.editpartProviders">
-      <editpartProvider class="org.eclipse.epf.diagram.wpdd.providers.DiagramEditPartProvider">
-         <Priority name="Lowest"/>
-      </editpartProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.diagram.ui.paletteProviders">
-      <paletteProvider class="org.eclipse.epf.diagram.wpdd.providers.DiagramPaletteProvider">
-         <Priority name="Lowest"/>
-         <editor id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID"/>
-      </paletteProvider>
-      <paletteProvider
-			class="org.eclipse.gmf.runtime.diagram.ui.providers.DefaultPaletteProvider">
-        <Priority name="Medium"/>
-        <editor id="org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID"/>
-        <contribution>
-            <predefinedEntry    
-            	id="geoshapeDrawer"   path="/">
-            	<expand force="true"/>
-             </predefinedEntry> 
-        </contribution>
-      </paletteProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.ui.modelingAssistantProviders">
-      <modelingAssistantProvider class="org.eclipse.epf.diagram.wpdd.providers.DiagramModelingAssistantProvider">
-         <Priority name="Lowest"/>
-      </modelingAssistantProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.properties.propertiesProviders">
-      <PropertiesProvider
-            verifyPluginLoaded="false"
-            class="org.eclipse.epf.diagram.wpdd.providers.DiagramPropertyProvider">
-         <Priority name="Lowest"/>
-      </PropertiesProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.iconProviders">
-      <IconProvider class="org.eclipse.epf.diagram.wpdd.providers.DiagramIconProvider">
-         <Priority name="Low"/>
-      </IconProvider>
-      <IconProvider
-            class="org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.providers.GeoShapeIconProvider">
-         <Priority
-               name="Medium">
-         </Priority>
-         <object class="org.eclipse.gmf.runtime.notation.View(org.eclipse.gmf.runtime.notation)" id="GeoShape">
-        	 <method name="getType()" value="oval,triangle,rectangle,shadowRectangle,rectangle3D,roundRectangle,hexagon,octagon,pentagon,diamond,cylinder,line"/>
-	     </object>
-         <context elements="GeoShape">
-         </context>
-      </IconProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.common.ui.services.parserProviders">
-      <ParserProvider class="org.eclipse.epf.diagram.wpdd.providers.DiagramParserProvider">
-         <Priority name="Lowest"/>
-      </ParserProvider>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypes">
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.wpdd.WorkProductDependencyDiagram_79"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="WorkProductDependencyDiagram"
-               edithelper="org.eclipse.epf.diagram.wpdd.edit.helpers.WorkProductDependencyDiagramEditHelper">
-            <param name="semanticHint" value="79"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.wpdd.WorkProductNode_1001"
-               name="%element_type_workproduct_descriptor"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="WorkProductNode"
-               edithelper="org.eclipse.epf.diagram.wpdd.edit.helpers.WorkProductNodeEditHelper">
-            <param name="semanticHint" value="1001"/>
-         </metamodelType>
-      </metamodel>
-
-      <metamodel nsURI="http://www.eclipse.org/epf/diagram/1.0.0/diagram.ecore">
-         <metamodelType
-               id="org.eclipse.epf.diagram.wpdd.Link_3001"
-               name="%element_type_control_flow"
-               kind="org.eclipse.gmf.runtime.emf.type.core.IHintedType"
-               eclass="Link"
-               edithelper="org.eclipse.epf.diagram.wpdd.edit.helpers.LinkEditHelper">
-            <param name="semanticHint" value="3001"/>
-         </metamodelType>
-      </metamodel>
-   </extension>
-
-   <extension point="org.eclipse.gmf.runtime.emf.type.core.elementTypeBindings">
-      <clientContext id="WPDDClientContext">
-         <enablement>
-            <test
-               property="org.eclipse.gmf.runtime.emf.core.editingDomain"
-               value="org.eclipse.epf.diagram.EditingDomain"/>
-         </enablement>
-      </clientContext> 
-      <binding context="WPDDClientContext">
-         <elementType ref="org.eclipse.epf.diagram.wpdd.WorkProductDependencyDiagram_79"/>
-         <elementType ref="org.eclipse.epf.diagram.wpdd.WorkProductNode_1001"/>
-         <elementType ref="org.eclipse.epf.diagram.wpdd.Link_3001"/>
-         <advice ref="org.eclipse.gmf.runtime.diagram.core.advice.notationDepdendents"/>
-         <elementType pattern=".*"/>
-      </binding>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/DiagramReorientConnectionViewCommand.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/DiagramReorientConnectionViewCommand.java
deleted file mode 100644
index 86062f3..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/DiagramReorientConnectionViewCommand.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.commands;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class DiagramReorientConnectionViewCommand extends
-		AbstractTransactionalCommand {
-
-	/**
-	 * @generated
-	 */
-	private IAdaptable edgeAdaptor;
-
-	/**
-	 * @generated
-	 */
-	public DiagramReorientConnectionViewCommand(
-			TransactionalEditingDomain editingDomain, String label) {
-		super(editingDomain, label, null);
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getAffectedFiles() {
-		View view = (View) edgeAdaptor.getAdapter(View.class);
-		if (view != null) {
-			return getWorkspaceFiles(view);
-		}
-		return super.getAffectedFiles();
-	}
-
-	/**
-	 * @generated
-	 */
-	public IAdaptable getEdgeAdaptor() {
-		return edgeAdaptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setEdgeAdaptor(IAdaptable edgeAdaptor) {
-		this.edgeAdaptor = edgeAdaptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult doExecuteWithResult(
-			IProgressMonitor progressMonitor, IAdaptable info) {
-		assert null != edgeAdaptor : "Null child in DiagramReorientConnectionViewCommand"; //$NON-NLS-1$
-		Edge edge = (Edge) getEdgeAdaptor().getAdapter(Edge.class);
-		assert null != edge : "Null edge in DiagramReorientConnectionViewCommand"; //$NON-NLS-1$
-
-		View tempView = edge.getSource();
-		edge.setSource(edge.getTarget());
-		edge.setTarget(tempView);
-
-		return CommandResult.newOKCommandResult();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/LinkCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/LinkCreateCommand.java
deleted file mode 100644
index 3cdf82e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/LinkCreateCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-
-/**
- * @generated
- */
-public class LinkCreateCommand extends CreateRelationshipCommand {
-
-	/**
-	 * @generated
-	 */
-	private Node myContainer;
-
-	/**
-	 * @generated
-	 */
-	private Node mySource;
-
-	/**
-	 * @generated
-	 */
-	private Node myTarget;
-
-	/**
-	 * @generated
-	 */
-	public LinkCreateCommand(CreateRelationshipRequest req, Node container,
-			Node source, Node target) {
-		super(req);
-		super.setElementToEdit(container);
-		myContainer = container;
-		mySource = source;
-		myTarget = target;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Node getContainer() {
-		return myContainer;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getSource() {
-		return mySource;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getTarget() {
-		return myTarget;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNode();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setElementToEdit(EObject element) {
-		throw new UnsupportedOperationException();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject doDefaultElementCreation() {
-		Link newElement = (Link) super.doDefaultElementCreation();
-		if (newElement != null) {
-			newElement.setTarget(myTarget);
-			newElement.setSource(mySource);
-		}
-		return newElement;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/LinkReorientCommand.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/LinkReorientCommand.java
deleted file mode 100644
index 6b8f7fc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/LinkReorientCommand.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.commands;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.wpdd.edit.policies.DiagramBaseItemSemanticEditPolicy;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-
-/**
- * @generated
- */
-public class LinkReorientCommand extends EditElementCommand {
-
-	/**
-	 * @generated
-	 */
-	private final int reorientDirection;
-
-	/**
-	 * @generated
-	 */
-	private final EObject oldEnd;
-
-	/**
-	 * @generated
-	 */
-	private final EObject newEnd;
-
-	/**
-	 * @generated
-	 */
-	public LinkReorientCommand(ReorientRelationshipRequest request) {
-		super(request.getLabel(), request.getRelationship(), request);
-		reorientDirection = request.getDirection();
-		oldEnd = request.getOldRelationshipEnd();
-		newEnd = request.getNewRelationshipEnd();
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean canExecute() {
-		if (!(getElementToEdit() instanceof Link)) {
-			return false;
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
-			return canReorientSource();
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
-			return canReorientTarget();
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean canReorientSource() {
-		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
-			return false;
-		}
-		Node target = getLink().getTarget();
-		if (!(getLink().eContainer() instanceof Node)) {
-			return false;
-		}
-		Node container = (Node) getLink().eContainer();
-		return DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canExistLink_3001(container, getNewSource(), target);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean canReorientTarget() {
-		if (!(oldEnd instanceof Node && newEnd instanceof Node)) {
-			return false;
-		}
-		Node source = getLink().getSource();
-		if (!(getLink().eContainer() instanceof Node)) {
-			return false;
-		}
-		Node container = (Node) getLink().eContainer();
-		return DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canExistLink_3001(container, source, getNewTarget());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult doExecuteWithResult(IProgressMonitor monitor,
-			IAdaptable info) throws ExecutionException {
-		if (!canExecute()) {
-			throw new ExecutionException(
-					"Invalid arguments in reorient link command"); //$NON-NLS-1$
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_SOURCE) {
-			return reorientSource();
-		}
-		if (reorientDirection == ReorientRelationshipRequest.REORIENT_TARGET) {
-			return reorientTarget();
-		}
-		throw new IllegalStateException();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult reorientSource() throws ExecutionException {
-		getLink().setSource(getNewSource());
-		return CommandResult.newOKCommandResult(getLink());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected CommandResult reorientTarget() throws ExecutionException {
-		getLink().setTarget(getNewTarget());
-		return CommandResult.newOKCommandResult(getLink());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Link getLink() {
-		return (Link) getElementToEdit();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getOldSource() {
-		return (Node) oldEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getNewSource() {
-		return (Node) newEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getOldTarget() {
-		return (Node) oldEnd;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Node getNewTarget() {
-		return (Node) newEnd;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/WorkProductNodeCreateCommand.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/WorkProductNodeCreateCommand.java
deleted file mode 100644
index 7f7c5e1..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/commands/WorkProductNodeCreateCommand.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.commands;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductNodeCreateCommand extends CreateElementCommand {
-
-	/**
-	 * @generated
-	 */
-	public WorkProductNodeCreateCommand(CreateElementRequest req) {
-		super(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EClass getEClassToEdit() {
-		return ModelPackage.eINSTANCE.getNodeContainer();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getElementToEdit() {
-		EObject container = ((CreateElementRequest) getRequest())
-				.getContainer();
-		if (container instanceof View) {
-			container = ((View) container).getElement();
-		}
-		return container;
-	}
-
-	
-	@Override
-	protected EObject doDefaultElementCreation() {
-		NamedNode newNode = (NamedNode)super.doDefaultElementCreation();
-		Diagram diagram =newNode.getDiagram();
-		diagram.setDefaultName(newNode);
-		return newNode;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/DiagramBaseEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/DiagramBaseEditHelper.java
deleted file mode 100644
index b38d453..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/DiagramBaseEditHelper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.helpers;
-
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelper;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-
-/**
- * @generated
- */
-public class DiagramBaseEditHelper extends AbstractEditHelper {
-
-	/**
-	 * @generated
-	 */
-	public static final String EDIT_POLICY_COMMAND = "edit policy command"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getInsteadCommand(IEditCommandRequest req) {
-		ICommand epCommand = (ICommand) req.getParameter(EDIT_POLICY_COMMAND);
-		req.setParameter(EDIT_POLICY_COMMAND, null);
-		ICommand ehCommand = super.getInsteadCommand(req);
-		if (epCommand == null) {
-			return ehCommand;
-		}
-		if (ehCommand == null) {
-			return epCommand;
-		}
-		CompositeCommand command = new CompositeCommand(null);
-		command.add(epCommand);
-		command.add(ehCommand);
-		return command;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getCreateCommand(CreateElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getCreateRelationshipCommand(
-			CreateRelationshipRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getDestroyElementCommand(DestroyElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getDestroyReferenceCommand(DestroyReferenceRequest req) {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/LinkEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/LinkEditHelper.java
deleted file mode 100644
index 6679d35..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/LinkEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.helpers;
-
-/**
- * @generated
- */
-public class LinkEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/WorkProductDependencyDiagramEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/WorkProductDependencyDiagramEditHelper.java
deleted file mode 100644
index 1081874..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/WorkProductDependencyDiagramEditHelper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.helpers;
-
-/**
- * @generated
- */
-public class WorkProductDependencyDiagramEditHelper extends
-		DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/WorkProductNodeEditHelper.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/WorkProductNodeEditHelper.java
deleted file mode 100644
index b1f0277..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/helpers/WorkProductNodeEditHelper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.helpers;
-
-/**
- * @generated
- */
-public class WorkProductNodeEditHelper extends DiagramBaseEditHelper {
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/DiagramEditPartFactory.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/DiagramEditPartFactory.java
deleted file mode 100644
index 55d4e03..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/DiagramEditPartFactory.java
+++ /dev/null
@@ -1,169 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.parts;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-
-/**
- * @generated
- */
-public class DiagramEditPartFactory implements EditPartFactory {
-
-	/**
-	 * @generated
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-		if (model instanceof View) {
-			View view = (View) model;
-			switch (DiagramVisualIDRegistry.getVisualID(view)) {
-
-			case WorkProductDependencyDiagramEditPart.VISUAL_ID:
-				return new WorkProductDependencyDiagramEditPart(view);
-
-			case WorkProductNodeEditPart.VISUAL_ID:
-				return new WorkProductNodeEditPart(view);
-
-			case WorkProductNodeNameEditPart.VISUAL_ID:
-				return new WorkProductNodeNameEditPart(view);
-
-			case LinkEditPart.VISUAL_ID:
-				return new LinkEditPart(view);
-
-			case LinkNameEditPart.VISUAL_ID:
-				return new LinkNameEditPart(view);
-			}
-		}
-		return createUnrecognizedEditPart(context, model);
-	}
-
-	/**
-	 * @generated
-	 */
-	private EditPart createUnrecognizedEditPart(EditPart context, Object model) {
-		// Handle creation of unrecognized child node EditParts here
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static CellEditorLocator getTextCellEditorLocator(
-			ITextAwareEditPart source) {
-		if (source.getFigure() instanceof WrapLabel)
-			return new TextCellEditorLocator((WrapLabel) source.getFigure());
-		else {
-			return new LabelCellEditorLocator((Label) source.getFigure());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	static private class TextCellEditorLocator implements CellEditorLocator {
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel wrapLabel;
-
-		/**
-		 * @generated
-		 */
-		public TextCellEditorLocator(WrapLabel wrapLabel) {
-			this.wrapLabel = wrapLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getWrapLabel() {
-			return wrapLabel;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void relocate(CellEditor celleditor) {
-			Text text = (Text) celleditor.getControl();
-			Rectangle rect = getWrapLabel().getTextBounds().getCopy();
-			getWrapLabel().translateToAbsolute(rect);
-			if (getWrapLabel().isTextWrapped()
-					&& getWrapLabel().getText().length() > 0) {
-				rect.setSize(new Dimension(text.computeSize(rect.width,
-						SWT.DEFAULT)));
-			} else {
-				int avr = FigureUtilities.getFontMetrics(text.getFont())
-						.getAverageCharWidth();
-				rect.setSize(new Dimension(text.computeSize(SWT.DEFAULT,
-						SWT.DEFAULT)).expand(avr * 2, 0));
-			}
-			if (!rect.equals(new Rectangle(text.getBounds()))) {
-				text.setBounds(rect.x, rect.y, rect.width, rect.height);
-			}
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class LabelCellEditorLocator implements CellEditorLocator {
-
-		/**
-		 * @generated
-		 */
-		private Label label;
-
-		/**
-		 * @generated
-		 */
-		public LabelCellEditorLocator(Label label) {
-			this.label = label;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Label getLabel() {
-			return label;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void relocate(CellEditor celleditor) {
-			Text text = (Text) celleditor.getControl();
-			Rectangle rect = getLabel().getTextBounds().getCopy();
-			getLabel().translateToAbsolute(rect);
-			int avr = FigureUtilities.getFontMetrics(text.getFont())
-					.getAverageCharWidth();
-			rect.setSize(new Dimension(text.computeSize(SWT.DEFAULT,
-					SWT.DEFAULT)).expand(avr * 2, 0));
-			if (!rect.equals(new Rectangle(text.getBounds()))) {
-				text.setBounds(rect.x, rect.y, rect.width, rect.height);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/DiagramExtNodeLabelEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/DiagramExtNodeLabelEditPart.java
deleted file mode 100644
index f86e9ec..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/DiagramExtNodeLabelEditPart.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.figures.LabelLocator;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class DiagramExtNodeLabelEditPart extends LabelEditPart {
-
-	/**
-	 * @generated
-	 */
-	public DiagramExtNodeLabelEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshBounds() {
-		IFigure refFigure = ((GraphicalEditPart) getParent()).getFigure();
-		int dx = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_X())).intValue();
-		int dy = ((Integer) getStructuralFeatureValue(NotationPackage.eINSTANCE
-				.getLocation_Y())).intValue();
-		Point offset = new Point(dx, dy);
-		getFigure().getParent().setConstraint(getFigure(),
-				new LabelLocator(refFigure, offset, getKeyPoint()) {
-
-					public void relocate(IFigure target) {
-						Point location = getReferencePoint().getTranslated(
-								getOffset());
-						location.translate(-target.getBounds().width / 2, 0);
-						target.setLocation(location);
-						target.setSize(new Dimension(
-								target.getPreferredSize().width, target
-										.getPreferredSize().height));
-					}
-
-					protected Point getReferencePoint() {
-						return getLabelLocation(parent);
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	public Point getReferencePoint() {
-		return getLabelLocation(((GraphicalEditPart) getParent()).getFigure());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Point getLabelLocation(IFigure parent) {
-		return parent.getBounds().getBottom();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/LinkEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/LinkEditPart.java
deleted file mode 100644
index e6b9f51..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/LinkEditPart.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.parts;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.draw2d.Connection;
-
-import org.eclipse.draw2d.PolylineDecoration;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.DiagramCoreValidation;
-import org.eclipse.epf.diagram.wpdd.edit.policies.LinkItemSemanticEditPolicy;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionNodeEditPart;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @generated
- */
-public class LinkEditPart extends ConnectionNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 3001;
-
-	/**
-	 * @generated
-	 */
-	public LinkEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new LinkItemSemanticEditPolicy());
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected Connection createConnectionFigure() {
-
-		return new LinkFigure();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class LinkFigure extends PolylineConnectionEx {
-
-		/**
-		 * @generated
-		 */
-		public LinkFigure() {
-
-			setTargetDecoration(createTargetDecoration());
-		}
-
-		/**
-		 * @generated
-		 */
-		private PolylineDecoration createTargetDecoration() {
-			PolylineDecoration df = new PolylineDecoration();
-			// dispatchNext?
-
-			PointList pl = new PointList();
-			pl.addPoint(-1, 1);
-			pl.addPoint(0, 0);
-			pl.addPoint(-1, -1);
-			df.setTemplate(pl);
-			df.setScale(getMapMode().DPtoLP(7), getMapMode().DPtoLP(3));
-
-			return df;
-		}
-
-	}
-
-	@Override
-	protected void setForegroundColor(Color color) {
-		Color overrideColor = DiagramCoreUtil.getLinkOverrideColor((Edge) getModel());
-		super.setForegroundColor(overrideColor != null ? overrideColor : color);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/LinkNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/LinkNameEditPart.java
deleted file mode 100644
index b7d0422..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/LinkNameEditPart.java
+++ /dev/null
@@ -1,631 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.parts;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.ConnectionLocator;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.wpdd.edit.policies.DiagramTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.wpdd.providers.DiagramElementTypes;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class LinkNameEditPart extends LabelEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4002;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	static {
-		registerSnapBackPosition(DiagramVisualIDRegistry
-				.getType(LinkNameEditPart.VISUAL_ID), new Point(0, 40));
-	}
-
-	/**
-	 * @generated
-	 */
-	public LinkNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	public int getKeyPoint() {
-		return ConnectionLocator.MIDDLE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(IFigure figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 * 
-	 */
-	protected Image getLabelIcon() {
-		//		ImageDescriptor descriptor = WPDDiagramEditorPlugin.getInstance()
-		//				.getItemImageDescriptor(getParserElement());
-		//		if (descriptor == null) {
-		//			descriptor = ImageDescriptor.getMissingImageDescriptor();
-		//		}
-		//		return descriptor.createImage();
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getParser() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return DiagramElementTypes.Link_3001;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new TextDirectEditManager(this, TextDirectEditManager
-					.getTextCellEditorClass(this), DiagramEditPartFactory
-					.getTextCellEditorLocator(this)));
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager().getClass() == TextDirectEditManager.class) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFontColor(Color color) {
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		IFigure label = createFigurePrim();
-		defaultText = getLabelTextHelper(label);
-		return label;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigurePrim() {
-		return new LinkNameFigure();
-	}
-
-	/**
-	 * @generated
-	 */
-	public class LinkNameFigure extends WrapLabel {
-
-		/**
-		 * @generated
-		 */
-		public LinkNameFigure() {
-
-			this.setText("");
-			createContents();
-		}
-
-		/**
-		 * @generated
-		 */
-		private void createContents() {
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductDependencyDiagramEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductDependencyDiagramEditPart.java
deleted file mode 100644
index 65df048..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductDependencyDiagramEditPart.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.parts;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.wpdd.edit.policies.WorkProductDependencyDiagramCanonicalEditPolicy;
-import org.eclipse.epf.diagram.wpdd.edit.policies.WorkProductDependencyDiagramItemSemanticEditPolicy;
-
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-
-/**
- * @generated
- */
-public class WorkProductDependencyDiagramEditPart extends DiagramEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final String MODEL_ID = "WPDD"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 79;
-
-	/**
-	 * @generated
-	 */
-	public WorkProductDependencyDiagramEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new WorkProductDependencyDiagramItemSemanticEditPolicy());
-		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new WorkProductDependencyDiagramCanonicalEditPolicy());
-	}
-
-	@Override
-	protected void handleNotificationEvent(Notification event) {
-		if (NotationPackage.Literals.VIEW__VISIBLE.equals(event.getFeature())) {
-			Object notifier = event.getNotifier();
-			if (notifier == getModel())
-				refreshVisibility();
-			else if (event.getNotifier() instanceof Node) {
-				refreshChildren();
-				DiagramEditorUtil.refreshConnectionEditParts(this);
-			}
-		} else
-			super.handleNotificationEvent(event);
-	}
-	
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductNodeEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductNodeEditPart.java
deleted file mode 100644
index dec809c..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductNodeEditPart.java
+++ /dev/null
@@ -1,319 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.StackLayout;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.wpdd.edit.policies.WorkProductNodeCanonicalEditPolicy;
-import org.eclipse.epf.diagram.wpdd.edit.policies.WorkProductNodeGraphicalNodeEditPolicy;
-import org.eclipse.epf.diagram.wpdd.edit.policies.WorkProductNodeItemSemanticEditPolicy;
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
-import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductNodeEditPart extends ShapeNodeEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 1001;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure contentPane;
-
-	/**
-	 * @generated
-	 */
-	protected IFigure primaryShape;
-
-	/**
-	 * @generated
-	 */
-	public WorkProductNodeEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,
-				new WorkProductNodeItemSemanticEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE, createLayoutEditPolicy());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected LayoutEditPolicy createLayoutEditPolicy() {
-		LayoutEditPolicy lep = new LayoutEditPolicy() {
-
-			protected EditPolicy createChildEditPolicy(EditPart child) {
-				EditPolicy result = child
-						.getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-				if (result == null) {
-					result = new NonResizableEditPolicy();
-				}
-				return result;
-			}
-
-			protected Command getMoveChildrenCommand(Request request) {
-				return null;
-			}
-
-			protected Command getCreateCommand(CreateRequest request) {
-				return null;
-			}
-		};
-		return lep;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createNodeShape() {
-		WorkProductNodeFigure figure = new WorkProductNodeFigure();
-		return primaryShape = figure;
-	}
-
-	/**
-	 * @generated
-	 */
-	public WorkProductNodeFigure getPrimaryShape() {
-		return (WorkProductNodeFigure) primaryShape;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean addFixedChild(EditPart childEditPart) {
-		if (childEditPart instanceof WorkProductNodeNameEditPart) {
-			((WorkProductNodeNameEditPart) childEditPart)
-					.setLabel(getPrimaryShape().getFigureNamedNodeNameFigure());
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean removeFixedChild(EditPart childEditPart) {
-
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected NodeFigure createNodePlate() {
-		DefaultSizeNodeFigure result = new DefaultSizeNodeFigure(getMapMode()
-				.DPtoLP(40), getMapMode().DPtoLP(40));
-		return result;
-	}
-
-	/**
-	 * Creates figure for this edit part.
-	 * 
-	 * Body of this method does not depend on settings in generation model
-	 * so you may safely remove <i>generated</i> tag and modify it.
-	 * 
-	 * @generated
-	 */
-	protected NodeFigure createNodeFigure() {
-		NodeFigure figure = createNodePlate();
-		figure.setLayoutManager(new StackLayout());
-		IFigure shape = createNodeShape();
-		figure.add(shape);
-		contentPane = setupContentPane(shape);
-		return figure;
-	}
-
-	/**
-	 * Default implementation treats passed figure as content pane.
-	 * Respects layout one may have set for generated figure.
-	 * @param nodeShape instance of generated figure class
-	 * @generated
-	 */
-	protected IFigure setupContentPane(IFigure nodeShape) {
-		if (nodeShape.getLayoutManager() == null) {
-			ConstrainedToolbarLayout layout = new ConstrainedToolbarLayout();
-			layout.setSpacing(getMapMode().DPtoLP(5));
-			nodeShape.setLayoutManager(layout);
-		}
-		return nodeShape; // use nodeShape itself as contentPane
-	}
-
-	/**
-	 * @generated
-	 */
-	public IFigure getContentPane() {
-		if (contentPane != null) {
-			return contentPane;
-		}
-		return super.getContentPane();
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getPrimaryChildEditPart() {
-		return getChildBySemanticHint(DiagramVisualIDRegistry
-				.getType(WorkProductNodeNameEditPart.VISUAL_ID));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-		if (addFixedChild(childEditPart)) {
-			return;
-		}
-		super.addChildVisual(childEditPart, -1);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-		if (removeFixedChild(childEditPart)) {
-			return;
-		}
-		super.removeChildVisual(childEditPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure getContentPaneFor(IGraphicalEditPart editPart) {
-
-		return super.getContentPaneFor(editPart);
-	}
-
-	/**
-	 * @generated
-	 */
-	public class WorkProductNodeFigure extends RectangleFigure {
-
-		/**
-		 * @generated
-		 */
-		public WorkProductNodeFigure() {
-
-			this.setOutline(false);
-			createContents();
-		}
-
-		/**
-		 * @modified
-		 * 
-		 */
-		private void createContents() {
-			org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel fig_0 = new org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel();
-			fig_0.setText(DiagramCoreResources.WPDD_New_WorkProductDescriptor);
-
-			DiagramCoreUtil.setLabelProperties(fig_0);
-			setFigureNamedNodeNameFigure(fig_0);
-
-			Object layData0 = null;
-
-			this.add(fig_0, layData0);
-		}
-
-		/**
-		 * @generated
-		 */
-		private WrapLabel fNamedNodeNameFigure;
-
-		/**
-		 * @generated
-		 */
-		public WrapLabel getFigureNamedNodeNameFigure() {
-			return fNamedNodeNameFigure;
-		}
-
-		/**
-		 * @generated
-		 */
-		private void setFigureNamedNodeNameFigure(WrapLabel fig) {
-			fNamedNodeNameFigure = fig;
-		}
-
-		/**
-		 * @generated
-		 */
-		private boolean myUseLocalCoordinates = false;
-
-		/**
-		 * @generated
-		 */
-		protected boolean useLocalCoordinates() {
-			return myUseLocalCoordinates;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected void setUseLocalCoordinates(boolean useLocalCoordinates) {
-			myUseLocalCoordinates = useLocalCoordinates;
-		}
-
-	}
-
-	@Override
-	public void activate() {
-		super.activate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).addConsumer(this);
-			}
-		}
-	}
-	
-	@Override
-	public void deactivate() {
-		super.deactivate();
-		Object model = getModel();
-		if (model instanceof View) {
-			EObject e = ((View) model).getElement();
-			if (e instanceof org.eclipse.epf.diagram.model.Node) {
-				((org.eclipse.epf.diagram.model.Node) e).removeConsumer(this);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductNodeNameEditPart.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductNodeNameEditPart.java
deleted file mode 100644
index 823d3c7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/parts/WorkProductNodeNameEditPart.java
+++ /dev/null
@@ -1,642 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.parts;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.core.util.ValidatingTextDirectEditManager;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.diagram.wpdd.edit.policies.DiagramTextSelectionEditPolicy;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.epf.diagram.wpdd.providers.DiagramElementTypes;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.gef.AccessibleEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
-import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class WorkProductNodeNameEditPart extends CompartmentEditPart implements
-		ITextAwareEditPart {
-
-	/**
-	 * @generated
-	 */
-	public static final int VISUAL_ID = 4001;
-
-	/**
-	 * @generated
-	 */
-	private DirectEditManager manager;
-
-	/**
-	 * @generated
-	 */
-	private IParser parser;
-
-	/**
-	 * @generated
-	 */
-	private List parserElements;
-
-	/**
-	 * @generated
-	 */
-	private String defaultText;
-
-	/**
-	 * @generated
-	 */
-	public WorkProductNodeNameEditPart(View view) {
-		super(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void createDefaultEditPolicies() {
-		super.createDefaultEditPolicies();
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new LabelDirectEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new NonResizableEditPolicy() {
-
-					protected List createSelectionHandles() {
-						List handles = new ArrayList();
-						NonResizableHandleKit.addMoveHandle(
-								(GraphicalEditPart) getHost(), handles);
-						return handles;
-					}
-
-					public Command getCommand(Request request) {
-						return null;
-					}
-
-					public boolean understandsRequest(Request request) {
-						return false;
-					}
-				});
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelTextHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getText();
-		} else {
-			return ((Label) figure).getText();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelTextHelper(IFigure figure, String text) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setText(text);
-		} else {
-			((Label) figure).setText(text);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Image getLabelIconHelper(IFigure figure) {
-		if (figure instanceof WrapLabel) {
-			return ((WrapLabel) figure).getIcon();
-		} else {
-			return ((Label) figure).getIcon();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setLabelIconHelper(IFigure figure, Image icon) {
-		if (figure instanceof WrapLabel) {
-			((WrapLabel) figure).setIcon(icon);
-		} else {
-			((Label) figure).setIcon(icon);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabel(WrapLabel figure) {
-		unregisterVisuals();
-		setFigure(figure);
-		defaultText = getLabelTextHelper(figure);
-		registerVisuals();
-		refreshVisuals();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getModelChildren() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IGraphicalEditPart getChildBySemanticHint(String semanticHint) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getParserElement() {
-		EObject element = resolveSemanticElement();
-		return element != null ? element : (View) getModel();
-	}
-
-	/**
-	 * @modified
-	 * 
-	 */
-	protected Image getLabelIcon() {
-		//		ImageDescriptor descriptor = WPDDiagramEditorPlugin.getInstance()
-		//				.getItemImageDescriptor(getParserElement());
-		//		if (descriptor == null) {
-		//			descriptor = ImageDescriptor.getMissingImageDescriptor();
-		//		}
-		//		return descriptor.createImage();
-		return WPDDiagramEditorPlugin.getInstance().getSharedImage(
-				"full/obj16/WorkProductDescriptor.gif");	//$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getLabelText() {
-		String text = null;
-		if (getParser() != null) {
-			text = getParser().getPrintString(
-					new EObjectAdapter(getParserElement()),
-					getParserOptions().intValue());
-		}
-		if (text == null || text.length() == 0) {
-			text = defaultText;
-		}
-		return text;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setLabelText(String text) {
-		setLabelTextHelper(getFigure(), text);
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditText() {
-		if (getParser() == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return getParser().getEditString(
-				new EObjectAdapter(getParserElement()),
-				getParserOptions().intValue());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isEditable() {
-		return getEditText() != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICellEditorValidator getEditTextValidator() {
-		return new ICellEditorValidator() {
-
-			public String isValid(final Object value) {
-				if (value instanceof String) {
-					final EObject element = getParserElement();
-					final IParser parser = getParser();
-					try {
-						IParserEditStatus valid = (IParserEditStatus) getEditingDomain()
-								.runExclusive(new RunnableWithResult.Impl() {
-
-									public void run() {
-										setResult(parser.isValidEditString(
-												new EObjectAdapter(element),
-												(String) value));
-									}
-								});
-						return valid.getCode() == ParserEditStatus.EDITABLE ? null
-								: valid.getMessage();
-					} catch (InterruptedException ie) {
-						ie.printStackTrace();
-					}
-				}
-
-				// shouldn't get here
-				return null;
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor() {
-		if (getParser() == null) {
-			return null;
-		}
-		return getParser().getCompletionProcessor(
-				new EObjectAdapter(getParserElement()));
-	}
-
-	/**
-	 * @generated
-	 */
-	public ParserOptions getParserOptions() {
-		return ParserOptions.NONE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser() {
-		if (parser == null) {
-			String parserHint = ((View) getModel()).getType();
-			ParserHintAdapter hintAdapter = new ParserHintAdapter(
-					getParserElement(), parserHint) {
-
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return DiagramElementTypes.WorkProductNode_1001;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-			parser = ParserService.getInstance().getParser(hintAdapter);
-		}
-		return parser;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected DirectEditManager getManager() {
-		if (manager == null) {
-			setManager(new ValidatingTextDirectEditManager(this,
-					ValidatingTextDirectEditManager
-							.getTextCellEditorClass(this), DiagramEditPartFactory
-							.getTextCellEditorLocator(this)) {
-				@Override
-				protected String validate(String txt) {
-
-					Object obj = getEditPart().getModel();
-					if (obj instanceof Node) {
-						Node model = (Node) obj;
-						EObject umaNode = model.getElement();
-						
-						if (umaNode instanceof WorkProductNode) {
-							org.eclipse.epf.diagram.model.Node node = (org.eclipse.epf.diagram.model.Node) umaNode;
-							Object e = node.getObject();
-							Suppression suppression = node.getDiagram().getSuppression();
-							return TngUtil.checkWorkProductDescriptorPresentationName(
-									e, txt, suppression);
-						}
-					}
-					return null;
-				}
-
-				@Override
-				protected void performDirectEdit() {
-					((WorkProductNodeNameEditPart) getEditPart())
-							.performDirectEdit();
-				}
-
-			});
-		}
-		return manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setManager(DirectEditManager manager) {
-		this.manager = manager;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEdit() {
-		getManager().show();
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void performDirectEdit(Point eventLocation) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(eventLocation
-					.getSWTPoint());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void performDirectEdit(char initialCharacter) {
-		if (getManager() instanceof TextDirectEditManager) {
-			((TextDirectEditManager) getManager()).show(initialCharacter);
-		} else {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performDirectEditRequest(Request request) {
-		final Request theRequest = request;
-		try {
-			getEditingDomain().runExclusive(new Runnable() {
-
-				public void run() {
-					if (isActive() && isEditable()) {
-						if (theRequest
-								.getExtendedData()
-								.get(
-										RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) {
-							Character initialChar = (Character) theRequest
-									.getExtendedData()
-									.get(
-											RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR);
-							performDirectEdit(initialChar.charValue());
-						} else if ((theRequest instanceof DirectEditRequest)
-								&& (getEditText().equals(getLabelText()))) {
-							DirectEditRequest editRequest = (DirectEditRequest) theRequest;
-							performDirectEdit(editRequest.getLocation());
-						} else {
-							performDirectEdit();
-						}
-					}
-				}
-			});
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		refreshLabel();
-		refreshFont();
-		refreshFontColor();
-		refreshUnderline();
-		refreshStrikeThrough();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshLabel() {
-		setLabelTextHelper(getFigure(), getLabelText());
-		setLabelIconHelper(getFigure(), getLabelIcon());
-		Object pdEditPolicy = getEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE);
-		if (pdEditPolicy instanceof DiagramTextSelectionEditPolicy) {
-			((DiagramTextSelectionEditPolicy) pdEditPolicy).refreshFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshUnderline() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextUnderline(style.isUnderline());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshStrikeThrough() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null && getFigure() instanceof WrapLabel) {
-			((WrapLabel) getFigure()).setTextStrikeThrough(style
-					.isStrikeThrough());
-		}
-	}
-
-	@Override
-	protected void refreshFont() {
-		FontStyle style = (FontStyle) getFontStyleOwnerView().getStyle(
-				NotationPackage.eINSTANCE.getFontStyle());
-		if (style != null) {
-			String fontName = DiagramConstants.getFontName(style);
-			FontData fontData = new FontData(fontName, style
-					.getFontHeight(), (style.isBold() ? SWT.BOLD : SWT.NORMAL)
-					| (style.isItalic() ? SWT.ITALIC : SWT.NORMAL));
-			setFont(fontData);
-		}
-	}
-
-	/**
-	 * @modified
-	 */
-	protected void setFontColor(Color color) {
-		Color c = DiagramCoreUtil.getFontColor(this);
-		if (c != null) {
-			color = c;
-		}
-		getFigure().setForegroundColor(color);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addSemanticListeners() {
-		if (getParser() instanceof ISemanticParser) {
-			EObject element = resolveSemanticElement();
-			parserElements = ((ISemanticParser) getParser())
-					.getSemanticElementsBeingParsed(element);
-			for (int i = 0; i < parserElements.size(); i++) {
-				addListenerFilter(
-						"SemanticModel" + i, this, (EObject) parserElements.get(i)); //$NON-NLS-1$
-			}
-		} else {
-			super.addSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeSemanticListeners() {
-		if (parserElements != null) {
-			for (int i = 0; i < parserElements.size(); i++) {
-				removeListenerFilter("SemanticModel" + i); //$NON-NLS-1$
-			}
-		} else {
-			super.removeSemanticListeners();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected AccessibleEditPart getAccessibleEditPart() {
-		if (accessibleEP == null) {
-			accessibleEP = new AccessibleGraphicalEditPart() {
-
-				public void getName(AccessibleEvent e) {
-					e.result = getLabelTextHelper(getFigure());
-				}
-			};
-		}
-		return accessibleEP;
-	}
-
-	/**
-	 * @generated
-	 */
-	private View getFontStyleOwnerView() {
-		return getPrimaryView();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void addNotationalListeners() {
-		super.addNotationalListeners();
-		addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void removeNotationalListeners() {
-		super.removeNotationalListeners();
-		removeListenerFilter("PrimaryView"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleNotificationEvent(Notification event) {
-		Object feature = event.getFeature();
-		if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)) {
-			Integer c = (Integer) event.getNewValue();
-			setFontColor(DiagramColorRegistry.getInstance().getColor(c));
-		} else if (NotationPackage.eINSTANCE.getFontStyle_Underline().equals(
-				feature)) {
-			refreshUnderline();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_StrikeThrough()
-				.equals(feature)) {
-			refreshStrikeThrough();
-		} else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(
-				feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(
-						feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Bold()
-						.equals(feature)
-				|| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(
-						feature)) {
-			refreshFont();
-		} else {
-			if (getParser() != null
-					&& getParser().isAffectingEvent(event,
-							getParserOptions().intValue())) {
-				refreshLabel();
-			}
-			if (getParser() instanceof ISemanticParser) {
-				ISemanticParser modelParser = (ISemanticParser) getParser();
-				if (modelParser.areSemanticElementsAffected(null, event)) {
-					removeSemanticListeners();
-					if (resolveSemanticElement() != null) {
-						addSemanticListeners();
-					}
-					refreshLabel();
-				}
-			}
-		}
-		super.handleNotificationEvent(event);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFigure() {
-		// Parent should assign one using setLabel() method
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramBaseItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramBaseItemSemanticEditPolicy.java
deleted file mode 100644
index 02b6d9b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramBaseItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,367 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import java.util.Collections;
-import java.util.Iterator;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.ReconnectRequest;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.SemanticEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IEditHelperContext;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.MoveRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientReferenceRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.wpdd.edit.helpers.DiagramBaseEditHelper;
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-
-/**
- * @generated
- */
-public class DiagramBaseItemSemanticEditPolicy extends SemanticEditPolicy {
-
-	/**
-	 * Extended request data key to hold editpart visual id.
-	 * 
-	 * @generated
-	 */
-	public static final String VISUAL_ID_KEY = "visual_id"; //$NON-NLS-1$
-
-	/**
-	 * Add visual id of edited editpart to extended data of the request
-	 * so command switch can decide what kind of diagram element is being edited.
-	 * It is done in those cases when it's not possible to deduce diagram
-	 * element kind from domain element.
-	 * 
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof ReconnectRequest) {
-			Object view = ((ReconnectRequest) request).getConnectionEditPart()
-					.getModel();
-			if (view instanceof View) {
-				Integer id = new Integer(DiagramVisualIDRegistry
-						.getVisualID((View) view));
-				request.getExtendedData().put(VISUAL_ID_KEY, id);
-			}
-		}
-		return super.getCommand(request);
-	}
-
-	/**
-	 * Returns visual id from request parameters.
-	 * 
-	 * @generated
-	 */
-	protected int getVisualID(IEditCommandRequest request) {
-		Object id = request.getParameter(VISUAL_ID_KEY);
-		return id instanceof Integer ? ((Integer) id).intValue() : -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSemanticCommand(IEditCommandRequest request) {
-		IEditCommandRequest completedRequest = completeRequest(request);
-		Object editHelperContext = completedRequest.getEditHelperContext();
-		if (editHelperContext instanceof View
-				|| (editHelperContext instanceof IEditHelperContext && ((IEditHelperContext) editHelperContext)
-						.getEObject() instanceof View)) {
-			// no semantic commands are provided for pure design elements
-			return null;
-		}
-		if (editHelperContext == null) {
-			editHelperContext = ViewUtil
-					.resolveSemanticElement((View) getHost().getModel());
-		}
-		IElementType elementType = ElementTypeRegistry.getInstance()
-				.getElementType(editHelperContext);
-		if (elementType == ElementTypeRegistry.getInstance().getType(
-				"org.eclipse.gmf.runtime.emf.type.core.default")) { //$NON-NLS-1$ 
-			elementType = null;
-		}
-		Command epCommand = getSemanticCommandSwitch(completedRequest);
-		if (epCommand != null) {
-			ICommand command = epCommand instanceof ICommandProxy ? ((ICommandProxy) epCommand)
-					.getICommand()
-					: new CommandProxy(epCommand);
-			completedRequest.setParameter(
-					DiagramBaseEditHelper.EDIT_POLICY_COMMAND, command);
-		}
-		Command ehCommand = null;
-		if (elementType != null) {
-			ICommand command = elementType.getEditCommand(completedRequest);
-			if (command != null) {
-				if (!(command instanceof CompositeTransactionalCommand)) {
-					TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-							.getEditingDomain();
-					command = new CompositeTransactionalCommand(editingDomain,
-							null).compose(command);
-				}
-				ehCommand = new ICommandProxy(command);
-			}
-		}
-		boolean shouldProceed = true;
-		if (completedRequest instanceof DestroyRequest) {
-			shouldProceed = shouldProceed((DestroyRequest) completedRequest);
-		}
-		if (shouldProceed) {
-			if (completedRequest instanceof DestroyRequest) {
-				TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-						.getEditingDomain();
-				Command deleteViewCommand = new ICommandProxy(
-						new DeleteCommand(editingDomain, (View) getHost()
-								.getModel()));
-				ehCommand = ehCommand == null ? deleteViewCommand : ehCommand
-						.chain(deleteViewCommand);
-			}
-			return ehCommand;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSemanticCommandSwitch(IEditCommandRequest req) {
-		if (req instanceof CreateRelationshipRequest) {
-			return getCreateRelationshipCommand((CreateRelationshipRequest) req);
-		} else if (req instanceof CreateElementRequest) {
-			return getCreateCommand((CreateElementRequest) req);
-		} else if (req instanceof ConfigureRequest) {
-			return getConfigureCommand((ConfigureRequest) req);
-		} else if (req instanceof DestroyElementRequest) {
-			return getDestroyElementCommand((DestroyElementRequest) req);
-		} else if (req instanceof DestroyReferenceRequest) {
-			return getDestroyReferenceCommand((DestroyReferenceRequest) req);
-		} else if (req instanceof DuplicateElementsRequest) {
-			return getDuplicateCommand((DuplicateElementsRequest) req);
-		} else if (req instanceof GetEditContextRequest) {
-			return getEditContextCommand((GetEditContextRequest) req);
-		} else if (req instanceof MoveRequest) {
-			return getMoveCommand((MoveRequest) req);
-		} else if (req instanceof ReorientReferenceRelationshipRequest) {
-			return getReorientReferenceRelationshipCommand((ReorientReferenceRelationshipRequest) req);
-		} else if (req instanceof ReorientRelationshipRequest) {
-			return getReorientRelationshipCommand((ReorientRelationshipRequest) req);
-		} else if (req instanceof SetRequest) {
-			return getSetCommand((SetRequest) req);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getConfigureCommand(ConfigureRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getSetCommand(SetRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getEditContextCommand(GetEditContextRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyReferenceCommand(DestroyReferenceRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getMoveCommand(MoveRequest req) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getReorientReferenceRelationshipCommand(
-			ReorientReferenceRelationshipRequest req) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getMSLWrapper(ICommand cmd) {
-		return new ICommandProxy(cmd);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getSemanticElement() {
-		return ViewUtil.resolveSemanticElement((View) getHost().getModel());
-	}
-
-	/**
-	 * Finds container element for the new relationship of the specified type.
-	 * Default implementation goes up by containment hierarchy starting from
-	 * the specified element and returns the first element that is instance of
-	 * the specified container class.
-	 * 
-	 * @generated
-	 */
-	protected EObject getRelationshipContainer(Object uelement,
-			EClass containerClass, IElementType relationshipType) {
-		if (uelement instanceof EObject) {
-			EObject element = (EObject) uelement;
-			for (; element != null; element = element.eContainer()) {
-				if (containerClass.isSuperTypeOf(element.eClass())) {
-					return element;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns editing domain from the host edit part.
-	 * 
-	 * @generated
-	 */
-	protected TransactionalEditingDomain getEditingDomain() {
-		return ((IGraphicalEditPart) getHost()).getEditingDomain();
-	}
-
-	/**
-	 * Creates command to destroy the link.
-	 * 
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(View view, boolean confirm) {
-		EditPart editPart = (EditPart) getHost().getViewer()
-				.getEditPartRegistry().get(view);
-		DestroyElementRequest request = new DestroyElementRequest(
-				getEditingDomain(), confirm);
-		return editPart.getCommand(new EditCommandRequestWrapper(request,
-				Collections.EMPTY_MAP));
-	}
-
-	/**
-	 * Creates commands to destroy all host incoming and outgoing links.
-	 * 
-	 * @generated
-	 */
-	protected CompoundCommand getDestroyEdgesCommand(boolean confirm) {
-		CompoundCommand cmd = new CompoundCommand();
-		View view = (View) getHost().getModel();
-		for (Iterator it = view.getSourceEdges().iterator(); it.hasNext();) {
-			cmd.add(getDestroyElementCommand((Edge) it.next(), confirm));
-		}
-		for (Iterator it = view.getTargetEdges().iterator(); it.hasNext();) {
-			cmd.add(getDestroyElementCommand((Edge) it.next(), confirm));
-		}
-		return cmd;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static class LinkConstraints {
-
-		/**
-		 * @generated
-		 */
-		public static boolean canCreateLink_3001(Node container, Node source,
-				Node target) {
-			return canExistLink_3001(container, source, target);
-		}
-
-		/**
-		 * @generated
-		 */
-		public static boolean canExistLink_3001(Node container, Node source,
-				Node target) {
-			return true;
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramExtNodeLabelHostLayoutEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramExtNodeLabelHostLayoutEditPolicy.java
deleted file mode 100644
index 1b73ab5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramExtNodeLabelHostLayoutEditPolicy.java
+++ /dev/null
@@ -1,229 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class DiagramExtNodeLabelHostLayoutEditPolicy extends XYLayoutEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private LayoutEditPolicy realLayoutEditPolicy;
-
-	/**
-	 * @generated
-	 */
-	public LayoutEditPolicy getRealLayoutEditPolicy() {
-		return realLayoutEditPolicy;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setRealLayoutEditPolicy(LayoutEditPolicy realLayoutEditPolicy) {
-		this.realLayoutEditPolicy = realLayoutEditPolicy;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isExternalLabel(EditPart editPart) {
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected final List getExternalLabels(GroupRequest request) {
-		List editParts = new ArrayList();
-		if (request.getEditParts() != null) {
-			for (Iterator it = request.getEditParts().iterator(); it.hasNext();) {
-				EditPart editPart = (EditPart) it.next();
-				if (isExternalLabel(editPart)) {
-					editParts.add(editPart);
-				}
-			}
-		}
-		return editParts;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (REQ_MOVE_CHILDREN.equals(request.getType())) {
-			ChangeBoundsRequest cbRequest = (ChangeBoundsRequest) request;
-			List extLabels = getExternalLabels(cbRequest);
-			if (!extLabels.isEmpty()) {
-				List editParts = cbRequest.getEditParts();
-				Command cmd = null;
-				if (realLayoutEditPolicy != null
-						&& editParts.size() > extLabels.size()) {
-					List other = new ArrayList(editParts);
-					other.removeAll(extLabels);
-					cbRequest.setEditParts(other);
-					cmd = realLayoutEditPolicy.getCommand(request);
-				}
-				cbRequest.setEditParts(extLabels);
-				Command extLabelsCmd = getMoveChildrenCommand(request);
-				cbRequest.setEditParts(editParts);
-				return cmd == null ? extLabelsCmd : cmd.chain(extLabelsCmd);
-			}
-		}
-		if (request instanceof GroupRequest) {
-			List extLabels = getExternalLabels((GroupRequest) request);
-			if (!extLabels.isEmpty()) {
-				return null;
-			}
-		}
-		return realLayoutEditPolicy == null ? null : realLayoutEditPolicy
-				.getCommand(request);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getConstraintFor(ChangeBoundsRequest request,
-			GraphicalEditPart child) {
-		int dx = ((Integer) ViewUtil.getStructuralFeatureValue((View) child
-				.getModel(), NotationPackage.eINSTANCE.getLocation_X()))
-				.intValue();
-		int dy = ((Integer) ViewUtil.getStructuralFeatureValue((View) child
-				.getModel(), NotationPackage.eINSTANCE.getLocation_Y()))
-				.intValue();
-		Rectangle r = new Rectangle(dx, dy, 0, 0);
-		child.getFigure().translateToAbsolute(r);
-		r.translate(request.getMoveDelta());
-		child.getFigure().translateToRelative(r);
-		return r;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean understandsRequest(Request req) {
-		if (realLayoutEditPolicy != null
-				&& realLayoutEditPolicy.understandsRequest(req)) {
-			return true;
-		}
-		return super.understandsRequest(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateChild(EditPart child) {
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setHost(EditPart host) {
-		super.setHost(host);
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.setHost(host);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void activate() {
-		super.activate();
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.activate();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void deactivate() {
-		super.deactivate();
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.deactivate();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (realLayoutEditPolicy != null) {
-			return realLayoutEditPolicy.getTargetEditPart(request);
-		} else {
-			return super.getTargetEditPart(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void showSourceFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.showSourceFeedback(request);
-		} else {
-			super.showSourceFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void eraseSourceFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.eraseSourceFeedback(request);
-		} else {
-			super.eraseSourceFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void showTargetFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.showTargetFeedback(request);
-		} else {
-			super.showTargetFeedback(request);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (realLayoutEditPolicy != null) {
-			realLayoutEditPolicy.eraseTargetFeedback(request);
-		} else {
-			super.eraseTargetFeedback(request);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramGraphicalNodeEditPolicy.java
deleted file mode 100644
index 551d5c5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
-import org.eclipse.gmf.runtime.diagram.core.edithelpers.CreateElementRequestAdapter;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.GraphicalNodeEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewAndElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.epf.diagram.wpdd.edit.commands.DiagramReorientConnectionViewCommand;
-
-/**
- * @generated
- */
-public class DiagramGraphicalNodeEditPolicy extends GraphicalNodeEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected IElementType getElementType(CreateConnectionRequest request) {
-		if (request instanceof CreateConnectionViewAndElementRequest) {
-			CreateElementRequestAdapter requestAdapter = ((CreateConnectionViewAndElementRequest) request)
-					.getConnectionViewAndElementDescriptor()
-					.getCreateElementRequestAdapter();
-			return (IElementType) requestAdapter.getAdapter(IElementType.class);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getConnectionWithReorientedViewCompleteCommand(
-			CreateConnectionRequest request) {
-		ICommandProxy c = (ICommandProxy) super
-				.getConnectionCompleteCommand(request);
-		CompositeCommand cc = (CompositeCommand) c.getICommand();
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		DiagramReorientConnectionViewCommand rcvCommand = new DiagramReorientConnectionViewCommand(
-				editingDomain, null);
-		rcvCommand.setEdgeAdaptor(getViewAdapter());
-		cc.compose(rcvCommand);
-		return c;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramReferenceConnectionEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramReferenceConnectionEditPolicy.java
deleted file mode 100644
index 8ee7434..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramReferenceConnectionEditPolicy.java
+++ /dev/null
@@ -1,175 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.editparts.AbstractConnectionEditPart;
-import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.gmf.runtime.diagram.core.commands.DeleteCommand;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
-import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper;
-import org.eclipse.gmf.runtime.diagram.ui.requests.GroupRequestViaKeyboard;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @generated
- */
-public class DiagramReferenceConnectionEditPolicy extends ConnectionEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_DIAGRAM_DLG_TITLE = DiagramUIMessages.PromptingDeleteAction_DeleteFromDiagramDialog_Title;
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_DIAGRAM_DLG_MESSAGE = DiagramUIMessages.PromptingDeleteAction_DeleteFromDiagramDialog_Message;
-
-	/**
-	 * @generated
-	 */
-	private static final String DELETE_FROM_MODEL_DLG_TOGGLE_LABEL = DiagramUIMessages.MessageDialogWithToggle_DoNotPromptAgainToggle_label;
-
-	/**
-	 * @generated
-	 */
-	protected final Command getDeleteCommand(GroupRequest deleteRequest) {
-		boolean isDeleteFromKeyBoard = deleteRequest instanceof GroupRequestViaKeyboard;
-		if (shouldDeleteSemantic()) {
-			return createDeleteSemanticCommand(deleteRequest);
-		} else {
-			boolean proceedToDeleteView = true;
-			if (isDeleteFromKeyBoard) {
-				GroupRequestViaKeyboard groupRequestViaKeyboard = (GroupRequestViaKeyboard) deleteRequest;
-				if (groupRequestViaKeyboard.isShowInformationDialog()) {
-					proceedToDeleteView = showPrompt();
-					groupRequestViaKeyboard.setShowInformationDialog(false);
-					if (!(proceedToDeleteView))
-						return UnexecutableCommand.INSTANCE;
-				}
-			}
-			return createDeleteViewCommand(deleteRequest);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteSemantic() {
-		Assert.isTrue(getHost() instanceof AbstractConnectionEditPart);
-		AbstractConnectionEditPart cep = (AbstractConnectionEditPart) getHost();
-		boolean isCanonical = false;
-		if (cep.getSource() != null)
-			isCanonical = IsCanonical(cep.getSource());
-		if (cep.getTarget() != null)
-			return isCanonical ? isCanonical : IsCanonical(cep.getTarget());
-		return isCanonical;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean IsCanonical(EditPart ep) {
-		EditPart parent = ep.getParent();
-		return parent instanceof GraphicalEditPart ? ((GraphicalEditPart) parent)
-				.isCanonical()
-				: false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command createDeleteViewCommand(GroupRequest deleteRequest) {
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		return new ICommandProxy(new DeleteCommand(editingDomain,
-				(View) getHost().getModel()));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command createDeleteSemanticCommand(GroupRequest deleteRequest) {
-		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-				.getEditingDomain();
-		EditCommandRequestWrapper semReq = new EditCommandRequestWrapper(
-				new DestroyElementRequest(editingDomain, false), deleteRequest
-						.getExtendedData());
-		Command semanticCmd = getHost().getCommand(semReq);
-		if (semanticCmd != null && semanticCmd.canExecute()) {
-			CompoundCommand cc = new CompoundCommand();
-			cc.add(semanticCmd);
-			return cc;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean showPrompt() {
-		boolean prompt = ((IPreferenceStore) ((IGraphicalEditPart) getHost())
-				.getDiagramPreferencesHint().getPreferenceStore())
-				.getBoolean(IPreferenceConstants.PREF_PROMPT_ON_DEL_FROM_DIAGRAM);
-		if (prompt)
-			if (showMessageDialog())
-				return true;
-			else
-				return false;
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean showMessageDialog() {
-		MessageDialogWithToggle dialog = MessageDialogWithToggle
-				.openYesNoQuestion(Display.getCurrent().getActiveShell(),
-						DELETE_FROM_DIAGRAM_DLG_TITLE,
-						DELETE_FROM_DIAGRAM_DLG_MESSAGE,
-						DELETE_FROM_MODEL_DLG_TOGGLE_LABEL, false,
-						(IPreferenceStore) ((IGraphicalEditPart) getHost())
-								.getDiagramPreferencesHint()
-								.getPreferenceStore(),
-						IPreferenceConstants.PREF_PROMPT_ON_DEL_FROM_DIAGRAM);
-		if (dialog.getReturnCode() == IDialogConstants.YES_ID)
-			return true;
-		else
-			return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof GroupRequestViaKeyboard) {
-			return getDeleteCommand((GroupRequest) request);
-		}
-		return super.getCommand(request);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramTextNonResizableEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramTextNonResizableEditPolicy.java
deleted file mode 100644
index 0c84e71..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramTextNonResizableEditPolicy.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.handles.MoveHandle;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.NonResizableEditPolicyEx;
-import org.eclipse.gmf.runtime.diagram.ui.tools.DragEditPartsTrackerEx;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-/**
- * @generated
- */
-public class DiagramTextNonResizableEditPolicy extends NonResizableEditPolicyEx {
-
-	/**
-	 * @generated
-	 */
-	private IFigure selectionFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	private IFigure focusFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	protected void showPrimarySelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			showSelection();
-			showFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			hideSelection();
-			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
-			refreshSelectionFeedback();
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(false);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (selectionFeedbackFigure != null) {
-				removeFeedback(selectionFeedbackFigure);
-				selectionFeedbackFigure = null;
-			}
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			hideFocus();
-			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
-			refreshFocusFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (focusFeedbackFigure != null) {
-				removeFeedback(focusFeedbackFigure);
-				focusFeedbackFigure = null;
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Rectangle getFeedbackBounds() {
-		Rectangle bounds;
-		if (getHostFigure() instanceof Label) {
-			bounds = ((Label) getHostFigure()).getTextBounds();
-			bounds.intersect(getHostFigure().getBounds());
-		} else {
-			bounds = getHostFigure().getBounds().getCopy();
-		}
-		getHostFigure().getParent().translateToAbsolute(bounds);
-		getFeedbackLayer().translateToRelative(bounds);
-		return bounds;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createSelectionFeedbackFigure() {
-		if (getHostFigure() instanceof Label) {
-			Label feedbackFigure = new Label();
-			feedbackFigure.setOpaque(true);
-			feedbackFigure
-					.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			feedbackFigure
-					.setForegroundColor(ColorConstants.menuForegroundSelected);
-			return feedbackFigure;
-		} else {
-			RectangleFigure feedbackFigure = new RectangleFigure();
-			feedbackFigure.setFill(false);
-			return feedbackFigure;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFocusFeedbackFigure() {
-		return new Figure() {
-
-			protected void paintFigure(Graphics graphics) {
-				graphics.drawFocus(getBounds().getResized(-1, -1));
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateLabel(Label target) {
-		Label source = (Label) getHostFigure();
-		target.setText(source.getText());
-		target.setTextAlignment(source.getTextAlignment());
-		target.setFont(source.getFont());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshSelectionFeedback() {
-		if (selectionFeedbackFigure != null) {
-			if (selectionFeedbackFigure instanceof Label) {
-				updateLabel((Label) selectionFeedbackFigure);
-				selectionFeedbackFigure.setBounds(getFeedbackBounds());
-			} else {
-				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5,
-						5));
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshFocusFeedback() {
-		if (focusFeedbackFigure != null) {
-			focusFeedbackFigure.setBounds(getFeedbackBounds());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshFeedback() {
-		refreshSelectionFeedback();
-		refreshFocusFeedback();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createSelectionHandles() {
-		MoveHandle moveHandle = new MoveHandle((GraphicalEditPart) getHost());
-		moveHandle.setBorder(null);
-		moveHandle.setDragTracker(new DragEditPartsTrackerEx(getHost()));
-		return Collections.singletonList(moveHandle);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramTextSelectionEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramTextSelectionEditPolicy.java
deleted file mode 100644
index f08d398..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/DiagramTextSelectionEditPolicy.java
+++ /dev/null
@@ -1,198 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editpolicies.SelectionEditPolicy;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrapLabel;
-
-/**
- * @generated
- */
-public class DiagramTextSelectionEditPolicy extends SelectionEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	private IFigure selectionFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	private IFigure focusFeedbackFigure;
-
-	/**
-	 * @generated
-	 */
-	protected void showPrimarySelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			showSelection();
-			showFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(true);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			hideSelection();
-			addFeedback(selectionFeedbackFigure = createSelectionFeedbackFigure());
-			refreshSelectionFeedback();
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideSelection() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setSelected(false);
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (selectionFeedbackFigure != null) {
-				removeFeedback(selectionFeedbackFigure);
-				selectionFeedbackFigure = null;
-			}
-			hideFocus();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void showFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(true);
-		} else {
-			hideFocus();
-			addFeedback(focusFeedbackFigure = createFocusFeedbackFigure());
-			refreshFocusFeedback();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void hideFocus() {
-		if (getHostFigure() instanceof WrapLabel) {
-			((WrapLabel) getHostFigure()).setFocus(false);
-		} else {
-			if (focusFeedbackFigure != null) {
-				removeFeedback(focusFeedbackFigure);
-				focusFeedbackFigure = null;
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Rectangle getFeedbackBounds() {
-		Rectangle bounds;
-		if (getHostFigure() instanceof Label) {
-			bounds = ((Label) getHostFigure()).getTextBounds();
-			bounds.intersect(getHostFigure().getBounds());
-		} else {
-			bounds = getHostFigure().getBounds().getCopy();
-		}
-		getHostFigure().getParent().translateToAbsolute(bounds);
-		getFeedbackLayer().translateToRelative(bounds);
-		return bounds;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createSelectionFeedbackFigure() {
-		if (getHostFigure() instanceof Label) {
-			Label feedbackFigure = new Label();
-			feedbackFigure.setOpaque(true);
-			feedbackFigure
-					.setBackgroundColor(ColorConstants.menuBackgroundSelected);
-			feedbackFigure
-					.setForegroundColor(ColorConstants.menuForegroundSelected);
-			return feedbackFigure;
-		} else {
-			RectangleFigure feedbackFigure = new RectangleFigure();
-			feedbackFigure.setFill(false);
-			return feedbackFigure;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IFigure createFocusFeedbackFigure() {
-		return new Figure() {
-
-			protected void paintFigure(Graphics graphics) {
-				graphics.drawFocus(getBounds().getResized(-1, -1));
-			}
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateLabel(Label target) {
-		Label source = (Label) getHostFigure();
-		target.setText(source.getText());
-		target.setTextAlignment(source.getTextAlignment());
-		target.setFont(source.getFont());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshSelectionFeedback() {
-		if (selectionFeedbackFigure != null) {
-			if (selectionFeedbackFigure instanceof Label) {
-				updateLabel((Label) selectionFeedbackFigure);
-				selectionFeedbackFigure.setBounds(getFeedbackBounds());
-			} else {
-				selectionFeedbackFigure.setBounds(getFeedbackBounds().expand(5,
-						5));
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshFocusFeedback() {
-		if (focusFeedbackFigure != null) {
-			focusFeedbackFigure.setBounds(getFeedbackBounds());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void refreshFeedback() {
-		refreshSelectionFeedback();
-		refreshFocusFeedback();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/LinkItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/LinkItemSemanticEditPolicy.java
deleted file mode 100644
index 86f58cf..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/LinkItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-
-/**
- * @generated
- */
-public class LinkItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		return getMSLWrapper(new DestroyElementCommand(req));
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductDependencyDiagramCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductDependencyDiagramCanonicalEditPolicy.java
deleted file mode 100644
index e7c1142..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductDependencyDiagramCanonicalEditPolicy.java
+++ /dev/null
@@ -1,473 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.NodeContainer;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeEditPart;
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-import org.eclipse.epf.diagram.wpdd.providers.DiagramElementTypes;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-import org.eclipse.gmf.runtime.diagram.ui.commands.DeferredLayoutCommand;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
-import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductDependencyDiagramCanonicalEditPolicy extends
-		CanonicalConnectionEditPolicy {
-	
-	@Override
-	public EObject getSemanticHost() {
-		return host().getModel() != null ? super.getSemanticHost() : null;
-	}
-	
-	@Override
-	protected void refreshOnActivate() {		
-		super.refreshOnActivate();
-		
-		EditPart ep = getHost();
-		if(ep instanceof DiagramEditPart) {
-			DiagramEditorUtil.initializeOnActivate((DiagramEditPart) ep);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		EObject modelObject = ((View) getHost().getModel()).getElement();
-		View viewObject = (View) getHost().getModel();
-		EObject nextValue;
-		int nodeVID;
-		for (Iterator values = ((NodeContainer) modelObject).getNodes()
-				.iterator(); values.hasNext();) {
-			nextValue = (EObject) values.next();
-			nodeVID = DiagramVisualIDRegistry.getNodeVisualID(viewObject,
-					nextValue);
-			if (WorkProductNodeEditPart.VISUAL_ID == nodeVID) {
-				result.add(nextValue);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement()
-				&& view.getElement() != null
-				&& (view.getElement().eIsProxy() || view.getElement() instanceof Node);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected List getSemanticConnectionsList() {
-		List connections = new ArrayList();
-		WorkProductDependencyDiagram diagram = (WorkProductDependencyDiagram) ((View) getHost()
-				.getModel()).getElement();
-		for (Iterator iter = diagram.getNodes().iterator(); iter.hasNext();) {
-			Node node = (Node) iter.next();
-			connections.addAll(node.getOutgoingConnections());
-		}
-		return connections;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject getSourceElement(EObject relationship) {
-		if (relationship instanceof Link) {
-			return ((Link) relationship).getSource();
-		}
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected EObject getTargetElement(EObject relationship) {
-		if (relationship instanceof Link) {
-			return ((Link) relationship).getTarget();
-		}
-		return null;
-	}
-
-	/**
-	 * @modified
-	 */
-	protected boolean shouldIncludeConnection(Edge connector,
-			Collection children) {
-		return super.shouldIncludeConnection(connector, children);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void refreshSemantic() {
-		List createdViews = new LinkedList();
-		createdViews.addAll(refreshSemanticChildren());
-		List createdConnectionViews = new LinkedList();
-		createdConnectionViews.addAll(refreshSemanticConnections());
-		createdConnectionViews.addAll(refreshConnections());
-
-		if (createdViews.size() > 1) {
-			// perform a layout of the container
-			DeferredLayoutCommand layoutCmd = new DeferredLayoutCommand(host()
-					.getEditingDomain(), createdViews, host());
-			executeCommand(new ICommandProxy(layoutCmd));
-		}
-
-		createdViews.addAll(createdConnectionViews);
-		makeViewsImmutable(createdViews);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Collection myLinkDescriptors = new LinkedList();
-
-	/**
-	 * @generated
-	 */
-	private Map myEObject2ViewMap = new HashMap();
-
-	/**
-	 * @generated
-	 */
-	private Collection refreshConnections() {
-		try {
-			collectAllLinks(getDiagram());
-			Collection existingLinks = new LinkedList(getDiagram().getEdges());
-			for (Iterator diagramLinks = existingLinks.iterator(); diagramLinks
-					.hasNext();) {
-				Edge nextDiagramLink = (Edge) diagramLinks.next();
-				EObject diagramLinkObject = nextDiagramLink.getElement();
-				EObject diagramLinkSrc = nextDiagramLink.getSource()
-						.getElement();
-				EObject diagramLinkDst = nextDiagramLink.getTarget()
-						.getElement();
-				int diagramLinkVisualID = DiagramVisualIDRegistry
-						.getVisualID(nextDiagramLink);
-				for (Iterator modelLinkDescriptors = myLinkDescriptors
-						.iterator(); modelLinkDescriptors.hasNext();) {
-					LinkDescriptor nextLinkDescriptor = (LinkDescriptor) modelLinkDescriptors
-							.next();
-					if (diagramLinkObject == nextLinkDescriptor
-							.getLinkElement()
-							&& diagramLinkSrc == nextLinkDescriptor.getSource()
-							&& diagramLinkDst == nextLinkDescriptor
-									.getDestination()
-							&& diagramLinkVisualID == nextLinkDescriptor
-									.getVisualID()) {
-						diagramLinks.remove();
-						modelLinkDescriptors.remove();
-					}
-				}
-			}
-			deleteViews(existingLinks.iterator());
-			return createConnections(myLinkDescriptors);
-		} finally {
-			myLinkDescriptors.clear();
-			myEObject2ViewMap.clear();
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private void collectAllLinks(View view) {
-		EObject modelElement = view.getElement();
-		int diagramElementVisualID = DiagramVisualIDRegistry.getVisualID(view);
-		switch (diagramElementVisualID) {
-		case WorkProductNodeEditPart.VISUAL_ID:
-		case WorkProductDependencyDiagramEditPart.VISUAL_ID: {
-			myEObject2ViewMap.put(modelElement, view);
-			storeLinks(modelElement, getDiagram());
-		}
-		default: {
-		}
-			for (Iterator children = view.getChildren().iterator(); children
-					.hasNext();) {
-				View childView = (View) children.next();
-				collectAllLinks(childView);
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private Collection createConnections(Collection linkDescriptors) {
-		if (linkDescriptors.isEmpty()) {
-			return Collections.EMPTY_LIST;
-		}
-		List adapters = new LinkedList();
-		for (Iterator linkDescriptorsIterator = linkDescriptors.iterator(); linkDescriptorsIterator
-				.hasNext();) {
-			final LinkDescriptor nextLinkDescriptor = (LinkDescriptor) linkDescriptorsIterator
-					.next();
-			EditPart sourceEditPart = getEditPartFor(nextLinkDescriptor
-					.getSource());
-			EditPart targetEditPart = getEditPartFor(nextLinkDescriptor
-					.getDestination());
-			if (sourceEditPart == null || targetEditPart == null) {
-				continue;
-			}
-			CreateConnectionViewRequest.ConnectionViewDescriptor descriptor = new CreateConnectionViewRequest.ConnectionViewDescriptor(
-					nextLinkDescriptor.getSemanticAdapter(), null,
-					ViewUtil.APPEND, false, ((IGraphicalEditPart) getHost())
-							.getDiagramPreferencesHint());
-			CreateConnectionViewRequest ccr = new CreateConnectionViewRequest(
-					descriptor);
-			ccr.setType(RequestConstants.REQ_CONNECTION_START);
-			ccr.setSourceEditPart(sourceEditPart);
-			sourceEditPart.getCommand(ccr);
-			ccr.setTargetEditPart(targetEditPart);
-			ccr.setType(RequestConstants.REQ_CONNECTION_END);
-			Command cmd = targetEditPart.getCommand(ccr);
-			if (cmd != null && cmd.canExecute()) {
-				executeCommand(cmd);
-				IAdaptable viewAdapter = (IAdaptable) ccr.getNewObject();
-				if (viewAdapter != null) {
-					adapters.add(viewAdapter);
-				}
-			}
-		}
-		return adapters;
-	}
-
-	/**
-	 * @generated
-	 */
-	private EditPart getEditPartFor(EObject modelElement) {
-		View view = (View) myEObject2ViewMap.get(modelElement);
-		if (view != null) {
-			return (EditPart) getHost().getViewer().getEditPartRegistry().get(
-					view);
-		}
-		return null;
-	}
-
-	/**
-	 *@generated
-	 */
-	private void storeLinks(EObject container, Diagram diagram) {
-		EClass containerMetaclass = container.eClass();
-		storeFeatureModelFacetLinks(container, containerMetaclass, diagram);
-		storeTypeModelFacetLinks(container, containerMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void storeTypeModelFacetLinks(EObject container,
-			EClass containerMetaclass) {
-		storeTypeModelFacetLinks_Link_3001(container, containerMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void storeTypeModelFacetLinks_Link_3001(EObject container,
-			EClass containerMetaclass) {
-		if (ModelPackage.eINSTANCE.getNode().isSuperTypeOf(containerMetaclass)) {
-			for (Iterator values = ((Node) container).getOutgoingConnections()
-					.iterator(); values.hasNext();) {
-				EObject nextValue = ((EObject) values.next());
-				int linkVID = DiagramVisualIDRegistry
-						.getLinkWithClassVisualID(nextValue);
-				if (LinkEditPart.VISUAL_ID == linkVID) {
-					Object structuralFeatureResult = ((Link) nextValue)
-							.getTarget();
-					if (structuralFeatureResult instanceof EObject) {
-						EObject dst = (EObject) structuralFeatureResult;
-						structuralFeatureResult = ((Link) nextValue)
-								.getSource();
-						if (structuralFeatureResult instanceof EObject) {
-							EObject src = (EObject) structuralFeatureResult;
-							myLinkDescriptors.add(new LinkDescriptor(src, dst,
-									nextValue, DiagramElementTypes.Link_3001,
-									linkVID));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 *@generated
-	 */
-	private void storeFeatureModelFacetLinks(EObject container,
-			EClass containerMetaclass, Diagram diagram) {
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private Diagram getDiagram() {
-		return ((View) getHost().getModel()).getDiagram();
-	}
-
-	/**
-	 * @generated
-	 */
-	private class LinkDescriptor {
-
-		/**
-		 * @generated
-		 */
-		private EObject mySource;
-
-		/**
-		 * @generated
-		 */
-		private EObject myDestination;
-
-		/**
-		 * @generated
-		 */
-		private EObject myLinkElement;
-
-		/**
-		 * @generated
-		 */
-		private int myVisualID;
-
-		/**
-		 * @generated
-		 */
-		private IAdaptable mySemanticAdapter;
-
-		/**
-		 * @generated
-		 */
-		protected LinkDescriptor(EObject source, EObject destination,
-				EObject linkElement, IElementType elementType, int linkVID) {
-			this(source, destination, linkVID);
-			myLinkElement = linkElement;
-			final IElementType elementTypeCopy = elementType;
-			mySemanticAdapter = new EObjectAdapter(linkElement) {
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return elementTypeCopy;
-					}
-					return super.getAdapter(adapter);
-				}
-			};
-		}
-
-		/**
-		 * @generated
-		 */
-		protected LinkDescriptor(EObject source, EObject destination,
-				IElementType elementType, int linkVID) {
-			this(source, destination, linkVID);
-			myLinkElement = null;
-			final IElementType elementTypeCopy = elementType;
-			mySemanticAdapter = new IAdaptable() {
-				public Object getAdapter(Class adapter) {
-					if (IElementType.class.equals(adapter)) {
-						return elementTypeCopy;
-					}
-					return null;
-				}
-			};
-		}
-
-		/**
-		 * @generated
-		 */
-		private LinkDescriptor(EObject source, EObject destination, int linkVID) {
-			mySource = source;
-			myDestination = destination;
-			myVisualID = linkVID;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getSource() {
-			return mySource;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getDestination() {
-			return myDestination;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected EObject getLinkElement() {
-			return myLinkElement;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected int getVisualID() {
-			return myVisualID;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected IAdaptable getSemanticAdapter() {
-			return mySemanticAdapter;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductDependencyDiagramItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductDependencyDiagramItemSemanticEditPolicy.java
deleted file mode 100644
index 280de5e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductDependencyDiagramItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.wpdd.edit.commands.WorkProductNodeCreateCommand;
-import org.eclipse.epf.diagram.wpdd.providers.DiagramElementTypes;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.emf.commands.core.commands.DuplicateEObjectsCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DuplicateElementsRequest;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductDependencyDiagramItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCommand(CreateElementRequest req) {
-		if (DiagramElementTypes.WorkProductNode_1001 == req.getElementType()) {
-			if (req.getContainmentFeature() == null) {
-				req.setContainmentFeature(ModelPackage.eINSTANCE
-						.getNodeContainer_Nodes());
-			}
-			return getMSLWrapper(new WorkProductNodeCreateCommand(req));
-		}
-		return super.getCreateCommand(req);
-	}
-
-	/**
-	 * @modified
-	 */
-	protected Command getDuplicateCommand(DuplicateElementsRequest req) {
-		//		TransactionalEditingDomain editingDomain = ((IGraphicalEditPart) getHost())
-		//				.getEditingDomain();
-		//		return getMSLWrapper(new DuplicateAnythingCommand(editingDomain, req));
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class DuplicateAnythingCommand extends
-			DuplicateEObjectsCommand {
-
-		/**
-		 * @generated
-		 */
-		public DuplicateAnythingCommand(
-				TransactionalEditingDomain editingDomain,
-				DuplicateElementsRequest req) {
-			super(editingDomain, req.getLabel(), req
-					.getElementsToBeDuplicated(), req
-					.getAllDuplicatedElementsMap());
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeCanonicalEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeCanonicalEditPolicy.java
deleted file mode 100644
index d5da00d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeCanonicalEditPolicy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @generated
- */
-public class WorkProductNodeCanonicalEditPolicy extends CanonicalEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected List getSemanticChildrenList() {
-		List result = new LinkedList();
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean shouldDeleteView(View view) {
-		return view.isSetElement() && view.getElement() != null
-				&& view.getElement().eIsProxy();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getDefaultFactoryHint() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeGraphicalNodeEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeGraphicalNodeEditPolicy.java
deleted file mode 100644
index 4ad17d4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeGraphicalNodeEditPolicy.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-/**
- * @generated
- */
-public class WorkProductNodeGraphicalNodeEditPolicy extends
-		DiagramGraphicalNodeEditPolicy {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeItemSemanticEditPolicy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeItemSemanticEditPolicy.java
deleted file mode 100644
index be27464..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/edit/policies/WorkProductNodeItemSemanticEditPolicy.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.edit.policies;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
-import org.eclipse.gmf.runtime.emf.type.core.requests.ReorientRelationshipRequest;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-
-import org.eclipse.epf.diagram.wpdd.edit.commands.LinkCreateCommand;
-import org.eclipse.epf.diagram.wpdd.edit.commands.LinkReorientCommand;
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.wpdd.providers.DiagramElementTypes;
-
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-import org.eclipse.gmf.runtime.emf.type.core.commands.CreateRelationshipCommand;
-
-/**
- * @generated
- */
-public class WorkProductNodeItemSemanticEditPolicy extends
-		DiagramBaseItemSemanticEditPolicy {
-
-	/**
-	 * @generated
-	 */
-	protected Command getDestroyElementCommand(DestroyElementRequest req) {
-		CompoundCommand cc = getDestroyEdgesCommand(req
-				.isConfirmationRequired());
-		View view = (View) getHost().getModel();
-		if (view.getEAnnotation("Shortcut") != null) { //$NON-NLS-1$
-			req.setElementToDestroy(view);
-		}
-		cc.add(getMSLWrapper(new DestroyElementCommand(req)));
-		return cc.unwrap();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
-		if (DiagramElementTypes.Link_3001 == req.getElementType()) {
-			return req.getTarget() == null ? getCreateStartOutgoingLink_3001Command(req)
-					: getCreateCompleteIncomingLink_3001Command(req);
-		}
-		return super.getCreateRelationshipCommand(req);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateStartOutgoingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		if (false == sourceEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, null)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new Command() {
-		};
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Command getCreateCompleteIncomingLink_3001Command(
-			CreateRelationshipRequest req) {
-		EObject sourceEObject = req.getSource();
-		EObject targetEObject = req.getTarget();
-		if (false == sourceEObject instanceof Node
-				|| false == targetEObject instanceof Node) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Node source = (Node) sourceEObject;
-		Node target = (Node) targetEObject;
-		Node container = (Node) getRelationshipContainer(source,
-				ModelPackage.eINSTANCE.getNode(), req.getElementType());
-		if (container == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (!DiagramBaseItemSemanticEditPolicy.LinkConstraints
-				.canCreateLink_3001(container, source, target)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		if (req.getContainmentFeature() == null) {
-			req.setContainmentFeature(ModelPackage.eINSTANCE
-					.getNode_OutgoingConnections());
-		}
-		return getMSLWrapper(new LinkCreateCommand(req, container, source,
-				target));
-	}
-
-	/**
-	 * Returns command to reorient EClass based link. New link target or source
-	 * should be the domain model element associated with this node.
-	 * 
-	 * @generated
-	 */
-	protected Command getReorientRelationshipCommand(
-			ReorientRelationshipRequest req) {
-		switch (getVisualID(req)) {
-		case LinkEditPart.VISUAL_ID:
-			return getMSLWrapper(new LinkReorientCommand(req));
-		}
-		return super.getReorientRelationshipCommand(req);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramCreationWizard.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramCreationWizard.java
deleted file mode 100644
index 6446b5e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramCreationWizard.java
+++ /dev/null
@@ -1,151 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.lang.reflect.InvocationTargetException;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.EditorCreationWizard;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * @generated
- */
-public class DiagramCreationWizard extends Wizard implements INewWizard {
-
-	/**
-	 * @generated
-	 */
-	private IWorkbench workbench;
-	/**
-	 * @generated
-	 */
-	protected IStructuredSelection selection;
-	/**
-	 * @generated
-	 */
-	protected DiagramCreationWizardPage diagramModelFilePage;
-	/**
-	 * @generated
-	 */
-	protected Resource diagram;
-	/**
-	 * @generated
-	 */
-	private boolean openNewlyCreatedDiagramEditor = true;
-
-	/**
-	 * @generated
-	 */
-	public IWorkbench getWorkbench() {
-		return workbench;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IStructuredSelection getSelection() {
-		return selection;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final Resource getDiagram() {
-		return diagram;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final boolean isOpenNewlyCreatedDiagramEditor() {
-		return openNewlyCreatedDiagramEditor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setOpenNewlyCreatedDiagramEditor(
-			boolean openNewlyCreatedDiagramEditor) {
-		this.openNewlyCreatedDiagramEditor = openNewlyCreatedDiagramEditor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void addPages() {
-		diagramModelFilePage = new DiagramCreationWizardPage(
-				"DiagramModelFile", getSelection(), "wpdd"); //$NON-NLS-1$ //$NON-NLS-2$
-		diagramModelFilePage.setTitle("Create WPDD Diagram");
-		diagramModelFilePage
-				.setDescription("Select file that will contain diagram and domain models.");
-		addPage(diagramModelFilePage);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean performFinish() {
-		IRunnableWithProgress op = new WorkspaceModifyOperation(null) {
-
-			protected void execute(IProgressMonitor monitor)
-					throws CoreException, InterruptedException {
-				diagram = DiagramDiagramEditorUtil.createDiagram(
-						diagramModelFilePage.getURI(), monitor);
-				if (isOpenNewlyCreatedDiagramEditor() && diagram != null) {
-					try {
-						DiagramDiagramEditorUtil.openDiagram(diagram);
-					} catch (PartInitException e) {
-						ErrorDialog.openError(getContainer().getShell(),
-								"Error opening diagram editor", null, e
-										.getStatus());
-					}
-				}
-			}
-		};
-		try {
-			getContainer().run(false, true, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			if (e.getTargetException() instanceof CoreException) {
-				ErrorDialog.openError(getContainer().getShell(),
-						"Creation Problems", null, ((CoreException) e
-								.getTargetException()).getStatus());
-			} else {
-				WPDDiagramEditorPlugin.getInstance().logError(
-						"Error creating diagram", e.getTargetException()); //$NON-NLS-1$
-			}
-			return false;
-		}
-		return diagram != null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		this.workbench = workbench;
-		this.selection = selection;
-		setWindowTitle("New WPDD Diagram");
-		setDefaultPageImageDescriptor(WPDDiagramEditorPlugin
-				.getBundledImageDescriptor("icons/wizban/NewModelWizard.gif")); //$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramCreationWizardPage.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramCreationWizardPage.java
deleted file mode 100644
index ab61f5e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramCreationWizardPage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.EditorWizardPage;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-/**
- * @generated
- */
-public class DiagramCreationWizardPage extends WizardNewFileCreationPage {
-
-	/**
-	 * @generated
-	 */
-	private final String fileExtension;
-
-	/**
-	 * @generated
-	 */
-	public DiagramCreationWizardPage(String pageName,
-			IStructuredSelection selection, String fileExtension) {
-		super(pageName, selection);
-		this.fileExtension = fileExtension;
-	}
-
-	/**
-	 * Override to create files with this extension.
-	 * 
-	 * @generated
-	 */
-	protected String getExtension() {
-		return fileExtension;
-	}
-
-	/**
-	 * @generated
-	 */
-	public URI getURI() {
-		return URI.createPlatformResourceURI(getFilePath().toString(), false);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IPath getFilePath() {
-		IPath path = getContainerFullPath();
-		if (path == null) {
-			path = new Path(""); //$NON-NLS-1$
-		}
-		String fileName = getFileName();
-		if (fileName != null) {
-			path = path.append(fileName);
-		}
-		return path;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		setFileName(DiagramDiagramEditorUtil.getUniqueFileName(
-				getContainerFullPath(), getFileName(), getExtension()));
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean validatePage() {
-		if (!super.validatePage()) {
-			return false;
-		}
-		String extension = getExtension();
-		if (extension != null
-				&& !getFilePath().toString().endsWith("." + extension)) {
-			setErrorMessage(NLS.bind(
-					"File name should have ''{0}'' extension.", extension));
-			return false;
-		}
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramActionBarContributor.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramActionBarContributor.java
deleted file mode 100644
index abd22da..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramActionBarContributor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramActionBarContributor;
-
-/**
- * @generated
- */
-public class DiagramDiagramActionBarContributor extends
-		DiagramActionBarContributor {
-
-	/**
-	 * @generated
-	 */
-	protected Class getEditorClass() {
-		return WorkProductDependencyDiagramEditor.class;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getEditorId() {
-		return WorkProductDependencyDiagramEditor.ID;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramEditorUtil.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramEditorUtil.java
deleted file mode 100644
index c0db00f..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramEditorUtil.java
+++ /dev/null
@@ -1,441 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.SubProgressMonitor;
-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.ResourceSet;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.edit.ui.util.EditUIUtil;
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
-import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.util.IDEEditorUtil;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
-import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-import org.eclipse.gef.EditPart;
-
-/**
- * @generated
- */
-public class DiagramDiagramEditorUtil {
-
-	/**
-	 * @generated
-	 */
-	private static Map ourSaveOptions = null;
-
-	/**
-	 * @generated
-	 */
-	public static Map getSaveOptions() {
-		if (ourSaveOptions == null) {
-			ourSaveOptions = new HashMap();
-			ourSaveOptions.put(XMIResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-			ourSaveOptions.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE,
-					Boolean.TRUE);
-			ourSaveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED,
-					Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
-		}
-		return ourSaveOptions;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static boolean openDiagram(Resource diagram)
-			throws PartInitException {
-		return EditUIUtil.openEditor((EObject) diagram.getContents().get(0));
-	}
-
-	/**
-	 * @generated
-	 */
-	public static void setCharset(IFile file) {
-		if (file == null) {
-			return;
-		}
-		try {
-			file.setCharset("UTF-8", new NullProgressMonitor()); //$NON-NLS-1$
-		} catch (CoreException e) {
-			WPDDiagramEditorPlugin.getInstance().logError(
-					"Unable to set charset for file " + file.getFullPath(), e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getUniqueFileName(IPath containerFullPath,
-			String fileName, String extension) {
-		if (containerFullPath == null) {
-			containerFullPath = new Path(""); //$NON-NLS-1$
-		}
-		if (fileName == null || fileName.trim().length() == 0) {
-			fileName = "default"; //$NON-NLS-1$
-		}
-		IPath filePath = containerFullPath.append(fileName);
-		if (extension != null && !extension.equals(filePath.getFileExtension())) {
-			filePath = filePath.addFileExtension(extension);
-		}
-		extension = filePath.getFileExtension();
-		fileName = filePath.removeFileExtension().lastSegment();
-		int i = 1;
-		while (ResourcesPlugin.getWorkspace().getRoot().exists(filePath)) {
-			i++;
-			filePath = containerFullPath.append(fileName + i);
-			if (extension != null) {
-				filePath = filePath.addFileExtension(extension);
-			}
-		}
-		return filePath.lastSegment();
-	}
-
-	/**
-	 * Runs the wizard in a dialog.
-	 * 
-	 * @generated
-	 */
-	public static void runWizard(Shell shell, Wizard wizard, String settingsKey) {
-		IDialogSettings pluginDialogSettings = WPDDiagramEditorPlugin
-				.getInstance().getDialogSettings();
-		IDialogSettings wizardDialogSettings = pluginDialogSettings
-				.getSection(settingsKey);
-		if (wizardDialogSettings == null) {
-			wizardDialogSettings = pluginDialogSettings
-					.addNewSection(settingsKey);
-		}
-		wizard.setDialogSettings(wizardDialogSettings);
-		WizardDialog dialog = new WizardDialog(shell, wizard);
-		dialog.create();
-		dialog.getShell().setSize(Math.max(500, dialog.getShell().getSize().x),
-				500);
-		dialog.open();
-	}
-
-	/**
-	 * This method should be called within a workspace modify operation since it creates resources.
-	 * @generated
-	 */
-	public static Resource createDiagram(URI diagramURI,
-			IProgressMonitor progressMonitor) {
-		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
-				.createEditingDomain();
-		progressMonitor.beginTask(
-				Messages.DiagramDiagramEditorUtil_CreateDiagramProgressTask, 3);
-		final Resource diagramResource = editingDomain.getResourceSet()
-				.createResource(diagramURI);
-		final String diagramName = diagramURI.lastSegment();
-		AbstractTransactionalCommand command = new AbstractTransactionalCommand(
-				editingDomain,
-				Messages.DiagramDiagramEditorUtil_CreateDiagramCommandLabel,
-				Collections.EMPTY_LIST) {
-			protected CommandResult doExecuteWithResult(
-					IProgressMonitor monitor, IAdaptable info)
-					throws ExecutionException {
-				WorkProductDependencyDiagram model = createInitialModel();
-				attachModelToResource(model, diagramResource);
-
-				Diagram diagram = ViewService.createDiagram(model,
-						WorkProductDependencyDiagramEditPart.MODEL_ID,
-						WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				if (diagram != null) {
-					diagramResource.getContents().add(diagram);
-					diagram.setName(diagramName);
-					diagram.setElement(model);
-				}
-
-				try {
-
-					diagramResource
-							.save(org.eclipse.epf.diagram.wpdd.part.DiagramDiagramEditorUtil
-									.getSaveOptions());
-				} catch (IOException e) {
-
-					WPDDiagramEditorPlugin.getInstance().logError(
-							"Unable to store model and diagram resources", e); //$NON-NLS-1$
-				}
-				return CommandResult.newOKCommandResult();
-			}
-		};
-		try {
-			OperationHistoryFactory.getOperationHistory().execute(command,
-					new SubProgressMonitor(progressMonitor, 1), null);
-		} catch (ExecutionException e) {
-			WPDDiagramEditorPlugin.getInstance().logError(
-					"Unable to create model and diagram", e); //$NON-NLS-1$
-		}
-
-		setCharset(WorkspaceSynchronizer.getFile(diagramResource));
-		return diagramResource;
-	}
-
-	/**
-	 * Create a new instance of domain element associated with canvas.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static WorkProductDependencyDiagram createInitialModel() {
-		return ModelFactory.eINSTANCE.createWorkProductDependencyDiagram();
-	}
-
-	/**
-	 * Store model element in the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static void attachModelToResource(
-			WorkProductDependencyDiagram model, Resource resource) {
-		resource.getContents().add(model);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static void selectElementsInDiagram(
-			IDiagramWorkbenchPart diagramPart, List/*EditPart*/editParts) {
-		diagramPart.getDiagramGraphicalViewer().deselectAll();
-
-		EditPart firstPrimary = null;
-		for (Iterator it = editParts.iterator(); it.hasNext();) {
-			EditPart nextPart = (EditPart) it.next();
-			diagramPart.getDiagramGraphicalViewer().appendSelection(nextPart);
-			if (firstPrimary == null && nextPart instanceof IPrimaryEditPart) {
-				firstPrimary = nextPart;
-			}
-		}
-
-		if (!editParts.isEmpty()) {
-			diagramPart.getDiagramGraphicalViewer().reveal(
-					firstPrimary != null ? firstPrimary : (EditPart) editParts
-							.get(0));
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private static int findElementsInDiagramByID(DiagramEditPart diagramPart,
-			EObject element, List editPartCollector) {
-		IDiagramGraphicalViewer viewer = (IDiagramGraphicalViewer) diagramPart
-				.getViewer();
-		final int intialNumOfEditParts = editPartCollector.size();
-
-		if (element instanceof View) { // support notation element lookup
-			EditPart editPart = (EditPart) viewer.getEditPartRegistry().get(
-					element);
-			if (editPart != null) {
-				editPartCollector.add(editPart);
-				return 1;
-			}
-		}
-
-		String elementID = EMFCoreUtil.getProxyID(element);
-		List associatedParts = viewer.findEditPartsForElement(elementID,
-				IGraphicalEditPart.class);
-		// perform the possible hierarchy disjoint -> take the top-most parts only
-		for (Iterator editPartIt = associatedParts.iterator(); editPartIt
-				.hasNext();) {
-			EditPart nextPart = (EditPart) editPartIt.next();
-			EditPart parentPart = nextPart.getParent();
-			while (parentPart != null && !associatedParts.contains(parentPart)) {
-				parentPart = parentPart.getParent();
-			}
-			if (parentPart == null) {
-				editPartCollector.add(nextPart);
-			}
-		}
-
-		if (intialNumOfEditParts == editPartCollector.size()) {
-			if (!associatedParts.isEmpty()) {
-				editPartCollector.add(associatedParts.iterator().next());
-			} else {
-				if (element.eContainer() != null) {
-					return findElementsInDiagramByID(diagramPart, element
-							.eContainer(), editPartCollector);
-				}
-			}
-		}
-		return editPartCollector.size() - intialNumOfEditParts;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static View findView(DiagramEditPart diagramEditPart,
-			EObject targetElement, LazyElement2ViewMap lazyElement2ViewMap) {
-		boolean hasStructuralURI = false;
-		if (targetElement.eResource() instanceof XMLResource) {
-			hasStructuralURI = ((XMLResource) targetElement.eResource())
-					.getID(targetElement) == null;
-		}
-
-		View view = null;
-		if (hasStructuralURI
-				&& !lazyElement2ViewMap.getElement2ViewMap().isEmpty()) {
-			view = (View) lazyElement2ViewMap.getElement2ViewMap().get(
-					targetElement);
-		} else if (findElementsInDiagramByID(diagramEditPart, targetElement,
-				lazyElement2ViewMap.editPartTmpHolder) > 0) {
-			EditPart editPart = (EditPart) lazyElement2ViewMap.editPartTmpHolder
-					.get(0);
-			lazyElement2ViewMap.editPartTmpHolder.clear();
-			view = editPart.getModel() instanceof View ? (View) editPart
-					.getModel() : null;
-		}
-
-		return (view == null) ? diagramEditPart.getDiagramView() : view;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static class LazyElement2ViewMap {
-		/**
-		 * @generated
-		 */
-		private Map element2ViewMap;
-
-		/**
-		 * @generated
-		 */
-		private View scope;
-
-		/**
-		 * @generated
-		 */
-		private Set elementSet;
-
-		/**
-		 * @generated
-		 */
-		public final List editPartTmpHolder = new ArrayList();
-
-		/**
-		 * @generated
-		 */
-		public LazyElement2ViewMap(View scope, Set elements) {
-			this.scope = scope;
-			this.elementSet = elements;
-		}
-
-		/**
-		 * @generated
-		 */
-		public final Map getElement2ViewMap() {
-			if (element2ViewMap == null) {
-				element2ViewMap = new HashMap();
-				// map possible notation elements to itself as these can't be found by view.getElement()
-				for (Iterator it = elementSet.iterator(); it.hasNext();) {
-					EObject element = (EObject) it.next();
-					if (element instanceof View) {
-						View view = (View) element;
-						if (view.getDiagram() == scope.getDiagram()) {
-							element2ViewMap.put(element, element); // take only those that part of our diagram
-						}
-					}
-				}
-
-				buildElement2ViewMap(scope, element2ViewMap, elementSet);
-			}
-			return element2ViewMap;
-		}
-
-		/**
-		 * @generated
-		 */
-		static Map buildElement2ViewMap(View parentView, Map element2ViewMap,
-				Set elements) {
-			if (elements.size() == element2ViewMap.size())
-				return element2ViewMap;
-
-			if (parentView.isSetElement()
-					&& !element2ViewMap.containsKey(parentView.getElement())
-					&& elements.contains(parentView.getElement())) {
-				element2ViewMap.put(parentView.getElement(), parentView);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-
-			for (Iterator it = parentView.getChildren().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			for (Iterator it = parentView.getSourceEdges().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			for (Iterator it = parentView.getSourceEdges().iterator(); it
-					.hasNext();) {
-				buildElement2ViewMap((View) it.next(), element2ViewMap,
-						elements);
-				if (elements.size() == element2ViewMap.size())
-					return element2ViewMap;
-			}
-			return element2ViewMap;
-		}
-	} //LazyElement2ViewMap	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramFileCreator.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramFileCreator.java
deleted file mode 100644
index 9858798..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramFileCreator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.util.IDEEditorFileCreator;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
-
-/**
- * @generated
- */
-public class DiagramDiagramFileCreator extends IDEEditorFileCreator {
-
-	/**
-	 * @generated
-	 */
-	private static DiagramDiagramFileCreator INSTANCE = new DiagramDiagramFileCreator();
-
-	/**
-	 * @generated
-	 */
-	public static DiagramFileCreator getInstance() {
-		return INSTANCE;
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getExtension() {
-		return ".wpdd"; //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramPreferenceInitializer.java
deleted file mode 100644
index b29e015..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDiagramPreferenceInitializer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @generated
- */
-public class DiagramDiagramPreferenceInitializer extends
-		DiagramPreferenceInitializer {
-
-	/**
-	 * @generated
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin
-				.getInstance().getPreferenceStore();
-	}
-
-	@Override
-	public void initializeDefaultPreferences() {
-		super.initializeDefaultPreferences();
-		DiagramCoreUtil.setDefaultFontPreference(getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDocumentProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDocumentProvider.java
deleted file mode 100644
index ac7c1b6..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramDocumentProvider.java
+++ /dev/null
@@ -1,1058 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import java.util.Map;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.ui.URIEditorInput;
-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.ResourceSet;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.emf.transaction.DemultiplexingListener;
-import org.eclipse.emf.transaction.NotificationFilter;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.AbstractDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramModificationListener;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.EditorStatusCodes;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.internal.util.DiagramIOUtil;
-import org.eclipse.gmf.runtime.emf.core.resources.GMFResourceFactory;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * @generated
- */
-public class DiagramDocumentProvider extends AbstractDocumentProvider implements
-		IDiagramDocumentProvider {
-
-	/**
-	 * @generated
-	 */
-	protected ElementInfo createElementInfo(Object element)
-			throws CoreException {
-		if (false == element instanceof FileEditorInput
-				&& false == element instanceof URIEditorInput) {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							WPDDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.DiagramDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-		IEditorInput editorInput = (IEditorInput) element;
-		IDiagramDocument document = (IDiagramDocument) createDocument(editorInput);
-
-		ResourceSetInfo info = new ResourceSetInfo(document, editorInput);
-		info.setModificationStamp(computeModificationStamp(info));
-		info.fStatus = null;
-		return info;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocument createDocument(Object element) throws CoreException {
-		if (false == element instanceof FileEditorInput
-				&& false == element instanceof URIEditorInput) {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							WPDDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.DiagramDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-		IDocument document = createEmptyDocument();
-		setDocumentContent(document, (IEditorInput) element);
-		setupDocument(element, document);
-		return document;
-	}
-
-	/**
-	 * Sets up the given document as it would be provided for the given element. The
-	 * content of the document is not changed. This default implementation is empty.
-	 * Subclasses may reimplement.
-	 * 
-	 * @param element the blue-print element
-	 * @param document the document to set up
-	 * @generated
-	 */
-	protected void setupDocument(Object element, IDocument document) {
-		// for subclasses
-	}
-
-	/**
-	 * @generated
-	 */
-	private long computeModificationStamp(ResourceSetInfo info) {
-		int result = 0;
-		for (Iterator it = info.getResourceSet().getResources().iterator(); it
-				.hasNext();) {
-			Resource nextResource = (Resource) it.next();
-			IFile file = WorkspaceSynchronizer.getFile(nextResource);
-			if (file != null) {
-				if (file.getLocation() != null) {
-					result += file.getLocation().toFile().lastModified();
-				} else {
-					result += file.getModificationStamp();
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocument createEmptyDocument() {
-		DiagramDocument document = new DiagramDocument();
-		document.setEditingDomain(createEditingDomain());
-		return document;
-	}
-
-	/**
-	 * @generated
-	 */
-	private TransactionalEditingDomain createEditingDomain() {
-		TransactionalEditingDomain editingDomain = DiagramEditingDomainFactory
-				.getInstance().createEditingDomain();
-		editingDomain.setID("org.eclipse.epf.diagram.wpdd.EditingDomain"); //$NON-NLS-1$
-		final NotificationFilter diagramResourceModifiedFilter = NotificationFilter
-				.createNotifierFilter(editingDomain.getResourceSet()).and(
-						NotificationFilter
-								.createEventTypeFilter(Notification.ADD)).and(
-						NotificationFilter.createFeatureFilter(
-								ResourceSet.class,
-								ResourceSet.RESOURCE_SET__RESOURCES));
-		editingDomain.getResourceSet().eAdapters().add(new Adapter() {
-
-			private Notifier myTarger;
-
-			public Notifier getTarget() {
-				return myTarger;
-			}
-
-			public boolean isAdapterForType(Object type) {
-				return false;
-			}
-
-			public void notifyChanged(Notification notification) {
-				if (diagramResourceModifiedFilter.matches(notification)) {
-					Object value = notification.getNewValue();
-					if (value instanceof Resource) {
-						((Resource) value).setTrackingModification(true);
-					}
-				}
-			}
-
-			public void setTarget(Notifier newTarget) {
-				myTarger = newTarget;
-			}
-
-		});
-
-		return editingDomain;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setDocumentContent(IDocument document, IEditorInput element)
-			throws CoreException {
-		IDiagramDocument diagramDocument = (IDiagramDocument) document;
-		TransactionalEditingDomain domain = diagramDocument.getEditingDomain();
-		if (element instanceof FileEditorInput) {
-			IStorage storage = ((FileEditorInput) element).getStorage();
-			Diagram diagram = DiagramIOUtil.load(domain, storage, true,
-					getProgressMonitor());
-			document.setContent(diagram);
-		} else if (element instanceof URIEditorInput) {
-			URI uri = ((URIEditorInput) element).getURI();
-			Resource resource = null;
-			try {
-				resource = domain.getResourceSet().getResource(
-						uri.trimFragment(), false);
-				if (resource == null) {
-					resource = domain.getResourceSet().createResource(
-							uri.trimFragment());
-				}
-				if (!resource.isLoaded()) {
-					try {
-						Map options = new HashMap(GMFResourceFactory
-								.getDefaultLoadOptions());
-						// @see 171060 
-						// options.put(org.eclipse.emf.ecore.xmi.XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
-						resource.load(options);
-					} catch (IOException e) {
-						resource.unload();
-						throw e;
-					}
-				}
-				if (resource == null) {
-					throw new RuntimeException(
-							Messages.DiagramDocumentProvider_UnableToLoadResourceError);
-				}
-				if (uri.fragment() != null) {
-					EObject rootElement = resource.getEObject(uri.fragment());
-					if (rootElement instanceof Diagram) {
-						document.setContent((Diagram) rootElement);
-						return;
-					}
-				} else {
-					for (Iterator it = resource.getContents().iterator(); it
-							.hasNext();) {
-						Object rootElement = it.next();
-						if (rootElement instanceof Diagram) {
-							document.setContent((Diagram) rootElement);
-							return;
-						}
-					}
-				}
-				throw new RuntimeException(
-						Messages.DiagramDocumentProvider_NoDiagramInResourceError);
-			} catch (Exception e) {
-				CoreException thrownExcp = null;
-				if (e instanceof CoreException) {
-					thrownExcp = (CoreException) e;
-				} else {
-					String msg = e.getLocalizedMessage();
-					thrownExcp = new CoreException(
-							new Status(
-									IStatus.ERROR,
-									WPDDiagramEditorPlugin.ID,
-									0,
-									msg != null ? msg
-											: Messages.DiagramDocumentProvider_DiagramLoadingError,
-									e));
-				}
-				throw thrownExcp;
-			}
-		} else {
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							WPDDiagramEditorPlugin.ID,
-							0,
-							NLS
-									.bind(
-											Messages.DiagramDocumentProvider_IncorrectInputError,
-											new Object[] {
-													element,
-													"org.eclipse.ui.part.FileEditorInput",
-													"org.eclipse.emf.common.ui.URIEditorInput" }),
-							null));
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public long getModificationStamp(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			return computeModificationStamp(info);
-		}
-		return super.getModificationStamp(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isDeleted(Object element) {
-		IDiagramDocument document = getDiagramDocument(element);
-		if (document != null) {
-			Resource diagramResource = document.getDiagram().eResource();
-			if (diagramResource != null) {
-				IFile file = WorkspaceSynchronizer.getFile(diagramResource);
-				return file == null || file.getLocation() == null
-						|| !file.getLocation().toFile().exists();
-			}
-		}
-		return super.isDeleted(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public ResourceSetInfo getResourceSetInfo(Object editorInput) {
-		return (ResourceSetInfo) super.getElementInfo(editorInput);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void disposeElementInfo(Object element, ElementInfo info) {
-		if (info instanceof ResourceSetInfo) {
-			ResourceSetInfo resourceSetInfo = (ResourceSetInfo) info;
-			resourceSetInfo.dispose();
-		}
-		super.disposeElementInfo(element, info);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doValidateState(Object element, Object computationContext)
-			throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection files2Validate = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null && file.isReadOnly()) {
-					files2Validate.add(file);
-				}
-			}
-			ResourcesPlugin.getWorkspace().validateEdit(
-					(IFile[]) files2Validate.toArray(new IFile[files2Validate
-							.size()]), computationContext);
-		}
-
-		super.doValidateState(element, computationContext);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isReadOnly(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (info.isUpdateCache()) {
-				try {
-					updateCache(element);
-				} catch (CoreException ex) {
-					WPDDiagramEditorPlugin.getInstance().logError(
-							Messages.DiagramDocumentProvider_isModifiable, ex);
-					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
-				}
-			}
-			return info.isReadOnly();
-		}
-		return super.isReadOnly(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isModifiable(Object element) {
-		if (!isStateValidated(element)) {
-			if (element instanceof FileEditorInput
-					|| element instanceof URIEditorInput) {
-				return true;
-			}
-		}
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (info.isUpdateCache()) {
-				try {
-					updateCache(element);
-				} catch (CoreException ex) {
-					WPDDiagramEditorPlugin.getInstance().logError(
-							Messages.DiagramDocumentProvider_isModifiable, ex);
-					// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.StorageDocumentProvider_isModifiable
-				}
-			}
-			return info.isModifiable();
-		}
-		return super.isModifiable(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateCache(Object element) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null && file.isReadOnly()) {
-					info.setReadOnly(true);
-					info.setModifiable(false);
-					return;
-				}
-			}
-			info.setReadOnly(false);
-			info.setModifiable(true);
-			return;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doUpdateStateCache(Object element) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			info.setUpdateCache(true);
-		}
-		super.doUpdateStateCache(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isSynchronized(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			return info.isSynchronized();
-		}
-		return super.isSynchronized(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getResetRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()
-							.modifyRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getSaveRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(computeSchedulingRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getSynchronizeRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection rules = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					rules.add(ResourcesPlugin.getWorkspace().getRuleFactory()
-							.refreshRule(file));
-				}
-			}
-			return new MultiRule((ISchedulingRule[]) rules
-					.toArray(new ISchedulingRule[rules.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ISchedulingRule getValidateStateRule(Object element) {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			Collection files = new ArrayList();
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				IFile file = WorkspaceSynchronizer.getFile(nextResource);
-				if (file != null) {
-					files.add(file);
-				}
-			}
-			return ResourcesPlugin.getWorkspace().getRuleFactory()
-					.validateEditRule(
-							(IFile[]) files.toArray(new IFile[files.size()]));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	private ISchedulingRule computeSchedulingRule(IResource toCreateOrModify) {
-		if (toCreateOrModify.exists())
-			return ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(
-					toCreateOrModify);
-
-		IResource parent = toCreateOrModify;
-		do {
-			/*
-			 * XXX This is a workaround for
-			 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=67601
-			 * IResourceRuleFactory.createRule should iterate the hierarchy
-			 * itself.
-			 */
-			toCreateOrModify = parent;
-			parent = toCreateOrModify.getParent();
-		} while (parent != null && !parent.exists());
-
-		return ResourcesPlugin.getWorkspace().getRuleFactory().createRule(
-				toCreateOrModify);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doSynchronize(Object element, IProgressMonitor monitor)
-			throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			for (Iterator it = info.getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource nextResource = (Resource) it.next();
-				handleElementChanged(info, nextResource, monitor);
-			}
-			return;
-		}
-		super.doSynchronize(element, monitor);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void doSaveDocument(IProgressMonitor monitor, Object element,
-			IDocument document, boolean overwrite) throws CoreException {
-		ResourceSetInfo info = getResourceSetInfo(element);
-		if (info != null) {
-			if (!overwrite && !info.isSynchronized()) {
-				throw new CoreException(
-						new Status(
-								IStatus.ERROR,
-								WPDDiagramEditorPlugin.ID,
-								IStatus.OK,
-								Messages.DiagramDocumentProvider_UnsynchronizedFileSaveError,
-								null));
-			}
-			info.stopResourceListening();
-			fireElementStateChanging(element);
-			List resources = info.getResourceSet().getResources();
-			try {
-				monitor.beginTask(
-						Messages.DiagramDocumentProvider_SaveDiagramTask,
-						resources.size() + 1); //"Saving diagram"
-				for (Iterator it = resources.iterator(); it.hasNext();) {
-					Resource nextResource = (Resource) it.next();
-					monitor
-							.setTaskName(NLS
-									.bind(
-											Messages.DiagramDocumentProvider_SaveNextResourceTask,
-											nextResource.getURI()));
-					if (nextResource.isLoaded()) {
-						try {
-							nextResource.save(DiagramDiagramEditorUtil
-									.getSaveOptions());
-						} catch (IOException e) {
-							fireElementStateChangeFailed(element);
-							throw new CoreException(new Status(IStatus.ERROR,
-									WPDDiagramEditorPlugin.ID,
-									EditorStatusCodes.RESOURCE_FAILURE, e
-											.getLocalizedMessage(), null));
-						}
-					}
-					monitor.worked(1);
-				}
-				monitor.done();
-			} catch (RuntimeException x) {
-				fireElementStateChangeFailed(element);
-				throw x;
-			} finally {
-				info.startResourceListening();
-			}
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleElementChanged(ResourceSetInfo info,
-			Resource changedResource, IProgressMonitor monitor) {
-		IFile file = WorkspaceSynchronizer.getFile(changedResource);
-		if (file != null) {
-			try {
-				file.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-			} catch (CoreException ex) {
-				WPDDiagramEditorPlugin
-						.getInstance()
-						.logError(
-								Messages.DiagramDocumentProvider_handleElementContentChanged,
-								ex);
-				// Error message to log was initially taken from org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.internal.l10n.EditorMessages.FileDocumentProvider_handleElementContentChanged
-			}
-		}
-		changedResource.unload();
-
-		fireElementContentAboutToBeReplaced(info.getEditorInput());
-		removeUnchangedElementListeners(info.getEditorInput(), info);
-		info.fStatus = null;
-		try {
-			setDocumentContent(info.fDocument, info.getEditorInput());
-		} catch (CoreException e) {
-			info.fStatus = e.getStatus();
-		}
-		if (!info.fCanBeSaved) {
-			info.setModificationStamp(computeModificationStamp(info));
-		}
-		addUnchangedElementListeners(info.getEditorInput(), info);
-		fireElementContentReplaced(info.getEditorInput());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void handleElementMoved(IEditorInput input, URI uri) {
-		if (input instanceof FileEditorInput) {
-			IFile newFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
-					new Path(URI.decode(uri.path())).removeFirstSegments(1));
-			fireElementMoved(input, newFile == null ? null
-					: new FileEditorInput(newFile));
-			return;
-		}
-		// TODO: append suffix to the URI! (use diagram as a parameter)
-		fireElementMoved(input, new URIEditorInput(uri));
-	}
-
-	/**
-	 * @generated
-	 */
-	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput,
-			TransactionalEditingDomain domain) {
-		return editorInput;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IDiagramDocument getDiagramDocument(Object element) {
-		IDocument doc = getDocument(element);
-		if (doc instanceof IDiagramDocument) {
-			return (IDiagramDocument) doc;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected class ResourceSetInfo extends ElementInfo {
-
-		/**
-		 * @generated
-		 */
-		private long myModificationStamp = IResource.NULL_STAMP;
-
-		/**
-		 * @generated
-		 */
-		private WorkspaceSynchronizer mySynchronizer;
-
-		/**
-		 * @generated
-		 */
-		private Collection myUnSynchronizedResources = new ArrayList();
-
-		/**
-		 * @generated
-		 */
-		private IDiagramDocument myDocument;
-
-		/**
-		 * @generated
-		 */
-		private IEditorInput myEditorInput;
-
-		/**
-		 * @generated
-		 */
-		private boolean myUpdateCache = true;
-
-		/**
-		 * @generated
-		 */
-		private boolean myModifiable = false;
-
-		/**
-		 * @generated
-		 */
-		private boolean myReadOnly = true;
-
-		/**
-		 * @generated
-		 */
-		private ResourceSetModificationListener myResourceSetListener;
-
-		/**
-		 * @generated
-		 */
-		public ResourceSetInfo(IDiagramDocument document,
-				IEditorInput editorInput) {
-			super(document);
-			myDocument = document;
-			myEditorInput = editorInput;
-			startResourceListening();
-			myResourceSetListener = new ResourceSetModificationListener(this);
-			getResourceSet().eAdapters().add(myResourceSetListener);
-		}
-
-		/**
-		 * @generated
-		 */
-		public long getModificationStamp() {
-			return myModificationStamp;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setModificationStamp(long modificationStamp) {
-			myModificationStamp = modificationStamp;
-		}
-
-		/**
-		 * @generated
-		 */
-		public ResourceSet getResourceSet() {
-			return myDocument.getEditingDomain().getResourceSet();
-		}
-
-		/**
-		 * @generated
-		 */
-		public IEditorInput getEditorInput() {
-			return myEditorInput;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void dispose() {
-			stopResourceListening();
-			getResourceSet().eAdapters().remove(myResourceSetListener);
-			for (Iterator it = getResourceSet().getResources().iterator(); it
-					.hasNext();) {
-				Resource resource = (Resource) it.next();
-				resource.unload();
-			}
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isSynchronized() {
-			return myUnSynchronizedResources.size() == 0;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setUnSynchronized(Resource resource) {
-			myUnSynchronizedResources.add(resource);
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setSynchronized(Resource resource) {
-			myUnSynchronizedResources.remove(resource);
-		}
-
-		/**
-		 * @generated
-		 */
-		public final void stopResourceListening() {
-			mySynchronizer.dispose();
-			mySynchronizer = null;
-		}
-
-		/**
-		 * @generated
-		 */
-		public final void startResourceListening() {
-			mySynchronizer = new WorkspaceSynchronizer(myDocument
-					.getEditingDomain(), new SynchronizerDelegate());
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isUpdateCache() {
-			return myUpdateCache;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setUpdateCache(boolean update) {
-			myUpdateCache = update;
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isModifiable() {
-			return myModifiable;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setModifiable(boolean modifiable) {
-			myModifiable = modifiable;
-		}
-
-		/**
-		 * @generated
-		 */
-		public boolean isReadOnly() {
-			return myReadOnly;
-		}
-
-		/**
-		 * @generated
-		 */
-		public void setReadOnly(boolean readOnly) {
-			myReadOnly = readOnly;
-		}
-
-		/**
-		 * @generated
-		 */
-		private class SynchronizerDelegate implements
-				WorkspaceSynchronizer.Delegate {
-
-			/**
-			 * @generated
-			 */
-			public void dispose() {
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceChanged(final Resource resource) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						handleElementChanged(ResourceSetInfo.this, resource,
-								null);
-					}
-				});
-				return true;
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceDeleted(Resource resource) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						fireElementDeleted(ResourceSetInfo.this
-								.getEditorInput());
-					}
-				});
-				return true;
-			}
-
-			/**
-			 * @generated
-			 */
-			public boolean handleResourceMoved(Resource resource,
-					final URI newURI) {
-				synchronized (ResourceSetInfo.this) {
-					if (ResourceSetInfo.this.fCanBeSaved) {
-						ResourceSetInfo.this.setUnSynchronized(resource);
-						return true;
-					}
-				}
-				if (myDocument.getDiagram().eResource() == resource) {
-					Display.getDefault().asyncExec(new Runnable() {
-						public void run() {
-							handleElementMoved(ResourceSetInfo.this
-									.getEditorInput(), newURI);
-						}
-					});
-				} else {
-					handleResourceDeleted(resource);
-				}
-				return true;
-			}
-
-		}
-
-	}
-
-	/**
-	 * @generated
-	 */
-	private class ResourceSetModificationListener extends EContentAdapter {
-
-		/**
-		 * @generated
-		 */
-		private NotificationFilter myModifiedFilter;
-
-		/**
-		 * @generated
-		 */
-		private ResourceSetInfo myInfo;
-
-		/**
-		 * @generated
-		 */
-		public ResourceSetModificationListener(ResourceSetInfo info) {
-			myInfo = info;
-			myModifiedFilter = NotificationFilter.createEventTypeFilter(
-					Notification.SET).or(
-					NotificationFilter
-							.createEventTypeFilter(Notification.UNSET)).and(
-					NotificationFilter.createFeatureFilter(Resource.class,
-							Resource.RESOURCE__IS_MODIFIED));
-		}
-
-		/**
-		 * @generated
-		 */
-		public void notifyChanged(Notification notification) {
-			if (notification.getNotifier() instanceof ResourceSet) {
-				super.notifyChanged(notification);
-			}
-			if (!notification.isTouch()
-					&& myModifiedFilter.matches(notification)) {
-				if (notification.getNotifier() instanceof Resource) {
-					Resource resource = (Resource) notification.getNotifier();
-					if (resource.isLoaded()) {
-						boolean modified = false;
-						for (Iterator it = myInfo.getResourceSet()
-								.getResources().iterator(); it.hasNext()
-								&& !modified;) {
-							Resource nextResource = (Resource) it.next();
-							if (nextResource.isLoaded()) {
-								modified = nextResource.isModified();
-							}
-						}
-						boolean dirtyStateChanged = false;
-						synchronized (myInfo) {
-							if (modified != myInfo.fCanBeSaved) {
-								myInfo.fCanBeSaved = modified;
-								dirtyStateChanged = true;
-							}
-							if (!resource.isModified()) {
-								myInfo.setSynchronized(resource);
-							}
-						}
-						if (dirtyStateChanged) {
-							fireElementDirtyStateChanged(myInfo
-									.getEditorInput(), modified);
-
-							if (!modified) {
-								myInfo
-										.setModificationStamp(computeModificationStamp(myInfo));
-							}
-						}
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramInitDiagramFileAction.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramInitDiagramFileAction.java
deleted file mode 100644
index 87b499d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramInitDiagramFileAction.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.core.resources.IFile;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
-
-import org.eclipse.jface.action.IAction;
-
-import org.eclipse.jface.dialogs.IDialogSettings;
-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.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @generated
- */
-public class DiagramInitDiagramFileAction implements IObjectActionDelegate {
-
-	/**
-	 * @generated
-	 */
-	private IWorkbenchPart targetPart;
-
-	/**
-	 * @generated
-	 */
-	private URI domainModelURI;
-
-	/**
-	 * @generated
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		this.targetPart = targetPart;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		domainModelURI = null;
-		action.setEnabled(false);
-		if (selection instanceof IStructuredSelection == false
-				|| selection.isEmpty()) {
-			return;
-		}
-		IFile file = (IFile) ((IStructuredSelection) selection)
-				.getFirstElement();
-		domainModelURI = URI.createPlatformResourceURI(file.getFullPath()
-				.toString(), true);
-		action.setEnabled(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Shell getShell() {
-		return targetPart.getSite().getShell();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void run(IAction action) {
-		TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
-				.createEditingDomain();
-		ResourceSet resourceSet = new ResourceSetImpl();
-		EObject diagramRoot = null;
-		try {
-			Resource resource = resourceSet.getResource(domainModelURI, true);
-			diagramRoot = (EObject) resource.getContents().get(0);
-		} catch (WrappedException ex) {
-			WPDDiagramEditorPlugin.getInstance().logError(
-					"Unable to load resource: " + domainModelURI, ex); //$NON-NLS-1$
-		}
-		if (diagramRoot == null) {
-			MessageDialog
-					.openError(
-							getShell(),
-							Messages.DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle,
-							Messages.DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage);
-			return;
-		}
-		Wizard wizard = new DiagramNewDiagramFileWizard(domainModelURI,
-				diagramRoot, editingDomain);
-		wizard
-				.setWindowTitle(NLS
-						.bind(
-								Messages.DiagramInitDiagramFileAction_InitDiagramFileWizardTitle,
-								WorkProductDependencyDiagramEditPart.MODEL_ID));
-		DiagramDiagramEditorUtil.runWizard(getShell(), wizard,
-				"InitDiagramFile"); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramLoadResourceAction.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramLoadResourceAction.java
deleted file mode 100644
index 198cffc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramLoadResourceAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.emf.edit.ui.action.LoadResourceAction.LoadResourceDialog;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-/**
- * @generated
- */
-public class DiagramLoadResourceAction implements IObjectActionDelegate {
-
-	/**
-	 * @generated
-	 */
-	private WorkProductDependencyDiagramEditPart mySelectedElement;
-
-	/**
-	 * @generated
-	 */
-	private Shell myShell;
-
-	/**
-	 * @generated
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		myShell = targetPart.getSite().getShell();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void run(IAction action) {
-		LoadResourceDialog loadResourceDialog = new LoadResourceDialog(myShell,
-				mySelectedElement.getEditingDomain());
-		loadResourceDialog.open();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		mySelectedElement = null;
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
-			if (structuredSelection.size() == 1
-					&& structuredSelection.getFirstElement() instanceof WorkProductDependencyDiagramEditPart) {
-				mySelectedElement = (WorkProductDependencyDiagramEditPart) structuredSelection
-						.getFirstElement();
-			}
-		}
-		action.setEnabled(isEnabled());
-	}
-
-	/**
-	 * @generated
-	 */
-	private boolean isEnabled() {
-		return mySelectedElement != null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramMatchingStrategy.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramMatchingStrategy.java
deleted file mode 100644
index 3ff07aa..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramMatchingStrategy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.emf.common.ui.URIEditorInput;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditorMatchingStrategy;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.PartInitException;
-
-/**
- * @generated
- */
-public class DiagramMatchingStrategy implements IEditorMatchingStrategy {
-
-	/**
-	 * @generated
-	 */
-	public boolean matches(IEditorReference editorRef, IEditorInput input) {
-		IEditorInput editorInput;
-		try {
-			editorInput = editorRef.getEditorInput();
-		} catch (PartInitException e) {
-			return false;
-		}
-
-		if (editorInput.equals(input)) {
-			return true;
-		}
-		if (editorInput instanceof URIEditorInput
-				&& input instanceof URIEditorInput) {
-			return ((URIEditorInput) editorInput).getURI().equals(
-					((URIEditorInput) input).getURI());
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramNewDiagramFileWizard.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramNewDiagramFileWizard.java
deleted file mode 100644
index 7cea52a..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramNewDiagramFileWizard.java
+++ /dev/null
@@ -1,253 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.io.IOException;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-
-import org.eclipse.core.commands.operations.OperationHistoryFactory;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-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.ResourceSet;
-
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-import org.eclipse.gmf.runtime.common.core.command.CommandResult;
-
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-
-import org.eclipse.gmf.runtime.diagram.core.services.view.CreateDiagramViewOperation;
-
-import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
-
-import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
-
-import org.eclipse.gmf.runtime.notation.Diagram;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-
-import org.eclipse.osgi.util.NLS;
-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.Label;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @generated
- */
-public class DiagramNewDiagramFileWizard extends Wizard {
-
-	/**
-	 * @generated
-	 */
-	private TransactionalEditingDomain myEditingDomain;
-
-	/**
-	 * @generated
-	 */
-	public DiagramNewDiagramFileWizard(URI domainModelURI, EObject diagramRoot,
-			TransactionalEditingDomain editingDomain) {
-		assert domainModelURI != null : "Domain model uri must be specified"; //$NON-NLS-1$
-		assert diagramRoot != null : "Doagram root element must be specified"; //$NON-NLS-1$
-		assert editingDomain != null : "Editing domain must be specified"; //$NON-NLS-1$
-
-		myFileCreationPage = new WizardNewFileCreationPage(
-				Messages.DiagramNewDiagramFileWizard_CreationPageName,
-				StructuredSelection.EMPTY);
-		myFileCreationPage
-				.setTitle(Messages.DiagramNewDiagramFileWizard_CreationPageTitle);
-		myFileCreationPage.setDescription(NLS.bind(
-				Messages.DiagramNewDiagramFileWizard_CreationPageDescription,
-				WorkProductDependencyDiagramEditPart.MODEL_ID));
-		IPath filePath;
-		String fileName = domainModelURI.trimFileExtension().lastSegment();
-		if (domainModelURI.isPlatformResource()) {
-			filePath = new Path(domainModelURI.trimSegments(1)
-					.toPlatformString(true));
-		} else if (domainModelURI.isFile()) {
-			filePath = new Path(domainModelURI.trimSegments(1).toFileString());
-		} else {
-			// TODO : use some default path
-			throw new IllegalArgumentException(
-					"Unsupported URI: " + domainModelURI); //$NON-NLS-1$
-		}
-		myFileCreationPage.setContainerFullPath(filePath);
-		myFileCreationPage.setFileName(DiagramDiagramEditorUtil
-				.getUniqueFileName(filePath, fileName, "wpdd")); //$NON-NLS-1$
-
-		diagramRootElementSelectionPage = new DiagramRootElementSelectionPage(
-				Messages.DiagramNewDiagramFileWizard_RootSelectionPageName);
-		diagramRootElementSelectionPage
-				.setTitle(Messages.DiagramNewDiagramFileWizard_RootSelectionPageTitle);
-		diagramRootElementSelectionPage
-				.setDescription(Messages.DiagramNewDiagramFileWizard_RootSelectionPageDescription);
-		diagramRootElementSelectionPage.setModelElement(diagramRoot);
-
-		myEditingDomain = editingDomain;
-	}
-
-	/**
-	 * @generated
-	 */
-	private WizardNewFileCreationPage myFileCreationPage;
-
-	/**
-	 * @generated
-	 */
-	private ModelElementSelectionPage diagramRootElementSelectionPage;
-
-	/**
-	 * @generated
-	 */
-	public void addPages() {
-		addPage(myFileCreationPage);
-		addPage(diagramRootElementSelectionPage);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean performFinish() {
-		List affectedFiles = new LinkedList();
-		IFile diagramFile = myFileCreationPage.createNewFile();
-		DiagramDiagramEditorUtil.setCharset(diagramFile);
-		affectedFiles.add(diagramFile);
-		URI diagramModelURI = URI.createPlatformResourceURI(diagramFile
-				.getFullPath().toString(), true);
-		ResourceSet resourceSet = myEditingDomain.getResourceSet();
-		final Resource diagramResource = resourceSet
-				.createResource(diagramModelURI);
-		AbstractTransactionalCommand command = new AbstractTransactionalCommand(
-				myEditingDomain,
-				Messages.DiagramNewDiagramFileWizard_InitDiagramCommand,
-				affectedFiles) {
-
-			protected CommandResult doExecuteWithResult(
-					IProgressMonitor monitor, IAdaptable info)
-					throws ExecutionException {
-				int diagramVID = DiagramVisualIDRegistry
-						.getDiagramVisualID(diagramRootElementSelectionPage
-								.getModelElement());
-				if (diagramVID != WorkProductDependencyDiagramEditPart.VISUAL_ID) {
-					return CommandResult
-							.newErrorCommandResult(Messages.DiagramNewDiagramFileWizard_IncorrectRootError);
-				}
-				Diagram diagram = ViewService.createDiagram(
-						diagramRootElementSelectionPage.getModelElement(),
-						WorkProductDependencyDiagramEditPart.MODEL_ID,
-						WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				diagramResource.getContents().add(diagram);
-				diagramResource.getContents().add(diagram.getElement());
-				return CommandResult.newOKCommandResult();
-			}
-		};
-		try {
-			OperationHistoryFactory.getOperationHistory().execute(command,
-					new NullProgressMonitor(), null);
-			diagramResource.save(DiagramDiagramEditorUtil.getSaveOptions());
-			DiagramDiagramEditorUtil.openDiagram(diagramResource);
-		} catch (ExecutionException e) {
-			WPDDiagramEditorPlugin.getInstance().logError(
-					"Unable to create model and diagram", e); //$NON-NLS-1$
-		} catch (IOException ex) {
-			WPDDiagramEditorPlugin.getInstance().logError(
-					"Save operation failed for: " + diagramModelURI, ex); //$NON-NLS-1$
-		} catch (PartInitException ex) {
-			WPDDiagramEditorPlugin.getInstance().logError(
-					"Unable to open editor", ex); //$NON-NLS-1$
-		}
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class DiagramRootElementSelectionPage extends
-			ModelElementSelectionPage {
-
-		/**
-		 * @generated
-		 */
-		protected DiagramRootElementSelectionPage(String pageName) {
-			super(pageName);
-		}
-
-		/**
-		 * @generated
-		 */
-		protected String getSelectionTitle() {
-			return Messages.DiagramNewDiagramFileWizard_RootSelectionPageSelectionTitle;
-		}
-
-		/**
-		 * @generated
-		 */
-		protected boolean validatePage() {
-			if (selectedModelElement == null) {
-				setErrorMessage(Messages.DiagramNewDiagramFileWizard_RootSelectionPageNoSelectionMessage);
-				return false;
-			}
-			boolean result = ViewService.getInstance().provides(
-					new CreateDiagramViewOperation(new EObjectAdapter(
-							selectedModelElement),
-							WorkProductDependencyDiagramEditPart.MODEL_ID,
-							WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT));
-			setErrorMessage(result ? null
-					: Messages.DiagramNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage);
-			return result;
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramPaletteFactory.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramPaletteFactory.java
deleted file mode 100644
index 8c10c03..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramPaletteFactory.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.model.Diagram;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.wpdd.providers.DiagramElementTypes;
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool;
-import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * @generated
- */
-public class DiagramPaletteFactory {
-
-	/**
-	 * @generated
-	 */
-	public void fillPalette(PaletteRoot paletteRoot) {
-		paletteRoot.add(createModel1Group());
-	}
-
-	/**
-	 * Creates "model" palette tool group
-	 * @generated
-	 */
-	private PaletteContainer createModel1Group() {
-		PaletteGroup paletteContainer = new PaletteGroup(
-				Messages.Model1Group_title);
-		paletteContainer.add(createControlFlow1CreationTool());
-		paletteContainer.add(createWorkProductDescriptor2CreationTool());
-		return paletteContainer;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createControlFlow1CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.Link_3001);
-		LinkToolEntry entry = new LinkToolEntry(
-				DiagramCoreResources.ActivityDiagram_Palette_control_flow_text,
-				DiagramCoreResources.ActivityDiagram_Palette_control_flow_create_text, types);
-		entry.setSmallIcon(DiagramElementTypes.getImageDescriptor(ModelPackage.eINSTANCE.getLink()));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @modified
-	 */
-	private ToolEntry createWorkProductDescriptor2CreationTool() {
-		List/*<IElementType>*/types = new ArrayList/*<IElementType>*/(1);
-		types.add(DiagramElementTypes.WorkProductNode_1001);
-		NodeToolEntry entry = new NodeToolEntry(
-				DiagramCoreResources.AbstractDiagram_WorkProductDescriptor_text,
-				 DiagramCoreResources.AbstractDiagram_WorkProductDescriptor_tooltip, types);
-		entry.setSmallIcon(DiagramElementTypes.getImageDescriptor(ModelPackage.eINSTANCE.getWorkProductDescriptorNode()));
-		entry.setLargeIcon(entry.getSmallIcon());
-		return entry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class NodeToolEntry extends ToolEntry {
-
-		/**
-		 * @generated
-		 */
-		private final List elementTypes;
-
-		/**
-		 * @generated
-		 */
-		private NodeToolEntry(String title, String description,
-				List elementTypes) {
-			super(title, description, null, null);
-			this.elementTypes = elementTypes;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Tool createTool() {
-			Tool tool = new UnspecifiedTypeCreationTool(elementTypes);
-			tool.setProperties(getToolProperties());
-			return tool;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	private static class LinkToolEntry extends ToolEntry {
-
-		/**
-		 * @generated
-		 */
-		private final List relationshipTypes;
-
-		/**
-		 * @generated
-		 */
-		private LinkToolEntry(String title, String description,
-				List relationshipTypes) {
-			super(title, description, null, null);
-			this.relationshipTypes = relationshipTypes;
-		}
-
-		/**
-		 * @generated
-		 */
-		public Tool createTool() {
-			Tool tool = new UnspecifiedTypeConnectionTool(relationshipTypes);
-			tool.setProperties(getToolProperties());
-			return tool;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramVisualIDRegistry.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramVisualIDRegistry.java
deleted file mode 100644
index f27db3e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/DiagramVisualIDRegistry.java
+++ /dev/null
@@ -1,295 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeNameEditPart;
-
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * This registry is used to determine which type of visual object should be
- * created for the corresponding Diagram, Node, ChildNode or Link represented 
- * by a domain model object.
- *
- * @generated
- */
-public class DiagramVisualIDRegistry {
-
-	/**
-	 * @generated
-	 */
-	private static final String DEBUG_KEY = WPDDiagramEditorPlugin
-			.getInstance().getBundle().getSymbolicName()
-			+ "/debug/visualID"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static int getVisualID(View view) {
-		if (view instanceof Diagram) {
-			if (WorkProductDependencyDiagramEditPart.MODEL_ID.equals(view
-					.getType())) {
-				return WorkProductDependencyDiagramEditPart.VISUAL_ID;
-			} else {
-				return -1;
-			}
-		}
-		return getVisualID(view.getType());
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getModelID(View view) {
-		View diagram = view.getDiagram();
-		while (view != diagram) {
-			EAnnotation annotation = view.getEAnnotation("Shortcut"); //$NON-NLS-1$
-			if (annotation != null) {
-				return (String) annotation.getDetails().get("modelID"); //$NON-NLS-1$
-			}
-			view = (View) view.eContainer();
-		}
-		return diagram != null ? diagram.getType() : null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getVisualID(String type) {
-		try {
-			return Integer.parseInt(type);
-		} catch (NumberFormatException e) {
-			if (Boolean.TRUE.toString().equalsIgnoreCase(
-					Platform.getDebugOption(DEBUG_KEY))) {
-				WPDDiagramEditorPlugin.getInstance().logError(
-						"Unable to parse view type as a visualID number: "
-								+ type);
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static String getType(int visualID) {
-		return String.valueOf(visualID);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getDiagramVisualID(EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getDiagramVisualID(domainElement, domainElementMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	private static int getDiagramVisualID(EObject domainElement,
-			EClass domainElementMetaclass) {
-		if (ModelPackage.eINSTANCE.getWorkProductDependencyDiagram()
-				.isSuperTypeOf(domainElementMetaclass)
-				&& isDiagramWorkProductDependencyDiagram_79((WorkProductDependencyDiagram) domainElement)) {
-			return WorkProductDependencyDiagramEditPart.VISUAL_ID;
-		}
-		return getUnrecognizedDiagramID(domainElement);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getNodeVisualID(View containerView, EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getNodeVisualID(containerView, domainElement,
-				domainElementMetaclass, null);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getNodeVisualID(View containerView,
-			EObject domainElement, EClass domainElementMetaclass,
-			String semanticHint) {
-		String containerModelID = getModelID(containerView);
-		if (!WorkProductDependencyDiagramEditPart.MODEL_ID
-				.equals(containerModelID)) {
-			return -1;
-		}
-		int containerVisualID;
-		if (WorkProductDependencyDiagramEditPart.MODEL_ID
-				.equals(containerModelID)) {
-			containerVisualID = getVisualID(containerView);
-		} else {
-			if (containerView instanceof Diagram) {
-				containerVisualID = WorkProductDependencyDiagramEditPart.VISUAL_ID;
-			} else {
-				return -1;
-			}
-		}
-		int nodeVisualID = semanticHint != null ? getVisualID(semanticHint)
-				: -1;
-		switch (containerVisualID) {
-		case WorkProductNodeEditPart.VISUAL_ID:
-			if (WorkProductNodeNameEditPart.VISUAL_ID == nodeVisualID) {
-				return WorkProductNodeNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedWorkProductNode_1001ChildNodeID(
-					domainElement, semanticHint);
-		case WorkProductDependencyDiagramEditPart.VISUAL_ID:
-			if ((semanticHint == null || WorkProductNodeEditPart.VISUAL_ID == nodeVisualID)
-					&& ModelPackage.eINSTANCE.getWorkProductNode()
-							.isSuperTypeOf(domainElementMetaclass)
-					&& (domainElement == null || isNodeWorkProductNode_1001((WorkProductNode) domainElement))) {
-				return WorkProductNodeEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedWorkProductDependencyDiagram_79ChildNodeID(
-					domainElement, semanticHint);
-		case LinkEditPart.VISUAL_ID:
-			if (LinkNameEditPart.VISUAL_ID == nodeVisualID) {
-				return LinkNameEditPart.VISUAL_ID;
-			}
-			return getUnrecognizedLink_3001LinkLabelID(semanticHint);
-		}
-		return -1;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getLinkWithClassVisualID(EObject domainElement) {
-		if (domainElement == null) {
-			return -1;
-		}
-		EClass domainElementMetaclass = domainElement.eClass();
-		return getLinkWithClassVisualID(domainElement, domainElementMetaclass);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static int getLinkWithClassVisualID(EObject domainElement,
-			EClass domainElementMetaclass) {
-		if (ModelPackage.eINSTANCE.getLink().isSuperTypeOf(
-				domainElementMetaclass)
-				&& (domainElement == null || isLinkWithClassLink_3001((Link) domainElement))) {
-			return LinkEditPart.VISUAL_ID;
-		} else {
-			return getUnrecognizedLinkWithClassID(domainElement);
-		}
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isDiagramWorkProductDependencyDiagram_79(
-			WorkProductDependencyDiagram element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedDiagramID(EObject domainElement) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isNodeWorkProductNode_1001(WorkProductNode element) {
-		return true;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedWorkProductNode_1001ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedWorkProductDependencyDiagram_79ChildNodeID(
-			EObject domainElement, String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedLink_3001LinkLabelID(String semanticHint) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to handle some specific
-	 * situations not covered by default logic.
-	 *
-	 * @generated
-	 */
-	private static int getUnrecognizedLinkWithClassID(EObject domainElement) {
-		return -1;
-	}
-
-	/**
-	 * User can change implementation of this method to check some additional 
-	 * conditions here.
-	 *
-	 * @generated
-	 */
-	private static boolean isLinkWithClassLink_3001(Link element) {
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/Messages.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/Messages.java
deleted file mode 100644
index 5a29515..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/Messages.java
+++ /dev/null
@@ -1,207 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.osgi.util.NLS;
-
-	/**
- * @generated
- */
-public class Messages extends NLS {
-
-		/**
- * @generated
- */
-	static {
-		NLS.initializeMessages("messages", Messages.class); //$NON-NLS-1$
-	}
-
-		/**
- * @generated
- */
-	private Messages() {
-	}
-
-	
-    
-		/**
- * @generated
- */
-    public static String DiagramDiagramEditorUtil_OpenModelResourceErrorDialogTitle;
-
-		/**
- * @generated
- */
-    public static String DiagramDiagramEditorUtil_OpenModelResourceErrorDialogMessage;
-
-		/**
- * @generated
- */
-    public static String DiagramDiagramEditorUtil_CreateDiagramProgressTask;
-
-		/**
- * @generated
- */
-    public static String DiagramDiagramEditorUtil_CreateDiagramCommandLabel;
-		
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_isModifiable;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_handleElementContentChanged;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_IncorrectInputError;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_UnableToLoadResourceError;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_NoDiagramInResourceError;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_DiagramLoadingError;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_UnsynchronizedFileSaveError;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_SaveDiagramTask;
-	
-		/**
- * @generated
- */
-    public static String DiagramDocumentProvider_SaveNextResourceTask;
-	
-		/**
- * @generated
- */
-    public static String DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogTitle;
-
-		/**
- * @generated
- */
-    public static String DiagramInitDiagramFileAction_InitDiagramFileResourceErrorDialogMessage;
-
-		/**
- * @generated
- */
-    public static String DiagramInitDiagramFileAction_InitDiagramFileWizardTitle;
-
-		/**
- * @generated
- */
-    public static String DiagramInitDiagramFileAction_OpenModelFileDialogTitle;
-	
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_CreationPageName;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_CreationPageTitle;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_CreationPageDescription;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_RootSelectionPageName;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_RootSelectionPageTitle;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_RootSelectionPageDescription;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_RootSelectionPageSelectionTitle;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_RootSelectionPageNoSelectionMessage;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_RootSelectionPageInvalidSelectionMessage;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_InitDiagramCommand;
-
-		/**
- * @generated
- */
-    public static String DiagramNewDiagramFileWizard_IncorrectRootError;
-	
-		/**
- * @generated
- */
-    public static String Model1Group_title;
-
-		/**
- * @generated
- */
-    public static String ControlFlow1CreationTool_title;
-
-		/**
- * @generated
- */
-    public static String ControlFlow1CreationTool_desc;
-
-		/**
- * @generated
- */
-    public static String WorkProductDescriptor2CreationTool_title;
-
-		/**
- * @generated
- */
-    public static String WorkProductDescriptor2CreationTool_desc;
-	        
-        
-		/**
- * @generated
- */
-    public static String CommandName_OpenDiagram;
-    
-    //TODO: put accessor fields manually	
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/ModelElementSelectionPage.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/ModelElementSelectionPage.java
deleted file mode 100644
index 577cee5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/ModelElementSelectionPage.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.wizard.WizardPage;
-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.Label;
-
-/**
- * Wizard page that allows to select element from model.
- * 
- * @generated
- */
-public class ModelElementSelectionPage extends WizardPage {
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectedModelElement;
-
-	/**
-	 * @generated
-	 */
-	private TreeViewer modelVewer;
-
-	/**
-	 * @generated
-	 */
-	public ModelElementSelectionPage(String pageName) {
-		super(pageName);
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject getModelElement() {
-		return selectedModelElement;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setModelElement(EObject modelElement) {
-		selectedModelElement = modelElement;
-		if (modelVewer != null) {
-			if (selectedModelElement != null) {
-				modelVewer.setInput(selectedModelElement.eResource());
-				modelVewer.setSelection(new StructuredSelection(
-						selectedModelElement));
-			} else {
-				modelVewer.setInput(null);
-			}
-			setPageComplete(validatePage());
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		Composite plate = new Composite(parent, SWT.NONE);
-		plate.setLayoutData(new GridData(GridData.FILL_BOTH));
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		plate.setLayout(layout);
-		setControl(plate);
-
-		Label label = new Label(plate, SWT.NONE);
-		label.setText(getSelectionTitle());
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-
-		modelVewer = new TreeViewer(plate, SWT.SINGLE | SWT.H_SCROLL
-				| SWT.V_SCROLL | SWT.BORDER);
-		GridData layoutData = new GridData(GridData.FILL_BOTH);
-		layoutData.heightHint = 300;
-		layoutData.widthHint = 300;
-		modelVewer.getTree().setLayoutData(layoutData);
-		modelVewer.setContentProvider(new AdapterFactoryContentProvider(
-				WPDDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory()));
-		modelVewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				WPDDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory()));
-		if (selectedModelElement != null) {
-			modelVewer.setInput(selectedModelElement.eResource());
-			modelVewer.setSelection(new StructuredSelection(
-					selectedModelElement));
-		}
-		modelVewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				ModelElementSelectionPage.this
-						.updateSelection((IStructuredSelection) event
-								.getSelection());
-			}
-		});
-
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Override to provide custom model element description.
-	 * 
-	 * @generated
-	 */
-	protected String getSelectionTitle() {
-		return "Select model element:";
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void updateSelection(IStructuredSelection selection) {
-		selectedModelElement = null;
-		if (selection.size() == 1) {
-			Object selectedElement = selection.getFirstElement();
-			if (selectedElement instanceof IWrapperItemProvider) {
-				selectedElement = ((IWrapperItemProvider) selectedElement)
-						.getValue();
-			}
-			if (selectedElement instanceof FeatureMap.Entry) {
-				selectedElement = ((FeatureMap.Entry) selectedElement)
-						.getValue();
-			}
-			if (selectedElement instanceof EObject) {
-				selectedModelElement = (EObject) selectedElement;
-			}
-		}
-		setPageComplete(validatePage());
-	}
-
-	/**
-	 * Override to provide specific validation of the selected model element.
-	 * 
-	 * @generated
-	 */
-	protected boolean validatePage() {
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDImages.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDImages.java
deleted file mode 100644
index be249a4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDImages.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class WPDDImages {
-	public static final String ELCL16 = "icons/full/elcl16/"; //$NON-NLS-1$
-	public static final String DLCL16 = "icons/full/dlcl16/"; //$NON-NLS-1$
-	public static final String ETOOL16 = "icons/full/etool16/"; //$NON-NLS-1$
-	public static final String DTOOL16 = "icons/full/dtool16/"; //$NON-NLS-1$
-	
-	
-	public static final String IMG_PATH_EDITOR = ETOOL16 + "WPDDEditor.gif"; //$NON-NLS-1$	
-
-	public static final String DISABLED_IMG_PATH_EDITOR = DTOOL16
-			+ "WPDDEditor.gif"; //$NON-NLS-1$	
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_EDITOR = WPDDiagramEditorPlugin
-			.getBundledImageDescriptor(DISABLED_IMG_PATH_EDITOR);
-
-	public static final ImageDescriptor IMG_DESC_EDITOR = WPDDiagramEditorPlugin
-			.getBundledImageDescriptor(IMG_PATH_EDITOR);		
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDiagramEditor.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDiagramEditor.java
deleted file mode 100644
index a2e1673..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDiagramEditor.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.DelegatingLayout;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.epf.diagram.core.DiagramCoreResources;
-import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
-import org.eclipse.epf.diagram.core.util.DiagramConstants;
-import org.eclipse.epf.diagram.wpdd.edit.parts.DiagramEditPartFactory;
-import org.eclipse.epf.diagram.wpdd.providers.DiagramElementTypes;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeConnectionRequest;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Diagram Editor for Work Product Dependency Diagram.
- * @author Shashidhar Kannoori
- * @custom
- */
-public class WPDDiagramEditor extends AbstractDiagramEditor {
-
-	/**
-	 * @modified
-	 */
-	protected void configureGraphicalViewer() {
-		super.configureGraphicalViewer();
-		DiagramRootEditPart root = (DiagramRootEditPart) getDiagramGraphicalViewer()
-				.getRootEditPart();
-		LayeredPane printableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.PRINTABLE_LAYERS);
-		FreeformLayer extLabelsLayer = new FreeformLayer();
-		extLabelsLayer.setLayoutManager(new DelegatingLayout());
-//		printableLayers.addLayerAfter(extLabelsLayer,
-//				DiagramEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
-//				LayerConstants.PRIMARY_LAYER);
-		LayeredPane scalableLayers = (LayeredPane) root
-				.getLayer(LayerConstants.SCALABLE_LAYERS);
-		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
-		scaledFeedbackLayer.setEnabled(false);
-		scalableLayers.addLayerAfter(scaledFeedbackLayer,
-				LayerConstants.SCALED_FEEDBACK_LAYER,
-				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
-	}
-
-	@Override
-	protected PreferencesHint getPreferencesHint() {
-		return new PreferencesHint(WPDDiagramEditorPlugin.ID);
-	}
-	
-	@Override
-	protected void createActions() {
-		super.createActions();
-		List<IElementType> elementTypes = new ArrayList<IElementType>();
-		elementTypes.add(DiagramElementTypes.WorkProductNode_1001);
-		IAction action = createAnAction(
-				DiagramCoreResources.AbstractDiagram_WorkProductDescriptor_text, elementTypes, //$NON-NLS-1$
-				DiagramConstants.CREATE_WORK_PRODUCT_DESCRIPTOR_NODE, 
-				DiagramCoreResources.AbstractDiagram_WorkProductDescriptor_tooltip
-				, WPDDiagramEditorPlugin.getInstance().getImageDescriptor("full/obj16/WorkProductDescriptor.gif")); //$NON-NLS-1$
-		getActionRegistry().registerAction(action);
-	}
-	
-	@Override
-	public void contributeToContextMenu(IMenuManager menu) {
-		super.contributeToContextMenu(menu);
-		IContributionItem item = menu.find(ActionIds.MENU_DIAGRAM_ADD);
-		if(item != null && item instanceof IMenuManager){
-			IMenuManager addMenu = (IMenuManager)item;
-			if(getGraphicalViewer().getSelectedEditParts().size() == 0){
-				addToMenu(addMenu, null, DiagramConstants.DIAGRAM_ADD_MENU_GENERAL_GROUP, 
-						true, true);	
-				addToMenu(addMenu,DiagramConstants.CREATE_WORK_PRODUCT_DESCRIPTOR_NODE, 
-						DiagramConstants.DIAGRAM_ADD_MENU_GENERAL_GROUP, true, true);
-			}
-		}
-	}
-	protected String getPartNamePrefix() {
-		return DiagramCoreResources.WorkProductDependencyDiagram_prefix; 
-	}
-	
-	/**
-	 * @return
-	 */
-	protected Image getPartImage() {
-		return WPDDiagramEditorPlugin.getInstance().getSharedImage(
-				"full/etool16/WPDDEditor.gif"); //$NON-NLS-1$
-	}
-	
-	protected CreateUnspecifiedTypeConnectionRequest getCreateControlFlowRequest(){
-		List<IElementType> list = new ArrayList<IElementType>();
-		list.add(DiagramElementTypes.Link_3001);
-		CreateUnspecifiedTypeConnectionRequest connectionRequest = 
-			new CreateUnspecifiedTypeConnectionRequest(list, false,
-					WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		return connectionRequest;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDiagramEditorPlugin.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDiagramEditorPlugin.java
deleted file mode 100644
index 9391fac..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WPDDiagramEditorPlugin.java
+++ /dev/null
@@ -1,267 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.eclipse.epf.diagram.model.provider.ModelItemProviderAdapterFactory;
-
-import org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory;
-
-/**
- * @modified
- * 
- */
-public class WPDDiagramEditorPlugin extends AbstractPlugin {
-
-	/**
-	 * @generated
-	 */
-	public static final String ID = "org.eclipse.epf.diagram.wpdd"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final PreferencesHint DIAGRAM_PREFERENCES_HINT = new PreferencesHint(
-			ID);
-
-	/**
-	 * @generated
-	 */
-	private static WPDDiagramEditorPlugin instance;
-
-	/**
-	 * @generated
-	 */
-	private ComposedAdapterFactory adapterFactory;
-
-	/**
-	 * @generated
-	 */
-	private DiagramDocumentProvider myDocumentProvider;
-
-	/**
-	 * @generated
-	 */
-	public WPDDiagramEditorPlugin() {
-	}
-
-	/**
-	 * @generated
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		instance = this;
-		PreferencesHint.registerPreferenceStore(DIAGRAM_PREFERENCES_HINT,
-				getPreferenceStore());
-		adapterFactory = createAdapterFactory();
-	}
-
-	/**
-	 * @generated
-	 */
-	public void stop(BundleContext context) throws Exception {
-		adapterFactory.dispose();
-		adapterFactory = null;
-		instance = null;
-		super.stop(context);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static WPDDiagramEditorPlugin getInstance() {
-		return instance;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ComposedAdapterFactory createAdapterFactory() {
-		List factories = new ArrayList();
-		fillItemProviderFactories(factories);
-		return new ComposedAdapterFactory(factories);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void fillItemProviderFactories(List factories) {
-		factories.add(new ModelItemProviderAdapterFactory());
-		factories.add(new ModelItemProviderAdapterFactory());
-		factories.add(new UmaItemProviderAdapterFactory());
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-	}
-
-	/**
-	 * @generated
-	 */
-	public AdapterFactory getItemProvidersAdapterFactory() {
-		return adapterFactory;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ImageDescriptor getItemImageDescriptor(Object item) {
-		IItemLabelProvider labelProvider = (IItemLabelProvider) adapterFactory
-				.adapt(item, IItemLabelProvider.class);
-		if (labelProvider != null) {
-			return ExtendedImageRegistry.getInstance().getImageDescriptor(
-					labelProvider.getImage(item));
-		}
-		return null;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @generated
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getBundledImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin(ID, path);
-	}
-
-	/**
-	 * Respects images residing in any plug-in. If path is relative,
-	 * then this bundle is looked up for the image, otherwise, for absolute 
-	 * path, first segment is taken as id of plug-in with image
-	 *
-	 * @generated
-	 * @param path the path to image, either absolute (with plug-in id as first segment), or relative for bundled images
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor findImageDescriptor(String path) {
-		final IPath p = new Path(path);
-		if (p.isAbsolute() && p.segmentCount() > 1) {
-			return AbstractUIPlugin.imageDescriptorFromPlugin(p.segment(0), p
-					.removeFirstSegments(1).makeAbsolute().toString());
-		} else {
-			return getBundledImageDescriptor(p.makeAbsolute().toString());
-		}
-	}
-
-	/**
-	 * Returns string from plug-in's resource bundle
-	 * @modified
-	 */
-	public String getString(String key) {
-		return Platform.getResourceString(getInstance().getBundle(), "%" + key); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns an image for the image file at the given plug-in relative path.
-	 * Client do not need to dispose this image. Images will be disposed automatically.
-	 *
-	 * @generated
-	 * @param path the path
-	 * @return image instance
-	 */
-	public Image getBundledImage(String path) {
-		Image image = getImageRegistry().get(path);
-		if (image == null) {
-			getImageRegistry().put(path, getBundledImageDescriptor(path));
-			image = getImageRegistry().get(path);
-		}
-		return image;
-	}
-
-	/**
-	 * @generated
-	 */
-	public DiagramDocumentProvider getDocumentProvider() {
-		if (myDocumentProvider == null) {
-			myDocumentProvider = new DiagramDocumentProvider();
-		}
-		return myDocumentProvider;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void logError(String error) {
-		logError(error, null);
-	}
-
-	/**
-	 * @param throwable actual error or null could be passed
-	 * @generated
-	 */
-	public void logError(String error, Throwable throwable) {
-		if (error == null && throwable != null) {
-			error = throwable.getMessage();
-		}
-		getLog().log(
-				new Status(IStatus.ERROR, WPDDiagramEditorPlugin.ID,
-						IStatus.OK, error, throwable));
-		debug(error, throwable);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void logInfo(String message) {
-		logInfo(message, null);
-	}
-
-	/**
-	 * @param throwable actual error or null could be passed
-	 * @generated
-	 */
-	public void logInfo(String message, Throwable throwable) {
-		if (message == null && throwable != null) {
-			message = throwable.getMessage();
-		}
-		getLog().log(
-				new Status(IStatus.INFO, WPDDiagramEditorPlugin.ID, IStatus.OK,
-						message, throwable));
-		debug(message, throwable);
-	}
-
-	/**
-	 * @generated
-	 */
-	private void debug(String message, Throwable throwable) {
-		if (!isDebugging()) {
-			return;
-		}
-		if (message != null) {
-			System.err.println(message);
-		}
-		if (throwable != null) {
-			throwable.printStackTrace();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WorkProductDependencyDiagramEditor.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WorkProductDependencyDiagramEditor.java
deleted file mode 100644
index 1f8c5d9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/part/WorkProductDependencyDiagramEditor.java
+++ /dev/null
@@ -1,224 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.part;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.ui.URIEditorInput;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.epf.ui.editors.IMethodEditor;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorMatchingStrategy;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * @generated
- */
-public class WorkProductDependencyDiagramEditor extends DiagramDocumentEditor
-		implements IGotoMarker, IMethodEditor {
-
-	/**
-	 * @generated
-	 */
-	public static final String ID = "org.eclipse.epf.diagram.wpdd.part.WorkProductDependencyDiagramEditorID"; //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public WorkProductDependencyDiagramEditor() {
-		super(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected PaletteRoot createPaletteRoot(PaletteRoot existingPaletteRoot) {
-		PaletteRoot root = super.createPaletteRoot(existingPaletteRoot);
-		new DiagramPaletteFactory().fillPalette(root);
-		return root;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setDocumentProvider(IEditorInput input) {
-		if (input instanceof IFileEditorInput
-				|| input instanceof URIEditorInput) {
-			setDocumentProvider(WPDDiagramEditorPlugin.getInstance()
-					.getDocumentProvider());
-		} else {
-			super.setDocumentProvider(input);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	public void gotoMarker(IMarker marker) {
-		MarkerNavigationService.getInstance().gotoMarker(this, marker);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isSaveAsAllowed() {
-		return true;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void doSaveAs() {
-		performSaveAs(new NullProgressMonitor());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void performSaveAs(IProgressMonitor progressMonitor) {
-		Shell shell = getSite().getShell();
-		IEditorInput input = getEditorInput();
-		SaveAsDialog dialog = new SaveAsDialog(shell);
-		IFile original = input instanceof IFileEditorInput ? ((IFileEditorInput) input)
-				.getFile()
-				: null;
-		if (original != null) {
-			dialog.setOriginalFile(original);
-		}
-		dialog.create();
-		IDocumentProvider provider = getDocumentProvider();
-		if (provider == null) {
-			// editor has been programmatically closed while the dialog was open
-			return;
-		}
-		if (provider.isDeleted(input) && original != null) {
-			String message = NLS.bind(
-					"The original file ''{0}'' has been deleted.", original
-							.getName());
-			dialog.setErrorMessage(null);
-			dialog.setMessage(message, IMessageProvider.WARNING);
-		}
-		if (dialog.open() == Window.CANCEL) {
-			if (progressMonitor != null) {
-				progressMonitor.setCanceled(true);
-			}
-			return;
-		}
-		IPath filePath = dialog.getResult();
-		if (filePath == null) {
-			if (progressMonitor != null) {
-				progressMonitor.setCanceled(true);
-			}
-			return;
-		}
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IFile file = workspaceRoot.getFile(filePath);
-		final IEditorInput newInput = new FileEditorInput(file);
-		// Check if the editor is already open
-		IEditorMatchingStrategy matchingStrategy = getEditorDescriptor()
-				.getEditorMatchingStrategy();
-		IEditorReference[] editorRefs = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage()
-				.getEditorReferences();
-		for (int i = 0; i < editorRefs.length; i++) {
-			if (matchingStrategy.matches(editorRefs[i], newInput)) {
-				MessageDialog
-						.openWarning(shell, "Problem During Save As...",
-								"Save could not be completed. Target file is already open in another editor.");
-				return;
-			}
-		}
-		boolean success = false;
-		try {
-			provider.aboutToChange(newInput);
-			getDocumentProvider(newInput).saveDocument(progressMonitor,
-					newInput,
-					getDocumentProvider().getDocument(getEditorInput()), true);
-			success = true;
-		} catch (CoreException x) {
-			IStatus status = x.getStatus();
-			if (status == null || status.getSeverity() != IStatus.CANCEL) {
-				ErrorDialog.openError(shell, "Save Problems",
-						"Could not save file.", x.getStatus());
-			}
-		} finally {
-			provider.changed(newInput);
-			if (success) {
-				setInput(newInput);
-			}
-		}
-		if (progressMonitor != null) {
-			progressMonitor.setCanceled(!success);
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected PreferencesHint getPreferencesHint() {
-		return WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getContributorId() {
-		return WPDDiagramEditorPlugin.ID;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IDocumentProvider getDocumentProvider(IEditorInput input) {
-		if (input instanceof IFileEditorInput
-				|| input instanceof URIEditorInput) {
-			return WPDDiagramEditorPlugin.getInstance().getDocumentProvider();
-		}
-		return super.getDocumentProvider(input);
-	}
-
-	/**
-	 * @generated
-	 */
-	public TransactionalEditingDomain getEditingDomain() {
-		IDocument document = getEditorInput() != null ? getDocumentProvider()
-				.getDocument(getEditorInput()) : null;
-		if (document instanceof IDiagramDocument) {
-			return ((IDiagramDocument) document).getEditingDomain();
-		}
-		return super.getEditingDomain();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramAppearancePreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramAppearancePreferencePage.java
deleted file mode 100644
index 49f63bb..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramAppearancePreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.preferences;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.AppearancePreferencePage;
-
-/**
- * @generated
- */
-public class DiagramAppearancePreferencePage extends AppearancePreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramAppearancePreferencePage() {
-		setPreferenceStore(WPDDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramConnectionsPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramConnectionsPreferencePage.java
deleted file mode 100644
index 26179fc..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramConnectionsPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.preferences;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.ConnectionsPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramConnectionsPreferencePage extends ConnectionsPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramConnectionsPreferencePage() {
-		setPreferenceStore(WPDDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramGeneralPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramGeneralPreferencePage.java
deleted file mode 100644
index 141ecf7..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramGeneralPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.preferences;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.DiagramsPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramGeneralPreferencePage extends DiagramsPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramGeneralPreferencePage() {
-		setPreferenceStore(WPDDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramPreferenceInitializer.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramPreferenceInitializer.java
deleted file mode 100644
index 50c3673..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramPreferenceInitializer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * @generated
- */
-public class DiagramPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * @modified
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = getPreferenceStore();
-		DiagramPrintingPreferencePage.initDefaults(store);
-		DiagramGeneralPreferencePage.initDefaults(store);
-		DiagramAppearancePreferencePage.initDefaults(store);
-		DiagramConnectionsPreferencePage.initDefaults(store);
-		DiagramRulersAndGridPreferencePage.initDefaults(store);
-		DiagramCoreUtil.setDefaultFontPreference(getPreferenceStore());
-		DiagramCoreUtil.setDefaultLineStyle(getPreferenceStore());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return WPDDiagramEditorPlugin.getInstance().getPreferenceStore();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramPrintingPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramPrintingPreferencePage.java
deleted file mode 100644
index 49de22d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramPrintingPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.preferences;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.PrintingPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramPrintingPreferencePage extends PrintingPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramPrintingPreferencePage() {
-		setPreferenceStore(WPDDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramRulersAndGridPreferencePage.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramRulersAndGridPreferencePage.java
deleted file mode 100644
index 82814ed..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/preferences/DiagramRulersAndGridPreferencePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.preferences;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.RulerGridPreferencePage;
-
-/**
- * @generated
- */
-public class DiagramRulersAndGridPreferencePage extends RulerGridPreferencePage {
-
-	/**
-	 * @generated
-	 */
-	public DiagramRulersAndGridPreferencePage() {
-		setPreferenceStore(WPDDiagramEditorPlugin.getInstance()
-				.getPreferenceStore());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramAbstractParser.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramAbstractParser.java
deleted file mode 100644
index acd2e1e..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramAbstractParser.java
+++ /dev/null
@@ -1,399 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import java.text.MessageFormat;
-import java.text.ParsePosition;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EEnumLiteral;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;
-import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public abstract class DiagramAbstractParser implements IParser {
-
-	/**
-	 * @generated
-	 */
-	private String viewPattern;
-
-	/**
-	 * @generated
-	 */
-	private MessageFormat viewProcessor;
-
-	/**
-	 * @generated
-	 */
-	private String editPattern;
-
-	/**
-	 * @generated
-	 */
-	private MessageFormat editProcessor;
-
-	/**
-	 * @generated
-	 */
-	public String getViewPattern() {
-		return viewPattern;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getViewProcessor() {
-		return viewProcessor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setViewPattern(String viewPattern) {
-		this.viewPattern = viewPattern;
-		viewProcessor = createViewProcessor(viewPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat createViewProcessor(String viewPattern) {
-		return new MessageFormat(viewPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditPattern() {
-		return editPattern;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getEditProcessor() {
-		return editProcessor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setEditPattern(String editPattern) {
-		this.editPattern = editPattern;
-		editProcessor = createEditProcessor(editPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat createEditProcessor(String editPattern) {
-		return new MessageFormat(editPattern);
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getPrintString(IAdaptable adapter, int flags) {
-		return getStringByPattern(adapter, flags, getViewPattern(),
-				getViewProcessor());
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getEditString(IAdaptable adapter, int flags) {
-		return getStringByPattern(adapter, flags, getEditPattern(),
-				getEditProcessor());
-	}
-
-	/**
-	 * @generated
-	 */
-	protected abstract String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor);
-
-	/**
-	 * @generated
-	 */
-	public IParserEditStatus isValidEditString(IAdaptable element,
-			String editString) {
-		ParsePosition pos = new ParsePosition(0);
-		Object[] values = getEditProcessor().parse(editString, pos);
-		if (values == null) {
-			return new ParserEditStatus(WPDDiagramEditorPlugin.ID,
-					IParserEditStatus.UNEDITABLE, "Invalid input at "
-							+ pos.getErrorIndex());
-		}
-		return validateNewValues(values);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateNewValues(Object[] values) {
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, String newString,
-			int flags) {
-		Object[] values = getEditProcessor().parse(newString,
-				new ParsePosition(0));
-		if (values == null
-				|| validateNewValues(values).getCode() != IParserEditStatus.EDITABLE) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return getParseCommand(adapter, values);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected abstract ICommand getParseCommand(IAdaptable adapter,
-			Object[] values);
-
-	/**
-	 * @generated
-	 */
-	public IContentAssistProcessor getCompletionProcessor(IAdaptable element) {
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected ICommand getModificationCommand(EObject element,
-			EStructuralFeature feature, Object value) {
-		value = getValidNewValue(feature, value);
-		if (value instanceof InvalidValue) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		SetRequest request = new SetRequest(element, feature, value);
-		return new SetValueCommand(request);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getValidValue(EStructuralFeature feature, Object value) {
-		EClassifier type = feature.getEType();
-		if (type instanceof EDataType) {
-			Class iClass = type.getInstanceClass();
-			if (String.class.equals(iClass)) {
-				if (value == null) {
-					value = ""; //$NON-NLS-1$
-				}
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Object getValidNewValue(EStructuralFeature feature, Object value) {
-		EClassifier type = feature.getEType();
-		if (type instanceof EDataType) {
-			Class iClass = type.getInstanceClass();
-			if (Boolean.TYPE.equals(iClass)) {
-				if (value instanceof Boolean) {
-					// ok
-				} else if (value instanceof String) {
-					value = Boolean.valueOf((String) value);
-				} else {
-					value = new InvalidValue(
-							"Value of type Boolean is expected");
-				}
-			} else if (Character.TYPE.equals(iClass)) {
-				if (value instanceof Character) {
-					// ok
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						value = new Character(s.charAt(0));
-					}
-				} else {
-					value = new InvalidValue(
-							"Value of type Character is expected");
-				}
-			} else if (Byte.TYPE.equals(iClass)) {
-				if (value instanceof Byte) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Byte(((Number) value).byteValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Byte.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Byte value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Byte is expected");
-				}
-			} else if (Short.TYPE.equals(iClass)) {
-				if (value instanceof Short) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Short(((Number) value).shortValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Short.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Short value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Short is expected");
-				}
-			} else if (Integer.TYPE.equals(iClass)) {
-				if (value instanceof Integer) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Integer(((Number) value).intValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Integer.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Integer value");
-						}
-					}
-				} else {
-					value = new InvalidValue(
-							"Value of type Integer is expected");
-				}
-			} else if (Long.TYPE.equals(iClass)) {
-				if (value instanceof Long) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Long(((Number) value).longValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Long.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Long value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Long is expected");
-				}
-			} else if (Float.TYPE.equals(iClass)) {
-				if (value instanceof Float) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Float(((Number) value).floatValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Float.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Float value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Float is expected");
-				}
-			} else if (Double.TYPE.equals(iClass)) {
-				if (value instanceof Double) {
-					// ok
-				} else if (value instanceof Number) {
-					value = new Double(((Number) value).doubleValue());
-				} else if (value instanceof String) {
-					String s = (String) value;
-					if (s.length() == 0) {
-						value = null;
-					} else {
-						try {
-							value = Double.valueOf(s);
-						} catch (NumberFormatException nfe) {
-							value = new InvalidValue(
-									"String value does not convert to Double value");
-						}
-					}
-				} else {
-					value = new InvalidValue("Value of type Double is expected");
-				}
-			} else if (type instanceof EEnum) {
-				if (value instanceof String) {
-					EEnumLiteral literal = ((EEnum) type)
-							.getEEnumLiteralByLiteral((String) value);
-					if (literal == null) {
-						value = new InvalidValue("Unknown literal: " + value);
-					} else {
-						value = literal.getInstance();
-					}
-				} else {
-					value = new InvalidValue("Value of type String is expected");
-				}
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected class InvalidValue {
-
-		private String description;
-
-		public InvalidValue(String description) {
-			this.description = description;
-		}
-
-		public String toString() {
-			return description;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramContributionItemProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramContributionItemProvider.java
deleted file mode 100644
index 42d4402..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramContributionItemProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import org.eclipse.gmf.runtime.common.ui.services.action.contributionitem.AbstractContributionItemProvider;
-
-import org.eclipse.gmf.runtime.common.ui.util.IWorkbenchPartDescriptor;
-
-import org.eclipse.gmf.runtime.diagram.ui.printing.actions.PrintPreviewAction;
-
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.EnhancedPrintActionHelper;
-import org.eclipse.gmf.runtime.diagram.ui.printing.render.actions.RenderedPrintPreviewAction;
-
-import org.eclipse.jface.action.IAction;
-
-/**
- * @generated
- */
-public class DiagramContributionItemProvider extends
-		AbstractContributionItemProvider {
-
-	/**
-	 * @generated
-	 */
-	protected IAction createAction(String actionId,
-			IWorkbenchPartDescriptor partDescriptor) {
-		if (actionId.equals(PrintPreviewAction.ID)) {
-			return new RenderedPrintPreviewAction(
-					new EnhancedPrintActionHelper());
-		}
-		return super.createAction(actionId, partDescriptor);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramEditPartProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramEditPartProvider.java
deleted file mode 100644
index 2c02af9..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramEditPartProvider.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import java.lang.ref.WeakReference;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.CreateGraphicEditPartOperation;
-import org.eclipse.gmf.runtime.diagram.ui.services.editpart.IEditPartOperation;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.wpdd.edit.parts.DiagramEditPartFactory;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-
-/**
- * @generated
- */
-public class DiagramEditPartProvider extends AbstractEditPartProvider {
-
-	/**
-	 * @generated
-	 */
-	private EditPartFactory factory;
-
-	/**
-	 * @generated
-	 */
-	private boolean allowCaching;
-
-	/**
-	 * @generated
-	 */
-	private WeakReference cachedPart;
-
-	/**
-	 * @generated
-	 */
-	private WeakReference cachedView;
-
-	/**
-	 * @generated
-	 */
-	public DiagramEditPartProvider() {
-		setFactory(new DiagramEditPartFactory());
-		setAllowCaching(true);
-	}
-
-	/**
-	 * @generated
-	 */
-	public final EditPartFactory getFactory() {
-		return factory;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void setFactory(EditPartFactory factory) {
-		this.factory = factory;
-	}
-
-	/**
-	 * @generated
-	 */
-	public final boolean isAllowCaching() {
-		return allowCaching;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected synchronized void setAllowCaching(boolean allowCaching) {
-		this.allowCaching = allowCaching;
-		if (!allowCaching) {
-			cachedPart = null;
-			cachedView = null;
-		}
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IGraphicalEditPart createEditPart(View view) {
-		EditPart part = factory.createEditPart(null, view);
-		if (part instanceof IGraphicalEditPart) {
-			return (IGraphicalEditPart) part;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IGraphicalEditPart getCachedPart(View view) {
-		if (cachedView != null && cachedView.get() == view) {
-			return (IGraphicalEditPart) cachedPart.get();
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public synchronized IGraphicalEditPart createGraphicEditPart(View view) {
-		if (isAllowCaching()) {
-			IGraphicalEditPart part = getCachedPart(view);
-			cachedPart = null;
-			cachedView = null;
-			if (part != null) {
-				return part;
-			}
-		}
-		return createEditPart(view);
-	}
-
-	/**
-	 * @generated
-	 */
-	public synchronized boolean provides(IOperation operation) {
-		if (operation instanceof CreateGraphicEditPartOperation) {
-			View view = ((IEditPartOperation) operation).getView();
-			if (!WorkProductDependencyDiagramEditPart.MODEL_ID
-					.equals(DiagramVisualIDRegistry.getModelID(view))) {
-				return false;
-			}
-			if (isAllowCaching() && getCachedPart(view) != null) {
-				return true;
-			}
-			IGraphicalEditPart part = createEditPart(view);
-			if (part != null) {
-				if (isAllowCaching()) {
-					cachedPart = new WeakReference(part);
-					cachedView = new WeakReference(view);
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramElementTypes.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramElementTypes.java
deleted file mode 100644
index f9b199d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramElementTypes.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.ENamedElement;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class DiagramElementTypes extends ElementInitializers {
-
-	/**
-	 * @generated
-	 */
-	private DiagramElementTypes() {
-	}
-
-	/**
-	 * @generated
-	 */
-	private static Map elements;
-
-	/**
-	 * @generated
-	 */
-	private static ImageRegistry imageRegistry;
-
-	/**
-	 * @generated
-	 */
-	private static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry();
-		}
-		return imageRegistry;
-	}
-
-	/**
-	 * @generated
-	 */
-	private static String getImageRegistryKey(ENamedElement element) {
-		return element.getName();
-	}
-
-	/**
-	 * @generated
-	 */
-	private static ImageDescriptor getProvidedImageDescriptor(
-			ENamedElement element) {
-		if (element instanceof EStructuralFeature) {
-			EStructuralFeature feature = ((EStructuralFeature) element);
-			EClass eContainingClass = feature.getEContainingClass();
-			EClassifier eType = feature.getEType();
-			if (eContainingClass != null && !eContainingClass.isAbstract()) {
-				element = eContainingClass;
-			} else if (eType instanceof EClass
-					&& !((EClass) eType).isAbstract()) {
-				element = eType;
-			}
-		}
-		if (element instanceof EClass) {
-			EClass eClass = (EClass) element;
-			if (!eClass.isAbstract()) {
-				return WPDDiagramEditorPlugin.getInstance()
-						.getItemImageDescriptor(
-								eClass.getEPackage().getEFactoryInstance()
-										.create(eClass));
-			}
-		}
-		// TODO : support structural features
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ImageDescriptor getImageDescriptor(ENamedElement element) {
-		String key = getImageRegistryKey(element);
-		ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(key);
-		if (imageDescriptor == null) {
-			imageDescriptor = getProvidedImageDescriptor(element);
-			if (imageDescriptor == null) {
-				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-			getImageRegistry().put(key, imageDescriptor);
-		}
-		return imageDescriptor;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static Image getImage(ENamedElement element) {
-		String key = getImageRegistryKey(element);
-		Image image = getImageRegistry().get(key);
-		if (image == null) {
-			ImageDescriptor imageDescriptor = getProvidedImageDescriptor(element);
-			if (imageDescriptor == null) {
-				imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-			}
-			getImageRegistry().put(key, imageDescriptor);
-			image = getImageRegistry().get(key);
-		}
-		return image;
-	}
-
-	/**
-	 * @generated
-	 */
-	public static ImageDescriptor getImageDescriptor(IAdaptable hint) {
-		ENamedElement element = getElement(hint);
-		if (element == null) {
-			return null;
-		}
-		return getImageDescriptor(element);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static Image getImage(IAdaptable hint) {
-		ENamedElement element = getElement(hint);
-		if (element == null) {
-			return null;
-		}
-		return getImage(element);
-	}
-
-	/**
-	 * Returns 'type' of the ecore object associated with the hint.
-	 * 
-	 * @generated
-	 */
-	public static ENamedElement getElement(IAdaptable hint) {
-		Object type = hint.getAdapter(IElementType.class);
-		if (elements == null) {
-			elements = new IdentityHashMap();
-
-			elements.put(WorkProductDependencyDiagram_79,
-					ModelPackage.eINSTANCE.getWorkProductDependencyDiagram());
-
-			elements.put(WorkProductNode_1001, ModelPackage.eINSTANCE
-					.getWorkProductNode());
-
-			elements.put(Link_3001, ModelPackage.eINSTANCE.getLink());
-		}
-		return (ENamedElement) elements.get(type);
-	}
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType WorkProductDependencyDiagram_79 = getElementType("org.eclipse.epf.diagram.wpdd.WorkProductDependencyDiagram_79"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType WorkProductNode_1001 = getElementType("org.eclipse.epf.diagram.wpdd.WorkProductNode_1001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	public static final IElementType Link_3001 = getElementType("org.eclipse.epf.diagram.wpdd.Link_3001"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	private static IElementType getElementType(String id) {
-		return ElementTypeRegistry.getInstance().getType(id);
-	}
-
-	/**
-	 * @generated
-	 */
-	private static Set KNOWN_ELEMENT_TYPES;
-
-	/**
-	 * @generated
-	 */
-	public static boolean isKnownElementType(IElementType elementType) {
-		if (KNOWN_ELEMENT_TYPES == null) {
-			KNOWN_ELEMENT_TYPES = new HashSet();
-			KNOWN_ELEMENT_TYPES.add(WorkProductDependencyDiagram_79);
-			KNOWN_ELEMENT_TYPES.add(WorkProductNode_1001);
-			KNOWN_ELEMENT_TYPES.add(Link_3001);
-		}
-		return KNOWN_ELEMENT_TYPES.contains(elementType);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramIconProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramIconProvider.java
deleted file mode 100644
index 94cf40d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramIconProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.icon.GetIconOperation;
-import org.eclipse.gmf.runtime.common.ui.services.icon.IIconProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class DiagramIconProvider extends AbstractProvider implements
-		IIconProvider {
-
-	/**
-	 * @generated
-	 */
-	public Image getIcon(IAdaptable hint, int flags) {
-		return DiagramElementTypes.getImage(hint);
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetIconOperation) {
-			return ((GetIconOperation) operation).execute(this) != null;
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramModelingAssistantProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramModelingAssistantProvider.java
deleted file mode 100644
index f5e4771..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramModelingAssistantProvider.java
+++ /dev/null
@@ -1,168 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.gmf.runtime.emf.ui.services.modelingassistant.ModelingAssistantProvider;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class DiagramModelingAssistantProvider extends ModelingAssistantProvider {
-
-	/**
-	 * @generated
-	 */
-	public List getTypesForPopupBar(IAdaptable host) {
-		IGraphicalEditPart editPart = (IGraphicalEditPart) host
-				.getAdapter(IGraphicalEditPart.class);
-		if (editPart instanceof WorkProductDependencyDiagramEditPart) {
-			List types = new ArrayList();
-			types.add(DiagramElementTypes.WorkProductNode_1001);
-			return types;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnSource(IAdaptable source) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnTarget(IAdaptable target) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getRelTypesOnSourceAndTarget(IAdaptable source,
-			IAdaptable target) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getTypesForSource(IAdaptable target,
-			IElementType relationshipType) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public List getTypesForTarget(IAdaptable source,
-			IElementType relationshipType) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject selectExistingElementForSource(IAdaptable target,
-			IElementType relationshipType) {
-		return selectExistingElement(target, getTypesForSource(target,
-				relationshipType));
-	}
-
-	/**
-	 * @generated
-	 */
-	public EObject selectExistingElementForTarget(IAdaptable source,
-			IElementType relationshipType) {
-		return selectExistingElement(source, getTypesForTarget(source,
-				relationshipType));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectExistingElement(IAdaptable host, Collection types) {
-		if (types.isEmpty()) {
-			return null;
-		}
-		IGraphicalEditPart editPart = (IGraphicalEditPart) host
-				.getAdapter(IGraphicalEditPart.class);
-		if (editPart == null) {
-			return null;
-		}
-		Diagram diagram = (Diagram) editPart.getRoot().getContents().getModel();
-		Collection elements = new HashSet();
-		for (Iterator it = diagram.getElement().eAllContents(); it.hasNext();) {
-			EObject element = (EObject) it.next();
-			if (isApplicableElement(element, types)) {
-				elements.add(element);
-			}
-		}
-		if (elements.isEmpty()) {
-			return null;
-		}
-		return selectElement((EObject[]) elements.toArray(new EObject[elements
-				.size()]));
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isApplicableElement(EObject element, Collection types) {
-		IElementType type = ElementTypeRegistry.getInstance().getElementType(
-				element);
-		return types.contains(type);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject selectElement(EObject[] elements) {
-		Shell shell = Display.getCurrent().getActiveShell();
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				WPDDiagramEditorPlugin.getInstance()
-						.getItemProvidersAdapterFactory());
-		ElementListSelectionDialog dialog = new ElementListSelectionDialog(
-				shell, labelProvider);
-		dialog.setMessage("Available domain model elements:");
-		dialog.setTitle("Select domain model element");
-		dialog.setMultipleSelection(false);
-		dialog.setElements(elements);
-		EObject selected = null;
-		if (dialog.open() == Window.OK) {
-			selected = (EObject) dialog.getFirstResult();
-		}
-		return selected;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramPaletteProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramPaletteProvider.java
deleted file mode 100644
index 0dc44a5..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramPaletteProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import java.util.Map;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.diagram.ui.services.palette.IPaletteProvider;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.epf.diagram.wpdd.part.DiagramPaletteFactory;
-
-/**
- * @generated
- */
-public class DiagramPaletteProvider extends AbstractProvider implements
-		IPaletteProvider {
-
-	/**
-	 * @generated
-	 */
-	public void contributeToPalette(IEditorPart editor, Object content,
-			PaletteRoot root, Map predefinedEntries) {
-		DiagramPaletteFactory factory = new DiagramPaletteFactory();
-		factory.fillPalette(root);
-	}
-
-	/**
-	 * @generated
-	 */
-	public void setContributions(IConfigurationElement configElement) {
-		// no configuration
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		return false; // all logic is done in the service
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramParserProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramParserProvider.java
deleted file mode 100644
index 31432c4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramParserProvider.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.parser.GetParserOperation;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.model.ModelPackage;
-
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeNameEditPart;
-
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-
-/**
- * @generated
- */
-public class DiagramParserProvider extends AbstractProvider implements
-		IParserProvider {
-
-	/**
-	 * @generated
-	 */
-	private IParser workProductNodeWorkProductNodeName_4001Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getWorkProductNodeWorkProductNodeName_4001Parser() {
-		if (workProductNodeWorkProductNodeName_4001Parser == null) {
-			workProductNodeWorkProductNodeName_4001Parser = createWorkProductNodeWorkProductNodeName_4001Parser();
-		}
-		return workProductNodeWorkProductNodeName_4001Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createWorkProductNodeWorkProductNodeName_4001Parser() {
-		DiagramStructuralFeatureParser parser = new DiagramStructuralFeatureParser(
-				ModelPackage.eINSTANCE.getNamedNode_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	private IParser linkLinkName_4002Parser;
-
-	/**
-	 * @generated
-	 */
-	private IParser getLinkLinkName_4002Parser() {
-		if (linkLinkName_4002Parser == null) {
-			linkLinkName_4002Parser = createLinkLinkName_4002Parser();
-		}
-		return linkLinkName_4002Parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser createLinkLinkName_4002Parser() {
-		DiagramStructuralFeatureParser parser = new DiagramStructuralFeatureParser(
-				ModelPackage.eINSTANCE.getLink_Name());
-		parser.setViewPattern("{0}");
-		parser.setEditPattern("{0}");
-		return parser;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParser getParser(int visualID) {
-		switch (visualID) {
-		case WorkProductNodeNameEditPart.VISUAL_ID:
-			return getWorkProductNodeWorkProductNodeName_4001Parser();
-		case LinkNameEditPart.VISUAL_ID:
-			return getLinkLinkName_4002Parser();
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public IParser getParser(IAdaptable hint) {
-		String vid = (String) hint.getAdapter(String.class);
-		if (vid != null) {
-			return getParser(DiagramVisualIDRegistry.getVisualID(vid));
-		}
-		View view = (View) hint.getAdapter(View.class);
-		if (view != null) {
-			return getParser(DiagramVisualIDRegistry.getVisualID(view));
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetParserOperation) {
-			IAdaptable hint = ((GetParserOperation) operation).getHint();
-			if (DiagramElementTypes.getElement(hint) == null) {
-				return false;
-			}
-			return getParser(hint) != null;
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramPropertyProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramPropertyProvider.java
deleted file mode 100644
index b11dc4d..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramPropertyProvider.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.common.core.service.IOperation;
-import org.eclipse.gmf.runtime.common.ui.services.properties.GetPropertySourceOperation;
-import org.eclipse.gmf.runtime.common.ui.services.properties.ICompositePropertySource;
-import org.eclipse.gmf.runtime.common.ui.services.properties.IPropertiesProvider;
-import org.eclipse.gmf.runtime.emf.ui.properties.providers.GenericEMFPropertiesProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-
-/**
- * @generated
- */
-public class DiagramPropertyProvider extends GenericEMFPropertiesProvider
-		implements IPropertiesProvider {
-
-	/**
-	 * @generated
-	 */
-	public boolean provides(IOperation operation) {
-		if (operation instanceof GetPropertySourceOperation) {
-			Object object = ((GetPropertySourceOperation) operation)
-					.getObject();
-			return getSemanticElement(object) != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICompositePropertySource getPropertySource(Object object) {
-		EObject element = getSemanticElement(object);
-		if (element != null) {
-			return super.getPropertySource(element);
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getSemanticElement(Object object) {
-		View view = null;
-		if (object instanceof View) {
-			view = (View) object;
-		} else if (object instanceof EditPart) {
-			EditPart editPart = (EditPart) object;
-			if (editPart.getModel() instanceof View) {
-				view = (View) editPart.getModel();
-			}
-		}
-		if (view != null
-				&& WorkProductDependencyDiagramEditPart.MODEL_ID
-						.equals(DiagramVisualIDRegistry.getModelID(view))) {
-			return view.getElement();
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramStructuralFeatureParser.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramStructuralFeatureParser.java
deleted file mode 100644
index 0d326d4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramStructuralFeatureParser.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import java.text.FieldPosition;
-import java.text.MessageFormat;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class DiagramStructuralFeatureParser extends DiagramAbstractParser {
-
-	/**
-	 * @generated
-	 */
-	public static final MessageFormat DEFAULT_PROCESSOR = new MessageFormat(
-			"{0}"); //$NON-NLS-1$
-
-	/**
-	 * @generated
-	 */
-	private EStructuralFeature feature;
-
-	/**
-	 * @generated
-	 */
-	public DiagramStructuralFeatureParser(EStructuralFeature feature) {
-		this.feature = feature;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getViewProcessor() {
-		MessageFormat processor = super.getViewProcessor();
-		return processor == null ? DEFAULT_PROCESSOR : processor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MessageFormat getEditProcessor() {
-		MessageFormat processor = super.getEditProcessor();
-		return processor == null ? DEFAULT_PROCESSOR : processor;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected EObject getDomainElement(EObject element) {
-		return element;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		element = getDomainElement(element);
-		return getStringByPattern(element, feature, processor);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(EObject element,
-			EStructuralFeature feature, MessageFormat processor) {
-		Object value = element == null ? null : element.eGet(feature);
-		value = getValidValue(feature, value);
-		return processor.format(new Object[] { value }, new StringBuffer(),
-				new FieldPosition(0)).toString();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateValues(Object[] values) {
-		if (values.length > 1) {
-			return ParserEditStatus.UNEDITABLE_STATUS;
-		}
-		Object value = values.length == 1 ? values[0] : null;
-		value = getValidNewValue(feature, value);
-		if (value instanceof InvalidValue) {
-			return new ParserEditStatus(WPDDiagramEditorPlugin.ID,
-					IParserEditStatus.UNEDITABLE, value.toString());
-		}
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, Object[] values) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		element = getDomainElement(element);
-		if (element == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		TransactionalEditingDomain editingDomain = TransactionUtil
-				.getEditingDomain(element);
-		if (editingDomain == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		Object value = values.length == 1 ? values[0] : null;
-		ICommand command = getModificationCommand(element, feature, value);
-		return new CompositeTransactionalCommand(editingDomain, command
-				.getLabel(), Collections.singletonList(command));
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isAffectingEvent(Object event, int flags) {
-		if (event instanceof Notification) {
-			return isAffectingFeature(((Notification) event).getFeature());
-		}
-		return false;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected boolean isAffectingFeature(Object eventFeature) {
-		return feature == eventFeature;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramStructuralFeaturesParser.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramStructuralFeaturesParser.java
deleted file mode 100644
index 7777f8b..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramStructuralFeaturesParser.java
+++ /dev/null
@@ -1,119 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import java.text.FieldPosition;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
-import org.eclipse.gmf.runtime.common.core.command.ICommand;
-import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
-import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
-import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class DiagramStructuralFeaturesParser extends DiagramAbstractParser {
-
-	/**
-	 * @generated
-	 */
-	private List features;
-
-	/**
-	 * @generated
-	 */
-	public DiagramStructuralFeaturesParser(List features) {
-		this.features = features;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected String getStringByPattern(IAdaptable adapter, int flags,
-			String pattern, MessageFormat processor) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		List values = new ArrayList(features.size());
-		for (Iterator it = features.iterator(); it.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) it.next();
-			Object value = element.eGet(feature);
-			value = getValidValue(feature, value);
-			values.add(value);
-		}
-		return processor.format(values.toArray(new Object[values.size()]),
-				new StringBuffer(), new FieldPosition(0)).toString();
-	}
-
-	/**
-	 * @generated
-	 */
-	protected IParserEditStatus validateValues(Object[] values) {
-		if (values.length != features.size()) {
-			return ParserEditStatus.UNEDITABLE_STATUS;
-		}
-		for (int i = 0; i < values.length; i++) {
-			Object value = getValidNewValue((EStructuralFeature) features
-					.get(i), values[i]);
-			if (value instanceof InvalidValue) {
-				return new ParserEditStatus(WPDDiagramEditorPlugin.ID,
-						IParserEditStatus.UNEDITABLE, value.toString());
-			}
-		}
-		return ParserEditStatus.EDITABLE_STATUS;
-	}
-
-	/**
-	 * @generated
-	 */
-	public ICommand getParseCommand(IAdaptable adapter, Object[] values) {
-		EObject element = (EObject) adapter.getAdapter(EObject.class);
-		if (element == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		TransactionalEditingDomain editingDomain = TransactionUtil
-				.getEditingDomain(element);
-		if (editingDomain == null) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		CompositeTransactionalCommand command = new CompositeTransactionalCommand(
-				editingDomain, "Set Values"); //$NON-NLS-1$
-		for (int i = 0; i < values.length; i++) {
-			EStructuralFeature feature = (EStructuralFeature) features.get(i);
-			command
-					.compose(getModificationCommand(element, feature, values[i]));
-		}
-		return command;
-	}
-
-	/**
-	 * @generated
-	 */
-	public boolean isAffectingEvent(Object event, int flags) {
-		if (event instanceof Notification) {
-			Object feature = ((Notification) event).getFeature();
-			if (features.contains(feature)) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramViewProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramViewProvider.java
deleted file mode 100644
index 8b13ddd..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/DiagramViewProvider.java
+++ /dev/null
@@ -1,123 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gmf.runtime.diagram.core.providers.AbstractViewProvider;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.emf.type.core.IElementType;
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeNameEditPart;
-
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-
-import org.eclipse.epf.diagram.wpdd.view.factories.LinkNameViewFactory;
-import org.eclipse.epf.diagram.wpdd.view.factories.LinkViewFactory;
-import org.eclipse.epf.diagram.wpdd.view.factories.WorkProductDependencyDiagramViewFactory;
-import org.eclipse.epf.diagram.wpdd.view.factories.WorkProductNodeNameViewFactory;
-import org.eclipse.epf.diagram.wpdd.view.factories.WorkProductNodeViewFactory;
-
-/**
- * @generated
- */
-public class DiagramViewProvider extends AbstractViewProvider {
-
-	/**
-	 * @generated
-	 */
-	protected Class getDiagramViewClass(IAdaptable semanticAdapter,
-			String diagramKind) {
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		if (WorkProductDependencyDiagramEditPart.MODEL_ID.equals(diagramKind)
-				&& DiagramVisualIDRegistry.getDiagramVisualID(semanticElement) != -1) {
-			return WorkProductDependencyDiagramViewFactory.class;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Class getNodeViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		if (containerView == null) {
-			return null;
-		}
-		IElementType elementType = getSemanticElementType(semanticAdapter);
-		if (elementType != null
-				&& !DiagramElementTypes.isKnownElementType(elementType)) {
-			return null;
-		}
-		EClass semanticType = getSemanticEClass(semanticAdapter);
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		int nodeVID = DiagramVisualIDRegistry.getNodeVisualID(containerView,
-				semanticElement, semanticType, semanticHint);
-		switch (nodeVID) {
-		case WorkProductNodeEditPart.VISUAL_ID:
-			return WorkProductNodeViewFactory.class;
-		case WorkProductNodeNameEditPart.VISUAL_ID:
-			return WorkProductNodeNameViewFactory.class;
-		case LinkNameEditPart.VISUAL_ID:
-			return LinkNameViewFactory.class;
-		}
-		return null;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected Class getEdgeViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		IElementType elementType = getSemanticElementType(semanticAdapter);
-		if (elementType != null
-				&& !DiagramElementTypes.isKnownElementType(elementType)) {
-			return null;
-		}
-		EClass semanticType = getSemanticEClass(semanticAdapter);
-		if (semanticType == null) {
-			return null;
-		}
-		EObject semanticElement = getSemanticElement(semanticAdapter);
-		int linkVID = DiagramVisualIDRegistry.getLinkWithClassVisualID(
-				semanticElement, semanticType);
-		switch (linkVID) {
-		case LinkEditPart.VISUAL_ID:
-			return LinkViewFactory.class;
-		}
-		return getUnrecognizedConnectorViewClass(semanticAdapter,
-				containerView, semanticHint);
-	}
-
-	/**
-	 * @generated
-	 */
-	private IElementType getSemanticElementType(IAdaptable semanticAdapter) {
-		if (semanticAdapter == null) {
-			return null;
-		}
-		return (IElementType) semanticAdapter.getAdapter(IElementType.class);
-	}
-
-	/**
-	 * @generated
-	 */
-	private Class getUnrecognizedConnectorViewClass(IAdaptable semanticAdapter,
-			View containerView, String semanticHint) {
-		// Handle unrecognized child node classes here
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/ElementInitializers.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/ElementInitializers.java
deleted file mode 100644
index 021df60..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/providers/ElementInitializers.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.providers;
-
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-
-/**
- * @generated
- */
-public class ElementInitializers {
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/sheet/DiagramSheetLabelProvider.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/sheet/DiagramSheetLabelProvider.java
deleted file mode 100644
index 9a9e408..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/sheet/DiagramSheetLabelProvider.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.sheet;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @generated
- */
-public class DiagramSheetLabelProvider extends DecoratingLabelProvider {
-
-	/**
-	 * @generated
-	 */
-	public DiagramSheetLabelProvider() {
-		super(new AdapterFactoryLabelProvider(WPDDiagramEditorPlugin
-				.getInstance().getItemProvidersAdapterFactory()), null);
-	}
-
-	/**
-	 * @generated
-	 */
-	public String getText(Object element) {
-		Object selected = unwrap(element);
-		return super.getText(selected);
-	}
-
-	/**
-	 * @generated
-	 */
-	public Image getImage(Object element) {
-		return super.getImage(unwrap(element));
-	}
-
-	/**
-	 * @generated
-	 */
-	private Object unwrap(Object element) {
-		if (element instanceof IStructuredSelection) {
-			return unwrap(((IStructuredSelection) element).getFirstElement());
-		}
-		if (element instanceof EditPart) {
-			return unwrapEditPart((EditPart) element);
-		}
-		if (element instanceof IAdaptable) {
-			View view = (View) ((IAdaptable) element).getAdapter(View.class);
-			if (view != null) {
-				return unwrapView(view);
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * @generated
-	 */
-	private Object unwrapEditPart(EditPart p) {
-		if (p.getModel() instanceof View) {
-			return unwrapView((View) p.getModel());
-		}
-		return p.getModel();
-	}
-
-	/**
-	 * @generated
-	 */
-	private Object unwrapView(View view) {
-		return view.getElement() == null ? view : view.getElement();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/LinkNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/LinkNameViewFactory.java
deleted file mode 100644
index ef8d6fa..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/LinkNameViewFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractLabelViewFactory;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.diagram.ui.util.MeasurementUnitHelper;
-
-import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode;
-
-import org.eclipse.gmf.runtime.notation.Location;
-
-/**
- * @generated
- */
-public class LinkNameViewFactory extends AbstractLabelViewFactory {
-
-	/**
-	 * @generated
-	 */
-	public View createView(IAdaptable semanticAdapter, View containerView,
-			String semanticHint, int index, boolean persisted,
-			PreferencesHint preferencesHint) {
-		Node view = (Node) super.createView(semanticAdapter, containerView,
-				semanticHint, index, persisted, preferencesHint);
-		Location location = (Location) view.getLayoutConstraint();
-		IMapMode mapMode = MeasurementUnitHelper.getMapMode(containerView
-				.getDiagram().getMeasurementUnit());
-		location.setX(mapMode.DPtoLP(0));
-		location.setY(mapMode.DPtoLP(40));
-		return view;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/LinkViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/LinkViewFactory.java
deleted file mode 100644
index 1981abe..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/LinkViewFactory.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.view.factories;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcoreFactory;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.workspace.AbstractEMFOperation;
-
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.LinkNameEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.common.core.util.Log;
-import org.eclipse.gmf.runtime.common.core.util.StringStatics;
-import org.eclipse.gmf.runtime.common.core.util.Trace;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions;
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin;
-import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIStatusCodes;
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.ConnectionViewFactory;
-
-import org.eclipse.gmf.runtime.notation.Bendpoints;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class LinkViewFactory extends ConnectionViewFactory {
-
-	private static final Map options = new HashMap();
-	static {
-		options.put(Transaction.OPTION_UNPROTECTED, Boolean.TRUE);
-		options.put(Transaction.OPTION_NO_NOTIFICATIONS, Boolean.TRUE);
-		options.put(Transaction.OPTION_NO_TRIGGERS, Boolean.TRUE);
-	}
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createRoutingStyle());
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(LinkEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!WorkProductDependencyDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", WorkProductDependencyDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(semanticAdapter, view,
-				DiagramVisualIDRegistry.getType(LinkNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-	@Override
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.gmf.runtime.diagram.core.view.factories.ViewFactory#createView(org.eclipse.core.runtime.IAdaptable, org.eclipse.gmf.runtime.notation.View, java.lang.String, int, boolean, java.lang.String)
-	 * 
-	 * Override createView since there is a bug in 
-	 * org.eclipse.gmf.runtime.diagram.ui.view.factories.ConnectionViewFactory.java
-	 */
-	public View createView(final IAdaptable semanticAdapter,
-			final View containerView, final String semanticHint,
-			final int index, final boolean persisted,
-			final PreferencesHint preferencesHint) {
-
-		setPreferencesHint(preferencesHint);
-
-		final Edge edge = NotationFactory.eINSTANCE.createEdge();
-		List styles = createStyles(edge);
-		if (styles.size() > 0) {
-			edge.getStyles().addAll(styles);
-		}
-
-		Bendpoints bendPoints = createBendpoints();
-		if (bendPoints != null) {
-			edge.setBendpoints(bendPoints);
-		}
-
-		EObject semanticEl = semanticAdapter == null ? null
-				: (EObject) semanticAdapter.getAdapter(EObject.class);
-		if (semanticEl == null)
-			// enforce a set to NULL
-			edge.setElement(null);
-		else if (requiresElement(semanticAdapter, containerView)) {
-			edge.setElement(semanticEl);
-		}
-
-		edge.setType(semanticHint);
-
-		// decorate view assumes the view had been inserted already, so 
-		// we had to call insert child before calling decorate view
-		ViewUtil.insertChildView(containerView, edge, index, persisted);
-
-		TransactionalEditingDomain domain = getEditingDomain(semanticEl,
-				containerView);
-
-		if (domain != null) {
-			if (isUnProtectedSilentTransactionInProgress(domain)) {
-				// decorate view had to run as a silent operation other wise
-				// it will generate too many events
-				decorateView(containerView, edge, semanticAdapter,
-						semanticHint, index, true);
-
-			} else {
-				AbstractEMFOperation operation = new AbstractEMFOperation(
-						domain, StringStatics.BLANK, options) {
-
-					protected IStatus doExecute(IProgressMonitor monitor,
-							IAdaptable info) throws ExecutionException {
-						decorateView(containerView, edge, semanticAdapter,
-								semanticHint, index, true);
-
-						return Status.OK_STATUS;
-					}
-				};
-				try {
-					operation.execute(new NullProgressMonitor(), null);
-				} catch (ExecutionException e) {
-					Trace.catching(DiagramUIPlugin.getInstance(),
-							DiagramUIDebugOptions.EXCEPTIONS_CATCHING,
-							getClass(), "createView", e); //$NON-NLS-1$
-					Log.warning(DiagramUIPlugin.getInstance(),
-							DiagramUIStatusCodes.IGNORED_EXCEPTION_WARNING,
-							"createView", e); //$NON-NLS-1$
-				}
-			}
-		}
-
-		return edge;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductDependencyDiagramViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductDependencyDiagramViewFactory.java
deleted file mode 100644
index 3e258a4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductDependencyDiagramViewFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.DiagramViewFactory;
-
-import org.eclipse.gmf.runtime.notation.MeasurementUnit;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductDependencyDiagramViewFactory extends DiagramViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createPageStyle());
-		styles.add(NotationFactory.eINSTANCE.createGuideStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View view, IAdaptable semanticAdapter,
-			String diagramKind) {
-		super.decorateView(view, semanticAdapter, diagramKind);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected MeasurementUnit getMeasurementUnit() {
-		return MeasurementUnit.PIXEL_LITERAL;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductNodeNameViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductNodeNameViewFactory.java
deleted file mode 100644
index cdb9fe4..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductNodeNameViewFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.view.factories;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.gmf.runtime.notation.View;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.BasicNodeViewFactory;
-
-/**
- * @generated
- */
-public class WorkProductNodeNameViewFactory extends BasicNodeViewFactory {
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-	}
-
-	/**
-	 * @generated
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		return styles;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductNodeViewFactory.java b/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductNodeViewFactory.java
deleted file mode 100644
index 8c57940..0000000
--- a/1.5/plugins/org.eclipse.epf.diagram.wpdd/src/org/eclipse/epf/diagram/wpdd/view/factories/WorkProductNodeViewFactory.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.diagram.wpdd.view.factories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.emf.ecore.EAnnotation;
-import org.eclipse.emf.ecore.EcoreFactory;
-
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductDependencyDiagramEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeNameEditPart;
-
-import org.eclipse.epf.diagram.wpdd.part.DiagramVisualIDRegistry;
-
-import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
-
-import org.eclipse.gmf.runtime.diagram.ui.view.factories.AbstractShapeViewFactory;
-
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.View;
-
-/**
- * @generated
- */
-public class WorkProductNodeViewFactory extends AbstractShapeViewFactory {
-
-	/**
-	 * @generated 
-	 */
-	protected List createStyles(View view) {
-		List styles = new ArrayList();
-		styles.add(NotationFactory.eINSTANCE.createFontStyle());
-		styles.add(NotationFactory.eINSTANCE.createDescriptionStyle());
-		styles.add(NotationFactory.eINSTANCE.createFillStyle());
-		styles.add(NotationFactory.eINSTANCE.createLineStyle());
-		return styles;
-	}
-
-	/**
-	 * @generated
-	 */
-	protected void decorateView(View containerView, View view,
-			IAdaptable semanticAdapter, String semanticHint, int index,
-			boolean persisted) {
-		if (semanticHint == null) {
-			semanticHint = DiagramVisualIDRegistry
-					.getType(WorkProductNodeEditPart.VISUAL_ID);
-			view.setType(semanticHint);
-		}
-		super.decorateView(containerView, view, semanticAdapter, semanticHint,
-				index, persisted);
-		if (!WorkProductDependencyDiagramEditPart.MODEL_ID
-				.equals(DiagramVisualIDRegistry.getModelID(containerView))) {
-			EAnnotation shortcutAnnotation = EcoreFactory.eINSTANCE
-					.createEAnnotation();
-			shortcutAnnotation.setSource("Shortcut"); //$NON-NLS-1$
-			shortcutAnnotation.getDetails().put(
-					"modelID", WorkProductDependencyDiagramEditPart.MODEL_ID); //$NON-NLS-1$
-			view.getEAnnotations().add(shortcutAnnotation);
-		}
-		getViewService().createNode(
-				semanticAdapter,
-				view,
-				DiagramVisualIDRegistry
-						.getType(WorkProductNodeNameEditPart.VISUAL_ID),
-				ViewUtil.APPEND, true, getPreferencesHint());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.doc/.project b/1.5/plugins/org.eclipse.epf.doc/.project
deleted file mode 100644
index 199c3ef..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.doc</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.doc/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.doc/META-INF/MANIFEST.MF
deleted file mode 100644
index 014d93f..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %featurePluginName
-Bundle-SymbolicName: org.eclipse.epf.doc; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.doc/about.html b/1.5/plugins/org.eclipse.epf.doc/about.html
deleted file mode 100644
index 4c99086..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</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.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.doc/about.ini b/1.5/plugins/org.eclipse.epf.doc/about.ini
deleted file mode 100644
index 604f4fa..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/about.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-#-------------------------------------------------------------------------------
-
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%featureText
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=application_32.gif
-
-# Property "appName" contains name of the application (translated)
-appName=%featureName
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-welcomePage=$nl$/welcome.xml
diff --git a/1.5/plugins/org.eclipse.epf.doc/about.mappings b/1.5/plugins/org.eclipse.epf.doc/about.mappings
deleted file mode 100644
index 092b662..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/about.mappings
+++ /dev/null
@@ -1,8 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-# Usually generated at build time.
-
-0=@build-ID@
-1=1.2.0
diff --git a/1.5/plugins/org.eclipse.epf.doc/about.properties b/1.5/plugins/org.eclipse.epf.doc/about.properties
deleted file mode 100644
index 2f7ce49..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/about.properties
+++ /dev/null
@@ -1,39 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Documentation
-
-featureText=EPF Documentation\n\
-\n\
-Version: {1} \n\
-Build Label: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n\
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/application_32.gif b/1.5/plugins/org.eclipse.epf.doc/application_32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/application_32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.doc/build.properties b/1.5/plugins/org.eclipse.epf.doc/build.properties
deleted file mode 100644
index f2129f9..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-bin.includes = .,\
-               META-INF/,\
-               about.html,\
-               about.properties,\
-               about.ini,\
-               plugin.properties,\
-               about.mappings,\
-               nl/
-
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/da/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/da/about.properties
deleted file mode 100644
index 3939415..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/da/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF - dokumentation
-
-featureText=EPF-dokumentation\n\
-\n\
-Version: {1} \n\
-Byggeetiket: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007. All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/de/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/de/about.properties
deleted file mode 100644
index 701c4c3..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/de/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF - Dokumentation
-
-featureText=EPF - Dokumentation\n\
-\n\
-Version: {1} \n\
-Build-Kennung: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/es/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/es/about.properties
deleted file mode 100644
index de4ea18..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/es/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=Documentaci\u00f3n de EPF
-
-featureText=Documentaci\u00f3n de EPF\n\
-\n\
-Versi\u00f3n: {1} \n\
-Etiqueta de build: {0}\n\
-\n\
-(c) Copyright Colaboradores de Eclipse y otros 2000, 2007.  Reservados todos los derechos.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/fr/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/fr/about.properties
deleted file mode 100644
index a4ac6f0..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/fr/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=Documentation EPF
-
-featureText=Documentation EFF\n\
-\n\
-Version: {1} \n\
-Libell\u00e9 de version : {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/it/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/it/about.properties
deleted file mode 100644
index 8ddacfe..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/it/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=Documentazione EPF
-
-featureText=Documentazione EPF\n\
-\n\
-Versione: {1} \n\
-Etichetta build: {0}\n\
-\n\
-(c) Copyright contributor Eclipse e altri 2000, 2007.  Tutti i diritti riservati.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/ja/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/ja/about.properties
deleted file mode 100644
index 42b3bfc..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/ja/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Documentation
-
-featureText=EPF \u8cc7\u6599\n\
-\n\
-\u30d0\u30fc\u30b8\u30e7\u30f3: {1} \n\
-\u30d3\u30eb\u30c9\u30fb\u30e9\u30d9\u30eb: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/ko/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/ko/about.properties
deleted file mode 100644
index 36e0ae7..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/ko/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF \ubb38\uc11c
-
-featureText=EPF \ubb38\uc11c\n\
-\n\
-\ubc84\uc804: {1} \n\
-\ube4c\ub4dc \ub808\uc774\ube14: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/pt/BR/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/pt/BR/about.properties
deleted file mode 100644
index 7877f77..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/pt/BR/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=Documenta\u00e7\u00e3o do EPF
-
-featureText=Documenta\u00e7\u00e3o do EPF\n\
-\n\
-Vers\u00e3o: {1} \n\
-Constru\u00e7\u00e3o: {0}\n\
-\n\
-(c) Copyright contribuidores Eclipse e outros 2000, 2007. Todos os Direitos Reservados.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/ru/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/ru/about.properties
deleted file mode 100644
index 313784e..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/ru/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f EPF
-
-featureText=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f EPF\n\
-\n\
-\u0412\u0435\u0440\u0441\u0438\u044f: {1} \n\
-\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/zh/CN/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/zh/CN/about.properties
deleted file mode 100644
index 7ded073..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/zh/CN/about.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF \u6587\u6863
-
-featureText=EPF \u6587\u6863\n\
-\n\
-\u7248\u672c\uff1a{1} \n\
-\u5de5\u4f5c\u7248\u672c\u6807\u7b7e\uff1a{0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n \n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/nl/zh/TW/about.properties b/1.5/plugins/org.eclipse.epf.doc/nl/zh/TW/about.properties
deleted file mode 100644
index 36a0d60..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/nl/zh/TW/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF Documentation
-
-featureText=EPF \u6587\u4ef6\n\
-\n\
-\u7248\u672c\uff1a{1}\n\
-\u5efa\u7f6e\u6a19\u7c64\uff1a{0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.doc/plugin.properties b/1.5/plugins/org.eclipse.epf.doc/plugin.properties
deleted file mode 100644
index 0a7a364..0000000
--- a/1.5/plugins/org.eclipse.epf.doc/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-featurePluginName=EPF Documentation Feature
-#featurePluginNameNL=EPF Documentation Feature (NLS)
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/.classpath b/1.5/plugins/org.eclipse.epf.export.msp.ui/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/.options b/1.5/plugins/org.eclipse.epf.export.msp.ui/.options
deleted file mode 100644
index cf274ec..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Rich Text plug-in
-org.eclipse.epf.export.msp/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/.project b/1.5/plugins/org.eclipse.epf.export.msp.ui/.project
deleted file mode 100644
index 4a4bfa8..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.export.msp.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.export.msp.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 5474b21..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.export.msp.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.export.msp.ui.ExportMSPUIPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.export;visibility:=reexport,
- org.eclipse.epf.export.msp;visibility:=reexport,
- org.eclipse.epf.publishing.ui;visibility:=reexport,
- org.eclipse.ui,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Bundle-Vendor: %providerName
-Bundle-ClassPath: exportmspui.jar
-Export-Package: org.eclipse.epf.export.msp.ui,
- org.eclipse.epf.export.msp.ui.preferences,
- org.eclipse.epf.export.msp.ui.wizards
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/build.properties b/1.5/plugins/org.eclipse.epf.export.msp.ui/build.properties
deleted file mode 100644
index 02d43c0..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-source.exportmspui.jar = src/
-output.exportmspui.jar = bin/
-bin.includes = exportmspui.jar,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               META-INF/,\
-               schema/,\
-               .options
-
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/icons/etool16/exp_ms_prj.gif b/1.5/plugins/org.eclipse.epf.export.msp.ui/icons/etool16/exp_ms_prj.gif
deleted file mode 100644
index b998d30..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/icons/etool16/exp_ms_prj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/icons/full/wizban/exp_ms_prj_wizban.gif b/1.5/plugins/org.eclipse.epf.export.msp.ui/icons/full/wizban/exp_ms_prj_wizban.gif
deleted file mode 100644
index 218589f..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/icons/full/wizban/exp_ms_prj_wizban.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.export.msp.ui/plugin.properties
deleted file mode 100644
index 3e64ede..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Export Microsoft Project
-providerName=Eclipse.org
-
-# Wizards
-exportProjectTemplateWizardName=Microsoft Project
-exportProjectTemplateWizardDescription=Export a process to a Microsoft Project.
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.export.msp.ui/plugin.xml
deleted file mode 100644
index 79d0930..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/plugin.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.exportWizards">
-      <wizard
-            category="org.eclipse.epf.ui.exportWizards.category"
-            class="org.eclipse.epf.export.msp.ui.wizards.ExportMSPWizard"
-            icon="icons/etool16/exp_ms_prj.gif"
-            id="org.eclipse.epf.export.msp.ui.wizards.ExportMSPWizard"
-            name="%exportProjectTemplateWizardName">
-         <description>
-               %exportProjectTemplateWizardDescription
-         </description>
-      </wizard>
-   </extension>
-   
-   <extension-point
-         id="exportMSPWizard"
-         name="Export Microsoft Project Wizard Extension"
-         schema="schema/ExportMSPWizard.exsd" />
-
-   <extension
-         point="org.eclipse.epf.ui.exportWizards">
-      <wizard id="org.eclipse.epf.export.msp.ui.wizards.ExportMSPWizard"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/schema/ExportMSPWizard.exsd b/1.5/plugins/org.eclipse.epf.export.msp.ui/schema/ExportMSPWizard.exsd
deleted file mode 100644
index 09f9a3d..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/schema/ExportMSPWizard.exsd
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.export.msp.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.export.msp.ui" id="exportMSPWizard" name="Export Microsoft Project Wizard Extension"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to extend the Export Microsoft Project wizard by replacing existing wizard pages or adding new ones.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizardExtender" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardExtender">
-      <complexType>
-         <sequence>
-            <element ref="wizardPage" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard extender. This class must implements &lt;code&gt;org.eclipse.epf.publishing.ui.wizards.IPublishConfigWizardExtender&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardPage">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard page. This class must implements &lt;code&gt;org.eclipse.jface.wizard.IWizardPage&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The type of extension - &quot;replace&quot; or &quot;new&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="target" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the base wizard page to be replaced or used as a reference for inserting a new wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="insert" type="string">
-            <annotation>
-               <documentation>
-                  The insertion type for a new wizard page - &quot;before&quot; or &quot;after&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of how the extension point can be used: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.export.msp.ui.exportMSPWizard&quot;&gt;
-      &lt;wizard
-            class=&quot;org.eclipse.epf.export.msp.ui.wizards.MyExportMSPWizard&quot;&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.export.msp.ui.wizards.MySelectProcessPage&quot;
-               type=&quot;replace&quot;
-               target=&quot;org.eclipse.epf.export.msp.ui.wizards.SelectProcessPage&quot;/&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.export.msp.ui.wizards.MyNewWizardPage&quot;
-               type=&quot;new&quot;
-               target=&quot;org.eclipse.epf.export.msp.ui.wizards.SelectPublishOptionsProcessPage&quot;
-               insert=&quot;after&quot;/&gt;                     
-      &lt;/wizard&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/ExportMSPUIPlugin.java b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/ExportMSPUIPlugin.java
deleted file mode 100644
index fcf633b..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/ExportMSPUIPlugin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Export Microsoft Project UI plug-in class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportMSPUIPlugin extends AbstractPlugin {
-
-	// The shared instance.
-	private static ExportMSPUIPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportMSPUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ExportMSPUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/ExportMSPUIResources.java b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/ExportMSPUIResources.java
deleted file mode 100644
index 9041a0a..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/ExportMSPUIResources.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Export Microsoft Project UI message resource bundle accessor class.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public final class ExportMSPUIResources extends NLS {
-
-	private static String BUNDLE_NAME = ExportMSPUIResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private ExportMSPUIResources() {
-		// Do not instantiate
-	}
-
-	public static String exportMSPWizard_title;
-
-	public static String selectExportOptionsWizardPage_title;
-
-	public static String selectExportOptionsWizardPage_text;
-
-	public static String selectedProcessLabel_text;
-
-	public static String configurationLabel_text;
-
-	public static String publishWebSiteCheckBox_text;
-
-	public static String publishConfigButton_text;
-
-	public static String publishProcessButton_text;
-
-	public static String exportOnlyPlannedElementsCheckBox_text;
-
-	public static String selectPublishOptionsWizardPage_title;
-
-	public static String selectPublishOptionsWizardPage_text;
-
-	public static String selectExportDirWizardPage_title;
-
-	public static String selectExportDirWizardPage_text;
-
-	public static String projectNameLabel_text;
-
-	public static String dirLabel_text;
-
-	public static String browseButton_text;
-
-	public static String exportMSPTask_name;
-
-	public static String overwriteText_msg;
-	
-	public static String missingProcessContentWarning_msg;
-
-	public static String completedText_msg;
-
-	public static String exportMSPError_msg;
-
-	public static String exportMSPError_reason;
-
-	public static String exportMSPInternalError_msg;
-
-	public static String illegalArgument_msg;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ExportMSPUIResources.class);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/Resources.properties b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/Resources.properties
deleted file mode 100644
index 06e6f1f..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/Resources.properties
+++ /dev/null
@@ -1,51 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Export Microsoft Project Wizard
-exportMSPWizard_title=Export Microsoft Project
-
-# Select Export Options Wizard Page
-selectExportOptionsWizardPage_title=Select export options
-selectExportOptionsWizardPage_text=Select the method configuration and export options that will be used to export the selected process.
-selectedProcessLabel_text=Selected process:
-configurationLabel_text=Method configuration:
-publishWebSiteCheckBox_text=Publish the process website
-publishConfigButton_text=Publish the entire method configuration
-publishProcessButton_text=Publish content that is only relevant to the selected process
-exportOnlyPlannedElementsCheckBox_text=Export only breakdown elements that are planned
-
-# Select Publishing Options Wizard Page
-selectPublishOptionsWizardPage_title=Select publishing options
-selectPublishOptionsWizardPage_text=Select the publishing options that will be used to publish the website for the exported process.
-
-# Select Export Directory Wizard page
-selectExportDirWizardPage_title=Specify project name and export directory
-selectExportDirWizardPage_text=Specify the Microsoft Project name and export directory.
-projectNameLabel_text=Name:
-dirLabel_text=Directory:
-browseButton_text=Browse...
-
-# Progress Messages
-exportMSPTask_name=Exporting selected process to Microsoft Project...
-
-# Warning Messages
-overwriteText_msg=IUPM0100W: A Microsoft Project ''{0}'' already exists in ''{1}''.\n\nDo you want to overwrite it?
-missingProcessContentWarning_msg=IUPM0102W: The published process website will not contain any content related to the exported process.\n\nDo you want to proceed?
-
-# Informational Messages
-completedText_msg=IUPM0103I: The selected process ''{0}'' has been successfully exported to Microsoft Project XML file ''{1}''.
-
-# Error Messages
-exportMSPError_msg=IUPM0105E: An error has occurred while exporting the selected process ''{0}'' to Microsoft Project ''{1}''.
-exportMSPError_reason=Click Details for more information.
-exportMSPInternalError_msg=An internal error has occurred.
-illegalArgument_msg={0} returns a null or invalid value.
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/package.html b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/package.html
deleted file mode 100644
index f468add..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides resourcing support for the Export Microsoft Project wizard.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/preferences/ExportMSPUIPreferences.java b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/preferences/ExportMSPUIPreferences.java
deleted file mode 100644
index 467783f..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/preferences/ExportMSPUIPreferences.java
+++ /dev/null
@@ -1,234 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2007 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp.ui.preferences;
-
-import java.util.List;
-
-import org.eclipse.epf.common.ui.util.PreferenceUtil;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.export.msp.ui.ExportMSPUIPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * The Export Microsoft Project UI preferences.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ExportMSPUIPreferences {
-
-	// The publish web site preference key.
-	private static final String PUBLISH_WEBSITE = "publishWebSite"; //$NON-NLS-1$
-
-	// The publish configuration preference key.
-	private static final String PUBLISH_CONFIGURATION = "publishConfiguration"; //$NON-NLS-1$
-
-	// The export only planned WBS elements preference key.
-	private static final String EXPORT_ONLY_PLANNED_WBS_ELEMENTS = "exportOnlyPlannedWBSElements"; //$NON-NLS-1$
-
-	// The process name preference key.
-	private static final String PROCESS_NAME = "processName"; //$NON-NLS-1$
-
-	// The method configuration namr preference key.
-	private static final String CONFIGURATION_NAME = "configurationName"; //$NON-NLS-1$
-
-	// The Microsoft Project names preference key.
-	private static final String MS_PROJECT_NAMES = "msprojectNames"; //$NON-NLS-1$
-
-	// The export directories preference key.
-	private static final String EXPORT_DIRECTORIES = "exportDirs"; //$NON-NLS-1$
-
-	// The default export MSP directory name.
-	private static final String DEFAULT_EXPORT_DIR_NAME = "Export" + FileUtil.FILE_SEP + "MSP"; //$NON-NLS-1$ //$NON-NLS-2$	 
-	
-	// The plug-in specific preference store.
-	private static IPreferenceStore prefStore = ExportMSPUIPlugin.getDefault()
-			.getPreferenceStore();
-
-	// The default export MSP directory.
-	private static String defaultExportDir = null;
-	
-	static {
-		prefStore.setDefault(PUBLISH_WEBSITE, true);
-		prefStore.setDefault(PUBLISH_CONFIGURATION, true);
-		prefStore.setDefault(EXPORT_ONLY_PLANNED_WBS_ELEMENTS, false);
-		prefStore.setDefault(CONFIGURATION_NAME, ""); //$NON-NLS-1$
-		prefStore.setDefault(PROCESS_NAME, ""); //$NON-NLS-1$
-		prefStore.setDefault(MS_PROJECT_NAMES, ""); //$NON-NLS-1$
-		prefStore.setDefault(EXPORT_DIRECTORIES, getDefaultExportDir());
-	}
-
-	/**
-	 * Gets the publish web site preference value.
-	 * 
-	 * @return <code>true</code> is the preference is set.
-	 */
-	public static boolean getPublishWebSite() {
-		return prefStore.getBoolean(PUBLISH_WEBSITE);
-	}
-
-	/**
-	 * Sets the publish web site preference value.
-	 * 
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setPublishWebSite(boolean value) {
-		prefStore.setValue(PUBLISH_WEBSITE, value);
-	}
-
-	/**
-	 * Gets the publish configuration preference value.
-	 * 
-	 * @return <code>true</code> is the preference is set
-	 */
-	public static boolean getPublishConfiguration() {
-		return prefStore.getBoolean(PUBLISH_CONFIGURATION);
-	}
-
-	/**
-	 * Sets the publish configuration preference value.
-	 * 
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setPublishConfiguration(boolean value) {
-		prefStore.setValue(PUBLISH_CONFIGURATION, value);
-	}
-
-	/**
-	 * Gets the export only planned WBS elements preference value.
-	 * 
-	 * @return <code>true</code> is the preference is set
-	 */
-	public static boolean getExportOnlyPlannedWBSElements() {
-		return prefStore.getBoolean(EXPORT_ONLY_PLANNED_WBS_ELEMENTS);
-	}
-
-	/**
-	 * Sets the export only planned WBS elements preference value.
-	 * 
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setExportOnlyPlannedWBSElements(boolean value) {
-		prefStore.setValue(EXPORT_ONLY_PLANNED_WBS_ELEMENTS, value);
-	}
-
-	/**
-	 * Gets the process name preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String getProcessName() {
-		return prefStore.getString(PROCESS_NAME);
-	}
-
-	/**
-	 * Sets the process name preference value.
-	 * 
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setProcessName(String value) {
-		prefStore.setValue(PROCESS_NAME, value);
-	}
-
-	/**
-	 * Gets the method configuration name preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String getConfigurationName() {
-		return prefStore.getString(CONFIGURATION_NAME);
-	}
-
-	/**
-	 * Sets the method configuration name preference value.
-	 * 
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setConfigurationName(String value) {
-		prefStore.setValue(CONFIGURATION_NAME, value);
-	}
-
-	/**
-	 * Gets the Microsoft Project names preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String[] getMSProjectNames() {
-		return PreferenceUtil.getStringValues(prefStore, MS_PROJECT_NAMES);
-	}
-
-	/**
-	 * Gets the Microsoft Project names preference value.
-	 * 
-	 * @return a collection of Microsoft Project names
-	 */
-	public static List<String> getMSProjectNamesList() {
-		return PreferenceUtil.getList(prefStore, MS_PROJECT_NAMES);
-	}
-
-	/**
-	 * Adds a Microsoft Project name to the Microsoft Project names preference.
-	 * 
-	 * @param name
-	 *            a template name
-	 */
-	public static void addMSProjectName(String name) {
-		PreferenceUtil.addToList(prefStore, MS_PROJECT_NAMES, name);
-	}
-
-	/**
-	 * Gets the default export MSP directory.
-	 * 
-	 * @return the default export MSP directory
-	 */
-	public static String getDefaultExportDir() {
-		if (defaultExportDir == null) {
-			defaultExportDir = System.getProperty("user.home"); //$NON-NLS-1$
-			String appName = LibraryUIPreferences.getApplicationShortName();
-			if (appName != null && appName.length() > 0) {
-				defaultExportDir = defaultExportDir + FileUtil.FILE_SEP
-						+ appName + FileUtil.FILE_SEP + DEFAULT_EXPORT_DIR_NAME;
-			} else {
-				defaultExportDir = defaultExportDir + FileUtil.FILE_SEP
-						+ DEFAULT_EXPORT_DIR_NAME;
-			}
-		}
-		return defaultExportDir;
-	}
-
-	/**
-	 * Gets the export directories preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String[] getExportDirectories() {
-		return PreferenceUtil.getStringValues(prefStore, EXPORT_DIRECTORIES);
-	}
-
-	/**
-	 * Gets the export directories preference value.
-	 * 
-	 * @return a collection of export directories
-	 */
-	public static List<String> getExportDirectoriesList() {
-		return PreferenceUtil.getList(prefStore, EXPORT_DIRECTORIES);
-	}
-
-	/**
-	 * Adds a export directory to the export directories preference.
-	 * 
-	 * @param dir
-	 *            an export directory
-	 */
-	public static void addExportDir(String dir) {
-		PreferenceUtil.addToList(prefStore, EXPORT_DIRECTORIES, dir);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/preferences/package.html b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/preferences/package.html
deleted file mode 100644
index 7ebf800..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the Export Microsoft Project wizard.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/ExportMSPWizard.java b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/ExportMSPWizard.java
deleted file mode 100644
index e9e6eb8..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/ExportMSPWizard.java
+++ /dev/null
@@ -1,357 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp.ui.wizards;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.export.msp.ExportMSPOptions;
-import org.eclipse.epf.export.msp.ExportMSPService;
-import org.eclipse.epf.export.msp.ExportMSPServiceException;
-import org.eclipse.epf.export.msp.IExportMSPService;
-import org.eclipse.epf.export.msp.ui.ExportMSPUIPlugin;
-import org.eclipse.epf.export.msp.ui.ExportMSPUIResources;
-import org.eclipse.epf.library.ui.wizards.SelectProcessPage;
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.epf.publishing.util.PublishingUtil;
-import org.eclipse.epf.ui.wizards.BaseWizard;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * The Export Microsoft Project wizard.
- * <p>
- * This wizard exports a capability pattern or delivery process to a Microsoft
- * Project. The current implementation generates a XML file that adheres to the
- * Microsoft Project 2003 XML Schema.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportMSPWizard extends BaseWizard implements IExportWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = ExportMSPWizard.class.getName();
-
-	/**
-	 * The Publish Configuration wizard extension point ID.
-	 */
-	public static final String WIZARD_EXTENSION_POINT_ID = "org.eclipse.epf.export.msp.ui.exportMSPWizard"; //$NON-NLS-1$	
-
-	// The wizard page that prompts the user to select a process.
-	protected SelectProcessPage selectProcessPage;
-
-	// The wizard page that prompts the user to specify the export options.
-	protected SelectExportOptionsPage selectExportOptionsPage;
-
-	// The wizard page that prompts the user to specify the publishing options.
-	protected SelectPublishingOptionsPage selectPublishingOptionsPage;
-
-	// The wizard page that prompts the user to specify the export directory.
-	protected SelectExportDirectoryPage selectExportDirPage;
-
-	// The export options.
-	protected ExportMSPOptions exportOptions = new ExportMSPOptions();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportMSPWizard() {
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		super.init(workbench, selection);
-		setWindowTitle(ExportMSPUIResources.exportMSPWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#getWizardExtenderExtensionPointId()
-	 */
-	public String getWizardExtenderExtensionPointId() {
-		return WIZARD_EXTENSION_POINT_ID;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		if (wizardExtender == null) {
-			selectProcessPage = new SelectProcessPage();
-			selectExportOptionsPage = new SelectExportOptionsPage();
-			selectPublishingOptionsPage = new SelectPublishingOptionsPage();
-			selectExportDirPage = new SelectExportDirectoryPage();
-			super.addPage(selectProcessPage);
-			super.addPage(selectExportOptionsPage);
-			super.addPage(selectPublishingOptionsPage);
-			super.addPage(selectExportDirPage);
-		} else {
-			List<IWizardPage> wizardPages = new ArrayList<IWizardPage>();
-
-			IWizardPage page = wizardExtender
-					.getReplaceWizardPage(SelectProcessPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectProcessPage = new SelectProcessPage();
-				wizardPages.add(selectProcessPage);
-			}
-
-			page = wizardExtender
-					.getReplaceWizardPage(SelectExportOptionsPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectExportOptionsPage = new SelectExportOptionsPage();
-				wizardPages.add(selectExportOptionsPage);
-			}
-
-			page = wizardExtender
-					.getReplaceWizardPage(SelectPublishingOptionsPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectPublishingOptionsPage = new SelectPublishingOptionsPage();
-				wizardPages.add(selectPublishingOptionsPage);
-			}
-
-			page = wizardExtender
-					.getReplaceWizardPage(SelectExportDirectoryPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectExportDirPage = new SelectExportDirectoryPage();
-				wizardPages.add(selectExportDirPage);
-			}
-
-			super.getNewWizardPages(wizardPages);
-
-			for (Iterator<IWizardPage> it = wizardPages.iterator(); it
-					.hasNext();) {
-				IWizardPage wizardPage = it.next();
-				super.addPage(wizardPage);
-			}
-
-			wizardExtender.initWizardPages(wizardPages);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				ExportMSPUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MSProject.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean canFinish() {
-		if (wizardExtender != null) {
-			if (! wizardExtender.canFinish()) {
-				return false;
-			}
-		}
-		return getContainer().getCurrentPage() == selectExportDirPage
-				&& selectExportDirPage.isPageComplete();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#doFinish()
-	 */
-	public boolean doFinish() {
-		return exportMSP(selectProcessPage.getProcess(), getExportOptions(),
-				ExportMSPService.getInstance());
-	}
-
-	/**
-	 * Exports the selected process.
-	 */
-	public boolean exportMSP(Process process, ExportMSPOptions exportOptions,
-			IExportMSPService service) {
-		if (process == null || exportOptions == null || service == null) {
-			throw new IllegalArgumentException();
-		}
-
-		File exportDir;
-		String msprojectName;
-
-		try {
-			MethodConfiguration config = exportOptions.getMethodConfiguration();
-			if (config == null) {
-				throw new IllegalArgumentException(
-						"exportOptions.getMethodConfiguration()"); //$NON-NLS-1$
-			}
-			if (exportOptions.getPublishWebSite()) {
-				if (selectPublishingOptionsPage != null) {
-					selectPublishingOptionsPage.savePreferences();
-				}
-
-				if (!PublishingUtil.hasValidProcessView(config, process)) {
-					boolean ok = ExportMSPUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayPrompt(
-									ExportMSPUIResources.exportMSPWizard_title,
-									ExportMSPUIResources.missingProcessContentWarning_msg);
-					if (!ok) {
-						return false;
-					}
-				}
-			}
-
-			exportDir = exportOptions.getExportDir();
-			if (exportDir == null) {
-				throw new IllegalArgumentException(
-						"exportOptions.getExportDir()"); //$NON-NLS-1$
-			}
-
-			msprojectName = exportOptions.getMSProjectName();
-			if (msprojectName == null) {
-				throw new IllegalArgumentException(
-						"exportOptions.getMSProjectName()"); //$NON-NLS-1$
-			}
-		} catch (IllegalArgumentException e) {
-			displayIllegalArgumentError(e.getMessage());
-			return true;
-		}
-
-		String msprojectFileName = msprojectName + ".xml"; //$NON-NLS-1$
-		File msprojectFile = new File(exportDir, msprojectFileName);
-		if (msprojectFile.exists()) {
-			boolean ok = ExportMSPUIPlugin.getDefault().getMsgDialog()
-					.displayPrompt(
-							ExportMSPUIResources.exportMSPWizard_title,
-							NLS.bind(ExportMSPUIResources.overwriteText_msg,
-									(new String[] { msprojectFileName,
-											exportDir.getAbsolutePath() })));
-			if (!ok) {
-				return false;
-			}
-		}
-
-		try {
-			boolean success = service.exportMSProject(process, exportOptions);
-			if (success) {
-				ExportMSPUIPlugin.getDefault().getMsgDialog().displayInfo(
-						ExportMSPUIResources.exportMSPWizard_title,
-						NLS.bind(ExportMSPUIResources.completedText_msg,
-								(new String[] { process.getName(),
-										msprojectFile.getAbsolutePath() })));
-			}
-		} catch (ExportMSPServiceException e) {
-			ExportMSPUIPlugin.getDefault().getMsgDialog().displayError(
-					ExportMSPUIResources.exportMSPWizard_title,
-					NLS.bind(ExportMSPUIResources.exportMSPError_msg,
-							(new String[] { process.getName(),
-									msprojectFile.getAbsolutePath() })),
-					ExportMSPUIResources.exportMSPError_reason, e);
-		}
-
-		return true;
-	}
-
-	/**
-	 * Returns the wizard page that prompts the user to select a process to
-	 * export.
-	 */
-	public SelectProcessPage getSelectProcessPage() {
-		return selectProcessPage;
-	}
-
-	/**
-	 * Returns the wizard page that prompts the user the export options.
-	 */
-	public SelectExportOptionsPage getExportOptionsPage() {
-		return selectExportOptionsPage;
-	}
-
-	/**
-	 * Returns the wizard page that prompts the user to specify the publishing
-	 * options.
-	 */
-	public SelectPublishingOptionsPage selectPublishingOptionsPage() {
-		return selectPublishingOptionsPage;
-	}
-
-	/**
-	 * Returns the wizard page that prompts the user to specify the export
-	 * directory.
-	 */
-	public SelectExportDirectoryPage getSelectExportDirectoryPage() {
-		return selectExportDirPage;
-	}
-
-	/**
-	 * Returns the export options.
-	 */
-	public ExportMSPOptions getExportOptions() {
-		exportOptions.setMethodConfiguration(selectExportOptionsPage
-				.getMethodConfiguration());
-		exportOptions.setExportDir(new File(selectExportDirPage
-				.getExportDirectory()));
-		exportOptions.setMSProjectName(selectExportDirPage.getMSProjectName());
-		exportOptions.setExportOnlyPlannedWBSElements(selectExportOptionsPage
-				.getExportOnlyPlannedWBSElementsSelection());
-
-		if (selectExportOptionsPage.getPublishWebSiteSelection()) {
-			PublishOptions publishingOptions = selectPublishingOptionsPage
-					.getPublishingOptions();
-			boolean publishConfig = selectExportOptionsPage
-					.getPublishConfigSelection();
-			boolean publishProcess = selectExportOptionsPage
-					.getPublishProcessSelection();
-			publishingOptions.setPublishConfiguration(publishConfig);
-			publishingOptions.setPublishProcess(publishProcess);
-			exportOptions.setPublishWebSite(publishingOptions != null
-					&& (publishConfig || publishProcess));
-			exportOptions.setPublishingOptions(publishingOptions);
-		} else {
-			exportOptions.setPublishWebSite(false);
-			exportOptions.setPublishingOptions(null);
-		}
-
-		return exportOptions;
-	}
-
-	/**
-	 * Displays an error dialog about an illegal argument.
-	 * 
-	 * @param name
-	 *            name of the argument
-	 */
-	protected void displayIllegalArgumentError(String name) {
-		String msg = NLS.bind(ExportMSPUIResources.illegalArgument_msg,
-				(new String[] { name }));
-		ExportMSPUIPlugin.getDefault().getMsgDialog().displayError(
-				ExportMSPUIResources.exportMSPWizard_title,
-				ExportMSPUIResources.exportMSPInternalError_msg,
-				ExportMSPUIResources.exportMSPError_reason,
-				new IllegalArgumentException(msg));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectExportDirectoryPage.java b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectExportDirectoryPage.java
deleted file mode 100644
index 16e2ebb..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectExportDirectoryPage.java
+++ /dev/null
@@ -1,178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp.ui.wizards;
-
-import org.eclipse.epf.export.msp.ui.ExportMSPUIPlugin;
-import org.eclipse.epf.export.msp.ui.ExportMSPUIResources;
-import org.eclipse.epf.export.msp.ui.preferences.ExportMSPUIPreferences;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A wizard page that prompts the user to specify the Microsoft Project name and
- * export directory.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class SelectExportDirectoryPage extends BaseWizardPage {
-
-	public static final String PAGE_NAME = SelectExportDirectoryPage.class
-			.getName();
-
-	protected Shell shell;
-
-	protected Composite composite;
-
-	protected Composite templateComposite;
-
-	protected Combo projectNameCombo;
-
-	protected Combo exportDirCombo;
-
-	protected Button browseButton;
-
-	protected ModifyListener modifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			setPageComplete(isPageComplete());
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectExportDirectoryPage(String pageName) {
-		super(pageName);
-		setTitle(ExportMSPUIResources.selectExportDirWizardPage_title);
-		setDescription(ExportMSPUIResources.selectExportDirWizardPage_text);
-		setImageDescriptor(ExportMSPUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_ms_prj_wizban.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectExportDirectoryPage() {
-		this(PAGE_NAME);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		shell = parent.getShell();
-
-		composite = createGridLayoutComposite(parent, 1);
-
-		templateComposite = createGridLayoutComposite(composite, 3);
-
-		createLabel(templateComposite,
-				ExportMSPUIResources.projectNameLabel_text);
-
-		projectNameCombo = createCombobox(templateComposite, 2);
-
-		createLabel(templateComposite, ExportMSPUIResources.dirLabel_text);
-
-		exportDirCombo = createCombobox(templateComposite);
-
-		browseButton = createButton(templateComposite,
-				ExportMSPUIResources.browseButton_text);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String[] templateNames = ExportMSPUIPreferences.getMSProjectNames();
-		if (templateNames != null && templateNames.length > 0) {
-			projectNameCombo.setItems(templateNames);
-			projectNameCombo.setText(templateNames[0]);
-		}
-
-		String[] exportDirs = ExportMSPUIPreferences.getExportDirectories();
-		if (exportDirs != null && exportDirs.length > 0) {
-			exportDirCombo.setItems(exportDirs);
-			exportDirCombo.setText(exportDirs[0]);
-		}
-
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				try {
-					DirectoryDialog dialog = new DirectoryDialog(shell,
-							SWT.NONE);
-					String selectedDir = dialog.open();
-					if (selectedDir != null) {
-						exportDirCombo.add(selectedDir, 0);
-						exportDirCombo.setText(selectedDir);
-					}
-				} catch (Exception e) {
-					ExportMSPUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		});
-	}
-
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {
-		projectNameCombo.addModifyListener(modifyListener);
-		exportDirCombo.addModifyListener(modifyListener);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return getMSProjectName().length() > 0
-				&& getExportDirectory().length() > 0;
-	}
-
-	/**
-	 * Returns the Microsoft Project name.
-	 */
-	public String getMSProjectName() {
-		return projectNameCombo.getText().trim();
-	}
-
-	/**
-	 * Returns the export directory.
-	 */
-	public String getExportDirectory() {
-		return exportDirCombo.getText().trim();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#dispose()
-	 */
-	public void dispose() {
-		ExportMSPUIPreferences.addMSProjectName(getMSProjectName());
-		ExportMSPUIPreferences.addExportDir(getExportDirectory());
-		modifyListener = null;
-		super.dispose();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectExportOptionsPage.java b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectExportOptionsPage.java
deleted file mode 100644
index b2eafa8..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectExportOptionsPage.java
+++ /dev/null
@@ -1,297 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp.ui.wizards;
-
-import org.eclipse.epf.export.msp.ui.ExportMSPUIPlugin;
-import org.eclipse.epf.export.msp.ui.ExportMSPUIResources;
-import org.eclipse.epf.export.msp.ui.preferences.ExportMSPUIPreferences;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to select the export options.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class SelectExportOptionsPage extends BaseWizardPage {
-
-	public static final String PAGE_NAME = SelectExportOptionsPage.class
-			.getName();
-
-	protected Composite composite;
-
-	protected Composite configComposite;
-
-	protected Text processText;
-
-	protected Combo configCombo;
-
-	protected Composite optionsComposite;
-
-	protected Button publishWebSiteRadioButton;
-
-	protected Composite publishOptionsComposite;
-
-	protected Button publishConfigRadioButton;
-
-	protected Button publishProcessRadioButton;
-
-	protected Button exportOnlyPlannedWBSElementsCheckBox;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectExportOptionsPage(String pageName) {
-		super(pageName);
-		setTitle(ExportMSPUIResources.selectExportOptionsWizardPage_title);
-		setDescription(ExportMSPUIResources.selectExportOptionsWizardPage_text);
-		setImageDescriptor(ExportMSPUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_ms_prj_wizban.gif")); //$NON-NLS-1$	
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectExportOptionsPage() {
-		this(PAGE_NAME);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		composite = createGridLayoutComposite(parent, 1);
-
-		configComposite = createGridLayoutComposite(composite, 2);
-
-		createLabel(configComposite,
-				ExportMSPUIResources.selectedProcessLabel_text);
-
-		processText = createText(configComposite, ""); //$NON-NLS-1$
-
-		createLabel(configComposite,
-				ExportMSPUIResources.configurationLabel_text);
-
-		configCombo = new Combo(configComposite, SWT.BORDER | SWT.READ_ONLY);
-		configCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		optionsComposite = createGridLayoutComposite(composite, 1);
-
-		publishWebSiteRadioButton = createCheckbox(optionsComposite,
-				ExportMSPUIResources.publishWebSiteCheckBox_text);
-
-		publishOptionsComposite = createGridLayoutComposite(optionsComposite, 1);
-		GridLayout layout = (GridLayout) publishOptionsComposite.getLayout();
-		layout.marginTop = -5;
-		layout.marginLeft = 12;
-
-		publishConfigRadioButton = createRadioButton(publishOptionsComposite,
-				ExportMSPUIResources.publishConfigButton_text);
-
-		publishProcessRadioButton = createRadioButton(publishOptionsComposite,
-				ExportMSPUIResources.publishProcessButton_text);
-
-		exportOnlyPlannedWBSElementsCheckBox = createCheckbox(optionsComposite,
-				ExportMSPUIResources.exportOnlyPlannedElementsCheckBox_text);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		if (ExportMSPUIPreferences.getPublishWebSite()) {
-			publishWebSiteRadioButton.setSelection(true);
-		}
-
-		boolean publishConfig = ExportMSPUIPreferences
-				.getPublishConfiguration();
-		publishConfigRadioButton.setSelection(publishConfig);
-		publishProcessRadioButton.setSelection(!publishConfig);
-
-		updatePublishOptionsButtons();
-
-		exportOnlyPlannedWBSElementsCheckBox
-				.setSelection(ExportMSPUIPreferences
-						.getExportOnlyPlannedWBSElements());
-	}
-
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {
-		configCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-			}
-		});
-
-		publishWebSiteRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				updatePublishOptionsButtons();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent event) {
-			}
-		});
-	}
-
-	/**
-	 * Updates the Configuration Combo.
-	 */
-	protected void updateConfigCombo(Process process) {
-		String[] contextNames = LibraryServiceUtil.getContexts(process);
-		configCombo.setItems(contextNames);
-		String defaultContext = process.getDefaultContext().getName();
-		configCombo.setText(defaultContext);
-	}
-
-	/**
-	 * Updates the publishing options radio buttons.
-	 */
-	protected void updatePublishOptionsButtons() {
-		boolean enabled = getPublishWebSiteSelection();
-		publishConfigRadioButton.setEnabled(enabled);
-		publishProcessRadioButton.setEnabled(enabled);
-		setPageComplete(isPageComplete());
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (obj != null && obj instanceof Process) {
-			Process process = (Process) obj;
-			processText.setText(process.getName());
-			updateConfigCombo(process);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageCompleted()
-	 */
-	public boolean isPageComplete() {
-		MethodConfiguration config = getMethodConfiguration();
-		if (config == null) {
-			return false;
-		}
-
-		if (getPublishWebSiteSelection()
-				&& config.getProcessViews().size() == 0) {
-			setErrorMessage(PublishingUIResources.missingViewError_msg);
-			return false;
-		}
-
-		setErrorMessage(null);
-
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#getNextPageData()
-	 */
-	public Object getNextPageData() {
-		return getMethodConfiguration();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		IWizardPage nextPage = null;
-
-		if (getPublishWebSiteSelection()) {
-			nextPage = super.getNextPage();
-		} else {
-			nextPage = super.getNextPage().getNextPage();
-		}
-
-		return nextPage;
-	}
-
-	/**
-	 * Gets the user selected method configuration.
-	 */
-	public MethodConfiguration getMethodConfiguration() {
-		String configName = configCombo.getText().trim();
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		return LibraryServiceUtil.getMethodConfiguration(library, configName);
-	}
-
-	/**
-	 * Gets the publish web site selection.
-	 */
-	public boolean getPublishWebSiteSelection() {
-		return publishWebSiteRadioButton.getSelection();
-	}
-
-	/**
-	 * Gets the publish configuration selection.
-	 */
-	public boolean getPublishConfigSelection() {
-		return publishConfigRadioButton.getSelection();
-	}
-
-	/**
-	 * Gets the publish process selection.
-	 */
-	public boolean getPublishProcessSelection() {
-		return publishProcessRadioButton.getSelection();
-	}
-
-	/**
-	 * Gets the publish configuration selection.
-	 */
-	public boolean getExportOnlyPlannedWBSElementsSelection() {
-		return exportOnlyPlannedWBSElementsCheckBox.getSelection();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#dispose()
-	 */
-	public void dispose() {
-		ExportMSPUIPreferences.setPublishWebSite(getPublishWebSiteSelection());
-		ExportMSPUIPreferences
-				.setPublishConfiguration(getPublishConfigSelection());
-		ExportMSPUIPreferences
-				.setExportOnlyPlannedWBSElements(getExportOnlyPlannedWBSElementsSelection());
-		MethodConfiguration config = getMethodConfiguration();
-		if (config != null) {
-			ExportMSPUIPreferences.setConfigurationName(config.getName());
-		}
-		super.dispose();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectPublishingOptionsPage.java b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectPublishingOptionsPage.java
deleted file mode 100644
index cbc3078..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/SelectPublishingOptionsPage.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp.ui.wizards;
-
-import org.eclipse.epf.export.msp.ui.ExportMSPUIPlugin;
-import org.eclipse.epf.export.msp.ui.ExportMSPUIResources;
-
-/**
- * A wizard page that prompts the user to select the publishing options for the
- * process web site.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class SelectPublishingOptionsPage extends
-		org.eclipse.epf.publishing.ui.wizards.SelectPublishingOptionsPage {
-
-	public static final String PAGE_NAME = SelectPublishingOptionsPage.class
-			.getName();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectPublishingOptionsPage(String pageName) {
-		super(pageName);
-		setTitle(ExportMSPUIResources.selectPublishOptionsWizardPage_title);
-		setDescription(ExportMSPUIResources.selectPublishOptionsWizardPage_text);
-		setImageDescriptor(ExportMSPUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_ms_prj_wizban.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectPublishingOptionsPage() {
-		this(PAGE_NAME);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/package.html b/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/package.html
deleted file mode 100644
index b1bd524..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp.ui/src/org/eclipse/epf/export/msp/ui/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides wizards for exporting processes to Microsoft Projects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/.classpath b/1.5/plugins/org.eclipse.epf.export.msp/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/.options b/1.5/plugins/org.eclipse.epf.export.msp/.options
deleted file mode 100644
index cf274ec..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Rich Text plug-in
-org.eclipse.epf.export.msp/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/.project b/1.5/plugins/org.eclipse.epf.export.msp/.project
deleted file mode 100644
index 94031ba..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.export.msp</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.export.msp/META-INF/MANIFEST.MF
deleted file mode 100644
index 8cf7491..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.export.msp; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.export.msp.ExportMSPPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.export;visibility:=reexport,
- org.eclipse.epf.msproject;visibility:=reexport,
- org.eclipse.epf.publishing,
- org.eclipse.epf.publishing.ui;visibility:=reexport,
- org.eclipse.ui,
- org.eclipse.epf.common.ui,
- org.eclipse.epf.library.edit.ui
-Eclipse-LazyStart: true
-Bundle-Vendor: %providerName
-Bundle-ClassPath: exportmsp.jar
-Export-Package: org.eclipse.epf.export.msp
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/build.properties b/1.5/plugins/org.eclipse.epf.export.msp/build.properties
deleted file mode 100644
index 1d2e46c..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.exportmsp.jar = src/
-output.exportmsp.jar = bin/
-bin.includes = exportmsp.jar,\
-               plugin.properties,\
-               plugin.xml,\
-               template/,\
-               META-INF/,\
-               .options
-
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/plugin.properties b/1.5/plugins/org.eclipse.epf.export.msp/plugin.properties
deleted file mode 100644
index 3e64ede..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Export Microsoft Project
-providerName=Eclipse.org
-
-# Wizards
-exportProjectTemplateWizardName=Microsoft Project
-exportProjectTemplateWizardDescription=Export a process to a Microsoft Project.
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/plugin.xml b/1.5/plugins/org.eclipse.epf.export.msp/plugin.xml
deleted file mode 100644
index 367e2f8..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/plugin.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-<!--
-   <extension
-         point="org.eclipse.ui.exportWizards">
-      <wizard
-            category="org.eclipse.epf.ui.exportWizards.category"
-            class="org.eclipse.epf.export.msp.ui.wizards.ExportMSPWizard"
-            icon="icons/full/obj16/MSProject.gif"
-            id="org.eclipse.epf.export.msp.wizards.ExportToMSProjectWizard"
-            name="%exportProjectTemplateWizardName">
-         <description>
-               %exportProjectTemplateWizardDescription
-         </description>
-      </wizard>
-   </extension>
-   
-   <extension-point
-         id="exportMSPWizard"
-         name="Export Microsoft Project Wizard Extension"
-         schema="schema/ExportMSPWizard.exsd" />
-
-   <extension
-         point="org.eclipse.epf.ui.exportWizards">
-      <wizard id="org.eclipse.epf.export.msp.wizards.ExportToMSProjectWizard"/>
-   </extension>
--->
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPException.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPException.java
deleted file mode 100644
index 14bc726..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-/**
- * Signals that an Export Microsoft Project operation has failed.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportMSPException extends ExportMSPServiceException {
-
-	private static final long serialVersionUID = -923189700561806262L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportMSPException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public ExportMSPException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public ExportMSPException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception and the
-	 * error message.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public ExportMSPException(Throwable rootCause, String errorMsg) {
-		super(rootCause, errorMsg);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPOptions.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPOptions.java
deleted file mode 100644
index b9c7254..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPOptions.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import org.eclipse.epf.export.ExportProcessOptions;
-
-/**
- * The export Microsoft Project options.
- * 
- * @author Kelvin Low
- * @since 7.2
- */
-public class ExportMSPOptions extends ExportProcessOptions {
-
-	private String msprojectName;
-
-	/**
-	 * Gets the Microsoft Project name.
-	 * 
-	 * @return the name of the exported Microsoft Project name
-	 */
-	public String getMSProjectName() {
-		return msprojectName;
-	}
-
-	/**
-	 * Sets the Microsoft Project name.
-	 * 
-	 * @param templateName
-	 *            the name of the exported Microsoft Project
-	 */
-	public void setMSProjectName(String msprojectName) {
-		this.msprojectName = msprojectName;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPPlugin.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPPlugin.java
deleted file mode 100644
index b134d24..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPPlugin.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Export Microsoft Project plug-in class.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportMSPPlugin extends AbstractPlugin {
-
-	// The shared instance.
-	private static ExportMSPPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportMSPPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ExportMSPPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPResources.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPResources.java
deleted file mode 100644
index e138c97..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPResources.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Export Microsoft Project message resource bundle accessor class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class ExportMSPResources extends NLS {
-
-	private static String BUNDLE_NAME = ExportMSPResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private ExportMSPResources() {
-		// Do not instantiate
-	}
-
-	public static String exportMSPWizard_title;
-
-	public static String exportMSPTask_name;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ExportMSPResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPService.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPService.java
deleted file mode 100644
index 9b6270d..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import org.eclipse.epf.uma.Process;
-
-/**
- * The default Export Microsoft Project Service implementation.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportMSPService implements IExportMSPService {
-
-	// The shared instance.
-	private static ExportMSPService instance = null;
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ExportMSPService getInstance() {
-		if (instance == null) {
-			synchronized (ExportMSPService.class) {
-				if (instance == null) {
-					instance = new ExportMSPService();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * @see org.eclipse.epf.export.msp.IExportMSPService#exportMSProject(Process,
-	 *      ExportMSPOptions)
-	 */
-	public boolean exportMSProject(Process process,
-			ExportMSPOptions exportOptions) throws ExportMSPServiceException {
-		return new ExportMSPXMLService().export(process, exportOptions);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPServiceException.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPServiceException.java
deleted file mode 100644
index fffa11f..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPServiceException.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-/**
- * Signals that a Export Project Plan Service operation has failed.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportMSPServiceException extends Exception {
-
-	private static final long serialVersionUID = -6103689868572480359L;
-
-	/**
-	 * The root cause of the exception.
-	 */
-	protected Throwable rootCause;
-
-	/**
-	 * The error message associated with the exception.
-	 */
-	protected String errorMsg;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportMSPServiceException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public ExportMSPServiceException(Throwable rootCause) {
-		this(rootCause, rootCause.getMessage());
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public ExportMSPServiceException(String errorMsg) {
-		this(null, errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception and the
-	 * error message.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public ExportMSPServiceException(Throwable rootCause, String errorMsg) {
-		super();
-		this.rootCause = rootCause;
-		this.errorMsg = errorMsg;
-	}
-
-	/**
-	 * Returns the root cause of the exception.
-	 * 
-	 * @return the root cause of the exception
-	 */
-	public Throwable getRootCause() {
-		return rootCause;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPXMLOperation.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPXMLOperation.java
deleted file mode 100644
index feef00f..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPXMLOperation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.publishing.services.AbstractPublishManager;
-
-/**
- * The Export Microsoft Project XML file operation.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportMSPXMLOperation implements IRunnableWithProgress {
-
-	private AbstractPublishManager publishMgr;
-
-	private String published_url;
-
-	private Exception exception;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportMSPXMLOperation(AbstractPublishManager publishMgr) {
-		super();
-		this.publishMgr = publishMgr;
-	}
-
-	/**
-	 * Returns the published URL.
-	 */
-	public String getPublishedUrl() {
-		return published_url;
-	}
-
-	/**
-	 * Returns the exception, if any, that occurred while running the operation.
-	 */
-	public Exception getException() {
-		return exception;
-	}
-
-	/**
-	 * @see org.eclipse.jface.operation.IRunnableWithProgress#run(IProgressMonitor)
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException,
-			InterruptedException {
-		exception = null;
-		monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-		monitor.setTaskName(ExportMSPResources.exportMSPTask_name);
-		try {
-			publishMgr.publish(monitor);
-			published_url = publishMgr.getPublishedUrl();
-		} catch (Exception e) {
-			exception = e;
-		} finally {
-			monitor.done();
-			publishMgr = null;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPXMLService.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPXMLService.java
deleted file mode 100644
index c7dce7d..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportMSPXMLService.java
+++ /dev/null
@@ -1,1389 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.ui.UIHelper;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.msproject.Assignment;
-import org.eclipse.epf.msproject.DocumentRoot;
-import org.eclipse.epf.msproject.MsprojectFactory;
-import org.eclipse.epf.msproject.PredecessorLink;
-import org.eclipse.epf.msproject.Project;
-import org.eclipse.epf.msproject.Resource;
-import org.eclipse.epf.msproject.Task;
-import org.eclipse.epf.msproject.util.MsprojectResourceImpl;
-import org.eclipse.epf.publishing.services.PublishHTMLOptions;
-import org.eclipse.epf.publishing.services.PublishManager;
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.epf.publishing.ui.wizards.PublishProgressMonitorDialog;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * The default Export Microsoft Project Plan Service implementation.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- * 
- * Bugs fixed: https://bugs.eclipse.org/bugs/show_bug.cgi?id=155089
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=155086
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=155095
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=157265
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=155155
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=156959
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=157321
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=159230
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=162336
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=168801 fix for
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=176951
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=177428
- */
-public class ExportMSPXMLService {
-
-	// If true, generate debug traces.
-	private static boolean debug = ExportMSPPlugin.getDefault().isDebugging();
-
-	// All Tasks referenced by the exported Project Template.
-	private List referencedTasks = new ArrayList();
-
-	private HashMap rolesToUidMap = new HashMap();
-
-	private HashMap taskUidToWbsWapperPathMap = new HashMap();
-
-	private HashMap wbsWapperPathToLocalPredListMap = new HashMap();
-
-	private HashMap wbsGuidToTaskUidMap = new HashMap();
-
-	private HashMap wbsWrapperPathToPredListMap = new HashMap();
-
-	// The name of the content folder. This will be named after the context.
-	private String contentFolderName;
-
-	private String abTargetDir;
-
-	// If true, only export breakdown elements with 'isPlanned' attributes set
-	// to true.
-	private boolean exportOnlyPlannedElements;
-
-	private boolean publishContentSite = false;
-
-	private int task_uid = 1;
-
-	private int res_uid = 1;
-
-	private int assign_uid = 1;
-
-	protected MsprojectFactory projectFactory = MsprojectFactory.eINSTANCE;
-
-	// The process to be exported.
-	private Process process;
-	private MethodConfiguration processConfig;
-
-	private ConfigurableComposedAdapterFactory wbsAdapterFactory;
-
-	// The process configurator for filtering breakdown elements in a
-	// configuration.
-	private ProcessConfigurator breakdownElementFilter;
-
-	private IStructuredContentProvider wbsContentProvider;
-
-	// Map processes to suppression objects.
-	private Map suppressionMap = new HashMap();
-
-	// The suppression object associated with the selected process to be
-	// exported.
-	private Suppression suppression;
-
-	// The WBS element paths.
-	private Stack elementPaths = new Stack();
-
-	private Object currentElement;
-
-	private String currentElementPath;
-
-	private PredecessorList currentPredList;
-	
-	private HashMap<Task, WorkBreakdownElement> taskToWbeMap;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportMSPXMLService() {
-		super();
-	}
-
-	/**
-	 * Export a process to a Microsoft Project XML file.
-	 * 
-	 * @param process
-	 *            a capability pattern or delivery process
-	 * @param exportOptions
-	 *            a collection of user specified export options
-	 * @throws ExportMSPServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public boolean export(Process process, ExportMSPOptions exportOptions)
-			throws ExportMSPServiceException {
-		String msprojectName = exportOptions.getMSProjectName();
-		File exportDir = exportOptions.getExportDir();
-		publishContentSite = exportOptions.getPublishWebSite();
-		PublishOptions publishingOptions = exportOptions.getPublishingOptions();
-		processConfig = exportOptions.getMethodConfiguration();
-		if (debug) {
-			System.out.println("$$$ exporting to Microsoft Project!"); //$NON-NLS-1$
-			System.out.println("$$$ process          = " + process); //$NON-NLS-1$
-			System.out.println("$$$ configuration    = " + processConfig); //$NON-NLS-1$
-			System.out.println("$$$ msprojectName    = " //$NON-NLS-1$
-					+ msprojectName);
-			System.out
-					.println("$$$ targetDir                 = " + exportDir.getAbsolutePath()); //$NON-NLS-1$
-			System.out.println("$$$ exportOnlyPlannedElements = " //$NON-NLS-1$
-					+ exportOnlyPlannedElements);
-			System.out.println("$$$ publishConfigOptions      = " //$NON-NLS-1$
-					+ publishingOptions);
-		}
-
-		// construct the export target xml file path
-		if (!exportDir.exists()) {
-			exportDir.mkdirs();
-		}
-		abTargetDir = exportDir.getAbsolutePath();
-		Path exportPath = new Path(abTargetDir);
-		boolean endWithXmlExt = msprojectName.toLowerCase().endsWith(".xml"); //$NON-NLS-1$
-		String exportPathStr = (exportPath.append(endWithXmlExt ? msprojectName
-				: (msprojectName + ".xml"))).toOSString(); //$NON-NLS-1$
-		if (debug)
-			System.out.println("$$$ exportPathStr                 = " //$NON-NLS-1$
-					+ exportPathStr);
-
-		// construct the empty MS project xml template file path
-		String emptyTemplateFile = ExportMSPPlugin.getDefault()
-				.getInstallPath()
-				+ "template" //$NON-NLS-1$
-				+ File.separator + "msproject_2003_template.xml"; //$NON-NLS-1$
-		if (debug)
-			System.out.println("$$$ emptyTemplateFile             = " //$NON-NLS-1$
-					+ emptyTemplateFile);
-
-		// copy the empty template MS project xml file to the export target
-		try {
-			File src = new File(emptyTemplateFile);
-			File dst = new File(exportPathStr);
-			FileUtil.copyFile(src, dst);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-		Project project = null;
-		URI fileURI = URI.createFileURI(exportPathStr);
-
-		try {
-
-			XMLResource res = new MsprojectResourceImpl(fileURI);
-			res.getDefaultSaveOptions().put(
-					XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-			res.getDefaultLoadOptions().put(
-					XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-			res.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION,
-					Boolean.TRUE);
-			res.getDefaultSaveOptions().put(
-					XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE,
-					Boolean.TRUE);
-			res.getDefaultLoadOptions().put(
-					XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-			res.load(null);
-
-			DocumentRoot docRoot = (DocumentRoot) res.getEObject("/"); //$NON-NLS-1$
-			project = (Project) docRoot.getProject();
-
-			taskToWbeMap = new HashMap<Task, WorkBreakdownElement>();
-			if (! generateMSProject(process, project, exportOptions)) {
-				return false;
-			}
-
-			res.save(null);
-
-			if (debug) {
-				printMSProject(project);
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new ExportMSPException(e);
-		}
-
-		return true;
-	}
-
-	/**
-	 * Exports a capability pattern or delivery process to a Microsoft Project
-	 * XML file.
-	 * 
-	 * @param process
-	 *            a capability pattern or delivery process
-	 * @param project
-	 *            a Microsoft Project object
-	 * @param exportOptions
-	 *            a collection of user specified export options
-	 * @throws ExportMSPServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public boolean generateMSProject(Process process, Project project,
-			ExportMSPOptions exportOptions) throws Exception {
-		if (process == null || project == null) {
-			throw new IllegalArgumentException();
-		}
-
-		try {
-			MethodConfiguration config = exportOptions.getMethodConfiguration();
-			if (config == null) {
-				// Get the default method configuration associated with the
-				// process.
-				if (process instanceof DeliveryProcess) {
-					config = ((DeliveryProcess) process).getDefaultContext();
-				} else if (process instanceof CapabilityPattern) {
-					config = ((CapabilityPattern) process).getDefaultContext();
-				} else {
-					throw new IllegalArgumentException();
-				}
-			}
-
-			// Create the sub folder to store the published HTML content files.
-			contentFolderName = config.getName();
-
-			PublishOptions publishingOptions = exportOptions
-					.getPublishingOptions();
-			if (publishContentSite && publishingOptions != null) {
-				File contentDir = new File(exportOptions.getExportDir(),
-						contentFolderName);
-				if (!contentDir.exists()) {
-					contentDir.mkdirs();
-				}
-				if (debug) {
-					System.out.println("$$$ vieBuilder methodConfig = " //$NON-NLS-1$
-							+ config);
-					System.out.println("$$$ vieBuilder publishConfigOptions = " //$NON-NLS-1$
-							+ publishingOptions);
-				}
-
-				// Publish the associated configuration.
-				if (!publishConfiguration(contentDir.getAbsolutePath(), config,
-						publishingOptions)) {
-					return false;
-				}
-			}
-
-			exportOnlyPlannedElements = exportOptions
-					.getExportOnlyPlannedWBSElements();
-
-			// Generate the Microsoft Project XML file.
-			// populate the project's attributes
-			project.setName(process.getName());
-			project.setStartDate(new Date());
-			project.setCreationDate(new Date());
-			project.setLastSaved(new Date());
-			project.setFinishDate(new Date());
-			
-			setProjectExtendedAttributes(project);
-
-			generateOperatonRun(process, project, config);
-			
-			return true;
-		} catch (Exception e) {
-			throw e;
-		}
-	}
-
-	private void generateOperatonRun(Process process, Project project,
-			MethodConfiguration config) throws InvocationTargetException,
-			InterruptedException {
-		final Process fprocess = process;
-		final Project fproject = project;
-		final MethodConfiguration fconfig = config;
-		
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				try {
-					monitor.beginTask(ExportMSPResources.exportMSPWizard_title,
-							IProgressMonitor.UNKNOWN);
-
-					generate(fprocess, fproject, fconfig);
-				} catch (Exception e) {
-					throw new InvocationTargetException(e);
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-		ProgressMonitorDialog pmDialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
-		pmDialog.run(true, false, op);
-	}
-
-	private void generate(Process process, Project project,
-			MethodConfiguration config) throws Exception {
-		generateProjectResources(process, config, project);
-		generateProjectTasks(process, config, project);
-		generateLinks(process, project);
-		generateWPDs(config);
-	}
-
-	/**
-	 * Sets the export options.
-	 * 
-	 * @param exportOptions
-	 *            a collection of user specified export options
-	 */
-	protected void setExportOptions(ExportOptions exportOptions) {
-		Boolean exportOnlyPlannedElements = (Boolean) exportOptions
-				.get(ExportOptions.EXPORT_ONLY_PLANNED_ELEMENTS);
-		this.exportOnlyPlannedElements = exportOnlyPlannedElements
-				.booleanValue();
-	}
-
-	/**
-	 * Generates the project resources for all the task descriptors in the
-	 * process.
-	 * 
-	 * @param process
-	 *            a process
-	 * @param config
-	 *            a method configuration used to filter the work breakdown
-	 *            elements in the process
-	 * @param project
-	 *            an object to store the generated Microsoft Project WBS
-	 * @throws Exception
-	 *             if an error occurs while generating the Microsoft Project WBS
-	 */
-	protected void generateProjectResources(Process process,
-			MethodConfiguration config, Project project) throws Exception {
-		ComposedAdapterFactory adapterFactory = null;
-		try {
-			adapterFactory = TngAdapterFactory.INSTANCE
-					.createTBSComposedAdapterFactory();
-			if (adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-				((ConfigurableComposedAdapterFactory) adapterFactory)
-						.setFilter(new ProcessConfigurator(config));
-			}
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					adapterFactory);
-
-			List elements = process.getBreakdownElements();
-			if (elements.size() > 0) {
-				generateProjectResource(contentProvider,
-						(BreakdownElement) process, project);
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		} finally {
-			if (adapterFactory != null) {
-				adapterFactory.dispose();
-			}
-		}
-	}
-
-	/**
-	 * Generates the project resources for all the role descriptors in the
-	 * process.
-	 */
-	protected void generateProjectResource(
-			IStructuredContentProvider contentProvider,
-			BreakdownElement breakdownElement, Project project)
-			throws Exception {
-		if (breakdownElement instanceof WorkProductDescriptor
-				|| breakdownElement.getSuppressed().booleanValue()
-				|| (exportOnlyPlannedElements && !breakdownElement
-						.getIsPlanned().booleanValue())) {
-			return;
-		}
-
-		if (breakdownElement instanceof RoleDescriptor) {
-			addResource(breakdownElement, project);
-			return;
-		}
-
-		if (contentProvider != null) {
-			Object[] elements = contentProvider.getElements(breakdownElement);
-			for (int i = 0; i < elements.length; i++) {
-				Object element = elements[i];
-				if (element instanceof RoleDescriptorWrapperItemProvider) {
-					RoleDescriptorWrapperItemProvider provider = (RoleDescriptorWrapperItemProvider) element;
-					Object value = provider.getValue();
-					if (value instanceof RoleDescriptor) {
-						addResource((BreakdownElement) value, project);
-					}
-				} else if (element instanceof RoleDescriptor) {
-					addResource((BreakdownElement) element, project);
-				} else if (element instanceof BreakdownElementWrapperItemProvider) {
-					BreakdownElementWrapperItemProvider provider = (BreakdownElementWrapperItemProvider) element;
-					Object value = provider.getValue();
-					if (value instanceof WorkBreakdownElement) {
-						generateProjectResource(contentProvider,
-								(WorkBreakdownElement) value, project);
-					}
-				} else if (element instanceof WorkBreakdownElement) {
-					generateProjectResource(contentProvider,
-							(WorkBreakdownElement) element, project);
-				}
-			}
-		}
-
-	}
-
-	// for each RoleDescriptor, create a MS Project resource
-	// for the RoleDescriptor and its underlying role, remember the assigned
-	// res_uid
-	protected void addResource(BreakdownElement breakdownElement, Project proj)
-			throws Exception {
-		if (!(breakdownElement instanceof RoleDescriptor)) {
-			return;
-		}
-
-		// check the existence of the underlying role of this roleDescriptor
-		// and skip the creation if a resource for the role already exists
-		RoleDescriptor roleDescriptor = (RoleDescriptor) breakdownElement;
-		if (debug)
-			System.out.println("$$$ handle RoleDescriptor = " + roleDescriptor); //$NON-NLS-1$
-		Role ref_edRole = roleDescriptor.getRole();
-		if (debug)
-			System.out.println("$$$ handle Ref-ed Role = " + ref_edRole); //$NON-NLS-1$
-
-		// check the need to add a new resource based on RoleDescriptor's disply
-		// name
-		boolean newRDResource = true;
-		String rdResourceName = getDisplayName(roleDescriptor);
-		if (rolesToUidMap.get(rdResourceName) != null) {
-			newRDResource = false;
-		}
-
-		// check the need to add a new resource based on associated role's
-		// disply name
-		boolean newRoleReource = false;
-		String roleResourceName = null;
-		if (ref_edRole != null
-				&& rolesToUidMap
-						.get((roleResourceName = getDisplayName(ref_edRole))) == null
-				&& !roleResourceName.equalsIgnoreCase(rdResourceName)) {
-			newRoleReource = true;
-		}
-
-		// create a resource for the RoleDescriptor
-		if (newRDResource) {
-			Resource aRes = projectFactory.createResource();
-
-			aRes.setUID(BigInteger.valueOf(res_uid));
-			aRes.setID(BigInteger.valueOf(res_uid));
-			aRes.setName(rdResourceName);
-			proj.getResources().getResource().add(aRes);
-
-			rolesToUidMap.put(rdResourceName, BigInteger.valueOf(res_uid));
-			res_uid++;
-		}
-
-		// create a resource for the underlying associated role too
-		if (newRoleReource) {
-			Resource aRes = projectFactory.createResource();
-
-			aRes.setUID(BigInteger.valueOf(res_uid));
-			aRes.setID(BigInteger.valueOf(res_uid));
-			aRes.setName(roleResourceName);
-			proj.getResources().getResource().add(aRes);
-
-			rolesToUidMap.put(roleResourceName, BigInteger.valueOf(res_uid));
-			res_uid++;
-		}
-	}
-
-	/**
-	 * Generates the MS Project WBS for a capability pattern or delivery
-	 * process.
-	 * 
-	 * @param process
-	 *            a process
-	 * @param config
-	 *            a method configuration used to filter the work breakdown
-	 *            elements in the process
-	 * @param project
-	 *            an object to store the generated Microsoft Project WBS
-	 * @throws Exception
-	 *             if an error occurs while generating the Microsoft Project WBS
-	 */
-	protected void generateProjectTasks(Process process,
-			MethodConfiguration config, Project project) throws Exception {
-		// Save the reference to the exported process.
-		this.process = process;
-
-		wbsAdapterFactory = null;
-		try {
-			// Add the suppression object associated with the process to be
-			// exported
-			// to the suppression map.
-			suppression = new Suppression(process);
-			suppressionMap.put(process, suppression);
-
-			wbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.createWBSComposedAdapterFactory();
-			breakdownElementFilter = new ProcessConfigurator(config);
-			wbsAdapterFactory.setFilter(breakdownElementFilter);
-
-			wbsContentProvider = new AdapterFactoryContentProvider(
-					wbsAdapterFactory);
-
-			// test
-			// enumerateProcessPredecessorLists();
-
-			currentElement = process;
-			if (process instanceof CapabilityPattern) {
-				generateProjectTask(wbsContentProvider,
-						(BreakdownElement) process, 1, project);
-			} else {
-				List breakdownElements = process.getBreakdownElements();
-				if (breakdownElements.size() > 0) {
-					generateProjectTask(wbsContentProvider,
-							(BreakdownElement) process, 1, project);
-				}
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		} finally {
-			if (wbsAdapterFactory != null) {
-				wbsAdapterFactory.dispose();
-			}
-			if (suppressionMap != null) {
-				suppressionMap.clear();
-				suppressionMap = null;
-			}
-			if (wbsContentProvider != null) {
-				wbsContentProvider.dispose();
-			}
-		}
-	}
-
-	private void enumerateProcessPredecessorLists() {
-		// WBS tree
-		Iterator wbsTreeIterator = new AdapterFactoryTreeIterator(
-				wbsAdapterFactory, process);
-		Object obj;
-		while (wbsTreeIterator.hasNext()) {
-			obj = wbsTreeIterator.next();
-			System.out.println("treeIterator: " + obj); //$NON-NLS-1$
-			IBSItemProvider adapter = (IBSItemProvider) wbsAdapterFactory
-					.adapt(obj, ITreeItemContentProvider.class);
-			PredecessorList predList = adapter.getPredecessors();
-			for (Iterator iter = predList.iterator(); iter.hasNext();) {
-				IBSItemProvider e = (IBSItemProvider) iter.next();
-				System.out.println("    predList: " + e); //$NON-NLS-1$
-				if (e instanceof ItemProviderAdapter) {
-					System.out.println("    unwrappedPredList: " //$NON-NLS-1$
-							+ ((ItemProviderAdapter) e).getTarget());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Generates the Microsft Project task for a breakdown element.
-	 * 
-	 * @param contentProvider
-	 *            a content provider
-	 * @param breakdownElement
-	 *            a breakdown element
-	 * @param strBuf
-	 *            a <code>StringBuffer</code> to store the generated XML
-	 */
-	protected void generateProjectTask(
-			IStructuredContentProvider contentProvider,
-			Object elementOrWrapper, int taskOLevel, Project proj)
-			throws Exception {
-
-		WorkBreakdownElement breakdownElement = (WorkBreakdownElement) TngUtil
-				.unwrap(elementOrWrapper);
-
-		// not really neccessary here
-		if (breakdownElement instanceof WorkProductDescriptor
-				|| breakdownElement instanceof RoleDescriptor
-				|| breakdownElement.getSuppressed().booleanValue()
-				|| (exportOnlyPlannedElements && !breakdownElement
-						.getIsPlanned().booleanValue())) {
-			return;
-		}
-
-		boolean isSubTasksPlanned = false;
-		if (exportOnlyPlannedElements && breakdownElement instanceof Activity
-				&& contentProvider != null) {
-			Object[] elements = contentProvider.getElements(elementOrWrapper);
-			for (int i = 0; i < elements.length; i++) {
-				Object element = elements[i];
-				if (element instanceof Activity) {
-					if (!exportOnlyPlannedElements
-							|| ((Activity) element).getIsPlanned()
-									.booleanValue()) {
-						isSubTasksPlanned = true;
-						break;
-					}
-				} else if (element instanceof ActivityWrapperItemProvider) {
-					Object wrappedElement = TngUtil.unwrap(element);
-					if (wrappedElement instanceof Activity) {
-						if (!exportOnlyPlannedElements
-								|| ((Activity) wrappedElement).getIsPlanned()
-										.booleanValue()) {
-							isSubTasksPlanned = true;
-							break;
-						}
-					}
-				} else if (element instanceof TaskDescriptor) {
-					TaskDescriptor descriptor = (TaskDescriptor) element;
-					if (!exportOnlyPlannedElements
-							|| descriptor.getIsPlanned().booleanValue()) {
-						isSubTasksPlanned = true;
-						break;
-					}
-				} else if (element instanceof TaskDescriptorWrapperItemProvider) {
-					Object wrappedElement = TngUtil.unwrap(element);
-					if (wrappedElement instanceof TaskDescriptor) {
-						TaskDescriptor descriptor = (TaskDescriptor) wrappedElement;
-						if (!exportOnlyPlannedElements
-								|| descriptor.getIsPlanned().booleanValue()) {
-							isSubTasksPlanned = true;
-							break;
-						}
-					}
-				}
-			}
-		}
-
-		// create a task for the WorkBreakdownElement
-		// decided just to check the isPlanned flag on the WBS
-		boolean isPlannedTask = breakdownElement.getIsPlanned().booleanValue();
-		Task newTask = null;
-		if (!exportOnlyPlannedElements || exportOnlyPlannedElements
-				&& isPlannedTask) {
-			boolean suppressed = isSuppressed(breakdownElement);
-			if (!suppressed) {
-				newTask = addTask(elementOrWrapper, taskOLevel, proj);
-			}
-		}
-
-		// if export planned only wbs, then we need to do the role rollup
-		// calculation
-		if (exportOnlyPlannedElements && newTask != null
-				&& breakdownElement instanceof Activity
-				&& contentProvider != null && !isSubTasksPlanned) {
-			ArrayList rollupRoles = new ArrayList();
-			boolean rb = calculateRollupRoles(contentProvider,
-					breakdownElement, rollupRoles);
-			// if the whole subtree of the breakdownElemnt is not planned
-			// then roll up all the roles
-			if (!rb) {
-				HashSet rolesSet = new HashSet(rollupRoles);
-				for (Iterator iter = rolesSet.iterator(); iter.hasNext();) {
-					String roleName = (String) iter.next();
-					addAssignment(roleName, newTask.getUID().intValue(), proj);
-				}
-			}
-		}
-
-		// export the next level wbs
-		if (contentProvider != null) {
-			boolean suppressed = isSuppressed(breakdownElement);
-			if (!suppressed) {
-				elementPaths.push(breakdownElement.getGuid());
-				Object[] elements = contentProvider
-						.getElements(elementOrWrapper);
-				for (int i = 0; i < elements.length; i++) {
-					Object element = elements[i];
-
-					// get the current elementOrWrapper and the hierarcal guid
-					// path to it
-					currentElement = element;
-					String[] paths = new String[elementPaths.size()];
-					elementPaths.toArray(paths);
-					StringBuffer pathStr = new StringBuffer();
-					for (int j = 0; j < paths.length; j++) {
-						pathStr.append(paths[j] + "."); //$NON-NLS-1$
-					}
-					if (currentElement instanceof BreakdownElementWrapperItemProvider) {
-						Object wrapped = TngUtil.unwrap(element);
-						pathStr.append(((BreakdownElement) wrapped).getGuid());
-					} else {
-						pathStr.append(((BreakdownElement) currentElement)
-								.getGuid());
-					}
-					currentElementPath = pathStr.toString();
-					// if (debug) System.out.println(" path: " +
-					// currentElementPath);
-
-					generateProjectTask(contentProvider, element,
-							taskOLevel + 1, proj);
-				}
-				generateLinks(process, proj);
-				elementPaths.pop();
-			}
-		}
-
-	}
-
-	/**
-	 * Checks whether the given object is a suppressed work breakdown element in
-	 * its owning process.
-	 * 
-	 * @param object
-	 *            an object
-	 * @return <ocde>true</code> if the object is a suppressed work breakdown
-	 *         element in its owning process.
-	 */
-	protected boolean isSuppressed(Object object) {
-		if (object != null) {
-			if (object instanceof Descriptor) {
-				if (debug)
-					System.out.println("Descriptor = " //$NON-NLS-1$
-							+ ((Descriptor) object).getName());
-			}
-			Process owningProcess = TngUtil.getOwningProcess(object);
-			Suppression owningProcessSuppression = (Suppression) suppressionMap
-					.get(owningProcess);
-			if (owningProcessSuppression == null) {
-				owningProcessSuppression = new Suppression(owningProcess);
-				suppressionMap.put(owningProcess, owningProcessSuppression);
-			}
-			if (owningProcessSuppression.isSuppressed(object)) {
-				return true;
-			}
-			if (owningProcess != process
-					&& object instanceof WorkBreakdownElement) {
-				elementPaths.push(((WorkBreakdownElement) object).getGuid());
-				String[] paths = new String[elementPaths.size()];
-				elementPaths.toArray(paths);
-				Object wrapper = suppression.getObjectByPath(paths,
-						wbsAdapterFactory);
-				elementPaths.pop();
-				return suppression.isSuppressed(wrapper);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Adds a task to a Microsoft Project.
-	 * 
-	 * @param element
-	 *            a work breakdown element
-	 * @param taskOLevel
-	 *            the outline level
-	 * @param project
-	 *            a Microsoft Project object
-	 * @return the newly added task
-	 * @throws Exception
-	 *             if an error occurrs while performing the operation
-	 */
-	protected Task addTask(Object elementOrWrapper, int taskOLevel,
-			Project project) throws Exception {
-		Task task = addTask_(elementOrWrapper, taskOLevel, project);
-		if (task != null) {
-			WorkBreakdownElement element = (WorkBreakdownElement) TngUtil
-				.unwrap(elementOrWrapper);
-			taskToWbeMap.put(task, element);
-		}
-		return task;
-	}
-	
-	private Task addTask_(Object elementOrWrapper, int taskOLevel,
-			Project project) throws Exception {
-
-		if (elementOrWrapper == null) {
-			return null;
-		}
-
-		WorkBreakdownElement element = (WorkBreakdownElement) TngUtil
-				.unwrap(elementOrWrapper);
-		
-		Task task = projectFactory.createTask();
-		task.setName(getDisplayName(element));
-		task.setOutlineLevel(BigInteger.valueOf(taskOLevel));
-		task.setUID(BigInteger.valueOf(task_uid));
-		task.setID(BigInteger.valueOf(task_uid));
-		task.setType(BigInteger.valueOf(0));
-
-		GregorianCalendar gcDate = new GregorianCalendar();
-		// gcDate.add(GregorianCalendar.DATE, 80);
-		Date startDate = gcDate.getTime();
-		task.setStart(startDate);
-		// task.setDuration("PT20H0M0S");
-
-		String notes = getBriefDescription(element);
-		if (notes != null && notes.trim().length() > 0) {
-			task.setNotes(notes);
-		}
-
-		if (element instanceof Milestone) {
-			task.setMilestone(true);
-			task.setDurationFormat(BigInteger.valueOf(7));
-		}
-
-		// Assign the task to all the associated roles.
-		List rolesList = null;
-		if (element instanceof TaskDescriptor) {
-			rolesList = getRolesForTaskD((TaskDescriptor) element);
-		} else if (element instanceof org.eclipse.epf.uma.Task) {
-			rolesList = getRolesForTask((org.eclipse.epf.uma.Task) element);
-		}
-		if (rolesList != null) {
-			for (Iterator iter = rolesList.iterator(); iter.hasNext();) {
-				String roleName = (String) iter.next();
-				addAssignment(roleName, task_uid, project);
-			}
-		}
-
-		// Add the generated URL link to the task.
-		if (publishContentSite) {
-			String linkURL = getElementURL(element);
-			if (element instanceof TaskDescriptor) {
-				TaskDescriptor taskDescriptor = (TaskDescriptor) element;
-				org.eclipse.epf.uma.Task ref_edTask = taskDescriptor.getTask();
-				referencedTasks.add(ref_edTask);
-			}
-			task.setHyperlinkAddress(linkURL);
-		}
-
-		// aTask.setType(new BigInteger("1"));
-		// aTask.setStart(new Date());
-		// aTask.setSummary(false);
-		// aTask.setConstraintType(new BigInteger("2"));
-
-		// Add the task to the Microsoft Project object.
-		project.getTasks().getTask().add(task);
-
-		if (debug) {
-			System.out.println("$$$ theCurrent element: taskUid=" + task_uid //$NON-NLS-1$
-					+ ", " + currentElement); //$NON-NLS-1$
-			System.out.println("                  path: " + currentElementPath); //$NON-NLS-1$
-		}
-
-		// Store the task's local predecessors.
-		storeTaskPredecessors(element);
-
-		taskUidToWbsWapperPathMap.put(BigInteger.valueOf(task_uid),
-				currentElementPath);
-		wbsGuidToTaskUidMap
-				.put(element.getGuid(), BigInteger.valueOf(task_uid));
-
-		// get predecessors of a work breakdown element
-		IBSItemProvider adapter = (IBSItemProvider) wbsAdapterFactory.adapt(
-				elementOrWrapper, ITreeItemContentProvider.class);
-		PredecessorList currentPredList = adapter.getPredecessors();
-		List<MethodElement> guidPredList = new ArrayList<MethodElement>();
-		for (Iterator iter = currentPredList.iterator(); iter.hasNext();) {
-			Object e = (Object) iter.next();
-			if (debug)
-				System.out.println("    wrapperPredListMember: " + e); //$NON-NLS-1$
-			Object unwrappedE = TngUtil.unwrap(e);
-			if (unwrappedE instanceof WorkBreakdownElement) {
-				//guidPredList.add(((WorkBreakdownElement) unwrappedE).getGuid());
-				guidPredList.add((WorkBreakdownElement) unwrappedE);
-				if (debug)
-					System.out.println("    unwrappedPredListMember: " //$NON-NLS-1$
-							+ unwrappedE);
-			}
-			if (e instanceof ItemProviderAdapter) {
-				unwrappedE = ((ItemProviderAdapter) e).getTarget();
-				//guidPredList.add(((BreakdownElement) unwrappedE).getGuid());
-				guidPredList.add((BreakdownElement) unwrappedE);
-				if (debug)
-					System.out.println("    unwrappedPredListMember: " //$NON-NLS-1$
-							+ unwrappedE);
-			}
-		}
-		wbsWrapperPathToPredListMap.put(currentElementPath, guidPredList);
-		if (debug)
-			System.out.println("    __wrapperPredList: " + guidPredList); //$NON-NLS-1$
-
-		task_uid++;
-
-		return task;
-	}
-
-	private String getBriefDescription(WorkBreakdownElement element) {
-		if (element == null)
-			return null;
-
-		String briefDesc = element.getBriefDescription();
-		if ((briefDesc == null || briefDesc.trim().length() <= 0)) {
-			if (element instanceof TaskDescriptor) {
-				TaskDescriptor taskDescriptor = (TaskDescriptor) element;
-				org.eclipse.epf.uma.Task ref_edTask = taskDescriptor.getTask();
-				if (ref_edTask != null) {
-					MethodElement realizedElement = ConfigurationHelper.getCalculatedElement(ref_edTask, processConfig);
-					if (debug) System.out.println("$$$ realizedElement = " + realizedElement); //$NON-NLS-1$
-					if (realizedElement != null) {
-						EAttribute attribute = UmaPackage.eINSTANCE.getMethodElement_BriefDescription();
-						Object briefDescObj = ConfigurationHelper.calcAttributeFeatureValue(realizedElement, attribute, processConfig);
-						briefDesc = briefDescObj.toString();
-						if (debug) System.out.println("$$$ realized brief desc = " + briefDesc);	 //$NON-NLS-1$
-					}
-				}
-			}
-		}
-
-		return briefDesc;
-	}
-
-	private void addAssignment(String resName, int taskUid, Project proj) {
-		Assignment assignment = projectFactory.createAssignment();
-
-		assignment.setUID(BigInteger.valueOf(assign_uid));
-		assignment.setTaskUID(BigInteger.valueOf(taskUid));
-		BigInteger resID = (BigInteger) rolesToUidMap.get(resName);
-		assignment.setResourceUID(resID);
-
-		proj.getAssignments().getAssignment().add(assignment);
-
-		assign_uid++;
-	}
-
-	private List getRolesForTaskD(TaskDescriptor taskDescriptor) {
-		ArrayList rolesList = new ArrayList();
-
-		// RoleDescriptor roleDescrp = taskDescriptor.getPerformedPrimarilyBy();
-		RoleDescriptor roleDescrp = (RoleDescriptor) ConfigurationHelper
-				.getCalculatedElement(taskDescriptor.getPerformedPrimarilyBy(),
-						breakdownElementFilter.getMethodConfiguration());
-
-		if (roleDescrp != null) {
-			rolesList.add(getDisplayName(roleDescrp));
-		}
-		// List roleDescrpList = taskDescriptor.getAdditionallyPerformedBy();
-		List roleDescrpList = ConfigurationHelper.getCalculatedElements(
-				taskDescriptor.getAdditionallyPerformedBy(),
-				breakdownElementFilter.getMethodConfiguration());
-
-		for (Iterator iter = roleDescrpList.iterator(); iter.hasNext();) {
-			roleDescrp = (RoleDescriptor) iter.next();
-			rolesList.add(getDisplayName(roleDescrp));
-		}
-
-		return rolesList;
-	}
-
-	private List getRolesForTask(org.eclipse.epf.uma.Task umaTask) {
-		ArrayList rolesList = new ArrayList();
-
-		Role role = umaTask.getPerformedBy();
-		if (role != null) {
-			rolesList.add(getDisplayName(role));
-		}
-		List list = umaTask.getAdditionallyPerformedBy();
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			role = (Role) iter.next();
-			rolesList.add(getDisplayName(role));
-		}
-
-		return rolesList;
-	}
-
-	private boolean calculateRollupRoles(
-			IStructuredContentProvider contentProvider,
-			BreakdownElement breakdownElement, List rollupRoles) {
-
-		boolean isAnySubTaskPlanned = false;
-
-		Object[] elements = contentProvider.getElements(breakdownElement);
-		for (int i = 0; i < elements.length; i++) {
-			Object element = elements[i];
-			if (element instanceof Activity) {
-				if (!exportOnlyPlannedElements
-						|| ((Activity) element).getIsPlanned().booleanValue()) {
-					isAnySubTaskPlanned = true;
-				} else {
-					isAnySubTaskPlanned = calculateRollupRoles(contentProvider,
-							(BreakdownElement) element, rollupRoles);
-				}
-			} else if (element instanceof ActivityWrapperItemProvider) {
-				Object wrappedElement = TngUtil.unwrap(element);
-				if (wrappedElement instanceof Activity) {
-					if (!exportOnlyPlannedElements
-							|| ((Activity) wrappedElement).getIsPlanned()
-									.booleanValue()) {
-						isAnySubTaskPlanned = true;
-					} else {
-						isAnySubTaskPlanned = calculateRollupRoles(
-								contentProvider,
-								(BreakdownElement) wrappedElement, rollupRoles);
-					}
-				}
-			} else if (element instanceof TaskDescriptor) {
-				TaskDescriptor descriptor = (TaskDescriptor) element;
-				if (!exportOnlyPlannedElements
-						|| descriptor.getIsPlanned().booleanValue()) {
-					isAnySubTaskPlanned = true;
-				} else {
-					rollupRoles
-							.addAll(getRolesForTaskD((TaskDescriptor) element));
-				}
-			} else if (element instanceof TaskDescriptorWrapperItemProvider) {
-				Object wrappedElement = TngUtil.unwrap(element);
-				if (wrappedElement instanceof TaskDescriptor) {
-					TaskDescriptor descriptor = (TaskDescriptor) wrappedElement;
-					if (!exportOnlyPlannedElements
-							|| descriptor.getIsPlanned().booleanValue()) {
-						isAnySubTaskPlanned = true;
-					} else {
-						rollupRoles
-								.addAll(getRolesForTaskD((TaskDescriptor) wrappedElement));
-					}
-				}
-			}
-		}
-
-		return isAnySubTaskPlanned;
-	}
-
-	/**
-	 * Retrieves a work breakdown element's predecessors, stores them in an
-	 * <ocde>ArrayList</code>, and put it into a map.
-	 * 
-	 * @param element
-	 *            a work breakdown element
-	 */
-	private void storeTaskPredecessors(WorkBreakdownElement element) {
-		if (element == null) {
-			return;
-		}
-
-		List predecessors = element.getLinkToPredecessor();
-		List predList = new ArrayList();
-		if (predecessors != null && predecessors.size() > 0) {
-			for (Iterator i = predecessors.iterator(); i.hasNext();) {
-				WorkOrder workOrder = (WorkOrder) i.next();
-				BreakdownElement predecessor = workOrder.getPred();
-				if (debug) {
-					System.out.println("    localPredListMember: " //$NON-NLS-1$
-							+ predecessor);
-				}
-				if (predecessor != null) {
-					String predGuid = predecessor.getGuid();
-					if (predGuid != null)
-						predList.add(predGuid);
-				}
-			}
-		}
-		if (debug) {
-			System.out.println("   local predlist for " + element.getName() //$NON-NLS-1$
-					+ " = " + predList.toString()); //$NON-NLS-1$
-		}
-
-		wbsWapperPathToLocalPredListMap.put(currentElementPath, predList);
-	}
-
-	protected void generateLinks(Process process, Project project)
-			throws Exception {
-		EList tasks = project.getTasks().getTask();
-		for (Iterator iter = tasks.iterator(); iter.hasNext();) {
-			Task task = (Task) iter.next();
-			
-			BigInteger taskUid = task.getUID();
-			// skip the MS project hidden task with uid = 0
-			if (taskUid.intValue() == 0)
-				continue;
-
-			String wbsPathStr = (String) taskUidToWbsWapperPathMap.get(taskUid);
-
-			HashMap<String, WorkOrder> predGuidToWOMap = getPredGuidToWOMap(taskToWbeMap.get(task));
-			
-			// List predList = (ArrayList)
-			// wbsWapperPathToLocalPredListMap.get(wbsPathStr);
-			List predList = (ArrayList) wbsWrapperPathToPredListMap
-					.get(wbsPathStr);
-			if (predList != null) {
-				List removeList = new ArrayList();
-				for (Iterator iterator = predList.iterator(); iterator
-						.hasNext();) {
-					//String predGuid = (String) iterator.next();
-					MethodElement predElem = (MethodElement) iterator.next();
-					String predGuid = predElem.getGuid();
-					
-					BigInteger predTaskUid = (BigInteger) wbsGuidToTaskUidMap
-							.get(predGuid);
-
-					if (predTaskUid == null
-							|| predTaskUid.intValue() == taskUid.intValue()) {
-						continue;
-					}
-
-					if (debug) {
-						System.out.println("$$$ taskUid = " + taskUid //$NON-NLS-1$
-								+ ", wbsPathStr = " + wbsPathStr); //$NON-NLS-1$
-						System.out.println("    localPredList: " + predList); //$NON-NLS-1$
-						System.out.println("    found pred guid: " + predGuid); //$NON-NLS-1$
-					}
-
-					//removeList.add(predGuid);
-					removeList.add(predElem);
-
-					PredecessorLink preLink = projectFactory
-							.createPredecessorLink();
-					task.getPredecessorLink().add(preLink);
-					preLink.setPredecessorUID(predTaskUid);
-					
-					//preLink.setType(new BigInteger("1")); //$NON-NLS-1$
-					BigInteger bigInt = getLinkTypeInt(predGuidToWOMap.get(predGuid));
-					if (bigInt != null) {
-						preLink.setType(bigInt);
-					}
-					
-					preLink.setCrossProject(false);
-					preLink.setLinkLag(new BigInteger("0")); //$NON-NLS-1$
-					preLink.setLagFormat(new BigInteger("7")); //$NON-NLS-1$
-				}
-				predList.removeAll(removeList);
-			}
-		}
-	}
-
-	private BigInteger getLinkTypeInt(WorkOrder wo) {
-		if (wo == null) {
-			if (debug) {
-				System.out.println("Warning> getLinkTypeInt, wo == null.");
-			}
-			return null;
-		}
-		WorkOrderType woType = wo.getLinkType();
-		if (woType == WorkOrderType.FINISH_TO_START_LITERAL) {
-			return new BigInteger("1"); //$NON-NLS-1$
-		} 
-		if (woType == WorkOrderType.START_TO_START_LITERAL) {
-			return new BigInteger("3"); //$NON-NLS-1$
-		} 
-		if (woType == WorkOrderType.FINISH_TO_FINISH_LITERAL) {
-			return new BigInteger("0"); //$NON-NLS-1$
-		}
-		if (woType == WorkOrderType.START_TO_FINISH_LITERAL) {
-			return new BigInteger("2"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	private HashMap<String, WorkOrder> getPredGuidToWOMap(WorkBreakdownElement wbe) {
-		HashMap<String, WorkOrder> predGuidToWOMap = new HashMap<String, WorkOrder>();
-		if (wbe != null) {
-			List<WorkOrder> woList = wbe.getLinkToPredecessor();
-			int sz = woList == null ? 0 : woList.size();
-			for (int i = 0; i < sz; i++) {
-				WorkOrder wo = woList.get(i);
-				if (wo == null || wo.getPred() == null) {
-					continue;
-				}
-				predGuidToWOMap.put(wo.getPred().getGuid(), wo);
-			}
-		}
-		return predGuidToWOMap;
-	}
-
-	/**
-	 * Returns the generated HTML content file URL for a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return the URL of the generated HTML content file
-	 */
-	protected String getElementURL(MethodElement element) {
-		if (element == null)
-			return null;
-
-		String elementPath = null;
-		String elementFileName = null;
-		try {
-			elementPath = ResourceHelper.getElementPath(element);
-			elementFileName = ResourceHelper.getFileName(element,
-					ResourceHelper.FILE_EXT_HTML);
-		} catch (Exception e) {
-			e.printStackTrace();
-			return ""; //$NON-NLS-1$
-		}
-		if (elementPath != null && elementFileName != null) {
-			elementPath = elementPath.replace('\\', '/');
-			elementFileName = elementFileName.replace('\\', '/');
-			String url = contentFolderName
-					+ "/" + elementPath + elementFileName; //$NON-NLS-1$
-			return abTargetDir + File.separator + url;
-		} else {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Returns the display name of a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return the display name of the given element
-	 */
-	protected String getDisplayName(MethodElement element) {
-		String name = null;
-		if (element instanceof BreakdownElement) {
-			name = ProcessUtil.getPresentationName((BreakdownElement) element);
-		} else if (element instanceof DescribableElement) {
-			name = ((DescribableElement) element).getPresentationName();
-		}
-		if (name == null || name.length() == 0) {
-			name = element.getName();
-		}
-		return XMLUtil.escapeAttr(name);
-	}
-
-	/**
-	 * Publishes the selected configuration associated with the exported
-	 * process.
-	 * 
-	 * @param dir
-	 *            the output directory
-	 * @param config
-	 *            the configuration to publish
-	 * @param publishConfigOptions
-	 *            the publishing options
-	 * @return <code>true</code> if the configuration was published
-	 *         successfully, <code>false</code> otherwise
-	 * @throws Exception
-	 *             if an error occurs while publishing the configuration
-	 */
-	protected boolean publishConfiguration(String dir,
-			MethodConfiguration config, PublishOptions publishConfigOptions)
-			throws Exception {
-		PublishManager publishMgr = null;
-		try {
-			publishMgr = new PublishManager();
-			publishMgr.init(dir, config, new PublishHTMLOptions(
-					publishConfigOptions));
-
-			ExportMSPXMLOperation operation = new ExportMSPXMLOperation(
-					publishMgr);
-			PublishProgressMonitorDialog dlg = new PublishProgressMonitorDialog(
-					Display.getCurrent().getActiveShell(), publishMgr
-							.getViewBuilder());
-			boolean success = UIHelper.runWithProgress(operation,
-					dlg, true, ExportMSPResources.exportMSPWizard_title);
-			if (operation.getException() != null) {
-				throw operation.getException();
-			}
-			return success && !dlg.getProgressMonitor().isCanceled();
-		} catch (Exception e) {
-			throw e;
-		} finally {
-			if (publishMgr != null) {
-				publishMgr.dispose();
-				publishMgr = null;
-			}
-		}
-	}
-
-	/**
-	 * Prints the trace information for the Microsoft Project.
-	 */
-	private static void printMSProject(Project project) {
-		System.out.println("\n$$$ read-in project = " + project); //$NON-NLS-1$
-
-		EList tasks = project.getTasks().getTask();
-		for (Iterator iter = tasks.iterator(); iter.hasNext();) {
-			Task element = (Task) iter.next();
-			System.out.println("$$$ a task = " + element); //$NON-NLS-1$
-		}
-
-		EList resources = project.getResources().getResource();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			org.eclipse.epf.msproject.Resource element = (org.eclipse.epf.msproject.Resource) iter
-					.next();
-			System.out.println("$$$ a resource = " + element); //$NON-NLS-1$
-		}
-
-		EList assignments = project.getAssignments().getAssignment();
-		for (Iterator iter = assignments.iterator(); iter.hasNext();) {
-			Assignment element = (Assignment) iter.next();
-			System.out.println("$$$ an assignment = " + element); //$NON-NLS-1$
-		}
-
-		System.out.println("$$$===\n"); //$NON-NLS-1$
-	}
-	
-	protected HashMap<Task, WorkBreakdownElement> getTaskToWbeMap() {
-		return taskToWbeMap;
-	}
-	
-	//To be overriden by subclasses
-	protected void setProjectExtendedAttributes(Project project) {
-	}
-
-	//To be overriden by subclasses
-	protected void generateWPDs(MethodConfiguration config) {
-	}	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportOptions.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportOptions.java
deleted file mode 100644
index ed9a844..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/ExportOptions.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import java.util.HashMap;
-
-/**
- * A HashMap for Export Options
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- * 
- */
-public class ExportOptions extends HashMap {
-
-	private static final long serialVersionUID = -589701215913212273L;
-	
-	/**
-	 * The publish selected configuration option.
-	 */
-	public static final String PUBLISH_CONFIG = "publishConfig"; //$NON-NLS-1$
-
-	/**
-	 * The export only planned workbreakdown elements option.
-	 */
-	public static final String EXPORT_ONLY_PLANNED_ELEMENTS = "exportOnlyPlannedElements"; //$NON-NLS-1$
-
-	/**
-	 * The export effort estimates for workbreakdown elements option.
-	 */
-	public static final String EXPORT_ESTIMATES = "exportEstimates"; //$NON-NLS-1$
-
-	/**
-	 * The estimating model used to calculate the effort estimates of the
-	 * exported workbreakdown elements.
-	 */
-	public static final String ESTIMATING_MODEL = "estimatingModel"; //$NON-NLS-1$
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportOptions() {
-		super();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/IExportMSPService.java b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/IExportMSPService.java
deleted file mode 100644
index 04934a0..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/IExportMSPService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.msp;
-
-import org.eclipse.epf.uma.Process;
-
-/**
- * The interface for the Export Microsoft Project Service.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IExportMSPService {
-
-	/**
-	 * Export a process to a Microsoft Project file.
-	 * 
-	 * @param process
-	 *            a capability pattern or delivery process
-	 * @param exportOptions
-	 *            a collection of user specified export options
-	 * @return <code>true</code> if the operation was completed successfully
-	 * @throws ExportMSPServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public boolean exportMSProject(Process process,
-			ExportMSPOptions exportOptions) throws ExportMSPServiceException;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/Resources.properties b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/Resources.properties
deleted file mode 100644
index 09ac960..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/Resources.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Export Microsoft Project Wizard
-exportMSPWizard_title=Export Microsoft Project
-
-# Progress Messages
-exportMSPTask_name=Exporting selected process to Microsoft Project...
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/package.html b/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/package.html
deleted file mode 100644
index 6fa5220..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/src/org/eclipse/epf/export/msp/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for the Export Microsoft Project service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.msp/template/msproject_2003_template.xml b/1.5/plugins/org.eclipse.epf.export.msp/template/msproject_2003_template.xml
deleted file mode 100644
index bfe50c3..0000000
--- a/1.5/plugins/org.eclipse.epf.export.msp/template/msproject_2003_template.xml
+++ /dev/null
@@ -1,269 +0,0 @@
-<?xml version="1.0"?>
-<Project xmlns="http://epf.eclipse.org/msproject">
-<Name>msproject_2003_template.xml</Name>
-<Company>Eclipse.org</Company>
-<Author></Author>
-<CreationDate>2006-02-10T14:36:00</CreationDate>
-<LastSaved>2006-02-10T15:19:00</LastSaved>
-<ScheduleFromStart>1</ScheduleFromStart>
-<StartDate>2006-02-10T08:00:00</StartDate>
-<FinishDate>2006-02-10T08:00:00</FinishDate>
-<FYStartDate>1</FYStartDate>
-<CriticalSlackLimit>0</CriticalSlackLimit>
-<CurrencyDigits>2</CurrencyDigits>
-<CurrencySymbol>$</CurrencySymbol>
-<CurrencySymbolPosition>0</CurrencySymbolPosition>
-<CalendarUID>1</CalendarUID>
-<DefaultStartTime>08:00:00</DefaultStartTime>
-<DefaultFinishTime>17:00:00</DefaultFinishTime>
-<MinutesPerDay>480</MinutesPerDay>
-<MinutesPerWeek>2400</MinutesPerWeek>
-<DaysPerMonth>20</DaysPerMonth>
-<DefaultTaskType>0</DefaultTaskType>
-<DefaultFixedCostAccrual>3</DefaultFixedCostAccrual>
-<DefaultStandardRate>0</DefaultStandardRate>
-<DefaultOvertimeRate>0</DefaultOvertimeRate>
-<DurationFormat>7</DurationFormat>
-<WorkFormat>2</WorkFormat>
-<EditableActualCosts>0</EditableActualCosts>
-<HonorConstraints>0</HonorConstraints>
-<InsertedProjectsLikeSummary>1</InsertedProjectsLikeSummary>
-<MultipleCriticalPaths>0</MultipleCriticalPaths>
-<NewTasksEffortDriven>1</NewTasksEffortDriven>
-<NewTasksEstimated>1</NewTasksEstimated>
-<SplitsInProgressTasks>1</SplitsInProgressTasks>
-<SpreadActualCost>0</SpreadActualCost>
-<SpreadPercentComplete>0</SpreadPercentComplete>
-<TaskUpdatesResource>1</TaskUpdatesResource>
-<FiscalYearStart>0</FiscalYearStart>
-<WeekStartDay>0</WeekStartDay>
-<MoveCompletedEndsBack>0</MoveCompletedEndsBack>
-<MoveRemainingStartsBack>0</MoveRemainingStartsBack>
-<MoveRemainingStartsForward>0</MoveRemainingStartsForward>
-<MoveCompletedEndsForward>0</MoveCompletedEndsForward>
-<BaselineForEarnedValue>0</BaselineForEarnedValue>
-<AutoAddNewResourcesAndTasks>1</AutoAddNewResourcesAndTasks>
-<CurrentDate>2006-02-10T08:00:00</CurrentDate>
-<MicrosoftProjectServerURL>1</MicrosoftProjectServerURL>
-<Autolink>1</Autolink>
-<NewTaskStartDate>0</NewTaskStartDate>
-<DefaultTaskEVMethod>0</DefaultTaskEVMethod>
-<ProjectExternallyEdited>0</ProjectExternallyEdited>
-<ExtendedCreationDate>1984-01-01T00:00:00</ExtendedCreationDate>
-<ActualsInSync>1</ActualsInSync>
-<RemoveFileProperties>0</RemoveFileProperties>
-<AdminProject>0</AdminProject>
-<OutlineCodes/>
-<WBSMasks/>
-<ExtendedAttributes/>
-<Calendars>
-<Calendar>
-<UID>1</UID>
-<Name>Standard</Name>
-<IsBaseCalendar>1</IsBaseCalendar>
-<BaseCalendarUID>-1</BaseCalendarUID>
-<WeekDays>
-<WeekDay>
-<DayType>1</DayType>
-<DayWorking>0</DayWorking>
-</WeekDay>
-<WeekDay>
-<DayType>2</DayType>
-<DayWorking>1</DayWorking>
-<WorkingTimes>
-<WorkingTime>
-<FromTime>08:00:00</FromTime>
-<ToTime>12:00:00</ToTime>
-</WorkingTime>
-<WorkingTime>
-<FromTime>13:00:00</FromTime>
-<ToTime>17:00:00</ToTime>
-</WorkingTime>
-</WorkingTimes>
-</WeekDay>
-<WeekDay>
-<DayType>3</DayType>
-<DayWorking>1</DayWorking>
-<WorkingTimes>
-<WorkingTime>
-<FromTime>08:00:00</FromTime>
-<ToTime>12:00:00</ToTime>
-</WorkingTime>
-<WorkingTime>
-<FromTime>13:00:00</FromTime>
-<ToTime>17:00:00</ToTime>
-</WorkingTime>
-</WorkingTimes>
-</WeekDay>
-<WeekDay>
-<DayType>4</DayType>
-<DayWorking>1</DayWorking>
-<WorkingTimes>
-<WorkingTime>
-<FromTime>08:00:00</FromTime>
-<ToTime>12:00:00</ToTime>
-</WorkingTime>
-<WorkingTime>
-<FromTime>13:00:00</FromTime>
-<ToTime>17:00:00</ToTime>
-</WorkingTime>
-</WorkingTimes>
-</WeekDay>
-<WeekDay>
-<DayType>5</DayType>
-<DayWorking>1</DayWorking>
-<WorkingTimes>
-<WorkingTime>
-<FromTime>08:00:00</FromTime>
-<ToTime>12:00:00</ToTime>
-</WorkingTime>
-<WorkingTime>
-<FromTime>13:00:00</FromTime>
-<ToTime>17:00:00</ToTime>
-</WorkingTime>
-</WorkingTimes>
-</WeekDay>
-<WeekDay>
-<DayType>6</DayType>
-<DayWorking>1</DayWorking>
-<WorkingTimes>
-<WorkingTime>
-<FromTime>08:00:00</FromTime>
-<ToTime>12:00:00</ToTime>
-</WorkingTime>
-<WorkingTime>
-<FromTime>13:00:00</FromTime>
-<ToTime>17:00:00</ToTime>
-</WorkingTime>
-</WorkingTimes>
-</WeekDay>
-<WeekDay>
-<DayType>7</DayType>
-<DayWorking>0</DayWorking>
-</WeekDay>
-</WeekDays>
-</Calendar>
-</Calendars>
-<Tasks>
-<Task>
-<UID>0</UID>
-<ID>0</ID>
-<Type>1</Type>
-<IsNull>0</IsNull>
-<CreateDate>2006-02-10T14:36:00</CreateDate>
-<WBS>0</WBS>
-<OutlineNumber>0</OutlineNumber>
-<OutlineLevel>0</OutlineLevel>
-<Priority>500</Priority>
-<Start>2006-02-10T08:00:00</Start>
-<Finish>2006-02-10T08:00:00</Finish>
-<Duration>PT0H0M0S</Duration>
-<DurationFormat>53</DurationFormat>
-<Work>PT0H0M0S</Work>
-<ResumeValid>0</ResumeValid>
-<EffortDriven>0</EffortDriven>
-<Recurring>0</Recurring>
-<OverAllocated>0</OverAllocated>
-<Estimated>1</Estimated>
-<Milestone>0</Milestone>
-<Summary>1</Summary>
-<Critical>1</Critical>
-<IsSubproject>0</IsSubproject>
-<IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-<ExternalTask>0</ExternalTask>
-<EarlyStart>2006-02-10T08:00:00</EarlyStart>
-<EarlyFinish>2006-02-10T08:00:00</EarlyFinish>
-<LateStart>2006-02-10T08:00:00</LateStart>
-<LateFinish>2006-02-10T08:00:00</LateFinish>
-<StartVariance>0</StartVariance>
-<FinishVariance>0</FinishVariance>
-<WorkVariance>0</WorkVariance>
-<FreeSlack>0</FreeSlack>
-<TotalSlack>0</TotalSlack>
-<FixedCost>0</FixedCost>
-<FixedCostAccrual>3</FixedCostAccrual>
-<PercentComplete>0</PercentComplete>
-<PercentWorkComplete>0</PercentWorkComplete>
-<Cost>0</Cost>
-<OvertimeCost>0</OvertimeCost>
-<OvertimeWork>PT0H0M0S</OvertimeWork>
-<ActualDuration>PT0H0M0S</ActualDuration>
-<ActualCost>0</ActualCost>
-<ActualOvertimeCost>0</ActualOvertimeCost>
-<ActualWork>PT0H0M0S</ActualWork>
-<ActualOvertimeWork>PT0H0M0S</ActualOvertimeWork>
-<RegularWork>PT0H0M0S</RegularWork>
-<RemainingDuration>PT0H0M0S</RemainingDuration>
-<RemainingCost>0</RemainingCost>
-<RemainingWork>PT0H0M0S</RemainingWork>
-<RemainingOvertimeCost>0</RemainingOvertimeCost>
-<RemainingOvertimeWork>PT0H0M0S</RemainingOvertimeWork>
-<ACWP>0</ACWP>
-<CV>0</CV>
-<ConstraintType>0</ConstraintType>
-<CalendarUID>-1</CalendarUID>
-<LevelAssignments>1</LevelAssignments>
-<LevelingCanSplit>1</LevelingCanSplit>
-<LevelingDelay>0</LevelingDelay>
-<LevelingDelayFormat>8</LevelingDelayFormat>
-<IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-<HideBar>0</HideBar>
-<Rollup>0</Rollup>
-<BCWS>0</BCWS>
-<BCWP>0</BCWP>
-<PhysicalPercentComplete>0</PhysicalPercentComplete>
-<EarnedValueMethod>0</EarnedValueMethod>
-<ActualWorkProtected>PT0H0M0S</ActualWorkProtected>
-<ActualOvertimeWorkProtected>PT0H0M0S</ActualOvertimeWorkProtected>
-</Task>
-</Tasks>
-<Resources>
-<Resource>
-<UID>0</UID>
-<ID>0</ID>
-<Type>1</Type>
-<IsNull>0</IsNull>
-<WorkGroup>0</WorkGroup>
-<MaxUnits>1</MaxUnits>
-<PeakUnits>0</PeakUnits>
-<OverAllocated>0</OverAllocated>
-<CanLevel>1</CanLevel>
-<AccrueAt>3</AccrueAt>
-<Work>PT0H0M0S</Work>
-<RegularWork>PT0H0M0S</RegularWork>
-<OvertimeWork>PT0H0M0S</OvertimeWork>
-<ActualWork>PT0H0M0S</ActualWork>
-<RemainingWork>PT0H0M0S</RemainingWork>
-<ActualOvertimeWork>PT0H0M0S</ActualOvertimeWork>
-<RemainingOvertimeWork>PT0H0M0S</RemainingOvertimeWork>
-<PercentWorkComplete>0</PercentWorkComplete>
-<StandardRate>0</StandardRate>
-<StandardRateFormat>2</StandardRateFormat>
-<Cost>0</Cost>
-<OvertimeRate>0</OvertimeRate>
-<OvertimeRateFormat>2</OvertimeRateFormat>
-<OvertimeCost>0</OvertimeCost>
-<CostPerUse>0</CostPerUse>
-<ActualCost>0</ActualCost>
-<ActualOvertimeCost>0</ActualOvertimeCost>
-<RemainingCost>0</RemainingCost>
-<RemainingOvertimeCost>0</RemainingOvertimeCost>
-<WorkVariance>0</WorkVariance>
-<CostVariance>0</CostVariance>
-<SV>0</SV>
-<CV>0</CV>
-<ACWP>0</ACWP>
-<CalendarUID>2</CalendarUID>
-<BCWS>0</BCWS>
-<BCWP>0</BCWP>
-<IsGeneric>0</IsGeneric>
-<IsInactive>0</IsInactive>
-<IsEnterprise>0</IsEnterprise>
-<BookingType>0</BookingType>
-<ActualWorkProtected>PT0H0M0S</ActualWorkProtected>
-<ActualOvertimeWorkProtected>PT0H0M0S</ActualOvertimeWorkProtected>
-<CreationDate>2006-02-10T14:36:00</CreationDate>
-</Resource>
-</Resources>
-<Assignments/>
-</Project>
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/.classpath b/1.5/plugins/org.eclipse.epf.export.xml/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/.options b/1.5/plugins/org.eclipse.epf.export.xml/.options
deleted file mode 100644
index d731bd7..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the xml export plug-in
-org.eclipse.epf.export.xml/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/.project b/1.5/plugins/org.eclipse.epf.export.xml/.project
deleted file mode 100644
index 7179e06..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.export.xml</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.export.xml/META-INF/MANIFEST.MF
deleted file mode 100644
index 0487b23..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.export.xml;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.export.xml.ExportXMLPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.authoring.ui;visibility:=reexport,
- org.eclipse.epf.dataexchange;visibility:=reexport,
- org.eclipse.epf.export;visibility:=reexport,
- org.eclipse.epf.xml.uma;visibility:=reexport,
- org.eclipse.ui,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.export.xml,
- org.eclipse.epf.export.xml.preferences,
- org.eclipse.epf.export.xml.services,
- org.eclipse.epf.export.xml.wizards
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/build.properties b/1.5/plugins/org.eclipse.epf.export.xml/build.properties
deleted file mode 100644
index 68bcc2f..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
-               plugin.properties,\
-               plugin.xml,\
-               icons/
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/icons/full/obj16/XMLFile.gif b/1.5/plugins/org.eclipse.epf.export.xml/icons/full/obj16/XMLFile.gif
deleted file mode 100644
index 83b44bb..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/icons/full/obj16/XMLFile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/icons/full/wizban/ExportXML.gif b/1.5/plugins/org.eclipse.epf.export.xml/icons/full/wizban/ExportXML.gif
deleted file mode 100644
index e249831..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/icons/full/wizban/ExportXML.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/plugin.properties b/1.5/plugins/org.eclipse.epf.export.xml/plugin.properties
deleted file mode 100644
index 3e304aa..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Export XML Plug-in
-providerName=Eclipse.org
-
-# Export XML Wizard
-exportXMLWizardName=XML
-exportXMLWizardDescription=Export method library content to a XML file.
-
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/plugin.xml b/1.5/plugins/org.eclipse.epf.export.xml/plugin.xml
deleted file mode 100644
index 7b46464..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/plugin.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.exportWizards">
-      <wizard
-            category="org.eclipse.epf.ui.exportWizards.category"
-            class="org.eclipse.epf.export.xml.wizards.ExportXMLWizard"
-            icon="icons/full/obj16/XMLFile.gif"
-            id="org.eclipse.epf.export.xml.wizards.ExportXMLWizard"
-            name="%exportXMLWizardName">
-         <description>
-               %exportXMLWizardDescription
-         </description>
-      </wizard>
-   </extension>
-
-   <extension
-         point="org.eclipse.epf.ui.exportWizards">
-      <wizard id="org.eclipse.epf.export.xml.wizards.ExportXMLWizard"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/ExportXMLPlugin.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/ExportXMLPlugin.java
deleted file mode 100644
index 2c8c1f8..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/ExportXMLPlugin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Export XML plug-in class.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportXMLPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static ExportXMLPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportXMLPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static ExportXMLPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/ExportXMLResources.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/ExportXMLResources.java
deleted file mode 100644
index 5be1439..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/ExportXMLResources.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Export XML message resource bundle accessor class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class ExportXMLResources extends NLS {
-
-	private static String BUNDLE_NAME = ExportXMLResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private ExportXMLResources() {
-		// Do not instantiate
-	}
-
-	public static String exportXMLWizard_title;
-
-	public static String exportLibraryRadioButton_text;
-
-	public static String exportPluginsRadioButton_text;
-
-	public static String exportConfigsRadioButton_text;
-
-	public static String selectXMLFilePage_title;
-
-	public static String selectXMLFilePage_desc;
-
-	public static String fileLabel_text;
-
-	public static String browseButton_text;
-
-	public static String overwriteText_msg;
-
-	public static String exportingXML_text;
-
-	public static String invalidXMLFile_error;
-
-	public static String exportXMLWizard_error;
-
-	public static String exportXMLWizard_reviewLog;
-
-	public static String selectExportTypePage_desc;
-
-	public static String exportXMLService_error;
-
-	public static String exportXMLService_feature_error;
-
-	public static String xmlLibrary_error_load_xml;
-
-	public static String xmlLibrary_no_plugin;
-
-	public static String xmlLibrary_no_feature;
-
-	public static String xmlLibrary_no_class;
-
-	public static String xmlLibrary_error_create_element;
-
-	public static String xmlLibrary_error_set_value;
-
-	public static String xmlLibrary_invalid_feature_value;
-
-	public static String xmlLibrary_error_set_value_2;
-
-	public static String xmlLibrary_error_set_value_3;
-
-	public static String xmlLibrary_error_set_reference;
-
-	public static String xmlLibrary_error_process_wrong_container;
-
-	public static String xmlLibrary_new_id;
-
-	public static String xmlLibrary_id_not_unique;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ExportXMLResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/Resources.properties b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/Resources.properties
deleted file mode 100644
index 2827e7c..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/Resources.properties
+++ /dev/null
@@ -1,57 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-#
-# Message ID Range:
-#
-
-# Export XML Wizard
-exportXMLWizard_title=Export XML
-
-# Select Export Type Wizard Page
-selectExportTypePage_desc=Select the type of method library content to export.
-exportLibraryRadioButton_text=Export the entire method library
-exportPluginsRadioButton_text=Export one or more method plug-ins
-exportConfigsRadioButton_text=Export a method configuration
-
-# Select Destination XML File Wizard Page
-selectXMLFilePage_title=Specify export file
-selectXMLFilePage_desc=Specify a destination XML file to store the exported method library content.
-fileLabel_text=XML File:
-browseButton_text=Browse...
-
-# Overwrite Confirmation Dialog
-overwriteText_msg=''{0}'' already exists.\nDo you want to overwrite it?
-
-# Progress Messages
-exportingXML_text=Export method library content to XML file...
-
-# Error Messages
-invalidXMLFile_error=The specified XML file is not valid.
-exportXMLWizard_error=IUPM0000E: The Export failed: {0}
-exportXMLWizard_reviewLog=Export completed. Please review the log files under the export directory.
-exportXMLService_error=Error exporting library: {0}
-exportXMLService_feature_error=Error setting feature value:: Element={0}, feature={1}
-xmlLibrary_error_load_xml=Unable to load XML source ''{0}''
-xmlLibrary_no_plugin=No method plug-in for id {0}
-xmlLibrary_no_feature=Unable to get XML feature for {0}_{1}
-xmlLibrary_no_class=Unable to get EClass for {0}
-xmlLibrary_error_create_element=Error creating element, do not know how to set value for feature {0}
-xmlLibrary_error_set_value=Error creating element, cannot set value {0} to container {1}
-xmlLibrary_invalid_feature_value=Invalid attribute feature value for feature {0}, with value {1}
-xmlLibrary_error_set_value_2=Error setting attribute, Unable to set value for feature={0}, object={1}, value={2}
-xmlLibrary_error_set_value_3=Don''t know how to set value for feature={0}, object={1}, value={2}
-xmlLibrary_error_set_reference=Error setting reference, Unable to set value for feature={0}, object={1}, value={2}
-xmlLibrary_error_process_wrong_container=Process ''{0}'' does not have a valid container. The container is of type ''{1}'', which is not a process package.
-xmlLibrary_new_id=Element {0} is assigned with a new id {1} because it does not have a valid one
-xmlLibrary_id_not_unique=Element Id ''{0}'' is used by more than one element
-
-
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/package.html b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/package.html
deleted file mode 100644
index e309989..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the activator for managing the Export XML plug-in's life cycle.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/preferences/ExportXMLPreferences.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/preferences/ExportXMLPreferences.java
deleted file mode 100644
index a05fbc4..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/preferences/ExportXMLPreferences.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.preferences;
-
-import org.eclipse.epf.export.xml.ExportXMLPlugin;
-import org.eclipse.epf.export.xml.services.ExportXMLData;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * The Export XML preferences.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportXMLPreferences {
-
-	/**
-	 * The export type preference key.
-	 */
-	public static final String EXPORT_TYPE = "exportType"; //$NON-NLS-1$
-
-	/**
-	 * The exported XML file preference key.
-	 */
-	public static final String XML_FILE = "xmlFile"; //$NON-NLS-1$
-
-	static {
-		// Initialize the default preference values.
-		IPreferenceStore store = ExportXMLPlugin.getDefault()
-				.getPreferenceStore();
-		store.setDefault(EXPORT_TYPE, ExportXMLData.EXPORT_METHOD_LIBRARY); 
-		store.setDefault(XML_FILE, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the export type preference.
-	 * 
-	 * @return the export type preference
-	 */
-	public static int getExportType() {
-		return ExportXMLPlugin.getDefault().getPreferenceStore().getInt(
-				EXPORT_TYPE);
-	}
-
-	/**
-	 * Sets the exported type preference.
-	 * 
-	 * @param exportType
-	 *            the user specified export type
-	 */
-	public static void setExportType(int exportType) {
-		ExportXMLPlugin.getDefault().getPreferenceStore().setValue(EXPORT_TYPE,
-				exportType);
-	}
-
-	/**
-	 * Returns the exported XML file preference.
-	 * 
-	 * @return the exported XML file preference
-	 */
-	public static String getXMLFile() {
-		return ExportXMLPlugin.getDefault().getPreferenceStore().getString(
-				XML_FILE);
-	}
-
-	/**
-	 * Sets the exported XML file preference.
-	 * 
-	 * @param path
-	 *            the absolute path to a XML file
-	 */
-	public static void setXMLFile(String path) {
-		ExportXMLPlugin.getDefault().getPreferenceStore().setValue(XML_FILE,
-				path);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/preferences/package.html b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/preferences/package.html
deleted file mode 100644
index 12c20c5..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the Export XML service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportResourceHandler.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportResourceHandler.java
deleted file mode 100644
index 1b40f42..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportResourceHandler.java
+++ /dev/null
@@ -1,197 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.services;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.dataexchange.util.BaseResourceHandler;
-import org.eclipse.epf.dataexchange.util.UrlInfo;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The resource handler for content in the exported library.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ExportResourceHandler extends BaseResourceHandler {
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportResourceHandler(File sourceLibRoot, File targetLibRoot) {
-		super(sourceLibRoot, targetLibRoot);
-	}
-
-	/**
-	 * resolve the url. For XML export, we should reserve the resource locations.
-	 */
-	public UrlInfo resolveFileUrl(Object owner, String srcUrl) throws Exception {
-		return loadUrlInfoWithFixedPath(owner, srcUrl);
-	}
-
-	
-	/**
-	 * the resource path will be relative to the libary root. urls needs to be
-	 * fixed
-	 * 
-	 * @param owner
-	 *            the owner object in the target library
-	 * @param srcUrl
-	 * @return
-	 */
-	private UrlInfo loadUrlInfoWithFixedPath(Object owner, String srcUrl) {
-		UrlInfo info = new UrlInfo();
-		info.sourceUrl = srcUrl;
-		info.targetUrl = srcUrl;
-		String srcFile = getFileRelPath(owner, srcUrl);
-		org.eclipse.epf.xml.uma.MethodElement ownerElem = null;
-		if (owner instanceof org.eclipse.epf.xml.uma.MethodElement) {
-			ownerElem = (org.eclipse.epf.xml.uma.MethodElement) owner;
-		}
-		if (srcFile != null && ownerElem != null) {			
-			MethodPlugin srcPlugin = getSourcePlugin(ownerElem);
-			ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(srcPlugin);
-			String srcPluginPath = libResMgr.getPhysicalPluginPath(srcPlugin);
-			File srcRoot = (new File(srcPluginPath)).getParentFile();
-			
-			info.sourceFile = new File(srcRoot, srcFile);
-			if (!info.sourceFile.isFile() || !info.sourceFile.exists()) {
-				String newSrcFile = null;
-				try {
-					newSrcFile = NetUtil.decodeURL(srcFile);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-				if (newSrcFile != null) {
-					srcFile = newSrcFile;
-					info.sourceFile = new File(srcRoot, srcFile);
-				}
-			}
-			info.targetFile = new File(targetLibRoot, srcFile);
-			info.targetUrl = srcFile.replace(File.separatorChar, '/');
-		}
-
-		return info;
-	}
-
-	protected static MethodPlugin getSourcePlugin(org.eclipse.epf.xml.uma.MethodElement ownerElem) {
-		ILibraryManager manager = LibraryService.getInstance()
-		.getCurrentLibraryManager();
-		if (manager == null) {
-			throw new UnsupportedOperationException();
-		}
-		MethodElement element = manager.getMethodElement(ownerElem.getId());
-		if (element == null) {
-			throw new UnsupportedOperationException();
-		}
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-		if (plugin == null) {
-			throw new UnsupportedOperationException();
-		}
-		return plugin;
-	}
-
-	private String getFileRelPath(Object owner, String srcUrl) {
-		try {
-			if (owner instanceof org.eclipse.epf.xml.uma.MethodElement) {
-				String id = ((org.eclipse.epf.xml.uma.MethodElement) owner)
-						.getId();
-				ILibraryManager manager = LibraryService.getInstance()
-						.getCurrentLibraryManager();
-				if (manager != null) {
-					MethodElement element = manager.getMethodElement(id);
-					if (element != null) {
-						File f = new File(new File(sourceLibRoot,
-								ResourceHelper.getElementPath(element)), srcUrl);
-						String path = f.getCanonicalPath();
-						return path.substring(sourceLibRoot.getCanonicalPath()
-								.length() + 1);
-					}
-				}
-			}
-		} catch (IOException e) {
-			// Log error here
-		}
-
-		return null;
-	}
-
-	/**
-	 * copying the resource file from the source library to the target
-	 * 
-	 * @param sourceFile the file path relative to the source root
-	 */
-	public void copyResource(String sourceFile, EObject obj, org.eclipse.epf.uma.MethodPlugin umaPlugin) {
-		ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(umaPlugin);
-		String srcPluginPath = libResMgr.getPhysicalPluginPath(umaPlugin);
-		File srcPluginRoot = new File(srcPluginPath);
-		
-		File src = new File(srcPluginRoot.getParentFile(), sourceFile);
-		if ( src.exists() ) {
-			File tgt = new File(targetLibRoot, sourceFile);
-			FileUtil.copyFile(src, tgt);
-		}
-	}
-	
-//	/**
-//	 * the resource path will be relative to the owner element. urls will not be
-//	 * changed but resource files is relicated.
-//	 * 
-//	 * @param owner
-//	 * @param srcUrl
-//	 * @return
-//	 */
-//	private UrlInfo loadUrlInfoWithRelativePath(Object owner, String srcUrl) {
-//		UrlInfo info = new UrlInfo();
-//
-//		try {
-//			info.sourceUrl = srcUrl;
-//			info.targetUrl = srcUrl; // no url change
-//
-//			// get the rmc object
-//			if (owner instanceof org.eclipse.epf.xml.uma.MethodElement) {
-//				String id = ((org.eclipse.epf.xml.uma.MethodElement) owner)
-//						.getId();
-//				ILibraryManager manager = LibraryService.getInstance()
-//						.getCurrentLibraryManager();
-//				if (manager != null) {
-//					MethodElement element = manager.getMethodElement(id);
-//					if (element != null) {
-//						File f = new File(new File(sourceLibRoot,
-//								ResourceHelper.getElementPath(element)), srcUrl);
-//						f = f.getCanonicalFile();
-//
-//						info.sourceFile = f;
-//					}
-//				}
-//			}
-//
-//			info.targetFile = new File(targetLibRoot, srcUrl)
-//					.getCanonicalFile();
-//
-//		} catch (IOException e) {
-//			// log error TODO
-//		}
-//		return info;
-//	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLData.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLData.java
deleted file mode 100644
index 329402e..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLData.java
+++ /dev/null
@@ -1,144 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.services;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * Stores the selections and settings made by the user in the Export XML wizard.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportXMLData {
-
-	public static final int EXPORT_METHOD_LIBRARY = 1;
-
-	public static final int EXPORT_METHOD_PLUGINS = 2;
-
-	public static final int EXPORT_METHOD_CONFIGS = 3;
-
-	protected int exportType = EXPORT_METHOD_LIBRARY;
-
-	protected List selectedPlugins;
-	
-	protected HashSet associatedConfigs;
-
-	protected List selectedConfigs;
-
-	protected String xmlFile;
-
-	/**
-	 * Gets the user specified export type.
-	 * 
-	 * @return the type of export operation to perform.
-	 */
-	public int getExportType() {
-		return exportType;
-	}
-
-	/**
-	 * Sets the user specified export type.
-	 * 
-	 * @param exporType
-	 *            the type of export operation to perform
-	 */
-	public void setExportType(int exportType) {
-		this.exportType = exportType;
-	}
-
-	/**
-	 * Gets the user selected method plug-ins.
-	 * 
-	 * @return a list of method plug-ins
-	 */
-	public List getSelectedPlugins() {
-		return selectedPlugins;
-	}
-
-	/**
-	 * Sets the associated configs with respected to selected plug-ins
-	 * 
-	 * @param associatedConfigMap
-	 *           Map of selected plug-ins to associated configs
-	 */
-	public void setAssociatedConfigs(Map associatedConfigMap) {
-		if (associatedConfigMap == null || associatedConfigMap.isEmpty()) {
-			return;
-		}
-		associatedConfigs = new HashSet(); 
-		for (Iterator it = associatedConfigMap.values().iterator(); it.hasNext();) {
-			List configList = (List) it.next();
-			int sz = configList == null ? 0 : configList.size();
-			for (int i=0; i<sz; i++) {
-				MethodConfiguration config = (MethodConfiguration) configList.get(i);
-				if (!associatedConfigs.contains(config.getGuid())) {
-					associatedConfigs.add(config.getGuid());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the user selected method plug-ins.
-	 * 
-	 * @param plugins
-	 *            a list of method plug-ins
-	 */
-	public void setSelectedPlugins(List plugins) {
-		selectedPlugins = plugins;
-	}
-	
-	/**
-	 * Gets the user selected method configurations.
-	 * 
-	 * @return a list of method configurations
-	 */
-	public List getSelectedConfigs() {
-		return selectedConfigs;
-	}
-
-	/**
-	 * Sets the user selected method configurations.
-	 * 
-	 * @param configs
-	 *            a list of method configurations
-	 */
-	public void setSelectedConfigs(List configs) {
-		selectedConfigs = configs;
-	}
-
-	/**
-	 * Gets the user specified destination XML file.
-	 * 
-	 * @return an absolute path to the XML file
-	 */
-	public String getXMLFile() {
-		return xmlFile;
-	}
-
-	/**
-	 * Sets the user specified destination XML file.
-	 * 
-	 * @param xmlFile
-	 *            an absolute path to the XML file
-	 */
-	public void setXMLFile(String xmlFile) {
-		this.xmlFile = xmlFile;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLLogger.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLLogger.java
deleted file mode 100644
index da53348..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLLogger.java
+++ /dev/null
@@ -1,35 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.services;
-
-import java.io.File;
-
-import org.eclipse.epf.dataexchange.util.FileLogger;
-
-
-/**
- * Logger class for xml export
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ExportXMLLogger extends FileLogger {
-
-	private static final String LOGS_FOLDER = "logs"; //$NON-NLS-1$
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportXMLLogger(File logRoot) {
-		super(new File(logRoot, LOGS_FOLDER));
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLService.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLService.java
deleted file mode 100644
index 2f4857c..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/ExportXMLService.java
+++ /dev/null
@@ -1,667 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.services;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-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.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-import org.eclipse.epf.dataexchange.util.ContentProcessor;
-import org.eclipse.epf.dataexchange.util.IResourceHandler;
-import org.eclipse.epf.diagram.ui.service.DiagramImageService;
-import org.eclipse.epf.export.services.DiagramHandler;
-import org.eclipse.epf.export.xml.ExportXMLPlugin;
-import org.eclipse.epf.export.xml.ExportXMLResources;
-import org.eclipse.epf.library.IConfigurationManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.MigrationUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * XmlExport service class to process the exporting task
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ExportXMLService {
-
-	// String xmlPath;
-	private ExportXMLData data;
-	
-	private boolean debug = ExportXMLPlugin.getDefault().isDebugging();
-
-	private XMLLibrary xmlLib;
-
-	private List discardedElements = new ArrayList();
-
-	ExportXMLLogger logger = null;
-
-	// in case we need to mapping the uma objects to xml objects
-	// such as the content categories
-	private Map umaIdToXmlIdMap = new HashMap();
-	
-	private DiagramHandler diagramHandler;
-	
-	//tds with steps
-	private Map<String, TaskDescriptor> tdMap;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportXMLService(ExportXMLData data) {
-		this.data = data;
-		logger = new ExportXMLLogger(new File(this.data.xmlFile)
-				.getParentFile());
-	}
-	/**
-	 * Gets the logger file.
-	 */
-	public File getLogPath() {
-		return logger.getLogPath();
-	}
-
-	/**
-	 * Dispose
-	 */
-	public void dispose() {
-		logger.dispose();
-	}
-
-	/**
-	 * Does XML library export.
-	 */
-	public void doExport(IProgressMonitor monitor) {
-		try {
-
-			IResourceHandler handler = new ExportResourceHandler(
-					new File(LibraryService.getInstance()
-							.getCurrentMethodLibraryLocation()), new File(data
-							.getXMLFile()).getParentFile());
-			ContentProcessor contentProc = new ContentProcessor(handler,
-					this.logger);
-			
-			diagramHandler = new DiagramHandler(
-					new File(LibraryService.getInstance()
-							.getCurrentMethodLibraryLocation()), new File(data
-							.getXMLFile()).getParentFile()) {
-				
-				public void visitElementMap(int passId) {
-					if (passId != 0) {
-						return;
-					}
-/*					String libFolderPath = getSourceLibRoot().getAbsolutePath();
-					int ix = libFolderPath.length();*/
-					
-					Map<String, MapEntryValue> map = getElementMap();
-					for (Iterator<MapEntryValue> it = map.values().iterator(); it.hasNext(); ) {
-						MapEntryValue value = it.next();
-						if (value.targetFile == null) {
-							continue;
-						} else if (value.sourceFile != null) {
-							EDataObject xmlObj = getXmlObject(value.element);
-							if (xmlObj instanceof org.eclipse.epf.xml.uma.Process) {
-								org.eclipse.epf.xml.uma.Process proc = 
-													(org.eclipse.epf.xml.uma.Process) xmlObj;
-								String uri = value.sourceFile.getAbsolutePath();
-								String srcRootFolderPath = getRoot(value.element).getAbsolutePath();
-								int ix = srcRootFolderPath.length();
-								
-								uri = uri.substring(ix + 1);
-								uri = URI.createFileURI(uri).toString();
-								proc.setDiagramURI(uri);
-							}		
-						} 
-					}	
-				}
-				
-				public void execute() {
-					super.execute();
-					SafeUpdateController.syncExec(new Runnable() {
-						public void run() {
-							exportDiagramImageFiles();
-						}
-					});
-				}
-
-				private void exportDiagramImageFiles() {
-					String folderPath = LibraryService.getInstance().getCurrentMethodLibraryLocation();
-					
-					DiagramImageService diagramService = new DiagramImageService(null);
-					diagramService.setForXMLExport(true);
-					
-					try {
-						Map<String, MapEntryValue> map = getElementMap();
-						for (Iterator<MapEntryValue> it = map.values().iterator(); it.hasNext(); ) {
-							MapEntryValue value = it.next();
-							org.eclipse.epf.uma.Process proc = (org.eclipse.epf.uma.Process) value.element;
-							MethodConfiguration config = proc.getDefaultContext();
-							if (config == null) {
-								continue;
-							}
-							diagramService.setConfig(config);
-							IConfigurationManager mgr = LibraryService.getInstance().getConfigurationManager(config);
-							if (mgr == null) {
-								continue;
-							}
-							ElementLayoutManager layoutMgr = mgr.getElementLayoutManager();
-							if (layoutMgr == null) {
-								continue;
-							}
-							IFilter filter = layoutMgr.getDiagramAdapterFactory().getFilter();
-							
-							File diagramXmiFile = value.targetFile;
-							if (diagramXmiFile == null || !diagramXmiFile.exists()) {
-								continue;
-							}
-							diagramService.setPubDir(diagramXmiFile.getParentFile());
-							
-							Map activities = MigrationUtil.getActivities(proc, true);	
-							for (Activity act: (Collection<Activity>) activities.values()) {
-								String[] types = {	ResourceHelper.DIAGRAM_TYPE_WORKFLOW,
-													ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL,
-													ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY};
-								
-								for (int i = 0; i < types.length; i++) {
-									String imagePath = ResourceHelper.getXmlExportedDiagramImageFileName(act, types[i], ResourceHelper.FILE_EXT_JPEG);
-									try {
-										diagramService.saveDiagram(act, imagePath, types[i], filter, Suppression.getSuppression(proc));
-									} catch (Exception e) {
-										if (debug) {
-											logger.logError(NLS.bind(ExportXMLResources.exportXMLService_error,
-													e.getMessage()), e);
-										}
-									}
-								}
-							}
-						}
-						
-					} catch (Exception e) {
-						if (debug) {
-							logger.logError(NLS.bind(ExportXMLResources.exportXMLService_error,
-									e.getMessage()), e);
-						}
-					} finally {										
-						diagramService.dispose();
-					}
-				}
-			};
-
-			// FeatureManager.INSTANCE.printFeatureNameMapping();
-
-			// export the current library to the xml file
-			// get the current library instance and export all to the xml
-			MethodLibrary src = LibraryService.getInstance()
-					.getCurrentMethodLibrary();
-
-			this.xmlLib = new XMLLibrary(contentProc, logger, data
-					.getXMLFile());
-
-			this.xmlLib.createLibrary(src.getGuid(), src.getName());
-			EDataObject target = this.xmlLib.getRoot();
-
-			creatEDataObjectTree(src, target);
-			iteratEDataObject(src);
-
-			this.xmlLib.fixLibraryForExport();
-			this.xmlLib.fixTaskDescriptorsForExport(tdMap);
-			
-			diagramHandler.visitElementMap(0);
-			if (data.exportType == ExportXMLData.EXPORT_METHOD_PLUGINS) {
-				xmlLib.storeExtraInfo(src.getMethodPlugins());
-			}
-			this.xmlLib.save();
-			diagramHandler.execute();
-
-		} catch (Exception e) {
-			logger.logError(NLS.bind(ExportXMLResources.exportXMLService_error,
-					e.getMessage()), e);
-		}
-	}
-
-	private boolean isPluginSelected(MethodPlugin plugin) {
-		if (data.exportType == ExportXMLData.EXPORT_METHOD_LIBRARY) {
-			return true;
-		} else if (data.exportType == ExportXMLData.EXPORT_METHOD_PLUGINS) {
-			return (data.selectedPlugins != null)
-					&& data.selectedPlugins.contains(plugin);
-		} else if (data.exportType == ExportXMLData.EXPORT_METHOD_CONFIGS) {
-			return false;
-		} else {
-			return true;
-		}
-	}
-
-	private boolean isConfigExcluded(MethodConfiguration config) {
-		if (data.exportType == ExportXMLData.EXPORT_METHOD_PLUGINS) {
-			return data.associatedConfigs == null || 
-					!data.associatedConfigs.contains(config.getGuid());
-		} 
-		return false;
-	}
-	
-	private void creatEDataObjectTree(MethodElement srcObj,
-			EDataObject targetObj) {
-
-		// if it's a plugin, skip all the system packages
-		// and find the top most user packages
-		if (srcObj instanceof MethodPlugin) {
-
-			MethodPlugin plugin = (MethodPlugin) srcObj;
-			if (!isPluginSelected(plugin)) {
-				return;
-			}
-
-			// all system packages are discarded
-			discardedElements.addAll(TngUtil.getAllSystemPackages(plugin));
-
-			List topmostUserPackages = getTopmostUserPackage(plugin);
-			List categoryPkgs = TngUtil.getContentCategoryPackages(plugin);
-
-			org.eclipse.epf.xml.uma.ContentCategoryPackage xmlPkg = (org.eclipse.epf.xml.uma.ContentCategoryPackage) this.xmlLib
-					.getContentCategoryPackage(plugin.getGuid());
-			String contentCategoryPackageId = xmlPkg.getId();
-
-			for (Iterator itp = topmostUserPackages.iterator(); itp.hasNext();) {
-				MethodPackage pkg = (MethodPackage) itp.next();
-
-				// if it's a category package,
-				// create all contained elements in the single custom category
-				// package
-				if (categoryPkgs.contains(pkg)) {
-
-					// set the it mapping
-					setIdMapping(pkg.getGuid(), contentCategoryPackageId);
-					creatEDataObjectTree(pkg, xmlPkg);
-				} else {
-					creatEDataObjectTree(pkg, targetObj);
-				}
-			}
-		} else {
-			for (Iterator it = srcObj.eContents().iterator(); it.hasNext();) {
-				Object nextObj = it.next();
-				MethodElement child = nextObj instanceof MethodElement ?
-						(MethodElement) nextObj : null;
-				if (child == null) {
-					continue;
-				}
-
-				// in uma model, WorkOrder is contained in package
-				// in xml model, WorkOrder is contained by the owning
-				// WorkBreakdownElement,
-				// so delay the creation if the owner is a package
-				if (child instanceof WorkOrder
-						&& srcObj instanceof MethodPackage) {
-					continue;
-				}
-
-				if ((child instanceof MethodPlugin)
-						&& !isPluginSelected((MethodPlugin) child)) {
-					continue;
-				}
-				
-				if (child instanceof MethodConfiguration &&
-					isConfigExcluded((MethodConfiguration) child)) {
-					continue;
-				}
-
-				if (!isDiscarded(child)) {
-					createXmlObject(child, targetObj);
-				}
-			}
-		}
-	}
-
-	private void setIdMapping(String umaId, String xmlId) {
-		if (!umaIdToXmlIdMap.containsKey(umaId)) {
-			umaIdToXmlIdMap.put(umaId, xmlId);
-		}
-	}
-
-	private String getXmlId(String umaId) {
-		if (umaIdToXmlIdMap.containsKey(umaId)) {
-			return (String) umaIdToXmlIdMap.get(umaId);
-		}
-		return umaId;
-	}
-
-	private boolean isDiscarded(Object o) {
-		if (o instanceof Diagram) {
-			return true;
-		}
-		return discardedElements.contains(o);
-	}
-
-	private EDataObject getXmlObject(MethodElement srcObj) {
-		String id = srcObj.getGuid();
-		if (umaIdToXmlIdMap.containsKey(id)) {
-			id = (String) umaIdToXmlIdMap.get(id);
-		}
-		return this.xmlLib.getElement(id);
-	}
-
-	/**
-	 * create an xml element for the container, based on the uma element
-	 * 
-	 * @param umaElement
-	 * @param targetContainer
-	 */
-	private void createXmlObject(MethodElement umaElement,
-			EDataObject targetContainer) {
-		EStructuralFeature feature = umaElement.eContainmentFeature();
-		createXmlObject(umaElement, targetContainer, feature.getName());
-	}
-
-	/**
-	 * create an xml element for the container, based on the uma element
-	 * 
-	 * @param umaElement
-	 * @param targetContainer
-	 */
-	private void createXmlObject(MethodElement umaElement,
-			EDataObject targetContainer, String containmentFeature) {
-
-		try {
-			if (umaElement == null) {
-				return;
-			}
-
-			// get the containment feature so we can create the object of the
-			// same type
-			String elementType = umaElement.getType().getName();
-			EDataObject xmlElement = xmlLib.createElement(targetContainer,
-					containmentFeature, umaElement.eClass().getName(),
-					elementType, umaElement.getGuid());
-			
-			if (umaElement instanceof TaskDescriptor) {					
-				TaskDescriptor td = (TaskDescriptor) umaElement;
-				if (td.getTask() != null) {
-					List steps = td.getSelectedSteps();
-					if (steps != null && !steps.isEmpty()) {
-						if (tdMap == null) {
-							tdMap = new HashMap<String, TaskDescriptor>();
-						}
-						tdMap.put(td.getGuid(), td);
-					}
-				}			
-			}
-			
-			if (xmlElement != null) {
-
-				// recursive
-				creatEDataObjectTree(umaElement, xmlElement);
-			}
-
-		} catch (Exception e) {
-			// log the error and continue???
-			e.printStackTrace();
-		}
-	}
-
-	private void iteratEDataObject(MethodElement srcObj) {
-		diagramHandler.registerElement(srcObj, true);
-		
-		if (srcObj instanceof MethodPlugin) {
-			MethodPlugin plugin = (MethodPlugin) srcObj;
-			if (!isPluginSelected(plugin)) {
-				return;
-			}
-		}
-
-		if (isProcessed(srcObj.getGuid())) {
-			return;
-		}
-		setProcessed(srcObj.getGuid());
-
-		EDataObject targetObj = getXmlObject(srcObj);
-
-		// if object is not created,
-		// which means it's either a system package or something wrong
-		if (targetObj == null) {
-			if (srcObj instanceof MethodPackage) {
-				// iterate the child packages
-				for (Iterator it = ((MethodPackage) srcObj).getChildPackages()
-						.iterator(); it.hasNext();) {
-					iteratEDataObject((MethodElement) it.next());
-				}
-			}
-
-			// // elements can be reference in other plugins
-			// // don't need to care about this
-			// else if (!isDiscarded(srcObj) ) {
-			// logger.logWarning("Warning: xml object not created for " +
-			// LibraryUtil.getTypeName(srcObj) );
-			// }
-
-			return;
-		}
-
-		EClass eClass = srcObj.eClass();
-
-		EList features = eClass.getEAllStructuralFeatures();
-		for (Iterator it = features.iterator(); it.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) it.next();
-
-			Object value = srcObj.eGet(feature);
-
-			try {
-				if (value instanceof List && ! feature.getName().equals("methodElementProperty")) {//$NON-NLS-1$	
-					for (Iterator itv = ((List) value).iterator(); itv
-							.hasNext();) {
-						MethodElement src_value = (MethodElement) itv.next();
-
-						// handle the
-						// UmaPackage#getWorkBreakdownElement_LinkToPredecessor
-						// feature value
-						// the WorkOrder in uma is a process element in a
-						// package
-						// in xml model, it's an EDataObject contained by the
-						// WorkBreakdownElement
-						if (src_value instanceof WorkOrder) {
-							// get the owner of the WorkOrder
-							EDataObject workOrder = getXmlObject(src_value);
-							if (workOrder == null) {
-								createXmlObject(src_value, targetObj, feature
-										.getName());
-							}
-							// System.out.println("workorder value");
-						}
-
-						// set the reference
-						String xmlId = getXmlId(src_value.getGuid());
-						xmlLib.setReferenceValue(targetObj, feature.getName(),
-								xmlId, src_value.getType());
-
-						iteratEDataObject(src_value);
-					}
-				} else if (value instanceof MethodElement) {
-					// get the xml object and iterate again
-					MethodElement src_value = (MethodElement) value;
-
-					// if ( src_value instanceof WorkOrder ) {
-					// System.out.println("workorder value");
-					// }
-
-					// elements like Presentation may not have a Content
-					// Description
-					// the one returned may not have a container
-					if (src_value.eContainer() != null) {
-						String xmlId = getXmlId(src_value.getGuid());
-						xmlLib.setReferenceValue(targetObj, feature.getName(),
-								xmlId, src_value.getType());
-
-						iteratEDataObject(src_value);
-					}
-				} else if (!isDiscarded(srcObj)) {
-					// if ( targetObj instanceof ContentCategoryPackage) {
-					// System.out.println("hrre");
-					// }
-
-					if (value instanceof WorkOrderType) {
-						value = ((WorkOrderType) value).getName();
-					}
-
-					xmlLib.setAtributeFeatureValue(targetObj,
-							feature.getName(), value);
-				}
-			} catch (Exception e) {
-				String msg = NLS.bind(
-						ExportXMLResources.exportXMLService_feature_error,
-						LibraryUtil.getTypeName(srcObj), feature.getName());
-				logger.logError(msg, e);
-			}
-
-		}
-
-	}
-
-	// goid of processed element
-	private List processedElements = new ArrayList();
-
-	private boolean isProcessed(String guid) {
-		return processedElements.contains(guid);
-	}
-
-	private void setProcessed(String guid) {
-		if (!processedElements.contains(guid)) {
-			processedElements.add(guid);
-		}
-	}
-
-	private List getTopmostUserPackage(MethodPlugin plugin) {
-
-		MethodPackage pkg_core_content = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.coreContentPath);
-
-		MethodPackage pkg_custom_categories = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.customCategoryPath);
-
-		MethodPackage pkg_disciplines = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.disciplineDefinitionPath);
-
-		MethodPackage pkg_domains = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.domainPath);
-
-		MethodPackage pkg_rolesets = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.roleSetPath);
-
-		MethodPackage pkg_tools = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.toolPath);
-
-		MethodPackage pkg_wptypes = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.workProductTypePath);
-
-		MethodPackage pkg_cp = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.capabilityPatternPath);
-
-		MethodPackage pkg_dp = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.deliveryProcessPath);
-
-		MethodPackage pkg_proc_contribution = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.processContributionPath);
-
-		List pkgs = new ArrayList();
-		pkgs.add(pkg_core_content);
-		pkgs.add(pkg_custom_categories);
-		pkgs.add(pkg_disciplines);
-		pkgs.add(pkg_domains);
-		pkgs.add(pkg_rolesets);
-		pkgs.add(pkg_tools);
-		pkgs.add(pkg_wptypes);
-		pkgs.add(pkg_cp);
-		pkgs.add(pkg_dp);
-
-		if ( pkg_proc_contribution != null ) {
-			pkgs.add(pkg_proc_contribution);
-		}
-		
-		return pkgs;
-
-		// List systemPkgs = TngUtil.getAllSystemPackages(plugin);
-		//		
-		// List unprocessedPkgs = new ArrayList(plugin.getMethodPackages());
-		// while (unprocessedPkgs.size() > 0 ) {
-		// MethodPackage pkg = (MethodPackage) unprocessedPkgs.remove(0);
-		// if ( !systemPkgs.contains(pkg) ) {
-		// if ( !pkgs.contains(pkg) ) {
-		// pkgs.add(pkg);
-		// }
-		// continue;
-		// }
-		//			
-		// for ( Iterator it = pkg.getChildPackages().iterator(); it.hasNext();
-		// ) {
-		// MethodPackage p = (MethodPackage)it.next();
-		// if ( systemPkgs.contains(p) )
-		// {
-		// if ( !unprocessedPkgs.contains(p) ) {
-		// unprocessedPkgs.add(p);
-		// }
-		// } else {
-		// if ( !pkgs.contains(p) ) {
-		// pkgs.add(p);
-		// }
-		// }
-		// }
-		//			
-		// if ( unprocessedPkgs.size() == 0 ) {
-		// break;
-		// }
-		// }
-		//		
-		// // need to include the content packages
-		// pkgs.addAll(TngUtil.getContentCategoryPackages(plugin));
-
-	}
-
-	// private boolean isSystemPackage(EDataObject element) {
-	//		
-	// if ( !(element instanceof MethodPackage) ) {
-	// return false;
-	// }
-	//		
-	// MethodPlugin plugin = LibraryUtil.getMethodPlugin(element);
-	// if ( plugin == null ) {
-	// return false;
-	// }
-	//		
-	// return TngUtil.getAllSystemPackages(plugin).contains(element);
-	//		
-	// }
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/FeatureManager.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/FeatureManager.java
deleted file mode 100644
index ebd35e4..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/FeatureManager.java
+++ /dev/null
@@ -1,642 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.services;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.epf.uma.UmaFactory;
-
-
-/**
- * manage the features of EClass.
- * maintains a map of feature name to the EStructuralFeature object for easier access
- * 
- * @author Jinhua Xi
- *
- */
-public class FeatureManager {
-
-	public static FeatureManager INSTANCE = new FeatureManager();
-	
-	//private Map classMap = new HashMap();
-	
-	// map of uma feature name to the corresponding xml feature name
-	private Map featureNameMap = new TreeMap();
-	
-	// uma features that should be ignored
-	private List unneededRmcFeatures = new ArrayList();
-
-	// xml features that can be ignored
-	private List unneededXmlFeatures = new ArrayList();
-
-	// map of EClass name to EClass Object for xml model
-	// note: we can't use feature.getEType() to get the EClass from feature
-	// the problem is the above returned EClass may not be the concreate EClass, instead, it is the base class
-	// for example, it returns MethodPackage instead of ProcessPackage or ContentPackage
-	// so we have to maintain a map manually
-	private Map xmlEClassMap = new TreeMap();
-	
-	// map of Eclas name to EClass object for uma model
-	private Map umaEClassMap = new TreeMap();
-	
-	private FeatureManager() {
-		
-		featureNameMap.put("OptionalInputTo", "optionalInputTo"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("Role", "role"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("Task", "task"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("activityReferences", "activityReference"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("aggregatedRoles", "aggregatedRole"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("assets", "reusableAsset"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("attachments", "attachment"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("baseConfigurations", "baseConfiguration"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("basedOnProcesses", "baseProcess"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("bases", "referencedMethodPlugin"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("body", "mainDescription"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("breakdownElements", "breakdownElement"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("categorizedElements", "categorizedElement"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("checklists", "checklist"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("childPackages", "methodPackage"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("communicationsMaterials", "communicationsMaterial"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("concepts", "concept,whitepaper"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("conceptsAndPapers", "concept,whitepaper"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("containedArtifacts", "containedArtifact"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("contentElements", "contentElement"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("contentReferences", "contentReference"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("copyrightStatement", "copyright"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("deliveredWorkProducts", "deliveredWorkProduct"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("disciplines", "discipline"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("educationMaterials", "educationMaterial"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("estimationConderations", "estimationConsiderations"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("examples", "example"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("guid", "id"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("guidelines", "guideline"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("howtoStaff", "howToStaff"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("includesPatterns", "includesPattern"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("interfaces", "interface"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("linkToPredecessor", "predecessor"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("methodPackages", "methodPackage"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("methodPlugins", "methodPlugin"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("ownedRules", "ownedRule"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("predefinedConfigurations", "methodConfiguration"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("processElements", "processElement"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("processViews", "processView"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("referenceWorkflows", "referenceWorkflow"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("reports", "report"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("reusableAssets", "reusableAsset"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("reusedPackages", "reusedPackage"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("roadmaps", "roadmap"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("roleSets", "roleSet"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("roles", "role"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("sectionDescription", "description"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("sections", "section"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("selectedSteps", "step"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("subCategories", "subCategory"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("subdiscipline", "subDiscipline"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("subPractices", "subPractice"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("subSections", "subSection"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("subdomains", "subdomain"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("superActivities", "superActivity"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("supportingMaterials", "supportingMaterial"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("tasks", "task"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("teamRoles", "role"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("templates", "template"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("toolMentors", "toolMentor"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("WorkProduct", "workProduct"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("workProducts", "workProduct"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("pred", "value"); //$NON-NLS-1$ //$NON-NLS-2$
-		featureNameMap.put("methodElementProperty", "methodElementProperty"); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		unneededRmcFeatures.add("containerArtifact"); //$NON-NLS-1$
-		unneededRmcFeatures.add("modifies"); //$NON-NLS-1$
-		unneededRmcFeatures.add("parentPackage"); //$NON-NLS-1$
-		unneededRmcFeatures.add("diagrams"); //$NON-NLS-1$
-		unneededRmcFeatures.add("modifies"); //$NON-NLS-1$
-		unneededRmcFeatures.add("steps"); //$NON-NLS-1$
-		unneededRmcFeatures.add("workedOnBy"); //$NON-NLS-1$
-		unneededRmcFeatures.add("diagrams"); //$NON-NLS-1$
-		
-		unneededXmlFeatures.add("group"); //$NON-NLS-1$
-		unneededXmlFeatures.add("group1"); //$NON-NLS-1$
-		unneededXmlFeatures.add("group2"); //$NON-NLS-1$
-		unneededXmlFeatures.add("predecessor1"); //$NON-NLS-1$
-		
-		loadXmlClasses();
-		loadRmcClasses();
-		
-//		// print out the EClasses and feature map, for testing purpose
-//		// don't delete this code segment
-//		System.out.println("============ Loading EClasses for XML Uma model =================");
-//		for (Iterator it = xmlEClassMap.keySet().iterator(); it.hasNext(); ) {
-//			System.out.println("\t" + it.next());			
-//		}
-//		System.out.println("=================================================================");
-//
-//		for (Iterator it = featureNameMap.entrySet().iterator(); it.hasNext(); ) {
-//			Map.Entry entry = (Map.Entry) it.next();
-//			String key = (String)entry.getKey();
-//			String value = (String)entry.getValue();
-//			if (value != null && value.length() > 0 ) {
-//				System.out.println("\tfeatureNameMap.put(\"" + key + "\", \"" + value + "\");");	
-//			}
-//		}
-	}
-	
-	private void loadRmcClasses() {
-		
-		// load EClass map
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getActivity());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getActivityDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getArtifact());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getArtifactDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getBreakdownElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getBreakdownElementDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getCapabilityPattern());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getChecklist());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getCompositeRole());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getConcept());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getConstraint());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getContentCategory());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getContentDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getContentElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getContentPackage());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getCustomCategory());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDeliverable());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDeliverableDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDeliveryProcess());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDeliveryProcessDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDescribableElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDescriptor());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDescriptorDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDiscipline());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDisciplineGrouping());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getDomain());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getEstimationConsiderations());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getExample());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getGuidance());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getGuidanceDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getGuideline());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getIteration());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMethodConfiguration());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMethodElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMethodLibrary());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMethodPackage());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMethodPlugin());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMethodUnit());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMilestone());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getNamedElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getOutcome());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getPackageableElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getPhase());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getPlanningData());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getPractice());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getPracticeDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getProcess());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getProcessComponent());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getProcessComponentInterface());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getProcessDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getProcessElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getProcessPackage());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getProcessPlanningTemplate());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getReport());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getReusableAsset());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getRoadmap());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getRole());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getRoleDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getRoleDescriptor());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getRoleSet());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getRoleSetGrouping());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getSection());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getSupportingMaterial());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getTask());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getTaskDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getTaskDescriptor());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getTeamProfile());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getTemplate());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getTermDefinition());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getTool());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getToolMentor());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWhitepaper());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWorkBreakdownElement());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWorkDefinition());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWorkOrder());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWorkProduct());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWorkProductDescription());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWorkProductDescriptor());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getWorkProductType());
-		loadModelClasses(umaEClassMap, org.eclipse.epf.uma.UmaPackage.eINSTANCE.getMethodElementProperty());	
-	}
-	
-	
-	private void loadXmlClasses() {
-		
-		// load EClass map
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getActivity());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getActivityDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getArtifact());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getArtifactDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getBreakdownElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getBreakdownElementDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getCapabilityPattern());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getChecklist());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getCompositeRole());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getConcept());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getConstraint());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getContentCategory());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getContentCategoryPackage());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getContentDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getContentElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getContentPackage());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getCustomCategory());
-//		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getCategoryType());
-//		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getCategoryTypeObject());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDeliverable());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDeliverableDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDeliveryProcess());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDeliveryProcessDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDescribableElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDescriptor());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDescriptorDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDiscipline());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDisciplineGrouping());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getDomain());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getEstimate());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getEstimatingMetric());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getEstimationConsiderations());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getExample());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getGuidance());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getGuidanceDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getGuideline());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getIteration());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMethodConfiguration());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMethodElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMethodLibrary());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMethodPackage());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMethodPlugin());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMethodUnit());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMilestone());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getNamedElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getOutcome());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getPackageableElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getPhase());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getPlanningData());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getPractice());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getPracticeDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getProcess());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getProcessComponent());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getProcessComponentInterface());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getProcessDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getProcessElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getProcessPackage());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getProcessPlanningTemplate());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getReport());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getReusableAsset());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getRoadmap());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getRole());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getRoleDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getRoleDescriptor());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getRoleSet());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getRoleSetGrouping());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getSection());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getSupportingMaterial());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getTask());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getTaskDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getTaskDescriptor());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getTeamProfile());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getTemplate());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getTermDefinition());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getTool());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getToolMentor());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWhitepaper());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWorkBreakdownElement());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWorkDefinition());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWorkOrder());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWorkProduct());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWorkProductDescription());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWorkProductDescriptor());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getWorkProductType());
-		loadModelClasses(xmlEClassMap, org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getMethodElementProperty());	
-	}
-	
-	private void loadModelClasses(Map classMap, EClass clazz) {
-
-		String name = clazz.getName();
-		if( classMap.containsKey(name) ) {
-			return;
-		}
-		
-		classMap.put(name, clazz);
-			
-		//for (Iterator it = clazz.getEAllStructuralFeatures().iterator(); it.hasNext(); ) {
-		for (Iterator elements = ExtendedMetaData.INSTANCE.getAllElements(clazz).iterator(); 
-				elements.hasNext(); ) {
-			EStructuralFeature eStructuralFeature = (EStructuralFeature)elements.next();
-			EClassifier eClassifier = eStructuralFeature.getEType();
-			if (eClassifier instanceof EClass) {
-				EClass eClass = (EClass)eClassifier;				
-				// recursively find the nestedt features
-				loadModelClasses(classMap, eClass);
-			}
-		}
-	}
-
-	/**
-	 * @param clazz
-	 * @param umaFeatureName
-	 * @return the corresponding xml feature.
-	 */
-	public EStructuralFeature getXmlFeature(EClass clazz, String umaFeatureName) {
-		return getXmlFeature(clazz, umaFeatureName, null);
-	}
-	
-	/**
-	 * @param umaClazz
-	 * @param xmlFeatureName
-	 * @return the corresponding EStructuralFeature object.
-	 */
-	public EStructuralFeature getRmcFeature(EClass umaClazz, String xmlFeatureName) {
-		for ( Iterator it = umaClazz.getEAllStructuralFeatures().iterator(); it.hasNext(); )
-		{
-			EStructuralFeature feature = (EStructuralFeature)it.next();
-			String umaFeaturename = feature.getName();
-			
-			// if the feature name is the same, got it
-			if ( umaFeaturename.equals(xmlFeatureName) ) {
-				return feature;
-			}
-			
-			// check if the feature name is mapped to another xml feature name
-			String featureName = (String)featureNameMap.get(umaFeaturename);
-			if ( featureName != null ) {
-				int i = featureName.indexOf(","); //$NON-NLS-1$
-				if ( i > 0 ) {
-					if ( featureName.substring(0,i).equals(xmlFeatureName) || 
-						 featureName.substring(i+1).equals(xmlFeatureName)	) {
-						return feature;
-					}
-				} else {
-					if ( featureName.equals(xmlFeatureName) ) {
-						return feature;
-					}
-				}				
-			}
-		}
-
-		//System.out.print("FeatureManager: Unable to find uma feature for xml feature" + xmlFeatureName);
-		
-		return null;
-	}
-	
-	/**
-	 * @param clazz
-	 * @param umaFeatureName
-	 * @param objectType
-	 * @return the corrsponding xml feature.
-	 */
-	public EStructuralFeature getXmlFeature(EClass clazz, String umaFeatureName, String objectType) {
-
-		String featureName = umaFeatureName;
-		if ( featureNameMap.containsKey(featureName) ) {
-			featureName = (String)featureNameMap.get(featureName);
-			
-			// if the feature is not unique, use the first one
-			int i = featureName.indexOf(","); //$NON-NLS-1$
-			if ( i > 0 ) {
-				String name = featureName.substring(0, i);
-				if ( objectType != null ) {				
-					// pick the feature based on object type
-					if ( !name.equalsIgnoreCase(objectType) ) {
-						name = featureName.substring(i+1);
-					}
-					if ( !name.equalsIgnoreCase(objectType) ) {
-						name = null;
-					}
-				}
-				
-				featureName = name;
-			}
-		}
-		
-		if ( featureName == null ) {
-			return null;
-		}
-		
-		EStructuralFeature feature = clazz.getEStructuralFeature(featureName);
-		if ( (feature==null) && (clazz.getName().equals("ContentCategoryPackage")) && featureName.equals("contentElement") ) { //$NON-NLS-1$ //$NON-NLS-2$
-			feature = org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getContentCategoryPackage_ContentCategory();
-		}
-
-//		if ( feature == null ) {
-//			System.out.println("No xml feature " + featureName + " for class " + clazz.getName());
-//		}
-		
-		return feature;
-	}
-	
-	/**
-	 * @param umaEClassName
-	 * @return the corresponding xml eclass
-	 */
-	public EClass getXmlEClass(String umaEClassName) {
-//		EClass rootClass = ExtendedMetaData.INSTANCE.getDocumentRoot(org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE);
-//		EClass eClass = (EClass)rootClass.getEStructuralFeature(umaEClassName);
-//		return eClass;
-		
-		EClass cls = (EClass)xmlEClassMap.get(umaEClassName);
-//		if ( cls == null ) {
-//			System.out.println("No xml EClass for uma class " + umaEClassName);
-//		}
-		
-		return cls;
-	}
-	
-	/**
-	 * @param xmlEClassName
-	 * @return the corresponding EClass object.
-	 */
-	public EClass getRmcEClass(String xmlEClassName) {
-		EClass cls = (EClass)umaEClassMap.get(xmlEClassName);
-//		if ( cls == null ) {
-//			System.out.println("No uma EClass for xml class " + xmlEClassName);
-//		}
-		
-		return cls;
-	}
-	
-	/**
-	 * @param featurename
-	 * @return true if the feature is unneeded given by featurename.
-	 */
-	public boolean isUnneededRmcFeature(String featurename) {
-		return unneededRmcFeatures.contains(featurename);
-	}
-	
-	/**
-	 * @param featurename
-	 * @return true if the xml feature is unneeded given by featurename.
-	 */
-	public boolean isUnneededXmlFeature(String featurename) {
-		return unneededXmlFeatures.contains(featurename);
-	}
-	
-	/**
-	 * Prints the feature-name map.
-	 */
-	public void printFeatureNameMapping() {
-		printFeature(UmaFactory.eINSTANCE.createActivity(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createActivity());
-		printFeature(UmaFactory.eINSTANCE.createActivityDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createActivityDescription());
-		printFeature(UmaFactory.eINSTANCE.createArtifact(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createArtifact());
-		printFeature(UmaFactory.eINSTANCE.createArtifactDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createArtifactDescription());
-		printFeature(UmaFactory.eINSTANCE.createBreakdownElementDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createBreakdownElementDescription());
-		printFeature(UmaFactory.eINSTANCE.createCapabilityPattern(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createCapabilityPattern());
-		printFeature(UmaFactory.eINSTANCE.createChecklist(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createChecklist());
-		printFeature(UmaFactory.eINSTANCE.createCompositeRole(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createCompositeRole());
-		printFeature(UmaFactory.eINSTANCE.createConcept(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createConcept());
-		printFeature(UmaFactory.eINSTANCE.createConstraint(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createConstraint());
-		printFeature(UmaFactory.eINSTANCE.createContentDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createContentDescription());
-		printFeature(UmaFactory.eINSTANCE.createContentPackage(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createContentPackage());
-		printFeature(UmaFactory.eINSTANCE.createCustomCategory(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createCustomCategory());
-		printFeature(UmaFactory.eINSTANCE.createDeliverable(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDeliverable());
-		printFeature(UmaFactory.eINSTANCE.createDeliverableDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDeliverableDescription());
-		printFeature(UmaFactory.eINSTANCE.createDeliveryProcess(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDeliveryProcess());
-		printFeature(UmaFactory.eINSTANCE.createDeliveryProcessDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDeliveryProcessDescription());
-		printFeature(UmaFactory.eINSTANCE.createDescriptorDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDescriptorDescription());
-		printFeature(UmaFactory.eINSTANCE.createDiscipline(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDiscipline());
-		printFeature(UmaFactory.eINSTANCE.createDisciplineGrouping(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDisciplineGrouping());
-		printFeature(UmaFactory.eINSTANCE.createDomain(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createDomain());
-		printFeature(UmaFactory.eINSTANCE.createEstimationConsiderations(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createEstimationConsiderations());
-		printFeature(UmaFactory.eINSTANCE.createExample(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createExample());
-		printFeature(UmaFactory.eINSTANCE.createGuidanceDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createGuidanceDescription());
-		printFeature(UmaFactory.eINSTANCE.createGuideline(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createGuideline());
-		printFeature(UmaFactory.eINSTANCE.createIteration(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createIteration());
-		printFeature(UmaFactory.eINSTANCE.createMethodConfiguration(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createMethodConfiguration());
-		printFeature(UmaFactory.eINSTANCE.createMethodLibrary(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createMethodLibrary());
-		printFeature(UmaFactory.eINSTANCE.createMethodPlugin(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createMethodPlugin());
-		printFeature(UmaFactory.eINSTANCE.createMilestone(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createMilestone());
-		printFeature(UmaFactory.eINSTANCE.createOutcome(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createOutcome());
-		printFeature(UmaFactory.eINSTANCE.createPhase(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createPhase());
-		printFeature(UmaFactory.eINSTANCE.createPlanningData(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createPlanningData());
-		printFeature(UmaFactory.eINSTANCE.createPractice(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createPractice());
-		printFeature(UmaFactory.eINSTANCE.createPracticeDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createPracticeDescription());
-		printFeature(UmaFactory.eINSTANCE.createProcessComponent(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createProcessComponent());
-		printFeature(UmaFactory.eINSTANCE.createProcessDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createProcessDescription());
-		printFeature(UmaFactory.eINSTANCE.createProcessPackage(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createProcessPackage());
-		printFeature(UmaFactory.eINSTANCE.createProcessPlanningTemplate(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createProcessPlanningTemplate());
-		printFeature(UmaFactory.eINSTANCE.createReport(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createReport());
-		printFeature(UmaFactory.eINSTANCE.createReusableAsset(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createReusableAsset());
-		printFeature(UmaFactory.eINSTANCE.createRoadmap(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createRoadmap());
-		printFeature(UmaFactory.eINSTANCE.createRole(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createRole());
-		printFeature(UmaFactory.eINSTANCE.createRoleDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createRoleDescription());
-		printFeature(UmaFactory.eINSTANCE.createRoleDescriptor(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createRoleDescriptor());
-		printFeature(UmaFactory.eINSTANCE.createRoleSet(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createRoleSet());
-		printFeature(UmaFactory.eINSTANCE.createRoleSetGrouping(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createRoleSetGrouping());
-		printFeature(UmaFactory.eINSTANCE.createSection(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createSection());
-		printFeature(UmaFactory.eINSTANCE.createSupportingMaterial(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createSupportingMaterial());
-		printFeature(UmaFactory.eINSTANCE.createTask(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createTask());
-		printFeature(UmaFactory.eINSTANCE.createTaskDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createTaskDescription());
-		printFeature(UmaFactory.eINSTANCE.createTaskDescriptor(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createTaskDescriptor());
-		printFeature(UmaFactory.eINSTANCE.createTeamProfile(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createTeamProfile());
-		printFeature(UmaFactory.eINSTANCE.createTemplate(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createTemplate());
-		printFeature(UmaFactory.eINSTANCE.createTermDefinition(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createTermDefinition());
-		printFeature(UmaFactory.eINSTANCE.createTool(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createTool());
-		printFeature(UmaFactory.eINSTANCE.createToolMentor(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createToolMentor());
-		printFeature(UmaFactory.eINSTANCE.createWhitepaper(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createWhitepaper());
-		printFeature(UmaFactory.eINSTANCE.createWorkOrder(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createWorkOrder());
-		printFeature(UmaFactory.eINSTANCE.createWorkProductDescription(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createWorkProductDescription());
-		printFeature(UmaFactory.eINSTANCE.createWorkProductDescriptor(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createWorkProductDescriptor());
-		printFeature(UmaFactory.eINSTANCE.createWorkProductType(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.createWorkProductType());
-//		printFeature(UmaFactory.eINSTANCE.create(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.create());
-//		printFeature(UmaFactory.eINSTANCE.create(), org.eclipse.epf.xml.uma.UmaFactory.eINSTANCE.create());
-
-
-	}
-	
-	
-	private void printFeature(EObject obj1, EObject obj2) {
-		List matched = new ArrayList();
-		List unmatched = new ArrayList();
-		List umaFeatures = new ArrayList();
-				
-		EList features = obj1.eClass().getEAllStructuralFeatures();
-		for ( Iterator it = features.iterator(); it.hasNext(); ) {
-			EStructuralFeature feature = (EStructuralFeature)it.next();
-			String name = feature.getName();
-			if ( featureNameMap.containsKey(name) ) {
-				String xml_name = (String) featureNameMap.get(name);
-				int indx = xml_name.indexOf(","); //$NON-NLS-1$
-				if ( indx > 0 ) {
-					matched.add(xml_name.substring(0, indx));
-					matched.add(xml_name.substring(indx+1).trim());					
-				}
-				else if ( !matched.contains(xml_name) ) {
-					matched.add(xml_name);
-				}
-			}
-			else if (!unneededRmcFeatures.contains(name) && !umaFeatures.contains(name) ) {
-				umaFeatures.add(name);
-			}
-		}			
-		
-		features = obj2.eClass().getEAllStructuralFeatures();
-		for ( Iterator it = features.iterator(); it.hasNext(); ) {
-			EStructuralFeature feature = (EStructuralFeature)it.next();
-			String name = feature.getName();
-			if ( umaFeatures.contains(name) ) {
-				umaFeatures.remove(name);
-			} else if (!unneededXmlFeatures.contains(name) && !matched.contains(name) && !unmatched.contains(name) ) {
-				unmatched.add(name);
-			}
-		}	
-		
-		if ( umaFeatures.size() + unmatched.size() == 0 ) {
-			return;
-		}
-		
-		System.out.println("============== un-matched features for " + obj1.eClass().getName() + " =================="); //$NON-NLS-1$ //$NON-NLS-2$
-		for ( Iterator it = umaFeatures.iterator(); it.hasNext(); ) {
-			String name = (String)it.next();
-			System.out.println("\tfeatureNameMap.put(\"" + name + "\", \"\");"); //$NON-NLS-1$ //$NON-NLS-2$
-			//System.out.println(name);
-		}
-		for ( Iterator it = unmatched.iterator(); it.hasNext(); ) {
-			String name = (String)it.next();
-			System.out.println("\t\t" + name); //$NON-NLS-1$
-		}
-
-		System.out.println(""); //$NON-NLS-1$
-		
-	}
-	
-//	public class FeatureMap {
-//		private Map featureMap = new HashMap();
-//		
-//		FeatureMap(EClass clazz) {
-//			EList features = clazz.getEAllStructuralFeatures();
-//			for ( Iterator it = features.iterator(); it.hasNext(); ) {
-//				EStructuralFeature feature = (EStructuralFeature)it.next();
-//				featureMap.put(feature.getName(), feature);
-//			}			
-//		}
-//		
-//		public EStructuralFeature getFeature(String featureName) {
-//			return (EStructuralFeature) featureMap.get(featureName);			
-//		}
-//	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/XMLLibrary.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/XMLLibrary.java
deleted file mode 100644
index 779a92d..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/XMLLibrary.java
+++ /dev/null
@@ -1,1094 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.services;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.dataexchange.util.ContentProcessor;
-import org.eclipse.epf.dataexchange.util.ILogger;
-import org.eclipse.epf.export.xml.ExportXMLResources;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.xml.uma.BreakdownElement;
-import org.eclipse.epf.xml.uma.ContentCategoryPackage;
-import org.eclipse.epf.xml.uma.ContentPackage;
-import org.eclipse.epf.xml.uma.DocumentRoot;
-import org.eclipse.epf.xml.uma.MethodElement;
-import org.eclipse.epf.xml.uma.MethodElementProperty;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.ProcessComponent;
-import org.eclipse.epf.xml.uma.ProcessPackage;
-import org.eclipse.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.UmaFactory;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.VariabilityType;
-import org.eclipse.epf.xml.uma.WorkBreakdownElement;
-import org.eclipse.epf.xml.uma.WorkOrder;
-import org.eclipse.epf.xml.uma.WorkOrderType;
-import org.eclipse.epf.xml.uma.util.UmaResourceFactoryImpl;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.text.SimpleDateFormat;
-import commonj.sdo.Type;
-
-/**
- * XmlLibrary represents a method library loaded from a specified xml file The
- * xml file should be valid to the xml schema for MethodLibrary
- * 
- * @author Jinhua Xi
- * @since 1.0
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=162153
- */
-public class XMLLibrary {
-
-	private String filePath;
-
-	private ILogger logger;
-
-	private ContentProcessor contentProc = null;
-
-	private MethodLibrary rootObject;
-
-	// map of content category package for each plugin id
-	private Map contentCategoryPkgMap = new HashMap();
-
-	// map of created elements, guid - EDataObject
-	private Map elementsMap = new HashMap();
-	
-	private Map<String, String> guidToPlugNameMap;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public XMLLibrary(ContentProcessor contentProc, ILogger logger,
-			String filePath) {
-		this.contentProc = contentProc;
-		this.logger = logger;
-		this.filePath = filePath;
-
-	}
-
-	/**
-	 * @return root object.
-	 */
-	public EDataObject getRoot() {
-		return this.rootObject;
-	}
-
-	/**
-	 * @return file path string.
-	 */
-	public String getFilePath() {
-		return this.filePath;
-	}
-
-	/**
-	 * get an array of plugin ids in the library
-	 * 
-	 * @return
-	 */
-	public String[] getPluginIds() {
-		List plugins = rootObject.getMethodPlugin();
-		String[] ids = new String[plugins.size()];
-		for (int i = 0; i < plugins.size(); i++) {
-			ids[i] = ((MethodPlugin) plugins.get(i)).getId();
-		}
-
-		return ids;
-	}
-
-	/**
-	 * @param id
-	 * @param name
-	 * @return a new XML library.
-	 */
-	public EDataObject createLibrary(String id, String name) {
-
-		MethodLibrary root = UmaFactory.eINSTANCE.createMethodLibrary();
-		String version = "";								//$NON-NLS-1$	
-		for (Iterator iter = VersionUtil.getAllToolIDs().iterator();iter.hasNext();) {
-			String toolID = (String)iter.next();
-			String toolVersion = VersionUtil.getVersions(toolID).getMinToolVersionForCurrentXMLSchemaVersion().getToolVersion().toString();
-			if (version.length() > 0) {
-				version += VersionUtil.XML_VERSIONS_SEPARATOR;
-			}
-			version += toolID + VersionUtil.XML_TOOL_VERSION_SEPARATOR + toolVersion;		
-		}
-		if (version.length() > 0) {
-			root.setTool(version);
-		}
-		return create(id, name, root);
-	}
-
-	/**
-	 * Loads the xml file.
-	 */
-	public void load() throws Exception {
-/*		try {*/
-			ResourceSet resourceSet = new ResourceSetImpl();
-
-			// Get the URI of the model file.
-			//
-			URI fileURI = URI.createFileURI((new File(this.filePath)).getAbsolutePath());
-
-			// Create a resource for this file.
-			//
-			// Resource resource = resourceSet.createResource(fileURI);
-			Resource resource = new UmaResourceFactoryImpl()
-					.createResource(fileURI);
-			resourceSet.getResources().add(resource);
-
-			resource.load(new HashMap());
-
-			// Resource resource = resourceSet.getResource(fileURI, false);
-
-			// EClass eClass =
-			// ExtendedMetaData.INSTANCE.getDocumentRoot(umaPackage);
-
-			DocumentRoot root = (DocumentRoot) resource.getContents().get(0);
-			for (Iterator itr = root.eContents().iterator(); itr.hasNext();) {
-				Object o = itr.next();
-				if (o instanceof MethodLibrary) {
-					this.rootObject = (MethodLibrary) o;
-					break;
-				}
-			}
-/*
-			// System.out.println("Resource loaded");
-		} catch (IOException e) {
-			logger.logError(NLS.bind(
-					ExportXMLResources.xmlLibrary_error_load_xml, filePath), e);
-		}*/
-	}
-
-	/**
-	 * create the library and return the root object
-	 * 
-	 * @param filePath
-	 * @return
-	 */
-	private MethodLibrary create(String id, String name, MethodElement root) {
-
-		// Create a resource set
-		//
-		ResourceSet resourceSet = new ResourceSetImpl();
-
-		// Get the URI of the model file.
-		//
-		File file = new File(this.filePath);
-		URI fileURI = URI.createFileURI(file.getAbsolutePath());
-
-		// Create a resource for this file.
-		//
-		// Resource resource = resourceSet.createResource(fileURI);
-		Resource resource = new UmaResourceFactoryImpl()
-				.createResource(fileURI);
-		resourceSet.getResources().add(resource);
-
-		// Add the initial model object to the contents.
-		// root.setId(id);
-		// root.setName(name);
-
-		setElement(id, root);
-
-		// this.rootObject = root;
-		if (root != null) {
-			resource.getContents().add(root);
-		}
-
-		try {
-			Map options = new HashMap();
-			options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-			resource.save(options);
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-
-		if (root instanceof MethodLibrary) {
-			this.rootObject = (MethodLibrary) root;
-		}
-
-		return this.rootObject;
-	}
-
-	/**
-	 * @param pluginId
-	 * @return a content catergory package in the plugin given by pluginId.
-	 */
-	public EDataObject getContentCategoryPackage(String pluginId) {
-
-		ContentCategoryPackage pkg = (ContentCategoryPackage) contentCategoryPkgMap
-				.get(pluginId);
-		if (pkg != null) {
-			return pkg;
-		}
-
-		MethodPlugin plugin = (MethodPlugin) getElement(pluginId);
-		if (plugin == null) {
-			logger.logWarning(NLS.bind(ExportXMLResources.xmlLibrary_no_plugin,
-					pluginId));
-			return null;
-		}
-
-		pkg = UmaFactory.eINSTANCE.createContentCategoryPackage();
-		pkg.setName("ContentCategories"); //$NON-NLS-1$
-
-		setElement(EcoreUtil.generateUUID(), pkg);
-
-		plugin.getMethodPackage().add(pkg);
-
-		contentCategoryPkgMap.put(pluginId, pkg);
-		return pkg;
-	}
-
-	/**
-	 * Saves the xml file.
-	 */
-	public void save() throws Exception {
-		// Save the contents of the resource to the file system.
-		//
-		Map options = new HashMap();
-		options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-		Resource resource = rootObject.eResource();
-		resource.save(options);
-	}
-
-	/**
-	 * @return the root object.
-	 */
-	public EDataObject open() {
-		return rootObject;
-	}
-
-	/**
-	 * @param guid
-	 * @return the corresponding base library element.
-	 */
-	public EDataObject getElement(String guid) {
-		return (EDataObject) elementsMap.get(guid);
-	}
-
-	/**
-	 * @param obj
-	 * @return the corresponding base library element.
-	 */
-	public EDataObject getElement(Object obj) {
-		if (obj instanceof MethodElement) {
-			return getElement(((MethodElement) obj).getId());
-		}
-
-		return null;
-	}
-
-	
-	/**
-	 * @param obj
-	 * @return elmenent id string.
-	 */
-	public String getElementId(EDataObject obj) {
-
-		if (obj instanceof MethodElement) {
-			return ((MethodElement) obj).getId();
-		} else if (obj instanceof WorkOrder) {
-			return ((WorkOrder) obj).getId();
-		}
-
-		return null;
-	}
-
-	private void setElement(String guid, EDataObject obj) {
-		// addElementToContainer(container, obj);
-		if (!elementsMap.containsKey(guid)) {
-
-			if (obj instanceof MethodElement) {
-				((MethodElement) obj).setId(guid);
-			}
-
-			elementsMap.put(guid, obj);
-		}
-	}
-
-	// private void addElementToContainer(EDataObject container, EDataObject
-	// child) {
-	//		
-	// try {
-	// if ( container == null ) {
-	// return;
-	// }
-	//			
-	// if ( child instanceof MethodLibrary || child instanceof MethodPlugin ||
-	// child instanceof MethodPackage ) {
-	// return;
-	// }
-	//			
-	// while ( !(container instanceof MethodPackage) && (container != null) ) {
-	// container = container.eContainer();
-	// }
-	//			
-	// if ( container instanceof ContentPackage ) {
-	// ((ContentPackage)container).getContentElement().add(child);
-	// } else if ( container instanceof ProcessPackage ) {
-	// ((ProcessPackage)container).getProcessElement().add(child);
-	// } else {
-	// System.out.println("Don't know how to set element " + child);
-	// }
-	// } catch (RuntimeException e) {
-	// // TODO Auto-generated catch block
-	// e.printStackTrace();
-	// }
-	// }
-
-	/**
-	 * create a child element with the specified guid
-	 * 
-	 * @param container
-	 *            container of the element to be created
-	 * @param umaFeatureName
-	 *            uma feature for the element to be created
-	 * @param umaEClassName
-	 *            uma EClass name for the feature
-	 * @param umaElementType
-	 *            uma element type for the element to be created
-	 * @param guid
-	 *            guid of the element to be created
-	 * @return EDataObject the Xml uma element
-	 */
-	public EDataObject createElement(EDataObject container,
-			String umaFeatureName, String umaEClassName, String umaElementType,
-			String guid) {
-
-		EDataObject obj = getElement(guid);
-		if (obj == null) {
-			if (FeatureManager.INSTANCE.isUnneededRmcFeature(umaFeatureName)) {
-				return null;
-			}
-			EStructuralFeature feature = FeatureManager.INSTANCE.getXmlFeature(
-					container.eClass(), umaFeatureName, umaElementType);
-			if (feature == null) {
-				logger.logWarning(NLS.bind(
-						ExportXMLResources.xmlLibrary_no_feature, container
-								.eClass().getName(), umaFeatureName));
-				return null;
-			}
-
-			// if ( !(feature instanceof EReference) ) {
-			// System.out.println("Error creating element: containment feature
-			// should be EReference type. " + feature.getName());
-			// //return null;
-			// }
-
-			// // this is an easier way, test it,
-			// // does not work since feature.getEType() returns the base
-			// element type, not the extended one
-			// // for example, it returns MethodPackage instead of
-			// ProcessPackage or ContentPackage
-			// // so we need to make our own map
-			// EClassifier c = feature.getEType();
-			// if ( !c.getName().equals(umaEClassName) ) {
-			// System.out.println("EClass name not match: " + c.getName() + "
-			// --- " + umaEClassName);
-			// }
-
-			EClass objClass = FeatureManager.INSTANCE
-					.getXmlEClass(umaEClassName);
-			if (objClass == null) {
-				logger.logWarning(NLS.bind(
-						ExportXMLResources.xmlLibrary_no_class, umaEClassName));
-				return null;
-			}
-
-			obj = (EDataObject) EcoreUtil.create(objClass);
-			setElement(guid, obj);
-
-			if (obj instanceof WorkOrder) {
-				// WorkOrder is not contained in a processPackage in xml model
-				// it's contained by the breakdownElement
-				// so we save the element id-object to the map and continue
-				// don't set the feature value
-				
-				// the workOrder in EPF UMA model is referenced by feature
-				// WorkBreakDownElement_LinkToPredecessor,
-				// the corresponding feature in the xml model is 
-				// WorkBreakDownElement_Predecessor, 
-				// the feature value is a list of guid of the WorkOrders
-				// when this feature value is set in the setReferenceValue() call
-				// get the XmlUma object, if it's WorkOrder, 
-				// add to the current workorder to the WorkBreakDownElement
-				// Jinhua Xi, 08/24/2006
-				return obj;
-			}
-
-			// note: all element references are string type (id)
-			// package references are object references
-			if (feature.isMany()) {
-				List values = (List) container.eGet(feature);
-				try {
-					if (feature instanceof EAttribute) {
-						values.add(guid);
-
-						// need to put the object in a container
-						// for example, the ContaiedArtifacts
-						addToContainer(container, obj);
-
-					} else if (feature instanceof EReference) {
-						try {
-							values.add(obj);
-						} catch (RuntimeException e) {
-							// TODO Auto-generated catch block
-							e.printStackTrace();
-						}
-					} else {
-						logger
-								.logWarning(NLS
-										.bind(
-												ExportXMLResources.xmlLibrary_error_create_element,
-												feature.getName()));
-					}
-				} catch (RuntimeException e) {
-					logger.logError(NLS.bind(
-							ExportXMLResources.xmlLibrary_error_set_value, obj,
-							container), e);
-					// e.printStackTrace();
-				}
-			} else {
-				if (feature instanceof EAttribute) {
-					container.eSet(feature, guid);
-					addToContainer(container, obj);
-				} else if (feature instanceof EReference) {
-					container.eSet(feature, obj);
-				} else {
-					logger.logWarning(NLS.bind(
-							ExportXMLResources.xmlLibrary_error_create_element,
-							feature.getName()));
-				}
-			}
-		}
-
-		return obj;
-	}
-
-	private void addToContainer(EObject container, EObject obj) {
-
-		if (container == null) {
-			return;
-		}
-		if (container instanceof ContentPackage) {
-			((ContentPackage) container).getContentElement().add(obj);
-		} else if (container instanceof ProcessPackage) {
-			((ProcessPackage) container).getProcessElement().add(obj);
-			// } else if ( (obj instanceof Constraint) && (container instanceof
-			// MethodElement) ) {
-			// // the owner rule should be a containment 0..n feature, waiting
-			// for model fix
-			// //((MethodElement)container).setO
-		} else {
-			addToContainer(container.eContainer(), obj);
-		}
-	}
-
-	/**
-	 * Sets attribute feature value.
-	 * @param obj
-	 * @param featureName
-	 * @param value
-	 * @throws Exception
-	 */
-	public void setAtributeFeatureValue(EDataObject obj, String featureName,
-			Object value) throws Exception {
-		if (obj == null || featureName == null || value == null) {
-			return;
-		}
-
-		if (value instanceof List || value instanceof EDataObject) {
-			if (featureName.equals("methodElementProperty")) {		//$NON-NLS-1$
-				setMepFeatureValue(obj, featureName, value);
-				return;
-			}
-			logger.logWarning(NLS.bind(
-					ExportXMLResources.xmlLibrary_invalid_feature_value,
-					featureName, value));
-
-			return;
-		}
-
-		// find the feature and set the value
-		EStructuralFeature feature = FeatureManager.INSTANCE.getXmlFeature(obj
-				.eClass(), featureName);
-		if (feature == null) {
-
-			// ignore missing features for WorkOrder
-			if (!(obj instanceof WorkOrder)) {
-				Object[] paras = new Object[] { featureName, obj, value };
-				logger
-						.logWarning(NLS
-								.bind(
-										ExportXMLResources.xmlLibrary_error_set_value_2,
-										paras));
-			}
-			return;
-		}
-
-		// 158688 - Missing template files in exported xml library
-		// process the attachment url
-		if ( feature == UmaPackage.eINSTANCE.getGuidanceDescription_Attachment() ) {
-			if ( value != null ) {
-				value = contentProc.resolveAttachmentResources(obj, value.toString().trim());
-			}
-			obj.eSet(feature, value);
-		}
-		
-		if (feature instanceof EAttribute) {
-			try {
-				if (feature.getName().equals("variabilityType")) { //$NON-NLS-1$
-					value = VariabilityType.get(value.toString());
-				} else if (feature.getName().equals("linkType")) { //$NON-NLS-1$
-					value = WorkOrderType.get(value.toString());
-				} else if (value instanceof java.util.Date) {
-					// convert java.util.Date to xml Date
-					value = getXmlDate((java.util.Date) value);
-				} else if ((contentProc != null)
-						&& (obj instanceof MethodElement)
-						&& (value instanceof String)) {
-					value = contentProc.resolveResourceFiles(
-							(MethodElement) obj, (String) value);
-				} else if (value instanceof java.net.URI) {									
-					org.eclipse.epf.uma.MethodPlugin srcPlugin = ExportResourceHandler.getSourcePlugin((org.eclipse.epf.xml.uma.MethodElement) obj);		
-					value = srcPlugin.getName() + "/" + ((java.net.URI) value).getPath(); ////$NON-NLS-1$
-					if (contentProc != null) {
-						contentProc.copyResource((String) value, obj, srcPlugin);
-					}
-				}
-				obj.eSet(feature, value);
-			} catch (RuntimeException e) {
-				Object[] paras = new Object[] { featureName, obj, value };
-				logger
-						.logError(
-								NLS
-										.bind(
-												ExportXMLResources.xmlLibrary_error_set_value_2,
-												paras), e);
-			}
-		} else {
-			System.out.println(ExportXMLResources.xmlLibrary_error_set_value_3); 
-		}
-
-	}
-
-	private void setMepFeatureValue(EDataObject obj, String featureName, Object value) {
-		List srcList = (List) value;
-		if (srcList == null || srcList.isEmpty()) {
-			return;
-		}
-		EStructuralFeature feature = FeatureManager.INSTANCE.getXmlFeature(obj
-				.eClass(), featureName);
-		List tgtList = (List) obj.eGet(feature);
-		for (int i=0; i < srcList.size(); i++) {
-			Object srcItem = srcList.get(i);
-			if (srcItem instanceof org.eclipse.epf.uma.MethodElementProperty) {
-				org.eclipse.epf.uma.MethodElementProperty mep = 
-						(org.eclipse.epf.uma.MethodElementProperty) srcItem;
-				EClass objClass = FeatureManager.INSTANCE
-				.getXmlEClass("MethodElementProperty");	//$NON-NLS-1$
-				MethodElementProperty xmlMep = (MethodElementProperty) EcoreUtil.create(objClass);
-				xmlMep.setValue(mep.getValue());
-				xmlMep.setName(mep.getName());
-				tgtList.add(xmlMep);
-			}
-		}
-		//obj.eSet(feature, tgtList);
-	}
-
-	/**
-	 * set the id references for the object
-	 * 
-	 * @param obj
-	 *            EDataObject the object
-	 * @param featureName
-	 *            String the feature of the object
-	 * @param idValue
-	 *            String the id reference value of the feature
-	 * @param valueType
-	 *            Type the object type of the reference. Need to have this to
-	 *            determine the xml feature in case the feature mappting is not
-	 *            unique
-	 * @throws Exception
-	 */
-	public void setReferenceValue(EDataObject obj, String featureName,
-			String idValue, Type valueType) throws Exception {
-		if (obj == null || featureName == null || idValue == null) {
-			return;
-		}
-
-		if (FeatureManager.INSTANCE.isUnneededRmcFeature(featureName)) {
-			return;
-		}
-
-		// find the feature and set the value
-		EStructuralFeature feature = FeatureManager.INSTANCE.getXmlFeature(obj
-				.eClass(), featureName, valueType.getName());
-		if (feature == null) {
-			Object[] paras = new Object[] { featureName, obj, idValue };
-			logger.logWarning(NLS.bind(
-					ExportXMLResources.xmlLibrary_error_set_reference, paras));
-			return;
-		}
-
-		String str = feature.getEType().getName();
-		if (str.equals("String")) { //$NON-NLS-1$
-			if (feature.isMany()) {
-				List l = (List) obj.eGet(feature);
-				if (!l.contains(idValue)) {
-					l.add(idValue);
-				}
-			} else {
-				obj.eSet(feature, idValue);
-			}
-		} else if (feature == UmaPackage.eINSTANCE
-				.getActivity_BreakdownElement()) {
-			// special handling for breakdown element. In uma, breakdown
-			// elements are under process packages
-			// in xml model, they are owned by the activity
-			EDataObject v = getElement(idValue);
-			if (v instanceof BreakdownElement) {
-				EObject old_container = v.eContainer();
-				List l = (List) obj.eGet(feature);
-				if (!l.contains(v)) {
-					l.add(v);
-				}
-
-				// if the old container package is empty, delete it
-				if ((old_container instanceof ProcessPackage)
-						&& (old_container.eContainer() instanceof ProcessComponent)) {
-					if (((ProcessPackage) old_container).getProcessElement()
-							.size() == 0) {
-						((ProcessPackage) old_container.eContainer())
-								.getMethodPackage().remove(old_container);
-					}
-				}
-			}
-		} else if ( feature == UmaPackage.eINSTANCE.getWorkBreakdownElement_Predecessor() ) {
-			// the orker order needs to be added to the WorkBreakdownElement
-			// since in Xml model the work order is contained by the WorkBreakdownElement
-			// Jinhua Xi, 08/24/2006
-			Object v = getElement(idValue);
-			if (v instanceof WorkOrder) {
-				((WorkBreakdownElement)obj).getPredecessor().add(v);
-			}
-		} else {
-			// not handled, add warning log
-			// the id feature value is not set
-			// JInhua Xi, TODO
-		}
-	}
-
-	/**
-	 * @param dt
-	 * @return a Xml date.
-	 */
-	public Object getXmlDate(java.util.Date dt) {
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //$NON-NLS-1$
-		String dtStr = sdf.format(dt);
-		dtStr = dtStr.replace(' ', 'T');
-		EDataType type = XMLTypePackage.eINSTANCE.getDateTime();
-		return XMLTypeFactory.eINSTANCE.createFromString(type, dtStr);
-
-	}
-
-	private String getString(Object obj) {
-		String str = ""; //$NON-NLS-1$
-		if (obj instanceof MethodElement) {
-			MethodElement me = (MethodElement) obj;
-			str = me.getType().getName() + ":" + me.getName(); //$NON-NLS-1$
-		} else if (obj != null) {
-			str = obj.toString();
-		}
-
-		return str;
-	}
-
-	/**
-	 * fix the library so that it meets the uma library standards
-	 * 
-	 */
-	public void fixLibraryForImport() {
-
-		fixGuid((MethodElement) rootObject);
-
-		if (rootObject instanceof MethodLibrary) {
-			for (Iterator it = ((MethodLibrary) rootObject).getMethodPlugin()
-					.iterator(); it.hasNext();) {
-				fixPlugin((MethodPlugin) it.next());
-			}
-		} else if (rootObject instanceof MethodPlugin) {
-			fixPlugin((MethodPlugin) rootObject);
-		}
-	}
-
-	/**
-	 * fix the library so that it meets the xml schema standards
-	 * also remove possible structure errors such as ProcessComponent without process in it.
-	 * 
-	 */
-	public void fixLibraryForExport() {
-
-		List invalidItems = new ArrayList();
-		for (Iterator it = ((MethodLibrary) rootObject).eAllContents(); it.hasNext();) {
-			Object obj = it.next();
-			if ( obj instanceof ProcessComponent ) {
-				org.eclipse.epf.xml.uma.Process proc = ((ProcessComponent)obj).getProcess();
-				if ( proc == null ) {
-					invalidItems.add(obj);
-				}
-			}
-		}
-
-		// remove the objects
-		while (invalidItems.size() > 0 ) {
-			EObject obj = (EObject)invalidItems.remove(0);
-			EcoreUtil.remove(obj);
-		}
-	}
-	
-	/**
-	 * fix task descriptors for export
-	 * 
-	 */
-	public void fixTaskDescriptorsForExport(Map<String, TaskDescriptor> tdMap) {
-		if (tdMap == null || tdMap.isEmpty()) {
-			return;
-		}		
-		for (Iterator<Map.Entry<String, TaskDescriptor>> it = tdMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry<String, TaskDescriptor> entry = it.next();
-			String guid = entry.getKey();
-			TaskDescriptor td = entry.getValue();
-			org.eclipse.epf.xml.uma.TaskDescriptor xmlTd = (org.eclipse.epf.xml.uma.TaskDescriptor) elementsMap.get(guid);
-			assert(xmlTd != null);
-			if (xmlTd == null) {
-				continue;
-			}
-			List steps = td.getSelectedSteps();
-			for (int i=0; i<steps.size(); i++) {
-				org.eclipse.epf.uma.MethodElement step = (org.eclipse.epf.uma.MethodElement) steps.get(i);
-				Section xmlStep =  (Section) elementsMap.get(step.getGuid());
-				assert(xmlStep != null);
-				if (xmlStep != null) {
-					xmlStep = (Section) EcoreUtil.copy(xmlStep);
-					xmlTd.getStep().add(xmlStep);
-				}
-			}			
-		}		
-	}
-			
-	/**
-	 * get a list of referenced plugins for the library. The referenced plugins
-	 * does not include the ones inside this library. When importing, these
-	 * plugins must be in the target library already.
-	 * 
-	 * @return List a list of referenced plugins
-	 */
-	public List getReferencedPlugins() {
-
-		List externalPlugins = new ArrayList();
-
-		if (!(rootObject instanceof MethodLibrary)) {
-			return externalPlugins;
-		}
-
-		List selectedPlugins = new ArrayList();
-		for (Iterator it = ((MethodLibrary) rootObject).getMethodPlugin()
-				.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			String id = plugin.getId();
-			selectedPlugins.add(id);
-			if (externalPlugins.contains(id)) {
-				externalPlugins.remove(id);
-			}
-
-			for (Iterator itr = plugin.getReferencedMethodPlugin().iterator(); itr
-					.hasNext();) {
-				String ref = (String) itr.next();
-				if (!selectedPlugins.contains(ref)
-						&& !externalPlugins.contains(ref)) {
-					externalPlugins.add(ref);
-				}
-			}
-		}
-
-		return externalPlugins;
-	}
-
-	private void fixGuid(MethodElement element) {
-		if (element == null) {
-			return;
-		}
-
-		// if the xml element does not have an id specified, create a new one
-		String id = element.getId();
-		if (id == null || id.equals("")) { //$NON-NLS-1$
-			id = EcoreUtil.generateUUID();
-			element.setId(id);
-			String msg = NLS.bind(ExportXMLResources.xmlLibrary_new_id,
-					getString(element), id);
-			logger.logWarning(msg);
-		} else {
-			// check if the element has a unique id or not
-			Object old = getElement(id);
-			if ((old != null) && (old != element)) {
-				if (! ( (old instanceof Section) && 
-						(element instanceof Section) 
-					   )) {
-					logger.logWarning(NLS.bind(
-						ExportXMLResources.xmlLibrary_id_not_unique, id));
-				}
-			}
-
-			setElement(id, element);
-		}
-		// iterate the children
-		for (Iterator it = element.eContents().iterator(); it.hasNext();) {
-			Object o = it.next();
-			if (o instanceof MethodElement) {
-				fixGuid((MethodElement) o);
-			}
-		}
-	}
-
-	private void fixPlugin(MethodPlugin plugin) {
-
-		// find all processes and make sure they are wrapped with a
-		// ProcessComponent,
-		// if not, create one.
-		// collect the processes to be fixed,
-		// don't fix within the iteration, may cause concurrent modification
-		// exeception
-		List procs = new ArrayList();
-		for (Iterator it = plugin.eAllContents(); it.hasNext();) {
-			EObject o = (EObject) it.next();
-			if (isProcess(o)) {
-				procs.add(o);
-			}
-		}
-
-		if (procs.size() > 0) {
-			for (Iterator it = procs.iterator(); it.hasNext();) {
-				fixProcess((org.eclipse.epf.xml.uma.Process) it.next());
-			}
-		}
-	}
-
-	/**
-	 * In EPF, a process (Capability pattern and Delivery Process) can be reside
-	 * in a ProcessPackage or a ProcessComponent. If it's in a processComponent,
-	 * it is treated as a root level process. If it's in a ProcessPackage, it is
-	 * treated as a local copy of another process. So we need to check the
-	 * parent and see it this process is contained by a ProcessComponent.
-	 * 
-	 * @param Obj
-	 * @return boolean
-	 */
-	private boolean isProcess(EObject obj) {
-		if (!(obj instanceof org.eclipse.epf.xml.uma.Process)) {
-			return false;
-		}
-
-		obj = obj.eContainer();
-		if (obj instanceof ProcessComponent) {
-			return true;
-		}
-
-		// if it's immediate parent is not a ProcessComponent but it's within a
-		// ProcessComponent
-		// it's a local copy of the process
-		while (((obj = obj.eContainer()) != null)
-				&& (obj instanceof ProcessPackage)) {
-			if (obj instanceof ProcessComponent) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	private void fixProcess(org.eclipse.epf.xml.uma.Process proc) {
-		EDataObject container = (EDataObject) proc.eContainer();
-		ProcessComponent pc = null;
-		if (container instanceof ProcessComponent) {
-			return;
-		}
-
-		if (!(container instanceof ProcessPackage)) {
-			String msg = NLS
-					.bind(
-							ExportXMLResources.xmlLibrary_error_process_wrong_container,
-							proc.getName(), container.getType().getName());
-			logger.logWarning(msg);
-			return;
-		}
-
-		pc = UmaFactory.eINSTANCE.createProcessComponent();
-		String id = getTargetParentId(proc.getId());
-		if (id == null) {
-			id = EcoreUtil.generateUUID();
-		}
-
-		pc.setId(id);
-		pc.setName(proc.getName());
-		((ProcessPackage) container).getProcessElement().remove(proc);
-		((ProcessPackage) container).getMethodPackage().add(pc);
-		pc.setProcess(proc);
-
-	}
-
-	/**
-	 * if the process exists in the target library, get the process component id
-	 * from the target library
-	 */
-	private String getTargetParentId(String id) {
-		ILibraryManager manager = LibraryService.getInstance()
-				.getCurrentLibraryManager();
-		if (manager != null) {
-			EObject obj = manager.getMethodElement(id);
-			if (obj != null) {
-				obj = obj.eContainer();
-				if (obj instanceof org.eclipse.epf.uma.MethodElement) {
-					return ((org.eclipse.epf.uma.MethodElement) obj).getGuid();
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param pkg
-	 * @return the list of all processes in pkg.
-	 */
-	public List getAllProcesses(MethodPackage pkg) {
-		List processes = new ArrayList();
-		_iteratePackageForProcesses(pkg, processes);
-
-		return processes;
-	}
-
-	private void _iteratePackageForProcesses(MethodPackage pkg, List processes) {
-		if (pkg instanceof ProcessComponent) {
-			org.eclipse.epf.xml.uma.Process p = ((ProcessComponent) pkg)
-					.getProcess();
-			if (p != null && !processes.contains(p)) {
-				processes.add(p);
-			}
-		}
-
-		for (Iterator it = pkg.getMethodPackage().iterator(); it.hasNext();) {
-			_iteratePackageForProcesses((MethodPackage) it.next(), processes);
-		}
-	}
-
-	
-	/**
-	 * Save extra info (all plugin guids and names) in libTag's MethodElementProperty
-	 */
-	protected void storeExtraInfo(List<org.eclipse.epf.uma.MethodPlugin> plugins) {
-		if (plugins == null) {
-			return;
-		}		
-		
-		EStructuralFeature feature = FeatureManager.INSTANCE.getXmlFeature(rootObject
-				.eClass(), "methodElementProperty");		//$NON-NLS-1$
-		
-		List mepList = (List) rootObject.eGet(feature);
-		EClass mepClass = FeatureManager.INSTANCE.getXmlEClass("MethodElementProperty");	//$NON-NLS-1$
-		
-		MethodElementProperty xmlMep = (MethodElementProperty) EcoreUtil.create(mepClass);
-		
-		//Version
-		xmlMep.setValue("0");	//$NON-NLS-1$
-		mepList.add(xmlMep);
-					
-		for (Iterator<org.eclipse.epf.uma.MethodPlugin> it = plugins.iterator(); it.hasNext();) {
-			org.eclipse.epf.uma.MethodPlugin plug = it.next();
-			
-			xmlMep = (MethodElementProperty) EcoreUtil.create(mepClass);
-			xmlMep.setValue(plug.getGuid());
-			mepList.add(xmlMep);
-			
-			xmlMep = (MethodElementProperty) EcoreUtil.create(mepClass);
-			xmlMep.setValue(plug.getName());
-			mepList.add(xmlMep);
-		}
-		
-	}
-	
-	/**
-	 * Get guid to plugin map
-	 */
-	public Map<String, String> getGuidToPlugNameMap() {
-		if (guidToPlugNameMap == null) {
-			recallExtraInfo();
-		}		
-		return guidToPlugNameMap;
-	}
-	
-	private void recallExtraInfo() {
-		try {
-			EStructuralFeature feature = FeatureManager.INSTANCE.getXmlFeature(rootObject
-					.eClass(), "methodElementProperty");		//$NON-NLS-1$
-			
-			List<MethodElementProperty> mepList = (List<MethodElementProperty>) rootObject.eGet(feature);
-			if (mepList == null || mepList.isEmpty()) {
-				return;
-			}
-			guidToPlugNameMap = new HashMap<String, String>();
-			
-			MethodElementProperty mep = mepList.get(0);
-			if (mep.getValue().equals("0")) { //$NON-NLS-1$  
-				for (int i = 1; i < mepList.size();) {
-					String guid = mepList.get(i).getValue();
-					String name = mepList.get(i+1).getValue();
-					guidToPlugNameMap.put(guid, name);
-					i += 2;
-				}
-			}
-		} catch (Exception e) {
-			guidToPlugNameMap = new HashMap<String, String>();
-			e.printStackTrace();
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/package.html b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/package.html
deleted file mode 100644
index bfb7675..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/services/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for the Export XML service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ExportXMLWizard.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ExportXMLWizard.java
deleted file mode 100644
index 7604285..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ExportXMLWizard.java
+++ /dev/null
@@ -1,176 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.wizards;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.export.services.ConfigurationExportData;
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.epf.export.xml.ExportXMLPlugin;
-import org.eclipse.epf.export.xml.ExportXMLResources;
-import org.eclipse.epf.export.xml.preferences.ExportXMLPreferences;
-import org.eclipse.epf.export.xml.services.ExportXMLData;
-import org.eclipse.epf.export.xml.services.ExportXMLService;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * The Export XML wizard.
- * <p>
- * This wizard is used to export method library content to XML files.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportXMLWizard extends Wizard implements IImportWizard {
-
-	private SelectExportTypePage selectExportTypePage;
-
-	protected SelectPluginPage selectPluginPage;
-
-	protected ViewPluginInfoPage viewPluginInfoPage;
-
-	protected ViewExportSummaryPage viewExportSummaryPage;
-
-	protected SelectConfigPage selectConfigPage;
-
-	protected SelectXMLFilePage selectXMLFilePage;
-
-	protected ExportXMLData xmlData = new ExportXMLData();
-
-	protected PluginExportData pluginData = new PluginExportData();
-
-	protected ConfigurationExportData configData = new ConfigurationExportData();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportXMLWizard() {
-		super();
-		setWindowTitle(ExportXMLResources.exportXMLWizard_title);
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		selectExportTypePage = new SelectExportTypePage();
-		selectPluginPage = new SelectPluginPage(pluginData);
-		viewPluginInfoPage = new ViewPluginInfoPage(pluginData);
-		viewExportSummaryPage = new ViewExportSummaryPage(pluginData);
-		selectConfigPage = new SelectConfigPage(configData);
-		selectXMLFilePage = new SelectXMLFilePage();
-
-		addPage(selectExportTypePage);
-		addPage(selectPluginPage);
-		addPage(viewPluginInfoPage);
-		addPage(viewExportSummaryPage);
-		addPage(selectConfigPage);
-		addPage(selectXMLFilePage);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				ExportXMLPlugin.getDefault().getSharedImage(
-						"full/obj16/XMLFile.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		return getContainer().getCurrentPage() == selectXMLFilePage
-				&& selectXMLFilePage.isPageComplete();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		String xmlFilePath = selectXMLFilePage.getPath();
-		File xmlFile = new File(xmlFilePath);
-		if (xmlFile.exists()) {
-			boolean ok = ExportXMLPlugin.getDefault().getMsgDialog()
-					.displayPrompt(
-							ExportXMLResources.exportXMLWizard_title,
-							ExportXMLResources.bind(
-									ExportXMLResources.overwriteText_msg,
-									new String[] { xmlFilePath }));
-			if (!ok) {
-				return false;
-			}
-		}
-
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				ExportXMLService service = null;
-				try {
-					monitor.beginTask(ExportXMLResources.exportingXML_text,
-							IProgressMonitor.UNKNOWN);
-
-					xmlData.setXMLFile(selectXMLFilePage.getPath());
-					service = new ExportXMLService(xmlData);
-					service.doExport(monitor);
-					ExportXMLPreferences.setExportType(xmlData.getExportType());
-					ExportXMLPreferences.setXMLFile(xmlData.getXMLFile());
-				} catch (Exception e) {
-					throw new InvocationTargetException(e);
-				} finally {
-					monitor.done();
-					if (service != null) {
-						service.dispose();
-					}
-				}
-			}
-		};
-		try {
-			getContainer().run(true, false, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			Throwable realException = e.getTargetException();
-			ExportXMLPlugin.getDefault().getMsgDialog().displayError(
-					ExportXMLResources.exportXMLWizard_title,
-					NLS.bind(ExportXMLResources.exportXMLWizard_error,
-							realException.getMessage()), realException);
-			return false;
-		}
-
-		String msg = ExportXMLResources.exportXMLWizard_reviewLog;
-		MsgBox.prompt(msg, SWT.OK);
-
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectConfigPage.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectConfigPage.java
deleted file mode 100644
index 41e6cbc..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectConfigPage.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.wizards;
-
-import org.eclipse.epf.export.services.ConfigurationExportData;
-import org.eclipse.epf.export.wizards.ExportConfigSelectConfigPage;
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * A wizard page that prompts the user to select one or more method configuration
- * specifications to export.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectConfigPage extends ExportConfigSelectConfigPage {
-
-	/**
-	 * Creates a nes instance.
-	 */
-	public SelectConfigPage(ConfigurationExportData data) {
-		super(data);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		super.saveDataToModel();
-		ExportXMLWizard wizard = (ExportXMLWizard) getWizard();
-		wizard.xmlData.setSelectedConfigs(wizard.configData.selectedConfigs);		
-		return wizard.selectXMLFilePage;
-	}	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectExportTypePage.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectExportTypePage.java
deleted file mode 100644
index 314a108..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectExportTypePage.java
+++ /dev/null
@@ -1,142 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.wizards;
-
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.xml.ExportXMLPlugin;
-import org.eclipse.epf.export.xml.ExportXMLResources;
-import org.eclipse.epf.export.xml.preferences.ExportXMLPreferences;
-import org.eclipse.epf.export.xml.services.ExportXMLData;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * A wizard page that displays the type of method library content to export.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectExportTypePage extends BaseWizardPage implements Listener {
-
-	public static final String PAGE_NAME = SelectExportTypePage.class.getName();
-
-	private Button exportLibraryRadioButton;
-
-	private Button exportPluginsRadioButton;
-
-	// Postponed to next release.
-	//private Button exportConfigsRadioButton;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectExportTypePage() {
-		super(PAGE_NAME);
-		setTitle(ExportResources.selectExportTypePage_title);
-		setDescription(ExportXMLResources.selectExportTypePage_desc);
-		setImageDescriptor(ExportXMLPlugin.getDefault().getImageDescriptor(
-				"full/wizban/ExportXML.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		exportLibraryRadioButton = createRadioButton(container,
-				ExportXMLResources.exportLibraryRadioButton_text, 1, false);
-
-		exportPluginsRadioButton = createRadioButton(container,
-				ExportXMLResources.exportPluginsRadioButton_text, 1, false);
-
-		// Postponed to next release.
-		//exportConfigsRadioButton = createRadioButton(container,
-		//		ExportXMLResources.exportConfigsRadioButton_text, 1, false);
-		
-		switch (ExportXMLPreferences.getExportType()) {
-		case ExportXMLData.EXPORT_METHOD_LIBRARY:
-			exportLibraryRadioButton.setSelection(true);
-			break;
-		case ExportXMLData.EXPORT_METHOD_PLUGINS:
-			exportPluginsRadioButton.setSelection(true);
-			break;
-		// Postponed to next release.			
-		//case ExportXMLData.EXPORT_METHOD_CONFIGS:
-		//	exportConfigsRadioButton.setSelection(true);
-		//	break;
-		}
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(true);
-	}
-
-	private void addListeners() {
-		exportLibraryRadioButton.addListener(SWT.Selection, this);
-		exportPluginsRadioButton.addListener(SWT.Selection, this);
-		// Postponed to next release.		
-		//exportConfigsRadioButton.addListener(SWT.Selection, this);
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(Event)
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-	
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		return getErrorMessage() == null;
-	}	
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public IWizardPage getNextPage() {
-		ExportXMLWizard wizard = (ExportXMLWizard) getWizard();
-
-		if (exportLibraryRadioButton.getSelection()) {
-			wizard.xmlData.setExportType(ExportXMLData.EXPORT_METHOD_LIBRARY);
-			return wizard.selectXMLFilePage;
-		} else if (exportPluginsRadioButton.getSelection()) {
-			wizard.xmlData.setExportType(ExportXMLData.EXPORT_METHOD_PLUGINS);
-			return wizard.selectPluginPage;
-		}
-		// Postponed to next release.
-		//else if (exportConfigsRadioButton.getSelection()) {
-		//	wizard.xmlData.setExportType(ExportXMLData.EXPORT_METHOD_CONFIGS);
-		//	return wizard.selectConfigPage;
-		//}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectPluginPage.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectPluginPage.java
deleted file mode 100644
index 11b6f34..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectPluginPage.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.wizards;
-
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * A wizard page that prompts the user to select one or more method plug-ins to
- * export.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectPluginPage extends
-		org.eclipse.epf.export.wizards.SelectPluginPage {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectPluginPage(PluginExportData data) {
-		super(data);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		super.saveDataToModel();
-		ExportXMLWizard wizard = (ExportXMLWizard) getWizard();
-		wizard.xmlData.setSelectedPlugins(wizard.pluginData.selectedPlugins);
-		ViewPluginInfoPage page = wizard.viewPluginInfoPage;
-		page.onEnterPage(null);
-		return page;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectXMLFilePage.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectXMLFilePage.java
deleted file mode 100644
index a4071ec..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/SelectXMLFilePage.java
+++ /dev/null
@@ -1,143 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.wizards;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.export.xml.ExportXMLPlugin;
-import org.eclipse.epf.export.xml.ExportXMLResources;
-import org.eclipse.epf.export.xml.preferences.ExportXMLPreferences;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to specify a XML file to store the
- * exported method library content.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectXMLFilePage extends WizardPage {
-
-	public static final String PAGE_NAME = SelectXMLFilePage.class.getName();
-
-	private Text pathText;
-
-	private String path;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectXMLFilePage() {
-		super(PAGE_NAME);
-		setTitle(ExportXMLResources.selectXMLFilePage_title);
-		setDescription(ExportXMLResources.selectXMLFilePage_desc);
-		setImageDescriptor(ExportXMLPlugin.getDefault().getImageDescriptor(
-				"full/wizban/ExportXML.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(3, false));
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label fileLabel = new Label(composite, SWT.NONE);
-		fileLabel.setText(ExportXMLResources.fileLabel_text);
-
-		pathText = new Text(composite, SWT.BORDER);
-		pathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		pathText.setText(ExportXMLPreferences.getXMLFile());
-		pathText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (isValidPath(pathText.getText().trim())) {
-					setPageComplete(true);
-					setErrorMessage(null);
-				} else {
-					setPageComplete(false);
-					setErrorMessage(ExportXMLResources.invalidXMLFile_error);
-				}
-			}
-		});
-
-		Button browseButton = new Button(composite, SWT.PUSH);
-		browseButton.setLayoutData(new GridData(GridData.END));
-		browseButton.setText(ExportXMLResources.browseButton_text);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				FileDialog fd = new FileDialog(Display.getCurrent()
-						.getActiveShell(), SWT.SAVE);
-				fd.setFilterExtensions(new String[] { "*.xml", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
-				String path = fd.open();
-				boolean ok = false;
-				if (path != null) {
-					pathText.setText(path);
-					ok = isValidPath(path);
-				}
-				setPageComplete(ok);
-				getWizard().getContainer().updateButtons();
-			}
-		});
-
-		setControl(composite);
-
-		setPageComplete(isValidPath(pathText.getText().trim()));
-	}
-
-	/**
-	 * Checks whether the user specific path is valid.
-	 * 
-	 * @param path
-	 *            the user specific path
-	 * @return <code>true</code> if the user specified path is valid.
-	 */
-	private boolean isValidPath(String path) {
-		IPath ecPath = Path.fromOSString(path);
-		if (ecPath.isValidPath(path) && path.endsWith(".xml")) { //$NON-NLS-1$
-			this.path = path;
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public IWizardPage getNextPage() {
-		return null; // no more page
-	}
-
-	/**
-	 * Gets the user specified XML file.
-	 * 
-	 * @return an absolute path to the XML file
-	 */
-	public String getPath() {
-		return this.path;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ViewExportSummaryPage.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ViewExportSummaryPage.java
deleted file mode 100644
index 34c8633..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ViewExportSummaryPage.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.wizards;
-
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.epf.export.wizards.ExportPluginSummaryPage;
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * A wizard page that displays a summary of the selected method plug-ins that
- * will be exported.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ViewExportSummaryPage extends ExportPluginSummaryPage {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ViewExportSummaryPage(PluginExportData data) {
-		super(data);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		ExportXMLWizard wizard = (ExportXMLWizard) getWizard();
-		return wizard.selectXMLFilePage;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ViewPluginInfoPage.java b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ViewPluginInfoPage.java
deleted file mode 100644
index fd79dc4..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/ViewPluginInfoPage.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.xml.wizards;
-
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.epf.export.wizards.PluginInfoPage;
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * A wizard page that prompts the user to review the dependencies of the method
- * plug-ins that have been selected for export.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ViewPluginInfoPage extends PluginInfoPage {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ViewPluginInfoPage(PluginExportData data) {
-		super(data);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		super.saveDataToModel();
-		ExportXMLWizard wizard = (ExportXMLWizard) getWizard();
-		wizard.xmlData.setAssociatedConfigs(wizard.pluginData.associatedConfigMap);
-		ViewExportSummaryPage page = wizard.viewExportSummaryPage;
-		page.onEnterPage(null);
-		return page;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/package.html b/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/package.html
deleted file mode 100644
index 44c1ccf..0000000
--- a/1.5/plugins/org.eclipse.epf.export.xml/src/org/eclipse/epf/export/xml/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides wizards for exporting method library content to XML.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export/.classpath b/1.5/plugins/org.eclipse.epf.export/.classpath
deleted file mode 100644
index 8c4f20f..0000000
--- a/1.5/plugins/org.eclipse.epf.export/.classpath
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.export/.options b/1.5/plugins/org.eclipse.epf.export/.options
deleted file mode 100644
index 6f75942..0000000
--- a/1.5/plugins/org.eclipse.epf.export/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the export plug-in
-org.eclipse.epf.export/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.export/.project b/1.5/plugins/org.eclipse.epf.export/.project
deleted file mode 100644
index d5aa490..0000000
--- a/1.5/plugins/org.eclipse.epf.export/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.export</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.export/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.export/META-INF/MANIFEST.MF
deleted file mode 100644
index bb707a7..0000000
--- a/1.5/plugins/org.eclipse.epf.export/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.export; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.export.ExportPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.export,
- org.eclipse.epf.export.services,
- org.eclipse.epf.export.wizards
-Require-Bundle: org.apache.ant,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.epf.authoring.ui,
- org.eclipse.epf.library,
- org.eclipse.epf.publishing,
- org.eclipse.epf.common.ui
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.export/build.properties b/1.5/plugins/org.eclipse.epf.export/build.properties
deleted file mode 100644
index 6c780cd..0000000
--- a/1.5/plugins/org.eclipse.epf.export/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/Authoring.gif b/1.5/plugins/org.eclipse.epf.export/icons/Authoring.gif
deleted file mode 100644
index 531baf2..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/Authoring.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/ContentPackage.gif b/1.5/plugins/org.eclipse.epf.export/icons/ContentPackage.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/ContentPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/Folder.gif b/1.5/plugins/org.eclipse.epf.export/icons/Folder.gif
deleted file mode 100644
index 06419d8..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/Folder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/Packaging.gif b/1.5/plugins/org.eclipse.epf.export/icons/Packaging.gif
deleted file mode 100644
index a96394f..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/Packaging.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/Roles.gif b/1.5/plugins/org.eclipse.epf.export/icons/Roles.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/Roles.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/Tasks.gif b/1.5/plugins/org.eclipse.epf.export/icons/Tasks.gif
deleted file mode 100644
index 638bd83..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/Tasks.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/error.gif b/1.5/plugins/org.eclipse.epf.export/icons/error.gif
deleted file mode 100644
index c5e7a94..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/error.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/etool16/exp_lib_conf.gif b/1.5/plugins/org.eclipse.epf.export/icons/etool16/exp_lib_conf.gif
deleted file mode 100644
index 1d7d4e1..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/etool16/exp_lib_conf.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/etool16/exp_meth_plugin.gif b/1.5/plugins/org.eclipse.epf.export/icons/etool16/exp_meth_plugin.gif
deleted file mode 100644
index 5f6f8bd..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/etool16/exp_meth_plugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/full/wizban/exp_lib_conf_wizban.gif b/1.5/plugins/org.eclipse.epf.export/icons/full/wizban/exp_lib_conf_wizban.gif
deleted file mode 100644
index 6844b5b..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/full/wizban/exp_lib_conf_wizban.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/full/wizban/exp_meth_plugin_wizban.gif b/1.5/plugins/org.eclipse.epf.export/icons/full/wizban/exp_meth_plugin_wizban.gif
deleted file mode 100644
index adc5673..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/full/wizban/exp_meth_plugin_wizban.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/icons/warning.gif b/1.5/plugins/org.eclipse.epf.export/icons/warning.gif
deleted file mode 100644
index 1ee20aa..0000000
--- a/1.5/plugins/org.eclipse.epf.export/icons/warning.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.export/plugin.properties b/1.5/plugins/org.eclipse.epf.export/plugin.properties
deleted file mode 100644
index bef7e5b..0000000
--- a/1.5/plugins/org.eclipse.epf.export/plugin.properties
+++ /dev/null
@@ -1,49 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Export
-providerName=Eclipse.org
-
-# Perspective
-packagingPerspectiveName=Packaging
-
-# Category
-packagingCategoryName=Packaging
-
-# Views
-packagingViewName=Packaging Method Library
-packagingMessageViewName=Library Packaging Message
-
-# Action Set
-packagingActionSet=Packaging
-
-# Actions
-newConfigAction=&Configuration
-newConfigActionTooltip=Create a new library Configuration
-openConfigAction=&Configuration
-openConfigActionTooltip=Open an existing library configuration
-
-# Export Wizard Category
-exportCategoryName=Method
-
-# Export Library Configuration Wizard
-exportLibraryConfigurationWizardName=Library Configuration
-exportLibraryConfiguration=Export a library configuration.
-
-# Export Method Plug-ins Wizard
-exportMethodPluginsWizardName=Method Plug-ins
-exportMethodPlugins=Export one or more method plug-ins.
-
-
-
-               
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export/plugin.xml b/1.5/plugins/org.eclipse.epf.export/plugin.xml
deleted file mode 100644
index a73f48d..0000000
--- a/1.5/plugins/org.eclipse.epf.export/plugin.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.exportWizards">
-      <wizard
-            category="org.eclipse.epf.ui.exportWizards.category"
-            class="org.eclipse.epf.export.wizards.ExportConfigurationWizard"
-            icon="/icons/etool16/exp_lib_conf.gif"
-            id="org.eclipse.epf.export.wizards.ExportConfigurationWizard"
-            name="%exportLibraryConfigurationWizardName">
-         <description>
-               %exportLibraryConfiguration
-         </description>
-      </wizard>
-      <wizard
-            category="org.eclipse.epf.ui.exportWizards.category"
-            class="org.eclipse.epf.export.wizards.ExportPluginWizard"
-            icon="/icons/etool16/exp_meth_plugin.gif"
-            id="org.eclipse.epf.export.wizards.ExportPluginWizard"
-            name="%exportMethodPluginsWizardName">
-         <description> 
-               %exportMethodPlugins
-         </description>
-      </wizard> 
-   </extension>
-
-   <extension
-         point="org.eclipse.epf.ui.exportWizards">
-      <wizard id="org.eclipse.epf.export.wizards.ExportConfigurationWizard"/>
-      <wizard id="org.eclipse.epf.export.wizards.ExportPluginWizard"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportOptions.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportOptions.java
deleted file mode 100644
index 7213b48..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportOptions.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export;
-
-import java.io.File;
-
-/**
- * The export options.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ExportOptions {
-
-	protected File exportDir;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportOptions() {
-	}
-
-	/**
-	 * Gets the user selected export directory.
-	 * 
-	 * @return a directory for storing the exported content
-	 */
-	public File getExportDir() {
-		return exportDir;
-	}
-
-	/**
-	 * Sets the user selected export directory.
-	 * 
-	 * @param exportDir
-	 *            a directory for storing the exported content
-	 */
-	public void setExportDir(File exportDir) {
-		this.exportDir = exportDir;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportPlugin.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportPlugin.java
deleted file mode 100644
index b12f5c8..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportPlugin.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * The Export plugin class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static ExportPlugin plugin;
-
-	/**
-	 * Default constructor.
-	 */
-	public ExportPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext context)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext context)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static ExportPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportProcessOptions.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportProcessOptions.java
deleted file mode 100644
index 7c85996..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportProcessOptions.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export;
-
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * The export prcoess options.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ExportProcessOptions extends ExportOptions {
-
-	protected MethodConfiguration config;
-
-	private boolean publishWebSite;
-
-	private PublishOptions publishingOptions;
-
-	private boolean exportOnlyPlannedWBSElements;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportProcessOptions() {
-		super();
-	}
-
-	/**
-	 * Gets the method configuration that will be used export the process.
-	 * 
-	 * @return a method configuration
-	 */
-	public MethodConfiguration getMethodConfiguration() {
-		return config;
-	}
-
-	/**
-	 * Sets the method configuration that will be used export the process.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 */
-	public void setMethodConfiguration(MethodConfiguration config) {
-		this.config = config;
-	}
-
-	/**
-	 * Gets the publish process web site option.
-	 * 
-	 * @return <code>true</code> if the process web site should be published
-	 *         as part of the export operation
-	 */
-	public boolean getPublishWebSite() {
-		return publishWebSite;
-	}
-
-	/**
-	 * Sets the publish process web site option.
-	 * 
-	 * @param publishWebSite
-	 *            if <code>true</code>, publish the process web site
-	 */
-	public void setPublishWebSite(boolean publishWebSite) {
-		this.publishWebSite = publishWebSite;
-	}
-
-	/**
-	 * Gets the publishing options.
-	 * 
-	 * @return the publishing options that will be used to publish the process
-	 *         web site
-	 */
-	public PublishOptions getPublishingOptions() {
-		return publishingOptions;
-	}
-
-	/**
-	 * Sets the publishing options.
-	 * 
-	 * @param publishingOptions
-	 *            the publishing options that will be used to publish the
-	 *            process web site
-	 */
-	public void setPublishingOptions(PublishOptions publishingOptions) {
-		this.publishingOptions = publishingOptions;
-	}
-
-	/**
-	 * Gets the export only planned WBS elements option.
-	 * 
-	 * @return <code>true</code> if only planned WBS elements should be
-	 *         exported.
-	 */
-	public boolean getExportOnlyPlannedWBSElements() {
-		return exportOnlyPlannedWBSElements;
-	}
-
-	/**
-	 * Sets the export only planned WBS elements option.
-	 * 
-	 * @param exportOnlyPlannedWBSElements
-	 *            if <code>true</code>, export only planned WBS elements
-	 */
-	public void setExportOnlyPlannedWBSElements(
-			boolean exportOnlyPlannedWBSElements) {
-		this.exportOnlyPlannedWBSElements = exportOnlyPlannedWBSElements;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportResources.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportResources.java
deleted file mode 100644
index 4b4d562..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/ExportResources.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.export;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class ExportResources extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.epf.export.Resources";//$NON-NLS-1$
-
-	private ExportResources() {
-		// Do not instantiate
-	}
-
-	public static String exportConfigWizard_title;
-	public static String selectExportTypePage_title;
-	public static String selectExportTypePage_desc;
-	public static String selectExportTypePage_configLabel_text;
-	public static String selectExportTypePage_configSpecsLabel_text;
-	public static String selectConfigPage_title;
-	public static String selectConfigPage_desc;
-	public static String selectConfigPage_configsLabel_text;
-	public static String selectConfigSpecsPage_title;
-	public static String selectConfigSpecsPage_desc;
-	public static String selectConfigSpecsPage_configsLabel_text;
-	public static String checkConfigPage_title;
-	public static String checkConfigPage_desc;
-	public static String selectDestinationPage_title;
-	public static String selectDestinationPage_desc;
-	public static String exportPluginsWizard_title;
-	public static String selectPluginsPage_title;
-	public static String selectPluginsPage_desc;
-	public static String selectPluginsPage_pluginsLabel_text;
-	public static String reviewPluginsPage_title;
-	public static String reviewPluginsPage_desc;
-	public static String reviewPluginsPage_pluginsLabel_text;
-	public static String reviewPluginsPage_dependentPluginsLabel_text;
-	public static String reviewPluginsPage_associatedConfigsLabel_text;
-	public static String exportPluginSummaryPage_title;
-	public static String exportPluginSummaryPage_desc;
-	public static String exportPluginSummaryPage_noPlugin_text;
-	public static String specifyPathPage_title;
-	public static String specifyPathPage_desc;
-	public static String SavePluginPage_desc;
-	public static String ExportPluginWizard_title;
-	public static String ExportPluginError_msg;
-	public static String exportConfigErrorDialog_title;
-	public static String exportConfigErrorDialog_msg;
-	public static String analyzingConfigTask_name;
-	public static String ConfigurationSpecsExportService_MSG0;
-	public static String ConfigurationSpecsExportService_MSG1;
-	public static String ExportConfigCheckingPage_summary_1;
-	public static String ExportConfigCheckingPage_summary_2;
-	public static String ExportConfigCheckingPage_summary_3;
-	public static String ExportConfigCheckingPage_summary_4;
-	public static String ExportConfigCheckingPage_checking;
-	public static String ExportConfigSelectConfigPage_title;
-	public static String DestinationCommonPage_label_browse;
-	public static String DestinationCommonPage_label_default_dir;
-	public static String ConfigurationExportService_MSG0;
-	public static String ConfigurationExportService_MSG2;
-	public static String ConfigurationExportService_MSG4;
-	public static String ConfigurationExportService_MSG1;
-	public static String ConfigurationExportService_MSG9;
-	public static String DestinationCommonPage_label_name;
-	public static String DestinationCommonPage_label_dir;
-	public static String ExportPluginWizard_error;
-	public static String DestinationCommonPage_title;
-	public static String DestinationCommonPage_desc;
-	public static String PluginExportService_MSG0;
-	public static String PluginExportService_MSG1;
-	public static String PluginExportService_MSG2;
-	public static String PluginExportService_MSG3;
-	public static String PluginExportService_MSG4;
-	public static String SaveLibraryPage_title;
-	public static String SavePluginPage_label_name;
-	public static String SaveLibraryPage_desc;
-	public static String ExportPluginWizard_MSG1;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ExportResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/Resources.properties b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/Resources.properties
deleted file mode 100644
index 8e1f195..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/Resources.properties
+++ /dev/null
@@ -1,88 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-#
-# Message ID Range: IUPE0000E - IUPE0099E
-#
-
-# Export Library Configuration Wizard
-exportConfigWizard_title=Export Library Configuration
-selectExportTypePage_title=Select export type
-selectExportTypePage_desc=Select the type of library configuration to export.
-selectExportTypePage_configLabel_text=Export a method configuration and all its method plug-ins
-selectExportTypePage_configSpecsLabel_text=Export one or more method configuration specifications
-selectConfigPage_title=Select method configuration
-selectConfigPage_desc=Select a method configuration to export. All referenced method plug-ins in the selected configuration will be included in the export.
-selectConfigPage_configsLabel_text=Method configurations:
-selectConfigSpecsPage_title=Select configuration specifications
-selectConfigSpecsPage_desc=Select one or more method configuration specifications to export.
-selectConfigSpecsPage_configsLabel_text=Method configurations:
-checkConfigPage_title=Review configuration errors
-checkConfigPage_desc=An integrity check has been performed on the selected method configuration. Review the error report and perform the necessary corrective actions.
-selectDestinationPage_title=Specify export directory
-selectDestinationPage_desc=Specify a destination directory to store the exported configuration.
-
-# Export Method Plug-ins Wizard
-exportPluginsWizard_title=Export Method Plug-ins
-selectPluginsPage_title=Select method plug-ins
-selectPluginsPage_desc=Select one or more method plug-ins to export.
-selectPluginsPage_pluginsLabel_text=Method plug-ins:
-reviewPluginsPage_title=Review dependencies
-reviewPluginsPage_desc=Select each method plug-in to review its dependencies. Click Back to select the dependent plug-ins if they must be included in the export.
-reviewPluginsPage_pluginsLabel_text=Method Plug-ins:
-reviewPluginsPage_dependentPluginsLabel_text=Dependent method plug-ins:
-reviewPluginsPage_associatedConfigsLabel_text=Associated method configurations:
-exportPluginSummaryPage_title=Confirm export
-exportPluginSummaryPage_desc=Confirm the method plug-ins that will be exported.
-exportPluginSummaryPage_noPlugin_text=No method plug-in has been selected.
-specifyPathPage_title=Specify export directory
-specifyPathPage_desc=Specify a destination directory to store the exported method plug-ins.
-SavePluginPage_desc=Export the selected plug-ins and configurations to the specified destination directory.
-ExportPluginWizard_title=Export Method Plug-in Wizard Error
-ExportPluginError_msg=IUPE0000E: Error encountered in exporting
-
-# Export Library Configuration Error Dialog
-exportConfigErrorDialog_title=Export Library Configuration
-exportConfigErrorDialog_msg=IUPE0001E: The export operation cannot proceed.
-
-# Progress Messages
-analyzingConfigTask_name=Analyzing library configuration...
-
-# The following messages have not been reviewed.
-ConfigurationSpecsExportService_MSG0=Exporting configuration...
-ConfigurationSpecsExportService_MSG1=Export done.
-ExportConfigCheckingPage_summary_1=Checking the integrity of the selected configuration...\n
-ExportConfigCheckingPage_summary_2=No configuration selected.\n
-ExportConfigCheckingPage_summary_3=There is no problem in the selected configuration.\n
-ExportConfigCheckingPage_summary_4=There are {0} problems in the selected configuration. \nYou can open the configuration editor and fix those problems. \nOr you can choose to ignore these problems and continue.
-ExportConfigCheckingPage_checking=Checking configuration, please wait...
-ExportConfigSelectConfigPage_title=Choose Method Configuration
-DestinationCommonPage_label_browse=Browse...
-DestinationCommonPage_label_default_dir=Use default directory
-ConfigurationExportService_MSG0=Exporting configuration...
-ConfigurationExportService_MSG2=IUPE0002E: Export failed: Error loading library
-ConfigurationExportService_MSG4=IUPE0003E: Export failed: Error copying library
-ConfigurationExportService_MSG1=IUPE0004E: Export failed: Error making library configuration closure
-ConfigurationExportService_MSG9=IUPE0005E: Export failed: Error saving library
-DestinationCommonPage_label_name=Name:
-DestinationCommonPage_label_dir=Directory:
-ExportPluginWizard_error=Error
-DestinationCommonPage_title=Default Title
-DestinationCommonPage_desc=Default description:
-PluginExportService_MSG0=Exporting plug-ins...
-PluginExportService_MSG1=Creating export directory...
-PluginExportService_MSG2=Copying files...
-PluginExportService_MSG3=Generating library and resource file...
-PluginExportService_MSG4=Export done.
-SaveLibraryPage_title=Export Method Plug-in
-SavePluginPage_label_name=Export name:
-SaveLibraryPage_desc=Export the selected method plug-ins and associated configurations
-ExportPluginWizard_MSG1=Analyzing library configuration...
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/package.html b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/package.html
deleted file mode 100644
index 23b6aab..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the activator for managing the Export plug-in's life cycle.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/BaseExportService.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/BaseExportService.java
deleted file mode 100644
index 6265350..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/BaseExportService.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.io.File;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * The abstract base class for the Export Service.
- * 
- * @author Jinhua Xi
- * @author Weiping Lu
- * @since 1.0
- */
-public abstract class BaseExportService {
-
-	protected static final String exportFile = "export.xmi"; //$NON-NLS-1$
-
-	protected static final String libraryFile = "library.xmi"; //$NON-NLS-1$
-
-	protected List selectedIds = new ArrayList();
-
-	protected List selectedPluginNames = new ArrayList();
-
-	protected boolean isIdSelected(String uri) {
-		for (Iterator it = selectedIds.iterator(); it.hasNext();) {
-			String id = (String) it.next();
-			if (uri.indexOf(id) >= 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	protected boolean isSelectedPluginResource(String uri) {
-		for (Iterator it = selectedPluginNames.iterator(); it.hasNext();) {
-			String plugin_name = (String) it.next();
-			if (uri.startsWith(plugin_name + "/")) //$NON-NLS-1$
-			{
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	protected boolean isResourceSelected(String uri) {
-		if (isIdSelected(uri)) {
-			return true;
-		}
-		return isSelectedPluginResource(uri);
-	}
-
-	protected LibraryDocument processLibraryFile(File source, File target) {
-		try {
-			LibraryDocument document = new LibraryDocument(source);
-
-			// Reload the element mapping.
-			NodeList nodes = document.getPlugins();
-			int i = 0;
-			while (i < nodes.getLength()) {
-				Element node = (Element) nodes.item(i);
-				String uri = node.getAttribute(LibraryDocument.ATTR_href);
-				if (!isIdSelected(uri)) {
-					document.removePlugin(node);
-				} else {
-					i++;
-				}
-			}
-
-			// Remove the unneeded configurations.
-			nodes = document.getConfigurations();
-			i = 0;
-			while (i < nodes.getLength()) {
-				Element node = (Element) nodes.item(i);
-				
-				// 142379 - update plugin importing and exporting to match with the new file format
-				// configuration is saved as seperate resource since 1.0m3
-				String uri = node.getAttribute(LibraryDocument.ATTR_href);
-				if (!isIdSelected(uri)) {
-					document.removeConfiguration(node);
-				} else {
-					i++;
-				}
-			}
-
-			// Reload the element mapping.
-			List plugins = LibraryService.getInstance().getCurrentMethodLibrary()
-								.getMethodPlugins();
-			Map pluginMap = MethodElementUtil.buildMap(plugins);
-
-			nodes = document.getResourceDescriptors();
-			i = 0;
-			while (i < nodes.getLength()) {
-				Element node = (Element) nodes.item(i);
-				String id = node.getAttribute(LibraryDocument.ATTR_id);
-				String uri = getPluginResMgrUri(id, node, pluginMap);
-				if (!isIdSelected(id)
-						&& !isResourceSelected(URLDecoder.decode(uri, "UTF-8"))) { //$NON-NLS-1$
-					document.removeResourceDescriptor(node);
-				} else {
-					i++;
-				}
-			}
-
-			nodes = document.getResourceSubManagers();
-			i = 0;
-			while (i < nodes.getLength()) {
-				Element node = (Element) nodes.item(i);
-				String uri = node.getAttribute(LibraryDocument.ATTR_href);
-				if (!isResourceSelected(uri)) {
-					document.removeResourceDescriptor(node);
-				} else {
-					i++;
-				}
-			}
-
-			List pluginList =  LibraryService.getInstance().getCurrentMethodLibrary()
-			.getMethodPlugins();
-			document.storeExtraInfo(pluginList);
-			
-			document.saveAs(target.getAbsolutePath());
-			
-			return document;
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		
-		return null;
-	}
-
-	private String getPluginResMgrUri(String id, Element node, Map<String, MethodPlugin> pluginMap) {
-		String uri = node.getAttribute(LibraryDocument.ATTR_uri);
-		MethodPlugin plugin = pluginMap.get(id);
-		if (plugin != null) {
-			String newUri = plugin.getName() + "/plugin.xmi";  //$NON-NLS-1$
-			if (! newUri.equals(uri)) {
-				node.setAttribute(LibraryDocument.ATTR_uri, newUri);
-				return newUri;
-			}
-		}
-		return uri;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationExportData.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationExportData.java
deleted file mode 100644
index d5bf9d0..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationExportData.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.preferences.LibraryLocationData;
-
-
-/**
- * Encapsulates the input data required to export a library configuration.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigurationExportData {
-
-	public boolean exportOneConfig;
-
-	public boolean exportConfigSpecs;
-
-	public List selectedConfigs;
-
-	/**
-	 * Indicates if the broken references should be removed or not.
-	 */
-	public boolean removeBrokenReferences = false;
-
-	public LibraryLocationData llData = null;
-
-	public String errorMsg = ""; //$NON-NLS-1$
-
-	/**
-	 * Creates a nes instance.
-	 */
-	public ConfigurationExportData() {
-		llData = new LibraryLocationData();
-		llData.loadFromPreferenceStore();
-	}
-
-	/**
-	 * Validate attribute
-	 */
-	public boolean validate() {
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationExportService.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationExportService.java
deleted file mode 100644
index 171f8f6..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationExportService.java
+++ /dev/null
@@ -1,241 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.library.IConfigurationClosure;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryManagerFactory;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-
-/**
- * Exports a library configuration.
- * 
- * @author Jinhua Xi
- * @author Weiping Lu
- * @since 1.0
- */
-public class ConfigurationExportService {
-
-	public static String excludes = ".copyarea.dat, **/.copyarea.dat, .copyarea.db, **/.copyarea.db"; //$NON-NLS-1$
-	private ConfigurationExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationExportService(ConfigurationExportData data) {
-		this.data = data;
-	}
-	
-	/**
-	 * Run to export a configuration closure
-	 */
-	public void run(IProgressMonitor monitor) {
-		try {
-			if (data.selectedConfigs == null
-					|| data.selectedConfigs.size() == 0) {
-				return;
-			}
-			monitor.setTaskName(ExportResources.ConfigurationExportService_MSG0); 
-			String exportLibPath = data.llData.getParentFolder();
-			File exportLibFolder = new File(exportLibPath);
-			if (!exportLibFolder.exists()) {
-				exportLibFolder.mkdir();
-			}
-			MethodConfiguration config = (MethodConfiguration) data.selectedConfigs
-					.get(0);
-			exportConfig(config.getName(), exportLibFolder.getAbsolutePath(),
-					monitor);
-		} catch (Exception e) {
-			ExportPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/**
-	 * Export a configuration closure
-	 */
-	public void exportConfig(String selectedConfigName, String filePath,
-			IProgressMonitor monitor) throws Exception {
-
-		// need to disable the workspace refreshing
-		boolean refresh = RefreshJob.getInstance().isEnabled();
-		try {
-			if (refresh) {
-				// disable resource refreshing during import
-				//
-				RefreshJob.getInstance().setEnabled(false);
-			}
-			doEexportConfig(selectedConfigName, filePath, monitor);
-		} finally {
-			if (refresh) {
-				// re-enable resource refreshing
-				//
-				RefreshJob.getInstance().setEnabled(true);
-			}
-		}
-	}
-
-	private void doEexportConfig(String selectedConfigName, String filePath,
-			IProgressMonitor monitor) throws Exception {
-
-		MethodLibrary currentLib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-
-		try {
-			// Load the whole Method Library.
-			LibraryUtil.loadAll(currentLib);
-		} catch (Throwable e) {
-			ExportPlugin.getDefault().getLogger().logError(
-					"Error loading library", e); //$NON-NLS-1$
-			data.errorMsg = ExportResources.ConfigurationExportService_MSG2; 
-			return;
-		}
-
-		// Copy the current library to a new library,
-		// since we need to make changes when packaging the new library.
-		MethodLibrary newLibrary = null;
-		try {
-			newLibrary = (MethodLibrary) EcoreUtil.copy(currentLib);
-		} catch (Throwable e) {
-			ExportPlugin.getDefault().getLogger().logError(e);
-			data.errorMsg = ExportResources.ConfigurationExportService_MSG4; 
-			return;
-		}
-
-		IConfigurationClosure closure = null;
-		try {
-			// Detach the new library from the current resource so it can be
-			// added to a new Library Processor instance.
-			LibraryUtil.detachFromResource(newLibrary);
-
-			// Create a new Library Manager and create a new resource for the
-			// new library.
-			// TODO: Update the UI to prompt for the method library type.
-			Map params = new HashMap();
-			params.put("library.path", filePath); 	//$NON-NLS-1$
-			params.put("libraryRegisterType", "ConfigExport"); 		//$NON-NLS-1$		//$NON-NLS-2$		
-			
-			LibraryService.getInstance().registerMethodLibrary(newLibrary, "xmi", params);		//$NON-NLS-1$
-			
-			// Begin packaging the new library for export.
-			MethodConfiguration config = LibraryServiceUtil
-					.getMethodConfiguration(newLibrary, selectedConfigName);
-
-			// Validate the configuration and make sure the global packages are
-			// selected. If global packages are missing, the exported library
-			// can't be loaded.
-			LibraryUtil.validateMethodConfiguration(null, config);
-
-			closure = new ConfigurationClosure(null, config);
-			closure.packageLibrary(data.removeBrokenReferences);
-		} catch (Throwable e) {
-			ExportPlugin.getDefault().getLogger().logError(
-					"Error making library configuration closure", e); //$NON-NLS-1$
-			data.errorMsg = ExportResources.ConfigurationExportService_MSG1; 
-
-			if (closure != null)
-				closure.dispose();
-			
-			LibraryService.getInstance().unRegisterMethodLibrary(newLibrary);
-			
-			return;
-		}
-
-		try {
-			LibraryUtil.saveAll(newLibrary);
-
-			// the first round of save will create the resource structure,
-			// need to save again to make sure all references are saved.
-			// This step is critical since the first round only created the data
-			// structure
-			// some of the cross-referenced elements might be lost on the first
-			// saving
-			// for example, when create a method configuration with references
-			// to a new plugin,
-			// which are not saved yet, those references will be lost.
-			// 145891 - Import Configuration: default config is loss after
-			// import
-			LibraryUtil.saveAll(newLibrary);
-
-		} catch (Throwable e) {
-			ExportPlugin.getDefault().getLogger().logError(
-					"Error saving library", e); //$NON-NLS-1$
-			data.errorMsg = ExportResources.ConfigurationExportService_MSG9; 
-
-			if (closure != null)
-				closure.dispose();
-
-			LibraryService.getInstance().unRegisterMethodLibrary(newLibrary);
-
-			return;
-		}
-
-		// Copy the resource files in the current library to the new library.
-		// For simplicity sake, copy all resource files if the files do not
-		// exist in the target library or if the files are newer
-		//String includes = "resources/**, **/resources/**"; //$NON-NLS-1$
-		String includes = "resources/**, **/resources/**, **/diagram.xmi"; //$NON-NLS-1$
-
-		File srcDir = LibraryUtil.getLibraryRootPath(currentLib);
-		File destDir = LibraryUtil.getLibraryRootPath(newLibrary);
-
-		LayoutResources.copyDir(srcDir, destDir, includes, excludes);
-		handleExtraResourceCopy(currentLib, newLibrary, srcDir, destDir, includes);
-
-		// Close the newly created library.
-		if (closure != null)
-			closure.dispose();
-		
-		LibraryService.getInstance().unRegisterMethodLibrary(newLibrary);
-
-	}
-	
-	private void handleExtraResourceCopy(MethodLibrary baseLib, MethodLibrary exportedLib, File baseLibDir, File exportedLibDir, String includes) {
-		ILibraryResourceManager libResMgr = LibraryService.getInstance().getCurrentLibraryManager().getResourceManager();
-		Map exportedPluginMap = MethodElementUtil.buildMap(baseLib.getMethodPlugins());
-		
-		List<MethodPlugin> basePlugins = baseLib.getMethodPlugins();
-		for (int i = 0; i < basePlugins.size(); i++) {
-			MethodPlugin plugin = basePlugins.get(i);
-			File pluginFolder = new File(libResMgr.getPhysicalPath(plugin));
-			boolean processed = baseLibDir.equals(pluginFolder.getParentFile());			
-			//System.out.println("LD pluginFolder: " + pluginFolder + ", processed: " + processed);
-			if (! processed) {
-				MethodPlugin exportedPlugin = (MethodPlugin) exportedPluginMap.get(plugin.getGuid());
-				if (exportedPlugin == null) {
-					continue;
-				}
-				File destDir = new File(exportedLibDir, exportedPlugin.getName());
-				LayoutResources.copyDir(pluginFolder, destDir, includes, excludes);
-			}
-
-		}		
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationSpec.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationSpec.java
deleted file mode 100644
index daddc99..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationSpec.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Models a library configuration specification.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigurationSpec {
-
-	public String name;
-
-	public String guid;
-
-	public String version;
-
-	public String brief_desc;
-
-	public List pluginIds = new ArrayList();
-
-	public List packageIds = new ArrayList();
-
-	public List viewIds = new ArrayList();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationSpec() {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationSpecsExportService.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationSpecsExportService.java
deleted file mode 100644
index d937287..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/ConfigurationSpecsExportService.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * Exports a library configuration specification.
- * 
- * @author Jinhua Xi
- * @since 1.0
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=162153
- */
-public class ConfigurationSpecsExportService extends BaseExportService {
-
-	private ConfigurationExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationSpecsExportService(ConfigurationExportData data) {
-		this.data = data;
-	}
-
-	/**
-	 * Run to export a configuration specificaiton.
-	 */
-	public void run(IProgressMonitor monitor) {
-		if (data.selectedConfigs == null || data.selectedConfigs.size() == 0) {
-			return;
-		}
-
-		monitor.setTaskName(ExportResources.ConfigurationSpecsExportService_MSG0); 
-
-		// Create the export library folder.
-		File libFolder;
-		File exportLibFolder;
-
-		String exportLibPath = (new File(data.llData.getParentFolder())).getAbsolutePath();
-		exportLibFolder = new File(exportLibPath);
-		if (!exportLibFolder.exists()) {
-			exportLibFolder.mkdir();
-		}
-
-		MethodConfiguration config = (MethodConfiguration) data.selectedConfigs
-				.get(0);
-		MethodLibrary lib = (MethodLibrary) config.eContainer();
-		URI uri = lib.eResource().getURI();
-		String path = uri.toFileString();
-		libFolder = (new File(path)).getParentFile();
-
-		// Prepare the id selections,
-		getSelectedIds(data.selectedConfigs);
-
-		// Load the library.xmi and remove unneeded elements.
-		LibraryDocument document = processLibraryFile(new File(libFolder, libraryFile), new File(
-				exportLibFolder, exportFile));
-
-		if ( document != null ) {
-			// copy the conifuration files
-			// 143033 - update config specs' importing and exporting to match with the new file format
-			copyConfigurationFiles(document, libFolder, exportLibFolder);
-		}
-		
-		monitor.setTaskName(ExportResources.ConfigurationSpecsExportService_MSG1); 
-
-	}
-
-	private void copyConfigurationFiles(LibraryDocument document, File libFolder, File exportLibFolder) {
-		// 143033 - update config specs' importing and exporting to match with the new file format
-		for (Iterator it = data.selectedConfigs.iterator(); it.hasNext();) {
-			MethodConfiguration config = (MethodConfiguration) it.next();
-			String guid = config.getGuid();
-			String uri = document.getResourceUri(guid);
-			if (uri == null) {
-				URI resUri = config.eResource().getURI();
-				uri = MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME + File.separator + resUri.lastSegment();
-				uri = document.decodeUri(uri);
-			}
-			if ( uri != null ) {
-				File src = new File(libFolder, uri);
-				File target =  new File(exportLibFolder, uri);
-				FileUtil.copyFile(src, target);
-			}
-		}
-	}
-	
-	private void getSelectedIds(List configs) {
-		selectedIds.clear();
-		selectedPluginNames.clear();
-
-		// Get selected config ids.
-		if (configs == null || configs.size() == 0) {
-			return;
-		}
-
-		for (Iterator it = configs.iterator(); it.hasNext();) {
-			MethodConfiguration config = (MethodConfiguration) it.next();
-			String guid = config.getGuid();
-			if (selectedIds.contains(guid)) {
-				continue;
-			}
-
-			// Add the configuration.
-			selectedIds.add(guid);
-
-			// For each configuration, we need to save the method plugin ids and
-			// method package ids so that their entries in the resource file can
-			// be kept.
-			List refs = config.eCrossReferences();
-			for (Iterator itr = refs.iterator(); itr.hasNext();) {
-				Object o = itr.next();
-				if (o instanceof MethodPlugin || o instanceof MethodPackage) {
-					guid = ((MethodElement) o).getGuid();
-					if (!selectedIds.contains(guid)) {
-						selectedIds.add(guid);
-					}
-				} else {
-					ExportPlugin
-							.getDefault()
-							.getLogger()
-							.logError(
-									"Unexpected element type '" + ((MethodElement) o).getType().getName() //$NON-NLS-1$
-											+ "' in configuration '" + config.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/DiagramHandler.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/DiagramHandler.java
deleted file mode 100644
index 240cb91..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/DiagramHandler.java
+++ /dev/null
@@ -1,277 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.io.File;
-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.resource.Resource;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * Utility class to handle diagram export/import
- * @author Weiping Lu
- * @since 1.2
- *
- */
-public class DiagramHandler {
-	
-	//To do: need to consider element rename issue. 
-	//		 -> Resovle the involved file names after all resource names are settled.
-	//		 -> Let a sub class to take of it?
-
-	private File sourceLibRoot;
-	private File targetLibRoot;
-	private Map<String, MapEntryValue> elementMap = new HashMap<String, MapEntryValue>();
-	private static boolean debug = false;
-		
-	/**
-	 * Creates a new instance.
-	 */	
-	public DiagramHandler(File sourceLibRoot, File targetLibRoot) {
-		this.sourceLibRoot = sourceLibRoot;
-		this.targetLibRoot = targetLibRoot;
-	}
-	
-	protected Map<String, MapEntryValue> getElementMap() {
-		return elementMap;
-	}
-	
-	private boolean needToProcess(MethodElement elem) {
-		boolean b = elem instanceof CapabilityPattern ||
-								elem instanceof DeliveryProcess;
-		return b;	
-	}
-	
-	public void registerElement(MethodElement elem) {
-		registerElement(elem, false);
-	}
-	
-	public void registerElement(MethodElement elem, boolean processEntry) {
-		if (! needToProcess(elem)) {
-			return;
-		}
-		if (elementMap.containsKey(elem.getGuid())) {
-			return;
-		}
-		
-		MapEntryValue mapEntryValue = new MapEntryValue();
-		mapEntryValue.element = elem;
-		elementMap.put(elem.getGuid(), mapEntryValue);		
-		
-		if (processEntry) {
-			processEntry(elem, mapEntryValue);
-		}
-	}
-	
-	public void postRegisterElements() {
-		for (Iterator<MapEntryValue> it = elementMap.values().iterator(); it.hasNext();) {
-			MapEntryValue value = it.next();
-			processEntry(value.element, value);
-		}	
-	}
-
-	private void processEntry(MethodElement elem, MapEntryValue mapEntryValue) {
-		File[] files = getFiles(elem);
-		File sourceFile = files[0];
-		File targetFile = files[1];
-
-		if (sourceFile != null && sourceFile.exists()) {
-			mapEntryValue.sourceFile = sourceFile;
-		}
-
-		if (targetFile.exists()) {
-			if (mapEntryValue.sourceFile == null || needCopy(mapEntryValue.sourceFile, targetFile)) {
-				mapEntryValue.targetFile = targetFile;
-			}
-			mapEntryValue.existing = true;
-		} else {
-			if (mapEntryValue.sourceFile != null) {
-				mapEntryValue.targetFile = targetFile;
-			}
-		}
-		
-		if (debug) {
-			System.out.println("LD> mapEntryValue: ");					//$NON-NLS-1$
-			System.out.println(mapEntryValue.toDebugString("LD> "));	//$NON-NLS-1$
-			System.out.println("");										//$NON-NLS-1$
-		}
-	}
-	
-	public List getModifiedFiles() {
-		List ret = new ArrayList();		
-		for (Iterator<MapEntryValue> it = elementMap.values().iterator(); it.hasNext();) {
-			MapEntryValue value = it.next();
-			if (value.existing && value.targetFile != null) {
-				ret.add(value.targetFile.getAbsolutePath());
-			}
-		}		
-		return ret;
-	}
-
-	/**
-	 * copy all the files to the destination
-	 *
-	 */
-	public void execute() {
-		try {
-			execute_();
-		} catch (Throwable e) {
-			if (debug) {
-				e.printStackTrace();
-			}
-		}	
-	}
-	
-	private void execute_() {
-		
-		for (Iterator<MapEntryValue> it = elementMap.values().iterator(); it.hasNext(); ) {
-			MapEntryValue value = it.next();
-			if (value.targetFile == null) {
-				continue;
-			} else if (value.sourceFile != null) {
-				File parentFile = value.targetFile.getParentFile();
-				FileUtil.copyFile(value.sourceFile, value.targetFile);
-				if (debug) {
-					System.out.println("LD: File copied: " + value.sourceFile);	//$NON-NLS-1$
-				}
-			} else {
-				value.targetFile.delete();
-			}
-		}	
-	}
-		
-	/**
-	 * Checks to see if the copy action is needed.
-	 */
-	public static boolean needCopy(File source, File dest) {
-		boolean ret = true;
-		if (dest.exists()) {
-			ret = (dest.lastModified() != source.lastModified())
-					|| (dest.length() != source.length());
-		}
-		return ret;
-	}
-	
-	protected static class MapEntryValue {
-
-		public MethodElement element;
-		public File sourceFile;
-		public File targetFile;
-		public boolean existing = false;		
-		
-		public String toDebugString(String prompt) {
-			String str = prompt + "element: " + element.getName();		//$NON-NLS-1$
-			str += "\n" + prompt + "sourceFile: " + sourceFile;		//$NON-NLS-1$ //$NON-NLS-2$
-			str += "\n" + prompt + "targetFile: " + targetFile;		//$NON-NLS-1$ 	//$NON-NLS-2$
-			str += "\n" + prompt + "existing: " + existing;			//$NON-NLS-1$ 	//$NON-NLS-2$			
-			return str;
-		}
-		
-	}
-
-	protected File[] getFiles(MethodElement elem) {
-		return getFiles(elem, true);
-	}
-	
-	//[0]: sourceFile
-	//[1]: targetFile
-	protected File[] getFiles(MethodElement elem, boolean export) {
-		File[] files = new File[2];
-		
-		String elementPath = ResourceHelper.getElementPath(elem);
-		if (debug) {
-			System.out.println("LD> elementPath: " + elementPath); //$NON-NLS-1$
-		}
-		if (elementPath == null || elementPath.length() == 0) {
-			if (debug) {
-				System.out.println("LD> elementPath is null or empty!"); //$NON-NLS-1$
-			}
-			return files;
-		}
-
-		String diagramPath = elementPath + elem.getName() + File.separator + 
-								"diagram.xmi";				//$NON-NLS-1$
-		
-		if (debug) {
-			System.out.println("LD> diagramPath 0: " + diagramPath); //$NON-NLS-1$
-		}
-
-		File srcRoot = sourceLibRoot;
-		File tgtRoot = targetLibRoot;
-		
-		
-		if (export) {
-			srcRoot =  getRoot(elem);
-		} else {
-			tgtRoot =  getRoot(elem);
-		}
-		
-		if (export) {
-			Resource res = elem.eResource();
-			if (res != null) {
-				File modelFile = new File(res.getURI().toFileString());
-				File folder = modelFile.getParentFile();
-				String folderPath = folder.getAbsolutePath();
-
-				int ix = srcRoot.getAbsolutePath().length();
-				if (folderPath.length() > ix
-						&& folderPath.substring(0, ix).equalsIgnoreCase(
-								srcRoot.getAbsolutePath())) {
-					diagramPath = folderPath.substring(ix + 1) + File.separator
-							+ "diagram.xmi"; //$NON-NLS-1$
-				}
-			}
-		} else {
-			ProcessComponent pc = UmaUtil.getProcessComponent(elem);
-			if (pc != null && ! pc.getName().equals(elem.getName())) {
-				diagramPath = elementPath + pc.getName() + File.separator
-						+ "diagram.xmi"; //$NON-NLS-1$
-			}
-		}
-		
-		files[0] = new File(srcRoot, diagramPath);
-		files[1] = new File(tgtRoot, diagramPath);		
-
-		return files;
-	}
-	
-	public void visitElementMap(int passId) {
-	}
-
-	public File getSourceLibRoot() {
-		return sourceLibRoot;
-	}
-	
-	protected File getRoot(MethodElement elem) {
-		ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(elem);
-		String pluginPath = libResMgr.getPhysicalPluginPath(elem);
-		File root = (new File(pluginPath)).getParentFile();
-		return root;
-	}
-
-	public File getTargetLibRoot() {
-		return targetLibRoot;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/LibraryDocument.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/LibraryDocument.java
deleted file mode 100644
index 0aefcf6..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/LibraryDocument.java
+++ /dev/null
@@ -1,732 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * Encapsulates a method library using a DOM document.
- * 
- * @author Jinhua Xi
- * @author Weiping Lu
- * @since 1.0
- */
-public class LibraryDocument {
-
-	public static final String TAG_methodPlugins = "methodPlugins"; //$NON-NLS-1$
-
-	public static final String TAG_predefinedConfigurations = "predefinedConfigurations"; //$NON-NLS-1$
-
-	public static final String TAG_resourceDescriptors = "resourceDescriptors"; //$NON-NLS-1$
-
-	public static final String TAG_resourceSubManagers = "subManagers"; //$NON-NLS-1$
-	
-	public static final String TAG_methodElementProperty = "methodElementProperty"; //$NON-NLS-1$
-
-	public static final String ATTR_href = "href"; //$NON-NLS-1$
-
-	public static final String ATTR_id = "id"; //$NON-NLS-1$
-
-	public static final String ATTR_uri = "uri"; //$NON-NLS-1$
-
-	public static final String ATTR_guid = "guid"; //$NON-NLS-1$
-	
-	public static final String ATTR_value = "value"; //$NON-NLS-1$
-
-	public static final String exportFile = "export.xmi"; //$NON-NLS-1$
-
-	public static final String libraryFile = "library.xmi"; //$NON-NLS-1$
-
-	protected File libFile;
-
-	protected Document document;
-
-	protected Element libTag = null;
-
-	protected Element resTag = null;
-	
-	private HashMap guidToUriMap = null;
-	
-	private Map<String, String> guidToPlugNameMap;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryDocument(File libFile) throws Exception {
-		this.libFile = libFile;
-		init();
-	}
-
-	private void init() throws Exception {
-		this.document = XMLUtil.loadXml(libFile);
-
-		Element root = document.getDocumentElement();
-		NodeList nodes = root.getElementsByTagName("org.eclipse.epf.uma:MethodLibrary"); //$NON-NLS-1$
-		if (nodes != null && nodes.getLength() > 0) {
-			libTag = (Element) nodes.item(0);
-		}
-
-		nodes = root
-				.getElementsByTagName("org.eclipse.epf.uma.resourcemanager:ResourceManager"); //$NON-NLS-1$
-		if (nodes != null && nodes.getLength() > 0) {
-			resTag = (Element) nodes.item(0);
-		}
-	}
-
-    /**
-     * Returns the document field
-     */
-	public Document getDocument() {
-		return this.document;
-	}
-
-    /**
-     * Returns the libFile field
-     */
-	public File getFile() {
-		return libFile;
-	}
-
-    /**
-     * Returns the libTag field
-     */
-	public Element getLibTag() {
-		return libTag;
-	}
-
-    /**
-     * Returns the library name
-     */
-	public String getLibraryName() {
-		return libTag.getAttribute("name"); //$NON-NLS-1$
-	}
-
-    /**
-     * Returns the library guid
-     */
-	public String getLibraryGuid() {
-		return libTag.getAttribute("guid"); //$NON-NLS-1$
-	}
-
-    /**
-     * Returns the resource tag
-     */
-	public Element getResourceTag() {
-		return resTag;
-	}
-
-    /**
-     * Removes a plugin node
-     */
-	public void removePlugin(Element node) {
-		libTag.removeChild(node);
-	}
-
-    /**
-     * Removes a config node
-     */
-	public void removeConfiguration(Element node) {
-		libTag.removeChild(node);
-	}
-
-    /**
-     * Removes a resource descriptor node
-     */
-	public void removeResourceDescriptor(Element node) {
-		resTag.removeChild(node);
-	}
-
-    /**
-     * Returns plugin node list
-     */
-	public NodeList getPlugins() {
-		return libTag.getElementsByTagName(TAG_methodPlugins);
-	}
-
-    /**
-     * Returns configuration node list
-     */
-	public NodeList getConfigurations() {
-		return libTag.getElementsByTagName(TAG_predefinedConfigurations);
-	}
-
-    /**
-     * Returns resource descriptor node list
-     */
-	public NodeList getResourceDescriptors() {
-		return resTag.getElementsByTagName(TAG_resourceDescriptors);
-	}
-
-    /**
-     * Returns resource submanager node list
-     */
-	public NodeList getResourceSubManagers() {
-		return resTag.getElementsByTagName(TAG_resourceSubManagers);
-	}
-
-    /**
-     * Adds a plugin node
-     */
-	public void addPlugin(Element node) {
-		libTag.appendChild(getValidNode(node));
-	}
-
-    /**
-     * Adds a configuration node
-     */
-	public void addConfiguration(Element node) {
-		libTag.appendChild(getValidNode(node));
-	}
-
-    /**
-     * Adds a resource node
-     */
-	public void addResource(Element node) {
-		resTag.appendChild(getValidNode(node));
-	}
-
-    /**
-     * Returns a valid node
-     */
-	public Node getValidNode(Node node) {
-		if (node.getOwnerDocument() == document) {
-			return node;
-		}
-
-		return document.importNode(node, true);
-	}
-
-	/**
-	 * remove plugins by guid
-	 * 
-	 * @param removeList
-	 *            List a list of guids
-	 */
-	public void removePlugins(List removeList) {
-		// Importing a package of plgins twice generates 2
-		// identical plugins
-		// remove the node will cause the node list to shrink, so don't increase
-		// the index
-		NodeList nodes = getPlugins();
-		int i = 0;
-		while (i < nodes.getLength()) {
-			Element node = (Element) nodes.item(i);
-			String guid = getGuid(node);
-			if (removeList.contains(guid)) {
-				libTag.removeChild(node);
-			} else {
-				i++;
-			}
-		}
-	}
-
-    /**
-     * Remove the list from the configuration nodes
-     */
-	public void removeConfigurations(List removeList) {
-		// remove the unneeded configurations
-		NodeList nodes = getConfigurations();
-		int i = 0;
-		while (i < nodes.getLength()) {
-			Element node = (Element) nodes.item(i);
-			String guid = getGuid(node);
-			if (removeList.contains(guid)) {
-				libTag.removeChild(node);
-			} else {
-				i++;
-			}
-		}
-	}
-
-    /**
-     * Remove the list from the resource nodes
-     */
-	public void removeResourceEntries(List removeList) {
-		NodeList nodes = getResourceDescriptors();
-		int i = 0;
-		while (i < nodes.getLength()) {
-			Element node = (Element) nodes.item(i);
-			String guid = node.getAttribute(ATTR_id);
-			String uri = node.getAttribute(ATTR_uri);
-			if (removeList.contains(guid)) {
-				resTag.removeChild(node);
-
-				// check the plugin xmi file, if exists, delete the folder
-				File plugn_file = getFileFromUri(uri);
-				if (plugn_file.exists()) {
-					// delete the folder ???
-				}
-			} else {
-				i++;
-			}
-		}
-
-		// also remove the sub managers
-		nodes = getResourceSubManagers();
-		i = 0;
-		while (i < nodes.getLength()) {
-			Element node = (Element) nodes.item(i);
-			String guid = getSubManagerBaseGuid(node.getAttribute(ATTR_href));
-			if (removeList.contains(guid)) {
-				resTag.removeChild(node);
-			} else {
-				i++;
-			}
-		}
-	}
-
-	/**
-	 * get the resource uri for the resource guid
-	 * @param guid
-	 * @return String the uri
-	 */
-	public String getResourceUri(String guid) {
-		String uri = getUriFromGuidToUriMap(guid);
-		if (uri == null) {
-			uri = getResourceUri_(guid);
-			if (uri != null) {
-				//addToGuidToUriMap(guid, uri);
-			}
-		}
-		return uri;
-	}
-	
-	private String getResourceUri_(String guid) {
-	
-		NodeList nodes = getResourceDescriptors();
-		for (int i = 0; i < nodes.getLength(); i++ ) {
-			Element node = (Element) nodes.item(i);
-			String id = node.getAttribute(ATTR_id);
-			String uri = node.getAttribute(ATTR_uri);
-			if ( guid.equals(id) ) {
-				return decodeUri(uri);
-			}
-		}
-		
-		return null;
-	}
-
-	/**
-	 * Returns the decored URI.
-	 */
-	public String decodeUri(String uri) {
-		try {
-			uri = URLDecoder.decode(uri, "UTF-8"); //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-		
-		return uri;
-	}
-	
-	/**
-	 * Returns the file given the uri.
-	 */
-	public File getFileFromUri(String uri) {
-		uri = decodeUri(uri);
-		
-		int i = uri.indexOf("#"); //$NON-NLS-1$
-		if (i > 0) {
-			uri = uri.substring(0, i);
-		}
-
-		return new File(libFile.getParentFile(), uri);
-	}
-
-	/**
-	 * Saves the document.
-	 */
-	public void save() throws Exception {
-		saveAs(libFile.getAbsolutePath());
-	}
-
-	/**
-	 * Saves the document in the file given by filePathName.
-	 */
-	public void saveAs(String filePathName) throws Exception {
-		XMLUtil.saveDocument(this.document, filePathName);
-	}
-
-	/**
-	 * Is the document for configutation specification export/import only?
-	 */
-	public boolean isConfigSpecsOnly() {
-		NodeList nodes = getPlugins();
-		if (nodes == null || nodes.getLength() == 0) {
-			return true;
-		}
-
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Element node = (Element) nodes.item(i);
-			String href = node.getAttribute(LibraryDocument.ATTR_href);
-			String guid = getGuidFromHref(href);
-			String uri = getResourceUri(guid);
-			
-			// check if the resource files are there
-			File plugn_file = getFileFromUri(uri);
-			if (plugn_file.exists()) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	// static hlper methods /////////////////////////////////////
-	/**
-	 * Returns submanager's base guid.
-	 */
-	public static String getSubManagerBaseGuid(String href) {
-		final Pattern p = Pattern.compile(
-				"uma://(.*?)#(.*?)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-		Matcher m = p.matcher(href);
-		if (m.find()) {
-			return m.group(1);
-		}
-
-		return href;
-	}
-
-	/**
-	 * Returns child value of the child tag given by childTagName.
-	 */
-	public static String getChildValue(Element tag, String childTagName) {
-		NodeList nodes = tag.getChildNodes();
-		if (nodes == null || nodes.getLength() == 0) {
-			return ""; //$NON-NLS-1$
-		}
-
-		int size = nodes.getLength();
-		for (int i = 0; i < size; i++) {
-			Node node = nodes.item(i);
-			if ((node instanceof Element)
-					&& ((Element) node).getTagName().equals(childTagName)) {
-				return getNodeText((Element) node);
-			}
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * text of a leaf node, without child element
-	 * 
-	 * @param tag
-	 * @return
-	 */
-	public static String getNodeText(Element tag) {
-
-		NodeList nodes = tag.getChildNodes();
-		if (nodes == null || nodes.getLength() == 0) {
-			return ""; //$NON-NLS-1$
-		}
-
-		int size = nodes.getLength();
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < size; i++) {
-			Node node = nodes.item(i);
-			if (node.getNodeType() == Node.TEXT_NODE) {
-				buffer.append(node.getNodeValue());
-			}
-		}
-
-		return buffer.toString();
-	}
-
-	/**
-	 * Returns guid from href.
-	 */
-	public static String getGuidFromHref(String href) {
-		int i = href.indexOf("#"); //$NON-NLS-1$
-		if (i > 0) {
-			return href.substring(i + 1);
-		}
-
-		return href;
-	}
-
-	/**
-	 * Returns guid of the node.
-	 */
-	public static String getGuid(Element node) {
-		String id = node.getAttribute("xmi:id"); //$NON-NLS-1$
-		if ( id == null || id.length() == 0 ) {
-			String href = node.getAttribute(ATTR_href);
-			id = getGuidFromHref(href);
-		}
-		
-		return id;
-	}
-	
-	// 143033 - update config specs' importing and exporting to match with the new file format
-	protected Element getConfigNode(Element configNode) {
-		try {
-			
-			// new model defines href for configuration 
-			String href = configNode.getAttribute(ATTR_href);
-			if (href == null || href.length() == 0 ) {
-				return configNode;
-			} 
-
-			String guid = getGuidFromHref(href);
-			String uri = getResourceUri(guid);
-			if ( uri == null ) {
-				return configNode;
-			}
-			
-			File source = getFileFromUri(uri);
-			Document document = XMLUtil.loadXml(source);
-			Element root = document.getDocumentElement();
-
-			Element configTag = null;
-			if (root.getTagName().equals("org.eclipse.epf.uma:MethodConfiguration")) //$NON-NLS-1$
-			{
-				configTag = root;
-			} else {
-				NodeList nodes = root
-						.getElementsByTagName("org.eclipse.epf.uma:MethodConfiguration"); //$NON-NLS-1$
-				if (nodes.getLength() > 0) {
-					configTag = (Element) nodes.item(0);
-				}
-			}
-			
-			return configTag;
-
-		} catch (Exception e) {
-			ExportPlugin.getDefault().getLogger().logError(e);
-		}
-		
-		return configNode;
-	}
-	
-	/**
-	 * Returns ConfigurationSpec instance given the element node config.
-	 */
-	public ConfigurationSpec getConfigurationSpec(Element config) {
-		ConfigurationSpec spec = new ConfigurationSpec();
-		
-		Element configNode = getConfigNode(config);
-		spec.guid = configNode.getAttribute("xmi:id"); //$NON-NLS-1$
-		spec.name = configNode.getAttribute("name"); //$NON-NLS-1$
-		spec.brief_desc = configNode.getAttribute("briefDescription"); //$NON-NLS-1$
-		
-		// get plugins
-		NodeList nodes = configNode.getElementsByTagName("methodPluginSelection"); //$NON-NLS-1$
-		if (nodes != null) {
-			for (int i = 0; i < nodes.getLength(); i++) {
-				Element node = (Element) nodes.item(i);
-				String guid = getGuidFromHref(node.getAttribute(ATTR_href));
-				spec.pluginIds.add(guid);
-			}
-		}
-
-		// get packages
-		nodes = configNode.getElementsByTagName("methodPackageSelection"); //$NON-NLS-1$
-		if (nodes != null) {
-			for (int i = 0; i < nodes.getLength(); i++) {
-				Element node = (Element) nodes.item(i);
-				String guid = getGuidFromHref(node.getAttribute(ATTR_href));
-				spec.packageIds.add(guid);
-			}
-		}
-
-		// get views
-		nodes = configNode.getElementsByTagName("processViews"); //$NON-NLS-1$
-		if (nodes != null) {
-			for (int i = 0; i < nodes.getLength(); i++) {
-				Element node = (Element) nodes.item(i);
-				String guid = getGuidFromHref(node.getAttribute(ATTR_href));
-				spec.viewIds.add(guid);
-			}
-		}
-
-		return spec;
-	}
-	
-	/**
-	 * Adds guid/uri pair to guidToUriMap.
-	 */
-	public void addToGuidToUriMap(String guid, String uri) {
-		if (guidToUriMap == null) {
-			guidToUriMap = new HashMap();
-		}
-		guidToUriMap.put(guid, uri);
-	}
-	
-	/**
-	 * Gets uri from guid.
-	 */
-	public String getUriFromGuidToUriMap(String guid) {
-		return guidToUriMap == null ? null : (String) guidToUriMap.get(guid);
-	}
-	
-	/**
-	 * Create an instance.
-	 */
-	public static class ConfigDocVisitor {
-		public void visit(File file, Element node) {			
-		}
-	}
-	
-	/**
-	 * Visit configuration files given by the configuration file folder configDir.
-	 */
-	public static void visitConfigFiles(File configDir, ConfigDocVisitor visitor) {	
-		FileFilter filter = new FileFilter() {
-			public boolean accept(File pathname) {
-				return !pathname.getName().equalsIgnoreCase("cvs") && 		//$NON-NLS-1$
-						pathname.isDirectory() || pathname.getName().endsWith(MultiFileSaveUtil.DEFAULT_FILE_EXTENSION);
-			}			
-		};		
-		File[] files = configDir.listFiles(filter);
-		if (files == null) {
-			return;
-		}
-		for (int i=0; i<files.length; i++) {
-			File file = files[i];
-			try {
-				DocumentBuilder builder = DocumentBuilderFactory.newInstance()
-						.newDocumentBuilder();
-				Document doc = builder.parse(file);
-				Element root = doc.getDocumentElement();
-				visitor.visit(file, root);				
-			} catch (Throwable e) {
-				e.printStackTrace();
-			}
-		}		
-	}
-	
-	/**
-	 * Build a map from pluign guids to resource manager guids.
-	 */
-	public Map buildPluginGuidToResMgrGuidMap(List pluginGuids) {
-		if (pluginGuids == null || pluginGuids.size() == 0) {
-			return null;
-		}
-		NodeList subMgrs = getResourceSubManagers();
-		if (subMgrs == null || subMgrs.getLength() == 0) {
-			return null;
-		}				
-		HashMap pluginGuidToResMgrGuidMap = new HashMap();
-		for (int i=0; i<pluginGuids.size(); i++) {			
-			String pluginGuid = (String) pluginGuids.get(i);
-			pluginGuidToResMgrGuidMap.put(pluginGuid, null);
-		}
-		boolean isEmpty = true;
-		for (int i=0; i<subMgrs.getLength(); i++) {			
-			Element mgr = (Element) subMgrs.item(i);
-			String  href = mgr.getAttribute(ATTR_href);
-			String pluginGuid = getSubManagerBaseGuid(href);
-			if (pluginGuidToResMgrGuidMap.containsKey(pluginGuid)) {
-				pluginGuidToResMgrGuidMap.put(pluginGuid, getGuidFromHref(href));
-				isEmpty = false;
-			}
-		}		
-		return isEmpty ?  null : pluginGuidToResMgrGuidMap;
-	}
-	
-	/**
-	 * Save extra info (all plugin guids and names) in libTag's MethodElementProperty
-	 */
-	public void storeExtraInfo(List<MethodPlugin> plugins) {
-		if (plugins == null) {
-			return;
-		}		
-
-		Element versionNode = document.createElement(TAG_methodElementProperty);
-		versionNode.setAttribute(ATTR_value, "0");	//$NON-NLS-1$ 
-		libTag.appendChild(versionNode);		
-		
-		for (Iterator<MethodPlugin> it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plug = it.next();
-			
-			Element guidNode = document.createElement(TAG_methodElementProperty);	
-			guidNode.setAttribute(ATTR_value, plug.getGuid());
-			Element nameNode = document.createElement(TAG_methodElementProperty);	
-			nameNode.setAttribute(ATTR_value, plug.getName());
-			
-			libTag.appendChild(guidNode);
-			libTag.appendChild(nameNode);
-		}
-		
-	}	
-	
-	private void recallExtraInfo() {
-		try {
-			NodeList nodes = getMethodElementProperties();
-			if (nodes == null || nodes.getLength() == 0) {
-				return;
-			}
-			Element versionNode = (Element) nodes.item(0);
-			String versionStr = versionNode.getAttribute(ATTR_value);
-			
-			if (versionStr.equals("0")) { //$NON-NLS-1$ 
-				guidToPlugNameMap = new HashMap<String, String>();
-				for (int i = 1; i < nodes.getLength();) {
-					Element node = (Element) nodes.item(i);
-					String guid = node.getAttribute(ATTR_value);
-					node = (Element) nodes.item(i + 1);
-					String name = node.getAttribute(ATTR_value);
-					guidToPlugNameMap.put(guid, name);
-					if (false) {				
-						System.out.println("LD> guid: " + guid); //$NON-NLS-1$
-						System.out.println("LD> name: " + name); //$NON-NLS-1$
-					}					
-					i += 2;
-				}
-			}
-		} catch (Throwable e) {
-			e.printStackTrace();
-			guidToPlugNameMap = null;
-		}
-		
-	}
-	
-	/**
-	 * Get guid to plugin map
-	 */
-	public Map<String, String> getGuidToPlugNameMap() {
-		if (guidToPlugNameMap == null) {
-			recallExtraInfo();
-		}		
-		return guidToPlugNameMap;
-	}
-	
-    /**
-     * Returns methodElementProperty node list
-     */
-	private NodeList getMethodElementProperties() {
-		return libTag.getElementsByTagName(TAG_methodElementProperty);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/PluginExportData.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/PluginExportData.java
deleted file mode 100644
index bb58230..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/PluginExportData.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.preferences.LibraryLocationData;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * Encapsulates the input data required to export a method plug-in.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PluginExportData {
-
-	public List selectedPlugins = null;
-
-	public LibraryLocationData llData = null;
-
-	public Hashtable associatedConfigMap = new Hashtable();
-
-	// don't need it after the service code changes
-	public List associatedConfigs = new ArrayList();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PluginExportData() {
-		llData = new LibraryLocationData();
-		llData.loadFromPreferenceStore();
-	}
-
-	/**
-	 * Returns the list of selected plugins.
-	 */
-	public List getSelectedPlugins() {
-		return selectedPlugins;
-	}
-
-	/**
-	 * Sets the list of selected plugins.
-	 */
-	public void setSelectedPlugins(List selectedPlugins) {
-		this.selectedPlugins = selectedPlugins;
-	};
-
-	/**
-	 * validate attribute
-	 */
-	public boolean validate() {
-		return true;
-	}
-	
-	/**
-	 * Builds associatedConfigMap.
-	 */
-	public void buildAssociatedConfigMap() {
-		if (getSelectedPlugins() != null) {
-			associatedConfigMap.clear();
-			for (Iterator iter = getSelectedPlugins().iterator(); iter
-					.hasNext();) {
-				MethodPlugin element = (MethodPlugin) iter.next();
-				associatedConfigMap.put(element, LibraryUtil
-						.getAssociatedConfigurations(element));
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/PluginExportService.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/PluginExportService.java
deleted file mode 100644
index f80de48..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/PluginExportService.java
+++ /dev/null
@@ -1,228 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.services;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Copy;
-import org.apache.tools.ant.types.FileSet;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-
-/**
- * Exports one or more method plug-ins to a target directory.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=162153
- */
-public class PluginExportService extends BaseExportService {
-
-	PluginExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PluginExportService(PluginExportData data) {
-		this.data = data;
-	}
-
-	/**
-	 * Run to export plugins
-	 */
-	public void run(IProgressMonitor monitor) {
-		monitor.setTaskName(ExportResources.PluginExportService_MSG0); 
-
-		List plugins = data.selectedPlugins;
-		if (plugins == null || plugins.size() == 0) {
-			return;
-		}
-
-		monitor.setTaskName(ExportResources.PluginExportService_MSG1); 
-
-		// Create the library folder in the target directory.
-		String exportLibPath = (new File(data.llData.getParentFolder())).getAbsolutePath();
-		File exportLibFolder = new File(exportLibPath);
-		if (!exportLibFolder.exists()) {
-			exportLibFolder.mkdir();
-		}
-
-		monitor.setTaskName(ExportResources.PluginExportService_MSG2); 
-
-		MethodLibrary currLib = LibraryService.getInstance().getCurrentMethodLibrary();
-		String currLibPath = currLib.eResource().getURI().toFileString();
-		File currLibFile = new File(currLibPath);
-		
-		// Iterate the selected plug-ins and copy their associated model files.
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			if (plugin == null) {
-				continue;
-			}
-
-			// Step 1: Create the plug-in folder.
-			URI uri = plugin.eResource().getURI();
-			String path = uri.toFileString();
-
-			File pluginFolder = (new File(path)).getParentFile();
-
-			String pluginPath = plugin.getName() + File.separator;
-			File exportPluginFolder = new File(exportLibFolder, pluginPath);
-
-			// Step 2: Copy the plug-in files.
-			copyDir(pluginFolder, exportPluginFolder);			
-		}
-
-		monitor.setTaskName(ExportResources.PluginExportService_MSG3); 
-
-		// Get the selected plug-in and configuration ids so we can remove the
-		// unneeded stuff.
-		getSelectedIds(data.selectedPlugins, data.associatedConfigMap);
-
-		// Step 3: Load the library.xmi and the resmgr.xmi, remove the unneeded
-		// stuff.
-		File libFolder = new File(LibraryService.getInstance().getCurrentMethodLibraryLocation());
-		LibraryDocument document = processLibraryFile(currLibFile, new File(
-				exportLibFolder, exportFile));
-
-		if ( document != null ) {
-			// copy the conifuration files
-			// 142379 - update plugin importing and exporting to match with the new file format
-			copyConfigurationFiles(document, libFolder, exportLibFolder);
-		}
-		
-		monitor.setTaskName(ExportResources.PluginExportService_MSG4); 
-	}
-
-	
-	private void copyConfigurationFiles(LibraryDocument document, File libFolder, File exportLibFolder) {
-		// // 142379 - update plugin importing and exporting to match with the new file format
-		// Get the selected configuration ids.
-		for (Iterator itc = data.associatedConfigMap.values().iterator(); itc.hasNext();) {
-			List configs = (List) itc.next();
-			if (configs == null || configs.size() == 0) {
-				continue;
-			}
-
-			for (Iterator it = configs.iterator(); it.hasNext();) {
-				MethodConfiguration config = (MethodConfiguration) it.next();
-				String guid = config.getGuid();
-				String uri = document.getResourceUri(guid);
-				File src = null;
-				if (uri == null) {
-					URI resUri = config.eResource().getURI();
-					uri = MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME + File.separator + resUri.lastSegment();
-					uri = document.decodeUri(uri);
-					src = new File(resUri.toFileString());
-				}				
-				if ( uri != null ) {
-					//File src = new File(libFolder, uri);
-					if (src == null) {
-						src = new File(libFolder, uri);
-					}
-					File target =  new File(exportLibFolder, uri);
-					FileUtil.copyFile(src, target);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Copies directories from "fromDir" to "toDir".
-	 */
-	public static void copyDir(File fromDir, File toDir) {
-		Copy cp = new Copy();
-		cp.setOverwrite(true);
-		FileSet set = new FileSet();
-		set.setExcludes(ConfigurationExportService.excludes);
-		set.setDir(fromDir);
-		cp.addFileset(set);
-		cp.setTodir(toDir);
-		cp.setProject(new Project());
-		cp.setPreserveLastModified(true);
-		cp.execute();
-	}
-
-	private void getSelectedIds(List plugins, Map configsMap) {
-		selectedIds.clear();
-		selectedPluginNames.clear();
-
-		// Get the plug-in ids and names.
-		MethodPlugin plugin = null;
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			plugin = (MethodPlugin) it.next();
-			String guid = plugin.getGuid();
-			selectedPluginNames.add(plugin.getName());
-			if (!selectedIds.contains(guid)) {
-				selectedIds.add(guid);
-			}
-		}
-
-		// Save the library guid so that the entry in resgr.xmi will be kept.
-		if (plugin != null) {
-			MethodLibrary lib = (MethodLibrary) plugin.eContainer();
-			if (lib != null) {
-				selectedIds.add(lib.getGuid());
-			}
-		}
-
-		// Get the selected configuration ids.
-		for (Iterator itc = configsMap.values().iterator(); itc.hasNext();) {
-			List configs = (List) itc.next();
-			if (configs == null || configs.size() == 0) {
-				continue;
-			}
-
-			for (Iterator it = configs.iterator(); it.hasNext();) {
-				MethodConfiguration config = (MethodConfiguration) it.next();
-				String guid = config.getGuid();
-				if (selectedIds.contains(guid)) {
-					continue;
-				}
-
-				// Add the configuration.
-				selectedIds.add(guid);
-
-				// For each configuration, save the method plug-in and package
-				// ids so that their entries in the resource file can be kept.
-				List refs = config.eCrossReferences();
-				for (Iterator itr = refs.iterator(); itr.hasNext();) {
-					Object o = itr.next();
-					if (o instanceof MethodPlugin || o instanceof MethodPackage) {
-						guid = ((MethodElement) o).getGuid();
-						if (!selectedIds.contains(guid)) {
-							selectedIds.add(guid);
-						}
-					} else {
-						System.out
-								.println("Unexpected element type '" + ((MethodElement) o).getType().getName() //$NON-NLS-1$
-										+ "' in configuration '" + config.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/package.html b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/package.html
deleted file mode 100644
index fd4aaa5..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/services/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for the method plug-in and configuration export services.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/DestinationCommonPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/DestinationCommonPage.java
deleted file mode 100644
index a939556..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/DestinationCommonPage.java
+++ /dev/null
@@ -1,178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.authoring.ui.preferences.LibraryLocationData;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * A wizard page that prompts the user to select a destination directory for an
- * export or import operation.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class DestinationCommonPage extends BaseWizardPage implements Listener {
-
-	protected Composite composite;
-
-	protected Combo exportPathCombo;
-
-	protected Button browseButton;
-
-	protected LibraryLocationData llData;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DestinationCommonPage(String pageName, LibraryLocationData llData) {
-		super(pageName);
-		setTitle(ExportResources.DestinationCommonPage_title);
-		setDescription(ExportResources.DestinationCommonPage_desc);
-		this.llData = llData;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		composite = createGridLayoutComposite(parent, 3);
-
-		createLabel(composite, ExportResources.DestinationCommonPage_label_dir);
-		
-		exportPathCombo = createCombobox(composite, 1);
-		
-		browseButton = createButton(composite,
-				ExportResources.DestinationCommonPage_label_browse);
-
-		createLabel(composite, ""); //$NON-NLS-1$		
-
-		initControls();
-		
-		addListeners();
-
-		setControl(composite);
-
-		createAdditionalControls(composite);
-
-		setPageComplete(false);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		exportPathCombo.setEnabled(true);
-		browseButton.setEnabled(true);
-	}
-	
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {	
-		exportPathCombo.addListener(SWT.FocusIn, this);
-		exportPathCombo.addListener(SWT.Modify, this);
-		exportPathCombo.addListener(SWT.FocusOut, this);
-		exportPathCombo.addListener(SWT.Selection, this);
-		
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				openDirectoryDialog();
-			}
-		});		
-	}
-	
-	/**
-	 * Adds additional controls to this wizard page.
-	 * 
-	 * @param composite the parent composite
-	 */
-	protected void createAdditionalControls(Composite composite) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible) {
-			Display display = composite.getDisplay();
-			if (!(display == null || display.isDisposed())) {
-				display.asyncExec(new Runnable() {
-					public void run() {
-						exportPathCombo.setFocus();
-					}
-				});
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		Wizard wizard = (Wizard) getWizard();
-		setPageComplete(isPageComplete());
-		wizard.getContainer().updateButtons();
-	}
-
-	protected void saveToDataModel() {
-		String libName = exportPathCombo.getText();
-		if (libName.length() > 0) {
-			if (!libName.endsWith(File.separator)) {
-				libName = libName.substring(
-						libName.lastIndexOf(File.separator) + 1, libName
-								.length());
-			} else
-				libName = ""; //$NON-NLS-1$
-		}
-		llData.setLibName(libName);
-		llData.setParentFolder(exportPathCombo.getText());
-	}
-
-	private void openDirectoryDialog() {
-		try {
-			DirectoryDialog dd = new DirectoryDialog(composite.getShell(),
-					SWT.NONE);
-			dd.setFilterPath(exportPathCombo.getText());
-
-			String destination = dd.open();
-			if (destination != null) {
-				exportPathCombo.setText(destination);
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	/**
-	 * use the opened dirs to init combo list
-	 */
-	protected void initComboItems() {
-		return;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigCheckingPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigCheckingPage.java
deleted file mode 100644
index f92fdd4..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigCheckingPage.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.util.List;
-
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.ConfigurationExportData;
-import org.eclipse.epf.library.IConfigurationClosure;
-import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextPresentation;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A wizard page that displays the result of a configuration integrity check.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportConfigCheckingPage extends BaseWizardPage {
-
-	public static final String PAGE_NAME = ExportConfigCheckingPage.class
-			.getName();
-
-	private TextViewer textViewer;
-
-	private TextPresentation style;
-
-	private ConfigurationExportData data;
-
-	private IConfigurationClosure closure = null;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportConfigCheckingPage(ConfigurationExportData data) {
-		super(PAGE_NAME);
-		setTitle(ExportResources.checkConfigPage_title);
-		setDescription(ExportResources.checkConfigPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_lib_conf_wizban.gif")); //$NON-NLS-1$
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		textViewer = createTextViewer(container, 360, 160, 1);
-		Document doc = new Document(" "); //$NON-NLS-1$
-		textViewer.setDocument(doc);
-
-		setControl(container);
-		setPageComplete(true);
-	}
-
-	private void displaySummary() {
-		style = new TextPresentation();
-		Document doc = getSummaryText();
-		textViewer.setDocument(doc);
-		textViewer.changeTextPresentation(style, true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		displaySummary();
-	}
-
-	/**
-	 * Returns a document of summary text.
-	 */
-	public Document getSummaryText() {
-		final StringBuffer textBuf = new StringBuffer();
-
-		if (data.selectedConfigs.size() == 0) {
-			textBuf.append(ExportResources.ExportConfigCheckingPage_summary_2);
-		} else {
-			final MethodConfiguration config = (MethodConfiguration) data.selectedConfigs
-					.get(0);
-			if ((closure == null) || (closure.getConfiguration() != config)) {
-				Runnable runnable = new Runnable() {
-					public void run() {
-						// Check the configuration closure.
-						closure = new ConfigurationClosure(null, config);
-					}
-				};
-
-				UserInteractionHelper.runWithProgress(runnable,
-						ExportResources.ExportConfigCheckingPage_checking);
-			}
-		}
-
-		List errors = closure.getAllErrors();
-		if (errors.size() == 0) {
-			textBuf.append(ExportResources.ExportConfigCheckingPage_summary_3);
-		} else {
-			textBuf.append(ExportResources.bind(
-					ExportResources.ExportConfigCheckingPage_summary_4,
-					(new Object[] { Integer.toString(errors.size()) })));
-		}
-
-		Document doc = new Document(textBuf.toString());
-		return doc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigChooseMode.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigChooseMode.java
deleted file mode 100644
index 7268d95..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigChooseMode.java
+++ /dev/null
@@ -1,122 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.ConfigurationExportData;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * A wizard page that displays the types of configuration that can be exported.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportConfigChooseMode extends BaseWizardPage implements Listener {
-
-	public static final String PAGE_NAME = ExportConfigChooseMode.class
-			.getName();
-
-	private Button oneConfigButton;
-
-	private Button configSpecButton;
-
-	private ConfigurationExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportConfigChooseMode(ConfigurationExportData data) {
-		super(PAGE_NAME);
-		setTitle(ExportResources.selectExportTypePage_title);
-		setDescription(ExportResources.selectExportTypePage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_lib_conf_wizban.gif")); //$NON-NLS-1$
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		oneConfigButton = createRadioButton(container,
-				ExportResources.selectExportTypePage_configLabel_text, 1, true);
-
-		configSpecButton = createRadioButton(container,
-				ExportResources.selectExportTypePage_configSpecsLabel_text, 1,
-				false);
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(true);
-	}
-
-	private void addListeners() {
-		oneConfigButton.addListener(SWT.Selection, this);
-		configSpecButton.addListener(SWT.Selection, this);
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	private void saveDataToModel() {
-		data.exportOneConfig = oneConfigButton.getSelection();
-		data.exportConfigSpecs = configSpecButton.getSelection();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		return getErrorMessage() == null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		saveDataToModel();
-		if (data.exportOneConfig) {
-			ExportConfigSelectConfigPage page = ((ExportConfigurationWizard) getWizard()).selectConfigPage;
-			return page;
-		} else if (data.exportConfigSpecs) {
-			ExportConfigSelectSpecsPage page = ((ExportConfigurationWizard) getWizard()).selectSpecsPage;
-			return page;
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigDestinationPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigDestinationPage.java
deleted file mode 100644
index 7fdcc47..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigDestinationPage.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.ConfigurationExportData;
-
-/**
- * A wizard page that prompts the user for the destination directory of an
- * export operation.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportConfigDestinationPage extends DestinationCommonPage {
-
-	public static final String PAGE_NAME = ExportConfigDestinationPage.class
-			.getName();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportConfigDestinationPage(ConfigurationExportData data) {
-		super(PAGE_NAME, data.llData);
-		setTitle(ExportResources.selectDestinationPage_title);
-		setDescription(ExportResources.selectDestinationPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_lib_conf_wizban.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String[] exportDirs = ExportUIPreferences.getExportConfigDirs();
-		if (exportDirs != null && exportDirs.length > 0) {
-			exportPathCombo.setItems(exportDirs);
-			exportPathCombo.setText(exportDirs[0]);
-		}
-		super.initControls();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		ExportConfigurationWizard wizard = (ExportConfigurationWizard) getWizard();
-		if (exportPathCombo.getText().length() > 0
-				&& !exportPathCombo.getText().endsWith(File.separator)) {
-			saveToDataModel();
-			wizard.okToComplete = true;
-			return true;
-		}
-		wizard.okToComplete = false;
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigSelectConfigPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigSelectConfigPage.java
deleted file mode 100644
index 6aefad5..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigSelectConfigPage.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.ConfigurationExportData;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-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.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to select a method configuration to
- * export.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportConfigSelectConfigPage extends BaseWizardPage implements
-		ISelectionChangedListener, Listener {
-
-	public static final String PAGE_NAME = ExportConfigSelectConfigPage.class
-			.getName();
-
-	private Table table;
-
-	private TableViewer ctrl_tableViewer;
-
-	private Text ctrl_briefDesc;
-
-	private ConfigurationExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportConfigSelectConfigPage(ConfigurationExportData data) {
-		super(PAGE_NAME);
-		setTitle(ExportResources.selectConfigPage_title);
-		setDescription(ExportResources.selectConfigPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_lib_conf_wizban.gif")); //$NON-NLS-1$
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		createLabel(container,
-				ExportResources.selectConfigPage_configsLabel_text);
-
-		ctrl_tableViewer = createTableViewer(container, 360, 120, 1);
-		table = ctrl_tableViewer.getTable();
-
-		MethodConfiguration[] configs = LibraryServiceUtil
-				.getMethodConfigurations(LibraryService.getInstance()
-						.getCurrentMethodLibrary());
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public Image getImage(Object element) {
-				return LibraryUIImages.IMG_METHOD_PLUGIN;
-			}
-
-			public String getText(Object element) {
-				if (element instanceof MethodConfiguration) {
-					return ((MethodConfiguration) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		};
-		ctrl_tableViewer.setLabelProvider(labelProvider);
-		ctrl_tableViewer.setContentProvider(new ArrayContentProvider());
-		if (configs != null) {
-			ctrl_tableViewer.setInput(configs);
-		}
-
-		createLabel(container, AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-
-		ctrl_briefDesc = createMultiLineText(container, "", 360, 80, 3); //$NON-NLS-1$
-
-		if (configs != null && configs.length > 0) {
-			table.select(0);
-			setDisplayAttributes((MethodConfiguration) configs[0]);
-		}
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(true);
-	}
-
-	private void addListeners() {
-		ctrl_tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		StructuredSelection selection = (StructuredSelection) event
-				.getSelection();
-		if (!selection.isEmpty()) {
-			Object[] configs = selection.toArray();
-			setDisplayAttributes((MethodConfiguration) configs[0]);
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	private void setDisplayAttributes(MethodConfiguration config) {
-		ctrl_briefDesc.setText(config.getBriefDescription());
-	}
-
-	protected void saveDataToModel() {
-		IStructuredSelection selection = (IStructuredSelection) ctrl_tableViewer
-				.getSelection();
-		Object[] configs = selection.toArray();
-		MethodConfiguration config = (MethodConfiguration) configs[0];
-		List arrList = new ArrayList();
-		arrList.add(config);
-		data.selectedConfigs = arrList;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		saveDataToModel();
-		ExportConfigCheckingPage page = ((ExportConfigurationWizard) getWizard()).configCheckingPage;
-		page.onEnterPage(null);
-		return page;
-	}
-	
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-     */
-    public boolean isPageComplete() {
-		IStructuredSelection selection = (IStructuredSelection) ctrl_tableViewer
-											.getSelection();
-    	if (selection == null || selection.isEmpty()) {
-    		return false;
-    	}
-        return super.isPageComplete();
-    }
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigSelectSpecsPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigSelectSpecsPage.java
deleted file mode 100644
index a72ee57..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigSelectSpecsPage.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.ConfigurationExportData;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to select one or more method
- * configuration specifications to export.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportConfigSelectSpecsPage extends BaseWizardPage implements
-		ISelectionChangedListener, ICheckStateListener, Listener {
-
-	public static final String PAGE_NAME = ExportConfigSelectSpecsPage.class
-			.getName();
-
-	private Table table;
-
-	private CheckboxTableViewer ctrl_chkboxTableViewer;
-
-	private Text ctrl_briefDesc;
-
-	private int checkedCount = 0;
-
-	private List checkedConfigList = new ArrayList();
-
-	private ConfigurationExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportConfigSelectSpecsPage(ConfigurationExportData data) {
-		super(PAGE_NAME);
-		setTitle(ExportResources.selectConfigSpecsPage_title);
-		setDescription(ExportResources.selectConfigSpecsPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_lib_conf_wizban.gif")); //$NON-NLS-1$
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		createLabel(container,
-				ExportResources.selectConfigSpecsPage_configsLabel_text);
-
-		ctrl_chkboxTableViewer = createCheckboxTableViewer(container, 1);
-		table = ctrl_chkboxTableViewer.getTable();
-
-		MethodConfiguration[] configs = LibraryServiceUtil
-				.getMethodConfigurations(LibraryService.getInstance()
-						.getCurrentMethodLibrary());
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public Image getImage(Object element) {
-				return LibraryUIImages.IMG_METHOD_PLUGIN;
-			}
-
-			public String getText(Object element) {
-				if (element instanceof MethodConfiguration) {
-					return ((MethodConfiguration) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		};
-		ctrl_chkboxTableViewer.setLabelProvider(labelProvider);
-		ctrl_chkboxTableViewer.setContentProvider(new ArrayContentProvider());
-		if (configs != null) {
-			ctrl_chkboxTableViewer.setInput(configs);
-		}
-
-		createLabel(container, AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-		ctrl_briefDesc = createMultiLineText(container, "", 360, 80, 3); //$NON-NLS-1$
-
-		if (configs != null && configs.length > 0) {
-			setDisplayAttributes((MethodConfiguration) configs[0]);
-		}
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(true);
-	}
-
-	private void addListeners() {
-		ctrl_chkboxTableViewer.addSelectionChangedListener(this);
-		ctrl_chkboxTableViewer.addCheckStateListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		Object obj = event.getElement();
-
-		if (event.getChecked()) {
-			checkedCount++;
-			checkedConfigList.add(obj);
-		} else {
-			checkedCount--;
-			checkedConfigList.remove(obj);
-		}
-
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		StructuredSelection selection = (StructuredSelection) event
-				.getSelection();
-		if (!selection.isEmpty()) {
-			Object[] configs = selection.toArray();
-			setDisplayAttributes((MethodConfiguration) configs[0]);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	private void setDisplayAttributes(MethodConfiguration config) {
-		ctrl_briefDesc.setText(config.getBriefDescription());
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (getErrorMessage() != null)
-			return false;
-		return checkedCount > 0;
-	}
-
-	protected void saveDataToModel() {
-		data.selectedConfigs = checkedConfigList;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		saveDataToModel();
-		ExportConfigDestinationPage page = ((ExportConfigurationWizard) getWizard()).destinationPage;
-		return page;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigurationWizard.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigurationWizard.java
deleted file mode 100644
index cbc26b8..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportConfigurationWizard.java
+++ /dev/null
@@ -1,177 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.wizards.SaveAllEditorsPage;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.ConfigurationExportData;
-import org.eclipse.epf.export.services.ConfigurationExportService;
-import org.eclipse.epf.export.services.ConfigurationSpecsExportService;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.ui.wizards.DirectoryValidator;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * The Export Library Configuration wizard.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportConfigurationWizard extends Wizard implements IImportWizard {
-
-	protected ExportConfigChooseMode modePage;
-
-	protected ExportConfigSelectSpecsPage selectSpecsPage;
-
-	protected ExportConfigSelectConfigPage selectConfigPage;
-
-	protected ExportConfigCheckingPage configCheckingPage;
-
-	protected ExportConfigDestinationPage destinationPage;
-
-	protected boolean okToComplete = false;
-
-	protected ConfigurationExportData data = new ConfigurationExportData();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportConfigurationWizard() {
-		setWindowTitle(ExportResources.exportConfigWizard_title);
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		SaveAllEditorsPage.addPageIfNeeded(this, false, null, null,
-				ExportPlugin.getDefault().getImageDescriptor(
-						"full/wizban/ExportLibraryConfiguration.gif")); //$NON-NLS-1$
-
-		modePage = new ExportConfigChooseMode(data);
-		addPage(modePage);
-
-		selectSpecsPage = new ExportConfigSelectSpecsPage(data);
-		addPage(selectSpecsPage);
-
-		selectConfigPage = new ExportConfigSelectConfigPage(data);
-		addPage(selectConfigPage);
-
-		configCheckingPage = new ExportConfigCheckingPage(data);
-		addPage(configCheckingPage);
-
-		destinationPage = new ExportConfigDestinationPage(data);
-		addPage(destinationPage);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				LibraryUIImages.IMG_METHOD_CONFIGURATON);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		// Cannot complete the wizard if it's not the last page.
-		if (this.getContainer().getCurrentPage() != destinationPage)
-			return false;
-		return okToComplete;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		String exportLibPath = data.llData.getParentFolder();
-		if (!checkAndCreateDir(exportLibPath)) {
-			return false;
-		}
-
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				try {
-					monitor.beginTask(
-							ExportResources.exportConfigErrorDialog_title,
-							IProgressMonitor.UNKNOWN);
-
-					if (data.validate()) {
-						if (data.exportConfigSpecs) {
-							// Export configuration specs only.
-							(new ConfigurationSpecsExportService(data))
-									.run(monitor);
-						} else {
-							// Export a configuration closure.
-							(new ConfigurationExportService(data)).run(monitor);
-						}
-					}
-				} catch (Exception e) {
-					throw new InvocationTargetException(e);
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			getContainer().run(true, false, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			Throwable realException = e.getTargetException();
-			ExportPlugin.getDefault().getMsgDialog().displayError(
-					ExportResources.exportConfigErrorDialog_title,
-					realException.getMessage());
-			return false;
-		}
-
-		if (data.errorMsg != null && data.errorMsg.length() > 0) {
-			ExportPlugin.getDefault().getMsgDialog().displayError(
-					ExportResources.exportConfigErrorDialog_title,
-					data.errorMsg);
-		}
-
-		// Save the export path to preference store.
-		ExportUIPreferences.addExportConfigDir(exportLibPath);
-
-		return true;
-	}
-
-	private boolean checkAndCreateDir(String dir) {
-		return DirectoryValidator.checkAndCreateDir(dir,
-				ExportResources.exportConfigErrorDialog_title,
-				ExportResources.ExportPluginError_msg, false);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportPluginSummaryPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportPluginSummaryPage.java
deleted file mode 100644
index d93fc2e..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportPluginSummaryPage.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextPresentation;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A wizard page that displays a summary of the selected method plug-ins that
- * will be exported.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportPluginSummaryPage extends BaseWizardPage {
-
-	public static final String PAGE_NAME = ExportPluginSummaryPage.class
-			.getName();
-
-	private TextViewer textViewer;
-
-	private TextPresentation style;
-
-	private PluginExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportPluginSummaryPage(PluginExportData data) {
-		super(PAGE_NAME);
-		setTitle(ExportResources.exportPluginSummaryPage_title);
-		setDescription(ExportResources.exportPluginSummaryPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_meth_plugin_wizban.gif")); //$NON-NLS-1$		
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		textViewer = createTextViewer(container, 360, 160, 1);
-		Document doc = new Document(""); //$NON-NLS-1$		
-		textViewer.setDocument(doc);
-
-		setControl(container);
-		setPageComplete(true);
-	}
-
-	private void displaySummary() {
-		style = new TextPresentation();
-		Document doc = getSummaryText();
-		textViewer.setDocument(doc);
-		textViewer.changeTextPresentation(style, true);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		displaySummary();
-	}
-
-	/**
-	 * Returns a document of the summary text.
-	 */
-	public Document getSummaryText() {
-		StringBuffer textBuf = new StringBuffer();
-
-		if (data.selectedPlugins == null || data.selectedPlugins.isEmpty())
-			return new Document(
-					ExportResources.exportPluginSummaryPage_noPlugin_text);
-
-		int start = 0;
-		int offset = 0;
-		for (int i = 0; i < data.selectedPlugins.size(); i++) {
-			MethodPlugin plugin = (MethodPlugin) data.selectedPlugins.get(i);
-			start = textBuf.length();
-			offset = plugin.getName().length();
-			style.addStyleRange(new StyleRange(start, offset, null, null,
-					SWT.BOLD));
-			textBuf.append(plugin.getName()).append("\n"); //$NON-NLS-1$
-
-			start = textBuf.length();
-			offset = AuthoringUIText.AUTHORS_TEXT.length();
-			style.addStyleRange(new StyleRange(start, offset, null, null,
-					SWT.BOLD | SWT.ITALIC));
-			textBuf
-					.append("\t").append(AuthoringUIText.AUTHORS_TEXT).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			textBuf.append("\t\t").append(plugin.getAuthors()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			start = textBuf.length();
-			offset = AuthoringUIText.VERSION_TEXT.length();
-			style.addStyleRange(new StyleRange(start, offset, null, null,
-					SWT.BOLD | SWT.ITALIC));
-			textBuf
-					.append("\t").append(AuthoringUIText.VERSION_TEXT).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			textBuf.append("\t\t").append(plugin.getVersion()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			start = textBuf.length();
-			offset = AuthoringUIText.BRIEF_DESCRIPTION_TEXT.length();
-			style.addStyleRange(new StyleRange(start, offset, null, null,
-					SWT.BOLD | SWT.ITALIC));
-			textBuf
-					.append("\t").append(AuthoringUIText.BRIEF_DESCRIPTION_TEXT).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			textBuf
-					.append("\t\t").append(plugin.getBriefDescription()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			start = textBuf.length();
-			offset = ExportResources.reviewPluginsPage_dependentPluginsLabel_text
-					.length(); 
-			style.addStyleRange(new StyleRange(start, offset, null, null,
-					SWT.BOLD | SWT.ITALIC));
-			textBuf
-					.append("\t") //$NON-NLS-1$
-					.append(
-							ExportResources.reviewPluginsPage_dependentPluginsLabel_text)
-					.append("\n"); //$NON-NLS-1$
-			List dependentPluginList = plugin.getBases();
-			boolean addLinefeed = true;
-			for (Iterator iter = dependentPluginList.iterator(); iter.hasNext();) {
-				MethodPlugin element = (MethodPlugin) iter.next();
-				textBuf.append("\t\t").append(element.getName()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-				addLinefeed = false;
-			}
-			if (addLinefeed)
-				textBuf.append("\n"); //$NON-NLS-1$
-
-			start = textBuf.length();
-			offset = ExportResources.reviewPluginsPage_associatedConfigsLabel_text
-					.length();
-			style.addStyleRange(new StyleRange(start, offset, null, null,
-					SWT.BOLD | SWT.ITALIC));
-			textBuf
-					.append("\t") //$NON-NLS-1$
-					.append(
-							ExportResources.reviewPluginsPage_associatedConfigsLabel_text)
-					.append("\n"); //$NON-NLS-1$
-			List associatedConfigList = (List) data.associatedConfigMap
-					.get(plugin);
-			for (Iterator iter = associatedConfigList.iterator(); iter
-					.hasNext();) {
-				MethodConfiguration element = (MethodConfiguration) iter.next();
-				textBuf.append("\t\t").append(element.getName()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			textBuf.append("\n"); //$NON-NLS-1$
-		}
-
-		Document doc = new Document(textBuf.toString());
-		return doc;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportPluginWizard.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportPluginWizard.java
deleted file mode 100644
index f6990ba..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportPluginWizard.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.wizards.SaveAllEditorsPage;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.epf.export.services.PluginExportService;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.ui.wizards.DirectoryValidator;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * The Export Method Plug-in wizard.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ExportPluginWizard extends Wizard implements IImportWizard {
-
-	protected SelectPluginPage page1;
-
-	protected PluginInfoPage page2;
-
-	protected ExportPluginSummaryPage page3;
-
-	protected SavePluginPage page4;
-
-	protected boolean okToComplete = false;
-
-	protected PluginExportData data = new PluginExportData();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ExportPluginWizard() {
-		setWindowTitle(ExportResources.exportPluginsWizard_title);
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		SaveAllEditorsPage.addPageIfNeeded(this, false, null, null,
-				ExportPlugin.getDefault().getImageDescriptor(
-						"full/wizban/ExportMethodPlugins.gif")); //$NON-NLS-1$
-
-		page1 = new SelectPluginPage(data);
-		addPage(page1);
-
-		page2 = new PluginInfoPage(data);
-		addPage(page2);
-
-		page3 = new ExportPluginSummaryPage(data);
-		addPage(page3);
-
-		page4 = new SavePluginPage(data);
-		addPage(page4);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(LibraryUIImages.IMG_METHOD_PLUGIN);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		if (this.getContainer().getCurrentPage() != page4)
-			return false;
-		return okToComplete;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		String exportLibPath = data.llData.getParentFolder();
-		if (checkAndCreateDir(exportLibPath) == false) {
-			return false;
-		}
-
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				try {
-					monitor.beginTask(ExportResources.ExportPluginWizard_MSG1,
-							IProgressMonitor.UNKNOWN);
-
-					if (data.validate()) {
-						(new PluginExportService(data)).run(monitor);
-					}
-
-				} catch (Exception e) {
-					throw new InvocationTargetException(e);
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			getContainer().run(true, false, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			Throwable realException = e.getTargetException();
-			ExportPlugin.getDefault().getMsgDialog().displayError(
-					ExportResources.ExportPluginWizard_error,
-					realException.getMessage());
-			return false;
-		}
-
-		// Save the export path to preference store.
-		ExportUIPreferences.addExportPluginDir(exportLibPath);
-
-		return true;
-	}
-
-	private boolean checkAndCreateDir(String dir) {
-		return DirectoryValidator.checkAndCreateDir(dir,
-				ExportResources.ExportPluginWizard_title,
-				ExportResources.ExportPluginError_msg, false);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportUIPreferences.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportUIPreferences.java
deleted file mode 100644
index 6498ee6..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/ExportUIPreferences.java
+++ /dev/null
@@ -1,155 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.util.List;
-
-import org.eclipse.epf.common.ui.util.PreferenceUtil;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Manages the Export UI preferences.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ExportUIPreferences {
-
-	// The export plug-in directories preference key.
-	private static final String EXPORT_PLUGIN_DIRS = "exportPluginDirs"; //$NON-NLS-1$
-
-	// The export configuration directories preference key.
-	private static final String EXPORT_CONFIG_DIRS = "exportConfigDirs"; //$NON-NLS-1$
-
-	// The default export plug-in directory name.
-	private static final String DEFAULT_EXPORT_PLUGIN_DIR_NAME = "Export" + FileUtil.FILE_SEP + "Plugins"; //$NON-NLS-1$ //$NON-NLS-2$	 
-
-	// The default export configuration directory name.
-	private static final String DEFAULT_EXPORT_CONFIG_DIR_NAME = "Export" + FileUtil.FILE_SEP + "Configurations"; //$NON-NLS-1$ //$NON-NLS-2$	 
-
-	// The default export plug-in directory.
-	private static String defaultExportPluginDir = null;
-
-	// The default export configuration directory.
-	private static String defaultExportConfigDir = null;
-
-	// The plug-in specific preference store.
-	private static IPreferenceStore prefStore = ExportPlugin.getDefault()
-			.getPreferenceStore();
-
-	static {
-		prefStore.setDefault(EXPORT_PLUGIN_DIRS, getDefaultExportPluginDir());
-		prefStore.setDefault(EXPORT_CONFIG_DIRS, getDefaultExportConfigDir());
-	}
-
-	/**
-	 * Gets the default export plug-in directory.
-	 * 
-	 * @return the default export plug-in directory
-	 */
-	public static String getDefaultExportPluginDir() {
-		if (defaultExportPluginDir == null) {
-			defaultExportPluginDir = System.getProperty("user.home"); //$NON-NLS-1$
-			String appName = LibraryUIPreferences.getApplicationShortName();
-			if (appName != null && appName.length() > 0) {
-				defaultExportPluginDir = defaultExportPluginDir
-						+ FileUtil.FILE_SEP + appName + FileUtil.FILE_SEP
-						+ DEFAULT_EXPORT_PLUGIN_DIR_NAME;
-			} else {
-				defaultExportPluginDir = defaultExportPluginDir
-						+ FileUtil.FILE_SEP + DEFAULT_EXPORT_PLUGIN_DIR_NAME;
-			}
-		}
-		return defaultExportPluginDir;
-	}
-
-	/**
-	 * Gets the export plug-in directories preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String[] getExportPluginDirs() {
-		return PreferenceUtil.getStringValues(prefStore, EXPORT_PLUGIN_DIRS);
-	}
-
-	/**
-	 * Gets the export plug-in directories preference value.
-	 * 
-	 * @return a collection of export plug-in directories
-	 */
-	public static List<String> getExportPluginDirsList() {
-		return PreferenceUtil.getList(prefStore, EXPORT_PLUGIN_DIRS);
-	}
-
-	/**
-	 * Adds a export directory to the export plug-in directories preference.
-	 * 
-	 * @param dir
-	 *            an export directory
-	 */
-	public static void addExportPluginDir(String dir) {
-		PreferenceUtil.addToList(prefStore, EXPORT_PLUGIN_DIRS, dir);
-	}
-
-	/**
-	 * Gets the default export configuration directory.
-	 * 
-	 * @return the default export configuration directory
-	 */
-	public static String getDefaultExportConfigDir() {
-		if (defaultExportConfigDir == null) {
-			defaultExportConfigDir = System.getProperty("user.home"); //$NON-NLS-1$
-			String appName = LibraryUIPreferences.getApplicationShortName();
-			if (appName != null && appName.length() > 0) {
-				defaultExportConfigDir = defaultExportConfigDir
-						+ FileUtil.FILE_SEP + appName + FileUtil.FILE_SEP
-						+ DEFAULT_EXPORT_CONFIG_DIR_NAME;
-			} else {
-				defaultExportConfigDir = defaultExportConfigDir
-						+ FileUtil.FILE_SEP + DEFAULT_EXPORT_CONFIG_DIR_NAME;
-			}
-		}
-		return defaultExportConfigDir;
-	}
-
-	/**
-	 * Gets the export configuration directories preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String[] getExportConfigDirs() {
-		return PreferenceUtil.getStringValues(prefStore, EXPORT_CONFIG_DIRS);
-	}
-
-	/**
-	 * Gets the export configuration directories preference value.
-	 * 
-	 * @return a collection of export configuration directories
-	 */
-	public static List<String> getExportConfigDirsList() {
-		return PreferenceUtil.getList(prefStore, EXPORT_CONFIG_DIRS);
-	}
-
-	/**
-	 * Adds a export directory to the export configuration directories
-	 * preference.
-	 * 
-	 * @param dir
-	 *            an export directory
-	 */
-	public static void addExportConfigDir(String dir) {
-		PreferenceUtil.addToList(prefStore, EXPORT_CONFIG_DIRS, dir);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/PluginInfoPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/PluginInfoPage.java
deleted file mode 100644
index b547388..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/PluginInfoPage.java
+++ /dev/null
@@ -1,219 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.wizards.ConfigurationTableLabelProvider;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-
-/**
- * A wizard page that prompts the user to review the dependencies of the method
- * plug-ins that have been selected for export.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PluginInfoPage extends BaseWizardPage implements
-		ISelectionChangedListener, Listener {
-
-	public static final String PAGE_NAME = PluginInfoPage.class.getName();
-
-	private Table table;
-
-	private TableViewer ctrl_tableViewer;
-
-	private TableViewer ctrl_dependPluginsViewer;
-
-	private TableViewer ctrl_associatedConfigViewer;
-
-	private List dependentPluginList = new ArrayList();
-
-	private List associatedConfigList = new ArrayList();
-
-	private PluginExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PluginInfoPage(PluginExportData data) {
-		super(PAGE_NAME);
-		setTitle(ExportResources.reviewPluginsPage_title);
-		setDescription(ExportResources.reviewPluginsPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_meth_plugin_wizban.gif")); //$NON-NLS-1$		
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		createLabel(container,
-				ExportResources.reviewPluginsPage_pluginsLabel_text);
-
-		ctrl_tableViewer = createTableViewer(container, 360, 60, 1);
-		table = ctrl_tableViewer.getTable();
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public Image getImage(Object element) {
-				return LibraryUIImages.IMG_METHOD_PLUGIN;
-			}
-
-			public String getText(Object element) {
-				if (element instanceof MethodPlugin) {
-					return ((MethodPlugin) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		};
-		ctrl_tableViewer.setLabelProvider(labelProvider);
-		ctrl_tableViewer.setContentProvider(new ArrayContentProvider());
-		if (data.getSelectedPlugins() != null) {
-			ctrl_tableViewer.setInput(data.getSelectedPlugins().toArray());
-		}
-
-		createLabel(container,
-				ExportResources.reviewPluginsPage_dependentPluginsLabel_text);
-
-		ctrl_dependPluginsViewer = createTableViewer(container, 360, 60, 1);
-		ctrl_dependPluginsViewer.setLabelProvider(labelProvider);
-		ctrl_dependPluginsViewer.setContentProvider(new ArrayContentProvider());
-		ctrl_dependPluginsViewer.setInput(dependentPluginList);
-
-		createLabel(container,
-				ExportResources.reviewPluginsPage_associatedConfigsLabel_text);
-
-		ctrl_associatedConfigViewer = createTableViewer(container, 360, 60, 1);
-		ctrl_associatedConfigViewer
-				.setLabelProvider(new ConfigurationTableLabelProvider());
-		ctrl_associatedConfigViewer
-				.setContentProvider(new ArrayContentProvider());
-		ctrl_associatedConfigViewer.setInput(associatedConfigList);
-
-		if (data.getSelectedPlugins() != null
-				&& !data.getSelectedPlugins().isEmpty()) {
-			table.select(0);
-			displayRelatedInfo((MethodPlugin) data.getSelectedPlugins().get(0));
-		}
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(false);
-	}
-
-	private void addListeners() {
-		ctrl_tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		StructuredSelection selection = (StructuredSelection) event
-				.getSelection();
-		if (!selection.isEmpty()) {
-			Object[] plugin = selection.toArray();
-			displayRelatedInfo((MethodPlugin) plugin[0]);
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (data.getSelectedPlugins() != null
-				&& !data.getSelectedPlugins().isEmpty()) {
-			ctrl_tableViewer.setInput(data.getSelectedPlugins().toArray());
-			table.select(0);
-			displayRelatedInfo((MethodPlugin) data.getSelectedPlugins().get(0));
-		}
-	}
-
-	private void displayRelatedInfo(MethodPlugin plugin) {
-		if (plugin == null)
-			return;
-
-		dependentPluginList = plugin.getBases();
-		ctrl_dependPluginsViewer.setInput(dependentPluginList.toArray());
-		associatedConfigList = LibraryUtil.getAssociatedConfigurations(plugin);
-		ctrl_associatedConfigViewer.setInput(associatedConfigList.toArray());
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return true;
-	}
-
-	protected void saveDataToModel() {
-		// FIXME! Refactor to use: data.buildAssociatedConfigMap()
-		if (data.getSelectedPlugins() != null) {
-			data.associatedConfigMap.clear();
-			for (Iterator iter = data.getSelectedPlugins().iterator(); iter
-					.hasNext();) {
-				MethodPlugin element = (MethodPlugin) iter.next();
-				data.associatedConfigMap.put(element, LibraryUtil
-						.getAssociatedConfigurations(element));
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		saveDataToModel();
-		ExportPluginSummaryPage page = ((ExportPluginWizard) getWizard()).page3;
-		page.onEnterPage(null);
-		return page;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/SavePluginPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/SavePluginPage.java
deleted file mode 100644
index f49b9b5..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/SavePluginPage.java
+++ /dev/null
@@ -1,69 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.PluginExportData;
-
-/**
- * A wizard page that informs the user that changes to the existing method
- * plug-ins will be saved prior to an export operation.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class SavePluginPage extends DestinationCommonPage {
-
-	public static final String PAGE_NAME = SavePluginPage.class.getName();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SavePluginPage(PluginExportData data) {
-		super(PAGE_NAME, data.llData);
-		setTitle(ExportResources.specifyPathPage_title);
-		setDescription(ExportResources.specifyPathPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_meth_plugin_wizban.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String[] exportDirs = ExportUIPreferences.getExportPluginDirs();
-		if (exportDirs != null && exportDirs.length > 0) {
-			exportPathCombo.setItems(exportDirs);
-			exportPathCombo.setText(exportDirs[0]);
-		}
-		super.initControls();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		ExportPluginWizard wizard = (ExportPluginWizard) getWizard();
-		if (exportPathCombo.getText().length() > 0
-				&& !exportPathCombo.getText().endsWith(File.separator)) {
-			saveToDataModel();
-			wizard.okToComplete = true;
-			return true;
-		}
-		wizard.okToComplete = false;
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/SelectPluginPage.java b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/SelectPluginPage.java
deleted file mode 100644
index 0cf8892..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/SelectPluginPage.java
+++ /dev/null
@@ -1,223 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.export.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.export.ExportPlugin;
-import org.eclipse.epf.export.ExportResources;
-import org.eclipse.epf.export.services.PluginExportData;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to select the method plug-ins to be
- * exported.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectPluginPage extends BaseWizardPage implements
-		ISelectionChangedListener, ICheckStateListener, Listener {
-
-	public static final String PAGE_NAME = SelectPluginPage.class.getName();
-
-	private Table table;
-
-	private CheckboxTableViewer ctrl_chkboxTableViewer;
-
-	private Text ctrl_author;
-
-	private Text ctrl_version;
-
-	private Text ctrl_briefDesc;
-
-	private int checkedCount = 0;
-
-	private List<Object> checkedPluginList = new ArrayList<Object>();
-
-	private PluginExportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectPluginPage(PluginExportData data) {
-		super(PAGE_NAME);
-		setTitle(ExportResources.selectPluginsPage_title);
-		setDescription(ExportResources.selectPluginsPage_desc);
-		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/exp_meth_plugin_wizban.gif")); //$NON-NLS-1$
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout());
-
-		createLabel(container,
-				ExportResources.selectPluginsPage_pluginsLabel_text);
-
-		ctrl_chkboxTableViewer = createCheckboxTableViewer(container, 1);
-		table = ctrl_chkboxTableViewer.getTable();
-
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		List plugins = (library == null) ? new ArrayList() : library
-				.getMethodPlugins();
-		ILabelProvider labelProvider = new LabelProvider() {
-			public Image getImage(Object element) {
-				return LibraryUIImages.IMG_METHOD_PLUGIN;
-			}
-
-			public String getText(Object element) {
-				if (element instanceof MethodPlugin) {
-					return ((MethodPlugin) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		};
-
-		ctrl_chkboxTableViewer.setLabelProvider(labelProvider);
-		ctrl_chkboxTableViewer.setContentProvider(new ArrayContentProvider());
-		if (plugins != null) {
-			ctrl_chkboxTableViewer.setInput(plugins.toArray());
-		}
-
-		createLabel(container, AuthoringUIText.AUTHORS_TEXT);
-		ctrl_author = createMultiLineText(container, "", 360, 40, 3); //$NON-NLS-1$
-
-		createLabel(container, AuthoringUIText.VERSION_TEXT);
-		ctrl_version = createText(container, "", 360, 3); //$NON-NLS-1$
-
-		createLabel(container, AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
-		ctrl_briefDesc = createMultiLineText(container, "", 360, 80, 3); //$NON-NLS-1$
-
-		if (plugins != null && !plugins.isEmpty()) {
-			table.select(0);
-			setDisplayAttributes((MethodPlugin) plugins.get(0));
-		}
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(false);
-	}
-
-	private void addListeners() {
-		ctrl_chkboxTableViewer.addSelectionChangedListener(this);
-		ctrl_chkboxTableViewer.addCheckStateListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		Object obj = event.getElement();
-
-		if (event.getChecked()) {
-			checkedCount++;
-			checkedPluginList.add(obj);
-		} else {
-			checkedCount--;
-			checkedPluginList.remove(obj);
-		}
-
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		StructuredSelection selection = (StructuredSelection) event
-				.getSelection();
-		if (!selection.isEmpty()) {
-			Object[] plugin = selection.toArray();
-			setDisplayAttributes((MethodPlugin) plugin[0]);
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	private void setDisplayAttributes(MethodPlugin plugin) {
-		ctrl_author.setText(plugin.getAuthors());
-		ctrl_version.setText(plugin.getVersion());
-		ctrl_briefDesc.setText(plugin.getBriefDescription());
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		if (getErrorMessage() != null) {
-			return false;
-		}
-
-		return checkedCount > 0;
-	}
-
-	protected void saveDataToModel() {
-		data.setSelectedPlugins(checkedPluginList);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		saveDataToModel();
-		PluginInfoPage page = ((ExportPluginWizard) getWizard()).page2;
-		page.onEnterPage(null);
-		return page;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/package.html b/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/package.html
deleted file mode 100644
index 8c7679d..0000000
--- a/1.5/plugins/org.eclipse.epf.export/src/org/eclipse/epf/export/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides wizards for exporting method plug-ins and configurations.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/.classpath b/1.5/plugins/org.eclipse.epf.import.xml/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/.options b/1.5/plugins/org.eclipse.epf.import.xml/.options
deleted file mode 100644
index 139d1de..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the xml import plug-in
-org.eclipse.epf.import.xml/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/.project b/1.5/plugins/org.eclipse.epf.import.xml/.project
deleted file mode 100644
index f27599a..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.import.xml</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.import.xml/META-INF/MANIFEST.MF
deleted file mode 100644
index 2a1a1c5..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.import.xml;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.importing.xml.ImportXMLPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.export.xml,
- org.eclipse.ui,
- org.eclipse.epf.import,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.importing.xml,
- org.eclipse.epf.importing.xml.preferences,
- org.eclipse.epf.importing.xml.services,
- org.eclipse.epf.importing.xml.wizards
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/build.properties b/1.5/plugins/org.eclipse.epf.import.xml/build.properties
deleted file mode 100644
index 68bcc2f..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
-               plugin.properties,\
-               plugin.xml,\
-               icons/
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/icons/etool16/imp_xml.gif b/1.5/plugins/org.eclipse.epf.import.xml/icons/etool16/imp_xml.gif
deleted file mode 100644
index e8ee74e..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/icons/etool16/imp_xml.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/icons/full/wizban/imp_xml_wizban.gif b/1.5/plugins/org.eclipse.epf.import.xml/icons/full/wizban/imp_xml_wizban.gif
deleted file mode 100644
index c5d846c..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/icons/full/wizban/imp_xml_wizban.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/plugin.properties b/1.5/plugins/org.eclipse.epf.import.xml/plugin.properties
deleted file mode 100644
index d5547fb..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Import XML Plug-in
-providerName=Eclipse.org
-
-# Import XML Wizard
-importXMLWizardName=XML
-importXMLWizardDescription=Import method library content stored in a XML file.
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/plugin.xml b/1.5/plugins/org.eclipse.epf.import.xml/plugin.xml
deleted file mode 100644
index 1445e49..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/plugin.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.importWizards">
-      <wizard
-            category="org.eclipse.epf.ui.importWizards.category"
-            class="org.eclipse.epf.importing.xml.wizards.ImportXMLWizard"
-            icon="icons/etool16/imp_xml.gif"
-            id="org.eclipse.epf.importing.xml.wizards.ImportXMLWizard"
-            name="%importXMLWizardName">
-         <description>
-               %importXMLWizardDescription
-         </description>
-      </wizard>
-   </extension>
-
-   <extension
-         point="org.eclipse.epf.ui.importWizards">
-      <wizard id="org.eclipse.epf.importing.xml.wizards.ImportXMLWizard"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/ImportXMLPlugin.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/ImportXMLPlugin.java
deleted file mode 100644
index 99d8107..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/ImportXMLPlugin.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ImportXMLPlugin extends AbstractPlugin {
-
-	//The shared instance.
-	private static ImportXMLPlugin plugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public ImportXMLPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		
-		// set this to allow parse large xml file
-		System.setProperty("entityExpansionLimit", "100000000"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ImportXMLPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/ImportXMLResources.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/ImportXMLResources.java
deleted file mode 100644
index b032c6d..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/ImportXMLResources.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Export XML message resource bundle accessor class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class ImportXMLResources extends NLS {
-
-	private static String BUNDLE_NAME = ImportXMLResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private ImportXMLResources() {
-		// Do not instantiate
-	}
-
-	public static String importXMLWizard_title;
-
-	public static String selectXMLFilePage_title;
-
-	public static String selectXMLFilePage_desc;
-
-	public static String fileLabel_text;
-
-	public static String browseButton_text;
-
-	public static String optionGroup_text;
-	
-	public static String optionGroup1_text;
-
-	public static String overwriteRadioButton_text;
-
-	public static String mergeRadioButton_text;
-
-	public static String importingXML_text;
-
-	public static String review_log_files;
-
-	public static String importXMLError_msg;
-
-	public static String importXMLError_reason;
-
-	public static String invalidXMLFile_error;
-
-	public static String importXMLService_element_not_handled;
-
-	public static String importXMLService_element_without_id;
-
-	public static String importXMLService_import_failed;
-
-	public static String importXMLService_missing_plugin;
-
-	public static String importXMLService_error_missing_plugins;
-
-	public static String library_error_no_eclass;
-
-	public static String library_no_package;
-
-	public static String library_error_create_element;
-
-	public static String library_object_string;
-
-	public static String library_error_set_attribute_2;
-
-	public static String library_error_set_attribute;
-
-	public static String library_error_set_attribute_3;
-
-	public static String library_error_set_reference;
-
-	public static String library_error_set_reference_2;
-
-	public static String versionMismatch_oldData;
-
-	public static String versionMismatch_oldData_unknown;
-
-	public static String versionMismatch_oldTool;
-	
-	public static String versionMismatch_oldTool_unknown;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ImportXMLResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/Resources.properties b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/Resources.properties
deleted file mode 100644
index 61f4e3d..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/Resources.properties
+++ /dev/null
@@ -1,59 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-#
-# Message ID Range:
-#
-
-# Import XML Wizard
-importXMLWizard_title=Import XML
-
-# Select Import XML File Wizard Page
-selectXMLFilePage_title=Specify import file
-selectXMLFilePage_desc=Specify the XML file containing the method library content to import, and select the appropriate import operation to perform.
-fileLabel_text=XML File:
-browseButton_text=Browse...
-optionGroup_text=Merge option
-optionGroup1_text=Check base plug-in option
-overwriteRadioButton_text=Override existing method library content with the imported content
-mergeRadioButton_text=Merge imported content into the existing method library
-
-# Progress Messages
-importingXML_text=Importing XML library content into the current method library...
-
-# Import XML Error Dialog
-review_log_files=The import operation has been completed. Review the log files in the \n''{0}'' folder for any errors.
-importXMLError_msg=IUPM0000E: The import operation cannot proceed.
-importXMLError_reason=IUPM0009E: The current method library is read-only.\n\nMake sure that ''{0}'' is writable or create a new method library and try again.
-
-# Error Messages
-invalidXMLFile_error=The specified XML file is not valid.
-versionMismatch_oldData=IUPM0010E: The specified XML file was exported by a previous version ({0}) of {1}. The files must be exported using the current version of {1}.
-versionMismatch_oldData_unknown=IUPM0011E: The specified XML file was exported by a previous version of {0}. The files must be exported using the current version of {0}.
-versionMismatch_oldTool=IUPM0012E: The specified XML file was exported by a newer version ({0}) of {1}. You must upgrade {1} in order to import the file.  
-versionMismatch_oldTool_unknown=IUPM0013E: The specified XML file cannot be opened. You must upgrade {0} in order to import the file.  
-
-importXMLService_element_not_handled=Element not handled: {0}
-importXMLService_element_without_id=Element without ID: {0}
-importXMLService_import_failed=Import failed: {0}
-importXMLService_missing_plugin=Missing required plug-in {0}
-importXMLService_error_missing_plugins=Missing required plug-in(s). Please check the log files for details
-
-library_error_no_eclass=Error creating ContentCategory: Unable to get EClass for {0}
-library_no_package=Unable to find owning package for object {0}
-library_error_create_element=Error creating element: {0}
-library_object_string=object {0}, feature {1}
-library_error_set_attribute_2=Error setting attribute: Invalid attribute feature value {0}
-library_error_set_attribute=Error setting attribute for object {0}, feature {1}, and value {2}
-library_error_set_attribute_3=Do not know how to set attribute for object {0}, feature {1}, and value {2}
-library_error_set_reference=Error setting reference for feature {0}: no element with id {1}
-library_error_set_reference_2=Error setting reference for object {0}, feature {1}, and value {2}
-
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/package.html b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/package.html
deleted file mode 100644
index 41a7234..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the activator for managing the Import XML plug-in's life cycle.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/preferences/ImportXMLPreferences.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/preferences/ImportXMLPreferences.java
deleted file mode 100644
index 68ae159..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/preferences/ImportXMLPreferences.java
+++ /dev/null
@@ -1,104 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml.preferences;
-
-import org.eclipse.epf.importing.xml.ImportXMLPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * The Export XML preferences.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ImportXMLPreferences {
-
-	/**
-	 * The import XML file preference key.
-	 */
-	public static final String XML_FILE = "xmlFile"; //$NON-NLS-1$
-
-	/**
-	 * The merge option preference key.
-	 */
-	public static final String MERGE_OPTION = "mergeOption"; //$NON-NLS-1$
-	
-	/**
-	 * last import check plugins option preference key
-	 */
-	public static final String CHECK_BASE_PLUGINS_OPTION = "checkBasePluginsOption"; //$NON-NLS-1$
-
-	static {
-		// Initialize the default preference values.
-		IPreferenceStore store = ImportXMLPlugin.getDefault()
-				.getPreferenceStore();
-		store.setDefault(XML_FILE, ""); //$NON-NLS-1$
-		store.setDefault(MERGE_OPTION, false); 
-		store.setDefault(CHECK_BASE_PLUGINS_OPTION, true); 	
-	}
-
-	/**
-	 * Returns the import XML file preference.
-	 * 
-	 * @return the import XML file preference
-	 */
-	public static String getXMLFile() {
-		return ImportXMLPlugin.getDefault().getPreferenceStore().getString(
-				XML_FILE);
-	}
-
-	/**
-	 * Sets the import XML file preference.
-	 * 
-	 * @param path
-	 *            the absolute path to a XML file
-	 */
-	public static void setXMLFile(String path) {
-		ImportXMLPlugin.getDefault().getPreferenceStore().setValue(XML_FILE,
-				path);
-	}
-
-	/**
-	 * Returns the merge option file preference.
-	 * 
-	 * @return the merge option file preference
-	 */
-	public static boolean getMergeOption() {
-		return ImportXMLPlugin.getDefault().getPreferenceStore().getBoolean(
-				MERGE_OPTION);
-	}
-
-	/**
-	 * Sets the merge option file preference.
-	 * 
-	 * @param mergeOption
-	 *            the user specified merge option
-	 */
-	public static void setMergeOption(boolean mergeOption) {
-		ImportXMLPlugin.getDefault().getPreferenceStore().setValue(
-				MERGE_OPTION, mergeOption);
-	}
-	
-	/**
-	 * Returns the checkBasePlugins option file preference.
-	 * 
-	 * @return the checkBasePlugins option file preference
-	 */
-	public static boolean getCheckBasePluginsOption() {
-		return ImportXMLPlugin.getDefault().getPreferenceStore().getBoolean(
-				CHECK_BASE_PLUGINS_OPTION);
-	}
-
-	/**
-	 * Sets the checkBasePlugins option file preference.
-	 * 
-	 * @param b
-	 *       the user specified checkBasePlugins option
-	 */
-	public static void setCheckBasePluginsOption(boolean b) {
-		ImportXMLPlugin.getDefault().getPreferenceStore().setValue(
-				CHECK_BASE_PLUGINS_OPTION, b);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/preferences/package.html b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/preferences/package.html
deleted file mode 100644
index 9b164fc..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the Import XML service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportResourceHandler.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportResourceHandler.java
deleted file mode 100644
index 851dd57..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportResourceHandler.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml.services;
-
-import java.io.File;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.dataexchange.util.BaseResourceHandler;
-import org.eclipse.epf.dataexchange.util.UrlInfo;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * resource handler for content in the imported library
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ImportResourceHandler extends BaseResourceHandler {
-
-		
-	/**
-	 * The constructor
-	 * @param sourceLibRoot
-	 * @param targetLibRoot
-	 */
-	public ImportResourceHandler(File sourceLibRoot, File targetLibRoot) {
-		super(sourceLibRoot, targetLibRoot);
-	}
-	
-	/**
-	 * resolve the url. put the resources into the location based on the library resource structure definition.
-	 */
-	public UrlInfo resolveFileUrl(Object owner, String srcUrl) throws Exception {
-
-		UrlInfo info = new UrlInfo();
-
-		info.sourceUrl = srcUrl;
-		info.sourceFile = new File(sourceLibRoot, srcUrl).getCanonicalFile();
-		info.targetUrl = srcUrl; 
-		info.targetFile = null;
-
-		if (info.sourceFile == null || !info.sourceFile.exists() ) {
-			return info;
-		}
-		
-		if ( owner instanceof MethodElement ) {
-			// fix the target url and 
-			info.targetUrl = fixUrl(srcUrl);
-			
-			//String elementPath = ResourceHelper.getElementResourcePath(owner);
-			String elementPath = ResourceHelper.getElementPath( (MethodElement)owner);
-			ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr((MethodElement)owner);
-			String srcPluginPath = libResMgr.getPhysicalPluginPath((MethodElement)owner);
-			File srcRoot = (new File(srcPluginPath)).getParentFile();
-			info.targetFile = new File(new File(srcRoot, elementPath), info.targetUrl);	
-		} else {
-			info.targetUrl = srcUrl; 
-			info.sourceFile = new File(sourceLibRoot, srcUrl);
-		}
-
-		return info;
-	}
-
-	private String fixUrl(String url) {
-		url = url.replace(File.separatorChar, '/');  
-		int indx = url.lastIndexOf(ResourceHelper.RESOURCE_FOLDER + "/");  //$NON-NLS-1$
-		if ( indx >=0 ) {
-			return url.substring(indx);
-		}
-		
-		// put the resource into the resources folder
-		return new File(ResourceHelper.RESOURCE_FOLDER, url)
-			.toString().replace(File.separatorChar, '/'); 
-	}
-	
-	/**
-	 * copying the resource file from the source library to the target
-	 * 
-	 * @param sourceFile the file path relative to the source root
-	 */
-	public void copyResource(String sourceFile, EObject obj, org.eclipse.epf.uma.MethodPlugin umaPlugin) {
-		ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(umaPlugin);
-		String tgtPluginPath = libResMgr.getPhysicalPluginPath(umaPlugin);
-		File tgtPluginRoot = new File(tgtPluginPath);
-		File srcPluginRoot = new File(sourceLibRoot, umaPlugin.getName());
-		
-		File src = new File(srcPluginRoot, sourceFile);
-		if ( src.exists() ) {
-			File tgt = new File(tgtPluginRoot, sourceFile);
-			FileUtil.copyFile(src, tgt);
-		}
-	}
-	
-//	/**
-//	 * the resource path will be relative to the libary root. urls needs to be fixed
-//	 * 
-//	 * @param owner the owner object in the target library
-//	 * @param srcUrl the url referenced in the source content
-//	 * @return
-//	 */
-//	private UrlInfo loadUrlInfoWithFixedPath(Object owner, String srcUrl) {
-//		UrlInfo info = new UrlInfo();
-//		info.sourceUrl = srcUrl;
-//		info.targetUrl = srcUrl;
-//		info.sourceFile = new File(sourceLibRoot, srcUrl);
-//		info.targetFile = new File(targetLibRoot, srcUrl);
-//
-//		if ( owner instanceof MethodElement)  {
-//			String backPath = ResourceHelper.getBackPath( (MethodElement)owner);
-//			info.targetUrl = backPath + srcUrl;
-//		}
-//		return info;	
-//	}
-//	
-//	/**
-//	 * the resource path will be relative to the owner element. 
-//	 * urls will not be changed but resource files is relicated.
-//	 * @param owner owner the owner object in the target library
-//	 * @param srcUrl
-//	 * @return
-//	 */
-//	private UrlInfo loadUrlInfoWithRelativePath(Object owner, String srcUrl) {
-//		UrlInfo info = new UrlInfo();
-//		info.sourceUrl = srcUrl;
-//		info.targetUrl = info.sourceUrl; // no url change
-//		info.sourceFile = new File(sourceLibRoot, srcUrl);
-//		
-//		if ( owner instanceof MethodElement)  {
-//			//String elementPath = ResourceHelper.getElementResourcePath(owner);
-//			String elementPath = ResourceHelper.getElementResourcePath((MethodElement)owner);
-//			info.targetFile = new File(new File(targetLibRoot, elementPath), srcUrl);			
-//		}
-//
-//		return info;
-//	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportXMLService.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportXMLService.java
deleted file mode 100644
index a23c42a..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportXMLService.java
+++ /dev/null
@@ -1,874 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml.services;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.dataexchange.util.ContentProcessor;
-import org.eclipse.epf.dataexchange.util.IResourceHandler;
-import org.eclipse.epf.export.services.DiagramHandler;
-import org.eclipse.epf.export.xml.ExportXMLResources;
-import org.eclipse.epf.export.xml.services.FeatureManager;
-import org.eclipse.epf.export.xml.services.XMLLibrary;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ConfigurationImportService;
-import org.eclipse.epf.importing.services.FileModifyChecker;
-import org.eclipse.epf.importing.services.LibraryImportManager;
-import org.eclipse.epf.importing.wizards.PluginModifyInfo;
-import org.eclipse.epf.importing.wizards.SelectImportConfigurationSource;
-import org.eclipse.epf.importing.xml.ImportXMLPlugin;
-import org.eclipse.epf.importing.xml.ImportXMLResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.migration.IMigrator;
-import org.eclipse.epf.persistence.migration.MappingUtil;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.xml.uma.Activity;
-import org.eclipse.epf.xml.uma.CapabilityPattern;
-import org.eclipse.epf.xml.uma.ContentCategory;
-import org.eclipse.epf.xml.uma.ContentCategoryPackage;
-import org.eclipse.epf.xml.uma.ContentPackage;
-import org.eclipse.epf.xml.uma.DeliveryProcess;
-import org.eclipse.epf.xml.uma.Discipline;
-import org.eclipse.epf.xml.uma.Domain;
-import org.eclipse.epf.xml.uma.Guidance;
-import org.eclipse.epf.xml.uma.MethodElement;
-import org.eclipse.epf.xml.uma.MethodElementProperty;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.ProcessComponent;
-import org.eclipse.epf.xml.uma.ProcessPackage;
-import org.eclipse.epf.xml.uma.TaskDescriptor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkOrder;
-import org.eclipse.epf.xml.uma.WorkOrderType;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Xml import service class to process the importing task
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ImportXMLService {
-
-	private List unlockedPlugins; 
-	
-	private boolean error = false;
-	
-	private Map renameElementMap = new HashMap();
-	
-	private boolean overwrite = false;
-	
-	private IStatus fileCheckedOutStatus = null;
-	
-	private String xmlPath;
-
-	private XMLLibrary xmlLib;
-
-	private UmaLibrary umaLib;
-
-	private ImportXMLogger logger = new ImportXMLogger();
-
-	private List discardedElements = new ArrayList();
-
-	private DiagramHandler diagramHandler;
-	
-	//tds with steps
-	private Map<String, TaskDescriptor> tdMap;
-	
-	// map xml WorkOrder to uma WorkOrder
-	Map workOrderMap = new HashMap();
-	
-	private IMigrator migrator;
-	
-	private boolean checkBasePlugins = true;
-
-	/**
-	 * The constructor
-	 */
-	public ImportXMLService() {
-
-	}
-
-	/**
-	 * Loads the xml file.
-	 * @param xmlPath
-	 * @return true if succeeds.
-	 */
-	public boolean loadXml(final String xmlPath) {
-		String versionError = versionCheck(xmlPath,	ImportXMLResources.importXMLWizard_title);		
-		if (versionError != null) {
-			return false;
-		}
-				
-		this.xmlPath = xmlPath;
-
-		logger.logMessage("Loading xml library ..."); //$NON-NLS-1$
-		
-		boolean ret = false;
-		try {
-			this.xmlLib = new XMLLibrary(null, logger, xmlPath);
-			this.xmlLib.load();
-			ret = checkOldPlugins();
-		} catch (Exception e) {
-			logger.logError(NLS.bind(
-					ExportXMLResources.xmlLibrary_error_load_xml, xmlPath), e);
-			final String errStr = e.toString();
-			SafeUpdateController.syncExec(new Runnable() {	
-				public void run() {	
-					ImportXMLPlugin.getDefault().getMsgDialog().displayError(
-						NLS.bind(ExportXMLResources.xmlLibrary_error_load_xml, xmlPath), errStr);
-				}
-			});
-		}
-		
-		return ret;
-	}
-	
-	private boolean checkOldPlugins() {
-		
-		unlockedPlugins = new ArrayList();
-		List fileNameToCheck = new ArrayList();
-		Map map = new HashMap();
-		Map guidMap = new HashMap();
-		List basePlugins = LibraryService.getInstance().getCurrentMethodLibrary()
-											.getMethodPlugins();
-		for (int i = 0; i < basePlugins.size(); i++) {
-			org.eclipse.epf.uma.MethodPlugin plugin = (org.eclipse.epf.uma.MethodPlugin) basePlugins.get(i);
-			map.put(plugin.getName(), plugin);
-			guidMap.put(plugin.getGuid(), plugin);
-		}
-		
-		List plugins = ((MethodLibrary) xmlLib.getRoot()).getMethodPlugin();
-		List guids = new ArrayList();
-		for (int i=0; i<plugins.size(); i++) {
-			MethodElement elem = (MethodElement) plugins.get(i);
-			guids.add(elem.getId());
-			
-			org.eclipse.epf.uma.MethodPlugin basePlugin = 
-				(org.eclipse.epf.uma.MethodPlugin) map.get(elem.getName());
-			boolean toAdd = false;
-			if (basePlugin != null && ! basePlugin.getGuid().equals(elem.getId())
-					&& ! basePlugin.getUserChangeable()) {
-				toAdd = true;
-			} else {
-				basePlugin = 
-					(org.eclipse.epf.uma.MethodPlugin) guidMap.get(elem.getId());
-				if (basePlugin != null /*&& ! basePlugin.getName().equals(elem.getName())*/
-						&& ! basePlugin.getUserChangeable()) {
-					toAdd = true;
-				} 
-			}
-			if (toAdd) {
-				unlockedPlugins.add(basePlugin.getGuid());
-				basePlugin.setUserChangeable(new Boolean(true));
-				Resource res = basePlugin.eResource();
-				if (res != null && res.getURI() != null) {
-					String fileName = res.getURI().toFileString();
-					fileNameToCheck.add(fileName);
-				}
-			}
-		}
-		if (fileNameToCheck.size() > 0) {
-			final List modifiedFiles = fileNameToCheck;	
-			SafeUpdateController.syncExec(new Runnable() {
-				public void run() {
-					fileCheckedOutStatus = FileModifyChecker.checkModify(modifiedFiles);
-				}
-			});
-		}
-		
-		if (! unlockedPlugins.isEmpty() && (fileCheckedOutStatus != null)
-				&& !fileCheckedOutStatus.isOK()) {
-			// log error
-			SafeUpdateController.syncExec(new Runnable() {
-				public void run() {
-					String title = ImportXMLResources.importXMLWizard_title; 
-					String msg = ImportXMLResources.importXMLService_import_failed; 
-					new MsgDialog(ImportPlugin.getDefault())
-						.displayError(title, msg, fileCheckedOutStatus);
-					}
-			});
-			return false;
-		}
-		
-		final PluginModifyInfo modifyInfo = SelectImportConfigurationSource
-										.checkModify(guids, MsgBox.getDefaultShell(), false);		
-
-		// allow user to proceed with locked plugins
-		if ( modifyInfo.lockedPlugins.size() > 0 ) {
-			final boolean ret[] = new boolean[1];
-			SafeUpdateController.syncExec(new Runnable() {
-				public void run() {
-					String WIZARD_TITLE = ImportXMLResources.importXMLWizard_title; 
-					String message = modifyInfo.getLockedMessage().toString() +
-						ImportResources.ImportPluginWizard_confirm_continue; 
-					ret[0] = ImportXMLPlugin
-							.getDefault().getMsgDialog().displayConfirmation(WIZARD_TITLE, message);
-				}
-			});		
-			return ret[0];
-		} 			
-		return true;
-	}
-	
-	/**
-	 * @return the log file.
-	 */
-	public File getLogPath() {
-		return logger.getLogPath();
-	}
-
-	/**
-	 * Dispose
-	 */
-	public void dispose() {
-
-		discardedElements.clear();
-		workOrderMap.clear();
-		logger.dispose();
-	}
-
-	/**
-	 * Does XML export.
-	 * @param monitor
-	 * @throws Exception
-	 */
-	public void doImport(IProgressMonitor monitor) throws Exception {
-		boolean refresh = RefreshJob.getInstance().isEnabled();
-		try {
-			if (refresh) {
-				// disable resource refreshing during import
-				//
-				RefreshJob.getInstance().setEnabled(false);
-			}
-			
-			handleTypeChanges();
-			
-			IResourceHandler handler = new ImportResourceHandler(new File(
-					xmlPath).getParentFile(), new File(LibraryService
-					.getInstance().getCurrentMethodLibraryLocation()));
-
-			ContentProcessor contentProc = new ContentProcessor(handler,
-					this.logger);
-			
-			diagramHandler = new DiagramHandler(new File(
-					xmlPath).getParentFile(), new File(LibraryService
-							.getInstance().getCurrentMethodLibraryLocation())) {				
-				//[0]: sourceFile
-				//[1]: targetFile
-				protected File[] getFiles(org.eclipse.epf.uma.MethodElement elem) {
-					File[] files = super.getFiles(elem, false);
-										
-					EDataObject xmlObj = xmlLib.getElement(elem.getGuid());
-					if (xmlObj instanceof org.eclipse.epf.xml.uma.Process) {
-						org.eclipse.epf.xml.uma.Process proc = 
-								(org.eclipse.epf.xml.uma.Process) xmlObj;
-						String uri = proc.getDiagramURI();
-						if (uri != null && uri.length() > 0) {
-							File file = new File(getSourceLibRoot(), uri);
-							//System.out.println("LD: file: " + file);
-							if (file.exists()) {
-								files[0] = file;
-								files[1] = new File(getTargetLibRoot(), uri);
-							} else {
-								//System.out.println("LD: files[0]: " + files[0]);
-							}
-						}					
-					}
-					
-					return files;
-				}
-				
-			};
-
-			this.xmlLib.fixLibraryForImport();
-
-			// make sure all the dependent plugins are there
-			List referencedPlugins = xmlLib.getReferencedPlugins();
-			if (referencedPlugins.size() > 0) {
-				org.eclipse.epf.uma.MethodLibrary library = org.eclipse.epf.library.LibraryService
-						.getInstance().getCurrentMethodLibrary();
-				if (library != null) {
-					List plugins = library.getMethodPlugins();
-					for (Iterator it = plugins.iterator(); it.hasNext();) {
-						String id = ((org.eclipse.epf.uma.MethodPlugin) it
-								.next()).getGuid();
-						referencedPlugins.remove(id);
-					}
-				}
-			}
-
-			if (isCheckBasePlugins() && referencedPlugins.size() > 0) {
-				 Map<String, String> map = xmlLib.getGuidToPlugNameMap();
-				for (Iterator it = referencedPlugins.iterator(); it.hasNext();) {
-					String nameAndId = "";		//$NON-NLS-1$
-					String id = (String) it.next();
-					if (map != null) {
-						String name = map.get(id);
-						if (name != null) {
-							nameAndId += name + ", ";//$NON-NLS-1$
-						}
-					}
-					nameAndId += id;
-					logger.logError(NLS.bind(ImportXMLResources.importXMLService_missing_plugin, nameAndId),
-							null);			
-				}
-
-				throw new Exception(
-						ImportXMLResources.importXMLService_error_missing_plugins);
-			}
-
-			this.umaLib = new UmaLibrary(renameElementMap, contentProc, logger, overwrite);
-
-			EDataObject xmlRoot = this.xmlLib.getRoot();
-			EDataObject umaRoot = this.umaLib.getRoot();
-			
-			logger.logMessage("create target library elements ..."); //$NON-NLS-1$
-			creatEDataObjectTree(xmlRoot, umaRoot);
-
-			logger
-					.logMessage("copying all feature values for target library elements ..."); //$NON-NLS-1$
-			iteratEDataObject((MethodElement) xmlRoot);
-
-			logger.logMessage("fix the target library ..."); //$NON-NLS-1$
-			umaLib.fixLibrary();
-			umaLib.fixTaskDescriptors(tdMap);
-
-			LibraryImportManager.handleNameReplace(renameElementMap);
-			
-			diagramHandler.postRegisterElements();
-			
-			// delete the un-needed elements
-			logger.logMessage("delete unneeded elements ..."); //$NON-NLS-1$
-			umaLib.deleteElements();
-			
-			final List modifiedFiles = FileModifyChecker.getModifiedFiles(LibraryService.getInstance().
-										getCurrentMethodLibrary().eResource().getResourceSet());
-			modifiedFiles.addAll(diagramHandler.getModifiedFiles());
-			final IStatus fileCheckedOutStatus = FileModifyChecker.syncExecCheckModify(modifiedFiles);
-			
-			if (fileCheckedOutStatus.isOK()) {
-			
-				logger.logMessage("saving target library ..."); //$NON-NLS-1$
-	
-				List configs = LibraryService.getInstance()
-				.getCurrentMethodLibrary().getPredefinedConfigurations();
-				int configSz = configs == null ? 0 : configs.size();
-				for (int i=0; i<configSz; i++) {
-					org.eclipse.epf.uma.MethodConfiguration config = 
-						(org.eclipse.epf.uma.MethodConfiguration ) configs.get(i);
-					LibraryUtil.validateMethodConfiguration(null, config);
-				}
-				
-				if (configSz != 0) {
-					org.eclipse.epf.uma.MethodLibrary currLib = LibraryService.getInstance().getCurrentMethodLibrary();
-					ILibraryPersister persister = ((MultiFileResourceSetImpl) currLib.eResource().getResourceSet()).getPersister();
-					if (persister instanceof IFileBasedLibraryPersister) {
-						IFileBasedLibraryPersister ip = (IFileBasedLibraryPersister) persister;
-						File configFolder = ip.getDefaultMethodConfigurationFolder(currLib);
-						if (configFolder != null) {
-							ip.setDefaultMethodConfigurationFolder(currLib, configFolder);
-						} else {
-							throw new Exception(
-									ImportXMLResources.importXMLService_import_failed);
-						}
-					}
-				}
-				
-				// don't refresh the workspace
-				if (unlockedPlugins != null && ! unlockedPlugins.isEmpty()) {
-					LibraryImportManager.lockUnlockedPlugins(unlockedPlugins);
-				}
-				LibraryUtil.saveLibrary(LibraryService.getInstance()
-						.getCurrentMethodLibrary(), false, false);
-				diagramHandler.execute();				
-	
-				logger.logMessage("re-open target library ..."); //$NON-NLS-1$
-				LibraryService.getInstance().reopenCurrentMethodLibrary();
-				if (migrator != null) {
-					org.eclipse.epf.uma.MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-					migrator.migrateXmlImportedLib(lib, monitor);					
-					LibraryService.getInstance().reopenCurrentMethodLibrary();
-				}
-					
-				logger.logMessage("import completed successfully ..."); //$NON-NLS-1$
-			} else {
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						String title = ImportXMLResources.importXMLWizard_title; 
-						String msg = ImportXMLResources.importXMLService_import_failed; 
-						new MsgDialog(ImportXMLPlugin.getDefault())
-							.displayError(title, msg, fileCheckedOutStatus);
-						}
-				});
-			}	
-						
-			//ResourceUtil.refreshResources(LibraryService.getInstance()
-			//		.getCurrentMethodLibrary(), monitor);
-
-		} catch (Exception e) {
-			logger.logError(NLS.bind(ImportXMLResources.importXMLService_import_failed, e.getMessage()), e);
-
-			throw e;
-
-		} finally {
-			if (refresh) {
-				// re-enable resource refreshing
-				//
-				RefreshJob.getInstance().setEnabled(true);
-			}
-		}
-	}
-
-	private void creatEDataObjectTree(EDataObject xmlObj, EDataObject umaObj) {
-
-		for (Iterator it = xmlObj.eContents().iterator(); it.hasNext();) {
-			EDataObject child = (EDataObject) it.next();
-			createRmcObject(child, umaObj);
-		}
-	}
-
-	private void createRmcObject(EDataObject xmlElement,
-			EDataObject targetContainer) {
-		if (xmlElement instanceof MethodElementProperty) {
-			return;
-		}
-		// get the targetContainer's containing feature
-		EStructuralFeature feature = xmlElement.eContainmentFeature();
-		createRmcObject(xmlElement, targetContainer, feature.getName());
-	}
-
-	private void createRmcObject(EDataObject xmlElement,
-			EDataObject targetContainer, String containmentXmlFeature) {
-
-		try {
-			if (xmlElement == null) {
-				return;
-			}
-
-			EDataObject umaElement = null;
-
-			// don't create content category package since in uma, it's
-			// seperated based on type
-			if (xmlElement instanceof MethodPlugin) {
-				MethodPlugin plugin = (MethodPlugin) xmlElement;
-				umaElement = umaLib.createMethodPlugin(plugin.getId(), plugin
-						.getName());
-			} else if (xmlElement instanceof ContentCategoryPackage) {
-				// don't create, do nothing
-				// mark as discarded so we don't need to copy it's attributes
-				setDiscarded(((ContentCategoryPackage) xmlElement).getId());
-
-			} else if ((xmlElement instanceof ContentCategory)
-					&& !(xmlElement.eContainer() instanceof Domain 
-							|| xmlElement.eContainer() instanceof Discipline)
-					|| (xmlElement.eContainer() instanceof ContentCategoryPackage)) {
-				// create the content categories for root content categories,
-				// not for sub-domain and sub-discipline
-				// 154143 - import xml did not reserve the sub-discipline structure
-				String pluginId = getPlugin(xmlElement).getId();
-				umaElement = umaLib.createContentCategory(pluginId, xmlElement
-						.eClass().getName(), xmlElement.getType().getName(),
-						xmlLib.getElementId(xmlElement));
-			} else {
-
-				// if this is root level package, find the corresponding
-				// container for the UMA object
-				if (xmlElement instanceof MethodPackage
-						&& xmlElement.eContainer() instanceof MethodPlugin) {
-					if (xmlElement instanceof ContentPackage) {
-						targetContainer = umaLib
-								.getContentRootPackage(targetContainer);
-					} else if (xmlElement instanceof ProcessComponent) {
-						Object proc = ((ProcessComponent) xmlElement)
-								.getProcess();
-						if (proc instanceof CapabilityPattern) {
-							targetContainer = umaLib
-									.getCapabilityPatternRootPackage(targetContainer);
-						} else if (proc instanceof DeliveryProcess) {
-							targetContainer = umaLib
-									.getDeliveryProcessRootPackage(targetContainer);
-						}
-					} else if (xmlElement instanceof ProcessPackage) {
-						List procs = xmlLib
-								.getAllProcesses((MethodPackage) xmlElement);
-						if (procs != null && procs.size() > 0) {
-							Object proc = procs.get(0);
-							if (proc instanceof CapabilityPattern) {
-								targetContainer = umaLib
-										.getCapabilityPatternRootPackage(targetContainer);
-							} else if (proc instanceof DeliveryProcess) {
-								targetContainer = umaLib
-										.getDeliveryProcessRootPackage(targetContainer);
-							}
-						}
-					}
-				}
-				
-				if (targetContainer instanceof org.eclipse.epf.uma.TaskDescriptor &&
-					containmentXmlFeature.equals("step")) {	//$NON-NLS-1$
-					return;
-				}
-				
-				// get the containment feature so we can create the object of
-				// the same type
-				umaElement = umaLib.createElement(targetContainer,
-						containmentXmlFeature, xmlElement.eClass().getName(),
-						xmlElement.getType().getName(), xmlLib
-								.getElementId(xmlElement));
-				
-				if (xmlElement instanceof TaskDescriptor) {
-					TaskDescriptor td = (TaskDescriptor) xmlElement;
-					if (td.getTask() != null) {
-						List steps = td.getStep();
-						if (steps != null && !steps.isEmpty()) {
-							if (tdMap == null) {
-								tdMap = new HashMap<String, TaskDescriptor>();
-							}
-							tdMap.put(td.getId(), td);
-						}
-					}
-				}
-
-				// xml WorkOrder does not have an id, need to map the uma Object
-				if (xmlElement instanceof WorkOrder) {
-					workOrderMap.put(xmlElement, umaElement);
-				}
-			}
-
-			// recursive,
-			// note, uma element might be null since we can't determine the
-			// owner of the element yet
-			creatEDataObjectTree(xmlElement, umaElement);
-
-		} catch (Exception e) {
-			// log the error and continue???
-			e.printStackTrace();
-		}
-	}
-
-	private MethodPlugin getPlugin(EObject element) {
-		while ((element != null) && !(element instanceof MethodPlugin)) {
-			element = element.eContainer();
-		}
-
-		return (MethodPlugin) element;
-	}
-
-	private EDataObject getRmcObject(MethodElement xmlObj) {
-		if (xmlObj instanceof MethodLibrary) {
-			return umaLib.getRoot();
-		} else {
-			String id = xmlObj.getId();
-			return this.umaLib.getElement(id);
-		}
-	}
-
-	private void iteratEDataObject(MethodElement srcObj) {
-		iteratEDataObject_(srcObj);
-		EDataObject targetObj = getRmcObject(srcObj);
-		if (targetObj instanceof org.eclipse.epf.uma.MethodElement) {
-			diagramHandler.registerElement((org.eclipse.epf.uma.MethodElement) targetObj); 
-		}
-	}
-	
-	private void iteratEDataObject_(MethodElement srcObj) {
-
-		logger
-				.logMessage(" === processing element " + srcObj.getType().getName() + ": " + srcObj.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-
-		if (isProcessed(srcObj.getId())) {
-			return;
-		}
-		setProcessed(srcObj.getId());
-
-		// if object is not created, it's xml wrapper package
-		if (srcObj instanceof ContentCategoryPackage) {
-
-			// iterate the child packages
-			for (Iterator it = ((ContentCategoryPackage) srcObj)
-					.getContentCategory().iterator(); it.hasNext();) {
-				iteratEDataObject((MethodElement) it.next());
-			}
-			return;
-		}
-
-		EDataObject targetObj = getRmcObject(srcObj);
-		EClass eClass = srcObj.eClass();
-
-		EList features = eClass.getEAllStructuralFeatures();
-		boolean isNewElement = umaLib.isNewElement(srcObj.getId()) || srcObj instanceof MethodLibrary;
-		boolean isOldPlugin = !isNewElement && (srcObj instanceof MethodPlugin);
-		
-		for (Iterator it = features.iterator(); it.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) it.next();
-						
-			if (FeatureManager.INSTANCE.isUnneededXmlFeature(feature.getName())) {
-				continue;
-			}
-			if (isOldPlugin && UmaPackage.eINSTANCE.getMethodPlugin_UserChangeable() == feature) {
-				continue;
-			}
-
-			Object value = srcObj.eGet(feature);
-			if (value == null) {
-				continue;
-			}
-
-			try {
-				boolean isMep = feature.getName().equals("methodElementProperty"); //$NON-NLS-1$	
-				if (value instanceof List && ! isMep) {
-					for (Iterator itv = ((List) value).iterator(); itv
-							.hasNext();) {
-						Object src_value = itv.next();
-
-						if (src_value instanceof String) {
-
-							// it's an id reference
-							umaLib.setReferenceValue(targetObj, feature
-									.getName(), (String) src_value);
-						} else if (src_value instanceof MethodElement) {
-							// set the reference
-							MethodElement e = (MethodElement) src_value;
-							String guid = e.getId();
-
-							// don't set the containment feature value since
-							// it's already handled
-							// when creating the library structure
-							if (!isDiscarded(guid) && e.eContainer() != srcObj) {
-								umaLib.setReferenceValue(targetObj, feature
-										.getName(), guid);
-							}
-
-							iteratEDataObject((MethodElement) src_value);
-						} else if (src_value instanceof WorkOrder) {
-							// WorkOrder is not method element and does not have
-							// an id, need special handling
-							// set the prede
-							WorkOrder wr = (WorkOrder) src_value;
-							Object umaWr = workOrderMap.get(wr);
-							umaLib.setWorkOrder(umaWr, wr.getValue());
-						} else {
-							logger
-									.logMessage(NLS.bind(ImportXMLResources.importXMLService_element_not_handled, src_value));
-						}
-					}
-				} else if (feature instanceof EReference && ! isMep) {
-
-					// get the xml object and iterate again
-					Object src_value = value;
-
-					if (src_value instanceof WorkOrder) {
-						logger.logMessage("workorder value"); //$NON-NLS-1$
-					} else if (src_value instanceof String
-							&& !isDiscarded((String) src_value)) {
-						// it's an id reference
-						umaLib.setReferenceValue(targetObj, feature.getName(),
-								(String) src_value);
-					} else if (src_value instanceof MethodElement) {
-						// set the reference
-						String guid = ((MethodElement) src_value).getId();
-						if (guid == null) {
-							logger
-									.logWarning(NLS.bind(ImportXMLResources.importXMLService_element_without_id, ((MethodElement) src_value)
-									.getName()));
-						}
-						if (!isDiscarded(guid)) {
-							umaLib.setReferenceValue(targetObj, feature
-									.getName(), guid);
-						}
-						iteratEDataObject((MethodElement) src_value);
-					} else {
-						logger
-								.logWarning(NLS.bind(ImportXMLResources.importXMLService_element_not_handled, src_value));
-					}
-
-				} else {
-					if (targetObj instanceof ContentCategoryPackage) {
-						logger.logMessage("hrre"); //$NON-NLS-1$
-					}
-
-					if (value instanceof WorkOrderType) {
-						value = ((WorkOrderType) value).getName();
-					}
-					
-					boolean rename = false;
-					if (!isNewElement && feature == org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getNamedElement_Name()) {
-						String oldName = (String)targetObj.eGet(org.eclipse.epf.uma.UmaPackage.eINSTANCE.getNamedElement_Name());
-						String newName = (String)srcObj.eGet(feature);				
-						if (!newName.equals(oldName)) {
-							LibraryImportManager.ensureUniqueNameForExistingElement
-								((org.eclipse.epf.uma.MethodElement) targetObj, oldName, newName, renameElementMap);
-							rename = true;
-						}
-					}
-					if (!rename) {
-						umaLib.setAtributeFeatureValue(targetObj,
-								feature.getName(), value);
-					}
-					if (isNewElement && feature == org.eclipse.epf.xml.uma.UmaPackage.eINSTANCE.getNamedElement_Name()) {
-						org.eclipse.epf.uma.MethodElement elem = (org.eclipse.epf.uma.MethodElement) targetObj;
-						EObject ceobj = elem.eContainer();						
-						if (ceobj instanceof org.eclipse.epf.uma.MethodElement && 
-								! umaLib.isNewElement(((org.eclipse.epf.uma.MethodElement) ceobj).getGuid())) {
-							LibraryImportManager.ensureUniqueName(ceobj, elem, renameElementMap);
-						}
-					}
-
-				}
-			} catch (Exception e) {
-				// log the error and continue???
-				e.printStackTrace();
-			}
-
-		}
-
-	}
-
-	// goid of processed element
-	private List processedElements = new ArrayList();
-
-	private boolean isProcessed(String guid) {
-		return processedElements.contains(guid);
-	}
-
-	private void setProcessed(String guid) {
-		if (!processedElements.contains(guid)) {
-			processedElements.add(guid);
-		}
-	}
-
-	private boolean isDiscarded(String id) {
-		return discardedElements.contains(id);
-	}
-
-	private void setDiscarded(String id) {
-		discardedElements.add(id);
-	}
-	
-	/**
-	 * Sets overwrite attribute.
-	 * @param b
-	 */
-	public void setOverwrite(boolean b) {
-		overwrite = b;
-	}	
-	
-	private String versionCheck(final String xmlPath, final String title) {
-		final String[] ret = new String[1];
-		ret[0] = null;
-		SafeUpdateController.syncExec(new Runnable() {	
-			public void run() {				
-				VersionUtil.VersionCheckInfo info = VersionUtil.checkXMLVersion(new File(xmlPath));
-				if (info == null) {
-					ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldData_unknown, new Object[] {
-							Platform.getProduct().getName()});					
-				} else {
-					if (info.result < 0) {
-						try {
-							migrator = MappingUtil.getMigratorByLibPath(xmlPath);
-						} catch (Exception e) {
-							ret[0] = e.toString();
-						}
-						if (migrator == null && ret[0] == null) {
-							if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
-								ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldData, new Object[] {
-										info.toolVersion, Platform.getProduct().getName()});
-							} else {
-								ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldData_unknown, new Object[] {
-										Platform.getProduct().getName()});					
-							}
-						}
-					} else if (info.result > 0) {
-						if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
-							ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldTool, new Object[] {
-								info.toolVersion, Platform.getProduct().getName()});
-						} else {
-							ret[0] = NLS.bind(ImportXMLResources.versionMismatch_oldTool_unknown, new Object[] {
-									Platform.getProduct().getName()});
-						}
-					} 
-				}
-				if (ret[0] != null) {
-					ImportXMLPlugin.getDefault().getMsgDialog().displayError(title, ret[0]);					
-				}
-			}
-		});		
-		return ret[0];
-	}
-	
-	 public void handleTypeChanges() {
-		org.eclipse.epf.uma.MethodLibrary baseLib = LibraryService.getInstance()
-												.getCurrentMethodLibrary();
-		HashMap baseMap = new HashMap();
-		ConfigurationImportService.collectPotentialTypeChanged(baseLib, baseMap);
-		
-		HashMap eClassObjMap = new HashMap();
-		HashMap importMap = new HashMap();
-		for (Iterator it = xmlLib.getRoot().eAllContents(); it.hasNext();) {
-			Object obj = it.next();
-			if (obj instanceof Guidance ||
-				obj instanceof Activity) {
-				MethodElement xmlElement = (MethodElement) obj;
-				String eClassName = xmlElement.eClass().getName();
-				Object eClassObj = eClassObjMap.get(eClassName);
-				if (eClassObj == null) {
-					EClass objEClass = FeatureManager.INSTANCE.getRmcEClass(eClassName);
-					if (objEClass != null) {
-						eClassObj = UmaFactory.eINSTANCE.create(objEClass);
-						eClassObjMap.put(eClassName, eClassObj);	
-					}
-				}
-				if (eClassObj != null) {
-					importMap.put(xmlElement.getId(), eClassObj);
-				}
-			}
-		}
-		
-		ConfigurationImportService.handleTypeChanges(baseMap, importMap);	
-	}
-	 
-	private boolean isCheckBasePlugins() {
-		return checkBasePlugins;
-	}
-
-	public void setCheckBasePlugins(boolean checkBasePlugins) {
-		this.checkBasePlugins = checkBasePlugins;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportXMLogger.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportXMLogger.java
deleted file mode 100644
index 962d0f2..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/ImportXMLogger.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml.services;
-
-import java.io.File;
-
-import org.eclipse.epf.dataexchange.util.FileLogger;
-import org.eclipse.epf.library.LibraryService;
-
-/**
- * Logger class for xml import
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ImportXMLogger extends FileLogger {
-
-	public static final String LOGS_FOLDER = "logs/import/xml"; //$NON-NLS-1$
-
-	/**
-	 * The constructor
-	 */
-	public ImportXMLogger() {
-		super(new File(LibraryService.getInstance()
-				.getCurrentMethodLibraryLocation(), LOGS_FOLDER));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/UmaLibrary.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/UmaLibrary.java
deleted file mode 100644
index 881ded8..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/UmaLibrary.java
+++ /dev/null
@@ -1,1088 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml.services;
-
-import java.io.File;
-import java.text.ParsePosition;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.dataexchange.importing.LibraryService;
-import org.eclipse.epf.dataexchange.util.ContentProcessor;
-import org.eclipse.epf.dataexchange.util.ILogger;
-import org.eclipse.epf.export.xml.services.FeatureManager;
-import org.eclipse.epf.importing.xml.ImportXMLPlugin;
-import org.eclipse.epf.importing.xml.ImportXMLResources;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.epf.xml.uma.TaskDescriptor;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.text.SimpleDateFormat;
-
-/**
- * UmaLibrary represents a method library and provide methods to create elements
- * and set attributes and feature values
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class UmaLibrary {
-
-	private boolean debug = ImportXMLPlugin.getDefault().isDebugging();
-
-	private boolean overwrite = false;	
-	
-	private ILogger logger;
-
-	private ContentProcessor contentProc = null;
-	
-	private Map newElementsMap = new HashMap();
-	
-	private Map renameElementMap;
-
-	// map of created elements, guid - EDataObject
-	Map elementsMap = new HashMap();
-
-	// keep the source element ids so we can determine the elements that are not in the xml source library
-	// this is needed for deleting un-needed elements
-	// 154149 - allow package level merging for xml import
-	HashSet sourceElementIDs = new HashSet();
-	
-	/**
-	 * The constructor.
-	 * @param contentProc
-	 * @param logger
-	 * @param overwrite
-	 */
-	public UmaLibrary(Map renameElementMap, ContentProcessor contentProc, ILogger logger, boolean overwrite) {
-		this.renameElementMap = renameElementMap;
-		this.logger = logger;
-		this.contentProc = contentProc;
-		this.overwrite = overwrite;
-
-		buildElementsMap();
-	}
-
-	/**
-	 * @return the current library as the root object.
-	 */
-	public MethodLibrary getRoot() {
-		return org.eclipse.epf.library.LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-	}
-
-	private void buildElementsMap() {
-		// build the elements map for easy operation
-
-		elementsMap.clear();
-		elementsMap.put(getRoot().getGuid(), getRoot());
-		TreeIterator it = getRoot().eAllContents();
-		while (it.hasNext()) {
-			Object e = it.next();
-			if (e instanceof MethodElement) {
-				elementsMap.put(((MethodElement) e).getGuid(), e);
-			}
-		}
-	}
-
-	/**
-	 * Creates a content catergory.
-	 * @param pluginId
-	 * @param xmlEClassName
-	 * @param xmlElementType
-	 * @param id
-	 * @return
-	 */
-	public EDataObject createContentCategory(String pluginId,
-			String xmlEClassName, String xmlElementType, String id) {
-
-		setSourceId(id);
-		
-		// make sure the same object created only once
-		EDataObject obj = getElement(id);
-		if (obj != null) {
-			return obj;
-		}
-
-		MethodPlugin plugin = (MethodPlugin) getElement(pluginId);
-
-		EClass objClass = FeatureManager.INSTANCE.getRmcEClass(xmlEClassName);
-		if (objClass == null) {
-			logger.logWarning(NLS.bind(ImportXMLResources.library_error_no_eclass, xmlEClassName));
-			return null;
-		}
-
-		obj = (EDataObject) EcoreUtil.create(objClass);
-		setElement(id, obj);
-
-		ContentPackage rootPkg = (ContentPackage) getRootPackage(plugin, obj);
-		rootPkg.getContentElements().add(obj);
-		return obj;
-	}
-
-	/**
-	 * Gets the root package
-	 * @param plugin
-	 * @param obj
-	 * @return
-	 */
-	public MethodPackage getRootPackage(MethodPlugin plugin, Object obj) {
-
-		String[] path = null;
-		if (obj instanceof CustomCategory) {
-			path = ModelStructure.DEFAULT.customCategoryPath;
-		} else if (obj instanceof Discipline
-				|| obj instanceof DisciplineGrouping) {
-			path = ModelStructure.DEFAULT.disciplineDefinitionPath;
-		} else if (obj instanceof Domain) {
-			path = ModelStructure.DEFAULT.domainPath;
-		} else if (obj instanceof RoleSet || obj instanceof RoleSetGrouping) {
-			path = ModelStructure.DEFAULT.roleSetPath;
-		} else if (obj instanceof Tool) {
-			path = ModelStructure.DEFAULT.toolPath;
-		} else if (obj instanceof WorkProductType) {
-			path = ModelStructure.DEFAULT.workProductTypePath;
-		}
-
-		if (path != null) {
-			return UmaUtil.findMethodPackage(plugin, path);
-		} else {
-			logger.logWarning(NLS.bind(ImportXMLResources.library_no_package, obj)); 
-		}
-
-		return null;
-	}
-
-	/**
-	 * Creates a method plugin.
-	 * @param id
-	 * @param name
-	 * @return
-	 * @throws Exception
-	 */
-	public EDataObject createMethodPlugin(String id, String name)
-			throws Exception {
-		
-		// make sure the same object created only once
-		EDataObject obj = getElement(id);
-		boolean isOld = obj != null;
-		if (obj == null) {
-			Map options = new HashMap();
-			options.put("renameElementMap", renameElementMap);
-			obj = LibraryService.INSTANCE.createPlugin(name, id, options);
-
-			setElement(id, obj);
-		}
-
-		// make sure the system packages are included
-		setSourceId(id);
-		List pkgs = TngUtil.getAllSystemPackages((MethodPlugin)obj);
-		for (Iterator it = pkgs.iterator(); it.hasNext(); ) {
-			MethodPackage pkg = (MethodPackage)it.next();
-			setSourceId(pkg.getGuid());
-			if (!isOld) {
-				newElementsMap.put(pkg.getGuid(), pkg);
-			}
-		}
-		
-		return obj;
-	}
-
-	/**
-	 * Gets content's root package.
-	 * @param plugin
-	 * @return
-	 */
-	public EDataObject getContentRootPackage(EDataObject plugin) {
-		if (!(plugin instanceof MethodPlugin)) {
-			return null;
-		}
-		return UmaUtil.findMethodPackage((MethodPlugin) plugin,
-				ModelStructure.DEFAULT.coreContentPath);
-	}
-
-	/**
-	 * Gets capability pattern' root package.
-	 * @param plugin
-	 * @return
-	 */
-	public EDataObject getCapabilityPatternRootPackage(EDataObject plugin) {
-		if (!(plugin instanceof MethodPlugin)) {
-			return null;
-		}
-		return UmaUtil.findMethodPackage((MethodPlugin) plugin,
-				ModelStructure.DEFAULT.capabilityPatternPath);
-	}
-
-	/**
-	 * Gets delivery process' root package.
-	 * @param plugin
-	 * @return
-	 */
-	public EDataObject getDeliveryProcessRootPackage(EDataObject plugin) {
-		if (!(plugin instanceof MethodPlugin)) {
-			return null;
-		}
-		return UmaUtil.findMethodPackage((MethodPlugin) plugin,
-				ModelStructure.DEFAULT.deliveryProcessPath);
-	}
-
-//	public EDataObject getProcessContributionRootPackage(EDataObject plugin) {
-//		if (!(plugin instanceof MethodPlugin)) {
-//			return null;
-//		}
-//		return UmaUtil.findMethodPackage((MethodPlugin) plugin,
-//				ModelStructure.DEFAULT.processContributionPath);
-//	}
-
-	/**
-	 * Creates an element.
-	 * @param container
-	 * @param xmlFeatureName
-	 * @param xmlEClassName
-	 * @param xmlElementType
-	 * @param id
-	 * @return
-	 */
-	public EDataObject createElement(EDataObject container,
-			String xmlFeatureName, String xmlEClassName, String xmlElementType,
-			String id) {
-
-		setSourceId(id);
-
-		// make sure the same object created only once
-		EDataObject obj = getElement(id);
-		if (obj != null) {
-			if (obj instanceof Activity) {
-				EObject eobj = obj.eContainer();
-				if (eobj instanceof ProcessPackage) {
-					ProcessPackage p = (ProcessPackage) eobj;
-					setSourceId(p.getGuid());
-				}
-			}
-			return obj;
-		}
-
-		// if ( obj instanceof MethodPlugin ) {
-		// return getElement(id);
-		// }
-
-		// // this is an easier way, test it,
-		// // does not work since feature.getEType() returns the base element
-		// type, not the extended one
-		// // for example, it returns MethodPackage instead of ProcessPackage or
-		// ContentPackage
-		// // so we need to make our own map
-		// EClassifier c = feature.getEType();
-
-		EClass objClass = FeatureManager.INSTANCE.getRmcEClass(xmlEClassName);
-		if (objClass == null) {
-			logger.logWarning(NLS.bind(ImportXMLResources.library_error_no_eclass, xmlEClassName)); 
-			return null;
-		}
-
-		obj = (EDataObject) EcoreUtil.create(objClass);	
-
-		if (obj instanceof WorkOrder) {
-			// WorkOrder is not a method element in xml uma, need to create it
-			// with a guid
-			//id = EcoreUtil.generateUUID();
-
-			// also need to add the element into the container of the owner
-			((ProcessPackage) container.eContainer()).getProcessElements().add(
-					obj);
-		}
-
-		setElement(id, obj);
-
-		try {
-			if (container instanceof MethodPlugin) {
-				MethodPlugin plugin = (MethodPlugin) container;
-				// need special handling for new plugin
-				if (obj instanceof ContentPackage) {
-					// content package and owner is Plugin, goto the root
-					// content package
-					MethodPackage pkg_core_content = UmaUtil.findMethodPackage(
-							plugin, ModelStructure.DEFAULT.coreContentPath);
-					pkg_core_content.getChildPackages().add(obj);
-				} else if (obj instanceof ProcessComponent) {
-					MethodPackage pkg_cp = UmaUtil.findMethodPackage(plugin,
-							ModelStructure.DEFAULT.capabilityPatternPath);
-					pkg_cp.getChildPackages().add(obj);
-
-				} else if (obj instanceof ProcessPackage) {
-					// this is a root process package
-					// put into the root delivery processes package
-					MethodPackage pkg_dp = UmaUtil.findMethodPackage(plugin,
-							ModelStructure.DEFAULT.deliveryProcessPath);
-					pkg_dp.getChildPackages().add(obj);
-				}
-			} else {
-
-				EStructuralFeature feature = FeatureManager.INSTANCE
-						.getRmcFeature(container.eClass(), xmlFeatureName);
-				if (feature == null) {
-					return null;
-				}
-
-				if ((container instanceof Activity)
-						&& feature == UmaPackage.eINSTANCE
-								.getActivity_BreakdownElements()
-						&& obj instanceof BreakdownElement) {
-
-					// the container needs to be a process package
-					EObject pkg = container;
-					while ((pkg != null) && !(pkg instanceof ProcessPackage)) {
-						pkg = pkg.eContainer();
-					}
-
-					// if the object is an activity, create a package for it and
-					// all it's breakdown elements
-					if ((obj instanceof Activity)) {
-						List childPkgs = ((ProcessPackage) pkg)
-								.getChildPackages();
-						ProcessPackage pp = null;
-						if (true || childPkgs.size() == 0) {	//158363: always create a package for act
-							pp = UmaFactory.eINSTANCE.createProcessPackage();
-							pp.setName(((MethodElement) container).getName());
-							setElement(EcoreUtil.generateUUID(), pp);
-							setSourceId(pp.getGuid());
-							childPkgs.add(pp);
-						} else {
-							pp = (ProcessPackage) childPkgs.get(0);
-						}
-
-						pkg = pp;
-					}
-
-					((ProcessPackage) pkg).getProcessElements().add(obj);
-				}
-
-				// note: all element references are string type (id)
-				// package references are object references
-				if (feature.isMany()) {
-					List values = (List) container.eGet(feature);
-					values.add(obj);
-				} else {
-					container.eSet(feature, obj);
-				}
-			}				
-		} catch (RuntimeException e) {
-			logger.logWarning(NLS.bind(ImportXMLResources.library_error_create_element, e.getMessage()));
-			// e.printStackTrace();
-		}
-
-		return obj;
-	}
-
-	private void setElement(String guid, EDataObject obj) {
-		// addElementToContainer(container, obj);
-				
-		if (!elementsMap.containsKey(guid)) {
-
-			if (obj instanceof MethodElement) {
-				((MethodElement) obj).setGuid(guid);
-			}
-
-			elementsMap.put(guid, obj);
-					
-			setDirty(obj);
-			newElementsMap.put(guid, obj);
-		}
-	}
-
-	private void setSourceId(String id) {
-		// 154149 - allow package level merging for xml import
-		if ( !sourceElementIDs.contains(id) ) {
-			sourceElementIDs.add(id);
-		}
-	}
-	
-	private void setDirty(EObject obj) {
-		// mark the resource as dirty
-		Resource res = obj.eResource();
-		if ( res != null && !res.isModified() ) {
-			res.setModified(true);
-		}
-	}
-	
-	/**
-	 * Gets element given the guid.
-	 * @param guid
-	 * @return
-	 */
-	public EDataObject getElement(String guid) {
-		return (EDataObject) elementsMap.get(guid);
-	}
-
-	private Date createDate(String dateStr) {
-		dateStr = dateStr.replace('T', ' ');
-		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //$NON-NLS-1$
-		return f.parse(dateStr, new ParsePosition(0));
-
-	}
-
-	private String getString(Object obj) {
-		String str = ""; //$NON-NLS-1$
-		if (obj instanceof MethodElement) {
-			str = LibraryUtil.getTypeName((MethodElement) obj);
-		} else if (obj != null) {
-			str = obj.toString();
-		}
-
-		return str;
-	}
-
-	/**
-	 * Sets attribute feature value.
-	 * @param obj
-	 * @param featureName
-	 * @param value
-	 * @throws Exception
-	 */
-	public void setAtributeFeatureValue(EDataObject obj, String featureName,
-			Object value) throws Exception {
-		boolean oldNotify = obj.eDeliver();
-		obj.eSetDeliver(false);
-		setAtributeFeatureValue_(obj, featureName, value);
-		obj.eSetDeliver(oldNotify);
-	}
-	
-	private void setAtributeFeatureValue_(EDataObject obj, String featureName,
-			Object value) throws Exception {
-		if (obj == null || featureName == null || value == null) {
-			return;
-		}
-		
-		if (value instanceof List || value instanceof EDataObject) {
-			if (featureName.equals("methodElementProperty")) {		//$NON-NLS-1$
-				setMepFeatureValue(obj, featureName, value);
-				return;
-			}
-			throw new Exception(NLS.bind(ImportXMLResources.library_error_set_attribute_2, value)); 
-		}
-
-		// find the feature and set the value
-		EStructuralFeature feature = FeatureManager.INSTANCE.getRmcFeature(obj
-				.eClass(), featureName);
-		if (feature == null) {
-			Object[] paras = new Object[] { getString(obj), featureName, value };
-			logger.logWarning(NLS.bind(ImportXMLResources.library_error_set_attribute, paras) + obj); 
-			return;
-		} 
-		
-		setDirty(obj);
-
-		// 158688 - Missing template files in exported xml library
-		// process the attachment url
-		if ( feature == UmaPackage.eINSTANCE.getGuidanceDescription_Attachments() ) {
-			if ( value != null ) {
-				value = contentProc.resolveAttachmentResources(obj, value.toString().trim());
-			}
-			obj.eSet(feature, value);
-		}
-		
-		else if (feature instanceof EReference && value instanceof String) {
-			// if the uma feature is a reference feature
-			// but the xml feature is an attribute
-			// the attribute value must be a guid
-			Object e = getElement((String) value);
-			if (e != null) {
-				if (feature.isMany()) {
-					((List) obj.eGet(feature)).add(e);
-				} else {
-					obj.eSet(feature, e);
-				}
-			} else {
-				Object[] paras = new Object[] { getString(obj),
-						feature.getName(), value };
-				String msg = NLS.bind(ImportXMLResources.library_error_set_attribute, paras); 
-				logger.logWarning(msg);
-			}
-		} else if (feature instanceof EAttribute) {
-			try {
-				if (feature.getName().equals("variabilityType")) { //$NON-NLS-1$
-					value = VariabilityType.get(value.toString());
-				} else if (feature.getName().equals("linkType")) { //$NON-NLS-1$
-					value = WorkOrderType.get(value.toString());
-				} else if (feature == UmaPackage.eINSTANCE
-						.getMethodUnit_ChangeDate()) {
-					// convert java.util.Date to xml Date
-					value = createDate(value.toString());
-				} else if (feature.getName().equals("nodeicon") //$NON-NLS-1$
-						|| feature.getName().equals("shapeicon")) { //$NON-NLS-1$
-					MethodPlugin tgtPlugin = UmaUtil.getMethodPlugin((MethodElement) obj);
-					int ix = tgtPlugin.getName().length() + 1;
-										
-					value = new java.net.URI(value.toString().substring(ix));
-
-					// need to copy the resource file to the target library
-					contentProc.copyResource(((java.net.URI) value).getPath(), obj, tgtPlugin);
-				} else if ((contentProc != null)
-						&& (obj instanceof MethodElement)
-						&& (value instanceof String)) {
-					value = contentProc.resolveResourceFiles(
-							(MethodElement) obj, (String) value);
-				}
-				obj.eSet(feature, value);
-			} catch (RuntimeException e) {
-				Object[] paras = new Object[] { getString(obj), featureName,
-						value };
-				logger.logError(NLS.bind(ImportXMLResources.library_error_set_attribute, paras), e); 
-				// e.printStackTrace();
-			}
-		} else {
-			Object[] paras = new Object[] { getString(obj), featureName, value };
-			logger.logWarning(NLS.bind(ImportXMLResources.library_error_set_attribute_3, paras)); 
-		}
-
-	}
-
-	private void setMepFeatureValue(EDataObject obj, String featureName, Object value) {
-		List srcList = (List) value;
-		int sz = srcList == null ? 0 : srcList.size();		
-		EStructuralFeature feature = FeatureManager.INSTANCE.getRmcFeature(obj
-				.eClass(), featureName);
-		List tgtList = (List) obj.eGet(feature);
-		int tsz = tgtList == null ? 0 : tgtList.size();
-
-		//Source list is empty
-		if (sz == 0) {
-			if (tsz == 0) {
-				return;
-			}
-			tgtList.removeAll(tgtList);
-			setDirty(obj);
-			return;
-		}
-		
-		//Soruce and target are potentially the same
-		boolean same = false;
-		if (sz == tsz) {
-			same = true;
-			for (int i=0; i < sz; i++) {
-				org.eclipse.epf.xml.uma.MethodElementProperty srcMep = 
-					(org.eclipse.epf.xml.uma.MethodElementProperty) srcList.get(i);
-				MethodElementProperty tgtMep = 
-					(MethodElementProperty) tgtList.get(i);
-				if (! srcMep.getName().equals(tgtMep.getName())) {
-					same = false;
-					break;
-				}
-				if (! srcMep.getValue().equals(tgtMep.getValue())) {
-					same = false;
-					break;
-				}
-			}
-		}
-		if (same) {
-			return;
-		}
-		
-		//Soruce and target are not the same
-		tgtList.removeAll(tgtList);
-		for (int i=0; i < sz; i++) {
-			Object srcItem = srcList.get(i);
-			if (srcItem instanceof org.eclipse.epf.xml.uma.MethodElementProperty) {
-				org.eclipse.epf.xml.uma.MethodElementProperty mep = 
-						(org.eclipse.epf.xml.uma.MethodElementProperty) srcItem;
-				EClass objClass = FeatureManager.INSTANCE
-				.getRmcEClass("MethodElementProperty");	//$NON-NLS-1$
-				MethodElementProperty xmlMep = (MethodElementProperty) EcoreUtil.create(objClass);
-				xmlMep.setValue(mep.getValue());
-				xmlMep.setName(mep.getName());
-				tgtList.add(xmlMep);
-			}
-		}
-		setDirty(obj);
-		//obj.eSet(feature, tgtList);
-	}
-
-	/**
-	 * Sets reference value.
-	 * @param obj
-	 * @param featureName
-	 * @param id
-	 * @throws Exception
-	 */
-	public void setReferenceValue(EDataObject obj, String featureName, String id)
-			throws Exception {
-		if (obj == null || featureName == null || id == null) {
-			return;
-		}
-		
-		EObject value = getElement(id);
-		if (value == null) {
-			logger.logWarning(NLS.bind(ImportXMLResources.library_error_set_reference, featureName, id));
-
-			return;
-		}
-
-		// find the feature and set the value
-		EStructuralFeature feature = FeatureManager.INSTANCE.getRmcFeature(obj
-				.eClass(), featureName);
-		if (feature == null) {
-			Object[] paras = new Object[] { getString(obj), featureName, id };
-			logger.logWarning(NLS.bind(ImportXMLResources.library_error_set_reference_2, paras)); 
-			return;
-		}
-
-		// don't iterate the containment feature
-		if (value.eContainer() == obj) {
-			return;
-		}
-
-		// String str = feature.getEType().getName();
-		if (feature.isMany()) {
-			try {
-				List items = (List) obj.eGet(feature);
-				if (!items.contains(value)) {
-					items.add(value);
-				}
-			} catch (RuntimeException e) {
-				Object[] paras = new Object[] { getString(obj), featureName, id };
-				logger
-						.logError(
-								NLS.bind(ImportXMLResources.library_error_set_reference_2, paras), e); 
-			}
-		} else {
-			obj.eSet(feature, value);
-		}
-		
-		setDirty(obj);
-	}
-
-	/**
-	 * Sets work order.
-	 * @param umaWorkOrder
-	 * @param predId
-	 */
-	public void setWorkOrder(Object umaWorkOrder, String predId) {
-		if (umaWorkOrder instanceof WorkOrder) {
-			WorkBreakdownElement e = (WorkBreakdownElement) getElement(predId);
-			((WorkOrder) umaWorkOrder).setPred(e);
-			
-			setDirty((EObject)umaWorkOrder);
-
-		}
-	}
-
-	/**
-	 * Fixes library.
-	 */
-	public void fixLibrary() {
-		MethodLibrary rootObject = getRoot();
-		for (Iterator it = ((MethodLibrary) rootObject).getMethodPlugins()
-				.iterator(); it.hasNext();) {
-			fixPlugin((MethodPlugin) it.next());
-		}
-	}
-	
-	/**
-	 * fix task descriptors for import
-	 * 
-	 */
-	public void fixTaskDescriptors(Map<String, TaskDescriptor> tdMap) {
-		if (tdMap == null || tdMap.isEmpty()) {
-			return;
-		}		
-		for (Iterator<Map.Entry<String, TaskDescriptor>> it = tdMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry<String, TaskDescriptor> entry = it.next();
-			String guid = entry.getKey();
-			TaskDescriptor td = entry.getValue();
-			org.eclipse.epf.uma.TaskDescriptor umaTd = (org.eclipse.epf.uma.TaskDescriptor) elementsMap.get(guid);
-			assert(umaTd != null);
-			if (umaTd == null) {
-				continue;
-			}
-			List steps = td.getStep();
-			for (int i=0; i<steps.size(); i++) {
-				org.eclipse.epf.xml.uma.MethodElement step = (org.eclipse.epf.xml.uma.MethodElement) steps.get(i);
-				Section umaStep =  (Section) elementsMap.get(step.getId());
-				assert(umaStep != null);
-				if (umaStep != null) {
-					umaTd.getSelectedSteps().add(umaStep);
-				}
-			}			
-		}		
-	}
-
-	private MethodPackage cpRoot = null;
-
-	private MethodPackage dpRoot = null;
-
-//	private MethodPackage pcRoot = null;
-
-	private void fixPlugin(MethodPlugin plugin) {
-
-		// fix the root custom categories
-		fixCustomCategories(plugin);
-
-		List cpPkgs = new ArrayList();
-		List dpPkgs = new ArrayList();
-//		List pcPkgs = new ArrayList();
-
-		cpRoot = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.capabilityPatternPath);
-		dpRoot = UmaUtil.findMethodPackage(plugin,
-				ModelStructure.DEFAULT.deliveryProcessPath);
-//		pcRoot = UmaUtil.findMethodPackage(plugin,
-//				ModelStructure.DEFAULT.processContributionPath);
-		getAllPackages(cpRoot, cpPkgs);
-		getAllPackages(dpRoot, dpPkgs);
-		
-//		if ( pcPkgs != null ) {
-//			getAllPackages(pcRoot, pcPkgs);
-//		}
-			
-		List procs = new ArrayList();
-		for (Iterator it = plugin.eAllContents(); it.hasNext();) {
-			EObject o = (EObject)it.next();
-			boolean oldNotify = o.eDeliver();
-			try	{
-				// turn off notifications to avoid possible deadlock or thread issue
-				// 154142 - import xml caused thread access error
-				o.eSetDeliver(false);
-				
-				if (o instanceof ProcessComponent) {
-					procs.add(o);
-				} else if (o instanceof DescribableElement) {
-					String pName = ((DescribableElement) o).getPresentationName();
-					if (pName == null || pName.length() == 0) {
-						((DescribableElement) o)
-								.setPresentationName(((DescribableElement) o)
-										.getName());
-					}
-				}
-	
-				// fix the name string
-				if (o instanceof MethodElement && !(o instanceof Section)) {
-					String name = ((MethodElement) o).getName();
-					String new_name = StrUtil.makeValidFileName(name);
-					if ( !new_name.equals(name) ) {
-						((MethodElement) o).setName(new_name);
-					}
-				}
-			} finally {
-				o.eSetDeliver(oldNotify);
-			}
-		}
-
-		if (procs.size() > 0) {
-			for (Iterator it = procs.iterator(); it.hasNext();) {
-				ProcessComponent pc = (ProcessComponent) it.next();
-				Object proc = pc.getProcess();
-				if (proc instanceof DeliveryProcess) {
-					if (!dpPkgs.contains(pc)) {
-						moveProcessComponent(pc, dpRoot);
-					}
-				} else if (proc instanceof CapabilityPattern) {
-					if (!cpPkgs.contains(pc)) {
-						moveProcessComponent(pc, cpRoot);
-					}
-				}
-			}
-		}
-	}
-
-	private void getAllPackages(MethodPackage pkg, List pkgs) {
-		pkgs.add(pkg);
-		for (Iterator it = pkg.getChildPackages().iterator(); it.hasNext();) {
-			getAllPackages((MethodPackage) it.next(), pkgs);
-		}
-	}
-
-	/**
-	 * move the process package to the specified container, if the package is
-	 * the only child of it's parent, move it's parent
-	 * 
-	 * @param pkg
-	 * @param container
-	 */
-	private void moveProcessComponent(ProcessPackage pkg,
-			MethodPackage container) {
-		// make sure Capability patterns are in the Capability packages
-		Object o = pkg.eContainer();
-		if ((o instanceof ProcessPackage)
-				&& (((ProcessPackage) o).getChildPackages().size() == 1)
-				&& o != cpRoot && o != dpRoot ) {
-			moveProcessComponent((ProcessPackage) o, container);
-		} else {
-			container.getChildPackages().add(pkg);
-		}
-	}
-
-	/**
-	 * find the root custom cagegory and put to the root package
-	 * 
-	 * @param plugin
-	 *            MethodPlugin
-	 */
-	private void fixCustomCategories(MethodPlugin plugin) {
-		ContentPackage pkg = UmaUtil.findContentPackage(plugin,
-				ModelStructure.DEFAULT.customCategoryPath);
-		List items = new ArrayList(pkg.getContentElements());
-
-		List rootItems = new ArrayList();
-		while (items.size() > 0) {
-			CustomCategory cc = (CustomCategory) items.remove(0);
-			rootItems.add(cc);
-			
-			// 158691Custom Category is different in exported library
-			// need to remove sub-categories recursively
-			fixCustomCategories(cc, items, rootItems);
-		}
-
-		TngUtil.getRootCustomCategory(plugin).getCategorizedElements().addAll(
-				rootItems);
-
-	}
-	
-	/**
-	 * find the root custom categories by removing the sub-categories recursively
-	 * 
-	 * @param cc
-	 * @param items
-	 * @param rootItems
-	 */
-	private void fixCustomCategories(CustomCategory cc, List items, List rootItems) {
-		for (Iterator it = cc.getSubCategories().iterator(); it.hasNext();) {
-			Object item = it.next();
-			items.remove(item);
-			rootItems.remove(item);
-			fixCustomCategories((CustomCategory)item, items, rootItems);
-		}
-		
-		// also iterate the contained elements
-		for (Iterator it = cc.getCategorizedElements().iterator(); it
-				.hasNext();) {
-			Object item = it.next();
-			if (item instanceof CustomCategory) {
-				items.remove(item);
-				rootItems.remove(item);
-				fixCustomCategories((CustomCategory)item, items, rootItems);
-			}
-		}
-	}
-	
-	/**
-	 * delete the un-needed elements are clear resources 
-	 */
-	public void deleteElements() {
-		
-		IFileManager fileMgr = Services.getFileManager();
-
-		List deletedElements = new ArrayList();
-		
-		for (Iterator it = elementsMap.entrySet().iterator(); it.hasNext(); ) {
-			Map.Entry entry = (Map.Entry)it.next();
-			String id = (String)entry.getKey();
-			MethodElement e = (MethodElement)entry.getValue();
-			if ( sourceElementIDs.contains(id) ) {
-				continue;
-			} else if (overwrite) {
-				boolean toDelete = !(e instanceof MethodLibrary || e instanceof MethodPlugin
-									|| e instanceof MethodConfiguration);
-				if (toDelete) {
-					MethodElement plugin = UmaUtil.getMethodPlugin(e);
-					toDelete = plugin != null && !isNewElement(plugin.getGuid())
-					&& sourceElementIDs.contains(plugin.getGuid());
-				}
-				if (toDelete) {
-					deletedElements.add(e);
-					handleActivityRemoval(e);
-					//EcoreUtil.remove(e);
-					continue;
-				}
-			}
-			
-			if ( (e instanceof CustomCategory) && TngUtil.isRootCustomCategory( (CustomCategory)e ) ) {
-				continue;
-			}			
-			
-			// delete the element if the containg package is in the source library
-			// don't delete if the package is not in the xml library
-			MethodPackage pkg = TngUtil.getMethodPackage(e);
-			
-			if ( pkg != null ) { 
-				String pid = pkg.getGuid();
-				if ( sourceElementIDs.contains(pid) ) {
-					deletedElements.add(e);
-					handleActivityRemoval(e);
-					
-					// delete the element from the library
-					//EcoreUtil.remove(e);				
-				} else if (e instanceof Activity) {
-					
-					boolean toCheck = true;
-					MethodPackage pc = pkg;					
-					while(pc != null && ! (pc instanceof ProcessComponent)) {
-						pc = TngUtil.getParentMethodPackage(pc);
-					}
-					if (pc instanceof ProcessComponent) {
-						toCheck = sourceElementIDs.contains(pc.getGuid());
-					}
-					
-					if (toCheck) {
-						pkg = TngUtil.getMethodPackage(pkg);
-						while (pkg != null) {
-							pid = pkg.getGuid();
-							if (sourceElementIDs.contains(pid)) {
-								deletedElements.add(e);
-								handleActivityRemoval(e);
-								break;
-							}
-							pkg = TngUtil.getParentMethodPackage(pkg);
-						}
-					}
-				}
-			}
-		}
-		
-		// delete the resources
-		deleteResoruces(deletedElements);
-	}
-
-	//	164581
-	private void handleActivityRemoval(MethodElement e) {
-		if (!(e instanceof BreakdownElement)) {
-			return;
-		}
-		BreakdownElement eact = (BreakdownElement) e;
-		Activity sact = eact.getSuperActivities();
-		if (sact != null) {
-			sact.getBreakdownElements().remove(eact);
-		}
-	}
-	
-	// clear resources for deleted elements
-	private void deleteResoruces(List deletedElements) {
-		if ( deletedElements.size() == 0 ) {
-			return;
-		}
-		
-		IFileManager fileMgr = Services.getFileManager();
-
-		for (Iterator it = deletedElements.iterator(); it.hasNext(); ) {
-			MethodElement e = (MethodElement)it.next();
-			
-			EObject obj = null;
-			if ( e instanceof DescribableElement ) {
-				obj = ((DescribableElement)e).getPresentation();
-			} else if ( e instanceof ContentDescription ||
-					overwrite && e instanceof ProcessComponent) {
-				obj = e;
-			}
-			if ( obj != null ) {
-				MethodElement plugin = UmaUtil.getMethodPlugin(e);
-				Resource pluginRes = plugin == null ? null : plugin.eResource();
-				
-				Resource res = obj.eResource();
-				if ( res != null && res != pluginRes) {		//Protected from bugs like 177042
-					String file = res.getURI().toFileString();
-					if ( debug ) {
-						System.out.println("deleting resource: " + file); //$NON-NLS-1$
-					}
-					
-					if ( !fileMgr.delete(file) ) {
-						if ( debug ) {
-							System.out.println("unable to delete file: " + file); //$NON-NLS-1$
-						}
-					}
-					
-					EObject resMgr = MultiFileSaveUtil.getResourceManager(res);
-					if (resMgr != null) {
-						EcoreUtil.remove(resMgr);
-					}
-					EObject resDes = MultiFileSaveUtil.getResourceDescriptor(res);
-					if (resDes != null) {
-						EcoreUtil.remove(resDes);
-					}
-					if (overwrite) {						
-						File folder = new File(file).getParentFile();
-						File files[] = folder.listFiles();
-						if (files == null || files.length == 0 ) {
-							if ( debug ) {
-								System.out.println("deleting folder resource: " + folder); //$NON-NLS-1$
-							}
-							if ( !fileMgr.delete(folder.getAbsolutePath()) ) {
-								if ( debug ) {
-									System.out.println("unable to delete folder file: " + folder); //$NON-NLS-1$
-								}
-							}
-						}
-					}
-				}								
-			}
-			
-			EcoreUtil.remove(e);
-		}
-	}
-			
-	/**
-	 * @param guid
-	 * @return true if the element given by guid is new.
-	 */
-	public boolean isNewElement(String guid) {
-		return newElementsMap.containsKey(guid);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/package.html b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/package.html
deleted file mode 100644
index 879b168..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/services/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for the Import XML service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/ImportXMLWizard.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/ImportXMLWizard.java
deleted file mode 100644
index 615aa90..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/ImportXMLWizard.java
+++ /dev/null
@@ -1,225 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml.wizards;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.epf.authoring.ui.wizards.SaveAllEditorsPage;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.export.xml.ExportXMLPlugin;
-import org.eclipse.epf.importing.xml.ImportXMLPlugin;
-import org.eclipse.epf.importing.xml.ImportXMLResources;
-import org.eclipse.epf.importing.xml.preferences.ImportXMLPreferences;
-import org.eclipse.epf.importing.xml.services.ImportXMLService;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.actions.LibraryLockingOperationRunner;
-import org.eclipse.epf.library.ui.wizards.LibraryBackupUtil;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.epf.services.Services;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * The Import XML wizard.
- * <p>
- * This wizard is used to import method library content stored in a XML file.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ImportXMLWizard extends Wizard implements IImportWizard {
-
-	ImportXMLService service = new ImportXMLService();
-
-	private boolean succeed = true;
-	
-	private SelectXMLFilePage filePage = null;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ImportXMLWizard() {
-		super();
-		setWindowTitle(ImportXMLResources.importXMLWizard_title);
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		// check out the library first
-		IFileManager fileMgr = Services.getFileManager();
-		if (LibraryService.getInstance()
-				.getCurrentMethodLibrary() != null) {
-			fileMgr.checkModify(LibraryService.getInstance()
-					.getCurrentMethodLibrary().eResource().getURI().toFileString(),
-					MsgBox.getDefaultShell());
-		}
-
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null && manager.isMethodLibraryReadOnly()) {
-			File libraryFile = new File(LibraryService.getInstance()
-					.getCurrentMethodLibraryLocation(),
-					MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME);
-			ImportXMLPlugin.getDefault().getMsgDialog().displayError(
-					ImportXMLResources.importXMLWizard_title,
-					ImportXMLResources.importXMLError_msg,
-					NLS.bind(ImportXMLResources.importXMLError_reason,
-							libraryFile.getAbsolutePath()));
-			return;
-		}
-
-		SaveAllEditorsPage.addPageIfNeeded(this, true, null, null, ImportXMLPlugin
-				.getDefault().getImageDescriptor(
-						"full/wizban/ImportXML.gif")); //$NON-NLS-1$
-		
-		filePage = new SelectXMLFilePage();
-		addPage(filePage);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				ExportXMLPlugin.getDefault().getSharedImage(
-						"full/obj16/XMLFile.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		boolean refresh = RefreshJob.getInstance().isEnabled();
-		if (refresh) {
-			//Needed: because LibraryLockingOperationRunner adds events to RefreshJob at the
-			//end of "run" call!
-			RefreshJob.getInstance().setEnabled(false);
-		}		
-		final boolean ret[] = new boolean[1];		
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.run(new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				ret[0] = performFinish_();
-			}			
-		});
-		if (refresh) {
-			try {
-				Thread.sleep(1000); // temp solution for potential racing
-			} catch (Exception e) {
-			}
-			RefreshJob.getInstance().setEnabled(true);
-		}
-		
-		
-		runner = new LibraryLockingOperationRunner();
-		runner.run(new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				String msg = NLS.bind(ImportXMLResources.review_log_files,
-						service.getLogPath());
-					MsgBox.prompt(msg, SWT.OK);
-			}			
-		});		
-		
-		ResourceUtil.refreshResources(LibraryService.getInstance()
-				.getCurrentMethodLibrary(), new NullProgressMonitor());
-		
-		return ret[0];
-	}
-	
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	private boolean performFinish_() {
-		LibraryBackupUtil.promptBackupCurrentLibrary(null, LibraryService
-				.getInstance());
-
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				try {
-					monitor.beginTask(ImportXMLResources.importingXML_text,
-							IProgressMonitor.UNKNOWN);
-
-					String xmlFile = filePage.getPath();
-					boolean mergeOption = filePage.getMergeOption();
-					boolean checkBasePlugins = filePage.getCheckBasePlugins();
-					service.setOverwrite(!mergeOption);
-					service.setCheckBasePlugins(checkBasePlugins);
-					succeed = service.loadXml(xmlFile);
-					if (! succeed) {
-						return;
-					}					
-					service.doImport(monitor);
-					ImportXMLPreferences.setXMLFile(xmlFile);
-					ImportXMLPreferences.setMergeOption(mergeOption);
-					ImportXMLPreferences.setCheckBasePluginsOption(checkBasePlugins);
-				} catch (Exception e) {
-					throw new InvocationTargetException(e);
-				} finally {
-					monitor.done();
-				}
-
-			}
-		};
-		try {
-			getContainer().run(true, false, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			Throwable realException = e.getTargetException();
-			ImportXMLPlugin.getDefault().getMsgDialog().displayError(
-					ImportXMLResources.importXMLWizard_title,
-					realException.getMessage(), realException);
-			return false;
-		}
-
-		if (!succeed) {
-			return false;
-		}
-		//String msg = NLS.bind(ImportXMLResources.review_log_files,
-		//	service.getLogPath());
-		//MsgBox.prompt(msg, SWT.OK);
-
-		return true;
-	}
-
-	/**
-	 * Disposes of this wizard and frees all SWT resources.
-	 */
-	public void dispose() {
-		service.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/SelectXMLFilePage.java b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/SelectXMLFilePage.java
deleted file mode 100644
index a8f549a..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/SelectXMLFilePage.java
+++ /dev/null
@@ -1,223 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.xml.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.xml.ImportXMLPlugin;
-import org.eclipse.epf.importing.xml.ImportXMLResources;
-import org.eclipse.epf.importing.xml.preferences.ImportXMLPreferences;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to select a XML file to import.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectXMLFilePage extends BaseWizardPage {
-
-	public static final String PAGE_NAME = SelectXMLFilePage.class.getName();
-
-	private Text pathText;
-
-	private String path;
-
-	private boolean mergeOption = true;
-	
-	private boolean checkBasePlugins = true;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectXMLFilePage() {
-		super(PAGE_NAME);
-		setTitle(ImportXMLResources.selectXMLFilePage_title);
-		setDescription(ImportXMLResources.selectXMLFilePage_desc);
-		setImageDescriptor(ImportXMLPlugin.getDefault().getImageDescriptor(
-				"full/wizban/imp_xml_wizban.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(3, false));
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label fileLabel = new Label(composite, SWT.NONE);
-		fileLabel.setText(ImportXMLResources.fileLabel_text); 
-
-		pathText = new Text(composite, SWT.BORDER);
-		pathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		pathText.setText(ImportXMLPreferences.getXMLFile());		
-		pathText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (isValidPath(pathText.getText().trim())) {
-					setPageComplete(true);
-					setErrorMessage(null);
-				} else {
-					setPageComplete(false);
-					setErrorMessage(ImportXMLResources.invalidXMLFile_error);
-				}
-			}
-		});
-
-		Button browseButton = new Button(composite, SWT.PUSH);
-		browseButton.setLayoutData(new GridData(GridData.END));
-		browseButton.setText(ImportXMLResources.browseButton_text);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				FileDialog fd = new FileDialog(Display.getCurrent()
-						.getActiveShell(), SWT.OPEN);
-				fd.setFilterExtensions(new String[] { "*.xml", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
-				String path = fd.open();
-				boolean ok = false;
-				if (path != null) {
-					pathText.setText(path);
-					ok = isValidPath(path);
-				}
-				setPageComplete(ok);
-			}
-		});
-
-		Group optionGroup = new Group(composite, SWT.NONE);
-		optionGroup.setLayout(new GridLayout(1, false));
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 3;
-		optionGroup.setLayoutData(gridData);
-		optionGroup.setText(ImportXMLResources.optionGroup_text);
-
-		mergeOption = ImportXMLPreferences.getMergeOption();
-			
-		Button overwriteRadioButton = createRadioButton(optionGroup,
-				ImportXMLResources.overwriteRadioButton_text, 1, !mergeOption);
-		overwriteRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				mergeOption = false;
-			}
-		});
-		
-		Button mergeRadioButton = createRadioButton(optionGroup,
-				ImportXMLResources.mergeRadioButton_text, 1, mergeOption);
-		mergeRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				mergeOption = true;
-			}
-		});
-		
-		
-		Group optionGroup1 = new Group(composite, SWT.NONE);
-		optionGroup1.setLayout(new GridLayout(1, false));
-		GridData gridData1 = new GridData(GridData.FILL_HORIZONTAL);
-		gridData1.horizontalSpan = 3;
-		optionGroup1.setLayoutData(gridData1);
-		optionGroup1.setText(ImportXMLResources.optionGroup1_text);
-		checkBasePlugins = ImportXMLPreferences.getCheckBasePluginsOption();
-			
-		Button checkBaseRadioButton = createRadioButton(optionGroup1,
-				ImportResources.checkBaseRadioButton_text, 1, checkBasePlugins);	
-		checkBaseRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				checkBasePlugins = true;
-			}
-		});
-		
-		Button ignoreRemoveRadioButton = createRadioButton(optionGroup1,
-				ImportResources.ignoreRemoveRadioButton_text, 1, !checkBasePlugins);
-		ignoreRemoveRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				checkBasePlugins = false;
-			}
-		});
-
-		setControl(composite);
-
-		setPageComplete(isValidPath(pathText.getText().trim()));
-	}
-
-	/**
-	 * Checks whether the user specific path is valid.
-	 * 
-	 * @param path
-	 *            the user specific path
-	 * @return <code>true</code> if the user specified path is valid.
-	 */
-	private boolean isValidPath(String path) {
-		File file = new File(path);
-		if (file.exists() && file.isFile()) {
-			this.path = path;
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Gets the user specified XML file.
-	 * 
-	 * @return an absolute path to the XML file
-	 */
-	public String getPath() {
-		return path;
-	}
-
-	/**
-	 * Gets the user specified import option.
-	 * 
-	 * @return <code>true</code> if the user selected the merge option,
-	 *         <code>false</code> if the user selected the overwrite option
-	 */
-	public boolean getMergeOption() {
-		return mergeOption;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		return super.isPageComplete();
-	}	
-	
-	/**
-	 * Gets the user specified check base plugin option.
-	 * 
-	 * @return <code>true</code> if the user selected the check base plugin option,
-	 *         <code>false</code> if the user selected the ignore check base plugin option
-	 */
-	public boolean getCheckBasePlugins() {
-		return checkBasePlugins;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/package.html b/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/package.html
deleted file mode 100644
index b8ee622..0000000
--- a/1.5/plugins/org.eclipse.epf.import.xml/src/org/eclipse/epf/importing/xml/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides wizards for importing method library content stored in XML.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/.classpath b/1.5/plugins/org.eclipse.epf.import/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.import/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.import/.options b/1.5/plugins/org.eclipse.epf.import/.options
deleted file mode 100644
index b3ecd96..0000000
--- a/1.5/plugins/org.eclipse.epf.import/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Import plug-in
-org.eclipse.epf.import/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.import/.project b/1.5/plugins/org.eclipse.epf.import/.project
deleted file mode 100644
index 1f44150..0000000
--- a/1.5/plugins/org.eclipse.epf.import/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.import</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.import/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.import/META-INF/MANIFEST.MF
deleted file mode 100644
index 612e6dd..0000000
--- a/1.5/plugins/org.eclipse.epf.import/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.import; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.importing.ImportPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.importing,
- org.eclipse.epf.importing.services,
- org.eclipse.epf.importing.wizards
-Require-Bundle: org.apache.ant,
- org.eclipse.core.runtime,
- org.eclipse.epf.authoring.ui,
- org.eclipse.epf.dataexchange,
- org.eclipse.epf.export,
- org.eclipse.epf.services,
- org.eclipse.epf.library.xmi,
- org.eclipse.epf.common.ui
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.import/build.properties b/1.5/plugins/org.eclipse.epf.import/build.properties
deleted file mode 100644
index 6c780cd..0000000
--- a/1.5/plugins/org.eclipse.epf.import/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.import/icons/Authoring.gif b/1.5/plugins/org.eclipse.epf.import/icons/Authoring.gif
deleted file mode 100644
index 531baf2..0000000
--- a/1.5/plugins/org.eclipse.epf.import/icons/Authoring.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import/icons/Importing.gif b/1.5/plugins/org.eclipse.epf.import/icons/Importing.gif
deleted file mode 100644
index a96394f..0000000
--- a/1.5/plugins/org.eclipse.epf.import/icons/Importing.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import/icons/etool16/imp_lib_conf.gif b/1.5/plugins/org.eclipse.epf.import/icons/etool16/imp_lib_conf.gif
deleted file mode 100644
index 0c32ce8..0000000
--- a/1.5/plugins/org.eclipse.epf.import/icons/etool16/imp_lib_conf.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import/icons/etool16/imp_meth_plugin.gif b/1.5/plugins/org.eclipse.epf.import/icons/etool16/imp_meth_plugin.gif
deleted file mode 100644
index f99443f..0000000
--- a/1.5/plugins/org.eclipse.epf.import/icons/etool16/imp_meth_plugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import/icons/full/wizban/imp_lib_conf_wizban.gif b/1.5/plugins/org.eclipse.epf.import/icons/full/wizban/imp_lib_conf_wizban.gif
deleted file mode 100644
index 8891e28..0000000
--- a/1.5/plugins/org.eclipse.epf.import/icons/full/wizban/imp_lib_conf_wizban.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import/icons/full/wizban/imp_meth_plugin_wizban.gif b/1.5/plugins/org.eclipse.epf.import/icons/full/wizban/imp_meth_plugin_wizban.gif
deleted file mode 100644
index f1bd66f..0000000
--- a/1.5/plugins/org.eclipse.epf.import/icons/full/wizban/imp_meth_plugin_wizban.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.import/plugin.properties b/1.5/plugins/org.eclipse.epf.import/plugin.properties
deleted file mode 100644
index 9521984..0000000
--- a/1.5/plugins/org.eclipse.epf.import/plugin.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Import
-providerName=Eclipse.org
-
-# Import Wizard Category
-importCategoryName=Method
-
-# Import Library Configuration Wizard
-importLibraryConfigurationWizardName=Library Configuration
-importLibraryConfigurationWizardText=Import a library configuration.
-
-# Import Method Plug-ins Wizard
-importMethodPluginsWizardName=Method Plug-ins
-importMethodPluginsWizardText=Import one or more method plug-ins.
-
-
-
-               
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/plugin.xml b/1.5/plugins/org.eclipse.epf.import/plugin.xml
deleted file mode 100644
index 425c96c..0000000
--- a/1.5/plugins/org.eclipse.epf.import/plugin.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.importWizards">
-      <wizard
-            category="org.eclipse.epf.ui.importWizards.category"
-            class="org.eclipse.epf.importing.wizards.ImportConfigurationWizard"
-            icon="/icons/etool16/imp_lib_conf.gif"
-            id="org.eclipse.epf.importing.wizards.ImportConfigurationWizard"
-            name="%importLibraryConfigurationWizardName">
-         <description> 
-               %importLibraryConfigurationWizardText
-         </description>
-      </wizard>
-      <wizard
-            category="org.eclipse.epf.ui.importWizards.category"
-            class="org.eclipse.epf.importing.wizards.ImportPluginWizard"
-            icon="/icons/etool16/imp_meth_plugin.gif"
-            id="org.eclipse.epf.importing.wizards.ImportPluginWizard"
-            name="%importMethodPluginsWizardName">
-         <description>
-               %importMethodPluginsWizardText
-         </description>
-      </wizard>
-   </extension>
-
-   <extension
-         point="org.eclipse.epf.ui.importWizards">
-      <wizard id="org.eclipse.epf.importing.wizards.ImportPluginWizard"/>
-   </extension>
-
-   <extension
-         point="org.eclipse.epf.ui.importWizards">
-      <wizard id="org.eclipse.epf.importing.wizards.ImportConfigurationWizard"/>
-   </extension>
-   <extension
-         point="org.eclipse.epf.common.commandLineRunners">
-      <commandLineRunner
-            class="org.eclipse.epf.importing.services.CommandLinePluginImporter"
-            runnerId="commandLinePluginImporter"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/ImportPlugin.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/ImportPlugin.java
deleted file mode 100644
index a93bb85..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/ImportPlugin.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * The Import plug-in class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ImportPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static ImportPlugin plugin;
-
-	/**
-	 * Default constructor.
-	 */
-	public ImportPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext context)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext context)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static ImportPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/ImportResources.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/ImportResources.java
deleted file mode 100644
index 119cc16..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/ImportResources.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.importing;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class ImportResources extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.epf.importing.Resources";//$NON-NLS-1$
-
-	private ImportResources() {
-		// Do not instantiate
-	}
-
-	public static String ConfigurationImportService_MSG2;
-	public static String importConfigWizard_title;
-	public static String selectConfigDirWizardPage_title;
-	public static String selectConfigDirWizardPage_text;
-	public static String reviewChangesWizardPage_title;
-	public static String reviewChangesWizardPage_text;
-	public static String selectConfigSpecsWizardPage_title;
-	public static String selectConfigSpecsWizardPage_text;
-	public static String importPluginsWizard_title;
-	public static String selectPluginsDirWizardPage_title;
-	public static String selectPluginsDirWizardPage_text;
-	public static String selectPluginsWizardPage_title;
-	public static String selectPluginsWizardPage_text;
-	public static String importPluginsWizard_ERR_Import_plugin;
-	public static String ConfigurationImportService_MSG0;
-	public static String ConfigurationImportService_MSG1;
-	public static String ConfigurationImportService_MSG3;
-	public static String ImportConfigurationWizard_MSG1;
-	public static String FileModifyChecker_Checkout_failed_msg;
-	public static String FileModifyChecker_Checkout_failed_title;
-	public static String ImportConfigurationWizard_ERR_Import_configuration;
-	public static String ImportConfigReportPage_title;
-	public static String ImportPluginWizard_readonly;
-	public static String ImportPluginWizard_MSG1;
-	public static String ImportPluginWizard_error;
-	public static String ImportPluginWizard_warn_existing_plugins;
-	public static String ImportPluginWizard_confirm_continue;
-	public static String ImportPluginWizard_warn_circular_plugins;
-	public static String SelectConfigsToImport_label1;
-	public static String ImportConfigurationWizard_error;
-	public static String SelectImportConfigurationSource_MSG1;
-	public static String SelectConfigSpecsToImportPage_title2;
-	public static String SelectImportPluginSource_not_used;
-	public static String SelectImportPluginSource_no_path;
-	public static String SelectImportPluginSource_no_dir;
-	public static String SelectPluginsToImport_label_plugins;
-	public static String SelectPluginsToImport_label_author;
-	public static String SelectPluginsToImport_label_version;
-	public static String SelectPluginsToImport_label_desc;
-	public static String ImportConfigurationWizard_readonly;
-	public static String PluginImportingService_MSG0;
-	public static String PluginImportingService_MSG1;
-	public static String PluginImportingService_MSG3;
-	public static String PluginImportingService_MSG5;
-	public static String PluginImportingService_MSG6;
-	public static String DiffReportViewer_content;
-	public static String DiffReportViewer_in_import;
-	public static String SelectPluginsToImport_MSG1;
-	public static String DiffReportLabelProvider_yes;
-	public static String SelectPluginsToImport_error;
-	public static String DiffReportViewer_in_lib;
-	public static String DiffReportViewer_status;
-	public static String SelectPluginsToImport_libraryPluginExists;
-	public static String SelectPluginsToImport_libraryPluginNotExists;
-	public static String SelectConfigSpecsToImportPage_libraryConfigSpecExists;
-	public static String SelectConfigSpecsToImportPage_configSpecNoSelection;
-	public static String SelectConfigSpecsToImportPage_configSpecDataLabel;
-	public static String SelectConfigSpecsToImportPage_label_configs;
-	public static String SelectImportConfigurationSource_not_used;
-	public static String SelectConfigSpecsToImportPage_label_desc;
-	public static String SelectImportConfigurationSource_no_path;
-	public static String SelectPluginsToImport_pluginNoSelection;
-	public static String SelectImportConfigurationSource_no_dir;
-	public static String SelectImportConfigurationSource_plugin_readonly;
-	public static String SelectImportConfigurationSource_plugin_locked;
-	public static String SelectImportConfigurationSource_error_not_updatable;
-	public static String SelectPluginsToImport_pluginDataLabel;
-	public static String DiffReportViewer_type;
-	public static String SelectConfigSpecsToImportPage_libraryConfigSpecNotExists;
-	public static String versionMismatch_oldData;
-	public static String versionMismatch_oldData_unknown;
-	public static String versionMismatch_oldTool;
-	public static String versionMismatch_oldTool_unknown;
-	public static String optionGroup_text;
-	public static String checkBaseRadioButton_text;
-	public static String ignoreRemoveRadioButton_text;
-		
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, ImportResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/Resources.properties b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/Resources.properties
deleted file mode 100644
index ecfc196..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/Resources.properties
+++ /dev/null
@@ -1,98 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-#
-# Message ID Range: IUPE0200E - IUPE0299E
-#
-
-# Import Library Configuration Wizard
-importConfigWizard_title=Import Library Configuration
-selectConfigDirWizardPage_title=Specify import directory
-selectConfigDirWizardPage_text=Specify the directory containing the library configuration to import.
-reviewChangesWizardPage_title=Review library changes
-reviewChangesWizardPage_text=Review the changes that will be made to the current method library.
-selectConfigSpecsWizardPage_title=Select configuration specifications
-selectConfigSpecsWizardPage_text=Select one or more configuration specifications to import.
-
-# Import Method Plug-ins Wizard
-importPluginsWizard_title=Import Method Plug-ins
-selectPluginsDirWizardPage_title=Specify import directory
-selectPluginsDirWizardPage_text=Specify the directory containing the method plug-ins to import.
-selectPluginsWizardPage_title=Select method plug-ins
-selectPluginsWizardPage_text=Select one or more method plug-ins to import. If a selected plug-in already exists in the current method library, verify the version differences.
-importPluginsWizard_ERR_Import_plugin=Import plug-in failed
-
-ConfigurationImportService_MSG0=Validating selected library configuration...
-ConfigurationImportService_MSG1=The specified directory does not contain a valid configuration.
-ConfigurationImportService_MSG3=Importing method configuration...
-ConfigurationImportService_MSG2=Cannot import the currently opened library into itself.
-ImportConfigurationWizard_MSG1=Importing method configuration...
-ImportConfigurationWizard_ERR_Import_configuration=Import configuration failed
-
-FileModifyChecker_Checkout_failed_title=Checkout failed
-FileModifyChecker_Checkout_failed_msg=Some files are not checked out, do you want to try again?
-
-ImportConfigReportPage_title=Importing Configuration Report
-ImportPluginWizard_readonly=IUPE0201E: Library is read-only.
-ImportPluginWizard_MSG1=Importing method plug-in...
-ImportPluginWizard_error=Error
-ImportPluginWizard_warn_existing_plugins=IUPE0200E: The following selected plug-in(s) already exist and re-importing the same plug-in(s) will overwrite the existing one(s):\n\n {0} \n\nAre you sure you want to continue?
-ImportPluginWizard_confirm_continue=\n\nAre you sure you want to continue?
-ImportPluginWizard_warn_circular_plugins=Circular references detected among the following plug-ins
-
-SelectConfigsToImport_label1=The following elements will be imported:
-ImportConfigurationWizard_error=Error
-SelectImportConfigurationSource_MSG1=Analyzing
-SelectConfigSpecsToImportPage_title2=Select configuration specifications to import
-SelectImportPluginSource_not_used=not_used
-SelectImportPluginSource_no_path=The specified directory does not exist.
-SelectImportPluginSource_no_dir=No directory specified
-SelectPluginsToImport_label_plugins=Available plug-ins in the import directory:
-SelectPluginsToImport_label_author=Author:
-SelectPluginsToImport_label_version=Version:
-SelectPluginsToImport_label_desc=Brief description:
-ImportConfigurationWizard_readonly=IUPE0201E: Library is read-only.
-PluginImportingService_MSG0=Validating selected plug-ins...
-PluginImportingService_MSG1=The specified path does not contain a valid method plug-in.
-PluginImportingService_MSG3=Importing method plug-in...
-PluginImportingService_MSG5=The selected method plug-in cannot be imported. Its dependent plug-in ''{0}'' cannot be found in the current method library.
-PluginImportingService_MSG6=The selected method plug-in cannot be imported. A dependent plug-in cannot be found in the current method library.
-DiffReportViewer_content=Content
-DiffReportViewer_in_import=In Import
-SelectPluginsToImport_MSG1=Analyzing files...
-DiffReportLabelProvider_yes=Yes
-SelectPluginsToImport_error=Error
-DiffReportViewer_in_lib=In Library
-DiffReportViewer_status=Status
-SelectPluginsToImport_libraryPluginExists=Selected plug-in found in the current library
-SelectPluginsToImport_libraryPluginNotExists=Selected plug-in not found in the current library
-SelectConfigSpecsToImportPage_libraryConfigSpecExists=Configuration found in the current library
-SelectConfigSpecsToImportPage_configSpecNoSelection=No configuration specification selected.
-SelectConfigSpecsToImportPage_configSpecDataLabel=Selected configuration in the import directory
-SelectConfigSpecsToImportPage_label_configs=Available configuration specifications in the import directory:
-SelectImportConfigurationSource_not_used=not_used
-SelectConfigSpecsToImportPage_label_desc=Brief description:
-SelectImportConfigurationSource_no_path=The specified path does not exist.
-SelectPluginsToImport_pluginNoSelection=No plug-in selected.
-SelectImportConfigurationSource_no_dir=No directory specified
-SelectImportConfigurationSource_plugin_readonly=Plug-in {0} is read-only\n
-SelectImportConfigurationSource_plugin_locked=IUPE0203E: Plug-in {0} is locked\n
-SelectImportConfigurationSource_error_not_updatable=Some of the plug-in(s) in the library are either locked or read-only.\n Please unlock the plug-ins and make sure the files are updatable.
-SelectPluginsToImport_pluginDataLabel=Selected plug-in in the import directory
-DiffReportViewer_type=Content Type
-SelectConfigSpecsToImportPage_libraryConfigSpecNotExists=Selected configuration not found in the current library.
-versionMismatch_oldData=IUPE0204E: The specified files were exported by a previous version ({0}) of {1}. The files must be exported using the current version of {1}.
-versionMismatch_oldData_unknown=IUPE0205E: The specified files were exported by a previous version of {0}. The files must be exported using the current version of {0}.
-versionMismatch_oldTool=IUPE0206E: The specified files were exported by a newer version ({0}) of {1}. You must upgrade {1} in order to import the files.  
-versionMismatch_oldTool_unknown=IUPE0207E: The specified files cannot be opened. You must upgrade {0} in order to import the files.
-optionGroup_text=Import option
-checkBaseRadioButton_text=Check base plug-ins
-ignoreRemoveRadioButton_text=Ignore and remove unresolved references
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/package.html b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/package.html
deleted file mode 100644
index 06b9030..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the activator for managing the Import plug-in's life cycle.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/CommandLinePluginImporter.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/CommandLinePluginImporter.java
deleted file mode 100644
index 8bdeb7b..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/CommandLinePluginImporter.java
+++ /dev/null
@@ -1,123 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.common.utils.CommandLineRunner;
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.importing.services.PluginImportData.PluginInfo;
-import org.eclipse.epf.library.xmi.XMILibraryUtil;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Implementation for importing plugin driven by command line
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class CommandLinePluginImporter extends CommandLineRunner {
-
-	private static String ImportPluginsTag = "ImportPlugins"; 	//$NON-NLS-1$"	
-	private static String SelectedPluginTag = "SelectedPlugin"; //$NON-NLS-1$"
-	
-	private static String BaseLibraryFolderUriAtt= "baseLibraryFolderUri";		//$NON-NLS-1$"
-	private static String ImportLibraryFolderUriAtt= "importLibraryFolderUri";		//$NON-NLS-1$"
-	private static String NameAtt= "name";		//$NON-NLS-1$"
-
-	private String baseLibPath;
-	private String importLibPath;
-	
-	private Set<String> selectedPlugins;
-	
-	public boolean execute(String[] args) {
-		if (! super.execute(args)) {
-			return false;
-		}
-		try {
-			loadInputFile();
-			WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-				public void execute(IProgressMonitor monitor) {
-					try {
-						monitor.setTaskName("Openning base library and preparing import ...");//$NON-NLS-1$"
-						XMILibraryUtil.openMethodLibrary(baseLibPath);
-
-						File importLibFolder = new File(importLibPath);
-
-						PluginImportData data = new PluginImportData();
-						data.llData.setLibName(importLibFolder.getName());
-						data.llData.setParentFolder(importLibFolder.getAbsolutePath());
-						final PluginImportingService service = new PluginImportingService(data);
-						service.validate(null);
-						
-						List importPlugins = data.getPlugins();
-						for (int i=0; i < importPlugins.size(); i++) {
-							PluginInfo info = (PluginInfo) importPlugins.get(i);
-							info.selected = selectedPlugins.isEmpty() || selectedPlugins.contains(info.name);							
-						}
-						
-						service.performImport(monitor);
-					} catch (Exception e) {
-						e.printStackTrace();
-					} finally {
-						monitor.done();
-					}
-				}
-			};
-			
-			ProgressMonitorDialog pmDialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
-			pmDialog.run(true, false, operation);
-			
-		} catch (Exception e) {
-			e.printStackTrace();
-			return false;
-		}
-		
-		return true;
-	}
-
-	private void loadInputFile() throws Exception {
-		Document document = XMLUtil.loadXml(getInputFile());	
-		Element root = document.getDocumentElement();
-		if (! root.getTagName().equals(ImportPluginsTag)) {
-			String msg = "The root element must be:  " + ImportPluginsTag;  //$NON-NLS-1$
-			throw new RuntimeException(msg);
-		}
-		baseLibPath = root.getAttribute(BaseLibraryFolderUriAtt);
-		importLibPath = root.getAttribute(ImportLibraryFolderUriAtt);
-		selectedPlugins = new HashSet<String>();
-		
-		NodeList nodes = root.getChildNodes();
-		int sz = nodes == null ? 0 : nodes.getLength();
-		for (int i=0; i<sz; i++) {
-			Node node = nodes.item(i);
-			if (node instanceof Element) {
-				Element element = (Element) node;
-				if (element.getTagName().equals(SelectedPluginTag)) {
-					String name  = element.getAttribute(NameAtt);					
-					selectedPlugins.add(name);
-				}
-			}
-		}		
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigSpecs.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigSpecs.java
deleted file mode 100644
index 2896972..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigSpecs.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.export.services.ConfigurationSpec;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-
-/**
- * Models a list of library configuration specifications.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigSpecs {
-
-	// A list of configuration entries.
-	public List configs = new ArrayList();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigSpecs() {
-	}
-
-	/**
-	 * Returns a new entry.
-	 */
-	public Entry newEntry() {
-		Entry e = new Entry();
-		configs.add(e);
-
-		return e;
-	}
-
-	/**
-	 * Returns a iterator for the config specs.
-	 */
-	public Iterator iterator() {
-		return configs.iterator();
-	}
-
-	public class Entry {
-
-		public ConfigurationSpec configSpec = null;
-
-		public MethodConfiguration existingConfig = null;
-
-		public boolean selected = true;
-
-		public String toString() {
-			if (configSpec != null)
-				if (configSpec.name != null)
-					return configSpec.name;
-			return "unknown configuration specification"; //$NON-NLS-1$
-		}
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigSpecsImportManager.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigSpecsImportManager.java
deleted file mode 100644
index 2d069b3..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigSpecsImportManager.java
+++ /dev/null
@@ -1,192 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.export.services.ConfigurationSpec;
-import org.eclipse.epf.export.services.LibraryDocument;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.UmaFactory;
-import org.w3c.dom.Element;
-
-/**
- * Manages the import of library configuration specifications.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigSpecsImportManager {
-
-	/**
-	 * Creates a new instance.
-	 */
-	ConfigSpecsImportManager() {
-	}
-
-	/**
-	 * Returns the config specs in the document.
-	 */
-	public ConfigSpecs getConfigSpecs(final LibraryDocument document) {
-		final ConfigSpecs configSpecs = new ConfigSpecs();
-
-		// Remove the unneeded configurations.
-		File configDir = new File(document.getFile().getParent(), MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME);			
-		LibraryDocument.ConfigDocVisitor visitor = new LibraryDocument.ConfigDocVisitor() {
-			public void visit(File file, Element node) {
-				ConfigSpecs.Entry entry = configSpecs.newEntry();
-				entry.configSpec = document.getConfigurationSpec(node);
-				entry.existingConfig = getExistingConfig(entry.configSpec.guid);
-			}
-		};			
-		LibraryDocument.visitConfigFiles(configDir, visitor);			
-		return configSpecs;
-	}
-
-	private MethodConfiguration getExistingConfig(String guid) {
-		MethodConfiguration[] configs = LibraryServiceUtil
-				.getMethodConfigurations(LibraryService.getInstance()
-						.getCurrentMethodLibrary());
-		if (configs == null || configs.length == 0) {
-			return null;
-		}
-
-		for (int i = 0; i < configs.length; i++) {
-			MethodConfiguration config = configs[i];
-			if (config.getGuid().equals(guid)) {
-				return config;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Imports the selected library configuration specifications.
-	 * 
-	 * @param specs
-	 *            A library configuration object.
-	 */
-	public void doImport(ConfigSpecs specs) {
-		try {
-			MethodLibrary lib = LibraryService.getInstance()
-					.getCurrentMethodLibrary();
-
-			LibraryUtil.loadAll(lib);
-
-			for (Iterator it = specs.iterator(); it.hasNext();) {
-				ConfigSpecs.Entry entry = (ConfigSpecs.Entry) it.next();
-				if (entry.selected) {
-					MethodConfiguration config = createConfig(entry.configSpec);
-
-					if (entry.existingConfig != null) {
-						// Merge the new plug-ins and packages into the existing
-						// one,
-						// anything in the current configuation should be kept.
-						// EcoreUtil.replace(entry.existingConfig, config);
-						List plugins = entry.existingConfig
-								.getMethodPluginSelection();
-						List pkgs = entry.existingConfig
-								.getMethodPackageSelection();
-						List views = entry.existingConfig.getProcessViews();
-
-						for (Iterator itp = config.getMethodPluginSelection()
-								.iterator(); itp.hasNext();) {
-							Object e = itp.next();
-							if (!plugins.contains(e)) {
-								plugins.add(e);
-							}
-						}
-
-						for (Iterator itp = config.getMethodPackageSelection()
-								.iterator(); itp.hasNext();) {
-							Object e = itp.next();
-							if (!pkgs.contains(e)) {
-								pkgs.add(e);
-							}
-						}
-
-						for (Iterator itp = config.getProcessViews().iterator(); itp
-								.hasNext();) {
-							Object e = itp.next();
-							if (!pkgs.contains(e)) {
-								views.add(e);
-							}
-						}
-					} else {
-						// Add the configuration.
-						lib.getPredefinedConfigurations().add(config);
-					}
-				}
-			}
-
-			LibraryUtil.saveLibrary(lib, false, false);
-
-		} catch (Exception e) {
-			ImportPlugin.getDefault().getLogger().logError(e);
-		}
-
-	}
-
-	private MethodConfiguration createConfig(ConfigurationSpec spec) {
-		MethodConfiguration config = UmaFactory.eINSTANCE
-				.createMethodConfiguration();
-
-		// Set the attributes.
-		config.setName(spec.name);
-		config.setBriefDescription(spec.brief_desc);
-		config.setGuid(spec.guid);
-
-		List plugins = config.getMethodPluginSelection();
-		List pkgs = config.getMethodPackageSelection();
-		List views = config.getProcessViews();
-
-		ILibraryManager manager = LibraryService.getInstance()
-				.getCurrentLibraryManager();
-		if (manager != null) {
-			for (Iterator it = spec.pluginIds.iterator(); it.hasNext();) {
-				String guid = (String) it.next();
-				Object element = manager.getMethodElement(guid);
-				if (element != null && !plugins.contains(element)) {
-					plugins.add(element);
-				}
-			}
-			
-			for (Iterator it = spec.packageIds.iterator(); it.hasNext();) {
-				String guid = (String) it.next();
-				Object element = manager.getMethodElement(guid);
-				if (element != null && !pkgs.contains(element)) {
-					pkgs.add(element);
-				}
-			}
-
-			for (Iterator it = spec.viewIds.iterator(); it.hasNext();) {
-				String guid = (String) it.next();
-				Object element = manager.getMethodElement(guid);
-				if (element != null && !views.contains(element)) {
-					views.add(element);
-				}
-			}
-		}
-
-		return config;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigurationImportData.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigurationImportData.java
deleted file mode 100644
index 154ce61..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigurationImportData.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.authoring.ui.preferences.LibraryLocationData;
-
-
-/**
- * Encapsulates the input data required to import a library configuration.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigurationImportData {
-
-	public LibraryLocationData llData = new LibraryLocationData();
-
-	private ErrorInfo error = new ErrorInfo();
-
-	// If specs != null, it's a configuration specification only.
-	public ConfigSpecs specs = null;
-
-	public List importList = new ArrayList();
-
-	// Indicate if you want to replace existing method packages.
-	public boolean replaceExisting = true;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationImportData() {
-	}
-
-	/**
-	 * Returns the error message if any.
-	 */
-	public ErrorInfo getErrorInfo() {
-		return error;
-	}
-
-	public class ErrorInfo {
-
-		private StringBuffer errorMessage = new StringBuffer();
-
-		public ErrorInfo() {
-		}
-
-		public void addError(String message) {
-			errorMessage.append(message);
-		}
-
-		public String getError() {
-			return errorMessage.toString();
-		}
-
-		public void clear() {
-			errorMessage.setLength(0);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigurationImportService.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigurationImportService.java
deleted file mode 100644
index 03373a8..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ConfigurationImportService.java
+++ /dev/null
@@ -1,480 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.export.services.LibraryDocument;
-import org.eclipse.epf.export.services.PluginExportService;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.project.MethodLibraryProject;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.ui.util.ConvertGuidanceType;
-import org.eclipse.epf.library.ui.util.TypeConverter;
-import org.eclipse.epf.library.ui.wizards.OpenLibraryWizard;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
-
-import com.ibm.icu.util.Calendar;
-
-
-/**
- * Imports a library configuration.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigurationImportService {
-
-	private boolean localDebug = false;
-	
-	private UpgradeCallerInfo upGradeInfo;
-	
-	private ConfigurationImportData data;
-
-	LibraryDocument importingLibDoc = null;
-
-	LibraryDiffManager diffMgr = null;
-
-	ConfigSpecsImportManager specsMgr = null;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationImportService(ConfigurationImportData data) {
-		this.data = data;
-	}
-
-	/**
-	 * Analyzes the imported library with respect to the base library.
-	 */
-	public void analyze(IProgressMonitor monitor) {
-		try {
-			if (monitor != null) {
-				monitor.setTaskName(ImportResources.ConfigurationImportService_MSG0);
-			}
-
-			data.getErrorInfo().clear();
-
-			// Prepare the library files.
-			String path = data.llData.getParentFolder();
-			if (path.indexOf(File.separator + LibraryDocument.libraryFile) < 0) {
-				path += File.separator + LibraryDocument.libraryFile;
-			}
-			File importingLibPath = new File(path);
-			
-			boolean isLibraryFile = true;
-			if (!importingLibPath.exists()) {
-				importingLibPath = new File(importingLibPath.getParentFile(),
-						LibraryDocument.exportFile);
-				isLibraryFile = false;
-			}
-
-			if (!importingLibPath.exists()) {
-				data
-						.getErrorInfo()
-						.addError(
-								NLS.bind(ImportResources.ConfigurationImportService_MSG1, importingLibPath.getParent())); 
-				return;
-			}
-
-			boolean handleVersion = isLibraryFile;
-			if (handleVersion) {
-				upGradeInfo = new ConfigurationImportService.UpgradeInfo(UpgradeCallerInfo.upgradeImportConfig, importingLibPath);
-				if (! handleToolVersion(importingLibPath, upGradeInfo)) {
-					data
-					.getErrorInfo()
-					.addError(
-							NLS.bind(ImportResources.ImportConfigurationWizard_ERR_Import_configuration, importingLibPath.getParent())); 
-
-					return;
-				}
-				if (upGradeInfo.getCopiedLibFile() != null) {
-					importingLibPath = upGradeInfo.getCopiedLibFile();
-				}
-			}
-						
-			importingLibDoc = new LibraryDocument(importingLibPath);
-			
-			if (! handleVersion) {
-				String versionError = versionCheck(importingLibPath.getAbsolutePath(), 
-										ImportResources.importConfigWizard_title);
-				if (versionError != null) {
-					data.getErrorInfo().addError(versionError);
-					return;
-				}
-			}
-
-			boolean isConfigSpecs = importingLibDoc.isConfigSpecsOnly();
-
-			if (isConfigSpecs) {
-
-				specsMgr = new ConfigSpecsImportManager();
-
-				// Scan the library file for configuration information.
-				data.specs = specsMgr.getConfigSpecs(importingLibDoc);
-
-			} else {
-				if (!isLibraryFile) {
-					data
-					.getErrorInfo()
-					.addError(
-							NLS.bind(ImportResources.ConfigurationImportService_MSG1, importingLibPath.getParent())); 
-					return;
-				}
-				data.specs = null;
-
-				// Open the library and compare the difference.
-				
-				// need to open and close the library to have the project resources initialized properly
-				String libDir = importingLibPath.getParentFile().getAbsolutePath();
-
-				String projectName = "Configuration Import Project (" //$NON-NLS-1$
-						+ Integer.toHexString(libDir.hashCode()) + ")"; //$NON-NLS-1$
-				
-				MethodLibraryProject.openProject(libDir, projectName, monitor);
-				try {
-					MethodLibrary importLibraty = LibraryUtil
-							.loadLibrary(importingLibPath.getAbsolutePath());
-					MethodLibrary baseLibrary = LibraryService.getInstance()
-							.getCurrentMethodLibrary();
-					
-					handleTypeChanges(baseLibrary, importLibraty);
-					
-					String baseLibDir = null;
-					try {	//Not neccessary, but prevent introducing any potential regression due to this change
-						File bFile = new File(baseLibrary.eResource().getURI().toFileString()).getParentFile();;
-						baseLibDir = bFile.getAbsolutePath();
-					} catch (Throwable e) {						
-					}
-					if (libDir.equalsIgnoreCase(baseLibDir)) {
-						data
-								.getErrorInfo()
-								.addError(
-										NLS.bind(ImportResources.ConfigurationImportService_MSG2, importingLibPath.getParent())); 
-						return;
-					}
-					
-					fixImportLibrarySystemPackageGUIDs(baseLibrary, importLibraty);
-					
-					diffMgr = new LibraryDiffManager(baseLibrary, importLibraty);
-					diffMgr.buildDiffTree();
-					
-					if (localDebug) {
-						diffMgr.rootDiffTree.debugDump();
-					}
-					
-				} catch (RuntimeException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-				MethodLibraryProject.closeProject(libDir, monitor);
-				MethodLibraryProject.deleteProject(libDir, monitor);
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-
-	}
-
-	/**
-	 * Returns the import data.
-	 */
-	public ConfigurationImportData getImportData() {
-		return data;
-	}
-
-	/**
-	 * Returns spec only attribute.
-	 */
-	public boolean isSpecsOnly() {
-		return (data.specs != null);
-	}
-
-	/**
-	 * Returns the diff tree.
-	 */
-	public ElementDiffTree getDiffTree() {
-		return diffMgr.getDiffTree();
-	}
-
-	/**
-	 * Returns the import library.
-	 */
-	public MethodLibrary getImportingLibrary() {
-		return diffMgr.getImportingLibrary();
-	}
-
-	/**
-	 * Performs the import.
-	 */
-	public void performImport(final IProgressMonitor monitor) {
-		
-		// need to disable the workspace refreshing
-		boolean refresh = RefreshJob.getInstance().isEnabled();
-		if(refresh) {
-			// disable resource refreshing during import
-			//
-			RefreshJob.getInstance().setEnabled(false);
-		}
-		
-		try {
-			if (monitor != null) {
-				monitor.setTaskName(ImportResources.ConfigurationImportService_MSG3);
-			}
-
-			if (isSpecsOnly()) {
-				specsMgr.doImport(data.specs);
-			} else {
-				LibraryImportManager importingMgr = new LibraryImportManager(diffMgr, data.importList);			
-				importingMgr.doMerge(data.replaceExisting, monitor);
-			}
-			
-			// refresh library files in workspace
-			//
-			MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-			ResourceUtil.refreshResources(lib, monitor);
-			
-		} catch (Exception e) {
-			ImportPlugin.getDefault().getLogger().logError(e);
-		} finally {
-			if(refresh) {
-				// re-enable resource refreshing 
-				//
-				RefreshJob.getInstance().setEnabled(true);
-			}
-			if (upGradeInfo != null) {
-				upGradeInfo.removeCopiedLibrary();
-				upGradeInfo = null;
-			}
-		}	
-		
-		try {
-			// Reopen the library.
-			LibraryService.getInstance().reopenCurrentMethodLibrary();		
-
-		} catch (Exception e) {
-			ImportPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-	
-	/**
-	 * Checks the tool version.
-	 */
-	public static String versionCheck(final String xmlPath, final String title) {
-		final String[] ret = new String[1];
-		ret[0] = null;
-		SafeUpdateController.syncExec(new Runnable() {	
-			public void run() {				
-				VersionUtil.VersionCheckInfo info = VersionUtil.checkLibraryVersion(new File(xmlPath));
-				if (info == null) {
-					ret[0] = NLS.bind(ImportResources.versionMismatch_oldData_unknown, new Object[] {
-							Platform.getProduct().getName()});					
-				} else {
-					if (info.result < 0) {
-						if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
-							ret[0] = NLS.bind(ImportResources.versionMismatch_oldData, new Object[] {
-									info.toolVersion, Platform.getProduct().getName()});
-						} else {
-							ret[0] = NLS.bind(ImportResources.versionMismatch_oldData_unknown, new Object[] {
-									Platform.getProduct().getName()});					
-						}
-					} else if (info.result > 0) {
-						if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
-							ret[0] = NLS.bind(ImportResources.versionMismatch_oldTool, new Object[] {
-									info.toolVersion, Platform.getProduct().getName()});
-						} else {
-							ret[0] = NLS.bind(ImportResources.versionMismatch_oldTool_unknown, new Object[] {
-									Platform.getProduct().getName()});
-						}
-					} 
-				}
-				if (ret[0] != null) {
-					ImportPlugin.getDefault().getMsgDialog().displayError(title, ret[0]);					
-				}
-			}
-		});		
-		return ret[0];
-	}
-	
-	/**
-	 * Fixes the imported library's system package guids with those base's.
-	 */
-	public static void fixImportLibrarySystemPackageGUIDs(MethodLibrary baseLibrary, MethodLibrary importLibraty) {
-		HashMap pluginsMap = new HashMap();
-		List plugins = baseLibrary.getMethodPlugins();
-		for (int i=0; i < plugins.size(); i++) {
-			MethodPlugin plugin = (MethodPlugin) plugins.get(i);
-			pluginsMap.put(plugin.getGuid(), plugin);
-		}
-		if (pluginsMap.isEmpty()) {
-			return;
-		}
-		
-		List importPluginsToFix = new ArrayList();
-		List importPlugins = importLibraty.getMethodPlugins();
-		for (int i=0; i < importPlugins.size(); i++) {
-			MethodPlugin plugin = (MethodPlugin) importPlugins.get(i);
-			if (pluginsMap.containsKey(plugin.getGuid())) {
-				importPluginsToFix.add(plugin);
-			}
-		}
-		
-		for (int i=0; i < importPluginsToFix.size(); i++) {
-			MethodPlugin importPlugin = (MethodPlugin) importPluginsToFix.get(i);
-			MethodPlugin basePlugin = (MethodPlugin) pluginsMap.get(importPlugin.getGuid());
-			if (basePlugin == null) {
-				continue;
-			}
-			List importPackages = TngUtil.getAllSystemPackages(importPlugin);
-			HashMap importPackageMap = new HashMap();
-			for (int j=0; j < importPackages.size(); j++) {
-				MethodElement importPackage = (MethodElement) importPackages.get(j);
-				importPackageMap.put(importPackage.getName(), importPackage);
-			}
-			
-			List basePackages = TngUtil.getAllSystemPackages(basePlugin);			
-			for (int j=0; j < basePackages.size(); j++) {
-				MethodElement basePackage = (MethodElement) basePackages.get(j);
-				MethodElement importPackage = (MethodElement) importPackageMap.get(basePackage.getName());
-				if (importPackage == null) {
-					continue;
-				}
-				String guid = basePackage.getGuid();
-				if (! importPackage.getGuid().equals(guid)) {
-					importPackage.setGuid(guid);
-				}
-			}
-		}			
-	}
-	
-	private void handleTypeChanges(MethodLibrary baseLib, MethodLibrary importLib) {
-		HashMap baseMap = new HashMap();
-		collectPotentialTypeChanged(baseLib, baseMap);
-		HashMap importMap = new HashMap();
-		collectPotentialTypeChanged(importLib, importMap);
-		handleTypeChanges(baseMap, importMap);
-	}
-
-	/**
-	 * Handles MethodElement type changes. Note: for MethodElement objects in importMap
-	 * only eClass type is used in this method.
-	 */
-	public static void handleTypeChanges(HashMap baseMap, HashMap importMap) {
-		ArrayList toChangeList = new ArrayList();
-		for (Iterator it = importMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Map.Entry) it.next();
-			Object guid = entry.getKey();
-			MethodElement baseElem = (MethodElement) baseMap.get(guid);
-			if (baseElem != null) {
-				MethodElement elem = (MethodElement) entry.getValue();
-				if (! elem.eClass().equals(baseElem.eClass())) {
-					MethodElement elemPair[] = new MethodElement[] {baseElem, elem};
-					toChangeList.add(elemPair);
-				}
-			}			
-		}
-		for (int i=0; i<toChangeList.size(); i++) {
-			MethodElement elemPair[] = (MethodElement[]) toChangeList.get(i);
-			final MethodElement baseElem = elemPair[0];
-			final MethodElement importElem = elemPair[1];
-			if (baseElem instanceof Guidance) {
-				Display.getDefault().syncExec(new Runnable() {
-					public void run() {
-						ConvertGuidanceType.convertGuidance((Guidance) baseElem, MsgBox.getDefaultShell(), null, importElem.eClass());
-					}
-				});
-			} else if (baseElem instanceof Activity) {
-				TypeConverter.convertActivity((Activity) baseElem, importElem.eClass()); 
-			}
-		}
-	}
-
-	/**
-	 * Collects elements in lib that may have type changes 
-	 */
-	public static void collectPotentialTypeChanged(MethodLibrary lib, HashMap map) {
-		for (Iterator it = lib.eAllContents(); it.hasNext();) {
-			Object obj = it.next();
-			if (obj instanceof Guidance ||
-				obj instanceof Activity) {
-				MethodElement elem = (MethodElement) obj;
-				map.put(elem.getGuid(), elem);
-			}
-		}
-	}
-	
-	public static boolean handleToolVersion(File libFile, final UpgradeCallerInfo info) {
-		final String libFolderPath = libFile.getParentFile().getAbsolutePath();
-		final boolean ret[] = new boolean[1];
-		SafeUpdateController.syncExec(new Runnable() {	
-			public void run() {
-				ret[0] = OpenLibraryWizard.handleToolVersion(libFolderPath, info);
-			}
-		});								
-		return ret[0];
-	}	
-
-	public static class UpgradeInfo extends UpgradeCallerInfo {
-		
-		public UpgradeInfo(int callerType, File libFile) {
-			super(callerType, libFile);
-		}
-		
-		public void copyLibrary() {
-			String userHome = System.getProperty("user.home"); //$NON-NLS-1$
-			String desLibFolderPath = userHome + File.separator
-					+ "EPF" + File.separator + "Export" + File.separator //$NON-NLS-1$ //$NON-NLS-2$
-					+ Long.toHexString(Calendar.getInstance().getTimeInMillis()) + File.separator;		
-			File desLibFolder = new File(desLibFolderPath);
-			if (!desLibFolder.exists()) {
-				desLibFolder.mkdirs();
-			} else {
-				FileUtil.deleteAllFiles(desLibFolder.getAbsolutePath());
-			}
-			
-			PluginExportService.copyDir(getLibFile().getParentFile(), desLibFolder);
-			setCopiedLibFile(new File(desLibFolderPath + getLibFile().getName()));
-		}
-		
-		public void removeCopiedLibrary() {
-			if (getCopiedLibFile() == null) {
-				return;
-			}
-			FileUtil.deleteAllFiles(getCopiedLibFile().getParentFile().getAbsolutePath());
-			getCopiedLibFile().getParentFile().delete();
-			setCopiedLibFile(null);
-		}
-	};	
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/DirCopy.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/DirCopy.java
deleted file mode 100644
index b51c487..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/DirCopy.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.epf.services.Services;
-
-
-/**
- * utility class to copy files from one dir to another, and delete the un-needed files from source dir.
- *
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DirCopy {
-
-	//private IStatus fileCheckedOutStatus = null;
-	
-	File srcDir;
-	File targetDir;
-	
-	// new files to be added to the target
-	List newFiles = new ArrayList();
-	
-	// files exists in both src and target dir
-	List oldFiles = new ArrayList();
-	
-	// files only in target dir, these files are treated as deleted in the src folder.
-	List deletedFiles = new ArrayList();
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public DirCopy(File srcDir, File targetDir) {
-		this.srcDir = srcDir;
-		this.targetDir = targetDir;
-		
-		prepare();
-	}
-	
-	private static String CP_FODLER = MultiFileSaveUtil.CAPABILITY_PATTERN_PATH + "/"; //$NON-NLS-1$
-	private static String DP_FODLER = MultiFileSaveUtil.DELIVERY_PROCESS_PATH + "/"; //$NON-NLS-1$
-	
-	/**
-	 * check out the existing files, delete the files from cm, and add new files, copy the files over
-	 *
-	 */
-	public IStatus execute() {
-			
-		// check out files
-		List files = new ArrayList();
-		for ( Iterator it = oldFiles.iterator(); it.hasNext(); ) {
-			String path = (String)it.next();						
-			if (needCopy(new File(srcDir, path), new File(targetDir, path))) {	//154321
-				files.add(new File(targetDir, path).getAbsolutePath());
-			}
-		}
-		
-		IStatus fileCheckedOutStatus = FileModifyChecker.checkModify(files);
-		
-		if ( !fileCheckedOutStatus.isOK() ) {
-			return fileCheckedOutStatus;
-		}
-			
-		// delete files
-		IFileManager fileMgr = Services.getFileManager();
-		for ( Iterator it = deletedFiles.iterator(); it.hasNext(); ) {
-			String path = (String)it.next();
-			File f = new File(targetDir, path);
-			fileMgr.delete(f.getAbsolutePath());
-			
-			// delete the empty CP and DP folder
-			path = path.replace(File.separatorChar, '/'); 
-			if ( path.startsWith(CP_FODLER) || path.startsWith(DP_FODLER) ) {
-				File folder = f.getParentFile();
-				String[] items = folder.list();
-				if ( items == null || items.length == 0 ) {
-					fileMgr.delete(folder.getAbsolutePath());				
-				}
-			}
-		}	
-		
-		// copy old files
-		for ( Iterator it = oldFiles.iterator(); it.hasNext(); ) {
-			String path = (String)it.next();
-			FileUtil.copyFile(new File(srcDir, path), new File(targetDir, path));
-		}
-		
-		// copy new files
-		for ( Iterator it = newFiles.iterator(); it.hasNext(); ) {
-			String path = (String)it.next();
-			FileUtil.copyFile(new File(srcDir, path), new File(targetDir, path));
-		}
-		
-		return fileCheckedOutStatus;
-	}
-	
-	
-	private void prepare() {
-		List allSrcFiles = getAllFiles(srcDir);
-		List allTargetFiles = getAllFiles(targetDir);
-
-		while ( allTargetFiles.size() > 0 ) {
-			String path = (String)allTargetFiles.remove(0);
-			if ( allSrcFiles.contains(path) ) {
-				oldFiles.add(path);
-				allSrcFiles.remove(path);
-			} else {
-				deletedFiles.add(path);
-			}
-		}
-		
-		// the remaining files in the target list is the new files
-		newFiles.addAll(allSrcFiles);
-	}
-	
-	/**
-	 * get all the files with relative path to the root
-	 * @param dir the root dir
-	 * @return List all files in the dir, with relative path to the root
-	 */
-	private List getAllFiles(File dir) {
-		List files = new ArrayList();
-		FileUtil.getAllFiles(dir, files, true);
-
-		// convert to list of path, not File
-		URI baseUrl = dir.toURI();
-		
-		int i = 0;
-		while ( i < files.size() ) {
-			File f = (File)files.get(i);
-			if ( canIgnore(f.getAbsolutePath()) || canIgnore(f)) {
-				files.remove(i);
-			} else {
-				URI rel = baseUrl.relativize(f.toURI());
-				files.set(i, rel.getPath());	
-				i++;
-			}
-		}
-
-		return files;
-	}
-	
-	private static final String CVS_FOLDER = File.separator + "CVS" + File.separator; //$NON-NLS-1$
-	private static final String SVN_FOLDER = File.separator + ".svn" + File.separator; //$NON-NLS-1$
-
-	private boolean canIgnore(String path) {
-		if ( path.indexOf(CVS_FOLDER) >=0 ) {
-			return true;
-		}
-		if ( path.indexOf(SVN_FOLDER) >=0 ) {
-			return true;
-		}
-		
-		return false;
-	}
-	
-	private static final String[] ignoreFiles = {
-									".copyarea.dat", //$NON-NLS-1$
-									".copyarea.db" //$NON-NLS-1$
-									};			
-	private boolean canIgnore(File file) {
-		String name = file.getName();
-		for (int i=0; i<ignoreFiles.length; i++) {
-			if (name.equals(ignoreFiles[i])) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Checks to see if the copy action is needed.
-	 */
-	public static boolean needCopy(File source, File dest) {
-		boolean ret = true;
-		if (dest.exists()) {
-			ret = (dest.lastModified() != source.lastModified())
-					|| (dest.length() != source.length());
-		}
-		return ret;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ElementDiffTree.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ElementDiffTree.java
deleted file mode 100644
index b1b8190..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ElementDiffTree.java
+++ /dev/null
@@ -1,281 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-
-/**
- * Displays the element differences in a tree.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ElementDiffTree {
-
-	public static final int DIFF_STATE_SAME = 0;
-
-	public static final int DIFF_STATE_NEW = 1;
-
-	public static final int DIFF_STATE_CHANGED = 4;
-
-	public static final int DIFF_STATE_OLD_ONLY = 5;
-
-	private MethodElement e1;
-
-	private MethodElement e2;
-
-	// The parent in the base library if e2 is a new element.
-	private MethodElement e1_parent;
-
-	private ElementDiffTree parent = null;
-
-	// Define the diff state of the second element compared to the first one.
-	private int diffState = DIFF_STATE_SAME;
-
-	private List children = new ArrayList();
-
-	private boolean hasDirtyChild = false;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ElementDiffTree(MethodElement e1, MethodElement e2) {
-		this(e1, e2, null);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ElementDiffTree(MethodElement e1, MethodElement e2,
-			MethodElement e1_parent) {
-		this.e1_parent = e1_parent;
-		this.e1 = e1;
-		this.e2 = e2;
-
-		resolveDiffState();
-	}
-	
-	/**
-	 * Returns the base method element.
-	 */
-	public MethodElement getBaseElement() {
-		return e1;
-	}
-
-	/**
-	 * Returns the base method element's parent.
-	 */
-	public MethodElement getBaseParentElement() {
-		return e1_parent;
-	}
-
-	/**
-	 * Returns the import method element.
-	 */
-	public MethodElement getImportElement() {
-		return e2;
-	}
-
-	/**
-	 * Checks whether the element is new to the library.
-	 */
-	public boolean isNew() {
-		return (e1 == null) && (e2 != null);
-	}
-
-	/**
-	 * Checks whether the element exists only in the library and not in the
-	 * configuration to be imported.
-	 */
-	public boolean isOldOnly() {
-		return (e1 != null) && (e2 == null);
-	}
-
-	/**
-	 * Returns true if both base and import elements are not null, 
-	 * otherwise returns false.
-	 */
-	public boolean isBoth() {
-		return (e1 != null) && (e2 != null);
-	}
-
-	/**
-	 * Adds a child node.
-	 */
-	public void addChild(ElementDiffTree child) {
-		children.add(child);
-		child.setParent(this);
-	}
-
-	/**
-	 * hasDirtyChild attribute.
-	 */
-	public boolean hasDirtyChild() {
-		return this.hasDirtyChild;
-	}
-
-	/**
-	 * Sets hasDirtyChild attribute.
-	 */
-	public void setDirtyChild(boolean flag) {
-		hasDirtyChild = hasDirtyChild || flag;
-		if (hasDirtyChild && parent != null) {
-			parent.setDirtyChild(hasDirtyChild);
-		}
-	}
-
-	private void setParent(ElementDiffTree parent) {
-		this.parent = parent;
-		if (diffState != DIFF_STATE_SAME && parent != null) {
-			parent.setDirtyChild(true);
-		}
-	}
-
-	/**
-	 * Returns the parent.
-	 */
-	public ElementDiffTree getParent() {
-		return this.parent;
-	}
-
-	/**
-	 * hasChildren attribute.
-	 */
-	public boolean hasChildren() {
-		return (children != null) && (children.size() > 0);
-	}
-
-	/**
-	 * Returns the child list.
-	 */
-	public List getChildren() {
-		return children;
-	}
-
-	/**
-	 * Returns the diff state of the second element comparing to the first one.
-	 */
-	public int getDiffState() {
-		return diffState;
-	}
-
-	/**
-	 * Returns a message string.
-	 */
-	public String getDiffMessage() {
-		return "[" + getVersion(e1) + "] : [" + getVersion(e2) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	private void resolveDiffState() {
-		// how to fidd two elements?
-		// 1. attributes
-		// 2. version number
-		// 3. children
-		// 4. references
-		// 5. ...
-		if (e1 == null) {
-			diffState = DIFF_STATE_NEW;
-		} else if (e2 == null) {
-			diffState = DIFF_STATE_OLD_ONLY;
-		} else {
-			if (e1 instanceof MethodLibrary) {
-				diffState = DIFF_STATE_SAME;
-			} else {
-				diffState = DIFF_STATE_CHANGED;
-			}
-		}
-	}
-
-	private String getVersion(MethodElement element) {
-		if (element == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		return getPackage(element).getVersion();
-	}
-
-	private org.eclipse.epf.uma.MethodUnit getPackage(MethodElement element) {
-		if (element instanceof org.eclipse.epf.uma.MethodUnit) {
-			return (org.eclipse.epf.uma.MethodUnit) element;
-		}
-
-		return getPackage((MethodElement) element.eContainer());
-	}
-
-	// Utility method to get the element information.
-	/**
-	 * Returns the name.
-	 */
-	public String getName() {
-		if (e1 != null) {
-			return e1.getName();
-		}
-		if (e2 != null) {
-			return e2.getName();
-		} else {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Returns the content type.
-	 */
-	public String getContentType() {
-		MethodElement e = e1;
-		if (e == null) {
-			e = e2;
-		}
-
-		if (e != null) {
-			return e.getType().getName();
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-	
-	public void debugDump() {
-		debugDump(0, ""); //$NON-NLS-1$
-	}
-	
-	private void debugDump(int level, String indent) {
-		String line = null;
-		if (e1 == null) {
-			line = "null"; //$NON-NLS-1$
-		} else {
-			line = e1.getGuid() + ", " + e1.getName() + ", " + e1.eClass().getName(); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		outLn(level, indent, line);
-		
-		if (e2 == null) {
-			line = "null"; //$NON-NLS-1$
-		} else {
-			line = e2.getGuid() + ", " + e2.getName() + ", " + e2.eClass().getName(); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		outLn(level, indent, line);
-		System.out.println(""); //$NON-NLS-1$
-		
-		for (int i=0; i < children.size(); i++) {
-			ElementDiffTree child = (ElementDiffTree) children.get(i);
-			child.debugDump(level + 1, indent + "   "); //$NON-NLS-1$
-		}		
-	}
-	
-	private void outLn(int level, String indent, String line) {
-		String str = indent + level + ": " + line; //$NON-NLS-1$
-		System.out.println(str);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/FileModifyChecker.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/FileModifyChecker.java
deleted file mode 100644
index 699828a..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/FileModifyChecker.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.epf.services.Services;
-
-
-/**
- * utility class to check files for modifications
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class FileModifyChecker {
-
-	/**
-	 * Checks modification status of the given list of files.
-	 */
-	public static IStatus checkModify(List modifiedFiles) {
-		
-		try {
-			String[] paths = new String[modifiedFiles.size()];
-			modifiedFiles.toArray(paths);
-			
-			IFileManager fileMgr = Services.getFileManager();
-			IStatus status = fileMgr.checkModify(paths, MsgBox.getDefaultShell());
-
-			// make sure all the files are updatable			
-			List readonlyFiles = new ArrayList();
-			for (int i = 0; i < paths.length; i++ ) {
-				File f = new File(paths[i]);
-				if ( f.exists() && !f.canWrite() ) {
-					readonlyFiles.add(paths[i]);
-				}
-			}
-			
-			if ( readonlyFiles.size() > 0 ) {
-				String title = ImportResources.FileModifyChecker_Checkout_failed_title; 
-				String msg = ImportResources.FileModifyChecker_Checkout_failed_msg; 
-				if ( new MsgDialog(ImportPlugin.getDefault()).displayPrompt(title, msg) ) {
-					return checkModify(readonlyFiles);
-				}
-			}		
-			return status;
-			
-		} catch (Throwable e) {
-			e.printStackTrace();
-			return new Status(IStatus.ERROR, ImportPlugin.getDefault()
-					.getId(), 0, e.getMessage() == null ? "" : e.getMessage(), null); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Checks modification status of the given list of files.
-	 */
-	public static IStatus syncExecCheckModify(final List modifiedFiles) {
-		final IStatus[] ret = new IStatus[1];
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				ret[0] = FileModifyChecker.checkModify(modifiedFiles);
-			}
-		});
-		return ret[0];
-	}
-	
-	/**
-	 * Retruns the modified file list of the given resource set.
-	 */
-	public static List getModifiedFiles(ResourceSet resourceSet) {
-		List ret = new ArrayList();
-		for (Iterator it = resourceSet.getResources().iterator(); it.hasNext();) {
-			Resource res = (Resource) it.next();
-			if (res != null && res.isModified()) {
-				ret.add(res.getURI().toFileString());
-			}
-		}
-		return ret;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/LibraryDiffManager.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/LibraryDiffManager.java
deleted file mode 100644
index b1d14ae..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/LibraryDiffManager.java
+++ /dev/null
@@ -1,299 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Point;
-
-
-/**
- * Manages the differences between method elements in the current library and
- * those that will be imported.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LibraryDiffManager {
-
-	private MethodLibrary baseLibrary;
-
-	private MethodLibrary importLibraty;
-
-	// Map of uid to ElementDiffTree, the root of the ElementDiffTree is the
-	// library.
-	private Map diffElementMap = new HashMap();
-
-	// Map of uid to element for import library configuration.
-	private Map importElementMap = new HashMap();
-
-	// id to element map of the current library.
-	private Map currentElementMap = new HashMap();
-
-	// The diff tree.
-	ElementDiffTree rootDiffTree = null;
-
-	private boolean debug = ImportPlugin.getDefault().isDebugging();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryDiffManager(MethodLibrary baseLibrary,
-			MethodLibrary importLibraty) {
-		this.baseLibrary = baseLibrary;
-		this.importLibraty = importLibraty;
-
-		rootDiffTree = new ElementDiffTree(baseLibrary, importLibraty);
-	}
-
-	/**
-	 * Returns the import library.
-	 */
-	public MethodLibrary getImportingLibrary() {
-		return this.importLibraty;
-	}
-
-	/**
-	 * Builds the difference tree.
-	 */
-	public ElementDiffTree buildDiffTree() {
-		// Build the uid to element map for the import library.
-		buildUIDMap(importLibraty.eContents(), importElementMap, true, false);
-
-		buildUIDMap(baseLibrary.eContents(), currentElementMap, true, true);
-
-		// Get all the system packages in each plug-in so we can filter out
-		// those packages when comparing the libraries.
-
-		// Iterate the element in the current library, and build a diff tree by
-		// comparing to the import library.
-		List plugins = baseLibrary.getMethodPlugins();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			List systemPackages = TngUtil.getAllSystemPackages(plugin);
-			
-			// content category packages should be included into the diff tree 
-			// otherwise the category information will be lost
-			List categoryList = TngUtil.getContentCategoryPackages(plugin);
-			for ( Iterator itc = categoryList.iterator(); itc.hasNext(); ) {
-				Object o = itc.next();
-				if ( systemPackages.contains(o) ) {
-					systemPackages.remove(o);
-				}
-			}
-			
-			// the root customcategoty package needs to be included into the diff tree
-			int i = 0;
-			while (i < systemPackages.size() ) {
-				MethodPackage pkg = (MethodPackage)systemPackages.get(i);
-				if ( TngUtil.isRootCutomCategoryPackage(pkg) ) {
-					systemPackages.remove(pkg);
-					break;
-				} else {
-					i++;
-				}
-			}
-			
-			// Build the diff tree by iterating the current library.
-			iterateElement(plugin, rootDiffTree, systemPackages);
-		}
-
-		List configs = baseLibrary.getPredefinedConfigurations();
-		for (Iterator it = configs.iterator(); it.hasNext();) {
-			MethodConfiguration config = (MethodConfiguration) it.next();
-
-			// Build the diff tree by iterating the current library.
-			iterateElement(config, rootDiffTree, new ArrayList());
-		}
-
-		// Process the new elements in the import library and add them to the
-		// diff tree.
-		handleNewElements(importLibraty);
-
-		return rootDiffTree;
-	}
-
-	/**
-	 * Returns the differnece tree.
-	 */
-	public ElementDiffTree getDiffTree() {
-		return rootDiffTree;
-	}
-
-	/**
-	 * Returns the differnece map.
-	 */
-	public Map getDiffTreeMap() {
-		return diffElementMap;
-	}
-
-	/**
-	 * Iterates the element in the current library and build a diff tree by
-	 * comparing to the import library.
-	 */
-	private void iterateElement(MethodElement element,
-			ElementDiffTree diffTree, List systemPackages) {
-		if (!selectable(element)) {
-			return;
-		}
-
-		// Update the diffelement UID map.
-		if (!systemPackages.contains(element)
-				&& !(element instanceof MethodLibrary)) {
-			String uid = element.getGuid();
-			ElementDiffTree diffChild = new ElementDiffTree(element,
-					(MethodElement) importElementMap.get(uid));
-			diffElementMap.put(uid, diffChild);
-			diffTree.addChild(diffChild);
-			diffTree = diffChild;
-		}
-
-		// Check with the importing element and create an ElementDiffInfo object
-		EList children = element.eContents();
-		if (children != null) {
-			for (Iterator it = children.iterator(); it.hasNext();) {
-				Object e = it.next();
-				if (e instanceof MethodElement) {
-					MethodElement child = (MethodElement) e;
-					if (selectable(child)) {
-						iterateElement(child, diffTree, systemPackages);
-					}
-				} else {
-					if (debug ) {
-						System.out
-								.println("Error! " + e + " is not a MethodElement object"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * If there are newly added elements in the importing library, add the new
-	 * elements into the parent
-	 */
-	private void handleNewElements(MethodElement element) {
-		if (!selectable(element)) {
-			return;
-		}
-
-		if (isNewElement(element)) {
-			// This is a new element, find the parent in the base library.
-			MethodElement parent = (MethodElement) element.eContainer();
-			while (isNewElement(parent)) {
-				element = parent;
-				parent = (MethodElement) parent.eContainer();
-			}
-
-			// Always merge libray plugins even it's from a different library.
-			if (parent instanceof MethodLibrary) {
-				parent = baseLibrary;
-			}
-
-			// Need to find the parent element in the current library so that we
-			// know where to add the new element.
-			MethodElement lib_parent = (MethodElement) currentElementMap
-					.get(parent.getGuid());
-			if (lib_parent == null) {
-				lib_parent = baseLibrary;
-			}
-			ElementDiffTree elementDiffTree = new ElementDiffTree(null,
-					element, lib_parent);
-
-			// Find the parent diff tree.
-			ElementDiffTree parentDiffTree = null;
-			while ((parentDiffTree == null) && (parent != null)) {
-				parentDiffTree = (ElementDiffTree) diffElementMap.get(parent
-						.getGuid());
-				parent = (MethodElement) parent.eContainer();
-			}
-
-			if (parentDiffTree == null) {
-				parentDiffTree = rootDiffTree;
-			}
-
-			parentDiffTree.addChild(elementDiffTree);
-		} else {
-			// Iterate the children.
-			List children = element.eContents();
-			for (Iterator itc = children.iterator(); itc.hasNext();) {
-				Object obj = itc.next();
-				if (obj instanceof MethodElement) {
-					MethodElement e = (MethodElement) obj; 
-					handleNewElements(e);
-				}
-			}
-
-		}
-	}
-
-	private boolean isNewElement(MethodElement element) {
-		if (element == null || element instanceof MethodLibrary) {
-			return false;
-		}
-		return !currentElementMap.containsKey(element.getGuid());
-	}
-
-	private void buildUIDMap(List elements, Map elementUIDMap, boolean recursive, boolean full) {
-		MethodElement element;
-		for (Iterator it = elements.iterator(); it.hasNext();) {
-			Object e = it.next();
-			if (e instanceof MethodElement) {
-				element = (MethodElement) e;
-				if (selectable(element) || full) {
-					String uid = element.getGuid();
-					elementUIDMap.put(uid, element);
-
-					if (recursive) {
-						buildUIDMap(element.eContents(), elementUIDMap,
-								recursive, full);
-					}
-				}
-			} else if ( !(e instanceof Point || e instanceof Dimension || e instanceof MethodElementProperty) ){
-				ImportPlugin.getDefault().getLogger().logError(
-							"Import error. " + e + " is not a MethodElement object"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-	}
-
-	/**
-	 * Checks if the method element is selectable.
-	 */
-	public boolean selectable(MethodElement element) {
-		return (element instanceof MethodLibrary
-				|| element instanceof MethodPlugin
-				|| element instanceof MethodPackage
-				|| element instanceof MethodConfiguration);
-	}
-
-	/**
-	 * Returns the existing method element given by the guid.
-	 */
-	public MethodElement getExistingElement(String guid) {
-		return (MethodElement)currentElementMap.get(guid);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/LibraryImportManager.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/LibraryImportManager.java
deleted file mode 100644
index cf5a676..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/LibraryImportManager.java
+++ /dev/null
@@ -1,1753 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.export.services.DiagramHandler;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileXMIHelperImpl;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * Manages the importing of a library.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LibraryImportManager {
-
-	private Map<String, String> renamePluginMap = new HashMap<String, String>();
-	private Map renameElementMap = new HashMap();
-	private Map setElementMap = null;
-
-	private LibraryDiffManager diffMgr;
-	private ElementDiffTree rootTree;
-	
-	private boolean configFolderError = false;
-
-	//protected AdapterFactoryEditingDomain editingDomain = null;
-
-	//protected AdapterFactoryContentProvider afcp = null;
-
-	private MethodLibrary baseLibrary = null;
-	private MethodLibrary importingLibrary = null;
-
-	// guid of replaced element id to the element in the base library
-	// we need this to redirect the reference of new elements from the importing
-	// libraty to the base library
-	private Map replacedElementMap = new HashMap();
-
-	// keep the new elements, we need to iterate their feature value and
-	// redirect the valeu element
-	// from the importing library to the base library
-	private List newElements = new ArrayList();
-		
-	// deleted elements,
-	private List deletedElements = new ArrayList();
-	
-	private boolean debug = ImportPlugin.getDefault().isDebugging();
-	
-	// list of user selected items to be imported
-	List checkedList = new ArrayList();
-	
-	// flag to indicate the file cheout status
-	IStatus fileCheckedOutStatus = null;
-	
-	// resource file path for new resoruces
-	List newResources = new ArrayList();
-	
-	ResourceScanner resScanner;
-	
-	private DiagramHandler diagramHandler;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryImportManager(LibraryDiffManager diffMgr,
-			List checkedItems) {
-		this.diffMgr = diffMgr;
-		this.rootTree = diffMgr.getDiffTree();
-		
-		if ( checkedItems != null ) {
-			// checkedList contains a list of ElementDiffTree objects
-			// get the packages as well
-			this.checkedList.addAll(checkedItems);
-			for (Iterator it = checkedItems.iterator(); it.hasNext(); ) {
-				ElementDiffTree diffTree = (ElementDiffTree) it.next();
-				MethodElement e = diffTree.getBaseElement();
-				if ( e != null ) {
-					checkedList.add(e);
-				}
-								
-				if ( e instanceof ProcessComponent ) {
-					LibraryUtil.getAllChildPackages((MethodPackage)e, checkedList);
-				}
-				
-				// also incldue the hidden root custom package if the package is the CustomCategories package
-				// 150895 - Import Config: CustomCategory did not sync up by import
-				if ( e instanceof MethodPackage ) {
-					List children = ((MethodPackage)e).getChildPackages();
-					if ( children.size() == 1 ) {
-						MethodPackage pkg  = (MethodPackage)children.get(0);
-						if ( TngUtil.isRootCutomCategoryPackage(pkg) ) {
-							checkedList.add(pkg);
-						}
-					}
-				}
-				
-				e = diffTree.getImportElement();
-				if ( e != null ) {
-					checkedList.add(e);
-				}
-				
-				if ( e instanceof ProcessComponent ) {
-					LibraryUtil.getAllChildPackages((MethodPackage)e, checkedList);
-				}
-
-				
-				// for new item, add all the sub packages
-				if ( diffTree.isNew() ) {
-					if ( e instanceof MethodPlugin ) {
-						checkedList.addAll(LibraryUtil.getAllPackages((MethodPlugin)e));
-					} else if ( e instanceof MethodPackage ) {
-						LibraryUtil.getAllChildPackages((MethodPackage)e, checkedList);
-					} 
-				}
-			}
-			
-		} else {
-			checkedList = null;
-		}
-		
-		
-		init();
-
-		// Get the current library.
-		baseLibrary = (MethodLibrary) this.rootTree.getBaseElement();
-		importingLibrary = (MethodLibrary) this.rootTree
-				.getImportElement();
-
-		// create the resource scanner
-		resScanner = new ResourceScanner(
-				LibraryUtil.getLibraryRootPath(importingLibrary), 
-				LibraryUtil.getLibraryRootPath(baseLibrary), renamePluginMap);
-			
-		diagramHandler = new DiagramHandler(
-				LibraryUtil.getLibraryRootPath(importingLibrary), 
-				LibraryUtil.getLibraryRootPath(baseLibrary)) {				
-			//[0]: sourceFile
-			//[1]: targetFile
-			protected File[] getFiles(org.eclipse.epf.uma.MethodElement elem) {
-				return super.getFiles(elem, false);
-			}
-			
-		};
-		
-	}
-		
-	private void init() {
-//		// Set the tree content.
-//		List factories = new ArrayList();
-//		factories.add(new ResourceItemProviderAdapterFactory());
-//		factories.add(new UmaItemProviderAdapterFactory());
-//		factories.add(new ReflectiveItemProviderAdapterFactory());
-//
-//		ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
-//				factories);
-//		afcp = new AdapterFactoryContentProvider(adapterFactory);
-//
-//		BasicCommandStack commandStack = new BasicCommandStack();
-//
-//		// Create the editing domain with a special command stack.
-//		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-//				commandStack, new HashMap());
-//
-	}
-
-	private boolean isSelected(ElementDiffTree diffTree) {
-		if ( checkedList == null || checkedList.contains(diffTree) ) {
-			return true;
-		}
-		
-		MethodElement e = diffTree.getBaseElement();		
-		if ( e == null ) {
-			e = diffTree.getImportElement();
-		}
-		
-		return isSelected(e);
-	}
-	
-	private boolean isSelected(MethodElement e) {
-		
-		if ( checkedList == null || 
-				e instanceof ContentDescription || 
-				e.eContainer() instanceof ContentDescription || 
-				e instanceof MethodLibrary ) {
-			return true;
-		}
-		
-		if ( checkedList.size() == 0 ) {
-			return false;
-		}
-		
-		if ( e instanceof MethodConfiguration ) {
-			return checkedList.contains(e);
-		}
-		
-		MethodElement o = (MethodElement)LibraryUtil.getSelectable(e);
-		if ( o == null ) {
-			return false;
-		} 
-		
-		if ( o instanceof MethodLibrary ) {
-			return true;
-		}
-		
-		return checkedList.contains(o);
-	}
-	
-	/**
-	 * Does merge from the import library into the base library.
-	 */
-	public void doMerge(boolean replaceExisting, IProgressMonitor monitor) throws Exception {
-		configFolderError = false;
-		
-		if ( debug ) {
-			System.out.println("Merging configuration ..."); //$NON-NLS-1$
-		}
-			
-		// Save the library path before detaching the resource.
-
-		if ( debug ) {
-			System.out.println("loading library ..."); //$NON-NLS-1$
-		}
-		
-		List unlockedPlugins = unlockPlugins();
-		if (! unlockedPlugins.isEmpty() && (fileCheckedOutStatus != null)
-				&& !fileCheckedOutStatus.isOK()) {
-			// log error
-			fileCheckOutError();
-			return;
-		}
-
-		LibraryUtil.loadAll(baseLibrary);
-		LibraryUtil.loadAll(importingLibrary);
-
-		// Detach the new library from the current resource so it can be
-		// added to a new Library Processor instance.
-		LibraryUtil.detachFromResource(importingLibrary);
-
-		// for test
-		importingLibrary.setName("ImportingLib: " + importingLibrary.getName()); //$NON-NLS-1$
-		
-		if ( debug ) {
-			System.out.println("Process configuration diff tree ..."); //$NON-NLS-1$
-		}
-
-		// before processing, save the original resources 
-		// so that we can find the newly added resources
-		List oldResources = new ArrayList(
-				baseLibrary.eResource().getResourceSet().getResources());
-		
-		// Iterate each element and the necessary merges.
-		processDiffTree(rootTree, replaceExisting);
-
-		handleSetElements();
-		
-		if ( debug ) {
-			System.out.println("perform integrity checking ..."); //$NON-NLS-1$
-		}
-
-		// perform an integrity check of the library
-		// fix any danfling elements due to package/element replacement
-		doIntegrityCheck();
-
-		// now process the new resources and mark them dirst so that 
-		// the data will be saved again. 
-		// This step is critical since the first round only created the data structure
-		// some of the cross-referenced elements might be lost on the first saving
-		// for example, when create a method configuration with references to a new plugin,
-		// which are not saved yet, those references will be lost.
-		// 145891 - Import Configuration: default config is loss after import
-		handleNewResources(oldResources);
-		
-		handleNameReplace(renameElementMap);
-		
-		diagramHandler.postRegisterElements();
-		
-		// get all the modified resources and resource files
-		// check CM for file check-out
-		if ( debug ) {
-			System.out.println("check out files ..."); //$NON-NLS-1$
-		}
-		
-		// clear resources for deleted elements
-		deleteResoruces();
-	
-		checkModifiedFiles();
-				
-		if ( fileCheckedOutStatus.isOK() ) {
-		 
-			if ( debug ) {
-				System.out.println("copying resource files ..."); //$NON-NLS-1$
-			}
-			resScanner.execute();
-			diagramHandler.execute();
-
-			if ( debug ) {
-				System.out.println("saving library ..."); //$NON-NLS-1$
-			}
-			
-			if (! configFolderError) {
-				if (unlockedPlugins.size() > 0) {
-					lockUnlockedPlugins(unlockedPlugins);
-				}
-				LibraryUtil.saveLibrary(baseLibrary, false, false);
-			}
-		} 
-		else {
-			fileCheckOutError();
-		}	
-// if ( debug ) {
-// System.out.println("copying resource files ..."); //$NON-NLS-1$
-// }
-//
-// // Copy the resource files in the current library to the new library.
-// // For simplicity sake, copy all resource files if the files do not
-// // exist in the target library or if the files are newer.
-// String includes = "resources/**, **/resources/**"; //$NON-NLS-1$
-//
-// LayoutResources.copyDir(srcDir, destDir, includes, null);
-
-		if ( debug ) {
-			System.out.println("Merging configuration done..."); //$NON-NLS-1$
-		}
-
-	}
-	
-	private void fileCheckOutError() {
-		// log error
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				String title = ImportResources.importConfigWizard_title; 
-				String msg = ImportResources.ImportConfigurationWizard_ERR_Import_configuration; 
-				new MsgDialog(ImportPlugin.getDefault())
-					.displayError(title, msg, fileCheckedOutStatus);
-				}
-		});
-
-		if ( debug ) {
-			System.out.println("Checkout files failed ..."); //$NON-NLS-1$
-		}
-	}
-		
-	private void handleNewResources(List oldResources) {
-		for (Iterator it = baseLibrary.eResource().getResourceSet()
-				.getResources().iterator(); it.hasNext(); ) {
-			Resource res = (Resource)it.next();
-			if ( !oldResources.contains(res) ) {
-				logNewResource(res);
-			}
-		}	
-	}
-	
-	
-	/**
-	 * Processes the diff tree. Only need to do the first level since the
-	 * replace or add is done at the method package level.
-	 */
-	private void processDiffTree(ElementDiffTree diffTree,
-			boolean replaceExisting) throws Exception {
-		if (diffTree == null || !isSelected(diffTree) ) {
-			return;
-		}
-
-		// There is a change.
-		int state = diffTree.getDiffState();
-		MethodElement base = diffTree.getBaseElement();
-		MethodElement imp = diffTree.getImportElement();
-		if (replaceExisting && (state == ElementDiffTree.DIFF_STATE_CHANGED) ) {
-
-			if ( (base instanceof MethodConfiguration)) {
-				// replace the configuration by adding the new packages into the
-				// configuration
-				doReplaceConfiguration((MethodConfiguration) base, (MethodConfiguration) imp);
-			}
-			else if ( (base instanceof MethodPlugin)) {
-				// Replace the plugin with the non-package features.
-				doReplacePlugin((MethodPlugin) base, (MethodPlugin) imp);
-			}
-			else if ( (base instanceof MethodPackage)) {
-				// Replace the package.
-				doReplacePackage((MethodPackage) base, (MethodPackage) imp);
-			}
-			else
-			{
-				if (debug ) {
-					System.out.println("What is this: " + LibraryUtil.getTypeName(base)); //$NON-NLS-1$
-				}
-			}
-		} else if (state == ElementDiffTree.DIFF_STATE_NEW) {
-			// Add the new package from import library.
-			doAdd(diffTree.getBaseParentElement(), diffTree.getImportElement()); 
-		}
-
-		// Process the children recursively if it's not a new one.
-		if (state != ElementDiffTree.DIFF_STATE_NEW) {
-			List children = diffTree.getChildren();
-			if (children != null && children.size() > 0) {
-				for (Iterator it = children.iterator(); it.hasNext();) {
-					processDiffTree((ElementDiffTree) it.next(),
-							replaceExisting);
-				}
-			}
-		}
-	}
-
-	/**
-	 * update the configuration by replacing the non-package features, and
-	 * adding the new packages into the configuration
-	 * 
-	 * @param oldObj
-	 *            MethodConfiguration
-	 * @param newObj
-	 *            MethodConfiguration
-	 */
-	private void doReplaceConfiguration(MethodConfiguration oldObj, MethodConfiguration newObj)
-	{
-		if ( isReplaced(oldObj) ) {
-			return;
-		}
-		setReplaced(oldObj);
-		
-		List features = LibraryUtil.getStructuralFeatures(oldObj);
-//		List properties = oldObj.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-				// don't delete old feature values
-				Object newValue = newObj.eGet(feature);
-				setFeatureValue(oldObj, feature, newValue, false);
-			}
-		}
-	}
-
-// private void mergeElementList(List source, List target)
-// {
-// List ids = new ArrayList();
-// for ( Iterator it = target.iterator(); it.hasNext(); )
-// {
-// MethodElement e = (MethodElement)it.next();
-// ids.add(e.getGuid());
-// }
-//
-// for ( Iterator it = source.iterator(); it.hasNext(); )
-// {
-// MethodElement e = (MethodElement)it.next();
-// if ( !ids.contains(e.getGuid()) )
-// {
-// target.add(e);
-// }
-// }
-// }
-
-	/**
-	 * replace the plugin features, but not the plugin object and it's packages
-	 * 
-	 * @param oldObj
-	 *            MethodPlugin
-	 * @param newObj
-	 *            MethodPlugin
-	 */
-	private void doReplacePlugin(MethodPlugin oldObj, MethodPlugin newObj) {
-		if ( isReplaced(oldObj) ) {
-			return;
-		}
-		setReplaced(oldObj);
-		
-		List features = LibraryUtil.getStructuralFeatures(oldObj);
-//		List properties = oldObj.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-				if ( feature != UmaPackage.eINSTANCE.getMethodPlugin_MethodPackages() )
-				{
-					Object newValue = newObj.eGet(feature);
-					setFeatureValue(oldObj, feature, newValue, true);
-				}
-				/* No, don't do this, fix the diff manager to include the root package instead
-				 * 150895 - Import Config: CustomCategory did not sync up by import
-				else {
-					// custom categories package needs special handing
-					// we need to start with the root custom category otherwise
-					// all child categories will be lost
-					MethodPackage oldPkg = UmaUtil.findContentPackage(oldObj, ModelStructure.DEFAULT_CUSTOM_CATEGORY_PATH);
-// ContentPackage newPkg = UmaUtil.findContentPackage(newObj,
-// ModelStructure.DEFAULT.DEFAULT_CUSTOM_CATEGORY_PATH);
-					setReplaced(oldPkg);
-					
-					// find the root custom category and start from there
-					CustomCategory oldCC = TngUtil.getRootCustomCategory(oldObj);
-					CustomCategory newCC = TngUtil.getRootCustomCategory(newObj);
-					oldPkg = (MethodPackage)oldCC.eContainer();
-					setReplaced(oldPkg);
-					doReplaceElement(oldCC, newCC);
-				}
-				*/
-			}
-		}
-
-	}
-
-
-
-	/**
-	 * Replaces the atrributes and contained elements, but not the child
-	 * packages
-	 */
-	private void doReplacePackage(MethodPackage oldObj, MethodPackage newObj) {
-		if ( isReplaced(oldObj) ) {
-			return;
-		}
-		setReplaced(oldObj);
-
-		if ( debug ) {
-			System.out.println("Replacing package " + LibraryUtil.getTypeName(oldObj)); //$NON-NLS-1$
-		}
-		List features = LibraryUtil.getStructuralFeatures(oldObj);
-//		List properties = oldObj.getInstanceProperties();
-		
-		boolean isProcessPackage = oldObj instanceof ProcessPackage;
-		
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-				if ( feature == UmaPackage.eINSTANCE.getMethodPackage_ChildPackages() &&
-					 !isProcessPackage)
-				{					
-					continue;
-				}
-
-				Object newValue = newObj.eGet(feature);
-				setFeatureValue(oldObj, feature, newValue, true);
-			}
-		}
-
-	}
-
-// private MethodElement objOld = null;
-// private MethodElement objNew = null;
-// private void testIt() {
-// if ( objOld != null ) {
-// System.out.println("Old container =" + objOld.eContainer());
-// System.out.println("New container =" + objNew.eContainer());
-// if ( objOld.eContainer() == null ) {
-// System.out.println("old is gone!");
-// }
-// if ( objNew.eContainer() == null ) {
-// System.out.println("new is gone!");
-// }
-// }
-// }
-	
-	/**
-	 * replace the element by replacing the feature values, but don't replace
-	 * the object if it is marked as not replaceable. recursive the feature
-	 * value and replace it
-	 * 
-	 * @param oldObj
-	 *            MethodPlugin
-	 * @param newObj
-	 *            MethodPlugin
-	 */
-	private void doReplaceElement(MethodElement oldObj, MethodElement newObj) {
-		
-		// check if the element is already replaced or not
-		if ( isReplaced(oldObj) ) {
-			return;
-		}
-
-		if ( diffMgr.selectable(oldObj) ) {
-			return;
-		}
-
-		if ( !isSelected(oldObj) ) {
-			return;
-		}
-		
-		// if content description, check if it's changed or not
-		if ( (oldObj instanceof ContentDescription) && (newObj instanceof ContentDescription) ) {
-			if ( LibraryUtil.isIdentical((ContentDescription)oldObj, (ContentDescription)newObj) ) {
-				if (debug ) {
-					Resource res = oldObj.eResource();
-					if ( res != null ) {
-						System.out.println("Identical element not replaced: " + res.getURI().toFileString() ); //$NON-NLS-1$
-					}
-				}
-				
-				// even though the content is the same, we still need to copy the resources
-				scanResources(oldObj, true);
-				return;
-			} 
-		}
-		
-		// set repalced first to avoid calling into the same object recursively
-		setReplaced(oldObj);
-		
-		if ( debug ) {
-			System.out.println("Replacing element " + LibraryUtil.getTypeName(oldObj)); //$NON-NLS-1$
-		}
-		List features = LibraryUtil.getStructuralFeatures(oldObj);
-//		List properties = oldObj.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-
-				// package structure is handled by the diff tree
-				// so we don't process the related feature
-				if ( feature == UmaPackage.eINSTANCE.getMethodPlugin_MethodPackages()
-						|| feature == UmaPackage.eINSTANCE.getMethodPackage_ChildPackages() 
-						|| feature.isDerived() )
-				{
-					continue;
-				}
-
-				Object newValue = newObj.eGet(feature);
-				setFeatureValue(oldObj, feature, newValue, true);
-			}
-		}
-
-	}
-
-	/**
-	 * set the new value from the importing library to the old object in the
-	 * base library. if the value or onle of values are not replaceable, suach
-	 * as MethodLibrary, MethodPlugin, MethodPackage, etc, those values should
-	 * be substitued with the one in the old library
-	 * 
-	 * @param element
-	 * @param feature
-	 * @param value
-	 */
-	
-
-	static MethodElement newCont = null;
-	static MethodElement newElem = null;
-	private void setFeatureValue(MethodElement element, EStructuralFeature feature, Object newValue, boolean doDelete)
-	{		
-		if ( canIgnore(feature) ) {
-			return;
-		}
-		
-		boolean oldNotify = element.eDeliver();
-		try
-		{
-			// turn off notifications to avoid possible deadlock or thread issue
-			element.eSetDeliver(false);
-			
-			if ( canReset(feature) ) {
-				element.eSet(feature, newValue);
-			}
-			else if ( feature.isMany() && newValue instanceof List)
-			{
-				List oldValue = (List)element.eGet(feature);
-				if (feature.getName().equals("methodElementProperty")) {		//$NON-NLS-1$
-					setMepFeatureValue(element, feature, oldValue, (List) newValue);
-					return;
-				}
-				ElementListDiff diff = new ElementListDiff(oldValue, (List)newValue);
-				if ( doDelete && diff.deletedItems.size() > 0 ) {
-					oldValue.removeAll(diff.deletedItems);
-					logRemovedElements(diff.deletedItems);
-					if ( debug ) {
-						System.out.println("  Deleting feature value, feature: " + feature.getName() + ",  element: "  //$NON-NLS-1$ //$NON-NLS-2$
-								+ LibraryUtil.getTypeName(element) + ", values: " +  diff.deletedItems); //$NON-NLS-1$
-					}
-				}
-
-				if ( diff.newItems.size() > 0 ) {					
-					// save the new elements and fix the references later
-					// note: the newly added feature values might not be REALLY
-					// new element to the base library
-					// it might be just a newly added reference, so check and
-					// make sure
-					// if it's old element, do replace again
-					for ( Iterator itn = diff.newItems.iterator(); itn.hasNext(); ) {
-						MethodElement newObj = (MethodElement)itn.next();
-						
-						// only process the new object if it's selected
-						if ( isSelected(newObj) ) {
-							MethodElement oldObj = diffMgr.getExistingElement(newObj.getGuid());
-							if ( oldObj == null ) {
-								oldValue.add(newObj);
-								//logNewElement(newObj);
-								logNewElementUnderExistingPlugin(newObj);
-							} else {
-								oldValue.add(oldObj);
-								doReplaceElement(oldObj, newObj);
-							}
-						}
-					}
-					
-					if ( debug ) {
-						System.out.println("  Adding feature value, feature: " + feature.getName() + ",  element: "  //$NON-NLS-1$ //$NON-NLS-2$
-								+ LibraryUtil.getTypeName(element) + ", values: " +  diff.newItems); //$NON-NLS-1$
-					}
-					
-				}
-
-				if ( diff.oldNewMap.size() > 0 ) {
-					for ( Iterator it = diff.oldNewMap.entrySet().iterator(); it.hasNext(); ) {
-						Map.Entry entry = (Map.Entry) it.next();
-						MethodElement oldObj = (MethodElement)entry.getKey();
-						
-						// only process the new object if it's selected
-						if ( !isSelected(oldObj) ) {
-							continue;
-						}
-						
-						MethodElement newObj = (MethodElement)entry.getValue();
-						if ( canReset(oldObj) ) {
-							if ( debug ) {
-								System.out.println("  Resetting feature value, feature: " + feature.getName() + ",  element: "  //$NON-NLS-1$ //$NON-NLS-2$
-										+ LibraryUtil.getTypeName(element) + ", value: " +  LibraryUtil.getTypeName(oldObj)); //$NON-NLS-1$
-							}
-
-							EcoreUtil.replace(element, feature, oldObj, newObj);
-							logResetElement(newObj);
-						} else {
-							doReplaceElement(oldObj, newObj); 
-						}
-					}
-				}
-			}
-			else if (newValue instanceof MethodElement)
-			{
-				// if the old and new element are the same,
-				// only replace the feature value
-				MethodElement o = (MethodElement)element.eGet(feature);
-				MethodElement n = (MethodElement)newValue;
-				
-				// only process the new object if it's selected
-				if ( (o == null || isSelected(o)) && isSelected(n) ) {
-
-					if ( debug ) {
-						System.out.println("  Replacinging feature value, feature: " + feature.getName() + ",  element: "  //$NON-NLS-1$ //$NON-NLS-2$
-								+ LibraryUtil.getTypeName(element) + ", value: " +  LibraryUtil.getTypeName(o)); //$NON-NLS-1$
-					}
-	
-					if ( newValue instanceof ContentDescription ) {
-						// always replace content description (not reset) to
-						// reserve the existing resource (xmi file)
-						// since the contentDescription is unique the a method
-						// element, so we don't need to compare the guid
-												
-						// if both object has no container, there is no such
-						// description, ignore it
-						if ( o.eContainer() != null || n.eContainer() != null ) {
-							if ( o.eContainer() == null ) {
-								element.eSet(feature, o);
-							}
-							doReplaceElement(o, n);						
-						}
-					}
-					// if the element can be replaced, such as for
-					// ContentDescription element
-					// set the value directly
-					else if ( canReset(n) ) {
-						element.eSet(feature, newValue);
-						//logNewElement(n);
-						logNewElementUnderExistingPlugin(n);
-					}
-					else
-					{
-						if ( o != null && n != null && o.getGuid().equals(n.getGuid()) ) {
-							 doReplaceElement(o, n);
-						}
-						else {													
-							registerSetElement(element, feature, newValue);
-							
-							element.eSet(feature, newValue);
-							//logNewElement(n);
-							logNewElementUnderExistingPlugin(n);
-						}
-					}
-				}
-			}
-			else if ( feature == UmaPackage.eINSTANCE.getNamedElement_Name() ) {
-				// check difference name, if replace, need to rename resources if if has it's own resource
-				// like content elements, plugins, configuirations, and process components					
-				if (! (newValue instanceof String)) {
-					throw new UnsupportedOperationException();
-				}
-				String oldName = (String)element.eGet(feature);
-				if (!newValue.equals(oldName)) {					
-					ensureUniqueNameForExistingElement(element, oldName, (String) newValue, renameElementMap);										
-				}
-			} else {
-				element.eSet(feature, newValue);
-				
-				// scan and copy the resources
-				scanResources(element, feature, newValue);
-			}
-
-		}
-		catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		finally
-		{
-			element.eSetDeliver(oldNotify);
-		}
-	}
-
-	private void setMepFeatureValue(MethodElement element, EStructuralFeature feature, List oldValue, List newValue) {
-		int sz = newValue.size();
-		if (oldValue.size() == sz) {
-			if (sz == 0) {
-				return;
-			}
-			boolean same = true;
-			for (int i=0; i < sz; i++) {
-				MethodElementProperty oldMep = (MethodElementProperty) oldValue.get(i);
-				MethodElementProperty newMep = (MethodElementProperty) newValue.get(i);
-				if (! oldMep.getName().equals(newMep.getName()) ||
-					! oldMep.getValue().equals(newMep.getValue())) {
-					same = false;
-					break;
-				}
-			}
-			if (same) {
-				return;
-			}					
-		}
-		oldValue.removeAll(oldValue);
-		oldValue.addAll(newValue);		
-	}
-
-	private void scanResources(MethodElement element, boolean recursive) {
-
-		if ( element == null ) {
-			return;
-		}
-		
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-				if ( !(feature instanceof EAttribute) ) {
-					continue;
-				}
-
-				Object value = element.eGet(feature);
-				scanResources(element, feature, value);
-			}
-		}
-		
-		if ( !recursive ) {
-			return;
-		}
-		
-		for (Iterator it = element.eAllContents(); it.hasNext(); ) {
-			EObject obj = (EObject)it.next();
-			
-			if (obj instanceof MethodLibrary
-					|| obj instanceof MethodPlugin 
-					|| obj instanceof MethodPackage 
-					|| obj instanceof MethodConfiguration) {
-				continue;
-			}
-			
-			if ( obj instanceof MethodElement ) {
-				scanResources((MethodElement)obj, false);
-			}
-		}
-	}
-	
-	private void scanResources(MethodElement element, EStructuralFeature feature, Object newValue) {
-		diagramHandler.registerElement(element);
-		
-		// scan the resources
-		if ( feature == UmaPackage.eINSTANCE.getGuidanceDescription_Attachments() ) {
-			// process the attachments
-			String urls = (String)newValue;
-			if ( (urls != null) && urls.length() != 0 ) {
-				StringTokenizer st = new StringTokenizer(urls, "|"); // this is hardcoded somehow //$NON-NLS-1$
-				while (st.hasMoreTokens() ) {
-					String url = st.nextToken();
-					resScanner.copyResource (element, url);
-				}						
-			}
-		} else if ( newValue instanceof String ) {
-			resScanner.scan(element, newValue.toString());
-		} else if (newValue instanceof URI ) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-			resScanner.copyResource ( ((URI)newValue).getPath(), plugin);
-		}
-
-	}
-	
-	private void doAdd(EObject owner, MethodElement newObj) throws Exception {
-		if ( debug ) {
-			System.out.println("Adding element " + LibraryUtil.getTypeName((MethodElement)newObj)); //$NON-NLS-1$
-		}
-
-		// the owner can only be library and package
-		if (owner == null) {
-			return;
-		}
-		
-		ensureUniqueName(owner, newObj, renameElementMap);
-		
-		boolean error = false;
-		
-		if (owner instanceof MethodLibrary) {			
-			// can be configuration or plugin
-			if (newObj instanceof MethodPlugin) {
-				MethodPlugin plugin = (MethodPlugin)newObj;				
-				
-				checkModifiedFiles();				
-				error = ! fileCheckedOutStatus.isOK();				
-								
-				// don't intitialize the storage since this will recreate the global packages
-				// and such causing two set of global packages
-				// 145850 - Import Configuration: CP/DPs did not shown in authering
-				// ModelStorage.initialize(plugin);
-				// NO, since the global packages are already created
-				if (!error) {
-					((MethodLibrary)owner).getMethodPlugins().add(plugin);
-					try {
-						MultiFileXMIHelperImpl.unmodifiedGetValue = true;
-						LibraryUtil.saveLibrary((MethodLibrary)owner, false, false);
-					} finally {
-						MultiFileXMIHelperImpl.unmodifiedGetValue = false;
-					}
-				}
-								
-			} else if (newObj instanceof MethodConfiguration ) {
-				checkModifiedFiles();				
-				error = configFolderError || ! fileCheckedOutStatus.isOK();
-				if (!error) {
-					MethodLibrary lib = (MethodLibrary)owner;
-					lib.getPredefinedConfigurations().add(newObj);
-					ILibraryPersister persister = ((MultiFileResourceSetImpl) lib.eResource().getResourceSet()).getPersister();
-					if (persister instanceof IFileBasedLibraryPersister) {
-						IFileBasedLibraryPersister ip = (IFileBasedLibraryPersister) persister;
-						File configFolder = ip.getDefaultMethodConfigurationFolder(lib);
-						if (configFolder != null) {
-							ip.setDefaultMethodConfigurationFolder(lib, configFolder);
-						} else {
-							error = true;
-							configFolderError = true;
-						}
-					}
-					if (! error) {
-						try {
-							MultiFileXMIHelperImpl.unmodifiedGetValue = true;
-							LibraryUtil.saveLibrary((MethodLibrary)owner, false, false);
-						} finally {
-							MultiFileXMIHelperImpl.unmodifiedGetValue = false;
-						}
-					}
-				}
-			} else {
-				error = true;			
-			}
-		} else if ( (owner instanceof MethodPackage) 
-				&& (owner.eContainer() != null) 
-				&& (newObj instanceof MethodPackage) ) {
-			((MethodPackage)owner).getChildPackages().add(newObj);
-		} else {
-			error = true;
-		}
-			
-		if ( error ) {
-			String ownerStr = owner instanceof MethodElement ? 
-					LibraryUtil.getTypeName((MethodElement)owner) : owner.toString();
-					
-			String msg = "can't add " + LibraryUtil.getTypeName(newObj) //$NON-NLS-1$
-			+ " to " + ownerStr; //$NON-NLS-1$
-			
-			ImportPlugin.getDefault().getLogger().logError(msg); 
-			if ( debug ) {
-				System.out.println(msg);
-			}
-		} else {
-			logNewElement(newObj);
-		}
-	}
-
-	private boolean checkModifiedConfigs(MethodPlugin plugin) {
-		List configList = LibraryUtil.getAssociatedConfigurations(plugin);
-		List baseConfigs = baseLibrary.getPredefinedConfigurations();
-		Map baseConfigMap = new HashMap();
-		for (int i=0; i<baseConfigs.size(); i++) {
-			MethodConfiguration config = (MethodConfiguration) baseConfigs.get(i);
-			baseConfigMap.put(config.getGuid(), config);
-		}
-		final List modifiedFiles = new ArrayList();
-		for (int i=0; i<configList.size(); i++) {
-			MethodConfiguration config = (MethodConfiguration) configList.get(i);
-			config = (MethodConfiguration) baseConfigMap.get(config.getGuid());
-			if (config != null) {
-				Resource res = config.eResource();
-				if (res != null) {
-					modifiedFiles.add(res.getURI().toFileString());
-				}
-			}
-		}
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				fileCheckedOutStatus = FileModifyChecker.checkModify(modifiedFiles);
-			}
-		});
-		fileCheckOutError();
-		
-		return fileCheckedOutStatus.isOK();
-	}
-
-	private void doIntegrityCheck()
-	{		
-		// now the newly added elements may have feature value element that
-		// still pointing to the importing library
-		// we need to replace those with the one in the base library
-		while (newElements.size() > 0) {
-			MethodElement newObj = (MethodElement)newElements.remove(0);
-			try {
-				if ( newObj instanceof DiagramElement ) {
-					fixDiagram((DiagramElement)newObj);
-				} else {
-					fixNewElementReferences(newObj);
-				}
-			} catch (Exception e) {
-				if (debug) {
-					System.out.println("Exception while fixing new element " + LibraryUtil.getTypeName(newObj)); //$NON-NLS-1$
-				}
-				e.printStackTrace();
-			}
-		}
-		
-		// the configurations needs to be fixed
-		List configs = baseLibrary.getPredefinedConfigurations();
-		for ( Iterator it = configs.iterator(); it.hasNext(); )
-		{
-			MethodConfiguration config = (MethodConfiguration)it.next();
-			LibraryUtil.validateMethodConfiguration(null, config);
-		}
-	}
-
-	private List processedNewElements = new ArrayList();
-	
-	
-	
-	/**
-	 * iterate all features, if the feature value references an element which is
-	 * an old element, replace it with the old element. if the element is new,
-	 * iterate it's containment elements
-	 * 
-	 * @param newObj
-	 */
-	private void fixNewElementReferences(MethodElement newObj) {
-		if ( processedNewElements.contains(newObj) ) {
-			return;
-		}
-		
-		processedNewElements.add(newObj);
-		
-		if ( debug ) {
-			System.out.println("Fixing element " + LibraryUtil.getTypeName(newObj)); //$NON-NLS-1$
-		}
-		
-		List features = LibraryUtil.getStructuralFeatures(newObj);
-//		List properties = newObj.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-				Object value = newObj.eGet(feature);
-
-				if ( value instanceof List) {
-					
-					// fixing the feature value may cause the list to change
-					// iterate on a new copy to avoid
-					// ConcurrentModificationException
-					for (Iterator it= new ArrayList(((List)value)).iterator(); it.hasNext(); ) {
-						Object o = it.next();
-						fixNewElementFeatureValue(newObj, feature, o);
-					}
-				} else {
-					fixNewElementFeatureValue(newObj, feature, value);
-				}
-			}
-		}	
-	}
-	
-	
-	private void fixDiagram(DiagramElement newObj) {		
-
-		if ( processedNewElements.contains(newObj) ) {
-			return;
-		}
-		
-		processedNewElements.add(newObj);
-		
-		if ( debug ) {
-			System.out.println("Fixing diagram element " + LibraryUtil.getTypeName(newObj)); //$NON-NLS-1$
-		}
-		
-		List features = LibraryUtil.getStructuralFeatures(newObj);
-//		List properties = newObj.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-				Object value = newObj.eGet(feature);
-
-				if ( value instanceof List) {
-					
-					// fixing the feature value may cause the list to change
-					// iterate on a new copy to avoid
-					// ConcurrentModificationException
-					for (Iterator it= new ArrayList(((List)value)).iterator(); it.hasNext(); ) {
-						Object o = it.next();
-						if ( o instanceof MethodElement ) {
-							if ( feature == UmaPackage.eINSTANCE.getUMASemanticModelBridge_Element() ) {
-								fixNewElementFeatureValue(newObj, feature, o);
-							} else if ( (o instanceof DiagramElement) ) {
-								fixDiagram((DiagramElement)o);
-							} 
-						}
-					}
-				} else if ( value instanceof MethodElement ) {
-					if ( feature == UmaPackage.eINSTANCE.getUMASemanticModelBridge_Element() ) {
-						fixNewElementFeatureValue(newObj, feature, value);
-					} else if ( (value instanceof DiagramElement) ) {
-						fixDiagram((DiagramElement)value);
-					} 
-				}
-			}
-		}	
-	}
-	
-	/**
-	 * check if the value is an old element in the base, if yes, replace it with
-	 * the old one if it's new, iterate it's feature value
-	 * 
-	 * @param feature
-	 * @param obj
-	 */
-	private void fixNewElementFeatureValue(MethodElement element, EStructuralFeature feature, Object obj) {
-		if ( !(obj instanceof MethodElement) ) {
-			return;
-		}
-		
-		if ( debug ) {
-			System.out.println("fixing element feature value " + LibraryUtil.getTypeName(element) + ", feature=" + feature.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		boolean oldNotify = element.eDeliver();
-		try
-		{
-			element.eSetDeliver(false);
-			
-			MethodElement newObj = (MethodElement)obj;
-			MethodElement oldObj = getReplaced(newObj.getGuid());
-			if ( oldObj == null ) {
-				// get existing element, for example, the global packages in the
-				// configuration feature
-				oldObj = diffMgr.getExistingElement(newObj.getGuid());
-			}
-			
-			if ( oldObj == null ) {
-				// it's a new one
-				fixNewElementReferences(newObj);
-			} else {
-				
-				try {
-					// replace the newObj with the oldObj
-					EcoreUtil.replace(element, feature, newObj, oldObj); 
-				}
-				catch (Exception ex) {
-					// if replace failed, remove the feature
-					EcoreUtil.remove(element, feature, newObj); 
-					if (debug ) {
-						System.out.println("Replaceing feature value failed for element ["  //$NON-NLS-1$
-								+ LibraryUtil.getTypeName(element) + "], feature ["  //$NON-NLS-1$
-								+ feature.getName() + "], value="  //$NON-NLS-1$
-								+ newObj + ". The feature value is removed. "); //$NON-NLS-1$
-						
-					}
-				}
-			}	
-		}
-		catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		finally
-		{
-			element.eSetDeliver(oldNotify);
-		}
-	}
-	
-	private boolean canReset(MethodElement e) {
-		boolean reset = false;
-		
-		// an element can be reset if you are sure that no other element(s)
-		// reference to it
-		// reset elements may have references to other elements in the importing
-		// library, that needs to be fixed later
-		
-		// for anything contained by ContentDescription, reset it
-		if ( e == null /* || e.eContainer() instanceof ContentDescription */
-				|| e instanceof DiagramElement) {
-			reset = true;
-		}
-				
-		return reset;
-	}
-
-	private boolean canReset(EStructuralFeature feature) {
-		// for anything contained by ContentDescription, reset it
-		// no don't reset the sections since it will cause the one in the
-		// importing library removed
-		// which caused problem for TaskDescription where the same feature
-		// (Steps) can't find the steps from the importing library
-		// which then will treat the steps in the base library being deteted
-// if ( feature == UmaPackage.eINSTANCE.getContentDescription_Sections()) {
-// return true;
-// }
-		return false;
-	}
-
-	private boolean canIgnore(EStructuralFeature feature) {
-		// don't reset the plugin lock status
-		if ( feature == UmaPackage.eINSTANCE.getMethodPlugin_UserChangeable()) {
-			return true;
-		}
-
-		// 146144 - Import Configuration: some unchange elements disappear in authoring after import
-		// this is caused by a bug in ArtifactImpl, when setContainerArtifact to null, 
-		//  it set the eContainer to null, if the eContainer is a content package, 
-		// the artifact is removed from the package
-		//  this bug will be fixed in M4. 
-		// for now, ignore this feature since this is an opposite feature, we don't need to handle it	
-		if ( feature == UmaPackage.eINSTANCE.getArtifact_ContainerArtifact() ) {
-			return true;
-		}
-		return false;
-	}
-	
-	private boolean isReplaced(MethodElement oldObj) {
-		return replacedElementMap.containsKey(oldObj.getGuid());
-	}
-
-	private void setReplaced(MethodElement oldObj) {
-		String guid = oldObj.getGuid();
-		if ( !replacedElementMap.containsKey(guid) ) {
-			replacedElementMap.put(guid, oldObj);
-			setModified(oldObj);
-		}
-	}
-	
-	/**
-	 * get the old element been replaced
-	 * 
-	 * @param oldObj
-	 * @return
-	 */
-	private MethodElement getReplaced(String guid) {
-		return (MethodElement)replacedElementMap.get(guid);
-	}
-	
-	/**
-	 * when new elements are added into the library, the associated resource
-	 * files must be copied over as well
-	 * 
-	 * @param newObj
-	 *            MethodElement
-	 */
-	private void copyNewElementResources(MethodElement newObj) {
-		
-//		List properties = newObj.getInstanceProperties();
-//		if (properties != null) {
-//			for (int i = 0; i < properties.size(); i++) {
-//				EStructuralFeature feature = (EStructuralFeature) properties.get(i);
-//				Object value = newObj.eGet(feature);
-//				if ( value instanceof URI ) {
-//					resScanner.copyResource(((URI)value).getPath());
-//				} else if ( value instanceof String ) {
-//					resScanner.scan(newObj, (String)value);
-//				}
-//			}
-//		}
-//		
-//		for ( Iterator it = newObj.eContents().iterator(); it.hasNext(); ) {
-//			Object o = it.next();
-//			if ( o instanceof MethodElement ) {
-//				copyNewElementResources((MethodElement)o);
-//			}
-//		}
-		
-		scanResources(newObj, true);
-	}
-	
-	private void logNewElement(MethodElement newObj) {
-		
-		// make sure the element is not in the original library
-		// since we have the guid-element map build up in the diff manager,
-		// check there
-		if ( !newElements.contains(newObj) && diffMgr.getExistingElement(newObj.getGuid()) == null) {
-			newElements.add(newObj);
-			copyNewElementResources(newObj);
-			setModified(newObj);
-		}
-	}
-	
-	private void logResetElement(MethodElement newObj) {
-		if ( !newElements.contains(newObj) ) {
-			newElements.add(newObj);
-			setModified(newObj);
-		}
-	}
-
-	private void logNewResource(Resource res ) {
-		if ( res != null ) {
-			
-			// mark the resource as dirty so that we can save it again
-			// the first save may lose cross references 
-			res.setModified(true);
-			String file = res.getURI().toFileString();
-			if ( !newResources.contains(file) ) {
-				newResources.add(file);
-			}
-		}
-	}
-	
-	private void logRemovedElements(List items) {
-		
-		if ( items == null || items.size() == 0 ) {
-			return;
-		}
-		
-		// removed elements can be removed from any feature
-		// check if the element's container is null
-		// if is, then the element is deleted and the resource should be deleted
-		// as well
-		for (Iterator it = items.iterator(); it.hasNext(); ) {
-			MethodElement e = (MethodElement)it.next();
-			if ( (e.eContainer() == null) && !deletedElements.contains(e) ) {			
-				deletedElements.add(e);
-			}			
-		}
-	}
-	
-	private void setModified(EObject obj) {
-		if ( obj != null ) {
-			Resource res = obj.eResource();
-			if ( res != null ) {
-				if ( !res.isModified() ) {
-					res.setModified(true);				
-				}
-// } else {
-// System.out.println("No resource for " + obj);
-				
-				if (debug && res.isModified() ) {
-					System.out.println("Modified: " + res.getURI().toFileString()); //$NON-NLS-1$
-				}
-
-			}
-		}
-	}
-
-	private List getModifiedResources(MethodLibrary lib) {
-		
-		// avoid the newly added element resources
-		List modifiedList = new ArrayList();
-		Resource res = lib.eResource();
-		if ( res != null ) {
-			ResourceSet resSet = res.getResourceSet();
-			for ( Iterator it = resSet.getResources().iterator(); it.hasNext(); ) {
-				res = (Resource) it.next();
-				if ( res != null && res.isModified() ) {
-					String file = res.getURI().toFileString();
-					if ( newResources.contains(file) ) {
-						continue;
-					}
-					
-					if ( debug ) {
-						System.out.println("Resource modified: " + file); //$NON-NLS-1$
-					}		
-					modifiedList.add(file);
-				}
-			}
-		}
-		return modifiedList;
-	}
-
-	// clear resources for deleted elements
-	private void deleteResoruces() {
-		if ( deletedElements.size() == 0 ) {
-			return;
-		}
-		
-		IFileManager fileMgr = Services.getFileManager();
-
-		for (Iterator it = deletedElements.iterator(); it.hasNext(); ) {
-			MethodElement e = (MethodElement)it.next();
-			
-			EObject obj = null;
-			if ( e instanceof DescribableElement ) {
-				obj = ((DescribableElement)e).getPresentation();
-			} else if ( e instanceof ContentDescription ) {
-				obj = e;
-			}
-			if ( obj != null ) {
-				Resource res = obj.eResource();
-				if ( res != null ) {
-					String file = res.getURI().toFileString();
-					if ( debug ) {
-						System.out.println("deleting resource: " + file); //$NON-NLS-1$
-					}
-					
-					if ( !fileMgr.delete(file) ) {
-						if ( debug ) {
-							System.out.println("unable to delete file: " + file); //$NON-NLS-1$
-						}
-					}
-				}								
-			}
-		}
-	}
-
-	
-	public class ElementListDiff {
-
-		List newItems = new ArrayList();
-		List deletedItems = new ArrayList();
-		
-		// use LinkedHashMap to reserve the order of the values
-		Map oldNewMap = new LinkedHashMap();
-
-		// with the old and new list of MethodElements,
-		// find the common ones, the deleted ones, and the new ones
-		public ElementListDiff(List oldList, List newList) {
-			// Map oldListGuidMap = getGuidMap(oldList);
-			Map newListGuidMap = getGuidMap(newList);
-
-			newItems.addAll(newList);
-
-			for (Iterator it = oldList.iterator(); it.hasNext(); ) {
-				MethodElement oldObj = (MethodElement)it.next();
-				String guid = oldObj.getGuid();
-				Object newObj = newListGuidMap.get(guid);
-				if ( newObj != null ) {
-					oldNewMap.put(oldObj, newObj);
-					newItems.remove(newObj);
-				}
-				else
-				{
-					// it's been deleted
-					deletedItems.add(oldObj);
-				}
-			}
-		}
-
-		private Map getGuidMap(List items) {
-			Map m = new HashMap();
-			for (Iterator it= items.iterator(); it.hasNext(); ) {
-				MethodElement e = (MethodElement)it.next();
-				m.put(e.getGuid(), e);
-			}
-
-			return m;
-		}
-	}	
-	
-	/**
-	 * Handles name replacement.
-	 */
-	public static void handleNameReplace(Map renameElementMap) {
-		Iterator it = renameElementMap.entrySet().iterator();
-		while (it.hasNext()) {
-			Map.Entry entry = (Map.Entry) it.next();
-			Object[] val = (Object[])entry.getValue();
-			
-			MethodElement element = (MethodElement) val[0];
-			String newName = val.length == 4 ? element.getGuid() : (String) val[1];
-			rename(element, newName);
-			if (val.length == 4) {
-				element = (MethodElement) val[2];
-				newName = (String) val[3];
-				rename(element, newName);
-				
-				element = (MethodElement) val[0];
-				newName = (String) val[1];
-				rename(element, newName);
-			}
-		}
-		
-		//Make resouces dirty again, as rename process would mark resouce un-modified
-		it = renameElementMap.entrySet().iterator();
-		while (it.hasNext()) {
-			Map.Entry entry = (Map.Entry) it.next();
-			Object[] val = (Object[])entry.getValue();			
-			MethodElement element = (MethodElement) val[0];
-			element.eResource().setModified(true);
-		}
-	}
-	
-	private static void rename(MethodElement element, String newName) {
-		if (newName.equals(element.getName())) {
-			return;
-		}
-		if (element instanceof ContentDescription || element.eResource() == null) {
-			element.setName(newName);
-			if (element instanceof ProcessComponent) {
-				Process proc = ((ProcessComponent) element)
-						.getProcess();
-				proc.setName(newName);
-			}
-		} else {
-			LibraryView.runRename(element, newName);
-		}
-	}
-		
-	private void registerSetElement(MethodElement element, EStructuralFeature feature, Object newValue) {
-		String guid0 = ((MethodElement)newValue).getGuid();
-		String guid1 = element.getGuid();
-		Object[] val = new Object[3];
-		val[0] = feature;
-		val[1] = newValue;
-		val[2] = element;
-		if (setElementMap == null) {
-			setElementMap = new HashMap();
-		}
-		setElementMap.put(element.getName() + guid0 + guid1, val);
-	}
-	
-	private void handleSetElements() {
-		if (setElementMap == null) {
-			return;
-		}
-		for (Iterator it = setElementMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Map.Entry) it.next();
-			Object[] val = (Object[])entry.getValue();
-			EStructuralFeature feature = (EStructuralFeature) val[0];
-			MethodElement newValue = (MethodElement) val[1];
-			MethodElement element = (MethodElement) val[2];
-			String guid = newValue.getGuid();
-			MethodElement mergedValue = (MethodElement) replacedElementMap.get(guid);
-			if (mergedValue != null && mergedValue != newValue) {
-				element.eSet(feature, mergedValue);
-			}			
-		}
-	}
-
-	/**
-	 * Ensures unique name.
-	 */
-	public static void ensureUniqueName(EObject owner, MethodElement newObj, Map renameElementMap) {
-		if (owner == null) {
-			return;
-		}
-		Class cls = newObj.getClass();
-		Map nameMap = new HashMap();
-		for (int i=0; i < owner.eContents().size(); i++) {
-			Object oldObj = owner.eContents().get(i);
-			if (oldObj.getClass() == cls && oldObj != newObj) {
-				MethodElement oldElem = (MethodElement) oldObj;
-				nameMap.put(oldElem.getName(), oldElem);
-			}
-		}
-		String name = newObj.getName();
-		String renamed = name;
-		while (nameMap.containsKey(renamed)) {
-			renamed += "_renamed"; //$NON-NLS-1$
-		}
-		if (renamed != name) {
-			newObj.setName(renamed);
-			
-			Object[] entryVal = new Object[4];
-			entryVal[0] = newObj;
-			entryVal[1] = name;
-			entryVal[2] = nameMap.get(name);
-			entryVal[3] = renamed;
-			renameElementMap.put(newObj.getGuid(), entryVal);			
-		}
-	}
-	
-	/**
-	 * Ensures unique name for existing element.
-	 */
-	public static void ensureUniqueNameForExistingElement(MethodElement element, String oldName, String newName, Map renameElementMap) {
-		EObject elementOwner = element.eContainer();					
-		if (elementOwner != null) {
-			element.setName(newName);
-			ensureUniqueName(elementOwner, element, renameElementMap);
-			if (!element.getName().equals(newName)) {	//if handled then return
-				return;
-			}			
-			element.setName(oldName);
-		}			
-		Object[] entryVal = new Object[2];
-		entryVal[0] = element;
-		entryVal[1] = newName;
-		renameElementMap.put(element.getGuid(), entryVal);
-	}
-
-	private void checkModifiedFiles() {
-		final List modifiedFiles = getModifiedResources(baseLibrary);
-		modifiedFiles.addAll(resScanner.getFilesTobeReplaced());
-		modifiedFiles.addAll(diagramHandler.getModifiedFiles());
-
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				fileCheckedOutStatus = FileModifyChecker.checkModify(modifiedFiles);
-			}
-		});
-	}
-
-	private List unlockPlugins() {
-
-		List pluginIds = new ArrayList();
-		
-		Map<String, MethodPlugin> map = new HashMap<String, MethodPlugin>();
-		Map<String, MethodPlugin> guidMap = new HashMap<String, MethodPlugin>();
-		List<MethodPlugin> basePlugins = LibraryService.getInstance().getCurrentMethodLibrary()
-											.getMethodPlugins();
-		for (int i = 0; i < basePlugins.size(); i++) {
-			MethodPlugin plugin = basePlugins.get(i);
-			map.put(plugin.getName(), plugin);
-			guidMap.put(plugin.getGuid(), plugin);
-		}
-		
-		if (map.isEmpty()) {
-			return pluginIds;
-		}
-		
-		List fileNameToCheck = new ArrayList();
-		List<MethodPlugin> importPlugins = importingLibrary.getMethodPlugins();
-		for (int i = 0; i < importPlugins.size(); i++) {
-			MethodPlugin plugin = importPlugins.get(i);
-			String name = plugin.getName();
-			String guid = plugin.getGuid();
-			
-			MethodPlugin basePlugin0 = guidMap.get(guid);
-			if (basePlugin0 != null) {
-				String name0 = basePlugin0.getName();
-				if (! name0.equals(name)) {
-					renamePluginMap.put(name0, name);
-				}
-			}
-			
-			MethodPlugin basePlugin = map.get(name);
-			boolean toAdd = false;
-			if (basePlugin != null && ! basePlugin.getGuid().equals(guid)
-					&& ! basePlugin.getUserChangeable()) {
-				toAdd = true;
-			} else {
-				basePlugin = guidMap.get(guid);
-				if (basePlugin != null /*&& ! basePlugin.getName().equals(name)*/
-						&& ! basePlugin.getUserChangeable()) {
-					toAdd = true;
-				} 
-			}
-			
-			if (toAdd){				
-				pluginIds.add(basePlugin.getGuid());
-				basePlugin.setUserChangeable(new Boolean(true));
-				Resource res = basePlugin.eResource();
-				if (res != null && res.getURI() != null) {
-					String fileName = res.getURI().toFileString();
-					fileNameToCheck.add(fileName);
-				}
-			}
-		}	
-		
-		if (fileNameToCheck.size() > 0) {
-			final List modifiedFiles = fileNameToCheck;	
-			SafeUpdateController.syncExec(new Runnable() {
-				public void run() {
-					fileCheckedOutStatus = FileModifyChecker.checkModify(modifiedFiles);
-				}
-			});
-		}
-		
-		return pluginIds;
-	}
-
-	/**
-	 * @param unlockedPlugins
-	 */
-	public static void lockUnlockedPlugins(List unlockedPlugins) {
-		List plugins = LibraryService.getInstance().getCurrentMethodLibrary()
-				.getMethodPlugins();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			if (unlockedPlugins.contains(plugin.getGuid())) {
-				plugin.setUserChangeable(new Boolean(false));
-			}
-		}
-	}
-	
-	private void logNewElementUnderExistingPlugin(MethodElement newObj) {
-		ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(newObj);
-		String pluginPath = libResMgr.getPhysicalPluginPath(newObj);
-		if (pluginPath != null) {
-			logNewElement(newObj);
-		}
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/PluginImportData.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/PluginImportData.java
deleted file mode 100644
index c49e2bb..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/PluginImportData.java
+++ /dev/null
@@ -1,230 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.authoring.ui.preferences.LibraryLocationData;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * Encapsulates the input data required to import a method plug-in.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PluginImportData {
-
-	// these are set by the wizard
-	public LibraryLocationData llData = new LibraryLocationData();
-
-	public boolean deleteExistingPlugins;
-
-	// these are filled in by the importing service
-	public String libraryVersion;
-
-	private List plugins = new ArrayList();
-
-	private List configs = new ArrayList();
-
-	private ErrorInfo error = new ErrorInfo();
-
-	// ap the guid to url for base plugin, this is the only formation available
-	public Map basePluginUrlMap = new HashMap();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PluginImportData() {
-	}
-
-	/**
-	 * Clears the contents.
-	 */
-	public void clear() {
-		plugins.clear();
-		configs.clear();
-		error.errorMessage.setLength(0);
-	}
-
-	/**
-	 * Validates the plugins.
-	 */
-	public void validatePlugins() {
-		PluginInfo info;
-		int i = 0;
-		while (i < plugins.size()) {
-			info = (PluginInfo) plugins.get(i);
-			if (info.url == null) {
-				plugins.remove(i);
-			} else {
-				i++;
-			}
-		}
-	}
-
-	/**
-	 * Returns a PluginInfo object given the guid.
-	 */
-	public PluginInfo getPluginInfo(String guid) {
-		PluginInfo info;
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			info = (PluginInfo) it.next();
-			if (info.guid.equals(guid)) {
-				return info;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Removes a PluginInfo object given the guid.
-	 */
-	public void removePluginInfo(String guid) {
-		PluginInfo info;
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			info = (PluginInfo) it.next();
-			if (info.guid.equals(guid)) {
-				plugins.remove(info);
-				break;
-			}
-		}
-
-	}
-
-	/**
-	 * Returns a ConfiguarationInfo object given the guid.
-	 */
-	public ConfiguarationInfo getConfigInfo(String guid) {
-
-		if ( guid == null ) {
-			return null;
-		}
-		PluginImportData.ConfiguarationInfo cinfo;
-		for (Iterator it = getConfigs().iterator(); it.hasNext();) {
-			cinfo = (PluginImportData.ConfiguarationInfo) it.next();
-			if (guid.equals(cinfo.guid) ) {
-				return cinfo;
-			}
-		}
-		
-		return null;
-	}
-	
-	
-	/**
-	 * return a list of PluginInfo object
-	 * 
-	 * @return List a list of PluginInfo objects
-	 */
-	public List getPlugins() {
-		return plugins;
-	}
-
-	/**
-	 * return a list of ConfigInfo objects
-	 * 
-	 * @return List
-	 */
-	public List getConfigs() {
-		return configs;
-	}
-
-	/**
-	 * return the error message if any
-	 * 
-	 * @return String
-	 */
-	public ErrorInfo getErrorInfo() {
-		return error;
-	}
-
-	public class PluginInfo {
-
-		// If not null, this is a valid plug-in.
-		public String url = null;
-
-		public String name;
-
-		public String guid;
-
-		public String version;
-
-		public String brief_desc;
-
-		public String authors;
-
-		public String changeDate;
-
-		public List usedPlugins = new ArrayList();
-
-		// If null, this plug-in does not exists in the current library.
-		public MethodPlugin existingPlugin = null;
-
-		// If true, replace the current plug-in with the one in the import
-		// library. If false, don't import the plug-in.
-		public boolean selected = false;
-
-		public PluginInfo() {
-		}
-
-		public String toString() {
-			return name;
-		}
-	}
-
-	public class ConfiguarationInfo {
-
-		public String name;
-
-		public String guid;
-
-		public String version;
-
-		// The current configuration.
-		public MethodConfiguration existingConfig = null;
-
-		public boolean selected = true;
-
-		public ConfiguarationInfo() {
-		}
-
-	}
-
-	public class ErrorInfo {
-
-		private StringBuffer errorMessage = new StringBuffer();
-
-		public ErrorInfo() {
-
-		}
-
-		public void addError(String message) {
-			errorMessage.append(message);
-		}
-
-		public String getError() {
-			return errorMessage.toString();
-		}
-
-		public void clear() {
-			errorMessage.setLength(0);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/PluginImportingService.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/PluginImportingService.java
deleted file mode 100644
index 1d418dc..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/PluginImportingService.java
+++ /dev/null
@@ -1,1281 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Copy;
-import org.apache.tools.ant.types.FileSet;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-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.ResourceSet;
-import org.eclipse.epf.authoring.ui.views.LibraryView;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.export.services.ConfigurationExportService;
-import org.eclipse.epf.export.services.LibraryDocument;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.PluginImportData.ConfiguarationInfo;
-import org.eclipse.epf.importing.services.PluginImportData.PluginInfo;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
-import org.eclipse.epf.persistence.MultiFileXMISaveImpl;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.osgi.util.NLS;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * Imports a method plug-in into the current library.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @author Weiping Lu
- * @since 1.0
- */
-public class PluginImportingService {
-
-	private UpgradeCallerInfo upGradeInfo;
-	
-	//Temp flag indicating use of the new merge scheme
-	private static boolean newMergeScheme = true; 
-	
-	private static boolean localDebug = false;
-	
-	private PluginImportData data;
-
-	LibraryDocument importingLibDoc;
-	LibraryDocument targetLibDoc;
-
-	// Flag to indicate the file checkout status.
-	IStatus fileCheckedOutStatus = null;
-	
-	private boolean checkBasePlugins = true;
-	
-	private File defaultConfigFolder;
-	private Map<String, File> targetFileMap;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PluginImportingService(PluginImportData data) {
-		this.data = data;
-	}
-
-	/**
-	 * Validates the plug-in against the current library, collects all the
-	 * informations including plug-in info, configuation info and error info.
-	 * Call this method, then call getError(), getPlugins(), getConfigs().
-	 */
-	public void validate(IProgressMonitor monitor) {
-		try {
-			if (monitor != null) {
-				monitor.setTaskName(ImportResources.PluginImportingService_MSG0); 
-			}
-
-			if (this.data == null) {
-				return;
-			}
-
-			this.data.clear();
-
-			// Prepare the lib files.
-			File importingLibPath = new File(data.llData.getParentFolder()
-					+ File.separator + LibraryDocument.exportFile);
-			if (!importingLibPath.exists()) {
-				data
-						.getErrorInfo()
-						.addError(
-								NLS.bind(ImportResources.PluginImportingService_MSG1, importingLibPath.toString())); 
-				return;
-			}
-			
-			boolean handleVersion = true;
-			if (handleVersion) {
-				upGradeInfo = new ConfigurationImportService.UpgradeInfo(UpgradeCallerInfo.upgradeImportPlugin, importingLibPath);
-				if (! ConfigurationImportService.handleToolVersion(importingLibPath, upGradeInfo)) {
-					data
-					.getErrorInfo()
-					.addError(
-							NLS.bind(ImportResources.importPluginsWizard_ERR_Import_plugin, importingLibPath.toString())); 
-					return;
-				}
-				if (upGradeInfo.getCopiedLibFile() != null) {
-					importingLibPath = upGradeInfo.getCopiedLibFile();
-				}
-			} else {
-				String versionError = ConfigurationImportService.versionCheck(importingLibPath.getAbsolutePath(), 
-						ImportResources.importPluginsWizard_title);
-				if (versionError != null) {
-					data.getErrorInfo().addError(versionError);
-					return;
-				}
-			}
-
-			importingLibDoc = new LibraryDocument(importingLibPath);
-			
-			File libFile = new File(LibraryService.getInstance()
-					.getCurrentMethodLibrary().eResource().getURI()
-					.toFileString());
-			targetLibDoc = new LibraryDocument(libFile);
-
-			scanLibraryFile(importingLibDoc);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-
-	}
-
-	/**
-	 * Performs import.
-	 */
-	public void performImport(IProgressMonitor monitor) throws Exception {
-
-		// need to disable the workspace refreshing
-		boolean refresh = RefreshJob.getInstance().isEnabled();
-		try {
-			if (refresh) {
-				// disable resource refreshing during import
-				//
-				RefreshJob.getInstance().setEnabled(false);
-			}
-
-			__doImport(monitor);
-
-		} finally {
-			if (refresh) {
-				// re-enable resource refreshing
-				//
-				RefreshJob.getInstance().setEnabled(true);
-			}
-			if (upGradeInfo != null) {
-				upGradeInfo.removeCopiedLibrary();
-				upGradeInfo = null;
-			}
-			defaultConfigFolder = null;
-			targetFileMap = null;
-		}
-	}
-
-	private void __doImport(IProgressMonitor monitor) {
-		try {
-			if (monitor != null) {
-				monitor.setTaskName(ImportResources.PluginImportingService_MSG3); 
-			}
-
-			List unlockedPlugins = unlockPlugins();
-			if ((fileCheckedOutStatus != null)
-					&& !fileCheckedOutStatus.isOK()) {
-				// log error
-				displayCheckOutError();
-				return;
-			}
-
-			// To import the plug-ins, we need to do the following:
-			// 1. Delete the plug-ins in the current library if user specify
-			// remove
-			// 2. Copy the selected plugin files to the destination
-			// 3. Update the library.xmi
-			// 4. Reload the library
-			
-			File libFile = targetLibDoc.getFile();
-			defaultConfigFolder = null;
-			targetFileMap = new HashMap<String, File>();
-			
-			if (newMergeScheme) {			
-				if (! merge(targetLibDoc)) {
-					SafeUpdateController.syncExec(new Runnable() {
-						public void run() {
-							String title = ImportResources.importPluginsWizard_title;
-							String msg = ImportResources.importPluginsWizard_ERR_Import_plugin; 
-							new MsgDialog(ImportPlugin.getDefault())
-									.displayError(title, msg);
-						}
-					});
-					return;
-				}
-				if (unlockedPlugins.size() > 0) {
-					lockUnlockedPlugins(unlockedPlugins);
-					LibraryService.getInstance().saveCurrentMethodLibrary();
-					LibraryService.getInstance().reopenCurrentMethodLibrary();
-				}
-				MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-				ResourceUtil.refreshResources(lib, monitor);
-				return;
-			}			
-
-			// // Remove existing entries.
-			// removeExistingEntries(targetLibDoc);
-
-			// Import entries and copy files.
-			if (importEntries(targetLibDoc)) {
-				// Save the updated library file.
-				targetLibDoc.save();
-
-				// Replace the guid of the old MethodLibrary with the new one.
-				fixLibraryGuid(libFile.getParentFile(), importingLibDoc
-						.getLibraryGuid(), targetLibDoc.getLibraryGuid());
-
-				// Reopen the library.
-				LibraryService.getInstance().reopenCurrentMethodLibrary();
-
-				// Finally, re-lock the unlocked plugins and save the library
-				// again.
-				if (unlockedPlugins.size() > 0) {
-					lockUnlockedPlugins(unlockedPlugins);
-					LibraryService.getInstance().saveCurrentMethodLibrary();
-				}
-			}
-
-			// Re-open library and fresh the workspace.
-			LibraryService.getInstance().reopenCurrentMethodLibrary();
-
-			// refresh library files in workspace
-			//
-			MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-			ResourceUtil.refreshResources(lib, monitor);
-
-		} catch (Exception e) {
-			ImportPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	private List unlockPlugins() {
-
-		List pluginIds = new ArrayList();
-		
-		Map<String, MethodPlugin> map = new HashMap<String, MethodPlugin>();
-		List<MethodPlugin> basePlugins = LibraryService.getInstance().getCurrentMethodLibrary()
-											.getMethodPlugins();
-		for (int i = 0; i < basePlugins.size(); i++) {
-			MethodPlugin plugin = basePlugins.get(i);
-			map.put(plugin.getName(), plugin);
-		}
-		List<MethodPlugin> possibleExtraUnlockPlugins = new ArrayList<MethodPlugin>();
-
-		PluginImportData.PluginInfo info;
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			info = (PluginImportData.PluginInfo) it.next();
-			if ((info.existingPlugin != null) && info.selected) {
-				if (info.existingPlugin.getUserChangeable().booleanValue() == false) {
-					info.existingPlugin.setUserChangeable(new Boolean(true));
-					pluginIds.add(info.existingPlugin.getGuid());
-				}
-			}
-			if (info.selected) {
-				MethodPlugin basePlugin = map.get(info.name);
-				if (basePlugin != null && ! basePlugin.getGuid().equals(info.guid)
-						&& ! basePlugin.getUserChangeable()) {
-					possibleExtraUnlockPlugins.add(basePlugin);
-				}
-			}
-		}
-		
-		handleExtraUnlockPlugins(pluginIds, possibleExtraUnlockPlugins);
-		
-		return pluginIds;
-	}
-
-	private void handleExtraUnlockPlugins(List pluginIds,
-			List<MethodPlugin> possibleExtraUnlockPlugins) {
-		if (possibleExtraUnlockPlugins == null || possibleExtraUnlockPlugins.isEmpty()) {
-			return;
-		}
-		
-		List fileNameToCheck = new ArrayList();
-		for (int i = 0; i < possibleExtraUnlockPlugins.size(); i++) {
-			MethodPlugin plugin = possibleExtraUnlockPlugins.get(i);
-			String guid = plugin.getGuid();
-			if (! pluginIds.contains(guid)) {
-				plugin.setUserChangeable(new Boolean(true));
-				pluginIds.add(guid);
-				Resource res = plugin.eResource();
-				if (res != null && res.getURI() != null) {
-					String fileName = res.getURI().toFileString();
-					fileNameToCheck.add(fileName);
-				}
-			}
-		}
-
-		if (fileNameToCheck.size() > 0) {
-			final List modifiedFiles = fileNameToCheck;	
-			SafeUpdateController.syncExec(new Runnable() {
-				public void run() {
-					fileCheckedOutStatus = FileModifyChecker.checkModify(modifiedFiles);
-				}
-			});
-		}
-	}
-
-	private void lockUnlockedPlugins(List unlockedPlugins) {
-		List plugins = LibraryService.getInstance().getCurrentMethodLibrary()
-				.getMethodPlugins();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			if (unlockedPlugins.contains(plugin.getGuid())) {
-				plugin.setUserChangeable(new Boolean(false));
-			}
-		}
-	}
-
-	private boolean importEntries(LibraryDocument targetLibDoc) {
-		// 1. Find the entries to be removed.
-		List importList = new ArrayList();
-		List newList = new ArrayList();
-		PluginImportData.PluginInfo info;
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			info = (PluginImportData.PluginInfo) it.next();
-			if (info.selected) {
-				if (info.existingPlugin == null) {
-					newList.add(info.guid);
-				}
-
-				importList.add(info.guid);
-			}
-		}
-
-		PluginImportData.ConfiguarationInfo cinfo;
-		for (Iterator it = data.getConfigs().iterator(); it.hasNext();) {
-			cinfo = (PluginImportData.ConfiguarationInfo) it.next();
-			if (cinfo.selected) {
-				if (cinfo.existingConfig == null) {
-					newList.add(cinfo.guid);
-				}
-
-				importList.add(cinfo.guid);
-
-			}
-		}
-
-		// 2. Iterate the docuemnt and add the new entries.
-		if (!newMergeScheme) {
-			importLibEntries(targetLibDoc, newList);
-		} else {
-			MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-			ensureUniqueNames(lib.getMethodPlugins());
-			ensureUniqueNames(lib.getPredefinedConfigurations());
-		}
-		return copyFiles(targetLibDoc, importList, newList);
-	}
-
-	private void importLibEntries(LibraryDocument targetLibDoc, List newList) {
-
-		if (newList == null || newList.size() == 0) {
-			return;
-		}
-
-		// Add plug-ins.
-		NodeList nodes = importingLibDoc.getPlugins();
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Element node = (Element) nodes.item(i);
-			String guid = LibraryDocument.getGuid(node);
-			if (newList.contains(guid)) {
-				targetLibDoc.addPlugin(node);
-			}
-		}
-
-		// Add configurations.
-		nodes = importingLibDoc.getConfigurations();
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Element node = (Element) nodes.item(i);
-			String guid = LibraryDocument.getGuid(node);
-			if (newList.contains(guid)) {
-				targetLibDoc.addConfiguration(node);
-			}
-		}
-
-		// add resource entries
-		nodes = importingLibDoc.getResourceDescriptors();
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Element node = (Element) nodes.item(i);
-			String guid = node.getAttribute(LibraryDocument.ATTR_id);
-			if (newList.contains(guid)) {
-				targetLibDoc.addResource(node);
-			}
-		}
-
-		// Add the resource sub managers.
-		nodes = importingLibDoc.getResourceSubManagers();
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Element node = (Element) nodes.item(i);
-			String guid = LibraryDocument.getSubManagerBaseGuid(node
-					.getAttribute(LibraryDocument.ATTR_href));
-			if (newList.contains(guid)) {
-				targetLibDoc.addResource(node);
-			}
-		}
-
-	}
-
-	private boolean copyFiles(LibraryDocument targetLibDoc, List importList,
-			List newList) {
-		final MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-		
-		for (Iterator it = importList.iterator(); it.hasNext();) {
-			String guid = (String) it.next();
-			String src_uri = importingLibDoc.getResourceUri(guid);
-			String target_uri;
-			if (src_uri == null || src_uri.length() == 0) {
-				continue;
-			}
-
-			target_uri = src_uri;
-			/*
-			if (newList.contains(guid)) {
-				target_uri = src_uri;
-			} else {
-				target_uri = targetLibDoc.getResourceUri(guid); // the resource
-				// might be
-				// renamed
-			}
-			*/
-
-			// Check the plugin.xmi file. If it exists, copy the folder to
-			// the destination directory.
-			final File src_file = importingLibDoc.getFileFromUri(src_uri);
-			if (src_file.exists()) {
-/*				final File target_file = targetLibDoc
-						.getFileFromUri(target_uri);*/
-				
-				final File target_file = getTargetFile(lib, guid);
-				if (target_file == null) {
-					return false;
-				}
-				targetFileMap.put(guid, target_file);
-
-				// if it's a configuration, only copy the file,
-				// if it's a plugin, copy the whole directory
-
-				if (data.getPluginInfo(guid) != null) {
-					if (target_file.exists()) {
-						SafeUpdateController.syncExec(new Runnable() {
-							public void run() {
-								DirCopy copy = new DirCopy(src_file
-										.getParentFile(), target_file
-										.getParentFile());
-								fileCheckedOutStatus = copy.execute();
-							}
-						});
-					} else {
-						copyDir(src_file.getParentFile(), target_file
-								.getParentFile());
-					}
-				} else if (data.getConfigInfo(guid) != null && DirCopy.needCopy(src_file, target_file)) {
-					final List files = new ArrayList();
-					if (target_file.exists()) {
-						files.add(target_file.getAbsolutePath());
-						SafeUpdateController.syncExec(new Runnable() {
-							public void run() {
-								fileCheckedOutStatus = FileModifyChecker
-										.checkModify(files);
-							}
-						});
-					}
-
-					if (fileCheckedOutStatus == null
-							|| fileCheckedOutStatus.isOK()) {
-						FileUtil.copyFile(src_file, target_file);
-					}
-				}
-
-				if ((fileCheckedOutStatus != null)
-						&& !fileCheckedOutStatus.isOK()) {
-					// log error
-					displayCheckOutError();
-
-					return false;
-				}
-			}
-		}
-
-		return true;
-	}
-
-	private void displayCheckOutError() {
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				String title = ImportResources.importPluginsWizard_title; 
-				String msg = ImportResources.importPluginsWizard_ERR_Import_plugin; 
-				new MsgDialog(ImportPlugin.getDefault())
-						.displayError(title, msg,
-								fileCheckedOutStatus);
-			}
-		});
-	}
-
-	/**
-	 * Copies directories from "fromDir" to "toDir".
-	 */
-	public static void copyDir(File fromDir, File toDir) {
-		Copy cp = new Copy();
-		cp.setOverwrite(true);
-		FileSet set = new FileSet();
-		set.setExcludes(ConfigurationExportService.excludes);
-		set.setDir(fromDir);
-		cp.addFileset(set);
-		cp.setTodir(toDir);
-		cp.setProject(new Project());
-		cp.execute();
-
-	}
-
-	// /**
-	// * remove the plugin entry from the library document
-	// *
-	// * @param document
-	// * LibraryDocument
-	// * @param guid
-	// * String guid of the plugin
-	// */
-	// private void removeExistingEntries(LibraryDocument document) {
-	// // 1. Find the entries to be removed.
-	// List removeList = new ArrayList();
-	// PluginImportData.PluginInfo info;
-	// for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-	// info = (PluginImportData.PluginInfo) it.next();
-	// if ((info.existingPlugin != null) && info.selected) {
-	// removeList.add(info.guid);
-	// }
-	// }
-	//
-	// PluginImportData.ConfiguarationInfo cinfo;
-	// for (Iterator it = data.getConfigs().iterator(); it.hasNext();) {
-	// cinfo = (PluginImportData.ConfiguarationInfo) it.next();
-	// if ((cinfo.existingConfig != null) && cinfo.selected) {
-	// removeList.add(cinfo.guid);
-	// }
-	// }
-	//
-	// // 2. Iterate the docuemnt and remove the entries.
-	// document.removePlugins(removeList);
-	// document.removeConfigurations(removeList);
-	// document.removeResourceEntries(removeList);
-	// }
-
-	 /** 
-	  * Validates selection.
-	 */
-	public String validateSelection() {
-		if (! isCheckBasePlugins()) {
-			return null;
-		}
-		data.getErrorInfo().clear();
-
-		// Iterate the new plugins, make sure the base is included
-		// either as an importing plugin, or is in the current library
-		// get the method plugins in the current library.
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		List plugins = (library == null) ? new ArrayList() : library
-				.getMethodPlugins();
-		Map pluginids = new HashMap();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			pluginids.put(plugin.getGuid(), plugin);
-		}
-
-		// The base plug-ins MUST be either a selected one or an existing one
-		// otherwise, can't import
-		Set basePlugins = new HashSet();
-
-		Set newPlugins = new HashSet();
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			PluginImportData.PluginInfo info = (PluginImportData.PluginInfo) it
-					.next();
-			//if (info.selected && (info.existingPlugin == null)) {
-			if (info.selected) {
-				newPlugins.add(info.guid);
-				for (Iterator itb = info.usedPlugins.iterator(); itb.hasNext();) {
-					Object base = itb.next();
-					if (!basePlugins.contains(base)) {
-						basePlugins.add(base);
-					}
-				}
-			}
-		}
-
-		if (newPlugins.size() > 0) {
-			for (Iterator it = basePlugins.iterator(); it.hasNext();) {
-				String guid = (String) it.next();
-				String uri = (String) data.basePluginUrlMap.get(guid);
-				if (!newPlugins.contains(guid) && !pluginids.containsKey(guid)) {
-					String message;
-					if (uri != null && uri.length() > 0) {
-						message = NLS.bind(ImportResources.PluginImportingService_MSG5, uri); 
-					} else {
-						Map<String, String> guidToPlugNameMap = importingLibDoc.getGuidToPlugNameMap();
-						String pluginName = guidToPlugNameMap == null ? null : guidToPlugNameMap.get(guid);
-						if (pluginName == null || pluginName.length() == 0) {
-							message = ImportResources.PluginImportingService_MSG6; 
-						} else {
-							message = NLS.bind(ImportResources.PluginImportingService_MSG5, 
-									pluginName + ", " + guid); 		//$NON-NLS-1$
-						}
-					}
-					data.getErrorInfo().addError(message);
-
-					if (uri == null || uri.length() == 0) {
-						break;
-					}
-				}
-			}
-		}
-
-		return data.getErrorInfo().getError();
-	}
-
-	private void scanLibraryFile(LibraryDocument document) {
-		visitLibTag(document);
-		visitResourceTag(document);
-		data.validatePlugins();
-
-		// Check base plug-in dependencies.
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			PluginImportData.PluginInfo info = (PluginImportData.PluginInfo) it
-					.next();
-			if (info.existingPlugin == null) {
-				for (Iterator itbase = info.usedPlugins.iterator(); itbase
-						.hasNext();) {
-					String guid = (String) itbase.next();
-					if (!data.basePluginUrlMap.containsKey(guid)) {
-						data.basePluginUrlMap.put(guid, ""); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-	}
-
-	private void visitLibTag(LibraryDocument document) {
-		// Reload the element mapping.
-		NodeList nodes = document.getPlugins();
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Element node = (Element) nodes.item(i);
-			PluginImportData.PluginInfo pi = data.new PluginInfo();
-			pi.guid = LibraryDocument.getGuid(node);
-			data.getPlugins().add(pi);
-
-			// Check with the current library, get the related information.
-			loadExistingPluginInfo(pi);
-		}
-
-		// Remove the unneeded configurations.
-		buildConfigInfoFromFiles();
-	}
-
-	private void visitResourceTag(LibraryDocument document) {
-		NodeList nodes = document.getResourceDescriptors();
-		for (int i = 0; i < nodes.getLength(); i++) {
-			Element node = (Element) nodes.item(i);
-			String guid = node.getAttribute(LibraryDocument.ATTR_id);
-			String uri = node.getAttribute(LibraryDocument.ATTR_uri);
-
-			// Load the plugin.xmi file for detail information.
-			File file = document.getFileFromUri(uri);
-
-			PluginImportData.PluginInfo pi = data.getPluginInfo(guid);
-			if (pi != null) {
-				if (file.exists()) {
-					loadPluginInfo(file, pi);
-				} else {
-					// Remove the plug-in info entry since thias is not
-					// a valid plug-in to import.
-					data.removePluginInfo(guid);
-				}
-			} else {
-				// if not plugin, might be a configuration
-				PluginImportData.ConfiguarationInfo ci = data
-						.getConfigInfo(guid);
-				if (ci != null) {
-					if (file.exists()) {
-						loadConfigInfo(file, ci);
-					}
-				}
-			}
-		}
-	}
-
-	protected void loadConfigInfo(File source,
-			PluginImportData.ConfiguarationInfo info) {
-		try {
-			Document document = XMLUtil.loadXml(source);
-			Element root = document.getDocumentElement();
-
-			Element configTag = null;
-			if (root.getTagName().equals(
-					"org.eclipse.epf.uma:MethodConfiguration")) //$NON-NLS-1$
-			{
-				configTag = root;
-			} else {
-				NodeList nodes = root
-						.getElementsByTagName("org.eclipse.epf.uma:MethodConfiguration"); //$NON-NLS-1$
-				if (nodes.getLength() > 0) {
-					configTag = (Element) nodes.item(0);
-				}
-			}
-
-			if (configTag != null) {
-				info.name = configTag.getAttribute("name"); //$NON-NLS-1$
-			}
-		} catch (Exception e) {
-			ImportPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	protected void loadPluginInfo(File source, PluginImportData.PluginInfo info) {
-		try {
-			Document document = XMLUtil.loadXml(source);
-			Element root = document.getDocumentElement();
-
-			Element pluginTag = null;
-			if (root.getTagName().equals("org.eclipse.epf.uma:MethodPlugin")) //$NON-NLS-1$
-			{
-				pluginTag = root;
-			} else {
-				NodeList nodes = root
-						.getElementsByTagName("org.eclipse.epf.uma:MethodPlugin"); //$NON-NLS-1$
-				if (nodes.getLength() > 0) {
-					pluginTag = (Element) nodes.item(0);
-				}
-			}
-
-			if (pluginTag != null) {
-				info.name = pluginTag.getAttribute("name"); //$NON-NLS-1$
-				info.version = LibraryDocument.getChildValue(pluginTag,
-						"version"); //$NON-NLS-1$
-				info.brief_desc = LibraryDocument.getChildValue(pluginTag,
-						"briefDescription"); //$NON-NLS-1$
-				info.authors = LibraryDocument.getChildValue(pluginTag,
-						"authors"); //$NON-NLS-1$
-				info.changeDate = LibraryDocument.getChildValue(pluginTag,
-						"changeDate"); //$NON-NLS-1$
-				info.url = source.toString();
-
-				// Get the base plug-ins.
-				NodeList nodes = pluginTag.getElementsByTagName("bases"); //$NON-NLS-1$
-				for (int i = 0; i < nodes.getLength(); i++) {
-					Element node = (Element) nodes.item(i);
-					String guid = node.getAttribute(LibraryDocument.ATTR_href);
-
-					int indx = guid.indexOf("#"); //$NON-NLS-1$
-					if (indx > 0) {
-						guid = guid.substring(indx + 1);
-					} else {
-						indx = guid.indexOf("uma://"); //$NON-NLS-1$
-						if (indx >= 0) {
-							guid = guid.substring(indx + 6);
-						}
-					}
-					info.usedPlugins.add(guid);
-				}
-			}
-		} catch (Exception e) {
-			ImportPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	private void loadExistingPluginInfo(PluginImportData.PluginInfo info) {
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		List plugins = (library == null) ? new ArrayList() : library
-				.getMethodPlugins();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			if (plugin.getGuid().equals(info.guid)) {
-				info.existingPlugin = plugin;
-			}
-		}
-	}
-
-	private void loadExistingConfigInfo(PluginImportData.ConfiguarationInfo info) {
-		MethodConfiguration[] configs = LibraryServiceUtil
-				.getMethodConfigurations(LibraryService.getInstance()
-						.getCurrentMethodLibrary());
-		if (configs == null || configs.length == 0) {
-			return;
-		}
-
-		for (int i = 0; i < configs.length; i++) {
-			MethodConfiguration config = configs[i];
-			if (config.getGuid().equals(info.guid)) {
-				info.existingConfig = config;
-			}
-		}
-	}
-
-	/**
-	 * Replaces the guid of the old method library with the new one.
-	 * <p>
-	 * Search for the following files: library.xmi, plugin.xmi, model.xmi.
-	 */
-	private void fixLibraryGuid(File path, String oldGuid, String newGuid) {
-		if (!path.isDirectory()) {
-			return;
-		}
-
-		File[] files = path.listFiles(new FileFilter() {
-
-			public boolean accept(File f) {
-
-				if (f.isDirectory()) {
-					return true;
-				}
-
-				String name = f.getName();
-				return name.equals("library.xmi") || name.equals("plugin.xmi") || name.equals("model.xmi"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-		});
-
-		if (files == null || files.length == 0) {
-			return;
-		}
-
-		for (int i = 0; i < files.length; i++) {
-			if (files[i].isDirectory()) {
-				fixLibraryGuid(files[i], oldGuid, newGuid);
-			} else {
-				// Read in the file, update it and save the file.
-				try {
-					String source = FileUtil.readFile(files[i],
-							FileUtil.ENCODING_UTF_8).toString();
-					if (source.indexOf(oldGuid) >= 0) {
-						// TODO: This is a regexp repalcement, is it safe?
-						source = source.replaceAll(oldGuid, newGuid);
-
-						FileUtil.writeUTF8File(files[i].getAbsolutePath(),
-								source);
-					}
-
-				} catch (IOException e) {
-					ImportPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-	
-	private boolean merge(LibraryDocument targetLibDoc) throws Exception {
-		//Copy files only as newMergeScheme = true
-		if (! importEntries(targetLibDoc)) {
-			return false;
-		}
-		
-		MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-		Resource res0 = lib.eResource();
-		ResourceManager resMgr0 = (ResourceManager) MultiFileSaveUtil.getResourceManager(res0);
-		ResourceSet resSet = res0.getResourceSet();
-		
-		mergePlugins(targetLibDoc, lib, resMgr0, resSet);		
-		mergeConfigs(targetLibDoc, lib, resMgr0, resSet);
-		
-		lib.eResource().setModified(true);
-		
-		save(lib, null);				
-		
-		//fixLibraryGuid(targetLibDoc.getFile().getParentFile(), importingLibDoc
-		//		.getLibraryGuid(), targetLibDoc.getLibraryGuid());
-		
-		LibraryService.getInstance().reopenCurrentMethodLibrary();
-		
-		if (! isCheckBasePlugins()) {
-			lib = LibraryService.getInstance().getCurrentMethodLibrary();
-			LibraryUtil.loadAll(lib);
-			List<MethodPlugin> missingBasePlugins = collectMissingBasePlugins(lib);
-			List<MethodConfiguration> configs = lib.getPredefinedConfigurations();// collectImportedConfigurations(lib);			
-			checkModify(configs);
-			if (! missingBasePlugins.isEmpty() || ! configs.isEmpty()) {			
-				lib.eResource().setModified(true);				
-				Set<Resource> resouresToSave = new LinkedHashSet<Resource>();
-				collectResourcestoSave(resouresToSave, missingBasePlugins);
-				collectResourcestoSave(resouresToSave, configs);
-				save(lib, resouresToSave);				
-				LibraryService.getInstance().reopenCurrentMethodLibrary();
-			}
-		}
-		
-		return true;
-	}
-
-	private void checkModify(List<MethodConfiguration> configs) {
-		if (configs == null) {
-			return;
-		}
-		final List configFiles = new ArrayList();
-		for (int i = 0; i < configs.size(); i++) {
-			MethodConfiguration config = configs.get(i);
-			Resource res = config.eResource();
-			if (res != null) {
-				String file = res.getURI().toFileString();
-				configFiles.add(file);
-			}
-		}
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				fileCheckedOutStatus = FileModifyChecker.checkModify(configFiles);
-			}
-		});
-	}
-	
-	private List<MethodPlugin> collectMissingBasePlugins(MethodLibrary lib) {
-		List<MethodPlugin> ret = new ArrayList<MethodPlugin>();
-		
-		Map map = MethodElementUtil.buildMap(lib.getMethodPlugins());
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			PluginImportData.PluginInfo info = (PluginImportData.PluginInfo) it.next();
-			if (info.selected ) {
-				MethodPlugin plugin = (MethodPlugin) map.get(info.guid);
-				if (plugin != null) {
-					List<MethodPlugin> bases = plugin.getBases();
-					for (int i=0; i < bases.size(); i++) {
-						MethodPlugin base = bases.get(i);
-						if (! map.containsKey(base.getGuid())) {
-							ret.add(plugin);
-							break;
-						}
-					}
-				}
-			}
-		}
-		
-		return ret;
-	}	
-	
-	private void collectResourcestoSave(Set<Resource> resources, List<? extends MethodElement> elements) {
-		if (elements == null || elements.isEmpty()) {
-			return;
-		}		
-		for (int i=0; i < elements.size(); i++) {
-			collectResourcestoSave(resources, elements.get(i));
-		}
-	}
-	
-	private void collectResourcestoSave(Set<Resource> resources, MethodElement parent) {
-		if (parent instanceof MethodPlugin) {		
-			for (Iterator it = parent.eAllContents(); it.hasNext();) {
-				EObject element = (EObject) it.next();
-				if (element instanceof ContentDescription) {
-					continue;
-				}
-				Resource res = element.eResource();
-				if (res != null) {
-					resources.add(res);
-					res.setModified(true);
-				}
-			}
-		}
-		Resource res = parent.eResource();
-		resources.add(res);
-		res.setModified(true);
-	}
-	
-	private void save(ILibraryPersister.FailSafeMethodLibraryPersister persister, Set<Resource> resouresToSave) 
-		throws Exception {
-		if (resouresToSave == null) {
-			return;
-		}
-		for (Iterator<Resource> it = resouresToSave.iterator(); it.hasNext();) {
-			MultiFileXMIResourceImpl res = (MultiFileXMIResourceImpl) it.next();
-			try {
-				if (! res.isSynchronized()) {
-					res.load(res.getResourceSet().getLoadOptions());
-				}
-				persister.save(res);
-			} catch (Exception e){
-				e.printStackTrace();
-			}
-		}
-	}	
-
-	private void save(MethodLibrary lib, Set<Resource> resouresToSave) {
-		//LibraryUtil.saveLibrary(lib, false, false);
-		
-		//This is temp, and can be revomved after a fix is done for passing persister's option to save
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) lib.eResource().getResourceSet();
-		Map defaultSaveOptions = resourceSet.getDefaultSaveOptions();
-		Object oldDefaultOptionVal = defaultSaveOptions.get(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES);
-		
-		ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-		Map saveOptions = persister.getSaveOptions();
-		if (! isCheckBasePlugins() && resouresToSave != null) {
-			saveOptions.put(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES, Boolean.TRUE);
-			defaultSaveOptions.put(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES, Boolean.TRUE);
-		}
-
-		try {
-			save(persister, resouresToSave);
-			persister.save(lib.eResource());
-			persister.commit();
-			
-		} catch (Exception e) {
-			persister.rollback();
-			e.printStackTrace();
-			
-		} finally {
-			if (! isCheckBasePlugins() && resouresToSave != null) {				
-				if (oldDefaultOptionVal == null) {
-					defaultSaveOptions.remove(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES);
-				} else {
-					defaultSaveOptions.put(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES, oldDefaultOptionVal);
-				}
-			}
-		}
-	}
-
-	private void mergePlugins(LibraryDocument targetLibDoc, MethodLibrary lib, ResourceManager resMgr0, ResourceSet resSet) {
-		List existingPluginGuids = null;
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			PluginImportData.PluginInfo info = (PluginImportData.PluginInfo) it.next();
-			if (info.selected && info.existingPlugin != null) {
-				if (existingPluginGuids == null) {
-					existingPluginGuids = new ArrayList();
-				}
-				existingPluginGuids.add(info.guid);
-			}
-		}
-		
-		Map pgToRgMap = importingLibDoc.buildPluginGuidToResMgrGuidMap(existingPluginGuids);				
-		
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			PluginImportData.PluginInfo info = (PluginImportData.PluginInfo) it.next();
-			if (info.selected && info.existingPlugin == null) {
-				mergeElement(info.guid, targetLibDoc, lib, resMgr0, resSet, lib.getMethodPlugins());
-			} else if (info.selected && pgToRgMap != null) {	//151786
-				Resource res = info.existingPlugin.eResource();
-				ResourceManager resMgr = (ResourceManager) MultiFileSaveUtil.getResourceManager(res);
-				String existingGuid = resMgr.getGuid();
-				String importedGuid = (String) pgToRgMap.get(info.guid);
-				if (importedGuid != null && !importedGuid.equals(existingGuid)) {
-					resMgr.setGuid(importedGuid);
-				}
-			}
-		}
-	}
-	
-	private void mergeConfigs(LibraryDocument targetLibDoc, MethodLibrary lib, ResourceManager resMgr0, ResourceSet resSet) {
-		for (Iterator it = data.getConfigs().iterator(); it.hasNext();) {
-			PluginImportData.ConfiguarationInfo info = (PluginImportData.ConfiguarationInfo) it.next();
-			if (info.selected && info.existingConfig == null) {
-				mergeElement(info.guid, targetLibDoc, lib, resMgr0, resSet, lib.getPredefinedConfigurations());
-			}					
-		}
-	}
-	
-	private void mergeElement(String guid, LibraryDocument targetLibDoc, 
-			MethodLibrary lib, ResourceManager resMgr0, ResourceSet resSet, List elements){
-		String src_uri = importingLibDoc.getResourceUri(guid);
-		if (src_uri == null || src_uri.length() == 0) {
-			return;
-		}
-		//File target_file = targetLibDoc.getFileFromUri(src_uri);
-		File target_file = targetFileMap.get(guid);
-		
-		String path = target_file.getAbsolutePath();
-		
-		URI uri = URI.createFileURI(path);
-		Resource res = resSet.getResource(uri, true);
-		MethodElement element = PersistenceUtil.getMethodElement(res);
-		elements.add(element);		
-		
-		MultiFileSaveUtil.registerWithResourceManager(resMgr0, element, uri);
-		ResourceManager resMgr = (ResourceManager) MultiFileSaveUtil.getResourceManager(res);
-		if (resMgr != null) {
-			resMgr0.getSubManagers().add(resMgr);
-		}
-	}		
-	
-	private void buildConfigInfoFromFiles() {	
-		File copiedLibPath = upGradeInfo == null ? null : upGradeInfo.getCopiedLibFile();
-		File importingLibPath = copiedLibPath == null ? new File(data.llData.getParentFolder()
-				+ File.separator + LibraryDocument.exportFile) : copiedLibPath;
-		File configDir = new File(importingLibPath.getParent(), MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME);
-		
-		LibraryDocument.ConfigDocVisitor visitor = new LibraryDocument.ConfigDocVisitor() {
-			public void visit(File file, Element node) {
-				PluginImportData.ConfiguarationInfo ci = data.new ConfiguarationInfo();
-				ci.guid = node.getAttribute(LibraryDocument.ATTR_guid);
-				ci.name = node.getAttribute("name"); //$NON-NLS-1$
-				String uri = MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME + File.separator + file.getName();
-				importingLibDoc.addToGuidToUriMap(ci.guid, uri);
-				data.getConfigs().add(ci);
-				// Check with the current library, get the related information.
-				loadExistingConfigInfo(ci);
-				if (ci.existingConfig != null) {
-					URI resUri = ci.existingConfig.eResource().getURI();
-					uri = MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME + File.separator + resUri.lastSegment();
-					uri = targetLibDoc.decodeUri(uri);
-					targetLibDoc.addToGuidToUriMap(ci.guid, uri);
-				}
-			}
-		};
-		
-		LibraryDocument.visitConfigFiles(configDir, visitor);				
-	}
-	
-	private void ensureUniqueNames(List elements) {
-		if (elements.isEmpty()) {
-			return;
-		}
-		Map nameMap = new HashMap();
-		for (int i=0; i < elements.size(); i++) {
-			MethodElement elem = (MethodElement) elements.get(i);
-			nameMap.put(elem.getName().toUpperCase(), elem);
-		}
-		
-		List importedList = new ArrayList();
-		List importedExistList = new ArrayList();
-		if (elements.get(0) instanceof MethodPlugin) {
-			for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-				PluginImportData.PluginInfo info = (PluginImportData.PluginInfo) it.next();
-				if (info.selected) {
-					if (info.existingPlugin == null || 
-							!info.existingPlugin.getName().equals(info.name)) {
-						importedList.add(info.name);
-						if (info.existingPlugin != null) {
-							importedExistList.add(info);
-						}
-					}
-				}
-			}
-		} else {
-			for (Iterator it = data.getConfigs().iterator(); it.hasNext();) {
-				PluginImportData.ConfiguarationInfo info = (PluginImportData.ConfiguarationInfo) it.next();
-				if (info.selected) {
-					if (info.existingConfig == null || 
-							!info.existingConfig.getName().equals(info.name)) {
-						importedList.add(info.name);
-						if (info.existingConfig != null) {
-							importedExistList.add(info);
-						}
-					}
-				}				
-			}
-		}
-		for (int i=0; i<importedList.size(); i++) {
-			String name = (String) importedList.get(i);
-			String renamed = name;
-			while (nameMap.containsKey(renamed.toUpperCase())) {
-				renamed += "_renamed"; //$NON-NLS-1$
-			}
-			if (renamed != name) {
-				MethodElement elem = (MethodElement) nameMap.get(name.toUpperCase());
-				LibraryView.runRename(elem, renamed);
-			}			
-		}				
-		for (int i=0; i<importedExistList.size(); i++) {
-			Object info = importedExistList.get(i);
-			MethodElement elem = info instanceof PluginImportData.PluginInfo ? 
-					(MethodElement)((PluginImportData.PluginInfo) info).existingPlugin :
-					(MethodElement)((PluginImportData.ConfiguarationInfo) info).existingConfig;
-			String newName = info instanceof PluginImportData.PluginInfo ? 
-					(String)((PluginImportData.PluginInfo) info).name :
-					(String)((PluginImportData.ConfiguarationInfo) info).name;								
-			LibraryView.runRename(elem, newName);		
-		}	
-		
-		
-		
-	}
-	
-	private File getTargetFile(final MethodLibrary lib, String guid) {
-		File parent = null;
-		final File[] pfiles = new File[1]; 
-		final IFileBasedLibraryPersister persister = (IFileBasedLibraryPersister) LibraryServiceUtil.getCurrentPersister();
-		ConfiguarationInfo cinfo = data.getConfigInfo(guid);
-		if (cinfo != null) {
-			File file = getResourceFile(cinfo.existingConfig);
-			if (file != null) {
-				return file;
-			}
-			if (defaultConfigFolder == null) {
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						pfiles[0] = persister.getDefaultMethodConfigurationFolder(lib);
-					}
-				});
-				parent = pfiles[0];
-				if (parent == null) {
-					return null;
-				}
-				defaultConfigFolder = parent;
-			} else {
-				parent = defaultConfigFolder;
-			}
-			if (localDebug) {
-				System.out.println("LD> defaultConfigFolder: " + parent); //$NON-NLS-1$
-			}
-		} else {
-			PluginInfo pinfo = data.getPluginInfo(guid);
-			if (pinfo != null) {
-				File file = getResourceFile(pinfo.existingPlugin);
-				if (file != null) {
-					return file;
-				}
-				parent = persister.createMethodPluginFolder(pinfo.name, lib);
-			} else {
-				throw new UnsupportedOperationException();
-			}
-		}
-
-		String fileName = cinfo == null ? MultiFileSaveUtil.DEFAULT_PLUGIN_MODEL_FILENAME : 
-									cinfo.name + MultiFileSaveUtil.DEFAULT_FILE_EXTENSION;	
-		return new File(parent, fileName);
-	}
-
-	public boolean isCheckBasePlugins() {
-		return checkBasePlugins;
-	}
-
-	public void setCheckBasePlugins(boolean checkBasePlugins) {
-		this.checkBasePlugins = checkBasePlugins;
-	}
-	
-	private File getResourceFile(MethodElement element) {
-		if (element == null) {
-			return null;
-		}
-		Resource res = element.eResource();
-		URI uri = res.getURI();
-		return new File(uri.toFileString());
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ResourceScanner.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ResourceScanner.java
deleted file mode 100644
index df39bb1..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/ResourceScanner.java
+++ /dev/null
@@ -1,271 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.services;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * utility class to scan and copy resources from the source library to the target library
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ResourceScanner {
-
-	public static final Pattern p_src_ref = Pattern.compile("src\\s*=\\s*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-//	protected static final Pattern p_link_ref = Pattern.compile("<a\\s+?([^>]*)>(.*?)</a>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-	public static final Pattern p_href_ref = Pattern.compile("href\\s*=\\s*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	File srcLibRoot;
-	File targetLibRoot;
-	
-	private Map newFileMap = new HashMap();
-	private Map existingFileMap = new HashMap();
-	Map<String, String> renamePluginMap;
-	
-	/**
-	 * Creates a new instance.
-	 */	
-	public ResourceScanner(File srcLibRoot, File targetLibRoot, Map<String, String> renamePluginMap) {
-		this.srcLibRoot = srcLibRoot;
-		this.targetLibRoot = targetLibRoot;
-		this.renamePluginMap = renamePluginMap;
-	}
-	
-	/**
-	 * scan th etext and copy the resources
-	 * @param owner MethodElement
-	 * @param source String
-	 */
-	public void scan(MethodElement owner, String source) {
-		
-		try
-		{
-			// process images and other src resources
-			Matcher m = p_src_ref.matcher(source);
-			while ( m.find() )
-			{
-				String url = m.group(1);
-				processUrl(owner, url);
-			}
-
-			// process hrefs
-			m = p_href_ref.matcher(source);
-			
-			while ( m.find() )
-			{
-				String url = m.group(1);
-				processUrl(owner, url);
-			}			
-		}
-		catch (Exception ex)
-		{
-			ex.printStackTrace();
-		}
-	}
-	
-	/**
-	 * process the url and copy the resource
-	 * if the owner element is specified, the url is relative to the owner element, 
-	 *otherwise it's relative to the library
-	 *
-	 * @param owner
-	 * @param url
-	 */
-	private void processUrl(MethodElement owner, String url) {
-		processUrl(owner, url, null);
-	}
-	
-	private void processUrl(MethodElement owner, String url, MethodPlugin plugin) {
-		
-		if ( url == null ) {
-			return;
-		}
-		
-		int index = url.indexOf("#"); //$NON-NLS-1$
-		if ( index >= 0 )
-		{
-			url = url.substring(0, index);
-		}
-		
-		index = url.indexOf("?"); //$NON-NLS-1$
-		if ( index >= 0 )
-		{
-			url = url.substring(0, index);
-		}
-		
-		if (url.trim().length() == 0 ) {
-			return;
-		}
-		
-		// the url is relative to the owner element
-		// need to convert to the path relative to the library root
-		File srcFile = null;
-		File targetFile = null;
-		try {
-			if ( owner != null ) {
-				ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(owner);
-				String elementPath = ResourceHelper.getElementPath(owner);
-				//srcFile = new File(new File(srcLibRoot, elementPath), url);
-				//if (!srcFile.isFile() || !srcFile.exists()) {
-					elementPath = getElementPathWithRenamedPlugin(elementPath);
-					srcFile = new File(new File(srcLibRoot, elementPath), url);
-				//}
-				if (!srcFile.isFile() || !srcFile.exists()) {
-					url = NetUtil.decodeURL(url);
-					srcFile = new File(new File(srcLibRoot, elementPath), url);
-				}
-				//targetFile = new File(new File(targetLibRoot, elementPath), url);
-				String pluginPath = libResMgr.getPhysicalPluginPath(owner);
-				File targetRoot = (new File(pluginPath)).getParentFile();
-				targetFile = new File(new File(targetRoot, elementPath), url);
-			} else {
-				if (plugin == null) {
-					throw new UnsupportedOperationException();
-				}			
-				File srcPluginRoot = new File(srcLibRoot, plugin.getName());
-				srcFile = new File(srcPluginRoot, url);
-				if (!srcFile.isFile() || !srcFile.exists()) {
-					url = NetUtil.decodeURL(url);
-					srcFile = new File(srcPluginRoot, url);
-				}
-				ILibraryResourceManager libResMgr = ResourceHelper.getResourceMgr(plugin);				
-				String srcPluginRootPath = libResMgr.getPhysicalPluginPath(plugin);	
-				targetFile = new File(srcPluginRootPath, url);				
-			}
-			
-			if ( srcFile.isFile() && srcFile.exists() ) {
-
-				srcFile = srcFile.getCanonicalFile();
-				targetFile = targetFile.getCanonicalFile();
-				
-				if ( targetFile.exists() ) {
-					if ( !existingFileMap.containsKey(srcFile) ) {
-						if ( srcFile.length() != targetFile.length() 
-								|| srcFile.lastModified() != targetFile.lastModified() )
-						{
-							existingFileMap.put(srcFile, targetFile);
-						}
-					}
-				} else {
-					if ( !newFileMap.containsKey(srcFile) ) {
-						newFileMap.put(srcFile, targetFile);
-					}
-				}
-			}
-		} catch (IOException e) {
-			// Log the error and proceed. TODO
-			e.printStackTrace();
-		}
-
-	}
-
-	private String getElementPathWithRenamedPlugin(String elementPath) {
-		if (renamePluginMap != null && ! renamePluginMap.isEmpty()) {
-			int ix = elementPath.indexOf("\\");//$NON-NLS-1$
-			if (ix > 0) {
-				String basePluginName =  elementPath.substring(0, ix);
-				String importPluginName = renamePluginMap.get(basePluginName);
-				if (importPluginName != null) {
-					return importPluginName + elementPath.substring(ix);
-				}
-			}
-		}
-		return elementPath;
-	}
-	
-	/**
-	 * Copies resource.
-	 */
-	public void copyResource(String url, MethodPlugin plugin) {
-		processUrl(null, url, plugin);
-	}
-	
-	/**
-	 * Copies resource.
-	 */
-	public void copyResource(MethodElement owner, String url) {
-		processUrl(owner, url);
-	}
-	
-	/**
-	 * return a list of all the files to be replaced
-	 * @return List a list of file path string
-	 */
-	public List getFilesTobeReplaced() {
-		List files = new ArrayList();
-		if ( existingFileMap.size() > 0 ) {
-			for (Iterator it = existingFileMap.values().iterator(); it.hasNext(); ) {
-				File f = (File)it.next();
-				if (f != null ) {
-					String path = f.getAbsolutePath();
-					if ( !files.contains(path) ) {
-						files.add(path);
-					}
-				}
-			}
-		}
-		
-		return files;
-	}
-	
-	/**
-	 * copy all the files to the destination
-	 *
-	 */
-	public void execute() {
-		
-		for (Iterator it = newFileMap.entrySet().iterator(); it.hasNext(); ) {
-			Map.Entry entry = (Map.Entry)it.next();
-			File srcFile = (File) entry.getKey();
-			File targetFile = (File) entry.getValue();
-			FileUtil.copyFile(srcFile, targetFile);
-		}	
-		
-		for (Iterator it = existingFileMap.entrySet().iterator(); it.hasNext(); ) {
-			Map.Entry entry = (Map.Entry)it.next();
-			File srcFile = (File) entry.getKey();
-			File targetFile = (File) entry.getValue();
-			FileUtil.copyFile(srcFile, targetFile);
-		}	
-	}
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/package.html b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/package.html
deleted file mode 100644
index bfb1116..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/services/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for the method plug-in and configuration import services.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportContentProvider.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportContentProvider.java
deleted file mode 100644
index f1f7643..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportContentProvider.java
+++ /dev/null
@@ -1,119 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.importing.services.ElementDiffTree;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The content provider for the diff report.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DiffReportContentProvider implements ITreeContentProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DiffReportContentProvider() {
-	}
-
-
-	/**
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		if (inputElement instanceof ElementDiffTree) {
-			
-			MethodElement e = ((ElementDiffTree)inputElement).getBaseElement();
-			
-			// don't show sub-packages under process component, hide the process detial
-			if ( (e instanceof ProcessComponent) ) {
-				return new Object[] {};
-			}
-
-			List items = ((ElementDiffTree) inputElement).getChildren();
-			if (items != null) {
-				List dirtyItems = new ArrayList();
-				for (Iterator it = items.iterator(); it.hasNext();) {
-					ElementDiffTree item = (ElementDiffTree) it.next();
-					if (item.isOldOnly()) {
-						continue;
-					}
-					
-					// 150895Import Config: CustomCategory did not sync up by import
-					// to fix this problem, we need to include the Hidden root customCategory package 
-					// but need to hide here
-					MethodElement base = item.getBaseElement();
-					if ( (base instanceof MethodPackage) 
-							&& TngUtil.isRootCutomCategoryPackage((MethodPackage)base) ) {
-						continue;
-					}
-					
-					dirtyItems.add(item);
-				}
-
-				return dirtyItems.toArray();
-			}
-		}
-		return new Object[] {};
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		return getElements(parentElement);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof ElementDiffTree) {
-			return ((ElementDiffTree) element).getParent();
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		if (element instanceof ElementDiffTree) {
-			return ((ElementDiffTree) element).hasChildren();
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportLabelProvider.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportLabelProvider.java
deleted file mode 100644
index e0c9fc1..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportLabelProvider.java
+++ /dev/null
@@ -1,117 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ElementDiffTree;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-
-/**
- * The label provider for the diff report.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DiffReportLabelProvider implements ILabelProvider,
-		ITableLabelProvider {
-
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public DiffReportLabelProvider() {
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object object) {
-		return null;
-	}
-
-	protected Image getImageFromObject(Object object) {
-		return ExtendedImageRegistry.getInstance().getImage(object);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Image getColumnImage(Object object, int columnIndex) {
-		if (columnIndex == 0) {
-			return this.getImage(object);
-		}
-
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		if (object instanceof ElementDiffTree) {
-			ElementDiffTree diffTree = (ElementDiffTree) object;
-			if (columnIndex == 0) {
-				return diffTree.getName();
-
-			} else if (columnIndex == 1) {
-				return diffTree.getContentType();
-			} else if (columnIndex == 2) {
-				return (diffTree.getImportElement() == null) ? "" : ImportResources.DiffReportLabelProvider_yes; //$NON-NLS-1$			
- 
-			} else if (columnIndex == 3) {
-				return (diffTree.getBaseElement() == null) ? "" : ImportResources.DiffReportLabelProvider_yes; //$NON-NLS-1$		
- 
-			} else if (columnIndex == 4) {
-				return diffTree.getDiffMessage();
-			}
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return this.getColumnText(object, 0);
-	}
-
-	/**
-	 * Since we won't ever generate these notifications, we can just ignore
-	 * this.
-	 */
-	public void addListener(ILabelProviderListener listener) {
-	}
-
-	/**
-	 * Since we won't ever add listeners, we can just ignore this.
-	 */
-	public void removeListener(ILabelProviderListener listener) {
-	}
-
-	/**
-	 * Always returns true for now.
-	 */
-	public boolean isLabelProperty(Object object, String id) {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportViewer.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportViewer.java
deleted file mode 100644
index 44f6408..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/DiffReportViewer.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ConfigurationImportData;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-/**
- * Displays the before and after method library differences for an import
- * operation.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class DiffReportViewer {
-
-	protected Composite parent;
-
-	protected CheckboxTreeViewer treeViewer;
-
-	ConfigurationImportData data;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	DiffReportViewer(Composite parent, ConfigurationImportData data) {
-		this.parent = parent;
-		this.data = data;
-		
-		treeViewer = new CheckboxTreeViewer(parent);
-		treeViewer.getControl()
-				.setLayoutData(new GridData(GridData.FILL_BOTH));
-		treeViewer.setContentProvider(new DiffReportContentProvider());
-		treeViewer.setLabelProvider(new DiffReportLabelProvider());
-		createTableColumns();
-		
-		addListeners();
-		
-	}
-
-	/**
-	 * Creates the table columns.
-	 */
-	private void createTableColumns() {
-		Tree tree = treeViewer.getTree();
-		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tree.setHeaderVisible(true);
-		tree.setLinesVisible(true);
-
-		TreeColumn column = new TreeColumn(tree, SWT.NONE, 0);
-		column.setText(ImportResources.DiffReportViewer_content); 
-		column.setWidth(200);
-
-		column = new TreeColumn(tree, SWT.NONE, 1);
-		column.setText(ImportResources.DiffReportViewer_type); 
-		column.setWidth(150);
-
-		column = new TreeColumn(tree, SWT.NONE, 2);
-		column.setText(ImportResources.DiffReportViewer_in_import); 
-		column.setWidth(75);
-
-		column = new TreeColumn(tree, SWT.NONE, 3);
-		column.setText(ImportResources.DiffReportViewer_in_lib); 
-		column.setWidth(75);
-
-		column = new TreeColumn(tree, SWT.NONE, 4);
-		column.setText(ImportResources.DiffReportViewer_status); 
-		column.setWidth(100);
-	}
-
-	/**
-	 * Displays the reviw.
-	 */
-	public void showReport(Object input) {
-		treeViewer.getTree().setVisible(false);
-		treeViewer.setInput(input);
-		setCheckStates();
-		treeViewer.expandAll();
-		treeViewer.getTree().setVisible(true);
-	}
-
-	private void addListeners() {
-		// add a check state change listener
-		treeViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				boolean checked = event.getChecked();
-				updateCheckStates(event.getElement(), checked);
-			}
-		});
-	}
-	
-	private void updateCheckStates(Object element, boolean checked) {
-
-		// Object element = event.getElement();
-
-		if (checked == true) {
-			ITreeContentProvider cp = (ITreeContentProvider) treeViewer
-					.getContentProvider();
-			checkParent(cp, element);
-			// treeViewer.setChecked(element, true);
-		}
-		else
-			treeViewer.setChecked(element, false);
-			
-		selectionChildren(element, checked);
-
-		setData(treeViewer.getCheckedElements());
-
-	}
-
-	/**
-	 * @param element
-	 * @param checked
-	 */
-	public void selectionChildren(Object element, boolean checked) {
-		ITreeContentProvider cp = (ITreeContentProvider) treeViewer
-				.getContentProvider();
-		Object[] childs = cp.getChildren(element);
-		for (int i = 0; i < childs.length; i++) {
-			treeViewer.setChecked(childs[i], checked);
-			selectionChildren(childs[i], checked);
-		}
-	}
-
-
-	private void checkParent(ITreeContentProvider cp, Object element) {
-		if (element == null || element instanceof MethodLibrary /*
-																 * || element ==
-																 * currentRootNode
-																 */) {
-			return;
-		}
-		Object parent = LibraryUtil.unwrap(cp.getParent(element));
-		if (parent != null) {
-			treeViewer.setChecked(parent, true);
-			// configFactory.getCurrentConfiguration().add((EObject)parent,
-			// false);
-			checkParent(cp, parent);
-		}
-
-	}
-	
-	private void setCheckStates() {
-		treeViewer.getTree().setVisible(false);
-		try {
-			Object element = treeViewer.getInput();
-			selectionChildren(element, true);
-		} finally {
-			treeViewer.getTree().setVisible(true);
-		}
-
-		setData(treeViewer.getCheckedElements());
-	}
-	
-	private void setData(Object[] sels) {
-		if ( sels == null ) {
-			return;
-		}
-		
-		data.importList.clear();
-		for ( int i = 0; i < sels.length; i++ ) {
-			data.importList.add(sels[i]);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportConfigReportPage.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportConfigReportPage.java
deleted file mode 100644
index 42eb3c1..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportConfigReportPage.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ConfigurationImportService;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A wizard page that displays the result of an import operation.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ImportConfigReportPage extends WizardPage {
-
-	ConfigurationImportService importingService;
-
-	DiffReportViewer viewer;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ImportConfigReportPage(ConfigurationImportService importingService) {
-		super(ImportResources.ImportConfigReportPage_title);
-		this.importingService = importingService;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_VERTICAL));
-		container.setLayoutData(new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_VERTICAL));
-
-		viewer = new DiffReportViewer(container, importingService
-				.getImportData());
-
-		setControl(container);
-
-		setPageComplete(false);
-	}
-
-	/**
-	 * Show result.
-	 */
-	public void showResult() {
-		// Analyze the importing configuration and report result.
-		importingService.analyze(null);
-
-		viewer.showReport(importingService.getDiffTree());
-
-		setPageComplete(true);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportConfigurationWizard.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportConfigurationWizard.java
deleted file mode 100644
index 809aaa4..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportConfigurationWizard.java
+++ /dev/null
@@ -1,165 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.authoring.ui.wizards.SaveAllEditorsPage;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ConfigurationImportData;
-import org.eclipse.epf.importing.services.ConfigurationImportService;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.ui.wizards.LibraryBackupUtil;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.epf.services.Services;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that imports exported library configurations into the current method
- * library.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class ImportConfigurationWizard extends Wizard implements IImportWizard {
-
-	public boolean okToComplete = false;
-
-	protected SelectImportConfigurationSource page1;
-
-	protected SelectConfigsToImport configPage;
-
-	protected SelectConfigSpecsToImportPage specsPage;
-
-	protected ConfigurationImportData data = new ConfigurationImportData();
-
-	protected ConfigurationImportService service = new ConfigurationImportService(
-			data);
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ImportConfigurationWizard() {
-		setWindowTitle(ImportResources.importConfigWizard_title);
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		IFileManager fileMgr = Services.getFileManager();
-		if (LibraryService.getInstance().getCurrentMethodLibrary() != null) {
-			fileMgr.checkModify(LibraryService.getInstance()
-					.getCurrentMethodLibrary().eResource().getURI()
-					.toFileString(), MsgBox.getDefaultShell());
-		}
-
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null && manager.isMethodLibraryReadOnly()) {
-			ImportPlugin.getDefault().getMsgDialog().displayError(
-					ImportResources.importConfigWizard_title,
-					ImportResources.ImportConfigurationWizard_readonly);
-			return;
-		}
-
-		SaveAllEditorsPage.addPageIfNeeded(this, true, null, null, ImportPlugin
-				.getDefault().getImageDescriptor(
-						"full/wizban/ImportLibraryConfiguration.gif")); //$NON-NLS-1$
-
-		page1 = new SelectImportConfigurationSource(data, service);
-		addPage(page1);
-
-		configPage = new SelectConfigsToImport(service);
-		addPage(configPage);
-
-		specsPage = new SelectConfigSpecsToImportPage(data);
-		addPage(specsPage);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				LibraryUIImages.IMG_METHOD_CONFIGURATON);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		return okToComplete;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		// Prompt the user to back up library.
-		LibraryBackupUtil.promptBackupCurrentLibrary(null, LibraryService
-				.getInstance());
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				try {
-					// Start the import.
-					monitor.beginTask(
-							ImportResources.ImportConfigurationWizard_MSG1,
-							IProgressMonitor.UNKNOWN);
-					service.performImport(monitor);
-				} catch (Exception e) {
-					throw new InvocationTargetException(e);
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			getContainer().run(true, false, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			Throwable realException = e.getTargetException();
-			ImportPlugin.getDefault().getMsgDialog().displayError(
-					ImportResources.ImportConfigurationWizard_error,
-					realException.getMessage());
-			return false;
-		}
-
-		// Save the import path to preference store.
-		ImportUIPreferences.addImportConfigDir(data.llData.getParentFolder());
-
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportPluginWizard.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportPluginWizard.java
deleted file mode 100644
index 4adce31..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportPluginWizard.java
+++ /dev/null
@@ -1,280 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.epf.authoring.ui.wizards.SaveAllEditorsPage;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.PluginImportData;
-import org.eclipse.epf.importing.services.PluginImportingService;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.PluginDepInfo;
-import org.eclipse.epf.library.edit.validation.PluginDependencyInfoMgr;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.library.ui.wizards.LibraryBackupUtil;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that imports an exported method plug-ins into the currrent method
- * library.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class ImportPluginWizard extends Wizard implements IImportWizard {
-
-	protected SelectImportPluginSource page1;
-
-	protected SelectPluginsToImport page2;
-
-	protected PluginImportData data = new PluginImportData();
-
-	protected PluginImportingService service = new PluginImportingService(data);
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ImportPluginWizard() {
-		setWindowTitle(ImportResources.importPluginsWizard_title);
-		setNeedsProgressMonitor(true);
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		// check out the library first
-		IFileManager fileMgr = Services.getFileManager();
-		if (LibraryService.getInstance().getCurrentMethodLibrary() != null) {
-			fileMgr.checkModify(LibraryService.getInstance()
-					.getCurrentMethodLibrary().eResource().getURI()
-					.toFileString(), MsgBox.getDefaultShell());
-		}
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null && manager.isMethodLibraryReadOnly()) {
-			ImportPlugin.getDefault().getMsgDialog().displayError(
-					ImportResources.importPluginsWizard_title,
-					ImportResources.ImportPluginWizard_readonly);
-			return;
-		}
-
-		SaveAllEditorsPage.addPageIfNeeded(this, true, null, null, ImportPlugin
-				.getDefault().getImageDescriptor(
-						"full/wizban/ImportMethodPlugins.gif")); //$NON-NLS-1$
-
-		page1 = new SelectImportPluginSource(data, service);
-		addPage(page1);
-
-		page2 = new SelectPluginsToImport(data, service);
-		addPage(page2);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(LibraryUIImages.IMG_METHOD_PLUGIN);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		if (this.getContainer().getCurrentPage() != page2)
-			return false;
-		return page2.isPageComplete();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		// Check if the selected plug-ins are updatable or not.
-		PluginModifyInfo modifyInfo = checkModify();
-
-		// if only locked, we can auto-unlock and relock the plugins
-		// if the pluin is readonly, user need to manually make it updatable
-		// customers need to manually unlock and lock plugins
-		// during content library upgrade
-
-		if (modifyInfo.readonlyPlugins.size() > 0) {
-			// Display an error message.
-			String error = modifyInfo.getReadonlyMessage().toString();
-			ImportPlugin.getDefault().getMsgDialog().displayError(
-					ImportResources.ImportConfigurationWizard_error, error);
-
-			return false;
-		}
-
-		StringBuffer buffer = new StringBuffer();
-		PluginImportData.PluginInfo info;
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			info = (PluginImportData.PluginInfo) it.next();
-			if ((info.existingPlugin != null) && info.selected) {
-				if (buffer.length() > 0) {
-					buffer.append("\n"); //$NON-NLS-1$
-				}
-				buffer.append("\t").append(info.name); //$NON-NLS-1$
-			}
-		}
-
-		if (buffer.length() > 0) {
-			boolean yes = ImportPlugin
-					.getDefault()
-					.getMsgDialog()
-					.displayConfirmation(
-							ImportResources.importPluginsWizard_title,
-							NLS
-									.bind(
-											ImportResources.ImportPluginWizard_warn_existing_plugins,
-											buffer.toString()));
-
-			if (!yes) {
-				return false;
-			}
-		}
-
-		// allow user to proceed with locked plugins
-		if (modifyInfo.lockedPlugins.size() > 0) {
-			String message = modifyInfo.getLockedMessage().toString()
-					+ ImportResources.ImportPluginWizard_confirm_continue;
-			boolean yes = ImportPlugin.getDefault().getMsgDialog()
-					.displayConfirmation(
-							ImportResources.importPluginsWizard_title, message);
-			if (!yes) {
-				return false;
-			}
-		}
-
-		// Prompt user to back up library.
-		LibraryBackupUtil.promptBackupCurrentLibrary(null, LibraryService
-				.getInstance());
-		IRunnableWithProgress op = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException {
-				try {
-					monitor.beginTask(ImportResources.ImportPluginWizard_MSG1,
-							IProgressMonitor.UNKNOWN);
-
-					// Start the import.
-					service.performImport(monitor);
-				} catch (Exception e) {
-					throw new InvocationTargetException(e);
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			getContainer().run(true, false, op);
-		} catch (InterruptedException e) {
-			return false;
-		} catch (InvocationTargetException e) {
-			Throwable realException = e.getTargetException();
-			ImportPlugin.getDefault().getMsgDialog().displayError(
-					ImportResources.ImportPluginWizard_error, 
-					realException.getMessage());
-			return false;
-		}
-
-		try {
-			checkPluginCircularDependency();
-		} catch (Throwable e) {
-			e.printStackTrace();
-		}
-
-		// Save the import path to preference store.
-		ImportUIPreferences.addImportPluginDir(data.llData.getParentFolder());
-
-		ImportUIPreferences.setCheckBasePlugins(service.isCheckBasePlugins());
-		return true;
-	}
-
-	/**
-	 * Returns a PluginModifyInfo object.
-	 */
-	public PluginModifyInfo checkModify() {
-		// StringBuffer error = new StringBuffer();
-		PluginModifyInfo modifyInfo = new PluginModifyInfo();
-
-		PluginImportData.PluginInfo info;
-		for (Iterator it = data.getPlugins().iterator(); it.hasNext();) {
-			info = (PluginImportData.PluginInfo) it.next();
-			MethodPlugin plugin = info.existingPlugin;
-			if ((plugin != null) && info.selected) {
-				if (plugin.getUserChangeable().booleanValue() == false) {
-					// The plug-in is locked
-					modifyInfo.lockedPlugins.add(plugin);
-				} else {
-					// The plug-in exists in the current library, make sure the
-					// plug-in is updatable.
-					IStatus status = TngUtil.checkEdit(plugin, getShell());
-					if (!status.isOK()) {
-						modifyInfo.readonlyPlugins.add(plugin);
-					}
-				}
-			}
-		}
-
-		return modifyInfo;
-	}
-
-	private void checkPluginCircularDependency() {
-		PluginDependencyInfoMgr mgr = new PluginDependencyInfoMgr(
-				LibraryService.getInstance().getCurrentMethodLibrary());
-		PluginDependencyInfoMgr.CheckResult result = mgr
-				.checkCircularDependnecy(null, false);
-		if (result.circularList != null && !result.circularList.isEmpty()) {
-			List cirPlugins = (List) result.circularList.get(0);
-			String msg = ""; //$NON-NLS-1$
-			for (int i = 0; i < cirPlugins.size(); i++) {
-				PluginDepInfo pinfo = (PluginDepInfo) cirPlugins.get(i);
-				if (i != 0) {
-					msg += ", "; //$NON-NLS-1$
-				}
-				msg += pinfo.getPlugin().getName();
-			}
-			ImportPlugin.getDefault().getMsgDialog().displayWarning(
-					ImportResources.ImportPluginWizard_warn_circular_plugins,
-					msg);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportUIPreferences.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportUIPreferences.java
deleted file mode 100644
index f082930..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/ImportUIPreferences.java
+++ /dev/null
@@ -1,179 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.util.List;
-
-import org.eclipse.epf.common.ui.util.PreferenceUtil;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Manages the Import UI preferences.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @since 1.2
- */
-public class ImportUIPreferences {
-
-	// The import plug-in directories preference key.
-	private static final String IMPORT_PLUGIN_DIRS = "importPluginDirs"; //$NON-NLS-1$
-
-	// The import configuration directories preference key.
-	private static final String IMPORT_CONFIG_DIRS = "importConfigDirs"; //$NON-NLS-1$
-
-	// The check base plug-ins preference key
-	public static final String CHECK_BASE_PLUGINS = "checkBasePlugins"; //$NON-NLS-1$
-
-	// The default import plug-in directory name.
-	private static final String DEFAULT_IMPORT_PLUGIN_DIR_NAME = "Export" + FileUtil.FILE_SEP + "Plugins"; //$NON-NLS-1$ //$NON-NLS-2$	 
-
-	// The default import configuration directory name.
-	private static final String DEFAULT_IMPORT_CONFIG_DIR_NAME = "Export" + FileUtil.FILE_SEP + "Configurations"; //$NON-NLS-1$ //$NON-NLS-2$	 
-
-	// The default import plug-in directory.
-	private static String defaultImportPluginDir = null;
-
-	// The default import configuration directory.
-	private static String defaultImportConfigDir = null;
-
-	// The plug-in specific preference store.
-	private static IPreferenceStore prefStore = ImportPlugin.getDefault()
-			.getPreferenceStore();
-
-	static {
-		prefStore.setDefault(IMPORT_PLUGIN_DIRS, getDefaultImportPluginDir());
-		prefStore.setDefault(IMPORT_CONFIG_DIRS, getDefaultImportConfigDir());
-		prefStore.setDefault(CHECK_BASE_PLUGINS, true);
-	}
-
-	/**
-	 * Gets the default import plug-in directory.
-	 * 
-	 * @return the default import plug-in directory
-	 */
-	public static String getDefaultImportPluginDir() {
-		if (defaultImportPluginDir == null) {
-			defaultImportPluginDir = System.getProperty("user.home"); //$NON-NLS-1$
-			String appName = LibraryUIPreferences.getApplicationShortName();
-			if (appName != null && appName.length() > 0) {
-				defaultImportPluginDir = defaultImportPluginDir
-						+ FileUtil.FILE_SEP + appName + FileUtil.FILE_SEP
-						+ DEFAULT_IMPORT_PLUGIN_DIR_NAME;
-			} else {
-				defaultImportPluginDir = defaultImportPluginDir
-						+ FileUtil.FILE_SEP + DEFAULT_IMPORT_PLUGIN_DIR_NAME;
-			}
-		}
-		return defaultImportPluginDir;
-	}
-
-	/**
-	 * Gets the import plug-in directories preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String[] getImportPluginDirs() {
-		return PreferenceUtil.getStringValues(prefStore, IMPORT_PLUGIN_DIRS);
-	}
-
-	/**
-	 * Gets the import plug-in directories preference value.
-	 * 
-	 * @return a collection of import plug-in directories
-	 */
-	public static List<String> getImportPluginDirsList() {
-		return PreferenceUtil.getList(prefStore, IMPORT_PLUGIN_DIRS);
-	}
-
-	/**
-	 * Adds a import directory to the import plug-in directories preference.
-	 * 
-	 * @param dir
-	 *            an import directory
-	 */
-	public static void addImportPluginDir(String dir) {
-		PreferenceUtil.addToList(prefStore, IMPORT_PLUGIN_DIRS, dir);
-	}
-
-	/**
-	 * Gets the default import configuration directory.
-	 * 
-	 * @return the default import configuration directory
-	 */
-	public static String getDefaultImportConfigDir() {
-		if (defaultImportConfigDir == null) {
-			defaultImportConfigDir = System.getProperty("user.home"); //$NON-NLS-1$
-			String appName = LibraryUIPreferences.getApplicationShortName();
-			if (appName != null && appName.length() > 0) {
-				defaultImportConfigDir = defaultImportConfigDir
-						+ FileUtil.FILE_SEP + appName + FileUtil.FILE_SEP
-						+ DEFAULT_IMPORT_CONFIG_DIR_NAME;
-			} else {
-				defaultImportConfigDir = defaultImportConfigDir
-						+ FileUtil.FILE_SEP + DEFAULT_IMPORT_CONFIG_DIR_NAME;
-			}
-		}
-		return defaultImportConfigDir;
-	}
-
-	/**
-	 * Gets the import configuration directories preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static String[] getImportConfigDirs() {
-		return PreferenceUtil.getStringValues(prefStore, IMPORT_CONFIG_DIRS);
-	}
-
-	/**
-	 * Gets the import configuration directories preference value.
-	 * 
-	 * @return a collection of import configuration directories
-	 */
-	public static List<String> getImportConfigDirsList() {
-		return PreferenceUtil.getList(prefStore, IMPORT_CONFIG_DIRS);
-	}
-
-	/**
-	 * Adds a import directory to the import configuration directories
-	 * preference.
-	 * 
-	 * @param dir
-	 *            an import directory
-	 */
-	public static void addImportConfigDir(String dir) {
-		PreferenceUtil.addToList(prefStore, IMPORT_CONFIG_DIRS, dir);
-	}
-
-	/**
-	 * Gets the check base plug-ins preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static boolean getCheckBasePlugins() {
-		return prefStore.getBoolean(CHECK_BASE_PLUGINS);
-	}
-
-	/**
-	 * Sets the notCheckBasePlugins option file preference.
-	 * 
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setCheckBasePlugins(boolean value) {
-		prefStore.setValue(CHECK_BASE_PLUGINS, value);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/PluginModifyInfo.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/PluginModifyInfo.java
deleted file mode 100644
index 98f29a5..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/PluginModifyInfo.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Helper class to construct a message that lists all the locked or read-only
- * method plug-ins in the current method library.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PluginModifyInfo {
-
-	public List<MethodPlugin> lockedPlugins = new ArrayList<MethodPlugin>();
-
-	public List<MethodPlugin> readonlyPlugins = new ArrayList<MethodPlugin>();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PluginModifyInfo() {
-	}
-
-	/**
-	 * Gets a message that lists all the locked method plug-ins.
-	 * 
-	 * @return a <code>StringBuffer<code> containing the message
-	 */
-	public StringBuffer getLockedMessage() {
-		StringBuffer buffer = new StringBuffer();
-		for (Iterator it = lockedPlugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			String msg = NLS
-					.bind(
-							ImportResources.SelectImportConfigurationSource_plugin_locked,
-							plugin.getName());
-			buffer.append(msg);
-		}
-
-		return buffer;
-	}
-
-	/**
-	 * Gets a message that lists all the read-only method plug-ins.
-	 * 
-	 * @return a <code>StringBuffer<code> containing the message
-	 */
-	public StringBuffer getReadonlyMessage() {
-		StringBuffer buffer = new StringBuffer();
-		for (Iterator it = readonlyPlugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			String msg = NLS
-					.bind(
-							ImportResources.SelectImportConfigurationSource_plugin_readonly,
-							plugin.getName());
-			buffer.append(msg);
-		}
-
-		return buffer;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectConfigSpecsToImportPage.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectConfigSpecsToImportPage.java
deleted file mode 100644
index 062d756..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectConfigSpecsToImportPage.java
+++ /dev/null
@@ -1,251 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ConfigSpecs;
-import org.eclipse.epf.importing.services.ConfigurationImportData;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-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.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to select the configuration
- * specificaitons to import.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectConfigSpecsToImportPage extends BaseWizardPage implements
-		ISelectionChangedListener, ICheckStateListener {
-
-	public static final String PAGE_NAME = SelectConfigSpecsToImportPage.class
-			.getName();
-
-	private static final String libraryConfigSpecExists = ImportResources.SelectConfigSpecsToImportPage_libraryConfigSpecExists;
-
-	private static final String libraryConfigSpecNotExists = ImportResources.SelectConfigSpecsToImportPage_libraryConfigSpecNotExists;
-
-	private static final String configSpecNoSelection = ImportResources.SelectConfigSpecsToImportPage_configSpecNoSelection;
-
-	private static final String configSpecDataLabel = ImportResources.SelectConfigSpecsToImportPage_configSpecDataLabel;
-
-	private CheckboxTableViewer ctrl_chkboxTableViewer;
-
-	// 2 controls for displaying configspec info for plugins in import directory
-	private Text ctrl_briefDescImport;
-
-	private Label importConfigSpecLabel;
-
-	// 2 controls for displaying configspec info for plugins in the library
-	private Text ctrl_briefDescLibrary;
-
-	private Label libraryConfigSpecLabel;
-
-	private Composite container;
-
-	private ConfigurationImportData data;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectConfigSpecsToImportPage(ConfigurationImportData data) {
-		super(PAGE_NAME);
-		setTitle(ImportResources.selectConfigSpecsWizardPage_title);
-		setDescription(ImportResources.selectConfigSpecsWizardPage_text);
-		setImageDescriptor(ImportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/imp_lib_conf_wizban.gif")); //$NON-NLS-1$
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout(2, true));
-
-		Composite tableContainer = new Composite(container, SWT.NONE);
-		tableContainer.setLayout(new GridLayout());
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		tableContainer.setLayoutData(gridData);
-
-		createLabel(tableContainer,
-				ImportResources.SelectConfigSpecsToImportPage_label_configs, 2);
-		ctrl_chkboxTableViewer = createCheckboxTableViewer(tableContainer, 1);
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public Image getImage(Object element) {
-				return LibraryUIImages.IMG_METHOD_CONFIGURATON;
-			}
-
-			public String getText(Object element) {
-				return super.getText(element);
-			}
-		};
-
-		ctrl_chkboxTableViewer.setLabelProvider(labelProvider);
-		ctrl_chkboxTableViewer.setContentProvider(new ArrayContentProvider());
-
-		Composite importContainer = new Composite(container, SWT.NONE);
-		importContainer.setLayout(new GridLayout());
-		importContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		createImportConfigSpecInfo(importContainer);
-
-		Composite libraryContainer = new Composite(container, SWT.NONE);
-		libraryContainer.setLayout(new GridLayout());
-		libraryContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		createLibraryConfigSpecInfo(libraryContainer);
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(false);
-	}
-
-	private void createImportConfigSpecInfo(Composite container) {
-		importConfigSpecLabel = createLabel(container, configSpecNoSelection, 1);
-		createLine(container, 1);
-
-		createLabel(container,
-				ImportResources.SelectConfigSpecsToImportPage_label_desc, 1);
-		ctrl_briefDescImport = createMultiLineText(container, "", 275, 100, 1); //$NON-NLS-1$
-	}
-
-	private void createLibraryConfigSpecInfo(Composite container) {
-		libraryConfigSpecLabel = createLabel(container, configSpecNoSelection,
-				1);
-		createLine(container, 1);
-
-		createLabel(container,
-				ImportResources.SelectConfigSpecsToImportPage_label_desc, 1);
-		ctrl_briefDescLibrary = createMultiLineText(container, "", 275, 100, 1); //$NON-NLS-1$
-	}
-
-	private void addListeners() {
-		ctrl_chkboxTableViewer.addSelectionChangedListener(this);
-		ctrl_chkboxTableViewer.addCheckStateListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		StructuredSelection selection = (StructuredSelection) event
-				.getSelection();
-		if (!selection.isEmpty()) {
-			Object[] configs = selection.toArray();
-			setDisplayAttributes((ConfigSpecs.Entry) configs[0]);
-		} else {
-			clearDisplayAttributes();
-		}
-	}
-
-	private void setDisplayAttributes(ConfigSpecs.Entry spec) {
-		ctrl_briefDescImport
-				.setText(spec.configSpec.brief_desc == null ? "" : spec.configSpec.brief_desc); //$NON-NLS-1$
-		importConfigSpecLabel.setText(configSpecDataLabel);
-
-		if (spec.existingConfig != null) {
-			ctrl_briefDescLibrary.setText(spec.existingConfig
-					.getBriefDescription());
-			libraryConfigSpecLabel.setText(libraryConfigSpecExists);
-		} else {
-			libraryConfigSpecLabel.setText(libraryConfigSpecNotExists);
-			ctrl_briefDescLibrary.setText(""); //$NON-NLS-1$
-		}
-	}
-
-	private void clearDisplayAttributes() {
-		ctrl_briefDescImport.setText(""); //$NON-NLS-1$
-		ctrl_briefDescLibrary.setText(""); //$NON-NLS-1$
-		libraryConfigSpecLabel.setText(configSpecNoSelection);
-		importConfigSpecLabel.setText(configSpecNoSelection);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		if (getErrorMessage() != null)
-			return false;
-
-		if (ctrl_chkboxTableViewer.getCheckedElements().length > 0) {
-			// Set data.specs.configs list, fix the selected field of each
-			// entry.
-			Iterator iter = data.specs.configs.iterator();
-			while (iter.hasNext()) {
-				ConfigSpecs.Entry e = (ConfigSpecs.Entry) iter.next();
-				if (ctrl_chkboxTableViewer.getChecked(e))
-					e.selected = true;
-				else
-					e.selected = false;
-			}
-			((ImportConfigurationWizard) getWizard()).okToComplete = true;
-		} else {
-			((ImportConfigurationWizard) getWizard()).okToComplete = false;
-		}
-
-		// Always return false so that the "Next" button is never enabled.
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
-	 */
-	public boolean canFlipToNextPage() {
-		return isPageComplete();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		ctrl_chkboxTableViewer.setInput(data.specs.configs);
-		if (data.specs.configs.size() > 0) {
-			IStructuredSelection sel = new StructuredSelection(
-					data.specs.configs.get(0));
-			ctrl_chkboxTableViewer.setSelection(sel);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectConfigsToImport.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectConfigsToImport.java
deleted file mode 100644
index 2d5ec9b..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectConfigsToImport.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ConfigurationImportService;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A wizard page that displays the library configuration elements that will be
- * imported.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectConfigsToImport extends BaseWizardPage {
-
-	public static final String PAGE_NAME = SelectConfigsToImport.class
-			.getName();
-
-	private ConfigurationImportService service;
-
-	private Composite container;
-
-	private DiffReportViewer diff;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectConfigsToImport(ConfigurationImportService service) {
-		super(PAGE_NAME);
-		setTitle(ImportResources.reviewChangesWizardPage_title);
-		setDescription(ImportResources.reviewChangesWizardPage_text);
-		setImageDescriptor(ImportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/imp_lib_conf_wizban.gif")); //$NON-NLS-1$		
-		this.service = service;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		container = new Composite(parent, SWT.NONE);
-		container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		container.setLayout(new GridLayout(1, false));
-
-		createLabel(container, ImportResources.SelectConfigsToImport_label1, 1);
-		diff = new DiffReportViewer(container, service.getImportData());
-
-		setControl(container);
-		setPageComplete(false);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		((ImportConfigurationWizard) getWizard()).okToComplete = true;
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		diff.showReport(service.getDiffTree());
-		((ImportConfigurationWizard) getWizard()).okToComplete = true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectImportConfigurationSource.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectImportConfigurationSource.java
deleted file mode 100644
index 2431f71..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectImportConfigurationSource.java
+++ /dev/null
@@ -1,253 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.export.wizards.DestinationCommonPage;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.ConfigurationImportData;
-import org.eclipse.epf.importing.services.ConfigurationImportService;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A wizard page that prompts the user to select a directory that contains the
- * configurations to import.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectImportConfigurationSource extends DestinationCommonPage {
-
-	public static final String PAGE_NAME = SelectImportConfigurationSource.class
-			.getName();
-
-	private static final Status okStatus = new Status(IStatus.OK,
-			ImportResources.SelectImportConfigurationSource_not_used, 0,
-			"", null); //$NON-NLS-1$
-
-	private ConfigurationImportData data;
-
-	private ConfigurationImportService service;
-
-	private Status status = okStatus;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectImportConfigurationSource(ConfigurationImportData data,
-			ConfigurationImportService service) {
-		super(PAGE_NAME, data.llData);
-		setTitle(ImportResources.selectConfigDirWizardPage_title);
-		setDescription(ImportResources.selectConfigDirWizardPage_text);
-		setImageDescriptor(ImportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/imp_lib_conf_wizban.gif")); //$NON-NLS-1$		
-		this.service = service;
-		this.data = data;
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String[] exportDirs = ImportUIPreferences.getImportConfigDirs();
-		if (exportDirs != null && exportDirs.length > 0) {
-			exportPathCombo.setItems(exportDirs);
-			exportPathCombo.setText(exportDirs[0]);
-		}
-		super.initControls();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-		boolean returnValue = false;
-		status = okStatus;
-		if (exportPathCombo.getText().length() > 0) {
-			saveToDataModel();
-			File libDir = new File(exportPathCombo.getText());
-			if (!libDir.exists()) {
-				status = new Status(
-						IStatus.ERROR,
-						ImportResources.SelectImportConfigurationSource_not_used,
-						0,
-						ImportResources.SelectImportConfigurationSource_no_path,
-						null);
-			} else {
-				returnValue = true;
-			}
-		}
-		applyToStatusLine();
-		return returnValue;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		saveToDataModel();
-		IRunnableWithProgress operation = new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				monitor.beginTask(
-						ImportResources.SelectImportConfigurationSource_MSG1,
-						IProgressMonitor.UNKNOWN);
-				service.analyze(monitor);
-				monitor.done();
-			}
-		};
-		try {
-			// This runs the options, and shows progress.
-			getWizard().getContainer().run(true, false, operation);
-		} catch (Exception exception) {
-			// Something went wrong that shouldn't.
-			exception.printStackTrace();
-		}
-
-		String error = data.getErrorInfo().getError();
-		if (error != null && error.length() > 0) {
-			status = new Status(IStatus.ERROR,
-					ImportResources.SelectImportConfigurationSource_not_used,
-					0, error, null);
-			applyToStatusLine();
-			return this;
-		}
-		BaseWizardPage page = null;
-		if (data.specs != null)
-			page = ((ImportConfigurationWizard) getWizard()).specsPage;
-		else {
-			PluginModifyInfo modifyInfo = checkModify();
-
-			// if only locked, we can auto-unlock and relock the plugins
-			// if the pluin is readonly, user need to manually make it updatable
-			// customers need to manually unlock and lock plugins during content
-			// library upgrade
-
-			if (modifyInfo.readonlyPlugins.size() > 0) {
-
-				error = modifyInfo.getReadonlyMessage().toString();
-
-				// show error message box
-				ImportPlugin.getDefault().getMsgDialog().displayError(
-						ImportResources.ImportConfigurationWizard_error, error);
-
-				status = new Status(
-						IStatus.ERROR,
-						ImportResources.SelectImportConfigurationSource_not_used,
-						0,
-						ImportResources.SelectImportConfigurationSource_error_not_updatable,
-						null);
-				applyToStatusLine();
-				return this;
-			}
-
-			// allow user to proceed with locked plugins
-			if (modifyInfo.lockedPlugins.size() > 0) {
-				String WIZARD_TITLE = ImportResources.importConfigWizard_title;
-				String message = modifyInfo.getLockedMessage().toString()
-						+ ImportResources.ImportPluginWizard_confirm_continue;
-				boolean yes = ImportPlugin.getDefault().getMsgDialog()
-						.displayConfirmation(WIZARD_TITLE, message);
-				if (!yes) {
-					status = new Status(
-							IStatus.ERROR,
-							ImportResources.SelectImportConfigurationSource_not_used,
-							0,
-							ImportResources.SelectImportConfigurationSource_error_not_updatable,
-							null);
-					applyToStatusLine();
-					return this;
-				}
-			}
-			page = ((ImportConfigurationWizard) getWizard()).configPage;
-		}
-		page.onEnterPage(null);
-		return page;
-	}
-
-	/**
-	 * Returns a PluginModifyInfo object.
-	 */
-	public PluginModifyInfo checkModify() {
-		return checkModify(LibraryUtil.getMethodPluginGuids(service
-				.getImportingLibrary()), getShell(), true);
-	}
-
-	/**
-	 * Returns a PluginModifyInfo object.
-	 */
-	public static PluginModifyInfo checkModify(List guids, Shell shell,
-			boolean checkEdit) {
-		PluginModifyInfo modifyInfo = new PluginModifyInfo();
-		// StringBuffer error = new StringBuffer();
-		// List guids = LibraryUtil.getMethodPluginGuids(service
-		// .getImportingLibrary());
-
-		List plugins = LibraryService.getInstance().getCurrentMethodLibrary()
-				.getMethodPlugins();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			if (guids.contains(plugin.getGuid())) {
-				if (plugin.getUserChangeable().booleanValue() == false) {
-					// plugin is locked
-					modifyInfo.lockedPlugins.add(plugin);
-				} else if (checkEdit) {
-					// plugin exists in the current library, make sure the
-					// plugin is updatable
-					// IStatus status = TngUtil.checkEdit(plugin, getShell());
-					IStatus status = TngUtil.checkEdit(plugin, shell);
-					if (!status.isOK()) {
-						modifyInfo.readonlyPlugins.add(plugin);
-					}
-				}
-			}
-		}
-
-		return modifyInfo;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
-	 */
-	public boolean canFlipToNextPage() {
-		return isPageComplete();
-	}
-
-	private void applyToStatusLine() {
-		if (status != okStatus)
-			setErrorMessage(status.getMessage());
-		else {
-			setErrorMessage(null);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectImportPluginSource.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectImportPluginSource.java
deleted file mode 100644
index 23ba374..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectImportPluginSource.java
+++ /dev/null
@@ -1,175 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.export.wizards.DestinationCommonPage;
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.PluginImportData;
-import org.eclipse.epf.importing.services.PluginImportingService;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.jface.wizard.IWizardPage;
-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.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-
-/**
- * A wizard page that prompts the user to select a directory that contains the
- * method plug-ins to import.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectImportPluginSource extends DestinationCommonPage {
-
-	public static final String PAGE_NAME = SelectImportPluginSource.class
-			.getName();
-
-	private static final Status OK_STATUS = new Status(IStatus.OK,
-			ImportResources.SelectImportPluginSource_not_used, 0, "", null); //$NON-NLS-1$
-
-	private PluginImportData data;
-
-	private PluginImportingService service;
-
-	private Status status = OK_STATUS;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectImportPluginSource(PluginImportData data,
-			PluginImportingService service) {
-		super(PAGE_NAME, data.llData);
-		setTitle(ImportResources.selectPluginsDirWizardPage_title);
-		setDescription(ImportResources.selectPluginsDirWizardPage_text);
-		setImageDescriptor(ImportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/imp_meth_plugin_wizban.gif")); //$NON-NLS-1$
-		this.service = service;
-		this.data = data;
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String[] exportDirs = ImportUIPreferences.getImportPluginDirs();
-		if (exportDirs != null && exportDirs.length > 0) {
-			exportPathCombo.setItems(exportDirs);
-			exportPathCombo.setText(exportDirs[0]);
-		}
-		super.initControls();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-		boolean returnValue = false;
-		status = OK_STATUS;
-		if (exportPathCombo.getText().length() > 0) {
-			saveToDataModel();
-			File libDir = new File(exportPathCombo.getText());
-			if (!libDir.exists()) {
-				status = new Status(IStatus.ERROR,
-						ImportResources.SelectImportPluginSource_not_used, 0,
-						ImportResources.SelectImportPluginSource_no_path, null);
-			} else {
-				returnValue = true;
-			}
-		}
-		applyToStatusLine();
-		return returnValue;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		saveToDataModel();
-
-		// Validate first before going to the next page.
-		service.validate(null);
-		String error = data.getErrorInfo().getError();
-		if (error != null && error.length() > 0) {
-			super.setErrorMessage(error);
-			return this;
-		} else {
-			SelectPluginsToImport page = ((ImportPluginWizard) getWizard()).page2;
-			page.onEnterPage(null);
-			return page;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
-	 */
-	public boolean canFlipToNextPage() {
-		return isPageComplete();
-	}
-
-	private void applyToStatusLine() {
-		if (status != OK_STATUS)
-			setErrorMessage(status.getMessage());
-		else {
-			setErrorMessage(null);
-		}
-	}
-
-	protected void createAdditionalControls(Composite composite) {
-		Group optionGroup = new Group(composite, SWT.NONE);
-		optionGroup.setLayout(new GridLayout(1, false));
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 3;
-		optionGroup.setLayoutData(gridData);
-		optionGroup.setText(ImportResources.optionGroup_text);
-
-		boolean checkBasePlugins = ImportUIPreferences.getCheckBasePlugins();
-		setCheckBasePlugins(checkBasePlugins);
-
-		Button checkBaseRadioButton = createRadioButton(optionGroup,
-				ImportResources.checkBaseRadioButton_text, 1, checkBasePlugins);
-		checkBaseRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setCheckBasePlugins(true);
-			}
-		});
-
-		Button ignoreRemoveRadioButton = createRadioButton(optionGroup,
-				ImportResources.ignoreRemoveRadioButton_text, 1,
-				!checkBasePlugins);
-		ignoreRemoveRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setCheckBasePlugins(false);
-			}
-		});
-
-	}
-
-	private void setCheckBasePlugins(boolean checkBasePlugins) {
-		service.setCheckBasePlugins(checkBasePlugins);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectPluginsToImport.java b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectPluginsToImport.java
deleted file mode 100644
index e5f914f..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/SelectPluginsToImport.java
+++ /dev/null
@@ -1,304 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.importing.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.importing.ImportPlugin;
-import org.eclipse.epf.importing.ImportResources;
-import org.eclipse.epf.importing.services.PluginImportData;
-import org.eclipse.epf.importing.services.PluginImportingService;
-import org.eclipse.epf.importing.services.PluginImportData.PluginInfo;
-import org.eclipse.epf.library.ui.LibraryUIImages;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to the method plug-ins to import.
- * 
- * @author Jeff Hardy
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectPluginsToImport extends BaseWizardPage implements
-		ISelectionChangedListener, ICheckStateListener, Listener {
-
-	public static final String PAGE_NAME = SelectPluginsToImport.class
-			.getName();
-
-	private static final String libraryPluginExists = ImportResources.SelectPluginsToImport_libraryPluginExists;
-
-	private static final String libraryPluginNotExists = ImportResources.SelectPluginsToImport_libraryPluginNotExists;
-
-	private static final String pluginNoSelection = ImportResources.SelectPluginsToImport_pluginNoSelection;
-
-	private static final String pluginDataLabel = ImportResources.SelectPluginsToImport_pluginDataLabel;
-
-	private CheckboxTableViewer ctrl_chkboxTableViewer;
-
-	private Text ctrl_authorImport;
-
-	private Text ctrl_versionImport;
-
-	private Text ctrl_briefDescImport;
-
-	private Label importPluginLabel;
-
-	private Text ctrl_authorLibrary;
-
-	private Text ctrl_versionLibrary;
-
-	private Text ctrl_briefDescLibrary;
-
-	private Label libraryPluginLabel;
-
-	private Composite container;
-
-	private int checkedCount = 0;
-
-	private List checkedPluginList = new ArrayList();
-
-	private PluginImportData data;
-
-	private PluginImportingService service;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectPluginsToImport(PluginImportData data,
-			PluginImportingService service) {
-		super(PAGE_NAME);
-		setTitle(ImportResources.selectPluginsWizardPage_title);
-		setDescription(ImportResources.selectPluginsWizardPage_text);
-		setImageDescriptor(ImportPlugin.getDefault().getImageDescriptor(
-				"full/wizban/imp_meth_plugin_wizban.gif")); //$NON-NLS-1$		
-		this.service = service;
-		this.data = data;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		container = new Composite(parent, SWT.NONE);
-		container.setLayout(new GridLayout(2, true));
-
-		Composite tableContainer = new Composite(container, SWT.NONE);
-		tableContainer.setLayout(new GridLayout());
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		tableContainer.setLayoutData(gridData);
-
-		createLabel(tableContainer,
-				ImportResources.SelectPluginsToImport_label_plugins, 2);
-
-		ctrl_chkboxTableViewer = createCheckboxTableViewer(tableContainer, 2);
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public Image getImage(Object element) {
-				return LibraryUIImages.IMG_METHOD_PLUGIN;
-			}
-
-			public String getText(Object element) {
-				if (element instanceof MethodPlugin) {
-					return ((MethodPlugin) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		};
-		ctrl_chkboxTableViewer.setLabelProvider(labelProvider);
-		ctrl_chkboxTableViewer.setContentProvider(new ArrayContentProvider());
-
-		Composite importContainer = new Composite(container, SWT.NONE);
-		importContainer.setLayout(new GridLayout());
-
-		createImportPluginInfo(importContainer);
-
-		Composite libraryContainer = new Composite(container, SWT.NONE);
-		libraryContainer.setLayout(new GridLayout());
-
-		createLibraryPluginInfo(libraryContainer);
-
-		addListeners();
-
-		setControl(container);
-		setPageComplete(false);
-	}
-
-	private void createImportPluginInfo(Composite container) {
-		importPluginLabel = createLabel(container, pluginNoSelection, 1);
-		createLine(container, 1);
-
-		createLabel(container,
-				ImportResources.SelectPluginsToImport_label_author, 1);
-		ctrl_authorImport = createMultiLineText(container, "", 275, 40, 1); //$NON-NLS-1$
-
-		createLabel(container,
-				ImportResources.SelectPluginsToImport_label_version, 1);
-		ctrl_versionImport = createText(container, "", 275, 1); //$NON-NLS-1$
-
-		createLabel(container,
-				ImportResources.SelectPluginsToImport_label_desc, 1);
-		ctrl_briefDescImport = createMultiLineText(container, "", 275, 100, 1); //$NON-NLS-1$
-	}
-
-	private void createLibraryPluginInfo(Composite container) {
-		libraryPluginLabel = createLabel(container, pluginNoSelection, 1);
-		createLine(container, 1);
-
-		createLabel(container,
-				ImportResources.SelectPluginsToImport_label_author, 1);
-		ctrl_authorLibrary = createMultiLineText(container, "", 275, 40, 1); //$NON-NLS-1$
-
-		createLabel(container,
-				ImportResources.SelectPluginsToImport_label_version, 1);
-		ctrl_versionLibrary = createText(container, "", 275, 1); //$NON-NLS-1$
-
-		createLabel(container,
-				ImportResources.SelectPluginsToImport_label_desc, 1);
-		ctrl_briefDescLibrary = createMultiLineText(container, "", 275, 100, 1); //$NON-NLS-1$
-	}
-
-	private void addListeners() {
-		ctrl_chkboxTableViewer.addSelectionChangedListener(this);
-		ctrl_chkboxTableViewer.addCheckStateListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		Object obj = event.getElement();
-
-		// Set the flag to import the selected plug-ins.
-		if (obj instanceof PluginImportData.PluginInfo) {
-			((PluginImportData.PluginInfo) obj).selected = event.getChecked();
-		}
-		String message = service.validateSelection();
-		if (message != null && message.length() > 0) {
-			super.setErrorMessage(message);
-		} else {
-			super.setErrorMessage(null);
-		}
-
-		if (event.getChecked()) {
-			checkedCount++;
-			checkedPluginList.add(obj);
-		} else {
-			checkedCount--;
-			checkedPluginList.remove(obj);
-		}
-
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		StructuredSelection selection = (StructuredSelection) event
-				.getSelection();
-		if (!selection.isEmpty()) {
-			Object[] plugin = selection.toArray();
-			setDisplayAttributes((PluginInfo) plugin[0]);
-		} else {
-			clearDisplayAttributes();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-	 */
-	public void handleEvent(Event event) {
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	private void setDisplayAttributes(PluginInfo plugin) {
-		ctrl_authorImport.setText(plugin.authors == null ? "" : plugin.authors); //$NON-NLS-1$
-		ctrl_versionImport
-				.setText(plugin.version == null ? "" : plugin.version); //$NON-NLS-1$
-		ctrl_briefDescImport
-				.setText(plugin.brief_desc == null ? "" : plugin.brief_desc); //$NON-NLS-1$
-		importPluginLabel.setText(pluginDataLabel);
-
-		if (plugin.existingPlugin != null) {
-			libraryPluginLabel.setText(libraryPluginExists);
-			ctrl_authorLibrary.setText(plugin.existingPlugin.getAuthors());
-			ctrl_versionLibrary.setText(plugin.existingPlugin.getVersion());
-			ctrl_briefDescLibrary.setText(plugin.existingPlugin
-					.getBriefDescription());
-		} else {
-			libraryPluginLabel.setText(libraryPluginNotExists);
-			ctrl_authorLibrary.setText(""); //$NON-NLS-1$
-			ctrl_versionLibrary.setText(""); //$NON-NLS-1$
-			ctrl_briefDescLibrary.setText(""); //$NON-NLS-1$
-		}
-	}
-
-	private void clearDisplayAttributes() {
-		importPluginLabel.setText(pluginNoSelection);
-		ctrl_authorImport.setText(""); //$NON-NLS-1$
-		ctrl_versionImport.setText(""); //$NON-NLS-1$
-		ctrl_briefDescImport.setText(""); //$NON-NLS-1$
-
-		libraryPluginLabel.setText(pluginNoSelection);
-		ctrl_authorLibrary.setText(""); //$NON-NLS-1$
-		ctrl_versionLibrary.setText(""); //$NON-NLS-1$
-		ctrl_briefDescLibrary.setText(""); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (getErrorMessage() != null)
-			return false;
-		return (checkedCount > 0);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		List plugins = data.getPlugins();
-		if (plugins != null) {
-			ctrl_chkboxTableViewer.setInput(plugins.toArray());
-			if (!plugins.isEmpty()) {
-				StructuredSelection selection = new StructuredSelection(plugins
-						.get(0));
-				ctrl_chkboxTableViewer.setSelection(selection);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/package.html b/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/package.html
deleted file mode 100644
index ce6107d..0000000
--- a/1.5/plugins/org.eclipse.epf.import/src/org/eclipse/epf/importing/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides wizards for importing method plug-ins and configurations.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/.classpath b/1.5/plugins/org.eclipse.epf.library.edit.ui/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/.project b/1.5/plugins/org.eclipse.epf.library.edit.ui/.project
deleted file mode 100644
index f839d92..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.library.edit.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.library.edit.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index d21d86c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Library Edit UI Plug-in
-Bundle-SymbolicName: org.eclipse.epf.library.edit.ui;singleton:=true
-Bundle-Version: 1.5.0
-Bundle-Activator: org.eclipse.epf.library.edit.ui.LibraryEditUIPlugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.common.ui,
- org.eclipse.epf.library.edit,
- org.eclipse.emf.edit.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.library.edit.ui
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/build.properties b/1.5/plugins/org.eclipse.epf.library.edit.ui/build.properties
deleted file mode 100644
index e9863e2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.library.edit.ui/plugin.xml
deleted file mode 100644
index 0f64136..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/plugin.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.epf.library.edit.uiHelper">
-      <uiHelper
-            class="org.eclipse.epf.library.edit.ui.UIHelper">
-      </uiHelper>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/LibraryEditUIPlugin.java b/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/LibraryEditUIPlugin.java
deleted file mode 100644
index 81eceef..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/LibraryEditUIPlugin.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.epf.library.edit.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class LibraryEditUIPlugin extends AbstractPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.library.edit.ui";
-
-	// The shared instance
-	private static LibraryEditUIPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public LibraryEditUIPlugin() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static LibraryEditUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/ProcessListSelectionDialog.java b/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/ProcessListSelectionDialog.java
deleted file mode 100644
index b79e0ee..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/ProcessListSelectionDialog.java
+++ /dev/null
@@ -1,35 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.ui;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-
-/**
- * This java file extends jface ListSelectionDialog and remove cancel button
- * from dialog
- * 
- * @author Shilpa Toraskar
- * @since 1.1
- *
- */
-public class ProcessListSelectionDialog extends ListSelectionDialog {
-
-	public ProcessListSelectionDialog(Shell parentShell, Object input,
-            IStructuredContentProvider contentProvider,
-            ILabelProvider labelProvider, String message)
-	{
-		super(parentShell, input, contentProvider, labelProvider, message);
-	}
-	
-	protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-                true);
-       
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/TeamSelection.java b/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/TeamSelection.java
deleted file mode 100644
index 73444b9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/TeamSelection.java
+++ /dev/null
@@ -1,111 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.eclipse.epf.library.edit.util.AdapterFactoryItemLabelProvider;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * UI Dialog class which will ask user to assign a role to team automatically.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class TeamSelection {
-
-	/**
-	 * It shows dialog box all teams. Returns team user selected
-	 * 
-	 * @param element
-	 * @return
-	 */
-	public static TeamProfile getSelectedTeam(List teamList, Role role, Shell shell) {
-//		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-//				TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory()) {
-//			public String getText(Object obj) {
-//				if (obj instanceof TeamProfile) {
-//					return ((TeamProfile) obj).getName();
-//				}
-//				return ""; //$NON-NLS-1$
-//			}
-//		};
-//		if(shell == null) {
-//			try {
-//				shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); //MsgBox.getDefaultShell();
-//			}
-//			catch(Exception e) {
-//				
-//			}
-//		}
-//		ElementListSelectionDialog dlg = new ElementListSelectionDialog(shell, labelProvider);
-//
-//		dlg.setBlockOnOpen(true);
-//		dlg.setElements(teamList.toArray());
-//		dlg.setMultipleSelection(false);
-//		dlg
-//				.setMessage(NLS.bind(LibraryEditResources.selectTeamsDialog_text, (new Object[] { role.getName() }))); 
-//		dlg.setTitle(LibraryEditResources.selectTeamsDialog_title); //$NON-NLS-1$
-//		dlg.setFilter(null);
-//		dlg.open();
-//		Object obj = dlg.getFirstResult();
-//		// dispose
-//		labelProvider.dispose();
-//		return (TeamProfile) obj;
-		
-		final IUserInteractionHandler uiHandler = ExtensionManager
-				.getDefaultUserInteractionHandler();
-		if (uiHandler != null) {
-			final IItemLabelProvider labelProvider = new AdapterFactoryItemLabelProvider(
-					TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory());
-			final String title = LibraryEditResources.selectTeamsDialog_title;
-			final String msg = NLS.bind(LibraryEditResources.selectTeamsDialog_text, (new Object[] { role.getName() }));
-			final List finalSelected = new ArrayList();
-			final List finalTeams = new ArrayList();
-			finalTeams.addAll(teamList);
-
-			UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-				public void run() {
-					List selected = uiHandler.select(finalTeams, labelProvider, false,
-							finalTeams, title, msg);
-
-					if (selected != null)
-						finalSelected.addAll(selected);
-				}
-			}, true);
-
-			if (finalSelected == null) {
-				throw new OperationCanceledException();
-			}
-			if(finalSelected.isEmpty()) {
-				return null;
-			}
-			return (TeamProfile) finalSelected.get(0);
-		}
-
-		// no user interaction handler available
-		// return null
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/UIHelper.java b/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/UIHelper.java
deleted file mode 100644
index f9a0eb9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit.ui/src/org/eclipse/epf/library/edit/ui/UIHelper.java
+++ /dev/null
@@ -1,652 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2008 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.ui;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.ModalContext;
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.WorkbenchJob;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.5
- *
- */
-public class UIHelper implements IUIHelper {
-	/**
-	 * Get teams in scope
-	 * 
-	 * @param adapterFactory
-	 * @param e
-	 * @param role
-	 * @param teamList
-	 */
-	private static void getTeamsInScope(AdapterFactory adapterFactory,
-			BreakdownElement e, Role role, List teamList) {
-		// get children for activity
-		ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(e, ITreeItemContentProvider.class);
-		Collection children = itemProvider.getChildren(e);
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (obj instanceof TeamProfile) {
-				TeamProfile team = (TeamProfile) obj;
-				List allTeams = new ArrayList();
-				// get all sub teams as well
-				ProcessUtil.getAllSubTeams(team, allTeams);
-
-				for (Iterator teamItor = allTeams.iterator(); teamItor
-						.hasNext();) {
-					Object o = teamItor.next();
-					if (o instanceof TeamProfile) {
-						// get roles from teams
-						List roles = ProcessUtil.getRoles(((TeamProfile) o)
-								.getTeamRoles());
-						if (roles.contains(role)) {
-							teamList.add(o);
-						}
-					}
-				}
-			}
-		}
-
-		// get parent
-		Object currentParent = itemProvider.getParent(e);
-		if (currentParent != null) {
-			// go up
-			getTeamsInScope(adapterFactory, (BreakdownElement) currentParent,
-					role, teamList);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.util.IUIHelper#getTeam(org.eclipse.epf.uma.Activity, org.eclipse.epf.uma.Role, java.lang.Object)
-	 */
-	public TeamProfile getTeam(Activity activity, Role role, Object UIContext) {
-		List teamList = new ArrayList();
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		// find out all team in visible scope
-		getTeamsInScope(adapterFactory, activity, role, teamList);
-		if (teamList.size() == 1) {
-			return (TeamProfile) teamList.get(0);
-		}
-		if (teamList.size() > 1) {
-			return TeamSelection.getSelectedTeam(teamList, role,
-					UIContext instanceof Shell ? (Shell) UIContext : null);
-		}
-		// there are no teams to assign
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.util.IUIHelper#runInModalContext(org.eclipse.epf.library.edit.util.IRunnableWithProgress, boolean, org.eclipse.core.runtime.IProgressMonitor, java.lang.Object)
-	 */
-	public IStatus runInModalContext(final IRunnableWithProgress operation,
-			boolean fork, IProgressMonitor monitor, Object uiContext) {
-		org.eclipse.jface.operation.IRunnableWithProgress op = new org.eclipse.jface.operation.IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				operation.run(monitor);
-			}
-			
-		};
-		try {
-			ModalContext.run(op, true, monitor, ((Shell)uiContext)
-					.getDisplay());
-			return Status.OK_STATUS;
-		} catch (Exception e) {
-			LibraryEditPlugin.INSTANCE.log(e);
-			Throwable ex;
-			if (e instanceof InvocationTargetException) {
-				ex = ((InvocationTargetException) e)
-						.getTargetException();
-			} else {
-				ex = e;
-			}
-			String msg = TngUtil.toStackTraceString(ex);
-			return new Status(IStatus.ERROR,
-					LibraryEditPlugin.INSTANCE.getSymbolicName(), 0,
-					msg, ex);
-		}
-
-	}
-
-	public List selectTasks(List taskList, WorkProduct wp) {
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public String getColumnText(Object obj, int column) {
-				if (obj instanceof MethodElement) {
-					return TngUtil.getPresentationName(obj);
-				}
-				return super.getText(obj);
-			}
-		};
-
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((List) object).toArray();
-			}
-		};
-
-		try {
-			ProcessListSelectionDialog dlg = new ProcessListSelectionDialog(
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(),
-					taskList,
-					contentProvider,
-					labelProvider,
-					NLS
-							.bind(
-									LibraryEditResources.ui_UserInteractionHelper_wplistdlg_msg,
-									wp.getName()));
-
-			dlg.setTitle(LibraryEditResources.ui_UserInteractionHelper_tasks);
-			dlg.setBlockOnOpen(true);
-			dlg.open();
-			Object[] objs = dlg.getResult();
-
-			List selectedTasks = new ArrayList();
-			if ((objs != null) && (objs.length > 0)) {
-				for (int i = 0; i < objs.length; i++) {
-					selectedTasks.add(objs[i]);
-				}
-			}
-			return selectedTasks;
-		} finally {
-			// dispose
-			labelProvider.dispose();
-			contentProvider.dispose();
-		}
-	}
-
-	public List selectWorkProducts(List wpList, Role role) {
-		ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public String getColumnText(Object obj, int column) {
-				if (obj instanceof MethodElement) {
-					return TngUtil.getPresentationName(obj);
-				}
-				return super.getText(obj);
-			}
-		};
-
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				return ((List) object).toArray();
-			}
-		};
-
-		try {
-			ProcessListSelectionDialog dlg = new ProcessListSelectionDialog(
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-							.getShell(),
-					// MsgBox.getDefaultShell(),
-					wpList,
-					contentProvider,
-					labelProvider,
-					NLS
-							.bind(
-									LibraryEditResources.ui_UserInteractionHelper_rolelistdlg_msg,
-									role.getName()));
-
-			dlg
-					.setTitle(LibraryEditResources.ui_UserInteractionHelper_workproducts); 
-			dlg.setBlockOnOpen(true);
-			dlg.open();
-			Object[] objs = dlg.getResult();
-
-			List selectedWps = new ArrayList();
-			if ((objs != null) && (objs.length > 0)) {
-				for (int i = 0; i < objs.length; i++) {
-					selectedWps.add(objs[i]);
-				}
-			}
-			return selectedWps;
-		} finally {
-			// dispose
-			labelProvider.dispose();
-			contentProvider.dispose();
-		}
-	}
-	
-	private static class RunnableWithProgress implements org.eclipse.jface.operation.IRunnableWithProgress {
-		private IRunnableWithProgress operation;
-
-		public RunnableWithProgress(IRunnableWithProgress op) {
-			this.operation = op;
-		}
-
-		public void run(IProgressMonitor monitor)
-				throws InvocationTargetException, InterruptedException {
-			operation.run(monitor);
-		}
-		
-	}
-
-	public IStatus runAsJob(final IRunnableWithProgress runnable, String taskName,
-			Object shell) {
-		Job job = new WorkspaceJob(taskName) {
-
-			public IStatus runInWorkspace(IProgressMonitor monitor)
-					throws CoreException {
-				try {
-					// monitor.beginTask(taskName, IProgressMonitor.UNKNOWN);
-					runnable.run(monitor);
-					return Status.OK_STATUS;
-				} catch (InvocationTargetException e) {
-					Throwable ex;
-					if (e.getCause() != null) {
-						ex = e.getCause();
-					} else {
-						ex = e;
-					}
-					return new Status(IStatus.ERROR, LibraryEditPlugin
-							.getPlugin().getId(), 0, ex.toString(), ex);
-				} catch (InterruptedException e) {
-					return new Status(IStatus.ERROR, LibraryEditPlugin
-							.getPlugin().getId(), 0, e.toString(), e);
-				} finally {
-					monitor.done();
-				}
-			}
-
-		};
-		PlatformUI.getWorkbench().getProgressService().showInDialog((Shell) shell, job);
-		job.schedule();
-		return job.getResult();
-	}
-
-	public boolean runInUI(IRunnableWithProgress runnable,
-			ISchedulingRule rule, Object shell) {
-		if (shell == null) {
-			shell = LibraryEditPlugin.getDefault().getContext();
-		}
-		IRunnableContext context = new ProgressMonitorDialog((Shell) shell);
-		try {
-			PlatformUI.getWorkbench().getProgressService().runInUI(context,
-					new RunnableWithProgress(runnable), rule);
-			return true;
-		} catch (Exception e) {
-			LibraryEditPlugin.getDefault().getLogger().logError(e);
-			String title = LibraryEditResources.errorDialog_title;
-			ExtensionManager.getDefaultUserInteractionHandler().getMessenger()
-				.showError(title, e.toString(), null, e);
-//			LibraryEditPlugin.getDefault().getMsgDialog().displayError(title,
-//					e.toString(), e);
-		}
-		return false;
-	}
-
-	public static boolean runWithProgress(final IRunnableWithProgress runnable,
-			final IRunnableContext runnableContext, final boolean canCancel, final String msg) {
-		final MultiStatus status = new MultiStatus(LibraryEditPlugin.INSTANCE
-				.getSymbolicName(), IStatus.OK,
-				LibraryEditResources.error_reason, null); 
-
-		final org.eclipse.jface.operation.IRunnableWithProgress operation = new org.eclipse.jface.operation.IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				monitor.beginTask(msg, IProgressMonitor.UNKNOWN);
-				monitor.subTask(""); //$NON-NLS-1$
-				try {
-					runnable.run(monitor);
-				} catch (RuntimeException e) {
-					String msg;
-					if (e instanceof MessageException) {
-						msg = e.getMessage();
-					} else {
-						StringWriter strWriter = new StringWriter();
-						e.printStackTrace(new PrintWriter(strWriter));
-						msg = strWriter.toString();
-					}
-					status.add(new Status(IStatus.ERROR,
-							LibraryEditPlugin.INSTANCE.getSymbolicName(), 0,
-							msg, e));
-				} finally {
-					monitor.done();
-				}
-			}
-
-		};
-
-		try {
-			if (Display.getCurrent() == null) {
-				// current thread is not a user-interface thread
-				//
-				Display.getDefault().syncExec(new Runnable() {
-
-					public void run() {
-						try {
-							runnableContext.run(true, canCancel, operation);
-						} catch (Exception e) {
-							LibraryEditPlugin.getDefault().getLogger().logError(e);
-						}
-					}
-
-				});
-			} else {
-				runnableContext.run(true, canCancel, operation);
-			}
-
-			if (!status.isOK()) {
-				ExtensionManager.getDefaultUserInteractionHandler()
-						.getMessenger().showError(
-								LibraryEditResources.errorDialog_title,
-								LibraryEditResources.error_msgWithDetails,
-								status);
-			} else {
-				return true;
-			}
-		} catch (Exception exception) {
-			// Something went wrong that shouldn't.
-			//
-			LibraryEditPlugin.getDefault().getLogger().logError(exception);
-		}
-
-		return false;
-	}
-
-	public boolean runWithProgress(IRunnableWithProgress runnable,
-			boolean canCancel, String msg) {
-		return runWithProgress(runnable, getRunnableContext(), false, msg);
-	}
-
-	public IRunnableContext getRunnableContext() {
-		Shell shell;
-		Object uiCtx = ExtensionManager.getDefaultUserInteractionHandler().getUIContext();
-		if (uiCtx instanceof Shell) {
-			shell = (Shell) uiCtx;
-		} else {
-			shell = MsgBox.getDefaultShell();
-		}
-		return new ProgressMonitorDialog(shell);
-	}
-	
-	public static Viewer doGetViewer(AdapterFactory adapterFactory, Process proc) {
-		if (adapterFactory instanceof ExposedAdapterFactory) {
-			for (Iterator iter = Collections.unmodifiableList(
-					((ExposedAdapterFactory) adapterFactory)
-							.getChangeListeners()).iterator(); iter.hasNext();) {
-				Object listener = iter.next();
-				if (listener instanceof IContentProvider && listener instanceof IViewerProvider) {					
-					Viewer viewer = ((IViewerProvider) listener).getViewer();
-					if (viewer.getInput() instanceof ProcessComponent
-							&& ((ProcessComponent) viewer.getInput())
-									.getProcess() == proc)
-						return viewer;
-				}
-			}
-		}
-		return null;
-	}
-
-	public boolean refreshNeeded(AdapterFactory adapterFactory,
-			BSActivityItemProvider itemProvider) {
-		Process process = (Process) itemProvider.getTopItem();
-		if (process == null)
-			return false;
-
-		// check if the given process is currently opened in editor
-		//
-		Viewer viewer = doGetViewer(adapterFactory, process);
-		if (viewer != null && viewer.getControl() != null
-				&& !viewer.getControl().isDisposed()) {
-			return true;
-		}
-
-		for (Iterator iter = TngUtil.getContributors(process); iter.hasNext();) {
-			Object element = iter.next();
-			BSActivityItemProvider adapter = (BSActivityItemProvider) adapterFactory
-					.adapt(element, ITreeItemContentProvider.class);
-			if (refreshNeeded(adapterFactory, adapter))
-				return true;
-		}
-
-		for (Iterator iter = TngUtil.getGeneralizers(process,
-				VariabilityType.EXTENDS_LITERAL); iter.hasNext();) {
-			Object element = iter.next();
-			BSActivityItemProvider adapter = (BSActivityItemProvider) adapterFactory
-					.adapt(element, ITreeItemContentProvider.class);
-			if (refreshNeeded(adapterFactory, adapter))
-				return true;
-		}
-
-		return false;
-	}
-
-	public void refreshAllViewers(final ExposedAdapterFactory adapterFactory) {
-		UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-
-			public void run() {
-				for (Iterator iter = Collections.unmodifiableList(
-						adapterFactory.getChangeListeners()).iterator(); iter.hasNext();) {
-					Object listener = iter.next();
-					if (listener instanceof IContentProvider && listener instanceof IViewerProvider) {					
-						Viewer viewer = ((IViewerProvider) listener).getViewer();
-						if (viewer != null && viewer.getControl() != null
-								&& !viewer.getControl().isDisposed()
-								&& viewer.getInput() instanceof ProcessComponent) {
-							viewer.refresh();
-						}
-					}
-				}
-			}
-			
-		}, true);
-	}
-
-	public void refreshViewer(AdapterFactory factory, Process proc) {
-		final Viewer viewer = doGetViewer(factory, proc);
-		if (viewer != null && viewer.getControl() != null
-				&& !viewer.getControl().isDisposed()) {
-			UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-
-				public void run() {
-					viewer.refresh();
-				}
-				
-			}, true);
-		}
-	}
-
-	public void refreshIDsInViewer(final ExposedAdapterFactory adapterFactory) {
-		UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-
-			public void run() {
-				for (Iterator iter = Collections.unmodifiableList(
-						adapterFactory.getChangeListeners()).iterator(); iter.hasNext();) {
-					Object listener = iter.next();
-					if (listener instanceof IContentProvider && listener instanceof IViewerProvider) {					
-						Viewer viewer = ((IViewerProvider) listener).getViewer();
-						if (viewer != null && viewer.getControl() != null
-								&& !viewer.getControl().isDisposed()
-								&& viewer.getInput() instanceof ProcessComponent) {
-							Process proc = ((ProcessComponent) viewer.getInput())
-									.getProcess();
-							BSActivityItemProvider itemProvider = (BSActivityItemProvider) adapterFactory
-									.adapt(proc, ITreeItemContentProvider.class);
-							if (itemProvider.isRefreshAllIDsRequired()) {
-								ProcessUtil.updateIDs(adapterFactory, proc);
-								viewer.refresh();
-								itemProvider.setRefreshAllIDsRequired(false);
-							}
-						}
-					}
-				}
-			}
-			
-		}, true);
-	}
-
-	public Object getViewer(AdapterFactory adapterFactory, Process proc) {
-		return doGetViewer(adapterFactory, proc);
-	}
-
-	public void runSafely(final Runnable runnable, boolean synchronous) {
-		Display display = null;
-		try {
-			display = Display.getCurrent();
-		} catch (Exception e) {
-			//
-		}
-		
-		Runnable runner = new Runnable() {
-
-			public void run() {
-				try {
-					runnable.run();
-				} catch (Exception e) {
-					LibraryEditUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-
-		};
-
-		if(display == null) {
-			// current thread is not a user-interface thread
-			//
-			try {
-				display = Display.getDefault();
-			}
-			catch(Exception e) {
-
-			}
-			if(display != null) {
-				if(synchronous) {
-					display.syncExec(runner);
-				}
-				else {
-					display.asyncExec(runner);
-				}
-			}
-			else {
-				runner.run();
-			}
-		}
-		else {
-			// current thread is a user-interface thread
-			//
-			if(synchronous) {
-				runner.run();
-			}
-			else {
-				display.asyncExec(runner);
-			}
-		}
-	}
-
-	public void runWithBusyIndicator(Runnable runnable) {
-		BusyIndicator.showWhile(Display.getCurrent(), runnable);
-	}
-
-	public void runInUI(final IRunnableWithProgress runnable, String taskName) {
-		Shell shell = (Shell) LibraryEditPlugin.getDefault().getContext();
-		if (shell == null) {
-			try {
-				runnable.run(new NullProgressMonitor());
-				return;
-			} catch (Exception e) {
-				LibraryEditPlugin.getDefault().getLogger().logError(e);
-				throw new WrappedException(e);
-			}
-		}
-		Job job = new WorkbenchJob(taskName) {
-
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-				monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-				try {
-					runnable.run(monitor);
-					return Status.OK_STATUS;
-				} catch (InvocationTargetException e) {
-					Throwable ex;
-					if (e.getCause() != null) {
-						ex = e.getCause();
-					} else {
-						ex = e;
-					}
-					return new Status(IStatus.ERROR, LibraryEditPlugin
-							.getPlugin().getId(), 0, ex.toString(), ex);
-				} catch (InterruptedException e) {
-					return new Status(IStatus.ERROR, LibraryEditPlugin
-							.getPlugin().getId(), 0, e.toString(), e);
-				} finally {
-					monitor.done();
-				}
-			}
-
-		};
-		PlatformUI.getWorkbench().getProgressService().showInDialog(shell, job);
-		job.schedule();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/.classpath b/1.5/plugins/org.eclipse.epf.library.edit/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/.options b/1.5/plugins/org.eclipse.epf.library.edit/.options
deleted file mode 100644
index b4ab112..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace
-org.eclipse.epf.library.edit/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/.project b/1.5/plugins/org.eclipse.epf.library.edit/.project
deleted file mode 100644
index dc70fb5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.library.edit</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.library.edit/META-INF/MANIFEST.MF
deleted file mode 100644
index 47b6683..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.library.edit; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.epf.library.edit.LibraryEditPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.common;visibility:=reexport,
- org.eclipse.epf.uma.edit;visibility:=reexport,
- org.eclipse.epf.services;visibility:=reexport
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.library.edit,
- org.eclipse.epf.library.edit.category,
- org.eclipse.epf.library.edit.command,
- org.eclipse.epf.library.edit.configuration,
- org.eclipse.epf.library.edit.element,
- org.eclipse.epf.library.edit.internal,
- org.eclipse.epf.library.edit.itemsfilter,
- org.eclipse.epf.library.edit.navigator,
- org.eclipse.epf.library.edit.process,
- org.eclipse.epf.library.edit.process.command,
- org.eclipse.epf.library.edit.process.consolidated,
- org.eclipse.epf.library.edit.process.internal,
- org.eclipse.epf.library.edit.ui,
- org.eclipse.epf.library.edit.util,
- org.eclipse.epf.library.edit.util.model,
- org.eclipse.epf.library.edit.util.model.impl,
- org.eclipse.epf.library.edit.util.model.util,
- org.eclipse.epf.library.edit.validation,
- org.eclipse.epf.library.edit.validation.internal
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/build.properties b/1.5/plugins/org.eclipse.epf.library.edit/build.properties
deleted file mode 100644
index 558b086..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/
-
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/checked_box.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/checked_box.gif
deleted file mode 100644
index 9cacb96..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/checked_box.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateActivity_breakdownElements_Activity.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateActivity_breakdownElements_Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateActivity_breakdownElements_Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateContentElement_conceptsAndPapers_Concept.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateContentElement_conceptsAndPapers_Concept.gif
deleted file mode 100644
index 1df84da..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateContentElement_conceptsAndPapers_Concept.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateCustomCategory_categorizedElements_CustomCategory.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateCustomCategory_categorizedElements_CustomCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateCustomCategory_categorizedElements_CustomCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateCustomCategory_subCategories_CustomCategory.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateCustomCategory_subCategories_CustomCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateCustomCategory_subCategories_CustomCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateDisciplineGrouping_disciplines_Discipline.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateDisciplineGrouping_disciplines_Discipline.gif
deleted file mode 100644
index 35bd476..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateDisciplineGrouping_disciplines_Discipline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreatePractice_subPractice_Practice.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreatePractice_subPractice_Practice.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreatePractice_subPractice_Practice.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateRoleSetGrouping_roleSets_RoleSet.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateRoleSetGrouping_roleSets_RoleSet.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateRoleSetGrouping_roleSets_RoleSet.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateWorkProduct_estimate_Estimate.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateWorkProduct_estimate_Estimate.gif
deleted file mode 100644
index b3643da..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/ctool16/CreateWorkProduct_estimate_Estimate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Artifact.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Artifact.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/CapabilityPatterns.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/CapabilityPatterns.gif
deleted file mode 100644
index 3714765..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/CapabilityPatterns.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Checklists.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Checklists.gif
deleted file mode 100644
index 88f6d8b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Checklists.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Concepts.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Concepts.gif
deleted file mode 100644
index 1df84da..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Concepts.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Configurations.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Configurations.gif
deleted file mode 100644
index 2a24fdc..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Configurations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Content.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Content.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Content.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/CustomCategories.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/CustomCategories.gif
deleted file mode 100644
index 63a5d7c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/CustomCategories.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Deliverable.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Deliverable.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Deliverable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/DeliveryProcesses.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/DeliveryProcesses.gif
deleted file mode 100644
index 5f24a9a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/DeliveryProcesses.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Disciplines.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Disciplines.gif
deleted file mode 100644
index 5553c1d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Disciplines.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Domains.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Domains.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Domains.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/EstimationConsiderations.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/EstimationConsiderations.gif
deleted file mode 100644
index 4fc84e4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/EstimationConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Examples.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Examples.gif
deleted file mode 100644
index 1b944fd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Examples.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Folder.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Folder.gif
deleted file mode 100644
index 06419d8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Folder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/GuidanceFolder.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/GuidanceFolder.gif
deleted file mode 100644
index ccb1417..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/GuidanceFolder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/MethodPackages.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/MethodPackages.gif
deleted file mode 100644
index fc38ce8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/MethodPackages.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Outcome.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Outcome.gif
deleted file mode 100644
index e703518..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Outcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/PlanningTemplates.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/PlanningTemplates.gif
deleted file mode 100644
index beb6ed1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/PlanningTemplates.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Practices.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Practices.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Practices.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Process.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Process.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Process.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ProcessContributions.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ProcessContributions.gif
deleted file mode 100644
index 08d8c2d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ProcessContributions.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ProcessFamilies.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ProcessFamilies.gif
deleted file mode 100644
index df1ba6c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ProcessFamilies.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Processes.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Processes.gif
deleted file mode 100644
index 08d8c2d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Processes.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Reports.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Reports.gif
deleted file mode 100644
index 95f3e0c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Reports.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ReusableAssets.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ReusableAssets.gif
deleted file mode 100644
index b52cffe..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ReusableAssets.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Roadmaps.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Roadmaps.gif
deleted file mode 100644
index f11bc5d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Roadmaps.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Roles.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Roles.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Roles.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/StandardCategories.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/StandardCategories.gif
deleted file mode 100644
index 5698382..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/StandardCategories.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/SupportingMaterials.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/SupportingMaterials.gif
deleted file mode 100644
index 05a21ec..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/SupportingMaterials.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tasks.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tasks.gif
deleted file mode 100644
index 638bd83..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tasks.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tasks_cfv.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tasks_cfv.gif
deleted file mode 100644
index 5553c1d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tasks_cfv.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Techniques.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Techniques.gif
deleted file mode 100644
index 36866d9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Techniques.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Templates.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Templates.gif
deleted file mode 100644
index c763251..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Templates.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/TermDefinitions.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/TermDefinitions.gif
deleted file mode 100644
index e21bfe0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/TermDefinitions.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ToolMentors.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ToolMentors.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/ToolMentors.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tools.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tools.gif
deleted file mode 100644
index 524f8e2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Tools.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Whitepapers.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Whitepapers.gif
deleted file mode 100644
index e5b4800..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/Whitepapers.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProductGuidelines.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProductGuidelines.gif
deleted file mode 100644
index 957fa65..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProductGuidelines.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProductTypes.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProductTypes.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProductTypes.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProducts.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProducts.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/WorkProducts.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/empty_pack_obj.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/empty_pack_obj.gif
deleted file mode 100644
index c88284a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/empty_pack_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/package_obj.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/package_obj.gif
deleted file mode 100644
index 131c28d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/package_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/procfold_obj.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/procfold_obj.gif
deleted file mode 100644
index 048e271..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/procfold_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/toolset.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/toolset.gif
deleted file mode 100644
index 524f8e2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/full/obj16/toolset.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/icons/unchecked_box.gif b/1.5/plugins/org.eclipse.epf.library.edit/icons/unchecked_box.gif
deleted file mode 100644
index f6b9f8a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/icons/unchecked_box.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/plugin.properties b/1.5/plugins/org.eclipse.epf.library.edit/plugin.properties
deleted file mode 100644
index f0139b5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/plugin.properties
+++ /dev/null
@@ -1,88 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Library Edit
-providerName=Eclipse.org
-
-_UI_Content_group=Method Content
-
-_UI_Disciplines_group=Disciplines
-_UI_Domains_group=Domains
-_UI_WorkProductTypes_group=Work Product Kinds
-_UI_Role_Sets_group=Role Sets
-_UI_Tools_group=Tools
-_UI_Standard_Categories_group=Standard Categories
-_UI_Custom_Categories_group=Custom Categories
-_UI_MethodContent_group=Content Packages
-
-_UI_Processes_group=Processes
-_UI_PlanningTemplates_group=Planning Templates
-
-_UI_CapabilityPatterns_text=Capability Patterns
-_UI_DeliveryProcesses_text=Delivery Processes
-_UI_ProcessContributions_text=Differential Processes
-_UI_PlanningTemplates_text=Planning Templates
-
-_UI_CapabilityPattern_text=Capability Pattern
-_UI_DeliveryProcess_text=Delivery Process
-_UI_ProcessContribution_text=Differential Process
-
-_UI_Configurations_text=Configurations
-
-_UI_ProcessFamilies_text=Process Families
-
-_UI_Uncategorized_text=Uncategorized
-_UI_Uncategorized_Tasks_text=Uncategorized Tasks
-_UI_Uncategorized_Roles_text=Uncategorized Roles
-
-_UI_Guidances_group=Guidance
-_UI_Guidances_Checklists=Checklists
-_UI_Guidances_Concepts=Concepts
-_UI_Guidances_Examples=Examples
-_UI_Guidances_EstimationConsiderations=Estimation Considerations
-_UI_Guidances_Practices=Practices
-_UI_Guidances_Reports=Reports
-_UI_Guidances_ReusableAssets=Reusable Assets
-_UI_Guidances_Roadmap=Roadmap
-_UI_Guidances_SupportingMaterials=Supporting Materials
-_UI_Guidances_Techniques=Techniques
-_UI_Guidances_Templates=Templates
-_UI_Guidances_TermDefinitions=Term Definitions
-_UI_Guidances_ToolMentors=Tool Mentors
-_UI_Guidances_Whitepapers=Whitepapers
-_UI_Guidances_WorkProductGuidelines=Guidelines
-
-
-_UI_Roles_group=Roles
-_UI_Tasks_group=Tasks
-_UI_WorkProducts_group=Work Products
-
-# Breakdown structure column display names
-BS_Column_name=Name
-BS_Column_prefix=Prefix
-BS_Column_id=Index
-BS_Column_predecessors=Predecessors
-BS_Column_is_repeatable=Repeatable
-BS_Column_is_ongoing=Ongoing
-BS_Column_is_event_driven=Event-Driven
-BS_Column_entry_state=Entry State
-BS_Column_exit_state=Exit State
-BS_Column_teams=Team
-BS_Column_type=Type
-BS_Column_model_info=Model Info
-BS_Column_presentation_name=Presentation Name
-BS_Column_deliverable=Deliverable
-BS_Column_is_optional=Optional
-BS_Column_is_planned=Planned
-BS_Column_has_multiple_occurrences=Multiple Occurrences
-
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/plugin.xml b/1.5/plugins/org.eclipse.epf.library.edit/plugin.xml
deleted file mode 100644
index 836f90f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/plugin.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="textReferenceReplacer" name="Text Reference Replacer" schema="schema/textReferenceReplacer.exsd"/>
-   <extension-point id="diagramManager" name="Diagram Manager" schema="schema/diagramManager.exsd"/>
-   <extension-point id="commandListeners" name="Command Listeners" schema="schema/commandListeners.exsd"/>
-   <extension-point id="libraryInspector" name="Library Inspector" schema="schema/libraryInspector.exsd"/>
-   <extension-point id="nestedCommandProviders" name="Nested Command Providers" schema="schema/nestedCommandProviders.exsd"/>
-   <extension-point id="oppositeFeatureLoaders" name="OppositeFeature Loaders" schema="schema/oppositeFeatureLoaders.exsd"/>
-   <extension-point id="userInteractionHandler" name="User Interaction Handler" schema="schema/userInteractionHandler.exsd"/>
-   <extension-point id="validationSupport" name="Validation Support" schema="schema/validationSupport.exsd"/>
-   <extension-point id="uiHelper" name="UI Helper" schema="schema/uiHelper.exsd"/>
-
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http:///com/ibm/uma/edit/tng/util/model.ecore" 
-       class = "org.eclipse.epf.library.edit.util.model.ModelPackage" />
-  </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/commandListeners.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/commandListeners.exsd
deleted file mode 100644
index 4a3a705..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/commandListeners.exsd
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="commandListeners" name="Command Listeners"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="commandListener" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="commandListener">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements a migrator. This class must be a public implementation of &lt;code&gt;org.eclipse.epf.library.edit.ICommandListener&lt;/code&gt; with a public 0-argument constructor.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.library.edit.ICommandListener"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.library.edit.ICommandListener
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/diagramManager.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/diagramManager.exsd
deleted file mode 100644
index 03757a9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/diagramManager.exsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="diagramManager" name="Diagram Manager"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="diagramManager" minOccurs="0" maxOccurs="1"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="diagramManager">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/libraryInspector.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/libraryInspector.exsd
deleted file mode 100644
index 5d211ad..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/libraryInspector.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="libraryInspector" name="Library Inspector"/>
-      </appInfo>
-      <documentation>
-         Inspect contents of libary for debug or testing purpose. The intention is to provide a conveient place to hook any external debug or testing implementation that is not part of EPF.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="libraryInspector" minOccurs="0" maxOccurs="1"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="libraryInspector">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.library.edit.util.ILibraryInspector
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/nestedCommandProviders.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/nestedCommandProviders.exsd
deleted file mode 100644
index d9d937b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/nestedCommandProviders.exsd
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="nestedCommandProviders" name="Nested Command Providers"/>
-      </appInfo>
-      <documentation>
-         Providers of nested commands to execute right after the execution of the main command. The extension must implement org.eclipse.epf.library.edit.command.INestedCommandProvider
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="nestedCommandProvider" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="nestedCommandProvider">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.library.edit.command.INestedCommandProvider"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/oppositeFeatureLoaders.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/oppositeFeatureLoaders.exsd
deleted file mode 100644
index 05ca9ea..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/oppositeFeatureLoaders.exsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="oppositeFeatureLoaders" name="OppositeFeature Loaders"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="oppositeFeatureLoader" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="oppositeFeatureLoader">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/textReferenceReplacer.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/textReferenceReplacer.exsd
deleted file mode 100644
index c309d3f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/textReferenceReplacer.exsd
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="textReferenceReplacer" name="Text Reference Replacer"/>
-      </appInfo>
-      <documentation>
-         Replaces textual references to the old objects with references to new objects
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="textReferenceReplacer" minOccurs="0" maxOccurs="1"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="textReferenceReplacer">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements a migrator. This class must be a public implementation of &lt;code&gt;org.eclipse.epf.library.edit.util.ITextReferenceReplacer&lt;/code&gt; with a public 0-argument constructor.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.library.edit.util.ITextReferenceReplacer
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/uiHelper.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/uiHelper.exsd
deleted file mode 100644
index 74de832..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/uiHelper.exsd
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="uiHelper" name="UI Helper"/>
-      </appInfo>
-      <documentation>
-         Extension point to provide implementation of some UI-specific operations/functions
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="uiHelper"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="uiHelper">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.epf.library.edit.ui.IUIHelper"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.5
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.library.edit.ui.IUIHelper
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2008 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/userInteractionHandler.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/userInteractionHandler.exsd
deleted file mode 100644
index be31681..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/userInteractionHandler.exsd
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="userInteractionHandler" name="User Interaction Handler"/>
-      </appInfo>
-      <documentation>
-         Extension point to interact with user
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="userInteractionHandler" minOccurs="0" maxOccurs="1"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="userInteractionHandler">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified name of a public class that implements org.eclipse.epf.library.edit.command.IUserInteractionHandler. This class must have a public default non-argument constructor.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.library.edit.command.IUserInteractionHandler
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/schema/validationSupport.exsd b/1.5/plugins/org.eclipse.epf.library.edit/schema/validationSupport.exsd
deleted file mode 100644
index 539dda5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/schema/validationSupport.exsd
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.edit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.edit" id="validationSupport" name="Validation Support"/>
-      </appInfo>
-      <documentation>
-         Supports contribution/replacement of validators
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="validationFactory"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="validationFactory">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="class"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Fully qualified name of a class that implements org.eclipse.epf.library.edit.validation.IValidatorFactory
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.library.edit.validation.IValidatorFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="replace" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  This attribute if set to &lt;code&gt;true&lt;/code&gt; will replace any other existing validation factory in the system. It is &lt;code&gt;false&lt;/code&gt; by default.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made
-available under the terms of the Eclipse Public License v1.0 which accompanies
-this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/FeatureValueWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/FeatureValueWrapperItemProvider.java
deleted file mode 100644
index c36fc65..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/FeatureValueWrapperItemProvider.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-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.command.CommandParameter;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * A subclass of DelegatingWrapperItemProvider that keeps a reference to the
- * containing feature of the wrapped value and implements Comparable to support
- * sorting.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class FeatureValueWrapperItemProvider extends
-		DelegatingWrapperItemProvider implements Comparable {
-
-	public FeatureValueWrapperItemProvider(EStructuralFeature feature,
-			Object value, Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, feature, CommandParameter.NO_INDEX, adapterFactory);
-	}
-
-	public EStructuralFeature getFeature() {
-		return feature;
-	}		
-
-	public List getNotifyChangedListeners() {
-		if(changeNotifier instanceof Collection) {
-			return new ArrayList((Collection) changeNotifier);
-		}
-		return Collections.EMPTY_LIST;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#createWrapper(java.lang.Object, java.lang.Object, org.eclipse.emf.common.notify.AdapterFactory)
-	 */
-	protected IWrapperItemProvider createWrapper(Object value, Object owner, AdapterFactory adapterFactory) {
-		return new FeatureValueWrapperItemProvider(null, value, owner, adapterFactory);
-	}
-
-	/**
-	 * Fills the given wrappers by keeping existing, removing/dispose old, and
-	 * adding new ones.
-	 * 
-	 * @param wrappers
-	 * @param feature
-	 * @param values
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public static void fill(Collection wrappers, EStructuralFeature feature,
-			Collection values, Object owner, AdapterFactory adapterFactory) {
-		for (Iterator iter = wrappers.iterator(); iter.hasNext();) {
-			FeatureValueWrapperItemProvider wrapper = (FeatureValueWrapperItemProvider) iter
-					.next();
-			if (!values.remove(wrapper.getValue())) {
-				iter.remove();
-				wrapper.dispose();
-			}
-		}
-		for (Iterator iter = values.iterator(); iter.hasNext();) {
-			wrappers.add(new FeatureValueWrapperItemProvider(feature, iter
-					.next(), owner, adapterFactory));
-		}
-	}
-
-	public int compareTo(Object o) {
-		Object otherValue = ((IWrapperItemProvider) o).getValue();
-		if (!(value instanceof MethodElement)
-				|| !(otherValue instanceof MethodElement))
-			return 0;
-		return ((MethodElement) value).getName().compareTo(
-				((MethodElement) otherValue).getName());
-	}
-
-	public void fireNotifyChanged(Notification notification) {
-		super.fireNotifyChanged(notification);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IAdapterFactoryProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IAdapterFactoryProvider.java
deleted file mode 100644
index 2a353f7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IAdapterFactoryProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.1
- */
-public interface IAdapterFactoryProvider {
-	/**
-	 * Gets adapter factory for work breakdown structure.
-	 * 
-	 * @return
-	 */
-	AdapterFactory getWBSAdapterFactory();
-
-	/**
-	 * Gets adapter factory for team usage
-	 * 
-	 * @return
-	 */
-	AdapterFactory getTBSAdapterFactory();
-
-	/**
-	 * Gets adapter factory for work product usage
-	 * 
-	 * @return
-	 */
-	AdapterFactory getWPBSAdapterFactory();
-
-	/**
-	 * Gets adapter factory for consolidated view of the process.
-	 * 
-	 * @return
-	 */
-	AdapterFactory getCBSAdapterFactory();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ICachedChildrenItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ICachedChildrenItemProvider.java
deleted file mode 100644
index a1eeef3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ICachedChildrenItemProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.Collection;
-
-/**
- * This interface is implemented by break down element item providers that want
- * to mantain a list cached children.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface ICachedChildrenItemProvider {
-
-	/**
-	 * Gets the cached children.
-	 * 
-	 * @return a collection of cached children.
-	 */
-	public Collection getChildrenFromCache();
-
-	/**
-	 * Gets the cached rollup childen.
-	 * 
-	 * @return a collection of cached rollup children.
-	 */
-	public Collection getRollupChildrenFromCache();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ICommandListener.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ICommandListener.java
deleted file mode 100644
index 7247bb8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ICommandListener.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.emf.common.command.Command;
-
-/**
- * This interface is used by commands that want to notify their listeners of
- * certain events.
- * 
- * @author Phong Nguyen Le
- * @author skannoor
- * @since 1.0
- */
-public interface ICommandListener {
-	/**
-	 * Receives notification prior to the execution the given command
-	 * @param command
-	 */
-	public void preExecute(Command command);
-
-	/**
-	 * Receives notification that a command has been executed.
-	 * 
-	 * @param command
-	 *            a command
-	 */
-	public void notifyExecuted(Command command);
-
-	/**
-	 * Receives notification prior to the undo of the given command
-	 * 
-	 * @param command
-	 *            an undo command
-	 */
-	public void preUndo(Command command);
-
-	
-	/**
-	 * Receives notification after undo
-	 */
-	
-	public void postUndo(Command command);
-	/**
-	 * Gets the command class.
-	 * 
-	 * @return a command class.
-	 */
-	public Class getCommandType();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurable.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurable.java
deleted file mode 100644
index 3f8b6dc..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurable.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-/**
- * This interface is used by item providers that can be configured to display a
- * filtered list of children and have their default label overwritten at
- * runtime.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IConfigurable {
-
-	/**
-	 * Sets the filter that is used to filter this object's children.
-	 * 
-	 * @param filter
-	 *            an <code>IFilter</code> object
-	 * @see IFilter
-	 */
-	void setFilter(IFilter filter);
-
-	/**
-	 * Sets the label for this object.
-	 * 
-	 * @param a
-	 *            string label
-	 */
-	void setLabel(String label);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurationApplicator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurationApplicator.java
deleted file mode 100644
index 4dbef29..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurationApplicator.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * This interface is used by to obtain and resolve method element attributes and
- * references in a method configuration.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public interface IConfigurationApplicator {
-
-	/**
-	 * Gets the attribute value of a variability element in a method
-	 * configuration.
-	 * 
-	 * @param ve
-	 *            a variability element
-	 * @param attr
-	 *            an attribute
-	 * @param config
-	 *            a method configuration
-	 * @return the value of the attribute derived from the method configuration
-	 *         closure
-	 */
-	public Object getAttribute(VariabilityElement ve, EAttribute attr,
-			MethodConfiguration config);
-
-	/**
-	 * Gets the attribute value of a content description in a method
-	 * configuration.
-	 * 
-	 * @param desc
-	 *            a content description
-	 * @param owner
-	 *            the owner of the content description
-	 * @param attr
-	 *            an attribute of the content description
-	 * @param config
-	 *            a method configuration
-	 * @return the value of the reference derived from the method configuration
-	 *         closure
-	 */
-	public Object getAttribute(ContentDescription desc, DescribableElement owner,
-			EAttribute attr, MethodConfiguration config);
-
-	/**
-	 * Gets the reference value of a variability element in a method
-	 * configuration.
-	 * 
-	 * @param ve
-	 *            a variability element
-	 * @param ref
-	 *            a reference representation
-	 * @param config
-	 *            a method configuration
-	 * @return the value of the reference derived from the method configuration
-	 *         closure
-	 */
-	public Object getReference(VariabilityElement ve, EReference ref,
-			MethodConfiguration config);
-
-	/**
-	 * Gets the reference value of a content description in a method
-	 * configuration.
-	 * 
-	 * @param desc
-	 *            a content description
-	 * @param owner
-	 *            the owner of the content description
-	 * @param ref
-	 *            a reference representation
-	 * @param config
-	 *            a method configuration
-	 * @return the value of the reference derived from the method configuration
-	 *         closure
-	 */
-	public Object getReference(ContentDescription desc, DescribableElement owner,
-			EReference ref, MethodConfiguration config);
-
-	/**
-	 * Gets the reference value of a method element opposite feature in a method
-	 * configuration.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @param feature
-	 *            an opposite feature
-	 * @param config
-	 *            a method configuration
-	 * @return the value of the reference derived from the method configuration
-	 *         closure
-	 */
-	public Object getReference(MethodElement element, OppositeFeature feature,
-			MethodConfiguration config);
-
-	/**
-	 * Resolves the given object using the given method configuration.
-	 * 
-	 * @param object
-	 *            a method element
-	 * @param config
-	 *            a method configuration
-	 * @return the resolved method element derived from the method configuration
-	 *         closure
-	 */
-	Object resolve(Object object, MethodConfiguration config);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurator.java
deleted file mode 100644
index f8d385f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfigurator.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * This interface is used by item providers and commands that want to filter
- * down related method elements in a method configuration.
- * 
- * @author Phong Nguyen Le
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface IConfigurator extends IMethodConfigurationProvider, IFilter, Adapter {
-
-	void setMethodConfiguration(MethodConfiguration config);
-
-	/**
-	 * If this method return a non-NULL, the item provider will use the returned
-	 * collection as children in place of its default chilren.
-	 * 
-	 * @param obj
-	 * @param childFeature
-	 * @return
-	 */
-	Collection getChildren(Object obj, EStructuralFeature childFeature);
-
-	/**
-	 * Resolves this object according to variability rules.
-	 * 
-	 * @param object
-	 * @return resolved object that is either the object itself, or its replacer
-	 *         depending on the variability of this object in the configuration.
-	 */
-	Object resolve(Object object);
-
-	/**
-	 * Gets variability information for the given VariabilityElement calculated
-	 * based on the configuration of this configurator and according to the
-	 * variability rules.
-	 * 
-	 * @param ve
-	 * @return
-	 * @see VariabilityInfo
-	 */
-	VariabilityInfo getVariabilityInfo(VariabilityElement ve);
-	
-	/**
-	 * get filter for uncategorized tasks
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getUncategorizedTaskFilter();
-	
-	/**
-	 * get filter for workproducts without a domain
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getDomainUncategorizedWorkProductFilter();
-	
-	/**
-	 * get filter for workproducts without a WP Type
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getWpTypeUncategorizedWorkProductFilter();
-	
-	/**
-	 * get filter for uncategorized roles
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getUncategorizedRoleFilter();
-
-	/**
-	 * get filter for uncategorized tool mentors
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getUncategorizedToolMentorFilter();
-	
-	/**
-	 * get filter for disciplines and displine groupings
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getDisciplinesFilter();
-	
-	/**
-	 * get filter for rolesets and roleset groupings
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getRoleSetsFilter();
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfiguratorFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfiguratorFactory.java
deleted file mode 100644
index ebcb98a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IConfiguratorFactory.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * The interface for a configuration filter factory.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IConfiguratorFactory {
-
-	/**
-	 * Creates a configuration filter.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 * @return a configuration filter.
-	 */
-	IConfigurator createConfigurator(MethodConfiguration config);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IDefaultNameSetter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IDefaultNameSetter.java
deleted file mode 100644
index 5ef0a7c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IDefaultNameSetter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-/**
- * This interface is used by item providers that want to assign a default name
- * for each newly created method element.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IDefaultNameSetter {
-
-	/**
-	 * Sets the default name for the given method element.
-	 * 
-	 * @param obj
-	 *            a method element
-	 */
-	public void setDefaultName(Object obj);
-
-	/**
-	 * Gets the ID of the feature that contains method elements whose default
-	 * name set through this interface.
-	 * 
-	 * @return the ID of a feature
-	 */
-	public int getInterestedFeatureID();
-
-	/**
-	 * Gets the owner class of the feature that contains method elements whose
-	 * default name set through this interface.
-	 * 
-	 * @return the owner class of a feature
-	 */
-	public Class getInterestedFeatureOwnerClass();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IFilter.java
deleted file mode 100644
index 9f92a08..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IFilter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-/**
- * A generic filter that uses the visitor design pattern.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IFilter {
-
-	/**
-	 * Checks whether a given object can be accepted by this filter.
-	 * 
-	 * @param obj
-	 *            the visiting object
-	 * @return <code>true</code> if the object is accepted, <code>false</code>
-	 *         otherwise
-	 */
-	boolean accept(Object obj);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IGroupContainer.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IGroupContainer.java
deleted file mode 100644
index d020540..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IGroupContainer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-/**
- * This interface is used by item providers that want to let clients access its
- * {@link org.eclipse.epf.library.edit.TransientGroupItemProvider <em>group item providers</em>}
- * by name.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IGroupContainer {
-
-	/**
-	 * Gets the group item provider with the given name.
-	 * 
-	 * @param name
-	 *            the name of the group item provider
-	 * @return a <code>TransientGroupItemProvider<code> object
-	 */
-	Object getGroupItemProvider(String name);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ILibraryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ILibraryItemProvider.java
deleted file mode 100644
index fe2a53a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ILibraryItemProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.Collection;
-
-/**
- * This interface is used by item providers that want to include UI folders
- * and feature derived children. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface ILibraryItemProvider {
-
-	/**
-	 * Sets the parent of this item provider.
-	 * 
-	 * @param parent
-	 *            a parent object, typically a method element
-	 */
-	void setParent(Object parent);
-
-	/**
-	 * Gets the children features.
-	 * 
-	 * @param object
-	 *            a method element
-	 * @return a collection of features for retrieving the child elements
-	 */
-	Collection getChildrenFeatures(Object object);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IMethodConfigurationProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IMethodConfigurationProvider.java
deleted file mode 100644
index dc98e07..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IMethodConfigurationProvider.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public interface IMethodConfigurationProvider {
-	MethodConfiguration getMethodConfiguration();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IPluginUIPackageContextChangedListener.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IPluginUIPackageContextChangedListener.java
deleted file mode 100644
index a8a2862..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IPluginUIPackageContextChangedListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-public interface IPluginUIPackageContextChangedListener {
-
-	/**
-	 * Called when Plugin Package presentation changed.
-	 * @param isFlat if <code>true</code>, layout is now flat mode. if <code>false</code>,
-	 * layout is hierarchical.
-	 */
-	void layoutChanged(boolean isFlat);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IReferencer.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IReferencer.java
deleted file mode 100644
index c2e942c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IReferencer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-/**
- * This interface is used by adapter factories for cleaning up references to
- * unused item providers.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IReferencer {
-
-	/**
-	 * Removes the given reference to an item provider.
-	 * 
-	 * @param ref
-	 *            a reference to an item provider
-	 * @return <code>true</code> if the reference is successfully removed
-	 */
-	public boolean remove(Object ref);
-
-	/**
-	 * Cleans up all unused references.
-	 */
-	public void cleanUp();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IStatefulItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IStatefulItemProvider.java
deleted file mode 100644
index 5232ce3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IStatefulItemProvider.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.emf.edit.provider.IDisposable;
-
-/**
- * This interface is implemented by statefult item providers that need to be
- * disposed after they are no longer used.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IStatefulItemProvider extends IDisposable {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapper.java
deleted file mode 100644
index 96d6595..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapper.java
+++ /dev/null
@@ -1,25 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IWrapper {
-
-	Object wrap(EObject object, EStructuralFeature feature, Object value,
-			int index);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapperItemProviderFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapperItemProviderFactory.java
deleted file mode 100644
index fc3ff1d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapperItemProviderFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-
-/**
- * Factory to create {@link IWrapperItemProvider}
- * 
- * @author Phong Nguyen Le - Aug 2, 2006
- * @since  1.0
- */
-public interface IWrapperItemProviderFactory {
-	/**
-	 * Creates wrapper of given value for the given owner
-	 * 
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 * @return
-	 */
-	IWrapperItemProvider createWrapper(Object value,
-			Object owner, AdapterFactory adapterFactory);
-
-	/**
-	 * 
-	 * @param value
-	 * @param owner
-	 * @param feature
-	 * @param index The index at which the value is located. If feature is non-null, this index is within that feature.
-	 * @param adapterFactory
-	 * @return
-	 */
-	IWrapperItemProvider createWrapper(Object value,
-			Object owner, EStructuralFeature feature, int index,
-			AdapterFactory adapterFactory);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapperItemProviderFactoryProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapperItemProviderFactoryProvider.java
deleted file mode 100644
index a63da6e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/IWrapperItemProviderFactoryProvider.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-/**
- * @author Phong Nguyen Le - Aug 2, 2006
- * @since  1.0
- */
-public interface IWrapperItemProviderFactoryProvider {
-	IWrapperItemProviderFactory getWrapperItemProviderFactory();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditPlugin.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditPlugin.java
deleted file mode 100644
index 8a372ac..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditPlugin.java
+++ /dev/null
@@ -1,130 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.epf.common.AbstractActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Library Edit plug-in class.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryEditPlugin extends AbstractActivator {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.library.edit"; //$NON-NLS-1$
-	
-	// The shared plug-in instance.
-	private static LibraryEditPlugin plugin;
-
-	public static LibraryEditPlugin INSTANCE;
-
-	// The shared image hash map.
-	protected Map<String, Object> images = new HashMap<String, Object>();
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryEditPlugin() {
-		super();
-		plugin = this;
-		INSTANCE = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static LibraryEditPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static LibraryEditPlugin getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the symbolic name of this plug-in.
-	 * 
-	 * @return The symbolic name of this plug-in.
-	 */
-	public String getSymbolicName() {
-		return getId();
-	}
-
-	public Object getImage(String key) {
-	    Object result = images.get(key);
-		if (result == null) {
-			try {
-				result = doGetImage(key);
-			} catch (Exception exception) {
-				throw new WrappedException(exception);
-			}
-			if(result != null) {
-				images.put(key, result);
-			}
-		}
-
-		return result;
-	}
-	
-	private Object doGetImage(String key) throws IOException {
-	    URL url = new URL(iconURL + key + ".gif"); //$NON-NLS-1$
-	    InputStream inputStream = url.openStream(); 
-	    inputStream.close();
-	    return url;
-	}
-
-	/**
-	 * Returns the shared image given the URI.
-	 * 
-	 * @param imageURI
-	 *            The image's URI.
-	 * @return The image.
-	 */
-	public Object getSharedImage(URI imageURI) {
-		try {
-			return imageURI.toURL();
-		} catch (MalformedURLException e) {
-			return null;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditResources.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditResources.java
deleted file mode 100644
index 9e71956..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditResources.java
+++ /dev/null
@@ -1,422 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Library Edit message resource bundle accessor class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class LibraryEditResources extends NLS {
-
-	private static String BUNDLE_NAME = LibraryEditResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	public static String activity_variability_error_msg;
-
-	public static String activity_variability_error_msg1;
-
-	public static String activity_variability_error_msg2;
-
-	public static String cannot_copy_or_extend_delivery_process;
-
-	public static String confirmDescriptorsDeletion_msg;
-
-	public static String confirmDescriptorsDeletion_title;
-
-	public static String savingResources_msg;
-	
-	public static String variability_error_msg;
-	
-	public static String circular_dependency_error_msg;
-	
-	public static String variability_element_circular_loop_error_msg;
-	
-	public static String  replacing_ancestor_error_msg;
-
-	public static String activity_variability_error_msg3;
-
-	public static String apply_pattern_error_msg;
-
-	public static String apply_pattern_error_msg1;
-
-	public static String duplicateFeatureValue;
-
-	public static String selectDescriptorsToDelete_msg;
-	
-	public static String copyingActivities_msg;
-
-	public static String localReplacementAndDeepCopy_text;
-
-	public static String deepCopy_promptMsg;
-
-	public static String deepCopy_title;
-
-	public static String moveDialog_title;
-
-	public static String deleteDialog_title;
-
-	public static String errorDialog_title;
-
-	public static String errorDialog_cannotRename;
-
-	public static String deleteReferencesDialog_title;
-
-	public static String deleteReferencesDialog_text;
-
-	public static String resolveNameConflictDialog_title;
-
-	public static String resolveNameConflictDialog_text;
-
-	public static String selectDeliverablesDialog_title;
-
-	public static String selectDeliverablesDialog_text;
-
-	public static String newProcessComponentDialog_title;
-
-	public static String nameLabel_text;
-
-	public static String defaultConfigLabel_text;
-
-	public static String baseProcessLabel_text;
-
-	public static String basedOnProcessesLabel_text;
-
-	public static String selectAssociationLabel_text;
-
-	public static String removeAssociationDialog_text;
-
-	public static String selectTeamsDialog_title;
-
-	public static String selectTeamsDialog_text;
-
-	public static String taskSelectionDialog_title;
-
-	public static String titleLabel_text;
-
-	public static String emptyElementNameError_msg;
-
-	public static String emptyElementNameError_simple_msg;
-
-	public static String duplicateElementNameError_msg;
-	public static String duplicateElementNameError_msg2;
-	
-	public static String duplicateElementNameError_simple_msg;
-
-	public static String invalidElementNameError1_msg;
-
-	public static String invalidElementNameError2_msg;
-
-	public static String invalidElementNameError3_msg;
-	
-	public static String invalidElementNameError4_msg;
-	
-	public static String invalidPluginNameError_msg;
-	
-	public static String filePathNameTooLong_msg;
-	
-	public static String noConfigError_msg;
-
-	public static String noDeliveryProcessError_msg;
-
-	public static String noDefaultConfigError_msg;
-
-	public static String noBaseProcessError_msg;
-
-	public static String createProcessError_msg;
-
-	public static String createElementError_msg;
-
-	public static String deleteElementError_msg;
-
-	public static String duplicateContentFileError_msg;
-
-	public static String duplicateContentFileError_simple_msg;
-
-	public static String undoCommandError_msg;
-
-	public static String invalidPredecessorError_msg;
-
-	public static String update_outofsynch_msg;
-
-	public static String update_outofsynch_title;
-
-	public static String UserInteractionHelper_errRelationshipExists;
-
-	public static String error_msgWithDetails;
-
-	public static String error_msg;
-
-	public static String Suppression_nameDuplication;
-
-	public static String Suppression_presentationNameDuplication;
-
-	public static String error_reason;
-
-	public static String saveProcessError_reason;
-
-	public static String deleteReferencesError_reason;
-
-	public static String saveFileError_reason;
-
-	public static String invalidReferencesError_reason;
-
-	public static String unresolvedObjectError_reason;
-
-	public static String MethodElementAddCommand_originalNotFoundWarning_msg;
-
-	public static String ActivityAddCommand_originalNotFoundWarning_msg;
-
-	public static String ActivityDropCommand_deepCopy_promptConfigurationMsg;
-
-	public static String creatingProcessComponentTask_name;
-
-	public static String processingReferencesTask_name;
-
-	public static String deletingElementsTask_name;
-
-	public static String checkingReferencesTask_name;
-
-	public static String removingReferencestask_name;
-
-	public static String savingModifiedFilesTask_name;
-
-	public static String checkAffectedResourcesTask_name;
-
-	public static String movingTask_name;
-
-	public static String movingFilesTask_name;
-
-	public static String copyingResourcesTask_name;
-
-	public static String savingFileTask_name;
-
-	public static String element_text;
-
-	public static String createElement_text;
-
-	public static String createProcess_text;
-
-	public static String contributesTo_text;
-
-	public static String localContributesTo_text;
-
-	public static String extends_text;
-
-	public static String replaces_text;
-	
-	public static String extends_replaces_text;
-
-	public static String localReplaces_text;
-
-	public static String elementType_text;
-
-	public static String deliverables_text;
-
-	public static String contributeToActivity_text;
-
-	public static String ActivityDropCommand_label;
-
-	public static String replaceActivity_text;
-
-	public static String file_text;
-
-	public static String directory_text;
-
-	public static String unresolved_text;
-
-	public static String assists_text;
-
-	public static String unknown_text;
-
-	public static String command_done;
-
-	public static String Util_labelpath_variabilitywithplugin_info;
-
-	public static String Util_labelpath_variability_info;
-
-	public static String ui_ref_delete;
-
-	public static String ui_ref_delete2;
-
-	public static String ui_references;
-
-	public static String ui_workproduct_descriptor_description;
-
-	public static String ui_workproductdescriptor_options;
-
-	public static String ui_workproductdescriptor_outputlabel;
-
-	public static String ui_workproductdescriptor_delete_task;
-
-	public static String ui_UserInteractionHelper_defaultconfigcheck;
-
-	public static String ui_UserInteractionHelper_genericErr_message_text;
-
-	public static String ProcessAutoSynchronizeAction_noDescriptorToSynch;
-
-	public static String util_configurablecomposedadapter_refershingviewer;
-
-	public static String confirm_remove_references_text;
-
-	public static String util_configurablecomposedadapter_unhandled_exception;
-
-	public static String util_ProcessUtil_err_same_breakdown_element;
-
-	public static String ui_UserInteractionHelper_wplistdlg_msg;
-
-	public static String ui_UserInteractionHelper_rolelistdlg_msg;
-
-	public static String util_configurablecomposedadapter_fatalerr;
-
-	public static String ui_UserInteractionHelper_workproducts;
-
-	public static String util_ProcessUtil_err_same_sub_element;
-
-	public static String util_ProcessUtil_err_wrong_element;
-
-	public static String util_ProcessUtil_err_child_element;
-
-	public static String ui_UserInteractionHelper_tasks;
-
-	public static String ui_association_task_selection;
-
-	public static String util_ProcessUtil_childadapter;
-
-	public static String util_ProcessUtil_err_setparent;
-
-	public static String util_tngutil_cannot_edit_resource;
-
-	public static String util_ProcessUtil_contributesto;
-
-	public static String util_ProcessUtil_localContributesto;
-
-	public static String process_extends;
-
-	public static String process_replaces;
-
-	public static String process_localReplaces;
-
-	public static String FilterConstants_disciplines_text;
-
-	public static String FilterConstants_disciplinegroupings_text;
-
-	public static String FilterConstants_whitepapers_text;
-
-	public static String FilterConstants_toolmentors_text;
-
-	public static String FilterConstants_tools_text;
-
-	public static String FilterConstants_roles_text;
-
-	public static String FilterConstants_tasks_text;
-
-	public static String FilterConstants_reusableassets_text;
-
-	public static String FilterConstants_all_text;
-
-	public static String FilterConstants_processes_text;
-	
-	public static String FilterConstants_activities_text;
-
-	public static String FilterConstants_practices_text;
-
-	public static String FilterConstants_templates_text;
-
-	public static String FilterConstants_workproducts_text;
-
-	public static String FilterConstants_checklists_text;
-
-	public static String FilterConstants_guidelines_text;
-
-	public static String FilterConstants_rolesets_text;
-
-	public static String FilterConstants_guidance_text;
-
-	public static String FilterConstants_concepts_text;
-
-	public static String FilterConstants_examples_text;
-
-	public static String FilterConstants_contentpackages_text;
-
-	public static String FilterConstants_roledescriptors_text;
-
-	public static String FilterConstants_rolesetgropuings_text;
-
-	public static String FilterConstants_taskdescriptors_text;
-
-	public static String FilterConstants_contentelements_text;
-
-	public static String ProcessAutoSynchronizeAction_prepare;
-
-	public static String FilterConstants_workproductdescriptors_text;
-
-	public static String FilterConstants_allcontentelements_text;
-
-	public static String FilterConstants_supportingmaterials_text;
-
-	public static String MethodElementAddCommand_errorSavingFiles;
-
-	public static String FilterConstants_customcategories_text;
-
-	public static String FilterConstants_workproducttypes_text;
-
-	public static String DeleteMethodElementCommand_warningMsg;
-
-	public static String FilterConstants_methodplugins_text;
-
-	public static String UserInteractionHelper_lockedPlugin;
-
-	public static String FilterConstants_domains_text;
-
-	public static String FilterConstants_roadmap_text;
-
-	public static String FilterConstants_reports_text;
-
-	public static String AutoSynchronizeCommand_label;
-
-	public static String ManualSynchronizeCommand_label;
-
-	public static String AutoSynchronizeCommand_sucessful;
-	
-	public static String SynchronizeCompleteDialog_Title;
-
-	public static String UserInteractionHelper_ProcessPackage_Name;
-
-	public static String newElement_text;
-	
-	public static String CreateProcessComponentCommand_Message;
-
-	public static String SortType_Label;
-
-	public static String SortType_Manual;
-
-	public static String SortType_Alphabetic;
-	
-	public static String SortType_ReverseAlphabetic;
-	
-	public static String SortType_MethodType;
-	
-	public static String SpecifyNameText;
-	
-	public static String WorkOrderTypeAbbreviation_FINISH_TO_START;
-	public static String WorkOrderTypeAbbreviation_FINISH_TO_FINISH;
-	public static String WorkOrderTypeAbbreviation_START_TO_FINISH;
-	public static String WorkOrderTypeAbbreviation_START_TO_START;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, LibraryEditResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/PluginUIPackageContext.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/PluginUIPackageContext.java
deleted file mode 100644
index 0ddb14b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/PluginUIPackageContext.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Stores (in memory only) the Flat/Hierarchical plugin-package layout
- * @author Jeff Hardy
- *
- */
-public class PluginUIPackageContext {
-	public static final PluginUIPackageContext INSTANCE = new PluginUIPackageContext(); 
-
-	private boolean isFlatLayout = false;
-	
-	private List<IPluginUIPackageContextChangedListener> listeners;
-
-	public static final String HIERARCHICAL_LAYOUT= "hierarchical"; //$NON-NLS-1$
-	public static final String FLAT_LAYOUT= "flat"; //$NON-NLS-1$
-
-	
-	public boolean isFlatLayout() {
-		return isFlatLayout;
-	}
-	
-	public void toggleLayout() {
-		isFlatLayout = !isFlatLayout;
-		notifyListeners();
-	}
-	
-	public String getLayoutAsString() {
-		if (isFlatLayout()) {
-			return FLAT_LAYOUT;
-		} else {
-			return HIERARCHICAL_LAYOUT;
-		}
-	}
-	
-	public void setLayoutHierarchical() {
-		isFlatLayout = false;
-		notifyListeners();
-	}
-
-	public void setLayoutFlat() {
-		isFlatLayout = true;
-		notifyListeners();
-	}
-	
-	public void addListener(IPluginUIPackageContextChangedListener listener) {
-		if (listeners == null) {
-			listeners = new ArrayList<IPluginUIPackageContextChangedListener>();
-		}
-		if (!listeners.contains(listener)) {
-			listeners.add(listener);
-		}
-	}
-	
-	public void removeListener(IPluginUIPackageContextChangedListener listener) {
-		if (listeners != null) {
-			if (listeners.contains(listener)) {
-				listeners.remove(listener);
-			}
-		}
-	}
-	
-	private void notifyListeners() {
-		if (listeners != null) {
-			for (Iterator<IPluginUIPackageContextChangedListener> iter = listeners.iterator();iter.hasNext();) {
-				IPluginUIPackageContextChangedListener listener = iter.next();
-				listener.layoutChanged(isFlatLayout);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/PresentationContext.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/PresentationContext.java
deleted file mode 100644
index 823f9b0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/PresentationContext.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.Comparator;
-
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.Comparators.TypeComparator;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * @author Phong Nguyen Le - Mar 7, 2006
- * @since  1.0
- */
-public class PresentationContext {
-	public static final PresentationContext INSTANCE = new PresentationContext(); 
-
-	private boolean showPresentationNames = false;
-	private Comparator comparator = Comparators.DEFAULT_COMPARATOR;
-	private Comparator reverseComparator = Comparators.REVERSE_DEFAULT_COMPARATOR;
-	private Comparator methodElementTypeComparator = Comparators.METHOD_TYPE_COMPARATOR;
-	
-	
-	private Comparator guidanceTypeComparator = new TypeComparator() {
-		/* (non-Javadoc)
-		 * @see org.eclipse.epf.library.edit.util.Comparators.TypeComparator#getDefaultComparator()
-		 */
-		protected Comparator getDefaultComparator() {
-			return comparator;
-		}
-
-		protected int getOrderId(Object obj) {
-			if (obj instanceof Guidance) {
-				int id = ((Guidance) obj).eClass().getClassifierID();
-				if (id == UmaPackage.TERM_DEFINITION) {
-					id = Integer.MAX_VALUE;
-				}
-				return id;
-			}
-			return -1;
-		}
-	};
-
-	private Comparator processPackageComparator = new TypeComparator() {
-		/* (non-Javadoc)
-		 * @see org.eclipse.epf.library.edit.util.Comparators.TypeComparator#getDefaultComparator()
-		 */
-		protected Comparator getDefaultComparator() {
-			return comparator;
-		}
-		
-		protected int getOrderId(Object obj) {
-			if (obj instanceof ProcessComponent) {
-				return Integer.MAX_VALUE;
-			} else if (obj instanceof ProcessPackage) {
-				return 0;
-			}
-			return -1;
-		}
-	};
-
-
-	
-	private PresentationContext() {
-		super();
-	}
-
-	public boolean isShowPresentationNames() {
-		return showPresentationNames;
-	}
-
-	public void setShowPresentationNames(boolean showPresentationNames) {
-		this.showPresentationNames = showPresentationNames;
-		comparator = showPresentationNames ? Comparators.PRESENTATION_NAME_COMPARATOR : Comparators.DEFAULT_COMPARATOR;
-		reverseComparator = showPresentationNames ? Comparators.REVERSE_PRESENTATION_NAME_COMPARATOR : Comparators.REVERSE_DEFAULT_COMPARATOR;
-		methodElementTypeComparator = showPresentationNames ? Comparators.METHOD_TYPE_PRES_NAME_COMPARATOR : Comparators.METHOD_TYPE_COMPARATOR;
-	}
-
-	public Comparator getComparator() {
-		return comparator;
-	}
-
-	public Comparator getReverseComparator() {
-		return reverseComparator;
-	}
-
-	public Comparator getGuidanceTypeComparator() {
-		return guidanceTypeComparator;
-	}
-
-	public Comparator getProcessPackageComparator() {
-		return processPackageComparator;
-	}
-	
-	public Comparator getMethodElementTypeComparator() {
-		return methodElementTypeComparator;
-	}
-	
-	public Comparator getPresNameComparator() {
-		return Comparators.PRESENTATION_NAME_COMPARATOR;
-	}
-
-	public Comparator getPresNameReverseComparator() {
-		return Comparators.REVERSE_PRESENTATION_NAME_COMPARATOR;
-	}
-	
-	public Comparator getPresNameMethodElementTypeComparator() {
-		return Comparators.METHOD_TYPE_PRES_NAME_COMPARATOR;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Providers.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Providers.java
deleted file mode 100644
index ce110f4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Providers.java
+++ /dev/null
@@ -1,147 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.osgi.framework.Bundle;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class Providers {
-
-	private static IConfiguratorFactory configuratorFactory;
-
-	private static IConfigurationApplicator configurationApplicator;
-
-	private static IPreferenceStoreWrapper preferenceStore;
-
-	private static IPreferenceStoreWrapper authoringPluginPreferenceStore;
-
-	private static Map commandTypeToListenersMap = new HashMap();
-
-	private Providers() {
-		super();
-	}
-
-	public static IConfiguratorFactory getConfiguratorFactory() {
-		return configuratorFactory;
-	}
-
-	public static void setConfiguratorFactory(
-			IConfiguratorFactory configuratorFactory) {
-		Providers.configuratorFactory = configuratorFactory;
-	}
-
-	public static IConfigurationApplicator getConfigurationApplicator() {
-		return configurationApplicator;
-	}
-
-	public static void setConfigurationApplicator(
-			IConfigurationApplicator configurationApplicator) {
-		Providers.configurationApplicator = configurationApplicator;
-	}
-
-	public static IPreferenceStoreWrapper getPreferenceStore() {
-		return preferenceStore;
-	}
-
-	public static void setPreferenceStore(IPreferenceStoreWrapper preferenceStore) {
-		Providers.preferenceStore = preferenceStore;
-	}
-
-	public static IPreferenceStoreWrapper getAuthoringPluginPreferenceStore() {
-		return authoringPluginPreferenceStore;
-	}
-
-	public static void setAuthoringPluginPreferenceStore(IPreferenceStoreWrapper store) {
-		authoringPluginPreferenceStore = store;
-	}
-
-	public static void registerCommandListener(ICommandListener listener) {
-		List listeners = (List) commandTypeToListenersMap.get(listener
-				.getCommandType());
-		if (listeners == null) {
-			listeners = new ArrayList();
-			commandTypeToListenersMap.put(listener.getCommandType(), listeners);
-		} else if (listeners.contains(listener)) {
-			return;
-		}
-		listeners.add(listener);
-	}
-
-	public static void removeCommandListener(ICommandListener listener) {
-		List listeners = (List) commandTypeToListenersMap.get(listener
-				.getCommandType());
-		if (listeners != null) {
-			listeners.remove(listener);
-			if (listeners.isEmpty()) {
-				commandTypeToListenersMap.remove(listener.getCommandType());
-			}
-		}
-	}
-
-	public static List getCommandListeners(Class commandType) {
-		return (List) commandTypeToListenersMap.get(commandType);
-	}
-
-	static {
-		// register command listeners that have been contributed via extension point org.eclipse.epf.library.edit.commandListeners
-		//
-		try {
-			String namespace = LibraryEditPlugin.getDefault().getId();
-			String extensionPointName = "commandListeners"; //$NON-NLS-1$
-			IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-			IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(namespace, extensionPointName);
-			if (extensionPoint != null) {
-				IExtension[] extensions = extensionPoint.getExtensions();
-				for (int i = 0; i < extensions.length; i++) {
-					IExtension extension = extensions[i];
-					String pluginId = extension.getNamespaceIdentifier();
-					Bundle bundle = Platform.getBundle(pluginId);
-					IConfigurationElement[] configElements = extension
-					.getConfigurationElements();
-					for (int j = 0; j < configElements.length; j++) {
-						IConfigurationElement configElement = configElements[j];
-						try {
-							String className = configElement.getAttribute("class"); //$NON-NLS-1$
-							if(className != null) {
-								Object ext = bundle.loadClass(className).newInstance();
-								if(ext instanceof ICommandListener) {
-									registerCommandListener((ICommandListener) ext);
-								}
-							}
-						} catch (Exception e) {
-							LibraryEditPlugin.INSTANCE.log(e);
-						}
-					}
-				}
-			}
-		}
-		catch(Exception e) {
-			LibraryEditPlugin.getDefault().getLogger().logError(e);
-		}
-
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Resources.properties b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Resources.properties
deleted file mode 100644
index 56ba5fd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Resources.properties
+++ /dev/null
@@ -1,250 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Generic Dialog Titles
-moveDialog_title=Move
-deleteDialog_title=Delete Element
-errorDialog_title=Error
-errorDialog_cannotRename=Cannot rename {0} ''{1}'' to ''{2}''. Resolve the issue shown in Details and click OK to continue or Cancel to abort this operation.
-
-# Confirm References Removal Dialog
-deleteReferencesDialog_title=Confirm References Removal
-deleteReferencesDialog_text=The element(s) you are about to delete are still being referenced by other elements in the method library. Deleting these elements will remove references to them, therefore, will update the referring elements as well.  Make sure you have permission to update the referring elements before clicking OK.  Click Details to review the list of elements that reference the element(s) that you are about to delete.
-
-# Resolve Name Conflict Dialog
-resolveNameConflictDialog_title=Resolve Element Name Conflict
-resolveNameConflictDialog_text=Enter a new {0} for ''{1}'':
-
-# Select Deliverables Dialog
-selectDeliverablesDialog_title=Select Deliverables
-selectDeliverablesDialog_text=Select a deliverable where you want work product ''{0}'' to be assigned.
-
-# New Process Component Dialog
-newProcessComponentDialog_title=New Process Component
-nameLabel_text=Name:
-defaultConfigLabel_text=Default Configuration:
-baseProcessLabel_text=Base Process:
-basedOnProcessesLabel_text=Based on Processes:
-SpecifyNameText=Specify a valid name.
-
-# Role Association Dialog
-selectAssociationLabel_text=Select association for the task ''{0}''
-
-# Remove Association dialog
-removeAssociationDialog_text=Remove Association
-
-# Select Teams Dialog
-selectTeamsDialog_title=Select Teams
-selectTeamsDialog_text=Select a team where you want a role ''{0}'' to be assigned.
-
-# Task Selection Dialog
-taskSelectionDialog_title=Task Selection
-titleLabel_text=Select tasks..
-
-# Error Messages
-emptyElementNameError_msg=IUPL0100E: The {0} name is missing.\nAll method and process elements must have a name.\nEnter a valid name and try again.
-emptyElementNameError_simple_msg=The name cannot be empty. Please specify a valid name.
-duplicateElementNameError_msg=IUPL0101E: The name ''{0}'' already exists.\nA method element must have a unique name.\nEnter a different name and try again.
-duplicateElementNameError_msg2=Enter a different name and try again.
-duplicateElementNameError_simple_msg=The name already exists. Please specify another name.
-invalidElementNameError1_msg=IUPL0102E: The name ''{0}'' is invalid.\nA method element name cannot start with a space.\nEnter a valid name and try again.
-invalidElementNameError2_msg=IUPL0103E: The name ''{0}'' is invalid.\nA method element name cannot end with a period.\nEnter a valid name and try again.
-invalidElementNameError3_msg=IUPL0104E: The name ''{0}'' is invalid.\nA method element name cannot contain these characters: \\ / : * ? " < > ; |\nEnter a valid name and try again.
-invalidElementNameError4_msg=IUPL0105E: The name ''{0}'' is invalid.\nA method element name cannot contain the character: &\nEnter a valid name and try again.
-invalidPluginNameError_msg=IUPL0121E: The name ''{0}'' is invalid.\nA method plug-in''s name cannot contain these characters: \\ / : * ? " < > ; | # % ''\nEnter a valid name and try again.
-filePathNameTooLong_msg=File path name too long (exceeding ''{0}'') 
-noConfigError_msg=The current method library does not contain any method configuration.\nA method configuration is needed to create a new process.\nCreate a method configuration and try again.
-noDeliveryProcessError_msg=IUPL0106E: The current method library does not contain any delivery processes.\nA base delivery process is needed to create a new process contribution.\nCreate a delivery process and try again.
-noDefaultConfigError_msg=IUPL0107E: No method configuration has been selected.\nA default method configuration must be assigned to the new process.\nSelect a method configuration and try again.
-noBaseProcessError_msg=IUPL0108E: No delivery process has been selected.\nA process contribution requires a base delivery process.\nSelect a delivery process and try again.
-createProcessError_msg=IUPL0109E: The process cannot be created successfully.
-createElementError_msg=IUPL0110E: The element cannot be created successfully.
-deleteElementError_msg=IUPL0111E: The element cannot be deleted successfully.
-duplicateContentFileError_msg=IUPL0112E: The content file for the element cannot be created or renamed to match the element name.\n\nA file ''{0}'' already exists.\n\nEnter a different name and try again.
-duplicateContentFileError_simple_msg=A content file with the same name exits. Please specify another name.
-undoCommandError_msg=IUPL0113E: The undo command ''{0}'' cannot be completed.\n\nAn error has occurred: {1}
-invalidPredecessorError_msg=IUPL0114E: The specified predecessor index is invalid.\n\nA predecessor index must be an integer value from the 'Index' column.\n\nSpecify a valid value and try again.
-UserInteractionHelper_errRelationshipExists=IUPL0100W: ''{0}'' is already associated to ''{1}''.  Only one association of this kind is allowed.  To assign ''{0}'' to ''{2}'' you need to first remove it from ''{1}''.
-error_msgWithDetails=IUPL0116E: An error has occurred. Click Details for more information.
-error_msg=IUPL0117E: An error has occurred. See error log for more details.
-Suppression_nameDuplication=IUPL0118E: Name conflict will occur after this operation. Check element's name for duplication and try again
-Suppression_presentationNameDuplication=IUPL0119E: Name conflict will occur after this operation. Check element's presentation name for duplication and try again
-
-# Error Reasons
-error_reason=An error has occurred. Click Details for more information.
-saveProcessError_reason=An error has occurred while saving the process ''{0}''. Click Details for more information.
-deleteReferencesError_reason=An error has occurred while removing references associated with this element. Click Details for more information.
-saveFileError_reason=An error has occurred while saving the file ''{0}''. Click Details for more information.
-invalidReferencesError_reason=Detected method elements with invalid references as a result of cross plug-in copy.\nThese references will be removed. Do you want to continue?
-unresolvedObjectError_reason=Cannot modify an unresolved object: {0}(URI = {1}){2}
-
-# Warning messages
-MethodElementAddCommand_originalNotFoundWarning_msg=IUPL0118W: Could not find one or more source elements. Associated files in the resources folder will not be copied.
-ActivityAddCommand_originalNotFoundWarning_msg=IUPL0119W: Could not find one or more source elements. Associated Process Packages will not be copied.
-ActivityDropCommand_deepCopy_promptConfigurationMsg=Do you want to copy all descriptors?\n\nClicking on No will copy only the descriptors that are part of the current configuration.
-deepCopy_promptMsg=You will get a copy of all dynamically linked elements that you need to maintain separately from now on. Do you want to continue?
-deepCopy_title=Deep Copy
-
-# Progress messages
-creatingProcessComponentTask_name=Creating process component ''{0}''...
-processingReferencesTask_name=Processing references...
-deletingElementsTask_name=Deleting elements and associated files...
-checkingReferencesTask_name=Checking for references...
-removingReferencestask_name=Removing references...
-savingModifiedFilesTask_name=Saving modified file(s)...
-checkAffectedResourcesTask_name=Checking affected resources...
-movingTask_name=Moving...
-movingFilesTask_name=Moving files...
-copyingResourcesTask_name=Copying resources...
-copyingActivities_msg=Copying activity ''{0}''
-savingFileTask_name=Saving file ''{0}''...
-savingResources_msg=Saving resources
-
-# UI Text
-element_text=element
-createElement_text=Create Element
-createProcess_text=Create Process
-contributesTo_text=Contributes to
-localContributesTo_text=Locally Contributes to
-extends_text=Extends
-replaces_text=Replaces
-extends_replaces_text=Extends and Replaces
-localReplaces_text=Locally Replaces
-localReplacementAndDeepCopy_text=Local Replacement and Deep Cop&y
-elementType_text={0}: {1}
-deliverables_text=Deliverables
-contributeToActivity_text=Contribute To Activity
-ActivityDropCommand_label=Drop Activity
-replaceActivity_text=Replace Activity
-file_text=file
-directory_text=directory
-unresolved_text=(unresolved ''{0}'')
-assists_text=Assists
-unknown_text=Unknown
-command_done=Done
-
-# The following UI text should be reviewed.
-Util_labelpath_variabilitywithplugin_info={0} ({1} ''{2}'' in ''{3}'')
-Util_labelpath_variability_info={0} ({1} ''{2}'')
-ui_ref_delete=The descriptor ''{0}'' has the following references which are not used anywhere.\nSelect the ones which you would like to delete:
-ui_ref_delete2=These following references are not being used anywhere.\nSelect the ones which you would like to delete:
-ui_references=References
-ui_workproduct_descriptor_description=Work product descriptor ''{0}'' is associated (Output From) with task descriptor ''{1}''
-ui_workproductdescriptor_options=Options
-ui_workproductdescriptor_outputlabel=Remove work product descriptor as output of the task descriptor
-ui_workproductdescriptor_delete_task=Delete task descriptor from the activity
-ui_UserInteractionHelper_defaultconfigcheck=The selected element ''{0}'' is not in the default configuration of your process.\nDo you want to add it and its dependencies to the default configuration?
-ui_UserInteractionHelper_genericErr_message_text=Errors occurred in the operation. Click on details for more information
-ProcessAutoSynchronizeAction_noDescriptorToSynch=No descriptor with linked method element found to synchronize
-util_configurablecomposedadapter_refershingviewer=Error refreshing viewer
-confirm_remove_references_text=Element(s) listed in Details might have illegal references to this guidance after conversion. Click OK to remove them and continue.
-confirmDescriptorsDeletion_title=Confirm Descriptors Deletion
-confirmDescriptorsDeletion_msg=The element(s) you are about to delete are still being referenced by descriptors in the method library.  Click Yes if you want to delete these descriptors as well.  Make sure you have permission to delete the descriptors before clicking Yes.  Click Details to review the list of descriptors that reference the element(s) that you are about to delete.
-util_configurablecomposedadapter_unhandled_exception=Unhandled exception
-util_ProcessUtil_err_same_breakdown_element=Cannot have the same breakdown element as predecessor and successor
-ui_UserInteractionHelper_wplistdlg_msg=The work product ''{0}'' is an output to the following tasks.\nSelect the tasks for which you would like to create the corresponding descriptors.
-ui_UserInteractionHelper_rolelistdlg_msg=The role ''{0}'' has the following responsible work products.\nSelect the work products for which you would like to create the corresponding descriptors.
-util_configurablecomposedadapter_fatalerr=Fatal error
-ui_UserInteractionHelper_workproducts=Work Products
-util_ProcessUtil_err_same_sub_element=Cannot link a breakdown element to one of its sub-element.
-util_ProcessUtil_err_wrong_element=Cannot link to element other than work breakdown element.
-util_ProcessUtil_err_child_element=Cannot link a breakdown element to one of its children.
-ui_UserInteractionHelper_tasks=Tasks
-ui_association_task_selection=Task Selection...
-util_ProcessUtil_childadapter=\ \ child's adapter:
-
-util_ProcessUtil_err_setparent=Could not set parent for child
-util_tngutil_cannot_edit_resource=Cannot edit resource.
-util_ProcessUtil_contributesto=contributes to ''{0}''
-util_ProcessUtil_localContributesto=locally contributes to ''{0}''
-process_extends=extends ''{0}''
-process_replaces=replaces ''{0}''
-process_localReplaces=locally replaces ''{0}''
-# Filter constants externalized strings.
-FilterConstants_disciplines_text=Disciplines
-FilterConstants_disciplinegroupings_text=Discipline Groupings
-FilterConstants_whitepapers_text=Whitepapers
-FilterConstants_toolmentors_text=Tool Mentors
-FilterConstants_tools_text=Tools
-FilterConstants_roles_text=Roles
-FilterConstants_tasks_text=Tasks
-FilterConstants_reusableassets_text=Reusable Assets
-FilterConstants_all_text=All
-FilterConstants_processes_text=Processes
-FilterConstants_activities_text=Activities
-FilterConstants_practices_text=Practices
-FilterConstants_templates_text=Templates
-FilterConstants_workproducts_text=Work Products
-FilterConstants_checklists_text=Checklists
-FilterConstants_guidelines_text=Guidelines
-FilterConstants_rolesets_text=Role Sets
-FilterConstants_guidance_text=Guidance
-FilterConstants_concepts_text=Concepts
-FilterConstants_examples_text=Examples
-FilterConstants_contentpackages_text=Content Packages
-FilterConstants_roledescriptors_text=Role Descriptors
-FilterConstants_rolesetgropuings_text=Role Set Groupings
-FilterConstants_taskdescriptors_text=Task Descriptors
-FilterConstants_contentelements_text=Content Elements
-ProcessAutoSynchronizeAction_prepare=Preparing synchronization...
-FilterConstants_workproductdescriptors_text=Work Product Descriptors
-FilterConstants_allcontentelements_text=All Content Elements
-FilterConstants_supportingmaterials_text=Supporting Materials
-MethodElementAddCommand_errorSavingFiles=Error saving file(s)
-FilterConstants_customcategories_text=Custom Categories
-FilterConstants_workproducttypes_text=Work Product Kinds
-DeleteMethodElementCommand_warningMsg=Deletion completed with warning
-FilterConstants_methodplugins_text=Method Plug-ins
-UserInteractionHelper_lockedPlugin=IUPL0120E: The plug-in ''{0}'' is locked.
-FilterConstants_domains_text=Domains
-FilterConstants_roadmap_text=Roadmaps
-FilterConstants_reports_text=Reports
-AutoSynchronizeCommand_label=Default S&ynchronization from Method Content
-ManualSynchronizeCommand_label=Custom Synchroni&zation...
-SynchronizeCompleteDialog_Title=Synchronization Complete
-AutoSynchronizeCommand_sucessful=Synchronization has been completed successfully.
-selectDescriptorsToDelete_msg=The following descriptors are not used anywhere after deletion of the selected elements.\nSelect descriptors you want to delete.
-
-CreateProcessComponentCommand_Message=Specify name and default configuration for the {0} to be created.
-# UserInteractionHelper
-UserInteractionHelper_ProcessPackage_Name=Name:
-
-# MethodCreateChildCommand
-newElement_text=New {0}
-update_outofsynch_title=Update conflict
-update_outofsynch_msg=The file(s) has been changed on the file system. Do you want to overwrite the changes?
-duplicateFeatureValue=Cannot have 2 elements under ''{0}'' with the same value for ''{1}''
-apply_pattern_error_msg=Cannot apply activity ''{0}'' to the process ''{1}'' since it will result in circular dependency.
-apply_pattern_error_msg1=Cannot apply activity ''{0}'' to the process ''{1}'' since ''{0}'' already has one or more contributed/replaced activities as its children.
-activity_variability_error_msg1=Activity ''{0}'' cannot set variability with one of its direct parent.
-activity_variability_error_msg2=Activity ''{0}'' cannot set variability with ''{1}'' since it will result in circular dependency.
-activity_variability_error_msg3=Cannot replaces a top process with an activity.
-activity_variability_error_msg=Activity ''{0}'' cannot set variability with ''{1}'' since ''{1}'' already has one or more contributed/replaced activities as its children.
-variability_error_msg=Variability element ''{0}'' cannot set variability with ''{1}'' since it will result in circular dependency.
-circular_dependency_error_msg=Cannot perform the operation since it will result in circular dependency.
-
-# Validation messages
-variability_element_circular_loop_error_msg=Circular dependency loop detected ... 
-replacing_ancestor_error_msg=Replacing an ancestor error is detected.
-cannot_copy_or_extend_delivery_process=Cannot copy or extend a delivery process or any of its activities.
-
-# Sort options
-SortType_Label=Sort Type:
-SortType_Manual=Manual
-SortType_Alphabetic=Alphabetic
-SortType_ReverseAlphabetic=Reverse Alphabetic
-SortType_MethodType=Element Type
-
-WorkOrderTypeAbbreviation_FINISH_TO_START=FS
-WorkOrderTypeAbbreviation_FINISH_TO_FINISH=FF
-WorkOrderTypeAbbreviation_START_TO_FINISH=SF
-WorkOrderTypeAbbreviation_START_TO_START=SS
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/StructuredMethodPluginItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/StructuredMethodPluginItemProvider.java
deleted file mode 100644
index 9a2f005..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/StructuredMethodPluginItemProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.provider.MethodPluginItemProvider;
-
-/**
- * The item provider adapter for a structured method plug-in.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class StructuredMethodPluginItemProvider extends
-		MethodPluginItemProvider implements IGroupContainer,
-		IStatefulItemProvider {
-
-	protected Map groupItemProviderMap;
-
-	private ModelStructure modelStruct;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public StructuredMethodPluginItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public void setModelStructure(ModelStructure modelStruct) {
-		this.modelStruct = modelStruct;
-	}
-
-	public ModelStructure getModelStructure() {
-		return modelStruct;
-	}
-
-	public Object getGroupItemProvider(String name) {
-		if (groupItemProviderMap == null)
-			return null;
-		return groupItemProviderMap.get(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_MethodPlugin_type")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (groupItemProviderMap != null) {
-			for (Iterator iter = groupItemProviderMap.values().iterator(); iter
-					.hasNext();) {
-				Object adapter = iter.next();
-				if (adapter instanceof IDisposable) {
-					((IDisposable) adapter).dispose();
-				}
-			}
-			groupItemProviderMap.clear();
-			groupItemProviderMap = null;
-		}
-
-		super.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/TngAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/TngAdapterFactory.java
deleted file mode 100644
index 5bdadba..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/TngAdapterFactory.java
+++ /dev/null
@@ -1,227 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.epf.library.edit.internal.TngAdapterFactoryImpl;
-
-/**
- * The factory for all the adapter factories.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface TngAdapterFactory {
-
-	public static final TngAdapterFactory INSTANCE = new TngAdapterFactoryImpl();
-	
-	public static final AdapterFactory[] processAdapterFactories = {
-		INSTANCE.getWBS_ComposedAdapterFactory(),
-		INSTANCE.getOBS_ComposedAdapterFactory(),
-		INSTANCE.getPBS_ComposedAdapterFactory(),
-		INSTANCE.getProcessComposedAdapterFactory()
-	};
-
-	/**
-	 * Gets the composed adapter factory for the Library view.
-	 * 
-	 * @return the composed adapter factory for the Library view
-	 */
-	public ComposedAdapterFactory getNavigatorView_ComposedAdapterFactory();
-
-	/**
-	 * Gets the adapter factory for the Configuration view.
-	 * 
-	 * @param filter
-	 *            a method element filter
-	 * @return the adapter factory for the Configuration view
-	 */
-	public AdapterFactory getConfigurationView_AdapterFactory(IFilter filter);
-
-	/**
-	 * Creates a new adapter factory for the Work Breakdown Structure. Client is
-	 * responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the Work Breakdown Structure
-	 */
-	public ComposedAdapterFactory createWBSComposedAdapterFactory();
-
-	/**
-	 * Creates a new adapter factory for the Team Breakdown Structure. Client is
-	 * responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the Team Breakdown Structure
-	 */
-	public ComposedAdapterFactory createTBSComposedAdapterFactory();
-
-	/**
-	 * Creates a new adapter factory for Work Product Breakdown Structure.
-	 * Client is responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the Work Product Breakdown Structure
-	 */
-	public ComposedAdapterFactory createWPBSComposedAdapterFactory();
-
-	/**
-	 * Creates a new adapter factory for the Consolidated Breakdown Structure.
-	 * Client is responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the Consolidated Breakdown Structure
-	 */
-	public ComposedAdapterFactory createProcessComposedAdapterFactory();
-
-	/**
-	 * Creates a new adapter factory for the published Work Breakdown Structure.
-	 * Client is responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the published Work Breakdown Structure
-	 */
-	public ComposedAdapterFactory createPublishingWBSAdapterFactory();
-
-	/**
-	 * Creates a new adapter factory for published Team Breakdown Structure.
-	 * Client is responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the published Team Breakdown Structure
-	 */
-	public ComposedAdapterFactory createPublishingTBSAdapterFactory();
-
-	/**
-	 * Creates a new adapter factory for published Work Product Breakdown
-	 * Structure. Client is responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the published Work Product Breakdown
-	 *         Structure
-	 */
-	public ComposedAdapterFactory createPublishingWPBSAdapterFactory();
-
-	/**
-	 * Creates a new adapter factory for the published Consolidated Breakdown
-	 * Structure. Client is responsible for disposing it after use by calling
-	 * {@linkplain ComposedAdapterFactory#dispose()}
-	 * 
-	 * @return an adapter factory for the published Consolidated Breakdown
-	 *         Structure
-	 */
-	public ComposedAdapterFactory createPublishingCBSAdapterFactory();
-
-	/**
-	 * Gets the singleton composed adapter factory for the Work Product
-	 * Breakdown Structure editor.
-	 * 
-	 * @return the adapter factory for the Work Product Breakdown Structure
-	 *         editor
-	 */
-	public ComposedAdapterFactory getWBS_ComposedAdapterFactory();
-
-	/**
-	 * Gets the singleton composed adapter factory for the Team Breakdown
-	 * Structure editor.
-	 * 
-	 * @return the adapter factory for the Team Breakdown Structure editor
-	 */
-	public ComposedAdapterFactory getOBS_ComposedAdapterFactory();
-
-	/**
-	 * Gets the singleton composed adapter factory for Work Product Breakdown
-	 * Structure editor.
-	 * 
-	 * @return the adapter factory for the Work Product Breakdown Structure
-	 *         editor
-	 */
-	public ComposedAdapterFactory getPBS_ComposedAdapterFactory();
-
-	/**
-	 * Gets the singleton composed adapter factory for the Consolidated
-	 * Breakdown Structure editor.
-	 * 
-	 * @return the adapter factory for the Consolidated Breakdown Structure
-	 *         editor
-	 */
-	public ComposedAdapterFactory getProcessComposedAdapterFactory();
-
-	/**
-	 * Gets the singleton composed adapter factory for the Configuration view.
-	 * 
-	 * @return the adapter factory for the Configuration view
-	 */
-	public ComposedAdapterFactory getConfigurationView_ComposedAdapterFactory();
-
-	/**
-	 * Gets adapter factory for ItemsFilter package. Either
-	 * getFilterView_AdapterFactory(IFilter filter) or
-	 * getItemsFilter_AdapterFactory(IFilter filter) should be used. Both can be
-	 * used at the same time depends on purpose.
-	 */
-	public AdapterFactory getItemsFilter_AdapterFactory(IFilter filter);
-
-	/**
-	 * Gets an adapter factory for the Team Breakdown Structure filter.
-	 * 
-	 * @param filter
-	 *            a method element filter
-	 * @return an adapter factory for the Team Breakdown Structure filter
-	 */
-	public AdapterFactory getOBSFilter_AdapterFactory(IFilter filter);
-
-	/**
-	 * Gets an adapter factory for the Work Product Breakdown Structure filter.
-	 * 
-	 * @param filter
-	 *            a method element filter
-	 * @return an adapter factory for the Work Product Breakdown Structure
-	 *         filter
-	 */
-	public AdapterFactory getPBSFilter_AdapterFactory(IFilter filter);
-
-	/**
-	 * Gets the singleton composed adapter factory for the Team Breakdown
-	 * Structure filter.
-	 * 
-	 * @return the adapter factory for the Team Breakdown Structure filter
-	 */
-	public ComposedAdapterFactory getOBSFilter_ComposedAdapterFactory();
-
-	/**
-	 * Gets the singleton composed adapter factory for the Work Product
-	 * Breakdown Structure filter.
-	 * 
-	 * @return the adapter factory for the Work Product Breakdown Structure
-	 *         filter
-	 */
-	public ComposedAdapterFactory getPBSFilter_ComposedAdapterFactory();
-
-	/**
-	 * Gets the singleton composed adapter factory for the item filter.
-	 * 
-	 * @return the adapter factory for the item filter
-	 */
-	public ComposedAdapterFactory getItemsFilter_ComposedAdapterFactory();
-
-	/**
-	 * Resets the adapter factories.
-	 */
-	public void reset();
-
-	/**
-	 * Releases unused objects.
-	 */
-	public void cleanUp();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/TransientGroupItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/TransientGroupItemProvider.java
deleted file mode 100644
index 17c3dcd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/TransientGroupItemProvider.java
+++ /dev/null
@@ -1,415 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.command.RemoveCommand;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.element.IElementItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-
-/**
- * Item provider for UI transient objects that can be used to group/organize
- * model objects in a view.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class TransientGroupItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IElementItemProvider, IConfigurable, IDefaultNameSetter,
-		ILibraryItemProvider {
-
-	protected String name;
-
-	protected IFilter childFilter;
-
-	protected Object parent;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public TransientGroupItemProvider(AdapterFactory adapterFactory,
-			Notifier parent) {
-		super(adapterFactory);
-		parent.eAdapters().add(this);
-	}
-
-	/**
-	 * @param adapterFactory
-	 */
-	public TransientGroupItemProvider(AdapterFactory adapterFactory,
-			Notifier parent, String name) {
-		super(adapterFactory);
-		parent.eAdapters().add(this);
-		this.name = name;
-	}
-
-	protected boolean acceptAsChild(Object obj) {
-		if (childFilter != null) {
-			return childFilter.accept(obj);
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null)
-			return parent;
-		return target;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getNewChildDescriptors(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-	 */
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return super.getNewChildDescriptors(target, editingDomain, sibling);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getResourceLocator()
-	 */
-	protected ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createCreateChildCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int,
-	 *      java.util.Collection)
-	 */
-	protected Command createCreateChildCommand(EditingDomain domain,
-			EObject owner, EStructuralFeature feature, Object value, int index,
-			Collection collection) {
-		Command cmd = super.createCreateChildCommand(domain, (EObject) target,
-				feature, value, index, collection);
-		// System.out.println(getClass().getName() + "#createCreateChildCommand:
-		// can execute: " + cmd.canExecute());
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createAddCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection, int)
-	 */
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		Collection selection = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (acceptAsChild(element)) {
-				selection.add(element);
-			}
-		}
-		if (selection.isEmpty()) {
-			return UnexecutableCommand.INSTANCE;
-		}
-		return new MethodElementAddCommand(super.createAddCommand(domain,
-				(EObject) target, feature, selection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createRemoveCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection)
-	 */
-	protected Command createRemoveCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection) {
-		Command cmd = super.createRemoveCommand(domain, (EObject) target,
-				feature, collection);
-		// System.out.println(getClass().getName() + "#createRemoveCommand: can
-		// execute: " + cmd.canExecute());
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createMoveCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int)
-	 */
-	protected Command createMoveCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Object value, int index) {
-		Command cmd = super.createMoveCommand(domain, (EObject) target,
-				feature, value, index);
-		// System.out.println(getClass().getName() + "#createMoveCommand: can
-		// execute: " + cmd.canExecute());
-		return cmd;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createCommand(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Class,
-	 *      org.eclipse.emf.edit.command.CommandParameter)
-	 */
-	public Command createCommand(Object object, EditingDomain domain,
-			Class commandClass, CommandParameter commandParameter) {
-		if (commandClass == RemoveCommand.class) {
-			commandParameter.setOwner(target);
-		}
-		Command cmd = super.createCommand(object, domain, commandClass,
-				commandParameter);
-		// System.out.println(getClass().getName() + "#createCommand: " +
-		// commandClass + ", can execute: " + cmd.canExecute() + ", owner: " +
-		// commandParameter.getOwner() + ", collection: " +
-		// commandParameter.getCollection());
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		ChildrenStore store = getChildrenStore(target);
-		if (store != null) {
-			return store.getChildren();
-		}
-
-		store = createChildrenStore(target);
-		List result = store != null ? null : new ArrayList();
-		EObject eObject = (EObject) target;
-
-		if (target == null) return result;
-		
-		for (Iterator i = getChildrenFeatures(target).iterator(); i.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) i.next();
-			if (feature.isMany()) {
-				List children = (List) eObject.eGet(feature);
-				int index = 0;
-				for (Iterator ci = children.iterator(); ci.hasNext(); index++) {
-					Object child = ci.next();
-					if (acceptAsChild(child)) {
-						child = wrap(eObject, feature, child, index);
-						if (store != null) {
-							store.getList(feature).add(child);
-						} else {
-							result.add(child);
-						}
-					}
-				}
-			} else {
-				Object child = eObject.eGet(feature);
-				if (acceptAsChild(child)) {
-					child = wrap(eObject, feature, child,
-							CommandParameter.NO_INDEX);
-					if (store != null) {
-						store.setValue(feature, child);
-					} else {
-						result.add(child);
-					}
-				}
-			}
-		}
-		List children = store != null ? store.getChildren() : result;
-		Collections.sort(children, PresentationContext.INSTANCE.getComparator());
-		
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createDragAndDropCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      java.lang.Object, float, int, int, java.util.Collection)
-	 */
-	protected Command createDragAndDropCommand(EditingDomain domain,
-			Object owner, float location, int operations, int operation,
-			Collection collection) {
-		boolean canExec = true;
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			if (!acceptAsChild(iter.next())) {
-				canExec = false;
-				break;
-			}
-		}
-		Command cmd;
-		if (canExec) {
-			cmd = super.createDragAndDropCommand(domain, owner, location,
-					operations, operation, collection);
-		} else {
-			cmd = UnexecutableCommand.INSTANCE;
-		}
-		// System.out.println(getClass().getName() + "#createMoveCommand: can
-		// execute: " + cmd.canExecute());
-		return cmd;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		TngUtil.setDefaultName(this, msg);
-
-		// if(msg.getNotifier() == target) {
-		// if(featureId == UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS) {
-		// boolean notify = false;
-		// switch(msg.getEventType()) {
-		// case Notification.ADD:
-		// case Notification.MOVE:
-		// Object obj = msg.getNewValue();
-		// notify = acceptAsChild(obj);
-		// break;
-		// case Notification.REMOVE:
-		// obj = msg.getOldValue();
-		// notify = acceptAsChild(obj);
-		// break;
-		// case Notification.ADD_MANY:
-		// Collection collection = (Collection) msg.getNewValue();
-		// for_check:
-		// for(Iterator iter = collection.iterator(); iter.hasNext();) {
-		// if(acceptAsChild(iter.next())) {
-		// notify = true;
-		// break for_check;
-		// }
-		// }
-		// break;
-		// case Notification.REMOVE_MANY:
-		// collection = (Collection) msg.getOldValue();
-		// for_check:
-		// for(Iterator iter = collection.iterator(); iter.hasNext();) {
-		// if(acceptAsChild(iter.next())) {
-		// notify = true;
-		// break for_check;
-		// }
-		// }
-		// break;
-		//
-		// }
-		// if(notify) {
-		// fireNotifyChanged(new ViewerNotification(msg, this, true, false));
-		// }
-		// }
-		// }
-		super.notifyChanged(msg);
-	}
-
-	public String getText(Object object) {
-		return name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setConfiguration(org.eclipse.epf.uma.MethodConfiguration)
-	 */
-	public void setFilter(IFilter filter) {
-		this.childFilter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Folder"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return super.getChildrenFeatures(object);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/VariabilityInfo.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/VariabilityInfo.java
deleted file mode 100644
index 600e741..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/VariabilityInfo.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * A helper class for storing variability information.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class VariabilityInfo {
-
-	private VariabilityElement owner;
-
-	private List inheritanceList;
-
-	private ArrayList contributors;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param owner
-	 *            a variability element
-	 */
-	public VariabilityInfo(VariabilityElement owner) {
-		this.owner = owner;
-	}
-
-	/**
-	 * Gets the owner of this VariabilityInfo object.
-	 * 
-	 * @return the owner of this VariabilityInfo object.
-	 */
-	public final VariabilityElement getOwner() {
-		return owner;
-	}
-
-	/**
-	 * Gets the realized inheritance list in the order from the resolved object
-	 * of the owner to the its top base.
-	 * 
-	 * @return
-	 */
-	public List getInheritanceList() {
-		if (inheritanceList == null) {
-			inheritanceList = new ArrayList();
-		}
-		return inheritanceList;
-	}
-
-	/**
-	 * Gets the list of all contributor to
-	 * 
-	 * @return
-	 */
-	public List getContributors() {
-		if (contributors == null) {
-			contributors = new ArrayList();
-		}
-		return contributors;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/breakdownelement/ActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/breakdownelement/ActivityItemProvider.java
deleted file mode 100644
index 4ec7a6f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/breakdownelement/ActivityItemProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.library.edit.breakdownelement;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author skannoor
- *
- */
-public class ActivityItemProvider extends
-		org.eclipse.epf.uma.provider.ActivityItemProvider {
-
-	public ActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-		// TODO Auto-generated constructor stub
-	}
-	
-	@Override
-	public boolean hasChildren(Object object) {
-		return false;
-	}
-	
-	@Override
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_Activity_type")); //$NON-NLS-1$
-	}
-	
-	@Override
-	public Object getImage(Object object) {
-		Object img = TngUtil.getImage(object);
-		return img != null ? img : super.getImage(object);
-	}
-	
-	@Override
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		return;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/breakdownelement/MilestoneItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/breakdownelement/MilestoneItemProvider.java
deleted file mode 100644
index 0b8d79d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/breakdownelement/MilestoneItemProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.library.edit.breakdownelement;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author skannoor
- *
- */
-public class MilestoneItemProvider extends
-		org.eclipse.epf.uma.provider.MilestoneItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public MilestoneItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-		// TODO Auto-generated constructor stub
-	}
-	@Override
-	public boolean hasChildren(Object object) {
-		return false;
-	}
-	@Override
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_Milestone_type")); //$NON-NLS-1$
-	}
-	@Override
-	public Collection getChildren(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-	
-	@Override
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		return;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/CustomCategoriesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/CustomCategoriesItemProvider.java
deleted file mode 100644
index 734b75f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/CustomCategoriesItemProvider.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * The item provider adapter for the "Custom Categories" folder.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class CustomCategoriesItemProvider extends
-		TransientCategoryPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CustomCategoriesItemProvider(AdapterFactory adapterFactory,
-			ContentPackage target, String name) {
-		super(adapterFactory, target, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createCustomCategory()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return accept(obj);
-
-	}
-
-	public static boolean accept(Object obj) {
-		if (obj instanceof CustomCategory) {
-			List myCategories = AssociationHelper
-					.getCustomCategories((CustomCategory) obj);
-			if (myCategories.isEmpty()) {
-				return true;
-			}
-
-			if (myCategories.size() == 1) {
-				// root custom category is unde the hidden package and will not
-				// be processed.
-				// need to show sub categories under it
-				CustomCategory c = (CustomCategory) myCategories.get(0);
-				if (TngUtil.isRootCustomCategory(c)) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE
-				.getImage("full/obj16/CustomCategories"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		return super.getChildren(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof CustomCategory) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), CustomCategory.class),
-					(MethodElement) obj,
-					LibraryEditConstants.NEW_CUSTOM_CATEGORY);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/CustomCategoryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/CustomCategoryItemProvider.java
deleted file mode 100644
index 13d8d18..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/CustomCategoryItemProvider.java
+++ /dev/null
@@ -1,503 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.MissingResourceException;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.EMFEditPlugin;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * The item provider adapter for a custom category.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class CustomCategoryItemProvider extends
-		org.eclipse.epf.uma.provider.CustomCategoryItemProvider implements
-		IDefaultNameSetter, ILibraryItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CustomCategoryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public void setParent(Object parent) {
-		// this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-
-		// CustomCategory category = (CustomCategory) object;
-		// if(category.eContainer() instanceof CustomCategory) {
-		// return super.getParent(object);
-		// }
-		//		
-		// if(parent != null) {
-		// return parent;
-		// }
-		//		
-		// if(object instanceof EObject) {
-		// MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-		// //if(plugin == null) return null;
-		//			
-		// if(plugin != null) {
-		// String[] path = {
-		// LibraryEditPlugin.INSTANCE.getString("_UI_Content_group")
-		// ,LibraryEditPlugin.INSTANCE.getString("_UI_Custom_Categories_group")
-		// };
-		// return TngUtil.getAdapter(plugin, path);
-		// }
-		//			
-		// }
-
-		if (TngUtil.isRootCustomCategory((CustomCategory) object)) {
-			return null;
-		}
-		return super.getParent(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getCustomCategory_CategorizedElements(), UmaFactory.eINSTANCE
-				.createCustomCategory()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			// childrenFeatures.add(UmaPackage.eINSTANCE.getCustomCategory_SubCategories());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getCustomCategory_CategorizedElements());
-			// childrenFeatures.add(UmaPackage.eINSTANCE.getCustomCategory_ProcessElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.command.CreateChildCommand.Helper#getCreateChildImage(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		if (feature instanceof EReference && child instanceof EObject) {
-			EReference reference = (EReference) feature;
-			EClass parentClass = reference.getEContainingClass();
-			EClass childClass = ((EObject) child).eClass();
-			String name = "full/ctool16/Create" + parentClass.getName() + "_" + reference.getName() + "_" + childClass.getName(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			try {
-				return LibraryEditPlugin.INSTANCE.getImage(name);
-			} catch (MissingResourceException e) {
-				System.err.println(e.getMessage());
-				return null;
-			}
-		}
-
-		return EMFEditPlugin.INSTANCE.getImage("full/ctool16/CreateChild"); //$NON-NLS-1$
-	}
-
-	private static void handleRemoved(CustomCategory category) {
-		if (AssociationHelper.getCustomCategories(category).isEmpty()) {
-			// remove all subcategories
-			//
-			for (Iterator iter = category.getCategorizedElements().iterator(); iter
-					.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof CustomCategory) {
-					iter.remove();
-				}
-			}
-
-			EcoreUtil.remove(category);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		setDefaultName(notification);
-
-		updateChildren(notification);
-
-		ContentPackage pkg;
-		// boolean refreshCustomCategoryRoot = false;
-		switch (notification.getFeatureID(CustomCategory.class)) {
-		case UmaPackage.METHOD_ELEMENT__NAME:
-			TngUtil.refreshContributors(this, notification, false, true);
-			//for epf defect:174043
-			if(!TngUtil.isRootCustomCategory((CustomCategory)notification.getNotifier())){
-				MethodPlugin plugin = MethodElementUtil.getMethodModel(notification.getNotifier());
-				if(plugin !=null){
-					CustomCategory root = TngUtil.getRootCustomCategory(plugin);
-					fireNotifyChanged(new ViewerNotification(notification, root, true, false));
-				}
-			}
-			break;
-		case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-			break;
-		// case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORIES:
-		case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS:
-			pkg = (ContentPackage) ((EObject) notification.getNotifier())
-					.eContainer();
-			if ((pkg != null)
-					&& (ModelStructure.HIDDEN_PACKAGE_NAME
-							.equals(pkg.getName()))) {
-				// notifier is the root custom category
-				//
-				pkg = (ContentPackage) pkg.eContainer();
-			}
-			Object obj;
-			CustomCategory category;
-			switch (notification.getEventType()) {
-			case Notification.ADD:
-				obj = notification.getNewValue();
-				if (obj instanceof CustomCategory) {
-					category = (CustomCategory) obj;
-					if (category.eContainer() == null) {
-						pkg.getContentElements().add(category);
-					} else {
-						// refreshCustomCategoryRoot = true;
-					}
-				}
-				break;
-			case Notification.ADD_MANY:
-				for (Iterator iter = ((Collection) notification.getNewValue())
-						.iterator(); iter.hasNext();) {
-					obj = iter.next();
-					if (obj instanceof CustomCategory) {
-						category = (CustomCategory) obj;
-						if (category.eContainer() == null) {
-							pkg.getContentElements().add(category);
-						} else {
-							// refreshCustomCategoryRoot = true;
-						}
-					}
-				}
-				break;
-				
-				// removing subcategories is handled by the remove command
-				//
-//			case Notification.REMOVE:
-//				obj = notification.getOldValue();
-//				if (obj instanceof CustomCategory) {
-//					handleRemoved((CustomCategory) obj);
-//				}
-//				break;
-//			case Notification.REMOVE_MANY:
-//				for (Iterator iter = ((Collection) notification.getOldValue())
-//						.iterator(); iter.hasNext();) {
-//					obj = iter.next();
-//					if (obj instanceof CustomCategory) {
-//						handleRemoved((CustomCategory) obj);
-//					}
-//				}
-//				break;
-			}
-			
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-
-			// // refresh wrappers
-			// //
-			// if(wrappers != null) {
-			// for (Iterator iter = new ArrayList(wrappers).iterator();
-			// iter.hasNext();) {
-			// fireNotifyChanged(new ViewerNotification(notification,
-			// iter.next(), true, false));
-			// }
-			// }
-			//			
-			// if(refreshCustomCategoryRoot) {
-			// // sub category has been added or removed from the custom
-			// category
-			// // need to refresh the folder for all custom categories
-			// //
-			// MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) target);
-			//				
-			// if(plugin != null) {
-			// String[] path = {
-			// LibraryEditPlugin.INSTANCE.getString("_UI_Content_group")
-			// ,LibraryEditPlugin.INSTANCE.getString("_UI_Custom_Categories_group")
-			// };
-			// fireNotifyChanged(new ViewerNotification(notification,
-			// TngUtil.getAdapter(plugin, path), true, false));
-			// }
-			// }
-
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#isWrappingNeeded(java.lang.Object)
-	 */
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_CustomCategory_type"), true); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		CustomCategory category = (CustomCategory) object;
-		return !category.getCategorizedElements().isEmpty()
-		// || !category.getSubCategories().isEmpty()
-		;
-	}
-
-	public void setDefaultName(Notification msg) {
-		IDefaultNameSetter defaultNameSetter = this;
-		if (defaultNameSetter.getInterestedFeatureOwnerClass() != null) {
-			int featureId = msg.getFeatureID(defaultNameSetter
-					.getInterestedFeatureOwnerClass());
-			if (featureId == defaultNameSetter.getInterestedFeatureID()) {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					setDefaultName(msg.getNewValue(), msg.getNotifier());
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						setDefaultName(iter.next(), msg.getNotifier());
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	private void setDefaultName(Object obj, Object parent) {
-		String baseName = null;
-		if (obj instanceof CustomCategory) {
-			String ccName = ((CustomCategory)obj).getName();
-			if (ccName == null || ccName.trim().length() == 0) {
-				baseName = LibraryEditConstants.NEW_CUSTOM_CATEGORY;
-				TngUtil.setDefaultName((CustomCategory) parent, (CustomCategory) obj, baseName);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureOwnerClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return CustomCategory.class;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		Collection selection = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof CustomCategory) {
-				// check custom category for circular dependency
-				//
-				if (!(owner instanceof DescribableElement && TngUtil
-						.isAncessorOf((CustomCategory) element,
-								(DescribableElement) owner))) {
-					selection.add(element);
-				}
-			}
-		}
-		if (selection.isEmpty()) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createRemoveCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection)
-	 */
-	protected Command createRemoveCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection) {
-		return super.createRemoveCommand(domain, owner, feature, collection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	public Object getImage(Object object) {
-		if (TngUtil.isRootCustomCategory((CustomCategory) object))
-			return LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/CustomCategories"); //$NON-NLS-1$
-		else {
-			if (object instanceof DescribableElement) {
-				if (((DescribableElement) object).getNodeicon() != null) {
-					URI imgUri = TngUtil.getFullPathofNodeorShapeIconURI(
-							(DescribableElement) object,
-							((DescribableElement) object).getNodeicon());
-					Object image = LibraryEditPlugin.INSTANCE
-							.getSharedImage(imgUri);
-					if (image != null)
-						return image;
-				}
-			}
-			return super.getImage(object);
-		}
-	}
-
-	public void setDefaultName(Object obj) {
-		// do nothing, already handled by setDefaultName(Notification)
-	}
-
-	public List getNotifyChangedListeners() {
-		if(changeNotifier instanceof Collection) {
-			return new ArrayList((Collection) changeNotifier);
-		}
-		return Collections.EMPTY_LIST;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#addListener(org.eclipse.emf.edit.provider.INotifyChangedListener)
-	 */
-	public void addListener(INotifyChangedListener listener) {
-		// TODO Auto-generated method stub
-		super.addListener(listener);
-	}
-	
-	public Collection getChildren(Object object) {
-		
-		Collection col = super.getChildren(object);
-		if(TngUtil.isRootCustomCategory((CustomCategory)object)){
-			List sortList = new ArrayList();
-			sortList.addAll(col);
-			Collections.sort(sortList, PresentationContext.INSTANCE.getComparator());
-			return sortList;
-		} else if (object instanceof MethodElement) {
-			List sortList = CategorySortHelper.sortCategoryElements((MethodElement)object, col.toArray());
-			return sortList;
-		}
-		return col;
-	}
-	
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineCategoriesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineCategoriesItemProvider.java
deleted file mode 100644
index 5223d8b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineCategoriesItemProvider.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Disciplines" folder.
- * <p>
- * This class will be renamed as DisciplinesItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineCategoriesItemProvider extends
-		TransientCategoryPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineCategoriesItemProvider(AdapterFactory adapterFactory,
-			ContentPackage target, String name) {
-		super(adapterFactory, target, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.category.TransientCategoryPackageItemProvider#isInherited(org.eclipse.epf.uma.ContentCategory)
-	 */
-	protected boolean isInherited(ContentCategory category) {
-		return (category instanceof Discipline || category instanceof DisciplineGrouping)
-				&& category.getVariabilityBasedOnElement() != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createDisciplineGrouping()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createDiscipline()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	public static boolean accept(Object obj) {
-		if (obj instanceof DisciplineGrouping) {
-			return true;
-		}
-		if (obj instanceof Discipline) {
-			List groups = AssociationHelper.getDisciplineGroups((Discipline) obj);
-			if (groups.isEmpty()) {
-				return true;
-			} else {
-				for (Object group : groups) {
-					if (group instanceof DisciplineGrouping) {
-						if (UmaUtil.getMethodPlugin((DisciplineGrouping)group) == UmaUtil.getMethodPlugin((Discipline)obj)) {
-							return false;
-						}
-					}
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return accept(obj);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Disciplines"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Discipline) {
-				Discipline child = (Discipline) element;
-				DisciplineItemProvider itemProvider = (DisciplineItemProvider) TngUtil
-						.getBestAdapterFactory(adapterFactory).adapt(child,
-								ITreeItemContentProvider.class);
-				itemProvider.setParent(object);
-			}
-		}
-
-		return children;
-	}
-
-	public void setDefaultName(Object obj) {
-		if (obj instanceof Discipline) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), Discipline.class),
-					(MethodElement) obj, LibraryEditConstants.NEW_DISCIPLINE);
-		} else if (obj instanceof DisciplineGrouping) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), DisciplineGrouping.class),
-					(MethodElement) obj,
-					LibraryEditConstants.NEW_DISCIPLINE_GROUPING);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineCategoryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineCategoryItemProvider.java
deleted file mode 100644
index a47768f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineCategoryItemProvider.java
+++ /dev/null
@@ -1,384 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.MissingResourceException;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.EMFEditPlugin;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a discipline grouping.
- * <p>
- * This class will be renamed as DisciplineGroupingItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineCategoryItemProvider extends
-		org.eclipse.epf.uma.provider.DisciplineGroupingItemProvider implements
-		IDefaultNameSetter, ILibraryItemProvider {
-
-	protected Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineCategoryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getDisciplineGrouping_Disciplines(), UmaFactory.eINSTANCE
-				.createDiscipline()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getDisciplineGrouping_Disciplines());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null) {
-			return parent;
-		}
-		if (object instanceof EObject) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-			if (plugin != null) {
-				String[] path = {
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Content_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Disciplines_group") //$NON-NLS-1$
-				};
-
-				return TngUtil.getAdapter(plugin, path);
-			}
-		}
-
-		// MethodPlugin model = UmaUtil.getMethodPlugin((MethodElement) object);
-		// if(model == null) return null;
-		// IGroupContainer groupContainer = (IGroupContainer)
-		// TngUtil.getAdapter((EObject)model, IGroupContainer.class);
-		// if(groupContainer != null) {
-		// groupContainer = (IGroupContainer)
-		// groupContainer.getGroupItemProvider(LibraryEditPlugin.INSTANCE.getString("_UI_Content_group"));
-		// return
-		// groupContainer.getGroupItemProvider(LibraryEditPlugin.INSTANCE.getString("_UI_Disciplines_group"));
-		// }
-		// // MethodModelItemProvider itemProvider = (MethodModelItemProvider)
-		// TngUtil.getAdapter((EObject)model, MethodModelItemProvider.class);
-		// // if(itemProvider != null) {
-		// // return itemProvider.getDisciplineCategories();
-		// // }
-
-		return super.getParent(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		if (children instanceof List)
-			Collections.sort((List) children, PresentationContext.INSTANCE
-					.getComparator());
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.command.CreateChildCommand.Helper#getCreateChildImage(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		if (feature instanceof EReference && child instanceof EObject) {
-			EReference reference = (EReference) feature;
-			EClass parentClass = reference.getEContainingClass();
-			EClass childClass = ((EObject) child).eClass();
-			String name = "full/ctool16/Create" + parentClass.getName() + "_" + reference.getName() + "_" + childClass.getName(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			try {
-				return LibraryEditPlugin.INSTANCE.getImage(name);
-			} catch (MissingResourceException e) {
-				System.err.println(e.getMessage());
-				return null;
-			}
-		}
-
-		return EMFEditPlugin.INSTANCE.getImage("full/ctool16/CreateChild"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		// String label = TngUtil.getLabel(object,
-		// getString("_UI_DisciplineGrouping_type"));
-		// ContentCategory category = (ContentCategory) object;
-		// if(category.getVariabilityBasedOnElement() != null) {
-		// MethodPlugin basePlugin =
-		// UmaUtil.getMethodPlugin(category.getVariabilityBasedOnElement());
-		// if(basePlugin != null) {
-		// label = label + " (inherited from " + basePlugin.getName() + ')';
-		// }
-		// }
-		// return label;
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_DisciplineGrouping_type"), true); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.DisciplineGroupingItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		// commenting below, useful for stateful itemprovider.
-		//TngUtil.setDefaultName(this, notification);
-		
-		// For stateless itemprovider, need this.
-		setDefaultName(notification);
-		
-		updateChildren(notification);
-		ContentPackage pkg;
-		Discipline discipline;
-		switch (notification.getFeatureID(DisciplineGrouping.class)) {
-		case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-
-			boolean refreshParent = false;
-			pkg = (ContentPackage) ((EObject) notification.getNotifier())
-					.eContainer();
-			switch (notification.getEventType()) {
-			case Notification.ADD:
-				discipline = (Discipline) notification.getNewValue();
-				if (discipline.eContainer() == null) {
-					pkg.getContentElements().add(discipline);
-				} else if (discipline.eContainer() == pkg) {
-					refreshParent = true;
-				}
-				break;
-			case Notification.ADD_MANY:
-				for (Iterator iter = ((Collection) notification.getNewValue())
-						.iterator(); iter.hasNext();) {
-					discipline = (Discipline) iter.next();
-					if (discipline.eContainer() == null) {
-						pkg.getContentElements().add(discipline);
-					} else if (discipline.eContainer() == pkg) {
-						refreshParent = true;
-					}
-				}
-				break;
-			case Notification.REMOVE:
-			case Notification.REMOVE_MANY:
-				refreshParent = true;
-				break;
-			}
-			if (refreshParent) {
-				fireNotifyChanged(new ViewerNotification(notification,
-						getParent(target), true, false));
-			}
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	// */
-	// public Collection getChildren(Object object) {
-	// Collection children = super.getChildren(object);
-	// for (Iterator iter = children.iterator(); iter.hasNext();) {
-	// Discipline child = (Discipline) iter.next();
-	// DisciplineItemProvider itemProvider = (DisciplineItemProvider)
-	// adapterFactory.adapt(child, ITreeItemContentProvider.class);
-	// itemProvider.setParent(object);
-	// }
-	// return children;
-	// }
-
-	public void setDefaultName(Notification msg) {
-		IDefaultNameSetter defaultNameSetter = this;
-		if (defaultNameSetter.getInterestedFeatureOwnerClass() != null) {
-			int featureId = msg.getFeatureID(defaultNameSetter
-					.getInterestedFeatureOwnerClass());
-			if (featureId == defaultNameSetter.getInterestedFeatureID()) {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					setDefaultName(msg.getNewValue(), msg.getNotifier());
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						setDefaultName(iter.next(), msg.getNotifier());
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	private void setDefaultName(Object obj, Object parent) {
-		String baseName = null;
-		if (obj instanceof Discipline) {
-			baseName = LibraryEditConstants.NEW_DISCIPLINE;
-		}
-		if (baseName != null) {
-			// Making plugin level uniqueness of discipline, on removing discipline reference 
-			// from discipline grouping, discipline goes back to toplevel causing duplicate. 
-			TngUtil.setDefaultName(TngUtil.extract(
-					((ContentPackage) (((DisciplineGrouping) parent)
-							.eContainer())).getContentElements(),
-					Discipline.class), (MethodElement) obj,
-					LibraryEditConstants.NEW_DISCIPLINE);
-		}
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof Discipline) {
-			baseName = LibraryEditConstants.NEW_DISCIPLINE;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((DisciplineGrouping) target)
-					.getDisciplines(), (MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.DISCIPLINE_GROUPING__DISCIPLINES;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureOwnerClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return DisciplineGrouping.class;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IMethodElementItemProvider#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineItemProvider.java
deleted file mode 100644
index 8c57cbd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DisciplineItemProvider.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a discipline.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineItemProvider extends
-		org.eclipse.epf.uma.provider.DisciplineItemProvider implements
-		ILibraryItemProvider, IStatefulItemProvider, IDefaultNameSetter {
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-//		if (parent != null)
-//			return parent;
-//		return super.getParent(object);
-		Discipline discipline = (Discipline)object;
-		if(discipline.eContainer() instanceof Discipline){
-			parent =  super.getParent(discipline);
-			return parent;
-		}
-		
-		MethodPlugin model = UmaUtil.getMethodPlugin(discipline);
-		if (model == null)
-			return null;
-
-		String[] path = {
-				LibraryEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-				,
-				LibraryEditPlugin.INSTANCE
-						.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-				, LibraryEditPlugin.INSTANCE.getString("_UI_Disciplines_group") //$NON-NLS-1$
-		};
-
-		return TngUtil.getAdapter(model, path);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getDiscipline_Subdiscipline(), UmaFactory.eINSTANCE.createDiscipline()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		//return Collections.EMPTY_LIST;
-		if(childrenFeatures == null){
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE.getDiscipline_Subdiscipline());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		TngUtil.setDefaultName(this, notification);
-		updateChildren(notification);
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		switch (notification.getFeatureID(Discipline.class)) {
-		case UmaPackage.DISCIPLINE__NAME:
-			TngUtil.refreshContributors(this, notification, false, true);
-			break;
-		case UmaPackage.DISCIPLINE__TASKS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-
-		case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOWS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			// refresh uncategorized tasks folder
-			// TngUtil.refreshAdapter(LibraryEditConstants.UNCATEGORIZED_TASKS_PATH,
-			// notification);
-			return;
-		case UmaPackage.DISCIPLINE__SUBDISCIPLINE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;		
-		case UmaPackage.DISCIPLINE__VARIABILITY_BASED_ON_ELEMENT:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-				.getNotifier(), true, false));
-			return;
-			
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_Discipline_type"), true); //$NON-NLS-1$
-	}
-
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-	
-	public List getNotifyChangedListeners() {
-		if(changeNotifier instanceof Collection) {
-			return new ArrayList((Collection) changeNotifier);
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		// Change Categories display in Library Navigator
-		// (commented for this defect)
-		// return !((Discipline) object).getTasks().isEmpty();
-		//return false;
-		return super.hasChildren(object);
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		// return new MethodElementAddCommand((AddCommand)
-		// super.createAddCommand(domain, owner, feature, collection, index));
-		//return UnexecutableCommand.INSTANCE;
-		Collection selection = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Discipline) {
-				selection.add(element);
-			}
-		}
-		if (selection.isEmpty()) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	public int getInterestedFeatureID() {
-		// TODO Auto-generated method stub
-		return UmaPackage.DISCIPLINE__SUBDISCIPLINE;
-	}
-
-	public Class getInterestedFeatureOwnerClass() {
-		// TODO Auto-generated method stub
-		return Discipline.class;
-	}
-
-	public void setDefaultName(Object obj) {
-		// TODO Auto-generated method stub
-		String baseName = null;
-		if (obj instanceof Discipline) {
-			baseName = LibraryEditConstants.NEW_DISCIPLINE;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((Discipline) target).getSubdiscipline(),
-					(MethodElement) obj, baseName);
-		}
-	}
-	
-	public Collection getChildren(Object object) {
-		// TODO Auto-generated method stub
-		//return super.getChildren(object);
-		Collection children = super.getChildren(object);
-		if (children instanceof List)
-			Collections.sort((List) children, PresentationContext.INSTANCE.getComparator());
-		return children;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DomainItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DomainItemProvider.java
deleted file mode 100644
index fe79918..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DomainItemProvider.java
+++ /dev/null
@@ -1,278 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.Disposable;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a domain.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DomainItemProvider extends
-		org.eclipse.epf.uma.provider.DomainItemProvider implements
-		IDefaultNameSetter, ILibraryItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DomainItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getDomain_Subdomains(), UmaFactory.eINSTANCE.createDomain()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE.getDomain_Subdomains());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		Domain domain = (Domain) object;
-		if (domain.eContainer() instanceof Domain) {
-			return super.getParent(object);
-		}
-		MethodPlugin model = UmaUtil.getMethodPlugin(domain);
-		if (model == null)
-			return null;
-
-		String[] path = {
-				LibraryEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-				,
-				LibraryEditPlugin.INSTANCE
-						.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-				, LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group") //$NON-NLS-1$
-		};
-
-		return TngUtil.getAdapter(model, path);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_Domain_type"), true); //$NON-NLS-1$
-	}
-
-	public void notifyChanged(Notification notification) {
-		//TngUtil.setDefaultName(this, notification);
-		setDefaultName(notification);
-
-		updateChildren(notification);
-
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		switch (notification.getFeatureID(Domain.class)) {
-		case UmaPackage.METHOD_ELEMENT__NAME:
-			TngUtil.refreshContributors(this, notification, false, true);
-			break;
-
-		case UmaPackage.DOMAIN__SUBDOMAINS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		if (children instanceof List)
-			Collections.sort((List) children, PresentationContext.INSTANCE
-					.getComparator());
-		return children;
-	}
-
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-
-	protected Collection createWrappers(Collection objects) {
-		if (wrappers == null) {
-			wrappers = new Disposable();
-		}
-		FeatureValueWrapperItemProvider.fill(wrappers, null, objects, this,
-				adapterFactory);
-		ArrayList list = new ArrayList(wrappers);
-		return list;
-	}
-
-	public void setDefaultName(Notification msg) {
-		IDefaultNameSetter defaultNameSetter = this;
-		if (defaultNameSetter.getInterestedFeatureOwnerClass() != null) {
-			int featureId = msg.getFeatureID(defaultNameSetter
-					.getInterestedFeatureOwnerClass());
-			if (featureId == defaultNameSetter.getInterestedFeatureID()) {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					setDefaultName(msg.getNewValue(), msg.getNotifier());
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						setDefaultName(iter.next(), msg.getNotifier());
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	private void setDefaultName(Object obj, Object parent) {
-		String baseName = null;
-		if (obj instanceof Domain) {
-			baseName = LibraryEditConstants.NEW_DOMAIN;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((Domain) parent)
-					.getSubdomains(), (MethodElement) obj, baseName);
-		}
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof Domain) {
-			baseName = LibraryEditConstants.NEW_DOMAIN;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((Domain) target).getSubdomains(),
-					(MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.DOMAIN__SUBDOMAINS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureOwnerClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return Domain.class;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		Collection selection = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Domain) {
-				selection.add(element);
-			}
-		}
-		if (selection.isEmpty()) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IMethodElementItemProvider#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DomainsItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DomainsItemProvider.java
deleted file mode 100644
index 43983d7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/DomainsItemProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the "Domains" folder.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DomainsItemProvider extends TransientCategoryPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DomainsItemProvider(AdapterFactory adapterFactory,
-			ContentPackage target, String name) {
-		super(adapterFactory, target, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createDomain()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return obj instanceof Domain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		return super.getChildren(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Domains"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof Domain) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), Domain.class), (MethodElement) obj,
-					LibraryEditConstants.NEW_DOMAIN);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetCategoryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetCategoryItemProvider.java
deleted file mode 100644
index 9930624..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetCategoryItemProvider.java
+++ /dev/null
@@ -1,426 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.MissingResourceException;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.EMFEditPlugin;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.Disposable;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a role set grouping.
- * <p>
- * This class will be renamed as RoleSetGroupingItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleSetCategoryItemProvider extends
-		org.eclipse.epf.uma.provider.RoleSetGroupingItemProvider implements
-		IDefaultNameSetter, ILibraryItemProvider, IStatefulItemProvider {
-
-	private Disposable children;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetCategoryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getRoleSetGrouping_RoleSets(), UmaFactory.eINSTANCE
-				.createRoleSet()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getRoleSetGrouping_RoleSets());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (object instanceof EObject) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-			if (plugin != null) {
-				String[] path = {
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Content_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Role_Sets_group") //$NON-NLS-1$
-				};
-
-				return TngUtil.getAdapter(plugin, path);
-			}
-		}
-
-		// MethodModelItemProvider itemProvider = (MethodModelItemProvider)
-		// TngUtil.getAdapter((EObject)model, MethodModelItemProvider.class);
-		// if(itemProvider != null) {
-		// return itemProvider.getRoleSets();
-		// }
-		return super.getParent(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.command.CreateChildCommand.Helper#getCreateChildImage(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		if (feature instanceof EReference && child instanceof EObject) {
-			EReference reference = (EReference) feature;
-			EClass parentClass = reference.getEContainingClass();
-			EClass childClass = ((EObject) child).eClass();
-			String name = "full/ctool16/Create" + parentClass.getName() + "_" + reference.getName() + "_" + childClass.getName(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			try {
-				return LibraryEditPlugin.INSTANCE.getImage(name);
-			} catch (MissingResourceException e) {
-				System.err.println(e.getMessage());
-				return null;
-			}
-		}
-
-		return EMFEditPlugin.INSTANCE.getImage("full/ctool16/CreateChild"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-
-		// String label = TngUtil.getLabel(object,
-		// getString("_UI_RoleSetGrouping_type"));
-		// ContentCategory category = (ContentCategory) object;
-		// if(category.getVariabilityBasedOnElement() != null) {
-		// MethodPlugin basePlugin =
-		// UmaUtil.getMethodPlugin(category.getVariabilityBasedOnElement());
-		// if(basePlugin != null) {
-		// label = label + " (inherited from " + basePlugin.getName() + ')';
-		// }
-		// }
-		// return label;
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_RoleSetGrouping_type"), true); //$NON-NLS-1$
-
-	}
-
-	// protected void updateChildren(Notification notification) {
-	// EObject object = (EObject)notification.getNotifier();
-	// ChildrenStore childrenStore = getChildrenStore(object);
-	//		
-	// if (childrenStore != null)
-	// {
-	// EStructuralFeature feature =
-	// (EStructuralFeature)notification.getFeature();
-	// EList children = childrenStore.getList(feature);
-	// if (children != null)
-	// {
-	// int index = notification.getPosition();
-	//				
-	// switch (notification.getEventType())
-	// {
-	// case Notification.REMOVE:
-	// {
-	// EList values = (EList)object.eGet(feature);
-	//						
-	// if (values.size() == 0)
-	// {
-	// disposeWrappers(children);
-	// return;
-	// }
-	// break;
-	// }
-	// }
-	// }
-	// }
-	//		
-	// super.updateChildren(notification);
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.RoleSetGroupingItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		//TngUtil.setDefaultName(this, notification);
-		setDefaultName(notification);
-		
-		updateChildren(notification);
-
-		ContentPackage pkg;
-		switch (notification.getFeatureID(RoleSetGrouping.class)) {
-		case UmaPackage.ROLE_SET_GROUPING__ROLE_SETS:
-
-			pkg = (ContentPackage) ((EObject) notification.getNotifier())
-					.eContainer();
-			RoleSet roleSet;
-			boolean refreshParent = false;
-			switch (notification.getEventType()) {
-			case Notification.ADD:
-				roleSet = (RoleSet) notification.getNewValue();
-				if (roleSet.eContainer() == null) {
-					pkg.getContentElements().add(roleSet);
-				} else if (roleSet.eContainer() == pkg) {
-					refreshParent = true;
-				}
-				break;
-			case Notification.ADD_MANY:
-				for (Iterator iter = ((Collection) notification.getNewValue())
-						.iterator(); iter.hasNext();) {
-					roleSet = (RoleSet) iter.next();
-					if (roleSet.eContainer() == null) {
-						pkg.getContentElements().add(roleSet);
-					} else if (roleSet.eContainer() == pkg) {
-						refreshParent = true;
-					}
-				}
-				break;
-			case Notification.REMOVE:
-			case Notification.REMOVE_MANY:
-				refreshParent = true;
-				break;
-			}
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			if (refreshParent) {
-				fireNotifyChanged(new ViewerNotification(notification,
-						getParent(target), true, false));
-			}
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		// for (Iterator iter = children.iterator(); iter.hasNext();) {
-		// RoleSet child = (RoleSet) iter.next();
-		// RoleSetItemProvider itemProvider = (RoleSetItemProvider)
-		// adapterFactory.adapt(child, ITreeItemContentProvider.class);
-		// itemProvider.setParent(object);
-		// }
-		if (children instanceof List)
-			Collections.sort((List) children, PresentationContext.INSTANCE.getComparator());
-		return children;
-
-		// return createWrappers(children);
-	}
-
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-
-	// protected Object createWrapper(Object object) {
-	// Object wrapper = TngUtil.createWrapper(adapterFactory, (EObject) target,
-	// UmaPackage.eINSTANCE.getRoleSetGrouping_RoleSets(), object, -1);
-	// if(wrappers == null) {
-	// wrappers = new Disposable();
-	// }
-	// wrappers.add(wrapper);
-	// return wrapper;
-	// }
-
-	protected Collection createWrappers(Collection objects) {
-		if (children == null) {
-			children = new Disposable();
-		}
-		FeatureValueWrapperItemProvider.fill(children, null, objects, target,
-				adapterFactory);
-		ArrayList list = new ArrayList(children);
-		return list;
-	}
-
-	public void dispose() {
-		if (children != null) {
-			children.dispose();
-		}
-
-		super.dispose();
-	}
-	
-	public void setDefaultName(Notification msg) {
-		IDefaultNameSetter defaultNameSetter = this;
-		if (defaultNameSetter.getInterestedFeatureOwnerClass() != null) {
-			int featureId = msg.getFeatureID(defaultNameSetter
-					.getInterestedFeatureOwnerClass());
-			if (featureId == defaultNameSetter.getInterestedFeatureID()) {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					setDefaultName(msg.getNewValue(), msg.getNotifier());
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						setDefaultName(iter.next(), msg.getNotifier());
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	private void setDefaultName(Object obj, Object parent) {
-		String baseName = null;
-		if (obj instanceof RoleSet) {
-			baseName = LibraryEditConstants.NEW_ROLE_SET;
-		}
-		if (baseName != null) {
-			// Making plugin level uniqueness of roleset, on removing roleset reference 
-			// from roleset grouping, roleset goes back to toplevel causing duplicate. 
-			TngUtil.setDefaultName(TngUtil.extract(
-					((ContentPackage) (((RoleSetGrouping) parent)
-							.eContainer())).getContentElements(),
-							RoleSet.class), (MethodElement) obj,
-					LibraryEditConstants.NEW_ROLE_SET);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof RoleSet) {
-			baseName = LibraryEditConstants.NEW_ROLE_SET;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((RoleSetGrouping) target).getRoleSets(),
-					(MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.ROLE_SET_GROUPING__ROLE_SETS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureOwnerClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return RoleSetGrouping.class;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IMethodElementItemProvider#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetItemProvider.java
deleted file mode 100644
index 76f4b1d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetItemProvider.java
+++ /dev/null
@@ -1,248 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a role set.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleSetItemProvider extends
-		org.eclipse.epf.uma.provider.RoleSetItemProvider implements
-		ILibraryItemProvider, IStatefulItemProvider {
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.RoleSetItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null) {
-			return parent;
-		}
-		if (object instanceof EObject) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-			if (plugin != null) {
-				String[] path = {
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Content_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Role_Sets_group") //$NON-NLS-1$
-				};
-
-				return TngUtil.getAdapter(plugin, path);
-			}
-		}
-
-		return super.getParent(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		// if(childrenFeatures == null) {
-		// childrenFeatures = new ArrayList();
-		// childrenFeatures.add(UmaPackage.eINSTANCE.getRoleSet_Roles());
-		// }
-		// return childrenFeatures;
-
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		switch (notification.getFeatureID(RoleSet.class)) {
-		case UmaPackage.METHOD_ELEMENT__NAME:
-			TngUtil.refreshContributors(this, notification, false, true);
-			break;
-		case UmaPackage.ROLE_SET__ROLES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-
-			// refresh wrappers
-			//
-			if (wrappers != null) {
-				for (Iterator iter = new ArrayList(wrappers).iterator(); iter
-						.hasNext();) {
-					fireNotifyChanged(new ViewerNotification(notification, iter
-							.next(), true, false));
-				}
-			}
-
-			// refresh uncategorized roles
-			//
-			// TngUtil.refreshAdapter(LibraryEditConstants.UNCATEGORIZED_ROLES_PATH,
-			// notification);
-
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_RoleSet_type"), true); //$NON-NLS-1$
-	}
-
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-
-	public List getNotifyChangedListeners() {
-		if(changeNotifier instanceof Collection) {
-			return new ArrayList((Collection) changeNotifier);
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	
-	// Change Categories display in Library Navigator
-	// Add below method to avoid children for this ItemProvider. +
-	// sign too.
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		return false;
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	// */
-	// public Collection getChildren(Object object) {
-	// List newChildren = new ArrayList();
-	// RoleSet roleSet = (RoleSet) object;
-	// for (Iterator iter = roleSet.getRoles().iterator(); iter.hasNext();) {
-	// Role role = (Role) iter.next();
-	// // look if there is an existing ObjectLinkItemProvider for this task in
-	// the current children list first
-	// //
-	// ObjectLinkItemProvider child = findExistingObjectLinkItemProvider(role);
-	// if(child == null) {
-	// child = new ObjectLinkItemProvider(adapterFactory, object, role);
-	// }
-	// else {
-	// children.remove(child);
-	// }
-	// newChildren.add(child);
-	// }
-	// // dispose the old children
-	// //
-	// if(children != null) {
-	// for (Iterator iter = children.iterator(); iter.hasNext();) {
-	// ObjectLinkItemProvider child = (ObjectLinkItemProvider) iter.next();
-	// child.dispose();
-	// }
-	// }
-	// children = newChildren;
-	// return children;
-	// }
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		// return new MethodElementAddCommand((AddCommand)
-		// super.createAddCommand(domain, owner, feature, collection, index));
-		return UnexecutableCommand.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetsItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetsItemProvider.java
deleted file mode 100644
index b408e07..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/RoleSetsItemProvider.java
+++ /dev/null
@@ -1,167 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Role Sets" folder.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleSetsItemProvider extends TransientCategoryPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetsItemProvider(AdapterFactory adapterFactory,
-			ContentPackage target, String name) {
-		super(adapterFactory, target, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.category.TransientCategoryPackageItemProvider#isInherited(org.eclipse.epf.uma.ContentCategory)
-	 */
-	protected boolean isInherited(ContentCategory category) {
-		return (category instanceof RoleSetGrouping || category instanceof RoleSet)
-				&& category.getVariabilityBasedOnElement() != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createRoleSetGrouping()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createRoleSet()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return accept(obj);
-	}
-
-	public static boolean accept(Object obj) {
-		if (obj instanceof RoleSetGrouping) {
-			return true;
-		}
-		if (obj instanceof RoleSet) {
-			List groups = AssociationHelper.getRoleSetGroups((RoleSet) obj);
-			if (groups.isEmpty()) {
-				return true;
-			} else {
-				for (Object group : groups) {
-					if (group instanceof RoleSetGrouping) {
-						if (UmaUtil.getMethodPlugin((RoleSetGrouping)group) == UmaUtil.getMethodPlugin((RoleSet)obj)) {
-							return false;
-						}
-					}
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Roles"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Role_Sets_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		return  super.getChildren(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof RoleSetGrouping) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), RoleSetGrouping.class),
-					(MethodElement) obj,
-					LibraryEditConstants.NEW_ROLE_SET_GROUPING);
-		} else if (obj instanceof RoleSet) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), RoleSet.class), (MethodElement) obj,
-					LibraryEditConstants.NEW_ROLE_SET);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/StandardCategoriesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/StandardCategoriesItemProvider.java
deleted file mode 100644
index 5eff530..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/StandardCategoriesItemProvider.java
+++ /dev/null
@@ -1,264 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Element;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Standard Categories" folder.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class StandardCategoriesItemProvider extends TransientGroupItemProvider
-		implements IGroupContainer {
-
-	private ArrayList children;
-
-	private Map groupItemProviderMap;
-
-	public StandardCategoriesItemProvider(AdapterFactory adapterFactory,
-			Notifier parent, String name) {
-		super(adapterFactory, parent, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getMethodPackage_ChildPackages(),
-		// UmaFactory.eINSTANCE.createContentPackage()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodPackage_ChildPackages());
-		}
-		return childrenFeatures;
-	}
-
-	protected boolean acceptAsChild(Object obj) {
-		return obj instanceof ContentPackage;
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE
-				.getImage("full/obj16/StandardCategories"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		if (msg.getNotifier() == target) {
-			int featureId = msg.getFeatureID(ContentPackage.class);
-			if (featureId == UmaPackage.CONTENT_PACKAGE__CHILD_PACKAGES) {
-				boolean notify = false;
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.MOVE:
-					Object obj = msg.getNewValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.REMOVE:
-					obj = msg.getOldValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.ADD_MANY:
-					Collection collection = (Collection) msg.getNewValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					collection = (Collection) msg.getOldValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-
-				}
-				if (notify) {
-					fireNotifyChanged(new ViewerNotification(msg, this, true,
-							false));
-				}
-			}
-		}
-		super.notifyChanged(msg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		// if(obj instanceof ContentPackage) {
-		// TngUtil.setDefaultName(((ContentPackage)target).getChildPackages(),
-		// (MethodElement) obj, "New Content Package");
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.CONTENT_PACKAGE__CHILD_PACKAGES;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureOwnerClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return ContentPackage.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-			groupItemProviderMap = new HashMap();
-			String name;
-			ILibraryItemProvider child;
-
-			// create the disciplines categories folder
-			MethodPlugin plugin = UmaUtil
-					.getMethodPlugin((Element) ((ItemProviderAdapter) object)
-							.getTarget());
-			ContentPackage contentPkg = UmaUtil.findContentPackage(plugin,
-					ModelStructure.DEFAULT.disciplineDefinitionPath);
-			if (contentPkg != null) {
-				name = LibraryEditPlugin.INSTANCE
-						.getString("_UI_Disciplines_group"); //$NON-NLS-1$
-				child = new DisciplineCategoriesItemProvider(adapterFactory,
-						contentPkg, name);
-				child.setParent(this);
-				children.add(child);
-				groupItemProviderMap.put(name, child);
-
-			}
-
-			// create domain categories folder
-			contentPkg = UmaUtil.findContentPackage(plugin,
-					ModelStructure.DEFAULT.domainPath);
-			if (contentPkg != null) {
-				name = LibraryEditPlugin.INSTANCE
-						.getString("_UI_Domains_group"); //$NON-NLS-1$
-				child = new DomainsItemProvider(adapterFactory, contentPkg,
-						name);
-				child.setParent(this);
-				children.add(child);
-				groupItemProviderMap.put(name, child);
-			}
-
-			// create work product types folder
-			contentPkg = UmaUtil.findContentPackage(plugin,
-					ModelStructure.DEFAULT.workProductTypePath);
-			if (contentPkg != null) {
-				name = LibraryEditPlugin.INSTANCE
-						.getString("_UI_WorkProductTypes_group"); //$NON-NLS-1$
-				child = new WorkProductTypesItemProvider(adapterFactory,
-						contentPkg, name);
-				child.setParent(this);
-				children.add(child);
-				groupItemProviderMap.put(name, child);
-			}
-
-			// create role set folder
-			contentPkg = UmaUtil.findContentPackage(plugin,
-					ModelStructure.DEFAULT.roleSetPath);
-			if (contentPkg != null) {
-				name = LibraryEditPlugin.INSTANCE
-						.getString("_UI_Role_Sets_group"); //$NON-NLS-1$
-				child = new RoleSetsItemProvider(adapterFactory, contentPkg,
-						name);
-				child.setParent(this);
-				children.add(child);
-				groupItemProviderMap.put(name, child);
-			}
-
-			// create tool folder
-			contentPkg = UmaUtil.findContentPackage(plugin,
-					ModelStructure.DEFAULT.toolPath);
-			if (contentPkg != null) {
-				name = LibraryEditPlugin.INSTANCE.getString("_UI_Tools_group"); //$NON-NLS-1$
-				child = new ToolsItemProvider(adapterFactory, contentPkg, name);
-				child.setParent(this);
-				children.add(child);
-				groupItemProviderMap.put(name, child);
-			}
-		}
-		return children;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
-	 */
-	public Object getGroupItemProvider(String name) {
-		return groupItemProviderMap.get(name);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/ToolItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/ToolItemProvider.java
deleted file mode 100644
index 4a596b9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/ToolItemProvider.java
+++ /dev/null
@@ -1,174 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter a tool.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ToolItemProvider extends org.eclipse.epf.uma.provider.ToolItemProvider
-		implements ILibraryItemProvider, IStatefulItemProvider {
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ToolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null) {
-			return parent;
-		}
-
-		if (object instanceof EObject) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-			if (plugin != null) {
-				String[] path = {
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Content_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE.getString("_UI_Tools_group") //$NON-NLS-1$
-				};
-
-				return TngUtil.getAdapter(plugin, path);
-			}
-		}
-
-		return super.getParent(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE.getTool_ToolMentors());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		switch (notification.getFeatureID(Discipline.class)) {
-		case UmaPackage.METHOD_ELEMENT__NAME:
-			TngUtil.refreshContributors(this, notification, false, true);
-			break;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_Tool_type"), true); //$NON-NLS-1$
-	}
-
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		return false;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/ToolsItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/ToolsItemProvider.java
deleted file mode 100644
index 0263481..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/ToolsItemProvider.java
+++ /dev/null
@@ -1,134 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the "Tools" folder.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ToolsItemProvider extends TransientCategoryPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ToolsItemProvider(AdapterFactory adapterFactory,
-			ContentPackage target, String name) {
-		super(adapterFactory, target, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createTool()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return obj instanceof Tool;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Tools"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		// for (Iterator iter = children.iterator(); iter.hasNext();) {
-		// Tool child = (Tool) iter.next();
-		// ToolItemProvider itemProvider = (ToolItemProvider)
-		// TngUtil.getBestAdapterFactory(adapterFactory).adapt(child,
-		// ITreeItemContentProvider.class);
-		// itemProvider.setParent(object);
-		// }
-
-		// Change Categories display in Library Navigator
-		// (commented for this defect)
-		// MethodPlugin plugin = UmaUtil.getMethodPlugin((Element)
-		// ((ItemProviderAdapter)object).getTarget());
-		// ContentPackage coreContentPkg = UmaUtil.findContentPackage(plugin,
-		// ModelStructure.DEFAULT.coreContentPath);
-		// UncategorizedToolMentorsItemProvider uncategorized = new
-		// UncategorizedToolMentorsItemProvider(adapterFactory, coreContentPkg);
-		// children.add(uncategorized);
-		// if(groupItemProviderMap == null) {
-		// groupItemProviderMap = new HashMap();
-		// }
-		// groupItemProviderMap.put(uncategorized.getText(null), uncategorized);
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof Tool) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), Tool.class), (MethodElement) obj,
-					LibraryEditConstants.NEW_TOOL);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/TransientCategoryPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/TransientCategoryPackageItemProvider.java
deleted file mode 100644
index e77289f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/TransientCategoryPackageItemProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the category folders.
- * <p>
- * This class will be renamed as CategoriesItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class TransientCategoryPackageItemProvider extends
-		TransientGroupItemProvider implements IGroupContainer {
-
-	protected Map groupItemProviderMap;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TransientCategoryPackageItemProvider(AdapterFactory adapterFactory,
-			Notifier parent, String name) {
-		super(adapterFactory, parent, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		Object uncategorized = createUncategorizedItemProvider();
-		if (uncategorized != null) {
-			children.add(uncategorized);
-		}
-		return children;
-	}
-
-	/**
-	 * @return
-	 */
-	protected Object createUncategorizedItemProvider() {
-		return null;
-	}
-
-	public void notifyChanged(Notification msg) {
-		if (msg.getNotifier() == target) {
-			int featureId = msg.getFeatureID(ContentPackage.class);
-			if (featureId == UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS) {
-				boolean notify = false;
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.MOVE:
-					Object obj = msg.getNewValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.REMOVE:
-					obj = msg.getOldValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.ADD_MANY:
-					Collection collection = (Collection) msg.getNewValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					collection = (Collection) msg.getOldValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-				}
-				if (notify) {
-					fireNotifyChanged(new ViewerNotification(msg, this, true,
-							false));
-				}
-			}
-		}
-		super.notifyChanged(msg);
-	}
-
-	protected boolean isInherited(ContentCategory category) {
-		return acceptAsChild(category)
-				&& category.getVariabilityBasedOnElement() != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return ContentPackage.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
-	 */
-	public Object getGroupItemProvider(String name) {
-		if (groupItemProviderMap == null)
-			return null;
-		return groupItemProviderMap.get(name);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/WorkProductTypeItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/WorkProductTypeItemProvider.java
deleted file mode 100644
index 060eca7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/WorkProductTypeItemProvider.java
+++ /dev/null
@@ -1,208 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.IWrapper;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Theitem provider adapter for a work product kind.
- * <p>
- * This class will be renamed as WorkProductKindItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductTypeItemProvider extends
-		org.eclipse.epf.uma.provider.WorkProductTypeItemProvider implements
-		ILibraryItemProvider, IWrapper, IStatefulItemProvider {
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null) {
-			return parent;
-		}
-
-		if (object instanceof EObject) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-			if (plugin != null) {
-				String[] path = {
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Content_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-						,
-						LibraryEditPlugin.INSTANCE
-								.getString("_UI_WorkProductTypes_group") //$NON-NLS-1$
-				};
-
-				return TngUtil.getAdapter(plugin, path);
-			}
-		}
-
-		return super.getParent(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getWorkProductType_WorkProducts());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		switch (notification.getFeatureID(Discipline.class)) {
-		case UmaPackage.METHOD_ELEMENT__NAME:
-			TngUtil.refreshContributors(this, notification, false, true);
-			break;
-		case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel((VariabilityElement) object,
-				getString("_UI_WorkProductType_type"), true); //$NON-NLS-1$
-	}
-
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		if (!isWrappingNeeded(object))
-			return value;
-		if (value instanceof Artifact) {
-			return new FeatureValueWrapperItemProvider(feature, value, object,
-					adapterFactory) {
-				public boolean hasChildren(Object object) {
-					return false;
-				}
-			};
-		}
-		return TngUtil.createWrapper(adapterFactory, object, feature, value,
-				index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		// Change Categories display in Library Navigator
-		// return !((WorkProductType) object).getWorkProducts().isEmpty();
-		return false;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#wrap(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int)
-	 */
-	public Object wrap(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		return super.wrap(object, feature, value, index);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/WorkProductTypesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/WorkProductTypesItemProvider.java
deleted file mode 100644
index 1c0de28..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/WorkProductTypesItemProvider.java
+++ /dev/null
@@ -1,142 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.category;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * The item provider adapter for the "Work Product Kinds" folder.
- * <p>
- * This class will be renamed as WorkProductKindsItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductTypesItemProvider extends
-		TransientCategoryPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductTypesItemProvider(AdapterFactory adapterFactory,
-			ContentPackage target, String name) {
-		super(adapterFactory, target, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createWorkProductType()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return obj instanceof WorkProductType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/WorkProducts"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-
-		// for (Iterator iter = children.iterator(); iter.hasNext();) {
-		// WorkProductType child = (WorkProductType) iter.next();
-		// WorkProductTypeItemProvider itemProvider =
-		// (WorkProductTypeItemProvider)
-		// TngUtil.getBestAdapterFactory(adapterFactory).adapt(child,
-		// ITreeItemContentProvider.class);
-		// itemProvider.setParent(object);
-		// }
-
-		// Change Categories display in Library Navigator
-		// (commented for this defect)
-		// MethodPlugin plugin = UmaUtil.getMethodPlugin((Element)
-		// ((ItemProviderAdapter)object).getTarget());
-		// ContentPackage coreContentPkg = UmaUtil.findContentPackage(plugin,
-		// ModelStructure.DEFAULT.coreContentPath);
-		// WorkProductTypeUncategorizedWorkProductItemProvider uncategorized =
-		// new
-		// WorkProductTypeUncategorizedWorkProductItemProvider(adapterFactory,
-		// coreContentPkg);
-		// children.add(uncategorized);
-		// if(groupItemProviderMap == null) {
-		// groupItemProviderMap = new HashMap();
-		// }
-		// groupItemProviderMap.put(uncategorized.getText(null), uncategorized);
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof WorkProductType) {
-			TngUtil.setDefaultName(TngUtil.extract(((ContentPackage) target)
-					.getContentElements(), WorkProductType.class),
-					(MethodElement) obj,
-					LibraryEditConstants.NEW_WORK_PRODUCT_TYPE);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/package.html
deleted file mode 100644
index 0376b2b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/category/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides display and editing support for standard and custom categories.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ActionManager.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ActionManager.java
deleted file mode 100644
index 60a3794..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ActionManager.java
+++ /dev/null
@@ -1,227 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-
-/**
- * Manages the execution of editing commands with full support for dirty flag,
- * undo and redo.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActionManager implements IActionManager {
-
-	protected static final Map RESOURCE_TO_MODIFIERS_MAP = new HashMap();
-
-	private EditingDomain editingDomain;
-
-	private FullyRevertibleCommandStack commandStack;
-
-	public ActionManager() {
-		commandStack = createCommandStack();
-		editingDomain = new AdapterFactoryEditingDomain(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory(),
-				commandStack);
-	}
-
-	protected FullyRevertibleCommandStack createCommandStack() {
-		return new FullyRevertibleCommandStack(this);
-	}
-
-	protected void registerAsModifierOf(EObject object) {
-		Resource resource = object.eResource();
-		if (resource == null)
-			return;
-		registerAsModifierOf(resource);
-	}
-
-	protected void registerAsModifierOf(Resource resource) {
-		synchronized (RESOURCE_TO_MODIFIERS_MAP) {
-			Set mods = (Set) RESOURCE_TO_MODIFIERS_MAP.get(resource);
-			if (mods == null) {
-				mods = new HashSet();
-				RESOURCE_TO_MODIFIERS_MAP.put(resource, mods);
-			}
-			mods.add(this);
-		}
-	}
-
-	protected void unregisterAsModifier() {
-		synchronized (RESOURCE_TO_MODIFIERS_MAP) {
-			for (Iterator iter = getModifiedResources().iterator(); iter
-					.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				Set mods = (Set) RESOURCE_TO_MODIFIERS_MAP.get(resource);
-				if (mods != null) {
-					mods.remove(this);
-					if (mods.isEmpty()) {
-						// save the resource before it removed from
-						// RESOURCE_TO_MODIFIERS_MAP
-						// 
-						save(resource);
-						RESOURCE_TO_MODIFIERS_MAP.remove(resource);
-					}
-				}
-			}
-		}
-	}
-
-	public boolean doAction(int actionType, EObject object,
-			EStructuralFeature feature, Object value, int index) {
-		Command cmd = null;
-		Object oldValue = null;
-		switch (actionType) {
-		case ADD: {
-			if (index >= 0) {
-				cmd = new AddCommand(editingDomain, object, feature, value,
-						index);
-			} else {
-				cmd = new AddCommand(editingDomain, object, feature, value);
-			}
-			break;
-		}
-		case ADD_MANY: {
-			if (index >= 0) {
-				cmd = new AddCommand(editingDomain, object, feature,
-						(Collection) value, index);
-			} else {
-				cmd = new AddCommand(editingDomain, object, feature,
-						(Collection) value);
-			}
-			break;
-		}
-		case REMOVE: {
-			cmd = new RemoveCommand(editingDomain, object, feature, value);
-			break;
-		}
-		case REMOVE_MANY: {
-			cmd = new RemoveCommand(editingDomain, object, feature,
-					(Collection) value);
-			break;
-		}
-		case SET: {
-			oldValue = object.eGet(feature);
-			if ((oldValue != null && !oldValue.equals(value))
-					|| (oldValue == null && value != null)) {
-				cmd = new SetCommand(editingDomain, object, feature, value);
-			}
-			break;
-		}
-		}
-		if (cmd != null) {
-			return commandStack.doExecute(cmd);
-		}
-		return false;
-	}
-
-	public void undo() {
-		commandStack.undo();
-	}
-
-	public void redo() {
-		commandStack.redo();
-	}
-
-	public boolean undoAll() {
-		boolean b = commandStack.undoAll();
-		unregisterAsModifier();
-		// fireNotifyChanged(null);
-		return b;
-	}
-
-	public void saveIsDone() {
-		commandStack.saveIsDone();
-		unregisterAsModifier();
-		// fireNotifyChanged(null);
-	}
-
-	public boolean isSaveNeeded() {
-		boolean ret = commandStack.isSaveNeeded();
-		if (!ret)
-			return false;
-		if (getModifiedResources().isEmpty())
-			return false;
-		return ret;
-	}
-
-	public void dispose() {
-		commandStack.flush();
-	}
-
-	public Collection getModifiedResources() {
-		synchronized (RESOURCE_TO_MODIFIERS_MAP) {
-			Collection modifiedResources = new HashSet();
-			for (Iterator iter = RESOURCE_TO_MODIFIERS_MAP.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Set mods = (Set) entry.getValue();
-				if (mods.contains(this)) {
-					modifiedResources.add(entry.getKey());
-				}
-			}
-			return modifiedResources;
-		}
-	}
-
-	// public void fireNotifyChanged(Notification notification) {
-	// changeNotifier.fireNotifyChanged(notification);
-	// }
-	//
-	// public void addListener(INotifyChangedListener notifyChangedListener) {
-	// changeNotifier.add(notifyChangedListener);
-	// }
-	//
-	// public void removeListener(INotifyChangedListener notifyChangedListener)
-	// {
-	// changeNotifier.remove(notifyChangedListener);
-	// }
-
-	/**
-	 * Does nothing here, subclass should implement to provide saving the
-	 * resource before it got removed from RESOURCE_TO_MODIFIERS_MAP
-	 * 
-	 * @param resource
-	 */
-	protected void save(Resource resource) {
-	}
-
-	public CommandStack getCommandStack() {
-		return commandStack;
-	}
-
-	public boolean execute(IResourceAwareCommand cmd) {
-		if (cmd != null) {
-			return commandStack.doExecute(cmd);
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/AddToCategoryCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/AddToCategoryCommand.java
deleted file mode 100644
index 2a5cb8a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/AddToCategoryCommand.java
+++ /dev/null
@@ -1,262 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * This command is used to assign a method element to a category. If the category
- * is in a base method plug-in of the element, this command will automatically
- * create a contributor to the base category and assign the element to the
- * contributing category. This is avoids modifying the base method plug-in.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class AddToCategoryCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private ContentCategory category;
-
-	private EStructuralFeature feature;
-
-	private MethodElement element;
-
-	private String[] categoryPkgPath;
-
-	private boolean checkForExistingContributor;
-
-	private ContentCategory usedCategory = null;
-
-	private boolean createNewContributor = false;
-
-	private ContentPackage categoryPkg;
-
-	private Collection modifiedResources;
-
-	private Object oldOppositeFeatureValue;
-	
-	private List usedCategories;
-
-	public AddToCategoryCommand(ContentCategory category,
-			MethodElement element, EStructuralFeature feature,
-			String[] categoryPkgPath, boolean checkForExistingContributor,
-			List usedCategories) {
-		this.category = category;
-		this.feature = feature;
-		this.element = element;
-		this.categoryPkgPath = categoryPkgPath;
-		this.checkForExistingContributor = checkForExistingContributor;
-		this.usedCategories = usedCategories;
-	}
-
-	protected boolean prepare() {
-		// check if this operation will modify the element in opposite feature
-		// value
-		//
-		return UserInteractionHelper.checkModifyOpposite(category, feature,
-				element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getLabel()
-	 */
-	public String getLabel() {
-		return "Add To Category"; //$NON-NLS-1$
-	}
-
-	public void execute() {
-		// create contributor for category if it is not in the same plugin with
-		// the element
-		//
-		MethodPlugin elementPlugin = UmaUtil.getMethodPlugin(element);
-		MethodPlugin categoryPlugin = UmaUtil.getMethodPlugin(category);
-		if (categoryPlugin != elementPlugin
-				&& Misc.isBaseOf(categoryPlugin, elementPlugin)) {
-			if (category.getVariabilityBasedOnElement() != null) {
-				throw new IllegalArgumentException(
-						"Could not add element to an extended category that is in a different plug-in: " + category); //$NON-NLS-1$
-			}
-			if (!feature.isMany()) {
-				throw new UnsupportedOperationException();
-			}
-			categoryPkg = UmaUtil.findContentPackage(elementPlugin,
-					categoryPkgPath);
-			ContentCategory contrib = null;
-			if (checkForExistingContributor) {
-				// look for the existing contributor for the category
-				//
-				contrib = TngUtil.findContributor(categoryPkg, category);
-			}
-
-			if (contrib == null) {
-				createNewContributor = true;
-			} else {
-				usedCategory = contrib;
-			}
-		} else {
-			usedCategory = category;
-		}
-
-		modifiedResources = new HashSet();
-
-		redo();
-	}
-
-	public void redo() {
-		if (createNewContributor) {
-			ContentCategory contrib = (ContentCategory) UmaFactory.eINSTANCE
-					.create(category.eClass());
-			contrib.setVariabilityBasedOnElement(category);
-			contrib.setVariabilityType(VariabilityType.CONTRIBUTES_LITERAL);
-			categoryPkg.getContentElements().add(contrib);
-			usedCategory = contrib;
-			if (usedCategory instanceof CustomCategory) {
-				CustomCategory root = TngUtil.getRootCustomCategory(UmaUtil
-						.getMethodPlugin(usedCategory));
-				List list = root.getCategorizedElements();
-				list.add(usedCategory);
-				TngUtil.setDefaultName(root, (CustomCategory)usedCategory, category.getName());
-			} else {
-				usedCategory.setName(category.getName());
-			}
-		}
-		OppositeFeature oppositeFeature = OppositeFeature
-				.getOppositeFeature(feature);
-		MultiResourceEObject mrEObj = (MultiResourceEObject) element;
-		oldOppositeFeatureValue = mrEObj.getOppositeFeatureMap().get(
-				oppositeFeature);
-		if (feature.isMany()) {
-			Collection collection = (Collection) usedCategory.eGet(feature);
-			if (oldOppositeFeatureValue != null && !oppositeFeature.isMany()) {
-				if (oldOppositeFeatureValue != usedCategory) {
-					EObject oldOppVal = (EObject) oldOppositeFeatureValue;
-					((Collection) oldOppVal.eGet(feature)).remove(element);
-					if (oldOppVal.eResource() != null) {
-						modifiedResources.add(oldOppVal.eResource());
-					}
-
-					collection.add(element);
-				}
-			}
-			if (!collection.contains(element)) {
-				collection.add(element);
-			}
-		} else {
-			if (oldOppositeFeatureValue != null && !oppositeFeature.isMany()) {
-				if (oldOppositeFeatureValue != usedCategory) {
-					EObject oldOppVal = (EObject) oldOppositeFeatureValue;
-					oldOppVal.eSet(feature, null);
-					if (oldOppVal.eResource() != null) {
-						modifiedResources.add(oldOppVal.eResource());
-					}
-				}
-			}
-			if (usedCategory != oldOppositeFeatureValue) {
-				usedCategory.eSet(feature, element);
-			}
-		}
-
-		if (usedCategory.eResource() != null) {
-			modifiedResources.add(usedCategory.eResource());
-		}
-		if (usedCategories.contains(category)) {
-			usedCategories.remove(category);
-		}
-	}
-
-	public void undo() {
-		OppositeFeature oppositeFeature = OppositeFeature
-				.getOppositeFeature(feature);
-		if (feature.isMany()) {
-			Collection collection = (Collection) usedCategory.eGet(feature);
-			collection.remove(element);
-		} else {
-			usedCategory.eSet(feature, null);
-		}
-
-		// restore old value of the single-value opposite feature
-		//
-		if (!oppositeFeature.isMany() && oldOppositeFeatureValue != null
-				&& oldOppositeFeatureValue != usedCategory) {
-			EObject oldOppVal = (EObject) oldOppositeFeatureValue;
-			if (feature.isMany()) {
-				((Collection) oldOppVal.eGet(feature)).add(element);
-			} else {
-				oldOppVal.eSet(feature, element);
-			}
-		}
-
-		if (createNewContributor) {
-			if (TngUtil.isEmpty(usedCategory)) {
-				MethodPlugin usedCategoryPlugin = UmaUtil.getMethodPlugin(usedCategory);
-				EcoreUtil.remove(usedCategory);
-				if (usedCategory instanceof CustomCategory) {
-					TngUtil.getRootCustomCategory(usedCategoryPlugin)
-							.getCategorizedElements().remove(usedCategory);
-				}
-				usedCategory = null;
-			}
-		}
-		if (!usedCategories.contains(category)) {
-			usedCategories.add(category);
-		}
-
-	}
-
-	public Collection getAffectedObjects() {
-		return Collections.singletonList(usedCategory);
-	}
-
-	public Collection getModifiedResources() {
-		
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=146662
-		// Below adding category's resource to modifiedResources is needed, 
-		// because before executing command, need to verify if resource is mutable or not
-		// getModifiedResources() called before executing actual execute() in few cases.
-		// Useful in special cases like if resource is in version control.
-		//
-		if(category != null && category.eResource() != null
-				&& modifiedResources == null){
-			modifiedResources = new HashSet();
-			modifiedResources.add(category.eResource());
-		}
-		
-		if (modifiedResources == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return modifiedResources;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/AddToSectionListCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/AddToSectionListCommand.java
deleted file mode 100644
index e05e525..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/AddToSectionListCommand.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.epf.library.edit.util.SectionList;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Section;
-
-/**
- * This command is used to add a new section to the section list.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class AddToSectionListCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private ContentElement contentElement;
-
-	private SectionList sectionList;
-
-	private Section section;
-
-	private Collection modifiedResources;
-
-	private boolean added;
-
-	public AddToSectionListCommand(ContentElement contentElement,
-			Section section, SectionList sectionList) {
-		this.contentElement = contentElement;
-		this.sectionList = sectionList;
-		this.section = section;
-
-		modifiedResources = new HashSet();
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		if (contentElement.getPresentation().eResource() != null) {
-			modifiedResources.add(contentElement.getPresentation().eResource());
-		}else{
-			// This check is done to bypass addition of section to method element
-			// for first time, if plugin.xmi file checked-out with version control. 
-			if(contentElement.eResource() != null){
-				modifiedResources.add(contentElement.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		if (contentElement == null)
-			return;
-		sectionList.add(section);
-		added = true;
-		sectionList.apply();
-
-	}
-
-	public void undo() {
-		if (added) {
-			sectionList.remove(section);
-			sectionList.apply();
-			added = false;
-		}
-	}
-
-	public Collection getAffectedObjects() {
-		return Collections.singletonList(contentElement);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/BatchCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/BatchCommand.java
deleted file mode 100644
index 91f168f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/BatchCommand.java
+++ /dev/null
@@ -1,225 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * This command is used to change the features of multiple objects in
- * a single batch.
- * 
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class BatchCommand extends AbstractCommand {
-	private Map objectToOldFeatureValuesMap;
-	private Map objectToNewFeatureValuesMap;
-	private boolean clear;
-	
-	/**
-	 * @param clear if true will clear the many-valued feature before adding new values 
-	 */
-	public BatchCommand(boolean clear) {
-		super();
-		this.clear = clear;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#canExecute()
-	 */
-	public boolean canExecute() {
-		return objectToNewFeatureValuesMap != null && !objectToNewFeatureValuesMap.isEmpty();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		if(objectToNewFeatureValuesMap == null || objectToNewFeatureValuesMap.isEmpty()) {
-			return;
-		}
-		
-		if(objectToOldFeatureValuesMap == null) {
-			objectToOldFeatureValuesMap = new HashMap();
-		}
-
-		for (Iterator iter = objectToNewFeatureValuesMap.entrySet()
-				.iterator(); iter.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			EObject eObj = (EObject) entry.getKey();
-			Map featureMap = (Map) entry.getValue();
-			for (Iterator iterator = featureMap.entrySet().iterator(); iterator
-					.hasNext();) {
-				entry = (Map.Entry) iterator.next();
-				EStructuralFeature feature = (EStructuralFeature) entry
-						.getKey();
-				if (feature.isMany()) {
-					if(clear) {
-						eObj.eSet(feature, entry.getValue());
-					}
-					else {
-						((List) eObj.eGet(feature)).addAll((Collection) entry.getValue());
-					}
-				} else {
-					Object oldValue = eObj.eGet(feature);
-					if (oldValue != entry.getValue()) {
-						saveOldFeatureValue(eObj, feature);
-						eObj.eSet(feature, entry.getValue());
-					}
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		if (objectToNewFeatureValuesMap != null && !objectToNewFeatureValuesMap.isEmpty()) {
-			for (Iterator iter = objectToNewFeatureValuesMap.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				EObject eObj = (EObject) entry.getKey();
-				Map featureMap = (Map) entry.getValue();
-				for (Iterator iterator = featureMap.entrySet().iterator(); iterator
-						.hasNext();) {
-					entry = (Map.Entry) iterator.next();
-					EStructuralFeature feature = (EStructuralFeature) entry
-							.getKey();
-					if (feature.isMany()) {
-						((List) eObj.eGet(feature))
-								.removeAll((Collection) entry.getValue());
-					}
-				}
-			}			
-		}
-
-		// restore old value
-		//
-		if (objectToOldFeatureValuesMap != null && !objectToOldFeatureValuesMap.isEmpty()) {
-			for (Iterator iter = objectToOldFeatureValuesMap.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				EObject eObj = (EObject) entry.getKey();
-				Map featureMap = (Map) entry.getValue();
-				for (Iterator iterator = featureMap.entrySet().iterator(); iterator
-						.hasNext();) {
-					entry = (Map.Entry) iterator.next();
-					EStructuralFeature feature = (EStructuralFeature) entry
-							.getKey();
-					eObj.eSet(feature, entry.getValue());
-				}
-			}
-			objectToOldFeatureValuesMap.clear();
-		}
-	}
-	
-	public void addFeatureValue(EObject obj, EStructuralFeature feature, Object value) {
-		addFeatureValue(getObjectToNewFeatureValuesMap(), obj, feature, value);
-	}
-	
-	/**
-	 * Adds values to a 'many' feature.
-	 * 
-	 * @param obj
-	 * @param feature the feature with many values
-	 * @param values
-	 */
-	public void addFeatureValues(EObject obj, EStructuralFeature feature, Collection values) {
-		addFeatureValues(getObjectToNewFeatureValuesMap(), obj, feature, values);
-	}
-
-	public Map getObjectToNewFeatureValuesMap() {
-		if(objectToNewFeatureValuesMap == null) {
-			objectToNewFeatureValuesMap = new HashMap();
-		}
-		return objectToNewFeatureValuesMap;
-	}
-	
-	protected void saveOldFeatureValue(EObject eObj,
-			EStructuralFeature feature) {
-		Object value = eObj.eGet(feature);
-		if(feature.isMany()) {
-			value = new ArrayList((List)value);
-		}
-		Map featureMap = (Map) objectToOldFeatureValuesMap.get(eObj);
-		if (featureMap == null) {
-			featureMap = new HashMap();
-			objectToOldFeatureValuesMap.put(eObj, featureMap);
-		}
-		featureMap.put(feature, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose() {
-		if(objectToNewFeatureValuesMap != null) {
-			objectToNewFeatureValuesMap.clear();
-			objectToNewFeatureValuesMap = null;
-		}
-		
-		if(objectToOldFeatureValuesMap != null) {
-			objectToOldFeatureValuesMap.clear();
-			objectToOldFeatureValuesMap = null;
-		}
-	}
-
-	public static void addFeatureValue(Map descriptorToNewFeatureValuesMap,
-			EObject object, EStructuralFeature feature, Object value) {
-		Map featureMap = (Map) descriptorToNewFeatureValuesMap.get(object);
-		if (featureMap == null) {
-			featureMap = new HashMap();
-			descriptorToNewFeatureValuesMap.put(object, featureMap);
-		}
-		if (feature.isMany()) {
-			List list = (List) featureMap.get(feature);
-			if (list == null) {
-				list = new ArrayList();
-				featureMap.put(feature, list);
-			}
-			list.add(value);
-		} else {
-			featureMap.put(feature, value);
-		}
-	}
-
-	public static void addFeatureValues(Map descriptorToNewFeatureValuesMap,
-			EObject object, EStructuralFeature feature, Collection values) {
-		Map featureMap = (Map) descriptorToNewFeatureValuesMap.get(object);
-		if (featureMap == null) {
-			featureMap = new HashMap();
-			descriptorToNewFeatureValuesMap.put(object, featureMap);
-		}
-		List list = (List) featureMap.get(feature);
-		if (list == null) {
-			list = new ArrayList();
-			featureMap.put(feature, list);
-		}
-		list.addAll(values);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/CommandStackChangedEvent.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/CommandStackChangedEvent.java
deleted file mode 100644
index 3e21773..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/CommandStackChangedEvent.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.EventObject;
-
-/**
- * Listens to changes to a commend stack.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class CommandStackChangedEvent extends EventObject {
-	
-	public static final int SAVED = 1;
-
-	public static final int EXECUTED = 2;
-
-	public static final int UNDO = 4;
-
-	public static final int UNDO_ALL = 8;
-
-	private int type;
-
-	public CommandStackChangedEvent(Object source, int type) {
-		super(source);
-		this.type = type;
-	}
-
-	public int getType() {
-		return type;
-	}
-
-	private static final long serialVersionUID = 3256727294604292916L;
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/CommandStatusChecker.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/CommandStatusChecker.java
deleted file mode 100644
index 9b4ef62..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/CommandStatusChecker.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Checks the status of an executed command.
- * 
- * @author Phong Nguyen Le - Oct 21, 2005
- * @since 1.0
- */
-public final class CommandStatusChecker {
-
-	public static final boolean hasRollbackError(IStatus status) {
-		return hasError(status, SaveStatus.ROLLBACK_ERROR);
-	}
-
-	public static final boolean hasSaveError(IStatus status) {
-		return hasError(status, SaveStatus.SAVE_ERROR);
-	}
-
-	public static final boolean hasError(IStatus status, int errCode) {
-		if (status == null)
-			return false;
-
-		IStatus[] statuses = status.getChildren();
-		boolean ret = false;
-		for (int i = 0; i < statuses.length; i++) {
-			IStatus childStatus = statuses[i];
-			if (childStatus instanceof SaveStatus
-					&& (childStatus.getCode() & errCode) == errCode) {
-				ret = true;
-				break;
-			}
-		}
-		return ret;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/DeleteMethodElementCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/DeleteMethodElementCommand.java
deleted file mode 100644
index e9091ae..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/DeleteMethodElementCommand.java
+++ /dev/null
@@ -1,1363 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandWrapper;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EContentsEList;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.ICommandListener;
-import org.eclipse.epf.library.edit.IReferencer;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This command is used to delete a method element permanently. This involves
- * deleting the storage content and removing all references to this element.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DeleteMethodElementCommand extends CommandWrapper {
-
-	protected Collection elements;
-
-	private boolean refRemoved;
-
-	public boolean executed = false;
-
-	private Collection commandListeners;
-
-	private FailSafeMethodLibraryPersister persister;
-
-	protected ArrayList elementsToDeleteContent;
-
-	protected Set<Resource> modifiedResources;
-
-	// Map of element to Map of its referencer to features list
-	//
-	protected Map<EObject, Map<EObject, Collection<EStructuralFeature>>> elementToRemovedRefsMap;
-
-	private BatchCommand batchCommand = new BatchCommand(true);
-
-	/**
-	 * List of Reference objects
-	 * 
-	 * @see Reference
-	 */
-	protected ArrayList removedReferences;
-
-	public boolean failed;
-
-	private boolean confirmRemoveReferences;
-	
-	private ArrayList<Command> nestedCommands;
-
-	private HashSet<Descriptor> descriptors;
-
-	/**
-	 * @param command
-	 * @param elements
-	 *            MethodElement objects to be permanently deleted.
-	 */
-	public DeleteMethodElementCommand(Command command, Collection elements) {
-		this(command, elements, true);
-	}
-
-	public DeleteMethodElementCommand(Command command, Collection elements,
-			boolean confirmRemoveRefs) {
-		super(command);
-		this.elements = elements == null ? null : new ArrayList(elements);
-		commandListeners = new ArrayList();
-		confirmRemoveReferences = confirmRemoveRefs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandWrapper#dispose()
-	 */
-	public void dispose() {
-		batchCommand.dispose();
-		if (commandListeners != null) {
-			commandListeners.clear();
-		}
-		if (elements != null) {
-			elements.clear();
-		}
-		if (elementsToDeleteContent != null) {
-			elementsToDeleteContent.clear();
-		}
-		if (elementToRemovedRefsMap != null) {
-			elementToRemovedRefsMap.clear();
-		}
-		if (modifiedResources != null) {
-			modifiedResources.clear();
-		}
-		if (removedReferences != null) {
-			removedReferences.clear();
-		}
-		// Dispose nested commands.
-		if(nestedCommands != null){
-			if(!nestedCommands.isEmpty()){
-				for (Command command : nestedCommands) {
-					command.dispose();
-				}
-			}
-		}
-		if(descriptors != null) {
-			descriptors.clear();
-		}
-		
-		super.dispose();
-	}
-
-	protected void superExecute() {
-		super.execute();
-	}
-
-	private void notifyPreExecute() {
-		List commandListeners = Providers
-				.getCommandListeners(DeleteMethodElementCommand.class);
-		if (commandListeners != null && !commandListeners.isEmpty()) {
-			for (Iterator iter = commandListeners.iterator(); iter.hasNext();) {
-				ICommandListener cmdListener = (ICommandListener) iter.next();
-				try {
-					cmdListener.preExecute(this);
-				} catch (Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-
-	private void notifyPreUndo() {
-		List commandListeners = Providers
-				.getCommandListeners(DeleteMethodElementCommand.class);
-		if (commandListeners != null && !commandListeners.isEmpty()) {
-			for (Iterator iter = commandListeners.iterator(); iter.hasNext();) {
-				ICommandListener cmdListener = (ICommandListener) iter.next();
-				try {
-					cmdListener.preUndo(this);
-				} catch (Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-
-	protected void prepareElements() {
-		ArrayList newElements = new ArrayList();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof CustomCategory) {
-				RemoveCommand cmd = getRemoveCommand(element);
-				if (cmd.getFeature() instanceof EReference
-						&& ((EReference) cmd.getFeature()).isContainment()
-						&& cmd.getOwnerList().contains(element)) {
-					// custom category will be deleted permanently
-					// find all subcategory that are not referenced by any other
-					// custom category
-					// in the same plugin to delete them as well
-					//
-					Collection collection = TngUtil
-							.getExclusiveSubCustomCategories((CustomCategory) element);
-					if (!collection.isEmpty()) {
-						for (Iterator iterator = collection.iterator(); iterator
-								.hasNext();) {
-							Object subCat = iterator.next();
-							if (!elements.contains(subCat)
-									&& !newElements.contains(subCat)) {
-//								cmd.getCollection().add(subCat);
-								Collection col = cmd.getCollection();
-								col.add(subCat);								
-								newElements.add(subCat);
-							}
-						}
-					}
-				}
-			}
-		}
-		elements.addAll(newElements);
-	}
-
-	/**
-	 * Gets the RemoveCommand for the given element
-	 * 
-	 * @param e
-	 * @return
-	 */
-	protected RemoveCommand getRemoveCommand(Object e) {
-		if (command instanceof RemoveCommand) {
-			if (((RemoveCommand) command).getCollection().contains(e)) {
-				return (RemoveCommand) command;
-			}
-		} else if (command instanceof CompoundCommand) {
-			for (Iterator iter = ((CompoundCommand) command).getCommandList()
-					.iterator(); iter.hasNext();) {
-				Object cmd = (Object) iter.next();
-				if (cmd instanceof RemoveCommand) {
-					RemoveCommand removeCommand = (RemoveCommand) cmd;
-					if (removeCommand.getCollection().contains(e)) {
-						return removeCommand;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public void execute() {
-		prepareElements();
-
-		notifyPreExecute();
-
-		elementsToDeleteContent = new ArrayList();
-		descriptors = new HashSet<Descriptor>();
-
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if (element instanceof MethodElement) {
-				collectObjectsToDeleteContent(elementsToDeleteContent,
-						(MethodElement) element);
-			}
-		}
-
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				prepareRemovingReferences();
-			}
-
-		};
-		UserInteractionHelper.runWithProgress(runnable,
-				LibraryEditResources.processingReferencesTask_name); 
-
-
-		if(!confirmRemovingReferences()) {
-			return;
-		}
-		
-		modifiedResources = new HashSet<Resource>();
-		Set unmodifiedResources = new HashSet();
-
-		// get the owner resources before the elements got removed from
-		// container in superExecute()
-		//
-		collectOwnerResources(modifiedResources, unmodifiedResources);
-
-		superExecute();
-		
-		executeNestedCommands();
-		
-		// Collect the nested command modified resources for saving. 
-		collectNestedCommandResources(modifiedResources);
-
-		// get resources of the objects that have been affected by this command
-		// until now
-		//
-		collectResources(modifiedResources, super.getAffectedObjects());
-
-		modifiedResources.removeAll(unmodifiedResources);
-
-		final Exception[] exceptions = new Exception[1];
-		UserInteractionHelper.getUIHelper().runWithBusyIndicator(new Runnable() {
-
-			public void run() {
-				try {
-					removeReferences();
-				} catch (Exception e) {
-					exceptions[0] = e;
-				}
-			}
-
-		});
-
-		if (exceptions[0] != null) {
-			Messenger.INSTANCE.showError(
-					LibraryEditResources.deleteDialog_title,
-					LibraryEditResources.deleteElementError_msg,
-					LibraryEditResources.deleteReferencesError_reason,
-					exceptions[0]);
-				
-			undo();
-			return;
-		}
-
-		modifiedResources.addAll(getReferencingResources());
-
-		for (Iterator iter = elementsToDeleteContent.iterator(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			if (element.eContainer() != null) {
-				iter.remove();
-			}
-		}
-
-		elementsToDeleteContent.addAll(elements);
-		
-		HashSet<Resource> deletedResources = new HashSet<Resource>();
-		for (Iterator iter = elementsToDeleteContent.iterator(); iter.hasNext();) {
-			Object obj = iter.next();
-			if (! (obj instanceof EObject)) {
-				obj = TngUtil.unwrap(obj);
-			}
-			if (obj instanceof EObject) {
-				EObject e = (EObject) obj;
-				UmaUtil.getResources(e, deletedResources);
-			}
-		}
-		
-		// exclude deleted resources from the set of modified resources
-		//
-		modifiedResources.removeAll(deletedResources);
-		
-		// exclude any resource that is contained by the deleted resources
-		//
-		for (Iterator iter = modifiedResources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			for (Iterator iterator = deletedResources.iterator(); iterator
-					.hasNext();) {
-				Resource deletedResource = (Resource) iterator.next();
-				if(getPersister().isContainedBy(resource, deletedResource)) {
-					iter.remove();
-				}
-			}
-		}		
-		
-		// check affected resources for unmodifiable
-		//
-		IStatus status = UserInteractionHelper.checkModify(modifiedResources,
-				LibraryEditPlugin.getDefault().getContext());
-		if (!status.isOK()) {
-			Messenger.INSTANCE.showError(
-					LibraryEditResources.deleteDialog_title,
-					LibraryEditResources.deleteElementError_msg, status);
-
-			undo();
-			return;
-		}
-		
-		runnable = new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				monitor.beginTask("", 3); //$NON-NLS-1$
-				getPersister();
-
-				// save resources that had been changed after references to the
-				// deleted elements
-				// had been removed
-				//
-				try {
-					monitor
-							.subTask(LibraryEditResources.deletingElementsTask_name);
-					monitor.worked(1);
-					deleteContent();
-
-					// save modified resources
-					//
-					monitor.subTask(LibraryEditResources.savingResources_msg);
-					monitor.worked(1);
-					for (Iterator iter = modifiedResources.iterator(); iter
-							.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						if (resource.isLoaded()) {
-							persister.save(resource);
-						}
-					}
-
-					persister.commit();
-
-					executed = true;
-
-					removeAdapters();
-				} catch (Exception e) {
-					LibraryEditPlugin.INSTANCE.log(e);
-					try {
-						persister.rollback();
-					} catch (Exception ex) {
-						failed = true;
-					}
-					if (e instanceof RuntimeException) {
-						throw (RuntimeException) e;
-					} else {
-						throw new WrappedException(e);
-					}
-				}
-			}
-
-		};
-
-		// if (!UserInteractionHelper.runWithProgress(runnable,
-		// LibraryEditResources.deletingElementsTask_name)) { //$NON-NLS-1$
-		// if (failed) {
-		// notifyFailure();
-		// } else {
-		// undo();
-		// }
-		// return;
-		// }
-
-//		UserInteractionHelper.runInUI(runnable, (Shell) null);
-		
-		UserInteractionHelper.runWithProgress(runnable, LibraryEditResources.deletingElementsTask_name);
-
-		if (executed) {
-			try {
-				List warnings = persister.getWarnings();
-				if (!warnings.isEmpty()) {
-					String title = LibraryEditResources.deleteDialog_title;
-					String msg = LibraryEditResources.DeleteMethodElementCommand_warningMsg;
-					StringBuffer reason = new StringBuffer();
-					for (Iterator iter = warnings.iterator(); iter.hasNext();) {
-						Exception e = (Exception) iter.next();
-						String str = e.getMessage();
-						if (!StrUtil.isBlank(str)) {
-							reason.append(str).append('\n');
-						}
-					}
-
-					Messenger.INSTANCE.showWarning(title, msg, reason
-							.toString());
-				}
-			} catch (Exception e) {
-				LibraryEditPlugin.getDefault().getLogger().logError(e);
-			}
-			
-			notifyExecuted();
-		} else {
-			if (failed) {
-				notifyFailure();
-			} else {
-				undo();
-			}
-		}
-	}
-
-	private boolean confirmRemovingReferences() {
-		if (!elementToRemovedRefsMap.isEmpty()) {
-			// collect set of referencers
-			HashSet<EObject> referencers = new HashSet<EObject>();
-			for (Map<EObject, Collection<EStructuralFeature>> referencerToFeaturesMap : elementToRemovedRefsMap.values()) {
-				// collect only referencer with an unidirectional or containment
-				// relationship
-				//
-				for (Map.Entry<EObject, Collection<EStructuralFeature>> entry : referencerToFeaturesMap.entrySet()) {
-					Collection<EStructuralFeature> features = entry.getValue();
-					boolean canCollect = false;
-					boolean hasDescriptor = false;
-					check_ref: for (EStructuralFeature f : features) {
-						if (!canCollect && f instanceof EReference) {
-							EReference ref = (EReference) f;
-							if (ref.isContainment()
-									|| ref.getEOpposite() == null) {
-								canCollect = true;
-							}
-						}
-						if(!hasDescriptor && (f == UmaPackage.eINSTANCE.getTaskDescriptor_Task()
-								|| f == UmaPackage.eINSTANCE.getRoleDescriptor_Role()
-								|| f == UmaPackage.eINSTANCE.getWorkProductDescriptor_WorkProduct())) {
-							hasDescriptor = true;
-						}
-						if(canCollect && hasDescriptor) {
-							break check_ref;							
-						}
-					}
-					if (canCollect) {
-						referencers.add(entry.getKey());
-					}
-					if(hasDescriptor && entry.getKey() instanceof Descriptor) {
-						descriptors.add((Descriptor) entry.getKey());
-					}
-				}
-			}
-
-			// confirm with user before removing illegal references
-			//
-			if (confirmRemoveReferences) {				
-				MultiStatus multiStatus = new MultiStatus(
-						LibraryEditPlugin.INSTANCE.getSymbolicName(), 0,
-						"", null); //$NON-NLS-1$
-				
-				if(!descriptors.isEmpty()) {
-					// ask user to delete the descriptors that are associated
-					// with the content element to be deleted
-					//
-					for (EObject e : descriptors) {
-						String msg = NLS.bind(
-								LibraryEditResources.elementType_text, TngUtil.getTypeText(e), TngUtil
-										.getLabelWithPath(e));
-						IStatus status = new Status(IStatus.INFO,
-								LibraryEditPlugin.INSTANCE.getSymbolicName(),
-								0, msg, null);
-						multiStatus.add(status);
-					}
-					IUserInteractionHandler uiHandler = ExtensionManager
-							.getDefaultUserInteractionHandler();
-					if (uiHandler != null) {
-						switch (uiHandler
-								.selectOne(
-										new int[] {
-												IUserInteractionHandler.ACTION_YES,
-												IUserInteractionHandler.ACTION_NO,
-												IUserInteractionHandler.ACTION_CANCEL },
-										LibraryEditResources.confirmDescriptorsDeletion_title,
-										LibraryEditResources.confirmDescriptorsDeletion_msg,
-										multiStatus)) {
-						case IUserInteractionHandler.ACTION_CANCEL:
-							return false;
-						case IUserInteractionHandler.ACTION_NO:
-							descriptors.clear();
-						}
-					}
-				}
-				
-				if(!descriptors.isEmpty()) {
-					// remove the descriptors that user wanted to delete from the referencers
-					//
-					referencers.removeAll(descriptors);
-				}
-				multiStatus = new MultiStatus(
-						LibraryEditPlugin.INSTANCE.getSymbolicName(), 0,
-						"", null); //$NON-NLS-1$
-				for (EObject e : referencers) {
-					// don't show predefined element
-					//
-					if (!(e instanceof MethodElement && TngUtil.isPredefined((MethodElement) e))) {
-						String msg = NLS.bind(
-								LibraryEditResources.elementType_text, TngUtil.getTypeText(e), TngUtil
-										.getLabelWithPath(e));
-						IStatus status = new Status(IStatus.INFO,
-								LibraryEditPlugin.INSTANCE.getSymbolicName(),
-								0, msg, null);
-						multiStatus.add(status);
-					}
-				}
-				if (multiStatus.getChildren().length > 0) {
-					IUserInteractionHandler uiHandler = ExtensionManager
-							.getDefaultUserInteractionHandler();
-					if (uiHandler != null) {
-						if (uiHandler
-								.selectOne(
-										new int[] {
-												IUserInteractionHandler.ACTION_OK,
-												IUserInteractionHandler.ACTION_CANCEL },
-										LibraryEditResources.deleteReferencesDialog_title,
-										LibraryEditResources.deleteReferencesDialog_text, multiStatus) == IUserInteractionHandler.ACTION_CANCEL) {
-							return false;
-						}
-					}
-				}
-			}
-
-			// check if the referencers can be changed
-			//
-			for (EObject e : referencers) {
-				IStatus status = UserInteractionHelper.checkModify(e, LibraryEditPlugin.getDefault().getContext());
-				if (!status.isOK()) {
-					Messenger.INSTANCE
-							.showError(
-									LibraryEditResources.deleteDialog_title,
-									LibraryEditResources.deleteElementError_msg,
-									status);
-					return false;
-				}
-			}
-		}
-		
-		return true;
-	}
-
-	/**
-	 * Disposes all stateful adapters, then removes all adapters that are
-	 * attached to the given element
-	 */
-	private static void removeAdapters(EObject element) {
-		for (Iterator iterator = new ArrayList(element.eAdapters()).iterator(); iterator
-				.hasNext();) {
-			Object adapter = iterator.next();
-			if (adapter instanceof IStatefulItemProvider) {
-				((IStatefulItemProvider) adapter).dispose();
-				if (adapter instanceof ItemProviderAdapter) {
-					AdapterFactory adapterFactory = ((ItemProviderAdapter) adapter)
-							.getAdapterFactory();
-					if (adapterFactory instanceof IReferencer) {
-						((IReferencer) adapterFactory).remove(adapter);
-					}
-				}
-			}
-		}
-		element.eAdapters().clear();
-	}
-
-	/**
-	 * Disposes all stateful adapters, then removes all adapters that are
-	 * attached to the deleted elements
-	 */
-	protected void removeAdapters() {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object obj = TngUtil.unwrap(iter.next());
-			if (obj instanceof EObject) {
-				EObject element = (EObject) obj;
-				if (element.eContainer() == null) {
-					for (Iterator iterator = element.eAllContents(); iterator
-							.hasNext();) {
-						EObject e = (EObject) iterator.next();
-						removeAdapters(e);
-					}
-					removeAdapters(element);
-				}
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void notifyFailure() {
-		EventObject eventObject = new EventObject(this);
-
-		for (Iterator iter = commandListeners.iterator(); iter.hasNext();) {
-			CommandListener listener = (CommandListener) iter.next();
-			listener.notifyFailure(eventObject);
-		}
-	}
-
-	/**
-	 * @return
-	 * 
-	 */
-	protected FailSafeMethodLibraryPersister getPersister() {
-		if (persister == null) {
-			persister = Services.getDefaultLibraryPersister()
-					.getFailSafePersister();
-		}
-		return persister;
-	}
-
-	private void notifyExecuted() {
-		EventObject eventObject = new EventObject(this);
-
-		for (Iterator iter = this.commandListeners.iterator(); iter.hasNext();) {
-			CommandListener listener = (CommandListener) iter.next();
-			listener.notifyExecuted(eventObject);
-		}
-
-		List commandListeners = Providers
-				.getCommandListeners(DeleteMethodElementCommand.class);
-		if (commandListeners != null && !commandListeners.isEmpty()) {
-			for (Iterator iter = commandListeners.iterator(); iter.hasNext();) {
-				ICommandListener cmdListener = (ICommandListener) iter.next();
-				try {
-					cmdListener.notifyExecuted(this);
-				} catch (Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-
-	private Collection getReferencingResources() {
-		HashSet referrers = new HashSet();
-
-		// for (Iterator iter = removedReferencesMap.values().iterator();
-		// iter.hasNext();) {
-		// Map referrerToFeaturesMap = (Map) iter.next();
-		// referrers.addAll(referrerToFeaturesMap.keySet());
-		// }
-
-		for (Iterator iter = removedReferences.iterator(); iter.hasNext();) {
-			Reference ref = (Reference) iter.next();
-			referrers.add(ref.owner);
-		}
-
-		HashSet resources = new HashSet();
-		for (Iterator iter = referrers.iterator(); iter.hasNext();) {
-			MethodElement element = (MethodElement) iter.next();
-			if (element.eResource() != null) {
-				resources.add(element.eResource());
-			}
-		}
-		return resources;
-	}
-
-	/**
-	 * Collects owner resources of the elements to be deleted to save later.
-	 * 
-	 * @param resources
-	 */
-	private void collectOwnerResources(Set resources, Set unmodifiedResources) {
-		ILibraryPersister persister = Services.getDefaultLibraryPersister();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if (element instanceof MethodElement) {
-				EObject container = ((MethodElement) element).eContainer();
-				Resource resource = container.eResource();
-				if (resource != null) {
-					if (persister.hasOwnResourceWithoutReferrer(element)) {
-						unmodifiedResources.add(resource);
-					} else {
-						resources.add(resource);
-					}
-				}
-			}
-		}
-	}
-	
-	private static void collectResources(Set resources, Collection objects) {
-		for (Iterator iter = objects.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if (element instanceof EObject) {
-				EObject eObj = (MethodElement) element;
-				if (eObj.eResource() != null) {
-					resources.add(eObj.eResource());
-				}
-			}
-		}
-	}
-
-	public void redo() {
-
-		super.redo();
-		removeReferences();
-
-	}
-
-	protected void deleteContent() throws Exception {
-		List<MethodElement> toDeleteList = new ArrayList<MethodElement>();
-		for (Iterator iter = elementsToDeleteContent.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if (element instanceof MethodElement) {
-				MethodElement e = (MethodElement) element;
-				if (e.eContainer() == null) {
-					toDeleteList.add(e);
-				}
-			}
-		}
-		persister.delete(toDeleteList);
-	}
-
-	public Collection getElementsToRemoveReferences() {
-		Collection list = new ArrayList();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if (element instanceof EObject
-					&& willRemoveElementFromContainer((EObject) element)) {
-				list.add(element);
-			}
-		}
-		return list;
-	}
-
-	protected boolean canRemoveReferences(MethodElement e) {
-		// if e is one of the deleted elements, make sure that it actually got
-		// deleted by checking its container
-		//
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object obj = TngUtil.unwrap(iter.next());
-			if (e == obj) {
-				return e.eContainer() == null;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Loads all opposite features of the elements to be deleted
-	 * 
-	 * @return list of elements whose opposite features are loaded
-	 */
-	public List loadOppositeFeatures() {
-		HashSet oppositeFeatures = new HashSet();
-		HashSet deletedGUIDs = new HashSet();
-		ArrayList elements = new ArrayList();
-
-		for (Iterator iter = getElementsToRemoveReferences().iterator(); iter
-				.hasNext();) {
-			Object obj = iter.next();
-			if (obj instanceof MethodElement) {
-				MethodElement e = (MethodElement) obj;
-				for (Iterator iterator = e.eAllContents(); iterator.hasNext();) {
-					Object element = iterator.next();
-					if (element instanceof MethodElement) {
-						elements.add(element);
-						Map oppositeFeatureMap = ((MultiResourceEObject) element)
-								.getOppositeFeatureMap();
-						if (oppositeFeatureMap != null
-								&& !oppositeFeatureMap.isEmpty()) {
-							oppositeFeatures
-									.addAll(oppositeFeatureMap.keySet());
-							deletedGUIDs.add(((MethodElement) element)
-									.getGuid());
-						}
-					}
-				}
-				elements.add(e);
-				Map oppositeFeatureMap = ((MultiResourceEObject) e)
-						.getOppositeFeatureMap();
-				if (oppositeFeatureMap != null && !oppositeFeatureMap.isEmpty()) {
-					oppositeFeatures.addAll(oppositeFeatureMap.keySet());
-					deletedGUIDs.add(((MethodElement) e).getGuid());
-				}
-			}
-		}
-
-		loadOppositeFeatures(new ArrayList(oppositeFeatures), deletedGUIDs);
-
-		return elements;
-	}
-
-	private boolean isContainedByDeletedElement(EObject e) {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object deleted = TngUtil.unwrap(iter.next());
-			if (deleted instanceof EObject && UmaUtil.isContainedBy(e, deleted)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Collects objects that should be removed if <code>elementToDelete</code>
-	 * will be removed from <code>references</code> of <code>referencer</code>.
-	 * 
-	 * @param objectsToRemove
-	 *            output
-	 * @param referencer
-	 *            element that references to elementToDelete
-	 * @param references
-	 *            collection of {@link EReference} that contains elementToDelete
-	 * @return true if one of the collected objects is the
-	 *         <code>referencer</code> or the container of
-	 *         <code>referencer</code>
-	 */
-	protected boolean collectObjectsToRemove(Collection objectsToRemove,
-			EObject elementToDelete, EObject referencer, Collection references) {
-		boolean ret = false;
-		List commandListeners = Providers
-				.getCommandListeners(DeleteMethodElementCommand.class);
-		if (commandListeners != null && !commandListeners.isEmpty()) {
-			for (Iterator iter = commandListeners.iterator(); iter.hasNext();) {
-				Object cmdListener = iter.next();
-				if (cmdListener instanceof IDeleteMethodElementCommandListener) {
-					try {
-						boolean b = ((IDeleteMethodElementCommandListener) cmdListener)
-								.collectObjectsToRemove(objectsToRemove,
-										elementToDelete, referencer, references);
-						if (b) {
-							ret = true;
-						}
-					} catch (Exception e) {
-						LibraryEditPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-
-		return ret;
-	}
-
-	protected boolean willRemoveElementFromContainer(EObject element) {
-		if (willRemoveElementFromContainer(command, element)) {
-			return true;
-		} else if (command instanceof CompoundCommand) {
-			for (Iterator iter = ((CompoundCommand) command).getCommandList()
-					.iterator(); iter.hasNext();) {
-				Command cmd = (Command) iter.next();
-				if (willRemoveElementFromContainer(cmd, element)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private static boolean willRemoveElementFromContainer(Command cmd,
-			EObject element) {
-		if (cmd instanceof RemoveCommand) {
-			RemoveCommand removeCommand = ((RemoveCommand) cmd);
-			return removeCommand.getCollection().contains(element)
-					&& removeCommand.getOwner() == element.eContainer();
-		}
-		return false;
-	}
-
-	protected void prepareRemovingReferences() {
-		List elements = loadOppositeFeatures();
-
-		elementToRemovedRefsMap = new HashMap<EObject, Map<EObject, Collection<EStructuralFeature>>>();
-		HashSet objectsToRemove = new HashSet();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			MethodElement element = (MethodElement) iter.next();
-			Map<EObject, Collection<EStructuralFeature>> refMap = AssociationHelper.getReferenceMap(element);
-			if (!refMap.isEmpty()) {
-				for (Iterator iterator = refMap.entrySet().iterator(); iterator
-						.hasNext();) {
-					Map.Entry entry = (Entry) iterator.next();
-					EObject referencer = (EObject) entry.getKey();
-					Collection references = (Collection) entry.getValue();
-					boolean b = collectObjectsToRemove(objectsToRemove,
-							element, referencer, references);
-					if (b || elements.contains(referencer)
-							|| isContainedByDeletedElement(referencer)) {
-						iterator.remove();
-					}
-				}
-				if (!refMap.isEmpty())
-					elementToRemovedRefsMap.put(element, refMap);
-			}
-		}
-
-		// add entries for objectsToRemove to elementToRemovedRefsMap
-		//
-		for (Iterator iter = objectsToRemove.iterator(); iter.hasNext();) {
-			EObject obj = (EObject) iter.next();
-			Map<EObject, Collection<EStructuralFeature>> map = elementToRemovedRefsMap.get(obj);
-			if (map == null) {
-				map = new HashMap();
-				elementToRemovedRefsMap.put(obj, map);
-			}
-			EObject container = obj.eContainer();
-			EReference containmentFeature = obj.eContainmentFeature();
-			Collection refs = (Collection) map.get(container);
-			if (refs == null) {
-				refs = new ArrayList();
-				refs.add(containmentFeature);
-				map.put(container, refs);
-			} else {
-				if (!refs.contains(containmentFeature)) {
-					refs.add(containmentFeature);
-				}
-			}
-		}
-
-		// remove all bi-directional relationships
-		//
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof EObject) {
-				EObject eObject = (EObject) element;
-				Map objToRefsMap = new HashMap();
-				for (EContentsEList.FeatureIterator featureIterator = (EContentsEList.FeatureIterator) eObject
-						.eCrossReferences().iterator(); featureIterator
-						.hasNext();) {
-					EObject eObj = (EObject) featureIterator.next();
-					EReference eReference = (EReference) featureIterator
-							.feature();
-					if (eReference.getEOpposite() != null) {
-						List refs = (List) objToRefsMap.get(eObj);
-						if (refs == null) {
-							refs = new ArrayList();
-							objToRefsMap.put(eObj, refs);
-						}
-						refs.add(eReference.getEOpposite());
-					}
-				}
-				Map map = (Map) elementToRemovedRefsMap.get(eObject);
-				if (map == null) {
-					elementToRemovedRefsMap.put(eObject, objToRefsMap);
-				} else {
-					// merge objToRefsMap to map
-					//
-					for (Iterator iterator = objToRefsMap.entrySet().iterator(); iterator
-							.hasNext();) {
-						Map.Entry entry = (Map.Entry) iterator.next();
-						Object obj = entry.getKey();
-						Collection refs = (Collection) entry.getValue();
-						Collection existingRefs = (Collection) map.get(obj);
-						if (existingRefs != null) {
-							for (Iterator itor = refs.iterator(); itor
-									.hasNext();) {
-								Object ref = (Object) itor.next();
-								if (!existingRefs.contains(ref)) {
-									existingRefs.add(ref);
-								}
-							}
-						} else {
-							map.put(obj, refs);
-						}
-					}
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * @param collectedObjects
-	 * @param element
-	 *            the element that will be deleted by this command
-	 */
-	protected void collectObjectsToDeleteContent(Collection collectedObjects,
-			MethodElement element) {
-		// this special handling is no longer needed since affected
-		// subcategories are added
-		// to the list of elements to be deleted
-		//
-		// if (element instanceof CustomCategory) {
-		// // have to handle CustomCategory specially since deleting a
-		// // CustomCategory might triger deleting
-		// // its subcategories even the relationship between a CustomCategory
-		// and
-		// // its subcategories is
-		// // non-containment reference
-		// //
-		// Iterator iter1 = new AbstractTreeIterator(element, false) {
-		//
-		// private static final long serialVersionUID = -6285969923138781437L;
-		// protected Iterator getChildren(Object object) {
-		// ArrayList children = new ArrayList();
-		// Collection catElements = ((CustomCategory) object)
-		// .getCategorizedElements();
-		// for (Iterator iterator = catElements.iterator(); iterator
-		// .hasNext();) {
-		// Object e = iterator.next();
-		// if (e instanceof CustomCategory) {
-		// children.add(e);
-		// }
-		// }
-		// return children.iterator();
-		// }
-		//
-		// };
-		// while (iter1.hasNext()) {
-		// collectedObjects.add(iter1.next());
-		// }
-		// }
-
-		List commandListeners = Providers
-				.getCommandListeners(DeleteMethodElementCommand.class);
-		if (commandListeners != null && !commandListeners.isEmpty()) {
-			for (Iterator iter = commandListeners.iterator(); iter.hasNext();) {
-				Object cmdListener = iter.next();
-				if (cmdListener instanceof IDeleteMethodElementCommandListener) {
-					try {
-						((IDeleteMethodElementCommandListener) cmdListener)
-								.collectObjectsToDeleteContent(
-										collectedObjects, element);
-					} catch (Exception e) {
-						LibraryEditPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-
-	protected void removeReferences() {
-		if (refRemoved)
-			return;
-
-		if (removedReferences == null) {
-			removedReferences = new ArrayList();
-		} else {
-			removedReferences.clear();
-		}
-		for (Iterator iter = elementToRemovedRefsMap.entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			MethodElement referenced = (MethodElement) entry.getKey();
-			if (canRemoveReferences(referenced)) {
-				Map removedRefMap = (Map) entry.getValue();
-				for (Iterator iterator = removedRefMap.entrySet().iterator(); iterator
-						.hasNext();) {
-					Map.Entry ent = (Map.Entry) iterator.next();
-					EObject referencer = (EObject) ent.getKey();
-					Collection features = (Collection) ent.getValue();
-					for (Iterator iter1 = features.iterator(); iter1.hasNext();) {
-						EStructuralFeature feature = (EStructuralFeature) iter1
-								.next();
-						if (feature.isMany()) {
-							List list = ((List) referencer.eGet(feature));
-
-							int index = list.indexOf(referenced);
-							// list.remove(index);
-							if (index != -1) {
-								list.remove(index);
-								removedReferences.add(new Reference(referencer,
-										feature, referenced, index));
-							} else {
-								if (TngUtil.DEBUG) {
-									System.out
-											.println("DeleteMethodElementCommand.removeReferences(): index=" + index + ", size=" + list.size() + ", referencer=" + referencer + ", referenced=" + referenced + ", feature=" + feature); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-								}
-								// work-around: try to find the proxy and remove
-								// it.
-								// TODO: kind of hack, needs revisit
-								//
-								String guid = ((MethodElement) referenced)
-										.getGuid();
-								find_proxy: for (int i = 0; i < list.size(); i++) {
-									InternalEObject ref = (InternalEObject) list
-											.get(i);
-									URI uri = ref.eProxyURI();
-									if (uri != null
-											&& guid.equals(uri.fragment())) {
-										list.remove(i);
-										removedReferences.add(new Reference(
-												referencer, feature,
-												referenced, i));
-										break find_proxy;
-									}
-								}
-							}
-						} else {
-							referencer.eSet(feature, null);
-							removedReferences.add(new Reference(referencer,
-									feature, referenced, -1));
-						}
-					}
-				}
-			}
-		}
-
-		if (TngUtil.DEBUG) {
-			System.out
-					.println("removedReferences: size=" + removedReferences.size()); //$NON-NLS-1$
-		}
-
-		batchCommand.getObjectToNewFeatureValuesMap().clear();
-		for (Iterator iter = removedReferences.iterator(); iter.hasNext();) {
-			Reference ref = (Reference) iter.next();
-			if (ref.getFeature() == UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT) {
-				batchCommand
-						.addFeatureValue(
-								ref.getOwner(),
-								UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE,
-								UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE
-										.getDefaultValue());
-				if (ref.getOwner() instanceof Activity) {
-					// Fill blank presentation name of extended/locally
-					// contributing activity with presentation name
-					// from base activity when base is deleted
-					//
-					Activity act = (Activity) ref.getOwner();
-					VariabilityType vType = act.getVariabilityType();
-					if ((vType == VariabilityType.EXTENDS_LITERAL || vType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL)
-							&& StrUtil.isNull(act.getPresentationName())) {
-						Activity base = (Activity) ref.getValue();
-						batchCommand
-								.addFeatureValue(
-										act,
-										UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME,
-										ProcessUtil.getPresentationName(base));
-					}
-				}
-			}
-		}
-		if (batchCommand.canExecute()) {
-			batchCommand.execute();
-		}
-
-		refRemoved = true;
-	}
-
-	/**
-	 * Subclass should override this method to resolve all target features so
-	 * opposite features of the given MethodElement are fully loaded.
-	 * 
-	 * @param deletedGUIDs
-	 * 
-	 * @param e
-	 */
-	protected void loadOppositeFeatures(List oppositeFeatures, Set deletedGUIDs) {
-		//
-	}
-
-	protected static void restoreReferences(List removedReferences) {
-		for (int i = removedReferences.size() - 1; i > -1; i--) {
-			Reference ref = (Reference) removedReferences.get(i);
-			if (ref.feature.isMany()) {
-				List list = (List) ref.owner.eGet(ref.feature);
-				if (ref.index != -1) {
-					// TODO: need revisits
-					//
-					if (!list.contains(ref.value)) {
-						if (ref.index < list.size()) {
-							list.add(ref.index, ref.value);
-						} else {
-							if (TngUtil.DEBUG) {
-								System.out
-										.println("DeleteMethodElementCommand.removeReferences(): index=" + ref.index + ", size=" + list.size() + ", referencer=" + ref.owner + ", referenced=" + ref.value + ", feature=" + ref.feature); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-							}
-							list.add(ref.value);
-						}
-					} else {
-						if (TngUtil.DEBUG) {
-							System.out
-									.println("DeleteMethodElementCommand.removeReferences(): reference already exists: referencer=" + ref.owner + ", referenced=" + ref.value + ", feature=" + ref.feature); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						}
-
-					}
-				} else {
-					list.add(ref.value);
-				}
-			} else {
-				ref.owner.eSet(ref.feature, ref.value);
-			}
-		}
-	}
-
-	protected void restoreReferences() {
-		if (!refRemoved)
-			return;
-
-		batchCommand.undo();
-		restoreReferences(removedReferences);
-
-		refRemoved = false;
-	}
-
-	public void undo() {
-		notifyPreUndo();
-		try {
-			super.undo();
-			restoreReferences();
-		} catch (Exception e) {
-			LibraryEditPlugin.INSTANCE.log(e);
-			notifyFailure();
-		}
-	}
-
-	public Collection getAffectedObjects() {
-		if (executed) {
-			return super.getAffectedObjects();
-		}
-		return elements;
-	}
-
-	public void addCommandListener(CommandListener listener) {
-		if (!commandListeners.contains(listener)) {
-			commandListeners.add(listener);
-		}
-	}
-
-	public void removeCommandListener(CommandListener listener) {
-		commandListeners.remove(listener);
-	}
-
-	public static interface CommandListener {
-		void notifyExecuted(EventObject eventObject);
-
-		void notifyFailure(EventObject eventObject);
-	}
-
-	/**
-	 * 
-	 */
-	protected void executeNestedCommands() {
-		List nestedCommandProviders = ExtensionManager
-				.getNestedCommandProviders();
-		if (!nestedCommandProviders.isEmpty()) {
-			if (!elements.isEmpty()) {
-				nestedCommands = new ArrayList();
-				for (Iterator iter = nestedCommandProviders.iterator(); iter
-						.hasNext();) {
-					INestedCommandProvider cmdProvider = (INestedCommandProvider) iter
-							.next();
-					try {
-						Command cmd = cmdProvider.removeRelatedObjects(elements,
-								this);
-						if (cmd != null && cmd.canExecute()) {
-							cmd.execute();
-							nestedCommands.add(cmd);
-						}
-					} catch (Exception e) {
-						LibraryEditPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * 
-	 * @param modifiedResources2
-	 */
-	private void collectNestedCommandResources(Set<Resource> modifiedResources) {
-		
-		if (nestedCommands != null && !nestedCommands.isEmpty()) {
-			for (int i = nestedCommands.size() - 1; i > -1; i--) {
-				Command cmd = (Command) nestedCommands.get(i);
-				try {
-					if (cmd instanceof IResourceAwareCommand) {
-						Collection resources = ((IResourceAwareCommand) cmd)
-								.getModifiedResources();
-						if (resources != null) {
-							modifiedResources.addAll(resources);
-						}
-					}
-				} catch (Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				} finally {
-				}
-			}
-		}
-	}
-	
-	public Collection<Descriptor> getDescriptorsToDelete() {
-		return descriptors;
-	}
-	
-	public boolean isExecuted() {
-		return executed;
-	}
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/FullyRevertibleCommandStack.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/FullyRevertibleCommandStack.java
deleted file mode 100644
index f25f67e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/FullyRevertibleCommandStack.java
+++ /dev/null
@@ -1,205 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.EventObject;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.command.BSDragAndDropCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * A command stack that tries its best to fully revert to its initial state.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class FullyRevertibleCommandStack extends BasicCommandStack {
-
-	public static interface IErrorReporter {
-		void showError(String msg);
-	}
-
-	private IErrorReporter errReporter;
-
-	private ActionManager actionMgr;
-
-	public FullyRevertibleCommandStack(ActionManager actionMgr) {
-		this.actionMgr = actionMgr;
-	}
-
-	public FullyRevertibleCommandStack(ActionManager actionMgr,
-			IErrorReporter errReporter) {
-		this(actionMgr);
-		this.errReporter = errReporter;
-	}
-
-	public void setErrorReporter(IErrorReporter errReporter) {
-		this.errReporter = errReporter;
-	}
-	
-	private void registerAsModifier(Command command) {
-		Set<Resource> modifiedResources = TngUtil.getModifiedResources(command);
-		if(!modifiedResources.isEmpty()) {
-			for (Iterator iter = modifiedResources.iterator(); iter.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				actionMgr.registerAsModifierOf(resource);
-			}
-		}
-	}
-
-	public boolean doExecute(Command command) {
-		if (!command.canUndo())
-			return false; // throw new IllegalArgumentException("Cannot
-		// execute command that cannot de undone");
-		super.execute(command);
-		
-		// special handling for ActivityDropCommand
-		//
-		// TODO: all commands must return a correct value in getAffectedObject()
-		// if getAffectedObject() return an empty collection, the action manager
-		// will not register it as a modifier of the resources returned by getModifiedResources()
-		// and the editor might not be marked dirty as the result.
-		//
-		if(command instanceof BSDragAndDropCommand && command.getAffectedObjects().isEmpty()) {
-			if(top != -1) {
-				commandList.remove(top--);
-				if(top != -1) {
-					mostRecentCommand = (Command) commandList.get(top);
-				}
-				else {
-					mostRecentCommand = null;
-				}
-			}
-			return false;
-		}
-		
-		boolean ret = getMostRecentCommand() != null;
-		if (ret && actionMgr != null) {			
-			registerAsModifier(command);
-		}
-		notifyListeners(new CommandStackChangedEvent(this,
-				CommandStackChangedEvent.EXECUTED));
-		return ret;
-	}
-
-	public void execute(Command command) {
-		doExecute(command);
-	}
-
-	public void redo() {
-		super.redo();
-		notifyListeners(new CommandStackChangedEvent(this,
-				CommandStackChangedEvent.EXECUTED));
-	}
-
-	public void undo() {
-		if (canUndo()) {
-			Command command = (Command) commandList.get(top--);
-			try {
-				command.undo();
-				mostRecentCommand = command;
-			} catch (RuntimeException exception) {
-				CommonPlugin.INSTANCE
-						.log(new WrappedException(
-								CommonPlugin.INSTANCE
-										.getString("_UI_IgnoreException_exception"), exception).fillInStackTrace()); //$NON-NLS-1$
-
-				mostRecentCommand = null;
-				top++;
-
-				if (errReporter != null) {
-					Object[] object = new Object[1];
-					object[0] = command;
-					object[1] = exception;
-					errReporter.showError(NLS.bind(LibraryEditResources.undoCommandError_msg, object)); 
-				}
-			}
-			notifyListeners(new CommandStackChangedEvent(this,
-					CommandStackChangedEvent.UNDO));
-		}
-	}
-
-	public boolean undoAll() {
-		try {
-			while (canUndo()) {
-				Command command = (Command) commandList.get(top--);
-				try {
-					command.undo();
-					mostRecentCommand = command;
-				} catch (RuntimeException exception) {
-					CommonPlugin.INSTANCE
-							.log(new WrappedException(
-									CommonPlugin.INSTANCE
-											.getString("_UI_IgnoreException_exception"), exception).fillInStackTrace()); //$NON-NLS-1$
-
-					mostRecentCommand = null;
-					top++;
-
-					if (errReporter != null) {
-						// errReporter.showError("Cannot undo command: '" +
-						// command + "', exception: " + exception);
-						Object[] object = new Object[1];
-						object[0] = command;
-						object[1] = exception;
-						errReporter
-								.showError(NLS.bind(LibraryEditResources.undoCommandError_msg, object)); 
-					}
-
-					return false;
-				}
-			}
-		} finally {
-			notifyListeners(new CommandStackChangedEvent(this,
-					CommandStackChangedEvent.UNDO_ALL));
-		}
-
-		return true;
-	}
-
-	protected void notifyListeners(EventObject event) {
-		for (Iterator i = listeners.iterator(); i.hasNext();) {
-			((CommandStackListener) i.next()).commandStackChanged(event);
-		}
-	}
-
-	protected void notifyListeners() {
-		//
-	}
-
-	public void saveIsDone() {
-		super.saveIsDone();
-		notifyListeners(new CommandStackChangedEvent(this,
-				CommandStackChangedEvent.SAVED));
-		commandList.clear();
-		top = -1;
-		saveIndex = -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.BasicCommandStack#isSaveNeeded()
-	 */
-	public boolean isSaveNeeded() {
-		return super.isSaveNeeded();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IActionManager.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IActionManager.java
deleted file mode 100644
index 19f07fa..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IActionManager.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * This interface class is used to support undo operations in the
- * form editors.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IActionManager {
-
-	public static final int SET = Notification.SET;
-
-	public static final int ADD = Notification.ADD;
-
-	public static final int REMOVE = Notification.REMOVE;
-
-	public static final int ADD_MANY = Notification.ADD_MANY;
-
-	public static final int REMOVE_MANY = Notification.REMOVE_MANY;
-
-	/**
-	 * Performs the action as described in parameters
-	 * 
-	 * @param actionType
-	 *            one of the above defined action constants
-	 * @param object
-	 *            the object to perform action upon
-	 * @param feature
-	 *            the feature to be modified
-	 * @param value
-	 *            the feature value
-	 * @param index
-	 *            specify -1 if no index
-	 * @return <code>true</code> if successfull, <code>false</code>
-	 *         otherwise
-	 */
-	boolean doAction(int actionType, EObject object,
-			EStructuralFeature feature, Object value, int index);
-
-	/**
-	 * Executes the given command
-	 * 
-	 * @param cmd
-	 * @return <code>true</code> if successfull, <code>false</code>
-	 *         otherwise
-	 */
-	boolean execute(IResourceAwareCommand cmd);
-
-	void undo();
-
-	void redo();
-
-	boolean undoAll();
-
-	void saveIsDone();
-
-	boolean isSaveNeeded();
-
-	/**
-	 * Gets resources first modified by this action manager
-	 */
-	Collection getModifiedResources();
-
-	void dispose();
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IDeleteMethodElementCommandListener.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IDeleteMethodElementCommandListener.java
deleted file mode 100644
index af0712b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IDeleteMethodElementCommandListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.epf.library.edit.ICommandListener;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * @author Phong Nguyen Le - Aug 17, 2006
- * @since  1.0
- */
-public interface IDeleteMethodElementCommandListener extends ICommandListener {
-	/**
-	 * Collects objects whose content must be deleted if the given element is deleted.
-	 * 
-	 * @param collectedObjects
-	 * @param element the element that will be deleted.
-	 */
-	void collectObjectsToDeleteContent(Collection collectedObjects, MethodElement element);	
-
-	/**
-	 * Collects objects that should be removed if <code>elementToDelete</code> will be removed from 
-	 * <code>references</code> of <code>referencer</code>.
-	 * 
-	 * @param objectsToRemove output 
-	 * @param referencer element that references to elementToDelete
-	 * @param references collection of {@link EReference} that contains elementToDelete
-	 * @return true if one of the collected objects is the <code>referencer</code> or container of <code>referencer</code>
-	 */
-	boolean collectObjectsToRemove(Collection objectsToRemove, EObject elementToDelete, EObject referencer, Collection references);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IInteractive.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IInteractive.java
deleted file mode 100644
index 1cb1c02..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IInteractive.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-/**
- * @author Phong Nguyen Le - Oct 3, 2006
- * @since  1.0
- */
-public interface IInteractive {
-	void setUserInteractionHandler(IUserInteractionHandler handler);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IModifyCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IModifyCommand.java
deleted file mode 100644
index 86b4493..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IModifyCommand.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public interface IModifyCommand {
-	
-	Collection getModifiedObjects();
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/INestedCommandProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/INestedCommandProvider.java
deleted file mode 100644
index 8458e1e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/INestedCommandProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-
-/**
- * Provides nested commands to execute right after the execution of the main command
- *  
- * @author Phong Nguyen Le - Aug 17, 2006
- * @since  1.0
- */
-public interface INestedCommandProvider {
-	Command createRelatedObjects(Collection createdElements, Command createCommand);
-	Command removeRelatedObjects(Collection deletedElements, Command deleteCommand);
-	Command createNestedCommand(Command command);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IResourceAwareCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IResourceAwareCommand.java
deleted file mode 100644
index c050d61..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IResourceAwareCommand.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.resource.Resource;
-
-/**
- * The interface for a resource aware command.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IResourceAwareCommand extends Command {
-
-	Collection<Resource> getModifiedResources();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IUserInteractionHandler.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IUserInteractionHandler.java
deleted file mode 100644
index a39195f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/IUserInteractionHandler.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-
-/**
- * Interface to handle user interactions during command execution
- * 
- * @author Phong Nguyen Le - Oct 3, 2006
- * @since 1.0
- */
-public interface IUserInteractionHandler {
-	/**
-	 * Delivers messages to users
-	 * 
-	 * @author Phong Nguyen Le - Oct 26, 2006
-	 * @since 1.0
-	 */
-	public static interface IMessenger {
-		/**
-		 * Shows information message
-		 * 
-		 * @param title
-		 * @param msg
-		 */
-		void showInfo(String title, String msg);
-
-		/**
-		 * Shows warning message
-		 * 
-		 * @param title
-		 * @param msg
-		 */
-		void showWarning(String title, String msg);
-
-		/**
-		 * Shows warning message with reason
-		 * 
-		 * @param title
-		 * @param msg
-		 * @param string
-		 */
-		void showWarning(String title, String msg, String reason);
-
-		/**
-		 * Shows error message
-		 * 
-		 * @param title
-		 * @param msg
-		 */
-		void showError(String title, String msg);
-
-		/**
-		 * Shows error message with status
-		 * 
-		 * @param title
-		 * @param msg
-		 * @param status
-		 */
-		void showError(String title, String msg, IStatus status);
-
-		/**
-		 * Shows error message with reason and exception
-		 * 
-		 * @param title
-		 * @param msg
-		 * @param reason
-		 * @param exception
-		 */
-		void showError(String title, String msg, String reason,
-				Exception exception);
-
-		void showError(String title, String msg, String reason, String details,
-				Exception exception);
-	}
-
-	/**
-	 * Action constant for user acceptance
-	 */
-	static final int ACTION_OK = 0;
-
-	/**
-	 * Action constant for user cancellation
-	 */
-	static final int ACTION_CANCEL = 1;
-
-	/**
-	 * Action constant for retry
-	 */
-	static final int ACTION_RETRY = 2;
-
-	/**
-	 * Action constant for abort
-	 */
-	static final int ACTION_ABORT = 3;
-	
-	static final int ACTION_YES = 4;
-	
-	static final int ACTION_NO = 5;
-
-	/**
-	 * Selects objects from the specified list <code>objectsToSelect</code>.
-	 * 
-	 * @param objectsToSelect
-	 *            objects for user to select
-	 * @param labelProvider
-	 *            label provider used to display the given objects to user
-	 * @param multiple
-	 *            if <code>true</code> will allow multiple selection, single
-	 *            selection if <code>false</code>
-	 * @param title
-	 *            the title of this selection action to display to user
-	 * @param msg
-	 *            the message to display to user
-	 * @return the collection of selected elements, or <code>null</code> if
-	 *         the selection was canceled.
-	 */
-	List select(List objectsToSelect, IItemLabelProvider labelProvider,
-			boolean multiple, List intitialSelection, String title, String msg);
-
-	/**
-	 * Selects only one action from the given array of actions. The actions must
-	 * be the constants {@link #ACTION_ABORT}, {@link #ACTION_CANCEL},
-	 * {@link #ACTION_OK}, {@link #ACTION_RETRY}, ACTION_XXX
-	 * 
-	 * @param actions
-	 * @param title
-	 * @param msg
-	 * @param status
-	 * @return
-	 */
-	int selectOne(int[] actions, String title, String msg, IStatus status);
-
-	/**
-	 * Requests user inputs.
-	 * 
-	 * @param title
-	 * @param msg
-	 * @param userInputs
-	 *            list of {@link UserInput user inputs} that have information
-	 *            about input requests and reference to the input. The input
-	 *            reference should be set to the object that user specified or
-	 *            selected.
-	 * @return false if user cancelled this request
-	 */
-	boolean requestInput(String title, String msg, List<UserInput> userInputs);
-
-	/**
-	 * Gets UI context
-	 * 
-	 * @return the UI context
-	 */
-	Object getUIContext();
-
-	/**
-	 * Gets the messenger
-	 * 
-	 * @return
-	 */
-	IMessenger getMessenger();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementAddCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementAddCommand.java
deleted file mode 100644
index b510215..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementAddCommand.java
+++ /dev/null
@@ -1,2273 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.io.File;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandWrapper;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EContentsEList;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage.Literals;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.library.edit.util.ITextReferenceReplacer;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.AbstractStringValidator;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.library.edit.validation.internal.ContentElementNameValidator;
-import org.eclipse.epf.library.edit.validation.internal.UniquenessValidator;
-import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This command is used to add a method element to a containing method element.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class MethodElementAddCommand extends CommandWrapper implements
-		IResourceAwareCommand {
-	public static final Map<EClass, Collection<EStructuralFeature>> typeToExcludedFeaturesFromCheck = new HashMap<EClass, Collection<EStructuralFeature>>();
-	
-	public static void excludeFromCheck(EClass type, EStructuralFeature feature) {
-		Collection<EStructuralFeature> features = typeToExcludedFeaturesFromCheck.get(type);
-		if(features == null) {
-			features = new HashSet<EStructuralFeature>();
-		}
-		features.add(feature);
-	}
-
-	protected boolean canUndo = true;
-
-	protected AddCommand addCommand;
-
-	// protected Map elementToNewNameMap;
-	protected Map elementToOldPluginMap;
-
-	protected boolean removeXRefRequired;
-
-	protected MethodPlugin ownerPlugin;
-
-	protected ArrayList addList;
-
-	protected MultiStatus status = new MultiStatus(LibraryEditPlugin.INSTANCE
-			.getSymbolicName(), IStatus.OK, "", null); //$NON-NLS-1$
-
-	protected boolean runWithProgress;
-
-	protected ArrayList<EStructuralFeature> featuresToCheck;
-
-	private ArrayList nestedCommands;
-
-	private HashSet modifiedResources;
-
-	public MethodElementAddCommand(Command command) {
-		this(command, true);
-	}
-
-	public MethodElementAddCommand(Command command, boolean runWithProgress) {
-		super(command);
-		addCommand = (AddCommand) TngUtil.unwrap(command);
-		setRunWithProgress(runWithProgress);
-	}
-
-	public void setRunWithProgress(boolean runWithProgress) {
-		this.runWithProgress = runWithProgress;
-	}
-
-	public boolean canUndo() {
-		return canUndo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandWrapper#getResult()
-	 */
-	public Collection getResult() {
-		if (status.isOK()) {
-			return super.getResult();
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	private void handleError(IStatus errorStatus) {
-		Messenger.INSTANCE.showError(getLabel(), LibraryEditResources.createElementError_msg, errorStatus);
-		status.add(errorStatus);
-		status.addAll(errorStatus);
-		return;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.CommandWrapper#dispose()
-	 */
-	public void dispose() {	
-		// dispose the nested commands
-		if (nestedCommands != null && !nestedCommands.isEmpty()) {
-			for (int i = nestedCommands.size() - 1; i > -1; i--) {
-				Command cmd = (Command) nestedCommands.get(i);
-				try {
-					cmd.dispose();
-				} catch (Exception e) {
-				}
-			}
-		}
-		super.dispose();
-	}
-	
-	
-	public void execute() {
-		Object shell = LibraryEditPlugin.getDefault().getContext();
-		// Check whether the owner resource can be modified.
-		//
-		Collection resourcesToChange = getModifiedResources();
-		IStatus execStatus = UserInteractionHelper.checkModify(
-				resourcesToChange, shell);
-		if (!execStatus.isOK()) {
-			handleError(execStatus);
-			return;
-		}
-		execStatus = UserInteractionHelper.checkConfigurationsToUpdate(
-				addCommand, shell);
-		if (!execStatus.isOK()) {
-			handleError(execStatus);
-			return;
-		}
-		if (willSaveModifiedResources()
-				&& !UserInteractionHelper.checkOutOfSynch(resourcesToChange)) {
-			status.add(Status.CANCEL_STATUS);
-			return;
-		}
-
-		// if(!checkFolder(shell)) {
-		// return;
-		// }
-
-		doAdd();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandWrapper#undo()
-	 */
-	public void undo() {
-		undoNestedCommands();
-		super.undo();
-	}
-
-	/**
-	 * 
-	 */
-	private void undoNestedCommands() {
-		if (nestedCommands != null && !nestedCommands.isEmpty()) {
-			for (int i = nestedCommands.size() - 1; i > -1; i--) {
-				Command cmd = (Command) nestedCommands.get(i);
-				try {
-					if (cmd.canUndo()) {
-						cmd.undo();
-					}
-				} catch (Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				} finally {
-					try {
-						cmd.dispose();
-					} catch (Exception e) {
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean checkFolder(Object shell) {
-		// if any of the elements to be added will be saved in its own file
-		// check if the folder to save the file to can be modified
-		//
-		IFileBasedLibraryPersister persister = (IFileBasedLibraryPersister) Services.getLibraryPersister(Services.XMI_PERSISTENCE_TYPE);
-		ArrayList foldersToCheck = new ArrayList();
-		for (Iterator iter = addCommand.getCollection().iterator(); iter
-				.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			if (element instanceof MethodElement
-					&& persister.hasOwnResource(element)) {
-				String folder = persister.getFolderRelativePath(
-								(MethodElement) element);
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(addCommand
-						.getOwner());
-				String baseFolder = null;
-				if (plugin == null) {
-					MethodLibrary lib = UmaUtil.getMethodLibrary(addCommand
-							.getOwner());
-					baseFolder = new File(lib.eResource().getURI()
-							.toFileString()).getParent();
-				} else {
-					baseFolder = new File(plugin.eResource().getURI()
-							.toFileString()).getParent();
-				}
-				foldersToCheck.add(baseFolder + File.separator + folder);
-			}
-		}
-		if (!foldersToCheck.isEmpty()) {
-			String[] folders = new String[foldersToCheck.size()];
-			foldersToCheck.toArray(folders);
-			IStatus status = Services.getFileManager()
-					.checkModify(folders, shell);
-			if (!status.isOK()) {
-				handleError(status);
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	public IStatus getStatus() {
-		return status;
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean isMove() {
-		Command cmd = TngUtil.unwrap(command);
-		if (cmd instanceof AddCommand) {
-			for (Iterator iter = ((AddCommand) cmd).getCollection().iterator(); iter
-					.hasNext();) {
-				EObject element = (EObject) iter.next();
-				if (UmaUtil.getMethodPlugin(element) == null) {
-					return false;
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * 
-	 * @param ownerPlugin
-	 * @param e
-	 * @return List of Reference objects that keeps the info of illegal outgoing
-	 *         references
-	 * @see Reference
-	 */
-	public static Collection<Reference> getIllegalOutgoingReferences(
-			MethodPlugin ownerPlugin, EObject e, Collection<Reference> illegalReferences) {
-		if (illegalReferences == null) {
-			illegalReferences = new ArrayList<Reference>();
-		}
-		for (EContentsEList.FeatureIterator<EObject> featureIterator = (EContentsEList.FeatureIterator<EObject>) e
-				.eCrossReferences().iterator(); featureIterator.hasNext();) {
-			EObject eObject = (EObject) featureIterator.next();
-			EStructuralFeature feature = featureIterator.feature();
-			if (!feature.isDerived()) {
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(eObject);
-				if (plugin != null && plugin != ownerPlugin
-						&& !Misc.isBaseOf(plugin, ownerPlugin)) {
-					// illegal reference to be removed
-					//
-					illegalReferences
-							.add(new Reference(e, feature, eObject, -1));
-					if (feature == UmaPackage.eINSTANCE
-							.getVariabilityElement_VariabilityBasedOnElement()) {
-						feature = UmaPackage.eINSTANCE.getVariabilityElement_VariabilityType();
-						illegalReferences
-							.add(new Reference(e, feature, e.eGet(feature), -1));
-					}
-				}
-			}
-		}
-		return illegalReferences;
-	}
-
-	private static void removeReferences(Collection<Reference> references) {
-		for (Reference ref: references) {
-			if (ref.feature.isMany()) {
-				List<?> list = ((List<?>) ref.owner.eGet(ref.feature));
-				list.remove(ref.value);
-			} else {
-				ref.owner.eSet(ref.feature, null);
-			}
-		}
-	}
-
-	/**
-	 * @param element
-	 * @return List of Reference objects
-	 */
-	public static Collection<Reference> removeIllegalReferences(MethodPlugin ownerPlugin,
-			EObject e) {
-		Collection<Reference> removeRefs = getIllegalOutgoingReferences(ownerPlugin, e,
-				null);
-
-		// remove illegal references
-		//
-		removeReferences(removeRefs);
-
-		return removeRefs;
-	}
-
-	private static boolean hasNext(Iterator iter) {
-		try {
-			return iter.hasNext();
-		} catch (RuntimeException ex) {
-			throw ex;
-		}
-	}
-
-	public static boolean hasIllegalReference(MethodPlugin ownerPlugin,
-			EObject e, Collection moveList) {
-		for (EContentsEList.FeatureIterator featureIterator = (EContentsEList.FeatureIterator) e
-				.eCrossReferences().iterator(); hasNext(featureIterator);) {
-			EObject eObject = (EObject) featureIterator.next();
-
-			// check if the x-ref object is in the move list
-			//
-			if (!moveList.contains(eObject)) {
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(eObject);
-				if (plugin != null && plugin != ownerPlugin
-						&& !Misc.isBaseOf(plugin, ownerPlugin)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks if the given MethodElement is referenced illegally after the move.
-	 * 
-	 * @param ownerPlugin
-	 * @param e
-	 * @param moveList
-	 * @return
-	 */
-	public static boolean isReferencedIllegally(MethodPlugin ownerPlugin,
-			MethodElement e, Collection moveList) {
-		Collection references = AssociationHelper.getReferences(e);
-		for (Iterator iter = references.iterator(); iter.hasNext();) {
-			MethodElement element = (MethodElement) iter.next();
-
-			if (isExcludedFromOutgoingReferenceCheck(element)) {
-				continue;
-			}
-
-			if (!moveList.contains(element)) {
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-				if (plugin != null && plugin != ownerPlugin
-						&& !Misc.isBaseOf(ownerPlugin, plugin)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	private static void checkModify(EObject element) {
-		IStatus status = TngUtil.checkEdit(element, null);
-		if (!status.isOK()) {
-			throw new MessageException(TngUtil.getMessage(status));
-		}
-	}
-
-	public static Collection removeIllegalReferencesTo(
-			MethodPlugin ownerPlugin, MethodElement e, Collection moveList) {
-		ArrayList affectedReferencers = new ArrayList();
-		Collection references = AssociationHelper.getReferences(e);
-		for (Iterator iter = references.iterator(); iter.hasNext();) {
-			MethodElement element = (MethodElement) iter.next();
-			if (!moveList.contains(element)) {
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-				if (plugin != null && plugin != ownerPlugin
-						&& !Misc.isBaseOf(ownerPlugin, plugin)) {
-					checkModify(element);
-					removeReferences(element, e);
-					affectedReferencers.add(element);
-				}
-			}
-		}
-		return affectedReferencers;
-	}
-
-	/**
-	 * Gets all cross references of <code>referencer</code> to
-	 * <code>referenced</code>
-	 * 
-	 * @param referencer
-	 * @param referenced
-	 * @param xReferences
-	 *            output collection of EStructuralFeature objects
-	 * @return collection of EStructuralFeature objects
-	 */
-	private static Collection getXReferences(EObject referencer,
-			EObject referenced, Collection xReferences) {
-		if (xReferences == null) {
-			xReferences = new ArrayList();
-		}
-		for (EContentsEList.FeatureIterator featureIterator = (EContentsEList.FeatureIterator) referencer
-				.eCrossReferences().iterator(); featureIterator.hasNext();) {
-			EObject eObject = (EObject) featureIterator.next();
-			EStructuralFeature feature = featureIterator.feature();
-			// if(feature.isMany()) {
-			// if(((List)referencer.eGet(feature)).contains(referenced)) {
-			// xReferences.add(feature);
-			// }
-			// }
-			// else
-			if (eObject == referenced) {
-				xReferences.add(feature);
-			}
-		}
-		return xReferences;
-	}
-
-	/**
-	 * Remove all references to <code>referenced</code> from
-	 * <code>referencer</code>
-	 * 
-	 * @param referencer
-	 * @param referenced
-	 * @return Collection of references to the <code>referenced</code>
-	 */
-	public static Collection removeReferences(EObject referencer,
-			EObject referenced) {
-		Collection removeRefs = getXReferences(referencer, referenced, null);
-
-		// remove illegal references
-		//
-		for (Iterator iter = removeRefs.iterator(); iter.hasNext();) {
-			EStructuralFeature f = (EStructuralFeature) iter.next();
-			if (f.isMany()) {
-				((Collection) referencer.eGet(f)).remove(referenced);
-			} else {
-				referencer.eSet(f, null);
-			}
-		}
-
-		return removeRefs;
-	}
-
-	public static boolean hasIllegalReferenceIncludingAllChildren(
-			MethodPlugin ownerPlugin, MethodElement e, Collection moveList) {
-		if (ownerPlugin == UmaUtil.getMethodPlugin(e)) {
-			// move within the same plugin, no further check
-			//
-			return false;
-		}
-		if (hasIllegalReference(ownerPlugin, e, moveList))
-			return true;
-		for (Iterator iterator = e.eAllContents(); iterator.hasNext();) {
-			if (hasIllegalReference(ownerPlugin, (EObject) iterator.next(),
-					moveList))
-				return true;
-		}
-		return false;
-	}
-
-	protected void superExecute() {
-		super.execute();
-	}
-
-	protected Collection getFeaturesToCheck() {
-		if (featuresToCheck == null) {
-			featuresToCheck = new ArrayList<EStructuralFeature>();
-			featuresToCheck.add(UmaPackage.eINSTANCE.getNamedElement_Name());
-			
-		}
-		return featuresToCheck;
-	}
-
-	protected IValidator createValidator(EObject e, EStructuralFeature feature) {
-		IValidator validator = null;
-
-		if(addCommand.getFeature() instanceof EReference){
-			validator = IValidatorFactory.INSTANCE.createValidator(addCommand.getOwner(), (EReference) addCommand.getFeature(), (EClass)null, e, feature);
-		}
-
-		return validator;
-	}
-
-	/**
-	 * @param e
-	 * @param objectsToCheckName
-	 */
-	private void getOffStringToCheckName(Object e, Collection objectsToCheckName) {
-		// if(addCommand.getOwner() instanceof ContentPackage &&
-		// addCommand.getFeature() ==
-		// UmaPackage.eINSTANCE.getMethodPackage_ChildPackages()
-		// && e instanceof ContentPackage) {
-		// for (Iterator iter = ((ContentPackage)e).eAllContents();
-		// iter.hasNext();) {
-		// Object element = iter.next();
-		// if(element instanceof ContentElement) {
-		// objectsToCheckName.add(element);
-		// }
-		// }
-		// }
-		// else
-		if (addCommand.getOwner() instanceof ProcessPackage
-				&& addCommand.getFeature() == UmaPackage.eINSTANCE
-						.getMethodPackage_ChildPackages()
-				&& e instanceof ProcessPackage
-				&& !(e instanceof ProcessComponent)) {
-			getProcessComponents((ProcessPackage) e, objectsToCheckName);
-		}
-	}
-
-	/**
-	 * @param e
-	 * @param objectsToCheckName
-	 */
-	private static void getProcessComponents(ProcessPackage pkg,
-			Collection objectsToCheckName) {
-		for (Iterator iter = pkg.getChildPackages().iterator(); iter.hasNext();) {
-			Object childPkg = iter.next();
-			if (childPkg instanceof ProcessComponent) {
-				objectsToCheckName.add(childPkg);
-			} else if (childPkg instanceof ProcessPackage) {
-				getProcessComponents((ProcessPackage) childPkg,
-						objectsToCheckName);
-			}
-		}
-	}
-
-	private boolean checkStringValue(NamedElement e,
-			EStructuralFeature feature, Collection objectsToAdd) {
-		Collection excludedFeaturesToCheck = typeToExcludedFeaturesFromCheck.get(e.eClass()); 
-		if(excludedFeaturesToCheck != null && excludedFeaturesToCheck.contains(feature)) {
-			return true;
-		}
-		
-		IValidator validator = createValidator(e, feature);
-		if (validator != null) {
-			String newName = null;
-			try {
-				newName = checkStringValue(e, feature, validator, objectsToAdd);
-			} catch (OperationCanceledException ex) {
-				return false;
-			}
-			if (newName != null) {
-				newName = newName.trim();
-				e.eSet(feature, newName);
-				featureChanged(e, feature, newName);
-			}
-		}
-		return true;
-	}
-
-	protected boolean checkStringValue(EStructuralFeature feature) {
-		ArrayList objectsToCheckName = new ArrayList();
-		Collection objectsToAdd = addCommand.getCollection();
-
-		// feature value check
-		//
-		for (Iterator iter = objectsToAdd.iterator(); iter.hasNext();) {
-			NamedElement e = (NamedElement) iter.next();
-			if (!checkStringValue(e, feature, objectsToAdd)) {
-				return false;
-			}
-
-			getOffStringToCheckName(e, objectsToCheckName);
-		}
-
-		for (Iterator iter = objectsToCheckName.iterator(); iter.hasNext();) {
-			NamedElement e = (NamedElement) iter.next();
-			EStructuralFeature f = UmaPackage.eINSTANCE.getNamedElement_Name();
-			if (!checkStringValue(e, f, objectsToCheckName)) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Subclass can override this method to deal with element change during add
-	 * 
-	 * @param feature
-	 * @param newValue
-	 */
-	protected void featureChanged(EObject object, EStructuralFeature feature,
-			Object newValue) {
-
-	}
-
-	private static Collection getElementsToCheckName(AddCommand addCommand) {
-		ArrayList elements = new ArrayList(addCommand.getCollection());
-		for (Iterator iter = addCommand.getCollection().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof ProcessPackage) {
-				// need to get all process components in this package to check
-				// name
-				//
-				Iterator iterator = new AbstractTreeIterator(element, false) {
-
-					/**
-					 * Comment for <code>serialVersionUID</code>
-					 */
-					private static final long serialVersionUID = 1L;
-
-					protected Iterator getChildren(Object object) {
-						if (object instanceof ProcessComponent) {
-							return Collections.EMPTY_LIST.iterator();
-						} else if (object instanceof ProcessPackage) {
-							return ((ProcessPackage) object).getChildPackages()
-									.iterator();
-						} else {
-							return Collections.EMPTY_LIST.iterator();
-						}
-					}
-
-				};
-				while (iterator.hasNext()) {
-					Object pkg = iterator.next();
-					if (pkg instanceof ProcessComponent) {
-						elements.add(pkg);
-					}
-				}
-			}
-		}
-		return elements;
-	}
-
-	/**
-	 * Checks the name of all elements to be added.
-	 * 
-	 * @param addCommand
-	 * @return a element to new feature name map or <code>null</code> if user
-	 *         canceled the operation.
-	 */
-	protected static Map checkName(AddCommand addCommand) {
-		Collection elementsToCheck = getElementsToCheckName(addCommand);
-		HashMap elementToNewNameMap = new HashMap();
-
-		// feature value check
-		//
-		for (Iterator iter = elementsToCheck.iterator(); iter.hasNext();) {
-			NamedElement e = (NamedElement) iter.next();
-			IValidator validator;
-			if (e instanceof ContentElement) {
-				validator = new ContentElementNameValidator(addCommand
-						.getOwner(), addCommand.getFeature(),
-						(ContentElement) e, new ValidatorFactory.TypeFilter(e));
-			} else {
-				validator = IValidatorFactory.INSTANCE.createNameValidator(
-						addCommand.getOwner(), e);
-			}
-
-			String newName = null;
-			try {
-				newName = checkStringValue(e, UmaPackage.eINSTANCE
-						.getNamedElement_Name(), validator, elementsToCheck);
-			} catch (OperationCanceledException ex) {
-				return null;
-			}
-			if (newName != null) {
-				// new name required, check if the element can be modified
-				//
-				IStatus status = UserInteractionHelper.checkModify(e, LibraryEditPlugin.getDefault().getContext());
-				String title = LibraryEditResources.errorDialog_title; 
-				String msg = MessageFormat.format(
-						LibraryEditResources.errorDialog_cannotRename,
-						new Object[] { TngUtil.getTypeText(e), e.getName(),
-								newName });
-				while (!status.isOK()) {
-					IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-					if (uiHandler != null) {
-						if (uiHandler.selectOne(new int[] {
-								IUserInteractionHandler.ACTION_OK,
-								IUserInteractionHandler.ACTION_CANCEL }, title,
-								msg, null) == IUserInteractionHandler.ACTION_CANCEL) {
-							return null;
-						}
-					}
-					else {
-						// cancel the operation if there is no user interaction handler
-						//
-						return null;
-					}
-				}
-				elementToNewNameMap.put(e, newName);
-			}
-		}
-
-		return elementToNewNameMap;
-	}
-
-	/**
-	 * Checks feature value
-	 * 
-	 * @param e
-	 * @param feature
-	 * @param validator
-	 * @param objectsToAdd
-	 * @return new feature value that user has choosen or <code>null</code> if
-	 *         the feature value is valid
-	 * @throws OperationCanceledException
-	 */
-	public static String checkStringValue(NamedElement e,
-			EStructuralFeature feature, IValidator validator,
-			Collection objectsToAdd) throws OperationCanceledException {
-		// TODO: The validator is display an error message that is too long for
-		// the dialog.
-		// feature value check
-		final StringValidator strValidator = getStringValidator();
-		strValidator.setElements(objectsToAdd);
-		strValidator.setFeature(feature);
-		strValidator.setValidator(validator);
-
-		String str = (String) e.eGet(feature);
-		if (str != null && str.length() > 0) {
-			String msg = strValidator.isValid(str);
-			if (msg != null) {
-				String featureTxt = TngUtil.getFeatureText(feature);
-				String title = LibraryEditResources.resolveNameConflictDialog_title; 
-				String dlgMsg = NLS.bind(
-						LibraryEditResources.resolveNameConflictDialog_text,
-						StrUtil.toLower(featureTxt), e.getName());
-				String currentValue = (String) e.eGet(feature);
-
-				IValidator inputValidator = new AbstractStringValidator() {
-
-					public String isValid(String newText) {
-						if (strValidator != null) {
-							return UserInteractionHelper
-									.getSimpleErrorMessage(strValidator
-											.isValid(newText));
-						}
-						return null;
-					}
-
-				};
-				IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-				if(uiHandler != null) {
-					UserInput input = new UserInput("", UserInput.TEXT, false, null, null, inputValidator, null);
-					input.setInput(currentValue);
-					List<UserInput> userInputs = Collections.singletonList(input);
-					if(uiHandler.requestInput(title, dlgMsg, userInputs)) {
-						return (String) userInputs.get(0).getInput();
-					}
-					else {
-						throw new OperationCanceledException();
-					}
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandWrapper#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		Collection affectedObjects = super.getAffectedObjects();
-		if (affectedObjects == null) {
-			EObject owner = addCommand.getOwner();
-			affectedObjects = owner == null ? Collections.EMPTY_SET
-					: Collections.singleton(owner);
-		}
-		return affectedObjects;
-	}
-
-	protected Collection getElementsToCheckForIllegalReferences() {
-		return addCommand.getCollection();
-	}
-
-	private static boolean isExcludedFromOutgoingReferenceCheck(Object e) {
-		// don't check on ProcessPackage, ProcessElement for illegal references
-		// b/c process validation is based on configuration, not plugin
-		// visibility
-		//
-		return e instanceof ProcessPackage || e instanceof ProcessElement;
-	}
-
-	protected String checkForIllegalReferences() {
-		Collection elements = getElementsToCheckForIllegalReferences();
-		addList = new ArrayList(elements);
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			// String newName = (String) elementToNewNameMap.get(element);
-			// if(newName != null) {
-			// element.setName(newName);
-			// }
-			for (Iterator iterator = element.eAllContents(); iterator.hasNext();) {
-				addList.add(iterator.next());
-			}
-		}
-
-		// check if there is any illegal reference in the moved objects
-		//		
-		ownerPlugin = UmaUtil.getMethodPlugin(addCommand.getOwner());
-		removeXRefRequired = false;
-		find_xPluginRef: for (Iterator iter = addCommand.getCollection()
-				.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-
-			if (isExcludedFromOutgoingReferenceCheck(element)) {
-				continue find_xPluginRef;
-			}
-
-			if (element instanceof MethodElement) {
-				if (hasIllegalReferenceIncludingAllChildren(ownerPlugin,
-						(MethodElement) element, addList)) {
-					removeXRefRequired = true;
-					break find_xPluginRef;
-				}
-			}
-		}
-
-		if (removeXRefRequired) {
-			return LibraryEditResources.invalidReferencesError_reason; 
-		}
-		return null;
-	}
-
-	public Collection getModifiedResources() {
-		if (modifiedResources == null) {
-			modifiedResources = new HashSet();
-		}
-		if (addFeatureIsContainment()) {
-			ILibraryPersister persister = Services.getDefaultLibraryPersister();
-			boolean saveOwnerResource = false;
-			for (Iterator iter = addCommand.getCollection().iterator(); iter
-					.hasNext();) {
-				Object e = (Object) iter.next();
-				if (!persister.hasOwnResourceWithoutReferrer(e)) {
-					saveOwnerResource = true;
-				}
-			}
-			if (saveOwnerResource) {
-				modifiedResources.add(addCommand.getOwner().eResource());
-			}
-		} else {
-			modifiedResources.add(addCommand.getOwner().eResource());
-		}
-
-		if (nestedCommands != null && !nestedCommands.isEmpty()) {
-			for (int i = nestedCommands.size() - 1; i > -1; i--) {
-				Command cmd = (Command) nestedCommands.get(i);
-				try {
-					if (cmd instanceof IResourceAwareCommand) {
-						Collection resources = ((IResourceAwareCommand) cmd)
-								.getModifiedResources();
-						if (resources != null) {
-							modifiedResources.addAll(resources);
-						}
-					}
-				} catch (Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				} finally {
-					
-				}
-			}
-		}
-
-		return modifiedResources;
-	}
-
-	protected boolean willSaveModifiedResources() {
-		return true;
-	}
-	
-	private ILibraryPersister.FailSafeMethodLibraryPersister getPersister() {
-		return Services.getDefaultLibraryPersister().getFailSafePersister();
-	}
-
-	protected void saveModifiedResources() {
-		ILibraryPersister.FailSafeMethodLibraryPersister persister = getPersister();
-		try {
-
-			// save the modified resources
-			//
-			for (Iterator iter = getModifiedResources().iterator(); iter
-					.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				try {
-					persister.save(resource);
-					canUndo = false;
-				} catch (Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-					String msg = NLS.bind(
-							LibraryEditResources.saveFileError_reason, 
-							resource.getURI().isFile() ? resource
-									.getURI().toFileString() : resource.toString());
-					status.add(new SaveStatus(IStatus.ERROR,
-							LibraryEditPlugin.INSTANCE.getSymbolicName(),
-							SaveStatus.SAVE_ERROR, msg, e));
-					return;
-				}
-			}
-
-			if (resMgr != null) {
-				Collection elementsToCopyRefContents = new ArrayList();
-				for (Iterator iter = getAffectedObjects().iterator(); iter
-						.hasNext();) {
-					elementsToCopyRefContents.add(TngUtil.unwrap(iter.next()));
-				}
-
-				Collection modified = resMgr.copyReferencedContents(
-						elementsToCopyRefContents, elementToOldPluginMap);
-				modified
-						.addAll(replaceTextReferences(elementsToCopyRefContents));
-				if (modified != null && !modified.isEmpty()) {
-					for (Iterator iter = modified.iterator(); iter.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						try {
-							persister.save(resource);
-						} catch (Exception e) {
-							LibraryEditPlugin.getDefault().getLogger()
-									.logError(e);
-							String msg = NLS.bind(
-									LibraryEditResources.saveFileError_reason,
-									resource.getURI().toFileString());
-							status.add(new SaveStatus(IStatus.ERROR,
-									LibraryEditPlugin.INSTANCE
-											.getSymbolicName(),
-									SaveStatus.SAVE_ERROR, msg, e));
-							return;
-						}
-					}
-				}
-			}
-
-			persister.commit();
-		} catch (RuntimeException e) {
-			StringWriter msg = new StringWriter();
-			e.printStackTrace(new PrintWriter(msg));
-			IStatus newStatus = new SaveStatus(IStatus.ERROR,
-					LibraryEditPlugin.INSTANCE.getSymbolicName(),
-					SaveStatus.SAVE_ERROR, msg.toString(), e);
-			status.add(newStatus);
-		} finally {
-			if (status.getSeverity() == IStatus.ERROR) {
-				try {
-					persister.rollback();
-				} catch (Exception e) {
-					LibraryEditPlugin.INSTANCE.log(e);
-					StringWriter msg = new StringWriter();
-					e.printStackTrace(new PrintWriter(msg));
-					IStatus newStatus = new SaveStatus(IStatus.ERROR,
-							LibraryEditPlugin.INSTANCE.getSymbolicName(),
-							SaveStatus.ROLLBACK_ERROR, msg.toString(), e);
-					status.add(newStatus);
-				}
-			}
-		}
-	}
-
-	/**
-	 * If textual descriptions in the copied elements contain references (URLs)
-	 * to other elements within the same copied process then replace these
-	 * references with references that point to the new elements in the copied
-	 * structures.
-	 */
-	private Collection replaceTextReferences(
-			Collection elementsToCopyRefContents) {
-		Collection modifiedResources = new HashSet();
-		ITextReferenceReplacer txtRefReplacer = ExtensionManager
-				.getTextReferenceReplacer();
-		if (txtRefReplacer == null)
-			return modifiedResources;
-
-		// get map
-		EditingDomain ed = addCommand.getDomain();
-		if (ed instanceof TraceableAdapterFactoryEditingDomain) {
-			Map copyToOriginalMap = ((TraceableAdapterFactoryEditingDomain) ed)
-					.getCopyToOriginalMap();
-			// the TextReferenceReplacer expects a map of old-to-new. we
-			// have a map of new-to-old, so convert it
-			Map oldToNewObjectMap = new HashMap();
-			for (Iterator iter = copyToOriginalMap.entrySet().iterator(); iter
-					.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Object key = entry.getKey();
-				Object val = entry.getValue();
-				if (key != null && val != null)
-					oldToNewObjectMap.put(val, key);
-			}
-			for (Iterator iter = elementsToCopyRefContents.iterator(); iter
-					.hasNext();) {
-				EObject element = (EObject) iter.next();
-				for (Iterator childIter = element.eAllContents(); childIter
-						.hasNext();) {
-					EObject child = (EObject) childIter.next();
-					for (Iterator attributes = child.eClass()
-							.getEAllAttributes().iterator(); attributes
-							.hasNext();) {
-						EAttribute attribute = (EAttribute) attributes.next();
-						if (attribute.isChangeable()
-								&& !attribute.isDerived()
-								&& (attribute.isMany() || child
-										.eIsSet(attribute))
-								&& attribute.getEAttributeType()
-										.getInstanceClass() == Literals.STRING
-										.getInstanceClass()) {
-							String text = (String) child.eGet(attribute);
-							if (text != null) {
-								String newtext = txtRefReplacer.replace(text,
-										child, oldToNewObjectMap);
-								if (!newtext.equals(text)) {
-									child.eSet(attribute, newtext);
-									modifiedResources.add(child.eResource());
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return modifiedResources;
-	}
-
-	protected void doAdd() {
-		try {
-			// check feature values
-			//
-			for (Iterator iter = getFeaturesToCheck().iterator(); iter
-					.hasNext();) {
-				EStructuralFeature feature = (EStructuralFeature) iter.next();
-				if (!checkStringValue(feature)) {
-					// user canceled the operaion
-					//
-					return;
-				}
-			}
-
-			boolean showWarning = false;
-			EditingDomain ed = addCommand.getDomain();
-			if (ed instanceof TraceableAdapterFactoryEditingDomain) {
-				Map copyToOriginalMap = ((TraceableAdapterFactoryEditingDomain) ed)
-						.getCopyToOriginalMap();
-
-				// check first element of addCommand.getCollection()
-				// if it's a key in the CopyToOriginalMap, we are pasting and
-				// may need to warn the user
-				// if it's not a key in the CopyToOriginalMap, then we are
-				// probably adding a new element
-				if (addCommand.getCollection() != null
-						&& addCommand.getCollection().size() > 0
-						&& copyToOriginalMap.containsKey(addCommand
-								.getCollection().toArray()[0])) {
-					elementToOldPluginMap = new HashMap();
-					Iterator iter = copyToOriginalMap.entrySet().iterator();
-					while (iter.hasNext()) {
-						Map.Entry entry = (Entry) iter.next();
-						if (entry.getValue() instanceof MethodElement
-								&& !(entry.getValue() instanceof MethodConfiguration)) {
-							MethodPlugin plugin = UmaUtil
-									.getMethodPlugin((MethodElement) entry
-											.getValue());
-							if (plugin != null) {
-								elementToOldPluginMap.put(entry.getKey(),
-										plugin);
-							} else {
-								// plugin == null, original element was probably
-								// deleted
-								showWarning = true;
-							}
-						}
-					}
-				}
-			}
-
-			if (showWarning) {
-					Messenger.INSTANCE
-						.showWarning(
-								getLabel(),
-								LibraryEditResources.MethodElementAddCommand_originalNotFoundWarning_msg);
-			}
-
-			final StringBuffer msgBuff = new StringBuffer();
-			IRunnableWithProgress operation = new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor) {
-					String msg = checkForIllegalReferences();
-					if (msg != null) {
-						msgBuff.append(msg);
-					}
-				}
-
-			};
-
-			IProgressMonitor defaultMonitor = null;
-			if (!runWithProgress) {
-				defaultMonitor = new NullProgressMonitor();
-			}
-
-			if (runWithProgress) {
-				UserInteractionHelper.runWithProgress(operation,
-						LibraryEditResources.checkingReferencesTask_name); 
-			} else {
-				try {
-					operation.run(defaultMonitor);
-				} catch (RuntimeException e) {
-					LibraryEditPlugin.INSTANCE.log(e);
-					throw e;
-				} catch (Exception e) {
-					LibraryEditPlugin.INSTANCE.log(e);
-					throw new RuntimeException(e.toString());
-				}
-			}
-			if (msgBuff.length() > 0) {
-				IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-				if(uiHandler  != null) {
-					int ret = uiHandler.selectOne(new int[] {IUserInteractionHandler.ACTION_YES, IUserInteractionHandler.ACTION_NO }, 
-							getLabel(), msgBuff.toString(), null);
-					if(ret == IUserInteractionHandler.ACTION_NO) {
-						return;
-					}
-				}
-			}
-
-			status = new MultiStatus(
-					LibraryEditPlugin.INSTANCE.getSymbolicName(),
-					IStatus.OK,
-					LibraryEditResources.MethodElementAddCommand_errorSavingFiles,
-					null); 
-			operation = new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor) {
-					if (removeXRefRequired) {
-						monitor.subTask(""); //$NON-NLS-1$
-
-						for (Iterator iter = addList.iterator(); iter.hasNext();) {
-							EObject element = (EObject) iter.next();
-							if (element instanceof MethodElement) {
-								removeIllegalReferences(ownerPlugin, element);
-							}
-						}
-					}
-
-					// add the elements
-					//
-					superExecute();
-
-					executeNestedCommands();
-
-					if (willSaveModifiedResources()) {
-						IStatus result = saveNewElementsWithOwnResource();
-						if (result.isOK()) {
-							monitor
-									.subTask(LibraryEditResources.savingModifiedFilesTask_name); 
-							saveModifiedResources();
-						} else {
-							status.add(result);
-						}
-					}
-
-					if (!status.isOK()) {
-						// FIXME: this causes dead-lock at
-						// LibraryProcessor.notifyListeners(). The method
-						// is synchronized, this might be the cause of the
-						// dead-lock
-						//
-						undo();
-						
-						if(CommandStatusChecker.hasRollbackError(status)) {
-							Collection<?> createdElements = command.getResult();
-							ILibraryPersister persister = Services.getDefaultLibraryPersister();
-							for (Object object : createdElements) {
-								if(object instanceof MethodElement) {
-									try {
-										persister.delete((MethodElement) object);
-									}
-									catch(Exception e) {
-										LibraryEditPlugin.getDefault().getLogger().logError(e);
-									}
-								}
-							}								
-						}						
-					}
-				}
-
-			};
-			if (runWithProgress) {
-				UserInteractionHelper.runWithProgress(operation, ""); //$NON-NLS-1$
-			} else {
-				try {
-					operation.run(defaultMonitor);
-				} catch (RuntimeException e) {
-					LibraryEditPlugin.INSTANCE.log(e);
-					throw e;
-				} catch (Exception e) {
-					LibraryEditPlugin.INSTANCE.log(e);
-					throw new RuntimeException(e.toString());
-				}
-			}
-
-			if (!status.isOK()) {
-				Messenger.INSTANCE.showError(getLabel(), LibraryEditResources.error_msgWithDetails, status);
-				return;
-			}
-		} catch (RuntimeException e) {
-			Messenger.INSTANCE.showError(getLabel(), LibraryEditResources.error_msg, null, e);
-		}
-	}
-
-	private boolean addFeatureIsContainment() {
-		return addCommand.getFeature() instanceof EReference
-				&& ((EReference) addCommand.getFeature()).isContainment();
-	}
-
-	/**
-	 * Saves added elements that are new to the library and can have own
-	 * resource that no other resource refers to (like MethodConfiguration)
-	 * 
-	 * @throws Exception
-	 */
-	protected IStatus saveNewElementsWithOwnResource() {
-		if (addFeatureIsContainment()) {
-			ILibraryPersister persister = Services.getDefaultLibraryPersister();
-			for (Iterator iter = addList.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof MethodElement) {
-					MethodElement me = (MethodElement) element;
-
-					if (me instanceof ContentElement ||
-						me instanceof MethodPlugin || 
-						me instanceof MethodConfiguration) {						
-						IStatus is = checkFilePathLengthBeforeSave(me);
-						if (is != null) {
-							return is;
-						}
-					}
-
-					if (persister.hasOwnResourceWithoutReferrer(me)) {
-						try {
-							persister.save(me);
-						} catch (Exception e) {
-							LibraryEditPlugin.getDefault().getLogger()
-									.logError(e);
-							String msg = e.getMessage();
-							if (StrUtil.isBlank(msg)) {
-								msg = e.toString();
-							}
-							return new SaveStatus(IStatus.ERROR,
-									LibraryEditPlugin.INSTANCE
-											.getSymbolicName(),
-									SaveStatus.SAVE_ERROR, msg, e);
-						}
-					}
-				}
-			}
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	private IStatus checkFilePathLengthBeforeSave(MethodElement element) {
-		MethodElement parentElementWithResource = null;
-		if (element instanceof MethodPlugin || element instanceof MethodConfiguration) {
-			parentElementWithResource = UmaUtil.getMethodLibrary(element);
-		} else {
-			parentElementWithResource = UmaUtil.getMethodPlugin(element);
-		}
-		if (! NameChecker.checkFilePathLength(parentElementWithResource, element, element.getName(), 
-				IValidator.MaxFilePathNameLength, null)) {
-			String msg = NLS.bind(LibraryEditResources.filePathNameTooLong_msg, 
-					new Object[] { new Integer(IValidator.MaxFilePathNameLength) } );
-			return new SaveStatus(IStatus.ERROR,
-					LibraryEditPlugin.INSTANCE
-							.getSymbolicName(),
-					SaveStatus.SAVE_ERROR, msg, null);
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 */
-	protected void executeNestedCommands() {
-		List nestedCommandProviders = ExtensionManager
-				.getNestedCommandProviders();
-		if (!nestedCommandProviders.isEmpty()) {
-			if (!addList.isEmpty()) {
-				nestedCommands = new ArrayList();
-				for (Iterator iter = nestedCommandProviders.iterator(); iter
-						.hasNext();) {
-					INestedCommandProvider cmdProvider = (INestedCommandProvider) iter
-							.next();
-					try {
-						Command cmd = cmdProvider.createRelatedObjects(addList,
-								this);
-						if (cmd != null && cmd.canExecute()) {
-							cmd.execute();
-							nestedCommands.add(cmd);
-						}
-					} catch (Exception e) {
-						LibraryEditPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-
-	}
-
-	private static class ContainmentInfo {
-		EObject container;
-
-		int index;
-
-		ContainmentInfo(EObject container, int index) {
-			this.container = container;
-			this.index = index;
-		}
-	}
-
-	private static class IllegalReferenceRemover {
-		private MethodPlugin targetPlugin;
-
-		private Collection elementsToMove;
-
-		/**
-		 * list of Reference objects
-		 * 
-		 * @see Reference
-		 */
-		private List illegalReferences;
-
-		private Set affectedResources;
-
-		private ArrayList removedReferences;
-
-		private boolean searchOutgoingRefs;
-
-		private boolean searchIncomingRefs;
-
-		public IllegalReferenceRemover(MethodPlugin targetPlugin,
-				Collection elementsToMove, boolean searchOutgoingRefs,
-				boolean searchIncomingRefs) {
-			this.targetPlugin = targetPlugin;
-			this.elementsToMove = elementsToMove;
-			this.searchOutgoingRefs = searchOutgoingRefs;
-			this.searchIncomingRefs = searchIncomingRefs;
-		}
-
-		public Set getAffectedResources() {
-			if (affectedResources == null) {
-				illegalReferences = new ArrayList();
-				for (Iterator iterator = elementsToMove.iterator(); iterator
-						.hasNext();) {
-					Object obj = iterator.next();
-
-					if (obj instanceof MethodElement) {
-						MethodElement e = (MethodElement) obj;
-
-						// get outgoing references
-						//
-						if (searchOutgoingRefs
-								&& !isExcludedFromOutgoingReferenceCheck(obj)) {
-							getIllegalOutgoingReferences(targetPlugin, e,
-									illegalReferences);
-						}
-
-						// get incoming references
-						//
-						if (searchIncomingRefs) {
-							Collection references = AssociationHelper
-									.getReferences(e);
-							for (Iterator iter = references.iterator(); iter
-									.hasNext();) {
-								MethodElement element = (MethodElement) iter
-										.next();
-								if (!elementsToMove.contains(element)) {
-									MethodPlugin plugin = UmaUtil
-											.getMethodPlugin(element);
-									if (plugin != null
-											&& plugin != targetPlugin
-											&& !Misc.isBaseOf(targetPlugin,
-													plugin)) {
-										Collection xRefs = getXReferences(
-												element, e, null);
-										for (Iterator iter1 = xRefs.iterator(); iter1
-												.hasNext();) {
-											EStructuralFeature f = (EStructuralFeature) iter1
-													.next();
-											illegalReferences
-													.add(new Reference(element,
-															f, e));
-										}
-
-									}
-								}
-							}
-						}
-					}
-				}
-
-				affectedResources = new HashSet();
-				for (Iterator iter = illegalReferences.iterator(); iter
-						.hasNext();) {
-					Reference ref = (Reference) iter.next();
-					if (ref.owner.eResource() != null) {
-						affectedResources.add(ref.owner.eResource());
-					}
-				}
-			}
-			return affectedResources;
-		}
-
-		public void removeIllegalReferences() {
-			removedReferences = new ArrayList();
-			for (Iterator iter = illegalReferences.iterator(); iter.hasNext();) {
-				Reference ref = (Reference) iter.next();
-				if (ref.feature.isMany()) {
-					List list = ((List) ref.owner.eGet(ref.feature));
-					// TODO: needs revisit
-					// This code throws
-					// org.eclipse.emf.common.util.BasicEList$BasicIndexOutOfBoundsException
-					// sometimes
-					//
-					// if(ref.index != -1) {
-					// list.remove(ref.index);
-					// }
-					// else {
-					// list.remove(ref.value);
-					// }
-
-					list.remove(ref.value);
-				} else {
-					if (ref.feature == UmaPackage.eINSTANCE
-							.getVariabilityElement_VariabilityType()) {
-						//Should query the default value if extended for any attribute feature
-						ref.owner.eSet(ref.feature, VariabilityType.NA_LITERAL);
-					} else {
-						ref.owner.eSet(ref.feature, null);
-					}
-				}
-				removedReferences.add(ref);
-			}
-
-		}
-
-		public void restoreRemovedReferences() {
-			if (removedReferences == null) {
-				return;
-			}
-			for (int i = removedReferences.size() - 1; i > -1; i--) {
-				Reference ref = (Reference) removedReferences.get(i);
-				if (ref.feature.isMany()) {
-					List list = ((List) ref.owner.eGet(ref.feature));
-					if (ref.index != -1) {
-						try {
-							// TODO: need revisits
-							//
-							if (!list.contains(ref.value)) {
-								if (ref.index < list.size()) {
-									list.add(ref.index, ref.value);
-								} else {
-									list.add(ref.value);
-								}
-							}
-						} catch (RuntimeException e) {
-							throw e;
-						}
-					} else {
-						list.add(ref.value);
-					}
-				} else {
-					ref.owner.eSet(ref.feature, ref.value);
-				}
-			}
-		}
-	}
-
-	public static class MoveOperation {
-		/** Constants for state of the move operation */
-		private static final int STATE_START = 0;
-
-		private static final int STATE_SAVED_FILES = 80;
-
-		private static final int STATE_MOVED_FILES = 70;
-
-		private static final int STATE_COPIED_RESOURCES = 90;
-
-		private static final int STATE_END = 100;
-
-		// private Command command;
-		private AddCommand addCommand;
-
-		private Collection moveList;
-
-		private boolean removeXRefRequired = false;
-
-		private boolean isRefenrecedIllegally = false;
-
-		private MethodPlugin ownerPlugin;
-
-		private Map elementToOldPluginMap;
-
-		private Map elementToNewNameMap;
-
-		private IProgressMonitor monitor;
-
-		private Object shell;
-
-		private HashSet movedResources;
-
-		private MultiStatus status;
-
-		/**
-		 * Current state of the move operation, it can be one of the state
-		 * constants
-		 */
-		private int state;
-
-		protected Set modifiedResources;
-
-		private IllegalReferenceRemover illegalReferenceRemover;
-
-		private HashMap elementToOldContainerMap;
-
-		public MoveOperation(Command command, IProgressMonitor monitor,
-				Object shell) {
-			// this.command = command;
-			addCommand = (AddCommand) TngUtil.unwrap(command);
-			this.monitor = monitor;
-			this.shell = shell;
-		}
-
-		/**
-		 * @return Returns the status.
-		 */
-		public IStatus getStatus() {
-			return status;
-		}
-
-		/**
-		 * Checks if reloading library is needed in case of move failure
-		 * 
-		 * @return
-		 * @see #getStatus()
-		 */
-		public boolean reloadNeeded() {
-			return status != null
-					&& CommandStatusChecker.hasRollbackError(status);
-		}
-
-		private void undo() {
-			// undo name change
-			//
-			if (elementToNewNameMap != null) {
-				for (Iterator iter = elementToNewNameMap.entrySet().iterator(); iter
-						.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					NamedElement e = (NamedElement) entry.getKey();
-					e.setName((String) entry.getValue());
-				}
-			}
-
-			if (elementToOldContainerMap != null) {
-				for (Iterator iter = elementToOldContainerMap.entrySet()
-						.iterator(); iter.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					EObject e = (EObject) entry.getKey();
-					ContainmentInfo containmentInfo = (ContainmentInfo) entry
-							.getValue();
-					EStructuralFeature f = addCommand.getFeature();
-					if (f.isMany()) {
-						((List) containmentInfo.container.eGet(f)).add(
-								containmentInfo.index, e);
-					} else {
-						containmentInfo.container.eSet(f, e);
-					}
-				}
-			}
-
-			if (illegalReferenceRemover != null) {
-				illegalReferenceRemover.restoreRemovedReferences();
-			}
-		}
-
-		public void run() {
-			state = STATE_START;
-
-			status = new MultiStatus(LibraryEditPlugin.INSTANCE
-					.getSymbolicName(), IStatus.OK,
-					LibraryEditResources.error_reason, null); 
-
-			if (checkName()) {
-				// check if the configurations that will be updated after this
-				// command can be modified
-				//
-				IStatus execStatus = UserInteractionHelper
-						.checkConfigurationsToUpdate(addCommand, shell);
-				if (!execStatus.isOK()) {
-					Messenger.INSTANCE.showError(LibraryEditResources.moveDialog_title, null, execStatus);
-					return;
-				}
-
-				final StringBuffer msgBuffer = new StringBuffer();
-				IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-					public void run(IProgressMonitor monitor)
-							throws InvocationTargetException,
-							InterruptedException {
-						monitor
-								.subTask(LibraryEditResources.checkingReferencesTask_name); 
-						String msg = checkForIllegalReferences();
-						if (msg != null) {
-							msgBuffer.append(msg);
-						}
-					}
-
-				};
-
-				IStatus stat = UserInteractionHelper.getUIHelper().runInModalContext(runnable, true, monitor, shell);
-				if(!stat.isOK()) {
-					status.add(stat);
-					return;
-				}
-
-				if (msgBuffer.length() > 0) {
-					IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-					if(uiHandler  != null) {
-						int ret = uiHandler.selectOne(new int[] {IUserInteractionHandler.ACTION_YES, IUserInteractionHandler.ACTION_NO }, 
-								LibraryEditResources.moveDialog_title, msgBuffer.toString(), null);
-						if(ret == IUserInteractionHandler.ACTION_NO) {
-							return;
-						}
-					}
-				}
-
-				// save reference to old resource of all elements in the
-				// moveList
-				//
-				final Map elementToOldResourceMap = new HashMap();
-				for (Iterator iter = moveList.iterator(); iter.hasNext();) {
-					EObject element = (EObject) iter.next();
-					if (element instanceof MethodElement) {
-						// save the reference to old resource
-						//
-						elementToOldResourceMap.put(element, element
-								.eResource());
-					}
-				}
-
-				if (removeXRefRequired || isRefenrecedIllegally) {
-					// get set of resources that will be modified during this
-					// move
-					//
-					illegalReferenceRemover = new IllegalReferenceRemover(
-							ownerPlugin, moveList, removeXRefRequired,
-							isRefenrecedIllegally);
-					runnable = new IRunnableWithProgress() {
-
-						public void run(IProgressMonitor monitor)
-								throws InvocationTargetException,
-								InterruptedException {
-							monitor
-									.subTask(LibraryEditResources.checkAffectedResourcesTask_name); 
-							modifiedResources = illegalReferenceRemover
-									.getAffectedResources();
-						}
-
-					};
-					stat = UserInteractionHelper.getUIHelper().runInModalContext(runnable, true, monitor, shell);
-					if(!stat.isOK()) {
-						status.add(stat);
-						return;
-					}
-
-					// check affected resources for unmodifiable
-					execStatus = UserInteractionHelper.checkModify(
-							modifiedResources, shell);
-					if (!execStatus.isOK()) {
-						Messenger.INSTANCE.showError(LibraryEditResources.moveDialog_title, null, execStatus);
-						return;
-					}
-
-					try {
-						monitor
-								.subTask(LibraryEditResources.removingReferencestask_name); 
-						illegalReferenceRemover.removeIllegalReferences();
-					} catch (Exception e) {
-						undo();
-						String msg = TngUtil.toStackTraceString(e);
-						status.add(new Status(IStatus.ERROR,
-								LibraryEditPlugin.INSTANCE.getSymbolicName(),
-								0, msg, e));
-					}
-				} else {
-					modifiedResources = new HashSet();
-					monitor.subTask(""); //$NON-NLS-1$
-				}
-
-				// set new name if there is any
-				//
-				for (Iterator iter = elementToNewNameMap.entrySet().iterator(); iter
-						.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					NamedElement element = (NamedElement) entry.getKey();
-					element.setName((String) entry.getValue());
-					modifiedResources.add(element.eResource());
-					if (element instanceof MethodUnit) {
-						movedResources.add(element.eResource());
-						if (element instanceof ContentElement) {
-							ContentElement e = (ContentElement) element;
-							if (ContentDescriptionFactory.hasPresentation(e)) {
-								movedResources.add(e.getPresentation());
-							}
-						}
-					}
-				}
-
-				// move elements
-				//
-				runnable = new IRunnableWithProgress() {
-
-					public void run(IProgressMonitor monitor)
-							throws InvocationTargetException,
-							InterruptedException {
-						monitor
-								.setTaskName(LibraryEditResources.movingTask_name); 
-						doMove(monitor, elementToOldResourceMap,
-								modifiedResources);
-					}
-
-				};
-				stat = UserInteractionHelper.getUIHelper().runInModalContext(runnable, true, monitor, shell);
-				if(!stat.isOK()) {
-					undo();
-					status.add(stat);
-					return;
-				}
-
-
-				// check moved resources that are not in modifiable resources
-				// for unmodifiable
-				//
-				List resources = new ArrayList(movedResources);
-				resources.removeAll(modifiedResources);
-				execStatus = UserInteractionHelper
-						.checkModify(resources, shell);
-				if (!execStatus.isOK()) {
-					Messenger.INSTANCE.showError(LibraryEditResources.moveDialog_title, null, execStatus);
-
-					undo();
-					return;
-				}
-
-				// save resources
-				//
-				runnable = new IRunnableWithProgress() {
-
-					public void run(IProgressMonitor monitor)
-							throws InvocationTargetException,
-							InterruptedException {
-						try {
-							IStatus saveStatus = save(monitor);
-							if (!saveStatus.isOK()) {
-								status.add(saveStatus);
-							}
-						} catch (RuntimeException e) {
-							LibraryEditPlugin.INSTANCE.log(e);
-							throw e;
-						}
-					}
-
-				};
-				stat = UserInteractionHelper.getUIHelper().runInModalContext(runnable, true, monitor, shell);
-				if(!stat.isOK()) {
-					status.add(stat);
-					return;
-				}
-
-			}
-
-			state = STATE_END;
-		}
-
-		/**
-		 * interacts with user
-		 * 
-		 * @return
-		 */
-		private boolean checkName() {
-			elementToNewNameMap = MethodElementAddCommand.checkName(addCommand);
-			return elementToNewNameMap != null;
-		}
-
-		/**
-		 * Long running method
-		 * 
-		 * @return
-		 */
-		private String checkForIllegalReferences() {
-			elementToOldPluginMap = new HashMap();
-
-			moveList = new ArrayList(addCommand.getCollection());
-			movedResources = new HashSet();
-
-			for (Iterator iter = addCommand.getCollection().iterator(); iter
-					.hasNext();) {
-				EObject element = (EObject) iter.next();
-
-				// // set new name if there is any
-				// //
-				// String newName = (String) elementToNewNameMap.get(element);
-				// if(newName != null) {
-				// ((NamedElement)element).setName(newName);
-				// if(element instanceof MethodUnit) {
-				// movedResources.add(element.eResource());
-				// if(element instanceof ContentElement) {
-				// ContentElement e = (ContentElement) element;
-				// if(ContentDescriptionFactory.hasPresentation(e)) {
-				// movedResources.add(e.getPresentation());
-				// }
-				// }
-				// }
-				// }
-
-				if (element instanceof MethodElement) {
-					elementToOldPluginMap.put(element, UmaUtil
-							.getMethodPlugin(element));
-				}
-				for (Iterator iterator = element.eAllContents(); iterator
-						.hasNext();) {
-					moveList.add(iterator.next());
-				}
-			}
-
-			// check if there is any illegal reference in the moved objects
-			//			
-			ownerPlugin = UmaUtil.getMethodPlugin(addCommand.getOwner());
-			find_xPluginRef: for (Iterator iter = addCommand.getCollection()
-					.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-
-				if (isExcludedFromOutgoingReferenceCheck(element)) {
-					continue find_xPluginRef;
-				}
-
-				if (element instanceof MethodElement) {
-					if (hasIllegalReferenceIncludingAllChildren(ownerPlugin,
-							(MethodElement) element, moveList)) {
-						removeXRefRequired = true;
-						break find_xPluginRef;
-					}
-				}
-			}
-
-			find_illegalReferencer: for (Iterator iter = moveList.iterator(); iter
-					.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof MethodElement) {
-					if (isReferencedIllegally(ownerPlugin,
-							(MethodElement) element, moveList)) {
-						isRefenrecedIllegally = true;
-						break find_illegalReferencer;
-					}
-				}
-			}
-			if (removeXRefRequired || isRefenrecedIllegally) {
-				return LibraryEditResources.invalidReferencesError_reason; 
-			}
-			return null;
-		}
-
-		/**
-		 * Long running method
-		 * 
-		 * @return
-		 */
-		private void doMove(IProgressMonitor monitor,
-				Map elementToOldResourceMap, Set modifiedResources) {
-			monitor.subTask(""); //$NON-NLS-1$
-
-			elementToOldContainerMap = new HashMap();
-			for (Iterator iter = addCommand.getCollection().iterator(); iter
-					.hasNext();) {
-				EObject element = (EObject) iter.next();
-				if (element instanceof MethodElement) {
-					EObject container = element.eContainer();
-					EStructuralFeature feature = element.eContainingFeature();
-					int index;
-					if (feature.isMany()) {
-						index = ((List) container.eGet(feature))
-								.indexOf(element);
-					} else {
-						index = -1;
-					}
-					elementToOldContainerMap.put(element, new ContainmentInfo(
-							container, index));
-				}
-			}
-
-			// move the elements
-			//
-			addCommand.execute();
-
-			// collect resources that had been modifed as result of this move
-			//
-			Resource newResource = addCommand.getOwner().eResource();
-			modifiedResources.add(newResource);
-			for (Iterator iter = addCommand.getAffectedObjects().iterator(); iter
-					.hasNext();) {
-				EObject element = (EObject) TngUtil.unwrap(iter.next());
-				if (element instanceof MethodElement) {
-					EObject oldContainer = ((ContainmentInfo) elementToOldContainerMap
-							.get(element)).container;
-					if (oldContainer.eResource() != newResource
-							&& !oldContainer.eResource().getContents()
-									.isEmpty()) {
-						modifiedResources.add(oldContainer.eResource());
-						Resource oldResource = (Resource) elementToOldResourceMap
-								.get(element);
-						if (oldContainer.eResource() != oldResource) {
-							movedResources.add(oldResource);
-						}
-					}
-
-					Object plugin = elementToOldPluginMap.get(element);
-					if (ownerPlugin != plugin) {
-						// it's a cross-plugin move, add the resources of those
-						// children that have direct resource
-						// to the moveResources list
-						//						
-						for (Iterator iterator = element.eAllContents(); iterator
-								.hasNext();) {
-							EObject e = (EObject) iterator.next();
-							if (UmaUtil.hasDirectResource(e)) {
-								movedResources.add(e.eResource());
-								elementToOldPluginMap.put(e, plugin);
-							}
-						}
-
-						// if(element instanceof DescribableElement &&
-						// ContentDescriptionFactory.hasPresentation((DescribableElement)
-						// element)) {
-						// movedResources.add(((DescribableElement)element).getPresentation().eResource());
-						// elementToOldPluginMap.put(((DescribableElement)element).getPresentation(),
-						// plugin);
-						// }
-						// for (Iterator iterator = element.eAllContents();
-						// iterator
-						// .hasNext();) {
-						// Object e = iterator.next();
-						// if(e instanceof DescribableElement &&
-						// ContentDescriptionFactory.hasPresentation((DescribableElement)
-						// e)) {
-						// movedResources.add(((DescribableElement)e).getPresentation().eResource());
-						// elementToOldPluginMap.put(((DescribableElement)e).getPresentation(),
-						// plugin);
-						// }
-						// }
-					}
-				}
-			}
-		}
-
-		private IStatus save(IProgressMonitor monitor) {
-			MultiStatus status = new MultiStatus(
-					LibraryEditPlugin.INSTANCE.getSymbolicName(),
-					IStatus.OK,
-					LibraryEditResources.MethodElementAddCommand_errorSavingFiles,
-					null); 
-
-			monitor.subTask(LibraryEditResources.savingModifiedFilesTask_name); 
-			ILibraryPersister.FailSafeMethodLibraryPersister persister = Services
-					.getDefaultLibraryPersister().getFailSafePersister();
-			save: do {
-				try {
-
-					if (!movedResources.isEmpty()) {
-						monitor
-								.subTask(LibraryEditResources.movingFilesTask_name); 
-
-						// move the moved resources
-						//
-						persister.adjustLocation(movedResources);
-					}
-					state = STATE_MOVED_FILES;
-
-					// save the modified resources
-					//
-					for (Iterator iter = modifiedResources.iterator(); iter
-							.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						try {
-							// monitor.subTask(MessageFormat.format("Saving
-							// ''{0}''", pathArgs));
-							persister.save(resource);
-
-						} catch (Exception e) {
-							String msg = NLS.bind(
-									LibraryEditResources.saveFileError_reason,
-									resource.getURI().isFile() ? resource.getURI().toFileString() : resource.toString());
-							status.add(new SaveStatus(IStatus.ERROR,
-									LibraryEditPlugin.INSTANCE
-											.getSymbolicName(),
-									SaveStatus.SAVE_ERROR, msg, e));
-							break save;
-						}
-					}
-					persister.commit();
-					state = STATE_SAVED_FILES;
-
-					if (resMgr != null) {
-						monitor
-								.subTask(LibraryEditResources.copyingResourcesTask_name); 
-
-						Collection elementsToCopyRefContents = new ArrayList();
-						for (Iterator iter = movedResources.iterator(); iter
-								.hasNext();) {
-							Resource resource = (Resource) iter.next();
-							elementsToCopyRefContents.addAll(resource
-									.getContents());
-						}
-
-						elementsToCopyRefContents.addAll(addCommand
-								.getAffectedObjects());
-
-						Collection modified = resMgr.copyReferencedContents(
-								elementsToCopyRefContents,
-								elementToOldPluginMap);
-						if (modified != null && !modified.isEmpty()) {
-							for (Iterator iter = modified.iterator(); iter
-									.hasNext();) {
-								Resource resource = (Resource) iter.next();
-								Object[] pathArgs = { resource.getURI().isFile() ? resource.getURI()
-										.toFileString() : resource.toString()};
-								try {
-									monitor
-											.subTask(MessageFormat
-													.format(
-															LibraryEditResources.savingFileTask_name,
-															pathArgs)); 
-									persister.save(resource);
-								} catch (Exception e) {
-									String msg = MessageFormat
-											.format(
-													LibraryEditResources.saveFileError_reason,
-													pathArgs); 
-									status.add(new SaveStatus(IStatus.ERROR,
-											LibraryEditPlugin.INSTANCE
-													.getSymbolicName(),
-											SaveStatus.SAVE_ERROR, msg, e));
-									break save;
-								}
-							}
-						}
-					}
-					persister.commit();
-					state = STATE_COPIED_RESOURCES;
-
-				} catch (RuntimeException e) {
-					StringWriter msg = new StringWriter();
-					e.printStackTrace(new PrintWriter(msg));
-					IStatus newStatus = new SaveStatus(IStatus.ERROR,
-							LibraryEditPlugin.INSTANCE.getSymbolicName(),
-							SaveStatus.SAVE_ERROR, msg.toString(), e);
-					status.add(newStatus);
-				} finally {
-					if (status.getSeverity() == IStatus.ERROR) {
-						try {
-							persister.rollback();
-						} catch (Exception e) {
-							LibraryEditPlugin.INSTANCE.log(e);
-							StringWriter msg = new StringWriter();
-							e.printStackTrace(new PrintWriter(msg));
-							IStatus newStatus = new SaveStatus(IStatus.ERROR,
-									LibraryEditPlugin.INSTANCE
-											.getSymbolicName(),
-									SaveStatus.ROLLBACK_ERROR, msg.toString(),
-									e);
-							status.add(newStatus);
-						}
-					}
-				}
-			} while (false);
-
-			monitor.subTask(LibraryEditResources.command_done); 
-			return status;
-		}
-	}
-
-	public static interface ResourceManager {
-
-		/**
-		 * Copies the content resources that are referenced by the content of
-		 * the given elements that have been moved/copied to new location.
-		 * 
-		 * @param elements
-		 *            Elements that are moved or copied.
-		 * @return collection of modified resources as the result of this call.
-		 */
-		Collection<Resource> copyReferencedContents(Collection<MethodElement> elements,
-				Map<MethodElement, MethodPlugin> elementToOldPluginMap);
-	}
-
-	public static class BasicResourceManager implements ResourceManager {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.library.edit.command.MethodElementAddCommand.ResourceManager#copyReferencedContents(java.util.Collection)
-		 */
-		public Collection<Resource> copyReferencedContents(Collection<MethodElement> elements,
-				Map<MethodElement, MethodPlugin> elementToOldPluginMap) {
-			return null;
-		}
-
-	}
-
-	public static void setResourceManager(ResourceManager resMgr) {
-		MethodElementAddCommand.resMgr = resMgr;
-	}
-
-	private static StringValidator getStringValidator() {
-		if (stringValidator == null) {
-			stringValidator = new StringValidator();
-		}
-		return stringValidator;
-	}
-
-	private static ResourceManager resMgr = null;
-
-	private static StringValidator stringValidator = null;
-
-	private static class StringValidator extends AbstractStringValidator {
-
-		private Collection elements;
-
-		private IValidator validator;
-
-		private EStructuralFeature feature;
-
-		/**
-		 * 
-		 */
-		private StringValidator() {
-		}
-
-		/**
-		 * @param elements
-		 *            the elements to include in the check.
-		 */
-		public StringValidator(Collection elements, EStructuralFeature feature) {
-			this.elements = elements;
-			this.feature = feature;
-		}
-
-		/**
-		 * Sets the elements to include in the check.
-		 * 
-		 * @param elements
-		 *            the elements to include in the check.
-		 */
-		public void setElements(Collection elements) {
-			this.elements = elements;
-		}
-
-		public void setFeature(EStructuralFeature feature) {
-			this.feature = feature;
-		}
-
-		public void setValidator(IValidator validator) {
-			this.validator = validator;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.dialogs.IInputValidator#isValid(java.lang.String)
-		 */
-		public String isValid(String newText) {
-			if (validator instanceof UniquenessValidator) {
-				EObject obj = ((UniquenessValidator) validator).getEObject();
-				int classID = obj.eClass().getClassifierID();
-				newText = newText.trim();
-				for (Iterator iter = elements.iterator(); iter.hasNext();) {
-					EObject e = (EObject) iter.next();
-					String str = (String) e.eGet(feature);
-					if (obj != e && classID == e.eClass().getClassifierID()
-							&& newText.equalsIgnoreCase(str)) {
-						// return I18nUtil.formatString(RESOURCE_BUNDLE, key,
-						// data);
-						return NLS
-								.bind(
-										LibraryEditResources.duplicateElementNameError_msg,
-										newText);
-					}
-				}
-			}
-			return validator.isValid(newText);
-		}
-
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementCreateChildCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementCreateChildCommand.java
deleted file mode 100644
index cefdcbe..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementCreateChildCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.validation.AbstractStringValidator;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This command is used to create a child method element and add it to the
- * containing method element.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class MethodElementCreateChildCommand extends CreateChildCommand {
-
-	private boolean executed = false;
-	protected IValidator validator;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodElementCreateChildCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Object child, int index,
-			Collection selection, Helper helper) {
-		super(domain, owner, feature, child, index, selection, helper);
-	}
-
-	private void superExecute() {
-		super.execute();
-	}
-	
-	protected IValidator getValidator() {
-		if(validator == null) {
-			validator = new AbstractStringValidator() {
-				public String isValid(String newText) {
-					if (newText.trim().length() == 0) {
-						String elementText = LibraryEditResources.element_text; 
-						//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-						return NLS.bind(LibraryEditResources.emptyElementNameError_msg, elementText); 
-					}
-					List children = (List) owner.eGet(feature);
-					for (Iterator iter = children.iterator(); iter.hasNext();) {
-						NamedElement child = (NamedElement) iter.next();
-						if (child.getName().equalsIgnoreCase(newText)) {
-							//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-							return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, newText); 
-						}
-					}
-					return null;
-				}
-			};
-		}
-		return validator;
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.command.CommandWrapper#execute()
-	 */
-	public void execute() {
-		String title = NLS.bind(LibraryEditResources.newElement_text, helper.getCreateChildText(owner, feature, child, selection)); 
-		IValidator validator = getValidator();
-//		final String name = UserInteractionHelper.requestName(child,
-//				UmaPackage.eINSTANCE.getNamedElement_Name(), title, validator);
-		IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-		UserInput userInput = new UserInput(LibraryEditResources.nameLabel_text, UserInput.TEXT, 
-				false, null, null, validator, this);		
-		if(uiHandler.requestInput(title, LibraryEditResources.SpecifyNameText, Collections.singletonList(userInput))) { 
-			String name = (String) userInput.getInput();
-			if (name != null) {
-				((NamedElement) child).setName(name);
-				superExecute();
-				executed = true;
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.command.CreateChildCommand#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		if (executed) {
-			return super.getAffectedObjects();
-		}
-		return Collections.singletonList(owner);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.command.CreateChildCommand#getResult()
-	 */
-	public Collection getResult() {
-		if (executed) {
-			return super.getResult();
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	public EObject getOwner() {
-		return owner;
-	}
-	
-	public Object getChild() {
-		return child;
-	}
-	
-	public EStructuralFeature getFeature() {
-		return feature;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInCategoryCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInCategoryCommand.java
deleted file mode 100644
index b36e8fd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInCategoryCommand.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.library.edit.util.ContentElementOrderList;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * This command is used to reorder a method element within a category.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class MoveInCategoryCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private ContentCategory category;
-
-	private EStructuralFeature feature;
-
-	private List elementsList;
-	
-	private ContentElementOrderList elementOrderList;
-
-	private String[] categoryPkgPath;
-
-	private ContentCategory usedCategory = null;
-
-	private Collection<Resource> modifiedResources;
-
-	private static int UP = 1;
-
-	private static int Down = 0;
-
-	private int direction = -1;
-
-	private boolean moved;
-
-	public MoveInCategoryCommand(ContentCategory category, List elementsList,
-			ContentElementOrderList orderList,
-			EStructuralFeature feature, String[] categoryPkgPath,
-			int direction) {
-		this.category = category;
-		this.feature = feature;
-		this.elementsList = elementsList;		
-		this.elementOrderList = orderList ;
-		this.categoryPkgPath = categoryPkgPath;
-		this.direction = direction;
-		modifiedResources = new HashSet<Resource>();
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	/**
-	 * @param label
-	 */
-	public MoveInCategoryCommand(String label) {
-		super(label);
-	}
-
-	/**
-	 * @param label
-	 * @param description
-	 */
-	public MoveInCategoryCommand(String label, String description) {
-		super(label, description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection<Resource> getModifiedResources() {
-		modifiedResources.add(category.eResource());
-		return modifiedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		MethodPlugin categoryPlugin = UmaUtil.getMethodPlugin(category);
-		MethodPlugin elementPlugin = UmaUtil
-				.getMethodPlugin((MethodElement) elementsList.get(0));
-
-		if (categoryPlugin != elementPlugin
-				&& Misc.isBaseOf(categoryPlugin, elementPlugin)) {
-			usedCategory = TngUtil.findContributor(UmaUtil.findContentPackage(
-					elementPlugin, categoryPkgPath), category);
-		} else {
-			usedCategory = category;
-		}
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		if (usedCategory == null)
-			return;
-		for (Iterator it = elementsList.iterator(); it.hasNext();) {
-			Object object = it.next();
-			if (feature.isMany()) {
-				int index = elementOrderList.indexOf(object);
-				if (direction == UP) {
-					if (index > 0)
-						elementOrderList.move(index - 1, object);
-				} else if (direction == Down) {
-					if (index < elementOrderList.size())
-						elementOrderList.move(index + elementsList.size(), object);
-				}
-				moved = true;
-			} else {
-				usedCategory.eSet(feature, null);
-			}
-		}
-		elementOrderList.apply();
-	}
-
-	public void undo() {
-		if (moved) {
-			for (Iterator it = elementsList.iterator(); it.hasNext();) {
-				Object object = it.next();
-				if (feature.isMany()) {
-					int index = elementOrderList.indexOf(object);
-					if (direction == UP) {
-					if (index < elementOrderList.size())
-						elementOrderList.move(index + elementsList.size(), object);
-					} else if (direction == Down) {
-						if (index > 0)
-							elementOrderList.move(index - 1, object);
-					}
-					moved = true;
-				} else {
-					usedCategory.eSet(feature, object);
-				}
-			}
-			elementOrderList.apply();
-			moved = false;
-		}
-		if (TngUtil.isEmpty(usedCategory)) {
-			EcoreUtil.remove(usedCategory);
-			usedCategory = null;
-		}
-	}
-
-	public Collection<ContentCategory> getAffectedObjects() {
-		return Collections.singletonList(usedCategory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInConfigurationCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInConfigurationCommand.java
deleted file mode 100644
index 29a8442..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInConfigurationCommand.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * This command is used to move a view in a method configuration
- * @author Xiang Dong Hu
- * @since 1.2
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=173827
- */
-public class MoveInConfigurationCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-	
-	private MethodConfiguration config;
-
-	private EStructuralFeature feature;
-
-	private List elementsList;
-	
-	private Collection modifiedResources;
-
-	private static int UP = 1;
-
-	private static int Down = 0;
-
-	private int direction = -1;
-
-	private boolean moved;
-	
-	public MoveInConfigurationCommand(MethodConfiguration config, List elementsList,
-			EStructuralFeature feature, int direction) {
-		this.config = config;
-		this.feature = feature;
-		this.elementsList = elementsList;
-		this.direction = direction;
-	}
-	
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		return modifiedResources;
-	}
-
-	public void execute() {
-		modifiedResources = new HashSet();
-		redo();
-
-	}
-
-	public void redo() {
-		if (config == null)
-			return;
-		for (Iterator it = elementsList.iterator(); it.hasNext();) {
-			Object object = it.next();
-			if (feature.isMany()) {
-				EList list = (EList) config.eGet(feature);
-				int index = list.indexOf(object);
-				if (direction == UP) {
-					if (index > 0)
-						list.move(index - 1, object);
-				} else if (direction == Down) {
-					if (index < list.size())
-						list.move(index + elementsList.size(), object);
-				}
-				moved = true;
-			} else {
-				config.eSet(feature, null);
-			}
-		}
-		if (config.eResource() != null) {
-			modifiedResources.add(config.eResource());
-		}
-
-	}
-	
-	public void undo() {
-		if (moved) {
-			for (Iterator it = elementsList.iterator(); it.hasNext();) {
-				Object object = it.next();
-				if (feature.isMany()) {
-					EList list = (EList) config.eGet(feature);
-					int index = list.indexOf(object);
-					if (direction == UP) {
-						if (index < list.size())
-							list.move(index + elementsList.size(), object);
-					} else if (direction == Down) {
-						if (index > 0)
-							list.move(index - 1, object);
-					}
-					moved = true;
-				} else {
-					config.eSet(feature, object);
-				}
-			}
-			moved = false;
-		}
-	}
-	
-	public Collection getAffectedObjects() {
-		return Collections.singletonList(config);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInSectionListCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInSectionListCommand.java
deleted file mode 100644
index 1b084e7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MoveInSectionListCommand.java
+++ /dev/null
@@ -1,178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.SectionList;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * This command is used to reorder a section within a section list.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class MoveInSectionListCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private ContentElement contentElement;
-
-	private SectionList sectionList;
-
-	private List elementsList;
-
-	private ContentElement usedContentElement = null;
-
-	private Collection modifiedResources;
-
-	private static int UP = 1;
-
-	private static int Down = 0;
-
-	private int direction = -1;
-
-	private boolean moved;
-
-	/**
-	 * @deprecated
-	 */
-	public MoveInSectionListCommand() {
-		super();
-	}
-
-	public MoveInSectionListCommand(ContentElement contentElement,
-			List elementsList, SectionList sectionList, int direction) {
-		this.contentElement = contentElement;
-		this.sectionList = sectionList;
-		this.elementsList = elementsList;
-		this.direction = direction;
-
-		modifiedResources = new HashSet();
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	/**
-	 * @param label
-	 */
-	public MoveInSectionListCommand(String label) {
-		super(label);
-	}
-
-	/**
-	 * @param label
-	 * @param description
-	 */
-	public MoveInSectionListCommand(String label, String description) {
-		super(label, description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		modifiedResources.add(contentElement.eResource());
-		return modifiedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		MethodPlugin taskPlugin = UmaUtil.getMethodPlugin(contentElement);
-		MethodPlugin elementPlugin = UmaUtil
-				.getMethodPlugin((MethodElement) elementsList.get(0));
-
-		if (taskPlugin != elementPlugin
-				&& Misc.isBaseOf(taskPlugin, elementPlugin)) {
-			for (Iterator iter = TngUtil.getContributors(contentElement); iter
-					.hasNext();) {
-				VariabilityElement ve = (VariabilityElement) iter.next();
-				if (ve instanceof ContentElement
-						&& UmaUtil.getMethodPlugin(ve) == elementPlugin) {
-					usedContentElement = (ContentElement) ve;
-					break;
-				}
-			}
-		}
-		if (usedContentElement == null) {
-			usedContentElement = contentElement;
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		if (usedContentElement == null)
-			return;
-		for (Iterator it = elementsList.iterator(); it.hasNext();) {
-			Object object = it.next();
-			int index = sectionList.indexOf(object);
-			if (direction == UP) {
-				if (index > 0)
-					sectionList.move(index - 1, object);
-			} else if (direction == Down) {
-				if (index < sectionList.size())
-					sectionList.move(index + elementsList.size(), object);
-			}
-			moved = true;
-		}
-		sectionList.apply();
-
-	}
-
-	public void undo() {
-		if (moved) {
-			for (Iterator it = elementsList.iterator(); it.hasNext();) {
-				Object object = it.next();
-				int index = sectionList.indexOf(object);
-				if (direction == UP) {
-					if (index < sectionList.size())
-						sectionList.move(index + elementsList.size(), object);
-				} else if (direction == Down) {
-					if (index > 0)
-						sectionList.move(index - 1, object);
-				}
-				moved = true;
-			}
-			sectionList.apply();
-			moved = false;
-		}
-	}
-
-	public Collection getAffectedObjects() {
-		return Collections.singletonList(usedContentElement);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/NestedCommandExcecutor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/NestedCommandExcecutor.java
deleted file mode 100644
index f2c690c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/NestedCommandExcecutor.java
+++ /dev/null
@@ -1,111 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.1
- */
-public class NestedCommandExcecutor {
-	private Command command;
-	private ArrayList<Command> nestedCommands;
-
-	public NestedCommandExcecutor(Command command) {
-		this.command = command;
-	}
-	
-	public List<Command> getNestedCommands() {
-		if(nestedCommands == null) {
-			nestedCommands = new ArrayList<Command>();
-		}
-		return nestedCommands;
-	}
-
-	public void executeNestedCommands() {
-		List<INestedCommandProvider> nestedCommandProviders = ExtensionManager.getNestedCommandProviders();
-		if(!nestedCommandProviders.isEmpty()) {
-			for (INestedCommandProvider cmdProvider : nestedCommandProviders) {
-				try {
-					Command cmd = cmdProvider.createNestedCommand(command);
-					if(cmd != null && cmd.canExecute()) {							
-						cmd.execute();
-						getNestedCommands().add(cmd);
-					}
-				}
-				catch(Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}	
-	}
-
-	public void undoNestedCommands() {
-		if(nestedCommands != null && !nestedCommands.isEmpty()) {
-			for(int i = nestedCommands.size() - 1; i > -1; i--) {
-				Command cmd = (Command) nestedCommands.get(i);
-				try {
-					if(cmd.canUndo()) {
-						cmd.undo();
-					}
-				}
-				catch(Exception e) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				}
-				finally {
-					try { cmd.dispose(); } catch(Exception e) {}
-				}
-			}
-			nestedCommands.clear();
-		}
-	}
-
-	public void dispose() {
-		if(nestedCommands != null && !nestedCommands.isEmpty()) {
-			for(int i = nestedCommands.size() - 1; i > -1; i--) {
-				Command cmd = (Command) nestedCommands.get(i);
-				try { cmd.dispose(); } catch(Exception e) {}
-			}
-			nestedCommands.clear();
-		}
-	}
-	
-	public Collection<Resource> getModifiedResources() {
-		Collection<Resource> modifiedResources = new HashSet<Resource>();
-		if(nestedCommands != null && !nestedCommands.isEmpty()) {
-			for(int i = nestedCommands.size() - 1; i > -1; i--) {
-				Command cmd = (Command) nestedCommands.get(i);
-				if(cmd instanceof IResourceAwareCommand) {
-					try {
-						Collection resources = ((IResourceAwareCommand)cmd).getModifiedResources();
-						if(resources != null) {
-							modifiedResources.addAll(resources);
-						}
-					}
-					catch(Exception e) {
-						LibraryEditPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-		return modifiedResources.isEmpty() ? Collections.EMPTY_SET : modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/Reference.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/Reference.java
deleted file mode 100644
index a4f8d8c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/Reference.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class Reference {
-	
-	EObject owner;
-
-	EStructuralFeature feature;
-
-	Object value;
-
-	int index = -1;
-
-	public Reference(EObject owner, EStructuralFeature feature, Object value) {
-		this.owner = owner;
-		this.feature = feature;
-		this.value = value;
-		if (feature.isMany()) {
-			List list = (List) owner.eGet(feature);
-			index = list.indexOf(value);
-		}
-	}
-
-	Reference(EObject owner, EStructuralFeature feature, Object value, int index) {
-		this.owner = owner;
-		this.feature = feature;
-		this.value = value;
-		this.index = index;
-	}
-
-	public EStructuralFeature getFeature() {
-		return feature;
-	}
-
-	public int getIndex() {
-		return index;
-	}
-
-	public EObject getOwner() {
-		return owner;
-	}
-
-	public Object getValue() {
-		return value;
-	}
-	
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveFromCategoryCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveFromCategoryCommand.java
deleted file mode 100644
index 22e10bd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveFromCategoryCommand.java
+++ /dev/null
@@ -1,145 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * This command is used to remove a method element from a category.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RemoveFromCategoryCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private ContentCategory category;
-
-	private MethodElement element;
-
-	private EStructuralFeature feature;
-
-	private String[] contentPkgPath;
-
-	private ContentCategory usedCategory;
-
-	private int removedElementIndex = -1;
-
-	private boolean removed = false;
-
-	private List usedCategories;
-
-	public RemoveFromCategoryCommand(ContentCategory category,
-			MethodElement element, EStructuralFeature feature,
-			String[] contentPkgPath, List usedCategories) {
-		this.category = category;
-		this.element = element;
-		this.feature = feature;
-		this.contentPkgPath = contentPkgPath;
-		this.usedCategories = usedCategories;
-	}
-
-	public Collection getModifiedResources() {
-		if (usedCategory != null && usedCategory.eResource() != null) {
-			return Collections.singletonList(usedCategory.eResource());
-		}
-
-		return Collections.EMPTY_LIST;
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public void execute() {
-		MethodPlugin categoryPlugin = UmaUtil.getMethodPlugin(category);
-		MethodPlugin elementPlugin = UmaUtil.getMethodPlugin(element);
-
-		if (categoryPlugin != elementPlugin
-				&& Misc.isBaseOf(categoryPlugin, elementPlugin)) {
-			usedCategory = TngUtil.findContributor(UmaUtil.findContentPackage(
-					elementPlugin, contentPkgPath), category);
-		} else {
-			usedCategory = category;
-		}
-
-		redo();
-	}
-
-	public void redo() {
-		if (usedCategory == null)
-			return;
-
-		if (feature.isMany()) {
-			Collection collection = (Collection) usedCategory.eGet(feature);
-			if (collection instanceof EList) {
-				removedElementIndex = ((EList) collection).indexOf(element);
-			}
-			removed = collection.remove(element);
-		} else {
-			usedCategory.eSet(feature, null);
-			removed = true;
-		}
-		if (removed) {
-			if (!usedCategories.contains(category)) {
-				usedCategories.add(category);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		if (removed) {
-			if (feature.isMany()) {
-				Collection collection = (Collection) usedCategory.eGet(feature);
-				if (collection instanceof EList && removedElementIndex != -1) {
-					((EList) collection).add(removedElementIndex, element);
-				} else
-					collection.add(element);
-			} else {
-				usedCategory.eSet(feature, element);
-			}
-			removed = false;
-		}
-		if (usedCategories.contains(category)) {
-			usedCategories.remove(category);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getResult()
-	 */
-	public Collection getResult() {
-		if (removed) {
-			return Collections.singletonList(element);
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveFromSectionList.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveFromSectionList.java
deleted file mode 100644
index a24ade0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveFromSectionList.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.epf.library.edit.util.SectionList;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Section;
-
-/**
- * This command is used to remove a section from a section list.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RemoveFromSectionList extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private ContentElement contentElement;
-
-	private SectionList sectionList;
-
-	private Section section;
-
-	private Collection modifiedResources;
-
-	private boolean removed;
-
-	private int removedObjectIndex = -1;
-
-	public RemoveFromSectionList(ContentElement contentElement,
-			Section section, SectionList sectionList) {
-		this.contentElement = contentElement;
-		this.sectionList = sectionList;
-		this.section = section;
-
-		modifiedResources = new HashSet();
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		if (contentElement.getPresentation().eResource() != null) {
-			modifiedResources.add(contentElement.getPresentation().eResource());
-		}
-		return modifiedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		if (contentElement == null)
-			return;
-		removedObjectIndex = sectionList.indexOf(section);
-		sectionList.remove(section);
-		removed = true;
-		sectionList.apply();
-	}
-
-	public void undo() {
-		if (removed) {
-			if (removedObjectIndex != -1) {
-				sectionList.add(removedObjectIndex, section);
-			} else {
-				sectionList.add(section);
-			}
-			sectionList.apply();
-			removed = false;
-		}
-	}
-
-	public Collection getAffectedObjects() {
-		return Collections.singletonList(contentElement);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveReferencesCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveReferencesCommand.java
deleted file mode 100644
index f718940..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/RemoveReferencesCommand.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EContentsEList;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * This command is used to remove method element references.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RemoveReferencesCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private MethodPlugin plugin;
-
-	private MethodPlugin base;
-
-	private Map<FeatureValuePair, Object> featureValuePairToObjectMap;
-
-	private Collection<Resource> modifiedResources;
-
-	/**
-	 * Constructs a command to remove all references in <code>plugin</code>
-	 * that are elements of <code>base</code>
-	 * 
-	 * @param plugin
-	 * @param base
-	 */
-	public RemoveReferencesCommand(MethodPlugin plugin, MethodPlugin base) {
-		super();
-		this.plugin = plugin;
-		this.base = base;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection<Resource> getModifiedResources() {
-		return modifiedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		featureValuePairToObjectMap = new HashMap<FeatureValuePair, Object>();
-		modifiedResources = new HashSet<Resource>();
-
-		for (EContentsEList.FeatureIterator featureIterator = (EContentsEList.FeatureIterator) plugin
-				.eCrossReferences().iterator(); featureIterator.hasNext();) {
-			EObject ref = (EObject) featureIterator.next();
-			EStructuralFeature f = featureIterator.feature();
-			if (f != UmaPackage.eINSTANCE.getMethodPlugin_Bases()
-					&& UmaUtil.getMethodPlugin(ref) == base) {
-				featureValuePairToObjectMap.put(new FeatureValuePair(f, ref),
-						plugin);
-			}
-		}
-
-		for (Iterator iter = plugin.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-
-			// ignore ProcessElement b/c it can references anything
-			//
-			if (element instanceof ProcessElement) {
-				continue;
-			}
-
-			for (EContentsEList.FeatureIterator featureIterator = (EContentsEList.FeatureIterator) element
-					.eCrossReferences().iterator(); featureIterator.hasNext();) {
-				EObject ref = (EObject) featureIterator.next();
-
-				if (UmaUtil.getMethodPlugin(ref) == base) {
-					EStructuralFeature f = featureIterator.feature();
-					featureValuePairToObjectMap.put(
-							new FeatureValuePair(f, ref), element);
-					if(f == UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT) {
-						EStructuralFeature feature = UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE;
-						featureValuePairToObjectMap.put(
-								new FeatureValuePair(feature, element.eGet(feature)), element);
-					}
-				}
-			}
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		for (Iterator iter = featureValuePairToObjectMap.entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			FeatureValuePair fvPair = (FeatureValuePair) entry.getKey();
-			EObject element = (EObject) entry.getValue();
-			if (fvPair.feature.isMany()) {
-				((Collection) element.eGet(fvPair.feature))
-						.remove(fvPair.value);
-			} else {
-				element.eSet(fvPair.feature, null);
-			}
-			if (element.eResource() != null) {
-				modifiedResources.add(element.eResource());
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		for (Iterator iter = featureValuePairToObjectMap.entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			FeatureValuePair fvPair = (FeatureValuePair) entry.getKey();
-			EObject element = (EObject) entry.getValue();
-			if (fvPair.feature.isMany()) {
-				((Collection) element.eGet(fvPair.feature)).add(fvPair.value);
-			} else {
-				element.eSet(fvPair.feature, fvPair.value);
-			}
-		}
-	}
-	
-	@Override
-	public void dispose() {
-		base = plugin = null;
-		if(featureValuePairToObjectMap != null) {
-			featureValuePairToObjectMap.clear();
-		}
-		if(modifiedResources != null) {
-			modifiedResources.clear();
-		}
-		super.dispose();
-	}
-
-	private static class FeatureValuePair {
-		EStructuralFeature feature;
-
-		Object value;
-
-		FeatureValuePair(EStructuralFeature f, Object v) {
-			feature = f;
-			value = v;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwareCompoundCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwareCompoundCommand.java
deleted file mode 100644
index d4da3ee..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwareCompoundCommand.java
+++ /dev/null
@@ -1,144 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.CompoundCommand;
-
-/**
- * A compound command that is resource aware.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ResourceAwareCompoundCommand extends CompoundCommand implements
-		IResourceAwareCommand {
-
-	public ResourceAwareCompoundCommand() {
-		super();
-	}
-
-	/**
-	 * @param label
-	 */
-	public ResourceAwareCompoundCommand(String label) {
-		super(label);
-	}
-
-	/**
-	 * @param label
-	 * @param description
-	 */
-	public ResourceAwareCompoundCommand(String label, String description) {
-		super(label, description);
-	}
-
-	/**
-	 * @param commandList
-	 */
-	public ResourceAwareCompoundCommand(List commandList) {
-		super(commandList);
-	}
-
-	/**
-	 * @param label
-	 * @param commandList
-	 */
-	public ResourceAwareCompoundCommand(String label, List commandList) {
-		super(label, commandList);
-	}
-
-	/**
-	 * @param label
-	 * @param description
-	 * @param commandList
-	 */
-	public ResourceAwareCompoundCommand(String label, String description,
-			List commandList) {
-		super(label, description, commandList);
-	}
-
-	/**
-	 * @param resultIndex
-	 */
-	public ResourceAwareCompoundCommand(int resultIndex) {
-		super(resultIndex);
-	}
-
-	/**
-	 * @param resultIndex
-	 * @param label
-	 */
-	public ResourceAwareCompoundCommand(int resultIndex, String label) {
-		super(resultIndex, label);
-	}
-
-	/**
-	 * @param resultIndex
-	 * @param label
-	 * @param description
-	 */
-	public ResourceAwareCompoundCommand(int resultIndex, String label,
-			String description) {
-		super(resultIndex, label, description);
-	}
-
-	/**
-	 * @param resultIndex
-	 * @param commandList
-	 */
-	public ResourceAwareCompoundCommand(int resultIndex, List commandList) {
-		super(resultIndex, commandList);
-	}
-
-	/**
-	 * @param resultIndex
-	 * @param label
-	 * @param commandList
-	 */
-	public ResourceAwareCompoundCommand(int resultIndex, String label,
-			List commandList) {
-		super(resultIndex, label, commandList);
-	}
-
-	/**
-	 * @param resultIndex
-	 * @param label
-	 * @param description
-	 * @param commandList
-	 */
-	public ResourceAwareCompoundCommand(int resultIndex, String label,
-			String description, List commandList) {
-		super(resultIndex, label, description, commandList);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		Collection modifiedResources = new HashSet();
-		for (Iterator iter = commandList.iterator(); iter.hasNext();) {
-			Object cmd = iter.next();
-			if (cmd instanceof IResourceAwareCommand) {
-				modifiedResources.addAll(((IResourceAwareCommand) cmd)
-						.getModifiedResources());
-			}
-		}
-		return modifiedResources;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwareDragAndDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwareDragAndDropCommand.java
deleted file mode 100644
index 556212f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwareDragAndDropCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.DragAndDropCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public class ResourceAwareDragAndDropCommand extends DragAndDropCommand 
-implements IResourceAwareCommand
-{
-
-	private Set<Resource> modifiedResources;
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param location
-	 * @param operations
-	 * @param operation
-	 * @param collection
-	 */
-	public ResourceAwareDragAndDropCommand(EditingDomain domain, Object owner,
-			float location, int operations, int operation, Collection<?> collection) {
-		super(domain, owner, location, operations, operation, collection);
-	}
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param location
-	 * @param operations
-	 * @param operation
-	 * @param collection
-	 * @param optimize
-	 */
-	public ResourceAwareDragAndDropCommand(EditingDomain domain, Object owner,
-			float location, int operations, int operation,
-			Collection<?> collection, boolean optimize) {
-		super(domain, owner, location, operations, operation, collection,
-				optimize);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	@SuppressWarnings("unchecked")
-	public Collection<Resource> getModifiedResources() {
-		if(modifiedResources == null) {
-			if(dropCommand != null) {
-				modifiedResources = TngUtil.getModifiedResources(dropCommand);
-			}
-			if(modifiedResources == null || modifiedResources.isEmpty()) {
-				modifiedResources = Collections.EMPTY_SET;
-			}
-		}
-		return modifiedResources;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwarePasteFromClipboardCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwarePasteFromClipboardCommand.java
deleted file mode 100644
index 239d315..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/ResourceAwarePasteFromClipboardCommand.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.CommandWrapper;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-
-/**
- * @author Phong Nguyen Le - Aug 22, 2006
- * @since  1.0
- */
-public class ResourceAwarePasteFromClipboardCommand extends
-		PasteFromClipboardCommand implements IResourceAwareCommand {
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param feature
-	 * @param index
-	 * @param optimize
-	 */
-	public ResourceAwarePasteFromClipboardCommand(EditingDomain domain, Object owner, Object feature, int index, boolean optimize) {
-		super(domain, owner, feature, index, optimize);
-	}
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param feature
-	 * @param index
-	 */
-	public ResourceAwarePasteFromClipboardCommand(EditingDomain domain, Object owner, Object feature, int index) {
-		super(domain, owner, feature, index);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		Collection modifiedResources = new HashSet();
-		if(owner instanceof EObject) {
-			Resource resource = ((EObject)owner).eResource();
-			if(resource != null) {
-				modifiedResources.add(resource);
-			}
-		}
-		for (Iterator iter = command.getCommandList().iterator(); iter.hasNext();) {
-			Object cmd = iter.next();
-			while(!(cmd instanceof IResourceAwareCommand) && cmd instanceof CommandWrapper) {
-				cmd = ((CommandWrapper)cmd).getCommand();
-			}
-			if (cmd instanceof IResourceAwareCommand) {
-				modifiedResources.addAll(((IResourceAwareCommand) cmd)
-						.getModifiedResources());
-			}
-		}
-		return modifiedResources;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/SaveStatus.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/SaveStatus.java
deleted file mode 100644
index 37f5095..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/SaveStatus.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import org.eclipse.core.runtime.Status;
-
-/**
- * The status of a save operation.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class SaveStatus extends Status {
-
-	public static final int SAVE_ERROR = 1;
-
-	public static final int ROLLBACK_ERROR = 2;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param severity
-	 * @param pluginId
-	 * @param code
-	 * @param message
-	 * @param exception
-	 */
-	public SaveStatus(int severity, String pluginId, int code, String message,
-			Throwable exception) {
-		super(severity, pluginId, code, message, exception);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/SetOppositeFeatureCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/SetOppositeFeatureCommand.java
deleted file mode 100644
index 364c68e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/SetOppositeFeatureCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * This command is used to set an opposite feature.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class SetOppositeFeatureCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private MethodElement element;
-
-	private OppositeFeature oppositeFeature;
-
-	private EObject value;
-
-	private EObject oldValue;
-
-	private Collection modifiedResources;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SetOppositeFeatureCommand(MethodElement e,
-			OppositeFeature oppositeFeature, EObject value) {
-		this.element = e;
-		this.oppositeFeature = oppositeFeature;
-		this.value = value;
-	}
-
-	public Collection getModifiedResources() {
-		if (modifiedResources == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return modifiedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		if (value instanceof MethodElement) {
-			return UserInteractionHelper.checkModifyOpposite(
-					(MethodElement) value, oppositeFeature.getTargetFeature(),
-					element);
-		}
-		return true;
-	}
-
-	public void execute() {
-		oldValue = (EObject) ((MultiResourceEObject) element)
-				.getOppositeFeatureValue(oppositeFeature);
-		modifiedResources = new HashSet();
-
-		redo();
-	}
-
-	public void redo() {
-		if (oldValue != null && value == null) {
-			if (oppositeFeature.getTargetFeature().isMany()) {
-				((Collection) oldValue.eGet(oppositeFeature.getTargetFeature()))
-						.remove(element);
-			} else {
-				oldValue.eSet(oppositeFeature.getTargetFeature(), null);
-			}
-			if (oldValue.eResource() != null) {
-				modifiedResources.add(oldValue.eResource());
-			}
-		}
-
-		if (value != null) {
-			if (oppositeFeature.getTargetFeature().isMany()) {
-				((Collection) value.eGet(oppositeFeature.getTargetFeature()))
-						.add(element);
-			} else {
-				value.eSet(oppositeFeature.getTargetFeature(), element);
-			}
-			if (value.eResource() != null) {
-				modifiedResources.add(value.eResource());
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		if (value != null) {
-			if (oppositeFeature.getTargetFeature().isMany()) {
-				((Collection) value.eGet(oppositeFeature.getTargetFeature()))
-						.remove(element);
-			} else {
-				value.eSet(oppositeFeature.getTargetFeature(), null);
-			}
-		}
-
-		if (oldValue != null) {
-			if (oppositeFeature.getTargetFeature().isMany()) {
-				((Collection) oldValue.eGet(oppositeFeature.getTargetFeature()))
-						.add(element);
-			} else {
-				oldValue.eSet(oppositeFeature.getTargetFeature(), element);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/UserInput.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/UserInput.java
deleted file mode 100644
index 3d2f3ba..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/UserInput.java
+++ /dev/null
@@ -1,128 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.command;
-
-import java.util.List;
-
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.epf.library.edit.validation.IValidator;
-
-/**
- * Class that keeps the information about the input request and reference to the
- * input user specified or selected
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UserInput {
-	public static final int TEXT = 0;
-
-	public static final int SELECTION = 1;
-
-	private String label;
-
-	private int type;
-
-	private boolean multiple;
-
-	private List choices;
-
-	private Object input;
-
-	private IItemLabelProvider labelProvider;
-
-	private Object context;
-
-	private IValidator validator;
-
-	public UserInput(String label, int type, boolean multiple, List choices,
-			IItemLabelProvider labelProvider, Object context) {
-		this(label, type, multiple, choices, labelProvider, null, context);
-	}
-
-	/**
-	 * @param label
-	 * @param type
-	 * @param multiple
-	 * @param choices
-	 * @param labelProvider
-	 *            the label provider to represent the element in the
-	 *            <code>choices</code> list or <code>null</code> if
-	 *            <code>choices</code> list is <code>null</code>
-	 * @param validator
-	 *            the validator to validate the input
-	 * @param context
-	 *            the context of the user input that is command-specific and can
-	 *            contain addional information about the user input.
-	 */
-	public UserInput(String label, int type, boolean multiple, List choices,
-			IItemLabelProvider labelProvider, IValidator validator, Object context) {
-		super();
-		this.label = label;
-		this.type = type;
-		this.multiple = multiple;
-		this.choices = choices;
-		this.labelProvider = labelProvider;
-		this.validator = validator;
-		this.context = context;
-	}
-
-	public Object getInput() {
-		return input;
-	}
-
-	public void setInput(Object input) {
-		this.input = input;
-	}
-
-	public List getChoices() {
-		return choices;
-	}
-
-	public String getLabel() {
-		return label;
-	}
-
-	public boolean isMultiple() {
-		return multiple;
-	}
-
-	public int getType() {
-		return type;
-	}
-
-	/**
-	 * Gets the label provider
-	 * 
-	 * @return the label provider
-	 */
-	public IItemLabelProvider getLabelProvider() {
-		return labelProvider;
-	}
-	
-	/**
-	 * Gets the validator
-	 * 
-	 * @return the validator
-	 */
-	public IValidator getValidator() {
-		return validator;
-	}
-
-	/**
-	 * Gets the context of this user input
-	 * 
-	 * @return the context
-	 */
-	public Object getContext() {
-		return context;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/package.html
deleted file mode 100644
index 65d7ce2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides commands for editing method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ActivityItemProvider.java
deleted file mode 100644
index 18ff337..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ActivityItemProvider.java
+++ /dev/null
@@ -1,113 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * The item provider adapter for an activity in the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ActivityItemProvider extends
-		org.eclipse.epf.library.edit.process.ActivityItemProvider {
-
-	private Process process;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	private Process getProcess() {
-		if (process == null) {
-			Object top = getTopItem();
-			if (top instanceof Process) {
-				process = (Process) top;
-			}
-		}
-		return process;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.process.ActivityItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object child) {
-		return  child instanceof Milestone 
-			|| (child instanceof Activity
-				&& !TngUtil.isContributorOrReplacer((VariabilityElement) child)
-				&& ProcessUtil.accept((Activity) child, getFilter(), true));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-
-		// remove any suppressed child
-		//
-		Process proc = getProcess();
-		if (proc != null) {
-			// getProcess() might return null if getChildren(Object) is called
-			// on base activity to
-			// retrieve its children
-			//
-			Suppression suppression = Suppression.getSuppression(proc);
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object child = (Object) iter.next();
-				if (suppression.isSuppressed(child)) {
-					iter.remove();
-				}
-			}
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		if (notification.getFeatureID(Activity.class) == UmaPackage.ACTIVITY__SUPPRESSED) {
-			// refresh parent content
-			//
-			fireNotifyChanged(new ViewerNotification(notification,
-					getParent(notification.getNotifier()), true, false));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CategoriesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CategoriesItemProvider.java
deleted file mode 100644
index b97fd68..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CategoriesItemProvider.java
+++ /dev/null
@@ -1,264 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The base item provider adapter class for the standard categories in
- * a configuration.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class CategoriesItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IConfigurable, ILibraryItemProvider {
-
-	protected List children;
-
-	private String label;
-
-	private Object parent;
-
-	protected String[] categoryPkgPath;
-
-	protected IFilter filter;
-
-	private Object image;
-
-	protected IFilter uncategorizedFilter;
-
-	protected String uncategorizedLabel;
-
-	protected IFilter categorizedFilter;
-
-	protected Object uncategorizedImage;
-
-	protected MethodConfiguration methodConfig;
-
-	private UncategorizedItemProvider uncategorizedItemProvider;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CategoriesItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig, String name, Object image,
-			String[] categoryPkgPath) {
-		super(adapterFactory);
-		// methodConfig.eAdapters().add(this);
-		this.methodConfig = methodConfig;
-		label = name;
-		this.categoryPkgPath = categoryPkgPath;
-		this.image = image;
-	}
-
-	protected UncategorizedItemProvider createUncategorizedItemProvider() {
-		if (uncategorizedItemProvider == null) {
-			uncategorizedItemProvider = new UncategorizedItemProvider(
-					adapterFactory, methodConfig, uncategorizedFilter,
-					uncategorizedLabel, uncategorizedImage);
-		}
-		return uncategorizedItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-		} else {
-			children.clear();
-		}
-		// MethodConfiguration methodConfig = (MethodConfiguration) target;
-		for (Iterator iter = methodConfig.getMethodPluginSelection().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			ContentPackage pkg = UmaUtil.findContentPackage(plugin,
-					categoryPkgPath);
-			if (pkg != null /*
-							 * &&
-							 * methodConfig.getMethodPackageSelection().contains(pkg)
-							 */) {
-				for (Iterator iterator = pkg.getContentElements().iterator(); iterator
-						.hasNext();) {
-					ContentCategory element = (ContentCategory) iterator.next();
-					if (categorizedFilter.accept(element)
-							&& (filter != null ? filter.accept(element) : true)) {
-						children.add(element);
-					}
-				}
-			}
-		}
-
-		// set parent
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object adapter = (TngAdapterFactory.INSTANCE)
-					.getConfigurationView_ComposedAdapterFactory().adapt(
-							iter.next(), ITreeItemContentProvider.class);
-			// Object adapter =
-			// (TngAdapterFactory.INSTANCE).getItemsFilter_AdapterFactory(filter).adapt(iter.next(),
-			// ITreeItemContentProvider.class);
-			if (adapter instanceof ILibraryItemProvider) {
-				((ILibraryItemProvider) adapter).setParent(this);
-			}
-			// This is need forcing to set the IConfigurator to Childrens
-			if (adapter instanceof IConfigurable) {
-				((IConfigurable) adapter).setFilter(filter);
-			}
-		}
-
-		if (uncategorizedFilter != null) {
-			children.add(createUncategorizedItemProvider());
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getNewChildDescriptors(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-	 */
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		// return super.getNewChildDescriptors(target, editingDomain, sibling);
-		return super.getNewChildDescriptors(methodConfig, editingDomain,
-				sibling);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null)
-			return parent;
-		if (object instanceof EObject) {
-			return super.getParent(object);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (label != null)
-			return label;
-		return super.getText(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setCategorizedFilter(IFilter filter) {
-		categorizedFilter = filter;
-	}
-
-	public void setUncategorizedFilter(IFilter filter) {
-		uncategorizedFilter = filter;
-	}
-
-	public void setUncategorizedLabel(String label) {
-		uncategorizedLabel = label;
-	}
-
-	public void setUncategorizedImage(Object img) {
-		uncategorizedImage = img;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-		this.label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return super.getChildrenFeatures(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (uncategorizedItemProvider != null) {
-			uncategorizedItemProvider.dispose();
-		}
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CategorizedProcessesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CategorizedProcessesItemProvider.java
deleted file mode 100644
index fb7a6e0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CategorizedProcessesItemProvider.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Capability Patterns" and "Delivery
- * Processes" folders in the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class CategorizedProcessesItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IConfigurable, ILibraryItemProvider {
-
-	List children;
-
-	private String label;
-
-	private Object parent;
-
-	private String[] pkgPath;
-
-	private IFilter filter;
-
-	private Object image;
-
-	private MethodConfiguration methodConfig;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CategorizedProcessesItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig, String name, Object image,
-			String[] pkgPath) {
-		super(adapterFactory);
-		this.methodConfig = methodConfig;
-		label = name;
-		this.pkgPath = pkgPath;
-		this.image = image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-		} else {
-			children.clear();
-		}
-		ArrayList procPkgs = new ArrayList();
-		for (Iterator iter = methodConfig.getMethodPluginSelection().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			MethodPackage pkg = UmaUtil.findMethodPackage(plugin, pkgPath);
-			if (pkg != null
-					&& methodConfig.getMethodPackageSelection().contains(pkg)) {
-				for (Iterator iterator = pkg.getChildPackages().iterator(); iterator
-						.hasNext();) {
-					Object element = iterator.next();
-					ProcessPackageItemProvider.collectChildren(children,
-							element, filter);
-				}
-			}
-		}
-
-		if (!procPkgs.isEmpty()) {
-			children.addAll(0, procPkgs);
-
-			// TODO: sort alphabetically, process packages before processes
-		}
-
-		// set parent
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			ProcessUtil.setParent(child, object, adapterFactory);
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getNewChildDescriptors(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-	 */
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return super.getNewChildDescriptors(methodConfig, editingDomain,
-				sibling);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null)
-			return parent;
-		if (object instanceof EObject) {
-			return super.getParent(object);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (label != null)
-			return label;
-		return super.getText(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-		this.label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return super.getChildrenFeatures(object);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CustomCategoriesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CustomCategoriesItemProvider.java
deleted file mode 100644
index a96af23..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/CustomCategoriesItemProvider.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Custom Categories" folder in the
- * Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class CustomCategoriesItemProvider extends CategoriesItemProvider {
-
-	public CustomCategoriesItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig, String name, Object image,
-			String[] categoryPkgPath) {
-		super(adapterFactory, methodConfig, name, image, categoryPkgPath);
-	}
-
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-		} else {
-			children.clear();
-		}
-		// MethodConfiguration methodConfig = (MethodConfiguration) target;
-		for (Iterator iter = methodConfig.getMethodPluginSelection().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			ContentPackage pkg = UmaUtil.findContentPackage(plugin,
-					categoryPkgPath);
-			CustomCategory root = TngUtil.getRootCustomCategory(plugin);
-			if (root != null && pkg != null
-					&& methodConfig.getMethodPackageSelection().contains(pkg)) {
-				for (Iterator iterator = root.getCategorizedElements()
-						.iterator(); iterator.hasNext();) {
-					Object element = iterator.next();
-					if (filter != null ? filter.accept(element) : true) {
-						children.add(element);
-					}
-				}
-			}
-		}
-
-		// set parent
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object adapter = (TngAdapterFactory.INSTANCE)
-					.getConfigurationView_ComposedAdapterFactory().adapt(
-							iter.next(), ITreeItemContentProvider.class);
-			if (adapter instanceof ILibraryItemProvider) {
-				((ILibraryItemProvider) adapter).setParent(this);
-			}
-		}
-
-		return children;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DisciplineGroupingItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DisciplineGroupingItemProvider.java
deleted file mode 100644
index e197d26..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DisciplineGroupingItemProvider.java
+++ /dev/null
@@ -1,118 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.category.DisciplineCategoryItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a discipline grouping in the Configuration
- * view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineGroupingItemProvider extends
-		DisciplineCategoryItemProvider implements IConfigurable {
-
-	private IConfigurator configurator;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineGroupingItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.category.DisciplineCategoryItemProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		return parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.category.DisciplineCategoryItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children;
-
-		// TODO: commented out until Jinhua fixed bugs in ConfigurationFilter
-		if (configurator != null) {
-			children = configurator.getChildren(object, UmaPackage.eINSTANCE
-					.getDisciplineGrouping_Disciplines());
-			if (children != null) {
-				System.out
-						.println("DisciplineGroupingItemProvider.getChildren(): returned from configurator: " + children); //$NON-NLS-1$
-				return children;
-			}
-		}
-
-		children = super.getChildren(object);
-		DisciplineGrouping grouping = (DisciplineGrouping) object;
-		MethodConfiguration methodConf = (MethodConfiguration) ((CategoriesItemProvider) getParent(object))
-				.getTarget();
-		TngUtil.addExtendedChildren(grouping, methodConf, children,
-				ModelStructure.DEFAULT.disciplineDefinitionPath);
-
-		// set parent
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object adapter = (TngAdapterFactory.INSTANCE)
-					.getConfigurationView_ComposedAdapterFactory().adapt(
-							iter.next(), ITreeItemContentProvider.class);
-			if (adapter instanceof ILibraryItemProvider) {
-				((ILibraryItemProvider) adapter).setParent(this);
-			}
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		if (filter instanceof IConfigurator) {
-			configurator = (IConfigurator) filter;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DisciplineItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DisciplineItemProvider.java
deleted file mode 100644
index 39f098c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DisciplineItemProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a discipline in the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DisciplineItemProvider extends
-		org.eclipse.epf.library.edit.category.DisciplineItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DisciplineItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.category.DisciplineItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE.getDiscipline_Tasks());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getDiscipline_Subdiscipline());
-		}
-		return childrenFeatures;
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DomainItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DomainItemProvider.java
deleted file mode 100644
index d6f26bb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/DomainItemProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a domain in the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DomainItemProvider extends
-		org.eclipse.epf.library.edit.category.DomainItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DomainItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE.getDomain_Subdomains());
-			childrenFeatures.add(UmaPackage.eINSTANCE.getDomain_WorkProducts());
-		}
-		return childrenFeatures;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/GuidanceGroupingItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/GuidanceGroupingItemProvider.java
deleted file mode 100644
index 923ed0a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/GuidanceGroupingItemProvider.java
+++ /dev/null
@@ -1,396 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.element.IElementItemProvider;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Whitepaper;
-
-/**
- * The item provider adapter for the guidance folders.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class GuidanceGroupingItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IElementItemProvider, IGroupContainer, IConfigurable {
-
-	private Map groupItemProviderMap;
-
-	protected ArrayList children;
-
-	private MethodConfiguration methodConfig;
-
-	private IFilter filter;
-
-	/**
-	 * A map of EClass / ItemProviderAdapter for each type of guidance
-	 */
-	private static final IFilter checkListFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Checklist;
-		}
-	};
-
-	private static final IFilter conceptFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return ((obj instanceof Concept) && (!(obj instanceof Whitepaper)));
-		}
-	};
-
-	private static final IFilter exampleFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Example;
-		}
-	};
-
-	private static final IFilter practiceFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Practice;
-		}
-	};
-
-	private static final IFilter reportFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Report;
-		}
-	};
-
-	private static final IFilter reusableAssetFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof ReusableAsset;
-		}
-	};
-
-	private static final IFilter roadmapFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Roadmap;
-		}
-	};
-
-	private static final IFilter supportingMaterialFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof SupportingMaterial;
-		}
-	};
-
-	private static final IFilter guidelineFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Guideline;
-		}
-	};
-
-	private static final IFilter templateFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Template;
-		}
-	};
-
-	private static final IFilter termDefinitionFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof TermDefinition;
-		}
-	};
-
-	private static final IFilter toolMentorFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof ToolMentor;
-		}
-	};
-
-	private static final IFilter whitePaperFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Whitepaper;
-		}
-	};
-
-	private static final IFilter estimationConsiderationsFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof EstimationConsiderations;
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GuidanceGroupingItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig) {
-		super(adapterFactory);
-		this.methodConfig = methodConfig;
-	}
-
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-
-			groupItemProviderMap = new HashMap();
-
-			// checklist
-			Object image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/Checklists"); //$NON-NLS-1$
-			String name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Checklists"); //$NON-NLS-1$
-			GuidanceItemProvider child = new GuidanceItemProvider(
-					adapterFactory, methodConfig, name, image);
-			child.setGuidanceFilter(checkListFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// concept
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/Concepts"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Concepts"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(conceptFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// estimation Considerations
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/EstimationConsiderations"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_EstimationConsiderations"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(estimationConsiderationsFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// example
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/Examples"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Examples"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(exampleFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// practice
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/Practices"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Practices"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(practiceFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Report
-			image = LibraryEditPlugin.getPlugin()
-					.getImage("full/obj16/Reports"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Reports"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(reportFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Reusable Asset
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/ReusableAssets"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_ReusableAssets"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(reusableAssetFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Reusable Asset
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/Roadmaps"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Roadmap"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(roadmapFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Supporting Material
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/SupportingMaterials"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_SupportingMaterials"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(supportingMaterialFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// // Technique
-			// image =
-			// LibraryEditPlugin.getPlugin().getImage("full/obj16/Techniques");
-			// name =
-			// LibraryEditPlugin.INSTANCE.getString("_UI_Guidances_Techniques");
-			// child = new GuidanceItemProvider(adapterFactory, methodConfig,
-			// name, image);
-			// child.setGuidanceFilter(techniqueFilter);
-			// children.add(child);
-			// groupItemProviderMap.put(name, child);
-
-			// Template
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/Templates"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Templates"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(templateFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Term Definition
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/TermDefinitions"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_TermDefinitions"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(termDefinitionFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Tool Mentor
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/ToolMentors"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_ToolMentors"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(toolMentorFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Whitepaper
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/Whitepapers"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_Whitepapers"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(whitePaperFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			// Guidelines
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/WorkProductGuidelines"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Guidances_WorkProductGuidelines"); //$NON-NLS-1$
-			child = new GuidanceItemProvider(adapterFactory, methodConfig,
-					name, image);
-			child.setGuidanceFilter(guidelineFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-		}
-		
-		if (filter != null) {
-			// Should filter only copy only, not orginal cached children list.
-			List copy = new ArrayList();
-			copy.addAll(children);
-			for (Iterator iterator = copy.iterator(); iterator.hasNext();) {
-				GuidanceItemProvider obj = (GuidanceItemProvider) iterator
-						.next();
-				obj.setFilter(filter);
-				if (obj.getChildren(obj).isEmpty()) {
-					iterator.remove();
-				}
-			}
-			return copy;
-		}
-		return children;
-		
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/GuidanceFolder"); //$NON-NLS-1$
-	}
-
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Guidances_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
-	 */
-	public Object getGroupItemProvider(String name) {
-		return groupItemProviderMap.get(name);
-	}
-
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		return methodConfig;
-	}
-
-	public void setFilter(IFilter filter) {
-		// TODO Auto-generated method stub
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-		// TODO Auto-generated method stub
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/GuidanceItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/GuidanceItemProvider.java
deleted file mode 100644
index c8c98f5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/GuidanceItemProvider.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * The item provider adapter for a guidance specific folder.
- * 
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @since 1.0
- */
-public class GuidanceItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IConfigurable, ILibraryItemProvider {
-	List children;
-
-	private String label;
-
-	private Object parent;
-
-	private IFilter filter;
-
-	private Object image;
-
-	private IFilter guidanceFilter;
-
-	private MethodConfiguration methodConfig;
-
-	public class CompareByName implements Comparator {
-
-		public int compare(Object obj1, Object obj2) {
-			String name1 = ((MethodElement) obj1).getName();
-			String name2 = ((MethodElement) obj2).getName();
-			return name1.compareToIgnoreCase(name2);
-		}
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GuidanceItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig, String name, Object image) {
-		super(adapterFactory);
-		// methodConfig.eAdapters().add(this);
-		label = name;
-		this.methodConfig = methodConfig;
-		this.image = image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		// MethodConfiguration methodConfig = (MethodConfiguration) target;
-
-		ArrayList filterList = new ArrayList();
-		if (guidanceFilter != null) {
-			filterList.add(guidanceFilter);
-		}
-		if (filter != null) {
-			filterList.add(filter);
-		}
-		MethodConfigurationElementList elementList = new MethodConfigurationElementList(
-				methodConfig, filterList);
-		List elements = elementList.getList();
-
-		// sort by name
-		Collections.sort(elements, new CompareByName());
-		return elements;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getNewChildDescriptors(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-	 */
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return super.getNewChildDescriptors(methodConfig, editingDomain,
-				sibling);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null)
-			return parent;
-		if (object instanceof EObject) {
-			return super.getParent(object);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (label != null)
-			return label;
-		return super.getText(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setGuidanceFilter(IFilter filter) {
-		guidanceFilter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-		this.label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return super.getChildrenFeatures(object);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ItemProviderAdapterFactory.java
deleted file mode 100644
index 745aeb6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.epf.library.edit.breakdownelement.MilestoneItemProvider;
-
-/**
- * The item provider adapter factory for the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ItemProviderAdapterFactory extends
-		org.eclipse.epf.library.edit.navigator.ItemProviderAdapterFactory {
-
-	public Adapter createMethodConfigurationAdapter() {
-		Adapter adapter = new MethodConfigurationItemProvider(this);
-		return adapter;
-	}
-
-	public Adapter createProcessComponentAdapter() {
-		if (processComponentItemProvider == null) {
-			processComponentItemProvider = new ProcessComponentItemProvider(
-					this);
-		}
-
-		return processComponentItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.navigator.MethodpluginItemProviderAdapterFactory#createMethodPluginAdapter()
-	 */
-	/*
-	public Adapter createMethodPluginAdapter() {
-		MethodPluginItemProvider adapter = new MethodPluginItemProvider(this);
-		adapter.setModelStructure(ModelStructure.DEFAULT);
-		return adapter;
-	}
-	*/
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.navigator.MethodpluginItemProviderAdapterFactory#createProcessPackageAdapter()
-	 */
-	public Adapter createProcessPackageAdapter() {
-		Adapter adapter = new ProcessPackageItemProvider(this);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createDeliveryProcessAdapter()
-	 */
-	public Adapter createDeliveryProcessAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createCapabilityPatternAdapter()
-	 */
-	public Adapter createCapabilityPatternAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		Adapter adapter = new ActivityItemProvider(this);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createPhaseAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createIterationAdapter()
-	 */
-	public Adapter createIterationAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.navigator.ItemProviderAdapterFactory#createDisciplineGroupingAdapter()
-	 */
-	public Adapter createDisciplineGroupingAdapter() {
-		return new DisciplineGroupingItemProvider(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.navigator.ItemProviderAdapterFactory#createDisciplineAdapter()
-	 */
-	public Adapter createDisciplineAdapter() {
-		Adapter adapter = new DisciplineItemProvider(this);
-		return adapter;
-	}
-
-	public Adapter createDomainAdapter() {
-		if (domainItemProvider == null) {
-			domainItemProvider = new DomainItemProvider(this);
-		}
-
-		return domainItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.navigator.ItemProviderAdapterFactory#createRoleSetAdapter()
-	 */
-	public Adapter createRoleSetAdapter() {
-		Adapter adapter = new RoleSetItemProvider(this);
-		return adapter;
-	}
-	
-	@Override
-	public Adapter createMilestoneAdapter() {
-		return new MilestoneItemProvider(this);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/MethodConfigurationElementList.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/MethodConfigurationElementList.java
deleted file mode 100644
index f8934e0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/MethodConfigurationElementList.java
+++ /dev/null
@@ -1,136 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Keeps track of a list of method elements in a method configuration.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodConfigurationElementList {
-
-	private MethodConfiguration methodConfig;
-
-	private List filterList;
-
-	protected class ElementIterator extends AbstractTreeIterator {
-
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = -2291438970123985906L;
-
-		protected ElementIterator(ContentPackage contentPkg) {
-			super(contentPkg, false);
-		}
-		
-		protected List getChildrenList(Object object) {
-			ArrayList children = new ArrayList();
-			if(object instanceof ContentPackage) {
-				ContentPackage pkg = (ContentPackage) object;
-				List packages = pkg.getChildPackages();
-				int size = packages.size();
-				for (int i = 0; i < size; i++) {
-					Object obj = packages.get(i);
-					if (obj instanceof ContentPackage
-							&& methodConfig.getMethodPackageSelection().contains(obj)) {
-						children.add(obj);
-					}
-				}
-				if(checkAcceptance()) {
-					List elements = pkg.getContentElements();
-					size = elements.size();
-					for (int i = 0; i < size; i++) {
-						Object obj = elements.get(i);
-						if (accept(obj)) {
-							children.add(obj);
-						}
-					}
-				}
-				else {
-					children.addAll(pkg.getContentElements());
-				}
-			}
-			return children;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.common.util.AbstractTreeIterator#getChildren(java.lang.Object)
-		 */
-		protected Iterator getChildren(Object object) {
-			return getChildrenList(object).iterator();
-		}
-		
-	};
-	
-	public MethodConfigurationElementList(MethodConfiguration methodConfig,
-			List filterList) {
-		this.methodConfig = methodConfig;
-		this.filterList = filterList;
-	}
-
-	protected boolean checkAcceptance() {
-		return true;
-	}
-	
-	protected boolean accept(Object object) {
-		int size = filterList.size();
-		for (int i = 0; i < size; i++) {
-			IFilter filter = (IFilter) filterList.get(i);
-			if (!filter.accept(object))
-				return false;
-		}
-		return true;
-	}
-	
-	protected Iterator newIterator(ContentPackage pkg) {
-		return new ElementIterator(pkg);
-	}
-
-	private void getAllElements(ContentPackage pkg, List list) {
-		for(Iterator iter = newIterator(pkg); iter.hasNext();) {
-			Object e = iter.next();
-			if(!(e instanceof ContentPackage)) {
-				list.add(e);
-			}
-		}
-	}
-
-	public List getList() {
-		List list = new ArrayList();
-		for (Iterator iter = methodConfig.getMethodPluginSelection().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			ContentPackage pkg = UmaUtil.findContentPackage(plugin,
-					ModelStructure.DEFAULT.coreContentPath);
-			if (pkg != null) {
-				getAllElements(pkg, list);
-			}
-		}
-
-		return list;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/MethodConfigurationItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/MethodConfigurationItemProvider.java
deleted file mode 100644
index f9f8e47..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/MethodConfigurationItemProvider.java
+++ /dev/null
@@ -1,459 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.category.DisciplineCategoriesItemProvider;
-import org.eclipse.epf.library.edit.category.RoleSetsItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * The item provider adapter for a method configuration in the Configuration
- * view.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class MethodConfigurationItemProvider extends
-		org.eclipse.epf.uma.provider.MethodConfigurationItemProvider implements
-		IGroupContainer, IConfigurable, IStatefulItemProvider {
-
-	private Map groupItemProviderMap;
-
-	// changed to protected, extended class can play with children variable.
-	protected ArrayList children;
-
-	private IFilter disciplinesFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			ContentCategory element = (ContentCategory) obj;
-			// Browsing: With categories, replace generalization
-			// causes both replacement and base to become invisible to browsing
-			return DisciplineCategoriesItemProvider.accept(element) /*
-																	 * &&
-																	 * element.getVariabilityBasedOnElement() ==
-																	 * null
-																	 */;
-		}
-	};
-
-	private static final IFilter domainFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			// Browsing: With categories, replace generalization
-			// causes both replacement and base to become invisible to browsing
-			return obj instanceof Domain /*
-											 * &&
-											 * ((Domain)obj).getVariabilityBasedOnElement() ==
-											 * null
-											 */;
-		}
-
-	};
-
-	private static final IFilter workProductTypesFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			// Browsing: With categories, replace generalization
-			// causes both replacement and base to become invisible to browsing
-			return obj instanceof WorkProductType /*
-													 * &&
-													 * ((WorkProductType)obj).getVariabilityBasedOnElement() ==
-													 * null
-													 */;
-		}
-
-	};
-
-	private IFilter roleSetsFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			// Browsing: With categories, replace generalization
-			// causes both replacement and base to become invisible to browsing
-			return RoleSetsItemProvider.accept(obj) /*
-													 * &&
-													 * ((VariabilityElement)obj).getVariabilityBasedOnElement() ==
-													 * null
-													 */;
-		}
-	};
-
-	private static final IFilter toolsFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			// Browsing: With categories, replace generalization
-			// causes both replacement and base to become invisible to browsing
-			return obj instanceof Tool /*
-										 * &&
-										 * ((Tool)obj).getVariabilityBasedOnElement() ==
-										 * null
-										 */;
-		}
-
-	};
-
-	private static final IFilter customCategoriesFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			// Browsing: With categories, replace generalization
-			// causes both replacement and base to become invisible to browsing
-			return org.eclipse.epf.library.edit.category.CustomCategoriesItemProvider
-					.accept(obj) /*
-									 * &&
-									 * ((VariabilityElement)obj).getVariabilityBasedOnElement() ==
-									 * null
-									 */;
-		}
-
-	};
-	
-	// upcategorized filters can be reset based on configurator.
-	private IFilter uncategorizedTaskFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			return obj instanceof Task
-					&& AssociationHelper.getDisciplines((Task) obj).isEmpty();
-		}
-
-	};
-
-	private IFilter domainUncategorizedWorkProductFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			return obj instanceof WorkProduct
-					&& !AssociationHelper.getDomains((WorkProduct) obj).isEmpty();
-		}
-
-	};
-
-	private IFilter wpTypeUncategorizedWorkProductFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			return obj instanceof WorkProduct
-					&& AssociationHelper.getWorkProductTypes((WorkProduct) obj)
-							.isEmpty();
-		}
-
-	};
-
-	private IFilter uncategorizedRoleFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			return obj instanceof Role
-					&& AssociationHelper.getRoleSets((Role) obj).isEmpty();
-		}
-
-	};
-
-	private IFilter uncategorizedToolMentorFilter = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof ToolMentor
-					&& AssociationHelper.getTool((ToolMentor) obj) == null;
-		}
-
-	};
-
-	private IConfigurator configurator;
-
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodConfigurationItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (groupItemProviderMap != null) {
-			for (Iterator iter = groupItemProviderMap.values().iterator(); iter
-					.hasNext();) {
-				Object adapter = iter.next();
-				if (adapter instanceof IDisposable) {
-					((IDisposable) adapter).dispose();
-				}
-			}
-			groupItemProviderMap.clear();
-			groupItemProviderMap = null;
-		}
-
-		if (children != null) {
-			children.clear();
-			children = null;
-		}
-
-		super.dispose();
-	}
-
-	public Collection getChildren(Object object) {
-		// if(object instanceof MethodConfiguration) {
-		// return Collections.singleton(new
-		// ObjectLinkItemProvider(adapterFactory, object, (Notifier) object));
-		// }
-		// MethodConfiguration conf = (MethodConfiguration)
-		// ((ObjectLinkItemProvider) object).getLinkedObject();
-		MethodConfiguration conf = (MethodConfiguration) object;
-		if (children == null) {
-			children = new ArrayList();
-			groupItemProviderMap = new HashMap();
-			String name;
-			Object uncategorizedImage;
-			CategoriesItemProvider child;
-
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Disciplines_group"); //$NON-NLS-1$
-			child = new CategoriesItemProvider(
-					adapterFactory,
-					conf,
-					name,
-					LibraryEditPlugin.INSTANCE.getImage("full/obj16/Tasks_cfv"), //$NON-NLS-1$
-					ModelStructure.DEFAULT.disciplineDefinitionPath);
-			child.setParent(conf);
-			child.setUncategorizedFilter(uncategorizedTaskFilter);
-			child.setCategorizedFilter(disciplinesFilter);
-			child.setUncategorizedLabel(LibraryEditPlugin.INSTANCE
-					.getString("_UI_Uncategorized_Tasks_text")); //$NON-NLS-1$
-			uncategorizedImage = LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/Tasks"); //$NON-NLS-1$
-			child.setUncategorizedImage(uncategorizedImage);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			name = LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group"); //$NON-NLS-1$
-			child = new CategoriesItemProvider(adapterFactory, conf, name,
-					LibraryEditPlugin.INSTANCE.getImage("full/obj16/Domains"), //$NON-NLS-1$
-					ModelStructure.DEFAULT.domainPath);
-			child.setParent(conf);
-			child.setUncategorizedFilter(domainUncategorizedWorkProductFilter);
-			uncategorizedImage = LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/WorkProducts"); //$NON-NLS-1$
-			child.setUncategorizedImage(uncategorizedImage);
-			child.setCategorizedFilter(domainFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_WorkProductTypes_group"); //$NON-NLS-1$
-			child = new WorkProductTypesItemProvider(adapterFactory, conf,
-					name, LibraryEditPlugin.INSTANCE
-							.getImage("full/obj16/WorkProducts"), //$NON-NLS-1$
-					ModelStructure.DEFAULT.workProductTypePath);
-			child.setParent(conf);
-			child.setUncategorizedFilter(wpTypeUncategorizedWorkProductFilter);
-			uncategorizedImage = LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/WorkProducts"); //$NON-NLS-1$
-			child.setUncategorizedImage(uncategorizedImage);
-			child.setCategorizedFilter(workProductTypesFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			name = LibraryEditPlugin.INSTANCE.getString("_UI_Role_Sets_group"); //$NON-NLS-1$
-			child = new CategoriesItemProvider(adapterFactory, conf, name,
-					LibraryEditPlugin.INSTANCE.getImage("full/obj16/Roles"), //$NON-NLS-1$
-					ModelStructure.DEFAULT.roleSetPath);
-			child.setParent(conf);
-			child.setUncategorizedFilter(uncategorizedRoleFilter);
-			child.setCategorizedFilter(roleSetsFilter);
-			child.setUncategorizedLabel(LibraryEditPlugin.INSTANCE
-					.getString("_UI_Uncategorized_Roles_text")); //$NON-NLS-1$
-			uncategorizedImage = LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/Roles"); //$NON-NLS-1$
-			child.setUncategorizedImage(uncategorizedImage);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			name = LibraryEditPlugin.INSTANCE.getString("_UI_Tools_group"); //$NON-NLS-1$
-			child = new CategoriesItemProvider(adapterFactory, conf, name,
-					LibraryEditPlugin.INSTANCE.getImage("full/obj16/Tools"), //$NON-NLS-1$
-					ModelStructure.DEFAULT.toolPath);
-			child.setParent(conf);
-			child.setCategorizedFilter(toolsFilter);
-			child.setUncategorizedFilter(uncategorizedToolMentorFilter);
-			uncategorizedImage = LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/Tools"); //$NON-NLS-1$
-			child.setUncategorizedImage(uncategorizedImage);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			name = LibraryEditPlugin.INSTANCE.getString("_UI_Processes_group"); //$NON-NLS-1$
-			Object otherChild = new ProcessesItemProvider(adapterFactory, conf,
-					ModelStructure.DEFAULT);
-			children.add(otherChild);
-			groupItemProviderMap.put(name, otherChild);
-
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Custom_Categories_group"); //$NON-NLS-1$
-			child = new CategoriesItemProvider(adapterFactory, conf, name,
-					LibraryEditPlugin.INSTANCE
-							.getImage("full/obj16/MethodPackages"), //$NON-NLS-1$
-					ModelStructure.DEFAULT.customCategoryPath);
-			child.setParent(conf);
-			child.setCategorizedFilter(customCategoriesFilter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			name = LibraryEditPlugin.INSTANCE.getString("_UI_Guidances_group"); //$NON-NLS-1$
-			GuidanceGroupingItemProvider child1 = new GuidanceGroupingItemProvider(
-					adapterFactory, conf);
-			child1.setFilter(filter);
-			children.add(child1);
-			groupItemProviderMap.put(name, child1);
-		}
-
-		return children;
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#getElements(java.lang.Object)
-	// */
-	// public Collection getElements(Object object) {
-	// return Collections.singleton(object);
-	// }
-	//    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		return super.hasChildren(object);
-	}
-
-	public String getText(Object object) {
-		return TngUtil.getLabel(object,
-				getString("_UI_MethodConfiguration_type")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
-	 */
-	public Object getGroupItemProvider(String name) {
-		return groupItemProviderMap.get(name);
-	}
-
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		
-		if ( (filter != configurator) && (filter instanceof IConfigurator) ) {
-			configurator = (IConfigurator) filter;
-			if ( configurator != null ) {			
-				// create the uncategorized filters. If IConfigurator is set, get the filders from there.
-				// otherwize, use the default one.
-				// This is needed to allow extra uncategorized elements due to realization 
-				// to show up in the un-categorized folder.
-				// For example, if a disciple is replaced by another, the tasks in the replaced disciplie
-				// should show up in the un-categorized tasks folder
-				// 156438 - Variability of disciplines is not working correctly
-				
-				uncategorizedTaskFilter = configurator.getUncategorizedTaskFilter();
-				domainUncategorizedWorkProductFilter = configurator.getDomainUncategorizedWorkProductFilter();
-				wpTypeUncategorizedWorkProductFilter = configurator.getWpTypeUncategorizedWorkProductFilter();
-				uncategorizedRoleFilter = configurator.getUncategorizedRoleFilter();
-				uncategorizedToolMentorFilter = configurator.getUncategorizedToolMentorFilter();
-				
-				// [Bug 162603] New: Replacing disciplines do appear inside their replaced elements discipline groupings as well as outside of the discipline grouping
-				// need to customize the filters for disciplines and rolesets
-				disciplinesFilter = configurator.getDisciplinesFilter();
-				roleSetsFilter = configurator.getRoleSetsFilter();
-				
-			}
-		}
-		this.filter = filter;
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-	// public Object getParent(Object object) {
-	// return plugin;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.MethodConfigurationItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		super.notifyChanged(notification);
-
-		if (configurator != null) {
-			switch (notification.getFeatureID(MethodConfiguration.class)) {
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-				configurator.notifyChanged(notification);
-				break;
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessComponentItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessComponentItemProvider.java
deleted file mode 100644
index 63cc602..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessComponentItemProvider.java
+++ /dev/null
@@ -1,90 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a process component in the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessComponentItemProvider extends
-		org.eclipse.epf.uma.provider.ProcessComponentItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessComponentItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getProcessComponent_Process());
-		}
-		return childrenFeatures;
-	}
-
-	public void notifyChanged(Notification notification) {
-		switch (notification.getFeatureID(ProcessComponent.class)) {
-		case UmaPackage.PROCESS_COMPONENT__NAME:
-			ProcessComponent pc = (ProcessComponent) notification.getNotifier();
-			if (pc.getProcess() != null) {
-				boolean old = pc.getProcess().eDeliver();
-				try {
-					pc.getProcess().eSetDeliver(false);
-					pc.getProcess().setName(pc.getName());
-				} finally {
-					pc.getProcess().eSetDeliver(old);
-				}
-			}
-			break;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_ProcessComponent_type")); //$NON-NLS-1$
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessPackageItemProvider.java
deleted file mode 100644
index b248079..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessPackageItemProvider.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-
-/**
- * The item provider adapter for a process package in the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessPackageItemProvider extends
-		org.eclipse.epf.library.edit.navigator.ProcessPackageItemProvider
-		implements IConfigurable {
-
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	protected boolean acceptAsChild(Process process) {
-		return !TngUtil.isContributorOrReplacer(process)
-				&& !process.getSuppressed().booleanValue();
-	}
-
-	public static boolean collectChildren(Collection children, Object element,
-			IFilter filter) {
-		if (element instanceof ProcessComponent) {
-			Process process = ((ProcessComponent) element).getProcess();
-			if (process != null) {
-				if (filter instanceof IConfigurator) {
-					Object child = ((IConfigurator) filter).resolve(process);
-					if (!children.contains(child) && filter.accept(child)) {
-						children.add(child);
-						return true;
-					}
-				} else if (filter == null || filter.accept(process)) {
-					children.add(process);
-					return true;
-				}
-			}
-		} else if (element instanceof ProcessPackage) {
-			if (filter == null || filter.accept(element)) {
-				children.add(element);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean collectChildren(Collection children, Object element) {
-		return collectChildren(children, element, filter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.ProcessPackageItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		ArrayList children = new ArrayList();
-		for (Iterator iter = super.getChildren(object).iterator(); iter
-				.hasNext();) {
-			collectChildren(children, iter.next());
-		}
-
-		// set parent for the collected children
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			ProcessUtil.setParent(child, object, adapterFactory);
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		ArrayList children = new ArrayList();
-		for (Iterator iter = super.getChildren(object).iterator(); iter
-				.hasNext();) {
-			if (collectChildren(children, iter.next())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(org.eclipse.epf.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-		if (filter instanceof IConfigurator) {
-			((IConfigurator) filter).getMethodConfiguration();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessesItemProvider.java
deleted file mode 100644
index 333ca97..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessesItemProvider.java
+++ /dev/null
@@ -1,106 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.navigator.AbstractProcessesItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.ProcessComponent;
-
-/**
- * The item provider adapter for the "Processes" folder in the Configuration
- * view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessesItemProvider extends AbstractProcessesItemProvider
-		implements ILibraryItemProvider {
-	private MethodConfiguration methodConfig;
-
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessesItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig, ModelStructure modelStruct) {
-		super(adapterFactory, modelStruct);
-		this.methodConfig = methodConfig;
-	}
-
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-
-			if (groupItemProviderMap == null) {
-				groupItemProviderMap = new HashMap();
-			}
-
-			filter = new IFilter() {
-
-				public boolean accept(Object obj) {
-					return obj instanceof ProcessComponent;
-				}
-
-			};
-
-			Object image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/CapabilityPatterns"); //$NON-NLS-1$
-			String name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_CapabilityPatterns_text"); //$NON-NLS-1$
-			CategorizedProcessesItemProvider child = new CategorizedProcessesItemProvider(
-					adapterFactory, methodConfig, name, image,
-					modelStruct.capabilityPatternPath);
-			child.setFilter(filter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			image = LibraryEditPlugin.getPlugin().getImage(
-					"full/obj16/DeliveryProcesses"); //$NON-NLS-1$
-			name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_DeliveryProcesses_text"); //$NON-NLS-1$
-			child = new CategorizedProcessesItemProvider(adapterFactory,
-					methodConfig, name, image, modelStruct.deliveryProcessPath);
-			child.setFilter(filter);
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		return methodConfig;
-	}
-
-	public void setParent(Object parent) {
-	}
-
-	public Collection getChildrenFeatures(Object object) {
-		return super.getChildrenFeatures(object);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/RoleSetItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/RoleSetItemProvider.java
deleted file mode 100644
index ccdbd74..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/RoleSetItemProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a role set in the Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleSetItemProvider extends
-		org.eclipse.epf.library.edit.category.RoleSetItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleSetItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.category.RoleSetItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE.getRoleSet_Roles());
-		}
-		return childrenFeatures;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/UncategorizedItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/UncategorizedItemProvider.java
deleted file mode 100644
index a09f9b4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/UncategorizedItemProvider.java
+++ /dev/null
@@ -1,176 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * The item provider adapter for the uncategorized folders and elements in the
- * Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class UncategorizedItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IConfigurable {
-
-	protected List children;
-
-	protected MethodConfiguration methodConfig;
-
-	private IFilter filter;
-
-	private String label;
-
-	private IFilter uncategorizedFilter;
-
-	private Object image;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public UncategorizedItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig, IFilter filter, String label,
-			Object image) {
-		super(adapterFactory);
-		this.methodConfig = methodConfig;
-		this.uncategorizedFilter = filter;
-		this.label = label;
-		this.image = image;
-	}
-
-	protected MethodConfigurationElementList createMethodConfigurationElementList(
-			List filterList) {
-		return new MethodConfigurationElementList(methodConfig, filterList);
-	}
-
-	protected List createFilterList() {
-		ArrayList filterList = new ArrayList();
-		if (uncategorizedFilter != null) {
-			filterList.add(uncategorizedFilter);
-		}
-		if (filter != null) {
-			filterList.add(filter);
-		}
-		return filterList;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		return createMethodConfigurationElementList(createFilterList())
-				.getList();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object object) {
-		// Always return true to avoid expensive call to getChildren() that walk
-		// thru the
-		// whole library to find all the tasks that is not assigned to any
-		// discipline.
-		//
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (label != null)
-			return label;
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Uncategorized_text"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getNewChildDescriptors(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-	 */
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		if (image != null)
-			return image;
-		return super.getImage(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/WorkProductTypesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/WorkProductTypesItemProvider.java
deleted file mode 100644
index 5cc0240..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/WorkProductTypesItemProvider.java
+++ /dev/null
@@ -1,202 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.WrapperManager;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * The item provider adapter for the "Work Product Kinds" folder in the
- * Configuration view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductTypesItemProvider extends CategoriesItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductTypesItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig, String name, Object image,
-			String[] categoryPkgPath) {
-		super(adapterFactory, methodConfig, name, image, categoryPkgPath);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.configuration.CategoriesItemProvider#createUncategorizedItemProvider()
-	 */
-	protected UncategorizedItemProvider createUncategorizedItemProvider() {
-		return new UncategorizedItemProvider(adapterFactory, methodConfig,
-				this.uncategorizedFilter, this.uncategorizedLabel,
-				this.uncategorizedImage) {
-			final class ElementList extends MethodConfigurationElementList {
-
-				/**
-				 * @param methodConfig
-				 * @param filterList
-				 */
-				public ElementList(MethodConfiguration methodConfig,
-						List filterList) {
-					super(methodConfig, filterList);
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.epf.library.edit.configuration.MethodConfigurationElementList#newIterator(org.eclipse.epf.uma.ContentPackage)
-				 */
-				protected Iterator newIterator(ContentPackage pkg) {
-					return new ElementIterator(pkg) {
-						/**
-						 * Comment for <code>serialVersionUID</code>
-						 */
-						private static final long serialVersionUID = 2307136307657359282L;
-
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.epf.library.edit.configuration.MethodConfigurationElementList.ElementIterator#getChildrenList(java.lang.Object)
-						 */
-						protected List getChildrenList(Object object) {
-							List children = super.getChildrenList(object);
-							if (object instanceof Artifact) {
-								children.addAll(((Artifact) object)
-										.getContainedArtifacts());
-							}
-							return children;
-						}
-					};
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.epf.library.edit.configuration.MethodConfigurationElementList#checkAcceptance()
-				 */
-				protected boolean checkAcceptance() {
-					return false;
-				}
-
-				public boolean superAccept(Object object) {
-					return super.accept(object);
-				}
-			};
-
-			// keeps wrappers of artifacts that is not associated with any work
-			// product type
-			//
-			private WrapperManager wrapperManager = new WrapperManager(
-					adapterFactory) {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.epf.library.edit.util.WrapperManager#createWrapper(java.lang.Object,
-				 *      java.lang.Object,
-				 *      org.eclipse.emf.common.notify.AdapterFactory)
-				 */
-				protected IWrapperItemProvider createWrapper(Object value,
-						Object owner, AdapterFactory adapterFactory) {
-					return new DelegatingWrapperItemProvider(value, owner,
-							null, CommandParameter.NO_INDEX, adapterFactory) {
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#getChildren(java.lang.Object)
-						 */
-						public Collection getChildren(Object object) {
-							// Sub-artifact can have a different set of work
-							// product types than the containing artifact.
-							// Do not show the composition hierarchies in the
-							// Work Product Type tree browsers in Lib. Nav.
-							// and Config. Explorer. Show them in flat lists
-							// according to their categorizations instead.
-							//
-							// This is not true for Domains, which should show
-							// the artifact nesting!
-							return Collections.EMPTY_LIST;
-						}
-
-						/*
-						 * (non-Javadoc)
-						 * 
-						 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#hasChildren(java.lang.Object)
-						 */
-						public boolean hasChildren(Object object) {
-							return false;
-						}
-					};
-				}
-			};
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.epf.library.edit.configuration.UncategorizedItemProvider#createMethodConfigurationElementList(java.util.List)
-			 */
-			protected MethodConfigurationElementList createMethodConfigurationElementList(
-					List filterList) {
-				return new ElementList(methodConfig, filterList);
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.epf.library.edit.configuration.UncategorizedItemProvider#getChildren(java.lang.Object)
-			 */
-			public Collection getChildren(Object object) {
-				ElementList elementList = (ElementList) createMethodConfigurationElementList(createFilterList());
-				Collection children = elementList.getList();
-				ArrayList artifacts = new ArrayList();
-				for (Iterator iter = children.iterator(); iter.hasNext();) {
-					Object element = (Object) iter.next();
-					if (elementList.superAccept(element)) {
-						if (element instanceof Artifact) {
-							artifacts.add(element);
-							iter.remove();
-						}
-					} else {
-						iter.remove();
-					}
-				}
-				wrapperManager.update(artifacts);
-				children.addAll(wrapperManager.getWrappers());
-				return children;
-			}
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-			 */
-			public void dispose() {
-				wrapperManager.dispose();
-				super.dispose();
-			}
-		};
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/package.html
deleted file mode 100644
index 077dfaf..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides display and editing support for method configurations.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ArtifactItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ArtifactItemProvider.java
deleted file mode 100644
index af93f7d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ArtifactItemProvider.java
+++ /dev/null
@@ -1,304 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for an artifact.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ArtifactItemProvider extends
-		org.eclipse.epf.uma.provider.ArtifactItemProvider implements
-		IDefaultNameSetter, ILibraryItemProvider, IConfigurable {
-
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ArtifactItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public Object getParent(Object object) {
-		Artifact artifact = (Artifact) object;
-		if (artifact != null && artifact.eContainer() instanceof Artifact) {
-			return super.getParent(object);
-		}
-		return TngUtil.getNavigatorParentItemProvider(artifact);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getArtifact_ContainedArtifacts(), UmaFactory.eINSTANCE
-				.createArtifact()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-
-		//TngUtil.setDefaultName(this, notification);
-		setDefaultName(notification);
-		
-		updateChildren(notification);
-		
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		
-		switch (notification.getFeatureID(Discipline.class)) {
-		case UmaPackage.METHOD_ELEMENT__NAME:
-			TngUtil.refreshContributors(this, notification, false, true);
-			break;
-		case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			TngUtil.refreshWorkProductTypeUncategorized(UmaUtil
-					.getMethodPlugin((EObject) target), notification);
-			return;
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getArtifact_ContainedArtifacts());
-		}
-		return childrenFeatures;
-	}
-	
-	/**
-	 * Method to setDefaultName. IDefaultNameSetter cannot be used 
-	 * in case of Stateless ItemProvider.
-	 * This is work-around for now. IDefaultNameSetter will be modified later.
-	 */
-	public void setDefaultName(Notification msg) {
-		IDefaultNameSetter defaultNameSetter = this;
-		if (defaultNameSetter.getInterestedFeatureOwnerClass() != null) {
-			int featureId = msg.getFeatureID(defaultNameSetter
-					.getInterestedFeatureOwnerClass());
-			if (featureId == defaultNameSetter.getInterestedFeatureID()) {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					setDefaultName(msg.getNewValue(), msg.getNotifier());
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						setDefaultName(iter.next(), msg.getNotifier());
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	private void setDefaultName(Object obj, Object parent) {
-		String baseName = null;
-		if (obj instanceof Artifact) {
-			baseName = LibraryEditConstants.NEW_ARTIFACT;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((Artifact) parent)
-					.getContainedArtifacts(), (MethodElement) obj, baseName);
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#setDefaultName(java.lang.Object)
-	 * not in use (for stateless itemprovider) see above setDefaultName(Object obj, Object parent).
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof Artifact) {
-			baseName = LibraryEditConstants.NEW_ARTIFACT;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((Artifact) target).getContainedArtifacts(),
-					(MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureOwnerClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return Artifact.class;
-	}
-
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_Artifact_type")); //$NON-NLS-1$
-	}
-
-	public Object getImage(Object object) {
-		if (object instanceof DescribableElement) {
-			if (((DescribableElement) object).getNodeicon() != null) {
-				URI imgUri = TngUtil.getFullPathofNodeorShapeIconURI(
-						(DescribableElement) object,
-						((DescribableElement) object).getNodeicon());
-				Object image = LibraryEditPlugin.INSTANCE
-						.getSharedImage(imgUri);
-				if (image != null)
-					return image;
-			}
-		}
-		return super.getImage(object);
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IMethodElementItemProvider#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-	}
-
-	public Collection getChildren(Object object) {
-		// return super.getChildren(object);
-		Collection col = super.getChildren(object);
-		if (filter != null) {
-			for (Iterator itor = col.iterator(); itor.hasNext();) {
-				Object child = itor.next();
-				if (!filter.accept(child)) {
-					itor.remove();
-				}
-			}
-		}
-		return col;
-	}
-
-	// private boolean isParentsAccepted(Object child) {
-	// List list = new ArrayList();
-	// getHierarchyList(list, child);
-	// for (Iterator itor = list.iterator(); itor.hasNext();) {
-	// Object obj = itor.next();
-	// if (obj instanceof Artifact) {
-	// if (filter.accept(obj))
-	// return true;
-	// }
-	// }
-	// return false;
-	// }
-	//
-	// private boolean checkChildrensAccepted(Object object) {
-	// Artifact parentartifact = ((Artifact) object).getContainerArtifact();
-	// if (parentartifact != null) {
-	// if (filter != null) {
-	// if (filter.accept(parentartifact))
-	// return true;
-	// else {
-	// return checkChildrensAccepted(parentartifact);
-	// }
-	// }
-	// }
-	// return false;
-	// }
-	//
-	// private void getHierarchyList(List list, Object object) {
-	// Artifact parent = ((Artifact) object).getContainerArtifact();
-	// if (parent instanceof Artifact) {
-	// list.add(parent);
-	// getHierarchyList(list, parent);
-	// }
-	// }
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ContentDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ContentDescriptionItemProvider.java
deleted file mode 100644
index f100a88..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ContentDescriptionItemProvider.java
+++ /dev/null
@@ -1,125 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a content description.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ContentDescriptionItemProvider extends
-		org.eclipse.epf.uma.provider.ContentDescriptionItemProvider {
-
-	/**
-	 * A map of EClass / ItemProviderAdapter for each type of ContentDescription
-	 */
-	private static Map itemProviderMap = new HashMap();
-
-	/**
-	 * Creates a new instance.
-	 */	
-	public ContentDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		itemProviderMap.clear();
-
-		super.dispose();
-	}
-
-	public List getPropertyDescriptors(Object object) {
-		if (object instanceof EObject) {
-			return getAdapter((EObject) object).getPropertyDescriptors(object);
-		}
-		return super.getPropertyDescriptors(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getPropertyDescriptor(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public IItemPropertyDescriptor getPropertyDescriptor(Object object,
-			Object propertyId) {
-		return getAdapter((EObject) object).getPropertyDescriptor(object,
-				propertyId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getEditableValue(java.lang.Object)
-	 */
-	public Object getEditableValue(Object object) {
-		return getAdapter((EObject) object).getEditableValue(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.GuidanceItemProvider#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		if (object instanceof EObject) {
-			return getAdapter((EObject) object).getImage(object);
-		}
-		return super.getImage(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.GuidanceItemProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object);
-	}
-
-	public static ItemProviderAdapter getAdapter(EObject eObj) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) itemProviderMap
-				.get(eObj.eClass());
-		if (adapter == null) {
-			adapter = (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-					.createAdapter(eObj);
-			itemProviderMap.put(eObj.eClass(), adapter);
-		}
-		return adapter;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ContentPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ContentPackageItemProvider.java
deleted file mode 100644
index 33bd876..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/ContentPackageItemProvider.java
+++ /dev/null
@@ -1,412 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-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;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for the "Content Packages" folder in the Library
- * view.
- * <p>
- * This class will be renamed as ContentPackagesItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ContentPackageItemProvider extends
-		org.eclipse.epf.uma.provider.ContentPackageItemProvider implements
-		IElementItemProvider, ILibraryItemProvider, IStatefulItemProvider {
-
-	protected RolesItemProvider roles;
-
-	protected TasksItemProvider tasks;
-
-	protected WorkProductsItemProvider workProducts;
-
-	protected GuidancesItemProvider guidances;
-
-	protected String label;
-
-	protected Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * @return Returns the roles.
-	 */
-	public RolesItemProvider getRoles() {
-		return roles;
-	}
-
-	/**
-	 * @return Returns the tasks.
-	 */
-	public TasksItemProvider getTasks() {
-		return tasks;
-	}
-
-	/**
-	 * @return Returns the workProducts.
-	 */
-	public WorkProductsItemProvider getWorkProducts() {
-		return workProducts;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	// public Collection getChildrenFeatures(Object object) {
-	// if (childrenFeatures == null) {
-	// childrenFeatures = new ArrayList();
-	// childrenFeatures.add(UmaPackage.eINSTANCE.getMethodPackage_ChildPackages());
-	// }
-	// return childrenFeatures;
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		List allChildren = new ArrayList();
-		ChildrenStore store = getChildrenStore(object);
-		List result = null;
-		if (store == null) {
-			store = createChildrenStore(object);
-			result = store != null ? null : new ArrayList();
-			EObject eObject = (EObject) object;
-
-			for (Iterator i = getChildrenFeatures(object).iterator(); i
-					.hasNext();) {
-				EStructuralFeature feature = (EStructuralFeature) i.next();
-				if (feature.isMany()) {
-					List children = (List) eObject.eGet(feature);
-					List contentPkgs = new ArrayList();
-					int index = 0;
-					for (Iterator ci = children.iterator(); ci.hasNext(); index++) {
-						Object child = ci.next();
-						if (child instanceof ContentPackage) {
-							child = wrap(eObject, feature, child, index);
-							// if (store != null)
-							// {
-							// store.getList(feature).add(child);
-							// }
-							// else
-							// {
-							// result.add(child);
-							// }
-							contentPkgs.add(child);
-						}
-					}
-					
-					// clear parent for children
-					//
-					for (Iterator iter = children.iterator(); iter.hasNext();) {
-						Object child = (Object) iter.next();
-						Object adapter = adapterFactory.adapt(child,
-								ITreeItemContentProvider.class);
-						if (adapter instanceof ILibraryItemProvider) {
-							((ILibraryItemProvider) adapter).setParent(null);
-						}
-					}
-
-					// sorting the content packages
-					//
-					Collections.sort(contentPkgs, PresentationContext.INSTANCE
-							.getComparator());
-
-					if (store != null) {
-						store.getList(feature).addAll(contentPkgs);
-					} else {
-						result.addAll(contentPkgs);
-					}
-				} else {
-					Object child = eObject.eGet(feature);
-					if (child instanceof ContentPackage) {
-						child = wrap(eObject, feature, child,
-								CommandParameter.NO_INDEX);
-						if (store != null) {
-							store.setValue(feature, child);
-						} else {
-							result.add(child);
-						}
-					}
-				}
-			}
-		}
-		allChildren.addAll(store != null ? store.getChildren() : result);
-		ContentPackage contentPkg = (ContentPackage) object;
-
-		// remove old adapters (roles, tasks, workproducts) from the the
-		// contentPkg
-		//
-		// EObject eObj = (EObject) object;
-		if (roles == null) {
-			// eObj.eAdapters().remove(roles);
-			roles = new RolesItemProvider(adapterFactory, contentPkg);
-		}
-		if (tasks == null) {
-			// eObj.eAdapters().remove(tasks);
-			tasks = new TasksItemProvider(adapterFactory, contentPkg);
-		}
-		if (workProducts == null) {
-			// eObj.eAdapters().remove(workProducts);
-			workProducts = new WorkProductsItemProvider(adapterFactory,
-					contentPkg);
-		}
-		if (guidances == null) {
-			// eObj.eAdapters().remove(guidances);
-			guidances = new GuidancesItemProvider(adapterFactory, contentPkg);
-		}
-
-		allChildren.add(roles);
-		allChildren.add(tasks);
-		allChildren.add(workProducts);
-		allChildren.add(guidances);
-		return allChildren;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getMethodPackage_ChildPackages(), UmaFactory.eINSTANCE
-				.createContentPackage()));
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#createCommand(java.lang.Object,
-	// org.eclipse.emf.edit.domain.EditingDomain, java.lang.Class,
-	// org.eclipse.emf.edit.command.CommandParameter)
-	// */
-	// public Command createCommand(Object object, EditingDomain domain,
-	// Class commandClass, CommandParameter commandParameter) {
-	// // commandParameter.setOwner(((EObject)object).eContainer());
-	// Command cmd = super.createCommand(object, domain, commandClass,
-	// commandParameter);
-	// System.out.println(getClass().getName() + "#createCommand: " +
-	// commandClass + ", can execute: " + cmd.canExecute() + ", owner: " +
-	// commandParameter.getOwner() + ", collection: " +
-	// commandParameter.getCollection());
-	// return cmd;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		String txt;
-		if (label != null) {
-			txt = label;
-		} else {
-			txt = TngUtil
-					.getLabel(object, getString("_UI_ContentPackage_type")); //$NON-NLS-1$
-		}
-		// check if the object has its own resource and it is modified to add
-		// the dirty flag
-		//
-		Resource res = ((EObject) object).eResource();
-		if (res != null && res.getContents().get(0) == object
-				&& res.isModified()) {
-			txt = txt + "*"; //$NON-NLS-1$
-		}
-		return txt;
-	}
-
-	private void setDefaultName(Object obj) {
-		ContentPackage contentPackage = (ContentPackage) target;
-		if (obj instanceof ContentPackage) {
-			TngUtil.setDefaultName(contentPackage.getChildPackages(),
-					(MethodElement) obj, "content_package"); //$NON-NLS-1$
-		} else {
-			TngUtil.setDefaultName(contentPackage.getChildPackages(),
-					(MethodElement) obj, "method_package"); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		TngUtil.refreshParentIfNameChanged(msg, this);
-
-		switch (msg.getFeatureID(ContentPackage.class)) {
-		case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS:
-			return;
-		case UmaPackage.CONTENT_PACKAGE__CHILD_PACKAGES:
-			switch (msg.getEventType()) {
-			case Notification.ADD:
-				setDefaultName(msg.getNewValue());
-				break;
-			case Notification.ADD_MANY:
-				for (Iterator iter = ((Collection) msg.getNewValue())
-						.iterator(); iter.hasNext();) {
-					setDefaultName(iter.next());
-				}
-				break;
-			}
-		}
-
-		super.notifyChanged(msg);
-	}
-
-	/**
-	 * @return
-	 */
-	public GuidancesItemProvider getGuidances() {
-		return guidances;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-		this.label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null)
-			return parent;
-		return super.getParent(object);
-	}
-
-	// public Object getImage(Object object) {
-	// return TngEditPlugin.INSTANCE.getImage("full/obj16/MethodPackages");
-	// }
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		ArrayList selection = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-
-			// make sure that you cannot add MethodPackage that is not a
-			// ContentPackage
-			//
-			if (element instanceof MethodPackage
-					&& !(element instanceof ContentPackage)) {
-				continue;
-			}
-
-			selection.add(element);
-		}
-
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, selection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (guidances != null) {
-			guidances.dispose();
-			guidances = null;
-		}
-		if (roles != null) {
-			roles.dispose();
-			roles = null;
-		}
-		if (tasks != null) {
-			tasks.dispose();
-			tasks = null;
-		}
-		if (workProducts != null) {
-			workProducts.dispose();
-			workProducts = null;
-		}
-		super.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/GuidanceItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/GuidanceItemProvider.java
deleted file mode 100644
index 2b3ae9b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/GuidanceItemProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a guidance in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class GuidanceItemProvider extends
-		org.eclipse.epf.uma.provider.GuidanceItemProvider {
-
-	/**
-	 * A map of EClass / ItemProviderAdapter for each type of guidance
-	 */
-	private static Map itemProviderMap = new HashMap();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GuidanceItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		itemProviderMap.clear();
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.GuidanceItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.DescribableElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.GuidanceItemProvider#getPropertyDescriptors(java.lang.Object)
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (object instanceof EObject) {
-			return getAdapter((EObject) object).getPropertyDescriptors(object);
-		}
-		return super.getPropertyDescriptors(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getPropertyDescriptor(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public IItemPropertyDescriptor getPropertyDescriptor(Object object,
-			Object propertyId) {
-		return getAdapter((EObject) object).getPropertyDescriptor(object,
-				propertyId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getEditableValue(java.lang.Object)
-	 */
-	public Object getEditableValue(Object object) {
-		return getAdapter((EObject) object).getEditableValue(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.GuidanceItemProvider#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		if (object instanceof DescribableElement) {
-			if (((DescribableElement) object).getNodeicon() != null) {
-				URI imgUri = TngUtil.getFullPathofNodeorShapeIconURI(
-						(DescribableElement) object,
-						((DescribableElement) object).getNodeicon());
-				Object image = LibraryEditPlugin.INSTANCE
-						.getSharedImage(imgUri);
-				if (image != null)
-					return image;
-			}
-		}
-		if (object instanceof EObject) {
-			return getAdapter((EObject) object).getImage(object);
-		}
-		return super.getImage(object);
-	}
-
-	public static ItemProviderAdapter getAdapter(EObject eObj) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) itemProviderMap
-				.get(eObj.eClass());
-		if (adapter == null) {
-			adapter = (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-					.createAdapter(eObj);
-			itemProviderMap.put(eObj.eClass(), adapter);
-		}
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.GuidanceItemProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		EObject eObj = (EObject) super.getParent(object);
-		if (eObj == null)
-			return null;
-		ContentPackageItemProvider itemProvider = (ContentPackageItemProvider) TngUtil
-				.getAdapter(eObj, ContentPackageItemProvider.class);
-		if (itemProvider != null) {
-			return itemProvider.getGuidances();
-		}
-		return eObj;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.provider.GuidanceItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		
-		super.notifyChanged(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/GuidancesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/GuidancesItemProvider.java
deleted file mode 100644
index 0a0d832..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/GuidancesItemProvider.java
+++ /dev/null
@@ -1,326 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Guidance" folder in the Library view.
- * <p>
- * This class will be renamed as GuidanceFolderItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class GuidancesItemProvider extends TransientContentPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GuidancesItemProvider(AdapterFactory adapterFactory,
-			ContentPackage contentPkg) {
-		super(adapterFactory, contentPkg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.element.TransientContentPackageItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return obj instanceof Guidance;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Guidances_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/GuidanceFolder"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getContentPackage_ContentElements(),
-		// UmaFactory.eINSTANCE.createAttachment()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createChecklist()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createConcept()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createExample()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createGuideline()));
-
-		// newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-		// .getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-		// .createEstimate()));
-		//
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createEstimationConsiderations()));
-
-		// newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-		// .getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-		// .createEstimatingMetric()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createPractice()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createReport()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createReusableAsset()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createRoadmap()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createSupportingMaterial()));
-
-		// newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-		// .getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-		// .createTechnique()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createTemplate()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createTermDefinition()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createToolMentor()));
-
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getContentPackage_ContentElements(),
-		// UmaFactory.eINSTANCE.createTrainingClass()));
-		//
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getContentPackage_ContentElements(),
-		// UmaFactory.eINSTANCE.createTrainingModule()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createWhitepaper()));
-
-		// newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-		// .getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-		// .createWorkProductGuideline()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	// public Object getParent(Object object) {
-	// EObject eObj = (EObject) super.getParent(object);
-	// if(eObj == null) return null;
-	// ContentPackageItemProvider itemProvider = (ContentPackageItemProvider)
-	// TngUtil.getAdapter(eObj, ContentPackageItemProvider.class);
-	// if(itemProvider != null) {
-	// return itemProvider.getGuidances();
-	// }
-	// return eObj;
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof Checklist) {
-			baseName = LibraryEditConstants.NEW_CHECKLIST;
-		} else if (obj instanceof Whitepaper) {
-			baseName = LibraryEditConstants.NEW_WHITEPAPER;
-		} else if (obj instanceof Concept) {
-			baseName = LibraryEditConstants.NEW_CONCEPT;
-		} else if (obj instanceof EstimationConsiderations) {
-			baseName = LibraryEditConstants.NEW_ESTIMATION_CONSIDERATION;
-		} else if (obj instanceof Example) {
-			baseName = LibraryEditConstants.NEW_EXAMPLE;
-		} else if (obj instanceof Practice) {
-			baseName = LibraryEditConstants.NEW_PRACTICE;
-		} else if (obj instanceof Report) {
-			baseName = LibraryEditConstants.NEW_REPORT;
-		} else if (obj instanceof Roadmap) {
-			baseName = LibraryEditConstants.NEW_ROADMAP;
-		} else if (obj instanceof ReusableAsset) {
-			baseName = LibraryEditConstants.NEW_REUSABLE_ASSET;
-		} else if (obj instanceof SupportingMaterial) {
-			baseName = LibraryEditConstants.NEW_SUPPORTING_MATERIAL;
-			// } else if (obj instanceof Technique) {
-			// baseName = "new_Technique";
-		} else if (obj instanceof Template) {
-			baseName = LibraryEditConstants.NEW_TEMPLATE;
-		} else if (obj instanceof TermDefinition) {
-			baseName = LibraryEditConstants.NEW_TERM_DEFINITION;
-		} else if (obj instanceof ToolMentor) {
-			baseName = LibraryEditConstants.NEW_TOOL_MENTOR;
-		} else if (obj instanceof Guideline) {
-			baseName = LibraryEditConstants.NEW_GUIDELINE;
-		} else if (obj instanceof Guidance) {
-			baseName = LibraryEditConstants.NEW_GUIDANCE;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((ContentPackage) target)
-					.getContentElements(), (MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.element.TransientContentPackageItemProvider#newChildAdded(org.eclipse.emf.common.notify.Notification)
-	 */
-	protected void childrenChanged(Notification msg) {
-		boolean refresh = false;
-		switch (msg.getEventType()) {
-		case Notification.ADD:
-			if (msg.getNewValue() instanceof ToolMentor) {
-				refresh = true;
-			}
-			break;
-		case Notification.REMOVE:
-			if (msg.getOldValue() instanceof ToolMentor) {
-				refresh = true;
-			}
-			break;
-		case Notification.ADD_MANY:
-			check_add: for (Iterator iter = ((Collection) msg.getNewValue())
-					.iterator(); iter.hasNext();) {
-				if (iter.next() instanceof ToolMentor) {
-					refresh = true;
-					break check_add;
-				}
-			}
-			break;
-		case Notification.REMOVE_MANY:
-			check_remove: for (Iterator iter = ((Collection) msg.getOldValue())
-					.iterator(); iter.hasNext();) {
-				if (iter.next() instanceof ToolMentor) {
-					refresh = true;
-					break check_remove;
-				}
-			}
-			break;
-		}
-		if (refresh)
-			TngUtil.refreshUncategorizedToolMentorsItemProvider(UmaUtil
-					.getMethodPlugin((EObject) target), msg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		List children = null;
-		Collection collection = super.getChildren(object);
-		if (collection instanceof List) {
-			children = (List) collection;
-		} else {
-			children = new ArrayList(collection);
-		}
-		Collections.sort(children, PresentationContext.INSTANCE.getGuidanceTypeComparator());
-		return children;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/IElementItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/IElementItemProvider.java
deleted file mode 100644
index 23f7770..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/IElementItemProvider.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-/**
- * The base interface for a method element item provider.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IElementItemProvider {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/RoleItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/RoleItemProvider.java
deleted file mode 100644
index 4da3ac7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/RoleItemProvider.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a role.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleItemProvider extends org.eclipse.epf.uma.provider.RoleItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RoleItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		EObject contentPkg = (EObject) super.getParent(object);
-		if (contentPkg == null)
-			return null;
-		ContentPackageItemProvider itemProvider = (ContentPackageItemProvider) TngUtil
-				.getAdapter(contentPkg, ContentPackageItemProvider.class);
-		return itemProvider != null ? itemProvider.getRoles() : null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_Role_type")); //$NON-NLS-1$
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.provider.RoleItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		
-		super.notifyChanged(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/RolesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/RolesItemProvider.java
deleted file mode 100644
index 389649e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/RolesItemProvider.java
+++ /dev/null
@@ -1,142 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Roles" folder in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class RolesItemProvider extends TransientContentPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RolesItemProvider(AdapterFactory adapterFactory,
-			ContentPackage contentPkg) {
-		super(adapterFactory, contentPkg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	synchronized public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Roles_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Roles"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createRole()));
-	}
-
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return obj instanceof Role;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof Role) {
-			baseName = LibraryEditConstants.NEW_ROLE;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((ContentPackage) target)
-					.getContentElements(), (MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.element.TransientContentPackageItemProvider#newChildAdded(org.eclipse.emf.common.notify.Notification)
-	 */
-	protected void childrenChanged(Notification msg) {
-		TngUtil.refreshUncategorizedRolesItemProvider(UmaUtil
-				.getMethodPlugin((EObject) target), msg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		super.setFilter(filter);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/SectionItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/SectionItemProvider.java
deleted file mode 100644
index dfa4fdf..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/SectionItemProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a section.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class SectionItemProvider extends
-		org.eclipse.epf.uma.provider.SectionItemProvider {
-
-	public SectionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_Section_type")); //$NON-NLS-1$
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TaskItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TaskItemProvider.java
deleted file mode 100644
index e2db279..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TaskItemProvider.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a task.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class TaskItemProvider extends org.eclipse.epf.uma.provider.TaskItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TaskItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		EObject contentPkg = (EObject) super.getParent(object);
-		if (contentPkg == null)
-			return null;
-		ContentPackageItemProvider itemProvider = (ContentPackageItemProvider) TngUtil
-				.getAdapter(contentPkg, ContentPackageItemProvider.class);
-		return itemProvider != null ? itemProvider.getTasks() : null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createCommand(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Class,
-	 *      org.eclipse.emf.edit.command.CommandParameter)
-	 */
-	// public Command createCommand(Object object, EditingDomain domain,
-	// Class commandClass, CommandParameter commandParameter) {
-	// // if(commandClass == RemoveCommand.class) {
-	// // commandParameter.setOwner(((EObject)object).eContainer());
-	// // }
-	// Command cmd = super.createCommand(object, domain, commandClass,
-	// commandParameter);
-	// System.out.println(getClass().getName() + "#createCommand: " +
-	// commandClass + ", can execute: " + cmd.canExecute() + ", owner: " +
-	// commandParameter.getOwner() + ", collection: " +
-	// commandParameter.getCollection());
-	// return cmd;
-	// }
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_Task_type")); //$NON-NLS-1$
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.provider.TaskItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-//		switch(notification.getEventType()) {
-//		case EventTypes.MAKE_PROXY:
-//			// refresh parent
-//			//
-//			fireNotifyChanged(new ViewerNotification(notification, getParent(notification.getNotifier()), true, false));
-//			
-//			// refresh itself
-//			//
-//			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, true));
-//			
-//			return;
-//		}
-		
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		
-		super.notifyChanged(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TasksItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TasksItemProvider.java
deleted file mode 100644
index 8521078..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TasksItemProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Tasks" folder in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class TasksItemProvider extends TransientContentPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TasksItemProvider(AdapterFactory adapterFactory,
-			ContentPackage contentPkg) {
-		super(adapterFactory, contentPkg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Tasks_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Tasks"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createTask()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.element.TransientContentPackageItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return obj instanceof Task;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof Task) {
-			baseName = LibraryEditConstants.NEW_TASK;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((ContentPackage) target)
-					.getContentElements(), (MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.element.TransientContentPackageItemProvider#newChildAdded()
-	 */
-	protected void childrenChanged(Notification msg) {
-		// refresh the uncategorized tasks group
-		//
-		TngUtil.refreshUncategorizedTasksItemProvider(UmaUtil
-				.getMethodPlugin((EObject) target), msg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TransientContentPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TransientContentPackageItemProvider.java
deleted file mode 100644
index 39ddcea..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/TransientContentPackageItemProvider.java
+++ /dev/null
@@ -1,132 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the "Content Packages" sub folders in the
- * Library view.
- * <p>
- * This class will be renamed as ContentPackageItemProvider in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class TransientContentPackageItemProvider extends
-		TransientGroupItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TransientContentPackageItemProvider(AdapterFactory adapterFactory,
-			ContentPackage contentPkg) {
-		super(adapterFactory, contentPkg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		if (msg.getNotifier() == target) {
-			int featureId = msg.getFeatureID(ContentPackage.class);
-			if (featureId == UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS) {
-				boolean notify = false;
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.MOVE:
-					Object obj = msg.getNewValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.REMOVE:
-					obj = msg.getOldValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.ADD_MANY:
-					Collection collection = (Collection) msg.getNewValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					collection = (Collection) msg.getOldValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-				case Notification.SET:
-					if(msg.getNewValue() != msg.getOldValue()) {
-						notify = true;
-					}
-					break;
-				}
-				
-				if (notify) {
-					fireNotifyChanged(new ViewerNotification(msg, this, true,
-							false));
-					childrenChanged(msg);
-				}
-			}
-		}
-		super.notifyChanged(msg);
-	}
-
-	protected void childrenChanged(Notification msg) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return ContentPackage.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/WorkProductItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/WorkProductItemProvider.java
deleted file mode 100644
index a3adab0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/WorkProductItemProvider.java
+++ /dev/null
@@ -1,174 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.net.URI;
-import java.util.ArrayList;
-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;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-
-/**
- * The item provider adapter for a work product.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductItemProvider extends
-		org.eclipse.epf.uma.provider.WorkProductItemProvider {
-
-	private ItemProviderAdapter delegateItemProvider;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public WorkProductItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	public List getPropertyDescriptors(Object object) {
-		if (delegateItemProvider != null) {
-			return delegateItemProvider.getPropertyDescriptors(object);
-		}
-		return super.getPropertyDescriptors(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		EObject eObj = (EObject) super.getParent(object);
-		if (eObj == null)
-			return null;
-		ContentPackageItemProvider itemProvider = (ContentPackageItemProvider) TngUtil
-				.getAdapter(eObj, ContentPackageItemProvider.class);
-		if (itemProvider != null) {
-			return itemProvider.getWorkProducts();
-		}
-		return eObj;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (object instanceof Artifact) {
-			return TngUtil.getLabel(object, getString("_UI_Artifact_type")); //$NON-NLS-1$
-		} else if (object instanceof Deliverable) {
-			return TngUtil.getLabel(object, getString("_UI_Deliverable_type")); //$NON-NLS-1$
-		} else if (object instanceof Outcome) {
-			return TngUtil.getLabel(object, getString("_UI_Outcome_type")); //$NON-NLS-1$
-		}
-
-		return TngUtil.getLabel(object, getString("_UI_WorkProduct_type")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		if (object instanceof DescribableElement) {
-			if (((DescribableElement) object).getNodeicon() != null) {
-				URI imgUri = TngUtil.getFullPathofNodeorShapeIconURI(
-						(DescribableElement) object,
-						((DescribableElement) object).getNodeicon());
-				Object image = LibraryEditPlugin.INSTANCE
-						.getSharedImage(imgUri);
-				if (image != null)
-					return image;
-			}
-		}
-		if (delegateItemProvider != null) {
-			return delegateItemProvider.getImage(object);
-		}
-		if (object instanceof Artifact) {
-			return UmaEditPlugin.INSTANCE.getImage("full/obj16/Artifact"); //$NON-NLS-1$
-		} else if (object instanceof Deliverable) {
-			return UmaEditPlugin.INSTANCE.getImage("full/obj16/Deliverable"); //$NON-NLS-1$
-		} else if (object instanceof Outcome) {
-			return UmaEditPlugin.INSTANCE.getImage("full/obj16/Outcome"); //$NON-NLS-1$
-		} else {
-			return super.getImage(object);
-		}
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.provider.WorkProductItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		TngUtil.refreshParentIfNameChanged(notification, this);
-		
-		super.notifyChanged(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/WorkProductsItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/WorkProductsItemProvider.java
deleted file mode 100644
index b4a9347..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/WorkProductsItemProvider.java
+++ /dev/null
@@ -1,145 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.element;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Work Products" folder in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class WorkProductsItemProvider extends
-		TransientContentPackageItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WorkProductsItemProvider(AdapterFactory adapterFactory,
-			ContentPackage contentPkg) {
-		super(adapterFactory, contentPkg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_WorkProducts_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/WorkProducts"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createArtifact()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createDeliverable()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), UmaFactory.eINSTANCE
-				.createOutcome()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.element.TransientContentPackageItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return obj instanceof WorkProduct;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		String baseName = null;
-		if (obj instanceof Artifact) {
-			baseName = LibraryEditConstants.NEW_ARTIFACT;
-		} else if (obj instanceof Deliverable) {
-			baseName = LibraryEditConstants.NEW_DELIVERABLE;
-		} else if (obj instanceof Outcome) {
-			baseName = LibraryEditConstants.NEW_OUTCOME;
-		} else if (obj instanceof WorkProduct) {
-			baseName = LibraryEditConstants.NEW_WORKPRODUCT;
-		}
-		if (baseName != null) {
-			TngUtil.setDefaultName(((ContentPackage) target)
-					.getContentElements(), (MethodElement) obj, baseName);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.element.TransientContentPackageItemProvider#newChildAdded(org.eclipse.emf.common.notify.Notification)
-	 */
-	protected void childrenChanged(Notification msg) {
-		TngUtil.refreshUncategorizedWorkProductsItemProviders(UmaUtil
-				.getMethodPlugin((EObject) target), msg);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/package.html
deleted file mode 100644
index 92fbf99..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/element/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides display and editing support for core method elements and guidance.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/internal/TngAdapterFactoryImpl.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/internal/TngAdapterFactoryImpl.java
deleted file mode 100644
index a35e16f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/internal/TngAdapterFactoryImpl.java
+++ /dev/null
@@ -1,973 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-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.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeEventWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeListenerWrapper;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IWrapper;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.OBSItemProviderAdapterFactory;
-import org.eclipse.epf.library.edit.process.PBSItemProviderAdapterFactory;
-import org.eclipse.epf.library.edit.process.WBSItemProviderAdapterFactory;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-
-/**
- * The default method library adapter factory implementation.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class TngAdapterFactoryImpl implements TngAdapterFactory {
-	
-	private ExposedAdapterFactory wbsAdapterFactory = null;
-
-	private ExposedAdapterFactory obsAdapterFactory = null;
-
-	private ExposedAdapterFactory pbsAdapterFactory = null;
-
-	private AdapterFactory[] wbsAdapterFactories = null;
-
-	private AdapterFactory[] obsAdapterFactories = null;
-
-	private AdapterFactory[] pbsAdapterFactories = null;
-
-	protected AdapterFactory[] procAdapterFactories = null;
-
-	private ExposedAdapterFactory navigatorAdapterFactory;
-
-	protected ExposedAdapterFactory configurationAdapterFactory;
-
-	private ExposedAdapterFactory configProcessViewAdapterFactory;
-
-	private ExposedAdapterFactory itemsFilterAdapterFactory;
-
-	private ExposedAdapterFactory pbsFilterAdapaterFactory;
-
-	private ExposedAdapterFactory obsFilterAdapaterFactory;
-
-	protected ExposedAdapterFactory procAdapterFactory;
-
-	/**
-	 * 
-	 */
-	public TngAdapterFactoryImpl() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.TngAdapterFactory#getWBS_AdapterFactory()
-	 */
-	public ComposedAdapterFactory getWBS_ComposedAdapterFactory() {
-		if (wbsAdapterFactory == null) {
-			synchronized (this) {
-				if (wbsAdapterFactory == null) {
-					wbsAdapterFactory = new ExposedAdapterFactory(
-							getWBS_AdapterFactories());
-				}
-			}
-		}
-		return wbsAdapterFactory;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.TngAdapterFactory#getOBS_AdapterFactory()
-	 */
-	public ComposedAdapterFactory getOBS_ComposedAdapterFactory() {
-		if (obsAdapterFactory == null) {
-			synchronized (this) {
-				if (obsAdapterFactory == null) {
-					obsAdapterFactory = new ExposedAdapterFactory(
-							getOBS_AdapterFactories());
-				}
-			}
-		}
-		return obsAdapterFactory;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.TngAdapterFactory#getPBS_AdapterFactory()
-	 */
-	public ComposedAdapterFactory getPBS_ComposedAdapterFactory() {
-		if (pbsAdapterFactory == null) {
-			synchronized (this) {
-				if (pbsAdapterFactory == null) {
-					pbsAdapterFactory = new ExposedAdapterFactory(
-							getPBS_AdapterFactories());
-				}
-			}
-		}
-		return pbsAdapterFactory;
-	}
-
-	private AdapterFactory[] getWBS_AdapterFactories() {
-		if (wbsAdapterFactories == null) {
-			WBSItemProviderAdapterFactory factory = new WBSItemProviderAdapterFactory();
-			wbsAdapterFactories = new AdapterFactory[] {
-			// new ResourceItemProviderAdapterFactory(),
-					factory,
-					// new BSProcesstypesItemProviderAdapterFactory(factory),
-					new ReflectiveItemProviderAdapterFactory() };
-		}
-		return wbsAdapterFactories;
-	}
-
-	private AdapterFactory[] getOBS_AdapterFactories() {
-		if (obsAdapterFactories == null) {
-			OBSItemProviderAdapterFactory factory = new OBSItemProviderAdapterFactory();
-			obsAdapterFactories = new AdapterFactory[] {
-			// new ResourceItemProviderAdapterFactory(),
-					factory,
-					// new BSProcesstypesItemProviderAdapterFactory(factory),
-					new ReflectiveItemProviderAdapterFactory() };
-		}
-		return obsAdapterFactories;
-	}
-
-	private AdapterFactory[] getPBS_AdapterFactories() {
-		if (pbsAdapterFactories == null) {
-			PBSItemProviderAdapterFactory factory = new PBSItemProviderAdapterFactory();
-			pbsAdapterFactories = new AdapterFactory[] {
-			// new ResourceItemProviderAdapterFactory(),
-					factory,
-					// new BSProcesstypesItemProviderAdapterFactory(factory),
-					new ReflectiveItemProviderAdapterFactory() };
-		}
-		return pbsAdapterFactories;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#getNavigatorView_ComposedAdapterFactory()
-	 */
-	public ComposedAdapterFactory getNavigatorView_ComposedAdapterFactory() {
-		if (navigatorAdapterFactory == null) {
-			synchronized (this) {
-				if (navigatorAdapterFactory == null) {
-					navigatorAdapterFactory = new ExposedAdapterFactory(
-							new AdapterFactory[] {
-									// new ResourceItemProviderAdapterFactory(),
-									new org.eclipse.epf.library.edit.navigator.ItemProviderAdapterFactory(),
-									new ReflectiveItemProviderAdapterFactory() });
-				}
-			}
-		}
-		return navigatorAdapterFactory;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#getNavigatorView_ComposedAdapterFactory()
-	 */
-	// public ComposedAdapterFactory getFilterView_ComposedAdapterFactory() {
-	// if(filterAdapterFactory == null) {
-	// synchronized(this) {
-	// if(filterAdapterFactory == null) {
-	// filterAdapterFactory = new ComposedAdapterFactory(
-	// new AdapterFactory[] {
-	// new ResourceItemProviderAdapterFactory(),
-	// new com.ibm.library.edit.filter.ItemProviderAdapterFactory(),
-	// new ReflectiveItemProviderAdapterFactory()
-	// });
-	// }
-	// }
-	// }
-	// return filterAdapterFactory;
-	// }
-	//    
-	public ComposedAdapterFactory getConfigurationView_ComposedAdapterFactory() {
-		if (configurationAdapterFactory == null) {
-			synchronized (this) {
-				if (configurationAdapterFactory == null) {
-					configurationAdapterFactory = new ExposedAdapterFactory(
-							new AdapterFactory[] {
-									// new ResourceItemProviderAdapterFactory(),
-									new org.eclipse.epf.library.edit.configuration.ItemProviderAdapterFactory(),
-									new ReflectiveItemProviderAdapterFactory() });
-				}
-			}
-		}
-		return configurationAdapterFactory;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#getNavigatorView_FilterAdapterFactory(com.ibm.library.edit.IFilter)
-	 */
-	public AdapterFactory getConfigurationView_AdapterFactory(IFilter filter) {
-		return new FilterAdapterFactory(
-				getConfigurationView_ComposedAdapterFactory(), filter);
-	}
-
-	private static class FilterItemProvider implements Adapter,
-			IStructuredItemContentProvider, ITreeItemContentProvider,
-			IItemLabelProvider, IItemPropertySource {
-		private static final HashSet<Class<?>> CLASSES_EXCLUDED_FROM_SORTING = new HashSet<Class<?>>();
-
-		static {
-			CLASSES_EXCLUDED_FROM_SORTING.add(Activity.class);
-			CLASSES_EXCLUDED_FROM_SORTING.add(CustomCategory.class);
-			CLASSES_EXCLUDED_FROM_SORTING.add(TaskDescriptor.class);
-			CLASSES_EXCLUDED_FROM_SORTING.add(TeamProfile.class);
-		}
-
-		private ItemProviderAdapter adapter;
-
-		private IFilter filter;
-
-		private boolean isAdapterConfigurable;
-
-		FilterItemProvider(ItemProviderAdapter adapter, IFilter filter) {
-			this.adapter = adapter;
-			this.filter = filter;
-			if (adapter instanceof IConfigurable) {
-				isAdapterConfigurable = true;
-				((IConfigurable) adapter).setFilter(filter);
-			}
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification notification) {
-			adapter.notifyChanged(notification);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#getTarget()
-		 */
-		public Notifier getTarget() {
-			return adapter.getTarget();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
-		 */
-		public void setTarget(Notifier newTarget) {
-			adapter.setTarget(newTarget);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			return adapter.isAdapterForType(type);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IEditingDomainItemProvider#getChildren(java.lang.Object)
-		 */
-		public Collection<?> getChildren(Object object) {
-			List<Object> children = null;
-			fake_loop: do {
-				
-				// Order is not important, If adapter is ILibraryItemProvider
-				// and replaceChildren is false and IConfigurable, it should  
-				// go to isAdapterConfigurable, not to regular iteration.
-
-				if (filter instanceof IConfigurator
-						&& adapter instanceof ILibraryItemProvider) {
-					IConfigurator configurator = (IConfigurator) filter;
-					children = new ArrayList<Object>();
-					boolean replaceChildren = false;
-					for (Iterator iter = ((ILibraryItemProvider) adapter)
-							.getChildrenFeatures(object).iterator(); iter
-							.hasNext();) {
-						EStructuralFeature feature = (EStructuralFeature) iter
-								.next();
-						Collection otherChildren = configurator.getChildren(
-								object, feature);
-						if (otherChildren != null) {
-							replaceChildren = true;
-							if (adapter instanceof IWrapper) {
-								IWrapper wrapper = (IWrapper) adapter;
-								for (Iterator iterator = otherChildren
-										.iterator(); iterator.hasNext();) {
-									Object child = iterator.next();
-									children.add(wrapper.wrap((EObject) object,
-											feature, child,
-											CommandParameter.NO_INDEX));
-								}
-							} else {
-								children.addAll(otherChildren);
-							}
-						}
-					}
-					if (replaceChildren) {
-						break fake_loop;
-					}
-				} 
-				if (isAdapterConfigurable) {
-					Collection collection = adapter.getChildren(object);
-					if (collection instanceof List) {
-						children = (List) collection;
-					} else {
-						children = new ArrayList(collection);
-					}
-					break fake_loop;
-				}
-				
-				// regular adapter
-				children = new ArrayList(adapter.getChildren(object));
-				for (Iterator iter = children.iterator(); iter.hasNext();) {
-					Object element = (Object) iter.next();
-					if (!filter.accept(element)) {
-						iter.remove();
-					}
-				}
-			} while (false);
-
-			// alphabetically sort the children
-			//
-			if (!TngUtil.isInstanceOf(CLASSES_EXCLUDED_FROM_SORTING, TngUtil
-					.unwrap(object))) {
-				Collections.sort(children,
-						Comparators.PRESENTATION_NAME_COMPARATOR);
-			}
-
-			// System.out.println("FilterItemProvider.getChildren() returned " +
-			// children);
-			return children;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IEditingDomainItemProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object object) {
-			return adapter.getParent(object);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IEditingDomainItemProvider#getNewChildDescriptors(java.lang.Object,
-		 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-		 */
-		public Collection getNewChildDescriptors(Object object,
-				EditingDomain editingDomain, Object sibling) {
-			return adapter.getNewChildDescriptors(object, editingDomain,
-					sibling);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IEditingDomainItemProvider#createCommand(java.lang.Object,
-		 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Class,
-		 *      org.eclipse.emf.edit.command.CommandParameter)
-		 */
-		public Command createCommand(Object object,
-				EditingDomain editingDomain, Class commandClass,
-				CommandParameter commandParameter) {
-			return adapter.createCommand(object, editingDomain, commandClass,
-					commandParameter);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IStructuredItemContentProvider#getElements(java.lang.Object)
-		 */
-		public Collection getElements(Object object) {
-			return adapter.getElements(object);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.ITreeItemContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object object) {
-			if (filter instanceof IConfigurator
-					&& adapter instanceof ILibraryItemProvider) {
-				// always return true to improve performance
-				//
-				return true;
-			}
-			if(object instanceof ContentElement){
-				return adapter.hasChildren(object);
-			}
-			if(TngUtil.unwrap(object) instanceof Milestone) {
-				return false;
-			}
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IItemLabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object object) {
-			return adapter.getText(object);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IItemLabelProvider#getImage(java.lang.Object)
-		 */
-		public Object getImage(Object object) {
-			return adapter.getImage(object);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IItemPropertySource#getPropertyDescriptors(java.lang.Object)
-		 */
-		public List getPropertyDescriptors(Object object) {
-			return adapter.getPropertyDescriptors(object);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IItemPropertySource#getPropertyDescriptor(java.lang.Object,
-		 *      java.lang.Object)
-		 */
-		public IItemPropertyDescriptor getPropertyDescriptor(Object object,
-				Object propertyID) {
-			return adapter.getPropertyDescriptor(object, propertyID);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IItemPropertySource#getEditableValue(java.lang.Object)
-		 */
-		public Object getEditableValue(Object object) {
-			return adapter.getEditableValue(object);
-		}
-
-	}
-
-	private static class FilterAdapterFactory implements AdapterFactory,
-			IChangeNotifier, IDisposable {
-
-		private ComposedAdapterFactory adapterFactory;
-
-		private IFilter filter;
-
-		/**
-		 * 
-		 */
-		public FilterAdapterFactory(ComposedAdapterFactory adapterFactory,
-				IFilter filter) {
-			this.adapterFactory = adapterFactory;
-			if(adapterFactory instanceof ConfigurableComposedAdapterFactory) {
-				((ConfigurableComposedAdapterFactory)adapterFactory).setFilter(filter);
-			}
-			this.filter = filter;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.AdapterFactory#isFactoryForType(java.lang.Object)
-		 */
-		public boolean isFactoryForType(Object type) {
-			return adapterFactory.isFactoryForType(type);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.AdapterFactory#adapt(java.lang.Object,
-		 *      java.lang.Object)
-		 */
-		public Object adapt(Object object, Object type) {
-			Object adapter = adapterFactory.adapt(object, type);
-			if (adapter == null || adapter instanceof FilterItemProvider
-					|| !(adapter instanceof ItemProviderAdapter)) {
-				return adapter;
-			}
-			return new FilterItemProvider((ItemProviderAdapter) adapter, filter);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.AdapterFactory#adapt(org.eclipse.emf.common.notify.Notifier,
-		 *      java.lang.Object)
-		 */
-		public Adapter adapt(Notifier target, Object type) {
-			Adapter adapter = adapterFactory.adapt(target, type);
-			if (adapter == null || adapter instanceof FilterItemProvider
-					|| !(adapter instanceof ItemProviderAdapter)) {
-				return adapter;
-			}
-			return new FilterItemProvider((ItemProviderAdapter) adapter, filter);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.AdapterFactory#adaptNew(org.eclipse.emf.common.notify.Notifier,
-		 *      java.lang.Object)
-		 */
-		public Adapter adaptNew(Notifier target, Object type) {
-			return adapterFactory.adaptNew(target, type);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.AdapterFactory#adaptAllNew(org.eclipse.emf.common.notify.Notifier)
-		 */
-		public void adaptAllNew(Notifier notifier) {
-			adapterFactory.adaptAllNew(notifier);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IChangeNotifier#fireNotifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void fireNotifyChanged(Notification notification) {
-			adapterFactory.fireNotifyChanged(notification);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IChangeNotifier#addListener(org.eclipse.emf.edit.provider.INotifyChangedListener)
-		 */
-		public void addListener(INotifyChangedListener notifyChangedListener) {
-			adapterFactory.addListener(notifyChangedListener);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IChangeNotifier#removeListener(org.eclipse.emf.edit.provider.INotifyChangedListener)
-		 */
-		public void removeListener(INotifyChangedListener notifyChangedListener) {
-			adapterFactory.removeListener(notifyChangedListener);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.edit.provider.IDisposable#dispose()
-		 */
-		public void dispose() {
-			filter = null;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#createWBSComposedAdapterFactory()
-	 */
-	public ComposedAdapterFactory createWBSComposedAdapterFactory() {
-		AdapterFactory[] adapterFactories = new AdapterFactory[] {
-		// new ResourceItemProviderAdapterFactory(),
-				new WBSItemProviderAdapterFactory(),
-				new ReflectiveItemProviderAdapterFactory() };
-		return new ExposedAdapterFactory(adapterFactories);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.TngAdapterFactory#createPublishingWBSAdapterFactory()
-	 */
-	public ComposedAdapterFactory createPublishingWBSAdapterFactory() {
-		return new ExposedAdapterFactory(
-				new AdapterFactory[] {
-						new org.eclipse.epf.library.edit.process.publishing.WBSItemProviderAdapterFactory(),
-						new ReflectiveItemProviderAdapterFactory()
-				}
-		);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#createTBSComposedAdapterFactory()
-	 */
-	public ComposedAdapterFactory createTBSComposedAdapterFactory() {
-		AdapterFactory[] adapterFactories = new AdapterFactory[] {
-		// new ResourceItemProviderAdapterFactory(),
-				new OBSItemProviderAdapterFactory(),
-				new ReflectiveItemProviderAdapterFactory() };
-		return new ExposedAdapterFactory(adapterFactories);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.TngAdapterFactory#createPublishingTBSAdapterFactory()
-	 */
-	public ComposedAdapterFactory createPublishingTBSAdapterFactory() {
-		return new ExposedAdapterFactory(
-				new AdapterFactory[] {
-						new org.eclipse.epf.library.edit.process.publishing.TBSItemProviderAdapterFactory(),
-						new ReflectiveItemProviderAdapterFactory()
-				}
-		);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#createWPBSComposedAdapterFactory()
-	 */
-	public ComposedAdapterFactory createWPBSComposedAdapterFactory() {
-		AdapterFactory[] adapterFactories = new AdapterFactory[] {
-		// new ResourceItemProviderAdapterFactory(),
-				new PBSItemProviderAdapterFactory(),
-				new ReflectiveItemProviderAdapterFactory() };
-		return new ExposedAdapterFactory(adapterFactories);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#createProcessComposedAdapterFactory()
-	 */
-	public ComposedAdapterFactory createProcessComposedAdapterFactory() {
-		org.eclipse.epf.library.edit.process.consolidated.ItemProviderAdapterFactory adapterFactory = new org.eclipse.epf.library.edit.process.consolidated.ItemProviderAdapterFactory();
-		IPreferenceStoreWrapper prefStore = Providers.getAuthoringPluginPreferenceStore();
-		if (prefStore != null) {
-			adapterFactory.setColumnIndexToNameMap(ProcessUtil
-					.toColumnIndexToNameMap(prefStore
-							.getString(LibraryEditConstants.PREF_WBS_COLUMNS)));
-		}
-		AdapterFactory[] adapterFactories = new AdapterFactory[] {
-		// new ResourceItemProviderAdapterFactory(),
-				adapterFactory, new ReflectiveItemProviderAdapterFactory() };
-
-		return new ExposedAdapterFactory(adapterFactories);
-	}
-
-	// Section for TNG Filter modification process.
-	// filter modification code. Similar to getFilterView_AdapterFactory(IFilter
-	// filter)
-	public AdapterFactory getItemsFilter_AdapterFactory(IFilter filter) {
-		return new FilterAdapterFactory(
-				getItemsFilter_ComposedAdapterFactory(), filter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#getItemsFilter_ComposedAdapterFactory()
-	 */
-	public ComposedAdapterFactory getItemsFilter_ComposedAdapterFactory() {
-		if (itemsFilterAdapterFactory == null) {
-			synchronized (this) {
-				if (itemsFilterAdapterFactory == null) {
-					itemsFilterAdapterFactory = new ExposedAdapterFactory(
-							new AdapterFactory[] {
-									// new ResourceItemProviderAdapterFactory(),
-									new org.eclipse.epf.library.edit.itemsfilter.ItemProviderAdapterFactory(),
-									new ReflectiveItemProviderAdapterFactory() });
-				}
-			}
-		}
-		return itemsFilterAdapterFactory;
-	}
-
-	public AdapterFactory getPBSFilter_AdapterFactory(IFilter filter) {
-		return new FilterAdapterFactory(getPBSFilter_ComposedAdapterFactory(),
-				filter);
-	}
-
-	public ComposedAdapterFactory getPBSFilter_ComposedAdapterFactory() {
-		if (pbsFilterAdapaterFactory == null) {
-			synchronized (this) {
-				if (pbsFilterAdapaterFactory == null) {
-					pbsFilterAdapaterFactory = new ExposedAdapterFactory(
-							new AdapterFactory[] {
-									// new ResourceItemProviderAdapterFactory(),
-									new org.eclipse.epf.library.edit.itemsfilter.PBSItemProviderAdapterFactory(),
-									new ReflectiveItemProviderAdapterFactory() });
-				}
-			}
-		}
-		return pbsFilterAdapaterFactory;
-	}
-
-	public AdapterFactory getOBSFilter_AdapterFactory(IFilter filter) {
-		return new FilterAdapterFactory(getOBSFilter_ComposedAdapterFactory(),
-				filter);
-	}
-
-	public ComposedAdapterFactory getOBSFilter_ComposedAdapterFactory() {
-		if (obsFilterAdapaterFactory == null) {
-			synchronized (this) {
-				if (obsFilterAdapaterFactory == null) {
-					obsFilterAdapaterFactory = new ExposedAdapterFactory(
-							new AdapterFactory[] {
-									// new ResourceItemProviderAdapterFactory(),
-									new org.eclipse.epf.library.edit.itemsfilter.OBSItemProviderAdapterFactory(),
-									new ReflectiveItemProviderAdapterFactory() });
-				}
-			}
-		}
-		return obsFilterAdapaterFactory;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#getProcessComposedAdapterFactory()
-	 */
-	public ComposedAdapterFactory getProcessComposedAdapterFactory() {
-		if (procAdapterFactory == null) {
-			synchronized (this) {
-				if (procAdapterFactory == null) {
-					org.eclipse.epf.library.edit.process.consolidated.ItemProviderAdapterFactory adapterFactory = new org.eclipse.epf.library.edit.process.consolidated.ItemProviderAdapterFactory();
-					final IPreferenceStoreWrapper prefStore = Providers.getPreferenceStore();
-					if (prefStore != null) {
-						adapterFactory
-								.setColumnIndexToNameMap(ProcessUtil
-										.toColumnIndexToNameMap(prefStore
-												.getString(LibraryEditConstants.PREF_WBS_COLUMNS)));
-						prefStore.addPropertyChangeListener(adapterFactory);
-						
-						// Initialize "auto inherit suppression states" flag for calculating suppression
-						// and add listener to its change
-						//
-						Suppression.setAutoInheritSuppressionStates(prefStore.getBoolean(LibraryEditConstants.PREF_INHERIT_SUPPRESSION_STATE));
-						prefStore.addPropertyChangeListener(new IPropertyChangeListenerWrapper() {
-
-							public void propertyChange(IPropertyChangeEventWrapper event) {
-								if(LibraryEditConstants.PREF_INHERIT_SUPPRESSION_STATE.equals(event.getProperty())) {
-									Suppression.setAutoInheritSuppressionStates(prefStore.getBoolean(LibraryEditConstants.PREF_INHERIT_SUPPRESSION_STATE));
-								}
-							}
-
-						});
-					}					
-				
-					procAdapterFactories = new AdapterFactory[] {
-							adapterFactory,
-							new ReflectiveItemProviderAdapterFactory() };
-
-					procAdapterFactory = new ExposedAdapterFactory(
-							procAdapterFactories);
-				}
-			}
-		}
-
-		return procAdapterFactory;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TngAdapterFactory#reset()
-	 */
-	public void reset() {
-		if (navigatorAdapterFactory != null) {
-			navigatorAdapterFactory.dispose();
-		}
-
-		if (itemsFilterAdapterFactory != null) {
-			itemsFilterAdapterFactory.dispose();
-			itemsFilterAdapterFactory = null;
-		}
-		
-		if (obsFilterAdapaterFactory != null) {
-			obsFilterAdapaterFactory.dispose();
-			obsFilterAdapaterFactory = null;
-		}
-		
-		if (pbsFilterAdapaterFactory != null) {
-			pbsFilterAdapaterFactory.dispose();
-			pbsFilterAdapaterFactory = null;
-		}
-		
-		
-		if (configProcessViewAdapterFactory != null) {
-			configProcessViewAdapterFactory.dispose();
-		}
-
-		if (configurationAdapterFactory != null) {
-			configurationAdapterFactory.dispose();
-		}
-
-		if (wbsAdapterFactory != null) {
-			wbsAdapterFactory.dispose();
-			wbsAdapterFactory = null;
-		}
-
-		if (obsAdapterFactory != null) {
-			obsAdapterFactory.dispose();
-			obsAdapterFactory = null;
-		}
-
-		if (pbsAdapterFactory != null) {
-			pbsAdapterFactory.dispose();
-			pbsAdapterFactory = null;
-		}
-
-		if (procAdapterFactory != null) {
-			// remove adapter factory as property change listener from
-			// preference store
-			//
-			IPreferenceStoreWrapper prefStore = Providers.getAuthoringPluginPreferenceStore();
-			if (prefStore != null) {
-				for (int i = 0; i < procAdapterFactories.length; i++) {
-					Object adapterFactory = procAdapterFactories[i];
-					if (adapterFactory instanceof IPropertyChangeListenerWrapper) {
-						prefStore
-								.removePropertyChangeListener((IPropertyChangeListenerWrapper) adapterFactory);
-					}
-				}
-			}
-			procAdapterFactory.dispose();
-			procAdapterFactory = null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.TngAdapterFactory#createPublishingCBSAdapterFactory()
-	 */
-	public ComposedAdapterFactory createPublishingCBSAdapterFactory() {
-		return new ExposedAdapterFactory(
-				new AdapterFactory[] {
-						new org.eclipse.epf.library.edit.process.publishing.CBSItemProviderAdapterFactory(),
-						new ReflectiveItemProviderAdapterFactory()
-				}
-		);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.TngAdapterFactory#createPublishingWPBSAdapterFactory()
-	 */
-	public ComposedAdapterFactory createPublishingWPBSAdapterFactory() {
-		return new ExposedAdapterFactory(
-				new AdapterFactory[] {
-						new org.eclipse.epf.library.edit.process.publishing.WPBSItemProviderAdapterFactory(),
-						new ReflectiveItemProviderAdapterFactory()
-				}
-		);
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.TngAdapterFactory#cleanUp()
-	 */
-	public void cleanUp() {
-		Suppression.cleanUp();
-
-		if (navigatorAdapterFactory != null) {
-			navigatorAdapterFactory.cleanUp();
-		}
-
-		if (itemsFilterAdapterFactory != null) {
-			itemsFilterAdapterFactory.cleanUp();
-		}
-		
-		if (obsFilterAdapaterFactory != null) {
-			obsFilterAdapaterFactory.cleanUp();
-		}
-		
-		if (pbsFilterAdapaterFactory != null) {
-			pbsFilterAdapaterFactory.cleanUp();
-		}
-		
-		
-		if (configProcessViewAdapterFactory != null) {
-			configProcessViewAdapterFactory.cleanUp();
-		}
-
-		if (configurationAdapterFactory != null) {
-			configurationAdapterFactory.cleanUp();
-		}
-
-		if (wbsAdapterFactory != null) {
-			wbsAdapterFactory.cleanUp();
-		}
-
-		if (obsAdapterFactory != null) {
-			obsAdapterFactory.cleanUp();
-		}
-
-		if (pbsAdapterFactory != null) {
-			pbsAdapterFactory.cleanUp();
-		}
-
-		if (procAdapterFactory != null) {
-			procAdapterFactory.cleanUp();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/internal/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/internal/package.html
deleted file mode 100644
index 824fe69..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides display and editing support for method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ActivityItemProvider.java
deleted file mode 100644
index 120a4b4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ActivityItemProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Milestone;
-
-/**
- * The item provider adapter for an activity in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ActivityItemProvider extends
-		org.eclipse.epf.library.edit.process.ActivityItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 */
-	public ActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	@Override
-	protected boolean acceptAsChild(Object child) {
-		// TODO Auto-generated method stub
-		if(child instanceof Milestone)return true;
-		
-		return super.acceptAsChild(child);
-	}
-	public Collection getChildren(Object object) {
-		// TODO Auto-generated method stub
-		Collection col = super.getChildren(object);
-		FilterUtil
-				.iterateCollection(col, ProcessUtil.getFilter(adapterFactory));
-		return col;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/BSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/BSActivityItemProvider.java
deleted file mode 100644
index 80461f1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/BSActivityItemProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IFilter;
-
-/**
- * The item provider adapter for a breakdown structure activity in the
- * method element selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public abstract class BSActivityItemProvider extends
-		org.eclipse.epf.library.edit.process.BSActivityItemProvider {
-
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 */
-	public BSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	protected Collection addInherited(Object object, List myChildren) {
-		Collection col = super.addInherited(object, myChildren);
-		for (Iterator iter = col.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (filter != null) {
-				if (!filter.accept(child))
-					iter.remove();
-			}
-		}
-		return col;
-	}
-
-	public void setFilter(IFilter filter) {
-		super.setFilter(filter);
-		this.filter = filter;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/CategorizedProcessesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/CategorizedProcessesItemProvider.java
deleted file mode 100644
index ed1751a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/CategorizedProcessesItemProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-
-/**
- * The item provider adapter for the "Capability Patterns" and "Delivery
- * Processes" folders in the method element selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class CategorizedProcessesItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IConfigurable {
-	private String label;
-
-	// private String[] pkgPath;
-	private IFilter filter;
-
-	private Object image;
-
-	// private MethodPlugin plugin;
-	private MethodPackage pkg;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 */
-	public CategorizedProcessesItemProvider(AdapterFactory adapterFactory,
-			MethodPackage pkg, String name, Object image) {
-		super(adapterFactory);
-		label = name;
-		this.image = image;
-		this.pkg = pkg;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = new ArrayList();
-		for (Iterator iterator = pkg.getChildPackages().iterator(); iterator
-				.hasNext();) {
-			Object element = iterator.next();
-			Object child = element;
-			if (element instanceof ProcessComponent) {
-				child = ((ProcessComponent) element).getProcess();
-			}
-			if (filter.accept(child)) {
-				if (!isEmptyPackage(child)) {
-					children.add(child);
-				}
-			}
-		}
-		return children;
-	}
-
-	private Collection childPackages(Object object) {
-		Collection children = ((ProcessPackage) object).getChildPackages();
-		List newList = new ArrayList();
-		newList.addAll(children);
-		if (filter != null) {
-			for (Iterator iter = newList.iterator(); iter.hasNext();) {
-				if (!filter.accept(iter.next())) {
-					iter.remove();
-				}
-			}
-		}
-		return newList;
-	}
-
-	/**
-	 * @param object
-	 * @return
-	 */
-	private boolean isEmptyPackage(Object object) {
-		if (object instanceof ProcessComponent || object instanceof Process)
-			return false;
-		Collection children = this.childPackages(object);
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			if (!isEmptyPackage(iter.next())) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getNewChildDescriptors(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-	 */
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return super.getNewChildDescriptors(target, editingDomain, sibling);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (label != null)
-			return label;
-		return super.getText(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-		this.label = label;
-	}
-
-	public void setParent(Object parent) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentCategoriesGroupItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentCategoriesGroupItemProvider.java
deleted file mode 100644
index 0bedcd1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentCategoriesGroupItemProvider.java
+++ /dev/null
@@ -1,132 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.category.TransientCategoryPackageItemProvider;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * The item provider adapter for the content category folders in the method
- * element selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ContentCategoriesGroupItemProvider extends
-		TransientCategoryPackageItemProvider implements IConfigurable {
-
-	IFilter filter;
-
-	Object image;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 * @param parent
-	 * @param name
-	 */
-	public ContentCategoriesGroupItemProvider(AdapterFactory adapterFactory,
-			Notifier parent, String name) {
-		super(adapterFactory, parent, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	public boolean accept(Object obj) {
-		// return (obj instanceof DisciplineGrouping) || (obj instanceof
-		// Discipline &&
-		// AssociationHelper.getDisciplineGroups((Discipline)obj).isEmpty());
-		if (!this.filter.accept(obj))
-			return false;
-		if (obj instanceof Discipline
-				&& !AssociationHelper.getDisciplineGroups((Discipline) obj)
-						.isEmpty())
-			return false;
-		if (obj instanceof RoleSet
-				&& !AssociationHelper.getRoleSetGroups((RoleSet) obj).isEmpty())
-			return false;
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return accept(obj);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			ItemProviderAdapter contentAdapter = (ItemProviderAdapter) adapterFactory
-					.adapt(obj, ITreeItemContentProvider.class);
-			if (contentAdapter instanceof ILibraryItemProvider) {
-				((ILibraryItemProvider) contentAdapter).setParent(object);
-			}
-		}
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return image;
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	protected void setImage(Object object) {
-		this.image = object;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentCategoryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentCategoryItemProvider.java
deleted file mode 100644
index 3689e4d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentCategoryItemProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.category.TransientCategoryPackageItemProvider;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a content category in the method element
- * selection dialogs.
- * 
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ContentCategoryItemProvider extends
-		TransientCategoryPackageItemProvider implements IConfigurable {
-
-	IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 * @param parent
-	 * @param name
-	 */
-	public ContentCategoryItemProvider(AdapterFactory adapterFactory,
-			Notifier parent, String name) {
-		super(adapterFactory, parent, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			// childrenFeatures.add(UmaPackage.eINSTANCE.getDisciplineGrouping_Disciplines());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	protected boolean acceptAsChild(Object obj) {
-		return filter.accept(obj);
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			ItemProviderAdapter contentAdapter = (ItemProviderAdapter) adapterFactory
-					.adapt(obj, ITreeItemContentProvider.class);
-			if (contentAdapter instanceof ILibraryItemProvider) {
-				((ILibraryItemProvider) contentAdapter).setParent(object);
-			}
-		}
-		return children;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentElementsItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentElementsItemProvider.java
deleted file mode 100644
index c37e091..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentElementsItemProvider.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the content element folders in the method
- * element selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ContentElementsItemProvider extends TransientGroupItemProvider
-		implements IConfigurable {
-
-	IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 * @param parent
-	 */
-	public ContentElementsItemProvider(AdapterFactory adapterFactory,
-			Notifier parent) {
-		super(adapterFactory, parent);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 * @param parent
-	 * @param name
-	 */
-	public ContentElementsItemProvider(AdapterFactory adapterFactory,
-			Notifier parent, String name) {
-		super(adapterFactory, parent, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodPackage_ChildPackages());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getContentPackage_ContentElements());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection childrenCol = super.getChildren(object);
-		for (Iterator iter1 = childrenCol.iterator(); iter1.hasNext();) {
-			Object child = iter1.next();
-			if (child instanceof IConfigurable)
-				((IConfigurable) child).setFilter(filter);
-			if (!filter.accept(child))
-				iter1.remove();
-		}
-		return childrenCol;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.TransientGroupItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object obj) {
-		if (!super.acceptAsChild(obj))
-			return false;
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentPackageItemProvider.java
deleted file mode 100644
index 1017e60..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ContentPackageItemProvider.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.ContentPackage;
-
-/**
- * The item provider adapter for a content package in the method element
- * selection dialogs.
- * 
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ContentPackageItemProvider extends
-		org.eclipse.epf.uma.provider.ContentPackageItemProvider implements
-		IConfigurable {
-
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = getChildrenIncludingEmptyOnes(object);
-
-		// remove the empty packages from the children list
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			if (isEmptyPackage(iter.next())) {
-				iter.remove();
-			}
-		}
-
-		return children;
-	}
-
-	private Collection getChildrenIncludingEmptyOnes(Object object) {
-		Collection children = super.getChildren(object);
-		if (filter != null) {
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				if (!filter.accept(iter.next())) {
-					iter.remove();
-				}
-
-			}
-		}
-		return children;
-	}
-
-	/**
-	 * @param object
-	 * @return
-	 */
-	private boolean isEmptyPackage(Object object) {
-		if (!(object instanceof ContentPackage))
-			return false;
-		Collection children = this.getChildrenIncludingEmptyOnes(object);
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			if (!isEmptyPackage(iter.next())) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/CustomCategoryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/CustomCategoryItemProvider.java
deleted file mode 100644
index b3c926d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/CustomCategoryItemProvider.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-
-/**
- * The item provider adapter for a custom category in the method element
- * selection dialogs.
- * 
- * @author Phong Nguyen Le
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class CustomCategoryItemProvider extends
-		org.eclipse.epf.library.edit.category.CustomCategoryItemProvider implements
-		IConfigurable {
-
-	IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CustomCategoryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		// Set the childrenStoreMap to null, to get the updated customcategories
-		childrenStoreMap = null;
-		Collection children = super.getChildren(object);
-		if (this.filter != null) {
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				FeatureValueWrapperItemProvider obj = (FeatureValueWrapperItemProvider) iter
-						.next();
-				if (!this.filter.accept(obj.getValue())) {
-					iter.remove();
-				}
-
-			}
-		}
-		return children;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DisciplineGroupingItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DisciplineGroupingItemProvider.java
deleted file mode 100644
index 36f5831..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DisciplineGroupingItemProvider.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a discipline grouping in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class DisciplineGroupingItemProvider extends
-		org.eclipse.epf.uma.provider.DisciplineGroupingItemProvider implements
-		IConfigurable, ILibraryItemProvider, IStatefulItemProvider {
-
-	private IFilter filter;
-
-	private IConfigurator configurator;
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 */
-	public DisciplineGroupingItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getDisciplineGrouping_Disciplines());
-			// childrenFeatures.add(UmaPackage.eINSTANCE.getDiscipline());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children;
-		Object parent = getParent(object);
-		if (parent instanceof CategoriesItemProvider) {
-
-			// TODO: commented out until Jinhua fixed bugs in
-			// ConfigurationFilter
-			if (configurator != null) {
-				children = configurator.getChildren(object,
-						UmaPackage.eINSTANCE
-								.getDisciplineGrouping_Disciplines());
-				if (children != null) {
-					System.out
-							.println("DisciplineGroupingItemProvider.getChildren(): returned from configurator: " + children); //$NON-NLS-1$
-					return children;
-				}
-			}
-
-			children = super.getChildren(object);
-			DisciplineGrouping grouping = (DisciplineGrouping) object;
-			MethodConfiguration methodConf = (MethodConfiguration) ((CategoriesItemProvider) getParent(object))
-					.getTarget();
-			TngUtil.addExtendedChildren(grouping, methodConf, children,
-					ModelStructure.DEFAULT.disciplineDefinitionPath);
-
-			// set parent
-			//
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object adapter = adapterFactory.adapt(iter.next(),
-						ITreeItemContentProvider.class);
-				if (adapter instanceof ILibraryItemProvider) {
-					((ILibraryItemProvider) adapter).setParent(this);
-				}
-			}
-
-			return children;
-		} else {
-			Collection childrenCol = super.getChildren(object);
-			for (Iterator iter = childrenCol.iterator(); iter.hasNext();) {
-				Object child = iter.next();
-				if (filter != null)
-					if (!filter.accept(child))
-						iter.remove();
-			}
-			return childrenCol;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.llibrary.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.llibrary.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	public Object getParent(Object object) {
-		if (parent != null) {
-			return parent;
-		}
-		// if(object instanceof EObject) {
-		// MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-		// if(plugin != null) {
-		// String[] path = {
-		// TngEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-		// ,TngEditPlugin.INSTANCE.getString("_UI_Standard_Categories_group")
-		// //$NON-NLS-1$
-		// ,TngEditPlugin.INSTANCE.getString("_UI_Disciplines_group")
-		// //$NON-NLS-1$
-		// };
-		// Object adapter =
-		// TngAdapterFactory.INSTANCE.getItemsFilter_AdapterFactory(filter).adapt(plugin,
-		// ITreeItemContentProvider.class);
-		// // IGroupContainer groups = (IGroupContainer)
-		// TngAdapterFactory.INSTANCE.getItemsFilter_AdapterFactory(filter).adapt(plugin,
-		// ITreeItemContentProvider.class);
-		// // int i;
-		// // for(i = 0; i < path.length - 1; i++) {
-		// // groups = (IGroupContainer) groups.getGroupItemProvider(path[i]);
-		// // if(groups == null) return null;
-		// // }
-		// // return (ItemProviderAdapter) groups.getGroupItemProvider(path[i]);
-		// return TngUtil.getAdapter(plugin, path);
-		// //return adapter;
-		// }
-		// }
-
-		return super.getParent(object);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DisciplineItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DisciplineItemProvider.java
deleted file mode 100644
index 76b29d4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DisciplineItemProvider.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a discipline in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class DisciplineItemProvider extends
-		org.eclipse.epf.library.edit.configuration.DisciplineItemProvider implements
-		IConfigurable {
-
-	private IFilter filter;
-	Object parent;
-
-	public DisciplineItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-	
-	public Collection getChildren(Object object) {
-		Collection col;
-		Object parent = getParent(object);
-		
-		if (parent instanceof CategoriesItemProvider) {
-			col = super.getChildren(object);
-			
-		} else {
-			ItemProviderAdapter adapter = (ItemProviderAdapter) (TngAdapterFactory.INSTANCE)
-					.getNavigatorView_ComposedAdapterFactory().adapt(object,
-							ITreeItemContentProvider.class);
-			col = adapter.getChildren(object);
-		}
-		if (filter != null) {
-			FilterUtil.iterateCollection(col, filter);
-		}
-
-		return col;
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-	
-	public Object getParent(Object object) {
-		Discipline discipline = (Discipline) object;
-		if (discipline.eContainer() instanceof Discipline) {
-			return super.getParent(object);
-		}
-		MethodPlugin model = UmaUtil.getMethodPlugin(discipline);
-		if (model == null)
-			return null;
-		return parent;
-	}
-
-	public void setParent(Object parent) {
-		super.setParent(parent);
-		this.parent = parent;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DomainItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DomainItemProvider.java
deleted file mode 100644
index 32bf8d5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/DomainItemProvider.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a domain in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class DomainItemProvider extends
-		org.eclipse.epf.library.edit.configuration.DomainItemProvider implements
-		IConfigurable {
-	Object parent;
-	private IFilter filter;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public DomainItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public Object getParent(Object object) {
-		Domain domain = (Domain) object;
-		if (domain.eContainer() instanceof Domain) {
-			return super.getParent(object);
-		}
-		MethodPlugin model = UmaUtil.getMethodPlugin(domain);
-		if (model == null)
-			return null;
-		return parent;
-	}
-
-	public void setParent(Object parent) {
-		super.setParent(parent);
-		this.parent = parent;
-	}
-
-	public void setFilter(IFilter filter) {
-		// TODO Auto-generated method stub
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public Collection getChildren(Object object) {
-		Collection col;
-		Object parent = getParent(object);
-		
-		if (parent instanceof CategoriesItemProvider) {
-			col = super.getChildren(object);
-			
-		} else {
-			ItemProviderAdapter adapter = (ItemProviderAdapter) (TngAdapterFactory.INSTANCE)
-					.getNavigatorView_ComposedAdapterFactory().adapt(object,
-							ITreeItemContentProvider.class);
-			col = adapter.getChildren(object);
-		}
-		// If filter not null iterate collection.
-		if (filter != null) {
-			FilterUtil.iterateCollection(col, filter);
-		}
-
-		return col;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterConstants.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterConstants.java
deleted file mode 100644
index 099b1f1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterConstants.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-
-/**
- * Defines the global constants used in the method element selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class FilterConstants {
-
-	public static final String CUSTOM_CATEGORIES = LibraryEditResources.FilterConstants_customcategories_text; 
-
-	public static final String METHO_PLUGINS = LibraryEditResources.FilterConstants_methodplugins_text; 
-
-	public static final String CONTENT_PACKAGES = LibraryEditResources.FilterConstants_contentpackages_text; 
-
-	public static final String ROLESETS = LibraryEditResources.FilterConstants_rolesets_text; 
-
-	public static final String DISCIPLINES = LibraryEditResources.FilterConstants_disciplines_text; 
-
-	public static final String WORKPRODUCTTYPES = LibraryEditResources.FilterConstants_workproducttypes_text; 
-
-	public static final String DOMAINS = LibraryEditResources.FilterConstants_domains_text; 
-
-	public static final String TOOLS = LibraryEditResources.FilterConstants_tools_text; 
-
-	public static final String ALL_ELEMENTS = LibraryEditResources.FilterConstants_all_text; 
-
-	public static final String ROLES = LibraryEditResources.FilterConstants_roles_text; 
-
-	public static final String TASKS = LibraryEditResources.FilterConstants_tasks_text; 
-
-	public static final String WORKPRODUCTS = LibraryEditResources.FilterConstants_workproducts_text; 
-
-	public static final String GUIDANCE = LibraryEditResources.FilterConstants_guidance_text; 
-
-	public static final String PROCESSES = LibraryEditResources.FilterConstants_processes_text; 
-
-	public static final String ACTIVITIES = LibraryEditResources.FilterConstants_activities_text; 
-
-	public static final String WORK_PRODUCT_DESCRIPTORS = LibraryEditResources.FilterConstants_workproductdescriptors_text; 
-
-	public static final String ROLE_DESCRIPTORS = LibraryEditResources.FilterConstants_roledescriptors_text; 
-
-	public static final String TASK_DESCRIPTORS = LibraryEditResources.FilterConstants_taskdescriptors_text; 
-
-	public static final String ONLY_CONTENT_ELEMENTS = LibraryEditResources.FilterConstants_contentelements_text; 
-
-	public static final String CONFIG_CONTENT_ELEMENT = LibraryEditResources.FilterConstants_allcontentelements_text; 
-
-	public static final String ROADMAP = LibraryEditResources.FilterConstants_roadmap_text; 
-
-	public static final String CHECKLISTS = LibraryEditResources.FilterConstants_checklists_text; 
-
-	public static final String CONCEPTS = LibraryEditResources.FilterConstants_concepts_text; 
-
-	public static final String PRACTICES = LibraryEditResources.FilterConstants_practices_text; 
-
-	public static final String REPORTS = LibraryEditResources.FilterConstants_reports_text; 
-
-	public static final String REUSABLE_ASSETS = LibraryEditResources.FilterConstants_reusableassets_text; 
-
-	public static final String WHITE_PAPERS = LibraryEditResources.FilterConstants_whitepapers_text; 
-
-	public static final String TEMPLATES = LibraryEditResources.FilterConstants_templates_text; 
-
-	public static final String GUIDELINES = LibraryEditResources.FilterConstants_guidelines_text; 
-
-	public static final String SUPPORTING_MATERIALS = LibraryEditResources.FilterConstants_supportingmaterials_text; 
-
-	public static final String TOOL_MENTORS = LibraryEditResources.FilterConstants_toolmentors_text; 
-
-	public static final String EXAMPLES = LibraryEditResources.FilterConstants_examples_text; 
-
-	public static final String ROLE_SET_GROUPINGS = LibraryEditResources.FilterConstants_rolesetgropuings_text; 
-
-	public static final String DISCIPLINE_GROUPINGS = LibraryEditResources.FilterConstants_disciplinegroupings_text; 
-
-	// public static final String
-
-	// private static final String[] GUIDANCE_TYPES = new String[]{
-	// CHECKLISTS, CONCEPTS, EXAMPLES, PRACTICES, REPORTS, REUSABLE_ASSETS,
-	// SUPPORTING_MATERIALS, TEMPLATES, TOOL_MENTORS, WHITE_PAPERS,
-	// GUIDELINES,ROADMAP};
-
-	public static final String[] CONTENT_ELEMENTS = new String[] { ROLES,
-			TASKS, WORKPRODUCTS, GUIDANCE, SUPPORTING_MATERIALS,
-			ONLY_CONTENT_ELEMENTS, TOOL_MENTORS };
-
-	public static final String[] CONTENT_CATEGORIES = new String[] { ROLESETS,
-			WORKPRODUCTTYPES, DISCIPLINES, TOOLS, DOMAINS };
-
-	public static final String[] BREAKDOWN_ELEMENTS = new String[] {
-			WORK_PRODUCT_DESCRIPTORS, TASK_DESCRIPTORS, ROLE_DESCRIPTORS };
-
-	public static final List contentElementStrs = Arrays
-			.asList(CONTENT_ELEMENTS);
-
-	public static final List categoryStrs = Arrays.asList(CONTENT_CATEGORIES);
-
-	public static final List breakdownElements = Arrays
-			.asList(BREAKDOWN_ELEMENTS);
-
-	public static HashMap hashMap = new HashMap();
-	
-	public static final String space = "-"; //$NON-NLS-1$
-
-	public static final String ESTIMATE_CONSIDERATIONS = LibraryEditPlugin
-			.getPlugin().getString("_UI_Guidances_EstimationConsiderations"); //$NON-NLS-1$
-
-	public static final String TERM_DEFINITIONS = LibraryEditPlugin.getPlugin()
-			.getString("_UI_Guidances_TermDefinitions"); //$NON-NLS-1$
-	
-	public static final String ANY_STRING = "*";   //$NON-NLS-1$
-	public static final String ANY_CHARACTER = "?";  //$NON-NLS-1$
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterHelper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterHelper.java
deleted file mode 100644
index c29ac9f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterHelper.java
+++ /dev/null
@@ -1,650 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-
-/**
- * A helper class for managing element filtering in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class FilterHelper {
-
-	private String pattern;
-
-	private String type;
-
-	private Pattern regex;
-
-	private String tabStr;
-
-	private Object contentElement;
-
-	private List existingElements = new ArrayList();
-
-	private boolean showPresentationName = false;
-	
-	// This is separate handling for ContentContegory 
-	private String contentCategoryTabStr;
-
-	public FilterHelper(Object contentElement, String tabStr, String pattern,
-
-	String filterTypeStr, List alreadySelectedList) {
-
-		this.contentElement = contentElement;
-
-		this.tabStr = tabStr;
-
-		this.type = filterTypeStr;
-
-		this.existingElements = alreadySelectedList;
-
-		this.pattern = pattern;
-
-		showPresentationName = PresentationContext.INSTANCE
-		.isShowPresentationNames();
-
-
-	}
-	/*
-	 * method to set contentCategoryTabStr, this 
-	 * special handle for content category, tabStr implementation 
-	 * donot work for this. 
-	 */
-	public void setContentCategoryTabStr(String contentCategoryTabStr){
-		this.contentCategoryTabStr = contentCategoryTabStr;
-	}
-	/*
-	 * method to set contentCategoryTabStr, this 
-	 * special handle for content category, tabStr implementation 
-	 * donot work for this. 
-	 */
-	public String getContentCategoryTabStr(){
-		return this.contentCategoryTabStr;
-	}
-
-	public List getAlreadySelectedList() {
-
-		return existingElements;
-
-	}
-
-	public void setAlreadySelectedList(List alreadySelectedList) {
-
-		this.existingElements = alreadySelectedList;
-
-	}
-
-	public boolean matchPattern(Object obj) {
-		return match(obj);
-	}
-
-	/*
-	 * Convenient method to check any CategorizedElements (tree traversal) of
-	 * CustomCategory has any match with matcher. @param CustomCategory
-	 */
-	private boolean hasMatchedChildCustomCategory(CustomCategory topCategory) {
-		List list = topCategory.getCategorizedElements();
-
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Object object = iter.next();
-			if (object instanceof CustomCategory) {
-				CustomCategory category = (CustomCategory) object;
-				if (matcher(category)) {
-					return true;
-				} else if (hasMatchedChildCustomCategory(category)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * Convenient method to check any subArtifacts (tree traversal) of Artifact
-	 * has any match with matcher. @param CustomCategory
-	 */
-	private boolean hasMatchedArtifact(Artifact artifact) {
-
-		List list = artifact.getContainedArtifacts();
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Object object = iter.next();
-			if (object instanceof Artifact) {
-				Artifact subartifact = (Artifact) object;
-				if (matcher(subartifact)) {
-					return true;
-				} else if (hasMatchedArtifact(subartifact)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	/*
-	 * Convenient method to check any subArtifacts (tree traversal) of Artifact
-	 * has any match with  alreadyexisting elements.
-	 */
-	private boolean hasMatchedArtifact(Artifact artifact, List existingList) {
-
-		List list = artifact.getContainedArtifacts();
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Object object = iter.next();
-			if (object instanceof Artifact) {
-				Artifact subartifact = (Artifact) object;
-				if(!existingList.contains(subartifact)){
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Convenient method to check any ChildPackages (tree traversal) of Content
-	 * Package has any match with matcher.
-	 * 
-	 * @param CustomCategory
-	 */
-	private boolean hasMatchedChild(ContentPackage pkg) {
-
-		for (Iterator iter = pkg.getChildPackages().iterator(); iter.hasNext();) {
-			Object childPkg = iter.next();
-			if (childPkg instanceof ContentPackage) {
-				ContentPackage contentPkg = (ContentPackage) childPkg;
-				if (matcher(contentPkg)) {
-					return true;
-				} else if (hasMatchedChild(contentPkg)) {
-					return true;
-				}
-			}
-		}
-		return false;
-
-	}
-
-	/**
-	 * Convenient method to check any subDomain (tree traversal) of Domain has
-	 * any match with matcher <link>matcher(Object obj)</link>
-	 * 
-	 * @param CustomCategory
-	 */
-	private boolean hasMatchedSubDomains(Domain domain) {
-		List list = domain.getSubdomains();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object subdomain = iterator.next();
-			if (matcher(subdomain)) {
-				return true;
-			} else if (hasMatchedSubDomains((Domain) subdomain)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * 
-	 */
-	private boolean hasMatchedSubDiscipline(Discipline discipline){
-		List list = discipline.getSubdiscipline();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object subdiscipline = iterator.next();
-			if (matcher(subdiscipline)) {
-				return true;
-			} else if (hasMatchedSubDiscipline((Discipline) subdiscipline)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * 
-	 */
-	private boolean hasMatchedDisciplines(DisciplineGrouping grouping){
-		List list = grouping.getDisciplines();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object subdiscipline = iterator.next();
-			if (matcher(subdiscipline)) {
-				return true;
-			} else if (hasMatchedSubDiscipline((Discipline) subdiscipline)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Convenient method to check any activity (tree traversal) of activity has
-	 * any match with matcher <link>matcher(Object obj)</link>
-	 * 
-	 * @param CustomCategory
-	 */
-	private boolean hasMatchedActivities(Activity activity) {
-		List list = activity.getBreakdownElements();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (element instanceof Activity) {
-				if (matcher(element)) {
-					return true;
-				} else if (hasMatchedActivities((Activity) element)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Convenient method to check any activity (tree traversal) of ProcessPackage has
-	 * any match with matcher <link>matcher(Object obj)</link>
-	 * 
-	 * @param CustomCategory
-	 */
-	private boolean hasMatchedActivities(ProcessPackage procPackage) {
-		List list = procPackage.getProcessElements();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (element instanceof Activity) {
-				if (matcher(element)) {
-					return true;
-				} else if (hasMatchedActivities((Activity) element)) {
-					return true;
-				}
-			}
-		}
-		// check child packages
-		list = procPackage.getChildPackages();
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object element = iterator.next();
-			if (element instanceof ProcessPackage) {
-				if (hasMatchedActivities((ProcessPackage) element)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-
-	public String getFilterTypeStr() {
-
-		// Trim "-"(hyphen) from the strings (types).  Only in case methodplugin
-		// don't trim "-" because methodplug-in contain "-" (hyphen)and useful.
-		while (type != null && type.indexOf(FilterConstants.space) > -1
-				&& !type.equals(FilterConstants.METHO_PLUGINS)) {
-			type = type.substring(type.indexOf(FilterConstants.space) + 1, type
-					.length());
-		}
-		return type;
-	}
-
-	public String getPattern() {
-
-		return pattern;
-
-	}
-
-	public Pattern getRegexPattern() {
-
-		return regex;
-
-	}
-
-	public String getTabStr() {
-
-		return tabStr;
-
-	}
-
-	/*
-	 * 
-	 * Method checks whether arbitrary object passed is
-	 * 
-	 * equal to current content element's variability or not.
-	 * 
-	 * If variability of ContentElement matches arbitrary object,
-	 * 
-	 * returns true.
-	 * 
-	 * @retun boolean.
-	 * 
-	 */
-
-	public boolean checkVariability(Object obj) {
-		if (contentElement instanceof ContentElement) {
-
-			Object variabilityObject = ((ContentElement) contentElement)
-					.getVariabilityBasedOnElement();
-			if (variabilityObject != null) {
-				if (obj.equals(variabilityObject))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	public Object getContentElement() {
-
-		return contentElement;
-
-	}
-
-	public void setContentElement(Object contentElement) {
-
-		this.contentElement = contentElement;
-
-	}
-
-	public void setFilterTypeStr(String filterTypeStr) {
-
-		this.type = filterTypeStr;
-
-	}
-
-	public void setPattern(String pattern) {
-
-		this.pattern = pattern;
-
-	}
-
-	public void setRegexPattern(Pattern regexPattern) {
-
-		this.regex = regexPattern;
-
-	}
-
-	public void setTabStr(String tabStr) {
-
-		this.tabStr = tabStr;
-
-	}
-
-	public String[] getPathBasedOnTabString(String tabStr) {
-
-		if (FilterConstants.contentElementStrs.contains(tabStr)) {
-			return ModelStructure.DEFAULT.coreContentPath;
-		} else if (tabStr.equals(FilterConstants.ROLESETS)
-				|| tabStr.equals(FilterConstants.ROLE_SET_GROUPINGS)) {
-			return ModelStructure.DEFAULT.roleSetPath;
-		} else if (tabStr.equals(FilterConstants.DISCIPLINES)
-				|| tabStr.equals(FilterConstants.DISCIPLINE_GROUPINGS)) {
-			return ModelStructure.DEFAULT.disciplineDefinitionPath;
-		} else if (tabStr.equals(FilterConstants.TOOLS)) {
-			return ModelStructure.DEFAULT.toolPath;
-		} else if (tabStr.equals(FilterConstants.WORKPRODUCTTYPES)) {
-			return ModelStructure.DEFAULT.workProductTypePath;
-		} else if (tabStr.equals(FilterConstants.DOMAINS)) {
-			return ModelStructure.DEFAULT.domainPath;
-		} else if (tabStr.equals(FilterConstants.CUSTOM_CATEGORIES)) {
-			return ModelStructure.DEFAULT.customCategoryPath;
-		} else
-			return ModelStructure.DEFAULT.coreContentPath;
-
-	}
-
-	/**
-	 * 
-	 * This is convenient method to check all the condition, like matchPattern,
-	 * if object exists in already selected list, check variability match, and
-	 * is object itself donot display.
-	 * 
-	 * @param object
-	 * @return boolean
-	 */
-
-	public boolean checkObjectAccepted(Object obj) {
-
-		if (!match(obj))
-			return false;
-		// Check if already existing (associated elements) don't display.
-		if (getAlreadySelectedList() != null
-				&& getAlreadySelectedList().contains(obj)){
-			// special case handling for Artifact and sub-artifact.
-			if(obj instanceof Artifact){
-				if(!hasMatchedArtifact((Artifact)obj,getAlreadySelectedList()))
-					return false;
-			}else{
-				return false;
-			}
-		}
-
-		if (checkVariability(obj))
-			return false;
-
-		// if object itself don't display
-		// Do equal check only on elements otherthan method plugin, In case of
-		// Copyright(supporting material) associating to methodplugin, if
-		// methodplugin (contentElemtn) equals
-		// obj, then results false.Plugin will lost from tree in the filter. In
-		// turn supporting material for that particular plugin will not be
-		// displayed.
-		if (!(obj instanceof MethodPlugin)) {
-			if (contentElement != null && obj.equals(contentElement))
-				return false;
-		}
-		return true;
-
-	}
-
-	/**
-	 * 
-	 * Convenient method for checking MethodPlugin accepted or not. Method needs
-	 * to invoked only for MethodPlugin object.
-	 * 
-	 * @param object
-	 * @return boolean
-	 */
-
-	public boolean acceptMethodPlugin(Object obj) {
-		if (contentElement != null) {
-			if (MethodElementUtil.getAllModels(contentElement).contains(obj))
-				return true;
-			else
-				return false;
-		} else {
-			return true;
-		}
-	}
-
-	/**
-	 * Convenient method for checking Content Package accepted or not. Method
-	 * needs to invoked only for Content Package object.
-	 * 
-	 * @param object
-	 * @return boolean
-	 */
-	public boolean acceptContentPackage(Object obj) {
-
-		if (((ContentPackage) obj).getChildPackages().isEmpty()
-				&& ((ContentPackage) obj).getContentElements().isEmpty())
-			return false;
-		else
-			return true;
-	}
-
-	public boolean isObjectInSelectedItems(Object obj) {
-
-		if (getAlreadySelectedList() != null
-				&& getAlreadySelectedList().contains(obj))
-			return false;
-		else
-			return true;
-	}
-
-	public boolean isContributor(ContentElement element) {
-		// Just returning true, because contribution checked in other place.
-		return false;
-	}
-
-	public boolean matchPatternBasedOnType(Object obj) {
-		return match(obj);
-	}
-
-	public boolean matchPatternOnPresentationName(Object obj) {
-		return match(obj);
-	}
-
-	public boolean isShowPresentationName() {
-		return showPresentationName;
-	}
-
-	public void setShowPresentationName(boolean showPresentationName) {
-		this.showPresentationName = showPresentationName;
-	}
-
-	/**
-	 * Generic method to check match of an object based on regular expression
-	 * also based on type that selected in the dialog.
-	 */
-
-	private boolean match(Object obj) {
-
-		// Do not do Pattern match if type or pattern string is null.
-		if (type == null || pattern == null || pattern.equalsIgnoreCase("")) //$NON-NLS-1$
-			return true;
-
-		// Check if type is of Content Package
-		if (type.equals(FilterConstants.CONTENT_PACKAGES)) {
-
-			if (obj instanceof ContentPackage) {
-
-				if (matcher(obj) || hasMatchedChild((ContentPackage) obj)) {
-					return true;
-				} else {
-					return false;
-				}
-
-			} else {
-
-				// else for all content elements, if their content pakcage
-				// matches , return true.
-				if (obj instanceof ContentElement) {
-					Object container = ((ContentElement) obj).getContainer();
-					if (container instanceof ContentPackage) {
-						if (!matcher(container))
-							return false;
-					}
-				}
-				return true;
-			}
-
-		} else if (type.equals(FilterConstants.METHO_PLUGINS)) {
-			// Check if type is of Method Plugins
-			if (obj instanceof MethodPlugin) {
-				// if is a MethodPlugin, return true if matches the pattern
-				return matcher(obj);
-
-			} else {
-				return true;
-			}
-
-		} else if (type.equals(FilterConstants.ACTIVITIES)) {
-			if (obj instanceof Activity) {
-				if (matcher(obj)) {
-					return true;
-				} else {
-					return hasMatchedActivities((Activity)obj);
-				}
-			} else if (obj instanceof ProcessPackage) {
-				return hasMatchedActivities((ProcessPackage)obj);
-			} else {
-				return true;
-			}
-		} else if (type != null) {
-
-			if (obj instanceof ContentElement
-					|| obj instanceof ProcessComponent
-					|| obj instanceof Process) {
-
-				if (type.indexOf(FilterConstants.space) > -1) {
-					type = type.substring(type.indexOf(FilterConstants.space), type.length());
-				}
-
-				Class cls = FilterInitializer.getInstance().getClassForType(
-						type);
-				if (cls != null && !cls.isInstance(obj)) {
-					return true;
-				}
-
-				if (matcher(obj)) {
-					return true;
-				} else {
-
-					if (obj instanceof CustomCategory)
-						return hasMatchedChildCustomCategory((CustomCategory) obj);
-
-					if (obj instanceof Artifact) {
-						return hasMatchedArtifact((Artifact) obj);
-					}
-					if (obj instanceof Domain) {
-						return hasMatchedSubDomains((Domain) obj);
-					}
-					if (obj instanceof Discipline){
-						return hasMatchedSubDiscipline((Discipline)obj);
-					}
-					if (obj instanceof DisciplineGrouping){
-						return hasMatchedDisciplines((DisciplineGrouping)obj);
-					}
-					return false;
-				}
-			} else { // else for all other types of elements
-				return true;
-			}
-
-		} else
-			// the All case
-			return true;
-	}
-
-	/**
-	 * Convenient method which does actual matching of given object with regular
-	 * expression. Checks to do presentationname or name.
-	 */
-	public boolean matcher(Object obj) {
-		if(regex != null){
-			Matcher m = regex.matcher(((MethodElement) obj).getName());
-			if (showPresentationName) {
-				if (obj instanceof DescribableElement
-						&& ((DescribableElement) obj).getPresentationName() != null)
-					m = regex.matcher(((DescribableElement) obj)
-							.getPresentationName());
-			}
-			return m.matches();
-		}
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterInitializer.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterInitializer.java
deleted file mode 100644
index bd6ee14..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterInitializer.java
+++ /dev/null
@@ -1,120 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * A helper class for setting up the necessary maps used for element filtering
- * in the method element selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public final class FilterInitializer {
-
-	private static FilterInitializer initializer;
-
-	private static Map map;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public FilterInitializer() {
-		super();
-		loadTypeClass();
-	}
-
-	/*
-	 * Singleton.
-	 */
-	public static FilterInitializer getInstance() {
-		if (initializer == null) {
-			synchronized (FilterInitializer.class) {
-				if (initializer == null) {
-					initializer = new FilterInitializer();
-				}
-			}
-		}
-		return initializer;
-	}
-
-	/*
-	 * Load the Filter Types and respective classes. This need in case of i118n -
-	 * Constants values are different.
-	 * 
-	 */
-	private void loadTypeClass() {
-		map = new HashMap();
-		map.put(FilterConstants.WORKPRODUCTTYPES, WorkProductType.class);
-		map.put(FilterConstants.DOMAINS, Domain.class);
-		map.put(FilterConstants.WORKPRODUCTS, WorkProduct.class);
-		map.put(FilterConstants.WORKPRODUCTTYPES, WorkProductType.class);
-		map.put(FilterConstants.DOMAINS, Domain.class);
-		map.put(FilterConstants.WORKPRODUCTS, WorkProduct.class);
-		map.put(FilterConstants.DISCIPLINE_GROUPINGS, DisciplineGrouping.class);
-		map.put(FilterConstants.DISCIPLINES, Discipline.class);
-		map.put(FilterConstants.TASKS, Task.class);
-		map.put(FilterConstants.ROLE_SET_GROUPINGS, RoleSetGrouping.class);
-		map.put(FilterConstants.ROLESETS, RoleSet.class);
-		map.put(FilterConstants.ROLES, Role.class);
-		map.put(FilterConstants.CHECKLISTS, Checklist.class);
-		map.put(FilterConstants.CONCEPTS, Concept.class);
-		map.put(FilterConstants.ESTIMATE_CONSIDERATIONS,
-				EstimationConsiderations.class);
-		map.put(FilterConstants.EXAMPLES, Example.class);
-		map.put(FilterConstants.GUIDELINES, Guideline.class);
-		map.put(FilterConstants.PRACTICES, Practice.class);
-		map.put(FilterConstants.REPORTS, Report.class);
-		map.put(FilterConstants.REUSABLE_ASSETS, ReusableAsset.class);
-		map.put(FilterConstants.ROADMAP, Roadmap.class);
-		map.put(FilterConstants.SUPPORTING_MATERIALS, SupportingMaterial.class);
-		map.put(FilterConstants.TEMPLATES, Template.class);
-		map.put(FilterConstants.TERM_DEFINITIONS, TermDefinition.class);
-		map.put(FilterConstants.TOOL_MENTORS, ToolMentor.class);
-		map.put(FilterConstants.WHITE_PAPERS, Whitepaper.class);
-		// map.put(FilterConstants.GUIDANCE, Guidance.class);
-	}
-
-	/*
-	 * Returns the Class for a type from the map.
-	 */
-	public Class getClassForType(String type) {
-		Object obj = map.get(type);
-		return (Class) obj;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterUtil.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterUtil.java
deleted file mode 100644
index ed760c5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterUtil.java
+++ /dev/null
@@ -1,194 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * 
- */
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.WrapperItemProvider;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * A utility class for managing element filtering in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class FilterUtil {
-	
-	public static void iterateCollection(Collection children, IFilter filter) {
-		for (Iterator iterator = children.iterator(); iterator.hasNext();) {
-			Object child = iterator.next();
-			if (!filter.accept(child))
-				iterator.remove();
-		}
-	}
-
-	/**
-	 * Method for collecting the parents chain (upward) of an breakdownelement.
-	 * 
-	 * @param AdapterFactory
-	 * @param BreakdownElement
-	 * @param List
-	 */
-	public static void getParentsInScope(AdapterFactory adapterFactory,
-			BreakdownElement element, java.util.List activityList) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(element, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(element);
-		if (parent instanceof Activity) {
-			activityList.add(parent);
-			getParentsInScope(adapterFactory, (BreakdownElement) parent,
-					activityList);
-		}
-	}
-
-	/**
-	 * Get all children of the activity recursively downwards.
-	 * 
-	 * @param adapterFactory
-	 * @param parent
-	 * @param activityList
-	 */
-	public static void getChildActivitiesInScope(AdapterFactory adapterFactory,
-			Activity parent, List activityList) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(parent, ITreeItemContentProvider.class);
-
-		Object o = adapter.getChildren(parent);
-		if (o instanceof List) {
-			List children = (List) o;
-			for (Iterator itor = children.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (obj instanceof Activity) {
-					activityList.add(obj);
-					getChildActivitiesInScope(adapterFactory, (Activity) obj,
-							activityList);
-				}
-				if (obj instanceof ActivityWrapperItemProvider) {
-					Object o1 = ((WrapperItemProvider) obj).getValue();
-					activityList.add(o1);
-					getChildActivitiesInScope(adapterFactory, (Activity) o1,
-							activityList);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Convenient method for retriving all the contributors of
-	 * variabilityelement in a list.
-	 * 
-	 */
-	public static void getContributors(List list, List generalizers) {
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object e = iterator.next();
-			if (e instanceof VariabilityElement) {
-				Iterator iter = TngUtil.getContributors((VariabilityElement) e);
-				while (iter.hasNext()) {
-					generalizers.add(iter.next());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Convenient method for retriving all the contributors of
-	 * variabilityelement in a list.
-	 * 
-	 */
-	public static void getGeneralizers(List list, List generalizers) {
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object e = iterator.next();
-			if (e instanceof VariabilityElement) {
-				Iterator iter = TngUtil.getGeneralizers((VariabilityElement) e);
-				while (iter.hasNext()) {
-					generalizers.add(iter.next());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Convenient method for retriving all the variability bases of
-	 * variabilityelement in a list.
-	 * 
-	 */
-	public static void getVariabilityBase(List list, List variabilitybases) {
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof VariabilityElement) {
-				VariabilityElement e = (VariabilityElement) obj;
-				for (; e.getVariabilityBasedOnElement() != null; variabilitybases
-						.add(e = (VariabilityElement) e
-								.getVariabilityBasedOnElement()))
-					;
-			}
-		}
-	}
-
-	/**
-	 * Get parent activity for breakdownelement
-	 * 
-	 * @param brElement
-	 * @return
-	 */
-	public static Object getParentActivity(AdapterFactory adapterFactory,
-			BreakdownElement brElement) {
-		if (brElement != null) {
-			ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-					.adapt(brElement, ITreeItemContentProvider.class);
-			Object parent = adapter.getParent(brElement);
-			while (!(parent instanceof Activity) && parent != null) {
-				brElement = (BreakdownElement) parent;
-				adapter = (ItemProviderAdapter) adapterFactory.adapt(brElement,
-						ITreeItemContentProvider.class);
-				parent = adapter.getParent(brElement);
-			}
-
-			return parent;
-		}
-		return null;
-	}
-
-	public static void getSubTree(AdapterFactory adapter, Activity activity,
-			List treeList) {
-		FilterUtil.getParentsInScope(TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory(), activity, treeList);
-		FilterUtil.getChildActivitiesInScope(TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory(), activity, treeList);
-	}
-
-	public static void getSubTree(AdapterFactory adapter, List list,
-			List treeList) {
-		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof Activity) {
-				getSubTree(adapter, (Activity) obj, treeList);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/GuidanceGroupingItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/GuidanceGroupingItemProvider.java
deleted file mode 100644
index a31d826..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/GuidanceGroupingItemProvider.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * The item provider adapter for the guidance folders in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class GuidanceGroupingItemProvider extends
-		org.eclipse.epf.library.edit.configuration.GuidanceGroupingItemProvider
-		implements IConfigurable {
-
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 * @param methodConfig
-	 */
-	public GuidanceGroupingItemProvider(AdapterFactory adapterFactory,
-			MethodConfiguration methodConfig) {
-		super(adapterFactory, methodConfig);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-	public Collection getChildren(Object object) {
-		Collection col = super.getChildren(object);
-		for (Iterator itor = col.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (!filter.accept(obj))
-				itor.remove();
-		}
-		return col;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IAllFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IAllFilter.java
deleted file mode 100644
index 38e6e57..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IAllFilter.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-/**
- * A filter that displays all method elements in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public interface IAllFilter extends IFilter {
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ICategoryFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ICategoryFilter.java
deleted file mode 100644
index 1e5d220..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ICategoryFilter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-/**
- * A filter that displays only category elements in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public interface ICategoryFilter extends IFilter {
-
-	String[] getCategoryPackagePath();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IContentFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IContentFilter.java
deleted file mode 100644
index 39adec2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IContentFilter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-/**
- * A filter that displays only content elements in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public interface IContentFilter extends IFilter {
-
-	String[] getContentPackagePath();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ICustomFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ICustomFilter.java
deleted file mode 100644
index eb57112..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ICustomFilter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-/**
- * A filter that displays only custom categories in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public interface ICustomFilter extends IFilter {
-
-	String[] getContentPackagePath();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IFilter.java
deleted file mode 100644
index ea8d69c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IFilter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-/**
- * A generic filter for filtering out method elements in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface IFilter extends org.eclipse.epf.library.edit.IFilter {
-
-	/*
-	 * getObject()
-	 */
-	public Object getObject();
-
-	/*
-	 * setHelper()
-	 */
-	public void setHelper(FilterHelper helper);
-
-	/**
-	 * Added for futher filtering. For example, we may set a filer to prevent
-	 * generalizers as base element to avoid circular dependency
-	 * 
-	 * @param additionalFilters
-	 */
-	public void setAdditionalFilters(
-			org.eclipse.epf.library.edit.IFilter[] additionalFilters);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IProcessFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IProcessFilter.java
deleted file mode 100644
index eac6d33..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/IProcessFilter.java
+++ /dev/null
@@ -1,22 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-/**
- * A filter that displays only process elements in the method element selection
- * dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public interface IProcessFilter extends IFilter {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ItemProviderAdapterFactory.java
deleted file mode 100644
index 81b21c9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,155 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import org.eclipse.emf.common.notify.Adapter;
-
-/**
- * The item provider adapter factory for the method element selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ItemProviderAdapterFactory extends
-		org.eclipse.epf.library.edit.navigator.ItemProviderAdapterFactory {
-
-	public ItemProviderAdapterFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createCustomCategoryAdapter()
-	 */
-	public Adapter createCustomCategoryAdapter() {
-		if (customCategoryItemProvider == null) {
-			customCategoryItemProvider = new CustomCategoryItemProvider(this);
-		}
-
-		return customCategoryItemProvider;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createMethodLibraryAdapter()
-	 */
-	public Adapter createMethodLibraryAdapter() {
-		if (methodLibraryItemProvider == null) {
-			methodLibraryItemProvider = new MethodLibraryItemProvider(this);
-		}
-		return methodLibraryItemProvider;
-	}
-
-	public Adapter createMethodPluginAdapter() {
-		if (methodPluginItemProvider == null) {
-			methodPluginItemProvider = new MethodPluginItemProvider(this);
-		}
-		return methodPluginItemProvider;
-	}
-
-	public Adapter createContentPackageAdapter() {
-		if (contentPackageItemProvider == null) {
-			contentPackageItemProvider = new ContentPackageItemProvider(this);
-		}
-		return contentPackageItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.ContentcategoriesAdapterFactory#createDisciplineGroupingAdapter()
-	 */
-	public Adapter createDisciplineGroupingAdapter() {
-		// if(disciplineGroupingItemProvider == null){
-		// disciplineGroupingItemProvider = new
-		// DisciplineGroupingItemProvider(this);
-		// }
-		// return disciplineGroupingItemProvider;
-		return new DisciplineGroupingItemProvider(this);
-	}
-
-	public Adapter createRoleSetGroupingAdapter() {
-		// if(roleSetGroupingItemProvider == null){
-		// roleSetGroupingItemProvider = new RoleSetGroupingItemProvider(this);
-		// }
-		// return roleSetGroupingItemProvider;
-		return new RoleSetGroupingItemProvider(this);
-	}
-
-	public Adapter createRoleSetAdapter() {
-		return new RoleSetItemProvider(this);
-	}
-
-	public Adapter createMethodConfigurationAdapter() {
-		return new MethodConfigurationItemProvider(this);
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-//		if (deliveryProcessItemProvider == null) {
-//			deliveryProcessItemProvider = new DeliveryProcessItemProvider(this);
-//		}
-//
-//		return deliveryProcessItemProvider;
-		
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createCapabilityPatternAdapter()
-	 */
-	public Adapter createCapabilityPatternAdapter() {
-		return createActivityAdapter();
-	}
-
-	public Adapter createActivityAdapter() {
-		return new ActivityItemProvider(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createPhaseAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createIterationAdapter()
-	 */
-	public Adapter createIterationAdapter() {
-		return createActivityAdapter();
-	}
-
-	public Adapter createDomainAdapter() {
-		return new DomainItemProvider(this);
-	}
-
-	public Adapter createDisciplineAdapter() {
-		return new DisciplineItemProvider(this);
-	}
-
-	public Adapter createProcessPackageAdapter() {
-		return new ProcessPackageItemProvider(this);
-	}
-
-	public Adapter createProcessComponentAdapter() {
-		return new ProcessComponentItemProvider(this);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodConfigurationItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodConfigurationItemProvider.java
deleted file mode 100644
index e3348c2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodConfigurationItemProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-
-/**
- * The item provider adapter for a method configuration in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodConfigurationItemProvider extends
-		org.eclipse.epf.library.edit.configuration.MethodConfigurationItemProvider {
-
-	private IFilter filter;
-
-	public MethodConfigurationItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public void setFilter(IFilter filter) {
-		super.setFilter(filter);
-		if (filter instanceof IConfigurator) {
-			this.filter = filter;
-		}
-	}
-
-	public Collection getChildren(Object object) {
-		children = null;
-		Collection col = super.getChildren(object);
-
-		if (filter != null) {
-			FilterUtil.iterateCollection(col, filter);
-		}
-		return col;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodLibraryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodLibraryItemProvider.java
deleted file mode 100644
index f9d5292..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodLibraryItemProvider.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for a method library in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class MethodLibraryItemProvider extends
-		org.eclipse.epf.uma.provider.MethodLibraryItemProvider implements IConfigurable {
-
-	AdapterFactory adapterFactory;
-
-	ContentElement contentElement;
-
-	private IFilter filter;
-
-	// private boolean isAdapterConfigurable;
-	// private ArrayList children;
-	// private MethodPlugin plugin;
-	// private ModelStructure modelStruct;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodLibraryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-		this.adapterFactory = adapterFactory;
-	}
-
-	/**
-	 * @param adapterFactory
-	 */
-	public MethodLibraryItemProvider(AdapterFactory adapterFactory,
-			Object contentElement) {
-		super(adapterFactory);
-		this.adapterFactory = adapterFactory;
-		this.contentElement = (ContentElement) contentElement;
-	}
-
-	public MethodLibraryItemProvider(AdapterFactory adapterFactory,
-			IFilter filter) {
-		super(adapterFactory);
-		this.adapterFactory = adapterFactory;
-		this.filter = filter;
-		if (adapterFactory instanceof IConfigurable) {
-			// isAdapterConfigurable = true;
-			((IConfigurable) adapterFactory).setFilter(filter);
-		}
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to
-	 * deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand},
-	 * {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in
-	 * {@link #createCommand}. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			// super.getChildrenFeatures(object);
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodLibrary_MethodPlugins());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodLibrary_PredefinedConfigurations());
-		}
-		return childrenFeatures;
-	}
-
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		for (Iterator iter1 = children.iterator(); iter1.hasNext();) {
-			Object child = iter1.next();
-			if (filter.accept(child) && child instanceof MethodPlugin) {
-				MethodPluginItemProvider p = new MethodPluginItemProvider(
-						adapterFactory);
-				p.setFilter(filter);
-				Collection childs = p.getChildren(child);
-				for (Iterator childIter = childs.iterator(); childIter
-						.hasNext();) {
-					Object childObj = childIter.next();
-					if (childObj instanceof ITreeItemContentProvider) {
-						if (!checkChildrens(childObj))
-							childIter.remove();
-
-					} else {
-						if (!filter.accept(childObj)) {
-							childIter.remove();
-						}
-					}
-				}
-				if (childs.isEmpty())
-					iter1.remove();
-			} else {
-				if (!filter.accept(child))
-					iter1.remove();
-			}
-		}
-		return children;
-	}
-
-	private boolean checkChildrens(Object object) {
-		if (object instanceof FeatureValueWrapperItemProvider) {
-			object = ((IWrapperItemProvider) object).getValue();
-			if (!filter.accept(object)) {
-				return false;
-			}
-		} else {
-			Collection childObjChilds = ((ITreeItemContentProvider) object)
-					.getChildren(object);
-			for (Iterator childObjIter = childObjChilds.iterator(); childObjIter
-					.hasNext();) {
-				Object childObjChild = childObjIter.next();
-				if (childObjChild instanceof ITreeItemContentProvider) {
-					return checkChildrens(childObjChild);
-				}
-				if (!filter.accept(childObjChild)) {
-					childObjIter.remove();
-				}
-			}
-			if (childObjChilds.isEmpty())
-				// childIter.remove();
-				return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodPluginItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodPluginItemProvider.java
deleted file mode 100644
index b852847..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/MethodPluginItemProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for a method plug-in in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class MethodPluginItemProvider extends
-		org.eclipse.epf.uma.provider.MethodPluginItemProvider implements
-		IConfigurable {
-	private IFilter filter;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodPluginItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public Collection getChildren(Object object) {
-		List col = new ArrayList();
-
-		if (filter instanceof ICategoryFilter) {
-			col.addAll(getCategoryItemProvider(object).getChildren(object));
-			return col;
-		} else if (filter instanceof IContentFilter) {
-			return getContent(object);
-		} else if (filter instanceof IAllFilter) {
-			return getAllContentElements(object);
-		} else if (filter instanceof ICustomFilter) {
-			return getCustomCategories(object);
-		} else
-			return super.getChildren(object);
-		// TODO: filter
-	}
-
-	private Collection getCustomCategories(Object object) {
-		CustomCategory rootCustomCategory = TngUtil
-				.getRootCustomCategory((MethodPlugin) object);
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-				.adapt(rootCustomCategory, ITreeItemContentProvider.class);
-		((IConfigurable) adapter).setFilter(filter);
-		return adapter.getChildren(rootCustomCategory);
-	}
-
-	private ItemProviderAdapter getCategoryItemProvider(Object object) {
-		ContentPackage pkg = UmaUtil.findContentPackage((MethodPlugin) object,
-				((ICategoryFilter) filter).getCategoryPackagePath());
-		ContentCategoryItemProvider contentCategoryItemProvider = new ContentCategoryItemProvider(
-				adapterFactory, pkg, ""); //$NON-NLS-1$
-		contentCategoryItemProvider.setFilter(filter);
-		contentCategoryItemProvider.setParent(object);
-		return contentCategoryItemProvider;
-	}
-
-	private Collection getContent(Object object) {
-		ContentPackage pkg = UmaUtil.findContentPackage((MethodPlugin) object,
-				((IContentFilter) filter).getContentPackagePath());
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(pkg, ITreeItemContentProvider.class);
-		((IConfigurable) adapter).setFilter(filter);
-		return adapter.getChildren(pkg);
-	}
-
-	// private ItemProviderAdapter getContentElementsItemProvider(Object object)
-	// {
-	// ContentPackage pkg = UmaUtil.findContentPackage((MethodPlugin)object,
-	// ModelStructure.DEFAULT.coreContentPath);
-	// ContentElementsItemProvider contentElementsItemProvider = new
-	// ContentElementsItemProvider(adapterFactory, pkg);
-	// contentElementsItemProvider.setFilter(filter);
-	// return contentElementsItemProvider;
-	// }
-
-	private Collection getAllContentElements(Object object) {
-		List list = new ArrayList();
-
-		String[] coreContentPath = ModelStructure.DEFAULT.coreContentPath;
-		ContentPackage corePkg = UmaUtil.findContentPackage(
-				(MethodPlugin) object, coreContentPath);
-		ItemProviderAdapter contentAdapter = (ItemProviderAdapter) adapterFactory
-				.adapt(corePkg, ITreeItemContentProvider.class);
-		((IConfigurable) contentAdapter).setFilter(filter);
-		list.addAll(contentAdapter.getChildren(corePkg));
-
-		String[][] categoryPaths = new String[][] {
-				ModelStructure.DEFAULT.domainPath,
-				ModelStructure.DEFAULT.disciplineDefinitionPath,
-				ModelStructure.DEFAULT.roleSetPath,
-				ModelStructure.DEFAULT.workProductTypePath,
-				ModelStructure.DEFAULT.toolPath };
-
-		for (int i = 0; i < categoryPaths.length; i++) {
-			String[] path = categoryPaths[i];
-			ContentPackage pkg = UmaUtil.findContentPackage(
-					(MethodPlugin) object, path);
-			ContentCategoriesGroupItemProvider contentCategoriesGroupItemProvider = new ContentCategoriesGroupItemProvider(
-					adapterFactory, pkg, getName(path));
-			contentCategoriesGroupItemProvider.setFilter(filter);
-			contentCategoriesGroupItemProvider.setImage(getImage(path));
-			contentCategoriesGroupItemProvider.setParent(object);
-			list.add(contentCategoriesGroupItemProvider);
-		}
-
-		CustomCategory rootCustomCategory = TngUtil
-				.getRootCustomCategory((MethodPlugin) object);
-		if (rootCustomCategory != null) {
-			list.add(rootCustomCategory);
-		}
-
-		// String name =
-		// LibraryEditPlugin.INSTANCE.getString("_UI_Processes_group");
-		// //$NON-NLS-1$
-		ProcessesItemProvider processItemProvider = new ProcessesItemProvider(
-				adapterFactory, (MethodPlugin) object);
-		processItemProvider.setFilter(filter);
-		processItemProvider.setParent(object);
-		list.add(processItemProvider);
-
-		for (Iterator iter1 = list.iterator(); iter1.hasNext();) {
-			Object child = iter1.next();
-			if (!filter.accept(child))
-				iter1.remove();
-		}
-		return list;
-	}
-
-	// private Collection getProcesses(Object object) {
-	// List list = new ArrayList();
-	// // String name =
-	// // LibraryEditPlugin.INSTANCE.getString("_UI_Processes_group");
-	// // //$NON-NLS-1$
-	// ProcessesItemProvider processItemProvider = new ProcessesItemProvider(
-	// adapterFactory, (MethodPlugin) object);
-	// processItemProvider.setFilter(filter);
-	// list.add(processItemProvider);
-	// return list;
-	// }
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-	}
-
-	public void setParent(Object parent) {
-	}
-
-	private Object getImage(String[] path) {
-		if (path == ModelStructure.DEFAULT.disciplineDefinitionPath) {
-			return LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/Disciplines"); //$NON-NLS-1$
-		} else if (path == ModelStructure.DEFAULT.domainPath) {
-			return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Domains"); //$NON-NLS-1$
-		} else if (path == ModelStructure.DEFAULT.workProductTypePath) {
-			return LibraryEditPlugin.INSTANCE
-					.getImage("full/obj16/WorkProductTypes"); //$NON-NLS-1$
-		} else if (path == ModelStructure.DEFAULT.roleSetPath) {
-			return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Roles"); //$NON-NLS-1$
-		} else if (path == ModelStructure.DEFAULT.toolPath) {
-			return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Tools"); //$NON-NLS-1$
-		}
-		return null;
-
-	}
-
-	private String getName(String[] path) {
-		if (path == ModelStructure.DEFAULT.disciplineDefinitionPath) {
-			return LibraryEditPlugin.INSTANCE
-					.getString("_UI_Disciplines_group"); //$NON-NLS-1$
-		} else if (path == ModelStructure.DEFAULT.domainPath) {
-			return LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group"); //$NON-NLS-1$
-
-		} else if (path == ModelStructure.DEFAULT.workProductTypePath) {
-			return LibraryEditPlugin.INSTANCE
-					.getString("_UI_WorkProductTypes_group"); //$NON-NLS-1$
-		} else if (path == ModelStructure.DEFAULT.roleSetPath) {
-			return LibraryEditPlugin.INSTANCE.getString("_UI_Role_Sets_group"); //$NON-NLS-1$
-		} else if (path == ModelStructure.DEFAULT.toolPath) {
-			return LibraryEditPlugin.INSTANCE.getString("_UI_Tools_group"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSActivityItemProvider.java
deleted file mode 100644
index 5cfec3d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSActivityItemProvider.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.uma.Descriptor;
-
-/**
- * The item provider adapter for activities in the Team Allocation page of a
- * Process editor.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class OBSActivityItemProvider extends BSActivityItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 */
-	public OBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#getObject(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected Object getObject(Descriptor descriptor) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getEClasses()
-	 */
-	public Collection getEClasses() {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSItemProviderAdapterFactory.java
deleted file mode 100644
index 0724047..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-
-/**
- * The item provider adapter for break down elements in the Team Allocation page
- * of a Process editor.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class OBSItemProviderAdapterFactory extends
-		org.eclipse.epf.library.edit.process.OBSItemProviderAdapterFactory {
-
-	public Adapter createActivityAdapter() {
-		return new OBSActivityItemProvider(this);
-	}
-
-	public Adapter createCapabilityPatternAdapter() {
-		return new OBSProcessItemProvider(this, (ItemProviderAdapter) super
-				.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new OBSProcessItemProvider(this, (ItemProviderAdapter) super
-				.createDeliveryProcessAdapter());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSProcessItemProvider.java
deleted file mode 100644
index 17069c7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/OBSProcessItemProvider.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IFilter;
-
-/**
- * The item provider adapter for processes in the Team Allocation page
- * of a Process editor.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class OBSProcessItemProvider extends OBSActivityItemProvider {
-
-	private ItemProviderAdapter delegateItemProvider;
-
-	private IFilter filter;
-
-	public OBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#getPropertyDescriptors(java.lang.Object)
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			itemPropertyDescriptors = delegateItemProvider
-					.getPropertyDescriptors(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	public Collection getChildren(Object object) {
-		Collection col = super.getChildren(object);
-		for (Iterator iter = col.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (filter != null) {
-				if (!filter.accept(child))
-					iter.remove();
-			}
-		}
-		return col;
-	}
-
-	public void setFilter(IFilter filter) {
-		super.setFilter(filter);
-		this.filter = filter;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSActivityItemProvider.java
deleted file mode 100644
index 0b6462b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSActivityItemProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Descriptor;
-
-/**
- * The item provider adapter for activities in the Work Breakdown Structure
- * page of a Process editor.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class PBSActivityItemProvider extends BSActivityItemProvider {
-
-	private IFilter filter;
-
-	// IFilter fitler;
-	public PBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public Collection getChildren(Object object) {
-		super.setFilter(filter);
-		Collection col = super.getChildren(object);
-		// This call to PBSActiivityItemProvider(process package) is done
-		// - in order remove duplicate subartifact.
-		col = ProcessUtil.removeSubartifactsFromChildren(col, false);
-		return col;
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	protected Object getObject(Descriptor descriptor) {
-		return null;
-	}
-
-	public Collection getEClasses() {
-		return ProcessUtil.getPBSEclasses();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSItemProviderAdapterFactory.java
deleted file mode 100644
index f8a191f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-
-/**
- * The item provider adapter for break down elements in the Work Product Usage
- * page of a Process editor.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class PBSItemProviderAdapterFactory extends
-		org.eclipse.epf.library.edit.process.PBSItemProviderAdapterFactory {
-
-	public Adapter createActivityAdapter() {
-		return new PBSActivityItemProvider(this);
-	}
-
-	public Adapter createCapabilityPatternAdapter() {
-		return new PBSProcessItemProvider(this, (ItemProviderAdapter) super
-				.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new PBSProcessItemProvider(this, (ItemProviderAdapter) super
-				.createDeliveryProcessAdapter());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSProcessItemProvider.java
deleted file mode 100644
index 1cbcc0a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/PBSProcessItemProvider.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-
-/**
- * The item provider adapter for processes in the Work Product Usage page
- * of a Process editor.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class PBSProcessItemProvider extends PBSActivityItemProvider implements
-		IConfigurable {
-
-	private ItemProviderAdapter delegateItemProvider;
-
-	private IFilter filter;
-
-	public PBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#getPropertyDescriptors(java.lang.Object)
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			itemPropertyDescriptors = delegateItemProvider
-					.getPropertyDescriptors(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	public Collection getChildren(Object object) {
-		Collection col = super.getChildren(object);
-		for (Iterator iter = col.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (filter != null) {
-				if (!filter.accept(child))
-					iter.remove();
-			}
-		}
-		return col;
-	}
-
-	public void setFilter(IFilter filter) {
-		super.setFilter(filter);
-		this.filter = filter;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessComponentItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessComponentItemProvider.java
deleted file mode 100644
index e28c96e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessComponentItemProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-
-/**
- * The item provider adapter for a process component in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessComponentItemProvider extends
-		org.eclipse.epf.library.edit.process.ProcessComponentItemProvider implements
-		IConfigurable, IStatefulItemProvider {
-
-	private IFilter filter;
-
-	public ProcessComponentItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-	}
-
-	public void setParent(Object parent) {
-	}
-
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (!filter.accept(child))
-				iter.remove();
-		}
-		return children;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessPackageItemProvider.java
deleted file mode 100644
index deb2b08..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessPackageItemProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-
-/**
- * The item provider adapter for a process package in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessPackageItemProvider extends
-		org.eclipse.epf.library.edit.navigator.ProcessPackageItemProvider implements
-		IConfigurable {
-
-	private IFilter filter;
-
-	//private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 */
-	public ProcessPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = getChildrenIncludingEmptyObjects(object);
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			if (isEmptyPackage(iter.next())) {
-				iter.remove();
-			}
-		}
-		return children;
-	}
-
-	private Collection getChildrenIncludingEmptyObjects(Object object) {
-		ArrayList col = new ArrayList();
-		Collection children = super.getChildren(object);
-		if (filter != null) {
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				Object child = element;
-				if (element instanceof ProcessComponent) {
-					child = ((ProcessComponent) element).getProcess();
-				}
-				if (!filter.accept(child)) {
-					iter.remove();
-				} else {
-					col.add(child);
-				}
-			}
-		}
-		return col;
-	}
-
-	/**
-	 * @param object
-	 * @return
-	 */
-	private boolean isEmptyPackage(Object object) {
-		if (object instanceof ProcessComponent
-				|| !(object instanceof ProcessPackage))
-			return false;
-		Collection children = this.getChildrenIncludingEmptyObjects(object);
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			if (!isEmptyPackage(iter.next())) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	// private boolean anyProcessComponent(Object parentProcesPackage) {
-	// List list = ((ProcessPackage) parentProcesPackage).getProcessElements();
-	// for (Iterator itor = list.iterator(); itor.hasNext();) {
-	// Object obj = itor.next();
-	// if (obj instanceof ProcessComponent) {
-	// if (filter.accept(obj))
-	// return true;
-	// }
-	// }
-	// return false;
-	// }
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-	}
-
-	public void setParent(Object parent) {
-		//this.parent = parent;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessesItemProvider.java
deleted file mode 100644
index f7324d5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessesItemProvider.java
+++ /dev/null
@@ -1,145 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.element.IElementItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Processes" folder in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class ProcessesItemProvider extends ItemProviderAdapter implements
-		ITreeItemContentProvider, IEditingDomainItemProvider,
-		IItemLabelProvider, IItemPropertySource,
-		IStructuredItemContentProvider, IElementItemProvider, IGroupContainer,
-		IConfigurable {
-
-	private Map groupItemProviderMap;
-
-	protected ArrayList children;
-
-	protected MethodPlugin plugin;
-
-	private IFilter filter;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public ProcessesItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * @param adapterFactory
-	 * @param MethodPlugin
-	 * @param ModelStructure
-	 * 
-	 * Plugin is required to pass, used in finding MethodPackage for particular
-	 * ModelStructure, ModelStructure is optional.
-	 */
-	public ProcessesItemProvider(AdapterFactory adapterFactory,
-			MethodPlugin plugin) {
-		super(adapterFactory);
-		this.plugin = plugin;
-	}
-
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-			groupItemProviderMap = new HashMap();
-			String[] names = new String[] {
-					LibraryEditPlugin.INSTANCE
-							.getString("_UI_CapabilityPatterns_text"), //$NON-NLS-1$
-					LibraryEditPlugin.INSTANCE
-							.getString("_UI_DeliveryProcesses_text"), //$NON-NLS-1$
-					LibraryEditPlugin.INSTANCE
-							.getString("_UI_ProcessContributions_text") }; //$NON-NLS-1$
-			String[][] processPaths = new String[][] {
-					ModelStructure.DEFAULT.capabilityPatternPath,
-					ModelStructure.DEFAULT.deliveryProcessPath,
-					ModelStructure.DEFAULT.processContributionPath };
-			for (int i = 0; i < processPaths.length; i++) {
-				ProcessPackage pkg1 = (ProcessPackage) UmaUtil
-						.findMethodPackage(plugin, processPaths[i]);
-				if (pkg1 != null) {
-					Object image = UmaEditPlugin.getPlugin().getImage(
-							"full/obj16/ProcessComponent"); //$NON-NLS-1$
-					CategorizedProcessesItemProvider itemProvider = new CategorizedProcessesItemProvider(
-							adapterFactory, pkg1, names[i], image);
-					itemProvider.setFilter(filter);
-					children.add(itemProvider);
-				}
-			}
-
-		}
-
-		return children;
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Processes"); //$NON-NLS-1$
-	}
-
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Processes_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
-	 */
-	public Object getGroupItemProvider(String name) {
-		return groupItemProviderMap.get(name);
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-	}
-
-	public void setParent(Object parent) {
-	}
-
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return Collections.EMPTY_LIST;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/RoleSetGroupingItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/RoleSetGroupingItemProvider.java
deleted file mode 100644
index 3939c0c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/RoleSetGroupingItemProvider.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the "Role Sets" folders in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class RoleSetGroupingItemProvider extends
-		org.eclipse.epf.uma.provider.RoleSetGroupingItemProvider implements
-		IConfigurable, ILibraryItemProvider, IStatefulItemProvider {
-
-	private IFilter filter;
-
-	private IConfigurator configurator;
-
-	private Object parent;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public RoleSetGroupingItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getRoleSetGrouping_RoleSets());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children;
-		Object parent = getParent(object);
-		if (parent instanceof CategoriesItemProvider) {
-
-			// TODO: commented out until Jinhua fixed bugs in
-			// ConfigurationFilter
-			if (configurator != null) {
-				children = configurator.getChildren(object,
-						UmaPackage.eINSTANCE.getRoleSetGrouping_RoleSets());
-				if (children != null) {
-					System.out
-							.println("RoleSetGroupingItemProvider.getChildren(): returned from configurator: " + children); //$NON-NLS-1$
-					return children;
-				}
-			}
-
-			children = super.getChildren(object);
-			RoleSetGrouping grouping = (RoleSetGrouping) object;
-			MethodConfiguration methodConf = (MethodConfiguration) ((CategoriesItemProvider) getParent(object))
-					.getTarget();
-			TngUtil.addExtendedChildren(grouping, methodConf, children,
-					ModelStructure.DEFAULT.roleSetPath);
-
-			// set parent
-			//
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object adapter = adapterFactory.adapt(iter.next(),
-						ITreeItemContentProvider.class);
-				if (adapter instanceof ILibraryItemProvider) {
-					((ILibraryItemProvider) adapter).setParent(this);
-				}
-			}
-
-			return children;
-		} else {
-			Collection childrenCol = super.getChildren(object);
-			for (Iterator iter = childrenCol.iterator(); iter.hasNext();) {
-				Object child = iter.next();
-				ItemProviderAdapter contentAdapter = (ItemProviderAdapter) adapterFactory
-						.adapt(child, ITreeItemContentProvider.class);
-				if (contentAdapter instanceof ILibraryItemProvider) {
-					((ILibraryItemProvider) contentAdapter).setParent(object);
-				}
-				if (filter != null)
-					if (!filter.accept(child))
-						iter.remove();
-			}
-			return childrenCol;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
-	 */
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	public Object getParent(Object object) {
-		if (parent != null) {
-			return parent;
-		}
-		// if(object instanceof EObject) {
-		// MethodPlugin plugin = UmaUtil.getMethodPlugin((EObject) object);
-		// if(plugin != null) {
-		// String[] path = {
-		// TngEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-		// ,TngEditPlugin.INSTANCE.getString("_UI_Standard_Categories_group")
-		// //$NON-NLS-1$
-		// ,TngEditPlugin.INSTANCE.getString("_UI_Role_Sets_group")
-		// //$NON-NLS-1$
-		// };
-		// Object adapter =
-		// TngAdapterFactory.INSTANCE.getItemsFilter_AdapterFactory(filter).adapt(plugin,
-		// ITreeItemContentProvider.class);
-		// // IGroupContainer groups = (IGroupContainer)
-		// TngAdapterFactory.INSTANCE.getItemsFilter_AdapterFactory(filter).adapt(plugin,
-		// ITreeItemContentProvider.class);
-		// // int i;
-		// // for(i = 0; i < path.length - 1; i++) {
-		// // groups = (IGroupContainer) groups.getGroupItemProvider(path[i]);
-		// // if(groups == null) return null;
-		// // }
-		// // return (ItemProviderAdapter) groups.getGroupItemProvider(path[i]);
-		// return TngUtil.getAdapter(plugin, path);
-		// //return adapter;
-		// }
-		// }
-
-		return super.getParent(object);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/RoleSetItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/RoleSetItemProvider.java
deleted file mode 100644
index 0b1e38d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/RoleSetItemProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.configuration.CategoriesItemProvider;
-
-/**
- * The item provider adapter for a role set in the method element
- * selection dialogs.
- * 
- * @author Shashidhar Kannoori
- * @since 1.0
- */
-public class RoleSetItemProvider extends
-		org.eclipse.epf.library.edit.configuration.RoleSetItemProvider implements
-		IConfigurable, ILibraryItemProvider {
-
-	private IFilter filter;
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 */
-	public RoleSetItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public Collection getChildren(Object object) {
-		Collection col = Collections.EMPTY_LIST;
-		Object parent = getParent(getParent(object));
-		if (parent instanceof CategoriesItemProvider) {
-			col = super.getChildren(object);
-			if (filter != null) {
-				FilterUtil.iterateCollection(col, filter);
-			}
-		} else {
-			// col = super.getChildren(object);
-			if (filter instanceof IAllFilter
-					|| filter instanceof ICategoryFilter) {
-				return col;
-			}
-			// ItemProviderAdapter adapter =
-			// (ItemProviderAdapter)(TngAdapterFactory.INSTANCE).getNavigatorView_ComposedAdapterFactory()
-			// .adapt(object, ITreeItemContentProvider.class);
-			// col = adapter.getChildren(object);
-		}
-		return col;
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	public void setLabel(String label) {
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-		super.setParent(parent);
-	}
-
-	public Object getParent(Object object) {
-		return parent;
-		// return super.getParent(object);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/VariabilityBaseElementFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/VariabilityBaseElementFilter.java
deleted file mode 100644
index 4b72290..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/VariabilityBaseElementFilter.java
+++ /dev/null
@@ -1,208 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.library.edit.itemsfilter;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * This is a filter for variability base element selection. The filter will
- * check if object can be accepted as the base element of the filter owner.
- * 
- * Filter rules:
- * 
- * 1. The element itself and it's generalizers (contributor, replacer, or
- * extender) should be filtered out
- * 2. Any elements in the containment chain of the above, should be filtered
- * out
- * 3. if any of the base elements can't be selected, then this element can't
- * be selected.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class VariabilityBaseElementFilter implements
-		org.eclipse.epf.library.edit.IFilter {
-
-	private VariabilityElement element;
-
-	private List badguys = new ArrayList();
-
-	public VariabilityBaseElementFilter(VariabilityElement element) {
-		this.element = element;
-
-		// first of all, you can't vary yourself
-		badguys.add(element);
-
-		// get all my generalizers
-		Iterator it = TngUtil.getGeneralizers(element);
-		while (it.hasNext()) {
-			VariabilityElement ve = (VariabilityElement) it.next();
-			badguys.add(ve);
-
-			// the containment chain on my generalizers can't be my base
-			handleContainmentChain(ve);
-		}
-
-		// element's in my chain can't be my base
-		handleContainmentChain(element);
-	}
-
-	private void handleContainmentChain(VariabilityElement e) {
-		if (!hasContainmentFeature()) {
-			return;
-		}
-
-		if (e instanceof CustomCategory) {
-			List roots = new ArrayList();
-			loadRootCustomCategories((CustomCategory) e, roots);
-			badguys.addAll(roots);
-		} else if (e instanceof Deliverable) {
-			List roots = new ArrayList();
-			deliverableParts((Deliverable) e, roots);
-			badguys.addAll(roots);
-		} else {
-			// if the element has containment feature,
-			// you can't select the element in the containment chain
-			EObject root = getChainRoot(e);
-			if (!badguys.contains(root)) {
-				badguys.add(root);
-			}
-
-			/*
-			 * hold off for now // also only one element in a chain can be
-			 * selected as base // so get all the base elements in the element
-			 * chain, and block the element chain of the base elements
-			 * filterUsedBaseChain((VariabilityElement)root); for (Iterator it =
-			 * root.eAllContents(); it.hasNext(); ) { Object o = it.next(); if (
-			 * o.getClass().isInstance(element) ) {
-			 * filterUsedBaseChain((VariabilityElement)o); } }
-			 */
-		}
-
-	}
-
-	private void deliverableParts(Deliverable e, List roots) {
-		List list = ((Deliverable) e).getDeliveredWorkProducts();
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				Object obj = iterator.next();
-				if (obj instanceof Deliverable) {
-					roots.add(obj);
-					deliverableParts((Deliverable) obj, roots);
-				}
-			}
-		}
-	}
-
-	private void loadRootCustomCategories(CustomCategory e, List roots) {
-		List cs = AssociationHelper.getCustomCategories(e);
-		if (cs != null && cs.size() > 0) {
-			for (Iterator it = cs.iterator(); it.hasNext();) {
-				CustomCategory cc = (CustomCategory) it.next();
-				if (!TngUtil.isRootCustomCategory(cc)) {
-					loadRootCustomCategories(cc, roots);
-				} else {
-					if (!roots.contains(e)) {
-						roots.add(e);
-					}
-					break;
-				}
-			}
-		} else if (!roots.contains(e)) {
-			roots.add(e);
-		}
-	}
-
-	// private void filterUsedBaseChain(VariabilityElement e) {
-	// VariabilityElement base = e.getVariabilityBasedOnElement();
-	// if (base != null) {
-	// // if the element chain is selected as base in the current chain,
-	// // no element in that chain can be futher selected
-	// Object root = getChainRoot(base);
-	// if (!badguys.contains(root)) {
-	// badguys.add(root);
-	// }
-	// }
-	// }
-
-	private boolean hasContainmentFeature() {
-		return element instanceof Domain || element instanceof CustomCategory
-				|| element instanceof Artifact || element instanceof Practice
-				|| element instanceof Deliverable;
-	}
-
-	private EObject getChainRoot(MethodElement e) {
-		EObject root = e;
-		Object type = element.getType();
-		EObject parent = e;
-		while ((parent = parent.eContainer()) != null
-				&& ((MethodElement) parent).getType() == type) {
-			root = parent;
-		}
-
-		return root;
-	}
-
-	public boolean accept(Object obj) {
-
-		// always accept packages
-		if (obj instanceof MethodLibrary || obj instanceof MethodPlugin
-				|| obj instanceof MethodPackage
-				|| obj instanceof MethodConfiguration) {
-			return true;
-		}
-
-		// must be variability element and can't be itself
-		if (obj == element || !(obj instanceof VariabilityElement)) {
-			return false;
-		}
-
-		// must be the same type
-		VariabilityElement ve = (VariabilityElement) obj;
-		if (ve.getType() != element.getType()) {
-			return false;
-		}
-
-		// can't be my any of my generalizers
-		if (badguys.contains(obj)) {
-			return false;
-		}
-
-		// if this element's base chain is a badguy, can't accept, otherwise, a
-		// circular lock
-		while ((ve = ve.getVariabilityBasedOnElement()) != null) {
-			if (badguys.contains(ve)) {
-				return false;
-			}
-		}
-		// anything else ?
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/package.html
deleted file mode 100644
index 93304c3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides item providers for displaying and filtering method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/AbstractProcessesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/AbstractProcessesItemProvider.java
deleted file mode 100644
index cb930be..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/AbstractProcessesItemProvider.java
+++ /dev/null
@@ -1,125 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeListenerWrapper;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.element.IElementItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-
-/**
- * The abstract base item provider adapter class for the "Processes" folder in
- * the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class AbstractProcessesItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IElementItemProvider, IGroupContainer {
-	protected Map groupItemProviderMap;
-
-	protected ModelStructure modelStruct;
-
-	protected ArrayList children;
-
-	protected static final boolean processContributionEnabled = false;
-
-	private IPropertyChangeListenerWrapper prefStoreListener;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public AbstractProcessesItemProvider(AdapterFactory adapterFactory,
-			ModelStructure modelStruct) {
-		super(adapterFactory);
-		this.modelStruct = modelStruct;
-
-		// final IPreferenceStore prefStore = Providers.getPreferenceStore();
-		// if (prefStore != null) {
-		// processContributionEnabled = prefStore
-		// .getBoolean(LibraryEditConstants.PREF_ENABLE_PROCESS_CONTRIBUTION);
-		// prefStoreListener = new IPropertyChangeListener() {
-		//
-		// public void propertyChange(PropertyChangeEvent event) {
-		// if (event.getProperty() ==
-		// LibraryEditConstants.PREF_ENABLE_PROCESS_CONTRIBUTION) {
-		// boolean newValue = prefStore.getBoolean(event
-		// .getProperty());
-		// if (processContributionEnabled != newValue) {
-		// processContributionEnabled = newValue;
-		// fireNotifyChanged(new ViewerNotification(
-		// new NotificationImpl(-1, -1, -1),
-		// AbstractProcessesItemProvider.this, true,
-		// false));
-		// }
-		// }
-		// }
-		//
-		// };
-		// prefStore.addPropertyChangeListener(prefStoreListener);
-		// }
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		IPreferenceStoreWrapper prefStore = Providers.getPreferenceStore();
-		if (prefStore != null && prefStoreListener != null) {
-			prefStore.removePropertyChangeListener(prefStoreListener);
-		}
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
-	 */
-	public Object getGroupItemProvider(String name) {
-		return groupItemProviderMap.get(name);
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Processes"); //$NON-NLS-1$
-	}
-
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Processes_group"); //$NON-NLS-1$
-	}
-
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return Collections.EMPTY_LIST;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/CapabilityPatternItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/CapabilityPatternItemProvider.java
deleted file mode 100644
index 4adcb68..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/CapabilityPatternItemProvider.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a capability pattern in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class CapabilityPatternItemProvider extends
-		org.eclipse.epf.uma.provider.CapabilityPatternItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CapabilityPatternItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-
-	}
-
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-
-	public String getText(Object object) {
-		return TngUtil
-				.getLabel(object, getString("_UI_CapabilityPattern_type")); //$NON-NLS-1$
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ConfigurationsItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ConfigurationsItemProvider.java
deleted file mode 100644
index 5dcbc75..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ConfigurationsItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.command.MethodElementCreateChildCommand;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the "Configurations" folder in the Library
- * view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationsItemProvider extends TransientGroupItemProvider {
-
-	// private MethodLibrary methodLibrary;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationsItemProvider(AdapterFactory adapterFactory,
-			MethodLibrary lib, String name) {
-		super(adapterFactory, lib, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getMethodLibrary_PredefinedConfigurations(),
-				UmaFactory.eINSTANCE.createMethodConfiguration()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodLibrary_PredefinedConfigurations());
-		}
-		return childrenFeatures;
-	}
-
-	protected boolean acceptAsChild(Object obj) {
-		return !(obj instanceof ProcessFamily);
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Configurations"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof MethodConfiguration) {
-			TngUtil.setDefaultName(((MethodLibrary) target)
-					.getPredefinedConfigurations(), (MethodElement) obj,
-					LibraryEditConstants.NEW_CONFIGURATION); 
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return MethodLibrary.class;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.TransientGroupItemProvider#createCreateChildCommand(org.eclipse.emf.edit.domain.EditingDomain, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int, java.util.Collection)
-	 */
-	protected Command createCreateChildCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value, int index, Collection collection) {
-		return new MethodElementCreateChildCommand(domain, (EObject) target,
-				feature, value, index, collection, this) {
-			/* (non-Javadoc)
-			 * @see org.eclipse.epf.library.edit.command.MethodElementCreateChildCommand#getValidator()
-			 */
-			protected IValidator getValidator() {
-				if(child instanceof MethodConfiguration) {
-					return IValidatorFactory.INSTANCE.createNameValidator(owner, (MethodConfiguration)child);
-				}
-				return super.getValidator();
-			}
-		};
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ContentItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ContentItemProvider.java
deleted file mode 100644
index 95cc11e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ContentItemProvider.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-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.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.category.StandardCategoriesItemProvider;
-import org.eclipse.epf.library.edit.element.IElementItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Method Content" folder in the Library
- * view.
- * <p>
- * This class will be renamed as "MethodContentItemProvider" in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ContentItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource,
-		IElementItemProvider, IGroupContainer {
-
-	protected MethodPlugin plugin;
-
-	protected ModelStructure modelStruct;
-
-	protected Map groupItemProviderMap;
-
-	protected ArrayList children;
-
-	protected ContentPackage coreContentPkg;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentItemProvider(AdapterFactory adapterFactory,
-			MethodPlugin plugin, ModelStructure modelStruct) {
-		super(adapterFactory);
-		this.plugin = plugin;
-		this.modelStruct = modelStruct;
-	}
-	
-	public ContentPackage getCoreContentPackage() {
-		return coreContentPkg;
-	}
-	
-	public Notifier getTarget() {
-		return coreContentPkg;
-	}
-
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-			groupItemProviderMap = new HashMap();
-			String name;
-			ILibraryItemProvider child;
-
-			// find core content package
-			ContentPackage contentPkg = UmaUtil.findContentPackage(plugin,
-					modelStruct.coreContentPath);
-			coreContentPkg = contentPkg;
-			if (contentPkg != null) {
-				name = LibraryEditPlugin.INSTANCE
-						.getString("_UI_MethodContent_group"); //$NON-NLS-1$
-				child = new MethodPackagesItemProvider(adapterFactory,
-						contentPkg, name);
-				child.setParent(this);
-				children.add(child);
-				groupItemProviderMap.put(name, child);
-
-				// contentPkg = UmaUtil.findContentPackage(plugin,
-				// modelStruct.disciplineDefinitionPath);
-				// if(contentPkg != null) {
-				// name =
-				// LibraryEditPlugin.INSTANCE.getString("_UI_Disciplines_group");
-				// child = new DisciplineCategoriesItemProvider(adapterFactory,
-				// contentPkg, name);
-				// child.setParent(this);
-				// children.add(child);
-				// groupItemProviderMap.put(name, child);
-				// }
-				//	        
-				// contentPkg = UmaUtil.findContentPackage(plugin,
-				// modelStruct.domainPath);
-				// if(contentPkg != null) {
-				// name =
-				// LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group");
-				// child = new DomainsItemProvider(adapterFactory, contentPkg,
-				// name);
-				// child.setParent(this);
-				// children.add(child);
-				// groupItemProviderMap.put(name, child);
-				// }
-				//	
-				// contentPkg = UmaUtil.findContentPackage(plugin,
-				// modelStruct.workProductTypePath);
-				// if(contentPkg != null) {
-				// name =
-				// LibraryEditPlugin.INSTANCE.getString("_UI_WorkProductTypes_group");
-				// child = new WorkProductTypesItemProvider(adapterFactory,
-				// contentPkg, name);
-				// child.setParent(this);
-				// children.add(child);
-				// groupItemProviderMap.put(name, child);
-				// }
-				//	        
-				// contentPkg = UmaUtil.findContentPackage(plugin,
-				// modelStruct.roleSetPath);
-				// if(contentPkg != null) {
-				// name =
-				// LibraryEditPlugin.INSTANCE.getString("_UI_Role_Sets_group");
-				// child = new RoleSetsItemProvider(adapterFactory, contentPkg,
-				// name);
-				// child.setParent(this);
-				// children.add(child);
-				// groupItemProviderMap.put(name, child);
-				// }
-				//	        
-				// contentPkg = UmaUtil.findContentPackage(plugin,
-				// modelStruct.toolPath);
-				// if(contentPkg != null) {
-				// name =
-				// LibraryEditPlugin.INSTANCE.getString("_UI_Tools_group");
-				// child = new ToolsItemProvider(adapterFactory, contentPkg,
-				// name);
-				// child.setParent(this);
-				// children.add(child);
-				// groupItemProviderMap.put(name, child);
-				// }
-
-				// create the standard categories folder
-				contentPkg = UmaUtil.findContentPackage(plugin,
-						modelStruct.standardCategoryPath);
-				if (contentPkg != null) {
-					name = LibraryEditPlugin.INSTANCE
-							.getString("_UI_Standard_Categories_group"); //$NON-NLS-1$
-					child = new StandardCategoriesItemProvider(adapterFactory,
-							contentPkg, name);
-					child.setParent(this);
-					children.add(child);
-					groupItemProviderMap.put(name, child);
-				}
-
-				// create the custome categories folder
-				// contentPkg = UmaUtil.findContentPackage(plugin,
-				// modelStruct.customCategoryPath);
-				// if(contentPkg != null) {
-				// name =
-				// LibraryEditPlugin.INSTANCE.getString("_UI_Custom_Categories_group");
-				// child = new CustomCategoriesItemProvider(adapterFactory,
-				// contentPkg, name);
-				// child.setParent(this);
-				// children.add(child);
-				// groupItemProviderMap.put(name, child);
-				// }
-
-				CustomCategory rootCustomCategory = TngUtil
-						.getRootCustomCategory(plugin);
-				if (rootCustomCategory != null) {
-					boolean notify = rootCustomCategory.eDeliver();
-					try {
-						rootCustomCategory.eSetDeliver(false);
-						rootCustomCategory.setName(LibraryEditPlugin.INSTANCE
-								.getString("_UI_Custom_Categories_group")); //$NON-NLS-1$
-					} finally {
-						rootCustomCategory.eSetDeliver(notify);
-					}
-					children.add(rootCustomCategory);
-				}
-
-				// IConfigurable adapter = (IConfigurable)
-				// TngUtil.getBestAdapterFactory(adapterFactory).adapt(contentPkg,
-				// ITreeItemContentProvider.class);
-				// adapter.setLabel(LibraryEditPlugin.INSTANCE.getString("_UI_MethodContent_group"));
-				// children.add(contentPkg);
-			}
-		}
-
-		return children;
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Content"); //$NON-NLS-1$
-	}
-
-	public String getText(Object object) {
-		return LibraryEditPlugin.INSTANCE.getString("_UI_Content_group"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
-	 */
-	public Object getGroupItemProvider(String name) {
-		return groupItemProviderMap != null ? groupItemProviderMap.get(name)
-				: null;
-	}
-
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return Collections.EMPTY_LIST;
-	}
-
-	public Object getParent(Object object) {
-		return plugin;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (groupItemProviderMap != null) {
-			for (Iterator iter = groupItemProviderMap.values().iterator(); iter
-					.hasNext();) {
-				Object adapter = iter.next();
-				if (adapter instanceof IDisposable) {
-					((IDisposable) adapter).dispose();
-				}
-			}
-			groupItemProviderMap.clear();
-			groupItemProviderMap = null;
-		}
-		if(children != null) {
-			children.clear();
-		}
-		plugin = null;
-		coreContentPkg = null;
-		
-		super.dispose();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/DeliveryProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/DeliveryProcessItemProvider.java
deleted file mode 100644
index 729cfa4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/DeliveryProcessItemProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a delivery process in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class DeliveryProcessItemProvider extends
-		org.eclipse.epf.uma.provider.DeliveryProcessItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DeliveryProcessItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-
-	}
-
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_DeliveryProcess_type")); //$NON-NLS-1$
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ItemProviderAdapterFactory.java
deleted file mode 100644
index 1238eea..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,767 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IReferencer;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.breakdownelement.ActivityItemProvider;
-import org.eclipse.epf.library.edit.breakdownelement.MilestoneItemProvider;
-import org.eclipse.epf.library.edit.category.CustomCategoryItemProvider;
-import org.eclipse.epf.library.edit.category.DisciplineCategoryItemProvider;
-import org.eclipse.epf.library.edit.category.DisciplineItemProvider;
-import org.eclipse.epf.library.edit.category.DomainItemProvider;
-import org.eclipse.epf.library.edit.category.RoleSetCategoryItemProvider;
-import org.eclipse.epf.library.edit.category.RoleSetItemProvider;
-import org.eclipse.epf.library.edit.category.ToolItemProvider;
-import org.eclipse.epf.library.edit.category.WorkProductTypeItemProvider;
-import org.eclipse.epf.library.edit.element.ArtifactItemProvider;
-import org.eclipse.epf.library.edit.element.ContentDescriptionItemProvider;
-import org.eclipse.epf.library.edit.element.ContentPackageItemProvider;
-import org.eclipse.epf.library.edit.element.GuidanceItemProvider;
-import org.eclipse.epf.library.edit.element.RoleItemProvider;
-import org.eclipse.epf.library.edit.element.SectionItemProvider;
-import org.eclipse.epf.library.edit.element.TaskItemProvider;
-import org.eclipse.epf.library.edit.element.WorkProductItemProvider;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory;
-
-/**
- * The item provider adapter factory for the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ItemProviderAdapterFactory extends UmaItemProviderAdapterFactory
-		implements IReferencer {
-
-	protected WorkProductItemProvider workProductItemProvider;
-
-	protected ArtifactItemProvider myArtifactItemProvider;
-
-	protected GuidanceItemProvider guidanceItemProvider;
-
-	protected WorkProductItemProvider myOutcomeItemProvider;
-
-	protected WorkProductItemProvider myDeliverableItemProvider;
-
-	/**
-	 * References to stateful adapters created by this adapter factory
-	 */
-	protected Set disposableAdapters = new HashSet();
-
-	// protected Collection adapters = new ArrayList();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#adapt(org.eclipse.emf.common.notify.Notifier,
-	 *      java.lang.Object)
-	 */
-	public Adapter adapt(Notifier notifier, Object type) {
-		Adapter adapter = super.adapt(notifier, type);
-		if (adapter instanceof IStatefulItemProvider
-				&& notifier instanceof EObject
-				&& ((EObject) notifier).eContainer() != null) {
-			disposableAdapters.add(adapter);
-		}
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.CorecontentAdapterFactory#createRoleAdapter()
-	 */
-	public Adapter createRoleAdapter() {
-		if (roleItemProvider == null) {
-			roleItemProvider = new RoleItemProvider(this);
-		}
-		return roleItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.CorecontentAdapterFactory#createTaskAdapter()
-	 */
-	public Adapter createTaskAdapter() {
-		if (taskItemProvider == null) {
-			taskItemProvider = new TaskItemProvider(this);
-		}
-
-		return taskItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.WorkproductsAdapterFactory#createArtifactAdapter()
-	 */
-	public Adapter createArtifactAdapter() {
-		if (myArtifactItemProvider == null) {
-			myArtifactItemProvider = new ArtifactItemProvider(this);
-		}
-
-		return myArtifactItemProvider;
-	}
-
-	public Adapter createWorkProductAdapter() {
-		if (workProductItemProvider == null) {
-			workProductItemProvider = new WorkProductItemProvider(this);
-		}
-		return workProductItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.WorkproductsAdapterFactory#createDeliverableAdapter()
-	 */
-	public Adapter createDeliverableAdapter() {
-		if (myDeliverableItemProvider == null) {
-			myDeliverableItemProvider = new WorkProductItemProvider(this,
-					(ItemProviderAdapter) super.createDeliverableAdapter());
-		}
-
-		return myDeliverableItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.WorkproductsAdapterFactory#createOutcomeAdapter()
-	 */
-	public Adapter createOutcomeAdapter() {
-		if (myOutcomeItemProvider == null) {
-			myOutcomeItemProvider = new WorkProductItemProvider(this,
-					(ItemProviderAdapter) super.createOutcomeAdapter());
-		}
-
-		return myOutcomeItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createMethodConfigurationAdapter()
-	 */
-	public Adapter createMethodConfigurationAdapter() {
-		if (methodConfigurationItemProvider == null) {
-			methodConfigurationItemProvider = new MethodConfigurationItemProvider(
-					this);
-		}
-
-		return methodConfigurationItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createMethodLibraryAdapter()
-	 */
-	public Adapter createMethodLibraryAdapter() {
-		Adapter adapter = new MethodLibraryItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createProcessFamilyAdapter()
-	 */
-	/*
-	public Adapter createProcessFamilyAdapter() {
-		if (processFamilyItemProvider == null) {
-			processFamilyItemProvider = new ProcessFamilyItemProvider(this);
-		}
-
-		return processFamilyItemProvider;
-	}
-	*/
-
-	public Adapter createContentPackageAdapter() {
-		Adapter adapter = new ContentPackageItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	public Adapter createMethodPluginAdapter() {
-		MethodPluginItemProvider adapter = new MethodPluginItemProvider(this);
-		adapter.setModelStructure(ModelStructure.DEFAULT);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.MethodmodelsAdapterFactory#createProcessComponentAdapter()
-	 */
-	public Adapter createProcessComponentAdapter() {
-		if (processComponentItemProvider == null) {
-			processComponentItemProvider = new ProcessComponentItemProvider(
-					this);
-		}
-
-		return processComponentItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.MethodmodelsAdapterFactory#createProcessPackageAdapter()
-	 */
-	public Adapter createProcessPackageAdapter() {
-		Adapter adapter = new ProcessPackageItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.ContentcategoriesAdapterFactory#createDisciplineGroupingAdapter()
-	 */
-	public Adapter createDisciplineGroupingAdapter() {
-		if (disciplineGroupingItemProvider == null) {
-			disciplineGroupingItemProvider = new DisciplineCategoryItemProvider(
-					this);
-		}
-		return disciplineGroupingItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.ContentcategoriesAdapterFactory#createDomainAdapter()
-	 */
-	public Adapter createDomainAdapter() {
-		if (domainItemProvider == null) {
-			domainItemProvider = new DomainItemProvider(this);
-		}
-
-		return domainItemProvider;
-	}
-
-	public Adapter createRoleSetGroupingAdapter() {
-		Adapter adapter = new RoleSetCategoryItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.ContentcategoriesAdapterFactory#createDisciplineAdapter()
-	 */
-	public Adapter createDisciplineAdapter() {
-		// if (disciplineItemProvider == null) {
-		// disciplineItemProvider = new DisciplineItemProvider(this);
-		// }
-		//
-		// return disciplineItemProvider;
-
-		Adapter adapter = new DisciplineItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.ContentcategoriesAdapterFactory#createRoleSetAdapter()
-	 */
-	public Adapter createRoleSetAdapter() {
-		// if (roleSetItemProvider == null) {
-		// roleSetItemProvider = new RoleSetItemProvider(this);
-		// }
-		//
-		// return roleSetItemProvider;
-
-		Adapter adapter = new RoleSetItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ContentcategoriesItemProviderAdapterFactory#createToolAdapter()
-	 */
-	public Adapter createToolAdapter() {
-		Adapter adapter = new ToolItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ContentcategoriesItemProviderAdapterFactory#createWorkProductTypeAdapter()
-	 */
-	public Adapter createWorkProductTypeAdapter() {
-		Adapter adapter = new WorkProductTypeItemProvider(this);
-		// adapters.add(adapter);
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.UmaAdapterFactory#createGuidanceAdapter()
-	 */
-	public Adapter createGuidanceAdapter() {
-		if (guidanceItemProvider == null) {
-			guidanceItemProvider = new GuidanceItemProvider(this);
-		}
-		return guidanceItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createChecklistAdapter()
-	 */
-	public Adapter createChecklistAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createConceptAdapter()
-	 */
-	public Adapter createConceptAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createEstimateAdapter()
-	 */
-	public Adapter createEstimateAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createEstimationConsiderations
-	 *      Adapter()
-	 */
-	public Adapter createEstimationConsiderationsAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createEstimatingMetricAdapter()
-	 */
-	public Adapter createEstimatingMetricAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createExampleAdapter()
-	 */
-	public Adapter createExampleAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createPracticeAdapter()
-	 */
-	public Adapter createPracticeAdapter() {
-		if (practiceItemProvider == null) {
-			practiceItemProvider = new PracticeItemProvider(this);
-		}
-		return practiceItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createReportAdapter()
-	 */
-	public Adapter createReportAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createRoadmapAdapter()
-	 */
-	public Adapter createRoadmapAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createReusableAssetAdapter()
-	 */
-	public Adapter createReusableAssetAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createSupportingMaterialAdapter()
-	 */
-	public Adapter createSupportingMaterialAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createTechniqueAdapter()
-	 */
-	public Adapter createTechniqueAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createTemplateAdapter()
-	 */
-	public Adapter createTemplateAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createTermDefinitionAdapter()
-	 */
-	public Adapter createTermDefinitionAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createToolMentorAdapter()
-	 */
-	public Adapter createToolMentorAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createWorkProductGuidelineAdapter()
-	 */
-	public Adapter createWorkProductGuidelineAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	public Adapter createSectionAdapter() {
-		if (sectionItemProvider == null) {
-			sectionItemProvider = new SectionItemProvider(this);
-		}
-
-		return sectionItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createCustomCategoryAdapter()
-	 */
-	public Adapter createCustomCategoryAdapter() {
-		if (customCategoryItemProvider == null) {
-			customCategoryItemProvider = new CustomCategoryItemProvider(this);
-		}
-
-		return customCategoryItemProvider;
-	}
-
-	public Adapter createWhitepaperAdapter() {
-		// if (whitepaperItemProvider == null) {
-		// whitepaperItemProvider = new WhitepaperItemProvider(this);
-		// }
-		//
-		// return whitepaperItemProvider;
-
-		return createGuidanceAdapter();
-	}
-
-	public Adapter createCapabilityPatternAdapter() {
-		if (capabilityPatternItemProvider == null) {
-			capabilityPatternItemProvider = new CapabilityPatternItemProvider(
-					this);
-		}
-
-		return capabilityPatternItemProvider;
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		if (deliveryProcessItemProvider == null) {
-			deliveryProcessItemProvider = new DeliveryProcessItemProvider(this);
-		}
-
-		return deliveryProcessItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createGuidelineAdapter()
-	 */
-	public Adapter createGuidelineAdapter() {
-		return createGuidanceAdapter();
-	}
-
-	public Adapter createContentDescriptionAdapter() {
-		if (contentDescriptionItemProvider == null) {
-			contentDescriptionItemProvider = new ContentDescriptionItemProvider(
-					this);
-		}
-
-		return contentDescriptionItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createActivityDescriptionAdapter()
-	 */
-	public Adapter createActivityDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createArtifactDescriptionAdapter()
-	 */
-	public Adapter createArtifactDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createBreakdownElementDescriptionAdapter()
-	 */
-	public Adapter createBreakdownElementDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createDeliverableDescriptionAdapter()
-	 */
-	public Adapter createDeliverableDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createDeliveryProcessDescriptionAdapter()
-	 */
-	public Adapter createDeliveryProcessDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createDescriptorDescriptionAdapter()
-	 */
-	public Adapter createDescriptorDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createGuidanceDescriptionAdapter()
-	 */
-	public Adapter createGuidanceDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createPracticeDescriptionAdapter()
-	 */
-	public Adapter createPracticeDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createProcessDescriptionAdapter()
-	 */
-	public Adapter createProcessDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createRoleDescriptionAdapter()
-	 */
-	public Adapter createRoleDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createTaskDescriptionAdapter()
-	 */
-	public Adapter createTaskDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createWorkProductDescriptionAdapter()
-	 */
-	public Adapter createWorkProductDescriptionAdapter() {
-		return createContentDescriptionAdapter();
-	}
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Milestone}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMilestoneAdapter() {
-		if (milestoneItemProvider == null) {
-			milestoneItemProvider = new MilestoneItemProvider(this);
-		}
-		return milestoneItemProvider;
-	}
-	
-	@Override
-	public Adapter createActivityAdapter() {
-		return new ActivityItemProvider(this);
-	}
-	@Override
-	public Adapter createPhaseAdapter() {
-		return new ActivityItemProvider(this);
-	}
-	@Override
-	public Adapter createIterationAdapter() {
-		return createActivityAdapter();
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#dispose()
-	 */
-	public void dispose() {
-		if (guidanceItemProvider != null) {
-			guidanceItemProvider.dispose();
-			guidanceItemProvider = null;
-		}
-		if (myArtifactItemProvider != null) {
-			myArtifactItemProvider.dispose();
-			myArtifactItemProvider = null;
-		}
-		if (myDeliverableItemProvider != null) {
-			myDeliverableItemProvider.dispose();
-			myDeliverableItemProvider = null;
-		}
-		if (myOutcomeItemProvider != null) {
-			myOutcomeItemProvider.dispose();
-			myOutcomeItemProvider = null;
-		}
-		if (workProductItemProvider != null) {
-			workProductItemProvider.dispose();
-			workProductItemProvider = null;
-		}
-
-		// for (Iterator iter = new ArrayList(adapters).iterator();
-		// iter.hasNext();) {
-		// Object adapter = iter.next();
-		// if(adapter instanceof IDisposable) {
-		// ((IDisposable)adapter).dispose();
-		// }
-		// }
-		// adapters.clear();
-
-		if (!disposableAdapters.isEmpty()) {
-			for (Iterator iter = disposableAdapters.iterator(); iter.hasNext();) {
-				IDisposable adapter = (IDisposable) iter.next();
-				adapter.dispose();
-			}
-			disposableAdapters.clear();
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IReferencer#remove(java.lang.Object)
-	 */
-	public boolean remove(Object ref) {
-		return disposableAdapters.remove(ref);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.IReferencer#cleanUp()
-	 */
-	public void cleanUp() {
-		ArrayList adaptersToRemove = new ArrayList();
-		for (Iterator iter = new ArrayList(disposableAdapters).iterator(); iter
-				.hasNext();) {
-			Adapter adapter = (Adapter) iter.next();
-			if (adapter instanceof IStatefulItemProvider
-					&& adapter.getTarget() == null) {
-				adaptersToRemove.add(adapter);
-			}
-		}
-		if (TngUtil.DEBUG) {
-			System.out
-					.println("ItemProviderAdapterFactory.cleanUp(): number of adapters to remove: " //$NON-NLS-1$
-							+ adaptersToRemove.size());
-		}
-		disposableAdapters.removeAll(adaptersToRemove);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodConfigurationItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodConfigurationItemProvider.java
deleted file mode 100644
index 7ca5299..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodConfigurationItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a method configuration in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodConfigurationItemProvider extends
-		org.eclipse.epf.uma.provider.MethodConfigurationItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodConfigurationItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		Object parent = super.getParent(object);
-		if (parent instanceof EObject) {
-			EObject lib = (EObject) parent;
-			if (lib == null)
-				return null;
-			MethodLibraryItemProvider itemProvider = (MethodLibraryItemProvider) TngUtil
-					.getAdapter(lib, MethodLibraryItemProvider.class);
-			return itemProvider != null ? itemProvider.getConfigurations()
-					: null;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object,
-				getString("_UI_MethodConfiguration_type")); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.provider.MethodConfigurationItemProvider#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return getResourceLocator().getImage("full/obj16/MethodConfiguration"); //$NON-NLS-1$
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.MethodConfigurationItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		TngUtil.refreshParentIfNameChanged(notification, this);
-
-		super.notifyChanged(notification);
-	}
-
-	@Override
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodLibraryItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodLibraryItemProvider.java
deleted file mode 100644
index 5b9e7ba..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodLibraryItemProvider.java
+++ /dev/null
@@ -1,280 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PluginUIPackageContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.PluginUIPackagesMap;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.provider.MethodPluginItemProvider;
-
-/**
- * The item provider adapter for a method library.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodLibraryItemProvider extends
-		org.eclipse.epf.uma.provider.MethodLibraryItemProvider {
-
-	private ConfigurationsItemProvider configurations;
-	
-	private Map<String, PluginUIPackagesItemProvider> pluginPackagesItemProvidersMap = new HashMap<String, PluginUIPackagesItemProvider>();
-	
-
-	//private ProcessFamiliesItemProvider procFamilies;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodLibraryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodLibrary_MethodPlugins());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getMethodLibrary_MethodPlugins(), UmaFactory.eINSTANCE
-				.createMethodPlugin()));
-	}
-
-	public Collection getChildren(Object object) {
-		List children;
-		if (object instanceof MethodLibrary && !PluginUIPackageContext.INSTANCE.isFlatLayout()) {
-			children = new ArrayList();
-			List<MethodPlugin> plugins = getMethodPlugins((MethodLibrary)object);
-			addChildren(children, plugins, object);
-			Collections.sort(children, Comparators.PLUGINPACKAGE_COMPARATOR);
-		} else { 
-			Collection collection = super.getChildren(object);
-			if (collection instanceof List) {
-				children = (List) collection;
-			} else {
-				children = new ArrayList(collection);
-			}
-			// set parents
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object adapter = adapterFactory.adapt(iter.next(),
-						ITreeItemContentProvider.class);
-				if (adapter instanceof ILibraryItemProvider) {
-					((ILibraryItemProvider) adapter).setParent(this);
-				}
-			}
-			
-			Collections.sort(children, Comparators.PLUGINPACKAGE_COMPARATOR);
-		}
-		if (configurations == null) {
-			configurations = new ConfigurationsItemProvider(adapterFactory,
-					(MethodLibrary) object, LibraryEditPlugin.INSTANCE
-							.getString("_UI_Configurations_text")); //$NON-NLS-1$
-		}
-		children.add(configurations);
-
-		// Remove 'Process Families' until it is fully implemented
-		//
-		// if(procFamilies == null) {
-		// procFamilies = new ProcessFamiliesItemProvider(adapterFactory,
-		// (MethodLibrary) object,
-		// LibraryEditPlugin.INSTANCE.getString("_UI_ProcessFamilies_text"));
-		// }
-		// children.add(procFamilies);
-		
-
-		return children;
-	}
-	
-	private void addChildren(Collection children, List<MethodPlugin> plugins, Object parent) {
-		PluginUIPackagesMap map = new PluginUIPackagesMap();
-		for (Iterator<MethodPlugin> iter = plugins.iterator();iter.hasNext();) {
-			MethodPlugin plugin = iter.next();
-			String pluginName = plugin.getName();
-			int dotIdx = pluginName.indexOf(PluginUIPackagesItemProvider.PACKAGE_SEPARATOR);
-			if (dotIdx != -1) {
-				map.add(pluginName.substring(0, dotIdx), plugin);
-			} else {
-				children.add(plugin);
-				Object adapter = adapterFactory.adapt(plugin,
-						ITreeItemContentProvider.class);
-				if (adapter instanceof ILibraryItemProvider) {
-					((ILibraryItemProvider) adapter).setParent(this);
-				}
-			}
-		}
-		Collection<String> existingNames = new HashSet<String>();
-		for (Iterator<Map.Entry<String, Set<MethodPlugin>>> iter = map.entrySet().iterator();iter.hasNext();) {
-			Map.Entry<String, Set<MethodPlugin>> entry = iter.next();
-			String name = entry.getKey();
-			Set<MethodPlugin> plugSet = entry.getValue();
-			PluginUIPackagesItemProvider provider = pluginPackagesItemProvidersMap.get(name);
-			if (provider == null) {
-				provider = new PluginUIPackagesItemProvider(adapterFactory, name, plugSet);
-				pluginPackagesItemProvidersMap.put(name, provider);
-			} else {
-				provider.setPlugins(plugSet);
-			}
-			existingNames.add(name);
-			provider.setParent(parent);
-			children.add(provider);
-		}
-		retainPluginPackagesItemProviders(existingNames);
-	}
-	
-	private void retainPluginPackagesItemProviders(Collection<String> names) {
-		for (Iterator<String> iter = pluginPackagesItemProvidersMap.keySet().iterator();iter.hasNext();) {
-			String keyName = iter.next();
-			if (!names.contains(keyName)) {
-				PluginUIPackagesItemProvider provider = pluginPackagesItemProvidersMap.get(keyName);
-				if (provider != null) {
-					provider.dispose();
-				}
-				iter.remove();
-			}
-		}
-	}
-
-	private static List<MethodPlugin> getMethodPlugins(MethodLibrary library) {
-		List<MethodPlugin> items = new ArrayList<MethodPlugin>();
-		EList elements = library.eContents();
-		if (elements != null) {
-			for (Iterator it = elements.iterator(); it.hasNext();) {
-				EObject element = (EObject) it.next();
-				if (element instanceof MethodPlugin) {
-					items.add((MethodPlugin)element);
-				}
-			}
-		}
-		return items;
-	}
-
-
-	public Object getConfigurations() {
-		return configurations;
-	}
-
-	public Object getProcessFamilies() {
-		//return procFamilies;
-		return null;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createAddCommand(org.eclipse.emf.edit.domain.EditingDomain, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection, int)
-	 */
-	protected Command createAddCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Collection collection, int index) {
-		return new MethodElementAddCommand(super.createAddCommand(domain, owner, feature, collection, index));
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (configurations != null) {
-			configurations.dispose();
-			configurations = null;
-		}
-		
-		if (pluginPackagesItemProvidersMap != null) {
-			pluginPackagesItemProvidersMap.clear();
-			pluginPackagesItemProvidersMap = null;
-		}
-		
-		/*
-		if (procFamilies != null) {
-			procFamilies.dispose();
-			procFamilies = null;
-		}
-		*/
-		super.dispose();
-	}
-	
-	/**
-	 * 
-	 * @param plugin
-	 * @return the ItemProviderAdapter for the plugin - either a MethodPluginItemProvider or a PluginUIPackagesItemProvider. null if none found
-	 */
-	public ItemProviderAdapter getPluginItemProvider(MethodPlugin plugin) {
-		String pluginName = plugin.getName();
-		int dotIdx = pluginName.indexOf(PluginUIPackagesItemProvider.PACKAGE_SEPARATOR);
-		if (dotIdx != -1) {
-			String packageProviderName = pluginName.substring(0, dotIdx);
-			if (pluginPackagesItemProvidersMap != null) {
-				PluginUIPackagesItemProvider provider = pluginPackagesItemProvidersMap.get(packageProviderName);
-				if (provider != null) {
-					return provider;
-				}
-			}			
-		} else {
-			return (MethodPluginItemProvider) TngUtil
-				.getAdapter(plugin, MethodPluginItemProvider.class);
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodPackagesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodPackagesItemProvider.java
deleted file mode 100644
index 0c36464..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodPackagesItemProvider.java
+++ /dev/null
@@ -1,199 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the "Content Packages" folder in the Library
- * view.
- * <p>
- * This class will be renamed as "ContentPackagesItemProvider" in EPF M5.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodPackagesItemProvider extends TransientGroupItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodPackagesItemProvider(AdapterFactory adapterFactory,
-			Notifier parent, String name) {
-		super(adapterFactory, parent, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getMethodPackage_ChildPackages(), UmaFactory.eINSTANCE
-				.createContentPackage()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodPackage_ChildPackages());
-		}
-		return childrenFeatures;
-	}
-
-	protected boolean acceptAsChild(Object obj) {
-		return obj instanceof ContentPackage;
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/MethodPackages"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		if (msg.getNotifier() == target) {
-			int featureId = msg.getFeatureID(ContentPackage.class);
-			if (featureId == UmaPackage.CONTENT_PACKAGE__CHILD_PACKAGES) {
-				boolean notify = false;
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-				case Notification.MOVE:
-					Object obj = msg.getNewValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.REMOVE:
-					obj = msg.getOldValue();
-					notify = acceptAsChild(obj);
-					break;
-				case Notification.ADD_MANY:
-					Collection collection = (Collection) msg.getNewValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-				case Notification.REMOVE_MANY:
-					collection = (Collection) msg.getOldValue();
-					for_check: for (Iterator iter = collection.iterator(); iter
-							.hasNext();) {
-						if (acceptAsChild(iter.next())) {
-							notify = true;
-							break for_check;
-						}
-					}
-					break;
-
-				}
-				if (notify) {
-					fireNotifyChanged(new ViewerNotification(msg, this, true,
-							false));
-				}
-			}
-		}
-		super.notifyChanged(msg);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof ContentPackage) {
-			TngUtil.setDefaultName(
-					((ContentPackage) target).getChildPackages(),
-					(MethodElement) obj,
-					LibraryEditConstants.NEW_CONTENT_PACKAGE); 
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.CONTENT_PACKAGE__CHILD_PACKAGES;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureOwnerClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return ContentPackage.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		List children = (List) super.getChildren(object);
-
-		// sorting the content packages
-		//
-		Collections.sort(children, Comparators.DEFAULT_COMPARATOR);
-
-		// set parent for children
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = (Object) iter.next();
-			Object adapter = adapterFactory.adapt(child,
-					ITreeItemContentProvider.class);
-			if (adapter instanceof ILibraryItemProvider) {
-				((ILibraryItemProvider) adapter).setParent(object);
-			}
-		}
-
-		return children;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodPluginItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodPluginItemProvider.java
deleted file mode 100644
index d402f09..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/MethodPluginItemProvider.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PluginUIPackageContext;
-import org.eclipse.epf.library.edit.StructuredMethodPluginItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-
-/**
- * The item provider adapter for a method plug-in in the Library
- * view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodPluginItemProvider extends StructuredMethodPluginItemProvider
-		implements IStatefulItemProvider, ILibraryItemProvider {
-
-	protected Collection children;
-
-	protected Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodPluginItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.MethodPluginItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-	
-	/**
-	 * 
-	 * @return the parent of this ItemProvider
-	 */
-	public Object getParent() {
-		return parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.MethodPluginItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			MethodPlugin plugin = (MethodPlugin) object;
-
-			children = new ArrayList();
-			groupItemProviderMap = new HashMap();
-
-			String name = LibraryEditPlugin.INSTANCE
-					.getString("_UI_Content_group"); //$NON-NLS-1$
-			Object child = new ContentItemProvider(adapterFactory, plugin,
-					getModelStructure());
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-
-			name = LibraryEditPlugin.INSTANCE.getString("_UI_Processes_group"); //$NON-NLS-1$
-			child = new ProcessesItemProvider(adapterFactory, plugin,
-					getModelStructure());
-			children.add(child);
-			groupItemProviderMap.put(name, child);
-		}
-
-		return children;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (children != null) {
-			children.clear();
-			children = null;
-		}
-
-		super.dispose();
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	public Object getImage(Object object) {
-		return (((MethodPlugin) object).getUserChangeable().booleanValue()) ? UmaEditPlugin.INSTANCE
-				.getImage("full/obj16/MethodPlugin") : //$NON-NLS-1$
-				UmaEditPlugin.INSTANCE.getImage("full/obj16/MethodPlugin_grey"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.MethodPluginItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodPlugin.class)) {
-		case UmaPackage.METHOD_PLUGIN__COPYRIGHT_STATEMENT:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		case UmaPackage.METHOD_PLUGIN__NAME:
-			TngUtil.refreshParentIfNameChanged(notification, this);
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, true));
-			TngUtil.refreshPluginExtenders(this, notification, true, true);
-			break;
-		}
-
-		super.notifyChanged(notification);
-	}
-	
-	@Override
-	public String getText(Object object) {
-		String name = super.getText(object);
-		
-		if ((getParent() instanceof PluginUIPackagesItemProvider) && !PluginUIPackageContext.INSTANCE.isFlatLayout()) {
-			String deltaName = PluginUIPackagesItemProvider.getNameDelta((PluginUIPackagesItemProvider)getParent(), object);
-			return deltaName;
-		}
-		return name;
-	}
-
-	public String getFullName(Object object) {
-		return super.getText(object);
-	}
-
-	
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/PluginUIPackagesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/PluginUIPackagesItemProvider.java
deleted file mode 100644
index 7696ccb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/PluginUIPackagesItemProvider.java
+++ /dev/null
@@ -1,262 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.ILibraryItemProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.PluginUIPackagesMap;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.provider.MethodPluginItemProvider;
-
-/**
- * Item Provider Adapter that represents a plugin-package.  This is a UI folder only
- * @author Jeff Hardy
- *
- */
-public class PluginUIPackagesItemProvider extends ItemProviderAdapter implements IStructuredItemContentProvider,
-	ITreeItemContentProvider, IItemLabelProvider, ILibraryItemProvider, IStatefulItemProvider {
-
-	public static final String PACKAGE_SEPARATOR = "."; //$NON-NLS-1$
-
-	private Object parent;
-	
-	private String name;
-	
-	private Collection<MethodPlugin> plugins;
-
-	private Map<String, PluginUIPackagesItemProvider> pluginPackagesItemProvidersMap = new HashMap<String, PluginUIPackagesItemProvider>();
-
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PluginUIPackagesItemProvider(AdapterFactory adapterFactory, String packageName, Collection<MethodPlugin> plugins) {
-		super(adapterFactory);
-		this.name = packageName;
-		this.plugins = plugins;
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-	
-	/**
-	 * 
-	 * @return the parent of this ItemProvider
-	 */
-	public Object getParent() {
-		return parent;
-	}
-	
-	@Override
-	public Collection getChildrenFeatures(Object object) {
-		// TODO Auto-generated method stub
-		return super.getChildrenFeatures(object);
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return name; 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE.getImage("full/obj16/package_obj"); //$NON-NLS-1$
-	}
-
-	public static String getNameDelta(PluginUIPackagesItemProvider topObject, Object bottomObject) {
-		
-		String topName= topObject.getFullName();
-		String bottomName = null;
-		if (bottomObject instanceof PluginUIPackagesItemProvider) {
-			bottomName = ((PluginUIPackagesItemProvider)bottomObject).getFullName();
-			
-		} else if (bottomObject instanceof MethodPlugin) {
-			bottomName = ((MethodPlugin)bottomObject).getName();
-		}
-		
-		if(bottomName == null || topName.equals(bottomName))
-			return topName;
-		try {
-			String deltaname= bottomName.substring(topName.length()+1);
-			return deltaname;
-		} catch (StringIndexOutOfBoundsException e) {
-			return bottomName;
-		}
-	}
-
-	
-	public Collection<Object> getChildren(Object parentElement) {
-		return addChildren(plugins);
-	}
-	
-	private Collection<Object> addChildren(Collection<MethodPlugin> plugins) {
-		List children = new ArrayList();
-		PluginUIPackagesMap map = new PluginUIPackagesMap();
-		for (Iterator<MethodPlugin> iter = plugins.iterator();iter.hasNext();) {
-			MethodPlugin plugin = iter.next();
-			String deltaName = getNameDelta(this, plugin);
-			int dotIdx = deltaName.indexOf(PACKAGE_SEPARATOR);
-			if (dotIdx != -1) {
-				map.add(deltaName.substring(0, dotIdx), plugin);
-			} else {
-				children.add(plugin);
-				Object adapter = adapterFactory.adapt(plugin,
-						ITreeItemContentProvider.class);
-				if (adapter instanceof ILibraryItemProvider) {
-					((ILibraryItemProvider) adapter).setParent(this);
-				}
-			}
-		}
-		Collection<String> existingNames = new HashSet<String>();
-		for (Iterator<Map.Entry<String, Set<MethodPlugin>>> iter = map.entrySet().iterator();iter.hasNext();) {
-			Map.Entry<String, Set<MethodPlugin>> entry = iter.next();
-			String name = entry.getKey();
-			Set<MethodPlugin> plugSet = entry.getValue();
-			PluginUIPackagesItemProvider provider = pluginPackagesItemProvidersMap.get(getFullName() + PACKAGE_SEPARATOR + name);
-			if (provider == null) {
-				provider = new PluginUIPackagesItemProvider(adapterFactory, name, plugSet);
-				pluginPackagesItemProvidersMap.put(getFullName() + PACKAGE_SEPARATOR + name, provider);
-			} else {
-				provider.setPlugins(plugSet);
-			}
-			existingNames.add(getFullName() + PACKAGE_SEPARATOR + name);
-			provider.setParent(this);
-			children.add(provider);
-		}
-		retainPluginPackagesItemProviders(existingNames);
-		Collections.sort(children, Comparators.PLUGINPACKAGE_COMPARATOR);
-		return children;
-	}
-	
-	/**
-	 * 
-	 * @return full name of this package
-	 */
-	public String getFullName() {
-		String fullName = getName();
-		Object parent = getParent();
-		while (parent instanceof PluginUIPackagesItemProvider) {
-			fullName = ((PluginUIPackagesItemProvider)parent).getName() + PACKAGE_SEPARATOR + fullName;
-			parent = ((PluginUIPackagesItemProvider)parent).getParent();
-		}
-		return fullName;
-		
-	}
-
-	public String getName() {
-		return name;
-	}
-	
-	@Override
-	public Object getParent(Object object) {
-		if (parent != null)
-			return parent;
-		return target;
-	}
-	
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodPlugin.class)) {
-		case UmaPackage.METHOD_PLUGIN__NAME:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, true));
-			break;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	@Override
-	public void dispose() {
-		// remove this from the plugins' adapter list
-		if (pluginPackagesItemProvidersMap != null) {
-			pluginPackagesItemProvidersMap.clear();
-			pluginPackagesItemProvidersMap = null;
-		}
-		super.dispose();
-	}
-	
-	private void retainPluginPackagesItemProviders(Collection<String> names) {
-		for (Iterator<String> iter = pluginPackagesItemProvidersMap.keySet().iterator();iter.hasNext();) {
-			String keyName = iter.next();
-			if (!names.contains(keyName)) {
-				PluginUIPackagesItemProvider provider = pluginPackagesItemProvidersMap.get(keyName);
-				if (provider != null) {
-					provider.dispose();
-				}
-				iter.remove();
-			}
-		}
-	}
-	
-	public Collection<MethodPlugin> getPlugins() {
-		return plugins;
-	}
-
-	public void setPlugins(Collection<MethodPlugin> plugins) {
-		this.plugins = plugins;
-	}
-	
-	/**
-	 * 
-	 * @param plugin
-	 * @return the ItemProviderAdapter for the plugin - either a MethodPluginItemProvider or a PluginUIPackagesItemProvider. null if none found
-	 */
-	public ItemProviderAdapter getPluginItemProvider(MethodPlugin plugin) {
-		String deltaName = getNameDelta(this, plugin);
-		int dotIdx = deltaName.indexOf(PluginUIPackagesItemProvider.PACKAGE_SEPARATOR);
-		if (dotIdx != -1) {
-			String packageProviderName = deltaName.substring(0, dotIdx);
-			if (pluginPackagesItemProvidersMap != null) {
-				PluginUIPackagesItemProvider provider = pluginPackagesItemProvidersMap.get(getFullName() + PACKAGE_SEPARATOR + packageProviderName);
-				if (provider != null) {
-					return provider;
-				}
-			}			
-		} else {
-			return (MethodPluginItemProvider) TngUtil
-				.getAdapter(plugin, MethodPluginItemProvider.class);
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/PracticeItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/PracticeItemProvider.java
deleted file mode 100644
index edefed8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/PracticeItemProvider.java
+++ /dev/null
@@ -1,162 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for a practice.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class PracticeItemProvider extends
-		org.eclipse.epf.uma.provider.PracticeItemProvider implements IDefaultNameSetter {
-
-	public PracticeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.PracticeItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getPractice_SubPractices(), UmaFactory.eINSTANCE
-				.createPractice()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.PracticeItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getPractice_SubPractices());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		Object parent = TngUtil
-				.getNavigatorParentItemProvider((Guidance) object);
-		if (parent == null) {
-			return super.getParent(object);
-		}
-		return parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_Practice_type")); //$NON-NLS-1$
-	}
-
-	public Object getImage(Object object) {
-		if (object instanceof DescribableElement) {
-			if (((DescribableElement) object).getNodeicon() != null) {
-				URI imgUri = TngUtil.getFullPathofNodeorShapeIconURI(
-						(DescribableElement) object,
-						((DescribableElement) object).getNodeicon());
-				Object image = LibraryEditPlugin.INSTANCE
-						.getSharedImage(imgUri);
-				if (image != null)
-					return image;
-			}
-		}
-		return super.getImage(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification msg) {
-		TngUtil.setDefaultName(this, msg);
-
-		super.notifyChanged(msg);
-	}
-
-	public void setDefaultName(Object obj) {
-		Practice practice = (Practice) getParent(obj);
-		if (obj instanceof Practice) {
-			TngUtil.setDefaultName(practice.getSubPractices(),
-					(MethodElement) obj, LibraryEditConstants.NEW_PRACTICE); 
-		}
-	}
-
-	public int getInterestedFeatureID() {
-		return UmaPackage.PRACTICE__SUB_PRACTICES;
-	}
-
-	public Class getInterestedFeatureOwnerClass() {
-		return Practice.class;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessComponentItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessComponentItemProvider.java
deleted file mode 100644
index 123f45d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessComponentItemProvider.java
+++ /dev/null
@@ -1,142 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-
-/**
- * The item provider adapter for a process component in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessComponentItemProvider extends
-		org.eclipse.epf.uma.provider.ProcessComponentItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessComponentItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		// if(childrenFeatures == null) {
-		// childrenFeatures = new ArrayList();
-		// childrenFeatures.add(UmaPackage.eINSTANCE.getProcessComponent_Process());
-		// //
-		// childrenFeatures.add(UmaPackage.eINSTANCE.getProcessPackage_BreakdownElements());
-		// //
-		// childrenFeatures.add(UmaPackage.eINSTANCE.getProcessPackage_WBS());
-		// //
-		// childrenFeatures.add(UmaPackage.eINSTANCE.getProcessPackage_OBS());
-		// //
-		// childrenFeatures.add(UmaPackage.eINSTANCE.getProcessPackage_PBS());
-		// }
-		// return childrenFeatures;
-
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		Process proc = ((ProcessComponent) object).getProcess();
-		if (proc instanceof CapabilityPattern) {
-			return UmaEditPlugin.INSTANCE
-					.getImage("full/obj16/CapabilityPattern"); //$NON-NLS-1$
-		} else if (proc instanceof DeliveryProcess) {
-			return UmaEditPlugin.INSTANCE
-					.getImage("full/obj16/DeliveryProcess"); //$NON-NLS-1$
-		}
-
-		return super.getImage(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_ProcessComponent_type")); //$NON-NLS-1$
-	}
-
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ProcessComponent.class)) {
-		case UmaPackage.PROCESS_COMPONENT__NAME:
-			ProcessComponent pc = (ProcessComponent) notification.getNotifier();
-			if (pc.getProcess() != null) {
-				boolean old = pc.getProcess().eDeliver();
-				try {
-					pc.getProcess().eSetDeliver(false);
-					pc.getProcess().setName(pc.getName());
-				} finally {
-					pc.getProcess().eSetDeliver(old);
-				}
-			}
-			break;
-		}
-
-		TngUtil.refreshParentIfNameChanged(notification, this);
-
-		super.notifyChanged(notification);
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessFamiliesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessFamiliesItemProvider.java
deleted file mode 100644
index 4bf8058..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessFamiliesItemProvider.java
+++ /dev/null
@@ -1,118 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * The item provider adapter for the "Process Families" folder in the Library
- * view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- * @deprecated
- */
-public class ProcessFamiliesItemProvider extends TransientGroupItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessFamiliesItemProvider(AdapterFactory adapterFactory,
-			MethodLibrary parent, String name) {
-		super(adapterFactory, parent, name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getMethodLibrary_PredefinedConfigurations(),
-				UmaFactory.eINSTANCE.createProcessFamily()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodLibrary_PredefinedConfigurations());
-		}
-		return childrenFeatures;
-	}
-
-	protected boolean acceptAsChild(Object obj) {
-		return obj instanceof ProcessFamily;
-	}
-
-	public Object getImage(Object object) {
-		return LibraryEditPlugin.INSTANCE
-				.getImage("full/obj16/ProcessFamilies"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureID()
-	 */
-	public int getInterestedFeatureID() {
-		return UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#setDefaultName(java.lang.Object)
-	 */
-	public void setDefaultName(Object obj) {
-		if (obj instanceof ProcessFamily)
-			TngUtil.setDefaultName(((MethodLibrary) target)
-					.getPredefinedConfigurations(), (MethodElement) obj,
-					LibraryEditConstants.NEW_PROCESS_FAMILY); 
-		else if (obj instanceof MethodConfiguration) {
-			TngUtil.setDefaultName(((MethodLibrary) target)
-					.getPredefinedConfigurations(), (MethodElement) obj,
-					LibraryEditConstants.NEW_CONFIGURATION); 
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.TransientGroupItemProvider#getInterestedFeatureClass()
-	 */
-	public Class getInterestedFeatureOwnerClass() {
-		return MethodLibrary.class;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessFamilyItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessFamilyItemProvider.java
deleted file mode 100644
index 4dbd32b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessFamilyItemProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * The item provider adapter for the process family in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- * @deprecated
- */
-public class ProcessFamilyItemProvider extends
-		org.eclipse.epf.uma.provider.ProcessFamilyItemProvider {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessFamilyItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		EObject lib = (EObject) super.getParent(object);
-		if (lib == null)
-			return null;
-		MethodLibraryItemProvider itemProvider = (MethodLibraryItemProvider) TngUtil
-				.getAdapter(lib, MethodLibraryItemProvider.class);
-		return itemProvider != null ? itemProvider.getProcessFamilies() : null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_ProcessFamily_type")); //$NON-NLS-1$
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessPackageItemProvider.java
deleted file mode 100644
index ee4d19c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessPackageItemProvider.java
+++ /dev/null
@@ -1,318 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.command.MethodElementCreateChildCommand;
-import org.eclipse.epf.library.edit.process.IProcessItemProvider;
-import org.eclipse.epf.library.edit.process.command.CreateProcessComponentCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-
-/**
- * The item provider adapter for a process package in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessPackageItemProvider extends
-		org.eclipse.epf.uma.provider.ProcessPackageItemProvider implements
-		IProcessItemProvider, IStatefulItemProvider {
-
-	protected EClass processType;
-
-	private String label;
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	public EClass getProcessType() {
-		return processType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getMethodPackage_ChildPackages(), UmaFactory.eINSTANCE
-				.createProcessPackage()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getMethodPackage_ChildPackages(), UmaFactory.eINSTANCE
-				.createProcessComponent()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getMethodPackage_ChildPackages());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (!(child instanceof ProcessComponent)
-					&& (child instanceof ProcessPackage)) {
-				ProcessPackageItemProvider itemProvider = (ProcessPackageItemProvider) getRootAdapterFactory()
-						.adapt(child, ITreeItemContentProvider.class);
-				if (processType != null)
-					itemProvider.setProcessType(processType);
-			}
-		}
-
-		Collections.sort((List) children, PresentationContext.INSTANCE
-				.getProcessPackageComparator());
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		if (label != null)
-			return label;
-		return TngUtil.getLabel(object);
-	}
-
-	public Object getImage(Object object) {
-		EClass procType = getProcessType();
-		if (procType != null) {
-			Object parent = getParent(object);
-			if (parent != null
-					&& parent instanceof org.eclipse.epf.library.edit.navigator.ProcessesItemProvider) {
-				if (procType
-						.equals(UmaPackage.eINSTANCE.getCapabilityPattern()))
-					return LibraryEditPlugin.INSTANCE
-							.getImage("full/obj16/CapabilityPatterns"); //$NON-NLS-1$
-				else if (procType.equals(UmaPackage.eINSTANCE
-						.getDeliveryProcess()))
-					return LibraryEditPlugin.INSTANCE
-							.getImage("full/obj16/DeliveryProcesses"); //$NON-NLS-1$
-			}
-		}
-		return UmaEditPlugin.INSTANCE.getImage("full/obj16/ProcessPackage"); //$NON-NLS-1$
-	}
-
-	public void setLabel(String label) {
-		this.label = label;
-	}
-
-	public void setProcessType(EClass processType) {
-		this.processType = processType;
-	}
-
-	protected Command createCreateChildCommand(EditingDomain domain,
-			EObject owner, EStructuralFeature feature, Object value, int index,
-			Collection collection) {
-		// System.out.println("ProcessPackageItemProvider.createCreateChildCommand()");
-		if (value instanceof ProcessComponent) {
-			return new CreateProcessComponentCommand(domain, owner, feature,
-					value, index, collection, this);
-		}
-		// return super.createCreateChildCommand(domain, owner, feature, value,
-		// index, collection);
-		return new MethodElementCreateChildCommand(domain, owner, feature,
-				value, index, collection, this);
-	}
-
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		if (child instanceof ProcessComponent) {
-			EClass processType = getProcessType();
-			if (processType != null) {
-				if (processType.equals(UmaPackage.eINSTANCE
-						.getCapabilityPattern())) {
-					return LibraryEditPlugin.INSTANCE
-							.getString("_UI_CapabilityPattern_text"); //$NON-NLS-1$
-				} else if (processType.equals(UmaPackage.eINSTANCE
-						.getDeliveryProcess())) {
-					return LibraryEditPlugin.INSTANCE
-							.getString("_UI_DeliveryProcess_text"); //$NON-NLS-1$
-				} else if (processType == UmaPackage.eINSTANCE
-						.getProcessPlanningTemplate()) {
-					return getString("_UI_ProcessPlanningTemplate_type"); //$NON-NLS-1$
-				}
-			}
-		}
-
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		if (child instanceof ProcessComponent) {
-			EClass processType = getProcessType();
-			if (processType != null) {
-				if (processType.equals(UmaPackage.eINSTANCE
-						.getCapabilityPattern())) {
-					return UmaEditPlugin.INSTANCE
-							.getImage("full/obj16/CapabilityPattern"); //$NON-NLS-1$
-				} else if (processType.equals(UmaPackage.eINSTANCE
-						.getDeliveryProcess())) {
-					return UmaEditPlugin.INSTANCE
-							.getImage("full/obj16/DeliveryProcess"); //$NON-NLS-1$
-				} else if (processType == UmaPackage.eINSTANCE
-						.getProcessPlanningTemplate()) {
-					return UmaEditPlugin.INSTANCE
-							.getImage("full/obj16/ProcessPlanningTemplate"); //$NON-NLS-1$
-				}
-			}
-		}
-
-		return super.getCreateChildImage(owner, feature, child, selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createAddCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection, int)
-	 */
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		Collection selection = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof ProcessPackage) {
-				// check to exclude any pasted-in package that contains
-				// process of different type than that of this package
-				//
-				if (!ProcessUtil.hasProcessNotOfType((ProcessPackage) element,
-						processType)) {
-					selection.add(element);
-				}
-			}
-		}
-		if (selection.isEmpty()) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		// return super.createAddCommand(domain, owner, feature, collection,
-		// index);
-		return new MethodElementAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, selection, index)) {
-			protected void featureChanged(EObject object,
-					EStructuralFeature feature, Object newValue) {
-				if (object instanceof ProcessComponent
-						&& feature == UmaPackage.eINSTANCE
-								.getNamedElement_Name()) {
-					Process proc = ((ProcessComponent) object).getProcess();
-					if (proc != null) {
-						proc.setName((String) newValue);
-					}
-				}
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createInitializeCopyCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.edit.command.CopyCommand.Helper)
-	 */
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	public void setParent(Object parent) {
-		this.parent = parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null)
-			return parent;
-		return super.getParent(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ProcessPackageItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		TngUtil.refreshParentIfNameChanged(notification, this);
-
-		super.notifyChanged(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessesItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessesItemProvider.java
deleted file mode 100644
index 0ead817..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/ProcessesItemProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.navigator;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The item provider adapter for the "Processes" folder in the Library view.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessesItemProvider extends AbstractProcessesItemProvider {
-
-	private static final String PROCESS_CONTRIBUTIONS_LABEL = LibraryEditPlugin.INSTANCE
-			.getString("_UI_ProcessContributions_text"); //$NON-NLS-1$
-
-	private MethodPlugin plugin;
-
-	private ProcessPackage processContributionsPackage;
-	private ProcessPackage capabilityPatternPackage;
-	private ProcessPackage deliveryProcessPackage;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessesItemProvider(AdapterFactory adapterFactory,
-			MethodPlugin plugin, ModelStructure modelStruct) {
-		super(adapterFactory, modelStruct);
-		this.plugin = plugin;
-	}
-
-	public Collection getChildren(Object object) {
-		if (children == null) {
-			children = new ArrayList();
-			org.eclipse.epf.uma.ProcessPackage pkg = (org.eclipse.epf.uma.ProcessPackage) UmaUtil
-					.findMethodPackage(plugin,
-							modelStruct.capabilityPatternPath);
-			capabilityPatternPackage = pkg;
-			if (pkg != null) {
-				ProcessPackageItemProvider adapter = (ProcessPackageItemProvider) TngUtil
-						.getBestAdapterFactory(adapterFactory).adapt(pkg,
-								ITreeItemContentProvider.class);
-				adapter.setProcessType(UmaPackage.eINSTANCE
-						.getCapabilityPattern());
-				adapter.setLabel(LibraryEditPlugin.INSTANCE
-						.getString("_UI_CapabilityPatterns_text")); //$NON-NLS-1$
-				adapter.setParent(this);
-				children.add(pkg);
-			}
-			pkg = (org.eclipse.epf.uma.ProcessPackage) UmaUtil
-					.findMethodPackage(plugin, modelStruct.deliveryProcessPath);
-			deliveryProcessPackage = deliveryProcessPackage;
-			if (pkg != null) {
-				ProcessPackageItemProvider adapter = (ProcessPackageItemProvider) TngUtil
-						.getBestAdapterFactory(adapterFactory).adapt(pkg,
-								ITreeItemContentProvider.class);
-				adapter.setProcessType(UmaPackage.eINSTANCE
-						.getDeliveryProcess());
-				adapter.setLabel(LibraryEditPlugin.INSTANCE
-						.getString("_UI_DeliveryProcesses_text")); //$NON-NLS-1$
-				adapter.setParent(this);
-				children.add(pkg);
-			}
-
-			if (processContributionEnabled) {
-				children.add(getProcessContributionsPackage());
-			}
-
-			// groupItemProviderMap = new HashMap();
-			// String name =
-			// LibraryEditPlugin.INSTANCE.getString("_UI_PlanningTemplates_group");
-			// Object child = new TransientGroupItemProvider(adapterFactory,
-			// plugin, name);
-			// children.add(child);
-			// groupItemProviderMap.put(name, child);
-
-			// comment out the planning templates for TNG release one at
-			// 2005-05-09
-			// pkg = (org.eclipse.epf.uma.ProcessPackage)
-			// UmaUtil.findMethodPackage(plugin,
-			// modelStruct.processPlanningTemplatePath);
-			// if(pkg == null) {
-			// pkg =
-			// ModelStructure.createProcessPlanningTemplatePackage(plugin);
-			// }
-			// adapter = (ProcessPackageItemProvider)
-			// TngUtil.getBestAdapterFactory(adapterFactory).adapt(pkg,
-			// ITreeItemContentProvider.class);
-			// adapter.setProcessType(UmaPackage.eINSTANCE.getProcessPlanningTemplate());
-			// adapter.setLabel(LibraryEditPlugin.INSTANCE.getString("_UI_PlanningTemplates_text"));
-			// children.add(pkg);
-
-		} else {
-			if (processContributionEnabled) {
-				ProcessPackage pkg = getProcessContributionsPackage();
-				if (!children.contains(pkg)) {
-					children.add(pkg);
-				}
-			} else {
-				ProcessPackage pkg = getProcessContributionsPackage();
-				children.remove(pkg);
-			}
-		}
-
-		return children;
-	}
-
-	private ProcessPackage getProcessContributionsPackage() {
-		if (processContributionsPackage == null) {
-			processContributionsPackage = (org.eclipse.epf.uma.ProcessPackage) UmaUtil
-					.findMethodPackage(plugin,
-							modelStruct.processContributionPath);
-			if (processContributionsPackage == null) {
-				processContributionsPackage = ModelStructure
-						.createProcessContributionPackage(plugin);
-			}
-			ProcessPackageItemProvider adapter = (ProcessPackageItemProvider) getRootAdapterFactory()
-					.adapt(processContributionsPackage,
-							ITreeItemContentProvider.class);
-			adapter.setLabel(PROCESS_CONTRIBUTIONS_LABEL);
-			adapter.setParent(this);
-		}
-		return processContributionsPackage;
-	}
-
-	public Object getParent(Object object) {
-		return plugin;
-	}
-
-	public ProcessPackage getCapabilityPatternPackage() {
-		return capabilityPatternPackage;
-	}
-	
-	public ProcessPackage getDeliveryProcessPackage() {
-		return deliveryProcessPackage;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/package.html
deleted file mode 100644
index 24ae359..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/navigator/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides item providers for displaying and editing method library elements in the Library view.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/package.html
deleted file mode 100644
index 02468bb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for displaying and editing method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ActivityItemProvider.java
deleted file mode 100644
index 627e414..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ActivityItemProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-
-/**
- * Item provider for activity used by configuration view and filter dialog. This item provider return
- * children list that contain only its own activities after realization against selected configuration.
- * 
- * @author Phong Nguyen Le - Jun 30, 2006
- * @since  1.0
- */
-public class ActivityItemProvider extends BSActivityItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public ActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#getObject(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected Object getObject(Descriptor descriptor) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.IBSItemProvider#getEClasses()
-	 */
-	public Collection getEClasses() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object child) {
-		return child instanceof Activity;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#isRolledUp()
-	 */
-	public boolean isRolledUp() {
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#basicSetRolledUp(boolean)
-	 */
-	public void basicSetRolledUp(boolean b) {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#setRolledUp(boolean)
-	 */
-	public void setRolledUp(boolean b) {
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ActivityWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ActivityWrapperItemProvider.java
deleted file mode 100644
index 83fd19a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ActivityWrapperItemProvider.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-
-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.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityWrapperItemProvider extends
-		BreakdownElementWrapperItemProvider {
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public ActivityWrapperItemProvider(Activity value, Object owner,
-			AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param activity
-	 * @param owner
-	 * @param feature
-	 * @param index
-	 * @param adapterFactory
-	 */
-	public ActivityWrapperItemProvider(Activity activity, Object owner,
-			EStructuralFeature feature, int index, AdapterFactory adapterFactory) {
-		super(activity, owner, feature, index, adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.DescribableElementWrapperItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		if (getRefreshElement(notification) == getDelegateValue()) {
-			switch (notification.getFeatureID(Activity.class)) {
-			case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-				Process proc = (Process) getTopItem();
-				if (proc != null) {
-					BSActivityItemProvider itemProvider = (BSActivityItemProvider) adapterFactory
-							.adapt(proc, ITreeItemContentProvider.class);
-					if (itemProvider instanceof WBSActivityItemProvider) {
-						itemProvider.setRefreshAllIDsRequired(true);
-					}
-				}
-			}
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		IBSItemProvider itemProvider = null;
-		boolean oldRolledUp = false;
-		try {
-			if (delegateItemProvider instanceof IBSItemProvider) {
-				itemProvider = (IBSItemProvider) delegateItemProvider;
-				oldRolledUp = itemProvider.isRolledUp();
-				if(isRolledUp() != oldRolledUp) {
-					if(itemProvider instanceof BSActivityItemProvider) {
-						((BSActivityItemProvider)itemProvider).basicSetRolledUp(isRolledUp());
-					}
-					else {
-						itemProvider.setRolledUp(isRolledUp());
-					}
-				}
-				else {
-					itemProvider = null;
-				}
-			}
-			return super.getChildren(object);
-		}
-		finally {
-			if(itemProvider != null) {
-				// restore rolled-up flag
-				//
-				if(itemProvider instanceof BSActivityItemProvider) {
-					((BSActivityItemProvider)itemProvider).basicSetRolledUp(oldRolledUp);
-				}
-				else {
-					itemProvider.setRolledUp(oldRolledUp);
-				}
-			}
-		}
-	}
-	
-	public Object getDelegatingItemProvider(){
-		return delegateItemProvider;
-	}
-	
-	@Override
-	public String getText(Object object) {
-		// TODO Auto-generated method stub
-		return super.getText(object);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BSActivityItemProvider.java
deleted file mode 100644
index b7b6e39..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BSActivityItemProvider.java
+++ /dev/null
@@ -1,1552 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.MoveCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.Disposable;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.ICachedChildrenItemProvider;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.IWrapperItemProviderFactory;
-import org.eclipse.epf.library.edit.IWrapperItemProviderFactoryProvider;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.VariabilityInfo;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.command.ActivityAddCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.GraphicalData;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.epf.uma.provider.ActivityItemProvider;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * Abstract base class for activity's item providers used by the Process Editor.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class BSActivityItemProvider extends ActivityItemProvider
-		implements IProcessItemProvider, IBSItemProvider,
-		ITableItemLabelProvider, IConfigurable, ICachedChildrenItemProvider {
-
-	private Object parent;
-
-	private int id;
-
-	protected Object topItem = null;
-
-	private boolean rolledUp;
-
-	private GraphicalData graphicalData;
-
-	private PredecessorList predecessors;
-
-	private Boolean expanded;
-
-	protected Adapter baseListener;
-
-	private IFilter childFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			return acceptAsChild(obj);
-		}
-
-	};
-
-	private boolean refreshAllIDsRequired;
-
-	private IFilter filter;
-
-	protected List cachedChildren;
-
-	protected List cachedRollupChildren;
-
-	private IConfigurator configurator;
-
-	private Disposable contributedWrappers;
-
-	private VariabilityInfo variabilityInfo;
-	
-	private boolean enableVariabilityInfo = true;
-
-	private Disposable rolledUpWrappers;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public BSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if(baseListener != null) {
-			EObject currentBase = (EObject) baseListener.getTarget();
-			if(currentBase != null) {
-				currentBase.eAdapters().remove(baseListener);
-			}
-			if (getTarget() instanceof Activity) {
-				Activity act = (Activity) getTarget();
-				VariabilityElement base = act.getVariabilityBasedOnElement();
-				if (base != null) {
-					base.eAdapters().remove(baseListener);
-				}
-			}
-		}
-
-		if (predecessors != null) {
-			predecessors.dispose();
-		}
-
-		if(cachedChildren != null) {
-			cachedChildren.clear();
-			cachedChildren = null;
-		}
-		
-		if(cachedRollupChildren != null) {
-			cachedRollupChildren.clear();
-			cachedRollupChildren = null;
-		}
-		
-		if(contributedWrappers != null) {
-			contributedWrappers.dispose();
-			contributedWrappers = null;
-		}
-		
-		if(rolledUpWrappers != null) {
-			rolledUpWrappers.dispose();
-			rolledUpWrappers = null;
-		}
-		
-		super.dispose();
-	}
-
-	/**
-	 * Checks if the given object can be accepted as a child.
-	 */
-	protected boolean acceptAsChild(Object child) {
-		if (filter != null) {
-			return filter.accept(child);
-		}
-		return true;
-	}
-
-	/**
-	 * Checks if the given object can be accepted as a rolled-up child.
-	 */
-	protected boolean acceptAsRolledUpChild(Object child) {
-		child = TngUtil.unwrap(child);
-		if (filter != null && !(child instanceof Activity)
-				&& !(child instanceof TeamProfile)) {
-			return filter.accept(child);
-		}
-		return true;
-	}
-
-	/**
-	 * Gets the object associated with the given descriptor (e.g: a
-	 * TaskDescriptor is associated with a Task).
-	 */
-	protected abstract Object getObject(Descriptor descriptor);
-
-	public Collection getNewChildDescriptors(Object object, EditingDomain editingDomain, Object sibling) {
-		// disallow creating new child if this item provider is rolled up
-		//
-		if(isRolledUp()) {
-			return Collections.EMPTY_LIST;
-		}
-		
-		return super.getNewChildDescriptors(object, editingDomain, sibling);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		// if(isTopActivity(object)) {
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getActivity_BreakdownElements(),
-		// UmaFactory.eINSTANCE.createPhase()));
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getActivity_BreakdownElements(),
-		// UmaFactory.eINSTANCE.createIteration()));
-		// }
-		// else if(object instanceof Phase) {
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getActivity_BreakdownElements(),
-		// UmaFactory.eINSTANCE.createIteration()));
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isExpanded()
-	 */
-	public Boolean isExpanded() {
-		return expanded;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setExpanded(boolean)
-	 */
-	public void setExpanded(Boolean b) {
-		expanded = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#getId()
-	 */
-	public int getId() {
-		return id;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#getTopItem()
-	 */
-	public Object getTopItem() {
-		if (topItem == null) {
-			if(ProcessUtil.isTopProcess(target)) {
-				return target;
-			}
-			Object parent = getParent(target);
-			if(parent != null) {
-				Object ip = getRootAdapterFactory().adapt(parent, ITreeItemContentProvider.class);
-				if(ip instanceof IBSItemProvider) {
-					IBSItemProvider adapter = (IBSItemProvider) ip;
-					if (adapter != null) {
-						Object top = adapter.getTopItem();
-						if (top == null && parent instanceof Process
-								&& ((Process) parent).getSuperActivities() == null) {
-							top = parent;
-							adapter.setTopItem(top);
-						}
-						return top;
-					}
-				}
-			}
-		}
-		return topItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setId(int)
-	 */
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	private static boolean isTopActivity(Object object) {
-		EObject eObj = (EObject) object;
-		Object parent = eObj.eContainer();
-		if (parent instanceof ProcessComponent) {
-			ProcessComponent pc = (ProcessComponent) parent;
-			return object == pc.getProcess();
-		}
-		return false;
-	}
-
-	/**
-	 * @param object
-	 * @return
-	 */
-	protected static boolean hasChildDescriptor(Activity act) {
-		for (Iterator iter = act.getBreakdownElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Descriptor) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getActivity_BreakdownElements());
-		}
-		return childrenFeatures;
-	}
-
-	protected void setParentFor(Object child, Object parent) {
-		ProcessUtil.setParent(child, parent, getRootAdapterFactory());
-	}
-
-//	private Collection getDirectChildren(Object object) {
-//		List myChildren;
-//		ChildrenStore store = getChildrenStore(object);
-//		if (store != null) {
-//			myChildren = store.getChildren();
-//		} else {
-//			// store = createChildrenStore(object);
-//			List result = store != null ? null : new ArrayList();
-//			EObject eObject = (EObject) object;
-//
-//			for (Iterator i = getChildrenFeatures(object).iterator(); i
-//					.hasNext();) {
-//				EStructuralFeature feature = (EStructuralFeature) i.next();
-//				if (feature.isMany()) {					
-//					List children = (List) eObject.eGet(feature);
-//					
-////					//Change for Activity Variability. To do realization for
-////					//Browsing and Publishing.
-////					List children = new ArrayList();
-////					if(filter != null && filter instanceof IConfigurator){
-////						children.addAll(((IConfigurator)filter).getChildren(object, feature));
-////					}
-////					else{
-////						children = (List) eObject.eGet(feature);
-////					}
-//					
-//					int index = 0;
-//					for (Iterator ci = children.iterator(); ci.hasNext(); index++) {
-//						Object child = ci.next();
-//						if (acceptAsChild(child)) {
-//							child = wrap(eObject, feature, child, index);
-//							setParentFor(child, object);
-//							// IBSItemProvider adapter = (IBSItemProvider)
-//							// getBestAdapterFactory().adapt(child,
-//							// ITreeItemContentProvider.class);
-//							// adapter.setRolledUp(false);
-//							if (store != null) {
-//								store.getList(feature).add(child);
-//							} else {
-//								result.add(child);
-//							}
-//						}
-//					}
-//				} else {
-//					Object child = eObject.eGet(feature);
-//					if (acceptAsChild(child)) {
-//						child = wrap(eObject, feature, child,
-//								CommandParameter.NO_INDEX);
-//						setParentFor(child, object);
-//						// IBSItemProvider adapter = (IBSItemProvider)
-//						// getBestAdapterFactory().adapt(child,
-//						// ITreeItemContentProvider.class);
-//						// adapter.setRolledUp(false);
-//
-//						if (store != null) {
-//							store.setValue(feature, child);
-//						} else {
-//							result.add(child);
-//						}
-//					}
-//				}
-//			}
-//			myChildren = store != null ? store.getChildren() : result;
-//		}
-//		Collection children = addInherited(object, myChildren);
-//		return children;
-//	}
-	
-	private Collection getImmediateChildren(Object object) {
-		Collection children = new ArrayList();
-		for (Iterator iter = super.getChildren(object).iterator(); iter.hasNext();) {
-			Object child = (Object) iter.next();
-			if(acceptAsChild(child)) {
-				if(configurator != null) {
-					child = configurator.resolve(child);
-				}
-				if(child != null && !children.contains(child)) {
-					setParentFor(child, object);
-					children.add(child);
-				}
-			}
-		}
-		children = addInherited(object, (List) children);
-		return children;
-	}
-	
-	private Collection getRolledUpChildren(Object object) {
-		if (rolledUpWrappers != null) {
-			rolledUpWrappers.dispose();
-		}
-
-		List children = new ArrayList();
-		AbstractTreeIterator iter = new AbstractTreeIterator(object, false) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = -3159537629619737368L;
-
-			protected Iterator getChildren(Object object) {
-				if (object instanceof Activity) {
-					BSActivityItemProvider adapter = (BSActivityItemProvider) adapterFactory.adapt(object, ITreeItemContentProvider.class);
-					Iterator iterator;
-					boolean b = adapter.isRolledUp();
-					try {
-						adapter.basicSetRolledUp(false);
-						iterator = adapter.getChildren(object).iterator();
-					}
-					finally {
-						adapter.basicSetRolledUp(b);
-					}
-					return iterator;
-				} else if (object instanceof BreakdownElementWrapperItemProvider
-						&& !(object instanceof TeamProfileWrapperItemProvider)) {
-					return ((BreakdownElementWrapperItemProvider) object)
-							.getChildren(object).iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-
-		};
-		// make sure that only one descriptor for each content element in the roll-up list
-		//
-		List descriptors = new ArrayList();
-		while (iter.hasNext()) {
-			Object child = iter.next();
-			if (acceptAsRolledUpChild(child)) {
-				Object e = TngUtil.unwrap(child);
-				if(e instanceof Descriptor) {
-					Object desc = findDescriptor(descriptors, e);
-					if(desc == null) {
-						if(isWrappingRollupNeeded(child)) {
-							child = createRollupWrapper(child, object, adapterFactory);
-						}
-						children.add(child);
-						descriptors.add(child);
-					}
-					else {
-						if(isWrappingRollupNeeded(child)) {
-							ComposedBreakdownElementWrapperItemProvider composedWrapper = ProcessUtil.getComposedWrapper(desc);
-							if(composedWrapper != null) {
-								composedWrapper.addElement(child);
-							}
-						}
-					}
-				}
-				else {
-					children.add(child);
-				}
-			}
-		}
-		descriptors.clear();
-		descriptors = null;
-		return children;
-	}
-	
-	/**
-	 * Checks if wrapping of the specified rollup element is needed. If it's
-	 * needed, the caller will use
-	 * {@link #createRollupWrapper(Object, Object, AdapterFactory)} to create
-	 * wrapper for the rollup element.
-	 * 
-	 * @param object
-	 * @return
-	 */
-	protected boolean isWrappingRollupNeeded(Object object) {
-		return false;
-	}
-	
-	protected ComposedBreakdownElementWrapperItemProvider createComposedWrapper(Object object, Object owner, AdapterFactory adapterFactory) {
-		return new ComposedBreakdownElementWrapperItemProvider(object, owner, adapterFactory);
-	}
-	
-	protected Object createRollupWrapper(Object object, Object owner, AdapterFactory adapterFactory) {		
-		ComposedBreakdownElementWrapperItemProvider wrapper = createComposedWrapper(object, owner, adapterFactory);
-		wrapper.readOnly = true;
-		wrapper.isRollupChild = true;
-		
-		if(rolledUpWrappers == null) {
-			rolledUpWrappers = new Disposable();
-		}
-		rolledUpWrappers.add(wrapper);
-
-		return wrapper; 		
-	}		
-	
-	private Collection doGetChildren(Object object) {
-		if(isRolledUp()) {
-			return getRolledUpChildren(object);
-		}
-		else {
-			return getImmediateChildren(object);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Activity activity = (Activity) object;
-		if(configurator != null) {
-			
-			//TODO: remove the enableVariabilityInfoFlag and  
-			// create an interface or do differently
-			if(enableVariabilityInfo)
-				variabilityInfo = configurator.getVariabilityInfo(activity);
-			else 
-				variabilityInfo = null;
-		}
-		else {
-			variabilityInfo = null;
-		}
-		if(variabilityInfo != null) {
-			Object resolved = variabilityInfo.getInheritanceList().get(0);
-			BSActivityItemProvider ip = (BSActivityItemProvider) adapterFactory.adapt(resolved, ITreeItemContentProvider.class);			
-			Collection children;
-			boolean b = ip.isRolledUp();
-			try {
-				ip.basicSetRolledUp(isRolledUp());
-				children = ip.doGetChildren(resolved);
-			}
-			finally {
-				ip.basicSetRolledUp(b);
-			}
-			if(!variabilityInfo.getContributors().isEmpty()) {
-				ArrayList contributedChildren = new ArrayList();
-				for (Iterator iter = variabilityInfo.getContributors().iterator(); iter.hasNext();) {
-					Object e = iter.next();
-					Object adapter = adapterFactory.adapt(e, ITreeItemContentProvider.class);
-					if(adapter instanceof BSActivityItemProvider) {
-						ip = ((BSActivityItemProvider)adapter);
-						b = ip.isRolledUp();
-						try {
-							ip.basicSetRolledUp(isRolledUp());
-							for (Iterator iterator = ip.getImmediateChildren(e).iterator(); iterator
-							.hasNext();) {
-								e = iterator.next();
-								e = Providers.getConfigurationApplicator().resolve(e, configurator.getMethodConfiguration());
-								if(e != null && !TngUtil.contains(children, e)) {
-									contributedChildren.add(e);
-								}
-							}
-						}
-						finally {
-							ip.basicSetRolledUp(b);
-						}
-					}
-				}
-				if(!contributedChildren.isEmpty()) {
-					children.addAll(wrapContributed(activity, contributedChildren));
-				}
-			}
-			return children;
-		}
-		return doGetChildren(object);
-	}
-	
-	protected void updateCachedChildren(Collection children) {
-//		if(isRolledUp()) {
-//			if(cachedRollupChildren == null) {
-//				cachedRollupChildren = new ArrayList(children);
-//			}
-//			else {
-//				cachedRollupChildren.clear();
-//				cachedRollupChildren.addAll(children);
-//			}
-//		}
-//		else {
-//			if(cachedChildren == null) {
-//				cachedChildren = new ArrayList(children);
-//			}
-//			else {
-//				cachedChildren.clear();
-//				cachedChildren.addAll(children);
-//			}
-//		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getChildrenFromCache()
-	 */
-	public Collection getChildrenFromCache() {
-		if(cachedChildren == null) {
-			getChildren(target);
-		}
-		return cachedChildren;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getRollupChildrenFromCache()
-	 */
-	public Collection getRollupChildrenFromCache() {
-		if(cachedRollupChildren == null) {
-			boolean oldRolledUp = rolledUp;
-			try {
-				rolledUp = true;
-				getChildren(target);
-			}
-			finally {
-				rolledUp = oldRolledUp;
-			}			
-		}
-		return cachedRollupChildren;
-	}
-	
-	private BreakdownElementWrapperItemProvider findWrapper(Object owner, Object value) {
-		// find if a wrapper already exist for the given value and owner
-		//
-		Object adapter = adapterFactory.adapt(value,
-				ITreeItemContentProvider.class);
-		BreakdownElementWrapperItemProvider wrapper = null;
-		if (adapter instanceof IBSItemProvider) {
-			List listeners = ((IBSItemProvider) adapter).getListeners();
-			if (listeners != null) {
-				find_wrapper_loop: for (Iterator iter = listeners.iterator(); iter
-						.hasNext();) {
-					Object element = (Object) iter.next();
-					if (element instanceof BreakdownElementWrapperItemProvider) {
-						wrapper = (BreakdownElementWrapperItemProvider) element;
-						if (wrapper.getValue() == value
-								&& wrapper.getParent(value) == owner) {
-							break find_wrapper_loop;
-						} else {
-							wrapper = null;
-						}
-					}
-				}
-			}
-		}
-		return wrapper;
-	}
-
-	private List wrapInherited(Activity owner, Collection breakdownElements) {
-		if (wrappers == null) {
-			wrappers = new Disposable();
-		}	
-		return wrap(owner, breakdownElements, true, false, wrappers);
-	}
-	
-	private List wrapContributed(Activity owner, Collection breakdownElements) {
-		if(contributedWrappers == null) {
-			contributedWrappers = new Disposable();
-		}
-		return wrap(owner, breakdownElements, false, true, contributedWrappers);
-	}
-	
-	private IWrapperItemProviderFactory getWrapperItemProviderFactory() {
-		IWrapperItemProviderFactory factory = null;
-		if(adapterFactory instanceof IWrapperItemProviderFactoryProvider) {
-			factory = ((IWrapperItemProviderFactoryProvider)adapterFactory).getWrapperItemProviderFactory();
-		}
-		if(factory == null) {
-			factory = IBreakdownElementWrapperItemProviderFactory.INSTANCE;
-		}
-		return factory;
-	}
-	
-	private List wrap(Activity owner, Collection breakdownElements, boolean inherited, boolean contributed, Disposable wrappers) {
-		ArrayList wrapperList = new ArrayList();
-		IWrapperItemProviderFactory wrapperFactory = getWrapperItemProviderFactory();
-		for (Iterator iter = breakdownElements.iterator(); iter.hasNext();) {
-			Object object = iter.next();
-			Object unWrapped = TngUtil.unwrap(object);
-			if (unWrapped instanceof BreakdownElement) {
-				BreakdownElement e = (BreakdownElement) unWrapped;
-				if (!TngUtil.isBase(owner.getBreakdownElements(), e)) {
-					Object child = getWrapper(owner, e, wrappers);
-					if(child == null) {
-						child = wrapperFactory.createWrapper(e, owner, adapterFactory);
-						if(child instanceof BreakdownElementWrapperItemProvider) {
-							BreakdownElementWrapperItemProvider beWrapper = (BreakdownElementWrapperItemProvider) child;
-							if(inherited) {
-								beWrapper.isInherited = true;
-							}
-							else if(contributed) {
-								beWrapper.contributed = true;
-								if(object instanceof BreakdownElementWrapperItemProvider
-										&& ((BreakdownElementWrapperItemProvider)object).isInherited()) {
-									beWrapper.isInherited = true;
-								}
-							}
-						}
-					}
-					else {
-						wrappers.remove(child);
-					}
-					wrapperList.add(child);
-				}
-			}
-		}
-		wrappers.dispose();
-		wrappers.addAll(wrapperList);
-		return wrapperList;
-	}
-	
-	private static Object getWrapper(Activity owner, BreakdownElement e, Collection wrappers) {
-		for (Iterator iter = wrappers.iterator(); iter.hasNext();) {
-			IWrapperItemProvider wrapper = (IWrapperItemProvider) iter.next();
-			if(wrapper.getOwner() == owner && wrapper.getValue() == e) {
-				return wrapper;
-			}
-		}
-		return null;
-	}
-	
-	protected Adapter createBaseListener() {
-		if (baseListener == null) {
-			baseListener = new AdapterImpl() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-				 */
-				public void notifyChanged(final Notification notification) {
-					Activity act = (Activity) BSActivityItemProvider.this
-							.getTarget();
-					switch (notification.getFeatureID(Activity.class)) {
-					case UmaPackage.ACTIVITY__PRESENTATION_NAME:
-						if (ProcessUtil.isExtendingOrLocallyContributing(act)) {
-							fireNotifyChanged(new ViewerNotification(
-									notification, act, false, true));
-						}
-						break;
-
-					case UmaPackage.ACTIVITY__NAME:
-						if (act.getVariabilityBasedOnElement() != null) {
-							fireNotifyChanged(new ViewerNotification(
-									notification, act, false, true));
-						}
-						break;
-
-					case UmaPackage.ACTIVITY__SUPPRESSED:
-						fireNotifyChanged(new ViewerNotification(notification,
-								act, true, false));
-						break;
-					case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-						fireNotifyChanged(new ViewerNotification(notification,
-								act, true, true));
-						refreshAffectedViewers();
-						break;
-
-					case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS: {
-						if(handleReplaceBreakdownElement(notification)) {
-							break;
-						}
-						List list = getAffectedChildren(notification);
-						if (!list.isEmpty()) {
-							boolean updateLabel = refreshChildrenData(
-									notification, list);
-
-							// forward notification
-							//
-							fireNotifyChanged(new ViewerNotification(
-									notification, act, true, updateLabel));
-
-							// ProcessUtil.refreshViewer(getRootAdapterFactory(),
-							// (Process) getTopItem());
-							refreshAffectedViewers();
-						}
-
-						break;
-					}
-					}
-				}
-			};
-		}
-
-		return baseListener;
-	}
-
-	protected Activity listenToBaseActivity() {
-		Activity act = (Activity) target;
-		if (!ProcessUtil.isExtendingOrLocallyContributing(act)) {
-			return null;
-		}
-		Activity baseAct;
-		if(variabilityInfo != null) {
-			if(variabilityInfo.getInheritanceList().size() > 1) {
-				baseAct = (Activity) variabilityInfo.getInheritanceList().get(1);
-			}			
-			else {
-				baseAct = (Activity) configurator.resolve(act.getVariabilityBasedOnElement());
-			}
-		}
-		else {
-			baseAct = (Activity) act.getVariabilityBasedOnElement();
-		}
-		if (baseAct == null) {
-			return null;
-		}
-		
-		createBaseListener();
-		
-		// remove baseListener from old base, if there is any
-		//
-		EObject oldBase = (EObject) baseListener.getTarget();
-		if(oldBase != null) {
-			oldBase.eAdapters().remove(baseListener);
-		}
-		
-		if (!baseAct.eAdapters().contains(baseListener)) {
-			baseAct.eAdapters().add(baseListener);
-		}
-
-		Object ip = adapterFactory.adapt(baseAct, ITreeItemContentProvider.class);
-		if(ip instanceof BSActivityItemProvider) {
-			BSActivityItemProvider adapter = (BSActivityItemProvider) ip;
-			adapter.listenToBaseActivity();
-		}
-		else {
-			System.out.println();
-		}
-		return baseAct;
-	}
-
-	protected Collection addInherited(Object object, List myChildren) {
-		if (object instanceof Activity) {
-			Activity act = (Activity) object;
-			Activity baseAct = listenToBaseActivity();
-			if (baseAct != null) {
-				VariabilityType extendType = act.getVariabilityType();
-				if (extendType == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-					return myChildren;
-				} else if (extendType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL
-						|| extendType == VariabilityType.EXTENDS_LITERAL) {
-					BSActivityItemProvider adapter = (BSActivityItemProvider) getRootAdapterFactory()
-						.adapt(baseAct, ITreeItemContentProvider.class);
-					List allChildren;					
-					boolean oldRolledUp = adapter.isRolledUp();
-					try {
-						if(oldRolledUp) {
-							adapter.basicSetRolledUp(false);
-						}
-						allChildren = wrapInherited(act, adapter.getChildren(baseAct));
-					}
-					finally {
-						if(oldRolledUp) {
-							adapter.basicSetRolledUp(true);
-						}
-					}
-//					// go thru own children list and insert it to the combined
-//					// child list at the right place.
-//					//
-//					for (Iterator iter = myChildren.iterator(); iter.hasNext();) {
-//						BreakdownElement element = (BreakdownElement) iter
-//								.next();
-//						TngUtil.addTo(allChildren, element, object, TngUtil
-//								.getBestAdapterFactory(adapterFactory));
-//					}
-					if(allChildren.isEmpty()) {
-						return myChildren;
-					}
-					else {
-						TngUtil.addAllTo(allChildren, myChildren);
-						return allChildren;
-					}
-				}
-			}
-		}
-		return myChildren;
-	}
-
-	/**
-	 * Checks if there is no descriptor in <code>children</code> referring to
-	 * the same object as the specified descriptor <code>child</code> does.
-	 * 
-	 * @param children
-	 * @param child
-	 * @return true if no descriptor is found in the children list that refers
-	 *         to the same object as the specified child does, false otherwise.
-	 */
-	protected boolean isNewDescriptor(List children, Object child) {
-		return findDescriptor(children, child) == null;
-	}
-	
-	protected Object findDescriptor(List children, Object child) {
-		Object obj = getObject((Descriptor) TngUtil.unwrap(child));
-		if (obj == null)
-			return null;
-		for (int i = children.size() - 1; i > -1; i--) {
-			Object o = children.get(i);
-			if (obj == getObject((Descriptor) TngUtil.unwrap(o)))
-				return o;
-		}
-		return null;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.command.CreateChildCommand.Helper#getCreateChildImage(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		// return
-		// TngEditPlugin.INSTANCE.getImage("full/ctool16/CreateActivity_breakdownElements_Activity");
-		return getImage(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createRemoveCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection)
-	 */
-	protected Command createRemoveCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection) {
-		return super.createRemoveCommand(domain, owner, feature, collection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#getItemProvider(org.eclipse.emf.ecore.EObject)
-	 */
-	public IBSItemProvider getItemProvider(EObject eObj) {
-		return (IBSItemProvider) TngUtil
-				.getAdapter(eObj, IBSItemProvider.class);
-	}
-
-	public void setParent(Object object) {
-		parent = object;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if(parent == null) {
-			if(target instanceof Activity) {
-				return ((Activity)target).getSuperActivities();
-			}
-		}
-		return parent;
-	}
-
-	/**
-	 * Gets the list of children that had been affected after a an ADD, REMOVE,
-	 * or MOVE operation.
-	 */
-	protected List getAffectedChildren(Notification notification) {
-		return ProcessUtil.getAffectedElements(notification, childFilter);
-	}
-
-	protected boolean refreshChildrenData(Notification notification,
-			List affectedChildren) {
-		return false;
-	}
-
-	protected void doRefreshChildren(Notification notification,
-			List affectedChildren) {
-		refreshChildrenData(notification, affectedChildren);
-
-		Process topAct = (Process) getTopItem();
-		AdapterFactory rootAdapterFactory = getRootAdapterFactory();
-		ProcessUtil.refreshViewer(rootAdapterFactory, topAct);
-	}
-
-	protected void refreshChildren(final Notification notification,
-			final List newOrOldChildren) {
-		if (!newOrOldChildren.isEmpty()) {
-			Runnable runnable = new Runnable() {
-
-				public void run() {
-					doRefreshChildren(notification, newOrOldChildren);
-				}
-
-			};
-			UserInteractionHelper.getUIHelper().runSafely(runnable, false);
-		}
-	}
-
-	protected void refreshAffectedViewers() {
-		Runnable runnable = new Runnable() {
-
-			public void run() {
-				doRefreshAffectedViewers();
-			}
-
-		};
-		UserInteractionHelper.getUIHelper().runSafely(runnable, false);
-	}
-
-	protected void doRefreshAffectedViewers() {
-
-	}
-	
-	protected boolean handlePredecessorListChange(Notification notification) {
-		return TngUtil.handlePredecessorListChange(this, notification);
-	}
-	
-	protected boolean handleReplaceBreakdownElement(Notification notification) {
-		if(notification.getEventType() == Notification.SET && notification.getNewValue() != notification.getOldValue()) {
-			if(notification.getNewValue() instanceof WorkBreakdownElement) {
-				WorkBreakdownElement e = (WorkBreakdownElement) notification.getNewValue();
-				if(!AssociationHelper.getLinkToSuccessor(e).isEmpty()) {
-					ProcessUtil.refreshPredeccessorLists(adapterFactory, (Process) getTopItem());
-				}
-			}
-			fireNotifyChanged(new ViewerNotification(notification,
-					getTarget(), true, false));
-			refreshAffectedViewers();
-			return true;
-		}
-		return false;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		if (handlePredecessorListChange(notification))
-			return;
-
-		switch (notification.getFeatureID(Activity.class)) {
-		case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-			if(handleReplaceBreakdownElement(notification)) {
-				return;
-			}
-			List newOrOldChildren = getAffectedChildren(notification);
-			if (!newOrOldChildren.isEmpty()) {
-				switch (notification.getEventType()) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-					createOrMovePackageFor(newOrOldChildren);
-					break;
-				}
-
-				fireNotifyChanged(new ViewerNotification(notification,
-						notification.getNotifier(), true, false));
-
-				// refreshChildren(notification, newOrOldChildren);
-
-				refreshAffectedViewers();
-			}
-			return;
-		case UmaPackage.ACTIVITY__SUPPRESSED:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, true));
-			return;
-		case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-		case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, true));
-
-			// ProcessUtil.refreshViewer(getRootAdapterFactory(), (Process)
-			// getTopItem());
-
-			refreshAffectedViewers();
-
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * @param newOrOldChildren
-	 */
-	protected void createOrMovePackageFor(List<?> newChildren) {
-		ProcessPackage pkg = (ProcessPackage) ((EObject) target).eContainer();
-		if(pkg == null) {
-			return;
-		}
-		for (Object element : newChildren) {
-			if (element instanceof Activity) {
-				Activity act = (Activity) element;
-				if (act.eContainer() == null) {
-					// create new ProcessPackage for the activity
-					//
-					ProcessPackage newPkg = UmaFactory.eINSTANCE
-							.createProcessPackage();
-					newPkg.setName(act.getName());
-					pkg.getChildPackages().add(newPkg);
-					newPkg.getProcessElements().add(element);
-				} else {
-					// Check if the activity's ProcessPackage is at the right
-					// place.
-					// If not, move it to the right ProcessComponent.
-					//
-					ProcessPackage oldPkg = (ProcessPackage) act.eContainer();
-					if (oldPkg.eContainer() != pkg) {
-						pkg.getChildPackages().add(oldPkg);
-					}
-				}
-			} else {
-				pkg.getProcessElements().add(element);
-			}
-		}
-	}
-
-	private static void getAllBreakdownElements(Set set, BreakdownElement e) {
-		boolean ret = set.add(e);
-		if (ret && (e instanceof Activity)) {
-			for (Iterator iter = ((Activity) e).getBreakdownElements()
-					.iterator(); iter.hasNext();) {
-				BreakdownElement element = (BreakdownElement) iter.next();
-				getAllBreakdownElements(set, element);
-			}
-		}
-	}
-
-	/**
-	 * Refresh the comma-separated list of predecessor IDs in the viewer
-	 * 
-	 * @param affectedBreakdownElements
-	 */
-	private void refreshPredecessors(Notification msg,
-			List affectedBreakdownElements) {
-
-		Set refreshList = new HashSet();
-		Set allBreakdownElements = new HashSet();
-		for (Iterator iter = affectedBreakdownElements.iterator(); iter
-				.hasNext();) {
-			BreakdownElement e = (BreakdownElement) iter.next();
-			if (msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.REMOVE_MANY) {
-				setParentFor(e, null);
-			}
-			getAllBreakdownElements(allBreakdownElements, e);
-		}
-		// System.out.println("BSActivityItemProvider.refreshPredecessors():
-		// allBreakdownElements="+allBreakdownElements);
-		for (Iterator iterator = allBreakdownElements.iterator(); iterator
-				.hasNext();) {
-			BreakdownElement element = (BreakdownElement) iterator.next();
-			for (Iterator iterator1 = AssociationHelper.getLinkToSuccessor(
-					element).iterator(); iterator1.hasNext();) {
-				WorkOrder workOrder = (WorkOrder) iterator1.next();
-				BreakdownElement succ = AssociationHelper
-						.getSuccessor(workOrder);
-				if (!allBreakdownElements.contains(succ)) {
-					refreshList.add(succ);
-				}
-			}
-		}
-
-		// System.out.println("BSActivityItemProvider.refreshPredecessors():
-		// refreshList=" + refreshList);
-
-		for (Iterator iter = refreshList.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			fireNotifyChanged(new ViewerNotification(msg, child, false, true));
-		}
-	}
-
-	/**
-	 * @param activity
-	 */
-	private void createPackageFor(Activity activity, EObject parentActivity) {
-		ProcessPackage parent = (ProcessPackage) parentActivity.eContainer();
-		ProcessPackage newPkg = UmaFactory.eINSTANCE.createProcessPackage();
-		newPkg.setName(activity.getName());
-		parent.getChildPackages().add(newPkg);
-		ArrayList breakdownElements = new ArrayList();
-		breakdownElements.add(activity);
-		breakdownElements.addAll(activity.getBreakdownElements());
-		newPkg.getProcessElements().addAll(breakdownElements);
-	}
-
-	protected String getColumnName(int columnIndex) {
-		AdapterFactory rootAdapterFactory = getRootAdapterFactory();
-		if (rootAdapterFactory instanceof IColumnAware) {
-			Map columnIndexToNameMap = ((IColumnAware) rootAdapterFactory)
-					.getColumnIndexToNameMap();
-			if (columnIndexToNameMap != null) {
-				return (String) columnIndexToNameMap.get(new Integer(
-						columnIndex));
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object,
-	 *      int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		String colName = getColumnName(columnIndex);
-		return TngUtil.getColumnImage(object, colName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object,
-	 *      int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		String colName = getColumnName(columnIndex);
-		return getAttribute(object, colName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setTopItem(java.lang.Object)
-	 */
-	public void setTopItem(Object top) {
-		topItem = top;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isRolledUp()
-	 */
-	public boolean isRolledUp() {
-		return rolledUp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setRolledUp(boolean)
-	 */
-	public void setRolledUp(boolean b) {
-		rolledUp = b;
-		if (!rolledUp) {
-			// user roll down this activity, set rolledUp flag of all its
-			// offstring to false
-			//
-			Iterator iter = new AbstractTreeIterator(target, false) {
-
-				/**
-				 * Comment for <code>serialVersionUID</code>
-				 */
-				private static final long serialVersionUID = -7840687264753640250L;
-
-				protected Iterator getChildren(Object object) {
-					ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-							.adapt(object, ITreeItemContentProvider.class);
-					return adapter.getChildren(object).iterator();
-				}
-
-			};
-			while (iter.hasNext()) {
-				Object child = (Object) iter.next();
-				Object adapter = adapterFactory.adapt(child,
-						ITreeItemContentProvider.class);
-				if (adapter instanceof IBSItemProvider) {
-					((IBSItemProvider) adapter).setRolledUp(false);
-				}
-			}
-		}
-	}
-
-	public GraphicalData getGraphicalData() {
-		return graphicalData;
-	}
-
-	public void setGraphicalData(GraphicalData data) {
-		graphicalData = data;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getAttribute(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		return ProcessUtil.getAttribute(object, property, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setAttribute(java.lang.Object,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public void setAttribute(Object object, String prop, String txt) {
-		Activity e = (Activity) object;
-		ProcessUtil.setAttribute(e, prop, txt);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createCreateChildCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int,
-	 *      java.util.Collection)
-	 */
-	protected Command createCreateChildCommand(EditingDomain domain,
-			EObject owner, EStructuralFeature feature, Object value, int index,
-			Collection collection) {
-		if (value instanceof Iteration) {
-			((Iteration) value).setIsRepeatable(Boolean.TRUE);
-		}
-		return super.createCreateChildCommand(domain, owner, feature, value,
-				index, collection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getListeners()
-	 */
-	public List getListeners() {
-		if (changeNotifier == null)
-			return null;
-		return Collections.unmodifiableList((List) changeNotifier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getPredecessors()
-	 */
-	public PredecessorList getPredecessors() {
-		if (predecessors == null) {
-			predecessors = new PredecessorList(TngUtil
-					.getBestAdapterFactory(adapterFactory), target);
-		}
-		return predecessors;
-	}
-
-	public boolean isFirstElement(Object obj) {
-		return ProcessUtil.isFirstElement(getRootAdapterFactory(), this, obj);
-	}
-
-	public boolean isLastElement(Object obj) {
-		return ProcessUtil.isLastElement(getRootAdapterFactory(), this, obj);
-	}
-
-	public void moveUp(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveUp((Activity) parent, obj, getEClasses(), actionMgr);
-		}
-	}
-
-	public void moveDown(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveDown((Activity) parent, obj, getEClasses(), actionMgr);
-		}
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createAddCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Collection collection, int index) {
-		return new ActivityAddCommand((AddCommand) super.createAddCommand(
-				domain, owner, feature, collection, index));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		Object img = TngUtil.getImage(object);
-		return img != null ? img : super.getImage(object);
-	}
-
-	public IFilter getChildFilter() {
-		return childFilter;
-	}
-
-	public void setRefreshAllIDsRequired(boolean b) {
-		refreshAllIDsRequired = b;
-	}
-
-	public boolean isRefreshAllIDsRequired() {
-		return refreshAllIDsRequired;
-	}
-
-	public IFilter getFilter() {
-		return this.filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-		if(filter instanceof IConfigurator) {
-			configurator = (IConfigurator)filter;
-		}
-		else {
-			configurator = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
-	 */
-	public void setLabel(String label) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	public IResourceAwareCommand createDropCommand(Object owner,
-			List dropElements) {
-		return null;
-	}
-	
-	public void basicSetRolledUp(boolean b) {
-		rolledUp = b;
-	}
-	
-	/**
-	 * @return the enableVariabilityInfo
-	 */
-	public boolean isEnableVariabilityInfo() {
-		return enableVariabilityInfo;
-	}
-
-	/**
-	 * @param enableVariabilityInfo the enableVariabilityInfo to set
-	 */
-	public void setEnableVariabilityInfo(boolean enableVariabilityInfo) {
-		this.enableVariabilityInfo = enableVariabilityInfo;
-	}
-	
-	private class MoveCommandEx extends MoveCommand implements IResourceAwareCommand {
-
-		private Set<Resource> modifiedResources;
-
-		public MoveCommandEx(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value, int index) {
-			super(domain, owner, feature, value, index);
-		}				
-		
-		@Override
-		public void doExecute() {
-			// translate view index to index in breakdown elements list
-			//
-			List children = (List) getChildren(getTarget());
-			Object child = children.get(index);
-			index = ownerList.indexOf(child);
-			if(index != -1) {
-				super.doExecute();
-			}
-			
-			//TODO: move in between green elements
-		}
-
-		public Collection getModifiedResources() {
-			if(modifiedResources == null) {
-				Resource resource = owner.eResource();
-				if(resource != null) {
-					modifiedResources = Collections.singleton(resource);
-				}
-				else {
-					modifiedResources = Collections.EMPTY_SET;
-				}
-			}
-			return modifiedResources;
-		}
-	}
-	
-	@Override
-	protected Command createMoveCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value, int index) {
-		return new MoveCommandEx(domain, owner, feature, value, index);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BreakdownElementItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BreakdownElementItemProvider.java
deleted file mode 100644
index 405661c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BreakdownElementItemProvider.java
+++ /dev/null
@@ -1,494 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.ICachedChildrenItemProvider;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.command.ResourceAwareDragAndDropCommand;
-import org.eclipse.epf.library.edit.process.command.GenericDropCommand;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-
-/**
- * Base item provider for all breakdown elements
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class BreakdownElementItemProvider extends
-		org.eclipse.epf.uma.provider.BreakdownElementItemProvider implements
-		IProcessItemProvider, IBSItemProvider, ITableItemLabelProvider, ICachedChildrenItemProvider {
-
-	private Object parent;
-
-	private int id;
-
-	private Object topItem;
-
-	private boolean rolledUp;
-
-	private Boolean expanded;
-
-	private PredecessorList predecessors;
-
-	protected ItemProviderAdapter delegateItemProvider;
-	
-	protected List cachedChildren;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public BreakdownElementItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	public void dispose() {
-		if (predecessors != null) {
-			predecessors.dispose();
-		}
-		if(cachedChildren != null) {
-			cachedChildren.clear();
-			cachedChildren = null;
-		}
-		super.dispose();
-	}
-
-	public List getPropertyDescriptors(Object object) {
-		if (delegateItemProvider != null) {
-			return delegateItemProvider.getPropertyDescriptors(object);
-		}
-		return super.getPropertyDescriptors(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.BreakdownElementItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isExpanded()
-	 */
-	public Boolean isExpanded() {
-		return expanded;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setExpanded(boolean)
-	 */
-	public void setExpanded(Boolean b) {
-		expanded = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setParent(java.lang.Object)
-	 */
-	public void setParent(Object obj) {
-		parent = obj;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object object) {
-		if (parent != null) {
-			return parent;
-		}
-		if(object instanceof BreakdownElement) {
-			return ((BreakdownElement)object).getSuperActivities();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#getId()
-	 */
-	public int getId() {
-		return id;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setId(int)
-	 */
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#getTopItem()
-	 */
-	public Object getTopItem() {
-		Object parent = getParent(target);
-		if (topItem == null && parent != null) {
-			IBSItemProvider adapter = (IBSItemProvider) getRootAdapterFactory()
-					.adapt(parent, ITreeItemContentProvider.class);
-			if (adapter != null) {
-				Object top = adapter.getTopItem();
-				if (top == null && parent instanceof Process
-						&& ((Process) parent).getSuperActivities() == null) {
-					top = parent;
-					adapter.setTopItem(top);
-				}
-				return top;
-			}
-		}
-		return topItem;
-	}
-
-	protected String getColumnName(int columnIndex) {
-		AdapterFactory rootAdapterFactory = getRootAdapterFactory();
-		if (rootAdapterFactory instanceof IColumnAware) {
-			Map columnIndexToNameMap = ((IColumnAware) rootAdapterFactory)
-					.getColumnIndexToNameMap();
-			if (columnIndexToNameMap != null) {
-				return (String) columnIndexToNameMap.get(new Integer(
-						columnIndex));
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object,
-	 *      int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// String colName = (String) columnIndexToNameMap.get(new
-		// Integer(columnIndex));
-		String colName = getColumnName(columnIndex);
-		return TngUtil.getColumnImage(object, colName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object,
-	 *      int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		// String colName = (String) columnIndexToNameMap.get(new
-		// Integer(columnIndex));
-		String colName = getColumnName(columnIndex);
-		return getAttribute(object, colName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setTopItem(java.lang.Object)
-	 */
-	public void setTopItem(Object top) {
-		topItem = top;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isRolledUp()
-	 */
-	public boolean isRolledUp() {
-		return rolledUp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setRolledUp(boolean)
-	 */
-	public void setRolledUp(boolean b) {
-		rolledUp = b;
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// com.ibm.library.edit.process.IBSItemProvider#setColumnIndexToNameMap(java.util.Map)
-	// */
-	// public void setColumnIndexToNameMap(Map map) {
-	// if (map != null)
-	// {
-	// columnIndexToNameMap = map;
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getAttribute(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		return ProcessUtil.getAttribute(object, property, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setAttribute(java.lang.Object,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public void setAttribute(Object object, String prop, String txt) {
-		WorkBreakdownElement e = (WorkBreakdownElement) object;
-		if (prop == IBSItemProvider.COL_NAME) {
-			e.setName(txt);
-		} else if (prop == IBSItemProvider.COL_PREDECESSORS) {
-		} else if (prop == IBSItemProvider.COL_IS_EVENT_DRIVEN) {
-			e.setIsEventDriven(Boolean.valueOf(txt));
-		} else if (prop == IBSItemProvider.COL_IS_ONGOING) {
-			e.setIsOngoing(Boolean.valueOf(txt));
-		} else if (prop == IBSItemProvider.COL_IS_REPEATABLE) {
-			e.setIsRepeatable(Boolean.valueOf(txt));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getListeners()
-	 */
-	public List getListeners() {
-		if (changeNotifier == null)
-			return null;
-		return Collections.unmodifiableList((List) changeNotifier);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getPredecessors()
-	 */
-	public PredecessorList getPredecessors() {
-		if (predecessors == null) {
-			predecessors = new PredecessorList(TngUtil
-					.getBestAdapterFactory(adapterFactory), target);
-		}
-		return predecessors;
-	}
-
-	public boolean isFirstElement(Object obj) {
-		return ProcessUtil.isFirstElement(getRootAdapterFactory(), this, obj);
-
-		// Object parent = this.getParent(obj);
-		// if ((parent != null) && (parent instanceof Activity))
-		// {
-		// Activity activity = (Activity) this.getParent(obj);
-		// List elements = getFilteredBreakdownElements(activity, obj);
-		//			
-		// // if it's first element, return true
-		// if (elements.get(0).equals(obj))
-		// {
-		// return true;
-		// }
-		// else return false;
-		// }
-		//		
-		// return true;
-	}
-
-	public boolean isLastElement(Object obj) {
-		return ProcessUtil.isLastElement(getRootAdapterFactory(), this, obj);
-
-		// Object parent = this.getParent(obj);
-		// if ((parent != null) && (parent instanceof Activity))
-		// {
-		// Activity activity = (Activity) this.getParent(obj);
-		// List elements = getFilteredBreakdownElements(activity, obj);
-		//			
-		// // if it's last element, return true
-		// if (elements.get(elements.size() - 1).equals(obj))
-		// {
-		// return true;
-		// }
-		// else return false;
-		// }
-		//		
-		// return true;
-
-	}
-
-	public void moveUp(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveUp((Activity) parent, obj, getEClasses(), actionMgr);
-
-		}
-	}
-
-	public void moveDown(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveDown((Activity) parent, obj, getEClasses(), actionMgr);
-		}
-	}
-
-	public Collection getEClasses() {
-		// implemented by subclasses
-		return null;
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.DescriptorItemProvider#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		if (delegateItemProvider != null) {
-			return delegateItemProvider.getImage(object);
-		}
-		return super.getImage(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.DescriptorItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		if (TngUtil.handlePredecessorListChange(this, notification))
-			return;
-
-		super.notifyChanged(notification);
-	}
-
-	protected void refreshChildren(Notification notification,
-			Collection newOrOldChildren) {
-		if (!newOrOldChildren.isEmpty()) {
-			// // recalculate the IDs of breakdown elements and refresh them
-			// //
-			// Activity topAct = (Activity) getTopItem();
-			// AdapterFactory adapterFactory = getRootAdapterFactory();
-			// ProcessUtil.updateIDs(adapterFactory, new
-			// AdapterFactoryTreeIterator(adapterFactory, topAct), topAct);
-
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-	}
-
-	public GenericDropCommand.ElementAdapter createDropAdapter() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	public IResourceAwareCommand createDropCommand(Object owner,
-			List dropElements) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getChildrenFromCache()
-	 */
-	public Collection getChildrenFromCache() {
-		if(cachedChildren == null) {
-			getChildren(target);
-		}
-		return cachedChildren;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getRollupChildrenFromCache()
-	 */
-	public Collection getRollupChildrenFromCache() {
-		return Collections.EMPTY_LIST;
-	}
-
-	@Override
-	protected Command createDragAndDropCommand(EditingDomain domain, Object owner, float location, int operations, int operation, Collection collection) {
-		return new ResourceAwareDragAndDropCommand(domain, owner, location, operations,
-				operation, collection);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BreakdownElementWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BreakdownElementWrapperItemProvider.java
deleted file mode 100644
index 584ab68..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BreakdownElementWrapperItemProvider.java
+++ /dev/null
@@ -1,252 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class BreakdownElementWrapperItemProvider extends
-		DescribableElementWrapperItemProvider {
-
-	private boolean isRolledUp;
-
-	private PredecessorList predecessors;
-
-	private Boolean expanded;
-	
-	protected BreakdownElementWrapperItemProvider(Object value,
-			Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, null, CommandParameter.NO_INDEX, adapterFactory);
-		if(value instanceof DescribableElementWrapperItemProvider) {
-			DescribableElementWrapperItemProvider wrapper = (DescribableElementWrapperItemProvider) value;
-			if (value instanceof DelegatingWrapperItemProvider) {
-				feature = ((DelegatingWrapperItemProvider) value).getFeature();
-			}
-			setReadOnly(wrapper.isReadOnly());
-			setRolledUp(wrapper.isRollupChild());
-			isInherited = wrapper.isInherited;
-			contributed = wrapper.contributed;
-		}		
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public BreakdownElementWrapperItemProvider(BreakdownElement value,
-			Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-	
-	/**
-	 * @param activity
-	 * @param owner
-	 * @param feature
-	 * @param index
-	 * @param adapterFactory
-	 */
-	public BreakdownElementWrapperItemProvider(BreakdownElement value,
-			Object owner, EStructuralFeature feature, int index,
-			AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isExpanded()
-	 */
-	public Boolean isExpanded() {
-		return expanded;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setExpanded(boolean)
-	 */
-	public void setExpanded(Boolean b) {
-		expanded = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isRolledUp()
-	 */
-	public boolean isRolledUp() {
-		return isRolledUp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setRolledUp(boolean)
-	 */
-	public void setRolledUp(boolean b) {
-		isRolledUp = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getAttribute(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		return ProcessUtil.getAttribute(object, property, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setAttribute(java.lang.Object,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public void setAttribute(Object object, String property, String textValue) {
-		ProcessUtil.setAttribute((WorkBreakdownElement) TngUtil.unwrap(object),
-				property, textValue);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.DescribableElementWrapperItemProvider#doCreateWrapper(java.lang.Object, java.lang.Object, org.eclipse.emf.common.notify.AdapterFactory)
-	 */
-	protected IWrapperItemProvider doCreateWrapper(Object value, Object owner, AdapterFactory adapterFactory) {
-		return IBreakdownElementWrapperItemProviderFactory.INSTANCE
-				.createWrapper(value, owner, adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object,
-	 *      int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if (delegateItemProvider instanceof ITableItemLabelProvider) {
-			return ((ITableItemLabelProvider) delegateItemProvider)
-					.getColumnImage(object, columnIndex);
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getPredecessors()
-	 */
-	public PredecessorList getPredecessors() {
-		if (predecessors == null) {
-			Object obj = TngUtil.unwrap(this);
-			if (obj instanceof WorkBreakdownElement) {
-				predecessors = new PredecessorList(TngUtil
-						.getBestAdapterFactory(adapterFactory), this);
-			} else {
-				predecessors = PredecessorList.EMPTY_LIST;
-			}
-		}
-		return predecessors;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#createCommand(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Class,
-	 *      org.eclipse.emf.edit.command.CommandParameter)
-	 */
-	public Command createCommand(Object object, EditingDomain domain,
-			Class commandClass, CommandParameter commandParameter) {
-		// System.out
-		// .println("BreakdownElementWrapperItemProvider.createCommand():");
-		// System.out.println(" object: " + object);
-		// System.out.println(" commandClass: " + commandClass);
-		// System.out.println(" commandParameter: " + commandParameter);
-		return super.createCommand(object, domain, commandClass,
-				commandParameter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#getNewChildDescriptors(java.lang.Object,
-	 *      org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object)
-	 */
-	public Collection getNewChildDescriptors(Object object,
-			EditingDomain editingDomain, Object sibling) {
-		return Collections.EMPTY_LIST;
-	}
-
-	public AdapterFactory getAdapterFactory() {
-		return adapterFactory;
-	}
-
-	public boolean isFirstElement(Object obj) {
-		return true;
-	}
-
-	public boolean isLastElement(Object obj) {
-		return true;
-	}
-
-	public List getFilteredBreakdownElements(Object activity, Object obj) {
-		return null;
-	}
-
-	public void moveUp(Object obj, IActionManager actionMgr) {
-
-	}
-
-	public void moveDown(Object obj, IActionManager actionMgr) {
-
-	}
-
-	public Collection getEClasses() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#dispose()
-	 */
-	public void dispose() {
-		if (predecessors != null) {
-			predecessors.dispose();
-		}
-
-		super.dispose();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ComposedBreakdownElementWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ComposedBreakdownElementWrapperItemProvider.java
deleted file mode 100644
index 60396cb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ComposedBreakdownElementWrapperItemProvider.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class ComposedBreakdownElementWrapperItemProvider extends
-		BreakdownElementWrapperItemProvider {
-	private List values = new ArrayList();
-	
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public ComposedBreakdownElementWrapperItemProvider(Object value,
-			Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-		addElement(value);
-	}
-	
-	public List getValues() {
-		return values;
-	}
-
-	public void addElement(Object e) {
-		getValues().add(e);
-	}
-	
-	/**
-	 * Decides if the values of the given property of all elements in this composed wrapper can be merged.
-	 * @param property
-	 * @return
-	 */
-	protected boolean canMerge(String property) {
-		return property == IBSItemProvider.COL_MODEL_INFO;
-	}
-	
-	@Override
-	public String getAttribute(Object object, String property) {
-		if(!values.isEmpty()) {
-			if(canMerge(property)) {
-				UniqueEList modelInfos = new UniqueEList();				
-				for (Iterator iter = values.iterator(); iter.hasNext();) {
-					Object o = iter.next();
-					String info;
-					if(o instanceof IBSItemProvider) {
-						info = ((IBSItemProvider)o).getAttribute(o, property);
-					}
-					else {
-						IBSItemProvider ip = (IBSItemProvider) adapterFactory.adapt(o, ITreeItemContentProvider.class);
-						info = ip.getAttribute(o, property);
-					}
-					if(!StrUtil.isBlank(info)) {
-						modelInfos.add(info);
-					}
-				}
-				if(!modelInfos.isEmpty()) {
-					StringBuffer modelInfo = new StringBuffer((String)modelInfos.get(0));
-					int max = modelInfos.size();
-					for (int i = 1; i < max; i++) {
-						modelInfo.append(',').append(modelInfos.get(i));
-					}
-					return modelInfo.toString();
-				}
-				return ""; //$NON-NLS-1$
-			}
-		}
-		return super.getAttribute(object, property);
-	}
-	
-	@Override
-	public boolean isInherited() {
-		for(int i = values.size() - 1; i > -1; i--) {
-			Object o = values.get(i);
-			if(!(o instanceof DescribableElementWrapperItemProvider) 
-					|| !((DescribableElementWrapperItemProvider)o).isInherited()) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ComposedWPDescriptorWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ComposedWPDescriptorWrapperItemProvider.java
deleted file mode 100644
index 4ba591f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ComposedWPDescriptorWrapperItemProvider.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * @author Phong Nguyen Le - Feb 23, 2006
- * @since  7.0.1
- */
-public class ComposedWPDescriptorWrapperItemProvider extends
-		WorkProductDescriptorWrapperItemProvider {
-
-	private List notifiers;
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public ComposedWPDescriptorWrapperItemProvider(Object value,
-			Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-		if(value instanceof BreakdownElementWrapperItemProvider) {
-			BreakdownElementWrapperItemProvider wrapper = ((BreakdownElementWrapperItemProvider)value);
-			readOnly = wrapper.isReadOnly();
-			isInherited = wrapper.isInherited;
-		}
-		isRollupChild = true;
-	}
-
-	/**
-	 * Adds work product descriptor to the notifier list of this wrapper. The given work product descriptor
-	 * must be linked to the same work product as the delegate value is 
-	 * 
-	 * @param object the work product descriptor or its wrapper
-	 * 
-	 */
-	public void addWorkProductDescriptor(Object object) {
-		WorkProductDescriptor wpd = (WorkProductDescriptor)TngUtil.unwrap(object);
-		WorkProductDescriptor delegateWpd = (WorkProductDescriptor) TngUtil.unwrap(getDelegateValue());
-		if(delegateWpd == wpd) {
-			return;
-		}
-		Object wp = ProcessUtil.getAssociatedElement(delegateWpd);
-		if(wp == null || wp == wpd.getWorkProduct()) {
-			Object itemProvider = getRootAdapterFactory().adapt(wpd, IStructuredItemContentProvider.class);
-			if (itemProvider instanceof IChangeNotifier)
-			{
-				((IChangeNotifier)itemProvider).addListener(this);
-				if(notifiers == null) {
-					notifiers = new UniqueEList();
-				}
-				notifiers.add(itemProvider);
-			}
-		}	
-		
-		if(isInherited && object instanceof BreakdownElementWrapperItemProvider &&
-				!((BreakdownElementWrapperItemProvider)object).isInherited) {
-			this.isInherited = false;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider#dispose()
-	 */
-	public void dispose() {
-		if(notifiers != null) {
-			for (Iterator iter = notifiers.iterator(); iter.hasNext();) {
-				IChangeNotifier notifier = (IChangeNotifier) iter.next();
-				notifier.removeListener(this);
-			}
-			notifiers.clear();
-		}
-		
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		if(notifiers != null && notifiers.contains(notification.getNotifier())) {
-			switch(notification.getEventType()) {
-			case Notification.REMOVING_ADAPTER:
-				if(notification.getOldValue() == this) {
-					fireNotifyChanged(new ViewerNotification(notification, this, false, true));				
-					return;
-				}
-				break;
-			case Notification.SET:
-				switch(notification.getFeatureID(WorkProductDescriptor.class)) {
-				case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-				case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-					fireNotifyChanged(wrapNotification(notification));
-					return;
-				}
-				break;
-			}
-		}
-		super.notifyChanged(notification);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider#getAttribute(java.lang.Object, java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		if(property == IBSItemProvider.COL_MODEL_INFO && getValue() instanceof ComposedBreakdownElementWrapperItemProvider) {
-			String info = ((ComposedBreakdownElementWrapperItemProvider)getValue()).getAttribute(object, property);
-			if(!StrUtil.isBlank(info)) {
-				StringTokenizer tokens = new StringTokenizer(info, ","); //$NON-NLS-1$
-				HashSet infoSet = new HashSet();
-				StringBuffer infos = new StringBuffer();
-				while(tokens.hasMoreTokens()) {
-					String token = tokens.nextToken();
-					if(infoSet.add(token)) {
-						infos.append(token).append(',');
-					}
-				}
-				infos.deleteCharAt(infos.length() - 1);
-				info = infos.toString();
-			}
-			return info;
-		}
-		if(notifiers != null && !notifiers.isEmpty()
-				&& (property == IBSItemProvider.COL_ENTRY_STATE || property == IBSItemProvider.COL_EXIT_STATE)) {
-			StringBuffer strbuf = new StringBuffer();
-			String str = super.getAttribute(object, property);
-			if(!StrUtil.isBlank(str)) {
-				strbuf.append(str);
-			}
-			for (Iterator iter = notifiers.iterator(); iter.hasNext();) {
-				WorkProductDescriptorItemProvider itemProvider = (WorkProductDescriptorItemProvider) iter.next();
-				str = itemProvider.getAttribute(itemProvider.getTarget(), property);
-				if(!StrUtil.isBlank(str)) {
-					if(strbuf.length() > 0) {
-						strbuf.append(',');
-					}
-					strbuf.append(str);
-				}
-			}
-			return strbuf.toString();
-		}
-		return super.getAttribute(object, property);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/CompositeRoleItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/CompositeRoleItemProvider.java
deleted file mode 100644
index 4bafa91..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/CompositeRoleItemProvider.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.process.command.GenericDropCommand;
-import org.eclipse.epf.library.edit.process.command.OBSDragAndDropCommand;
-import org.eclipse.epf.library.edit.process.command.GenericDropCommand.ElementAdapter;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class CompositeRoleItemProvider extends RoleDescriptorItemProvider {
-
-	private ElementAdapter dropAdapter;
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public CompositeRoleItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getCompositeRole_AggregatedRoles());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.DescriptorItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(CompositeRole.class)) {
-		case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#isWrappingNeeded(java.lang.Object)
-	 */
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createWrapper(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int)
-	 */
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		DescribableElementWrapperItemProvider wrapper = new DescribableElementWrapperItemProvider(
-				(DescribableElement) value, object, getRootAdapterFactory());
-		// wrapper.setColumnIndexToNameMap(columnIndexToNameMap);
-		return wrapper;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	// public Collection getChildren(Object object) {
-	// CompositeRole compositeRole = (CompositeRole) object;
-	// AdapterFactory adapterFactory = getRootAdapterFactory();
-	// Collection children = new ArrayList();
-	// for (Iterator iter = compositeRole.getAggregatedRoles().iterator();
-	// iter.hasNext();) {
-	// children.add(new
-	// DescribableElementWrapperItemProvider((DescribableElement) iter.next(),
-	// this, adapterFactory));
-	// }
-	// return children;
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createDragAndDropCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      java.lang.Object, float, int, int, java.util.Collection)
-	 */
-	protected Command createDragAndDropCommand(EditingDomain domain,
-			Object owner, float location, int operations, int operation,
-			Collection collection) {
-		return new OBSDragAndDropCommand(domain, owner, location, operations,
-				operation, collection);
-	}
-
-	public GenericDropCommand.ElementAdapter createDropAdapter() {
-		if (dropAdapter == null) {
-			dropAdapter = new GenericDropCommand.ElementAdapter() {
-
-				public Object adapt(Object dropElement) {
-					if (dropElement instanceof Role
-							&& !((CompositeRole) getTarget())
-									.getAggregatedRoles().contains(dropElement)) {
-						return dropElement;
-					}
-					return null;
-				}
-
-			};
-		}
-		return dropAdapter;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/CompositeRoleWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/CompositeRoleWrapperItemProvider.java
deleted file mode 100644
index 75062bf..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/CompositeRoleWrapperItemProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.CompositeRole;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class CompositeRoleWrapperItemProvider extends
-		RoleDescriptorWrapperItemProvider {
-
-	/**
-	 * @param role
-	 * @param owner
-	 * @param feature
-	 * @param index
-	 * @param adapterFactory
-	 */
-	public CompositeRoleWrapperItemProvider(CompositeRole role, Object owner,
-			EStructuralFeature feature, int index, AdapterFactory adapterFactory) {
-		super(role, owner, feature, index, adapterFactory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DeliverableDescriptorWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DeliverableDescriptorWrapperItemProvider.java
deleted file mode 100644
index e22b12a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DeliverableDescriptorWrapperItemProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class DeliverableDescriptorWrapperItemProvider extends
-		WorkProductDescriptorWrapperItemProvider {
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param index
-	 * @param feature
-	 * @param adapterFactory
-	 */
-	public DeliverableDescriptorWrapperItemProvider(
-			WorkProductDescriptor value, Object owner,
-			EStructuralFeature feature, int index, AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescribableElementWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescribableElementWrapperItemProvider.java
deleted file mode 100644
index 7033839..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescribableElementWrapperItemProvider.java
+++ /dev/null
@@ -1,431 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Process;
-
-
-/**
- * Wrapper item provider for DescribleElement
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DescribableElementWrapperItemProvider extends
-		DelegatingWrapperItemProvider implements IBSItemProvider,
-		ITableItemLabelProvider {
-
-	private int id;
-
-	private Object topItem;
-
-	protected boolean readOnly = true;
-	
-	protected boolean isInherited = false;
-	
-	protected boolean contributed = false;
-	
-	protected boolean isRollupChild = false;
-	
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public DescribableElementWrapperItemProvider(DescribableElement value,
-			Object owner, AdapterFactory adapterFactory) {
-		this(value, owner, null, CommandParameter.NO_INDEX, adapterFactory);
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param feature
-	 * @param index
-	 * @param adapterFactory
-	 */
-	public DescribableElementWrapperItemProvider(DescribableElement value,
-			Object owner, EStructuralFeature feature, int index,
-			AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}
-	
-	protected DescribableElementWrapperItemProvider(Object value,
-			Object owner, EStructuralFeature feature, int index,
-			AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}	
-
-	/**
-	 * Checks if this wrapper is read-only
-	 */
-	public boolean isReadOnly() {
-		return readOnly;
-	}
-	
-	/**
-	 * @param readOnly
-	 *            The readOnly to set.
-	 */
-	public void setReadOnly(boolean readOnly) {
-		this.readOnly = readOnly;
-	}	
-
-	/**
-	 * @return the contributed
-	 */
-	public boolean isContributed() {
-		return contributed;
-	}
-
-	public boolean isInherited() {
-		return isInherited;
-	}
-	
-	public boolean isRollupChild() {
-		return isRollupChild;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getId()
-	 */
-	public int getId() {
-		return id;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setId(int)
-	 */
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setParent(java.lang.Object)
-	 */
-	public void setParent(Object obj) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getTopItem()
-	 */
-	public Object getTopItem() {
-		Object parent = getParent(null);
-		if (topItem == null && parent != null) {
-			IBSItemProvider adapter = (IBSItemProvider) getRootAdapterFactory()
-					.adapt(parent, ITreeItemContentProvider.class);
-			if (adapter != null) {
-				Object top = adapter.getTopItem();
-				if (top == null && parent instanceof Process
-						&& ((Process) parent).getSuperActivities() == null) {
-					top = parent;
-					adapter.setTopItem(top);
-				}
-				return top;
-			}
-		}
-		return topItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setTopItem(java.lang.Object)
-	 */
-	public void setTopItem(Object top) {
-		topItem = top;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isRolledUp()
-	 */
-	public boolean isRolledUp() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setRolledUp(boolean)
-	 */
-	public void setRolledUp(boolean b) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isFirstElement(java.lang.Object)
-	 */
-	public boolean isFirstElement(Object obj) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isLastElement(java.lang.Object)
-	 */
-	public boolean isLastElement(Object obj) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getFilteredBreakdownElements(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public List getFilteredBreakdownElements(Object activityObj, Object obj) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#moveUp(java.lang.Object,
-	 *      com.ibm.library.edit.command.IActionManager)
-	 */
-	public void moveUp(Object obj, IActionManager actionMgr) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#moveDown(java.lang.Object,
-	 *      com.ibm.library.edit.command.IActionManager)
-	 */
-	public void moveDown(Object obj, IActionManager actionMgr) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getEClasses()
-	 */
-	public Collection getEClasses() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getAttribute(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		DescribableElement e = (DescribableElement) TngUtil.unwrap(object);
-		if (property == IBSItemProvider.COL_NAME) {
-			return e.getName();
-		} else if (property == IBSItemProvider.COL_ID) {
-			return String.valueOf(id);
-		} else if (property == IBSItemProvider.COL_PRESENTATION_NAME) {
-			String name = e.getPresentationName();
-			if (StrUtil.isBlank(name)) {
-				name = e.getName();
-			}
-			return name;
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setAttribute(java.lang.Object,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public void setAttribute(Object object, String property, String textValue) {
-
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// com.ibm.library.edit.process.IColumnAware#setColumnIndexToNameMap(java.util.Map)
-	// */
-	// public void setColumnIndexToNameMap(Map map) {
-	// if (map != null)
-	// {
-	// columnIndexToNameMap = map;
-	// columnIndexToNameMapChanged = true;
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getPredecessors()
-	 */
-	public PredecessorList getPredecessors() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#isExpanded()
-	 */
-	public Boolean isExpanded() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setExpanded(java.lang.Boolean)
-	 */
-	public void setExpanded(Boolean b) {
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#createWrapper(java.lang.Object,
-	 *      java.lang.Object, org.eclipse.emf.common.notify.AdapterFactory)
-	 */
-	protected IWrapperItemProvider createWrapper(Object value, Object owner,
-			AdapterFactory adapterFactory) {
-		IWrapperItemProvider wip = doCreateWrapper(value, owner, adapterFactory);
-		if(wip instanceof DescribableElementWrapperItemProvider) {
-			DescribableElementWrapperItemProvider wrapper = (DescribableElementWrapperItemProvider) wip;
-			if (value instanceof DelegatingWrapperItemProvider) {
-				wrapper.feature = ((DelegatingWrapperItemProvider) value)
-				.getFeature();
-			}
-			wrapper.setReadOnly(readOnly);
-			wrapper.isRollupChild = isRollupChild;
-			wrapper.isInherited = isInherited;
-			wrapper.contributed = isContributed();
-		}		
-		return wip;
-	}
-	
-	protected IWrapperItemProvider doCreateWrapper(Object value, Object owner,
-			AdapterFactory adapterFactory) {
-		Object e = TngUtil.unwrap(value);
-		if (e instanceof DescribableElement) {
-			DescribableElementWrapperItemProvider wrapper = new DescribableElementWrapperItemProvider(
-					(DescribableElement) e, owner, adapterFactory);
-			return wrapper;
-		}
-		return super.createWrapper(value, owner, adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object,
-	 *      int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if (delegateItemProvider instanceof ITableItemLabelProvider) {
-			return ((ITableItemLabelProvider) delegateItemProvider)
-					.getColumnImage(object, columnIndex);
-		}
-		if (columnIndex == 0
-				&& delegateItemProvider instanceof IItemLabelProvider) {
-			return ((IItemLabelProvider) delegateItemProvider).getImage(object);
-		}
-
-		return null;
-	}
-
-	protected String getColumnName(int columnIndex) {
-		AdapterFactory rootAdapterFactory = getRootAdapterFactory();
-		if (rootAdapterFactory instanceof IColumnAware) {
-			Map columnIndexToNameMap = ((IColumnAware) rootAdapterFactory)
-					.getColumnIndexToNameMap();
-			if (columnIndexToNameMap != null) {
-				return (String) columnIndexToNameMap.get(new Integer(
-						columnIndex));
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object,
-	 *      int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		// String colName = (String) columnIndexToNameMap.get(new
-		// Integer(columnIndex));
-		String colName = getColumnName(columnIndex);
-		return getAttribute(object, colName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#getListeners()
-	 */
-	public List getListeners() {
-		if (changeNotifier == null)
-			return null;
-		return Collections.unmodifiableList((List) changeNotifier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.IMethodElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	public IResourceAwareCommand createDropCommand(Object owner,
-			List dropElements) {
-		return null;
-	}
-
-	@Override
-	public String toString() {
-		Object o = TngUtil.unwrap(this);
-		return super.toString() + " (wrapped object: " + o + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescriptorItemProvider.java
deleted file mode 100644
index 7611f6b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescriptorItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.command.ResourceAwareDragAndDropCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class DescriptorItemProvider extends BreakdownElementItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public DescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#getAttribute(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		if (property == IBSItemProvider.COL_MODEL_INFO) {
-			StringBuffer modelInfo = new StringBuffer();
-			Object e = ProcessUtil.getAssociatedElement((Descriptor) object);
-			if (e instanceof VariabilityElement) {
-				VariabilityElement ve = (VariabilityElement) e;
-				Object base = ve.getVariabilityBasedOnElement();
-				if (base != null) {
-					// look for existing descriptor that is associated with the
-					// base in the activity
-					//
-					Object parent = null;
-					for (parent = getParent(object); parent != null
-							&& !(parent instanceof Activity);) {
-						ITreeItemContentProvider adapter = (ITreeItemContentProvider) getRootAdapterFactory()
-								.adapt(parent, ITreeItemContentProvider.class);
-						parent = adapter.getParent(parent);
-					}
-					if (parent != null) {
-						ITreeItemContentProvider adapter = (ITreeItemContentProvider) getRootAdapterFactory()
-								.adapt(parent, ITreeItemContentProvider.class);
-						Object desc = null;
-						find_descriptor_loop: for (Iterator iter = adapter
-								.getChildren(parent).iterator(); iter.hasNext();) {
-							Object child = TngUtil.unwrap(iter.next());
-							if (child instanceof Descriptor
-									&& ProcessUtil
-											.getAssociatedElement((Descriptor) child) == base) {
-								desc = child;
-								break find_descriptor_loop;
-							}
-						}
-						if (desc != null) {
-							String str = null;
-							if (ve.getVariabilityType() == VariabilityType.EXTENDS_LITERAL) {
-								str = LibraryEditResources.process_extends; 
-							} else if (ve.getVariabilityType() == VariabilityType.REPLACES_LITERAL) {
-								str = LibraryEditResources.process_replaces; 
-							}
-							String name = ((DescribableElement) desc)
-									.getPresentationName();
-							if (str != null)
-								modelInfo.append(MessageFormat.format(str,
-										new Object[] { name }));
-							else
-								modelInfo.append(""); //$NON-NLS-1$
-						}
-					}
-				}
-
-				if (object instanceof WorkProductDescriptor) {
-//					ProcessUtil.getModelInfoForWorkProductDescriptor(modelInfo,
-//							(WorkProductDescriptor) object);
-					ProcessUtil.getWPDModelInfo(modelInfo, object, this);
-				}
-			}
-			return modelInfo.toString(); 
-		}
-		return super.getAttribute(object, property);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IBSItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IBSItemProvider.java
deleted file mode 100644
index 9d6a1f0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IBSItemProvider.java
+++ /dev/null
@@ -1,136 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-
-
-/**
- * This is the base interface of all item providers for breakdown element used
- * by the Process Editor. It defines the constants for column names and methods
- * to support row index, roll-up view, getting/setting breakdown element's
- * attributes, predecessor list...
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IBSItemProvider extends //ILibraryItemProvider,
-		IStatefulItemProvider {
-
-	/** Column ID constants */
-	public static final String COL_NAME = "name"; //$NON-NLS-1$
-
-	public static final String COL_PREFIX = "prefix"; //$NON-NLS-1$
-
-	public static final String COL_ID = "id"; //$NON-NLS-1$
-
-	public static final String COL_PREDECESSORS = "predecessors"; //$NON-NLS-1$
-
-	public static final String COL_IS_REPEATABLE = "is_repeatable"; //$NON-NLS-1$
-
-	public static final String COL_IS_ONGOING = "is_ongoing"; //$NON-NLS-1$
-
-	public static final String COL_IS_EVENT_DRIVEN = "is_event_driven"; //$NON-NLS-1$
-
-	public static final String COL_ENTRY_STATE = "entry_state"; //$NON-NLS-1$
-
-	public static final String COL_EXIT_STATE = "exit_state"; //$NON-NLS-1$
-
-	public static final String COL_TEAMS = "teams"; //$NON-NLS-1$  
-
-	public static final String COL_TYPE = "type"; //$NON-NLS-1$
-
-	public static final String COL_MODEL_INFO = "model_info"; //$NON-NLS-1$
-
-	public static final String COL_PRESENTATION_NAME = "presentation_name"; //$NON-NLS-1$
-
-	public static final String COL_DELIVERABLE = "deliverable"; //$NON-NLS-1$
-
-	public static final String COL_IS_OPTIONAL = "is_optional"; //$NON-NLS-1$
-
-	public static final String COL_IS_PLANNED = "is_planned"; //$NON-NLS-1$
-
-	public static final String COL_HAS_MULTIPLE_OCCURRENCES = "has_multiple_occurrences"; //$NON-NLS-1$
-
-	public static final String[] COLUMNS = { COL_NAME, COL_PREFIX, COL_ID,
-			COL_PREDECESSORS, COL_IS_REPEATABLE, COL_IS_ONGOING,
-			COL_IS_EVENT_DRIVEN, COL_ENTRY_STATE, COL_EXIT_STATE, COL_TEAMS,
-			COL_TYPE, COL_MODEL_INFO, COL_PRESENTATION_NAME, COL_DELIVERABLE };
-	
-	int getId();
-
-	void setId(int id);
-
-	// IBSItemProvider getItemProvider(EObject eObj);
-
-	void setParent(Object obj);
-
-	Object getTopItem();
-
-	void setTopItem(Object top);
-
-	boolean isRolledUp();
-
-	void setRolledUp(boolean b);
-
-	boolean isFirstElement(Object obj);
-
-	boolean isLastElement(Object obj);
-
-	// List getFilteredBreakdownElements(Object activityObj, Object obj);
-
-	void moveUp(Object obj, IActionManager actionMgr);
-
-	void moveDown(Object obj, IActionManager actionMgr);
-
-	Collection getEClasses();
-
-	// GraphicalData getGraphicalData();
-
-	// void setGraphicalData(GraphicalData data);
-
-	/**
-	 * Gets the attribute of the given object as a string.
-	 * 
-	 * @param object
-	 * @param property
-	 *            one of the column ID constants COL_XXX
-	 * @return String value of the attribute
-	 */
-	String getAttribute(Object object, String property);
-
-	/**
-	 * Sets the attribute of the given object
-	 * 
-	 * @param object
-	 * @param property
-	 *            one of the column ID constants COL_XXX
-	 * @param textValue
-	 */
-	void setAttribute(Object object, String property, String textValue);
-
-	List getListeners();
-
-	PredecessorList getPredecessors();
-
-	Boolean isExpanded();
-
-	void setExpanded(Boolean b);
-
-	IResourceAwareCommand createDropCommand(Object owner, List dropElements);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IBreakdownElementWrapperItemProviderFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IBreakdownElementWrapperItemProviderFactory.java
deleted file mode 100644
index 26162d9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IBreakdownElementWrapperItemProviderFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.epf.library.edit.IWrapperItemProviderFactory;
-import org.eclipse.epf.library.edit.process.internal.BreakdownElementWrapperItemProviderFactory;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IBreakdownElementWrapperItemProviderFactory extends IWrapperItemProviderFactory {
-	public static IBreakdownElementWrapperItemProviderFactory INSTANCE = new BreakdownElementWrapperItemProviderFactory();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IColumnAware.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IColumnAware.java
deleted file mode 100644
index 3b3820b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IColumnAware.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Map;
-
-/**
- * Interface used to pass the column index / name map from the user interface to
- * the adapter that implements it so the adapter can provide the correct data
- * for the columns even their index have changed.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IColumnAware {
-
-	Map getColumnIndexToNameMap();
-
-	void setColumnIndexToNameMap(Map map);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IProcessItemProvider.java
deleted file mode 100644
index e4c8468..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/IProcessItemProvider.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IProcessItemProvider {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ItemProviderAdapterFactory.java
deleted file mode 100644
index 4005251..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,265 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IStatefulItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ItemProviderAdapterFactory extends UmaItemProviderAdapterFactory
-		implements IColumnAware {
-
-	private Map columnIndexToNameMap;
-
-	/**
-	 * References to stateful adapters created by this adapter factory
-	 */
-	private Set disposableAdapters = new HashSet();
-
-	/**
-	 * 
-	 */
-	public ItemProviderAdapterFactory() {
-		super();
-		supportedTypes.add(ITableItemLabelProvider.class);
-		// createdAdapters = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new ActivityItemProvider(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createIterationAdapter()
-	 */
-	public Adapter createIterationAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createPhaseAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createBreakdownElementAdapter()
-	 */
-	public Adapter createBreakdownElementAdapter() {
-		return new BreakdownElementItemProvider(this,
-				(ItemProviderAdapter) super.createBreakdownElementAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.DescriptorsAdapterFactory#createDescriptorAdapter()
-	 */
-	public Adapter createDescriptorAdapter() {
-		return new DescriptorItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createDescriptorAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.DescriptorsAdapterFactory#createRoleDescriptorAdapter()
-	 */
-	public Adapter createRoleDescriptorAdapter() {
-		return new RoleDescriptorItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createRoleDescriptorAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.DescriptorsAdapterFactory#createTaskDescriptorAdapter()
-	 */
-	public Adapter createTaskDescriptorAdapter() {
-		return new TaskDescriptorItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createTaskDescriptorAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.DescriptorsAdapterFactory#createWorkProductDescriptorAdapter()
-	 */
-	public Adapter createWorkProductDescriptorAdapter() {
-		return new WorkProductDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createWorkProductDescriptorAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IColumnAware#setColumnIndexToNameMap(java.util.Map)
-	 */
-	public void setColumnIndexToNameMap(Map map) {
-		if (map != null) {
-			columnIndexToNameMap = map;
-		}
-	}
-
-	public Object adapt(Object object, Object type) {
-		Object adapter = super.adapt(object, type);
-		if (adapter instanceof IColumnAware) {
-			((IColumnAware) adapter)
-					.setColumnIndexToNameMap(columnIndexToNameMap);
-		}
-		return adapter;
-	}
-
-	public Adapter adapt(Notifier notifier, Object type) {
-		Adapter adapter = super.adapt(notifier, type);
-		if (adapter instanceof IColumnAware) {
-			((IColumnAware) adapter)
-					.setColumnIndexToNameMap(columnIndexToNameMap);
-		}
-		if (adapter instanceof IStatefulItemProvider
-				&& notifier instanceof EObject
-				&& ((EObject) notifier).eContainer() != null) {
-			disposableAdapters.add(adapter);
-		}
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.ProcesstypesAdapterFactory#createProcessAdapter()
-	 */
-	// public Adapter createProcessAdapter() {
-	// return new ProcessItemProvider(this);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ProcesstypesItemProviderAdapterFactory#createDeliveryProcessAdapter()
-	 */
-	// public Adapter createDeliveryProcessAdapter() {
-	// return createProcessAdapter();
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ProcesstypesItemProviderAdapterFactory#createCapabilityPatternAdapter()
-	 */
-	// public Adapter createCapabilityPatternAdapter() {
-	// return createProcessAdapter();
-	// }
-	public Adapter createProcessComponentAdapter() {
-		if (processComponentItemProvider == null) {
-			processComponentItemProvider = new ProcessComponentItemProvider(
-					this);
-		}
-
-		return processComponentItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createProcessPackageAdapter()
-	 */
-	public Adapter createProcessPackageAdapter() {
-		if (processPackageItemProvider == null) {
-			processPackageItemProvider = new ProcessPackageItemProvider(this);
-		}
-
-		return processPackageItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createCompositeRoleAdapter()
-	 */
-	public Adapter createCompositeRoleAdapter() {
-		return new CompositeRoleItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createCompositeRoleAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createRoleAdapter()
-	 */
-	public Adapter createRoleAdapter() {
-		if (roleItemProvider == null) {
-			roleItemProvider = new RoleItemProvider(this);
-		}
-		return roleItemProvider;
-	}
-
-	public Adapter createWorkOrderAdapter() {
-		if (workOrderItemProvider == null) {
-			workOrderItemProvider = new WorkOrderItemProvider(this);
-		}
-		return workOrderItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IColumnAware#getColumnIndexToNameMap()
-	 */
-	public Map getColumnIndexToNameMap() {
-		return columnIndexToNameMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#dispose()
-	 */
-	public void dispose() {
-		if (!disposableAdapters.isEmpty()) {
-			for (Iterator iter = disposableAdapters.iterator(); iter.hasNext();) {
-				IDisposable adapter = (IDisposable) iter.next();
-				adapter.dispose();
-			}
-			disposableAdapters.clear();
-		}
-
-		super.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/MilestoneWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/MilestoneWrapperItemProvider.java
deleted file mode 100644
index 17ce1fd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/MilestoneWrapperItemProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.Milestone;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MilestoneWrapperItemProvider extends
-		BreakdownElementWrapperItemProvider {
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public MilestoneWrapperItemProvider(Milestone value, Object owner,
-			AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param milestone
-	 * @param owner
-	 * @param feature
-	 * @param index
-	 * @param adapterFactory
-	 */
-	public MilestoneWrapperItemProvider(Milestone milestone, Object owner,
-			EStructuralFeature feature, int index, AdapterFactory adapterFactory) {
-		super(milestone, owner, feature, index, adapterFactory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSActivityItemProvider.java
deleted file mode 100644
index b83e49c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSActivityItemProvider.java
+++ /dev/null
@@ -1,493 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.Disposable;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.command.OBSDragAndDropCommand;
-import org.eclipse.epf.library.edit.process.command.OBSDropCommand;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * Item provider for Team Allocation activity
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class OBSActivityItemProvider extends BSActivityItemProvider {
-
-	private Disposable rolledUpWrappers;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public OBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		// Activity act = (Activity) object;
-		// if(hasChildDescriptor(act)) {
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getActivity_BreakdownElements(),
-		// UmaFactory.eINSTANCE.createRoleDescriptor()));
-		//    		
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getActivity_BreakdownElements(),
-		// UmaFactory.eINSTANCE.createTeamProfile()));
-		//
-		// }
-		// else {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createPhase()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createIteration()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createActivity()));
-
-		// if(act.getBreakdownElements().isEmpty()) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createRoleDescriptor()));
-
-		// COMPOSITE ROLE FEATURE IS NOT AVAILABLE FOR FIRST RELEASE.
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getActivity_BreakdownElements(),
-		// UmaFactory.eINSTANCE.createCompositeRole()));
-		//				
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createTeamProfile()));
-
-		// }
-		// }
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createMilestone()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.BSActivityItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object child) {
-		child = TngUtil.unwrap(child);
-
-		if (child instanceof Activity || child instanceof RoleDescriptor
-				|| child instanceof TeamProfile || child instanceof Milestone) {
-			return super.acceptAsChild(child);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#getObject(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected Object getObject(Descriptor descriptor) {
-		try {
-			return ((RoleDescriptor) descriptor).getRole();
-		}
-		catch(ClassCastException e) {
-			LibraryEditPlugin.getDefault().getLogger().logError(e);
-			throw e;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	public IResourceAwareCommand createDropCommand(Object owner,
-			List dropElements) {
-		return new OBSDropCommand((Activity) owner, dropElements);
-	}
-
-	protected Command createDragAndDropCommand(EditingDomain domain,
-			Object owner, float location, int operations, int operation,
-			Collection collection) {
-		// System.out
-		// .println("ENTER:
-		// com.ibm.library.edit.process.WBSActivityItemProvider#createDragAndDropCommand(domain,
-		// owner, location, operations, operation, collection)");
-		Command cmd = new OBSDragAndDropCommand(domain, owner, location,
-				operations, operation, collection);
-
-		// System.out.println(" can execute: " + cmd.canExecute());
-		// System.out.println(" owner: " + owner);
-		// System.out.println(" collection: " + collection);
-		// System.out.println(" location: " + location);
-		// System.out.println(" operations: " + operations);
-		// System.out.println(" operation: " + operation);
-		//        
-		// System.out
-		// .println("EXIT:
-		// com.ibm.library.edit.process.WBSActivityItemProvider#createDragAndDropCommand(domain,
-		// owner, location, operations, operation, collection)");
-		return cmd;
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// com.ibm.library.edit.process.BSActivityItemProvider#refreshChildren(org.eclipse.emf.common.notify.Notification,
-	// java.util.List)
-	// */
-	// protected void refreshChildren(Notification notification, List
-	// newOrOldChildren) {
-	// if(!newOrOldChildren.isEmpty()) {
-	// Process topAct = (Process) getTopItem();
-	// AdapterFactory rootAdapterFactory = getRootAdapterFactory();
-	//						
-	// ProcessUtil.refreshViewer(rootAdapterFactory, topAct);
-	//			
-	// return;
-	//
-	// }
-	// }
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#isNewDescriptor(java.util.List, java.lang.Object)
-	 */
-	protected boolean isNewDescriptor(List children, Object child) {
-		Object obj = TngUtil.unwrap(child);
-		// collect all role descriptors or their wrappers first for matching with team profiles
-		// and eliminate the duplicates later in getChildren()
-		//
-		if(obj instanceof RoleDescriptor) {
-			return true;
-		}
-		return super.isNewDescriptor(children, obj);
-	}		
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if (rolledUpWrappers != null) {
-			rolledUpWrappers.dispose();
-		}
-
-		if (isRolledUp()) {
-			List teamProfiles = new ArrayList();
-			List roleDescriptors = new ArrayList();
-			HashSet roleTeamPairs = new HashSet();
-			HashSet roleDescriptorsWithoutLinkedElements = new HashSet();
-			Collection children = super.getChildren(object);
-			
-			// collect all team profiles under this activity
-			//
-			HashSet validTeamProfiles = new HashSet();
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object o = iter.next();
-				Object e = TngUtil.unwrap(o);
-				if (e instanceof TeamProfile) {
-					if(validTeamProfiles.add(e)) {
-						teamProfiles.add(o);
-					}
-				}
-			}
-			
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object child = iter.next();
-				Object e = TngUtil.unwrap(child);
-				if (e instanceof RoleDescriptor) {
-					RoleDescriptor desc = (RoleDescriptor) e;
-					List list;
-					List descriptors = null;
-					ComposedBreakdownElementWrapperItemProvider composedWrapper = null;					
-					if(child instanceof RoleDescriptorWrapperItemProvider) {
-						Object value = ((RoleDescriptorWrapperItemProvider)child).getValue();
-						if(value instanceof ComposedBreakdownElementWrapperItemProvider) {
-							composedWrapper = (ComposedBreakdownElementWrapperItemProvider) value;
-						}
-					}
-					if(composedWrapper != null) {
-						list = new UniqueEList();
-						descriptors = new ArrayList();
-						for (Iterator iterator = composedWrapper.getValues().iterator(); iterator
-								.hasNext();) {
-							Object o = iterator.next();
-							Object element = TngUtil.unwrap(o);
-							if(element instanceof RoleDescriptor) {
-								List teams = AssociationHelper.getTeamProfiles((RoleDescriptor) element);
-								for (Iterator itor = teams.iterator(); itor
-										.hasNext();) {
-									Object team = itor.next();
-									if(list.add(team)) {
-										descriptors.add(o);
-									}
-									
-								}
-							}
-						}
-					}
-					else {
-						list = AssociationHelper.getTeamProfiles(desc);
-					}
-					int size = list.size(); 
-					if(size > 1) {
-						if (rolledUpWrappers == null) {
-							rolledUpWrappers = new Disposable();
-						}
-						
-						boolean readOnly = false;
-						if (child instanceof BreakdownElementWrapperItemProvider) {
-							readOnly = ((BreakdownElementWrapperItemProvider) child)
-							.isReadOnly();
-						}
-						
-						// show one descriptor per team
-						//
-						for (int i = 0; i < size; i++) {
-							TeamRoleDescriptorItemProvider itemProvider = new TeamRoleDescriptorItemProvider(
-									descriptors.get(i), object, adapterFactory);
-							itemProvider.readOnly = readOnly;
-							TeamProfile team = (TeamProfile) list.get(i);
-							
-//							// add team to the team list only if the team is under this activity
-//							//
-//							if(validTeamProfiles.contains(team)) {
-//								addTeamProfiles(object, teamProfiles, team);
-//							}
-							
-							itemProvider.team = team;
-							rolledUpWrappers.add(itemProvider);
-							roleDescriptors.add(itemProvider);
-							roleTeamPairs.add(new RoleTeamPair((Role) getObject(desc), team));
-						}						
-					}
-					else {
-						Role role = (Role) getObject(desc);
-						TeamProfile team = (TeamProfile) (size == 1 ? list.get(0) : null);
-						if(role == null) {
-							if(!roleDescriptorsWithoutLinkedElements.contains(e)) {
-								roleDescriptors.add(child);
-								
-//								// add team to the team list only if the team is under this activity
-//								//
-//								if(team != null && validTeamProfiles.contains(team)) {
-//									addTeamProfiles(object, teamProfiles, team);
-//								}
-								
-								roleDescriptorsWithoutLinkedElements.add(e);
-							}
-						}
-						else {
-							RoleTeamPair roleTeamPair = new RoleTeamPair(role, team);
-							if(!roleTeamPairs.contains(roleTeamPair)) {
-								roleDescriptors.add(child);
-								
-//								// add team to the team list only if the team is under this activity
-//								//
-//								if(team != null && validTeamProfiles.contains(team)) {
-//									addTeamProfiles(object, teamProfiles, team);
-//								}
-								
-								roleTeamPairs.add(roleTeamPair);
-							}
-						}
-					}
-				}
-			}
-			roleTeamPairs.clear();
-			roleTeamPairs = null;
-			Collections.sort(teamProfiles, Comparators.PRESENTATION_NAME_COMPARATOR);
-			Collections.sort(roleDescriptors, Comparators.PRESENTATION_NAME_COMPARATOR);
-			children = new ArrayList(teamProfiles);
-			children.addAll(roleDescriptors);
-			
-			updateCachedChildren(children);
-			
-			return children;
-		}
-		Collection children = super.getChildren(object);
-		updateCachedChildren(children);
-		return children;
-	}
-	
-	public Collection getEClasses() {
-		return ProcessUtil.getOBSEclasses();
-	}
-	
-	private void addTeamProfiles(Object owner, Collection teamProfiles, TeamProfile teamProfile) {
-		if (!TngUtil.checkExist(teamProfiles, teamProfile)) {
-			TeamProfileWrapperItemProvider wrapper = new TeamProfileWrapperItemProvider(
-					teamProfile, owner, adapterFactory) {
-				/* (non-Javadoc)
-				 * @see org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider#getChildren(java.lang.Object)
-				 */
-				public Collection getChildren(Object object) {
-					Collection children = super.getChildren(object);
-					
-//					// don't show role descriptors
-//					//
-//					for (Iterator iter = children.iterator(); iter.hasNext();) {
-//						Object child = TngUtil.unwrap(iter.next());
-//						if(child instanceof RoleDescriptor) {
-//							iter.remove();
-//						}
-//					}	
-					
-					return children;
-				}
-				
-			};
-			IBSItemProvider adapter = (IBSItemProvider) adapterFactory
-					.adapt(teamProfile,
-							ITreeItemContentProvider.class);
-			wrapper.readOnly = (getTopItem() != adapter.getTopItem());
-			teamProfiles.add(wrapper);
-		}
-	}
-
-	private static class TeamRoleDescriptorItemProvider extends
-			RoleDescriptorWrapperItemProvider {
-		
-		
-		public TeamRoleDescriptorItemProvider(Object value, Object owner, AdapterFactory adapterFactory) {
-			super(value, owner, adapterFactory);
-		}
-
-		/**
-		 * @param value
-		 * @param owner
-		 * @param adapterFactory
-		 */
-		public TeamRoleDescriptorItemProvider(RoleDescriptor value,
-				Object owner, AdapterFactory adapterFactory) {
-			super(value, owner, adapterFactory);
-			readOnly = false;
-		}
-
-		private TeamProfile team;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.library.edit.process.RoleDescriptorItemProvider#getAttribute(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public String getAttribute(Object object, String property) {
-			if (property == IBSItemProvider.COL_TEAMS && team != null) {
-				return TngUtil.getPresentationName(team);
-			}
-			return super.getAttribute(object, property);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.library.edit.process.BreakdownElementWrapperItemProvider#createWrapper(java.lang.Object,
-		 *      java.lang.Object, org.eclipse.emf.common.notify.AdapterFactory)
-		 */
-		protected IWrapperItemProvider createWrapper(Object value,
-				Object owner, AdapterFactory adapterFactory) {
-			BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) super
-					.createWrapper(value, owner, adapterFactory);
-			wrapper.readOnly = readOnly;
-			return wrapper;
-		}
-	}
-
-	private static class RoleTeamPair {
-		private Role role;
-		private TeamProfile team;
-
-		RoleTeamPair(Role role, TeamProfile team) {
-			this.role = role;
-			this.team = team;
-		}
-		
-		public boolean equals(Object obj) {
-			if(obj == this) return true;
-			if(obj instanceof RoleTeamPair) {
-				RoleTeamPair other = (RoleTeamPair) obj;
-				return role == other.role && (team == other.team || (team == null && other.team == null));
-			}
-			else {
-				return false;
-			}
-		}
-		
-		public int hashCode() {
-			String str = role.getGuid();
-			if(team != null) {
-				str = str + team.getGuid();
-			}
-			return str.hashCode();			
-		}
-	}
-	
-	@Override
-	protected boolean isWrappingRollupNeeded(Object object) {
-		if(TngUtil.unwrap(object) instanceof RoleDescriptor) {
-			return true;
-		}
-		return super.isWrappingRollupNeeded(object);
-	}
-
-	@Override
-	protected Object createRollupWrapper(Object object, Object owner, AdapterFactory adapterFactory) {
-		Object wrapper = super.createRollupWrapper(object, owner, adapterFactory);
-		return new RoleDescriptorWrapperItemProvider(wrapper, owner, adapterFactory);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSItemProviderAdapterFactory.java
deleted file mode 100644
index b9400d5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class OBSItemProviderAdapterFactory extends ItemProviderAdapterFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new OBSActivityItemProvider(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createIterationAdapter()
-	 */
-	public Adapter createIterationAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createPhaseAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createTeamProfileAdapter()
-	 */
-	public Adapter createTeamProfileAdapter() {
-		return new TeamProfileItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory.createTeamProfileAdapter());
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.epf.uma.util.BreakdownAdapterFactory#createTeamProfileAdapter()
-	// */
-	// public Adapter createCompositeRoleAdapter() {
-	// return new OBSCompositeRoleItemProvider(this);
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createMilestoneAdapter() {
-		return new OBSMilestoneItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createMilestoneAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.ItemProviderAdapterFactory#createProcessAdapter()
-	 */
-	// public Adapter createProcessAdapter() {
-	// return createActivityAdapter();
-	// }
-	public Adapter createCapabilityPatternAdapter() {
-		return new OBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new OBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory.createDeliveryProcessAdapter());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSMilestoneItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSMilestoneItemProvider.java
deleted file mode 100644
index 81aa1fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSMilestoneItemProvider.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class OBSMilestoneItemProvider extends BreakdownElementItemProvider {
-
-	// private Collection eClasses = new HashSet();
-	/**
-	 * @param adapterFactory
-	 */
-	public OBSMilestoneItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// com.ibm.library.edit.process.WBSActivityItemProvider#getChildren(java.lang.Object)
-	// */
-	// public Collection getChildren(Object object) {
-	// return TngUtil.getAllChildren((ProcessContribution) object,
-	// super.getChildren(object),
-	// TngUtil.getBestAdapterFactory(adapterFactory));
-	// }
-	//    
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#getElements(java.lang.Object)
-	// */
-	// public Collection getElements(Object object) {
-	// Collection elements = super.getElements(object);
-	// return elements;
-	// }
-
-	// public List getFilteredBreakdownElements(Object activity, Object obj)
-	// {
-	// List elements = new ArrayList();
-	// List breakdownElements = ((Activity)activity).getBreakdownElements();
-	// for (Iterator it = breakdownElements.iterator(); it.hasNext();)
-	// {
-	// Object elementObj = it.next();
-	// if ((elementObj instanceof RoleDescriptor) || (elementObj instanceof
-	// TeamProfile) || (elementObj instanceof CompositeRole) || (elementObj
-	// instanceof Milestone) || (elementObj instanceof Activity))
-	// {
-	// elements.add(elementObj);
-	// }
-	// }
-	// return elements;
-	// }
-
-	public Collection getEClasses() {
-		return ProcessUtil.getOBSEclasses();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSProcessItemProvider.java
deleted file mode 100644
index 7331e53..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/OBSProcessItemProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class OBSProcessItemProvider extends OBSActivityItemProvider {
-
-	private ItemProviderAdapter delegateItemProvider;
-
-	public OBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#getPropertyDescriptors(java.lang.Object)
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			itemPropertyDescriptors = delegateItemProvider
-					.getPropertyDescriptors(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSActivityItemProvider.java
deleted file mode 100644
index 0b15fa1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSActivityItemProvider.java
+++ /dev/null
@@ -1,378 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.Disposable;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.library.edit.ICachedChildrenItemProvider;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.command.PBSDragAndDropCommand;
-import org.eclipse.epf.library.edit.process.command.PBSDropCommand;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class PBSActivityItemProvider extends BSActivityItemProvider 
-implements ICachedChildrenItemProvider
-{
-
-	private Disposable rolledUpWrappers;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public PBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		// Activity act = (Activity) object;
-		// if(hasChildDescriptor(act)) {
-		// newChildDescriptors.add
-		// (createChildParameter
-		// (UmaPackage.eINSTANCE.getActivity_BreakdownElements(),
-		// UmaFactory.eINSTANCE.createWorkProductDescriptor()));
-		// }
-		// else {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createPhase()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createIteration()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createActivity()));
-
-		// if(act.getBreakdownElements().isEmpty()) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createWorkProductDescriptor()));
-		// }
-
-		// }
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createMilestone()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.BSActivityItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object child) {
-		child = TngUtil.unwrap(child);
-
-		if (child instanceof Activity
-				|| child instanceof WorkProductDescriptor
-				|| child instanceof Milestone) {
-			return super.acceptAsChild(child);
-		}
-		return false;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if (rolledUpWrappers != null) {
-			rolledUpWrappers.dispose();
-		}
-
-		if (isRolledUp()) {
-			Map workProductToWrappersMap = new HashMap();
-			Collection children = super.getChildren(object);
-			for (Iterator iter = children.iterator(); iter.hasNext();) {
-				Object child = iter.next();
-				Object e = TngUtil.unwrap(child);
-				if (e instanceof WorkProductDescriptor) {
-					WorkProductDescriptor desc = (WorkProductDescriptor) e;
-					List list = AssociationHelper.getDeliverableDescriptors(desc);
-					Object wrapperKey = desc.getWorkProduct() == null ? (Object)desc : desc.getWorkProduct();
-					List wrappers = (List) workProductToWrappersMap.get(wrapperKey);
-					if (list.size() < 1) {
-						// check if the descriptor already exists in the
-						// rollup list
-						//
-						if(wrappers == null) {
-							wrappers = new ArrayList();
-							workProductToWrappersMap.put(wrapperKey, wrappers);
-							wrappers.add(new ComposedWPDescriptorWrapperItemProvider(child, object, adapterFactory));
-						}
-						else {
-							for (int i = wrappers.size() - 1; i > -1; i--) {
-								((ComposedWPDescriptorWrapperItemProvider)wrappers.get(i)).addWorkProductDescriptor(child);
-							}
-						}
-					} else {
-							boolean checkExist = true;							
-							if(wrappers == null) {
-								wrappers = new ArrayList();
-								workProductToWrappersMap.put(wrapperKey, wrappers);
-								checkExist = false;
-							}
-							if(checkExist) {
-								// remove any wrapper that is not of type DeliverableWorkProductDescriptorItemProvider from the wrapper list
-								//
-								for (Iterator iterator = wrappers.iterator(); iterator
-										.hasNext();) {
-									Object wrapper = (Object) iterator.next();
-									if(!(wrapper instanceof DeliverableWorkProductDescriptorItemProvider)) {
-										iter.remove();
-									}
-								}
-								
-								checkExist = wrappers.size() > 0;
-							}
-							
-							// show one descriptor per deliverable
-							//
-							add_descriptors:
-							for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-								Object deliverableDescriptor = iterator.next();
-								if(checkExist) {
-									for (int i = wrappers.size() - 1; i > -1; i--) {
-										DeliverableWorkProductDescriptorItemProvider wrapper = (DeliverableWorkProductDescriptorItemProvider) wrappers.get(i);
-										if(wrapper.deliverableDescriptor == deliverableDescriptor) {
-											wrapper.addWorkProductDescriptor(child);
-											continue add_descriptors;
-										}
-									}
-								}
-
-								DeliverableWorkProductDescriptorItemProvider itemProvider = new DeliverableWorkProductDescriptorItemProvider(
-										desc, object, adapterFactory);
-								itemProvider.deliverableDescriptor = deliverableDescriptor;
-								wrappers.add(itemProvider);
-							}
-
-					}
-				}
-			}
-			List rolledUpChildren = new ArrayList();
-			for (Iterator iter = workProductToWrappersMap.values().iterator(); iter.hasNext();) {
-				rolledUpChildren.addAll((Collection) iter.next());
-				
-			}
-			List result = removeSubartifactsFromChildren(rolledUpChildren, true);
-			if(rolledUpWrappers == null) {
-				rolledUpWrappers = new Disposable();
-			}
-			rolledUpWrappers.addAll(result);
-			
-			// dispose wrappers of subartifact
-			//
-			for(int i = rolledUpChildren.size() - 1; i > -1; i--) {
-				IWrapperItemProvider wrapper = (IWrapperItemProvider) rolledUpChildren.get(i);
-				if(!rolledUpWrappers.contains(wrapper)) {
-					wrapper.dispose();
-				}
-			}
-			
-			Collections.sort(result, Comparators.PRESENTATION_NAME_COMPARATOR);
-			
-			updateCachedChildren(result);
-			
-			return result;
-		}
-
-		Collection children = removeSubartifactsFromChildren(super.getChildren(object), false);
-		
-		updateCachedChildren(children);
-		
-		return children;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BreakdownElementItemProvider#dispose()
-	 */
-	public void dispose() {
-		if(rolledUpWrappers != null) {
-			rolledUpWrappers.dispose();
-		}
-		
-		super.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#isNewDescriptor(java.util.List, java.lang.Object)
-	 */
-	protected boolean isNewDescriptor(List children, Object child) {
-		// return true to let overriden getChildren() to handle the uniqueness of the rollup list
-		//
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#createOrMovePackageFor(java.util.List)
-	 */
-	protected void createOrMovePackageFor(List newChildren) {
-		super.createOrMovePackageFor(newChildren);
-
-		for (Iterator iter = newChildren.iterator(); iter.hasNext();) {
-			Object e = iter.next();
-			if (e instanceof WorkProductDescriptor) {
-				// add deliverable parts to the activity's package
-				WorkProductDescriptor wpd = (WorkProductDescriptor) e;
-				for (Iterator iterator = wpd.getDeliverableParts().iterator(); iterator
-						.hasNext();) {
-					WorkProductDescriptor part = (WorkProductDescriptor) iterator
-							.next();
-					ProcessUtil.addToContainer(part, this, false);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#getObject(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected Object getObject(Descriptor descriptor) {
-		return ((WorkProductDescriptor) descriptor).getWorkProduct();
-	}
-
-	protected Command createDragAndDropCommand(EditingDomain domain,
-			Object owner, float location, int operations, int operation,
-			Collection collection) {
-		return new PBSDragAndDropCommand(domain, owner, location, operations,
-				operation, collection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	public IResourceAwareCommand createDropCommand(Object owner,
-			List dropElements) {
-		return new PBSDropCommand((Activity) owner, dropElements);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#acceptAsRolledUpChild(java.lang.Object)
-	 */
-	protected boolean acceptAsRolledUpChild(Object child) {
-		Object obj = TngUtil.unwrap(child);
-
-		if (obj instanceof WorkProductDescriptor && ((WorkProductDescriptor)obj).getSuperActivities() != null) {
-			return super.acceptAsRolledUpChild(obj);
-		}
-		return false;
-	}
-
-	public Collection getEClasses() {
-		return ProcessUtil.getPBSEclasses();
-	}
-
-	private static class DeliverableWorkProductDescriptorItemProvider extends
-			ComposedWPDescriptorWrapperItemProvider {
-
-		private Object deliverableDescriptor;
-
-		/**
-		 * @param value
-		 * @param owner
-		 * @param adapterFactory
-		 */
-		public DeliverableWorkProductDescriptorItemProvider(
-				WorkProductDescriptor value, Object owner,
-				AdapterFactory adapterFactory) {
-			super(value, owner, adapterFactory);
-			readOnly = false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.library.edit.process.BreakdownElementWrapperItemProvider#getAttribute(java.lang.Object,
-		 *      java.lang.String)
-		 */
-		public String getAttribute(Object object, String property) {
-			if (property == IBSItemProvider.COL_DELIVERABLE) {
-				return TngUtil.getPresentationName(deliverableDescriptor);
-			}
-			return super.getAttribute(object, property);
-		}
-
-	}
-
-	protected List removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		List<?> list = ProcessUtil.removeSubartifactsFromChildren(children, unwrap);
-		if(list.size() !=  children.size()) {
-			// parent of descriptors of subartifacts has been set to this activity
-			// iterate the subtree of the artifact descriptors in chidren list to correct this
-			//
-			for (Iterator<?> iterator = children.iterator(); iterator.hasNext();) {
-				Object child = (Object) iterator.next();
-				if(child instanceof WorkProductDescriptor && ((WorkProductDescriptor)child).getWorkProduct() instanceof Artifact) {
-					for(AdapterFactoryTreeIterator<?> iter = new AdapterFactoryTreeIterator<Object>(adapterFactory, child);
-						iter.hasNext(); iter.next());					
-				}
-			}
-		}
-		return list;
-	}
-
-	@Override
-	protected boolean isWrappingRollupNeeded(Object object) {
-		if(TngUtil.unwrap(object) instanceof WorkProductDescriptor) {
-			return true;
-		}
-		return super.isWrappingRollupNeeded(object);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSItemProviderAdapterFactory.java
deleted file mode 100644
index 1abfd1e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class PBSItemProviderAdapterFactory extends ItemProviderAdapterFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new PBSActivityItemProvider(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createMilestoneAdapter() {
-		return new PBSMilestoneItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createMilestoneAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createIterationAdapter()
-	 */
-	public Adapter createIterationAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createPhaseAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.ItemProviderAdapterFactory#createProcessAdapter()
-	 */
-	public Adapter createProcessAdapter() {
-		return createActivityAdapter();
-	}
-
-	public Adapter createCapabilityPatternAdapter() {
-		return new PBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new PBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createDeliveryProcessAdapter());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSMilestoneItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSMilestoneItemProvider.java
deleted file mode 100644
index 8c18881..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSMilestoneItemProvider.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class PBSMilestoneItemProvider extends BreakdownElementItemProvider {
-
-	// private Collection eClasses = new HashSet();
-
-	/**
-	 * @param adapterFactory
-	 */
-	public PBSMilestoneItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// com.ibm.library.edit.process.WBSActivityItemProvider#getChildren(java.lang.Object)
-	// */
-	// public Collection getChildren(Object object) {
-	// return TngUtil.getAllChildren((ProcessContribution) object,
-	// super.getChildren(object),
-	// TngUtil.getBestAdapterFactory(adapterFactory));
-	// }
-	//    
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#getElements(java.lang.Object)
-	// */
-	// public Collection getElements(Object object) {
-	// Collection elements = super.getElements(object);
-	// return elements;
-	// }
-
-	// public List getFilteredBreakdownElements(Object activity, Object obj)
-	// {
-	// List elements = new ArrayList();
-	// List breakdownElements = ((Activity)activity).getBreakdownElements();
-	// for (Iterator it = breakdownElements.iterator(); it.hasNext();)
-	// {
-	// Object elementObj = it.next();
-	// if ((elementObj instanceof WorkProductDescriptor) || (elementObj
-	// instanceof Milestone) || (elementObj instanceof Activity))
-	// {
-	// elements.add(elementObj);
-	// }
-	// }
-	// return elements;
-	// }
-
-	public Collection getEClasses() {
-		return ProcessUtil.getPBSEclasses();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSProcessItemProvider.java
deleted file mode 100644
index 7cf1b0e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/PBSProcessItemProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-
-public class PBSProcessItemProvider extends PBSActivityItemProvider {
-
-	private ItemProviderAdapter delegateItemProvider;
-
-	public PBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#getPropertyDescriptors(java.lang.Object)
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			itemPropertyDescriptors = delegateItemProvider
-					.getPropertyDescriptors(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ProcessComponentItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ProcessComponentItemProvider.java
deleted file mode 100644
index e3f3be9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ProcessComponentItemProvider.java
+++ /dev/null
@@ -1,188 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ProcessComponentItemProvider extends
-		org.eclipse.epf.uma.provider.ProcessComponentItemProvider implements
-		IProcessItemProvider {
-
-	// private static class ProcessListener extends AdapterImpl {
-	// private ItemProviderAdapter itemProvider;
-	// private Object refreshObj;
-	//
-	// /**
-	// *
-	// */
-	// public ProcessListener(ItemProviderAdapter itemProvider, Object
-	// refreshObj) {
-	// this.itemProvider = itemProvider;
-	// this.refreshObj = refreshObj;
-	// }
-	//        
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	// */
-	// public void notifyChanged(Notification msg) {
-	// switch(msg.getFeatureID(Process.class)) {
-	// case UmaPackage.PROCESS__BREAKDOWN_ELEMENTS:
-	// itemProvider.fireNotifyChanged(new ViewerNotification(msg, refreshObj,
-	// true, false));
-	// return;
-	// }
-	// }
-	// };
-
-	/**
-	 * @param adapterFactory
-	 */
-	public ProcessComponentItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getProcessComponent_Process());
-		}
-		return childrenFeatures;
-	}
-
-	public void notifyChanged(Notification notification) {
-		switch (notification.getFeatureID(ProcessComponent.class)) {
-		case UmaPackage.PROCESS_COMPONENT__NAME:
-			ProcessComponent pc = (ProcessComponent) notification.getNotifier();
-			if (pc.getProcess() != null) {
-				boolean old = pc.getProcess().eDeliver();
-				try {
-					pc.getProcess().eSetDeliver(false);
-					pc.getProcess().setName(pc.getName());
-				} finally {
-					pc.getProcess().eSetDeliver(old);
-				}
-			}
-			break;
-			
-		// avoid refreshing viewers when new process element or diagram is added to the process component
-		//
-		case UmaPackage.PROCESS_COMPONENT__PROCESS_ELEMENTS:
-		case UmaPackage.PROCESS_COMPONENT__DIAGRAMS:
-			return;
-			
-		}		
-		super.notifyChanged(notification);
-	}
-
-	// public Collection getChildren(Object object) {
-	// List children = new ArrayList();
-	// Process proc = ((ProcessComponent)object).getProcess();
-	// if(proc != null) {
-	// if(TngUtil.getAdapter(proc, ProcessListener.class) == null) {
-	// proc.eAdapters().add(new ProcessListener(this, object));
-	// }
-	// for (Iterator iter = proc.getBreakdownElements().iterator();
-	// iter.hasNext();) {
-	// Object element = iter.next();
-	// if(element instanceof Activity) {
-	// children.add(element);
-	// }
-	// }
-	// }
-	// return children;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getImage(java.lang.Object)
-	 */
-	// public Object getImage(Object object) {
-	// return super.getImage(object);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return TngUtil.getLabel(object, getString("_UI_ProcessComponent_type")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	// public void dispose() {
-	// // remove all process listeners from all targets
-	// //
-	// if (target != null)
-	// {
-	// target.eAdapters().remove(this);
-	// if (targets != null)
-	// {
-	// for (Iterator i = targets.iterator(); i.hasNext(); )
-	// {
-	// Notifier otherTarget = (Notifier)i.next();
-	// otherTarget.eAdapters().remove(this);
-	// }
-	// }
-	// }
-	//
-	// super.dispose();
-	// }
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ProcessPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ProcessPackageItemProvider.java
deleted file mode 100644
index 104f38e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/ProcessPackageItemProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-
-/**
- * @author Phong Nguyen Le - Sep 30, 2005
- * @since 1.0
- */
-public class ProcessPackageItemProvider extends
-		org.eclipse.epf.uma.provider.ProcessPackageItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public ProcessPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleDescriptorItemProvider.java
deleted file mode 100644
index a566aa0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleDescriptorItemProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-
-public class RoleDescriptorItemProvider extends DescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public RoleDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Collection getEClasses() {
-		return ProcessUtil.getOBSEclasses();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleDescriptorWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleDescriptorWrapperItemProvider.java
deleted file mode 100644
index e298388..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleDescriptorWrapperItemProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.RoleDescriptor;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RoleDescriptorWrapperItemProvider extends
-		BreakdownElementWrapperItemProvider {
-	
-	protected RoleDescriptorWrapperItemProvider(Object value, Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public RoleDescriptorWrapperItemProvider(RoleDescriptor value,
-			Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param index
-	 * @param feature
-	 * @param adapterFactory
-	 */
-	public RoleDescriptorWrapperItemProvider(RoleDescriptor value,
-			Object owner, EStructuralFeature feature, int index,
-			AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}
-
-	@Override
-	public boolean isInherited() {
-		if(getValue() instanceof ComposedBreakdownElementWrapperItemProvider) {
-			return ((ComposedBreakdownElementWrapperItemProvider)getValue()).isInherited();
-		}
-		return super.isInherited();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleItemProvider.java
deleted file mode 100644
index d7459de..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/RoleItemProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RoleItemProvider extends org.eclipse.epf.uma.provider.RoleItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public RoleItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createInitializeCopyCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.edit.command.CopyCommand.Helper)
-	 */
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.DescribableElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TaskDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TaskDescriptorItemProvider.java
deleted file mode 100644
index 48eab16..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TaskDescriptorItemProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-
-
-public class TaskDescriptorItemProvider extends DescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public TaskDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(WorkBreakdownElement.class)) {
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	public Collection getEClasses() {
-		return ProcessUtil.getWBSEclasses();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TaskDescriptorWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TaskDescriptorWrapperItemProvider.java
deleted file mode 100644
index 8084fd1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TaskDescriptorWrapperItemProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.TaskDescriptor;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class TaskDescriptorWrapperItemProvider extends
-		BreakdownElementWrapperItemProvider {	
-
-	protected TaskDescriptorWrapperItemProvider(Object value, Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param index
-	 * @param feature
-	 * @param adapterFactory
-	 */
-	public TaskDescriptorWrapperItemProvider(TaskDescriptor value,
-			Object owner, EStructuralFeature feature, int index,
-			AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}
-
-	@Override
-	public String getAttribute(Object object, String property) {
-		if(getValue() instanceof ComposedBreakdownElementWrapperItemProvider) {
-			return ((ComposedBreakdownElementWrapperItemProvider)getValue()).getAttribute(object, property);
-		}
-		return super.getAttribute(object, property);
-	}
-	
-	@Override
-	public boolean isInherited() {
-		if(getValue() instanceof ComposedBreakdownElementWrapperItemProvider) {
-			return ((ComposedBreakdownElementWrapperItemProvider)getValue()).isInherited();
-		}
-		return super.isInherited();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TeamProfileItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TeamProfileItemProvider.java
deleted file mode 100644
index f2b64e7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TeamProfileItemProvider.java
+++ /dev/null
@@ -1,354 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-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;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.command.GenericDropCommand;
-import org.eclipse.epf.library.edit.process.command.OBSDragAndDropCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class TeamProfileItemProvider extends BreakdownElementItemProvider {
-
-	// private Collection eClasses;
-	// private Collection teamRoleWrappers;
-	private GenericDropCommand.ElementAdapter dropAdapter;
-
-	/**
-	 * @param adapterFactory
-	 */
-	public TeamProfileItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getTeamProfile_SubTeam(), UmaFactory.eINSTANCE
-				.createTeamProfile()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-
-			childrenFeatures.add(UmaPackage.eINSTANCE.getTeamProfile_SubTeam());
-		}
-
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	public IResourceAwareCommand createDropCommand(Object owner,
-			List dropElements) {
-		return new GenericDropCommand((TeamProfile) owner, UmaPackage.eINSTANCE
-				.getTeamProfile_TeamRoles(), dropElements,
-				getDropAdapter(owner));
-	}
-
-	private GenericDropCommand.ElementAdapter getDropAdapter(Object owner) {
-		BreakdownElementItemProvider adapter = (BreakdownElementItemProvider) adapterFactory
-				.adapt(owner, IEditingDomainItemProvider.class);
-		return adapter.createDropAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.WBSActivityItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-
-		// add team roles
-		//
-		IFilter filter = ProcessUtil.getFilter(adapterFactory);
-		boolean nullFilter = filter == null;
-		TeamProfile teamProfile = (TeamProfile) object;
-		for (Iterator iter = teamProfile.getTeamRoles().iterator(); iter
-				.hasNext();) {
-			RoleDescriptor desc = (RoleDescriptor) iter.next();
-			if (desc.getSuperActivities() == null && (nullFilter || filter.accept(desc))) {
-				children.add(desc);
-			}
-		}
-
-		// set parent for the children's item providers
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			ProcessUtil.setParent(iter.next(), object, getRootAdapterFactory());
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
-	 */
-	// public void dispose() {
-	// for (Iterator iter = teamRoleWrappers.iterator(); iter.hasNext();) {
-	// IWrapperItemProvider wrapper = (IWrapperItemProvider) iter.next();
-	// wrapper.dispose();
-	// }
-	// teamRoleWrappers.clear();
-	//		
-	// super.dispose();
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TeamProfile.class)) {
-		case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-			int eventType = notification.getEventType();
-			if (eventType == Notification.ADD
-					|| eventType == Notification.ADD_MANY) {
-				List subTeams = ProcessUtil.getAffectedElements(notification,
-						null);
-				for (Iterator iter = subTeams.iterator(); iter.hasNext();) {
-					TeamProfile subTeam = (TeamProfile) iter.next();
-					ProcessUtil.addToContainer(subTeam, this);
-				}
-			}
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		case UmaPackage.TEAM_PROFILE__TEAM_ROLES:
-			List elements = ProcessUtil.getAffectedElements(notification, null);
-			eventType = notification.getEventType();
-			boolean refreshTeam = false;
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				BreakdownElement e = (BreakdownElement) iter.next();
-				if (eventType == Notification.ADD
-						|| eventType == Notification.ADD_MANY) {
-					ProcessUtil.addToContainer(e, this, false);
-				}
-				if (e.getSuperActivities() == null) {
-					refreshTeam = true;					
-				}
-				else {
-					fireNotifyChanged(new ViewerNotification(notification, e,
-						false, true));
-				}
-			}
-
-			if (refreshTeam) {
-				fireNotifyChanged(new ViewerNotification(notification,
-						notification.getNotifier(), true, false));
-			}
-
-			return;
-		case UmaPackage.TEAM_PROFILE__PRESENTATION_NAME:
-			TeamProfile teamProfile = (TeamProfile) notification.getNotifier();
-			fireNotifyChanged(new ViewerNotification(notification, teamProfile,
-					false, true));
-			for (Iterator iter = teamProfile.getTeamRoles().iterator(); iter
-					.hasNext();) {
-				RoleDescriptor roleDescriptor = (RoleDescriptor) iter.next();
-				fireNotifyChanged(new ViewerNotification(notification,
-						roleDescriptor, false, true));
-			}
-			return;
-		case UmaPackage.ACTIVITY__SUPPRESSED:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, true));
-			return;
-		}
-		
-		super.notifyChanged(notification);
-	}
-
-	public Collection getEClasses() {
-		return ProcessUtil.getOBSEclasses();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createDragAndDropCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      java.lang.Object, float, int, int, java.util.Collection)
-	 */
-	protected Command createDragAndDropCommand(EditingDomain domain,
-			Object owner, float location, int operations, int operation,
-			Collection collection) {
-		return new OBSDragAndDropCommand(domain, owner, location, operations,
-				operation, collection)
-		// {
-		// public Collection getAffectedObjects() {
-		// Collection wrappers = new ArrayList();
-		// for (Iterator iter = super.getAffectedObjects().iterator();
-		// iter.hasNext();) {
-		// RoleDescriptor desc = (RoleDescriptor) iter.next();
-		// wrappers.add(TngUtil.getWrapper(teamRoleWrappers, desc.getRole()));
-		// }
-		// return wrappers;
-		// }
-		// }
-		;
-	}
-
-	private boolean descriptorExists(Object role) {
-		TeamProfile teamProfile = (TeamProfile) getTarget();
-		for (Iterator iter = teamProfile.getTeamRoles().iterator(); iter
-				.hasNext();) {
-			RoleDescriptor desc = (RoleDescriptor) iter.next();
-			if (desc.getRole() == role)
-				return true;
-		}
-		return false;
-	}
-
-	public GenericDropCommand.ElementAdapter createDropAdapter() {
-		if (dropAdapter == null) {
-			dropAdapter = new GenericDropCommand.ElementAdapter() {
-
-				public Object adapt(Object dropElement) {
-					if (dropElement instanceof Role
-							&& !descriptorExists(dropElement)
-					// && TngUtil.getWrapper(teamRoleWrappers, dropElement) ==
-					// null
-					) {
-						return ProcessUtil
-								.createRoleDescriptor((Role) dropElement);
-					}
-					return null;
-				}
-
-			};
-		}
-		return dropAdapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#getAttribute(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		if (property == IBSItemProvider.COL_TEAMS) {
-			return TngUtil.getPresentationName(((TeamProfile) object)
-					.getSuperTeam());
-		}
-		return super.getAttribute(object, property);
-	}
-
-	public void moveUp(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveUp((Activity) parent, obj, getEClasses(), actionMgr);
-		}
-		if ((parent != null) && (parent instanceof TeamProfile)) {
-			TeamProfile team = ((TeamProfile) parent);
-			List list = team.getSubTeam();
-			int location = 0;
-			for (int i = 0; i < list.size(); i++) {
-				if (obj.equals(list.get(i))) {
-					location = i;
-					break;
-				}
-			}
-
-			((EList) team.getSubTeam()).move(location, location - 1);
-
-			Activity activity = this.getActivity(obj);
-			TngUtil.moveUp(activity, obj, getEClasses(), actionMgr);
-		}
-	}
-
-	public void moveDown(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveDown((Activity) parent, obj, getEClasses(), actionMgr);
-		}
-		if ((parent != null) && (parent instanceof TeamProfile)) {
-			TeamProfile team = (TeamProfile) parent;
-			List list = team.getSubTeam();
-			int location = 0;
-
-			for (int i = 0; i < list.size(); i++) {
-				if (obj.equals(list.get(i))) {
-					location = i;
-					break;
-				}
-			}
-
-			((EList) team.getSubTeam()).move(location, location + 1);
-
-			Activity activity = this.getActivity(obj);
-			TngUtil.moveDown(activity, obj, getEClasses(), actionMgr);
-		}
-	}
-
-	public Activity getActivity(Object object) {
-		for (Object parent = getParent(object); parent != null;) {
-			if (parent instanceof Activity)
-				return (Activity) parent;
-			AdapterFactory aFactory = TngUtil
-					.getBestAdapterFactory(adapterFactory);
-			ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-					parent, ITreeItemContentProvider.class);
-			parent = adapter.getParent(parent);
-		}
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TeamProfileWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TeamProfileWrapperItemProvider.java
deleted file mode 100644
index dd7b7bd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/TeamProfileWrapperItemProvider.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.TeamProfile;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class TeamProfileWrapperItemProvider extends
-		BreakdownElementWrapperItemProvider {
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public TeamProfileWrapperItemProvider(TeamProfile value, Object owner,
-			AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param index
-	 * @param feature
-	 * @param adapterFactory
-	 */
-	public TeamProfileWrapperItemProvider(TeamProfile value, Object owner,
-			EStructuralFeature feature, int index, AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementWrapperItemProvider#getAttribute(java.lang.Object,
-	 *      java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		if (property == IBSItemProvider.COL_TEAMS) {
-			return TngUtil.getPresentationName(((TeamProfile) TngUtil
-					.unwrap(object)).getSuperTeam());
-		}
-		return super.getAttribute(object, property);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSActivityItemProvider.java
deleted file mode 100644
index 97d53a3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSActivityItemProvider.java
+++ /dev/null
@@ -1,253 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-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;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.command.WBSDragAndDropCommand;
-import org.eclipse.epf.library.edit.process.command.WBSDropCommand;
-import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class WBSActivityItemProvider extends BSActivityItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public WBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createPhase()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createIteration()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createActivity()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createTaskDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getActivity_BreakdownElements(), UmaFactory.eINSTANCE
-				.createMilestone()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.tng.process.BSActivityItemProvider#acceptAsChild(java.lang.Object)
-	 */
-	protected boolean acceptAsChild(Object child) {
-		child = TngUtil.unwrap(child);
-		if(child instanceof Activity || child instanceof TaskDescriptor
-				|| child instanceof Milestone) {
-			return super.acceptAsChild(child);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#getObject(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected Object getObject(Descriptor descriptor) {
-		return ((TaskDescriptor) descriptor).getTask();
-	}
-
-	protected Command createDragAndDropCommand(EditingDomain domain,
-			Object owner, float location, int operations, int operation,
-			Collection<?> collection) {
-		// System.out.println("ENTER:
-		// com.ibm.library.edit.process.WBSActivityItemProvider#createDragAndDropCommand(domain,
-		// owner, location, operations, operation, collection)");
-		Command cmd = new WBSDragAndDropCommand(domain, owner, location,
-				operations, operation, collection);
-
-//		 System.out.println(" can execute: " + cmd.canExecute());
-//		 System.out.println(" owner: " + owner);
-//		 System.out.println(" collection: " + collection);
-//		 System.out.println(" location: " + location);
-//		 System.out.println(" operations: " + operations);
-//		 System.out.println(" operation: " + operation);
-		//        
-		// System.out
-		// .println("EXIT:
-		// com.ibm.library.edit.process.WBSActivityItemProvider#createDragAndDropCommand(domain,
-		// owner, location, operations, operation, collection)");
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	public IResourceAwareCommand createDropCommand(Object owner,
-			List dropElements) {
-		return new WBSDropCommand((Activity) owner, dropElements);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#acceptAsRolledUpChild(java.lang.Object)
-	 */
-	protected boolean acceptAsRolledUpChild(Object child) {
-		Object obj = TngUtil.unwrap(child);
-		if(obj instanceof TaskDescriptor) {
-			return super.acceptAsRolledUpChild(obj);
-		}
-		return false;
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// com.ibm.library.edit.process.BSActivityItemProvider#getColumnImage(java.lang.Object,
-	// int)
-	// */
-	// public Object getColumnImage(Object object, int columnIndex) {
-	// BreakdownElement e = (BreakdownElement)object;
-	// String property = (String) columnIndexToNameMap.get(new
-	// Integer(columnIndex));
-	// Boolean b = null;
-	// if(property == IBSItemProvider.COL_IS_EVENT_DRIVEN) {
-	// b = e.getIsEventDriven();
-	// }
-	// else if(property == IBSItemProvider.COL_IS_ONGOING) {
-	// b = e.getIsOngoing();
-	// }
-	// else if(property == IBSItemProvider.COL_IS_REPEATABLE) {
-	// b = e.getIsRepeatable();
-	// }
-	// if(b != null) {
-	// if(b.booleanValue()) {
-	// return TngEditPlugin.INSTANCE.getImage("checked_box");
-	// }
-	// else {
-	// return TngEditPlugin.INSTANCE.getImage("unchecked_box");
-	// }
-	// }
-	// return super.getColumnImage(object, columnIndex);
-	// }
-
-	public Collection getEClasses() {
-		return ProcessUtil.getWBSEclasses();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#refreshChildrenData(org.eclipse.emf.common.notify.Notification,
-	 *      java.util.List)
-	 */
-	protected boolean refreshChildrenData(Notification notification,
-			List affectedChildren) {
-		// recalculate the IDs of breakdown elements and refresh them
-		//
-		Process topAct = (Process) getTopItem();
-		AdapterFactory rootAdapterFactory = getRootAdapterFactory();
-
-		ProcessUtil.updateIDs(rootAdapterFactory, topAct);
-
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#doRefreshAffectedViewers()
-	 */
-	protected void doRefreshAffectedViewers() {
-		Object proc = getTopItem();
-		Object itemProvider = adapterFactory.adapt(proc,
-				ITreeItemContentProvider.class);
-		if (itemProvider instanceof BSActivityItemProvider) {
-			((BSActivityItemProvider) itemProvider)
-					.setRefreshAllIDsRequired(true);
-		}
-
-		ProcessUtil
-				.refreshIDsInViewers((ExposedAdapterFactory) getRootAdapterFactory());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		Collection children = super.getChildren(object);
-		updateCachedChildren(children);
-		return children;
-	}
-	
-	@Override
-	protected boolean isWrappingRollupNeeded(Object object) {
-		if(TngUtil.unwrap(object) instanceof TaskDescriptor) {
-			return true;
-		}
-		return super.isWrappingRollupNeeded(object);
-	}
-
-	@Override
-	protected Object createRollupWrapper(Object object, Object owner, AdapterFactory adapterFactory) {
-		Object wrapper = super.createRollupWrapper(object, owner, adapterFactory);
-		return new TaskDescriptorWrapperItemProvider(wrapper, owner, adapterFactory);
-	}
-	
-	@Override
-	protected ComposedBreakdownElementWrapperItemProvider createComposedWrapper(Object object, Object owner, AdapterFactory adapterFactory) {
-		return new ComposedBreakdownElementWrapperItemProvider(object, owner, adapterFactory) {
-			@Override
-			protected boolean canMerge(String property) {
-				return property == IBSItemProvider.COL_ID || property == IBSItemProvider.COL_PREDECESSORS
-					|| property == IBSItemProvider.COL_MODEL_INFO;
-			}
-		};
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSItemProviderAdapterFactory.java
deleted file mode 100644
index b773824..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.common.preferences.IPropertyChangeEventWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeListenerWrapper;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class WBSItemProviderAdapterFactory extends ItemProviderAdapterFactory
-		implements IPropertyChangeListenerWrapper {
-
-	public WBSItemProviderAdapterFactory() {
-		super();
-		supportedTypes.add(ITableItemLabelProvider.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new WBSActivityItemProvider(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createIterationAdapter()
-	 */
-	public Adapter createIterationAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createPhaseAdapter() {
-		return createActivityAdapter();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.BreakdownAdapterFactory#createPhaseAdapter()
-	 */
-	public Adapter createMilestoneAdapter() {
-		return new WBSMilestoneItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createMilestoneAdapter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.ItemProviderAdapterFactory#createProcessAdapter()
-	 */
-	public Adapter createProcessAdapter() {
-		return createActivityAdapter();
-	}
-
-	public Adapter createCapabilityPatternAdapter() {
-		return new WBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new WBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createDeliveryProcessAdapter());
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.common.preferences.IPropertyChangeListenerWrapper#propertyChange(org.eclipse.epf.common.preferences.IPropertyChangeEventWrapper)
-	 */
-	public void propertyChange(IPropertyChangeEventWrapper event) {
-		if (event.getProperty().equals(LibraryEditConstants.PREF_WBS_COLUMNS)) {
-			setColumnIndexToNameMap(ProcessUtil
-					.toColumnIndexToNameMap((String) event.getNewValue()));
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSMilestoneItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSMilestoneItemProvider.java
deleted file mode 100644
index 49f09aa..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSMilestoneItemProvider.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-
-
-/**
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class WBSMilestoneItemProvider extends BreakdownElementItemProvider {
-
-	// private Collection eClasses = new HashSet();
-	/**
-	 * @param adapterFactory
-	 */
-	public WBSMilestoneItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(WorkBreakdownElement.class)) {
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	
-	// /* (non-Javadoc)
-	// * @see
-	// com.ibm.library.edit.process.WBSActivityItemProvider#getChildren(java.lang.Object)
-	// */
-	// public Collection getChildren(Object object) {
-	// return TngUtil.getAllChildren((ProcessContribution) object,
-	// super.getChildren(object),
-	// TngUtil.getBestAdapterFactory(adapterFactory));
-	// }
-	//    
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#getElements(java.lang.Object)
-	// */
-	// public Collection getElements(Object object) {
-	// Collection elements = super.getElements(object);
-	// return elements;
-	// }
-
-	// public List getFilteredBreakdownElements(Object activity, Object obj)
-	// {
-	// List elements = new ArrayList();
-	// List breakdownElements = ((Activity)activity).getBreakdownElements();
-	// for (Iterator it = breakdownElements.iterator(); it.hasNext();)
-	// {
-	// Object elementObj = it.next();
-	// if ((elementObj instanceof TaskDescriptor) || (elementObj instanceof
-	// Milestone) || (elementObj instanceof Activity))
-	// {
-	// elements.add(elementObj);
-	// }
-	// }
-	// return elements;
-	// }
-
-	public Collection getEClasses() {
-		return ProcessUtil.getWBSEclasses();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSProcessItemProvider.java
deleted file mode 100644
index 72f57db..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WBSProcessItemProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class WBSProcessItemProvider extends WBSActivityItemProvider {
-
-	private ItemProviderAdapter delegateItemProvider;
-
-	public WBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#getPropertyDescriptors(java.lang.Object)
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			itemPropertyDescriptors = delegateItemProvider
-					.getPropertyDescriptors(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkOrderItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkOrderItemProvider.java
deleted file mode 100644
index ad39276..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkOrderItemProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class WorkOrderItemProvider extends
-		org.eclipse.epf.uma.provider.WorkOrderItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public WorkOrderItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.emf.edit.provider.ItemProviderAdapter#createInitializeCopyCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	// org.eclipse.emf.ecore.EObject,
-	// org.eclipse.emf.edit.command.CopyCommand.Helper)
-	// */
-	// protected Command createInitializeCopyCommand(EditingDomain domain,
-	// EObject owner, Helper helper) {
-	// return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.DescribableElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkProductDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkProductDescriptorItemProvider.java
deleted file mode 100644
index 2798848..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkProductDescriptorItemProvider.java
+++ /dev/null
@@ -1,435 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-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;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.ICachedChildrenItemProvider;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.command.WorkProductDescriptorCreateCopyCommand;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class WorkProductDescriptorItemProvider extends DescriptorItemProvider
-implements ICachedChildrenItemProvider
-{
-	protected Collection cachedChildren;
-	
-	/**
-	 * @param adapterFactory
-	 */
-	public WorkProductDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Activity getActivity(Object object) {
-		for (Object parent = getParent(object); parent != null;) {
-			if (parent instanceof Activity)
-				return (Activity) parent;
-			AdapterFactory aFactory = getRootAdapterFactory();
-			ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-					parent, ITreeItemContentProvider.class);
-			parent = adapter.getParent(parent);
-		}
-		return null;
-	}
-
-	private Object getDescriptor(Activity activity, Artifact artifact) {
-		if (activity == null)
-			return null;
-		List list = activity.getBreakdownElements();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			Object obj = list.get(i);
-			if ((obj instanceof WorkProductDescriptor)
-					&& (artifact == ((WorkProductDescriptor) obj)
-							.getWorkProduct())) {
-				return obj;
-			}
-		}
-		return null;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		// if (childrenFeatures == null)
-		// {
-		// childrenFeatures = new ArrayList();
-		// childrenFeatures.add(UmaPackage.eINSTANCE.getWorkProductDescriptor_DeliverableParts());
-		// }
-		// return childrenFeatures;
-
-		return Collections.EMPTY_LIST;
-	}
-	
-	private void updateCachedChildren(Collection children) {
-//		if(cachedChildren == null) {
-//			cachedChildren = new ArrayList(children);
-//		}
-//		else {
-//			cachedChildren.clear();
-//			cachedChildren.addAll(children);
-//		}
-	}
-	
-	protected void addContainedArtifactDescriptors(WorkProductDescriptor wpDesc, Collection children) {
-		Activity activity = UmaUtil.getParentActivity(wpDesc);
-		if(activity != null) {
-			Artifact artifact = (Artifact) wpDesc.getWorkProduct();
-			List list = artifact.getContainedArtifacts();
-			int size = list.size();
-			if(size > 0) {
-				ArrayList artifactDescriptors = new ArrayList();
-				for (int i = 0; i < size; i++) {
-					Object descriptor = getDescriptor(activity, (Artifact) list
-							.get(i));
-					if (descriptor != null) {
-						artifactDescriptors.add(descriptor);
-					}
-				}
-				if(!artifactDescriptors.isEmpty()) {
-					Collections.sort(artifactDescriptors, Comparators.PRESENTATION_NAME_COMPARATOR);
-					children.addAll(artifactDescriptors);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		WorkProductDescriptor wpDesc = (WorkProductDescriptor) object;
-		
-		// don't show the children of the non-deliverable work product descriptor
-		// that is deliverable part of a deliverable work product descriptor
-		//
-		if(!(wpDesc.getWorkProduct() instanceof Deliverable)) {
-			Object parent = TngUtil.unwrap(getParent(object));
-			if(parent instanceof WorkProductDescriptor
-					&& ((WorkProductDescriptor)parent).getWorkProduct() instanceof Deliverable) {				
-				updateCachedChildren(Collections.EMPTY_LIST);
-				return Collections.EMPTY_LIST;
-			}
-		}
-		
-		Collection children = super.getChildren(object);
-
-		// add deliverable parts
-		//
-		if(!wpDesc.getDeliverableParts().isEmpty()) {
-			for (Iterator iter = wpDesc.getDeliverableParts().iterator(); iter
-			.hasNext();) {
-				WorkProductDescriptor desc = (WorkProductDescriptor) iter.next();
-				if (desc.getSuperActivities() == null) {
-					children.add(desc);
-				}
-			}
-		}
-		
-		// get descriptors of contained artifacts
-		//		
-		if (wpDesc.getWorkProduct() instanceof Artifact) {
-			addContainedArtifactDescriptors(wpDesc, children);
-		}
-
-		// set parent
-		//
-		AdapterFactory aFactory = getRootAdapterFactory();
-
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			IBSItemProvider adapter = (IBSItemProvider) aFactory.adapt(iter
-					.next(), ITreeItemContentProvider.class);
-			adapter.setParent(object);
-		}
-		
-		updateCachedChildren(children);
-		
-		return children;
-	}
-	
-	/**
-	 * Gets children from cache, fill the children cache if it is not initialized yet
-	 * 
-	 * @return
-	 */
-	public Collection getChildrenFromCache() {
-		if(cachedChildren == null) {
-			getChildren(target);
-		}
-		return cachedChildren;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getRollupChildrenFromCache()
-	 */
-	public Collection getRollupChildrenFromCache() {
-		return Collections.EMPTY_LIST;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BreakdownElementItemProvider#dispose()
-	 */
-	public void dispose() {
-		if(cachedChildren != null) {
-			cachedChildren.clear();
-			cachedChildren = null;
-		}
-		
-		super.dispose();
-	}
-
-	public void notifyChanged(Notification notification) {
-		switch (notification.getFeatureID(WorkProductDescriptor.class)) {
-//		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO:
-//		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO:
-//		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO:
-//		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM:
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-			List elements = ProcessUtil.getAffectedElements(notification, null);
-			int eventType = notification.getEventType();
-			boolean refresh = false;
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				BreakdownElement e = (BreakdownElement) iter.next();
-				if (eventType == Notification.ADD
-						|| eventType == Notification.ADD_MANY) {
-					ProcessUtil.addToContainer(e, this, false);
-				}
-				if (e.getSuperActivities() != null) {
-					fireNotifyChanged(new ViewerNotification(notification, e,
-							false, true));
-				} else {
-					refresh = true;
-				}
-			}
-
-			if (refresh) {
-				fireNotifyChanged(new ViewerNotification(notification,
-						notification.getNotifier(), true, false));
-			}
-
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-			WorkProductDescriptor wpd = (WorkProductDescriptor) notification
-					.getNotifier();
-			fireNotifyChanged(new ViewerNotification(notification, wpd, false,
-					true));
-			if (wpd.getWorkProduct() instanceof Deliverable) {
-				for (Iterator iter = wpd.getDeliverableParts().iterator(); iter
-						.hasNext();) {
-					Object descriptor = iter.next();
-					fireNotifyChanged(new ViewerNotification(notification,
-							descriptor, false, true));
-				}
-			}
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__SUPPRESSED:
-			Object notifier = notification.getNotifier();
-			WorkProduct wp;
-			boolean contentRefresh = notifier instanceof WorkProductDescriptor
-				&& ((wp = ((WorkProductDescriptor)notifier).getWorkProduct()) instanceof Artifact
-						|| wp instanceof Deliverable);
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), contentRefresh, true));
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBSItemProvider#setAttribute(java.lang.Object,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public void setAttribute(Object object, String prop, String txt) {
-		WorkProductDescriptor wpd = (WorkProductDescriptor) object;
-
-		if (prop == IBSItemProvider.COL_ENTRY_STATE) {
-			wpd.setActivityEntryState(txt);
-		} else if (prop == IBSItemProvider.COL_EXIT_STATE) {
-			wpd.setActivityExitState(txt);
-		} else {
-			super.setAttribute(object, prop, txt);
-		}
-	}
-
-	// private boolean isTopLevelArtifactInActivity(Activity activity, Object
-	// obj)
-	// {
-	// AdapterFactory aFactory = TngUtil.getBestAdapterFactory(adapterFactory);
-	//        
-	// BSActivityItemProvider adapter = (BSActivityItemProvider)
-	// aFactory.adapt(activity, ITreeItemContentProvider.class);
-	// Collection children = adapter.getChildren(activity);
-	// if (children.contains(obj))
-	// {
-	// //System.out.println("child - " + obj);
-	// return true;
-	// }
-	// return false;
-	// }
-
-	public Collection getEClasses() {
-		return ProcessUtil.getPBSEclasses();
-	}
-
-	public void moveUp(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveUp((Activity) parent, obj, getEClasses(), actionMgr);
-		}
-		if ((parent != null) && (parent instanceof WorkProductDescriptor)) {
-			WorkProduct wp = ((WorkProductDescriptor) parent).getWorkProduct();
-			if (wp instanceof Artifact) {
-				Artifact artifact = (Artifact) wp;
-				List list = artifact.getContainedArtifacts();
-				WorkProduct objWP = ((WorkProductDescriptor) obj)
-						.getWorkProduct();
-
-				int location = 0;
-				// List newList = new ArrayList();
-				for (int i = 0; i < list.size(); i++) {
-					if (objWP.equals(list.get(i))) {
-						location = i;
-						break;
-					}
-				}
-
-				((EList) artifact.getContainedArtifacts()).move(location,
-						location - 1);
-			}
-
-			Activity activity = this.getActivity(obj);
-			TngUtil.moveUp(activity, obj, getEClasses(), actionMgr);
-		}
-	}
-
-	public void moveDown(Object obj, IActionManager actionMgr) {
-		Object parent = this.getParent(obj);
-		if ((parent != null) && (parent instanceof Activity)) {
-			TngUtil.moveDown((Activity) parent, obj, getEClasses(), actionMgr);
-		}
-		if ((parent != null) && (parent instanceof WorkProductDescriptor)) {
-			WorkProduct wp = ((WorkProductDescriptor) parent).getWorkProduct();
-			if (wp instanceof Artifact) {
-				Artifact artifact = (Artifact) wp;
-				List list = artifact.getContainedArtifacts();
-				WorkProduct objWP = ((WorkProductDescriptor) obj)
-						.getWorkProduct();
-
-				int location = 0;
-				// List newList = new ArrayList();
-				for (int i = 0; i < list.size(); i++) {
-					if (objWP.equals(list.get(i))) {
-						location = i;
-						break;
-					}
-				}
-
-				((EList) artifact.getContainedArtifacts()).move(location,
-						location + 1);
-			}
-
-			Activity activity = this.getActivity(obj);
-			TngUtil.moveDown(activity, obj, getEClasses(), actionMgr);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#createCreateCopyCommand(org.eclipse.emf.edit.domain.EditingDomain,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.edit.command.CopyCommand.Helper)
-	 */
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new WorkProductDescriptorCreateCopyCommand(domain, owner, helper);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#factorRemoveCommand(org.eclipse.emf.edit.domain.EditingDomain, org.eclipse.emf.edit.command.CommandParameter)
-	 */
-	protected Command factorRemoveCommand(EditingDomain domain, CommandParameter commandParameter) {
-		if(!(commandParameter.getOwner() instanceof Activity)) {
-			Activity act = getActivity(target);
-			if(act != null) {
-				IEditingDomainItemProvider adapter = (IEditingDomainItemProvider) adapterFactory.adapt(act, IEditingDomainItemProvider.class);
-				commandParameter.setOwner(act);
-				return adapter.createCommand(act, domain, RemoveCommand.class, commandParameter);				
-			}
-		}
-		return super.factorRemoveCommand(domain, commandParameter);
-	}
-	
-	public String getAttribute(Object object, String property) {
-		// EPF bug#: 144820 Some nested work product descriptors show wrong model info in work product usage view
-		// for defect, override the method, previously DescriptorItemProvide.getAttribute use to have this code, moved to here. 
-		if (property == IBSItemProvider.COL_MODEL_INFO) {
-			StringBuffer modelInfo = new StringBuffer();
-				if (object instanceof WorkProductDescriptor) {
-//					ProcessUtil.getModelInfoForWorkProductDescriptor(modelInfo,
-//							(WorkProductDescriptor) object);
-					ProcessUtil.getWPDModelInfo(modelInfo, object, this);
-				}
-//			}
-			return modelInfo.toString(); 
-		}
-		return super.getAttribute(object, property);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkProductDescriptorWrapperItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkProductDescriptorWrapperItemProvider.java
deleted file mode 100644
index 51103dd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/WorkProductDescriptorWrapperItemProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class WorkProductDescriptorWrapperItemProvider extends
-		BreakdownElementWrapperItemProvider {
-	
-	protected WorkProductDescriptorWrapperItemProvider(Object value, Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param adapterFactory
-	 */
-	public WorkProductDescriptorWrapperItemProvider(WorkProductDescriptor value,
-			Object owner, AdapterFactory adapterFactory) {
-		super(value, owner, adapterFactory);
-	}
-
-	/**
-	 * @param value
-	 * @param owner
-	 * @param index
-	 * @param feature
-	 * @param adapterFactory
-	 */
-	public WorkProductDescriptorWrapperItemProvider(
-			WorkProductDescriptor value, Object owner,
-			EStructuralFeature feature, int index, AdapterFactory adapterFactory) {
-		super(value, owner, feature, index, adapterFactory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityAddCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityAddCommand.java
deleted file mode 100644
index 2d575a8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityAddCommand.java
+++ /dev/null
@@ -1,275 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.CopyCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-
-/**
- * AddCommand for activity
- * 
- * @author Phong Nguyen Le - Sep 16, 2005
- * @since 1.0
- * @see 
- */
-public class ActivityAddCommand extends ProcessElementAddCommand {
-	private List procPackages;
-
-	/**
-	 * @param command
-	 */
-	public ActivityAddCommand(Command command) {
-		super(command);
-	}
-
-	private Map getCopyToOriginalMap() {
-		EditingDomain ed = addCommand.getDomain();
-		if (ed instanceof TraceableAdapterFactoryEditingDomain) {
-			return ((TraceableAdapterFactoryEditingDomain) ed)
-					.getCopyToOriginalMap();
-		}
-		return null;
-	}
-
-	private void copyProcessPackages() {
-		if (procPackages == null) {
-			if (hasCopyToOriginalMap()) {
-				boolean showWarning = false;
-				procPackages = new ArrayList();
-				ArrayList<Activity> copiedActivities = new ArrayList();
-
-				// check first element of addCommand.getCollection()
-				// if it's a key in the CopyToOriginalMap, we are pasting and
-				// may need to warn the user
-				// if it's not a key in the CopyToOriginalMap, then we are
-				// probably adding a new element				
-				if (addCommand.getCollection() != null
-						&& addCommand.getCollection().size() > 0
-						&& getOriginal(addCommand.getCollection().toArray()[0]) != null) {
-					for (Iterator iter = addCommand.getCollection().iterator(); iter
-							.hasNext();) {
-						Object element = iter.next();
-						if (element instanceof Activity) {
-							Activity orig = (Activity) getOriginal(element);
-							if (orig != null) {
-								if (orig.eContainer() != null) {
-									procPackages.add(orig.eContainer());
-									copiedActivities.add((Activity) element);
-								}
-							} else {
-								showWarning = true;
-							}
-						}
-					}
-				}
-
-				if (showWarning) {
-					Messenger.INSTANCE
-							.showWarning(
-									getLabel(),
-									LibraryEditResources.ActivityAddCommand_originalNotFoundWarning_msg);
-				}
-
-				if (!procPackages.isEmpty()) {
-					// copy the ProcessPackage of the original Activity to add
-					// it to the ProcessPackage
-					// of the target Activity.
-					//
-					// AdapterFactoryEditingDomain editingDomain = new
-					// AdapterFactoryEditingDomain(TngAdapterFactory.INSTANCE.getProcessComposedAdapterFactory()
-					// , new BasicCommandStack());
-					Command command = CopyCommand.create(
-							addCommand.getDomain(), procPackages);
-					try {
-						command.execute();
-
-						// Refresh the AddCommand.collection with new activity copies.
-						//
-						Collection collection = new ArrayList(addCommand.getCollection());
-						Collection elements = addCommand.getCollection();						
-						elements.clear();	
-						Collection col = command.getResult();
-						ArrayList<ProcessPackage> procPkgCopies = new ArrayList<ProcessPackage>(col);
-//						ArrayList<ProcessPackage> procPkgCopies = new ArrayList<ProcessPackage>(command.getResult());
-						for (Iterator iter = collection.iterator(); iter
-								.hasNext();) {
-							Object element = (Object) iter.next();
-							int index = copiedActivities.indexOf(element);
-							if(index != -1) {
-								ProcessPackage copy = procPkgCopies.get(index);
-								element = getActivityCopy(copy);
-							}
-							if(element != null) {
-								elements.add(element);
-							}
-						}
-						
-					} finally {
-						if (command != null) {
-							command.dispose();
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private Activity getActivityCopy(ProcessPackage copy) {
-		if (copy instanceof ProcessComponent) {
-			Activity actCopy = ((ProcessComponent) copy)
-					.getProcess();
-			// copy data from ProcessComponent to a new
-			// ProcessPackage
-			ProcessPackage pkgCopy = UmaFactory.eINSTANCE
-					.createProcessPackage();
-			pkgCopy.setName(actCopy.getName());
-			pkgCopy.getProcessElements().add(actCopy);
-			pkgCopy.getProcessElements().addAll(
-					copy.getProcessElements());
-			pkgCopy.getDiagrams()
-					.addAll(copy.getDiagrams());
-			pkgCopy.getChildPackages().addAll(
-					copy.getChildPackages());
-
-			return actCopy;
-		} else {
-			for (Iterator iterator = copy.getProcessElements().iterator(); iterator
-					.hasNext();) {
-				Object element = iterator.next();
-				if (element instanceof Activity) {
-					return (Activity) element;
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.MethodElementAddCommand#execute()
-	 */
-	public void execute() {
-		prepareAddList();
-		copyProcessPackages();
-		super.execute();
-	}
-
-	/**
-	 * Checks if e is a child, direct or of act
-	 * 
-	 * @param act
-	 * @param e
-	 * @return
-	 */
-	private static boolean isChildOf(Object parent, Object e) {
-		if (parent instanceof Activity) {
-			Activity act = (Activity) parent;
-			for (Iterator iter = act.getBreakdownElements().iterator(); iter
-					.hasNext();) {
-				Object child = iter.next();
-				if (e == child) {
-					return true;
-				}
-				if (isChildOf(child, e)) {
-					return true;
-				}
-			}
-		}
-		// else if(parent instanceof WorkProductDescriptor) {
-		// WorkProduct wp = ((WorkProductDescriptor)parent).getWorkProduct();
-		// if(wp instanceof Artifact) {
-		// if(e instanceof WorkProductDescriptor) {
-		// if(UmaUtil.isContainedBy(((WorkProductDescriptor)e).getWorkProduct(),
-		// wp)) {
-		// return true;
-		// }
-		// }
-		// }
-		// }
-		return false;
-	}
-
-	private static boolean isChildOf(Collection elements, Object e) {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			if (isChildOf(iter.next(), e)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean hasCopyToOriginalMap() {
-		EditingDomain ed = addCommand.getDomain();
-		if (ed instanceof TraceableAdapterFactoryEditingDomain) {
-			TraceableAdapterFactoryEditingDomain editingDomain = ((TraceableAdapterFactoryEditingDomain) ed);
-			return (editingDomain.getCopyToOriginalMap() != null &&
-					!editingDomain.getCopyToOriginalMap().isEmpty())
-				|| (editingDomain.getClipboardToOriginalMap() != null &&
-						!editingDomain.getClipboardToOriginalMap().isEmpty());
-		}
-		return false;
-	}
-	
-	private Object getOriginal(Object copy) {
-		TraceableAdapterFactoryEditingDomain ed = (TraceableAdapterFactoryEditingDomain) addCommand.getDomain();
-		Object original = ed.getCopyToOriginalMap().get(copy);
-		if(original == null && ed.getClipboardToOriginalMap() != null) {
-			original = ed.getClipboardToOriginalMap().get(copy);
-		}
-		return original;
-	}
-
-	private void prepareAddList() {
-		// cleanup element list before adding it to the activity to avoid adding
-		// elements multiple times
-		//		
-		if (hasCopyToOriginalMap()) {
-			ArrayList originals = new ArrayList();
-			Map originalToCopyMap = new HashMap();
-			for (Iterator iter = addCommand.getCollection().iterator(); iter
-					.hasNext();) {
-				Object element = iter.next();
-				Object original = getOriginal(element);
-				if (original != null) {
-					originals.add(original);
-					originalToCopyMap.put(original, element);
-				}
-			}
-
-			ArrayList removeList = new ArrayList();
-			// ArrayList addList = new ArrayList();
-			for (Iterator iter = originals.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (isChildOf(originals, element)) {
-					removeList.add(originalToCopyMap.get(element));
-				}
-			}
-			addCommand.getCollection().removeAll(removeList);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDeepCopyCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDeepCopyCommand.java
deleted file mode 100644
index be036b3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDeepCopyCommand.java
+++ /dev/null
@@ -1,903 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage.Literals;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.command.CopyCommand;
-import org.eclipse.emf.edit.command.CreateCopyCommand;
-import org.eclipse.emf.edit.command.InitializeCopyCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.VariabilityInfo;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ConfigurationSetter;
-import org.eclipse.epf.library.edit.util.ConstraintManager;
-import org.eclipse.epf.library.edit.util.DepthLevelAdapterFactoryTreeIterator;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.ITextReferenceReplacer;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Physically copies an activity with all of its direct or inherited structural features and references.
- *   
- * @author Phong Nguyen Le - Jun 21, 2006
- * @since  1.0
- */
-public class ActivityDeepCopyCommand extends CopyCommand {
-	private static final AdapterFactory[] adapterFactories = {
-		TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory(),
-		TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory(),
-		TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory()
-	};
-	
-	private static final int[] diagramTypes = {
-		IDiagramManager.ACTIVITY_DETAIL_DIAGRAM,
-		IDiagramManager.ACTIVITY_DIAGRAM,
-		IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM
-	};
-	
-	public static AdapterFactory[] getAdapterFactories() {
-		return adapterFactories;
-	}
-	
-	private class EditingDomain extends AdapterFactoryEditingDomain {
-
-		/**
-		 * @param adapterFactory
-		 * @param commandStack
-		 */
-		public EditingDomain() {
-			super(TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory(), new BasicCommandStack());
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain#createCommand(java.lang.Class, org.eclipse.emf.edit.command.CommandParameter)
-		 */
-		public Command createCommand(Class commandClass, CommandParameter commandParameter) {
-			if(commandClass == CreateCopyCommand.class) {
-				return new CreateDeepCopyCommand(this, commandParameter.getEOwner(), (Helper) commandParameter.getValue());
-			}
-			if(commandClass == InitializeCopyCommand.class) {
-				return new InitializeDeepCopyCommand(this, commandParameter.getEOwner(), (Helper) commandParameter.getValue());
-			}
-			return super.createCommand(commandClass, commandParameter);
-		}
-	}
-	
-	@Override
-	protected void addCreateCopyCommands(CompoundCommand compoundCommand,
-			EObject object) {
-
-		// Operation to handle copy replacers
-		// 
-		if (object instanceof ProcessPackage &&	object != this.activity.eContainer() ) {			
-			ProcessPackage pkg = (ProcessPackage)object;
-			boolean isReplaced = false;
-			Activity replacer = null;
-			Activity orignalActivity = null;
-			for(Object procesElement : pkg.getProcessElements()){
-				if (procesElement instanceof Activity) {
-					replacer = getReplacer( (Activity)procesElement );
-					if (replacer != null ) {
-						isReplaced = true;
-						orignalActivity = (Activity)procesElement;
-						break;
-					}
-				}
-			}
-			if (isReplaced) {				
-				copyHelper.decrementDeferredInitializationCount();
-				ActivityDeepCopyCommand cmd = new ActivityDeepCopyCommand(replacer, (CopyHelper)copyHelper, config, 
-						targetProcess, monitor, false,activityDeepCopyConfigurator);
-				cmd.guidList = new LinkedList<String>(ActivityDeepCopyCommand.this.guidList);
-				cmd.guidList.addAll(ProcessUtil.getGuidList(ActivityDeepCopyCommand.this.activity, orignalActivity));
-				try {
-					cmd.execute();
-					ProcessPackage pkgCopy = cmd.pkgCopy;					
-					//basic put: original prc pkg to copied pkg based on replaced package.
-					((CopyHelper)copyHelper).basicPut(object, pkgCopy);			
-					//basic put original activity to the copy of replacer activity.
-					((CopyHelper)copyHelper).basicPut(orignalActivity, copyHelper.get(replacer));
-				}finally{
-					cmd.dispose();
-				}	
-				copyHelper.incrementDeferredInitializationCount();				
-				return;
-			}
-		}
-		
-		super.addCreateCopyCommands(compoundCommand, object);
-	
-	}
-	
-	/**
-	 * Checks for the replacer of activity in the copy based configuration.
-	 *  
-	 * @param activity target activity
-	 * @return replcacer or null if it doesn't have one
-	 */
-	protected Activity getReplacer(Activity activity){		
-		ConfigurationSetter configSetter = new ConfigurationSetter(getAdapterFactory());
-		try {
-			if (activityDeepCopyConfigurator != null ) {
-				MethodConfiguration currentConfig = configSetter.getOldConfiguration(); 
-				MethodConfiguration copyConfig = config == null ? (currentConfig != null ? currentConfig
-						: targetProcess.getDefaultContext())
-						: config;
-				activityDeepCopyConfigurator.setMethodConfiguration(copyConfig);				
-
-				VariabilityInfo variabilityInfo = activityDeepCopyConfigurator.getVariabilityInfo(activity);
-
-				if (variabilityInfo != null && ! variabilityInfo.getInheritanceList().isEmpty() ) {
-					Activity replacer = (Activity)variabilityInfo.getInheritanceList().get(0);
-					return  replacer == activity ? null : replacer;
-				}
-			}
-			return null;
-		} finally{
-			if (configSetter != null ) {
-				configSetter.restore();
-			}
-		}
-	}
-	
-	/**
-	 * Checks for the contributors of activity in the copy based configuration.
-	 * @param activity
-	 * @return a list including contributors or empty list
-	 */
-	protected List getContributors(Activity activity){
-		ConfigurationSetter configSetter = new ConfigurationSetter(getAdapterFactory());
-		try {
-			if (activityDeepCopyConfigurator != null ) {
-				MethodConfiguration currentConfig = configSetter.getOldConfiguration(); 
-				MethodConfiguration copyConfig = config == null ? (currentConfig != null ? currentConfig
-						: targetProcess.getDefaultContext())
-						: config;
-				activityDeepCopyConfigurator.setMethodConfiguration(copyConfig);				
-
-				VariabilityInfo variabilityInfo = activityDeepCopyConfigurator.getVariabilityInfo(activity);
-
-				if (variabilityInfo != null ) {
-					return variabilityInfo.getContributors();
-				}
-			}
-			return Collections.EMPTY_LIST;
-		} finally{
-			if (configSetter != null ) {
-				configSetter.restore();
-			}
-		}
-	}
-	private class CreateDeepCopyCommand extends CreateCopyCommand {
-
-		/**
-		 * @param domain
-		 * @param owner
-		 * @param copyHelper
-		 */
-		public CreateDeepCopyCommand(EditingDomain domain, EObject owner, Helper copyHelper) {
-			super(domain, owner, copyHelper);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.edit.command.CreateCopyCommand#doGetChildrenToCopy()
-		 */
-		public Collection<?> doGetChildrenToCopy() {
-			ConfigurationSetter configSetter = new ConfigurationSetter(getAdapterFactory());
-			try {
-				configSetter.set(config);
-				IConfigurator configurator = configSetter.getConfigurator();
-				
-				// Create commands to create copies of the children.
-				//
-				List<Object> result = new ArrayList<Object>();
-				for (Iterator<EObject> i = owner.eContents().iterator(); i.hasNext(); )
-				{
-					Object o = i.next();
-					if(o instanceof Activity) {
-						// make sure that Activity will be copied first
-						// so references to its inherited elements can be resolved
-						// properly
-						//
-						if(configurator == null || configurator.accept(o)) {
-							result.add(0, o);
-						}
-					}
-					else {
-						result.add(o);
-					}
-				}
-				return result;
-			}
-			finally {
-				configSetter.restore();
-			}
-		}
-		
-	}
-	
-	private class InitializeDeepCopyCommand extends MethodElementInitializeCopyCommand {
-		/**
-		 * List of GUIDs of activity starting from the top process to 
-		 */
-		private List<String> guidList;
-		
-		/**
-		 * @param domain
-		 * @param owner
-		 * @param copyHelper
-		 */
-		public InitializeDeepCopyCommand(EditingDomain domain, EObject owner, Helper copyHelper) {
-			super(domain, owner, copyHelper);
-			copy = (EObject) copyHelper.get(owner);
-		}
-		
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand#copyReferences()
-		 */
-		protected void copyReferences() {
-			Activity base = null;
-			Activity baseCopy = null;
-			Collection<Object> childBaseCopies = new HashSet<Object>();
-			ConfigurationSetter configSetter = null;
-			IConfigurator configurator = null;
-			boolean baseAccepted = false;
-			try {
-				if(owner instanceof Activity) {
-					Activity activity = (Activity) owner;
-					if(ProcessUtil.isExtendingOrLocallyContributing(activity)) {
-						configSetter = new ConfigurationSetter(getAdapterFactory());
-						configSetter.set(config);
-						configurator = configSetter.getConfigurator();
-						// copy inherited elements by deep-copying base activity
-						//
-						// deep copy of base activity at this point is essential so references to predecessors
-						// will be copied correctly
-						//
-						base = (Activity) activity.getVariabilityBasedOnElement();
-						baseAccepted = configurator == null || configurator.accept(base);
-						if(baseAccepted) {							
-							CopyHelper helper = (CopyHelper)copyHelper;
-							Activity oldBaseCopy = (Activity) helper.get(base);
-							// this will redirect any reference to copy of base in diagram to the copy of the activity
-							//
-							helper.putVariabilityElement(base, activity);
-							ArrayList childBases = new ArrayList();
-							for (Iterator iter = activity.getBreakdownElements().iterator(); iter.hasNext();) {
-								Object e = iter.next();
-								if(e instanceof VariabilityElement) {
-									VariabilityElement ve = (VariabilityElement) e;
-									VariabilityElement baseElement = ve.getVariabilityBasedOnElement();
-									if(baseElement != null &&
-											(ve.getVariabilityType() == VariabilityType.LOCAL_CONTRIBUTION_LITERAL || ve.getVariabilityType() == VariabilityType.LOCAL_REPLACEMENT_LITERAL))
-									{
-										helper.putVariabilityElement(baseElement, ve);
-										childBases.add(baseElement);
-									}
-								}
-							}
-
-							ActivityDeepCopyCommand cmd = new ActivityDeepCopyCommand(base, helper, config, targetProcess, monitor, false,activityDeepCopyConfigurator);
-							cmd.guidList = new LinkedList<String>(ActivityDeepCopyCommand.this.guidList);
-							cmd.guidList.addAll(ProcessUtil.getGuidList(ActivityDeepCopyCommand.this.activity, activity));
-							try {
-								cmd.execute();
-
-								baseCopy = (Activity) helper.get(base);
-								if(activity.getVariabilityType() == VariabilityType.EXTENDS_LITERAL) {
-									// keep activity only as backup copy of base
-									//
-									helper.removeVariabilityElement(base);
-									helper.putBackupCopy(base, activity);
-
-									// put back oldBaseCopy
-									if(oldBaseCopy != null) {
-										helper.basicPut(base, oldBaseCopy);
-									}
-								}
-
-								// remove the copies of all base since base copies are not added to the process
-								//
-								helper.remove(base);
-								for (Iterator iter = childBases.iterator(); iter.hasNext();) {
-									EObject childBaseCopy = (EObject) helper.remove(iter.next());
-									if(childBaseCopy != null) {
-										childBaseCopies.add(childBaseCopy);
-										EcoreUtil.remove(childBaseCopy.eContainer());
-									}
-								}
-
-								Activity activityCopy = (Activity) copy;
-
-								// remove the copies of base diagram if the activity already have diagram of the same type
-								//
-								for (int i = 0; i < diagramTypes.length; i++) {
-									int type = diagramTypes[i];
-									if(diagramMgr.getDiagram(activity, type) != null) {
-										Diagram diagram = diagramMgr.getDiagram(activityCopy, type);
-										if(diagram != null) {
-											EcoreUtil.remove(diagram);
-										}
-									}
-								}
-
-								// move content of base package over to the activity's package
-								//
-								moveContent(cmd.pkgCopy, activityCopy);	
-
-								// record the copy of the wrappers
-								//
-								for (Iterator iterator = baseCopy.getBreakdownElements().iterator(); iterator
-								.hasNext();) {
-									BreakdownElement e = (BreakdownElement) iterator.next();
-									if(!childBaseCopies.contains(e)) {
-										BreakdownElement original = (BreakdownElement) helper.getOriginal(e);
-										List<String> list = new ArrayList<String>(cmd.guidList);
-										list.add(original.getGuid());
-										helper.putWrapperCopy(ProcessUtil.toGuidPath(list), e);								
-									}
-								}
-							}
-							finally {
-								cmd.dispose();
-							}
-						}
-					}
-				}
-
-				super.copyReferences();
-
-				if(base != null) {
-					Activity activity = (Activity) owner;
-					Activity activityCopy = ((Activity) copy);					
-					
-					if(baseAccepted) {
-						// copy inherited breakdown elements from the base activity in the right order
-						//
-						MethodConfiguration currentConfig = configSetter.getOldConfiguration();
-
-						// Add breakdown elements from base copy to the activity copy. 
-						// Don't add copy of base element of the existing children
-						//
-						List<BreakdownElement> breakdownElements = new ArrayList<BreakdownElement>();
-						for (Iterator<BreakdownElement> iter = baseCopy.getBreakdownElements().iterator(); iter.hasNext();) {
-							BreakdownElement e = iter.next();
-							if(!childBaseCopies.contains(e) && (configurator == null || configurator.accept(e))) {
-								breakdownElements.add(e);
-							}						
-						}
-						activityCopy.getBreakdownElements().addAll(0, breakdownElements);
-						baseCopy.setSuperActivities(null);
-						EcoreUtil.remove(baseCopy);
-
-
-						// copy other string attributes as well after realize them
-						//
-						MethodConfiguration copyConfig = config == null ? (currentConfig != null ? currentConfig
-								: targetProcess.getDefaultContext())
-								: config;
-						for (EAttribute attribute : getAttributesToCopy()) {
-							if (attribute.isChangeable() && !attribute.isDerived()) {
-								Object value = Providers.getConfigurationApplicator().getAttribute(activity, attribute, copyConfig);
-								activityCopy.eSet(attribute, value);
-							}
-						}
-						ContentDescription content = activity.getPresentation();
-						for (EAttribute attribute : content.eClass().getEAllAttributes()) {
-							if (attribute.isChangeable() && !attribute.isDerived()
-									&& attribute.getEAttributeType().getInstanceClass() == Literals.STRING.getInstanceClass())
-							{
-								Object value = Providers.getConfigurationApplicator().getAttribute(content, activity, attribute, copyConfig);
-								activityCopy.getPresentation().eSet(attribute, value);
-							}
-						}
-					}
-
-					// copy presentation name
-					//
-					activityCopy.setPresentationName(ProcessUtil.getPresentationName(activity));					
-
-					// clear the variability data
-					//
-					activityCopy.setVariabilityBasedOnElement(null);
-					activityCopy.setVariabilityType(null);
-				}
-				
-				//copy contributors				
-				if (owner instanceof Activity && copyContributors ) {
-					Activity activity = (Activity)owner;					
-					List contributors = getContributors(activity);
-					if (!contributors.isEmpty()) {
-						doCopyContributors(contributors,activity);
-					}
-				}
-				
-				// clear the variability data of replacer
-				//
-				if (copy instanceof Activity && TngUtil.isReplacer((VariabilityElement)copy)) {
-					((Activity)copy).setVariabilityBasedOnElement(null);
-					((Activity)copy).setVariabilityType(null);
-				}
-			}
-			finally {
-				if(configSetter != null) {
-					configSetter.restore();
-				}
-			}
-
-			if(copy instanceof Activity) {
-				Activity activityCopy = ((Activity) copy);					
-
-				// clear suppression data
-				//
-				Constraint rule = ConstraintManager.getConstraint(activityCopy, ConstraintManager.PROCESS_SUPPRESSION, false);
-				if(rule != null) {
-					EcoreUtil.remove(rule);
-				}
-			}
-		}
-		
-		
-		/**
-		 * Copy contributors
-		 * @param contributors
-		 */
-		protected void doCopyContributors(List contributors, Activity owner ) {
-			ConfigurationSetter configSetter = new ConfigurationSetter(getAdapterFactory());
-			try {
-				MethodConfiguration currentConfig = configSetter.getOldConfiguration();
-				MethodConfiguration copyConfig = config == null ? (currentConfig != null ? currentConfig
-						: targetProcess.getDefaultContext())
-						: config;
-				configSetter.set(copyConfig);
-				IConfigurator configurator = configSetter.getConfigurator();
-				for (Iterator iterator = contributors.iterator(); iterator.hasNext();) {
-					Activity contributedActivity = (Activity) iterator.next();
-					CopyHelper helper = (CopyHelper)copyHelper;
-					Activity contributorCopy = (Activity) helper.get(contributedActivity);
-					ActivityDeepCopyCommand cmd = new ActivityDeepCopyCommand(contributedActivity, helper, 
-							config, targetProcess, monitor, false,activityDeepCopyConfigurator);
-					cmd.copyContributors = false;
-					cmd.guidList = new LinkedList<String>(ActivityDeepCopyCommand.this.guidList);
-					cmd.guidList.addAll(ProcessUtil.getGuidList(ActivityDeepCopyCommand.this.activity, owner));
-					try {
-						cmd.execute();
-
-						contributorCopy = (Activity) helper.get(contributedActivity);
-
-						Activity activityCopy = (Activity) copy;
-
-						// remove the copies of base diagram if the activity already have diagram of the same type
-						//
-						for (int i = 0; i < diagramTypes.length; i++) {
-							int type = diagramTypes[i];
-							if(diagramMgr.getDiagram(activity, type) != null) {
-								Diagram diagram = diagramMgr.getDiagram(activityCopy, type);
-								if(diagram != null) {
-									EcoreUtil.remove(diagram);
-								}
-							}
-						}
-
-						// move content of base package over to the activity's package
-						//
-						moveContent(cmd.pkgCopy, activityCopy);	
-
-						List<BreakdownElement> breakdownElements = new ArrayList<BreakdownElement>();
-						for (Iterator<BreakdownElement> iter = contributorCopy.getBreakdownElements().iterator(); iter.hasNext();) {
-							BreakdownElement e = iter.next();
-							if(configurator == null || configurator.accept(e)){
-								breakdownElements.add(e);
-							}						
-						}
-						activityCopy.getBreakdownElements().addAll(breakdownElements);
-						contributorCopy.setSuperActivities(null);
-						EcoreUtil.remove(contributorCopy);
-
-					}
-					finally {
-						cmd.dispose();
-					}
-				}
-			}finally{
-				if (configSetter != null ) {
-					configSetter.restore();
-				}
-			}
-		}
-	}
-
-	protected ProcessPackage pkgCopy;
-	protected MethodConfiguration config;
-	protected IDiagramManager diagramMgr;
-
-	protected Process targetProcess;
-
-	protected IProgressMonitor monitor;
-
-	protected Activity activity;
-
-	private LinkedList<String> guidList;
-
-	private BreakdownElementWrapperItemProvider wrapper;
-	
-	//used to retrieve replacers and contributors
-	private IConfigurator activityDeepCopyConfigurator;
-	
-	//
-	private boolean copyContributors = true;
-	
-	private ActivityDeepCopyCommand(Activity activity, CopyHelper copyHelper,
-			MethodConfiguration config, Process targetProcess,
-			IProgressMonitor monitor, boolean initGuidList,IConfigurator activityDeepCopyConfigurator) {
-		super(null, activity.eContainer(), copyHelper);
-		Assert.isTrue(activity.eContainer() instanceof ProcessPackage, "Activity's container must be a ProcessPackage"); //$NON-NLS-1$
-		this.activity = activity;
-		domain = new EditingDomain();
-		this.config = config;
-		this.targetProcess = targetProcess;
-		diagramMgr = ExtensionManager.getDiagramManager();
-		Assert.isNotNull(diagramMgr, "Could not load diagram manager"); //$NON-NLS-1$
-		this.monitor = monitor;
-		if(initGuidList) {
-			guidList = ProcessUtil.getGuidList(null, this.activity);
-		}
-		this.activityDeepCopyConfigurator = activityDeepCopyConfigurator;
-	}
-	
-	public ActivityDeepCopyCommand(Activity activity, CopyHelper copyHelper,
-			MethodConfiguration config, Process targetProcess,
-			IProgressMonitor monitor, IConfigurator activityDeepCopyConfigurator) {
-		this(activity, copyHelper, config, targetProcess, monitor, true,activityDeepCopyConfigurator);		
-	}
-	
-	public ActivityDeepCopyCommand(Object activityOrWrapper, CopyHelper copyHelper, MethodConfiguration config,
-			Process targetProcess, IProgressMonitor monitor, IConfigurator activityDeepCopyConfigurator) {
-		this((Activity)TngUtil.unwrap(activityOrWrapper), copyHelper, config, targetProcess, monitor, 
-				activityOrWrapper instanceof Activity,activityDeepCopyConfigurator);
-		if(activityOrWrapper instanceof BreakdownElementWrapperItemProvider) {
-			wrapper = (BreakdownElementWrapperItemProvider) activityOrWrapper;
-			guidList = ProcessUtil.getGuidList(wrapper);
-		}
-	}	
-	
-	public AdapterFactory getAdapterFactory() {
-		return ((AdapterFactoryEditingDomain)domain).getAdapterFactory();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.command.CopyCommand#execute()
-	 */
-	public void execute() {
-		monitor.subTask(NLS.bind(LibraryEditResources.copyingActivities_msg, ProcessUtil.getPresentationName(activity)));
-		super.execute();
-		Collection<?> result = super.getResult();
-		if(!result.isEmpty()) {
-			pkgCopy = (ProcessPackage) result.iterator().next();
-			fixProcessComponent();
-			replaceTextReferences();
-		}
-	}
-	
-	/**
-	 * fix the process component to make it a process package.
-	 * This method might be overriden by subclass to achive difference result.
-	 * For example, 
-	 */
-	protected void fixProcessComponent() {
-		if(pkgCopy instanceof ProcessComponent) {
-			// replace the ProcessComponent with a equivalent ProcessPackage
-			//
-			ProcessPackage pkg = UmaFactory.eINSTANCE.createProcessPackage();
-			Collection features = new ArrayList(pkgCopy.eClass().getEAllStructuralFeatures());
-			features.retainAll(pkg.eClass().getEAllStructuralFeatures());
-			for (Iterator iter = features.iterator(); iter.hasNext();) {
-				EStructuralFeature feature = (EStructuralFeature) iter.next();
-				Object value = pkgCopy.eGet(feature);
-				pkg.eSet(feature, value);
-			}
-			Process proc = ((ProcessComponent)pkgCopy).getProcess();
-			if(proc != null) {
-				pkg.getProcessElements().add(0, proc);
-			}
-			pkgCopy = pkg;
-		}		
-	}
-	
-	/**
-	 * If textual descriptions in the copied elements contain references (URLs) to other elements 
-	 * within the same copied process then replace these references with references that point to 
-	 * the new elements in the copied structures.
-	 */
-	protected void replaceTextReferences() {
-		ITextReferenceReplacer txtRefReplacer = ExtensionManager.getTextReferenceReplacer();
-		if(txtRefReplacer == null) return;
-
-		Map oldToNewObjectMap = ((CopyHelper) copyHelper).getObjectToCopyMap();
-		for (Iterator iter = pkgCopy.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			for (Iterator attributes = element.eClass().getEAllAttributes().iterator(); attributes.hasNext(); )
-			{
-				EAttribute attribute = (EAttribute) attributes.next();
-				if (attribute.isChangeable() && !attribute.isDerived() && (attribute.isMany() || element.eIsSet(attribute))
-						&& attribute.getEAttributeType().getInstanceClass() == Literals.STRING.getInstanceClass())
-				{
-					String text = (String) element.eGet(attribute);
-					if(text != null) {
-						text = txtRefReplacer.replace(text, targetProcess, oldToNewObjectMap);
-						element.eSet(attribute, text);
-					}
-				}
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.CompoundCommand#getResult()
-	 */
-	public Collection<?> getResult() {
-		if(pkgCopy != null) {
-			Activity act = ProcessUtil.findActivity(pkgCopy);
-			if(act != null) {
-				return Collections.singletonList(act);
-			}
-		}
-		return Collections.EMPTY_LIST;
-	}
-	
-	/**
-	 * Moves content of source object <code>src</code> over to the target objec <code>target</code>
-	 * @param src
-	 * @param target
-	 */
-	private static void moveContent(ProcessPackage src, Activity act) {
-		ProcessPackage target = (ProcessPackage) act.eContainer();
-		// move content of base package over to the activity's package					
-		for (Iterator iter = new ArrayList(src.eContents()).iterator(); iter.hasNext();) {
-			EObject e = (EObject) iter.next();
-			EStructuralFeature f = e.eContainingFeature();						
-			if(f.isMany()) {
-				((List)target.eGet(f)).add(e);
-			}
-		}
-		if(src instanceof ProcessComponent) {
-			Process baseCopy = ((ProcessComponent)src).getProcess();
-			target.getProcessElements().add(baseCopy);
-		}
-
-	}
-	
-	private static BreakdownElement getTopElement(BreakdownElement e) {
-		if(e == null) {
-			return null;
-		}
-		BreakdownElement top = e;
-		for(BreakdownElement o = e.getSuperActivities(); o != null; o = o.getSuperActivities()) {
-			top = o;
-		}
-		return top;
-	}
-	
-	public void copySuppressionStates() {
-		Collection<?> result = getResult();
-		if(result.isEmpty()) {
-			return;
-		}
-		String wrapperPath = wrapper != null ? ProcessUtil.toGuidPath(guidList) : null;
-		for (int i = 0; i < adapterFactories.length; i++) {
-			AdapterFactory adapterFactory = adapterFactories[i];
-			boolean isWBS = adapterFactory == TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-			IFilter filter = ProcessUtil.getFilter(adapterFactory);
-			IConfigurator configurator = null;
-			MethodConfiguration currentConfig = null;
-			if(filter instanceof IConfigurator) {
-				configurator = (IConfigurator) filter;
-				currentConfig = configurator.getMethodConfiguration();
-				configurator.setMethodConfiguration(config);
-			}
-			try {
-				Activity act = ProcessUtil.findActivity((ProcessPackage) owner);
-				ProcessUtil.initializeItemProviderPath(act, adapterFactory);
-				Process proc = TngUtil.getOwningProcess(act);
-				Suppression suppression = Suppression.getSuppression(proc);
-				DepthLevelAdapterFactoryTreeIterator<?> iter = new DepthLevelAdapterFactoryTreeIterator<Object>(adapterFactory, proc);
-				int depthLevel = -1;
-				find_deep_copied_activity:
-					while(iter.hasNext()) {
-						Object child = iter.next();
-
-						// set depth level if the current child is the deep-copied activity
-						//
-						if(wrapper == null) {
-							if(child == activity) {
-								depthLevel = iter.getDepthLevel();
-								break find_deep_copied_activity;
-							}
-						}
-						else {
-							if(child instanceof BreakdownElementWrapperItemProvider) {
-								String path = Suppression.getPathWithoutViewType((BreakdownElementWrapperItemProvider) child).toString();
-								if(wrapperPath.equals(path)) {
-									depthLevel = iter.getDepthLevel();
-									break find_deep_copied_activity;
-								}
-							}
-						}					
-					}
-				
-				// copy suppression state of all suppressed elements under deep-copied activity
-				//
-				CopyHelper helper = (CopyHelper)copyHelper;
-				Map<?, ?> originalToCopyMap = helper.getObjectToCopyMap();
-				Map<Object, Object> elementOrWrapperToCopyMap = null;
-				if(isWBS) {
-					elementOrWrapperToCopyMap = new HashMap<Object, Object>();
-					Activity deepCopy = (Activity) result.iterator().next();
-					elementOrWrapperToCopyMap.put(wrapper != null ? wrapper : activity, deepCopy);
-				}
-				while(iter.hasNext()) {
-					Object child = iter.next();
-					if(iter.getDepthLevel() > depthLevel) {
-						Object e = TngUtil.unwrap(child);
-						if(e instanceof BreakdownElement) {
-							if(!isWBS && e instanceof Activity) {
-								// skip copying suppression state and ordering
-								// breakdown elements for activity in other view
-								// than WBS
-								//
-								continue;
-							}
-//							BreakdownElement original = (BreakdownElement) e;
-//							BreakdownElement copy = (BreakdownElement) originalToCopyMap.get(original);
-//							
-//							if(TngUtil.DEBUG) {
-//								String copyName = (copy != null ? copy.getName() : null);
-//								BreakdownElement top = getTopElement(copy);
-//								if(copy == null || !original.getName().equals(copyName) || top != deepCopy) {
-//									System.err.println("original: '" + original.getName() + "', copy: '" + copyName + "', copy's top activity: " + top);
-//								}
-//							}
-							BreakdownElement copy = null;
-							boolean isSuppressed = suppression.isSuppressed(child);
-							
-							// find copy to suppress or, if element is an activity, to reorder its breakdown elements
-							//
-							if(isSuppressed || isWBS) {
-								if(child == e) {	
-									copy = (BreakdownElement) originalToCopyMap.get(e);
-								}
-								else if(child instanceof BreakdownElementWrapperItemProvider) {
-									BreakdownElementWrapperItemProvider childWrapper = (BreakdownElementWrapperItemProvider) child;
-									if(childWrapper.isInherited()) {
-										String guidPath = Suppression.getPathWithoutViewType(childWrapper).toString();
-										copy = helper.getWrapperCopy(guidPath);
-									}
-								}
-								if(copy != null) {
-									if(isSuppressed) {
-										copy.setSuppressed(Boolean.TRUE);
-									}
-									if(isWBS) {
-										elementOrWrapperToCopyMap.put(child, copy);
-									}
-								}
-							}
-						}
-					}
-					else {
-						break;
-					}
-				}
-				// reorder breakdown elements of activities
-				//
-				if(isWBS) {
-					for (Map.Entry<Object, Object> entry : elementOrWrapperToCopyMap.entrySet()) {
-						Object o = entry.getKey();
-						Object copy = entry.getValue();
-						if(copy instanceof Activity) {
-							ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(o, ITreeItemContentProvider.class);
-							Collection<?> children = ip.getChildren(o);
-							EList<?> list =  (EList<?>) ((Activity) copy).getBreakdownElements();
-							List<?> childrenList = children instanceof List<?> ? (List<?>) children : new ArrayList<Object>(children);
-							int size = childrenList.size();
-							for (int j = 0; j < size; j++) {
-								Object child = childrenList.get(j);
-								Object childCopy = elementOrWrapperToCopyMap.get(child);
-								if(childCopy != null) {
-									if(j < size - 1) {
-										Object nextChild = childrenList.get(j + 1);
-										Object nextChildCopy = elementOrWrapperToCopyMap.get(nextChild);	
-										if(nextChildCopy != null) {
-											int succId = list.indexOf(nextChildCopy);
-											if(succId != -1) {
-												int id = list.indexOf(childCopy);
-												if(id != succId - 1) {
-													if(id < succId) {
-														list.move(succId - 1, id);
-													}
-													else {
-														list.move(id, succId);
-													}
-												}
-											}										
-										}
-										else if(TngUtil.DEBUG) {
-											System.err.println("Element does not have copy: " + nextChild); //$NON-NLS-1$
-										}
-									}
-								}
-								else if(TngUtil.DEBUG) {
-									System.err.println("Element does not have copy: " + child); //$NON-NLS-1$
-								}
-							}
-						}
-					}
-				}
-			}
-			finally {
-				if(configurator != null) {
-					configurator.setMethodConfiguration(currentConfig);
-				}
-			}
-		}
-	}
-	
-	public CopyHelper getCopyHelper() {
-		return (CopyHelper) copyHelper;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDropCommand.java
deleted file mode 100644
index 9abd758..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDropCommand.java
+++ /dev/null
@@ -1,640 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-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.notify.AdapterFactory;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ActivityHandler;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.TeamProfile;
-
-
-/**
- * Drop command for activity that supports extend, copy, and deep copy.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityDropCommand extends BSDropCommand {
-
-	private Object viewer;
-
-	private List<CapabilityPattern> oldPatterns;
-
-	private List<CapabilityPattern> patterns;
-
-	protected Process targetProcess;
-
-	private boolean isDeliveryProcess;
-
-	private int type;
-	
-	private Collection<Activity> appliedActivities;
-
-	protected AdapterFactory adapterFactory;
-
-	protected ActivityHandler activityHandler;
-
-	protected boolean preExecuted;
-
-	protected HashSet<?> addedObjects;
-	
-	protected IConfigurator activityDeepCopyConfigurator;
-
-	public ActivityDropCommand(Activity target, List activities, Object viewer, AdapterFactory adapterFactory) {
-		super(target, activities);
-		setLabel(LibraryEditResources.ActivityDropCommand_label); 
-		this.viewer = viewer;
-		this.adapterFactory = adapterFactory;
-		targetProcess = TngUtil.getOwningProcess(target);
-		
-		isDeliveryProcess = targetProcess instanceof DeliveryProcess;
-		if (isDeliveryProcess) {
-			oldPatterns = new ArrayList(((DeliveryProcess) targetProcess)
-					.getIncludesPatterns());
-		}
-	}
-	
-	public ActivityDropCommand(Activity target, List activities, Object viewer, 
-			AdapterFactory adapterFactory,IConfigurator deepCopyConfigurator){
-		this(target, activities, viewer, adapterFactory);
-		this.activityDeepCopyConfigurator = deepCopyConfigurator;
-	}
-	
-	@Override
-	protected void prepareDropElements() {
-		// remove any drop element that is suppress
-		//
-		for (Iterator<?> iter = dropElements.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			Process proc = TngUtil.getOwningProcess(element);
-			if(proc != null) {
-				Suppression supp = Suppression.getSuppression(proc);
-				if(supp.isSuppressed(element)) {
-					iter.remove();
-				}
-			}
-		}
-
-		super.prepareDropElements();		
-	}
-	
-	public void setType(int type) {
-		this.type = type;
-		if(type == IActionTypeProvider.DEEP_COPY) {
-			runAsJob = true;
-		}
-	}
-	
-	public IStatus checkCopy() {
-		for (Object e : dropElements) {
-			if(e instanceof Activity) {
-				IStatus status = checkCircular((Activity) e);
-				if(!status.isOK()) {
-					return status;
-				}
-			}
-		}
-		return Status.OK_STATUS;
-	}
-	
-	public IStatus checkExtend() {
-		for (Iterator iter = dropElements.iterator(); iter.hasNext();) {
-//			BreakdownElement element = (BreakdownElement) iter.next();
-//			
-//			if ((ProcessUtil.hasContributorOrReplacer((Activity) element))){
-//				canExtend = false;
-//				break;
-//			}
-//			
-//			Process proc = TngUtil.getOwningProcess(element);
-//			if (targetProcess.getVariabilityBasedOnElement() == proc) {
-//				canExtend = false;
-//				break;
-//			}
-//			
-//			if (proc instanceof CapabilityPattern && proc != targetProcess) {
-//				canExtend = true;
-//				break;
-//			}
-			
-			Activity act = (Activity) iter.next();
-			Process srcProc = TngUtil.getOwningProcess(act);
-			if(srcProc instanceof DeliveryProcess && srcProc != targetProcess) {
-				// cannot extend a different delivery process or any of its activities
-				//
-				return new Status(IStatus.ERROR, LibraryEditPlugin.PLUGIN_ID, 0,
-						LibraryEditResources.cannot_copy_or_extend_delivery_process,
-						null);
-			}
-			IStatus status = checkCircular(act);
-			if(!status.isOK()) {
-				return status;
-			}
-		}
-		return Status.OK_STATUS;
-	}
-	
-	private IStatus checkCircular(Activity act) {
-		boolean result;
-		if (DependencyChecker.newCheckAct) {
-			result = DependencyChecker.checkCircularForMovingVariabilityElement
-							(activity, Collections.singletonList(act), true);
-		} else {
-			result = DependencyChecker.checkCircularDependency(act, activity).isOK();
-		}
-		if(!result) {
-			return new Status(IStatus.ERROR, LibraryEditPlugin.PLUGIN_ID, 0,
-					LibraryEditResources.circular_dependency_error_msg,
-					null);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#execute()
-	 */
-	public void execute() {
-		IActionTypeProvider actionTypeProvider = (IActionTypeProvider) viewer;
-		if ( viewer != null) {
-			viewer = null;
-			boolean canCopy = checkCopy().isOK();
-			boolean canExtend = checkExtend().isOK();
-			int[] choices = new int[1 + (canCopy ? 1 : 0) + (canExtend ? 1 : 0)];
-			int i = 0;
-			if(canCopy) {
-				choices[i++] = IActionTypeProvider.COPY;
-			}
-			if(canExtend) {
-				choices[i++] = IActionTypeProvider.EXTEND;
-			}
-			choices[i] = IActionTypeProvider.DEEP_COPY;
-			
-			// delegate the execution of this command
-			//
-			actionTypeProvider.execute(this, choices);
-
-			return;
-		}
-
-		activityHandler = new ActivityHandler();
-		try {
-			if (type == IActionTypeProvider.DEEP_COPY) {
-				doDeepCopy();
-			} else {
-				super.execute();
-			}
-		} finally {
-			activityHandler.dispose();
-		}
-		
-		if(TngUtil.DEBUG) {
-			System.out.println("ActivityDropCommand.execute(): done");
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void doDeepCopy() {
-		if(!UserInteractionHelper.confirmDeepCopy(dropElements)) {
-			return;
-		}
-		MethodConfiguration deepCopyConfig = null;
-		try {
-			deepCopyConfig = UserInteractionHelper.chooseDeepCopyConfiguration(targetProcess, adapterFactory);
-		}
-		catch(OperationCanceledException e) {
-			return;
-		}
-		activityHandler.setDeepCopyConfig(deepCopyConfig);
-		activityHandler.setTargetProcess(targetProcess);
-		
-		// Set a configurator to resovle and deep copy contributors and replacers
-		activityHandler.setActivityDeepCopyConfigurator(activityDeepCopyConfigurator);
-		
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				activityHandler.setMonitor(monitor);
-				preExecuted = preExecute();
-			}
-			
-		};
-		UserInteractionHelper.runWithProgress(runnable, getLabel());			
-		if (preExecuted) {
-			redo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#preExecute()
-	 */
-	protected boolean preExecute() {
-		if (!super.preExecute())
-			return false;
-
-		// process the selected activities and deep-copy the valid ones
-		//
-		if (isDeliveryProcess) {
-			patterns = new ArrayList<CapabilityPattern>();
-		}
-		
-		for (Iterator iter = dropElements.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if ((element instanceof Activity)
-			// && element != target
-			) {
-				Activity act = (Activity) element;
-				
-//				if(type == IActionTypeProvider.DEEP_COPY) {
-//					activityHandler.deepCopy(act);
-//				}
-//				else {
-//					Process proc = TngUtil.getOwningProcess(act);
-//					if (proc instanceof CapabilityPattern && proc != targetProcess) {
-//						if (type == IActionTypeProvider.EXTEND) {
-//							activityHandler.extend(act);
-//							if (patterns != null)
-//								patterns.add(proc);
-//						} else {
-//							activityHandler.copy(act);
-//						}
-//					} else {
-//						activityHandler.copy(act);
-//					}
-//				}
-				
-				switch(type) {
-				case IActionTypeProvider.DEEP_COPY:
-					activityHandler.deepCopy(element);
-					break;
-				case IActionTypeProvider.EXTEND:
-					activityHandler.extend(act);
-					if (patterns != null) {
-						Process proc = TngUtil.getOwningProcess(act);
-						if(proc instanceof CapabilityPattern) {
-							patterns.add((CapabilityPattern) proc);
-						}
-					}
-					break;
-				case IActionTypeProvider.COPY:
-					activityHandler.copy(act);
-					break;
-				}
-			}
-		}
-
-		appliedActivities = new ArrayList<Activity>(activityHandler.getActivities());
-
-		return !appliedActivities.isEmpty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doExecute()
-	 */
-	protected void doExecute() {
-		Iterator<Activity> itor = appliedActivities.iterator();
-
-		ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-		while (itor.hasNext()) {
-			Activity act = (Activity) itor.next();
-
-			if (act.eContainer() != null
-					&& act.eContainer().eContainer() != pkg) {
-				pkg.getChildPackages().add(act.eContainer());
-			}
-
-			if (patterns != null && !patterns.isEmpty()) {
-				DeliveryProcess proc = (DeliveryProcess) targetProcess;
-				for (Iterator iter = patterns.iterator(); iter.hasNext();) {
-					Object pattern = iter.next();
-					if (!proc.getIncludesPatterns().contains(pattern)) {
-						proc.getIncludesPatterns().add(pattern);
-					}
-				}
-			}
-		}
-		long time = 0;
-		if(TngUtil.DEBUG) {
-			time = System.currentTimeMillis();
-		}
-		activity.getBreakdownElements().addAll(appliedActivities);
-		if(TngUtil.DEBUG) {
-			System.out.println("ActivityDropCommand.doExecute(): new activities added. " + (System.currentTimeMillis() - time));
-		}
-		if(!activityHandler.getDeepCopies().isEmpty()) {
-			if(TngUtil.DEBUG) {
-				time = System.currentTimeMillis();
-			}
-			postDeepCopy();
-			if(TngUtil.DEBUG) {
-				System.out.println("ActivityDropCommand.doExecute(): postDeepCopy(). " + (System.currentTimeMillis() - time));
-			}
-		}
-
-		// Hack to refresh providers forcefully before calling fixDuplicateNames
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(activity, ITreeItemContentProvider.class);
-		adapter.getChildren(activity);
-		
-		// fix duplicate names of newly added elements
-		fixDuplicateNames();
-		
-		getModifiedResources().add(activity.eResource());
-	}
-
-	/**
-	 * 
-	 */
-	private void postDeepCopy() {
-		Runnable runnable = new Runnable() {
-
-			public void run() {
-				// add to default configuratation of the target process any missing content
-				//
-				if(addedObjects == null) {
-					addedObjects = new HashSet();
-				}
-				else {
-					addedObjects.clear();
-				}
-				boolean defaultConfigChanged = false;
-//				// disable notification on change to default configuration of target process to avoid excessive UI refreshes
-//				//
-//				boolean oldNotify = targetProcess.getDefaultContext().eDeliver();
-//				targetProcess.getDefaultContext().eSetDeliver(false);
-//				try {
-				for (Iterator iter = activityHandler.getDeepCopies().iterator(); iter.hasNext();) {
-					Iterator iterator = new AbstractTreeIterator(iter.next()) {
-
-						/**
-						 * Comment for <code>serialVersionUID</code>
-						 */
-						private static final long serialVersionUID = 1L;
-
-						protected Iterator getChildren(Object object) {
-							if(object instanceof Activity) {
-								return ((Activity)object).getBreakdownElements().iterator();
-							}
-							return Collections.EMPTY_LIST.iterator();
-						}
-
-					};					
-					while(iterator.hasNext()) {
-						Object e = iterator.next();
-						if(e instanceof Descriptor) {
-							MethodElement me = ProcessUtil.getAssociatedElement((Descriptor) e);
-							int size = addedObjects.size();
-							ProcessUtil.addToDefaultConfiguration(targetProcess, me, addedObjects);
-							if(!defaultConfigChanged && (size != addedObjects.size())) {
-								getModifiedResources().add(targetProcess.getDefaultContext().eResource());
-								defaultConfigChanged = true;
-							}
-						}
-					}
-				}
-//				}
-//				finally {
-//					targetProcess.getDefaultContext().eSetDeliver(oldNotify);
-//				}
-			}
-			
-		};
-		
-		UserInteractionHelper.runWithProgress(runnable, getLabel());
-		
-		MethodConfiguration deepCopyConfig = activityHandler.getDeepCopyConfig();			
-
-		if(deepCopyConfig != null) {
-			// synchronize the deep copies with deep copy configuration				
-			//
-			final SynchronizeCommand synchCmd = new SynchronizeCommand(activityHandler.getDeepCopies(), deepCopyConfig, null, false);
-			try {
-				runnable = new Runnable() {
-
-					public void run() {
-						synchCmd.initilize();
-					}
-					
-				};
-				UserInteractionHelper.runWithProgress(runnable, LibraryEditResources.ProcessAutoSynchronizeAction_prepare);
-				if(synchCmd.isIntialized()) {
-					synchCmd.execute();
-				}
-			}
-			finally {
-				synchCmd.dispose();
-			}
-		}
-	}
-	
-	protected Suppression getSuppression() {
-		return Suppression.getSuppression(targetProcess);
-	}
-
-	/**
-	 * Fixes duplicate names of newly added elements
-	 */
-	private void fixDuplicateNames() {
-		Suppression suppression = getSuppression();
-		for (Iterator iter = appliedActivities.iterator(); iter.hasNext();) {
-			Activity act = (Activity) iter.next();
-			fixDuplicateNames(act, suppression);
-			fixTeamProfileDuplicateNames(act, suppression);
-		}			
-	}
-	
-	private void fixDuplicateNames(BreakdownElement e, Suppression suppression) {
-		fixDuplicateNames(e, suppression, adapterFactory);
-	}
-	
-	private static void fixDuplicateNames(BreakdownElement e, Suppression suppression, AdapterFactory adapterFactory) {
-		String baseName = e.getName();
-		if (ProcessUtil.checkBreakdownElementName(adapterFactory, e, baseName, suppression) != null) {
-			for (int i = 1; true; i++) {
-				String name = baseName + '_' + i;
-				if (ProcessUtil.checkBreakdownElementName(adapterFactory, e, name, suppression) == null) {
-					e.setName(name);
-					break;
-				}
-			}
-		}
-		baseName = ProcessUtil.getPresentationName(e);
-		if (ProcessUtil.checkBreakdownElementPresentationName(adapterFactory, e, baseName, suppression) != null) {
-			for (int i = 1; true; i++) {
-				String name = baseName + '_' + i;
-				if (ProcessUtil.checkBreakdownElementPresentationName(adapterFactory, e, name, suppression) == null) {
-					e.setPresentationName(name);
-					break;
-				}
-			}
-		}
-	}		
-	
-	private void fixTeamProfileDuplicateNames(Activity act, Suppression suppression) {
-		for (int i = act.getBreakdownElements().size() - 1; i > -1; i--) {
-			Object element = act.getBreakdownElements().get(i);
-			if(element instanceof TeamProfile) {
-				fixDuplicateNames((BreakdownElement) element, suppression, TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory());
-			}
-			else if(element instanceof Activity) {
-				fixTeamProfileDuplicateNames((Activity) element, suppression);
-			}
-		}
-	}
-		
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doUndo()
-	 */
-	protected void doUndo() {
-		activity.getBreakdownElements().removeAll(appliedActivities);
-		if (isDeliveryProcess) {
-			DeliveryProcess proc = (DeliveryProcess) targetProcess;
-			proc.getIncludesPatterns().clear();
-			proc.getIncludesPatterns().addAll(oldPatterns);
-		}
-	}
-
-	public static void setName(List siblings, Activity e) {
-		String baseName = e.getName();
-		if (!isNameTaken(siblings, e, baseName)) {
-			return;
-		}
-		for (int i = 1; true; i++) {
-			String name = baseName + '_' + i;
-			if (!isNameTaken(siblings, e, name)) {
-				e.setName(name);
-				return;
-			}
-		}
-	}
-
-	public static void setDefaultPresentationName(List siblings, Activity e) {
-		// if(e.getPresentationName() != null &&
-		// e.getPresentationName().trim().length() > 0) return;
-
-		String basePresentationName = ProcessUtil.getPresentationName(e);
-		if (!isPresentationNameTaken(siblings, e, basePresentationName)) {
-			// e.setPresentationName(basePresentationName);
-			return;
-		}
-		for (int i = 1; true; i++) {
-			String name = basePresentationName + '_' + i;
-			if (!isPresentationNameTaken(siblings, e, name)) {
-				e.setPresentationName(name);
-				return;
-			}
-		}
-	}
-
-	private static boolean isNameTaken(List siblings, DescribableElement e,
-			String name) {
-		for (int i = siblings.size() - 1; i > -1; i--) {
-			BreakdownElement sibling = (BreakdownElement) siblings.get(i);
-			// if(sibling != e && name.equals(sibling.getPresentationName())) {
-			if (sibling != e && name.equals(sibling.getName())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private static boolean isPresentationNameTaken(List siblings,
-			DescribableElement e, String name) {
-		for (int i = siblings.size() - 1; i > -1; i--) {
-			BreakdownElement sibling = (BreakdownElement) siblings.get(i);
-			// if(sibling != e && name.equals(sibling.getPresentationName())) {
-			if (sibling != e
-					&& name.equals(ProcessUtil.getPresentationName(sibling))) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
-	 */
-	public Collection<?> getAffectedObjects() {
-		if(executed) {
-			return appliedActivities;
-		}
-		else {
-			return Collections.EMPTY_LIST;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getResult()
-	 */
-	public Collection<?> getResult() {
-		return getAffectedObjects();
-	}
-
-	public ActivityHandler getActivityHandler() {
-		return activityHandler;
-	}
-	public Activity getActivity(){
-		return activity;
-	}
-	public int getType(){
-		return type;
-	}
-
-	public void setActivityDeepCopyConfigurator(
-			IConfigurator activityDeepCopyConfigurator) {
-		this.activityDeepCopyConfigurator = activityDeepCopyConfigurator;
-	}
-	
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityVariabilityCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityVariabilityCommand.java
deleted file mode 100644
index 2448610..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityVariabilityCommand.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-
-/**
- * Command to set variability on the activity
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ActivityVariabilityCommand extends AddMethodElementCommand {
-
-	private Activity activity;
-
-	private VariabilityElement ve;
-
-	private VariabilityType type;
-
-	private List elements;
-
-	private IConfigurator configurator;
-
-	private Collection modifiedResources;
-
-	public ActivityVariabilityCommand(Activity activity, VariabilityElement ve,
-			VariabilityType type, IConfigurator configurator) {
-
-		super(TngUtil.getOwningProcess(activity));
-
-		this.activity = activity;
-		this.ve = ve;
-		this.type = type;
-		this.configurator = configurator;
-
-		elements = Arrays.asList(new Object[] { ve });
-
-		this.modifiedResources = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(elements, configurator))
-			return;
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		activity.setVariabilityType(type);
-		activity.setVariabilityBasedOnElement(ve);
-
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#undo()
-	 */
-	public void undo() {
-		if (!elements.isEmpty()) {
-			// basically remove from configuration if anything was added
-			super.undo();
-			activity.setVariabilityType(VariabilityType.NA_LITERAL);
-			activity.setVariabilityBasedOnElement(null);
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		if (activity.eResource() != null) {
-			modifiedResources.add(activity.eResource());
-		}
-		return modifiedResources;
-	}
-
-	public Collection getAffectedObjects() {
-		return super.getAffectedObjects();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddGuidanceToActivityCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddGuidanceToActivityCommand.java
deleted file mode 100644
index f20059a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddGuidanceToActivityCommand.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.SupportingMaterial;
-
-
-/**
- * Command to add guidance to activity
- *  
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AddGuidanceToActivityCommand extends AddMethodElementCommand {
-
-	private List guidances;
-
-	private Activity activity;
-
-	private Collection modifiedResources;
-
-	public AddGuidanceToActivityCommand(Activity activity, List guidances) {
-
-		super(TngUtil.getOwningProcess(activity));
-
-		this.guidances = guidances;
-		this.activity = activity;
-
-		this.modifiedResources = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(guidances))
-			return;
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		if (!guidances.isEmpty()) {
-			for (Iterator it = guidances.iterator(); it.hasNext();) {
-				Object obj = it.next();
-				if (obj instanceof Guidance) {
-					Guidance item = (Guidance) obj;
-
-					// guidances for content element
-					if (item instanceof Checklist) {
-						activity.getChecklists().add(item);
-					} else if (item instanceof Concept) {
-						activity.getConcepts().add(item);
-					} else if (item instanceof Example) {
-						activity.getExamples().add(item);
-					} else if (item instanceof SupportingMaterial) {
-						activity.getSupportingMaterials().add(item);
-					} else if (item instanceof Guideline) {
-						activity.getGuidelines().add(item);
-					} else if (item instanceof ReusableAsset) {
-						activity.getReusableAssets().add(item);
-					} else if (item instanceof Roadmap) {
-						activity.getRoadmaps().add(item);
-					} else {
-						LibraryEditPlugin.getDefault().getLogger()
-								.logError("Cant set guidance " + item.getType().getName() + ":" + item.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#undo()
-	 */
-	public void undo() {
-		if (!guidances.isEmpty()) {
-			// basically remove from configuration if anything was added
-			super.undo();
-
-			for (Iterator it = guidances.iterator(); it.hasNext();) {
-				Object obj = it.next();
-				if (obj instanceof Guidance) {
-					Guidance item = (Guidance) obj;
-
-					// guidances for content element
-					if (item instanceof Checklist) {
-						activity.getChecklists().remove(item);
-					} else if (item instanceof Concept) {
-						activity.getConcepts().remove(item);
-					} else if (item instanceof Example) {
-						activity.getExamples().remove(item);
-					} else if (item instanceof SupportingMaterial) {
-						activity.getSupportingMaterials().remove(item);
-					} else if (item instanceof Guideline) {
-						activity.getGuidelines().remove(item);
-					} else if (item instanceof ReusableAsset) {
-						activity.getReusableAssets().remove(item);
-					} else if (item instanceof Roadmap) {
-						activity.getRoadmaps().remove(item);
-					} else {
-						LibraryEditPlugin.getDefault().getLogger()
-								.logError("Cant set guidance " + item.getType().getName() + ":" + item.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				}
-			}
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		if (!guidances.isEmpty() ) {
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-
-	public Collection getAffectedObjects() {
-		if (activity != null) {
-			return Arrays.asList(new Object[] { activity });
-		}
-		return super.getAffectedObjects();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddMethodElementCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddMethodElementCommand.java
deleted file mode 100644
index abc6ace..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddMethodElementCommand.java
+++ /dev/null
@@ -1,130 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-
-
-/**
- * Base Command for add method elements to descriptor. 
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AddMethodElementCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	protected List elementsToAddToDefaultConfig;
-
-	private HashSet addedObjects;
-
-	private Process process;
-
-	public AddMethodElementCommand(Process process) {
-		super();
-
-		this.process = process;
-	}
-
-	/**
-	 * Checks and adds elements to the default configuration
-	 * 
-	 * @return false if user canceled the operation
-	 */
-	protected boolean addToDefaultConfiguration(List elements)
-	{
-		return addToDefaultConfiguration(elements, null);
-	}
-	
-	
-	/**
-	 * Checks and adds elements to the default configuration
-	 * 
-	 * @return false if user canceled the operation
-	 */
-	protected boolean addToDefaultConfiguration(List elements, IConfigurator configurator) {
-		if (elementsToAddToDefaultConfig == null) {
-			elementsToAddToDefaultConfig = new ArrayList();
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				
-				switch (UserInteractionHelper.checkAgainstDefaultConfiguration(
-						process, element, configurator)) {
-				case 0:
-					iter.remove();
-					break;
-				case 2:
-					elementsToAddToDefaultConfig.add(element);
-					break;
-				case -1:
-					return false;
-				}
-			}
-			if (!elementsToAddToDefaultConfig.isEmpty()) {
-				addedObjects = new HashSet();
-				for (Iterator iter = elementsToAddToDefaultConfig.iterator(); iter
-						.hasNext();) {
-					EObject element = (EObject) iter.next();
-					ProcessUtil.addToDefaultConfiguration(process, element,
-							addedObjects);
-				}
-				if (!addedObjects.isEmpty()) {
-					getModifiedResources().add(
-							process.getDefaultContext().eResource());
-				}
-
-			}
-		}
-		return true;
-	}
-
-	public void execute() {
-
-	}
-
-	public void redo() {
-
-	}
-
-	public void undo() {
-		if (addedObjects != null && !addedObjects.isEmpty()) {
-			MethodConfiguration defaultConfig = process.getDefaultContext();
-			for (Iterator iter = addedObjects.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof MethodPlugin) {
-					defaultConfig.getMethodPluginSelection().remove(element);
-				} else if (element instanceof MethodPackage) {
-					defaultConfig.getMethodPackageSelection().remove(element);
-				}
-			}
-		}
-	}
-
-	public Collection getModifiedResources() {
-		return Collections.EMPTY_LIST;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddRoleToTeamCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddRoleToTeamCommand.java
deleted file mode 100644
index be4d6b5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AddRoleToTeamCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-
-
-/**
- * Command to add role to team profile
- *  
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AddRoleToTeamCommand extends AddMethodElementCommand {
-
-	private List roles;
-
-	private List roleDescList;
-
-	private Activity activity;
-
-	private TeamProfile team;
-
-	private Collection modifiedResources;
-
-	private List existingRoleDescList;
-
-	public AddRoleToTeamCommand(TeamProfile team, List roles) {
-
-		super(TngUtil.getOwningProcess(team));
-
-		this.roles = roles;
-		this.team = team;
-
-		this.activity = (Activity) ProcessUtil.getParentActivityOfTeam(team);
-
-		this.modifiedResources = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(roles))
-			return;
-
-		roleDescList = new ArrayList();
-		for (Iterator itor = roles.iterator(); itor.hasNext();) {
-			RoleDescriptor roleDesc = ProcessUtil
-					.createRoleDescriptor((Role) itor.next());
-			roleDescList.add(roleDesc);
-		}
-
-		// automatic assignment
-		existingRoleDescList = new ArrayList();
-		ProcessUtil.getRoleDescriptor(TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory(), activity,
-				existingRoleDescList, roles);
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		if (!roleDescList.isEmpty()) {
-			for (Iterator itor = roleDescList.iterator(); itor.hasNext();) {
-				team.getTeamRoles().add((RoleDescriptor) itor.next());
-			}
-		}
-
-		if (!existingRoleDescList.isEmpty()) {
-			for (Iterator itor = existingRoleDescList.iterator(); itor
-					.hasNext();) {
-				team.getTeamRoles().add((RoleDescriptor) itor.next());
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#undo()
-	 */
-	public void undo() {
-		if (!roleDescList.isEmpty()) {
-			// basically remove from configuration if anything was added
-			super.undo();
-			for (Iterator itor = roleDescList.iterator(); itor.hasNext();) {
-				team.getTeamRoles().remove((RoleDescriptor) itor.next());
-			}
-		}
-		if (!existingRoleDescList.isEmpty()) {
-			for (Iterator itor = existingRoleDescList.iterator(); itor
-					.hasNext();) {
-				team.getTeamRoles().remove((RoleDescriptor) itor.next());
-			}
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-
-		if (roles != null && !roles.isEmpty()) {
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-			if (team.eResource() != null) {
-				modifiedResources.add(team.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-
-	public Collection getAffectedObjects() {
-		if (roleDescList != null) {
-			return roleDescList;
-		}
-		return super.getAffectedObjects();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignPrimaryPerformerToTaskDescriptor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignPrimaryPerformerToTaskDescriptor.java
deleted file mode 100644
index 9d7f489..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignPrimaryPerformerToTaskDescriptor.java
+++ /dev/null
@@ -1,175 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-
-
-/**
- * 
- * Command to assign primary performer to task descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AssignPrimaryPerformerToTaskDescriptor extends
-		AddMethodElementCommand {
-	private RoleDescriptor newRoleDesc = null;
-
-	private RoleDescriptor oldRoleDesc = null;
-
-	private Role role;
-
-	private List roles;
-
-	private Activity activity;
-
-	private TaskDescriptor taskDesc;
-
-	private Collection modifiedResources;
-
-	// private boolean descExists = false;
-
-	private TeamProfile team;
-
-	private MethodConfiguration config;
-
-	private boolean isNewRoleDescriptor = false;
-
-	/**
-	 * 
-	 */
-	public AssignPrimaryPerformerToTaskDescriptor(TaskDescriptor taskDesc,
-			Role role, MethodConfiguration config) {
-		super(TngUtil.getOwningProcess(taskDesc));
-
-		this.role = role;
-		this.taskDesc = taskDesc;
-		this.oldRoleDesc = taskDesc.getPerformedPrimarilyBy();
-		this.config = config;
-
-		roles = new ArrayList();
-		roles.add(role);
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				taskDesc, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(taskDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-
-		this.modifiedResources = new HashSet(); 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(roles))
-			return;
-
-		if (!roles.isEmpty()) {
-			isNewRoleDescriptor = false;
-			// check for local descriptor
-			newRoleDesc = (RoleDescriptor) ProcessCommandUtil.getDescriptor(
-					role, activity, config);
-			if (newRoleDesc == null) {
-				// check for inherited descriptor
-				newRoleDesc = (RoleDescriptor) ProcessCommandUtil
-						.getInheritedDescriptor(role, activity, config);
-				if (newRoleDesc == null) {
-
-					newRoleDesc = ProcessUtil.createRoleDescriptor(role);
-					isNewRoleDescriptor = true;
-				}
-			}
-
-			// get team
-			team = UserInteractionHelper.getTeam(activity, role);
-
-			redo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		taskDesc.setPerformedPrimarilyBy(newRoleDesc);
-
-		if (isNewRoleDescriptor) {
-			activity.getBreakdownElements().add(newRoleDesc);
-		}
-
-		if (team != null) {
-			team.getTeamRoles().add(newRoleDesc);
-		}
-	}
-
-	public void undo() {
-
-		if (!roles.isEmpty()) {
-			// remove from configuration if added
-			super.undo();
-
-			taskDesc.setPerformedPrimarilyBy(oldRoleDesc);
-
-			if (isNewRoleDescriptor) {
-				activity.getBreakdownElements().remove(newRoleDesc);
-			}
-			if (team != null) {
-				team.getTeamRoles().remove(newRoleDesc);
-			}
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-
-		if (role != null) {
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-			if (taskDesc.eResource() != null) {
-				modifiedResources.add(taskDesc.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignRoleToTaskDescriptor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignRoleToTaskDescriptor.java
deleted file mode 100644
index b4d6b5f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignRoleToTaskDescriptor.java
+++ /dev/null
@@ -1,211 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-
-
-/**
- * Command for assign roles to task descriptor. It will assign additional
- * performers and assisted by to a task descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AssignRoleToTaskDescriptor extends AddMethodElementCommand {
-
-	private List roles;
-
-	private Activity activity;
-
-	private TaskDescriptor taskDesc;
-
-	private Collection modifiedResources;
-
-	private int action;
-
-	List existingRoleDescList = new ArrayList();
-
-	List newRoleDescList = new ArrayList();
-
-	private HashMap map = new HashMap();
-
-	private MethodConfiguration config;
-
-	private boolean isNewRoleDescriptor = false;
-
-	/**
-	 * Assign role to task descriptor Used for both additionally performed by
-	 * and assisted by
-	 */
-	public AssignRoleToTaskDescriptor(TaskDescriptor taskDesc, List roles,
-			int action, MethodConfiguration config) {
-
-		super(TngUtil.getOwningProcess(taskDesc));
-
-		this.roles = roles;
-		this.taskDesc = taskDesc;
-		this.action = action;
-		this.config = config;
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				taskDesc, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(taskDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-
-		this.modifiedResources = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(roles))
-			return;
-
-		for (Iterator it = roles.iterator(); it.hasNext();) {
-			// boolean descExists = false;
-			Role role = (Role) it.next();
-
-			RoleDescriptor roleDesc = null;
-			isNewRoleDescriptor = false;
-			// check for local descriptor
-			roleDesc = (RoleDescriptor) ProcessCommandUtil.getDescriptor(role,
-					activity, config);
-			if (roleDesc == null) {
-				// check for inherited descriptor
-				roleDesc = (RoleDescriptor) ProcessCommandUtil
-						.getInheritedDescriptor(role, activity, config);
-				if (roleDesc == null) {
-					roleDesc = ProcessUtil.createRoleDescriptor(role);
-					isNewRoleDescriptor = true;
-
-				}
-			}
-			if (isNewRoleDescriptor)
-				newRoleDescList.add(roleDesc);
-			else
-				existingRoleDescList.add(roleDesc);
-
-			// get team
-			TeamProfile team = UserInteractionHelper.getTeam(activity, role);
-			if (team != null) {
-				map.put(roleDesc, team);
-			}
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		if (action == IActionTypeConstants.ADD_ADDITIONAL_PERFORMER) {
-			taskDesc.getAdditionallyPerformedBy().addAll(existingRoleDescList);
-			taskDesc.getAdditionallyPerformedBy().addAll(newRoleDescList);
-		} else if (action == IActionTypeConstants.ADD_ASSISTED_BY) {
-			taskDesc.getAssistedBy().addAll(existingRoleDescList);
-			taskDesc.getAssistedBy().addAll(newRoleDescList);
-		}
-
-		activity.getBreakdownElements().addAll(newRoleDescList);
-
-		if (map != null) {
-			Set keyset = map.keySet();
-			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
-				Object key = itor.next();
-				TeamProfile team = (TeamProfile) map.get(key);
-
-				// add to team
-				team.getTeamRoles().add((RoleDescriptor) key);
-			}
-		}
-
-		
-	}
-
-	public void undo() {
-
-		// basically remove from configuration if anything was added
-		super.undo();
-
-		if (action == IActionTypeConstants.ADD_ADDITIONAL_PERFORMER) {
-			taskDesc.getAdditionallyPerformedBy().removeAll(
-					existingRoleDescList);
-			taskDesc.getAdditionallyPerformedBy().removeAll(newRoleDescList);
-		} else if (action == IActionTypeConstants.ADD_ASSISTED_BY) {
-			taskDesc.getAssistedBy().removeAll(existingRoleDescList);
-			taskDesc.getAssistedBy().removeAll(newRoleDescList);
-		}
-		activity.getBreakdownElements().removeAll(newRoleDescList);
-
-		if (map != null) {
-			Set keyset = map.keySet();
-			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
-				Object key = itor.next();
-				TeamProfile team = (TeamProfile) map.get(key);
-
-				// remove it from team
-				team.getTeamRoles().remove((RoleDescriptor) key);
-			}
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-
-		if (roles != null && !roles.isEmpty()) {
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-			if (taskDesc.eResource() != null) {
-				modifiedResources.add(taskDesc.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToDeliverable.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToDeliverable.java
deleted file mode 100644
index 66e6451..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToDeliverable.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * 
- * Command to assign deliverable parts to work product descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AssignWPToDeliverable extends AddMethodElementCommand {
-
-	private List workProducts;
-
-	private Activity activity;
-
-	private WorkProductDescriptor wpDesc;
-
-	private Collection modifiedResources;
-
-	private HashMap map = new HashMap();
-
-	List existingWPDescList = new ArrayList();
-
-	List newWPDescList = new ArrayList();
-
-	/**
-	 * 
-	 */
-	public AssignWPToDeliverable(WorkProductDescriptor wpDesc, List workProducts) {
-		super(TngUtil.getOwningProcess(wpDesc));
-
-		this.workProducts = workProducts;
-		this.wpDesc = wpDesc;
-
-		Object parent = getParentActivity(wpDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-
-		this.modifiedResources = new HashSet();
-
-	}
-
-	/**
-	 * Get parent activity for breakdownelement
-	 * 
-	 * @param brElement
-	 * @return
-	 */
-	private Object getParentActivity(BreakdownElement brElement) {
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(brElement, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(brElement);
-		while (!(parent instanceof Activity)) {
-			brElement = (BreakdownElement) parent;
-			adapter = (ItemProviderAdapter) adapterFactory.adapt(brElement,
-					ITreeItemContentProvider.class);
-			parent = adapter.getParent(brElement);
-		}
-
-		return parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-
-		List breakdownElements = activity.getBreakdownElements();
-
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(workProducts))
-			return;
-
-		for (Iterator it = workProducts.iterator(); it.hasNext();) {
-			boolean descExists = false;
-			WorkProduct wp = (WorkProduct) it.next();
-			WorkProductDescriptor newWpDesc = null;
-			for (int i = 0; i < breakdownElements.size(); i++) {
-				BreakdownElement element = (BreakdownElement) breakdownElements
-						.get(i);
-				if (element instanceof WorkProductDescriptor) {
-					newWpDesc = (WorkProductDescriptor) element;
-					WorkProduct elementWP = newWpDesc.getWorkProduct();
-					if (wp.equals(elementWP)) {
-						// if found under the parent activity, return that
-						// wpdescriptor
-						descExists = true;
-
-						existingWPDescList.add(element);
-						break;
-					}
-				}
-
-			}
-
-			if (!descExists) {
-				newWPDescList.add(ProcessUtil.createWorkProductDescriptor(wp));
-			}
-
-			// get deliverable
-			WorkProductDescriptor deliverable = UserInteractionHelper
-					.getDeliverable(activity, wp);
-			if (deliverable != null) {
-				map.put(newWpDesc, deliverable);
-			}
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		wpDesc.getDeliverableParts().addAll(existingWPDescList);
-		wpDesc.getDeliverableParts().addAll(newWPDescList);
-
-		// activity.getBreakdownElements().addAll(newWPDescList);
-
-		
-	}
-
-	public void undo() {
-
-		// basically remove from configuration if anything was added
-		super.undo();
-
-		wpDesc.getDeliverableParts().removeAll(existingWPDescList);
-		wpDesc.getDeliverableParts().removeAll(newWPDescList);
-
-		// activity.getBreakdownElements().removeAll(newWPDescList);
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		if (workProducts != null &&  !workProducts.isEmpty()) {
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-			if (wpDesc.eResource() != null) {
-				modifiedResources.add(wpDesc.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToRoleDescriptor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToRoleDescriptor.java
deleted file mode 100644
index 54d5648..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToRoleDescriptor.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command to assign work products to role descriptors. It will set reponsible
- * role feature.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AssignWPToRoleDescriptor extends AddMethodElementCommand {
-
-	private List workProducts;
-
-	private Activity activity;
-
-	private RoleDescriptor roleDesc;
-
-	private Collection modifiedResources;
-
-	private HashMap map = new HashMap();
-
-	private int action;
-
-	List existingWPDescList = new ArrayList();
-
-	List newWPDescList = new ArrayList();
-
-	private MethodConfiguration config;
-
-	/**
-	 * 
-	 */
-	public AssignWPToRoleDescriptor(RoleDescriptor roleDesc, List workProducts,
-			int action, MethodConfiguration config) {
-
-		super(TngUtil.getOwningProcess(roleDesc));
-
-		this.workProducts = workProducts;
-		this.roleDesc = roleDesc;
-		this.action = action;
-		this.config = config;
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				roleDesc, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(roleDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-		this.modifiedResources = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(workProducts))
-			return;
-
-		for (Iterator it = workProducts.iterator(); it.hasNext();) {
-			WorkProduct wp = (WorkProduct) it.next();
-			WorkProductDescriptor newWpDesc = null;
-
-			boolean isNewDescriptor = false;
-			// check for local descriptor
-			newWpDesc = (WorkProductDescriptor) ProcessCommandUtil
-					.getDescriptor(wp, activity, config);
-			if (newWpDesc == null) {
-				// check for inherited descriptor
-				newWpDesc = (WorkProductDescriptor) ProcessCommandUtil
-						.getInheritedDescriptor(wp, activity, config);
-				if (newWpDesc == null) {
-					newWpDesc = ProcessUtil.createWorkProductDescriptor(wp);
-					isNewDescriptor = true;
-
-				}
-			}
-			if (isNewDescriptor)
-				newWPDescList.add(newWpDesc);
-			else
-				existingWPDescList.add(newWpDesc);
-
-			// get deliverable
-			WorkProductDescriptor deliverable = UserInteractionHelper
-					.getDeliverable(activity, wp);
-			if (deliverable != null) {
-				map.put(newWpDesc, deliverable);
-			}
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		if (action == IActionTypeConstants.ADD_RESPONSIBLE_FOR) {
-			roleDesc.getResponsibleFor().addAll(existingWPDescList);
-			roleDesc.getResponsibleFor().addAll(newWPDescList);
-		}
-
-		activity.getBreakdownElements().addAll(newWPDescList);
-
-		if (map != null) {
-			Set keyset = map.keySet();
-			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
-				Object key = itor.next();
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) map
-						.get(key);
-
-				// add to deliverable
-				wpDesc.getDeliverableParts().add((WorkProductDescriptor) key);
-			}
-		}
-
-		
-	}
-
-	public void undo() {
-
-		// remove from configuration if anything was added
-		super.undo();
-
-		if (action == IActionTypeConstants.ADD_RESPONSIBLE_FOR) {
-			roleDesc.getResponsibleFor().removeAll(existingWPDescList);
-			roleDesc.getResponsibleFor().removeAll(newWPDescList);
-		}
-
-		activity.getBreakdownElements().removeAll(newWPDescList);
-
-		if (map != null) {
-			Set keyset = map.keySet();
-			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
-				Object key = itor.next();
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) map
-						.get(key);
-
-				// remove it from deliverable
-				wpDesc.getDeliverableParts()
-						.remove((WorkProductDescriptor) key);
-			}
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		if (workProducts != null &&  !workProducts.isEmpty()) {
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-			if (roleDesc.eResource() != null) {
-				modifiedResources.add(roleDesc.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToTaskDescriptor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToTaskDescriptor.java
deleted file mode 100644
index 5f389df..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToTaskDescriptor.java
+++ /dev/null
@@ -1,214 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command to assign work products to task descriptor. It will set external
- * inputs, mandatory inputs, optional inputs and outputs.
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class AssignWPToTaskDescriptor extends AddMethodElementCommand {
-
-	private List workProducts;
-
-	private Activity activity;
-
-	private TaskDescriptor taskDesc;
-
-	private Collection modifiedResources;
-
-	private int action;
-
-	private HashMap map = new HashMap();
-
-	List existingWPDescList = new ArrayList();
-
-	List newWPDescList = new ArrayList();
-
-	private MethodConfiguration config;
-
-	/**
-	 * 
-	 */
-	public AssignWPToTaskDescriptor(TaskDescriptor taskDesc, List workProducts,
-			int action, MethodConfiguration config) {
-		super(TngUtil.getOwningProcess(taskDesc));
-
-		this.workProducts = workProducts;
-		this.taskDesc = taskDesc;
-		this.action = action;
-		this.config = config;
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				taskDesc, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(taskDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-		this.modifiedResources = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(workProducts))
-			return;
-
-		for (Iterator it = workProducts.iterator(); it.hasNext();) {
-			WorkProduct wp = (WorkProduct) it.next();
-			WorkProductDescriptor newWpDesc = null;
-
-			boolean isNewDescriptor = false;
-			// check for local descriptor
-			newWpDesc = (WorkProductDescriptor) ProcessCommandUtil
-					.getDescriptor(wp, activity, config);
-			if (newWpDesc == null) {
-				// check for inherited descriptor
-				newWpDesc = (WorkProductDescriptor) ProcessCommandUtil
-						.getInheritedDescriptor(wp, activity, config);
-				if (newWpDesc == null) {
-					newWpDesc = ProcessUtil.createWorkProductDescriptor(wp);
-					isNewDescriptor = true;
-
-				}
-			}
-			if (isNewDescriptor)
-				newWPDescList.add(newWpDesc);
-			else
-				existingWPDescList.add(newWpDesc);
-
-			// get deliverable
-			WorkProductDescriptor deliverable = UserInteractionHelper
-					.getDeliverable(activity, wp);
-			if (deliverable != null) {
-				map.put(newWpDesc, deliverable);
-			}
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-		if (action == IActionTypeConstants.ADD_EXTERNAL_INPUT) {
-			taskDesc.getExternalInput().addAll(existingWPDescList);
-			taskDesc.getExternalInput().addAll(newWPDescList);
-		} else if (action == IActionTypeConstants.ADD_MANDATORY_INPUT) {
-			taskDesc.getMandatoryInput().addAll(existingWPDescList);
-			taskDesc.getMandatoryInput().addAll(newWPDescList);
-		} else if (action == IActionTypeConstants.ADD_OPTIONAL_INPUT) {
-			taskDesc.getOptionalInput().addAll(existingWPDescList);
-			taskDesc.getOptionalInput().addAll(newWPDescList);
-		} else if (action == IActionTypeConstants.ADD_OUTPUT) {
-			taskDesc.getOutput().addAll(existingWPDescList);
-			taskDesc.getOutput().addAll(newWPDescList);
-		}
-
-		activity.getBreakdownElements().addAll(newWPDescList);
-
-		if (map != null) {
-			Set keyset = map.keySet();
-			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
-				Object key = itor.next();
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) map
-						.get(key);
-
-				// add to deliverable
-				wpDesc.getDeliverableParts().add((WorkProductDescriptor) key);
-			}
-		}
-	}
-
-	public void undo() {
-
-		// remove from configuration if anything was added
-		super.undo();
-
-		if (action == IActionTypeConstants.ADD_EXTERNAL_INPUT) {
-			taskDesc.getExternalInput().removeAll(existingWPDescList);
-			taskDesc.getExternalInput().removeAll(newWPDescList);
-		} else if (action == IActionTypeConstants.ADD_MANDATORY_INPUT) {
-			taskDesc.getMandatoryInput().removeAll(existingWPDescList);
-			taskDesc.getMandatoryInput().removeAll(newWPDescList);
-		} else if (action == IActionTypeConstants.ADD_OPTIONAL_INPUT) {
-			taskDesc.getOptionalInput().removeAll(existingWPDescList);
-			taskDesc.getOptionalInput().removeAll(newWPDescList);
-		} else if (action == IActionTypeConstants.ADD_OUTPUT) {
-			taskDesc.getOutput().removeAll(existingWPDescList);
-			taskDesc.getOutput().removeAll(newWPDescList);
-		}
-		activity.getBreakdownElements().removeAll(newWPDescList);
-
-		if (map != null) {
-			Set keyset = map.keySet();
-			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
-				Object key = itor.next();
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) map
-						.get(key);
-
-				// remove it from deliverable
-				wpDesc.getDeliverableParts()
-						.remove((WorkProductDescriptor) key);
-			}
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		if (workProducts != null &&  !workProducts.isEmpty()) {
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-			if (taskDesc.eResource() != null) {
-				modifiedResources.add(taskDesc.eResource());
-			}
-		}
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDragAndDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDragAndDropCommand.java
deleted file mode 100644
index 1267efa..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDragAndDropCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.command.IdentityCommand;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.command.ResourceAwareCompoundCommand;
-import org.eclipse.epf.library.edit.command.ResourceAwareDragAndDropCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Process;
-
-
-/**
- * Abstract drag and drop command for process authoring
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public abstract class BSDragAndDropCommand extends ResourceAwareDragAndDropCommand {
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param location
-	 * @param operations
-	 * @param operation
-	 * @param collection
-	 */
-	public BSDragAndDropCommand(EditingDomain domain, Object owner,
-			float location, int operations, int operation, Collection collection) {
-		super(domain, owner, location, operations, operation, collection);
-	}
-
-	protected boolean prepareDropCopyOn() {
-		return prepareDropLinkOn();
-	}
-
-	protected boolean prepareDropLinkOn() {
-		dragCommand = IdentityCommand.INSTANCE;
-		dropCommand = UnexecutableCommand.INSTANCE;
-
-		ArrayList list = new ArrayList();
-		ArrayList actList = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object obj = iter.next();
-			Object e = TngUtil.unwrap(obj);
-			if (TngUtil.isLocked((EObject) owner))
-				return false;
-			if (accept(e)) {
-				list.add(e);
-			}
-			// else if(obj instanceof Process) {
-			// // disallow drop a process as an activity
-			// }
-			else if (e instanceof Activity && owner instanceof Activity) {
-				Activity target = (Activity) owner;
-				if (DependencyChecker.newCheckAct) {
-					if (! DependencyChecker.checkCircularForMovingVariabilityElement
-							(target, Collections.singletonList(e), true)) {
-						return false;
-					}					
-				} else if (!DependencyChecker.checkCircularDependency((Activity) e, target).isOK()){
-					return false;
-				}
-				
-//				Process srcProc = TngUtil.getOwningProcess((BreakdownElement) obj);
-//				Process targetProc = TngUtil.getOwningProcess(target);
-//
-//				if (!(srcProc instanceof DeliveryProcess && targetProc instanceof CapabilityPattern)) {
-//					actList.add(obj);
-//				}
-				
-				// no more check to prevent applying an activity of a delivery process onto a capability patter
-				// since introduction of deep-copy. Deep copy can always be applied regardless of source and target
-				// processes.
-				//
-				actList.add(obj);
-			}
-		}
-
-		boolean result;
-		if (list.isEmpty() && actList.isEmpty()) {
-			result = false;
-		} else {
-			CompoundCommand cmd = new ResourceAwareCompoundCommand();
-			if (!list.isEmpty()) {
-				cmd.append(createDropCommand(owner, list));
-			}
-			if (!actList.isEmpty()) {
-				if (owner instanceof Activity)
-					cmd.append(new ActivityDropCommand((Activity) owner, actList,
-						getTargetViewer(), ((AdapterFactoryEditingDomain)domain).getAdapterFactory()));
-			}
-			dropCommand = cmd;
-			result = dropCommand.canExecute();
-		}
-		return result;
-	}
-
-	protected Object getTargetViewer() {
-		if (domain instanceof AdapterFactoryEditingDomain) {
-			Process proc = TngUtil.getOwningProcess((BreakdownElement) owner);
-			AdapterFactory adapterFactory = ((AdapterFactoryEditingDomain) domain)
-					.getAdapterFactory();
-			return UserInteractionHelper.getUIHelper().getViewer(adapterFactory, proc);
-		}
-		return null;
-	}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.command.DragAndDropCommand#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		return dropCommand.getAffectedObjects();		
-	}
-
-	protected abstract boolean accept(Object obj);
-
-	protected abstract Command createDropCommand(Object owner, List dropSrc);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDropCommand.java
deleted file mode 100644
index de068a4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDropCommand.java
+++ /dev/null
@@ -1,876 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.edit.IConfigurationApplicator;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.command.BatchCommand;
-import org.eclipse.epf.library.edit.command.INestedCommandProvider;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.command.NestedCommandExcecutor;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * Abstract base DropCommand class for breakdown structure editor
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class BSDropCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-	public static final Set<EStructuralFeature> DEFAULT_SYNCH_FEATURES = Collections.unmodifiableSet(new HashSet<EStructuralFeature>(Arrays.asList(
-			new EStructuralFeature[] {
-					UmaPackage.eINSTANCE.getNamedElement_Name(),
-					UmaPackage.eINSTANCE.getMethodElement_BriefDescription(),
-					UmaPackage.eINSTANCE.getDescribableElement_PresentationName(),
-					UmaPackage.eINSTANCE.getTask_OptionalInput(),
-					UmaPackage.eINSTANCE.getTask_MandatoryInput(),
-					UmaPackage.eINSTANCE.getTask_Output(),
-					UmaPackage.eINSTANCE.getTask_Steps(),				
-					UmaPackage.eINSTANCE.getTask_PerformedBy(),
-					UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy(),
-					UmaPackage.eINSTANCE.getRole_ResponsibleFor(),
-					UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts(),
-					UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts()
-			}
-	)));
-	
-	/**
-	 * Map of linked element's feature to descriptor's feature
-	 */
-	public static final Map<EStructuralFeature, EStructuralFeature> FEATURE_MAP = new HashMap<EStructuralFeature, EStructuralFeature>();
-	static {
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getNamedElement_Name(), UmaPackage.eINSTANCE.getNamedElement_Name());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getMethodElement_BriefDescription(), UmaPackage.eINSTANCE.getMethodElement_BriefDescription());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getDescribableElement_PresentationName(), UmaPackage.eINSTANCE.getDescribableElement_PresentationName());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getTask_OptionalInput(), UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getTask_MandatoryInput(), UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getTask_Output(), UmaPackage.eINSTANCE.getTaskDescriptor_Output());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getRole_ResponsibleFor(), UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts(), UmaPackage.eINSTANCE.getWorkProductDescriptor_DeliverableParts());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getTask_Steps(), UmaPackage.eINSTANCE.getTaskDescriptor_SelectedSteps());
-//		FEATURE_MAP.put(UmaPackage.eINSTANCE.getEstimatedMethodElement_Estimate(), UmaPackage.eINSTANCE.getEstimatedMethodElement_Estimate());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy(), UmaPackage.eINSTANCE.getTaskDescriptor_AdditionallyPerformedBy());
-		FEATURE_MAP.put(UmaPackage.eINSTANCE.getTask_PerformedBy(), UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy());
-	}
-
-	protected Activity activity;
-
-	protected List<Object> dropElements;
-	
-	protected List<Object> unwrappedDropElements;
-
-	private Set<Resource> modifiedResources;
-
-	protected List<Object> elementsToAddToDefaultConfig;
-
-	protected Set<Object> addedObjects;
-
-	private Process process;
-
-	private boolean addedToDefaultConfig = false;
-
-	protected boolean synchronize = false;
-
-	protected ArrayList<TaskDescriptor> taskDescList;
-
-	protected ArrayList<Descriptor> taskDescriptorsToUpdate;
-
-//	protected Set descriptorsToRefresh;
-
-	/**
-	 * Map of descriptor to old refreshable feature map
-	 */
-	private Map<Descriptor, Map<?, ?>> descriptorToOldRefreshableFeaturesMap;
-
-	/**
-	 * Map of descriptor to map of feature to new values
-	 */
-//	protected Map descriptorToNewFeatureValuesMap;
-//	private HashMap descriptorToOldFeatureValuesMap;	
-	protected DescriptorUpdateBatchCommand batchCommand;
-
-//	private HashMap wpdToOldResponsibleRoleMap;
-
-	/**
-	 * Map of TaskDescriptor to list of newly added steps
-	 */
-	private Map taskDescToNewStepsMap;
-
-	private Map taskDescToOldEstimateMap;
-	
-	protected boolean canceled;
-
-	private MethodConfiguration config;
-
-	protected Set synchFeatures = DEFAULT_SYNCH_FEATURES;
-
-	private BatchCommand refreshResponsibleForCommand;
-
-	protected boolean executed;
-
-//	protected Object UIContext;
-	
-	protected boolean runAsJob;
-	
-	private IProgressMonitor monitor;
-
-	private int workedUnits;
-
-	private NestedCommandExcecutor nestedCommandExcecutor;
-	
-	/**
-	 * @param activity
-	 *            the activity that the given elements are dropped on
-	 * @param dropElements
-	 *            the elements to drop on the given activity
-	 */
-	public BSDropCommand(Activity activity, List<Object> dropElements) {
-		this(activity, dropElements, null, null, false);
-	}
-
-	/**
-	 * @param synch
-	 *            if true, the command will clean the content and relationships
-	 *            of existing descriptors and refresh them with the linked
-	 *            MethodElement
-	 */
-	public BSDropCommand(Activity activity, List<Object> dropElements, boolean synch) {
-		this(activity, dropElements, null, null, synch);
-	}
-
-	/**
-	 * Synchronize the given content elements to its TaskDescriptors in the
-	 * given activity using the given MethodConfiguration and list of
-	 * synchronizable features.
-	 * 
-	 * @param activity
-	 * @param dropElements
-	 *            the elements to synchronize
-	 * @param config
-	 * @param synchFeatures
-	 *            the synchronizable features, if <code>null</code> the DEFAULT_SYNCH_FEATURES will be used.
-	 */
-	public BSDropCommand(Activity activity, List<Object> dropElements,
-			MethodConfiguration config, Set synchFeatures) {
-		this(activity, dropElements, config, synchFeatures, true);
-	}
-	
-	public BSDropCommand(Activity activity, List<Object> dropElements,
-			MethodConfiguration config, Set synchFeatures, boolean synch) {
-		super();
-		this.activity = activity;
-		process = TngUtil.getOwningProcess(activity);
-		this.synchronize = synch;
-		this.config = config;
-		if (synchFeatures == null) {
-			this.synchFeatures = DEFAULT_SYNCH_FEATURES;
-		}
-		else {
-			this.synchFeatures = synchFeatures;
-		}
-		
-		this.dropElements = dropElements;
-		nestedCommandExcecutor = createNestedCommandExcecutor();
-	}
-	
-	protected NestedCommandExcecutor createNestedCommandExcecutor() {
-		return new NestedCommandExcecutor(this) {
-			@Override
-			public void executeNestedCommands() {
-				if(taskDescList != null && !taskDescList.isEmpty()) {
-					List nestedCommandProviders = ExtensionManager
-					.getNestedCommandProviders();
-					if (!nestedCommandProviders.isEmpty()) {
-						for (Iterator iter = nestedCommandProviders.iterator(); iter
-						.hasNext();) {
-							INestedCommandProvider cmdProvider = (INestedCommandProvider) iter
-							.next();
-							try {
-								Command cmd = cmdProvider.createRelatedObjects(
-										taskDescList, BSDropCommand.this);
-								if (cmd != null && cmd.canExecute()) {
-									cmd.execute();
-									getNestedCommands().add(cmd);
-								}
-							} catch (Exception e) {
-								LibraryEditPlugin.getDefault().getLogger()
-								.logError(e);
-							}
-						}
-					}
-				}
-
-				super.executeNestedCommands();
-			}
-		};
-	}
-	
-	protected IProgressMonitor getProgressMonitor() {
-		if(monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		return monitor;
-	}
-	
-	protected void prepareDropElements() {		
-		ArrayList<Object> elements = new ArrayList<Object>();
-		getMethodConfiguration();
-		unwrappedDropElements = new ArrayList<Object>();
-		for (Object o : dropElements) {
-			Object element = TngUtil.unwrap(o);
-			element = Providers.getConfigurationApplicator().resolve(element, config);
-			if (!elements.contains(element)
-					&& !(element instanceof EObject && ((EObject) element)
-							.eIsProxy())) {				
-				elements.add(element);
-				unwrappedDropElements.add(o);
-			}
-		}
-		dropElements = elements;
-	}
-	
-//	/**
-//	 * Sets UI context for this command, this can be a Shell object
-//	 * @param UIContext
-//	 */
-//	public void setUIContext(Object UIContext) {
-//		this.UIContext = UIContext;
-//	}
-
-	public MethodConfiguration getMethodConfiguration() {
-		if(config == null) {
-			config = TngUtil.getOwningProcess(activity).getDefaultContext();
-		}
-		return config;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose() {
-		if (dropElements != null) {
-			dropElements.clear();
-		}
-		if(unwrappedDropElements != null) {
-			unwrappedDropElements.clear();
-		}
-		if (modifiedResources != null) {
-			modifiedResources.clear();
-		}
-		if (elementsToAddToDefaultConfig != null) {
-			elementsToAddToDefaultConfig.clear();
-		}
-		if (addedObjects != null) {
-			addedObjects.clear();
-		}
-		if (descriptorToOldRefreshableFeaturesMap != null) {
-			descriptorToOldRefreshableFeaturesMap.clear();
-		}
-		if (taskDescList != null) {
-			taskDescList.clear();
-		}
-		if (taskDescToNewStepsMap != null) {
-			taskDescToNewStepsMap.clear();
-		}
-		if (taskDescToOldEstimateMap != null) {
-			taskDescToOldEstimateMap.clear();
-		}
-		if (refreshResponsibleForCommand != null) {
-			refreshResponsibleForCommand.dispose();
-		}
-		if (taskDescriptorsToUpdate != null) {
-			taskDescriptorsToUpdate.clear();
-		}
-		if(batchCommand != null) {
-			batchCommand.dispose();
-		}
-		activity = process = null;
-		if(nestedCommandExcecutor != null) {
-			nestedCommandExcecutor.dispose();
-		}
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection<Resource> getModifiedResources() {
-		if (modifiedResources == null) {
-			modifiedResources = new HashSet<Resource>();
-			if (activity.eResource() != null) {
-				modifiedResources.add(activity.eResource());
-			}
-		}
-		
-		modifiedResources.addAll(nestedCommandExcecutor.getModifiedResources());
-
-		return modifiedResources;
-	}
-
-	/**
-	 * Clears all the refreshable features of the given descriptor
-	 * 
-	 * @param descriptor
-	 */
-	private boolean clearDescriptor(Descriptor descriptor) {
-		Set excludeSynchFeatures = new HashSet(DEFAULT_SYNCH_FEATURES);
-		excludeSynchFeatures.removeAll(synchFeatures);
-		Set excludeFeatures;
-		if (excludeSynchFeatures.isEmpty()) {
-			excludeFeatures = excludeSynchFeatures;
-		}
-		else {
-			excludeFeatures = new HashSet();
-			for (Iterator iter = excludeSynchFeatures.iterator(); iter.hasNext();) {
-				EStructuralFeature feature = getDescriptorFeature((EStructuralFeature) iter.next());
-				if(feature != null) {
-					excludeFeatures.add(feature);
-				}
-			}
-		}
-		boolean ret = ProcessCommandUtil.clearDescriptor(descriptor,
-				descriptorToOldRefreshableFeaturesMap, excludeFeatures);
-		if (ret && descriptor instanceof TaskDescriptor) {
-			if (taskDescriptorsToUpdate == null) {
-				taskDescriptorsToUpdate = new ArrayList<Descriptor>();
-			}
-			taskDescriptorsToUpdate.add(descriptor);
-		}
-		return ret;
-	}
-
-	/**
-	 * @param feature
-	 * @return
-	 */
-	private static EStructuralFeature getDescriptorFeature(EStructuralFeature linkedElementFeature) {
-		return (EStructuralFeature) FEATURE_MAP.get(linkedElementFeature);
-	}
-	
-	protected boolean preExecute() {
-		prepareDropElements();
-		
-		boolean b = !dropElements.isEmpty();
-		if (b) {
-//			descriptorToNewFeatureValuesMap = new HashMap();
-			batchCommand = new DescriptorUpdateBatchCommand(false, synchFeatures, config); //TODO: why clear must be false ???
-
-//			if (synchronize) {
-//				descriptorsToRefresh = new HashSet();
-//			}
-		}
-		return b;
-	}
-	
-	protected boolean collectElementsToAddToDefaultConfig() {
-		if (elementsToAddToDefaultConfig == null) {
-			elementsToAddToDefaultConfig = new ArrayList<Object>();
-			for (Iterator iter = dropElements.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				switch (UserInteractionHelper.checkAgainstDefaultConfiguration(
-						process, element)) {
-				case 0:
-					iter.remove();
-					break;
-				case 2:
-					elementsToAddToDefaultConfig.add(element);
-					break;
-				case -1:
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Adds elements to the default configuration
-	 * 
-	 * @return true if default configuration has been modified, false otherwise
-	 */
-	private boolean addToDefaultConfiguration() {
-		if (!addedToDefaultConfig && elementsToAddToDefaultConfig != null && !elementsToAddToDefaultConfig.isEmpty()) {
-			if(addedObjects == null) {
-				addedObjects = new HashSet();
-			}
-			else {
-				addedObjects.clear();
-			}
-			for (Iterator iter = elementsToAddToDefaultConfig.iterator(); iter
-			.hasNext();) {
-				EObject element = (EObject) iter.next();
-				ProcessUtil.addToDefaultConfiguration(process, element,
-						addedObjects);
-			}
-			if (!addedObjects.isEmpty()) {
-				getModifiedResources().add(
-						process.getDefaultContext().eResource());
-				return true;
-			}
-			addedToDefaultConfig = true;
-		}
-		return false;
-	}
-	
-	protected int getTotalWork() {
-		return 20;
-	}
-	
-	protected void worked(int unitsOfWork) {
-		monitor.worked(unitsOfWork);
-		workedUnits = workedUnits + unitsOfWork;
-	}
-	
-	protected int getRemainingWork() {
-		int remaining = getTotalWork() - workedUnits;
-		if(remaining < 0) {
-			remaining = 0;
-		}
-		return remaining;
-	}
-
-	protected boolean updateDefaultConfigurationNeeded() {
-		return !synchronize;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {		
-		// BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
-		//			
-		// public void run() {
-		// canceled = !addToDefaultConfiguration();
-		// }
-		//			
-		// });
-		//		
-		// //TODO: This caused NullPointerException or ThreadAccessError when
-		// showing selection dialog is needed
-		// //
-		// IRunnableWithProgress runnable = new IRunnableWithProgress() {
-		//
-		// public void run(IProgressMonitor monitor) throws
-		// InvocationTargetException, InterruptedException {
-		// canceled = !preExecute();
-		// }
-		//			
-		// };
-		// UserInteractionHelper.runWithProgress(runnable, null);
-		//		
-		// if(!canceled) {
-		// BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
-		//				
-		// public void run() {
-		// redo();
-		// }
-		//				
-		// });
-		// }
-
-//		BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
-//
-//			public void run() {
-//				if ((!synchronize && addToDefaultConfiguration()) && preExecute()) {
-//					redo();
-//				}
-//			}
-//
-//		});
-		
-		if(updateDefaultConfigurationNeeded()) {
-			if(!collectElementsToAddToDefaultConfig()) {
-				return;
-			}
-		}
-		
-		final String taskName = (label == null ? "" : label); //$NON-NLS-1$
-		IRunnableWithProgress runnable = new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				try {
-					monitor.beginTask(taskName, getTotalWork());
-					BSDropCommand.this.monitor = monitor;
-					worked(getRemainingWork() / 3);
-					
-					// this must be called before preExecute() to add required elements to configuration
-					// so the command can realize data correctly
-					//
-					addToDefaultConfiguration();
-					worked(getRemainingWork() / 3);
-					
-					if (preExecute()) {
-						worked(getRemainingWork() / 3);
-						redo();
-					}
-				}
-				finally {
-					monitor.done();
-				}
-			}
-			
-		};
-		if(runAsJob) {
-			UserInteractionHelper.runAsJob(runnable, taskName);
-		}
-		else {
-//			UserInteractionHelper.runInUI(runnable, (Shell)null);
-			UserInteractionHelper.runWithProgress(runnable, null);
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		try {
-			// add elements to the default configuration if needed
-			//
-			addToDefaultConfiguration();
-			
-			doExecute();
-			updateDescriptors();
-			
-			long time = 0;
-			if(TngUtil.DEBUG) {
-				time = System.currentTimeMillis();
-			}
-			nestedCommandExcecutor.executeNestedCommands();
-			if(TngUtil.DEBUG) {
-				System.out.println("BSDropCommand.redo(): executeNestedCommands(). " + (System.currentTimeMillis() - time));
-			}
-			
-			executed = true;
-		}
-		catch(RuntimeException e) {
-			if(TngUtil.DEBUG) {
-				e.printStackTrace();
-			}
-			LibraryEditPlugin.getDefault().getLogger().logError(e);
-			throw e;
-		}
-	}
-
-	/**
-	 * Updates descriptors
-	 */
-	protected void updateDescriptors() {
-		if (synchronize) {
-			clearDescriptors();
-		}
-
-		// update new values;
-		//
-		batchCommand.execute();
-		
-		updateTaskDescriptors();
-
-		setResponsibleRoles();
-	}
-
-//	/**
-//	 * @param desc
-//	 * @param feature
-//	 * @param value
-//	 */
-//	protected void saveOldFeatureValue(Descriptor desc,
-//			EStructuralFeature feature) {
-//		if (descriptorToOldFeatureValuesMap == null) {
-//			descriptorToOldFeatureValuesMap = new HashMap();
-//		}
-//		Object value = desc.eGet(feature);
-//		if(feature.isMany()) {
-//			value = new ArrayList((List)value);
-//		}
-//		Map featureMap = (Map) descriptorToOldFeatureValuesMap.get(desc);
-//		if (featureMap == null) {
-//			featureMap = new HashMap();
-//			descriptorToOldFeatureValuesMap.put(desc, featureMap);
-//		}
-//		featureMap.put(feature, value);
-//	}
-
-	protected void undoUpdateDescriptors() {
-		undoSetResponsibleRole();
-
-		undoUpdateTaskDescriptors();
-
-		// restore old values
-		//
-		batchCommand.undo();
-
-		// restore value for refreshable features that had been cleared
-		//
-		if (synchronize) {
-			undoClearDescriptors();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void clearDescriptors() {
-		if (descriptorToOldRefreshableFeaturesMap == null) {
-			descriptorToOldRefreshableFeaturesMap = new HashMap();
-			if (!batchCommand.getDescriptorsToRefresh().isEmpty()) {
-				for (Iterator iter = batchCommand.getDescriptorsToRefresh().iterator(); iter
-						.hasNext();) {
-					clearDescriptor((Descriptor) iter.next());
-				}
-				// descriptorsToRefresh.clear();
-			}
-		}
-	}
-
-	/**
-	 * Updates affected task descriptors with new data from method content
-	 */
-	private void updateTaskDescriptors() {
-		if (taskDescriptorsToUpdate != null) {
-			// refresh steps from the associated task
-			//
-			if(synchFeatures.contains(UmaPackage.eINSTANCE.getTask_Steps())) {
-				if (taskDescToNewStepsMap == null) {
-					taskDescToNewStepsMap = new HashMap();
-				}
-				IConfigurationApplicator configApplicator = Providers
-				.getConfigurationApplicator();
-				for (Iterator iter = taskDescriptorsToUpdate.iterator(); iter
-				.hasNext();) {
-					TaskDescriptor taskDesc = (TaskDescriptor) iter.next();
-					Task task = taskDesc.getTask();
-					if (task != null && !((EObject) task).eIsProxy()) {
-						List steps = (List) configApplicator.getReference(task
-								.getPresentation(), task, UmaPackage.eINSTANCE
-								.getContentDescription_Sections(), config);
-						
-						// add those steps to TaskDescriptor if they are not there
-						// yet.
-						//
-						ArrayList newSteps = new ArrayList();
-						taskDesc.getSelectedSteps().retainAll(steps);
-						for (Iterator iter1 = steps.iterator(); iter1.hasNext();) {
-							Object step = iter1.next();
-							if (!taskDesc.getSelectedSteps().contains(step)) {
-								newSteps.add(step);
-							}
-						}
-						if (!newSteps.isEmpty()) {
-							taskDesc.getSelectedSteps().addAll(newSteps);
-							taskDescToNewStepsMap.put(taskDesc, newSteps);
-//							System.out
-//							.println("BSDropCommand.updateTaskDescriptors(): changed");
-						}
-					}
-				}
-			}
-			
-		}
-	}
-
-	private void undoUpdateTaskDescriptors() {
-		if (taskDescToNewStepsMap != null) {
-			for (Iterator iter = taskDescToNewStepsMap.entrySet().iterator(); iter
-					.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				TaskDescriptor taskDesc = (TaskDescriptor) entry.getKey();
-				taskDesc.getSelectedSteps().removeAll(
-						(Collection) entry.getValue());
-			}
-		}
-	}
-
-	/**
-	 * Go thru all the work product descriptors of this activity and set the
-	 * responsible role for them if there is any
-	 */
-	private void setResponsibleRoles() {
-		if(!synchFeatures.contains(UmaPackage.eINSTANCE.getRole_ResponsibleFor())) {
-			return;
-		}
-		
-		if(refreshResponsibleForCommand != null) {
-			refreshResponsibleForCommand.dispose();
-		}
-		refreshResponsibleForCommand = new BatchCommand(true);
- 
-		List brElements = activity.getBreakdownElements();
-		List wpDescList = new ArrayList();
-		List roleDescriptors = new ArrayList();
-		for (Iterator itor = brElements.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (obj instanceof WorkProductDescriptor) {
-				wpDescList.add(obj);
-			} else if (obj instanceof RoleDescriptor) {
-				roleDescriptors.add(obj);
-			}
-		}
-
-		for (Iterator itor = roleDescriptors.iterator(); itor.hasNext();) {
-			RoleDescriptor roleDesc = (RoleDescriptor) itor.next();
-			Role role = roleDesc.getRole();
-			if (role != null) {				
-				List responsibleWorkProducts = (List) Providers.getConfigurationApplicator().getReference(role, UmaPackage.eINSTANCE.getRole_ResponsibleFor(), config);
-				List responsibleWPDList = new ArrayList();
-				for (int j = wpDescList.size() - 1; j > -1; j--) {
-					WorkProductDescriptor wpDesc = (WorkProductDescriptor) wpDescList
-							.get(j);
-//					RoleDescriptor responsibleRoleDesc = AssociationHelper.getResponsibleRoleDescriptor(wpDesc);
-//					if (responsibleWorkProducts.contains(wpDesc
-//							.getWorkProduct())
-//							&&  responsibleRoleDesc != roleDesc) {
-//						wpdToOldResponsibleRoleMap.put(wpDesc, responsibleRoleDesc);
-////						wpDesc.setResponsibleRole(roleDesc);
-//						roleDesc.getResponsibleFor().add(wpDesc);
-//					}
-					
-					if(responsibleWorkProducts.contains(wpDesc.getWorkProduct())) {
-						responsibleWPDList.add(wpDesc);
-					}
-				}				
-				if(!roleDesc.getResponsibleFor().equals(responsibleWPDList)) {
-					refreshResponsibleForCommand.addFeatureValues(roleDesc, UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor(), responsibleWPDList);
-				}
-			}
-		}
-		
-		refreshResponsibleForCommand.execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		nestedCommandExcecutor.undoNestedCommands();
-		
-		// remove any object that had been added to the default configuration
-		//
-		if (addedObjects != null && !addedObjects.isEmpty()) {
-			MethodConfiguration config = process.getDefaultContext();
-			for (Iterator iter = addedObjects.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof MethodPlugin) {
-					config.getMethodPluginSelection().remove(element);
-				} else if (element instanceof MethodPackage) {
-					config.getMethodPackageSelection().remove(element);
-				}
-			}
-			addedToDefaultConfig = false;
-		}
-
-		undoUpdateDescriptors();
-
-		doUndo();
-	}
-
-	/**
-	 * 
-	 */
-	private void undoClearDescriptors() {
-		if(descriptorToOldRefreshableFeaturesMap != null) {
-			for (Iterator iter = descriptorToOldRefreshableFeaturesMap.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Descriptor desc = (Descriptor) entry.getKey();
-				Map featureMap = (Map) entry.getValue();
-				for (Iterator iterator = featureMap.entrySet().iterator(); iterator
-				.hasNext();) {
-					entry = (Map.Entry) iterator.next();
-					desc
-					.eSet((EStructuralFeature) entry.getKey(), entry
-							.getValue());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Undoes the change made by
-	 * {@link #setResponsibleRoles() setResponsibleRoles() }
-	 */
-	private void undoSetResponsibleRole() {
-//		if(wpdToOldResponsibleRoleMap != null && !wpdToOldResponsibleRoleMap.isEmpty()) {
-//			for (Iterator iter = wpdToOldResponsibleRoleMap.entrySet().iterator(); iter
-//			.hasNext();) {
-//				Map.Entry entry = (Map.Entry) iter.next();
-//				WorkProductDescriptor wpd = (WorkProductDescriptor) entry.getKey();
-//				((RoleDescriptor) entry.getValue()).getResponsibleFor().remove(wpd);
-//			}
-//		}
-		if(refreshResponsibleForCommand != null) {
-			refreshResponsibleForCommand.undo();
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-	
-	protected abstract void doExecute();
-
-	protected abstract void doUndo();
-
-	public static interface IExecutor {
-		boolean preExecute();
-
-		void doExcecute();
-
-		void doUndo();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BasicSynchronizeDescriptorCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BasicSynchronizeDescriptorCommand.java
deleted file mode 100644
index 1defe78..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BasicSynchronizeDescriptorCommand.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 7.0
- */
-public class BasicSynchronizeDescriptorCommand extends AbstractCommand
-		implements IResourceAwareCommand {
-	
-	public static final Set NONEMPTY_ATTRIBUTES = new HashSet(Arrays.asList(
-			new EStructuralFeature[] {
-					UmaPackage.eINSTANCE.getNamedElement_Name(),
-					UmaPackage.eINSTANCE.getDescribableElement_PresentationName()
-			}
-	));
-	
-
-	protected Descriptor descriptor;
-	protected Set synchFeatures;
-	protected MethodConfiguration config;
-	private HashMap featureMap;
-
-	public BasicSynchronizeDescriptorCommand(Descriptor descriptor, Set synchFeatures, MethodConfiguration config) {
-		this.descriptor = descriptor;
-		if (synchFeatures == null) {
-			this.synchFeatures = BSDropCommand.DEFAULT_SYNCH_FEATURES;
-		}
-		else {
-			this.synchFeatures = synchFeatures;
-		}
-		this.config = config;
-	}
-	
-	public Collection getModifiedResources() {
-		if(descriptor.eResource() != null) {
-			return Collections.singletonList(descriptor.eResource());
-		}
-		else {
-			return Collections.EMPTY_LIST;
-		}
-	}
-	
-	/**
-	 * @param feature
-	 * @param value
-	 */
-	private void saveOldFeatureValue(EStructuralFeature feature) {
-		if (featureMap == null) {
-			featureMap = new HashMap();
-		}
-		featureMap.put(feature, descriptor.eGet(feature));
-	}
-
-
-	public void execute() {
-		// update the linked element if required
-		//
-		MethodElement e = ProcessUtil.getAssociatedElement(descriptor);
-		Object resolved = Providers.getConfigurationApplicator().resolve(e, config);
-		if(resolved != e) {
-			EStructuralFeature feature;
-			if(descriptor instanceof TaskDescriptor) {
-				feature = UmaPackage.eINSTANCE.getTaskDescriptor_Task();					
-			}
-			else if(descriptor instanceof WorkProductDescriptor) {
-				feature = UmaPackage.eINSTANCE.getWorkProductDescriptor_WorkProduct();					
-			}
-			else if(descriptor instanceof RoleDescriptor) {
-				feature = UmaPackage.eINSTANCE.getRoleDescriptor_Role();					
-			}
-			else {
-				feature = null;
-			}
-			saveOldFeatureValue(feature);
-			e = (MethodElement) resolved;
-			descriptor.eSet(feature, e);
-		}
-		
-		for (Iterator iter = synchFeatures.iterator(); iter.hasNext();) {
-			Object f = iter.next();
-			if(f instanceof EAttribute) {
-				EAttribute attrib = (EAttribute) f; 
-				EAttribute descAttrib = (EAttribute) BSDropCommand.FEATURE_MAP.get(attrib);
-				if(descAttrib != null) {
-					if(NONEMPTY_ATTRIBUTES.contains(attrib)) {
-						// refresh attribute that can not be empty
-						//
-						Object value =  e instanceof VariabilityElement ? 
-								(String) Providers.getConfigurationApplicator().getAttribute((VariabilityElement) e, attrib, config) 
-								: e.eGet(attrib);
-						// if attriubute is presentation name and new value is blank, copy name over
-						if ((descAttrib.equals(UmaPackage.eINSTANCE.getDescribableElement_PresentationName())) && (value == null || value.equals(""))) //$NON-NLS-1$
-							value = e instanceof VariabilityElement ? 
-									(String) Providers.getConfigurationApplicator().getAttribute((VariabilityElement) e, UmaPackage.eINSTANCE.getNamedElement_Name(), config) 
-									: e.eGet(UmaPackage.eINSTANCE.getNamedElement_Name());
-						Object descValue = descriptor.eGet(descAttrib);
-					
-						if((value == null && descValue != null) || (value != null && !value.equals(descValue))) {
-							saveOldFeatureValue(descAttrib);
-							descriptor.eSet(descAttrib, value);
-						}
-					}
-					else {
-						// reset attribute to its default value
-						//
-						saveOldFeatureValue(descAttrib);
-						descriptor.eSet(descAttrib, descAttrib.getDefaultValue());
-					}
-				}
-			}
-		}
-	}
-
-	public void redo() {
-		execute();
-	}
-	
-	protected boolean prepare() {
-		return true;
-	}
-	
-	public void undo() {
-		if(featureMap != null) {
-			for (Iterator iterator = featureMap.entrySet().iterator(); iterator
-			.hasNext();) {
-				Map.Entry entry = (Map.Entry) iterator.next();
-				EStructuralFeature feature = (EStructuralFeature) entry
-				.getKey();
-				try {
-					descriptor.eSet(feature, entry.getValue());
-				}
-				catch(RuntimeException e) {
-					throw e;
-				}
-			}	
-			featureMap.clear();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose() {
-		if(featureMap != null) {
-			featureMap.clear();
-			featureMap = null;
-		}		
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ContributeToActivityCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ContributeToActivityCommand.java
deleted file mode 100644
index 3435279..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ContributeToActivityCommand.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-
-/**
- * @author Phong Nguyen Le - Oct 10, 2005
- * @since 1.0
- */
-public class ContributeToActivityCommand extends VaryActivityCommand {
-
-	/**
-	 * @param wrapper
-	 */
-	public ContributeToActivityCommand(
-			BreakdownElementWrapperItemProvider wrapper) {
-		super(wrapper);
-		setLabel(LibraryEditResources.contributeToActivity_text); 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.VaryActivityCommand#doVary()
-	 */
-	protected void doVary() {
-		ProcessUtil.contributeToActivity(wrapper, createdActivities);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CopyHelper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CopyHelper.java
deleted file mode 100644
index cd99fde..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CopyHelper.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.VariabilityElement;
-
-public class CopyHelper extends CopyCommand.Helper {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 5264389393955639004L;
-
-	private Map copyToOriginalMap = new HashMap();
-	
-	private Map baseToVariabilityElementMap = new HashMap();
-	private Map baseToBackupVariabilityElementMap = new HashMap();
-
-	private Map<String, BreakdownElement> wrapperPathToCopyMap = new HashMap<String, BreakdownElement>();
-	
-	/* (non-Javadoc)
-	 * @see java.util.HashMap#clear()
-	 */
-	public void clear() {		
-		super.clear();
-		copyToOriginalMap.clear();
-		baseToBackupVariabilityElementMap.clear();
-		baseToVariabilityElementMap.clear();
-		wrapperPathToCopyMap.clear();
-	}
-	
-	public Object getOriginal(Object copy) {
-		return copyToOriginalMap.get(copy);
-	}
-	
-	public Object putVariabilityElement(VariabilityElement base, VariabilityElement ve) {
-		return baseToVariabilityElementMap.put(base, ve);
-	}
-	
-	public Object removeVariabilityElement(VariabilityElement base) {
-		return baseToVariabilityElementMap.remove(base);
-	}
-	
-	public Object putBackupCopy(VariabilityElement base, VariabilityElement backup) {
-		return baseToBackupVariabilityElementMap.put(base, backup);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.command.CopyCommand.Helper#put(java.lang.Object, java.lang.Object)
-	 */
-	public EObject put(EObject key, EObject value) {
-		copyToOriginalMap.put(value, key);
-		return super.put(key, value);
-	}
-	
-	public Object basicPut(EObject key, EObject value) {
-		Object old = super.put(key, value);
-		initializationList.remove(key);
-		return old;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.command.CopyCommand.Helper#getCopy(org.eclipse.emf.ecore.EObject)
-	 */
-	public EObject getCopy(EObject object) {
-		if(object instanceof VariabilityElement) {
-			Object ve = getVariabilityElement(baseToVariabilityElementMap, object);
-			if(ve != null) {
-				return super.getCopy((EObject) ve);
-			}
-		}
-		EObject copy = super.getCopy(object);
-		if(copy == null) {
-			// get backup copy
-			//
-			Object ve = getVariabilityElement(baseToBackupVariabilityElementMap, object);
-			if(ve != null) {
-				return super.getCopy((EObject) ve);
-			}
-		}
-		return copy;
-	}
-	
-	private static Object getVariabilityElement(Map baseToVariabilityElementMap, Object base) {
-		Object ve = null;		
-		do {
-			base = baseToVariabilityElementMap.get(base);
-			if(base != null) {
-				ve = base;
-			}
-		} while (base != null);
-		return ve;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.command.CopyCommand.Helper#getCopyTarget(org.eclipse.emf.ecore.EObject, boolean)
-	 */
-	public EObject getCopyTarget(EObject target, boolean copyRequired) {
-		if(copyRequired) {
-			return super.getCopy(target);
-		}
-		else {
-			EObject copied = getCopy(target);
-			if (copied == null)
-			{
-				return target;
-			}
-			return copied;
-		}
-	}
-	
-	public Map getObjectToCopyMap() {
-		HashSet objects = new HashSet(baseToBackupVariabilityElementMap.keySet());
-		objects.addAll(baseToVariabilityElementMap.keySet());
-		objects.addAll(keySet());		
-		Map map = new HashMap();
-		for (Iterator iter = objects.iterator(); iter.hasNext();) {
-			Object object = iter.next();
-			map.put(object, getCopy((EObject) object));
-		}
-		return map;
-	}		
-
-	public void putWrapperCopy(String guidPath, BreakdownElement e) {
-		if(e.getName().equals("close-out_project")) {
-			System.out.println();
-		}
-		wrapperPathToCopyMap .put(guidPath, e);
-	}
-	
-	public BreakdownElement getWrapperCopy(String guidPath) {
-		return wrapperPathToCopyMap.get(guidPath);
-	}
-
-	public Map<String, BreakdownElement> getWrapperPathToCopyMap() {
-		return wrapperPathToCopyMap;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CreateProcessComponentCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CreateProcessComponentCommand.java
deleted file mode 100644
index df4e45b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CreateProcessComponentCommand.java
+++ /dev/null
@@ -1,353 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.command.UserInput;
-import org.eclipse.epf.library.edit.navigator.ProcessPackageItemProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.AdapterFactoryItemLabelProvider;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.ItemLabelProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Element;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * Executes the Create Process Component command.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class CreateProcessComponentCommand extends CreateChildCommand {
-
-	private static final Collection<EClass> ECLASSES = new HashSet<EClass>();
-
-	private Process process;
-
-	private IStatus status;
-
-	static {
-		ECLASSES.add(UmaPackage.eINSTANCE.getMethodPackage());
-	}
-
-	public static class CompareByName implements Comparator<MethodElement> {
-
-		public int compare(MethodElement obj1, MethodElement obj2) {
-			String name1 = ((MethodElement) obj1).getName();
-			String name2 = ((MethodElement) obj2).getName();
-			return name1.compareToIgnoreCase(name2);
-		}
-	}
-
-	public class ConfigValidator implements IValidator {
-
-		public IStatus isValid(Object obj) {
-			if (obj == null) {
-				String msg = LibraryEditResources.noDefaultConfigError_msg;
-				return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-						.getId(), 0, msg, null);
-			}
-			return Status.OK_STATUS;
-		}
-
-		public String isValid(String name) {
-			return null;
-		}
-	}
-	/**
-	 * Creates a new instance.
-	 */
-	public CreateProcessComponentCommand(EditingDomain domain, EObject owner,
-			EStructuralFeature feature, Object child, int index,
-			Collection<?> selection, Helper helper) {
-		super(domain, owner, feature, child, index, selection, helper);
-	}
-
-	public boolean canUndo() {
-		return false;
-	}
-
-	public void execute() {
-		MethodLibrary lib = UmaUtil.getMethodLibrary(owner);
-		
-		Object shell = LibraryEditPlugin.getDefault().getContext();
-		
-		// The owner must be updatable.
-		//
-		status = UserInteractionHelper.checkModify(owner, shell);
-		if (!status.isOK()) {
-			return;
-		}
-
-		List configs = lib.getPredefinedConfigurations();
-		List methodConfigs = new ArrayList();
-		for (Iterator iter = configs.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!(element instanceof ProcessFamily)) {
-				methodConfigs.add(element);
-			}
-		}
-
-		if (methodConfigs.isEmpty()) {
-			status = new Status(IStatus.ERROR, LibraryEditPlugin.getDefault().getId(),
-								0, LibraryEditResources.noConfigError_msg, null);
-//			Messenger.INSTANCE.showError(
-//					LibraryEditResources.createProcess_text,
-//					LibraryEditResources.noConfigError_msg);			
-			return;
-		}
-
-		ProcessPackageItemProvider adapter = (ProcessPackageItemProvider) helper;
-
-		ArrayList procClasses = new ArrayList();
-		if (adapter.getProcessType() == UmaPackage.eINSTANCE
-				.getProcessPlanningTemplate()) {
-			procClasses.add(DeliveryProcess.class);
-			procClasses.add(CapabilityPattern.class);
-		}
-		MethodPlugin plugin = UmaUtil.getMethodPlugin((Element) owner);		
-		List baseProcList = TngUtil.getAvailableBaseProcesses(plugin,
-				procClasses);
-
-		// sort by name
-		Collections.sort(methodConfigs, new CompareByName());
-
-		MethodConfiguration[] procCtxs = new MethodConfiguration[methodConfigs
-				.size()];
-		methodConfigs.toArray(procCtxs);
-
-		Process[] baseProcesses = new Process[baseProcList.size()];
-		baseProcList.toArray(baseProcesses);
-
-		final ProcessComponent procComp = (ProcessComponent) child;
-		EClass procType = adapter.getProcessType();
-		procComp.setProcess((Process) UmaFactory.eINSTANCE.create(procType));
-		
-		IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-		List userInputs = new ArrayList();
-		IValidator nameValidator = IValidatorFactory.INSTANCE.createNameValidator(
-				owner, procComp);
-		// name
-		UserInput nameInput = new UserInput(LibraryEditResources.nameLabel_text, UserInput.TEXT,
-				false, null, null, nameValidator, null);
-		userInputs.add(nameInput);
-		
-		// default configuration
-		//
-		UserInput defaultConfigInput = new UserInput(LibraryEditResources.defaultConfigLabel_text, UserInput.SELECTION,
-				false, methodConfigs, new ItemLabelProvider() {
-			public String getText(Object element) {
-				if (element instanceof MethodElement) {
-					return ((MethodElement) element).getName();
-				} else {
-					return element.toString();
-				}
-			}
-		}, new ConfigValidator(), null);
-		userInputs.add(defaultConfigInput);
-		// base process
-		UserInput baseProcInput = null;
-		
-		if(procComp.getProcess() instanceof ProcessPlanningTemplate) {
-			baseProcInput = new UserInput(LibraryEditResources.basedOnProcessesLabel_text, UserInput.SELECTION,
-					true, baseProcList, new AdapterFactoryItemLabelProvider(TngAdapterFactory.INSTANCE
-							.getNavigatorView_ComposedAdapterFactory()),  null);
-			userInputs.add(baseProcInput);
-		}
-		
-		boolean canExecute = false;
-		String msg = NLS.bind(LibraryEditResources.CreateProcessComponentCommand_Message, 
-				TngUtil.getTypeText(procType.getName()).toLowerCase());
-		
-		// request input
-		if (uiHandler.requestInput(LibraryEditResources.newProcessComponentDialog_title, 
-				msg, userInputs)) {
-			String name = (String) nameInput.getInput();
-			procComp.setName(name);
-			process = procComp.getProcess();
-			process.setName(name);
-			process.setPresentationName(name);
-			process.setDefaultContext((MethodConfiguration) defaultConfigInput.getInput());
-			if(baseProcInput != null) {
-				List list = (List) baseProcInput.getInput();
-				if(!list.isEmpty()) {
-					((ProcessPlanningTemplate)procComp).getBasedOnProcesses().addAll(list);
-				}
-			}
-			canExecute = true;
-		}
-
-		if (canExecute) {
-			// create process component need to update the configuration that
-			// has been selected as
-			// default context of its process. Check if the configuration file
-			// is updatable
-			//
-			status = UserInteractionHelper.checkModify(procComp.getProcess()
-					.getDefaultContext(), shell);
-			if (!status.isOK()) {
-				return;
-			}
-			
-			super.execute();
-
-			Command cmd = getCommand();
-			if (cmd instanceof MethodElementAddCommand) {
-				IStatus status = ((MethodElementAddCommand) cmd).getStatus();
-				if (status != null && !status.isOK()) {
-					this.status = status;
-					return;
-				}
-			}
-
-			final MethodConfiguration procCtx = process.getDefaultContext();
-			
-			// need to add the parent packages and plugin into the configuration
-			// as well
-			// New process in new plug-in not automatically visible in
-			// configuration view
-			List pkgs = procCtx.getMethodPackageSelection();
-			for (EObject obj = procComp; obj != null; obj = obj.eContainer()) {
-				if (obj instanceof MethodPackage) {
-					pkgs.add(obj);
-				}
-			}
-			procCtx.getMethodPluginSelection().add(plugin);
-			
-			process.getValidContext().add(procCtx);
-			process.setPresentation(ContentDescriptionFactory
-					.createContentDescription(process));
-
-			Runnable runnable = new Runnable() {
-				public void run() {
-					// save the resource of parent ProcessPackage
-					Resource resource = ((EObject) owner).eResource();
-					if (resource != null) {
-						ILibraryPersister.FailSafeMethodLibraryPersister persister = Services.getDefaultLibraryPersister()
-								.getFailSafePersister();
-						try {
-							// save the resource of newly created
-							// ProcessComponent again after creating process's
-							// presentation
-							persister.save(procComp.eResource());
-
-							persister.save(resource);
-
-							// save the resource of the process's default
-							// context
-							persister.save(procCtx.eResource());
-
-							persister.commit();
-							
-							// create new diagram file
-							//
-							
-						} catch (Exception e) {
-							try {
-								persister.rollback();
-							} catch (Exception ex) {
-								LibraryEditPlugin.INSTANCE.log(ex);
-								LibraryEditPlugin.INSTANCE.log(e);
-							}
-							
-							status = Status.CANCEL_STATUS;
-							throw new MessageException(
-									NLS
-											.bind(
-													LibraryEditResources.saveProcessError_reason,
-													procComp.getName()), e);
-						}
-					}
-				}
-			};
-
-			UserInteractionHelper
-					.runWithProgress(
-							runnable,
-							MessageFormat
-									.format(
-											LibraryEditResources.creatingProcessComponentTask_name,
-											new Object[] { procComp.getName() })); 
-		}
-	}
-
-	public void redo() {
-		super.redo();
-		ProcessComponent procComp = (ProcessComponent) child;
-		MethodConfiguration procCtx = process.getDefaultContext();
-		if (procCtx instanceof MethodConfiguration) {
-			((MethodConfiguration) procCtx).getMethodPackageSelection().add(
-					procComp);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.command.CreateChildCommand#undo()
-	 */
-	public void undo() {
-		MethodConfiguration procCtx = process.getDefaultContext();
-		if (procCtx instanceof MethodConfiguration) {
-			((MethodConfiguration) procCtx).getMethodPackageSelection().remove(
-					child);
-		}
-		super.undo();
-	}
-
-	public IStatus getStatus() {
-		return status;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteRoleDescriptor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteRoleDescriptor.java
deleted file mode 100644
index 8b0c873..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteRoleDescriptor.java
+++ /dev/null
@@ -1,197 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.ReferenceSelection;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-;
-
-/**
- * Delete role descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class DeleteRoleDescriptor extends RemoveUnusedDescriptorsCommand {
-	private Activity activity;
-
-	private RoleDescriptor roleDesc;
-
-	private Collection modifiedResources;
-
-	private List notUsedReferences = new ArrayList();
-
-	private boolean forceRemoveUnusedReferences;
-
-	/**
-	 * 
-	 */
-	public DeleteRoleDescriptor(RoleDescriptor roleDesc) {
-		super();
-
-		this.roleDesc = roleDesc;
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				roleDesc, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(roleDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-
-		this.modifiedResources = new HashSet();
-		if (activity.eResource() != null) {
-			modifiedResources.add(activity.eResource());
-		}
-		if (roleDesc.eResource() != null) {
-			modifiedResources.add(roleDesc.eResource());
-		}
-	}
-
-	public DeleteRoleDescriptor(RoleDescriptor roleDesc,
-			boolean forceRemoveUnusedReferences) {
-		this(roleDesc);
-		this.forceRemoveUnusedReferences = forceRemoveUnusedReferences;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		Set refList = new HashSet();
-
-		// get RoleDescriptor relationships references
-		List assistedTaskDescriptors = AssociationHelper.getAssistedTaskDescriptors(roleDesc);
-		List additionalTaskDescriptors = AssociationHelper.getAdditionalTaskDescriptors(roleDesc);
-		List primaryTaskDescriptors = AssociationHelper.getPrimaryTaskDescriptors(roleDesc);
-		refList.addAll(assistedTaskDescriptors);
-		refList.addAll(additionalTaskDescriptors);
-		refList.addAll(primaryTaskDescriptors);
-		refList.addAll(roleDesc.getResponsibleFor());
-
-		for (Iterator itor = refList.iterator(); itor.hasNext();) {
-			Object object = itor.next();
-
-			if (object instanceof Descriptor) {
-				if (!ProcessUtil.checkDescriptorReferences(roleDesc,
-						(Descriptor) object)) {
-					if (activity.getBreakdownElements().contains(object)) // check
-																			// for
-																			// local
-																			// descriptor
-						notUsedReferences.add(object);
-				}
-			}
-		}
-
-		if (!(notUsedReferences.isEmpty())) {
-			try {
-				Object[] refToBeDeleted = forceRemoveUnusedReferences ? notUsedReferences
-						.toArray()
-						: ReferenceSelection.getReferences(notUsedReferences,
-								roleDesc);
-						
-						delete(refToBeDeleted);
-			}
-			catch(OperationCanceledException e) {
-				aborted = true;
-			}
-		}
-
-		// clear relationships
-//		clear(roleDesc.getAssistsIn());
-		for (Iterator iter = assistedTaskDescriptors.iterator(); iter.hasNext();) {
-			TaskDescriptor td = (TaskDescriptor) iter.next();
-			td.getAssistedBy().remove(roleDesc);
-		}
-//		clear(roleDesc.getPerformsAdditionally());
-		for (Iterator iter = additionalTaskDescriptors.iterator(); iter.hasNext();) {
-			TaskDescriptor td = (TaskDescriptor) iter.next();
-			td.getAdditionallyPerformedBy().remove(roleDesc);
-		}
-//		clear(roleDesc.getPerformsAsOwner());
-		for (Iterator iter = primaryTaskDescriptors.iterator(); iter.hasNext();) {
-			TaskDescriptor td = (TaskDescriptor) iter.next();
-			td.setPerformedPrimarilyBy(null);
-		}
-		clear(roleDesc.getResponsibleFor());
-
-		// if role is part of any team, please remove it from team as well
-		List teams = AssociationHelper.getTeamProfiles(roleDesc);
-		for (Iterator itor = teams.iterator(); itor.hasNext();) {
-			TeamProfile team = (TeamProfile) itor.next();
-			team.getTeamRoles().remove(roleDesc);
-
-			// find matching roleDescriptor in team roles
-			Object teamRoleDesc = ProcessUtil
-					.findRoleDescriptor(team, roleDesc);
-			team.getTeamRoles().remove(teamRoleDesc);
-		}
-
-		redo();
-	}
-
-	private void clear(List list) {
-		try {
-			if ((list != null) && (list.size() > 0)) {
-
-				list.clear();
-			}
-		} catch (Exception ex) {
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-	}
-
-	public void undo() {
-
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteTaskDescriptor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteTaskDescriptor.java
deleted file mode 100644
index 803ce57..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteTaskDescriptor.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.ReferenceSelection;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-
-
-/**
- * Delete Task descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class DeleteTaskDescriptor extends RemoveUnusedDescriptorsCommand {
-	private Activity activity;
-
-	private TaskDescriptor taskDesc;
-
-	private Collection modifiedResources;
-
-	private List notUsedReferences = new ArrayList();
-
-	private boolean forceRemoveUnusedReferences;
-
-	/**
-	 * 
-	 */
-	public DeleteTaskDescriptor(TaskDescriptor taskDesc) {
-		super();
-
-		this.taskDesc = taskDesc;
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				taskDesc, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(taskDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-
-		this.modifiedResources = new HashSet();
-		if (activity.eResource() != null) {
-			modifiedResources.add(activity.eResource());
-		}
-		if (taskDesc.eResource() != null) {
-			modifiedResources.add(taskDesc.eResource());
-		}
-	}
-
-	public DeleteTaskDescriptor(TaskDescriptor taskDesc,
-			boolean forceRemoveUnusedReferences) {
-		this(taskDesc);
-		this.forceRemoveUnusedReferences = forceRemoveUnusedReferences;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		Set refList = new HashSet();
-
-		// get TaskDescriptor relationships references
-		refList.addAll(taskDesc.getAdditionallyPerformedBy());
-		refList.addAll(taskDesc.getAssistedBy());
-		refList.add(taskDesc.getPerformedPrimarilyBy());
-		refList.addAll(taskDesc.getMandatoryInput());
-		refList.addAll(taskDesc.getExternalInput());
-		refList.addAll(taskDesc.getOptionalInput());
-		refList.addAll(taskDesc.getOutput());
-
-		for (Iterator itor = refList.iterator(); itor.hasNext();) {
-			Object object = itor.next();
-
-			// check all it's references
-			if (object instanceof Descriptor) {
-				if (!ProcessUtil.checkDescriptorReferences(taskDesc,
-						(Descriptor) object)) {
-					if (activity.getBreakdownElements().contains(object)) // check
-																			// for
-																			// local
-																			// descriptor
-						notUsedReferences.add(object);
-				}
-			}
-		}
-
-		if (!(notUsedReferences.isEmpty())) {
-			try {
-				Object[] refToBeDeleted = forceRemoveUnusedReferences ? notUsedReferences
-						.toArray()
-						: ReferenceSelection.getReferences(notUsedReferences,
-								taskDesc);
-						
-						delete(refToBeDeleted);
-			}
-			catch(OperationCanceledException e) {
-				aborted = true;
-			}
-		}
-
-		// clear out all taskdescriptor relationship
-		clear(taskDesc.getAdditionallyPerformedBy());
-		clear(taskDesc.getAssistedBy());
-		clear(taskDesc.getMandatoryInput());
-		clear(taskDesc.getExternalInput());
-		clear(taskDesc.getOptionalInput());
-		clear(taskDesc.getOutput());
-
-		taskDesc.setPerformedPrimarilyBy(null);
-
-		redo();
-	}
-
-	private void clear(List list) {
-		try {
-			if ((list != null) && (list.size() > 0)) {
-				list.clear();
-			}
-		} catch (Exception ex) {
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-	}
-
-	public void undo() {
-
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteTeamProfile.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteTeamProfile.java
deleted file mode 100644
index 4738a16..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteTeamProfile.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.TeamProfile;
-
-
-/**
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class DeleteTeamProfile extends AbstractCommand implements
-		IResourceAwareCommand {
-	private Activity activity;
-
-	private TeamProfile team;
-
-	private Collection modifiedResources;
-
-	/**
-	 * 
-	 */
-	public DeleteTeamProfile(TeamProfile team) {
-		super();
-
-		this.team = team;
-
-		Object parent = getParentActivity(team);
-
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-
-		this.modifiedResources = new HashSet();
-		if (activity.eResource() != null) {
-			modifiedResources.add(activity.eResource());
-		}
-		if (team.eResource() != null) {
-			modifiedResources.add(team.eResource());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		// get all subteam recursively
-		List teamList = new ArrayList();
-		getSubTeams(team, teamList);
-
-		teamList.add(team);
-
-		for (int i = 0; i < teamList.size(); i++) {
-			TeamProfile tt = (TeamProfile) teamList.get(i);
-			// clear team's roledescriptor
-			tt.getTeamRoles().clear();
-		}
-
-		redo();
-	}
-
-	private void getSubTeams(TeamProfile team, List teamList) {
-		List list = team.getSubTeam();
-		if (list != null) {
-			for (Iterator itor = list.iterator(); itor.hasNext();) {
-				TeamProfile tt = (TeamProfile) itor.next();
-				teamList.add(tt);
-				getSubTeams(tt, teamList);
-			}
-		}
-	}
-
-	/**
-	 * Get parent activity for breakdownelement
-	 * 
-	 * @param brElement
-	 * @return
-	 */
-	private Object getParentActivity(BreakdownElement brElement) {
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(brElement, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(brElement);
-		while (!(parent instanceof Activity)) {
-			brElement = (BreakdownElement) parent;
-			adapter = (ItemProviderAdapter) adapterFactory.adapt(brElement,
-					ITreeItemContentProvider.class);
-			parent = adapter.getParent(brElement);
-		}
-
-		return parent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-	}
-
-	public void undo() {
-
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteUnusedDescriptorsCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteUnusedDescriptorsCommand.java
deleted file mode 100644
index 163971d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteUnusedDescriptorsCommand.java
+++ /dev/null
@@ -1,160 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IInteractive;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.eclipse.epf.library.edit.util.AdapterFactoryItemLabelProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command for clean-up unused descriptors
- * 
- * @author Phong Nguyen Le
- */
-public abstract class DeleteUnusedDescriptorsCommand extends CompoundCommand 
-implements IInteractive
-{
-	private Collection elements;
-	private List descriptorsToDelete;
-	private boolean includeChildren;
-	private Collection deletedDescriptors;
-	private IUserInteractionHandler userInteractionHandler;
-
-	/**
-	 * @param elements list of elements to check for unused descriptors to delete 
-	 * @param includeChildren if <code>true</code> will check the offstring of activities in the given elements
-	 */
-	public DeleteUnusedDescriptorsCommand(Collection elements, boolean includeChildren, Collection deletedDescriptors) {
-		super();
-		this.elements = elements;
-		this.includeChildren = includeChildren;
-		this.deletedDescriptors = deletedDescriptors;
-	}
-	
-	/**
-	 * Deletes the specified elements. Subclasss must implement this method
-	 * 
-	 * @param elements
-	 * @return the executed command that deleted the given elements
-	 */
-	protected abstract Command delete(List elements);
-	
-	public void execute() {
-		// find all role and work product descriptors that are not used
-		// in any relationship
-		// and delete them
-		//
-		if (descriptorsToDelete == null) {
-			descriptorsToDelete = new ArrayList();
-			Iterator iter;
-			if(includeChildren) {
-				iter = new AbstractTreeIterator(elements, false) {
-					
-					
-					/**
-					 * Comment for <code>serialVersionUID</code>
-					 */
-					private static final long serialVersionUID = 4718889409403141707L;
-					
-					protected Iterator getChildren(Object object) {
-						if (object == elements) {
-							return elements.iterator();
-						} else if (object instanceof Activity) {
-							return ((Activity) object)
-							.getBreakdownElements().iterator();
-						} else {
-							return Collections.EMPTY_LIST.iterator();
-						}
-					}
-					
-				};
-			}
-			else {
-				iter = elements.iterator();
-			}
-			ArrayList currentDescriptorsToDelete = new ArrayList();
-			if(deletedDescriptors != null) {
-				// add deleted descriptors to the list before checking for unused descriptors
-				// those deleted descriptors will be removed from the list after the check
-				//
-				currentDescriptorsToDelete.addAll(deletedDescriptors);
-			}
-			for (; iter.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof RoleDescriptor || element instanceof WorkProductDescriptor) {
-						if (!ProcessUtil.checkDescriptorReferences(
-							currentDescriptorsToDelete, (Descriptor) element)) {
-						currentDescriptorsToDelete.add(element);
-					}
-				}
-			}
-			currentDescriptorsToDelete.removeAll(deletedDescriptors);
-			if (!currentDescriptorsToDelete.isEmpty()) {
-				selectDescriptorsToDelete(currentDescriptorsToDelete);
-				if(!currentDescriptorsToDelete.isEmpty()) {
-					Command cmd = delete(currentDescriptorsToDelete);
-					if (cmd != null) {
-						commandList.add(cmd);
-						descriptorsToDelete.addAll(currentDescriptorsToDelete);
-					}
-				}
-			}
-		}
-		else {
-			if(!descriptorsToDelete.isEmpty()) {
-				commandList.clear();
-				append(delete(descriptorsToDelete));
-			}
-		}
-	}
-	
-	private void selectDescriptorsToDelete(List descriptorsToDelete) {
-		if(userInteractionHandler != null) {
-			IItemLabelProvider labelProvider = new AdapterFactoryItemLabelProvider(
-					TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory());
-			String title = LibraryEditResources.ui_references;
-			String msg = LibraryEditResources.selectDescriptorsToDelete_msg;			
-			List list = new ArrayList(descriptorsToDelete);
-			Collection selected = userInteractionHandler.select(list, labelProvider, true, list, title, msg);
-			if(selected == null) {
-				throw new OperationCanceledException();
-			}
-			descriptorsToDelete.retainAll(selected);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.IInteractive#setUserInteractionHandler(org.eclipse.epf.library.edit.command.IUserInteractionHandler)
-	 */
-	public void setUserInteractionHandler(IUserInteractionHandler handler) {
-		userInteractionHandler = handler;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteWorkProductDescriptor.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteWorkProductDescriptor.java
deleted file mode 100644
index 9a32a31..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DeleteWorkProductDescriptor.java
+++ /dev/null
@@ -1,254 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.ui.ReferenceSelection;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * Delete work product descriptor
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- * 
- */
-public class DeleteWorkProductDescriptor extends RemoveUnusedDescriptorsCommand {
-	private Activity activity;
-
-	private WorkProductDescriptor wpDesc;
-
-	private Collection modifiedResources;
-
-	private List notUsedReferences = new ArrayList();
-
-	private boolean forceRemoveUnusedReferences;
-
-	/**
-	 * 
-	 */
-	public DeleteWorkProductDescriptor(WorkProductDescriptor wpDesc) {
-		super();
-
-		this.wpDesc = wpDesc;
-
-		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
-				wpDesc, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(wpDesc);
-		if (parent instanceof Activity) {
-			this.activity = (Activity) parent;
-		}
-
-		this.modifiedResources = new HashSet();
-		if (activity.eResource() != null) {
-			modifiedResources.add(activity.eResource());
-		}
-		if (wpDesc.eResource() != null) {
-			modifiedResources.add(wpDesc.eResource());
-		}
-	}
-
-	public DeleteWorkProductDescriptor(WorkProductDescriptor wpDesc,
-			boolean forceRemoveUnusedReferences) {
-		this(wpDesc);
-		this.forceRemoveUnusedReferences = forceRemoveUnusedReferences;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		Set refList = new HashSet();
-
-		List mandatoryInputTo = AssociationHelper.getMandatoryInputTo(wpDesc);
-		List externalInputTo = AssociationHelper.getExternalInputTo(wpDesc);
-		List optionalInputTo = AssociationHelper.getOptionalInputTo(wpDesc);
-		List outputFrom = AssociationHelper.getOutputFrom(wpDesc);
-		List responsibleRoleDescList = AssociationHelper.getResponsibleRoleDescriptors(wpDesc);
-		// get WorkProductDescriptor relationships references
-		refList.addAll(wpDesc.getImpactedBy());
-		refList.addAll(wpDesc.getImpacts());
-		refList.addAll(mandatoryInputTo);
-		refList.addAll(externalInputTo);
-		refList.addAll(optionalInputTo);
-		refList.addAll(outputFrom);
-		refList.add(responsibleRoleDescList);
-
-		for (Iterator itor = refList.iterator(); itor.hasNext();) {
-			Object object = itor.next();
-
-			if (object instanceof Descriptor) {
-				if (!ProcessUtil.checkDescriptorReferences(wpDesc,
-						(Descriptor) object)) {
-					if (activity.getBreakdownElements().contains(object)) // check
-																			// for
-																			// local
-																			// descriptor
-						notUsedReferences.add(object);
-				}
-			}
-		}
-
-		if (!(notUsedReferences.isEmpty())) {
-			try {
-				Object[] refToBeDeleted = forceRemoveUnusedReferences ? notUsedReferences
-						.toArray()
-						: ReferenceSelection.getReferences(notUsedReferences,
-								wpDesc);
-						delete(refToBeDeleted);
-			}
-			catch(OperationCanceledException e) {
-				aborted = true;
-			}
-		}
-
-		// check whether wpdesc artifact has any sub-artifacts
-		List children = new ArrayList();
-		if (wpDesc.getWorkProduct() instanceof Artifact) {
-			Artifact artifact = (Artifact) wpDesc.getWorkProduct();
-			List list = artifact.getContainedArtifacts();
-			for (int i = 0; i < list.size(); i++) {
-				Object descriptor = getDescriptor(wpDesc, (Artifact) list
-						.get(i));
-				if (descriptor != null) {
-					children.add(descriptor);
-				}
-			}
-		}
-
-		List objectsToCleared = new ArrayList();
-		objectsToCleared.add(wpDesc);
-		objectsToCleared.addAll(children);
-
-		for (Iterator itor = objectsToCleared.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if (obj instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpDescObj = (WorkProductDescriptor) obj;
-
-				// wpDescObj.getImpactedBy().clear();
-				// wpDescObj.getImpacts().clear();
-				// wpDescObj.getMandatoryInputTo().clear();
-				// wpDescObj.getExternalInputTo().clear();
-				// wpDescObj.getOptionalInputTo().clear();
-				// wpDescObj.getOutputFrom().clear();
-				// wpDescObj.getWorkedOnBy().clear();
-				clear(wpDescObj.getImpactedBy());
-				clear(wpDescObj.getImpacts());
-//				clear(wpDescObj.getExternalInputTo());
-				for (Iterator iter = externalInputTo.iterator(); iter
-						.hasNext();) {
-					TaskDescriptor td = (TaskDescriptor) iter.next();
-					td.getExternalInput().remove(wpDescObj);
-				}
-//				clear(wpDescObj.getMandatoryInputTo());
-				for (Iterator iter = mandatoryInputTo.iterator(); iter
-						.hasNext();) {
-					TaskDescriptor td = (TaskDescriptor) iter.next();
-					td.getMandatoryInput().remove(wpDescObj);
-				}
-//				clear(wpDescObj.getOptionalInputTo());
-				for (Iterator iter = optionalInputTo.iterator(); iter
-						.hasNext();) {
-					TaskDescriptor td = (TaskDescriptor) iter.next();
-					td.getOptionalInput().remove(wpDescObj);
-				}
-//				clear(wpDescObj.getOutputFrom());
-				for (Iterator iter = outputFrom.iterator(); iter
-						.hasNext();) {
-					TaskDescriptor td = (TaskDescriptor) iter.next();
-					td.getOutput().remove(wpDescObj);
-				}
-				for (Iterator iter = responsibleRoleDescList.iterator(); iter
-						.hasNext();) {
-					RoleDescriptor roleDesc = (RoleDescriptor) iter.next();
-					roleDesc.getResponsibleFor().remove(wpDescObj);
-				}
-			}
-		}
-
-		// this.activity.getBreakdownElements().remove(wpDesc);
-
-		redo();
-	}
-
-	private void clear(List list) {
-		try {
-			if ((list != null) && (list.size() > 0))
-				list.clear();
-		} catch (Exception ex) {
-			LibraryEditPlugin.INSTANCE.log(ex);
-		}
-	}
-
-	private Object getDescriptor(Object parentDescriptor, Artifact artifact) {
-		// Activity activity = getActivity(parentDescriptor);
-		if (activity == null)
-			return null;
-		List list = activity.getBreakdownElements();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			Object obj = list.get(i);
-			if ((obj instanceof WorkProductDescriptor)
-					&& (artifact == ((WorkProductDescriptor) obj)
-							.getWorkProduct())) {
-				return obj;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-
-	}
-
-	public void undo() {
-
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DescriptorSynchronizeCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DescriptorSynchronizeCommand.java
deleted file mode 100644
index b85094a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DescriptorSynchronizeCommand.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-
-/**
- * Command to synchronize descriptor's attributes and own references
- * 
- * @author Phong Nguyen Le - Feb 1, 2006
- * @since  1.0
- */
-public class DescriptorSynchronizeCommand extends AbstractCommand {
-
-	/**
-	 * 
-	 */
-	public DescriptorSynchronizeCommand() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param label
-	 */
-	public DescriptorSynchronizeCommand(String label) {
-		super(label);
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param label
-	 * @param description
-	 */
-	public DescriptorSynchronizeCommand(String label, String description) {
-		super(label, description);
-		// TODO Auto-generated constructor stub
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DescriptorUpdateBatchCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DescriptorUpdateBatchCommand.java
deleted file mode 100644
index d84ecc3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/DescriptorUpdateBatchCommand.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.epf.library.edit.command.BatchCommand;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-
-/**
- * @author Phong Nguyen Le - Feb 9, 2006
- * @since  1.0
- */
-public class DescriptorUpdateBatchCommand extends BatchCommand {
-	private Set descriptorsToRefresh;
-	private CompoundCommand refreshDescriptorsCommand;
-	private Set synchFeatures;
-	private MethodConfiguration config;
-	
-	/**
-	 * @param clear
-	 */
-	public DescriptorUpdateBatchCommand(boolean clear, Set synchFeatures, MethodConfiguration config) {
-		super(clear);
-		this.synchFeatures = synchFeatures;
-		this.config = config;
-	}
-
-	public Set getDescriptorsToRefresh() {
-		if(descriptorsToRefresh == null) {
-			descriptorsToRefresh = new HashSet();
-		}
-		return descriptorsToRefresh;
-	}
-	
-	void setDescriptorsToRefresh(Set descriptorsToRefresh) {
-		this.descriptorsToRefresh = descriptorsToRefresh;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.BatchCommand#dispose()
-	 */
-	public void dispose() {
-		if(descriptorsToRefresh != null) {
-			descriptorsToRefresh.clear();
-			descriptorsToRefresh = null;
-		}
-		
-		if(refreshDescriptorsCommand != null) {
-			refreshDescriptorsCommand.dispose();
-		}
-		
-		super.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.BatchCommand#canExecute()
-	 */
-	public boolean canExecute() {
-		return super.canExecute() || (descriptorsToRefresh != null && !descriptorsToRefresh.isEmpty());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.BatchCommand#execute()
-	 */
-	public void execute() {
-		super.execute();
-		
-		// create refreshDescriptorsCommand
-		//
-		if(descriptorsToRefresh != null && !descriptorsToRefresh.isEmpty()
-				&& refreshDescriptorsCommand == null) {
-			refreshDescriptorsCommand = new CompoundCommand();
-			for (Iterator iter = descriptorsToRefresh.iterator(); iter.hasNext();) {
-				Descriptor desc = (Descriptor) iter.next();
-				refreshDescriptorsCommand.append(new BasicSynchronizeDescriptorCommand(desc, synchFeatures, config));				
-			}
-		}
-
-		// refresh descriptors
-		//
-		if(refreshDescriptorsCommand != null) {
-			refreshDescriptorsCommand.execute();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.BatchCommand#undo()
-	 */
-	public void undo() {
-		if(refreshDescriptorsCommand != null) {
-			refreshDescriptorsCommand.undo();
-		}
-		
-		super.undo();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/GenericDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/GenericDropCommand.java
deleted file mode 100644
index 81698f0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/GenericDropCommand.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-
-/**
- * Drop command to drop any object on a target that supports adapting drop
- * object to its own object.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class GenericDropCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private Collection dropElements;
-
-	private ArrayList featureElements;
-
-	private Collection modifiedResources;
-
-	private EObject target;
-
-	private EStructuralFeature feature;
-
-	private ElementAdapter dropAdapter;
-
-	public GenericDropCommand(EObject target, EStructuralFeature feature,
-			Collection dropElements, ElementAdapter dropAdapter) {
-		this.target = target;
-		this.feature = feature;
-		this.dropElements = dropElements;
-		this.dropAdapter = dropAdapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		if (modifiedResources == null) {
-			modifiedResources = new HashSet();
-		}
-		return modifiedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		// compile the featureElements list
-		//
-		featureElements = new ArrayList();
-		for (Iterator iter = dropElements.iterator(); iter.hasNext();) {
-			Object element = TngUtil.unwrap(iter.next());
-			element = dropAdapter.adapt(element);
-			if (element != null) {
-				featureElements.add(element);
-			}
-			// if(element instanceof Role) {
-			// if(createDescriptor) {
-			// featureElements.add(ProcessUtil.createRoleDescriptor((Role)
-			// element));
-			// }
-			// else {
-			// featureElements.add(element);
-			// }
-			// }
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		if (!featureElements.isEmpty()) {
-			((List) target.eGet(feature)).addAll(featureElements);
-			if (target.eResource() != null) {
-				getModifiedResources().add(target.eResource());
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		((List) target.eGet(feature)).removeAll(featureElements);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		return featureElements;
-	}
-
-	public static interface ElementAdapter {
-		/**
-		 * Adapts the drop element to the right element for the drop target.
-		 * 
-		 * @param dropElement
-		 * @return
-		 */
-		Object adapt(Object dropElement);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/IActionTypeConstants.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/IActionTypeConstants.java
deleted file mode 100644
index de58a1c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/IActionTypeConstants.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-public class IActionTypeConstants {
-
-	public static final int ADD_PRIMARY_PERFORMER = 0;
-
-	public static final int ADD_ADDITIONAL_PERFORMER = 1;
-
-	public static final int ADD_ASSISTED_BY = 2;
-
-	public static final int ADD_EXTERNAL_INPUT = 3;
-
-	public static final int ADD_MANDATORY_INPUT = 4;
-
-	public static final int ADD_OPTIONAL_INPUT = 5;
-
-	public static final int ADD_OUTPUT = 6;
-
-	public static final int ADD_RESPONSIBLE_FOR = 7;
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LinkMethodElementCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LinkMethodElementCommand.java
deleted file mode 100644
index f444de0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LinkMethodElementCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command for linking method element to descriptor
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-
-public class LinkMethodElementCommand extends AddMethodElementCommand {
-
-	private Descriptor desc;
-
-	private Object obj;
-
-	private List objects;
-
-	private int featureID;
-
-	private Collection modifiedResources;
-
-	/**
-	 * Assign role to task descriptor Used for both additionally performed by
-	 * and assisted by
-	 */
-	public LinkMethodElementCommand(Descriptor desc, Object obj, int featureID) {
-
-		super(TngUtil.getOwningProcess(desc));
-
-		this.desc = desc;
-		this.obj = obj;
-		this.featureID = featureID;
-
-		if (obj != null) {
-			objects = new ArrayList();
-			objects.add(obj);
-		}
-		this.modifiedResources = new HashSet();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-
-		if (desc == null)
-			return;
-
-		// add to default configuration if not there already
-		if (!super.addToDefaultConfiguration(objects))
-			return;
-
-		if (!objects.isEmpty())
-			redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTOR__TASK:
-			((TaskDescriptor) desc).setTask((Task) obj);
-			break;
-		case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-			((RoleDescriptor) desc).setRole((Role) obj);
-			break;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-			((WorkProductDescriptor) desc).setWorkProduct((WorkProduct) obj);
-			break;
-		}
-	}
-
-	public void undo() {
-		if (!objects.isEmpty()) {
-			// basically remove from configuration if anything was added
-			super.undo();
-
-			switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__TASK:
-				((TaskDescriptor) desc).setTask(null);
-				break;
-			case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-				((RoleDescriptor) desc).setRole(null);
-				break;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-				((WorkProductDescriptor) desc).setWorkProduct(null);
-				break;
-			}
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		if (desc.eResource() != null && !objects.isEmpty()) {
-			modifiedResources.add(desc.eResource());
-		}
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LocallyReplaceAndDeepCopyCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LocallyReplaceAndDeepCopyCommand.java
deleted file mode 100644
index aae0e18..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LocallyReplaceAndDeepCopyCommand.java
+++ /dev/null
@@ -1,122 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ActivityHandler;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * @author Phong Nguyen Le - Jul 6, 2006
- * @since  1.0
- */
-public class LocallyReplaceAndDeepCopyCommand extends ReplaceActivityCommand {
-
-	/**
-	 * @param wrapper
-	 */
-	public LocallyReplaceAndDeepCopyCommand(BreakdownElementWrapperItemProvider wrapper) {
-		super(wrapper);		
-		setLabel(LibraryEditResources.localReplacementAndDeepCopy_text);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.command.ReplaceActivityCommand#doVary()
-	 */
-	protected void doVary() {
-		// deep copy the activity
-		//
-		Activity activity = (Activity) TngUtil.unwrap(wrapper);
-		if(!UserInteractionHelper.confirmDeepCopy(Collections.singletonList(activity))) {
-			return;
-		}		
-		Process targetProcess = (Process) wrapper.getTopItem();
-		MethodConfiguration deepCopyConfig = null;
-		try {
-			deepCopyConfig = UserInteractionHelper.chooseDeepCopyConfiguration(targetProcess, wrapper.getAdapterFactory());
-		}
-		catch(OperationCanceledException e) {
-			return;
-		}
-		ActivityHandler activityHandler = new ActivityHandler();
-		activityHandler.setDeepCopyConfig(deepCopyConfig);
-		activityHandler.setTargetProcess(targetProcess);
-		activityHandler.deepCopy(activity);
-		Activity copy = (Activity) activityHandler.getActivities().get(0);
-		
-		super.doVary();
-		
-		// replace the local replacement with deep copy
-		//
-		int pos = createdActivities.size() - 1;
-		Activity localReplacement = (Activity) createdActivities.get(pos);		
-		for (Iterator iter = localReplacement.getOppositeFeatures().iterator(); iter.hasNext();) {
-			OppositeFeature oppositeFeature = (OppositeFeature) iter.next();
-			Object value = localReplacement.getOppositeFeatureValue(oppositeFeature);
-			if(value != null) {
-				EStructuralFeature feature = oppositeFeature.getTargetFeature();
-				if(oppositeFeature.isMany()) {
-					for (Iterator iterator = new ArrayList(((Collection)value)).iterator(); iterator
-					.hasNext();) {		
-						EObject o = (EObject) iterator.next();
-						if(feature.isMany()) {
-							List list = (List) o.eGet(feature);
-							list.remove(localReplacement);
-							list.add(copy);
-						}
-						else {
-							o.eSet(feature, copy);
-						}
-					}
-				}
-				else {
-					EObject o = (EObject) value;
-					if(feature.isMany()) {
-						List list = (List) o.eGet(feature);
-						list.remove(localReplacement);
-						list.add(copy);
-					}
-					else {
-						o.eSet(feature, copy);
-					}
-				}
-			}
-		}
-		createdActivities.set(pos, copy);
-		copy.setVariabilityBasedOnElement(localReplacement.getVariabilityBasedOnElement());
-		copy.setVariabilityType(localReplacement.getVariabilityType());
-		copy.setPresentedAfter(localReplacement.getPresentedAfter());
-		copy.setPresentedBefore(localReplacement.getPresentedBefore());
-		Activity superAct = localReplacement.getSuperActivities();
-		int id = superAct.getBreakdownElements().indexOf(localReplacement);
-		superAct.getBreakdownElements().set(id, copy);
-		
-		// add copy package to the package of super activity
-		//
-		((ProcessPackage)superAct.eContainer()).getChildPackages().add(copy.eContainer());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/MoveDownCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/MoveDownCommand.java
deleted file mode 100644
index 448d2a7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/MoveDownCommand.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-
-
-/**
- * Command to move down element in breakdown structure
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class MoveDownCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-	private Activity activity;
-
-	private Collection modifiedResources;
-
-	private int elementLocation = 0;
-
-	private int transferLocation = 0;
-
-	private Object elementObj;
-
-	private Collection eClasses;
-	
-	private boolean adjacent = false;
-
-	/**
-	 * 
-	 */
-	public MoveDownCommand(Activity activity, Object elementObj,
-			Collection eClasses) {
-		super();
-		this.activity = activity;
-		this.elementObj = elementObj;
-		this.eClasses = eClasses;
-
-		this.modifiedResources = new HashSet();
-		if (activity.eResource() != null) {
-			modifiedResources.add(activity.eResource());
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		List allElements = activity.getBreakdownElements();
-
-		for (int i = 0; i < allElements.size(); i++) {
-			Object obj = allElements.get(i);
-			if (obj.equals(elementObj)) {
-				elementLocation = i;
-				break;
-			}
-		}
-
-		for (int i = elementLocation + 1; i <= allElements.size(); i++) {
-			Object obj = allElements.get(i);
-			if (TngUtil.isEClassInstanceOf(eClasses, obj)) {
-				transferLocation = i;
-				break;
-			}
-		}
-
-		BreakdownElement next =  (BreakdownElement) allElements.get(transferLocation);
-		BreakdownElement e = (BreakdownElement) elementObj;
-		if(e.getPresentedAfter() == next) {
-			adjacent = true;
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		if(adjacent) {
-			// swap "prensented-after" element
-			//
-			BreakdownElement next =  (BreakdownElement) activity.getBreakdownElements().get(transferLocation);
-			BreakdownElement e = (BreakdownElement) elementObj;
-			e.setPresentedAfter(next.getPresentedAfter());
-			next.setPresentedAfter(e);
-		}
-		((EList) activity.getBreakdownElements()).move(transferLocation,
-				elementLocation);
-	}
-
-	public void undo() {
-		((EList) activity.getBreakdownElements()).move(elementLocation,
-				transferLocation);
-		if(adjacent) {
-			// restore "prensented-after" element
-			//
-			BreakdownElement next =  (BreakdownElement) activity.getBreakdownElements().get(transferLocation);
-			BreakdownElement e = (BreakdownElement) elementObj;
-			next.setPresentedAfter(e.getPresentedAfter());
-			e.setPresentedAfter(next);
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/MoveUpCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/MoveUpCommand.java
deleted file mode 100644
index 9529dd6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/MoveUpCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-
-
-/**
- * Command to move up the element in breakdown structure
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class MoveUpCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-	private Activity activity;
-
-	private Collection modifiedResources;
-
-	private int elementLocation = 0;
-
-	private int transferLocation = 0;
-
-	private Object elementObj;
-
-	private Collection eClasses;
-	
-	private boolean adjacent = false;
-
-	/**
-	 * 
-	 */
-	public MoveUpCommand(Activity activity, Object elementObj,
-			Collection eClasses) {
-		super();
-		this.activity = activity;
-		this.elementObj = elementObj;
-		this.eClasses = eClasses;
-
-		this.modifiedResources = new HashSet();
-		if (activity.eResource() != null) {
-			modifiedResources.add(activity.eResource());
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		List allElements = activity.getBreakdownElements();
-
-		for (int i = 0; i < allElements.size(); i++) {
-			Object obj = allElements.get(i);
-			if (obj.equals(elementObj)) {
-				elementLocation = i;
-				break;
-			}
-		}
-		for (int i = elementLocation - 1; i >= 0; i--) {
-			Object obj = allElements.get(i);
-			if (TngUtil.isEClassInstanceOf(eClasses, obj)) {
-				transferLocation = i;
-				break;
-			}
-		}
-		
-		BreakdownElement prev =  (BreakdownElement) allElements.get(transferLocation);		
-		if(prev.getPresentedAfter() == elementObj) {
-			adjacent = true;
-		}
-
-		redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		if(adjacent) {
-			// swap "presented-after" element
-			//
-			BreakdownElement prev =  (BreakdownElement) activity.getBreakdownElements().get(transferLocation);		
-			BreakdownElement e = (BreakdownElement) elementObj;
-			prev.setPresentedAfter(e.getPresentedAfter());
-			e.setPresentedAfter(prev);
-		}
-		((EList) activity.getBreakdownElements()).move(transferLocation,
-				elementLocation);
-	}
-
-	public void undo() {
-		((EList) activity.getBreakdownElements()).move(elementLocation,
-				transferLocation);
-		if(adjacent) {
-			// restore "presented-after" element
-			//
-			BreakdownElement prev =  (BreakdownElement) activity.getBreakdownElements().get(transferLocation);		
-			BreakdownElement e = (BreakdownElement) elementObj;
-			e.setPresentedAfter(prev.getPresentedAfter());
-			prev.setPresentedAfter(e);
-		}
-	}
-
-	protected boolean prepare() {
-		return true;
-	}
-
-	public Collection getModifiedResources() {
-		return modifiedResources;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/OBSDragAndDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/OBSDragAndDropCommand.java
deleted file mode 100644
index 0f9116c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/OBSDragAndDropCommand.java
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * Drag and drop command for dragging role into Team Allocation
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class OBSDragAndDropCommand extends BSDragAndDropCommand {
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param location
-	 * @param operations
-	 * @param operation
-	 * @param collection
-	 */
-	public OBSDragAndDropCommand(EditingDomain domain, Object owner,
-			float location, int operations, int operation, Collection collection) {
-		super(domain, owner, location, operations, operation, collection);
-	}
-
-	protected boolean accept(Object obj) {
-		if (obj instanceof Role) {
-			if (owner instanceof Activity) {
-				return true;
-//				return ProcessCommandUtil.getValidDescriptor(obj,
-//						(Activity) owner,
-//						((AdapterFactoryEditingDomain) domain)
-//								.getAdapterFactory()) == null;
-			} else if (owner instanceof TeamProfile) {
-				if (ProcessUtil.getAssociatedElementList(
-						((TeamProfile) owner).getTeamRoles()).contains(obj))
-					return false;
-				return true;
-			}
-		}
-		
-		return false;
-	}
-
-	protected Command createDropCommand(Object owner, List dropSrc) {
-		if (owner instanceof Activity) {
-			return new OBSDropCommand((Activity) owner, dropSrc);
-		} else if (owner instanceof TeamProfile) {
-			// return new GenericDropCommand((TeamProfile) owner,
-			// UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(), dropSrc,
-			// getDropAdapter(owner));
-			return new AddRoleToTeamCommand((TeamProfile) owner, dropSrc);
-		} else if (owner instanceof CompositeRole) {
-			return new GenericDropCommand((CompositeRole) owner,
-					UmaPackage.eINSTANCE.getCompositeRole_AggregatedRoles(),
-					dropSrc, getDropAdapter(owner));
-		}
-
-		return UnexecutableCommand.INSTANCE;
-	}
-
-	private GenericDropCommand.ElementAdapter getDropAdapter(Object owner) {
-		AdapterFactory adapterFactory = ((AdapterFactoryEditingDomain) domain)
-				.getAdapterFactory();
-		BreakdownElementItemProvider adapter = (BreakdownElementItemProvider) adapterFactory
-				.adapt(owner, IEditingDomainItemProvider.class);
-		return adapter.createDropAdapter();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/OBSDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/OBSDropCommand.java
deleted file mode 100644
index 280f554..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/OBSDropCommand.java
+++ /dev/null
@@ -1,645 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.INestedCommandProvider;
-import org.eclipse.epf.library.edit.command.NestedCommandExcecutor;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.UniqueNamePNameHandler;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * Command to drap and drop roles to Team Allocation breakdown structure
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class OBSDropCommand extends BSDropCommand {
-	private ArrayList wpDescList;
-
-	private ArrayList roleDescList;
-
-	private Map roleDescTeamProfileMap;
-
-	private Map wpDescToDeliverableParts;
-
-	private HashMap wpdToDeliverableDescriptorMap;
-
-	private HashMap wpdToTaskFeaturesMap; // map of WorkProductDescriptor to
-
-	// map of task ot feature list
-
-	private IConfigurator configrator;
-
-	private boolean newDuplicatesRemoved;
-	
-	public OBSDropCommand(Activity act, List roles) {
-		super(act, roles);
-		for (Iterator iter = dropElements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!(element instanceof Role)) {
-				iter.remove();
-			}
-		}
-	}
-
-	/**
-	 * @param activity
-	 * @param dropElements
-	 * @param config
-	 * @param synchFeatures
-	 */
-	public OBSDropCommand(Activity activity, List dropElements,
-			MethodConfiguration config, Set synchFeatures,
-			IConfigurator configurator) {
-		super(activity, dropElements, config, synchFeatures);
-		this.configrator = configurator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#preExecute()
-	 */
-	protected boolean preExecute() {
-		if (!super.preExecute())
-			return false;
-
-		roleDescList = new ArrayList();
-		taskDescList = new ArrayList();
-		wpDescList = new ArrayList();
-		wpDescToDeliverableParts = new HashMap();
-		wpdToDeliverableDescriptorMap = new HashMap();
-
-		MethodConfiguration config = getMethodConfiguration();
-		Set descriptorsToRefresh = synchronize ? batchCommand
-				.getDescriptorsToRefresh() : null;
-
-		List bes = activity.getBreakdownElements();
-		UniqueNamePNameHandler uniqueNamesHandler = new UniqueNamePNameHandler(bes, bes);
-				
-		int size = dropElements.size();
-		for (int i = 0; i < size; i++) {
-			Role role = (Role) dropElements.get(i);
-			if (TngUtil.isContributor(role)) {
-				role = (Role) TngUtil.getBase(role);
-			}
-
-			// check if the role descriptor of the role exists under this
-			// activity
-			RoleDescriptor roleDesc = null;
-			if (synchronize) {
-				roleDesc = (RoleDescriptor) ProcessCommandUtil
-					.getDescriptor(role, activity, config);
-			}
-
-			if (roleDesc == null) {
-				// create role descriptor object
-				roleDesc = ProcessUtil.createRoleDescriptor(role);
-				uniqueNamesHandler.ensureUnique(roleDesc);
-				roleDescList.add(roleDesc);
-			} else {
-				// need to clear all the refreshable features of the existing
-				// descriptor
-				//
-				if (synchronize
-						&& roleDesc.getIsSynchronizedWithSource()
-								.booleanValue()) {
-					batchCommand.getDescriptorsToRefresh().add(roleDesc);
-				}
-			}
-		}
-
-		// if not a synchronization, get all workproducts which have role as
-		// responsible role for
-		// which work product descriptor needs to be created
-		//
-		if (!synchronize) {
-			for (int i = 0; i < size; i++) {
-				Role role = (Role) dropElements.get(i);
-				List workProducts = ProcessUtil.getWorkProductsForRole(role,
-						config);
-				if ((workProducts != null) && (!(workProducts.isEmpty()))) {
-					HashMap wpToExistingDescriptorMap = new HashMap();
-					List elements = new ArrayList(activity
-							.getBreakdownElements());
-					elements.addAll(wpDescList);
-					for (Iterator iter = workProducts.iterator(); iter
-							.hasNext();) {
-						WorkProduct wp = (WorkProduct) iter.next();						
-						Object wpd = ProcessUtil.getWorkProductDescriptor(wpDescList, wp);
-						if(wpd == null) {
-							wpd = ProcessCommandUtil.getDescriptor(wp, activity, config);
-						}
-						if (wpd != null) {
-							wpToExistingDescriptorMap.put(wp, wpd);
-						}
-					}
-					List selectedWorkProducts = new ArrayList(
-							wpToExistingDescriptorMap.keySet());
-					workProducts.removeAll(selectedWorkProducts);
-					
-					final List finalSelectedWps = new ArrayList();
-					if (!workProducts.isEmpty()) {
-						final List finalWps = new ArrayList();
-						finalWps.addAll(workProducts);
-						final Role finalRole = role;
-						
-						UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-							public void run() {
-								List selected = UserInteractionHelper
-										.selectWorkProducts(finalWps, finalRole);
-								if (selected != null) {
-									finalSelectedWps.addAll(selected);
-								}
-							}
-						}, true);
-					}
-
-					selectedWorkProducts.addAll(finalSelectedWps);
-					if (!selectedWorkProducts.isEmpty()) {
-						HashSet allSelectedTasks = new HashSet();
-
-						for (int j = 0; j < selectedWorkProducts.size(); j++) {
-							WorkProduct wp = (WorkProduct) selectedWorkProducts
-									.get(j);
-
-							if (TngUtil.isContributor(wp)) {
-								wp = (WorkProduct) TngUtil.getBase(wp);
-							}
-							WorkProductDescriptor wpDesc = (WorkProductDescriptor) wpToExistingDescriptorMap.get(wp);
-							if (wpDesc == null) {
-								wpDesc = (WorkProductDescriptor) ProcessCommandUtil
-										.getDescriptor(wp, activity, config);
-							}
-							if (wpDesc == null) {
-								wpDesc = ProcessCommandUtil
-										.createWorkProductDescriptor(wp,
-												config,
-												wpDescToDeliverableParts);
-								wpDescList.add(wpDesc);
-
-								// automatic adding to the existing deliverable
-								// descriptor in the activity's scope if there
-								// is
-								// any
-								// valid one.
-								//
-								WorkProductDescriptor descriptor = UserInteractionHelper
-										.getDeliverable(activity, wp);
-								if (descriptor != null) {
-									wpdToDeliverableDescriptorMap.put(wpDesc,
-											descriptor);
-								}
-
-							} else {
-								if (descriptorsToRefresh != null
-										&& wpDesc.getIsSynchronizedWithSource()
-												.booleanValue()) {
-									descriptorsToRefresh.add(wpDesc);
-								}
-								if (wp instanceof Deliverable
-										&& synchFeatures
-												.contains(UmaPackage.eINSTANCE
-														.getDeliverable_DeliveredWorkProducts())) {
-									ProcessCommandUtil.createDeliverableParts(
-											wpDesc, (Deliverable) wp, config,
-											wpDescToDeliverableParts,
-											descriptorsToRefresh);
-								}
-							}
-
-							// get all possible tasks for this workproduct for
-							// which task descriptor needs to be created
-							List tasks = ProcessUtil.getTasksForWorkProduct(wp,
-									config);
-
-							if ((tasks != null) && (tasks.size() > 0)) {
-								// exclude any task that is already selected or already exists in activity
-								//
-								tasks.removeAll(allSelectedTasks);
-								for (Iterator iter = tasks.iterator(); iter
-										.hasNext();) {
-									Task task = (Task) iter.next();
-									Object td = ProcessUtil.getTaskDescriptor(taskDescList, task); 
-									if(td == null) {
-										td = ProcessCommandUtil.getDescriptor(task, activity, config);
-									}
-									if(td != null) {
-										iter.remove();
-									}
-								}
-
-								if (!tasks.isEmpty()) {
-									final List finalTasks = tasks;
-									final WorkProduct finalWp = wp;
-									final List finalSelected = new ArrayList();
-									List selectedTasks = new ArrayList();
-									// show task selections dialog
-									UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-										public void run() {
-											List selected = UserInteractionHelper
-											.selectTasks(finalTasks, finalWp);
-											finalSelected.addAll(selected);
-										}
-									}, true);
-									selectedTasks.addAll(finalSelected);
-									if ((selectedTasks != null)
-											&& ((!selectedTasks.isEmpty()))) {
-										allSelectedTasks.addAll(selectedTasks);
-									} else {
-										// If no tasks are selected, add
-										// Responsible role to wp
-										ProcessCommandUtil.addResponsibleRoleDescriptors(
-												wpDesc, activity, roleDescList,
-												null, config);
-									}
-								}
-							} else {
-								// If there are no tasks to show, add
-								// Responsible role to wp
-								ProcessCommandUtil.addResponsibleRoleDescriptors(wpDesc,
-										activity, roleDescList, null, config);
-							}
-						}
-
-						// create task descriptors for this workproduct
-						if ((allSelectedTasks != null)
-								&& (!(allSelectedTasks.isEmpty()))) {
-							for (Iterator itor = allSelectedTasks.iterator(); itor
-									.hasNext();) {
-
-								Task task = (Task) itor.next();
-
-								// call this method even the descriptor for the
-								// given task already exists in this activity
-								// to add any additional relationships in case
-								// of
-								// recent change in the default configuration
-								// of the process.
-								PBSDropCommand
-										.addToDescriptorLists(
-												task,
-												activity,
-												taskDescList,
-												roleDescList,
-												wpDescList,
-												wpDescToDeliverableParts,
-												descriptorsToRefresh,
-												batchCommand
-														.getObjectToNewFeatureValuesMap(),
-												config, synchronize, synchFeatures);
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// ensure unique names for wp descriptors
-		for (int i = 0; i < wpDescList.size(); i++) {
-			WorkProductDescriptor wpDesc = (WorkProductDescriptor) wpDescList.get(i);			
-			if (wpDesc != null) {
-				uniqueNamesHandler.ensureUnique(wpDesc);	
-			}
-		}
-		return (!roleDescList.isEmpty() // || !roleAssociationList.isEmpty()
-				|| !taskDescList.isEmpty()
-				|| !wpDescList.isEmpty()
-				|| (wpDescToDeliverableParts != null && !wpDescToDeliverableParts
-						.isEmpty()) || !wpdToDeliverableDescriptorMap.isEmpty())
-				|| (descriptorsToRefresh != null && !descriptorsToRefresh
-						.isEmpty()) || batchCommand.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doExecute()
-	 */
-	protected void doExecute() {
-		removeNewDuplicates();
-
-		// add role descriptors to activity
-		//
-		activity.getBreakdownElements().addAll(roleDescList);
-
-		if (roleDescTeamProfileMap == null) {
-			// prepare for automatic assignment of role descriptor to team
-			// profile
-			//
-			roleDescTeamProfileMap = new HashMap();
-			for (Iterator iter = roleDescList.iterator(); iter.hasNext();) {
-				RoleDescriptor roleDesc = (RoleDescriptor) iter.next();
-				TeamProfile teamProfile = UserInteractionHelper.getTeam(
-						activity, roleDesc.getRole());
-				if (teamProfile != null) {
-					roleDescTeamProfileMap.put(roleDesc, teamProfile);
-				}
-			}
-		}
-
-		// add role descriptors to team profiles
-		//
-		for (Iterator iter = roleDescTeamProfileMap.entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			TeamProfile team = (TeamProfile) entry.getValue();
-			team.getTeamRoles().add(entry.getKey());
-		}
-
-		// automatically add work product descriptor to deliverable part
-		//
-		if (!wpdToDeliverableDescriptorMap.isEmpty()) {
-			for (Iterator iter = wpdToDeliverableDescriptorMap.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				WorkProductDescriptor deliverable = (WorkProductDescriptor) entry
-						.getValue();
-				deliverable.getDeliverableParts().add(entry.getKey());
-			}
-		}
-
-		// add work product descriptors
-		//
-		activity.getBreakdownElements().addAll(wpDescList);
-
-		// add task descriptors
-		//
-		activity.getBreakdownElements().addAll(taskDescList);
-
-		// add deliverable parts to the work product descriptors
-		//
-		if (!wpDescToDeliverableParts.isEmpty()) {
-			for (Iterator iter = wpDescToDeliverableParts.entrySet().iterator(); iter
-					.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) entry
-						.getKey();
-				wpDesc.getDeliverableParts().addAll(
-						(Collection) entry.getValue());
-			}
-		}
-
-		// add new descriptors to activity's package
-		//
-		ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-		if (pkg != null) {
-			pkg.getProcessElements().addAll(taskDescList);
-			pkg.getProcessElements().addAll(roleDescList);
-			pkg.getProcessElements().addAll(wpDescList);
-
-			for (Iterator iter = wpDescToDeliverableParts.values().iterator(); iter
-					.hasNext();) {
-				pkg.getProcessElements().addAll((Collection) iter.next());
-			}
-		}
-
-		// getModifiedResources().add(activity.eResource());
-
-	}
-
-	/**
-	 * Removes new elements that are duplicate b/c they are created by the
-	 * previous WBSDropCommand
-	 */
-	private void removeNewDuplicates() {
-		if (synchronize) {
-			if (!newDuplicatesRemoved) {
-				for (Iterator iter = wpDescList.iterator(); iter.hasNext();) {
-					WorkProductDescriptor wpd = (WorkProductDescriptor) iter
-							.next();
-					Object desc = ProcessCommandUtil.getDescriptor(wpd
-							.getWorkProduct(), activity,
-							getMethodConfiguration());
-					if (desc != null) {
-						iter.remove();
-						if (wpDescToDeliverableParts != null) {
-							wpDescToDeliverableParts.remove(wpd);
-						}
-						if (wpdToTaskFeaturesMap != null) {
-							wpdToTaskFeaturesMap.remove(wpd);
-						}
-						if (wpdToDeliverableDescriptorMap != null) {
-							wpdToDeliverableDescriptorMap.remove(wpd);
-						}
-					}
-				}
-				newDuplicatesRemoved = true;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doUndo()
-	 */
-	protected void doUndo() {
-		// remove role descriptors from activity
-		//
-		activity.getBreakdownElements().removeAll(roleDescList);
-
-		// remove role descriptors from team profiles
-		//
-		for (Iterator iter = roleDescTeamProfileMap.entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			TeamProfile team = (TeamProfile) entry.getValue();
-			team.getTeamRoles().remove(entry.getKey());
-		}
-
-		// remove work product descriptors
-		//
-		activity.getBreakdownElements().removeAll(wpDescList);
-
-		// remove task descriptors
-		//
-		activity.getBreakdownElements().removeAll(taskDescList);
-
-		// // disassociate new work product descriptors with task descriptors
-		// //
-		// if(wpdToTaskFeaturesMap != null) {
-		// for (Iterator iter = wpdToTaskFeaturesMap.entrySet().iterator();
-		// iter.hasNext();) {
-		// Map.Entry entry = (Map.Entry) iter.next();
-		// Map taskFeatures = (Map) entry.getValue();
-		// for (Iterator iterator = taskFeatures.entrySet().iterator(); iterator
-		// .hasNext();) {
-		// Map.Entry ent = (Map.Entry) iterator.next();
-		// TaskDescriptor taskDesc = (TaskDescriptor)
-		// ProcessCommandUtil.getDescriptor(ent.getKey(), activity,
-		// getMethodConfiguration());
-		// for (Iterator iterator1 = ((Collection)ent.getValue()).iterator();
-		// iterator1
-		// .hasNext();) {
-		// EStructuralFeature f = (EStructuralFeature) iterator1.next();
-		// EStructuralFeature descFeature = (EStructuralFeature)
-		// FEATURE_MAP.get(f);
-		// if(descFeature.isMany()) {
-		// ((List)taskDesc.eGet(descFeature)).remove(entry.getKey());
-		// }
-		// else {
-		// taskDesc.eSet(descFeature, null);
-		// }
-		// }
-		// }
-		// }
-		// }
-
-		// remove deliverable parts to the work product descriptors
-		//
-		if (!wpDescToDeliverableParts.isEmpty()) {
-			for (Iterator iter = wpDescToDeliverableParts.entrySet().iterator(); iter
-					.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) entry
-						.getKey();
-				wpDesc.getDeliverableParts().removeAll(
-						(Collection) entry.getValue());
-			}
-		}
-
-		// remove work product descriptor from deliverable part
-		//
-		if (!wpdToDeliverableDescriptorMap.isEmpty()) {
-			for (Iterator iter = wpdToDeliverableDescriptorMap.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				WorkProductDescriptor deliverable = (WorkProductDescriptor) entry
-						.getValue();
-				deliverable.getDeliverableParts().remove(entry.getKey());
-			}
-		}
-
-		// remove role descriptors from activity's package
-		//
-		ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-		if (pkg != null) {
-			pkg.getProcessElements().removeAll(taskDescList);
-			pkg.getProcessElements().removeAll(roleDescList);
-			pkg.getProcessElements().removeAll(wpDescList);
-			for (Iterator iter = wpDescToDeliverableParts.values().iterator(); iter
-					.hasNext();) {
-				pkg.getProcessElements().removeAll((Collection) iter.next());
-			}
-		}
-	}
-
-	// /**
-	// * Get task descriptors map for an activity
-	// * @param activity
-	// * @return
-	// */
-	// private static HashMap getTasksMapForActivity(Activity activity)
-	// {
-	// List elements = activity.getBreakdownElements();
-	// HashMap map = new HashMap();
-	// for (int i=0; i < elements.size(); i++)
-	// {
-	// Object obj = elements.get(i);
-	// if (obj instanceof TaskDescriptor)
-	// {
-	// TaskDescriptor taskDesc = (TaskDescriptor) obj;
-	// Task task = taskDesc.getTask();
-	// if (task != null)
-	// {
-	// map.put(task, taskDesc);
-	// }
-	// }
-	// }
-	// return map;
-	// }
-	//	
-	//	
-	// /**
-	// * Show RoleAssociation Dialog
-	// * @param tasks
-	// */
-	// private static int showRoleAssociationDialog(Task task)
-	// {
-	//		
-	// RoleAssociationDialog roleAssoc = new
-	// RoleAssociationDialog(Display.getCurrent().getActiveShell(), task);
-	// roleAssoc.open();
-	//		
-	// // selected tasks;
-	// return roleAssoc.getRoleAssociation();
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		if (roleDescList != null) {
-			return roleDescList;
-		}
-
-		return super.getAffectedObjects();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.process.command.BSDropCommand#dispose()
-	 */
-	public void dispose() {
-		if (roleDescList != null) {
-			roleDescList.clear();
-		}
-		if (roleDescTeamProfileMap != null) {
-			roleDescTeamProfileMap.clear();
-		}
-		if (wpDescList != null) {
-			wpDescList.clear();
-		}
-		if (wpDescToDeliverableParts != null) {
-			wpDescToDeliverableParts.clear();
-		}
-		if (wpdToDeliverableDescriptorMap != null) {
-			wpdToDeliverableDescriptorMap.clear();
-		}
-		if (wpdToTaskFeaturesMap != null) {
-			wpdToTaskFeaturesMap.clear();
-		}
-
-		super.dispose();
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/PBSDragAndDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/PBSDragAndDropCommand.java
deleted file mode 100644
index 38842e2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/PBSDragAndDropCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * Drag and drop command for dropping work products into WP Usage structure
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class PBSDragAndDropCommand extends BSDragAndDropCommand {
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param location
-	 * @param operations
-	 * @param operation
-	 * @param collection
-	 */
-	public PBSDragAndDropCommand(EditingDomain domain, Object owner,
-			float location, int operations, int operation, Collection collection) {
-		super(domain, owner, location, operations, operation, collection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDragAndDropCommand#accept(java.lang.Object)
-	 */
-	protected boolean accept(Object obj) {
-		obj = TngUtil.unwrap(obj);
-
-		if(obj instanceof WorkProduct) {
-			if(owner instanceof Activity) {
-				return true;
-//				return ProcessCommandUtil.getValidDescriptor(obj, (Activity) owner,
-//						((AdapterFactoryEditingDomain)domain).getAdapterFactory()) == null;
-			}
-			else {
-				return true;
-			}
-		}
-		else {
-			return false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDragAndDropCommand#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	protected Command createDropCommand(Object owner, List dropSrc) {
-		return new PBSDropCommand((Activity) owner, dropSrc);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/PBSDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/PBSDropCommand.java
deleted file mode 100644
index fadcaf3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/PBSDropCommand.java
+++ /dev/null
@@ -1,603 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.command.BatchCommand;
-import org.eclipse.epf.library.edit.command.INestedCommandProvider;
-import org.eclipse.epf.library.edit.command.NestedCommandExcecutor;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.UniqueNamePNameHandler;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command to drag and drop work products to Work Product Usage breakdown
- * structure
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class PBSDropCommand extends BSDropCommand {
-	private ArrayList wpDescList;
-
-	private ArrayList roleDescList;
-
-	private Map wpDescToDeliverableParts;
-
-	private HashMap wpdToDeliverableDescriptorMap;
-
-	private BatchCommand updateDeliverablePartsCmd;
-
-	private boolean newDuplicatesRemoved;
-
-	private IConfigurator configurator;
-
-	private ArrayList linkedTasks;
-
-	private HashMap wpdToTaskFeaturesMap;
-
-	public PBSDropCommand(Activity activity, List workProducts) {
-		super(activity, workProducts);
-		this.activity = activity;
-		for (Iterator iter = dropElements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!(element instanceof WorkProduct)) {
-				iter.remove();
-			}
-		}
-	}
-
-	/**
-	 * @param activity
-	 * @param dropElements
-	 * @param synch
-	 */
-	public PBSDropCommand(Activity activity, List dropElements, boolean synch) {
-		super(activity, dropElements, synch);
-	}
-
-	/**
-	 * @param activity
-	 * @param dropElements
-	 * @param config
-	 * @param synchFeatures
-	 */
-	public PBSDropCommand(Activity activity, List dropElements,
-			MethodConfiguration config, Set synchFeatures, IConfigurator configurator) {
-		super(activity, dropElements, config, synchFeatures);
-		this.configurator = configurator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#preExecute()
-	 */
-	protected boolean preExecute() {
-		if (!super.preExecute())
-			return false;
-
-		wpDescList = new ArrayList();
-		taskDescList = new ArrayList();
-		roleDescList = new ArrayList();
-		wpDescToDeliverableParts = new HashMap();
-		wpdToDeliverableDescriptorMap = new HashMap();
-
-		if(!synchronize || (synchronize && synchFeatures.contains(UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts()))) {
-			// add subartifacts to dropElements list if there is any
-			//
-			for (Iterator iter = new ArrayList(dropElements).iterator(); iter
-			.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof Artifact) {
-					Iterator iterator = new AbstractTreeIterator(element, false) {
-						
-						/**
-						 * Comment for <code>serialVersionUID</code>
-						 */
-						private static final long serialVersionUID = -4820477887426087262L;
-						
-						protected Iterator getChildren(Object object) {
-							Object subArtifacts = Providers.getConfigurationApplicator().getReference(
-									(VariabilityElement) object,
-									UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts(),
-									getMethodConfiguration());
-							return ((Collection)subArtifacts).iterator();
-						}
-						
-					};
-					
-					while (iterator.hasNext()) {
-						Artifact subArtifact = (Artifact) iterator.next();
-						if (!dropElements.contains(subArtifact) && prepareAdd((WorkProduct) subArtifact)) 
-						{
-							dropElements.add(subArtifact);
-						}
-					}
-				}
-			}
-		}
-
-		MethodConfiguration config = getMethodConfiguration();
-		Set descriptorsToRefresh = synchronize ? batchCommand.getDescriptorsToRefresh() : null;
-		
-		List bes = activity.getBreakdownElements();
-		UniqueNamePNameHandler uniqueNamesHandler = new UniqueNamePNameHandler(bes, bes);
-		
-		for (int i = 0; i < dropElements.size(); i++) {
-			WorkProduct wp = (WorkProduct) dropElements.get(i);			
-			if (TngUtil.isContributor(wp)) {
-				wp = (WorkProduct) TngUtil.getBase(wp);
-			}
-			WorkProductDescriptor wpDesc = null;
-			if (synchronize) {
-				wpDesc = (WorkProductDescriptor) ProcessCommandUtil
-					.getDescriptor(wp, activity, config);
-			}
-			if (wpDesc == null) {
-				wpDesc = ProcessCommandUtil.createWorkProductDescriptor(wp, config,
-						wpDescToDeliverableParts);
-//				uniqueNamesHandler.ensureUnique(wpDesc);
-				wpDescList.add(wpDesc);
-
-				// automatic adding to the existing deliverable descriptor in
-				// the activity's scope if there is any
-				// valid one.
-				//
-				WorkProductDescriptor descriptor = UserInteractionHelper
-						.getDeliverable(activity, wp);
-				if (descriptor != null) {
-					wpdToDeliverableDescriptorMap.put(wpDesc, descriptor);
-				}
-				
-				if(wpdToTaskFeaturesMap != null) {
-					// replace work product with its work product descriptor in wpdToTaskFeaturesMap
-					//
-					Map featuresMap = (Map) wpdToTaskFeaturesMap.get(wp);
-					if(featuresMap != null) {
-						wpdToTaskFeaturesMap.remove(wp);
-						wpdToTaskFeaturesMap.put(wpDesc, featuresMap);
-					}
-				}
-
-			} else {
-				if (descriptorsToRefresh != null && wpDesc.getIsSynchronizedWithSource().booleanValue()) {
-					descriptorsToRefresh.add(wpDesc);
-				}
-				if (wp instanceof Deliverable && synchFeatures.contains(UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts())) {
-					ProcessCommandUtil.createDeliverableParts(wpDesc,
-							(Deliverable) wp, config, wpDescToDeliverableParts, descriptorsToRefresh);
-				}
-				
-				if(wpdToTaskFeaturesMap != null) {
-					wpdToTaskFeaturesMap.remove(wp);
-				}
-			}
-
-		
-			if (!synchronize) {
-				// get all possible tasks for this workproduct for
-				// which task descriptor needs to be created
-				List tasks = ProcessUtil.getTasksForWorkProduct(wp, config);
-
-				if ((tasks != null) && (tasks.size() > 0)) {
-					// show task selections dialog		
-					final List finalTasks = tasks;
-					final WorkProduct finalWp = wp;
-					final List finalSelected = new ArrayList();
-					List selectedTasks = new ArrayList();
-					// show task selections dialog
-					UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-						public void run() {
-							List selected = UserInteractionHelper.selectTasks(
-									finalTasks, finalWp);						
-							finalSelected.addAll(selected);
-						}
-					}, true);
-					selectedTasks.addAll(finalSelected);
-					
-					// create task descriptors for this workproduct
-					if ((selectedTasks != null) && (!(selectedTasks.isEmpty()))) {
-						for (int j = 0; j < selectedTasks.size(); j++) {
-							Task task = (Task) selectedTasks.get(j);
-
-							// call this method even the descriptor for the
-							// given task already exists in this activity
-							// to add any additional relationships in case of
-							// recent change in the default configuration
-							// of the process.
-							PBSDropCommand.addToDescriptorLists(task, activity,
-									taskDescList, roleDescList, wpDescList,
-									wpDescToDeliverableParts,
-									descriptorsToRefresh,
-									batchCommand.getObjectToNewFeatureValuesMap(), 
-									config, true, synchFeatures);
-						}
-					} else {
-						// If no tasks are selected, add Responsible role to wp
-						ProcessCommandUtil.addResponsibleRoleDescriptors(wpDesc, activity,
-								roleDescList, descriptorsToRefresh, config);
-					}
-				}
-				else {
-					//	If there are no tasks to show, add Responsible role to wp
-					ProcessCommandUtil.addResponsibleRoleDescriptors(wpDesc, activity,	roleDescList, descriptorsToRefresh, config);
-				}
-			}
-//			else {
-//				//	in case of synchronization, add Responsible role to wp
-//				if (synchFeatures.contains(UmaPackage.eINSTANCE.getRole_ResponsibleFor()))
-//					PBSDropCommand.addResponsibleRole(wpDesc, activity,	roleDescList, descriptorsToRefresh, config);
-//			}				
-		}
-
-		if(!wpDescToDeliverableParts.isEmpty()) {
-			updateDeliverablePartsCmd = new BatchCommand(true);
-			for (Iterator iter = wpDescToDeliverableParts.entrySet().iterator(); iter
-			.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Object wpDesc = entry.getKey();
-				updateDeliverablePartsCmd.getObjectToNewFeatureValuesMap().put(wpDesc, 
-						Collections.singletonMap(UmaPackage.eINSTANCE.getWorkProductDescriptor_DeliverableParts(), entry.getValue()));
-			}
-		}
-		
-
-		// ensure unique names for wp descriptors
-		for (int i = 0; i < wpDescList.size(); i++) {
-			WorkProductDescriptor wpDesc = (WorkProductDescriptor) wpDescList
-					.get(i);
-			if (wpDesc != null) {
-				uniqueNamesHandler.ensureUnique(wpDesc);
-			}
-		}
-		return !taskDescList.isEmpty()
-				|| !roleDescList.isEmpty()
-				|| !wpDescList.isEmpty()
-				|| (updateDeliverablePartsCmd != null && updateDeliverablePartsCmd.canExecute())
-				|| !wpdToDeliverableDescriptorMap.isEmpty()
-				|| (descriptorsToRefresh != null && !descriptorsToRefresh
-						.isEmpty())
-				|| batchCommand.canExecute();
-	}
-	
-	/**
-	 * @param subArtifact
-	 * @return
-	 */
-	private boolean prepareAdd(WorkProduct wp) {
-		if (synchronize) {	
-			// get linked tasks of the task descriptors in the activity for the configuration
-			//
-			List tasks = getLinkedTasks();
-			
-			if(!tasks.isEmpty()) {
-				// select only work products that are input or output of an existing task in the activity
-				//	
-				Map featuresMap = ProcessCommandUtil.getFeaturesMap(tasks, wp, getMethodConfiguration());
-				if(!featuresMap.isEmpty()) {
-					// use the wp to the key in the map right now and replace it with
-					// its work product descriptor later
-					//
-					if(wpdToTaskFeaturesMap == null) {
-						wpdToTaskFeaturesMap = new HashMap();
-					}
-					wpdToTaskFeaturesMap.put(wp, featuresMap);
-					return true;
-				}
-			}
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @return
-	 */
-	private List getLinkedTasks() {
-		if(linkedTasks == null) {
-			linkedTasks = new ArrayList();
-			for (Iterator iter = activity.getBreakdownElements().iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if(element instanceof TaskDescriptor) {
-					Task task = ((TaskDescriptor)element).getTask();
-					if(task != null && configurator.accept(element)) {
-						linkedTasks.add(task);
-					}
-				}
-			}
-		}
-		return linkedTasks;
-	}
-
-	/**
-	 * Removes new elements that are duplicate b/c they are created by the previous WBSDropCommand
-	 */
-	private void removeNewDuplicates() {
-		if(synchronize) {
-			if(!newDuplicatesRemoved) {
-				for (Iterator iter = roleDescList.iterator(); iter.hasNext();) {
-					RoleDescriptor roleDesc = (RoleDescriptor) iter.next();
-					Object desc = ProcessCommandUtil.getDescriptor(roleDesc.getRole(), activity, getMethodConfiguration());
-					if(desc != null) {
-						iter.remove();
-					}
-				}
-				newDuplicatesRemoved = true;			
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doExecute()
-	 */
-	protected void doExecute() {
-		removeNewDuplicates();
-		
-		// automatically add work product descriptor to deliverable part
-		//
-		if (!wpdToDeliverableDescriptorMap.isEmpty()) {
-			for (Iterator iter = wpdToDeliverableDescriptorMap.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				WorkProductDescriptor deliverable = (WorkProductDescriptor) entry
-						.getValue();
-				deliverable.getDeliverableParts().add(entry.getKey());
-			}
-		}
-
-		// add work product descriptors
-		//
-		activity.getBreakdownElements().addAll(wpDescList);
-
-		// add task descriptors
-		//
-		activity.getBreakdownElements().addAll(taskDescList);
-
-		// add role descriptors
-		//
-		activity.getBreakdownElements().addAll(roleDescList);
-		
-		// associate new work product descriptors with task descriptors
-		//
-		if(wpdToTaskFeaturesMap != null) {
-			for (Iterator iter = wpdToTaskFeaturesMap.entrySet().iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Map taskFeatures = (Map) entry.getValue();
-				for (Iterator iterator = taskFeatures.entrySet().iterator(); iterator
-				.hasNext();) {
-					Map.Entry ent = (Map.Entry) iterator.next();
-					TaskDescriptor taskDesc = (TaskDescriptor) ProcessCommandUtil.getDescriptor(ent.getKey(), activity.getBreakdownElements(), getMethodConfiguration(), false);
-					for (Iterator iterator1 = ((Collection)ent.getValue()).iterator(); iterator1
-					.hasNext();) {
-						EStructuralFeature f = (EStructuralFeature) iterator1.next();
-						EStructuralFeature descFeature = (EStructuralFeature) FEATURE_MAP.get(f);
-						if(descFeature.isMany()) {
-							((List)taskDesc.eGet(descFeature)).add(entry.getKey());							
-						}
-						else {
-							// TODO: need to back up old value here
-							//
-							taskDesc.eSet(descFeature, entry.getKey());
-						}
-					}
-				}
-			}
-		}
-
-		// add new descriptors to activity's package
-		//
-		ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-		if (pkg != null) {
-			pkg.getProcessElements().addAll(taskDescList);
-			pkg.getProcessElements().addAll(roleDescList);
-			pkg.getProcessElements().addAll(wpDescList);
-
-			for (Iterator iter = wpDescToDeliverableParts.values().iterator(); iter
-					.hasNext();) {
-				pkg.getProcessElements().addAll((Collection) iter.next());
-			}
-		}
-
-//		getModifiedResources().add(activity.eResource());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.command.BSDropCommand#updateDescriptors()
-	 */
-	protected void updateDescriptors() {
-		super.updateDescriptors();
-		
-		// add deliverable parts to the work product descriptors
-		//
-		if(updateDeliverablePartsCmd != null) {
-			updateDeliverablePartsCmd.execute();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.command.BSDropCommand#undoUpdateDescriptors()
-	 */
-	protected void undoUpdateDescriptors() {
-		// remove deliverable parts of the work product descriptors
-		//
-		if(updateDeliverablePartsCmd != null) {
-			updateDeliverablePartsCmd.undo();
-		}
-
-		super.undoUpdateDescriptors();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doUndo()
-	 */
-	protected void doUndo() {
-		// remove work product descriptors
-		//
-		activity.getBreakdownElements().removeAll(wpDescList);
-
-		// remove role descriptors
-		//
-		activity.getBreakdownElements().removeAll(roleDescList);
-
-		// remove task descriptors
-		//
-		activity.getBreakdownElements().removeAll(taskDescList);
-
-		// remove work product descriptor from deliverable part
-		//
-		if (!wpdToDeliverableDescriptorMap.isEmpty()) {
-			for (Iterator iter = wpdToDeliverableDescriptorMap.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				WorkProductDescriptor deliverable = (WorkProductDescriptor) entry
-						.getValue();
-				deliverable.getDeliverableParts().remove(entry.getKey());
-			}
-		}
-
-		// remove descriptors from activity's package
-		//
-		ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-		if (pkg != null) {
-			pkg.getProcessElements().removeAll(taskDescList);
-			pkg.getProcessElements().removeAll(roleDescList);
-			pkg.getProcessElements().removeAll(wpDescList);
-			for (Iterator iter = wpDescToDeliverableParts.values().iterator(); iter
-					.hasNext();) {
-				pkg.getProcessElements().removeAll((Collection) iter.next());
-			}
-		}
-		
-		// disassociate new work product descriptors with task descriptors
-		//
-		if(wpdToTaskFeaturesMap != null) {
-			for (Iterator iter = wpdToTaskFeaturesMap.entrySet().iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Map taskFeatures = (Map) entry.getValue();
-				for (Iterator iterator = taskFeatures.entrySet().iterator(); iterator
-						.hasNext();) {
-					Map.Entry ent = (Map.Entry) iterator.next();
-					TaskDescriptor taskDesc = (TaskDescriptor) ProcessCommandUtil.getDescriptor(ent.getKey(), activity, getMethodConfiguration());
-					for (Iterator iterator1 = ((Collection)ent.getValue()).iterator(); iterator1
-							.hasNext();) {
-						EStructuralFeature f = (EStructuralFeature) iterator1.next();
-						EStructuralFeature descFeature = (EStructuralFeature) FEATURE_MAP.get(f);
-						if(descFeature.isMany()) {
-							((List)taskDesc.eGet(descFeature)).remove(entry.getKey());							
-						}
-						else {
-							taskDesc.eSet(descFeature, null);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		if (wpDescList != null) {
-			return wpDescList;
-		}
-
-		return super.getAffectedObjects();
-	}
-
-	/**
-	 * 
-	 * @param task
-	 * @param activity
-	 * @param taskDescList
-	 * @param roleDescList
-	 * @param wpDescList
-	 * @param wpDescToDeliverableParts
-	 * @param descriptorsToRefresh
-	 * @return <code>true</code> if a new TaskDescriptor is created for the
-	 *         given task, <code>false</code> otherwise
-	 */
-	static boolean addToDescriptorLists(Task task, Activity activity,
-			List taskDescList, List roleDescList, List wpDescList,
-			Map wpDescToDeliverableParts, Set descriptorsToRefresh,
-			Map descriptorToNewFeatureValuesMap, MethodConfiguration config, boolean useExistingDescriptor, Set synchFeatures) {
-		TaskDescriptor desc = ProcessCommandUtil.createTaskDescriptor(task, activity,
-				roleDescList, wpDescList, wpDescToDeliverableParts, null,
-				descriptorsToRefresh, descriptorToNewFeatureValuesMap, 
-				config, useExistingDescriptor, synchFeatures);
-		if ((desc != null) && (taskDescList != null)
-				&& !taskDescList.contains(desc)) {
-			taskDescList.add(desc);
-		}
-		return desc != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.command.BSDropCommand#dispose()
-	 */
-	public void dispose() {
-		if(roleDescList != null) {
-			roleDescList.clear();
-		}
-		if(wpDescList != null) {
-			wpDescList.clear();
-		}
-		if(wpDescToDeliverableParts != null) {
-			wpDescToDeliverableParts.clear();
-		}
-		if(wpdToDeliverableDescriptorMap != null) {
-			wpdToDeliverableDescriptorMap.clear();
-		}
-		if(wpdToTaskFeaturesMap != null) {
-			wpdToTaskFeaturesMap.clear();
-		}
-		
-		super.dispose();
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessCommandUtil.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessCommandUtil.java
deleted file mode 100644
index 6b35790..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessCommandUtil.java
+++ /dev/null
@@ -1,850 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IConfigurationApplicator;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.command.BatchCommand;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * @author Phong Nguyen Le - Nov 23, 2005
- * @since 1.0
- */
-public final class ProcessCommandUtil {
-	public static final EStructuralFeature[] DESCRIPTOR_REFRESHABLE_FEATURES = {
-		// UmaPackage.eINSTANCE.getNamedElement_Name(),
-		// UmaPackage.eINSTANCE.getDescribableElement_PresentationName(),
-		UmaPackage.eINSTANCE.getMethodElement_BriefDescription() 
-	};
-
-	public static final EStructuralFeature[] TASK_DESCRIPTOR_REFRESHABLE_FEATURES = {
-		UmaPackage.eINSTANCE.getTaskDescriptor_AdditionallyPerformedBy(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_Output(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_SelectedSteps() 
-	};
-
-	public static final EStructuralFeature[] ROLE_DESCRIPTOR_REFRESHABLE_FEATURES = { 
-		UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor() 
-	};
-
-//	public static final EStructuralFeature[] WORK_PRODUCT_REFRESHABLE_FEATURES = {
-//
-//	};
-
-	/**
-	 * Creates a refreshable feature map for the given descriptor. A descriptor
-	 * feature is considered refreshable if there is a similiar feature in its
-	 * linked MethodElement
-	 * 
-	 * @param descriptor
-	 * @return the refreshable feature map for the given descriptor
-	 */
-	public static Map createRefreshableFeatureMap(Descriptor descriptor, Set excludeFeatures) {
-		Map featureMap = new HashMap();
-		addToFeatureMap(descriptor, DESCRIPTOR_REFRESHABLE_FEATURES, featureMap, excludeFeatures);
-		if (descriptor instanceof TaskDescriptor) {
-			addToFeatureMap(descriptor, TASK_DESCRIPTOR_REFRESHABLE_FEATURES,
-					featureMap, excludeFeatures);
-		} else if (descriptor instanceof RoleDescriptor) {
-			addToFeatureMap(descriptor, ROLE_DESCRIPTOR_REFRESHABLE_FEATURES,
-					featureMap, excludeFeatures);
-		} else if (descriptor instanceof WorkProductDescriptor) {
-			WorkProductDescriptor wpd = (WorkProductDescriptor) descriptor;
-			EStructuralFeature feature = UmaPackage.eINSTANCE
-			.getWorkProductDescriptor_DeliverableParts();
-			if (wpd.getWorkProduct() instanceof Deliverable && !excludeFeatures.contains(feature)) {
-				featureMap.put(feature, wpd.getDeliverableParts());
-			}
-		}
-		return featureMap;
-	}
-
-	private static void addToFeatureMap(EObject eObject,
-			EStructuralFeature[] features, Map featureMap, Set excludeFeatures) {
-		for (int i = 0; i < features.length; i++) {
-			EStructuralFeature feature = features[i];
-			if (!excludeFeatures.contains(feature)) {
-				Object value = eObject.eGet(feature);
-				if (feature.isMany()) {
-					value = new ArrayList((Collection) value);
-				}
-				featureMap.put(feature, value);
-			}
-		}
-	}
-
-	// private static boolean isValidReference(EObject e) {
-	// if (e.eIsProxy()) {
-	// return false;
-	// }
-	// if (e instanceof Descriptor) {
-	// MethodElement element = ProcessUtil
-	// .getAssociatedElement((Descriptor) e);
-	// if (element == null || element.eIsProxy()) {
-	// return false;
-	// }
-	// }
-	// return true;
-	// }
-
-	/**
-	 * Clears all attributes. For references, remove only those that are
-	 * descriptors which are not linked to any content element.
-	 * 
-	 * @param descriptor
-	 * @return
-	 */
-	public static Map clearRefreshableFeatures(Descriptor descriptor, Set excludeFeatures) {
-		Map featureMap = createRefreshableFeatureMap(descriptor, excludeFeatures);
-		for (Iterator iter = featureMap.keySet().iterator(); iter.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) iter.next();
-			if (feature instanceof EAttribute) {
-				descriptor.eSet(feature, feature.getDefaultValue());
-			} else {
-				if (feature.isMany()) {
-					// work around to avoid ArrayIndexOutOfBoundsException
-					//
-					List list = ((List) descriptor.eGet(feature));
-					switch (list.size()) {
-					case 0:
-						break;
-					case 1:
-						list.remove(0);
-						break;
-					default:
-						list.clear();
-					}
-				} else {
-					descriptor.eSet(feature, feature.getDefaultValue());
-				}
-				// if(feature.isMany()) {
-				// List list = ((List)descriptor.eGet(feature));
-				// List elementsToRemove = new ArrayList();
-				// for (Iterator iterator = list.iterator(); iterator
-				// .hasNext();) {
-				// EObject e = (EObject) iterator.next();
-				// if(!isValidReference(e)) {
-				// elementsToRemove.add(e);
-				// }
-				// }
-				// if(!elementsToRemove.isEmpty()) {
-				// list.removeAll(elementsToRemove);
-				// System.out
-				// .println("ProcessCommandUtil.clearRefreshableFeatures():
-				// changed");
-				// }
-				// }
-				// else {
-				// EObject obj = (EObject) descriptor.eGet(feature);
-				// if(obj != null && obj != feature.getDefaultValue() &&
-				// !isValidReference(obj)) {
-				// descriptor.eSet(feature, feature.getDefaultValue());
-				// System.out
-				// .println("ProcessCommandUtil.clearRefreshableFeatures():
-				// changed");
-				// }
-				// }
-			}
-		}
-
-		return featureMap;
-	}
-
-	/**
-	 * Clears all the refreshable features of the given descriptor
-	 * 
-	 * @param descriptor
-	 * @param descriptorToOldRefreshableFeaturesMap
-	 * @param excludeFeatures features to exclude from refreshing
-	 */
-	public static boolean clearDescriptor(Descriptor descriptor,
-			Map descriptorToOldRefreshableFeaturesMap,
-			Set excludeFeatures) {
-		if (descriptorToOldRefreshableFeaturesMap != null) {
-			// need to clear all the refreshable features of the existing
-			// descriptor
-			//
-			if (!descriptorToOldRefreshableFeaturesMap.containsKey(descriptor)) {
-				descriptorToOldRefreshableFeaturesMap
-						.put(descriptor, clearRefreshableFeatures(descriptor, excludeFeatures));
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private static boolean isValidDescriptorOf(Object element, MethodConfiguration config, Object descriptor, boolean excludeSuppressed) {		
-		if(descriptor instanceof Descriptor) {
-			Descriptor desc =  ((Descriptor)descriptor);
-			if(excludeSuppressed && desc.getSuppressed().booleanValue()) {
-				return false;
-			}
-
-			Object elementObj = ProcessUtil.getAssociatedElement(desc);
-			elementObj = Providers.getConfigurationApplicator().resolve(elementObj, config);
-			return element == elementObj;
-		}
-		return false;
-	}
-	
-	/**
-	 * Checks if the given <code>object</code> is a valid descriptor or descriptor wrapper of the given <code>element</code>
-	 * @param element
-	 * @param config
-	 * @param object
-	 * 
-	 * @return
-	 */
-	private static boolean isValidDescriptorOrDescriptorWrapperOf(Object element, MethodConfiguration config, Suppression suppression, Object object) {
-		if(object instanceof BreakdownElementWrapperItemProvider) {
-			if(suppression.isInSuppressedList((BreakdownElementWrapperItemProvider) object)) {
-				return false;
-			}
-			else {
-				return isValidDescriptorOf(element, config, TngUtil.unwrap(object), false);
-			}
-		}
-		return isValidDescriptorOf(element, config, object, true);
-	}
-
-	/**
-	 * Gets the unsuppressed descriptor from a descriptor list. The descriptor list is usually
-	 * the breakdown elements of an activity.
-	 * 
-	 * @param obj
-	 * @param descriptorList
-	 * @return
-	 */
-	public static Object getDescriptor(Object obj, List descriptorList, MethodConfiguration config) {
-		return getDescriptor(obj, descriptorList, config, true);
-	}
-	
-	static Object getDescriptor(Object obj, List descriptorList, MethodConfiguration config, boolean excludeSuppressed) {
-		int size = descriptorList.size();
-		for (int j = 0; j < size; j++) {
-			// iterate thru list to see whether a valid descriptor linked with the given object
-			// already exists
-			//
-			Object object = descriptorList.get(j);
-			if(isValidDescriptorOf(obj, config, object, excludeSuppressed)) {
-				return object;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Gets the valid descriptor, either local or inherited, of the given object under the given activity
-	 * 
-	 * @param obj
-	 * @param activity
-	 * @return
-	 */
-	public static Descriptor getValidDescriptor(Object obj, Activity activity, AdapterFactory adapterFactory) {
-		Process proc = TngUtil.getOwningProcess(activity);
-		MethodConfiguration config = proc.getDefaultContext();
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(activity, ITreeItemContentProvider.class);
-		for (Iterator iter = adapter.getChildren(activity).iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if(isValidDescriptorOrDescriptorWrapperOf(obj, config, Suppression.getSuppression(proc), child)) {
-				return (Descriptor) TngUtil.unwrap(child);
-			}
-		}
-		return null;
-	}
-	
-	
-
-	/**
-	 * Gets the local unsuppressed descriptor of the given role, task, or workProduct.
-	 * 
-	 * @param obj
-	 * @param activity
-	 * @return The descriptor of the object, or null if not exist.
-	 */
-	public static Object getDescriptor(Object obj, Activity activity, MethodConfiguration config) {
-		return getDescriptor(obj, activity.getBreakdownElements(), config);
-	}
-
-	/**
-	 * Creates Role Descriptors for the responsible roles of the given work product
-	 * descriptor.
-	 * 
-	 * @param wpDesc
-	 * @param activity
-	 * @param roleDescriptors newly created role descriptors will be added to this list
-	 * @return
-	 */
-	public static void addResponsibleRoleDescriptors(
-			WorkProductDescriptor wpDesc, Activity activity,
-			List<RoleDescriptor> roleDescriptors, Set descriptorsToRefresh, MethodConfiguration config) {
-		if (wpDesc != null) {
-			WorkProduct wp = wpDesc.getWorkProduct();
-			if (wp != null) {
-				if (TngUtil.isContributor(wp)) {
-					wp = (WorkProduct) TngUtil.getBase(wp);
-				}
-				// get responsible role for work product
-				List roles = AssociationHelper.getResponsibleRoles(wp);
-				for (Iterator iterator = roles.iterator(); iterator.hasNext();) {
-					Role role = (Role) iterator.next();
-					if (TngUtil.isContributor(role)) {
-						role = (Role) TngUtil.getBase(role);
-					}
-					boolean isNewDescriptor = false;
-					// check for roledescriptor whether it's present in activity
-					// breakdown elements
-					RoleDescriptor roleDesc = (RoleDescriptor) getDescriptor(
-							role, activity, config);
-					if (roleDesc == null) {
-						// check for roledescriptor whether it's present in base
-						// activity.
-						roleDesc = (RoleDescriptor) ProcessCommandUtil.getInheritedDescriptor(
-								role, activity, config);
-						if (roleDesc == null) {
-							// check for roledescriptor whether it's present in
-							// list of roledescriptors passed in
-							roleDesc = (RoleDescriptor) getDescriptor(role,
-									roleDescriptors, config);
-							if (roleDesc == null) {
-								roleDesc = ProcessUtil.createRoleDescriptor(role);
-								roleDescriptors.add(roleDesc);
-								isNewDescriptor = true;
-							}
-						}
-					}
-					if (!isNewDescriptor && descriptorsToRefresh != null 
-							&& roleDesc.getIsSynchronizedWithSource().booleanValue()) {
-						descriptorsToRefresh.add(roleDesc);
-					}						
-				}
-			}
-		}
-	}
-
-	/**
-	 * Collects work product descriptors for the given
-	 * <code>taskDescriptorFeature</code> based on the corresponding feature
-	 * in the linked task of the given <code>taskDescriptor</code>
-	 * 
-	 * @param task the task that the task descriptor is linked to
-	 * @param taskDescriptor the task descriptor whose work product descriptors in the given <code>taskDescriptorFeature</code>
-	 *        will be collected
-	 * @param taskFeature the task feature that is corresponding to the task descriptor feature
-	 * @param taskDescriptorFeature the feature of task descriptor that holds references to 
-	 *        the work product descriptor to collect
-	 * @param activity the activity of descriptors
-	 * @param config the selected configuration
-	 * @param wpDescriptors
-	 * @param wpdToDeliverablePartsMap
-	 * @param wpdToDeliverableDescriptorMap
-	 * @param descriptorsToRefresh
-	 *            ouput that keeps the descriptor features that need to be
-	 *            refreshed
-	 * @param descriptorToNewFeatureValuesMap
-	 *            output that keeps the collected work product descriptors
-	 */
-	private static void collectWorkProductDescrtiptors(
-			Task task,
-			TaskDescriptor taskDescriptor, EReference taskFeature,
-			EStructuralFeature taskDescriptorFeature,
-			MethodConfiguration config, Activity activity, List wpDescriptors,
-			Map wpdToDeliverablePartsMap, Map wpdToDeliverableDescriptorMap,
-			Set descriptorsToRefresh, Map descriptorToNewFeatureValuesMap) {
-		List workProducts = (List) Providers.getConfigurationApplicator()
-				.getReference(task, taskFeature, config);
-		List list = new ArrayList();
-		ProcessCommandUtil.createWorkProductDescriptors(workProducts, list, activity,
-				wpDescriptors, wpdToDeliverablePartsMap,
-				wpdToDeliverableDescriptorMap, descriptorsToRefresh, config);
-		if (!list.isEmpty()) {
-			BatchCommand.addFeatureValues(descriptorToNewFeatureValuesMap, taskDescriptor,
-					taskDescriptorFeature, list);
-		}
-	}
-
-	/**
-	 * Creates work product descriptors from the given work products for the
-	 * given activity if it does not have them already
-	 * 
-	 * @param workProducts
-	 *            WorkProduct list
-	 * @param featureValue
-	 *            target WorkProductDescriptor list for the given WorkProduct
-	 *            list
-	 * @param activity
-	 * @param wpDescriptors
-	 *            newly created work product descriptor (output)
-	 */
-	static void createWorkProductDescriptors(List workProducts,
-			List featureValue, Activity activity, List wpDescriptors,
-			Map wpdToDeliverablePartsMap, Map wpdToDeliverableDescriptorMap,
-			Set descriptorsToRefresh, MethodConfiguration config) {
-		if (workProducts != null) {
-			boolean wasEmpty = featureValue.isEmpty();
-			for (int j = 0; j < workProducts.size(); j++) {
-				WorkProduct wpObj = (WorkProduct) workProducts.get(j);
-				if (wpObj != null) {
-					if (TngUtil.isContributor(wpObj)) {
-						wpObj = (WorkProduct) TngUtil.getBase(wpObj);
-					}
-					WorkProductDescriptor wpDesc = (WorkProductDescriptor) getDescriptor(wpObj, activity, config);
-					if (wpDesc == null) {
-	
-						// get inherited work product descriptors
-						wpDesc = (WorkProductDescriptor) ProcessCommandUtil
-								.getInheritedDescriptor(wpObj, activity, config);
-						if (wpDesc == null) {
-							wpDesc = (WorkProductDescriptor) getDescriptor(wpObj, wpDescriptors, config);
-							if (wpDesc == null) {
-								wpDesc = ProcessCommandUtil.createWorkProductDescriptor(wpObj,
-										config, wpdToDeliverablePartsMap);
-								wpDescriptors.add(wpDesc);
-	
-								// automatic adding to the existing deliverable
-								// descriptor in the activity's scope if there
-								// is
-								// any
-								// valid one.
-								//
-								WorkProductDescriptor descriptor = UserInteractionHelper
-										.getDeliverable(activity, wpObj);
-								if (descriptor != null) {
-									wpdToDeliverableDescriptorMap.put(wpDesc,
-											descriptor);
-								}
-	
-							} else {
-								if (descriptorsToRefresh != null) {
-									descriptorsToRefresh.add(wpDesc);
-								}
-								if (wpObj instanceof Deliverable
-										&& wpdToDeliverablePartsMap != null) {
-									ProcessCommandUtil.createDeliverableParts(wpDesc,
-											(Deliverable) wpObj, config,
-											wpdToDeliverablePartsMap, descriptorsToRefresh);
-								}
-							}
-						}
-					}
-					if (wasEmpty || !featureValue.contains(wpDesc)) {
-						featureValue.add(wpDesc);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates a task descriptor for the given task within the activity if it
-	 * does not exist already, and update the roleDescriptors and wpDescriptors lists
-	 * associated with this Task descriptor. Caller should add the new task
-	 * descriptor and the otherDescriptors into the activity's breakdown element
-	 * list.
-	 * 
-	 * @param task
-	 * @param activity
-	 * @param roleDescriptors
-	 *            List to hold the created role descriptors associated with this
-	 *            new task descriptor, no role descriptor will be created if
-	 *            roleDescriptors is null
-	 * 
-	 * @param wpDescriptors
-	 *            List to hold the created workproduct descriptors associated
-	 *            with this new task descriptor, no workproduct descriptor will
-	 *            be created if wpDescriptors is null
-	 * 
-	 * @param wpdToDeliverableDescriptorMap 
-	 *            Map to hold work product descriptor and deliverable descriptor to assign
-	 *            the work product descriptor to
-	 *             
-	 * @return TaskDescriptor or null if the task descriptor for the given task
-	 *         already exists, and updated the roleDescriptors and wpDescriptors
-	 *         lists
-	 */
-	public static TaskDescriptor createTaskDescriptor(Task task,
-			Activity activity, List roleDescriptors, List wpDescriptors,
-			Map wpdToDeliverablePartsMap, Map wpdToDeliverableDescriptorMap,
-			Set descriptorsToRefresh, Map descriptorToNewFeatureValuesMap,
-			MethodConfiguration config, boolean useExistingDescriptor, Set synchFeatures) {
-		if (TngUtil.isContributor(task)) {
-			task = (Task) TngUtil.getBase(task);
-		}
-	
-		// create task descriptor object
-		//
-		TaskDescriptor taskDesc = null;
-		if (useExistingDescriptor)
-			taskDesc = 	(TaskDescriptor) getDescriptor(task, activity, config);
-		boolean isNewTaskDescriptor = false;
-	
-		// if ( taskDesc != null )
-		// {
-		// return taskDesc;
-		// }
-		// taskDesc = createTaskDescriptor(task);
-	
-		if (taskDesc == null) {
-			taskDesc = ProcessCommandUtil.createTaskDescriptor(task);
-			isNewTaskDescriptor = true;
-		} else {
-			if (descriptorsToRefresh != null && taskDesc.getIsSynchronizedWithSource().booleanValue()) {
-				descriptorsToRefresh.add(taskDesc);
-			}
-		}
-	
-		IConfigurationApplicator configApplicator = Providers
-				.getConfigurationApplicator();
-	
-		if (isNewTaskDescriptor) {
-			// add all task steps to TaskDescriptor step selection
-			//
-			List steps = (List) configApplicator.getReference(task
-					.getPresentation(), task, UmaPackage.eINSTANCE
-					.getContentDescription_Sections(), config);
-			taskDesc.getSelectedSteps().addAll(steps);
-			
-		}
-	
-		// moved this code to BSDropCommand#execute() to support undo and
-		// progress monitor
-		//
-		// else {
-		// for (Iterator iter = steps.iterator(); iter.hasNext();) {
-		// Object step = iter.next();
-		// if (!taskDesc.getSelectedSteps().contains(step)) {
-		// taskDesc.getSelectedSteps().add(step);
-		// }
-		// }
-		// }
-	
-		if (roleDescriptors != null) {
-			// get/create role descriptor for primary performer
-			//
-			EReference ref = UmaPackage.eINSTANCE.getTask_PerformedBy();
-			Role role = synchFeatures.contains(ref) ? (Role) configApplicator.getReference(task,
-					ref, config) : null;
-			if (role != null) {
-				// if (TngUtil.isContributor(role)) {
-				// role = (Role) TngUtil.getBase(role);
-				// }
-	
-				// check for local descriptor
-				RoleDescriptor primaryRoleDesc = (RoleDescriptor) getDescriptor(
-						role, activity, config);
-				boolean isNewRoleDescriptor = false;
-				if (primaryRoleDesc == null) {
-					// check for inherited descriptor
-					primaryRoleDesc = (RoleDescriptor) ProcessCommandUtil.getInheritedDescriptor(
-							role, activity, config);
-					if (primaryRoleDesc == null) {
-						// check for descriptor in passed in descriptor list
-						primaryRoleDesc = (RoleDescriptor) getDescriptor(role,
-								roleDescriptors, config);
-						if (primaryRoleDesc == null) {
-							primaryRoleDesc = ProcessUtil.createRoleDescriptor(role);
-							isNewRoleDescriptor = true;
-							roleDescriptors.add(primaryRoleDesc);
-						}
-					}
-				}
-				if (descriptorsToRefresh != null && !isNewRoleDescriptor
-						&& primaryRoleDesc.getIsSynchronizedWithSource().booleanValue()) {
-					descriptorsToRefresh.add(primaryRoleDesc);
-				}
-				if (isNewTaskDescriptor && isNewRoleDescriptor) {
-					taskDesc.setPerformedPrimarilyBy(primaryRoleDesc);
-				} else {
-					BatchCommand.addFeatureValue(descriptorToNewFeatureValuesMap, taskDesc,
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_PerformedPrimarilyBy(),
-							primaryRoleDesc);
-				}
-			}
-	
-			// get/create role descriptors for additional performing roles
-			//
-			ref = UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy();			
-			List additionalPerformers = synchFeatures.contains(ref) ? (List) configApplicator.getReference(
-					task, ref, config) : null;
-			if (additionalPerformers != null) {
-				for (int j = 0; j < additionalPerformers.size(); j++) {
-					Role roleObj = (Role) additionalPerformers.get(j);
-					// check for local descriptor
-					RoleDescriptor roleDesc = (RoleDescriptor) getDescriptor(
-							roleObj, activity, config);
-					boolean isNewRoleDescriptor = false;
-					if (roleDesc == null) {
-						// check for inherited descriptor
-						roleDesc = (RoleDescriptor) ProcessCommandUtil.getInheritedDescriptor(
-								roleObj, activity, config);
-						if (roleDesc == null) {
-							roleDesc = (RoleDescriptor) getDescriptor(roleObj,
-									roleDescriptors, config);
-							if (roleDesc == null) {
-								roleDesc = ProcessUtil.createRoleDescriptor(roleObj);
-								isNewRoleDescriptor = true;
-								roleDescriptors.add(roleDesc);
-							}
-						}
-					}
-					if (descriptorsToRefresh != null && !isNewRoleDescriptor
-							&& roleDesc.getIsSynchronizedWithSource().booleanValue()) {
-						descriptorsToRefresh.add(roleDesc);
-					}
-					if (isNewTaskDescriptor && isNewRoleDescriptor) {
-						taskDesc.getAdditionallyPerformedBy().add(roleDesc);
-					} else {
-						BatchCommand.addFeatureValue(
-								descriptorToNewFeatureValuesMap,
-								taskDesc,
-								UmaPackage.eINSTANCE
-										.getTaskDescriptor_AdditionallyPerformedBy(),
-								roleDesc);
-	
-					}
-				}
-			}
-		}
-		
-	
-		if (wpDescriptors != null) {
-			if (!isNewTaskDescriptor && !synchFeatures.contains(UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts())) {
-				wpdToDeliverablePartsMap = null;
-			}
-			
-			// create work product descriptor for input workproducts
-			//
-			if (isNewTaskDescriptor || synchFeatures.contains(UmaPackage.eINSTANCE.getTask_MandatoryInput())) {
-				collectWorkProductDescrtiptors(task, taskDesc, UmaPackage.eINSTANCE
-						.getTask_MandatoryInput(), UmaPackage.eINSTANCE
-						.getTaskDescriptor_MandatoryInput(), config, activity,
-						wpDescriptors, wpdToDeliverablePartsMap,
-						wpdToDeliverableDescriptorMap, descriptorsToRefresh,
-						descriptorToNewFeatureValuesMap);
-			}
-			if (isNewTaskDescriptor || synchFeatures.contains(UmaPackage.eINSTANCE.getTask_OptionalInput())) {
-				collectWorkProductDescrtiptors(task, taskDesc, UmaPackage.eINSTANCE
-						.getTask_OptionalInput(), UmaPackage.eINSTANCE
-						.getTaskDescriptor_OptionalInput(), config, activity,
-						wpDescriptors, wpdToDeliverablePartsMap,
-						wpdToDeliverableDescriptorMap, descriptorsToRefresh,
-						descriptorToNewFeatureValuesMap);
-			}
-	
-			// create work product descriptor for output workproducts
-			//
-			if (isNewTaskDescriptor || synchFeatures.contains(UmaPackage.eINSTANCE.getTask_Output())) {
-				collectWorkProductDescrtiptors(task, taskDesc, UmaPackage.eINSTANCE
-						.getTask_Output(), UmaPackage.eINSTANCE
-						.getTaskDescriptor_Output(), config, activity,
-						wpDescriptors, wpdToDeliverablePartsMap,
-						wpdToDeliverableDescriptorMap, descriptorsToRefresh,
-						descriptorToNewFeatureValuesMap);
-			}
-		}
-	
-		if (isNewTaskDescriptor) {
-			return taskDesc;
-		}
-	
-		return null;
-	}
-
-	private static TaskDescriptor createTaskDescriptor(Task task) {
-		TaskDescriptor taskDesc = UmaFactory.eINSTANCE.createTaskDescriptor();
-		taskDesc.setTask(task);
-		taskDesc.setName(task.getName());
-		taskDesc.setPresentationName(StrUtil
-				.isBlank(task.getPresentationName()) ? task.getName() : task
-				.getPresentationName());
-		// taskDesc.setBriefDescription(task.getBriefDescription());
-		return taskDesc;
-	}
-
-	/**
-	 * Creates deliverable parts for the given work product descriptor from the
-	 * deliverable work products of the given deliverable add put them in
-	 * <code>wpDescToDeliverableParts</code>
-	 * 
-	 * @param wpd
-	 * @param deliverable
-	 * @param wpDescToDeliverableParts
-	 *            (output) map of work product descriptor to its newly created
-	 *            deliverable parts
-	 */
-	public static void createDeliverableParts(WorkProductDescriptor wpd,
-			Deliverable deliverable, MethodConfiguration config,
-			Map wpDescToDeliverableParts, Set descriptorsToRefresh) {
-		IConfigurationApplicator configApplicator = Providers
-				.getConfigurationApplicator();
-	
-		List deliveredWPs = (List) configApplicator.getReference(deliverable,
-				UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts(),
-				config);
-		List parts = new ArrayList();
-		if (wpd.getDeliverableParts().isEmpty()) {
-			for (Iterator iter = deliveredWPs.iterator(); iter.hasNext();) {
-				parts.add(ProcessCommandUtil.createWorkProductDescriptor(
-						(WorkProduct) iter.next(), config,
-						wpDescToDeliverableParts));
-			}
-		} else {
-			for (Iterator iter = deliveredWPs.iterator(); iter.hasNext();) {
-				WorkProduct workProduct = (WorkProduct) iter.next();
-				WorkProductDescriptor desc = (WorkProductDescriptor) getDescriptor(workProduct, wpd.getDeliverableParts(), config);
-				if (desc == null) {
-					desc = ProcessCommandUtil.createWorkProductDescriptor(
-							workProduct, config, wpDescToDeliverableParts);
-				} else {
-					if(descriptorsToRefresh != null) {
-						descriptorsToRefresh.add(desc);
-					}
-					if (workProduct instanceof Deliverable) {
-						createDeliverableParts(desc, (Deliverable) workProduct,
-								config, wpDescToDeliverableParts, descriptorsToRefresh);
-					}
-				}
-				parts.add(desc);
-			}
-		}
-		if (!parts.isEmpty()) {
-			wpDescToDeliverableParts.put(wpd, parts);
-		}
-	}
-
-	/**
-	 * Creates work product descriptor for the given work product
-	 * 
-	 * @param wp
-	 * @param config
-	 * @param wpDescToDeliverableParts
-	 *            (output) map of work product descriptor to its newly created
-	 *            deliverable parts
-	 * @return new WorkProductDescriptor or <code>null</code> if the
-	 *         descriptor for the given work product already exists
-	 */
-	public static WorkProductDescriptor createWorkProductDescriptor(
-			WorkProduct wp, MethodConfiguration config,
-			Map wpDescToDeliverableParts) {
-		WorkProductDescriptor wpd = ProcessUtil.createWorkProductDescriptor(wp);
-		if (wp instanceof Deliverable && wpDescToDeliverableParts != null) {
-			createDeliverableParts(wpd, (Deliverable) wp, config,
-					wpDescToDeliverableParts, null);
-		}
-		return wpd;
-	}
-
-	/**
-	 * Get inhertied descriptor for the given role, task or workProduct. Unlike local descriptor, an inherited 
-	 * descriptor that is externally suppressed is considered valid.
-	 * 
-	 * @param obj
-	 * @param activity
-	 * @return descriptor of the object, null if not exists
-	 */
-	public static Object getInheritedDescriptor(Object obj, Activity activity, MethodConfiguration config) {
-		for (VariabilityType variabilityType = activity.getVariabilityType();
-			variabilityType == VariabilityType.EXTENDS_LITERAL || variabilityType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL;
-			variabilityType = activity.getVariabilityType()) {
-			VariabilityElement element = activity.getVariabilityBasedOnElement();
-	
-			if (element instanceof Activity) {
-				Activity baseActivity = (Activity) element;
-				Object desc = getDescriptor(obj, baseActivity.getBreakdownElements(), config, false);
-				if(desc != null) {
-					return desc;
-				}
-				activity = baseActivity;
-			}
-			else {
-				break;
-			}
-		}
-	
-		return null;
-	}
-	
-	/**
-	 * Get the map of task to features that contain the work product 
-	 * (input or output of the task)
-	 * 
-	 * @param tasks
-	 * @param wp
-	 * @return Map of task to features that contain the work product
-	 */
-	public static Map getFeaturesMap(List tasks, WorkProduct wp, MethodConfiguration config) {
-		Map featuresMap = new HashMap();
-		EReference[] taskFeatures = {
-				UmaPackage.eINSTANCE.getTask_MandatoryInput(),
-				UmaPackage.eINSTANCE.getTask_OptionalInput(),
-				UmaPackage.eINSTANCE.getTask_Output()
-		};
-		for (int i = tasks.size() - 1; i > -1; i--) {
-			Task task = (Task) tasks.get(i);
-			for (int j = 0; j < taskFeatures.length; j++) {
-				EReference feature = taskFeatures[j];
-				Object value = Providers.getConfigurationApplicator().getReference(task, feature, config);
-				if((feature.isMany() && ((List)value).contains(wp)) ||
-						value == wp) 
-				{
-					Collection features = (Collection) featuresMap.get(task);
-					if(features == null) {
-						features = new ArrayList();	
-						featuresMap.put(task, features);
-					}
-					features.add(feature);
-				}
-			}
-		}
-		return featuresMap;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessDeepCopyCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessDeepCopyCommand.java
deleted file mode 100644
index 36bf044..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessDeepCopyCommand.java
+++ /dev/null
@@ -1,160 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.NestedCommandExcecutor;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-
-/**
- * Physically copies a process with all of its direct or inherited structural features and references.
- * Add the newly created process to the specified process package.
- *    
- * This class extends the ActivityDeepCopyCommand to reuse most of it's functionality.
- * 
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class ProcessDeepCopyCommand extends ActivityDeepCopyCommand {
-
-	private ProcessPackage targetPackage;
-	private ProcessComponent tempPc;
-	private String newProcessName;
-	private NestedCommandExcecutor nestedCommandExecutor;
-	
-	public ProcessDeepCopyCommand(org.eclipse.epf.uma.Process process, String newProcessName,
-			CopyHelper copyHelper, MethodConfiguration config, ProcessPackage targetPackage,
-			IProgressMonitor monitor,IConfigurator configurator) {
-
-		super(process, copyHelper, config, null, monitor, configurator);
-
-		this.newProcessName = newProcessName;		
-		this.targetPackage = targetPackage;
-		createtargetProcess();
-		//TODO: disable copying diagrams for now
-		//
-//		nestedCommandExecutor = new NestedCommandExcecutor(this);
-	}	
-	
-	public MethodConfiguration getMethodConfiguration() {
-		return config;
-	}	
-	
-	public Process getTargetProcess() {
-		return targetProcess;
-	}
-	
-	public Process getSourceProcess() {
-		return (Process) activity;
-	}
-	
-	private void createtargetProcess() {
-		// create a placeholder for the new process
-		// since the content processor needs to know the taret process in order to fix the urls
-		
-		tempPc = UmaFactory.eINSTANCE.createProcessComponent();
-		targetPackage.getChildPackages().add(tempPc);
-		
-		if ( super.activity instanceof DeliveryProcess ) {
-			targetProcess = UmaFactory.eINSTANCE.createDeliveryProcess();
-		} else {
-			targetProcess = UmaFactory.eINSTANCE.createCapabilityPattern();			
-		}
-		targetProcess.setName(newProcessName);
-		targetProcess.setPresentationName(newProcessName);
-		tempPc.setName(newProcessName);
-
-		tempPc.setProcess(targetProcess);		
-	}
-	
-	@Override
-	public void dispose() {
-		if(nestedCommandExecutor != null) {
-			nestedCommandExecutor.dispose();
-		}
-		super.dispose();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.command.CopyCommand#execute()
-	 */
-	public void execute() {				
-		super.execute();	
-				
-		// new copy of the process must be saved so other nested commands like diagram copy command 
-		// can be executed.
-		if(pkgCopy != null && pkgCopy instanceof ProcessComponent) {
-			ILibraryPersister.FailSafeMethodLibraryPersister persister = Services.getDefaultLibraryPersister().getFailSafePersister();
-			try {
-				persister.save(pkgCopy.eResource());
-				persister.commit();
-			}
-			catch(Exception e) {
-				LibraryEditPlugin.getDefault().getLogger().logError(e);
-				try {
-					persister.rollback();
-				} catch (Exception ex) {
-					LibraryEditPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-		
-		if(nestedCommandExecutor != null) {
-			nestedCommandExecutor.executeNestedCommands();
-		}
-	}
-	
-	@Override
-	public void undo() {
-		if(nestedCommandExecutor != null) {
-			nestedCommandExecutor.undoNestedCommands();
-		}
-		super.undo();
-	}
-	
-	protected void fixProcessComponent() {
-		// replace the place holder with the actual copied process
-		if (pkgCopy instanceof ProcessComponent ) {
-			pkgCopy.setName(newProcessName);
-			org.eclipse.epf.uma.Process proc = ((ProcessComponent)pkgCopy).getProcess();
-			proc.setName(newProcessName);
-			proc.setPresentationName(newProcessName);
-			targetProcess = proc;
-			EcoreUtil.replace(tempPc, pkgCopy);
-		}
-	}
-	
-	/* 
-	 * returns a Collection containing the new process
-	 * 
-	 * @see org.eclipse.emf.common.command.CompoundCommand#getResult()
-	 */
-	public Collection<?> getResult() {
-		if(pkgCopy != null && pkgCopy instanceof ProcessComponent) {
-			return Collections.singletonList( ((ProcessComponent)pkgCopy).getProcess());
-		}
-		return Collections.EMPTY_LIST;
-	}	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessElementAddCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessElementAddCommand.java
deleted file mode 100644
index 2c98ef9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessElementAddCommand.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * @author Phong Nguyen Le - Sep 16, 2005
- * @since 1.0
- */
-public class ProcessElementAddCommand extends MethodElementAddCommand 
-implements IResourceAwareCommand
-{
-
-	public ProcessElementAddCommand(Command command) {
-		// disable run with progress bar when adding in process editor
-		//
-		super(command, false);
-	}
-
-	public ProcessElementAddCommand(Command command, boolean runWithProgress) {
-		super(command, runWithProgress);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.MethodElementAddCommand#getFeaturesToCheck()
-	 */
-	protected Collection getFeaturesToCheck() {
-		if (featuresToCheck == null) {
-			super.getFeaturesToCheck().add(
-					UmaPackage.eINSTANCE
-							.getDescribableElement_PresentationName());
-		}
-		return featuresToCheck;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.MethodElementAddCommand#willSaveModifiedResources()
-	 */
-	protected boolean willSaveModifiedResources() {
-		// don't save the resources after each add
-		//
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.MethodElementAddCommand#saveModifiedResources()
-	 */
-	protected void saveModifiedResources() {
-		// don't save the resources after each add
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.MethodElementAddCommand#createValidator(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)
-	 */
-	protected IValidator createValidator(EObject e, EStructuralFeature feature) {
-		EditingDomain domain = addCommand.getDomain();
-		if (e instanceof BreakdownElement
-				&& addCommand.getFeature() instanceof EReference
-				&& domain instanceof AdapterFactoryEditingDomain) {
-			return IValidatorFactory.INSTANCE.createValidator(addCommand.getOwner(), null, e,
-					feature, ((AdapterFactoryEditingDomain) domain).getAdapterFactory());
-		}
-		return super.createValidator(e, feature);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessElementDeleteCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessElementDeleteCommand.java
deleted file mode 100644
index ff68661..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ProcessElementDeleteCommand.java
+++ /dev/null
@@ -1,268 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * @author Phong Nguyen Le - Jan 26, 2006
- * @since  1.0
- */
-public class ProcessElementDeleteCommand extends
-		DeleteMethodElementCommand {
-	private Set contentsToRemove;
-
-	private ArrayList elementsToRemoveReferences;
-
-	private boolean ownedElementsIncluded;
-
-	/**
-	 * @param command
-	 * @param elements
-	 */
-	public ProcessElementDeleteCommand(Command command, Collection elements) {
-		super(command, elements);
-	}
-	
-	/**
-	 * @param command
-	 * @param elements
-	 * @param confirmRemoveRefs
-	 */
-	public ProcessElementDeleteCommand(Command command, Collection elements, boolean confirmRemoveRefs) {
-		super(command, elements, confirmRemoveRefs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.DeleteMethodElementCommand#execute()
-	 */
-	public void execute() {
-		if(!ownedElementsIncluded) {
-			Collection ownedElements = getOwnedElements(elements);
-			if(!ownedElements.isEmpty()) {
-				includeElements(ownedElements);
-			}
-			ownedElementsIncluded = true;
-		}
-		
-		super.execute();
-	}
-	
-	protected Collection getOwnedElements(Collection elements) {
-		ArrayList ownedElements = new ArrayList();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if(element instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpd = ((WorkProductDescriptor)element);
-				WorkProduct wp = wpd.getWorkProduct();
-				if(wp instanceof Artifact) {
-					Iterator iter1 = new AbstractTreeIterator(wp, false) {
-
-						/**
-						 * Comment for <code>serialVersionUID</code>
-						 */
-						private static final long serialVersionUID = 422181782268878289L;
-
-						protected Iterator getChildren(Object object) {
-							return ((Artifact)object).getContainedArtifacts().iterator();
-						}
-						
-					};
-					HashSet workProducts = new HashSet();
-					while(iter1.hasNext()) {
-						workProducts.add(iter1.next());
-					}
-					Activity activity = UmaUtil.getParentActivity(wpd);
-					for (Iterator iterator = activity.getBreakdownElements().iterator(); iterator.hasNext();) {
-						Object be = iterator.next();
-						if (be instanceof WorkProductDescriptor
-								&& workProducts.contains(((WorkProductDescriptor) be)
-										.getWorkProduct())) {
-							ownedElements.add(be);
-						}
-					}
-					
-				}
-			}
-		}
-		return ownedElements;
-	}
-
-	protected void excludeElements(Collection excludedElements) {
-		elements.removeAll(excludedElements);
-		for (Iterator iter = excludedElements.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			RemoveCommand cmd = getRemoveCommand(element);
-			if(cmd != null) {
-				cmd.getCollection().remove(element);
-			}
-		}
-	}
-	
-	protected void includeElements(Collection includedElements) {
-		for (Iterator iter = includedElements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if(!elements.contains(element)) {
-				elements.add(element);
-				RemoveCommand cmd = getRemoveCommand(element);
-				if(cmd != null) {
-					Collection collection = cmd.getCollection();
-					if(!collection.contains(element)) {
-						collection.add(element);
-					}
-				}
-			}
-		}
-	}
-
-	public Collection getElementsToRemoveReferences() {
-		if (elementsToRemoveReferences == null) {
-			elementsToRemoveReferences = new ArrayList();
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof Activity) {
-					EObject pkg = ((Activity) element).eContainer();
-					if (pkg != null) {
-						elementsToRemoveReferences.add(pkg);
-					} else {
-						elementsToRemoveReferences.add(element);
-					}
-				} else {
-					elementsToRemoveReferences.add(element);
-				}
-			}
-		}
-		return elementsToRemoveReferences;
-	}
-
-	protected boolean canRemoveReferences(org.eclipse.epf.uma.MethodElement e) {
-		return true;
-	}
-
-	protected void removeReferences() {
-		contentsToRemove = new HashSet();
-		// have to remove the deleted process elements from its container
-		// and/or resource
-		// so super.removeReferences() can remove their references
-		//
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object obj = iter.next();
-			if (obj instanceof EObject) {
-				EObject eObj = (EObject) obj;
-				if (obj instanceof Activity) {
-					Activity act = (Activity) obj;
-
-					// remove content of the activity from its resource
-					//
-					// removeContentFromResource(act, modifiedResources);
-					if (ContentDescriptionFactory.hasPresentation(act)) {
-						contentsToRemove.add(act.getPresentation());
-					}
-
-					// remove the process package of this activity
-					//
-					EObject container = eObj.eContainer();
-					if (container != null) {
-						EcoreUtil.remove(container);
-						for (Iterator iterator = container.eAllContents(); iterator
-								.hasNext();) {
-							Object element = iterator.next();
-							if (element instanceof Activity) {
-								act = (Activity) element;
-
-								// remove content of the activity from its
-								// resource
-								//
-								// removeContentFromResource(act,
-								// modifiedResources);
-								if (ContentDescriptionFactory
-										.hasPresentation(act)) {
-									contentsToRemove.add(act
-											.getPresentation());
-								}
-							}
-						}
-					}
-				} else {
-					EcoreUtil.remove((EObject) obj);
-				}
-			}
-		}
-
-		super.removeReferences();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DeleteMethodElementCommand#deleteContent()
-	 */
-	protected void deleteContent() throws Exception {
-		for (Iterator iter = contentsToRemove.iterator(); iter.hasNext();) {
-			EcoreUtil.remove((EObject) iter.next());
-		}
-		elementsToDeleteContent.addAll(contentsToRemove);
-		super.deleteContent();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.DeleteMethodElementCommand#collectObjectsToRemove(java.util.Collection, org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject, java.util.Collection)
-	 */
-	protected boolean collectObjectsToRemove(Collection objectsToRemove, EObject elementToDelete, EObject referencer, Collection references) {
-		boolean ret = super.collectObjectsToRemove(objectsToRemove, elementToDelete,
-				referencer, references);
-		for (Iterator iter = references.iterator(); iter.hasNext();) {
-			EReference ref = (EReference) iter.next();
-			if(ref == UmaPackage.eINSTANCE.getUMASemanticModelBridge_Element()) {
-				EObject container = referencer.eContainer();
-				if(container != null && container.eContainer() != null) {
-					objectsToRemove.add(container);
-					ret = true;
-				}
-			}
-		}
-		return ret;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.CommandWrapper#dispose()
-	 */
-	public void dispose() {
-		if(contentsToRemove != null) {
-			contentsToRemove.clear();
-		}
-		if(elementsToRemoveReferences != null) {
-			elementsToRemoveReferences.clear();
-		}
-		
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RemoveUnusedDescriptorsCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RemoveUnusedDescriptorsCommand.java
deleted file mode 100644
index 7fd6c73..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RemoveUnusedDescriptorsCommand.java
+++ /dev/null
@@ -1,157 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * @author Phong Nguyen Le - Nov 30, 2005
- * @since 1.0
- */
-public class RemoveUnusedDescriptorsCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	public static final Object[] TASK_DESCRIPTOR__RELATIONSHIPS = {
-		UmaPackage.eINSTANCE.getTaskDescriptor_AdditionallyPerformedBy(),		
-		UmaPackage.eINSTANCE.getTaskDescriptor_AssistedBy(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_ExternalInput(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput(),
-		UmaPackage.eINSTANCE.getTaskDescriptor_Output()
-	};
-	
-	public static final Object[] ROLE_DESCRIPTOR__RELATIONSHIPS = {
-		AssociationHelper.RoleDescriptor_AssistsIn_TaskDescriptors,
-		AssociationHelper.RoleDescriptor_AdditionalTaskDescriptors,
-		UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor()
-	};
-	
-	public static final Object[] WORK_PRODUCT_DESCRIPTOR__RELATIONSHIPS = {
-		UmaPackage.eINSTANCE.getWorkProductDescriptor_ImpactedBy(),
-		UmaPackage.eINSTANCE.getWorkProductDescriptor_Impacts(),
-		AssociationHelper.WorkProductDescriptor_MandatoryInputTo_TaskDescriptors,
-		AssociationHelper.WorkProductDescriptor_ExternalInputTo_TaskDescriptors,
-		AssociationHelper.WorkProductDescriptor_OptionalInputTo_TaskDescriptors,
-		AssociationHelper.WorkProductDescriptor_OutputFrom_TaskDescriptors,
-		AssociationHelper.WorkProductDescriptor_ResponsibleRoleDescriptors
-	};
-	
-	private HashSet removedDescriptors;
-	protected boolean aborted; 
-
-	/**
-	 * 
-	 */
-	public RemoveUnusedDescriptorsCommand() {
-		super();
-	}
-
-	/**
-	 * @param label
-	 */
-	public RemoveUnusedDescriptorsCommand(String label) {
-		super(label);
-	}
-
-	/**
-	 * @param label
-	 * @param description
-	 */
-	public RemoveUnusedDescriptorsCommand(String label, String description) {
-		super(label, description);
-	}
-	
-	public boolean isAborted() {
-		return aborted;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-	}
-
-	private Object getParent(Descriptor obj) {
-		// AdapterFactory factory = null;
-		// if (obj instanceof RoleDescriptor) {
-		// factory = TngAdapterFactory.INSTANCE
-		// .getOBS_ComposedAdapterFactory();
-		// } else if (obj instanceof TaskDescriptor) {
-		// factory = TngAdapterFactory.INSTANCE
-		// .getWBS_ComposedAdapterFactory();
-		// } else if (obj instanceof WorkProductDescriptor) {
-		// factory = TngAdapterFactory.INSTANCE
-		// .getPBS_ComposedAdapterFactory();
-		// }
-		//
-		// ItemProviderAdapter provider = (ItemProviderAdapter)
-		// factory.adapt(obj,
-		// ITreeItemContentProvider.class);
-		// Object act = provider.getParent(obj);
-		//
-		// return act;
-
-		return UmaUtil.getParentActivity(obj);
-	}
-
-	protected void delete(Object[] refTobeDeleted) {
-		if (refTobeDeleted != null) {
-			for (int i = 0; i < refTobeDeleted.length; i++) {
-				Descriptor obj = (Descriptor) refTobeDeleted[i];
-				// get parent and remove ref object
-				Object act = getParent(obj);
-				if (act instanceof Activity) {
-					if (((Activity) act).getBreakdownElements().remove(obj)) {
-						getRemovedDescriptors().add(obj);
-					}
-				}
-			}
-		}
-	}
-
-	public Collection getRemovedDescriptors() {
-		if (removedDescriptors == null) {
-			removedDescriptors = new HashSet();
-		}
-		return removedDescriptors;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ReplaceActivityCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ReplaceActivityCommand.java
deleted file mode 100644
index ab3f909..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ReplaceActivityCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-
-/**
- * @author Phong Nguyen Le - Oct 10, 2005
- * @since 1.0
- */
-public class ReplaceActivityCommand extends VaryActivityCommand {
-
-	/**
-	 * @param wrapper
-	 */
-	public ReplaceActivityCommand(BreakdownElementWrapperItemProvider wrapper) {
-		super(wrapper);
-		setLabel(LibraryEditResources.localReplaces_text); 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.VaryActivityCommand#doVary()
-	 */
-	protected void doVary() {
-		ProcessUtil.replaceActivityLocally(wrapper, createdActivities);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RoleAssociation.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RoleAssociation.java
deleted file mode 100644
index bd86a78..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RoleAssociation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RoleAssociation {
-
-	public static final int PRIMARY = 0;
-
-	public static final int ADDITIONAL = 1;
-
-	public static final int ASSISTED = 2;
-
-	private int type;
-
-	private RoleDescriptor roleDescriptor;
-
-	private TaskDescriptor taskDescriptor;
-
-	private RoleDescriptor oldRoleDescriptor;
-
-	public RoleAssociation(int type, RoleDescriptor roleDescriptor,
-			TaskDescriptor taskDescriptor) {
-		this.type = type;
-		this.roleDescriptor = roleDescriptor;
-		this.taskDescriptor = taskDescriptor;
-	}
-
-	public RoleDescriptor getOldRoleDescriptor() {
-		return oldRoleDescriptor;
-	}
-
-	public void setOldRoleDescriptor(RoleDescriptor oldRoleDescriptor) {
-		this.oldRoleDescriptor = oldRoleDescriptor;
-	}
-
-	public RoleDescriptor getRoleDescriptor() {
-		return roleDescriptor;
-	}
-
-	public TaskDescriptor getTaskDescriptor() {
-		return taskDescriptor;
-	}
-
-	public int getType() {
-		return type;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RoleTeamProfileAssociation.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RoleTeamProfileAssociation.java
deleted file mode 100644
index 49928f1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/RoleTeamProfileAssociation.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-/**
- * @author Phong Nguyen Le - Jul 29, 2005
- * @since 1.0
- */
-public class RoleTeamProfileAssociation {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeCommand.java
deleted file mode 100644
index 269e51a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeCommand.java
+++ /dev/null
@@ -1,635 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.BatchCommand;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command for one-way synchronization from method to process.
- * 
- * @author Phong Nguyen Le - Nov 22, 2005
- * @since 1.0
- */
-public class SynchronizeCommand extends CompoundCommand implements
-		IResourceAwareCommand {
-
-	private Collection elements;
-
-	private IConfigurator configurator;
-
-	protected boolean aborted;
-
-	private ArrayList deleteList;
-
-	protected boolean preExecSuccessful;
-
-	protected List deleteCommandList;
-
-	protected boolean successful;
-
-	private MethodConfiguration config;
-
-	private Set synchFeatures;
-
-	private DeleteUnusedDescriptorsCommand deleteUnusedDescriptorsCommand;
-	
-	private Collection activities;
-
-	private boolean showSuccessfulMsg = true;
-
-	private boolean intialized;
-	
-	private BatchCommand batchCommand = new BatchCommand(false);
-	private Map<VariabilityElement, VariabilityElement> replacerToBaseMap = new HashMap<VariabilityElement, VariabilityElement>();  
-
-//	private Object UIContext;
-
-	/**
-	 * Constructs a SynchronizeCommand that use the process default
-	 * configuration to synchronize all the synchronizable features
-	 * 
-	 * @param elements
-	 *            a list of BreakdownElement objects
-	 */
-	public SynchronizeCommand(String label, Collection elements) {
-		super(label);
-		this.elements = elements;
-	}
-	
-	/**
-	 * Constructs a SynchronizeCommand that use the given configuration 
-	 * and list of synchronizable features to synchronize
-	 * 
-	 * @param elements
-	 * @param config the configuration
-	 * @param synchFeatures the synchronizable features
-	 */
-	public SynchronizeCommand(Collection elements, MethodConfiguration config, Set synchFeatures, boolean showSuccessfulMsg) {
-		super(LibraryEditResources.AutoSynchronizeCommand_label); 
-		this.elements = elements;
-		this.config = config;
-		this.synchFeatures = synchFeatures;
-		this.showSuccessfulMsg = showSuccessfulMsg; 
-	}
-	
-	public void setMethodConfiguration(MethodConfiguration config) {
-		this.config = config;
-		if(configurator != null) {
-			configurator.setMethodConfiguration(config);
-		}
-	}
-	
-	public void setSynchronizationFeatures(Set synchFeatures) {
-		this.synchFeatures = synchFeatures;
-	}
-	
-	private boolean doInitialize() {
-		commandList.clear();
-		
-		if (elements == null || elements.isEmpty()) {
-			return false;
-		}
-
-		deleteCommandList = new ArrayList();
-		deleteList = new ArrayList();
-		activities = new ArrayList();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			addToDeleteList(element, deleteList);
-			if(element instanceof Activity) {
-				activities.add(element);
-			}
-		}
-		elements.removeAll(deleteList);
-		
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object object = iter.next();
-			if (object instanceof Descriptor) {
-				Descriptor descriptor = (Descriptor) object;
-				if (descriptor.getIsSynchronizedWithSource().booleanValue()
-						&& !deleteList.contains(descriptor)) {
-					if(descriptor.getSuperActivities() == null) {						
-						// descriptor is used by TeamProfile to represent a role or used by a deliverable descriptor to
-						// represent a deliverable part
-						//
-						if(descriptor instanceof WorkProductDescriptor && ((WorkProductDescriptor)descriptor).getWorkProduct() instanceof Deliverable) {
-							append(new SynchronizeDeliverableDescriptorCommand((WorkProductDescriptor) descriptor, synchFeatures, config));
-						}
-						else {
-							append(new BasicSynchronizeDescriptorCommand(descriptor, synchFeatures, config));
-						}
-					}
-					else {
-						Activity act = descriptor.getSuperActivities();
-						if (object instanceof TaskDescriptor) {
-							Task task = ((TaskDescriptor) object).getTask();
-							if (task != null) {
-								if(replacerToBaseMap.containsKey(task)) {
-									task = (Task) replacerToBaseMap.get(task);
-								}
-								append(new WBSDropCommand(act, Collections
-										.singletonList(task), config, synchFeatures));
-							}
-						} else if (object instanceof RoleDescriptor) {
-							Role role = ((RoleDescriptor) object).getRole();
-							if (role != null) {
-								if(replacerToBaseMap.containsKey(role)) {
-									role = (Role) replacerToBaseMap.get(role);
-								}
-								append(new OBSDropCommand(act, Collections
-										.singletonList(role), config, synchFeatures, configurator));
-							}
-						} else if (object instanceof WorkProductDescriptor) {
-							WorkProduct wp = ((WorkProductDescriptor) object)
-							.getWorkProduct();
-							if (wp != null) {
-								if(replacerToBaseMap.containsKey(wp)) {
-									wp = (WorkProduct) replacerToBaseMap.get(wp);
-								}
-								append(new PBSDropCommand(act, Collections
-										.singletonList(wp), config, synchFeatures, configurator));
-							}
-						}
-					}
-				}
-			} else if (object instanceof Activity) {
-				appendCommands((Activity) object);
-			} else if (object instanceof TeamProfile) {
-				appendCommands((TeamProfile)object);
-			}
-		}
-		return !deleteList.isEmpty() || !commandList.isEmpty() || !activities.isEmpty();
-	}
-
-	public boolean initilize() {
-		boolean b = isPrepared;
-		try {
-			// since Eclipse 3.3, CompoundCommand.append() throws IllegalStateException if isPrepared is already set
-			// but this method is called after isPrepared is set in canExecute() and it makes many calls to append()
-			// work-around is to unset isPrepared at beginning of this method and set it back to old value at method end.
-			//
-			isPrepared = false;
-			return intialized = doInitialize();		
-		}
-		finally {
-			isPrepared = b;
-		}
-	}
-	
-	/**
-	 * @return the intialized
-	 */
-	public boolean isIntialized() {
-		return intialized;
-	}
-
-	/**
-	 * @param activity
-	 */
-	private void appendCommands(Activity activity) {
-		List tasks = new ArrayList();
-		List roles = new ArrayList();
-		List workProducts = new ArrayList();
-		List activities = new ArrayList();
-		for (Iterator iter = activity.getBreakdownElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Descriptor) {
-				if (((Descriptor) element).getIsSynchronizedWithSource()
-						.booleanValue()
-						&& !deleteList.contains(element)) {
-					if (element instanceof TaskDescriptor) {
-						Task task = ((TaskDescriptor) element).getTask();
-						if (task != null) {
-							if(replacerToBaseMap.containsKey(task)) {
-								task = (Task) replacerToBaseMap.get(task);
-							}
-							tasks.add(task);
-						}
-					} else if (element instanceof RoleDescriptor) {
-						Role role = ((RoleDescriptor) element).getRole();
-						if (role != null) {
-							if(replacerToBaseMap.containsKey(role)) {
-								role = (Role) replacerToBaseMap.get(role);
-							}
-							roles.add(role);
-						}
-					} else if (element instanceof WorkProductDescriptor) {
-						WorkProduct wp = ((WorkProductDescriptor) element)
-								.getWorkProduct();
-						if (wp != null) {
-							if(replacerToBaseMap.containsKey(wp)) {
-								wp = (WorkProduct) replacerToBaseMap.get(wp);
-							}
-							workProducts.add(wp);
-						}
-					}
-				}
-			} else if (element instanceof Activity) {
-				activities.add(element);
-			} else if (element instanceof TeamProfile) {
-				appendCommands((TeamProfile)element);
-			}
-		}
-		if (!tasks.isEmpty()) {
-			append(new WBSDropCommand(activity, tasks, config, synchFeatures));
-		}
-		if (!roles.isEmpty()) {
-			append(new OBSDropCommand(activity, roles, config, synchFeatures, configurator));
-		}
-		if (!workProducts.isEmpty()) {
-			append(new PBSDropCommand(activity, workProducts, config,
-					synchFeatures, configurator));
-		}
-		for (Iterator iter = activities.iterator(); iter.hasNext();) {
-			appendCommands((Activity) iter.next());
-		}
-	}
-	
-	private void appendCommands(TeamProfile team) {
-		Iterator iter = new AbstractTreeIterator(team, false) {
-
-			/**
-			 * 
-			 */
-			private static final long serialVersionUID = 1L;
-
-			protected Iterator getChildren(Object object) {
-				if(object instanceof TeamProfile) {
-					TeamProfile team = ((TeamProfile)object);
-					List children = new ArrayList(team.getSubTeam());
-					children.addAll(team.getTeamRoles());
-					return children.iterator();
-				}
-				else {
-					return Collections.EMPTY_LIST.iterator();
-				}
-			}
-			
-		};
-		while(iter.hasNext()) {
-			Object obj = iter.next();
-			
-			// synch only own role descriptor of team profile
-			//
-			if(obj instanceof RoleDescriptor && ((RoleDescriptor)obj).getSuperActivities() == null) {
-				append(new BasicSynchronizeDescriptorCommand((Descriptor) obj, synchFeatures, config));
-			}
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		HashSet modifiedResources = new HashSet();
-		for (Iterator iter = commandList.iterator(); iter.hasNext();) {
-			
-			Object cmd = iter.next();
-			if(cmd instanceof IResourceAwareCommand) {
-				modifiedResources.addAll(((IResourceAwareCommand)cmd).getModifiedResources());
-			}
-		}
-		return modifiedResources;
-	}
-	
-//	public void setUIContext(Object UIContext) {
-//		this.UIContext = UIContext;
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CompoundCommand#execute()
-	 */
-	public void execute() {
-		// delete all descriptors whose linked element are no longer in the
-		// configuration
-		//
-		if (!deleteList.isEmpty()) {
-			Command cmd = delete(deleteList);
-			if (cmd != null) {
-				deleteCommandList.add(cmd);
-			}
-		}
-		
-		batchCommand.execute();
-		
-		if (!aborted) {
-//			IRunnableWithProgress runnable = new IRunnableWithProgress() {
-//
-//				public void run(IProgressMonitor monitor)
-//						throws InvocationTargetException, InterruptedException {
-//					preExecSuccessful = preExecute();
-//				}
-//
-//			};
-//						
-//			UserInteractionHelper.runWithProgress(runnable, false, null);
-//
-//			if (preExecSuccessful) {
-//				try {
-//					BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
-//						
-//						public void run() {
-//							superRedo();
-//							successful = true;
-//						}
-//						
-//					});
-//				}
-//				catch(RuntimeException e) {
-//					LibraryEditPlugin.getDefault().getMsgDialog().displayError(getLabel(), e.toString());
-//				}
-//			}
-			
-			Runnable runnable = new Runnable() {
-
-				public void run() {
-					preExecSuccessful = preExecute();
-					if(preExecute()) {
-						superRedo();
-						successful = true;
-					}
-				}
-
-			};
-			UserInteractionHelper.runInUI(runnable, getLabel());
-			
-			if (successful) {				
-				if(!activities.isEmpty()) {
-					if(deleteUnusedDescriptorsCommand == null) {
-						deleteUnusedDescriptorsCommand = new DeleteUnusedDescriptorsCommand(elements, true, deleteList) {
-							
-							protected Command delete(List elements) {
-								return SynchronizeCommand.this.delete(elements);
-							}
-							
-						};
-						deleteCommandList.add(deleteUnusedDescriptorsCommand);
-					}
-					deleteUnusedDescriptorsCommand.execute();
-				}
-				
-				if (showSuccessfulMsg) {
-					if(!replacerToBaseMap.isEmpty()) {
-						refreshViewer();
-					}
-					Messenger.INSTANCE.showInfo(
-									LibraryEditResources.SynchronizeCompleteDialog_Title,
-									LibraryEditResources.AutoSynchronizeCommand_sucessful);
-				}
-			}
-		}
-	}
-
-	private void refreshViewer() {
-		if(elements.isEmpty())  return;
-		Process proc = TngUtil.getOwningProcess(elements.iterator().next());
-		if(proc != null) {
-			for (int i = 0; i < TngAdapterFactory.processAdapterFactories.length; i++) {
-				AdapterFactory adapterFactory = TngAdapterFactory.processAdapterFactories[i];
-				ProcessUtil.refreshViewer(adapterFactory, proc);
-			}
-		}
-	}
-
-	private void superRedo() {
-		super.redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CompoundCommand#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-
-	public boolean isSucessful() {
-		return successful;
-	}
-
-	protected boolean preExecute() {
-		for (ListIterator commands = commandList.listIterator(); commands
-				.hasNext();) {
-			Object command = commands.next();
-			if(command instanceof BSDropCommand && !((BSDropCommand)command).preExecute()) {
-				return false;
-			}
-			
-			// be polite to other threads (no effect on some platforms)
-			//
-			Thread.yield();
-		}
-		return true;
-	}
-
-	/**
-	 * Deletes the specified elements
-	 * @param elements
-	 * @return the executed command that deleted the given elements
-	 */
-	protected Command delete(List elements) {
-		EditingDomain domain = new AdapterFactoryEditingDomain(
-				TngAdapterFactory.INSTANCE.getProcessComposedAdapterFactory(),
-				new BasicCommandStack());
-		Command cmd = new ProcessElementDeleteCommand(RemoveCommand.create(domain,
-				elements), elements);
-		cmd.execute();
-		return cmd;
-	}
-
-	private IConfigurator getConfigurator() {
-		if (configurator == null) {
-			MethodConfiguration config = this.config;
-			if(config == null) {
-				Process proc = TngUtil.getOwningProcess((BreakdownElement) elements
-						.iterator().next());
-				config = proc.getDefaultContext();
-			}
-			configurator = Providers.getConfiguratorFactory()
-					.createConfigurator(config);
-		}
-		return configurator;
-	}
-
-	/**
-	 * @param element
-	 * @param deleteList
-	 */
-	private void addToDeleteList(Object element, List deleteList) {
-		if (element instanceof Descriptor) {
-			if (!getConfigurator().accept(element)) {
-				MethodElement linkedElement = ProcessUtil.getAssociatedElement((Descriptor) element);				
-				if(linkedElement instanceof VariabilityElement && TngUtil.isReplacer((VariabilityElement) linkedElement)) {
-					// if the linked element of the descriptor is a replacer, delete the descriptor in this synchronization
-					// only if the base of linked element is not in the configuration
-					//
-					VariabilityElement base = ((VariabilityElement)linkedElement).getVariabilityBasedOnElement();
-					while(base != null && TngUtil.isContributorOrReplacer(base)) {
-						base = base.getVariabilityBasedOnElement();
-					}
-					if(base != null) {
-						if(!getConfigurator().accept(base)) {
-							deleteList.add(element);
-						}
-						else {
-							batchCommand.addFeatureValue((EObject) element, 
-									ProcessUtil.getLinkReference((Descriptor) element), base);
-							replacerToBaseMap.put((VariabilityElement) linkedElement, base);
-						}
-					}
-				}
-				else {
-					deleteList.add(element);
-				}
-			}
-		} else if (element instanceof Activity) {
-			for (Iterator iter = ((Activity) element).getBreakdownElements()
-					.iterator(); iter.hasNext();) {
-				addToDeleteList(iter.next(), deleteList);
-			}
-		}
-	}
-
-	private void superUndo() {
-		super.undo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CompoundCommand#undo()
-	 */
-	public void undo() {
-		UserInteractionHelper.getUIHelper().runWithBusyIndicator(new Runnable() {
-
-			public void run() {
-				if (!deleteCommandList.isEmpty()) {
-					for (ListIterator commands = deleteCommandList
-							.listIterator(deleteCommandList.size()); commands
-							.hasPrevious();) {
-						try {
-							Command command = (Command) commands.previous();
-							command.undo();
-						} catch (RuntimeException exception) {
-							// Skip over the command that threw the exception.
-							//
-							commands.next();
-
-							try {
-								// Iterate forward over the undone commands to
-								// redo them.
-								//
-								while (commands.hasNext()) {
-									Command command = (Command) commands.next();
-									command.redo();
-								}
-							} catch (RuntimeException nestedException) {
-								CommonPlugin.INSTANCE
-										.log(new WrappedException(
-												CommonPlugin.INSTANCE
-														.getString("_UI_IgnoreException_exception"), nestedException).fillInStackTrace()); //$NON-NLS-1$
-							}
-
-							throw exception;
-						}
-					}
-				}
-
-				superUndo();
-				
-				batchCommand.undo();
-			}
-
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CompoundCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.CompoundCommand#dispose()
-	 */
-	public void dispose() {
-		if(activities != null) {
-			activities.clear();
-		}
-		if(deleteCommandList != null) {
-			for (Iterator iter = deleteCommandList.iterator(); iter.hasNext();) {
-				Command cmd = (Command) iter.next();
-				cmd.dispose();
-			}
-		}
-		if(deleteList != null) {
-			deleteList.clear();
-		}
-		
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeDeliverableDescriptorCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeDeliverableDescriptorCommand.java
deleted file mode 100644
index 6775e7b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeDeliverableDescriptorCommand.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command to synchronize attributes and deliverable parts of a deliverable descriptor
- * 
- * @author Phong Nguyen Le - Feb 9, 2006
- * @since  1.0
- */
-public class SynchronizeDeliverableDescriptorCommand extends
-		BasicSynchronizeDescriptorCommand {
-	
-	private Set descriptorsToRefresh;
-	private Map wpDescToDeliverableParts;
-	private DescriptorUpdateBatchCommand  updateDeliverablePartsCmd;
-	
-	/**
-	 * @param descriptor
-	 * @param synchFeatures
-	 * @param config
-	 */
-	public SynchronizeDeliverableDescriptorCommand(WorkProductDescriptor descriptor,
-			Set synchFeatures, MethodConfiguration config) {
-		super(descriptor, synchFeatures, config);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.command.BasicSynchronizeDescriptorCommand#execute()
-	 */
-	public void execute() {
-		// update linked element if needed
-		// synchronize attributes
-		//
-		super.execute();
-		
-		if(descriptorsToRefresh == null) {
-			descriptorsToRefresh = new HashSet();
-		}
-		else {
-			descriptorsToRefresh.clear();
-		}
-		if(wpDescToDeliverableParts == null) {
-			wpDescToDeliverableParts = new HashMap();
-		}
-		else {
-			wpDescToDeliverableParts.clear();
-		}
-		WorkProductDescriptor wpd = (WorkProductDescriptor) descriptor;
-		ProcessCommandUtil.createDeliverableParts(wpd, (Deliverable)wpd.getWorkProduct(), config,
-				wpDescToDeliverableParts, descriptorsToRefresh);
-		
-		if(!wpDescToDeliverableParts.isEmpty() || !descriptorsToRefresh.isEmpty()) {
-			if(updateDeliverablePartsCmd == null) {
-				updateDeliverablePartsCmd = new DescriptorUpdateBatchCommand(true, synchFeatures, config);
-				updateDeliverablePartsCmd.setDescriptorsToRefresh(descriptorsToRefresh);
-			}
-			else {
-				updateDeliverablePartsCmd.getObjectToNewFeatureValuesMap().clear();
-			}
-			for (Iterator iter = wpDescToDeliverableParts.entrySet().iterator(); iter
-			.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Object wpDesc = entry.getKey();
-				updateDeliverablePartsCmd.getObjectToNewFeatureValuesMap().put(wpDesc, 
-						Collections.singletonMap(UmaPackage.eINSTANCE.getWorkProductDescriptor_DeliverableParts(), entry.getValue()));
-			}
-			
-			updateDeliverablePartsCmd.execute();
-		}		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.command.BasicSynchronizeDescriptorCommand#undo()
-	 */
-	public void undo() {
-		if(updateDeliverablePartsCmd != null) {
-			updateDeliverablePartsCmd.undo();
-		}
-		
-		super.undo();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose() {		
-		super.dispose();
-		
-		if(updateDeliverablePartsCmd != null) {
-			updateDeliverablePartsCmd.dispose();
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/UpdateSuppressionFromBaseCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/UpdateSuppressionFromBaseCommand.java
deleted file mode 100644
index 9e78353..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/UpdateSuppressionFromBaseCommand.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-
-/**
- * @author Phong Nguyen Le - Feb 10, 2006
- * @since  1.0
- */
-public class UpdateSuppressionFromBaseCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	private Suppression suppression;
-	private Collection elements;
-	private HashSet inheritedElements;
-	private AdapterFactory adapterFactory;
-	private Collection affectedObjects;
-	private HashMap objectToSuppressionStateMap;
-
-	/**
-	 * 
-	 */
-	public UpdateSuppressionFromBaseCommand() {
-		super();
-	}
-
-	/**
-	 * @param label
-	 */
-	public UpdateSuppressionFromBaseCommand(String label, Collection elements, AdapterFactory adapterFactory, Suppression suppression) {
-		super(label);
-		this.elements = elements;
-		this.adapterFactory = adapterFactory;
-		this.suppression = suppression;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-	 */
-	public void dispose() {
-		if(affectedObjects != null) {
-			affectedObjects.clear();
-			affectedObjects = null;
-		}
-		
-		if(inheritedElements != null) {
-			inheritedElements.clear();
-			inheritedElements = null;
-		}
-		
-		if(objectToSuppressionStateMap != null) {
-			objectToSuppressionStateMap.clear();
-			objectToSuppressionStateMap = null;
-		}
-		
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		Resource resource = suppression.getProcess().eResource();
-		if(resource != null) {
-			return Collections.singletonList(resource);
-		}
-		else {
-			return Collections.EMPTY_LIST;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		if(affectedObjects == null) {
-			return super.getAffectedObjects();
-		}
-		else {
-			return affectedObjects;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		if(affectedObjects == null) {
-			affectedObjects = new ArrayList();
-		}
-		else {
-			affectedObjects.clear();
-		}
-		
-		if(objectToSuppressionStateMap == null) {
-			objectToSuppressionStateMap = new HashMap();
-		}
-		else {
-			objectToSuppressionStateMap.clear();
-		}
-		
-		for (Iterator iter = getInheritedElements().iterator(); iter.hasNext();) {
-			BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) iter.next();
-			boolean wasSuppressed = suppression.isInSuppressedList(wrapper);
-			if(suppression.updateSuppressionFromBase(wrapper)) {
-				affectedObjects.add(wrapper);
-				objectToSuppressionStateMap.put(wrapper, Boolean.valueOf(wasSuppressed));
-			}										
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {		
-		execute();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		if(objectToSuppressionStateMap != null && !objectToSuppressionStateMap.isEmpty()) {
-			for (Iterator iter = objectToSuppressionStateMap.entrySet().iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Boolean suppressed = (Boolean) entry.getValue();
-				if(suppressed.booleanValue()) {
-					suppression.suppress(Collections.singletonList(entry.getKey()));
-				}
-				else {
-					suppression.reveal(Collections.singletonList(entry.getKey()));
-				}
-			}
-			affectedObjects.clear();
-			affectedObjects.addAll(elements);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-
-	private Collection getInheritedElements() {
-		if(inheritedElements == null) {
-			inheritedElements = new HashSet();
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				Object element = (Object) iter.next();
-				for (Iterator treeIter = new AdapterFactoryTreeIterator(adapterFactory, element); treeIter.hasNext();) {
-					Object e = treeIter.next();
-					if(ProcessUtil.isInherited(e)) {
-						inheritedElements.add(e);
-					}
-				}
-			}
-		}
-		return inheritedElements;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/VaryActivityCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/VaryActivityCommand.java
deleted file mode 100644
index 8243bec..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/VaryActivityCommand.java
+++ /dev/null
@@ -1,179 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.ICommandListener;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Process;
-
-
-/**
- * @author Phong Nguyen Le - Oct 10, 2005
- * @since 1.0
- */
-public abstract class VaryActivityCommand extends AbstractCommand implements
-		IResourceAwareCommand {
-
-	protected BreakdownElementWrapperItemProvider wrapper;
-
-	private Process proc;
-
-	protected List createdActivities;
-	
-	public Activity superActivity;
-
-	public VaryActivityCommand(BreakdownElementWrapperItemProvider wrapper) {
-		this.wrapper = wrapper;
-		proc = (Process) wrapper.getTopItem();
-	}
-
-	public BreakdownElementWrapperItemProvider getWrapper() {
-		return wrapper;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.command.IResourceAwareCommand#getModifiedResources()
-	 */
-	public Collection getModifiedResources() {
-		if (proc.eResource() != null) {
-			return Collections.singletonList(proc.eResource());
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-	 */
-	protected boolean prepare() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#execute()
-	 */
-	public void execute() {
-		if (createdActivities == null) {
-			createdActivities = new ArrayList();
-		} else {
-			createdActivities.clear();
-		}
-
-		doVary();
-
-		List listeners = Providers
-				.getCommandListeners(VaryActivityCommand.class);
-		if (listeners != null) {
-			for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-				ICommandListener listener = (ICommandListener) iter.next();
-				listener.notifyExecuted(this);
-			}
-		}
-	}
-
-	protected abstract void doVary();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.Command#redo()
-	 */
-	public void redo() {
-		// find the new wrapper
-		//
-		Object owner = wrapper.getOwner();
-		ITreeItemContentProvider ip = (ITreeItemContentProvider) wrapper.getAdapterFactory().adapt(owner, ITreeItemContentProvider.class);
-		for (Iterator iter = ip.getChildren(owner).iterator(); iter.hasNext();) {
-			Object child = iter.next();		
-			if(child instanceof BreakdownElementWrapperItemProvider &&
-					((BreakdownElementWrapperItemProvider)child).getValue() == wrapper.getValue()) {
-				wrapper = (BreakdownElementWrapperItemProvider) child;
-				break;
-			}
-		}
-		
-		execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-	 */
-	public void undo() {
-		List listeners = Providers
-				.getCommandListeners(VaryActivityCommand.class);
-		if (listeners != null) {
-			for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-				ICommandListener listener = (ICommandListener) iter.next();
-				listener.preUndo(this);
-			}
-		}
-
-		if (!createdActivities.isEmpty()) {
-			restoreOrder();
-			Activity act = (Activity) createdActivities.get(0);
-			superActivity = act.getSuperActivities();
-			act.setSuperActivities(null);
-			createdActivities.clear();
-		}
-		
-		if (listeners != null) {
-			for (Iterator iter = listeners.iterator(); iter.hasNext();) {
-				ICommandListener listener = (ICommandListener) iter.next();
-				listener.postUndo(this);
-			}
-		}
-	}
-
-	/**
-	 * Restores the order of the siblings of the wrapper
-	 */
-	protected void restoreOrder() {
-		Activity variedAct = (Activity) createdActivities.get(createdActivities.size() - 1);
-		BreakdownElement be = (BreakdownElement) TngUtil.unwrap(wrapper);
-		BreakdownElement prev = variedAct.getPresentedBefore();
-		if(prev != null && proc == TngUtil.getOwningProcess(prev)) {
-			prev.setPresentedAfter(be);
-		}
-		BreakdownElement next = variedAct.getPresentedAfter();
-		if(next != null && proc == TngUtil.getOwningProcess(next)) {
-			next.setPresentedBefore(be);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getResult()
-	 */
-	public Collection getResult() {
-		return createdActivities;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WBSDragAndDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WBSDragAndDropCommand.java
deleted file mode 100644
index 5a3e1f1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WBSDragAndDropCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Task;
-
-/**
- * Drag and drop command to drop tasks in WBS structure
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class WBSDragAndDropCommand extends BSDragAndDropCommand {
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param location
-	 * @param operations
-	 * @param operation
-	 * @param collection
-	 */
-	public WBSDragAndDropCommand(EditingDomain domain, Object owner,
-			float location, int operations, int operation, Collection collection) {
-		super(domain, owner, location, operations, operation, collection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDragAndDropCommand#accept(java.lang.Object)
-	 */
-	protected boolean accept(Object obj) {
-		// System.out.println("WBSDragAndDropCommand.accept(): obj="+obj);
-
-		if(obj instanceof Task) {
-			if(owner instanceof Activity) {
-				return true;
-//				return ProcessCommandUtil.getValidDescriptor(obj, (Activity) owner,
-//						((AdapterFactoryEditingDomain)domain).getAdapterFactory()) == null;
-			}
-			else {
-				return true;
-			}
-		}
-		else {
-			return false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDragAndDropCommand#createDropCommand(java.lang.Object,
-	 *      java.util.List)
-	 */
-	protected Command createDropCommand(Object owner, List dropSrc) {
-		return new WBSDropCommand((Activity) owner, dropSrc);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WBSDropCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WBSDropCommand.java
deleted file mode 100644
index 721c1e1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WBSDropCommand.java
+++ /dev/null
@@ -1,351 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.validation.UniqueNamePNameHandler;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * Command to drap and drop tasks onto an activity in work breakdown structure
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @author Jinhua Xi
- * @since 1.0
- */
-public class WBSDropCommand extends BSDropCommand {
-	private ArrayList roleDescList;
-
-	private ArrayList wpDescList;
-
-	private HashMap wpDescToDeliverableParts;
-
-	private HashMap wpdToDeliverableDescriptorMap;
-
-	private HashMap roleDescTeamProfileMap;
-	
-	private IExecutor executor;
-
-	private class Executor implements IExecutor {
-
-		public boolean preExecute() {
-			taskDescList = new ArrayList();
-			roleDescList = new ArrayList();
-			wpDescList = new ArrayList();
-			wpDescToDeliverableParts = new HashMap();
-			wpdToDeliverableDescriptorMap = new HashMap();
-			Set descriptorsToRefresh = synchronize ? batchCommand.getDescriptorsToRefresh() : null;
-
-			List bes = activity.getBreakdownElements();
-			UniqueNamePNameHandler uniqueNamesHandler = new UniqueNamePNameHandler(bes, bes);
-			
-			for (int i = 0; i < dropElements.size(); i++) {
-				Task task = (Task) dropElements.get(i);
-				TaskDescriptor desc = ProcessCommandUtil.createTaskDescriptor(task,
-						activity, roleDescList, wpDescList,
-						wpDescToDeliverableParts,
-						wpdToDeliverableDescriptorMap, descriptorsToRefresh,
-						batchCommand.getObjectToNewFeatureValuesMap(), 
-						WBSDropCommand.this.getMethodConfiguration(),
-						synchronize,
-						synchFeatures);
-				if (desc != null) {
-					uniqueNamesHandler.ensureUnique(desc);
-					taskDescList.add(desc);
-				}
-			}
-
-			// Add unique name check for roledesc and wp descriptors as well
-			for (int i = 0; i < roleDescList.size(); i++) {
-				RoleDescriptor roleDesc = (RoleDescriptor) roleDescList.get(i);			
-				if (roleDesc != null) {
-					uniqueNamesHandler.ensureUnique(roleDesc);	
-				}
-			}
-			for (int i = 0; i < wpDescList.size(); i++) {
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) wpDescList.get(i);			
-				if (wpDesc != null) {
-					uniqueNamesHandler.ensureUnique(wpDesc);	
-				}
-			}
-			return !taskDescList.isEmpty()
-					|| !roleDescList.isEmpty()
-					|| !wpDescList.isEmpty()
-					|| !wpDescToDeliverableParts.isEmpty()
-					|| !wpdToDeliverableDescriptorMap.isEmpty()
-					|| batchCommand.canExecute();
-		}
-
-		public void doExcecute() {
-			// automatically add work product descriptor to deliverable part
-			//
-			if (!wpdToDeliverableDescriptorMap.isEmpty()) {
-				for (Iterator iter = wpdToDeliverableDescriptorMap.entrySet()
-						.iterator(); iter.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					WorkProductDescriptor deliverable = (WorkProductDescriptor) entry
-							.getValue();
-					if (!deliverable.getDeliverableParts().contains(
-							entry.getKey())) {
-						try {
-							deliverable.getDeliverableParts().add(
-									entry.getKey());
-						} catch (Exception e) {
-							LibraryEditPlugin.INSTANCE
-									.log("WBSDropCommand::doExecute - Adding deliverable part to deliverable" + e); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-
-			// add task descriptors
-			//
-			activity.getBreakdownElements().addAll(taskDescList);
-
-			// add role descriptors
-			//
-			activity.getBreakdownElements().addAll(roleDescList);
-
-			// add work product descriptors
-			//
-			activity.getBreakdownElements().addAll(wpDescList);
-
-			// add deliverable parts to the work product descriptors
-			//
-			if (!wpDescToDeliverableParts.isEmpty()) {
-				for (Iterator iter = wpDescToDeliverableParts.entrySet()
-						.iterator(); iter.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					WorkProductDescriptor wpDesc = (WorkProductDescriptor) entry
-							.getKey();
-					wpDesc.getDeliverableParts().addAll(
-							(Collection) entry.getValue());
-				}
-			}
-
-			if(roleDescTeamProfileMap == null) {
-				roleDescTeamProfileMap = new HashMap();
-				for (Iterator iter = roleDescList.iterator(); iter.hasNext();) {
-					RoleDescriptor roleDesc = (RoleDescriptor) iter.next();
-					TeamProfile teamProfile = UserInteractionHelper.getTeam(
-							activity, roleDesc.getRole());
-					if (teamProfile != null) {
-						roleDescTeamProfileMap.put(roleDesc, teamProfile);
-					}
-				}
-			}
-			// add role descriptors to team profiles
-			//
-			for (Iterator iter = roleDescTeamProfileMap.entrySet().iterator(); iter
-					.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				TeamProfile team = (TeamProfile) entry.getValue();
-				team.getTeamRoles().add(entry.getKey());
-			}
-
-			// add new descriptors to activity's package
-			//
-			ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-			if (pkg != null) {
-				pkg.getProcessElements().addAll(taskDescList);
-				pkg.getProcessElements().addAll(roleDescList);
-				pkg.getProcessElements().addAll(wpDescList);
-			}
-			
-		}
-
-		public void doUndo() {
-			
-			// remove work product descriptors
-			//
-			activity.getBreakdownElements().removeAll(wpDescList);
-
-			// remove role descriptors
-			//
-			activity.getBreakdownElements().removeAll(roleDescList);
-
-			// remove task descriptors
-			//
-			activity.getBreakdownElements().removeAll(taskDescList);
-
-			// remove deliverable parts to the work product descriptors
-			//
-			if (!wpDescToDeliverableParts.isEmpty()) {
-				for (Iterator iter = wpDescToDeliverableParts.entrySet()
-						.iterator(); iter.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					WorkProductDescriptor wpDesc = (WorkProductDescriptor) entry
-							.getKey();
-					wpDesc.getDeliverableParts().removeAll(
-							(Collection) entry.getValue());
-				}
-			}
-
-			// remove work product descriptor from deliverable part
-			//
-			if (!wpdToDeliverableDescriptorMap.isEmpty()) {
-				for (Iterator iter = wpdToDeliverableDescriptorMap.entrySet()
-						.iterator(); iter.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					WorkProductDescriptor deliverable = (WorkProductDescriptor) entry
-							.getValue();
-					deliverable.getDeliverableParts().remove(entry.getKey());
-				}
-			}
-
-			// remove role descriptors from team profiles
-			//
-			for (Iterator iter = roleDescTeamProfileMap.entrySet().iterator(); iter
-					.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				TeamProfile team = (TeamProfile) entry.getValue();
-				team.getTeamRoles().remove(entry.getKey());
-			}
-
-			// remove descriptors from activity's package
-			//
-			ProcessPackage pkg = (ProcessPackage) activity.eContainer();
-			if (pkg != null) {
-				pkg.getProcessElements().removeAll(taskDescList);
-				pkg.getProcessElements().removeAll(roleDescList);
-				pkg.getProcessElements().removeAll(wpDescList);
-			}
-		}
-
-	};
-
-	/**
-	 * @param act
-	 *            the activity that the given tasks are dropped on
-	 * @param tasks
-	 *            the tasks to drop on the given activity
-	 */
-	public WBSDropCommand(Activity act, List tasks) {
-		super(act, tasks);
-		for (Iterator iter = dropElements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!(element instanceof Task)) {
-				iter.remove();
-			}
-		}
-	}
-
-	/**
-	 * @param activity
-	 * @param dropElements
-	 * @param synch
-	 */
-	public WBSDropCommand(Activity activity, List dropElements, boolean synch) {
-		super(activity, dropElements, synch);
-	}
-
-	/**
-	 * @param activity
-	 * @param dropElements
-	 * @param config
-	 * @param synchFeatures
-	 */
-	public WBSDropCommand(Activity activity, List dropElements,
-			MethodConfiguration config, Set synchFeatures) {
-		super(activity, dropElements, config, synchFeatures);
-	}
-
-	public IExecutor getExecutor() {
-		if (executor == null) {
-			executor = new Executor();
-		}
-		return executor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#preExecute()
-	 */
-	protected boolean preExecute() {
-		if (!super.preExecute())
-			return false;
-
-		return getExecutor().preExecute();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doExecute()
-	 */
-	protected void doExecute() {
-		executor.doExcecute();
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
-	 */
-	public Collection getAffectedObjects() {
-		if (taskDescList != null) {
-			return taskDescList;
-		}
-
-		return super.getAffectedObjects();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.command.BSDropCommand#doUndo()
-	 */
-	protected void doUndo() {
-		executor.doUndo();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.command.BSDropCommand#dispose()
-	 */
-	public void dispose() {
-		if (roleDescList != null) {
-			roleDescList.clear();
-		}
-		if (roleDescTeamProfileMap != null) {
-			roleDescTeamProfileMap.clear();
-		}
-		if (wpDescList != null) {
-			wpDescList.clear();
-		}
-		if (wpDescToDeliverableParts != null) {
-			wpDescToDeliverableParts.clear();
-		}
-		if (wpdToDeliverableDescriptorMap != null) {
-			wpdToDeliverableDescriptorMap.clear();
-		}
-
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WorkProductDescriptorCreateCopyCommand.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WorkProductDescriptorCreateCopyCommand.java
deleted file mode 100644
index 2b3cfbd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/WorkProductDescriptorCreateCopyCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.command;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-
-
-/**
- * @author Phong Nguyen Le - Oct 12, 2005
- * @since 1.0
- */
-public class WorkProductDescriptorCreateCopyCommand extends
-		MethodElementCreateCopyCommand {
-
-	/**
-	 * @param domain
-	 * @param owner
-	 * @param copyHelper
-	 */
-	public WorkProductDescriptorCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper copyHelper) {
-		super(domain, owner, copyHelper);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand#doExecute()
-	 */
-	public void doExecute() {
-		super.doExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.command.CreateCopyCommand#doGetChildrenToCopy()
-	 */
-	public Collection doGetChildrenToCopy() {
-		Collection children = super.doGetChildrenToCopy();
-
-		WorkProductDescriptor wpd = (WorkProductDescriptor) owner;
-		WorkProduct wp = wpd.getWorkProduct();
-		if (wp instanceof Deliverable) {
-			for (Iterator iter = wpd.getDeliverableParts().iterator(); iter
-					.hasNext();) {
-				WorkProductDescriptor part = (WorkProductDescriptor) iter
-						.next();
-				if (part.getSuperActivities() == null && part != wpd) {
-					children.add(part);
-				}
-			}
-		} else if (wp instanceof Artifact) {
-			if (domain instanceof AdapterFactoryEditingDomain) {
-				AdapterFactory adapterFactory = ((AdapterFactoryEditingDomain) domain)
-						.getAdapterFactory();
-				ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-						.adapt(owner, ITreeItemContentProvider.class);
-				for (Iterator iter = itemProvider.getChildren(owner).iterator(); iter
-						.hasNext();) {
-					children.add(TngUtil.unwrap(iter.next()));
-				}
-			}
-		}
-
-		return children;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand#doGetResult()
-	 */
-	public Collection doGetResult() {
-		ArrayList result = new ArrayList();
-		result.add(copy);
-
-		// Children that are shown in BS due to child relationship of its linked
-		// ContentElement
-		// but they are not directly associated with the owner. We need to add
-		// their copies to the result
-		// so they will be added to clipboard for later paste
-		//
-		WorkProductDescriptor wpd = (WorkProductDescriptor) owner;
-		WorkProduct wp = wpd.getWorkProduct();
-		if (wp instanceof Artifact) {
-			if (domain instanceof AdapterFactoryEditingDomain) {
-				AdapterFactory adapterFactory = ((AdapterFactoryEditingDomain) domain)
-						.getAdapterFactory();
-				for (Iterator iter = new AdapterFactoryTreeIterator(
-						adapterFactory, wpd, false); iter.hasNext();) {
-					Object childCopy = copyHelper.get(TngUtil.unwrap(iter
-							.next()));
-					if (childCopy != null) {
-						result.add(childCopy);
-					}
-				}
-			}
-		}
-
-		if (domain instanceof TraceableAdapterFactoryEditingDomain)
-			((TraceableAdapterFactoryEditingDomain) domain).addCopyInfo(result,
-					copyHelper);
-		return result;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/package.html
deleted file mode 100644
index 1a49874..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides commands for editing breakdown elements in a Process editor.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ActivityItemProvider.java
deleted file mode 100644
index 32669fb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ActivityItemProvider.java
+++ /dev/null
@@ -1,144 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.consolidated;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * Activity item provider for consolidated view
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityItemProvider extends BSActivityItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public ActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#getObject(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected Object getObject(Descriptor descriptor) {
-		return ((TaskDescriptor) descriptor).getTask();
-	}
-
-	public Collection getEClasses() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BSActivityItemProvider#doRefreshAffectedViewers()
-	 */
-	protected void doRefreshAffectedViewers() {
-		Object proc = getTopItem();
-		Object itemProvider = adapterFactory.adapt(proc,
-				ITreeItemContentProvider.class);
-		if (itemProvider instanceof BSActivityItemProvider) {
-			((BSActivityItemProvider) itemProvider)
-					.setRefreshAllIDsRequired(true);
-		}
-
-		ProcessUtil
-				.refreshIDsInViewers((ExposedAdapterFactory) getRootAdapterFactory());
-	}
-	
-	protected Collection removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		return ProcessUtil.removeSubartifactsFromChildren(children, unwrap);
-	}
-
-	public Collection getChildren(Object obj) {
-		List newChildren = new ArrayList();
-		Collection children = super.getChildren(obj);
-		children = removeSubartifactsFromChildren(children, false);
-		List roleDescriptors = new ArrayList();
-		List wpDescriptors = new ArrayList();
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object object = itor.next();
-			Object e = TngUtil.unwrap(object);
-			
-			// don't return roledescriptor which are linked to taskdescriptor
-			// 
-			if (e instanceof RoleDescriptor) {
-				RoleDescriptor roleDesc = (RoleDescriptor) e;
-				if(AssociationHelper.getPrimaryTaskDescriptors(roleDesc).isEmpty() &&
-						AssociationHelper.getAdditionalTaskDescriptors(roleDesc).isEmpty() &&
-						AssociationHelper.getAssistedTaskDescriptors(roleDesc).isEmpty()) 
-				{
-					roleDescriptors.add(object);
-				}
-			}
-			// don't return wpdescriptor which are linked to either
-			// taskdescriptor or roledescriptor
-			else if (e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) e;
-				if(AssociationHelper.getExternalInputTo(wpDesc).isEmpty() &&
-						AssociationHelper.getMandatoryInputTo(wpDesc).isEmpty() &&
-						AssociationHelper.getOptionalInputTo(wpDesc).isEmpty() &&
-						AssociationHelper.getOutputFrom(wpDesc).isEmpty() &&
-						AssociationHelper.getResponsibleRoleDescriptors(wpDesc).isEmpty())
-				{
-					wpDescriptors.add(object);
-				}
-			} else {
-				newChildren.add(object);
-			}
-		}
-	
-		newChildren.addAll(roleDescriptors);
-		newChildren.addAll(wpDescriptors);
-		
-		updateCachedChildren(newChildren);
-		
-		return newChildren;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#getRollupChildrenFromCache()
-	 */
-	public Collection getRollupChildrenFromCache() {
-		return Collections.EMPTY_LIST;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#isRolledUp()
-	 */
-	public boolean isRolledUp() {
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ItemProviderAdapterFactory.java
deleted file mode 100644
index 4f4298c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.consolidated;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.TeamProfileItemProvider;
-import org.eclipse.epf.library.edit.process.WBSItemProviderAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-
-/**
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ItemProviderAdapterFactory extends WBSItemProviderAdapterFactory {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.ItemProviderAdapterFactory#createTaskDescriptorAdapter()
-	 */
-	public Adapter createTaskDescriptorAdapter() {
-		return new TaskDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createTaskDescriptorAdapter());
-	}
-
-	public Adapter createRoleDescriptorAdapter() {
-		return new RoleDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createRoleDescriptorAdapter());
-	}
-
-	public Adapter createWorkProductDescriptorAdapter() {
-		return new WorkProductDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createWorkProductDescriptorAdapter());
-	}
-
-	public Adapter createActivityAdapter() {
-		return new ActivityItemProvider(this);
-	}
-
-	public Adapter createCapabilityPatternAdapter() {
-		return new ProcessItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new ProcessItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createDeliveryProcessAdapter());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory#createTeamProfileAdapter()
-	 */
-	public Adapter createTeamProfileAdapter() {
-		return new TeamProfileItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory.createTeamProfileAdapter());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ProcessItemProvider.java
deleted file mode 100644
index 4a0a9e9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/ProcessItemProvider.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.consolidated;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * Process item provider for consolidated view
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ProcessItemProvider extends ActivityItemProvider {
-
-	private ItemProviderAdapter delegateItemProvider;
-
-	public ProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory);
-		this.delegateItemProvider = delegateItemProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.provider.ActivityItemProvider#getPropertyDescriptors(java.lang.Object)
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			itemPropertyDescriptors = delegateItemProvider
-					.getPropertyDescriptors(object);
-		}
-		return itemPropertyDescriptors;
-	}
-	
-	public void notifyChanged(Notification notification) {
-		switch (notification.getFeatureID(ProcessComponent.class)) {
-		case UmaPackage.PROCESS__PRESENTATION_NAME:
-			// need to update the library view
-			// but ProcessComponents don't have a Presentation Name, so
-			// change the name of the procComp to itself
-			// this will cause a refresh
-			org.eclipse.epf.uma.Process proc = (org.eclipse.epf.uma.Process) notification.getNotifier();
-			if (proc.eContainer() != null) {
-				boolean old = proc.eContainer().eDeliver();
-				try {
-					proc.eContainer().eSetDeliver(true);
-					if (proc.eContainer() instanceof ProcessComponent)
-						((ProcessComponent)proc.eContainer()).setName(((ProcessComponent)proc.eContainer()).getName());
-				} finally {
-					proc.eContainer().eSetDeliver(old);
-				}
-			}
-			break;
-		}
-		super.notifyChanged(notification);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/RoleDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/RoleDescriptorItemProvider.java
deleted file mode 100644
index 667da6a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/RoleDescriptorItemProvider.java
+++ /dev/null
@@ -1,225 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.consolidated;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.WrapperItemProvider;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.IBreakdownElementWrapperItemProviderFactory;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * RoleDescriptor Item provider for consolidated view
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class RoleDescriptorItemProvider extends
-		org.eclipse.epf.library.edit.process.RoleDescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public RoleDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(new CommandParameter(target,
-				UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor(),
-				UmaFactory.eINSTANCE.createWorkProductDescriptor()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getRoleDescriptor_ResponsibleFor());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#isWrappingNeeded(java.lang.Object)
-	 */
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getCreateChildText(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		return getFeatureText(feature);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getCreateChildImage(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object img = TngUtil.getImage(child);
-		return img != null ? img : super.getCreateChildImage(owner, feature, child, selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createWrapper(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int)
-	 */
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) IBreakdownElementWrapperItemProviderFactory.INSTANCE
-				.createWrapper(value, object, feature, index, adapterFactory);
-		wrapper.setReadOnly(false);
-		return wrapper;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RoleDescriptor.class)) {
-		case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-			refreshChildren(notification);
-			return;
-		}
-
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * @param notification
-	 */
-	private void refreshChildren(Notification notification) {
-		if (ProcessUtil.isRefreshRequired(notification, null)) {
-			Process topAct = (Process) getTopItem();
-			AdapterFactory rootAdapterFactory = getRootAdapterFactory();
-
-			ProcessUtil.refreshViewer(rootAdapterFactory, topAct);
-		}
-		
-		// refresh children of this item provider, its parent activity and
-		// all extenders, local contributors of the parent activity
-		//
-		TaskDescriptorItemProvider.refreshChildren(this, notification);
-	}
-	
-	private void updateCachedChildren(Collection children) {
-//		if(cachedChildren == null) {
-//			cachedChildren = new ArrayList(children);
-//		}
-//		else {
-//			cachedChildren.clear();
-//			cachedChildren.addAll(children);
-//		}
-	}
-
-	public Collection getChildren(Object obj) {
-		RoleDescriptor roleDesc = (RoleDescriptor) obj;
-		List newChildren;
-	
-		// If roles has any of taskdescriptor linked then don't show any
-		// children otherwise show it's linked workproduct descriptor
-		if(!AssociationHelper.getPrimaryTaskDescriptors(roleDesc).isEmpty() ||
-				!AssociationHelper.getAdditionalTaskDescriptors(roleDesc).isEmpty() ||
-				!AssociationHelper.getAssistedTaskDescriptors(roleDesc).isEmpty())
-		{
-			newChildren = Collections.EMPTY_LIST;
-		}
-		else {
-			// get children
-			Collection children = super.getChildren(obj);
-			newChildren = new ArrayList();
-			IFilter filter = getFilter(obj);
-			
-			for (Iterator itor = children.iterator(); itor.hasNext();) {
-				Object o = itor.next();
-				if (o instanceof WrapperItemProvider) {
-					Object child = ((WrapperItemProvider) o).getValue();
-					if ((filter != null) && (filter.accept(child))) {
-						newChildren.add(o);
-					}
-				}
-			}
-		}
-		
-		//		 sort the children
-		Collections.sort(newChildren, Comparators.PRESENTATION_NAME_COMPARATOR);
-		
-		updateCachedChildren(newChildren);
-		return newChildren;
-	}
-
-	private IFilter getFilter(Object obj) {
-		IFilter filter = null;
-		Object parent = getParent(obj);
-		IBSItemProvider adapter = (IBSItemProvider) getRootAdapterFactory()
-				.adapt(parent, ITreeItemContentProvider.class);
-		if (adapter instanceof ActivityItemProvider) {
-			filter = ((ActivityItemProvider) adapter).getFilter();
-		}
-
-		return filter;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/TaskDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/TaskDescriptorItemProvider.java
deleted file mode 100644
index 4c1b618..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/TaskDescriptorItemProvider.java
+++ /dev/null
@@ -1,367 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.consolidated;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.emf.edit.provider.WrapperItemProvider;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.configuration.GuidanceItemProvider.CompareByName;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.IBreakdownElementWrapperItemProviderFactory;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-
-
-/**
- * @author Phong Nguyen Le
- * @authos Shilpa Toraskar
- * @since 1.0
- */
-public class TaskDescriptorItemProvider extends
-		org.eclipse.epf.library.edit.process.TaskDescriptorItemProvider {
-
-	protected Collection cachedChildren;
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public TaskDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/**
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		newChildDescriptors.add(new CommandParameter(target,
-				UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(),
-				UmaFactory.eINSTANCE.createRoleDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getTaskDescriptor_AdditionallyPerformedBy(),
-				UmaFactory.eINSTANCE.createRoleDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getTaskDescriptor_AssistedBy(), UmaFactory.eINSTANCE
-				.createRoleDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getTaskDescriptor_MandatoryInput(), UmaFactory.eINSTANCE
-				.createWorkProductDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getTaskDescriptor_OptionalInput(), UmaFactory.eINSTANCE
-				.createWorkProductDescriptor()));
-		
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getTaskDescriptor_ExternalInput(), UmaFactory.eINSTANCE
-				.createWorkProductDescriptor()));
-		
-		newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
-				.getTaskDescriptor_Output(), UmaFactory.eINSTANCE
-				.createWorkProductDescriptor()));
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			childrenFeatures = new ArrayList();
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getTaskDescriptor_PerformedPrimarilyBy());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getTaskDescriptor_AdditionallyPerformedBy());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getTaskDescriptor_AssistedBy());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getTaskDescriptor_MandatoryInput());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getTaskDescriptor_OptionalInput());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getTaskDescriptor_ExternalInput());
-			childrenFeatures.add(UmaPackage.eINSTANCE
-					.getTaskDescriptor_Output());
-		}
-		return childrenFeatures;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#isWrappingNeeded(java.lang.Object)
-	 */
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getCreateChildText(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		return getFeatureText(feature);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getCreateChildImage(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object img = TngUtil.getImage(child);
-		return img != null ? img : super.getCreateChildImage(owner, feature, child, selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createWrapper(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int)
-	 */
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) IBreakdownElementWrapperItemProviderFactory.INSTANCE
-				.createWrapper(value, object, feature, index, adapterFactory);
-		wrapper.setReadOnly(false);
-		return wrapper;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TaskDescriptor.class)) {
-		case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-		case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-		case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-		case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-		case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-		case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-		case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-			refreshChildren(notification);
-		}
-
-		super.notifyChanged(notification);
-	}
-	
-	static void refreshChildren(ItemProviderAdapter ipa, Notification notification) {		
-		if (ProcessUtil.isRefreshRequired(notification, null)) {
-			ipa.fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-
-			AdapterFactory adapterFactory = ipa.getAdapterFactory();
-			
-			if(notification.getNotifier() instanceof BreakdownElement) {
-				// need to refresh children of parent activity
-				//
-				Activity parent = ((BreakdownElement)notification.getNotifier()).getSuperActivities();
-				Object adapter = adapterFactory.adapt(parent,
-						ITreeItemContentProvider.class);
-				if (adapter instanceof ItemProviderAdapter) {
-					((ItemProviderAdapter) adapter)
-					.fireNotifyChanged(new ViewerNotification(notification,
-							parent, true, false));
-				}
-
-				// refresh extenders and local contributors of the parent
-				//
-				if(parent instanceof VariabilityElement) {
-					for (Iterator iter = TngUtil.getGeneralizers(parent); iter.hasNext();) {
-						VariabilityElement ve = (VariabilityElement) iter.next();
-						if(ve.getVariabilityType() == VariabilityType.EXTENDS_LITERAL
-								|| ve.getVariabilityType() == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-							adapter = TngUtil.getAdapterByType(ve, adapterFactory);
-							if (adapter instanceof ItemProviderAdapter) {
-								((ItemProviderAdapter) adapter)
-								.fireNotifyChanged(new ViewerNotification(notification,
-										ve, true, false));
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param notification
-	 */
-	private void refreshChildren(Notification notification) {
-		refreshChildren(this, notification);
-	}
-
-	private void updateCachedChildren(Collection children) {
-//		if(cachedChildren == null) {
-//			cachedChildren = new ArrayList(children);
-//		}
-//		else {
-//			cachedChildren.clear();
-//			cachedChildren.addAll(children);
-//		}
-	}
-
-	public Collection getChildren(Object obj) {
-		Collection children = super.getChildren(obj);
-		List newChildren = new ArrayList();
-		List primaryPerformers = new ArrayList();
-		List additionalPerformers = new ArrayList();
-		List assitedBy = new ArrayList();
-		List mandatoryInput = new ArrayList();
-		List externalInput = new ArrayList();
-		List optionalInput = new ArrayList();
-		List output = new ArrayList();
-
-		IFilter filter = getFilter(obj);
-
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object o = itor.next();
-			if (o instanceof WrapperItemProvider) {
-				Object child = ((WrapperItemProvider) o).getValue();
-				
-				
-				if ((filter != null) && (filter.accept(child))) {
-					if (((WrapperItemProvider) o).getFeature().equals(
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_PerformedPrimarilyBy())) {
-						primaryPerformers.add(o);
-					} else if (((WrapperItemProvider) o)
-							.getFeature()
-							.equals(
-									UmaPackage.eINSTANCE
-											.getTaskDescriptor_AdditionallyPerformedBy())) {
-						additionalPerformers.add(o);
-					} else if (((WrapperItemProvider) o).getFeature()
-							.equals(
-									UmaPackage.eINSTANCE
-											.getTaskDescriptor_AssistedBy())) {
-						assitedBy.add(o);
-					} else if (((WrapperItemProvider) o).getFeature().equals(
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_MandatoryInput())) {
-						mandatoryInput.add(o);
-					} else if (((WrapperItemProvider) o).getFeature().equals(
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_ExternalInput())) {
-						externalInput.add(o);
-					} else if (((WrapperItemProvider) o).getFeature().equals(
-							UmaPackage.eINSTANCE
-									.getTaskDescriptor_OptionalInput())) {
-						optionalInput.add(o);
-					} else if (((WrapperItemProvider) o).getFeature().equals(
-							UmaPackage.eINSTANCE.getTaskDescriptor_Output())) {
-						output.add(o);
-					}
-				}
-			}
-		}
-
-		// sort for all children
-		Collections.sort(primaryPerformers, Comparators.PRESENTATION_NAME_COMPARATOR);
-		Collections.sort(additionalPerformers, Comparators.PRESENTATION_NAME_COMPARATOR);
-		Collections.sort(assitedBy, Comparators.PRESENTATION_NAME_COMPARATOR);
-		Collections.sort(externalInput, Comparators.PRESENTATION_NAME_COMPARATOR);
-		Collections.sort(mandatoryInput, Comparators.PRESENTATION_NAME_COMPARATOR);
-		Collections.sort(optionalInput, Comparators.PRESENTATION_NAME_COMPARATOR);
-		Collections.sort(output, Comparators.PRESENTATION_NAME_COMPARATOR);
-		
-		newChildren.addAll(primaryPerformers);
-		newChildren.addAll(additionalPerformers);
-		newChildren.addAll(assitedBy);
-		newChildren.addAll(externalInput);
-		newChildren.addAll(mandatoryInput);
-		newChildren.addAll(optionalInput);
-		newChildren.addAll(output);
-		
-		newChildren = removeSubartifactsFromChildren(newChildren, true);
-		updateCachedChildren(newChildren);
-		return newChildren;
-	}
-	
-	protected List removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		return ProcessUtil.removeSubartifactsFromChildren(children, unwrap);
-	}
-
-	private IFilter getFilter(Object obj) {
-		IFilter filter = null;
-		Object parent = getParent(obj);
-		IBSItemProvider adapter = (IBSItemProvider) getRootAdapterFactory()
-				.adapt(parent, ITreeItemContentProvider.class);
-		if (adapter instanceof ActivityItemProvider) {
-			filter = ((ActivityItemProvider) adapter).getFilter();
-		}
-
-		return filter;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getChildrenFromCache()
-	 */
-	public Collection getChildrenFromCache() {
-		if(cachedChildren == null) {
-			getChildren(target);
-		}
-		return cachedChildren;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getRollupChildrenFromCache()
-	 */
-	public Collection getRollupChildrenFromCache() {
-		return Collections.EMPTY_LIST;
-	}
-
-	public void dispose() { 
-		if(cachedChildren != null) {
-			cachedChildren.clear();
-			cachedChildren = null;
-		}
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/WorkProductDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/WorkProductDescriptorItemProvider.java
deleted file mode 100644
index 8a995da..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/WorkProductDescriptorItemProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.consolidated;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBreakdownElementWrapperItemProviderFactory;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-
-/**
- * WorkProductDescriptor Item provider for consolidated view
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class WorkProductDescriptorItemProvider extends
-		org.eclipse.epf.library.edit.process.WorkProductDescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public WorkProductDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#collectNewChildDescriptors(java.util.Collection,
-	 *      java.lang.Object)
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#getChildrenFeatures(java.lang.Object)
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#isWrappingNeeded(java.lang.Object)
-	 */
-	protected boolean isWrappingNeeded(Object object) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getCreateChildText(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		return getFeatureText(feature);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getCreateChildImage(java.lang.Object,
-	 *      java.lang.Object, java.lang.Object, java.util.Collection)
-	 */
-	public Object getCreateChildImage(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object img = TngUtil.getImage(child);
-		return img != null ? img : super.getCreateChildImage(owner, feature, child, selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createWrapper(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int)
-	 */
-	protected Object createWrapper(EObject object, EStructuralFeature feature,
-			Object value, int index) {
-		BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) IBreakdownElementWrapperItemProviderFactory.INSTANCE
-				.createWrapper(value, object, feature, index, adapterFactory);
-		wrapper.setReadOnly(false);
-		return wrapper;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.BreakdownElementItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		// switch(notification.getFeatureID(RoleDescriptor.class)) {
-		// case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-		// refreshChildren(notification);
-		// }
-
-		super.notifyChanged(notification);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.DescriptorItemProvider#getAttribute(java.lang.Object, java.lang.String)
-	 */
-	public String getAttribute(Object object, String property) {
-		return super.getAttribute(object, property);
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.WorkProductDescriptorItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object obj) {
-		Collection children = super.getChildren(obj);
-		List newChildren = new ArrayList();
-		newChildren.addAll(children);
-		// sort the children
-		Collections.sort(newChildren, Comparators.PRESENTATION_NAME_COMPARATOR);
-
-		return newChildren;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/package.html
deleted file mode 100644
index cf2a77b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/consolidated/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides item providers for displaying and editing breakdown elements in a Process editor's Consolidated View page.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/internal/BreakdownElementWrapperItemProviderFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/internal/BreakdownElementWrapperItemProviderFactory.java
deleted file mode 100644
index 29d05ad..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/internal/BreakdownElementWrapperItemProviderFactory.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.internal;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.CompositeRoleWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.DeliverableDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBreakdownElementWrapperItemProviderFactory;
-import org.eclipse.epf.library.edit.process.MilestoneWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.TeamProfileWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.WorkProductDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class BreakdownElementWrapperItemProviderFactory implements
-		IBreakdownElementWrapperItemProviderFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBreakdownElementWrapperItemProviderFactory#createWrapper(java.lang.Object,
-	 *      java.lang.Object, org.eclipse.emf.common.notify.AdapterFactory)
-	 */
-	public IWrapperItemProvider createWrapper(Object value,
-			Object owner, AdapterFactory adapterFactory) {
-		return createWrapper(value, owner, null, CommandParameter.NO_INDEX,
-				adapterFactory);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IBreakdownElementWrapperItemProviderFactory#createWrapper(java.lang.Object,
-	 *      java.lang.Object, org.eclipse.emf.ecore.EStructuralFeature, int,
-	 *      org.eclipse.emf.common.notify.AdapterFactory)
-	 */
-	public IWrapperItemProvider createWrapper(Object value,
-			Object owner, EStructuralFeature feature, int index,
-			AdapterFactory adapterFactory) {
-		value = TngUtil.unwrap(value);
-		if (value instanceof Activity) {
-			return new ActivityWrapperItemProvider((Activity) value, owner,
-					feature, index, adapterFactory);
-		} else if (value instanceof Milestone) {
-			return new MilestoneWrapperItemProvider((Milestone) value, owner,
-					feature, index, adapterFactory);
-		} else if (value instanceof CompositeRole) {
-			return new CompositeRoleWrapperItemProvider((CompositeRole) value,
-					owner, feature, index, adapterFactory);
-		} else if (value instanceof RoleDescriptor) {
-			return new RoleDescriptorWrapperItemProvider(
-					(RoleDescriptor) value, owner, feature, index,
-					adapterFactory);
-		} else if (value instanceof TaskDescriptor) {
-			return new TaskDescriptorWrapperItemProvider(
-					(TaskDescriptor) value, owner, feature, index,
-					adapterFactory);
-		} else if (value instanceof TeamProfile) {
-			return new TeamProfileWrapperItemProvider((TeamProfile) value,
-					owner, feature, index, adapterFactory);
-		} else if (value instanceof WorkProductDescriptor) {
-			WorkProductDescriptor wpd = (WorkProductDescriptor) value;
-			if (wpd.getWorkProduct() instanceof Deliverable) {
-				return new DeliverableDescriptorWrapperItemProvider(wpd, owner,
-						feature, index, adapterFactory);
-			}
-			return new WorkProductDescriptorWrapperItemProvider(wpd, owner,
-					feature, index, adapterFactory);
-		} else if (value instanceof BreakdownElement) {
-			return new BreakdownElementWrapperItemProvider(
-					(BreakdownElement) value, owner, feature, index,
-					adapterFactory);
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/internal/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/internal/package.html
deleted file mode 100644
index a98ea87..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for displaying and editing a process.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/package.html
deleted file mode 100644
index bffc56f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides item providers for displaying and editing breakdown elements in a Process editor.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSActivityItemProvider.java
deleted file mode 100644
index 6d909f3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSActivityItemProvider.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.process.consolidated.ActivityItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class CBSActivityItemProvider extends ActivityItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public CBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.consolidated.ActivityItemProvider#removeSubartifactsFromChildren(java.util.Collection, boolean)
-	 */
-	protected Collection removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		return ProcessUtil.removeSubartifactsFromChildren(children, unwrap, adapterFactory);
-	}
-
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSItemProviderAdapterFactory.java
deleted file mode 100644
index f7244a9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.consolidated.ItemProviderAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class CBSItemProviderAdapterFactory extends ItemProviderAdapterFactory {
-
-	public CBSItemProviderAdapterFactory() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.consolidated.ItemProviderAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new CBSActivityItemProvider(this);
-	}
-	
-	public Adapter createCapabilityPatternAdapter() {
-		return new CBSProcessItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new CBSProcessItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createDeliveryProcessAdapter());
-	}
-
-	public Adapter createTaskDescriptorAdapter() {
-		return new CBSTaskDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createTaskDescriptorAdapter());
-	}
-
-	public Adapter createRoleDescriptorAdapter() {
-		return new CBSRoleDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createRoleDescriptorAdapter());
-	}
-
-	public Adapter createWorkProductDescriptorAdapter() {
-		return new CBSWorkProductDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createWorkProductDescriptorAdapter());
-	}	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSProcessItemProvider.java
deleted file mode 100644
index 3a50aa6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSProcessItemProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.consolidated.ProcessItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class CBSProcessItemProvider extends ProcessItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public CBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.consolidated.ActivityItemProvider#removeSubartifactsFromChildren(java.util.Collection, boolean)
-	 */
-	protected Collection removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		return ProcessUtil.removeSubartifactsFromChildren(children, unwrap, adapterFactory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSRoleDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSRoleDescriptorItemProvider.java
deleted file mode 100644
index c1caba0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSRoleDescriptorItemProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.consolidated.RoleDescriptorItemProvider;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class CBSRoleDescriptorItemProvider extends RoleDescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public CBSRoleDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Collection getChildren(Object object) {
-		if(cachedChildren == null) {
-			cachedChildren = new ArrayList(super.getChildren(object));
-		}
-		return cachedChildren;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSTaskDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSTaskDescriptorItemProvider.java
deleted file mode 100644
index 46ba8ad..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSTaskDescriptorItemProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.consolidated.TaskDescriptorItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class CBSTaskDescriptorItemProvider extends TaskDescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public CBSTaskDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Collection getChildren(Object object) {
-		if(cachedChildren == null) {
-			cachedChildren = new ArrayList(super.getChildren(object));
-		}
-		return cachedChildren;
-	}
-
-	protected List removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		return ProcessUtil.removeSubartifactsFromChildren(children, unwrap, adapterFactory);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSWorkProductDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSWorkProductDescriptorItemProvider.java
deleted file mode 100644
index 8e40424..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/CBSWorkProductDescriptorItemProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.consolidated.WorkProductDescriptorItemProvider;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class CBSWorkProductDescriptorItemProvider extends
-		WorkProductDescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public CBSWorkProductDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Collection getChildren(Object object) {
-		if(cachedChildren == null) {
-			cachedChildren = new ArrayList(super.getChildren(object));
-		}
-		return cachedChildren;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSActivityItemProvider.java
deleted file mode 100644
index 7af4760..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSActivityItemProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.process.OBSActivityItemProvider;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class TBSActivityItemProvider extends OBSActivityItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public TBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.OBSActivityItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSItemProviderAdapterFactory.java
deleted file mode 100644
index 6cfdf05..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.OBSItemProviderAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class TBSItemProviderAdapterFactory extends
-		OBSItemProviderAdapterFactory {
-
-	public TBSItemProviderAdapterFactory() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.OBSItemProviderAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new TBSActivityItemProvider(this);
-	}
-	
-	public Adapter createCapabilityPatternAdapter() {
-		return new TBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new TBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory.createDeliveryProcessAdapter());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSProcessItemProvider.java
deleted file mode 100644
index 90bd13f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/TBSProcessItemProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.OBSProcessItemProvider;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class TBSProcessItemProvider extends OBSProcessItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public TBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.OBSProcessItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSActivityItemProvider.java
deleted file mode 100644
index 05c2777..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSActivityItemProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class WBSActivityItemProvider extends
-		org.eclipse.epf.library.edit.process.WBSActivityItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public WBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.WBSActivityItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSItemProviderAdapterFactory.java
deleted file mode 100644
index c37b77c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class WBSItemProviderAdapterFactory extends
-		org.eclipse.epf.library.edit.process.WBSItemProviderAdapterFactory {
-
-	public WBSItemProviderAdapterFactory() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.WBSItemProviderAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new WBSActivityItemProvider(this);
-	}
-	
-	public Adapter createCapabilityPatternAdapter() {
-		return new WBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new WBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createDeliveryProcessAdapter());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSProcessItemProvider.java
deleted file mode 100644
index b880092..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WBSProcessItemProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class WBSProcessItemProvider extends
-		org.eclipse.epf.library.edit.process.WBSProcessItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public WBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSActivityItemProvider.java
deleted file mode 100644
index 4e63a06..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSActivityItemProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.process.PBSActivityItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class WPBSActivityItemProvider extends PBSActivityItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 */
-	public WPBSActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.PBSActivityItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-	
-	protected List removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		return ProcessUtil.removeSubartifactsFromChildren(children, unwrap, adapterFactory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSItemProviderAdapterFactory.java
deleted file mode 100644
index 0576d45..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.PBSItemProviderAdapterFactory;
-import org.eclipse.epf.library.edit.util.TngUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class WPBSItemProviderAdapterFactory extends
-		PBSItemProviderAdapterFactory {
-
-	public WPBSItemProviderAdapterFactory() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.PBSItemProviderAdapterFactory#createActivityAdapter()
-	 */
-	public Adapter createActivityAdapter() {
-		return new WPBSActivityItemProvider(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.ItemProviderAdapterFactory#createWorkProductDescriptorAdapter()
-	 */
-	public Adapter createWorkProductDescriptorAdapter() {
-		return new WPBSWorkProductDescriptorItemProvider(this,
-				(ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-						.createWorkProductDescriptorAdapter());
-	}
-	
-	public Adapter createCapabilityPatternAdapter() {
-		return new WPBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createCapabilityPatternAdapter());
-	}
-
-	public Adapter createDeliveryProcessAdapter() {
-		return new WPBSProcessItemProvider(this, (ItemProviderAdapter) TngUtil.umaItemProviderAdapterFactory
-				.createDeliveryProcessAdapter());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSProcessItemProvider.java
deleted file mode 100644
index 7b2f3e2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSProcessItemProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.process.PBSProcessItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class WPBSProcessItemProvider extends PBSProcessItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public WPBSProcessItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	public Collection getChildren(Object object) {
-		if(isRolledUp()) {
-			if(cachedRollupChildren == null) {
-				cachedRollupChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedRollupChildren;
-		}
-		else {
-			if(cachedChildren == null) {
-				cachedChildren = new ArrayList(super.getChildren(object));
-			}
-			return cachedChildren;
-		}
-	}
-
-	protected List removeSubartifactsFromChildren(Collection children, boolean unwrap) {
-		return ProcessUtil.removeSubartifactsFromChildren(children, unwrap, adapterFactory);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSWorkProductDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSWorkProductDescriptorItemProvider.java
deleted file mode 100644
index a43717f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/WPBSWorkProductDescriptorItemProvider.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.process.publishing;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * @author Phong Nguyen Le - Mar 22, 2006
- * @since  1.0
- */
-public class WPBSWorkProductDescriptorItemProvider extends
-		org.eclipse.epf.library.edit.process.WorkProductDescriptorItemProvider {
-
-	/**
-	 * @param adapterFactory
-	 * @param delegateItemProvider
-	 */
-	public WPBSWorkProductDescriptorItemProvider(AdapterFactory adapterFactory,
-			ItemProviderAdapter delegateItemProvider) {
-		super(adapterFactory, delegateItemProvider);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.WorkProductDescriptorItemProvider#getChildren(java.lang.Object)
-	 */
-	public Collection getChildren(Object object) {
-		if(cachedChildren == null) {
-			cachedChildren = new ArrayList(super.getChildren(object));
-		}
-		return cachedChildren;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.process.WorkProductDescriptorItemProvider#addContainedArtifactDescriptors(org.eclipse.epf.uma.WorkProductDescriptor, java.util.Collection)
-	 */
-	protected void addContainedArtifactDescriptors(WorkProductDescriptor wpDesc, Collection children) {
-		Activity activity = UmaUtil.getParentActivity(wpDesc);
-		if(activity != null) {
-			// collect all artifact descriptors or their wrappers under the same activity
-			//
-			List artifactDescList = new ArrayList();
-			Collection siblings = activity.getBreakdownElements();
-			IFilter filter = ProcessUtil.getFilter(adapterFactory);
-			for (Iterator iter = siblings.iterator(); iter.hasNext();) {
-				Object e = iter.next();
-				if(e instanceof WorkProductDescriptor 
-						&& ((WorkProductDescriptor)e).getWorkProduct() instanceof Artifact
-						&& (filter == null || filter.accept(e))) {
-					artifactDescList.add(e);
-				}
-			}
-			
-			children.addAll(ProcessUtil.getContainedArtifactsDescriptors(wpDesc, artifactDescList));			
-		}
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/package.html
deleted file mode 100644
index 65d8c82..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/publishing/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides item providers for displaying a process in a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/IActionTypeProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/IActionTypeProvider.java
deleted file mode 100644
index a2dbb76..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/IActionTypeProvider.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.ui;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.epf.library.edit.command.IActionManager;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IActionTypeProvider {
-
-	public static final int COPY = 1;
-
-	public static final int EXTEND = 2;
-	
-	public static final int DEEP_COPY = 3;
-
-	void setInputData(Object object);
-
-	void setActionManager(IActionManager actionMgr);
-
-	/**
-	 * Executes given command based on the choice that user selected from given
-	 * <code>choices</code>. Choice can be one of the constant {@link #COPY},
-	 * {@link #EXTEND}, or {@link #DEEP_COPY}
-	 * 
-	 * @param cmd
-	 * @param choices
-	 */
-	void execute(Command cmd, int[] choices);
-
-//	int getActionType();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/IUIHelper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/IUIHelper.java
deleted file mode 100644
index ae6efae..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/IUIHelper.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2008 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.ui;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.5
- *
- */
-public interface IUIHelper {
-	public void runSafely(Runnable runnable, boolean synchronous);
-	
-	public void runWithBusyIndicator(Runnable runnable);
-	
-	public boolean runWithProgress(IRunnableWithProgress runnable, boolean canCancel, String msg);
-
-	public IStatus runAsJob(IRunnableWithProgress runnable, String taskName,
-			Object shell);
-
-	public boolean runInUI(IRunnableWithProgress runnable,
-			ISchedulingRule rule, Object shell);
-	
-	public void runInUI(IRunnableWithProgress runnable,
-			String taskName);
-
-	IStatus runInModalContext(IRunnableWithProgress operation, boolean fork,
-			IProgressMonitor monitor, Object uiContext);
-
-	public TeamProfile getTeam(Activity activity, Role role, Object UIContext);
-
-	/**
-	 * Select tasks which has given workproduct as output.
-	 * 
-	 * @param taskList
-	 * @param wp
-	 * @return
-	 */
-	public List selectTasks(List taskList, WorkProduct wp);
-
-	/**
-	 * Select responsible work products for the given role
-	 * 
-	 * @param wpList
-	 * @param role
-	 * @return
-	 */
-	public List selectWorkProducts(List wpList, Role role);
-
-	public boolean refreshNeeded(AdapterFactory adapterFactory,
-			BSActivityItemProvider itemProvider);
-
-	public void refreshViewer(AdapterFactory factory, Process proc);
-	
-	public void refreshAllViewers(final ExposedAdapterFactory adapterFactory);
-
-	public void refreshIDsInViewer(ExposedAdapterFactory adapterFactory);
-	
-	public Object getViewer(AdapterFactory adapterFactory, Process proc);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/ReferenceSelection.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/ReferenceSelection.java
deleted file mode 100644
index ef2cd45..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/ReferenceSelection.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.ui;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.eclipse.epf.library.edit.util.AdapterFactoryItemLabelProvider;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * UI Dialog class which will give user to select references to be deleted
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public class ReferenceSelection {
-
-	public static Object[] getReferences(List ref, Descriptor desc) {
-		return getReferences(ref, NLS.bind(LibraryEditResources.ui_ref_delete,
-				desc.getName()));
-	}
-
-	/**
-	 * Shows dialog box for all references to be deleted for the given
-	 * descriptor. These references are not being used anywhere else.
-	 * 
-	 * @param ref
-	 * @return
-	 */
-	public static Object[] getReferences(List ref) {
-
-		String message = LibraryEditResources.ui_ref_delete2;
-		try {
-			return getReferences(ref, message);
-		} catch (OperationCanceledException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * It shows selection dialog box with list of reference (<code>ref</code>)
-	 * for user to select.
-	 * 
-	 * @param ref
-	 * @return
-	 * @exception OperationCanceledException
-	 *                if user canceled
-	 */
-	public static Object[] getReferences(List ref, String msg)
-			throws OperationCanceledException {
-		// IStructuredContentProvider contentProvider = new
-		// AdapterFactoryContentProvider(
-		// TngAdapterFactory.INSTANCE
-		// .getNavigatorView_ComposedAdapterFactory()) {
-		// public Object[] getElements(Object object) {
-		// return ((List) object).toArray();
-		// }
-		// };
-		// ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-		// TngAdapterFactory.INSTANCE
-		// .getNavigatorView_ComposedAdapterFactory());
-		//
-		// try {
-		// ProcessListSelectionDialog dlg = new
-		// ProcessListSelectionDialog(PlatformUI
-		// .getWorkbench().getActiveWorkbenchWindow().getShell(), ref,
-		// contentProvider, labelProvider, msg);
-		//
-		// dlg.setTitle(LibraryEditResources.ui_references); //$NON-NLS-1$
-		// dlg.setBlockOnOpen(true);
-		// if (dlg.open() == Dialog.CANCEL) {
-		// throw new OperationCanceledException();
-		// }
-		// Object objs[] = dlg.getResult();
-		// return objs;
-		// } finally {
-		// contentProvider.dispose();
-		// labelProvider.dispose();
-		// }
-
-		IUserInteractionHandler uiHandler = ExtensionManager
-				.getDefaultUserInteractionHandler();
-		if (uiHandler != null) {
-			IItemLabelProvider labelProvider = new AdapterFactoryItemLabelProvider(
-					TngAdapterFactory.INSTANCE
-							.getNavigatorView_ComposedAdapterFactory());
-			String title = LibraryEditResources.ui_references;
-			List selected = uiHandler.select(ref, labelProvider, true, ref,
-					title, msg);
-			if (selected == null) {
-				throw new OperationCanceledException();
-			}
-			return selected.toArray();
-		}
-
-		// no user interaction handler available
-		// return the entire reference list
-		//
-		return ref.toArray();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/UserInteractionHelper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/UserInteractionHelper.java
deleted file mode 100644
index 1914040..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/UserInteractionHelper.java
+++ /dev/null
@@ -1,751 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.eclipse.epf.library.edit.command.UserInput;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.AbstractStringValidator;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.services.IAccessController;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Defines static methods that interact with user via dialog boxes to retrieve
- * more information or confirmation from the users.
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public final class UserInteractionHelper {
-	
-	private static final boolean canInteract = true;
-	
-	private static final IUIHelper uiHelper = (IUIHelper) ExtensionManager.getExtension(
-			LibraryEditPlugin.getDefault().getId(), "uiHelper"); //$NON-NLS-1$
-
-	private UserInteractionHelper() {
-		super();
-	}
-
-	public static boolean canInteract() {
-		return canInteract;
-	}
-
-	/**
-	 * Checks against default configuration of the given process whether the
-	 * given (method) object can be used in the process. This method will prompt
-	 * user to add the object and those elements that it is associated with to
-	 * the default configuration if the default configuration does not have them
-	 * yet.
-	 * 
-	 * @param proc
-	 *            the process
-	 * @param object
-	 *            the method object
-	 * @return
-	 *            <li>1 if the process'es default configuration already has the
-	 *            object
-	 *            <li>2 if the object is not in the configuration, but user
-	 *            wants to add it now
-	 *            <li>0 if the object is not in the configuration and user
-	 *            don't want to add it
-	 *            <li>-1 if user cancel the prompt to add the objects and
-	 *            associated dependencies to the default configuration
-	 */
-	public static int checkAgainstDefaultConfiguration(Process proc,
-			Object object) {
-		return checkAgainstDefaultConfiguration(proc, object, null);
-	}
-
-	/**
-	 * Checks against default configuration of the given process whether the
-	 * given (method) object can be used in the process. This method will prompt
-	 * user to add the object and those elements that it is associated with to
-	 * the default configuration if the default configuration does not have them
-	 * yet.
-	 * 
-	 * @param proc
-	 *            the process
-	 * @param object
-	 *            the method object
-	 * @return
-	 *            <li>1 if the process'es default configuration already has the
-	 *            object
-	 *            <li>2 if the object is not in the configuration, but user
-	 *            wants to add it now
-	 *            <li>0 if the object is not in the configuration and user
-	 *            don't want to add it
-	 *            <li>-1 if user cancel the prompt to add the objects and
-	 *            associated dependencies to the default configuration
-	 */
-	public static int checkAgainstDefaultConfiguration(Process proc,
-			Object object, IConfigurator configurator) {
-		Object e = TngUtil.unwrap(object);
-		if (!(e instanceof MethodElement))
-			return 0;
-
-		if (configurator == null)
-			configurator = Providers.getConfiguratorFactory()
-					.createConfigurator(proc.getDefaultContext());
-		if (e instanceof VariabilityElement) {
-			// check all the base elements if there is any
-			//
-			boolean allIn = true;
-			for (VariabilityElement c = ((VariabilityElement) object); c != null; c = (VariabilityElement) c
-					.getVariabilityBasedOnElement()) {
-				if (!configurator.accept(c)) {
-					allIn = false;
-					break;
-				}
-			}
-			if (allIn) {
-				return 1;
-			}
-		}
-		if (configurator.accept(e))
-			return 1;
-
-		// object is not in the configuration
-		// ask user if he/she want to add it to the default configuration
-		//
-		String msg = NLS
-				.bind(
-						LibraryEditResources.ui_UserInteractionHelper_defaultconfigcheck,
-						((MethodElement) e).getName());		
-		IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-		if(uiHandler != null) {
-			int ret = uiHandler.selectOne(new int[] {
-					IUserInteractionHandler.ACTION_YES,
-					IUserInteractionHandler.ACTION_NO,
-					IUserInteractionHandler.ACTION_CANCEL
-				}, "Add to default configuration", msg, null);
-			if (TngUtil.DEBUG) {
-				System.out
-				.println("UserInteractionHelper.checkAgainstDefaultConfiguration(): element=" //$NON-NLS-1$
-						+ e + ", path=" + TngUtil.getLabelWithPath(e)); //$NON-NLS-1$
-			}
-			switch (ret) {
-			case IUserInteractionHandler.ACTION_YES:
-				IStatus status = TngUtil.checkEdit(proc.getDefaultContext(), null);
-				if (!status.isOK()) {
-					return 0;
-				}
-				return 2;
-			case IUserInteractionHandler.ACTION_NO:
-				return 0;
-			case IUserInteractionHandler.ACTION_CANCEL:
-				return -1;
-			}
-		}
-		return 0;
-	}
-
-	/**
-	 * Select tasks which has given workproduct as output.
-	 * 
-	 * @param taskList
-	 * @param wp
-	 * @return
-	 */
-	public static List selectTasks(List taskList, WorkProduct wp) {
-		return uiHelper.selectTasks(taskList, wp);
-	}
-
-	/**
-	 * Select responsible work products for the given role
-	 * 
-	 * @param wpList
-	 * @param role
-	 * @return
-	 */
-	public static List selectWorkProducts(List wpList, Role role) {
-		return uiHelper.selectWorkProducts(wpList, role);
-	}
-
-	/**
-	 * Requests name from user
-	 * 
-	 * @param object
-	 * @param nameFeature
-	 * @return the requested name of null if user canceled
-	 */
-	public static String requestName(Object child,
-			EStructuralFeature nameFeature, String title,
-			final IValidator validator) {
-		IValidator inputValidator = new AbstractStringValidator() {
-
-			public String isValid(String newText) {
-				if (validator != null) {
-					return getSimpleErrorMessage(validator.isValid(newText));
-				}
-				return null;
-			}
-
-		};
-		String name = ""; //$NON-NLS-1$
-		if (child instanceof EObject) {
-			EObject e = (EObject) child;
-			String str = (String) e.eGet(nameFeature);
-			if (str != null) {
-				name = str;
-			}
-		}
-		IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-		if(uiHandler == null) {
-			return null;
-		}
-		UserInput input = new UserInput("", UserInput.TEXT, false, null, null, inputValidator, null);
-		input.setInput(name);
-		boolean ret = uiHandler.requestInput(title, LibraryEditResources.UserInteractionHelper_ProcessPackage_Name, 
-			Collections.singletonList(input));
-		if(ret) {
-			return input.getInput().toString().trim();
-		}
-		return null;
-	}
-
-	public static String getSimpleErrorMessage(String msg) {
-		if (msg == null)
-			return null;
-
-		int s = msg.indexOf(':');
-
-		String prefix = ""; //$NON-NLS-1$
-		if (s >= 0) {
-			prefix = msg.substring(0, s);
-
-			String emptyElementNameErrorMsg = LibraryEditResources.emptyElementNameError_msg; 
-			String dupContentFileErrorMsg = LibraryEditResources.duplicateContentFileError_msg; 
-			String dupElementNameErrorMsg = LibraryEditResources.duplicateElementNameError_msg; 
-
-			if (emptyElementNameErrorMsg != null
-					&& emptyElementNameErrorMsg.startsWith(prefix))
-				return LibraryEditResources.emptyElementNameError_simple_msg; 
-			else if (dupContentFileErrorMsg != null
-					&& dupContentFileErrorMsg.startsWith(prefix))
-				return LibraryEditResources.duplicateContentFileError_simple_msg; 
-			else if (dupElementNameErrorMsg != null
-					&& dupElementNameErrorMsg.startsWith(prefix))
-				return LibraryEditResources.duplicateElementNameError_simple_msg; 
-		}
-
-		if (s < 0)
-			s = 0;
-		else
-			s++;
-		int t = msg.indexOf('\n');
-		if (t < 0)
-			t = msg.length();
-
-		return msg.substring(s, t).trim();
-	}
-
-	/**
-	 * Return team in which user would automatically assign a role into
-	 * 
-	 * @param activity
-	 * @param role
-	 * @return
-	 * 
-	 */
-	public static TeamProfile getTeam(Activity activity, Role role) {
-		return getTeam(activity, role, null);
-	}
-
-	public static TeamProfile getTeam(Activity activity, Role role,
-			Object UIContext) {
-		return uiHelper.getTeam(activity, role, UIContext);
-	}
-
-	public static final boolean runWithProgress(final Runnable runnable,
-			final String msg) {
-		final IRunnableWithProgress operation = new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor)
-					throws InvocationTargetException, InterruptedException {
-				runnable.run();
-			}
-
-		};
-		
-		return runWithProgress(operation, msg);
-	}
-
-	public static final boolean runWithProgress(
-			final IRunnableWithProgress runnable, final String msg) {
-		return runWithProgress(runnable, false, msg);
-	}
-
-	public static final boolean runWithProgress(
-			final IRunnableWithProgress runnable, final boolean canCancel,
-			final String msg) {
-		return uiHelper.runWithProgress(runnable, canCancel, msg);
-	}
-
-	public static final IStatus runAsJob(IRunnableWithProgress runnable,
-			String taskName) {
-		Object shell = LibraryEditPlugin.getDefault().getContext();
-		if (shell == null) {
-			try {
-				runnable.run(new NullProgressMonitor());
-				return Status.OK_STATUS;
-			} catch (Exception e) {
-				return new Status(IStatus.ERROR, LibraryEditPlugin.getPlugin()
-						.getId(), 0, e.toString(), e);
-			}
-		} else {
-			return runAsJob(runnable, taskName, shell);
-		}
-	}
-
-	public static final IStatus runAsJob(final IRunnableWithProgress runnable,
-			final String taskName, Object shell) {
-		return uiHelper.runAsJob(runnable, taskName, shell);
-	}
-	
-	public static final boolean runInUI(final Runnable runnable,
-			final String taskName) {
-		return runInUI(runnable, taskName, null);
-	}
-
-	public static final boolean runInUI(final Runnable runnable,
-			final String taskName, ISchedulingRule rule) {
-		Object shell = LibraryEditPlugin.getDefault().getContext();
-		if (shell == null) {
-			runnable.run();
-			return true;
-		} else {
-			IRunnableWithProgress runner = new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-					try {
-						monitor.beginTask(taskName, 2);
-						monitor.worked(1);
-						runnable.run();
-					} finally {
-						monitor.done();
-					}
-				}
-
-			};
-			return runInUI(runner, rule, shell);
-		}
-	}
-
-	public static final boolean runInUI(IRunnableWithProgress runnable,
-			Object shell) {
-		return runInUI(runnable, null, shell);
-	}
-
-	public static final boolean runInUI(IRunnableWithProgress runnable,
-			ISchedulingRule rule, Object shell) {
-		return uiHelper.runInUI(runnable, rule, shell);
-	}
-
-	/**
-	 * Return Deliverable in which user would automatically assign a wp into
-	 * 
-	 * @param activity
-	 * @param wp
-	 * @return
-	 * 
-	 */
-	public static WorkProductDescriptor getDeliverable(Activity activity,
-			WorkProduct wp) {
-
-		// PLEAE DON'T CLEAN UP
-		// commented out for now since we shut-off automatic assignment
-		// of deliverable for now
-		// List deliverableList = new ArrayList();
-		// AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-		// .getPBS_ComposedAdapterFactory();
-		// // find out all deliverables in visible scope
-		// getDeliverablesInScope(adapterFactory, activity, wp,
-		// deliverableList);
-		// if (deliverableList.size() == 1) {
-		// return (WorkProductDescriptor) deliverableList.get(0);
-		// }
-		// if (deliverableList.size() > 1) {
-		// return DeliverableSelection.getSelectedDeliverable(deliverableList,
-		// wp);
-		// }
-		// there are no deliverable to assign
-		return null;
-	}
-
-	/**
-	 * PLEASE DON'T CLEAN UP. This method is currently not used since we
-	 * shut-off automatic assignment of deliverable. Get deliverable in scope
-	 * 
-	 * @param adapterFactory
-	 * @param e
-	 * @param WorkProductDescriptor
-	 * @param deliverableList
-	 */
-	private static void getDeliverablesInScope(AdapterFactory adapterFactory,
-			BreakdownElement e, WorkProduct wp, List deliverableList) {
-		// get children for activity
-		ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(e, ITreeItemContentProvider.class);
-		Collection children = itemProvider.getChildren(e);
-		for (Iterator itor = children.iterator(); itor.hasNext();) {
-			Object obj = itor.next();
-			if ((obj instanceof WorkProductDescriptor)
-					&& (ProcessUtil
-							.getAssociatedElement((WorkProductDescriptor) obj) instanceof Deliverable)) {
-				WorkProductDescriptor wpDesc = (WorkProductDescriptor) obj;
-
-				// get deliverable parts from deliverable
-				List parts = ProcessUtil.getAssociatedElementList(wpDesc
-						.getDeliverableParts());
-				if (parts.contains(wp)) {
-					deliverableList.add(obj);
-				}
-			}
-		}
-
-		// get parent
-		Object currentParent = itemProvider.getParent(e);
-		if (currentParent != null) {
-			// go up
-			getDeliverablesInScope(adapterFactory,
-					(BreakdownElement) currentParent, wp, deliverableList);
-		}
-	}
-
-	/**
-	 * Checks if the given element can be modified. This includes lock check and
-	 * edit check.
-	 * 
-	 * @param element
-	 * @param shell
-	 * @return
-	 */
-	public static IStatus checkModify(EObject element, Object shell) {
-		if (TngUtil.isLocked(element)) {
-			String msg = MessageFormat
-					.format(
-							LibraryEditResources.UserInteractionHelper_lockedPlugin,
-							new Object[] { UmaUtil.getMethodPlugin(element)
-									.getName() }); 
-			return new Status(IStatus.ERROR,
-					LibraryEditPlugin.INSTANCE.getId(), 0, msg, null);
-		}
-		return TngUtil.checkEdit((EObject) element, shell);
-	}
-
-	/**
-	 * Checks for unmodifiable resources.
-	 * 
-	 * @param modifiedResources
-	 *            A collection of resources.
-	 * @param context
-	 *            The context of this call. For RCP, this is the shell.
-	 * @return An <code>IStatus</code> object.
-	 */
-	public static IStatus checkModify(Collection modifiedResources, Object context) {
-		IAccessController ac = Services.getAccessController();
-		if (ac == null) {
-			return Status.OK_STATUS;
-		}
-		Resource[] resources = new Resource[modifiedResources.size()];
-		modifiedResources.toArray(resources);
-		return ac.checkModify(resources, context);
-	}
-
-	public static IResource getWorkspaceResource(Resource resource) {
-		if (!resource.getURI().isFile()) {
-			return null;
-		}
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IPath path = new Path(resource.getURI().toFileString());
-		return workspaceRoot.getFileForLocation(path);
-	}
-
-	public static boolean checkOutOfSynch(Collection resources) {
-		ArrayList outOfSynchResources = new ArrayList();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			IResource wsResource = getWorkspaceResource(resource);
-			if (wsResource != null
-					&& !wsResource.isSynchronized(IResource.DEPTH_ZERO)) {
-				outOfSynchResources.add(wsResource);
-			}
-		}
-		if (outOfSynchResources.isEmpty()) {
-			return true;
-		} else {
-			MultiStatus multiStatus = new MultiStatus(
-					LibraryEditPlugin.INSTANCE.getSymbolicName(), IStatus.OK,
-					"", null); //$NON-NLS-1$
-			for (Iterator iter = outOfSynchResources.iterator(); iter.hasNext();) {
-				IResource wsResource = (IResource) iter.next();
-				IStatus status = new Status(IStatus.INFO,
-						LibraryEditPlugin.INSTANCE.getSymbolicName(),
-						IStatus.OK, wsResource.getLocation().toOSString(), null);
-				multiStatus.add(status);
-			}
-			String title = LibraryEditResources.update_outofsynch_title;
-			String msg = LibraryEditResources.update_outofsynch_msg;
-
-			IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-			return uiHandler.selectOne(new int[] {IUserInteractionHandler.ACTION_OK,
-					IUserInteractionHandler.ACTION_CANCEL}, title, msg, multiStatus) != IUserInteractionHandler.ACTION_CANCEL;
-		}
-	}
-
-	/**
-	 * Check if change to the given feature of the given featureOwner will
-	 * modify the element in opposite feature value
-	 * 
-	 * @param featureOwner
-	 * @param feature
-	 * @param element
-	 * @return
-	 */
-	public static boolean checkModifyOpposite(MethodElement featureOwner,
-			EStructuralFeature feature, MethodElement element) {
-		OppositeFeature oppositeFeature = OppositeFeature
-				.getOppositeFeature(feature);
-		MultiResourceEObject mrEObj = (MultiResourceEObject) element;
-		if (oppositeFeature != null && !oppositeFeature.isMany()) {
-			NamedElement oldOppositeFeatureValue = (NamedElement) mrEObj
-					.getOppositeFeatureMap().get(oppositeFeature);
-			if (oldOppositeFeatureValue != null
-					// make sure the element is still in the library and not
-					// deleted yet.
-					//
-					&& (oldOppositeFeatureValue instanceof MethodLibrary || oldOppositeFeatureValue
-							.eContainer() != null)
-					&& oldOppositeFeatureValue.eResource() != null) {
-				// simple reject for 7.0.0 release
-				//
-				String msg = MessageFormat
-						.format(
-								LibraryEditResources.UserInteractionHelper_errRelationshipExists,
-								new Object[] {
-										element.getName(),
-										TngUtil
-												.getLabelWithPath(oldOppositeFeatureValue),
-										featureOwner.getName() });
-				Messenger.INSTANCE.showWarning(
-						LibraryEditResources.errorDialog_title, msg);
-				return false;
-
-				// TODO: uncomment to use this code for 7.0.1 release
-				//
-				// String title = "Update Relationship";
-				// String msg = MessageFormat.format("Adding ''{0}'' to ''{1}''
-				// will remove ''{0}'' from ''{2}''. Do you want to continue?"
-				// , new Object[] { element.getName(), featureOwner.getName(),
-				// oldOppositeFeatureValue.getName() });
-				// if(!LibraryEditPlugin.INSTANCE.getMsgDialog().displayConfirmation(title,
-				// msg)) {
-				// return false;
-				// }
-				//				
-				// IStatus status =
-				// UserInteractionHelper.checkModify(oldOppositeFeatureValue,
-				// null);
-				// if(!status.isOK()) {
-				// LibraryEditPlugin.INSTANCE.getMsgDialog().displayError(title,
-				// "Cannot update relationship", status);
-				// return false;
-				// }
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Checks if
-	 * 
-	 * @return
-	 */
-	public static IStatus checkConfigurationsToUpdate(AddCommand addCommand,
-			Object shell) {
-		EObject parent = addCommand.getOwner();
-		if (!(parent instanceof MethodPackage)) {
-			return Status.OK_STATUS;
-		}
-		EStructuralFeature feature = addCommand.getFeature();
-		if (!(feature instanceof EReference)
-				|| !((EReference) feature).isContainment()) {
-			return Status.OK_STATUS;
-		}
-
-		// check if the configurations that will be updated after this command
-		// can be modified
-		//
-		ArrayList configsToUpdate = new ArrayList();
-		MethodPackage parentPkg = (MethodPackage) parent;
-		for (Iterator iter = addCommand.getCollection().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof MethodPackage) {
-				TngUtil.getConfigurationsToUpdate(parentPkg,
-						(MethodPackage) element, configsToUpdate);
-			}
-		}
-		if (!configsToUpdate.isEmpty()) {
-			Collection resourcesToCheck = new HashSet();
-			for (Iterator iter = configsToUpdate.iterator(); iter.hasNext();) {
-				EObject config = (EObject) iter.next();
-				Resource resource = config.eResource();
-				if (resource != null) {
-					resourcesToCheck.add(resource);
-				}
-			}
-			// check affected resources for unmodifiable
-			return UserInteractionHelper.checkModify(resourcesToCheck, shell);
-		}
-		return Status.OK_STATUS;
-	}
-
-	public static boolean confirmDeepCopy(Collection activities) {
-		if (UserInteractionHelper.canInteract()) {
-			// checks if the pattern or activity contains any extending elements
-			// and prompts the user if he really
-			// wants to deep copy dynamically linked activities warning the
-			// process author that he will get a copy
-			// of all dynamically linked elements that he needs to maintain
-			// separately from now on
-			boolean promptNeeded = false;
-			for (Iterator iter = activities.iterator(); iter.hasNext();) {
-				Object e = (Object) iter.next();
-				if (e instanceof Activity
-						&& ProcessUtil.hasInherited((Activity) e)) {
-					promptNeeded = true;
-					break;
-				}
-			}
-			if (promptNeeded) {
-				String title = LibraryEditResources.deepCopy_title;
-				String msg = LibraryEditResources.deepCopy_promptMsg;
-				int ret = ExtensionManager.getDefaultUserInteractionHandler()
-					.selectOne(new int[] {
-							IUserInteractionHandler.ACTION_YES,
-							IUserInteractionHandler.ACTION_NO
-					}, title, msg, null);
-				if (ret == IUserInteractionHandler.ACTION_NO) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Prompts user to choose configuration for deep copy
-	 * 
-	 * @param targetProcess
-	 * @param adapterFactory
-	 * @return
-	 * @exception OperationCanceledException
-	 *                if user cancelled
-	 */
-	public static MethodConfiguration chooseDeepCopyConfiguration(
-			Process targetProcess, AdapterFactory adapterFactory) {
-		IFilter filter = ProcessUtil.getFilter(adapterFactory);
-		MethodConfiguration deepCopyConfig = null;
-		if (filter instanceof IConfigurator) {
-			MethodConfiguration currentConfig = ((IConfigurator) filter)
-					.getMethodConfiguration();
-			if (currentConfig != null
-					&& currentConfig != targetProcess.getDefaultContext()) {
-				if (UserInteractionHelper.canInteract()) {
-					String msg = LibraryEditResources.ActivityDropCommand_deepCopy_promptConfigurationMsg;
-					IUserInteractionHandler uiHandler = ExtensionManager.getDefaultUserInteractionHandler();
-					if(uiHandler != null) {
-						int ret = uiHandler.selectOne(new int[] {
-								IUserInteractionHandler.ACTION_YES,
-								IUserInteractionHandler.ACTION_NO,
-								IUserInteractionHandler.ACTION_CANCEL
-							}, LibraryEditResources.deepCopy_title, msg, null);						
-						switch (ret) {
-						case IUserInteractionHandler.ACTION_YES:
-							break;
-						case IUserInteractionHandler.ACTION_NO:
-							deepCopyConfig = currentConfig;
-							break;
-						case IUserInteractionHandler.ACTION_CANCEL:
-							throw new OperationCanceledException();
-						}
-					}
-				}
-			}
-		}
-		return deepCopyConfig;
-	}
-
-	public static IUIHelper getUIHelper() {
-		return uiHelper;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/package.html
deleted file mode 100644
index fc373df..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides supporting dialogs for selecting and editing method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityHandler.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityHandler.java
deleted file mode 100644
index f87b4d6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityHandler.java
+++ /dev/null
@@ -1,364 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.command.CopyCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.ActivityDeepCopyCommand;
-import org.eclipse.epf.library.edit.process.command.CopyHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * Used to extend/copy activities
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityHandler {
-
-	private ArrayList procPackages;
-	
-	/**
-	 * List of activities or activity wrappers to deep copy.
-	 */
-	private ArrayList<Object> activitiesToDeepCopy;	
-	
-	private MethodConfiguration deepCopyConfig;	
-	private List deepCopies;
-	private Map deepCopyToOriginalMap;
-	private ArrayList activities;
-
-	private Map copyToOriginal;
-	
-	private AdapterFactoryEditingDomain editingDomain;
-	
-	private Helper copyHelper;
-	
-	private CopyHelper deepCopyHelper;
-
-	private Process targetProcess;
-	
-	private IProgressMonitor monitor;
-	
-	private IConfigurator activityDeepCopyConfigurator;
-
-	/**
-	 * Constructs a new ActivityHandler
-	 */
-	public ActivityHandler() {
-		activities = new ArrayList();
-		activitiesToDeepCopy = new ArrayList<Object>();
-		deepCopies = new ArrayList();
-		deepCopyToOriginalMap = new HashMap();
-		copyToOriginal = new HashMap();
-		procPackages = new ArrayList();	
-		copyHelper = new Helper();
-	}
-	
-	public void dispose() {
-		activities.clear();
-		activitiesToDeepCopy.clear();
-		copyToOriginal.clear();
-		procPackages.clear();
-		copyHelper.clear();		
-		deepCopies.clear();		
-		if(deepCopyHelper != null) {
-			deepCopyHelper.clear();
-		}
-		deepCopyToOriginalMap.clear();
-	}
-	
-	public void copy(Activity activity) {
-		procPackages.add(activity.eContainer());
-	}
-	
-	public MethodConfiguration getDeepCopyConfig() {
-		return deepCopyConfig;
-	}
-
-	public void setDeepCopyConfig(MethodConfiguration deepCopyConfig) {
-		this.deepCopyConfig = deepCopyConfig;
-	}
-	
-	public Process getTargetProcess() {
-		return targetProcess;
-	}
-
-	public void setTargetProcess(org.eclipse.epf.uma.Process proc) {
-		targetProcess = proc;
-	}
-	
-	public void setMonitor(IProgressMonitor monitor) {
-		this.monitor = monitor;
-	}
-
-	public List getDeepCopies() {
-		return deepCopies;
-	}
-
-	public void deepCopy(Object activityOrWrapper) {
-		Object unwrapped = TngUtil.unwrap(activityOrWrapper);
-		if(unwrapped instanceof Activity && ((Activity)unwrapped).eContainer() != null) {
-			activitiesToDeepCopy.add(activityOrWrapper);
-		}
-	}	
-	
-	public void extend(Activity act) {
-		Activity extendedAct = ProcessUtil.generalize(act,
-				VariabilityType.EXTENDS_LITERAL);
-		activities.add(extendedAct);
-	}
-	
-	public List getActivities() {
-		if (!procPackages.isEmpty() || !activitiesToDeepCopy.isEmpty()) {
-			editingDomain = new TraceableAdapterFactoryEditingDomain(
-					TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory(),
-					new BasicCommandStack());
-			if(!procPackages.isEmpty()) {
-				activities.addAll(copy(procPackages));
-			}
-			if(!activitiesToDeepCopy.isEmpty()) {
-					if (monitor == null) {
-					monitor = new NullProgressMonitor();
-				}
-				for (Object act : activitiesToDeepCopy) {
-					ActivityDeepCopyCommand cmd = new ActivityDeepCopyCommand(
-							act, getDeepCopyHelper(), deepCopyConfig, targetProcess, monitor,activityDeepCopyConfigurator);
-					try {
-						long time = 0;
-						if (TngUtil.DEBUG) {
-							time = System.currentTimeMillis();
-						}
-						cmd.execute();
-						if (TngUtil.DEBUG) {
-							System.out
-									.println("ActivityDeepCopyCommand executed: "
-											+ (System.currentTimeMillis() - time)
-											+ " ms");
-							time = System.currentTimeMillis();
-						}
-						Collection<?> result = cmd.getResult();
-						if (!result.isEmpty()) {
-							Activity deepCopy = (Activity) result.iterator()
-									.next();
-							ProcessUtil
-									.fixBreakdonwElementOrderRecursively(deepCopy);
-							if (TngUtil.DEBUG) {
-								System.out
-										.println("ProcessUtil.fixBreakdonwElementOrderRecursively(): "
-												+ (System.currentTimeMillis() - time)
-												+ " ms");
-								time = System.currentTimeMillis();
-							}
-							cmd.copySuppressionStates();
-							if (TngUtil.DEBUG) {
-								System.out
-										.println("ActivityDeepCopyCommand.copySuppressionStates(): "
-												+ (System.currentTimeMillis() - time)
-												+ " ms");
-								time = System.currentTimeMillis();
-							}
-							deepCopies.add(deepCopy);
-							deepCopyToOriginalMap.put(deepCopy, act);
-						}
-					} finally {
-						cmd.dispose();
-					}
-				}
-
-				activities.addAll(deepCopies);
-			}
-		}
-
-		return activities;
-	}
-	
-	private void updatePredecessors(List workBreakdownElements) {
-		// get the predessor lists of original work breakdown elements
-		//
-		List predecessorLists = new ArrayList();		
-		Object original = copyToOriginal.get(workBreakdownElements.get(0));
-		AdapterFactory adapterFactory = editingDomain.getAdapterFactory();
-		IBSItemProvider bsItemProvider = (IBSItemProvider) adapterFactory.adapt(original, ITreeItemContentProvider.class);
-		int firstID = bsItemProvider.getId(); 
-		predecessorLists.add(bsItemProvider.getPredecessors());
-		// Item provider of last work breakdown element in the subtree whose root is original activity
-		IBSItemProvider lastWBIp = null;
-		for(Iterator iter = new AdapterFactoryTreeIterator(adapterFactory, original, false); iter.hasNext();) {
-			Object obj = iter.next();
-			Object e = TngUtil.unwrap(obj);
-			if(e instanceof WorkBreakdownElement) {
-				IBSItemProvider bsIp = null;
-				if(obj instanceof IBSItemProvider) {
-					bsIp = ((IBSItemProvider)obj);
-					predecessorLists.add(bsIp.getPredecessors());
-				}
-				else {
-					Object ip = adapterFactory.adapt(obj, ITreeItemContentProvider.class);
-					if(ip instanceof IBSItemProvider) {
-						bsIp = ((IBSItemProvider)ip);
-						predecessorLists.add(bsIp.getPredecessors());
-					}
-				}
-				if(bsIp != null) {
-					lastWBIp = bsIp;
-				}
-			}
-		}
-		int lastID = lastWBIp != null ? lastWBIp.getId() : firstID;
-		
-		// update predecessors
-		//
-		int size = workBreakdownElements.size();
-		Assert.isTrue(size == predecessorLists.size());
-		for (int i = 0; i < size; i++) {
-			WorkBreakdownElement e = (WorkBreakdownElement) workBreakdownElements.get(i);
-			e.getLinkToPredecessor().clear();
-			PredecessorList predList = (PredecessorList) predecessorLists.get(i);
-			for (Iterator iterator = predList.iterator(); iterator.hasNext();) {
-				bsItemProvider = (IBSItemProvider) iterator.next();
-				int id = bsItemProvider.getId();
-				if(id >= firstID && id <= lastID) {
-					WorkBreakdownElement pred = (WorkBreakdownElement) workBreakdownElements.get(id - firstID);
-					e.getLinkToPredecessor().add(UmaUtil.createDefaultWorkOrder(e, pred));
-				}
-				else {
-					// predecessor is outside of the subtree, don't select it for now
-				}
-			}
-		}
-	}
-	
-	private Collection copyProcessPackages(Collection procPackages) {
-		Command command = createCopyCommand(editingDomain, procPackages);
-		if(command != null) {
-			try {
-				command.execute();
-				return command.getResult();
-			} finally {			
-				command.dispose();			
-			}
-		}
-		return Collections.EMPTY_LIST;
-	}
-		
-	/**
-	 * This creates a command that copies the given collection of objects. If the collection contains more than one object,
-	 * then a compound command will be created containing individual copy commands for each object.
-	 */
-	private Command createCopyCommand(final EditingDomain domain, final Collection collection)
-	{
-		if (collection == null || collection.isEmpty()) 
-		{
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		CompoundCommand copyCommand = new CompoundCommand(CompoundCommand.MERGE_COMMAND_ALL);
-		for (Iterator objects = collection.iterator(); objects.hasNext(); )
-		{
-			copyCommand.append(domain.createCommand(CopyCommand.class, new CommandParameter(objects.next(), null, copyHelper)));
-		}
-
-		return copyCommand.unwrap();
-	}
-
-	
-	/**
-	 * Copies the given process packages
-	 * 
-	 * @param editingDomain
-	 * @param procPackages
-	 * @return activities of the copies
-	 */
-	private List copy(List procPackages) {
-		Collection copyPackages = copyProcessPackages(procPackages);
-		ArrayList activities = new ArrayList();
-		for (Iterator iter = copyPackages.iterator(); iter.hasNext();) {
-			ProcessPackage copy = (ProcessPackage) iter.next();
-			if (copy instanceof ProcessComponent) {
-				Activity actCopy = ((ProcessComponent) copy)
-				.getProcess();
-				// copy data from ProcessComponent to a new
-				// ProcessPackage
-				ProcessPackage pkgCopy = UmaFactory.eINSTANCE
-				.createProcessPackage();
-				pkgCopy.setName(actCopy.getName());
-				pkgCopy.getProcessElements().add(actCopy);
-				pkgCopy.getProcessElements().addAll(
-						copy.getProcessElements());
-				pkgCopy.getDiagrams().addAll(copy.getDiagrams());
-				pkgCopy.getChildPackages().addAll(
-						copy.getChildPackages());
-				
-				activities.add(actCopy);
-			} else {
-				activities.add(ProcessUtil.findActivity(copy));
-			}
-		}
-		return activities;
-	}
-
-	public Map getDeepCopyToOriginalMap() {
-		return deepCopyToOriginalMap;
-	}
-	
-	public Helper getCopyHelper(){
-		return copyHelper;
-	}
-	
-	public CopyHelper getDeepCopyHelper() {
-		if(deepCopyHelper == null) {
-			deepCopyHelper = new CopyHelper();
-		}
-		return deepCopyHelper;
-	}
-
-	public void setActivityDeepCopyConfigurator(
-			IConfigurator activityDeepCopyConfigurator) {
-		this.activityDeepCopyConfigurator = activityDeepCopyConfigurator;
-	}
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityTreeIterator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityTreeIterator.java
deleted file mode 100644
index 03d91c0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityTreeIterator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.epf.uma.Activity;
-
-/**
- * Interator used to iterate the breakdown element tree of an activity
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ActivityTreeIterator extends AbstractTreeIterator {
-
-	private static final long serialVersionUID = 6402017768205642068L;
-
-	public ActivityTreeIterator(Activity act) {
-		super(act, false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.util.AbstractTreeIterator#getChildren(java.lang.Object)
-	 */
-	protected Iterator getChildren(Object object) {
-		if (object instanceof Activity) {
-			return ((Activity) object).getBreakdownElements().iterator();
-		}
-		return Collections.EMPTY_LIST.iterator();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/AdapterFactoryItemLabelProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/AdapterFactoryItemLabelProvider.java
deleted file mode 100644
index 72b921c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/AdapterFactoryItemLabelProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2008 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.5
- *
- */
-public class AdapterFactoryItemLabelProvider extends ItemLabelProvider {
-	private AdapterFactory adapterFactory;
-
-	public AdapterFactoryItemLabelProvider(AdapterFactory adapterFactory) {
-		super();
-		this.adapterFactory = adapterFactory;
-	}
-	
-	@Override
-	public Object getImage(Object object) {
-	    // Get the adapter from the factory.
-		//
-		IItemLabelProvider itemLabelProvider = (IItemLabelProvider) adapterFactory
-				.adapt(object, IItemLabelProvider.class);
-
-		return itemLabelProvider != null ? itemLabelProvider.getImage(object)
-				: super.getImage(object);
-	}
-	
-	@Override
-	public String getText(Object object) {
-	    // Get the adapter from the factory.
-		//
-		IItemLabelProvider itemLabelProvider = (IItemLabelProvider) adapterFactory
-				.adapt(object, IItemLabelProvider.class);
-
-		return itemLabelProvider != null ? itemLabelProvider.getText(object)
-				: super.getText(object);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/CategorySortHelper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/CategorySortHelper.java
deleted file mode 100644
index 88a77e9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/CategorySortHelper.java
+++ /dev/null
@@ -1,290 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * Helper class to handle sorting of Category elements
- * @author Jeff Hardy
- *
- */
-public class CategorySortHelper {
-	
-	public static final String KEY_CATEGORY_ELEMENTS__SORT_TYPE = "CategoryElementsSortType"; //$NON-NLS-1$
-	public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA = "Alphabetic"; //$NON-NLS-1$
-	public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA = "ReverseAlphabetic"; //$NON-NLS-1$
-	public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE = "MethodType"; //$NON-NLS-1$
-	public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL = "Manual"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new MethodElementProperty to store the Category sort type
-	 * @param sortType
-	 * @return
-	 */
-	public static MethodElementProperty createNewSortProperty(String sortType) {
-		MethodElementProperty prop = UmaFactory.eINSTANCE.createMethodElementProperty();
-		prop.setName(KEY_CATEGORY_ELEMENTS__SORT_TYPE);
-		if (sortType != null) {
-			prop.setValue(sortType);
-		}
-		return prop;
-	}
-	
-	/**
-	 * Return category sort property for method element
-	 * @param element
-	 * @return
-	 * 		 property if found, else null
-	 */
-	public static MethodElementProperty getCategorySortProperty(MethodElement element) {
-		List props = element.getMethodElementProperty();
-		for (Iterator it = props.iterator(); it.hasNext();) {
-			MethodElementProperty prop = (MethodElementProperty) it.next();
-			if (KEY_CATEGORY_ELEMENTS__SORT_TYPE.equals(prop.getName())) {
-				return prop;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * return true iff the category sort-type is set to manual
-	 * @param element
-	 * @return
-	 * 		 property if found, else null
-	 */
-	public static boolean isManualCategorySort(MethodElement element) {
-		String sortType = getCategorySortValue(element);
-		if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType))
-			return true;
-		return false;
-	}
-
-	/**
-	 * Returns the sort-type for the given MethodElement.
-	 * If none is set, will return Alphabetic sort (V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA) as a default
-	 * @param element
-	 * @return
-	 */
-	public static String getCategorySortValue(MethodElement element) {
-		MethodElementProperty prop = getCategorySortProperty(element);
-		if (prop == null)
-			return V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL;
-		return prop.getValue();
-	}
-
-	public static List<String> getCategorySortTypes() {
-		List<String> returnList = Arrays.<String>asList(
-				V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL,
-				V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA,
-				V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA,
-				V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE);
-		return returnList;
-	}
-
-	public static String getSortTypeDisplayName(String sortType) {
-		if (V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA.equals(sortType)) {
-			return LibraryEditResources.SortType_Alphabetic;
-		}
-		if (V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA.equals(sortType)) {
-			return LibraryEditResources.SortType_ReverseAlphabetic;
-		}
-		if (V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE.equals(sortType)) {
-			return LibraryEditResources.SortType_MethodType;
-		}
-		if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType)) {
-			return LibraryEditResources.SortType_Manual;
-		}
-		return ""; //$NON-NLS-1$
-	}
-	
-	/**
-	 * Returns a sorted category element list based on the category's sort type
-	 * Respects the Name/PresName toggle
-	 * @param element 
-	 * @param elements array to sort
-	 * @return
-	 */
-	public static List<Object> sortCategoryElements(MethodElement element, Object[] elements) {
-		return sortCategoryElements(element, elements, false);
-	}
-
-	/**
-	 * Returns a sorted category element list based on the category's sort type
-	 * @param element 
-	 * @param elements array to sort
-	 * @param forcePresNameSort true to always sort by presName. false will respect the toggle
-	 * @return
-	 */
-	public static List<Object> sortCategoryElements(MethodElement element, Object[] elements, boolean forcePresNameSort) {
-		/*
-		 * TODO: can't use generics here because EMF doesn't use them yet - the elements param
-		 * usually comes from ContentElementsOrderList class which extends EMF's BasicEList and so
-		 * the toArray() method will only return Object[]
-		 */
-		List<Object> returnList = new ArrayList<Object>(Arrays.<Object>asList(elements));
-		String sortType = getCategorySortValue(element);
-		if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType)) {
-			if (element instanceof ContentCategory) {
-				return findManualSortOrderInContributors((ContentCategory)element, returnList);
-			}
-			return returnList;
-		} else if (V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA.equals(sortType)) {
-			Comparator comparator = PresentationContext.INSTANCE.getComparator();
-			if (forcePresNameSort)
-				comparator = PresentationContext.INSTANCE.getPresNameComparator();
-			Collections.<Object>sort(returnList, comparator);
-		} else if (V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA.equals(sortType)) {
-			Comparator comparator = PresentationContext.INSTANCE.getReverseComparator();
-			if (forcePresNameSort)
-				comparator = PresentationContext.INSTANCE.getPresNameReverseComparator();
-			Collections.<Object>sort(returnList, comparator);
-		} else if (V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE.equals(sortType)) {
-			Comparator comparator = PresentationContext.INSTANCE.getMethodElementTypeComparator();
-			if (forcePresNameSort)
-				comparator = PresentationContext.INSTANCE.getPresNameMethodElementTypeComparator();
-			Collections.<Object>sort(returnList, comparator);
-		}
-		return returnList;
-	}
-	
-	private static List<Object> findManualSortOrderInContributors(ContentCategory cc, List<Object> elementList) {
-		OrderInfo latestInfo = null;
-		Map<String, MethodElement> guidMap = new HashMap<String, MethodElement>();
-
-		String sortType = getCategorySortValue(cc);
-		if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType)) {
-			// set up GUID map
-			for (Iterator iterator = elementList.iterator(); iterator.hasNext();) {
-				Object o = iterator.next();
-				if (o instanceof MethodElement) {
-					guidMap.put(((MethodElement)o).getGuid(),
-							(MethodElement)o);
-				}
-			}
-			for (Iterator iter = TngUtil.getContributors(cc);iter.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof ContentCategory) {
-					ContentCategory contributor = (ContentCategory)obj;
-					OrderInfo orderInfo = TngUtil.getOrderInfo(contributor, ContentElementOrderList.ORDER_INFO_NAME);
-					// find latest OrderInfo that contains all these elements
-					if (latestInfo == null || orderInfo.getTimestamp() > latestInfo.getTimestamp()) {
-						latestInfo = orderInfo;
-					}
-				}
-			}
-			if (latestInfo != null) {
-				List<Object> returnList = new ArrayList<Object>();
-				// sort list according to orderInfo
-				int size = latestInfo.getGUIDs().size();
-				for (int i = 0; i < size; i++) {
-					String guid = (String)latestInfo.getGUIDs().get(i);
-					Object element = guidMap.get(guid);
-					if (element != null) {
-						returnList.add(element);
-						guidMap.remove(guid);
-					} else {
-						// try to find element in the guidMap that has a generalizer with "guid"
-						MethodElement me = findElementInGeneralizerList(guidMap, guid);
-						if (me != null) {
-							returnList.add(me);
-							guidMap.remove(guid);
-						} else {
-							// could not locate, will return original list
-						}
-					}
-				}
-				if (elementList.size() == returnList.size())
-					return returnList;
-			}
-		}
-		return elementList;
-	}
-	
-	private static MethodElement findElementInGeneralizerList(Map<String, MethodElement> guidMap, String guid) {
-		for (Iterator<MethodElement> iter = guidMap.values().iterator();iter.hasNext();) {
-			MethodElement value = iter.next();
-			if (value instanceof VariabilityElement) {
-				for (Iterator genIter = TngUtil.getGeneralizers((VariabilityElement)value);genIter.hasNext();) {
-					Object generalizer = genIter.next();
-					if (generalizer instanceof MethodElement) {
-						if (((MethodElement)generalizer).getGuid().equals(guid)) {
-							return (MethodElement)generalizer;
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param cc
-	 * @param feature
-	 * @return
-	 */
-	public static boolean needToSort(MethodElement element, EStructuralFeature feature) {
-		if (! (element instanceof ContentCategory)) {
-			return false;
-		}
-		if (element instanceof CustomCategory && 
-				feature == UmaPackage.eINSTANCE.getCustomCategory_CategorizedElements()) {
-			return true;
-		}
-		if (element instanceof Discipline && 
-				feature == UmaPackage.eINSTANCE.getDiscipline_Tasks()) {
-			return true;
-		}
-		if (element instanceof Domain && 
-				feature == UmaPackage.eINSTANCE.getDomain_WorkProducts()) {
-			return true;
-		}
-		if (element instanceof RoleSet && 
-				feature == UmaPackage.eINSTANCE.getRoleSet_Roles()) {
-			return true;
-		}
-		if (element instanceof Tool && 
-				feature == UmaPackage.eINSTANCE.getTool_ToolMentors()) {
-			return true;
-		}
-		if (element instanceof WorkProductType && 
-				feature == UmaPackage.eINSTANCE.getWorkProductType_WorkProducts()) {
-			return true;
-		}
-
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Comparators.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Comparators.java
deleted file mode 100644
index f054d69..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Comparators.java
+++ /dev/null
@@ -1,261 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Comparator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.navigator.PluginUIPackagesItemProvider;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-
-import com.ibm.icu.text.Collator;
-
-
-/**
- * Collection of comparators
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class Comparators {
-
-	public static final Comparator<Object> DEFAULT_COMPARATOR = new Comparator<Object>() {
-
-		public int compare(Object o1, Object o2) {
-			if (o1 == o2)
-				return 0;
-			Collator collator = Collator.getInstance();
-			if (o1 instanceof MethodElement && o2 instanceof MethodElement) {
-				return collator.compare(((MethodElement) o1).getName(), ((MethodElement) o2).getName());
-			}
-			Object o1unwrap = TngUtil.unwrap(o1);
-			Object o2unwrap = TngUtil.unwrap(o2);
-			if (o1unwrap instanceof MethodElement
-					&& o2unwrap instanceof MethodElement) {
-				return collator.compare(((MethodElement) o1unwrap).getName(), ((MethodElement) o2unwrap).getName());
-			}
-			return 0;
-		}
-
-	};
-	
-	public static final Comparator<Object> REVERSE_DEFAULT_COMPARATOR = new Comparator<Object>() {
-
-		public int compare(Object o1, Object o2) {
-			if (o1 == o2)
-				return 0;
-			Collator collator = Collator.getInstance();
-			if (o1 instanceof MethodElement && o2 instanceof MethodElement) {
-				return oppositeValue(collator.compare(((MethodElement) o1).getName(), ((MethodElement) o2).getName()));
-			}
-			Object o1unwrap = TngUtil.unwrap(o1);
-			Object o2unwrap = TngUtil.unwrap(o2);
-			if (o1unwrap instanceof MethodElement
-					&& o2unwrap instanceof MethodElement) {
-				return oppositeValue(collator.compare(((MethodElement) o1unwrap).getName(), ((MethodElement) o2unwrap).getName()));
-			}
-			return 0;
-		}
-
-	};
-	
-	private static int oppositeValue(int val) {
-		if (val != 0) {
-			val = 0 - val;
-		}
-		return val;
-	}
-
-
-	public static abstract class TypeComparator implements Comparator {
-		protected Comparator<Object> getDefaultComparator() {
-			return DEFAULT_COMPARATOR;
-		}
-		
-		protected abstract int getOrderId(Object obj);
-
-		public int compare(Object o1, Object o2) {
-			o1 = TngUtil.unwrap(o1);
-			o2 = TngUtil.unwrap(o2);
-			if (o1 == o2)
-				return 0;
-			int ret = 0;
-			ret = getOrderId((EObject) o1) - getOrderId((EObject) o2);
-			if (ret == 0) {
-				return getDefaultComparator().compare(o1, o2);
-			}
-			return ret;
-		}
-
-	}
-
-	private static int comparePresentationName(DescribableElement e1, DescribableElement e2) {
-		Collator collator = Collator.getInstance();
-		String name1 = e1 instanceof BreakdownElement ? ProcessUtil.getPresentationName((BreakdownElement)e1)
-				: e1.getPresentationName();
-		if (name1.length() < 1) name1 = e1.getName();
-		String name2 = e2 instanceof BreakdownElement ? ProcessUtil.getPresentationName((BreakdownElement)e2)
-				: e2.getPresentationName();
-		if (name2.length() < 1) name2 = e2.getName();
-		return collator.compare(name1, name2);
-	}
-	
-	private static DescribableElement getDescribableElement(Object obj) {
-		Object object = TngUtil.unwrap(obj);
-		if (object instanceof ProcessComponent)
-			object = ((ProcessComponent) object).getProcess();
-		object = TngUtil.unwrap(object);
-		if(object instanceof DescribableElement) {
-			return (DescribableElement)object;
-		}
-		return null;
-	}
-
-	public static final Comparator PRESENTATION_NAME_COMPARATOR = new Comparator() {
-		
-		public int compare(Object o1, Object o2) {
-			if (o1 == o2)
-				return 0;
-			o1 = getDescribableElement(o1);
-			if (o1 == null) {
-				return 0;
-			}
-
-			o2 = getDescribableElement(o2);
-			if (o2 == null) {
-				return 0;
-			}
-
-			return comparePresentationName((DescribableElement) o1, (DescribableElement) o2);
-		}
-
-	};
-	
-	public static final Comparator REVERSE_PRESENTATION_NAME_COMPARATOR = new Comparator() {
-		
-		public int compare(Object o1, Object o2) {
-			if (o1 == o2)
-				return 0;
-			if(!(o1 instanceof DescribableElement)) {
-				o1 = TngUtil.unwrap(o1);
-				if(!(o1 instanceof DescribableElement)) {
-					return 0;
-				}
-			}
-			if(!(o2 instanceof DescribableElement)) {
-				o2 = TngUtil.unwrap(o2);
-				if(!(o2 instanceof DescribableElement)) {
-					return 0;
-				}
-			}
-			return oppositeValue(comparePresentationName((DescribableElement) o1, (DescribableElement) o2));
-		}
-
-	};
-
-	public static final Comparator METHOD_TYPE_COMPARATOR = new TypeComparator() {
-		/* (non-Javadoc)
-		 * @see org.eclipse.epf.library.edit.util.Comparators.TypeComparator#getDefaultComparator()
-		 */
-		protected Comparator getDefaultComparator() {
-			return PresentationContext.INSTANCE.getComparator();
-		}
-
-		protected int getOrderId(Object obj) {
-			if (obj instanceof MethodElement) {
-				int id = ((MethodElement) obj).eClass().getClassifierID();
-				if (id == UmaPackage.TERM_DEFINITION) {
-					id = Integer.MAX_VALUE;
-				}
-				return id;
-			}
-			return -1;
-		}
-	};
-	
-	/**
-	 * Always sort by presentation name
-	 */
-	public static final Comparator METHOD_TYPE_PRES_NAME_COMPARATOR = new TypeComparator() {
-		/* (non-Javadoc)
-		 * @see org.eclipse.epf.library.edit.util.Comparators.TypeComparator#getDefaultComparator()
-		 */
-		protected Comparator getDefaultComparator() {
-			return PresentationContext.INSTANCE.getPresNameComparator();
-		}
-
-		protected int getOrderId(Object obj) {
-			if (obj instanceof MethodElement) {
-				int id = ((MethodElement) obj).eClass().getClassifierID();
-				if (id == UmaPackage.TERM_DEFINITION) {
-					id = Integer.MAX_VALUE;
-				}
-				return id;
-			}
-			return -1;
-		}
-	};
-
-	public static final Comparator PLUGINPACKAGE_COMPARATOR = new Comparator() {
-	
-		public int compare(Object o1, Object o2) {
-			if (o1 == o2)
-				return 0;
-			o1 = TngUtil.unwrap(o1);
-			o2 = TngUtil.unwrap(o2);
-			
-			
-			if (o1 instanceof PluginUIPackagesItemProvider && o2 instanceof MethodPlugin) {
-				return -1;
-			}
-			if (o1 instanceof MethodPlugin && o2 instanceof PluginUIPackagesItemProvider) {
-				return 1;
-			}
-	
-			boolean usePresName = PresentationContext.INSTANCE.isShowPresentationNames();
-			String s1 = null;
-			String s2 = null;
-			if (usePresName && o1 instanceof DescribableElement) {
-				s1 = ((DescribableElement) o1).getPresentationName();
-			} else if (o1 instanceof MethodElement) {
-				s1 = ((MethodElement) o1).getName();
-			} else if (o1 instanceof PluginUIPackagesItemProvider) {
-				s1 = ((PluginUIPackagesItemProvider) o1).getFullName();
-			} else if (o1 instanceof String) {
-				s1 = (String) o1;
-			} 
-			
-			if (usePresName && o2 instanceof DescribableElement) {
-				s2 = ((DescribableElement) o2).getPresentationName();
-			} else if (o2 instanceof MethodElement) {
-				s2 = ((MethodElement) o2).getName();
-			} else if (o2 instanceof PluginUIPackagesItemProvider) {
-				s2 = ((PluginUIPackagesItemProvider) o2).getFullName();
-			} else if (o2 instanceof String) {
-				s2 = (String) o2;
-			}
-			
-			if (s1 == null || s2 == null) {
-				return 0;
-			}
-			
-			return s1.compareToIgnoreCase(s2);
-		}
-	};
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurableComposedAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurableComposedAdapterFactory.java
deleted file mode 100644
index 1f4aeba..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurableComposedAdapterFactory.java
+++ /dev/null
@@ -1,134 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.library.edit.IConfigurable;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-
-
-/**
- * Instance of this class can be configured using the specified filter
- * 
- * @author Phong Nguyen Le - Jul 27, 2005
- * @since 1.0
- */
-public class ConfigurableComposedAdapterFactory extends ComposedAdapterFactory {
-
-	private IFilter filter;
-
-	// private Set disposableAdapters;
-
-	/**
-	 * 
-	 */
-	public ConfigurableComposedAdapterFactory(AdapterFactory[] adapterFactories) {
-		super(adapterFactories);
-	}
-
-	// private Set getDisposableAdapters() {
-	// if(disposableAdapters == null) {
-	// disposableAdapters = new HashSet();
-	// }
-	// return disposableAdapters;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.AdapterFactory#adapt(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public Object adapt(Object object, Object type) {
-		Object adapter = super.adapt(object, type);
-		if (adapter instanceof IConfigurable) {
-			((IConfigurable) adapter).setFilter(filter);
-		}
-		// if(adapter instanceof IDisposable) {
-		// getDisposableAdapters().add(adapter);
-		// }
-		return adapter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.AdapterFactory#adapt(org.eclipse.emf.common.notify.Notifier,
-	 *      java.lang.Object)
-	 */
-	public Adapter adapt(Notifier target, Object type) {
-		Adapter adapter = super.adapt(target, type);
-		if (adapter instanceof IConfigurable) {
-			((IConfigurable) adapter).setFilter(filter);
-		}
-		// if(adapter instanceof IDisposable) {
-		// getDisposableAdapters().add(adapter);
-		// }
-		return adapter;
-	}
-
-	// /* (non-Javadoc)
-	// * @see org.eclipse.emf.edit.provider.ComposedAdapterFactory#dispose()
-	// */
-	// public void dispose() {
-	// if(disposableAdapters != null && !disposableAdapters.isEmpty()) {
-	// for (Iterator iter = disposableAdapters.iterator(); iter.hasNext();) {
-	// IDisposable adapter = (IDisposable) iter.next();
-	// adapter.dispose();
-	// }
-	// }
-	// super.dispose();
-	// }
-
-	public IFilter getFilter() {
-		return filter;
-	}
-
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.provider.ComposedAdapterFactory#fireNotifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		try {
-			super.fireNotifyChanged(notification);
-		} catch (RuntimeException e) {
-			if (notification instanceof ViewerNotification) {
-				LibraryEditPlugin.getDefault().getLogger().logError(e);
-
-				StringWriter strWriter = new StringWriter();
-				e.printStackTrace(new PrintWriter(strWriter));
-				Messenger.INSTANCE
-						.showError(
-								LibraryEditResources.util_configurablecomposedadapter_fatalerr,
-								LibraryEditResources.util_configurablecomposedadapter_refershingviewer,
-								LibraryEditResources.util_configurablecomposedadapter_unhandled_exception,
-								strWriter.toString(), e); 
-				return;
-			}
-			throw e;
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurationSetter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurationSetter.java
deleted file mode 100644
index 2a03446..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurationSetter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class ConfigurationSetter {
-	private AdapterFactory adapterFactory;
-	private IConfigurator configurator;
-	private MethodConfiguration oldConfig;
-
-	public ConfigurationSetter(AdapterFactory adapterFactory) {
-		this.adapterFactory = adapterFactory;
-	}
-	
-	public void set(MethodConfiguration config) {
-		IFilter filter = ProcessUtil.getFilter(adapterFactory);
-		configurator = filter instanceof IConfigurator ? (IConfigurator) filter : null;
-		if(configurator != null) {
-			oldConfig = configurator.getMethodConfiguration();
-			configurator.setMethodConfiguration(config);
-		}
-	}
-	
-	public void restore() {
-		if(configurator != null) {
-			configurator.setMethodConfiguration(oldConfig);
-		}
-	}
-	
-	public IConfigurator getConfigurator() {
-		return configurator;
-	}
-	
-	public MethodConfiguration getOldConfiguration() {
-		return oldConfig;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurationUtil.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurationUtil.java
deleted file mode 100644
index e9fb86f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurationUtil.java
+++ /dev/null
@@ -1,265 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * Utility class to add/remove objects from a MethodConfiguration using an IActionManager
- * @author Jeff Hardy
- *
- */
-public class ConfigurationUtil {
-	
-	private static boolean actionOnCollection(IActionManager actionMgr,
-			MethodConfiguration config, Collection value, int actionType,
-			EStructuralFeature feature, List listFeature) {
-		if (config != null && value != null && !value.isEmpty()) {
-			if (actionMgr != null) {
-				return actionMgr.doAction(actionType, config, feature, value,
-						-1);
-			} else {
-				if (actionType == IActionManager.ADD_MANY) {
-					return listFeature.addAll(value);
-				} else if (actionType == IActionManager.REMOVE_MANY) {
-					return listFeature.removeAll(value);
-				}
-			}
-		}
-		return true;
-	}
-	
-	private static boolean actionOnItem(IActionManager actionMgr,
-			MethodConfiguration config, Object value, int actionType,
-			EStructuralFeature feature, List listFeature) {
-		if (config != null
-				&& value != null
-				&& ((actionType == IActionManager.ADD && !listFeature
-						.contains(value)) || (actionType == IActionManager.REMOVE && listFeature
-						.contains(value)))) {
-			if (actionMgr != null) {
-				return actionMgr.doAction(actionType, config, feature, value,
-						-1);
-			} else {
-				if (actionType == IActionManager.ADD) {
-					return listFeature.add(value);
-				} else if (actionType == IActionManager.REMOVE) {
-					return listFeature.remove(value);
-				}
-			}
-		}
-		return true;
-	}
-
-	
-	/**
-	 * Adds the given collection to the MethodConfiguration's list of selected MethodPlugins
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addCollToMethodPluginList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.ADD_MANY, UmaPackage.eINSTANCE
-									.getMethodConfiguration_MethodPluginSelection(), config.getMethodPluginSelection());
-	}
-
-	/**
-	 * Adds the given MethodPlugin to the MethodConfiguration's list of selected MethodPlugins
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addToMethodPluginList(IActionManager actionMgr, MethodConfiguration config, MethodPlugin value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.ADD, UmaPackage.eINSTANCE
-				.getMethodConfiguration_MethodPluginSelection(), config.getMethodPluginSelection());
-	}
-
-	/**
-	 * Removes the given collection from the MethodConfiguration's list of selected MethodPlugins
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeCollFromMethodPluginList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.REMOVE_MANY, UmaPackage.eINSTANCE
-				.getMethodConfiguration_MethodPluginSelection(), config.getMethodPluginSelection());
-	}
-	
-	/**
-	 * Removes the given MethodPlugin from the MethodConfiguration's list of selected MethodPlugins
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeFromMethodPluginList(IActionManager actionMgr, MethodConfiguration config, MethodPlugin value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.REMOVE, UmaPackage.eINSTANCE
-				.getMethodConfiguration_MethodPluginSelection(), config.getMethodPluginSelection());
-	}
-
-	/**
-	 * Adds the given collection to the MethodConfiguration's list of selected MethodPackages
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addCollToMethodPackageList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.ADD_MANY, UmaPackage.eINSTANCE
-				.getMethodConfiguration_MethodPackageSelection(), config.getMethodPackageSelection());
-	}
-	
-	/**
-	 * Adds the given MethodPackage to the MethodConfiguration's list of selected MethodPackages
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addToMethodPackageList(IActionManager actionMgr, MethodConfiguration config, MethodPackage value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.ADD, UmaPackage.eINSTANCE
-				.getMethodConfiguration_MethodPackageSelection(), config.getMethodPackageSelection());
-	}
-
-	
-	/**
-	 * Removes the given collection from the MethodConfiguration's list of selected MethodPackages
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeCollFromMethodPackageList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.REMOVE_MANY, UmaPackage.eINSTANCE
-				.getMethodConfiguration_MethodPackageSelection(), config.getMethodPackageSelection());
-	}
-	
-	/**
-	 * Removes the given MethodPackage from the MethodConfiguration's list of selected MethodPackages
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeFromMethodPackageList(IActionManager actionMgr, MethodConfiguration config, MethodPackage value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.REMOVE, UmaPackage.eINSTANCE
-				.getMethodConfiguration_MethodPackageSelection(), config.getMethodPackageSelection());
-	}
-
-
-	/**
-	 * Adds the given collection to the MethodConfiguration's list of selected added-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addCollToAddedCategoryList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.ADD_MANY, UmaPackage.eINSTANCE
-				.getMethodConfiguration_AddedCategory(), config.getAddedCategory());
-	}
-	
-	/**
-	 * Adds the given ContentCategory to the MethodConfiguration's list of selected added-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addToAddedCategoryList(IActionManager actionMgr, MethodConfiguration config, ContentCategory value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.ADD, UmaPackage.eINSTANCE
-				.getMethodConfiguration_AddedCategory(), config.getAddedCategory());
-	}
-
-	/**
-	 * Removes the given collection from the MethodConfiguration's list of selected added-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeCollFromAddedCategoryList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.REMOVE_MANY, UmaPackage.eINSTANCE
-				.getMethodConfiguration_AddedCategory(), config.getAddedCategory());
-	}
-
-	/**
-	 * Removes the given ContentCategory from the MethodConfiguration's list of selected added-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeFromAddedCategoryList(IActionManager actionMgr, MethodConfiguration config, ContentCategory value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.REMOVE, UmaPackage.eINSTANCE
-				.getMethodConfiguration_AddedCategory(), config.getAddedCategory());
-	}
-
-	/**
-	 * Adds the given collection to the MethodConfiguration's list of selected subtracted-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addCollToSubtractedCategoryList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.ADD_MANY, UmaPackage.eINSTANCE
-				.getMethodConfiguration_SubtractedCategory(), config.getSubtractedCategory());
-	}
-	
-	/**
-	 * Adds the given ContentCategory to the MethodConfiguration's list of selected subtracted-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean addToSubtractedCategoryList(IActionManager actionMgr, MethodConfiguration config, ContentCategory value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.ADD, UmaPackage.eINSTANCE
-				.getMethodConfiguration_SubtractedCategory(), config.getSubtractedCategory());
-	}
-
-	/**
-	 * Removes the given collection from the MethodConfiguration's list of selected subtracted-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeCollFromSubtractedCategoryList(IActionManager actionMgr, MethodConfiguration config, Collection value) {
-		return actionOnCollection(actionMgr, config, value, IActionManager.REMOVE_MANY, UmaPackage.eINSTANCE
-				.getMethodConfiguration_SubtractedCategory(), config.getSubtractedCategory());
-	}
-	
-	/**
-	 * Removes the given ContentCategory from the MethodConfiguration's list of selected subtracted-categories
-	 * @param actionMgr use this IActionManager to change the MethodConfiguration, if null will change the MethodConfiguration directly.
-	 * @param config
-	 * @param value
-	 * @return false if actionManager or list manipulation fails, true otherwise
-	 */
-	public static boolean removeFromSubtractedCategoryList(IActionManager actionMgr, MethodConfiguration config, ContentCategory value) {
-		return actionOnItem(actionMgr, config, value, IActionManager.REMOVE, UmaPackage.eINSTANCE
-				.getMethodConfiguration_SubtractedCategory(), config.getSubtractedCategory());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConstraintManager.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConstraintManager.java
deleted file mode 100644
index bfc6202..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConstraintManager.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-
-
-/**
- * Helper class that manages the use of Contraint in library to store
- * implementation-specific data
- * 
- * @author Phong Nguyen Le - Dec 1, 2005
- * @since 1.0
- */
-public final class ConstraintManager {
-	/** Constants for contrain name */
-	public static final String ACITIVY_DIAGRAM = "diagram"; //$NON-NLS-1$
-
-	public static final String PROCESS_SUPPRESSION = ""; //$NON-NLS-1$
-
-	public static final Constraint getConstraint(MethodElement e,
-			String constraintName, boolean create) {
-		if (constraintName == null) {
-			return null;
-		}
-		Constraint constraint = null;
-		for (Iterator iter = e.getOwnedRules().iterator(); iter.hasNext();) {
-			Constraint c = (Constraint) iter.next();
-			if (c.getName().equals(constraintName)) {
-				constraint = c;
-				break;
-			}
-		}
-		if (constraint == null && create) {
-			constraint = UmaFactory.eINSTANCE.createConstraint();
-			constraint.setName(constraintName);
-			e.getOwnedRules().add(constraint);
-		}
-		return constraint;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementInheritanceHelper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementInheritanceHelper.java
deleted file mode 100644
index 874d39b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementInheritanceHelper.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * This class defines static helper methods that are related to content element
- * inheritance.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class ContentElementInheritanceHelper {
-	
-	private static List descendingSortByCreationTime(List tasks) {
-		return tasks;
-	}
-
-	// private static void addSteps(List steps, Task base) {
-	// Object first = null;
-	// if(!steps.isEmpty()) {
-	// first = steps.get(0);
-	// }
-	// List tasks = AssociationHelper.getImmediateVarieties(base);
-	// int size = tasks.size();
-	// for(int i = 0; i < size; i++) {
-	// Task task = (Task) tasks.get(i);
-	// List sections = task.getPresentation().getSections();
-	// int numOfSections = sections.size();
-	// Section prev = null;
-	// for (int j = 0; j < numOfSections; j++) {
-	// Section section = (Section) sections.get(j);
-	// Section pred = section.getPredecessor();
-	// if(pred == null) {
-	// }
-	// }
-	// }
-	// }
-
-	/**
-	 * Gets all steps in the task tree that the given task belongs to
-	 * 
-	 * @param task
-	 * @return
-	 */
-	public static List getAllTaskSteps(Task task) {
-		Task base = (Task) TngUtil.getBase(task);
-		List steps = new ArrayList(base.getPresentation().getSections());
-		Iterator tasks = new AbstractTreeIterator(base, false) {
-
-			protected Iterator getChildren(Object object) {
-				return AssociationHelper.getImmediateVarieties(
-						(VariabilityElement) object).iterator();
-			}
-
-		};
-		Task currentBase = base;
-		while (tasks.hasNext()) {
-			Task t = (Task) tasks.next();
-			if (currentBase != t.getVariabilityBasedOnElement()) {
-				// new inheritance level
-				//
-				currentBase = (Task) t.getVariabilityBasedOnElement();
-
-			}
-			for (Iterator iter = t.getPresentation().getSections().iterator(); iter
-					.hasNext();) {
-				Section s = (Section) iter.next();
-				Section pred = s.getPredecessor();
-				if (pred != null) {
-
-				}
-			}
-		}
-		return steps;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementList.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementList.java
deleted file mode 100644
index d4f408c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementList.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.epf.uma.ContentPackage;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class ContentElementList {
-
-	private ContentPackage contentPkg;
-
-	protected class ElementIterator extends AbstractTreeIterator {
-
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = -2291438970123985906L;
-
-		protected ElementIterator() {
-			super(contentPkg, false);
-		}
-		
-		protected List getChildrenList(Object object) {
-			ArrayList children = new ArrayList();
-			if(object instanceof ContentPackage) {
-				ContentPackage pkg = (ContentPackage) object;
-				children.addAll(pkg.getChildPackages());
-				List elements = pkg.getContentElements();
-				for (int i = 0; i < elements.size(); i++) {
-					Object obj = elements.get(i);
-					if (accept(obj)) {
-						children.add(obj);
-					}
-				}
-			}
-			return children;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.common.util.AbstractTreeIterator#getChildren(java.lang.Object)
-		 */
-		protected Iterator getChildren(Object object) {
-			return getChildrenList(object).iterator();
-		}
-		
-	};
-	
-	public ContentElementList(ContentPackage contentPkg) {
-		this.contentPkg = contentPkg;
-	}
-
-	public abstract boolean accept(Object obj);
-
-	protected Iterator elementIterator() {
-		return new ElementIterator();
-	}
-	
-	private void getAllElements(ContentPackage pkg, List list) {
-//		List elements = pkg.getContentElements();
-//		for (int i = 0; i < elements.size(); i++) {
-//			Object obj = elements.get(i);
-//			if (accept(obj)) {
-//				list.add(obj);
-//			}
-//		}
-//		List packages = pkg.getChildPackages();
-//		for (int i = 0; i < packages.size(); i++) {
-//			Object obj = packages.get(i);
-//			if (obj instanceof ContentPackage) {
-//				getAllElements((ContentPackage) obj, list);
-//			}
-//		}
-		
-		for(Iterator iter = elementIterator(); iter.hasNext();) {
-			Object e = iter.next();
-			if(!(e instanceof ContentPackage)) {
-				list.add(e);
-			}
-		}
-	}
-
-	public List getList() {
-		List list = new ArrayList();
-		getAllElements(contentPkg, list);
-		return list;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementOrderList.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementOrderList.java
deleted file mode 100644
index 3f01599..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ContentElementOrderList.java
+++ /dev/null
@@ -1,514 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.epf.library.edit.util.model.ModelFactory;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-import org.eclipse.epf.library.edit.util.model.util.StringResource;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * 
- * This class encapsulates all the logics used to retrieve the list of all
- * contributed/inherited sections of the given element as well as allows
- * manipulate this list.
- * 
- * @author Lokanath Jagga
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ContentElementOrderList extends BasicEList {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 3257572797487069233L;
-
-	public static final String ORDER_INFO_NAME = "content elements"; //$NON-NLS-1$
-
-	private static final Map DEFAULT_SAVE_OPTIONS = new HashMap();
-
-	public static final int CONTENT_ELEMENTS__FOR_ELEMENT_ONLY = 1;
-
-	public static final int CONTENT_ELEMENTS__FOR_ELEMENT_AND_PARENTS = 2;
-
-	static {
-		DEFAULT_SAVE_OPTIONS.put(XMLResource.OPTION_ENCODING, "ASCII"); //$NON-NLS-1$
-	}
-
-	private ContentElement editElement;
-
-	private boolean mixed = true;
-
-	private boolean changed = false;
-
-	private EStructuralFeature feature;
-
-	private static boolean isContributor(VariabilityElement e) {
-		return TngUtil.isContributor(e);
-	}
-
-	public ContentElementOrderList(ContentElement e, int scope, EStructuralFeature feature) {
-		this.feature = feature;
-		editElement = e;
-		if (scope == CONTENT_ELEMENTS__FOR_ELEMENT_ONLY) {
-			mixed = false;
-		} else if (scope == CONTENT_ELEMENTS__FOR_ELEMENT_AND_PARENTS) {
-			calculateParentsOnly(e);
-		} else {
-			mixed = false;
-		}
-	}
-
-	private void calculateParentsOnly(ContentElement e) {
-		Iterator iter = null;
-		if (isContributor(e) || isExtended(e)) {
-			List supers = new ArrayList();
-			UmaUtil.getAllSupersBoth(supers, e,
-					VariabilityType.CONTRIBUTES_LITERAL,
-					VariabilityType.EXTENDS_LITERAL);
-			supers.add(e);
-			iter = supers.iterator();
-		} else {
-			mixed = false;
-		}
-
-		if (mixed) {
-			// create a map of GUID / contributor 
-			
-			OrderInfo latestInfo = null;
-			Map guidMap = new HashMap();
-			Set elements = new LinkedHashSet();
-			while (iter.hasNext()) {
-				ContentElement element = (ContentElement) iter.next();
-				if (element instanceof ContentElement) {
-					List contentElements = new ArrayList();
-					Object eGet = ((ContentElement) element).eGet(feature);
-					if (eGet instanceof List) {
-						contentElements.addAll((List) eGet);
-					}
-					for (Iterator iterator = contentElements.iterator(); iterator
-							.hasNext();) {
-						DescribableElement categorizedElement = (DescribableElement) iterator
-								.next();
-						guidMap.put(categorizedElement.getGuid(),
-								categorizedElement);
-						elements.add(categorizedElement);
-					}
-				}
-
-				OrderInfo orderInfo = TngUtil.getOrderInfo(element,
-						ORDER_INFO_NAME);
-				if (orderInfo != null) {
-					if (latestInfo == null
-							|| orderInfo.getTimestamp() > latestInfo
-									.getTimestamp()) {
-						latestInfo = orderInfo;
-					}
-				}
-			}
-
-			if (latestInfo != null) {
-				// reorder the sections based on the latest order info
-				int size = latestInfo.getGUIDs().size();
-				for (int i = 0; i < size; i++) {
-					Object guid = latestInfo.getGUIDs().get(i);
-					Object element = guidMap.get(guid);
-					if (element != null) {
-						super.add(element);
-						elements.remove(element);
-					}
-				}
-			}
-			super.addAll(elements);
-		}
-	}
-
-	// deprecate the following constructor
-	public ContentElementOrderList(ContentElement e) {
-		editElement = e;
-		Iterator iter = null;
-		if (isContributor(e) || TngUtil.hasContributor(e)) {
-			VariabilityElement base = TngUtil.getBase(e);
-			iter = new AbstractTreeIterator(base) {
-
-				protected Iterator getChildren(Object object) {
-					List children = new ArrayList();
-					for (Iterator iterator = AssociationHelper
-							.getImmediateVarieties((VariabilityElement) object)
-							.iterator(); iterator.hasNext();) {
-						VariabilityElement element = (VariabilityElement) iterator
-								.next();
-						if (element.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL) {
-							children.add(element);
-						}
-					}
-					return children.iterator();
-				}
-
-			};
-		} else if (isExtended(e)) {
-			System.out
-					.println("$$$ for " + e.getName() + " = extended is true"); //$NON-NLS-1$ //$NON-NLS-2$
-			List supers = new ArrayList();
-			UmaUtil.getAllSupers(supers, e, VariabilityType.EXTENDS_LITERAL);
-			supers.add(e);
-			iter = supers.iterator();
-		} else {
-			mixed = false;
-		}
-
-		if (mixed) {
-			// create a map of GUID / contributor
-			OrderInfo latestInfo = null;
-			Map guidMap = new HashMap();
-			List elements = new LinkedList();
-			while (iter.hasNext()) {
-				ContentElement element = (ContentElement) iter.next();
-				guidMap.put(element.getGuid(), element);
-				elements.add(element);
-
-				OrderInfo orderInfo = TngUtil.getOrderInfo(element,
-						ORDER_INFO_NAME);
-				if (orderInfo != null) {
-					if (latestInfo == null
-							|| orderInfo.getTimestamp() > latestInfo
-									.getTimestamp()) {
-						latestInfo = orderInfo;
-					}
-				}
-			}
-
-			if (latestInfo != null) {
-				// reorder the sections based on the latest order info
-				//
-				int size = latestInfo.getGUIDs().size();
-				for (int i = 0; i < size; i++) {
-					Object guid = latestInfo.getGUIDs().get(i);
-					Object element = guidMap.get(guid);
-					if (element != null) {
-						super.add(element);
-						elements.remove(element);
-					}
-				}
-			}
-			super.addAll(elements);
-		}
-		// else {
-		// // addAll(editElement.getPresentation().getSections());
-		// mixed = false;
-		// }
-	}
-
-	private static boolean isExtended(ContentElement e) {
-		return e.getVariabilityBasedOnElement() != null
-				&& e.getVariabilityType() == VariabilityType.EXTENDS_LITERAL;
-	}
-
-	/**
-	 * Applies recent changes in the list
-	 * 
-	 */
-	public void apply() {
-		if (!mixed || !changed)
-			return;
-
-		// save the order info to the orderingGuide of the editElement
-		//
-		String str = editElement.getOrderingGuide();
-		OrderInfoCollection orderInfos = null;
-		StringResource res = null;
-		if (str == null || str.length() == 0) {
-			orderInfos = ModelFactory.eINSTANCE.createOrderInfoCollection();
-		} else {
-			res = new StringResource(str);
-			try {
-				res.load(null);
-				if (res.getContents().isEmpty()) {
-					orderInfos = ModelFactory.eINSTANCE
-							.createOrderInfoCollection();
-				} else {
-					orderInfos = (OrderInfoCollection) res.getContents().get(0);
-				}
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-
-		// find the order infor for sections
-		//
-		OrderInfo sectOrderInfo = null;
-		for (Iterator iter = orderInfos.getOrderInfos().iterator(); iter
-				.hasNext();) {
-			OrderInfo orderInfo = (OrderInfo) iter.next();
-			if (ORDER_INFO_NAME.equalsIgnoreCase(orderInfo.getName())) {
-				sectOrderInfo = orderInfo;
-				break;
-			}
-		}
-
-		if (sectOrderInfo == null) {
-			sectOrderInfo = ModelFactory.eINSTANCE.createOrderInfo();
-			sectOrderInfo.setName(ORDER_INFO_NAME);
-			orderInfos.getOrderInfos().add(sectOrderInfo);
-		} else {
-			sectOrderInfo.getGUIDs().clear();
-		}
-
-		int size = size();
-		for (int i = 0; i < size; i++) {
-			DescribableElement sect = (DescribableElement) get(i);
-			sectOrderInfo.getGUIDs().add(sect.getGuid());
-		}
-		sectOrderInfo.setTimestamp(System.currentTimeMillis());
-		if (res == null) {
-			res = new StringResource(null);
-			res.getContents().add(orderInfos);
-		}
-		try {
-			res.save(DEFAULT_SAVE_OPTIONS);
-			str = res.getString();
-			// System.out.println("SectionList.apply(): new ordering guide");
-			// System.out.println("------ orderingGuide start ------");
-			// System.out.println(str);
-			// System.out.println("------ orderingGuide end ------");
-			editElement.setOrderingGuide(str);
-		} catch (IOException e) {
-			e.printStackTrace();
-		} catch (RuntimeException e) {
-			e.printStackTrace();
-		}
-	}
-
-	public boolean canRemove(ContentElement contentElement) {
-		if (eGet().contains(contentElement)) {
-			return true;
-		}
-		return false;
-	}
-
-	public Object remove(int index) {
-		if (mixed) {
-			if (!canRemove((ContentElement) get(index)))
-				return null;
-			Object removed = super.remove(index);
-			eGet().remove(removed);
-			return removed;
-		} else {
-			return eGet().remove(index);
-		}
-	}
-
-	public boolean remove(Object o) {
-		if (!canRemove((ContentElement) o))
-			return false;
-		if (mixed) {
-			if (super.remove(o)) {
-				eGet().remove(o);
-				return true;
-			}
-			return false;
-		}
-		return eGet().remove(o);
-	}
-
-	public boolean removeAll(Collection c) {
-		if (mixed) {
-			boolean modified = false;
-			Iterator e = iterator();
-			while (e.hasNext()) {
-				Object o = e.next();
-				if (c.contains(o) && canRemove((ContentElement) o)) {
-					e.remove();
-					eGet().remove(o);
-					modified = true;
-				}
-			}
-			return modified;
-		} else {
-			return eGet().removeAll(c);
-		}
-	}
-
-	public void add(int index, Object element) {
-		if (mixed) {
-			super.add(index, element);
-			eGet().add(element);
-			changed = true;
-		} else {
-			eGet().add(index, element);
-		}
-	}
-
-	public boolean add(Object o) {
-		boolean b = eGet().add(o);
-		if (mixed) {
-			b = super.add(o);
-			if (b)
-				changed = true;
-		}
-		return b;
-	}
-
-	public boolean addAll(Collection c) {
-		boolean b = eGet().addAll(c);
-		;
-		if (mixed) {
-			b = super.addAll(c);
-			if (b)
-				changed = true;
-		}
-		return b;
-	}
-
-	public boolean addAll(int index, Collection c) {
-		if (mixed) {
-			eGet().addAll(c);
-			;
-			boolean b = super.addAll(index, c);
-			if (b)
-				changed = true;
-		}
-		return eGet().addAll(c);
-	}
-
-	public Object set(int index, Object element) {
-		if (mixed)
-			throw new UnsupportedOperationException();
-		return eGet().set(index, element);
-	}
-
-	public void clear() {
-		if (mixed)
-			throw new UnsupportedOperationException();
-		eGet().clear();
-	}
-
-	public void move(int index, Object object) {
-		if (mixed) {
-			super.move(index, object);
-			changed = true;
-		} else {
-			((EList) eGet()).move(index, object);
-		}
-	}
-
-	public Object move(int targetIndex, int sourceIndex) {
-		if (mixed) {
-			Object moved = super.move(targetIndex, sourceIndex);
-			changed = true;
-			return moved;
-		} else {
-			return eGet().move(targetIndex, sourceIndex);
-		}
-	}
-
-	public Object get(int index) {
-		if (mixed) {
-			return super.get(index);
-		} else {
-			return eGet().get(index);
-		}
-	}
-
-	public int size() {
-		if (mixed) {
-			return super.size();
-		} else {
-			return eGet().size();
-		}
-	}
-
-	public Iterator iterator() {
-		if (mixed) {
-			return super.iterator();
-		} else {
-			return eGet().iterator();
-		}
-	}
-
-	public boolean contains(Object object) {
-		if (mixed) {
-			return super.contains(object);
-		}
-		return eGet().contains(object);
-	}
-
-	public boolean containsAll(Collection collection) {
-		if (mixed)
-			return super.containsAll(collection);
-		return eGet().containsAll(collection);
-	}
-
-	public Object[] toArray() {
-		if (mixed) {
-			return super.toArray();
-		}
-		return eGet().toArray();
-	}
-
-	public Object[] toArray(Object[] array) {
-		if (mixed)
-			return super.toArray(array);
-		return eGet().toArray(array);
-	}
-
-	public int indexOf(Object object) {
-		if (mixed)
-			return super.indexOf(object);
-		return eGet().indexOf(object);
-	}
-
-	public int lastIndexOf(Object object) {
-		if (mixed)
-			return super.lastIndexOf(object);
-		return eGet().lastIndexOf(object);
-	}
-
-	public boolean isMixed() {
-		return mixed;
-	}
-
-	private EList eGet() {
-		EList list = null;
-		Object object = ((ContentCategory) editElement).eGet(feature);
-		if (object instanceof EList) {
-			list = (EList) object;
-		}
-		if (list == null) {
-			list = new BasicEList();
-		}
-		return list;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DebugUtil.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DebugUtil.java
deleted file mode 100644
index 596b5d5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DebugUtil.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.io.PrintStream;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Utility class for debug purpose
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public final class DebugUtil {
-
-	private static PrintStream output;
-	private static String prompt = "LD> "; 					//$NON-NLS-1$
-	
-	public static void setOutput(PrintStream op) {
-		output = op;
-	}
-	
-	public static void setPrompt(String pt) {
-		prompt = pt;
-	}
-	
-	private static PrintStream out() {
-		if (output != null) {
-			return output;
-		}
-		return System.out;
-	}
-	
-	public static void print(String beginTitle, String endTitle, Collection<? extends MethodElement> elements, int ix) {
-		if (beginTitle != null) {
-			String str = "";				//$NON-NLS-1$
-			if (elements == null) {
-				str = "null";				//$NON-NLS-1$
-			} else if (elements.isEmpty()) {
-				str = elements.toString();
-			}
-			out().println(prompt + beginTitle + str);
-		}
-		
-		if (elements == null) {
-			return;
-		}
-		for (Iterator<? extends MethodElement> it = elements.iterator(); it.hasNext();) {
-			MethodElement element = it.next();
-			out().println(prompt + toString(element, ix));
-		}
-		
-		if (endTitle != null) {
-			out().println(prompt + endTitle);
-		}
-		out().println("");			//$NON-NLS-1$
-	}
-	
-	public static String toString(MethodElement element, int ix) {
-		if (ix == 1) {
-			return TngUtil.getLabelWithPath(element);
-		} 
-		if (ix == 2) {
-			return element.eClass().getName() + ", " +  //$NON-NLS-1$
-					element.getGuid() + ", " + TngUtil.getLabelWithPath(element);//$NON-NLS-1$ 
-		}
-		return element.toString();
-	}	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DepthLevelAdapterFactoryTreeIterator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DepthLevelAdapterFactoryTreeIterator.java
deleted file mode 100644
index 7965190..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DepthLevelAdapterFactoryTreeIterator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.2
- */
-public class DepthLevelAdapterFactoryTreeIterator<E> extends
-		AdapterFactoryTreeIterator<E> {
-
-	private static final long serialVersionUID = 252717827762000822L;
-
-	private int depthLevel;
-
-	public DepthLevelAdapterFactoryTreeIterator(AdapterFactory adapterFactory,
-			Object object, boolean includeRoot) {
-		super(adapterFactory, object, includeRoot);
-	}
-
-	public DepthLevelAdapterFactoryTreeIterator(AdapterFactory adapterFactory,
-			E object) {
-		super(adapterFactory, object);
-	}
-
-	public E next() {
-		depthLevel = size();
-		return super.next();
-	}
-	
-	public int getDepthLevel() {
-		return depthLevel;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DiagramOptions.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DiagramOptions.java
deleted file mode 100644
index a60f15a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/DiagramOptions.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElementProperty;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class DiagramOptions {
-	
-	private static final String PROP_PUBLISH_AD = "publish_ad"; //$NON-NLS-1$
-	
-	private static final String PROP_PUBLISH_ADD = "publish_add"; //$NON-NLS-1$
-	
-	private static final String PROP_PUBLISH_WPDD = "publish_wpdd"; //$NON-NLS-1$
-	
-	public static final void setPublishAD(Activity activity, boolean b){
-		MethodElementPropertyHelper.setProperty(activity, PROP_PUBLISH_AD, b);
-	}
-	
-	public static final boolean isPublishAD(Activity activity){
-		MethodElementProperty prop = MethodElementPropertyHelper.getProperty(activity, PROP_PUBLISH_AD);
-		return prop != null ? Boolean.parseBoolean(prop.getValue()) : true; 
-	}
-	
-	public static final void setPublishADD(Activity activity, boolean b){
-		MethodElementPropertyHelper.setProperty(activity, PROP_PUBLISH_ADD, b);
-	}
-	
-	public static final boolean isPublishADD(Activity activity){
-		MethodElementProperty prop = MethodElementPropertyHelper.getProperty(activity, PROP_PUBLISH_ADD);
-		return prop != null ? Boolean.parseBoolean(prop.getValue()) : true; 
-	}
-	
-	public static final void setPublishWPDD(Activity activity, boolean b){
-		MethodElementPropertyHelper.setProperty(activity, PROP_PUBLISH_WPDD, b);
-	}
-	
-	public static final boolean isPublishWPDD(Activity activity){
-		MethodElementProperty prop = MethodElementPropertyHelper.getProperty(activity, PROP_PUBLISH_WPDD);
-		return prop != null ? Boolean.parseBoolean(prop.getValue()) : true; 
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/EditingDomainComposedAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/EditingDomainComposedAdapterFactory.java
deleted file mode 100644
index c22a9e7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/EditingDomainComposedAdapterFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-
-/**
- * A ConfigurableComposedAdapterFactory that implements IEditingDomainProvider
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class EditingDomainComposedAdapterFactory extends
-		ConfigurableComposedAdapterFactory implements IEditingDomainProvider {
-
-	private EditingDomain editingDomain;
-
-	public EditingDomainComposedAdapterFactory(AdapterFactory[] adapterFactories) {
-		super(adapterFactories);
-	}
-
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	public void setEditingDomain(EditingDomain editingDomain) {
-		this.editingDomain = editingDomain;
-		if (editingDomain instanceof AdapterFactoryEditingDomain) {
-			((AdapterFactoryEditingDomain) editingDomain)
-					.setAdapterFactory(this);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ExposedAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ExposedAdapterFactory.java
deleted file mode 100644
index 55638f0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ExposedAdapterFactory.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.library.edit.IReferencer;
-import org.eclipse.epf.library.edit.process.IColumnAware;
-
-
-/**
- * An EditingDomainComposedAdapterFactory that exposes internal data
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ExposedAdapterFactory extends EditingDomainComposedAdapterFactory
-		implements IColumnAware, IReferencer {
-
-	private Map columnIndexToNameMap;
-
-	/**
-	 * @param adapterFactories
-	 */
-	public ExposedAdapterFactory(AdapterFactory[] adapterFactories) {
-		super(adapterFactories);
-	}
-
-	public List getChangeListeners() {
-		return changeNotifier;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IColumnAware#setColumnIndexToNameMap(java.util.Map)
-	 */
-	public void setColumnIndexToNameMap(Map map) {
-		columnIndexToNameMap = map;
-
-		for (Iterator iter = adapterFactories.iterator(); iter.hasNext();) {
-			Object adapterFactory = iter.next();
-			if (adapterFactory instanceof IColumnAware) {
-				((IColumnAware) adapterFactory).setColumnIndexToNameMap(map);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.library.edit.process.IColumnAware#getColumnIndexToNameMap()
-	 */
-	public Map getColumnIndexToNameMap() {
-		return columnIndexToNameMap;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.IReferencer#cleanUp()
-	 */
-	public void cleanUp() {
-		int size = adapterFactories.size();
-		for (int i = 0; i < size; i++) {
-			Object adapterFactory = adapterFactories.get(i);
-			if(adapterFactory instanceof IReferencer) {
-				((IReferencer)adapterFactory).cleanUp();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.IReferencer#remove(java.lang.Object)
-	 */
-	public boolean remove(Object ref) {
-		boolean removed = false;
-		int size = adapterFactories.size();
-		for (int i = 0; i < size; i++) {
-			Object adapterFactory = adapterFactories.get(i);
-			if(adapterFactory instanceof IReferencer) {
-				((IReferencer)adapterFactory).remove(ref);
-				removed = true;
-			}
-		}
-		return removed;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ExtensionManager.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ExtensionManager.java
deleted file mode 100644
index e253bc5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ExtensionManager.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.INestedCommandProvider;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.osgi.framework.Bundle;
-
-/**
- * Helper class with methods to retrieve extensions
- * 
- * @author Phong Nguyen Le - Jun 27, 2006
- * @since  1.0
- */
-public final class ExtensionManager {
-	private static Map IDToExtensionMap = new HashMap();
-	private static List<INestedCommandProvider> nestedCommandProviders;
-	private static List oppositeFeatureLoaders;
-	
-	public static List getExtensions(String namespace, String extensionPointName, Class type) {
-		List list = new ArrayList();
-		try {
-			IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-			IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(namespace, extensionPointName);
-			if (extensionPoint != null) {
-				IExtension[] extensions = extensionPoint.getExtensions();
-				for (int i = 0; i < extensions.length; i++) {
-					IExtension extension = extensions[i];
-					String pluginId = extension.getNamespaceIdentifier();
-					Bundle bundle = Platform.getBundle(pluginId);
-					IConfigurationElement[] configElements = extension
-					.getConfigurationElements();
-					for (int j = 0; j < configElements.length; j++) {
-						IConfigurationElement configElement = configElements[j];
-						try {
-							String className = configElement.getAttribute("class"); //$NON-NLS-1$
-							if(className != null) {
-								Object ext = bundle.loadClass(className).newInstance();
-								if(type.isInstance(ext)) {
-									list.add(ext);
-								}
-							}
-						} catch (Exception e) {
-							LibraryEditPlugin.INSTANCE.log(e);
-						}
-					}
-				}
-			}
-		}
-		catch(Exception e) {
-			LibraryEditPlugin.getDefault().getLogger().logError(e);
-		}
-		if(list.isEmpty()) {
-			return Collections.EMPTY_LIST;
-		}
-		return list;
-	}
-	
-	public static Object getExtension(String namespace, String extensionPointName) {
-		String ID = namespace + '.' + extensionPointName;
-		Object ext = IDToExtensionMap.get(ID);
-		if(ext == null) {
-			synchronized (IDToExtensionMap) {
-				ext = IDToExtensionMap.get(ID);
-				if(ext == null) {
-					// Process the contributors.
-					//
-					IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-					IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(namespace, extensionPointName);
-					if (extensionPoint != null) {
-						IExtension[] extensions = extensionPoint.getExtensions();
-						ext_walk:
-						for (int i = 0; i < extensions.length; i++) {
-							IExtension extension = extensions[i];
-							String pluginId = extension.getNamespaceIdentifier();
-							Bundle bundle = Platform.getBundle(pluginId);
-							IConfigurationElement[] configElements = extension
-									.getConfigurationElements();
-							for (int j = 0; j < configElements.length; j++) {
-								IConfigurationElement configElement = configElements[j];
-								try {
-									String className = configElement.getAttribute("class"); //$NON-NLS-1$
-									if(className != null) {
-										ext = bundle.loadClass(className).newInstance();
-										break ext_walk;
-									}
-								} catch (Exception e) {
-									LibraryEditPlugin.INSTANCE.log(e);
-								}
-							}
-						}
-					}
-					if(ext != null) {
-						IDToExtensionMap.put(ID, ext);
-					}
-				} 
-			}
-
-		}
-		return ext;
-	}
-
-	public static ITextReferenceReplacer getTextReferenceReplacer() {
-		return (ITextReferenceReplacer) getExtension(LibraryEditPlugin.getDefault().getId(), "textReferenceReplacer"); //$NON-NLS-1$ 
-	}
-
-	public static List<INestedCommandProvider> getNestedCommandProviders() {
-		if(nestedCommandProviders == null) {
-			nestedCommandProviders = getExtensions(LibraryEditPlugin.getDefault().getId(), 
-					"nestedCommandProviders", INestedCommandProvider.class); //$NON-NLS-1$
-		}
-		return nestedCommandProviders;
-	}
-
-	public static IDiagramManager getDiagramManager() {
-		return (IDiagramManager) getExtension(LibraryEditPlugin.getDefault().getId(), "diagramManager"); //$NON-NLS-1$ 
-	}
-	
-	public static List getOppositeFeatureLoaders() {
-		if(oppositeFeatureLoaders == null) {
-			oppositeFeatureLoaders = getExtensions(LibraryEditPlugin.getDefault().getId(), 
-					"oppositeFeatureLoaders", INestedCommandProvider.class); //$NON-NLS-1$
-		}
-		return oppositeFeatureLoaders;
-	}
-	
-	public static IUserInteractionHandler getDefaultUserInteractionHandler() {
-		return (IUserInteractionHandler) getExtension(LibraryEditPlugin.getDefault().getId(), "userInteractionHandler"); //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/GraphicalData.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/GraphicalData.java
deleted file mode 100644
index 7f8d302..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/GraphicalData.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.awt.Dimension;
-import java.awt.Point;
-
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.GraphNode;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class GraphicalData {
-	private Point location = new Point(0, 0);
-
-	private Dimension size = new Dimension(-1, -1);
-
-	private GraphNode graphNode;
-
-	private Diagram diagram;
-
-	public Diagram getDiagram() {
-		return diagram;
-	}
-
-	public void setDiagram(Diagram diagram) {
-		this.diagram = diagram;
-	}
-
-	public GraphNode getGraphNode() {
-		return graphNode;
-	}
-
-	public void setGraphNode(GraphNode graphNode) {
-		this.graphNode = graphNode;
-	}
-
-	/**
-	 * @return Returns the location.
-	 */
-	public Point getLocation() {
-		return location;
-	}
-
-	/**
-	 * @param location
-	 *            The location to set.
-	 */
-	public void setLocation(Point location) {
-		this.location = location;
-	}
-
-	/**
-	 * @return Returns the size.
-	 */
-	public Dimension getSize() {
-		return size;
-	}
-
-	/**
-	 * @param size
-	 *            The size to set.
-	 */
-	public void setSize(Dimension size) {
-		this.size = size;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IBreakdownStructureAdapterFactories.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IBreakdownStructureAdapterFactories.java
deleted file mode 100644
index e9661b5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IBreakdownStructureAdapterFactories.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-
-/**
- * Interface to provides a related set of adapter factories for breakdown
- * structure views
- * 
- * @author Phong Nguyen Le - Mar 20, 2006
- * @since 1.0
- */
-public interface IBreakdownStructureAdapterFactories {
-	AdapterFactory getWBSAdapterFactory();
-
-	AdapterFactory getTBSAdapterFactory();
-
-	AdapterFactory getWPBSAdapterFactory();
-
-	AdapterFactory getCBSAdapterFactory();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IDiagramManager.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IDiagramManager.java
deleted file mode 100644
index 42869c4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IDiagramManager.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Diagram;
-
-/**
- * Manages diagrams of activity
- * 
- * @author Phong Nguyen Le - Jun 27, 2006
- * @since  1.0
- */
-public interface IDiagramManager {
-	/** Diagram type constants */
-	public static final int ACTIVITY_DIAGRAM = 0;
-
-	public static final int WORK_PRODUCT_DEPENDENCY_DIAGRAM = 1;
-
-	public static final int ACTIVITY_DETAIL_DIAGRAM = 2;
-
-	/**
-	 * Gets diagram of given type for the given activity
-	 * 
-	 * @param act
-	 * @param type can be one of the constants {@link #ACTIVITY_DIAGRAM}, {@link #ACTIVITY_DETAIL_DIAGRAM}, or {@link #WORK_PRODUCT_DEPENDENCY_DIAGRAM}
-	 * @return
-	 */
-	Diagram getDiagram(Activity act, int type);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ILibraryInspector.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ILibraryInspector.java
deleted file mode 100644
index f45d928..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ILibraryInspector.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Interface for debug purpose
- * 
- * @author Weiping Lu - August 11, 2006
- * @since  1.0
- */
-public interface ILibraryInspector {
-	/**
-	 * Show all contents of the library
-	 */
-	void showAllContents();
-	
-	/**
-	 * Show all contents of the library
-	 */
-	void showAllContents(MethodLibrary lib);
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IOppositeFeatureLoader.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IOppositeFeatureLoader.java
deleted file mode 100644
index e2789ed..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IOppositeFeatureLoader.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Collection;
-
-/**
- * Opposite feature loader
- * 
- * @author Phong Nguyen Le - Sep 14, 2006
- * @since  1.0
- */
-public interface IOppositeFeatureLoader {
-	/**
-	 * Loads opposite features for the given elements
-	 * 
-	 * @param elements
-	 */
-	void loadOppositeFeatures(Collection elements);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IRunnableWithProgress.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IRunnableWithProgress.java
deleted file mode 100644
index ebd2ace..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/IRunnableWithProgress.java
+++ /dev/null
@@ -1,43 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2008 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.5
- *
- */
-public interface IRunnableWithProgress {
-    /**
-     * Runs this operation.  Progress should be reported to the given progress monitor.
-     * This method is usually invoked by an <code>IRunnableContext</code>'s <code>run</code> method,
-     * which supplies the progress monitor.
-     * A request to cancel the operation should be honored and acknowledged 
-     * by throwing <code>InterruptedException</code>.
-     *
-     * @param monitor the progress monitor to use to display progress and receive
-     *   requests for cancelation
-     * @exception InvocationTargetException if the run method must propagate a checked exception,
-     * 	it should wrap it inside an <code>InvocationTargetException</code>; runtime exceptions are automatically
-     *  wrapped in an <code>InvocationTargetException</code> by the calling context
-     * @exception InterruptedException if the operation detects a request to cancel, 
-     *  using <code>IProgressMonitor.isCanceled()</code>, it should exit by throwing 
-     *  <code>InterruptedException</code>
-     *
-     * @see IRunnableContext#run
-     */
-    public void run(IProgressMonitor monitor) throws InvocationTargetException,
-            InterruptedException;
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ITextReferenceReplacer.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ITextReferenceReplacer.java
deleted file mode 100644
index 2ddf512..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ITextReferenceReplacer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * Instance of this class can scan text and replaces textual references to the
- * old objects with references to new objects
- * 
- * @author Phong Nguyen Le - Jun 22, 2006
- * @since 1.0
- */
-public interface ITextReferenceReplacer {
-	/**
-	 * Replaces textual references to the old objects with references to new
-	 * objects provided in the <code>oldToNewObjectMap</code>
-	 * 
-	 * @param text
-	 * @param owner
-	 *            the owner of the text
-	 * @param oldToNewObjectMap
-	 * @return
-	 */
-	String replace(String text, EObject owner, Map oldToNewObjectMap);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ItemLabelProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ItemLabelProvider.java
deleted file mode 100644
index 27db8fb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ItemLabelProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2008 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.5
- *
- */
-public class ItemLabelProvider implements IItemLabelProvider {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.IItemLabelProvider#getImage(java.lang.Object)
-	 */
-	public Object getImage(Object object) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.IItemLabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		return object == null ? "" : object.toString();//$NON-NLS-1$
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/LibraryEditConstants.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/LibraryEditConstants.java
deleted file mode 100644
index e52a060..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/LibraryEditConstants.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-
-/**
- * Constants for library edit plugin
- * 
- * @author Phong Nguyen Le Jun 30, 2005
- * @since 1.0
- */
-public final class LibraryEditConstants {
-	public static final String[] UNCATEGORIZED_TASKS_PATH = {
-			LibraryEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE
-					.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE.getString("_UI_Disciplines_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE
-					.getString("_UI_Uncategorized_Tasks_text") //$NON-NLS-1$
-	};
-
-	public static final String[] UNCATEGORIZED_DOMAIN_WORKPRODUCTS_PATH = {
-			LibraryEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE
-					.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-			, LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group") //$NON-NLS-1$
-			, LibraryEditPlugin.INSTANCE.getString("_UI_Uncategorized_text") //$NON-NLS-1$				
-	};
-
-	public static final String[] UNCATEGORIZED_WORKPRODUCTTYPE_WORKPRODUCTS_PATH = {
-			LibraryEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE
-					.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE.getString("_UI_WorkProductTypes_group") //$NON-NLS-1$
-			, LibraryEditPlugin.INSTANCE.getString("_UI_Uncategorized_text") //$NON-NLS-1$				
-	};
-
-	public static final String[] UNCATEGORIZED_ROLES_PATH = {
-			LibraryEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE
-					.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE.getString("_UI_Role_Sets_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE
-					.getString("_UI_Uncategorized_Roles_text") //$NON-NLS-1$		
-	};
-
-	public static final String[] UNCATEGORIZED_TOOLMENTORS_PATH = {
-			LibraryEditPlugin.INSTANCE.getString("_UI_Content_group") //$NON-NLS-1$
-			,
-			LibraryEditPlugin.INSTANCE
-					.getString("_UI_Standard_Categories_group") //$NON-NLS-1$
-			, LibraryEditPlugin.INSTANCE.getString("_UI_Tools_group") //$NON-NLS-1$
-			, LibraryEditPlugin.INSTANCE.getString("_UI_Uncategorized_text") //$NON-NLS-1$				
-	};
-
-	private static final String PREF_PREFIX = "org.eclipse.epf.library.edit."; //$NON-NLS-1$
-
-	public static final String PREF_ENABLE_PROCESS_CONTRIBUTION = PREF_PREFIX
-			+ "enable_process_contribution"; //$NON-NLS-1$
-
-	public static final String PREF_ENABLE_HEALTH_CHECK = PREF_PREFIX
-			+ "enable_health_check"; //$NON-NLS-1$
-
-	public static final String PREF_INHERIT_SUPPRESSION_STATE = PREF_PREFIX
-			+ "inherit_suppression_state"; //$NON-NLS-1$
-
-	public static final String PREF_WBS_COLUMNS = PREF_PREFIX + "wbs_columns"; //$NON-NLS-1$
-
-	public static final String PREF_TBS_COLUMNS = PREF_PREFIX + "tbs_columns"; //$NON-NLS-1$
-
-	public static final String PREF_WPBS_COLUMNS = PREF_PREFIX + "wpbs_columns"; //$NON-NLS-1$
-
-	public static final String NEW_CUSTOM_CATEGORY = "new_custom_category"; //$NON-NLS-1$
-
-	public static final String NEW_DISCIPLINE = "new_discipline"; //$NON-NLS-1$
-
-	public static final String NEW_DISCIPLINE_GROUPING = "new_discipline_grouping"; //$NON-NLS-1$
-
-	public static final String NEW_DOMAIN = "new_domain"; //$NON-NLS-1$
-
-	public static final String NEW_ROLE_SET = "new_role_set"; //$NON-NLS-1$
-
-	public static final String NEW_ROLE_SET_GROUPING = "new_role_set_grouping"; //$NON-NLS-1$
-
-	public static final String NEW_TOOL = "new_tool"; //$NON-NLS-1$
-
-	public static final String NEW_WORK_PRODUCT_TYPE = "new_work_product_kind"; //$NON-NLS-1$
-
-	public static final String NEW_ROLE = "new_role"; //$NON-NLS-1$
-
-	public static final String NEW_TASK = "new_task"; //$NON-NLS-1$
-
-	public static final String NEW_WORKPRODUCT = "new_workproduct"; //$NON-NLS-1$
-
-	public static final String NEW_ARTIFACT = "new_artifact"; //$NON-NLS-1$
-
-	public static final String NEW_DELIVERABLE = "new_deliverable"; //$NON-NLS-1$
-
-	public static final String NEW_OUTCOME = "new_outcome"; //$NON-NLS-1$
-
-	public static final String NEW_CHECKLIST = "new_checklist"; //$NON-NLS-1$
-
-	public static final String NEW_WHITEPAPER = "new_whitepaper"; //$NON-NLS-1$
-
-	public static final String NEW_CONCEPT = "new_concept"; //$NON-NLS-1$
-
-	public static final String NEW_ESTIMATE = "new_estimate"; //$NON-NLS-1$
-
-	public static final String NEW_ESTIMATION_CONSIDERATION = "new_estimation_considerations"; //$NON-NLS-1$
-
-	public static final String NEW_ESTIMATATING_METRIC = "new_estimating_metric"; //$NON-NLS-1$
-
-	public static final String NEW_EXAMPLE = "new_example"; //$NON-NLS-1$
-
-	public static final String NEW_PRACTICE = "new_practice"; //$NON-NLS-1$
-
-	public static final String NEW_REPORT = "new_report"; //$NON-NLS-1$
-
-	public static final String NEW_ROADMAP = "new_roadmap"; //$NON-NLS-1$
-
-	public static final String NEW_REUSABLE_ASSET = "new_reusable_asset"; //$NON-NLS-1$
-
-	public static final String NEW_SUPPORTING_MATERIAL = "new_supporting_material"; //$NON-NLS-1$
-
-	public static final String NEW_TEMPLATE = "new_template"; //$NON-NLS-1$
-
-	public static final String NEW_TERM_DEFINITION = "new_term_definition"; //$NON-NLS-1$
-
-	public static final String NEW_TOOL_MENTOR = "new_toolmentor"; //$NON-NLS-1$
-
-	public static final String NEW_GUIDELINE = "new_guideline"; //$NON-NLS-1$
-
-	public static final String NEW_GUIDANCE = "new_guidance"; //$NON-NLS-1$
-
-	public static final String NEW_CONTENT_PACKAGE = "new_content_package"; //$NON-NLS-1$
-
-	public static final String NEW_CONFIGURATION = "new_configuration"; //$NON-NLS-1$
-
-	public static final String NEW_PROCESS_FAMILY = "new_process_family"; //$NON-NLS-1$
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Messenger.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Messenger.java
deleted file mode 100644
index 4105fe5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Messenger.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler;
-import org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger;
-
-/**
- * Default messenger that will deliver messages using the messenger of
- * {@link ExtensionManager#getDefaultUserInteractionHandler() default user
- * interaction handler} if one exists. Otherwise, it will log the messages using
- * plugin's logger.
- * 
- * @author Phong Nguyen Le - Oct 25, 2006
- * @since 1.0
- */
-public class Messenger implements IUserInteractionHandler.IMessenger {
-	public static final Messenger INSTANCE = new Messenger();
-
-	private static final String NEW_LINE = System.getProperty(
-			"line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	private IMessenger delegate;
-
-	private Logger logger = LibraryEditPlugin.getDefault().getLogger();
-
-	private Messenger() {
-		IUserInteractionHandler uiHandler = ExtensionManager
-				.getDefaultUserInteractionHandler();
-		if (uiHandler != null) {
-			delegate = uiHandler.getMessenger();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public void showError(String title, String msg) {
-		if (delegate != null) {
-			delegate.showError(title, msg);
-		} else {
-			StringBuffer strBuf = new StringBuffer(title);
-			if(!StrUtil.isBlank(msg)) {
-				strBuf.append(NEW_LINE).append(msg);
-			}
-			logger.logError(strBuf.toString());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String,
-	 *      java.lang.String, org.eclipse.core.runtime.IStatus)
-	 */
-	public void showError(String title, String msg, IStatus status) {
-		if (delegate != null) {
-			delegate.showError(title, msg, status);
-		} else {
-			LibraryEditPlugin.getDefault().getLog().log(status);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String,
-	 *      java.lang.String, java.lang.String, java.lang.Exception)
-	 */
-	public void showError(String title, String msg, String reason,
-			Exception exception) {
-		if (delegate != null) {
-			delegate.showError(title, msg, reason, exception);
-		} else {
-			StringBuffer strBuf = new StringBuffer(title);
-			if(!StrUtil.isBlank(msg)) {
-				strBuf.append(NEW_LINE).append(msg);
-			}
-			logger.logError(strBuf.toString(), exception);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showWarning(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public void showWarning(String title, String msg) {
-		if (delegate != null) {
-			delegate.showWarning(title, msg);
-		} else {
-			StringBuffer strBuf = new StringBuffer(title);
-			if(!StrUtil.isBlank(msg)) {
-				strBuf.append(NEW_LINE).append(msg);
-			}
-			logger.logWarning(strBuf.toString());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showWarning(java.lang.String,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public void showWarning(String title, String msg, String reason) {
-		if (delegate != null) {
-			delegate.showWarning(title, msg, reason);
-		} else {
-			StringBuffer strBuf = new StringBuffer(title);
-			if(!StrUtil.isBlank(msg)) {
-				strBuf.append(NEW_LINE).append(msg);
-			}
-			if(!StrUtil.isBlank(reason)) {
-				strBuf.append(NEW_LINE).append(reason);
-			}
-			logger.logWarning(strBuf.toString());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showInfo(java.lang.String, java.lang.String)
-	 */
-	public void showInfo(String title, String msg) {
-		if (delegate != null) {
-			delegate.showInfo(title, msg);
-		} else {
-			StringBuffer strBuf = new StringBuffer(title);
-			if(!StrUtil.isBlank(msg)) {
-				strBuf.append(NEW_LINE).append(msg);
-			}
-			logger.logInfo(strBuf.toString());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Exception)
-	 */
-	public void showError(String title, String msg, String reason, String details, Exception exception) {
-		if (delegate != null) {
-			delegate.showInfo(title, msg);
-		} else {
-			StringBuffer strBuf = new StringBuffer(title);
-			if(!StrUtil.isBlank(msg)) {
-				strBuf.append(NEW_LINE).append(msg);
-			}
-			if(!StrUtil.isBlank(reason)) {
-				strBuf.append(NEW_LINE).append(reason);
-			}
-			if(!StrUtil.isBlank(details)) {
-				strBuf.append(NEW_LINE).append(details);
-			}
-			logger.logError(strBuf.toString(), exception);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/MethodElementPropertyHelper.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/MethodElementPropertyHelper.java
deleted file mode 100644
index 47c334f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/MethodElementPropertyHelper.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Iterator;
-
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.UmaFactory;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class MethodElementPropertyHelper {
-	public static final String WORK_ORDER__PREDECESSOR_PROCESS_PATH = "pred_process_path"; //$NON-NLS-1$
-
-	public static final MethodElementProperty getProperty(MethodElement e, String propertyName) {
-		for (Iterator iter = e.getMethodElementProperty().iterator(); iter.hasNext();) {
-			MethodElementProperty prop = (MethodElementProperty) iter.next();
-			if(prop.getName().equals(propertyName)) {
-				return prop;
-			}
-		}
-		return null;
-	}
-	
-	public static final void setProperty(MethodElement e, String propName, String propValue) {
-		MethodElementProperty prop = getProperty(e, propName);
-		if(prop == null) {
-			prop = UmaFactory.eINSTANCE.createMethodElementProperty();
-			prop.setName(propName);
-			e.getMethodElementProperty().add(prop);
-		}
-		prop.setValue(propValue);
-	}
-
-	public static final void setProperty(MethodElement e, String propName, boolean b) {
-		setProperty(e, propName, String.valueOf(b));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/MethodElementUtil.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/MethodElementUtil.java
deleted file mode 100644
index 59a561e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/MethodElementUtil.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Class with static utility methods for querying method element
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodElementUtil {
-
-	/**
-	 * Return method model of the object
-	 * 
-	 * @param obj
-	 * @return
-	 */
-	public static MethodPlugin getMethodModel(Object obj) {
-		return UmaUtil.getMethodPlugin((MethodElement) obj);
-	}
-
-	/**
-	 * Returns list of models as specified.. 1. Method model of the object 2.
-	 * Referenced models of the method model of the object (e.g. reference
-	 * relationship)
-	 * 
-	 * @param object
-	 * @return
-	 */
-	public static List getAllModels(Object object) {
-		List allModels = new ArrayList();
-
-		// get method model of the object
-		MethodPlugin model = getMethodModel(object);
-
-		if (model != null) {
-
-			// get all base models
-			//
-			Misc.getAllBase(model, allModels);
-
-			allModels.add(model);
-
-		}
-
-		return allModels;
-	}
-
-	/**
-	 * Returns references guidances for the given object
-	 * 
-	 * @param object
-	 * @return
-	 */
-	public static List getSelectedGuidances(EObject object) {
-		List itemList = new ArrayList();
-
-		List references = ((EObject) object).eCrossReferences();
-		if (references != null && references.size() > 0) {
-			for (Iterator it = references.iterator(); it.hasNext();) {
-				Object obj = (Object) it.next();
-				if (obj instanceof Guidance) {
-					itemList.add(obj);
-				}
-			}
-		}
-
-		itemList
-				.addAll(AssociationHelper.getPractices((ContentElement) object));
-
-		return itemList;
-	}
-	
-	/**
-	 * Returns a map built from the given elements. The map has guids as keys
-	 */
-	public static Map<String, MethodElement> buildMap(Collection<MethodElement> elements) {
-		Map<String, MethodElement> map = new HashMap<String, MethodElement>();
-		
-		if (elements != null && !elements.isEmpty()) {
-			for (Iterator<MethodElement> it = elements.iterator(); it.hasNext();) {
-				MethodElement element = it.next();
-				map.put(element.getGuid(), element);
-			}
-		}
-		
-		return map;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Misc.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Misc.java
deleted file mode 100644
index d3b82b9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Misc.java
+++ /dev/null
@@ -1,186 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * Many methods of this class had been moved to org.eclipse.epf.uma.util.UmaUtil
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class Misc {
-
-	public static void getAllWorkProducts(ContentPackage pkg, List list) {
-		List elements = pkg.getContentElements();
-		for (int i = 0; i < elements.size(); i++) {
-			Object obj = elements.get(i);
-			if (obj instanceof WorkProduct) {
-				list.add(obj);
-			}
-		}
-		List packages = pkg.getChildPackages();
-		for (int i = 0; i < packages.size(); i++) {
-			Object obj = packages.get(i);
-			if (obj instanceof ContentPackage) {
-				getAllWorkProducts((ContentPackage) obj, list);
-			}
-		}
-	}
-
-	public static List getAllWorkProducts(ContentPackage pkg) {
-		List list = new ArrayList();
-		getAllWorkProducts(pkg, list);
-		return list;
-	}
-
-	private static void getAllTasks(ContentPackage pkg, List list) {
-		List elements = pkg.getContentElements();
-		for (int i = 0; i < elements.size(); i++) {
-			Object obj = elements.get(i);
-			if (obj instanceof Task) {
-				list.add(obj);
-			}
-		}
-		List packages = pkg.getChildPackages();
-		for (int i = 0; i < packages.size(); i++) {
-			Object obj = packages.get(i);
-			if (obj instanceof ContentPackage) {
-				getAllTasks((ContentPackage) obj, list);
-			}
-		}
-	}
-
-	public static List getAllTasks(ContentPackage pkg) {
-		List list = new ArrayList();
-		getAllTasks(pkg, list);
-		return list;
-	}
-
-	public static List getAllUncategorizedTasks(ContentPackage pkg) {
-		List list = new ArrayList();
-		getAllUncategorizedTasks(pkg, list);
-		return list;
-	}
-
-	private static void getAllUncategorizedTasks(ContentPackage pkg, List list) {
-		List elements = pkg.getContentElements();
-		for (int i = 0; i < elements.size(); i++) {
-			Object obj = elements.get(i);
-			if (obj instanceof Task
-					&& AssociationHelper.getDisciplines((Task) obj).isEmpty()) {
-				list.add(obj);
-			}
-		}
-		List packages = pkg.getChildPackages();
-		for (int i = 0; i < packages.size(); i++) {
-			Object obj = packages.get(i);
-			if (obj instanceof ContentPackage) {
-				getAllUncategorizedTasks((ContentPackage) obj, list);
-			}
-		}
-	}
-
-	public static String[] getPathRelativeToPlugin(NamedElement e) {
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		ArrayList list = new ArrayList();
-		list.add(String.valueOf(e.getName()));
-		for (e = (NamedElement) ((EObject) e).eContainer(); e != null
-				&& e != plugin; e = (NamedElement) ((EObject) e).eContainer()) {
-			list.add(0, String.valueOf(e.getName()));
-		}
-		String[] path = new String[list.size()];
-		list.toArray(path);
-		return path;
-	}
-	
-	public static Collection<NamedElement> getObjectTreeRelativeToPlugin(NamedElement e) {
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		ArrayList<NamedElement> list = new ArrayList<NamedElement>();
-		list.add(e);
-		for (e = (NamedElement)e.eContainer(); e != null
-				&& e != plugin; e = (NamedElement)e.eContainer()) {
-			list.add(0, e);
-		}
-		return list;
-	}
-
-
-	public static String getPathRelativeToLibrary(NamedElement e) {
-		if (e == null)
-			return ""; //$NON-NLS-1$
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		if (plugin == null)
-			return e.getName();
-		StringBuffer path = new StringBuffer(e.getName());
-		String[] arr = getPathRelativeToPlugin(e);
-		for (int i = 0; i < arr.length; i++) {
-			path.append('/').append(arr[i]);
-		}
-		return path.toString();
-	}
-
-	/**
-	 * Gets all base plugins of the given plugin
-	 * 
-	 * @param plugin
-	 * @return
-	 */
-	public static List getAllBase(MethodPlugin plugin) {
-		List list = new ArrayList();
-		getAllBase(plugin, list);
-		return list;
-	}
-
-	public static void getAllBase(MethodPlugin plugin, List list) {
-		List base = plugin.getBases();
-
-		// Check if the bases in the list already.
-		if (!list.containsAll(base)) {
-			list.addAll(base);
-		}
-		for (int i = 0; i < base.size(); i++) {
-			plugin = (MethodPlugin) base.get(i);
-			getAllBase(plugin, list);
-		}
-	}
-
-	public static boolean isBaseOf(MethodPlugin base, MethodPlugin plugin) {
-		if (plugin == null) {
-			System.out.println();
-		}
-		List bases = plugin.getBases();
-		int size = bases.size();
-		for (int i = 0; i < size; i++) {
-			if (base == bases.get(i))
-				return true;
-		}
-		for (int i = 0; i < size; i++) {
-			if (isBaseOf(base, (MethodPlugin) bases.get(i)))
-				return true;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ModelStructure.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ModelStructure.java
deleted file mode 100644
index c3a3590..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ModelStructure.java
+++ /dev/null
@@ -1,225 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Collection;
-import java.util.HashSet;
-
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-
-
-/**
- * Defines internal structure of a method plugin with predefined packages
- *  
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ModelStructure {
-
-	public static final ModelStructure DEFAULT = new ModelStructure();
-
-	public static final String HIDDEN_PACKAGE_NAME = "Hidden"; //$NON-NLS-1$
-	
-	public static final String CONTENT_PACKAGE_NAME = "Content"; //$NON-NLS-1$
-	
-	public static final String CORE_CONTENT_PACAKGE_NAME = "CoreContent"; //$NON-NLS-1$
-	
-	private static final String CATEGORIES = "Categories"; //$NON-NLS-1$
-	
-	public static final String ROLE_SET_PACKAGE_NAME = "RoleSets"; //$NON-NLS-1$
-	
-	public static final String DISCIPLINE_PACKAGE_NAME = "Disciplines"; //$NON-NLS-1$
-	
-	public static final String CUSTOM_CATEGORY_PACKAGE_NAME = "CustomCategories"; //$NON-NLS-1$
-
-	private static final String[] DEFAULT_CORE_CONTENT_PATH = {
-		CONTENT_PACKAGE_NAME, CORE_CONTENT_PACAKGE_NAME };
-
-	private static final String[] DEFAULT_ROLE_SET_PACKAGE_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES,  ROLE_SET_PACKAGE_NAME};
-
-	public static final String[] DEFAULT_DISCIPLINE_DEF_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES, DISCIPLINE_PACKAGE_NAME };
-
-	private static final String[] DEFAULT_TOOL_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES, "Tools" }; //$NON-NLS-1$
-
-	private static final String[] DEFAULT_STANDARD_CATEGORY_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES, "StandardCategories" }; //$NON-NLS-1$
-
-	private static final String[] DEFAULT_DELIVERY_PROCESS_PATH = { "DeliveryProcesses" }; //$NON-NLS-1$
-
-	private static final String[] DEFAULT_CAPABILITY_PATTERN_PATH = {
-		CONTENT_PACKAGE_NAME, "CapabilityPatterns" }; //$NON-NLS-1$
-
-	public static final String[] DEFAULT_DOMAIN_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES, "Domains" }; //$NON-NLS-1$
-
-	public static final String[] DEFAULT_WORK_PRODUCT_TYPE_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES, "WP Types" }; //$NON-NLS-1$
-
-	public static final String[] DEFAULT_CUSTOM_CATEGORY_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES,  CUSTOM_CATEGORY_PACKAGE_NAME};
-	
-	public static final String[] DEFAULT_ESTIMATING_MODELS_PATH = {
-		CONTENT_PACKAGE_NAME, CATEGORIES, "EstimatingModels" }; //$NON-NLS-1$
-
-
-	private static final String[] DEFAULT_PROCESS_CONTRIBUTION_PATH = { "ProcessContributions" }; //$NON-NLS-1$
-
-	private static final String[] DEFAULT_PROCESS_PLANNING_TEMPLATE_PATH = { "ProcessPlanningTemplates" }; //$NON-NLS-1$
-
-	public static final Collection ALL_PREDEFINED_PATHS = new HashSet();
-
-	public String[] coreContentPath;
-
-	public String[] roleSetPath;
-
-	public String[] disciplineDefinitionPath;
-
-	public String[] domainPath;
-
-	public String[] toolPath;
-
-	public String[] capabilityPatternPath;
-
-	public String[] deliveryProcessPath;
-
-	public String[] workProductTypePath;
-
-	public String[] processContributionPath;
-
-	public String[] customCategoryPath;
-
-	public String[] estimatingModelPath;
-	
-	public String[] standardCategoryPath;
-
-	public String[] processPlanningTemplatePath;
-
-	/**
-	 * this is the method to return all the system defined package path Please
-	 * add this this array when ever you have new system packages defined
-	 * 
-	 * @return
-	 */
-	public String[][] getAllSystemPaths() {
-		return new String[][] { coreContentPath, roleSetPath,
-				disciplineDefinitionPath, domainPath, toolPath,
-				capabilityPatternPath, deliveryProcessPath,
-				workProductTypePath, processContributionPath,
-				customCategoryPath, standardCategoryPath,
-				processPlanningTemplatePath, };
-	}
-
-	public String[][] getCategoryPaths() {
-		return new String[][] { roleSetPath, disciplineDefinitionPath,
-				domainPath, toolPath, workProductTypePath,
-				standardCategoryPath, customCategoryPath, };
-	}
-
-	public static String toLines(String[] path) {
-		StringBuffer lines = new StringBuffer();
-		int max = path.length - 1;
-		for (int i = 0; i < max; i++) {
-			lines.append(path[i]).append('\n');
-		}
-		lines.append(path[max]);
-		return lines.toString();
-	}
-
-	public static String toFilePath(String[] path) {
-		StringBuffer lines = new StringBuffer();
-		int max = path.length;
-		for (int i = 0; i < max; i++) {
-			lines.append(path[i]).append('/');
-		}
-		return lines.toString();
-	}
-
-	static {
-		DEFAULT.coreContentPath = DEFAULT_CORE_CONTENT_PATH;
-		DEFAULT.disciplineDefinitionPath = DEFAULT_DISCIPLINE_DEF_PATH;
-		DEFAULT.roleSetPath = DEFAULT_ROLE_SET_PACKAGE_PATH;
-		DEFAULT.domainPath = DEFAULT_DOMAIN_PATH;
-		DEFAULT.toolPath = DEFAULT_TOOL_PATH;
-		DEFAULT.capabilityPatternPath = DEFAULT_CAPABILITY_PATTERN_PATH;
-		DEFAULT.deliveryProcessPath = DEFAULT_DELIVERY_PROCESS_PATH;
-		DEFAULT.workProductTypePath = DEFAULT_WORK_PRODUCT_TYPE_PATH;
-		DEFAULT.processContributionPath = DEFAULT_PROCESS_CONTRIBUTION_PATH;
-		DEFAULT.standardCategoryPath = DEFAULT_STANDARD_CATEGORY_PATH;
-		DEFAULT.customCategoryPath = DEFAULT_CUSTOM_CATEGORY_PATH;
-		DEFAULT.estimatingModelPath = DEFAULT_ESTIMATING_MODELS_PATH;
-		DEFAULT.processPlanningTemplatePath = DEFAULT_PROCESS_PLANNING_TEMPLATE_PATH;
-
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.coreContentPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.disciplineDefinitionPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.roleSetPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.domainPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.toolPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.capabilityPatternPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.deliveryProcessPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.workProductTypePath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.processContributionPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.standardCategoryPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.customCategoryPath));
-		ALL_PREDEFINED_PATHS.add(toFilePath(DEFAULT.estimatingModelPath));
-		ALL_PREDEFINED_PATHS
-				.add(toFilePath(DEFAULT.processPlanningTemplatePath));
-	}
-
-	public static ProcessPackage createProcessContributionPackage(
-			MethodPlugin plugin) {
-		// boolean old = plugin.eDeliver();
-		try {
-			// create ProcessContributions process package
-			//
-			ProcessPackage pkg = UmaFactory.eINSTANCE.createProcessPackage();
-			pkg.setName(ModelStructure.DEFAULT.processContributionPath[0]);
-
-			// disable notification
-			//
-			plugin.eSetDeliver(false);
-
-			plugin.getMethodPackages().add(pkg);
-			return pkg;
-		} finally {
-			// restore original notifaction setting
-			//
-			plugin.eSetDeliver(true);
-		}
-	}
-
-	public static ProcessPackage createProcessPlanningTemplatePackage(
-			MethodPlugin plugin) {
-		// boolean old = plugin.eDeliver();
-		try {
-			// create ProcessPlanningTemplates process package
-			//
-			ProcessPackage pkg = UmaFactory.eINSTANCE.createProcessPackage();
-			pkg.setName(ModelStructure.DEFAULT.processPlanningTemplatePath[0]);
-
-			// disable notification
-			//
-			plugin.eSetDeliver(false);
-
-			plugin.getMethodPackages().add(pkg);
-			return pkg;
-		} finally {
-			// restore original notifaction setting
-			//
-			plugin.eSetDeliver(true);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/PluginUIPackagesMap.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/PluginUIPackagesMap.java
deleted file mode 100644
index 6d386ac..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/PluginUIPackagesMap.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.epf.uma.MethodPlugin;
-
-/**
- * Holds a map of Plugin Package names to the list of plugins contained by them
- * @author Jeff Hardy
- *
- */
-public class PluginUIPackagesMap extends HashMap<String, Set<MethodPlugin>> {
-
-	private static final long serialVersionUID = -8321379015870090256L;
-
-	public PluginUIPackagesMap() {
-		super();
-	}
-	
-	public void add(String packageName, MethodPlugin plugin) {
-		Set<MethodPlugin> plugins = get(packageName);
-		if (plugins == null) {
-			plugins = new HashSet<MethodPlugin>();
-		}
-		plugins.add(plugin);
-		put(packageName, plugins);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/PredecessorList.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/PredecessorList.java
deleted file mode 100644
index fa6de61..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/PredecessorList.java
+++ /dev/null
@@ -1,654 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-
-/**
- * This class represents a predecessor list of an item provider for a work
- * breakdown element. It calculates the predecessors based on the currently
- * selected configuration and according to variability rules. It can refresh
- * itself upon change in predecessor list of work breakdown element.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class PredecessorList extends ArrayList<Object> {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 3617853092570412082L;	
-	
-	private static final String FINISH_TO_START = LibraryEditResources.WorkOrderTypeAbbreviation_FINISH_TO_START; 
-	private static final String FINISH_TO_FINISH = LibraryEditResources.WorkOrderTypeAbbreviation_FINISH_TO_FINISH; 
-	private static final String START_TO_START = LibraryEditResources.WorkOrderTypeAbbreviation_START_TO_START; 
-	private static final String START_TO_FINISH = LibraryEditResources.WorkOrderTypeAbbreviation_START_TO_FINISH; 
-	private Map map4LinkType = new HashMap();
-
-	public static final PredecessorList EMPTY_LIST = new PredecessorList() {
-
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 3904676098217097016L;
-
-		public void refresh() {
-
-		}
-
-		public void add(int index, Object element) {
-
-		}
-
-		public boolean add(Object o) {
-			throw new UnsupportedOperationException();
-		}
-
-		public boolean addAll(java.util.Collection c) {
-			throw new UnsupportedOperationException();
-		}
-
-		public boolean addAll(int index, java.util.Collection c) {
-			throw new UnsupportedOperationException();
-		}
-
-	};
-
-	private AdapterFactory adapterFactory;
-
-	private Object object;
-
-	private Adapter listener = new AdapterImpl() {
-		public void notifyChanged(org.eclipse.emf.common.notify.Notification msg) {
-			switch (msg.getFeatureID(BreakdownElement.class)) {
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR:
-				refresh();
-				return;
-			}
-		}
-	};
-
-	private Object top;
-
-	private PredecessorList() {
-
-	}
-
-	public PredecessorList(AdapterFactory adapterFactory, Object object) {
-		this.adapterFactory = adapterFactory;
-		this.object = object;
-		BreakdownElement e = (BreakdownElement) TngUtil.unwrap(object);
-		e.eAdapters().add(0, listener);
-		if (!map4LinkType.isEmpty())
-			map4LinkType.clear();
-		initialize();
-	}
-
-	public void dispose() {
-		Object e = TngUtil.unwrap(object);
-		if (e instanceof EObject) {
-			((EObject) e).eAdapters().remove(listener);
-		}
-		clear();
-	}
-
-	/**
-	 * Gets the right top item in the breakdown structure tree to search for
-	 * item providers of predecessors
-	 * 
-	 * @return
-	 */
-	protected Object getTopItem() {
-		if (object instanceof BreakdownElementWrapperItemProvider) {
-			BreakdownElementWrapperItemProvider itemProvider = (BreakdownElementWrapperItemProvider) object;
-			if (itemProvider.isReadOnly()) {
-				// this represents an inherited breakdown element
-				//
-				BreakdownElement e = (BreakdownElement) TngUtil.unwrap(object);
-				Process proc = TngUtil.getOwningProcess(e);
-
-				Object top = itemProvider;
-				for (Object parent = itemProvider.getParent(object); parent != null;) {
-					top = parent;
-					BreakdownElement parentElement = (BreakdownElement) TngUtil
-							.unwrap(parent);
-					Process parentProc = TngUtil
-							.getOwningProcess(parentElement);
-					if (parentProc != proc) {
-						break;
-					}
-					if (parent instanceof ITreeItemContentProvider) {
-						parent = ((ITreeItemContentProvider) parent)
-								.getParent(parent);
-					} else {
-						ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-								.adapt(parent, ITreeItemContentProvider.class);
-						parent = adapter.getParent(parent);
-					}
-				}
-				return top;
-			} else {
-				return itemProvider.getTopItem();
-			}
-		} else {
-			IBSItemProvider adapter = (IBSItemProvider) adapterFactory.adapt(
-					object, ITreeItemContentProvider.class);
-			return adapter.getTopItem();
-		}
-	}
-	
-	public static class DepthLevelItemProvider {
-		private int depthLevel;
-		private Object itemProvider;
-		private Object object;
-		private Object element;
-		
-		private DepthLevelItemProvider(Object object, int depthLevel, Object itemProvider, Object element) {
-			super();
-			this.object = object;
-			this.depthLevel = depthLevel;
-			this.itemProvider = itemProvider;
-			this.element = element;
-		}	
-		
-		public Object getItemProvider() {
-			return itemProvider;
-		}
-	}
-	
-	static List<DepthLevelItemProvider> createItemProviderList(Object top, AdapterFactory adapterFactory) {
-		List<DepthLevelItemProvider> list = new ArrayList<DepthLevelItemProvider>();
-		DepthLevelAdapterFactoryTreeIterator<Object> iter = new DepthLevelAdapterFactoryTreeIterator<Object>(
-				adapterFactory, top) {
-					private static final long serialVersionUID = 1L;
-					@Override
-					protected Iterator<Object> getChildren(Object o) {
-						Object e = TngUtil.unwrap(o); 
-						if(e instanceof Descriptor || e instanceof Milestone) {
-							return Collections.emptyList().iterator();
-						}
-						return super.getChildren(o);
-					}			
-		};
-		for(; iter.hasNext();) {
-			Object object = iter.next();
-			Object element = TngUtil.unwrap(object);
-			if(element instanceof WorkBreakdownElement) {
-				int depthLevel = iter.getDepthLevel();
-				Object itemProvider = adapterFactory.adapt(object, ITreeItemContentProvider.class);
-				list.add(new DepthLevelItemProvider(object, depthLevel, itemProvider, element));
-			}
-		}
-		return list;
-	}
-	
-	private static void updateElementToItemProvidersMap(Map<Object, Collection<Object>> map, Object element, Object itemProvider) {
-		Collection<Object> itemProviders = map.get(element);
-		if(itemProviders == null) {
-			itemProviders = new ArrayList<Object>();
-			map.put(element, itemProviders);
-		}
-		itemProviders.add(itemProvider);
-		if (element instanceof VariabilityElement) {
-			VariabilityElement ve = (VariabilityElement) element;
-			if (ve.getVariabilityBasedOnElement() != null) {
-				itemProviders = map.get(ve.getVariabilityBasedOnElement());
-				if(itemProviders == null) {
-					itemProviders = new ArrayList<Object>();
-					map.put(ve.getVariabilityBasedOnElement(), itemProviders);
-				}
-				itemProviders.add(itemProvider);
-			}
-		}
-	}
-	
-	Map<?, Collection<Object>> createBreakdownElementToItemProviderMap(List<DepthLevelItemProvider> list) {
-		Object top = getTopItem();
-		// find top's item provider
-		//
-		DepthLevelItemProvider topIp = null;
-		int startIndex = 0;
-		for (DepthLevelItemProvider itemProvider : list) {
-			if(itemProvider.object == top) {
-				topIp = itemProvider;
-				break;
-			}
-			else {
-				startIndex++;
-			}
-		}
-		assert topIp != null : "Could not find item provider of top object in the given item provider list."; //$NON-NLS-1$
-		// find the index of last item provider in the subtree of top
-		//
-		int size = list.size();
-		int lastIndex = startIndex + 1;
-		for (; lastIndex < size && list.get(lastIndex).depthLevel > topIp.depthLevel; lastIndex++);		
-			
-		// copy the tree to a map of breakdown element / item provider for
-		// reuse
-		//
-		HashMap<Object, Collection<Object>> map = new HashMap<Object, Collection<Object>>();
-		for (DepthLevelItemProvider itemProvider : list.subList(startIndex, lastIndex)) {
-			updateElementToItemProvidersMap(map, itemProvider.element, itemProvider.itemProvider);
-		}
-		return map;
-	}
-	
-	static Map<Object, Collection<Object>> createBreakdownElementToItemProviderMap(Object top, AdapterFactory adapterFactory) {
-		AdapterFactoryTreeIterator<Object> iter = new AdapterFactoryTreeIterator<Object>(
-				adapterFactory, top) {
-			private static final long serialVersionUID = 1L;
-			@Override
-			protected Iterator<Object> getChildren(Object o) {
-				Object e = TngUtil.unwrap(o); 
-				if(e instanceof Descriptor || e instanceof Milestone) {
-					return Collections.emptyList().iterator();
-				}
-				return super.getChildren(o);
-			}			
-		};
-		
-		// copy the tree to a map of breakdown element / item provider for
-		// reuse
-		//
-		HashMap<Object, Collection<Object>> map = new HashMap<Object, Collection<Object>>();
-		while (iter.hasNext()) {
-			Object obj = iter.next();
-			Object be = TngUtil.unwrap(obj);
-			if(be instanceof WorkBreakdownElement) {
-				IBSItemProvider ip = (IBSItemProvider) (obj instanceof IBSItemProvider ? obj :
-					adapterFactory.adapt(obj, ITreeItemContentProvider.class));
-				updateElementToItemProvidersMap(map, be, ip);
-			}
-		}
-		return map;
-	}
-	
-	private void initialize() {
-		Object unwrapped = TngUtil.unwrap(object);
-		if (unwrapped instanceof WorkBreakdownElement) {
-			WorkBreakdownElement e = (WorkBreakdownElement) unwrapped;
-			List workOrders = e.getLinkToPredecessor();
-			if (workOrders.isEmpty())
-				return;
-			top = getTopItem();	
-			initialize(createBreakdownElementToItemProviderMap(top, adapterFactory));
-		}
-	}
-	
-	private void initialize(Map<?, Collection<Object>> map) {
-
-		if (TngUtil.unwrap(object) instanceof WorkBreakdownElement) {
-			WorkBreakdownElement e = (WorkBreakdownElement) TngUtil
-					.unwrap(object);
-			List workOrders = e.getLinkToPredecessor();
-			if (workOrders.isEmpty())
-				return;
-			WorkBreakdownElement topElement = (WorkBreakdownElement) TngUtil.unwrap(top);
-			String topGUID = topElement.getGuid();
-			
-			int n = workOrders.size();
-			for (int i = 0; i < n; i++) {
-				WorkOrder workOrder = (WorkOrder) workOrders.get(i);					
-
-				//System.out.println(workOrder.getLinkType().getLiteral());
-
-				BreakdownElement pred = workOrder.getPred();
-				Collection<Object> itemProviders = map.get(pred);
-				if(itemProviders != null && !itemProviders.isEmpty()) {
-					IBSItemProvider bsItemProvider = null;
-					MethodElementProperty prop = MethodElementPropertyHelper.getProperty(workOrder, 
-							MethodElementPropertyHelper.WORK_ORDER__PREDECESSOR_PROCESS_PATH);
-					if(prop == null) {
-						// predecessor is local or WorkOrder is created before support for 'green' predecessor
-						// by saving its process path in methodElementProperty of the work order
-						//
-						bsItemProvider = (IBSItemProvider) itemProviders.iterator().next();
-					}
-					else {
-						String procPath = prop.getValue();
-						
-						// calculate the path in this process
-						//						
-						int index;
-						String guid = topGUID;
-						VariabilityElement base = topElement instanceof VariabilityElement ? ((VariabilityElement)topElement).getVariabilityBasedOnElement() : null;
-						for(index = procPath.indexOf(guid); index == -1 && base != null; index = procPath.indexOf(guid)) {
-							if(base != null) {
-								guid = base.getGuid(); 
-								base = base.getVariabilityBasedOnElement();
-							}
-						}
-						if(index != -1) {
-							StringBuffer strBuff = new StringBuffer(procPath.substring(index + guid.length()));
-							Object topObject = top;
-							for(WorkBreakdownElement wbe = topElement; wbe != null;) {
-								strBuff.insert(0, wbe.getGuid());
-								strBuff.insert(0, '/');
-								if(topObject instanceof WorkBreakdownElement) {
-									topObject = wbe = ((WorkBreakdownElement)topObject).getSuperActivities();
-								}
-								else {
-									topObject = adapterFactory.adapt(topObject, ITreeItemContentProvider.class);
-									wbe = (WorkBreakdownElement) TngUtil.unwrap(topObject);
-								}
-							}
-							strBuff.insert(0, ":/").insert(0, Suppression.WBS); //$NON-NLS-1$
-							String path = strBuff.toString();
-							find_wrapper:
-							for (Object itemProvider : itemProviders) {
-								if(itemProvider instanceof BreakdownElementWrapperItemProvider) {
-									String p = Suppression.getPath((BreakdownElementWrapperItemProvider) itemProvider);
-									if(path.equals(p)) {
-										bsItemProvider = (IBSItemProvider) itemProvider;
-										break find_wrapper;
-									}
-								}
-							}
-						}
-					}
-					if (bsItemProvider != null) {
-						add(bsItemProvider);
-						map4LinkType.put(bsItemProvider.getId(), workOrder.getLinkType().getValue());
-					}
-				}
-			}
-		}
-	}
-	
-	@Override
-	public void clear() {
-		super.clear();
-		if (!map4LinkType.isEmpty())
-			map4LinkType.clear();
-	}
-
-	protected void refresh() {
-		clear();
-		initialize();
-	}
-	
-	void refresh(List<DepthLevelItemProvider> list) {
-		clear();
-		initialize(createBreakdownElementToItemProviderMap(list));
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.AbstractCollection#toString()
-	 */
-	public String toString() {
-		return toUnSuppressedString(null);
-	}
-
-	public String toUnSuppressedString(Suppression sup) {
-		// remove the item providers of the deleted elements
-		//
-		for (Iterator iter = iterator(); iter.hasNext();) {
-			Object e = TngUtil.unwrap(iter.next());
-			if (e instanceof ItemProviderAdapter) {
-				e = ((ItemProviderAdapter) e).getTarget();
-				if (e == null) {
-					// object deleted
-					//
-					iter.remove();
-				}
-			}
-			if (e instanceof BreakdownElement) {
-				BreakdownElement be = (BreakdownElement) e;
-				Activity superAct = be.getSuperActivities();
-				if (superAct == null && TngUtil.getOwningProcess(be) != be) {
-					iter.remove();
-				}
-			}
-		}
-
-		if (isEmpty())
-			return ""; //$NON-NLS-1$
-
-		StringBuffer strBuf = new StringBuffer();
-		int n = size() - 1;
-		for (int i = 0; i < n; i++) {
-			IBSItemProvider bsItemProvider = (IBSItemProvider) get(i);
-			if ((sup == null) || !sup.isSuppressed(bsItemProvider)) {
-				strBuf.append(bsItemProvider.getId()).append(',');				
-			}
-		}
-		IBSItemProvider bsItemProvider = (IBSItemProvider) get(n);
-		if ((sup == null) || !sup.isSuppressed(bsItemProvider)) {
-			strBuf.append(bsItemProvider.getId());
-		}
-
-		return strBuf.toString();
-	}
-	
-	public String toUnSuppressedString(Suppression sup, boolean isLinkTypeRequired) {
-		// remove the item providers of the deleted elements
-		//
-		for (Iterator iter = iterator(); iter.hasNext();) {
-			Object e = TngUtil.unwrap(iter.next());
-			if (e instanceof ItemProviderAdapter) {
-				e = ((ItemProviderAdapter) e).getTarget();
-				if (e == null) {
-					// object deleted
-					//
-					iter.remove();
-				}
-			}
-			if (e instanceof BreakdownElement) {
-				BreakdownElement be = (BreakdownElement) e;
-				Activity superAct = be.getSuperActivities();
-				if (superAct == null && TngUtil.getOwningProcess(be) != be) {
-					iter.remove();
-				}
-			}
-		}
-
-		if (isEmpty())
-			return ""; //$NON-NLS-1$
-
-		StringBuffer strBuf = new StringBuffer();
-		int n = size() - 1;
-		for (int i = 0; i < n; i++) {
-			IBSItemProvider bsItemProvider = (IBSItemProvider) get(i);
-			if ((sup == null) || !sup.isSuppressed(bsItemProvider)) {
-				strBuf.append(bsItemProvider.getId());
-			    Object value = map4LinkType.get(bsItemProvider.getId());
-			    if (value != null && isLinkTypeRequired) {
-			    	int v = Integer.parseInt(value.toString());
-			    	String abbrev = toWorkOrderTypeAbbreviation(v);
-			    	if(abbrev != null) {
-			    		strBuf.append(abbrev);
-			    	}
-			    }
-				strBuf.append(',');
-			}
-		}
-		IBSItemProvider bsItemProvider = (IBSItemProvider) get(n);
-		if ((sup == null) || !sup.isSuppressed(bsItemProvider)) {
-			strBuf.append(bsItemProvider.getId());
-			//System.out.println(map4LinkType.get(bsItemProvider.getId()));
-			Object value = map4LinkType.get(bsItemProvider.getId());
-		    if (value != null && isLinkTypeRequired) {
-		    	int v = Integer.parseInt(value.toString());
-		    	String abbrev = toWorkOrderTypeAbbreviation(v);
-		    	if(abbrev != null) {
-		    		strBuf.append(abbrev);
-		    	}
-		    }
-		}
-
-		return strBuf.toString();
-	}
-	
-	public static boolean prepareUpdatePredecessors(AdapterFactory adapterFactory, WorkBreakdownElement wbe,
-			List<Object> predecessors, List<WorkOrder> addList, List<WorkOrder> predToBeDeleted) {
-		WorkOrder wo = null;
-		int size = wbe.getLinkToPredecessor().size();
-		
-		// remove WorkOrders for predecessors that are not in predecessor list and accepted by the filter
-		//
-		IFilter filter = ProcessUtil.getFilter(adapterFactory);
-		boolean nullFilter = filter == null;
-		for (Iterator iter = wbe.getLinkToPredecessor().iterator(); iter
-				.hasNext();) {
-			wo = (WorkOrder) iter.next();
-			if ((nullFilter || filter.accept(wo.getPred()))) {
-				boolean found = false;
-				find_pred:						
-				for(Object pred : predecessors) {
-					if(pred instanceof WorkBreakdownElement) {
-						if(wo.getPred() == pred) {
-							found = true;
-							break find_pred;
-						}
-					}
-					else if(pred instanceof BreakdownElementWrapperItemProvider) {
-						if(isPredecessor((BreakdownElementWrapperItemProvider) pred, wo)) {
-							found = true;
-							break find_pred;
-						}
-					}
-				}
-				if(!found) {
-					predToBeDeleted.add(wo);
-				}
-			}
-		}
-
-		size = predecessors.size();
-		for (int i = 0; i < size; i++) {
-			Object obj = predecessors.get(i);
-			WorkBreakdownElement element = (WorkBreakdownElement) TngUtil.unwrap(obj);
-			boolean found = false;
-			BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) (obj instanceof BreakdownElementWrapperItemProvider ? obj : null);
-			String procPath = null;
-			find_pred: for (Iterator iterator = wbe
-					.getLinkToPredecessor().iterator(); iterator
-					.hasNext();) {
-				wo = (WorkOrder) iterator.next();
-				if (wo.getPred() == element) {
-					if(wrapper != null) {
-						if(isPredecessor(wrapper, wo)) {
-							found = true;
-							break find_pred;
-						}
-					}
-					else {
-						// the predecessor is local, no need to look for wrapper
-						//
-						found = true;
-						break find_pred;
-					}
-				}
-			}
-			if (!found) {					
-				wo = UmaFactory.eINSTANCE.createWorkOrder();
-				wo.setPred(element);
-				if(wrapper != null) {
-					if(procPath == null) {
-						procPath = Suppression.getPath(wrapper);
-					}
-					MethodElementPropertyHelper.setProperty(wo, MethodElementPropertyHelper.WORK_ORDER__PREDECESSOR_PROCESS_PATH, procPath);
-				}
-				addList.add(wo);
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * Parses a command-separated list of predecessor indexes into lists of
-	 * predecessorss to be added and deleted for update.
-	 * 
-	 * @param adapterFactory
-	 * @param wbe
-	 * @param indexList
-	 *            a comma-separated list of predecessor indexes
-	 * @param addList
-	 * @param predToBeDeleted
-	 * @return
-	 */
-	public static boolean prepareUpdatePredecessors(
-			AdapterFactory adapterFactory, WorkBreakdownElement wbe,
-			String indexList, List<WorkOrder> addList, List<WorkOrder> predToBeDeleted) {
-		Process process = TngUtil.getOwningProcess(wbe);
-		List<Object> predecessors = new ArrayList<Object>();
-		if (ProcessUtil.checkPredecessorList(wbe, indexList, adapterFactory,
-				process, predecessors) == null) {
-			return prepareUpdatePredecessors(adapterFactory, wbe, predecessors, addList, predToBeDeleted);
-		}
-		return false;
-	}
-
-	public static String toWorkOrderTypeAbbreviation(int workOrderType) {
-		switch(workOrderType) {
-		case WorkOrderType.FINISH_TO_FINISH:
-			return FINISH_TO_FINISH;
-		case WorkOrderType.START_TO_FINISH:
-			return START_TO_FINISH;
-		case WorkOrderType.START_TO_START:
-			return START_TO_START;
-		}
-		return null;
-	}
-	
-	/**
-	 * Checks if the given wrapper is a predecessor defined by the given WorkOrder.
-	 * 
-	 * @param wrapper
-	 * @param workOrder
-	 * @return
-	 */
-	public static boolean isPredecessor(BreakdownElementWrapperItemProvider wrapper, WorkOrder workOrder) {
-		MethodElementProperty prop = MethodElementPropertyHelper.getProperty(workOrder, 
-				MethodElementPropertyHelper.WORK_ORDER__PREDECESSOR_PROCESS_PATH);
-		if(prop == null) {
-			return false;
-		}
-		else {
-			String procPath = prop.getValue();
-			String p = Suppression.getPath(wrapper);
-			return procPath.equals(p);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ProcessUtil.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ProcessUtil.java
deleted file mode 100644
index 9e58e51..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ProcessUtil.java
+++ /dev/null
@@ -1,3380 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.emf.edit.provider.WrapperItemProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IConfigurationApplicator;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.process.ActivityWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.ComposedBreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.DescribableElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.TaskDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.WorkProductDescriptorWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.command.BSDropCommand;
-import org.eclipse.epf.library.edit.process.command.CopyHelper;
-import org.eclipse.epf.library.edit.process.command.ProcessCommandUtil;
-import org.eclipse.epf.library.edit.process.command.ProcessDeepCopyCommand;
-import org.eclipse.epf.library.edit.process.command.WBSDropCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.PredecessorList.DepthLevelItemProvider;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-import com.ibm.icu.text.MessageFormat;
-import com.ibm.icu.util.StringTokenizer;
-
-
-/**
- * Utility class that defines static methods for process authoring
- * 
- * @author Phong Nguyen Le
- * @author Shilpa Toraskar
- * @since 1.0
- */
-public final class ProcessUtil {
-	private static Collection<EClass> OBSEclasses = null;
-
-	private static Collection<EClass> WBSEclasses = null;
-
-	private static Collection<EClass> PBSEclasses = null;
-
-	private static Collection<VariabilityType> extendAndLocalContributionVariabilityTypes = null;
-
-	private static Collection<VariabilityType> getExtendAndLocalContributionVariabilityTypes() {
-		if (extendAndLocalContributionVariabilityTypes == null) {
-			extendAndLocalContributionVariabilityTypes = new ArrayList<VariabilityType>();
-			extendAndLocalContributionVariabilityTypes
-					.add(VariabilityType.EXTENDS_LITERAL);
-			extendAndLocalContributionVariabilityTypes
-					.add(VariabilityType.LOCAL_CONTRIBUTION_LITERAL);
-		}
-		return extendAndLocalContributionVariabilityTypes;
-	}
-
-	public static String checkBreakdownElementName(
-			AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression) {
-		return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE
-				.getNamedElement_Name(), name, suppression);
-	}
-	
-	public static String checkBreakdownElementName(
-			AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression, boolean ignoreSuppressed) {
-		return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE
-				.getNamedElement_Name(), name, suppression, ignoreSuppressed);
-	}
-
-	public static String checkBreakdownElementPresentationName(
-			AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression) {
-		// might allow empty presentation name for extender or contributor. The element will inherit
-		// the presentation name from the base element. Check will be performed on the inherited name
-		//
-		if (name == null || name.length() == 0) {
-			if (isExtendingOrLocallyContributing(e)) {
-				BreakdownElement base = (BreakdownElement) ((VariabilityElement) e)
-						.getVariabilityBasedOnElement();
-				name = getPresentationName(base);
-			}
-		}
-		return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE
-				.getDescribableElement_PresentationName(), name, suppression);
-	}
-	
-	public static String checkBreakdownElementPresentationName(
-			AdapterFactory adapterFactory, BreakdownElement e, String name, Suppression suppression, boolean ignoreSuppressed) {
-
-		return NameChecker.checkName(adapterFactory, e, UmaPackage.eINSTANCE
-				.getDescribableElement_PresentationName(), name, suppression, ignoreSuppressed);
-	}
-
-	public static Object getRootProcess(AdapterFactory adapterFactory,
-			ItemProviderAdapter adapter, Object obj) {
-		Object parent = adapter.getParent(obj);
-		adapter = (ItemProviderAdapter) adapterFactory.adapt(parent,
-				ITreeItemContentProvider.class);
-		if (parent == null) {
-			return obj;
-		} else {
-			return getRootProcess(adapterFactory, adapter, parent);
-		}
-	}
-
-	public static Collection<EClass> getWBSEclasses() {
-		if (WBSEclasses == null) {
-			WBSEclasses = new HashSet<EClass>();
-			WBSEclasses.add(UmaPackage.eINSTANCE.getTaskDescriptor());
-			WBSEclasses.add(UmaPackage.eINSTANCE.getActivity());
-			WBSEclasses.add(UmaPackage.eINSTANCE.getMilestone());
-		}
-		return WBSEclasses;
-	}
-
-	public static Collection<EClass> getOBSEclasses() {
-		if (OBSEclasses == null) {
-			OBSEclasses = new HashSet<EClass>();
-			OBSEclasses.add(UmaPackage.eINSTANCE.getRoleDescriptor());
-			OBSEclasses.add(UmaPackage.eINSTANCE.getActivity());
-			OBSEclasses.add(UmaPackage.eINSTANCE.getMilestone());
-			OBSEclasses.add(UmaPackage.eINSTANCE.getTeamProfile());
-			OBSEclasses.add(UmaPackage.eINSTANCE.getCompositeRole());
-		}
-
-		return OBSEclasses;
-	}
-
-	public static Collection<EClass> getPBSEclasses() {
-		if (PBSEclasses == null) {
-			PBSEclasses = new HashSet<EClass>();
-			PBSEclasses.add(UmaPackage.eINSTANCE.getWorkProductDescriptor());
-			PBSEclasses.add(UmaPackage.eINSTANCE.getActivity());
-			PBSEclasses.add(UmaPackage.eINSTANCE.getMilestone());
-		}
-		return PBSEclasses;
-	}
-
-	public static boolean isFirstElement(AdapterFactory adapterFactory,
-			ItemProviderAdapter itemProvider, Object obj) {
-		Object parent = itemProvider.getParent(obj);
-		if (parent instanceof TeamProfile)
-			return true;
-		LinkedList siblings = getSiblings(adapterFactory, itemProvider, obj);
-		if (siblings != null && !siblings.isEmpty()) {
-			return siblings.getFirst() == obj;
-		}
-		return true;
-	}
-
-	public static LinkedList getSiblings(AdapterFactory adapterFactory,
-			ItemProviderAdapter itemProvider, Object obj) {
-		Object parent = itemProvider.getParent(obj);
-		if (parent == null)
-			return null;
-		ITreeItemContentProvider parentItemProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(parent, ITreeItemContentProvider.class);
-		if (parentItemProvider != null) {
-			return new LinkedList(parentItemProvider.getChildren(parent));
-		}
-		return null;
-	}
-
-	public static boolean isLastElement(AdapterFactory adapterFactory,
-			ItemProviderAdapter itemProvider, Object obj) {
-		Object parent = itemProvider.getParent(obj);
-		if (parent instanceof TeamProfile)
-			return true;
-		LinkedList siblings = getSiblings(adapterFactory, itemProvider, obj);
-		if (siblings != null && !siblings.isEmpty()) {
-			return siblings.getLast() == obj;
-		}
-		return true;
-	}
-
-	/**
-	 * Gets elements that have been affected after the event that triggered the
-	 * given notification.
-	 * 
-	 * @param notification
-	 * @param filter
-	 * @return
-	 */
-	public static List getAffectedElements(Notification notification,
-			IFilter filter) {
-		List affectedElements = new ArrayList();
-		switch (notification.getEventType()) {
-		case Notification.ADD:
-			Object obj = notification.getNewValue();
-			if (filter == null || filter.accept(obj)) {
-				affectedElements.add(obj);
-			}
-			break;
-		case Notification.ADD_MANY:
-			for (Iterator iter = ((Collection) notification.getNewValue())
-					.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (filter == null || filter.accept(element)) {
-					affectedElements.add(element);
-				}
-			}
-			break;
-		case Notification.REMOVE:
-			obj = notification.getOldValue();
-			if (filter == null || filter.accept(obj)) {
-				affectedElements.add(obj);
-			}
-			break;
-		case Notification.REMOVE_MANY:
-			for (Iterator iter = ((Collection) notification.getOldValue())
-					.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (filter == null || filter.accept(element)) {
-					affectedElements.add(element);
-				}
-			}
-			break;
-
-		case Notification.MOVE:
-			obj = notification.getNewValue();
-			if (obj instanceof Collection) {
-				for (Iterator iter = ((Collection) obj).iterator(); iter
-						.hasNext();) {
-					Object element = iter.next();
-					if (filter == null || filter.accept(element)) {
-						affectedElements.add(element);
-					}
-				}
-			} else {
-				if (filter == null || filter.accept(obj)) {
-					affectedElements.add(obj);
-				}
-			}
-			break;
-		}
-		return affectedElements;
-	}
-
-	public static boolean isRefreshRequired(Notification notification,
-			IFilter filter) {
-		switch (notification.getEventType()) {
-		case Notification.SET:
-		case Notification.ADD:
-			Object obj = notification.getNewValue();
-			if (filter == null || filter.accept(obj)) {
-				return true;
-			}
-			break;
-		case Notification.ADD_MANY:
-			for (Iterator iter = ((Collection) notification.getNewValue())
-					.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (filter == null || filter.accept(element)) {
-					return true;
-				}
-			}
-			break;
-		case Notification.REMOVE:
-			obj = notification.getOldValue();
-			if (filter == null || filter.accept(obj)) {
-				return true;
-			}
-			break;
-		case Notification.REMOVE_MANY:
-			for (Iterator iter = ((Collection) notification.getOldValue())
-					.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				if (filter == null || filter.accept(element)) {
-					return true;
-				}
-			}
-			break;
-
-		case Notification.MOVE:
-			obj = notification.getNewValue();
-			if (obj instanceof Collection) {
-				for (Iterator iter = ((Collection) obj).iterator(); iter
-						.hasNext();) {
-					Object element = iter.next();
-					if (filter == null || filter.accept(element)) {
-						return true;
-					}
-				}
-			} else {
-				if (filter == null || filter.accept(obj)) {
-					return true;
-				}
-			}
-			break;
-		}
-
-		return false;
-	}
-
-	public static void addToContainer(BreakdownElement e,
-			ItemProviderAdapter itemProvider) {
-		addToContainer(e, itemProvider, true);
-	}
-
-	/**
-	 * Adds the given BreakdownElement to a new container if it does not have
-	 * one or moves it to the right container if requested.
-	 * 
-	 * @param e
-	 * @param itemProvider
-	 */
-	public static void addToContainer(BreakdownElement e,
-			ItemProviderAdapter itemProvider, boolean move) {
-		ProcessPackage pkg = null;
-		Object parent = itemProvider.getParent(e);
-		if (parent instanceof EObject) {
-			EObject container = ((EObject) parent).eContainer();
-			if (container instanceof ProcessPackage) {
-				pkg = (ProcessPackage) container;
-			}
-		}
-
-		if (pkg == null) {
-			return;
-		}
-
-		if (e instanceof Activity) {
-			Activity act = (Activity) e;
-			if (act.eContainer() == null) {
-				// create new ProcessPackage for the activity
-				//
-				ProcessPackage newPkg = UmaFactory.eINSTANCE
-						.createProcessPackage();
-				newPkg.setName(act.getName());
-				pkg.getChildPackages().add(newPkg);
-				newPkg.getProcessElements().add(e);
-			} else if (move) {
-				// Check if the activity's ProcessPackage is at the right place.
-				// If not, move it to the right ProcessComponent.
-				//
-				ProcessPackage oldPkg = (ProcessPackage) act.eContainer();
-				if (oldPkg.eContainer() != pkg) {
-					pkg.getChildPackages().add(oldPkg);
-				}
-			}
-		} else {
-			if (e.eContainer() == null) {
-				pkg.getProcessElements().add(e);
-			} else if (move && e.eContainer() != pkg) {
-				// move to new ProcessPackage
-				//
-				pkg.getProcessElements().add(e);
-			}
-		}
-	}
-
-	public static void setParent(Object child, Object parent,
-			AdapterFactory adapterFactory) {
-		Object adapter = adapterFactory.adapt(child,
-				ITreeItemContentProvider.class);
-		if (adapter instanceof IBSItemProvider) {
-			((IBSItemProvider) adapter).setParent(parent);
-		} 
-//		else {
-//			System.out
-//					.println(LibraryEditResources.util_ProcessUtil_err_setparent + child); //$NON-NLS-1$
-//			System.out
-//					.println(LibraryEditResources.util_ProcessUtil_childadapter + adapter); //$NON-NLS-1$
-//		}
-	}
-
-	/**
-	 * Creates a new RoleDescriptor from the given role.
-	 * 
-	 * @param role
-	 * @return
-	 */
-	public static RoleDescriptor createRoleDescriptor(Role role) {
-		RoleDescriptor roleDesc = UmaFactory.eINSTANCE.createRoleDescriptor();
-		roleDesc.setRole(role);
-		String presentationName = role.getPresentationName();
-		roleDesc.setName(role.getName());
-		roleDesc.setPresentationName(StrUtil.isBlank(presentationName) ? role
-				.getName() : presentationName);
-		// roleDesc.setBriefDescription(role.getBriefDescription());
-		return roleDesc;
-	}
-
-	public static WorkProductDescriptor createWorkProductDescriptor(
-			WorkProduct wp) {
-		WorkProductDescriptor wpDesc = UmaFactory.eINSTANCE
-				.createWorkProductDescriptor();
-		wpDesc.setWorkProduct(wp);
-		wpDesc.setName(wp.getName());
-		wpDesc
-				.setPresentationName(StrUtil.isBlank(wp.getPresentationName()) ? wp
-						.getName()
-						: wp.getPresentationName());
-		// wpDesc.setBriefDescription(wp.getBriefDescription());
-		return wpDesc;
-	}
-
-	public static boolean refreshNeeded(AdapterFactory adapterFactory,
-			BSActivityItemProvider itemProvider) {
-		return UserInteractionHelper.getUIHelper().refreshNeeded(adapterFactory, itemProvider);
-	}
-	
-	public static void refreshPredeccessorLists(AdapterFactory factory, Process proc) {
-		List<DepthLevelItemProvider> list = PredecessorList.createItemProviderList(proc, factory);
-		for (DepthLevelItemProvider ip : list) {
-			Object itemProvider = ip.getItemProvider();
-			if(itemProvider instanceof IBSItemProvider) {
-				PredecessorList predList = ((IBSItemProvider)itemProvider).getPredecessors();
-				if(predList != null) {
-					predList.refresh(list);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Updates IDs of work breakdown elements of the view of the given process
-	 * 
-	 * @param factory
-	 *            adapter factory of the current process view (WBS, TBS, WPBS,
-	 *            CBS)
-	 * @param proc
-	 *            must be refreshed.
-	 */
-	public static void updateIDs(AdapterFactory factory, Process proc) {
-		AdapterFactoryTreeIterator<Object> iter = new AdapterFactoryTreeIterator<Object>(
-				factory, proc) {
-			private static final long serialVersionUID = 1L;
-			@Override
-			protected Iterator<Object> getChildren(Object o) {
-				Object e = TngUtil.unwrap(o); 
-				if(e instanceof Descriptor || e instanceof Milestone) {
-					return Collections.emptyList().iterator();
-				}
-				return super.getChildren(o);
-			}			
-		};
-
-		Object obj;
-		for (int id = 0; iter.hasNext();) {
-			obj = iter.next();
-			Object adapter = factory.adapt(obj, ITreeItemContentProvider.class);
-			if (adapter instanceof IBSItemProvider) {
-				IBSItemProvider itemProvider = (IBSItemProvider) adapter;
-				if (itemProvider != null
-						&& TngUtil.unwrap(obj) instanceof WorkBreakdownElement) {
-					itemProvider.setId(id++);
-				}
-			}
-		}
-	}
-
-	public static void refreshViewer(AdapterFactory factory, Process proc) {
-		UserInteractionHelper.getUIHelper().refreshViewer(factory, proc);
-	}
-
-	/**
-	 * Refreshes the element IDs in those viewers that require this.
-	 * 
-	 * @param adapterFactory
-	 */
-	public static void refreshIDsInViewers(final ExposedAdapterFactory adapterFactory) {
-		UserInteractionHelper.getUIHelper().refreshIDsInViewer(adapterFactory);
-	}
-
-	public static void refreshAllViewers(final ExposedAdapterFactory adapterFactory) {
-		UserInteractionHelper.getUIHelper().refreshAllViewers(adapterFactory);
-	}
-	
-	/**
-	 * @param e
-	 *            the breakdown element whose predecessor list to be checked.
-	 * @param predIdList
-	 *            a list of predecessor IDs (Integer) as shown in the ID column
-	 *            of the editor
-	 * @param adapterFactory
-	 * @param process
-	 * @param predecessors
-	 *            output, the predecessor list
-	 * @return null if predList is valid, an error message otherwise
-	 */
-	public static String checkPredecessorList(WorkBreakdownElement e,
-			List<Integer> predIdList, AdapterFactory adapterFactory, Object process,
-			List<Object> predecessors) {
-		// get BreakdownElement list from ID list
-		//
-		List<Object> beList = new ArrayList<Object>();
-		List<Object> allElements = new ArrayList<Object>();
-		for (Iterator<Object> iter = new AdapterFactoryTreeIterator<Object>(adapterFactory,
-				process); iter.hasNext();) {
-			Object obj = iter.next();
-			IBSItemProvider itemProvider = (IBSItemProvider) adapterFactory
-					.adapt(obj, ITreeItemContentProvider.class);
-			Integer id = new Integer(itemProvider.getId());
-			Object element = TngUtil.unwrap(obj);
-			allElements.add(element);
-			if (predIdList.contains(id)) {
-				beList.add(obj);
-			}
-		}
-
-		// check for circular dependency
-		//
-		int size = beList.size();
-		for (int i = 0; i < size; i++) {
-			Object obj = TngUtil.unwrap(beList.get(i));
-			if (obj instanceof WorkBreakdownElement) {
-				WorkBreakdownElement pred = (WorkBreakdownElement) obj;
-				if (ProcessUtil.checkCircular(e, pred, allElements)) {
-					return LibraryEditResources.util_ProcessUtil_err_same_breakdown_element; 
-				}
-				if (TngUtil.isSubelementOf(pred, e, adapterFactory)) {
-					return LibraryEditResources.util_ProcessUtil_err_same_sub_element; 
-				}
-				if (TngUtil.isSuperElementOf(pred, e, adapterFactory)) {
-					return LibraryEditResources.util_ProcessUtil_err_child_element; 
-				}
-			} else
-				return LibraryEditResources.util_ProcessUtil_err_wrong_element; 
-		}
-
-		if (predecessors != null)
-			predecessors.addAll(beList);
-		
-		return null;
-	}
-
-	/**
-	 * Checks for circular dependency
-	 * 
-	 * @param successor
-	 * @param predecessor
-	 * @param list
-	 *            the list of all breakdown elements in the breakdown structure
-	 */
-	 public static boolean checkCircular(WorkBreakdownElement successor,
-			WorkBreakdownElement predecessor, List list) {
-		if (successor == predecessor) {
-			if (predecessor.getIsRepeatable().booleanValue()) {
-				return false;
-			}
-			return true;
-		}
-		for (Iterator<?> iter = predecessor.getLinkToPredecessor().iterator(); iter
-				.hasNext();) {
-			WorkOrder element = (WorkOrder) iter.next();
-			WorkBreakdownElement pred = element.getPred();
-			if (pred != predecessor && list.contains(pred)) {
-				if (checkCircular(successor, pred, list))
-					return true;
-			}
-		}
-		return false;
-	}
-	 
-	public static void getAllPredecessorList(WorkBreakdownElement predecessor,
-			List list, List predList) {
-		if (!predList.contains(predecessor))
-			predList.add(predecessor);
-		for (Iterator iter = predecessor.getLinkToPredecessor().iterator(); iter
-				.hasNext();) {
-			WorkOrder element = (WorkOrder) iter.next();
-			WorkBreakdownElement pred = (WorkBreakdownElement) element
-					.getPred();
-			if (pred != predecessor && list.contains(pred)) {
-				if (!predList.contains(pred)) {
-					predList.add(pred);
-					getAllPredecessorList(pred, list, predList);
-				}
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @param e
-	 *            the breakdown element whose predecessor list to be checked.
-	 * @param predList
-	 *            a comma-separated list of predecessor IDs
-	 * @param adapterFactory
-	 * @param topAct
-	 * @param predecessors
-	 *            output, the predecessor list
-	 * @param allElements
-	 *            output, the whole breakdown element list is copied into this
-	 *            list.
-	 * @return null if predList is valid. The predecessor list is saved in
-	 *         predecessors and the whole breakdown element list is saved in
-	 *         allElements.
-	 */
-	public static String checkPredecessorList(WorkBreakdownElement e,
-			String predList, AdapterFactory adapterFactory, Object topAct,
-			List<Object> predecessors) {
-		List<Integer> idList = new ArrayList<Integer>();
-		for (StringTokenizer tokens = new StringTokenizer(predList, ","); tokens.hasMoreTokens();) { //$NON-NLS-1$
-			String token = tokens.nextToken().trim();
-			Integer id;
-			try {
-				id = new Integer(token);
-			} catch (NumberFormatException ex) {
-				return LibraryEditResources.invalidPredecessorError_msg; 
-			}
-			idList.add(id);
-		}
-
-		return checkPredecessorList(e, idList, adapterFactory, topAct,
-				predecessors);
-	}
-
-	/**
-	 * Adds the given object's method package and plugin to the default
-	 * configuration of the given process if they are not in the configuration
-	 * yet.
-	 * 
-	 * @param proc
-	 * @param object
-	 * @param addedObjects
-	 */
-	public static void addToDefaultConfiguration(Process proc, EObject e,
-			Set addedObjects) {
-		// add the element's method package to the default configuration
-		//
-		MethodConfiguration config = proc.getDefaultContext();
-		if (e instanceof Task) {
-			addTaskToDefaultConfiguration(proc, (Task) e, addedObjects, true);
-		} else if (e instanceof WorkProduct) {
-			WorkProduct wp = (WorkProduct) e;
-			addWPToDefaultConfiguration(proc, wp, addedObjects);
-			List tasks = getTasksForWorkProduct(wp, config);
-			if (tasks != null)
-			{
-				for (Iterator iter = tasks.iterator(); iter.hasNext();) {
-					addTaskToDefaultConfiguration(proc, (Task) iter.next(),
-							addedObjects, false);
-				}
-			}
-		} else if (e instanceof Role) {
-			Role role = (Role) e;
-			addRoleToDefaultConfiguration(proc, role, addedObjects);
-
-		} else if (e instanceof Activity) {
-			addActivityToDefaultConfiguration(proc, (Activity) e, addedObjects);
-		} else if (e instanceof Guidance) {
-			TngUtil.addToConfiguration(config, (Guidance) e, addedObjects);
-		}
-	}
-	
-	private static void addActivityToDefaultConfiguration(Process proc, Activity activity, Set addedObjects) {
-		MethodConfiguration config = proc.getDefaultContext();
-		TngUtil.addTo(config, UmaUtil.getProcessComponent(activity), addedObjects);
-		// add linked element of descriptors
-		//
-		for (Iterator iter = activity.getBreakdownElements().iterator(); iter.hasNext();) {
-			Object e = (Object) iter.next();
-			if(e instanceof Descriptor) {
-				MethodElement o = ProcessUtil.getAssociatedElement((Descriptor) e);
-				if(o != null) {
-					addToDefaultConfiguration(proc, o, addedObjects);
-				}
-			}
-			else if (e instanceof Activity){
-				// this is needed for adding sub-activities descriptors 
-				addActivityToDefaultConfiguration(proc, (Activity) e, addedObjects);
-			}
-		}
-
-		// add all the base elements if there is any
-		for (Activity base = (Activity) activity.getVariabilityBasedOnElement(); base != null; base = (Activity) base
-		.getVariabilityBasedOnElement()) {
-			addActivityToDefaultConfiguration(proc, base, addedObjects);
-		}
-	}
-
-	private static void addTaskToDefaultConfiguration(Process proc, Task task,
-			Set addedObjects, boolean includeWorkProducts) {
-		MethodConfiguration config = proc.getDefaultContext();
-
-		TngUtil.addToConfiguration(config, task, addedObjects);
-
-		// add all other dependencies
-		//
-
-		// add roles
-		ArrayList dependencies = new ArrayList();
-		dependencies.addAll(task.getAdditionallyPerformedBy());
-		dependencies.add(task.getPerformedBy());
-		for (Iterator iter = dependencies.iterator(); iter.hasNext();) {
-			TngUtil.addToConfiguration(config, (EObject) iter.next(),
-					addedObjects);
-		}
-
-		// add work products
-		if (includeWorkProducts) {
-			dependencies.clear();
-			dependencies.addAll(task.getOptionalInput());
-			dependencies.addAll(task.getOutput());
-			dependencies.addAll(task.getMandatoryInput());
-			for (Iterator iter = dependencies.iterator(); iter.hasNext();) {
-				addWPToDefaultConfiguration(proc, (WorkProduct) iter.next(),
-						addedObjects);
-			}
-		}
-
-		for (Iterator iter = task.getSteps().iterator(); iter.hasNext();) {
-			VariabilityElement step = (VariabilityElement) iter.next();
-			EObject base = step.getVariabilityBasedOnElement();
-			if (base != null) {
-				TngUtil.addToConfiguration(config, base, addedObjects);
-			}
-		}
-
-	}
-
-	private static void addRoleToDefaultConfiguration(Process proc,
-			Role role, Set addedObjects) {
-		MethodConfiguration config = proc.getDefaultContext();
-		TngUtil.addToConfiguration(config, role, addedObjects);
-		
-		// add work products
-		ArrayList dependencies = new ArrayList();
-	
-		dependencies.addAll(role.getModifies());
-		dependencies.addAll(role.getResponsibleFor());
-		for (Iterator iter = dependencies.iterator(); iter.hasNext();) {
-			addWPToDefaultConfiguration(proc, (WorkProduct) iter.next(),
-					addedObjects);
-		}
-	}
-	
-	private static void addWPToDefaultConfiguration(Process proc,
-			WorkProduct wp, Set addedObjects) {
-		MethodConfiguration config = proc.getDefaultContext();
-		TngUtil.addToConfiguration(config, wp, addedObjects);
-		if (wp instanceof Deliverable) {
-			for (Iterator iter = ((Deliverable) wp).getDeliveredWorkProducts()
-					.iterator(); iter.hasNext();) {
-				TngUtil.addToConfiguration(config, (EObject) iter.next(),
-						addedObjects);
-			}
-		}
-	}
-
-	public static void updateTaskDescriptorSteps(Activity activity,
-			TaskDescriptor taskDesc) {
-		if (taskDesc == null) {
-			return;
-		}
-
-		Task task = taskDesc.getTask();
-
-		IConfigurationApplicator configApplicator = Providers
-				.getConfigurationApplicator();
-		MethodConfiguration config = TngUtil.getOwningProcess(activity)
-				.getDefaultContext();
-		List steps = (List) configApplicator.getReference(task,
-				UmaPackage.eINSTANCE.getTask_Steps(), config);
-
-		// add those steps to TaskDescriptor if they are not there yet.
-		//
-		for (Iterator iter = steps.iterator(); iter.hasNext();) {
-			Object step = iter.next();
-			if (!taskDesc.getSelectedSteps().contains(step)) {
-				taskDesc.getSelectedSteps().add(step);
-			}
-		}
-	}
-
-	/**
-	 * Gets the MethodElement that the given descriptor is associated with.
-	 * 
-	 * @param descriptor
-	 * @return
-	 */
-	public static MethodElement getAssociatedElement(Descriptor descriptor) {
-		if (descriptor instanceof RoleDescriptor) {
-			return ((RoleDescriptor) descriptor).getRole();
-		} else if (descriptor instanceof TaskDescriptor) {
-			return ((TaskDescriptor) descriptor).getTask();
-		} else if (descriptor instanceof WorkProductDescriptor) {
-			return ((WorkProductDescriptor) descriptor).getWorkProduct();
-		}
-		return null;
-	}
-	
-	public static EReference getLinkReference(Descriptor descriptor) {
-		if (descriptor instanceof RoleDescriptor) {
-			return UmaPackage.eINSTANCE.getRoleDescriptor_Role();
-		} else if (descriptor instanceof TaskDescriptor) {
-			return UmaPackage.eINSTANCE.getTaskDescriptor_Task();
-		} else if (descriptor instanceof WorkProductDescriptor) {
-			return UmaPackage.eINSTANCE.getWorkProductDescriptor_WorkProduct();
-		}
-		return null;
-
-	}
-
-	public static void disposeWrappers(Collection children) {
-		if (children == null)
-			return;
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof IWrapperItemProvider) {
-				((IWrapperItemProvider) element).dispose();
-			}
-		}
-	}
-
-	/**
-	 * Get all tasks that have the given workproduct in their output
-	 * in the given configuration
-	 * 
-	 * @param wp
-	 * @param config
-	 * @return
-	 */
-	public static List getTasksForWorkProduct(WorkProduct wp,
-			MethodConfiguration config) {
-		IConfigurationApplicator configApplicator = Providers.getConfigurationApplicator();
-
-		List tasks = (List) configApplicator.getReference(wp, AssociationHelper.WorkProduct_OutputFrom_Tasks, config);
-
-		return tasks;
-	}
-
-	/**
-	 * Get all workproducts that have the role as responsible role in the
-	 * given configuration
-	 * 
-	 * @param wp
-	 * @param config
-	 * @return
-	 */
-	public static List getWorkProductsForRole(Role role,
-			MethodConfiguration config) {
-		IConfigurationApplicator configApplicator = Providers.getConfigurationApplicator();
-		List wps = (List) configApplicator.getReference(role, UmaPackage.eINSTANCE.getRole_ResponsibleFor(), config);
-		return wps;
-	}
-
-	/**
-	 * Gets all workproducts which are, except the contributor, in the given
-	 * plugin.
-	 * 
-	 * @param plugin
-	 * @return
-	 */
-	public static List getAllWorkProducts(MethodPlugin plugin) {
-
-		ContentPackage coreContentPkg = UmaUtil.findContentPackage(plugin,
-				ModelStructure.DEFAULT.coreContentPath);
-		Iterator iter = new AbstractTreeIterator(coreContentPkg, false) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 3833752066324837937L;
-
-			protected Iterator getChildren(Object object) {
-				if (!(object instanceof ContentPackage))
-					return Collections.EMPTY_LIST.iterator();
-				ContentPackage pkg = (ContentPackage) object;
-				List children = new ArrayList();
-				for (Iterator iterator = pkg.getChildPackages().iterator(); iterator
-						.hasNext();) {
-					Object element = iterator.next();
-					if (element instanceof ContentPackage) {
-						children.add(element);
-					}
-				}
-				for (Iterator iterator = pkg.getContentElements().iterator(); iterator
-						.hasNext();) {
-					Object element = iterator.next();
-
-					if ((element instanceof WorkProduct)
-							&& !TngUtil
-									.isContributor((VariabilityElement) element)) {
-						children.add(element);
-					}
-				}
-				return children.iterator();
-			}
-
-		};
-		List methodElements = new ArrayList();
-		while (iter.hasNext()) {
-			Object e = iter.next();
-			if (e instanceof WorkProduct) {
-				methodElements.add(e);
-			}
-		}
-		return methodElements;
-	}
-
-	/**
-	 * Gets all task, except the contributor, in the given plugin.
-	 * 
-	 * @param plugin
-	 * @return
-	 */
-	public static List getAllTasks(MethodPlugin plugin) {
-		ContentPackage coreContentPkg = UmaUtil.findContentPackage(plugin,
-				ModelStructure.DEFAULT.coreContentPath);
-		Iterator iter = new AbstractTreeIterator(coreContentPkg, false) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 3833752066324837937L;
-
-			protected Iterator getChildren(Object object) {
-				if (!(object instanceof ContentPackage))
-					return Collections.EMPTY_LIST.iterator();
-				ContentPackage pkg = (ContentPackage) object;
-				List children = new ArrayList();
-				for (Iterator iterator = pkg.getChildPackages().iterator(); iterator
-						.hasNext();) {
-					Object element = iterator.next();
-					if (element instanceof ContentPackage) {
-						children.add(element);
-					}
-				}
-				for (Iterator iterator = pkg.getContentElements().iterator(); iterator
-						.hasNext();) {
-					Object element = iterator.next();
-					if (element instanceof Task
-							&& !TngUtil
-									.isContributor((VariabilityElement) element)) {
-						children.add(element);
-					}
-				}
-				return children.iterator();
-			}
-
-		};
-		List tasks = new ArrayList();
-		while (iter.hasNext()) {
-			Object e = iter.next();
-			if (e instanceof Task) {
-				tasks.add(e);
-			}
-		}
-		return tasks;
-	}
-
-	public static boolean isExtendingOrLocallyContributing(BreakdownElement e) {
-		return TngUtil.isGeneralizer(e,
-				getExtendAndLocalContributionVariabilityTypes());
-	}
-	
-
-	public static String getPresentationName(BreakdownElement e) {
-		if (e.getPresentationName() == null
-				|| e.getPresentationName().length() == 0) {
-			if (isExtendingOrLocallyContributing(e)) {
-				BreakdownElement base = (BreakdownElement) ((VariabilityElement) e)
-						.getVariabilityBasedOnElement();
-				return getPresentationName(base);
-			}
-		}
-
-		return e.getPresentationName();
-	}
-
-	public static String getLabelWithPath(BreakdownElement e) {
-		StringBuffer path = new StringBuffer(e.getName());
-		Process proc = TngUtil.getOwningProcess(e);
-		if (proc != null) {
-			path.append(", "); //$NON-NLS-1$
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(proc);
-			if (plugin != null) {
-				path.append(plugin.getName());
-			}
-			if (e != proc) {
-				path.append('/').append(proc.getName());
-			}
-		}
-		return path.toString();
-	}
-
-	/**
-	 * Gets the model info of the given BreakdownElement in the given
-	 * StringBuffer
-	 * 
-	 * @param e
-	 * @param adapter
-	 * @param modelInfo
-	 */
-	public static void getModelInfo(BreakdownElement e, Object adapter,
-			StringBuffer modelInfo) {
-		if (e instanceof VariabilityElement) {
-			VariabilityElement ve = (VariabilityElement) e;
-			VariabilityElement base = ve.getVariabilityBasedOnElement();
-			if (base != null) {
-				VariabilityType type = ve.getVariabilityType();
-				if (modelInfo.length() > 0) {
-					modelInfo.append("; "); //$NON-NLS-1$
-				}
-				String pattern = null;
-				if (type == VariabilityType.CONTRIBUTES_LITERAL) {
-					pattern = LibraryEditResources.util_ProcessUtil_contributesto; 
-				} else if (type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-					pattern = LibraryEditResources.util_ProcessUtil_localContributesto; 
-				} else if (type == VariabilityType.EXTENDS_LITERAL) {
-					pattern = LibraryEditResources.process_extends; 
-				} else if (type == VariabilityType.REPLACES_LITERAL) {
-					pattern = LibraryEditResources.process_replaces; 
-				} else if (type == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-					pattern = LibraryEditResources.process_localReplaces; 
-				}
-
-				// if(adapter instanceof ItemProviderAdapter) {
-				// AdapterFactory factory =
-				// ((ItemProviderAdapter)adapter).getAdapterFactory();
-				// Object itemProvider = factory.adapt(base,
-				// ITreeItemContentProvider.class);
-				// if(itemProvider instanceof IBSItemProvider) {
-				// IBSItemProvider bsItemProvider = (IBSItemProvider)
-				// itemProvider;
-				// Process proc = (Process) bsItemProvider.getTopItem();
-				// if(proc != null) {
-				// strbuf.append(UmaUtil.getMethodPlugin(proc).getName()).append(':')
-				// .append(proc.getName()).append(':');
-				// }
-				// }
-				// }
-
-				// Process proc = TngUtil.getOwningProcess((BreakdownElement)
-				// base);
-				// if(proc != null) {
-				// MethodPlugin plugin = UmaUtil.getMethodPlugin(proc);
-				// if(plugin != null) {
-				// modelInfo.append(UmaUtil.getMethodPlugin(proc).getName()).append(':');
-				// }
-				// modelInfo.append(proc.getName());
-				// }
-				//				
-				// if(base != proc) {
-				// modelInfo.append(':').append(base.getName());
-				// }
-				// modelInfo.append("'"); //$NON-NLS-1$
-				if (pattern != null) {
-					String path = getLabelWithPath((BreakdownElement) base);
-					modelInfo.append(MessageFormat.format(pattern,
-							new Object[] { path }));
-
-					getModelInfo((BreakdownElement) base, adapter, modelInfo);
-				}
-			}
-		} else if (adapter instanceof BreakdownElementWrapperItemProvider) {
-			BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) adapter;
-			wrapper.getOwner();
-			if (wrapper.getFeature() != null) {
-				modelInfo.append(TngUtil.getFeatureText(wrapper.getFeature()));
-			} else {
-				if (wrapper instanceof WorkProductDescriptorWrapperItemProvider) {
-//					getModelInfoForWorkProductDescriptor(modelInfo,
-//							(WorkProductDescriptor) TngUtil.unwrap(wrapper));
-					getWPDModelInfo(modelInfo, wrapper, wrapper);
-				}
-			}
-		}
-	}
-	
-	public static String getColumnName(String property) {
-		if (IBSItemProvider.COL_ID.equals(property)) {
-			return IBSItemProvider.COL_ID;
-		} else if (IBSItemProvider.COL_NAME.equals(property)) {
-			return IBSItemProvider.COL_NAME;
-		} else if (IBSItemProvider.COL_PRESENTATION_NAME.equals(property)) {
-			return IBSItemProvider.COL_PRESENTATION_NAME;
-		} else if (IBSItemProvider.COL_PREDECESSORS.equals(property)) {
-			return IBSItemProvider.COL_PREDECESSORS;
-		} else if (IBSItemProvider.COL_IS_EVENT_DRIVEN.equals(property)) {
-			return IBSItemProvider.COL_IS_EVENT_DRIVEN;
-		} else if (IBSItemProvider.COL_IS_ONGOING.equals(property)) {
-			return IBSItemProvider.COL_IS_ONGOING;
-		} else if (IBSItemProvider.COL_IS_REPEATABLE.equals(property)) {
-			return IBSItemProvider.COL_IS_REPEATABLE;
-		} else if (IBSItemProvider.COL_PREFIX.equals(property)) {
-			return IBSItemProvider.COL_PREFIX;
-		} else if (IBSItemProvider.COL_MODEL_INFO.equals(property)) {
-			return IBSItemProvider.COL_MODEL_INFO;
-		} else if (IBSItemProvider.COL_TYPE.equals(property)) {
-			return IBSItemProvider.COL_TYPE;
-		} else if (IBSItemProvider.COL_TEAMS.equals(property)) {
-			return IBSItemProvider.COL_TEAMS;
-		} else if (IBSItemProvider.COL_ENTRY_STATE.equals(property)) {
-			return IBSItemProvider.COL_ENTRY_STATE;
-		} else if (IBSItemProvider.COL_EXIT_STATE.equals(property)) {
-			return IBSItemProvider.COL_EXIT_STATE;
-		} else if (IBSItemProvider.COL_DELIVERABLE.equals(property)) {
-			return IBSItemProvider.COL_DELIVERABLE;
-		} else if (IBSItemProvider.COL_IS_OPTIONAL.equals(property)) {
-			return IBSItemProvider.COL_IS_OPTIONAL;
-		} else if (IBSItemProvider.COL_IS_PLANNED.equals(property)) {
-			return IBSItemProvider.COL_IS_PLANNED;
-		} else if (IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES.equals(property)) {
-			return IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES;
-		}
-		return null;
-	}
-
-	public static String getAttribute(Object object, String property,
-			Object adapter) {
-		BreakdownElement e = (BreakdownElement) TngUtil.unwrap(object);
-		if (property == IBSItemProvider.COL_ID) {
-			if (e instanceof WorkBreakdownElement
-					&& adapter instanceof IBSItemProvider) {
-				return String.valueOf(((IBSItemProvider) adapter).getId());
-			}
-		} else if (property == IBSItemProvider.COL_NAME) {
-			if (adapter instanceof IItemLabelProvider) {
-				return ((IItemLabelProvider) adapter).getText(e);
-			}
-		} else if (property == IBSItemProvider.COL_PRESENTATION_NAME) {
-			return getPresentationName(e);
-		} else if (property == IBSItemProvider.COL_PREDECESSORS) {
-			if (adapter instanceof IBSItemProvider) {
-				return ((IBSItemProvider) adapter).getPredecessors().toString();
-			}
-		} else if (property == IBSItemProvider.COL_IS_EVENT_DRIVEN) {
-			if (e instanceof WorkBreakdownElement) {
-				return String.valueOf(((WorkBreakdownElement) e)
-						.getIsEventDriven());
-			}
-		} else if (property == IBSItemProvider.COL_IS_ONGOING) {
-			if (e instanceof WorkBreakdownElement) {
-				return String
-						.valueOf(((WorkBreakdownElement) e).getIsOngoing());
-			}
-		} else if (property == IBSItemProvider.COL_IS_REPEATABLE) {
-			if (e instanceof WorkBreakdownElement) {
-				return String.valueOf(((WorkBreakdownElement) e)
-						.getIsRepeatable());
-			}
-		} else if (property == IBSItemProvider.COL_PREFIX) {
-			return e.getPrefix();
-		} else if (property == IBSItemProvider.COL_MODEL_INFO) {
-			StringBuffer modelInfo = new StringBuffer();
-			getModelInfo(e, adapter, modelInfo);
-			return modelInfo.toString();
-		} else if (property == IBSItemProvider.COL_TYPE) {
-			String typeName = null;
-			if (e instanceof WorkProductDescriptor) {
-				WorkProduct wp = ((WorkProductDescriptor) e)
-						.getWorkProduct();
-				if (wp != null) {
-					typeName = wp.eClass().getName() + "Descriptor"; //$NON-NLS-1$  
-				}
-			}
-			if (typeName == null && e instanceof EObject) {
-				typeName = ((EObject) e).eClass().getName();
-			}
-			if (typeName != null) {
-				return UmaEditPlugin.INSTANCE
-						.getString("_UI_" + typeName + "_type"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} else if (property == IBSItemProvider.COL_TEAMS) {
-			if (e instanceof TeamProfile) {
-				return TngUtil.getPresentationName(((TeamProfile) e)
-						.getSuperTeam());
-			}
-			else if (e instanceof RoleDescriptor && adapter instanceof ITreeItemContentProvider) {
-				AdapterFactory adapterFactory = null;
-				if(adapter instanceof BreakdownElementWrapperItemProvider) {
-					adapterFactory = ((BreakdownElementWrapperItemProvider)adapter).getAdapterFactory();
-				}
-				else if(adapter instanceof ItemProviderAdapter) {
-					adapterFactory = ((ItemProviderAdapter)adapter).getAdapterFactory();
-				}
-				return getTeamListString(getTeamProfiles(object, (ITreeItemContentProvider)adapter, adapterFactory));
- 			}
-		}
-		if (property == IBSItemProvider.COL_ENTRY_STATE) {
-			if (e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpd = (WorkProductDescriptor) e;
-				return TngUtil.checkNull(wpd.getActivityEntryState());
-			}
-		} else if (property == IBSItemProvider.COL_EXIT_STATE) {
-			if (e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpd = (WorkProductDescriptor) e;
-				return TngUtil.checkNull(wpd.getActivityExitState());
-			}
-		} else if (property == IBSItemProvider.COL_DELIVERABLE) {
-			if (e instanceof WorkProductDescriptor) {
-				List deliverables = AssociationHelper
-						.getDeliverableDescriptors((WorkProductDescriptor) e);
-				if (deliverables.isEmpty())
-					return ""; //$NON-NLS-1$
-				StringBuffer strBuf = new StringBuffer();
-				int max = deliverables.size() - 1;
-				for (int i = 0; i < max; i++) {
-					strBuf.append(
-							TngUtil.getPresentationName(deliverables.get(i)))
-							.append(',');
-				}
-				strBuf.append(TngUtil
-						.getPresentationName(deliverables.get(max)));
-				return strBuf.toString();
-			}
-		} else if (property == IBSItemProvider.COL_IS_OPTIONAL) {
-			return String.valueOf(e.getIsOptional());
-		} else if (property == IBSItemProvider.COL_IS_PLANNED) {
-			return String.valueOf(e.getIsPlanned());
-		} else if (property == IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES) {
-			return String.valueOf(e.getHasMultipleOccurrences());
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Get parent activity for team profile breakdown element
-	 * UmaUtil.getParentActivity doesn't work correctly for sub-teams
-	 * This method should only be used for breakdown elements under teamallocation
-	 * @param team
-	 * @return
-	 */
-	public static Object getParentActivityOfTeam(BreakdownElement brElement)
-	{
-		AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory();
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(brElement, ITreeItemContentProvider.class);
-		Object parent = adapter.getParent(brElement);
-		while (!(parent instanceof Activity)) {
-			brElement = (BreakdownElement) parent;
-			adapter = (ItemProviderAdapter) adapterFactory.adapt(brElement,
-					ITreeItemContentProvider.class);
-			parent = adapter.getParent(brElement);
-		}
-
-		return parent;	
-	}
-	
-	
-	/**
-	 * Return roledescriptors under activity which could possible match for
-	 * roles under the teams. It will recurse thru all child activities to find 
-	 * role descriptors
-	 * 
-	 * @param adapterFactory
-	 * @param parent
-	 * @param roleDescList
-	 * @param roles
-	 */
-	public static void getRoleDescriptor(AdapterFactory adapterFactory,
-			Activity parent,  List roleDescList, List roles) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-				.adapt(parent, ITreeItemContentProvider.class);
-
-		Object o = adapter.getChildren(parent);
-		if (o instanceof List) {
-			List children = (List) o;
-			for (Iterator itor = children.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (obj instanceof Activity) {
-					getRoleDescriptor(adapterFactory, (Activity) obj,
-							roleDescList, roles);
-				}
-				if (obj instanceof RoleDescriptor)
-				{
-					RoleDescriptor roleDesc = (RoleDescriptor) obj;
-					if ((roleDesc.getRole()!= null) && 
-							(roles.contains(roleDesc.getRole())))
-						roleDescList.add(obj);
-				}
-			}
-		}
-	}
-	
-	private static String getTeamListString(List teamProfiles) {
-		if (teamProfiles.isEmpty())
-			return ""; //$NON-NLS-1$
-		StringBuffer strBuf = new StringBuffer();
-		int max = teamProfiles.size() - 1;
-		for (int i = 0; i < max; i++) {
-			strBuf.append(TngUtil.getPresentationName(teamProfiles.get(i)))
-					.append(',');
-		}
-		strBuf.append(TngUtil.getPresentationName(teamProfiles.get(max)));
-		return strBuf.toString();
-	}
-
-	public static void setAttribute(WorkBreakdownElement e, String prop,
-			String txt) {
-		if (prop == IBSItemProvider.COL_NAME) {
-			e.setName(txt);
-		} else if (prop == IBSItemProvider.COL_PREFIX) {
-			e.setPrefix(txt);
-		} else if (prop == IBSItemProvider.COL_IS_EVENT_DRIVEN) {
-			e.setIsEventDriven(Boolean.valueOf(txt));
-		} else if (prop == IBSItemProvider.COL_IS_ONGOING) {
-			e.setIsOngoing(Boolean.valueOf(txt));
-		} else if (prop == IBSItemProvider.COL_IS_REPEATABLE) {
-			e.setIsRepeatable(Boolean.valueOf(txt));
-		}
-	}
-
-	public static void setAttribute(IActionManager actionMgr,
-			BreakdownElement e, String prop, String txt) {
-		if (prop == IBSItemProvider.COL_NAME) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getNamedElement_Name(), txt, -1);
-		} else if (prop == IBSItemProvider.COL_PREFIX) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getBreakdownElement_Prefix(), txt, -1);
-		} else if (prop == IBSItemProvider.COL_IS_EVENT_DRIVEN) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getWorkBreakdownElement_IsEventDriven(), Boolean
-					.valueOf(txt), -1);
-		} else if (prop == IBSItemProvider.COL_IS_ONGOING) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getWorkBreakdownElement_IsOngoing(), Boolean.valueOf(txt),
-					-1);
-		} else if (prop == IBSItemProvider.COL_IS_REPEATABLE) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getWorkBreakdownElement_IsRepeatable(), Boolean
-					.valueOf(txt), -1);
-		} else if (prop == IBSItemProvider.COL_PRESENTATION_NAME) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getDescribableElement_PresentationName(), txt, -1);
-		} else if (prop == IBSItemProvider.COL_IS_OPTIONAL) {
-			actionMgr
-					.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-							.getBreakdownElement_IsOptional(), Boolean
-							.valueOf(txt), -1);
-		} else if (prop == IBSItemProvider.COL_IS_PLANNED) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getBreakdownElement_IsPlanned(), Boolean.valueOf(txt), -1);
-		} else if (prop == IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES) {
-			actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-					.getBreakdownElement_HasMultipleOccurrences(), Boolean
-					.valueOf(txt), -1);
-		} else if (e instanceof WorkProductDescriptor) {
-			if (prop == IBSItemProvider.COL_ENTRY_STATE) {
-				actionMgr
-						.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-								.getWorkProductDescriptor_ActivityEntryState(),
-								txt, -1);
-			} else if (prop == IBSItemProvider.COL_EXIT_STATE) {
-				actionMgr.doAction(IActionManager.SET, e, UmaPackage.eINSTANCE
-						.getWorkProductDescriptor_ActivityExitState(), txt, -1);
-			}
-		}
-
-	}
-
-	public static Activity generalize(Activity base, VariabilityType type) {		
-		Activity act = (Activity) UmaFactory.eINSTANCE.create(base.eClass());
-		act.setName(base.getName());
-		if (type == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-			String presentationName = getPresentationName(base);
-			act.setPresentationName(StrUtil.isBlank(presentationName) ? base
-					.getName() : presentationName);
-		}
-		act.setVariabilityBasedOnElement(base);
-		act.setVariabilityType(type);
-
-		if (type == VariabilityType.EXTENDS_LITERAL) {
-			// inherit boolean attributes from base
-			//
-			for (Iterator iter = base.eClass().getEAllAttributes().iterator(); iter
-					.hasNext();) {
-				EAttribute attribute = (EAttribute) iter.next();
-				if (attribute.getEAttributeType().getInstanceClass() == Boolean.class) {
-					act.eSet(attribute, base.eGet(attribute));
-				}
-			}
-		}
-
-		// copy predecessors list
-		// TODO: need to check with variability rules.
-		//
-		ArrayList workOrders = new ArrayList();
-		for (Iterator iter = new ArrayList(base.getLinkToPredecessor())
-				.iterator(); iter.hasNext();) {
-			workOrders.add(TngUtil.copy((WorkOrder) iter.next()));
-		}
-
-		act.getLinkToPredecessor().addAll(workOrders);
-		return act;
-	}
-
-	/**
-	 * Returns list of elements specified in class "type" eg.(RoleDescriptor,
-	 * WorkProductDescriptor" until the root level.
-	 * 
-	 * @param adapterFactory
-	 * @param element
-	 * @param type
-	 * @param items
-	 * @return
-	 */
-	public static List getElementsInScope(AdapterFactory adapterFactory,
-			BreakdownElement element, Class type, List items) {
-		// get children for activity
-		ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(element, ITreeItemContentProvider.class);
-		if (element instanceof Activity) {
-			Collection children = ((Activity) element).getBreakdownElements();
-			for (Iterator itor = children.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (type.isInstance(obj)) {
-					// System.out.println("Obj -" + obj);
-					if (!(items.contains(obj))) {
-						items.add(obj);
-					}
-				}
-			}
-		}
-
-		// get parent
-		Object currentParent = itemProvider.getParent(element);
-		if (currentParent != null) {
-			// go up
-			getElementsInScope(adapterFactory,
-					(BreakdownElement) currentParent, type, items);
-		}
-		return items;
-
-	}
-
-	/**
-	 * Get roles from roledescriptor list
-	 * 
-	 * @param roleDescList
-	 * @return
-	 */
-
-	public static List getRoles(List roleDescList) {
-		List roleList = new ArrayList();
-		if (roleDescList != null) {
-			for (Iterator itor = roleDescList.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (obj instanceof RoleDescriptor) {
-					Role role = ((RoleDescriptor) obj).getRole();
-					roleList.add(role);
-				}
-			}
-		}
-		return roleList;
-	}
-
-	/**
-	 * Get associated method element list
-	 * 
-	 * @param descriptorList
-	 * @return
-	 */
-	public static List getAssociatedElementList(List descriptorList) {
-		List elementList = new ArrayList();
-		if (descriptorList != null) {
-			for (Iterator itor = descriptorList.iterator(); itor.hasNext();) {
-				Object obj = itor.next();
-				if (obj instanceof Descriptor) {
-					MethodElement element = getAssociatedElement((Descriptor) obj);
-					elementList.add(element);
-				}
-			}
-		}
-		return elementList;
-	}
-
-	public static BreakdownElement getTopBreakdownElement(ProcessComponent pc) {
-		BreakdownElement be = pc.getProcess();
-		if (be == null)
-			return null;
-		Object adapter = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory().adapt(be,
-						ITreeItemContentProvider.class);
-		if (!(adapter instanceof IBSItemProvider))
-			return be;
-		IBSItemProvider itemProvider = (IBSItemProvider) adapter;
-		if (itemProvider.getTopItem() == null) {
-			itemProvider.setTopItem(be);
-			itemProvider = (IBSItemProvider) TngAdapterFactory.INSTANCE
-					.getOBS_ComposedAdapterFactory().adapt(be,
-							ITreeItemContentProvider.class);
-			itemProvider.setTopItem(be);
-			itemProvider = (IBSItemProvider) TngAdapterFactory.INSTANCE
-					.getPBS_ComposedAdapterFactory().adapt(be,
-							ITreeItemContentProvider.class);
-			itemProvider.setTopItem(be);
-			itemProvider = (IBSItemProvider) TngAdapterFactory.INSTANCE
-					.getProcessComposedAdapterFactory().adapt(be,
-							ITreeItemContentProvider.class);
-			itemProvider.setTopItem(be);
-		}
-		ProcessUtil.updateIDs(be, be);
-		return be;
-	}
-
-	private static void updateIDs(EObject topAct, Object newObj) {
-		ItemProviderAdapter adapter = (ItemProviderAdapter) TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory().adapt(topAct,
-						ITreeItemContentProvider.class);
-		AdapterFactory factory = TngUtil.getBestAdapterFactory(adapter
-				.getAdapterFactory());
-		boolean updateWholeProcess = topAct == newObj
-				&& topAct instanceof Process;
-		if (updateWholeProcess) {
-			Process proc = (Process) topAct;
-			updateIDs(factory, proc);
-			refreshViewer(factory, proc);
-		} else {
-			AdapterFactoryTreeIterator iter = new AdapterFactoryTreeIterator(
-					factory, topAct);
-			updateIDs(factory, iter, newObj);
-		}
-
-		// No more ID column in TBS and WPBS
-		//
-		// adapter = (ItemProviderAdapter)
-		// TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory().adapt(topAct,
-		// ITreeItemContentProvider.class);
-		// factory = TngUtil.getBestAdapterFactory(adapter.getAdapterFactory());
-		// iter = new AdapterFactoryTreeIterator(factory, topAct);
-		// ProcessUtil.updateIDs(factory, iter, newObj);
-		// adapter = (ItemProviderAdapter)
-		// TngAdapterFactory.INSTANCE.getPBS_ComposedAdapterFactory().adapt(topAct,
-		// ITreeItemContentProvider.class);
-		// factory = TngUtil.getBestAdapterFactory(adapter.getAdapterFactory());
-		// iter = new AdapterFactoryTreeIterator(factory, topAct);
-		// ProcessUtil.updateIDs(factory, iter, newObj);
-
-		adapter = (ItemProviderAdapter) TngAdapterFactory.INSTANCE
-				.getProcessComposedAdapterFactory().adapt(topAct,
-						ITreeItemContentProvider.class);
-		factory = TngUtil.getBestAdapterFactory(adapter.getAdapterFactory());
-		if (updateWholeProcess) {
-			Process proc = (Process) topAct;
-			updateIDs(factory, proc);
-			refreshViewer(factory, proc);
-		} else {
-			AdapterFactoryTreeIterator iter = new AdapterFactoryTreeIterator(
-					factory, topAct);
-			updateIDs(factory, iter, newObj);
-		}
-	}
-
-	/**
-	 * @param iter
-	 * @param newObj
-	 */
-	public static void updateIDs(AdapterFactory factory,
-			AdapterFactoryTreeIterator iter, Object newObj) {
-		int id = 0;
-		Object obj;
-		Map changeMap = new HashMap();
-		while (iter.hasNext()) {
-			obj = iter.next();
-			IBSItemProvider itemProvider = (IBSItemProvider) factory.adapt(obj,
-					ITreeItemContentProvider.class);
-			itemProvider.setId(id++);
-			changeMap.put(obj, itemProvider);
-		}
-
-		// refresh the label
-		//
-		for (Iterator iterator = changeMap.entrySet().iterator(); iterator
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iterator.next();
-			IChangeNotifier adapter = (IChangeNotifier) entry.getValue();
-			obj = entry.getKey();
-			adapter.fireNotifyChanged(new ViewerNotification(
-					new NotificationImpl(Notification.SET, obj, obj), obj,
-					false, true));
-		}
-	}
-
-	/**
-	 * 
-	 * @param descriptor
-	 * @param obj
-	 * @return
-	 * @see #checkDescriptorReferences(Collection, Descriptor)
-	 */
-	public static boolean checkDescriptorReferences(Descriptor descriptor,
-			Descriptor obj) {
-		Collection descriptors = descriptor != null ? Collections
-				.singleton(descriptor) : Collections.EMPTY_SET;
-		return checkDescriptorReferences(descriptors, obj);
-	}
-
-	
-	/**
-	 * Check whether there are any references of the object "obj". If references
-	 * exist in any descriptor in <code>descriptors</code>, ignore it.
-	 * 
-	 * @param descriptors
-	 * @param obj
-	 * @return
-	 */
-	public static boolean checkDescriptorReferences(Collection descriptors,
-			Descriptor obj) {
-		boolean referencesExists = false;
-
-		if (obj instanceof RoleDescriptor) {
-			RoleDescriptor refObject = (RoleDescriptor) obj;
-			List list = new ArrayList();
-			list.addAll(AssociationHelper.getAssistedTaskDescriptors(refObject));
-			list.addAll(refObject.getResponsibleFor());
-			list.addAll(AssociationHelper.getAdditionalTaskDescriptors(refObject));
-			list.addAll(AssociationHelper.getPrimaryTaskDescriptors(refObject));
-			list.addAll(AssociationHelper.getTeamProfiles(refObject));
-
-			for (Iterator refItor = list.iterator(); refItor.hasNext();) {
-				Object refItorObject = (Object) refItor.next();
-				if (((refItorObject instanceof Descriptor) && !descriptors
-						.contains(refItorObject))
-						|| (refItorObject instanceof TeamProfile)) {
-					referencesExists = true;
-					break;
-				}
-
-			}
-		} else if (obj instanceof WorkProductDescriptor) {		
-			return checkWorkProductDescriptorReferences(descriptors, (WorkProductDescriptor) obj, false, -1);
-		} else if (obj instanceof TaskDescriptor) {
-			TaskDescriptor refObject = (TaskDescriptor) obj;
-			List list = new ArrayList();
-			list.addAll(refObject.getAdditionallyPerformedBy());
-			list.addAll(refObject.getAssistedBy());
-			list.addAll(refObject.getExternalInput());
-			list.addAll(refObject.getMandatoryInput());
-			list.addAll(refObject.getOptionalInput());
-			list.addAll(refObject.getOutput());
-			list.add(refObject.getPerformedPrimarilyBy());
-
-			for (Iterator refItor = list.iterator(); refItor.hasNext();) {
-				Object refItorObject = (Object) refItor.next();
-				if ((refItorObject instanceof Descriptor)
-						&& !descriptors.contains(refItorObject)) {
-					referencesExists = true;
-					break;
-				}
-			}
-		}
-
-		return referencesExists;
-	}
-	
-	/**
-	 * Check whether there are any references of the workProductdescriptor object "refObject. 
-	 * If references exist in any descriptor in <code>descriptors</code>, ignore it.
-	 * 
-	 * @param descriptors
-	 * @param refObject
-	 * @param removeRelation - flag to indicate whether we're removing relation
-	 *     By default this should be false. 
-	 *     This is only applicable if you are coming from properties view. 
-	 *     eg. removing relationship of work product descriptor to task descriptor 
-	 * @param featureID
-	 * 		This is only applicable if "removeRelation" is true. You need to give featureID
-	 * 		for which relation you are removing.
-	 * @return
-	 */
-	public static boolean checkWorkProductDescriptorReferences(
-			Collection descriptors, WorkProductDescriptor refObject, boolean removeRelation, int featureID) {
-		
-		List allObjects = new ArrayList();
-		allObjects.add(refObject);
-
-		Activity parentActivity = UmaUtil.getParentActivity(refObject);
-		// check whether reference object instance of artifact
-		if (refObject.getWorkProduct() instanceof Artifact) {
-			List containedArtifacts = ((Artifact) refObject.getWorkProduct())
-					.getContainedArtifacts();
-
-			List containedWpDescList = getWpDescForArtifacts(
-					containedArtifacts, parentActivity);
-
-			List containerArtifacts = new ArrayList();
-			Artifact artifact = ((Artifact) refObject.getWorkProduct())
-					.getContainerArtifact();
-			while (artifact != null) {
-				containerArtifacts.add(artifact);
-				artifact = ((Artifact) artifact).getContainerArtifact();
-			}
-			List containerWpDescList = getWpDescForArtifacts(
-					containerArtifacts, parentActivity);
-
-			allObjects.addAll(containedWpDescList);
-			allObjects.addAll(containerWpDescList);
-		}
-
-		for (int i = 0; i < allObjects.size(); i++) {
-			WorkProductDescriptor wpObj = (WorkProductDescriptor) allObjects
-					.get(i);
-
-			List list = new ArrayList();
-			list.addAll(wpObj.getImpactedBy());
-			list.addAll(wpObj.getImpacts());
-			list.addAll(AssociationHelper.getResponsibleRoleDescriptors(wpObj));
-			list.addAll(wpObj.getDeliverableParts());
-
-			List inputList = new ArrayList();
-			inputList.addAll(AssociationHelper.getExternalInputTo(wpObj));
-			inputList.addAll(AssociationHelper.getMandatoryInputTo(wpObj));
-			inputList.addAll(AssociationHelper.getOptionalInputTo(wpObj));
-
-			List outputList = AssociationHelper.getOutputFrom(wpObj);
-			if (removeRelation)
-			{
-				switch (featureID) {
-				case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-				case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-					if (outputList.containsAll(descriptors))
-						return true;
-					break;
-				case UmaPackage.TASK_DESCRIPTOR__OUTPUT :				
-					if (inputList.containsAll(descriptors))
-						return true;
-				}
-			}
-
-			list.addAll(inputList);
-			list.addAll(outputList);
-			
-			for (Iterator refItor = list.iterator(); refItor.hasNext();) {
-				Object refItorObject = (Object) refItor.next();
-				if ((refItorObject instanceof Descriptor)
-						&& !descriptors.contains(refItorObject)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	
-	/**
-	 * Return list of corresponding work product descriptors for artifacts
-	 * @param artifacts
-	 * @param parentActivity
-	 * @return
-	 */
-	public static List getWpDescForArtifacts(List artifacts,
-			Activity parentActivity) {
-		List wpDescList = new ArrayList();
-		for (int i = 0; i < artifacts.size(); i++) {
-			Artifact artifact = (Artifact) artifacts.get(i);
-			if (parentActivity != null) {
-				List brElements = parentActivity.getBreakdownElements();
-
-				for (Iterator itor = brElements.iterator(); itor.hasNext();) {
-					Object brObj = (Object) itor.next();
-					if (brObj instanceof WorkProductDescriptor) {
-						WorkProductDescriptor wpDesc = (WorkProductDescriptor) brObj;
-						if (wpDesc.getWorkProduct() instanceof Artifact) {
-							if (wpDesc.getWorkProduct().equals(artifact))
-								wpDescList.add(wpDesc);
-						}
-					}
-				}
-			}
-		}
-		return wpDescList;
-	}
-
-	public static CompositeRole createCompositeRole(CompositeRole obj) {
-		CompositeRole compRole = UmaFactory.eINSTANCE.createCompositeRole();
-		compRole.getAggregatedRoles().addAll(obj.getAggregatedRoles());
-
-		String presentationName = obj.getPresentationName();
-		compRole.setName(obj.getName());
-		compRole.setPresentationName(StrUtil.isBlank(presentationName) ? obj
-				.getName() : presentationName);
-		return compRole;
-	}
-
-	public static void addTaskToActivity(Task task, Activity act) {
-		WBSDropCommand cmd = new WBSDropCommand(act, Collections
-				.singletonList(task));
-		BSDropCommand.IExecutor executor = cmd.getExecutor();
-		if (executor.preExecute()) {
-			executor.doExcecute();
-		}
-	}
-
-	public static boolean hasProcessNotOfType(ProcessPackage pkg,
-			EClass processType) {
-		if (pkg instanceof ProcessComponent) {
-			Process proc = ((ProcessComponent) pkg).getProcess();
-			if (proc != null && !processType.isInstance(proc)) {
-				return true;
-			}
-		}
-		for (Iterator iterator = pkg.getChildPackages().iterator(); iterator
-				.hasNext();) {
-			Object childPkg = iterator.next();
-			if (childPkg instanceof ProcessComponent) {
-				Process proc = ((ProcessComponent) childPkg).getProcess();
-				if (proc != null && !processType.isInstance(proc)) {
-					return true;
-				}
-			} else if (childPkg instanceof ProcessPackage) {
-				if (hasProcessNotOfType((ProcessPackage) childPkg, processType)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Find correspoding roleDescriptor in team since we maintain two role
-	 * descriptor for the same role
-	 * 
-	 * @param team
-	 * @param roleDesc
-	 * @return
-	 */
-	public static Object findRoleDescriptor(TeamProfile team,
-			RoleDescriptor roleDesc) {
-		List teamRoles = team.getTeamRoles();
-
-		for (Iterator itor = teamRoles.iterator(); itor.hasNext();) {
-			Object itorObject = itor.next();
-			if (roleDesc instanceof CompositeRole) {
-				if (itorObject instanceof CompositeRole) {
-					List firstObjectAggRoles = ((CompositeRole) roleDesc)
-							.getAggregatedRoles();
-					List secondObjectAggRoles = ((CompositeRole) itorObject)
-							.getAggregatedRoles();
-					if (firstObjectAggRoles.equals(secondObjectAggRoles)) {
-						return itorObject;
-					}
-				}
-			} else if (roleDesc instanceof RoleDescriptor) {
-				if ((itorObject instanceof RoleDescriptor)
-						&& (!(itorObject instanceof CompositeRole))) {
-					Object objRole = ((RoleDescriptor) roleDesc).getRole();
-					Object itorObjRole = ((RoleDescriptor) itorObject)
-							.getRole();
-					if (objRole.equals(itorObjRole)) {
-						return itorObject;
-					}
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Creates a columnIndexToNameMap from the comma-separated list of column
-	 * names
-	 * 
-	 * @param newValue
-	 * @return
-	 */
-	public static Map toColumnIndexToNameMap(String colNames) {
-		Map columnIndexToNameMap = new HashMap();
-		StringTokenizer tokens = new StringTokenizer(colNames, ","); //$NON-NLS-1$
-		int id = 0;
-		while (tokens.hasMoreTokens()) {
-			String token = tokens.nextToken();
-			columnIndexToNameMap.put(new Integer(id), getColumnID(token));
-			id++;
-		}
-		return columnIndexToNameMap;
-	}
-
-	/**
-	 * @param token
-	 * @return
-	 */
-	private static String getColumnID(String colName) {
-		for (int i = 0; i < IBSItemProvider.COLUMNS.length; i++) {
-			String col = IBSItemProvider.COLUMNS[i];
-			if (col.equals(colName)) {
-				return col;
-			}
-		}
-		return null;
-	}
-
-	// This method is used to check whether an new descriptor can be created for a given method element
-	// under the given activity, considering all inherited descriptors of the activity.
-	// It is NOT EFFICIENT to collect all linked elements of the inherited descriptors into a list and then check if
-	// whether the given method element is in the list.
-	//
-	// Use ProcessCommandUtil#getValidDescriptor(Object obj, Activity activity) instead
-	//
-//	public static List getVariabilityElement(Object owner) {
-//		List baseElements = new ArrayList();
-//		if (owner instanceof Activity) {
-//			Activity activity = (Activity) owner;
-//			while (!activity.getVariabilityType().equals(
-//					VariabilityType.NA_LITERAL)) {
-//				VariabilityElement element = activity
-//						.getVariabilityBasedOnElement();
-//
-//				if ((element != null) && (element instanceof Activity)) {
-//					Activity baseActivity = (Activity) element;
-//
-//					List breakdownElements = baseActivity
-//							.getBreakdownElements();
-//					for (Iterator itor = breakdownElements.iterator(); itor
-//							.hasNext();) {
-//						Object object = itor.next();
-//						if (object instanceof Descriptor) {
-//							Object baseObj = getAssociatedElement((Descriptor) object);
-//							if (baseObj != null) {
-//								baseElements.add(baseObj);
-//							}
-//						}
-//					}
-//
-//					activity = baseActivity;
-//				}
-//				else {
-//					break;
-//				}
-//			}
-//		}
-//
-//		return baseElements;
-//	}
-
-	/**
-	 * Refreshes predecessor list of all item providers of the given process
-	 * 
-	 * @param factory
-	 * @param proc
-	 * @param elements
-	 */
-	public static void removePredecessors(AdapterFactory factory, Process proc,
-			List removedElements) {
-		HashSet elements = new HashSet(removedElements);
-		for (Iterator iter = new AdapterFactoryTreeIterator(factory, proc); iter
-				.hasNext();) {
-			Object obj = iter.next();
-			IBSItemProvider itemProvider = (IBSItemProvider) factory.adapt(obj,
-					ITreeItemContentProvider.class);
-			if (itemProvider != null
-					&& TngUtil.unwrap(obj) instanceof WorkBreakdownElement) {
-				for (Iterator iterator = itemProvider.getPredecessors()
-						.iterator(); iterator.hasNext();) {
-					Object e = TngUtil.unwrap(iterator.next());
-					if (e instanceof ItemProviderAdapter) {
-						e = ((ItemProviderAdapter) e).getTarget();
-					}
-					if (elements.contains(e)) {
-						iterator.remove();
-					}
-				}
-			}
-		}
-
-	}
-
-	private static void addToActivity(Activity act, BreakdownElement be, Object[] prevAndNext) {
-		Object next = prevAndNext[1];
-		boolean added = false;
-		if(next != null) {
-			int id = act.getBreakdownElements().indexOf(next);
-			if(id != -1) { 
-				act.getBreakdownElements().add(id, be);
-				added = true;
-			}
-		}
-		if(!added) {
-			Object prev = prevAndNext[0];
-			if(prev != null) {				
-				int id = act.getBreakdownElements().indexOf(prev);
-				if(id != -1) {
-					act.getBreakdownElements().add(id + 1, be);
-				}
-				else {
-					act.getBreakdownElements().add(be);
-				}
-			}
-			else {
-				act.getBreakdownElements().add(be);
-			}
-		}
-
-	}
-	
-	/**
-	 * Locally contributes to the inherited activity represented by the given adapter
-	 * 
-	 * @param adapter
-	 * @param createdActivities
-	 * @return
-	 */
-	public static Activity contributeToActivity(
-			BreakdownElementWrapperItemProvider adapter, List createdActivities) {
-		Object parent = adapter.getParent(null);
-		Object[] prevAndNext = ProcessUtil
-				.getPreviousAndNext(adapter);
-		if (parent instanceof BreakdownElementWrapperItemProvider) {
-			parent = contributeToActivity(
-					(BreakdownElementWrapperItemProvider) parent,
-					createdActivities);
-		}
-		Activity act = ProcessUtil.generialize(adapter,
-				VariabilityType.LOCAL_CONTRIBUTION_LITERAL, prevAndNext);
-		Activity parentAct = ((Activity) parent);
-		addToActivity(parentAct, act, prevAndNext);
-		createdActivities.add(act);
-		return act;
-	}
-
-	/**
-	 * Locally replaces the inherited activity represented by the given adapter
-	 * 
-	 * @param adapter
-	 * @param createdActivities
-	 */
-	public static void replaceActivityLocally(
-			BreakdownElementWrapperItemProvider adapter, List createdActivities) {
-		Object parent = adapter.getParent(null);
-		Object[] prevAndNext = ProcessUtil
-				.getPreviousAndNext(adapter);
-		if (parent instanceof BreakdownElementWrapperItemProvider) {
-			parent = contributeToActivity(
-					(BreakdownElementWrapperItemProvider) parent,
-					createdActivities);
-		}
-		Activity act = ProcessUtil.generialize(adapter,
-				VariabilityType.LOCAL_REPLACEMENT_LITERAL, prevAndNext);
-		Activity parentAct = ((Activity) parent);
-		addToActivity(parentAct, act, prevAndNext);
-		createdActivities.add(act);
-	}
-
-	static Object[] getPreviousAndNext(
-			BreakdownElementWrapperItemProvider adapter) {
-		Object parent = adapter.getParent(null);
-		AdapterFactory adapterFactory = TngUtil.getBestAdapterFactory(adapter
-				.getAdapterFactory());
-		ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(parent, ITreeItemContentProvider.class);
-		List children = (List) itemProvider.getChildren(parent);
-		int id = children.indexOf(adapter) + 1;
-		Object next = null;
-		if (id < children.size()) {
-			next = children.get(id);
-		}
-		Object prev = null;
-		id -= 2;
-		if (id > -1) {
-			prev = children.get(id);
-		}
-
-		Object[] prevAndNext = { prev, next };
-		return prevAndNext;
-	}
-
-	static Activity generialize(BreakdownElementWrapperItemProvider adapter,
-			VariabilityType type, Object[] prevAndNext) {
-		AdapterFactory adapterFactory = TngUtil.getBestAdapterFactory(adapter
-				.getAdapterFactory());
-
-		Activity act = generalize((Activity) TngUtil.unwrap(adapter), type);
-		Object next = prevAndNext[1];
-		if(next != null) {
-			act.setPresentedAfter((BreakdownElement) TngUtil.unwrap(next));
-			if(next instanceof BreakdownElement) {
-				((BreakdownElement)next).setPresentedBefore(act);
-			}
-		}
-		Object prev = prevAndNext[0];
-		if(prev != null) {
-			act.setPresentedBefore((BreakdownElement) TngUtil.unwrap(prev));
-			if (prev instanceof BreakdownElement) {
-				((BreakdownElement)prev).setPresentedAfter(act);
-			}
-		}
-		IBSItemProvider bsItemProvider = (IBSItemProvider) adapterFactory
-				.adapt(act, ITreeItemContentProvider.class);
-		bsItemProvider.setExpanded(adapter.isExpanded());
-		return act;
-	}
-
-	/**
-	 * Gets the immediate base process of the given
-	 * BreakdownElementWrapperItemProvider that represents an inherited
-	 * breakdown element.
-	 * 
-	 * @param itemProvider
-	 * @return
-	 */
-	public static Process getImmediateBaseProcess(
-			BreakdownElementWrapperItemProvider itemProvider) {
-		Activity inheritor = getInheritor(itemProvider);
-		if (inheritor != null) {
-			return TngUtil.getOwningProcess((BreakdownElement) inheritor
-					.getVariabilityBasedOnElement());
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the activity in the process of the given item provider that inherits
-	 * the element represented by the given item provider
-	 * 
-	 * @param itemProvider
-	 * @return
-	 */
-	public static Activity getInheritor(
-			BreakdownElementWrapperItemProvider itemProvider) {
-		if (itemProvider.isReadOnly()) {
-			// this represents an inherited breakdown element
-			//
-			for (Object parent = itemProvider.getParent(itemProvider); parent != null;) {
-				if (parent instanceof BreakdownElementWrapperItemProvider) {
-					parent = ((BreakdownElementWrapperItemProvider) parent)
-							.getParent(parent);
-				} else {
-					return (Activity) parent;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets parent list of <code>wrapper</code> from <code>from</code>,
-	 * excluded <code>from</code>
-	 * 
-	 * @param from
-	 * @param wrapper
-	 * @return list of unwrapped parent objects
-	 */
-	public static List getParentList(Object from,
-			BreakdownElementWrapperItemProvider wrapper) {
-		return getParentList(wrapper, from, wrapper.getAdapterFactory());
-	}
-	
-	/**
-	 * Gets the list of GUIDs from the top element to the wrapper inclusive.
-	 * 
-	 * @param wrapper
-	 * @return
-	 */
-	public static LinkedList<String> getGuidList(BreakdownElementWrapperItemProvider wrapper) {
-		LinkedList<String> guidList = new LinkedList<String>();
-		List parentList = ProcessUtil.getParentList(null, wrapper);
-		if (!parentList.isEmpty()) {
-			for (Iterator iter = parentList.iterator(); iter.hasNext();) {
-				MethodElement e = (MethodElement) iter.next();
-				// exclude TaskDescriptor and RoleDescriptor from the parent
-				// path b/c those descriptors can be
-				// parent only in CBS view
-				if (!(e instanceof TaskDescriptor || e instanceof RoleDescriptor)) {
-					guidList.add(e.getGuid());
-				}
-			}
-		}
-		MethodElement e = (MethodElement) TngUtil.unwrap(wrapper);
-		guidList.add(e.getGuid());
-		return guidList;
-	}
-	
-	/**
-	 * Gets the list of GUIDs from start to activity, excluded start activity.
-	 * @param from
-	 * @param activity
-	 * @return
-	 */
-	public static LinkedList<String> getGuidList(Activity start, Activity activity) {
-		LinkedList<String> guidList = new LinkedList<String>();
-		for(Activity parent = activity; parent != null && (start == null || parent != start); parent = parent.getSuperActivities()) {
-			guidList.addFirst(parent.getGuid());
-		}
-		return guidList;
-	}
-	
-	public static List<String> getGuidList(Object activityOrWrapper) {
-		if(activityOrWrapper instanceof BreakdownElementWrapperItemProvider) {
-			return getGuidList((BreakdownElementWrapperItemProvider)activityOrWrapper);
-		}
-		else if(activityOrWrapper instanceof Activity) {
-			return getGuidList(null, (Activity) activityOrWrapper);
-		}
-		return null;
-	}
-	
-	public static String toGuidPath(List<String> guidList) {
-		StringBuffer path = new StringBuffer();
-		for (String guid : guidList) {
-			path.append('/').append(guid);
-		}
-		return path.toString();
-	}
-	
-	/**
-	 * Gets parent list of <code>object</code> from <code>from</code>,
-	 * excluded <code>from</code>
-	 * 
-	 * @param object
-	 * @param from
-	 * @param adapterFactory
-	 * @return list of unwrapped parent objects
-	 */
-	public static List getParentList(Object object, Object from, AdapterFactory adapterFactory) {
-		ArrayList parentList = new ArrayList();
-		ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory.adapt(object, ITreeItemContentProvider.class);
-		for (Object parent = itemProvider.getParent(object); parent != from
-				&& parent != null;) {
-			Object obj = TngUtil.unwrap(parent);
-			MethodElement e;			
-			if (obj instanceof MethodElement) {
-				e = (MethodElement) obj;
-				ITreeItemContentProvider adapter;
-				if (parent instanceof ITreeItemContentProvider) {
-					adapter = (ITreeItemContentProvider) parent;
-				} else {
-					adapter = (ITreeItemContentProvider) adapterFactory.adapt(
-							parent, ITreeItemContentProvider.class);
-				}
-				if(ProcessUtil.isTopProcess(e)) {
-					parent = null;
-				}
-				else {
-					parent = adapter.getParent(parent);
-				}
-			} else {
-				// must be a ItemProviderAdapter
-				//
-				ItemProviderAdapter adapter = ((ItemProviderAdapter) obj);
-				e = (MethodElement) adapter.getTarget();
-				parent = adapter.getParent(parent);
-			}
-			parentList.add(0, e);
-		}
-		return parentList;
-	}
-
-	/**
-	 * Gets the wrappers of all breakdown structure (BS) views in the following
-	 * order: WBS, TBS, WPBS
-	 * 
-	 * @param wrapper
-	 *            the wrapper of a BS view
-	 * @return
-	 */
-	public static List getWrappers(BreakdownElementWrapperItemProvider wrapper, AdapterFactory[] adapterFactories) {
-		ArrayList rolledUpItemProviders = new ArrayList();
-		try {
-			AdapterFactory rootAdapterFactory = TngUtil.getBestAdapterFactory(wrapper.getAdapterFactory());
-			Object proc = wrapper.getTopItem();						
-			ArrayList objects = new ArrayList(ProcessUtil.getParentList(proc,
-					wrapper));
-			ArrayList wrappers = new ArrayList();
-			for (int i = 0; i < adapterFactories.length; i++) {
-				AdapterFactory adapterFactory = adapterFactories[i];
-				if (adapterFactory == rootAdapterFactory) {
-					wrappers.add(wrapper);
-					continue;
-				}
-				Object e = TngUtil.unwrap(wrapper);
-				objects.add(e);
-				Object object = proc;
-				for (Iterator iter1 = objects.iterator(); iter1.hasNext();) {
-					Object element = iter1.next();
-					ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-					.adapt(object, ITreeItemContentProvider.class);
-					
-					// make sure the activity is rolled down before looking into its children
-					//
-					Object be = TngUtil.unwrap(object);								
-					if(be instanceof Activity) {
-						if(adapter instanceof BSActivityItemProvider) {
-							BSActivityItemProvider itemProvider = (BSActivityItemProvider) adapter;
-							if(itemProvider.isRolledUp()) {
-								itemProvider.basicSetRolledUp(false);
-								rolledUpItemProviders.add(itemProvider);
-							}
-						}
-						else if(adapter instanceof IBSItemProvider) {
-							IBSItemProvider itemProvider = (IBSItemProvider) adapter;
-							if(itemProvider.isRolledUp()) {
-								itemProvider.setRolledUp(false);
-								rolledUpItemProviders.add(itemProvider);
-							}
-						}
-					}
-					
-					find_child: for (Iterator iterator = adapter
-							.getChildren(object).iterator(); iterator.hasNext();) {
-						Object child = iterator.next();
-						if (element == TngUtil.unwrap(child)) {
-							object = child;
-							break find_child;
-						}
-					}
-				}
-				if (object instanceof BreakdownElementWrapperItemProvider) {
-					wrappers.add(object);
-				} else {
-					throw new RuntimeException(
-							"Could not find wrapper for " + e + " using adapter factory " + adapterFactory); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			return wrappers;
-		}
-		finally {
-			if(!rolledUpItemProviders.isEmpty()) {
-				// restore the rolledUp flag
-				//
-				for (Iterator iter = rolledUpItemProviders.iterator(); iter
-				.hasNext();) {
-					((BSActivityItemProvider) iter.next()).basicSetRolledUp(true);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Gets WorkProductDescriptor specific model info 
-	 * @param modelInfo
-	 * @param object WorkProductDescriptor or its wrapper
-	 * @param itemProvider item provider of WorkProductDescriptor or its wrapper
-	 */
-	public static void getWPDModelInfo(StringBuffer modelInfo, Object object, Object itemProvider) {
-		Object element = TngUtil.unwrap(object);
-		if(element instanceof WorkProductDescriptor) {	
-			WorkProductDescriptor wpd = (WorkProductDescriptor)element;
-			if(itemProvider instanceof ITreeItemContentProvider) {
-				// check if this work product descriptor is shown under a task descriptor or role descriptor
-				//
-				AdapterFactory adapterFactory = null;
-				if(itemProvider instanceof ItemProviderAdapter) {
-					adapterFactory = ((ItemProviderAdapter)itemProvider).getAdapterFactory();
-				}
-				else if(itemProvider instanceof BreakdownElementWrapperItemProvider) {
-					adapterFactory = ((BreakdownElementWrapperItemProvider)itemProvider).getAdapterFactory();
-				}
-				if(adapterFactory != null) {
-					Object parentDescriptor = null;
-					ITreeItemContentProvider adapter = (ITreeItemContentProvider)itemProvider;
-					findParentDescriptor:
-						for(Object parent = adapter.getParent(object); parent != null; parent = adapter.getParent(parent)) {
-							Object e = TngUtil.unwrap(parent);
-							if(e instanceof TaskDescriptor) {
-								parentDescriptor = e;
-								break findParentDescriptor;
-							}
-							else if(e instanceof Activity) {
-								break findParentDescriptor;
-							}
-							adapter = (ITreeItemContentProvider) adapterFactory.adapt(parent, ITreeItemContentProvider.class);
-						}
-					if(parentDescriptor != null) {	
-						// work product descriptor is shown under a task descriptor
-						// show only model info related to this task descriptor
-						//
-						ArrayList features = new ArrayList();
-						if(AssociationHelper.getMandatoryInputTo(wpd).contains(parentDescriptor)) {
-							features.add(UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput());
-						}
-						if(AssociationHelper.getOptionalInputTo(wpd).contains(parentDescriptor)) {
-							features.add(UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput());							
-						}
-						if(AssociationHelper.getOutputFrom(wpd).contains(parentDescriptor)) {
-							features.add(UmaPackage.eINSTANCE.getTaskDescriptor_Output());
-						}
-						if(!features.isEmpty()) {
-							if (modelInfo.toString().length() > 0) {
-								modelInfo.append(","); //$NON-NLS-1$
-							}
-							for (int i = 0; i < features.size(); i++) {
-								EStructuralFeature feature = (EStructuralFeature) features.get(i);
-								modelInfo.append(TngUtil.getFeatureText(feature));
-								if(i < features.size() -1){
-									modelInfo.append(","); //$NON-NLS-1$
-								}
-							}						
-						}
-						return;
-					}
-				}
-			}
-			getModelInfoForWorkProductDescriptor(modelInfo, wpd);
-		}
-	}
-
-	/**
-	 * Retrieves the ModelInformation specific to WorkProductDescriptor. Model
-	 * Information is for PBS (WorkProductDescriptors, including Extended
-	 * Activity's WorkProductDescriptors).
-	 */
-	private static void getModelInfoForWorkProductDescriptor(
-			StringBuffer modelInfo, WorkProductDescriptor object) {
-		String comma = ","; //$NON-NLS-1$
-		if (!AssociationHelper.getMandatoryInputTo(object).isEmpty()) {
-			if (modelInfo.toString().length() > 0) {
-				modelInfo.append(comma);
-			}
-			modelInfo.append(UmaEditPlugin.INSTANCE
-					.getString("_UI_TaskDescriptor_mandatoryInput_feature")); //$NON-NLS-1$
-		}
-		if (!AssociationHelper.getOptionalInputTo(object).isEmpty()) {
-			if (modelInfo.toString().length() > 0) {
-				modelInfo.append(comma);
-			}
-			modelInfo.append(UmaEditPlugin.INSTANCE
-					.getString("_UI_TaskDescriptor_optionalInput_feature")); //$NON-NLS-1$
-		}
-		if (!AssociationHelper.getOutputFrom(object).isEmpty()) {
-			if (modelInfo.toString().length() > 0) {
-				modelInfo.append(comma);
-			}
-			modelInfo.append(UmaEditPlugin.INSTANCE
-					.getString("_UI_TaskDescriptor_output_feature")); //$NON-NLS-1$
-		}
-	}
-
-	public static Collection getDuplicateDescriptorsAfterReveal(Collection elementsToReveal) {
-		Collection duplicates = new ArrayList();
-		for (Iterator iter = elementsToReveal.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if(element instanceof Descriptor) {
-				Descriptor desc = (Descriptor) element;
-				MethodElement e = ProcessUtil.getAssociatedElement(desc);
-				if(e != null) {
-					Activity act = UmaUtil.getParentActivity(desc);
-					MethodConfiguration config = TngUtil.getOwningProcess(act).getDefaultContext();
-					e = (MethodElement) Providers.getConfigurationApplicator().resolve(e, config);
-					Object duplicate = ProcessCommandUtil.getDescriptor(e, act, config);
-					if(duplicate != null && !duplicates.contains(duplicate)) {					
-						duplicates.add(duplicate);
-					}
-				}
-			}
-		}
-		
-		return duplicates;
-	}
-	
-	public static Collection<Descriptor> getDuplicateDescriptorsAfterSuppress(Collection elementsToSuppress) {
-		Collection<Descriptor> duplicates = new ArrayList<Descriptor>();
-		for (Iterator iter = elementsToSuppress.iterator(); iter.hasNext();) {
-			Object item = iter.next();
-			if(item instanceof Descriptor) {
-				Descriptor desc = (Descriptor) item;
-				MethodElement e = ProcessUtil.getAssociatedElement(desc);
-				if(e != null) {
-					Activity act = UmaUtil.getParentActivity(desc);
-					for (Iterator iterator = act.getBreakdownElements().iterator(); iterator.hasNext();) {
-						BreakdownElement element = (BreakdownElement) iterator.next();
-						if(element != desc && element instanceof Descriptor && element.getSuppressed().booleanValue()) {
-							MethodElement linkedElement = ProcessUtil.getAssociatedElement((Descriptor) element);
-							if(linkedElement == e) {
-								duplicates.add((Descriptor) element);
-							}
-						}
-					}
-				}
-			}
-		}
-		
-		return duplicates;
-		
-	}
-
-	/**
-	 * Checks if the given object is representing a inherited element in a breakdown structure tree of process editor
-	 * 
-	 * @param object
-	 * @return
-	 */
-	public static boolean isInherited(Object object) {
-		return object instanceof DescribableElementWrapperItemProvider
-		&& ((DescribableElementWrapperItemProvider)object).isInherited();
-	}
-	
-	/**
-	 * Checks if the given activity has inherited any breakdown element via extension of local contribution
-	 * 
-	 * @param activity
-	 * @return
-	 */
-	public static boolean hasInherited(Activity activity) {
-		Iterator iter = new AbstractTreeIterator(activity) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 0L;
-
-			protected Iterator getChildren(Object object) {
-				if(object instanceof Activity) {
-					return ((Activity)object).getBreakdownElements().iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-			
-		};
-		while(iter.hasNext()) {
-			Object o = iter.next();
-			if(o instanceof Activity) {
-				Activity act = (Activity) o;
-				VariabilityElement ve = act.getVariabilityBasedOnElement();
-				if(ve != null) {
-					VariabilityType type = act.getVariabilityType();
-					if(type == VariabilityType.EXTENDS_LITERAL || type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-	
-	public static boolean isContributed(Object object) {
-		return object instanceof BreakdownElementWrapperItemProvider
-		&& ((BreakdownElementWrapperItemProvider)object).isContributed();
-	}	
-	
-	public static void getAllSubTeams(TeamProfile team, List teams) {
-		teams.add(team);
-		List subTeams = team.getSubTeam();
-		for (Iterator itor = subTeams.iterator(); itor.hasNext();) {
-			TeamProfile subTeam = (TeamProfile) itor.next();
-
-			getAllSubTeams(subTeam, teams);
-		}
-	}
-	
-	private static List getTeamProfiles(Object object, ITreeItemContentProvider adapter, AdapterFactory adapterFactory) {
-		RoleDescriptor roleDesc = (RoleDescriptor) TngUtil.unwrap(object);
-		List teams = new ArrayList(AssociationHelper.getTeamProfiles(roleDesc));
-		
-		// get all the team profiles that are in scope of the wrapper
-		//
-		HashSet visibleTeams = new HashSet();
-		for (Object parent = adapter.getParent(object); parent != null;) {
-			adapter = (ITreeItemContentProvider) adapterFactory.adapt(parent, ITreeItemContentProvider.class);		
-			for (Iterator iter = adapter.getChildren(parent).iterator(); iter.hasNext();) {
-				Object e = TngUtil.unwrap(iter.next());
-				if (e instanceof TeamProfile) {
-					List activityTeams = new ArrayList();
-					getAllSubTeams((TeamProfile) e, activityTeams);
-					for (Iterator itor = activityTeams.iterator(); itor.hasNext();)	{
-						Object o = itor.next();
-						if(o instanceof TeamProfile && ((TeamProfile)o).getTeamRoles().contains(roleDesc)) {
-							visibleTeams.add(o);
-						}
-					}
-				}
-			}
-			Object newParent = adapter.getParent(parent);
-			if(newParent == null && parent instanceof Activity) {
-				newParent = UmaUtil.getParentActivity((Activity)parent);
-			}
-			parent = newParent;
-		}
-		
-		// remove any team profile that is not in the scope of the wrapper
-		//
-		for (Iterator iter = teams.iterator(); iter.hasNext();) {
-			Object team = iter.next();
-			if(!visibleTeams.contains(team)) {
-				iter.remove();
-			}
-		}
-		
-		return teams;
-
-	}
-	
-	/**
-	 * Gets the list of visible team profiles for the role descriptor represented by the given wrapper
-	 * 
-	 * @param roleDescWrapper
-	 * @return
-	 */
-	public static List getTeamProfiles(RoleDescriptorWrapperItemProvider roleDescWrapper) {
-		return getTeamProfiles(roleDescWrapper, roleDescWrapper, roleDescWrapper.getAdapterFactory());
-	}
-	
-	public static List getTeamProfiles(RoleDescriptor roleDesc, AdapterFactory adapterFactory) {
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(roleDesc, ITreeItemContentProvider.class);
-		return getTeamProfiles(roleDesc, adapter, adapterFactory);
-	}
-	
-	/**
-	 * Return list of recursive child elements for the given activity and given type
-	 * @param act
-	 * @param type
-	 * @param collection
-	 */
-	public static void getChildElements(Activity act, Class type, Collection collection) {
-		for (int i = act.getBreakdownElements().size() - 1; i > -1; i--) {
-			Object element = act.getBreakdownElements().get(i);
-			if(type.isInstance(element)) {
-				collection.add(element);
-			}
-			if(element instanceof Activity) {
-				getChildElements((Activity) element, type, collection);
-			}
-		}
-	}
-	
-	public static IFilter getFilter(AdapterFactory adapterFactory) {
-		AdapterFactory rootAdapterFactory = TngUtil.getBestAdapterFactory(adapterFactory);
-		if(rootAdapterFactory instanceof ConfigurableComposedAdapterFactory) {
-			return ((ConfigurableComposedAdapterFactory)rootAdapterFactory).getFilter();
-		}
-		return null;
-	}
-	
-	/**
-	 * Gets the calculated list of artifact contained by the given artifact based on the
-	 * configuration associated with the given adapter factory.
-	 * 
-	 * @param artifact
-	 * @param adapterFactory
-	 * @return
-	 */
-	public static List getContainedArtifacts(Artifact artifact, AdapterFactory adapterFactory) {
-		MethodConfiguration config = null;
-		IFilter filter = ProcessUtil.getFilter(adapterFactory);
-		if(filter instanceof IConfigurator) {
-			config = ((IConfigurator)filter).getMethodConfiguration();
-		}
-		
-		if(config == null) {
-			return artifact.getContainedArtifacts();
-		}
-		else {
-			return (List) Providers.getConfigurationApplicator().getReference(
-					artifact,
-					UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts(),
-					config);
-		}		
-	}
-	
-	public static List getContainedArtifactsDescriptors(WorkProductDescriptor artifactDesc, List artifactDescriptors) {
-		if(artifactDescriptors.isEmpty()) {
-			return Collections.EMPTY_LIST;
-		}
-		Artifact artifact = (Artifact) artifactDesc.getWorkProduct();
-		
-		// collect own and contributing subartifact descriptors
-		//
-		ArrayList containedDescriptors = new ArrayList();
-		for(int i = artifactDescriptors.size() - 1; i > -1; i--) {
-			WorkProductDescriptor wpd = ((WorkProductDescriptor)artifactDescriptors.get(i));
-			WorkProduct a = wpd.getWorkProduct();
-			if(a != null) {
-				EObject container = a.eContainer();
-				if(container == artifact || 
-						(container instanceof Artifact && TngUtil.isContributorOf(artifact, (Artifact) container))) {
-					containedDescriptors.add(wpd);
-				}
-			}
-		}
-		return containedDescriptors;
-	}
-	
-//	public static boolean isContainedBy(Artifact parent, Artifact child, AdapterFactory adapterFactory) {
-//		MethodConfiguration config = null;
-//		IFilter filter = ProcessUtil.getFilter(adapterFactory);
-//		if(filter instanceof IConfigurator) {
-//			config = ((IConfigurator)filter).getMethodConfiguration();
-//		}
-//		
-//		if(config == null) {
-//			return UmaUtil.isContainedBy(child, parent);
-//		}
-//		
-//		final MethodConfiguration cfg = config;		
-//		Iterator iter = new AbstractTreeIterator(parent, false) {
-//
-//			/**
-//			 * Comment for <code>serialVersionUID</code>
-//			 */
-//			private static final long serialVersionUID = 1L;
-//
-//			protected Iterator getChildren(Object object) {
-//				return ((Collection) Providers.getConfigurationApplicator().getReference(
-//						(VariabilityElement) object,
-//						UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts(),
-//						cfg)).iterator();
-//			}
-//			
-//		};
-//		while(iter.hasNext()) {
-//			if(child == iter.next()) {
-//				return true;
-//			}
-//		}
-//		
-//		return false;
-//	}
-	
-	/**
-	 * Checks if the given WorkProductDescriptor <code>parent</code> can represent the parent of the WorkProductDescriptor
-	 * <code>child</code> based on the relationship of their linked artifact and the list of available artifact descriptors
-	 */
-	public static boolean isContainedBy(WorkProductDescriptor parent, WorkProductDescriptor child, final List artifactDescList) {
-//		Iterator iter = new AbstractTreeIterator(parent, false) {
-//			
-//			/**
-//			 * Comment for <code>serialVersionUID</code>
-//			 */
-//			private static final long serialVersionUID = 1L;
-//			
-//			protected Iterator getChildren(Object object) {
-//				return getContainedArtifactsDescriptors((WorkProductDescriptor) object, artifactDescList).iterator();
-//			}
-//			
-//		};
-//		while(iter.hasNext()) {
-//			if(child == iter.next()) {
-//				return true;
-//			}
-//		}
-//		
-//		return false;
-		
-		return UmaUtil.isContainedBy(child.getWorkProduct(), parent.getWorkProduct());
-	}
-
-	public static List removeSubartifactsFromChildren(final Collection children, boolean unwrap) {
-		List artifactList = new ArrayList();
-	
-		// get the artifact list
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if(unwrap) {
-				child = TngUtil.unwrap(child);
-			}
-			if (child instanceof WorkProductDescriptor) {
-				WorkProduct wp = ((WorkProductDescriptor) child)
-						.getWorkProduct();
-				if (wp instanceof Artifact) {
-					artifactList.add(wp);
-				}
-			}
-		}
-	
-		// process the artifact list to get the top-most ones
-		//
-		Set topMostArtifacts = new HashSet();
-		Artifact candidate = null;
-	
-		boolean found = false;
-		while (!artifactList.isEmpty()) {
-			
-			if (!found)
-			{
-				candidate = (Artifact) artifactList.get(0);
-				artifactList.remove(0);
-			}
-			for (Iterator iter = artifactList.iterator(); iter.hasNext();) {
-				Artifact artifact = (Artifact) iter.next();
-				found = false;
-				// if(candidate.getContainedArtifacts().contains(artifact)) {
-				if (UmaUtil.isContainedBy(artifact, candidate)) {
-					iter.remove();
-				}
-				else if (UmaUtil.isContainedBy(candidate, artifact)) {
-					iter.remove();
-					candidate = artifact;
-					found = true;
-					break;
-				}
-			}
-			if (!found || artifactList.isEmpty())
-				topMostArtifacts.add(candidate);
-			else if (artifactList.isEmpty())
-					topMostArtifacts.add(candidate);		
-		}
-	
-		List result = new ArrayList();
-		for (Iterator ci = children.iterator(); ci.hasNext();) {
-			Object child = ci.next();
-			Object e = unwrap ? TngUtil.unwrap(child) : child;
-			boolean selected = false;
-			if (e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpd = ((WorkProductDescriptor) e);
-				WorkProduct wp = wpd.getWorkProduct();
-				if (!(wp instanceof Artifact)) {
-					selected = true;
-				} else if (topMostArtifacts.contains(wp)) {
-					selected = true;
-				}
-			} else {
-				selected = true;
-			}
-			if (selected) {
-				result.add(child);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * This method helps build the artifact descriptor tree correctly
-	 * 
-	 * @param children
-	 * @param unwrap
-	 * @param adapterFactory
-	 * @return
-	 */
-	public static List removeSubartifactsFromChildren(final Collection children, boolean unwrap, AdapterFactory adapterFactory) {
-		List artifactDescList = new ArrayList();
-
-		// get the artifact list
-		//
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if(unwrap) {
-				child = TngUtil.unwrap(child);
-			}
-			if (child instanceof WorkProductDescriptor) {
-				WorkProduct wp = ((WorkProductDescriptor) child)
-						.getWorkProduct();
-				if (wp instanceof Artifact) {
-					artifactDescList.add(child);
-				}
-			}
-		}
-
-		if(artifactDescList.isEmpty()) {
-			if(children instanceof List) {
-				return (List) children;
-			}
-			else {
-				return new ArrayList(children);
-			}
-		}
-		
-		// process the artifact list to get the top-most ones
-		//
-		Set topMostArtifactDescList = new HashSet();
-		List artifactDescriptors = new ArrayList(artifactDescList);
-		WorkProductDescriptor candidate = null;
-		boolean found = false;
-		while (!artifactDescList.isEmpty()) {
-			
-			if (!found)
-			{
-				candidate = (WorkProductDescriptor) artifactDescList.get(0);
-				artifactDescList.remove(0);
-			}
-			for (Iterator iter = artifactDescList.iterator(); iter.hasNext();) {
-				WorkProductDescriptor artifactDesc = (WorkProductDescriptor) iter.next();
-				found = false;
-				if (ProcessUtil.isContainedBy(candidate, artifactDesc, artifactDescriptors)) {
-					iter.remove();
-				}
-				else if (ProcessUtil.isContainedBy(artifactDesc, candidate, artifactDescriptors)) {
-					iter.remove();
-					candidate = artifactDesc;
-
-					found = true;
-					break;
-				}
-			}
-			if (!found || artifactDescList.isEmpty())
-				topMostArtifactDescList.add(candidate);
-			else if (artifactDescList.isEmpty())
-					topMostArtifactDescList.add(candidate);		
-		}
-
-		List result = new ArrayList();
-		for (Iterator ci = children.iterator(); ci.hasNext();) {
-			Object child = ci.next();
-			Object e = unwrap ? TngUtil.unwrap(child) : child;
-			boolean selected = false;
-			if (e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpd = ((WorkProductDescriptor) e);
-				WorkProduct wp = wpd.getWorkProduct();
-				if (!(wp instanceof Artifact)) {
-					selected = true;
-				} else if (topMostArtifactDescList.contains(wpd)) {
-					selected = true;
-				}
-			} else {
-				selected = true;
-			}
-			if (selected) {
-				result.add(child);
-			}
-		}
-		return result;
-	}
-
-	public static Activity findActivity(ProcessPackage procPackage) {
-		if(procPackage instanceof ProcessComponent) {
-			return ((ProcessComponent)procPackage).getProcess();
-		}
-		for (Iterator iterator = procPackage
-				.getProcessElements().iterator(); iterator
-				.hasNext();) {
-			Object element = iterator.next();
-			if (element instanceof Activity) {
-				return ((Activity) element);
-			}
-		}
-		return null;
-	}	
-	
-	public static void fixBreakdonwElementOrderRecursively(Activity act) {
-		Iterator iter = new AbstractTreeIterator(act) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 3368261685663354478L;
-
-			protected Iterator getChildren(Object object) {
-				ArrayList activities = new ArrayList();
-				for (Iterator iterator = ((Activity)object).getBreakdownElements().iterator(); iterator
-						.hasNext();) {
-					Object element = iterator.next();
-					if(element instanceof Activity) {
-						activities.add(element);
-					}
-				}
-				return activities.iterator();
-			}
-			
-		};
-		while(iter.hasNext()) {
-			fixBreakdownElementOrder((Activity)iter.next());
-		}
-	}
-
-	/**
-	 * @param activity
-	 */
-	public static void fixBreakdownElementOrder(Activity activity) {
-		EList list = (EList) activity.getBreakdownElements();
-		for (Iterator iter = new ArrayList(list).iterator(); iter.hasNext();) {
-			BreakdownElement e = (BreakdownElement) iter.next();
-			BreakdownElement succ = e.getPresentedAfter();
-			if(succ != null && succ != e) {
-				int succId = list.indexOf(succ);
-				if(succId != -1) {
-					int id = list.indexOf(e);
-					if(id != succId - 1) {
-						if(id < succId) {
-							list.move(succId - 1, id);
-						}
-						else {
-							list.move(id, succId);
-						}
-					}
-					e.setPresentedAfter(null);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Initializes item provider path of the given activity, the path from top process to the activity
-	 * 
-	 * @param activity
-	 * @param adapterFactory
-	 */
-	public static void initializeItemProviderPath(Activity activity, AdapterFactory adapterFactory) {
-		ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(activity, ITreeItemContentProvider.class);
-		IBSItemProvider bsIp = (IBSItemProvider) ip;
-		Object top = bsIp.getTopItem();
-		if(!(top instanceof Process) || !(((EObject)top).eContainer() instanceof ProcessComponent)) {
-			// item provider tree of the owner's process is not initialized yet
-			// initialize it.
-
-			// get the activity path
-			//
-			ArrayList actPath = new ArrayList();
-			for(activity = activity.getSuperActivities(); activity != null; activity = activity.getSuperActivities()) {
-				actPath.add(0, activity);
-			}
-			for (Iterator iter = actPath.iterator(); iter.hasNext();) {
-				Object act = iter.next();
-				ip = (ITreeItemContentProvider) adapterFactory.adapt(act, ITreeItemContentProvider.class);
-				ip.getChildren(act);
-			}
-		}
-	}		
-
-	/**
-	 * Check if the given activity or any of its subactivities is a contributor or replacer
-	 * 
-	 * @param activity
-	 * @return
-	 */
-	public static boolean hasContributorOrReplacer(Activity activity) {
-		Iterator iter = new AbstractTreeIterator(activity) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 0L;
-
-			protected Iterator getChildren(Object object) {
-				if(object instanceof Activity) {
-					ArrayList children = new ArrayList();
-					for (Iterator iterator = ((Activity)object).getBreakdownElements().iterator(); iterator
-							.hasNext();) {
-						Object element = iterator.next();
-						if(element instanceof VariabilityElement) {
-							children.add(element);
-						}
-					}
-					return children.iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-			
-		};
-		
-		while(iter.hasNext()) {
-			VariabilityElement ve = (VariabilityElement) iter.next();
-			VariabilityElement base = ve.getVariabilityBasedOnElement();
-			VariabilityType vType = ve.getVariabilityType();
-			if(base != null && (vType == VariabilityType.CONTRIBUTES_LITERAL || vType == VariabilityType.REPLACES_LITERAL)) {
-//				Process proc = TngUtil.getOwningProcess((BreakdownElement) base);
-//				if(proc != process) {
-//					return true;
-//				}
-				
-				return true;
-			}
-		}
-		
-		return false;
-	}	
-	
-	/**
-	 * @param target
-	 * @return
-	 */
-	public static boolean isTopProcess(Object target) {
-		return target instanceof Process && ((Process)target).eContainer() instanceof ProcessComponent;
-	}
-
-	/**
-	 * @param wpDescList
-	 * @return
-	 */
-	public static WorkProductDescriptor getWorkProductDescriptor(Collection elements, WorkProduct wp) {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object e = (Object) iter.next();
-			if(e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpd = ((WorkProductDescriptor)e);
-				if(wpd.getWorkProduct() == wp) {
-					return wpd;
-				}
-
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param taskDescList
-	 * @param task
-	 * @return
-	 */
-	public static TaskDescriptor getTaskDescriptor(Collection elements, Task task) {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object e = (Object) iter.next();
-			if(e instanceof TaskDescriptor) {
-				TaskDescriptor td = (TaskDescriptor) e;
-				if(td.getTask() == task) {
-					return td;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the owning work breakdown element of a work order.
-	 * 
-	 * @param workOrder
-	 *            a work order
-	 * @return a work breakdown element that owns the work order or
-	 *         <code>null</code>
-	 */
-	public static WorkBreakdownElement getOwner(WorkOrder workOrder) {
-		return AssociationHelper.getSuccessor(workOrder);
-	}
-
-	public static ComposedBreakdownElementWrapperItemProvider getComposedWrapper(Object object) {
-		while(!(object instanceof ComposedBreakdownElementWrapperItemProvider)
-				&& object instanceof IWrapperItemProvider) {
-			object = ((IWrapperItemProvider)object).getValue();
-		}
-		if(object instanceof ComposedBreakdownElementWrapperItemProvider) {
-			return (ComposedBreakdownElementWrapperItemProvider) object;
-		}
-		return null;
-	}
-	
-	/**
-	 * Gets the display name for the given breakdown structure column ID. The
-	 * breakdown structure column IDs are defined as constants in
-	 * {@link IBSItemProvider} that start with COL_
-	 * 
-	 * @param columnName
-	 *            one of the columns ID constants (COL_XXX) defined in
-	 *            {@link IBSItemProvider}
-	 * @return
-	 */
-	public static final String getColumnDisplayName(String columnId) {
-		try {
-			return LibraryEditPlugin.INSTANCE.getString("BS_Column_" + columnId); //$NON-NLS-1$ 
-		} catch (MissingResourceException e) {
-		}
-		return columnId;
-	}
-	
-	
-	/**
-	 * Get list of task descriptors under selected activities
-	 * @param selection
-	 * @return
-	 */
-	public static List getTaskDescriptors(List selection) {
-		List taskDescriptors = new ArrayList();
-		ExposedAdapterFactory adapterFactory = (ExposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		for (Iterator itor = selection.iterator(); itor.hasNext();) {
-			Object itorObj = itor.next();
-			if (itorObj instanceof Activity
-					|| itorObj instanceof ActivityWrapperItemProvider) {
-				getTaskDescriptors(adapterFactory, itorObj, taskDescriptors);
-			}
-			if (itorObj instanceof TaskDescriptor
-					|| itorObj instanceof TaskDescriptorWrapperItemProvider) {
-				if (!taskDescriptors.contains(itorObj))
-					taskDescriptors.add(itorObj);
-			}
-		}
-		return taskDescriptors;
-	}
-	
-	
-	private static void getTaskDescriptors(AdapterFactory adapterFactory, Object act,
-			List taskDescriptors) {
-		Object list = null;
-		if (act instanceof Activity) {
-			ItemProviderAdapter adapter = (ItemProviderAdapter) adapterFactory
-					.adapt(act, ITreeItemContentProvider.class);
-			// get children
-			list = adapter.getChildren(act);
-		} else if (act instanceof ActivityWrapperItemProvider) {
-			list = ((WrapperItemProvider) act).getChildren(act);
-		}
-		if (list != null && list instanceof List) {
-			List children = (List) list;
-			for (Iterator childIter = children.iterator(); childIter.hasNext();) {
-				Object obj = childIter.next();
-				if (obj instanceof Activity || obj instanceof ActivityWrapperItemProvider) {
-					getTaskDescriptors(adapterFactory, obj, taskDescriptors);
-				}
-				
-				if (obj instanceof TaskDescriptor
-						|| obj instanceof TaskDescriptorWrapperItemProvider) {
-					if (!taskDescriptors.contains(obj))
-						taskDescriptors.add(obj);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Checks if the given object is a descriptor or its wrapper of rolled-up activity.
-	 * 
-	 * @param o
-	 * @param adapterFactory
-	 * @return
-	 */
-	public static boolean isRolledUpDescriptor(Object o,
-			AdapterFactory adapterFactory) {
-		if(TngUtil.unwrap(o) instanceof Descriptor) {
-			ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory.adapt(o, ITreeItemContentProvider.class);
-			Object parent = adapter.getParent(o);
-			if(TngUtil.unwrap(parent) instanceof Activity) {
-				Object parentAdapter = adapterFactory.adapt(parent, ITreeItemContentProvider.class);
-				return parentAdapter instanceof IBSItemProvider 
-				&& ((IBSItemProvider)parentAdapter).isRolledUp();
-			}			
-		}
-		return false;
-	}
-
-//	/**
-//	 * Creates a deep copy of a process to the specified process package.
-//	 * 
-//	 * @param monitor
-//	 * @param process
-//	 * @prarm newProcessName
-//	 * @param deepCopyConfig
-//	 * @param targetPackage
-//	 * @return Process the newly created process
-//	 */
-//	public static org.eclipse.epf.uma.Process deepCopy(
-//			IProgressMonitor monitor, 
-//			org.eclipse.epf.uma.Process process, 
-//			String newProcessName,
-//			MethodConfiguration deepCopyConfig, 
-//			ProcessPackage targetPackage) {
-//		CopyHelper helper = new CopyHelper();	
-//		try {
-//			return deepCopy(monitor, process, newProcessName, deepCopyConfig, targetPackage, helper);
-//		}
-//		finally {
-//			helper.clear();
-//		}
-//	}
-		
-	public static Process deepCopy(
-			IProgressMonitor monitor, 
-			org.eclipse.epf.uma.Process process, 
-			String newProcessName,
-			MethodConfiguration deepCopyConfig, 
-			ProcessPackage targetPackage,
-			CopyHelper copyHelper,
-			IConfigurator configurator) {		
-		// if the targetPackage is null, use the same package of the source process
-		if ( targetPackage == null ) {
-			targetPackage = (ProcessPackage)process.eContainer().eContainer();
-		}
-		
-		//		new deep-copied process's reference
-		org.eclipse.epf.uma.Process newProcess = null;
-	
-		if(monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-
-		ProcessDeepCopyCommand cmd = new ProcessDeepCopyCommand(process, newProcessName, 
-				copyHelper, deepCopyConfig, targetPackage, monitor,configurator);
-		try {
-			cmd.execute();
-			Collection result = cmd.getResult();
-			if(!result.isEmpty()) {
-				newProcess = (org.eclipse.epf.uma.Process) result.toArray()[0];
-				// fix breakdown element order of all activities
-				//
-				fixBreakdonwElementOrderRecursively(newProcess);	
-				cmd.copySuppressionStates();
-			}
-		}
-		finally {
-			cmd.dispose();
-		}
-		
-		return newProcess;
-	}
-	
-	public static boolean accept(Activity act, IFilter processFilter, boolean checkOwningProcess) {
-		if(processFilter == null) {
-			return true;
-		}
-		Activity base = (Activity) act.getVariabilityBasedOnElement();
-		VariabilityType type = act.getVariabilityType();
-		if (base == null)
-		{
-			if(checkOwningProcess) {
-				return processFilter.accept(TngUtil.getOwningProcess(act));
-			}
-			else {
-				return true;
-			}
-		}
-		else if(type == VariabilityType.EXTENDS_LITERAL || type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL || type == VariabilityType.LOCAL_REPLACEMENT_LITERAL)
-		{
-			// check owning process of base activity only for extends and local contribution/replacement
-			//
-			boolean ret;
-			do {
-				ret = processFilter.accept(TngUtil.getOwningProcess(base));
-				type = base.getVariabilityType();
-				base = (Activity) base.getVariabilityBasedOnElement();
-			} while (ret
-					&& base != null
-					&& (type == VariabilityType.EXTENDS_LITERAL
-							|| type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL || type == VariabilityType.LOCAL_REPLACEMENT_LITERAL));
-			return ret;
-		}
-		else {
-			return true;
-		}
-	}
-	
-	/**
-	 * Returns the Process to which an activity belongs
-	 * @param activity
-	 * @return
-	 */
-	public static Process getProcess(Activity activity) {
-		ProcessComponent procComp = UmaUtil.getProcessComponent(activity);
-		if (procComp != null) {
-			org.eclipse.epf.uma.Process proc = procComp.getProcess();
-			return proc;
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/SectionList.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/SectionList.java
deleted file mode 100644
index df9ebbe..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/SectionList.java
+++ /dev/null
@@ -1,515 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.epf.library.edit.util.model.ModelFactory;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-import org.eclipse.epf.library.edit.util.model.util.StringResource;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * 
- * This class encapsulates all the logics used to retrieve the list of all
- * contributed/inherited sections of the given element as well as allows
- * manipulate this list.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class SectionList extends BasicEList {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 3257572797487069233L;
-
-	private static final String ORDER_INFO_NAME = "sections"; //$NON-NLS-1$
-
-	private static final Map DEFAULT_SAVE_OPTIONS = new HashMap();
-
-	public static final int STEPS_FOR_ELEMENT_ONLY = 1;
-
-	public static final int STEPS_FOR_ELEMENT_AND_PARENTS = 2;
-
-	static {
-		DEFAULT_SAVE_OPTIONS.put(XMLResource.OPTION_ENCODING, "ASCII"); //$NON-NLS-1$
-	}
-
-	private ContentElement editElement;
-
-	private boolean mixed = true;
-
-	private boolean changed = false;
-
-	private static boolean isContributor(VariabilityElement e) {
-		return TngUtil.isContributor(e);
-	}
-
-	public SectionList(ContentElement e, int scope) {
-		editElement = e;
-		if (scope == STEPS_FOR_ELEMENT_ONLY) {
-			mixed = false;
-		} else if (scope == STEPS_FOR_ELEMENT_AND_PARENTS) {
-			calculateParentsOnly(e);
-		} else {
-			mixed = false;
-		}
-	}
-
-	private void calculateParentsOnly(ContentElement e) {
-		Iterator iter = null;
-		// if(isContributor(e)) {
-		// // System.out.println("$$$ for " + e.getName() + " = contributing is
-		// true");
-		// List supers = new ArrayList();
-		// UmaUtil.getAllSupers(supers, e, VariabilityType.CONTRIBUTES_LITERAL);
-		// supers.add(e);
-		// iter = supers.iterator();
-		// } else if(isExtended(e)) {
-		// // System.out.println("$$$ for " + e.getName() + " = extending is
-		// true");
-		// List supers = new ArrayList();
-		// UmaUtil.getAllSupers(supers, e, VariabilityType.EXTENDS_LITERAL);
-		// supers.add(e);
-		// iter = supers.iterator();
-		// }
-		if (isContributor(e) || isExtended(e)) {
-			// System.out.println("$$$ for " + e.getName() + " = contributing is
-			// true");
-			List supers = new ArrayList();
-			UmaUtil.getAllSupersBoth(supers, e,
-					VariabilityType.CONTRIBUTES_LITERAL,
-					VariabilityType.EXTENDS_LITERAL);
-			supers.add(e);
-			iter = supers.iterator();
-		} else {
-			mixed = false;
-		}
-
-		if (mixed) {
-			// create a map of GUID / contributor
-			//
-			OrderInfo latestInfo = null;
-			Map guidSectionMap = new HashMap();
-			Set sects = new LinkedHashSet();
-			while (iter.hasNext()) {
-				ContentElement element = (ContentElement) iter.next();
-				if (ContentDescriptionFactory.hasPresentation(element)) {
-					for (Iterator iterator = element.getPresentation()
-							.getSections().iterator(); iterator.hasNext();) {
-						Section sect = (Section) iterator.next();
-						guidSectionMap.put(sect.getGuid(), sect);
-						sects.add(sect);
-					}
-				}
-				OrderInfo orderInfo = TngUtil.getOrderInfo(element,
-						ORDER_INFO_NAME);
-				if (orderInfo != null) {
-					if (latestInfo == null
-							|| orderInfo.getTimestamp() > latestInfo
-									.getTimestamp()) {
-						latestInfo = orderInfo;
-					}
-				}
-			}
-
-			if (latestInfo != null) {
-				// reorder the sections based on the latest order info
-				//
-				int size = latestInfo.getGUIDs().size();
-				for (int i = 0; i < size; i++) {
-					Object guid = latestInfo.getGUIDs().get(i);
-					Object sect = guidSectionMap.get(guid);
-					if (sect != null) {
-						super.add(sect);
-						sects.remove(sect);
-					}
-				}
-			}
-			super.addAll(sects);
-		}
-	}
-
-	// deprecate the following constructor
-	public SectionList(ContentElement e) {
-		editElement = e;
-		Iterator iter = null;
-		if (isContributor(e) || TngUtil.hasContributor(e)) {
-			VariabilityElement base = TngUtil.getBase(e);
-			iter = new AbstractTreeIterator(base) {
-
-				protected Iterator getChildren(Object object) {
-					List children = new ArrayList();
-					for (Iterator iterator = AssociationHelper
-							.getImmediateVarieties((VariabilityElement) object)
-							.iterator(); iterator.hasNext();) {
-						VariabilityElement element = (VariabilityElement) iterator
-								.next();
-						if (element.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL) {
-							children.add(element);
-						}
-					}
-					return children.iterator();
-				}
-
-			};
-		} else if (isExtended(e)) {
-			System.out
-					.println("$$$ for " + e.getName() + " = extended is true"); //$NON-NLS-1$ //$NON-NLS-2$
-			List supers = new ArrayList();
-			UmaUtil.getAllSupers(supers, e, VariabilityType.EXTENDS_LITERAL);
-			supers.add(e);
-			iter = supers.iterator();
-		} else {
-			mixed = false;
-		}
-
-		if (mixed) {
-			// create a map of GUID / contributor
-			//
-			OrderInfo latestInfo = null;
-			Map guidSectionMap = new HashMap();
-			List sects = new LinkedList();
-			while (iter.hasNext()) {
-				ContentElement element = (ContentElement) iter.next();
-				if (ContentDescriptionFactory.hasPresentation(element)) {
-					for (Iterator iterator = element.getPresentation()
-							.getSections().iterator(); iterator.hasNext();) {
-						Section sect = (Section) iterator.next();
-						guidSectionMap.put(sect.getGuid(), sect);
-						sects.add(sect);
-					}
-				}
-				OrderInfo orderInfo = TngUtil.getOrderInfo(element,
-						ORDER_INFO_NAME);
-				if (orderInfo != null) {
-					if (latestInfo == null
-							|| orderInfo.getTimestamp() > latestInfo
-									.getTimestamp()) {
-						latestInfo = orderInfo;
-					}
-				}
-			}
-
-			if (latestInfo != null) {
-				// reorder the sections based on the latest order info
-				//
-				int size = latestInfo.getGUIDs().size();
-				for (int i = 0; i < size; i++) {
-					Object guid = latestInfo.getGUIDs().get(i);
-					Object sect = guidSectionMap.get(guid);
-					if (sect != null) {
-						super.add(sect);
-						sects.remove(sect);
-					}
-				}
-			}
-			super.addAll(sects);
-		}
-		// else {
-		// // addAll(editElement.getPresentation().getSections());
-		// mixed = false;
-		// }
-	}
-
-	private static boolean isExtended(ContentElement e) {
-		return e.getVariabilityBasedOnElement() != null
-				&& e.getVariabilityType() == VariabilityType.EXTENDS_LITERAL;
-	}
-
-	/**
-	 * Applies recent changes in the list
-	 * 
-	 */
-	public void apply() {
-		if (!mixed || !changed)
-			return;
-
-		// save the order info to the orderingGuide of the editElement
-		//
-		String str = editElement.getOrderingGuide();
-		OrderInfoCollection orderInfos = null;
-		StringResource res = null;
-		if (str == null || str.length() == 0) {
-			orderInfos = ModelFactory.eINSTANCE.createOrderInfoCollection();
-		} else {
-			res = new StringResource(str);
-			try {
-				res.load(null);
-				if (res.getContents().isEmpty()) {
-					orderInfos = ModelFactory.eINSTANCE
-							.createOrderInfoCollection();
-				} else {
-					orderInfos = (OrderInfoCollection) res.getContents().get(0);
-				}
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-
-		// find the order infor for sections
-		//
-		OrderInfo sectOrderInfo = null;
-		for (Iterator iter = orderInfos.getOrderInfos().iterator(); iter
-				.hasNext();) {
-			OrderInfo orderInfo = (OrderInfo) iter.next();
-			if (ORDER_INFO_NAME.equalsIgnoreCase(orderInfo.getName())) {
-				sectOrderInfo = orderInfo;
-				break;
-			}
-		}
-
-		if (sectOrderInfo == null) {
-			sectOrderInfo = ModelFactory.eINSTANCE.createOrderInfo();
-			sectOrderInfo.setName(ORDER_INFO_NAME);
-			orderInfos.getOrderInfos().add(sectOrderInfo);
-		} else {
-			sectOrderInfo.getGUIDs().clear();
-		}
-
-		int size = size();
-		for (int i = 0; i < size; i++) {
-			Section sect = (Section) get(i);
-			sectOrderInfo.getGUIDs().add(sect.getGuid());
-		}
-		sectOrderInfo.setTimestamp(System.currentTimeMillis());
-		if (res == null) {
-			res = new StringResource(null);
-			res.getContents().add(orderInfos);
-		}
-		try {
-			res.save(DEFAULT_SAVE_OPTIONS);
-			str = res.getString();
-			// System.out.println("SectionList.apply(): new ordering guide");
-			// System.out.println("------ orderingGuide start ------");
-			// System.out.println(str);
-			// System.out.println("------ orderingGuide end ------");
-			editElement.setOrderingGuide(str);
-		} catch (IOException e) {
-			e.printStackTrace();
-		} catch (RuntimeException e) {
-			e.printStackTrace();
-		}
-	}
-
-	public boolean canRemove(Section section) {
-		if (ContentDescriptionFactory.hasPresentation(editElement)) {
-			return editElement.getPresentation() == section.eContainer();
-		}
-		return false;
-	}
-
-	public Object remove(int index) {
-		if (mixed) {
-			if (!canRemove((Section) get(index)))
-				return null;
-			Object removed = super.remove(index);
-			editElement.getPresentation().getSections().remove(removed);
-			return removed;
-		} else {
-			return editElement.getPresentation().getSections().remove(index);
-		}
-	}
-
-	public boolean remove(Object o) {
-		if (!canRemove((Section) o))
-			return false;
-		if (mixed) {
-			if (super.remove(o)) {
-				editElement.getPresentation().getSections().remove(o);
-				return true;
-			}
-			return false;
-		}
-		return editElement.getPresentation().getSections().remove(o);
-	}
-
-	public boolean removeAll(Collection c) {
-		if (mixed) {
-			boolean modified = false;
-			Iterator e = iterator();
-			while (e.hasNext()) {
-				Object o = e.next();
-				if (c.contains(o) && canRemove((Section) o)) {
-					e.remove();
-					editElement.getPresentation().getSections().remove(o);
-					modified = true;
-				}
-			}
-			return modified;
-		} else {
-			return editElement.getPresentation().getSections().removeAll(c);
-		}
-	}
-
-	public void add(int index, Object element) {
-		if (mixed) {
-			super.add(index, element);
-			editElement.getPresentation().getSections().add(element);
-			changed = true;
-		} else {
-			editElement.getPresentation().getSections().add(index, element);
-		}
-	}
-
-	public boolean add(Object o) {
-		boolean b = editElement.getPresentation().getSections().add(o);
-		if (mixed) {
-			b = super.add(o);
-			if (b)
-				changed = true;
-		}
-		return b;
-	}
-
-	public boolean addAll(Collection c) {
-		boolean b = editElement.getPresentation().getSections().addAll(c);
-		if (mixed) {
-			b = super.addAll(c);
-			if (b)
-				changed = true;
-		}
-		return b;
-	}
-
-	public boolean addAll(int index, Collection c) {
-		if (mixed) {
-			editElement.getPresentation().getSections().addAll(c);
-			boolean b = super.addAll(index, c);
-			if (b)
-				changed = true;
-		}
-		return editElement.getPresentation().getSections().addAll(index, c);
-	}
-
-	public Object set(int index, Object element) {
-		if (mixed)
-			throw new UnsupportedOperationException();
-		return editElement.getPresentation().getSections().set(index, element);
-	}
-
-	public void clear() {
-		if (mixed)
-			throw new UnsupportedOperationException();
-		editElement.getPresentation().getSections().clear();
-	}
-
-	public void move(int index, Object object) {
-		if (mixed) {
-			super.move(index, object);
-			changed = true;
-		} else {
-			((EList) editElement.getPresentation().getSections()).move(index,
-					object);
-		}
-	}
-
-	public Object move(int targetIndex, int sourceIndex) {
-		if (mixed) {
-			Object moved = super.move(targetIndex, sourceIndex);
-			changed = true;
-			return moved;
-		} else {
-			return ((EList) editElement.getPresentation().getSections()).move(
-					targetIndex, sourceIndex);
-		}
-	}
-
-	public Object get(int index) {
-		if (mixed) {
-			return super.get(index);
-		} else {
-			return editElement.getPresentation().getSections().get(index);
-		}
-	}
-
-	public int size() {
-		if (mixed) {
-			return super.size();
-		} else {
-			return editElement.getPresentation().getSections().size();
-		}
-	}
-
-	public Iterator iterator() {
-		if (mixed) {
-			return super.iterator();
-		} else {
-			return editElement.getPresentation().getSections().iterator();
-		}
-	}
-
-	public boolean contains(Object object) {
-		if (mixed) {
-			return super.contains(object);
-		}
-		return editElement.getPresentation().getSections().contains(object);
-	}
-
-	public boolean containsAll(Collection collection) {
-		if (mixed)
-			return super.containsAll(collection);
-		return editElement.getPresentation().getSections().containsAll(
-				collection);
-	}
-
-	public Object[] toArray() {
-		if (mixed) {
-			return super.toArray();
-		}
-		return editElement.getPresentation().getSections().toArray();
-	}
-
-	public Object[] toArray(Object[] array) {
-		if (mixed)
-			return super.toArray(array);
-		return editElement.getPresentation().getSections().toArray(array);
-	}
-
-	public int indexOf(Object object) {
-		if (mixed)
-			return super.indexOf(object);
-		return editElement.getPresentation().getSections().indexOf(object);
-	}
-
-	public int lastIndexOf(Object object) {
-		if (mixed)
-			return super.lastIndexOf(object);
-		return editElement.getPresentation().getSections().lastIndexOf(object);
-	}
-
-	public boolean isMixed() {
-		return mixed;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/StepList.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/StepList.java
deleted file mode 100644
index 0550ead..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/StepList.java
+++ /dev/null
@@ -1,217 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.util.EcoreEList;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * Reorder steps
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class StepList {
-
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 3257567325849858871L;
-
-	private static DescribableElement getDescribableElement(Section step) {
-		return (DescribableElement) step.eContainer().eContainer();
-	}
-
-	private Task currentTask;
-
-	private LinkedList stepLists;
-
-	public StepList(Task currentTask, List stepLists) {
-		this.currentTask = currentTask;
-		this.stepLists = new LinkedList(stepLists);
-		reorder();
-	}
-
-	/**
-	 * 
-	 */
-	private void reorder() {
-		Map ownerSectionsMap = new HashMap();
-		int size = stepLists.size();
-		for (int i = 0; i < size; i++) {
-			EcoreEList eList = (EcoreEList) stepLists.get(i);
-			ownerSectionsMap.put(eList.getNotifier(), eList);
-		}
-		for (Iterator iter = new ArrayList(stepLists).iterator(); iter
-				.hasNext();) {
-			List stepList = (List) iter.next();
-			if (!stepList.isEmpty()) {
-				Section step = (Section) stepList.get(0);
-				Section pred = step.getPredecessor();
-				if (pred == null) {
-					List oldFirstList = (List) stepLists.get(0);
-
-					// put this step list at beginning
-					//
-					stepLists.remove(stepList);
-					stepLists.add(0, stepList);
-
-					// set this step list to be the predecessor of the previous
-					// first list
-					//
-					if (!oldFirstList.isEmpty()) {
-						Section oldFirstStep = (Section) oldFirstList.get(0);
-						if (TngUtil.canReference(
-								getDescribableElement(oldFirstStep),
-								getDescribableElement(step))) {
-							oldFirstStep.setPredecessor(step);
-						}
-					}
-				} else {
-					List predList = (List) ownerSectionsMap.get(pred
-							.eContainer());
-					stepLists.remove(predList);
-					int id = stepLists.indexOf(stepList);
-					stepLists.add(id, predList);
-				}
-			}
-		}
-	}
-
-	// private void reassignPredecessors() {
-	//
-	// }
-
-	public List getSteps() {
-		List allSteps = new ArrayList();
-		int size = stepLists.size();
-		for (int i = 0; i < size; i++) {
-			List steps = (List) stepLists.get(i);
-			for (Iterator iter = steps.iterator(); iter.hasNext();) {
-				allSteps.add(iter.next());
-			}
-		}
-		return allSteps;
-	}
-
-	public boolean moveUp(Section step) {
-		List steps = currentTask.getPresentation().getSections();
-		int id = steps.indexOf(step);
-		if (id == -1)
-			return false;
-		if (id > 0) {
-			if (id == 1) {
-
-			}
-			// move the step within its list
-			//
-			Collections.swap(steps, id - 1, id);
-			return true;
-		}
-		// move the whole step list up
-		//
-		id = stepLists.indexOf(steps);
-		if (id == -1)
-			return false;
-		List predList = null;
-		int predListId = id - 1;
-		// look for non-empty predecessor list
-		//
-		find_predList: for (; predListId > -1; predListId--) {
-			List list = (List) stepLists.get(predListId);
-			if (!list.isEmpty()) {
-				predList = list;
-				break find_predList;
-			}
-		}
-		Section oldPred = ((Section) steps.get(0)).getPredecessor();
-		List oldSuccessors = AssociationHelper.getSuccessors((Section) steps
-				.get(steps.size() - 1));
-		if (predList != null) {
-			stepLists.remove(steps);
-			stepLists.add(predListId, steps);
-			Section last = (Section) predList.get(predList.size() - 1);
-			List oldPredSuccessors = AssociationHelper.getSuccessors(last);
-			if (TngUtil.canReference(currentTask, getDescribableElement(last))) {
-				step.setPredecessor(last);
-				for (Iterator iter = oldPredSuccessors.iterator(); iter
-						.hasNext();) {
-					Section sect = (Section) iter.next();
-					sect.setPredecessor(step);
-				}
-			}
-		} else {
-			stepLists.add(0, steps);
-		}
-		DescribableElement oldPredTask = getDescribableElement(oldPred);
-		for (Iterator iter = oldSuccessors.iterator(); iter.hasNext();) {
-			Section sect = (Section) iter.next();
-			if (TngUtil.canReference(getDescribableElement(sect), oldPredTask)) {
-				sect.setPredecessor(oldPred);
-			}
-		}
-
-		return true;
-	}
-
-	public boolean moveDown(Section step) {
-		List steps = currentTask.getPresentation().getSections();
-		int id = steps.indexOf(step);
-		if (id == -1)
-			return false;
-		if (id < steps.size() - 1) {
-			// move the step within its list
-			//
-			Collections.swap(steps, id + 1, id);
-			return true;
-		}
-		// move the whole step list up
-		//
-		id = stepLists.indexOf(steps);
-		if (id == -1)
-			return false;
-		List succList = null;
-		int succListId = id + 1;
-		int size = stepLists.size();
-
-		// look for non-empty successor list
-		//
-		find_List: for (; succListId < size; succListId++) {
-			List list = (List) stepLists.get(succListId);
-			if (!list.isEmpty()) {
-				succList = list;
-				break find_List;
-			}
-		}
-		if (succList != null) {
-			stepLists.remove(succList);
-			stepLists.add(id, succList);
-		} else {
-			stepLists.add(steps);
-		}
-
-		return true;
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Suppression.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Suppression.java
deleted file mode 100644
index 7b7c554..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Suppression.java
+++ /dev/null
@@ -1,1593 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.WrapperItemProvider;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.ComposedBreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.RemoveUnusedDescriptorsCommand;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * This class calculates the suppression state, both direct and indirect, of any
- * breakdown element or its wrapper in the specified process.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class Suppression {
-
-	public static final String WBS = "wbs"; //$NON-NLS-1$
-
-	public static final String TBS = "tbs"; //$NON-NLS-1$
-
-	public static final String WPBS = "wpbs"; //$NON-NLS-1$
-
-	public static final String CBS = "cbs"; //$NON-NLS-1$
-
-	private static final Map procToSuppressionMap = new HashMap();
-
-	private static boolean autoInheritIntermediateSuppressionState = true;
-
-	protected Process process;
-
-	private Set suppressedExternalElementPaths;
-
-	private boolean modified;
-
-	private Set internalUnsuppressedElements = new HashSet();
-
-	public static final void clearCachedSuppressions() {
-		procToSuppressionMap.clear();
-	}
-
-	/**
-	 * Removes suppressions of invalid processes
-	 */
-	public static final void cleanUp() {
-		ArrayList listToRemove = new ArrayList();
-		for (Iterator iter = new ArrayList(procToSuppressionMap.keySet())
-				.iterator(); iter.hasNext();) {
-			Process proc = (Process) iter.next();
-			if (proc.eIsProxy()) {
-				listToRemove.add(proc);
-			}
-		}
-		int size = listToRemove.size();
-		for (int i = 0; i < size; i++) {
-			procToSuppressionMap.remove(listToRemove.get(i));
-		}
-	}
-
-	public static final void setAutoInheritSuppressionStates(boolean b) {
-		autoInheritIntermediateSuppressionState = b;
-	}
-
-	public Suppression(Process process) {
-		this.process = process;
-		suppressedExternalElementPaths = loadSuppressedElementPaths();
-	}
-
-	public Process getProcess() {
-		return process;
-	}
-
-	private Set loadSuppressedElementPaths() {
-		Constraint rule = ConstraintManager.getConstraint(process,
-				ConstraintManager.PROCESS_SUPPRESSION, false); // (Constraint)
-		// process.getOwnedRules().get(0);
-		if (rule != null && rule.getBody().length() > 0) {
-			Set paths = new HashSet();
-			for (StringTokenizer tokens = new StringTokenizer(rule.getBody()); tokens
-					.hasMoreTokens();) {
-				paths.add(tokens.nextToken());
-			}
-			return paths;
-		}
-		return null;
-	}
-
-	private Set getSuppressedExternalElementPaths() {
-		if (suppressedExternalElementPaths == null) {
-			suppressedExternalElementPaths = loadSuppressedElementPaths();
-			if (suppressedExternalElementPaths == null) {
-				suppressedExternalElementPaths = new HashSet();
-			}
-		}
-		return suppressedExternalElementPaths;
-	}
-
-	/**
-	 * @param process
-	 * @param selection
-	 * @return
-	 */
-	public boolean hasSuppressed(Collection selection) {
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof BreakdownElementWrapperItemProvider) {
-				if (isSuppressed((BreakdownElementWrapperItemProvider) element)) {
-					return true;
-				}
-			} else if (element instanceof BreakdownElement) {
-				if (isSuppressed((BreakdownElement) element)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks if the given selection has any element that is not suppressed yet
-	 * in this suppression's process
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	public boolean canSuppress(Collection selection) {
-		return canDo(selection, true);
-	}
-
-	/**
-	 * Checks if the given selection has any element that is suppressed in this
-	 * suppression's process
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	public boolean canReveal(Collection selection) {
-		return canDo(selection, false);
-	}
-
-	/**
-	 * Extracts items from the given selection that can be suppressed/revealed
-	 * (depending on the <code>suppressed</code> parameter)
-	 * 
-	 * @param selection
-	 * @param suppressed
-	 * @return
-	 */
-	private Collection getApplicableItems(Collection selection,
-			boolean suppressed) {
-		ArrayList applicableItems = new ArrayList();
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof BreakdownElementWrapperItemProvider) {
-				BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) element;
-				if (wrapper.isReadOnly()) {
-					if (isInSuppressedList(wrapper) != suppressed) {
-						applicableItems.add(element);
-					}
-				} else {
-					Object e = TngUtil.unwrap(wrapper);
-					if (e instanceof MethodElement
-							&& ((MethodElement) e).getSuppressed()
-									.booleanValue() != suppressed) {
-						applicableItems.add(element);
-					}
-				}
-			} else if (element instanceof MethodElement) {
-				if (((MethodElement) element).getSuppressed().booleanValue() != suppressed) {
-					applicableItems.add(element);
-				}
-			}
-		}
-		return applicableItems;
-	}
-
-	/**
-	 * Checks if the given element is valid to suppress/reveal upon
-	 * 
-	 * @param element
-	 * @return
-	 */
-	public static boolean isValid(Object element) {
-		// don't show suppress/reveal for roledescriptor under team, work
-		// product descriptor under deliverable work product,
-		// and rolled-up item
-		//
-		BreakdownElement obj = null;
-		if (element instanceof BreakdownElementWrapperItemProvider) {
-			BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) element;
-			if (wrapper.isRollupChild()) {
-				return false;
-			}
-			obj = (BreakdownElement) TngUtil.unwrap(wrapper);
-		} else if (element instanceof BreakdownElement)
-			obj = (BreakdownElement) element;
-		if (obj instanceof RoleDescriptor
-				|| obj instanceof WorkProductDescriptor) {
-			if (obj.getSuperActivities() == null
-					|| obj.getSuperActivities() == null) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Checks if the given selection has any item that can be
-	 * suppressed/revealed (depending on the <code>suppressed</code>
-	 * parameter)
-	 * 
-	 * @param selection
-	 * @param suppressed
-	 * @return
-	 */
-	private boolean canDo(Collection selection, boolean suppressed) {
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (isValid(element)) {
-				if (element instanceof BreakdownElementWrapperItemProvider) {
-					BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) element;
-					if (wrapper.isReadOnly()) {
-						if (isInSuppressedList(wrapper) != suppressed) {
-							return true;
-						}
-					} else {
-						Object e = TngUtil.unwrap(wrapper);
-						if (e instanceof MethodElement
-								&& ((MethodElement) e).getSuppressed()
-										.booleanValue() != suppressed) {
-							return true;
-						}
-					}
-				} else if (element instanceof MethodElement) {
-					if (((MethodElement) element).getSuppressed()
-							.booleanValue() != suppressed) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * A breakdown element is suppressed if itself or any of its parent activity
-	 * is suppressed
-	 * 
-	 * @param e
-	 * @return
-	 */
-	private boolean __isSuppressed(BreakdownElement e) {
-		return getSuppressed(e, true, null) != null;
-	}
-
-	private static boolean isDirectlySuppressed(MethodElement e) {
-		Boolean b = e.getSuppressed();
-		if (b != null && b.booleanValue()) {
-			return true;
-		}
-		if (e instanceof VariabilityElement) {
-			VariabilityElement ve = (VariabilityElement) e;
-			VariabilityType variabilityType = ve.getVariabilityType();
-			if (variabilityType == VariabilityType.EXTENDS_LITERAL
-					|| variabilityType == VariabilityType.CONTRIBUTES_LITERAL) {
-				if (ve.getVariabilityBasedOnElement() != null) {
-					return isDirectlySuppressed(ve
-							.getVariabilityBasedOnElement());
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Gets the suppressed breakdown element that made the given breakdown
-	 * element become suppressed. This method will check the suppression state
-	 * of the parent upto the specified <code>top</code> only if
-	 * <code>checkParent</code> is <code>true</code>. It will not check the
-	 * suppression state of <code>top</code>
-	 * 
-	 * @param e
-	 * @return
-	 */
-	private static BreakdownElement getSuppressed(BreakdownElement e,
-			boolean checkParent, Object top) {
-		if (e.getSuppressed().booleanValue()) {
-			return e;
-		}
-
-		if (checkParent) {
-			for (BreakdownElement be = e; be != top
-					&& be.getSuperActivities() != null;) {
-				be = be.getSuperActivities();
-				if (be.getSuppressed().booleanValue()) {
-					return be;
-				}
-			}
-
-			// special handling for nested artifact descriptors and deliverable
-			// parts
-			//
-			if (e instanceof WorkProductDescriptor) {
-				WorkProductDescriptor wpDesc = ((WorkProductDescriptor) e);
-				WorkProduct wp = wpDesc.getWorkProduct();
-				if (wp instanceof Artifact) {
-					// look for parent artifact descriptor in the same activity
-					// and check their suppression state
-					//
-					Activity act = UmaUtil.getParentActivity(e);
-					if (act != null) {
-						for (Iterator iter = act.getBreakdownElements()
-								.iterator(); iter.hasNext();) {
-							Object element = iter.next();
-							if (element != e
-									&& element instanceof WorkProductDescriptor) {
-								WorkProductDescriptor wpd = ((WorkProductDescriptor) element);
-								WorkProduct otherWp = wpd.getWorkProduct();
-								if (otherWp instanceof Artifact
-										&& UmaUtil.isContainedBy(wp, otherWp)
-										&& wpd.getSuppressed().booleanValue()) {
-									return wpd;
-								}
-							}
-						}
-					}
-				}
-				if (wpDesc != top && wpDesc.getSuperActivities() == null) {
-					List list = AssociationHelper
-							.getDeliverableDescriptors(wpDesc);
-					if (list.size() == 1) {
-						// this work product descriptor is a deliverable part of
-						// a deliverable work product descriptor
-						// check the suppression state of the deliverable work
-						// product descriptor
-						//
-						return getSuppressed((BreakdownElement) list.get(0),
-								checkParent, top);
-					}
-				}
-			}
-			// special handling for team profile own role descriptor
-			//
-			else if (e instanceof RoleDescriptor) {
-				if (e.getSuperActivities() == null) {
-					List list = AssociationHelper
-							.getTeamProfiles((RoleDescriptor) e);
-					if (list.size() == 1) {
-						TeamProfile team = (TeamProfile) list.get(0);
-						if (team != top && team != null) {
-							return getSuppressed(team, checkParent, top);
-						}
-					}
-				}
-			}
-			// special handling for sub team profile
-			//
-			else if (e instanceof TeamProfile) {
-				if (e.getSuperActivities() == null) {
-					TeamProfile superTeam = ((TeamProfile) e).getSuperTeam();
-					if (superTeam != top && superTeam != null) {
-						return getSuppressed(superTeam, checkParent, top);
-					}
-				}
-			}
-		}
-
-		return null;
-	}
-
-	public boolean isInSuppressedList(
-			BreakdownElementWrapperItemProvider wrapper) {
-		if (suppressedExternalElementPaths == null) {
-			return false;
-		}
-
-		// check if wrapper's path is in suppressedExternalElementPaths set
-		//
-		String path = getPath(wrapper);
-		return suppressedExternalElementPaths.contains(path);
-	}
-
-	/**
-	 * Gets the suppressed breakdown element that made the given wrapper become
-	 * suppressed
-	 * 
-	 * @param wrapper
-	 * @return
-	 */
-	private BreakdownElement getSuppressed(
-			BreakdownElementWrapperItemProvider wrapper) {
-		return getSuppressed(wrapper, true);
-	}
-
-	/**
-	 * Gets the suppressed breakdown element that made the given wrapper become
-	 * suppressed
-	 * 
-	 * @param wrapper
-	 * @return
-	 */
-	private BreakdownElement getSuppressed(
-			BreakdownElementWrapperItemProvider wrapper, boolean checkBase) {
-		return getSuppressed(wrapper, checkBase, true,
-				autoInheritIntermediateSuppressionState);
-	}
-
-	/**
-	 * Gets the suppressed breakdown element that made the given wrapper become
-	 * suppressed
-	 * 
-	 * @param wrapper
-	 * @return
-	 */
-	private BreakdownElement getSuppressed(
-			BreakdownElementWrapperItemProvider wrapper, boolean checkBase,
-			boolean checkLocal, boolean inheritSuppressionState) {
-		return getSuppressed(wrapper, checkBase, checkLocal,
-				inheritSuppressionState, true, null);
-	}
-
-	private BreakdownElement getSuppressed(
-			BreakdownElementWrapperItemProvider wrapper, boolean checkBase,
-			boolean checkLocal, boolean inheritSuppressionState,
-			boolean checkParent, Object top) {
-		BreakdownElement e = (BreakdownElement) TngUtil.unwrap(wrapper);
-		if (!wrapper.isReadOnly()) {
-			// this is a wrapper of local element
-			//
-			return getSuppressed(e, checkParent, top);
-		}
-
-		// check if the base breakdown element is suppressed, directly or
-		// indirectly, in its own process
-		//
-		if (checkBase) {
-			BreakdownElement suppressed = getSuppressed(e, checkParent, top);
-			if (suppressed != null) {
-				return suppressed;
-			}
-		}
-
-		Object parent = null;
-		if (checkLocal) {
-			// check if the wrapper is suppressed in this process
-			//
-			if (isInSuppressedList(wrapper)) {
-				return e;
-			}
-
-			// check if the any local parent is suppressed
-			//
-			if (checkParent) {
-				parent = wrapper.getParent(wrapper);
-				if (parent instanceof BreakdownElement && parent != top) {
-					BreakdownElement suppressed = getSuppressed(
-							(BreakdownElement) parent, checkParent, top);
-					if (suppressed != null) {
-						return suppressed;
-					}
-				}
-			}
-		}
-
-		// check if the breakdown element is suppressed in one of the immediate
-		// base process
-		//
-		if (inheritSuppressionState) {
-			Process proc = TngUtil.getOwningProcess(e);
-			Activity inheritor = ProcessUtil.getInheritor(wrapper);
-			BreakdownElement base = (BreakdownElement) inheritor
-					.getVariabilityBasedOnElement();
-			if (base != null) {
-				Process immediateBaseProc = TngUtil.getOwningProcess(base);
-				if (proc != immediateBaseProc) {
-					// find the object in the breakdown structure of the
-					// immediate
-					// base process that represents the same breakdown element
-					//
-					Object object = inheritor.getVariabilityBasedOnElement();
-					ArrayList objects = new ArrayList(ProcessUtil
-							.getParentList(inheritor, wrapper));
-					objects.add(e);
-					for (Iterator iter = objects.iterator(); iter.hasNext();) {
-						Object element = iter.next();
-						ITreeItemContentProvider adapter = (ITreeItemContentProvider) wrapper
-								.getAdapterFactory().adapt(object,
-										ITreeItemContentProvider.class);
-						find_child: for (Iterator iterator = adapter
-								.getChildren(object).iterator(); iterator
-								.hasNext();) {
-							Object child = iterator.next();
-							if (element == TngUtil.unwrap(child)) {
-								object = child;
-								break find_child;
-							}
-						}
-					}
-					if (object instanceof BreakdownElementWrapperItemProvider) {
-						Suppression suppression = getSuppression(immediateBaseProc);
-						BreakdownElement element = suppression.getSuppressed(
-								(BreakdownElementWrapperItemProvider) object,
-								false, true, inheritSuppressionState,
-								checkParent, TngUtil.unwrap(object));
-						if (element != null) {
-							return element;
-						}
-					}
-				}
-			}
-		}
-
-		// check if the any inherited parent is suppressed
-		//
-		if (checkParent) {
-			if (parent == null) {
-				parent = wrapper.getParent(wrapper);
-			}
-			if (parent instanceof BreakdownElementWrapperItemProvider
-					&& TngUtil.unwrap(parent) != top) {
-				return getSuppressed(
-						(BreakdownElementWrapperItemProvider) parent,
-						checkBase, true, inheritSuppressionState, checkParent,
-						top);
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Gets the cached suppression for the given process if one exists or
-	 * creates new one
-	 * 
-	 * @param immediateBaseProc
-	 * @return
-	 */
-	public static Suppression getSuppression(Process proc) {
-		Suppression suppression = (Suppression) procToSuppressionMap.get(proc);
-		if (suppression == null) {
-			synchronized (procToSuppressionMap) {
-				suppression = (Suppression) procToSuppressionMap.get(proc);
-				if (suppression == null) {
-					suppression = new Suppression(proc);
-					procToSuppressionMap.put(proc, suppression);
-				}
-			}
-		}
-		return suppression;
-	}
-
-	public static synchronized void setSuppression(Suppression sup) {
-		procToSuppressionMap.put(sup.getProcess(), sup);
-	}
-	
-	private boolean __isSuppressed(BreakdownElementWrapperItemProvider wrapper) {
-		return getSuppressed(wrapper) != null;
-	}
-
-	public void saveToModel() {
-		if (suppressedExternalElementPaths == null) {
-			return;
-		}
-
-		StringBuffer paths = new StringBuffer();
-		for (Iterator iter = suppressedExternalElementPaths.iterator(); iter
-				.hasNext();) {
-			String path = (String) iter.next();
-			if (isValid(path)) {
-				paths.append(path).append(' ');
-			}
-		}
-
-		Constraint rule = ConstraintManager.getConstraint(process,
-				ConstraintManager.PROCESS_SUPPRESSION, true);
-		// if(process.getOwnedRules().isEmpty()) {
-		// rule = UmaFactory.eINSTANCE.createConstraint();
-		// process.getOwnedRules().add(rule);
-		// }
-		// else {
-		// rule = (Constraint) process.getOwnedRules().get(0);
-		// }
-		//		
-		rule.setBody(paths.toString());
-	}
-
-	/**
-	 * Checks if the given path is valid in process
-	 * 
-	 * @param path
-	 * @return
-	 */
-	private boolean isValid(String path) {
-		URI uri = URI.createURI(path);
-		String type = uri.scheme();
-		ConfigurableComposedAdapterFactory adapterFactory = null;
-		if (WBS.equals(type)) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.getWBS_ComposedAdapterFactory();
-		} else if (TBS.equals(type)) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.getOBS_ComposedAdapterFactory();
-		} else if (WPBS.equals(type)) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.getPBS_ComposedAdapterFactory();
-		} else if (CBS.equals(type)) {
-			adapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-					.getProcessComposedAdapterFactory();
-		} else {
-			return false;
-		}
-
-		// use process's default configuration to validate
-		//
-		MethodConfiguration currentConfig = null;
-		IConfigurator configurator = null;
-		IFilter filter = adapterFactory.getFilter();
-		if (filter instanceof IConfigurator) {
-			configurator = (IConfigurator) adapterFactory.getFilter();
-			currentConfig = configurator.getMethodConfiguration();
-			configurator.setMethodConfiguration(process.getDefaultContext());
-		}
-		try {
-			String guid = uri.authority();
-			if (!process.getGuid().equals(guid)) {
-				return false;
-			}
-			Object object = process;
-			ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-					.adapt(object, ITreeItemContentProvider.class);
-			for (int i = 0; i < uri.segmentCount(); i++) {
-				guid = uri.segment(i);
-				Iterator iter = adapter.getChildren(object).iterator();
-				adapter = null;
-				find_adapter: while (iter.hasNext()) {
-					Object child = iter.next();
-					object = TngUtil.unwrap(child);
-					if (object instanceof MethodElement) {
-						if (guid.equals(((MethodElement) object).getGuid())) {
-							if (child instanceof ITreeItemContentProvider) {
-								adapter = (ITreeItemContentProvider) child;
-							} else {
-								adapter = (ITreeItemContentProvider) adapterFactory
-										.adapt(child,
-												ITreeItemContentProvider.class);
-							}
-							break find_adapter;
-						}
-					} else {
-						// must be an ItemProviderAdapter
-						//
-						ItemProviderAdapter itemProvider = (ItemProviderAdapter) object;
-						MethodElement e = (MethodElement) itemProvider
-								.getTarget();
-						if (guid.equals(e.getGuid())) {
-							adapter = (ITreeItemContentProvider) itemProvider;
-							break find_adapter;
-						}
-					}
-				}
-				if (adapter == null) {
-					return false;
-				}
-			}
-			return true;
-		} finally {
-			// restore configuration
-			//
-			if (configurator != null) {
-				configurator.setMethodConfiguration(currentConfig);
-			}
-		}
-	}
-
-	// private boolean reveal(List selection, Collection revealedDescriptors) {
-	// boolean readOnlyElementAffected = false;
-	// for (Iterator iter = selection.iterator(); iter.hasNext();) {
-	// Object element = (Object) iter.next();
-	// if (element instanceof BreakdownElementWrapperItemProvider) {
-	// BreakdownElementWrapperItemProvider wrapper =
-	// (BreakdownElementWrapperItemProvider) element;
-	// MethodElement e = (MethodElement) TngUtil.unwrap(wrapper);
-	// if (!wrapper.isReadOnly()) { // wrapper of local element
-	// e.setSuppressed(Boolean.FALSE);
-	// if(e instanceof Descriptor) {
-	// revealedDescriptors.add(e);
-	// }
-	// } else { // was suppressed by this process
-	//
-	// // remove the path of suppressed element from the list
-	// //
-	// String path = getPath(wrapper);
-	// getSuppressedExternalElementPaths().remove(path);
-	// readOnlyElementAffected = true;
-	// }
-	// } else if (element instanceof MethodElement) {
-	// ((MethodElement) element).setSuppressed(Boolean.FALSE);
-	// if(element instanceof Descriptor) {
-	// revealedDescriptors.add(element);
-	// }
-	// }
-	// }
-	// modified = true;
-	// return readOnlyElementAffected;
-	// }
-
-	// /**
-	// * @param selection
-	// * @return true if this call revealed any read-only element
-	// */
-	// public boolean reveal(List selection) {
-	// ArrayList revealedDescriptors = new ArrayList();
-	// boolean ret = reveal(selection, revealedDescriptors);
-	// List descriptorsToReveal = getOwnRelatedElements(revealedDescriptors,
-	// false);
-	// if(descriptorsToReveal != null) {
-	// boolean ret2 = reveal(descriptorsToReveal, revealedDescriptors);
-	// return ret || ret2;
-	// }
-	// return ret;
-	// }
-
-	/**
-	 * @deprecated need to use {@link SuppressionCommand} instead
-	 */
-	public void reveal(List selection) {
-		doSetSuppressed(selection, false);
-	}
-
-	private static String getViewType(
-			BreakdownElementWrapperItemProvider wrapper) {
-		// no need to store separate path for CBS, reuse WBS/TBS/WPBS paths
-		//		
-		Object e = TngUtil.unwrap(wrapper);
-		if (e instanceof WorkBreakdownElement) {
-			return WBS;
-		} else if (e instanceof TeamProfile || e instanceof RoleDescriptor) {
-			return TBS;
-		} else if (e instanceof WorkProductDescriptor) {
-			return WPBS;
-		} else {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the process GUID in the given GUID path
-	 * 
-	 * @param guidPath
-	 * @return
-	 * @see #getPath(BreakdownElementWrapperItemProvider)
-	 */
-	public static String getProcessGUID(String guidPath) {
-		int id = guidPath.indexOf("://"); //$NON-NLS-1$
-		if (id != -1) {
-			int beginIndex = id + 3;
-			if (beginIndex < guidPath.length()) {
-				int endIndex = guidPath.indexOf('/', beginIndex);
-				if (endIndex != -1) {
-					return guidPath.substring(beginIndex, endIndex);
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param wrapper
-	 * @return
-	 */
-	public static String getPath(BreakdownElementWrapperItemProvider wrapper) {
-		StringBuffer path = getPathWithoutViewType(wrapper);
-		String viewType = getViewType(wrapper);
-		path.insert(0, ":/").insert(0, viewType); //$NON-NLS-1$
-		return path.toString();
-	}
-	
-	public static StringBuffer getPathWithoutViewType(BreakdownElementWrapperItemProvider wrapper) {
-		StringBuffer path = new StringBuffer(); 
-		List parentList = ProcessUtil.getParentList(null, wrapper);
-		if (!parentList.isEmpty()) {
-			for (Iterator iter = parentList.iterator(); iter.hasNext();) {
-				MethodElement e = (MethodElement) iter.next();
-				// exclude TaskDescriptor and RoleDescriptor from the parent
-				// path b/c those descriptors can be
-				// parent only in CBS view
-				if (!(e instanceof TaskDescriptor || e instanceof RoleDescriptor)) {
-					path.append('/').append(e.getGuid());
-				}
-			}
-		}
-		MethodElement e = (MethodElement) TngUtil.unwrap(wrapper);
-		path.append('/').append(e.getGuid());
-		return path;
-	}
-	
-	private static List getOwnRelatedElements(Collection changedDescriptors,
-			boolean suppressed) {
-		if (!changedDescriptors.isEmpty()) {
-			ArrayList descriptorsToChange = new ArrayList();
-			for (Iterator iter = new ArrayList(changedDescriptors).iterator(); iter
-					.hasNext();) {
-				Descriptor desc = (Descriptor) iter.next();
-				Object[] relationships = null;
-				if (desc instanceof TaskDescriptor) {
-					relationships = RemoveUnusedDescriptorsCommand.TASK_DESCRIPTOR__RELATIONSHIPS;
-				} else if (desc instanceof RoleDescriptor) {
-					relationships = RemoveUnusedDescriptorsCommand.ROLE_DESCRIPTOR__RELATIONSHIPS;
-				} else if (desc instanceof WorkProductDescriptor) {
-					relationships = RemoveUnusedDescriptorsCommand.WORK_PRODUCT_DESCRIPTOR__RELATIONSHIPS;
-				}
-				if (relationships != null) {
-					for (int i = 0; i < relationships.length; i++) {
-						Object feature = relationships[i];
-						boolean isMany;
-						Object value;
-						if (feature instanceof OppositeFeature) {
-							OppositeFeature f = (OppositeFeature) feature;
-							isMany = f.isMany();
-							value = ((MultiResourceEObject) desc)
-									.getOppositeFeatureValue(f);
-						} else {
-							EStructuralFeature f = (EStructuralFeature) feature;
-							isMany = f.isMany();
-							value = desc.eGet(f);
-						}
-						if (isMany) {
-							for (Iterator iterator = ((Collection) value)
-									.iterator(); iterator.hasNext();) {
-								Descriptor ref = (Descriptor) iterator.next();
-								if (ref.getSuppressed().booleanValue() != suppressed
-										&& !ProcessUtil
-												.checkDescriptorReferences(
-														changedDescriptors, ref)) {
-									descriptorsToChange.add(ref);
-									changedDescriptors.add(ref);
-								}
-							}
-						} else {
-							Descriptor ref = (Descriptor) value;
-							if (ref != null) {
-								if (ref.getSuppressed().booleanValue() != suppressed
-										&& !ProcessUtil.checkDescriptorReferences(
-												changedDescriptors, ref)) {
-									descriptorsToChange.add(ref);
-									changedDescriptors.add(ref);
-								}
-							}
-						}
-					}
-				}
-			}
-			return descriptorsToChange;
-		}
-		return null;
-	}
-
-	/**
-	 * Suppresses or reveals the given selection
-	 * 
-	 * @param selection
-	 * @param suppressed
-	 * @return {@link Result} object that contains the result of this call
-	 */
-	private Result setSuppressed(List selection, boolean suppressed) {
-		Result result = doSetSuppressed(selection, suppressed);
-
-		// if descriptors had been suppressed, related elements that are not
-		// used anywhere else also need to be suppressed (just like delete)
-		//	
-		if (!result.descriptors.isEmpty()) {
-			List descriptorsToSuppress = getOwnRelatedElements(
-					result.descriptors, suppressed);
-			if (descriptorsToSuppress != null) {
-				Result result2 = doSetSuppressed(descriptorsToSuppress,
-						suppressed);
-
-				// merge results
-				//
-				result.elements.addAll(result2.elements);
-				result.descriptors.addAll(result2.descriptors);
-				result.paths.addAll(result2.paths);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * @deprecated need to use {@link SuppressionCommand} instead
-	 */
-	public void suppress(List selection) {
-		doSetSuppressed(selection, true);
-	}
-
-	// public boolean suppress(List selection) {
-	// ArrayList suppressedDescriptors = new ArrayList();
-	// boolean ret = suppress(selection, suppressedDescriptors);
-	//		
-	// // if descriptors had been suppressed, related elements that are not used
-	// anywhere else also need to be suppressed (just like delete)
-	// //
-	// List descriptorsToSuppress = getOwnRelatedElements(suppressedDescriptors,
-	// true);
-	// if(descriptorsToSuppress != null) {
-	// ArrayList out = new ArrayList();
-	// boolean ret2 = suppress(descriptorsToSuppress, out);
-	// if(out.size() != descriptorsToSuppress.size()) {
-	// LibraryEditPlugin.getDefault().getLogger().logError("Suppression.suppress(List)
-	// is buggy."); //$NON-NLS-1$
-	// }
-	// return ret || ret2;
-	// }
-	// return ret;
-	// }
-
-	private static class Result {
-		/** Elements that have been suppressed or revealed */
-		Collection elements;
-
-		/** Descriptors that have been suppressed or revealed */
-		Collection descriptors;
-
-		/**
-		 * Paths that have been added to or removed from
-		 * <code>suppressedExternalElementPaths</code>
-		 */
-		Collection paths;
-
-		Result() {
-			elements = new ArrayList();
-			descriptors = new ArrayList();
-			paths = new ArrayList();
-		}
-
-		boolean isEmpty() {
-			return elements.isEmpty() && paths.isEmpty();
-		}
-
-		void clear() {
-			elements.clear();
-			descriptors.clear();
-			paths.clear();
-		}
-	}
-
-	/**
-	 * Suppresses or reveals the given selection depending on the value of
-	 * <code>suppressed</code>
-	 * 
-	 * @param selection
-	 * @param suppressed
-	 * @return
-	 */
-	private Result doSetSuppressed(List selection, boolean suppressed) {
-		Result result = new Result();
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if (element instanceof BreakdownElementWrapperItemProvider) {
-				BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) element;
-				// if (!isSuppressed(wrapper)) {
-				BreakdownElement e = (BreakdownElement) TngUtil.unwrap(wrapper);
-				if (!wrapper.isReadOnly()) {
-					// wrapper of local element
-					//
-					if (e.getSuppressed().booleanValue() != suppressed) {
-						e.setSuppressed(Boolean.valueOf(suppressed));
-						result.elements.add(e);
-						if (e instanceof Descriptor) {
-							result.descriptors.add(e);
-						}
-					}
-				} else {
-					// add the paths of suppressed element to the map
-					//
-					String path = getPath(wrapper);
-					boolean b;
-					if (suppressed) {
-						b = getSuppressedExternalElementPaths().add(path);
-					} else {
-						b = getSuppressedExternalElementPaths().remove(path);
-					}
-					if (b) {
-						result.paths.add(path);
-					}
-					// }
-				}
-			} else if (element instanceof MethodElement) {
-				MethodElement e = ((MethodElement) element);
-				if (e.getSuppressed().booleanValue() != suppressed) {
-					e.setSuppressed(Boolean.valueOf(suppressed));
-					result.elements.add(e);
-					if (e instanceof Descriptor) {
-						result.descriptors.add(e);
-					}
-				}
-			}
-		}
-		modified = !result.isEmpty();
-		return result;
-	}
-
-	// private boolean suppress(List selection, Collection
-	// suppressedDescriptors) {
-	// boolean readOnlyElementSuppressed = false;
-	// for (Iterator iter = selection.iterator(); iter.hasNext();) {
-	// Object element = (Object) iter.next();
-	// if (element instanceof BreakdownElementWrapperItemProvider) {
-	// BreakdownElementWrapperItemProvider wrapper =
-	// (BreakdownElementWrapperItemProvider) element;
-	// if (!isSuppressed(wrapper)) {
-	// BreakdownElement e = (BreakdownElement) TngUtil
-	// .unwrap(wrapper);
-	// if (!wrapper.isReadOnly()) {
-	// // wrapper of local element
-	// //
-	// e.setSuppressed(Boolean.TRUE);
-	// if(e instanceof Descriptor) {
-	// suppressedDescriptors.add(e);
-	// }
-	// } else {
-	// // add the paths of suppressed element to the map
-	// //
-	// String path = getPath(wrapper);
-	// getSuppressedExternalElementPaths().add(path);
-	// readOnlyElementSuppressed = true;
-	// }
-	// }
-	// } else if (element instanceof MethodElement) {
-	// ((MethodElement) element).setSuppressed(Boolean.TRUE);
-	// if(element instanceof Descriptor) {
-	// suppressedDescriptors.add(element);
-	// }
-	// }
-	// }
-	// modified = true;
-	// return readOnlyElementSuppressed;
-	// }
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	public boolean hasUnsuppressed(List selection) {
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof BreakdownElementWrapperItemProvider) {
-				if (!isSuppressed((BreakdownElementWrapperItemProvider) element)) {
-					return true;
-				}
-			} else if (element instanceof BreakdownElement) {
-				if (!isSuppressed((BreakdownElement) element)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return Returns the modified.
-	 */
-	public boolean isSaveNeeded() {
-		return modified;
-	}
-
-	public void saveIsDone() {
-		modified = false;
-	}
-	
-	protected boolean __isSuppressed(ComposedBreakdownElementWrapperItemProvider composedWrapper) {
-		for (Iterator iter = composedWrapper.getValues().iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if(!isSuppressed(element)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * check if the element, or the item provider or adaptor associated with the
-	 * element is suppressed.
-	 * 
-	 * @param e
-	 *            MethodElement or an associated wrapper, adaptor, or item
-	 *            provider, etc.
-	 * @return boolean
-	 */
-	public boolean isSuppressed(Object e) {
-		// long start = System.currentTimeMillis();
-
-		try {
-
-			if (e == null) {
-				return true;
-			}
-			
-			ComposedBreakdownElementWrapperItemProvider composedWrapper = ProcessUtil.getComposedWrapper(e);
-			if(composedWrapper != null) {
-				return __isSuppressed(composedWrapper);
-			}
-
-			if (internalUnsuppressedElements.contains(e)) {
-				return false;
-			}
-
-			if (e instanceof BreakdownElementWrapperItemProvider) {
-				return __isSuppressed((BreakdownElementWrapperItemProvider) e);
-			} else if (e instanceof BreakdownElement) {
-				return __isSuppressed((BreakdownElement) e);
-			} else {
-				Object targetObj = null;
-				if (e instanceof WrapperItemProvider) {
-					targetObj = ((WrapperItemProvider) e).getValue();
-				} else if (e instanceof ItemProviderAdapter) {
-					targetObj = ((ItemProviderAdapter) e).getTarget();
-				}
-
-				if (targetObj != null && targetObj != e) {
-					return isSuppressed(targetObj);
-				}
-			}
-
-			return false;
-
-		} finally {
-			// long time = (System.currentTimeMillis() - start);
-			// if(time > 1000) {
-			// BreakdownElement be = (BreakdownElement)TngUtil.unwrap(e);
-			// String msg = "Suppression.isSuppressed(): time taken (ms) " +
-			// time +
-			// "\n process: " + (e instanceof
-			// BreakdownElementWrapperItemProvider ?
-			// ((BreakdownElementWrapperItemProvider)e).getTopItem() :
-			// TngUtil.getOwningProcess(be)) +
-			// "\n element: " + ProcessUtil.getLabelWithPath(be);
-			//				
-			// System.out.println(msg);
-			// LibraryEditPlugin.getDefault().getLogger().logInfo(msg);
-			// }
-		}
-	}
-
-	/**
-	 * Updates the suppression state of the given <code>wrapper</code> from
-	 * its base.
-	 * 
-	 * @param wrapper
-	 * @return <code>true</code> if this call modified the suppression state
-	 *         of the given wrapper, <code>false</code> otherwise
-	 */
-	public boolean updateSuppressionFromBase(
-			BreakdownElementWrapperItemProvider wrapper) {
-		String path = getPath(wrapper);
-		boolean ret;
-		BreakdownElement e = getSuppressed(wrapper, true, false, true, false,
-				null);
-		if (e != null) {
-			ret = getSuppressedExternalElementPaths().add(path);
-		} else {
-			ret = getSuppressedExternalElementPaths().remove(path);
-		}
-		if (ret) {
-			modified = true;
-		}
-		return ret;
-	}
-
-	/**
-	 * Excludes the descriptors with the same linked element from the check
-	 * 
-	 * @param selectionToReveal
-	 * @return
-	 */
-	public String checkDuplicateNameAfterReveal(
-			Collection selectionToRevealOrSuppress,
-			AdapterFactory adapterFactory) {
-		Collection elementsToReveal = getApplicableItems(
-				selectionToRevealOrSuppress, false);
-		for (Iterator iter = elementsToReveal.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof BreakdownElement) {
-				BreakdownElement be = (BreakdownElement) element;
-				String msg = ProcessUtil.checkBreakdownElementName(
-						adapterFactory, be, be.getName(), this);
-				if (msg != null) {
-					return LibraryEditResources.Suppression_nameDuplication; 
-				}
-				msg = ProcessUtil.checkBreakdownElementPresentationName(
-						adapterFactory, be, be.getPresentationName(), this);
-				if (msg != null) {
-					return LibraryEditResources.Suppression_presentationNameDuplication; 
-				}
-			} else {
-				Object unwrapped = TngUtil.unwrap(element);
-				if (unwrapped instanceof BreakdownElement) {
-					ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-							.adapt(element, ITreeItemContentProvider.class);
-					Object parent = itemProvider.getParent(element);
-					if (parent instanceof BreakdownElement) {
-						itemProvider = (ITreeItemContentProvider) adapterFactory
-								.adapt(parent, ITreeItemContentProvider.class);
-						Collection siblings = itemProvider.getChildren(parent);
-						Object linkedElement = null;
-						if (element instanceof Descriptor) {
-							linkedElement = ProcessUtil
-									.getAssociatedElement((Descriptor) element);
-						}
-						try {
-							internalUnsuppressedElements.add(element);
-							nameCheckLoop: for (Iterator iterator = siblings
-									.iterator(); iterator.hasNext();) {
-								Object sibling = iterator.next();
-								if (sibling instanceof BreakdownElement) {
-									BreakdownElement be = (BreakdownElement) sibling;
-									// skip checking on suppressed element
-									//
-									if (be.getSuppressed().booleanValue()) {
-										continue nameCheckLoop;
-									}
-									if (linkedElement != null
-											&& sibling instanceof Descriptor) {
-										// skip checking on descriptors with the
-										// same linked element
-										//
-										Object otherLinkedElement = ProcessUtil
-												.getAssociatedElement((Descriptor) element);
-										if (otherLinkedElement == linkedElement) {
-											continue nameCheckLoop;
-										}
-									}
-									String msg = ProcessUtil
-											.checkBreakdownElementName(
-													adapterFactory, be, be
-															.getName(), this);
-									if (msg != null) {
-										return LibraryEditResources.Suppression_nameDuplication; 
-									}
-									msg = ProcessUtil
-											.checkBreakdownElementPresentationName(
-													adapterFactory, be,
-													be.getPresentationName(),
-													this);
-									if (msg != null) {
-										return LibraryEditResources.Suppression_presentationNameDuplication; 
-									}
-								}
-							}
-						} finally {
-							internalUnsuppressedElements.remove(element);
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public Object getObjectByPath(String[] guidPath,
-			AdapterFactory adapterFactory) {
-		if (guidPath.length == 0 || adapterFactory == null
-				|| !guidPath[0].equals(process.getGuid())) {
-			return null;
-		}
-
-		Object object = process;
-		int len = guidPath.length;
-		for (int i = 1; i < len; i++) {
-			ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-					.adapt(object, ITreeItemContentProvider.class);
-			boolean found = false;
-
-			// if current object is an activity, make sure it is rolled down
-			// before looking into its children
-			//
-			IBSItemProvider rolledUpAdapter = null;
-			Iterator iter = null;
-			try {
-				if (TngUtil.unwrap(object) instanceof Activity) {
-					if (adapter instanceof BSActivityItemProvider) {
-						BSActivityItemProvider activityItemProvider = (BSActivityItemProvider) adapter;
-						if (activityItemProvider.isRolledUp()) {
-							activityItemProvider.basicSetRolledUp(false);
-							rolledUpAdapter = activityItemProvider;
-						}
-					} else if (adapter instanceof IBSItemProvider) {
-						IBSItemProvider itemProvider = (IBSItemProvider) adapter;
-						if (itemProvider.isRolledUp()) {
-							itemProvider.setRolledUp(false);
-							rolledUpAdapter = itemProvider;
-						}
-					}
-				}
-				iter = adapter.getChildren(object).iterator();
-			} finally {
-				if (rolledUpAdapter != null) {
-					rolledUpAdapter.setRolledUp(true);
-				}
-			}
-
-			find_child: while (iter.hasNext()) {
-				Object child = iter.next();
-				Object e = TngUtil.unwrap(child);
-				if (e instanceof MethodElement
-						&& ((MethodElement) e).getGuid().equals(guidPath[i])) {
-					found = true;
-					object = child;
-					break find_child;
-				}
-			}
-
-			if (!found) {
-				return null;
-			}
-		}
-		return object;
-	}
-
-	/**
-	 * Checks if the breakdown element identified by the given
-	 * <code>guidPath</code> is suppressed in the process of this Suppression
-	 * object
-	 * 
-	 * @param guidPath
-	 * @return
-	 * @exception IllegalArgumentException
-	 *                if the object with the given path could not be found using
-	 *                the given adapter factory
-	 */
-	public boolean isSuppressed(String[] guidPath, AdapterFactory adapterFactory)
-			throws IllegalArgumentException {
-		Object object = getObjectByPath(guidPath, adapterFactory);
-		if (object == null) {
-			throw new IllegalArgumentException(
-					"Could not find object with path '" + guidPath + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return isSuppressed(object);
-	}
-
-	/**
-	 * Gets the set of suppressed item of the given processes.
-	 * 
-	 * @param proc
-	 * @param adapterFactories
-	 *            the adapter factories for WBS, TBS, WPBS, and CBS views
-	 * @return
-	 */
-	public static Set getSuppressedItems(Process proc,
-			AdapterFactory[] adapterFactories) {
-		Set suppressedItems = new HashSet();
-		Suppression suppression = new Suppression(proc);
-		for (int i = 0; i < adapterFactories.length; i++) {
-			for (Iterator iter = new AdapterFactoryTreeIterator(
-					adapterFactories[i], proc); iter.hasNext();) {
-				Object item = iter.next();
-				if (suppression.isSuppressed(item)) {
-					suppressedItems.add(item);
-				}
-			}
-		}
-		return suppressedItems;
-	}
-
-	public static class SuppressionCommand extends AbstractCommand implements
-			IResourceAwareCommand {
-		protected Collection modifiedResources;
-
-		protected List collection;
-
-		protected Result result;
-
-		protected boolean suppressed;
-
-		protected Suppression suppression;
-
-		public SuppressionCommand(Suppression suppression, List selection,
-				boolean suppressed) {
-			this.suppression = suppression;
-			collection = selection;
-			this.suppressed = suppressed;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
-		 */
-		public Collection getModifiedResources() {
-			if (modifiedResources == null) {
-				modifiedResources = Collections.singletonList(suppression
-						.getProcess().eResource());
-			}
-			return modifiedResources;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.command.Command#execute()
-		 */
-		public void execute() {
-			result = suppression.setSuppressed(collection, suppressed);
-			didExecute();
-		}
-
-		/**
-		 * 
-		 */
-		protected void didExecute() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.command.Command#redo()
-		 */
-		public void redo() {
-			execute();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.command.AbstractCommand#undo()
-		 */
-		public void undo() {
-			if (result != null && !result.isEmpty()) {
-				if (!result.elements.isEmpty()) {
-					for (Iterator iter = result.elements.iterator(); iter
-							.hasNext();) {
-						MethodElement e = (MethodElement) iter.next();
-						e.setSuppressed(Boolean.valueOf(!suppressed));
-					}
-				}
-				if (!result.paths.isEmpty()) {
-					for (Iterator iter = result.paths.iterator(); iter
-							.hasNext();) {
-						Object path = iter.next();
-						if (suppressed) {
-							suppression.getSuppressedExternalElementPaths()
-									.remove(path);
-						} else {
-							suppression.getSuppressedExternalElementPaths()
-									.add(path);
-						}
-					}
-				}
-				didUndo();
-				result.clear();
-			}
-		}
-
-		/**
-		 * 
-		 */
-		protected void didUndo() {
-
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.command.AbstractCommand#prepare()
-		 */
-		protected boolean prepare() {
-			return true;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.command.AbstractCommand#getResult()
-		 */
-		public Collection getResult() {
-			if (!result.isEmpty()) {
-				return collection;
-			}
-			return Collections.EMPTY_LIST;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
-		 */
-		public Collection getAffectedObjects() {
-			return collection;
-		}
-
-		public boolean isReadOnlyElementAffected() {
-			return !result.paths.isEmpty();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.command.AbstractCommand#dispose()
-		 */
-		public void dispose() {
-			if (result != null) {
-				result.clear();
-			}
-
-			super.dispose();
-		}
-	}
-
-	/**
-	 * @param obj
-	 * @return physical state of the processElement
-	 */
-	public boolean isItselfSuppressed(Object obj){
-		if(obj instanceof ProcessElement){
-			return ((ProcessElement)obj).getSuppressed();
-		}
-		
-		if(obj instanceof BreakdownElementWrapperItemProvider && ProcessUtil.isInherited(obj)){
-			return isInSuppressedList((BreakdownElementWrapperItemProvider)obj);
-		}
-		
-		if(obj instanceof BreakdownElementWrapperItemProvider && !ProcessUtil.isInherited(obj)){
-			Object object = TngUtil.unwrap(obj);
-			return ((MethodElement)object).getSuppressed();
-		}
-				
-		return false;
-	}
-	
-	public boolean isSuppressed(Object obj, EStructuralFeature feature) {
-		return isSuppressed(obj);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/TngUtil.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/TngUtil.java
deleted file mode 100644
index bb9dec9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/TngUtil.java
+++ /dev/null
@@ -1,3001 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandWrapper;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMapUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.MoveCommand;
-import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.provider.AttributeValueWrapperItemProvider;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.FeatureMapEntryWrapperItemProvider;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
-import org.eclipse.epf.library.edit.IDefaultNameSetter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.IGroupContainer;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.PresentationContext;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.category.CustomCategoryItemProvider;
-import org.eclipse.epf.library.edit.category.DisciplineItemProvider;
-import org.eclipse.epf.library.edit.category.RoleSetItemProvider;
-import org.eclipse.epf.library.edit.category.StandardCategoriesItemProvider;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.element.ContentPackageItemProvider;
-import org.eclipse.epf.library.edit.navigator.ContentItemProvider;
-import org.eclipse.epf.library.edit.navigator.MethodPluginItemProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.process.command.MoveDownCommand;
-import org.eclipse.epf.library.edit.process.command.MoveUpCommand;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-import org.eclipse.epf.library.edit.util.model.util.StringResource;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.library.edit.validation.UniqueNameHandler;
-import org.eclipse.epf.services.IAccessController;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.provider.MethodElementItemProvider;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-import org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.epf.uma.util.UmaResources;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.util.StringTokenizer;
-
-
-/**
- * Utility class with static methods for method authoring
- * 
- * @author Phong Nguyen Le
- * @author Jinhua Xi
- * @since 1.0
- */
-public final class TngUtil {
-
-	public static final UmaItemProviderAdapterFactory umaItemProviderAdapterFactory = new UmaItemProviderAdapterFactory();
-
-	public static final boolean DEBUG = LibraryEditPlugin.getPlugin()
-			.isDebugging();
-
-	public static final String GUIDANCE_FILESTRING_SEPARATOR = "|"; //$NON-NLS-1$
-
-	private static final String GUIDANCE_FILESTRING_SEPARATOR_SPLITTER = "\\|"; //$NON-NLS-1$
-	
-	public static final String PUBLISH_CATEGORY_PROPERTY = "PUBLISH_CATEGORY"; //$NON-NLS-1$
-	
-	/**
-	 * Removes all adapters that are instance of the given class from the given
-	 * EObject.
-	 * 
-	 * @param eObj
-	 * @param cls
-	 */
-	public static void removeAdapters(EObject eObj, Class cls) {
-		for (Iterator adapters = eObj.eAdapters().iterator(); adapters
-				.hasNext();) {
-			Adapter adapter = (Adapter) adapters.next();
-			if (cls.isInstance(adapter)) {
-				adapters.remove();
-			}
-		}
-	}
-
-	public static Object getAdapter(EObject eObj, Class cls) {
-		for (Iterator adapters = eObj.eAdapters().iterator(); adapters
-				.hasNext();) {
-			Adapter adapter = (Adapter) adapters.next();
-			if (cls.isInstance(adapter)) {
-				return adapter;
-			}
-		}
-		return null;
-	}
-
-	public static Adapter adapt(AdapterFactory factory, Notifier notifier,
-			Object type, Class viewType) {
-		for (Iterator adapters = notifier.eAdapters().iterator(); adapters
-				.hasNext();) {
-			Adapter adapter = (Adapter) adapters.next();
-			if (adapter.isAdapterForType(type) && viewType.isInstance(adapter)) {
-				return adapter;
-			}
-		}
-		return factory.adaptNew(notifier, type);
-	}
-
-	public static boolean isValidFileName(String name) {
-		if (StrUtil.isBlank(name))
-			return false;
-		if (name.indexOf('/') != -1 || name.indexOf('\\') != -1
-				|| name.indexOf(':') != -1 || name.indexOf('*') != -1
-				|| name.indexOf('?') != -1 || name.indexOf('"') != -1
-				|| name.indexOf('<') != -1 || name.indexOf('>') != -1
-				|| name.indexOf('|') != -1 || name.indexOf(';') != -1)
-			return false;
-		return true;
-	}
-	
-	/**
-	 * validate the string for a plugin name
-	 * 
-	 * @param name String
-	 * @return String
-	 */
-	public static boolean isValidPluginName(String name) {
-		if (isValidFileName(name) == false ) {
-			return false;
-		}
-		
-		// need to remove these characters since they caused problem with element url encoding, bookmark issue, 
-		// and javascript string liternal escaping issue
-		// see 156946 - plugin name should not allow %, #, and '
-		if (name.indexOf('%') != -1 || name.indexOf('#') != -1
-				|| name.indexOf('\'') != -1 )
-			return false;
-		return true;
-	}
-
-	/**
-	 * Checks if the given name is valid for the given EObject.
-	 * 
-	 * @param eObj
-	 * @param name
-	 * @param eClasses
-	 *            collection of EClass objects. The EObject instances of these
-	 *            EClass objects will be saved in their own directory.
-	 * @return null if successful, error message otherwise.
-	 */
-	public static String checkName(NamedElement e, String name,
-			Collection eClasses) {
-		return checkName(((EObject) e).eContainer(), e, name, TngUtil
-				.getTypeText(e), eClasses);
-	}
-
-	public static String checkName(EObject parent, NamedElement e, String name,
-			String elementTypeText, Collection eClasses) {
-		String msg = checkElementName(name, elementTypeText);
-		if (msg != null)
-			return msg;
-		if (parent == null)
-			return null;
-		List children = parent.eContents();
-		for (int i = 0; i < children.size(); i++) {
-			NamedElement child = (NamedElement) children.get(i);
-			if (child != e && isEClassInstanceOf(eClasses, child)
-					&& name.equalsIgnoreCase(child.getName())) {
-				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-				return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
-			}
-		}
-		return null;
-	}
-
-	public static String checkName(EObject parent, NamedElement e, String name,
-			String elementTypeText, IFilter childFilter) {
-		String msg = checkElementName(name, elementTypeText);
-		if (msg != null)
-			return msg;
-		if (parent == null)
-			return null;
-		List children = parent.eContents();
-		for (int i = 0; i < children.size(); i++) {
-			NamedElement child = (NamedElement) children.get(i);
-			if (child != e && childFilter.accept(child)
-					&& name.equalsIgnoreCase(child.getName())) {
-				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-				return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Checks if the given name can be used for the given element. The method
-	 * assume that the given element will be saved under the given directory
-	 * using the given name.
-	 * 
-	 * @param dir
-	 *            Directory where the given element will be saved in a file or a
-	 *            directory depending on the value of isDir
-	 * @param siblings
-	 *            exisiting siblings of the given element <code>e</code>
-	 * @param e
-	 *            the element its name to be checked.
-	 * @param name
-	 *            the suggested new name for the given element <code>e</code>
-	 * @param typeLabel
-	 *            the element type label.
-	 * @param isDir
-	 *            flag indicating whether the given element will be saved a
-	 *            directory
-	 * @return null if the given name can be used, an error message if the name
-	 *         is already taken.
-	 */
-	public static String checkName(File dir, Collection siblings,
-			NamedElement e, String name, String elementTypeText, boolean isDir) {
-		String msg = checkElementName(name, elementTypeText);
-		if (msg != null)
-			return msg;
-		String fileName = name;
-		if (!isDir) {
-			fileName = fileName + ((IFileBasedLibraryPersister)Services.getDefaultLibraryPersister()).getFileExtension(e);
-		}
-		File file = new File(dir, fileName);
-		File currentFile = null;
-		if (e != null && e.eResource() != null) {
-			currentFile = new File(e.eResource().getURI().toFileString());
-			if (isDir) {
-				currentFile = currentFile.getParentFile();
-			}
-		}
-		boolean b = file.exists();
-		if (b && !file.equals(currentFile)) {
-			msg = NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name);
-			/* TODO: is this needed? After calling NLS.bind, there will	not be any placeholders left for params.
-			Object[] params = new Object[2];
-			if (file.isFile()) {
-				params[0] = LibraryEditResources.file_text; 
-			} else {
-				params[0] = LibraryEditResources.directory_text; 
-			}
-			params[1] = file;
-			return MessageFormat.format(msg, params).toString();
-			*/
-			return msg;
-		}
-		for (Iterator iter = siblings.iterator(); iter.hasNext();) {
-			NamedElement child = (NamedElement) iter.next();
-			if (child != e && name.equalsIgnoreCase(child.getName())) {
-				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-				return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
-			}
-		}
-		// 
-		return null;
-
-	}
-
-	public static String checkElementName(String name, String elementTypeText) {
-		if (name == null || name.trim().length() == 0)
-			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-			return NLS.bind(LibraryEditResources.emptyElementNameError_msg, StrUtil.toLower(elementTypeText)); 
-		if (name.startsWith(" ")) //$NON-NLS-1$
-			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-			return NLS.bind(LibraryEditResources.invalidElementNameError1_msg, name); 
-		if (name.endsWith(".")) //$NON-NLS-1$
-			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-			return NLS.bind(LibraryEditResources.invalidElementNameError2_msg, name); 		
-		if (!isValidFileName(name))
-			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-			return NLS.bind(LibraryEditResources.invalidElementNameError3_msg, name); 
-		return null;
-	}
-
-	public static String checkPluginName(String name) {
-	
-		String error = checkElementName(name, TngUtil.getTypeText("MethodPlugin") ); //$NON-NLS-1$
-		if ( error != null ) {
-			return error;
-		}
-		
-		// 156946 - plugin name should not allow %, #, and '
-		if (!isValidPluginName(name) ) {
-			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-			return NLS.bind(LibraryEditResources.invalidPluginNameError_msg, name); 
-		} else {
-			return null;
-		}
-		
-	}
-	
-	public static String checkActivityName(AdapterFactory adapterFactory,
-			Object object, String name, Suppression suppression) {
-		if (!(object instanceof Activity))
-			return null;
-		// if(!isValidFileName(name)) return "Invalid name: '" + name + "'. The
-		// name cannot contain following characters: \\ / : * ? \" < > |";
-		return NameChecker.checkName(adapterFactory, (BreakdownElement) object, Activity.class,
-				UmaPackage.eINSTANCE.getNamedElement_Name(), name, suppression);
-	}
-
-//	public static String checkWBSActivityName(Object act, String name) {
-//		return checkActivityName(TngAdapterFactory.INSTANCE
-//				.getWBS_ComposedAdapterFactory(), act, name);
-//	}
-
-	public static String checkWBSActivityPresentationName(Object act,
-			String name, Suppression suppression) {
-		if (!(act instanceof Activity))
-			return null;
-		return NameChecker.checkName(TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory(), (BreakdownElement) act, Activity.class,
-				UmaPackage.eINSTANCE.getDescribableElement_PresentationName(),
-				name, suppression);
-	}
-
-	public static String checkWorkBreakdownElementPresentationName(Object e,
-			String name, Suppression suppression) {
-		if (!(e instanceof WorkBreakdownElement))
-			return null;
-		return NameChecker.checkName(TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory(), (BreakdownElement) e,
-				WorkBreakdownElement.class, UmaPackage.eINSTANCE
-						.getDescribableElement_PresentationName(), name, suppression);
-	}
-
-	public static String checkWorkProductDescriptorPresentationName(Object e,
-			String name, Suppression suppression) {
-		if (!(e instanceof WorkProductDescriptor))
-			return null;
-		return NameChecker.checkName(TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory(), (BreakdownElement) e,
-				WorkProductDescriptor.class, UmaPackage.eINSTANCE
-						.getDescribableElement_PresentationName(), name, suppression);
-	}
-
-	public static String checkRoleDescriptorPresentationName(Object e,
-			String name, Suppression suppression) {
-		if (!(e instanceof RoleDescriptor))
-			return null;
-		return NameChecker.checkName(TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory(), (BreakdownElement) e, RoleDescriptor.class,
-				UmaPackage.eINSTANCE.getDescribableElement_PresentationName(),
-				name, suppression);
-	}
-
-	public static boolean isEClassInstanceOf(Collection eClasses, Object obj) {
-		for (Iterator iter = eClasses.iterator(); iter.hasNext();) {
-			EClass eClass = (EClass) iter.next();
-			if (eClass.isInstance(obj))
-				return true;
-		}
-		return false;
-	}
-
-	public static boolean isInstanceOf(Collection classes, Object obj) {
-		for (Iterator iter = classes.iterator(); iter.hasNext();) {
-			Class clazz = (Class) iter.next();
-			if (clazz.isInstance(obj))
-				return true;
-		}
-		return false;
-	}
-
-	public static AdapterFactory getBestAdapterFactory(
-			AdapterFactory adapterFactory) {
-		if (adapterFactory instanceof ComposeableAdapterFactory) {
-			return ((ComposeableAdapterFactory) adapterFactory)
-					.getRootAdapterFactory();
-		}
-		return adapterFactory;
-	}
-
-	/**
-	 * @param object
-	 */
-	public static String getLabel(Object object) {
-		return getLabel(object, ""); //$NON-NLS-1$
-	}
-
-	public static String getLabel(Object object, String alternativeLabel) {
-		if (object instanceof ContentDescription) {
-			return getLabel(((ContentDescription) object).eContainer(), alternativeLabel);
-		}
-		
-		if (object instanceof EObject) {
-			EObject eObj = (EObject) object;
-			if (eObj.eIsProxy()) {
-				String path = null;
-				try {
-					org.eclipse.emf.common.util.URI uri = eObj.eResource().getResourceSet().getURIConverter()
-							.normalize(((InternalEObject) eObj).eProxyURI());
-					path = uri.isFile() ? uri.toFileString() : uri.toString();
-				} catch (Exception e) {
-					//
-				}
-				if (path != null) {
-					path = MessageFormat.format(
-							" ''{0}''", new Object[] { path }); //$NON-NLS-1$
-				} else {
-					path = ""; //$NON-NLS-1$
-				}
-				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-				return NLS.bind(LibraryEditResources.unresolved_text, path); 
-			}
-		}
-		String label = null;
-		boolean showPresentationNames = PresentationContext.INSTANCE.isShowPresentationNames();
-		if (showPresentationNames && object instanceof DescribableElement)
-			label = ((DescribableElement) object).getPresentationName();
-		else if (showPresentationNames && object instanceof ProcessComponent)
-			label = ((ProcessComponent) object).getProcess()
-					.getPresentationName();
-		if (label == null || label.trim().length() == 0)
-			label = ((NamedElement) object).getName();
-		return label == null || label.trim().length() == 0 ? alternativeLabel : label;
-	}
-
-	public static String getLabel(VariabilityElement object,
-			String alternativeLabel, boolean preferBase) {
-		String label = TngUtil.getLabel(object, alternativeLabel);
-		if (preferBase && object.getVariabilityBasedOnElement() != null) {
-			VariabilityType type = object.getVariabilityType();
-			String variabilityTxt = null;
-			if (type == VariabilityType.CONTRIBUTES_LITERAL) {
-				variabilityTxt = LibraryEditResources.contributesTo_text; 
-			} else if (type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-					variabilityTxt = LibraryEditResources.localContributesTo_text; 
-			} else if (type == VariabilityType.EXTENDS_LITERAL) {
-				variabilityTxt = LibraryEditResources.extends_text; 
-			} else if (type == VariabilityType.REPLACES_LITERAL) {
-				variabilityTxt = LibraryEditResources.replaces_text; 
-			} else if (type == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-				variabilityTxt = LibraryEditResources.localReplaces_text; 
-			} else if (type == VariabilityType.EXTENDS_REPLACES_LITERAL){
-				variabilityTxt = LibraryEditResources.extends_replaces_text;
-			}
-			if (variabilityTxt != null) {
-				MethodPlugin basePlugin = UmaUtil.getMethodPlugin(object
-						.getVariabilityBasedOnElement());
-				if (basePlugin != null) {
-					label = NLS.bind(LibraryEditResources.Util_labelpath_variabilitywithplugin_info, (new String[] {
-					label,
-					variabilityTxt,
-					TngUtil
-							.getLabel(
-									object
-											.getVariabilityBasedOnElement(),
-									alternativeLabel),
-					basePlugin.getName() }));
-				} else {
-					label = NLS.bind(LibraryEditResources.Util_labelpath_variability_info, (new String[] {
-					label,
-					variabilityTxt,
-					TngUtil.getLabel(object
-							.getVariabilityBasedOnElement(),
-							alternativeLabel) }));
-				}
-			}
-		}
-
-		return label;
-	}
-
-	/**
-	 * Initializes a newly created ProcessComponent
-	 * 
-	 * @param component
-	 */
-	public static void initializeProcessComponent(ProcessComponent component,
-			EClass type) {
-		// create new process for the process component
-		//
-		Process proc = component.getProcess();
-		if (proc == null) {
-			proc = (Process) UmaFactory.eINSTANCE.create(type);
-			component.setProcess(proc);
-		}
-
-		// create top activity
-		//
-		// if(proc.getTopLevelBreakdownElement() == null) {
-		// Activity act = UmaFactory.eINSTANCE.createActivity();
-		// proc.setTopLevelBreakdownElement(act);
-		// component.getBreakdownElements().add(act);
-		// }
-
-		// create WBS, OBS, and PBS
-		//
-		// if(component.getWBS() == null)
-		// component.setWBS(UmaFactory.eINSTANCE.createWBS());
-		// if(component.getTBS() == null)
-		// component.setTBS(UmaFactory.eINSTANCE.createTBS());
-		// if(component.getWPBS() == null)
-		// component.setWPBS(UmaFactory.eINSTANCE.createWPBS());
-	}
-
-	public static BreakdownElement getParent(BreakdownElement be) {
-		return null;
-	}
-
-	public static String checkNull(String str) {
-		return (str == null ? "" : str); //$NON-NLS-1$
-	}
-
-	public static boolean descriptorExists(Role role, List roleDescriptorList) {
-		for (int i = roleDescriptorList.size() - 1; i > -1; i--) {
-			RoleDescriptor roleDesc = (RoleDescriptor) roleDescriptorList
-					.get(i);
-			if (roleDesc.getRole() == role)
-				return true;
-		}
-		return false;
-	}
-
-	public static MethodElement copy(MethodElement element) {
-		Copier copier = new Copier() {
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 3257846576033904691L;
-
-			/**
-			 * Called to handle the copying of a cross reference; this adds
-			 * values or sets a single value as appropriate for the multiplicity
-			 * while omitting any bidirectional reference or single opposite
-			 * feature's reference that isn't in the copy map.
-			 * 
-			 * @param eReference
-			 *            the reference to copy.
-			 * @param eObject
-			 *            the object from which to copy.
-			 * @param copyEObject
-			 *            the object to copy to.
-			 */
-			protected void copyReference(EReference eReference,
-					EObject eObject, EObject copyEObject) {
-				if (eObject.eIsSet(eReference)) {
-					OppositeFeature oppositeFeature = OppositeFeature.getOppositeFeature(eReference);
-					
-					// "many" opposite feature does not require copied target, it is
-					// treated as a regular non-containment reference
-					// TODO: bidirectional relationships are not automatically copied in
-					// EMF implementation
-					//
-					boolean copiedTargetRequired = eReference.getEOpposite() != null
-							|| (oppositeFeature != null && !oppositeFeature.isMany());
-										
-					if (eReference.isMany()) {
-						List source = (List) eObject.eGet(eReference);
-						InternalEList target = (InternalEList) copyEObject
-								.eGet(getTarget(eReference));
-						if (source.isEmpty()) {
-							target.clear();
-						} else {
-							int index = 0;
-							for (Iterator k = source.iterator(); k.hasNext();) {
-								Object referencedEObject = k.next();
-								Object copyReferencedEObject = get(referencedEObject);
-								if (copyReferencedEObject == null) {
-									if (!copiedTargetRequired) {
-										target.addUnique(index,
-												referencedEObject);
-										++index;
-									}
-								} else {
-									if (copiedTargetRequired) {
-										int position = target
-												.indexOf(copyReferencedEObject);
-										if (position == -1) {
-											target.addUnique(index,
-													copyReferencedEObject);
-										} else if (index != position) {
-											target.move(index,
-													copyReferencedEObject);
-										}
-									} else {
-										target.addUnique(index,
-												copyReferencedEObject);
-									}
-									++index;
-								}
-							}
-						}
-					} else {
-						Object referencedEObject = eObject.eGet(eReference);
-						if (referencedEObject == null) {
-							copyEObject.eSet(getTarget(eReference), null);
-						} else {
-							Object copyReferencedEObject = get(referencedEObject);
-							if (copyReferencedEObject == null) {
-								if (!copiedTargetRequired) {
-									copyEObject.eSet(getTarget(eReference),
-											referencedEObject);
-								}
-							} else {
-								copyEObject.eSet(getTarget(eReference),
-										copyReferencedEObject);
-							}
-						}
-					}
-				}
-			}
-		};
-		MethodElement copy = (MethodElement) copier.copy(element);
-		copier.copyReferences();
-
-		// unset the GUID of the copy and its offstring
-		//
-		copy.setGuid(null);
-		for (Iterator iter = copy.eAllContents(); iter.hasNext();) {
-			Object e = iter.next();
-			if (e instanceof MethodElement) {
-				((MethodElement) e).setGuid(null);
-			}
-		}
-		return copy;
-	}
-
-	public static VariabilityElement getBase(VariabilityElement c) {
-		for (; c.getVariabilityBasedOnElement() != null; c = (VariabilityElement) c
-				.getVariabilityBasedOnElement())
-			;
-		return c;
-	}
-
-	public static ContentCategory findInherited(Collection inheritedList,
-			ContentCategory category) {
-		for (Iterator iter = inheritedList.iterator(); iter.hasNext();) {
-			ContentCategory element = (ContentCategory) iter.next();
-			if (element.getVariabilityBasedOnElement() != null
-					&& (element.getVariabilityBasedOnElement() == category || element
-							.getVariabilityBasedOnElement() == category
-							.getVariabilityBasedOnElement()))
-				return element;
-		}
-		return null;
-	}
-
-	public static ContentCategory removeInherited(List inheritedList,
-			ContentCategory category) {
-		for (Iterator iter = inheritedList.iterator(); iter.hasNext();) {
-			ContentCategory element = (ContentCategory) iter.next();
-			if (element.getVariabilityBasedOnElement() == category) {
-				iter.remove();
-				return element;
-			}
-		}
-		return null;
-	}
-	
-	public static ContentItemProvider getContentItemProvider(MethodPlugin plugin) {
-		MethodPluginItemProvider methodPluginItemProvider = (MethodPluginItemProvider)getAdapter(
-				plugin,	MethodPluginItemProvider.class);
-		methodPluginItemProvider.getChildren(plugin);
-		IGroupContainer groupContainer = (IGroupContainer) TngUtil.getAdapter(
-				(EObject) plugin, IGroupContainer.class);
-		if (groupContainer != null) {
-			return (ContentItemProvider) groupContainer
-					.getGroupItemProvider(LibraryEditPlugin.INSTANCE
-							.getString("_UI_Content_group")); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	public static StandardCategoriesItemProvider getStandardCategoriesItemProvider(MethodPlugin plugin) {
-		ContentItemProvider contentItemProvider = getContentItemProvider(plugin);
-		contentItemProvider.getChildren(contentItemProvider);
-		if (contentItemProvider != null) {
-			return (StandardCategoriesItemProvider)contentItemProvider.getGroupItemProvider(LibraryEditPlugin.INSTANCE
-					.getString("_UI_Standard_Categories_group")); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-
-	public static Object getDisciplineCategoriesItemProvider(MethodPlugin model) {
-		StandardCategoriesItemProvider standardCategoriesItemProvider = getStandardCategoriesItemProvider(model);
-		standardCategoriesItemProvider.getChildren(standardCategoriesItemProvider);
-		if (standardCategoriesItemProvider != null) {
-			return standardCategoriesItemProvider
-			.getGroupItemProvider(LibraryEditPlugin.INSTANCE
-					.getString("_UI_Disciplines_group")); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public static Object getDomainsItemProvider(MethodPlugin model) {
-		StandardCategoriesItemProvider standardCategoriesItemProvider = getStandardCategoriesItemProvider(model);
-		standardCategoriesItemProvider.getChildren(standardCategoriesItemProvider);
-		if (standardCategoriesItemProvider != null) {
-			return standardCategoriesItemProvider
-			.getGroupItemProvider(LibraryEditPlugin.INSTANCE
-					.getString("_UI_Domains_group")); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public static Object getWorkProductTypesItemProvider(MethodPlugin model) {
-		StandardCategoriesItemProvider standardCategoriesItemProvider = getStandardCategoriesItemProvider(model);
-		standardCategoriesItemProvider.getChildren(standardCategoriesItemProvider);
-		if (standardCategoriesItemProvider != null) {
-			return standardCategoriesItemProvider
-			.getGroupItemProvider(LibraryEditPlugin.INSTANCE
-					.getString("_UI_WorkProductTypes_group")); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public static Object getRoleSetsItemProvider(MethodPlugin model) {
-		StandardCategoriesItemProvider standardCategoriesItemProvider = getStandardCategoriesItemProvider(model);
-		standardCategoriesItemProvider.getChildren(standardCategoriesItemProvider);
-		if (standardCategoriesItemProvider != null) {
-			return standardCategoriesItemProvider
-			.getGroupItemProvider(LibraryEditPlugin.INSTANCE
-					.getString("_UI_Role_Sets_group")); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public static Object getToolsItemProvider(MethodPlugin model) {
-		StandardCategoriesItemProvider standardCategoriesItemProvider = getStandardCategoriesItemProvider(model);
-		standardCategoriesItemProvider.getChildren(standardCategoriesItemProvider);
-		if (standardCategoriesItemProvider != null) {
-			return standardCategoriesItemProvider
-			.getGroupItemProvider(LibraryEditPlugin.INSTANCE
-					.getString("_UI_Tools_group")); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	/**
-	 * Gets the next available name that is not already taken by any of the specified elements.
-	 * 
-	 * @param elements
-	 * @param e
-	 * @param baseName
-	 * @return baseName of baseName_X where is is the number starting from 2
-	 */
-	public static String getNextAvailableName(List<MethodElement> elements, String baseName) {
-		if(isNameTaken(elements, null, baseName)) {
-			for (int i = 2; true; i++) {
-				String name = baseName + '_' + i;
-				if (!isNameTaken(elements, null, name)) {
-					return name;
-				}
-			}
-		}
-		return baseName;
-	}
-
-
-	public static void setDefaultName(List<MethodElement> siblings, MethodElement e,
-			String baseName) {
-		if (e.getName() != null && e.getName().trim().length() > 0)
-			return;
-
-		if (!isNameTaken(siblings, e, baseName)) {
-			e.setName(baseName);
-			setPresentationName(e, baseName);
-			return;
-		}
-		for (int i = 2; true; i++) {
-			String name = baseName + '_' + i;
-			if (!isNameTaken(siblings, e, name)) {
-				e.setName(name);
-				setPresentationName(e, name);
-				return;
-			}
-		}
-	}
-		
-	public static void setDefaultName(CustomCategory parent, CustomCategory cc, String baseName) {
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(parent);
-		ContentPackage pkg = plugin == null ? null : UmaUtil.findContentPackage(plugin,
-				ModelStructure.DEFAULT.customCategoryPath);
-		if (pkg == null) {
-			TngUtil.setDefaultName(parent.getCategorizedElements(), cc, baseName);
-			return;
-		}
-		
-		UniqueNameHandler handler = new UniqueNameHandler();
-		handler.registerNames(pkg.getContentElements());
-		String name = handler.getUniqueName(baseName);
-		cc.setName(name);
-		cc.setPresentationName(name);
-	}
-
-	private static void setPresentationName(MethodElement e, String baseName) {
-		if (e instanceof DescribableElement) {
-			DescribableElement de = (DescribableElement) e;
-
-			StringBuffer presNameBuf = new StringBuffer();
-			StringTokenizer st = new StringTokenizer(baseName, "_"); //$NON-NLS-1$
-			while (st.hasMoreTokens()) {
-				String aWord = st.nextToken();
-				presNameBuf.append(aWord.substring(0, 1).toUpperCase()
-						+ aWord.substring(1) + " "); //$NON-NLS-1$
-			}
-
-			de.setPresentationName(presNameBuf.toString().trim());
-		}
-	}
-
-	private static boolean isNameTaken(List<MethodElement> siblings, MethodElement e,
-			String name) {
-		for (int i = siblings.size() - 1; i > -1; i--) {
-			MethodElement sibling = (MethodElement) siblings.get(i);
-			if (sibling != e && name.equalsIgnoreCase(sibling.getName())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public static List extract(Collection collection, Class cls) {
-		ArrayList list = new ArrayList();
-		for (Iterator iter = collection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (cls.isInstance(element)) {
-				list.add(element);
-			}
-		}
-		return list;
-	}
-
-	public static void setDefaultName(IDefaultNameSetter defaultNameSetter,
-			Notification msg) {
-		if (defaultNameSetter.getInterestedFeatureOwnerClass() != null) {
-			int featureId = msg.getFeatureID(defaultNameSetter
-					.getInterestedFeatureOwnerClass());
-			if (featureId == defaultNameSetter.getInterestedFeatureID()) {
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					defaultNameSetter.setDefaultName(msg.getNewValue());
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						defaultNameSetter.setDefaultName(iter.next());
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param baseCategory
-	 * @param methodConf
-	 * @param children
-	 */
-	public static void addExtendedChildren(ContentCategory baseCategory,
-			MethodConfiguration methodConf, Collection children,
-			String[] categoryPkgPath) {
-		MethodPlugin basePlugin = UmaUtil.getMethodPlugin(baseCategory);
-		for (Iterator iter = methodConf.getMethodPluginSelection().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			if (Misc.isBaseOf(basePlugin, plugin)) {
-				ContentPackage categoryPkg = UmaUtil.findContentPackage(plugin,
-						categoryPkgPath);
-				if (categoryPkg != null
-						&& methodConf.getMethodPackageSelection().contains(
-								categoryPkg)) {
-					ContentCategory category = findInherited(categoryPkg
-							.getContentElements(), baseCategory);
-					if (category != null) {
-						ItemProviderAdapter adapter = (ItemProviderAdapter) TngAdapterFactory.INSTANCE
-								.getNavigatorView_ComposedAdapterFactory()
-								.adapt(category, ITreeItemContentProvider.class);
-						if (adapter == null) {
-							System.err
-									.println("DisciplineGroupingItemProvider.addExtendedChildren(): could not find adapter for " + category); //$NON-NLS-1$
-						}
-						for (Iterator iterator = adapter.getChildren(category)
-								.iterator(); iterator.hasNext();) {
-							Object child = (Object) iterator.next();
-							ContentElement element = null;
-							if (child instanceof ContentElement) {
-								element = (ContentElement) child;
-							}
-							if (element != null
-									&& element.getVariabilityBasedOnElement() == null) {
-								// this is an own child of an extended category
-								// it must be added to the child list of the
-								// base category in the configuration.
-								//
-								children.add(child);
-							}
-						}
-
-						// collect the own children of the extended categories
-						// of this category down the inheritance tree
-						//
-						addExtendedChildren(category, methodConf, children,
-								categoryPkgPath);
-					}
-				}
-			}
-		}
-	}
-	
-	public static void addAllTo(List allChildren, List newChildren) {
-		int id;
-		BreakdownElement child, next, last;
-		ArrayList list = new ArrayList();
-		while(!newChildren.isEmpty()) {
-			child = (BreakdownElement) newChildren.remove(0);
-			list.clear();
-			list.add(child);
-			last = null;
-			
-			// find the last element of the chain in new children list
-			//
-			find_last:
-			for(next = child.getPresentedAfter(); next != null; next = next.getPresentedAfter()) {
-				last = next;
-				id = indexOfNextElement(newChildren, next);
-				if(id == -1) {
-					break find_last;
-				}
-				else {
-					list.add(newChildren.remove(id));
-				}
-			}
-			if(last != null) {
-				id = indexOfNextElement(allChildren, last);
-				if(id == -1) {
-					allChildren.addAll(list);
-				}
-				else {
-					allChildren.addAll(id, list);
-				}
-			}
-			else {
-				allChildren.add(child);
-			}
-		}
-	}
-
-	/**
-	 * Adds the given child to the allChildren list based on the presentedBefore
-	 * of child.
-	 * 
-	 * @param allChildren
-	 * @param child
-	 */
-	public static void addTo(List allChildren, BreakdownElement child,
-			Object owner, AdapterFactory adapterFactory) {
-		BreakdownElement next = child.getPresentedAfter();
-		int id;
-		if (next == null) {
-			id = -1;
-		} else {
-			id = indexOfNextElement(allChildren, next);
-			// if(id == -1) {
-			// // System.out.println("TngUtil.addTo(): invalid presentedBefore
-			// of " + child);
-			// BreakdownElement prev = child.getPresentedBefore();
-			// if(prev == null) {
-			// id = 0;
-			// }
-			// else {
-			// id = indexOf(allChildren, prev);
-			// if(id > -1) {
-			// if(id < allChildren.size() - 1) {
-			// id++;
-			// }
-			// else {
-			// id = -1;
-			// }
-			// }
-			// }
-			// }
-		}
-		if (id == -1) {
-			allChildren.add(child);
-		} else {
-			allChildren.add(id, child);
-		}
-	}
-
-	/**
-	 * Gets the index of next element of the breakdown element whose presented-after element is the given 
-	 * break down element
-	 * @param mixedList
-	 *            mixed list of BreakdownElementWrapperItemProvider and
-	 *            BreakdownElement objects
-	 * @param presentedAfter
-	 * @return
-	 */
-	private static int indexOfNextElement(List mixedList, BreakdownElement presentedAfter) {
-		int size = mixedList.size();
-		for (int i = 0; i < size; i++) {
-			Object o = unwrap(mixedList.get(i));
-			if (o == presentedAfter
-					|| (o instanceof VariabilityElement && ((VariabilityElement)o).getVariabilityBasedOnElement() == presentedAfter)) {
-				return i;
-			}
-		}
-		return -1;
-	}
-	
-	public static List getAvailableBaseProcesses(MethodPlugin plugin,
-			List processClasses) {
-		List processes = new ArrayList();
-		List allBasePlugins = Misc.getAllBase(plugin);
-		allBasePlugins.add(0, plugin);
-		for (Iterator iter = allBasePlugins.iterator(); iter.hasNext();) {
-			MethodPlugin basePlugin = (MethodPlugin) iter.next();
-			Collection packages = getRootProcessPackages(basePlugin,
-					processClasses);
-			for (Iterator iterator = packages.iterator(); iterator.hasNext();) {
-				ProcessPackage pkg = (ProcessPackage) iterator.next();
-				for (Iterator iterator1 = pkg.getChildPackages().iterator(); iterator1
-						.hasNext();) {
-					Object childPkg = (Object) iterator1.next();
-					if (childPkg instanceof ProcessComponent) {
-						Process proc = ((ProcessComponent) childPkg)
-								.getProcess();
-						if (isInstanceOf(processClasses, proc)) {
-							processes.add(proc);
-						}
-					}
-				}
-			}
-		}
-		return processes;
-	}
-
-	private static String[] getRootProcessPackagePath(Class procClass) {
-		if (procClass == DeliveryProcess.class) {
-			return ModelStructure.DEFAULT.deliveryProcessPath;
-		} else if (procClass == CapabilityPattern.class) {
-			return ModelStructure.DEFAULT.capabilityPatternPath;
-		} else if (procClass == ProcessPlanningTemplate.class) {
-			return ModelStructure.DEFAULT.processPlanningTemplatePath;
-		}
-
-		return null;
-	}
-
-	private static Collection getRootProcessPackages(MethodPlugin plugin,
-			Collection procClasses) {
-		List packages = new ArrayList();
-		for (Iterator iter = procClasses.iterator(); iter.hasNext();) {
-			Class clazz = (Class) iter.next();
-			String[] path = getRootProcessPackagePath(clazz);
-			if (path != null) {
-				MethodPackage pkg = UmaUtil.findMethodPackage(plugin, path);
-				if (pkg instanceof ProcessPackage) {
-					packages.add(pkg);
-				}
-			}
-		}
-
-		return packages;
-	}
-	
-	/**
-	 * 
-	 * @param plugin
-	 * @return true iff the plugin has any ContentCategory objects
-	 */
-	public static boolean hasCategories(MethodPlugin plugin) {
-		List<ContentPackage> conPacks = getContentCategoryPackages(plugin);
-		for (Iterator<ContentPackage> conPacksIter = conPacks.iterator();conPacksIter.hasNext();) {
-			ContentPackage conPack = conPacksIter.next();
-			for (Iterator conPackIter = conPack.getContentElements().iterator();conPackIter.hasNext();) {
-				Object o = conPackIter.next();
-				if (o instanceof ContentCategory) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}		
-
-	public static List<Process> getAllProcesses(MethodPlugin plugin) {
-		List<Process> processes = new ArrayList<Process>();
-		for (Iterator<Process> it = plugin.getMethodPackages().iterator(); it.hasNext();) {
-			MethodPackage pkg = (MethodPackage) it.next();
-			_iteratePackageForProcesses(pkg, processes);
-		}
-
-		return processes;
-	}
-
-	public static List<Process> getAllProcesses(MethodPackage pkg) {
-		List<Process>  processes = new ArrayList<Process> ();
-			_iteratePackageForProcesses(pkg, processes);
-
-		return processes;
-	}
-	
-	private static void _iteratePackageForProcesses(MethodPackage pkg,
-			List processes) {
-		if (pkg instanceof ProcessComponent) {
-			Process p = ((ProcessComponent) pkg).getProcess();
-			if (p != null && !processes.contains(p)) {
-				processes.add(p);
-			}
-		}
-
-		for (Iterator it = pkg.getChildPackages().iterator(); it.hasNext();) {
-			_iteratePackageForProcesses((MethodPackage) it.next(), processes);
-		}
-	}
-
-	/**
-	 * Checks if e is a subelement of parent
-	 * 
-	 * @param parent
-	 * @param e
-	 * @param adapterFactory
-	 * @return
-	 */
-	public static boolean isSubelementOf(Object parent, Object e,
-			AdapterFactory adapterFactory) {
-		if (parent == e)
-			return false;
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-				.adapt(parent, ITreeItemContentProvider.class);
-		for (Iterator<?> iter = adapter.getChildren(parent).iterator(); iter
-				.hasNext();) {
-			Object element = (Object) iter.next();
-			if (element == e)
-				return true;
-			if (isSubelementOf(element, e, adapterFactory)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * @param child
-	 * @param e
-	 * @param adapterFactory
-	 * @return
-	 */
-	public static boolean isSuperElementOf(Object child, Object e,
-			AdapterFactory adapterFactory) {
-		if (child == e)
-			return false;
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-				.adapt(e, ITreeItemContentProvider.class);
-		for (Iterator<?> iter = adapter.getChildren(e).iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if (element == child)
-				return true;
-			if (isSuperElementOf(child, element, adapterFactory)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	public static Object unwrap(Object obj) {
-		if (obj instanceof IWrapperItemProvider) {
-			do {
-				obj = ((IWrapperItemProvider) obj).getValue();
-			} while (obj instanceof IWrapperItemProvider);
-		} else if (obj instanceof CommandWrapper) {
-			do {
-				obj = ((CommandWrapper) obj).getCommand();
-			} while (obj instanceof CommandWrapper);
-		}
-
-		return obj;
-	}
-	
-	/**
-	 * Returns boolean value based on whether object is wrapper object or not
-	 * @param obj
-	 * @return
-	 */
-	public static boolean isWrapped(Object obj) {
-		if (obj instanceof IWrapperItemProvider || obj instanceof CommandWrapper) {
-			return true;
-		}
-		return false;
-	}
-
-	public static Command unwrap(Command cmd) {
-		while (cmd instanceof CommandWrapper) {
-			cmd = ((CommandWrapper) cmd).getCommand();
-		}
-
-		return cmd;
-	}
-
-	/**
-	 * Checks if the given <code>base</code> is the base element of any
-	 * element in the given elements
-	 * 
-	 * @param elements
-	 * @param base
-	 * @return
-	 */
-	public static boolean isBase(List elements, Object base) {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if (element instanceof VariabilityElement) {
-				if (base == ((VariabilityElement) element)
-						.getVariabilityBasedOnElement()) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	public static String getPresentationName(Object e) {
-		if (e instanceof ContentDescription) {
-			e = ((ContentDescription) e).eContainer();
-		}
-
-		if (e == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		String name = null;
-		if (e instanceof DescribableElement) {
-			name = ((DescribableElement) e).getPresentationName();
-		}
-
-		if (e instanceof MethodElement && StrUtil.isBlank(name)) {
-			name = ((MethodElement) e).getName();
-		}
-
-		return name;
-	}
-
-	public static Process getOwningProcess(BreakdownElement e) {
-		EObject container;
-		for (container = e.eContainer(); container != null
-				&& !(container instanceof ProcessComponent); container = container
-				.eContainer())
-			;
-		if (container != null) {
-			return ((ProcessComponent) container).getProcess();
-		}
-		return null;
-	}
-	
-	public static Process getOwningProcess(BreakdownElementWrapperItemProvider wrapper) {
-		Object top = wrapper.getTopItem();
-		if(top instanceof Process) {
-			Process proc = (Process) top;
-			if(proc.eContainer() instanceof ProcessComponent) {
-				return proc;
-			}
-		}
-		return null;
-	}
-	
-	public static Process getOwningProcess(Object object) {
-		if(object instanceof BreakdownElement) {
-			return getOwningProcess((BreakdownElement)object);
-		}
-		else if(object instanceof BreakdownElementWrapperItemProvider) {
-			return getOwningProcess((BreakdownElementWrapperItemProvider)object);
-		}
-		return null;
-	}
-
-	public static boolean canReference(MethodElement source,
-			MethodElement target) {
-		MethodPlugin targetPlugin = UmaUtil.getMethodPlugin(target);
-		MethodPlugin sourcePlugin = UmaUtil.getMethodPlugin(source);
-		if (sourcePlugin == targetPlugin)
-			return true;
-		return Misc.isBaseOf(targetPlugin, sourcePlugin);
-	}
-
-	public static OrderInfo getOrderInfo(MethodElement e, String orderInfoName) {
-		String str = e.getOrderingGuide();
-		if (str == null || str.length() == 0)
-			return null;
-		Resource res = new StringResource(str);
-		try {
-			res.load(null);
-			if (res.getContents().isEmpty())
-				return null;
-			OrderInfoCollection orderInfos = (OrderInfoCollection) res
-					.getContents().get(0);
-			for (Iterator iter = orderInfos.getOrderInfos().iterator(); iter
-					.hasNext();) {
-				OrderInfo orderInfo = (OrderInfo) iter.next();
-				if (orderInfoName.equalsIgnoreCase(orderInfo.getName())) {
-					return orderInfo;
-				}
-			}
-		} catch (IOException e1) {
-			e1.printStackTrace();
-		}
-		return null;
-	}
-
-	/**
-	 * @param provider
-	 * @param notification
-	 */
-	public static void refreshContributors(IChangeNotifier notifier,
-			Notification notification, boolean contentRefresh,
-			boolean labelUpdate) {
-		for (Iterator iter = getContributors((VariabilityElement) notification
-				.getNotifier()); iter.hasNext();) {
-			Object element = iter.next();
-			notifier.fireNotifyChanged(new ViewerNotification(notification,
-					element, contentRefresh, labelUpdate));
-		}
-	}
-	
-	/**
-	 * Used to refresh plugins that extend another
-	 * @param notifier
-	 * @param notification
-	 * @param contentRefresh
-	 * @param labelUpdate
-	 */
-	public static void refreshPluginExtenders(IChangeNotifier notifier,
-			Notification notification, boolean contentRefresh,
-			boolean labelUpdate) {
-		Object obj = notification.getNotifier();
-		if (obj instanceof MethodPlugin) {
-			for (Iterator iter = AssociationHelper.getPluginDirectExtensions(
-					((MethodPlugin) obj)).iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				notifier.fireNotifyChanged(new ViewerNotification(notification,
-						element, contentRefresh, labelUpdate));
-			}
-		}
-	}
-
-	public static boolean hasContributor(VariabilityElement e) {
-		return hasGeneralizer(e, Collections
-				.singleton(VariabilityType.CONTRIBUTES_LITERAL));
-	}
-
-	public static boolean hasGeneralizer(VariabilityElement e,
-			Collection variabilityTypes) {
-		for (Iterator iterator = AssociationHelper.getImmediateVarieties(e)
-				.iterator(); iterator.hasNext();) {
-			VariabilityElement element = (VariabilityElement) iterator.next();
-			if (variabilityTypes.contains(element.getVariabilityType())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public static Iterator getImmediateVarieties(VariabilityElement elem, VariabilityType type) {
-		List selectedVes = new ArrayList();
-		List allVes = AssociationHelper.getImmediateVarieties(elem);
-		for (int i=0; i<allVes.size(); i++) {
-			VariabilityElement ve = (VariabilityElement) allVes.get(i);
-			if (type == ve.getVariabilityType()) {
-				selectedVes.add(ve);
-			}			
-		}
-		return selectedVes.iterator();
-	}
-		
-	public static Iterator getGeneralizers(VariabilityElement e,
-			final VariabilityType type) {
-		return new AbstractTreeIterator(e, false) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 3978145439449298483L;
-
-			protected Iterator getChildren(Object object) {
-				List children = new ArrayList();
-				for (Iterator iterator = AssociationHelper
-						.getImmediateVarieties((VariabilityElement) object)
-						.iterator(); iterator.hasNext();) {
-					VariabilityElement element = (VariabilityElement) iterator
-							.next();
-					if ((type == null) || element.getVariabilityType() == type) {
-						children.add(element);
-					}
-				}
-				return children.iterator();
-			}
-
-		};
-	}
-
-	/**
-	 * get geenralizers of all types, recursively
-	 * 
-	 * @param e
-	 * @return
-	 */
-	public static Iterator getGeneralizers(VariabilityElement e) {
-		return getGeneralizers(e, null);
-	}
-
-	public static Iterator getContributors(VariabilityElement e) {
-		return getGeneralizers(e, VariabilityType.CONTRIBUTES_LITERAL);
-	}
-
-	public static ItemProviderAdapter getAdapter(MethodPlugin plugin,
-			String[] path) {
-		IGroupContainer groups = (IGroupContainer) TngAdapterFactory.INSTANCE
-				.getNavigatorView_ComposedAdapterFactory().adapt(plugin,
-						ITreeItemContentProvider.class);
-		int i;
-		for (i = 0; i < path.length - 1; i++) {
-			groups = (IGroupContainer) groups.getGroupItemProvider(path[i]);
-			if (groups == null)
-				return null;
-		}
-		return (ItemProviderAdapter) groups.getGroupItemProvider(path[i]);
-	}
-
-	private static void refreshAdapter(MethodPlugin plugin, String[] path,
-			Notification msg) {
-		if (plugin == null) {
-			return;
-		}
-		ItemProviderAdapter adapter = getAdapter(plugin, path);
-		if (adapter != null) {
-			adapter.fireNotifyChanged(new ViewerNotification(msg, adapter,
-					true, false));
-		}
-	}
-
-	public static void refreshAdapter(String[] path, Notification notification) {
-		EObject eObj = null;
-		switch (notification.getEventType()) {
-		case Notification.ADD:
-			eObj = (EObject) notification.getNewValue();
-			break;
-		case Notification.ADD_MANY:
-			eObj = (EObject) new ArrayList((Collection) notification
-					.getNewValue()).get(0);
-			break;
-		case Notification.REMOVE:
-			eObj = (EObject) notification.getOldValue();
-			break;
-		case Notification.REMOVE_MANY:
-			eObj = (EObject) new ArrayList((Collection) notification
-					.getOldValue()).get(0);
-			break;
-		}
-		if (eObj != null) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(eObj);
-			TngUtil.refreshAdapter(plugin, path, notification);
-		}
-	}
-
-	public static void refreshUncategorizedTasksItemProvider(
-			MethodPlugin plugin, Notification msg) {
-		// refresh the uncategorized tasks group
-		//
-
-		refreshAdapter(plugin, LibraryEditConstants.UNCATEGORIZED_TASKS_PATH,
-				msg);
-	}
-
-	public static void refreshDomainUncategorizedWorkProductsItemProvider(
-			MethodPlugin plugin, Notification msg) {
-		refreshAdapter(plugin,
-				LibraryEditConstants.UNCATEGORIZED_DOMAIN_WORKPRODUCTS_PATH,
-				msg);
-	}
-
-	public static void refreshWorkProductTypeUncategorized(MethodPlugin plugin,
-			Notification msg) {
-		refreshAdapter(
-				plugin,
-				LibraryEditConstants.UNCATEGORIZED_WORKPRODUCTTYPE_WORKPRODUCTS_PATH,
-				msg);
-	}
-
-	public static void refreshUncategorizedWorkProductsItemProviders(
-			MethodPlugin plugin, Notification msg) {
-		refreshDomainUncategorizedWorkProductsItemProvider(plugin, msg);
-		refreshWorkProductTypeUncategorized(plugin, msg);
-	}
-
-	public static void refreshUncategorizedRolesItemProvider(
-			MethodPlugin plugin, Notification msg) {
-		refreshAdapter(plugin, LibraryEditConstants.UNCATEGORIZED_ROLES_PATH,
-				msg);
-	}
-
-	public static void refreshUncategorizedToolMentorsItemProvider(
-			MethodPlugin plugin, Notification msg) {
-		refreshAdapter(plugin,
-				LibraryEditConstants.UNCATEGORIZED_TOOLMENTORS_PATH, msg);
-
-	}
-
-	public static Object createWrapper(AdapterFactory adapterFactory,
-			EObject object, EStructuralFeature feature, Object value, int index) {
-		if (FeatureMapUtil.isFeatureMap(feature)) {
-			value = new FeatureMapEntryWrapperItemProvider(
-					(FeatureMap.Entry) value, object, (EAttribute) feature,
-					index, adapterFactory, null);
-		} else if (feature instanceof EAttribute) {
-			value = new AttributeValueWrapperItemProvider(value, object,
-					(EAttribute) feature, index, adapterFactory, null);
-		} else if (!((EReference) feature).isContainment()) {
-			value = new FeatureValueWrapperItemProvider(feature, value, object,
-					adapterFactory);
-		}
-
-		return value;
-	}
-
-	public static Object getNavigatorParentItemProvider(Guidance guidance) {
-		EObject container = guidance.eContainer();
-		if (!(container instanceof ContentPackage))
-			return null;
-		ContentPackageItemProvider itemProvider = (ContentPackageItemProvider) TngUtil
-				.getAdapter(container, ContentPackageItemProvider.class);
-		return itemProvider != null ? itemProvider.getGuidances() : null;
-	}
-
-	public static Object getNavigatorParentItemProvider(WorkProduct object) {
-		EObject contentPkg = object.eContainer();
-		if (contentPkg == null)
-			return null;
-		ContentPackageItemProvider itemProvider = (ContentPackageItemProvider) TngUtil
-				.getAdapter(contentPkg, ContentPackageItemProvider.class);
-		return itemProvider != null ? itemProvider.getWorkProducts() : null;
-	}
-	
-	public static Object getImage(Object object) {
-		Object adapter = null;
-		try {
-			adapter = umaItemProviderAdapterFactory.adapt(object,
-					ITreeItemContentProvider.class);
-			if (adapter instanceof IItemLabelProvider) {
-				return ((IItemLabelProvider) adapter).getImage(object);
-			}
-		}
-		finally {
-			if(adapter != object && adapter instanceof IDisposable) {
-				((IDisposable)adapter).dispose();
-			}
-		}
-		return null;
-	}
-
-	public static Object getColumnImage(Object object, String colName) {
-		// if(colName == IBSItemProvider.COL_TYPE)
-		// if(colName == IBSItemProvider.COL_NAME)
-		if (colName == IBSItemProvider.COL_PRESENTATION_NAME) {
-			return getImage(object);
-		}
-		return null;
-	}
-
-	/**
-	 * Move element up withing the parent
-	 * 
-	 * @param activity
-	 * @param elementObj
-	 * @param eClasses
-	 * @param actionMgr
-	 */
-	public static void moveUp(Activity activity, Object elementObj,
-			Collection eClasses, IActionManager actionMgr) {
-		MoveUpCommand cmd = new MoveUpCommand(activity, elementObj, eClasses);
-		actionMgr.execute(cmd);
-	}
-
-	/**
-	 * Move element down within the parent
-	 * 
-	 * @param activity
-	 * @param elementObj
-	 * @param eClasses
-	 * @param actionMgr
-	 */
-	public static void moveDown(Activity activity, Object elementObj,
-			Collection eClasses, IActionManager actionMgr) {
-		MoveDownCommand cmd = new MoveDownCommand(activity, elementObj,
-				eClasses);
-		actionMgr.execute(cmd);
-	}
-
-	public static CustomCategory createRootCustomCategory(
-			ContentPackage customCategoryPkg) {
-		// create root custom category
-		//
-		CustomCategory rootCustomCategory = UmaFactory.eINSTANCE
-				.createCustomCategory();
-		rootCustomCategory.setName(LibraryEditPlugin.INSTANCE
-				.getString("_UI_Custom_Categories_group")); //$NON-NLS-1$
-		ContentPackage hiddenPkg = UmaUtil.findContentPackage(customCategoryPkg
-				.getChildPackages(), ModelStructure.HIDDEN_PACKAGE_NAME);
-		if (hiddenPkg == null) {
-			// create hidden package to store the root custom category
-			//
-			hiddenPkg = UmaFactory.eINSTANCE.createContentPackage();
-			hiddenPkg.setName(ModelStructure.HIDDEN_PACKAGE_NAME);
-			customCategoryPkg.getChildPackages().add(hiddenPkg);
-		}
-		hiddenPkg.getContentElements().add(rootCustomCategory);
-
-		return rootCustomCategory;
-	}
-
-	public static CustomCategory getRootCustomCategory(MethodPlugin plugin) {
-		ContentPackage customCategoryPkg = UmaUtil.findContentPackage(plugin,
-				ModelStructure.DEFAULT.customCategoryPath);
-		if (customCategoryPkg == null)
-			return null;
-		ContentPackage hiddenPkg = UmaUtil.findContentPackage(customCategoryPkg
-				.getChildPackages(), ModelStructure.HIDDEN_PACKAGE_NAME);
-		if (hiddenPkg != null && !hiddenPkg.getContentElements().isEmpty()) {
-			return (CustomCategory) hiddenPkg.getContentElements().get(0);
-		}
-		CustomCategory root = createRootCustomCategory(customCategoryPkg);
-		// code for backward compatibility: add all the custom categories under
-		// customCategoryPkg
-		// to the content element reference list of the root custom category so
-		// they can be visible
-		// in the new UI
-		//
-		for (Iterator iter = customCategoryPkg.getContentElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof CustomCategory) {
-				root.getCategorizedElements().add(element);
-			}
-		}
-		return root;
-	}
-
-	public static boolean isRootCustomCategory(CustomCategory category) {
-		EObject pkg = category.eContainer();
-		if (pkg instanceof ContentPackage
-				&& ModelStructure.HIDDEN_PACKAGE_NAME
-						.equals(((ContentPackage) pkg).getName())) {
-			return true;
-		}
-		return false;
-	}
-
-	public static boolean isRootCutomCategoryPackage(MethodPackage pkg) {
-		if ( !(pkg instanceof ContentPackage) ||
-				!ModelStructure.HIDDEN_PACKAGE_NAME
-						.equals(pkg.getName()) ) {
-			return false;
-		}
-		
-		// check the plugin and make sure it's the object, TODO
-		
-		return true;
-	}
-	
-	/**
-	 * Saves resource of the given element's container if this has been modified
-	 * 
-	 * @param element
-	 */
-	public static void saveContainerResource(EObject element,
-			IFileBasedLibraryPersister persister) {
-		// save container's resource
-		if (element.eContainer() != null) {
-			Resource resource = element.eContainer().eResource();
-			if (resource != null && resource.isModified()) {
-				try {
-					persister.save(resource);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		}
-
-	}
-
-	public static ContentCategory findContributor(ContentPackage categoryPkg,
-			ContentCategory baseCategory) {
-		for (Iterator iter = categoryPkg.getContentElements().iterator(); iter
-				.hasNext();) {
-			ContentCategory cat = (ContentCategory) iter.next();
-			if (cat.getVariabilityBasedOnElement() == baseCategory) {
-				return cat;
-			}
-		}
-		return null;
-	}
-
-	public static boolean isEmpty(ContentCategory category) {
-		if (!category.getConceptsAndPapers().isEmpty()
-				|| !category.getSupportingMaterials().isEmpty())
-			return false;
-
-		if (category instanceof Discipline) {
-			return ((Discipline) category).getTasks().isEmpty();
-		} else if (category instanceof Domain) {
-			return ((Domain) category).getWorkProducts().isEmpty();
-		} else if (category instanceof RoleSet) {
-			return ((RoleSet) category).getRoles().isEmpty();
-		} else if (category instanceof Tool) {
-			return ((Tool) category).getToolMentors().isEmpty();
-		} else if (category instanceof WorkProductType) {
-			return ((WorkProductType) category).getWorkProducts().isEmpty();
-		} else if (category instanceof CustomCategory) {
-			CustomCategory userDefinedCategory = ((CustomCategory) category);
-			return userDefinedCategory.getCategorizedElements().isEmpty()
-			// && userDefinedCategory.getSubCategories().isEmpty()
-			;
-		}
-
-		throw new IllegalArgumentException("Unknown category: " + category); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param order
-	 */
-	private static void addToPackage(WorkOrder order, BreakdownElement e) {
-		EObject container = e.eContainer();
-		if(container != null) {
-			((ProcessPackage) container).getProcessElements().add(order);
-		}
-	}
-
-	/**
-	 * @param order
-	 */
-	private static void removeFromPackage(WorkOrder order, BreakdownElement e) {
-		EObject container = e.eContainer();
-		if(container instanceof ProcessPackage) {
-			((ProcessPackage) container).getProcessElements().remove(order);
-		}
-	}
-
-	public static boolean handlePredecessorListChange(
-			ItemProviderAdapter adapter, Notification notification) {
-		if (notification.getNotifier() instanceof WorkBreakdownElement) {
-			switch (notification.getFeatureID(WorkBreakdownElement.class)) {
-			case UmaPackage.ACTIVITY__LINK_TO_PREDECESSOR:
-				switch (notification.getEventType()) {
-				case Notification.ADD:
-					addToPackage((WorkOrder) notification.getNewValue(),
-							(BreakdownElement) notification.getNotifier());
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) notification
-							.getNewValue()).iterator(); iter.hasNext();) {
-						addToPackage((WorkOrder) iter.next(),
-								(BreakdownElement) notification.getNotifier());
-					}
-					break;
-				case Notification.REMOVE:
-					removeFromPackage((WorkOrder) notification.getOldValue(),
-							(BreakdownElement) notification.getNotifier());
-					break;
-				case Notification.REMOVE_MANY:
-					for (Iterator iter = ((Collection) notification
-							.getOldValue()).iterator(); iter.hasNext();) {
-						removeFromPackage((WorkOrder) iter.next(),
-								(BreakdownElement) notification.getNotifier());
-					}
-					break;
-
-				}
-
-				adapter.fireNotifyChanged(new ViewerNotification(notification,
-						notification.getNotifier(), false, true));
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * return all the global packages for the method plugin
-	 * 
-	 * @param plugin
-	 *            MethodPlugin
-	 * @return List a list of global packages
-	 */
-	public static List<ContentPackage> getGlobalPackages(MethodPlugin plugin) {
-		ArrayList<ContentPackage> packages = new ArrayList<ContentPackage>();
-		String[][] categoryPaths = ModelStructure.DEFAULT.getCategoryPaths();
-		for (int i = 0; i < categoryPaths.length; i++) {
-			String[] path = categoryPaths[i];
-			ContentPackage categoryPkg = UmaUtil.findContentPackage(plugin,
-					path);
-			if (categoryPkg != null) {
-				packages.add(categoryPkg);
-			}
-		}
-
-		return packages;
-	}
-
-	
-	/**
-	 * return all the content category packages for the method plugin. 
-	 * 
-	 * @param plugin
-	 *            MethodPlugin
-	 * @return List a list of global packages
-	 */
-	public static List<ContentPackage> getContentCategoryPackages(MethodPlugin plugin) {
-		return getGlobalPackages(plugin);
-	}
-	
-	
-	/**
-	 * return all the system defined packages for the method plugin
-	 * 
-	 * @param plugin
-	 *            MethodPlugin
-	 * @return List a list of all system packages
-	 */
-	public static List getAllSystemPackages(MethodPlugin plugin) {
-		ArrayList packages = new ArrayList();
-		String[][] paths = ModelStructure.DEFAULT.getAllSystemPaths();
-		for (int i = 0; i < paths.length; i++) {
-			String[] path = paths[i];
-			MethodPackage pkg = UmaUtil.findMethodPackage(plugin, path);
-			if (pkg != null && !packages.contains(pkg)) {
-				packages.add(pkg);
-				EObject o = pkg.eContainer();
-				while ((o instanceof MethodPackage) && !packages.contains(o)) {
-					packages.add(o);
-					o = o.eContainer();
-				}
-			}
-		}
-
-		// also add the hidden costom category package
-		ContentPackage customCategoryPkg = UmaUtil.findContentPackage(plugin,
-				ModelStructure.DEFAULT.customCategoryPath);
-		if (customCategoryPkg != null) {
-			ContentPackage hiddenPkg = UmaUtil.findContentPackage(
-					customCategoryPkg.getChildPackages(),
-					ModelStructure.HIDDEN_PACKAGE_NAME);
-			if (hiddenPkg != null) {
-				packages.add(hiddenPkg);
-			}
-		}
-
-		return packages;
-	}
-
-	public static boolean isPredefined(MethodElement e) {
-		if (e instanceof CustomCategory
-				&& isRootCustomCategory((CustomCategory) e))
-			return true;
-		String path = ModelStructure
-				.toFilePath(Misc.getPathRelativeToPlugin(e));
-		for (Iterator iter = ModelStructure.ALL_PREDEFINED_PATHS.iterator(); iter
-				.hasNext();) {
-			String predefinePath = (String) iter.next();
-			if (predefinePath.startsWith(path)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-
-	public static MethodPackage getMethodPackage(EObject e) {
-		for (; !(e instanceof MethodPackage) && e != null; e = e.eContainer())
-			;
-		return (MethodPackage) e;
-	}
-	
-	public static MethodPackage getParentMethodPackage(EObject e) {
-		EObject eobj = e;
-		while(eobj != null) {
-			eobj = eobj.eContainer();
-			if (eobj == null ) {
-				return null;
-			} else if (eobj instanceof MethodPackage) {
-				return (MethodPackage) eobj;
-			}
-		}
-		return  null;
-	}
-
-	/**
-	 * validate the configuration by forcing to select the global packages of
-	 * the selected method plugins, this is needed for configuration exporting.
-	 * If global packages are missing, the exported configuration is not valid
-	 * 
-	 * @param actionMgr if not null, will use the given IActionManager to change the configuration, otherwise configuration will be changed directly
-	 * @param plugin
-	 */
-	public static void validateMethodConfiguration(IActionManager actionMgr, MethodConfiguration config) {
-		List plugins = new ArrayList(config.getMethodPluginSelection());
-		List pkgSels = new ArrayList(config.getMethodPackageSelection());
-		List<MethodPlugin> pluginsToAdd = new ArrayList<MethodPlugin>();
-		List<MethodPackage> packagesToAdd = new ArrayList<MethodPackage>();
-
-		// make sure all required packages are selected.
-		// if a package is selected, all the parent packages must be selected.
-		for ( Iterator it = new ArrayList(pkgSels).iterator(); it.hasNext(); ) {
-			MethodPackage pkg = (MethodPackage)it.next();
-			EObject c = pkg.eContainer();
-			while ( ((c instanceof MethodPackage) || (c instanceof MethodPlugin)) 
-					&& !pkgSels.contains(c) && !plugins.contains(c) ) {
-				if (c instanceof MethodPlugin) {
-					plugins.add(c);
-					pluginsToAdd.add((MethodPlugin)c);
-				} else {
-					pkgSels.add(c);
-					packagesToAdd.add((MethodPackage)c);
-				}
-				
-				c = c.eContainer();
-			}	
-			
-			// if the package is a ProcessComponent, select all the child packages
-			if ( pkg instanceof ProcessComponent ) {
-				List oldPkgSels = new ArrayList(pkgSels);
-				getAllChildPackages(pkg, pkgSels);
-				pkgSels.removeAll(oldPkgSels);
-				packagesToAdd.addAll(pkgSels);
-			}
-		}
-		ConfigurationUtil.addCollToMethodPluginList(actionMgr, config, pluginsToAdd);
-		ConfigurationUtil.addCollToMethodPackageList(actionMgr, config, packagesToAdd);
-		pkgSels = new ArrayList(config.getMethodPackageSelection());
-
-		// make sure all system packages are selected
-		List<MethodPackage> sysPackagesToAdd = new ArrayList<MethodPackage>();
-		for (Iterator itp = plugins.iterator(); itp.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) itp.next();
-			List pkgs = TngUtil.getAllSystemPackages(plugin);
-			for (Iterator it = pkgs.iterator(); it.hasNext();) {
-				Object pkg = it.next();
-				if (!pkgSels.contains(pkg) && pkg instanceof MethodPackage) {
-					pkgSels.add(pkg);
-					sysPackagesToAdd.add((MethodPackage)pkg);
-				}
-			}
-		}
-		ConfigurationUtil.addCollToMethodPackageList(actionMgr, config, sysPackagesToAdd);
-	}
-	
-	/**
-	 * get all child packages of the given MethodPackage and add to the list
-	 * @param pkg MethodPackage
-	 * @param result List the packages found
-	 */
-	private static void getAllChildPackages(MethodPackage pkg, List result) {
-		List pkgs = pkg.getChildPackages();
-		
-		// only add unique items
-		for ( Iterator it = pkgs.iterator(); it.hasNext(); ) {
-			Object p = it.next();
-			if ( !result.contains(p) ) {
-				result.add(p);
-			}
-		}
-
-		for (Iterator it = pkgs.iterator(); it.hasNext();) {
-			getAllChildPackages((MethodPackage) it.next(), result);
-		}
-	}
-	
-	/**
-	 * Adds the given object's method package and plugin to the given
-	 * configuration if they are not in the configuration yet.
-	 * 
-	 * @param config
-	 * @param object
-	 */
-	public static boolean addTo(MethodConfiguration config, EObject object,
-			Set addedObjects) {
-		MethodPackage pkg = getMethodPackage(object);
-		if (pkg != null) {
-			if (!config.getMethodPackageSelection().contains(pkg)) {
-				config.getMethodPackageSelection().add(pkg);
-				addedObjects.add(pkg);
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(pkg);
-				
-				// 150552 - Processes: If configuration is updated by itself due to actions like CP extendiing or deep copy, 
-				// there is a refresh issue.
-				// missing the "!" here!
-				if (!config.getMethodPluginSelection().contains(plugin)) {
-					config.getMethodPluginSelection().add(plugin);
-					addedObjects.add(plugin);
-				
-					// need to validate the method configuration to make sure all related system packages are selected.
-					// otherwise the configuration explorer will not work
-					// 150552 - Processes: If configuration is updated by itself due to actions like CP extendiing or deep copy, there is a refresh issue.		
-					validateMethodConfiguration(null, config);
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public static boolean addToConfiguration(MethodConfiguration config,
-			EObject object, Set addedObjects) {
-		int size = addedObjects.size();
-		addTo(config, object, addedObjects);
-
-		if (object instanceof VariabilityElement) {
-			// add all the base elements if there is any
-			for (VariabilityElement c = ((VariabilityElement) object)
-					.getVariabilityBasedOnElement(); c != null; c = (VariabilityElement) c
-					.getVariabilityBasedOnElement()) {
-				addTo(config, c, addedObjects);
-			}
-		}
-
-		return addedObjects.size() > size;
-	}
-
-	/**
-	 * 
-	 * @param eObj
-	 * @param context
-	 *            the <code>org.eclipse.swt.widgets.Shell</code> that is to be
-	 *            used to parent any dialogs with the user, or <code>null</code>
-	 *            if there is no UI context (declared as an <code>Object</code>
-	 *            to avoid any direct references on the SWT component)
-	 * @return
-	 */
-	public static IStatus checkEdit(EObject eObj, Object context) {
-		if (((InternalEObject) eObj).eProxyURI() != null) {
-			// this is a unresolved proxy, disallow editing it
-			//
-			EObject proxy = eObj;
-			String uri = ((InternalEObject) proxy).eProxyURI().toString();
-			org.eclipse.emf.common.util.URI containerURI = proxy.eContainer() != null ? proxy
-					.eContainer().eResource().getURI()
-					: null;
-			String location;
-			if (containerURI != null) {
-				location = containerURI != null && containerURI.isFile() ? containerURI.toFileString()
-						: ""; //$NON-NLS-1$
-				if (location.length() != 0) {
-					location = MessageFormat.format(
-							" in ''{0}''", new Object[] { location }); //$NON-NLS-1$
-				}
-			} else {
-				location = ""; //$NON-NLS-1$
-			}
-			String msg = MessageFormat.format(LibraryEditResources.unresolvedObjectError_reason
-					, new Object[] { proxy.eClass().getName(), uri, location });
-			return new Status(IStatus.ERROR, LibraryEditPlugin.INSTANCE
-					.getSymbolicName(), 0, msg, null);
-		}				
-		
-		IAccessController ac = Services.getAccessController();
-		if(ac == null) {
-			return Status.OK_STATUS;
-		}
-		return ac.checkModify(Collections.singletonList(eObj), context);
-	}
-	
-	/**
-	 * Check the given element for modifiable
-	 * 
-	 * @param e
-	 * @throws MessageException if the element cannot be modified
-	 */
-	public static void checkModify(EObject e) {
-		IAccessController ac = Services.getAccessController();
-		if(ac != null) {
-			IStatus status = ac.checkModify(Collections.singletonList(e), null);
-			if (!status.isOK()) {
-				String msg = UmaUtil.getMessage(status);
-				if (msg == null) {
-					Object obj;
-					if(e.eResource().getURI().isFile()) {
-						obj = e.eResource().getURI().toFileString();
-					}
-					else {
-						obj = e; 
-					}
-					msg = MessageFormat.format(UmaResources.err_cannotModify0,
-							new Object[] { obj });
-				}
-				throw new MessageException(msg);
-			}
-		}
-	}
-
-	public static String getMessage(IStatus status) {
-		String msg = status.getMessage();
-		if (status.isMultiStatus()) {
-			StringBuffer strBuf = new StringBuffer(msg);
-			IStatus statuses[] = status.getChildren();
-			for (int i = 0; i < statuses.length; i++) {
-				strBuf.append('\n').append(statuses[i].getMessage());
-			}
-			msg = strBuf.toString();
-		}
-		if (msg == null || msg.length() == 0) {
-			msg = LibraryEditResources.util_tngutil_cannot_edit_resource; 
-		}
-		return msg;
-	}
-
-	public static boolean isContributor(VariabilityElement e) {
-		return e.getVariabilityBasedOnElement() != null
-		&& (e.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL);
-	}
-	
-	public static boolean isReplacer(VariabilityElement e) {
-		return e.getVariabilityBasedOnElement() != null
-		&& (e.getVariabilityType() == VariabilityType.REPLACES_LITERAL);
-	}
-	
-	public static boolean isContributorOrReplacer(VariabilityElement e) {
-		VariabilityElement base = e.getVariabilityBasedOnElement();
-		VariabilityType type = e.getVariabilityType();
-		return base != null && (type == VariabilityType.CONTRIBUTES_LITERAL || type == VariabilityType.REPLACES_LITERAL);
-	}
-
-	public static boolean isGeneralizer(Object obj, Collection types) {
-		if (!(obj instanceof VariabilityElement))
-			return false;
-		VariabilityElement ve = (VariabilityElement) obj;
-		if (ve.getVariabilityBasedOnElement() == null)
-			return false;
-		if (types == null)
-			return true;
-		return types.contains(ve.getVariabilityType());
-	}
-
-	public static String getTypeText(String typeKey) {
-		try {
-			return UmaEditPlugin.INSTANCE.getString("_UI_" + typeKey + "_type"); //$NON-NLS-1$ //$NON-NLS-2$
-		} catch (MissingResourceException e) {
-		}
-		return UmaEditPlugin.INSTANCE.getString("_UI_Unknown_type"); //$NON-NLS-1$		
-	}
-
-	/**
-	 * Looks up the user friendly type name for a Method element.
-	 */
-	public static String getTypeText(EObject element) {
-		return getTypeText(element.eClass());
-	}
-	
-	/**
-	 * Looks up the user-friendly type name for a given type.
-	 * 
-	 * @param type
-	 * @return
-	 */
-	public static String getTypeText(EClass type) {
-		return getTypeText(type.getName());
-	}
-
-	/**
-	 * This looks up the name of the specified feature.
-	 */
-	public static String getFeatureText(Object feature) {
-		if (feature instanceof EStructuralFeature) {
-			return getFeatureText((EStructuralFeature) feature);
-		} else {
-			return "Unknown"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Checks if the given object is locked. An object is considered locked if
-	 * its MethodPlugin has the attribute userChangeable set to false. The
-	 * 'locked' status of an object is independent from 'read-only' status of
-	 * its resource file.
-	 * 
-	 * @param object
-	 * @return
-	 */
-	public static boolean isLocked(EObject object) {
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(object);
-		if (plugin == null)
-			return false;
-		return !plugin.getUserChangeable().booleanValue();
-	}
-
-	public static boolean checkExist(Collection wrappers, Object e) {
-		for (Iterator iterator = wrappers.iterator(); iterator.hasNext();) {
-			Object element = unwrap(iterator.next());
-			if (element == e) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Gets the index of element or its wrapper in the given list
-	 * @param list a mixed list of element and wrapper
-	 * @param e
-	 * @return -1 if the element or its wrapper could not be found in the list
-	 */
-	public static int getIndexOf(List list, Object e) {
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			Object element = unwrap(list.get(i));
-			if(element == e) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	public static EStructuralFeature getContainingFeature(Object object,
-			AdapterFactory adapterFactory) {
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-				.adapt(object, ITreeItemContentProvider.class);
-		if (adapter == null)
-			return null;
-		Object parent = adapter.getParent(object);
-		if (!(parent instanceof EObject))
-			return null;
-		adapter = (ITreeItemContentProvider) adapterFactory.adapt(parent,
-				ITreeItemContentProvider.class);
-		if (adapter instanceof MethodElementItemProvider) {
-			EObject parentEObj = (EObject) parent;
-			for (Iterator iter = ((MethodElementItemProvider) adapter)
-					.getChildrenFeatures(parent).iterator(); iter.hasNext();) {
-				EStructuralFeature f = (EStructuralFeature) iter.next();
-				if (f.isMany()) {
-					if (((Collection) parentEObj.eGet(f)).contains(object)) {
-						return f;
-					}
-				} else {
-					if (parentEObj.eGet(f) == object) {
-						return f;
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Looks up the user-friendly name for a given feature.
-	 * 
-	 * @param feature
-	 * @return
-	 */
-	public static String getFeatureText(EStructuralFeature feature) {
-		switch (feature.getFeatureID()) {
-		// case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-		// return "Primary Performer";
-		// case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-		// return "Secondary Performer";
-		case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-			return LibraryEditResources.assists_text; 
-		}
-
-		String featureKey;
-		if (feature instanceof EStructuralFeature) {
-			EStructuralFeature eFeature = (EStructuralFeature) feature;
-			featureKey = eFeature.getEContainingClass().getName()
-					+ "_" + eFeature.getName(); //$NON-NLS-1$
-		} else {
-			featureKey = LibraryEditResources.unknown_text; 
-		}
-		return UmaEditPlugin.INSTANCE
-				.getString("_UI_" + featureKey + "_feature"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * get the library root path for the given element, assuming the element and
-	 * it's parents are loaded
-	 * 
-	 * @param element
-	 * @return File the root path of the library
-	 */
-	public static File getLibraryRootPath(EObject element) {
-		EObject parent = element;
-		while ((parent != null) && !(parent instanceof MethodLibrary)) {
-			parent = parent.eContainer();
-		}
-
-		if (parent != null && parent.eResource() != null) {
-			org.eclipse.emf.common.util.URI uri = parent.eResource().getURI();
-			String path = uri.toFileString();
-			File f = new File(path);
-			return f.getParentFile();
-		}
-		return null;
-	}
-
-	/**
-	 * get the full path URI by appending the relative path URI to the object's
-	 * library path
-	 * 
-	 * @param o
-	 *            EObject the object to find the MethodLibrary, can be any
-	 *            object in the library
-	 * @param uri
-	 *            The uri to be fixed
-	 * @return URI the full path uri
-	 */
-	public static URI getFullPathURI(EObject o, URI uri) {
-		if (uri == null) {
-			return uri;
-		}
-
-		// try if this is a valid URL or not
-		try {
-			URL url = uri.toURL();
-			if (url != null) {
-				return uri;
-			}
-		} catch (Exception ex) {
-			; // not a valid url, maybe a relative path
-		}
-
-		// need to get the element's resource path
-		File f = getLibraryRootPath(o);
-		if (f != null) {
-			return new File(f, NetUtil.decodedFileUrl(uri.toString())).toURI();
-		}
-
-		return uri;
-	}
-
-	
-	/**
-	 * To get the node icon/shape icon full path URI by appending the relative path URI to the object's
-	 * library path
-	 * 
-	 * @param o
-	 *            EObject the object to find the MethodLibrary, can be any
-	 *            object in the library
-	 * @param uri
-	 *            The uri to be fixed
-	 * @return URI the full path uri
-	 */
-	//FIXME: make storage independent
-	public static URI getFullPathofNodeorShapeIconURI(EObject o, URI uri) {
-		if (uri == null) {
-			return uri;
-		}
-
-		// try if this is a valid URL or not
-		try {
-			URL url = uri.toURL();
-			if (url != null) {
-				return uri;
-			}
-		} catch (Exception ex) {
-			; // not a valid url, maybe a relative path
-		}
-
-		// need to get the element's resource path
-		File f = getLibraryRootPath(o);
-		String path = uri.getPath();
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(o);
-		if (plugin != null && UmaUtil.hasDirectResource(plugin)) {
-			File pluginDir = new File(plugin.eResource().getURI().toFileString()).getParentFile();
-			if (path.indexOf(plugin.getName()) > -1) {
-				return new File(f, NetUtil.decodedFileUrl(uri.toString()))
-						.toURI();
-			} else {
-				return new File(pluginDir, NetUtil.decodedFileUrl(uri.toString())).toURI();
-			}
-		}
-		return null;
-	}
-	/**
-	 * @param e
-	 * @return
-	 */
-	public static String toStackTraceString(Throwable e) {
-		StringWriter strWriter = new StringWriter();
-		e.printStackTrace(new PrintWriter(strWriter));
-		return strWriter.toString();
-	}
-	
-	public static String getLabelWithPath(Object object) {
-		if (object instanceof BreakdownElement) {
-			return ProcessUtil.getLabelWithPath((BreakdownElement) object);
-		}
-
-		if (object instanceof ContentDescription) {
-			return getLabelWithPath(((ContentDescription) object).eContainer());
-		}
-
-		if(object instanceof MethodElement) {
-			MethodElement me = (MethodElement) object;
-			Collection<NamedElement> itemPath = Misc.getObjectTreeRelativeToPlugin(me);
-			StringBuffer path = new StringBuffer(getLabel(object, me.getGuid()));
-			if (MethodElementUtil.getMethodModel(object) != null) {
-				path
-				.append(", ").append(MethodElementUtil.getMethodModel(object).getName()); //$NON-NLS-1$
-				for (Iterator<NamedElement> iter = itemPath.iterator();iter.hasNext();) {
-					NamedElement e = iter.next();
-					String s = String.valueOf(e.getName());
-
-					if (ModelStructure.CORE_CONTENT_PACAKGE_NAME.equals(s) || ModelStructure.CONTENT_PACKAGE_NAME.equalsIgnoreCase(s)
-							|| (((NamedElement) object).equals(e))) {
-					} else {
-						path.append('/').append(s);
-					}
-				}
-			}
-			return path.toString();
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	public static EObject getOwner(Command command) {
-		command = TngUtil.unwrap(command);
-		EObject owner = null;
-		if (command instanceof AddCommand) {
-			owner = ((AddCommand) command).getOwner();
-		} else if (command instanceof RemoveCommand) {
-			owner = ((RemoveCommand) command).getOwner();
-		} else if (command instanceof SetCommand) {
-			owner = ((SetCommand) command).getOwner();
-		} else if (command instanceof MoveCommand) {
-			owner = ((MoveCommand) command).getOwner();
-		} else if (command instanceof PasteFromClipboardCommand) {
-			Object o = ((PasteFromClipboardCommand) command).getOwner();
-			if (o instanceof EObject) {
-				owner = (EObject) o;
-			}
-		}
-		return owner;
-	}
-	
-	public static Set<Resource> getModifiedResources(Command cmd) {
-		Set<Resource> modifiedResources = new HashSet<Resource>();
-		collectModifiedResources(cmd, modifiedResources);
-		return modifiedResources;
-	}
-	
-	public static void collectModifiedResources(Command command, Set<Resource> modifiedResources) {
-		if (command instanceof IResourceAwareCommand) {
-			modifiedResources.addAll(((IResourceAwareCommand) command)
-					.getModifiedResources());
-		} 
-		else if(command instanceof CompoundCommand){
-			List commandList = ((CompoundCommand)command).getCommandList();
-			for (Iterator iter = commandList.iterator(); iter.hasNext();) {
-				collectModifiedResources((Command) iter.next(), modifiedResources);				
-			}
-		}
-		else {
-			EObject modified = TngUtil.getOwner(command);
-			if(modified != null) {
-				Resource resource = modified.eResource();
-				if(resource != null) {
-					modifiedResources.add(resource);
-				}
-			}
-		}
-	}
-
-	public static List convertGuidanceAttachmentsToList(String attachmentString) {
-		ArrayList attachments = new ArrayList();
-		if (attachmentString == null)
-			attachmentString = ""; //$NON-NLS-1$
-		String files[] = attachmentString
-				.split(GUIDANCE_FILESTRING_SEPARATOR_SPLITTER);
-		for (int i = 0; i < files.length; i++) {
-			if (files[i].trim().length() > 0)
-				attachments.add(files[i]);
-		}
-		return attachments;
-	}
-
-	public static String convertGuidanceAttachmentsToString(List attachmentList) {
-		String attachmentString = ""; //$NON-NLS-1$
-		int i = 0;
-		for (Iterator iter = attachmentList.iterator(); iter.hasNext();) {
-			String attachment = (String) iter.next();
-			if (i++ > 0)
-				attachmentString = attachmentString
-						.concat(GUIDANCE_FILESTRING_SEPARATOR);
-			attachmentString = attachmentString.concat(attachment);
-		}
-		return attachmentString;
-	}
-	
-	/**
-	 * 
-	 * @param e
-	 * @return true iff the MethodElement is allowed an attachment.  Currently, only
-	 * Example, ResuableAsset, Template,  Whitepaper are allowed attachments
-	 */
-	public static boolean isAllowedAttachments(MethodElement e) {
-		if (e == null) {
-			return false;
-		}
-		if (e instanceof Example)
-			return true;
-		if (e instanceof ReusableAsset)
-			return true;
-		if (e instanceof Template)
-			return true;
-		if (e instanceof Whitepaper)
-			return true;
-
-		return false;
-	}
-
-	/**
-	 * Checks if the given <code>elements</code> contains <code>e</code> or has a wrapper of <code>e</code>
-	 * 
-	 * @param elements
-	 * @param e
-	 * @return
-	 */
-	public static boolean contains(Collection elements, Object e) {
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if(element == e || e == unwrap(element)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Checks if the given CustomCategory is an ancestor of the given DescibableElement
-	 * 
-	 * @param cc
-	 * @param e
-	 * @return
-	 * @deprecated moved to {@link DependencyChecker#isAncessorOf(CustomCategory, DescribableElement)}
-	 */
-	public static boolean isAncessorOf(CustomCategory cc, DescribableElement e) {
-		return DependencyChecker.isAncessorOf(cc, e);
-	}
-	
-	public static void refreshParentIfNameChanged(Notification notification, ItemProviderAdapter adapter) {
-		if(notification.getNotifier() instanceof ContentElement) {
-			switch (notification.getFeatureID(DescribableElement.class)) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__NAME:
-				if(PresentationContext.INSTANCE.isShowPresentationNames()) {
-					return;
-				}
-				break;
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-				if(!PresentationContext.INSTANCE.isShowPresentationNames()) {
-					return;
-				}
-				break;
-			default:
-				return;
-			}
-		}
-		else if ( notification.getFeatureID(NamedElement.class) != UmaPackage.NAMED_ELEMENT__NAME ){
-			return;
-		}
-		// name change might change the element's order in the sorted list
-		// refresh the parent content to resort the element list
-		//
-		adapter.fireNotifyChanged(new ViewerNotification(notification, adapter.getParent(notification.getNotifier()), true, false));
-	}	
-	
-	/**
-	 * Checks if the given element <code>e</code> is a contributor of the given <code>base</code>
-	 * @param base
-	 * @param e
-	 * @return
-	 */
-	public static boolean isContributorOf(Object base, VariabilityElement e) {
-		for(VariabilityElement ve = (VariabilityElement) e;
-		ve != null && ve.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL && ve.getVariabilityBasedOnElement() != null;
-		ve = ve.getVariabilityBasedOnElement()) {
-			if(ve.getVariabilityBasedOnElement() == base) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-//	/**
-//	 * Checks if the given parent contains the given child, either via containment or contribution
-//	 * @param parent
-//	 * @param child
-//	 * @return
-//	 */
-//	public static boolean isContainedBy(Artifact parent, Artifact child) {
-//		EObject container = child.eContainer();
-//		if(container instanceof Artifact) {
-//			Artifact currentParent = (Artifact)container;
-//			if(container == parent || isContributorOf(parent, currentParent)) {
-//				return true;
-//			}
-//			Iterator iter = new AbstractTreeIterator(parent, false) {
-//				
-//				private static final long serialVersionUID = 1L;
-//				
-//				protected Iterator getChildren(Object object) {
-//					return ((Artifact)object).getContainedArtifacts().iterator();
-//				}
-//				
-//			};
-//			while(iter.hasNext()) {
-//				Object o = iter.next();
-//				if(o == currentParent || isContributorOf(o, currentParent)) {
-//					return true;
-//				}
-//			}
-//			return false;
-//		}
-//		else {
-//			return UmaUtil.isContainedBy(child, parent);
-//		}
-//	}
-	
-	public static void getConfigurationsToUpdate(MethodPackage parent, MethodPackage pkg, Collection configsToUpdate) {
-		Object configs = ((MultiResourceEObject) parent)
-		.getOppositeFeatureValue(AssociationHelper.MethodPackage_MethodConfigurations);
-		if (configs instanceof List) {
-			for (Iterator itconfig = ((List) configs).iterator(); itconfig
-			.hasNext();) {
-				MethodConfiguration config = (MethodConfiguration) itconfig
-				.next();
-				List pkgs = config.getMethodPackageSelection();
-				if (!pkgs.contains(pkg)) {
-					configsToUpdate.add(config);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Checks if the given object can be estimated
-	 * 
-	 * @param o
-	 * @return
-	 */
-	public static boolean canEstimate(Object o) {
-		return o instanceof Task || o instanceof WorkBreakdownElement;
-	}
-	
-	
-	public static void debugShowAll() {
-		ILibraryInspector inspector = getLibraryInspector();
-		if (inspector != null) {
-			inspector.showAllContents();
-		}
-	}
-	
-	public static void debugShowAll(MethodLibrary lib) {
-		ILibraryInspector inspector = getLibraryInspector();
-		if (inspector != null) {
-			inspector.showAllContents(lib);
-		}
-	}
-	
-	//Used for debug only
-	public static ILibraryInspector getLibraryInspector() {
-		return (ILibraryInspector) ExtensionManager.getExtension("org.eclipse.epf.library.edit", "libraryInspector"); 			//$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	public static boolean isInPluginWithLessThanOneSuperCustomCategory(CustomCategory cc, MethodPlugin plugin) {
-		if(UmaUtil.getMethodPlugin(cc) != plugin) {
-			return false;
-		}
-		List list = AssociationHelper.getCustomCategories(cc);
-		int count = 0;
-		for (Iterator iter = list.iterator(); iter.hasNext() && count < 2;) {
-			CustomCategory cat = (CustomCategory) iter.next();
-			if(UmaUtil.getMethodPlugin(cat) == plugin) {
-				count++;
-			}						
-		}
-		return count < 2;
-	}
-
-	/**
-	 * Check if the given wrapper is under a custom category tree
-	 * 
-	 * @param item
-	 * @return
-	 */
-	public static boolean isUnderCustomCategoryTree(IWrapperItemProvider wrapper) {
-		do {
-			Object owner = wrapper.getOwner();
-			if(unwrap(owner) instanceof CustomCategory) {
-				return true;
-			}
-			wrapper = owner instanceof IWrapperItemProvider ? (IWrapperItemProvider) owner : null;
-		} while(wrapper != null);
-		
-		return false;
-	}
-	
-	public static Collection getExclusiveSubCustomCategories(CustomCategory cc) {
-		ArrayList collection = new ArrayList();
-		collectExclusiveSubCustomCategories(collection, cc, UmaUtil.getMethodPlugin(cc));
-		return collection;
-	}
-	
-	private static void collectExclusiveSubCustomCategories(Collection collection, CustomCategory cc, MethodPlugin plugin) {
-		for (Iterator iter = cc.getCategorizedElements().iterator(); iter.hasNext();) {
-			Object e = (Object) iter.next();
-			if(e instanceof CustomCategory) {
-				CustomCategory sub = (CustomCategory) e;
-				if(isInPluginWithLessThanOneSuperCustomCategory(sub, plugin)) {
-					collection.add(e);
-					collectExclusiveSubCustomCategories(collection, sub, plugin);
-				}
-			}
-		}
-	}
-	
-	public static Object getAdapterByType(Notifier notifier, Object type) {
-		for (Iterator iter = notifier.eAdapters().iterator(); iter.hasNext();) {
-			Adapter adapter = (Adapter) iter.next();
-			if(adapter.isAdapterForType(type)) {
-				return adapter;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Removes all references to a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a map containing the removed references
-	 */
-	public static Map removeReferences(MethodElement element) {
-		return TngUtil.removeReferences(element, false);
-	}
-
-	/**
-	 * Removes all references to a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a map of method elements whose references to the given element
-	 *         are just removed, and their features that hold the references to
-	 *         the given element
-	 */
-	public static Map removeReferences(MethodElement element,
-			boolean checkModify) {
-		// List referencers = new ArrayList();
-		Map objectFeaturesMap = new HashMap();
-		MultiResourceEObject eObj = (MultiResourceEObject) element;
-	
-		if (eObj.basicGetOppositeFeatureMap() == null)
-			return objectFeaturesMap;
-	
-		for (Iterator iter = eObj.getOppositeFeatureMap().entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			OppositeFeature oppositeFeature = ((OppositeFeature) entry.getKey());
-			EStructuralFeature feature = oppositeFeature.getTargetFeature();
-			if (feature.isMany()) {
-				if (oppositeFeature.isMany()) {
-					for (Iterator iterator = new ArrayList((Collection) eObj
-							.getOppositeFeatureValue(oppositeFeature))
-							.iterator(); iterator.hasNext();) {
-						EObject obj = (EObject) iterator.next();
-						if (checkModify) {
-							checkModify(obj);
-						}
-						((List) obj.eGet(feature)).remove(element);
-						List features = (List) objectFeaturesMap.get(obj);
-						if (features == null) {
-							features = new ArrayList();
-							objectFeaturesMap.put(obj, features);
-						}
-						features.add(feature);
-					}
-				} else {
-					EObject obj = (EObject) eObj
-							.getOppositeFeatureValue(oppositeFeature);
-					if (obj != null) {
-						if (checkModify) {
-							checkModify(obj);
-						}
-						((List) obj.eGet(feature)).remove(element);
-						List features = (List) objectFeaturesMap.get(obj);
-						if (features == null) {
-							features = new ArrayList();
-							objectFeaturesMap.put(obj, features);
-						}
-						features.add(feature);
-					}
-				}
-			} else {
-				if (oppositeFeature.isMany()) {
-					for (Iterator iterator = new ArrayList((Collection) eObj
-							.getOppositeFeatureValue(oppositeFeature))
-							.iterator(); iterator.hasNext();) {
-						EObject obj = (EObject) iterator.next();
-						if (checkModify) {
-							checkModify(obj);
-						}
-						obj.eSet(feature, null);
-						List features = (List) objectFeaturesMap.get(obj);
-						if (features == null) {
-							features = new ArrayList();
-							objectFeaturesMap.put(obj, features);
-						}
-						features.add(feature);
-					}
-				} else {
-					EObject obj = (EObject) eObj
-							.getOppositeFeatureValue(oppositeFeature);
-					if (obj != null) {
-						if (checkModify) {
-							checkModify(obj);
-						}
-						obj.eSet(feature, null);
-						List features = (List) objectFeaturesMap.get(obj);
-						if (features == null) {
-							features = new ArrayList();
-							objectFeaturesMap.put(obj, features);
-						}
-						features.add(feature);
-					}
-				}
-			}
-		}
-		// for (Iterator iter = objectFeaturesMap.entrySet().iterator();
-		// iter.hasNext();) {
-		// Map.Entry entry = (Map.Entry) iter.next();
-		// referencers.add(new Referencer((EObject)entry.getKey(),
-		// (List)entry.getValue()));
-		// }
-		// return referencers;
-		return objectFeaturesMap;
-	}
-	
-	/**
-	 * Return publishing category property for method element
-	 * @param element
-	 * @return
-	 * 		 property if found, else null
-	 */
-	public static MethodElementProperty getPublishCategoryProperty(MethodElement element) {
-		List props = element.getMethodElementProperty();
-		if (props == null || props.size() == 0) {
-			return null;
-		}
-
-		for (Iterator it = props.iterator(); it.hasNext();) {
-			MethodElementProperty prop = (MethodElementProperty) it.next();
-			if (PUBLISH_CATEGORY_PROPERTY.equals(prop.getName())) {
-				return prop;
-			}
-		}
-
-		return null;
-	}
-
-	public static List getNotifyChangedListeners(AdapterFactory adapterFactory, Object obj) {
-		if (obj instanceof CustomCategory) {
-			CustomCategoryItemProvider adapter = (CustomCategoryItemProvider) adapterFactory.adapt(obj, ITreeItemContentProvider.class);
-			return adapter.getNotifyChangedListeners();
-		}
-		if (obj instanceof RoleSet) {
-			RoleSetItemProvider adapter = (RoleSetItemProvider) adapterFactory.adapt(obj, ITreeItemContentProvider.class);
-			return adapter.getNotifyChangedListeners();
-		} else if (obj instanceof Discipline) {
-			DisciplineItemProvider adapter = (DisciplineItemProvider) adapterFactory.adapt(obj, ITreeItemContentProvider.class);
-			return adapter.getNotifyChangedListeners();
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * Gets the wrapper for the given value in the given wrappers.
-	 * 
-	 * @param wrappers
-	 * @param value
-	 * @return
-	 */
-	public static FeatureValueWrapperItemProvider getWrapper(Collection wrappers, Object value) {
-		if (wrappers == null)
-			return null;
-		for (Iterator iter = wrappers.iterator(); iter.hasNext();) {
-			Object listener = (Object) iter.next();
-			if(listener instanceof FeatureValueWrapperItemProvider
-					&& unwrap(listener) == value) {
-				return (FeatureValueWrapperItemProvider) listener;
-			}
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/WrapperManager.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/WrapperManager.java
deleted file mode 100644
index 52025b6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/WrapperManager.java
+++ /dev/null
@@ -1,136 +0,0 @@
-///------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IWrapperItemProvider;
-
-/**
- * Manages wrappers of an item provider
- * 
- * @author Phong Nguyen Le - Feb 15, 2006
- * @since  1.0
- */
-public class WrapperManager implements IDisposable {
-
-	private HashMap valueToWrapperMap;
-	private AdapterFactory adapterFactory;
-
-	/**
-	 * 
-	 */
-	public WrapperManager(AdapterFactory adapterFactory) {
-		super();
-		this.adapterFactory = adapterFactory;
-	}
-	
-	public Object getWrapper(Object value) {
-		if(valueToWrapperMap != null) {
-			return valueToWrapperMap.get(value);
-		}
-		return null;
-	}
-	
-	public Collection getWrappers() {
-		if(valueToWrapperMap != null) {
-			return valueToWrapperMap.values();
-		}
-		else {
-			return Collections.EMPTY_LIST;
-		}
-	}
-	
-	/**
-	 * Creates a new instance of this wrapper for the given value, owner, and adapter factory.
-	 */
-	protected IWrapperItemProvider createWrapper(Object value, Object owner, AdapterFactory adapterFactory) {
-		return new DelegatingWrapperItemProvider(value, owner, null, CommandParameter.NO_INDEX, adapterFactory);
-	}
-
-	public void update(Collection delegateValues) {
-		boolean changed = false;
-		Set oldDelegateValues = delegateValues != null ? new HashSet(delegateValues) : Collections.EMPTY_SET;
-		
-		if (valueToWrapperMap == null && !delegateValues.isEmpty())
-		{
-			valueToWrapperMap = new HashMap();
-		}
-		
-		// Wrap any new children and add them to the map. Remove each current child from the set of old children.
-		//
-		for (Iterator i = delegateValues.iterator(); i.hasNext(); )
-		{
-			Object child = i.next();
-			
-			if (!valueToWrapperMap.containsKey(child))
-			{
-				IWrapperItemProvider wrapper = createWrapper(child, this, adapterFactory);
-				valueToWrapperMap.put(child, wrapper);
-				changed = true;
-			}
-			oldDelegateValues.remove(child);
-		}
-		
-		// Remove and dispose any wrappers for remaining old children.
-		//
-		if (!oldDelegateValues.isEmpty())
-		{
-			changed = true;
-			
-			for (Iterator i = oldDelegateValues.iterator(); i.hasNext(); )
-			{
-				Object child = i.next();
-				
-				IWrapperItemProvider wrapper = (IWrapperItemProvider)valueToWrapperMap.remove(child);
-				if (wrapper != null)
-				{
-					wrapper.dispose();
-				}
-			}
-		}
-		
-		// If any children were added or removed, reset the indices.
-		if (changed)
-		{
-			int index = 0;
-			for (Iterator i = delegateValues.iterator(); i.hasNext(); index++)
-			{
-				((IWrapperItemProvider)valueToWrapperMap.get(i.next())).setIndex(index);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.IDisposable#dispose()
-	 */
-	public void dispose() {
-	    if (valueToWrapperMap != null)
-	    {
-	      for (Iterator i = valueToWrapperMap.values().iterator(); i.hasNext();)
-	      {
-	        ((IDisposable)i.next()).dispose();
-	      }
-	      valueToWrapperMap.clear();
-	      valueToWrapperMap = null;
-	    }
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/ModelFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/ModelFactory.java
deleted file mode 100644
index 344fe22..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/ModelFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model;
-
-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.epf.library.edit.util.model.ModelPackage
- * @generated
- */
-public interface ModelFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	ModelFactory eINSTANCE = new org.eclipse.epf.library.edit.util.model.impl.ModelFactoryImpl();
-
-	/**
-	 * Returns a new object of class '<em>Order Info</em>'. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Order Info</em>'.
-	 * @generated
-	 */
-	OrderInfo createOrderInfo();
-
-	/**
-	 * Returns a new object of class '<em>Order Info Collection</em>'. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Order Info Collection</em>'.
-	 * @generated
-	 */
-	OrderInfoCollection createOrderInfoCollection();
-
-	/**
-	 * Returns the package supported by this factory. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	ModelPackage getModelPackage();
-
-} // ModelFactory
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/ModelPackage.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/ModelPackage.java
deleted file mode 100644
index ebda5e2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/ModelPackage.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model;
-
-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.epf.library.edit.util.model.ModelFactory
- * @generated
- */
-public interface ModelPackage extends EPackage {
-	/**
-	 * The package name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNAME = "model"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_URI = "http:///com/ibm/uma/edit/tng/util/model.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_PREFIX = "org.eclipse.epf.uma.edit.tng.util.model"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	ModelPackage eINSTANCE = org.eclipse.epf.library.edit.util.model.impl.ModelPackageImpl
-			.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.library.edit.util.model.impl.OrderInfoImpl <em>Order Info</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.epf.library.edit.util.model.impl.OrderInfoImpl
-	 * @see org.eclipse.epf.library.edit.util.model.impl.ModelPackageImpl#getOrderInfo()
-	 * @generated
-	 */
-	int ORDER_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ORDER_INFO__NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>GUI Ds</b></em>' attribute list. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ORDER_INFO__GUI_DS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Timestamp</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ORDER_INFO__TIMESTAMP = 2;
-
-	/**
-	 * The number of structural features of the the '<em>Order Info</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ORDER_INFO_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.library.edit.util.model.impl.OrderInfoCollectionImpl <em>Order Info Collection</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.epf.library.edit.util.model.impl.OrderInfoCollectionImpl
-	 * @see org.eclipse.epf.library.edit.util.model.impl.ModelPackageImpl#getOrderInfoCollection()
-	 * @generated
-	 */
-	int ORDER_INFO_COLLECTION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Order Infos</b></em>' containment
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ORDER_INFO_COLLECTION__ORDER_INFOS = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Order Info Collection</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ORDER_INFO_COLLECTION_FEATURE_COUNT = 1;
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.library.edit.util.model.OrderInfo <em>Order Info</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Order Info</em>'.
-	 * @see org.eclipse.epf.library.edit.util.model.OrderInfo
-	 * @generated
-	 */
-	EClass getOrderInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.library.edit.util.model.OrderInfo#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.library.edit.util.model.OrderInfo#getName()
-	 * @see #getOrderInfo()
-	 * @generated
-	 */
-	EAttribute getOrderInfo_Name();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.library.edit.util.model.OrderInfo#getGUIDs <em>GUI Ds</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute list '<em>GUI Ds</em>'.
-	 * @see org.eclipse.epf.library.edit.util.model.OrderInfo#getGUIDs()
-	 * @see #getOrderInfo()
-	 * @generated
-	 */
-	EAttribute getOrderInfo_GUIDs();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.library.edit.util.model.OrderInfo#getTimestamp <em>Timestamp</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Timestamp</em>'.
-	 * @see org.eclipse.epf.library.edit.util.model.OrderInfo#getTimestamp()
-	 * @see #getOrderInfo()
-	 * @generated
-	 */
-	EAttribute getOrderInfo_Timestamp();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.library.edit.util.model.OrderInfoCollection <em>Order Info Collection</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Order Info Collection</em>'.
-	 * @see org.eclipse.epf.library.edit.util.model.OrderInfoCollection
-	 * @generated
-	 */
-	EClass getOrderInfoCollection();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.library.edit.util.model.OrderInfoCollection#getOrderInfos <em>Order Infos</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Order Infos</em>'.
-	 * @see org.eclipse.epf.library.edit.util.model.OrderInfoCollection#getOrderInfos()
-	 * @see #getOrderInfoCollection()
-	 * @generated
-	 */
-	EReference getOrderInfoCollection_OrderInfos();
-
-	/**
-	 * 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
-	 */
-	ModelFactory getModelFactory();
-
-} // ModelPackage
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/OrderInfo.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/OrderInfo.java
deleted file mode 100644
index 7e2e4cb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/OrderInfo.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * @model
- */
-public interface OrderInfo extends EObject {
-	public static final String TYPE_MANUAL = "manual"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 * @return
-	 * @model
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.library.edit.util.model.OrderInfo#getName <em>Name</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * 
-	 * @return
-	 * @model type="java.lang.String" containment="true"
-	 */
-	EList getGUIDs();
-
-	/**
-	 * Returns the value of the '<em><b>Timestamp</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Timestamp</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Timestamp</em>' attribute.
-	 * @see #setTimestamp(long)
-	 * @see org.eclipse.epf.library.edit.util.model.ModelPackage#getOrderInfo_Timestamp()
-	 * @model
-	 * @generated
-	 */
-	long getTimestamp();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.library.edit.util.model.OrderInfo#getTimestamp <em>Timestamp</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Timestamp</em>' attribute.
-	 * @see #getTimestamp()
-	 * @generated
-	 */
-	void setTimestamp(long value);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/OrderInfoCollection.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/OrderInfoCollection.java
deleted file mode 100644
index 4fe8dec..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/OrderInfoCollection.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * Collection of order information
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @model
- */
-public interface OrderInfoCollection extends EObject {
-
-	/**
-	 * @return
-	 * @model type="com.ibm.library.edit.util.model.OrderInfo"
-	 *        containement="true"
-	 */
-	EList getOrderInfos();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/editutil.ecore b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/editutil.ecore
deleted file mode 100644
index a98763a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/editutil.ecore
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model"
-    nsURI="http:///com/ibm/uma/edit/tng/util/model.ecore" nsPrefix="com.ibm.uma.edit.tng.util.model">
-  <eClassifiers xsi:type="ecore:EClass" name="OrderInfo">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        defaultValueLiteral="manual"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="gUIDs" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="timestamp" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OrderInfoCollection">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="orderInfos" upperBound="-1"
-        eType="#//OrderInfo" containment="true"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/editutil.genmodel b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/editutil.genmodel
deleted file mode 100644
index 40ca649..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/editutil.genmodel
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/com.ibm.uma.edit.tng/src"
-    editDirectory="/com.ibm.uma.resourcemanager.edit/src" editorDirectory="/com.ibm.uma.resourcemanager.editor/src"
-    modelPluginID="com.ibm.uma.edit.tng" runtimeJar="true" modelName="editutil" editPluginClass="com.ibm.uma.resourcemanager.provider.editutilEditPlugin"
-    editorPluginClass="com.ibm.uma.resourcemanager.presentation.editutilEditorPlugin"
-    runtimeCompatibility="false">
-  <foreignModel>@model</foreignModel>
-  <genPackages prefix="Model" basePackage="com.ibm.uma.edit.tng.util" ecorePackage="editutil.ecore#/">
-    <genClasses ecoreClass="editutil.ecore#//OrderInfo">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute editutil.ecore#//OrderInfo/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute editutil.ecore#//OrderInfo/gUIDs"/>
-    </genClasses>
-    <genClasses ecoreClass="editutil.ecore#//OrderInfoCollection">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference editutil.ecore#//OrderInfoCollection/orderInfos"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/ModelFactoryImpl.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/ModelFactoryImpl.java
deleted file mode 100644
index 2dbf145..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/ModelFactoryImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.epf.library.edit.util.model.ModelFactory;
-import org.eclipse.epf.library.edit.util.model.ModelPackage;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class ModelFactoryImpl extends EFactoryImpl implements ModelFactory {
-	/**
-	 * Creates and instance of the factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ModelFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-		case ModelPackage.ORDER_INFO:
-			return createOrderInfo();
-		case ModelPackage.ORDER_INFO_COLLECTION:
-			return createOrderInfoCollection();
-		default:
-			throw new IllegalArgumentException(
-					"The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public OrderInfo createOrderInfo() {
-		OrderInfoImpl orderInfo = new OrderInfoImpl();
-		return orderInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public OrderInfoCollection createOrderInfoCollection() {
-		OrderInfoCollectionImpl orderInfoCollection = new OrderInfoCollectionImpl();
-		return orderInfoCollection;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ModelPackage getModelPackage() {
-		return (ModelPackage) getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @deprecated
-	 * @generated
-	 */
-	public static ModelPackage getPackage() {
-		return ModelPackage.eINSTANCE;
-	}
-
-} // ModelFactoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/ModelPackageImpl.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/ModelPackageImpl.java
deleted file mode 100644
index 2883e4b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/ModelPackageImpl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model.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.epf.library.edit.util.model.ModelFactory;
-import org.eclipse.epf.library.edit.util.model.ModelPackage;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Package</b>. <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class ModelPackageImpl extends EPackageImpl implements ModelPackage {
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass orderInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass orderInfoCollectionEClass = 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.epf.library.edit.util.model.ModelPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private ModelPackageImpl() {
-		super(eNS_URI, ModelFactory.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. Simple dependencies are
-	 * satisfied by calling this method on all dependent packages before doing
-	 * anything else. This method drives initialization for interdependent
-	 * packages directly, in parallel with this package, itself.
-	 * <p>
-	 * Of this package and its interdependencies, all packages which have not
-	 * yet been registered by their URI values are first created and registered.
-	 * The packages are then initialized in two steps: meta-model objects for
-	 * all of the packages are created before any are initialized, since one
-	 * package's meta-model objects may refer to those of another.
-	 * <p>
-	 * Invocation of this method will not affect any packages that have already
-	 * been initialized. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static ModelPackage init() {
-		if (isInited)
-			return (ModelPackage) EPackage.Registry.INSTANCE
-					.getEPackage(ModelPackage.eNS_URI);
-
-		// Obtain or create and register package
-		ModelPackageImpl theModelPackage = (ModelPackageImpl) (EPackage.Registry.INSTANCE
-				.getEPackage(eNS_URI) instanceof ModelPackageImpl ? EPackage.Registry.INSTANCE
-				.getEPackage(eNS_URI)
-				: new ModelPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theModelPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theModelPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theModelPackage.freeze();
-
-		return theModelPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getOrderInfo() {
-		return orderInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getOrderInfo_Name() {
-		return (EAttribute) orderInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getOrderInfo_GUIDs() {
-		return (EAttribute) orderInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getOrderInfo_Timestamp() {
-		return (EAttribute) orderInfoEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getOrderInfoCollection() {
-		return orderInfoCollectionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getOrderInfoCollection_OrderInfos() {
-		return (EReference) orderInfoCollectionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ModelFactory getModelFactory() {
-		return (ModelFactory) 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
-		orderInfoEClass = createEClass(ORDER_INFO);
-		createEAttribute(orderInfoEClass, ORDER_INFO__NAME);
-		createEAttribute(orderInfoEClass, ORDER_INFO__GUI_DS);
-		createEAttribute(orderInfoEClass, ORDER_INFO__TIMESTAMP);
-
-		orderInfoCollectionEClass = createEClass(ORDER_INFO_COLLECTION);
-		createEReference(orderInfoCollectionEClass,
-				ORDER_INFO_COLLECTION__ORDER_INFOS);
-	}
-
-	/**
-	 * <!-- 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);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(
-				orderInfoEClass,
-				OrderInfo.class,
-				"OrderInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getOrderInfo_Name(),
-				ecorePackage.getEString(),
-				"name", null, 0, 1, OrderInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getOrderInfo_GUIDs(),
-				ecorePackage.getEString(),
-				"gUIDs", null, 0, -1, OrderInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getOrderInfo_Timestamp(),
-				ecorePackage.getELong(),
-				"timestamp", null, 0, 1, OrderInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				orderInfoCollectionEClass,
-				OrderInfoCollection.class,
-				"OrderInfoCollection", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getOrderInfoCollection_OrderInfos(),
-				this.getOrderInfo(),
-				null,
-				"orderInfos", null, 0, -1, OrderInfoCollection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} // ModelPackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/OrderInfoCollectionImpl.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/OrderInfoCollectionImpl.java
deleted file mode 100644
index 3e8501a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/OrderInfoCollectionImpl.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model.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.EStructuralFeature;
-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.epf.library.edit.util.model.ModelPackage;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Order Info Collection</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.epf.library.edit.util.model.impl.OrderInfoCollectionImpl#getOrderInfos <em>Order Infos</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class OrderInfoCollectionImpl extends EObjectImpl implements
-		OrderInfoCollection {
-	/**
-	 * The cached value of the '{@link #getOrderInfos() <em>Order Infos</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getOrderInfos()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList orderInfos = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected OrderInfoCollectionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ModelPackage.eINSTANCE.getOrderInfoCollection();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getOrderInfos() {
-		if (orderInfos == null) {
-			orderInfos = new EObjectContainmentEList(OrderInfo.class, this,
-					ModelPackage.ORDER_INFO_COLLECTION__ORDER_INFOS);
-		}
-		return orderInfos;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case ModelPackage.ORDER_INFO_COLLECTION__ORDER_INFOS:
-				return ((InternalEList) getOrderInfos()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO_COLLECTION__ORDER_INFOS:
-			return getOrderInfos();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO_COLLECTION__ORDER_INFOS:
-			getOrderInfos().clear();
-			getOrderInfos().addAll((Collection) newValue);
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO_COLLECTION__ORDER_INFOS:
-			getOrderInfos().clear();
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO_COLLECTION__ORDER_INFOS:
-			return orderInfos != null && !orderInfos.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} // OrderInfoCollectionImpl
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/OrderInfoImpl.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/OrderInfoImpl.java
deleted file mode 100644
index b2cf258..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/OrderInfoImpl.java
+++ /dev/null
@@ -1,262 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
-import org.eclipse.epf.library.edit.util.model.ModelPackage;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Order Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.epf.library.edit.util.model.impl.OrderInfoImpl#getName <em>Name</em>}</li>
- * <li>{@link org.eclipse.epf.library.edit.util.model.impl.OrderInfoImpl#getGUIDs <em>GUI Ds</em>}</li>
- * <li>{@link org.eclipse.epf.library.edit.util.model.impl.OrderInfoImpl#getTimestamp <em>Timestamp</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class OrderInfoImpl extends EObjectImpl implements OrderInfo {
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getGUIDs() <em>GUI Ds</em>}' attribute
-	 * list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getGUIDs()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList gUIDs = null;
-
-	/**
-	 * The default value of the '{@link #getTimestamp() <em>Timestamp</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getTimestamp()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final long TIMESTAMP_EDEFAULT = 0L;
-
-	/**
-	 * The cached value of the '{@link #getTimestamp() <em>Timestamp</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getTimestamp()
-	 * @generated
-	 * @ordered
-	 */
-	protected long timestamp = TIMESTAMP_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected OrderInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return ModelPackage.eINSTANCE.getOrderInfo();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					ModelPackage.ORDER_INFO__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getGUIDs() {
-		if (gUIDs == null) {
-			gUIDs = new EDataTypeUniqueEList(String.class, this,
-					ModelPackage.ORDER_INFO__GUI_DS);
-		}
-		return gUIDs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public long getTimestamp() {
-		return timestamp;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setTimestamp(long newTimestamp) {
-		long oldTimestamp = timestamp;
-		timestamp = newTimestamp;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					ModelPackage.ORDER_INFO__TIMESTAMP, oldTimestamp, timestamp));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO__NAME:
-			return getName();
-		case ModelPackage.ORDER_INFO__GUI_DS:
-			return getGUIDs();
-		case ModelPackage.ORDER_INFO__TIMESTAMP:
-			return new Long(getTimestamp());
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO__NAME:
-			setName((String) newValue);
-			return;
-		case ModelPackage.ORDER_INFO__GUI_DS:
-			getGUIDs().clear();
-			getGUIDs().addAll((Collection) newValue);
-			return;
-		case ModelPackage.ORDER_INFO__TIMESTAMP:
-			setTimestamp(((Long) newValue).longValue());
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case ModelPackage.ORDER_INFO__GUI_DS:
-			getGUIDs().clear();
-			return;
-		case ModelPackage.ORDER_INFO__TIMESTAMP:
-			setTimestamp(TIMESTAMP_EDEFAULT);
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case ModelPackage.ORDER_INFO__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case ModelPackage.ORDER_INFO__GUI_DS:
-			return gUIDs != null && !gUIDs.isEmpty();
-		case ModelPackage.ORDER_INFO__TIMESTAMP:
-			return timestamp != TIMESTAMP_EDEFAULT;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(", gUIDs: "); //$NON-NLS-1$
-		result.append(gUIDs);
-		result.append(", timestamp: "); //$NON-NLS-1$
-		result.append(timestamp);
-		result.append(')');
-		return result.toString();
-	}
-
-} // OrderInfoImpl
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/package.html
deleted file mode 100644
index 5482ac2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for ordering content elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/package.html
deleted file mode 100644
index 3f23bb1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for ordering content elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/ModelAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/ModelAdapterFactory.java
deleted file mode 100644
index 35e9128..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/ModelAdapterFactory.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model.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.epf.library.edit.util.model.ModelPackage;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-
-
-/**
- * <!-- 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.epf.library.edit.util.model.ModelPackage
- * @generated
- */
-public class ModelAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static ModelPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ModelAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = ModelPackage.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
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject) object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ModelSwitch modelSwitch = new ModelSwitch() {
-		public Object caseOrderInfo(OrderInfo object) {
-			return createOrderInfoAdapter();
-		}
-
-		public Object caseOrderInfoCollection(OrderInfoCollection object) {
-			return createOrderInfoCollectionAdapter();
-		}
-
-		public Object 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
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter) modelSwitch.doSwitch((EObject) target);
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.library.edit.util.model.OrderInfo <em>Order Info</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.epf.library.edit.util.model.OrderInfo
-	 * @generated
-	 */
-	public Adapter createOrderInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.library.edit.util.model.OrderInfoCollection <em>Order Info Collection</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.epf.library.edit.util.model.OrderInfoCollection
-	 * @generated
-	 */
-	public Adapter createOrderInfoCollectionAdapter() {
-		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;
-	}
-
-} // ModelAdapterFactory
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/ModelSwitch.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/ModelSwitch.java
deleted file mode 100644
index 6d916cd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/ModelSwitch.java
+++ /dev/null
@@ -1,161 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.util.model.ModelPackage;
-import org.eclipse.epf.library.edit.util.model.OrderInfo;
-import org.eclipse.epf.library.edit.util.model.OrderInfoCollection;
-
-
-/**
- * <!-- 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.epf.library.edit.util.model.ModelPackage
- * @generated
- */
-public class ModelSwitch {
-	/**
-	 * The cached model package <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static ModelPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ModelSwitch() {
-		if (modelPackage == null) {
-			modelPackage = ModelPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		} else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return eSuperTypes.isEmpty() ? defaultCase(theEObject) : doSwitch(
-					(EClass) eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-		case ModelPackage.ORDER_INFO: {
-			OrderInfo orderInfo = (OrderInfo) theEObject;
-			Object result = caseOrderInfo(orderInfo);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case ModelPackage.ORDER_INFO_COLLECTION: {
-			OrderInfoCollection orderInfoCollection = (OrderInfoCollection) theEObject;
-			Object result = caseOrderInfoCollection(orderInfoCollection);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		default:
-			return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Order Info</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 interpretting the object as an instance of '<em>Order Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderInfo(OrderInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Order Info Collection</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 interpretting the object as an instance of '<em>Order Info Collection</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderInfoCollection(OrderInfoCollection object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting 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 interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} // ModelSwitch
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/StringResource.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/StringResource.java
deleted file mode 100644
index 715de4a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/StringResource.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.util.model.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringBufferInputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
-
-/**
- * Resource to store string
- * 
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class StringResource extends XMIResourceImpl {
-	private ByteArrayOutputStream out;
-
-	private String str;
-
-	public StringResource(String str) {
-		this.str = str;
-	}
-
-	public void save(Map options) throws IOException {
-		out = new ByteArrayOutputStream();
-		try {
-			save(out, options);
-		} finally {
-			out.close();
-		}
-	}
-
-	public String getString() {
-		if (out == null)
-			return null;
-		if (encoding == null) {
-			return out.toString();
-		}
-		try {
-			return out.toString(encoding);
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	public void load(Map options) throws IOException {
-		if (!isLoaded) {
-			InputStream inputStream = new StringBufferInputStream(str);
-			try {
-				load(inputStream, options);
-			} finally {
-				inputStream.close();
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/package.html
deleted file mode 100644
index 871aaf2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/model/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for ordering content elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/package.html
deleted file mode 100644
index d78b741..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides editing and querying support for method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/AbstractStringValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/AbstractStringValidator.java
deleted file mode 100644
index 6ff268f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/AbstractStringValidator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public abstract class AbstractStringValidator implements IValidator {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.Object)
-	 */
-	public IStatus isValid(Object value) {
-		if(value instanceof String) {
-			String msg = isValid((String)value);
-			if(msg == null) {
-				return Status.OK_STATUS;
-			}
-			else {
-				return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault().getId(),
-						0, msg, null);
-			}
-		}
-		throw new IllegalArgumentException();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/CircularDependencyCheck.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/CircularDependencyCheck.java
deleted file mode 100644
index 5b6996c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/CircularDependencyCheck.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * This class does circular dependency check
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class CircularDependencyCheck {
-		
-	private DependencyInfoMgr depInfoMgr;
-	private IDependencyInfo veInfo;
-	private boolean move = false;
-	
-	public CircularDependencyCheck(DependencyInfoMgr mgr, VariabilityElement ve,
-								boolean filter, boolean move) {
-		depInfoMgr = mgr;
-		veInfo = depInfoMgr.registerVariabilityElement(ve, filter, false);
-		this.move = move;
-	}
-	
-	protected DependencyInfoMgr getDepInfoMgr() {
-		return depInfoMgr;
-	}
-	
-	protected IDependencyInfo getVeInfo() {
-		return veInfo;
-	}
-		
-	public boolean accept(Object obj) {
-
-		if (reachable(obj, true, true)) {
-			return false;
-		}
-		
-		if (move) {
-			if(!(obj instanceof VariabilityElement)) return true;
-			VariabilityElement objVeBase = ((VariabilityElement) obj).getVariabilityBasedOnElement();
-			if (objVeBase != null) {
-				IDependencyInfo info = depInfoMgr.registerVariabilityElement(objVeBase, false, false);	
-				if (info.reachableBy(veInfo)) {
-					return false;
-				}
-			}
-		}
-				
-		return true;
-	}
-	
-	private boolean reachable(Object obj, boolean checkReachableByObj, boolean checkReachableToObj) {
-		if (! (obj instanceof VariabilityElement)) {
-			return false;
-		}
-		
-		VariabilityElement ve = (VariabilityElement) veInfo.getElement();
-		if (ve == obj) {
-			return true;			
-		}
-
-		IDependencyInfo objVeInfo = depInfoMgr.registerVariabilityElement( (VariabilityElement) obj, false, move);		
-		
-		if (checkReachableByObj && veInfo.reachableBy(objVeInfo)) {
-			return true;
-		}
-		
-		if (checkReachableToObj && objVeInfo.reachableBy(veInfo)) {
-			return true;
-		}		
-		
-		return false;
-	}	
-	
-	public boolean reachableBy(Object obj) {
-		return reachable(obj, true, false);
-	}
-	
-	public boolean reachableTo(Object obj) {
-		return reachable(obj, false, true);
-	}	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/CircularDependencyCheckFilter.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/CircularDependencyCheckFilter.java
deleted file mode 100644
index cb753ad..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/CircularDependencyCheckFilter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.Map;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * This class implements a filter for circular dependency check
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class CircularDependencyCheckFilter extends CircularDependencyCheck implements IFilter {	
-	
-	private Map ancestorMap;
-	
-	
-	public CircularDependencyCheckFilter(DependencyInfoMgr mgr, VariabilityElement ve) {
-		super(mgr, ve, true, false);
-		
-		
-		
-	}			
-	
-	public boolean accept(Object obj) {
-		return super.accept(obj);
-	}
-	
-/*	public static boolean VeToCheck(Object obj) {
-		return 	obj instanceof Domain || 				//getSubdomains
-				obj instanceof CustomCategory || 		//getSubCategories
-				obj instanceof Artifact || 				//getContainedArtifacts
-				obj instanceof Practice || 				//getSubPractices
-				obj instanceof Deliverable ||			//getDeliveredWorkProducts
-				obj instanceof Activity;				//getBreakdownElements
-	}*/
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyChecker.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyChecker.java
deleted file mode 100644
index 65aef45..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyChecker.java
+++ /dev/null
@@ -1,572 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This class has static methods that check for cycles in the element dependency
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class DependencyChecker {
-	private static final IStatus ERROR_STATUS = new Status(IStatus.ERROR,
-			LibraryEditPlugin.getDefault().getId(), 0, "", null); //$NON-NLS-1$
-	
-	public static boolean newCheck 		= true;			//temp flag, will be removed!
-	public static boolean newCheckAct 	= true;			//temp flag, will be removed!
-
-	/**
-	 * Checks for the cycles in the dependency graph of the given feature if the
-	 * given value is added/assigned to it.
-	 * 
-	 * @param owner
-	 *            the owner of the feature
-	 * @param feature
-	 *            the feature to check for circular dependency
-	 * @param value
-	 *            the value to be added/assigned to the feature
-	 * @return check status, OK if no cycle, ERROR if there will be circular
-	 *         dependency
-	 */
-	public static IStatus checkCircularDependency(EObject owner,
-			final EStructuralFeature feature, Object value) {
-		if (feature == UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS) {
-			if (value instanceof Activity) {
-				Activity activity = (Activity) owner;
-				VariabilityType type = activity.getVariabilityType();
-				return checkCircularDependency(activity, (Activity) value, type);
-			}
-		} else if (feature == UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT) {
-			if (isCircularDependency((VariabilityElement) owner,
-					(VariabilityElement) value)) {
-				return ERROR_STATUS;
-			}
-		} else if (feature == UmaPackage.Literals.DELIVERABLE__DELIVERED_WORK_PRODUCTS) {
-			if (!checkCircularDeliverables((Deliverable)value, (Deliverable)owner)) {
-				return ERROR_STATUS;
-			}
-		} else {
-			if (feature.isMany()) {
-				Iterator iter = new AbstractTreeIterator(value) {
-
-					/**
-					 * Comment for <code>serialVersionUID</code>
-					 */
-					private static final long serialVersionUID = 0L;
-
-					protected Iterator getChildren(Object object) {
-						if (feature.getContainerClass().isInstance(object)) {
-							EObject eObject = (EObject) object;
-							List list = (List) eObject.eGet(feature);
-							if (!list.isEmpty()) {
-								ArrayList children = new ArrayList();
-								for (Iterator iterator = list.iterator(); iterator
-										.hasNext();) {
-									Object element = iterator.next();
-									if (feature.getContainerClass().isInstance(
-											element)) {
-										children.add(element);
-									}
-								}
-								return children.iterator();
-							}
-						}
-						return Collections.EMPTY_LIST.iterator();
-					}
-
-				};
-
-				while (iter.hasNext()) {
-					if (iter.next() == owner) {
-						return ERROR_STATUS;
-					}
-				}
-
-			} else {
-				if (feature.getContainerClass().isInstance(value)) {
-					EObject v = (EObject) value;
-					do {
-						if (v == owner) {
-							return ERROR_STATUS;
-						}
-						Object o = v.eGet(feature);
-						if (feature.getContainerClass().isInstance(o)) {
-							v = (EObject) o;
-						} else {
-							v = null;
-						}
-					} while (v != null);
-				}
-			}
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Checks for circular dependency if the given activity is applied to the
-	 * given target activity via extend or copy.
-	 * 
-	 * @param activity activity to apply
-	 * @param target target activity to add extension or copy of the given activity
-	 * @return status of this check
-	 */
-	public static IStatus checkCircularDependency(Activity activity, Activity target) {
-		if (isParent(activity, target)) {
-			Object[] args = { target.getName() };
-			String message = NLS
-					.bind(
-							LibraryEditResources.activity_variability_error_msg1,
-							args);
-
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		Process process = TngUtil.getOwningProcess(target);
-		if(!newCheckAct && hasCyclicDependency(activity, process) ||
-				newCheckAct && sourceReachableByTarget(activity, target)) {
-			Object[] args = { activity.getName(), process.getName() };
-			String message = NLS.bind(
-							LibraryEditResources.apply_pattern_error_msg,
-							args);
-
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		else if(ProcessUtil.hasContributorOrReplacer(activity)) {
-			Object[] args = { activity.getName(), process.getName() };
-			String message = NLS
-					.bind(
-							LibraryEditResources.apply_pattern_error_msg1,
-							args);
-
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-
-		}
-		return Status.OK_STATUS;
-	}
-	
-	private static boolean hasCyclicDependency(Activity activity, Process process) {
-		Iterator iter = new AbstractTreeIterator(activity) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 0L;
-
-			protected Iterator getChildren(Object object) {
-				if (object instanceof Activity) {
-					ArrayList children = new ArrayList();
-					for (Iterator iterator = ((Activity) object)
-							.getBreakdownElements().iterator(); iterator
-							.hasNext();) {
-						Object element = iterator.next();
-						if (element instanceof VariabilityElement) {
-							children.add(element);
-						}
-					}
-					return children.iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-
-		};
-
-		while (iter.hasNext()) {
-			VariabilityElement ve = (VariabilityElement) iter.next();
-			VariabilityElement base = ve.getVariabilityBasedOnElement();
-			VariabilityType vType = ve.getVariabilityType();
-			if (base != null && (vType == VariabilityType.EXTENDS_LITERAL)) {
-				Process proc = TngUtil
-						.getOwningProcess((BreakdownElement) base);
-				if (proc == process) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Checks if the given parent is a super activity of child.
-	 * 
-	 * @param parent
-	 * @param child
-	 * @return
-	 */
-	public static boolean isParent(Activity parent, BreakdownElement child) {
-		for (Activity act = child.getSuperActivities(); act != null; act = act
-				.getSuperActivities()) {
-			if (act == parent) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks for cycles in dependency path of the given activity
-	 * <code>act</code> if <code>base</code> is the base activity of
-	 * <code>act</code> for given variability type
-	 * 
-	 * @param act
-	 * @param base
-	 * @param type
-	 * @return
-	 */
-	public static IStatus checkCircularDependency(Activity act, Activity base,
-			VariabilityType type) {
-		return checkCircularDependency(act, base, type, false);
-	}
-	
-	public static IStatus checkCircularDependencyAfterFilterSelection(Activity act, Activity base,
-			VariabilityType type) {
-		return checkCircularDependency(act, base, type, true);
-	}
-	
-	private static IStatus checkCircularDependency(Activity act, Activity base,
-			VariabilityType type, boolean filtering) {
-		if((base instanceof Process)
-				&& (type == VariabilityType.REPLACES_LITERAL) && !(act instanceof Process)) {
-			String message = LibraryEditResources.activity_variability_error_msg3;
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		else if (isParent(base, act)) {
-			Object[] args = { act.getName() };
-			String message = NLS
-					.bind(
-							LibraryEditResources.activity_variability_error_msg1,
-							args);
-
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		} 
-		else if (newCheckAct && filtering) {
-			IFilter filter = getCircularDependencyCheckFilter(act);
-			if (! filter.accept(base)) {
-				Object[] args = { act.getName(), base.getName() };
-				String message = NLS
-						.bind(
-								LibraryEditResources.activity_variability_error_msg2,
-								args);
-
-				return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-						.getId(), 0, message, null);
-			}
-			return Status.OK_STATUS;
-		}
-		else if (isCircularDependency(act, base)) {
-			Object[] args = { act.getName(), base.getName() };
-			String message = NLS
-					.bind(
-							LibraryEditResources.activity_variability_error_msg2,
-							args);
-
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		// block for children
-		else if (ProcessUtil.hasContributorOrReplacer(base)
-				&& type == VariabilityType.EXTENDS_LITERAL) {
-			Object[] args = { act.getName(), base.getName() };
-			String message = NLS
-					.bind(
-							LibraryEditResources.activity_variability_error_msg,
-							args);
-
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		Process process = TngUtil.getOwningProcess(act);
-		if(process != null && hasCyclicDependency(base, process)) {
-			Object[] args = { act.getName(), base.getName() };
-			String message = NLS
-					.bind(
-							LibraryEditResources.activity_variability_error_msg2,
-							args);
-
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		return Status.OK_STATUS;
-	}
-	
-
-	/**
-	 * Check for circular dependency if <code>base</code> is the base element
-	 * of the given <code>element</code>.
-	 * 
-	 * @param base
-	 *            base element
-	 * @return status which indicates circular depenedency is detected or not
-	 */
-	private static boolean isCircularDependency(VariabilityElement element,
-			VariabilityElement base) {
-		// standard check
-		//
-		VariabilityType type = base.getVariabilityType();
-		while (type != VariabilityType.NA_LITERAL) {
-			VariabilityElement ve = base.getVariabilityBasedOnElement();
-			if (ve != null && ve == element)
-				return true;
-			base = ve;
-			type = ve.getVariabilityType();
-
-		}
-
-		return false;
-	}
-
-	/**
-	 * Check whether given deliverables leads to circular dependency
-	 * 
-	 * @param toBePart
-	 * @param deliverable
-	 * @return <code>false</code> to indicate whether circular dependency is
-	 *         detected, <code>true</code> if there is no circular dependency
-	 */
-	public static boolean checkCircularDeliverables(Deliverable toBePart,
-			Deliverable deliverable) {
-		if (newCheck) {
-			return ! sourceReachableByTarget(toBePart, deliverable);
-		}
-		
-		if (toBePart == deliverable) {
-			return false;
-		}
-		java.util.List deliverables = toBePart.getDeliveredWorkProducts();
-		if (deliverables != null && deliverables.size() > 0) {
-			if (deliverables.contains(deliverable))
-				return false;
-			for (Iterator iterator = deliverables.iterator(); iterator
-					.hasNext();) {
-				Object obj = iterator.next();
-				if (obj instanceof Deliverable) {
-					return checkCircularDeliverables((Deliverable) obj,
-							deliverable);
-				}
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Checks if the given CustomCategory is an ancestor of the given
-	 * DescibableElement
-	 * 
-	 * @param cc
-	 * @param e
-	 * @return
-	 */
-	public static boolean isAncessorOf(CustomCategory cc, DescribableElement e) {
-		Iterator iter = new AbstractTreeIterator(cc, false) {
-			private static final long serialVersionUID = 1L;
-
-			protected Iterator getChildren(Object object) {
-				if (object instanceof CustomCategory) {
-					return ((CustomCategory) object).getCategorizedElements()
-							.iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-
-		};
-		while (iter.hasNext()) {
-			if (iter.next() == e) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Checks circular dependency when moving a collection of artifact objects
-	 * in "sourceElements" under "destination"
-	 * 
-	 * @param destination
-	 * @param sourceElements
-	 * @return true if no circular dependency detected, otherwise false
-	 */
-	public static boolean checkCircularForArtifacts(Artifact destination,
-			Collection sourceElements) {
-		HashSet variantSet = new HashSet();
-		collectVariantSet(destination, variantSet, VariabilityType.REPLACES_LITERAL);
-		collectVariantSet(destination, variantSet, VariabilityType.EXTENDS_LITERAL);
-		if (! checkCircularForArtifacts1(destination, sourceElements, variantSet)) {
-			return false;
-		}
-		return checkCircularForArtifacts2(destination, sourceElements);
-	}
-	
-	private static boolean checkCircularForArtifacts1(Artifact destination,
-			Collection sourceElements, HashSet variantSet) {
-		if (sourceElements == null) {
-			return true;
-		}
-		for (Iterator iter = sourceElements.iterator(); iter.hasNext();) {
-			Object obj = iter.next();
-			if(obj instanceof Artifact){
-				Artifact artifact = (Artifact) obj;
-				if (variantSet.contains(artifact)) {
-					return false;
-				}
-				if (! checkCircularForArtifacts1(destination, artifact.getContainedArtifacts(), variantSet)) {
-					return false;
-				}
-			}			
-		}
-		return true;
-	}
-	
-	private static boolean checkCircularForArtifacts2(Artifact destination,
-			Collection sourceElements) {
-		for (Iterator iter = sourceElements.iterator(); iter.hasNext();) {
-			Object obj = iter.next();
-			if (obj instanceof Artifact && sourceIsOrAboveMe((Artifact) obj, destination)) {
-				return false;
-			}			
-		}
-		return true;
-	}
-	
-	private static boolean sourceIsOrAboveMe(Artifact source, Artifact me) {
-		if (source == me) {
-			return true;
-		}
-		Object obj = me.getContainerArtifact();
-		if (obj instanceof Artifact && sourceIsOrAboveMe(source, (Artifact) obj)) {
-			return true;
-		}
-		obj = me.getVariabilityBasedOnElement();
-		if (obj instanceof Artifact && sourceIsOrAboveMe(source, (Artifact) obj)) {
-			return true;
-		}	
-		return false;
-	}
-	
-	//Collect all variants of "a" and "a"s ancestror Artifact objects
-	private static void collectVariantSet(Artifact a, HashSet variantSet, VariabilityType type) {
-		while (a != null) {
-			for (Iterator iter = TngUtil.getGeneralizers(a, type); iter.hasNext();) {
-				variantSet.add(iter.next());
-			}
-			a = a.getContainerArtifact();
-		}
-	}			
-	
-	private static CircularDependencyCheck getCircularDependencyCheck(VariabilityElement ve, 
-					boolean filter, boolean move, boolean dnd) {
-		MethodLibrary lib = UmaUtil.getMethodLibrary(ve);						
-		DependencyInfoMgr depInfoMgr = new DependencyInfoMgr(lib);
-		depInfoMgr.setDndBit(dnd);
-		return new CircularDependencyCheck(depInfoMgr, ve, filter, move || dnd);
-	}
-	
-	private static boolean sourceReachableByTarget(VariabilityElement source, VariabilityElement target) {
-		return getCircularDependencyCheck(source, false, false, false).reachableBy(target);
-	}
-	
-	/**
-	 * return a circular dependency check filter
-	 */
-	public static IFilter getCircularDependencyCheckFilter(VariabilityElement ve) {
-		MethodLibrary lib = UmaUtil.getMethodLibrary(ve);						
-		DependencyInfoMgr depInfoMgr = new DependencyInfoMgr(lib);
-		return new CircularDependencyCheckFilter(depInfoMgr, ve);
-	}	
-	
-	//Return true if no circular detected
-	public static boolean checkCircularForMovingVariabilityElement(VariabilityElement destination,
-			Collection sourceElements) {
-		return checkCircularForMovingVariabilityElement(destination, sourceElements, false);
-	}
-	
-	public static boolean checkCircularForMovingVariabilityElement(VariabilityElement destination,
-			Collection sourceElements, boolean dnd) {
-		if (! DependencyInfoMgr.VeToCheck(destination)) {
-			return true;
-		}
-		
-		CircularDependencyCheck check = getCircularDependencyCheck(destination, false, true, dnd);
-		for (Iterator it = sourceElements.iterator(); it.hasNext();) {
-			if (! check.accept(it.next())) {
-				return false;
-			}
-		}
-		
-		return true;
-	}
-	
-	public static IStatus checkCircularForApplyingVariabilityElement(VariabilityElement base,
-			VariabilityElement ve, boolean dnd) {
-		boolean ok = checkCircularForMovingVariabilityElement(base, Collections.singletonList(ve), true);
-		if (!ok) {
-			Object[] args = { ve.getName(), base.getName() };
-			String message = NLS
-					.bind(
-							LibraryEditResources.variability_error_msg,
-							args);	
-			return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		return Status.OK_STATUS;
-	}
-	
-	public static IStatus checkCircularDependencyAfterFilterSelection(VariabilityElement ve, VariabilityElement base) {
-			IFilter filter = getCircularDependencyCheckFilter(ve);
-			if (! filter.accept(base)) {
-				Object[] args = { ve.getName(), base.getName() };
-				String message = NLS
-						.bind(
-								LibraryEditResources.variability_error_msg,
-								args);		//Not right message, need to add a new resouce string later!
-	
-				return new Status(IStatus.ERROR, LibraryEditPlugin.getDefault()
-						.getId(), 0, message, null);
-		}
-		return Status.OK_STATUS;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyInfoMgr.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyInfoMgr.java
deleted file mode 100644
index a4344fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyInfoMgr.java
+++ /dev/null
@@ -1,391 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.epf.common.utils.ProfilingUtil;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-
-/**
- * This class manages circular dependency info.
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class DependencyInfoMgr {
-	
-	private static boolean profiling = false;
-	private static boolean debug = false;
-	private MethodLibrary lib;
-	private Map reachableInfoMap;	//{guid, upwardReachableInfo}
-	private Map replacerMap;
-	private Map processed;
-	private MethodElement filterElement;
-	private MethodElement moveElement;
-	private List circularList;
-	private boolean dndBit = false;
-	
-	public DependencyInfoMgr(MethodLibrary lib) {
-		this.lib = lib;
-	}
-	
-	public void logCircularDependency(Stack trace) {
-		if (circularList == null) {
-			circularList = new ArrayList();
-		}
-		circularList.addAll(trace);
-	}
-	
-	private List getAndClearCircularList() {
-		List ret = circularList;
-		circularList = null;
-		return ret;
-	}
-	
-	public boolean isFilterElement(MethodElement elem) {
-		return filterElement == elem;
-	}	
-	
-	public boolean isMoveElement(MethodElement elem) {
-		return moveElement == elem;
-	}
-	
-	private void log(String msg) {
-		LibraryEditPlugin.INSTANCE.log(msg);
-	}
-	
-	public IStatus checkCircularDependnecy(VariabilityElement ve) {
-		if (debug) {
-			System.out.println("LD> ve: " + TngUtil.getLabelWithPath(ve));		//$NON-NLS-1$
-		}
-		IDependencyInfo info = registerVariabilityElement(ve, false, false, true);
-		List cirList = getAndClearCircularList();
-		boolean loop = cirList != null && !cirList.isEmpty();
-		boolean replacingAncestor = info.inheritAncestor(VariabilityType.REPLACES_LITERAL);
-		boolean actInherentingAncestor = getActInerentingAncestor(ve);
-		
-		MultiStatus multiStatus = new MultiStatus(LibraryEditPlugin.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
-		if (loop) {
-			log("Error> Circular dependency detected: ");		//$NON-NLS-1$
-			for (int i=0; i<cirList.size(); i++) {
-				IDependencyInfo loopInfo = (IDependencyInfo) cirList.get(i);
-				MethodElement elem = loopInfo.getElement();							
-				log("Error> " + i + ": " + TngUtil.getLabelWithPath(elem));//$NON-NLS-1$ //$NON-NLS-2$
-			}
-			
-			multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, genErrorMsg(cirList), ve, null));			
-		}
-		if (replacingAncestor) {
-			MethodElement elem = info.getElement();
-			log("Error> " + TngUtil.getLabelWithPath(elem) + " is replacing an ancestor.");//$NON-NLS-1$ //$NON-NLS-2$
-			
-			multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, LibraryEditResources.replacing_ancestor_error_msg, ve, null));							
-		}
-		if (actInherentingAncestor) {
-			MethodElement elem = info.getElement();
-			multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, LibraryEditResources.circular_dependency_error_msg, ve, null));							
-		}
-
-		
-		
-		return multiStatus;
-	}
-
-	private boolean getActInerentingAncestor(VariabilityElement ve) {
-		if (ve instanceof Activity) {
-			Activity base = (Activity) ve.getVariabilityBasedOnElement();
-			if (base != null) {
-				for (Activity act = ((Activity) ve).getSuperActivities(); 
-									act != null; act = act.getSuperActivities()) {
-					if (act == base) {
-						return true;	
-					}
-				}
-			}
-		}
-		return false;
-	}
-	
-	private String genErrorMsg(List cirList) {
-		String msg = LibraryEditResources.variability_element_circular_loop_error_msg;
-		for (int i=0; i<cirList.size(); i++) {
-			IDependencyInfo loopInfo = (IDependencyInfo) cirList.get(i);
-			MethodElement elem = loopInfo.getElement();	
-			if (i > 0) {
-				msg += ": "; //$NON-NLS-1$ 
-			}
-			msg += TngUtil.getLabelWithPath(elem);	
-		}
-		return msg;
-	}
-			
-	public IDependencyInfo registerVariabilityElement(VariabilityElement ve, 
-			boolean	isFilterElement, boolean isMoveElement) {
-		return registerVariabilityElement(ve, isFilterElement, isMoveElement, false);
-	}
-	
-	private IDependencyInfo registerVariabilityElement(VariabilityElement ve, 
-			boolean	isFilterElement, boolean isMoveElement, boolean checkCircular) {
-		if (isFilterElement) {
-			filterElement = ve;
-		}
-		if (isMoveElement) {
-			moveElement = ve;
-		}		
-		IDependencyInfo info =  getProcessedInfo(ve);
-		if (info == null) {		
-			info = newDependencyInfo(this, ve);
-		}
-		if (! info.isComplete()) {
-			info.build(checkCircular);
-		}
-		return info;
-	}
-	
-	protected boolean processed(MethodElement element) {
-		return processed != null && processed.containsKey(element.getGuid());
-	}
-	
-	protected IDependencyInfo getProcessedInfo(MethodElement element) {
-		return processed == null ? null : (IDependencyInfo) processed.get(element.getGuid());
-	}
-	
-	protected void addToProcessed(IDependencyInfo info) {
-		if (processed == null) {
-			processed = new HashMap();
-		}
-		processed.put(info.getElement().getGuid(), info);
-	}
-	
-	protected void addToReplacerMap(IDependencyInfo replacerInfo) {
-		if (replacerMap == null) {
-			replacerMap = new HashMap();
-		}
-		replacerMap.put(replacerInfo.getElement().getGuid(), replacerInfo);
-	}	
-		
-	private IDependencyInfo addToReachableInfoMap(MethodElement elem) {
-		if (reachableInfoMap == null) {
-			reachableInfoMap = new HashMap();
-		}
-		IDependencyInfo info = (IDependencyInfo) reachableInfoMap.get(elem.getGuid());
-		if (info == null) {		
-			info = newDependencyInfo(this, elem);
-			reachableInfoMap.put(elem.getGuid(), info);
-		}		
-		return info;
-	}
-
-	/*
-	 * Detect circular dependency for the whole library
-	 */
-	public boolean hasCircularDependency()  {
-		buildReachableInfoMap();
-		
-		boolean replacingAcestor = false;
-		if (replacerMap != null) {
-			for (Iterator it = replacerMap.values().iterator(); it.hasNext();) {
-				UpwardReachableInfo info = (UpwardReachableInfo) it.next();
-				if (info.inheritAncestor(VariabilityType.REPLACES_LITERAL)) {
-					replacingAcestor = true;
-				}
-			}
-		}
-		if (debug && circularList != null) {
-			System.out.println("LD> Circular loops detected: ");	//$NON-NLS-1$
-			for (Iterator it = circularList.iterator(); it.hasNext();) {
-				Stack stack = (Stack) it.next();
-				for (int i=0; i<stack.size(); i++) {
-					System.out.println("LD> " + (i) + ": " + stack.get(i));	//$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-		
-		return replacingAcestor || numCircularDependency() > 0;
-	}
-	
-	private int numCircularDependency() {
-		return circularList == null ? 0 : circularList.size();
-	}
-	
-	//to be specialized by sub classes
-	protected IDependencyInfo newDependencyInfo(DependencyInfoMgr mgr, MethodElement elem) {
-		return  new UpwardReachableInfo(this, elem);
-	}
-	
-	private void buildReachableInfoMap() {
-		long usedMem0 = 0;
-		Runtime rt = Runtime.getRuntime(); 
-		if (profiling) {
-			for (Iterator it = lib.eAllContents(); it.hasNext();) {
-				it.next();
-			}
-			ProfilingUtil.fullGC();
-			usedMem0 = rt.totalMemory() - rt.freeMemory();
-		}
-		
-		buildReachableInfoMap_();
-		if (profiling) {
-			ProfilingUtil.fullGC();
-			System.out.println("LD> usedMem0: " + usedMem0/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-			long usedMem1 = rt.totalMemory() - rt.freeMemory();
-			System.out.println("LD> usedMem1: " + usedMem1/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-			System.out.println("LD> diffMem: " + (usedMem1 - usedMem0)/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	private void buildReachableInfoMap_() {
-		reachableInfoMap = new HashMap();
-		List plugins = lib.getMethodPlugins();
-		for (int i = 0; i < plugins.size(); i++) {
-			MethodPlugin plugin = (MethodPlugin) plugins.get(i);
-			for (Iterator it = plugin.eAllContents(); it.hasNext();) {
-				Object obj = it.next();
-				if (VeToCheck(obj)) {
-					addToReachableInfoMap((MethodElement) obj);
-				}
-			}
-		}
-		
-		for (Iterator it = reachableInfoMap.values().iterator(); it.hasNext();) {
-			IDependencyInfo info = (IDependencyInfo) it.next();
-			if (! processed(info.getElement())) {
-				info.build(true);
-			}
-		}	
-
-	}	
-
-	public static boolean VeToCheck(Object obj) {
-		return 	obj instanceof Domain || 
-				obj instanceof CustomCategory || 
-				obj instanceof Artifact || 
-				obj instanceof Practice || 
-				obj instanceof Deliverable ||
-				obj instanceof Activity;
-	}
-	
-	/*
-	 * Check circular dependency for the library.
-	 */
-	public CheckResult checkCircularDependnecy(Tracer tracer) {
-		long usedMem0 = 0;
-		Runtime rt = Runtime.getRuntime(); 
-		if (profiling) {
-			for (Iterator it = lib.eAllContents(); it.hasNext();) {
-				it.next();
-			}
-			ProfilingUtil.fullGC();
-			usedMem0 = rt.totalMemory() - rt.freeMemory();
-		}
-
-		CheckResult result = checkCircularDependnecy_(tracer);
-		
-		if (profiling) {
-			ProfilingUtil.fullGC();
-			System.out.println("LD> usedMem0: " + usedMem0/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-			long usedMem1 = rt.totalMemory() - rt.freeMemory();
-			System.out.println("LD> usedMem1: " + usedMem1/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-			System.out.println("LD> diffMem: " + (usedMem1 - usedMem0)/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return result;
-	}
-	
-	private CheckResult checkCircularDependnecy_(Tracer tracer) {
-		CheckResult result = new CheckResult();
-		
-		HashSet seen = new HashSet();
-		List plugins = lib.getMethodPlugins();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			for (Iterator iit = plugin.eAllContents(); iit.hasNext();) {
-				Object obj = iit.next();
-				if (seen.contains(obj)) {
-					continue;
-				}
-				seen.add(obj);				
-				if (VeToCheck(obj)) {
-					IDependencyInfo info = registerVariabilityElement((VariabilityElement) obj, false, false, true);
-					List cirList = getAndClearCircularList();
-					
-					boolean loop = cirList != null && !cirList.isEmpty();
-					boolean replacingAncestor = info.inheritAncestor(VariabilityType.REPLACES_LITERAL);
-					
-					if (loop) {
-						tracer.trace("Error> Circular dependency detected: ");		//$NON-NLS-1$
-						for (int i=0; i<cirList.size(); i++) {
-							IDependencyInfo loopInfo = (IDependencyInfo) cirList.get(i);
-							MethodElement elem = loopInfo.getElement();							
-							tracer.trace("Error> " + i + ": " + TngUtil.getLabelWithPath(elem));//$NON-NLS-1$ //$NON-NLS-2$
-						}
-						result.circularList.add(cirList);
-					}
-					if (replacingAncestor) {
-						MethodElement elem = info.getElement();
-						tracer.trace("Error> " + TngUtil.getLabelWithPath(elem) + " is replacing an ancestor.");//$NON-NLS-1$ //$NON-NLS-2$
-						result.replacingAncestorList.add(info);
-					}
-				}
-			}
-		}				
-		return result;
-	}
-	
-	public static class CheckResult {
-		public List circularList = new ArrayList();
-		public List replacingAncestorList = new ArrayList();
-		
-		public int getErrorCount() {
-			return circularList.size() + replacingAncestorList.size();
-		}
-		
-		public int getCircularElementCount() {
-			int count = replacingAncestorList.size();
-			for (int i=0; i<circularList.size(); i++) {
-				List list = (List) circularList.get(i);
-				int sz = list == null ? 0 : list.size();
-				count += sz;
-			}
-			return count;
-		}
-	}
-	
-	protected boolean isDndElement(MethodElement elem) {
-		return dndBit && moveElement == elem;
-	}
-	
-	protected void setDndBit(boolean b) {
-		dndBit = b;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyValidationMgr.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyValidationMgr.java
deleted file mode 100644
index 0642cb9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/DependencyValidationMgr.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * This class manages all dependency checks for validation
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class DependencyValidationMgr {
-	
-	private DependencyInfoMgr veDepInfoMgr;
-	private PluginDependencyInfoMgr pluginDepInfoMgr;
-	
-	public DependencyValidationMgr(MethodLibrary lib) {
-		veDepInfoMgr = new DependencyInfoMgr(lib);
-		pluginDepInfoMgr = new PluginDependencyInfoMgr(lib);
-	}
-	
-	public IStatus checkCircularDependnecy(MethodElement element) {
-		IStatus status = Status.OK_STATUS;
-		if (element instanceof VariabilityElement) {
-			return veDepInfoMgr.checkCircularDependnecy((VariabilityElement) element);
-		}
-		
-		if (element instanceof MethodPlugin) {
-			return pluginDepInfoMgr.checkCircularDependnecy((MethodPlugin) element);
-		}		
-		
-		return status;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IDependencyInfo.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IDependencyInfo.java
deleted file mode 100644
index b9092fb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IDependencyInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.library.edit.validation;
-
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityType;
-
-/**
- * Interface for dependency info used in circular dependency checking
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public interface IDependencyInfo {
-	
-	void build(boolean checkCircular);
-	
-	boolean isComplete();
-	
-	boolean reachableBy(IDependencyInfo info);
-	
-	boolean inheritAncestor(VariabilityType type);
-	
-	MethodElement getElement();
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/INameProvider.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/INameProvider.java
deleted file mode 100644
index f046288..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/INameProvider.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-/**
- * Interface to provide name for a specified object
- * 
- * @author Phong Nguyen Le - Jan 31, 2006
- * @since  1.0
- */
-public interface INameProvider {
-	String getName(Object object);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IValidator.java
deleted file mode 100644
index 3c25390..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IValidator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Interface for validator.
- * 
- * @author Phong Nguyen Le - Aug 1, 2005
- * @since 1.0
- */
-public interface IValidator {
-	/**
-	 * Validates the given string. Returns an error message to display if the
-	 * new text is invalid. Returns <code>null</code> if there is no error.
-	 * Note that the empty string is not treated the same as <code>null</code>;
-	 * it indicates an error state but with no message to display.
-	 * 
-	 * @param newText
-	 *            the text to check for validity
-	 * 
-	 * @return an error message or <code>null</code> if no error
-	 */
-	public String isValid(String newText);
-	
-	/**
-	 * Validates the given object value.
-	 * 
-	 * @param value the value to validate
-	 * @return a status
-	 */
-	public IStatus isValid(Object value);
-	
-	public int MaxFilePathNameLength = 255;
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IValidatorFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IValidatorFactory.java
deleted file mode 100644
index 7faf0ba..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/IValidatorFactory.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.NamedElement;
-
-/**
- * Factory interface to create various validators to validate string value of
- * specified object feature.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IValidatorFactory {
-	public static final IValidatorFactory INSTANCE = ValidatorFactory
-			.createValidatorFactory();
-
-	IValidator createNameValidator(NamedElement e, AdapterFactory adapterFactory);
-
-	/**
-	 * Creates name validator for a content element
-	 * 
-	 * @param e
-	 * @return
-	 */
-	IValidator createNameValidator(Object parent, ContentElement e);
-
-	/**
-	 * Creates name validator for a element
-	 * 
-	 * @param e
-	 * @return
-	 */
-	IValidator createNameValidator(Object parent, NamedElement e);
-
-	/**
-	 * Creates name validator for an element of newType with name of e.getName()
-	 * 
-	 * @param e
-	 * @return
-	 */
-	IValidator createNameValidator(Object parent, NamedElement e, EClass newType);
-
-	IValidator createPresentationNameValidator(Object parent,
-			DescribableElement e);
-
-	/**
-	 * Creates a validator for the given feature of the given object. The object
-	 * is referenced by the given parent via the specified reference.
-	 * 
-	 * @param parent
-	 * @param reference 
-	 * @param object
-	 * @param feature
-	 *            the feature to validate its value
-	 * @param eClass
-	 *            the EClass of the object to validate or <code>null</code> if
-	 *            not applicable
-	 * @return
-	 */
-	IValidator createValidator(EObject parent, EReference reference,
-			EClass eClass, EObject object, EStructuralFeature feature);
-	
-	IValidator createValidator(EObject parent, EReference reference,
-			IFilter childFilter, EObject object, EStructuralFeature feature);	
-	
-	IValidator createValidator(Object parent, EClass eClass, EObject object,
-			EStructuralFeature feature, AdapterFactory adapterFactory);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/NameChecker.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/NameChecker.java
deleted file mode 100644
index 597c0d0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/NameChecker.java
+++ /dev/null
@@ -1,394 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This class defines various static methods to validate name of specified
- * object
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class NameChecker {
-
-	private static final String ELEMENT_TEXT = LibraryEditResources.element_text; 
-	
-	private static final INameProvider presentationNameProvider = new INameProvider() {
-
-		public String getName(Object object) {
-			if(object instanceof BreakdownElement) {
-				return ProcessUtil.getPresentationName((BreakdownElement) object);
-			}
-			else if(object instanceof DescribableElement) {
-				return ((DescribableElement)object).getPresentationName();
-			}
-			return null;
-		}
-		
-	};
-	
-	private static String checkName(AdapterFactory adapterFactory,
-			Object parent, Object e, final Class type,
-			INameProvider nameProvider, String newName, Suppression suppresion,
-			boolean ignoreSuppressed) {
-		IFilter childFilter = new IFilter() {
-
-			public boolean accept(Object obj) {
-				return type.isInstance(obj);
-			}
-
-		};
-
-		return checkName(adapterFactory, parent, e, childFilter, nameProvider,
-				newName, suppresion, ignoreSuppressed);
-	}
-
-	private static String checkName(AdapterFactory adapterFactory,
-			Object parent, Object e, IFilter childFilter,
-			EStructuralFeature nameFeature, String newName,
-			Suppression suppression, boolean ignoreSuppressed) {
-		return checkName(adapterFactory, parent, e, childFilter,
-				createNameProvider(nameFeature), newName, suppression,
-				ignoreSuppressed);
-	}
-
-	private static String checkName(AdapterFactory adapterFactory,
-			Object parent, Object e, IFilter childFilter,
-			INameProvider nameProvider, String newName,
-			Suppression suppression, boolean ignoreSuppressed) 
-	{
-		if (ignoreSuppressed)
-			if (suppression != null && suppression.isSuppressed(e)) {
-				return null;
-			}
-
-		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
-				.adapt(parent, ITreeItemContentProvider.class);
-		Collection children;
-
-		// get children of the rolled-down dapter
-		//
-		boolean wasRolledUp = false;
-		BSActivityItemProvider bsItemProvider = null;
-		if (adapter instanceof BSActivityItemProvider) {
-			bsItemProvider = ((BSActivityItemProvider) adapter);
-			wasRolledUp = bsItemProvider.isRolledUp();
-		}
-		try {
-			if (wasRolledUp) {
-				bsItemProvider.setRolledUp(false);
-			}
-			children = adapter.getChildren(parent);
-		} catch (NullPointerException ex) {
-			throw ex;
-		} finally {
-			if (wasRolledUp) {
-				bsItemProvider.basicSetRolledUp(wasRolledUp);
-			}
-		}
-		
-		if (e instanceof BreakdownElement) {
-			return null;
-		}
-
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object item = iter.next();
-
-			// skip checking on suppressed element
-			//
-/*170058	if (suppression != null && suppression.isSuppressed(item)) {
-				continue;
-			}*/
-
-			Object child = TngUtil.unwrap(item);
-			if (child != e && childFilter.accept(child)) {
-				String name = nameProvider.getName(child);
-				if (name.equalsIgnoreCase(newName)) {
-					// return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-					return NLS.bind(
-							LibraryEditResources.duplicateElementNameError_msg,
-							name);
-				}
-			}
-		}
-		return null;
-	}
-
-	private static INameProvider createNameProvider(
-			final EStructuralFeature nameFeature) {
-		if(nameFeature == UmaPackage.eINSTANCE
-								.getDescribableElement_PresentationName()) {
-			return presentationNameProvider; 
-		}
-		
-		return new INameProvider() {
-
-			public String getName(Object object) {
-				if (object instanceof EObject) {
-					return (String) ((EObject) object).eGet(nameFeature);
-				} else {
-					return null;
-				}
-			}
-
-		};
-	}
-
-	public static String checkName(AdapterFactory adapterFactory,
-			final BreakdownElement e, Class type, EStructuralFeature nameFeature,
-			String newName, Suppression suppression) 
-	{
-		return checkName(adapterFactory, null, e, type, nameFeature, newName,
-				suppression, false);
-	}
-	
-	public static String checkName(AdapterFactory adapterFactory, Object parent,
-			final BreakdownElement e, Class type, final EStructuralFeature nameFeature,
-			String newName, Suppression suppression, boolean ignoreSuppressed) 
-	{
-		String msg = checkEmpty(e, newName);
-		if(msg != null) {
-			return msg;
-		}
-
-		if(type == null) {
-			type = chooseType(e);
-		}
-		
-		if(parent == null) {
-			ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-					.adapt(e, ITreeItemContentProvider.class);
-			parent = itemProvider.getParent(e);
-			if(parent == null) {
-				return null;
-			}
-		}
-
-		// basic check
-		//
-		msg = checkName(adapterFactory, parent, e, type,
-				createNameProvider(nameFeature), newName, suppression,
-				ignoreSuppressed);
-
-		if (msg != null)
-			return msg;
-		IFilter childFilter = null;
-		if (e instanceof TeamProfile) {
-			// don't allow team with the same name within the same scope
-			//
-			childFilter = new IFilter() {
-				public boolean accept(Object obj) {
-					return e instanceof TeamProfile;
-				}
-			};
-		}
-
-		// PLEASE DON'T CLEAN UP.
-		// Commented out for now, since we change scope of Deliverable.
-		// else if (e instanceof WorkProductDescriptor
-		// && ((WorkProductDescriptor) e).getWorkProduct() instanceof
-		// Deliverable) {
-		// childFilter = new IFilter() {
-		//	
-		// public boolean accept(Object obj) {
-		// return e instanceof WorkProductDescriptor
-		// && ((WorkProductDescriptor) e).getWorkProduct() instanceof
-		// Deliverable;
-		// }
-		// };
-		// }
-
-		if (childFilter != null) {
-			return checkNameInScope(adapterFactory, parent, e, nameFeature, newName,
-					childFilter, suppression, ignoreSuppressed);
-		}
-
-		return null;
-	}
-	
-	private static String checkEmpty(Object e, String newName) {
-		// skip checking on activity that is a extender or local contributor
-		//
-		if(e instanceof Activity && ProcessUtil.isExtendingOrLocallyContributing((BreakdownElement) e)) {
-			return null;
-		}
-		
-		String elementType;
-		if (e instanceof NamedElement) {
-			elementType = TngUtil.getTypeText((NamedElement) e);
-		} else {
-			elementType = ELEMENT_TEXT;
-		}
-		if (newName == null || newName.trim().length() == 0) {			
-			return NLS.bind(LibraryEditResources.emptyElementNameError_msg,
-					StrUtil.toLower(elementType));
-		}
-		return null;
-	}
-
-	/**
-	 * Used by
-	 * {@link #checkName(AdapterFactory, BreakdownElement, EStructuralFeature, String, Suppression, boolean) checkName()}
-	 * 
-	 * @param e
-	 * @return
-	 */
-	private static Class chooseType(BreakdownElement e) {
-		if (e instanceof Activity) {
-			return Activity.class;
-		} else if (e instanceof TaskDescriptor) {
-			return TaskDescriptor.class;
-		} else if (e instanceof RoleDescriptor) {
-			return RoleDescriptor.class;
-		} else if (e instanceof WorkProductDescriptor) {
-			return WorkProductDescriptor.class;
-		} else {
-			return e.getClass();
-		}
-		// return BreakdownElement.class;
-	}
-
-	private static String checkNameInScope(AdapterFactory adapterFactory,
-			Object currentParent, BreakdownElement e,
-			EStructuralFeature feature, String name, IFilter childFilter,
-			Suppression suppression, boolean ignoreSuppressed) {
-		// check up
-		for (Object parent = currentParent; parent != null;) {
-			String msg = checkName(adapterFactory, parent, e, childFilter,
-					feature, name, suppression, ignoreSuppressed);
-			if (msg != null)
-				return msg;
-			ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
-					.adapt(parent, ITreeItemContentProvider.class);
-			parent = itemProvider.getParent(parent);
-		}
-
-		// check down
-		if (currentParent != null) {
-			Iterator iter = new AdapterFactoryTreeIterator(adapterFactory,
-					currentParent, false);
-			while (iter.hasNext()) {
-				Object child = TngUtil.unwrap(iter.next());
-				if (child != e && childFilter.accept(child)) {
-					String childName = (String) ((EObject) child).eGet(feature);
-					if (name.equalsIgnoreCase(childName)) {
-						// return I18nUtil.formatString(RESOURCE_BUNDLE, key,
-						// data);
-						return NLS
-								.bind(
-										LibraryEditResources.duplicateElementNameError_msg,
-										name);
-					}
-
-				}
-			}
-		}
-
-		return null;
-	}
-
-	public static String checkName(AdapterFactory adapterFactory,
-			final BreakdownElement e, EStructuralFeature feature, String name,
-			Suppression suppression) {
-		return checkName(adapterFactory, e, feature, name, suppression, false);
-	}
-
-	/**
-	 * Checks the name or presentation name of a breakdown element that is
-	 * already part of a process.
-	 * 
-	 * @param adapterFactory
-	 * @param e
-	 * @param feature
-	 * @param name
-	 * @param suppression
-	 * @param ignoreSuppressed
-	 * @return
-	 */
-	public static String checkName(AdapterFactory adapterFactory,
-			final BreakdownElement e, EStructuralFeature feature, String name,
-			Suppression suppression, boolean ignoreSuppressed) 
-	{
-		return checkName(adapterFactory, (Object)null, e, (Class)null, feature, name, suppression, ignoreSuppressed);
-	}
-	
-	public static boolean canHaveEmptyPresentationName(DescribableElement e) {
-		if(e instanceof VariabilityElement) {
-			VariabilityType vType = ((VariabilityElement)e).getVariabilityType();
-			return vType == VariabilityType.EXTENDS_LITERAL
-				|| vType == VariabilityType.CONTRIBUTES_LITERAL
-				|| vType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL;			
-		}
-		return false;	
-	}
-	
-	public static boolean checkFilePathLength(
-			MethodElement parentElementWithResource,
-			MethodElement element,
-			String name,
-			int maxLength,
-			String[] filePathName) {
-		Resource res = parentElementWithResource.eResource();
-		URI uri = res.getURI();
-		if (filePathName != null && filePathName.length >= 1) {
-			//To do: calculate path
-			//filePathName[0] = ??
-		}		
-		
-		int parentResLen = uri.toFileString().length();		
-		int localGroupLen = 20;
-		if (parentElementWithResource instanceof MethodLibrary) {
-			localGroupLen = 0;
-		} else if (element instanceof Role) {
-			localGroupLen = 5;		//"roles"
-		} else if (element instanceof CapabilityPattern) {
-			localGroupLen = 18;		//"capabilitypatterns"
-		}
-		//More else if here
-		
-		int totalLen = parentResLen + localGroupLen + name.length();		
-		return totalLen <= maxLength;	
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/PluginDepInfo.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/PluginDepInfo.java
deleted file mode 100644
index bfab5db..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/PluginDepInfo.java
+++ /dev/null
@@ -1,205 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * This class handles plugin dependency info for circular dependency check
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class PluginDepInfo {
-
-	private PluginDependencyInfoMgr mgr;
-	private MethodPlugin plugin;
-	private HashMap parentMap;
-	private boolean complete = false;
-	private boolean debug = false;
-	
-	protected PluginDepInfo(PluginDependencyInfoMgr mgr, MethodPlugin plugin) {
-		this.mgr = mgr;
-		this.plugin = plugin;
-	}
-	
-	public boolean isComplete() {
-		return complete;
-	}
-	
-	public void build(boolean checkCircular) {
-		if (debug) {
-			System.out.println("LD> build: " + this);	//$NON-NLS-1$
-		}
-		buildInner(checkCircular);
-	}
-	
-	private void buildInner(boolean checkCircular) {
-		Object info = mgr.getProcessedInfo(getPlugin());
-		if (info != null) {
-			if (info == this && complete) {
-				return;
-			}
-			throw new RuntimeException("Internal error in buildInner: " + info);		//$NON-NLS-1$
-		}
-		mgr.addToProcessed(this);
-		if (debug) {
-			System.out.println("LD> buildInner: " + this);	//$NON-NLS-1$
-			System.out.println("");							//$NON-NLS-1$
-		}
-		buildInner_(checkCircular);
-	}
-	
-	private void buildInner_(boolean checkCircular) {
-		List parents = getPlugin().getBases();
-		int sz = parents == null ? 0 : parents.size();
-		if (sz == 0) {
-			complete = true;
-			return;
-		}
-		
-		parentMap = new HashMap();
-		List processedParents = null;
-		for (int i = 0; i< sz; i++) {
-			MethodPlugin parentElem = (MethodPlugin) parents.get(i);
-			PluginDepInfo pinfo = (PluginDepInfo) mgr.getProcessedInfo(parentElem);
-			if (pinfo == null){
-				pinfo = new PluginDepInfo(mgr, parentElem);
-				parentMap.put(parentElem.getGuid(), pinfo);
-				pinfo.buildInner(checkCircular);
-			} else {
-				parentMap.put(parentElem.getGuid(), pinfo);
-				if (checkCircular) {
-					if (processedParents == null) {
-						processedParents = new ArrayList();
-					}
-					processedParents.add(pinfo);
-				}
-			}
-		}
-		complete = true;
-			
-		if (checkCircular && processedParents != null) {
-			for (int i=0; i<processedParents.size(); i++) {
-				reachableBy((PluginDepInfo) processedParents.get(i));
-			}
-		}
-	}
-	
-	public boolean reachableBy(PluginDepInfo info)  {
-		if (! (info instanceof PluginDepInfo)) {
-			throw new UnsupportedOperationException();
-		}
-		if (debug) {
-			System.out.println("LD> Entry reachableBy: this -> " + this);	//$NON-NLS-1$
-			System.out.println("LD> Entry reachableBy: info -> " + info);	//$NON-NLS-1$
-			System.out.println("");											//$NON-NLS-1$
-		}
-		return reachableBy((PluginDepInfo) info, new Stack(), new HashMap());
-	}
-	
-	private boolean reachableBy(PluginDepInfo info, Stack stack, Map seen)  {
-		stack.push(info);
-		if (debug) {
-			System.out.println("LD> reachableBy: this -> " + this);		//$NON-NLS-1$
-			System.out.println("LD> reachableBy: info -> " + info);		//$NON-NLS-1$
-			System.out.println("");										//$NON-NLS-1$
-		}
-		boolean ret =  reachableBy_(info, stack, seen);
-		stack.pop();
-		return ret;
-	}
-	
-	private boolean reachableBy_(PluginDepInfo info, Stack stack, Map seen)  {
-		Map testMap = info.parentMap;		
-		if (testMap == null || testMap.isEmpty()) {
-			return false;
-		}
-		
-		if (testMap.containsKey(getPlugin().getGuid())) {
-			if (debug) {
-				System.out.println("LD> Contained in parentMap of: " + info);		//$NON-NLS-1$									
-			}
-			stack.push(this);
-			mgr.logCircularDependency((Stack) stack.clone());
-			stack.pop();
-			return true;
-		}
-		
-		if (seen.containsKey(info.getPlugin().getGuid())) {
-			return false;
-		}
-		
-		
-		seen.put(info.getPlugin().getGuid(), info);
-		
-		for (Iterator it = testMap.values().iterator(); it.hasNext();) {
-			PluginDepInfo parentInfo = (PluginDepInfo) it.next();
-			if (parentInfo.containedIn(stack)) {
-				if (debug) {
-					System.out.println("LD> containedIn stack: " + info);		//$NON-NLS-1$									
-				}
-				stack.push(parentInfo);
-				mgr.logCircularDependency((Stack) stack.clone());
-				stack.pop();
-				return true;
-			}
-			if  (reachableBy(parentInfo, stack, seen)) {
-				return true;
-			}
-		}	
-		
-		return false;
-	}
-	
-	public MethodPlugin getPlugin() {
-		return plugin;
-	}
-				
-	public String toString() {
-		return TngUtil.getLabelWithPath(plugin);
-	}
-	
-	//This would scale up for performance when infoList gets large
-	private boolean containedIn(List infoList) {
-		int sz = infoList == null ? 0 : infoList.size();
-		if (sz == 0) {
-			return false;
-		}
-		String guid = getPlugin().getGuid();
-		if (sz == 1) {
-			return guid.equals(((PluginDepInfo) infoList.get(0)).getPlugin().getGuid());
-		}
-		Map listMap = new HashMap();
-		for (int i=0; i<sz; i++) {
-			PluginDepInfo info = (PluginDepInfo) infoList.get(i);
-			listMap.put(info.getPlugin().getGuid(), info);
-		}
-		
-		return listMap.containsKey(guid);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/PluginDependencyInfoMgr.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/PluginDependencyInfoMgr.java
deleted file mode 100644
index f0eba86..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/PluginDependencyInfoMgr.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.common.utils.ProfilingUtil;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-
-/**
- * This class manages circular dependency info for plugins.
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class PluginDependencyInfoMgr {
-	
-	private static boolean profiling = false;
-	private static boolean debug = false;
-	private MethodLibrary lib;
-	private Map processed;
-	private List circularList;
-	
-	public PluginDependencyInfoMgr(MethodLibrary lib) {
-		this.lib = lib;
-	}
-	
-	public void logCircularDependency(Stack trace) {
-		if (circularList == null) {
-			circularList = new ArrayList();
-		}
-		circularList.addAll(trace);
-	}
-	
-	private List getAndClearCircularList() {
-		List ret = circularList;
-		circularList = null;
-		return ret;
-	}
-	
-	private void log(String msg) {
-		LibraryEditPlugin.INSTANCE.log(msg);
-	}
-	
-	private PluginDepInfo registerPlugin(MethodPlugin plugin, boolean checkCircular) {		
-		PluginDepInfo info =  getProcessedInfo(plugin);
-		if (info == null) {		
-			info = new PluginDepInfo(this, plugin);
-		}
-		if (! info.isComplete()) {
-			info.build(checkCircular);
-		}
-		return info;
-	}
-	
-	public IStatus checkCircularDependnecy(MethodPlugin plugin) {
-		if (debug) {
-			System.out.println("LD> plugin: " + TngUtil.getLabelWithPath(plugin));		//$NON-NLS-1$
-		}
-		PluginDepInfo info = registerPlugin(plugin, true);
-		List cirList = getAndClearCircularList();
-		boolean loop = cirList != null && !cirList.isEmpty();
-		if (loop) {
-			log("Error> Circular dependency detected: ");		//$NON-NLS-1$
-			for (int i=0; i<cirList.size(); i++) {
-				PluginDepInfo loopInfo = (PluginDepInfo) cirList.get(i);
-				MethodElement elem = loopInfo.getPlugin();							
-				log("Error> " + i + ": " + TngUtil.getLabelWithPath(elem));//$NON-NLS-1$ //$NON-NLS-2$
-			}
-				log("");								//$NON-NLS-1$
-			return new ValidationStatus(IStatus.ERROR, 0, genErrorMsg(cirList), plugin, null);
-		}
-		return Status.OK_STATUS;
-	}
-	
-	private String genErrorMsg(List cirList) {
-		String msg = LibraryEditResources.variability_element_circular_loop_error_msg;
-		for (int i=0; i<cirList.size(); i++) {
-			PluginDepInfo loopInfo = (PluginDepInfo) cirList.get(i);
-			MethodElement elem = loopInfo.getPlugin();	
-			if (i > 0) {
-				msg += ": "; //$NON-NLS-1$ 
-			}
-			msg += TngUtil.getLabelWithPath(elem);	
-		}
-		return msg;
-	}
-			
-	protected boolean processed(MethodPlugin plugin) {
-		return processed != null && processed.containsKey(plugin.getGuid());
-	}
-	
-	protected PluginDepInfo getProcessedInfo(MethodPlugin plugin) {
-		return processed == null ? null : (PluginDepInfo) processed.get(plugin.getGuid());
-	}
-	
-	protected void addToProcessed(PluginDepInfo info) {
-		if (processed == null) {
-			processed = new HashMap();
-		}
-		processed.put(info.getPlugin().getGuid(), info);
-	}
-	
-	/*
-	 * Check circular dependency among the plugins of the library.
-	 */
-	public CheckResult checkCircularDependnecy(Tracer tracer, boolean accumErrors) {
-		if (tracer == null) {
-			tracer = new Tracer() {
-				public void trace(String line) {}
-			};
-		}
-		long usedMem0 = 0;
-		Runtime rt = Runtime.getRuntime(); 
-		if (profiling) {
-			for (Iterator it = lib.eAllContents(); it.hasNext();) {
-				it.next();
-			}
-			ProfilingUtil.fullGC();
-			usedMem0 = rt.totalMemory() - rt.freeMemory();
-		}
-
-		CheckResult result = checkCircularDependnecy_(tracer, accumErrors);
-		
-		if (profiling) {
-			ProfilingUtil.fullGC();
-			System.out.println("LD> usedMem0: " + usedMem0/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-			long usedMem1 = rt.totalMemory() - rt.freeMemory();
-			System.out.println("LD> usedMem1: " + usedMem1/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-			System.out.println("LD> diffMem: " + (usedMem1 - usedMem0)/1000 + " k bytes"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return result;
-	}
-	
-	private CheckResult checkCircularDependnecy_(Tracer tracer, boolean accumErrors) {
-		CheckResult result = new CheckResult();
-		
-		List plugins = lib.getMethodPlugins();
-		for (Iterator it = plugins.iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			
-			PluginDepInfo info = registerPlugin(plugin, true);
-			List cirList = getAndClearCircularList();			
-			boolean loop = cirList != null && !cirList.isEmpty();
-			if (loop) {
-				tracer.trace("Error> Circular dependency detected: ");		//$NON-NLS-1$
-				for (int i=0; i<cirList.size(); i++) {
-					PluginDepInfo loopInfo = (PluginDepInfo) cirList.get(i);
-					MethodElement elem = loopInfo.getPlugin();							
-					tracer.trace("Error> " + i + ": " + TngUtil.getLabelWithPath(elem));//$NON-NLS-1$ //$NON-NLS-2$
-				}
-				result.circularList.add(cirList);
-				if (! accumErrors) {
-					return result;
-				}
-			}
-		}				
-		return result;
-	}
-	
-	public static class CheckResult {
-		public List circularList = new ArrayList();
-		
-		public int getErrorCount() {
-			return circularList.size();
-		}		
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/Tracer.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/Tracer.java
deleted file mode 100644
index 18a413c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/Tracer.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.eclipse.epf.library.edit.validation;
-
-public interface Tracer {
-	void trace(String line);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UniqueNameHandler.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UniqueNameHandler.java
deleted file mode 100644
index 1638f00..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UniqueNameHandler.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * This class is a helper class for method element unique name handling
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class UniqueNameHandler {
-	private Set<String> names = new HashSet<String>();
-	
-	/**
-	 * Empty constructor
-	 */
-	public UniqueNameHandler() {
-	}
-	
-	/**
-	 * @param elements
-	 */
-	public void registerNames(Collection<MethodElement> elements) {
-		if (elements == null) {
-			return;
-		}
-		for (Iterator<MethodElement> it = elements.iterator(); it.hasNext();) {
-			MethodElement element = it.next();
-			register(element.getName());
-		}
-	}
-	
-	/**
-	 * @param elements
-	 */
-	public void registerPresentationNames(Collection<DescribableElement> elements) {
-		if (elements == null) {
-			return;
-		}
-		for (Iterator<DescribableElement> it = elements.iterator(); it.hasNext();) {
-			DescribableElement element = it.next();
-			register(element.getPresentationName());
-		}
-	}
-	
-	/**
-	 * @param element
-	 */
-	public void register(String name) {
-		names.add(name.toUpperCase());		
-	}
-	
-	/**
-	 * @param element
-	 */
-	public String getUniqueName(String oldName) {		
-		String name = oldName;
-		int i = 0;
-		while(names.contains(name.toUpperCase())) {
-			i++;
-			name = oldName + "_" + i;		//$NON-NLS-1$ 
-		}			
-		return name;
-	}
-	
-	
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UniqueNamePNameHandler.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UniqueNamePNameHandler.java
deleted file mode 100644
index cb425d4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UniqueNamePNameHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.Collection;
-
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * This class is a helper class for unique name and presentation name handling
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class UniqueNamePNameHandler {
-	private UniqueNameHandler nameHandler = new UniqueNameHandler();
-	private UniqueNameHandler pnameHandler = new UniqueNameHandler();
-	
-	/**
-	 * Empty constructor
-	 */
-	public UniqueNamePNameHandler(Collection<MethodElement> nameElements, Collection<DescribableElement> pnameElements) {
-		nameHandler.registerNames(nameElements);
-		pnameHandler.registerPresentationNames(pnameElements);		
-	}
-	
-	/**
-	 * @param element
-	 */
-	public void ensureUnique(DescribableElement element) {
-		String name = nameHandler.getUniqueName(element.getName());
-		if (! name.equals(element.getName())) {
-			element.setName(name);		
-		}
-		nameHandler.register(name);
-		
-		String pname = pnameHandler.getUniqueName(element.getPresentationName());
-		if (! pname.equals(element.getPresentationName())) {
-			element.setPresentationName(pname);		
-		}
-		pnameHandler.register(pname);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UpwardReachableInfo.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UpwardReachableInfo.java
deleted file mode 100644
index 663b784..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/UpwardReachableInfo.java
+++ /dev/null
@@ -1,305 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * This class handles upward reachable info for circular dependency checking
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class UpwardReachableInfo implements IDependencyInfo {
-
-	private DependencyInfoMgr mgr;
-	private MethodElement element;
-	private HashMap parentMap;
-	private boolean complete = false;
-	private boolean debug = false;
-	
-	protected UpwardReachableInfo(DependencyInfoMgr mgr, MethodElement element) {
-		this.mgr = mgr;
-		this.element = element;
-	}
-	
-	public boolean isComplete() {
-		return complete;
-	}
-	
-	public void build(boolean checkCircular) {
-		if (debug) {
-			System.out.println("LD> build: " + this);	//$NON-NLS-1$
-		}
-		buildInner(checkCircular);
-	}
-	
-	private void buildInner(boolean checkCircular) {
-		Object info = mgr.getProcessedInfo(element);
-		if (info != null) {
-			if (info == this && complete) {
-				return;
-			}
-			throw new RuntimeException("Internal error in buildInner: " + info);		//$NON-NLS-1$
-		}
-		mgr.addToProcessed(this);
-		if (debug) {
-			System.out.println("LD> buildInner: " + this);	//$NON-NLS-1$
-			System.out.println("");							//$NON-NLS-1$
-		}
-		buildInner_(checkCircular);
-	}
-	
-	private void buildInner_(boolean checkCircular) {
-		List parents = getMixedParentList();
-		int sz = parents == null ? 0 : parents.size();
-		if (sz == 0) {
-			complete = true;
-			return;
-		}
-		
-		parentMap = new HashMap();
-		List processedParents = null;
-		for (int i = 0; i< sz; i++) {
-			MethodElement parentElem = (MethodElement) parents.get(i);
-			UpwardReachableInfo pinfo = (UpwardReachableInfo) mgr.getProcessedInfo(parentElem);
-			if (pinfo == null){
-				pinfo = new UpwardReachableInfo(mgr, parentElem);
-				parentMap.put(parentElem.getGuid(), pinfo);
-				pinfo.buildInner(checkCircular);
-			} else {
-				parentMap.put(parentElem.getGuid(), pinfo);
-				if (checkCircular) {
-					if (processedParents == null) {
-						processedParents = new ArrayList();
-					}
-					processedParents.add(pinfo);
-				}
-			}
-		}
-		complete = true;
-			
-		if (checkCircular && processedParents != null) {
-			for (int i=0; i<processedParents.size(); i++) {
-				reachableBy((IDependencyInfo) processedParents.get(i));
-			}
-		}
-	}
-	
-	public boolean reachableBy(IDependencyInfo info)  {
-		if (! (info instanceof UpwardReachableInfo)) {
-			throw new UnsupportedOperationException();
-		}
-		if (debug) {
-			System.out.println("LD> Entry reachableBy: this -> " + this);	//$NON-NLS-1$
-			System.out.println("LD> Entry reachableBy: info -> " + info);	//$NON-NLS-1$
-			System.out.println("");											//$NON-NLS-1$
-		}
-		return reachableBy((UpwardReachableInfo) info, new Stack(), new HashMap());
-	}
-	
-	private boolean reachableBy(UpwardReachableInfo info, Stack stack, Map seen)  {
-		stack.push(info);
-		if (debug) {
-			System.out.println("LD> reachableBy: this -> " + this);		//$NON-NLS-1$
-			System.out.println("LD> reachableBy: info -> " + info);		//$NON-NLS-1$
-			System.out.println("");										//$NON-NLS-1$
-		}
-		boolean ret =  reachableBy_(info, stack, seen);
-		stack.pop();
-		return ret;
-	}
-	
-	private boolean reachableBy_(UpwardReachableInfo info, Stack stack, Map seen)  {
-		Map testMap = info.parentMap;		
-		if (testMap == null || testMap.isEmpty()) {
-			return false;
-		}
-		
-		if (testMap.containsKey(element.getGuid())) {
-			if (debug) {
-				System.out.println("LD> Contained in parentMap of: " + info);		//$NON-NLS-1$									
-			}
-			stack.push(this);
-			mgr.logCircularDependency((Stack) stack.clone());
-			stack.pop();
-			return true;
-		}
-		
-		if (seen.containsKey(info.getElement().getGuid())) {
-			return false;
-		}
-		
-		
-		seen.put(info.getElement().getGuid(), info);
-		
-		for (Iterator it = testMap.values().iterator(); it.hasNext();) {
-			UpwardReachableInfo parentInfo = (UpwardReachableInfo) it.next();
-			if (parentInfo.containedIn(stack)) {
-				if (debug) {
-					System.out.println("LD> containedIn stack: " + info);		//$NON-NLS-1$									
-				}
-				stack.push(parentInfo);
-				mgr.logCircularDependency((Stack) stack.clone());
-				stack.pop();
-				return true;
-			}
-			if  (reachableBy(parentInfo, stack, seen)) {
-				return true;
-			}
-		}	
-		
-		return false;
-	}
-	
-	public MethodElement getElement() {
-		return element;
-	}
-	
-	private List getMixedParentList() {
-		List list = new ArrayList();
-		collectParentList(element, list);
-		VariabilityElement ve = (VariabilityElement) element;
-		collectParentListByVariantPaths(ve, list);
-		if (ve.getVariabilityType() == VariabilityType.REPLACES_LITERAL ) {
-			mgr.addToReplacerMap(this);
-		}
-		return list;
-	}
-	
-	private void collectParentList(MethodElement elem, List list) {
-		List parentList = getParentList(elem);
-		
-		int sz = parentList == null ? 0 : parentList.size();
-		if (mgr.isMoveElement(elem)) {
-			if (sz > 1 && !(elem instanceof CustomCategory)) {
-				throw new UnsupportedOperationException();	
-			}
-		} else if (sz > 0) {
-			list.addAll(parentList);
-		}
-
-	}
-
-	public static List getParentList(MethodElement elem) {
-		List parentList = null;
-		
-		if (elem instanceof CustomCategory) {
-			parentList = AssociationHelper.getCustomCategories((CustomCategory) elem);
-		} else if (elem instanceof Deliverable) {
-			parentList = AssociationHelper.getDeliverables((Deliverable) elem);			
-		} else {	
-			Object parent = getSameTypeParent(elem);
-			if (parent != null) {
-				parentList = new ArrayList();
-				parentList.add(parent);
-			}
-		}
-		return parentList;
-	}
-	
-	private void collectParentListByVariantPaths(VariabilityElement ve, List list) {
-		if (! mgr.isFilterElement(ve)) {
-			VariabilityElement parentVe = ve.getVariabilityBasedOnElement();
-			VariabilityType type = parentVe == null ? null : ve.getVariabilityType();
-			if (type == VariabilityType.CONTRIBUTES_LITERAL || type == VariabilityType.REPLACES_LITERAL) {
-				list.add(parentVe);
-			}
-		}
-
-		if (mgr.isDndElement(ve)) {
-			return;
-		}
-				
-		for (Iterator it = TngUtil.getImmediateVarieties(ve, VariabilityType.EXTENDS_LITERAL) ; it.hasNext();) {
-			VariabilityElement extender = (VariabilityElement) it.next();
-			if (! mgr.isFilterElement(extender)) {
-				list.add(extender);
-			}
-		}
-		
-	}
-	
-	private static MethodElement getSameTypeParent(MethodElement elem) {
-		if (elem instanceof Activity) {
-			return ((Activity) elem).getSuperActivities();
-		}
-			
-		MethodElement parent = (MethodElement) elem.eContainer();
-		return parent.getType() == elem.getType() ? parent : null;
-	}		
-	
-	public String toString() {
-		return TngUtil.getLabelWithPath(element);
-	}
-	
-	public boolean inheritAncestor(VariabilityType type) {
-		VariabilityElement parentVe = ((VariabilityElement) element).getVariabilityBasedOnElement();
-		if (parentVe == null) {
-			return false;
-		}
-		if (((VariabilityElement) element).getVariabilityType() != type) {
-			return false;
-		}
-		ArrayList mixParentList = new ArrayList();	
-		collectParentList(element, mixParentList);
-		if (mixParentList != null && mixParentList.contains(parentVe)) {
-			return true;
-		}
-
-		UpwardReachableInfo parentVeInfo = (UpwardReachableInfo) parentMap.get(parentVe.getGuid());
-		for (Iterator it = parentMap.values().iterator(); it.hasNext();) {
-			UpwardReachableInfo parentInfo = (UpwardReachableInfo) it.next();
-			if  (parentVeInfo == parentInfo) {
-				continue;
-			}
-			if (parentVeInfo.reachableBy(parentInfo)) {
-				return true;
-			}
-		}
-				
-		return false;
-	}
-	
-	//This would scale up for performance when infoList gets large
-	private boolean containedIn(List infoList) {
-		int sz = infoList == null ? 0 : infoList.size();
-		if (sz == 0) {
-			return false;
-		}
-		String guid = getElement().getGuid();
-		if (sz == 1) {
-			return guid.equals(((IDependencyInfo) infoList.get(0)).getElement().getGuid());
-		}
-		Map listMap = new HashMap();
-		for (int i=0; i<sz; i++) {
-			IDependencyInfo info = (IDependencyInfo) infoList.get(i);
-			listMap.put(info.getElement().getGuid(), info);
-		}
-		
-		return listMap.containsKey(guid);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/ValidationStatus.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/ValidationStatus.java
deleted file mode 100644
index ae962dc..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/ValidationStatus.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation;
-
-
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class ValidationStatus extends Status {
-
-	private Object checkedObject;
-	private EStructuralFeature feature;
-
-	/**
-	 * @param severity
-	 * @param code
-	 * @param message
-	 * @param checkedObject
-	 */
-	public ValidationStatus(int severity, int code, String message, Object checkedObject, EStructuralFeature feature) {
-		super(severity, LibraryEditPlugin.PLUGIN_ID, code, message, null);
-		this.checkedObject = checkedObject;
-		this.feature = feature;
-	}
-	
-	public ValidationStatus(String pluginId, int severity, int code, String message, Object checkedObject, EStructuralFeature feature) {
-		super(severity, pluginId, code, message, null);
-		this.checkedObject = checkedObject;
-		this.feature = feature;
-	}
-
-	public Object getCheckedObject() {
-		return checkedObject;
-	}
-
-	public EStructuralFeature getFeature() {
-		return feature;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ContentElementNameValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ContentElementNameValidator.java
deleted file mode 100644
index 0b77fd7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ContentElementNameValidator.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import java.io.File;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * Name validator for ContentElement.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ContentElementNameValidator extends UniquenessValidator {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentElementNameValidator(EObject container, ContentElement e,
-			IFilter childFilter) {
-		super(container, UmaPackage.eINSTANCE
-				.getContentPackage_ContentElements(), childFilter, e,
-				UmaPackage.eINSTANCE.getNamedElement_Name());
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ContentElementNameValidator(EObject parent,
-			EStructuralFeature containingFeature, ContentElement e,
-			IFilter childFilter) {
-		super(parent, containingFeature, childFilter, e, UmaPackage.eINSTANCE
-				.getNamedElement_Name());
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.validation.internal.UniquenessValidator#isValid(String)
-	 */
-	public String isValid(String newText) {
-		ContentElement e = (ContentElement) object;
-
-		// 156945 - Element name need to allow more special characters such as ? 
-		// if the element does not generate a resource file
-		if ( e instanceof Section ) {
-			return newText;
-		}
-		
-		String msg = TngUtil.checkElementName(newText, TngUtil.getTypeText(e));
-		if (msg != null)
-			return msg;
-		
-		if (container != null) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(container);
-		
-			Integer max = new Integer(MaxFilePathNameLength);
-			if (! NameChecker.checkFilePathLength(plugin, e, newText, max.intValue(), null)) {
-				msg = NLS.bind(LibraryEditResources.filePathNameTooLong_msg, 
-						new Object[] { max } );
-				return msg;
-			}
-		}
-
-		// Check whether a file with the same name already exists.
-		if (container != null && ContentDescriptionFactory.hasPresentation(e)) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(container);
-			if(plugin == UmaUtil.getMethodPlugin(e)) {
-				URI uri = plugin.eResource().getURI();
-				if(uri.isFile()) {
-					File pluginDir = new File(uri.toFileString()).getParentFile();
-					IFileBasedLibraryPersister persister = ((IFileBasedLibraryPersister)Services.getLibraryPersister(Services.XMI_PERSISTENCE_TYPE));			
-					String folderPath = persister.getFolderRelativePath(e);
-					String dir = new StringBuffer(pluginDir.getAbsolutePath()).append(
-							File.separator).append(folderPath).toString();
-					String fileName = newText + persister.getFileExtension(e);
-					File file = new File(dir, fileName);
-					File currentFile = null;
-					ContentDescription content = e.getPresentation();
-					if (content.eResource() != null) {
-						currentFile = new File(content.eResource().getURI()
-								.toFileString());
-					} else {
-						currentFile = file;
-					}
-					if (file.exists() && !newText.equals(e.getName()) && !file.equals(currentFile)) {
-						return NLS.bind(LibraryEditResources.duplicateContentFileError_msg, file); 
-					}
-				}
-			}
-		}
-
-		return super.isValid(newText);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/CustomCategoryNameValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/CustomCategoryNameValidator.java
deleted file mode 100644
index f010fd3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/CustomCategoryNameValidator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * Name validator for CustomCategory.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class CustomCategoryNameValidator extends ContentElementNameValidator {
-
-	/**
-	 * @param container
-	 * @param e
-	 * @param childFilter
-	 */
-	public CustomCategoryNameValidator(CustomCategory parent, CustomCategory e,
-			IFilter childFilter) {
-		super(parent, UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS, e, childFilter);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/DoNothingValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/DoNothingValidator.java
deleted file mode 100644
index d552bb2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/DoNothingValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.library.edit.validation.IValidator;
-
-/**
- * Validator that validates nothing.
- * 
- * @author Phong Nguyen Le - Aug 4, 2005
- * @since 1.0
- */
-public class DoNothingValidator implements IValidator {
-	public static final DoNothingValidator INSTANCE = new DoNothingValidator();
-
-	private DoNothingValidator() {
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.String)
-	 */
-	public String isValid(String newText) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.Object)
-	 */
-	public IStatus isValid(Object value) {
-		return Status.OK_STATUS;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/MethodConfigurationNameValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/MethodConfigurationNameValidator.java
deleted file mode 100644
index 3fa8512..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/MethodConfigurationNameValidator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import java.io.File;
-
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.AbstractStringValidator;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * Name validator for MethodConfiguration.
- * 
- * @author Phong Nguyen Le - May 12, 2006
- * @since  1.0
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=177973
- */
-public class MethodConfigurationNameValidator extends AbstractStringValidator {
-
-	private MethodLibrary library;
-	private MethodConfiguration config;
-
-	public MethodConfigurationNameValidator(MethodLibrary lib, MethodConfiguration config) {
-		library = lib;
-		this.config = config;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.String)
-	 */
-	public String isValid(String newText) {
-		newText = newText.trim(); //fix https://bugs.eclipse.org/bugs/show_bug.cgi?id=177973
-		Integer max = new Integer(MaxFilePathNameLength);
-		if (! NameChecker.checkFilePathLength(library, config, newText, max.intValue(), null)) {
-			String msg = NLS.bind(LibraryEditResources.filePathNameTooLong_msg, 
-					new Object[] { max } );
-			return msg;
-		}
-		String configFolder = ((IFileBasedLibraryPersister)Services.getLibraryPersister(Services.XMI_PERSISTENCE_TYPE)) 
-			.getFolderRelativePath(config);
-		File dir = new File(new File(library.eResource().getURI().toFileString())
-						.getParent(), configFolder);
-		return TngUtil.checkName(dir, library.getPredefinedConfigurations(), config,
-				newText, TngUtil.getTypeText(config), false);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/MethodPluginNameValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/MethodPluginNameValidator.java
deleted file mode 100644
index d0de673..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/MethodPluginNameValidator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import java.io.File;
-
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.AbstractStringValidator;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.1
- */
-public class MethodPluginNameValidator extends AbstractStringValidator {
-	private MethodLibrary lib;
-	private MethodPlugin plugin;	
-
-	/**
-	 * @param lib
-	 */
-	public MethodPluginNameValidator(MethodLibrary lib, MethodPlugin plugin) {
-		super();
-		this.lib = lib;
-		this.plugin = plugin;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.String)
-	 */
-	public String isValid(String newText) {
-		String msg = TngUtil.checkPluginName(newText);
-		if(msg != null) {
-			return msg;
-		}
-		
-		Integer max = new Integer(MaxFilePathNameLength);
-		if (! NameChecker.checkFilePathLength(lib, plugin, newText, max.intValue(), null)) {
-			msg = NLS.bind(LibraryEditResources.filePathNameTooLong_msg, 
-					new Object[] { max } );
-			return msg;
-		}
-		
-		File dir = new File(lib.eResource().getURI().toFileString())
-				.getParentFile();
-		String elementTypeText = (plugin != null) ? TngUtil.getTypeText(plugin)
-				: TngUtil.getTypeText("MethodPlugin"); //$NON-NLS-1$
-		return TngUtil.checkName(dir, lib.getMethodPlugins(), plugin, newText,
-				elementTypeText, true);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ProcessComponentNameValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ProcessComponentNameValidator.java
deleted file mode 100644
index 925a60b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ProcessComponentNameValidator.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import java.io.File;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.AbstractStringValidator;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * Validates the name of a process component.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessComponentNameValidator extends AbstractStringValidator {
-
-	private ProcessPackage parent;
-
-	private ProcessComponent procComp;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessComponentNameValidator(ProcessPackage parent,
-			ProcessComponent procComp) {
-		this.parent = parent;
-		this.procComp = procComp;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.String)
-	 */
-	public String isValid(String newText) {
-		String relativePath = ((IFileBasedLibraryPersister)Services.getLibraryPersister(Services.XMI_PERSISTENCE_TYPE))
-			.getFolderRelativePath(procComp);
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(parent);
-		
-		Integer max = new Integer(MaxFilePathNameLength);
-		if (! NameChecker.checkFilePathLength(plugin, procComp, newText, max.intValue(), null)) {
-			String msg = NLS.bind(LibraryEditResources.filePathNameTooLong_msg, 
-					new Object[] { max } );
-			return msg;
-		}
-		
-		File dir = new File(
-				new File(plugin.eResource().getURI().toFileString())
-						.getParent()
-						+ File.separator + relativePath);
-		if (! newText.equals(StrUtil.makeValidFileName(newText))) {
-			return NLS.bind(LibraryEditResources.invalidElementNameError3_msg, newText); 
-		}
-		return TngUtil.checkName(dir, parent.getChildPackages(), procComp,
-				newText, TngUtil.getTypeText(procComp), true);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/UniquenessValidator.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/UniquenessValidator.java
deleted file mode 100644
index 2d11656..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/UniquenessValidator.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Validates the uniqueness of an object within a given feature that contains it.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UniquenessValidator implements IValidator {
-	protected EObject object;
-
-	private EStructuralFeature feature;
-
-	private String featureName;
-
-	private EStructuralFeature containingFeature;
-
-	private IFilter childFilter;
-
-	protected EObject container;
-
-	public UniquenessValidator(EObject container,
-			EStructuralFeature containingFeature, IFilter childFilter,
-			EObject obj, EStructuralFeature feature) {
-		this(container, containingFeature, childFilter, obj, feature, StrUtil
-				.toLower(TngUtil.getFeatureText(feature)));
-	}
-
-	public UniquenessValidator(EObject container,
-			EStructuralFeature containingFeature, IFilter childFilter,
-			EObject obj, EStructuralFeature feature, String featureName) {
-		this.container = container;
-		object = obj;
-		this.containingFeature = containingFeature;
-		this.childFilter = childFilter;
-		this.feature = feature;
-		this.featureName = featureName;
-	}
-	
-	void setChildFilter(IFilter childFilter) {
-		this.childFilter = childFilter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.String)
-	 */
-	public String isValid(String newText) {
-		if (container == null)
-			return null;
-		newText = newText.trim();
-		if (StrUtil.isBlank(newText)) {
-			// return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-			return NLS.bind(LibraryEditResources.emptyElementNameError_msg,
-					featureName);
-		}
-		Collection children;
-		if (containingFeature == null) {
-			children = container.eContents();
-		} else {
-			children = (Collection) container.eGet(containingFeature);
-		}
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child != object && childFilter.accept(child)) {
-				String name = (String) ((EObject) child).eGet(feature);
-				if (name.equalsIgnoreCase(newText)) {
-					// return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-					return NLS.bind(
-							LibraryEditResources.duplicateElementNameError_msg,
-							newText);
-				}
-			}
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.validation.IValidator#isValid(java.lang.Object)
-	 */
-	public IStatus isValid(Object value) {
-		if (container == null)
-			return Status.OK_STATUS;
-		Collection children;
-		if (containingFeature == null) {
-			children = container.eContents();
-		} else {
-			children = (Collection) container.eGet(containingFeature);
-		}
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			Object child = iter.next();
-			if (child != object && childFilter.accept(child)) {
-				String o = (String) ((EObject) child).eGet(feature);
-				if (o.equals(value)) {
-					return new Status(
-							IStatus.ERROR,
-							LibraryEditPlugin.getDefault().getId(),
-							0,
-							NLS
-									.bind(
-											LibraryEditResources.duplicateFeatureValue,
-											new Object[] {
-													TngUtil.getLabel(container),
-													featureName
-											}), null);
-				}
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	public EObject getEObject() {
-		return object;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ValidatorFactory.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ValidatorFactory.java
deleted file mode 100644
index 761a305..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ValidatorFactory.java
+++ /dev/null
@@ -1,439 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.edit.validation.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.AbstractStringValidator;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.edit.validation.NameChecker;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-import org.osgi.framework.Bundle;
-
-/**
- * Implementation of IValidatorFactory.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ValidatorFactory implements IValidatorFactory {
-	private static List contributedValidatorFactories;
-
-	private static IValidatorFactory instance;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidatorFactory#createNameValidator(org.eclipse.epf.uma.ContentElement)
-	 */
-	public IValidator createNameValidator(Object parent, ContentElement e) {
-		if (parent instanceof CustomCategory && e instanceof CustomCategory) {
-			return new ContentElementNameValidator((EObject) parent,
-					UmaPackage.eINSTANCE
-							.getCustomCategory_CategorizedElements(), e,
-					new TypeFilter(e));
-		}
-		EObject container = null;
-		if (parent instanceof EObject) {
-			container = (EObject) parent;
-		}
-		return new ContentElementNameValidator(container, e, new TypeFilter(e));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidatorFactory#createPresentationNameValidator(org.eclipse.epf.uma.ContentElement)
-	 *      Changed from ContentElement to DescribableElement, because
-	 *      PresentationName attribute is available in DescribableElement.
-	 */
-	public IValidator createPresentationNameValidator(Object parent,
-			DescribableElement e) {
-		if (parent instanceof EObject) {
-			Object[] arr = getChildReferenceAndFilter(parent, e);
-			EReference reference = (EReference) arr[0];
-			IFilter childFilter = (IFilter) arr[1];
-			if (reference != null) {
-				if (childFilter == null) {
-					childFilter = new TypeFilter(e);
-				}
-				return new UniquenessValidator((EObject) parent, reference,
-						childFilter, e, UmaPackage.eINSTANCE
-								.getDescribableElement_PresentationName()) {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.epf.library.edit.validation.internal.UniquenessValidator#isValid(java.lang.String)
-					 */
-					public String isValid(String newText) {
-						if (StrUtil.isBlank(newText)
-								&& NameChecker
-										.canHaveEmptyPresentationName((DescribableElement) object)) {
-							return null;
-						}
-						return super.isValid(newText);
-					}
-				};
-			}
-		}
-
-		return DoNothingValidator.INSTANCE;
-	}
-
-	public static class TypeFilter implements IFilter {
-		private int classID;
-
-		private EClass eClass;
-
-		/**
-		 * 
-		 */
-		public TypeFilter(EObject obj) {
-			classID = obj.eClass().getClassifierID();
-		}
-
-		public TypeFilter(EClass eClass) {
-			this.eClass = eClass;
-		}
-
-		public boolean accept(Object obj) {
-			if (eClass != null) {
-				return eClass.isInstance(obj);
-			}
-
-			return obj instanceof EObject
-					&& classID == ((EObject) obj).eClass().getClassifierID();
-		}
-
-	}
-
-	public static final IFilter nonFilter = new IFilter() {
-
-		public boolean accept(Object obj) {
-			return true;
-		}
-
-	};
-
-	private static Object[] getChildReferenceAndFilter(Object parent,
-			Object child) {
-		EReference reference = null;
-		IFilter childFilter = null;
-		if (child instanceof ContentElement) {
-			if (parent instanceof CustomCategory
-					&& child instanceof CustomCategory) {
-				reference = UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS;
-				childFilter = new TypeFilter(
-						UmaPackage.Literals.CUSTOM_CATEGORY);
-			} else if (parent instanceof ContentPackage) {
-				reference = UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS;
-			}
-		} else if (child instanceof MethodPackage
-				&& parent instanceof MethodPackage) {
-			reference = UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES;
-		} else if (parent instanceof MethodLibrary) {
-			if (child instanceof MethodPlugin) {
-				reference = UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS;
-				childFilter = nonFilter;
-			} else if (child instanceof MethodConfiguration) {
-				reference = UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS;
-				childFilter = nonFilter;
-			}
-		}
-		return new Object[] { reference, childFilter };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidatorFactory#createNameValidator(org.eclipse.epf.uma.NamedElement)
-	 */
-	public IValidator createNameValidator(Object parent, final NamedElement e) {
-		final EStructuralFeature feature = UmaPackage.Literals.NAMED_ELEMENT__NAME;
-		Object[] arr = getChildReferenceAndFilter(parent, e);
-		EReference reference = (EReference) arr[0];
-		IFilter childFilter = (IFilter) arr[1];
-		if (reference != null) {
-			return createValidator((EObject) parent, reference, childFilter, e,
-					feature);
-		} else if (e instanceof MethodConfiguration
-			&& parent instanceof MethodLibrary) {
-			return new MethodConfigurationNameValidator(
-				(MethodLibrary) parent, (MethodConfiguration) e);
-		}
-		return DoNothingValidator.INSTANCE;
-	}
-
-	public IValidator createNameValidator(Object parent, final NamedElement e, EClass newType) {
-		final EStructuralFeature feature = UmaPackage.Literals.NAMED_ELEMENT__NAME;
-		Object[] arr = getChildReferenceAndFilter(parent, e);
-		EReference reference = (EReference) arr[0];
-		IFilter childFilter = new TypeFilter(newType);
-		if (reference != null) {
-			return createValidator((EObject) parent, reference, childFilter, e,
-					feature);
-		}
-		return DoNothingValidator.INSTANCE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidatorFactory#createNameValidator(org.eclipse.epf.uma.NamedElement,
-	 *      org.eclipse.emf.common.notify.AdapterFactory)
-	 */
-	public IValidator createNameValidator(NamedElement e,
-			AdapterFactory adapterFactory) {
-		EStructuralFeature containingFeature = TngUtil.getContainingFeature(e,
-				adapterFactory);
-		if (containingFeature != null) {
-			EObject parent = (EObject) ((ITreeItemContentProvider) adapterFactory
-					.adapt(e, ITreeItemContentProvider.class)).getParent(e);
-			if (e instanceof ContentElement) {
-				return new ContentElementNameValidator(parent,
-						containingFeature, (ContentElement) e,
-						new TypeFilter(e));
-			} else if (e instanceof ProcessComponent
-					&& parent instanceof ProcessPackage) {
-				return new ProcessComponentNameValidator(
-						(ProcessPackage) parent, (ProcessComponent) e);
-			} else if (e instanceof MethodPlugin
-					&& parent instanceof MethodLibrary) {
-				return new MethodPluginNameValidator(
-						(MethodLibrary) parent, (MethodPlugin) e);
-			} else if (e instanceof MethodConfiguration
-					&& parent instanceof MethodLibrary) {
-				return new MethodConfigurationNameValidator(
-						(MethodLibrary) parent, (MethodConfiguration) e);
-			} else {
-				return new UniquenessValidator(parent, containingFeature,
-						new TypeFilter(e), e, UmaPackage.eINSTANCE
-								.getNamedElement_Name());
-			}
-		}
-		return createNameValidator(e.eContainer(), e);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidatorFactory#createValidator(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EReference, org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EClass,
-	 *      org.eclipse.emf.ecore.EStructuralFeature)
-	 */
-	public IValidator createValidator(EObject parent, EReference reference,
-			EClass eClass, final EObject object, EStructuralFeature feature) {
-		IFilter childFilter = eClass != null ? new TypeFilter(eClass) : null;
-		return createValidator(parent, reference, childFilter, object, feature);
-	}
-
-	public static IValidatorFactory createValidatorFactory() {
-		if (contributedValidatorFactories != null) {
-			contributedValidatorFactories = new ArrayList();
-			IExtensionRegistry extensionRegistry = Platform
-					.getExtensionRegistry();
-			IExtensionPoint extensionPoint = extensionRegistry
-					.getExtensionPoint(LibraryEditPlugin.getDefault().getId(),
-							"validationSupport"); //$NON-NLS-1$
-			if (extensionPoint != null) {
-				IExtension[] extensions = extensionPoint.getExtensions();
-				for (int i = 0; i < extensions.length; i++) {
-					IExtension extension = extensions[i];
-					String pluginId = extension.getNamespaceIdentifier();
-					Bundle bundle = Platform.getBundle(pluginId);
-					IConfigurationElement[] configElements = extension
-							.getConfigurationElements();
-					for (int j = 0; j < configElements.length; j++) {
-						IConfigurationElement configElement = configElements[j];
-						try {
-							String className = configElement
-									.getAttribute("class"); //$NON-NLS-1$
-							if (className != null) {
-								Object ext = bundle.loadClass(className)
-										.newInstance();
-								boolean replace = new Boolean(configElement
-										.getAttribute("replace")).booleanValue(); //$NON-NLS-1$
-								if (replace) {
-									contributedValidatorFactories.clear();
-									instance = (IValidatorFactory) ext;
-								} else if (instance == null) {
-									contributedValidatorFactories.add(ext);
-								}
-							}
-						} catch (Exception e) {
-							LibraryEditPlugin.INSTANCE.log(e);
-						}
-					}
-				}
-			}
-
-		}
-		if (instance == null) {
-			instance = new ValidatorFactory();
-		}
-		return instance;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.edit.validation.IValidatorFactory#createValidator(org.eclipse.emf.ecore.EClass,
-	 *      org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature,
-	 *      org.eclipse.emf.common.notify.AdapterFactory)
-	 */
-	public IValidator createValidator(final Object parent, EClass eClass,
-			final EObject object, final EStructuralFeature feature,
-			final AdapterFactory adapterFactory) {
-		if (object instanceof BreakdownElement) {
-			if (feature == UmaPackage.Literals.NAMED_ELEMENT__NAME
-					|| feature == UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME) {
-				final BreakdownElement be = (BreakdownElement) object;
-				Process proc = TngUtil.getOwningProcess(parent);
-				if (proc != null) {
-					final Suppression supp = Suppression.getSuppression(proc);
-					return new AbstractStringValidator() {
-
-						public String isValid(String newText) {
-							return NameChecker.checkName(adapterFactory,
-									parent, be, null, feature, newText, supp,
-									true);
-						}
-
-					};
-				}
-			}
-		}
-
-		return DoNothingValidator.INSTANCE;
-	}
-
-	private static IFilter getFilter(IFilter filter, EObject eObject) {
-		return filter != null ? filter : (eObject != null ? new TypeFilter(
-				eObject) : nonFilter);
-	}
-
-	public IValidator createValidator(EObject parent, EReference reference,
-			IFilter childFilter, final EObject object,
-			EStructuralFeature feature) {
-		if (feature == UmaPackage.Literals.NAMED_ELEMENT__NAME) {
-			IValidator validator = null;
-			if (object instanceof ContentElement) {
-				if (reference == UmaPackage.eINSTANCE
-						.getContentPackage_ContentElements()
-						|| (reference == UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS && object instanceof CustomCategory)) {
-					validator = new ContentElementNameValidator(parent,
-							reference, (ContentElement) object, getFilter(
-									childFilter, object));
-
-				} else if ((reference == UmaPackage.Literals.DISCIPLINE_GROUPING__DISCIPLINES)
-						|| (reference == UmaPackage.Literals.ROLE_SET_GROUPING__ROLE_SETS)) {
-					// Discipline and DisciplineGrouping, RoleSet and
-					// RoleSetGrouping
-					// handling
-					// necessary in order to maintain uniqueness across plugin.
-					validator = new UniquenessValidator(parent.eContainer(),
-							UmaPackage.eINSTANCE
-									.getContentPackage_ContentElements(),
-							getFilter(childFilter, object), object, feature);
-				} else if ((reference == UmaPackage.Literals.ARTIFACT__CONTAINED_ARTIFACTS)
-						|| (reference == UmaPackage.Literals.DISCIPLINE__SUBDISCIPLINE)
-						|| (reference == UmaPackage.Literals.PRACTICE__SUB_PRACTICES)
-						|| (reference == UmaPackage.Literals.DOMAIN__SUBDOMAINS)
-						) {
-					validator = new ContentElementNameValidator(parent,
-							reference, (ContentElement) object, getFilter(
-									childFilter, object));
-				}
-			} else if (object instanceof ProcessComponent
-					&& parent instanceof ProcessPackage
-					&& reference == UmaPackage.eINSTANCE
-							.getMethodPackage_ChildPackages()) {
-				ProcessPackage pkg = (ProcessPackage) parent;
-				if (pkg.eResource().getURI().isFile()) {
-					return new ProcessComponentNameValidator(
-							(ProcessPackage) parent, (ProcessComponent) object);
-				} else {
-					return new UniquenessValidator((EObject) parent, reference,
-							getFilter(childFilter, object), object, feature);
-				}
-			} else if (parent instanceof MethodLibrary) {
-				MethodLibrary lib = (MethodLibrary) parent;
-				if (reference == UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS) {
-					if (lib.eResource().getURI().isFile()) {
-						return new MethodPluginNameValidator(lib,
-								(MethodPlugin) object);
-					} else {
-						return new UniquenessValidator(
-								lib,
-								UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS,
-								nonFilter, object, UmaPackage.eINSTANCE
-										.getNamedElement_Name());
-					}
-				} else if (reference == UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS) {
-					if (lib.eResource().getURI().isFile()) {
-						return new MethodConfigurationNameValidator(lib,
-								(MethodConfiguration) object);
-					} else {
-						return new UniquenessValidator(
-								lib,
-								UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS,
-								nonFilter, object, UmaPackage.eINSTANCE
-										.getNamedElement_Name());
-					}
-				}
-			} else {
-				validator = new UniquenessValidator(parent, reference,
-						getFilter(childFilter, object), object, feature);
-			}
-
-			return validator;
-		} else if (feature == UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME) {
-			return createPresentationNameValidator(parent,
-					(DescribableElement) object);
-		}
-
-		return DoNothingValidator.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/package.html
deleted file mode 100644
index 07e1821..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for validating method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/package.html b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/package.html
deleted file mode 100644
index 06c3d06..0000000
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for validating method library elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/.classpath b/1.5/plugins/org.eclipse.epf.library.persistence/.classpath
deleted file mode 100644
index 8c4f20f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/.classpath
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/.options b/1.5/plugins/org.eclipse.epf.library.persistence/.options
deleted file mode 100644
index cd3b8ef..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Common plug-in
-org.eclipse.epf.library.persistence/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/.project b/1.5/plugins/org.eclipse.epf.library.persistence/.project
deleted file mode 100644
index f3c18ca..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.library.persistence</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.library.persistence/META-INF/MANIFEST.MF
deleted file mode 100644
index bdcb8dd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.library.persistence; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.diagram.model,
- org.eclipse.epf.common;visibility:=reexport,
- org.eclipse.epf.uma;visibility:=reexport,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.emf.mapping.ecore2ecore;visibility:=reexport,
- org.eclipse.emf.mapping.ecore2xml;visibility:=reexport,
- org.eclipse.core.filebuffers,
- org.eclipse.jface.text,
- org.eclipse.epf.services;visibility:=reexport,
- org.eclipse.emf.workspace
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.library.persistence,
- org.eclipse.epf.library.persistence.internal,
- org.eclipse.epf.library.persistence.synch,
- org.eclipse.epf.library.persistence.util,
- org.eclipse.epf.persistence,
- org.eclipse.epf.persistence.migration,
- org.eclipse.epf.persistence.refresh,
- org.eclipse.epf.persistence.refresh.internal,
- org.eclipse.epf.persistence.util,
- org.eclipse.epf.resourcemanager,
- org.eclipse.epf.resourcemanager.impl,
- org.eclipse.epf.resourcemanager.util
-Bundle-Activator: org.eclipse.epf.persistence.PersistencePlugin
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/build.properties b/1.5/plugins/org.eclipse.epf.library.persistence/build.properties
deleted file mode 100644
index 35cca7a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               migration/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/
-
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/migration/migrators.properties b/1.5/plugins/org.eclipse.epf.library.persistence/migration/migrators.properties
deleted file mode 100644
index 4079e6c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/migration/migrators.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-http\:///com/ibm/uma.ecore=org.eclipse.epf.persistence.migration.internal.Migrator
-org.eclipse.epf.persistence.migration.internal.Migrator=http\://www.ibm.com/uma/1.0.2/uma.ecore
-http\://www.ibm.com/uma/1.0.2/uma.ecore=org.eclipse.epf.persistence.migration.internal.Migrator102
-org.eclipse.epf.persistence.migration.internal.Migrator102=http\://www.eclipse.org/epf/uma/1.0.3/uma.ecore
-
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/migration/uma1.0.2_1.0.3.ecore2ecore b/1.5/plugins/org.eclipse.epf.library.persistence/migration/uma1.0.2_1.0.3.ecore2ecore
deleted file mode 100644
index 902e74d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/migration/uma1.0.2_1.0.3.ecore2ecore
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore2ecore:Ecore2EcoreMappingRoot xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore2ecore="http://www.eclipse.org/emf/2004/Ecore2Ecore" topToBottom="true">
-  <inputs href="../../org.eclipse.epf.uma/model/1.0.2/uma.ecore#/"/>
-  <outputs href="../../org.eclipse.epf.uma/model/1.0.3/uma.ecore#/"/>
-</ecore2ecore:Ecore2EcoreMappingRoot>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/plugin.properties b/1.5/plugins/org.eclipse.epf.library.persistence/plugin.properties
deleted file mode 100644
index 86c94da..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/plugin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Library Persistence
-providerName=Eclipse.org
-# ====================================================================
-
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/plugin.xml b/1.5/plugins/org.eclipse.epf.library.persistence/plugin.xml
deleted file mode 100644
index 26d5b76..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/plugin.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="migrators" name="Migrators" schema="schema/migrators.exsd"/>
-   <extension-point id="resourceSetFactories" name="Library Resource Set Factories" schema="schema/resourceSetFactories.exsd"/>
-
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http:///com/ibm/uma/resourcemanager.ecore" 
-       class = "org.eclipse.epf.resourcemanager.ResourcemanagerPackage" />
-    <package
-          class="org.eclipse.epf.resourcemanager.ResourcemanagerPackage"
-          uri="http:///org/eclipse/epf/uma/resourcemanager.ecore"/>
-  </extension>
-  <extension
-        point="org.eclipse.epf.library.persistence.migrators">
-     <migrator
-           class="org.eclipse.epf.persistence.migration.internal.Migrator"
-           libNsURI="http:///com/ibm/uma.ecore"/>
-  </extension>
-  <extension
-        point="org.eclipse.epf.services.serviceProviders">
-     <accessController class="org.eclipse.epf.library.persistence.internal.AccessController"/>
-     <libraryPersister
-           class="org.eclipse.epf.persistence.XMILibraryPersister"
-           default="false"
-           type="xmi"/>
-     <fileManager class="org.eclipse.epf.persistence.DelegateFileManager"/>
-  </extension>
-  <extension
-        point="org.eclipse.epf.library.persistence.resourceSetFactories">
-     <resourceSetFactory
-           class="org.eclipse.epf.persistence.XMILibraryResourceSetFactory"
-           type="xmi"/>
-  </extension>
-  <extension
-        id="unresolvedProxyMarker"
-        point="org.eclipse.core.resources.markers">
-     <persistent
-           value="false">
-     </persistent>
-     <super
-           type="org.eclipse.core.resources.problemmarker">
-     </super>
-     <attribute
-           name="proxyURI">
-     </attribute>
-     <attribute
-           name="ownerGUID">
-     </attribute>
-  </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/schema/migrators.exsd b/1.5/plugins/org.eclipse.epf.library.persistence/schema/migrators.exsd
deleted file mode 100644
index b60a0ee..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/schema/migrators.exsd
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.persistence">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.persistence" id="migrators" name="Migrators"/>
-      </appInfo>
-      <documentation>
-         Migrator migrates method library from one version to another
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="migrator" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="migrator">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements a migrator. This class must be a public implementation of &lt;code&gt;org.eclipse.epf.persistence.IMigrator&lt;/code&gt; with a public 0-argument constructor.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="libNsURI" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name space URI of the method library that this migrator can migrates
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;pre&gt;
-  &lt;extension
-        point=&quot;org.eclipse.epf.library.persistence.migrators&quot;&gt;
-     &lt;migrator
-           class=&quot;org.eclipse.epf.persistence.migration.internal.Migrator&quot;
-           libNsURI=&quot;http:///com/ibm/uma.ecore&quot;/&gt;
-  &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.persistence.IMigrator
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.persistence.migration.internal.Migrator
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/schema/resourceSetFactories.exsd b/1.5/plugins/org.eclipse.epf.library.persistence/schema/resourceSetFactories.exsd
deleted file mode 100644
index 2c2d7b6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/schema/resourceSetFactories.exsd
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.persistence">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.persistence" id="resourceSetFactories" name="Library Resource Set Factories"/>
-      </appInfo>
-      <documentation>
-         Extension point to contribute factories for creation of library resource set. The factories must implement interface org.eclipse.epf.library.persistence.ILibraryResourceSetFactory and must have a public non-argument constructor.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="resourceSetFactory" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="resourceSetFactory">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="type"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.library.persistence.ILibraryResourceSetFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="version" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.library.persistence.ILibraryResourceSetFactory
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResource.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResource.java
deleted file mode 100644
index 8edca54..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public interface ILibraryResource extends Resource {
-	/**
-	 * Gets load stamp.
-	 * 
-	 * @return
-	 */
-	long getLoadStamp();
-	
-	/**
-	 * Gets proxy URI for the specified object.
-	 * 
-	 * @param object
-	 * @return
-	 */
-	URI getProxyURI(EObject object);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResourceSet.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResourceSet.java
deleted file mode 100644
index d99db5c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResourceSet.java
+++ /dev/null
@@ -1,180 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.persistence.refresh.IRefreshListener;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.ecore.IUmaResourceSet;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * A resource set that manages a collection of {@link Resource}
- * 
- * @author Phong Nguyen Le
- * @since 1.1
- */
-public interface ILibraryResourceSet extends IUmaResourceSet {
-	/**
-	 * Gets the persistence type this resource set supports
-	 * 
-	 * @return the persistence type
-	 * @see Services#getDefaultLibraryPersistenceType()
-	 * @see Services#XMI_PERSISTENCE_TYPE
-	 */
-	String getPersistenceType();
-
-	/**
-	 * Loads method libraries into this resource set from the given URI.
-	 * 
-	 * @param parameters
-	 * @return
-	 */
-	void loadMethodLibraries(URI uri, Map<?, ?> parameters)
-			throws LibraryResourceException;
-
-	/**
-	 * Gets the list of method libraries that have been loaded into this
-	 * resource set.
-	 * 
-	 * @return
-	 */
-	List<MethodLibrary> getMethodLibraries();
-
-	/**
-	 * Gets the first loaded method library of this resource set.
-	 * 
-	 * @return the method library or <code>null</code> if it is not loaded
-	 *         yet.
-	 * @see #loadLibrary(URI, Map)
-	 */
-	MethodLibrary getFirstMethodLibrary();
-
-	/**
-	 * Gets the object with the specified GUID (Globally Unique Identifier)
-	 * 
-	 * @param guid
-	 * @return
-	 */
-	EObject getEObject(String guid);
-
-	Map<?, ?> getDefaultSaveOptions();
-
-	/**
-	 * Loads the given opposite features of all loaded objects in this resource
-	 * set.
-	 * 
-	 * @param oppositeFeatures
-	 */
-	void loadOppositeFeatures(List<OppositeFeature> oppositeFeatures);
-
-	/**
-	 * Loads the given opposite features of those objects in this resource set
-	 * whose GUIDs are specified in <code>GUIDs</code> set.
-	 * 
-	 * @param oppositeFeatures
-	 * @param GUIDs
-	 */
-	void loadOppositeFeatures(List<OppositeFeature> oppositeFeatures, Set<String> GUIDs);
-
-	/**
-	 * Saves this resource set with the given save options.
-	 * 
-	 * @param options
-	 *            save options
-	 * @throws LibraryResourceException
-	 */
-	void save(Map<?, ?> options) throws LibraryResourceException;
-
-	/**
-	 * Unloads the given object in this resource set
-	 * 
-	 * @param object
-	 * @return boolean <code>true</code> if the given object was unloaded
-	 *         successfully
-	 */
-	boolean unload(EObject object);
-
-	/**
-	 * Unloads the specified resource of this resource set.
-	 * 
-	 * @param resource
-	 * @param options
-	 * @return TODO
-	 */
-	boolean unload(Resource resource, Map<?, ?> options);
-
-	/**
-	 * Reloads the given resources
-	 * 
-	 * @param resources
-	 * @return resources that had been reloaded
-	 */
-	Collection<Resource> reloadResources(Collection<Resource> resources);
-
-	/**
-	 * Reloads the given persisted objects.
-	 * 
-	 * @param objects
-	 * @return objects that have been reloaded
-	 */
-	Collection<EObject> reloadObjects(Collection<EObject> objects);
-
-	/**
-	 * Unloads this resource set. This will unload every resource in this
-	 * resource set and reset the resource set to the state before loading the
-	 * library.
-	 * 
-	 */
-	void unload();
-
-	/**
-	 * Checks if there is any unresolved proxy detected in the library
-	 * 
-	 * @return
-	 */
-	boolean hasUnresolvedProxy();
-
-	/**
-	 * Subscribes the specified listener to listen to refresh events broadcasted
-	 * whenever resources or objects of this resource set is refreshed/reloaded.
-	 * 
-	 * @param listener
-	 * @see #reloadResources(Collection)
-	 */
-	void addRefreshListener(IRefreshListener listener);
-	
-	/**
-	 * Unsubscribes the specified listener from listening to refresh events.
-	 * 
-	 * @param listener
-	 */
-	void removeRefreshListenter(IRefreshListener listener);
-
-	ILibraryPersister getPersister();
-
-	void checkModify(Resource[] resources, Object context)
-			throws LibraryResourceException;
-
-	IStatus checkModify(Collection<EObject> eObjects, Object context);
-	
-	Collection<Resource> loadNewResources();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResourceSetFactory.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResourceSetFactory.java
deleted file mode 100644
index b2973b5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/ILibraryResourceSetFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence;
-
-/**
- * Factory to create {@link ILibraryResourceSet} instance of the particular
- * persistence type
- * 
- * @author Phong Nguyen Le - Oct 26, 2006
- * @since 1.0
- */
-public interface ILibraryResourceSetFactory {
-
-	/**
-	 * Gets the persistence type of the resource set created by this factory
-	 * 
-	 * @return the persistence type
-	 */
-	String getPersistenceType();
-
-	/**
-	 * Creates a new library resource set
-	 * 
-	 * @return a new library resource set
-	 */
-	ILibraryResourceSet createLibraryResourceSet();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/IRefreshInfo.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/IRefreshInfo.java
deleted file mode 100644
index fea7b0c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/IRefreshInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence;
-
-import java.util.Collection;
-
-import org.eclipse.emf.ecore.resource.Resource;
-
-/**
- * @author Phong Nguyen Le - Oct 3, 2006
- * @since  1.0
- */
-public interface IRefreshInfo {
-	/**
-	 * Gets existing resources that reappears in workspace
-	 * 
-	 * @return the addedResources
-	 */
-	public Collection getAddedResources();
-	
-	/**
-	 * Gets newly added workspace resources
-	 * 
-	 * @return
-	 */
-	public Collection getAddedWorkspaceResources();
-	
-	/**
-	 * @return Returns the changedResources.
-	 */
-	public Collection getChangedResources();
-	
-	/**
-	 * @return the loadedBeforeRefreshResources
-	 */
-	public Collection getReloadedBeforeRefreshResources();
-	
-	/**
-	 * @return Returns the removedResources.
-	 */
-	public Collection getRemovedResources();
-	
-	/**
-	 * Notifies this manager that the given resource just has been saved.
-	 * 
-	 * @param resource
-	 */
-	public void resourceSaved(Resource resource);	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/LibraryResourceException.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/LibraryResourceException.java
deleted file mode 100644
index e40b013..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/LibraryResourceException.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence;
-
-/**
- * @author Phong Nguyen Le - Oct 2, 2006
- * @since  1.0
- */
-public class LibraryResourceException extends Exception {
-
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 8272587344678676828L;
-
-	/**
-	 * 
-	 */
-	public LibraryResourceException() {
-		super();
-	}
-
-	/**
-	 * @param message
-	 */
-	public LibraryResourceException(String message) {
-		super(message);
-	}
-
-	/**
-	 * @param message
-	 * @param cause
-	 */
-	public LibraryResourceException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	/**
-	 * @param cause
-	 */
-	public LibraryResourceException(Throwable cause) {
-		super(cause);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/PersistenceService.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/PersistenceService.java
deleted file mode 100644
index 3660de9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/PersistenceService.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.epf.persistence.PersistencePlugin;
-import org.eclipse.epf.services.Services;
-import org.osgi.framework.Bundle;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class PersistenceService {
-	private static final boolean DEBUG = PersistencePlugin.getDefault().isDebugging();
-	
-	public static final PersistenceService INSTANCE = new PersistenceService();
-
-	private static HashMap<String, FactoryDef> typeToFactoryDefMap;
-
-	private PersistenceService() {
-
-	}
-
-	/**
-	 * Creates a new ResourceSet for the given persistence type
-	 * 
-	 * @param type
-	 * @return
-	 */
-	public ILibraryResourceSet createResourceSet(String type) {
-		ILibraryResourceSetFactory factory = getFactory(type);
-		if(factory != null) {
-			return factory.createLibraryResourceSet();
-		}
-		else {
-			throw new IllegalArgumentException("Unknown type: " + type); //$NON-NLS-1$
-		}
-	}
-
-	private static class FactoryDef {
-		Bundle bundle;
-
-		String type;
-
-		String className;
-		
-		int version;
-		
-		ILibraryResourceSetFactory instance;
-
-		/**
-		 * @param bundle
-		 * @param type
-		 * @param className
-		 * @param instance
-		 */
-		private FactoryDef(Bundle bundle, String type, String className, int version) {
-			super();
-			this.bundle = bundle;
-			this.type = type;
-			this.className = className;
-			this.version = version;
-		}
-				
-	}
-	
-	public static final ILibraryResourceSetFactory getFactory(String persistenceType) {
-		if (typeToFactoryDefMap == null) {
-			typeToFactoryDefMap = new HashMap<String, FactoryDef>();
-			// Process the "org.eclipse.epf.library.persistence.migrators"
-			// extension point
-			// contributors.
-			IExtensionRegistry extensionRegistry = Platform
-					.getExtensionRegistry();
-			IExtensionPoint extensionPoint = extensionRegistry
-					.getExtensionPoint(
-							"org.eclipse.epf.library.persistence", "resourceSetFactories"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (extensionPoint != null) {
-				IExtension[] extensions = extensionPoint.getExtensions();
-				for (int i = 0; i < extensions.length; i++) {
-					IExtension extension = extensions[i];
-					String pluginId = extension.getNamespaceIdentifier();
-					Bundle bundle = Platform.getBundle(pluginId);
-					IConfigurationElement[] configElements = extension
-							.getConfigurationElements();
-					for (int j = 0; j < configElements.length; j++) {
-						IConfigurationElement configElement = configElements[j];
-						try {
-							String className = configElement
-									.getAttribute("class"); //$NON-NLS-1$
-							String type = configElement
-									.getAttribute("type"); //$NON-NLS-1$
-							if (className != null
-									&& className.trim().length() > 0
-									&& type != null
-									&& type.trim().length() > 0) {
-								int version = Services.parseVersion(configElement.getAttribute("version")); //$NON-NLS-1$
-								FactoryDef factoryDef = typeToFactoryDefMap.get(type);								
-								if(factoryDef == null || factoryDef.version < version) {
-									typeToFactoryDefMap.put(type, new FactoryDef(bundle,
-											type, className, version));									
-								}
-							}
-						} catch (Exception e) {
-							CommonPlugin.INSTANCE.log(e);
-						}
-					}
-				}
-			}
-		}
-		FactoryDef factory = (FactoryDef) typeToFactoryDefMap.get(persistenceType);
-		if (factory != null) {
-			if (factory.instance == null) {
-				try {
-					ILibraryResourceSetFactory resourceSetFactory = (ILibraryResourceSetFactory) factory.bundle.loadClass(
-							factory.className).newInstance();
-					if(persistenceType.equals(resourceSetFactory.getPersistenceType())) {
-						factory.instance = resourceSetFactory;
-					}
-					else {
-						PersistencePlugin.getDefault().getLogger().logError(factory.className +
-								" is registered with the wrong persistence type '" + persistenceType + //$NON-NLS-1$
-								"'. The correct type must be '" + resourceSetFactory.getPersistenceType() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				} catch (Exception e) {
-					PersistencePlugin.getDefault().getLogger().logError(e);
-					if(DEBUG) {
-						e.printStackTrace();
-					}
-				}
-			}
-			return factory.instance;
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/internal/AccessController.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/internal/AccessController.java
deleted file mode 100644
index b0b238d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/internal/AccessController.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.services.IAccessController;
-
-/**
- * @author Phong Nguyen Le - Oct 9, 2006
- * @since  1.0
- */
-public class AccessController implements IAccessController {
-
-	public AccessController() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IAccessController#checkModify(java.util.Collection, java.lang.Object)
-	 */
-	public IStatus checkModify(Collection eObjects, Object context) {
-		if(eObjects.isEmpty()) {
-			return Status.OK_STATUS;
-		}
-		ILibraryResourceSet resourceSet = null;
-		for (Iterator iter = eObjects.iterator(); iter.hasNext();) {
-			EObject o = (EObject) iter.next();
-			Resource resource = o.eResource();
-			if(resource != null && resource.getResourceSet() instanceof ILibraryResourceSet) {
-				resourceSet = (ILibraryResourceSet) resource.getResourceSet();
-				if(resourceSet != null) {
-					break;
-				}
-			}
-		}
-		if(resourceSet != null) {
-			return resourceSet.checkModify(eObjects, context);
-		}
-		return Status.OK_STATUS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IAccessController#checkModify(org.eclipse.emf.ecore.resource.Resource[], java.lang.Object)
-	 */
-	public IStatus checkModify(Resource[] resources, Object context) {
-		if(resources.length == 0) {
-			return Status.OK_STATUS;
-		}
-		ArrayList<String> paths = new ArrayList<String>();
-		for (int i = 0; i < resources.length; i++) {
-			Resource resource = resources[i];
-			String path = FileManager.toFileString(resource.getURI());
-			if(path != null) {
-				paths.add(path);
-			}
-		}
-		if(!paths.isEmpty()) {
-			String[] arr = new String[paths.size()];
-			paths.toArray(arr);
-			return FileManager.getInstance().checkModify(arr, context);
-		}
-		return Status.OK_STATUS;	
-		
-//		MultiStatus multiStatus = new MultiStatus(PersistencePlugin.getDefault().getId(),
-//				IStatus.OK, PersistenceResources.modifyFilesError_msg,
-//				null);
-//
-//		HashMap<ILibraryResourceSet, Set<Resource>> resourceSetToResourcesMap = new HashMap<ILibraryResourceSet, Set<Resource>>();
-//		Set<Resource> resourcesWithoutLibraryResourceSet = null;
-//		for (int i = 0; i < resources.length; i++) {
-//			Resource resource = resources[i];
-//			if(resource.getResourceSet() instanceof ILibraryResourceSet) {
-//				Set set = resourceSetToResourcesMap.get(resource.getResourceSet());
-//				if(set == null) {
-//					set = new HashSet<Resource>();
-//					resourceSetToResourcesMap.put((ILibraryResourceSet) resource.getResourceSet(), set);
-//				}
-//				set.add(resource);				
-//			}
-//			else {
-//				if(resourcesWithoutLibraryResourceSet == null) {
-//					resourcesWithoutLibraryResourceSet = new HashSet<Resource>();
-//				}
-//				resourcesWithoutLibraryResourceSet.add(resource);
-//			}
-//		}
-//		if(!resourceSetToResourcesMap.isEmpty()) {
-//			for (Iterator iter = resourceSetToResourcesMap.entrySet().iterator(); iter
-//					.hasNext();) {
-//				Map.Entry<ILibraryResourceSet, Set<Resource>> entry = (Entry<ILibraryResourceSet, Set<Resource>>) iter.next();
-//				Resource[] arr = new Resource[entry.getValue().size()];
-//				entry.getValue().toArray(arr);
-//				entry.getKey().checkModify(arr, context);
-//			}
-//		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/internal/IFailSafeSavable.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/internal/IFailSafeSavable.java
deleted file mode 100644
index e971ca0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/internal/IFailSafeSavable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence.internal;
-
-/**
- * Interface a resource must implement to support fail-safe persistence
- * 
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public interface IFailSafeSavable {
-	void commit();
-	
-	boolean restore();
-	
-	void setTxID(String txID);
-	
-	boolean hasTempURI();
-	
-	void txFinished(boolean successful);
-	
-	void deleteBackup();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/synch/ISynchronizationHelper.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/synch/ISynchronizationHelper.java
deleted file mode 100644
index 2d6af13..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/synch/ISynchronizationHelper.java
+++ /dev/null
@@ -1,26 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence.synch;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.persistence.synch.internal.SynchronizationHelper;
-
-/**
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public interface ISynchronizationHelper {
-	public static final ISynchronizationHelper INSTANCE = new SynchronizationHelper();
-	
-	long getModificationStamp(Resource resource);
-	
-	boolean isSynchronized(Resource resource);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/synch/internal/SynchronizationHelper.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/synch/internal/SynchronizationHelper.java
deleted file mode 100644
index 47c605e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/synch/internal/SynchronizationHelper.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence.synch.internal;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.epf.library.persistence.synch.ISynchronizationHelper;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.IFileInfo;
-import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
-
-/**
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public class SynchronizationHelper implements ISynchronizationHelper {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.synch.ISynchronizationHelper#getModificationStamp(org.eclipse.emf.ecore.resource.Resource)
-	 */
-	public long getModificationStamp(Resource resource) {
-		if(resource instanceof MultiFileXMIResourceImpl) {
-			IFileInfo info = FileManager.getInstance().getFileInfo(resource);
-			return info != null ? info.getModificationStamp() : IResource.NULL_STAMP;
-		}
-		return IResource.NULL_STAMP;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.synch.ISynchronizationHelper#isSynchronized(org.eclipse.emf.ecore.resource.Resource)
-	 */
-	public boolean isSynchronized(Resource resource) {
-		if(resource instanceof MultiFileXMIResourceImpl) {
-			return ((MultiFileXMIResourceImpl)resource).isSynchronized();
-		}
-		IFile file = WorkspaceSynchronizer.getFile(resource);
-		if(file != null) {
-			return file.isSynchronized(IResource.DEPTH_ZERO);
-		}
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/util/ExtendedResourceSet.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/util/ExtendedResourceSet.java
deleted file mode 100644
index d3194b8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/library/persistence/util/ExtendedResourceSet.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.persistence.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-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.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.epf.common.CommonPlugin;
-import org.eclipse.epf.persistence.UnnormalizedURIException;
-
-/**
- * A extended resource set whose objects can references objects of other resource set
- * 
- * @author Phong Nguyen Le - Aug 9, 2006
- * @since  1.0
- */
-public class ExtendedResourceSet extends ResourceSetImpl {
-	public static final int URI_TYPE_UNKNOWN = 0;
-	public static final int URI_TYPE_LOCAL = 1;
-	public static final int URI_TYPE_EXTERNAL = 2;
-	
-	protected List<ResourceSet> referencedResourceSets = new ArrayList<ResourceSet>();
-
-	
-	/**
-	 * Gets the type of the given URI.
-	 * 
-	 * @param uri
-	 * @return one of URI type constants: {@link #URI_TYPE_EXTERNAL}, {@link #URI_TYPE_LOCAL}, {@link #URI_TYPE_UNKNOWN}
-	 */
-	protected int getURIType(URI uri) {
-		return URI_TYPE_UNKNOWN;
-	}
-	
-	public boolean add(ResourceSet referencedResourceSet) {
-		if(!referencedResourceSets.contains(referencedResourceSet)) {
-			return referencedResourceSets.add(referencedResourceSet);
-		}
-		return false;
-	}
-	
-	@Override
-	public EObject getEObject(URI uri, boolean loadOnDemand) {
-		EObject object = null;
-		UnnormalizedURIException ex = null;
-		int uriType = getURIType(uri);
-		if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_LOCAL) {
-			try {
-				object = super.getEObject(uri, loadOnDemand);
-			} catch (UnnormalizedURIException e) {
-				ex = e;
-			}
-			if(object != null) {
-				return object;
-			}
-		}
-		if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_EXTERNAL) {
-			for (Iterator iter = referencedResourceSets.iterator(); iter.hasNext();) {
-				ResourceSet resourceSet = (ResourceSet) iter.next();
-				try {
-					object = resourceSet.getEObject(uri, loadOnDemand);
-					if(object != null) {
-						return object;
-					}
-				} catch (UnnormalizedURIException e) {
-					ex = e;
-				}
-			}
-		} 
-		
-		if(ex != null) {
-			throw ex;
-		}
-		return object;
-	}	
-	
-	public void dispose() {
-		for (Iterator iter = getResources().iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			try{
-				resource.unload();			
-			}
-			catch(Exception e) {
-				CommonPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		referencedResourceSets.clear();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/DelegateFileManager.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/DelegateFileManager.java
deleted file mode 100644
index 57abbd2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/DelegateFileManager.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.epf.services.IFileManager;
-
-/**
- * @author Phong Nguyen Le - Oct 10, 2006
- * @since  1.0
- */
-public class DelegateFileManager implements IFileManager {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileManager#checkModify(java.lang.String, java.lang.Object)
-	 */
-	public IStatus checkModify(String path, Object context) {
-		return FileManager.getInstance().checkModify(path, context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileManager#checkModify(java.lang.String[], java.lang.Object)
-	 */
-	public IStatus checkModify(String[] paths, Object context) {
-		return FileManager.getInstance().checkModify(paths, context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileManager#delete(java.lang.String)
-	 */
-	public boolean delete(String path) {
-		return FileManager.getInstance().delete(path);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileManager#move(java.lang.String, java.lang.String)
-	 */
-	public boolean move(String oldPath, String newPath) {
-		return FileManager.getInstance().move(oldPath, newPath);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileManager#rename(java.io.File, java.io.File)
-	 */
-	public boolean rename(File oldFile, File newFile) {
-		return FileManager.getInstance().rename(oldFile, newFile);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/ExtendedResourceSet.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/ExtendedResourceSet.java
deleted file mode 100644
index 99761c7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/ExtendedResourceSet.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * A extended resource set whose objects can references objects of other resource set
- * 
- * @author Phong Nguyen Le - Aug 9, 2006
- * @since  1.0
- */
-public class ExtendedResourceSet extends MultiFileResourceSetImpl {
-	public static final int URI_TYPE_UNKNOWN = 0;
-	public static final int URI_TYPE_LOCAL = 1;
-	public static final int URI_TYPE_EXTERNAL = 2;
-	
-	protected MultiFileResourceSetImpl referencedResourceSet;
-
-	/**
-	 * Creates an {@link ExtendedResourceSet} that can have reference to objects in the given resource set 
-	 */
-	public ExtendedResourceSet(MultiFileResourceSetImpl referencedResourceSet) {
-		super();
-		this.referencedResourceSet = referencedResourceSet;
-	}
-	
-	/**
-	 * Gets the type of the given URI.
-	 * 
-	 * @param uri
-	 * @return one of URI type constants: {@link #URI_TYPE_EXTERNAL}, {@link #URI_TYPE_LOCAL}, {@link #URI_TYPE_UNKNOWN}
-	 */
-	protected int getURIType(URI uri) {
-		return URI_TYPE_UNKNOWN;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.persistence.MultiFileResourceSetImpl#getEObject(org.eclipse.emf.ecore.EObject, org.eclipse.emf.common.util.URI, boolean)
-	 */
-	public EObject getEObject(EObject resolver, URI uri, boolean loadOnDemand) {
-		EObject object = null;
-		UnnormalizedURIException ex = null;
-		int uriType = getURIType(uri);
-		if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_LOCAL) {
-			try {
-				object = super.getEObject(resolver, uri, loadOnDemand);
-			} catch (UnnormalizedURIException e) {
-				ex = e;
-			}
-			if(object != null) {
-				return object;
-			}
-		}
-		if(uriType == URI_TYPE_UNKNOWN || uriType == URI_TYPE_EXTERNAL) {
-			try {
-				object = referencedResourceSet.getEObject(resolver, uri,
-						loadOnDemand);
-			} catch (UnnormalizedURIException e) {
-				ex = e;
-			}
-		} 
-		
-		if(ex != null) {
-			throw ex;
-		}
-		return object;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FailSafePersistenceHelper.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FailSafePersistenceHelper.java
deleted file mode 100644
index 5b1761c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FailSafePersistenceHelper.java
+++ /dev/null
@@ -1,260 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author Phong Nguyen Le
- *
- * @since 1.2
- */
-public class FailSafePersistenceHelper {
-	private URI finalURI;
-	private URI oldURI;
-	private String currentTxID;
-	private Resource resource;
-	private URI tempURI;
-	private String id;
-	private String backupFile;
-	private URIConverter converter;
-	private boolean commitEmptyResource;
-	
-	public FailSafePersistenceHelper(Resource resource, String id) {
-		this.resource = resource; 
-		this.id = id;
-		this.converter = resource.getResourceSet() != null ? resource.getResourceSet().getURIConverter() : null;
-	}
-	
-	public void setCommitEmptyResource(boolean commitEmptyResource) {
-		this.commitEmptyResource = commitEmptyResource;
-	}
-
-	/**
-	 * Sets the temporary URI to save this resource to and it will be renamed to
-	 * the original URI when saving is done
-	 */
-	public URI setTempURI(String txID) {
-		if (finalURI == null) {
-			finalURI = oldURI = resource.getURI();
-			currentTxID = txID;
-
-			tempURI = createTempURI();
-			resource.setURI(tempURI);
-		}
-		return tempURI;
-	}
-	
-	private URI createTempURI() {
-		return URI.createFileURI(new StringBuffer(MultiFileXMIResourceImpl.getTempDir()).append(
-				File.separator).append(currentTxID)
-				.append("new").append(id).toString()); //$NON-NLS-1$
-	}
-	
-	public String getBackupFilePath() {
-		String backupFile = new StringBuffer(MultiFileXMIResourceImpl.getTempDir())
-				.append(File.separator)
-				.append(currentTxID)
-				.append("old").append(id).toString(); //$NON-NLS-1$
-		return backupFile;
-	}
-	
-	private String toFileString(URI uri) {
-		return FileManager.toFileString(uri, converter);
-	}
-	
-	public void commit() {
-		if (finalURI != null && (commitEmptyResource || !resource.getContents().isEmpty())) {
-			File finalFile = new File(toFileString(finalURI));
-			boolean wasMove = !oldURI.equals(finalURI);
-			if (wasMove) {
-			} else {
-				// back up the file
-				//
-				String backup = getBackupFilePath();
-				File bakFile = new File(backup);
-
-				// trying to delete the old backup file if it exists
-				//
-				if (bakFile.exists()) {
-					bakFile.delete();
-				}
-
-				if (finalFile.exists()) {
-					// some CM provider like ClearCase renamed the versioned
-					// file it its repository as soon as user renamed the file
-					// in the workspace. To avoid this, use only regular rename
-					// routine of java.io.File instead of IResource routine
-					//
-					if (FileUtil.moveFile(finalFile, bakFile)) {
-						backupFile = backup;
-					} else {
-						String msg = NLS.bind(
-								PersistenceResources.renameError_msg,
-								finalFile, backup);
-						throw new MultiFileIOException(msg);
-					}
-				}
-			}
-
-			// rename the resource file to the original name
-			//
-			File currentFile = new File(wasMove ? toFileString(oldURI)
-					: toFileString(resource.getURI()));
-			boolean success = false;
-			if (wasMove) {
-				success = MultiFileSaveUtil.move(resource, currentFile, finalFile);
-			} else {
-				// some CM provider like ClearCase renamed the versioned file it
-				// its repository as soon as user renamed the file
-				// in the workspace. To avoid this, use only regular rename
-				// routine of java.io.File instead of IResource routine
-				//
-				success = FileUtil.moveFile(currentFile, finalFile);
-			}
-			if (!success) {
-				String msg = NLS.bind(PersistenceResources.renameError_msg,
-						currentFile, finalFile);
-				throw new MultiFileIOException(msg);
-			} else {
-				if (wasMove) {
-					didMove();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Subclass to override to handle post move
-	 */
-	protected void didMove() {
-	}
-
-	public void deleteBackup() {
-		if (backupFile != null) {
-			try {
-				// FileManager.getInstance().delete(backupFile);
-				new File(backupFile).delete();
-				backupFile = null;
-			} catch (Throwable e) {
-				CommonPlugin.INSTANCE.log(e);
-				if (MultiFileSaveUtil.DEBUG) {
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-	
-	public boolean hasTempURI() {
-		if (currentTxID != null) {
-			return createTempURI().equals(resource.getURI());
-		}
-		return false;
-	}
-
-	public URI getFinalURI() {
-		if (finalURI != null) {
-			return finalURI;
-		}
-		return resource.getURI();
-	}
-
-	public boolean restore() {
-		File src = null, dest = null;
-		boolean moved = false;
-		if (backupFile != null) {
-			src = new File(backupFile);
-			dest = new File(toFileString(getFinalURI()));
-		} else {
-			moved = oldURI != null && !oldURI.equals(finalURI);
-			if (moved) {
-				File file = new File(toFileString(getFinalURI()));
-				dest = new File(toFileString(oldURI));
-				moved = file.exists() && !dest.exists();
-				if (moved) {
-					src = file;
-				}
-			}
-		}
-		if (src != null) {
-			if (dest.exists()) {
-				FileUtil.moveFile(dest,new File(toFileString(resource.getURI())));
-			}
-			boolean success;
-			if (moved) {
-				success = MultiFileSaveUtil.move(resource, src, dest);
-				// if(success) {
-				// MultiFileSaveUtil.updateURIMappings(this, null);
-				// }
-			} else {
-				success = FileUtil.moveFile(src,dest);
-			}
-			if (!success) {
-				throw new MultiFileIOException(NLS.bind(
-						PersistenceResources.restoreResourceError_msg, this));
-			}
-			return true;
-		}
-		return false;
-	}
-
-	public void txFinished(boolean successful) {
-//		boolean wasMove = !oldURI.equals(finalURI);
-		if (successful) {
-			resource.setURI(finalURI);
-			resource.setModified(false);
-//			updateTimeStamps();
-//			FileManager.getInstance().refresh(this);
-//			if(!wasMove) {
-//				MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) getResourceSet();
-//				if(resourceSet != null) {
-//					resourceSet.getUnresolvedProxyMarkerManager().validateMarkers(this);
-//				}
-//			}
-		} else {
-			restoreURI();
-//			if (wasMove) {
-//				// restore uri of ResourceDescriptor of this resource
-//				//
-//				MultiFileSaveUtil.updateURIMappings(this, oldURI, null, true);
-//			}
-		}
-//		if (oldURI != null) {
-//			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) getResourceSet();
-//			if (resourceSet != null) {
-//				resourceSet.getURIToTempURIMap().remove(oldURI);
-//			}
-//			oldURI = null;
-//		}
-		currentTxID = null;
-		finalURI = null;
-	}
-
-	/**
-	 * Restores the resource URI to the original one. This method must be call
-	 * after saving regarless of its success.
-	 * 
-	 */
-	private void restoreURI() {
-		if (oldURI != null) {
-			resource.setURI(oldURI);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FileManager.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FileManager.java
deleted file mode 100644
index b8651c8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FileManager.java
+++ /dev/null
@@ -1,525 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.security.AccessController;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.internal.resources.ResourceException;
-import org.eclipse.core.internal.resources.ResourceStatus;
-import org.eclipse.core.internal.utils.Messages;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.services.IFileManager;
-import org.eclipse.osgi.util.NLS;
-
-import sun.security.action.GetPropertyAction;
-
-/**
- * Implementation class for IFileManager.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class FileManager implements IFileManager {
-
-	public static final String PLUGIN_ID = FileManager.class.getPackage()
-			.getName();
-
-	private static FileManager instance = null;
-
-	private static String tmpdir;
-
-	public static String getTempDir() {
-		if (tmpdir == null) {
-			GetPropertyAction a = new GetPropertyAction("java.io.tmpdir"); //$NON-NLS-1$
-			tmpdir = ((String) AccessController.doPrivileged(a));
-		}
-		return tmpdir;
-	}
-
-	private boolean validateEditInitialized = false;
-
-	public static final FileManager getInstance() {
-		if (instance == null) {
-			synchronized (FileManager.class) {
-				if (instance == null) {
-					instance = new FileManager();
-				}
-			}
-		}
-
-		return instance;
-	}
-
-	protected FileManager() {
-	}
-
-	public static IResource getResourceForLocation(String location) {
-		File file = new File(location);
-		if (!file.exists()) {
-			return null;
-		}
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IPath path = new Path(location);
-		IResource resource;
-		if (file.isFile()) {
-			resource = workspaceRoot.getFileForLocation(path);
-			if (resource == null) {
-				IResource parentResource = getResourceForLocation(file
-						.getParent());
-				if (parentResource != null) {
-					try {
-						parentResource.refreshLocal(IResource.DEPTH_ONE, null);
-					} catch (CoreException e) {
-//						CommonPlugin.INSTANCE.log(e);
-					}
-					resource = workspaceRoot.getFileForLocation(path);
-				}
-			}
-		} else {
-			resource = workspaceRoot.getContainerForLocation(path);
-		}
-		return resource;
-	}
-
-	public static boolean refresh(IResource resource) throws CoreException {
-		if (!resource.exists()) {
-			ArrayList foldersToRefresh = new ArrayList();
-			IContainer container;
-			for (container = resource.getParent(); !container.exists(); container = container
-					.getParent()) {
-				foldersToRefresh.add(0, container);
-			}
-			if (container.exists()) {
-				container.refreshLocal(IResource.DEPTH_ONE, null);
-			}
-			if (!foldersToRefresh.isEmpty()) {
-				for (Iterator iter = foldersToRefresh.iterator(); iter
-						.hasNext();) {
-					IFolder folder = (IFolder) iter.next();
-					if (folder.exists()) {
-						folder.refreshLocal(IResource.DEPTH_ONE, null);
-					} else {
-						return false;
-					}
-				}
-			}
-		}
-		resource.refreshLocal(IResource.DEPTH_ONE, null);
-		return true;
-	}
-
-	/**
-	 * Refreshes file or directory with given local file system
-	 * <code>path</code>
-	 * 
-	 * @param path
-	 *            local file system path
-	 * @return
-	 * @throws CoreException
-	 */
-	private static boolean refresh(String path) throws CoreException {
-		IResource resource = getResourceForLocation(path);
-		if (resource != null) {
-			return refresh(resource);
-		}
-		return false;
-	}
-
-	public boolean refresh(Resource resource) {
-		try {
-			return refresh(resource.getURI().toFileString());
-		} catch (CoreException e) {
-//			CommonPlugin.INSTANCE.log(e);
-			return false;
-		}
-	}
-
-	public boolean move(String oldPath, String newPath) {
-		return move(oldPath, newPath, false);
-	}
-
-	public boolean move(String oldPath, String newPath,
-			boolean forceRemoveSource) {
-		try {
-			refresh(oldPath);
-
-			IResource resource = null;
-			IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace()
-					.getRoot();
-
-			// create the folders of the destination if they did not exist
-			IPath destPath = new Path(newPath);
-			if (new File(oldPath).isFile()) {
-				resource = workspaceRoot.getFileForLocation(destPath);
-				if(resource == null) {
-					resource = workspaceRoot.getContainerForLocation(destPath);
-				}
-			} else {				
-				resource = workspaceRoot.getContainerForLocation(destPath);
-				if(resource == null) {
-					resource = workspaceRoot.getFileForLocation(destPath);
-				}
-			}	
-			if(resource != null) {
-				if (resource.exists()) {
-					resource.refreshLocal(IResource.DEPTH_ZERO, null);
-					if(resource.exists()) {
-						throw new MultiFileIOException(NLS.bind(
-								PersistenceResources.moveError_msg, oldPath, newPath));
-					}
-				}
-				ArrayList foldersToCreate = new ArrayList();
-				IContainer container;
-				for (container = resource.getParent(); !container.exists(); container = container
-				.getParent()) {
-					foldersToCreate.add(0, container);
-				}
-				if (!foldersToCreate.isEmpty()) {
-					container.refreshLocal(IResource.DEPTH_ONE, null);
-					for (Iterator iter = foldersToCreate.iterator(); iter.hasNext();) {
-						IFolder folder = (IFolder) iter.next();
-						if (!folder.exists()) {
-							folder.create(true, true, null);
-						} else {
-							folder.refreshLocal(IResource.DEPTH_ONE, null);
-						}
-					}
-				}
-				destPath = resource.getFullPath();
-			}
-			else if(Platform.getLocation().isPrefixOf(destPath)) {
-				destPath = new Path(destPath.toOSString().substring(Platform.getLocation().toOSString().length()));						
-			}
-			
-			IPath path = new Path(oldPath);
-			IFile file = workspaceRoot.getFileForLocation(path);
-			if (file != null && file.exists()) {
-				resource = file;
-			} else {
-				resource = workspaceRoot.getContainerForLocation(path);
-			}
-			if (resource != null) {
-				try {
-					resource.move(destPath, true, null);
-				} catch (ResourceException e) {
-					PersistencePlugin.getDefault().getLog().log(e.getStatus());
-					
-					if (forceRemoveSource) {
-						throw e;
-					}
-
-					boolean failed = false;
-
-					// handle situation when Eclipse moves file/directory by
-					// copying it to destination then deleting the source
-					// but deletion failed
-					IStatus[] statuses = e.getStatus().getChildren();
-					for (int i = 0; i < statuses.length; i++) {
-						IStatus status = statuses[i];
-						if (status.getCode() == IResourceStatus.FAILED_DELETE_LOCAL
-								&& status.getMessage() == Messages.localstore_deleteProblem) {
-							String msg = MessageFormat
-									.format(
-											"Warning while moving ''{0}'' to ''{1}'': {2}", new Object[] { oldPath, newPath, status.getMessage() }); //$NON-NLS-1$
-							PersistencePlugin.getDefault().getLogger().logWarning(msg);
-						} else {
-							failed = true;
-						}
-					}
-					if (failed || !new File(newPath).exists()) {
-						return false;
-					}
-				}
-				return true;
-			}
-		} catch (CoreException e) {
-			PersistencePlugin.getDefault().getLogger().logError(e);
-			if (MultiFileSaveUtil.DEBUG) {
-				e.printStackTrace();
-			}
-		}
-		return false;
-	}
-
-	public boolean rename(File oldFile, File newFile) {
-		return move(oldFile.getAbsolutePath(), newFile.getAbsolutePath());
-	}
-
-	public void deleteResource(String path, IProgressMonitor monitor)
-			throws CoreException {
-		// no need to refresh the whole tree from specified path
-		// getResourceForLocation() refreshes resource in a more efficient way
-		//
-		// IWorkspaceRoot workspaceRoot =
-		// ResourcesPlugin.getWorkspace().getRoot();
-		// try {
-		// workspaceRoot.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-		// } catch (CoreException e1) {
-		// e1.printStackTrace();
-		// }
-
-		IResource resource = getResourceForLocation(path);
-		if (resource != null) {
-			resource.delete(true, monitor);
-		}
-	}
-
-	public boolean delete(String path) {
-		try {
-			deleteResource(path, null);
-			return true;
-		} catch (CoreException e) {
-			CommonPlugin.INSTANCE.log(e);
-			if (MultiFileSaveUtil.DEBUG) {
-				e.printStackTrace();
-			}
-		}
-		return false;
-	}
-
-	private static boolean fromCC(IStatus status) {
-		String pluginId = status.getPlugin();
-		return pluginId != null
-				&& pluginId.toLowerCase().indexOf("clearcase") != -1; //$NON-NLS-1$
-	}
-
-	public IStatus checkModify(String[] paths, Object context) {
-		IStatus status = null;
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IFile[] files = new IFile[paths.length];
-		ArrayList<String> notFoundFiles = new ArrayList<String>();
-		for (int i = 0; i < paths.length; i++) {
-			String path = paths[i];
-			try {
-				refresh(path);
-			} catch (CoreException e) {
-				PersistencePlugin.getDefault().getLogger().logError(e);
-			}
-			IFile file = workspace.getRoot().getFileForLocation(new Path(path));
-			if (file == null) {
-				notFoundFiles.add(path);
-			} else {
-				files[i] = file;
-			}
-		}
-		if (!notFoundFiles.isEmpty()) {
-			return new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS
-					.bind(PersistenceResources.fileNotFoundError_msg,
-							notFoundFiles), null);
-		}
-
-		if (!validateEditInitialized) {
-			status = workspace.validateEdit(files, context);
-			validateEditInitialized = true;
-			if (status.isOK()) {
-				// double-check after initialization
-				//
-				status = workspace.validateEdit(files, context);
-			}
-		} else {
-			status = workspace.validateEdit(files, context);
-		}
-
-		if (status.isOK()) {
-			MultiStatus multiStatus = new MultiStatus(PLUGIN_ID,
-					IStatus.OK, PersistenceResources.modifyFilesError_msg,
-					null);
-
-			// some version control provider still returns OK status even though
-			// user cancelled the check out
-			// double-check here again to make sure the file is not read-only
-			//			
-			for (int i = 0; i < files.length; i++) {
-				IFile file = files[i];
-				try {
-					file.refreshLocal(IResource.DEPTH_ZERO, null);
-				} catch (CoreException e) {
-					CommonPlugin.INSTANCE.log(e);
-				}
-				if (file.isReadOnly()) {
-					String localPath = file.getLocation().toOSString();
-					String msg = MessageFormat.format(
-							PersistenceResources.FileManager_fileReadOnly,
-							new Object[] { localPath });
-					multiStatus.add(new ResourceStatus(IStatus.ERROR, 0, file
-							.getFullPath(), msg, null));
-				}
-			}
-			if(!multiStatus.isOK()) {
-				return multiStatus;
-			}
-		} else {
-			// hack for clearcase
-			if (fromCC(status)) {
-				String msg = PersistenceResources.modifyFilesError_msg;
-				MultiStatus multiStatus = new MultiStatus(PLUGIN_ID, status
-						.getCode(), msg, null);
-				multiStatus.add(status);
-				return multiStatus;
-			}
-		}
-
-		// convert workspace path to local file system path
-		if (status instanceof MultiStatus) {
-			MultiStatus ms = (MultiStatus) status;
-			for (int i = 0; i < ms.getChildren().length; i++) {
-				IStatus childStatus = ms.getChildren()[i];
-				ms.getChildren()[i] = toStatusWithLocalPath(childStatus);
-			}
-		}
-		else {
-			status = toStatusWithLocalPath(status);
-		}
-
-		return status;
-	}
-	
-	private static IStatus toStatusWithLocalPath(IStatus status) {
-		if (status instanceof IResourceStatus
-				&& status.getCode() == IResourceStatus.READ_ONLY_LOCAL) {
-			IResourceStatus resourceStatus = ((IResourceStatus) status);
-			IPath path = resourceStatus.getPath();
-			IFile file = ResourcesPlugin.getWorkspace().getRoot()
-					.getFile(path);
-			String localPath = file.getLocation().toOSString();
-			String msg = MessageFormat.format(
-					PersistenceResources.FileManager_fileReadOnly,
-					new Object[] { localPath }); 
-			return new ResourceStatus(status
-					.getSeverity(), status.getCode(),
-					resourceStatus.getPath(), msg, status
-							.getException());
-		}
-		return status;
-	}
-
-	/**
-	 * @see org.eclipse.epf.services.IFileManager#checkModify(java.lang.String,
-	 *      java.lang.Object)
-	 */
-	public IStatus checkModify(String path, Object context) {
-		return checkModify(new String[] { path }, context);
-	}
-
-	/**
-	 * Checks if the given path is team-private file or folder
-	 * 
-	 * @param path
-	 * @return
-	 */
-	public boolean isTeamPrivate(String path) {
-		IResource resource = getResourceForLocation(path);
-		return resource != null && resource.isTeamPrivateMember();
-	}
-
-    /**
-     * Finds the file corresponding to the specified URI, using a URI converter
-     * if necessary (and provided) to normalize it.
-     * 
-     * @param uri a URI
-     * @param converter an optional URI converter (may be <code>null</code>)
-     * 
-     * @return the file, if available in the workspace
-     */
-    public static IFile getFile(URI uri, URIConverter converter) {
-        IFile result = null;
-        
-        if ("platform".equals(uri.scheme()) && (uri.segmentCount() > 2)) { //$NON-NLS-1$
-            if ("resource".equals(uri.segment(0))) { //$NON-NLS-1$
-                IPath path = new Path(URI.decode(uri.path())).removeFirstSegments(1);
-                
-                result = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-            }
-        } else if (uri.isFile() && !uri.isRelative()) {
-            result = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(
-                new Path(uri.toFileString()));
-        } else {
-            // normalize, to see whether may we can resolve it this time
-            if (converter != null) {
-                URI normalized = converter.normalize(uri);
-                
-                if (!uri.equals(normalized)) {
-                    // recurse on the new URI
-                    result = getFile(normalized, converter);
-                }
-            }
-        }
-        
-        return result;
-    }
-
-	public static String toFileString(URI uri, URIConverter converter) {
-		if(uri.isFile()) {
-			return uri.toFileString();
-		}
-		IFile file = getFile(uri, converter);
-		return file != null ? file.getLocation().toOSString() : null;
-	}
-	
-	public static String toFileString(URI uri) {
-		return toFileString(uri, null);
-	}
-	
-	public static class FileInfo implements IFileInfo {
-		
-		private IFile file;
-
-		private FileInfo(IFile file) {
-			this.file = file;
-		}
-
-		public long getModificationStamp() {
-			return file.getModificationStamp();
-		}
-
-		public boolean isSynchronized() {
-			return file.isSynchronized(IResource.DEPTH_ZERO);
-		}
-
-		public File getFile() {
-			IPath loc = file.getLocation();
-			return loc != null ? file.getLocation().toFile() : null;
-		}
-		
-	}
-	
-	public IFileInfo getFileInfo(Resource resource) {
-		IFile file = WorkspaceSynchronizer.getFile(resource);
-		return file != null ? new FileInfo(file) : null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FilePathProvider.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FilePathProvider.java
deleted file mode 100644
index c14efde..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/FilePathProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * File-based URI provider
- * 
- * @author Phong Nguyen Le - Aug 8, 2006
- * @since  1.0
- */
-public class FilePathProvider implements IURIProvider {
-	protected FilePathProvider() {
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.persistence.IURIProvider#getURI(org.eclipse.emf.ecore.EObject)
-	 */
-	public URI getURI(EObject object) {
-		if(object instanceof MethodElement) {
-			return MultiFileSaveUtil.createFileURI((MethodElement) object);
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/IFileInfo.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/IFileInfo.java
deleted file mode 100644
index 4490610..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/IFileInfo.java
+++ /dev/null
@@ -1,25 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-
-/**
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public interface IFileInfo {
-	File getFile();
-	
-	long getModificationStamp();
-	
-	boolean isSynchronized();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/IURIProvider.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/IURIProvider.java
deleted file mode 100644
index 1fecf5a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/IURIProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * Interface to provide URI for an EObject.
- * 
- * @author Phong Nguyen Le - Aug 8, 2006
- * @since  1.0
- */
-public interface IURIProvider {
-	
-	/**
-	 * Gets the URI for the given object if this object has or should have a direct resource
-	 * 
-	 * @param object
-	 * @return the URI or null if the given object does/will not have a direct resource
-	 */
-	URI getURI(EObject object);
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MethodLibraryPersister.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MethodLibraryPersister.java
deleted file mode 100644
index e4e88e5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MethodLibraryPersister.java
+++ /dev/null
@@ -1,1136 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.library.persistence.internal.IFailSafeSavable;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * File-based implementation for IMethodLibraryPersister
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodLibraryPersister implements IFileBasedLibraryPersister {
-
-	private static class FolderInfo {
-
-		EClass eClazz;
-
-		boolean shared;
-
-		private String name;
-
-		/**
-		 * @param clazz
-		 * @param shared
-		 */
-		public FolderInfo(EClass clazz, boolean shared) {
-			super();
-			eClazz = clazz;
-			this.shared = shared;
-			this.name = lowerAndPluralize(clazz.getName());
-		}
-
-	}
-
-	public static final MethodLibraryPersister INSTANCE = new MethodLibraryPersister();
-
-	// need to expose this, jxi
-	public static final String RESOURCE_FOLDER = "resources"; //$NON-NLS-1$
-
-	private static final List folderInfos = new ArrayList();
-
-	static {
-		folderInfos.add(new FolderInfo(UmaPackage.eINSTANCE.getGuidance(),
-				false));
-		folderInfos.add(new FolderInfo(UmaPackage.eINSTANCE.getWorkProduct(),
-				true));
-		folderInfos
-				.add(new FolderInfo(UmaPackage.eINSTANCE.getActivity(), true));
-	}
-
-	protected List warnings;
-
-	public MethodLibraryPersister() {
-	}
-
-	/**
-	 * Returns the correct path (relative to the plugin) of the file of the
-	 * given content description or null if the given content does not be long
-	 * to any plugin.
-	 * 
-	 * @param content
-	 * @return
-	 */
-	public static String getCorrectPath(ContentDescription content) {
-		return getCorrectPath((DescribableElement) content.eContainer(),
-				content);
-	}
-
-	private static String getCorrectPath(DescribableElement e,
-			ContentDescription content) {
-		if (e == null)
-			return null;
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		if (plugin == null) {
-			return null;
-		}
-		Resource resource = plugin.eResource();
-		URI uri = MultiFileSaveUtil.getFinalURI(resource);
-		File pluginDir = new File(uri.toFileString()).getParentFile();
-		String folderPath = staticGetFolderPath(e.eClass());
-		String dir = new StringBuffer(pluginDir.getAbsolutePath()).append(
-				File.separator).append(folderPath).append(File.separator)
-				.toString();
-
-		return getNextAvailableFileName(dir, e, content);
-	}
-
-	/**
-	 * Gets next available file name for the given {@link MultiResourceEObject} in the given directory <code>dir</code>
-	 * 
-	 * @param dir the directory path that must have a file separator at the end
-	 * @param requestedName
-	 * @param e
-	 * @return
-	 */
-	public static String getNextAvailableFileName(String dir, String requestedName,
-			MultiResourceEObject e) {
-		String currentFilename = null;
-		File currentFile = null;
-		MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) e
-				.eDirectResource();
-		if (resource != null) {
-			// keep existing file name during move if it is not taken yet. Don't
-			// try to match the element's name
-			//
-			String path = ((MultiFileXMIResourceImpl) e.eResource())
-					.getFinalURI().toFileString();
-			currentFile = new File(path);
-			currentFilename = currentFile.getName();
-			File file = new File(dir, currentFilename);
-			if (!file.exists()) {
-				// the element is being moved
-				//
-				return file.getAbsolutePath();
-			}
-		}
-
-		// element without a resource or path is already taken
-		//
-		String path = new StringBuffer(dir).append(requestedName).append(
-				MultiFileSaveUtil.DEFAULT_FILE_EXTENSION).toString();
-		File file = new File(path);
-		if(file.equals(currentFile)) {
-			return path;
-		}
-		if ((currentFilename != null && currentFilename.equals(requestedName))
-				|| file.exists()) {
-			for (int i = 2; true; i++) {
-				path = new StringBuffer(dir).append(requestedName).append(' ')
-						.append(i).append(
-								MultiFileSaveUtil.DEFAULT_FILE_EXTENSION)
-						.toString();
-				if (!new File(path).exists()) {
-					return path;
-				}
-			}
-		} else {
-			return path;
-		}
-	}
-
-	static String getNextAvailableFileName(String dir,
-			ContentDescription content) {
-		return getNextAvailableFileName(dir, (DescribableElement) content
-				.eContainer(), content);
-	}
-
-	private static String getNextAvailableFileName(String dir,
-			DescribableElement e, ContentDescription content) {
-		return getNextAvailableFileName(dir, e.getName(),
-				(MultiResourceEObject) content);
-	}
-
-	private static String staticGetFolderPath(EClass eClazz) {
-		int size = folderInfos.size();
-		FolderInfo info = null;
-		for (int i = 0; i < size; i++) {
-			FolderInfo folderInfo = (FolderInfo) folderInfos.get(i);
-			if (folderInfo.eClazz.isSuperTypeOf(eClazz)) {
-				info = folderInfo;
-			}
-		}
-		if (info != null) {
-			if (info.eClazz == eClazz || info.shared) {
-				return info.name;
-			} else {
-				return new StringBuffer(info.name).append(File.separatorChar)
-						.append(lowerAndPluralize(eClazz.getName())).toString();
-			}
-		} else {
-			return lowerAndPluralize(eClazz.getName());
-		}
-	}
-
-	public static String lowerAndPluralize(String name) {
-		name = name.toLowerCase();
-		if (name.endsWith("children")) { //$NON-NLS-1$
-			return name;
-		} else if (name.endsWith("child")) { //$NON-NLS-1$
-			return name + "ren"; //$NON-NLS-1$
-		} else if (name.endsWith("data")) { //$NON-NLS-1$
-			return name;
-		} else if (name.endsWith("datum")) { //$NON-NLS-1$
-			return name.substring(0, name.length() - 2) + "a"; //$NON-NLS-1$
-		} else if (name.endsWith("by")) { //$NON-NLS-1$
-			return name + "s"; //$NON-NLS-1$
-		} else if (name.endsWith("y")) { //$NON-NLS-1$
-			return name.substring(0, name.length() - 1) + "ies"; //$NON-NLS-1$
-		} else if (name.endsWith("ex")) { //$NON-NLS-1$
-			return name.substring(0, name.length() - 2) + "ices"; //$NON-NLS-1$
-		} else if (name.endsWith("x")) { //$NON-NLS-1$
-			return name + "es"; //$NON-NLS-1$
-		} else if (name.endsWith("us")) { //$NON-NLS-1$
-			return name.substring(0, name.length() - 2) + "i"; //$NON-NLS-1$
-		} else if (name.endsWith("ss")) { //$NON-NLS-1$
-			return name + "es"; //$NON-NLS-1$
-		} else if (name.endsWith("s")) { //$NON-NLS-1$
-			return name;
-		} else {
-			return name + "s"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the virtual path to the resource folder of the given MethodElement object.
-	 * 
-	 * @param e
-	 * @return
-	 * @see #getElementVirtualPath(MethodElement)
-	 */
-	public String geResourceVirtualPath(MethodElement e) {
-		String folderPath = getElementVirtualPath(e);
-		if (folderPath == null || folderPath.length() == 0)
-		{
-			return RESOURCE_FOLDER;
-		} else {
-			StringBuffer buffer = new StringBuffer(folderPath);
-			if ( !folderPath.endsWith(File.separator) ) {
-				buffer.append(File.separator);
-			} 
-			
-			buffer.append(RESOURCE_FOLDER);				
-			
-			return buffer.toString();
-		}
-	}
-
-	/**
-	 * Gets the virtual path to the folder of the given MethodElement object. This path will have the following format:
-	 * <plugin_name>\folder_relative_path\
-	 * 
-	 * @param e
-	 * @return
-	 */	
-	public String getElementVirtualPath(MethodElement e) {
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		if (plugin == null) {
-			if (!(e instanceof MethodConfiguration || e instanceof MethodLibrary)) {
-				// error: plugin element without a valid plugin set. This
-				// problem needs to be fixed.
-				// still see it from time to time,
-				// for example, when lick on a capability pattern in
-				// Configuration Explorer
-				System.err
-						.println("error in MethodLibraryPersister.getElementPath(): plugin element without a valid plugin. This problem needs to be fixed."); //$NON-NLS-1$
-			}
-			return ""; //$NON-NLS-1$
-		}
-		
-		String folderPath = getFolderRelativePath(e);
-		String pluginName = plugin.getName();
-		return (folderPath.length() == 0 ? pluginName + File.separator : new StringBuffer(
-				pluginName).append(File.separatorChar).append(folderPath)
-				.append(File.separatorChar).toString());
-	}
-	
-	/**
-	 * Gets the path relative to the library root directory to the
-	 * folder of the given MethodElement object.
-	 * 
-	 * @param e
-	 * @return
-	 */	
-	private String getRelativeElementPath(MethodElement e) {
-		String folderPath = getFolderRelativePath(e);
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		if (plugin == null) {
-			if ((e instanceof MethodConfiguration || e instanceof MethodLibrary)) {
-				return folderPath;
-			}
-			else {
-				// error: plugin element without a valid plugin set. This
-				// problem needs to be fixed.
-				// still see it from time to time,
-				// for example, when lick on a capability pattern in
-				// Configuration Explorer
-				System.err
-						.println("error in MethodLibraryPersister.getElementPath(): plugin element without a valid plugin. This problem needs to be fixed."); //$NON-NLS-1$
-				return ""; //$NON-NLS-1$
-			}
-		}
-
-		if (plugin.eContainer() == null) {
-			// error: plugin without library set. This problem needs to be
-			// fixed.
-			// still see it from time to time
-			System.err
-					.println("error in MethodLibraryPersister.getElementPath(): plugin without library set. This problem needs to be fixed."); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-
-		String relPluginPath;
-		if (plugin.eResource() != null) {
-			Resource libRes = UmaUtil.getMethodLibrary(plugin).eResource();
-			if (libRes == plugin.eResource()) {
-				// the plugin is not saved yet
-				relPluginPath = plugin.getName();
-			} else {
-				URI uri = MultiFileSaveUtil.getFinalURI(plugin.eResource());
-				URI libUri = MultiFileSaveUtil.getFinalURI(libRes);
-				URI relUri = uri.deresolve(libUri);
-				relPluginPath = relUri.trimSegments(1).toFileString();
-			}
-		} else {
-			// the library is not saved yet
-			relPluginPath = plugin.getName();
-		}
-
-		return (folderPath.length() == 0 ? relPluginPath + File.separator: new StringBuffer(
-				relPluginPath).append(File.separatorChar).append(folderPath)
-				.append(File.separatorChar).toString());
-	}
-
-	public static void main(String[] args) {
-		EClass eCls = UmaPackage.eINSTANCE.getTemplate();
-		System.out.println(eCls.getName());
-	}
-
-	/**
-	 * Adjusts the location of the given resource and save all the resources
-	 * that have been changed as the result of this adjustment
-	 * 
-	 * @param resource
-	 */
-	public void adjustLocation(Resource resource) {
-		Set modifiedResources = new HashSet();
-		MultiFileSaveUtil.adjustLocation(resource, modifiedResources);
-
-		// save the modified resources
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) resource
-				.getResourceSet();
-		for (Iterator iter = modifiedResources.iterator(); iter.hasNext();) {
-			try {
-				resourceSet.save((Resource) iter.next(), null);
-			} catch (Exception e) {
-				CommonPlugin.INSTANCE.log(e);
-			}
-		}
-	}
-
-	public void save(Resource resource) throws Exception {
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) resource
-				.getResourceSet();
-		resourceSet.save(resource, null);
-	}
-
-	protected void deleteFiles(MethodElement e, String path,
-			ResourceSet resourceSet) {
-		if (new File(path).isDirectory() && !e.eIsProxy()) {
-			for (Iterator iter = resourceSet.getResources().iterator(); iter
-					.hasNext();) {
-				Resource res = (Resource) iter.next();
-				MethodElement me = PersistenceUtil.getMethodElement(res);
-				if (me != null && UmaUtil.isContainedBy(me, e)) {
-					res.unload();
-					iter.remove();
-				}
-			}
-		}
-
-		try {
-			FileManager.getInstance().deleteResource(path, null);
-		} catch (CoreException ex) {
-			CommonPlugin.INSTANCE.log(ex);
-			throw new WrappedException(ex);
-		}
-	}
-
-	/**
-	 * Deletes the files associated with the given MethodElement
-	 * 
-	 * @param e
-	 */
-	protected void delete(MethodElement e, Set modifiedResources) {
-		if (!UmaUtil.hasDirectResource(e)) {
-			return;
-		}
-
-		MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) e
-				.eResource();
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) resource
-				.getResourceSet();
-
-		// Don't delete this resource's file if it still contains other
-		// MethodElement
-		for (Iterator iter = resource.getContents().iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof MethodElement && element != e) {
-				resourceSet.removeURIMappings(e, modifiedResources);
-				resource.getContents().remove(e);
-				modifiedResources.add(resource);
-				return;
-			}
-		}
-
-		String path;
-		if (MultiFileSaveUtil.hasOwnFolder(e)) {
-			// path is the directory of the MethodPlugin/ProcessComponent
-			//
-			path = new File(resource.getFinalURI().toFileString()).getParent();
-
-			// unload/remove all resources under the folder
-			//
-			Collection unloadedResources = new ArrayList();
-			do {
-				unloadedResources.clear();
-				// collect all resources whose root element is contained by the
-				// given element
-				//
-				for (Iterator iter = new ArrayList(resourceSet.getResources())
-						.iterator(); iter.hasNext();) {
-					Resource res = (Resource) iter.next();
-					if (res.isLoaded()) {
-						MethodElement me = PersistenceUtil
-								.getMethodElement(res);
-						if (me != null && UmaUtil.isContainedBy(me, e)) {
-							unloadedResources.add(res);
-						}
-					}
-				}
-				for (Iterator iter = unloadedResources.iterator(); iter
-						.hasNext();) {
-					Resource res = (Resource) iter.next();
-					res.unload();
-				}
-				resourceSet.getResources().removeAll(unloadedResources);
-			} while (!unloadedResources.isEmpty());
-		} else {
-			path = resource.getFinalURI().toFileString();
-		}
-
-		try {
-			resourceSet.cleanUp(resource, modifiedResources);
-		} catch (Exception e1) {
-			CommonPlugin.INSTANCE.log(e1);
-			if (MultiFileSaveUtil.DEBUG) {
-				e1.printStackTrace();
-			}
-		}
-
-		deleteFiles(e, path, resourceSet);
-	}
-
-	/**
-	 * @param e
-	 * @param objectsWithDirectResources
-	 */
-	private static void getObjectsWithDirectResources(EObject e,
-			Collection objectsWithDirectResources) {
-		if (UmaUtil.hasDirectResource(e)) {
-			objectsWithDirectResources.add(e);
-		} else {
-			for (Iterator iter = e.eContents().iterator(); iter.hasNext();) {
-				getObjectsWithDirectResources((EObject) iter.next(),
-						objectsWithDirectResources);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.services.IFileBasedLibraryPersister#delete(org.eclipse.epf.uma.MethodElement)
-	 */
-	public void delete(MethodElement e) {
-		// collect all elements with direct resources that are the given element
-		// or its offstring
-		ArrayList elements = new ArrayList();
-		getObjectsWithDirectResources(e, elements);
-		deleteAndSave(elements);
-	}
-
-	private void deleteAndSave(ArrayList elements) {
-		if (!elements.isEmpty()) {
-			Set modifiedResources = new HashSet();
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				delete((MethodElement) iter.next(), modifiedResources);
-			}
-
-			// save modified resources
-			//
-			for (Iterator iter = modifiedResources.iterator(); iter.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				try {
-					save(resource);
-				} catch (Exception ex) {
-					throw new WrappedException(ex);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Gets the relative path of the folder that can store the content of the
-	 * given MethodElement. The path is relative to its plugin folder or library
-	 * folder if the element cannot be stored in a plugin.
-	 */
-	private static String staticGetFolderRelativePath(MethodElement e) {
-		if (e instanceof MethodPlugin) {
-			return ""; //$NON-NLS-1$
-		} else if (e instanceof ContentElement) {
-			return staticGetFolderPath(e.eClass());
-		} else if (e instanceof MethodConfiguration) {
-			return MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME;
-		}
-
-		MethodUnit unit = UmaUtil.getMethodUnit(e);
-
-		if (unit instanceof ProcessComponent) {
-			Process proc = ((ProcessComponent) unit).getProcess();
-			if (proc instanceof CapabilityPattern) {
-				return MultiFileSaveUtil.CAPABILITY_PATTERN_PATH;
-			} else if (proc instanceof DeliveryProcess) {
-				return MultiFileSaveUtil.DELIVERY_PROCESS_PATH;
-			}
-		} else if (unit instanceof ContentDescription) {
-			return staticGetFolderRelativePath((MethodElement) unit
-					.eContainer());
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	public String getFolderRelativePath(MethodElement e) {
-		return staticGetFolderRelativePath(e);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#getWarnings()
-	 */
-	public List getWarnings() {
-		if (warnings == null) {
-			warnings = new ArrayList();
-		}
-		return warnings;
-	}
-
-	static class FailSafePersister extends MethodLibraryPersister implements
-			FailSafeMethodLibraryPersister {
-
-		private Map saveOptions;
-
-		private TxRecord txRecord = new TxRecord() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.epf.persistence.TxRecord#clear()
-			 */
-			public void clear() {
-				if (warnings != null && !warnings.isEmpty()) {
-					// copy the warning to persister
-					//
-					FailSafePersister.this.warnings = Collections
-							.unmodifiableList(warnings);
-				}
-				super.clear();
-			}
-		};
-
-		private Map elementToInfoMapToDeleteFiles;
-
-		public FailSafePersister() {
-			saveOptions = new HashMap(
-					MultiFileResourceSetImpl.DEFAULT_SAVE_OPTIONS);
-			txRecord = new TxRecord();
-			saveOptions.put(MultiFileXMISaveImpl.TX_RECORD, txRecord);
-			elementToInfoMapToDeleteFiles = new HashMap();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.epf.persistence.MethodLibraryPersister#getWarnings()
-		 */
-		public List getWarnings() {
-			if (txRecord.getTxID() == null) {
-				return super.getWarnings();
-			}
-			return txRecord.getWarnings();
-		}
-
-		public Map getSaveOptions() {
-			return saveOptions;
-		}
-
-		void checkMove(Resource resource) {
-			// disallow new operation on resource which has started operation
-			// that is not committed
-			MultiFileXMIResourceImpl mfResource = (MultiFileXMIResourceImpl) resource;
-			if (mfResource.txStarted()) {
-				throw new MultiFileIOException(NLS.bind(
-						PersistenceResources.moveResourceError_msg, resource));
-			}			
-		}				
-		
-		/**
-		 * @see org.eclipse.epf.uma.persistence.MethodLibraryPersister#save(org.eclipse.emf.ecore.resource.Resource)
-		 */
-		public void save(Resource resource) throws Exception {
-			if(resource.getResourceSet() instanceof MultiFileResourceSetImpl &&
-					resource instanceof MultiFileXMIResourceImpl) {
-				MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) resource
-				.getResourceSet();
-				if (resourceSet == null) {
-					return;
-				}
-
-				// update version info in library resource if needed
-				//
-				Resource libResourceToSave = null;
-				MethodElement me = PersistenceUtil.getMethodElement(resource);
-				if(me != null) {
-					MethodLibrary lib = UmaUtil.getMethodLibrary(me);
-					if(lib != null) {
-						Resource libResource = lib.eResource();
-						if(libResource != null 
-								&& libResource != resource
-								&& PersistenceUtil.checkToolVersion(libResource) != 0) {
-							libResourceToSave = libResource;
-						}
-					}
-				}
-
-				if (MultiFileXMISaveImpl.checkModifyRequired(saveOptions)) {
-					Collection<Resource> resources;
-					if(libResourceToSave != null) {
-						resources = new ArrayList<Resource>();
-						resources.add(resource);
-						resources.add(libResourceToSave);
-					}
-					else {
-						resources = Collections.singletonList(resource);
-					}
-					MultiFileSaveUtil.checkModify(resources);
-					
-					// check out-of-sync
-					//
-					MultiFileSaveUtil.checkOutOfSynch(resources, saveOptions);
-					
-					MultiFileSaveUtil.checkFilePathLength(resources);
-				}
-
-				resourceSet.save(resource, saveOptions);
-				if(libResourceToSave != null) {
-					resourceSet.save(libResourceToSave, saveOptions);
-				}
-			}
-			else if(resource instanceof IFailSafeSavable) {
-				IFailSafeSavable failSafeSavable = (IFailSafeSavable) resource;
-				failSafeSavable.setTxID(txRecord.getTxID());
-				resource.save(saveOptions);
-				txRecord.getResourcesToCommit().add(resource);
-			}
-			else {
-				throw new IllegalAccessException("Resource must implement org.eclipse.epf.library.persistence.internal.IFailSafeSavable"); //$NON-NLS-1$
-			}
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.persistence.MethodLibraryPersister#adjustLocation(org.eclipse.emf.ecore.resource.Resource)
-		 */
-		public void adjustLocation(Resource resource) {
-			checkMove(resource);
-			Set modifiedResources = new HashSet();
-			if (MultiFileSaveUtil.prepareAdjustLocation(
-					(MultiFileXMIResourceImpl) resource, modifiedResources)) {
-				txRecord.getResourcesToCommit().add(resource);
-				
-				HashSet resourcesToCheck = new HashSet(modifiedResources);
-				resourcesToCheck.addAll(resourcesToCheck);
-				MultiFileSaveUtil.checkModify(resourcesToCheck);
-				
-				if (!modifiedResources.isEmpty()) {		
-					
-					MultiFileSaveUtil.checkOutOfSynch(modifiedResources, saveOptions);
-
-					// save the modified resources
-					for (Iterator iter = modifiedResources.iterator(); iter
-							.hasNext();) {
-						try {
-							save((Resource) iter.next());
-						} catch (Exception e) {
-							PersistencePlugin.getDefault().getLogger().logError(e);
-							throw new MultiFileIOException(e.toString());
-						}
-					}
-				}
-			}
-			commit();
-		}
-
-		public void adjustLocation(Collection resources) {
-			if (resources == null || resources.isEmpty()) {
-				return;
-			}
-
-			for (Iterator iter = resources.iterator(); iter.hasNext();) {
-				checkMove((Resource) iter.next());
-			}
-
-			Set modifiedResources = new HashSet();
-			HashSet resourcesToCheck = new HashSet();
-			for (Iterator iter = resources.iterator(); iter.hasNext();) {
-				MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) iter
-						.next();
-				if (MultiFileSaveUtil.prepareAdjustLocation(
-						(MultiFileXMIResourceImpl) resource, modifiedResources)) {
-					txRecord.getResourcesToCommit().add(resource);
-					resourcesToCheck.add(resource);
-				}
-			}
-
-			resourcesToCheck.addAll(modifiedResources);
-			if(!resourcesToCheck.isEmpty()) {
-				MultiFileSaveUtil.checkModify(resourcesToCheck);
-			}			
-			if (!modifiedResources.isEmpty()) {
-				MultiFileSaveUtil.checkOutOfSynch(modifiedResources, saveOptions);
-
-				// save the modified resources
-				for (Iterator iter = modifiedResources.iterator(); iter
-						.hasNext();) {
-					try {
-						save((Resource) iter.next());
-					} catch (Exception e) {
-						CommonPlugin.INSTANCE.log(e);
-						throw new MultiFileIOException(e.toString());
-					}
-				}
-			}
-			commit();
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.persistence.MethodLibraryPersister#deleteFiles(org.eclipse.epf.uma.MethodElement,
-		 *      java.lang.String, org.eclipse.emf.ecore.resource.ResourceSet)
-		 */
-		protected void deleteFiles(MethodElement e, String path,
-				ResourceSet resourceSet) {
-			// keep the info to really delete the files in commit()
-			elementToInfoMapToDeleteFiles.put(e, new Object[] { path,
-					resourceSet });
-		}
-
-		private void superDeleteFiles(MethodElement e, String path,
-				ResourceSet resourceSet) {
-			super.deleteFiles(e, path, resourceSet);
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister#commit()
-		 */
-		public void commit() {
-			// save is done
-			// call saveIsDone() on every saved file to rename it to the correct
-			// name
-			int size = txRecord.getResourcesToCommit().size();
-			for (int i = 0; i < size; i++) {
-				((IFailSafeSavable) txRecord.getResourcesToCommit()
-						.get(i)).commit();
-			}
-
-			// notify all commited resources that the transaction is done
-			for (int i = 0; i < size; i++) {
-				((IFailSafeSavable) txRecord.getResourcesToCommit()
-						.get(i)).txFinished(true);
-			}
-
-			// delete backup
-			for (int i = 0; i < size; i++) {
-				((IFailSafeSavable) txRecord.getResourcesToCommit()
-						.get(i)).deleteBackup();
-			}
-
-			txRecord.clear();
-
-			// delete files of deleted elements
-			//
-			for (Iterator iter = elementToInfoMapToDeleteFiles.entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				Object[] info = (Object[]) entry.getValue();
-				String path = (String) info[0];
-				try {
-					superDeleteFiles((MethodElement) entry.getKey(), path,
-							(ResourceSet) info[1]);
-				} catch (Exception e) {
-					if (e instanceof WrappedException) {
-						e = ((WrappedException) e).exception();
-					}
-					String msg = PersistenceResources.ErrMsg_CouldNotDelete;
-					String otherMsg = null;
-					if (e instanceof CoreException) {
-						IStatus status = ((CoreException) e).getStatus();
-						if (status != null) {
-							otherMsg = UmaUtil.getMessage(status);
-						}
-					}
-					if (otherMsg == null) {
-						otherMsg = ""; //$NON-NLS-1$
-					}
-					msg = MessageFormat.format(msg, new Object[] { path,
-							otherMsg });
-					e = new Exception(msg, e);
-					getWarnings().add(e);
-					CommonPlugin.INSTANCE.log(e);
-					if (MultiFileSaveUtil.DEBUG) {
-						e.printStackTrace();
-					}
-				}
-			}
-			elementToInfoMapToDeleteFiles.clear();
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister#rollback()
-		 */
-		public void rollback() {
-			if (!txRecord.getResourcesToCommit().isEmpty()) {
-				try {
-					int max = txRecord.getResourcesToCommit().size() - 1;
-					ArrayList restoredResources = new ArrayList();
-
-					// Something went wrong, restore from backup
-					for (int i = max; i > -1; i--) {
-						IFailSafeSavable resource = (IFailSafeSavable) txRecord
-								.getResourcesToCommit().get(i);
-						if (resource.restore()) {
-							restoredResources.add(resource);
-						}
-					}
-
-					for (Iterator iter = restoredResources.iterator(); iter
-							.hasNext();) {
-						Resource resource = (Resource) iter
-								.next();
-						resource.setModified(true);
-					}
-
-					// delete temp files
-					for (int i = max; i > -1; i--) {
-						Resource resource = (Resource) txRecord
-								.getResourcesToCommit().get(i);
-						if (((IFailSafeSavable)resource).hasTempURI()) {
-							// uri keeps the path to temp file
-							try {
-								new File(resource.getURI().toFileString())
-										.delete();
-							} catch (Exception e) {
-								CommonPlugin.INSTANCE.log(e);
-								if (MultiFileSaveUtil.DEBUG) {
-									e.printStackTrace();
-								}
-							}
-						}
-					}
-
-					// notify all commited resources that the transaction is
-					// done
-					for (int i = max; i > -1; i--) {
-						((IFailSafeSavable) txRecord
-								.getResourcesToCommit().get(i))
-								.txFinished(false);
-					}
-
-				} catch (RuntimeException e) {
-					CommonPlugin.INSTANCE.log(e);
-					if (MultiFileSaveUtil.DEBUG) {
-						e.printStackTrace();
-					}
-					throw e;
-				}
-			}
-			txRecord.clear();
-		}
-
-		/**
-		 * @see org.eclipse.epf.services.IFileBasedLibraryPersister#getFailSafePersister()
-		 */
-		public FailSafeMethodLibraryPersister getFailSafePersister() {
-			return this;
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister#getCurrentTxID()
-		 */
-		public String getCurrentTxID() {
-			return txRecord.getTxID();
-		}
-
-	}
-
-	FailSafePersister getFailSafePersister(Map options) {
-		FailSafePersister persister = new FailSafePersister();
-		persister.saveOptions.putAll(options);
-
-		// make sure that TX_RECORD still keeps the correct value
-		persister.saveOptions.put(MultiFileXMISaveImpl.TX_RECORD,
-				persister.txRecord);
-
-		return persister;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#hasOwnFolder(java.lang.Object)
-	 */
-	public boolean hasOwnFolder(Object e) {
-		return MultiFileSaveUtil.hasOwnFolder(e);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#hasOwnResource(java.lang.Object)
-	 */
-	public boolean hasOwnResource(Object e) {
-		return MultiFileSaveUtil.hasOwnResource(e,
-				MultiFileResourceSetImpl.DEFAULT_SAVE_SEPARATELY_CLASS_SET);
-	}
-
-	/**
-	 * @see org.eclipse.epf.services.IFileBasedLibraryPersister#getFailSafePersister()
-	 */
-	public FailSafeMethodLibraryPersister getFailSafePersister() {
-		return new FailSafePersister();
-	}
-
-	public static class NonFailSafePersister extends MethodLibraryPersister
-			implements FailSafeMethodLibraryPersister {
-		private Map saveOptions = new HashMap();
-
-		/**
-		 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister#commit()
-		 */
-		public void commit() {
-			// do nothing
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister#rollback()
-		 */
-		public void rollback() {
-			// do nothing
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister#getCurrentTxID()
-		 */
-		public String getCurrentTxID() {
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister#adjustLocation(java.util.Collection)
-		 */
-		public void adjustLocation(Collection resources) {
-			for (Iterator iter = resources.iterator(); iter.hasNext();) {
-				adjustLocation((Resource) iter.next());
-			}
-		}
-
-		public Map getSaveOptions() {
-			return saveOptions;
-		}
-
-	}
-
-	private static final FailSafeMethodLibraryPersister nonFailSafePersister = new NonFailSafePersister();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#getFileExtension(java.lang.Object)
-	 */
-	public String getFileExtension(Object e) {
-		return MultiFileSaveUtil.DEFAULT_FILE_EXTENSION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#save(org.eclipse.epf.uma.MethodElement)
-	 */
-	public void save(MethodElement element) throws Exception {
-		if(!hasOwnResourceWithoutReferrer(element)) {
-			return;
-		}
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) UmaUtil.getMethodLibrary(element).eResource().getResourceSet();
-		Map options = resourceSet.getDefaultSaveOptions(); 
-		Resource res = ((InternalEObject)element).eDirectResource();
-		MultiFileXMIResourceImpl resource;
-		if(res instanceof MultiFileXMIResourceImpl) {
-			resource = (MultiFileXMIResourceImpl) res;
-			resourceSet.save(resource, options);
-		}
-		else {
-			URI uri = MultiFileSaveUtil.createURI(element, resourceSet);
-			resource = MultiFileSaveUtil.save(resourceSet, element, uri, options, false);
-		}
-		resource.updateTimeStamps();
-		
-		String str = (String) options.get(MultiFileXMISaveImpl.REFRESH_NEW_RESOURCE);
-		if (str != null && Boolean.valueOf(str).booleanValue()) {
-			// notify RefreshJob the this resource is saved so it will not be
-			// reloaded after refreshing it
-			//
-			RefreshJob.getInstance().resourceSaved(resource);
-
-			// refresh the newly created resource so it is in synch with the
-			// workspace
-			//
-			FileManager.getInstance().refresh(resource);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#hasOwnResourceWithoutReferrer(java.lang.Object)
-	 */
-	public boolean hasOwnResourceWithoutReferrer(Object e) {
-		return e instanceof MethodConfiguration;
-	}
-
-	public File createMethodPluginFolder(String pluginName, MethodLibrary library) {
-		File libDir = new File(library.eResource().getURI().toFileString()).getParentFile();
-		File pluginDir = new File(libDir, pluginName);
-		if(!pluginDir.exists()) {
-			if(!pluginDir.mkdirs()) {
-				throw new MultiFileIOException(NLS.bind(PersistenceResources.cannot_create_dir_msg, pluginDir));				
-			}
-		}
-		return pluginDir;
-	}
-
-	public File getDefaultMethodConfigurationFolder(MethodLibrary library) {
-		File libDir = new File(library.eResource().getURI().toFileString()).getParentFile();
-		File configDir = new File(libDir, MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME);
-		if(!configDir.exists()) {
-			if(!configDir.mkdirs()) {
-				throw new MultiFileIOException(NLS.bind(PersistenceResources.cannot_create_dir_msg, configDir));				
-			}
-		}
-		return configDir;
-	}
-
-	public void setDefaultMethodConfigurationFolder(MethodLibrary library, File file) {
-		// not allowed
-	}
-
-	public boolean isContainedBy(Resource resource, Resource containerResource) {
-		MethodElement e = PersistenceUtil.getMethodElement(containerResource);
-		if(hasOwnFolder(e)) {
-			String path = FileManager.toFileString(resource.getURI());
-			String containerPath = FileManager.toFileString(containerResource.getURI());		
-			if(path == null || containerPath == null) {
-				return false;
-			}
-			return new Path(containerPath).removeLastSegments(1).isPrefixOf(new Path(path));
-		}
-		return false;
-	}
-
-	public String getResourceFolderPath(MethodElement e) {
-		String folderPath = getFolderAbsolutePath(e);
-		return folderPath != null ? new File(folderPath, RESOURCE_FOLDER).getAbsolutePath() : RESOURCE_FOLDER;
-	}
-
-	public String getFolderAbsolutePath(MethodElement e) {
-		MethodLibrary library = UmaUtil.getMethodLibrary(e);
-		File libDir = new File(MultiFileSaveUtil.getFinalURI(library.eResource()).toFileString()).getParentFile();
-		return new File(libDir, getRelativeElementPath(e)).getAbsolutePath();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.services.ILibraryPersister#delete(java.util.Collection)
-	 */
-	public void delete(Collection<MethodElement> elems) {
-		ArrayList elements = new ArrayList();
-		for (Iterator<MethodElement> it = elems.iterator(); it.hasNext();) {
-			getObjectsWithDirectResources(it.next(), elements);
-		}
-		deleteAndSave(elements);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileIOException.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileIOException.java
deleted file mode 100644
index e3c2796..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileIOException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-/**
- * Base exception for file-based persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiFileIOException extends RuntimeException {
-
-	private static final long serialVersionUID = 3257853198722347321L;
-
-	private Object troubleObject;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MultiFileIOException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MultiFileIOException(String arg0) {
-		super(arg0);
-	}
-
-	public MultiFileIOException(String msg, Object troubleObj) {
-		super(msg);
-		troubleObject = troubleObj;
-	}
-
-	/**
-	 * @return Returns the troubleObject.
-	 */
-	public Object getTroubleObject() {
-		return troubleObject;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileResourceSetImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileResourceSetImpl.java
deleted file mode 100644
index 66dc74d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileResourceSetImpl.java
+++ /dev/null
@@ -1,2609 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMLInfoImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLMapImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.persistence.LibraryResourceException;
-import org.eclipse.epf.persistence.refresh.IRefreshEvent;
-import org.eclipse.epf.persistence.refresh.IRefreshListener;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.refresh.internal.RefreshEvent;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.persistence.util.UnresolvedProxyMarkerManager;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.IProxyResolutionListener;
-import org.eclipse.epf.uma.ecore.IUmaResourceSet;
-import org.eclipse.epf.uma.ecore.ResolveException;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.EventTypes;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.text.DateFormat;
-import com.ibm.icu.text.SimpleDateFormat;
-import com.ibm.icu.util.Calendar;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiFileResourceSetImpl extends ResourceSetImpl implements
-		IProxyResolutionListener, IUmaResourceSet, ILibraryResourceSet {
-
-	private static final String[] DEFAULT_DELIVERY_PROCESS_PATH = { "DeliveryProcesses" }; //$NON-NLS-1$
-
-	private static final String[] DEFAULT_CAPABILITY_PATTERN_PATH = {
-			"Content", "CapabilityPatterns" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	private static final String[] DEFAULT_PROCESS_CONTRIBUTION_PATH = { "ProcessContributions" }; //$NON-NLS-1$		
-
-	public static final String[][] PROCESS_PACKAGE_PATHS = {
-			DEFAULT_DELIVERY_PROCESS_PATH, DEFAULT_CAPABILITY_PATTERN_PATH,
-			DEFAULT_PROCESS_CONTRIBUTION_PATH };
-
-	public static boolean REPORT_ERROR = true;
-
-	static final Map DEFAULT_SAVE_OPTIONS = new HashMap();
-
-	static final Set DEFAULT_SAVE_SEPARATELY_CLASS_SET = new HashSet();
-
-	static {
-		DEFAULT_SAVE_SEPARATELY_CLASS_SET.add(UmaPackage.eINSTANCE
-				.getMethodPlugin());
-		DEFAULT_SAVE_SEPARATELY_CLASS_SET.add(UmaPackage.eINSTANCE
-				.getProcessComponent());
-		DEFAULT_SAVE_SEPARATELY_CLASS_SET.add(UmaPackage.eINSTANCE
-				.getContentDescription());
-		// eClasses.add(ResourcemanagerPackage.eINSTANCE.getResourceManager());
-		DEFAULT_SAVE_SEPARATELY_CLASS_SET.add(UmaPackage.eINSTANCE
-				.getMethodConfiguration());
-
-		XMLResource.XMLMap xmlMap = createSaveXMLMap();
-
-		HashSet saveTogether = new HashSet();
-		saveTogether.add(UmaPackage.eINSTANCE.getBreakdownElementDescription());
-
-		DEFAULT_SAVE_OPTIONS.put(
-				MultiFileXMISaveImpl.SAVE_SEPARATELY_CLASS_SET,
-				DEFAULT_SAVE_SEPARATELY_CLASS_SET);
-		DEFAULT_SAVE_OPTIONS.put(MultiFileXMISaveImpl.SAVE_ALL, "false"); //$NON-NLS-1$
-		DEFAULT_SAVE_OPTIONS.put(MultiFileXMISaveImpl.SAVE_TOGETHER_CLASS_SET,
-				saveTogether);
-		DEFAULT_SAVE_OPTIONS.put(MultiFileXMISaveImpl.REFRESH_NEW_RESOURCE,
-				"true"); //$NON-NLS-1$
-		DEFAULT_SAVE_OPTIONS.put(MultiFileXMISaveImpl.CHECK_MODIFY, "true"); //$NON-NLS-1$
-		DEFAULT_SAVE_OPTIONS.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-		DEFAULT_SAVE_OPTIONS.put(XMLResource.OPTION_PROCESS_DANGLING_HREF,
-				XMLResource.OPTION_PROCESS_DANGLING_HREF_DISCARD);
-		DEFAULT_SAVE_OPTIONS.put(XMLResource.OPTION_XML_MAP, xmlMap);
-		DEFAULT_SAVE_OPTIONS.put(XMLResource.OPTION_CONFIGURATION_CACHE, Boolean.TRUE);
-
-		AssociationHelper.init();
-	}
-
-	public static final String RESMGR_XMI = "resmgr.xmi"; //$NON-NLS-1$
-
-	private HashMap defaultSaveOptions;
-
-	private HashMap guidToMethodElementMap;
-
-	private boolean loading;
-
-	private boolean loadingResourceManagerTree;
-
-	private Map URIToTempURIMap;
-
-	private UnresolvedProxyMarkerManager markerMananger;
-
-	private UniqueEList<IRefreshListener> refreshListeners;
-
-	protected IURIProvider uriProvider;
-
-	private Path configFolderPath;
-
-	private Path libFolderPath;
-
-	private static XMLResource.XMLMap createLoadXMLMap() {
-		XMLResource.XMLMap xmlMap = new XMLMapImpl();
-		Set excludedAttributes = new HashSet();
-		excludedAttributes.add(UmaPackage.eINSTANCE.getMethodElement_Guid());
-		excludedAttributes.add(UmaPackage.eINSTANCE.getNamedElement_Name());
-
-		for (Iterator iter = UmaPackage.eINSTANCE.getEClassifiers().iterator(); iter
-				.hasNext();) {
-			EClassifier eClassifier = (EClassifier) iter.next();
-			if (eClassifier instanceof EClass) {
-				EClass eClass = (EClass) eClassifier;
-
-				for (Iterator iterator = eClass.getEAttributes().iterator(); iterator
-						.hasNext();) {
-					EAttribute attrib = (EAttribute) iterator.next();
-					if (!excludedAttributes.contains(attrib)) {
-						XMLResource.XMLInfo xmlInfo = new XMLInfoImpl();
-						xmlInfo.setName(attrib.getName());
-						xmlInfo
-								.setXMLRepresentation(XMLResource.XMLInfo.ELEMENT);
-						xmlMap.add(attrib, xmlInfo);
-					}
-				}
-			}
-		}
-
-		return xmlMap;
-	}
-
-	private static boolean saveAttributeAsElement(EClass eClass,
-			Collection selectedEClasses) {
-		for (Iterator iter = selectedEClasses.iterator(); iter.hasNext();) {
-			EClass base = (EClass) iter.next();
-			if (base.isSuperTypeOf(eClass)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private static XMLResource.XMLMap createSaveXMLMap() {
-		XMLResource.XMLMap xmlMap = new XMLMapImpl();
-		Set excludedAttributes = new HashSet();
-		excludedAttributes.add(UmaPackage.eINSTANCE.getMethodElement_Guid());
-		excludedAttributes.add(UmaPackage.eINSTANCE.getNamedElement_Name());
-
-		// select only ContentDescription and Section
-		Set selectedEClasses = new HashSet();
-		selectedEClasses.add(UmaPackage.eINSTANCE.getContentDescription());
-		selectedEClasses.add(UmaPackage.eINSTANCE.getSection());
-
-		for (Iterator iter = UmaPackage.eINSTANCE.getEClassifiers().iterator(); iter
-				.hasNext();) {
-			EClassifier eClassifier = (EClassifier) iter.next();
-			if (eClassifier instanceof EClass) {
-				EClass eClass = (EClass) eClassifier;
-
-				if (saveAttributeAsElement(eClass, selectedEClasses)) {
-					for (Iterator iterator = eClass.getEAttributes().iterator(); iterator
-							.hasNext();) {
-						EAttribute attrib = (EAttribute) iterator.next();
-						if (!excludedAttributes.contains(attrib)) {
-							XMLResource.XMLInfo xmlInfo = new XMLInfoImpl();
-							xmlInfo.setName(attrib.getName());
-							xmlInfo
-									.setXMLRepresentation(XMLResource.XMLInfo.ELEMENT);
-							xmlMap.add(attrib, xmlInfo);
-						}
-					}
-				}
-			}
-		}
-
-		return xmlMap;
-	}
-
-	public MultiFileResourceSetImpl() {
-		super();
-		markerMananger = new UnresolvedProxyMarkerManager(this);
-	}
-
-	public MultiFileResourceSetImpl(boolean reportError) {
-		this();
-		markerMananger.setEnabled(reportError);
-	}
-
-	public UnresolvedProxyMarkerManager getUnresolvedProxyMarkerManager() {
-		return markerMananger;		
-	}
-	
-	protected IURIProvider getURIProvider() {
-		if(uriProvider == null) {
-			uriProvider = new FilePathProvider();
-		}
-		return uriProvider;
-	}
-	
-	private void handleResourceChange(IResource wsRes) {
-		System.out
-				.println("MultiFileResourceSetImpl.handleResourceChange(): " + wsRes.toString()); //$NON-NLS-1$
-
-		MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) getResource(
-				URI.createFileURI(wsRes.getLocation().toString()), false);
-		if (resource != null) {
-			try {
-				ArrayList proxies = new ArrayList();
-				resource.reload(proxies);
-
-				// notify MAKE_PROXY event for all proxies
-				//
-				Notification msg = new NotificationImpl(EventTypes.MAKE_PROXY,
-						false, true);
-				for (Iterator iter = proxies.iterator(); iter.hasNext();) {
-					EObject o = (EObject) iter.next();
-					o.eNotify(msg);
-				}
-
-			} catch (IOException e) {
-				CommonPlugin.INSTANCE.log(e);
-			}
-		}
-
-	}
-
-	public Map getLoadOptions() {
-		Map options = super.getLoadOptions();
-		options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-		options.put(XMLResource.OPTION_XML_MAP, createLoadXMLMap());
-		return options;
-	}
-
-	public Map getDefaultSaveOptions() {
-		if (defaultSaveOptions == null) {
-			defaultSaveOptions = new HashMap();
-			defaultSaveOptions.putAll(DEFAULT_SAVE_OPTIONS);
-		}
-
-		return defaultSaveOptions;
-	}
-
-	private Resource getMethodLibraryResource() {
-		if (getResources().isEmpty())
-			return null;
-		return (Resource) getResources().get(0);
-	}
-
-	public MethodLibrary getMethodLibrary() {
-		Resource resource = getMethodLibraryResource();
-		return resource == null ? null : (MethodLibrary) PersistenceUtil
-				.getMethodElement(resource);
-	}
-
-	protected ResourceManager getRootResourceManager() {
-		Resource resource = getMethodLibraryResource();
-		return resource == null ? null : MultiFileSaveUtil
-				.getResourceManager(resource);
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#getURIConverter()
-	 */
-	public URIConverter getURIConverter() {
-		if (uriConverter == null) {
-			uriConverter = new MultiFileURIConverter(this);
-		}
-		return uriConverter;
-	}
-
-	/**
-	 * @param uri
-	 * @return null if the resource with the given URI could not be found
-	 */
-	public Resource getResource(URI uri) {
-		if (getURIConverter().normalize(uri) == null)
-			return null;
-		Resource res = null;
-		try {
-			res = super.getResource(uri, false);
-			if (res == null) {
-				Map map = getURIResourceMap();
-				res = createResource(uri);
-
-				try {
-					demandLoadHelper(res);
-				} catch (RuntimeException e) {
-					// remove the resource from resource set if it could not be
-					// loaded
-					//
-					getResources().remove(res);
-					throw e;
-				}
-
-				if (map != null) {
-					map.put(uri, res);
-				}
-			}
-		} catch (WrappedException e) {
-			if (e.exception() instanceof FileNotFoundException) {
-				return null;
-			}
-			throw e;
-		}
-		return res;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#demandLoad(org.eclipse.emf.ecore.resource.Resource)
-	 */
-	protected void demandLoad(Resource resource) throws IOException {
-		super.demandLoad(resource);
-
-		// refresh workspace resource of this resource to make them synchronized
-		//
-		boolean ret = FileManager.getInstance().refresh(resource);
-		if(MultiFileSaveUtil.DEBUG) {
-			if(!ret) {
-				System.err.println("MultiFileResourceSetImpl.demandLoad(): could not refresh resource " + resource); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	/**
-	 * Resolves container of the MethodElement in the given resource.
-	 * 
-	 * @param res
-	 */
-	public void resolveContainer(Resource res) {
-		MethodLibrary lib = getMethodLibrary();
-		if(loading && lib == null) {
-			return;
-		}
-		for (Iterator iterator = res.getContents().iterator(); iterator.hasNext();) {
-			Object element = (Object) iterator.next();
-			if(element instanceof MethodElement) {
-				MethodElement e = (MethodElement) element;
-				if(e != lib && e.eContainer() == null) {
-					// the method element might have been loaded before its container accessed it
-					//
-					ResourceDescriptor resDesc = MultiFileSaveUtil.getResourceDescriptor(res);
-					if(resDesc != null) {
-						Resource containerResource = resDesc.eResource();
-						if(containerResource instanceof XMLResourceImpl) {
-							Object proxy = ((XMLResourceImpl)containerResource).getIDToEObjectMap().get(e.getGuid());
-							if(proxy instanceof EObject) {
-								EObject proxyEObject = ((EObject)proxy); 
-								EReference ref = proxyEObject.eContainmentFeature();
-								EObject container = proxyEObject.eContainer();
-								if(container != null) {
-									if (ref.isMany()) {
-										List values = (List) container.eGet(ref);
-										for (Iterator iter = values.iterator(); iter.hasNext(); iter
-										.next())
-											;
-									} else {
-										container.eGet(ref);
-									}
-									resolveContainer(containerResource);
-								}
-							}
-						}
-					}
-				}
-			}			
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#getResource(org.eclipse.emf.common.util.URI,
-	 *      boolean)
-	 */
-	public Resource getResource(URI uri, boolean loadOnDemand) {
-		if (getURIConverter().normalize(uri) == null)
-			return null;
-		Resource res = null;
-		try {
-			res = super.getResource(uri, loadOnDemand);
-		} catch (RuntimeException e) {
-			String msg = null;
-			if (e.getMessage() != null)
-				msg = NLS.bind(
-						PersistenceResources.loadResourceErrorWithReason_msg,
-						(new Object[] { uri, e.getMessage() }));
-			else
-				msg = NLS.bind(PersistenceResources.loadResourceError_msg, uri);
-			handleException(msg);
-			throw e;
-		}
-		return res;
-	}
-
-	public void addRefreshListener(IRefreshListener listener) {
-		if (refreshListeners == null) {
-			refreshListeners = new UniqueEList<IRefreshListener>();
-		}
-		refreshListeners.add(listener);
-	}
-
-	public void removeRefreshListenter(IRefreshListener listener) {
-		if (refreshListeners != null) {
-			refreshListeners.remove(listener);
-		}
-	}
-	
-	public void notifyRefreshListeners(IRefreshEvent event) {
-		if(refreshListeners != null && !refreshListeners.isEmpty()) {
-			for (IRefreshListener listener : refreshListeners) {
-				try {
-					listener.notifyRefreshed(event);
-				} catch (Exception e) {
-					PersistencePlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Reloads the given resources
-	 * 
-	 * @param resources
-	 * @return resources that had been reloaded
-	 */
-	public synchronized Collection reloadResources(Collection resources) {		
-		// save the ResourceDescriptor for the resources to create URI for their
-		// proxies after unload
-		//
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) iter
-					.next();
-			
-			if(MultiFileSaveUtil.DEBUG) {
-				System.out
-						.println("MultiFileResourceSetImpl.reloadResources(): resource=" + resource + ", element=" + PersistenceUtil.getMethodElement(resource)); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			
-			ResourceDescriptor resDesc = MultiFileSaveUtil
-					.getResourceDescriptor(resource);
-			if (resDesc != null) {
-				resource.setResourceDescriptor(resDesc);
-			}
-		}
-
-		ArrayList reloadedResources = new ArrayList();
-		HashSet proxies = new HashSet();
-		ArrayList resourceList = new ArrayList(resources);
-
-		Resource libResource = getMethodLibraryResource();
-		boolean reloadAllConfigs = false;
-		if (resourceList.remove(libResource)) {
-			// MethodLibrary resource is to reload, it must be reloaded first
-			//			
-			MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) libResource;
-
-			// clear markers for this resource
-			//
-			markerMananger.clearMarkers(resource);
-
-			try {
-				if (resource.reload(proxies)) {
-					reloadedResources.add(resource);
-
-					// reset the resource manager reference in URIConverter of
-					// this resource set
-					// since the resource manager is reloaded
-					//
-					MultiFileURIConverter uriConverter = (MultiFileURIConverter) getURIConverter();
-					uriConverter.resMgr = null;
-					
-					reloadAllConfigs = true;
-				}
-			} catch (IOException e) {
-				CommonPlugin.INSTANCE.log(e);
-			}
-
-		}
-		// reload the resources
-		//
-		for (Iterator iter = resourceList.iterator(); iter.hasNext();) {
-			MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) iter
-					.next();
-
-			// clear markers for this resource
-			//
-			markerMananger.clearMarkers(resource);
-
-			try {
-				if (resource.reload(proxies)) {
-					reloadedResources.add(resource);
-				}
-			} catch (IOException e) {
-				CommonPlugin.INSTANCE.log(e);
-			}
-		}
-
-		if (!reloadedResources.isEmpty()) {
-			// reinitialize the resource set
-			//
-			initialize(reloadAllConfigs);
-
-			// notify the listeners
-			//
-			if (refreshListeners != null) {
-				IRefreshEvent event = new RefreshEvent(reloadedResources,
-						proxies);
-				for (Iterator iter = new ArrayList(refreshListeners).iterator(); iter
-						.hasNext();) {
-					IRefreshListener listener = (IRefreshListener) iter.next();
-					listener.notifyRefreshed(event);
-				}
-			}
-		}
-
-		return reloadedResources;
-	}
-
-	public void initialize(boolean loadConfigurations) {
-		// load the ResourceManager tree and opposite features
-		//
-		loadResourceManagerTree();
-
-		setContainersOfLoadedElements();
-		
-		if(loadConfigurations) {
-			loadConfigurations();
-		}
-
-		loadOppositeFeatures();
-
-		// reset the resource manager reference in URIConverter of this resource
-		// set
-		//
-		MultiFileURIConverter uriConverter = (MultiFileURIConverter) getURIConverter();
-		uriConverter.resMgr = null;
-	}
-	
-	private void setContainersOfLoadedElements() {
-		ResourceManager resMgr = getRootResourceManager();
-		Iterator iterator = new AbstractTreeIterator(resMgr, false) {
-
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 2172691017987702506L;
-
-			protected Iterator getChildren(Object object) {
-				ResourceManager resMgr = (ResourceManager) object;
-				Collection GUIDs = new HashSet();
-				List subMgrs = new ArrayList(resMgr.getSubManagers());
-				for (Iterator iter = subMgrs.iterator(); iter.hasNext();) {
-					try {
-						InternalEObject subMgr = (InternalEObject) iter
-								.next();
-						if (subMgr != null && !subMgr.eIsProxy()) {
-							MethodElement e = PersistenceUtil
-									.getMethodElement(subMgr.eResource());
-							GUIDs.add(e.getGuid());
-						}
-					} catch (RuntimeException e) {
-						throw e;
-					}
-				}
-				Resource resource = resMgr.eResource();
-				if(resource != null) {
-					MethodElement parent = PersistenceUtil
-							.getMethodElement(resource);
-
-					// resolve the proxy of this element in the parent
-					//
-					MultiFileSaveUtil.resolveProxies(GUIDs, parent);
-				}
-
-				return resMgr.getSubManagers().iterator();
-			}
-
-		};
-		for (; iterator.hasNext(); iterator.next())
-			;
-	}
-
-	/**
-	 * Checks if the given workspace resource represents a library resource
-	 * 
-	 * @param wsResource
-	 * @return
-	 */
-	public boolean isLibraryResource(IResource wsResource) {
-		return libFolderPath != null && libFolderPath.isPrefixOf(wsResource.getLocation());
-	}
-	
-	/**
-	 * Checks if the given workspace resource is a new resource that can be loaded 
-	 * using {@link #loadNewResources(Collection)}
-	 *  
-	 * @return
-	 */
-	public boolean isNewResourceToLoad(IResource wsResource) {
-		IPath loc = wsResource.getLocation();
-		return (loc != null && configFolderPath != null 
-				&& MultiFileSaveUtil.DEFAULT_FILE_EXTENSION.equalsIgnoreCase("." + loc.getFileExtension()) //$NON-NLS-1$
-				&& configFolderPath.isPrefixOf(loc)
-				&& !FileManager.getInstance().isTeamPrivate(loc.toString()));
-
-	}
-	
-	/**
-	 * Loads new resources specified by the given collection of {@link IResource work space resources}
-	 * into this resource set
-	 * TODO: merge this code to {@link #getResource(URI, boolean)}
-	 * @param wsResources collection of {@link IResource} objects
-	 */
-	public void loadNewResources(Collection<IResource> wsResources) {
-		ArrayList newConfigFiles = new ArrayList();
-		for (Iterator iter = wsResources.iterator(); iter.hasNext();) {
-			Object wsResource = (Object) iter.next();
-			if(wsResource instanceof IResource) {
-				IResource wsRes = (IResource) wsResource;
-				IPath loc = wsRes.getLocation();
-				String configFile;
-				if(loc != null && configFolderPath != null 
-						&& MultiFileSaveUtil.DEFAULT_FILE_EXTENSION.equalsIgnoreCase("." + loc.getFileExtension()) //$NON-NLS-1$
-						&& configFolderPath.isPrefixOf(loc)
-						&& !FileManager.getInstance().isTeamPrivate(configFile = loc.toString())) {
-					newConfigFiles.add(configFile);
-				}
-			}
-		}
-		
-		// load new configurations
-		//
-		for (Iterator iter = newConfigFiles.iterator(); iter.hasNext();) {
-			String configFile = (String) iter.next();
-			loadConfiguration(new File(configFile));
-		}
-	}
-
-	/**
-	 * Special handling for MethodConfiguration since MethodLibrary will no
-	 * longer keeps the references to MethodConfigurations and their files. Any
-	 * XMI file under folder ./configurations and its subfolders will be treated
-	 * as a configuration file. They will be loaded and added to MethodLibrary
-	 * as its configurations.
-	 * @return TODO
-	 */
-	protected Collection<Resource> loadConfigurations() {
-		MethodLibrary lib = getMethodLibrary();
-		File configDir = new File(new File(lib.eResource().getURI()
-				.toFileString()).getParent(),
-				MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME);
-		return loadConfigurations(configDir);
-	}
-	
-	/**
-	 * Loads method configurations from the specified directory.
-	 * 
-	 * @param configDir
-	 * @return TODO
-	 */
-	protected Collection<Resource> loadConfigurations(File configDir) {
-		ArrayList<Resource> resources = new ArrayList<Resource>();
-		Iterator dirIter = MultiFileSaveUtil.listConfigFiles(configDir);
-		HashSet<File> configFiles = new HashSet<File>();
-		while (dirIter.hasNext()) {
-			File configFile = (File) dirIter.next();
-			if(configFile.isFile()) {
-				configFiles.add(configFile);
-			}
-		}
-		MethodLibrary lib = getMethodLibrary();
-		for (Iterator iter = lib.getPredefinedConfigurations().iterator(); iter
-				.hasNext();) {
-			MethodConfiguration config = (MethodConfiguration) iter.next();
-			File file = new File(config.eResource().getURI().toFileString());
-			if (configFiles.contains(file)) {
-				configFiles.remove(file);
-			}
-		}
-
-		for (Iterator iter = configFiles.iterator(); iter.hasNext();) {
-			File file = (File) iter.next();
-			Resource resource = loadConfiguration(file);
-			if(resource != null) {
-				resources.add(resource);
-			}
-		}
-		return resources;
-	}
-
-	protected Resource loadConfiguration(File configFile) {
-		try {
-			MethodLibrary lib = getMethodLibrary();
-			URI uri = URI.createFileURI(configFile.getCanonicalPath());
-			Resource resource = super.getResource(uri, true);
-			if (resource != null) {
-				MethodElement e = PersistenceUtil
-						.getMethodElement(resource);
-				if (e instanceof MethodConfiguration) {
-					if(PersistenceUtil.hasDuplicateGUID(e, lib.getPredefinedConfigurations())) {
-						PersistencePlugin.getDefault().getLogger().logError(
-								NLS.bind(PersistenceResources.loadConfiguration_couldNotLoad_logMsg, configFile));
-					}
-					else {
-						lib.getPredefinedConfigurations().add(e);
-						return resource;
-					}
-				} else {
-					PersistencePlugin.getDefault().getLogger().logError(
-							NLS.bind(PersistenceResources.loadConfiguration_notConfigFile_logMsg, configFile)
-							);
-				}
-				resource.unload();
-				getResources().remove(resource);
-			}
-		} catch (Exception e) {
-			PersistencePlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-
-	/**
-	 * @param string
-	 */
-	protected void handleException(Object err) {
-		if (err instanceof Throwable) {
-			PersistencePlugin.getDefault().getLogger().logError((Exception)err);
-		} else {
-			PersistencePlugin.getDefault().getLogger().logError(err.toString());
-		}
-		if(MultiFileSaveUtil.DEBUG) {
-			if (err instanceof Throwable) {
-				((Exception) err).printStackTrace();
-			} else {
-				System.err.println(err.toString());
-			}
-		}
-	}
-
-	public void reset() {
-		if (uriConverter instanceof MultiFileURIConverter) {
-			((MultiFileURIConverter) uriConverter).dispose();
-		}
-		uriConverter = null;
-		boolean notify = eDeliver();
-		boolean reportError = REPORT_ERROR;
-		boolean refresh = RefreshJob.getInstance().isEnabled();
-		try {
-			if(RefreshJob.getInstance().getResourceSet() == this) {
-				RefreshJob.getInstance().setEnabled(false);
-				RefreshJob.getInstance().reset();
-			}
-			eSetDeliver(false);
-			REPORT_ERROR = false;
-			markerMananger.setEnabled(false);
-			markerMananger.clearAll();
-
-			for (Iterator iter = new ArrayList(getResources()).iterator(); iter
-					.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				try {
-					resource.unload();
-				} catch (Exception e) {
-					// System.err.println("Error unloading resource: " +
-					// resource.getURI());
-					// e.printStackTrace();
-				}
-			}
-
-			clearErrors();
-		} finally {
-			eSetDeliver(notify);
-			REPORT_ERROR = reportError;
-			markerMananger.setEnabled(true);
-			if(RefreshJob.getInstance().getResourceSet() == this) {
-				RefreshJob.getInstance().setEnabled(refresh);
-			}
-		}
-
-		if (guidToMethodElementMap != null) {
-			guidToMethodElementMap.clear();
-		}
-
-		getResources().clear();
-
-		if (URIToTempURIMap != null) {
-			URIToTempURIMap.clear();
-		}
-
-		MultiFileXMIResourceImpl.clearDetachedEObjectToIDMap();
-	}
-
-	private void clearErrors() {
-		// clear all markers
-		markerMananger.clearAll();
-	}
-
-	public MethodLibrary loadLibrary(String path) throws Exception {
-		long begin = System.currentTimeMillis();
-
-		reset();
-
-		long afterReset = System.currentTimeMillis();
-		
-		if (MultiFileSaveUtil.DEBUG) {
-			System.out.println("Reset time: " + (afterReset - begin)); //$NON-NLS-1$
-		}
-
-		MethodLibrary lib = loadLibraryWithoutReset(path);
-
-		if (MultiFileSaveUtil.DEBUG) {
-			System.out
-					.println("Load time: " + (System.currentTimeMillis() - begin)); //$NON-NLS-1$
-		}
-
-		if (MultiFileSaveUtil.DEBUG) {
-			// check if any resource is marked as modified after loading
-			//
-			System.err.println("Modified resources after loading:"); //$NON-NLS-1$
-			for (Iterator iter = getResources().iterator(); iter.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				if (resource.isModified()) {
-					System.err.println("  " + resource.getURI()); //$NON-NLS-1$
-				}
-			}
-		}
-
-		return lib;
-	}
-	
-	protected Resource loadLibraryResource(String path) {
-		URI uri = URI.createFileURI(path);
-		Resource res = super.getResource(uri, true);
-		if (!res.getErrors().isEmpty()) {
-			StringBuffer strBuf = new StringBuffer();
-			strBuf.append(PersistenceResources.loadLibraryError_msg);
-			for (Iterator iter = res.getErrors().iterator(); iter.hasNext();) {
-				Resource.Diagnostic error = (Resource.Diagnostic) iter
-						.next();
-				strBuf.append(NLS.bind(
-						PersistenceResources.loadLibraryError_details,
-						(new Object[] { String.valueOf(error.getLine()),
-								String.valueOf(error.getColumn()),
-								error.getMessage() })));
-			}
-			String msg = strBuf.toString();
-			CommonPlugin.INSTANCE.log(msg);
-			if(MultiFileSaveUtil.DEBUG) {
-				System.err.println(msg);
-			}
-		}
-		return res;
-	}
-
-	public MethodLibrary loadLibraryWithoutReset(String path) throws Exception {
-		loading = true;
-
-		// no refresh during load
-		//
-		boolean b = RefreshJob.getInstance().isEnabled();
-		if(RefreshJob.getInstance().getResourceSet() == this) {
-			RefreshJob.getInstance().setEnabled(false);
-			RefreshJob.getInstance().reset();
-		}
-		
-		// defer adding markers during load
-		//
-		boolean autoScheduled = markerMananger.isAutoScheduled();
-		markerMananger.setAutoScheduled(false);
-		try {		
-			File libFile = new File(path);
-			configFolderPath = new Path(new File(libFile.getParentFile(),
-					MultiFileSaveUtil.METHOD_CONFIGURATION_FOLDER_NAME).getCanonicalPath());
-			libFolderPath = new Path(libFile.getParentFile().getCanonicalPath());
-			Resource res = loadLibraryResource(libFile.getCanonicalPath()); 
-			try {
-				initialize(true);
-				
-				// Set modified flag of library resource to false in case it had been modified during initialization
-				//
-				if(res != null) {
-					res.setModified(false);
-				}
-				
-				return getMethodLibrary();
-			} catch (Exception e) {
-				PersistencePlugin.getDefault().getLogger().logError(e);
-				throw new Exception(NLS.bind(
-						PersistenceResources.invalidLibraryFileError_msg, path));
-			}
-		} finally {
-			if(RefreshJob.getInstance().getResourceSet() == this) {
-				RefreshJob.getInstance().setEnabled(b);
-			}
-					
-			markerMananger.setAutoScheduled(autoScheduled);
-			markerMananger.start();
-			
-			loading = false;
-		}
-	}
-
-	/**
-	 * Loads opposite features for all loaded objects
-	 */
-	private void loadOppositeFeatures() {
-		ArrayList oppositeFeatures = new ArrayList();
-		for (Iterator iter = AssociationHelper.getPredefinedOppositeFeatures()
-				.iterator(); iter.hasNext();) {
-			OppositeFeature oppositeFeature = (OppositeFeature) iter.next();
-			if (oppositeFeature.resolveOwner()) {
-				oppositeFeatures.add(oppositeFeature);
-			}
-		}
-		loadOppositeFeatures(oppositeFeatures);
-	}
-
-	/**
-	 * Loads ResourceManager tree of the open library and connect any loaded
-	 * MethodUnit to the library tree as well.
-	 */
-	private void loadResourceManagerTree() {
-		long begin = 0;
-		
-		if(MultiFileSaveUtil.DEBUG) {
-			begin = System.currentTimeMillis();
-		}
-
-		// disable logging unresolved proxies during loading resource manager
-		// tree
-		//
-		markerMananger.setEnabled(false);
-
-		MultiFileURIConverter uriConverter = (MultiFileURIConverter) getURIConverter();
-		try {
-			// this prevents uriConverter from loading resources while
-			// normalizing URI
-			//
-			uriConverter.setResolveProxy(false);
-
-			ResourceManager resMgr = getRootResourceManager();
-			Iterator iterator = new AbstractTreeIterator(resMgr, false) {
-
-				/**
-				 * Comment for <code>serialVersionUID</code>
-				 */
-				private static final long serialVersionUID = 2172691017987702506L;
-
-				protected Iterator getChildren(Object object) {
-					ResourceManager resMgr = (ResourceManager) object;
-					return resMgr.getSubManagers().iterator();
-				}
-
-			};
-			loadingResourceManagerTree = true;
-			for (; iterator.hasNext(); iterator.next())
-				;
-		} finally {
-			markerMananger.setEnabled(true);
-			uriConverter.setResolveProxy(true);
-			loadingResourceManagerTree = false;
-
-			// Reporting of unnormalized URIs was disabled while loading
-			// resource manager tree. Now we need
-			// to go thru all the loaded objects to find proxies with
-			// unnormalized URIs and report them
-			//
-			try {
-				for (Iterator iter = new ArrayList(getGuidToMethodElementMap().values())
-						.iterator(); iter.hasNext();) {
-					InternalEObject o = (InternalEObject) iter.next();
-					if (o.eIsProxy() && o.eContainer() != null) {
-						URI uri = o.eProxyURI();
-						URI normalizedURI = getURIConverter().normalize(uri);
-						if (normalizedURI == null) {
-							// this call will log error about unresolved proxy
-							//
-							((InternalEObject) o.eContainer()).eResolveProxy(o);
-						}
-					}
-				}
-			}
-			catch(Exception e) {
-				PersistencePlugin.getDefault().getLogger().logError(e);
-			}
-			
-			if(MultiFileSaveUtil.DEBUG) {
-				System.out
-						.println("MultiFileResourceSetImpl.loadResourceManagerTree(): " + (System.currentTimeMillis() - begin)); //$NON-NLS-1$
-			}
-		}
-	}
-
-	protected ResourceManager getResourceManager() {
-		return ((MultiFileURIConverter) getURIConverter()).getResourceManager();
-	}
-
-	protected EObject findEObjectInUnloadedResources(String id) {
-		return findEObjectInUnloadedResources(getResourceManager(), id);
-	}
-
-	private EObject findEObjectInUnloadedResources(ResourceManager resMgr,
-			String id) {
-		for (Iterator iter = resMgr.getResourceDescriptors().iterator(); iter
-				.hasNext();) {
-			ResourceDescriptor desc = (ResourceDescriptor) iter.next();
-			Resource resource = super.getResource(desc.getResolvedURI(), false);
-			if (resource == null || !resource.isLoaded()) {
-				try {
-					resource = super.getResource(desc.getResolvedURI(), true);
-				} catch (Exception e) {
-					//
-				}
-				if (resource != null) {
-					EObject eObject = resource.getEObject(id);
-					if (eObject != null) {
-						return eObject;
-					}
-				}
-			}
-		}
-		for (Iterator iter = resMgr.getSubManagers().iterator(); iter.hasNext();) {
-			EObject eObject = findEObjectInUnloadedResources(
-					(ResourceManager) iter.next(), id);
-			if (eObject != null)
-				return eObject;
-		}
-		return null;
-	}
-
-	/**
-	 * Gets object with the given id
-	 */
-	public EObject getEObject(String id) {
-		// first, try to get the object from the cache guidToMethodElement
-		//
-		EObject eObject = (EObject) getGuidToMethodElementMap().get(id);
-		if (eObject != null)
-			return eObject;
-
-		URI uri = MultiFileURIConverter.createURI(id).appendFragment(id);
-		URI normalized = getURIConverter().normalize(uri);
-		if (normalized == null) {
-			// the object with the given id might not have direct resource,
-			// hence, it does not have
-			// its own ResourceDescriptor in ResourceManager tree.
-			// go thru all unloaded resources, load them, and try to find the
-			// object with the given id.
-			//
-			eObject = findEObjectInUnloadedResources(id);
-			if (eObject == null && REPORT_ERROR) {
-				handleException(NLS.bind(
-						PersistenceResources.objNotFoundError_msg, id));
-			}
-			return eObject;
-		}
-
-		try {
-			return getEObject(uri, true);
-		} catch (RuntimeException e) {
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.ResourceSet#getEObject(org.eclipse.emf.common.util.URI,
-	 *      boolean)
-	 */
-	public EObject getEObject(URI uri, boolean loadOnDemand) {
-		return getEObject(null, uri, loadOnDemand);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.ResourceSet#createResource(org.eclipse.emf.common.util.URI)
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = doCreateResource(uri);
-		result.setTrackingModification(true);
-		getResources().add(result);
-		return result;
-	}
-	
-	protected Resource doCreateResource(URI uri) {
-		return new MultiFileXMIResourceImpl(uri);
-	}
-
-	private static boolean backupRequired(Map options) {
-		Boolean backup = (Boolean) options
-				.get(MultiFileXMISaveImpl.BACK_UP_BEFORE_SAVE);
-		return backup != null && backup.booleanValue();
-	}
-
-	private void backup(Resource res) {
-		try {
-			if (res.getContents().isEmpty())
-				return;
-			Object object = res.getContents().get(0);
-			if (!(object instanceof MethodLibrary
-					|| object instanceof ResourceManager || object instanceof MethodPlugin))
-				return;
-
-			MethodLibrary library = getMethodLibrary();
-			String backupDir = new File(library.eResource().getURI()
-					.toFileString()).getParent()
-					+ File.separator + ".bak"; //$NON-NLS-1$
-			SimpleDateFormat dateFormatter = new SimpleDateFormat(
-					"yyMMddHHmmss.S"); //$NON-NLS-1$
-			if (res == library.eResource()) {
-				DateFormat.getInstance().format(
-						Calendar.getInstance().getTime());
-				File backupFile = new File(backupDir,
-						MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME
-								+ '_'
-								+ dateFormatter.format(Calendar.getInstance()
-										.getTime()));
-				if (!backupFile.getParentFile().exists()) {
-					backupFile.getParentFile().mkdirs();
-				}
-				FileUtil.moveFile(new File(res.getURI().toFileString()), backupFile);
-			} else {
-				String relativePath = res.getURI().deresolve(
-						library.eResource().getURI()).toFileString();
-				File backupFile = new File(backupDir, relativePath
-						+ '_'
-						+ dateFormatter
-								.format(Calendar.getInstance().getTime()));
-				if (!backupFile.getParentFile().exists()) {
-					backupFile.getParentFile().mkdirs();
-				}
-				FileUtil.moveFile(new File(res.getURI().toFileString()), backupFile);
-			}
-		} catch (Exception e) {
-			handleException(e);
-			handleException(NLS.bind(PersistenceResources.backupError_msg, res));
-		}
-	}
-
-	void removeURIMappings(EObject eObj, Set modifiedResources) {
-		ResourceManager resMgr = MultiFileSaveUtil.getResourceManager(eObj
-				.eResource());
-		if (resMgr != null && resMgr.eContainer() != null) {
-			EcoreUtil.remove(resMgr);
-		}
-		resMgr = getRootResourceManager();
-		if(resMgr != null) {
-			ResourceDescriptor desc = MultiFileSaveUtil.findResourceDescriptor(
-					resMgr, MultiFileSaveUtil.getGuid(eObj),
-					null, true);
-			if (desc != null) {
-				if (modifiedResources != null && desc.eResource() != null) {
-					modifiedResources.add(desc.eResource());
-				}
-				EcoreUtil.remove(desc);
-			}
-		}
-	}
-
-	protected void cleanUp(Resource removedResource) throws IOException {
-		cleanUp(removedResource, null);
-	}
-
-	// protected void cleanUp(EObject obj, Set modifiedResources) {
-	// try {
-	// // remove all the URI mappings
-	// //
-	// removeURIMappings(obj, modifiedResources);
-	// }
-	// finally {
-	// Resource resource = obj.eResource();
-	// if(resource != null && resource.getContents().contains(obj)) {
-	// resource.unload();
-	// getResources().remove(resource);
-	// }
-	// }
-	// }
-
-	void cleanUp(Resource removedResource, Set modifiedResources)
-			throws IOException {
-		try {
-			//
-			if (removedResource.getContents().isEmpty()) {
-				removedResource.unload();
-				try {
-					removedResource.load(null);
-				} catch (FileNotFoundException e) {
-					// the file might already be deleted, moved or never
-					// creared.
-					//
-					return;
-				}
-			}
-
-			EObject obj = PersistenceUtil.getMethodElement(removedResource);
-
-			// if(obj == null) return;
-			// boolean cleanFolder;
-			// if(obj instanceof MethodPlugin) {
-			// cleanFolder = true;
-			// }
-			// else {
-			// cleanFolder = false;
-			// }
-
-			// MultiFileURIConverter umaUriConverter =
-			// ((MultiFileURIConverter)getURIConverter());
-			// umaUriConverter.getResourceManager().removeResourceDescriptor(removedResource.getURI(),
-			// cleanFolder);
-
-			// remove all the URI mappings
-			//
-			removeURIMappings(obj, modifiedResources);
-
-			// if(obj instanceof ProcessPackage) {
-			// cleanUpResourceDescriptors((ProcessPackage)obj);
-			// }
-
-			removedResource.unload();
-		} finally {
-			getResources().remove(removedResource);
-			URI oldURI = ((MultiFileXMIResourceImpl) removedResource)
-					.getOldURI();
-			if (oldURI != null) {
-				getURIToTempURIMap().remove(oldURI);
-			}
-		}
-	}
-
-	private void cleanUp(ProcessPackage procPkg) {
-		// remove ContentDescription of all ProcessElements in this
-		// ProcessPackage
-		//
-		removeContentDescriptions(procPkg);
-
-		EcoreUtil.remove(procPkg);
-	}
-
-	/**
-	 * @param procPkg
-	 */
-	private void removeContentDescriptions(ProcessPackage procPkg) {
-		for (Iterator iter = procPkg.getProcessElements().iterator(); iter
-				.hasNext();) {
-			ProcessElement element = (ProcessElement) iter.next();
-			if (ContentDescriptionFactory.hasPresentation(element)
-					&& element.getPresentation().eResource() != null) {
-				removePresentation(element);
-			}
-		}
-
-		for (Iterator iter = procPkg.getChildPackages().iterator(); iter
-				.hasNext();) {
-			Object pkg = iter.next();
-			if (pkg instanceof ProcessPackage) {
-				removeContentDescriptions((ProcessPackage) pkg);
-			}
-		}
-	}
-
-	/**
-	 * @param element
-	 */
-	private void removePresentation(ProcessElement element) {
-		Resource resource = element.getPresentation().eResource();
-		resource.getContents().remove(element.getPresentation());
-	}
-
-	private boolean save(Collection resources, Map options, boolean prepareSave)
-			throws Exception {
-		if (options == null) {
-			options = getDefaultSaveOptions();
-		}
-
-		Set modifiedResources = new HashSet();
-		options.put(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET,
-				modifiedResources);
-		try {
-			for (Iterator iter = resources.iterator(); iter.hasNext();) {
-				Resource res = (Resource) iter.next();
-				save(res, options, prepareSave);
-			}
-			saveModifiedResources(options);
-			return true;
-		} finally {
-			options.remove(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET);
-		}
-	}
-
-	boolean save(Resource res, Map options, boolean prepareSave)
-			throws Exception {
-		Set modifiedResources = (Set) options
-				.get(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET);
-		TxRecord txRecord = (TxRecord) options
-				.get(MultiFileXMISaveImpl.TX_RECORD);
-		List resourcesToCommit = txRecord != null ? txRecord
-				.getResourcesToCommit() : null;
-
-		try {
-			MethodElement eObj = PersistenceUtil.getMethodElement(res);
-			if (eObj != null) {
-				if (prepareSave) {
-					if (eObj instanceof ProcessComponent) {
-						ProcessComponent procComp = (ProcessComponent) eObj;
-						Resource content = procComp.getProcess() != null
-								&& ContentDescriptionFactory
-										.hasPresentation(procComp.getProcess()) ? procComp
-								.getProcess().getPresentation().eResource()
-								: null;
-						boolean alreadyModified = content != null
-								&& content.isModified();
-						prepareSave(procComp);
-						if (content != null && content.isModified()
-								&& !alreadyModified) {
-							// content is modified as result of prepareSave(),
-							// it needs to be saved after model is saved
-							//
-							modifiedResources.add(content);
-						}
-					}
-					else if (eObj instanceof MethodPlugin) {
-						MultiFileSaveUtil.addResourceManager(res);
-					}
-				}
-				if (res.isModified()) {
-					// System.out.println("----> Start saving " + res);
-					boolean backupRequired = backupRequired(options);
-					if (backupRequired) {
-						// back up resource before saving
-						//
-						backup(res);
-					}
-
-					if (resourcesToCommit != null) {
-						((MultiFileXMIResourceImpl) res).setTempURI(txRecord
-								.getTxID());
-						resourcesToCommit.add(res);
-					}
-
-					MultiFileSaveUtil.save(res, options);
-
-					// System.out.println("<---- Saved resource: " + res);
-
-					return true;
-				}
-			}
-		} catch (Exception exception) {
-			handleException(exception);
-			throw exception;
-		}
-
-		return false;
-	}
-
-	/**
-	 * Save a resource of this resource set with the given save options
-	 * 
-	 * @param res
-	 * @param options
-	 * @return <code>true</code> if there is at least a resource has been saved in this call
-	 * @throws Exception
-	 */
-	public boolean save(Resource res, Map options) throws Exception {
-//		// clear all error markers for this resource
-//		//
-//		markerMananger.clearMarkers(res);
-
-		if (res == null || res.getContents().isEmpty())
-			return false;
-
-		if (options == null) {
-			options = getDefaultSaveOptions();
-		}
-
-		Set modifiedResources = new HashSet();
-		options.put(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET,
-				modifiedResources);
-		boolean notFailSafe = options.get(MultiFileXMISaveImpl.TX_RECORD) == null;
-		try {
-			Collection savedResources = null;
-			if(notFailSafe) {
-				savedResources = new ArrayList();
-			}
-			boolean ret = save(res, options, true);
-			if(ret && notFailSafe) {
-				savedResources.add(res);
-			}
-			Collection collection = saveModifiedResources(options);
-			if(!collection.isEmpty()) {
-				ret = true;
-				if(notFailSafe) {
-					savedResources.addAll(collection);
-				}
-			}
-			
-			if(notFailSafe && ret) {
-				// update resource cached timestamps
-				//
-				for (Iterator iter = savedResources.iterator(); iter.hasNext();) {
-					Object resource = iter.next();
-					if(resource instanceof MultiFileXMIResourceImpl) {
-						((MultiFileXMIResourceImpl)resource).updateTimeStamps();
-					}
-				}								
-			}
-			
-			return ret;
-		} finally {
-			options.remove(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET);
-		}
-	}
-
-	/**
-	 * Saves only the modified resources in this resource set.
-	 * 
-	 * @param options
-	 */
-	public void save(Map options) throws LibraryResourceException {
-		try {
-			save(options, false, true);
-		} catch (Exception e) {
-			if(e instanceof RuntimeException) {
-				throw (RuntimeException)e;
-			}
-			throw new LibraryResourceException(e);
-		}
-	}
-
-	/**
-	 * 
-	 * @param options
-	 * @return resources that had been saved by this call
-	 * @throws LibraryResourceException 
-	 */
-	Collection saveModifiedResources(Map options) throws LibraryResourceException {
-		Set modifiedResources = (Set) options
-				.get(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET);
-		TxRecord txRecord = (TxRecord) options
-				.get(MultiFileXMISaveImpl.TX_RECORD);
-		List resourcesToCommit = txRecord != null ? txRecord
-				.getResourcesToCommit() : null;
-		if (modifiedResources == null)
-			return Collections.EMPTY_LIST;
-		boolean backupRequired = backupRequired(options);
-		boolean checkModify = MultiFileXMISaveImpl.checkModifyRequired(options);
-		Collection savedResources = new ArrayList();
-		while (!modifiedResources.isEmpty()) {
-			List<Resource> resourcesToSave = new ArrayList<Resource>(modifiedResources);
-			
-			modifiedResources.clear();
-			if (checkModify) {
-				checkModify(resourcesToSave);
-				if(resourcesToCommit != null) {
-					// check for out-of-synch only in fail-safe saving for now
-					//
-					MultiFileSaveUtil.checkOutOfSynch(resourcesToSave, options);
-				}
-			}
-			for(Iterator iter = resourcesToSave.iterator(); iter.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				// if(resource.isModified()) {
-				if (backupRequired) {
-					// back up resource before saving
-					//
-					backup(resource);
-				}
-
-				if (resourcesToCommit != null) {
-					((MultiFileXMIResourceImpl) resource).setTempURI(txRecord
-							.getTxID());
-					resourcesToCommit.add(resource);
-				}
-
-				if(MultiFileSaveUtil.save(resource, options)) {
-					savedResources.add(resource);
-				}
-				// }
-			}
-		}
-		return savedResources;
-	}
-
-	/**
-	 * 
-	 * @param options
-	 * @param saveAll
-	 *            if true, force saving all the resources even if they are not
-	 *            modified.
-	 * @throws Exception
-	 */
-	public void save(Map options, boolean saveAll) throws Exception {
-		save(options, saveAll, false);
-	}
-	
-	protected void save(Map options, boolean saveAll, boolean failSafe)
-			throws Exception {
-		if (options == null) {
-			options = new HashMap(getDefaultSaveOptions());
-		}
-
-		MethodLibrary library = getMethodLibrary();
-		MultiFileSaveUtil.setGuid(library);
-
-		prepareSave(library);
-
-		// do clean-up this resource set before saving
-		//
-		cleanUp();
-
-		MultiFileURIConverter umaUriConverter = ((MultiFileURIConverter) getURIConverter());
-		umaUriConverter.setLibraryURIs(library);
-
-		Set modifiedResources = new HashSet();
-		options.put(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET,
-				modifiedResources);
-		MethodLibraryPersister.FailSafePersister persister = null;
-		if (failSafe) {
-			persister = MethodLibraryPersister.INSTANCE
-					.getFailSafePersister(options);
-			options = persister.getSaveOptions();
-		}
-		try {
-			List list = getResources();
-			int size = list.size();
-			// System.out.println("Start saving " + size + " loaded resources: "
-			// + list);
-			// System.out.println();
-			boolean backupRequired = backupRequired(options);
-			List saveResources = new ArrayList();
-			List moveResources = new ArrayList();
-			for (int i = 0; i < size; i++) {
-				Resource res = (Resource) list.get(i);
-
-				 if (res.isModified() && 
-						 MultiFileSaveUtil.adjustLocationRequired((MultiFileXMIResourceImpl) res)) {
-					 moveResources.add(res);
-				 }
-
-				MethodElement eObj = PersistenceUtil.getMethodElement(res);
-				if (eObj != null && eObj instanceof MethodElement) {
-					if (saveAll || res.isModified()) {
-//						// System.out.println("----> Start saving " + res);
-//						if (failSafe) {
-//							saveResources.add(res);
-//						} else {
-//							if (backupRequired) {
-//								// back up resource before saving
-//								//
-//								backup(res);
-//							}
-//
-//							if(MultiFileSaveUtil.save(res, options)) {
-//								savedResources.add(res);
-//								if(res instanceof MultiFileXMIResourceImpl) {
-//									((MultiFileXMIResourceImpl)res).updateTimeStamps();
-//								}
-//							}
-//						}
-//						// System.out.println("<---- Saved resource: " + res);
-						
-						saveResources.add(res);
-					}
-				}
-			}
-
-			if(!saveResources.isEmpty()) {
-				Resource libResource = getMethodLibraryResource();
-				if(!saveResources.contains(libResource) && PersistenceUtil.checkToolVersion(libResource) != 0) {
-					saveResources.add(libResource);
-				}
-				if(MultiFileXMISaveImpl.checkModifyRequired(options)) {
-					checkModify(saveResources);
-				}
-				if (failSafe) {
-					try {
-						save(saveResources, options, false);
-						persister.commit();
-						persister.adjustLocation(moveResources);
-					} catch (Exception e) {
-						persister.rollback();
-						throw e;
-					}
-				} else {
-					for (Iterator iter = saveResources.iterator(); iter
-							.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						if(MultiFileSaveUtil.save(resource, options)) {
-							if(resource instanceof MultiFileXMIResourceImpl) {
-								((MultiFileXMIResourceImpl)resource).updateTimeStamps();
-							}
-						}
-					}
-					for (Iterator iter = moveResources.iterator(); iter.hasNext();) {
-						Resource resource = (Resource) iter.next();
-						MultiFileSaveUtil.adjustLocation(resource,
-								modifiedResources);
-					}
-					Collection saved = saveModifiedResources(options);
-					if (saved != null) {
-						for (Iterator iter = saved.iterator(); iter.hasNext();) {
-							Resource resource = (Resource) iter.next();
-							if(resource instanceof MultiFileXMIResourceImpl) {
-								((MultiFileXMIResourceImpl)resource).updateTimeStamps();
-							}
-						}
-					}
-				}
-			}
-		} catch (Exception exception) {
-			handleException(exception);
-			throw exception;
-		} finally {
-			options.remove(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET);
-		}
-	}
-
-	/**
-	 * Saves the open library under a new location
-	 * 
-	 * @param newLocation
-	 *            directory to save the open library to
-	 * @param if
-	 *            true, regenerateGUID regenerate GUID for all MethodElements in
-	 *            the open library
-	 */
-	public void saveAs(String newLocation, boolean regenerateGUID,
-			IProgressMonitor monitor) throws Exception {
-		MethodLibrary lib = getMethodLibrary();
-		if (lib == null)
-			return;
-
-		// load all the resources in memory
-		//
-		if (monitor != null)
-			monitor.setTaskName(PersistenceResources.loadResourcesTask_name);
-		for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			if (regenerateGUID && element instanceof MethodElement) {
-				((MethodElement) element).setGuid(UmaUtil.generateGUID());
-			}
-			for (Iterator iterator = element.eCrossReferences().iterator(); iterator
-					.hasNext();) {
-				iterator.next();
-			}
-		}
-
-		// change URI of all loaded resources for new location
-		//
-		URI oldDir = URI.createFileURI(new File(lib.eResource().getURI()
-				.toFileString()).getParent()
-				+ File.separator);
-		URI newDir = URI.createFileURI(newLocation + File.separator);
-		for (Iterator iter = getResources().iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			resource.setURI(resource.getURI().replacePrefix(oldDir, newDir));
-		}
-
-		// clear the ResourceManager
-		//
-		ResourceManager resMgr = ((MultiFileURIConverter) getURIConverter())
-				.getResourceManager();
-		if (resMgr != null) {
-			resMgr.getResourceDescriptors().clear();
-		}
-
-		if (monitor != null)
-			monitor.setTaskName(PersistenceResources.saveLibraryTask_name);
-		save(null, true);
-	}
-	
-	protected boolean unloadWithoutRemove(MultiFileXMIResourceImpl resource) {
-		MethodElement e = PersistenceUtil.getMethodElement(resource);
-		resource.unloadWithoutRemove();
-		if(e instanceof MethodConfiguration) {
-			MethodLibrary lib = getMethodLibrary();
-			if(lib != null) {
-				lib.getPredefinedConfigurations().remove(e);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @throws IOException
-	 * 
-	 */
-	private void cleanUp() throws IOException {
-		MethodLibrary library = getMethodLibrary();
-		List removedResources = new ArrayList();
-
-		List list = getResources();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			Resource res = (Resource) list.get(i);
-			boolean remove = false;
-			if (res.getContents().isEmpty()) {
-				System.out
-						.println("MultiFileResourceSetImpl.cleanUp(): empty resource: " + res); //$NON-NLS-1$
-				remove = true;
-			} else {
-				MethodElement eObj = PersistenceUtil.getMethodElement(res);
-				if (eObj == null
-						|| (eObj != library && eObj.eContainer() == null)) {
-					if (eObj == null) {
-						System.out
-								.println("MultiFileResourceSetImpl.cleanUp(): resource without any MethodElement: " + res); //$NON-NLS-1$
-						remove = true;
-					}
-					// some resources might be loaded directly, not thru its
-					// container. Therefore, we cannot assume
-					// that a object without a container in a loaded resource is
-					// a removed object.
-					//
-					else if (eObj != library && eObj.eContainer() == null) {
-						System.out
-								.println("MultiFileResourceSetImpl.cleanUp(): resource without a container: " + res); //$NON-NLS-1$
-					}
-				}
-			}
-			if (remove) {
-				// This is a removed object. Add its path to the list for
-				// removing its files later.
-				//
-				removedResources.add(res);
-			}
-		}
-
-		// do clean-up
-		//
-		System.out
-				.println("MultiFileResourceSetImpl.cleanUp(): removed resources: " + removedResources); //$NON-NLS-1$
-
-		for (Iterator iter = removedResources.iterator(); iter.hasNext();) {
-			Resource res = (Resource) iter.next();
-
-			try {
-				// remove ResourceDescriptor of the removed resource
-				//
-				cleanUp(res);
-			} catch (Exception e) {
-				handleException(e);
-			}
-		}
-
-		// getResources().removeAll(removedResources);
-	}
-	
-	/**
-	 * Prepares the library for saving
-	 */
-	private void prepareSave(MethodLibrary library) {
-		// check if the library already has a ResourceManager
-		// if not, create ResourceManager for it
-		//
-		MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) library
-				.eResource();
-		ResourceManager libResMgr = MultiFileSaveUtil.addResourceManager(resource);
-		if(libResMgr != null) {
-			MultiFileSaveUtil.registerWithResourceManager(libResMgr, library,
-					resource.getFinalURI());
-		}
-
-		List models = library.getMethodPlugins();
-		int size = models.size();
-		for (int i = 0; i < size; i++) {
-			prepareSave((MethodPlugin) models.get(i));
-		}
-
-		for (int i = 0; i < size; i++) {
-			cleanUp((MethodPlugin) models.get(i));
-		}
-	}
-
-	private static void cleanUp(MethodPlugin plugin) {
-		for (int i = 0; i < PROCESS_PACKAGE_PATHS.length; i++) {
-			ProcessPackage pkg = (ProcessPackage) UmaUtil.findMethodPackage(
-					plugin, PROCESS_PACKAGE_PATHS[i]);
-			if (pkg != null) {
-				cleanUpProcesses(pkg);
-			}
-		}
-	}
-
-	private void prepareSave(MethodPlugin model) {
-		for (int i = 0; i < PROCESS_PACKAGE_PATHS.length; i++) {
-			ProcessPackage pkg = (ProcessPackage) UmaUtil.findMethodPackage(
-					model, PROCESS_PACKAGE_PATHS[i]);
-			if (pkg != null) {
-				prepareSave(pkg);
-			}
-		}
-	}
-
-	/**
-	 * Removes process packages of unused activities.
-	 * 
-	 * @param pkg
-	 */
-	private static void cleanUpProcesses(ProcessPackage pkg) {
-		List list = pkg.getChildPackages();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			Object obj = list.get(i);
-			if (obj instanceof ProcessComponent) {
-				ProcessComponent procComp = (ProcessComponent) obj;
-				List packages = new ArrayList();
-				for (Iterator iter = procComp.getChildPackages().iterator(); iter
-						.hasNext();) {
-					Object element = (Object) iter.next();
-					if (element instanceof ProcessPackage) {
-						getRemovedPackages((ProcessPackage) element, packages);
-					}
-				}
-				for (Iterator iterator = packages.iterator(); iterator
-						.hasNext();) {
-					EcoreUtil.remove((EObject) iterator.next());
-				}
-			}
-		}
-	}
-
-	private static void getRemovedPackages(ProcessPackage pkg,
-			List removedPackages) {
-		// find activity
-		//
-		Activity act = getActivity(pkg);
-
-		if (act == null || getParent(act) == null) {
-			// Invalid process package. It does not contain any activity.
-			// Add it to the list of packages to be removed.
-			//
-			removedPackages.add(pkg);
-		} else {
-			for (Iterator iter = pkg.getChildPackages().iterator(); iter
-					.hasNext();) {
-				Object element = (Object) iter.next();
-				if (element instanceof ProcessPackage) {
-					getRemovedPackages((ProcessPackage) element,
-							removedPackages);
-				}
-			}
-		}
-	}
-
-	private static Activity getActivity(ProcessPackage pkg) {
-		// find activity
-		//
-		Activity act = null;
-		for (Iterator iter = pkg.getProcessElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Activity) {
-				act = (Activity) element;
-				break;
-			}
-		}
-		return act;
-	}
-
-	private static Object getParent(BreakdownElement e) {
-		// ItemProviderAdapter adapter = (ItemProviderAdapter)
-		// TngUtil.getAdapter(e, IBSItemProvider.class);
-		// return adapter == null ? null : adapter.getParent(e);
-
-		return UmaUtil.getParentActivity(e);
-	}
-
-	/**
-	 * Creates process package for those activities that still don't belong to
-	 * any process package.
-	 */
-	private void prepareSave(ProcessPackage pkg) {
-		List list = pkg.getChildPackages();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			Object obj = list.get(i);
-			if (obj instanceof ProcessComponent) {
-				prepareSave((ProcessComponent) obj);
-			}
-		}
-	}
-
-	private void prepareSave(ProcessComponent procComp) {
-		Process proc = procComp.getProcess();
-		if (proc != null) {
-			// associateAllAdapters(proc);
-			prepareSave(proc);
-
-			cleanUpDanglingDescriptors(procComp);
-
-			List danglingPkgs = new ArrayList();
-			for (Iterator iter = new ArrayList(procComp.getChildPackages())
-					.iterator(); iter.hasNext();) {
-				Object element = (Object) iter.next();
-				if (element instanceof ProcessPackage) {
-					ProcessPackage pkg = (ProcessPackage) element;
-					reorganize(pkg, danglingPkgs);
-				}
-			}
-
-			// clean up dangling ProcessPackages
-			//
-			for (Iterator iter = danglingPkgs.iterator(); iter.hasNext();) {
-				cleanUp((ProcessPackage) iter.next());
-			}
-
-		}
-	}
-
-	// /**
-	// * @param activity
-	// */
-	// private static void associateAllAdapters(Activity activity) {
-	// AdapterFactory adapterFactory =
-	// TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory();
-	// ItemProviderAdapter adapter = (ItemProviderAdapter)
-	// adapterFactory.adapt(activity, ITreeItemContentProvider.class);
-	// for (Iterator iter = adapter.getChildren(activity).iterator();
-	// iter.hasNext();) {
-	// Object element = iter.next();
-	// if(element instanceof Activity) {
-	// associateAllAdapters((Activity) element);
-	// }
-	// }
-	// }
-
-	/**
-	 * @param activity
-	 */
-	private static void prepareSave(Activity activity) {
-		ProcessPackage parentPkg = (ProcessPackage) activity.eContainer();
-		List elements = activity.getBreakdownElements();
-
-		// add new descriptors and other non-activity breakdown elements of the
-		// activity to its process package
-		//
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			if (!(element instanceof Activity) && element.eContainer() == null) {
-				parentPkg.getProcessElements().add(element);
-			}
-		}
-
-		// add new WorkOrder objects or remove unused WorkOrder objects of this
-		// activity
-		//
-		for (Iterator iter = activity.getLinkToPredecessor().iterator(); iter
-				.hasNext();) {
-			WorkOrder workOrder = (WorkOrder) iter.next();
-			if (workOrder.eContainer() == null) {
-				if (workOrder.getPred() != null
-						&& getParent(workOrder.getPred()) != null) {
-					parentPkg.getProcessElements().add(workOrder);
-				}
-			} else {
-				if (workOrder.getPred() == null
-						|| getParent(workOrder.getPred()) == null) {
-					if (MultiFileSaveUtil.DEBUG) {
-						System.err.println("Invalid WorkOrder: " + workOrder); //$NON-NLS-1$
-					}
-					parentPkg.getProcessElements().remove(workOrder);
-				}
-			}
-		}
-
-		// removed unused diagrams
-		//
-		for (Iterator iter = parentPkg.getDiagrams().iterator(); iter.hasNext();) {
-			Diagram diagram = (Diagram) iter.next();
-			SemanticModelBridge bridge = diagram.getSemanticModel();
-			if (bridge instanceof UMASemanticModelBridge) {
-				MethodElement element = ((UMASemanticModelBridge) bridge)
-						.getElement();
-				if (element instanceof Activity
-						&& (!(element instanceof Process) && getParent((Activity) element) == null)) {
-					iter.remove();
-				}
-			}
-		}
-
-		int size = elements.size();
-		for (int i = 0; i < size; i++) {
-			Object e = elements.get(i);
-			if (e instanceof Activity) {
-				Activity act = (Activity) e;
-				if (act.eContainer() == null) {
-					ProcessPackage pkg = UmaFactory.eINSTANCE
-							.createProcessPackage();
-					pkg.setName(act.getName());
-					pkg.getProcessElements().add(act);
-					List descriptors = new ArrayList();
-					for (int j = 0; j < act.getBreakdownElements().size(); j++) {
-						Object obj = act.getBreakdownElements().get(j);
-						if (obj instanceof Descriptor) {
-							descriptors.add(obj);
-						}
-					}
-					pkg.getProcessElements().addAll(descriptors);
-
-					parentPkg.getChildPackages().add(pkg);
-					// System.out.println("Process package created for activity:
-					// '" + act.getName() + "'");
-				}
-				prepareSave(act);
-			}
-		}
-	}
-
-	private static void cleanUpDanglingDescriptors(ProcessPackage pkg) {
-		for (Iterator iter = pkg.getProcessElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof BreakdownElement
-					&& ((BreakdownElement) element).getSuperActivities() == null) {
-				boolean remove = false;
-				if (element instanceof RoleDescriptor) {
-					if (AssociationHelper.getTeamProfiles(
-							(RoleDescriptor) element).isEmpty()) {
-						remove = true;
-					}
-				} else if (element instanceof WorkProductDescriptor) {
-					if (AssociationHelper.getDeliverableDescriptors(
-							(WorkProductDescriptor) element).isEmpty()) {
-						remove = true;
-					}
-				} else if (element instanceof TeamProfile) {
-					if (((TeamProfile) element).getSuperTeam() == null) {
-						remove = true;
-					}
-				} else {
-					remove = true;
-				}
-
-				if (remove) {
-					iter.remove();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Moves the process packages to the right location in the tree if needed.
-	 * 
-	 * @param pkg
-	 * @param danglingPkgs
-	 */
-	private void reorganize(ProcessPackage pkg, List danglingPkgs) {
-		Activity act = getActivity(pkg);
-		if (act == null)
-			return;
-
-		// make sure the package has the same name as the activity's name
-		//
-		if (!pkg.getName().equals(act.getName())) {
-			pkg.setName(act.getName());
-		}
-
-		// check if the container of pkg is actually holding the parent activity
-		// of act
-		//
-		EObject parentAct = (EObject) getParent(act);
-
-		if (parentAct == null) {
-			// cleanUpResourceDescriptors(pkg);
-			// cleanUp(pkg);
-			// return;
-			danglingPkgs.add(pkg);
-		} else if (parentAct != getActivity((ProcessPackage) pkg.eContainer())) {
-			// move the package to the right location, under the process package
-			// of parentAct
-			//
-			ProcessPackage parentPkg = (ProcessPackage) parentAct.eContainer();
-			parentPkg.getChildPackages().add(pkg);
-		}
-
-		if (parentAct != null) {
-			cleanUpDanglingDescriptors(pkg);
-		}
-
-		for (Iterator iter = pkg.getChildPackages().iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if (element instanceof ProcessPackage) {
-				reorganize((ProcessPackage) element, danglingPkgs);
-			}
-		}
-	}
-
-	public Map getGuidToMethodElementMap() {
-		if (guidToMethodElementMap == null) {
-			guidToMethodElementMap = new HashMap();
-		}
-		return guidToMethodElementMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.impl.BasicNotifierImpl#eNotify(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void eNotify(Notification notification) {
-		try {
-			super.eNotify(notification);
-		} catch (RuntimeException e) {
-			CommonPlugin.INSTANCE
-					.log("ERROR notifying changes: resourceSet=" + this + ", notification=" + notification); //$NON-NLS-1$ //$NON-NLS-2$
-			CommonPlugin.INSTANCE.log(e);
-			e.printStackTrace();
-		}
-	}
-
-	public void addMarker(Exception e) {
-		try {
-			// insert problem marker
-			//
-			markerMananger.notifyException(e);
-		} catch (RuntimeException ex) {
-			CommonPlugin.INSTANCE.log(ex);
-			if (MultiFileSaveUtil.DEBUG) {
-				ex.printStackTrace();
-			}
-		}
-	}
-
-	public void setLoading(boolean b) {
-		loading = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.ecore.IExceptionCollector#collect(java.lang.Exception)
-	 */
-	public void notifyException(Exception e) {
-		if (loadingResourceManagerTree) {
-			if (e instanceof ResolveException) {
-				if (((ResolveException) e).exception() instanceof MultiFileIOException) {
-					return;
-				}
-			}
-		}
-		try {
-			addMarker(e);
-		} catch (Exception ex) {
-			//
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.ecore.IProxyResolutionListener#proxyResolved(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void proxyResolved(Object proxy, Object resolved) {
-		if(resolved instanceof MethodElement) {
-			String guid = MultiFileSaveUtil.getGuid(resolved);
-			if (guid != null) {
-				getGuidToMethodElementMap().put(guid, resolved);
-			}
-		}
-		markerMananger.proxyResolved(proxy, resolved);
-	}
-
-	private EObject getEObjectByGUID(String guid) {
-		return (EObject) getGuidToMethodElementMap().get(guid);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.uma.ecore.IUmaResourceSet#getEObject(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.common.util.URI, boolean)
-	 */
-	public EObject getEObject(EObject resolver, URI uri, boolean loadOnDemand) {
-		// long start;
-		// if(MultiFileSaveUtil.PROFILE) {
-		// start = System.currentTimeMillis();
-		// }
-
-		URI normalized = ((MultiFileURIConverter) getURIConverter()).normalize(
-				uri, resolver);
-		if (normalized == null) {
-			// work-around to look up for object by its GUID in case it had been
-			// moved to other resource
-			//
-			String guid = uri.fragment();
-			EObject eObject = getEObjectByGUID(guid);
-			if (eObject != null) {
-				return eObject;
-			}
-
-			String msg = NLS.bind(PersistenceResources.normalizeURIError_msg,
-					uri);
-			throw new UnnormalizedURIException(msg);
-		}
-		Resource resource = getResource(normalized.trimFragment(), loadOnDemand);
-		if (resource != null) {
-			String fragment = normalized.fragment();
-			if (fragment == null || fragment.length() == 0) {
-				return PersistenceUtil.getMethodElement(resource);
-			}
-			EObject eObject = resource.getEObject(fragment);
-			if (eObject == null && !fragment.equals(uri.authority())) {
-				// work-around to look up for object by its GUID in case it had
-				// been moved
-				//
-				return getEObjectByGUID(fragment);
-			}
-			return eObject;
-		} else {
-			return null;
-		}
-
-		// if(MultiFileSaveUtil.PROFILE) {
-		//			
-		// }
-	}
-
-	// /**
-	// * @return Returns the exceptions.
-	// */
-	// public List getExceptions() {
-	// return exceptions;
-	// }
-
-	public void loadOppositeFeatures(List oppositeFeatures) {
-		int max = oppositeFeatures.size() - 1;
-		if (max < 0) {
-			return;
-		}
-		ArrayList elements = new ArrayList(getGuidToMethodElementMap().values());
-		HashSet loadedElements = new HashSet();
-		while (!elements.isEmpty()) {
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof MethodElement) {
-					MethodElement element = (MethodElement) obj;
-					for (int i = max; i > -1; i--) {
-						EStructuralFeature eFeature = ((OppositeFeature) oppositeFeatures
-								.get(i)).getTargetFeature();
-						if (eFeature.getContainerClass().isInstance(element)) {
-							if (eFeature.isMany()) {
-								InternalEList list = (InternalEList) element
-										.eGet(eFeature);
-								if (!list.isEmpty()) {
-									for (Iterator iterator = list.iterator(); iterator
-											.hasNext();) {
-										iterator.next();
-									}
-								}
-							} else {
-								element.eGet(eFeature);
-							}
-						}
-					}
-				}
-			}
-
-			// gets the newly loaded elements to load their opposite features
-			//
-			loadedElements.addAll(elements);
-			elements = new ArrayList(getGuidToMethodElementMap().values());
-			elements.removeAll(loadedElements);
-		}
-	}
-
-	public void loadOppositeFeatures(List oppositeFeatures, Set deletedGUIDs) {
-		int max = oppositeFeatures.size() - 1;
-		if (max < 0) {
-			return;
-		}
-		ArrayList elements = new ArrayList(getGuidToMethodElementMap().values());
-		HashSet loadedElements = new HashSet();
-		while (!elements.isEmpty()) {
-			for (Iterator iter = elements.iterator(); iter.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof MethodElement) {
-					MethodElement element = (MethodElement) obj;
-					MultiResourceEObject mrEObject = ((MultiResourceEObject) element);
-					for (int i = max; i > -1; i--) {
-						OppositeFeature oppositeFeature = ((OppositeFeature) oppositeFeatures
-								.get(i));
-						EStructuralFeature eFeature = oppositeFeature.getTargetFeature();
-						if (eFeature.getContainerClass().isInstance(element)) {
-							if (eFeature.isMany()) {
-								InternalEList list = (InternalEList) element
-										.eGet(eFeature);
-								if (!list.isEmpty()) {
-									boolean resolve = false;
-									check_resolve: for (Iterator iterator = list
-											.basicIterator(); iterator
-											.hasNext();) {
-										InternalEObject e = (InternalEObject) iterator
-												.next();
-										if (e.eIsProxy()) {
-											String guid = e.eProxyURI()
-													.fragment();
-											if (deletedGUIDs.contains(guid)) {
-												resolve = true;
-												break check_resolve;
-											}
-										}
-									}
-									if (resolve) {
-										Collection<Object> deletedElements = new HashSet<Object>();
-										for (Iterator iterator = list
-												.iterator(); iterator.hasNext();) {
-											Object o = iterator.next();
-											if(o instanceof MethodElement && deletedGUIDs.contains(((MethodElement) o).getGuid())) {
-												deletedElements.add(o);
-											}
-										}
-										for (Object e : deletedElements) {
-											if(oppositeFeature.isMany()) {
-												mrEObject.oppositeAdd(oppositeFeature, e);
-											}
-											else {
-												mrEObject.getOppositeFeatureMap().put(oppositeFeature, e);
-											}
-										}										
-									}
-								}
-							} else {
-								Object value = element.eGet(eFeature, false);
-								if (value instanceof InternalEObject) {
-									InternalEObject e = (InternalEObject) value;
-									if (e.eIsProxy()) {
-										String guid = e.eProxyURI().fragment();
-										if (deletedGUIDs.contains(guid)) {
-											Object o = element.eGet(eFeature);
-											if(oppositeFeature.isMany()) {
-												mrEObject.oppositeAdd(oppositeFeature, o);
-											}
-											else {
-												mrEObject.getOppositeFeatureMap().put(oppositeFeature, o);
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-			// gets the newly loaded elements to load their opposite features
-			//
-			loadedElements.addAll(elements);
-			elements = new ArrayList(getGuidToMethodElementMap().values());
-			elements.removeAll(loadedElements);
-		}
-	}
-
-	public boolean hasUnresolvedProxy() {
-		return markerMananger.hasUnresolvedProxy();
-	}
-
-	protected Map getURIToTempURIMap() {
-		if (URIToTempURIMap == null) {
-			URIToTempURIMap = new HashMap();
-		}
-
-		return URIToTempURIMap;
-	}
-
-	public UnresolvedProxyMarkerManager getMarkerMananger() {
-		return markerMananger;
-	}
-	
-	private void checkModify(Collection<Resource> resources) throws LibraryResourceException {
-		if(!resources.isEmpty()) {
-			Resource[] resourceArray = new Resource[resources.size()];
-			resources.toArray(resourceArray);
-			checkModify(resourceArray, PersistencePlugin.getDefault().getContext()/*MsgBox.getDefaultShell()*/);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#checkModify(org.eclipse.epf.library.persistence.ILibraryResource[], java.lang.Object)
-	 */
-	public void checkModify(Resource[] resources, Object context) throws LibraryResourceException {		
-		MultiFileSaveUtil.doCheckModify(Arrays.asList(resources));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#checkModify(java.util.Collection<EObject>, java.lang.Object)
-	 */
-	public IStatus checkModify(Collection<EObject> eObjects, Object context) {
-		HashSet pathSet = new HashSet();
-		for (Iterator iter = eObjects.iterator(); iter.hasNext();) {
-			EObject o = (EObject) iter.next();
-			Resource resource = o.eResource();
-			if(resource != null && resource.getResourceSet() == this) {
-				MultiFileXMIResourceImpl mfResource = (MultiFileXMIResourceImpl) resource;
-				if(!mfResource.hasTempURI()) {
-					String path = mfResource.getURI().toFileString();
-					pathSet.add(path);
-				}
-			}
-		}
-		if(pathSet.isEmpty()) {
-			return Status.OK_STATUS;
-		}
-		String[] paths = new String[pathSet.size()];
-		pathSet.toArray(paths);
-		return FileManager.getInstance().checkModify(paths, context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#getPersister()
-	 */
-	public ILibraryPersister getPersister() {
-		return MethodLibraryPersister.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#unload(org.eclipse.emf.ecore.resource.Resource, java.util.Map)
-	 */
-	public boolean unload(Resource resource, Map options) {
-		if(resource instanceof MultiFileXMIResourceImpl) {
-			return unloadWithoutRemove((MultiFileXMIResourceImpl) resource);
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#unload()
-	 */
-	public void unload() {
-		reset();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#getFirstMethodLibrary()
-	 */
-	public MethodLibrary getFirstMethodLibrary() {
-		return getMethodLibrary();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#getMethodLibraries()
-	 */
-	public List getMethodLibraries() {
-		MethodLibrary lib = getMethodLibrary();
-		if(lib == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return Collections.singletonList(lib);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#loadMethodLibraries(org.eclipse.emf.common.util.URI, java.util.Map)
-	 */
-	public void loadMethodLibraries(URI uri, Map<?, ?> parameters) throws LibraryResourceException {
-		try {
-			loadLibrary(uri.toFileString());
-		} catch (Exception e) {
-			if(e instanceof RuntimeException) {
-				throw (RuntimeException)e;
-			}
-			throw new LibraryResourceException(e);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#getPersistenceType()
-	 */
-	public String getPersistenceType() {
-		return Services.XMI_PERSISTENCE_TYPE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#unload(org.eclipse.emf.ecore.EObject)
-	 */
-	public boolean unload(EObject object) {
-		Resource resource = object.eResource();
-		if(resource instanceof MultiFileXMIResourceImpl) {
-			((MultiFileXMIResourceImpl)resource).unloaded((InternalEObject) object);
-			return true;
-		}		
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSet#reloadObjects(java.util.Collection)
-	 */
-	public Collection reloadObjects(Collection objects) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public Resource getResource(IResource wsRes) {
-		IPath path = wsRes.getLocation();
-		return path != null ? PersistenceUtil.getResource(path, this) : null;
-	}
-
-//	public Collection<Resource> getContainedResources(IResource wsRes) {
-//		return Collections.EMPTY_LIST;		
-//	}
-	
-	public Collection<Resource> loadNewResources() {
-		return loadConfigurations();
-	}
-	
-	public void handleLibraryMoved(String newFolder) {
-		PersistenceUtil.replaceURIPrefix(new ArrayList<Resource>(getResources()), libFolderPath.toOSString(), newFolder);
-		
-		// clear cached resolved URI in all ResourceDescriptors
-		//
-		ResourceManager resMgr = getRootResourceManager();
-		Iterator iterator = new AbstractTreeIterator(resMgr, false) {
-			private static final long serialVersionUID = 1L;
-
-			protected Iterator getChildren(Object object) {
-				ResourceManager resMgr = (ResourceManager) object;
-				return resMgr.getSubManagers().iterator();
-			}
-
-		};
-		while (iterator.hasNext()) {
-			ResourceManager mgr = (ResourceManager) iterator.next();
-			for(ResourceDescriptor resDesc : mgr.getResourceDescriptors()) {
-				resDesc.clearResolvedURI();
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileSaveUtil.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileSaveUtil.java
deleted file mode 100644
index 33864e6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileSaveUtil.java
+++ /dev/null
@@ -1,1667 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.persistence.LibraryResourceException;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.resourcemanager.ResourcemanagerFactory;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.text.SimpleDateFormat;
-import com.ibm.icu.util.Calendar;
-
-/**
- * Utility class with static routines for XMI persistence
- * 
- * @author Phong Nguyen Le
- * @author Jinhua Xi
- * @since 1.0
- */
-public final class MultiFileSaveUtil {
-
-	public static final String DEFAULT_MODEL_FILENAME = "model.xmi"; //$NON-NLS-1$
-
-	public static final String DEFAULT_CONTENT_FILENAME = "content.xmi"; //$NON-NLS-1$
-
-	public static final String DEFAULT_LIBRARY_MODEL_FILENAME = "library.xmi"; //$NON-NLS-1$
-	
-	public static final String DEFAULT_PLUGIN_EXPORT_FILENAME = "export.xmi"; //$NON-NLS-1$
-
-	public static final String DEFAULT_PLUGIN_MODEL_FILENAME = "plugin.xmi"; //$NON-NLS-1$
-
-	public static final String DEFAULT_FILE_EXTENSION = ".xmi"; //$NON-NLS-1$
-
-	public static final String LIBRARY_FILE_EXTENSION = "uma"; //$NON-NLS-1$
-
-	public static final String CAPABILITY_PATTERN_PATH = "capabilitypatterns"; //$NON-NLS-1$
-
-	public static final String DELIVERY_PROCESS_PATH = "deliveryprocesses"; //$NON-NLS-1$
-
-	public static final String PROCESS_CONTRIBUTION_PATH = "processcontributions"; //$NON-NLS-1$
-
-	public static final String METHOD_CONFIGURATION_FOLDER_NAME = "configurations"; //$NON-NLS-1$
-
-	public static final boolean DEBUG = PersistencePlugin.getDefault()
-			.isDebugging();
-
-	static final boolean PROFILE = false;
-
-	private static final SimpleDateFormat dateFormatter = new SimpleDateFormat(
-			"yyMMddHHmmss.S"); //$NON-NLS-1$
-
-	public static boolean isValidFileName(String name) {
-		if (name == null)
-			return false;
-		if (name.indexOf('/') != -1 || name.indexOf('\\') != -1
-				|| name.indexOf(':') != -1 || name.indexOf('*') != -1
-				|| name.indexOf('?') != -1 || name.indexOf('"') != -1
-				|| name.indexOf('<') != -1 || name.indexOf('>') != -1
-				|| name.indexOf('|') != -1)
-			return false;
-		return true;
-	}
-
-	public static String getPath(MethodElement e) {
-		StringBuffer strBuff = new StringBuffer(String.valueOf(e.getName()));
-		for (e = (MethodElement) ((EObject) e).eContainer(); e != null; e = (MethodElement) ((EObject) e)
-				.eContainer()) {
-			strBuff.insert(0, String.valueOf(e.getName()) + " > "); //$NON-NLS-1$
-		}
-		return strBuff.toString();
-	}
-
-	public static String createDirName(MethodElement obj) {
-		String name = ((MethodElement) obj).getName();
-		if (isValidFileName(name))
-			return name;
-		throw new MultiFileIOException(NLS.bind(
-				PersistenceResources.invalidNameError_msg, name), obj);
-	}
-
-	public static EObject resolve(EObject proxy) {
-		if (!(proxy instanceof InternalEObject))
-			return proxy;
-		InternalEObject obj = (InternalEObject) proxy;
-		if (obj.eProxyURI() == null)
-			return proxy;
-		XMIResourceImpl res = new XMIResourceImpl(obj.eProxyURI());
-		try {
-			res.load(null);
-			return PersistenceUtil.getMethodElement(res);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		return proxy;
-	}
-
-	static Resource save(EObject o, URI uri, Map options) {
-		ResourceSet resourceSet = o.eResource().getResourceSet();
-		MultiFileXMIResourceImpl resource = save(resourceSet, o, uri, options);
-
-		if (options == null) {
-			options = ((MultiFileResourceSetImpl) resourceSet)
-					.getDefaultSaveOptions();
-		}
-		String str = (String) options
-				.get(MultiFileXMISaveImpl.REFRESH_NEW_RESOURCE);
-		if (str != null && Boolean.valueOf(str).booleanValue()) {
-			// notify RefreshJob the this resource is saved so it will not be
-			// reloaded after refreshing it
-			//
-			RefreshJob.getInstance().resourceSaved(resource);
-
-			// refresh the newly created resource so it is in synch with the
-			// workspace
-			//
-			FileManager.getInstance().refresh(resource);
-		}
-
-		return resource;
-	}
-
-	public static boolean canSaveTogether(Map options, Object obj) {
-		Set saveTogetherClasses = (Set) options
-				.get(MultiFileXMISaveImpl.SAVE_TOGETHER_CLASS_SET);
-		if (saveTogetherClasses == null)
-			return false;
-		for (Iterator iter = saveTogetherClasses.iterator(); iter.hasNext();) {
-			EClass eCls = (EClass) iter.next();
-			if (eCls.isInstance(obj))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Adds the given object to the given resource while still preserving
-	 * object's container reference.
-	 * 
-	 * @param resource
-	 * @param o
-	 */
-	private static void addTo(Resource resource, MultiResourceEObject o) {
-		BasicEList contents = ((BasicEList) resource.getContents());
-		if (contents.isEmpty()) {
-			// this will flag resource as loaded
-			//
-			contents.clear();
-
-			contents.setData(1, new Object[] { o });
-		} else {
-			Object[] data = contents.toArray();
-			Object[] newData = new Object[data.length + 1];
-			System.arraycopy(data, 0, newData, 0, data.length);
-			newData[data.length] = o;
-			contents.setData(newData.length, newData);
-		}
-		o.eSetResource((Resource.Internal) resource);
-	}
-
-	/**
-	 * Saves a new contained EObject in its own new resource.
-	 * 
-	 * @param o
-	 * @param uri
-	 * @param options
-	 */
-	private static MultiFileXMIResourceImpl save(ResourceSet resourceSet,
-			EObject o, URI uri, Map options) {
-		return save(resourceSet, o, uri, options, true);
-	}
-	
-	static MultiFileXMIResourceImpl save(ResourceSet resourceSet,
-			EObject o, URI uri, Map options, boolean registerWithResourceManager) {
-		// Detach the object from container resource
-		//
-		MultiResourceEObject mrEObj = (MultiResourceEObject) o;
-		MultiFileXMIResourceImpl currentResource = (MultiFileXMIResourceImpl) o
-				.eResource();
-
-		if (currentResource != null) {
-			currentResource.detached(o);
-		}
-
-		List newResourceDescriptors = null;
-		Set modifiedResources = (Set) options
-				.get(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET);
-
-		MultiFileXMIResourceImpl res = null;
-		if (canSaveTogether(options, o)) {
-			MultiFileResourceSetImpl mfResourceSet = ((MultiFileResourceSetImpl) resourceSet);
-
-			// if the uri has a temporary URI, use it instead to locate the
-			// resource that is in process of saving
-			//
-			URI tempURI = (URI) mfResourceSet.getURIToTempURIMap().get(uri);
-			if (tempURI != null) {
-				uri = tempURI;
-			}
-
-			res = (MultiFileXMIResourceImpl) mfResourceSet.getResource(uri);
-			if (res != null) {
-				if (!res.getContents().contains(o)) {
-					if (res.getFinalURI() == res.getURI()) {
-						if (MultiFileXMISaveImpl.checkModifyRequired(options)) {
-							// not a temp file of fail-safe persistence
-							// transaction
-							// check for writeable
-							//
-							MultiFileSaveUtil.checkModify(res);
-						}
-					}
-
-					addTo(res, mrEObj);
-
-					ResourceDescriptor desc = null;
-					try {
-						if(registerWithResourceManager) {
-							// register this new object with ResourceManager
-							//
-							ResourceManager resMgr = getResourceManagerFor(o,
-									modifiedResources);
-							desc = registerWithResourceManager(resMgr, o, res
-									.getFinalURI());
-							if (desc != null && modifiedResources != null) {
-								modifiedResources.add(resMgr.eResource());
-							}
-						}
-
-						res.setModified(true);
-						mfResourceSet.save(res, options, false);
-
-						res.attachedAll(o);
-					} catch (Exception e) {
-						// rollback
-						//
-
-						// remove this object from the resource
-						res.getContents().remove(mrEObj);
-						mrEObj.eSetResource((Resource.Internal) null);
-
-						// remove the created ResourceDescriptor
-						if (desc != null) {
-							EcoreUtil.remove(desc);
-						}
-
-						// re-attach to container resource
-						if (currentResource != null) {
-							currentResource.attached(o);
-						}
-
-						throw new MultiFileIOException(e.getMessage());
-					}
-				}
-				return res;
-			}
-		}
-
-		res = (MultiFileXMIResourceImpl) resourceSet.createResource(uri);
-		addTo(res, mrEObj);
-		if(mrEObj instanceof MethodPlugin) {
-			addResourceManager(res);
-		}
-
-		Map objToContainerMap = null;
-		try {
-			if(registerWithResourceManager) {
-				newResourceDescriptors = registerWithResourceManager(res,
-					modifiedResources);
-			}
-
-			// back up the container references and set content object's
-			// container to null
-			//
-			objToContainerMap = removeContainers(res);
-
-			res.save(options);
-
-			res.attachedAll(o);
-		} catch (Exception e) {
-			CommonPlugin.INSTANCE.log(e);
-
-			// rollback
-			//
-
-			// remove the failed reousrce from the resource set
-			resourceSet.getResources().remove(res);
-			mrEObj.eSetResource((Resource.Internal) null);
-
-			// remove the created ResourceDescriptors
-			if(newResourceDescriptors != null && !newResourceDescriptors.isEmpty()) {
-				for (Iterator iter = newResourceDescriptors.iterator(); iter
-				.hasNext();) {
-					EcoreUtil.remove((EObject) iter.next());
-				}
-			}
-
-			// re-attach to container resource
-			if (currentResource != null) {
-				currentResource.attached(o);
-			}
-
-			throw new MultiFileIOException(e.getMessage());
-		} finally {
-			// restore the container references for the content objects
-			//
-			restoreContainers(res, objToContainerMap);
-		}
-
-		if(registerWithResourceManager) {
-			ResourceManager resMgr = addNewResourceManager(res);
-			if (resMgr == null) {
-				if (o instanceof MethodPlugin) {
-					// create new ResourceManager for new MethodPlugin
-					//
-					resMgr = getResourceManagerFor(o, modifiedResources);
-				}
-			} else if (modifiedResources != null) {
-				modifiedResources.add(resMgr.eContainer().eResource());
-			}
-		}
-
-		res.updateTimeStamps();
-
-		return res;
-	}
-
-	private static Map removeContainers(Resource resource) {
-		int size = resource.getContents().size();
-		Map objToContainerMap = new HashMap();
-		for (int i = 0; i < size; i++) {
-			MultiResourceEObject multiResEObj = (MultiResourceEObject) resource
-					.getContents().get(i);
-			InternalEObject container = (InternalEObject) multiResEObj
-					.eContainer();
-			if (container != null) {
-				objToContainerMap.put(multiResEObj, container);
-				multiResEObj.eBasicSetContainer(null, multiResEObj
-						.eContainerFeatureID());
-			}
-		}
-		return objToContainerMap;
-	}
-
-	/**
-	 * Gets the containers of objects in resource's contents
-	 * 
-	 * @param resource
-	 * @return map of object to container entries
-	 */
-	static Map getContainers(Resource resource) {
-		int size = resource.getContents().size();
-		Map objToContainerMap = new HashMap();
-		for (int i = 0; i < size; i++) {
-			MultiResourceEObject multiResEObj = (MultiResourceEObject) resource
-					.getContents().get(i);
-			InternalEObject container = (InternalEObject) multiResEObj
-					.eContainer();
-			if (container != null) {
-				objToContainerMap.put(multiResEObj, container);
-			}
-		}
-		return objToContainerMap;
-
-	}
-
-	/**
-	 * Restores the containers of the objects in resource's contents that
-	 * previously saved in a map returned from getContainers(Resource resource)
-	 * or removeContainers(Resource resource)
-	 * 
-	 * @param resource
-	 * @param objToContainerMap
-	 * @see #getContainers(Resource)
-	 * @see #removeContainers(Resource)
-	 */
-	private static void restoreContainers(Resource resource,
-			Map objToContainerMap) {
-		int size = resource.getContents().size();
-		for (int i = 0; i < size; i++) {
-			MultiResourceEObject multiResEObj = (MultiResourceEObject) resource
-					.getContents().get(i);
-			InternalEObject container = (InternalEObject) objToContainerMap
-					.get(multiResEObj);
-			if (container != null) {
-				multiResEObj.eBasicSetContainer(container, multiResEObj
-						.eContainerFeatureID());
-			}
-		}
-	}
-
-	public static void checkModify(Resource resource) {
-		checkModify(Collections.singleton(resource));
-	}
-
-	static void doCheckModify(Collection<Resource> resources) {
-		ArrayList<String> pathList = new ArrayList<String>();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			// skip checking on resource that is currently being saved to a temporary
-			// file
-			//
-			if(resource instanceof MultiFileXMIResourceImpl && ((MultiFileXMIResourceImpl)resource).hasTempURI()) {
-				continue;
-			}
-			pathList.add(FileManager.toFileString(resource.getURI()));
-		}
-		if(!pathList.isEmpty()) {
-			String[] paths = new String[pathList.size()];
-			pathList.toArray(paths);
-			IStatus status = FileManager.getInstance().checkModify(paths,
-					PersistencePlugin.getDefault().getContext()/*MsgBox.getDefaultShell()*/);
-			if (!status.isOK()) {
-				String msg = UmaUtil.getMessage(status);
-				if (msg == null) {
-					msg = NLS.bind(PersistenceResources.modifyFileError_msg, Arrays
-							.asList(paths));
-				}
-				throw new MultiFileIOException(msg);
-			}
-		}
-	}
-	
-	public static void checkModify(Collection<Resource> resources) {
-		Map<ILibraryResourceSet, Collection<Resource>> libResourceSetToResourcesMap = new HashMap<ILibraryResourceSet, Collection<Resource>>();
-		Collection<Resource> otherResources = new ArrayList<Resource>();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			ResourceSet resourceSet = resource.getResourceSet();
-			if(resourceSet instanceof ILibraryResourceSet) {
-				Collection<Resource> collection = libResourceSetToResourcesMap.get(resourceSet);
-				if(collection == null) {
-					collection = new ArrayList<Resource>();
-					libResourceSetToResourcesMap.put((ILibraryResourceSet) resourceSet, collection);					
-				}
-				collection.add(resource);
-			}
-			else {
-				otherResources.add(resource);
-			}
-		}
-		if(!libResourceSetToResourcesMap.isEmpty()) {
-			for (Iterator<Map.Entry<ILibraryResourceSet, Collection<Resource>>> iter = libResourceSetToResourcesMap.entrySet().iterator(); iter.hasNext();) {
-				Map.Entry<ILibraryResourceSet, Collection<Resource>> entry = iter.next();
-				ILibraryResourceSet resourceSet = entry.getKey();			
-				Resource[] resourceArray = new Resource[entry.getValue().size()];
-				entry.getValue().toArray(resourceArray);
-				try {
-					resourceSet.checkModify(resourceArray, PersistencePlugin.getDefault().getContext()/*MsgBox.getDefaultShell()*/);
-				} catch (LibraryResourceException e) {
-					throw new MultiFileIOException(e.getMessage());
-				}
-			}
-		}
-		if(!otherResources.isEmpty()) {
-			doCheckModify(otherResources);
-		}
-	}
-	
-	public static void checkOutOfSynch(Collection<Resource> resources, Map saveOptions) {
-		Collection<Resource> resourcesToCheckOutOfSynch;
-		Collection<Resource> overwritableResources = (Collection<Resource>) saveOptions.get(
-				ILibraryPersister.FailSafeMethodLibraryPersister.OPTIONS_OVERWRITABLE_RESOURCES);				
-		if(overwritableResources != null && !overwritableResources.isEmpty()) {
-			resourcesToCheckOutOfSynch = new ArrayList<Resource>(resources);
-			resourcesToCheckOutOfSynch.removeAll(overwritableResources);
-		}
-		else {
-			resourcesToCheckOutOfSynch = resources;
-		}
-		if(!resourcesToCheckOutOfSynch.isEmpty()) {
-			checkOutOfSynch(resourcesToCheckOutOfSynch);
-		}
-	}
-
-	private static void checkOutOfSynch(Collection resources) {
-		// check for out-of-synch
-		//
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			MultiFileXMIResourceImpl res = (MultiFileXMIResourceImpl) iter
-					.next();
-			if(res.isLoaded() && !res.hasTempURI()) {
-				File file = new File(res.getURI().toFileString());
-				if(file.exists()) {
-//					long lastModified = file.lastModified();
-//					if (res.getFileLastModified() != lastModified && !same(lastModified, res.getFileLastModified())) {
-//						String msg = NLS.bind(
-//								PersistenceResources.resourceOutOfSynch_msg, res
-//								.getURI().toFileString());
-//						throw new MultiFileIOException(msg);
-//					}
-					
-					if(!res.isSynchronized()) {
-						String msg = NLS.bind(
-								PersistenceResources.resourceOutOfSynch_msg,
-								res.getURI().toFileString());
-						throw new MultiFileIOException(msg);						
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Saves the existing own resource of a contained EObject. Adds resources
-	 * that have been modifed after this call to the MODIFIED_RESOURCE_SET of
-	 * the save options.
-	 * 
-	 * @param resource
-	 * @param options
-	 * @return true if the given resource has been saved successfully, false otherwise
-	 */
-	public static boolean save(Resource resource, Map options) {
-		if (resource.getContents().isEmpty())
-			return false;
-
-		Set modifiedResources = (Set) options
-				.get(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET);
-
-		// should not change resource location automatically without letting
-		// user know about it
-		//
-		// adjustLocation(resource, modifiedResources);
-
-		// back up the container references and set content object's container
-		// to null
-		//
-		Map objToContainerMap = removeContainers(resource);
-		try {
-			resource.save(options);
-		} catch (IOException e) {
-			e.printStackTrace();
-			throw new MultiFileIOException(e.getMessage());
-		} finally {
-			// restore the container references for the content objects
-			//
-			restoreContainers(resource, objToContainerMap);
-		}
-
-		ResourceManager resMgr = addNewResourceManager(resource);
-		if (resMgr != null && modifiedResources != null) {
-			modifiedResources.add(resMgr.eContainer().eResource());
-		}
-		
-		return true;
-	}
-
-	/**
-	 * 
-	 * @param resource
-	 * @return ResourceManager that is just added to the resource manager tree
-	 *         or null.
-	 */
-	private static ResourceManager addNewResourceManager(Resource resource) {
-		ResourceManager resMgr = getResourceManager(resource);
-		MethodElement e = PersistenceUtil.getMethodElement(resource);
-		EObject container = e.eContainer();
-		if (resMgr != null && container != null && resMgr.eContainer() == null) {
-			// new ResourceManager is added to the resource
-			//
-			ResourceManager parentResMgr = getResourceManager(container
-					.eResource());
-
-			// check if resMgr is already a sub manager of parentResMgr before
-			// adding it
-			//
-			if (!parentResMgr.getSubManagers().contains(resMgr)) {
-				parentResMgr.getSubManagers().add(resMgr);				
-				registerWithResourceManager(parentResMgr, e, MultiFileSaveUtil.getFinalURI(resource));
-				return resMgr;
-			}
-
-			// registerWithResourceManager(parentResMgr, resMgr,
-			// resMgr.eResource().getURI().appendFragment(resMgr.getGuid()));
-			// return resMgr;
-		}
-		return null;
-	}
-
-	private static String toFileString(EObject eObj) {
-		return eObj.eResource().getResourceSet().getURIConverter().normalize(
-				eObj.eResource().getURI()).toFileString();
-	}
-
-	static boolean hasOwnFolder(Object e) {
-		return e instanceof MethodPlugin || e instanceof ProcessComponent;
-	}
-
-	static boolean hasOwnResource(Object obj, Collection saveSeparatelyClassSet) {
-		if (obj instanceof MethodUnit)
-			return true;
-		if (saveSeparatelyClassSet == null)
-			return false;
-		for (Iterator iter = saveSeparatelyClassSet.iterator(); iter.hasNext();) {
-			EClass eCls = (EClass) iter.next();
-			if (eCls.isInstance(obj))
-				return true;
-		}
-		return false;
-	}
-
-	static URI createFileURI(MethodElement e) {
-		if (e.eContainer() == null)
-			return ((MultiFileXMIResourceImpl) e.eResource()).getFinalURI();
-
-		// Handle ProcessComponent specially. ProcessComponent objects are
-		// stored as following in the method library:
-		// <Method Library>
-		// |_ <Method Plugin>
-		// |_processes
-		// |_capability_patterns
-		// |_delivery_processes
-		// |_process_contributions
-		//
-		if (e instanceof ProcessComponent) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-			if(plugin == null) {
-				return null;
-			}
-			Resource resource = plugin.eResource();
-			if (resource == null) {
-			}
-			String pluginDir = null;
-			if(resource != null) {
-				pluginDir = new File(getFinalURI(resource).toFileString()).getParent();
-			}
-			else {
-				MethodLibrary lib = (MethodLibrary) plugin.eContainer();
-				if (lib != null) {
-					String libDir = new File(((MultiFileXMIResourceImpl) lib
-							.eResource()).getFinalURI().toFileString()).getParent();
-					pluginDir = libDir + File.separator + plugin.getName();
-				}
-			}
-			if(pluginDir == null) {
-				// plugin is already deleted
-				//
-				return null;
-			}
-
-			String relativeDir;
-			org.eclipse.epf.uma.Process proc = ((ProcessComponent) e)
-					.getProcess();
-			if (proc instanceof CapabilityPattern) {
-				relativeDir = CAPABILITY_PATTERN_PATH;
-			} else if (proc instanceof DeliveryProcess) {
-				relativeDir = DELIVERY_PROCESS_PATH;
-			} else {
-				relativeDir = ""; //$NON-NLS-1$
-			}
-
-			String path = pluginDir + File.separator + relativeDir
-					+ File.separator + e.getName() + File.separator
-					+ DEFAULT_MODEL_FILENAME;
-			return URI.createFileURI(path);
-		} else if (e instanceof BreakdownElementDescription) {
-			String dir = null;
-			try {
-				dir = new File(((MultiFileXMIResourceImpl) UmaUtil
-						.getProcessComponent(e).eResource()).getFinalURI()
-						.toFileString()).getParent();
-			} catch (RuntimeException ex) {
-				throw ex;
-			}
-			return URI.createFileURI(dir + File.separator
-					+ DEFAULT_CONTENT_FILENAME);
-		} else if (e instanceof ContentDescription) {
-			URI uri;
-			ContentDescription content = (ContentDescription) e;
-			String path = MethodLibraryPersister.getCorrectPath(content);
-			if (path == null) {
-				String dir = ((MultiFileXMIResourceImpl) e.eResource())
-						.getFinalURI().trimSegments(1).toFileString()
-						+ File.separator;
-				path = MethodLibraryPersister.getNextAvailableFileName(dir,
-						content);
-			}
-			uri = URI.createFileURI(path);
-			return uri;
-		} else if (e instanceof MethodConfiguration) {			
-			String dir = new StringBuffer(((MultiFileXMIResourceImpl) e
-					.eContainer().eResource()).getFinalURI().trimSegments(1)
-					.toFileString()).append(File.separator).append(
-					METHOD_CONFIGURATION_FOLDER_NAME).append(File.separator)
-					.toString();
-			String path = MethodLibraryPersister.getNextAvailableFileName(dir,
-					StrUtil.makeValidFileName(e.getName()),
-					(MultiResourceEObject) e);
-			return URI.createFileURI(path);
-		}
-
-		StringBuffer path = new StringBuffer();
-		EObject lastContainer = null;
-		for (MethodElement obj = (MethodElement) e.eContainer(); obj != null; obj = (MethodElement) obj
-				.eContainer()) {
-			lastContainer = obj;
-			if (obj instanceof MethodLibrary) {
-				path.insert(0, new File(((MultiFileXMIResourceImpl) obj
-						.eResource()).getFinalURI().toFileString())
-						.getParentFile().getAbsolutePath());
-				break;
-			} else {
-				path.insert(0, obj.getName()).insert(0, File.separatorChar);
-			}
-		}
-		if (lastContainer == null) {
-			return e.eResource() != null ? ((MultiFileXMIResourceImpl) e
-					.eResource()).getFinalURI() : null;
-		}
-		if (!(lastContainer instanceof MethodLibrary)) {
-			path.insert(0, new File(toFileString(lastContainer))
-					.getParentFile().getParentFile().getAbsolutePath());
-		}
-
-		String modelFileName;
-		if (e instanceof MethodPlugin) {
-			modelFileName = DEFAULT_PLUGIN_MODEL_FILENAME;
-		} else {
-			modelFileName = MultiFileSaveUtil.DEFAULT_MODEL_FILENAME;
-		}
-		URI uri = URI.createFileURI(path.toString() + File.separator
-				+ MultiFileSaveUtil.createDirName(e) + File.separator
-				+ modelFileName);
-		return uri;
-	}
-
-	public static void delete(File file) {
-		File[] files = file.listFiles();
-		if (files != null) {
-			for (int i = 0; i < files.length; i++) {
-				delete(files[i]);
-			}
-		}
-		file.delete();
-	}
-
-	/**
-	 * 
-	 * @param e
-	 * @param uri
-	 * @param modifiedResources
-	 *            output of resources that have been changed after this call.
-	 */
-	static void setURIMapping(EObject e, URI uri, Set modifiedResources) {
-		MultiFileURIConverter uriConverter = (MultiFileURIConverter) e
-				.eResource().getResourceSet().getURIConverter();
-		uriConverter.setURIMapping(e, uri, modifiedResources);
-	}
-
-	/**
-	 * 
-	 * @param resource
-	 * @param modifiedResources
-	 *            output of resources that have been changed after this call
-	 */
-	static void updateURIMappings(MultiFileXMIResourceImpl resource,
-			Set modifiedResources) {
-		updateURIMappings(resource, modifiedResources, true);
-	}
-
-	/**
-	 * Checks if the given resourceSet has the loaded resource with the given
-	 * uri
-	 * 
-	 * @param resourceSet
-	 * @param uri
-	 * @return
-	 */
-	static boolean hasLoadedResource(ResourceSet resourceSet, URI uri) {
-		for (Iterator iter = resourceSet.getResources().iterator(); iter
-				.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			if (resource.isLoaded() && resource.getURI().equals(uri)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Update the URIMappings with the final URI of the given resource
-	 * 
-	 * @param resource
-	 */
-	static void updateURIMappings(MultiFileXMIResourceImpl resource,
-			Set modifiedResources, boolean afterMove) {
-		updateURIMappings(resource, resource.getFinalURI(), modifiedResources,
-				afterMove);
-	}
-
-	static void updateURIMappings(MultiFileXMIResourceImpl resource, URI uri,
-			Set modifiedResources, boolean afterMove) {
-		// the resource URI has been changed, reset all the cached resolved URI
-		// in all offstring resource descriptors
-		// of its manager, if it has one.
-		//
-		HashMap oldURIToResourceDescriptorMap = null;
-		ResourceManager resMgr = getResourceManager(resource);
-		if (resMgr != null) {
-			oldURIToResourceDescriptorMap = new HashMap();
-			for (Iterator iter = resMgr.eAllContents(); iter.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof ResourceDescriptor) {
-					ResourceDescriptor desc = ((ResourceDescriptor) obj);
-					oldURIToResourceDescriptorMap.put(desc.getResolvedURI(),
-							desc);
-					if (afterMove) {
-						desc.clearResolvedURI();
-					}
-				}
-			}
-		}
-
-		if (!resource.getContents().isEmpty()) {
-			EObject element = PersistenceUtil.getMethodElement(resource);
-			// setURIMapping(element, resource.getFinalURI(),
-			// modifiedResources);
-			MultiFileURIConverter uriConverter = (MultiFileURIConverter) resource
-					.getResourceSet().getURIConverter();
-			uriConverter.setURIMapping(element, uri, modifiedResources,
-					afterMove);
-		}
-
-		// for (Iterator iter = resource.getContents().iterator();
-		// iter.hasNext();) {
-		// EObject element = (EObject) iter.next();
-		// setURIMapping(element, resource.getURI(), modifiedResources);
-		// }
-
-		if (oldURIToResourceDescriptorMap != null) {
-			// go thru the list of loaded resources in resource set to update
-			// the URI
-			//
-			for (Iterator iter = resource.getResourceSet().getResources()
-					.iterator(); iter.hasNext();) {
-				Resource res = (Resource) iter.next();
-				ResourceDescriptor desc = (ResourceDescriptor) oldURIToResourceDescriptorMap
-						.get(res.getURI());
-				if (desc != null) {
-					if (afterMove) {
-						res.setURI(desc.getResolvedURI());
-					} else if (res.isLoaded()) {
-						desc.clearResolvedURI();
-						res.setURI(desc.getResolvedURI());
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param resMgr
-	 * @param o
-	 * @param uri
-	 */
-	// private static void setUri(ResourceManager resMgr, MethodElement e, URI
-	// uri) {
-	// for (Iterator iter = resMgr.getResourceDescriptors().iterator();
-	// iter.hasNext();) {
-	// ResourceDescriptor resDesc = (ResourceDescriptor) iter.next();
-	// if(resDesc.getId().equals(e.getGuid())) {
-	// // change other URIs that are changed as result of this URI change
-	// //
-	// if(uri.fragment() == null) {
-	// URI oldDir = URI.createFileURI(new
-	// File(resDesc.getResolvedURI().toFileString()).getParent() +
-	// File.separator);
-	// URI newDir = URI.createFileURI(new File(uri.toFileString()).getParent() +
-	// File.separator);
-	// for (Iterator iterator = resMgr.getResourceDescriptors().iterator();
-	// iterator
-	// .hasNext();) {
-	// ResourceDescriptor element = (ResourceDescriptor) iterator.next();
-	// URI currentUri = element.getResolvedURI();
-	// URI newUri = currentUri.replacePrefix(oldDir, newDir);
-	// if(newUri != null) {
-	// element.setResolvedURI(newUri);
-	// }
-	// }
-	// }
-	// resDesc.setResolvedURI(uri);
-	// return;
-	// }
-	// }
-	// ResourceDescriptor resDesc =
-	// ResourcemanagerFactory.eINSTANCE.createResourceDescriptor();
-	// resDesc.setId(e.getGuid());
-	// resDesc.setResolvedURI(uri);
-	// resMgr.getResourceDescriptors().add(resDesc);
-	// }
-	/**
-	 * Gets the right ResourceManager for the given EObject, creates new
-	 * ResourceManager if it does not exist yet.
-	 * 
-	 * @param modifiedResources
-	 *            output of resources that have been changed after this call.
-	 */
-	static ResourceManager getResourceManagerFor(EObject eObj,
-			Set modifiedResources) {
-		Resource resource = eObj.eContainer() != null ? eObj.eContainer()
-				.eResource() : eObj.eResource();
-		ResourceManager resMgr = getResourceManager(resource);
-		if (resMgr == null) {
-			resMgr = ResourcemanagerFactory.eINSTANCE.createResourceManager();
-
-			// add to beginning of the resource's contents
-			//
-			resource.getContents().add(0, resMgr);
-
-			if (modifiedResources != null) {
-				modifiedResources.add(resource);
-			}
-			EObject container = getContainerWithDirectResource((InternalEObject) eObj);
-			if (container != null && container.eResource() != resource) {
-				ResourceManager parentResMgr = getResourceManagerFor(container,
-						modifiedResources);
-				if (parentResMgr != null) {
-					parentResMgr.getSubManagers().add(resMgr);
-					if (modifiedResources != null) {
-						modifiedResources.add(parentResMgr.eResource());
-					}
-				}
-			}
-		}
-
-		return resMgr;
-
-	}
-
-	static List registerWithResourceManager(MultiFileXMIResourceImpl resource,
-			Set modifiedResources) {
-		ResourceManager resMgr = getResourceManagerFor(
-				PersistenceUtil.getMethodElement(resource), modifiedResources);
-
-		List resourceDescriptors = new ArrayList();
-		for (Iterator iter = resource.getContents().iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if(element instanceof MethodElement) {
-				ResourceDescriptor resDesc = registerWithResourceManager(resMgr,
-						element, resource.getFinalURI());
-				if (resDesc != null) {
-					resourceDescriptors.add(resDesc);
-				}
-			}
-		}
-		if (!resourceDescriptors.isEmpty() && modifiedResources != null) {
-			modifiedResources.add(resMgr.eResource());
-		}
-		return resourceDescriptors;
-	}
-
-	public static ResourceDescriptor registerWithResourceManager(
-			ResourceManager resMgr, Object element, URI uri) {
-		String guid = getGuid(element);
-		if (resMgr.getResourceDescriptor(guid) == null) {
-			return createResourceDescriptor(resMgr, guid, uri);
-		} else {
-			return null;
-		}
-	}
-
-	// /**
-	// * Creates a new ResourceDescriptor for the given MethodElement and add it
-	// to the given ResourceManager
-	// *
-	// * @param e
-	// * @return newly added ResourceDescriptor
-	// */
-	// private static ResourceDescriptor
-	// createResourceDescriptor(ResourceManager resMgr, MethodElement e) {
-	// return createResourceDescriptor(resMgr, e.getGuid(), createFileURI(e));
-	// }
-
-	/**
-	 * Creates a new ResourceDescriptor with the given id and resolvedURI, then
-	 * adds it to the given resMgr
-	 * 
-	 * @param resMgr
-	 * @param id
-	 * @param resolvedURI
-	 * @return
-	 */
-	private static ResourceDescriptor createResourceDescriptor(
-			ResourceManager resMgr, String id, URI resolvedURI) {
-		ResourceDescriptor resDesc = ResourcemanagerFactory.eINSTANCE
-				.createResourceDescriptor();
-		resDesc.setId(id);
-		resMgr.getResourceDescriptors().add(resDesc);
-		resDesc.setResolvedURI(resolvedURI);
-		return resDesc;
-	}
-
-	// static void setUri(MultiFileURIConverter uriConverter, MethodElement e,
-	// URI uri) {
-	// setUri(uriConverter, e, uri, false);
-	// }
-
-	// static void setUri(MultiFileURIConverter uriConverter, MethodElement e,
-	// URI uri, boolean saveNow) {
-	// ResourceManager resMgr = uriConverter.getResourceManager();
-	// if(resMgr == null) {
-	// resMgr = ResourcemanagerFactory.eINSTANCE.createResourceManager();
-	// uriConverter.setResourceManager(resMgr);
-	// }
-	// setUri(resMgr, e, uri);
-	// resMgr.eResource();
-	// }
-
-	/**
-	 * @param element
-	 */
-	public static void setGuid(MethodElement e) {
-		if (e.getGuid() == null || e.getGuid().trim().length() == 0) {
-			e.setGuid(EcoreUtil.generateUUID());
-		}
-	}
-
-	/**
-	 * Saves the given MethodElement in its own file while still preserving the
-	 * existing containment association if there is any
-	 * 
-	 * @param e
-	 * @throws LibraryResourceException 
-	 */
-	public static void save(MethodElement e, Map options) throws LibraryResourceException {
-		MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) e
-				.eResource();
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) resource
-				.getResourceSet();
-		if (options == null) {
-			options = resourceSet.getDefaultSaveOptions();
-		}
-		EObject container = e.eContainer();
-
-		Set modifiedResources = new HashSet();
-		options.put(MultiFileXMISaveImpl.MODIFIED_RESOURCE_SET,
-				modifiedResources);
-		try {
-			URI uri = MultiFileSaveUtil.createURI(e, resourceSet);
-			boolean createResource = resource == null
-					|| (container != null && resource == container.eResource());
-			if (createResource) {
-				MultiFileSaveUtil.save(e, uri, options);
-			} else {
-				URI oldUri = resource.getURI();
-				if (!oldUri.equals(uri)) {
-
-					// resource's location is changed.
-					// move the resource, then change its URI if the resource
-					// move is successful.
-					//   
-					if (FileManager.getInstance().move(oldUri.toFileString(),
-							uri.toFileString())) {
-						// MultiFileURIConverter uriConverter =
-						// (MultiFileURIConverter)
-						// resource.getResourceSet().getURIConverter();
-						// MultiFileSaveUtil.setUri(uriConverter, e, uri);
-						resource.setURI(uri);
-						updateURIMappings(resource, modifiedResources);
-					}
-				}
-
-				if (resource.isModified()) {
-					MultiFileSaveUtil.save(resource, options);
-				}
-			}
-
-			resourceSet.saveModifiedResources(options);
-		} finally {
-
-		}
-
-	}
-	
-	public static URI createURI(MethodElement e, ResourceSet resourceSet) {
-		URI uri = null;
-		if(resourceSet instanceof MultiFileResourceSetImpl) {
-			IURIProvider uriProvider = ((MultiFileResourceSetImpl)resourceSet).getURIProvider();
-			if(uriProvider != null) {
-				uri = uriProvider.getURI(e);
-			}
-		}
-		if(uri == null) {
-			uri = createFileURI(e);
-		}
-		return uri;
-	}
-
-	public static void save(ResourceSet resourceSet, MethodElement e,
-			Map options) {
-		URI uri = createURI(e, resourceSet);
-		save(resourceSet, e, uri, options);
-	}
-
-	static void adjustLocation(Resource resource, Set modifiedResources) {
-		MethodElement e = PersistenceUtil.getMethodElement(resource);
-		if (e == null)
-			return;
-		URI newFile = createURI(e, resource.getResourceSet());
-		if (newFile != null && adjustLocation(resource, newFile)) {
-			resource.setURI(newFile);
-			updateURIMappings((MultiFileXMIResourceImpl) resource,
-					modifiedResources);
-		}
-	}
-
-	static URI getNewURI(MultiFileXMIResourceImpl resource) {
-		MethodElement e = PersistenceUtil.getMethodElement(resource);
-		if (e == null) {
-			return null;
-		}
-		URI newFile = createURI(e, resource.getResourceSet());
-		if (newFile != null && adjustLocationRequired(resource, newFile)) {
-			return newFile;
-		}
-		return null;
-	}
-
-	static boolean prepareAdjustLocation(MultiFileXMIResourceImpl resource,
-			Set modifiedResources) {
-		URI newFile = getNewURI(resource);
-		if (newFile != null) {
-			resource.backUpURI();
-			resource.setFinalURI(newFile);
-			updateURIMappings((MultiFileXMIResourceImpl) resource,
-					modifiedResources, false);
-			return true;
-		}
-		return false;
-	}
-
-	public static String getGuid(Object e) {
-		if(e instanceof InternalEObject) {
-			InternalEObject o = (InternalEObject) e;
-			if(o.eIsProxy()) {
-				URI uri = o.eProxyURI();
-				if(uri != null && MultiFileURIConverter.SCHEME.equals(uri.scheme())) {
-					String guid = uri.fragment();
-					if(guid != null) {
-						return guid;
-					}
-				}
-			}
-		}
-		if (e instanceof MethodElement) {
-			return ((MethodElement) e).getGuid();
-		} else if (e instanceof ResourceManager) {
-			return ((ResourceManager) e).getGuid();
-		}
-		return null;
-	}
-
-	static boolean adjustLocationRequired(MultiFileXMIResourceImpl resource,
-			URI newURI) {
-		File oldFile = new File(resource.getFinalURI().toFileString());
-		File newFile = new File(newURI.toFileString());
-		return !oldFile.equals(newFile);
-	}
-
-	/**
-	 * Checks if the resource's URI has been changed and adjust the resource's
-	 * location.
-	 * 
-	 * @param oldUri
-	 * @param newUri
-	 */
-	static boolean adjustLocation(Resource resource, URI newUri) {
-		File oldFile = new File(resource.getURI().toFileString());
-		File newFile = new File(newUri.toFileString());
-		if (oldFile.equals(newFile)) {
-			return false;
-		}
-		return move(resource, oldFile, newFile);
-	}
-
-	static boolean move(Resource resource, File oldFile, File newFile) {
-		boolean ret = true;
-		if (oldFile.equals(newFile)) {
-			return false;
-		}
-		Object obj = PersistenceUtil.getMethodElement(resource);
-		if (hasOwnFolder(obj)) {
-			String oldDir = oldFile.getParentFile().toString();
-			if (!oldFile.getParentFile().equals(newFile.getParentFile())) {
-				if (FileManager.getInstance().rename(oldFile.getParentFile(),
-						newFile.getParentFile())) {
-					if (DEBUG) {
-						System.out
-								.println("Directory '" + oldDir + "' is successfully moved to '" + newFile.getParentFile() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					}
-				} else {
-					ret = false;
-					if (DEBUG) {
-						System.out
-								.println("Could not move directory '" + oldDir + "' to '" + newFile.getParentFile() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					}
-				}
-			}
-			if (!oldFile.getName().equals(newFile.getName())) {
-				oldFile = new File(newFile.getParentFile(), oldFile.getName());
-				if (FileManager.getInstance().rename(oldFile, newFile)) {
-					if (DEBUG) {
-						System.out
-								.println("File '" + oldFile + "' is successfully moved to '" + newFile + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					}
-				} else {
-					ret = false;
-					if (DEBUG) {
-						System.out
-								.println("Could not move file '" + oldFile + "' to '" + newFile + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					}
-				}
-			}
-			return ret;
-		} else if (oldFile.exists()) /* if(oldFile.getParentFile().equals(newFile.getParentFile())) */{
-			String oldFileStr = oldFile.toString();
-			if (FileManager.getInstance().rename(oldFile, newFile)) {
-				if (DEBUG) {
-					System.out
-							.println("File '" + oldFileStr + "' is successfully moved to '" + newFile + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				return true;
-			} else {
-				if (DEBUG) {
-					System.out
-							.println("Could not move file '" + oldFileStr + "' to '" + newFile + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * 
-	 * @param resMgr
-	 * @param guid
-	 * @param excludedResManagers
-	 *            ResourceManager that are excluded from this search
-	 * @return
-	 */
-	public static ResourceDescriptor findResourceDescriptor(
-			ResourceManager resMgr, String guid,
-			Collection excludedResManagers, boolean resolveProxy) {
-		try {
-			ResourceDescriptor desc = resMgr.getResourceDescriptor(guid);
-			if (desc != null)
-				return desc;
-			// TODO: (Phong) performance improvement needed to avoid loading
-			// resources excessively
-			//
-			Iterator iter;
-			if (resolveProxy) {
-				iter = new ArrayList(resMgr.getSubManagers()).iterator();
-			} else {
-				iter = ((InternalEList) resMgr.getSubManagers())
-						.basicIterator();
-			}
-			while (iter.hasNext()) {
-				ResourceManager mgr = (ResourceManager) iter.next();
-				if (mgr != null
-						&& !mgr.eIsProxy()
-						&& (excludedResManagers == null || !excludedResManagers
-								.contains(mgr))) {
-					desc = findResourceDescriptor(mgr, guid,
-							excludedResManagers, resolveProxy);
-					if (desc != null)
-						return desc;
-				}
-			}
-			return null;
-		} catch (RuntimeException e) {
-			throw e;
-		}
-	}
-
-	/**
-	 * 
-	 * @param resMgr
-	 * @return how many ResourceDescriptors are in the resMgr and its
-	 *         SubManagers
-	 */
-	public static int getCountResourceDescriptors(ResourceManager resMgr) {
-		int count = resMgr.getResourceDescriptors().size();
-		for (Iterator iter = resMgr.getSubManagers().iterator(); iter.hasNext();) {
-			ResourceManager mgr = (ResourceManager) iter.next();
-			count += getCountResourceDescriptors(mgr);
-		}
-		return count;
-	}
-
-	/**
-	 * Gets the resource descriptor for the given resource
-	 * 
-	 * @param resource
-	 * @return
-	 */
-	public static ResourceDescriptor getResourceDescriptor(Resource resource) {
-		ResourceManager containerResMgr = null;
-		MethodElement me = null;
-		for (Iterator iter = resource.getContents().iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof MethodLibrary) {
-				ResourceManager resMgr = getResourceManager(resource);
-				if (resMgr != null) {
-					ResourceDescriptor desc = resMgr
-							.getResourceDescriptor(((MethodElement) element)
-									.getGuid());
-					// hack to add missing ResourceDescriptor for library's
-					// resource
-					//
-					if (desc == null) {
-						desc = registerWithResourceManager(resMgr, element,
-								((MultiFileXMIResourceImpl) resource)
-										.getFinalURI());
-					}
-					return desc;
-				}
-			}
-			if (me == null && element instanceof MethodElement) {
-				me = (MethodElement) element;
-			}
-			if (containerResMgr == null && element instanceof InternalEObject) {
-				EObject container = getContainerWithDirectResource((InternalEObject) element);
-				if (container != null) {
-					containerResMgr = getResourceManager(container.eResource());
-				}
-			}
-			if (me != null && containerResMgr != null) {
-				break;
-			}
-		}
-
-		if(me != null) {
-			if (containerResMgr != null) {
-				return containerResMgr.getResourceDescriptor(((MethodElement) me)
-						.getGuid());
-			}
-			else if(me.eContainer() == null) {
-				// this element has been loaded before its container accessed it
-				// try to find its resource descriptor using root resource manager
-				//
-				ResourceSet resourceSet = resource.getResourceSet();
-				if(resourceSet instanceof MultiFileResourceSetImpl) {
-					ResourceManager rootResMgr = ((MultiFileResourceSetImpl)resourceSet).getRootResourceManager();
-					Iterator iter = new AbstractTreeIterator(rootResMgr) {
-
-						/**
-						 * Comment for <code>serialVersionUID</code>
-						 */
-						private static final long serialVersionUID = 1L;
-
-						protected Iterator getChildren(Object object) {
-							if(object instanceof ResourceManager) {
-								ArrayList children = new ArrayList();
-								ResourceManager resMgr = (ResourceManager)object; 
-								children.addAll(resMgr.getResourceDescriptors());
-								children.addAll(resMgr.getSubManagers());
-								return children.iterator();
-							}
-							return Collections.EMPTY_LIST.iterator();
-						}
-						
-					};
-					URI uri = getFinalURI(resource);
-					while(iter.hasNext()) {
-						Object o = iter.next();
-						if(o instanceof ResourceDescriptor) {
-							ResourceDescriptor resDesc = (ResourceDescriptor) o;
-							if(uri.equals(resDesc.getResolvedURI())) {
-								return resDesc;
-							}
-						}
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	// public static ResourceDescriptor findResourceDescriptor(MethodElement e)
-	// {
-	// ResourceManager resMgr = null;
-	// if(e.eResource() != null) {
-	// resMgr = getResourceManager(e.eResource());
-	// }
-	// ResourceDescriptor desc = null;
-	// Collection excludedResMgrs = null;
-	// if(resMgr != null) {
-	// desc = findResourceDescriptor(resMgr, e.getGuid());
-	// if(desc != null) return desc;
-	// excludedResMgrs = Collections.singletonList(resMgr);
-	// }
-	//		
-	// MethodLibrary lib = UmaUtil.getMethodLibrary(e);
-	// resMgr = getResourceManager(lib.eResource());
-	//		
-	// return findResourceDescriptor(resMgr, e.getGuid(), excludedResMgrs);
-	// }
-
-	/**
-	 * Gets the ResourceManager in the contents of the given resource
-	 * 
-	 * @param resource
-	 * @return
-	 */
-	public static ResourceManager getResourceManager(Resource resource) {
-		ResourceManager resMgr = null;
-		for (Iterator iter = resource.getContents().iterator(); iter.hasNext();) {
-			Object element = (Object) iter.next();
-			if (element instanceof ResourceManager) {
-				resMgr = (ResourceManager) element;
-				break;
-			}
-		}
-
-		return resMgr;
-	}
-
-	static InternalEObject getContainerWithDirectResource(InternalEObject obj) {
-		if (obj.eContainer() == null)
-			return null;
-		InternalEObject container = (InternalEObject) ((InternalEObject) obj
-				.eContainer());
-		if (container.eDirectResource() != null) {
-			return container;
-		}
-		return getContainerWithDirectResource(container);
-	}
-
-	static String getHREF(Resource resource, Object obj) {
-		MethodElement owner = PersistenceUtil.getMethodElement(resource);
-		return MultiFileURIConverter.createURI(owner.getGuid()).appendFragment(
-				getGuid(obj)).toString();
-	}
-
-	public static String getBackupFileSuffix() {
-		return "_" + dateFormatter.format(Calendar.getInstance().getTime()); //$NON-NLS-1$
-	}
-
-	/**
-	 * Resolve the proxy identified by the given <code>guid</code> without
-	 * loading all other proxies in <code>parent</code>
-	 * 
-	 * @param guid
-	 * @param parent
-	 * @return
-	 */
-	public static void resolveProxies(Collection GUIDs, EObject parent) {
-		for (Iterator iterator = parent.eClass().getEAllContainments()
-				.iterator(); !GUIDs.isEmpty() && iterator.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) iterator.next();
-			if (feature.isMany()) {
-				InternalEList list = (InternalEList) parent.eGet(feature);
-				int index = 0;
-				for (Iterator iter1 = list.basicIterator(); !GUIDs.isEmpty()
-						&& iter1.hasNext(); index++) {
-					InternalEObject child = (InternalEObject) iter1.next();
-					if (child.eIsProxy()) {
-						String guid = child.eProxyURI().fragment();
-						if (GUIDs.contains(guid)) {
-							// this will resolve the object with guid
-							//
-							list.get(index);
-							GUIDs.remove(guid);
-						}
-					} else {
-						resolveProxies(GUIDs, child);
-					}
-				}
-			} else {
-				InternalEObject child = (InternalEObject) parent.eGet(feature,
-						false);
-				if (child != null) {
-					if (child.eIsProxy()) {
-						String guid = child.eProxyURI().fragment();
-						if (GUIDs.contains(guid)) {
-							// this will resolve the object with guid
-							//
-							parent.eGet(feature);
-							GUIDs.remove(guid);
-						}
-					} else {
-						resolveProxies(GUIDs, child);
-					}
-				}
-			}
-		}
-	}
-
-	public static URI getFinalURI(Resource resource) {
-		return resource instanceof MultiFileXMIResourceImpl ? ((MultiFileXMIResourceImpl) resource)
-				.getFinalURI()
-				: resource.getURI();
-	}
-
-	/**
-	 * @param impl
-	 * @return
-	 */
-	static boolean adjustLocationRequired(MultiFileXMIResourceImpl resource) {
-		MethodElement e = PersistenceUtil.getMethodElement(resource);		
-		if(e != null && hasOwnFolder(e)) {
-			URI newURI = createURI(e, resource.getResourceSet());
-			if(adjustLocationRequired(resource, newURI) && !new File(newURI.toFileString()).exists()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks if the specified resource is currently synchronized with its data store
-	 * 
-	 * @return <li> -1 don't know
-	 *         <li> 0 no
-	 *         <li> 1 yes
-	 */
-	public static int checkSynchronized(Resource resource) {
-		if(resource instanceof MultiFileXMIResourceImpl) {
-			return ((MultiFileXMIResourceImpl)resource).checkSynchronized();
-		}
-		return -1;
-	}
-
-	/**
-	 * Some team providers changed the timestamp of last file modification by removing second fraction
-	 * even the file was not changed. This method check the current and old time stamps for this.
-	 * 
-	 * @param currentTimeStamp
-	 * @param lastTimeStamp
-	 * @return
-	 */
-	public static boolean same(long currentTimeStamp, long lastTimeStamp) {
-		return currentTimeStamp < lastTimeStamp && (currentTimeStamp & 7) == 0 && (lastTimeStamp - currentTimeStamp) < 1000;
-	}
-
-	/**
-	 * Adds an empty resource manager for the given resource if it does not have one.
-	 * 
-	 * @param resource
-	 * @return true if a new resource manager is added, false otherwise
-	 */
-	static ResourceManager addResourceManager(Resource resource) {
-		ResourceManager resMgr = getResourceManager(resource);
-		if (resMgr == null) {
-			resMgr = ResourcemanagerFactory.eINSTANCE.createResourceManager();
-			resource.getContents().add(0, resMgr);
-			return resMgr;
-		}
-		return null;
-	}
-	
-	static void checkFilePathLength(Collection resources) {
-		List<String> pathList = new ArrayList<String>();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			if(resource instanceof MultiFileXMIResourceImpl && ((MultiFileXMIResourceImpl)resource).hasTempURI()) {
-				continue;
-			}
-			pathList.add(resource.getURI().toFileString());
-		}
-		
-		if(!pathList.isEmpty()) {
-			String[] paths = new String[pathList.size()];
-			pathList.toArray(paths);
-
-			for (int i=0; i < paths.length; i++) {
-				String path = paths[i];
-				if (paths[i].length() > 255) {
-					String msg = NLS.bind(PersistenceResources.filePathNameTooLong_msg, Arrays
-								.asList(paths));
-					throw new MultiFileIOException(msg);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Lists all possible configuration files in the specified directory <code>configDir</code> and its sub directories.
-	 * 
-	 * @param configDir
-	 * @return
-	 */
-	public static Iterator listConfigFiles(File configDir) {
-		return new AbstractTreeIterator(configDir, false) {
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 2758436193000640907L;
-
-			FileFilter filter = new FileFilter() {
-
-				public boolean accept(File pathname) {
-					return !FileManager.getInstance().isTeamPrivate(pathname.getAbsolutePath()) &&
-							(pathname.isDirectory()
-							|| pathname.getName().endsWith(
-									MultiFileSaveUtil.DEFAULT_FILE_EXTENSION));
-				}
-
-			};
-
-			protected Iterator getChildren(Object object) {
-				File[] files = ((File) object).listFiles(filter);
-				if (files != null && files.length > 0) {
-					return Arrays.asList(files).iterator();
-				}
-				return Collections.EMPTY_LIST.iterator();
-			}
-
-		};
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileURIConverter.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileURIConverter.java
deleted file mode 100644
index 9ef4292..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileURIConverter.java
+++ /dev/null
@@ -1,340 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * URI converter that converts a file-based URI to a UMA-based URI and vice
- * versa using the mapping information stored in ResourceDescriptors of
- * ResourceManager. A UMA-based URI has the following format:
- * uma://GUID1#GUID2 where GUID1 is the GUID of the file and GUID2 is the
- * object's GUID. 
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiFileURIConverter extends URIConverterImpl {
-
-	public static final String SCHEME = "uma"; //$NON-NLS-1$
-
-	private static final HashSet lockedGUIDs = new HashSet();
-
-	protected ResourceManager resMgr;
-
-	private URI libraryURI;
-
-	private URI libraryUmaURI;
-
-	private MultiFileResourceSetImpl resourceSet;
-
-	private boolean resolveProxy;
-
-	public MultiFileURIConverter(MultiFileResourceSetImpl resourceSet) {
-		this.resourceSet = resourceSet;
-	}
-
-	void setResolveProxy(boolean resolveProxy) {
-		this.resolveProxy = resolveProxy;
-	}
-
-	void setLibraryURIs(MethodLibrary library) {
-		libraryURI = library.eResource().getURI();
-		libraryUmaURI = URI.createURI(new StringBuffer(SCHEME)
-				.append("://").append(library.getGuid()).toString()); //$NON-NLS-1$
-	}
-
-	private static void lockGUID(String guid) {
-		synchronized (lockedGUIDs) {
-			lockedGUIDs.add(guid);
-		}
-	}
-
-	private static boolean isLockedGUID(String guid) {
-		synchronized (lockedGUIDs) {
-			return lockedGUIDs.contains(guid);
-		}
-	}
-
-	private static boolean unlockGUID(String guid) {
-		synchronized (lockedGUIDs) {
-			return lockedGUIDs.remove(guid);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.impl.URIConverterImpl#normalize(org.eclipse.emf.common.util.URI)
-	 */
-	public URI normalize(URI uri) {
-		return normalize(uri, null);
-	}
-
-	public URI normalize(URI uri, EObject resolver) {
-		if (SCHEME.equalsIgnoreCase(uri.scheme())) {
-			String guid = uri.authority();
-			if (isLockedGUID(guid)) {
-				return null;
-			}
-			try {
-				lockGUID(guid);
-
-				ResourceDescriptor desc = null;
-				HashSet excludedResManagers = null;
-				if (resolver != null && resolver.eResource() != null) {
-					ResourceManager resMgr = MultiFileSaveUtil
-							.getResourceManager(resolver.eResource());
-					if (resMgr != null) {
-						desc = MultiFileSaveUtil.findResourceDescriptor(resMgr,
-								guid, null, resolveProxy);
-						if (desc == null) {
-							// add this ResourceManager and its submanagers to
-							// excludedResManagers
-							// so the next search for ResourceDescriptor will
-							// ignore them
-							//
-							excludedResManagers = new HashSet();
-							Iterator iter = new AbstractTreeIterator(resMgr) {
-
-								protected Iterator getChildren(Object object) {
-									return ((ResourceManager) object)
-											.getSubManagers().iterator();
-								}
-
-							};
-							while (iter.hasNext()) {
-								excludedResManagers.add(iter.next());
-							}
-						}
-					}
-				}
-				if (desc == null && getResourceManager() != null) {
-					desc = MultiFileSaveUtil.findResourceDescriptor(
-							getResourceManager(), guid, excludedResManagers,
-							resolveProxy);
-				}
-				if (desc != null) {
-					URI normalized = desc.getResolvedURI();
-
-					// check if the resource with this normalized URI has
-					// temporary URI
-					//
-					URI tempURI = (URI) resourceSet.getURIToTempURIMap().get(
-							normalized);
-					if (tempURI != null) {
-						normalized = tempURI;
-					}
-
-					if (uri.hasFragment()) {
-						normalized = normalized.appendFragment(uri.fragment());
-					}
-
-					return normalized;
-				}
-				return null;
-			} finally {
-				unlockGUID(guid);
-			}
-		}
-
-		return super.normalize(uri);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.impl.URIConverterImpl#createInputStream(org.eclipse.emf.common.util.URI)
-	 */
-	public InputStream createInputStream(URI uri) throws IOException {
-		if (uri == null)
-			return null;
-		return super.createInputStream(uri);
-	}
-
-	public static URI createURI(String guid) {
-		return URI.createURI(new StringBuffer(SCHEME)
-				.append("://").append(guid).toString()); //$NON-NLS-1$
-	}
-
-	public static URI createURI(MethodElement e) {
-		return URI.createURI(createUriString(e));
-	}
-
-	public static String createUriString(Object e) {
-		InternalEObject o = (InternalEObject) e;
-
-		URI objectURI = o.eProxyURI();
-		if (objectURI != null && SCHEME.equals(objectURI.scheme())) {
-			return objectURI.toString();
-		}
-
-		String guid = MultiFileSaveUtil.getGuid(e);
-		if (guid == null) {
-			return null;
-		}
-		return new StringBuffer(SCHEME).append("://").append(guid).toString(); //$NON-NLS-1$
-	}
-
-	// public URI toUmaUri(URI uri) {
-	// // System.out.println("MultiFileURIConverter.toUmaUri(): uri="+uri);
-	// if(uri.scheme().equals("uma") || uriDescMap == null) return uri;
-	// if(libraryURI.equals(uri)) return libraryUmaURI;
-	// ResourceDescriptor desc = (ResourceDescriptor)
-	// uriDescMap.get(uri.trimFragment().toString());
-	// return desc == null ? uri : URI.createURI("uma://" +
-	// desc.getId()).appendFragment(uri.fragment());
-	// }
-
-	// public void setResourceManager(ResourceManager resMgr) {
-	// this.resMgr = resMgr;
-	// }
-
-	public ResourceManager getResourceManager() {
-		if (resMgr == null) {
-			resMgr = resourceSet.getRootResourceManager();
-		}
-		return resMgr;
-	}
-
-	/**
-	 * Finds ResourceDescriptor for the given GUID from root ResourceManager
-	 * 
-	 * @param guid
-	 * @return
-	 */
-	public ResourceDescriptor findResourceDescriptor(String guid) {
-		return MultiFileSaveUtil.findResourceDescriptor(getResourceManager(),
-				guid, null, resolveProxy);
-	}
-
-	public void dispose() {
-		if (resMgr != null) {
-			resMgr.dispose();
-			resMgr = null;
-		}
-	}
-
-	/**
-	 * 
-	 * @param e
-	 * @param uri
-	 * @param modifiedResources
-	 *            output of resources that have been changed after this call.
-	 */
-	public void setURIMapping(EObject e, URI uri, Set modifiedResources) {
-		setURIMapping(e, uri, modifiedResources, true);
-	}
-
-	public void setURIMapping(EObject e, URI uri, Set modifiedResources,
-			boolean afterMove) {
-		String guid = MultiFileSaveUtil.getGuid(e);
-		ResourceManager resMgr = MultiFileSaveUtil.getResourceManagerFor(e,
-				modifiedResources);
-		ResourceDescriptor resDesc = resMgr.getResourceDescriptor(guid);
-		if (resDesc != null) {
-			if (afterMove) {
-				resDesc.setResolvedURI(uri);
-			} else {
-				// preserve the current resolved URI
-				resDesc.getResolvedURI();
-				// set new URI string for the upcoming move
-				resDesc.setUri(uri.deresolve(
-						MultiFileSaveUtil.getFinalURI(resDesc.eResource()))
-						.toString());
-			}
-			if (modifiedResources != null)
-				modifiedResources.add(resDesc.eResource());
-		} else {
-			// find the ResourceDescriptor in other ResourceManagers
-			//
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) e
-					.eResource().getResourceSet();
-			ResourceManager libResMgr = resourceSet.getRootResourceManager();
-			resDesc = MultiFileSaveUtil.findResourceDescriptor(libResMgr, guid,
-					Collections.singletonList(resMgr), resolveProxy);
-			if (resDesc != null) {
-				// ResourceDescriptor already exists
-				// change its uri, move it and its sub manager, if there is any,
-				// to new ResourceManager
-				//
-
-				// find sub manager
-				ResourceManager currentResMgr = (ResourceManager) resDesc
-						.eContainer();
-				ResourceManager subMgr = null;
-				for (Iterator iter = currentResMgr.getSubManagers().iterator(); iter
-						.hasNext();) {
-					ResourceManager mgr = (ResourceManager) iter.next();
-					URI mgrURI = ((MultiFileXMIResourceImpl) mgr.eResource())
-							.getFinalURI();
-					if (mgrURI.equals(uri)) {
-						subMgr = mgr;
-						break;
-					}
-				}
-
-				// move ResourceDescriptor
-				resMgr.getResourceDescriptors().add(resDesc);
-				if (modifiedResources != null) {
-					modifiedResources.add(currentResMgr.eResource());
-					modifiedResources.add(resMgr.eResource());
-				}
-
-				// move sub ResourceManager
-				if (subMgr != null) {
-					resMgr.getSubManagers().add(subMgr);
-				}
-
-				// set new URI
-				if (afterMove) {
-					resDesc.setResolvedURI(uri);
-				} else {
-					// preserve the current resolved URI
-					resDesc.getResolvedURI();
-					// set new URI string for the upcoming move
-					resDesc.setUri(uri.deresolve(resDesc.eResource().getURI())
-							.toString());
-				}
-				if (modifiedResources != null)
-					modifiedResources.add(resDesc.eResource());
-			} else {
-				MultiFileSaveUtil.registerWithResourceManager(resMgr, e, uri);
-				if (modifiedResources != null)
-					modifiedResources.add(resMgr.eResource());
-			}
-		}
-	}
-
-	public static void main(String[] args) {
-		URI uri = URI
-				.createURI("uma://_LPzdAGZ7EdmAm_xSX2EdUA#//@breakdownElements.0"); //$NON-NLS-1$
-		System.out.println(uri);
-		System.out
-				.println("deresolved URI: " + uri.deresolve(URI.createURI("uma://_LPzdAGZ7EdmAm_xSX2EdUA"))); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMIHelperImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMIHelperImpl.java
deleted file mode 100644
index 0d8a08a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMIHelperImpl.java
+++ /dev/null
@@ -1,296 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMIHelperImpl;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * XMLHelper implementation for library XMI persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiFileXMIHelperImpl extends XMIHelperImpl {
-
-	/**
-	 * Platform-specific line separator.
-	 */
-	private static final String LINE_SEP = System.getProperty("line.separator"); //$NON-NLS-1$
-
-	protected boolean logError = true;
-
-	protected List sameDocReferences;
-
-	private boolean discardUnresolvedRef;
-	
-	/**
-	 * A temporary flag to have a quick fix for getValue method call without modifying the passed
-	 * object. Should be removed with future refactoring.
-	 */
-	public static boolean unmodifiedGetValue = false;		
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MultiFileXMIHelperImpl(MultiFileXMIResourceImpl xmiRes) {
-		super(xmiRes);
-		sameDocReferences = new UniqueEList();
-		Boolean b = (Boolean) ((MultiFileResourceSetImpl) xmiRes
-				.getResourceSet()).getDefaultSaveOptions().get(
-				MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES);
-		discardUnresolvedRef = b != null ? b.booleanValue() : false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#setResource(org.eclipse.emf.ecore.xmi.XMLResource)
-	 */
-	public void setResource(XMLResource resource) {
-		super.setResource(resource);
-		if(resource instanceof MultiFileXMIResourceImpl) {
-			resourceURI = ((MultiFileXMIResourceImpl)resource).getFinalURI();
-			deresolve = resourceURI != null && !resourceURI.isRelative() && resourceURI.isHierarchical();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#getHREF(org.eclipse.emf.ecore.EObject)
-	 */
-	public String getHREF(EObject obj) {
-		if (discardUnresolvedRef) {
-			// remove unresolved references
-			//
-			if (obj instanceof MultiResourceEObject
-					&& !((MultiResourceEObject) obj).isValid()) {
-				return null;
-			}
-		}
-
-		if (obj instanceof MultiResourceEObject) {
-			InternalEObject o = (InternalEObject) obj;
-
-			URI objectURI = o.eProxyURI();
-			if (objectURI == null) {
-				Resource otherResource = obj.eResource();
-				if (otherResource == null) {
-					objectURI = handleDanglingHREF(obj);
-					if (objectURI == null) {
-						return null;
-					}
-				} else if (resource == otherResource) {
-					return "#" + resource.getURIFragment(obj); //$NON-NLS-1$
-				} else {
-					if (obj instanceof MethodConfiguration) {
-						// Special handling for MethodConfiguration.
-						// See
-						// org.eclipse.epf.persistence.MultiFileResourceSetImpl.loadConfigurations()
-						//
-						EObject lib = obj.eContainer();
-						if (lib != null) {
-							otherResource = lib.eResource();
-						} else {
-							return null;
-						}
-					}
-					if (otherResource != null) {
-						ResourceSet resourceSet = otherResource.getResourceSet();
-						if(resourceSet instanceof MultiFileResourceSetImpl 
-								&& ((MultiFileResourceSetImpl)resourceSet).getResourceManager() == null) {
-							objectURI = MultiFileSaveUtil.getFinalURI(otherResource).appendFragment(getURIFragment(otherResource, obj));
-							return deresolve(objectURI).toString();
-						}
-						ResourceDescriptor resDesc = MultiFileSaveUtil
-								.getResourceDescriptor(otherResource);
-						if (resDesc != null) {
-							objectURI = MultiFileURIConverter.createURI(
-									resDesc.getId()).appendFragment(
-									getURIFragment(otherResource, obj));
-							return objectURI.toString();
-						} else {
-							return null;
-						}
-					}
-				}
-			} else {
-				if (!objectURI.scheme().equals(MultiFileURIConverter.SCHEME)) {
-					String fragment = objectURI.fragment();
-					if (resource instanceof MultiFileXMIResourceImpl
-							&& ((MultiFileXMIResourceImpl) resource)
-									.getEObjectByID(fragment) != null) {
-						return "#" + fragment; //$NON-NLS-1$
-					} else {
-						objectURI = deresolve(objectURI);
-					}
-				}
-				return objectURI.toString();
-			}
-		}
-
-		return super.getHREF(obj);
-	}
-
-	protected static class ProxyReference {
-		private InternalEObject owner;
-
-		private EReference reference;
-
-		private InternalEObject proxy;
-
-		/**
-		 * @param owner
-		 * @param reference
-		 * @param proxy
-		 */
-		public ProxyReference(InternalEObject owner, EReference reference,
-				InternalEObject proxy) {
-			super();
-			this.owner = owner;
-			this.reference = reference;
-			this.proxy = proxy;
-		}
-
-		public InternalEObject getOwner() {
-			return owner;
-		}
-
-		public InternalEObject getProxy() {
-			return proxy;
-		}
-
-		public EReference getReference() {
-			return reference;
-		}
-
-	}
-
-	public void setValue(EObject object, EStructuralFeature feature,
-			Object value, int position) {
-
-		int kind = getFeatureKind(feature);
-
-		try {
-			// TODO: temporary fix to avoid ArrayIndexOutOfBoundsException,
-			// needs revisit
-			//
-			if (kind == IS_MANY_MOVE) {
-				List list = (List) object.eGet(feature);
-				if (position > -1 && list.indexOf(value) == -1) {
-					return;
-				}
-			}
-
-			super.setValue(object, feature, value, position);
-
-			switch (kind) {
-			case IS_MANY_ADD:
-			case IS_MANY_MOVE:
-				InternalEList list = (InternalEList) object.eGet(feature);
-
-				// save same document forward (unidirectional) references to
-				// resolve at the end of document parsing
-				//				
-				if (feature instanceof EReference) {
-					EReference ref = (EReference) feature;
-					if (ref.getEOpposite() != null) {
-						InternalEObject owner = (InternalEObject) object;
-						for (Iterator iter = list.basicIterator(); iter
-								.hasNext();) {
-							InternalEObject element = (InternalEObject) iter
-									.next();
-							if (element.eIsProxy()
-									&& element.eProxyURI().trimFragment()
-											.equals(resourceURI)) {
-								sameDocReferences.add(new ProxyReference(owner,
-										ref, element));
-							}
-						}
-					}
-				}
-
-				break;
-			}
-		} catch (RuntimeException e) {
-			if (logError) {
-				if(MultiFileSaveUtil.DEBUG) {
-					e.printStackTrace();
-				}
-				CommonPlugin.INSTANCE.log(e);
-				String errMsg = new StringBuffer(
-						"MultiFileXMIHelperImpl.setValue(): ERROR") //$NON-NLS-1$
-						.append("\n  object: ").append(object) //$NON-NLS-1$
-						.append("\n  feature: ").append(feature) //$NON-NLS-1$
-						.append("\n  value: ").append(value) //$NON-NLS-1$
-						.append("\n  position: ").append(position) //$NON-NLS-1$
-						.append("\n  kind: ").append(kind) //$NON-NLS-1$
-						.toString();
-				if(MultiFileSaveUtil.DEBUG) {
-					System.err.println(errMsg);
-				}
-				CommonPlugin.INSTANCE.log(errMsg);
-			}
-			throw e;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#getValue(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)
-	 */
-	public Object getValue(EObject obj, EStructuralFeature f) {
-		Object value = super.getValue(obj, f);
-		
-		if (unmodifiedGetValue) {
-			return value;
-		}
-		
-		// remove any value that does not belong to any resource
-		//
-		if(f instanceof EReference) {
-			if(f.isMany()) {
-				if(f.isChangeable() && value instanceof InternalEList) {
-					InternalEList list = (InternalEList) value;
-					for (Iterator iter = list.iterator(); iter.hasNext();) {
-						EObject o = (EObject) iter.next();
-						if(!o.eIsProxy() && o.eResource() == null) {
-							iter.remove();
-						}
-					}
-				}
-			}
-			else {
-				EObject o = (EObject) value;
-				if(!o.eIsProxy() && o.eResource() == null) {
-					value = null;
-				}
-			}
-		}
-		
-		return value;
-	}
-		
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMILoadImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMILoadImpl.java
deleted file mode 100644
index 8d81b67..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMILoadImpl.java
+++ /dev/null
@@ -1,123 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PushbackInputStream;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-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.SAXXMIHandler;
-import org.eclipse.emf.ecore.xmi.impl.XMILoadImpl;
-import org.eclipse.epf.common.serviceability.EPFVersions;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * XMLLoad implementation for library XMI persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiFileXMILoadImpl extends XMILoadImpl {
-
-	public MultiFileXMILoadImpl(XMLHelper helper) {
-		super(helper);
-	}
-
-	protected DefaultHandler makeDefaultHandler() {
-		return new SAXXMIHandler(resource, helper, options) {
-			  
-			protected EStructuralFeature getFeature(EObject object, String prefix, String name, boolean isElement) {
-				if (EPFVersions.TOOL_ID.equals(prefix)) {
-					return null;
-				}
-				return super.getFeature(object, prefix, name, isElement);
-			}
-			
-			protected void handleUnknownFeature(String prefix, String name, boolean isElement, EObject peekObject, String value) {
-				if (EPFVersions.TOOL_ID.equals(prefix)) {
-					return;
-				}
-				super.handleUnknownFeature(prefix, name, isElement, peekObject, value);
-			}
-			
-			public void endDocument() {
-				super.endDocument();
-
-				if (helper instanceof MultiFileXMIHelperImpl) {
-					List sameDocReferences = ((MultiFileXMIHelperImpl) helper).sameDocReferences;
-					if (!sameDocReferences.isEmpty()) {
-						for (Iterator iter = sameDocReferences.iterator(); iter
-								.hasNext();) {
-							MultiFileXMIHelperImpl.ProxyReference proxyRef = (MultiFileXMIHelperImpl.ProxyReference) iter
-									.next();
-
-							// this will merge the opposite feature maps as well
-							EObject resolved = proxyRef.getOwner()
-									.eResolveProxy(proxyRef.getProxy());
-
-							InternalEList values = (InternalEList) proxyRef
-									.getOwner().eGet(proxyRef.getReference());
-							int index = values.basicList().indexOf(
-									proxyRef.getProxy());
-							if (index != -1) {
-								values.setUnique(index, resolved);
-							}
-						}
-					}
-				}
-			}
-		};
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl#load(org.eclipse.emf.ecore.xmi.XMLResource,
-	 *      java.io.InputStream, java.util.Map)
-	 */
-	public void load(XMLResource resource, InputStream inputStream, Map options)
-			throws IOException {
-		try {
-			// strip off the UTF-8 BOM bytes if they are still there
-			//
-			PushbackInputStream pbis = new PushbackInputStream(inputStream, 3);
-			byte bom[] = new byte[3];
-			if (pbis.read(bom) == 3) {
-				if (bom[0] != (byte) 0xEF || bom[1] != (byte) 0xBB
-						|| bom[2] != (byte) 0xBF) {
-					pbis.unread(bom);
-				}
-			}
-
-			super.load(resource, pbis, options);
-		} catch (Resource.IOWrappedException e) {
-			if (!resource.getErrors().isEmpty() && helper == null) {
-				// unknown features detected, log the warning and ignore them
-				for (Iterator iter = resource.getErrors().iterator(); iter
-						.hasNext();) {
-					Exception ex = (Exception) iter.next();
-					CommonPlugin.INSTANCE.log(ex.getMessage());
-				}
-				return;
-			}
-			throw e;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMIResourceImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMIResourceImpl.java
deleted file mode 100644
index d1ec5d9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMIResourceImpl.java
+++ /dev/null
@@ -1,1212 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EContentsEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLLoad;
-import org.eclipse.emf.ecore.xmi.XMLSave;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.persistence.ILibraryResource;
-import org.eclipse.epf.library.persistence.internal.IFailSafeSavable;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.DefaultValueManager;
-import org.eclipse.epf.uma.ecore.util.OppositeFeatureNotification;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Resource implementation for library XMI persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiFileXMIResourceImpl extends XMIResourceImpl 
-implements ILibraryResource, IFailSafeSavable
-{
-
-	private static String tempDir;
-
-	private URI finalURI;
-
-	private URI oldURI;
-
-	private String backupFile;
-
-	private String currentTxID;
-
-	private long lastLoadTimeStamp;
-
-	private ResourceDescriptor resourceDescriptor;
-
-	private boolean isUnloading;
-
-	/** Cached modification stamp of the resource file */
-	private long modificationStamp;
-
-	private IFileInfo fileInfo;
-
-	public MultiFileXMIResourceImpl(URI uri) {
-		super(uri);
-		setIntrinsicIDToEObjectMap(new HashMap());		
-	}
-
-	protected XMLLoad createXMLLoad() {
-		return new MultiFileXMILoadImpl(createXMLHelper());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#createXMLSave()
-	 */
-	protected XMLSave createXMLSave() {
-		return new MultiFileXMISaveImpl(createXMLHelper());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl#createXMLHelper()
-	 */
-	protected XMLHelper createXMLHelper() {
-		return new MultiFileXMIHelperImpl(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.XMLResource#getID(org.eclipse.emf.ecore.EObject)
-	 */
-	public String getID(EObject eObject) {
-		String id = MultiFileSaveUtil.getGuid(eObject);
-		if (id != null)
-			return id;
-		return super.getID(eObject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#setID(org.eclipse.emf.ecore.EObject,
-	 *      java.lang.String)
-	 */
-	public void setID(EObject eObject, String id) {
-		Object oldID = id != null ? getEObjectToIDMap().put(eObject, id)
-				: getEObjectToIDMap().remove(eObject);
-
-		if(getResourceSet() == null) {
-			System.out.println();
-		}
-		Map guidToMethodElementMap = ((MultiFileResourceSetImpl) getResourceSet())
-				.getGuidToMethodElementMap();
-
-		if (oldID != null) {
-			getIDToEObjectMap().remove(oldID);
-			
-			if (eObject instanceof MethodElement) {
-				// remove object from guidToMethodElementMap only if it is a proxy
-				//
-				if(eObject.eIsProxy()) {
-					EObject obj = (EObject) guidToMethodElementMap.get(id);
-					if(obj != null && obj.eIsProxy()) {
-						guidToMethodElementMap.remove(id);
-					}
-				}
-				else {
-					guidToMethodElementMap.remove(id);
-				}
-			}
-		}
-
-		if (id != null) {
-			getIDToEObjectMap().put(id, eObject);
-			if (eObject instanceof MethodElement) {
-				guidToMethodElementMap.put(id, eObject);
-
-				MethodElement e = (MethodElement) eObject;
-				if (!e.getGuid().equals(id)) {
-					e.setGuid(id);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#useUUIDs()
-	 */
-	protected boolean useUUIDs() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.Resource#getURIFragment(org.eclipse.emf.ecore.EObject)
-	 */
-	public String getURIFragment(EObject eObject) {
-		try {
-			String id = getID(eObject);
-
-			if (id != null) {
-				return id;
-			} else {
-				List uriFragmentPath = new ArrayList();
-				for (EObject container = eObject.eContainer(); container != null
-						&& container.eResource() == this; container = eObject
-						.eContainer()) {
-					uriFragmentPath.add(((InternalEObject) container)
-							.eURIFragmentSegment(eObject.eContainingFeature(),
-									eObject));
-					eObject = container;
-				}
-
-				StringBuffer result = new StringBuffer("/"); //$NON-NLS-1$
-				result.append(getURIFragmentRootSegment(eObject));
-
-				for (ListIterator i = uriFragmentPath
-						.listIterator(uriFragmentPath.size()); i.hasPrevious();) {
-					result.append('/');
-					result.append((String) i.previous());
-				}
-				return result.toString();
-			}
-		} catch (RuntimeException e) {
-			System.err.println("Error getting URI fragment for " + eObject); //$NON-NLS-1$
-			throw e;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#attachedHelper(org.eclipse.emf.ecore.EObject)
-	 */
-	protected void attachedHelper(EObject eObject) {
-		super.attachedHelper(eObject);
-
-		if (useIDs()) {
-			String id = getID(eObject);
-			if (id != null) {
-				// update the eObjectToIDMap
-				//
-				getEObjectToIDMap().put(eObject, id);
-				
-				if (eObject instanceof MethodElement) {
-					((MultiFileResourceSetImpl) getResourceSet())
-							.getGuidToMethodElementMap().put(id, eObject);
-				}
-			}
-		}
-
-		if (isTrackingModification() && eObject.eResource() != this) {
-			// remove the modification tracking adapter from the eObject
-			//
-			eObject.eAdapters().remove(modificationTrackingAdapter);
-		}
-	}
-
-	private void attachedAllWithIDs(EObject eObj) {
-		// attachedHelper(eObj);
-		// List list = eObj.eContents();
-		// int size = list.size();
-		// for (int i = 0; i < size; i++) {
-		// EObject o = (EObject) list.get(i);
-		// if (o.eResource() == this) {
-		// attachedAllWithIDs(o);
-		// }
-		// }
-
-		Iterator allContents = new ContentTreeIterator(eObj);
-
-		while (allContents.hasNext()) {
-			attachedHelper((EObject) allContents.next());
-		}
-	}
-
-	private void basicAttachedAll(EObject eObj) {
-		eObj.eAdapters().add(modificationTrackingAdapter);
-		List list = eObj.eContents();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			EObject o = (EObject) list.get(i);
-			if (o.eResource() == this) {
-				basicAttachedAll(o);
-			}
-		}
-	}
-
-	/**
-	 * Calls on an object and all of its offstring objects that are in the same
-	 * resource as the object when the object is attached to this resource. This
-	 * method is expensive, so use it with caution.
-	 * 
-	 * @param eObj
-	 */
-	public void attachedAll(EObject eObj) {
-		if (useIDs()) {
-			attachedAllWithIDs(eObj);
-		} else {
-			basicAttachedAll(eObj);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.Resource.Internal#attached(org.eclipse.emf.ecore.EObject)
-	 */
-	public void attached(EObject eObject) {
-		attachedAll(eObject);
-	}
-
-	private void detachedAllWithIDs(EObject eObj) {
-		Iterator allContents = new ContentTreeIterator(eObj);
-
-		while (allContents.hasNext()) {
-			detachedHelper((EObject) allContents.next());
-		}
-	}
-
-	private void basicDetachedAll(EObject eObj) {
-		eObj.eAdapters().remove(modificationTrackingAdapter);
-		List list = eObj.eContents();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			EObject o = (EObject) list.get(i);
-			if (o.eResource() == this) {
-				basicDetachedAll(o);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#getEObjectByID(java.lang.String)
-	 */
-	protected EObject getEObjectByID(String id) {
-		for (Iterator iter = getContents().iterator(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			String guid = MultiFileSaveUtil.getGuid(element);
-			if (guid != null && guid.equals(id))
-				return element;
-		}
-
-		// return super.getEObjectByID(id);
-
-		if (idToEObjectMap != null) {
-			InternalEObject eObject = (InternalEObject) idToEObjectMap.get(id);
-			if (eObject != null && !eObject.eIsProxy()) {
-				return eObject;
-			}
-		}
-
-		return null;
-	}
-	
-	private IFileInfo getFileInfo() {
-		if(fileInfo == null || !new File(getURI().toFileString()).equals(fileInfo.getFile())) {
-			fileInfo = FileManager.getInstance().getFileInfo(this); 
-		}
-		return fileInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl#load(java.util.Map)
-	 */
-	public void load(Map options) throws IOException {
-		if (isUnloading) {
-			return;
-		}
-		
-		boolean old = DefaultValueManager.INSTANCE.isUseStatic();
-		try {
-			DefaultValueManager.INSTANCE.setUseStatic(true);
-			super.load(options);		
-			updateTimeStamps();
-		}
-		finally {
-			DefaultValueManager.INSTANCE.setUseStatic(old);
-		}
-		
-		if (MultiFileSaveUtil.DEBUG) {
-			if (getURI().toString().equals(testResourceURIStr)) {
-				testResourceLoaded = true;
-			}
-		}
-	}
-
-	private static boolean testResourceLoaded;
-
-	private static final String testResourceURIStr = "file:/C:/temp/newlib/library.xmi"; //$NON-NLS-1$
-
-	public long getModificationStamp() {
-		return modificationStamp;
-	}
-	
-	/**
-	 * Reloads this resource. Old objects will become proxies and they will be
-	 * added to the specified collection <code>proxies</code>
-	 * 
-	 * @param proxies
-	 */
-	synchronized boolean reload(Collection proxies) throws IOException {
-		if (isLoaded) {
-			Notification notification = setLoaded(false);
-			doUnload(proxies, false);
-			// doUnload() might have set this resource loaded again
-			// set isLoaded to false and contents to null to make sure
-			//
-			isLoaded = false;
-			contents = null;
-			if (notification != null) {
-				eNotify(notification);
-			}
-			load(getResourceSet().getLoadOptions());
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * Javadoc copied from interface.
-	 */
-	final void unloadWithoutRemove() {
-		if (isLoaded) {
-			// save the ResourceDescriptor pf this resource for later use to
-			// create URI for the proxies after unload
-			//
-			ResourceDescriptor resDesc = MultiFileSaveUtil
-					.getResourceDescriptor(this);
-			if (resDesc != null) {
-				setResourceDescriptor(resDesc);
-			}
-
-			Notification notification = setLoaded(false);
-			doUnload(null, false);
-			if (notification != null) {
-				eNotify(notification);
-			}
-		}
-	}
-
-	/**
-	 * Does all the work of unloading the resource. It calls
-	 * {@link #unloaded unloaded} for each object it the content
-	 * {@link #getAllContents tree}, and clears the
-	 * {@link #getContents contents}, {@link #getErrors errors}, and
-	 * {@link #getWarnings warnings}.
-	 */
-	protected void doUnload() {
-		doUnload(null, true);
-	}
-
-	/**
-	 * @author Phong Nguyen Le - Jul 17, 2006
-	 * @since 1.0
-	 */
-	private final class ContentTreeIterator extends AbstractTreeIterator {
-		/**
-		 * Comment for <code>serialVersionUID</code>
-		 */
-		private static final long serialVersionUID = 1L;
-
-		/**
-		 * @param object
-		 */
-		private ContentTreeIterator(Object object) {
-			super(object);
-		}
-
-		protected Iterator getChildren(Object object) {
-			if (object instanceof EObject) {
-				ArrayList children = new ArrayList();
-				EContentsEList contents = new EContentsEList((EObject) object) {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.emf.ecore.util.EContentsEList#resolve()
-					 */
-					protected boolean resolve() {
-						return false;
-					}
-				};
-				for (Iterator iter = contents.basicIterator(); iter.hasNext();) {
-					EObject o = (EObject) iter.next();
-					if (o.eResource() == MultiFileXMIResourceImpl.this
-							|| o.eIsProxy()) {
-						children.add(o);
-					}
-				}
-				return children.iterator();
-			}
-			return Collections.EMPTY_LIST.iterator();
-		}
-	}
-
-	/**
-	 * Unloads this resource. Old objects will be come proxies and will be added
-	 * to the specified collection <code>proxies</code>
-	 * 
-	 * @param proxies
-	 * @param remove
-	 *            if <code>true</code> will remove all the unloaded objects in
-	 *            the resource from their containers and all opposite feature
-	 *            data of the unloaded objects will be cleared.
-	 */
-	protected void doUnload(Collection proxies, boolean remove) {
-		isUnloading = true;
-
-		try {
-			// from ResourceImpl
-			//
-
-			Iterator allContents = getAllProperContents(new ArrayList(
-					getContents()));
-
-			// This guard is needed to ensure that clear doesn't make the
-			// resource
-			// become loaded.
-			//
-			if (!getContents().isEmpty()) {
-				if (remove) {
-					getContents().clear();
-				} else {
-					// don't call getContents().clear() to keep the references
-					// to elements
-					// that just became proxies after unload
-					//
-					contents = null;
-				}
-
-			}
-			getErrors().clear();
-			getWarnings().clear();
-
-			ArrayList<EObject> unloadedObjects = new ArrayList<EObject>();
-			
-			ArrayList allContentList = new ArrayList();
-			while (allContents.hasNext()) {
-				allContentList.add(allContents.next());
-			}
-			Iterator it = allContentList.iterator();
-			
-			try {
-				while (it.hasNext()) {
-					try {
-						InternalEObject o = (InternalEObject) it
-								.next();
-						unloaded(o, remove);
-						unloadedObjects.add(o);
-					} catch (Exception e) {
-						CommonPlugin.INSTANCE.log(e);
-					}
-				}
-			} catch (Exception e) {
-				CommonPlugin.INSTANCE.log(e);
-			}
-			if (proxies != null && !unloadedObjects.isEmpty()) {
-				proxies.addAll(unloadedObjects);
-			}
-			if (remove) {
-				// remove the unloaded objects from its container to prevent the
-				// whole library from staying
-				// in memory if only one of its element is leaked
-				// 
-				for (Iterator iter = unloadedObjects.iterator(); iter.hasNext();) {
-					EObject object = (EObject) iter.next();
-					EcoreUtil.remove(object);
-				}
-			}
-
-			// from XMLResourceIml
-			//		
-
-			if (idToEObjectMap != null) {
-				for (Iterator iter = idToEObjectMap.keySet().iterator(); iter
-						.hasNext();) {
-					((MultiFileResourceSetImpl) getResourceSet())
-							.getGuidToMethodElementMap().remove(iter.next());
-				}
-				idToEObjectMap.clear();
-			}
-
-			if (eObjectToIDMap != null) {
-				eObjectToIDMap.clear();
-			}
-
-			if (eObjectToExtensionMap != null) {
-				eObjectToExtensionMap.clear();
-			}
-
-			if (intrinsicIDToEObjectMap != null) {
-				intrinsicIDToEObjectMap.clear();
-			}
-			
-			modificationStamp = IResource.NULL_STAMP;
-			
-		} finally {
-			isUnloading = false;
-		}
-	}
-
-	protected void unloaded(InternalEObject internalEObject) {
-		unloaded(internalEObject, true);
-	}
-	
-	/**
-	 * @param internalEObject
-	 * @param clear
-	 *            if <code>true</code> all opposite feature data of the
-	 *            unloaded objects will be cleared.
-	 */
-	private void unloaded(InternalEObject internalEObject, boolean clear) {
-		String guid = MultiFileSaveUtil.getGuid(internalEObject);
-		if (guid != null) {
-			URI uri = resourceDescriptor != null ? MultiFileURIConverter
-					.createURI(resourceDescriptor.getId()) : getURI();
-			internalEObject.eSetProxyURI(uri.appendFragment(guid));
-		}
-		internalEObject.eAdapters().clear();
-
-		if (internalEObject instanceof MultiResourceEObject && clear) {
-			MultiResourceEObject multiResourceEObject = ((MultiResourceEObject) internalEObject);
-
-			// clear own opposite feature map
-			//			
-			Map oppositeFeatureMap = multiResourceEObject
-					.basicGetOppositeFeatureMap();
-			if (oppositeFeatureMap != null) {
-				oppositeFeatureMap.clear();
-			}
-
-			// remove itself from all opposite features
-			// 
-			multiResourceEObject.removeFromAllOppositeFeatures();
-		}
-		
-		if(internalEObject instanceof ContentDescription || internalEObject instanceof Section) {
-			// set all string attributes to NULL to release memory
-			//
-			for (EAttribute attr : internalEObject.eClass().getEAllAttributes()) {
-				if(attr != UmaPackage.eINSTANCE.getMethodElement_Guid() && 
-						attr.getEAttributeType().getInstanceClass().isAssignableFrom(String.class)) {
-					internalEObject.eSet(attr, attr.getDefaultValue());
-				}
-			}
-			
-			if(internalEObject.eDirectResource() != null && internalEObject instanceof MultiResourceEObject) {
-				((MultiResourceEObject)internalEObject).eSetResource(null);
-			}
-		}
-	}
-
-	public void detachedAll(EObject eObj) {
-		if (useIDs()) {
-			detachedAllWithIDs(eObj);
-		} else {
-			basicDetachedAll(eObj);
-		}
-	}		
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.Resource.Internal#detached(org.eclipse.emf.ecore.EObject)
-	 */
-	public void detached(EObject eObject) {
-		detachedAll(eObject);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl#createModificationTrackingAdapter()
-	 */
-	protected Adapter createModificationTrackingAdapter() {
-		return new ModificationTrackingAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl.ModificationTrackingAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-			 */
-			public void notifyChanged(Notification notification) {
-				// don't handle OppositeFeatureNotification b/c it does not
-				// really modify this resource
-				//
-				if (notification instanceof OppositeFeatureNotification) {
-					return;
-				}
-				super.notifyChanged(notification);
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl#setModified(boolean)
-	 */
-	public void setModified(boolean isModified) {
-		// boolean wasModified = isModified();
-		super.setModified(isModified);
-		// if(MultiFileSaveUtil.getMethodElement(this) instanceof
-		// ProcessComponent) {
-		// System.out.println("MultiFileXMIResourceImpl.setModified(): " +
-		// this);
-		// }
-		// this code is needed to set dirty flag to the item provider's label
-		//
-		// if(wasModified != isModified && !getContents().isEmpty()) {
-		// // refresh the label of the resource's object
-		// //
-		// EObject obj = (EObject) getContents().get(0);
-		// for (Iterator iter = obj.eAdapters().iterator(); iter.hasNext();) {
-		// Object adapter = iter.next();
-		// if(adapter instanceof ItemProviderAdapter) {
-		// ((ItemProviderAdapter)adapter).fireNotifyChanged(new
-		// ViewerNotification(new NotificationImpl(Notification.SET, obj, obj),
-		// obj, false, true));
-		// }
-		// }
-		// }
-
-		if (MultiFileSaveUtil.DEBUG) {
-			if (testResourceLoaded
-					&& getURI().toString().equals(testResourceURIStr)) {
-				System.out.println("isModified=" + isModified); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.notify.impl.NotifierImpl#eDeliver()
-	 */
-	public boolean eDeliver() {
-		ResourceSet resourceSet = getResourceSet();
-		if (resourceSet != null && !resourceSet.eDeliver())
-			return false;
-
-		return super.eDeliver();
-	}
-
-	public void save(Map options) throws IOException {
-		boolean old = DefaultValueManager.INSTANCE.isUseStatic();
-		try {
-			DefaultValueManager.INSTANCE.setUseStatic(true);
-			
-			if (options == null) {
-				options = MultiFileResourceSetImpl.DEFAULT_SAVE_OPTIONS;
-			}
-
-			super.save(options);
-
-			// Special handling for saving MethodLibrary to remove all references to
-			// MethodConfigurations from library file.
-			//
-			MethodElement e = PersistenceUtil.getMethodElement(this);
-			if (e instanceof MethodLibrary) {
-				MethodLibrary lib = (MethodLibrary) e;
-				// remove ResourceDescriptors of configuration files
-				//
-				ResourceManager resMgr = MultiFileSaveUtil.getResourceManager(this);
-				if (resMgr != null) {
-					for (Iterator iter = lib.getPredefinedConfigurations()
-							.iterator(); iter.hasNext();) {
-						MethodConfiguration config = (MethodConfiguration) iter
-						.next();
-						ResourceDescriptor resDesc = resMgr
-						.getResourceDescriptor(config.getGuid());
-						if (resDesc != null) {
-							EcoreUtil.remove(resDesc);
-						}
-					}
-				}
-				List configs = new ArrayList(lib.getPredefinedConfigurations());
-				boolean oldDeliver = lib.eDeliver();
-				try {
-					lib.eSetDeliver(false);
-					lib.getPredefinedConfigurations().clear();
-
-					// Save library file again to remove all references to configurations.
-					// The previous save is still needed to save new configuration in its own file
-					//
-					super.save(options);
-				} finally {
-					lib.getPredefinedConfigurations().addAll(configs);
-					lib.eSetDeliver(oldDeliver);
-				}
-			}
-		}
-		finally {
-			DefaultValueManager.INSTANCE.setUseStatic(old);
-		}
-	}
-
-	public URI getFinalURI() {
-		if (finalURI != null) {
-			return finalURI;
-		}
-		return getURI();
-	}
-
-	public void setFinalURI(URI uri) {
-		finalURI = uri;
-	}
-
-	public void backUpURI() {
-		oldURI = getURI();
-	}
-
-	public boolean hasTempURI() {
-		if (currentTxID != null) {
-			return createTempURI().equals(getURI());
-		}
-		return false;
-	}
-
-	private URI createTempURI() {
-		MethodElement e = PersistenceUtil.getMethodElement(this);
-		return URI.createFileURI(new StringBuffer(getTempDir()).append(
-				File.separator).append(currentTxID)
-				.append("new").append(e.getGuid()).toString()); //$NON-NLS-1$
-	}
-
-	static String getTempDir() {
-		if (tempDir == null) {
-			tempDir = new File(FileManager.getTempDir(), "EPF").getAbsolutePath(); //$NON-NLS-1$
-		}
-		return tempDir;
-	}
-
-	/**
-	 * Sets the temporary URI to save this resource to and it will be renamed to
-	 * the original URI when saving is done
-	 */
-	public void setTempURI(String txID) {
-		if (finalURI == null) {
-			finalURI = oldURI = getURI();
-			currentTxID = txID;
-
-			URI tempURI = createTempURI();
-			setURI(tempURI);
-
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) getResourceSet();
-			resourceSet.getURIToTempURIMap().put(oldURI, tempURI);
-		}
-	}
-
-	/**
-	 * Restores the resource URI to the original one. This method must be call
-	 * after saving regarless of its success.
-	 * 
-	 */
-	private void restoreURI() {
-		if (oldURI != null) {
-			setURI(oldURI);
-		}
-	}
-
-	public boolean txStarted() {
-		return moveStarted() || saveStarted();
-	}
-
-	protected void updateTimeStamps() {
-		FileManager.getInstance().refresh(this);
-		lastLoadTimeStamp = System.currentTimeMillis();
-		IFileInfo info = getFileInfo();
-		if(info != null) {
-			modificationStamp = info.getModificationStamp();
-		}
-	}
-	
-	/**
-	 * Checks if this resource is currently synchronized with its data store
-	 * 
-	 * @return <li> -1 don't know
-	 *         <li> 0 no
-	 *         <li> 1 yes
-	 * @deprecated use {@link #isSynchronized()} instead
-	 */
-	public int checkSynchronized() {
-//		long currentTime = new File(getURI().toFileString()).lastModified();
-//		if(MultiFileSaveUtil.same(currentTime, fileLastModified)) {
-//			// some team providers changed the timestamp of last file modification by removing second fraction
-//			// even the file was not changed
-//			//
-//			return 1;
-//		}
-//		return -1;
-		return isSynchronized() ? 1 : 0;
-	}
-	
-	public boolean isSynchronized() {
-		IFileInfo fileInfo = getFileInfo();
-		if (fileInfo != null) {
-			return modificationStamp == fileInfo.getModificationStamp();
-		}
-		else {
-			return true;
-		}
-	}
-
-	public void txFinished(boolean successful) {
-		boolean wasMove = !oldURI.equals(finalURI);
-		if (successful) {
-			setURI(finalURI);
-			if(!wasMove) {
-				setModified(false);
-			}
-			FileManager.getInstance().refresh(this);
-			updateTimeStamps();
-			if(!wasMove) {
-				MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) getResourceSet();
-				if(resourceSet != null) {
-					resourceSet.getUnresolvedProxyMarkerManager().validateMarkers(this);
-				}
-			}
-		} else {
-			restoreURI();
-			if (wasMove) {
-				// finalURI must be cleared before restoring URI of its child
-				// resources so the URI of its child resources can be resolved
-				// correctly. See ResourceDescriptorImpl.getResolvedURI()
-				//
-				finalURI = null;
-				
-				// restore uri of ResourceDescriptor of this resource
-				//
-				MultiFileSaveUtil.updateURIMappings(this, oldURI, null, true);
-			}
-		}
-		if (oldURI != null) {
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) getResourceSet();
-			if (resourceSet != null) {
-				resourceSet.getURIToTempURIMap().remove(oldURI);
-			}
-			oldURI = null;
-		}
-		currentTxID = null;
-		finalURI = null;
-	}
-
-	public void deleteBackup() {
-		if (backupFile != null) {
-			try {
-				// FileManager.getInstance().delete(backupFile);
-				new File(backupFile).delete();
-				backupFile = null;
-			} catch (Throwable e) {
-				CommonPlugin.INSTANCE.log(e);
-				if (MultiFileSaveUtil.DEBUG) {
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-
-	public boolean restore() {
-		File src = null, dest = null;
-		boolean moved = false;
-		if (backupFile != null) {
-			src = new File(backupFile);
-			dest = new File(getFinalURI().toFileString());
-		} else {
-			moved = oldURI != null && !oldURI.equals(finalURI);
-			if (moved) {
-				File file = new File(getFinalURI().toFileString());
-				dest = new File(oldURI.toFileString());
-				moved = file.exists() && !dest.exists();
-				if (moved) {
-					src = file;
-				}
-			}
-		}
-		if (src != null) {
-			if (dest.exists()) {
-				FileUtil.moveFile(dest,new File(getURI().toFileString()));
-			}
-			boolean success;
-			if (moved) {
-				success = MultiFileSaveUtil.move(this, src, dest);
-				// if(success) {
-				// MultiFileSaveUtil.updateURIMappings(this, null);
-				// }
-			} else {
-				// don't restore file if the source and destination are the same
-				//
-				success = src.lastModified() == dest.lastModified() && FileUtil.getSize(src) == FileUtil.getSize(dest);
-				if(!success) {
-					success = FileUtil.moveFile(src, dest);
-				}
-			}
-			if (!success) {
-				throw new MultiFileIOException(NLS.bind(PersistenceResources.restoreResourceError_msg, 
-						FileManager.toFileString(getFinalURI())));
-			}
-			return true;
-		}
-		return false;
-	}
-
-	URI getOldURI() {
-		return oldURI;
-	}
-
-	boolean moveStarted() {
-		return oldURI != null && !oldURI.equals(getFinalURI());
-	}
-
-	boolean saveStarted() {
-		return currentTxID != null;
-	}
-	
-	private void refreshURIOfChildResources() {
-		// refresh resolve URIs in ResourceDescriptors of the child
-		// resources of this resource
-		//
-		HashMap<URI, ResourceDescriptor> oldURIToResourceDescriptorMap = null;
-		ResourceManager resMgr = MultiFileSaveUtil
-				.getResourceManager(this);
-		if (resMgr != null) {
-			oldURIToResourceDescriptorMap = new HashMap<URI, ResourceDescriptor>();
-			for (Iterator<?> iter = resMgr.eAllContents(); iter
-					.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof ResourceDescriptor) {
-					ResourceDescriptor desc = ((ResourceDescriptor) obj);
-					oldURIToResourceDescriptorMap.put(desc
-							.getResolvedURI(), desc);
-					desc.clearResolvedURI();
-				}
-			}
-		}
-
-		// refresh URI of loaded child resources of this resource
-		//
-		if (oldURIToResourceDescriptorMap != null) {
-			// go thru the list of loaded resources in resource set
-			// to update the URI
-			//
-			for (Resource res : getResourceSet().getResources()) {
-				ResourceDescriptor desc = (ResourceDescriptor) oldURIToResourceDescriptorMap
-						.get(res.getURI());
-				if (desc != null) {
-					res.setURI(desc.getResolvedURI());
-				}
-			}
-		}
-	}
-
-	public void commit() {
-		if (finalURI != null && !getContents().isEmpty()) {
-			File finalFile = new File(finalURI.toFileString());
-			boolean wasMove = !oldURI.equals(finalURI);
-			if (wasMove) {
-				Object e = PersistenceUtil.getMethodElement(this);
-				if (e instanceof ContentDescription) {
-					if (finalFile.exists()) {
-						// name for finalFile is already taken
-						// try to get the next available name
-						//
-						finalURI = URI.createFileURI(MethodLibraryPersister
-								.getNextAvailableFileName(finalFile.getParent()
-										+ File.separator,
-										(ContentDescription) e));
-						finalFile = new File(finalURI.toFileString());
-					}
-				}
-			} else {
-				// back up the file
-				//
-				String backup = getBackupFilePath();
-				File bakFile = new File(backup);
-
-				// trying to delete the old backup file if it exists
-				//
-				if (bakFile.exists()) {
-					bakFile.delete();
-				}
-
-				if (finalFile.exists()) {
-					// some CM provider like ClearCase renamed the versioned
-					// file it its repository as soon as user renamed the file
-					// in the workspace. To avoid this, use only regular rename
-					// routine of java.io.File instead of IResource routine
-					//
-					if (FileUtil.moveFile(finalFile, bakFile)) {
-						backupFile = backup;
-					} else {
-						String msg = NLS.bind(
-								PersistenceResources.renameError_msg,
-								finalFile, backup);
-						throw new MultiFileIOException(msg);
-					}
-				}
-			}
-
-			// rename the resource file to the original name
-			//
-			File currentFile = new File(wasMove ? oldURI.toFileString()
-					: getURI().toFileString());
-			boolean success = false;
-			Exception ex = null;
-			if (wasMove) {
-				success = MultiFileSaveUtil.move(this, currentFile, finalFile);
-			} else {
-				// some CM provider like ClearCase renamed the versioned file in
-				// its repository as soon as user renamed the file
-				// in the workspace. To avoid this, use only regular rename
-				// routine of java.io.File instead of IResource routine
-				//
-				try {
-					FileUtil.doMoveFile(currentFile, finalFile);
-					success = true;
-				}
-				catch(Exception e) {
-					ex = e;
-				}
-			}
-			if (!success) {
-				String msg = NLS.bind(PersistenceResources.renameError_msg,
-						currentFile, finalFile);
-				if(ex != null) {
-					msg = msg + ": "  + (ex.getMessage() != null ? ex.getMessage() : ex.toString()); //$NON-NLS-1$
-				}
-				throw new MultiFileIOException(msg);
-			} else {
-				if (wasMove) {
-					// refresh resolve URI of ResourceDescriptor of this
-					// resource
-					//
-					ResourceDescriptor resDesc = MultiFileSaveUtil
-							.getResourceDescriptor(this);
-					if (resDesc != null) {
-						resDesc.clearResolvedURI();
-						resDesc.getResolvedURI();
-					} 
-					else {
-						if (MultiFileSaveUtil.DEBUG) {
-							MethodElement e = PersistenceUtil
-									.getMethodElement(this);
-							if (e != null
-									&& !getLibraryPersister()
-											.hasOwnResourceWithoutReferrer(e)) {
-								String msg = "FATAL ERROR: no ResourceDescriptor found in parent resource for " + this; //$NON-NLS-1$
-								CommonPlugin.INSTANCE.log(msg);
-								System.err.println(msg);
-							}
-						}
-					}
-
-					refreshURIOfChildResources();
-				}
-
-				RefreshJob.getInstance().resourceSaved(this);
-			}
-		}
-	}
-
-	public String getBackupFilePath() {
-		String backupFile = new StringBuffer(getTempDir())
-				.append(File.separator)
-				.append(currentTxID)
-				.append("old").append(PersistenceUtil.getMethodElement(this).getGuid()).toString(); //$NON-NLS-1$
-		return backupFile;
-	}
-
-	/**
-	 * @return the lastLoadTimeStamp
-	 */
-	public long getLastLoadTimeStamp() {
-		return lastLoadTimeStamp;
-	}
-
-	static void clearDetachedEObjectToIDMap() {
-		DETACHED_EOBJECT_TO_ID_MAP.clear();
-	}
-
-	/**
-	 * @param resDesc
-	 */
-	void setResourceDescriptor(ResourceDescriptor resDesc) {
-		resourceDescriptor = resDesc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResource#getLoadStamp()
-	 */
-	public long getLoadStamp() {
-		return getLastLoadTimeStamp();
-	}
-
-	public URI getProxyURI(EObject object) {
-		String guid = MultiFileSaveUtil.getGuid(object);
-		if (guid != null) {
-			ResourceDescriptor resourceDescriptor = this.resourceDescriptor != null ? this.resourceDescriptor :
-					MultiFileSaveUtil.getResourceDescriptor(this);
-			URI uri = resourceDescriptor != null ? MultiFileURIConverter
-					.createURI(resourceDescriptor.getId()) : getURI();
-			return uri.appendFragment(guid);
-		}
-		return getURI().appendFragment(getID(object));
-	}
-
-	public void setTxID(String txID) {
-		setTempURI(txID);
-	}
-	
-	private ILibraryPersister getLibraryPersister() {
-		return ((MultiFileResourceSetImpl)resourceSet).getPersister();
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMISaveImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMISaveImpl.java
deleted file mode 100644
index 47922f0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/MultiFileXMISaveImpl.java
+++ /dev/null
@@ -1,656 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMISaveImpl;
-import org.eclipse.epf.common.serviceability.EPFVersions;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * XMLSave implementation for library XMI persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiFileXMISaveImpl extends XMISaveImpl {
-
-	public static final String SAVE_SEPARATELY_CLASS_SET = "SAVE_SEPARATELY_CLASS_SET"; //$NON-NLS-1$
-
-	/**
-	 * Save options to force saving all resources in the resource set, whether
-	 * they have been modified or unchanged. Its value must be a string "true"
-	 * or "false"
-	 */
-	public static final String SAVE_ALL = "SAVE_ALL"; //$NON-NLS-1$
-
-	/**
-	 * Save option to save objects of the save type together in the same file if
-	 * MultiFileUtil.createFileURI() returns the same URI for them.
-	 */
-	public static final String SAVE_TOGETHER_CLASS_SET = "SAVE_TOGETHER_CLASS_SET"; //$NON-NLS-1$
-
-	public static final String BACK_UP_BEFORE_SAVE = "BACK_UP_BEFORE_SAVE"; //$NON-NLS-1$
-
-	public static final String DISCARD_UNRESOLVED_REFERENCES = "DISCARD_UNRESOLVED_REFERENCES"; //$NON-NLS-1$
-
-	static final String MODIFIED_RESOURCE_SET = "MODIFIED_RESOURCE_SET"; //$NON-NLS-1$
-
-	/**
-	 * Save option to specify a TxRecord to log the transactional data for
-	 * fail-safe persistence
-	 * 
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister.FailSafeMethodLibraryPersister
-	 * @see TxRecord
-	 */
-	static final String TX_RECORD = "TX_RECORD"; //$NON-NLS-1$
-
-	public static final String MULTI_FILE = "MULTI_FILE"; //$NON-NLS-1$
-
-	/**
-	 * Save option to refresh the workspace when new resource is created and
-	 * saved. Its value must be a string "true" or "false"
-	 */
-	public static final String REFRESH_NEW_RESOURCE = "REFRESH_NEW_RESOURCE"; //$NON-NLS-1$
-
-	/**
-	 * Save option to check the resource for modifiable before saving it. Its
-	 * value must be a string "true" or "false"
-	 */
-	public static final String CHECK_MODIFY = "CHECK_MODIFY"; //$NON-NLS-1$
-
-	// private Resource resource;
-	private Set saveSeparatelyClassSet;
-
-	private Map options;
-
-	/**
-	 * @param helper
-	 */
-	public MultiFileXMISaveImpl(XMLHelper helper) {
-		super(helper);
-	}
-
-	XMLHelper getXMLHelper() {
-		return helper;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl#init(org.eclipse.emf.ecore.xmi.XMLResource,
-	 *      java.util.Map)
-	 */
-	protected void init(XMLResource resource, Map opts) {
-		super.init(resource, opts);
-
-//		if (escape != null) {
-//			// use MyEscape to not escape whitespaces
-//			//
-//			escape = new MyEscape();
-//		}
-
-		saveSeparatelyClassSet = (Set) opts.get(SAVE_SEPARATELY_CLASS_SET);
-		options = opts;
-
-		ResourceSet resourceSet = resource.getResourceSet();
-		if (resourceSet == null) {
-			resourceSet = new MultiFileResourceSetImpl();
-			resourceSet.getResources().add(resource);
-		}
-	}
-
-	boolean canSaveSeparately(Object obj) {
-		return MultiFileSaveUtil.hasOwnResource(obj, saveSeparatelyClassSet);
-	}
-
-	private String getUmaHREF(Resource resource, InternalEObject o) {
-		if (o.eIsProxy()
-				&& o.eProxyURI().scheme().equals(MultiFileURIConverter.SCHEME)) {
-			return o.eProxyURI().toString();
-		}
-		String href = null;
-		if (o instanceof MethodElement) {
-			href = helper.getHREF(o);
-		}
-		if (href == null) {
-			PersistencePlugin.getDefault().getLogger().logError("Could not find resource descriptor for resource " + resource + "\n  object: " + o); //$NON-NLS-1$ //$NON-NLS-2$
-			return MultiFileSaveUtil.getHREF(resource, o);
-		}
-		return href;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl#saveHref(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.EStructuralFeature)
-	 */
-	protected void saveHref(EObject remote, EStructuralFeature f) {
-		if (f instanceof EReference && ((EReference) f).isContainment()
-				&& !toDOM) {
-			// if this HREF is a contained element, save its ID attribute so the
-			// proxy can be cached in the
-			// GUIDToElementMap for temporary use before it can be resolved.
-			// This helps improve loading time.
-			//
-			String href = helper.getHREF(remote);
-			if (href != null) {
-				if (escapeURI != null) {
-					href = escapeURI.convert(href);
-				}
-				String name = helper.getQName(f);
-				doc.startElement(name);
-				EClass eClass = remote.eClass();
-				EClass expectedType = (EClass) f.getEType();
-				if (saveTypeInfo ? xmlTypeInfo.shouldSaveType(eClass,
-						expectedType, f) : eClass != expectedType
-						&& expectedType.isAbstract()) {
-					saveTypeAttribute(eClass);
-				}
-				String id = helper.getID(remote);
-				if (id != null) {
-					doc.addAttribute(idAttributeName, id);
-				}
-				doc.addAttribute(XMLResource.HREF, href);
-				if (eObjectToExtensionMap != null) {
-					processAttributeExtensions(remote);
-					if (processElementExtensions(remote)) {
-						doc.endElement();
-					} else {
-						doc.endEmptyElement();
-					}
-				} else {
-					doc.endEmptyElement();
-				}
-			}
-			return;
-		}
-
-		super.saveHref(remote, f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl#saveFeatures(org.eclipse.emf.ecore.EObject)
-	 */
-	protected boolean saveFeatures(EObject o) {
-		try {
-			MultiFileXMIResourceImpl resource = (MultiFileXMIResourceImpl) o
-					.eResource();
-			if (resource != null) {
-				EObject container = o.eContainer();
-				InternalEObject internalEObject = ((InternalEObject) o);
-				if (o instanceof MethodElement && canSaveSeparately(o)
-						&& container != null) {
-					boolean containsNewFeature = (resource == container
-							.eResource());
-					MethodElement e = (MethodElement) o;
-					URI uri = MultiFileSaveUtil.createURI(e, resource.getResourceSet());
-					if (containsNewFeature) {
-						if (!internalEObject.eIsProxy()) {
-							resource = (MultiFileXMIResourceImpl) MultiFileSaveUtil
-									.save(o, uri, options);
-						}
-					} else {
-						// check if there is a ResourceDescriptor for this
-						// element
-						// create a new one if needed
-						//
-						ResourceManager resMgr = MultiFileSaveUtil
-								.getResourceManager(container.eResource());
-						if (resMgr != null
-								&& resMgr.getResourceDescriptor(e.getGuid()) == null) {
-							// make sure that no other ResourceManager has a
-							// ResourceDescriptor for this element
-							//
-							MultiFileURIConverter uriConverter = (MultiFileURIConverter) resource
-									.getResourceSet().getURIConverter();
-							if (uriConverter
-									.findResourceDescriptor(e.getGuid()) == null) {
-								MultiFileSaveUtil.registerWithResourceManager(
-										resMgr, e, resource.getFinalURI());
-							}
-						}
-					}
-
-					String href = getUmaHREF(resource, internalEObject);
-					doc.addAttribute(XMLResource.HREF, href);
-					endSaveFeatures(o, 0, null);
-					return true;
-				}
-				if (o instanceof ResourceManager
-						&& helper.getResource() != resource) {
-					String href = getUmaHREF(resource, internalEObject);
-					doc.addAttribute(XMLResource.HREF, href);
-					endSaveFeatures(o, 0, null);
-					return true;
-				}
-			}
-			return super.saveFeatures(o);
-		} catch (RuntimeException e) {
-			CommonPlugin.INSTANCE.log(e);
-			if (MultiFileSaveUtil.DEBUG) {
-				e.printStackTrace();
-				System.err.println("ERROR saving feature: " + o); //$NON-NLS-1$
-				System.err.println("  Feature resource: " + o.eResource()); //$NON-NLS-1$
-			}
-			throw e;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.ecore.xmi.impl.XMISaveImpl#addNamespaceDeclarations()
-	 */
-	public void addNamespaceDeclarations() {
-		super.addNamespaceDeclarations();
-		
-		if (!toDOM) {
-			// save tool version info
-			//
-			for (Iterator iter = VersionUtil.getAllToolIDs().iterator();iter.hasNext();) {
-				String toolID = (String)iter.next();
-				EPFVersions epfVersions = VersionUtil.getVersions(toolID);
-				String nsUri = epfVersions.getNsURI();
-				doc.addAttribute(ExtendedMetaData.XMLNS_PREFIX + ":" + toolID, nsUri); //$NON-NLS-1$
-				String toolVersion = epfVersions.getMinToolVersionForCurrentLibraryVersion().getToolVersion().toString();
-				doc.addAttribute(toolID + ":version", toolVersion); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	public static class MyEscape extends Escape {
-		// EMF 2.2 improved Escape a lot so the override this class to add our code is no longer needed
-		// except to make it public
-		
-		public MyEscape() {
-			setMappingLimit(0x10FFFF);
-		}
-	}
-
-	// TODO: needs to revisit this class periodically since its base class might be updated a
-	// lot in EMF.
-//	public static class MyEscape extends Escape {
-//		private static final int MAX_UTF_MAPPABLE_CODEPOINT = 0x10FFFF;
-//
-//		protected final char[] BLANK = {};
-//		
-//		private boolean allowControlCharacters;
-//
-//		public MyEscape() {
-//			super();
-//		}
-//		
-//		@Override
-//		public void setAllowControlCharacters(boolean allowControlCharacters) {
-//			this.allowControlCharacters = allowControlCharacters;
-//		}
-//		
-//	    /*
-//	     *  Convert attribute values:
-//	     *  & to &amp;
-//	     *  < to &lt;
-//	     *  " to &quot;
-//	     *  \t to &#x9;
-//	     *  \n to &#xA;
-//	     *  \r to &#xD;
-//	     *  
-//	     *  > to &gt; (this is used for XLIFF's)
-//	     */
-//	    public String convert(String input)
-//	    {
-//	      boolean changed = false;
-//	      int inputLength = input.length();
-//	      grow(inputLength);
-//	      int outputPos = 0;
-//	      int inputPos = 0;
-//	      char ch = 0;
-//	      while (inputLength-- > 0)
-//	      {
-//	        ch = input.charAt(inputPos++); // value[outputPos];
-//	        switch (ch)
-//	        {
-//	          case 0x1:
-//	          case 0x2:
-//	          case 0x3:
-//	          case 0x4:
-//	          case 0x5:
-//	          case 0x6:
-//	          case 0x7:
-//	          case 0x8:
-//	          case 0xB:
-//	          case 0xC:
-//	          case 0xE:
-//	          case 0xF:
-//	          case 0x10:
-//	          case 0x11:
-//	          case 0x12:
-//	          case 0x13:
-//	          case 0x14:
-//	          case 0x15:
-//	          case 0x16:
-//	          case 0x17:
-//	          case 0x18:
-//	          case 0x19:
-//	          case 0x1A:
-//	          case 0x1B:
-//	          case 0x1C:
-//	          case 0x1D:
-//	          case 0x1E:
-//	          case 0x1F:
-//	          {
-//	            if (allowControlCharacters)
-//	            {
-//	            outputPos = replaceChars(outputPos, CONTROL_CHARACTERS[ch], inputLength);
-//	            changed = true;
-//	            }
-//	            else
-//	            {
-//	              throw new RuntimeException("An invalid XML character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	            }
-//	            break;
-//	          }
-//	          case '&':
-//	          {
-//	            outputPos = replaceChars(outputPos, AMP, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '<':
-//	          {
-//	            outputPos = replaceChars(outputPos, LESS, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          // begin new code
-//	          case '>':
-//	          {
-//		            outputPos = replaceChars(outputPos, GREATER, inputLength);
-//		            changed = true;
-//		            break;  
-//	          }
-//	          // end new code	          
-//	          case '"':
-//	          {
-//	            outputPos = replaceChars(outputPos, QUOTE, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '\n':
-//	          {
-//	            outputPos = replaceChars(outputPos, LF, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '\r':
-//	          {
-//	            outputPos = replaceChars(outputPos, CR, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '\t':
-//	          {
-//	            outputPos = replaceChars(outputPos, TAB, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          default:
-//	          {
-//	            if (!XMLChar.isValid(ch))
-//	            {
-//	              if (XMLChar.isHighSurrogate(ch))
-//	              {
-//	                char high = ch;
-//	                if (inputLength-- > 0)
-//	                {
-//	                  ch = input.charAt(inputPos++); 
-//	                  if (XMLChar.isLowSurrogate(ch))
-//	                  {
-//	                    if (mappableLimit == MAX_UTF_MAPPABLE_CODEPOINT)
-//	                    {
-//	                      // Every codepoint is supported! 
-//	                      value[outputPos++] = high;
-//	                      value[outputPos++] = ch;
-//	                    }
-//	                    else
-//	                    {
-//	                      // Produce the supplemental character as an entity
-//	                      outputPos = replaceChars(outputPos, ("&#x" + Integer.toHexString(XMLChar.supplemental(high, ch)) + ";").toCharArray(), inputLength);
-//	                      changed = true;
-//	                    }
-//	                    break;
-//	                  }
-//	                  throw new RuntimeException("An invalid low surrogate character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	                }
-//	                else
-//	                {
-//	                  throw new RuntimeException("An unpaired high surrogate character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	                }
-//	              }
-//	              else
-//	              {
-//	                throw new RuntimeException("An invalid XML character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	              }
-//	            }
-//	            else
-//	            {
-//	              // Normal (BMP) unicode codepoint. See if we know for a fact that the encoding supports it:
-//	              if (ch <= mappableLimit)
-//	              {
-//	                value[outputPos++] = ch;
-//	              }
-//	              else
-//	              {
-//	                // We not sure the encoding supports this codepoint, so we write it as a character entity reference.
-//	                outputPos = replaceChars(outputPos, ("&#x" + Integer.toHexString(ch) + ";").toCharArray(), inputLength);
-//	                changed = true;
-//	              }
-//	            }
-//	            break;
-//	          }
-//	        }
-//	      }
-//	      return changed ? new String(value, 0, outputPos) : input;
-//	    }
-//
-//	    /*
-//	     *  Convert element values:
-//	     *  & to &amp;
-//	     *  < to &lt;
-//	     *  " to &quot;
-//	     *  \n to line separator
-//	     *  
-//	     *  \r to blank;
-//	     *  > to &gt; (this is used for XLIFF's)
-//	     */
-//	    public String convertText(String input)
-//	    {
-//	      boolean changed = false;
-//	      int inputLength = input.length();
-//	      grow(inputLength);
-//	      int outputPos = 0;
-//	      int inputPos = 0;
-//	      char ch;
-//	      while (inputLength-- > 0)
-//	      {
-//	        ch = input.charAt(inputPos++); // value[outputPos];
-//	        switch (ch)
-//	        {
-//	          case 0x1:
-//	          case 0x2:
-//	          case 0x3:
-//	          case 0x4:
-//	          case 0x5:
-//	          case 0x6:
-//	          case 0x7:
-//	          case 0x8:
-//	          case 0xB:
-//	          case 0xC:
-//	          case 0xE:
-//	          case 0xF:
-//	          case 0x10:
-//	          case 0x11:
-//	          case 0x12:
-//	          case 0x13:
-//	          case 0x14:
-//	          case 0x15:
-//	          case 0x16:
-//	          case 0x17:
-//	          case 0x18:
-//	          case 0x19:
-//	          case 0x1A:
-//	          case 0x1B:
-//	          case 0x1C:
-//	          case 0x1D:
-//	          case 0x1E:
-//	          case 0x1F:
-//	          {
-//	            if (allowControlCharacters)
-//	            {
-//	              outputPos = replaceChars(outputPos, CONTROL_CHARACTERS[ch], inputLength);
-//	              changed = true;
-//	            }
-//	            else
-//	            {
-//	              throw new RuntimeException("An invalid XML character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	            }
-//	            break;
-//	          }
-//	          case '&':
-//	          {
-//	            outputPos = replaceChars(outputPos, AMP, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '<':
-//	          {
-//	            outputPos = replaceChars(outputPos, LESS, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '"':
-//	          {
-//	            outputPos = replaceChars(outputPos, QUOTE, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '\n':
-//	          {
-//	            outputPos = replaceChars(outputPos, LINE_FEED, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          // begin modified
-//	          case '\r':
-//	          {
-//	            outputPos = replaceChars(outputPos, BLANK, inputLength);
-//	            changed = true;
-//	            break;
-//	          }
-//	          case '>':
-//	          {
-////	            if (inputPos >= 3 && input.charAt(inputPos - 2) == ']' && input.charAt(inputPos - 3) == ']')
-////	            {
-////	              outputPos = replaceChars(outputPos, GREATER, inputLength);
-////	              changed = true;
-////	              break;
-////	            }
-////	            // continue with default processing
-//	              outputPos = replaceChars(outputPos, GREATER, inputLength);
-//	              changed = true;
-//	              break;
-//	          }
-//		      // end modified
-//	          default:
-//	          {
-//	            if (!XMLChar.isValid(ch))
-//	            {
-//	              if (XMLChar.isHighSurrogate(ch))
-//	              {
-//	                char high = ch;
-//	                if (inputLength-- > 0)
-//	                {
-//	                  ch = input.charAt(inputPos++); 
-//	                  if (XMLChar.isLowSurrogate(ch))
-//	                  {
-//	                    if (mappableLimit == MAX_UTF_MAPPABLE_CODEPOINT)
-//	                    {
-//	                      // Every codepoint is supported! 
-//	                      value[outputPos++] = high;
-//	                      value[outputPos++] = ch;
-//	                    }
-//	                    else
-//	                    {
-//	                      // Produce the supplemental character as an entity
-//	                      outputPos = replaceChars(outputPos, ("&#x" + Integer.toHexString(XMLChar.supplemental(high, ch)) + ";").toCharArray(), inputLength);
-//	                      changed = true;
-//	                    }
-//	                    break;
-//	                  }
-//	                  throw new RuntimeException("An invalid low surrogate character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	                }
-//	                else
-//	                {
-//	                  throw new RuntimeException("An unpaired high surrogate character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	                }
-//	              }
-//	              else
-//	              {
-//	                throw new RuntimeException("An invalid XML character (Unicode: 0x" + Integer.toHexString(ch) + ") was found in the element content:" + input);
-//	              }
-//	            }
-//	            else
-//	            {
-//	              // Normal (BMP) unicode codepoint. See if we know for a fact that the encoding supports it:
-//	              if (ch <= mappableLimit)
-//	              {
-//	                value[outputPos++] = ch;
-//	              }
-//	              else
-//	              {
-//	                // We not sure the encoding supports this codepoint, so we write it as a character entity reference.
-//	                outputPos = replaceChars(outputPos, ("&#x" + Integer.toHexString(ch) + ";").toCharArray(), inputLength);
-//	                changed = true;
-//	              }
-//	            }
-//	            break;
-//	          }
-//	        }
-//	      }
-//	      return changed ? new String(value, 0, outputPos) : input;
-//	    }
-//
-//	}
-
-	public static boolean checkModifyRequired(Map options) {
-		Object opt = options.get(MultiFileXMISaveImpl.CHECK_MODIFY);
-		return opt != null ? Boolean.valueOf(opt.toString()).booleanValue()
-				: false;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/PersistencePlugin.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/PersistencePlugin.java
deleted file mode 100644
index c98f666..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/PersistencePlugin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import org.eclipse.epf.common.AbstractActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class for the Library Persistence plug-in.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class PersistencePlugin extends AbstractActivator {
-
-	// The shared plug-in instance.
-	private static PersistencePlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PersistencePlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static PersistencePlugin getDefault() {
-		return plugin;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/TxRecord.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/TxRecord.java
deleted file mode 100644
index c9c0eaa..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/TxRecord.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * This class keep the transaction data to support fail-safe persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-class TxRecord {
-
-	private String txID;
-
-	private List resourcesToCommit;
-
-	protected List warnings;
-
-	/**
-	 * @param txid
-	 * @param commit
-	 */
-	public TxRecord() {
-		super();
-		resourcesToCommit = new UniqueEList();
-	}
-
-	public String getTxID() {
-		if (txID == null) {
-			txID = UmaUtil.generateGUID();
-		}
-		return txID;
-	}
-
-	public List getResourcesToCommit() {
-		return resourcesToCommit;
-	}
-
-	/**
-	 * @return the warnings
-	 */
-	public List getWarnings() {
-		if (warnings == null) {
-			warnings = new ArrayList();
-		}
-		return warnings;
-	}
-
-	public void clear() {
-		txID = null;
-		resourcesToCommit.clear();
-		if (warnings != null) {
-			warnings.clear();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/UnnormalizedURIException.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/UnnormalizedURIException.java
deleted file mode 100644
index 188e222..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/UnnormalizedURIException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-/**
- * Exception for URI that cannot be normalized.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UnnormalizedURIException extends MultiFileIOException {
-
-	/**
-	 * @param msg
-	 */
-	public UnnormalizedURIException(String msg) {
-		super(msg);
-	}
-
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 8129316210755337816L;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/XMILibraryPersister.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/XMILibraryPersister.java
deleted file mode 100644
index 13d6132..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/XMILibraryPersister.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * @author Phong Nguyen Le - Oct 10, 2006
- * @since  1.0
- */
-public class XMILibraryPersister implements IFileBasedLibraryPersister {
-	
-	/**
-	 * Contructs a new XMILibraryPersister instance.
-	 */
-	public XMILibraryPersister() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#getFileExtension(java.lang.Object)
-	 */
-	public String getFileExtension(Object e) {
-		return MethodLibraryPersister.INSTANCE.getFileExtension(e);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#getFolderRelativePath(org.eclipse.epf.uma.MethodElement)
-	 */
-	public String getFolderRelativePath(MethodElement e) {
-		return MethodLibraryPersister.INSTANCE.getFolderRelativePath(e);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.IFileBasedLibraryPersister#hasOwnFolder(java.lang.Object)
-	 */
-	public boolean hasOwnFolder(Object e) {
-		return MethodLibraryPersister.INSTANCE.hasOwnFolder(e);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#adjustLocation(org.eclipse.emf.ecore.resource.Resource)
-	 */
-	public void adjustLocation(Resource resource) {
-		MethodLibraryPersister.INSTANCE.adjustLocation(resource);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#delete(org.eclipse.epf.uma.MethodElement)
-	 */
-	public void delete(MethodElement e) {
-		MethodLibraryPersister.INSTANCE.delete(e);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#getFailSafePersister()
-	 */
-	public FailSafeMethodLibraryPersister getFailSafePersister() {
-		return MethodLibraryPersister.INSTANCE.getFailSafePersister();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#getWarnings()
-	 */
-	public List getWarnings() {
-		return MethodLibraryPersister.INSTANCE.getWarnings();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#hasOwnResource(java.lang.Object)
-	 */
-	public boolean hasOwnResource(Object e) {
-		return MethodLibraryPersister.INSTANCE.hasOwnResource(e);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#hasOwnResourceWithoutReferrer(java.lang.Object)
-	 */
-	public boolean hasOwnResourceWithoutReferrer(Object e) {
-		return MethodLibraryPersister.INSTANCE.hasOwnResourceWithoutReferrer(e);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#save(org.eclipse.emf.ecore.resource.Resource)
-	 */
-	public void save(Resource resource) throws Exception {
-		MethodLibraryPersister.INSTANCE.save(resource);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.util.ILibraryPersister#save(org.eclipse.epf.uma.MethodElement)
-	 */
-	public void save(MethodElement element) throws Exception {
-		MethodLibraryPersister.INSTANCE.save(element);
-	}
-
-	public File createMethodPluginFolder(String pluginName, MethodLibrary library) {
-		return MethodLibraryPersister.INSTANCE.createMethodPluginFolder(pluginName, library);
-	}
-
-	public File getDefaultMethodConfigurationFolder(MethodLibrary library) {
-		return MethodLibraryPersister.INSTANCE.getDefaultMethodConfigurationFolder(library);
-	}
-
-	public void setDefaultMethodConfigurationFolder(MethodLibrary library, File file) {
-		MethodLibraryPersister.INSTANCE.setDefaultMethodConfigurationFolder(library, file);
-	}
-
-	public boolean isContainedBy(Resource resource, Resource containerResource) {
-		return MethodLibraryPersister.INSTANCE.isContainedBy(resource, containerResource);
-	}
-
-	public String getResourceFolderPath(MethodElement e) {
-		return MethodLibraryPersister.INSTANCE.getResourceFolderPath(e);
-	}
-
-	public String getFolderAbsolutePath(MethodElement e) {
-		return MethodLibraryPersister.INSTANCE.getFolderAbsolutePath(e);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.services.ILibraryPersister#delete(java.util.Collection)
-	 */
-	public void delete(Collection<MethodElement> elements) {
-		MethodLibraryPersister.INSTANCE.delete(elements);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/XMILibraryResourceSetFactory.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/XMILibraryResourceSetFactory.java
deleted file mode 100644
index 7c2af96..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/XMILibraryResourceSetFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence;
-
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.persistence.ILibraryResourceSetFactory;
-import org.eclipse.epf.services.Services;
-
-/**
- * @author Phong Nguyen Le - Oct 27, 2006
- * @since  1.0
- */
-public class XMILibraryResourceSetFactory implements ILibraryResourceSetFactory {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSetFactory#createLibraryResourceSet()
-	 */
-	public ILibraryResourceSet createLibraryResourceSet() {
-		return new MultiFileResourceSetImpl();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.persistence.ILibraryResourceSetFactory#getPersistenceType()
-	 */
-	public String getPersistenceType() {
-		return Services.XMI_PERSISTENCE_TYPE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/IMigrator.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/IMigrator.java
deleted file mode 100644
index 08d8029..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/IMigrator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.migration;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Migrates one version of UMA library to another
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IMigrator {
-
-	void migrate(String libPath, IProgressMonitor monitor) throws Exception;
-	void migrate(String libPath, IProgressMonitor monitor, UpgradeCallerInfo info) throws Exception;
-	void migrateXmlImportedLib(MethodLibrary lib, IProgressMonitor monitor) throws Exception;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MappingUtil.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MappingUtil.java
deleted file mode 100644
index 3d8b37d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MappingUtil.java
+++ /dev/null
@@ -1,197 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.migration;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.epf.common.serviceability.EPFVersions;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.osgi.framework.Bundle;
-
-/**
- * Utility class with static convenience methods to perform library upgrade from
- * older version.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class MappingUtil {
-
-	private static class Migrator {
-		Bundle bundle;
-
-		String className;
-
-		String libNsURI;
-
-		IMigrator instance;
-
-		/**
-		 * @param bundle
-		 * @param className
-		 * @param libNsURI
-		 */
-		public Migrator(Bundle bundle, String className, String libNsURI) {
-			super();
-			this.bundle = bundle;
-			this.className = className;
-			this.libNsURI = libNsURI;
-		}
-	}
-
-	private final static boolean localDebug = false;
-	private static Map migrators;
-	private static Set oldNsUris = new HashSet();
-	private static Map<String, String> adjustedLibNsURIMap = new HashMap<String,String>();
-
-	public static final IMigrator getMigrator(String libNsURI) {
-		if (migrators == null) {
-			migrators = new HashMap();
-			// Process the "org.eclipse.epf.library.persistence.migrators"
-			// extension point
-			// contributors.
-			IExtensionRegistry extensionRegistry = Platform
-					.getExtensionRegistry();
-			IExtensionPoint extensionPoint = extensionRegistry
-					.getExtensionPoint(
-							"org.eclipse.epf.library.persistence", "migrators"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (extensionPoint != null) {
-				IExtension[] extensions = extensionPoint.getExtensions();
-				for (int i = 0; i < extensions.length; i++) {
-					IExtension extension = extensions[i];
-					String pluginId = extension.getNamespaceIdentifier();
-					Bundle bundle = Platform.getBundle(pluginId);
-					IConfigurationElement[] configElements = extension
-							.getConfigurationElements();
-					for (int j = 0; j < configElements.length; j++) {
-						IConfigurationElement configElement = configElements[j];
-						try {
-							String className = configElement
-									.getAttribute("class"); //$NON-NLS-1$
-							String nsURI = configElement
-									.getAttribute("libNsURI"); //$NON-NLS-1$
-							if (className != null
-									&& className.trim().length() > 0
-									&& nsURI != null
-									&& nsURI.trim().length() > 0) {
-								migrators.put(nsURI, new Migrator(bundle,
-										className, nsURI));
-							}
-						} catch (Exception e) {
-							CommonPlugin.INSTANCE.log(e);
-						}
-					}
-				}
-			}
-		}
-		Migrator migrator = (Migrator) migrators.get(libNsURI);
-		if (migrator != null) {
-			if (migrator.instance == null) {
-				try {
-					migrator.instance = (IMigrator) migrator.bundle.loadClass(
-							migrator.className).newInstance();
-				} catch (Exception e) {
-					CommonPlugin.INSTANCE.log(e);
-				}
-			}
-			return migrator.instance;
-		}
-		return null;
-	}
-
-	public synchronized static final boolean conversionRequired(String libPath,
-			VersionUtil.VersionCheckInfo info) {
-		String currentNsURI = PersistenceUtil.getUMANsURI();
-		String libNsURI = PersistenceUtil.getUMANsURI(libPath);
-		libNsURI = getAdjustedLibNsURI(libNsURI, info);
-
-		if (oldNsUris.contains(libNsURI)) {
-			return true;
-		}
-		if (currentNsURI.equals(libNsURI)) {
-			return false;
-		}
-		boolean ret = getMigrator(libNsURI) != null;
-		if (ret) {
-			oldNsUris.add(libNsURI);
-		}
-		return ret;
-	}
-	
-	//This is an ugly piece, but we need it for migrating EPF 1.1.0
-	private static String getAdjustedLibNsURI(String libNsURI, VersionUtil.VersionCheckInfo info) {
-		String ret = getAdjustedLibNsURI_(libNsURI, info);
-		if (ret != libNsURI) {
-			if (localDebug) {
-				System.out.println("LD> libNsURI: " + libNsURI);	//$NON-NLS-1$ 
-				System.out.println("LD> adjustedLibNsURI: " + ret);	//$NON-NLS-1$
-			}
-			adjustedLibNsURIMap.put(libNsURI, ret);
-		}
-		return ret;
-	}
-	private static String getAdjustedLibNsURI_(String libNsURI, VersionUtil.VersionCheckInfo info) {
-		String currentNsURI = PersistenceUtil.getUMANsURI();
-		if (! currentNsURI.equals(libNsURI)) {
-			return libNsURI;
-		} else if (! libNsURI.equals("http://www.eclipse.org/epf/uma/1.0.4/uma.ecore")) { //$NON-NLS-1$ 
-			return libNsURI;
-		}
-		if (info.toolVersion.equals(info.currentMinToolVersion)) {
-			return libNsURI;
-		}
-		return "http://www.eclipse.org/epf/uma/1.0.3/uma.ecore";	//$NON-NLS-1$ 
-	}
-
-	public static void migrate(String libPath, IProgressMonitor monitor, UpgradeCallerInfo info)
-			throws Exception {
-		IMigrator migrator = getMigratorByLibPath(libPath);
-		if (migrator != null) {
-			migrator.migrate(libPath, monitor, info);
-		}
-	}
-	
-	public static IMigrator getMigratorByLibPath(String libPath) {
-		String nsURI = PersistenceUtil.getUMANsURI(libPath);
-		String adjustedLibNsURI = adjustedLibNsURIMap.get(nsURI);
-		if (adjustedLibNsURI != null) {
-			nsURI = adjustedLibNsURI;
-		}
-		return getMigrator(nsURI);
-	}
-
-	public static void main(String[] args) {
-		String libPath = args[0];
-		System.out
-				.println("Start migrating method library at '" + libPath + "'..."); //$NON-NLS-1$ //$NON-NLS-2$
-		try {
-			migrate(libPath, null, null);
-			System.out.println();
-			System.out.println("Migration successfull."); //$NON-NLS-1$
-		} catch (Exception e) {
-			e.printStackTrace();
-			System.err.println();
-			System.err.println("Migration failed."); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MigrationResourceHandler.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MigrationResourceHandler.java
deleted file mode 100644
index b2c38f1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MigrationResourceHandler.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.migration;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap.Entry;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.BasicResourceHandler;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-
-/**
- * Resource handler for migrating UMA library from one version to another.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class MigrationResourceHandler extends BasicResourceHandler {
-
-	private static final boolean DEBUG = true;
-
-	public MigrationResourceHandler() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.ecore.xmi.impl.BasicResourceHandler#postLoad(org.eclipse.emf.ecore.xmi.XMLResource,
-	 *      java.io.InputStream, java.util.Map)
-	 */
-	public void postLoad(XMLResource resource, InputStream inputStream,
-			Map options) {
-		if (!resource.getEObjectToExtensionMap().isEmpty()) {
-			if (DEBUG) {
-				System.out
-						.println("MigrationResourceHandler.postLoad(): " + resource.getURI()); //$NON-NLS-1$
-				System.out.println("---- Start unknown features ----"); //$NON-NLS-1$
-			}
-			for (Iterator iter = resource.getEObjectToExtensionMap().entrySet()
-					.iterator(); iter.hasNext();) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				if (entry.getKey() instanceof EObject) {
-					// handle moved data
-					//
-					handleUnknownData((EObject) entry.getKey(), (AnyType)entry.getValue());
-				}
-			}
-			if (DEBUG)
-				System.out.println("---- End unknown features ----"); //$NON-NLS-1$
-		}
-	}
-
-	public static String getText(AnyType value) {
-		try {
-			if (value == null)
-				return null;
-			FeatureMap.Entry entry = (FeatureMap.Entry) value.getMixed().get(0);
-			return (String) entry.getValue();
-		} catch (RuntimeException e) {
-			throw e;
-		}
-	}
-
-	protected static EAttribute getEAttribute(EClass eClass, String name) {
-		for (Iterator iterator = eClass.getEAllAttributes().iterator(); iterator
-				.hasNext();) {
-			EAttribute attrib = (EAttribute) iterator.next();
-			if (attrib.getName().equals(name)) {
-				return attrib;
-			}
-		}
-		return null;
-	}
-
-	public static void setValue(EObject eObject, EStructuralFeature feature,
-			Object value) {
-		if (!feature.isMany()) {
-			eObject.eSet(feature, value);
-		} else {
-			Collection values = (Collection) eObject.eGet(feature);
-			if (value instanceof Collection) {
-				values.addAll((Collection) value);
-			} else {
-				values.add(value);
-			}
-		}
-
-	}
-	
-	protected abstract boolean handleUnknownFeature(EObject owner, EStructuralFeature feature, Object value);
-
-	private void handleUnknownFeatures(EObject owner, FeatureMap featureMap) {
-		for (Iterator iter = featureMap.iterator(); iter.hasNext();) {
-			FeatureMap.Entry entry = (FeatureMap.Entry) iter.next();
-			EStructuralFeature f = entry.getEStructuralFeature();
-			if(handleUnknownFeature(owner, f, entry.getValue())) {
-				iter.remove();
-			}
-		}
-	}
-
-	/**
-	 * @param key
-	 * @param value
-	 */
-	protected void handleUnknownData(EObject e, AnyType unknownData) {
-		handleUnknownFeatures(e, unknownData.getMixed());
-		handleUnknownFeatures(e, unknownData.getAnyAttribute());
-	}
-
-
-	public static Object getSingleValue(FeatureMap featureMap,
-			String featureName) {
-		for (Iterator iter = featureMap.iterator(); iter.hasNext();) {
-			FeatureMap.Entry entry = (Entry) iter.next();
-			if (entry.getEStructuralFeature().getName().equals(featureName)) {
-				return entry.getValue();
-			}
-		}
-		return null;
-	}
-
-	protected static Collection getValue(FeatureMap featureMap,
-			String featureName) {
-		Collection list = new ArrayList();
-		for (Iterator iter = featureMap.iterator(); iter.hasNext();) {
-			FeatureMap.Entry entry = (Entry) iter.next();
-			if (entry.getEStructuralFeature().getName().equals(featureName)) {
-				list.add(entry.getValue());
-			}
-		}
-		return list;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MigratorImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MigratorImpl.java
deleted file mode 100644
index ea49d28..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/MigratorImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.persistence.migration;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Default implementaton for IMigrator
- * 
- * @author Weiping Lu
- * 
- * @since 1.2
- */
-public class MigratorImpl implements IMigrator {
-	
-	public void migrate(String libPath, IProgressMonitor monitor) throws Exception {		
-	}
-	
-	public void migrate(String libPath, IProgressMonitor monitor, UpgradeCallerInfo info) throws Exception {		
-	}
-	
-	public void migrateXmlImportedLib(MethodLibrary lib, IProgressMonitor monitor) throws Exception {		
-	}
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/UMA2UMAResourceHandler.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/UMA2UMAResourceHandler.java
deleted file mode 100644
index 1425d1b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/UMA2UMAResourceHandler.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.migration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap.Entry;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-
-/**
- * Resource handler for migrating UMA library from one version to another.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UMA2UMAResourceHandler extends MigrationResourceHandler {
-
-	private static final boolean DEBUG = true;
-
-	private List moveInfos;
-
-	public UMA2UMAResourceHandler() {
-		moveInfos = new ArrayList();
-	}
-
-	protected static EAttribute getEAttribute(EClass eClass, String name) {
-		for (Iterator iterator = eClass.getEAllAttributes().iterator(); iterator
-				.hasNext();) {
-			EAttribute attrib = (EAttribute) iterator.next();
-			if (attrib.getName().equals(name)) {
-				return attrib;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Subclass can override this method to customize rules to move data
-	 * 
-	 * @param owner
-	 * @param featureName
-	 * @return
-	 */
-	protected EStructuralFeature getNewFeature(EObject owner, String featureName) {
-		return null;
-	}
-
-	/**
-	 * Subclass can override this method to customize rules to move data
-	 * 
-	 * @param oldOwner
-	 * @param featureName
-	 * @return
-	 */
-	protected EObject getNewOwner(EObject oldOwner, String featureName) {
-		return null;
-	}
-
-	protected Object getNewValue(EObject oldOwner, String featureName,
-			AnyType value) {
-		return null;
-	}
-
-	public void moveData() {
-		for (Iterator iter = moveInfos.iterator(); iter.hasNext();) {
-			MoveInfo info = (MoveInfo) iter.next();
-			EObject newOwner = getNewOwner(info.oldOwner, info.oldFeatureName);
-			if (newOwner != null) {
-				setValue(newOwner, info.newFeature, info.value);
-			}
-		}
-	}
-
-	public static void setValue(EObject eObject, EStructuralFeature feature,
-			Object value) {
-		if (!feature.isMany()) {
-			eObject.eSet(feature, value);
-		} else {
-			Collection values = (Collection) eObject.eGet(feature);
-			if (value instanceof Collection) {
-				values.addAll((Collection) value);
-			} else {
-				values.add(value);
-			}
-		}
-
-	}
-
-	private static class MoveInfo {
-		EObject oldOwner;
-
-		String oldFeatureName;
-
-		EStructuralFeature newFeature;
-
-		Object value;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Object#toString()
-		 */
-		public String toString() {
-			return new StringBuffer()
-					.append(getClass().getName())
-					.append("(\n") //$NON-NLS-1$
-					.append("  oldFeatureName: ").append(oldFeatureName).append('\n') //$NON-NLS-1$
-					.append("  newFeature: ").append(newFeature).append('\n') //$NON-NLS-1$
-					.append("  value: ").append(value).append('\n') //$NON-NLS-1$
-					.append(")").toString(); //$NON-NLS-1$
-		}
-	}
-
-	public static Object getSingleValue(FeatureMap featureMap,
-			String featureName) {
-		for (Iterator iter = featureMap.iterator(); iter.hasNext();) {
-			FeatureMap.Entry entry = (Entry) iter.next();
-			if (entry.getEStructuralFeature().getName().equals(featureName)) {
-				return entry.getValue();
-			}
-		}
-		return null;
-	}
-
-	protected static Collection getValue(FeatureMap featureMap,
-			String featureName) {
-		Collection list = new ArrayList();
-		for (Iterator iter = featureMap.iterator(); iter.hasNext();) {
-			FeatureMap.Entry entry = (Entry) iter.next();
-			if (entry.getEStructuralFeature().getName().equals(featureName)) {
-				list.add(entry.getValue());
-			}
-		}
-		return list;
-	}
-
-	public void clearMoveInfos() {
-		moveInfos.clear();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.persistence.migration.MigrationResourceHandler#handleUnknownFeature(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object)
-	 */
-	protected boolean handleUnknownFeature(EObject owner, EStructuralFeature feature, Object value) {
-		String featureName = feature.getName();
-		EStructuralFeature newFeature = getNewFeature(owner, featureName);
-		if (newFeature != null) {
-			MoveInfo moveInfo = new MoveInfo();
-			moveInfo.oldOwner = owner;
-			moveInfo.oldFeatureName = featureName;
-			moveInfo.newFeature = newFeature;
-			moveInfo.value = value instanceof AnyType ? getNewValue(
-					owner, featureName, (AnyType) value)
-					: value;
-			moveInfos.add(moveInfo);
-			if (DEBUG) {
-				System.out.println(moveInfo);
-				System.out.println();
-			}
-			return true;
-		}
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/UpgradeCallerInfo.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/UpgradeCallerInfo.java
deleted file mode 100644
index 43ce675..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/UpgradeCallerInfo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.persistence.migration;
-
-import java.io.File;
-
-/**
- * Class representing caller info for calling library upgrade code.
- * 
- * @author Weiping Lu
- * 
- * @since 1.0
- */
-public class UpgradeCallerInfo {
-	
-	public static int upgradeLibrary = 0;
-	public static int upgradeImportPlugin = 1;
-	public static int upgradeImportConfig = 2;
-	
-	private int callerType = upgradeLibrary;
-	private String errorMsg;
-	File libFile;
-	File copiedLibFile;
-	
-	public UpgradeCallerInfo(int callerType, File libFile) {
-		this.callerType = callerType;
-		this.libFile = libFile;
-	}
-	
-	public static boolean isUpgradeLibrary(UpgradeCallerInfo info) {
-		return info == null || info.isUpgradeLibrary();
-	}
-	
-	public boolean isUpgradeLibrary() {
-		return callerType == upgradeLibrary;
-	}
-	
-	public boolean getIsExportedPluginLib() {
-		return callerType == upgradeImportPlugin;
-	}
-	
-	public void setErrorMsg(String msg) {
-		errorMsg = msg;
-	}
-	
-	public String getErrorMsg() {
-		return errorMsg;
-	}			
-	
-	public void setCopiedLibFile(File file) {
-		copiedLibFile = file;
-	}
-	
-	public File getCopiedLibFile() {
-		return copiedLibFile;
-	}
-	
-	protected File getLibFile() {
-		return libFile;
-	}
-
-	public void copyLibrary() {
-	}
-	
-	public void removeCopiedLibrary() {
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/Migrator.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/Migrator.java
deleted file mode 100644
index b385aa2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/Migrator.java
+++ /dev/null
@@ -1,725 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.migration.internal;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.EPackageRegistryImpl;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.ExtendedMetaData;
-import org.eclipse.emf.ecore.xmi.IllegalValueException;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-import org.eclipse.emf.mapping.ecore2xml.Ecore2XMLPackage;
-import org.eclipse.emf.mapping.ecore2xml.Ecore2XMLRegistry;
-import org.eclipse.emf.mapping.ecore2xml.impl.Ecore2XMLRegistryImpl;
-import org.eclipse.emf.mapping.ecore2xml.util.Ecore2XMLExtendedMetaData;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileURIConverter;
-import org.eclipse.epf.persistence.MultiFileXMIHelperImpl;
-import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
-import org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Migrates one version of UMA library to another using the provided Ecore2XML
- * mapping files and UMA2UMAResourceHandler. The Ecore2XML mapping files
- * specifies the name changes of classes/attributes while UMA2UMAResourceHandler
- * handles the data moving.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class Migrator {
-	private static final String[] NS_URIs = { Migrator.OLD_UMA_NS_URI,
-			Migrator.OLD_UMA_NS_URI, Migrator.UMA_NS_URI };
-
-	private static final URI[] ECORE2XML_URIs = {
-			URI
-					.createURI("platform:/plugin/com.ibm.rpm.library.persistence/migration/uma.ecore2xml") //$NON-NLS-1$
-			,
-			URI
-					.createURI("platform:/plugin/com.ibm.rpm.library.persistence/migration/uma2.ecore2xml") //$NON-NLS-1$
-			,
-			URI
-					.createURI("platform:/plugin/com.ibm.rpm.library.persistence/migration/uma3.ecore2xml") //$NON-NLS-1$
-	};
-
-	public static final String OLD_UMA_NS_URI = "http:///com/ibm/uma.ecore"; //$NON-NLS-1$
-
-	public static final String UMA_NS_URI = "http://www.ibm.com/uma/1.0.2/uma.ecore"; //$NON-NLS-1$
-
-	private ExtendedMetaData[] extendedMetaDatas;
-
-	private UMA2UMAResourceHandler0 resourceHandler;
-
-	public HashMap oldPathToNewURIMap = new HashMap();
-
-	public Collection anyTypeFeatureValues = new ArrayList();
-
-	private static final ExtendedMetaData getExtendedMetaData(String oldNsURI,
-			URI ecore2XMLURI) {
-		EPackage.Registry ePackageRegistry = new EPackageRegistryImpl(
-				EPackage.Registry.INSTANCE);
-		ePackageRegistry.put(oldNsURI, UmaPackage.eINSTANCE);
-
-		Ecore2XMLRegistry ecore2xmlRegistry = new Ecore2XMLRegistryImpl(
-				Ecore2XMLRegistry.INSTANCE);
-
-		ecore2xmlRegistry
-				.put(oldNsURI, EcoreUtil.getObjectByType(new ResourceSetImpl()
-						.getResource(ecore2XMLURI, true).getContents(),
-						Ecore2XMLPackage.eINSTANCE.getXMLMap()));
-
-		return new Ecore2XMLExtendedMetaData(ePackageRegistry,
-				ecore2xmlRegistry) {
-			public EClassifier getType(EPackage ePackage, String name) {
-				EClassifier type = super.getType(ePackage, name);
-
-				if (type == null) {
-					// try to get type from the package with the given name
-					//
-					List eClassifiers = ePackage.getEClassifiers();
-					for (int i = 0, size = eClassifiers.size(); i < size; ++i) {
-						EClassifier eClassifier = (EClassifier) eClassifiers
-								.get(i);
-						if (name.equals(eClassifier.getName())) {
-							return eClassifier;
-						}
-					}
-
-				}
-
-				return type;
-			}
-		};
-	}
-
-	public Migrator() {
-		this(NS_URIs, ECORE2XML_URIs);
-	}
-
-	public Migrator(String[] nsURIs, URI[] ecore2XMLURIs) {
-		int size = ecore2XMLURIs.length;
-		extendedMetaDatas = new ExtendedMetaData[size];
-		for (int i = 0; i < ecore2XMLURIs.length; i++) {
-			extendedMetaDatas[i] = getExtendedMetaData(nsURIs[i],
-					ecore2XMLURIs[i]);
-		}
-		this.resourceHandler = new UMA2UMAResourceHandler0();
-	}
-
-	private static void updateStatus(IProgressMonitor monitor, String msg) {
-		if (monitor != null) {
-			monitor.setTaskName(msg);
-		} else {
-			System.out.println(msg);
-		}
-	}
-
-	private static class AnyTypeFeatureValue {
-		String ownerId;
-
-		EObject owner;
-
-		EStructuralFeature feature;
-
-		String valueId;
-
-		AnyType value;
-
-		int index;
-	}
-
-	class MigratorURIConverter extends MultiFileURIConverter {
-		private ResourceManager oldResMgr;
-
-		/**
-		 * @param resourceSet
-		 */
-		public MigratorURIConverter(MultiFileResourceSetImpl resourceSet) {
-			super(resourceSet);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.uma.persistence.MultiFileURIConverter#normalize(org.eclipse.emf.common.util.URI)
-		 */
-		public URI normalize(URI uri) {
-			URI normalized = super.normalize(uri);
-			if (normalized == null && SCHEME.equalsIgnoreCase(uri.scheme())) {
-				if (oldResMgr != null) {
-					String id = uri.authority();
-					normalized = getURIFromOldResourceManager(id);
-					if (normalized != null) {
-						if (uri.hasFragment()) {
-							normalized = normalized.appendFragment(uri
-									.fragment());
-						} else {
-							normalized = normalized.appendFragment(id);
-						}
-					}
-				}
-
-			}
-			return normalized;
-		}
-
-		public URI getURIFromOldResourceManager(String id) {
-			if (oldResMgr == null)
-				return null;
-			ResourceDescriptor desc = oldResMgr.getResourceDescriptor(id);
-			if (desc != null) {
-				URI normalized = desc.getResolvedURI();
-				URI newURI = (URI) oldPathToNewURIMap.get(normalized
-						.toFileString());
-				if (newURI != null) {
-					normalized = newURI;
-				}
-				return normalized;
-			}
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.uma.persistence.MultiFileURIConverter#dispose()
-		 */
-		public void dispose() {
-			if (oldResMgr != null) {
-				oldResMgr.dispose();
-				oldResMgr = null;
-			}
-
-			super.dispose();
-		}
-
-		/**
-		 * @param resMgr2
-		 */
-		public void setOldResourceManager(ResourceManager resMgr) {
-			oldResMgr = resMgr;
-		}
-
-		public ResourceManager getOldResourceManager() {
-			return oldResMgr;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.uma.persistence.MultiFileURIConverter#setURIMapping(org.eclipse.emf.ecore.EObject,
-		 *      org.eclipse.emf.common.util.URI, java.util.Set)
-		 */
-		public void setURIMapping(EObject e, URI uri, Set modifiedResources) {
-			// code to support migration from older version
-			//
-			if (e instanceof MethodElement) {
-				MigratorURIConverter uriConverter = (MigratorURIConverter) ((MultiFileResourceSetImpl) e
-						.eResource().getResourceSet()).getURIConverter();
-				ResourceManager oldResMgr = uriConverter
-						.getOldResourceManager();
-				if (oldResMgr != null) {
-					ResourceDescriptor desc = oldResMgr
-							.getResourceDescriptor(((MethodElement) e)
-									.getGuid());
-					if (desc != null) {
-						oldPathToNewURIMap.put(desc.getResolvedURI()
-								.toFileString(), uri);
-					}
-				}
-			}
-
-			super.setURIMapping(e, uri, modifiedResources);
-		}
-	}
-
-	class MigratorResourceSet extends MultiFileResourceSetImpl {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.uma.persistence.MultiFileResourceSetImpl#getURIConverter()
-		 */
-		public URIConverter getURIConverter() {
-			if (uriConverter == null) {
-				uriConverter = new MigratorURIConverter(this);
-			}
-			return uriConverter;
-		}
-
-		private void loadOldResourceManager(String libPath) throws IOException {
-			// trying to load the resource descriptors file
-			//
-			String libDir = new File(libPath).getParent() + File.separator;
-			File file = new File(libDir, RESMGR_XMI);
-			ResourceManager resMgr = null;
-			MultiFileURIConverter multiFileURIConverter = (MultiFileURIConverter) getURIConverter();
-			if (file.exists()) {
-				Resource resMgrRes = new XMIResourceImpl(URI.createFileURI(file
-						.getAbsolutePath())); // super.getResource(URI.createFileURI(file.getAbsolutePath()),
-				// true);
-				resMgrRes.load(null);
-				if (!resMgrRes.getContents().isEmpty()) {
-					Object obj = resMgrRes.getContents().get(0);
-					if (obj instanceof ResourceManager) {
-						resMgr = (ResourceManager) obj;
-						// resMgr.resolve();
-					} else {
-						System.err
-								.println("Invalid ResourceManager file: " + file); //$NON-NLS-1$
-					}
-				}
-			}
-			((MigratorURIConverter) multiFileURIConverter)
-					.setOldResourceManager(resMgr);
-		}
-
-		public MethodLibrary loadLibrary(String path) throws Exception {
-			loadOldResourceManager(path);
-
-			return loadLibraryWithoutReset(path);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.uma.persistence.MultiFileResourceSetImpl#findEObjectInUnloadedResources(java.lang.String)
-		 */
-		protected EObject findEObjectInUnloadedResources(String id) {
-			Object object = null;
-			if (getResourceManager() != null) {
-				object = super.findEObjectInUnloadedResources(id);
-			}
-			if (object == null) {
-				URI uri = ((MigratorURIConverter) getURIConverter())
-						.getURIFromOldResourceManager(id);
-				Resource resource = super.getResource(uri, true);
-				return resource.getEObject(id);
-			}
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.uma.persistence.MultiFileResourceSetImpl#getEObject(org.eclipse.emf.common.util.URI,
-		 *      boolean)
-		 */
-		public EObject getEObject(URI uri, boolean loadOnDemand) {
-			// EObject eObj = superGetEObject(uri, loadOnDemand);
-			EObject eObj = super.getEObject(uri, loadOnDemand);
-			if (eObj == null
-					&& MigratorURIConverter.SCHEME.equalsIgnoreCase(uri
-							.scheme()) && !uri.hasFragment()) {
-				eObj = super.getEObject(uri.authority());
-			}
-			// if(uri.authority().equals("{11B60A4B-A0C7-4D5C-891A-346E8652A4EB}"))
-			// {
-			// System.out.println("MigratorResourceSet.getEObject(): eObj = " +
-			// eObj);
-			// }
-			if (eObj == null || eObj.eIsProxy()) {
-				throw new RuntimeException(
-						"Could not load object with URI '" + uri + "' (normalized URI: '" + getURIConverter().normalize(uri) + "').\nPlease see log file for more details."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			return eObj;
-		}
-
-		public EObject superGetEObject(URI uri, boolean loadOnDemand) {
-			try {
-				URI normalized = getURIConverter().normalize(uri);
-				if (normalized == null) {
-					return null;
-				}
-				Resource resource = null;
-				resource = getResource(normalized.trimFragment(), loadOnDemand);
-				if (resource != null) {
-					String fragment = normalized.fragment();
-					if (fragment == null || fragment.length() == 0) {
-						return PersistenceUtil.getMethodElement(resource);
-					}
-					try {
-						return resource.getEObject(fragment);
-					} catch (NullPointerException e) {
-						throw e;
-					}
-				} else {
-					return null;
-				}
-			} catch (RuntimeException e) {
-				//
-			}
-			return null;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.ibm.uma.persistence.MultiFileResourceSetImpl#createResource(org.eclipse.emf.common.util.URI)
-		 */
-		public Resource createResource(URI uri) {
-			Resource result = new MultiFileXMIResourceImpl(uri) {
-				protected XMLHelper createXMLHelper() {
-					return new MultiFileXMIHelperImpl(this) {
-						public void setValue(EObject object,
-								EStructuralFeature feature, Object value,
-								int position) {
-							boolean old = logError;
-							try {
-								logError = false;
-								super
-										.setValue(object, feature, value,
-												position);
-							} catch (RuntimeException e) {
-								if (value instanceof AnyType
-										&& object instanceof MethodElement
-								// && object instanceof WorkBreakdownElement
-								// && feature ==
-								// UmaPackage.eINSTANCE.getWorkBreakdownElement_LinkToPredecessor()
-								) {
-									AnyTypeFeatureValue fvalue = new AnyTypeFeatureValue();
-									// fvalue.owner = object;
-									fvalue.ownerId = ((MethodElement) object)
-											.getGuid();
-									fvalue.feature = feature;
-									// fvalue.value = (AnyType) value;
-									fvalue.valueId = (String) UMA2UMAResourceHandler
-											.getSingleValue(((AnyType) value)
-													.getAnyAttribute(), "guid"); //$NON-NLS-1$
-									fvalue.index = position;
-									anyTypeFeatureValues.add(fvalue);
-								} else {
-									throw e;
-								}
-							} finally {
-								logError = old;
-							}
-						}
-
-						public List setManyReference(
-								org.eclipse.emf.ecore.xmi.XMLHelper.ManyReference reference,
-								String location) {
-							List exceptions = super.setManyReference(reference,
-									location);
-							if (exceptions == null)
-								return null;
-							for (Iterator iter = exceptions.iterator(); iter
-									.hasNext();) {
-								Object ex = iter.next();
-								if (ex instanceof IllegalValueException) {
-									IllegalValueException ive = (IllegalValueException) ex;
-									if (ive.getValue() instanceof AnyType
-											&& ive.getObject() instanceof MethodElement) {
-										AnyTypeFeatureValue fvalue = new AnyTypeFeatureValue();
-										fvalue.ownerId = ((MethodElement) ive
-												.getObject()).getGuid();
-										fvalue.feature = ive.getFeature();
-										fvalue.valueId = (String) UMA2UMAResourceHandler
-												.getSingleValue(((AnyType) ive
-														.getValue())
-														.getAnyAttribute(),
-														"guid"); //$NON-NLS-1$
-										fvalue.index = -1;
-										anyTypeFeatureValues.add(fvalue);
-										iter.remove();
-									}
-								}
-							}
-							if (exceptions.isEmpty()) {
-								return null;
-							}
-							return exceptions;
-						}
-					};
-				}
-			};
-			result.setTrackingModification(true);
-			getResources().add(result);
-			return result;
-		}
-	}
-
-	public void migrate(String libPath, IProgressMonitor monitor)
-			throws Exception {
-		Set classNames = new HashSet();
-		classNames.add("Technique"); //$NON-NLS-1$
-
-		MultiFileResourceSetImpl resourceSet = new MigratorResourceSet();
-		// ResourceManager oldResMgr = null;
-		for (int i = 0; i < extendedMetaDatas.length; i++) {
-			resourceSet.getLoadOptions().put(
-					XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
-			if (i < 2) {
-				resourceSet.getLoadOptions().put(
-						XMLResource.OPTION_RESOURCE_HANDLER, resourceHandler);
-			}
-			resourceSet.getLoadOptions()
-					.put(XMLResource.OPTION_EXTENDED_META_DATA,
-							extendedMetaDatas[i]);
-
-			if (i == 0) {
-				resourceHandler.savePresentationURIFor(classNames);
-			} else {
-				resourceHandler.savePresentationURIFor(null);
-			}
-
-			updateStatus(monitor, PersistenceResources.loadLibraryTask_name);
-
-			// if(oldResMgr != null) {
-			// ((MigratorURIConverter)resourceSet.getURIConverter()).setOldResourceManager(oldResMgr);
-			// resourceSet.loadLibraryWithoutReset(libPath);
-			// }
-			// else {
-			resourceSet.loadLibrary(libPath);
-			// }
-
-			MethodLibrary lib = resourceSet.getMethodLibrary();
-			if (lib == null)
-				return;
-
-			// load all the resources in memory
-			//
-			updateStatus(monitor, PersistenceResources.loadResourcesTask_name);
-
-			for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				if (element instanceof Guideline && i > 0) {
-					// hack to restore the right presentation for old Technique
-					//
-					Guideline guideline = (Guideline) element;
-					URI uri = resourceHandler.getPresentationURI(guideline
-							.getGuid());
-					if (uri != null) {
-						ContentDescription presentation = (ContentDescription) resourceSet
-								.getEObject(uri, true);
-						guideline.setPresentation(presentation);
-					}
-				}
-				if (element instanceof MethodElement) {
-					try {
-						for (Iterator iterator = element.eCrossReferences()
-								.iterator(); iterator.hasNext();) {
-							iterator.next();
-						}
-					} catch (Exception e) {
-						CommonPlugin.INSTANCE.log(e);
-						System.err
-								.println("Error iterate thru cross references of element: " + element); //$NON-NLS-1$
-					}
-				}
-			}
-
-			if (i == 0) {
-				// oldResMgr =
-				// ((MigratorURIConverter)resourceSet.getURIConverter()).getOldResourceManager();
-
-				migrateProcessContentDescriptions(monitor, lib);
-
-				updateStatus(monitor, PersistenceResources.moveDataTask_name);
-
-			}
-
-			if (i < 2) {
-				resourceHandler.moveData();
-				resourceHandler.clearMoveInfos();
-			}
-
-			if (i == extendedMetaDatas.length - 1) {
-				migrateProcesses(monitor, lib);
-
-				restoreReferences(resourceSet);
-
-			}
-
-			updateStatus(monitor, PersistenceResources.saveLibraryTask_name);
-
-			resourceSet.save(null, true);
-			resourceSet.reset();
-
-		}
-
-		// delete old resmgr.xmi
-		//
-		try {
-			File resMgrFile = new File(new File(libPath).getParentFile(),
-					MultiFileResourceSetImpl.RESMGR_XMI);
-			if (resMgrFile.exists()) {
-				resMgrFile.delete();
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private void restoreReferences(MultiFileResourceSetImpl resourceSet) {
-		for (Iterator iter = anyTypeFeatureValues.iterator(); iter.hasNext();) {
-			AnyTypeFeatureValue element = (AnyTypeFeatureValue) iter.next();
-			if (element.ownerId != null && element.valueId != null) {
-				EObject owner = resourceSet.getEObject(element.ownerId);
-				Object value = resourceSet.getEObject(element.valueId);
-				UMA2UMAResourceHandler.setValue(owner, element.feature, value);
-			}
-		}
-		anyTypeFeatureValues.clear();
-	}
-
-	private static void migrateProcesses(IProgressMonitor monitor,
-			MethodLibrary lib) {
-		updateStatus(monitor, PersistenceResources.fixPresentationNameTask_name);
-
-		String[][] procPkgPaths = MultiFileResourceSetImpl.PROCESS_PACKAGE_PATHS;
-		for (Iterator iter = lib.getMethodPlugins().iterator(); iter.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			ArrayList procPkgs = new ArrayList();
-			for (int j = 0; j < procPkgPaths.length; j++) {
-				MethodPackage pkg = UmaUtil.findMethodPackage(plugin,
-						procPkgPaths[j]);
-				if (pkg != null) {
-					procPkgs.add(pkg);
-				}
-			}
-			for (Iterator iterator = procPkgs.iterator(); iterator.hasNext();) {
-				ProcessPackage pkg = (ProcessPackage) iterator.next();
-				for (Iterator iterator1 = pkg.getChildPackages().iterator(); iterator1
-						.hasNext();) {
-					EObject childPkg = (EObject) iterator1.next();
-					if (childPkg instanceof ProcessComponent) {
-						org.eclipse.epf.uma.Process proc = ((ProcessComponent) childPkg)
-								.getProcess();
-						if (proc != null) {
-							try {
-								fixPresentationName(proc);
-							} catch (RuntimeException e) {
-								throw e;
-							}
-						} else {
-							String msg = Migrator.class.getName()
-									+ ": invalid ProcessComponent (with no Process): " + childPkg //$NON-NLS-1$
-									+ "\n  ProcessComponent's resource URI: " + (childPkg.eResource() != null ? childPkg.eResource().getURI() : null) //$NON-NLS-1$
-									+ "\n  Parent package: " + pkg //$NON-NLS-1$
-									+ "\n  Parent package's resource URI: " + (pkg.eResource() != null ? pkg.eResource().getURI() : null) //$NON-NLS-1$
-							;
-							CommonPlugin.INSTANCE.log(msg);
-							System.err.println(msg);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private static void migrateProcessContentDescriptions(
-			IProgressMonitor monitor, MethodLibrary lib) {
-		updateStatus(monitor,
-				PersistenceResources.migrateContentDescriptionsTask_name);
-
-		String[][] procPkgPaths = MultiFileResourceSetImpl.PROCESS_PACKAGE_PATHS;
-		for (Iterator iter = lib.getMethodPlugins().iterator(); iter.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			ArrayList procPkgs = new ArrayList();
-			for (int j = 0; j < procPkgPaths.length; j++) {
-				MethodPackage pkg = UmaUtil.findMethodPackage(plugin,
-						procPkgPaths[j]);
-				if (pkg != null) {
-					procPkgs.add(pkg);
-				}
-			}
-			for (Iterator iterator = procPkgs.iterator(); iterator.hasNext();) {
-				ProcessPackage pkg = (ProcessPackage) iterator.next();
-				for (Iterator iterator1 = pkg.getChildPackages().iterator(); iterator1
-						.hasNext();) {
-					Object childPkg = (Object) iterator1.next();
-					if (childPkg instanceof ProcessComponent) {
-						org.eclipse.epf.uma.Process proc = ((ProcessComponent) childPkg)
-								.getProcess();
-						migrateContentDescription(proc);
-					}
-				}
-			}
-		}
-	}
-
-	private static void migrateContentDescription(BreakdownElement e) {
-		if (ContentDescriptionFactory.hasPresentation(e)) {
-			ContentDescription content = e.getPresentation();
-			EClass eCls = ContentDescriptionFactory
-					.getContentDescriptionEClass(e);
-			if (eCls != content) {
-				ContentDescription newContent = ContentDescriptionFactory
-						.createContentDescription(e);
-				newContent.setMainDescription(content.getMainDescription());
-				newContent.setKeyConsiderations(content.getKeyConsiderations());
-				newContent.getSections().addAll(content.getSections());
-				e.setPresentation(newContent);
-			}
-		}
-		if (e instanceof Activity) {
-			for (Iterator iter = ((Activity) e).getBreakdownElements()
-					.iterator(); iter.hasNext();) {
-				migrateContentDescription((BreakdownElement) iter.next());
-			}
-		}
-	}
-
-	private static void fixPresentationName(BreakdownElement e) {
-		if (e.getPresentationName() == null
-				|| e.getPresentationName().trim().length() == 0) {
-			e.setPresentationName(e.getName());
-		}
-		if (e instanceof Activity) {
-			for (Iterator iter = ((Activity) e).getBreakdownElements()
-					.iterator(); iter.hasNext();) {
-				fixPresentationName((BreakdownElement) iter.next());
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/UMA2UMAResourceHandler0.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/UMA2UMAResourceHandler0.java
deleted file mode 100644
index f3d21c2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/UMA2UMAResourceHandler0.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.migration.internal;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UMA2UMAResourceHandler0 extends UMA2UMAResourceHandler {
-
-	private Set procMovedFeatureNames;
-
-	private Map guidToPresentationMap;
-
-	private Set classNamesToSavePresentationURI;
-
-	public UMA2UMAResourceHandler0() {
-		super();
-
-		guidToPresentationMap = new HashMap();
-
-		procMovedFeatureNames = new HashSet(Arrays.asList(new String[] {
-				"purpose" //$NON-NLS-1$
-				, "keyConsiderations" //$NON-NLS-1$
-				, "alternatives" //$NON-NLS-1$
-				, "howtoStaff" //$NON-NLS-1$
-				, "usageGuidance" //$NON-NLS-1$
-				, "externalId" //$NON-NLS-1$
-				, "scope" //$NON-NLS-1$
-				, "usageNotes" //$NON-NLS-1$
-				, "scale" //$NON-NLS-1$
-				, "projectCharacteristics" //$NON-NLS-1$
-				, "riskLevel" //$NON-NLS-1$
-				, "estimatingTechnique" //$NON-NLS-1$
-				, "projectMemberExpertise" //$NON-NLS-1$
-				, "typeOfContract" //$NON-NLS-1$
-				, "techniques" //$NON-NLS-1$
-				, "mainDescription" //$NON-NLS-1$
-		}));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler#getNewFeature(org.eclipse.emf.ecore.EObject,
-	 *      java.lang.String)
-	 */
-	protected EStructuralFeature getNewFeature(EObject owner, String featureName) {
-		if ("presentationName".equals(featureName) && owner instanceof ContentDescription) { //$NON-NLS-1$
-			return UmaPackage.eINSTANCE
-					.getDescribableElement_PresentationName();
-		}
-		if (procMovedFeatureNames.contains(featureName)) {
-			if (owner instanceof ProcessElement) {
-				ContentDescription content = ((ProcessElement) owner)
-						.getPresentation();
-				EAttribute attrib = getEAttribute(content.eClass(), featureName);
-				if (attrib != null) {
-					return attrib;
-				}
-			}
-		}
-		if ("WorkOrder".equals(featureName) && owner instanceof ProcessPackage) { //$NON-NLS-1$
-			return UmaPackage.eINSTANCE.getProcessPackage_ProcessElements();
-		}
-
-		return super.getNewFeature(owner, featureName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler#getNewOwner(org.eclipse.emf.ecore.EObject,
-	 *      java.lang.String)
-	 */
-	protected EObject getNewOwner(EObject oldOwner, String featureName) {
-		if ("presentationName".equals(featureName) && oldOwner instanceof ContentDescription) { //$NON-NLS-1$
-			DescribableElement de = ((DescribableElement) oldOwner.eContainer());
-			if (de instanceof Activity) {
-				return null;
-			}
-			return de;
-		}
-		if (procMovedFeatureNames.contains(featureName)
-				&& oldOwner instanceof ProcessElement) {
-			return ((ProcessElement) oldOwner).getPresentation();
-		}
-		if ("WorkOrder".equals(featureName) && oldOwner instanceof ProcessPackage) { //$NON-NLS-1$
-			return oldOwner;
-		}
-
-		return super.getNewOwner(oldOwner, featureName);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.persistence.migration.UMA2UMAResourceHandler#getNewValue(org.eclipse.emf.ecore.EObject, java.lang.String, org.eclipse.emf.ecore.xml.type.AnyType)
-	 */
-	protected Object getNewValue(EObject oldOwner, String featureName, AnyType value) {
-		if ("WorkOrder".equals(featureName) && oldOwner instanceof ProcessPackage) { //$NON-NLS-1$
-			WorkOrder workOrder = UmaFactory.eINSTANCE.createWorkOrder();
-			workOrder.setGuid((String) getSingleValue(value.getAnyAttribute(),
-					"guid")); //$NON-NLS-1$
-			String predGuid = (String) getSingleValue(value.getAnyAttribute(),
-					"pred"); //$NON-NLS-1$
-			if (predGuid == null) {
-				InternalEObject obj = (InternalEObject) getSingleValue(value
-						.getMixed(), "pred"); //$NON-NLS-1$
-				predGuid = obj.eProxyURI().authority();
-			}
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) oldOwner
-					.eResource().getResourceSet();
-			WorkBreakdownElement pred = (WorkBreakdownElement) resourceSet
-					.getEObject(predGuid);
-			workOrder.setPred(pred);
-			workOrder.setLinkType(WorkOrderType.FINISH_TO_FINISH_LITERAL);
-			return workOrder;
-		}
-		return getText(value);
-	}
-
-	public void savePresentationURIFor(Set classNames) {
-		classNamesToSavePresentationURI = classNames;
-	}
-
-	public URI getPresentationURI(String guid) {
-		return (URI) guidToPresentationMap.get(guid);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.persistence.migration.MigrationResourceHandler#handleUnknownData(org.eclipse.emf.ecore.EObject, java.lang.Object)
-	 */
-	protected void handleUnknownData(EObject e, AnyType unknownData) {
-		super.handleUnknownData(e, unknownData);
-		
-		if (classNamesToSavePresentationURI != null
-				&& e instanceof ContentPackage) {
-			for (Iterator iter = getValue(unknownData.getMixed(), "contentElements").iterator(); iter.hasNext();) { //$NON-NLS-1$
-				AnyType value = (AnyType) iter.next();
-				if (value != null
-						&& classNamesToSavePresentationURI.contains(value
-								.eClass().getName())) {
-					Object presentation = getSingleValue(value.getMixed(),
-							"presentation"); //$NON-NLS-1$
-					if (presentation != null) {
-						Object guid = getSingleValue(value.getAnyAttribute(),
-								"guid"); //$NON-NLS-1$
-						URI uri = ((InternalEObject) presentation).eProxyURI();
-						guidToPresentationMap.put(guid, uri);
-					}
-				}
-			}
-		}		
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/package.html
deleted file mode 100644
index ff3e01a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implemntation for upgrading a method library to a newer UMA version.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/package.html
deleted file mode 100644
index abf06d4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/migration/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for upgrading a method library to a newer UMA version.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/package.html
deleted file mode 100644
index e6b07d7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for persisting a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshEvent.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshEvent.java
deleted file mode 100644
index 8a56c8d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshEvent.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.refresh;
-
-import java.util.Collection;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-
-/**
- * Instance of this class provides data about a refresh event.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IRefreshEvent {
-
-	/**
-	 * Gets resources that had been refreshed.
-	 * 
-	 * @return refreshed resources
-	 */
-	Collection<Resource> getRefreshedResources();
-	
-	Collection<Resource> getUnloadedResources();
-
-	/**
-	 * Gets objects that had been unloaded and become proxies after refresh
-	 * 
-	 * @return unloaded objects
-	 */
-	Collection<EObject> getUnloadedObjects();
-
-	/**
-	 * Gets objects that had been refreshed.
-	 * 
-	 * @return refreshed objects
-	 */
-	Collection<EObject> getRefreshedObjects();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshHandler.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshHandler.java
deleted file mode 100644
index 649bbb9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshHandler.java
+++ /dev/null
@@ -1,26 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.refresh;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * Instance of this class will be notify about changes in resources so it can
- * react accordingly
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IRefreshHandler {
-
-	void refresh(IProgressMonitor monitor);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshListener.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshListener.java
deleted file mode 100644
index c413413..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/IRefreshListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.refresh;
-
-/**
- * Instance of this class, if listening to refresh event, will get notified.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IRefreshListener {
-
-	void notifyRefreshed(IRefreshEvent event);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/RefreshJob.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/RefreshJob.java
deleted file mode 100644
index 8ea6e05..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/RefreshJob.java
+++ /dev/null
@@ -1,448 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.refresh;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.MultiFileXMIResourceImpl;
-import org.eclipse.epf.persistence.PersistencePlugin;
-import org.eclipse.epf.persistence.util.LibrarySchedulingRule;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Background job that keeps notifying refresh handlers about changes in
- * resources
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RefreshJob extends WorkspaceJob implements IResourceChangeListener {
-
-	private static final long UPDATE_DELAY = 200;
-
-	private static final boolean DEBUG = PersistencePlugin.getDefault().isDebugging();
-
-	private static final String DEBUG_PREFIX = "EPF Auto-refresh:"; //$NON-NLS-1$
-
-	private ResourceSet resourceSet;
-
-	private Collection<Resource> addedResources = new UniqueEList<Resource>();
-
-	private Collection<Resource> changedResources = new UniqueEList<Resource>();
-
-	private Collection<Resource> removedResources = new UniqueEList<Resource>();
-	
-	private Collection<Resource> movedResources = new UniqueEList<Resource>();
-
-	private UniqueEList<Resource> savedResources = new UniqueEList<Resource>();
-
-	private Collection<Resource> loadedBeforeRefreshResources = new ArrayList<Resource>();
-
-	private IRefreshHandler refreshHandler;
-
-	private boolean enabled = true;
-
-	private Collection<IResource> addedWorkspaceResources = new UniqueEList<IResource>();
-
-	private RefreshJob() {
-		super(PersistenceResources.resourceAutoRefreshJob_name);
-	}
-
-	public void setEnabled(boolean b) {
-		enabled = b;
-	}
-
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * @param resourceSet
-	 *            The resourceSet to set.
-	 */
-	public void setResourceSet(ResourceSet resourceSet) {
-		this.resourceSet = resourceSet;
-	}
-	
-	public ResourceSet getResourceSet() {
-		return resourceSet;
-	}
-
-	public void setRefreshHandler(IRefreshHandler handler) {
-		refreshHandler = handler;
-	}
-
-	/**
-	 * Gets existing resources that reappear in workspaces
-	 * 
-	 * @return the addedResources
-	 */
-	public Collection<Resource> getAddedResources() {
-		removeResources(addedResources, savedResources);
-		return addedResources;
-	}
-
-	public Collection<IResource> getAddedWorkspaceResources() {
-		return addedWorkspaceResources;
-	}
-
-	/**
-	 * @return Returns the changedResources.
-	 */
-	public Collection<Resource> getChangedResources() {
-		removeResources(changedResources, savedResources);
-		removeResources(changedResources, loadedBeforeRefreshResources);
-		return changedResources;
-	}
-
-	/**
-	 * Removes <code>resourcesToRemove</code> from <code>resources</code> if
-	 * the resources are synchronized with their storage.
-	 * 
-	 * @param resourcesToRemove
-	 */
-	private static void removeResources(Collection<Resource> resources,
-			Collection<Resource> resourcesToRemove) {
-		synchronized (resourcesToRemove) {
-			if (!resourcesToRemove.isEmpty()) {
-				for (Iterator<Resource> iter = resourcesToRemove.iterator(); iter
-						.hasNext();) {
-					Object resource = iter.next();
-					boolean canRemove = true;
-					if (resource instanceof MultiFileXMIResourceImpl) {
-						MultiFileXMIResourceImpl mfResource = ((MultiFileXMIResourceImpl) resource);
-						canRemove = mfResource.isSynchronized();
-					}
-					if (canRemove) {
-						if (resources.remove(resource)) {
-							iter.remove();
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the removedResources.
-	 */
-	public Collection<Resource> getRemovedResources() {
-		return removedResources;
-	}
-	
-	/**                                    
-	 * @return Returns the movedResources. 
-	 */                                    
-	public Collection<Resource> getMovedResources() {
-		return movedResources;             
-	}                                      
-
-	public void resourceSaved(Resource resource) {
-		if(resource.getResourceSet() == resourceSet) {
-			synchronized (savedResources) {
-				savedResources.add(resource);
-			}
-		}
-	}
-
-	/**
-	 * @return the loadedBeforeRefreshResources
-	 */
-	public Collection<Resource> getReloadedBeforeRefreshResources() {
-		return loadedBeforeRefreshResources;
-	}
-
-	public void reset() {
-		changedResources.clear();
-		removedResources.clear();
-		movedResources.clear();
-		savedResources.clear();
-		loadedBeforeRefreshResources.clear();
-		addedResources.clear();
-		addedWorkspaceResources.clear();
-	}
-	
-	private MethodLibrary getMethodLibrary() {
-		if(resourceSet instanceof MultiFileResourceSetImpl) {
-			return ((MultiFileResourceSetImpl)resourceSet).getMethodLibrary();
-		}
-		return null;
-	}
-
-	private void scheduleRefresh() {		
-		if (getState() == Job.NONE) {
-			MethodLibrary lib = getMethodLibrary();
-			if(lib != null) {
-				setRule(new LibrarySchedulingRule(lib));
-				schedule(UPDATE_DELAY);
-			}
-		}
-	}	
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see WorkspaceJob#runInWorkspace
-	 */
-	public IStatus runInWorkspace(IProgressMonitor monitor) {
-		if (refreshHandler == null)
-			return Status.OK_STATUS;
-
-		long start = System.currentTimeMillis();
-		Throwable error = null;
-		try {
-			if (DEBUG)
-				System.out.println(DEBUG_PREFIX + " starting refresh job"); //$NON-NLS-1$
-			monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-			if (monitor.isCanceled())
-				throw new OperationCanceledException();
-			try {
-				refreshHandler.refresh(monitor);
-			} catch (Throwable e) {
-				error = e;
-			}
-		} finally {
-			monitor.done();
-			if (DEBUG)
-				System.out
-						.println(DEBUG_PREFIX
-								+ " finished refresh job in: " + (System.currentTimeMillis() - start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		if (error != null)
-			return new Status(IStatus.ERROR, FileManager.PLUGIN_ID, 0,
-					"Refresh error", error); //$NON-NLS-1$
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.jobs.Job#shouldRun()
-	 */
-	public synchronized boolean shouldRun() {
-		return shouldRefresh();
-	}
-
-	private boolean shouldRefresh() {
-		return !removedResources.isEmpty() || !changedResources.isEmpty()
-				|| !addedResources.isEmpty() || !movedResources.isEmpty()
-				|| !loadedBeforeRefreshResources.isEmpty()
-				|| !addedWorkspaceResources.isEmpty();
-	}
-
-	/**
-	 * Starts the refresh job
-	 */
-	public void start() {
-		if (DEBUG) {
-			System.out.println("RefreshJob.start()"); //$NON-NLS-1$
-		}
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
-	}
-
-	/**
-	 * Stops the refresh job
-	 */
-	public void stop() {
-		if (DEBUG) {
-			System.out.println("RefreshJob.stop()"); //$NON-NLS-1$
-		}
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-		cancel();
-	}
-
-	public Resource getResource(IResource wsRes) {
-		if(resourceSet instanceof MultiFileResourceSetImpl) {
-			return ((MultiFileResourceSetImpl)resourceSet).getResource(wsRes);
-		}
-		IPath path = wsRes.getLocation();
-		return path != null ? PersistenceUtil.getResource(path, resourceSet) : null;
-	}
-
-	/**
-	 * Checks if the given resource can be accepted as a new resource of
-	 * resource set of this refresh job that needs to be loaded.
-	 * 
-	 * @param resource
-	 * @return
-	 */
-	private boolean accept(IResource resource) {
-		if (resourceSet instanceof MultiFileResourceSetImpl) {
-			return ((MultiFileResourceSetImpl) resourceSet)
-					.isNewResourceToLoad(resource);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-		if (!isEnabled() || resourceSet == null)
-			return;
-		IResourceDelta delta = event.getDelta();
-		if (delta == null)
-			return;		
-		try {
-			class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-				private Collection<Resource> changedResources = new ArrayList<Resource>();
-
-				private Collection<Resource> removedResources = new ArrayList<Resource>();
-				
-				private Collection<Resource> movedResources = new ArrayList<Resource>();
-
-				private Collection<Resource> addedResources = new ArrayList<Resource>();
-
-				private ArrayList<IResource> addedWorkspaceResources = new ArrayList<IResource>();
-				
-				public boolean visit(IResourceDelta delta) throws CoreException {
-					Resource resource;
-					if ((delta.getFlags() & IResourceDelta.MARKERS) != IResourceDelta.MARKERS
-							&& delta.getResource().getType() == IResource.FILE) {
-						switch (delta.getKind()) {
-						case IResourceDelta.ADDED:
-							// handle added resource
-							//
-							resource = getResource(delta.getResource());
-							if (resource != null) {
-								if (!resource.isLoaded()) {
-									// the resource was created but not
-									// loaded b/c the workspace resource
-									// was not added to the workspace at the
-									// time of loading
-									//
-									MethodElement me = PersistenceUtil
-									.getMethodElement(resource);
-									if (!(me instanceof ContentDescription)) {
-										// no auto-reload for content
-										// description
-										// MethodElementEditor will detect
-										// the change and load it
-										// when activated.
-										//
-										addedResources.add(resource);
-									}
-								}
-							} else if (accept(delta.getResource())) {
-								addedWorkspaceResources.add(delta
-										.getResource());
-							}
-							
-							// handle file move
-							//
-							if ((IResourceDelta.MOVED_TO & delta.getFlags()) != 0) {
-//								resource = getResource(delta.getResource());          
-//								if (resource != null) {                           
-//									movedResources.add(resource);                 
-//								}                                                 
-								//
-								if (DEBUG) {
-									IPath movedFromPath = delta.getResource()
-											.getLocation();
-									IPath movedToPath = delta.getMovedToPath();
-									System.out
-											.println("Resource moved from '" + movedFromPath + "' to '" + movedToPath + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-								}
-
-							}
-							break;
-						case IResourceDelta.REMOVED:
-							resource = getResource(delta.getResource());
-							if (resource != null) {
-								removedResources.add(resource);
-							}
-							break;
-						case IResourceDelta.CHANGED:
-							boolean encodingChanged = ((IResourceDelta.ENCODING & delta
-									.getFlags()) != 0);
-							boolean contentChanged = ((IResourceDelta.CONTENT & delta
-									.getFlags()) != 0);
-							if (encodingChanged || contentChanged) {
-								resource = getResource(delta.getResource());
-								if (resource != null
-										&& MultiFileSaveUtil
-										.checkSynchronized(resource) != 1) {
-									changedResources.add(resource);
-								}
-							}
-							break;
-						}
-					}
-					
-					return true;
-				}
-
-			};                                             
-
-			ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-			delta.accept(visitor);
-
-			removedResources.addAll(visitor.removedResources);
-			movedResources.addAll(visitor.movedResources);
-			changedResources.addAll(visitor.changedResources);
-			addedResources.addAll(visitor.addedResources);
-			addedWorkspaceResources.addAll(visitor.addedWorkspaceResources);
-
-			if (shouldRefresh()) {
-				scheduleRefresh();
-			}
-		} catch (CoreException e) {
-			CommonPlugin.INSTANCE.log(e);
-		}
-	}
-
-	/**
-	 * Resolves the proxy and its containers
-	 * 
-	 * @param proxy
-	 * @return
-	 */
-	public EObject resolve(EObject proxy) {
-		return PersistenceUtil.resolve(proxy, resourceSet);
-	}
-
-	public static RefreshJob getInstance() {
-		return instance;
-	}
-
-	private static RefreshJob instance = new RefreshJob();
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/internal/RefreshEvent.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/internal/RefreshEvent.java
deleted file mode 100644
index d2df61d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/internal/RefreshEvent.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.refresh.internal;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.persistence.refresh.IRefreshEvent;
-
-/**
- * Implementation class of IRefreshEvent
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RefreshEvent implements IRefreshEvent {
-
-	private Collection<Resource> refreshedResources = Collections.emptyList();
-	
-	private Collection<Resource> unloadedResources = Collections.emptyList();
-
-	private Collection<EObject> unloadedObjects = Collections.emptyList();
-	
-	private Collection<EObject> refreshedObjects = Collections.emptyList();
-	
-	public RefreshEvent(Collection<Resource> unloadedResources) {
-		this.unloadedResources = unloadedResources;
-	}
-
-	public RefreshEvent(Collection<Resource> refreshedResources,
-			Collection<EObject> unloadedObjects) {
-		this(refreshedResources, unloadedObjects, Collections.EMPTY_LIST);
-	}	
-
-	/**
-	 * @param refreshedResources
-	 * @param unloadedObjects
-	 * @param refreshedObjects
-	 */
-	public RefreshEvent(Collection<Resource> refreshedResources, Collection<EObject> unloadedObjects, Collection<EObject> refreshedObjects) {
-		super();
-		this.refreshedResources = refreshedResources;
-		this.unloadedObjects = unloadedObjects;
-		this.refreshedObjects = refreshedObjects;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.persistence.refresh.IRefreshEvent#getRefreshedResources()
-	 */
-	public Collection<Resource> getRefreshedResources() {
-		return refreshedResources;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.persistence.refresh.IRefreshEvent#getUnloadedObjects()
-	 */
-	public Collection<EObject> getUnloadedObjects() {
-		return unloadedObjects;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.persistence.refresh.IRefreshEvent#getRefreshedObjects()
-	 */
-	public Collection<EObject> getRefreshedObjects() {
-		return refreshedObjects;
-	}
-
-	public Collection<Resource> getUnloadedResources() {
-		return unloadedResources;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/internal/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/internal/package.html
deleted file mode 100644
index 03d7b48..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for managing method library refreshes.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/package.html
deleted file mode 100644
index 9ab7c56..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/refresh/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for managing method library refreshes.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/LibrarySchedulingRule.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/LibrarySchedulingRule.java
deleted file mode 100644
index d5bad71..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/LibrarySchedulingRule.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.util;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.core.runtime.jobs.MultiRule;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Scheduling rule used to lock a library during a operation and defer the
- * broadcasting of resource change event until the operation is finished.
- * 
- * @author Phong Nguyen Le - Aug 15, 2006
- * @since 1.0
- */
-public class LibrarySchedulingRule implements ISchedulingRule {
-	private MethodLibrary library;
-
-	/**
-	 * @param lib
-	 */
-	public LibrarySchedulingRule(MethodLibrary lib) {
-		this.library = lib;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean contains(ISchedulingRule rule) {
-		if (this == rule) {
-			return true;
-		}
-		if (rule instanceof LibrarySchedulingRule) {
-			return ((LibrarySchedulingRule) rule).library == library;
-		}
-		if (rule instanceof MultiRule) {
-			MultiRule mrule = (MultiRule) rule;
-			ISchedulingRule[] childRules = mrule.getChildren();
-			for (int i=0; i<childRules.length; i++) {
-				if (! (childRules[i] instanceof IResource)) {
-					return false;
-				}
-			}
-			return true;
-		}
-
-		// allow any IResource rule to nest within the same thread
-		//
-		return rule instanceof IResource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule)
-	 */
-	public boolean isConflicting(ISchedulingRule rule) {
-		return equals(rule);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		return this == obj
-				|| (obj instanceof LibrarySchedulingRule && ((LibrarySchedulingRule) obj).library == library);
-	}
-
-	@Override
-	public int hashCode() {
-		return library.hashCode();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PatternConstructor.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PatternConstructor.java
deleted file mode 100644
index 6246e60..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PatternConstructor.java
+++ /dev/null
@@ -1,186 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.util;
-
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-/**
- * Utility class with static methods to create search pattern
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class PatternConstructor {
-
-	private PatternConstructor() {
-		// don't instantiate
-	}
-
-	public static Pattern createPattern(String pattern,
-			boolean isCaseSensitive, boolean isRegex)
-			throws PatternSyntaxException {
-		return createPattern(pattern, isRegex, true, isCaseSensitive, false);
-	}
-
-	/**
-	 * Creates a pattern element from the pattern string which is either a
-	 * reg-ex expression or in our old 'StringMatcher' format.
-	 * 
-	 * @param pattern
-	 *            The search pattern
-	 * @param isRegex
-	 *            <code>true</code> if the passed string already is a reg-ex
-	 *            pattern
-	 * @param isStringMatcher
-	 *            <code>true</code> if the passed string is in the
-	 *            StringMatcher format.
-	 * @param isCaseSensitive
-	 *            Set to <code>true</code> to create a case insensitive
-	 *            pattern
-	 * @param isWholeWord
-	 *            <code>true</code> to create a pattern that requires a word
-	 *            boundary at the beginning and the end.
-	 * @return The created pattern
-	 * @throws PatternSyntaxException
-	 */
-	public static Pattern createPattern(String pattern, boolean isRegex,
-			boolean isStringMatcher, boolean isCaseSensitive,
-			boolean isWholeWord) throws PatternSyntaxException {
-		if (isRegex) {
-			if (isWholeWord) {
-				StringBuffer buffer = new StringBuffer(pattern.length() + 10);
-				buffer.append("\\b(?:").append(pattern).append(")\\b"); //$NON-NLS-1$ //$NON-NLS-2$
-				pattern = buffer.toString();
-			}
-		} else {
-			int len = pattern.length();
-			StringBuffer buffer = new StringBuffer(len + 10);
-			// don't add a word boundary if the search text does not start with
-			// a word char. (this works around a user input error).
-			if (isWholeWord && len > 0 && isWordChar(pattern.charAt(0))) {
-				buffer.append("\\b"); //$NON-NLS-1$
-			}
-			appendAsRegEx(isStringMatcher, pattern, buffer);
-			if (isWholeWord && len > 0 && isWordChar(pattern.charAt(len - 1))) {
-				buffer.append("\\b"); //$NON-NLS-1$
-			}
-			pattern = buffer.toString();
-		}
-
-		int regexOptions = Pattern.MULTILINE;
-		if (!isCaseSensitive) {
-			regexOptions |= Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
-		}
-		return Pattern.compile(pattern, regexOptions);
-	}
-
-	private static boolean isWordChar(char c) {
-		return Character.isLetterOrDigit(c);
-	}
-
-	/**
-	 * Creates a pattern element from an array of patterns in the old
-	 * 'StringMatcher' format.
-	 * 
-	 * @param patterns
-	 *            The search patterns
-	 * @param isCaseSensitive
-	 *            Set to <code>true</code> to create a case insensitive
-	 *            pattern
-	 * @return The created pattern
-	 * @throws PatternSyntaxException
-	 */
-	public static Pattern createPattern(String[] patterns,
-			boolean isCaseSensitive) throws PatternSyntaxException {
-		StringBuffer pattern = new StringBuffer();
-		for (int i = 0; i < patterns.length; i++) {
-			if (i > 0) {
-				// note that this works only as we know that the operands of the
-				// or expression will be simple and need no brackets.
-				pattern.append('|');
-			}
-			appendAsRegEx(true, patterns[i], pattern);
-		}
-		return createPattern(pattern.toString(), true, true, isCaseSensitive,
-				false);
-	}
-
-	public static StringBuffer appendAsRegEx(boolean isStringMatcher,
-			String pattern, StringBuffer buffer) {
-		boolean isEscaped = false;
-		for (int i = 0; i < pattern.length(); i++) {
-			char c = pattern.charAt(i);
-			switch (c) {
-			// the backslash
-			case '\\':
-				// the backslash is escape char in string matcher
-				if (isStringMatcher && !isEscaped) {
-					isEscaped = true;
-				} else {
-					buffer.append("\\\\"); //$NON-NLS-1$
-					isEscaped = false;
-				}
-				break;
-			// characters that need to be escaped in the regex.
-			case '(':
-			case ')':
-			case '{':
-			case '}':
-			case '.':
-			case '[':
-			case ']':
-			case '$':
-			case '^':
-			case '+':
-			case '|':
-				if (isEscaped) {
-					buffer.append("\\\\"); //$NON-NLS-1$
-					isEscaped = false;
-				}
-				buffer.append('\\');
-				buffer.append(c);
-				break;
-			case '?':
-				if (isStringMatcher && !isEscaped) {
-					buffer.append('.');
-				} else {
-					buffer.append('\\');
-					buffer.append(c);
-					isEscaped = false;
-				}
-				break;
-			case '*':
-				if (isStringMatcher && !isEscaped) {
-					buffer.append(".*"); //$NON-NLS-1$
-				} else {
-					buffer.append('\\');
-					buffer.append(c);
-					isEscaped = false;
-				}
-				break;
-			default:
-				if (isEscaped) {
-					buffer.append("\\\\"); //$NON-NLS-1$
-					isEscaped = false;
-				}
-				buffer.append(c);
-				break;
-			}
-		}
-		if (isEscaped) {
-			buffer.append("\\\\"); //$NON-NLS-1$
-			isEscaped = false;
-		}
-		return buffer;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PersistenceResources.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PersistenceResources.java
deleted file mode 100644
index 4c80ab7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PersistenceResources.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.persistence.util;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message bundle class for library persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class PersistenceResources extends NLS {
-
-	private static String BUNDLE_NAME = PersistenceResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private PersistenceResources() {
-		// Do not instantiate
-	}
-
-	public static String cannot_create_dir_msg;
-
-	public static String invalidNameError_msg;
-
-	public static String objNotFoundError_msg;
-
-	public static String loadLibraryError_msg;
-
-	public static String loadLibraryError_details;
-
-	public static String refreshLibraryFilesTask_name;
-
-	public static String resourceAutoRefreshJob_name;
-
-	public static String restoreResourceError_msg;
-
-	public static String FileManager_fileReadOnly;
-
-	public static String ErrMsg_CouldNotDelete;
-
-	public static String renameError_msg;
-
-	public static String backupError_msg;
-
-	public static String marker_err_cannotResolveProxy;
-
-	public static String modifyFileError_msg;
-	
-	public static String filePathNameTooLong_msg;
-
-	public static String loadResourceError_msg;
-
-	public static String loadResourceErrorWithReason_msg;
-
-	public static String invalidLibraryFileError_msg;
-
-	public static String fileNotFoundError_msg;
-
-	public static String normalizeURIError_msg;
-
-	public static String moveError_msg;
-
-	public static String modifyReadOnlyFileError_msg;
-
-	public static String moveResourceError_msg;
-
-	public static String modifyFilesError_msg;
-
-	public static String resourceOutOfSynch_msg;
-
-	public static String loadLibraryTask_name;
-
-	public static String moveDataTask_name;
-
-	public static String saveLibraryTask_name;
-
-	public static String loadResourcesTask_name;
-	
-	public static String migratingDiagram_name;
-
-	public static String migrateContentDescriptionsTask_name;
-
-	public static String fixPresentationNameTask_name;
-
-	public static String unresolvedProxyLoggerJob_name;
-
-	public static String UnresolvedProxyMarkerManager_couldNotResolveProxy;
-
-	public static String loadConfiguration_couldNotLoad_logMsg;
-
-	public static String loadConfiguration_notConfigFile_logMsg;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PersistenceResources.class);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PersistenceUtil.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PersistenceUtil.java
deleted file mode 100644
index 889f6f6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/PersistenceUtil.java
+++ /dev/null
@@ -1,395 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-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.EcoreUtil;
-import org.eclipse.epf.common.serviceability.EPFVersions;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.library.persistence.ILibraryResource;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.PersistencePlugin;
-import org.eclipse.epf.persistence.migration.internal.Migrator;
-import org.eclipse.epf.persistence.refresh.internal.RefreshEvent;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.UmaPackage;
-import org.osgi.framework.Version;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Utility class with static helper methods for library persistence
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class PersistenceUtil {
-
-	/**
-	 * Gets the current namespace URI of UMA.
-	 */
-	public static final String getUMANsURI() {
-		return UmaPackage.eNS_URI;
-	}
-
-	public static final String getUMANsURI(String libPath) {
-		try {
-			DocumentBuilder builder = DocumentBuilderFactory.newInstance()
-					.newDocumentBuilder();
-			Document doc = builder.parse(new File(libPath));
-			Element root = doc.getDocumentElement();
-			String nsURI = root.getAttribute("xmlns:com.ibm.uma"); //$NON-NLS-1$
-			if (nsURI == null || nsURI.equals("")) { //$NON-NLS-1$
-				nsURI = root.getAttribute("xmlns:org.eclipse.epf.uma"); //$NON-NLS-1$
-			}
-			if (nsURI == null || nsURI.equals("")) { //$NON-NLS-1$
-				nsURI = root.getAttribute("xmlns:uma") + "/uma.ecore"; //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return nsURI;
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	public static final boolean conversionRequired(String libPath) {
-		String currentNsURI = PersistenceUtil.getUMANsURI();
-		String libNsURI = PersistenceUtil.getUMANsURI(libPath);
-		if (currentNsURI.equals(libNsURI))
-			return false;
-		if (Migrator.OLD_UMA_NS_URI.equals(libNsURI))
-			return true;
-		return false;
-	}
-
-	public static final IResource getWorkspaceResource(Object obj) {
-		Resource resource = null;
-		if (obj instanceof DescribableElement) {
-			DescribableElement e = (DescribableElement) obj;
-			ContentDescription content = e.getPresentation();
-			resource = content.eResource();
-			if (resource == null) {
-				resource = e.eResource();
-			}
-		} else if (obj instanceof EObject) {
-			resource = ((EObject) obj).eResource();
-		} else if (obj instanceof Resource) {
-			resource = (Resource) obj;
-		}
-		if (resource != null && resource.getURI().isFile()) {
-			return FileManager.getResourceForLocation(resource.getURI()
-					.toFileString());
-		}
-		return null;
-	}
-
-	public static final Collection<EObject> getProxies(EObject obj) {
-		Collection<EObject> proxies = new ArrayList<EObject>();
-		for (Iterator iter = obj.eAllContents(); iter.hasNext();) {
-			EObject o = (EObject) iter.next();
-			if (o.eIsProxy()) {
-				proxies.add(o);
-			}
-		}
-		return proxies;
-	}
-
-	/**
-	 * Checks the primary tool version stored in the given resource
-	 * 
-	 * @param resource
-	 * @return <li> < 0 if the version of the primary tool stored in the given resource is missing or older than current
-	 *         <li> 0 if the primary tool version in the given resource matches the current version
-	 *         <li> > 0 if  the primary tool version in the given resource is newer than the current version
-	 */
-	public static final int checkToolVersion(Resource resource) {
-		File file = new File(resource.getURI().toFileString());
-		Map fileVersionMap = VersionUtil.readVersionsFromFile(file);
-		if(fileVersionMap != null) {
-			String version = (String) fileVersionMap.get(VersionUtil.getPrimaryToolID());
-			if(version != null) {
-				EPFVersions versions = VersionUtil.getVersions(VersionUtil.getPrimaryToolID());
-				return versions.getCurrentVersion().compareToolVersionTo(new Version(version));
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * Gets the first method element in contents of the given resource.
-	 *  
-	 * @param resource
-	 * @return
-	 */
-	public static MethodElement getMethodElement(Resource resource) {
-		for (Iterator iter = resource.getContents().iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof MethodElement) {
-				return (MethodElement) element;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Resolves the proxy and its containers
-	 * 
-	 * @param proxy
-	 * @return
-	 */
-	public static EObject resolve(EObject proxy, ResourceSet resourceSet) {
-		EObject resolved;
-		try {
-			resolved = EcoreUtil.resolve(proxy, resourceSet);
-		} catch (Exception e) {
-			resolved = proxy;
-		}
-		EObject container = proxy.eContainer();
-		if (resolved.eContainer() == null && container != null) {
-			if (container.eIsProxy()) {
-				container = resolve(container, resourceSet);
-			}
-			EReference ref = proxy.eContainmentFeature();
-			if (ref.isMany()) {
-				List values = (List) container.eGet(ref);
-				for (Iterator iter = values.iterator(); iter.hasNext(); iter
-						.next())
-					;
-			} else {
-				container.eGet(ref);
-			}
-		}
-		return resolved;
-	}
-	
-	public static Resource getResource(IPath path, ResourceSet resourceSet) {
-		return getResource(path.toOSString(), resourceSet);
-	}
-	
-	public static Resource getResource(String path, ResourceSet resourceSet) {
-		URI uri = URI.createFileURI(path);
-		for (Iterator iter = new ArrayList<Resource>(resourceSet.getResources())
-				.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			if (uri.equals(MultiFileSaveUtil.getFinalURI(resource))) {
-				return resource;
-			}
-		}
-		return null;
-
-	}
-	
-	/**
-	 * Resolves container of the MethodElement in the given resource.
-	 * 
-	 * @param resource
-	 */
-	public static void resolveContainer(Resource resource) {
-		ResourceSet resourceSet = resource.getResourceSet();
-		if(resourceSet instanceof MultiFileResourceSetImpl) {
-			((MultiFileResourceSetImpl)resourceSet).resolveContainer(resource);
-		}
-	}
-
-	public static MethodElement getMethodElement(IResource iResource, ResourceSet resourceSet) {
-		MethodElement element = null;
-		URI uri = URI.createFileURI(iResource.getLocation().toOSString());
-		Resource resource = resourceSet.getResource(uri, true);		
-		if (resource != null) { 
-			if(resourceSet instanceof MultiFileResourceSetImpl) {
-				((MultiFileResourceSetImpl)resourceSet).resolveContainer(resource);
-			}
-			element = PersistenceUtil.getMethodElement(resource);
-			if (element instanceof ContentDescription) {
-				EObject container = ((ContentDescription)element).eContainer();
-				if (container instanceof MethodElement) {
-					element = (MethodElement)container;
-				}
-			}
-		}
-		return element;
-	}
-	
-	public static void loadAllLibraryResources(MethodLibrary lib) {
-		for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			if (element instanceof MethodElement) {
-				try {
-					for (Iterator iterator = element.eCrossReferences()
-							.iterator(); iterator.hasNext();) {
-						iterator.next();
-					}
-				} catch (Exception e) {
-					CommonPlugin.INSTANCE.log(e);
-				}
-			}
-		}
-	}
-	
-	public static String getTopAttribute(File file, final String attributeName) {
-		// Create the SAX parser factory.
-		SAXParserFactory spf = SAXParserFactory.newInstance();
-
-		// Create the SAX parser.
-		try {
-			SAXParser saxParser = spf.newSAXParser();
-			final String[] valueHolder = new String[1];
-			try {
-			saxParser.parse(file, new DefaultHandler() {	
-				private boolean started;
-				@Override
-				public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-					if(started) {
-						throw new OperationCanceledException();
-					}
-//					System.out.println("uri: " + uri);
-//					System.out.println("localName: " + localName);
-//					System.out.println("qName: " + qName);
-					valueHolder[0] = attributes.getValue(attributeName);
-					started = true;
-				}
-			});
-			}
-			catch(OperationCanceledException e) {
-				//
-			}
-			return valueHolder[0];
-		} catch (Exception e) {
-			PersistencePlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-		
-	public static void unload(Collection<Resource> removedResources) {
-		Map<MultiFileResourceSetImpl, Collection<Resource>> resourceSetToUnloadedResourcesMap = new HashMap<MultiFileResourceSetImpl, Collection<Resource>>();
-		for (Resource resource : removedResources) {
-			ResourceSet resourceSet = resource.getResourceSet();
-			boolean unloaded = false;
-			try {
-				if(resourceSet instanceof ILibraryResourceSet) {
-					if(((ILibraryResourceSet)resourceSet).unload(resource, Collections.EMPTY_MAP)) {
-						resourceSet.getResources().remove(resource);
-						unloaded = true;
-					}
-				}
-				else {
-					if(resource.isLoaded()) {
-						resource.unload();
-						unloaded = true;
-					}
-					if(resourceSet != null) {
-						resourceSet.getResources().remove(resource);
-					}
-				}
-			} catch (Exception e) {
-				PersistencePlugin.getDefault().getLogger().logError(e);
-			}	
-			if(unloaded && resourceSet instanceof MultiFileResourceSetImpl) {
-				Collection<Resource> unloadedResources = resourceSetToUnloadedResourcesMap.get(resourceSet);
-				if(unloadedResources == null) {
-					unloadedResources = new ArrayList<Resource>();
-					resourceSetToUnloadedResourcesMap.put((MultiFileResourceSetImpl) resourceSet, unloadedResources);
-				}
-				unloadedResources.add(resource);
-			}
-		}
-		for (Map.Entry<MultiFileResourceSetImpl, Collection<Resource>> entry : resourceSetToUnloadedResourcesMap.entrySet()) {
-			entry.getKey().notifyRefreshListeners(new RefreshEvent(entry.getValue()));
-		}
-	}
-	
-	/**
-	 * Checks if the given method element has a GUID that is the same as GUID of
-	 * one element in the given elements list.
-	 * 
-	 * @param e
-	 * @param elements
-	 * @return true if the given method element has duplicate GUID
-	 */
-	public static boolean hasDuplicateGUID(MethodElement e, Collection<MethodElement> elements) {
-		for (MethodElement element : elements) {
-			if(e.getGuid().equals(element.getGuid())) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	private static String toPrefix(String path) {
-		return path.endsWith(File.separator) ? path : path + File.separator;
-	}
-	
-	public static void replaceURIPrefix(Collection<Resource> resources, String oldPrefix, String newPrefix) {
-		URI oldPrefixURI = URI.createFileURI(toPrefix(oldPrefix));
-		URI newPrefixURI = URI.createFileURI(toPrefix(newPrefix));
-		for(Resource resource : resources) {
-			URI uri = resource.getURI();
-			URI newURI = null;
-			try {
-				newURI = uri.replacePrefix(oldPrefixURI, newPrefixURI);
-			}
-			catch(Exception e) {
-				
-			}
-			if(newURI != null) {
-				resource.setURI(newURI);
-			}
-		}
-	}
-	
-	public static URI getProxyURI(EObject object) {
-		Resource resource = object.eResource();
-		URI uri = null;
-		if(resource instanceof ILibraryResource) {
-			ILibraryResource libResource = (ILibraryResource) resource;
-			uri = libResource.getProxyURI(object);			
-		}
-		else {
-			uri = resource.getURI().appendFragment(resource.getURIFragment(object));
-		}
-		return uri;
-	}
-	
-	public static void main(String[] args) {
-		String attrib = getTopAttribute(new File(args[0]), args[1]);
-		System.out.println(attrib);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/Resources.properties b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/Resources.properties
deleted file mode 100644
index 9903e0e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/Resources.properties
+++ /dev/null
@@ -1,51 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Error Messages
-invalidNameError_msg=The name ''{0}'' is invalid. A method element name cannot contain these characters: \\ / : * ? " < > |
-objNotFoundError_msg=Could not find object with id ''{0}''
-loadLibraryError_msg=Errors encountered while loading method library:
-loadLibraryError_details=\ \ line: {0}, column: {1}, msg: {2}
-restoreResourceError_msg=Could not restore resource ''{0}''
-FileManager_fileReadOnly=File ''{0}'' is read-only
-ErrMsg_CouldNotDelete=Could not delete {0}. {1}
-renameError_msg=Could not rename ''{0}'' to ''{1}''
-backupError_msg=Could not backup up resource ''{0}''
-marker_err_cannotResolveProxy=Could not resolve proxy {0}
-modifyFileError_msg=Cannot modify file ''{0}''
-filePathNameTooLong_msg=Cannot save resource. File path name too long (exceeding 255) ''{0}''
-loadResourceError_msg=Could not load resource ''{0}''
-loadResourceErrorWithReason_msg=Could not load resource ''{0}''. Reason: {1}
-invalidLibraryFileError_msg=Invalid method library file:
-fileNotFoundError_msg=Could not locate any method library file in workspace ''{0}''
-normalizeURIError_msg=Could not find the normalized URI for ''{0}''
-moveError_msg=Could not move ''{0}'' to ''{1}''. The destination already exists.
-modifyReadOnlyFileError_msg=Cannot modify read-only file(s): {0}
-moveResourceError_msg=Resource ''{0}'' is involved in a persistence operation that has not been committed.
-modifyFilesError_msg=Could not modify one or more files
-resourceOutOfSynch_msg=Resource is out of synch and needs to be reloaded: {0}
-resourceAutoRefreshJob_name=Resource Auto-Refresh
-loadConfiguration_couldNotLoad_logMsg=Could not load file: {0}. The method configuration in this file has duplicate GUID.
-loadConfiguration_notConfigFile_logMsg=Not a method configuration file: {0}
-
-# Progress Messages
-loadLibraryTask_name=Loading method library...
-moveDataTask_name=Moving the data...
-saveLibraryTask_name=Saving method library...
-loadResourcesTask_name=Loading all resources into memory...
-migratingDiagram_name=Migrating diagrams...
-migrateContentDescriptionsTask_name=Migrating process content descriptions...
-fixPresentationNameTask_name=Fixing empty presentation names...
-UnresolvedProxyMarkerManager_couldNotResolveProxy=Could not resolve proxy ''{0}''
-refreshLibraryFilesTask_name=Refreshing library files in workspace
-cannot_create_dir_msg=Cannot create directory ''{0}''.
-unresolvedProxyLoggerJob_name=Unresolved Proxy Logger
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/UnresolvedProxyMarkerManager.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/UnresolvedProxyMarkerManager.java
deleted file mode 100644
index afef1b5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/UnresolvedProxyMarkerManager.java
+++ /dev/null
@@ -1,968 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.persistence.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.filebuffers.FileBuffers;
-import org.eclipse.core.filebuffers.ITextFileBuffer;
-import org.eclipse.core.filebuffers.ITextFileBufferManager;
-import org.eclipse.core.filebuffers.LocationKind;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.UniqueEList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.PersistencePlugin;
-import org.eclipse.epf.uma.ecore.IProxyResolutionListener;
-import org.eclipse.epf.uma.ecore.ResolveException;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * Background job that manage markers for unresolved proxies
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class UnresolvedProxyMarkerManager extends WorkspaceJob implements IProxyResolutionListener {
-
-	private static final long DELAY = 0;
-	
-	public static final String MARKER_ID = PersistencePlugin.getDefault().getId() + ".unresolvedProxyMarker"; //$NON-NLS-1$
-	public static final String PROXY_URI = "proxyURI"; //$NON-NLS-1$
-	public static final String OWNER_GUID = "ownerGUID"; //$NON-NLS-1$
-	
-	private static class ValidObject {
-		boolean valid;
-		Object object;
-		
-		/**
-		 * @param valid
-		 * @param object
-		 */
-		public ValidObject(Object object) {
-			super();
-			this.object = object;
-			valid = true;			
-		}
-				
-	}
-	
-	private Map uriToExceptionsMap;
-	private List exceptions;
-	private Map resourceGUIToMarkersMap;
-	private Map elementGUIToMarkersMap;
-	private ResourceSet resourceSet;
-	private boolean enabled;
-	private List resourcesToValidateMarkers;
-	private boolean autoScheduled = true;
-
-	public UnresolvedProxyMarkerManager(ResourceSet resourceSet) {
-		super(PersistenceResources.unresolvedProxyLoggerJob_name);		
-		this.resourceSet = resourceSet;
-//		unresolvedResourceGUIDToMarkersMap = new HashMap();
-		uriToExceptionsMap = new HashMap();
-		exceptions = new ArrayList(); 
-		resourceGUIToMarkersMap = new HashMap();
-		elementGUIToMarkersMap = new HashMap();
-		resourcesToValidateMarkers = new UniqueEList();
-	}
-
-	public IMarker findMarker(IFile file, String proxyURI, int start, int end) throws CoreException {
-		IMarker[] markers = file.findMarkers(MARKER_ID, false, IResource.DEPTH_ZERO);
-		return findMarker(markers, proxyURI, start, end);
-	}
-	
-	private IMarker findMarker(IMarker[] markers, String proxyURI, int start, int end) throws CoreException {
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			if(proxyURI.equals(marker.getAttribute(PROXY_URI))
-					&& marker.getAttribute(IMarker.CHAR_START, -1) == start
-					&& marker.getAttribute(IMarker.CHAR_END, -1) == end) 
-			{
-				return marker;
-			}
-		}
-		return null;
-	}
-	
-	private IMarker findMarker(Collection<IMarker> markers, int start, int end) throws CoreException {
-		for (IMarker marker : markers) {
-			if(marker.getAttribute(IMarker.CHAR_START, -1) == start
-					&& marker.getAttribute(IMarker.CHAR_END, -1) == end) 
-			{
-				return marker;
-			}
-		}
-		return null;
-	}
-
-
-	private boolean addException(ResolveException re) {
-		synchronized(exceptions) {
-			URI uri = ((InternalEObject)re.getProxy()).eProxyURI();
-			Set exceptions = (Set) uriToExceptionsMap.get(uri);		
-			if(exceptions == null) {
-				exceptions = new HashSet();
-				uriToExceptionsMap.put(uri, exceptions);
-			}
-			if(exceptions.add(re)) {
-				this.exceptions.add(re);
-				return true;
-			}
-			return false;
-		}
-	}
-	
-	/**
-	 * Document based character sequence.
-	 */
-	private static class DocumentCharSequence implements CharSequence {
-
-		/** Document */
-		private IDocument fDocument;
-
-		/**
-		 * Initialize with the sequence of characters in the given
-		 * document.
-		 *
-		 * @param document the document
-		 */
-		public DocumentCharSequence(IDocument document) {
-			fDocument= document;
-		}
-
-		/*
-		 * @see java.lang.CharSequence#length()
-		 */
-		public int length() {
-			return fDocument.getLength();
-		}
-
-		/*
-		 * @see java.lang.CharSequence#charAt(int)
-		 */
-		public char charAt(int index) {
-			try {
-				return fDocument.getChar(index);
-			} catch (BadLocationException x) {
-				throw new IndexOutOfBoundsException(x.getLocalizedMessage());
-			}
-		}
-
-		/*
-		 * @see java.lang.CharSequence#subSequence(int, int)
-		 */
-		public CharSequence subSequence(int start, int end) {
-			try {
-				return fDocument.get(start, end - start);
-			} catch (BadLocationException x) {
-				throw new IndexOutOfBoundsException(x.getLocalizedMessage());
-			}
-		}
-	}
-	
-	private static class MarkersAndLocations {
-		Collection<IMarker> markers;
-		Collection<int[]> locations;				
-	}
-	
-	private void updateMarker(IMarker[] markers, Resource resource, IProgressMonitor monitor) {
-		URI containerURI = resource.getURI();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IPath path = new Path(containerURI.toFileString());
-		IFile file = workspace.getRoot().getFileForLocation(path);
-		if (file != null) {
-			String location = containerURI != null ? containerURI
-					.toFileString() : ""; //$NON-NLS-1$
-			
-			try {
-				file.refreshLocal(IResource.DEPTH_ZERO, null);
-				
-				Map<String, MarkersAndLocations> proxyURIToMarkersAndLocationsMap = new HashMap<String, MarkersAndLocations>();
-				for (int i = 0; i < markers.length; i++) {
-					IMarker marker = markers[i];
-					Object proxyURI = marker.getAttribute(PROXY_URI);
-					if(proxyURI != null) {
-						String proxyURIStr = proxyURI.toString();
-						MarkersAndLocations markersAndLocations = proxyURIToMarkersAndLocationsMap.get(proxyURIStr);
-						if(markersAndLocations == null) {
-							markersAndLocations = new MarkersAndLocations();
-							markersAndLocations.markers = new HashSet<IMarker>();
-							markersAndLocations.locations = new HashSet<int[]>();
-							proxyURIToMarkersAndLocationsMap.put(proxyURIStr, markersAndLocations);
-						}
-						markersAndLocations.markers.add(marker);
-					}
-				}
-				
-				// locate the text of unresolved URI in file
-				//
-				ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
-				try {
-					manager.connect(path, LocationKind.LOCATION, monitor);
-					ITextFileBuffer fileBuffer= manager.getTextFileBuffer(path, LocationKind.LOCATION);
-					fileBuffer.requestSynchronizationContext();
-					fileBuffer.getDocument();
-					IDocument doc = fileBuffer.getDocument();
-					if(doc != null) {
-						for (Map.Entry<String, MarkersAndLocations> entry : proxyURIToMarkersAndLocationsMap.entrySet()) {
-							String proxyURI = entry.getKey();
-							Pattern pattern = PatternConstructor.createPattern(proxyURI, true, false);
-							Matcher matcher = pattern.matcher(new DocumentCharSequence(doc));
-							while(matcher.find()) {
-								int start = matcher.start();
-								int end = matcher.end();
-								if(start != end) {
-									entry.getValue().locations.add(new int[] { start, end });
-								}
-							}
-						}
-					}
-					fileBuffer.releaseSynchronizationContext();
-				}
-				finally {
-					manager.disconnect(path, LocationKind.LOCATION, monitor);
-				}
-				
-				// make sure that resolver is still in the open library by checking whether its resource
-				// still belongs to a resource set
-				//
-				if(resource != null && resource.getResourceSet() != null) {
-					for (MarkersAndLocations markersAndLocations : proxyURIToMarkersAndLocationsMap.values()) {
-						process_entry:
-						for (Iterator<int[]> iterator = markersAndLocations.locations.iterator(); iterator.hasNext();) {
-							if(markersAndLocations.markers.isEmpty()) {
-								break process_entry;
-							}
-							int[] loc = iterator.next();
-							int start = loc[0];
-							int end = loc[1];
-							IMarker marker = findMarker(markersAndLocations.markers, start, end);
-							if(marker == null) {
-								Iterator<IMarker> iter = markersAndLocations.markers.iterator();
-								marker = iter.next();
-								iter.remove();
-								marker.setAttribute(IMarker.CHAR_START, start);	
-								marker.setAttribute(IMarker.CHAR_END, end);
-							}
-							else {
-								markersAndLocations.markers.remove(marker);
-							}
-						}
-						if(!markersAndLocations.markers.isEmpty()) {
-							// invalid markers, must be deleted
-							//
-							for (IMarker marker : markersAndLocations.markers) {
-								if(marker.exists()) {
-									try {
-										marker.delete();
-									}
-									catch(CoreException e) {
-										PersistencePlugin.getDefault().getLogger().logError(e);
-									}
-								}
-							}
-						}
-					}
-				}
-
-			} catch (CoreException ex) {
-				PersistencePlugin.getDefault().getLogger().logError(ex);
-				if (MultiFileSaveUtil.DEBUG) {
-					ex.printStackTrace();
-				}
-			}
-		}
-	}
-	
-	private void addMarker(Resource resource, URI proxyURI, String errMsg, String ownerGUID, IProgressMonitor monitor) {
-		URI containerURI = resource.getURI();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IPath path = new Path(containerURI.toFileString());
-		IFile file = workspace.getRoot().getFileForLocation(path);
-		if (file != null) {
-			String location = containerURI != null ? containerURI
-					.toFileString() : ""; //$NON-NLS-1$
-			
-			try {
-				file.refreshLocal(IResource.DEPTH_ZERO, null);
-				
-				// locate the text of unresolved URI in file
-				//
-				ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
-				try {
-					manager.connect(path, LocationKind.LOCATION, monitor);
-					ITextFileBuffer fileBuffer= manager.getTextFileBuffer(path, LocationKind.LOCATION);
-					fileBuffer.requestSynchronizationContext();
-					fileBuffer.getDocument();
-					IDocument doc = fileBuffer.getDocument();
-					if(doc != null) {
-						String proxyURIStr = proxyURI.toString();
-						Pattern pattern = PatternConstructor.createPattern(proxyURIStr, true, false);
-						Matcher matcher = pattern.matcher(new DocumentCharSequence(doc));
-						while(matcher.find()) {
-							int start = matcher.start();
-							int end = matcher.end();
-							if(start != end) {
-								// make sure that resolver is still in the open library by checking whether its resource
-								// still belongs to a resource set
-								//
-								if(resource != null && resource.getResourceSet() != null) {
-									// create problem marker for file
-									IMarker marker = findMarker(file, proxyURIStr, start, end);
-									if(marker == null) {
-										marker = file.createMarker(MARKER_ID);
-										marker.setAttribute(IMarker.SEVERITY,
-												IMarker.SEVERITY_ERROR);
-										marker.setAttribute(IMarker.MESSAGE, errMsg);
-										marker.setAttribute(IMarker.LOCATION, location);
-										marker.setAttribute(IMarker.TRANSIENT, true);
-										marker.setAttribute(IMarker.CHAR_START, start);	
-										marker.setAttribute(IMarker.CHAR_END, end);
-										marker.setAttribute(PROXY_URI, proxyURIStr);
-										marker.setAttribute(OWNER_GUID, ownerGUID);
-
-										// cache marker to it can be found easily and deleted
-										//
-										cacheMarker(marker, proxyURI);
-									}
-									else {
-										// update owner GUID
-										//
-										marker.setAttribute(OWNER_GUID, ownerGUID);
-									}
-								}
-							}
-						}
-					}
-					fileBuffer.releaseSynchronizationContext();
-				}
-				finally {
-					manager.disconnect(path, LocationKind.LOCATION, monitor);
-				}
-			} catch (CoreException ex) {
-				CommonPlugin.INSTANCE.log(ex);
-				if (MultiFileSaveUtil.DEBUG) {
-					ex.printStackTrace();
-				}
-			}
-		}
-	}
-	
-	private void addMarker(ResolveException re, IProgressMonitor monitor) {
-		InternalEObject proxy = (InternalEObject) re.getProxy();
-		URI containerURI = null;
-		Resource resource = null;
-		if(re.getResolver() != null) {
-			resource = re.getResolver().eResource();
-			
-			// make sure that resolver is still in the open library by checking whether its resource
-			// still belongs to a resource set
-			//
-//			System.out.println("UnresolvedProxyMarkerManager.addMarker(): resourceSet=" + resource.getResourceSet().hashCode());
-			if(resource != null && resource.getResourceSet() != null) {				
-				containerURI = resource.getURI();
-			}
-		}				
-		if (containerURI != null) {
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			IPath path = new Path(containerURI.toFileString());
-			IFile file = workspace.getRoot().getFileForLocation(path);
-			if (file != null) {
-				String errMsg;
-				if (re.exception() != null && re.exception().getLocalizedMessage() != null && 
-						re.exception().getLocalizedMessage().trim().length() > 0) {
-					errMsg = re.exception().getLocalizedMessage();
-				}
-				else {
-					errMsg = re.getMessage() == null ? NLS.bind(PersistenceResources.UnresolvedProxyMarkerManager_couldNotResolveProxy, proxy.eProxyURI()) : re
-								.getMessage();
-				}
-				addMarker(resource, proxy.eProxyURI(), errMsg, MultiFileSaveUtil.getGuid(re.getResolver()), monitor);
-			}
-		}
-	}
-
-	/**
-	 * @param marker
-	 * @param uri proxy uri 
-	 */
-	private void cacheMarker(IMarker marker, URI uri) {
-		synchronized(elementGUIToMarkersMap) {
-			String resourceGUID = uri.authority();
-			if(resourceGUID != null) {
-				ValidObject vo = (ValidObject) resourceGUIToMarkersMap.get(resourceGUID);
-				if(vo == null) {
-					vo = new ValidObject(new HashSet());
-					resourceGUIToMarkersMap.put(resourceGUID, vo);
-				}
-				Collection markers = (Collection) vo.object;
-				markers.add(marker);
-			}
-			String elementGUID = uri.fragment();
-			Collection markers = (Collection) elementGUIToMarkersMap.get(elementGUID);
-			if(markers == null) {
-				markers = new HashSet();
-				elementGUIToMarkersMap.put(elementGUID, markers);
-			}
-			markers.add(new ValidObject(marker));
-		}
-	}
-
-	public void clearAll() {
-		boolean oldEnabled = enabled;
-		try {
-			enabled = false;
-			cancel();
-
-			synchronized (exceptions) {
-				uriToExceptionsMap.clear();
-				exceptions.clear();
-			}
-			synchronized(elementGUIToMarkersMap) {
-				if(!elementGUIToMarkersMap.isEmpty()) {
-					for (Iterator iter = elementGUIToMarkersMap.values().iterator(); iter.hasNext();) {
-						Collection markers = (Collection) iter.next();
-						for (Iterator iter1 = markers.iterator(); iter1.hasNext();) {
-							ValidObject vo = (ValidObject) iter1.next();
-							IMarker marker = (IMarker) vo.object;
-							try {
-								if(marker.exists()) {
-									marker.delete();
-								}
-							}
-							catch(Exception e) {
-								CommonPlugin.INSTANCE.log(e);
-							}
-						}
-						markers.clear();
-					}
-					elementGUIToMarkersMap.clear();
-					resourceGUIToMarkersMap.clear();
-				}	
-			}
-			synchronized(resourcesToValidateMarkers) {
-				resourcesToValidateMarkers.clear();
-			}
-		}
-		finally {
-			enabled = oldEnabled;
-//			System.out.println("UnresolvedProxyMarkerManager.clearAll(): end");
-		}
-	}
-
-	public boolean hasUnresolvedProxy() {
-		return !elementGUIToMarkersMap.isEmpty();
-	}
-	
-	private ResolveException nextException() {
-		synchronized(exceptions) {			
-			// synchronized: in order to atomically obtain and clear requests
-			if(exceptions.isEmpty()) {
-				return null;
-			}
-			else {
-				ResolveException e = (ResolveException) this.exceptions.remove(0);
-				URI uri = ((InternalEObject)e.getProxy()).eProxyURI();
-				Collection exceptions = (Collection) uriToExceptionsMap.get(uri);
-				if(exceptions != null) {
-					exceptions.remove(e);
-					if(exceptions.isEmpty()) {
-						uriToExceptionsMap.remove(uri);
-					}
-				}
-				return e;
-			}
-		}
-	}
-	
-	private Resource nextResourceToValidateMarkers() {
-		synchronized(resourcesToValidateMarkers) {
-			if(resourcesToValidateMarkers.isEmpty()) {
-				return null;
-			}
-			else {
-				return (Resource) resourcesToValidateMarkers.remove(0);
-			}
-		}
-	}
-	
-	private void yield() {
-		try {
-			Thread.sleep(10);
-		} catch (InterruptedException e) {
-			//
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.resources.WorkspaceJob#runInWorkspace(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-//		System.out.println("UnresolvedProxyMarkerManager.runInWorkspace(): begin");
-		try {
-		if(!enabled) return Status.OK_STATUS;
-
-		try {
-			// add markers
-			//
-			ResolveException re;
-			while(!monitor.isCanceled() && (re = nextException()) != null) {
-				try {
-					addMarker(re, monitor);
-				}
-				catch(Exception e) {
-					PersistencePlugin.getDefault().getLogger().logError(e);
-				}	
-				yield();
-			}
-			
-			if(monitor.isCanceled()) {
-				throw new OperationCanceledException();
-			}
-			
-			// remove invalid markers
-			//
-			removeMarkers(monitor);
-			yield();
-			
-			// validate resource markers
-			//
-			Resource resource;
-			while(!monitor.isCanceled() && (resource = nextResourceToValidateMarkers()) != null) {
-				doValidateMarkers(resource);
-				yield();
-			}
-		}
-		catch(Exception e) {
-			if(e instanceof OperationCanceledException) {
-				throw (OperationCanceledException) e;
-			}
-			PersistencePlugin.getDefault().getLogger().logError(e);
-		}
-		
-		return Status.OK_STATUS;
-		}
-		finally {
-//			System.out.println("UnresolvedProxyMarkerManager.runInWorkspace(): end");
-		}
-	}
-	
-	private boolean removeFromResourceGUIDToMarkersMap(String proxyURI, IMarker marker) {
-		URI uri = URI.createURI(proxyURI);
-		String resourceGUID = uri.authority();
-		if(resourceGUID != null) {
-			ValidObject vo = (ValidObject) resourceGUIToMarkersMap.get(resourceGUID);
-			if(vo != null) {
-				Collection markers = ((Collection)vo.object);
-				boolean ret = markers.remove(marker);
-				if(markers.isEmpty()) {
-					resourceGUIToMarkersMap.remove(resourceGUID);
-				}
-				return ret;
-			}
-		}
-		return false;
-	}
-	
-	private void removeFromElementGUIDToMarkersMap(String proxyURI, IMarker marker) {
-		URI uri = URI.createURI(proxyURI);
-		String elementGUID = uri.fragment();
-		if(elementGUID != null) {
-			Collection validObjects = (Collection) elementGUIToMarkersMap.get(elementGUID);
-			if(validObjects != null) {
-				for (Iterator iterator1 = validObjects.iterator(); iterator1
-				.hasNext();) {
-					ValidObject vo1 = (ValidObject) iterator1.next();
-					if(vo1.object == marker) {
-						iterator1.remove();
-					}
-				}
-				if(validObjects.isEmpty()) {
-					elementGUIToMarkersMap.remove(elementGUID);
-				}	
-			}
-		}
-	}
-	
-	private void removeMarkers(IProgressMonitor monitor) {
-		synchronized(elementGUIToMarkersMap) {
-		for (Iterator iter = elementGUIToMarkersMap.values().iterator(); iter.hasNext();) {
-			Collection markers = (Collection) iter.next();
-			for (Iterator iterator = markers.iterator(); iterator.hasNext();) {
-				ValidObject vo = (ValidObject) iterator.next();
-				if(!vo.valid) {
-					try {
-						IMarker marker = (IMarker) vo.object;
-						if(marker.exists()) {
-							String proxyURI = (String) marker.getAttribute(PROXY_URI);
-
-							marker.delete();
-
-							// remove this marker from resourceGUIToMarkersMap
-							//
-							removeFromResourceGUIDToMarkersMap(proxyURI, marker);
-						}
-						iterator.remove();
-
-					} catch (Exception e) {
-						CommonPlugin.INSTANCE.log(e);
-					}
-				}
-			}
-		}
-		for (Iterator iter = resourceGUIToMarkersMap.values().iterator(); iter.hasNext();) {
-			ValidObject vo = (ValidObject) iter.next();
-			if(!vo.valid) {
-				vo.valid = true;
-				Collection markers = (Collection) vo.object;
-				for (Iterator iterator = markers.iterator(); iterator.hasNext();) {
-					IMarker marker;
-					try {
-						marker = (IMarker) iterator.next();
-						if(marker.exists()) {
-							String proxyURIStr = (String) marker.getAttribute(PROXY_URI);
-							URI proxyURI = URI.createURI(proxyURIStr);
-
-							// proxy is in the same resource that is just loaded 
-							// try to get the object with this proxy URI without loading new resource
-							//
-//							EObject o = resourceSet.getEObject(proxyURI, false);
-							String elementGUID = proxyURI.fragment();							
-							EObject o = (EObject) ((MultiFileResourceSetImpl)resourceSet).getGuidToMethodElementMap().get(elementGUID);
-							if(o != null && !o.eIsProxy()) {
-								marker.delete();
-								iterator.remove();	
-
-								// remove this marker from elementGUIToMarkersMap
-								//
-								removeFromElementGUIDToMarkersMap(proxyURIStr, marker);
-							}
-						}
-						else {
-							iterator.remove();
-						}
-					}
-					catch(Exception e) {
-						CommonPlugin.INSTANCE.log(e);
-					}
-				}
-				if(markers.isEmpty()) {
-					iter.remove();
-				}
-			}
-		}
-		}
-	}
-	
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.ecore.IProxyResolutionListener#notifyException(java.lang.Exception)
-	 */
-	public void notifyException(Exception e) {
-		if(!enabled) return;
-		
-		if(e instanceof ResolveException) {
-			ResolveException re = (ResolveException) e;
-			
-//			URI uri = ((InternalEObject)re.getProxy()).eProxyURI();
-//			if("_2J4YoPTDEdmkpYARNN468A".equals(uri.fragment())) {
-//				System.out.println();
-//			}
-			
-			if(addException(re) && autoScheduled) {			
-				schedule(DELAY);
-			}
-		}
-	}
-	
-	public void setAutoScheduled(boolean b) {
-		autoScheduled = b;
-	}
-	
-	public boolean isAutoScheduled() {
-		return autoScheduled;
-	}
-	
-	/**
-	 * Schedules this job if exceptions are available to log
-	 */
-	public boolean start() {
-		if(!enabled) return false;
-		
-		synchronized (exceptions) {
-			if(!exceptions.isEmpty()) {
-				schedule(DELAY);
-				return true;
-			}
-			return false;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.ecore.IProxyResolutionListener#proxyResolved(java.lang.Object, java.lang.Object)
-	 */
-	public void proxyResolved(Object proxy, Object resolved) {
-		if(!enabled) return;
-		
-		if(proxy instanceof InternalEObject) {
-			URI uri = ((InternalEObject)proxy).eProxyURI();
-			
-//			if("_2J4YoPTDEdmkpYARNN468A".equals(uri.fragment())) {
-//				System.out.println();
-//			}
-			
-			// remove all exceptions for this URI
-			//
-			removeExceptions(uri);
-			
-			// invalidate all markers for this URI
-			//
-			if(invalidateMarkers(uri)) {
-				schedule(DELAY);
-			}						
-		}		
-	}
-	
-	/**
-	 * @param uri
-	 */
-	private boolean invalidateMarkers(URI uri) {
-		synchronized(elementGUIToMarkersMap) {
-			boolean ret = false;
-			String resourceGUID = uri.authority();
-			if(resourceGUID != null) {
-				ValidObject vo = (ValidObject) resourceGUIToMarkersMap.get(resourceGUID);
-				if(vo != null) {
-					vo.valid = false;
-					ret = true;
-				}
-			}
-			String elementGUID = uri.fragment();
-			if(elementGUID != null) {
-				Collection markers = (Collection) elementGUIToMarkersMap.get(elementGUID);
-				if(markers != null && !markers.isEmpty()) {
-					ret = true;
-					for (Iterator iter = markers.iterator(); iter.hasNext();) {
-						ValidObject vo = (ValidObject) iter.next();
-						vo.valid = false;
-					}
-				}
-			}
-			return ret;
-		}
-	}
-
-	/**
-	 * @param uri
-	 */
-	private void removeExceptions(URI uri) {
-		synchronized (exceptions) {
-			Collection exceptions = (Collection) uriToExceptionsMap.get(uri);
-			if(exceptions == null || exceptions.isEmpty()) return;
-			this.exceptions.removeAll(exceptions);
-			uriToExceptionsMap.remove(uri);
-		}
-	}
-
-	/**
-	 * Clears markers for unresolved proxies of the given resource
-	 *  
-	 * @param resource
-	 */
-	public void clearMarkers(Resource resource) {
-		try {
-			IResource file = FileManager.getResourceForLocation(resource.getURI().toFileString());
-			if(file instanceof IFile) {
-				IMarker[] markers = file.findMarkers(MARKER_ID, false, IResource.DEPTH_ZERO);
-				for (int i = 0; i < markers.length; i++) {
-					IMarker marker = markers[i];
-					removeMarker(marker);
-				}
-			}
-		}
-		catch(Exception e) {
-			PersistencePlugin.getDefault().getLogger().logError(e);
-		}
-	}
-	
-	public void removeMarker(IMarker marker) {
-		String proxyURI = null;
-		try {
-			if(marker.exists()) {
-				proxyURI = (String) marker.getAttribute(PROXY_URI);
-				marker.delete();
-			}
-		} catch (Exception e) {
-			PersistencePlugin.getDefault().getLogger().logError(e);
-		}
-		if(proxyURI != null) {
-			synchronized(elementGUIToMarkersMap) {
-				removeFromElementGUIDToMarkersMap(proxyURI, marker);
-				removeFromResourceGUIDToMarkersMap(proxyURI, marker);
-			}
-		}		
-	}
-
-	private static class MarkerInfo {
-		String proxyURI;
-		String ownerGUID;
-		String message;
-		
-		/* (non-Javadoc)
-		 * @see java.lang.Object#equals(java.lang.Object)
-		 */
-		public boolean equals(Object obj) {
-			if(obj instanceof MarkerInfo) {
-				MarkerInfo info = (MarkerInfo) obj;
-				if(proxyURI != null && ownerGUID != null && proxyURI.equals(info.proxyURI) && ownerGUID.equals(info.ownerGUID)) {
-					return true;
-				}
-			}
-			return super.equals(obj);
-		}
-		
-		@Override
-		public int hashCode() {
-			int result = proxyURI.hashCode();
-			result ^= ownerGUID.hashCode();
-			result ^= message.hashCode();
-			return result;
-		}
-	}
-	
-	/**
-	 * Validates markers for unresolved proxies of the given resource
-	 * 
-	 * @param resource
-	 */
-	public void validateMarkers(Resource resource) {
-		boolean newlyAdded = false;
-		synchronized(resourcesToValidateMarkers) {
-			newlyAdded = resourcesToValidateMarkers.add(resource);
-		}
-		if(newlyAdded) {
-			schedule(DELAY);
-		}
-	}
-
-	public void validateAllMarkers() {
-		boolean newlyAdded = false;
-		synchronized(resourcesToValidateMarkers) {
-			if(!elementGUIToMarkersMap.isEmpty()) {
-				for (Iterator iter = elementGUIToMarkersMap.values().iterator(); iter.hasNext();) {
-					Collection markers = (Collection) iter.next();
-					for (Iterator iter1 = markers.iterator(); iter1.hasNext();) {
-						ValidObject vo = (ValidObject) iter1.next();
-						IMarker marker = (IMarker) vo.object;
-						try {
-							String location = (String)marker.getAttribute(IMarker.LOCATION);
-							URI uri = URI.createFileURI(location);
-							Resource resource = resourceSet.getResource(uri, true);
-							newlyAdded = resourcesToValidateMarkers.add(resource) | newlyAdded;
-						} catch (CoreException e) {
-							PersistencePlugin.getDefault().getLogger().logError(e);
-						}
-					}
-				}
-			}
-		}
-		if(newlyAdded) {
-			schedule(DELAY);
-		}
-	}
-	
-	public void doValidateMarkers(Resource resource) {
-		try {
-			IResource file = FileManager.getResourceForLocation(resource.getURI().toFileString());
-			if(file instanceof IFile) {
-				IMarker[] markers = file.findMarkers(MARKER_ID, false, IResource.DEPTH_ZERO);
-				HashSet<IMarker> markersToUpdate = new HashSet<IMarker>();
-				for (int i = 0; i < markers.length; i++) {
-					IMarker marker = markers[i];
-					String proxyURI = (String) marker.getAttribute(PROXY_URI);
-					if(proxyURI != null) {
-						URI uri = URI.createURI(proxyURI);
-						// try to get the object with this proxy URI without loading new resource
-						//
-						String elementGUID = uri.fragment();							
-						EObject o = (EObject) ((MultiFileResourceSetImpl)resourceSet).getGuidToMethodElementMap().get(elementGUID);
-						if(o == null || o.eIsProxy()) {
-							// marker still can exist, need to update it
-							//
-							markersToUpdate.add(marker);
-						}
-						else {
-							// object is resolved, must delete marker
-							//
-							if(marker.exists()) {
-								try {
-									marker.delete();
-								}
-								catch(Exception e) {
-									PersistencePlugin.getDefault().getLogger().logError(e);									
-								}
-							}
-							synchronized(elementGUIToMarkersMap) {
-								removeFromElementGUIDToMarkersMap(proxyURI, marker);
-								removeFromResourceGUIDToMarkersMap(proxyURI, marker);
-							}
-						}
-					}
-				}
-				if(!markersToUpdate.isEmpty()) {
-					IMarker[] markerArray = new IMarker[markersToUpdate.size()];
-					markersToUpdate.toArray(markerArray);
-					updateMarker(markerArray, resource, new NullProgressMonitor());
-				}
-			}
-		}
-		catch(Exception e) {
-			PersistencePlugin.getDefault().getLogger().logError(e);		
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/package.html
deleted file mode 100644
index 4b3fa09..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/persistence/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for persisting a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourceDescriptor.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourceDescriptor.java
deleted file mode 100644
index 794c238..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourceDescriptor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.resourcemanager.ResourceDescriptor#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.ResourceDescriptor#getUri <em>Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceDescriptor()
- * @model
- * @extends EDataObject
- * @generated
- */
-public interface ResourceDescriptor extends EDataObject {
-	
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceDescriptor_Id()
-	 * @model
-	 * @generated
-	 */
-    String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.resourcemanager.ResourceDescriptor#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Uri</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Uri</em>' attribute.
-	 * @see #setUri(String)
-	 * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceDescriptor_Uri()
-	 * @model
-	 * @generated
-	 */
-    String getUri();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.resourcemanager.ResourceDescriptor#getUri <em>Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Uri</em>' attribute.
-	 * @see #getUri()
-	 * @generated
-	 */
-    void setUri(String value);
-
-    URI getResolvedURI();
-    
-    void setResolvedURI(URI uri);
-	
-	/**
-	 * Clears the resolved URI that has been cached in previous called of getResolvedURI()
-	 * so the next call to getResolvedURI() will update the resolvedURI.
-	 *
-	 */
-	void clearResolvedURI();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourceManager.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourceManager.java
deleted file mode 100644
index e8df534..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourceManager.java
+++ /dev/null
@@ -1,147 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager;
-
-import java.util.List;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource Manager</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.resourcemanager.ResourceManager#getGuid <em>Guid</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.ResourceManager#getUriBase <em>Uri Base</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.ResourceManager#getSubManagers <em>Sub Managers</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.ResourceManager#getResourceDescriptors <em>Resource Descriptors</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceManager()
- * @model
- * @extends EDataObject
- * @generated
- */
-public interface ResourceManager extends EDataObject {
-	
-	/**
-	 * Returns the value of the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Guid</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Guid</em>' attribute.
-	 * @see #setGuid(String)
-	 * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceManager_Guid()
-	 * @model
-	 * @generated
-	 */
-	String getGuid();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.resourcemanager.ResourceManager#getGuid <em>Guid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Guid</em>' attribute.
-	 * @see #getGuid()
-	 * @generated
-	 */
-	void setGuid(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Uri Base</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Uri Base</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Uri Base</em>' attribute.
-	 * @see #setUriBase(String)
-	 * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceManager_UriBase()
-	 * @model
-	 * @generated
-	 */
-	String getUriBase();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.resourcemanager.ResourceManager#getUriBase <em>Uri Base</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Uri Base</em>' attribute.
-	 * @see #getUriBase()
-	 * @generated
-	 */
-	void setUriBase(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Sub Managers</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.resourcemanager.ResourceManager}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Managers</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>Sub Managers</em>' containment reference list.
-	 * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceManager_SubManagers()
-	 * @model type="org.eclipse.epf.resourcemanager.ResourceManager" containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	List<ResourceManager> getSubManagers();
-
-	/**
-	 * Returns the value of the '<em><b>Resource Descriptors</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.resourcemanager.ResourceDescriptor}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Resource Descriptors</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>Resource Descriptors</em>' containment reference list.
-	 * @see org.eclipse.epf.resourcemanager.ResourcemanagerPackage#getResourceManager_ResourceDescriptors()
-	 * @model type="org.eclipse.epf.resourcemanager.ResourceDescriptor" containment="true" resolveProxies="true"
-	 * @generated
-	 */
-    List<ResourceDescriptor> getResourceDescriptors();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Gets direct ResourceDescriptor whose id is the given guid
-	 * <!-- end-model-doc -->
-	 * @model
-	 * @generated
-	 */
-	ResourceDescriptor getResourceDescriptor(String guid);
-
-    /**
-     * Removes the ResourceDescriptor identified by the given uri. If clearFolder is true, this call will remove
-     * all other ResourceDescriptors whose URI shares the same folder of the given uri.
-     * 
-     * @param uri
-     * @param clearFolder
-     * @return list of ResourceDescriptors that had been removed
-     */
-    List<ResourceDescriptor> removeResourceDescriptor(URI uri, boolean clearFolder);
-
-	void dispose();
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourcemanagerFactory.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourcemanagerFactory.java
deleted file mode 100644
index 8886cac..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourcemanagerFactory.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager;
-
-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.epf.resourcemanager.ResourcemanagerPackage
- * @generated
- */
-public interface ResourcemanagerFactory extends EFactory {
-	
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    ResourcemanagerFactory eINSTANCE = org.eclipse.epf.resourcemanager.impl.ResourcemanagerFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Resource Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resource Descriptor</em>'.
-	 * @generated
-	 */
-    ResourceDescriptor createResourceDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Resource Manager</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resource Manager</em>'.
-	 * @generated
-	 */
-    ResourceManager createResourceManager();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-    ResourcemanagerPackage getResourcemanagerPackage();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourcemanagerPackage.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourcemanagerPackage.java
deleted file mode 100644
index 03e19ae..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/ResourcemanagerPackage.java
+++ /dev/null
@@ -1,338 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager;
-
-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.epf.resourcemanager.ResourcemanagerFactory
- * @model kind="package"
- * @generated
- */
-public interface ResourcemanagerPackage extends EPackage {
-	
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String eNAME = "resourcemanager"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String eNS_URI = "http:///org/eclipse/epf/uma/resourcemanager.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String eNS_PREFIX = "org.eclipse.epf.uma.resourcemanager"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    ResourcemanagerPackage eINSTANCE = org.eclipse.epf.resourcemanager.impl.ResourcemanagerPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.resourcemanager.impl.ResourceDescriptorImpl <em>Resource Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.resourcemanager.impl.ResourceDescriptorImpl
-	 * @see org.eclipse.epf.resourcemanager.impl.ResourcemanagerPackageImpl#getResourceDescriptor()
-	 * @generated
-	 */
-    int RESOURCE_DESCRIPTOR = 0;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_DESCRIPTOR__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_DESCRIPTOR__URI = 1;
-
-	/**
-	 * The number of structural features of the '<em>Resource Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_DESCRIPTOR_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl <em>Resource Manager</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl
-	 * @see org.eclipse.epf.resourcemanager.impl.ResourcemanagerPackageImpl#getResourceManager()
-	 * @generated
-	 */
-    int RESOURCE_MANAGER = 1;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_MANAGER__GUID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Uri Base</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_MANAGER__URI_BASE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Sub Managers</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_MANAGER__SUB_MANAGERS = 2;
-
-	/**
-	 * The feature id for the '<em><b>Resource Descriptors</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_MANAGER__RESOURCE_DESCRIPTORS = 3;
-
-	/**
-	 * The number of structural features of the '<em>Resource Manager</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_MANAGER_FEATURE_COUNT = 4;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.resourcemanager.ResourceDescriptor <em>Resource Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource Descriptor</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceDescriptor
-	 * @generated
-	 */
-    EClass getResourceDescriptor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.resourcemanager.ResourceDescriptor#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceDescriptor#getId()
-	 * @see #getResourceDescriptor()
-	 * @generated
-	 */
-    EAttribute getResourceDescriptor_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.resourcemanager.ResourceDescriptor#getUri <em>Uri</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Uri</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceDescriptor#getUri()
-	 * @see #getResourceDescriptor()
-	 * @generated
-	 */
-    EAttribute getResourceDescriptor_Uri();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.resourcemanager.ResourceManager <em>Resource Manager</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource Manager</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceManager
-	 * @generated
-	 */
-    EClass getResourceManager();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.resourcemanager.ResourceManager#getGuid <em>Guid</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Guid</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceManager#getGuid()
-	 * @see #getResourceManager()
-	 * @generated
-	 */
-	EAttribute getResourceManager_Guid();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.resourcemanager.ResourceManager#getUriBase <em>Uri Base</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Uri Base</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceManager#getUriBase()
-	 * @see #getResourceManager()
-	 * @generated
-	 */
-	EAttribute getResourceManager_UriBase();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.resourcemanager.ResourceManager#getSubManagers <em>Sub Managers</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sub Managers</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceManager#getSubManagers()
-	 * @see #getResourceManager()
-	 * @generated
-	 */
-	EReference getResourceManager_SubManagers();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.resourcemanager.ResourceManager#getResourceDescriptors <em>Resource Descriptors</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Resource Descriptors</em>'.
-	 * @see org.eclipse.epf.resourcemanager.ResourceManager#getResourceDescriptors()
-	 * @see #getResourceManager()
-	 * @generated
-	 */
-    EReference getResourceManager_ResourceDescriptors();
-
-	/**
-	 * 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
-	 */
-    ResourcemanagerFactory getResourcemanagerFactory();
-
-	/**
-	 * <!-- 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.epf.resourcemanager.impl.ResourceDescriptorImpl <em>Resource Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.resourcemanager.impl.ResourceDescriptorImpl
-		 * @see org.eclipse.epf.resourcemanager.impl.ResourcemanagerPackageImpl#getResourceDescriptor()
-		 * @generated
-		 */
-		EClass RESOURCE_DESCRIPTOR = eINSTANCE.getResourceDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_DESCRIPTOR__ID = eINSTANCE.getResourceDescriptor_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Uri</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_DESCRIPTOR__URI = eINSTANCE.getResourceDescriptor_Uri();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl <em>Resource Manager</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl
-		 * @see org.eclipse.epf.resourcemanager.impl.ResourcemanagerPackageImpl#getResourceManager()
-		 * @generated
-		 */
-		EClass RESOURCE_MANAGER = eINSTANCE.getResourceManager();
-
-		/**
-		 * The meta object literal for the '<em><b>Guid</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_MANAGER__GUID = eINSTANCE.getResourceManager_Guid();
-
-		/**
-		 * The meta object literal for the '<em><b>Uri Base</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_MANAGER__URI_BASE = eINSTANCE.getResourceManager_UriBase();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Managers</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference RESOURCE_MANAGER__SUB_MANAGERS = eINSTANCE.getResourceManager_SubManagers();
-
-		/**
-		 * The meta object literal for the '<em><b>Resource Descriptors</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference RESOURCE_MANAGER__RESOURCE_DESCRIPTORS = eINSTANCE.getResourceManager_ResourceDescriptors();
-
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourceDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourceDescriptorImpl.java
deleted file mode 100644
index 057b88c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourceDescriptorImpl.java
+++ /dev/null
@@ -1,280 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourcemanagerPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceDescriptorImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceDescriptorImpl#getUri <em>Uri</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceDescriptorImpl extends MultiResourceEObject implements ResourceDescriptor {
-	
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = 3256725082662385462L;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getUri() <em>Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getUri()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String URI_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUri() <em>Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getUri()
-	 * @generated
-	 * @ordered
-	 */
-    protected String uri = URI_EDEFAULT;
-
-	protected URI resolvedURI;
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ResourceDescriptorImpl() {
-		super();
-  
- //UMA-->
- 		reassignDefaultValues();
- //UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return ResourcemanagerPackage.Literals.RESOURCE_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ResourcemanagerPackage.RESOURCE_DESCRIPTOR__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 */
-    public String getUri() {
-		if(resolvedURI != null && (uri == null || uri.startsWith("../"))) { //$NON-NLS-1$
-			uri = resolvedURI.deresolve(MultiFileSaveUtil.getFinalURI(eResource())).toString();
-		}
-		return uri;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setUri(String newUri) {
-		String oldUri = uri;
-		uri = newUri;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ResourcemanagerPackage.RESOURCE_DESCRIPTOR__URI, oldUri, uri));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__ID:
-				return getId();
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__URI:
-				return getUri();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__ID:
-				setId((String)newValue);
-				return;
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__URI:
-				setUri((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__URI:
-				setUri(URI_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if(feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-//UMA<--		
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR__URI:
-				return URI_EDEFAULT == null ? uri != null : !URI_EDEFAULT.equals(uri);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", uri: "); //$NON-NLS-1$
-		result.append(uri);
-		result.append(')');
-		return result.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.resourcemanager.ResourceDescriptor#getURI()
-	 */
-	public URI getResolvedURI() {
-		if(resolvedURI == null) {
-			Resource resource = eResource();
-			if(resource != null) {
-				URI base = MultiFileSaveUtil.getFinalURI(eResource());
-				resolvedURI = URI.createURI(getUri()).resolve(base);
-			}
-			else {
-				resolvedURI = URI.createURI(getUri());
-			}
-		}
-		return resolvedURI;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.resourcemanager.ResourceDescriptor#setURI(org.eclipse.emf.common.util.URI)
-	 */
-	public void setResolvedURI(URI uri) {		
-		resolvedURI = uri;
-		String newUri = null;
-		if(resolvedURI != null) {
-			Resource resource = eResource();	
-			if(resource != null) {
-				URI baseURI = MultiFileSaveUtil.getFinalURI(resource);
-				newUri = resolvedURI.deresolve(baseURI).toString();
-			}
-		}
-		setUri(newUri);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.resourcemanager.ResourceDescriptor#clearResolvedURI()
-	 */
-	public void clearResolvedURI() {
-		resolvedURI = null;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourceManagerImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourceManagerImpl.java
deleted file mode 100644
index 8f062fd..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourceManagerImpl.java
+++ /dev/null
@@ -1,481 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager.impl;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.resourcemanager.ResourcemanagerPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource Manager</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getGuid <em>Guid</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getUriBase <em>Uri Base</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getSubManagers <em>Sub Managers</em>}</li>
- *   <li>{@link org.eclipse.epf.resourcemanager.impl.ResourceManagerImpl#getResourceDescriptors <em>Resource Descriptors</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceManagerImpl extends MultiResourceEObject implements ResourceManager {
-	
-	private static final long serialVersionUID = -5164471475509169204L;
-
-	/**
-	 * The default value of the '{@link #getGuid() <em>Guid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGuid()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String GUID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getGuid() <em>Guid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGuid()
-	 * @generated
-	 * @ordered
-	 */
-	protected String guid = GUID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getUriBase() <em>Uri Base</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUriBase()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String URI_BASE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUriBase() <em>Uri Base</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUriBase()
-	 * @generated
-	 * @ordered
-	 */
-	protected String uriBase = URI_BASE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getSubManagers() <em>Sub Managers</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubManagers()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subManagers = null;
-
-	/**
-	 * The cached value of the '{@link #getResourceDescriptors() <em>Resource Descriptors</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getResourceDescriptors()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList resourceDescriptors = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 */
-    protected ResourceManagerImpl() {
-		super();
-		
-		guid = UmaUtil.generateGUID();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return ResourcemanagerPackage.Literals.RESOURCE_MANAGER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getGuid() {
-		return guid;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGuid(String newGuid) {
-		String oldGuid = guid;
-		guid = newGuid;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ResourcemanagerPackage.RESOURCE_MANAGER__GUID, oldGuid, guid));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getUriBase() {
-		return uriBase;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUriBase(String newUriBase) {
-		String oldUriBase = uriBase;
-		uriBase = newUriBase;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE, oldUriBase, uriBase));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubManagers() {
-		if (subManagers == null) {
-			subManagers = new EObjectContainmentEList.Resolving(ResourceManager.class, this, ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS);
-		}
-		return subManagers;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getResourceDescriptors() {
-		if (resourceDescriptors == null) {
-			resourceDescriptors = new EObjectContainmentEList.Resolving(ResourceDescriptor.class, this, ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS);
-		}
-		return resourceDescriptors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (guid: "); //$NON-NLS-1$
-		result.append(guid);
-		result.append(", uriBase: "); //$NON-NLS-1$
-		result.append(uriBase);
-		result.append(')');
-		return result.toString();
-	}
-
-	//
-	// Start custom code
-	//
-
-	/* (non-Javadoc)
-	 * @see com.ibm.umaf.ecore.impl.MultiResourceEObject#eResolveProxy(org.eclipse.emf.ecore.InternalEObject)
-	 */
-	public EObject eResolveProxy(InternalEObject proxy) {
-		return super.eResolveProxy(proxy);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#resolve()
-	 */
-	public void resolve() {
-		URI base = MultiFileSaveUtil.getFinalURI(eResource());
-        for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) {
-            ResourceDescriptorImpl desc = (ResourceDescriptorImpl) iter.next();
-            desc.resolvedURI = URI.createURI(desc.getUri()).resolve(base);
-        }
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#deresolve()
-	 */
-	public void deresolve() {
-		URI base = MultiFileSaveUtil.getFinalURI(eResource());
-        // convert path in all descriptors to relative
-        //
-        for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) {
-            ResourceDescriptor desc = (ResourceDescriptor) iter.next();
-            desc.setUri(desc.getResolvedURI().deresolve(base).toString());
-        }
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#removeResourceDescriptor(org.eclipse.emf.common.util.URI, boolean)
-	 */
-	public List removeResourceDescriptor(URI uri, boolean clearFolder) {
-		ArrayList removedList = new ArrayList();
-//		ResourceDescriptor removedDescriptor = null;
-        for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) {
-            ResourceDescriptor desc = (ResourceDescriptor) iter.next();
-            if(uri.equals(desc.getResolvedURI().trimFragment())) {
-                iter.remove();
-//                removedDescriptor = desc;
-                removedList.add(desc);
-            }
-        }
-//        if(removedDescriptor != null) {        	
-        	if(clearFolder) {
-                // remove all child descriptors of the removed descriptor
-        		//
-        		String oldDir = new File(uri.toFileString()).getParent() + File.separator;
-        		for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) {
-        			ResourceDescriptor desc = (ResourceDescriptor) iter.next();
-        			if(desc.getResolvedURI().toFileString().startsWith(oldDir)) {
-        				iter.remove();
-        				removedList.add(desc);
-        			}
-        		}
-        	}
-//        	else {
-//        		// remove all the descriptors of the same resource
-//        		//
-//        		URI resUri = removedDescriptor.getResolvedURI().trimFragment();
-//        		for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) {
-//        			ResourceDescriptor desc = (ResourceDescriptor) iter.next();
-//        			if(desc.getResolvedURI().trimFragment().equals(resUri)) {
-//        				iter.remove();
-//        				removedList.add(desc);
-//        			}
-//        		}        		
-//        	}
-//        }
-        return removedList;
-	}	
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public ResourceDescriptor getResourceDescriptor(String guid) {
-		if(idToResourceDescriptorMap == null) {
-			idToResourceDescriptorMap = new HashMap();
-			
-			eAdapters().add(new AdapterImpl() {
-		        public void notifyChanged(Notification msg) {
-		            ResourceDescriptor desc;
-		            switch(msg.getFeatureID(ResourceManager.class)) {
-		                case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS:
-		                    switch(msg.getEventType()) {
-		                        case Notification.ADD:
-		                            desc = (ResourceDescriptor)msg.getNewValue();
-									idToResourceDescriptorMap.put(desc.getId(), desc);
-		                            return;
-		                        case Notification.ADD_MANY:
-		                            for (Iterator iter = ((Collection)msg.getNewValue()).iterator(); iter
-		                                    .hasNext();) {
-										desc = (ResourceDescriptor) iter.next();
-										idToResourceDescriptorMap.put(desc.getId(), desc);
-		                            }
-		                            return;
-		                        case Notification.REMOVE:
-		                            idToResourceDescriptorMap.remove(((ResourceDescriptor)msg.getOldValue()).getId());
-		                            return;
-		                        case Notification.REMOVE_MANY:
-		                            for (Iterator iter = ((Collection)msg.getOldValue()).iterator(); iter
-		                                    .hasNext();) {
-		                                idToResourceDescriptorMap.remove(((ResourceDescriptor) iter.next()).getId());
-		                            }
-		                            return;
-		                    }
-		            }
-		        }
-
-			});
-			
-			// populate the map
-			//
-			for (Iterator iter = getResourceDescriptors().iterator(); iter.hasNext();) {
-				ResourceDescriptor element = (ResourceDescriptor) iter.next();
-				idToResourceDescriptorMap.put(element.getId(), element);
-			}
-		}
-		
-		return (ResourceDescriptor) idToResourceDescriptorMap.get(guid);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS:
-				return ((InternalEList)getSubManagers()).basicRemove(otherEnd, msgs);
-			case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS:
-				return ((InternalEList)getResourceDescriptors()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_MANAGER__GUID:
-				return getGuid();
-			case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE:
-				return getUriBase();
-			case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS:
-				return getSubManagers();
-			case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS:
-				return getResourceDescriptors();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_MANAGER__GUID:
-				setGuid((String)newValue);
-				return;
-			case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE:
-				setUriBase((String)newValue);
-				return;
-			case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS:
-				getSubManagers().clear();
-				getSubManagers().addAll((Collection)newValue);
-				return;
-			case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS:
-				getResourceDescriptors().clear();
-				getResourceDescriptors().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_MANAGER__GUID:
-				setGuid(GUID_EDEFAULT);
-				return;
-			case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE:
-				setUriBase(URI_BASE_EDEFAULT);
-				return;
-			case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS:
-				getSubManagers().clear();
-				return;
-			case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS:
-				getResourceDescriptors().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if(feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-//UMA<--		
-		switch (featureID) {
-			case ResourcemanagerPackage.RESOURCE_MANAGER__GUID:
-				return GUID_EDEFAULT == null ? guid != null : !GUID_EDEFAULT.equals(guid);
-			case ResourcemanagerPackage.RESOURCE_MANAGER__URI_BASE:
-				return URI_BASE_EDEFAULT == null ? uriBase != null : !URI_BASE_EDEFAULT.equals(uriBase);
-			case ResourcemanagerPackage.RESOURCE_MANAGER__SUB_MANAGERS:
-				return subManagers != null && !subManagers.isEmpty();
-			case ResourcemanagerPackage.RESOURCE_MANAGER__RESOURCE_DESCRIPTORS:
-				return resourceDescriptors != null && !resourceDescriptors.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.resourcemanager.ResourceManager#dispose()
-	 */
-	public void dispose() {
-		if(idToResourceDescriptorMap != null) {
-			idToResourceDescriptorMap.clear();
-			idToResourceDescriptorMap = null;
-		}
-		
-		eAdapters().clear();		
-		
-		// dispose the sub managers
-		//
-		for (Iterator iter = ((InternalEList)getSubManagers()).basicIterator(); iter.hasNext();) {
-			ResourceManager subMgr = (ResourceManager) iter.next();
-			if(!((InternalEObject)subMgr).eIsProxy()) {
-				subMgr.dispose();
-			}
-		}
-	}
-
-	private Map idToResourceDescriptorMap;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourcemanagerFactoryImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourcemanagerFactoryImpl.java
deleted file mode 100644
index 17f5daa..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourcemanagerFactoryImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager.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.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.resourcemanager.ResourcemanagerFactory;
-import org.eclipse.epf.resourcemanager.ResourcemanagerPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ResourcemanagerFactoryImpl extends EFactoryImpl implements ResourcemanagerFactory {
-	
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static ResourcemanagerFactory init() {
-		try {
-			ResourcemanagerFactory theResourcemanagerFactory = (ResourcemanagerFactory)EPackage.Registry.INSTANCE.getEFactory("http:///org/eclipse/epf/uma/resourcemanager.ecore"); //$NON-NLS-1$ 
-			if (theResourcemanagerFactory != null) {
-				return theResourcemanagerFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new ResourcemanagerFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourcemanagerFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR: return (EObject)createResourceDescriptor();
-			case ResourcemanagerPackage.RESOURCE_MANAGER: return (EObject)createResourceManager();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceDescriptor createResourceDescriptor() {
-		ResourceDescriptorImpl resourceDescriptor = new ResourceDescriptorImpl();
-		return resourceDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceManager createResourceManager() {
-		ResourceManagerImpl resourceManager = new ResourceManagerImpl();
-		return resourceManager;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourcemanagerPackage getResourcemanagerPackage() {
-		return (ResourcemanagerPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-    public static ResourcemanagerPackage getPackage() {
-		return ResourcemanagerPackage.eINSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourcemanagerPackageImpl.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourcemanagerPackageImpl.java
deleted file mode 100644
index 845b729..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/ResourcemanagerPackageImpl.java
+++ /dev/null
@@ -1,268 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EOperation;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.resourcemanager.ResourcemanagerFactory;
-import org.eclipse.epf.resourcemanager.ResourcemanagerPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class ResourcemanagerPackageImpl extends EPackageImpl implements ResourcemanagerPackage {
-	
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass resourceDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass resourceManagerEClass = 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.epf.resourcemanager.ResourcemanagerPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-    private ResourcemanagerPackageImpl() {
-		super(eNS_URI, ResourcemanagerFactory.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.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-    public static ResourcemanagerPackage init() {
-		if (isInited) return (ResourcemanagerPackage)EPackage.Registry.INSTANCE.getEPackage(ResourcemanagerPackage.eNS_URI);
-
-		// Obtain or create and register package
-		ResourcemanagerPackageImpl theResourcemanagerPackage = (ResourcemanagerPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof ResourcemanagerPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new ResourcemanagerPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theResourcemanagerPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theResourcemanagerPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theResourcemanagerPackage.freeze();
-
-		return theResourcemanagerPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getResourceDescriptor() {
-		return resourceDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getResourceDescriptor_Id() {
-		return (EAttribute)resourceDescriptorEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getResourceDescriptor_Uri() {
-		return (EAttribute)resourceDescriptorEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getResourceManager() {
-		return resourceManagerEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResourceManager_Guid() {
-		return (EAttribute)resourceManagerEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResourceManager_UriBase() {
-		return (EAttribute)resourceManagerEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResourceManager_SubManagers() {
-		return (EReference)resourceManagerEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceManager_ResourceDescriptors() {
-		return (EReference)resourceManagerEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourcemanagerFactory getResourcemanagerFactory() {
-		return (ResourcemanagerFactory)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
-		resourceDescriptorEClass = createEClass(RESOURCE_DESCRIPTOR);
-		createEAttribute(resourceDescriptorEClass, RESOURCE_DESCRIPTOR__ID);
-		createEAttribute(resourceDescriptorEClass, RESOURCE_DESCRIPTOR__URI);
-
-		resourceManagerEClass = createEClass(RESOURCE_MANAGER);
-		createEAttribute(resourceManagerEClass, RESOURCE_MANAGER__GUID);
-		createEAttribute(resourceManagerEClass, RESOURCE_MANAGER__URI_BASE);
-		createEReference(resourceManagerEClass, RESOURCE_MANAGER__SUB_MANAGERS);
-		createEReference(resourceManagerEClass, RESOURCE_MANAGER__RESOURCE_DESCRIPTORS);
-	}
-
-	/**
-	 * <!-- 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);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(resourceDescriptorEClass, ResourceDescriptor.class, "ResourceDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getResourceDescriptor_Id(), ecorePackage.getEString(), "id", null, 0, 1, ResourceDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getResourceDescriptor_Uri(), ecorePackage.getEString(), "uri", null, 0, 1, ResourceDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(resourceManagerEClass, ResourceManager.class, "ResourceManager", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getResourceManager_Guid(), ecorePackage.getEString(), "guid", null, 0, 1, ResourceManager.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getResourceManager_UriBase(), ecorePackage.getEString(), "uriBase", null, 0, 1, ResourceManager.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getResourceManager_SubManagers(), this.getResourceManager(), null, "subManagers", null, 0, -1, ResourceManager.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getResourceManager_ResourceDescriptors(), this.getResourceDescriptor(), null, "resourceDescriptors", null, 0, -1, ResourceManager.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		EOperation op = addEOperation(resourceManagerEClass, this.getResourceDescriptor(), "getResourceDescriptor", 0, 1); //$NON-NLS-1$
-		addEParameter(op, ecorePackage.getEString(), "guid", 0, 1); //$NON-NLS-1$
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/package.html
deleted file mode 100644
index 34b0d36..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for managing XMI resources in a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/package.html
deleted file mode 100644
index 34afc53..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for managing XMI resources in a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/resourcemanager.ecore b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/resourcemanager.ecore
deleted file mode 100644
index b41c8b5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/resourcemanager.ecore
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="resourcemanager"
-    nsURI="http:///org/eclipse/epf/uma/resourcemanager.ecore" nsPrefix="org.eclipse.epf.uma.resourcemanager">
-  <eClassifiers xsi:type="ecore:EClass" name="ResourceDescriptor">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResourceManager">
-    <eOperations name="getResourceDescriptor" eType="#//ResourceDescriptor">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Gets direct ResourceDescriptor whose id is the given guid"/>
-      </eAnnotations>
-      <eParameters name="guid" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    </eOperations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="guid" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uriBase" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subManagers" upperBound="-1"
-        eType="#//ResourceManager" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceDescriptors" upperBound="-1"
-        eType="#//ResourceDescriptor" containment="true"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/resourcemanager.genmodel b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/resourcemanager.genmodel
deleted file mode 100644
index acb79c7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/resourcemanager.genmodel
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.epf.library.persistence/src"
-    editDirectory="/org.eclipse.epf.resourcemanager.edit/src" editorDirectory="/org.eclipse.epf.resourcemanager.editor/src"
-    modelPluginID="org.eclipse.epf.resourcemanager" templateDirectory="/org.eclipse.epf.uma.ecore/templates"
-    runtimeJar="true" dynamicTemplates="true" modelName="Resourcemanager" editPluginClass="org.eclipse.epf.resourcemanager.provider.ResourcemanagerEditPlugin"
-    editorPluginClass="org.eclipse.epf.resourcemanager.presentation.ResourcemanagerEditorPlugin"
-    nonNLSMarkers="true" rootExtendsInterface="org.eclipse.emf.ecore.sdo.EDataObject"
-    rootExtendsClass="org.eclipse.epf.uma.ecore.impl.MultiResourceEObject" rootImplementsInterface="org.eclipse.emf.ecore.sdo.InternalEDataObject"
-    suppressEMFTypes="true" featureMapWrapperInterface="commonj.sdo.Sequence" featureMapWrapperInternalInterface="org.eclipse.emf.ecore.sdo.util.ESequence"
-    featureMapWrapperClass="org.eclipse.emf.ecore.sdo.util.BasicESequence" containmentProxies="true">
-  <foreignModel>C:\CC_Views\ple_TNG_Authoring\tng_authoring\TNG UML Models\resourcemanager.mdl</foreignModel>
-  <staticPackages>http://www.eclipse.org/emf/2003/SDO</staticPackages>
-  <modelPluginVariables>EMF_COMMONJ_SDO=org.eclipse.emf.commonj.sdo</modelPluginVariables>
-  <modelPluginVariables>EMF_ECORE_SDO=org.eclipse.emf.ecore.sdo</modelPluginVariables>
-  <genPackages prefix="Resourcemanager" basePackage="org.eclipse.epf" ecorePackage="resourcemanager.ecore#/">
-    <genClasses ecoreClass="resourcemanager.ecore#//ResourceDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resourcemanager.ecore#//ResourceDescriptor/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resourcemanager.ecore#//ResourceDescriptor/uri"/>
-    </genClasses>
-    <genClasses ecoreClass="resourcemanager.ecore#//ResourceManager">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resourcemanager.ecore#//ResourceManager/guid"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resourcemanager.ecore#//ResourceManager/uriBase"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resourcemanager.ecore#//ResourceManager/subManagers"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resourcemanager.ecore#//ResourceManager/resourceDescriptors"/>
-      <genOperations ecoreOperation="resourcemanager.ecore#//ResourceManager/getResourceDescriptor">
-        <genParameters ecoreParameter="resourcemanager.ecore#//ResourceManager/getResourceDescriptor/guid"/>
-      </genOperations>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/ResourcemanagerAdapterFactory.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/ResourcemanagerAdapterFactory.java
deleted file mode 100644
index 4330d5d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/ResourcemanagerAdapterFactory.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager.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.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.resourcemanager.ResourcemanagerPackage;
-
-/**
- * <!-- 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.epf.resourcemanager.ResourcemanagerPackage
- * @generated
- */
-public class ResourcemanagerAdapterFactory extends AdapterFactoryImpl {
-	
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected static ResourcemanagerPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourcemanagerAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = ResourcemanagerPackage.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
-	 */
-    public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ResourcemanagerSwitch modelSwitch =
-		new ResourcemanagerSwitch() {
-			public Object caseResourceDescriptor(ResourceDescriptor object) {
-				return createResourceDescriptorAdapter();
-			}
-			public Object caseResourceManager(ResourceManager object) {
-				return createResourceManagerAdapter();
-			}
-			public Object 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
-	 */
-    public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.resourcemanager.ResourceDescriptor <em>Resource Descriptor</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.epf.resourcemanager.ResourceDescriptor
-	 * @generated
-	 */
-    public Adapter createResourceDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.resourcemanager.ResourceManager <em>Resource Manager</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.epf.resourcemanager.ResourceManager
-	 * @generated
-	 */
-    public Adapter createResourceManagerAdapter() {
-		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;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/ResourcemanagerSwitch.java b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/ResourcemanagerSwitch.java
deleted file mode 100644
index 90a47c3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/ResourcemanagerSwitch.java
+++ /dev/null
@@ -1,157 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.resourcemanager.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.resourcemanager.ResourcemanagerPackage;
-
-/**
- * <!-- 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.epf.resourcemanager.ResourcemanagerPackage
- * @generated
- */
-public class ResourcemanagerSwitch {
-	
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected static ResourcemanagerPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourcemanagerSwitch() {
-		if (modelPackage == null) {
-			modelPackage = ResourcemanagerPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * 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
-	 */
-    public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * 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
-	 */
-    protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * 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
-	 */
-    protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case ResourcemanagerPackage.RESOURCE_DESCRIPTOR: {
-				ResourceDescriptor resourceDescriptor = (ResourceDescriptor)theEObject;
-				Object result = caseResourceDescriptor(resourceDescriptor);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case ResourcemanagerPackage.RESOURCE_MANAGER: {
-				ResourceManager resourceManager = (ResourceManager)theEObject;
-				Object result = caseResourceManager(resourceManager);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Resource Descriptor</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 interpretting the object as an instance of '<em>Resource Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseResourceDescriptor(ResourceDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Resource Manager</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 interpretting the object as an instance of '<em>Resource Manager</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseResourceManager(ResourceManager object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting 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 interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-    public Object defaultCase(EObject object) {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/package.html b/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/package.html
deleted file mode 100644
index b587d6f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.persistence/src/org/eclipse/epf/resourcemanager/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for managing XMI resources in a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/.classpath b/1.5/plugins/org.eclipse.epf.library.ui.xmi/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/.project b/1.5/plugins/org.eclipse.epf.library.ui.xmi/.project
deleted file mode 100644
index cccb3dc..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.library.ui.xmi</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.library.ui.xmi/META-INF/MANIFEST.MF
deleted file mode 100644
index 3fa20fa..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.library.ui.xmi;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.library.ui.xmi.XMILibraryUIPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.epf.common,
- org.eclipse.epf.library.ui,
- org.eclipse.epf.library.xmi,
- org.eclipse.epf.ui,
- org.eclipse.ui,
- org.eclipse.epf.common.ui,
- org.eclipse.emf.edit.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.library.ui.xmi
-Bundle-Vendor: %providerName
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/build.properties b/1.5/plugins/org.eclipse.epf.library.ui.xmi/build.properties
deleted file mode 100644
index c2bafd5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/plugin.properties b/1.5/plugins/org.eclipse.epf.library.ui.xmi/plugin.properties
deleted file mode 100644
index 1a26ca9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF XMI Library UI
-providerName=Eclipse.org
-newXMILibraryWizardPageTitle=Create a new XMI method library.
-newXMILibraryWizardPageDescription=Specify the location for the method library. The method library content will be stored in a folder, named after the library, at the specified location.
-openXMILibraryWizardPageTitle=Open a XMI method library.
-openXMILibraryWizardPageDescription=Specify the location for the method library.
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/plugin.xml b/1.5/plugins/org.eclipse.epf.library.ui.xmi/plugin.xml
deleted file mode 100644
index 07bee93..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/plugin.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.epf.library.ui.newLibraryWizardPages">
-      <newLibraryWizardPage
-            class="org.eclipse.epf.library.ui.xmi.NewXMILibraryWizardPage"
-            type="xmi"
-            title="%newXMILibraryWizardPageTitle"
-            description="%newXMILibraryWizardPageDescription">
-      </newLibraryWizardPage>
-   </extension>
-   
-   <extension
-         point="org.eclipse.epf.library.ui.openLibraryWizardPages">
-      <openLibraryWizardPage
-            class="org.eclipse.epf.library.ui.xmi.OpenXMILibraryWizardPage"
-            type="xmi"
-            title="%openXMILibraryWizardPageTitle"
-            description="%openXMILibraryWizardPageDescription">
-      </openLibraryWizardPage>
-   </extension>   
-
-   <extension
-         point="org.eclipse.epf.library.persistence.migrators">
-      <migrator
-            class="org.eclipse.epf.library.ui.xmi.internal.migration.Migrator102_103"
-            libNsURI="http://www.ibm.com/uma/1.0.2/uma.ecore"/>
-      <migrator
-            class="org.eclipse.epf.library.ui.xmi.internal.migration.Migrator103"
-            libNsURI="http://www.eclipse.org/epf/uma/1.0.3/uma.ecore"/>
-   </extension>
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/NewXMILibraryWizardPage.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/NewXMILibraryWizardPage.java
deleted file mode 100644
index 7f6008e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/NewXMILibraryWizardPage.java
+++ /dev/null
@@ -1,192 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.library.ui.wizards.NewLibraryWizardPage;
-import org.eclipse.epf.library.xmi.XMILibraryManager;
-import org.eclipse.epf.library.xmi.preferences.XMILibraryPreferences;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Prompts the user to select a path for a XMI method library.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class NewXMILibraryWizardPage extends NewLibraryWizardPage {
-
-	private Text nameText;
-
-	private Combo locationCombo;
-
-	private ModifyListener modifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			setPageComplete(isPageComplete());
-			getWizard().getContainer().updateButtons();
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewXMILibraryWizardPage(String pageId) {
-		super(pageId);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(3, false));
-
-		Label nameLabel = new Label(composite, SWT.NORMAL);
-		nameLabel.setText(XMILibraryUIResources.nameLabel_text);
-
-		nameText = new Text(composite, SWT.BORDER);
-		nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		nameText.setEditable(false);
-
-		new Label(composite, SWT.NORMAL);
-
-		Label locationLabel = new Label(composite, SWT.NONE);
-		locationLabel.setText(XMILibraryUIResources.locationLabel_text);
-
-		locationCombo = new Combo(composite, SWT.BORDER);
-		locationCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		locationCombo.addModifyListener(modifyListener);
-		locationCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-
-		final Shell shell = parent.getShell();
-
-		final Button browseButton = new Button(composite, SWT.NONE);
-		browseButton.setText(XMILibraryUIResources.browseButton_text);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				try {
-					DirectoryDialog dialog = new DirectoryDialog(shell,
-							SWT.NONE);
-					String selectedDir = dialog.open();
-					if (selectedDir != null) {
-						locationCombo.add(selectedDir, 0);
-						locationCombo.setText(selectedDir);
-					}
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		});
-
-		new Label(composite, SWT.NONE);
-
-		final Button defaultPathCheckbox = new Button(composite, SWT.CHECK);
-		defaultPathCheckbox
-				.setText(XMILibraryUIResources.defaultPathCheckboxLabel_text);
-		defaultPathCheckbox.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				if (defaultPathCheckbox.getSelection()) {
-					locationCombo.removeModifyListener(modifyListener);
-					locationCombo.setText(XMILibraryPreferences
-							.getDefaultLibraryPath());
-					locationCombo.addModifyListener(modifyListener);
-					locationCombo.setEnabled(false);
-					browseButton.setEnabled(false);
-				} else {
-					locationCombo.setEnabled(true);
-					browseButton.setEnabled(true);
-				}
-			}
-		});
-
-		setPageComplete(true);
-		setControl(composite);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (obj != null && obj instanceof String) {
-			String libraryName = (String) obj;
-			nameText.setText(libraryName);
-		}
-
-		if (getLibraryPath().length() == 0) {
-			locationCombo.removeModifyListener(modifyListener);
-			locationCombo
-					.setText(XMILibraryPreferences.getDefaultLibraryPath());
-			locationCombo.addModifyListener(modifyListener);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		return getLibraryPath().length() > 0 && getLibraryName().length() > 0;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		return null;
-	}
-
-	/**
-	 * Returns the library name.
-	 */
-	public String getLibraryName() {
-		return nameText.getText().trim();
-	}
-
-	/**
-	 * Returns the library path.
-	 */
-	public String getLibraryPath() {
-		return locationCombo.getText().trim();
-	}
-
-	/**
-	 * Returns the library specific user selections.
-	 */
-	public Map getSelections() {
-		Map options = new HashMap();
-		File libraryPath = new File(getLibraryPath(), getLibraryName());
-		options.put(XMILibraryManager.ARG_LIBRARY_PATH, libraryPath
-				.getAbsolutePath());
-		return options;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/OpenXMILibraryWizardPage.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/OpenXMILibraryWizardPage.java
deleted file mode 100644
index 2156ec8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/OpenXMILibraryWizardPage.java
+++ /dev/null
@@ -1,144 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.library.ui.wizards.OpenLibraryWizardPage;
-import org.eclipse.epf.library.xmi.XMILibraryManager;
-import org.eclipse.epf.library.xmi.preferences.XMILibraryPreferences;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Prompts the user to select a path for a XMI method library.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class OpenXMILibraryWizardPage extends OpenLibraryWizardPage {
-
-	private Combo locationCombo;
-
-	private ModifyListener modifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			setPageComplete(isPageComplete());
-			getWizard().getContainer().updateButtons();
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OpenXMILibraryWizardPage(String pageId) {
-		super(pageId);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(3, false));
-
-		createLabel(composite, XMILibraryUIResources.locationLabel_text);
-
-		locationCombo = createCombobox(composite);
-		locationCombo.addModifyListener(modifyListener);
-		locationCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-
-		final Shell shell = parent.getShell();
-
-		final Button browseButton = createButton(composite,
-				XMILibraryUIResources.browseButton_text);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				try {
-					DirectoryDialog dialog = new DirectoryDialog(shell,
-							SWT.NONE);
-					dialog.setFilterPath(getLibraryPath());
-					String selectedDir = dialog.open();
-					if (selectedDir != null) {
-						locationCombo.add(selectedDir, 0);
-						locationCombo.setText(selectedDir);
-					}
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		});
-
-		setPageComplete(true);
-		setControl(composite);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (getLibraryPath().length() == 0) {
-			locationCombo.removeModifyListener(modifyListener);
-			locationCombo
-					.setText(XMILibraryPreferences.getDefaultLibraryPath());
-			locationCombo.addModifyListener(modifyListener);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		return getLibraryPath().length() > 0;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		return null;
-	}
-
-	/**
-	 * Returns the library path.
-	 */
-	public String getLibraryPath() {
-		return locationCombo.getText().trim();
-	}
-
-	/**
-	 * Returns the library specific user selections.
-	 */
-	public Map getSelections() {
-		Map options = new HashMap();
-		File libraryPath = new File(getLibraryPath());
-		options.put(XMILibraryManager.ARG_LIBRARY_PATH, libraryPath
-				.getAbsolutePath());
-		return options;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/Resources.properties b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/Resources.properties
deleted file mode 100644
index a1735a9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/Resources.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Method Element Names (Singular)
-nameLabel_text=Name:
-locationLabel_text=Location:
-browseButton_text=Browse...
-defaultPathCheckboxLabel_text=Use the default directory.
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/XMILibraryUIPlugin.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/XMILibraryUIPlugin.java
deleted file mode 100644
index ceae35d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/XMILibraryUIPlugin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class for the <code>org.eclipse.epf.library.ui.xmi</code>
- * plug-in.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class XMILibraryUIPlugin extends AbstractPlugin {
-
-	/**
-	 * The plug-in ID.
-	 */
-	public static final String PLUGIN_ID = XMILibraryUIPlugin.class
-			.getPackage().getName();
-
-	// The shared instance
-	private static XMILibraryUIPlugin plugin;
-
-	/**
-	 * The constructor
-	 */
-	public XMILibraryUIPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * @see org.eclipse.epf.common.plugin.AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * @see org.eclipse.epf.common.plugin.AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 * 
-	 * @return The shared instance
-	 */
-	public static XMILibraryUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/XMILibraryUIResources.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/XMILibraryUIResources.java
deleted file mode 100644
index 91bf0fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/XMILibraryUIResources.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi;
-
-import org.eclipse.osgi.util.NLS;
-
-public class XMILibraryUIResources extends NLS {
-
-	private static String BUNDLE_NAME = XMILibraryUIResources.class
-			.getPackage().getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	public static String nameLabel_text;
-	
-	public static String locationLabel_text;
-
-	public static String browseButton_text;
-	
-	public static String defaultPathCheckboxLabel_text;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, XMILibraryUIResources.class);
-	}
-
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given object.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String bind(String key, Object data) {
-		return NLS.bind(key, new Object[] { data });
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/MigrationUtil.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/MigrationUtil.java
deleted file mode 100644
index 5085334..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/MigrationUtil.java
+++ /dev/null
@@ -1,198 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi.internal.migration;
-
-import java.io.UnsupportedEncodingException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.sdo.EProperty;
-import org.eclipse.epf.common.html.HTMLFormatter;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.library.util.TextReferenceReplacerImpl;
-import org.eclipse.epf.library.xmi.XMILibraryResourceManager;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Utility class to help migrate and format the html content.
- * 
- * @author JInhua Xi
- * @author Weiping Lu
- * @since 1.0
- */
-public class MigrationUtil {
-	
-	public static Set<String> cdataFeatureNames = new HashSet<String>();
-	private static boolean localDebug = false;
-	static {
-		cdataFeatureNames.add("alternatives"); //$NON-NLS-1$
-		cdataFeatureNames.add("mainDescription"); //$NON-NLS-1$
-		cdataFeatureNames.add("howToStaff"); //$NON-NLS-1$
-		cdataFeatureNames.add("keyConsiderations"); //$NON-NLS-1$
-		cdataFeatureNames.add("purpose"); //$NON-NLS-1$
-		cdataFeatureNames.add("scope");  //$NON-NLS-1$
-		cdataFeatureNames.add("usageNotes");  //$NON-NLS-1$
-		
-		cdataFeatureNames.add("skills");  //$NON-NLS-1$
-		cdataFeatureNames.add("assignmentApproaches");  //$NON-NLS-1$
-		cdataFeatureNames.add("synonyms");  //$NON-NLS-1$
-		cdataFeatureNames.add("sectionDescription");  //$NON-NLS-1$
-		cdataFeatureNames.add("impactOfNotHaving");  //$NON-NLS-1$
-		cdataFeatureNames.add("reasonsForNotNeeding");  //$NON-NLS-1$
-		cdataFeatureNames.add("briefOutline");  //$NON-NLS-1$
-		cdataFeatureNames.add("representationOptions");  //$NON-NLS-1$
-		cdataFeatureNames.add("usageGuidance");  //$NON-NLS-1$
-		cdataFeatureNames.add("refinedDescription");  //$NON-NLS-1$
-		cdataFeatureNames.add("activityEntryState");  //$NON-NLS-1$
-		cdataFeatureNames.add("activityExitState");  //$NON-NLS-1$
-		cdataFeatureNames.add("externalDescription");  //$NON-NLS-1$
-		cdataFeatureNames.add("packagingGuidance");  //$NON-NLS-1$
-		cdataFeatureNames.add("additionalInfo");  //$NON-NLS-1$
-		cdataFeatureNames.add("problem");  //$NON-NLS-1$
-		cdataFeatureNames.add("background");  //$NON-NLS-1$
-		cdataFeatureNames.add("goals");  //$NON-NLS-1$
-		cdataFeatureNames.add("application");  //$NON-NLS-1$
-		cdataFeatureNames.add("levelsOfAdoption");  //$NON-NLS-1$
-		cdataFeatureNames.add("scale");  //$NON-NLS-1$
-		cdataFeatureNames.add("projectCharacteristics");  //$NON-NLS-1$
-		cdataFeatureNames.add("riskLevel");  //$NON-NLS-1$
-		cdataFeatureNames.add("estimatingTechnique");  //$NON-NLS-1$
-		cdataFeatureNames.add("projectMemberExpertise");  //$NON-NLS-1$
-		cdataFeatureNames.add("typeOfContract");  //$NON-NLS-1$
-	
-	}
-
-	private static boolean isHtmlFeature(EStructuralFeature f) {
-		return cdataFeatureNames.contains(f.getName());
-	}
-
-	public static void formatValue(MethodElement element) throws Exception {
-		List properties = element.getInstanceProperties();
-		if (properties != null) {
-			// get all string type attributes
-
-			HTMLFormatter formater = new HTMLFormatter();
-			
-			if (ResourceHelper.getDefaultResourceMgr() == null) {
-				ResourceHelper.setDefaultResourceMgr(new XMILibraryResourceManager());
-			}
-			
-			boolean seen = false;
-			for (int i = 0; i < properties.size(); i++) {
-				EProperty property = (EProperty) properties.get(i);
-				if (property != null) {
-					EStructuralFeature feature = property
-							.getEStructuralFeature();
-				
-//					EStructuralFeature feature = (EStructuralFeature) properties
-//							.get(i);
-//	
-					Object value = element.eGet(feature);
-					Object newValue = value;
-					if (isHtmlFeature(feature) && value instanceof String) {
-						if (! seen && localDebug) {							
-							System.out.println("LD> element: " + element.eClass().getName());//$NON-NLS-1$
-							seen = true;
-						}
-						
-						try {
-							
-							String str0 = validateGuidAttribute((String) value);							
-							String str1 = ResourceHelper.validateContent(element, str0);
-							
-							newValue = formater.formatHTML((String) str1);
-
-							if (localDebug) {
-								System.out.println("LD> feature: " + feature.getName());//$NON-NLS-1$
-								System.out.println("LD> str0: " + value);				//$NON-NLS-1$
-								if (! str1.equals(str0)) {
-									System.out.println("LD> str1: " + str1);			//$NON-NLS-1$
-								}
-								if (! newValue.equals(str1)) {
-									System.out.println("LD> newValue: " + newValue);			//$NON-NLS-1$
-								}
-							}
-							
-//							newValue = str2;
-							
-						} catch (UnsupportedEncodingException e) {
-							// Not change value if it cannot be formatted
-							// Should also write to log for user attention
-							continue;
-						}
-						element.eSet(feature, newValue);
-					}
-				}
-			}
-		}
-	}
-
-	private static String validateGuidAttribute(String source) {
-		String str = validateGuidAttribute(source,  ResourceHelper.p_link_ref);
-		str = validateGuidAttribute(str, ResourceHelper.p_area_ref);
-		return str;
-	}
-	
-	private static String validateGuidAttribute(String source, Pattern pattern) {
-		StringBuffer sb = new StringBuffer();
-		Matcher m = pattern.matcher(source);
-
-		while (m.find()) {
-			String text = m.group();
-			String replacement = text;			
-			
-			Map attributeMap = ResourceHelper.getAttributesFromLink(pattern, text);
-			
-			if (localDebug) {
-				System.out.println("LD> text:      " + text);					//$NON-NLS-1$
-				System.out.println("LD> attributeMap: " + attributeMap);		//$NON-NLS-1$
-			}
-			
-			String guid = attributeMap == null ? null : (String) attributeMap.get(ResourceHelper.TAG_ATTR_GUID);
-			String href = attributeMap == null ? null : (String) attributeMap.get(ResourceHelper.TAG_ATTR_HREF);
-
-			int ix0 = -1;
-			int ix1 = -1;
-			if (guid == null && href != null) {
-				ix0 = href.lastIndexOf(",");			//$NON-NLS-1$
-				ix1 = href.lastIndexOf(".html");	//$NON-NLS-1$
-			}
-			
-			if (ix0 >= 0 && ix1 > ix0) {
-				
-				guid = href.substring(ix0 + 1, ix1);
-				//To do: validate if guid is valid here, otherwise, no replacement
-				
-				String replaced = href + "\"";  //$NON-NLS-1$
-				String replacing = href + "\" guid=\""+guid + "\"";	//$NON-NLS-1$ //$NON-NLS-2$
-				//replacement = TextReferenceReplacerImpl.replaceAll(text, replaced, replacing);
-				replacement = text.replace(replaced, replacing);
-
-				if (localDebug) {
-					System.out.println("LD>  replaced: " + replaced);	//$NON-NLS-1$
-					System.out.println("LD> replacing: " + replacing);	//$NON-NLS-1$
-					System.out.println("");								//$NON-NLS-1$
-				}
-			}			
-			m.appendReplacement(sb, Matcher.quoteReplacement(replacement));				
-		}
-		m.appendTail(sb);
-		return sb.toString();
-	}
-	
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator102.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator102.java
deleted file mode 100644
index 6a04ef8..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator102.java
+++ /dev/null
@@ -1,698 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi.internal.migration;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.URIConverter;
-import org.eclipse.emf.ecore.util.EContentsEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.EContentsEList.FeatureIterator;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.LinkInfo;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.library.xmi.XMILibraryPlugin;
-import org.eclipse.epf.library.xmi.XMILibraryResources;
-import org.eclipse.epf.persistence.MethodLibraryPersister;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.MultiFileXMISaveImpl;
-import org.eclipse.epf.persistence.migration.MigrationResourceHandler;
-import org.eclipse.epf.persistence.migration.MigratorImpl;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author Phong Nguyen Le - Jun 12, 2006
- * @since 1.0
- */
-public class Migrator102 extends MigratorImpl {
-	private static final boolean DEBUG = XMILibraryPlugin.getDefault()
-			.isDebugging();
-
-	private static void updateStatus(IProgressMonitor monitor, String msg) {
-		if (monitor != null) {
-			monitor.subTask(msg);
-			monitor.worked(1);
-			try {
-				Thread.sleep(10);
-			} catch (InterruptedException e) {
-				//
-			}
-		} else {
-			System.out.println(msg);
-		}
-	}
-
-	private Collection proxiesToRemove = new ArrayList();
-
-	private Map proxyToFileMap = new HashMap();
-
-	private HashMap proxyToFileWithLoadErrorMap = new HashMap();
-
-	private ArrayList notFoundProxies = new ArrayList();
-
-	private ArrayList proxiesWithUnnormalizedURI = new ArrayList();
-
-	private MethodLibrary lib;
-
-	private MigrationResourceHandler resourceHandler = new MigrationResourceHandler() {
-
-		protected boolean handleUnknownFeature(EObject owner,
-				EStructuralFeature feature, Object value) {
-			// Order graph nodes of task descriptors in ADD based on their order
-			// in the task descriptor list of the role descriptor
-			// old feature: RoleDescriptor.performsAsOwner
-			//
-			if(owner instanceof RoleDescriptor
-					&& "performsAsOwner".equals(feature.getName()) //$NON-NLS-1$
-					&& value != null)
-			{
-				ArrayList GUIDs = new ArrayList();
-				StringTokenizer tokens = new StringTokenizer((String) value);
-				while(tokens.hasMoreTokens()) {
-					GUIDs.add(tokens.nextToken());
-				}
-				if(GUIDs.size() > 1) {
-					Activity act = ((RoleDescriptor)owner).getSuperActivities();
-					Diagram add = GraphicalDataManager.getInstance().getUMADiagram(act, GraphicalDataHelper.ACTIVITY_DETAIL_DIAGRAM, false);
-					if(add != null) {
-						Map tdGuidToGraphNodeMap = new HashMap();
-						int size = add.getContained().size();
-						for (int i = 0; i < size; i++) {
-							Object element = add.getContained().get(i);
-							if(element instanceof GraphNode) {
-								GraphNode graphNode = ((GraphNode)element);
-								SemanticModelBridge bridge = graphNode.getSemanticModel();
-								if (bridge instanceof UMASemanticModelBridge) {
-									MethodElement me = ((UMASemanticModelBridge) bridge).getElement();								
-									if(me instanceof TaskDescriptor) {
-										List list = graphNode.getList(UmaPackage.GRAPH_NODE__PROPERTY);
-										Property property = GraphicalDataHelper.getPropertyByKey(list,
-												GraphicalDataHelper.PROP_WORK_PRODUCT_COMPOSITE_TYPE);
-										if (property == null) {
-											// this is not a GraphNode for WorkProductComposite
-											// it must be a GraphNode for a TaskDescriptor
-											//
-											tdGuidToGraphNodeMap.put(me.getGuid(), graphNode);
-										}
-									}
-								}
-							}
-						}
-						
-						// reorder the graph nodes to match order of their linked task descriptors
-						//
-						ArrayList graphNodes = new ArrayList();
-						for(int i = 0; i < GUIDs.size(); i++) {
-							Object graphNode = tdGuidToGraphNodeMap.get(GUIDs.get(i));
-							if(graphNode != null) {
-								graphNodes.add(graphNode);
-							}
-						}
-						add.getContained().removeAll(graphNodes);
-						add.getContained().addAll(graphNodes);
-					}					
-				}
-			}
-			return true;
-		}
-
-	};
-
-	private static final String FILE_PATH = XMILibraryResources.filePath;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.persistence.migration.IMigrator#migrate(java.lang.String,
-	 *      org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void migrate(String libPath, IProgressMonitor monitor)
-		throws Exception {
-		migrate(libPath, monitor, null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.persistence.migration.IMigrator#migrate(java.lang.String, org.eclipse.core.runtime.IProgressMonitor, org.eclipse.epf.persistence.migration.UpgradeCallerInfo)
-	 */
-	public void migrate(String libPath, IProgressMonitor monitor, UpgradeCallerInfo info)
-			throws Exception {
-		initMigrate();
-		
-		File libFile = new File(libPath);
-
-		boolean toVerify = true;
-		if (info != null && info.getIsExportedPluginLib()) {
-			toVerify = false;
-		}
-		
-		ResourceUtil.open(libFile.getParent(), monitor);
-
-		MultiFileResourceSetImpl resourceSet = null;
-		try {
-			// set 1.0.2 default values so data can be correctly loaded
-			//
-			setOldDefaultValues();
-
-			// load the library
-			//
-			updateStatus(monitor, PersistenceResources.loadLibraryTask_name);
-
-			if (toVerify) {
-				resourceSet = new MultiFileResourceSetImpl(false);
-			} else {
-				resourceSet = getImportPluginResourceSet();
-			}
-						
-			resourceSet.getLoadOptions().put(
-					XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
-			resourceSet.getLoadOptions().put(
-					XMLResource.OPTION_RESOURCE_HANDLER, resourceHandler);
-			lib = resourceSet.loadLibrary(libPath);
-			
-			removeProcessContributions(monitor);
-
-			// verify the library
-			//
-			// TODO: uncomment after externalize the text
-			// updateStatus(monitor, "Verifying...");
-
-			if (toVerify) {
-				Display dis = Display.getDefault();
-				if (dis == null || dis.getThread() == Thread.currentThread()) {
-					verify();
-				} else {
-					dis.syncExec(new Runnable() {
-						public void run() {
-							verify();
-						}
-					});
-				}
-				removeUnresolvedReferences(monitor);
-			}
-						
-			if (this instanceof Migrator102_103) {
-				LinkInfo.setLibrary(lib);
-			}
-			// load all elements in memory
-			//
-			updateStatus(monitor, PersistenceResources.loadResourcesTask_name);
-			for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				if (element instanceof MethodElement) {
-					try {
-						for (Iterator iterator = element.eCrossReferences()
-								.iterator(); iterator.hasNext();) {
-							iterator.next();
-						}
-					} catch (Exception e) {
-						CommonPlugin.INSTANCE.log(e);
-						if (DEBUG) {
-							System.err
-									.println("Error iterate thru cross references of element: " + element); //$NON-NLS-1$
-						}
-					}
-					update((MethodElement) element, monitor);
-				}
-			}
-
-			
-			
-			removeOldDefaultValues();
-
-			// check modified resources for writable before saving them
-			//
-			Display dis = Display.getDefault();
-			if (dis == null || dis.getThread() == Thread.currentThread()) {
-				checkModifiedResources();
-			} else {
-				dis.syncExec(new Runnable() {
-					public void run() {
-						checkModifiedResources();
-					}
-				});
-			}
-
-			// save all files
-			//
-			updateStatus(monitor, PersistenceResources.saveLibraryTask_name);
-			Map saveOptions = resourceSet.getDefaultSaveOptions();
-			if (toVerify) {
-				saveOptions.put(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES,
-					Boolean.TRUE);
-			}
-			resourceSet.save(saveOptions, true);
-
-			updateStatus(monitor,
-					PersistenceResources.refreshLibraryFilesTask_name);
-			ResourceUtil.refreshResources(lib, monitor);
-			migrateDiagram(monitor);
-		} finally {
-			if (this instanceof Migrator102_103) {
-				LinkInfo.setLibrary(null);
-			}
-			if (resourceSet != null) {
-				resourceSet.reset();
-				resourceSet = null;
-			}
-		}
-	}
-
-	protected static MultiFileResourceSetImpl getImportPluginResourceSet() {
-		MultiFileResourceSetImpl resourceSet;
-		resourceSet = new MultiFileResourceSetImpl(false) {
-			protected void demandLoad(Resource resource) throws IOException {
-				if (! skipDemandLoad(resource)) {
-					super.demandLoad(resource);
-				}
-			}
-			private boolean skipDemandLoad(Resource res) {
-				File file = new File(res.getURI().toFileString());
-				if (! file.exists() && file.getName().equals(MultiFileSaveUtil.DEFAULT_PLUGIN_MODEL_FILENAME)) {
-					return true;
-				}
-				return false;
-			}
-		};
-		return resourceSet;
-	}
-
-	/**
-	 * Removes process contributions from all plugins
-	 */
-	private void removeProcessContributions(IProgressMonitor monitor) {
-		for (Iterator iter = lib.getMethodPlugins().iterator(); iter.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			MethodPackage pkg = UmaUtil.findMethodPackage(plugin,
-					ModelStructure.DEFAULT.processContributionPath);
-			if (pkg != null) {
-				for (Iterator iterator = new ArrayList(pkg.getChildPackages())
-						.iterator(); iterator.hasNext();) {
-					MethodPackage childPkg = (MethodPackage) iterator.next();
-					Resource resource = ((InternalEObject) childPkg)
-							.eDirectResource();
-					if (resource != null) {
-						ResourceSet resourceSet = resource.getResourceSet();
-						try {
-							MethodLibraryPersister.INSTANCE.delete(pkg);
-						} catch (Exception e) {
-							if (DEBUG) {
-								e.printStackTrace();
-							}
-						}
-						if (resourceSet != null) {
-							resourceSet.getResources().remove(resource);
-						}
-					}
-				}
-				pkg.getChildPackages().clear();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void checkModifiedResources() {
-		do {
-			ResourceSet resourceSet = lib.eResource().getResourceSet();
-			ArrayList readOnlyResources = new ArrayList();
-			String pluginId = XMILibraryPlugin.getDefault().getId();
-			MultiStatus status = new MultiStatus(pluginId, 0,
-					XMILibraryResources.cannotWriteToFiles, null);
-			for (Iterator iter = resourceSet.getResources().iterator(); iter
-					.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				File file = new File(resource.getURI().toFileString());
-				if (file.exists() && !file.canWrite()) {
-					readOnlyResources.add(resource);
-					status.add(new Status(IStatus.ERROR, pluginId, 0, file
-							.toString(), null));
-				}
-			}
-			if (!status.isOK()) {
-				String title = XMILibraryResources.readOnlyFiles_title;
-				String msg = XMILibraryResources.readOnlyFiles_msg;
-				ErrorDialog errDlg = new ErrorDialog(MsgBox.getDefaultShell(),
-						title, msg, status, IStatus.OK | IStatus.INFO
-								| IStatus.WARNING | IStatus.ERROR) {
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.dialogs.ErrorDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-					 */
-					protected void createButtonsForButtonBar(Composite parent) {
-						// create Retry, Cancel and Details buttons
-						createButton(parent, IDialogConstants.OK_ID,
-								IDialogConstants.RETRY_LABEL, true);
-
-						createButton(parent, IDialogConstants.CANCEL_ID,
-								IDialogConstants.CANCEL_LABEL, false);
-
-						createDetailsButton(parent);
-					}
-
-					/*
-					 * (non-Javadoc)
-					 * 
-					 * @see org.eclipse.jface.dialogs.ErrorDialog#open()
-					 */
-					public int open() {
-						showDetailsArea();
-						return super.open();
-					}
-
-				};
-				if (errDlg.open() == IDialogConstants.CANCEL_ID) {
-					throw new OperationCanceledException();
-				}
-			} else {
-				return;
-			}
-		} while (true);
-	}
-
-	/**
-	 * @param monitor
-	 */
-	private void removeUnresolvedReferences(IProgressMonitor monitor) {
-		if (proxiesToRemove.isEmpty())
-			return;
-		// TODO: uncomment after externalize the text
-		// updateStatus(monitor, "Removing unresolved references");
-		HashSet GUIDs = new HashSet();
-		for (Iterator iter = proxiesToRemove.iterator(); iter.hasNext();) {
-			InternalEObject proxy = (InternalEObject) iter.next();
-			GUIDs.add(proxy.eProxyURI().fragment());
-			EcoreUtil.remove(proxy);
-		}
-		for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			for (EContentsEList.FeatureIterator iterator = (FeatureIterator) element
-					.eCrossReferences().iterator(); iterator.hasNext();) {
-				InternalEObject obj = (InternalEObject) iterator.next();
-				if (obj.eIsProxy()
-						&& GUIDs.contains(obj.eProxyURI().fragment())) {
-					EStructuralFeature feature = iterator.feature();
-					if (feature.isChangeable() && !feature.isDerived()) {
-						if (feature.isMany()) {
-							((List) element.eGet(feature)).remove(obj);
-						} else {
-							element.eSet(feature, null);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param lib
-	 */
-	private void verify() {
-		notFoundProxies.clear();
-		proxiesToRemove.clear();
-		proxyToFileMap.clear();
-		proxyToFileWithLoadErrorMap.clear();
-		proxiesWithUnnormalizedURI.clear();
-
-		Collection<EObject> proxies = PersistenceUtil.getProxies(lib);
-		if (!proxies.isEmpty()) {
-			ResourceSet resourceSet = lib.eResource().getResourceSet();
-			URIConverter uriConverter = resourceSet.getURIConverter();
-			for (Iterator iter = proxies.iterator(); iter.hasNext();) {
-				InternalEObject proxy = (InternalEObject) iter.next();
-				URI uri = proxy.eProxyURI();
-				URI normalizedURI = uriConverter.normalize(uri);
-				if (normalizedURI == null) {
-					proxiesWithUnnormalizedURI.add(proxy);
-				} else {
-					File file = new File(normalizedURI.toFileString());
-					if (!file.exists()) {
-						proxyToFileMap.put(proxy, file);
-					} else {
-						try {
-							Resource resource = resourceSet.getResource(
-									normalizedURI.trimFragment(), true);
-							if (resource.getEObject(normalizedURI.fragment()) == null) {
-								notFoundProxies.add(proxy);
-							}
-						} catch (Exception e) {
-							String errMsg = e.getMessage() != null ? e
-									.getMessage() : e.toString();
-							proxyToFileWithLoadErrorMap.put(proxy,
-									new Object[] { file, errMsg });
-						}
-					}
-				}
-			}
-		}
-
-		if (!proxyToFileMap.isEmpty()) {
-			// promp user to resolve missing files
-			//
-			List list = new ArrayList(proxyToFileMap.keySet());
-			final String ELEMENT_PATH = XMILibraryResources.elementPath;
-			ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-					TngAdapterFactory.INSTANCE
-							.getNavigatorView_ComposedAdapterFactory()) {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getText(java.lang.Object)
-				 */
-				public String getText(Object object) {
-					File file = (File) proxyToFileMap.get(object);
-					return file.getAbsolutePath()
-							+ " (" + TngUtil.getLabelWithPath(object) + ')'; //$NON-NLS-1$
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getColumnText(java.lang.Object,
-				 *      int)
-				 */
-				public String getColumnText(Object object, int columnIndex) {
-					switch (columnIndex) {
-					case 0:
-						return proxyToFileMap.get(object).toString();
-					case 1:
-						return TngUtil.getLabelWithPath(object);
-					}
-					return null;
-				}
-
-			};
-
-			try {
-				String msg = XMILibraryResources.promptRemoveReferencesToMissingFiles_msg;
-				SelectionDialog dlg = new SelectionDialog(MsgBox
-						.getDefaultShell(), list, labelProvider, msg);
-
-				dlg.setTitle(XMILibraryResources.missingFiles_title);
-				dlg.setBlockOnOpen(true);
-				dlg.setInitialElementSelections(list);
-				dlg
-						.setColumnProperties(new String[] { FILE_PATH,
-								ELEMENT_PATH });
-				if (dlg.open() == Dialog.CANCEL) {
-					throw new OperationCanceledException();
-				}
-				Object objs[] = dlg.getResult();
-				if (objs == null) {
-					throw new OperationCanceledException();
-				} else {
-					for (Iterator iter = list.iterator(); iter.hasNext();) {
-						proxiesToRemove.add(iter.next());
-
-					}
-				}
-			} finally {
-				labelProvider.dispose();
-			}
-		}
-
-		// prompt user to resolve files that can not be loaded
-		//
-		if (!proxyToFileWithLoadErrorMap.isEmpty()) {
-			List list = new ArrayList(proxyToFileWithLoadErrorMap.keySet());
-			final String LOAD_ERROR = XMILibraryResources.loadError;
-			ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-					TngAdapterFactory.INSTANCE
-							.getNavigatorView_ComposedAdapterFactory()) {
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getColumnText(java.lang.Object,
-				 *      int)
-				 */
-				public String getColumnText(Object object, int columnIndex) {
-					Object[] arr = (Object[]) proxyToFileMap.get(object);
-					if (columnIndex < 2) {
-						return arr[columnIndex].toString();
-					}
-					return null;
-				}
-
-			};
-
-			try {
-				String msg = XMILibraryResources.promptRemoveReferencesToFilesWithLoadErrors_msg;
-				SelectionDialog dlg = new SelectionDialog(MsgBox
-						.getDefaultShell(), list, labelProvider, msg);
-
-				dlg.setTitle(XMILibraryResources.filesWithLoadErrors_title);
-				dlg.setBlockOnOpen(true);
-				dlg.setInitialElementSelections(list);
-				dlg.setColumnProperties(new String[] { FILE_PATH, LOAD_ERROR });
-				if (dlg.open() == Dialog.CANCEL) {
-					throw new OperationCanceledException();
-				}
-				Object objs[] = dlg.getResult();
-				if (objs == null) {
-					throw new OperationCanceledException();
-				} else {
-					for (Iterator iter = list.iterator(); iter.hasNext();) {
-						proxiesToRemove.add(iter.next());
-
-					}
-				}
-			} finally {
-				labelProvider.dispose();
-			}
-		}
-
-		ArrayList proxiesToRetain = new ArrayList();
-		proxies.addAll(proxyToFileMap.keySet());
-		proxies.addAll(proxyToFileWithLoadErrorMap.keySet());
-		proxies.removeAll(proxiesToRemove);
-
-		if (proxiesToRetain.isEmpty()) {
-			proxiesToRemove.addAll(notFoundProxies);
-			proxiesToRemove.addAll(proxiesWithUnnormalizedURI);
-		}
-
-		String msg = "Summary of unresolved proxies:"; //$NON-NLS-1$
-		msg += "\n  Not found proxies: " + notFoundProxies; //$NON-NLS-1$
-		msg += "\n  Proxies with unnormalized URI: " + proxiesWithUnnormalizedURI; //$NON-NLS-1$
-		XMILibraryPlugin.getDefault().getLogger().logInfo(msg);
-	}
-
-	/**
-	 * 
-	 */
-	private void removeOldDefaultValues() {
-		MultiResourceEObject.removeDefaultValue(UmaPackage.eINSTANCE
-				.getMethodPlugin_UserChangeable());
-	}
-
-	/**
-	 * @param e
-	 * 
-	 */
-	private void adjustToNewDefaultValues(MethodElement e) {
-		if (e instanceof MethodPlugin) {
-			((MultiResourceEObject) e)
-					.removeFeatureWithOverridenDefaultValue(UmaPackage.eINSTANCE
-							.getMethodPlugin_UserChangeable());
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void setOldDefaultValues() {
-		MultiResourceEObject.setDefaultValue(UmaPackage.eINSTANCE
-				.getMethodPlugin_UserChangeable(), Boolean.FALSE);
-	}
-
-	protected void update(MethodElement e, IProgressMonitor monitor)
-			throws Exception {
-		adjustToNewDefaultValues(e);
-
-		if (e instanceof Activity) {
-			Activity act = (Activity) e;
-			VariabilityType type = act.getVariabilityType();
-			if (type == VariabilityType.CONTRIBUTES_LITERAL) {
-				act
-						.setVariabilityType(VariabilityType.LOCAL_CONTRIBUTION_LITERAL);
-			} else if (type == VariabilityType.REPLACES_LITERAL) {
-				act
-						.setVariabilityType(VariabilityType.LOCAL_REPLACEMENT_LITERAL);
-			}
-		}
-		if (! (this instanceof Migrator102_103)) {
-			MigrationUtil.formatValue(e);
-		}
-	}
-	
-	protected void initMigrate() {		
-	}
-	
-	protected void migrateDiagram(IProgressMonitor monitor) throws Exception {	
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator102_103.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator102_103.java
deleted file mode 100644
index c4f796a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator102_103.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi.internal.migration;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-
-/**
- * @author Weiping Lu - Mar 20, 2007
- * @since 1.2
- */
-public class Migrator102_103 extends Migrator102 {
-
-	private Map<String, Process> diagramElemMap; 
-	
-	protected void initMigrate() {
-		diagramElemMap = new LinkedHashMap<String, Process>();
-	}
-	
-	protected void update(MethodElement e, IProgressMonitor monitor) throws Exception {
-		super.update(e, monitor);
-		Migrator103.updateElement(e, diagramElemMap, monitor);
-	}
-
-	protected void migrateDiagram(IProgressMonitor monitor) throws Exception {
-		Migrator103.diagramMigrate(diagramElemMap, monitor);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator103.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator103.java
deleted file mode 100644
index 32f0552..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/Migrator103.java
+++ /dev/null
@@ -1,272 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi.internal.migration;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Stack;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.LinkInfo;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.library.xmi.IDiagramMigration;
-import org.eclipse.epf.library.xmi.XMILibraryPlugin;
-import org.eclipse.epf.library.xmi.XMILibraryResources;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.persistence.util.PersistenceResources;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * @author Weiping Lu - Feb 12, 2007
- * @since 1.2
- */
-public class Migrator103 extends MigratorBase {
-	
-	private Map<String, Process> diagramElemMap;
-	private static boolean xmlMigrate = false;
-	
-	public void migrate(String libPath, IProgressMonitor monitor) throws Exception {
-		migrate(libPath, monitor, null);
-	}
-	
-	public void migrate(String libPath, IProgressMonitor monitor, UpgradeCallerInfo info) throws Exception {
-		File libFile = new File(libPath);
-		
-		boolean toVerify = true;
-		if (info != null && info.getIsExportedPluginLib()) {
-			toVerify = false;
-		}
-		xmlMigrate = false;
-		ResourceUtil.open(libFile.getParent(), monitor);
-
-		MultiFileResourceSetImpl resourceSet = null;
-		
-		diagramElemMap = new LinkedHashMap<String, Process>();
-		try {
-			// load the library
-			//
-			updateStatus(monitor, PersistenceResources.loadLibraryTask_name);
-
-			if (toVerify) {
-				resourceSet = new MultiFileResourceSetImpl(false);
-			} else {
-				resourceSet = Migrator102.getImportPluginResourceSet();
-			}
-						
-			resourceSet.getLoadOptions().put(
-					XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
-
-			MethodLibrary lib = resourceSet.loadLibrary(libPath);
-						
-			LinkInfo.setLibrary(lib);
-			// load all elements in memory
-			//
-			updateStatus(monitor, PersistenceResources.loadResourcesTask_name);
-			
-			updateAllContents(monitor, lib);					
-			
-			// save all files
-			//
-			updateStatus(monitor, PersistenceResources.saveLibraryTask_name);
-			Map saveOptions = resourceSet.getDefaultSaveOptions();
-			resourceSet.save(saveOptions, true);
-
-			updateStatus(monitor,
-					PersistenceResources.refreshLibraryFilesTask_name);
-			
-			
-			ResourceUtil.refreshResources(lib, monitor);
-			
-			diagramMigrate(diagramElemMap, monitor);	
-			
-			ResourceUtil.refreshResources(lib, monitor);
-			
-		} finally {
-			LinkInfo.setLibrary(null);
-			
-			if (resourceSet != null) {
-				resourceSet.reset();
-				resourceSet = null;
-			}
-		}
-
-	}
-
-	protected static void diagramMigrate(Map<String, Process> diagramElemMap, IProgressMonitor monitor) {
-		// Convert diagrams 
-		updateStatus(monitor, PersistenceResources.migratingDiagram_name);
-		
-		IDiagramMigration idm = (IDiagramMigration) ExtensionManager.getExtension("org.eclipse.epf.library.xmi", "diagramMigration"); 			//$NON-NLS-1$ //$NON-NLS-2$
-		if (idm != null && !diagramElemMap.isEmpty()) {
-			try {
-				idm.migrate(diagramElemMap.values());
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	protected void updateElement(MethodElement element, IProgressMonitor monitor) throws Exception {
-		updateElement(element, diagramElemMap, monitor);
-	}
-
-	protected static void updateElement(MethodElement element, Map<String, Process> diagramElemMap, IProgressMonitor monitor) throws Exception {
-		if (diagramElemMap != null) {
-			if (element instanceof CapabilityPattern ||
-				element instanceof DeliveryProcess) {
-				Process process = (Process) element;
-				if (process.eContainer() instanceof ProcessComponent) {
-					String guid = element.getGuid();
-					Process proc = diagramElemMap.get(guid);
-					if (proc == null) {
-						diagramElemMap.put(element.getGuid(), (Process) element);
-					} else {
-						assert(proc == element);
-					}
-				}
-			}
-		}
-		MigrationUtil.formatValue(element);
-		handleTypeConvert(element);
-		if (! xmlMigrate) {
-			handleShapeAndNodeIcons(element);
-		}
-	}
-	
-	private static void handleTypeConvert(MethodElement element) throws Exception {
-		if (	element instanceof Example 			||
-				element instanceof ReusableAsset 	||
-				element instanceof Whitepaper) {			
-			Guidance guidance = (Guidance) element;
-			ContentDescription pres = convert(guidance.getPresentation());
-			if (pres != null) {
-				guidance.setPresentation(pres);
-			}			
-		}
-	}
-	
-	private static GuidanceDescription convert(ContentDescription oldObj) {
-		if (oldObj == null) {
-			return null;
-		}
-		GuidanceDescription newObj = UmaFactory.eINSTANCE.createGuidanceDescription();		
-		Resource res = oldObj.eResource();
-		if (res != null) {
-			res.getContents().remove(oldObj);
-			res.getContents().add(newObj);
-		}
-		List features = LibraryUtil.getStructuralFeatures(oldObj);
-//		List properties = oldObj.getInstanceProperties();		
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features.get(i);
-				Object value = oldObj.eGet(feature);
-				newObj.eSet(feature, value);
-			}
-		}
-				
-		return newObj;
-	}
-	
-	private static void handleShapeAndNodeIcons(MethodElement element) throws Exception {
-		if (element instanceof DescribableElement) {			
-			DescribableElement describableElement = (DescribableElement) element;
-			URI fixedURI = fixIconURI(describableElement, describableElement.getShapeicon());
-			if (fixedURI != null) {
-				describableElement.setShapeicon(fixedURI);
-			}
-			fixedURI = fixIconURI(describableElement, describableElement.getNodeicon());
-			if (fixedURI != null) {
-				describableElement.setNodeicon(fixedURI);
-			}
-		}
-	}
-
-	private static URI fixIconURI(DescribableElement e, URI uri) {
-		if (uri == null) return null;
-		
-		File path = new File(NetUtil.decodedFileUrl(uri.toString()));
-		Stack<String> stack = new Stack<String>();
-		File temp = path;
-		String resultPath = ""; //$NON-NLS-1$
-		while (temp != null) {
-			stack.push(temp.getName());
-			temp = temp.getParentFile();
-		}
-		if (!stack.isEmpty()) {
-			// now skip first stack entry and reconstruct path
-			String pluginName = stack.pop();
-			while (!stack.isEmpty()) {
-				if (resultPath.length() > 0) {
-					resultPath += '/';
-				}
-				resultPath = resultPath + (String)stack.pop();
-			}
-
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-			try {
-				URI resultURI = new URI(resultPath);
-				if (!pluginName.equals(plugin.getName())) {
-					// uri was refering a file in another plugin
-					File libRoot = TngUtil.getLibraryRootPath(e);
-					File oldFile = new File(libRoot, NetUtil.decodedFileUrl(uri.toString()));
-					File newFile = new File(libRoot, plugin.getName() + File.separator + NetUtil.decodedFileUrl(resultURI.toString()));
-					if (!newFile.exists()) {
-	      					FileUtil.copyFile(oldFile, newFile);
-					}
-				}
-				return resultURI;
-			} catch (URISyntaxException ex) {
-				XMILibraryPlugin.getDefault().getLogger().logError(ex);
-				return null;
-			}
-		}
-		return null;
-	}
-	
-	
-	public void migrateXmlImportedLib(MethodLibrary lib, IProgressMonitor monitor) throws Exception {
-		xmlMigrate = true;
-		updateStatus(monitor, XMILibraryResources.migrateXMLLibrary_taskName);
-		updateAllContents(monitor, lib);
-		LibraryUtil.saveLibrary(lib, false, false);
-		xmlMigrate = false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/MigratorBase.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/MigratorBase.java
deleted file mode 100644
index f2a16c1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/MigratorBase.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi.internal.migration;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.xmi.XMILibraryPlugin;
-import org.eclipse.epf.persistence.migration.MigratorImpl;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Base class implementation for migrators
- * 
- * @author Weiping Lu - Feb 12, 2007
- * @since 1.2
- */
-public abstract class MigratorBase extends MigratorImpl {
-	protected static final boolean DEBUG = XMILibraryPlugin.getDefault()
-			.isDebugging();
-	
-	protected static void updateStatus(IProgressMonitor monitor, String msg) {
-		if (monitor != null) {
-			monitor.subTask(msg);
-			monitor.worked(1);
-			try {
-				Thread.sleep(10);
-			} catch (InterruptedException e) {
-				//
-			}
-		} else {
-			System.out.println(msg);
-		}
-	}
-	
-	protected void updateAllContents(IProgressMonitor monitor, MethodLibrary lib) throws Exception {
-		for (Iterator iter = lib.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			if (element instanceof MethodElement) {
-				try {
-					for (Iterator iterator = element.eCrossReferences()
-							.iterator(); iterator.hasNext();) {
-						iterator.next();
-					}
-				} catch (Exception e) {
-					CommonPlugin.INSTANCE.log(e);
-					if (DEBUG) {
-						System.err
-								.println("Error iterate thru cross references of element: " + element); //$NON-NLS-1$
-					}
-				}
-				updateElement((MethodElement) element, monitor);
-			}
-		}
-	}
-	
-	protected abstract void updateElement(MethodElement element, IProgressMonitor monitor) throws Exception;	
-	
-	public abstract void migrate(String libPath, IProgressMonitor monitor) throws Exception;
-	
-	public abstract void migrate(String libPath, IProgressMonitor monitor, UpgradeCallerInfo info) throws Exception;
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/SelectionDialog.java b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/SelectionDialog.java
deleted file mode 100644
index 7db78bc..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/SelectionDialog.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.xmi.internal.migration;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-
-/**
- * Displays a dialog that lists missing files in a method library to be upgraded.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class SelectionDialog extends ListSelectionDialog {
-
-	private String[] columnProperties;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectionDialog(Shell parentShell, Object input,
-			IStructuredContentProvider contentProvider,
-			ILabelProvider labelProvider, String message) {
-		super(parentShell, input, contentProvider, labelProvider, message);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectionDialog(Shell parentShell, List input,
-			ILabelProvider labelProvider, String message) {
-		super(parentShell, input, new IStructuredContentProvider() {
-			public Object[] getElements(Object object) {
-				return ((List) object).toArray();
-			}
-
-			public void dispose() {
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			}
-		}, labelProvider, message);
-	}
-
-	public void setColumnProperties(String[] columnProperties) {
-		this.columnProperties = columnProperties;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.ListSelectionDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Control ctrl = super.createDialogArea(parent);
-
-		// create table columns
-		//
-		Table table = getViewer().getTable();
-		table.setHeaderVisible(true);
-		for (int i = 0; i < columnProperties.length; i++) {
-			TableColumn col = new TableColumn(table, SWT.LEFT);
-			col.setText(columnProperties[i]);
-			col.setResizable(true);
-			col.setWidth(200);
-		}
-		getViewer().setColumnProperties(columnProperties);
-		getViewer().refresh();
-
-		return ctrl;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/package.html b/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/package.html
deleted file mode 100644
index c87c3df..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui.xmi/src/org/eclipse/epf/library/ui/xmi/internal/migration/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides migration support for upgrading a XMI-based method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/.classpath b/1.5/plugins/org.eclipse.epf.library.ui/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/.options b/1.5/plugins/org.eclipse.epf.library.ui/.options
deleted file mode 100644
index de1dee4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Library plug-in
-org.eclipse.epf.library.ui/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/.project b/1.5/plugins/org.eclipse.epf.library.ui/.project
deleted file mode 100644
index 5cde1e9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.library.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.library.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 7f2c1ed..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,29 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.library.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.library.ui.LibraryUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.library;visibility:=reexport,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.epf.library.xmi,
- org.eclipse.epf.ui;visibility:=reexport,
- org.eclipse.jface.text;visibility:=reexport,
- org.eclipse.ui;visibility:=reexport,
- org.eclipse.ui.ide;visibility:=reexport,
- org.eclipse.epf.common.ui,
- org.eclipse.emf.edit.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.library.ui,
- org.eclipse.epf.library.ui.actions,
- org.eclipse.epf.library.ui.dialogs,
- org.eclipse.epf.library.ui.preferences,
- org.eclipse.epf.library.ui.providers,
- org.eclipse.epf.library.ui.util,
- org.eclipse.epf.library.ui.views,
- org.eclipse.epf.library.ui.wizards
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/build.properties b/1.5/plugins/org.eclipse.epf.library.ui/build.properties
deleted file mode 100644
index 0731edb..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               .options
-                 
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/icons/OpenLibrary.gif b/1.5/plugins/org.eclipse.epf.library.ui/icons/OpenLibrary.gif
deleted file mode 100644
index e249831..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/icons/OpenLibrary.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/icons/full/obj16/MethodLibrary.gif b/1.5/plugins/org.eclipse.epf.library.ui/icons/full/obj16/MethodLibrary.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/icons/full/obj16/MethodLibrary.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/icons/full/wizban/ExportProcess.gif b/1.5/plugins/org.eclipse.epf.library.ui/icons/full/wizban/ExportProcess.gif
deleted file mode 100644
index e249831..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/icons/full/wizban/ExportProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/icons/full/wizban/Open.gif b/1.5/plugins/org.eclipse.epf.library.ui/icons/full/wizban/Open.gif
deleted file mode 100644
index e249831..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/icons/full/wizban/Open.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.library.ui/plugin.properties
deleted file mode 100644
index dced9e6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/plugin.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Library UI
-providerName=Eclipse.org
-
-# Open Method Library Action 
-actionSetLabel=Method Authoring
-fileOpenMenuLabel=O&pen
-openLibraryActionlabel=Method Library
-openLibraryActionTooltip=Open a method library
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.library.ui/plugin.xml
deleted file mode 100644
index de8618c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/plugin.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>           
-
-   <extension-point
-         id="newLibraryWizardPages"
-         name="EPF New Method Library Wizard Pages"
-         schema="schema/NewLibraryWizardPages.exsd"/>
-
-   <extension-point
-         id="openLibraryWizardPages"
-         name="EPF Open Method Library Wizard Pages"
-         schema="schema/OpenLibraryWizardPages.exsd"/>
-
-   <extension-point
-         id="openLibraryWizard"
-         name="Open Method Library Wizard Extension"
-         schema="schema/OpenLibraryWizard.exsd" />
-         
-   <extension point="org.eclipse.ui.actionSets">
-      <actionSet
-            id="org.eclipse.epf.library.ui.actionSet"
-            label="%actionSetLabel"
-            visible="true">
-         <menu
-               id="org.eclipse.epf.library.ui.menu.fileOpenMenu"
-               label="%fileOpenMenuLabel"
-               path="file/new.ext">
-            <separator name="groupm1"/>
-            <separator name="groupm2"/>
-         </menu>
-         <action
-               class="org.eclipse.epf.library.ui.actions.OpenLibraryAction"
-               helpContextId="file_open_library_context"
-               icon="icons/full/obj16/MethodLibrary.gif"
-               id="org.eclipse.epf.library.ui.actions.OpenLibraryAction"
-               label="%openLibraryActionlabel"
-               menubarPath="file/org.eclipse.epf.library.ui.menu.fileOpenMenu/groupm1"
-               tooltip="%openLibraryActionTooltip"/>
-      </actionSet>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/schema/NewLibraryWizardPages.exsd b/1.5/plugins/org.eclipse.epf.library.ui/schema/NewLibraryWizardPages.exsd
deleted file mode 100644
index e39c46f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/schema/NewLibraryWizardPages.exsd
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.ui" id="newLibraryWizardPages" name="EPF New Method Library Wizard Pages"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to contribute a method library type specific wizard page to the New Method Library wizard.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="newLibraryWizardPage" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="newLibraryWizardPage">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements a wizard page. This class must extends &lt;code&gt;org.eclipse.epf.library.ui.wizards.AddLibraryWizardPage&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The identifier of a specific method library type (database, xmi, etc.).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="title" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The title for the wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The description for the wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a Library Manager extension point: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.library.ui.newLibraryWizardPages&quot;&gt;
-      &lt;addLibraryWizardPage
-         class=&quot;org.eclipse.epf.library.ui.xmi.NewXMILibraryWizardPage&quot;
-         type=&quot;xmi&quot;
-         title=&quot;Creates a XMI method library.&quot;
-         description=&quot;Specify the location for the XMI method library.&quot;&gt;
-      &lt;/addLibraryWizardPage&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/schema/OpenLibraryWizard.exsd b/1.5/plugins/org.eclipse.epf.library.ui/schema/OpenLibraryWizard.exsd
deleted file mode 100644
index 8c781ac..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/schema/OpenLibraryWizard.exsd
+++ /dev/null
@@ -1,155 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.export.msp.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.export.msp.ui" id="exportMSPWizard" name="Export Microsoft Project Wizard Extension"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to extend the Open Method Library wizard by replacing existing wizard pages or adding new ones.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizardExtender" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardExtender">
-      <complexType>
-         <sequence>
-            <element ref="wizardPage" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard extender. This class must implements &lt;code&gt;org.eclipse.epf.publishing.ui.wizards.IPublishConfigWizardExtender&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardPage">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard page. This class must implements &lt;code&gt;org.eclipse.jface.wizard.IWizardPage&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The type of extension - &quot;replace&quot; or &quot;new&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="target" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the base wizard page to be replaced or used as a reference for inserting a new wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="insert" type="string">
-            <annotation>
-               <documentation>
-                  The insertion type for a new wizard page - &quot;before&quot; or &quot;after&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of how the extension point can be used: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.library.ui.openLibraryWizard&quot;&gt;
-      &lt;wizard
-            class=&quot;org.eclipse.epf.library.ui.wizards.MyOpenLibraryWizard&quot;&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.library.ui.wizards.MyOpenLibraryMainPage&quot;
-               type=&quot;replace&quot;
-               target=&quot;org.eclipse.epf.library.ui.wizards.OpenLibraryMainPage&quot;/&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.library.ui.wizards.MyOpenLibraryOptionPage&quot;
-               type=&quot;new&quot;
-               target=&quot;org.eclipse.epf.library.ui.wizards.OpenLibraryMainPage&quot;
-               insert=&quot;after&quot;/&gt;                     
-      &lt;/wizard&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2007 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/schema/OpenLibraryWizardPages.exsd b/1.5/plugins/org.eclipse.epf.library.ui/schema/OpenLibraryWizardPages.exsd
deleted file mode 100644
index 4c0e416..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/schema/OpenLibraryWizardPages.exsd
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.ui" id="openLibraryWizardPages" name="EPF Open Method Library Wizard Pages"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to contribute a method library type specific wizard page to the Open Method Library wizard.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="openLibraryWizardPage" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="openLibraryWizardPage">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements a wizard page. This class must extends &lt;code&gt;org.eclipse.epf.library.ui.wizards.AddLibraryWizardPage&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The identifier of a specific method library type (database, xmi, etc.).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="title" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The title for the wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The description for the wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a Library Manager extension point: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.librray.ui.openLibraryWizardPages&quot;&gt;
-      &lt;openLibraryWizardPage
-         class=&quot;org.eclipse.epf.library.ui.xmi.OpenXMILibraryWizardPage&quot;
-         type=&quot;xmi&quot;
-         title=&quot;Opens a XMI method library.&quot;
-         description=&quot;Specify the location for the XMI method library.&quot;&gt;
-      &lt;/openLibraryWizardPage&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/IMethodElementProvider.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/IMethodElementProvider.java
deleted file mode 100644
index 28b8416..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/IMethodElementProvider.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui;
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * The interface for a method element provider.
- * 
- * @author Phong Nguyen Le
- * 
- * @since 1.2
- */
-public interface IMethodElementProvider {
-
-	/**
-	 * Gets the method element associated with this provider.
-	 * 
-	 * @return a method element
-	 */
-	public MethodElement getMethodElement();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIImages.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIImages.java
deleted file mode 100644
index a5a11ca..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIImages.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui;
-
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Provides access to cached copy of commonly referenced images in the library UI.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryUIImages {
-
-	/**
-	 * The images associated with the Method Library elements.
-	 * <p>
-	 * These images are cached and should not be disposed by the user!
-	 */
-	public static final Image IMG_ACTIVITY = getElementImage("full/obj16/Activity"); //$NON-NLS-1$
-
-	public static final Image IMG_ARTIFACT = getElementImage("full/obj16/Artifact"); //$NON-NLS-1$
-
-	public static final Image IMG_CAPABILITY_PATTERN = getElementImage("full/obj16/CapabilityPattern"); //$NON-NLS-1$
-
-	public static final Image IMG_CHECKLIST = getElementImage("full/obj16/Checklist"); //$NON-NLS-1$
-
-	public static final Image IMG_COMPOSITE_ROLE = getElementImage("full/obj16/CompositeRole"); //$NON-NLS-1$
-
-	public static final Image IMG_CONCEPT = getElementImage("full/obj16/Concept"); //$NON-NLS-1$
-
-	public static final Image IMG_CONTENT_PACKAGE = getElementImage("full/obj16/ContentPackage"); //$NON-NLS-1$
-
-	public static final Image IMG_CUSTOM_CATEGORY = getElementImage("full/obj16/CustomCategory"); //$NON-NLS-1$
-
-	public static final Image IMG_DELIVERABLE = getElementImage("full/obj16/Deliverable"); //$NON-NLS-1$
-
-	public static final Image IMG_DELIVERY_PROCESS = getElementImage("full/obj16/DeliveryProcess"); //$NON-NLS-1$
-
-	public static final Image IMG_DISCIPLINE = getElementImage("full/obj16/Discipline"); //$NON-NLS-1$
-
-	public static final Image IMG_DISCIPLINE_GROUPING = getElementImage("full/obj16/DisciplineGrouping"); //$NON-NLS-1$
-
-	public static final Image IMG_DOMAIN = getElementImage("full/obj16/Domain"); //$NON-NLS-1$
-
-	public static final Image IMG_ESTIMATE = getElementImage("full/obj16/Estimate"); //$NON-NLS-1$
-
-	public static final Image IMG_ESTIMATING_METRIC = getElementImage("full/obj16/EstimatingMetric"); //$NON-NLS-1$
-
-	public static final Image IMG_ESTIMATION_CONSIDERATIONS = getElementImage("full/obj16/EstimationConsiderations"); //$NON-NLS-1$
-
-	public static final Image IMG_EXAMPLE = getElementImage("full/obj16/Example"); //$NON-NLS-1$
-
-	public static final Image IMG_GUIDELINE = getElementImage("full/obj16/Guideline"); //$NON-NLS-1$
-
-	public static final Image IMG_ITERATION = getElementImage("full/obj16/Iteration"); //$NON-NLS-1$	
-
-	public static final Image IMG_METHOD_CONFIGURATON = getElementImage("full/obj16/MethodConfiguration"); //$NON-NLS-1$
-
-	public static final Image IMG_METHOD_LIBARARY = getElementImage("full/obj16/MethodLibrary"); //$NON-NLS-1$
-
-	public static final Image IMG_METHOD_PACKAGE = getElementImage("full/obj16/MethodPackage"); //$NON-NLS-1$
-
-	public static final Image IMG_METHOD_PLUGIN = getElementImage("full/obj16/MethodPlugin"); //$NON-NLS-1$
-
-	public static final Image IMG_MILESTONE = getElementImage("full/obj16/Milestone"); //$NON-NLS-1$
-
-	public static final Image IMG_OUTCOME = getElementImage("full/obj16/Outcome"); //$NON-NLS-1$
-
-	public static final Image IMG_PHASE = getElementImage("full/obj16/Phase"); //$NON-NLS-1$	
-
-	public static final Image IMG_PRACTICE = getElementImage("full/obj16/Practice"); //$NON-NLS-1$
-
-	public static final Image IMG_PROCESS = getElementImage("full/obj16/Process"); //$NON-NLS-1$	
-
-	public static final Image IMG_PROCESS_CONTRIBUTION = getElementImage("full/obj16/ProcessContribution"); //$NON-NLS-1$
-
-	public static final Image IMG_PROCESS_FAMILY = getElementImage("full/obj16/ProcessFamily"); //$NON-NLS-1$
-
-	public static final Image IMG_PROCESS_PACKAGE = getElementImage("full/obj16/ProcessPackage"); //$NON-NLS-1$
-
-	public static final Image IMG_REPORT = getElementImage("full/obj16/Report"); //$NON-NLS-1$
-
-	public static final Image IMG_ROADMAP = getElementImage("full/obj16/Roadmap"); //$NON-NLS-1$
-
-	public static final Image IMG_ROLE_DESCRIPTOR = getElementImage("full/obj16/RoleDescriptor"); //$NON-NLS-1$
-
-	public static final Image IMG_ROLE = getElementImage("full/obj16/Role"); //$NON-NLS-1$
-
-	public static final Image IMG_ROLE_SET = getElementImage("full/obj16/RoleSet"); //$NON-NLS-1$
-
-	public static final Image IMG_ROLE_SET_GROUPING = getElementImage("full/obj16/RoleSetGrouping"); //$NON-NLS-1$
-
-	public static final Image IMG_SUPPORTING_MATERIAL = getElementImage("full/obj16/SupportingMaterial"); //$NON-NLS-1$
-
-	public static final Image IMG_TASK = getElementImage("full/obj16/Task"); //$NON-NLS-1$
-
-	public static final Image IMG_TASK_DESCRIPTOR = getElementImage("full/obj16/TaskDescriptor"); //$NON-NLS-1$
-
-	public static final Image IMG_TEAM_PROFILE = getElementImage("full/obj16/TeamProfile"); //$NON-NLS-1$
-
-	public static final Image IMG_TEMPLATE = getElementImage("full/obj16/Template"); //$NON-NLS-1$
-
-	public static final Image IMG_TERM_DEFINITION = getElementImage("full/obj16/TermDefinition"); //$NON-NLS-1$
-
-	public static final Image IMG_TOOL = getElementImage("full/obj16/Tool"); //$NON-NLS-1$
-
-	public static final Image IMG_TOOL_MENTOR = getElementImage("full/obj16/ToolMentor"); //$NON-NLS-1$
-
-	public static final Image IMG_WHITEPAPER = getElementImage("full/obj16/Whitepaper"); //$NON-NLS-1$
-
-	public static final Image IMG_WORK_PRODUCT = getElementImage("full/obj16/WorkProduct"); //$NON-NLS-1$
-
-	public static final Image IMG_WORK_PRODUCT_TYPE = getElementImage("full/obj16/WorkProductType"); //$NON-NLS-1$
-
-	/**
-	 * Returns the image given the relative path.
-	 * 
-	 * @param path
-	 *            a path relative to "icons" folder in the the UMA Edit plug-in
-	 * @return an <code>Image</code> object
-	 */
-	protected static Image getElementImage(String path) {
-		return ExtendedImageRegistry.getInstance().getImage(
-				UmaEditPlugin.INSTANCE.getImage(path));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIManager.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIManager.java
deleted file mode 100644
index bf85ff5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIManager.java
+++ /dev/null
@@ -1,923 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.I18nUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.library.prefs.PreferenceUtil;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.ui.actions.ConfigurationContributionItem;
-import org.eclipse.epf.library.ui.dialogs.CopyLibraryDialog;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.ui.wizards.LibraryBackupUtil;
-import org.eclipse.epf.library.xmi.XMILibraryManager;
-import org.eclipse.epf.library.xmi.XMILibraryUtil;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.migration.MappingUtil;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.util.MessageException;
-import org.eclipse.jface.action.CoolBarManager;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.ToolBarContributionItem;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * The default Library UI Manager implementation.
- * <p>
- * A Library Manager provides the user interface for creating and opening a
- * method library.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryUIManager {
-
-	public static boolean DEBUG = LibraryUIPlugin.getDefault().isDebugging();
-
-	private static final String TOOLBAR_CONFIG_CONTRIBUTION_ID = "toolbar.config.contribution"; //$NON-NLS-1$
-
-	private static final String CONFIG_VIEW_ID = "org.eclipse.epf.authoring.ui.views.ConfigurationView"; //$NON-NLS-1$
-
-	private static final String PROCESS_EDITOR_ID = "org.eclipse.epf.authoring.ui.editors.ProcessEditor"; //$NON-NLS-1$
-
-	private static LibraryUIManager instance = null;
-	
-	// The URI of the method library that will be opened regardless of the
-	// saved library preferences.
-	protected static URI libraryURI;
-
-	// The URI of the method library that will be opened only if there are
-	// no saved library preferences.
-	protected static URI defaultLibraryURI;
-	protected static URI defaultLibraryURI_NL;
-	private boolean libraryInitialized = false;
-
-	/**
-	 * Returns the singleton instance.
-	 */
-	public static LibraryUIManager getInstance() {
-		if (instance == null) {
-			synchronized (LibraryUIManager.class) {
-				if (instance == null) {
-					instance = new LibraryUIManager();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Private default constructor to prevent this class from being
-	 * instantiated.
-	 */
-	private LibraryUIManager() {
-		// Monitor perspective changes to display/hide the configuration combo.
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window != null) {
-			window.addPerspectiveListener(new IPerspectiveListener() {
-				public void perspectiveActivated(IWorkbenchPage page,
-						IPerspectiveDescriptor desc) {
-					checkConfigurationContribution();
-				}
-
-				public void perspectiveChanged(IWorkbenchPage page,
-						IPerspectiveDescriptor desc, String id) {
-					checkConfigurationContribution();
-				}
-			});
-		}
-	}
-
-	/**
-	 * Creates and opens a new method library.
-	 * 
-	 * @param path
-	 *            the method library path
-	 * @return <code>true</code> if the method library is created and opened
-	 *         successfully
-	 */
-	public boolean createLibrary(String path) {
-		try {
-			File libraryPath = new File(path);
-			if (!libraryPath.exists()) {
-				libraryPath.mkdirs();
-			}
-			XMILibraryUtil.createMethodLibrary(libraryPath.getName(), path);
-			LibraryUIPreferences.setSavedLibraryPath(path);
-			return true;
-		} catch (Exception e) {
-			return false;
-		}
-	}
-	
-	/**
-	 * Opens the default method library given the default library path URI.
-	 * 
-	 * @param path
-	 *            URI path to a method library
-	 * @return <code>true</code> if the method library is opened successfully
-	 */
-	public boolean openDefaultLibrary(final URI uri) {
-		try {
-			File defaultLibraryPathFile = new File(uri);
-			File libraryXMIFile = new File(defaultLibraryPathFile, XMILibraryManager.LIBRARY_XMI);
-			if (!libraryXMIFile.exists()) {
-				return false;
-			}
-
-			WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-				public void execute(IProgressMonitor monitor) {
-					try {
-						URI libUri = uri;
-						String newPath = handleLibraryOnReadOnlyInstallPath(libUri);
-						if (newPath != null) {
-							libUri = StrUtil.toURI(newPath);
-						}
-						
-						String taskName = LibraryUIResources.openingLibraryTask_name;
-						monitor.beginTask(taskName, 2);
-						monitor.setTaskName(taskName);
-						monitor.worked(1);
-						LibraryService.getInstance().closeCurrentMethodLibrary();
-						LibraryService.getInstance().openMethodLibrary("xmi", libUri); //$NON-NLS-1$
-					} catch (Exception e) {
-						LibraryUIPlugin.getDefault().getLogger().logError(e);
-					} finally {
-						monitor.done();
-					}
-				}
-			};
-			Shell shell = Display.getCurrent().getActiveShell();
-			ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell) {
-				protected void configureShell(Shell shell) {
-					super.configureShell(shell);
-					shell.setText(LibraryUIResources.openLibraryWizard_title);
-				}
-			};
-			dialog.run(true, false, operation);
-			return LibraryService.getInstance().getCurrentMethodLibrary() != null;
-			
-		} catch (Exception e) {
-			// don't do anything
-		}
-		return false;
-	}
-
-	/**
-	 * Opens the last opened method library.
-	 * 
-	 * @param path
-	 *            URI path to a method library
-	 * @return <code>true</code> if the method library is opened successfully
-	 */
-	public boolean openLastOpenedLibrary() {
-		try {
-			
-			// first check for saved lib in preference
-			// so that we don't show progress monitor if there's no lib
-			String savedMethodLibraryURI = LibraryPreferences
-				.getSavedMethodLibraryURI();
-			URI uri = new URI(savedMethodLibraryURI);
-			if (uri.getPath().length() == 0) {
-				return false;
-			}
-
-			WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-				public void execute(IProgressMonitor monitor) {
-					try {
-						String taskName = LibraryUIResources.openingLibraryTask_name;
-						monitor.beginTask(taskName, 2);
-						monitor.setTaskName(taskName);
-						monitor.worked(1);
-						LibraryService.getInstance().closeCurrentMethodLibrary();
-						LibraryService.getInstance().openLastOpenedMethodLibrary();
-					} catch (Exception e) {
-						LibraryUIPlugin.getDefault().getLogger().logError(e);
-					} finally {
-						monitor.done();
-					}
-				}
-			};
-			Shell shell = Display.getCurrent().getActiveShell();
-			ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell) {
-				protected void configureShell(Shell shell) {
-					super.configureShell(shell);
-					shell.setText(LibraryUIResources.openLibraryWizard_title);
-				}
-			};
-			dialog.run(true, false, operation);
-			return LibraryService.getInstance().getCurrentMethodLibrary() != null;
-			
-		} catch (Exception e) {
-			// don't do anything
-		}
-		return false;
-	}
-
-	/**
-	 * Opens a method library given the library path URI.
-	 * 
-	 * @param path
-	 *            URI path to a method library
-	 * @return <code>true</code> if the method library is opened successfully
-	 */
-	public boolean openLibrary(final URI uri) {
-		Map<String, Object> args = new HashMap<String, Object>();
-		args.put(XMILibraryManager.ARG_LIBRARY_PATH, new File(uri).getAbsolutePath());
-		return openLibrary(XMILibraryManager.LIBRARY_TYPE, args);
-	}
-
-	/**
-	 * Opens a method library given the library path.
-	 * 
-	 * @param path
-	 *            path to a method library
-	 * @return <code>true</code> if the method library is opened successfully
-	 */
-	public boolean openLibrary(final String path) {
-		Map<String, Object> args = new HashMap<String, Object>();
-		args.put(XMILibraryManager.ARG_LIBRARY_PATH, path);
-		return openLibrary(XMILibraryManager.LIBRARY_TYPE, args);
-	}
-
-	/**
-	 * Opens a method library.
-	 * 
-	 * @param type
-	 *            the method library type
-	 * @param params
-	 *            method library specific arguments
-	 * @return <code>true</code> if the method library is opened successfully
-	 */
-	public boolean openLibrary(final String type, final Map<String, Object> args) {
-		final String path = (String) args
-				.get(XMILibraryManager.ARG_LIBRARY_PATH);
-
-		Shell shell = Display.getCurrent().getActiveShell();
-
-		final List<Exception> errors = new ArrayList<Exception>();
-
-		// Do the work within an operation because this is a long running
-		// activity that modifies the workspace.
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			public void execute(IProgressMonitor monitor) {
-				String taskName = LibraryUIResources.openingLibraryTask_name;
-				monitor.beginTask(taskName, 2);
-				try {
-					monitor.setTaskName(taskName);
-					monitor.worked(1);
-					LibraryService.getInstance().closeCurrentMethodLibrary();
-					MethodLibrary library = LibraryService.getInstance()
-							.openMethodLibrary(type, args);
-					LibraryService.getInstance().setCurrentMethodLibrary(
-							library);
-					LibraryUIPreferences.setSavedLibraryPath(path);
-
-					// Show Problems View if necessary.
-					ILibraryResourceSet resourceSet = ((ILibraryResourceSet) LibraryService
-							.getInstance().getCurrentLibraryManager()
-							.getEditingDomain().getResourceSet());
-					if (resourceSet.hasUnresolvedProxy()) {
-						SafeUpdateController.asyncExec(new Runnable() {
-							public void run() {
-								try {
-									PlatformUI
-											.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getActivePage()
-											.showView(
-													"org.eclipse.ui.views.ProblemView", null, IWorkbenchPage.VIEW_VISIBLE); //$NON-NLS-1$
-								} catch (Exception e) {
-									LibraryUIPlugin.getDefault().getLogger()
-											.logError(e);
-								}
-							}
-						});
-					}
-				} catch (Exception e) {
-					if (!(e instanceof IOException && e.getMessage()
-							.startsWith("###"))) { //$NON-NLS-1$
-						LibraryUIPlugin.getDefault().getLogger().logError(e);
-					}
-					errors.add(e);
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell) {
-				protected void configureShell(Shell shell) {
-					super.configureShell(shell);
-					shell.setText(LibraryUIResources.openLibraryWizard_title);
-				}
-			};
-			dialog.run(true, false, operation);
-			if (errors.isEmpty()) {
-				IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow();
-				if (workbenchWindow != null) {
-					IWorkbenchPage activePage = workbenchWindow.getActivePage();
-					if (activePage != null) {
-						activePage.closeAllEditors(false);
-					}
-				}
-				return true;
-			} else {
-				Iterator<Exception> iter = errors.iterator();
-				while (iter.hasNext()) {
-					Exception e = iter.next();
-					if (e instanceof IOException) {
-						String message = e.getMessage();
-						if (message.startsWith("###")) { //$NON-NLS-1$
-							String projectFileName = message.substring(3);
-
-							String prompt = LibraryUIResources
-									.bind(
-											LibraryUIResources.readOnlyProjectFile_text,
-											projectFileName);
-							String[] buttonLabels = {
-									LibraryUIResources.retryButton_text,
-									LibraryUIResources.cancelButton_text };
-							MessageDialog msgBox = new MessageDialog(Display
-									.getCurrent().getActiveShell(),
-									LibraryUIResources.openLibraryWizard_title,
-									null, prompt, MessageDialog.WARNING,
-									buttonLabels, 0);
-							if (msgBox.open() == 0) {
-								return openLibrary(path);
-							} else {
-								return true;
-							}
-						}
-					} else {
-						Throwable ex = e;
-						for (ex = e; ex != null
-								&& !(ex instanceof MessageException); ex = ex
-								.getCause())
-							;
-						String msg = ex != null && ex.getMessage() != null ? ex
-								.getMessage() : e.getMessage() != null ? e
-								.getMessage() : e.toString();
-						LibraryUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										LibraryUIResources.openLibraryWizard_title,
-										msg, e);
-					}
-				}
-			}
-		} catch (Exception e) {
-			LibraryUIPlugin.getDefault().getLogger().logError(e);
-		}
-
-		return false;
-	}
-
-	/**
-	 * Upgrades a method library to a new meta-model.
-	 * 
-	 * @param libPath
-	 *            path to a method library folder
-	 * @return <code>true</code> if the given method library is sucessfully
-	 *         upgraded
-	 */
-	public static boolean upgradeLibrary(final String libPath,
-			final UpgradeCallerInfo callerInfo) {
-		Shell shell = Display.getCurrent().getActiveShell();
-		if (UpgradeCallerInfo.isUpgradeLibrary(callerInfo)) {
-			LibraryBackupUtil.promptBackupLibrary(shell, new File(libPath));
-		}
-
-		String libXmi = MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME;
-		if (callerInfo != null && callerInfo.getIsExportedPluginLib()) {
-			libXmi = XMILibraryManager.exportFile;
-		}
-		return upgradeLibrary(new File(libPath, libXmi), callerInfo);
-	}
-
-	public static boolean upgradeLibrary(final File libFile,
-			final UpgradeCallerInfo callerInfo) {
-		final StringBuffer errMsg = new StringBuffer();
-		final boolean[] cancelFlagHolder = { false };
-
-		// Do the work within an operation because this is a long running
-		// activity that modifies the workbench.
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			public void execute(IProgressMonitor monitor) {
-				monitor.beginTask(LibraryUIResources.upgradingLibraryTask_name,
-						10);
-				monitor.worked(1);
-				try {
-					MappingUtil.migrate(libFile.getAbsolutePath(), monitor,
-							callerInfo);
-				} catch (OperationCanceledException e) {
-					cancelFlagHolder[0] = true;
-				} catch (Exception e) {
-					LibraryUIPlugin.getDefault().getLogger().logError(e);
-					if (DEBUG) {
-						e.printStackTrace();
-					}
-					String msg = e.getMessage();
-					if (msg == null) {
-						msg = LibraryUIResources.upgradeLibraryError_msg;
-					}
-					errMsg.append(msg);
-				} finally {
-					monitor.done();
-				}
-			}
-		};
-
-		try {
-			// Run the operation and display the progress.
-			ProgressMonitorDialog pmDialog = new ProgressMonitorDialog(Display
-					.getCurrent().getActiveShell()) {
-				protected Point getInitialSize() {
-					Point calculatedSize = super.getInitialSize();
-					if (calculatedSize.x < 675) {
-						calculatedSize.x = 675;
-					}
-					return calculatedSize;
-				}
-			};
-			pmDialog.run(true, false, operation);
-			if (cancelFlagHolder[0]) {
-				return false;
-			} else if (errMsg.length() > 0) {
-				IStatus status = new Status(IStatus.ERROR,
-						LibraryUIPlugin.PLUGIN_ID, 0, "", null) {//$NON-NLS-1$
-					public IStatus[] getChildren() {
-						IStatus[] ret = new Status[1];
-						IStatus cs = new Status(IStatus.ERROR,
-								LibraryUIPlugin.PLUGIN_ID, 0,
-								errMsg.toString(), null);
-						ret[0] = cs;
-						return ret;
-					}
-
-					public boolean isMultiStatus() {
-						return true;
-					}
-				};
-
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						LibraryUIResources.upgradeLibraryDialog_title,
-						LibraryUIResources.upgradeLibraryError_msg, status);
-
-				return false;
-			}
-			return true;
-		} catch (Exception e) {
-			LibraryUIPlugin.getDefault().getLogger().logError(e);
-			if (DEBUG) {
-				e.printStackTrace();
-			}
-			LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-					LibraryUIResources.upgradeLibraryDialog_title,
-					LibraryUIResources.upgradeLibraryError_msg);
-			return false;
-		}
-
-	}
-	
-	/**
-	 * Sets the path of the method library that will be opened only if there are
-	 * no saved library preferences.
-	 * 
-	 * @param libraryPath
-	 *            path to a method library
-	 */
-	public static void setCommandLineDefaultLibrary(String libraryPath) {
-		if (libraryPath != null && libraryPath.length() > 0) {
-			IPath path = Path.fromOSString(libraryPath);
-			try {
-				defaultLibraryURI = path.toFile().toURI();
-			} catch (Exception e) {
-				defaultLibraryURI = null;
-				LibraryPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	}
-
-	/**
-	 * Sets the path of the method library that will be opened regardless of the
-	 * saved library preferences.
-	 * 
-	 * @param libraryPath
-	 *            path to a method library
-	 */
-	public static void setCommandLineLibrary(String libraryPath) {
-		if (libraryPath != null && libraryPath.length() > 0) {
-			IPath path = Path.fromOSString(libraryPath);
-			try {
-				libraryURI = path.toFile().toURI();
-			} catch (Exception e) {
-				libraryURI = null;
-				LibraryPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	}
-	
-	/**
-	 * Checks whether the method configuration combobox should be added to the
-	 * system toolbar.
-	 * <p>
-	 * The method configuration combobox lists all the method configurations in
-	 * the current method library.
-	 */
-	private void checkConfigurationContribution() {
-		IWorkbench workbench = LibraryUIPlugin.getDefault().getWorkbench();
-		if (workbench != null) {
-			IWorkbenchWindow window = (IWorkbenchWindow) workbench
-					.getActiveWorkbenchWindow();
-			if (window != null && window instanceof ApplicationWindow) {
-				ICoolBarManager coolBarMgr = ((ApplicationWindow) window)
-						.getCoolBarManager();
-				try {
-					IWorkbenchPage activePage = window.getActivePage();
-					if (foundConfigView(activePage)
-							|| foundProcessEditor(activePage)) {
-						showConfigurationContribution(coolBarMgr);
-					} else {
-						hideConfigurationContribution(coolBarMgr);
-					}
-				} catch (Exception e) {
-					LibraryUIPlugin.getDefault().getLogger().logError(e);
-					if (DEBUG) {
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Checks for the presence of the Configuration view in the active workbench
-	 * page.
-	 */
-	private boolean foundConfigView(IWorkbenchPage activePage) {
-		if (activePage == null) return false;
-		return activePage.findView(CONFIG_VIEW_ID) != null;
-	}
-
-	/**
-	 * Checks for the presence of a Process editor in the active workbench.
-	 * page.
-	 */
-	private boolean foundProcessEditor(IWorkbenchPage activePage) {
-		if (activePage == null) return false;
-		IEditorReference[] editorRefs = activePage.findEditors(null,
-				PROCESS_EDITOR_ID, IWorkbenchPage.MATCH_ID);
-		return editorRefs != null && editorRefs.length > 0;
-	}
-
-	/**
-	 * Displays the method configuration combobox in the system toolbar.
-	 */
-	private void showConfigurationContribution(ICoolBarManager coolBarMgr)
-			throws Exception {
-		// Check for the method configuration combobox toolbar.
-		IContributionItem configToolBar = coolBarMgr
-				.find(TOOLBAR_CONFIG_CONTRIBUTION_ID);
-
-		if (configToolBar != null) {
-			// Make sure the toolbar has the method configuration combobox
-			// contribution.
-			if (configToolBar instanceof ToolBarContributionItem) {
-				IToolBarManager toolBarMgr = ((ToolBarContributionItem) configToolBar)
-						.getToolBarManager();
-				if (toolBarMgr != null) {
-					IContributionItem[] toolBarItems = toolBarMgr.getItems();
-					if (toolBarItems != null && toolBarItems.length > 0) {
-						for (int i = 0; i < toolBarItems.length; i++) {
-							toolBarItems[i].setVisible(true);
-						}
-						configToolBar.setVisible(true);
-						updateSystemToolBar(coolBarMgr);
-						return;
-					}
-				}
-
-				// The method configuration combobox toolbar has been restored
-				// via a saved perspective, add the method configuration
-				// combobox contribution.
-				ConfigurationContributionItem configCombo = new ConfigurationContributionItem(
-						null);
-				toolBarMgr.add(configCombo);
-				configToolBar.setVisible(true);
-				updateSystemToolBar(coolBarMgr);
-				return;
-			}
-		}
-
-		IToolBarManager toolBarMgr = new ToolBarManager(SWT.FLAT | SWT.LEFT);
-		ConfigurationContributionItem configCombo = new ConfigurationContributionItem(
-				null);
-		toolBarMgr.add(configCombo);
-		ToolBarContributionItem configComboToolBar = new ToolBarContributionItem(
-				toolBarMgr, TOOLBAR_CONFIG_CONTRIBUTION_ID);
-		coolBarMgr.add(configComboToolBar);
-	}
-
-	/**
-	 * Hides the method configuration combobox from the system toolbar.
-	 */
-	private void hideConfigurationContribution(ICoolBarManager coolBarMgr)
-			throws Exception {
-		// Check for the method configuration combobox toolbar.
-		IContributionItem configToolBar = coolBarMgr
-				.find(TOOLBAR_CONFIG_CONTRIBUTION_ID);
-
-		if (configToolBar == null) {
-			return;
-		}
-
-		// Hide the method configuration combobox contribution from the toolbar.
-		if (configToolBar instanceof ToolBarContributionItem) {
-			IToolBarManager toolBarMgr = ((ToolBarContributionItem) configToolBar)
-					.getToolBarManager();
-			IContributionItem[] toolBarItems = toolBarMgr.getItems();
-			for (int i = 0; i < toolBarItems.length; i++) {
-				toolBarItems[i].setVisible(false);
-			}
-		}
-
-		// Hide the method configuration combobox toolbar contribution.
-		configToolBar.setVisible(false);
-
-		// Update the the system tool bar.
-		updateSystemToolBar(coolBarMgr);
-	}
-
-	/**
-	 * Updates the system tool bar.
-	 */
-	private void updateSystemToolBar(ICoolBarManager coolBarMgr) {
-		if (coolBarMgr instanceof CoolBarManager) {
-			((CoolBarManager) coolBarMgr).update(true);
-		}
-	}
-
-	/**
-	 * Adds a part listener so the library will open upon "startup"
-	 * "startup" means when the view with the specified id is first
-	 * visible
-	 */
-	public void addMethodViewPartListener(final String id) {
-		IWorkbench workbench = LibraryUIPlugin.getDefault().getWorkbench();
-		if (workbench != null) {
-			IWorkbenchWindow window = (IWorkbenchWindow) workbench
-					.getActiveWorkbenchWindow();
-			if (window != null && window instanceof ApplicationWindow) {
-				try {
-					final IWorkbenchPage activePage = window.getActivePage();
-					activePage.addPartListener(new IPartListener2() {
-
-						public void partActivated(
-								IWorkbenchPartReference partRef) {
-						}
-
-						public void partBroughtToTop(
-								IWorkbenchPartReference partRef) {
-						}
-
-						public void partClosed(IWorkbenchPartReference partRef) {
-						}
-
-						public void partDeactivated(
-								IWorkbenchPartReference partRef) {
-						}
-
-						public void partHidden(IWorkbenchPartReference partRef) {
-						}
-
-						public void partInputChanged(
-								IWorkbenchPartReference partRef) {
-						}
-
-						public void partOpened(IWorkbenchPartReference partRef) {
-						}
-
-						public void partVisible(IWorkbenchPartReference partRef) {
-							if (partRef.getId().equals(id)) {
-								activePage.removePartListener(this);
-								startupOpenLibrary();
-							}
-						}
-						
-					});
-				} catch (Exception e) {
-					LibraryUIPlugin.getDefault().getLogger().logError(e);
-					if (DEBUG) {
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-
-	}
-	
-	
-	/**
-	 * Opens the library upon startup
-	 * 1.  First tries to open the library specified by -library
-	 * 2.  Then tries to open the last opened library
-	 * 3.  Finally, tries to open the library specified by -defaultlibrary
-	 */
-	public void startupOpenLibrary() {
-		if (libraryInitialized == true) {
-			return;
-		}
-		libraryInitialized = true;
-		try {
-			String savedMethodLibraryURI = LibraryPreferences
-			.getSavedMethodLibraryURI();
-			boolean hasSavedUri = savedMethodLibraryURI != null && savedMethodLibraryURI.length() > 0;
-			
-			String lastSavedConfigName = PreferenceUtil.getSavedLastConfig();
-			if (libraryURI != null && openLibrary(libraryURI)) {
-			} else if (openLastOpenedLibrary()) {
-			} else if (defaultLibraryURI != null && !hasSavedUri) {
-				// Try loading the NL library first.
-				Locale locale = Locale.getDefault();
-				String defaultLibraryStr = new File(defaultLibraryURI)
-						.getAbsolutePath();
-				String localizedLibPath = I18nUtil.getLocalizedFile(
-						FileUtil.removeAllSeparator(defaultLibraryStr),
-						locale);
-				if (localizedLibPath != null) {
-					defaultLibraryURI_NL = StrUtil.toURI(localizedLibPath);
-				}
-				if (defaultLibraryURI_NL != null && openDefaultLibrary(defaultLibraryURI_NL)) {
-				} else {
-					openDefaultLibrary(defaultLibraryURI);
-				}
-			}
-			if (LibraryService.getInstance().getCurrentMethodLibrary() != null) {
-				MethodConfiguration savedConfig = LibraryServiceUtil
-						.getMethodConfiguration(LibraryService.getInstance()
-						.getCurrentMethodLibrary(), lastSavedConfigName);
-				if (savedConfig != null) {
-					LibraryService.getInstance().setCurrentMethodConfiguration(savedConfig);
-				}
-			}
-		} catch (Exception e) {
-			LibraryUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-	
-	/**
-	 * 
-	 * @param path
-	 * @return null if path is not on install path or not read-only or if user 
-	 * declines to copy the library to a writable location. Returns
-	 * a new path if the user wishes to open the library in a different location
-	 * 
-	 */
-	private String handleLibraryOnReadOnlyInstallPath(URI libURI) {
-		try {
-			// determine if path is in Installation directory
-			File libPathFile = new File(libURI);
-			if (!libPathFile.exists()) {
-				return null;
-			}
-			Location installLocation = Platform.getInstallLocation();
-			URL installLocationURL = installLocation.getURL();
-			URI installLocationURI = new URI(NetUtil.encodeFileURL(installLocationURL.toExternalForm()));
-			File installLocFile = new File(installLocationURI);
-			String canonicalLibPath = libPathFile.getCanonicalPath();
-			String canonicalInstallPath = installLocFile.getCanonicalPath();
-			if (!canonicalLibPath.startsWith(canonicalInstallPath)) {
-				return null;
-			}
-			
-			// determine if OS is not vista or linux
-			String osName = System.getProperty("os.name"); //$NON-NLS-1$
-			String platformOS = Platform.getOS();
-			if ((osName.indexOf("Vista") == -1) //$NON-NLS-1$
-					&& !platformOS.equals(Platform.OS_LINUX)) {
-				return null;
-			}
-			
-			// show dialog, allow copy to new path
-
-			final String defaultCopyPath = new File(new File(LibraryUIPreferences.getDefaultLibraryPath()).getParent(), libPathFile.getName()).getAbsolutePath();
-
-			final StringBuffer newPath = new StringBuffer();
-			
-			UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
-				public void run() {
-					String title = LibraryUIResources.copyLibraryDialog_title;
-					String message = LibraryUIResources.copyLibraryDialog_text_readOnlyLib;
-					CopyLibraryDialog dlg = new CopyLibraryDialog(Display.getCurrent().getActiveShell(), title,
-							message, defaultCopyPath);
-
-					if (dlg.open() == Dialog.OK) {
-						newPath.append(dlg.getPath());
-					}
-				}
-			}, false);
-			if (newPath.length() > 0) {
-				copyLibrary(libPathFile, new File(newPath.toString()));
-				return newPath.toString();
-			} else {
-				return null;
-			}
-
-		} catch (URISyntaxException uriEx) {
-			LibraryUIPlugin.getDefault().getLogger().logError(uriEx);
-			return null;
-		} catch (IOException ioEx) {
-			LibraryUIPlugin.getDefault().getLogger().logError(ioEx);
-			return null;
-		}
-	}
-	
-	/**
-	 * Back up library 
-	 * 
-	 * @param source
-	 * @param dest
-	 */
-	private static void copyLibrary(final File source, final File dest) {
-		Runnable runnable = new Runnable() {
-			public void run() {
-				try {
-					// excude the non-library files that might be locked by rmc.
-					// these files may cause backup to fail due to file lock.
-					String excludes = ".lock"; //$NON-NLS-1$
-					LayoutResources.copyDir(source, dest, "**", excludes); //$NON-NLS-1$
-				} catch (RuntimeException e) {
-					e.printStackTrace();
-				}
-			}
-		};
-
-		UserInteractionHelper.runWithProgress(runnable,
-				LibraryUIResources.copyLibraryTask_name);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIPlugin.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIPlugin.java
deleted file mode 100644
index becfdb5..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIPlugin.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.eclipse.epf.library.layout.BrowsingLayoutSettings;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Library UI plug-in class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryUIPlugin extends AbstractPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = LibraryUIPlugin.class.getName();
-
-	// The shared plug-in instance.
-	private static LibraryUIPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Gets the shared plug-in instance.
-	 */
-	public static LibraryUIPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * update the publishing/browsing layout settings.
-	 * Call this method when ever publishing/browsing related preferences are changed.
-	 *
-	 */
-	public void updateLayoutSettings() 
-	{
-		// get the skin setting from preference
-		boolean publishUnopenActivitydd = LibraryUIPreferences.getPublishUnopenActivitydd();	
-		boolean publishADForActivityExtension = LibraryUIPreferences.getPublishADForActivityExtension();
-		boolean useNewExtends = LibraryPreferences.getUseNewExtendsSemantics();
-		
-		BrowsingLayoutSettings.INSTANCE.setPublishADForActivityExtension(publishADForActivityExtension);
-		BrowsingLayoutSettings.INSTANCE.setPublishUnopenActivitydd(publishUnopenActivitydd);
-		BrowsingLayoutSettings.INSTANCE.setUseNewExtendSemantics(useNewExtends);
-		
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIResources.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIResources.java
deleted file mode 100644
index e0322a4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIResources.java
+++ /dev/null
@@ -1,436 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Library UI resources.
- * 
- * @author Kelvin Low
- * @since 1.0
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=177500
- */
-public class LibraryUIResources extends NLS {
-
-	private static String BUNDLE_NAME = LibraryUIResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	public static String activity_text;
-
-	public static String artifact_text;
-
-	public static String capabilityPattern_text;
-
-	public static String checklist_text;
-
-	public static String checkItem_text;
-
-	public static String compositeRole_text;
-
-	public static String concept_text;
-
-	public static String contentPackage_text;
-
-	public static String customCategory_text;
-
-	public static String deliverable_text;
-
-	public static String deliveryProcess_text;
-
-	public static String descriptor_text;
-
-	public static String discipline_text;
-
-	public static String disciplineGrouping_text;
-
-	public static String domain_text;
-
-	public static String estimate_text;
-
-	public static String estimatingMetric_text;
-
-	public static String estimationConsiderations_text;
-
-	public static String example_text;
-
-	public static String guidance_text;
-
-	public static String guideline_text;
-
-	public static String iteration_text;
-
-	public static String methodConfiguration_text;
-
-	public static String methodContent_text;
-
-	public static String methodLibrary_text;
-
-	public static String methodPackage_text;
-
-	public static String methodPlugin_text;
-
-	public static String milestone_text;
-
-	public static String outcome_text;
-
-	public static String overrideCurrentLibraryError_msg0;
-
-	public static String phase_text;
-
-	public static String practice_text;
-
-	public static String process_text;
-
-	public static String processContribution_text;
-
-	public static String processFamily_text;
-
-	public static String processPackage_text;
-
-	public static String report_text;
-
-	public static String reusableAsset_text;
-
-	public static String roadmap_text;
-
-	public static String roleDescriptor_text;
-
-	public static String role_text;
-
-	public static String roleSet_text;
-
-	public static String roleSetGrouping_text;
-
-	public static String standardCategory_text;
-
-	public static String step_text;
-
-	public static String supportingMaterial_text;
-
-	public static String task_text;
-
-	public static String taskDescriptor_text;
-
-	public static String teamProfile_text;
-
-	public static String template_text;
-
-	public static String termDefinition_text;
-
-	public static String tool_text;
-
-	public static String toolMentor_text;
-
-	public static String whitepaper_text;
-
-	public static String workProduct_text;
-
-	public static String workProductDescriptor_text;
-
-	public static String workProductElement_text;
-
-	public static String workProductType_text;
-
-	public static String activity_text_plural;
-
-	public static String artifact_text_plural;
-
-	public static String capabilityPattern_text_plural;
-
-	public static String checklist_text_plural;
-
-	public static String checkItem_text_plural;
-
-	public static String compositeRole_text_plural;
-
-	public static String concept_text_plural;
-
-	public static String contentPackage_text_plural;
-
-	public static String customCategory_text_plural;
-
-	public static String deliverable_text_plural;
-
-	public static String deliveryProcess_text_plural;
-
-	public static String descriptor_text_plural;
-
-	public static String discipline_text_plural;
-
-	public static String disciplineGrouping_text_plural;
-
-	public static String domain_text_plural;
-
-	public static String estimate_text_plural;
-
-	public static String estimatingMetric_text_plural;
-
-	public static String estimationConsiderations_text_plural;
-
-	public static String example_text_plural;
-
-	public static String guidance_text_plural;
-
-	public static String guideline_text_plural;
-
-	public static String iteration_text_plural;
-
-	public static String methodConfiguration_text_plural;
-
-	public static String methodContent_text_plural;
-
-	public static String methodLibrary_text_plural;
-
-	public static String methodPackage_text_plural;
-
-	public static String methodPlugin_text_plural;
-
-	public static String milestone_text_plural;
-
-	public static String outcome_text_plural;
-
-	public static String phase_text_plural;
-
-	public static String practice_text_plural;
-
-	public static String process_text_plural;
-
-	public static String processContribution_text_plural;
-
-	public static String processFamily_text_plural;
-
-	public static String processPackage_text_plural;
-
-	public static String report_text_plural;
-
-	public static String reusableAsset_text_plural;
-
-	public static String roadmap_text_plural;
-
-	public static String roleDescriptor_text_plural;
-
-	public static String role_text_plural;
-
-	public static String roleSet_text_plural;
-
-	public static String roleSetGrouping_text_plural;
-
-	public static String standardCategory_text_plural;
-
-	public static String step_text_plural;
-
-	public static String supportingMaterial_text_plural;
-
-	public static String task_text_plural;
-
-	public static String taskDescriptor_text_plural;
-
-	public static String teamProfile_text_plural;
-
-	public static String template_text_plural;
-
-	public static String termDefinition_text_plural;
-
-	public static String tool_text_plural;
-
-	public static String toolMentor_text_plural;
-
-	public static String whitepaper_text_plural;
-
-	public static String workProduct_text_plural;
-
-	public static String workProductDescriptor_text_plural;
-
-	public static String workProductElement_text_plural;
-
-	public static String workProductType_text_plural;
-
-	public static String application_title;
-
-	public static String openLibraryWizard_title;
-
-	public static String openLibraryMainWizardPage_title;
-
-	public static String openLibraryMainWizardPage_title_2;
-
-	public static String openLibraryMainWizardPage_text;
-
-	public static String pathLabel_text;
-
-	public static String nameLabel_text;
-
-	public static String uriLabel_text;
-
-	public static String openUnlistedLibraryCheckbox_text;
-
-	public static String libraryTypeLabel_text;
-
-	public static String libraryLabel_text;
-
-	public static String browseButton_text;
-
-	public static String promptForLibraryCheckbox_text;
-
-	public static String openLibraryDialog_newLibrary_text;
-
-	public static String selectLibraryFolderDialog_title;
-
-	public static String selectLibraryFolderDialog_text;
-
-	public static String openingLibraryTask_name;
-
-	public static String openLibraryError_msg;
-
-	public static String openLibraryInternlError_reason;
-
-	public static String openLibraryError_reason1;
-
-	public static String openLibraryError_reason2;
-
-	public static String openLibraryError_reason3;
-
-	public static String openLibraryError_reason4;
-
-	public static String openLibraryError_advice;
-
-	public static String invalidLibraryPath_msg;
-
-	public static String invalidLibraryPath_reason;
-
-	public static String readOnlyProjectFile_text;
-
-	public static String retryButton_text;
-
-	public static String cancelButton_text;
-
-	public static String upgradeLibraryDialog_title;
-
-	public static String upgradeLibraryDialog_text;
-
-	public static String upgradingLibraryTask_name;
-
-	public static String upgradeLibraryError_msg;
-
-	public static String switchConfigDialog_title;
-
-	public static String switchConfigDialog_text;
-
-	public static String currentConfigLabel_text;
-
-	public static String selectConfigLabel_text;
-
-	public static String deleteFilesConfirmation_msg;
-
-	public static String deleteFilesError_reason;
-
-	public static String createPathError_reason;
-
-	public static String invalidPath_msg;
-
-	public static String backupLibraryDialog_title;
-
-	public static String backupLibraryDialog_text;
-
-	public static String backingUpLibraryTask_name;
-
-	public static String pathSelectionError_msg;
-
-	public static String okButton_text;
-
-	public static String skipButton_text;
-
-	public static String alwaysButton_text;
-
-	public static String neverButton_text;
-
-	public static String promptButton_text;
-
-	public static String linkToURL_name;
-
-	public static String linkToFile_name;
-
-	public static String elementLink_name;
-
-	public static String elementLinkWithType_name;
-
-	public static String elementLinkWithUserText_name;
-
-	public static String convertActivityDialog_title;
-
-	public static String convertActivityDialog_text;
-
-	public static String unsupportedActivityType_msg;
-
-	public static String unsupportedActivityType_reason;
-
-	public static String versionMismatchDialog_text;
-
-	public static String versionMismatchDialog_text_unknown;
-
-	public static String selectProcessWizardPage_title;
-
-	public static String selectProcessWizardPage_text;
-
-	public static String processesLabel_text;
-
-	public static String briefDescriptionLabel_text;
-
-	public static String noOpenLibraryWarning_msg;
-
-	public static String errorDialog_title;
-
-	public static String MethodElementDeleteAction_deleteconfirm_text;
-
-	public static String confirmDeleteDialog_title;
-
-	public static String confirmDeleteDialog_msg;
-
-	public static String confirmDeleteDialog_msgWithReference;
-
-	public static String ProcessDeleteAction_deletecofirm_text;
-	
-	public static String saveLibraryDialog_title;
-	
-	public static String saveLibraryDialog_text;
-	
-	public static String saveLibraryError_msg;
-	
-	public static String error_reason;
-	
-	public static String copyLibraryDialog_title;
-	
-	public static String copyLibraryDialog_text_readOnlyLib;
-	
-	public static String copyLibraryTask_name;
-	
-	public static String copyLibraryDialog_copyButton_text;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, LibraryUIResources.class);
-	}
-
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given object.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String bind(String key, Object data) {
-		return NLS.bind(key, new Object[] { data });
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIText.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIText.java
deleted file mode 100644
index 365d857..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIText.java
+++ /dev/null
@@ -1,502 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.impl.ActivityImpl;
-import org.eclipse.epf.uma.impl.ArtifactImpl;
-import org.eclipse.epf.uma.impl.CapabilityPatternImpl;
-import org.eclipse.epf.uma.impl.ChecklistImpl;
-import org.eclipse.epf.uma.impl.CompositeRoleImpl;
-import org.eclipse.epf.uma.impl.ConceptImpl;
-import org.eclipse.epf.uma.impl.ContentPackageImpl;
-import org.eclipse.epf.uma.impl.CustomCategoryImpl;
-import org.eclipse.epf.uma.impl.DeliverableImpl;
-import org.eclipse.epf.uma.impl.DeliveryProcessImpl;
-import org.eclipse.epf.uma.impl.DisciplineGroupingImpl;
-import org.eclipse.epf.uma.impl.DisciplineImpl;
-import org.eclipse.epf.uma.impl.DomainImpl;
-import org.eclipse.epf.uma.impl.EstimationConsiderationsImpl;
-import org.eclipse.epf.uma.impl.ExampleImpl;
-import org.eclipse.epf.uma.impl.GuidelineImpl;
-import org.eclipse.epf.uma.impl.IterationImpl;
-import org.eclipse.epf.uma.impl.MethodConfigurationImpl;
-import org.eclipse.epf.uma.impl.MethodLibraryImpl;
-import org.eclipse.epf.uma.impl.MethodPackageImpl;
-import org.eclipse.epf.uma.impl.MethodPluginImpl;
-import org.eclipse.epf.uma.impl.MilestoneImpl;
-import org.eclipse.epf.uma.impl.OutcomeImpl;
-import org.eclipse.epf.uma.impl.PhaseImpl;
-import org.eclipse.epf.uma.impl.PracticeImpl;
-import org.eclipse.epf.uma.impl.ProcessFamilyImpl;
-import org.eclipse.epf.uma.impl.ProcessPackageImpl;
-import org.eclipse.epf.uma.impl.ReportImpl;
-import org.eclipse.epf.uma.impl.ReusableAssetImpl;
-import org.eclipse.epf.uma.impl.RoadmapImpl;
-import org.eclipse.epf.uma.impl.RoleDescriptorImpl;
-import org.eclipse.epf.uma.impl.RoleImpl;
-import org.eclipse.epf.uma.impl.RoleSetGroupingImpl;
-import org.eclipse.epf.uma.impl.RoleSetImpl;
-import org.eclipse.epf.uma.impl.StepImpl;
-import org.eclipse.epf.uma.impl.SupportingMaterialImpl;
-import org.eclipse.epf.uma.impl.TaskDescriptorImpl;
-import org.eclipse.epf.uma.impl.TaskImpl;
-import org.eclipse.epf.uma.impl.TeamProfileImpl;
-import org.eclipse.epf.uma.impl.TemplateImpl;
-import org.eclipse.epf.uma.impl.TermDefinitionImpl;
-import org.eclipse.epf.uma.impl.ToolImpl;
-import org.eclipse.epf.uma.impl.ToolMentorImpl;
-import org.eclipse.epf.uma.impl.WhitepaperImpl;
-import org.eclipse.epf.uma.impl.WorkProductDescriptorImpl;
-import org.eclipse.epf.uma.impl.WorkProductImpl;
-import org.eclipse.epf.uma.impl.WorkProductTypeImpl;
-
-/**
- * Provides access to cached copy of commonly referenced text in the library UI.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryUIText {
-
-	public static final String TEXT_ACTIVITY = LibraryUIResources.activity_text;
-
-	public static final String TEXT_ARTIFACT = LibraryUIResources.artifact_text;
-
-	public static final String TEXT_CAPABILITY_PATTERN = LibraryUIResources.capabilityPattern_text;
-
-	public static final String TEXT_CHECKLIST = LibraryUIResources.checklist_text;
-
-	public static final String TEXT_CHECK_ITEM = LibraryUIResources.checkItem_text;
-
-	public static final String TEXT_COMPOSITE_ROLE = LibraryUIResources.compositeRole_text;
-
-	public static final String TEXT_CONCEPT = LibraryUIResources.concept_text;
-
-	public static final String TEXT_CONTENT_PACKAGE = LibraryUIResources.contentPackage_text;
-
-	public static final String TEXT_CUSTOM_CATEGORY = LibraryUIResources.customCategory_text;
-
-	public static final String TEXT_DELIVERABLE = LibraryUIResources.deliverable_text;
-
-	public static final String TEXT_DELIVERY_PROCESS = LibraryUIResources.deliveryProcess_text;
-
-	public static final String TEXT_DESCRIPTOR = LibraryUIResources.descriptor_text;
-
-	public static final String TEXT_DISCIPLINE = LibraryUIResources.discipline_text;
-
-	public static final String TEXT_DISCIPLINE_GROUPING = LibraryUIResources.disciplineGrouping_text;
-
-	public static final String TEXT_DOMAIN = LibraryUIResources.domain_text;
-
-	public static final String TEXT_ESTIMATE = LibraryUIResources.example_text;
-
-	public static final String TEXT_ESTIMATING_METRIC = LibraryUIResources.estimatingMetric_text;
-
-	public static final String TEXT_ESTIMATION_CONSIDERATIONS = LibraryUIResources.estimationConsiderations_text;
-
-	public static final String TEXT_EXAMPLE = LibraryUIResources.example_text;
-
-	public static final String TEXT_GUIDANCE = LibraryUIResources.guidance_text;
-
-	public static final String TEXT_GUIDELINE = LibraryUIResources.guideline_text;
-
-	public static final String TEXT_ITERATION = LibraryUIResources.iteration_text;
-
-	public static final String TEXT_METHOD_CONFIGURATON = LibraryUIResources.methodConfiguration_text;
-
-	public static final String TEXT_METHOD_CONTENT = LibraryUIResources.methodContent_text;
-
-	public static final String TEXT_METHOD_LIBARARY = LibraryUIResources.methodLibrary_text;
-
-	public static final String TEXT_METHOD_PACKAGE = LibraryUIResources.methodPackage_text;
-
-	public static final String TEXT_METHOD_PLUGIN = LibraryUIResources.methodPlugin_text;
-
-	public static final String TEXT_MILESTONE = LibraryUIResources.milestone_text;
-
-	public static final String TEXT_OUTCOME = LibraryUIResources.outcome_text;
-
-	public static final String TEXT_PHASE = LibraryUIResources.phase_text;
-
-	public static final String TEXT_PRACTICE = LibraryUIResources.practice_text;
-
-	public static final String TEXT_PROCESS = LibraryUIResources.process_text;
-
-	public static final String TEXT_PROCESS_CONTRIBUTION = LibraryUIResources.processContribution_text;
-
-	public static final String TEXT_PROCESS_FAMILY = LibraryUIResources.processFamily_text;
-
-	public static final String TEXT_PROCESS_PACKAGE = LibraryUIResources.processPackage_text;
-
-	public static final String TEXT_REPORT = LibraryUIResources.report_text;
-
-	public static final String TEXT_REUSABLE_ASSET = LibraryUIResources.reusableAsset_text;
-
-	public static final String TEXT_ROADMAP = LibraryUIResources.roadmap_text;
-
-	public static final String TEXT_ROLE = LibraryUIResources.role_text;
-
-	public static final String TEXT_ROLE_DESCRIPTOR = LibraryUIResources.roleDescriptor_text;
-
-	public static final String TEXT_ROLE_SET = LibraryUIResources.roleSet_text;
-
-	public static final String TEXT_ROLE_SET_GROUPING = LibraryUIResources.roleSetGrouping_text;
-
-	public static final String TEXT_STANDARD_CATEGORY = LibraryUIResources.standardCategory_text;
-
-	public static final String TEXT_STEP = LibraryUIResources.step_text;
-
-	public static final String TEXT_SUPPORTING_MATERIAL = LibraryUIResources.supportingMaterial_text;
-
-	public static final String TEXT_TASK = LibraryUIResources.task_text;
-
-	public static final String TEXT_TASK_DESCRIPTOR = LibraryUIResources.taskDescriptor_text;
-
-	public static final String TEXT_TEAM_PROFILE = LibraryUIResources.teamProfile_text;
-
-	public static final String TEXT_TEMPLATE = LibraryUIResources.template_text;
-
-	public static final String TEXT_TERM_DEFINITION = LibraryUIResources.termDefinition_text;
-
-	public static final String TEXT_TOOL = LibraryUIResources.tool_text;
-
-	public static final String TEXT_TOOL_MENTOR = LibraryUIResources.toolMentor_text;
-
-	public static final String TEXT_WHITEPAPER = LibraryUIResources.whitepaper_text;
-
-	public static final String TEXT_WORK_PRODUCT = LibraryUIResources.workProduct_text;
-
-	public static final String TEXT_WORK_PRODUCT_DESCRIPTOR = LibraryUIResources.workProductDescriptor_text;
-
-	public static final String TEXT_WORK_PRODUCT_ELEMENT = LibraryUIResources.workProductElement_text;
-
-	public static final String TEXT_WORK_PRODUCT_TYPE = LibraryUIResources.workProductType_text;
-
-	public static final String TEXT_ACTIVITY_PLURAL = LibraryUIResources.activity_text_plural;
-
-	public static final String TEXT_ARTIFACT_PLURAL = LibraryUIResources.artifact_text_plural;
-
-	public static final String TEXT_CAPABILITY_PATTERN_PLURAL = LibraryUIResources.capabilityPattern_text_plural;
-
-	public static final String TEXT_CHECKLIST_PLURAL = LibraryUIResources.checklist_text_plural;
-
-	public static final String TEXT_CHECK_ITEM_PLURAL = LibraryUIResources.checkItem_text_plural;
-
-	public static final String TEXT_COMPOSITE_ROLE_PLURAL = LibraryUIResources.compositeRole_text_plural;
-
-	public static final String TEXT_CONCEPT_PLURAL = LibraryUIResources.concept_text_plural;
-
-	public static final String TEXT_CONTENT_PACKAGE_PLURAL = LibraryUIResources.contentPackage_text_plural;
-
-	public static final String TEXT_CUSTOM_CATEGORY_PLURAL = LibraryUIResources.customCategory_text_plural;
-
-	public static final String TEXT_DELIVERABLE_PLURAL = LibraryUIResources.deliverable_text_plural;
-
-	public static final String TEXT_DELIVERY_PROCESS_PLURAL = LibraryUIResources.deliveryProcess_text_plural;
-
-	public static final String TEXT_DESCRIPTOR_PLURAL = LibraryUIResources.descriptor_text_plural;
-
-	public static final String TEXT_DISCIPLINE_PLURAL = LibraryUIResources.discipline_text_plural;
-
-	public static final String TEXT_DISCIPLINE_GROUPING_PLURAL = LibraryUIResources.disciplineGrouping_text_plural;
-
-	public static final String TEXT_DOMAIN_PLURAL = LibraryUIResources.domain_text_plural;
-
-	public static final String TEXT_ESTIMATE_PLURAL = LibraryUIResources.example_text_plural;
-
-	public static final String TEXT_ESTIMATING_METRIC_PLURAL = LibraryUIResources.estimatingMetric_text_plural;
-
-	public static final String TEXT_ESTIMATION_CONSIDERATIONS_PLURAL = LibraryUIResources.estimationConsiderations_text_plural;
-
-	public static final String TEXT_EXAMPLE_PLURAL = LibraryUIResources.example_text_plural;
-
-	public static final String TEXT_GUIDANCE_PLURAL = LibraryUIResources.guidance_text_plural;
-
-	public static final String TEXT_GUIDELINE_PLURAL = LibraryUIResources.guideline_text_plural;
-
-	public static final String TEXT_ITERATION_PLURAL = LibraryUIResources.iteration_text_plural;
-
-	public static final String TEXT_METHOD_CONFIGURATON_PLURAL = LibraryUIResources.methodConfiguration_text_plural;
-
-	public static final String TEXT_METHOD_CONTENT_PLURAL = LibraryUIResources.methodContent_text_plural;
-
-	public static final String TEXT_METHOD_LIBARARY_PLURAL = LibraryUIResources.methodLibrary_text_plural;
-
-	public static final String TEXT_METHOD_PACKAGE_PLURAL = LibraryUIResources.methodPackage_text_plural;
-
-	public static final String TEXT_METHOD_PLUGIN_PLURAL = LibraryUIResources.methodPlugin_text_plural;
-
-	public static final String TEXT_MILESTONE_PLURAL = LibraryUIResources.milestone_text_plural;
-
-	public static final String TEXT_OUTCOME_PLURAL = LibraryUIResources.outcome_text_plural;
-
-	public static final String TEXT_PHASE_PLURAL = LibraryUIResources.phase_text_plural;
-
-	public static final String TEXT_PRACTICE_PLURAL = LibraryUIResources.practice_text_plural;
-
-	public static final String TEXT_PROCESS_PLURAL = LibraryUIResources.process_text_plural;
-
-	public static final String TEXT_PROCESS_CONTRIBUTION_PLURAL = LibraryUIResources.processContribution_text_plural;
-
-	public static final String TEXT_PROCESS_FAMILY_PLURAL = LibraryUIResources.processFamily_text_plural;
-
-	public static final String TEXT_PROCESS_PACKAGE_PLURAL = LibraryUIResources.processPackage_text_plural;
-
-	public static final String TEXT_REPORT_PLURAL = LibraryUIResources.report_text_plural;
-
-	public static final String TEXT_REUSABLE_ASSET_PLURAL = LibraryUIResources.reusableAsset_text_plural;
-
-	public static final String TEXT_ROADMAP_PLURAL = LibraryUIResources.roadmap_text_plural;
-
-	public static final String TEXT_ROLE_PLURAL = LibraryUIResources.role_text_plural;
-
-	public static final String TEXT_ROLE_DESCRIPTOR_PLURAL = LibraryUIResources.roleDescriptor_text_plural;
-
-	public static final String TEXT_ROLE_SET_PLURAL = LibraryUIResources.roleSet_text_plural;
-
-	public static final String TEXT_ROLE_SET_GROUPING_PLURAL = LibraryUIResources.roleSetGrouping_text_plural;
-
-	public static final String TEXT_STANDARD_CATEGORY_PLURAL = LibraryUIResources.standardCategory_text_plural;
-
-	public static final String TEXT_STEP_PLURAL = LibraryUIResources.step_text_plural;
-
-	public static final String TEXT_SUPPORTING_MATERIAL_PLURAL = LibraryUIResources.supportingMaterial_text_plural;
-
-	public static final String TEXT_TASK_PLURAL = LibraryUIResources.task_text_plural;
-
-	public static final String TEXT_TASK_DESCRIPTOR_PLURAL = LibraryUIResources.taskDescriptor_text_plural;
-
-	public static final String TEXT_TEAM_PROFILE_PLURAL = LibraryUIResources.teamProfile_text_plural;
-
-	public static final String TEXT_TEMPLATE_PLURAL = LibraryUIResources.template_text_plural;
-
-	public static final String TEXT_TERM_DEFINITION_PLURAL = LibraryUIResources.termDefinition_text_plural;
-
-	public static final String TEXT_TOOL_PLURAL = LibraryUIResources.tool_text_plural;
-
-	public static final String TEXT_TOOL_MENTOR_PLURAL = LibraryUIResources.toolMentor_text_plural;
-
-	public static final String TEXT_WHITEPAPER_PLURAL = LibraryUIResources.whitepaper_text_plural;
-
-	public static final String TEXT_WORK_PRODUCT_PLURAL = LibraryUIResources.workProduct_text_plural;
-
-	public static final String TEXT_WORK_PRODUCT_DESCRIPTOR_PLURAL = LibraryUIResources.workProductDescriptor_text_plural;
-
-	public static final String TEXT_WORK_PRODUCT_ELEMENT_PLURAL = LibraryUIResources.workProductElement_text_plural;
-
-	public static final String TEXT_WORK_PRODUCT_TYPE_PLURAL = LibraryUIResources.workProductType_text_plural;
-
-	private static final Map<Class, String> ELEMENT_TEXT = new HashMap<Class, String>();
-
-	private static final Map<Class, String> ELEMENT_TEXT_PLURAL = new HashMap<Class, String>();
-
-	static {
-		ELEMENT_TEXT.put(ActivityImpl.class, TEXT_ACTIVITY);
-		ELEMENT_TEXT.put(ArtifactImpl.class, TEXT_ARTIFACT);
-		ELEMENT_TEXT.put(CapabilityPatternImpl.class, TEXT_CAPABILITY_PATTERN);
-		ELEMENT_TEXT.put(ChecklistImpl.class, TEXT_CHECKLIST);
-		ELEMENT_TEXT.put(CompositeRoleImpl.class, TEXT_COMPOSITE_ROLE);
-		ELEMENT_TEXT.put(ConceptImpl.class, TEXT_CONCEPT);
-		ELEMENT_TEXT.put(ContentPackageImpl.class, TEXT_CONTENT_PACKAGE);
-		ELEMENT_TEXT.put(CustomCategoryImpl.class, TEXT_CUSTOM_CATEGORY);
-		ELEMENT_TEXT.put(DeliverableImpl.class, TEXT_DELIVERABLE);
-		ELEMENT_TEXT.put(DeliveryProcessImpl.class, TEXT_DELIVERY_PROCESS);
-		ELEMENT_TEXT.put(DisciplineImpl.class, TEXT_DISCIPLINE);
-		ELEMENT_TEXT
-				.put(DisciplineGroupingImpl.class, TEXT_DISCIPLINE_GROUPING);
-		ELEMENT_TEXT.put(DomainImpl.class, TEXT_DOMAIN);
-		ELEMENT_TEXT.put(EstimationConsiderationsImpl.class,
-				TEXT_ESTIMATION_CONSIDERATIONS);
-		ELEMENT_TEXT.put(ExampleImpl.class, TEXT_EXAMPLE);
-		ELEMENT_TEXT.put(GuidelineImpl.class, TEXT_GUIDELINE);
-		ELEMENT_TEXT.put(IterationImpl.class, TEXT_ITERATION);
-		ELEMENT_TEXT.put(MethodConfigurationImpl.class,
-				TEXT_METHOD_CONFIGURATON);
-		ELEMENT_TEXT.put(MethodLibraryImpl.class, TEXT_METHOD_LIBARARY);
-		ELEMENT_TEXT.put(MethodPackageImpl.class, TEXT_METHOD_PACKAGE);
-		ELEMENT_TEXT.put(MethodPluginImpl.class, TEXT_METHOD_PLUGIN);
-		ELEMENT_TEXT.put(MilestoneImpl.class, TEXT_MILESTONE);
-		ELEMENT_TEXT.put(OutcomeImpl.class, TEXT_OUTCOME);
-		ELEMENT_TEXT.put(PhaseImpl.class, TEXT_PHASE);
-		ELEMENT_TEXT.put(PracticeImpl.class, TEXT_PRACTICE);
-		ELEMENT_TEXT.put(ProcessFamilyImpl.class, TEXT_PROCESS_FAMILY);
-		ELEMENT_TEXT.put(ProcessPackageImpl.class, TEXT_PROCESS_PACKAGE);
-		ELEMENT_TEXT.put(ReportImpl.class, TEXT_REPORT);
-		ELEMENT_TEXT.put(ReusableAssetImpl.class, TEXT_REUSABLE_ASSET);
-		ELEMENT_TEXT.put(RoadmapImpl.class, TEXT_ROADMAP);
-		ELEMENT_TEXT.put(RoleImpl.class, TEXT_ROLE);
-		ELEMENT_TEXT.put(RoleDescriptorImpl.class, TEXT_ROLE_DESCRIPTOR);
-		ELEMENT_TEXT.put(RoleSetImpl.class, TEXT_ROLE_SET);
-		ELEMENT_TEXT.put(RoleSetGroupingImpl.class, TEXT_ROLE_SET_GROUPING);
-		ELEMENT_TEXT.put(StepImpl.class, TEXT_STEP);
-		ELEMENT_TEXT
-				.put(SupportingMaterialImpl.class, TEXT_SUPPORTING_MATERIAL);
-		ELEMENT_TEXT.put(TaskImpl.class, TEXT_TASK);
-		ELEMENT_TEXT.put(TaskDescriptorImpl.class, TEXT_TASK_DESCRIPTOR);
-		ELEMENT_TEXT.put(TeamProfileImpl.class, TEXT_TEAM_PROFILE);
-		ELEMENT_TEXT.put(TemplateImpl.class, TEXT_TEMPLATE);
-		ELEMENT_TEXT.put(TermDefinitionImpl.class, TEXT_TERM_DEFINITION);
-		ELEMENT_TEXT.put(TemplateImpl.class, TEXT_TEMPLATE);
-		ELEMENT_TEXT.put(ToolImpl.class, TEXT_TOOL);
-		ELEMENT_TEXT.put(ToolMentorImpl.class, TEXT_TOOL_MENTOR);
-		ELEMENT_TEXT.put(WhitepaperImpl.class, TEXT_WHITEPAPER);
-		ELEMENT_TEXT.put(WorkProductImpl.class, TEXT_WORK_PRODUCT);
-		ELEMENT_TEXT.put(WorkProductDescriptorImpl.class,
-				TEXT_WORK_PRODUCT_DESCRIPTOR);
-		ELEMENT_TEXT.put(WorkProductTypeImpl.class, TEXT_WORK_PRODUCT_TYPE);
-
-		// plural
-		ELEMENT_TEXT_PLURAL.put(ActivityImpl.class, TEXT_ACTIVITY_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ArtifactImpl.class, TEXT_ARTIFACT_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(CapabilityPatternImpl.class,
-				TEXT_CAPABILITY_PATTERN_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ChecklistImpl.class, TEXT_CHECKLIST_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(CompositeRoleImpl.class,
-				TEXT_COMPOSITE_ROLE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ConceptImpl.class, TEXT_CONCEPT_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ContentPackageImpl.class,
-				TEXT_CONTENT_PACKAGE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(CustomCategoryImpl.class,
-				TEXT_CUSTOM_CATEGORY_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(DeliverableImpl.class, TEXT_DELIVERABLE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(DeliveryProcessImpl.class,
-				TEXT_DELIVERY_PROCESS_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(DisciplineImpl.class, TEXT_DISCIPLINE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(DisciplineGroupingImpl.class,
-				TEXT_DISCIPLINE_GROUPING_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(DomainImpl.class, TEXT_DOMAIN_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(EstimationConsiderationsImpl.class,
-				TEXT_ESTIMATION_CONSIDERATIONS_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ExampleImpl.class, TEXT_EXAMPLE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(GuidelineImpl.class, TEXT_GUIDELINE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(IterationImpl.class, TEXT_ITERATION_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(MethodConfigurationImpl.class,
-				TEXT_METHOD_CONFIGURATON_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(MethodLibraryImpl.class,
-				TEXT_METHOD_LIBARARY_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(MethodPackageImpl.class,
-				TEXT_METHOD_PACKAGE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(MethodPluginImpl.class,
-				TEXT_METHOD_PLUGIN_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(MilestoneImpl.class, TEXT_MILESTONE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(OutcomeImpl.class, TEXT_OUTCOME_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(PhaseImpl.class, TEXT_PHASE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(PracticeImpl.class, TEXT_PRACTICE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ProcessFamilyImpl.class,
-				TEXT_PROCESS_FAMILY_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ProcessPackageImpl.class,
-				TEXT_PROCESS_PACKAGE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ReportImpl.class, TEXT_REPORT_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ReusableAssetImpl.class,
-				TEXT_REUSABLE_ASSET_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(RoadmapImpl.class, TEXT_ROADMAP_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(RoleImpl.class, TEXT_ROLE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(RoleDescriptorImpl.class,
-				TEXT_ROLE_DESCRIPTOR_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(RoleSetImpl.class, TEXT_ROLE_SET_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(RoleSetGroupingImpl.class,
-				TEXT_ROLE_SET_GROUPING_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(StepImpl.class, TEXT_STEP_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(SupportingMaterialImpl.class,
-				TEXT_SUPPORTING_MATERIAL_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(TaskImpl.class, TEXT_TASK_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(TaskDescriptorImpl.class,
-				TEXT_TASK_DESCRIPTOR_PLURAL);
-		ELEMENT_TEXT_PLURAL
-				.put(TeamProfileImpl.class, TEXT_TEAM_PROFILE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(TemplateImpl.class, TEXT_TEMPLATE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(TermDefinitionImpl.class,
-				TEXT_TERM_DEFINITION_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(TemplateImpl.class, TEXT_TEMPLATE_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ToolImpl.class, TEXT_TOOL_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(ToolMentorImpl.class, TEXT_TOOL_MENTOR_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(WhitepaperImpl.class, TEXT_WHITEPAPER_PLURAL);
-		ELEMENT_TEXT_PLURAL
-				.put(WorkProductImpl.class, TEXT_WORK_PRODUCT_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(WorkProductDescriptorImpl.class,
-				TEXT_WORK_PRODUCT_DESCRIPTOR_PLURAL);
-		ELEMENT_TEXT_PLURAL.put(WorkProductTypeImpl.class,
-				TEXT_WORK_PRODUCT_TYPE_PLURAL);
-	}
-
-	/**
-	 * Gets the display name for a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @param plural
-	 *            if <code>true</code>, return the plural form of the display
-	 *            name
-	 */
-	public static String getUIText(MethodElement element, boolean plural) {
-		if (plural) {
-			String label = (String) ELEMENT_TEXT_PLURAL.get(element.getClass());
-			return (label == null) ? element.getName() : label;
-		} else {
-			String label = (String) ELEMENT_TEXT.get(element.getClass());
-			return (label == null) ? element.getName() : label;
-		}
-	}
-
-	/**
-	 * Gets the display name for a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 */
-	public static String getUIText(MethodElement element) {
-		return getUIText(element, false);
-	}
-
-	/**
-	 * Gets the display name for a method element in lower case.
-	 * <p>
-	 * Note: This method does not applies to the German language since it has no
-	 * distinction between a upper case and lower case noun.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @param plural
-	 *            if <code>true</code>, return the plural form of the display
-	 *            name
-	 */
-	public static String getUITextLower(MethodElement element, boolean plural) {
-		String label;
-		if (plural) {
-			label = (String) ELEMENT_TEXT_PLURAL.get(element.getClass());
-			label = (label == null) ? element.getName() : label;
-		} else {
-			label = (String) ELEMENT_TEXT.get(element.getClass());
-			label = (label == null) ? element.getName() : label;
-		}
-
-		return StrUtil.toLower(label);
-	}
-
-	/**
-	 * Gets the display name for a method element in lower case.
-	 * <p>
-	 * Note: This method does not applies to the German language since it has no
-	 * distinction between a upper case and lower case noun.
-	 * 
-	 * @param element
-	 *            a method element
-	 */
-	public static String getUITextLower(MethodElement element) {
-		return getUITextLower(element, false);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIUtil.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIUtil.java
deleted file mode 100644
index fae4d44..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/LibraryUIUtil.java
+++ /dev/null
@@ -1,212 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.MessageFormat;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.ui.EPFUIResources;
-import org.eclipse.epf.ui.dialogs.RenameFileConflictDialog;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Helper utilities for implementing method library UI.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryUIUtil {
-
-	/**
-	 * Updates the application shell title to display the application name and
-	 * the default method library path.
-	 */
-	public static void updateShellTitle() {
-		IWorkbenchWindow window = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (window != null) {
-			Shell shell = window.getShell();
-			if (shell != null) {
-				String libPath = ""; //$NON-NLS-1$
-				if (LibraryService.getInstance().getCurrentMethodLibrary() != null) {
-					libPath = LibraryServiceUtil.getCurrentMethodLibraryPath();
-					if (libPath == null) {
-						libPath = LibraryService.getInstance()
-								.getCurrentMethodLibrary().getName();
-					}
-				}
-				String appName = Platform.getProduct().getName();
-				String appTitle = NLS.bind(
-						LibraryUIResources.application_title, new Object[] {
-								appName, libPath });
-				shell.setText(appTitle);
-			}
-		}
-	}
-
-	/**
-	 * Displays a dialog to prompts the user to save the open library if it has
-	 * been modified.
-	 * 
-	 * @return <code>SWT.YES</code>, <code>SWT.NO</code> or
-	 *         <code>SWT.CANCEL</code>
-	 */
-	public static int displaySaveDirtyEditorsDialog() {
-		ILibraryManager manager = (ILibraryManager) LibraryService
-				.getInstance().getCurrentLibraryManager();
-		if (manager != null && manager.isMethodLibraryModified()) {
-			int ret = MsgBox.prompt(LibraryUIResources.saveLibraryDialog_title,
-					LibraryUIResources.saveLibraryDialog_text, SWT.YES | SWT.NO
-							| SWT.CANCEL);
-			switch (ret) {
-			case SWT.YES:
-				try {
-					LibraryService.getInstance().saveCurrentMethodLibrary();
-				} catch (Exception e) {
-					MsgDialog dialog = LibraryUIPlugin.getDefault()
-							.getMsgDialog();
-					dialog.displayError(
-							LibraryUIResources.saveLibraryDialog_title,
-							LibraryUIResources.saveLibraryError_msg,
-							LibraryUIResources.error_reason, e);
-				}
-				return SWT.YES;
-			case SWT.NO:
-				// Discard all changes by resetting all resources as unchanged.
-				manager.discardMethodLibraryChanges();
-				return SWT.NO;
-			case SWT.CANCEL:
-				return SWT.CANCEL;
-			}
-		}
-
-		return SWT.CANCEL;
-	}
-
-	/**
-	 * Returns file URL for an attachment
-	 * 
-	 * @param attachment
-	 *            the file to attach
-	 * @param element
-	 *            the MethodElement referencing the file
-	 * @param copyFile
-	 *            if true, will copy the file (if it isn't already in the plugin
-	 *            path)
-	 * @return URL of the form ./../&lt;roles&gt;/resources/&lt;filename of
-	 *         attachment&gt;
-	 * @throws IOException
-	 */
-	public static String getURLForAttachment(Shell shell, File attachment,
-			MethodElement element, boolean copyFile) throws IOException {
-		String pluginDir = FileUtil.appendSeparator(new File(UmaUtil.getMethodPlugin(element)
-				.eResource().getURI().toFileString()).getParent());
-		File formatFile = null;
-		String resourceLoc = ResourceHelper.getAbsoluteElementResourcePath(element);
-		// File resourceDir = new File(resourceLoc);
-		formatFile = new File(resourceLoc + File.separator
-				+ attachment.getName());
-		if (copyFile) {
-			File newFile = copyResourceToLib(shell, attachment, element);
-			if (newFile != null) {
-				formatFile = new File(resourceLoc + File.separator
-						+ newFile.getName());
-			} else {
-				// user hit cancel
-				return null;
-			}
-			IResource wsResource = FileManager.getResourceForLocation(formatFile.getAbsolutePath());
-			if(wsResource != null) {
-				try {
-					FileManager.refresh(wsResource);
-				}
-				catch(Exception e) {
-					LibraryPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-
-		return ResourceHelper.getRelativePathToFileFromElement(element,
-				formatFile);
-
-	}
-	
-	/**
-	 * Copies the given file into the methodElement's resource folder.
-	 * Resolves filename conflict by prompting user to overwrite or rename
-	 * @param shell if null, will overwrite file without prompting
-	 * @param resource
-	 * @param methodElement
-	 * @return the File representing the user's final choice of library resource file
-	 */
-	public static File copyResourceToLib(Shell shell, File resource, MethodElement methodElement) {
-		String resourceLoc = ResourceHelper.getAbsoluteElementResourcePath(methodElement);
-
-		File libFile = new File(resourceLoc, resource.getName());
-	
-		if (resource.equals(libFile)) {
-			// source file is already in resources dir
-			return libFile;
-		}
-		
-		// if no shell, will just overwrite
-		if (libFile.exists() && shell != null) {
-			RenameFileConflictDialog dialog = new RenameFileConflictDialog(shell);
-			dialog.setMessageStr(MessageFormat.format(
-									EPFUIResources.Dialog_fileNameConflict_msg, 
-									new Object[] { resource.getName(), resourceLoc }));
-			dialog.setDestination(resourceLoc);
-			dialog.setFilePath(resource.getName());
-			dialog.open();
-
-			if (dialog.getReturnCode() == IDialogConstants.CANCEL_ID) {
-				return null;
-			} else {
-				libFile = new File(resourceLoc, dialog.getFilePath());
-			}
-		}
-
-		FileUtil.copyFile(resource, libFile);
-		
-		IResource wsResource = FileManager.getResourceForLocation(libFile.getAbsolutePath());
-		if(wsResource != null) {
-			try {
-				FileManager.refresh(wsResource);
-			}
-			catch(Exception e) {
-				LibraryPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-
-
-		return libFile;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/Resources.properties b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/Resources.properties
deleted file mode 100644
index 1bb4324..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/Resources.properties
+++ /dev/null
@@ -1,262 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Method Element Names (Singular)
-activity_text=Activity
-artifact_text=Artifact
-capabilityPattern_text=Capability Pattern
-checklist_text=Checklist
-checkItem_text=Check Item
-compositeRole_text=Composite Role
-concept_text=Concept
-contentPackage_text=Content Package
-customCategory_text=Custom Category
-deliverable_text=Deliverable
-deliveryProcess_text=Delivery Process
-descriptor_text=Descriptor
-discipline_text=Discipline
-disciplineGrouping_text=Discipline Grouping
-domain_text=Domain
-estimate_text=Estimate
-estimatingMetric_text=Estimating Metric
-estimationConsiderations_text=Estimation Considerations
-example_text=Example
-guidance_text=Guidance
-guideline_text=Guideline
-iteration_text=Iteration
-methodConfiguration_text=Method Configuration
-methodContent_text=Method Content
-methodLibrary_text=Method Library
-methodPackage_text=Method Package
-methodPlugin_text=Method Plug-in
-milestone_text=Milestone
-outcome_text=Outcome
-phase_text=Phase
-practice_text=Practice
-process_text=Process
-processContribution_text=Differential Process
-processFamily_text=Process Family
-processPackage_text=Process Package
-report_text=Report
-reusableAsset_text=Reusable Asset
-roadmap_text=Roadmap
-roleDescriptor_text=Role Descriptor
-role_text=Role
-roleSet_text=Role Set
-roleSetGrouping_text=Role Set Grouping
-standardCategory_text=Standard Category
-step_text=Step
-supportingMaterial_text=Supporting Material
-task_text=Task
-taskDescriptor_text=Task Descriptor
-teamProfile_text=Team Profile
-template_text=Template
-termDefinition_text=Term Definition
-tool_text=Tool
-toolMentor_text=Tool Mentor
-whitepaper_text=Whitepaper
-workProduct_text=Work Product
-workProductDescriptor_text=Work Product Descriptor
-workProductElement_text=Work Product Element
-workProductType_text=Work Product Kind
-
-# Method Element Names (Plural)
-activity_text_plural=Activities
-artifact_text_plural=Artifacts
-capabilityPattern_text_plural=Capability Patterns
-checklist_text_plural=Checklists
-checkItem_text_plural=Check Items
-compositeRole_text_plural=Composite Roles
-concept_text_plural=Concepts
-contentPackage_text_plural=Content Packages
-customCategory_text_plural=Custom Categories
-deliverable_text_plural=Deliverables
-deliveryProcess_text_plural=Delivery Processes
-descriptor_text_plural=Descriptors
-discipline_text_plural=Disciplines
-disciplineGrouping_text_plural=Discipline Groupings
-domain_text_plural=Domains
-estimate_text_plural=Estimates
-estimatingMetric_text_plural=Estimating Metrics
-estimationConsiderations_text_plural=Estimation Considerations
-example_text_plural=Examples
-guidance_text_plural=Guidances
-guideline_text_plural=Guidelines
-iteration_text_plural=Iterations
-methodConfiguration_text_plural=Method Configurations
-methodContent_text_plural=Method Contents
-methodLibrary_text_plural=Method Libraries
-methodPackage_text_plural=Method Packages
-methodPlugin_text_plural=Method Plug-ins
-milestone_text_plural=Milestones
-outcome_text_plural=Outcomes
-phase_text_plural=Phases
-practice_text_plural=Practices
-process_text_plural=Processes
-processContribution_text_plural=Differential Processes
-processFamily_text_plural=Process Families
-processPackage_text_plural=Process Packages
-report_text_plural=Reports
-reusableAsset_text_plural=Reusable Assets
-roadmap_text_plural=Roadmaps
-roleDescriptor_text_plural=Role Descriptors
-role_text_plural=Roles
-roleSet_text_plural=Role Sets
-roleSetGrouping_text_plural=Role Set Groupings
-standardCategory_text_plural=Standard Categories
-step_text_plural=Steps
-supportingMaterial_text_plural=Supporting Materials
-task_text_plural=Tasks
-taskDescriptor_text_plural=Task Descriptors
-teamProfile_text_plural=Team Profiles
-template_text_plural=Templates
-termDefinition_text_plural=Term Definitions
-tool_text_plural=Tools
-toolMentor_text_plural=Tool Mentors
-whitepaper_text_plural=Whitepapers
-workProduct_text_plural=Work Products
-workProductDescriptor_text_plural=Work Product Descriptors
-workProductElement_text_plural=Work Product Elements
-workProductType_text_plural=Work Product Kinds
-
-# Application title.
-application_title={0} - {1}
-
-# Open Method Library Wizard
-openLibraryWizard_title=Open Method Library
-openLibraryMainWizardPage_title=Specify a path containing a method library
-openLibraryMainWizardPage_title_2=Select a method library
-openLibraryMainWizardPage_text={0} stores methods and processes in a folder called \na method library. Select a method library folder to use for this session.
-pathLabel_text=Path:
-nameLabel_text=Name:
-uriLabel_text=URI:
-openUnlistedLibraryCheckbox_text=Open a method library that is not listed above
-libraryTypeLabel_text=Type:
-libraryLabel_text=Library:
-browseButton_text=Browse...
-promptForLibraryCheckbox_text=Use this as the default and do not ask again.
-openLibraryDialog_newLibrary_text=No method library exists at ''{0}''.\nA new method library will be created and opened for you at the specified directory.\n\nClick OK to proceed or Cancel to specify another method library path.
-
-# Select Method Library Folder Dialog
-selectLibraryFolderDialog_title=Select Method Library
-selectLibraryFolderDialog_text=Select a method library folder.
-
-# Open Library Progress Message
-openingLibraryTask_name=Opening method library...
-
-# Open Method Library Error Dialog
-openLibraryError_msg=IUPL0301E: Unable to create the method library.
-openLibraryInternlError_reason=An internal error has occurred.
-openLibraryError_reason1=The specified method library path ''{0}'' is invalid.
-openLibraryError_reason2=A method library already exists in ''{0}''.
-openLibraryError_reason3=The specified method library folder ''{0}'' cannot be created.
-openLibraryError_reason4=The specified method library folder is a plug-in or configuration specification export folder.
-openLibraryError_advice=Select OK to specify another method library path.
-
-# Open Method Library Error Messages
-invalidLibraryPath_msg=IUPL0302E: Unable to open the specified method library.
-invalidLibraryPath_reason=The selected method library folder is invalid, does not exist, or you do not have the proper permission to access it.\n\nClick OK to select another library folder.
-
-# Read-only Project File Error Dialog
-readOnlyProjectFile_text=IUPL0304E: ''{0}'' is read-only. Make it writable before continuing.
-retryButton_text=Retry
-cancelButton_text=Cancel
-
-# Version Mismatch Dialog
-versionMismatchDialog_text=IUPL305E: The selected library cannot be opened. You must upgrade {0} to version {1} or higher in order to open this library.
-versionMismatchDialog_text_unknown=IUPL306E: The selected library cannot be opened. You must upgrade {0} to a higher version in order to open this library.
-
-# Upgrade Method Library Dialog
-upgradeLibraryDialog_title=Upgrade Method Library
-upgradeLibraryDialog_text=The library you have selected needs to be upgraded to the new library structure.\n\nDo you want to proceed with the upgrade?
-upgradingLibraryTask_name=Upgrading method library...
-
-# Upgrade Library Error Dialog
-upgradeLibraryError_msg=IUPL0306E: Failed to upgrade the method library. Please see the log file for more details.
-
-# Switch Configuration Dialog
-switchConfigDialog_title=Switch Configuration
-switchConfigDialog_text=Do you want to switch the current configuration to the default configuration, ''{0}'', associated with the selected process?
-	
-# Configuration Combo
-currentConfigLabel_text=Current configuration:
-selectConfigLabel_text=Select a configuration
-
-# Delete Files Confirmation Message
-deleteFilesConfirmation_msg=The specified path ''{0}'' already exists. All files in the folder will be deleted. Do you want to proceed?
-
-# Paths/Files Error Messages
-deleteFilesError_reason=The path ''{0}'' contains one or more files that cannot be deleted.\n\nSelect another path and try again.
-createPathError_reason=Unable to create path ''{0}''.\n\nSelect another path and try again.
-invalidPath_msg=The specified path is not valid.
-overrideCurrentLibraryError_msg0=You cannot export to a path containing current method library, please select another path and try again.
-
-# Backup Library Dialog
-backupLibraryDialog_title=Backup Library
-backupLibraryDialog_text=It is strongly recommended that you back up the current method library before proceeding.\n\nClick OK to create a backup copy of the library in the specified directory. Click Skip to continue without creating the backup.
-backingUpLibraryTask_name=Backing up library files ...
-
-# Copy Library Dialog
-copyLibraryDialog_title=Copy Library
-copyLibraryDialog_text_readOnlyLib=The library is not writable. Click Copy to create a writable copy of the library in the specified directory. Click Skip to continue without creating the copy.
-copyLibraryTask_name=Making a copy of the library files ...
-copyLibraryDialog_copyButton_text=Copy
-
-# Path Selection Dialog
-pathSelectionError_msg=Unable to create directory
-okButton_text=OK
-skipButton_text=Skip
-
-# Process Editor preferences
-alwaysButton_text=Always
-neverButton_text=Never
-promptButton_text=Prompt
-
-# Add Link Dialog
-linkToURL_name=URL
-linkToFile_name=File
-elementLink_name=Method element
-elementLinkWithType_name=Method element with type prefix
-elementLinkWithUserText_name=Method element with custom text
-
-# Convert Activity Type Dialog
-convertActivityDialog_title=Convert Activity Type
-convertActivityDialog_text=Select the target activity type.
-unsupportedActivityType_msg=IUPL0307E: This activity cannot be converted to another type.
-unsupportedActivityType_reason=There is no compatible activity type for {0}.
-
-# Select Process Wizard Page
-selectProcessWizardPage_title=Select process
-selectProcessWizardPage_text=Select a capability pattern or delivery process to export.
-processesLabel_text=Processes:
-briefDescriptionLabel_text=Brief description:
-
-# Export Process Wizard Error Message.
-noOpenLibraryWarning_msg=IUPL0308E: No method library is currently opened. Click Cancel, open a method library or create a new one, and run this wizard again. 
-
-# Moved from Authoring UI plug-in to avoid Authoring UI dependency
-errorDialog_title=Error
-MethodElementDeleteAction_deleteconfirm_text=Are you sure you want to delete ''{0}''?
-confirmDeleteDialog_title=Confirm Deletion
-confirmDeleteDialog_msg=Are you sure you want to delete ''{0}''?
-confirmDeleteDialog_msgWithReference=Are you sure you want to delete ''{0}''?\n\nThe following element(s) contain references to the item(s) to be deleted: {1}
-ProcessDeleteAction_deletecofirm_text=This will save the current editor and the change will be permanent. Are you sure you want to delete ''{0}''?
-
-# Save Method Library Dialog
-saveLibraryDialog_title=Save Method Library
-saveLibraryDialog_text=The current method library has been modified. Do you want to save the changes?
-
-# Save Method Library Error Messages
-saveLibraryError_msg=IUPL0308E: The method library cannot be saved.
-error_reason=An error has occurred.\n\nClick Details for more information.
-
-
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ConfigurationContributionItem.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ConfigurationContributionItem.java
deleted file mode 100644
index dd0d67a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ConfigurationContributionItem.java
+++ /dev/null
@@ -1,346 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.prefs.PreferenceUtil;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.CoolItem;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * Contributes a method configuration comboxbox to the system toolbar.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigurationContributionItem extends ContributionItem {
-
-	private static Combo configCombo;
-
-	private static ComboViewer configComboViewer;
-
-	protected ToolItem item;
-
-	protected CoolItem coolItem;
-
-	protected ILibraryServiceListener libSvcListener;
-
-	// The content provider.
-	protected IStructuredContentProvider contentProvider;
-
-	// The label provider.
-	protected ILabelProvider labelProvider;
-	
-	protected ISelectionChangedListener postSelectionChangedListener = new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			performSelectionChanged();
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationContributionItem(IAction action) {
-		super();
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.ToolBar,
-	 *      int)
-	 */
-	public void fill(ToolBar parent, int index) {
-		item = new ToolItem(parent, SWT.SEPARATOR);
-		Control box = createControl(parent);
-		item.setControl(box);
-		item.setWidth(240);
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.CoolBar,
-	 *      int)
-	 */
-	public void fill(CoolBar coolBar, int index) {
-		Control box = createControl(coolBar);
-
-		if (index >= 0) {
-			coolItem = new CoolItem(coolBar, SWT.DROP_DOWN, index);
-		} else {
-			coolItem = new CoolItem(coolBar, SWT.DROP_DOWN);
-		}
-
-		// Set the back reference.
-		coolItem.setData(this);
-
-		// Add the toolbar to the CoolItem widget.
-		coolItem.setControl(box);
-
-		// If the toolbar item exists then adjust the size of the cool item.
-		Point toolBarSize = box.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-
-		// Set the preferred size to the size of the toolbar plus trim.
-		coolItem.setMinimumSize(toolBarSize);
-		coolItem.setPreferredSize(toolBarSize);
-		coolItem.setSize(toolBarSize);
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Composite)
-	 */
-	public void fill(Composite parent) {
-		createControl(parent);
-	}
-
-	/**
-	 * Creates the control.
-	 */
-	private Control createControl(Composite parent) {
-		configCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
-		configCombo.setVisibleItemCount(10);
-		configCombo.setEnabled(true);
-		configComboViewer = new ComboViewer(configCombo);
-
-		contentProvider = new AdapterFactoryContentProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public Object[] getElements(Object object) {
-				List<Object> configsList = new ArrayList<Object>();
-				configsList.addAll(Arrays.asList(LibraryServiceUtil
-						.getMethodConfigurations(LibraryService.getInstance()
-								.getCurrentMethodLibrary())));
-				Collections.sort(configsList, Comparators.DEFAULT_COMPARATOR);
-				if (LibraryService.getInstance()
-						.getCurrentMethodConfiguration() == null) {
-					configsList.add(0,
-							LibraryUIResources.selectConfigLabel_text);
-				}
-				return configsList.toArray();
-			}
-		};
-
-		labelProvider = new AdapterFactoryLabelProvider(
-				TngAdapterFactory.INSTANCE
-						.getNavigatorView_ComposedAdapterFactory()) {
-			public String getText(Object object) {
-				if (object instanceof String) {
-					return (String) object;
-				} else if (object instanceof MethodConfiguration) {
-					return ((MethodConfiguration) object).getName();
-				} else
-					return object.toString();
-			}
-		};
-
-		configComboViewer.setContentProvider(contentProvider);
-		configComboViewer.setLabelProvider(labelProvider);
-		configComboViewer.setInput(LibraryService.getInstance()
-				.getCurrentMethodLibrary());
-
-		String savedConfigName = PreferenceUtil.getSavedLastConfig();
-		MethodConfiguration savedConfig = LibraryServiceUtil
-				.getMethodConfiguration(LibraryService.getInstance()
-						.getCurrentMethodLibrary(), savedConfigName);
-		
-		if (savedConfig != null) {
-			configComboViewer
-					.setSelection(new StructuredSelection(savedConfig));
-		} else {
-			configComboViewer.setSelection(new StructuredSelection(
-					LibraryUIResources.selectConfigLabel_text));
-		}
-
-		configComboViewer
-			.addPostSelectionChangedListener(postSelectionChangedListener);
-
-		configComboViewer.getControl().addDisposeListener(
-				new DisposeListener() {
-					public void widgetDisposed(DisposeEvent event) {
-						dispose();
-					}
-				});
-
-
-		libSvcListener = new ILibraryServiceListener() {
-
-			public void configurationSet(MethodConfiguration config) {
-				selectConfiguration(config);
-			}
-
-			public void libraryClosed(MethodLibrary library) {
-				configComboViewer.setInput(null);
-			}
-
-			public void libraryCreated(MethodLibrary library) {
-				configComboViewer.setInput(library);
-				selectConfiguration(null);
-			}
-
-			public void libraryOpened(MethodLibrary library) {
-				configComboViewer.setInput(library);
-				configComboViewer.setSelection(new StructuredSelection(
-						LibraryUIResources.selectConfigLabel_text), true);
-				refresh();
-			}
-
-			public void libraryReopened(MethodLibrary library) {
-				if (library != configComboViewer.getInput()) {
-					configComboViewer.setInput(library);
-					refresh();
-				}
-			}
-
-			public void librarySet(MethodLibrary library) {
-				if (library != configComboViewer.getInput()) {
-					configComboViewer.setInput(library);
-					if (library == null) {
-						selectConfiguration(null);
-					} else {
-						refresh();
-					}
-				}
-			}
-
-		};
-		LibraryService.getInstance().addListener(libSvcListener);
-
-		return configCombo;
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#void setVisibile(boolean)
-	 */
-	public void setVisibile(boolean visible) {
-		if (visible) {
-			LibraryService.getInstance().addListener(libSvcListener);
-		} else {
-			LibraryService.getInstance().removeListener(libSvcListener);
-		}
-		super.setVisible(visible);
-	}
-
-	/**
-	 * Returns the currently selected method configuration
-	 */
-	private static MethodConfiguration getSelectedConfig() {
-		IStructuredSelection selection = (IStructuredSelection) configComboViewer
-				.getSelection();
-		Object object = selection.getFirstElement();
-		if (object instanceof MethodConfiguration) {
-			return (MethodConfiguration) object;
-		}
-		return null;
-	}
-
-	/**
-	 * Return currently selected method configuration name
-	 */
-	private static String getCurrentSelectedConfigName() {
-		IStructuredSelection selection = (IStructuredSelection) configComboViewer
-				.getSelection();
-		Object object = selection.getFirstElement();
-		if (object != null && object instanceof MethodConfiguration) {
-			return ((MethodConfiguration) object).getName();
-		}
-		if (object instanceof String)
-			return (String) object;
-		return ""; //$NON-NLS-1$
-	}
-
-	private static void performSelectionChanged() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() != null) {
-			MethodConfiguration config = getSelectedConfig();
-			if (config != LibraryService.getInstance()
-					.getCurrentMethodConfiguration()) {
-				LibraryService.getInstance().setCurrentMethodConfiguration(config);
-			}
-			PreferenceUtil.saveSelectedConfigIntoPersistence(getCurrentSelectedConfigName());
-			refresh();
-		}
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#dispose()
-	 */
-	public void dispose() {
-		if (libSvcListener != null) {
-			LibraryService.getInstance().removeListener(libSvcListener);
-		}
-		
-		if (configComboViewer != null) {
-			configComboViewer
-			.removePostSelectionChangedListener(postSelectionChangedListener);
-		}
-		
-		super.dispose();
-	}
-
-	/**
-	 * Refreshes the configuration combo.
-	 */
-	private static void refresh() {
-		configComboViewer.refresh();
-	}
-
-	/**
-	 * Select a configuration in configuration combo box.
-	 * 
-	 * @param config
-	 */
-	private static void selectConfiguration(MethodConfiguration config) {
-		//NameCache.getInstance().clear();
-		if (config != null && config == getSelectedConfig()) {
-			return;
-		}
-		if (config != null) {
-			configComboViewer.setSelection(new StructuredSelection(config));
-		} else {
-			// Perform a refresh to add the "Select a configuration"
-			// string to the combo.
-			refresh();
-			configComboViewer.setSelection(new StructuredSelection(
-					LibraryUIResources.selectConfigLabel_text), true);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ILibraryAction.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ILibraryAction.java
deleted file mode 100644
index 6d037ad..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ILibraryAction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.actions;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.IAction;
-
-/**
- * The interface for a Library action.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface ILibraryAction extends IAction {
-//	void notifyPropertyChange(String propertyName, Object oldValue,
-//			Object newValue);
-	
-	void setProgressMonitor(IProgressMonitor monitor);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/LibraryLockingOperationRunner.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/LibraryLockingOperationRunner.java
deleted file mode 100644
index 715f8d3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/LibraryLockingOperationRunner.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.persistence.util.LibrarySchedulingRule;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-/**
- * Runs operation that locks the library for the duration of its execution
- * 
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class LibraryLockingOperationRunner implements IRunnableContext {
-
-	private IProgressMonitor progressMonitor;
-	
-	public LibraryLockingOperationRunner() {
-	}	
-	
-	private void doRun(final IRunnableWithProgress runnable, final boolean workUnknown) throws InvocationTargetException,
-			InterruptedException {
-        final InvocationTargetException[] iteHolder = new InvocationTargetException[1];
-        try {
-            IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
-                public void run(IProgressMonitor pm) throws CoreException {
-                    try {
-                        if(workUnknown) {
-        					pm.beginTask("", 2); //$NON-NLS-1$
-        					pm.worked(1);
-        					try {
-        						runnable.run(pm);
-        						pm.worked(2);
-        					}
-        					finally {
-        						pm.done();
-        					}
-                        }
-                        else {
-                        	runnable.run(pm);
-                        }
-                    } catch (InvocationTargetException e) {
-                        // Pass it outside the workspace runnable
-                        iteHolder[0] = e;
-                    } catch (InterruptedException e) {
-                        // Re-throw as OperationCanceledException, which will be
-                        // caught and re-thrown as InterruptedException below.
-                        throw new OperationCanceledException(e.getMessage());
-                    }
-                    // CoreException and OperationCanceledException are propagated
-                }
-            };
-            ResourcesPlugin.getWorkspace().run(workspaceRunnable,
-            		new LibrarySchedulingRule(LibraryService.getInstance().getCurrentMethodLibrary()),
-            		IWorkspace.AVOID_UPDATE, getProgressMonitor());
-        } catch (CoreException e) {
-            throw new InvocationTargetException(e);
-        } catch (OperationCanceledException e) {
-            throw new InterruptedException(e.getMessage());
-        }
-        // Re-throw the InvocationTargetException, if any occurred
-        if (iteHolder[0] != null) {
-            throw iteHolder[0];
-        }
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
-	 */
-	public void run(boolean fork, boolean cancelable,
-			final IRunnableWithProgress runnable) throws InvocationTargetException,
-			InterruptedException {
-		doRun(runnable, false);
-	}
-
-	public void run(IRunnableWithProgress runnable) {
-		try {
-			doRun(runnable, true);
-		} catch (InvocationTargetException e) {
-			Throwable cause = e.getCause();
-			if(cause instanceof RuntimeException) {
-				throw (RuntimeException)cause;
-			}
-			else {
-				if(cause == null) {
-					cause = e;
-				}
-				LibraryUIPlugin.getDefault().getLogger().logError(cause);
-				try {
-					String msg = cause.getMessage() != null ? cause.getMessage() : cause.toString(); 
-					LibraryUIPlugin.getDefault().getMsgDialog().displayError(LibraryUIResources.errorDialog_title, msg, cause);
-				}
-				catch(Exception ex) {
-					
-				}				
-			}
-		} catch (InterruptedException e) {
-			return;
-		}
-	}
-	
-	/**
-	 * @return
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		if(progressMonitor == null) {
-			progressMonitor = new NullProgressMonitor();
-		}
-		return progressMonitor;
-	}
-
-	/**
-	 * @param progressMonitor the progressMonitor to set
-	 */
-	public void setProgressMonitor(IProgressMonitor progressMonitor) {
-		this.progressMonitor = progressMonitor;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/MethodElementDeleteAction.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/MethodElementDeleteAction.java
deleted file mode 100644
index ae87f2b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/MethodElementDeleteAction.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.actions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collection;
-import java.util.EventObject;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.action.DeleteAction;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-
-/**
- * Action to delete method element
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodElementDeleteAction extends DeleteAction implements ILibraryAction {
-	protected Collection<?> selection = null;
-
-	protected boolean confirm = true;
-
-	private IProgressMonitor progressMonitor;
-
-	/**
-	 * Deletes method element
-	 *
-	 */
-	public MethodElementDeleteAction() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param domain
-	 */
-	public MethodElementDeleteAction(EditingDomain domain) {
-		super(domain);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param domain
-	 * @param confirm
-	 *            flag indicates whether user confirmation is required. If
-	 *            <code>false</code>, executing this command will not
-	 *            interact with user and the default behavior will apply.
-	 */
-	public MethodElementDeleteAction(EditingDomain domain, boolean confirm) {
-		this(domain);
-		this.confirm = confirm;
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.DeleteAction#createCommand(java.util.Collection)
-	 */
-	public Command createCommand(Collection<?> selection) {
-		this.selection = selection;
-
-		DeleteMethodElementCommand cmd = createMethodElementDeleteCommand();
-		cmd
-				.addCommandListener(new DeleteMethodElementCommand.CommandListener() {
-
-					public void notifyExecuted(EventObject eventObject) {
-						DeleteMethodElementCommand cmd = (DeleteMethodElementCommand) eventObject
-								.getSource();
-						didDelete(cmd.getResult());
-					}
-
-					public void notifyFailure(EventObject eventObject) {
-						deleteFailed();
-					}
-
-				});
-		return cmd;
-	}
-
-	protected void deleteFailed() {
-	}
-
-	/**
-	 * Create a command to delete method element
-	 * @return command
-	 */
-	public DeleteMethodElementCommand createMethodElementDeleteCommand() {
-		return new DeleteMethodElementCommand(super.createCommand(selection),
-				selection, confirm) {
-			protected void loadOppositeFeatures(List oppositeFeatures,
-					Set deletedGUIDs) {
-				ILibraryResourceSet resourceSet = (ILibraryResourceSet) LibraryService
-						.getInstance().getCurrentMethodLibrary().eResource()
-						.getResourceSet();
-				resourceSet
-						.loadOppositeFeatures(oppositeFeatures, deletedGUIDs);
-			}
-		};
-	}
-
-	protected void didDelete(Collection<?> deletedElements) {
-
-	}
-
-	/**
-	 * Get confirmation message to delete
-	 * @return
-	 */
-	protected String getDeleteConfirmationMessage() {
-		return LibraryUIResources.MethodElementDeleteAction_deleteconfirm_text; 
-	}
-
-	protected boolean confirmDelete() {
-		if (!confirm) {
-			return true;
-		}
-
-		if (selection == null || selection.isEmpty())
-			return false;
-
-		int i = 0;
-		StringBuffer elementStr = new StringBuffer();
-
-		for (Iterator<?> it = selection.iterator(); it.hasNext();) {
-			Object obj = TngUtil.unwrap(it.next());
-			if (obj instanceof MethodElement) {
-				if (i > 0) {
-					elementStr.append(", "); //$NON-NLS-1$
-				}
-				elementStr.append(getDisplayString((MethodElement)obj));
-
-				i++;
-			}
-		}
-
-		Object[] args = { elementStr.toString() };
-		String msg = LibraryUIResources.bind(LibraryUIResources.confirmDeleteDialog_msg, args); // NON-NLS-1$
-
-		String title = LibraryUIResources.confirmDeleteDialog_title; 
-		boolean deleteOk = LibraryUIPlugin.getDefault().getMsgDialog()
-				.displayConfirmation(title, msg);
-		return deleteOk;
-	}
-
-	protected String getDisplayString(MethodElement element){
-		return element.getName();
-	}
-	/**
-	 * @see org.eclipse.epf.authoring.ui.actions.ILibraryAction#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		progressMonitor = monitor;
-	}
-
-	/**
-	 * @return the progressMonitor
-	 */
-	protected IProgressMonitor getProgressMonitor() {
-		if(progressMonitor == null) {
-			progressMonitor = new NullProgressMonitor();
-		}
-		return progressMonitor;
-	}
-	
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#run()
-	 */
-	public void run() {
-		LibraryLockingOperationRunner runner = new LibraryLockingOperationRunner();
-		runner.setProgressMonitor(getProgressMonitor());
-		runner.run(new IRunnableWithProgress() {
-
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				performDelete();
-			}
-			
-		});
-	}
-	
-	/**
-	 * Performs delete
-	 *
-	 */
-	protected void performDelete() {
-		super.run();		
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/OpenLibraryAction.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/OpenLibraryAction.java
deleted file mode 100644
index 4f17555..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/OpenLibraryAction.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.actions;
-
-import org.eclipse.epf.library.ui.LibraryUIUtil;
-import org.eclipse.epf.library.ui.wizards.OpenLibraryWizard;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Implements the Open Library action.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class OpenLibraryAction implements IWorkbenchWindowActionDelegate {
-
-	private IWorkbenchWindow window;
-
-	/**
-	 * @see IWorkbenchWindowActionDelegate#init
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-
-	/**
-	 * @see IWorkbenchWindowActionDelegate#selectionChanged
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/**
-	 * @see IWorkbenchWindowActionDelegate#run
-	 */
-	public void run(IAction action) {
-		int dirtyCount = 0;
-		IEditorReference[] list = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage()
-				.getEditorReferences();
-		for (int i = 0; i < list.length; i++) {
-			if (list[i].isDirty()) {
-				dirtyCount++;
-			}
-		}
-
-		if (dirtyCount == 1) {
-			boolean rc = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().closeAllEditors(true);
-			if (!rc) {
-				return;
-			}
-		} else if (dirtyCount > 1) {
-			switch (LibraryUIUtil.displaySaveDirtyEditorsDialog()) {
-			case SWT.YES:
-				PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-						.getActivePage().closeAllEditors(true);
-				break;
-			case SWT.NO:
-				PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-						.getActivePage().closeAllEditors(false);
-				break;
-			case SWT.CANCEL:
-				return;
-			}
-		}
-
-		OpenLibraryWizard wizard = new OpenLibraryWizard();
-		wizard.init(window.getWorkbench(), null);
-		Shell shell = Display.getCurrent().getActiveShell();
-		WizardDialog dialog = new WizardDialog(shell, wizard);
-		dialog.create();
-		dialog.open();
-	}
-
-	/**
-	 * @see IWorkbenchWindowActionDelegate#dispose
-	 */
-	public void dispose() {
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ProcessDeleteAction.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ProcessDeleteAction.java
deleted file mode 100644
index 7dcd059..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/ProcessDeleteAction.java
+++ /dev/null
@@ -1,330 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.command.DeleteRoleDescriptor;
-import org.eclipse.epf.library.edit.process.command.DeleteTaskDescriptor;
-import org.eclipse.epf.library.edit.process.command.DeleteTeamProfile;
-import org.eclipse.epf.library.edit.process.command.DeleteUnusedDescriptorsCommand;
-import org.eclipse.epf.library.edit.process.command.DeleteWorkProductDescriptor;
-import org.eclipse.epf.library.edit.process.command.ProcessElementDeleteCommand;
-import org.eclipse.epf.library.edit.process.command.RemoveUnusedDescriptorsCommand;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * Implements the delete action for the process elements.
- * 
- * @author Shilpa Toraskar
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ProcessDeleteAction extends MethodElementDeleteAction {
-
-	private boolean deletionConfirmed = false;
-
-	private HashSet<Descriptor> removedDescriptors;
-
-	/**
-	 * Creates a new instance
-	 */
-	public ProcessDeleteAction() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance
-	 * 
-	 * @param domain
-	 *            the editing domain
-	 */
-	public ProcessDeleteAction(EditingDomain domain) {
-		super(domain);
-	}
-
-	/**
-	 * Creates a new instance
-	 * 
-	 * @param domain
-	 *            the editing domain
-	 * @param confirm
-	 *            if <code>true</code>, displays a prompt to ask for user
-	 *            confirmation
-	 */
-	public ProcessDeleteAction(EditingDomain domain, boolean confirm) {
-		super(domain, confirm);
-	}
-
-	/**
-	 * @see MethodElementDeleteAction#createMethodElementDeleteCommand()
-	 */
-	public DeleteMethodElementCommand createMethodElementDeleteCommand() {
-		return new ProcessElementDeleteCommand(RemoveCommand.create(domain,
-				selection), selection, confirm);
-	}
-
-	/**
-	 * Runs the delete action given the action manager
-	 * 
-	 * @param actionMgr
-	 *            the action manager
-	 */
-	public void run(IActionManager actionMgr) {
-		if (confirmDelete()) {
-			for (Iterator itor = selection.iterator(); itor.hasNext();) {
-				// remove references
-				removeReferences(actionMgr, itor.next());
-			}
-
-			// delete element
-			domain.getCommandStack().execute(command);
-		}
-	}
-
-	protected void saveCurrentEditor() {
-	}
-
-	/**
-	 * @see MethodElementDeleteAction#getDeleteConfirmationMessage()
-	 */
-	protected String getDeleteConfirmationMessage() {
-		return LibraryUIResources.ProcessDeleteAction_deletecofirm_text; 
-	}
-
-	protected Command createDeleteUnusedDescriptorsCommand(Collection<Descriptor> descriptors, Collection<?> deletedElements) {
-		return new DeleteUnusedDescriptorsCommand(
-				descriptors, false, deletedElements) {
-
-			protected Command delete(List elements) {
-				return ProcessDeleteAction.delete(elements);
-			}
-
-			// protected void selectDescriptorsToDelete(List
-			// descriptorsToDelete) {
-			// String msg =
-			// AuthoringUIResources.ProcessDeleteAction_selectDescriptorsToDelete;
-			// Object[] descriptors =
-			// ReferenceSelection.getReferences(descriptorsToDelete,
-			// msg);
-			// descriptorsToDelete.retainAll(Arrays.asList(descriptors));
-			// }
-		};
-	}
-	
-	/**
-	 * @see MethodElementDeleteAction#run()
-	 */
-	public void run() {
-		if (confirmDelete()) {
-			// collection the related descriptors before the elements got
-			// deleted
-			//
-			Collection<Descriptor> descriptors = new HashSet<Descriptor>();
-			for (Iterator<?> iter = selection.iterator(); iter.hasNext();) {
-				Object element = iter.next();
-				addRelatedDescriptors(descriptors, element);
-			}
-
-			Command cmd = command;
-
-			// delete elements
-			//
-			cmd.execute();
-
-			// Check reference confirmation and if confirmed set
-			// deletionconfirmed to true
-			// If any deletion happens in sequence, will check for
-			// deletionconfirmed variable
-			// and proceeds remaining deletion sequence. (eg:
-			// AbstractDiagramEditor - DeleteAction()).
-			if (((DeleteMethodElementCommand) cmd).executed) {
-				deletionConfirmed = true;
-
-				Collection<?> deletedElements = cmd.getResult();
-				Command deleteUnusedDescriptorsCommand = createDeleteUnusedDescriptorsCommand(descriptors, deletedElements);
-				try {
-					deleteUnusedDescriptorsCommand.execute();
-				} catch (OperationCanceledException e) {
-					//
-				} finally {
-					deleteUnusedDescriptorsCommand.dispose();
-				}
-			}
-
-			// save the current editor
-			//
-			saveCurrentEditor();
-		}
-	}
-
-	private static void addRelatedDescriptors(
-			Collection<Descriptor> descriptors, Object element) {
-		if (element instanceof TaskDescriptor) {
-			TaskDescriptor taskDesc = (TaskDescriptor) element;
-			descriptors.addAll(taskDesc.getAdditionallyPerformedBy());
-			descriptors.addAll(taskDesc.getAssistedBy());
-			descriptors.add(taskDesc.getPerformedPrimarilyBy());
-			descriptors.addAll(taskDesc.getMandatoryInput());
-			descriptors.addAll(taskDesc.getExternalInput());
-			descriptors.addAll(taskDesc.getOptionalInput());
-			descriptors.addAll(taskDesc.getOutput());
-		} else if (element instanceof RoleDescriptor) {
-			RoleDescriptor roleDesc = (RoleDescriptor) element;
-			descriptors.addAll(AssociationHelper
-					.getAssistedTaskDescriptors(roleDesc));
-			descriptors.addAll(AssociationHelper
-					.getAdditionalTaskDescriptors(roleDesc));
-			descriptors.addAll(AssociationHelper
-					.getPrimaryTaskDescriptors(roleDesc));
-			descriptors.addAll(roleDesc.getResponsibleFor());
-		}
-	}
-
-	private void removeReferences(IActionManager actionMgr, Object obj) {
-		IResourceAwareCommand cmd = null;
-		boolean force = !confirm;
-		if (obj instanceof TaskDescriptor) {
-			cmd = new DeleteTaskDescriptor((TaskDescriptor) obj, force);
-		} else if (obj instanceof RoleDescriptor) {
-			cmd = new DeleteRoleDescriptor((RoleDescriptor) obj, force);
-		} else if (obj instanceof WorkProductDescriptor) {
-			cmd = new DeleteWorkProductDescriptor((WorkProductDescriptor) obj,
-					force);
-		} else if (obj instanceof TeamProfile) {
-			cmd = new DeleteTeamProfile((TeamProfile) obj);
-		}
-		if (cmd != null) {
-			if (actionMgr != null) {
-				actionMgr.execute(cmd);
-
-			} else {
-				cmd.execute();
-			}
-			if (cmd instanceof RemoveUnusedDescriptorsCommand) {
-				removedDescriptors
-						.addAll(((RemoveUnusedDescriptorsCommand) cmd)
-								.getRemovedDescriptors());
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.ui.action.CommandActionHandler#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean updateSelection(IStructuredSelection selection) {
-		boolean ret = super.updateSelection(filterSelection(selection));
-		return ret;
-	}
-
-	/**
-	 * Filters selection.
-	 * 
-	 * @param selection
-	 * @return New Selection
-	 */
-	public static IStructuredSelection filterSelection(
-			IStructuredSelection selection) {
-		ArrayList<Object> list = new ArrayList<Object>();
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof BreakdownElementWrapperItemProvider
-					&& ((BreakdownElementWrapperItemProvider) element)
-							.isReadOnly()) {
-				continue;
-			} else {
-				list.add(element);
-			}
-		}
-
-		return new StructuredSelection(list);
-	}
-
-	/**
-	 * If deletion confirmed, set confirmation and child process can use the
-	 * confirmation to proceed for the deletion of remaining.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isDeletionConfirmed() {
-		return deletionConfirmed;
-	}
-
-	/**
-	 * Return command
-	 * 
-	 * @return cmd
-	 */
-	protected Command getCommand() {
-		return command;
-	}
-
-	/**
-	 * Convenience method to delete process elements without UI action
-	 * 
-	 * @param elements
-	 * @return the executed delete command if some of the given elements have
-	 *         been successfully deleted, <code>null</code> otherwise
-	 * @exception OperationCanceledException
-	 *                if user canceled this deletion operation
-	 */
-	public static Command delete(Collection elements) {
-		ProcessDeleteAction deleteAction = new ProcessDeleteAction(null, false) {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.epf.authoring.ui.actions.MethodElementDeleteAction#createCommand(java.util.Collection)
-			 */
-			public Command createCommand(Collection selection) {
-				domain = new AdapterFactoryEditingDomain(
-						TngAdapterFactory.INSTANCE
-								.getProcessComposedAdapterFactory(),
-						new BasicCommandStack());
-
-				return super.createCommand(selection);
-			}
-
-		};
-		if (deleteAction.updateSelection(new StructuredSelection(new ArrayList(
-				elements)))) {
-			deleteAction.run();
-			if (!deleteAction.isDeletionConfirmed()) {
-				throw new OperationCanceledException();
-			}
-			return deleteAction.getCommand();
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/package.html b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/package.html
deleted file mode 100644
index 3e54c9a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/actions/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides actions for managing a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/BaseDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/BaseDialog.java
deleted file mode 100644
index 92dcd78..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/BaseDialog.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The base class for all Library UI dialogs.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class BaseDialog extends TitleAreaDialog {
-
-	/**
-	 * The OK button.
-	 */
-	protected Button okButton;
-
-	/**
-	 * The Cancel button.
-	 */
-	protected Button cancelButton;
-
-	/**
-	 * Creates a new instance given the parent control.
-	 * 
-	 * @param parent
-	 *            The parent control.
-	 */
-	public BaseDialog(Shell parent) {
-		super(parent);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(Composite parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		return super.createDialogArea(parent);
-	}
-
-	/**
-	 * Creates the dialog buttons.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// Create the OK button.
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		// Create the Cancel button.
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		// Set help context for the OK button.
-		okButton = super.getButton(IDialogConstants.OK_ID);
-
-		// Set help context for the Cancel button.
-		cancelButton = super.getButton(IDialogConstants.CANCEL_ID);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/ConvertActivityDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/ConvertActivityDialog.java
deleted file mode 100644
index 8a34f07..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/ConvertActivityDialog.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.library.ui.util.TypeConverter;
-import org.eclipse.epf.library.util.ConvertActivityType;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ListDialog;
-
-/**
- * Dialog to convert activity type 
- * 
- * @author Jeff Hardy
- * @since 1.0
- */
-public class ConvertActivityDialog {
-
-	/**
-	 * Query user and convert the old activity into new one
-	 * 
-	 * @param oldActivity
-	 * @param shell
-	 * @param command
-	 * 
-	 * @return Newly converted activity
-	 */
-	public static Activity queryUserAndConvert(Activity oldActivity, Shell shell,
-			DeleteMethodElementCommand command) {
-		
-		if (shell == null)
-			shell = Display.getCurrent().getActiveShell();
-		ListDialog dlg = new ListDialog(shell);
-		dlg.setHeightInChars(5);
-		dlg.setContentProvider(new ArrayContentProvider());
-		dlg.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				switch (((Integer) element).intValue()) {
-				// TODO: refactor these strings (and this whole dialog) into
-				// library.ui
-				case UmaPackage.ACTIVITY:
-					return LibraryUIText.TEXT_ACTIVITY;
-				case UmaPackage.ITERATION:
-					return LibraryUIText.TEXT_ITERATION;
-				case UmaPackage.PHASE:
-					return LibraryUIText.TEXT_PHASE;
-				default:
-					return LibraryResources.unknownGuidance_text; 
-				}
-
-			}
-		});
-		List newActivityTypeList = getValidNewActivityTypes(oldActivity);
-		if (newActivityTypeList == null) {
-			LibraryUIPlugin
-					.getDefault()
-					.getMsgDialog()
-					.displayError(
-							LibraryResources.convertActivityError_title, 
-							LibraryUIResources.unsupportedActivityType_msg,
-							LibraryUIResources.bind(LibraryUIResources.unsupportedActivityType_reason, StrUtil.toLower(TngUtil.getTypeText(oldActivity))));
-			return null;
-		}
-		dlg.setInput(newActivityTypeList);
-		dlg.setTitle(LibraryUIResources.convertActivityDialog_title);
-		dlg.setMessage(LibraryUIResources.convertActivityDialog_text);
-		if (dlg.open() == Dialog.CANCEL)
-			return null;
-
-		Object[] selectionResult = dlg.getResult();
-		if (selectionResult == null)
-			return null;
-		int chosenActivity = ((Integer) selectionResult[0]).intValue();
-		
-//		return ConvertActivityType.convertActivity(oldActivity, chosenActivity, command);
-		
-		return TypeConverter.convertActivity(oldActivity, TypeConverter.getActivityType(chosenActivity));
-	}
-	
-	/**
-	 * Gets list of valid new activity types based on old activity type
-	 * 
-	 * @param oldActivity
-	 * 
-	 * @return list of valid activity types
-	 * 
-	 */
-	public static List getValidNewActivityTypes(Activity oldActivity) {
-		if (oldActivity == null)
-			return null;
-		Integer oldActivityClassID = new Integer(oldActivity.eClass()
-				.getClassifierID());
-		if (!ConvertActivityType.compatibleActivitiesList.contains(oldActivityClassID))
-			return null;
-		List activityList = new ArrayList();
-		for (Iterator iter = ConvertActivityType.compatibleActivitiesList.iterator(); iter.hasNext();) {
-			Integer compatibleActivityTypeClassID = (Integer)iter.next();
-			if (!oldActivityClassID.equals(compatibleActivityTypeClassID) &&
-					compatibleActivityTypeClassID.intValue() != UmaPackage.CAPABILITY_PATTERN &&
-					compatibleActivityTypeClassID.intValue() != UmaPackage.DELIVERY_PROCESS)
-				activityList.add(compatibleActivityTypeClassID);
-		}
-		return activityList;
-	}
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/CopyLibraryDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/CopyLibraryDialog.java
deleted file mode 100644
index 329418e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/CopyLibraryDialog.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Dialog to prompt the user to copy a library to another location
- * @author Jeff Hardy
- *
- */
-public class CopyLibraryDialog extends PathSelectionDialog {
-	
-	public CopyLibraryDialog(Shell parentShell, String dialogTitle,
-			String dialogMessage, String defaultPath) {
-		super(parentShell, dialogTitle, dialogMessage, defaultPath);
-	}
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite, int, java.lang.String, boolean)
-	 */
-	protected Button createButton(Composite parent, int id, String label,
-			boolean defaultButton) {
-		Button b = super.createButton(parent, id, label, defaultButton);
-		if (id == IDialogConstants.OK_ID) {
-			b.setText(LibraryUIResources.copyLibraryDialog_copyButton_text);
-
-		} else if (id == IDialogConstants.CANCEL_ID) {
-			b.setText(LibraryUIResources.skipButton_text);
-		}
-
-		return b;
-	}
-	
-	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/LibraryBackupDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/LibraryBackupDialog.java
deleted file mode 100644
index 9eb5bbf..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/LibraryBackupDialog.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Utility class to back up library.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LibraryBackupDialog extends PathSelectionDialog {
-
-	public LibraryBackupDialog(Shell parentShell, String dialogTitle,
-			String dialogMessage, String defaultPath) {
-		super(parentShell, dialogTitle, dialogMessage, defaultPath);
-	}
-
-	
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets.Composite, int, java.lang.String, boolean)
-	 */
-	protected Button createButton(Composite parent, int id, String label,
-			boolean defaultButton) {
-		Button b = super.createButton(parent, id, label, defaultButton);
-		if (id == IDialogConstants.OK_ID) {
-			b.setText(LibraryUIResources.okButton_text);
-
-		} else if (id == IDialogConstants.CANCEL_ID) {
-			b.setText(LibraryUIResources.skipButton_text);
-		}
-
-		return b;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/PathSelectionDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/PathSelectionDialog.java
deleted file mode 100644
index 41cae2a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/PathSelectionDialog.java
+++ /dev/null
@@ -1,167 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.wizards.DirectoryValidator;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * 
- * Utility class to select a path
- * 
- * @author Jinhua Xi
- * 
- */
-public class PathSelectionDialog extends Dialog {
-
-	protected Text ctrl_path;
-
-	protected Button ctrl_browse_button;
-
-	protected String title;
-
-	protected String message;
-
-	protected String value;
-
-	public PathSelectionDialog(Shell parentShell, String dialogTitle,
-			String dialogMessage, String defaultPath) {
-		super(parentShell);
-
-		title = dialogTitle;
-		message = dialogMessage;
-		value = defaultPath;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.OK_ID) {
-			value = ctrl_path.getText();
-
-			// make sure the path is valid
-			String msg = LibraryUIResources.pathSelectionError_msg;
-			if (DirectoryValidator.checkAndCreateDir(value, title, msg) == false) {
-				return;
-			}
-		} else {
-			value = null;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (title != null)
-			shell.setText(title);
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// create OK and Cancel buttons by default
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		// do this here because setting the text will set enablement on the ok
-		// button
-		ctrl_path.setFocus();
-		if (value != null) {
-			ctrl_path.setText(value);
-			ctrl_path.selectAll();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// create composite
-		Composite composite = (Composite) super.createDialogArea(parent);
-		// create message
-		if (message != null) {
-			Label label = new Label(composite, SWT.WRAP);
-			label.setText(message);
-			GridData data = new GridData(GridData.GRAB_HORIZONTAL
-					| GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL
-					| GridData.VERTICAL_ALIGN_CENTER);
-			data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-			label.setLayoutData(data);
-			label.setFont(parent.getFont());
-		}
-		ctrl_path = new Text(composite, SWT.SINGLE | SWT.BORDER);
-		ctrl_path.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
-				| GridData.HORIZONTAL_ALIGN_FILL));
-
-		ctrl_browse_button = new Button(composite, SWT.NONE);
-		ctrl_browse_button.setLayoutData(new GridData(
-				GridData.HORIZONTAL_ALIGN_END));
-		ctrl_browse_button.setText(LibraryUIResources.browseButton_text);
-		ctrl_browse_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				openDirectoryDialog();
-			}
-		});
-
-		applyDialogFont(composite);
-		return composite;
-	}
-
-	/**
-	 * Open directory dialog
-	 *
-	 */
-	private void openDirectoryDialog() {
-		try {
-			// Text ctrl_path = super.getText();
-			DirectoryDialog dd = new DirectoryDialog(this.getShell(), SWT.NONE);
-			dd.setFilterPath(ctrl_path.getText());
-
-			String destination = dd.open();
-			if (destination != null) {
-				ctrl_path.setText(destination);
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	/**
-	 * Returns the path
-	 * @return path
-	 */
-	public String getPath() {
-		return value;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/SelectLibraryDirectoryDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/SelectLibraryDirectoryDialog.java
deleted file mode 100644
index 28ca7fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/SelectLibraryDirectoryDialog.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Promps the user to select a method library folder.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SelectLibraryDirectoryDialog {
-
-	private DirectoryDialog dialog;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            The parent shell.
-	 */
-	public SelectLibraryDirectoryDialog(Shell parent) {
-		this(parent, SWT.NONE);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            The parent shell.
-	 * @param style
-	 *            The dialog style.
-	 */
-	public SelectLibraryDirectoryDialog(Shell parent, int style) {
-		dialog = new DirectoryDialog(parent, style);
-		dialog.setText(LibraryUIResources.selectLibraryFolderDialog_title);
-		dialog.setMessage(LibraryUIResources.selectLibraryFolderDialog_text);
-		dialog.setFilterPath(LibraryUIPreferences.getDefaultLibraryPath());
-	}
-
-	/**
-	 * Sets the filter path.
-	 * 
-	 * @param path
-	 *            The filter path.
-	 */
-	public void setFilterPath(String path) {
-		dialog.setFilterPath(path);
-	}
-
-	/**
-	 * Makes the dialog visible and brings it to the front of the display.
-	 */
-	public String open() {
-		return dialog.open();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/UncancelableListSelectionDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/UncancelableListSelectionDialog.java
deleted file mode 100644
index 7af3ac1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/UncancelableListSelectionDialog.java
+++ /dev/null
@@ -1,34 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ListSelectionDialog;
-
-/**
- * This dialog extends jface ListSelectionDialog and removes cancel button
-  * 
- * @author Phong Nguyen Le
- * @since 1.1
- *
- */
-public class UncancelableListSelectionDialog extends ListSelectionDialog {
-
-	public UncancelableListSelectionDialog(Shell parentShell, Object input,
-            IStructuredContentProvider contentProvider,
-            ILabelProvider labelProvider, String message)
-	{
-		super(parentShell, input, contentProvider, labelProvider, message);
-	}
-	
-	protected void createButtonsForButtonBar(Composite parent) {
-        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-                true);
-       
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/UserInputsDialog.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/UserInputsDialog.java
deleted file mode 100644
index 1b0f65f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/UserInputsDialog.java
+++ /dev/null
@@ -1,508 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.dialogs;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.epf.library.edit.command.UserInput;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.ui.providers.DelegateLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * This dialog acts as a input dialog during command execution based on user
- * input and inputType dialog behaviour changes.
- * 
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- * 
- */
-public class UserInputsDialog extends Dialog {
-
-	IStructuredContentProvider contentProvider;
-
-	ILabelProvider labelProvider;
-
-	private String title;
-
-	private String globalErrorTxt = ""; //$NON-NLS-1$
-	
-	private String message;
-
-	private List userInputs;
-
-	private boolean result = false;
-
-	Label messageArea;
-
-	Label errorArea;
-
-	HashMap<Object,Object> oldInfoForCancel;
-	
-	private Color redColor;
-	
-	public UserInputsDialog(Shell parentShell, List userInputs, String title,
-			String message) {
-		super(parentShell);
-		this.title = title;
-		this.message = message;
-		this.userInputs = userInputs;
-		oldInfoForCancel = new HashMap<Object,Object>();
-	}
-
-	/**
-	 * 
-	 * @param title
-	 */
-	public void setTitle(String title) {
-		this.title = title;
-	}
-
-	/**
-	 * 
-	 * @param msg
-	 */
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	/**
-	 * Create a Tree Viewer.
-	 * 
-	 */
-	protected void createTreeViewer(Composite parent, UserInput userInput) {
-		TreeViewer viewer;
-		if (!userInput.isMultiple()) {
-			viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL
-					| SWT.V_SCROLL | SWT.BORDER);
-		} else {
-			viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
-					| SWT.V_SCROLL | SWT.BORDER);
-		}
-
-		GridData spec = new GridData(GridData.FILL_BOTH);
-		{
-			spec.widthHint = 200;
-			spec.heightHint = 200;
-			spec.horizontalSpan = 3;
-			viewer.getControl().setLayoutData(spec);
-		}
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				
-			}
-
-		});
-
-		if (viewer != null) {
-			viewer.setLabelProvider(labelProvider);
-			if (contentProvider != null) {
-				viewer.setContentProvider(contentProvider);
-			} else {
-				viewer.setContentProvider(new ArrayContentProvider());
-			}
-			viewer.setUseHashlookup(true);
-
-			viewer.setInput(userInput.getChoices());
-			viewer.getControl().setFont(parent.getFont());
-			// TODO: treeViewer Sorter and Expand/Collapse
-		}
-	}
-
-	/**
-	 * Creates a TableViewer
-	 * 
-	 */
-	protected void createTableViewer(Composite parent, UserInput userInput) {
-		TableViewer viewer = new TableViewer(parent);
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				
-			}
-		});
-	}
-
-	/**
-	 * Creates a Text control
-	 * 
-	 * @param parent
-	 * @param userInput
-	 */
-	protected void createText(Composite parent, UserInput userInput) {
-		final UserInput localinput = userInput;
-		final IValidator validator = userInput.getValidator();
-		final Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-		text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		if (userInput.getInput() != null) {
-			text.setText((String) userInput.getInput());
-		}
-		text.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				getButton(OK).setEnabled(true);
-				errorArea.setText(""); //$NON-NLS-1$
-				String errorTxt = ""; //$NON-NLS-1$
-				if (validator != null) {
-					errorTxt = validator.isValid(text.getText());
-					if (errorTxt != null && errorTxt.length() > 0) {
-						errorArea.setText(errorTxt);
-						getButton(OK).setEnabled(false);					
-					} else {
-						errorArea.setText(""); //$NON-NLS-1$
-					}
-					globalErrorTxt = errorTxt;
-				}
-				if (errorTxt == null || errorTxt.length() <= 0) {
-					localinput.setInput(text.getText());
-				}
-			}
-		});
-
-		text.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				String errorTxt = ""; //$NON-NLS-1$
-				if (validator != null) {
-					errorTxt = validator.isValid(text.getText());
-					if (errorTxt != null && errorTxt.length() > 0) {
-						errorArea.setText(errorTxt);
-						getButton(OK).setEnabled(false);					
-					} else {
-						errorArea.setText(""); //$NON-NLS-1$
-					}
-					globalErrorTxt = errorTxt;
-				}
-				if (errorTxt == null || errorTxt.length() <= 0) {
-					localinput.setInput(text.getText());
-				}
-			}
-		});
-	}
-
-	/**
-	 * Method to setInput, subclass can override it.
-	 * 
-	 */
-	protected void setInput(UserInput input, Object obj) {
-		input.setInput(obj);
-	}
-
-	/**
-	 * Creates a Comboviewer.
-	 * 
-	 * @param composite
-	 * @param userInput
-	 */
-	protected void createComboViewer(Composite composite, UserInput userInput) {
-		final UserInput localInput = userInput;
-		final IValidator validator = userInput.getValidator();
-		final ComboViewer viewer = new ComboViewer(composite);
-		viewer.getCombo().setLayoutData(
-				new GridData(SWT.FILL, SWT.FILL, true, true));
-		viewer.setContentProvider(new ArrayContentProvider());
-		if (userInput.getLabelProvider() != null) {
-			viewer.setLabelProvider(new DelegateLabelProvider(userInput.getLabelProvider()));
-		}
-		List choices = userInput.getChoices();
-		viewer.setInput(choices);
-		if (choices != null && choices.size() > 0) {
-			viewer.setSelection(new StructuredSelection(choices.get(0)));
-			localInput.setInput(choices.get(0));
-		}
-		viewer.getCombo().addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				String errorTxt = ""; //$NON-NLS-1$
-				IStructuredSelection selected = (IStructuredSelection) viewer
-						.getSelection();
-				if (validator == null || selected == null) {
-					return;
-				}
-				IStatus status = validator.isValid(selected.getFirstElement());
-				if (status.getSeverity() == IStatus.ERROR) {
-					errorTxt = status.getMessage();
-				}
-				if (errorTxt != null && errorTxt.length() > 0) {
-					errorArea.setText(errorTxt);
-					getButton(OK).setEnabled(false);
-				} if (globalErrorTxt != null && globalErrorTxt.length() > 0) {
-					errorArea.setText(globalErrorTxt);
-					getButton(OK).setEnabled(false);
-				}
-				else
-					errorArea.setText(""); //$NON-NLS-1$
-			}
-		});
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-			public void selectionChanged(SelectionChangedEvent event) {
-				getButton(OK).setEnabled(true);
-				errorArea.setText(""); //$NON-NLS-1$
-
-				IStructuredSelection selection = (IStructuredSelection) event
-						.getSelection();
-				Object obj = selection.getFirstElement();
-				String errorTxt = ""; //$NON-NLS-1$
-				if (validator != null) {
-					IStatus status = validator.isValid(obj);
-					if (status.getCode() == IStatus.ERROR) {
-						errorTxt = status.getMessage();
-					}
-					if (errorTxt != null && errorTxt.length() > 0) {
-						errorArea.setText(errorTxt);
-					}
-					else if (globalErrorTxt != null && globalErrorTxt.length() > 0) {
-						errorArea.setText(globalErrorTxt);
-						getButton(OK).setEnabled(false);
-					}
-					else
-						errorArea.setText(""); //$NON-NLS-1$
-				}
-				if (errorTxt == null || errorTxt.length() <= 0) {
-					localInput.setInput(obj);
-				}
-			}
-		});	
-	}
-
-	/**
-	 * Create a Label and Text for message area.
-	 * 
-	 * @param composite
-	 * @return
-	 */
-	protected Label createMessageArea(Composite composite) {
-		Composite messageAreaComp = new Composite(composite, SWT.NONE);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.marginLeft = 0;
-		messageAreaComp.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		messageAreaComp.setLayoutData(gd);
-		
-		messageArea = new Label(messageAreaComp, SWT.WRAP);
-		if (message != null) {
-			messageArea.setText(message);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.minimumWidth = 400;
-		messageArea.setLayoutData(gd);
-		applyDialogFont(messageArea);
-		Label separator = new Label(messageAreaComp, SWT.HORIZONTAL | SWT.SEPARATOR);
-		GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
-		gd1.horizontalSpan = 2;
-		separator.setLayoutData(gd1);
-		return messageArea;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		composite.setFont(parent.getFont());
-
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-	
-		// create message area
-		createMessageArea(composite);
-
-		// create dialog area
-		Composite dialogArea = new Composite(composite, SWT.NONE);
-		GridLayout dialogLayout = new GridLayout(2, false);
-		dialogLayout.marginLeft = 0;
-		dialogArea.setLayout(new GridLayout(2, false));
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		dialogArea.setLayoutData(gd);
-		
-		// Create controls based on UserInputs
-		if (userInputs != null && userInputs.size() > 0) {
-			for (Iterator iterator = userInputs.iterator(); iterator.hasNext();) {
-				Object object = iterator.next();
-				if (object instanceof UserInput) {
-					UserInput userInput = (UserInput) object;
-
-					// Store the userInput in the hashmap for cancel action.
-					oldInfoForCancel.put(userInput, userInput.getInput());
-
-					Label label = new Label(dialogArea, SWT.NONE);
-					label.setText(userInput.getLabel());
-					GridData gridData = new GridData(GridData.BEGINNING);
-					label.setLayoutData(gridData);
-
-					if (userInput.getType() == UserInput.TEXT) {
-						createText(dialogArea, userInput);
-					} else if (userInput.getType() == UserInput.SELECTION) {
-						createComboViewer(dialogArea, userInput);
-					}
-					// createEmptyLabel(dialogArea, 2);
-				}
-			}
-		}
-		createErrorArea(composite);
-		return composite;
-	}
-
-	/**
-	 * Creates a Error Area.
-	 * 
-	 * @param composite
-	 */
-	private void createErrorArea(Composite composite) {	
-		Composite errorAreaComp = new Composite(composite, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginLeft = 0;
-		errorAreaComp.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		errorAreaComp.setLayoutData(gd);
-		
-		// create blank label
-//		new Label(composite, SWT.WRAP);
-
-		errorArea = new Label(errorAreaComp, SWT.WRAP);
-		redColor = new Color(null, new RGB(255, 0, 0));
-		if(redColor != null){
-			errorArea.setForeground(redColor);
-		}
-		
-		gd = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL);
-		gd.heightHint = 80;
-		errorArea.setLayoutData(gd);
-		applyDialogFont(errorArea);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (this.title != null) {
-			newShell.setText(this.title);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
-	 */
-	protected void okPressed() {
-		result = true;		
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
-	 */
-	protected void cancelPressed() {
-		if (userInputs != null && userInputs.size() > 0) {
-			for (Iterator iterator = userInputs.iterator(); iterator.hasNext();) {
-				Object object = iterator.next();
-				if (object instanceof UserInput) {
-					UserInput userInput = (UserInput) object;
-					userInput.setInput(oldInfoForCancel.get(userInput));
-				}
-			}
-		}
-		super.cancelPressed();
-	}
-
-	/**
-	 * Returns the results.
-	 * 
-	 * @return
-	 */
-	public boolean getResult() {
-		return result;
-	}
-
-	@Override
-	public boolean close() {
-		if(redColor != null){
-			redColor.dispose();
-		}
-		return super.close();
-	}
-	/**
-	 * Create a empty label.
-	 * 
-	 * @param composite
-	 * @param span
-	 */
-	// private void createEmptyLabel(Composite composite, int span){
-	// Label emptyLabel = new Label(composite, SWT.NONE);
-	// emptyLabel.setBackground(Colors.INHERITED_ELEMENT_LABEL);
-	// GridData emptyData = new GridData(GridData.FILL_HORIZONTAL);
-	// emptyLabel.setText("");
-	// emptyData = new GridData(GridData.FILL_HORIZONTAL);
-	// emptyData.horizontalSpan =span;
-	// emptyData.heightHint = 3;
-	// emptyLabel.setLayoutData(emptyData);
-	// }
-	/**
-	 * validates the input with given Validator in UserInput.
-	 */
-	// private boolean validate() {
-	// for (Iterator iter = userInputs.iterator(); iter.hasNext();) {
-	// UserInput element = (UserInput) iter.next();
-	// IValidator validator = element.getValidator();
-	// if (validator != null) {
-	// if (element.getType() == UserInput.TEXT) {
-	// errorTxt += validator
-	// .isValid(element.getInput().toString());
-	// } else {
-	// errorTxt += validator.isValid(element.getInput());
-	// }
-	// }
-	// }
-	// errorTxt = "System out testing";
-	// if (errorTxt != null && errorTxt.length() > 0) {
-	// errorArea.setText(errorTxt);
-	// errorArea.setForeground(ColorConstants.red);
-	// return false;
-	// }
-	// return true;
-	// }
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/package.html b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/package.html
deleted file mode 100644
index 540076c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/dialogs/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides dialogs for managing a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/NewLibraryWizardPageContribution.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/NewLibraryWizardPageContribution.java
deleted file mode 100644
index 74136a6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/NewLibraryWizardPageContribution.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.internal.wizards;
-
-import org.osgi.framework.Bundle;
-
-/**
- * Models the <newLibraryWizardPage> element in the
- * "org.eclipse.epf.librray.ui.newLibraryWizardPages" extension point.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class NewLibraryWizardPageContribution {
-
-	// The plug-in that contributed this provider.
-	private Bundle bundle;
-
-	// The wizard page class name.
-	private String className;
-
-	// The library type identifier.
-	private String typeId;
-
-	// The wizard page title.
-	private String title;
-
-	// The wizard page description.
-	private String description;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewLibraryWizardPageContribution(Bundle bundle, String className,
-			String typeId, String title, String description) {
-		this.bundle = bundle;
-		this.className = className;
-		this.typeId = typeId;
-		this.title = title;
-		this.description = description;
-	}
-
-	/**
-	 * Returns the plug-in that contributed this provider.
-	 */
-	public Bundle getBundle() {
-		return bundle;
-	}
-
-	/**
-	 * Returns the wizard page class name.
-	 */
-	public String getClassName() {
-		return className;
-	}
-
-	/**
-	 * Returns the method library type identifier.
-	 */
-	public String getTypeId() {
-		return typeId;
-	}
-
-	/**
-	 * Returns the wizard page title.
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Returns the wizard page description.
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryMainPage2.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryMainPage2.java
deleted file mode 100644
index a7e9fba..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryMainPage2.java
+++ /dev/null
@@ -1,259 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.internal.wizards;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.library.LibraryManagerFactory;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.ui.preferences.RecentlyOpenedLibrary;
-import org.eclipse.epf.library.ui.wizards.OpenLibraryWizardPage;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to enter the name, brief description and
- * type for a new method library.
- * 
- * @author Kelvin Low
- * @since 1.2
- * @deprecated
- */
-public class OpenLibraryMainPage2 extends BaseWizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = OpenLibraryMainPage2.class.getName();
-
-	protected static final String TYPE_ID = "typeId"; //$NON-NLS-1$	
-
-	protected Combo nameCombo;
-
-	protected Text uriText;
-
-	protected Button openUnlistedLibraryCheckbox;
-
-	protected boolean openUnlistedLibrary = false;
-
-	protected Button[] radioButtons;
-
-	protected Map<String, RecentlyOpenedLibrary> recentlyOpenedLibraries = new HashMap<String, RecentlyOpenedLibrary>();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OpenLibraryMainPage2() {
-		super(PAGE_NAME);
-		setTitle(LibraryUIResources.openLibraryWizard_title);
-		setDescription(LibraryUIResources.openLibraryMainWizardPage_title_2);
-		setImageDescriptor(LibraryUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/Open.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(2, false));
-
-		Label nameLabel = new Label(composite, SWT.NORMAL);
-		nameLabel.setText(LibraryUIResources.nameLabel_text);
-
-		nameCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
-		nameCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// Set the configuration list.
-		List libraryList = getRecentlyOpenedLibraries();
-		for (Iterator it = libraryList.iterator(); it.hasNext();) {
-			RecentlyOpenedLibrary library = (RecentlyOpenedLibrary) it.next();
-			recentlyOpenedLibraries.put(library.getName(), library);
-		}
-		String[] libraryNames = new String[recentlyOpenedLibraries.size()];
-		recentlyOpenedLibraries.keySet().toArray(libraryNames);
-		nameCombo.setItems(libraryNames);
-
-		Label uriLabel = new Label(composite, SWT.NORMAL);
-		uriLabel.setText(LibraryUIResources.uriLabel_text);
-
-		uriText = new Text(composite, SWT.BORDER);
-		uriText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		uriText.setEditable(false);
-
-		openUnlistedLibraryCheckbox = new Button(composite, SWT.CHECK);
-		openUnlistedLibraryCheckbox
-				.setText(LibraryUIResources.openUnlistedLibraryCheckbox_text);
-		openUnlistedLibraryCheckbox.setLayoutData(new GridData(
-				GridData.FILL_HORIZONTAL));
-		((GridData) openUnlistedLibraryCheckbox.getLayoutData()).horizontalSpan = 2;
-
-		Label libraryTypeLabel = new Label(composite, SWT.NORMAL);
-		libraryTypeLabel.setText(LibraryUIResources.libraryTypeLabel_text);
-
-		Composite typeComposite = new Composite(composite, SWT.NORMAL);
-		typeComposite.setLayout(new GridLayout(2, false));
-		typeComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Map types = LibraryManagerFactory.getInstance().getLibraryTypes();
-		radioButtons = new Button[types.size()];
-		int radioButtonIndex = 0;
-		for (Iterator it = types.keySet().iterator(); it.hasNext();) {
-			String typeId = (String) it.next();
-			String typeName = (String) types.get(typeId);
-			Button radioButton = new Button(typeComposite, SWT.RADIO);
-			radioButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent event) {
-					setPageComplete(isPageComplete());
-					getWizard().getContainer().updateButtons();
-				}
-			});
-			radioButton.setText(typeName);
-			radioButton.setData(TYPE_ID, typeId);
-			radioButtons[radioButtonIndex++] = radioButton;
-		}
-
-		if (radioButtons.length > 0) {
-			radioButtons[0].setSelection(true);
-		}
-
-		addListeners();
-
-		setPageComplete(isPageComplete());
-
-		setControl(composite);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		OpenLibraryWizardPage wizardPage = OpenLibraryWizardPageFactory
-				.getInstance().getWizardPage(getLibraryType());
-		if (wizardPage != null) {
-			wizardPage.onEnterPage(getLibraryName());
-		}
-		if (!openUnlistedLibrary) {
-			return null;
-		}
-		return wizardPage;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		return getLibraryName().length() > 0 || openUnlistedLibrary;
-	}
-
-	/**
-	 * Adds listeners to the wizard controls.
-	 */
-	private void addListeners() {
-		nameCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				getWizard().getContainer().updateButtons();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent event) {
-			}
-		});
-
-		openUnlistedLibraryCheckbox
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent event) {
-						openUnlistedLibrary = openUnlistedLibraryCheckbox
-								.getSelection();
-						getWizard().getContainer().updateButtons();
-					}
-				});
-	}
-
-	/**
-	 * Gets the user selected method library name.
-	 */
-	public String getLibraryName() {
-		return nameCombo.getText().trim();
-	}
-
-	/**
-	 * Gets the URI of the user selected method library.
-	 */
-	public String getLibraryURI() {
-		RecentlyOpenedLibrary library = (RecentlyOpenedLibrary) recentlyOpenedLibraries
-				.get(getLibraryName());
-		return library.getURI().toString();
-	}
-
-	/**
-	 * Gets the path of the user selected method library.
-	 */
-	public String getLibraryPath() {
-		RecentlyOpenedLibrary library = (RecentlyOpenedLibrary) recentlyOpenedLibraries
-				.get(getLibraryName());
-		return library.getPath();
-	}
-
-	/**
-	 * Gets the open unlisted method librray option.
-	 */
-	public boolean isOpenUnlistedLibrary() {
-		return openUnlistedLibrary;
-	}
-
-	/**
-	 * Returns the user selected method library type.
-	 */
-	public String getLibraryType() {
-		for (int i = 0; i < radioButtons.length; i++) {
-			Button radioButton = radioButtons[i];
-			if (radioButton.getSelection()) {
-				return (String) radioButton.getData(TYPE_ID);
-			}
-		}
-		return (String) radioButtons[0].getData(TYPE_ID);
-	}
-
-	/**
-	 * Gets a list of recently opened method libraries.
-	 * 
-	 * @return a collection of <code>RecentlyOpenedLibrary</code> objects
-	 */
-	protected static List getRecentlyOpenedLibraries() {
-		List libraryURIs = LibraryUIPreferences.getOpenLibraryURIsList();
-		List<RecentlyOpenedLibrary> libraries = new ArrayList<RecentlyOpenedLibrary>();
-		if (libraryURIs.size() > 0) {
-			for (Iterator it = libraryURIs.iterator(); it.hasNext();) {
-				String libraryURI = (String) it.next();
-				libraries.add(new RecentlyOpenedLibrary(libraryURI));
-			}
-		}
-		return libraries;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizard2.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizard2.java
deleted file mode 100644
index 17146ee..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizard2.java
+++ /dev/null
@@ -1,263 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.internal.wizards;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.library.LibraryManagerFactory;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.ui.wizards.OpenLibraryWizardPage;
-import org.eclipse.epf.library.xmi.XMILibraryManager;
-import org.eclipse.epf.library.xmi.XMILibraryUtil;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that guides the user to open a method library.
- * 
- * @author Kelvin Low
- * @since 1.2
- * @deprecated
- */
-public class OpenLibraryWizard2 extends Wizard implements INewWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = OpenLibraryWizard2.class.getName();
-
-	// The main wizard page.
-	private OpenLibraryMainPage2 mainPage;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OpenLibraryWizard2() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		setWindowTitle(LibraryUIResources.openLibraryWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		mainPage = new OpenLibraryMainPage2();
-		addPage(mainPage);
-
-		for (Iterator it = LibraryManagerFactory.getInstance()
-				.getLibraryTypes().keySet().iterator(); it.hasNext();) {
-			String persistenceId = (String) it.next();
-			String pageId = persistenceId + "Page"; //$NON-NLS-1$
-			OpenLibraryWizardPage page = OpenLibraryWizardPageFactory
-					.getInstance().createWizardPage(pageId, persistenceId);
-			if (page != null) {
-				page.setImageDescriptor(LibraryUIPlugin.getDefault()
-						.getImageDescriptor("full/wizban/Open.gif")); //$NON-NLS-1$					
-				addPage(page);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				LibraryUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MethodLibrary.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
-	 */
-	public boolean canFinish() {
-		if (mainPage.isPageComplete() && !mainPage.isOpenUnlistedLibrary()) {
-			return true;
-		}
-		IWizardPage[] pages = getPages();
-		for (int i = 1; i < pages.length; i++) {
-			if (!pages[i].isPageComplete()) {
-				return false;
-			}
-		}
-		return getContainer().getCurrentPage() != mainPage;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		String type = mainPage.getLibraryType();
-		OpenLibraryWizardPage page = OpenLibraryWizardPageFactory.getInstance()
-				.getWizardPage(type);
-		try {
-			String path = null;
-			if (mainPage.isOpenUnlistedLibrary()) {
-				Map options = page.getSelections();
-				path = (String) options.get(XMILibraryManager.ARG_LIBRARY_PATH);
-			} else {
-				path = mainPage.getLibraryPath();
-			}
-			if (path != null) {
-				if (XMILibraryUtil.isValidLibrary(path, true) == Status.OK_STATUS) {
-					if (!handleToolVersion(path, null)) {
-						return false;
-					}
-					if (LibraryUIManager.getInstance().openLibrary(path)) {
-						addRecentlyOpenedLibrary();
-						return true;
-					}
-				} else if (XMILibraryUtil
-						.containsPluginOrConfigSpecExportFile(path)) {
-					throw new Exception(
-							LibraryUIResources.openLibraryError_reason4);
-				} else {
-					MsgDialog msgDialog = LibraryUIPlugin.getDefault()
-							.getMsgDialog();
-					boolean rc = msgDialog
-							.displayConfirmation(
-									LibraryUIResources.openLibraryWizard_title,
-									NLS
-											.bind(
-													LibraryUIResources.openLibraryDialog_newLibrary_text,
-													new Object[] { path }));
-					if (!rc)
-						return false;
-					if (LibraryUIManager.getInstance().createLibrary(path)) {
-						addRecentlyOpenedLibrary();
-						return true;
-					}
-				}
-			}
-			return true;
-		} catch (Exception e) {
-			String reason = e.getMessage();
-			if (reason == null) {
-				reason = LibraryUIResources.openLibraryInternlError_reason;
-			}
-			reason += "\n\n" + LibraryUIResources.openLibraryError_advice; //$NON-NLS-1$
-			if (e.getMessage() != null) {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						LibraryUIResources.openLibraryWizard_title,
-						LibraryUIResources.openLibraryError_msg, reason);
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						LibraryUIResources.openLibraryWizard_title,
-						LibraryUIResources.openLibraryError_msg, reason, e);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Adds the newly opened or created method library to the recently opened
-	 * method libraries preference.
-	 */
-	protected void addRecentlyOpenedLibrary() {
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (library != null) {
-			String libraryURI = LibraryService.getInstance().getLibraryManager(
-					library).getMethodLibraryURI().toString();
-			LibraryUIPreferences.addOpenLibraryURI(libraryURI);
-		}
-	}
-
-	/**
-	 * Check and handle tool version differences
-	 */
-	public static boolean handleToolVersion(String path,
-			UpgradeCallerInfo callerInfo) {
-		String libXmi = XMILibraryManager.LIBRARY_XMI;
-		if (callerInfo != null && callerInfo.getIsExportedPluginLib()) {
-			libXmi = XMILibraryManager.exportFile;
-		}
-		VersionUtil.VersionCheckInfo info = VersionUtil
-				.checkLibraryVersion(new File(path, libXmi));
-		if (info != null && info.result > 0) {
-			String message = ""; //$NON-NLS-1$
-			if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
-				message = NLS.bind(
-						LibraryUIResources.versionMismatchDialog_text,
-						new Object[] { Platform.getProduct().getName(),
-								info.toolVersion });
-			} else {
-				message = NLS.bind(
-						LibraryUIResources.versionMismatchDialog_text_unknown,
-						new Object[] { Platform.getProduct().getName() });
-			}
-			if (!isUpgradeLibrary(callerInfo)) {
-				callerInfo.setErrorMsg(message);
-				return false;
-			}
-			LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-					LibraryUIResources.openLibraryWizard_title, message);
-			return false;
-		}
-		if (XMILibraryUtil.isMethodLibraryUpgradeRequired(path, libXmi, info)) {
-			if (isUpgradeLibrary(callerInfo)
-					&& !LibraryUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayConfirmation(
-									LibraryUIResources.openLibraryWizard_title,
-									LibraryUIResources.upgradeLibraryDialog_text)) {
-				return false;
-			}
-			if (!isUpgradeLibrary(callerInfo)) {
-				callerInfo.copyLibrary();
-				if (callerInfo.getCopiedLibFile() != null) {
-					path = callerInfo.getCopiedLibFile().getParentFile()
-							.getAbsolutePath();
-				}
-			}
-			if (!LibraryUIManager.upgradeLibrary(path, callerInfo)) {
-				if (callerInfo != null) {
-					// callerInfo.setErrorMsg("upgradeLibrary Failed!"); //need
-					// new resource string
-				}
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	private static boolean isUpgradeLibrary(UpgradeCallerInfo callerInfo) {
-		return UpgradeCallerInfo.isUpgradeLibrary(callerInfo);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizardPageContribution.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizardPageContribution.java
deleted file mode 100644
index 539fbc7..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizardPageContribution.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.internal.wizards;
-
-import org.osgi.framework.Bundle;
-
-/**
- * Models the <openLibraryWizardPage> element in the
- * "org.eclipse.epf.librray.ui.openLibraryWizardPages" extension point.
- * 
- * @author Kelvin Low
- * @since 1.2
- * @deprecated
- */
-public class OpenLibraryWizardPageContribution {
-
-	// The plug-in that contributed this provider.
-	private Bundle bundle;
-
-	// The wizard page class name.
-	private String className;
-
-	// The library type identifier.
-	private String typeId;
-
-	// The wizard page title.
-	private String title;
-
-	// The wizard page description.
-	private String description;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OpenLibraryWizardPageContribution(Bundle bundle, String className,
-			String typeId, String title, String description) {
-		this.bundle = bundle;
-		this.className = className;
-		this.typeId = typeId;
-		this.title = title;
-		this.description = description;
-	}
-
-	/**
-	 * Returns the plug-in that contributed this provider.
-	 */
-	public Bundle getBundle() {
-		return bundle;
-	}
-
-	/**
-	 * Returns the wizard page class name.
-	 */
-	public String getClassName() {
-		return className;
-	}
-
-	/**
-	 * Returns the method library type identifier.
-	 */
-	public String getTypeId() {
-		return typeId;
-	}
-
-	/**
-	 * Returns the wizard page title.
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Returns the wizard page description.
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizardPageFactory.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizardPageFactory.java
deleted file mode 100644
index 9244545..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/internal/wizards/OpenLibraryWizardPageFactory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.internal.wizards;
-
-import java.lang.reflect.Constructor;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.wizards.OpenLibraryWizardPage;
-import org.osgi.framework.Bundle;
-
-/**
- * Manages the Open Library wizard pages defined via the
- * "org.eclipse.epf.library.ui.openLibraryWizardPages" extension point.
- * 
- * @author Kelvin Low
- * @since 1.2
- * @deprecated
- */
-public class OpenLibraryWizardPageFactory {
-
-	/**
-	 * The extension point namespace.
-	 */
-	public static final String EXTENSION_POINT_NAMESPACE = "org.eclipse.epf.library.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension point name.
-	 */
-	public static final String EXTENSION_POINT_NAME = "openLibraryWizardPages"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static OpenLibraryWizardPageFactory instance = new OpenLibraryWizardPageFactory();
-
-	// A map of wizard page providers.
-	private Map<String, OpenLibraryWizardPageContribution> wizardPageProviders = new HashMap<String, OpenLibraryWizardPageContribution>();
-
-	// A list of wizard page instances.
-	private Map<String, OpenLibraryWizardPage> wizardPages = new HashMap<String, OpenLibraryWizardPage>();
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static OpenLibraryWizardPageFactory getInstance() {
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private OpenLibraryWizardPageFactory() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				EXTENSION_POINT_NAMESPACE, EXTENSION_POINT_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String className = configElement.getAttribute("class"); //$NON-NLS-1$
-						String typeId = configElement.getAttribute("type"); //$NON-NLS-1$
-						String title = configElement.getAttribute("title"); //$NON-NLS-1$
-						String description = configElement
-								.getAttribute("description"); //$NON-NLS-1$						
-						if (className != null && className.trim().length() > 0
-								&& typeId != null && typeId.trim().length() > 0
-								&& title != null && title.trim().length() > 0
-								&& description != null
-								&& description.trim().length() > 0) {
-							if (!wizardPageProviders.containsKey(typeId)) {
-								OpenLibraryWizardPageContribution provider = new OpenLibraryWizardPageContribution(
-										bundle, className, typeId, title,
-										description);
-								wizardPageProviders.put(typeId, provider);
-							}
-						}
-					} catch (Exception e) {
-						LibraryUIPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates a wizard page.
-	 * 
-	 * @return a <code>OpenLibraryWizardPage</code>
-	 */
-	public OpenLibraryWizardPage createWizardPage(String pageId, String typeId) {
-		OpenLibraryWizardPage wizardPage = (OpenLibraryWizardPage) wizardPages
-				.get(typeId);
-		if (wizardPage != null) {
-			return wizardPage;
-		}
-
-		OpenLibraryWizardPageContribution provider = (OpenLibraryWizardPageContribution) wizardPageProviders
-				.get(typeId);
-		if (provider != null) {
-			Bundle bundle = provider.getBundle();
-			String className = provider.getClassName();
-			Class wizardPageClass;
-			Class[] argClass = new Class[] { String.class };
-			Object[] argValue = new Object[] { pageId };
-			Constructor constructor;
-			try {
-				wizardPageClass = bundle.loadClass(className);
-				constructor = wizardPageClass.getConstructor(argClass);
-				wizardPage = (OpenLibraryWizardPage) constructor
-						.newInstance(argValue);
-				wizardPage.setTitle(provider.getTitle());
-				wizardPage.setDescription(provider.getDescription());
-				wizardPages.put(typeId, wizardPage);
-			} catch (Exception e) {
-				LibraryUIPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		return wizardPage;
-	}
-
-	/**
-	 * Returns a new or cached wizard page.
-	 * 
-	 * @return a <code>NewLibraryWizardPage</code> object
-	 */
-	public OpenLibraryWizardPage getWizardPage(String typeId) {
-		return (OpenLibraryWizardPage) wizardPages.get(typeId);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/package.html b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/package.html
deleted file mode 100644
index dd32de3..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the UI suppport for managing a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/LibraryUIPreferences.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/LibraryUIPreferences.java
deleted file mode 100644
index 70206c6..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/LibraryUIPreferences.java
+++ /dev/null
@@ -1,671 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.preferences;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.ui.util.PreferenceUtil;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.util.DefaultValueManager;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Manages the Library UI preferences.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * 
- * @since 1.0
- */
-public class LibraryUIPreferences {
-
-	private static final String DEFAULT_LIBRARY_PATH = "defaultLibraryPath"; //$NON-NLS-1$
-
-	private static final String SAVED_LIBRARY_PATH = "savedLibraryPath"; //$NON-NLS-1$
-
-	private static final String PUBLISH_UNOPEN_ACTIVITY_DD = "publishUnopenActivityDetailDiagram"; //$NON-NLS-1$
-
-	private static final String PREF_SWITCH_CONFIG = "switchConfigurationOnProcessActivate"; //$NON-NLS-1$
-
-	private static final String PUBLISH_AD_FOR_ACTIVITY_EXTENSION = "publishActivityDiagramforActivityExtension"; //$NON-NLS-1$
-
-	private static final String APPLICATION_SHORT_NAME = "appname"; //$NON-NLS-1$
-
-	private static final String NEW_LIBRARY_PATHS = "newLibraryPaths"; //$NON-NLS-1$
-
-	private static final String OPEN_LIBRARY_PATHS = "openLibraryPaths"; //$NON-NLS-1$		
-
-	private static final String OPEN_LIBRARY_URIS = "openLibraryURIs"; //$NON-NLS-1$
-
-	private static final String WORK_BREAKDOWNELEMENT_OPTIONAL = "work_breakdownelement_optional"; //$NON-NLS-1$
-
-	private static final String WORK_BREAKDOWNELEMENT_MULTIPLE_OCCURRANCES = "work_breakdownelement_multiple_occurrances"; //$NON-NLS-1$
-
-	private static final String WORK_BREAKDOWNELEMENT_PLANNED = "work_breakdownelement_planned"; //$NON-NLS-1$
-
-	private static final String WORK_BREAKDOWNELEMENT_EVENT_DRIVEN = "work_breakdownelement_event_driven"; //$NON-NLS-1$
-
-	private static final String WORK_BREAKDOWNELEMENT_ONGOING = "work_breakdownelement_multiple_ongoing"; //$NON-NLS-1$
-
-	private static final String WORK_BREAKDOWNELEMENT_REPEATABLE = "work_breakdownelement_repeatable"; //$NON-NLS-1$
-
-	private static final String DESCRIPTOR_OPTIONAL = "descriptor_optional"; //$NON-NLS-1$
-
-	private static final String DESCRIPTOR_MULTIPLE_OCCURRANCES = "descriptor_multiple_occurrances"; //$NON-NLS-1$
-
-	private static final String DESCRIPTOR_PLANNED = "descriptor_planned"; //$NON-NLS-1$
-
-	private static final String DESCRIPTOR_EVENT_DRIVEN = "descriptor_event_driven"; //$NON-NLS-1$
-
-	private static final String DESCRIPTOR_ONGOING = "descriptor_multiple_ongoing"; //$NON-NLS-1$
-
-	private static final String DESCRIPTOR_REPEATABLE = "descriptor_repeatable"; //$NON-NLS-1$
-
-	private static final String DEFAULT_LIBRARY_FOLDER_NAME = "Method Libraries"; //$NON-NLS-1$
-
-	private static String defaultLibraryPath = null;
-
-	// The plug-in specific preference store.
-	private static IPreferenceStore prefStore = LibraryUIPlugin.getDefault()
-			.getPreferenceStore();
-
-	static {
-		// Initialize the default preference values.
-		prefStore.setDefault(DEFAULT_LIBRARY_PATH,
-				getInitialDefaultLibraryPath());
-
-		prefStore.setDefault(SAVED_LIBRARY_PATH, ""); //$NON-NLS-1$	
-		prefStore
-				.setDefault(PREF_SWITCH_CONFIG, MessageDialogWithToggle.PROMPT);
-		prefStore.setDefault(NEW_LIBRARY_PATHS, ""); //$NON-NLS-1$	
-		prefStore.setDefault(OPEN_LIBRARY_PATHS, ""); //$NON-NLS-1$
-		prefStore.setDefault(OPEN_LIBRARY_URIS, ""); //$NON-NLS-1$	
-
-		prefStore.setDefault(WORK_BREAKDOWNELEMENT_OPTIONAL, false);
-		prefStore.setDefault(WORK_BREAKDOWNELEMENT_MULTIPLE_OCCURRANCES, false);
-		prefStore.setDefault(WORK_BREAKDOWNELEMENT_PLANNED, true);
-		prefStore.setDefault(WORK_BREAKDOWNELEMENT_EVENT_DRIVEN, false);
-		prefStore.setDefault(WORK_BREAKDOWNELEMENT_ONGOING, false);
-		prefStore.setDefault(WORK_BREAKDOWNELEMENT_REPEATABLE, false);
-
-		prefStore.setDefault(DESCRIPTOR_OPTIONAL, false);
-		prefStore.setDefault(DESCRIPTOR_MULTIPLE_OCCURRANCES, false);
-		prefStore.setDefault(DESCRIPTOR_PLANNED, false);
-		prefStore.setDefault(DESCRIPTOR_EVENT_DRIVEN, false);
-		prefStore.setDefault(DESCRIPTOR_ONGOING, false);
-		prefStore.setDefault(DESCRIPTOR_REPEATABLE, false);
-	}
-
-	/**
-	 * Gets the initial default method library path preference.
-	 */
-	public static String getInitialDefaultLibraryPath() {
-		if (defaultLibraryPath == null) {
-			defaultLibraryPath = System.getProperty("user.home"); //$NON-NLS-1$
-			String appName = LibraryUIPreferences.getApplicationShortName();
-			if (appName != null && appName.length() > 0) {
-				defaultLibraryPath = defaultLibraryPath + FileUtil.FILE_SEP
-						+ appName + FileUtil.FILE_SEP
-						+ DEFAULT_LIBRARY_FOLDER_NAME;
-			} else {
-				defaultLibraryPath = defaultLibraryPath + FileUtil.FILE_SEP
-						+ DEFAULT_LIBRARY_FOLDER_NAME;
-			}
-		}
-		return defaultLibraryPath;
-	}
-
-	/**
-	 * Gets the default method library path preference.
-	 */
-	public static String getDefaultLibraryPath() {
-		return prefStore.getString(DEFAULT_LIBRARY_PATH);
-	}
-
-	/**
-	 * Sets the default method library path preference.
-	 */
-	public static void setDefaultLibraryPath(String value) {
-		prefStore.setValue(DEFAULT_LIBRARY_PATH, value);
-	}
-
-	public static void setPublishUnopenActivitydd(boolean enabled) {
-		prefStore.setValue(PUBLISH_UNOPEN_ACTIVITY_DD, enabled);
-	}
-
-	public static boolean getPublishUnopenActivitydd() {
-		return prefStore.getBoolean(PUBLISH_UNOPEN_ACTIVITY_DD);
-	}
-
-	/**
-	 * Setter method for Publish Activity Diagram for Activity Extension,
-	 * 
-	 * @param enabled
-	 */
-	public static void setPublishADForActivityExtension(boolean enabled) {
-		prefStore.setValue(PUBLISH_AD_FOR_ACTIVITY_EXTENSION, enabled);
-	}
-
-	/**
-	 * getter method for Publish Activity Diagram for Activity Extension flag
-	 * from preference store,
-	 */
-	public static boolean getPublishADForActivityExtension() {
-		return prefStore.getBoolean(PUBLISH_AD_FOR_ACTIVITY_EXTENSION);
-	}
-
-	/**
-	 * Returns switch configuration value store in preference store
-	 * 
-	 * @return value - could be ALWAYS, NEVER, PROMPT
-	 */
-	public static String getSwitchConfig() {
-		return prefStore.getString(PREF_SWITCH_CONFIG);
-	}
-
-	/**
-	 * Saves switch configuration value in preference store
-	 * 
-	 * @param value
-	 *            Value could be ALWAYS, NEVER, PROMPT
-	 */
-	public static void setSwitchConfig(String value) {
-		prefStore.setValue(PREF_SWITCH_CONFIG, value);
-	}
-
-	
-	/**
-	 * Returns switch configuration preference key
-	 * @return 
-	 */
-	public static String getSwitchConfigPreferenceKey()	{
-		return PREF_SWITCH_CONFIG;		
-	}
-	
-	/**
-	 * Returns the Method Library path that was saved in a previous session.
-	 * 
-	 * @return The saved library path.
-	 */
-	public static String getSavedLibraryPath() {
-		return prefStore.getString(SAVED_LIBRARY_PATH);
-	}
-
-	/**
-	 * Saves a Method Library path to the Library UI preference store.
-	 * 
-	 * @param libPath
-	 *            Path to a Method Library.
-	 */
-	public static void setSavedLibraryPath(String libPath) {
-		String path = libPath;
-		if (path.endsWith(MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME)) {
-			path = FileUtil.getParentDirectory(path);
-		}
-		prefStore.setValue(SAVED_LIBRARY_PATH, path);
-		LibraryUIPlugin.getDefault().savePluginPreferences();
-	}
-
-	/**
-	 * Returns the application short name passed in the main feature's
-	 * plugin_customization.ini.
-	 * 
-	 * @return The passed-in application short name.
-	 */
-	public static String getApplicationShortName() {
-		return prefStore.getString(APPLICATION_SHORT_NAME);
-	}
-
-	/**
-	 * Gets the new library paths preference.
-	 * 
-	 * @return an array of method library paths
-	 */
-	public static String[] getNewLibraryPaths() {
-		return PreferenceUtil.getStringValues(prefStore, NEW_LIBRARY_PATHS);
-	}
-
-	/**
-	 * Gets the new library paths preference.
-	 * 
-	 * @return a collection of method library paths
-	 */
-	public static List<String> getNewLibraryPathsList() {
-		return PreferenceUtil.getList(prefStore, NEW_LIBRARY_PATHS);
-	}
-
-	/**
-	 * Adds a method library path to the new library paths preference.
-	 * 
-	 * @param path
-	 *            a method library path
-	 */
-	public static void addNewLibraryPath(String path) {
-		PreferenceUtil.addToList(prefStore, NEW_LIBRARY_PATHS, path,
-				getDefaultLibraryPath());
-	}
-
-	/**
-	 * Gets the open library paths preference.
-	 * 
-	 * @return an array of method library paths
-	 */
-	public static String[] getOpenLibraryPaths() {
-		return PreferenceUtil.getStringValues(prefStore, OPEN_LIBRARY_PATHS);
-	}
-
-	/**
-	 * Gets the open library paths preference.
-	 * 
-	 * @return a collection of method library paths
-	 */
-	public static List<String> getOpenLibraryPathsList() {
-		return PreferenceUtil.getList(prefStore, OPEN_LIBRARY_PATHS);
-	}
-
-	/**
-	 * Adds a method library path to the open library paths preference.
-	 * 
-	 * @param path
-	 *            a method library path
-	 */
-	public static void addOpenLibraryPath(String path) {
-		PreferenceUtil.addToList(prefStore, OPEN_LIBRARY_PATHS, path,
-				getDefaultLibraryPath());
-	}
-
-	/**
-	 * Gets the open library URIs preference.
-	 * 
-	 * @return a collection of method library URIs
-	 */
-	public static String[] getOpenLibraryURIs() {
-		return PreferenceUtil.getStringValues(prefStore, OPEN_LIBRARY_URIS);
-	}
-
-	/**
-	 * Gets the open library URIs preference.
-	 * 
-	 * @return a collection of method library URIs
-	 */
-	public static List getOpenLibraryURIsList() {
-		return PreferenceUtil.getList(prefStore, OPEN_LIBRARY_URIS);
-	}
-
-	/**
-	 * Adds a method library URI to the open library URIs preference.
-	 * 
-	 * @param uri
-	 *            a method library URI
-	 */
-	public static void addOpenLibraryURI(String uri) {
-		PreferenceUtil.addToList(prefStore, OPEN_LIBRARY_URIS, uri);
-	}
-
-	/**
-	 * Save all preferences
-	 * 
-	 */
-	public static void saveAllPreferences() {
-		LibraryUIPlugin.getDefault().savePluginPreferences();
-	}
-
-	/**
-	 * Returns optional feature value of work breakdown element in preference
-	 * store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getWorkBreakDownElementOptional() {
-		return prefStore.getBoolean(WORK_BREAKDOWNELEMENT_OPTIONAL);
-	}
-
-	/**
-	 * Saves value for Optional feature of work breakdown element in preference
-	 * store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setWorkBreakdownElementOptional(boolean value) {
-		prefStore.setValue(WORK_BREAKDOWNELEMENT_OPTIONAL, value);
-	}
-
-	/**
-	 * Returns multiple occurrances feature value of work breakdown element in
-	 * preference store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getWorkBreakDownElementMultipleOccurrances() {
-		return prefStore.getBoolean(WORK_BREAKDOWNELEMENT_MULTIPLE_OCCURRANCES);
-	}
-
-	/**
-	 * Saves value for Multiple Occurrances feature of work breakdown element in
-	 * preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setWorkBreakdownElementMultipleOccurrances(boolean value) {
-		prefStore.setValue(WORK_BREAKDOWNELEMENT_MULTIPLE_OCCURRANCES, value);
-	}
-
-	/**
-	 * Returns planned feature value of work breakdown element in preference
-	 * store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getWorkBreakDownElementPlanned() {
-		return prefStore.getBoolean(WORK_BREAKDOWNELEMENT_PLANNED);
-	}
-
-	/**
-	 * Saves value for Planned feature of work breakdown element in preference
-	 * store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setWorkBreakdownElementPlanned(boolean value) {
-		prefStore.setValue(WORK_BREAKDOWNELEMENT_PLANNED, value);
-	}
-
-	/**
-	 * Returns EventDriven feature value of work breakdown element in preference
-	 * store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getWorkBreakDownElementEventDriven() {
-		return prefStore.getBoolean(WORK_BREAKDOWNELEMENT_EVENT_DRIVEN);
-	}
-
-	/**
-	 * Saves value for EventDriven feature of work breakdown element in
-	 * preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setWorkBreakdownElementEventDriven(boolean value) {
-		prefStore.setValue(WORK_BREAKDOWNELEMENT_EVENT_DRIVEN, value);
-	}
-
-	/**
-	 * Returns Ongoing feature value of work breakdown element in preference
-	 * store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getWorkBreakDownElementOngoing() {
-		return prefStore.getBoolean(WORK_BREAKDOWNELEMENT_ONGOING);
-	}
-
-	/**
-	 * Saves value for Ongoing feature of work breakdown element in preference
-	 * store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setWorkBreakdownElementOngoing(boolean value) {
-		prefStore.setValue(WORK_BREAKDOWNELEMENT_ONGOING, value);
-	}
-
-	/**
-	 * Returns Repeatable feature value of work breakdown element in preference
-	 * store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getWorkBreakDownElementRepeatable() {
-		return prefStore.getBoolean(WORK_BREAKDOWNELEMENT_REPEATABLE);
-	}
-
-	/**
-	 * Saves value for Repeatable feature of work breakdown element in
-	 * preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setWorkBreakdownElementRepeatable(boolean value) {
-		prefStore.setValue(WORK_BREAKDOWNELEMENT_REPEATABLE, value);
-	}
-
-	/**
-	 * Returns optional feature value of work breakdown element in preference
-	 * store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getDescriptorOptional() {
-		return prefStore.getBoolean(DESCRIPTOR_OPTIONAL);
-	}
-
-	/**
-	 * Saves value for Optional feature of descriptor in preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setDescriptorOptional(boolean value) {
-		prefStore.setValue(DESCRIPTOR_OPTIONAL, value);
-	}
-
-	/**
-	 * Returns multiple occurrances feature value of descriptor in preference
-	 * store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getDescriptorMultipleOccurrances() {
-		return prefStore.getBoolean(DESCRIPTOR_MULTIPLE_OCCURRANCES);
-	}
-
-	/**
-	 * Saves value for Multiple Occurrances feature of descriptor in preference
-	 * store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setDescriptorMultipleOccurrances(boolean value) {
-		prefStore.setValue(DESCRIPTOR_MULTIPLE_OCCURRANCES, value);
-	}
-
-	/**
-	 * Returns planned feature value of descriptor in preference store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getDescriptorPlanned() {
-		return prefStore.getBoolean(DESCRIPTOR_PLANNED);
-	}
-
-	/**
-	 * Saves value for Planned feature of descriptor in preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setDescriptorPlanned(boolean value) {
-		prefStore.setValue(DESCRIPTOR_PLANNED, value);
-	}
-
-	/**
-	 * Returns EventDriven feature value of descriptor in preference store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getDescriptorEventDriven() {
-		return prefStore.getBoolean(DESCRIPTOR_EVENT_DRIVEN);
-	}
-
-	/**
-	 * Saves value for EventDriven feature of descriptor in preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setDescriptorEventDriven(boolean value) {
-		prefStore.setValue(DESCRIPTOR_EVENT_DRIVEN, value);
-	}
-
-	/**
-	 * Returns Ongoing feature value of descriptor in preference store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getDescriptorOngoing() {
-		return prefStore.getBoolean(DESCRIPTOR_ONGOING);
-	}
-
-	/**
-	 * Saves value for Ongoing feature of descriptor in preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setDescriptorOngoing(boolean value) {
-		prefStore.setValue(DESCRIPTOR_ONGOING, value);
-	}
-
-	/**
-	 * Returns Repeatable feature value of descriptor in preference store
-	 * 
-	 * @return value - boolean
-	 */
-	public static boolean getDescriptorRepeatable() {
-		return prefStore.getBoolean(DESCRIPTOR_REPEATABLE);
-	}
-
-	/**
-	 * Saves value for Repeatable feature of descriptor in preference store
-	 * 
-	 * @param value -
-	 *            boolean true/false
-	 * 
-	 */
-	public static void setDescriptorRepeatable(boolean value) {
-		prefStore.setValue(DESCRIPTOR_REPEATABLE, value);
-	}
-
-	public static void applyDefaultValuesForBreakdownElementAttributes() {
-		Object[] nonDescriptorDefaultValueDefs = {
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsEventDriven(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getWorkBreakDownElementEventDriven()) },
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getBreakdownElement_HasMultipleOccurrences(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getWorkBreakDownElementMultipleOccurrances()) },
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsOngoing(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getWorkBreakDownElementOngoing()) },
-				new Object[] {
-						UmaPackage.eINSTANCE.getBreakdownElement_IsOptional(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getWorkBreakDownElementOptional()) },
-				new Object[] {
-						UmaPackage.eINSTANCE.getBreakdownElement_IsPlanned(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getWorkBreakDownElementPlanned()) },
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsRepeatable(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getWorkBreakDownElementRepeatable()) } };
-		EClass[] nonDescriptorTypes = { UmaPackage.eINSTANCE.getPhase(),
-				UmaPackage.eINSTANCE.getIteration(),
-				UmaPackage.eINSTANCE.getActivity(),
-				UmaPackage.eINSTANCE.getMilestone() };
-
-		Object[] descriptorDefaultValueDefs = {
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsEventDriven(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getDescriptorEventDriven()) },
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getBreakdownElement_HasMultipleOccurrences(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getDescriptorMultipleOccurrances()) },
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsOngoing(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getDescriptorOngoing()) },
-				new Object[] {
-						UmaPackage.eINSTANCE.getBreakdownElement_IsOptional(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getDescriptorOptional()) },
-				new Object[] {
-						UmaPackage.eINSTANCE.getBreakdownElement_IsPlanned(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getDescriptorPlanned()) },
-				new Object[] {
-						UmaPackage.eINSTANCE
-								.getWorkBreakdownElement_IsRepeatable(),
-						Boolean.valueOf(LibraryUIPreferences
-								.getDescriptorRepeatable()) } };
-		EClass[] descriptorTypes = { UmaPackage.eINSTANCE.getRoleDescriptor(),
-				UmaPackage.eINSTANCE.getTaskDescriptor(),
-				UmaPackage.eINSTANCE.getWorkProductDescriptor() };
-
-		Object[] defaultValueDefs = {
-				new Object[] { nonDescriptorTypes,
-						nonDescriptorDefaultValueDefs },
-				new Object[] { descriptorTypes, descriptorDefaultValueDefs } };
-
-		for (int i = 0; i < defaultValueDefs.length; i++) {
-			Object[] defaultValueDef = (Object[]) defaultValueDefs[i];
-			EClass[] types = (EClass[]) defaultValueDef[0];
-			Object[] featureDefaultValueDefs = (Object[]) defaultValueDef[1];
-			for (int k = 0; k < featureDefaultValueDefs.length; k++) {
-				Object[] featureDefaultValue = (Object[]) featureDefaultValueDefs[k];
-				EStructuralFeature feature = (EStructuralFeature) featureDefaultValue[0];
-				Object defaultValue = featureDefaultValue[1];
-				for (int j = 0; j < types.length; j++) {
-					EClass type = types[j];
-					DefaultValueManager.INSTANCE.setDefaultValue(type, feature,
-							defaultValue);
-				}
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/RecentlyOpenedLibrary.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/RecentlyOpenedLibrary.java
deleted file mode 100644
index 41ea317..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/RecentlyOpenedLibrary.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.preferences;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/**
- * Models a recently opened method library preference.
- * 
- * @author Kelvin Low
- */
-public class RecentlyOpenedLibrary {
-
-	private URI uri;
-	
-	private String name;
-	
-	private String path;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RecentlyOpenedLibrary(String uri) {
-		try {
-			this.uri = new URI(uri);
-			File file = new File(this.uri);
-			this.name = file.getName();
-			this.path = file.getAbsolutePath();
-		} catch (URISyntaxException e) {
-		}
-	}
-
-	/**
-	 * Gets the library name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the library URI.
-	 */
-	public URI getURI() {
-		return uri;
-	}
-	
-	/**
-	 * Gets the library path.
-	 */
-	public String getPath() {
-		return path;
-	}	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/package.html b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/package.html
deleted file mode 100644
index a9858a0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for managing a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/providers/DelegateLabelProvider.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/providers/DelegateLabelProvider.java
deleted file mode 100644
index 040fb17..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/providers/DelegateLabelProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2008 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.providers;
-
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.5
- *
- */
-public class DelegateLabelProvider extends LabelProvider {
-	private IItemLabelProvider itemLabelProvider;
-
-	public DelegateLabelProvider(IItemLabelProvider itemLabelProvider) {
-		super();
-		this.itemLabelProvider = itemLabelProvider;
-	}
-	
-	@Override
-	public String getText(Object element) {
-		return itemLabelProvider.getText(element);
-	}
-	
-	@Override
-	public Image getImage(Object element) {
-		return ExtendedImageRegistry.getInstance().getImage(itemLabelProvider.getImage(element));
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/util/ConvertGuidanceType.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/util/ConvertGuidanceType.java
deleted file mode 100644
index d86e667..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/util/ConvertGuidanceType.java
+++ /dev/null
@@ -1,366 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.internal.ContentElementNameValidator;
-import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ListDialog;
-
-/**
- * class to convert guidance types
- * 
- * @author ???
- * @sicne 1.0
- *
- */
-public class ConvertGuidanceType {
-
-	static IValidator validator;
-	private static int[] compatibleGuidances = { UmaPackage.CONCEPT,
-	// UmaPackage.CHECKLIST,
-			// UmaPackage.EXAMPLE,
-			UmaPackage.GUIDELINE,
-			// UmaPackage.ESTIMATE,
-			// UmaPackage.ESTIMATING_METRIC,
-			// UmaPackage.ESTIMATION_CONSIDERATIONS,
-			// UmaPackage.REPORT,
-			// UmaPackage.TEMPLATE,
-			UmaPackage.SUPPORTING_MATERIAL,
-	// UmaPackage.TOOL_MENTOR,
-	// UmaPackage.WHITEPAPER,
-	// UmaPackage.TERM_DEFINITION,
-	// UmaPackage.PRACTICE,
-	// UmaPackage.REUSABLE_ASSET
-	};
-
-	private static List compatibleGuidancesList = new ArrayList();
-	static {
-		for (int i = 0; i < compatibleGuidances.length; i++)
-			compatibleGuidancesList.add(new Integer(compatibleGuidances[i]));
-	}
-
-	public static Guidance convertGuidance(Guidance oldGuidance, Shell shell,
-			DeleteMethodElementCommand command) {
-		return convertGuidance(oldGuidance, shell, command, null);
-	}
-		
-	public static Guidance convertGuidance(Guidance oldGuidance, Shell shell,
-				DeleteMethodElementCommand command, EClass newType) {
-		if (newType == null) {
-		if (shell == null)
-			shell = Display.getCurrent().getActiveShell();
-		ListDialog dlg = new ListDialog(shell);
-		dlg.setHeightInChars(5);
-		dlg.setContentProvider(new ArrayContentProvider());
-		dlg.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				switch (((Integer) element).intValue()) {
-				// TODO: refactor these strings (and this whole dialog) into
-				// library.ui
-				case UmaPackage.CONCEPT:
-					return LibraryResources.concept_text; 
-				case UmaPackage.CHECKLIST:
-					return LibraryResources.checklist_text; 
-				case UmaPackage.EXAMPLE:
-					return LibraryResources.example_text; 
-				case UmaPackage.GUIDELINE:
-					return LibraryResources.guideline_text; 
-				case UmaPackage.ESTIMATION_CONSIDERATIONS:
-					return LibraryResources.estimationConsiderations_text;
-				case UmaPackage.REPORT:
-					return LibraryResources.report_text; 
-				case UmaPackage.TEMPLATE:
-					return LibraryResources.template_text; 
-				case UmaPackage.SUPPORTING_MATERIAL:
-					return LibraryResources.supportingMaterial_text;
-				case UmaPackage.TOOL_MENTOR:
-					return LibraryResources.toolMentor_text;
-				case UmaPackage.WHITEPAPER:
-					return LibraryResources.whitepaper_text;
-				case UmaPackage.TERM_DEFINITION:
-					return LibraryResources.termDefinition_text;
-				case UmaPackage.PRACTICE:
-					return LibraryResources.practice_text; 
-				case UmaPackage.REUSABLE_ASSET:
-					return LibraryResources.reusableAsset_text;
-				default:
-					return LibraryResources.unknownGuidance_text;
-				}
-
-			}
-		});
-		List newGuidanceTypeList = getValidNewGuidanceTypes(oldGuidance);
-		if (newGuidanceTypeList == null) {
-			LibraryUIPlugin
-					.getDefault()
-					.getMsgDialog()
-					.displayError(
-							LibraryResources.convertGuidanceError_title,
-							LibraryResources.unsupportedGuidanceTypeError_msg,
-							NLS.bind(LibraryResources.unsupportedGuidanceTypeError_reason, StrUtil.toLower(TngUtil.getTypeText(oldGuidance)))); 
-			return null;
-		}
-		dlg.setInput(newGuidanceTypeList);
-		dlg.setTitle(LibraryResources.convertGuidanceDialog_title);
-		dlg.setMessage(LibraryResources.convertGuidanceDialog_text);
-		if (dlg.open() == Dialog.CANCEL)
-			return null;
-
-		Object[] selectionResult = dlg.getResult();
-		if (selectionResult == null)
-			return null;
-		int chosenGuidance = ((Integer) selectionResult[0]).intValue();
-		
-//		Guidance newGuidance = doConvert(oldGuidance, chosenGuidance, command);
-		
-		newType = getGuidanceType(chosenGuidance);
-		}
-		
-		if(newType == null) {
-			return null;
-		}
-		TypeConverter.TypeConversionCommand cmd = TypeConverter.createTypeConversionCommand(oldGuidance, newType, null, null, true, true);
-		try {
-			if(!cmd.getIllegalReferencers().isEmpty()) {
-				// type conversion will remove some illegal references
-				// confirm with user before continue
-				//
-				MultiStatus multiStatus = new MultiStatus(
-						LibraryEditPlugin.INSTANCE.getSymbolicName(), 0, "", null); //$NON-NLS-1$
-				for (Iterator iter = cmd.getIllegalReferencers().iterator(); iter.hasNext();) {
-					MethodElement e = (MethodElement) iter.next();
-					// don't show predefined element
-					//
-					if(!TngUtil.isPredefined(e)) {
-						String msg = NLS.bind(LibraryEditResources.elementType_text, e.eClass().getName(), TngUtil.getLabelWithPath(e)); 
-						IStatus status = new Status(IStatus.INFO,
-								LibraryEditPlugin.INSTANCE.getSymbolicName(), 0, msg,
-								null);
-						multiStatus.add(status);
-					}
-				}
-				if (multiStatus.getChildren().length > 0 &&
-						LibraryUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayConfirmation(
-								LibraryResources.convertGuidanceDialog_title,
-								LibraryEditResources.confirm_remove_references_text,
-								multiStatus) == Dialog.CANCEL) {
-					return null;
-				}
-			}
-
-			IStatus status = UserInteractionHelper.checkModify(cmd.getModifiedResources(), shell);
-			if(!status.isOK()) {
-				LibraryUIPlugin.getDefault().getMsgDialog().display(LibraryResources.convertGuidanceDialog_title, status);
-				return null;
-			}
-			cmd.execute();
-			Guidance newGuidance = (Guidance) cmd.getResult().iterator().next();
-
-			// save modified resources
-			//
-			ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-			try {
-				for (Iterator iter = cmd.getModifiedResources().iterator(); iter.hasNext();) {
-					Resource resource = (Resource) iter.next();
-					persister.save(resource);
-				}
-				persister.commit();
-				
-				if(ContentDescriptionFactory.hasPresentation(newGuidance)) {
-					persister.adjustLocation(newGuidance.getPresentation().eResource());
-				}				
-
-				cmd.copyResources();
-
-			} catch (Exception e) {
-				persister.rollback();
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						LibraryResources.convertGuidanceError_title,
-						NLS.bind(LibraryResources.saveConvertedGuidanceError_msg,
-								newGuidance.getName()),
-								LibraryResources.error_reason, e);
-			}
-
-			return newGuidance;
-		}
-		finally {
-			if(cmd != null) {
-				try { cmd.dispose(); } catch(Exception e) {}
-			}
-		}
-	}
-
-	/**
-	 * @param oldGuidance
-	 * @param newGuidance
-	 * @return
-	 */
-	private static String checkName(Guidance oldGuidance, Guidance newGuidance) {
-		// TODO Auto-generated method stub
-		
-		
-		validator = new ContentElementNameValidator(oldGuidance.eContainer()
-				, UmaPackage.eINSTANCE.getContentPackage_ContentElements(),
-				(ContentElement) newGuidance, new ValidatorFactory.TypeFilter(newGuidance));
-		
-		String msg = validator.isValid(newGuidance.getName());
-		
-		if (msg != null) {
-			String featureTxt = TngUtil.getFeatureText(UmaPackage.eINSTANCE
-					.getNamedElement_Name());
-			String title = LibraryEditResources.resolveNameConflictDialog_title; 
-			String dlgMsg = NLS.bind(
-					LibraryEditResources.resolveNameConflictDialog_text,
-					StrUtil.toLower(featureTxt), newGuidance.getName());
-			String currentValue = (String) newGuidance.eGet(UmaPackage.eINSTANCE
-					.getNamedElement_Name());
-
-			IInputValidator inputValidator = new IInputValidator() {
-				public String isValid(String newText) {
-					return validator.isValid(newText);
-				}
-			};
-
-			InputDialog inputDlg = new InputDialog(
-					MsgBox.getDefaultShell(), title, dlgMsg, currentValue,
-					inputValidator);
-			if (inputDlg.open() == Window.CANCEL) {
-				throw new OperationCanceledException();
-			}
-			return inputDlg.getValue();
-		}
-		return null;
-	}
-	
-	private static EClass getGuidanceType(int newGuidanceType) {
-		switch (newGuidanceType) {
-		case UmaPackage.CONCEPT:
-			return UmaPackage.Literals.CONCEPT;
-		case UmaPackage.CHECKLIST:
-			return UmaPackage.Literals.CHECKLIST;
-		case UmaPackage.EXAMPLE:
-			return UmaPackage.Literals.EXAMPLE;
-		case UmaPackage.GUIDELINE:
-			return UmaPackage.Literals.GUIDELINE;
-		case UmaPackage.ESTIMATION_CONSIDERATIONS:
-			return UmaPackage.Literals.ESTIMATION_CONSIDERATIONS;
-		case UmaPackage.REPORT:
-			return UmaPackage.Literals.REPORT;
-		case UmaPackage.TEMPLATE:
-			return UmaPackage.Literals.TEMPLATE;
-		case UmaPackage.SUPPORTING_MATERIAL:
-			return UmaPackage.Literals.SUPPORTING_MATERIAL;
-		case UmaPackage.TOOL_MENTOR:
-			return UmaPackage.Literals.TOOL_MENTOR;
-		case UmaPackage.WHITEPAPER:
-			return UmaPackage.Literals.WHITEPAPER;
-		case UmaPackage.TERM_DEFINITION:
-			return UmaPackage.Literals.TERM_DEFINITION;
-		case UmaPackage.PRACTICE:
-			return UmaPackage.Literals.PRACTICE;
-		case UmaPackage.REUSABLE_ASSET:
-			return UmaPackage.Literals.REUSABLE_ASSET;
-		default:
-			return null;
-		}
-	}
-
-	private static Guidance createNewGuidance(int newGuidanceType) {
-		switch (newGuidanceType) {
-		case UmaPackage.CONCEPT:
-			return UmaFactory.eINSTANCE.createConcept();
-		case UmaPackage.CHECKLIST:
-			return UmaFactory.eINSTANCE.createChecklist();
-		case UmaPackage.EXAMPLE:
-			return UmaFactory.eINSTANCE.createExample();
-		case UmaPackage.GUIDELINE:
-			return UmaFactory.eINSTANCE.createGuideline();
-		case UmaPackage.ESTIMATION_CONSIDERATIONS:
-			return UmaFactory.eINSTANCE.createEstimationConsiderations();
-		case UmaPackage.REPORT:
-			return UmaFactory.eINSTANCE.createReport();
-		case UmaPackage.TEMPLATE:
-			return UmaFactory.eINSTANCE.createTemplate();
-		case UmaPackage.SUPPORTING_MATERIAL:
-			return UmaFactory.eINSTANCE.createSupportingMaterial();
-		case UmaPackage.TOOL_MENTOR:
-			return UmaFactory.eINSTANCE.createToolMentor();
-		case UmaPackage.WHITEPAPER:
-			return UmaFactory.eINSTANCE.createWhitepaper();
-		case UmaPackage.TERM_DEFINITION:
-			return UmaFactory.eINSTANCE.createTermDefinition();
-		case UmaPackage.PRACTICE:
-			return UmaFactory.eINSTANCE.createPractice();
-		case UmaPackage.REUSABLE_ASSET:
-			return UmaFactory.eINSTANCE.createReusableAsset();
-		default:
-			return null;
-		}
-	}
-
-	public static List getValidNewGuidanceTypes(Guidance oldGuidance) {
-		if (oldGuidance == null)
-			return null;
-		Integer oldGuidanceClassID = new Integer(oldGuidance.eClass()
-				.getClassifierID());
-		if (!compatibleGuidancesList.contains(oldGuidanceClassID))
-			return null;
-		List guidanceList = new ArrayList();
-		for (int i = 0; i < compatibleGuidances.length; i++) {
-			Integer compatibleGuidanceTypeClassID = new Integer(
-					compatibleGuidances[i]);
-			if (!oldGuidanceClassID.equals(compatibleGuidanceTypeClassID))
-				guidanceList.add(compatibleGuidanceTypeClassID);
-		}
-		return guidanceList;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/util/TypeConverter.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/util/TypeConverter.java
deleted file mode 100644
index 04e4abc..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/util/TypeConverter.java
+++ /dev/null
@@ -1,637 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.LibraryEditResources;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.command.NestedCommandExcecutor;
-import org.eclipse.epf.library.edit.util.ExtensionManager;
-import org.eclipse.epf.library.edit.util.IOppositeFeatureLoader;
-import org.eclipse.epf.library.edit.util.Messenger;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.util.ContentResourceScanner;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class TypeConverter {
-	private static final Comparator activityFeatureComparator = new Comparator() {
-
-		public int compare(Object arg0, Object arg1) {
-			if(arg0 == UmaPackage.Literals.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES) {
-				return -1;
-			}
-			return 0;
-		}
-		
-	};
-	
-	/**
-	 * Converts the specified object to a object of new type specified by <code>newType</code> while still
-	 * preserving as many attributes and relationships as possible
-	 * 
-	 * @param object
-	 * @param newType
-	 * @param oldFeatureToNewFeatureMap map of feature of <code>object</code> to feature of <code>newType</code>
-	 * @return new object of type <code>newType</code>
-	 */
-	public static final EObject convert(EObject object, EClass newType,
-			Map oldFeatureToNewFeatureMap, Comparator featureComparator, Set modifiedResources) 
-	{
-		TypeConversionCommand cmd = createTypeConversionCommand(object, newType, oldFeatureToNewFeatureMap, featureComparator);
-		Collection<Resource> resources = cmd.getModifiedResources();
-		if(!resources.isEmpty()) {
-			Resource[] resourceArray = new Resource[resources.size()];
-			resources.toArray(resourceArray);
-			IStatus status = Services.getAccessController().checkModify(resourceArray, ExtensionManager.getDefaultUserInteractionHandler().getUIContext());
-			if(!status.isOK()) {
-				Messenger.INSTANCE.showError(LibraryResources.convertActivityError_title, null, status);
-				return null;
-			}
-		}
-		try {
-			cmd.execute();
-			modifiedResources.addAll(cmd.getModifiedResources());
-			return (EObject) cmd.getResult().iterator().next();
-		}
-		finally {
-			cmd.dispose();
-		}
-	}
-	
-	private static class ResourceCopyTask {
-		ContentResourceScanner scanner;
-		MethodElement owner;
-		String content;
-		String contentPath;
-		
-		/**
-		 * @param scanner
-		 * @param owner
-		 * @param content
-		 * @param contentPath
-		 */
-		public ResourceCopyTask(ContentResourceScanner scanner, MethodElement owner, String content, String contentPath) {
-			super();
-			this.scanner = scanner;
-			this.owner = owner;
-			this.content = content;
-			this.contentPath = contentPath;
-		}	
-				
-	}
-	
-	public static class TypeConversionCommand extends CompoundCommand implements IResourceAwareCommand {
-
-		private Collection<?> result;
-		private EObject object;
-		private HashSet<Resource> modifiedResources;
-		private boolean gotModifiedResources;
-		private List<ResourceCopyTask> resourceCopyTasks;
-		private Resource resource;
-		private Collection illegalReferencers;
-		private NestedCommandExcecutor nestedCommandExcecutor;
-
-		/**
-		 * @param object
-		 */
-		public TypeConversionCommand(EObject object) {
-			this.object = object;
-			modifiedResources = new HashSet<Resource>();
-			resource = object.eResource();
-			if(resource != null) {
-				modifiedResources.add(resource);
-			}
-			resourceCopyTasks = new ArrayList<ResourceCopyTask>();
-			nestedCommandExcecutor = new NestedCommandExcecutor(this);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.common.command.CompoundCommand#dispose()
-		 */
-		public void dispose() {
-			if(illegalReferencers != null) {
-				illegalReferencers.clear();
-			}
-			if(modifiedResources != null) {
-				modifiedResources.clear();
-			}
-			if(resourceCopyTasks != null) {
-				resourceCopyTasks.clear();
-			}
-			if(nestedCommandExcecutor != null) {
-				nestedCommandExcecutor.dispose();
-			}
-			super.dispose();
-		}
-				
-		/**
-		 * Gets referencers that become illegal after the type conversion
-		 * 
-		 * @return
-		 */
-		public Collection getIllegalReferencers() {
-			if(illegalReferencers == null) {
-				getModifiedResources();
-			}
-			return illegalReferencers;
-		}
-		
-		public void copyResources() {
-			if(!resourceCopyTasks.isEmpty()) {
-				for (ResourceCopyTask t : resourceCopyTasks) {
-					File newResourcePath = new File(ResourceHelper.getAbsoluteElementResourcePath(t.owner));
-					t.scanner.setTargetRootPath(newResourcePath);
-					if(t.content != null) {
-						t.scanner.resolveResources(t.owner, t.content, t.contentPath);
-					}
-					else {
-						for (EAttribute attribute : t.owner.eClass().getEAllAttributes()) {
-							Object value = t.owner.eGet(attribute);
-							if(value instanceof String) {
-								t.scanner.resolveResources(t.owner, (String) value, t.contentPath);
-							}
-						}
-					}
-				}
-			}
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
-		 */
-		public Collection<Resource> getModifiedResources() {
-			if(!gotModifiedResources) {
-				illegalReferencers = new HashSet();
-				for (Iterator iter = commandList.iterator(); iter.hasNext();) {
-					Command cmd = (Command) iter.next();
-					if(cmd instanceof RemoveCommand) {
-						RemoveCommand removeCommand = (RemoveCommand) cmd;
-						EObject owner = removeCommand.getOwner();
-						Resource ownerResource = owner.eResource();
-						if(ownerResource != null && ownerResource != resource) {
-							modifiedResources.add(ownerResource);
-						}
-						if(ownerResource != null && owner != object && !UmaUtil.isContainedBy(owner, object)) {
-							illegalReferencers.add(owner);
-						}
-					}
-					else if(cmd instanceof SetCommand) {
-						SetCommand setCommand = (SetCommand) cmd;
-						EObject owner = setCommand.getOwner();
-						Resource ownerResource = owner.eResource();
-						if(ownerResource != null && ownerResource != resource && setCommand.getValue() instanceof EObject) {
-							EObject value = (EObject) setCommand.getValue();
-							if(value != object || !UmaUtil.isContainedBy(value, object)) {
-								modifiedResources.add(ownerResource);
-							}
-						}
-						if(ownerResource != null && owner != object && !UmaUtil.isContainedBy(owner, object)
-								&& setCommand.getValue() == setCommand.getFeature().getDefaultValue()) {
-							illegalReferencers.add(owner);
-						}
-					}
-				}
-				
-				gotModifiedResources = true;
-			}
-			modifiedResources.addAll(nestedCommandExcecutor.getModifiedResources());		
-			return modifiedResources;
-		}
-		
-		private void setResult(Collection<?> result) {
-			this.result = result;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.emf.common.command.CompoundCommand#getResult()
-		 */
-		public Collection<?> getResult() {
-			return result;
-		}
-		
-		@Override
-		public void execute() {
-			super.execute();			
-			nestedCommandExcecutor.executeNestedCommands();
-		}
-		
-		@Override
-		public void undo() {
-			nestedCommandExcecutor.undoNestedCommands();
-			super.undo();
-		}
-		
-		private List<Command> commandList() {
-			return commandList;
-		}
-	}
-	
-	/**
-	 * 
-	 * @param object EObject
-	 * @param newType EClass
-	 * @param oldFeatureToNewFeatureMap Map
-	 * @param featureComparator Comparator
-	 * @return TypeConversionCommand
-	 */
-	public static final TypeConversionCommand createTypeConversionCommand(EObject object, EClass newType, 
-			Map oldFeatureToNewFeatureMap, Comparator featureComparator) {
-		return createTypeConversionCommand(object, newType, oldFeatureToNewFeatureMap, featureComparator, false, false);
-	}
-	
-	/**
-	 * 
-	 * @param object EObject
-	 * @param newType EClass
-	 * @param oldFeatureToNewFeatureMap Map
-	 * @param featureComparator Comparator
-	 * @param removeIncomingReferences boolean
-	 * @param removeVariability boolean
-	 * @return TypeConversionCommand
-	 */
-	public static final TypeConversionCommand createTypeConversionCommand(EObject object, EClass newType, 
-			Map oldFeatureToNewFeatureMap, Comparator featureComparator, 
-			boolean removeIncomingReferences, boolean removeVariability) {
-		TypeConversionCommand cmd = new TypeConversionCommand(object);
-		EObject newObject = prepareConvert(object, newType, oldFeatureToNewFeatureMap, featureComparator, removeIncomingReferences, removeVariability, cmd);
-		
-		// replace object with newObject in the object's container
-		//
-		EObject container = object.eContainer();
-		if(container != null) {
-			EReference ref = object.eContainmentFeature();
-			if(ref.isMany()) {
-				List list = (List) container.eGet(ref);
-				int index = list.indexOf(object);
-				cmd.commandList().add(0, new SetCommand(null, container, ref, newObject, index));
-			}
-			else {
-				cmd.commandList().add(0, new SetCommand(null, container, ref, newObject));
-			}
-		}
-		
-		cmd.setResult(Collections.singletonList(newObject));
-		
-		return cmd;
-	}
-	
-	private static ContentResourceScanner createScanner(EObject object) {
-		if(object instanceof ContentDescription && !(object instanceof BreakdownElementDescription)) {			
-			File oldResourcePath = new File(ResourceHelper.getFolderAbsolutePath((MethodElement) object));
-			String rootContentpath = ResourceHelper.getElementPath((MethodElement)object);
-			ContentResourceScanner scanner = new ContentResourceScanner(oldResourcePath, null, rootContentpath, null);
-			return scanner;
-		}
-		return null;
-	}	
-	
-	/**
-	 * Prepares a compound command to do a type conversion
-	 * 
-	 * @param object
-	 * @param newType
-	 * @param oldFeatureToNewFeatureMap
-	 * @param featureComparator used to sort the feature list of object to convert before copying/moving
-	 *        feature values to new object.
-	 * @param removeIncomingReferences if true will remove all incoming references 
-	 * @param compoundCommand
-	 * @return EObject
-	 */
-	public static final EObject prepareConvert(EObject object, EClass newType, Map oldFeatureToNewFeatureMap,
-			Comparator featureComparator, boolean removeIncomingReferences, boolean removeVariability,
-			TypeConversionCommand compoundCommand) {
-		EObject newObject = UmaFactory.eINSTANCE.create(newType);
-		
-		if(object instanceof MethodElement) {
-			// Handle incoming references.
-			// If removeIncommingReferences is false, redirect all incoming references of object to newObject
-			// If removeIncommingReferences is true, remove all of them.
-			//			
-
-			MethodElement me = (MethodElement) object;
-			Collection oppositeFeatures = me.getOppositeFeatures();
-			if(!oppositeFeatures.isEmpty()) {				
-				
-				// load opposite features
-				//
-				Collection collection = Collections.singletonList(object);
-				for (Iterator iter = ExtensionManager.getOppositeFeatureLoaders().iterator(); iter
-						.hasNext();) {
-					IOppositeFeatureLoader loader = (IOppositeFeatureLoader) iter.next();
-					loader.loadOppositeFeatures(collection);
-				}
-				
-				Map referencerToFeatureListMap = AssociationHelper.getReferenceMap(me);
-				for (Iterator iter = referencerToFeatureListMap.entrySet().iterator(); iter
-						.hasNext();) {
-					Map.Entry entry = (Map.Entry) iter.next();
-					EObject referencer = (EObject) entry.getKey();
-					for (Iterator iterator = ((Collection)entry.getValue()).iterator(); iterator
-							.hasNext();) {
-						EReference feature = (EReference) iterator.next();
-						if(!removeIncomingReferences && feature.getEType().isInstance(newObject)) {
-							// new type is compatible, reference can be preserved
-							//
-							if(feature.isMany()) {
-								List list = (List) referencer.eGet(feature);
-								int index = list.indexOf(object);
-								compoundCommand.append(new SetCommand(null, referencer, feature, newObject, index));
-							}
-							else {
-								compoundCommand.append(new SetCommand(null, referencer, feature, newObject));
-							}
-						}
-						else {
-							// new type is not compatible, reference must be removed
-							//
-							if(feature.isMany()) {
-								compoundCommand.append(new RemoveCommand(null, referencer, feature, object));
-							}
-							else {
-								compoundCommand.append(new SetCommand(null, referencer, feature, feature.getDefaultValue()));
-							}
-						}
-					}
-				}
-			}
-		}
-		
-		// copy all the features
-		//
-		List newObjectFeatures = newType.getEAllStructuralFeatures();
-		List objectFeatures = new ArrayList(object.eClass().getEAllStructuralFeatures());
-		if(removeVariability) {
-			objectFeatures.remove(UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT);
-			objectFeatures.remove(UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE);
-		}
-		if(featureComparator != null) {
-			Collections.sort(objectFeatures, featureComparator);
-		}
-		ContentResourceScanner scanner = createScanner(object);
-		for (Iterator iter = objectFeatures.iterator(); iter.hasNext();) {
-			EStructuralFeature feature = (EStructuralFeature) iter.next();
-			if(!newObjectFeatures.contains(feature)) {
-				if(oldFeatureToNewFeatureMap != null) {
-					Object f = oldFeatureToNewFeatureMap.get(feature);
-					if(f != null && newObjectFeatures.contains(f)) {
-						feature = (EStructuralFeature) f;
-					}
-					else {
-						feature = null;
-					}
-				}
-				else {
-					feature = null;
-				}
-			}
-			if(feature != null && feature.isChangeable()) {				
-				boolean featureHandled = false;
-				if(feature instanceof EReference) {
-					EReference ref = (EReference) feature;
-					if(ref == UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION) {
-						if(ContentDescriptionFactory.hasPresentation((MethodElement) object)) {
-							ContentDescription content = (ContentDescription) object.eGet(ref);
-							EClass contentDescType = ContentDescriptionFactory.getContentDescriptionType(newType);
-							if(contentDescType != null && contentDescType != content.eClass()) {
-								EObject newContent = prepareConvert(content, contentDescType, null, null, removeIncomingReferences, removeVariability, compoundCommand);
-								
-								// remove old content
-								//
-								EObject container = content.eContainer();
-								if(container != null) {
-									compoundCommand.append(new SetCommand(null, object, ref, null));
-									Resource resource = content.eResource();
-									if(resource != null) {
-										compoundCommand.modifiedResources.add(content.eResource());
-									}
-								}
-								
-								content = (ContentDescription) newContent;
-							}
-							else {
-								compoundCommand.resourceCopyTasks.add(new ResourceCopyTask(createScanner(content), content, null, "")); //$NON-NLS-1$
-							}
-							compoundCommand.append(new SetCommand(null, newObject, ref, content));
-						}
-						featureHandled = true;
-					}					
-					else if(!ref.isContainment() && ref.getEOpposite() != null) {
-						// Reference is bi-directional. If opposite reference is a list, replace object
-						// with new object at the same position in the list.
-						//
-						EReference oppositeRef = ref.getEOpposite();						
-						if(oppositeRef.isMany()) {
-							Object value = object.eGet(ref);
-							if(value != null) {
-								if(ref.isMany()) {
-									for (Iterator iterator = ((Collection)value)
-											.iterator(); iterator.hasNext();) {
-										EObject otherEnd = (EObject) iterator.next();
-										List list = (List) otherEnd.eGet(oppositeRef);
-										int index = list.indexOf(object);
-										compoundCommand.append(new SetCommand(null, otherEnd, oppositeRef, newObject, index));
-									}
-								}
-								else {
-									EObject otherEnd = (EObject) value;
-									List list = (List) otherEnd.eGet(oppositeRef);
-									int index = list.indexOf(object);
-									compoundCommand.append(new SetCommand(null, otherEnd, oppositeRef, newObject, index));								}
-							}
-							featureHandled = true;
-						}
-					}
-				}
-				if(!featureHandled) {
-					Object value = object.eGet(feature);
-					if (feature == UmaPackage.Literals.NAMED_ELEMENT__NAME) {
-						// validate name
-						String newName = checkName(object, newType);
-						if (newName != null) {
-							value = newName;
-						}
-					}
-					if(scanner != null && value instanceof String && object instanceof MethodElement) {
-						String str = (String) value;
-						if(!StrUtil.isBlank(str)) {
-							compoundCommand.resourceCopyTasks.add(new ResourceCopyTask(scanner, (MethodElement)object, str, "")); //$NON-NLS-1$
-						}
-					}
-					compoundCommand.append(new SetCommand(null, newObject, feature, value));
-				}
-			}
-		}
-						
-		return newObject;
-	}
-
-	/**
-	 * Converts an activity to new type.
-	 * 
-	 * @param oldActivity Activity
-	 * @param newType EClass
-	 * @return Activity
-	 */
-	public static Activity convertActivity(Activity oldActivity, EClass newType) {
-		// activity is already this type
-		//
-		if (newType == oldActivity.eClass()) {
-			return null;
-		}
-		
-		HashSet<Resource> modifiedResources = new HashSet<Resource>();
-		Activity newActivity = (Activity) TypeConverter.convert(oldActivity, newType, null, activityFeatureComparator, modifiedResources);
-
-		// make oldActivity a proxy so reference to it can be resolved to newActivity
-		//
-		URI uri = PersistenceUtil.getProxyURI(newActivity);
-		((InternalEObject)oldActivity).eSetProxyURI(uri);
-				
-		// save modified resources
-		//
-		if (!modifiedResources.isEmpty()) {
-			ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil.getCurrentPersister().getFailSafePersister();
-			try {
-				for (Resource res : modifiedResources) {
-					persister.save(res);
-				}
-				persister.commit();
-
-			} catch (Exception e) {
-				LibraryUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayError(
-								LibraryResources.convertActivityError_title,
-								NLS
-										.bind(
-												LibraryResources.saveConvertedActivityError_msg,
-												newActivity.getName()),
-								LibraryResources.error_reason, e);
-
-				persister.rollback();
-			}
-		}
-		
-		return newActivity;
-	}		
-	
-	/**
-	 * 
-	 * @param typeID int
-	 * @return EClass
-	 */
-	public static EClass getActivityType(int typeID) {
-		switch (typeID) {
-		case UmaPackage.ACTIVITY:
-			return UmaPackage.Literals.ACTIVITY;
-		case UmaPackage.ITERATION:
-			return UmaPackage.Literals.ITERATION;
-		case UmaPackage.PHASE:
-			return UmaPackage.Literals.PHASE;
-		default:
-			return null;
-		}
-	}
-
-	
-	/**
-	 * @param oldGuidance
-	 * @param newGuidance
-	 * @return
-	 */
-	private static String checkName(EObject object, EClass newType) {
-		// TODO Auto-generated method stub
-		if (object instanceof NamedElement) {
-			NamedElement e = (NamedElement)object;
-			final IValidator validator = IValidatorFactory.INSTANCE.createNameValidator(e.eContainer(), e, newType);
-			String msg = validator.isValid(e.getName());
-			if(msg != null) {
-				String featureTxt = TngUtil.getFeatureText(UmaPackage.eINSTANCE
-						.getNamedElement_Name());
-				String title = LibraryEditResources.resolveNameConflictDialog_title; 
-				String dlgMsg = NLS.bind(
-						LibraryEditResources.resolveNameConflictDialog_text,
-						StrUtil.toLower(featureTxt), e.getName());
-				String currentValue = (String) e.eGet(UmaPackage.eINSTANCE
-						.getNamedElement_Name());
-	
-				IInputValidator inputValidator = new IInputValidator() {
-					public String isValid(String newText) {
-						return validator.isValid(newText);
-					}
-				};
-	
-				InputDialog inputDlg = new InputDialog(
-						MsgBox.getDefaultShell(), title, dlgMsg, currentValue,
-						inputValidator);
-				if (inputDlg.open() == Window.CANCEL) {
-					throw new OperationCanceledException();
-				}
-				return inputDlg.getValue();
-			}
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeContentProvider.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeContentProvider.java
deleted file mode 100644
index 91a72e1..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeContentProvider.java
+++ /dev/null
@@ -1,175 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.views;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The content provider for a process tree.
- * <p>
- * Displays the tree in the following hierarchy:
- * <ul>
- * <li>method_plugin_1</li>
- * <ul>
- * <li>"Capability Patterns" UI folder</li>
- * <ul>
- * <li>capability_pattern_1</li>
- * <li>capability_pattern_2</li>
- * </ul>
- * </li>
- * <li>"Delivery Processes" UI folder</li>
- * <ul>
- * <li>delivery_process_1</li>
- * <li>delivery_process_2</li>
- * </ul>
- * </li>
- * </ul>
- * </li>
- * <li>method_plugin_2</li>
- * <ul>
- * <li>"Capability Patterns" UI folder</li>
- * </li>
- * <li>"Delivery Processes" UI folder</li>
- * </li>
- * </ul>
- * </li>
- * </ul>
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ProcessTreeContentProvider implements ITreeContentProvider {
-
-	protected static final String CAPABILITY_PATTERNS = LibraryUIResources.capabilityPattern_text_plural;
-
-	protected static final String DELIVERY_PROCESSES = LibraryUIResources.deliveryProcess_text_plural;
-
-	protected static final Object[] EMPTY_LIST = new Object[0];
-
-	protected Map<MethodPlugin, ProcessTreeUIFolder> capabilityPatternUIFolders = new HashMap<MethodPlugin, ProcessTreeUIFolder>();
-
-	protected Map<MethodPlugin, ProcessTreeUIFolder> deliveryProcessUIFolders = new HashMap<MethodPlugin, ProcessTreeUIFolder>();
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		if (parentElement instanceof MethodLibrary) {
-			List<Object> children = new ArrayList<Object>();
-			List<MethodPlugin> plugins = ((MethodLibrary) parentElement)
-					.getMethodPlugins();
-			for (Iterator<MethodPlugin> it = plugins.iterator(); it.hasNext();) {
-				MethodPlugin plugin = it.next();
-				List<Process> processes = TngUtil.getAllProcesses(plugin);
-				if (processes.size() > 0) {
-					children.add(plugin);
-				}
-			}
-			return children.toArray();
-		} else if (parentElement instanceof MethodPlugin) {
-			MethodPlugin plugin = (MethodPlugin) parentElement;
-
-			ProcessTreeUIFolder capabilityPatternUIFolder = capabilityPatternUIFolders
-					.get(plugin);
-			if (capabilityPatternUIFolder == null) {
-				capabilityPatternUIFolder = new ProcessTreeUIFolder(
-						CAPABILITY_PATTERNS,
-						ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-								.getImage("full/obj16/CapabilityPatterns")), parentElement); //$NON-NLS-1$
-				capabilityPatternUIFolders.put(plugin,
-						capabilityPatternUIFolder);
-			}
-
-			ProcessTreeUIFolder deliveryProcessUIFolder = deliveryProcessUIFolders
-					.get(plugin);
-			if (deliveryProcessUIFolder == null) {
-				deliveryProcessUIFolder = new ProcessTreeUIFolder(
-						DELIVERY_PROCESSES,
-						ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-								.getImage("full/obj16/DeliveryProcesses")), parentElement); //$NON-NLS-1$
-				deliveryProcessUIFolders.put(plugin, deliveryProcessUIFolder);
-			}
-
-			return new Object[] { capabilityPatternUIFolder,
-					deliveryProcessUIFolder };
-		} else if (parentElement instanceof ProcessTreeUIFolder) {
-			ProcessTreeUIFolder uiFolder = (ProcessTreeUIFolder) parentElement;
-			MethodPlugin plugin = (MethodPlugin) uiFolder.getParent();
-			if (uiFolder.getName() == CAPABILITY_PATTERNS) {
-				return LibraryServiceUtil.getCapabilityPatterns(plugin)
-						.toArray();
-			} else {
-				return LibraryServiceUtil.getDeliveryProcesses(plugin)
-						.toArray();
-			}
-		}
-		return EMPTY_LIST;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof ProcessTreeUIFolder) {
-			return ((ProcessTreeUIFolder) element).getParent();
-		} else if (element instanceof CapabilityPattern) {
-			MethodPlugin plugin = UmaUtil
-					.getMethodPlugin((CapabilityPattern) element);
-			return capabilityPatternUIFolders.get(plugin);
-		} else if (element instanceof DeliveryProcess) {
-			MethodPlugin plugin = UmaUtil
-					.getMethodPlugin((DeliveryProcess) element);
-			return deliveryProcessUIFolders.get(plugin);
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object)
-	 */
-	public boolean hasChildren(Object element) {
-		return getChildren(element).length > 0;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		capabilityPatternUIFolders.clear();
-		deliveryProcessUIFolders.clear();
-	}
-
-	public void dispose() {
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeLabelProvider.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeLabelProvider.java
deleted file mode 100644
index 0ea165a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeLabelProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.views;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The label provider for the process tree viewer.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ProcessTreeLabelProvider extends LabelProvider {
-
-	private static ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			new UmaItemProviderAdapterFactory());
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ProcessTreeLabelProvider() {
-		super();
-	}
-
-	/**
-	 * @see LabelProvider#getText(Object)
-	 */
-	public String getText(Object obj) {
-		if (obj instanceof ProcessTreeUIFolder) {
-			return ((ProcessTreeUIFolder) obj).getName();
-		} else if (obj instanceof MethodElement) {
-			return ((MethodElement) obj).getName();
-		}
-		return labelProvider.getText(obj);
-	}
-
-	/**
-	 * @see LabelProvider#getImage(Object)
-	 */
-	public Image getImage(Object obj) {
-		if (obj instanceof ProcessTreeUIFolder) {
-			return ((ProcessTreeUIFolder) obj).getImage();
-		}
-		return labelProvider.getImage(obj);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeUIFolder.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeUIFolder.java
deleted file mode 100644
index 8d92e4c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeUIFolder.java
+++ /dev/null
@@ -1,119 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.views;
-
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Models a UI folder in the process tree viewer.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ProcessTreeUIFolder {
-
-	private static final Image DEFAULT_IMAGE = ExtendedImageRegistry.getInstance().getImage( 
-		LibraryEditPlugin.INSTANCE.getImage("full/obj16/Folder")); //$NON-NLS-1$
-
-	private String name;
-
-	private Image image;
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            a name for the folder
-	 */
-	public ProcessTreeUIFolder(String name) {
-		this(name, DEFAULT_IMAGE, null);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            a name for the folder
-	 * @param parent
-	 *            the parent object
-	 */
-	public ProcessTreeUIFolder(String name, Object parent) {
-		this(name, DEFAULT_IMAGE, parent);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            a name for the folder
-	 * @param image
-	 *            an image for the folder
-	 * @param parent
-	 *            the parent object
-	 */
-	public ProcessTreeUIFolder(String name, Image image, Object parent) {
-		this.name = name;
-		this.image = image;
-		this.parent = parent;
-	}
-
-	/**
-	 * Returns the name.
-	 * 
-	 * @return the folder name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Returns the image.
-	 * 
-	 * @return the image for a UI folder
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Returns the parent object.
-	 * 
-	 * @return the parent object for the folder
-	 */
-	public Object getParent() {
-		return parent;
-	}
-
-	/**
-	 * Sets the parent object.
-	 * 
-	 * @param parent
-	 *            the parent object
-	 * @return the given parent object
-	 */
-	public Object setParent(Object parent) {
-		return this.parent = parent;
-	}
-
-	/**
-	 * Returns the string representation of this object.
-	 * 
-	 * @return the folder name
-	 */
-	public String toString() {
-		return name;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeViewer.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeViewer.java
deleted file mode 100644
index 6ba0235..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessTreeViewer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.views;
-
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Displays a tree view that allows a user to select a capability pattern or
- * delivery process.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ProcessTreeViewer extends TreeViewer {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	public ProcessTreeViewer(Composite parent) {
-		super(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		setContentProvider(new ProcessTreeContentProvider());
-		setLabelProvider(new ProcessTreeLabelProvider());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessView.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessView.java
deleted file mode 100644
index c95462f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/views/ProcessView.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.eclipse.epf.library.ui.views;
-
-public class ProcessView {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/DirectoryValidator.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/DirectoryValidator.java
deleted file mode 100644
index 426ccae..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/DirectoryValidator.java
+++ /dev/null
@@ -1,164 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-
-/**
- * Utility class for validating and creating a directory.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=162153
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=177500
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=182056
- */
-public class DirectoryValidator {
-
-	/**
-	 * Validates and creates a given directory.
-	 * <p>
-	 * Displays an error dialog if the directory path is not valid.
-	 * 
-	 * @param dir
-	 *            The path to be validated and created.
-	 * @param title
-	 *            The dialog title.
-	 * @param errorMsg
-	 *            The error message to be displayed in the error dialog.
-	 * @return <code>true</code> if path is valid.
-	 */
-	public static boolean checkAndCreateDir(String dir, String title,
-			String errorMsg) {		
-		boolean answer = false;
-		File file = new File(dir);
-		if (file.exists()) {
-			File[] files = file.listFiles();
-			if (files != null && files.length > 0) {
-				answer = LibraryUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayConfirmation(
-								title,
-								LibraryUIResources
-										.bind(
-												LibraryUIResources.deleteFilesConfirmation_msg,
-												dir));
-				if (answer == true) {
-					try {
-						answer = FileUtil
-								.deleteAllFiles(file.getAbsolutePath());
-						if (answer == false) {
-							LibraryUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayError(
-											title,
-											errorMsg,
-											LibraryUIResources
-													.bind(
-															LibraryUIResources.deleteFilesError_reason,
-															dir));
-						}
-					} catch (Exception e) {
-						LibraryUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										title,
-										errorMsg,
-										LibraryUIResources
-												.bind(
-														LibraryUIResources.deleteFilesError_reason,
-														dir), e);
-						answer = false;
-					}
-				}
-			} else {
-				answer = true;
-			}
-		} else {
-//			if (!file.isAbsolute()) {
-//				LibraryUIPlugin.getDefault().getMsgDialog().displayError(title,
-//						LibraryUIResources.invalidPath_msg);
-//				answer = false;
-//			} else {
-
-				try {
-					if (file.mkdirs() == false) {
-						LibraryUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										title,
-										errorMsg,
-										LibraryUIResources
-												.bind(
-														LibraryUIResources.createPathError_reason,
-														dir));
-						answer = false;
-					} else {
-						answer = true;
-					}
-				} catch (Exception e) {
-					LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-							title,
-							errorMsg,
-							LibraryUIResources.bind(
-									LibraryUIResources.createPathError_reason,
-									dir), e);
-					answer = false;
-				}
-			}
-//		}
-
-		return answer;
-	}
-	
-	/**
-	 * Validates and creates a given directory.
-	 * <p>
-	 * Displays an error dialog if the directory path is not valid.
-	 * 
-	 * @param dir
-	 *            The path to be validated and created.
-	 * @param title
-	 *            The dialog title.
-	 * @param errorMsg
-	 *            The error message to be displayed in the error dialog.
-	 * @param allowCurrentLibPath
-	 * 			  Allow paths containing current library or not
-	 * @return <code>true</code> if path is valid.
-	 */
-	public static boolean checkAndCreateDir(String dir, String title,
-			String errorMsg, boolean allowCurrentLibPath) {
-		if(!allowCurrentLibPath){
-			String currentLibPath = LibraryService.getInstance().getCurrentMethodLibraryLocation();
-			if (currentLibPath != null) {
-				String targetPathFileStr = new File(dir).getAbsolutePath();
-				String libPathFileStr = new File(currentLibPath).getAbsolutePath();
-				if (libPathFileStr.equals(targetPathFileStr)) {
-//				if(dir.startsWith(currentLibPath) || currentLibPath.startsWith(dir)){
-					LibraryUIPlugin.getDefault().getMsgDialog().
-					displayError(title, LibraryUIResources.overrideCurrentLibraryError_msg0);
-					return false;
-				}
-			}
-		}
-		return checkAndCreateDir(dir, title, errorMsg);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/LibraryBackupUtil.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/LibraryBackupUtil.java
deleted file mode 100644
index 2b7e8a0..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/LibraryBackupUtil.java
+++ /dev/null
@@ -1,117 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.common.ui.util.MsgBox;
-import org.eclipse.epf.library.ILibraryService;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.dialogs.LibraryBackupDialog;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Utility class to back up library.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LibraryBackupUtil {
-
-	private String path = null;
-
-	/**
-	 * Prompts to backup the current library
-	 * 
-	 * @param shell
-	 */
-	public static void promptBackupCurrentLibrary(Shell shell, ILibraryService service) {
-		String libPathStr = service.getCurrentMethodLibraryLocation();
-		File libPath = new File(libPathStr);
-		new LibraryBackupUtil().doBackup(shell, libPath, service);
-	}
-	
-	/**
-	 * Prompts to backup library
-	 * 
-	 * @param shell
-	 * @param libPath
-	 */
-	public static void promptBackupLibrary(Shell shell, File libPath) {
-		new LibraryBackupUtil().doBackup(shell, libPath, null);
-	}
-
-	private void doBackup(final Shell shell, final File libPath, ILibraryService service) {
-		path = null;
-
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				Shell s = shell;
-				if (s == null) {
-					s = MsgBox.getDefaultShell();
-				}
-
-				if (s == null) {
-					s = new Shell(MsgBox.getDisplay());
-				}
-
-				String title = LibraryUIResources.backupLibraryDialog_title;
-				String message = LibraryUIResources.backupLibraryDialog_text;
-				String backupPath = libPath.getAbsolutePath() + ".backup"; //$NON-NLS-1$	
-
-				LibraryBackupDialog dlg = new LibraryBackupDialog(s, title,
-						message, backupPath);
-
-				if (dlg.open() == Dialog.OK) {
-					path = dlg.getPath();
-				}
-			}
-		});
-
-		if (path != null) {
-			if (service == null) {
-				backup(libPath, new File(path));
-			} else {
-				service.getCurrentLibraryManager().backupMethodLibrary(path);
-			}
-		}
-
-	}
-
-	/**
-	 * Back up library 
-	 * 
-	 * @param source
-	 * @param dest
-	 */
-	public static void backup(final File source, final File dest) {
-		Runnable runnable = new Runnable() {
-			public void run() {
-				try {
-					// excude the non-library files that might be locked by rmc.
-					// these files may cause backup to fail due to file lock.
-					String excludes = ".lock"; //$NON-NLS-1$
-					LayoutResources.copyDir(source, dest, "**", excludes); //$NON-NLS-1$
-				} catch (RuntimeException e) {
-					e.printStackTrace();
-				}
-			}
-		};
-
-		UserInteractionHelper.runWithProgress(runnable,
-				LibraryUIResources.backingUpLibraryTask_name);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/NewLibraryWizardPage.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/NewLibraryWizardPage.java
deleted file mode 100644
index 3aa0604..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/NewLibraryWizardPage.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import java.util.Map;
-
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-
-/**
- * The abstract class for a New Method Library wizard page.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class NewLibraryWizardPage extends BaseWizardPage {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewLibraryWizardPage(String name) {
-		super(name);
-	}
-
-	/**
-	 * Returns the library specific user selections.
-	 */
-	public abstract Map getSelections();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/NewLibraryWizardPageFactory.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/NewLibraryWizardPageFactory.java
deleted file mode 100644
index f390991..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/NewLibraryWizardPageFactory.java
+++ /dev/null
@@ -1,177 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import java.lang.reflect.Constructor;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.serviceability.DebugTrace;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.internal.wizards.NewLibraryWizardPageContribution;
-import org.osgi.framework.Bundle;
-
-/**
- * Manages the New Library wizard pages defined via the
- * "org.eclipse.epf.library.ui.newLibraryWizardPages" extension point.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class NewLibraryWizardPageFactory {
-
-	/**
-	 * The extension point namespace.
-	 */
-	public static final String EXTENSION_POINT_NAMESPACE = "org.eclipse.epf.library.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension point name.
-	 */
-	public static final String EXTENSION_POINT_NAME = "newLibraryWizardPages"; //$NON-NLS-1$
-
-	// If true, debug tracing is enabled.
-	private static boolean debug = LibraryUIPlugin.getDefault().isDebugging();
-
-	// The shared instance.
-	private static NewLibraryWizardPageFactory instance = null;
-
-	// A map of wizard page providers.
-	private Map<String, NewLibraryWizardPageContribution> wizardPageProviders = new HashMap<String, NewLibraryWizardPageContribution>();
-
-	// A list of wizard page instances.
-	private Map<String, NewLibraryWizardPage> wizardPages = new HashMap<String, NewLibraryWizardPage>();
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static NewLibraryWizardPageFactory getInstance() {
-		if (instance == null) {
-			synchronized (NewLibraryWizardPageFactory.class) {
-				if (instance == null) {
-					instance = new NewLibraryWizardPageFactory();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private NewLibraryWizardPageFactory() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		if (debug) {
-			DebugTrace.print(this, "init"); //$NON-NLS-1$
-		}
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				EXTENSION_POINT_NAMESPACE, EXTENSION_POINT_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String className = configElement.getAttribute("class"); //$NON-NLS-1$
-						String typeId = configElement.getAttribute("type"); //$NON-NLS-1$
-						String title = configElement.getAttribute("title"); //$NON-NLS-1$
-						String description = configElement
-								.getAttribute("description"); //$NON-NLS-1$
-						if (debug) {
-							DebugTrace.print(this, "init", //$NON-NLS-1$ 
-									"configElement, class=" + className + //$NON-NLS-1$
-											", type=" + typeId + //$NON-NLS-1$
-											", title=" + title + //$NON-NLS-1$
-											", description=" + description); //$NON-NLS-1$							
-						}
-						if (className != null && className.trim().length() > 0
-								&& typeId != null && typeId.trim().length() > 0
-								&& title != null && title.trim().length() > 0
-								&& description != null
-								&& description.trim().length() > 0) {
-							if (!wizardPageProviders.containsKey(typeId)) {
-								NewLibraryWizardPageContribution provider = new NewLibraryWizardPageContribution(
-										bundle, className, typeId, title,
-										description);
-								wizardPageProviders.put(typeId, provider);
-							}
-						}
-					} catch (Exception e) {
-						LibraryUIPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates a wizard page.
-	 * 
-	 * @return a <code>NewLibraryWizardPage</code>
-	 */
-	public NewLibraryWizardPage createWizardPage(String pageId, String typeId) {
-		NewLibraryWizardPage wizardPage = (NewLibraryWizardPage) wizardPages
-				.get(typeId);
-		if (wizardPage != null) {
-			return wizardPage;
-		}
-
-		NewLibraryWizardPageContribution provider = (NewLibraryWizardPageContribution) wizardPageProviders
-				.get(typeId);
-		if (provider != null) {
-			Bundle bundle = provider.getBundle();
-			String className = provider.getClassName();
-			Class wizardPageClass;
-			Class[] argClass = new Class[] { String.class };
-			Object[] argValue = new Object[] { pageId };
-			Constructor constructor;
-			try {
-				wizardPageClass = bundle.loadClass(className);
-				constructor = wizardPageClass.getConstructor(argClass);
-				wizardPage = (NewLibraryWizardPage) constructor
-						.newInstance(argValue);
-				wizardPage.setTitle(provider.getTitle());
-				wizardPage.setDescription(provider.getDescription());
-				wizardPages.put(typeId, wizardPage);
-			} catch (Exception e) {
-				LibraryUIPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		return wizardPage;
-	}
-
-	/**
-	 * Returns a new or cached wizard page.
-	 * 
-	 * @return a <code>NewLibraryWizardPage</code> object
-	 */
-	public NewLibraryWizardPage getWizardPage(String typeId) {
-		return (NewLibraryWizardPage) wizardPages.get(typeId);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryMainPage.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryMainPage.java
deleted file mode 100644
index eb5b326..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryMainPage.java
+++ /dev/null
@@ -1,193 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import java.io.File;
-import java.util.List;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A wizard page that prompts the user to select a path to open a method
- * library.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class OpenLibraryMainPage extends BaseWizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = OpenLibraryMainPage.class.getName();
-
-	protected static final String TYPE_ID = "typeId"; //$NON-NLS-1$	
-
-	protected Shell shell;
-
-	protected Composite composite;
-
-	protected Label pathLabel;
-
-	protected Combo libraryPathCombo;
-
-	protected Button browseButton;
-
-	protected String libraryType;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param pageName
-	 *            the wizard page name
-	 */
-	public OpenLibraryMainPage(String pageName) {
-		super(pageName);
-		setTitle(LibraryUIResources.openLibraryWizard_title);
-		setDescription(LibraryUIResources.openLibraryMainWizardPage_title);
-		setImageDescriptor(LibraryUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/Open.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OpenLibraryMainPage() {
-		this(PAGE_NAME);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		shell = parent.getShell();
-
-		composite = createGridLayoutComposite(parent, 3);
-
-		pathLabel = createLabel(composite, LibraryUIResources.pathLabel_text);
-
-		libraryPathCombo = createCombobox(composite);
-
-		browseButton = createButton(composite,
-				LibraryUIResources.browseButton_text);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		List<String> openLibraryPathsList = LibraryUIPreferences
-				.getOpenLibraryPathsList();		
-		if (openLibraryPathsList.size() > 0) {
-			String[] openLibraryPaths = LibraryUIPreferences
-					.getOpenLibraryPaths();
-			libraryPathCombo.setItems(openLibraryPaths);
-			if (openLibraryPaths.length > 0) {
-				libraryPathCombo.setText(openLibraryPaths[0]);
-			}			
-		} else {
-			String libraryPath = LibraryUIPreferences
-					.getDefaultLibraryPath() + FileUtil.FILE_SEP + "Library1"; //$NON-NLS-1$
-			openLibraryPathsList.add(0, libraryPath);
-			String[] openLibraryPaths = new String[openLibraryPathsList.size()];
-			openLibraryPathsList.toArray(openLibraryPaths);
-			libraryPathCombo.setItems(openLibraryPaths);
-			libraryPathCombo.setText(openLibraryPaths[0]);
-		}
-	}
-
-	/**
-	 * Adds event listeners to the wizard page controls.
-	 */
-	protected void addListeners() {
-		libraryPathCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-
-		libraryPathCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				setPageComplete(isPageComplete());
-				getWizard().getContainer().updateButtons();
-			}
-		});
-
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				DirectoryDialog dialog = new DirectoryDialog(shell, SWT.NONE);
-				dialog.setFilterPath(getLibraryPath());
-				String selectedDir = dialog.open();
-				if (selectedDir != null) {
-					libraryPathCombo.add(selectedDir, 0);
-					libraryPathCombo.setText(selectedDir);
-				}
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		return getLibraryName().length() > 0;
-	}
-
-	/**
-	 * Gets the library name.
-	 */
-	public String getLibraryName() {
-		String libPath = getLibraryPath();
-		String libName = new File(libPath).getName();
-		if (!libPath.equals(libName)) {
-			return libName;
-		} else {
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the user specified library path.
-	 */
-	public String getLibraryPath() {
-		return libraryPathCombo.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified method library type.
-	 */
-	public String getLibraryType() {
-		return libraryType;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryWizard.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryWizard.java
deleted file mode 100644
index 2af05da..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryWizard.java
+++ /dev/null
@@ -1,285 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.dialogs.CopyLibraryDialog;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.library.xmi.XMILibraryManager;
-import org.eclipse.epf.library.xmi.XMILibraryUtil;
-import org.eclipse.epf.persistence.migration.UpgradeCallerInfo;
-import org.eclipse.epf.ui.wizards.BaseWizard;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that guides the user to open a method library.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class OpenLibraryWizard extends BaseWizard implements INewWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = OpenLibraryWizard.class.getName();
-
-	/**
-	 * The Open Library wizard extension point ID.
-	 */
-	public static final String WIZARD_EXTENSION_POINT_ID = "org.eclipse.epf.library.ui.openLibraryWizard"; //$NON-NLS-1$	
-
-	// The main wizard page.
-	protected OpenLibraryMainPage mainPage;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OpenLibraryWizard() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		super.init(workbench, selection);
-		setWindowTitle(LibraryUIResources.openLibraryWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#getWizardExtenderExtensionPointId()
-	 */
-	public String getWizardExtenderExtensionPointId() {
-		return WIZARD_EXTENSION_POINT_ID;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		if (wizardExtender == null) {
-			mainPage = createMainPage();
-			super.addPage(mainPage);
-		} else {
-			List<IWizardPage> wizardPages = new ArrayList<IWizardPage>();
-
-			IWizardPage page = wizardExtender
-					.getReplaceWizardPage(OpenLibraryMainPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				mainPage = createMainPage();
-				wizardPages.add(mainPage);
-			}
-
-			super.getNewWizardPages(wizardPages);
-
-			for (Iterator it = wizardPages.iterator(); it.hasNext();) {
-				IWizardPage wizardPage = (IWizardPage) it.next();
-				super.addPage(wizardPage);
-			}
-
-			wizardExtender.initWizardPages(wizardPages);
-		}
-	}
-
-	/**
-	 * Creates the main wizard page.
-	 * 
-	 * @return the main wizard page
-	 */
-	protected OpenLibraryMainPage createMainPage() {
-		return new OpenLibraryMainPage();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				LibraryUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MethodLibrary.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (wizardExtender != null) {
-			return wizardExtender.doFinish();
-		} else {
-			return openMethodLibrary(mainPage.getLibraryPath(), "xmi"); //$NON-NLS-1$	
-		}
-	}
-
-	/**
-	 * Opens the method library at the user specified path.
-	 * 
-	 * @param path
-	 *            the method library path
-	 * @param type
-	 *            the method library type
-	 */
-	public boolean openMethodLibrary(String path, String type) {
-		try {
-			Map<String, String> options = new HashMap<String, String>();
-			File libraryPath = new File(path);
-			options.put(XMILibraryManager.ARG_LIBRARY_PATH, libraryPath
-					.getAbsolutePath());
-
-			if (XMILibraryUtil.isValidLibrary(path, true) == Status.OK_STATUS) {
-				if (!handleToolVersion(path, null)) {
-					return false;
-				}
-				if (LibraryUIManager.getInstance().openLibrary(path)) {
-					LibraryUIPreferences.addOpenLibraryPath(libraryPath
-							.getAbsolutePath());
-					return true;
-				}
-			} else if (XMILibraryUtil
-					.containsPluginOrConfigSpecExportFile(path)) {
-				throw new Exception(LibraryUIResources.openLibraryError_reason4);
-			} else {
-				MsgDialog msgDialog = LibraryUIPlugin.getDefault()
-						.getMsgDialog();
-				boolean rc = msgDialog
-						.displayConfirmation(
-								LibraryUIResources.openLibraryWizard_title,
-								NLS
-										.bind(
-												LibraryUIResources.openLibraryDialog_newLibrary_text,
-												new Object[] { path }));
-				if (!rc)
-					return false;
-				if (LibraryUIManager.getInstance().createLibrary(path)) {
-					LibraryUIPreferences.addOpenLibraryPath(libraryPath
-							.getAbsolutePath());
-					return true;
-				}
-			}
-
-			return true;
-		} catch (Exception e) {
-			String reason = e.getMessage();
-			if (reason == null) {
-				reason = LibraryUIResources.openLibraryInternlError_reason;
-			}
-			reason += "\n\n" + LibraryUIResources.openLibraryError_advice; //$NON-NLS-1$
-			if (e.getMessage() != null) {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						LibraryUIResources.openLibraryWizard_title,
-						LibraryUIResources.openLibraryError_msg, reason);
-			} else {
-				LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-						LibraryUIResources.openLibraryWizard_title,
-						LibraryUIResources.openLibraryError_msg, reason, e);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Check and handle tool version differences
-	 */
-	public static boolean handleToolVersion(String path,
-			UpgradeCallerInfo callerInfo) {
-		String libXmi = XMILibraryManager.LIBRARY_XMI;
-		if (callerInfo != null && callerInfo.getIsExportedPluginLib()) {
-			libXmi = XMILibraryManager.exportFile;
-		}
-		VersionUtil.VersionCheckInfo info = VersionUtil
-				.checkLibraryVersion(new File(path, libXmi));
-		if (info != null && info.result > 0) {
-			String message = ""; //$NON-NLS-1$
-			if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
-				message = NLS.bind(
-						LibraryUIResources.versionMismatchDialog_text,
-						new Object[] { Platform.getProduct().getName(),
-								info.toolVersion });
-			} else {
-				message = NLS.bind(
-						LibraryUIResources.versionMismatchDialog_text_unknown,
-						new Object[] { Platform.getProduct().getName() });
-			}
-			if (!isUpgradeLibrary(callerInfo)) {
-				callerInfo.setErrorMsg(message);
-				return false;
-			}
-			LibraryUIPlugin.getDefault().getMsgDialog().displayError(
-					LibraryUIResources.openLibraryWizard_title, message);
-			return false;
-		}
-		if (XMILibraryUtil.isMethodLibraryUpgradeRequired(path, libXmi, info)) {
-			if (isUpgradeLibrary(callerInfo)
-					&& !LibraryUIPlugin
-							.getDefault()
-							.getMsgDialog()
-							.displayConfirmation(
-									LibraryUIResources.openLibraryWizard_title,
-									LibraryUIResources.upgradeLibraryDialog_text)) {
-				return false;
-			}
-			if (!isUpgradeLibrary(callerInfo)) {
-				callerInfo.copyLibrary();
-				if (callerInfo.getCopiedLibFile() != null) {
-					path = callerInfo.getCopiedLibFile().getParentFile()
-							.getAbsolutePath();
-				}
-			}
-			if (!LibraryUIManager.upgradeLibrary(path, callerInfo)) {
-				if (callerInfo != null) {
-					// callerInfo.setErrorMsg("upgradeLibrary Failed!"); //need
-					// new resource string
-				}
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	private static boolean isUpgradeLibrary(UpgradeCallerInfo callerInfo) {
-		return UpgradeCallerInfo.isUpgradeLibrary(callerInfo);
-	}
-	
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryWizardPage.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryWizardPage.java
deleted file mode 100644
index eba2901..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/OpenLibraryWizardPage.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import java.util.Map;
-
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-
-/**
- * The abstract class for a Open Method Library wizard page.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class OpenLibraryWizardPage extends BaseWizardPage {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OpenLibraryWizardPage(String name) {
-		super(name);
-	}
-
-	/**
-	 * Returns the library specific user selections.
-	 */
-	public abstract Map getSelections();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/SelectProcessPage.java b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/SelectProcessPage.java
deleted file mode 100644
index 136aeb2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/SelectProcessPage.java
+++ /dev/null
@@ -1,143 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.ui.wizards;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.library.ui.views.ProcessTreeViewer;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard page that prompts the user to select a process to export.
- * 
- * @author Kelvin Low
- * @since 7.0
- */
-public class SelectProcessPage extends BaseWizardPage {
-
-	public static final String PAGE_NAME = SelectProcessPage.class.getName();
-
-	private ProcessTreeViewer processTreeViewer;
-
-	private Text briefDescText;
-
-	private Process process;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectProcessPage() {
-		super(PAGE_NAME);
-		setTitle(LibraryUIResources.selectProcessWizardPage_title);
-		setDescription(LibraryUIResources.selectProcessWizardPage_text);
-		setImageDescriptor(LibraryUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/ExportProcess.gif")); //$NON-NLS-1$		
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = createGridLayoutComposite(parent, 1);
-
-		createLabel(composite, LibraryUIResources.processesLabel_text);
-
-		processTreeViewer = new ProcessTreeViewer(composite);
-		GridData gridData = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		gridData.heightHint = 250;
-		processTreeViewer.getTree().setLayoutData(gridData);
-
-		createLabel(composite, LibraryUIResources.briefDescriptionLabel_text);
-
-		briefDescText = createMultiLineText(composite, "", 100, 70, 1); //$NON-NLS-1$	
-
-		initControls();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		processTreeViewer.setInput(LibraryService.getInstance()
-				.getCurrentMethodLibrary());
-		processTreeViewer.expandAll();
-
-		addListeners();
-	}
-
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {
-		processTreeViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						Object selection = event.getSelection();
-						if (selection instanceof TreeSelection) {
-							Object element = ((TreeSelection) selection)
-									.getFirstElement();
-							if (element instanceof Process) {
-								process = (Process) element;
-								briefDescText.setText(process
-										.getBriefDescription());
-							} else {
-								process = null;
-								briefDescText.setText(""); //$NON-NLS-1$
-							}
-						}
-						setPageComplete(isPageComplete());
-						getWizard().getContainer().updateButtons();
-					}
-				});
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		if (getErrorMessage() != null) {
-			return false;
-		}
-
-		return getProcess() != null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#getNextPageData()
-	 */
-	public Object getNextPageData() {
-		return getProcess();
-	}
-
-	/**
-	 * Gets the user selected process.
-	 */
-	public Process getProcess() {
-		return process;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/package.html b/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/package.html
deleted file mode 100644
index 7f6600f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.ui/src/org/eclipse/epf/library/ui/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides wizards for managing a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/.classpath b/1.5/plugins/org.eclipse.epf.library.xmi/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/.options b/1.5/plugins/org.eclipse.epf.library.xmi/.options
deleted file mode 100644
index 21b778a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the XMI Library plug-in
-org.eclipse.epf.library.xmi/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/.project b/1.5/plugins/org.eclipse.epf.library.xmi/.project
deleted file mode 100644
index 7f3253d..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.library.xmi</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/.settings/org.eclipse.core.resources.prefs b/1.5/plugins/org.eclipse.epf.library.xmi/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 8ef0397..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Sep 11 12:31:57 PDT 2006
-eclipse.preferences.version=1
-encoding//src/org/eclipse/epf/library/xmi/Resources.properties=8859_1
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.library.xmi/META-INF/MANIFEST.MF
deleted file mode 100644
index ebf9125..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.library.xmi; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.library.xmi.XMILibraryPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.library,
- org.eclipse.emf.edit.ui
-Eclipse-LazyStart: true
-Bundle-Vendor: %providerName
-Export-Package: org.eclipse.epf.library.xmi,
- org.eclipse.epf.library.xmi.preferences
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/build.properties b/1.5/plugins/org.eclipse.epf.library.xmi/build.properties
deleted file mode 100644
index 30b2fc4..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/plugin.properties b/1.5/plugins/org.eclipse.epf.library.xmi/plugin.properties
deleted file mode 100644
index 9f2ec7f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF XMI Library
-providerName=Eclipse.org
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/plugin.xml b/1.5/plugins/org.eclipse.epf.library.xmi/plugin.xml
deleted file mode 100644
index d3e6989..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/plugin.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="diagramMigration" name="Diagram Migration" schema="schema/IDiagramMigration.exsd"/>
-
-   <extension
-         point="org.eclipse.epf.library.libraryManagers">
-      <libraryManager
-            class="org.eclipse.epf.library.xmi.XMILibraryManager"       		
-            type="xmi"
-            typeName="XMI">
-      </libraryManager>     
-   </extension>
-   <extension
-         point="org.eclipse.epf.library.edit.oppositeFeatureLoaders">
-      <oppositeFeatureLoader class="org.eclipse.epf.library.xmi.internal.XMIOppositeFeatureLoader"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/schema/IDiagramMigration.exsd b/1.5/plugins/org.eclipse.epf.library.xmi/schema/IDiagramMigration.exsd
deleted file mode 100644
index 715be5c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/schema/IDiagramMigration.exsd
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library.xmi">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library.xmi" id="IDiagramMigration" name="Diagram Migration"/>
-      </appInfo>
-      <documentation>
-         Provide diagram migration API.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <choice>
-            <element ref="diagramMigration" minOccurs="0" maxOccurs="1"/>
-         </choice>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="diagramMigration">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.library.xmi.IDiagramMigration
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         //------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/IDiagramMigration.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/IDiagramMigration.java
deleted file mode 100644
index 12fc706..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/IDiagramMigration.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi;
-
-import java.util.Collection;
-
-import org.eclipse.epf.uma.Process;
-
-/**
- * Interface for digram migration 
- * 
- * @author Weiping Lu - March 19, 2007
- * @since  1.2
- */
-public interface IDiagramMigration {
-
-	void migrate(Collection<Process> processes) throws Exception;
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/Resources.properties b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/Resources.properties
deleted file mode 100644
index 780cf6c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/Resources.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-filePath=File path
-cannotWriteToFiles=Cannot write to file(s)
-readOnlyFiles_title=Read-only file(s)
-readOnlyFiles_msg=The files listed in Details are read-only. Make them writable and click on Retry to continue.
-elementPath=Element path
-promptRemoveReferencesToMissingFiles_msg=The following files are missing. Click OK if you want to remove every reference to the selected files in the library
-missingFiles_title=Missing file(s)
-loadError=Load error
-promptRemoveReferencesToFilesWithLoadErrors_msg=The following file(s) could not be loaded. Click OK if you want to remove every reference to the selected files in the library
-filesWithLoadErrors_title=File(s) with load error
-migrateXMLLibrary_taskName=Migrating XML imported library
-
-# Error Messages
-libraryAlreadyExistsError_msg=A method library already exists in ''{0}''.
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryManager.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryManager.java
deleted file mode 100644
index 1eeef1b..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryManager.java
+++ /dev/null
@@ -1,494 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.common.serviceability.DebugTrace;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.library.AbstractLibraryManager;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryAlreadyExistsException;
-import org.eclipse.epf.library.LibraryNotFoundException;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryServiceException;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.persistence.PersistenceService;
-import org.eclipse.epf.library.project.MethodLibraryProject;
-import org.eclipse.epf.library.util.ModelStorage;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.migration.MappingUtil;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.util.Calendar;
-
-/**
- * The default XMI Library Manager implementation.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * 
- * @since 1.0
- */
-public class XMILibraryManager extends AbstractLibraryManager {
-	/**
-	 * The supported library type.
-	 */
-	public static final String LIBRARY_TYPE = Services.XMI_PERSISTENCE_TYPE;
-
-	/**
-	 * The library XMI file name.
-	 */
-	public static final String LIBRARY_XMI = MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME;
-
-	/**
-	 * The plugin and config spec export file name.
-	 */
-	public static final String exportFile = MultiFileSaveUtil.DEFAULT_PLUGIN_EXPORT_FILENAME;
-
-	/**
-	 * The library path.
-	 */
-	public static final String ARG_LIBRARY_PATH = "library.path"; //$NON-NLS-1$
-	
-	// The absolute path to the managed library.
-	protected String path;
-	
-	private ILibraryResourceManager resourceMgr;
-
-	private IProject project;
-	
-	private String registerType = "Default";		//$NON-NLS-1$ 
-	
-	public XMILibraryManager() {
-		super();
-		resourceMgr = new XMILibraryResourceManager();
-	}
-
-	/**
-	 * Creates a new method library.
-	 * 
-	 * @param name
-	 *            a name for the new method library
-	 * @param args
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary createMethodLibrary(final String name, final Map<String, Object> args)
-			throws LibraryServiceException {
-		final MethodLibrary[] resultHolder = new MethodLibrary[1];
-		final LibraryServiceException[] exceptionHolder = new LibraryServiceException[1];
-		IWorkspaceRunnable action = new IWorkspaceRunnable() {
-
-			public void run(IProgressMonitor monitor) throws CoreException {
-				try {
-					resultHolder[0] = doCreateMethodLibrary(name, args);
-				}
-				catch(LibraryServiceException e) {
-					exceptionHolder[0] = e;
-				}
-			}
-			
-		};
-		try {
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-			workspace.run(action, workspace.getRuleFactory().createRule(workspace.getRoot()), IWorkspace.AVOID_UPDATE, null);
-		} catch (CoreException e) {
-			XMILibraryPlugin.getDefault().getLogger().logError(e);
-			throw new LibraryServiceException(e);
-		}
-		
-		if(exceptionHolder[0] != null) {
-			throw exceptionHolder[0];
-		}
-		return resultHolder[0];
-	}
-		
-	private MethodLibrary doCreateMethodLibrary(String name, Map<String, Object> args)
-	throws LibraryServiceException {
-		if (debug) {
-			DebugTrace.print(this, "createMethodLibrary", "name=" + name); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (name == null || name.length() == 0 || args == null) {
-			throw new IllegalArgumentException();
-		}
-
-		String path = (String) args.get(ARG_LIBRARY_PATH);
-		if (path == null || path.length() == 0) {
-			throw new IllegalArgumentException();
-		}
-
-		File libraryPath = new File(path);
-		File libraryXMIFile = new File(libraryPath, LIBRARY_XMI);
-		if (libraryXMIFile.exists()) {
-			String msg = NLS.bind(
-					XMILibraryResources.libraryAlreadyExistsError_msg,
-					libraryPath.getAbsolutePath());
-			throw new LibraryAlreadyExistsException(msg);
-		}
-
-		if (!libraryPath.exists()) {
-			libraryPath.mkdirs();
-		}
-
-		try {
-			skipEventProcessing = true;
-			String regType = (String) args.get(ARG_LIBRARY_REGISTER_TYPE);
-			if (regType != null && regType.equals("ConfigExport")) { //$NON-NLS-1$
-				String time = Long.toHexString(Calendar.getInstance().getTimeInMillis());
-				MethodLibraryProject.openProject(libraryPath.getAbsolutePath(), "ExportLib" + time, //$NON-NLS-1$
-						null);		
-			} else { 				
-				// Open the method library project file.
-				project = MethodLibraryProject.openProject(libraryPath.getAbsolutePath(),
-						null);
-			}
-			// Create the resource set.
-			ILibraryResourceSet resourceSet = (ILibraryResourceSet) editingDomain
-					.getResourceSet();
-
-			// Create a new method library.
-			ModelStorage.newLibrary(resourceSet, name, libraryPath
-					.getAbsolutePath(), true);
-			library = resourceSet.getFirstMethodLibrary();
-
-			// Add a listener to monitor library resource changes.
-			addResourceChangedListeners();
-
-			if (debug) {
-				DebugTrace.print(this,
-						"createMethodLibrary", "library=" + library); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			return library;
-		} catch (Exception e) {
-			throw new LibraryServiceException(e);
-		} finally {
-			skipEventProcessing = false;
-
-			// // event processed in LibraryService
-			// notifyListeners(ILibraryChangeListener.OPTION_CREATED, null);
-		}
-	}
-
-	/**
-	 * Opens a method library.
-	 * 
-	 * @param uri
-	 *            a method library URI
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(java.net.URI uri)
-			throws LibraryServiceException {
-		if (debug) {
-			DebugTrace.print(this, "openMethodLibrary"); //$NON-NLS-1$
-		}
-
-		if (uri == null) {
-			throw new IllegalArgumentException();
-		}
-
-		try {
-			File file = new File(uri);
-			library = openMethodLibrary(file);
-		} 
-		catch(LibraryServiceException e) {
-			throw e;
-		}
-		catch (Exception e) {
-			library = null;
-		}
-
-		if (debug) {
-			DebugTrace.print(this, "openMethodLibrary", "library=" + library); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return library;
-	}
-
-	/**
-	 * Opens a method library.
-	 * 
-	 * @param path
-	 *            a <code>File</code> object that contains the path to the
-	 *            method library.
-	 * @return a <code>MethodLibrary</code>.
-	 * @throw <code>LibraryServiceException</code> if an error occurred while
-	 *        performing the operation.
-	 */
-	protected MethodLibrary openMethodLibrary(File path)
-			throws LibraryServiceException {
-		File libraryXMIFile = new File(path, LIBRARY_XMI);
-		if (!libraryXMIFile.exists()) {
-			throw new LibraryNotFoundException();
-		}
-
-		VersionUtil.VersionCheckInfo info = VersionUtil.checkLibraryVersion(libraryXMIFile);
-		IStatus status = XMILibraryUtil.checkVersion(libraryXMIFile, info);
-		if(!status.isOK()) {
-			throw new LibraryServiceException(status.getMessage());
-		}
-		else if(MappingUtil.conversionRequired(libraryXMIFile.getAbsolutePath(), info)) {
-			throw new LibraryServiceException(LibraryResources.libUpgradeRequired_err_msg);
-		}
-		
-		try {
-			skipEventProcessing = true;
-
-			// Open the method library project file.
-			project = MethodLibraryProject.openProject(path.getAbsolutePath(), null);
-
-			// Create the resource set.
-			ILibraryResourceSet resourceSet = ((ILibraryResourceSet) editingDomain
-					.getResourceSet());
-
-			// Load the method library.
-			resourceSet.loadMethodLibraries(URI.createFileURI(libraryXMIFile
-					.getAbsolutePath()), Collections.EMPTY_MAP);
-			library = resourceSet.getFirstMethodLibrary();
-
-			// Add a listener to monitor library resource changes.
-			addResourceChangedListeners();
-
-			System.gc();
-			
-			return library;
-		} catch (Exception e) {
-			if (debug) {
-				DebugTrace.print(e);
-			}
-			throw new LibraryServiceException(e);
-		} finally {
-			firePropertyChange(library, PROP_DIRTY);
-			skipEventProcessing = false;
-		}
-	}
-
-	/**
-	 * Opens a method library.
-	 * 
-	 * @param args
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(Map args)
-			throws LibraryServiceException {
-		if (debug) {
-			DebugTrace.print(this, "openMethodLibrary"); //$NON-NLS-1$
-		}
-
-		if (args == null) {
-			throw new IllegalArgumentException();
-		}
-
-		String path = (String) args.get(ARG_LIBRARY_PATH);
-		if (path == null || path.length() == 0) {
-			throw new IllegalArgumentException();
-		}
-
-		library = openMethodLibrary(new File(path));
-
-		if (debug) {
-			DebugTrace.print(this, "openMethodLibrary", "library=" + library); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return library;
-	}
-
-	/**
-	 * Reopens the managed method library.
-	 * 
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary reopenMethodLibrary() throws LibraryServiceException {
-		if (debug) {
-			DebugTrace.print(this, "reopenMethodLibrary"); //$NON-NLS-1$
-		}
-
-		library = openMethodLibrary(new File(getMethodLibraryLocation()));
-
-		if (debug) {
-			DebugTrace.print(this, "reopenMethodLibrary", "library=" + library); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return library;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.AbstractLibraryManager#getLibraryPersisterType()
-	 */
-	protected String getLibraryPersisterType() {
-		return Services.XMI_PERSISTENCE_TYPE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.AbstractLibraryManager#createResourceSet()
-	 */
-	protected ILibraryResourceSet createResourceSet() {
-		return PersistenceService.INSTANCE
-				.createResourceSet(Services.XMI_PERSISTENCE_TYPE);
-	}
-
-	/**
-	 * Gets the absolute path to the managed method library.
-	 * For distributed library, this is the library's workspace path.
-	 * 
-	 * @return an absolute path to the method library
-	 */
-	public String getMethodLibraryLocation() {
-		if (debug) {
-			DebugTrace.print(this, "getMethodLibraryPath"); //$NON-NLS-1$
-		}
-
-		java.net.URI libraryURI = getMethodLibraryURI();
-		if (libraryURI != null) {
-			File libraryXMIFile = new File(libraryURI);
-			if (libraryXMIFile.getName().equalsIgnoreCase(LIBRARY_XMI)) {
-				libraryXMIFile = libraryXMIFile.getParentFile();
-			}
-			return libraryXMIFile.getAbsolutePath();
-		}
-		return null;
-	}
-	
-	/**
-	 * Gets the project of the method library managed by this manager.
-	 * 
-	 * @return the method library project
-	 */
-	public IProject getMethodLibraryProject() {
-		return project;
-	}
-	
-	public void handleLibraryMoved() {
-		if(library == null) {
-			return;
-		}
-		String location = getMethodLibraryLocation();
-		if(!project.isOpen() || project.getLocation().equals(new Path(location))) {
-			// not moved
-			//
-			return;
-		}
-		
-		// update URI of all library resources
-		//
-		Resource libResource = library.eResource();
-		if(libResource == null || libResource.getResourceSet() == null) {
-			return;
-		}
-		String newLocation = project.getLocation().toOSString();
-		if(libResource.getResourceSet() instanceof MultiFileResourceSetImpl) {
-			((MultiFileResourceSetImpl)libResource.getResourceSet()).handleLibraryMoved(newLocation);
-		}
-		else {
-			PersistenceUtil.replaceURIPrefix(new ArrayList<Resource>(libResource.getResourceSet().getResources()), 
-					location, newLocation);
-		}
-	}
-	
-
-	/**
-	 * get the resource manager for the library
-	 * @return ILibraryResourceManager
-	 */
-	public ILibraryResourceManager getResourceManager() {
-		return resourceMgr;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.ILibraryManager#backupMethodLibrary(java.lang.String)
-	 */
-	public void backupMethodLibrary(String path) {
-		String libPathStr = getMethodLibraryLocation();
-		File libPath = new File(libPathStr);
-		// excude the non-library files that might be locked by rmc.
-		// these files may cause backup to fail due to file lock.
-		String excludes = ".lock"; //$NON-NLS-1$
-		LayoutResources.copyDir(libPath, new File(path), "**", excludes); //$NON-NLS-1$
-	}
-
-	private String getRegisterType() {
-		return registerType;
-	}
-
-	private void setRegisterType(String registerType) {
-		this.registerType = registerType;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.ILibraryManager#registerMethodLibrary(org.eclipse.epf.uma.MethodLibrary, java.util.Map)
-	 */
-	public void registerMethodLibrary(MethodLibrary lib, 
-			Map<String, Object> params) throws LibraryServiceException {
-		String regType = (String) params.get(ARG_LIBRARY_REGISTER_TYPE);
-		if (regType != null) {
-			setRegisterType(regType);
-		}
-		regType = getRegisterType();
-		if (regType.equals("ConfigExport")) {//$NON-NLS-1$ 
-			//For now, still simply wraping up old implementation (copied from ConfigurationExportService) for smoother change; will definetly change later
-			//so that creating a new lib would not be needed		
-			String name = "library.xmi";	//$NON-NLS-1$;	
-			createMethodLibrary(name, params);
-			setMethodLibrary(lib);
-			return;
-		}
-		
-		//Minimum implementation for defaul register type, to minimize caller code change
-		this.library = lib;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.ILibraryManager#unRegisterMethodLibrary()
-	 */
-	public void unRegisterMethodLibrary() throws LibraryServiceException {
-		if (getRegisterType().equals("ConfigExport")) {//$NON-NLS-1$ 
-			closeMethodLibrary();
-			return;
-		}
-		//Minimum implementation for defaul register type, to minimize caller code change
-		this.library = null;
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryPlugin.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryPlugin.java
deleted file mode 100644
index 4216b9c..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryPlugin.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.eclipse.epf.library.xmi;
-
-import org.eclipse.epf.common.AbstractActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- * The XMI Library plug-in activator.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class XMILibraryPlugin extends AbstractActivator {
-
-	// The shared plug-in instance.
-	private static XMILibraryPlugin plugin;
-
-	/**
-	 * Default constructor.
-	 */
-	public XMILibraryPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext context)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext context)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static XMILibraryPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryResourceManager.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryResourceManager.java
deleted file mode 100644
index cb64e28..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryResourceManager.java
+++ /dev/null
@@ -1,236 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.persistence.MethodLibraryPersister;
-import org.eclipse.epf.services.IFileBasedLibraryPersister;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * XMI library resource mamager
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class XMILibraryResourceManager implements ILibraryResourceManager {
-
-	public XMILibraryResourceManager() {
-	}
-
-	
-	/**
-	 * get the logical path of the element in the library,
-	 * the path should start with the plugin name. 
-	 * i.e. <plugin name>/path/to/element
-	 * 
-	 * The implementation class should encapsulate the physical storage 
-	 * of the resource and return the path of the element start with it's plugin name
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public String getLogicalPath(MethodElement element) {
-		try {
-			String path = MethodLibraryPersister.INSTANCE.getElementVirtualPath(element);
-			if (path == null || path.equals("")) //$NON-NLS-1$
-			{
-				System.out
-						.println("Warning! No Path for Element [" + element.getType().getName() + ": " + element.getName() + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				return ""; //$NON-NLS-1$
-			}
-			return fixPath(path);
-		} catch (RuntimeException e) {
-			e.printStackTrace();
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-	
-	/**
-	 * get the element's back path of the element based on the logical path, for example,
-	 * "OpenUP\guidance\concept\c1.xml", the back path is "./../../../"
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public String getBackPath(MethodElement element) {
-		// Linux: Browsing and preview shows only plain text.
-		// There are no images/sections
-		// element path should check File.separatorChar instead of "\"
-		String backPath = ""; //$NON-NLS-1$
-		String path = getLogicalPath(element);
-		if (path != null && path.length() > 0) {
-			backPath = path.replace(File.separatorChar, '/').replaceAll(
-					".*?/", "\\.\\./"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return "./" + backPath; //$NON-NLS-1$
-	}
-	
-	/**
-	 * fix the path by appending a File.seperator to the end of it
-	 * @param path String
-	 * @return String
-	 */
-	private String fixPath(String path) {
-		if (path == null || path.equals("")) //$NON-NLS-1$
-		{
-			return ""; //$NON-NLS-1$
-		} else if (!path.endsWith(File.separator)) {
-			return path + File.separator;
-		} else {
-			return path;
-		}
-	}
-
-	/**
-	 * get the logical resource path of the element in the
-	 * library. the path should start with the plugin name. 
-	 * i.e. <plugin name>/path/to/element/resources
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public String getLogicalResourcePath(MethodElement element) {
-		String path = MethodLibraryPersister.INSTANCE.geResourceVirtualPath(element);
-		return fixPath(path);
-	}
-	
-	/**
-	 * Gets the physical path of a method element
-	 * 
-	 * @param element
-	 * @return the physical path of the element
-	 */
-	public String getPhysicalPath(MethodElement element) {
-		if ( element == null ) {
-			return null;
-		}
-		
-		IFileBasedLibraryPersister persister = getFileBasedLibraryPersister(element);
-		return persister != null ? fixPath(persister.getFolderAbsolutePath(element)) : null;
-	}
-	
-	/**
-	 * Gets the absolute path of the resource folder of the element in the library.
-	 * 
-	 * @param e
-	 * @return the physical resource path of the element
-	 */
-	public String getPhysicalResourcePath(MethodElement element) {
-		IFileBasedLibraryPersister persister = getFileBasedLibraryPersister(element);
-		return persister != null ? fixPath(persister.getResourceFolderPath(element)) : null;
-	}
-	
-	private IFileBasedLibraryPersister getFileBasedLibraryPersister(MethodElement element) {
-		Resource resource = element.eResource();
-		if(resource != null) {
-			ILibraryPersister persister = LibraryServiceUtil.getPersisterFor(resource);
-			if(persister instanceof IFileBasedLibraryPersister) {
-				return ((IFileBasedLibraryPersister)persister);
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * get the logical path of the plugin 
-	 * 
-	 * @param element
-	 * @return String
-	 */
-	public String getLogicalPluginPath(MethodElement element) {
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-		if (plugin != null) {
-			return plugin.getName() + File.separator;
-		} 
-		
-		return ""; //$NON-NLS-1$
-	}
-	
-	/**
-	 * get the physical path of the plugin associated with the element
-	 * 
-	 * @param element
-	 * @return String
-	 */
-	public String getPhysicalPluginPath(MethodElement element) {
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-		if (plugin != null) {
-			return getPhysicalPath(plugin);
-		} 
-		
-		return null;
-	}
-
-	
-	/**
-	 * get the physical path associated with the given logical path
-	 * 
-	 * @param element MethodElement an element in the library to access the library resource
-	 * usually this is the owner element that references the logicalPath
-	 * @param logicalPath String
-	 * @return String the physical path resolved from the logical path
-	 *
-	 * for example, element task1, logical path is "plugin 1/tasks/task1.html"
-	 * the returned physical path is <plugin location>/path/to/element
-	 * 
-	 * @param element 
-	 * @param logicalPath the logical path of the element
-	 * @return String
-	 */
-	public String resolve(MethodElement element, String logicalPath) {
-
-		// use the plugin name in the logical path
-		// find the MethodPlugin object
-		// find the pluginPath
-				
-		// strip off the first folder in the relpath since this is the plugin name
-		logicalPath = logicalPath.replace('/', File.separatorChar);
-		int i = logicalPath.indexOf(File.separatorChar);
-		if ( i > 0 ) {
-			String pluginName = logicalPath.substring(0, i);
-			String pluginPath = null; 
-
-			MethodLibrary lib = UmaUtil.getMethodLibrary(element);
-			List plugins = LibraryUtil.getMethodPlugins(lib);
-			
-			for (Iterator it = plugins.iterator(); it.hasNext(); ) {
-				MethodPlugin plugin = (MethodPlugin)it.next();
-				if ( plugin.getName().equals(pluginName) ) {
-					pluginPath = getPhysicalPluginPath(plugin);
-					break;
-				}
-			}
-			
-			if ( pluginPath != null ) {
-				return pluginPath + logicalPath.substring(i+1);
-			}
-		}
-		
-		return null;
-		
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryResources.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryResources.java
deleted file mode 100644
index d51db1a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryResources.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The XMI Library resource bundle.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class XMILibraryResources extends NLS {
-
-	private static String BUNDLE_NAME = XMILibraryResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	public static String cannotWriteToFiles;
-
-	public static String elementPath;
-
-	public static String filePath;
-
-	public static String filesWithLoadErrors_title;
-
-	public static String loadError;
-
-	public static String missingFiles_title;
-
-	public static String promptRemoveReferencesToFilesWithLoadErrors_msg;
-
-	public static String promptRemoveReferencesToMissingFiles_msg;
-
-	public static String readOnlyFiles_msg;
-
-	public static String readOnlyFiles_title;
-	
-	public static String libraryAlreadyExistsError_msg;
-	
-	public static String migrateXMLLibrary_taskName;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, XMILibraryResources.class);
-	}
-
-	private XMILibraryResources() {
-		// Do not instantiate
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryUtil.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryUtil.java
deleted file mode 100644
index dfd6880..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/XMILibraryUtil.java
+++ /dev/null
@@ -1,349 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceException;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Helper utilities for accessing a XMI method library.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class XMILibraryUtil {
-
-	private static final String EMPTY_METHOD_LIBRARY_PATH_MSG = LibraryResources.emptyLibraryPathError_reason;
-
-	private static final String MISSING_LIBRARY_FILE_MSG = LibraryResources.missingLibraryFileError_reason;
-
-	private static final String COULD_NOT_LOCK_LIBRARY_MSG = LibraryResources.couldNotLockLibrary_reason;
-
-	public static final IStatus EMPTY_METHOD_LIBRARY_PATH_STATUS = new Status(
-			Status.ERROR, LibraryPlugin.getDefault().getId(), 1,
-			EMPTY_METHOD_LIBRARY_PATH_MSG, null);
-
-	public static final IStatus MISSING_LIBRARY_FILE_STATUS = new Status(
-			Status.ERROR, LibraryPlugin.getDefault().getId(), 1,
-			MISSING_LIBRARY_FILE_MSG, null);
-
-	public static final IStatus COULD_NOT_LOCK_LIBRARY_STATUS = new Status(
-			Status.ERROR, LibraryPlugin.getDefault().getId(), 1,
-			COULD_NOT_LOCK_LIBRARY_MSG, null);
-
-	static {
-		try {
-			// TODO: This call is needed to initialize the persistence layer
-			// to avoid a null pointer exception in
-			// PersistenceUtil.conversionRequired(). A better solution is
-			// needed.
-			new MultiFileResourceSetImpl();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * Checks whether a method library exists on a given path.
-	 * 
-	 * @param path
-	 *            an absolute path to a method library
-	 * @return <code>true</code> if the given path contains a valid method
-	 *         library
-	 */
-	public static boolean hasMethodLibrary(String path) {
-		if (path == null) {
-			throw new IllegalArgumentException();
-		}
-
-		File libraryDir = new File(path);
-		if (!libraryDir.exists()) {
-			return false;
-		}
-
-		File libraryFile = new File(libraryDir, XMILibraryManager.LIBRARY_XMI);
-		if (!libraryFile.exists()) {
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Returns the absolute path to a method library model (library.xmi) file.
-	 * 
-	 * @param path
-	 *            an absolute path to a method library
-	 * @returnt an absolute path to a method library model file (if one exists)
-	 */
-	public static String getLibraryModelFile(String path) {
-		if (!StrUtil.isBlank(path)) {
-			String libPath = new File(path).getAbsolutePath();
-			String suffix = File.separator
-					+ MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME;
-			if (libPath.endsWith(suffix)) {
-				return libPath;
-			} else {
-				return libPath + suffix;
-			}
-		}
-		return path;
-	}
-
-	/**
-	 * Validates a method library path.
-	 * 
-	 * @param path
-	 *            an absolute path to a method library
-	 * @param validateModelFile
-	 *            if <code>true</code>, validate that the library.xmi file
-	 *            also exists.
-	 * @return <code>true</code> if the given path is a valid method library
-	 *         folder
-	 */
-	public static IStatus isValidLibrary(String path, boolean validateModelFile) {
-		if (path == null || path.trim().length() == 0) {
-			return EMPTY_METHOD_LIBRARY_PATH_STATUS;
-		}
-
-		if (validateModelFile) {
-			File libFile = new File(getLibraryModelFile(path));
-			if (!libFile.exists()) {
-				return MISSING_LIBRARY_FILE_STATUS;
-			}
-		}
-
-		File libPath = new File(path);
-		if (path.endsWith(MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME)) {
-			libPath = libPath.getParentFile();
-		}
-
-		String libFullPath = libPath.getAbsolutePath();
-
-		if (libFullPath.startsWith("\\")) { //$NON-NLS-1$
-			// the first part must be a machine name, and you must specify a
-			// folder
-
-			boolean isValid = true;
-			String uncPath;
-			int index = libFullPath.indexOf(File.separatorChar, 2);
-			if (index < 0) {
-				isValid = false;
-			} else {
-				uncPath = libFullPath.substring(index + 1);
-				if (uncPath.length() == 0) {
-					// must specify a valid path
-					isValid = false;
-				} else {
-					// the top level path must be valid
-					index = libFullPath.indexOf(File.separatorChar, index + 1);
-					if (index < 0) {
-						uncPath = libFullPath;
-					} else {
-						uncPath = libFullPath.substring(0, index);
-					}
-
-					File f = new File(uncPath);
-					if (!f.exists()) {
-						isValid = false;
-					}
-				}
-			}
-
-			if (!isValid) {
-				// no new resource string, wait later
-				// return new Status(Status.ERROR,
-				// LibraryPlugin.getDefault().getId(), 1, "Invalid path", null);
-				return EMPTY_METHOD_LIBRARY_PATH_STATUS;
-			}
-		}
-
-		// Check for presence of a .project file.
-		IProjectDescription description = null;
-		try {
-			description = ResourcesPlugin
-					.getWorkspace()
-					.loadProjectDescription(
-							new Path(libFullPath + File.separator
-									+ IProjectDescription.DESCRIPTION_FILE_NAME));
-			if (description != null) {
-				return Status.OK_STATUS;
-			}
-		} catch (CoreException e) {
-		}
-
-		// If a .project file does not exists, use it to validate the path.
-		// only call validateProjectLocation if path is not on workspace
-		// for some reason, validateProjectLocation only works on paths not on
-		// the workspace
-		if (Platform.getLocation().isPrefixOf(new Path(libFullPath))) {
-			return Status.OK_STATUS;
-		}
-		IProject project = ResourceUtil.findProject(libFullPath);
-		if (project == null) {
-			project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-					libPath.getName());
-		}
-
-		return ResourcesPlugin.getWorkspace().validateProjectLocation(project,
-				new Path(libFullPath));
-	}
-
-	/**
-	 * Validates a method library path.
-	 * 
-	 * @param path
-	 *            an absolute path to a method library
-	 * @return <code>true</code> if the given path is a valid method library
-	 *         folder
-	 */
-	public static IStatus isValidLibrary(String path) {
-		return isValidLibrary(path, false);
-	}
-
-	/**
-	 * Checks whether a method library needs to be upgraded to a new format.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library
-	 * @return <code>true</code> if the method library needs to be upgraded
-	 */
-	public static boolean isMethodLibraryUpgradeRequired(String path,
-			VersionUtil.VersionCheckInfo info) {
-		return isMethodLibraryUpgradeRequired(path,
-				XMILibraryManager.LIBRARY_XMI, info);
-	}
-
-	public static boolean isMethodLibraryUpgradeRequired(String path,
-			String libXmi, VersionUtil.VersionCheckInfo info) {
-		return org.eclipse.epf.persistence.migration.MappingUtil
-				.conversionRequired(path + File.separator + libXmi, info);
-	}
-
-	/**
-	 * Creates a new XMI method library.
-	 * 
-	 * @param name
-	 *            a name for the new method library
-	 * @param path
-	 *            an absolute path to a method library
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public static MethodLibrary createMethodLibrary(String name, String path)
-			throws LibraryServiceException {
-		Map<String, Object> args = new HashMap<String, Object>();
-		args.put(XMILibraryManager.ARG_LIBRARY_PATH, path);
-		return LibraryService.getInstance().createMethodLibrary(name,
-				XMILibraryManager.LIBRARY_TYPE, args);
-	}
-
-	/**
-	 * Opens an existing method library.
-	 * 
-	 * @param path
-	 *            an absolute path to a method library
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public static MethodLibrary openMethodLibrary(String path)
-			throws LibraryServiceException {
-		Map<String, Object> args = new HashMap<String, Object>();
-		args.put(XMILibraryManager.ARG_LIBRARY_PATH, path);
-		return LibraryService.getInstance().openMethodLibrary(
-				XMILibraryManager.LIBRARY_TYPE, args);
-	}
-
-	/**
-	 * Opens the method library project associated with a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @param monitor
-	 *            a progress monitor
-	 */
-	public static void openMethodLibraryProject(MethodLibrary library,
-			IProgressMonitor monitor) {
-		if (library != null && library.eResource() != null
-				&& library.eResource().getURI().isFile()) {
-			IProject project = ResourceUtil.findProject(library);
-			if (project != null && !project.isOpen()) {
-				try {
-					project.open(IResource.BACKGROUND_REFRESH, monitor);
-				} catch (CoreException e) {
-					XMILibraryPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Check if the directory given by specified path contains a plugin or
-	 * config spec export file.
-	 * 
-	 * @param path
-	 *            an absolute path to a method library
-	 */
-	public static boolean containsPluginOrConfigSpecExportFile(String path) {
-		if (path == null || path.trim().length() == 0) {
-			return false;
-		}
-		path = new File(path).getAbsolutePath();
-		path += File.separator + XMILibraryManager.exportFile;
-		File exportFile = new File(path);
-		return exportFile.exists();
-	}
-
-	public static IStatus checkVersion(File file,
-			VersionUtil.VersionCheckInfo info) {
-		if (info != null && info.result > 0) {
-			String message;
-			if (info.toolID.equals(VersionUtil.getPrimaryToolID())) {
-				message = NLS.bind(LibraryResources.oldToolVersion_err_msg,
-						new Object[] { Platform.getProduct().getName(),
-								info.toolVersion, file });
-			} else {
-				message = NLS.bind(
-						LibraryResources.toolVersionMismatch_err_msg,
-						new Object[] { Platform.getProduct().getName() });
-			}
-			return new Status(IStatus.ERROR, XMILibraryPlugin.getDefault()
-					.getId(), 0, message, null);
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/LibraryProcessor.txt b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/LibraryProcessor.txt
deleted file mode 100644
index 6ab41a9..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/LibraryProcessor.txt
+++ /dev/null
@@ -1,1242 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi.internal;
-
-import java.io.File;
-import java.nio.channels.FileLock;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EventObject;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.prefs.PreferenceConstants;
-import org.eclipse.epf.library.services.LibraryModificationHelper;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.services.VersionManager;
-import org.eclipse.epf.library.util.CopyAttachmentsToNewLocation;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.Log;
-import org.eclipse.epf.library.util.ModelStorage;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.persistence.MethodLibraryPersister;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileXMISaveImpl;
-import org.eclipse.epf.persistence.refresh.IRefreshEvent;
-import org.eclipse.epf.persistence.refresh.IRefreshListener;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.services.util.ContentDescriptionFactory;
-import org.eclipse.epf.uma.util.IMethodLibraryPersister;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.ListenerList;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.ui.IPropertyListener;
-
-/**
- * Manages a Method Library.
- * 
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryProcessor {
-
-	public static final int PROP_DIRTY = 1;
-
-	public static LibraryProcessor instance = null;
-
-	protected AdapterFactoryEditingDomain editingDomain;
-
-	// maintain the currently selected configuration
-	// user should call set/getCurrentConfiguration() methods
-	// protected String currentConfigName = null;
-
-	private Map saveOptions;
-
-	// private Map saveAsOptions;
-	// private Set eClasses;
-
-	private List listeners = new ArrayList();
-
-	// keep the listeners to be deleted, do the delete before each notification
-	// and empty this list.
-	// don't delete in the middle of the notification since we don't want to
-	// change the listener list at this time
-	private List tmp_listeners_tobe_deleted = new ArrayList();
-
-	// private boolean isMultipleFiles = false;
-
-	// private boolean dirty = false;
-
-	boolean loaded = false;
-
-	private boolean inOperation = false;
-
-	private VersionManager versionMgr = null;
-
-	private ElementLayoutManager layoutMgr = null;;
-
-	// RATLC00384598 - Export: Infinite loop NullpointerException after
-	// exporting and unchecking rup plugin in configuration
-	// add this flag to treat the instance as singleton instacne or not
-	// only the singleton instance can dispose shared objects.
-	private boolean isSingletonInstance = false;
-
-	// the lock on the library's .project file
-	private FileLock lock;
-
-	//TODO: find a better way to notify the change in library instead of relying on the command stack listener
-	private CommandStackListener commandStackListener = new CommandStackListener() {
-		public void commandStackChanged(final EventObject event) {
-			if (!inOperation) {
-				SafeUpdateController.asyncExec(new Runnable() {
-					public void run() {
-						// Try to select the affected objects.
-						//
-						Command mostRecentCommand = LibraryUtil
-								.unwrap(((CommandStack) event.getSource())
-										.getMostRecentCommand());
-
-						if (mostRecentCommand != null) {
-							if (mostRecentCommand instanceof AddCommand) {
-								AddCommand cmd = (AddCommand) mostRecentCommand;
-								EObject owner = cmd.getOwner();
-								if (owner instanceof MethodConfiguration) {
-									Collection objs = new ArrayList();
-									objs.add(owner);
-									notifyListeners(
-											ILibraryChangeListener.OPTION_CHANGED,
-											objs);
-								} else {
-									Collection objs = mostRecentCommand.getResult();
-									notifyListeners(
-											ILibraryChangeListener.OPTION_NEWCHILD,
-											objs);
-									
-									// update the configuration selection if the
-									// object is a newly added method package
-									//
-									if (owner instanceof MethodPackage) {
-										objs = LibraryUtil.getContainedElements(owner, objs);
-										if(!objs.isEmpty()) {
-											addNewPackagesToConfiguration(objs);
-										}
-									}
-								}
-
-							} 
-							else if(mostRecentCommand instanceof PasteFromClipboardCommand) {
-								Collection objs = mostRecentCommand.getResult();
-								notifyListeners(ILibraryChangeListener.OPTION_NEWCHILD, objs);	
-								PasteFromClipboardCommand cmd = ((PasteFromClipboardCommand)mostRecentCommand);
-								
-								// update the configuration selection if the
-								// object is a newly added method package
-								//
-								if (cmd.getOwner() instanceof MethodPackage) {
-									objs = LibraryUtil.getContainedElements(cmd.getOwner(), objs);
-									if(!objs.isEmpty()) {
-										addNewPackagesToConfiguration(objs);
-									}
-								}
-							}
-							else if (mostRecentCommand instanceof CreateChildCommand) {
-								notifyListeners(
-										ILibraryChangeListener.OPTION_NEWCHILD,
-										mostRecentCommand.getAffectedObjects());
-							} else if (mostRecentCommand != null) {
-								notifyListeners(
-										ILibraryChangeListener.OPTION_CHANGED,
-										mostRecentCommand.getAffectedObjects());
-							}
-						}
-					}
-				});
-			}
-		}
-	};
-
-	/**
-	 * add the new packages into the configurations if the parent is in the
-	 * configuration
-	 * 
-	 * @param newobjs
-	 */
-	private void addNewPackagesToConfiguration(Collection newobjs) {
-		if (newobjs == null || newobjs.size() == 0) {
-			return;
-		}
-
-		LibraryModificationHelper helper = new LibraryModificationHelper();
-
-		try {
-			EObject e, parent;
-			for (Iterator it = newobjs.iterator(); it.hasNext();) {
-				e = (EObject) it.next();
-				if ((e instanceof MethodPackage)
-						&& ((parent = e.eContainer()) != null)
-						&& (parent instanceof MethodPackage)) {
-					Object configs = ((MultiResourceEObject) parent)
-							.getOppositeFeatureValue(AssociationHelper.MethodPackage_MethodConfigurations);
-					if (configs instanceof List) {
-						for (Iterator itconfig = ((List) configs).iterator(); itconfig
-								.hasNext();) {
-							MethodConfiguration config = (MethodConfiguration) itconfig
-									.next();
-							List pkgs = config.getMethodPackageSelection();
-							if (!pkgs.contains(e)) {
-								// pkgs.add(e);
-								helper
-										.getActionManager()
-										.doAction(
-												IActionManager.ADD,
-												config,
-												UmaPackage.eINSTANCE
-														.getMethodConfiguration_MethodPackageSelection(),
-												e, -1);
-							}
-						}
-					}
-				}
-			}
-
-			helper.save();
-
-		} catch (RuntimeException e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-		} finally {
-			helper.dispose();
-		}
-	}
-
-	private INotifyChangedListener notifyChangedListener = new INotifyChangedListener() {
-		public void notifyChanged(Notification notification) {
-			if (!inOperation) {
-				int eventType = notification.getEventType();
-				switch (eventType) {
-				case Notification.ADD: {
-					// only for add MethodPlugin, or maybe some other missing
-					// stuff (if any) that are not created by a command.
-					// anything created by a command are handled by the
-					// commandStackListener
-					Object notifier = notification.getNotifier();
-					Object v = notification.getNewValue();
-					if ((notifier instanceof MethodLibrary)
-							&& (v instanceof MethodPlugin)) {
-						Collection affectedObjects = new ArrayList();
-						affectedObjects.add(v);
-						notifyListeners(ILibraryChangeListener.OPTION_NEWCHILD,
-								affectedObjects);
-					}
-					break;
-				}
-
-				case Notification.SET: {
-					Object notifier = notification.getNotifier();
-					if (notifier != null) {
-						Collection affectedObjects = new ArrayList();
-						affectedObjects.add(notifier);
-						notifyListeners(ILibraryChangeListener.OPTION_CHANGED,
-								affectedObjects);
-					}
-					break;
-				}
-
-				// note: this is the remove of elements from the parent,
-				// it might be a delete action, or might be just a remove of
-				// references
-				// for delete action, the deleted element has no container
-				// for removed reference, the removed element still have it's
-				// parent
-				case Notification.REMOVE: {
-					Object notifier = notification.getNotifier();
-					Object oldValue = notification.getOldValue();
-					Collection affectedObjects = new ArrayList();
-					if (oldValue instanceof EObject
-							&& ((EObject) oldValue).eContainer() == null) {
-						// the element is deleted, sent a delete event
-						affectedObjects.add(oldValue);
-						notifyListeners(ILibraryChangeListener.OPTION_DELETED,
-								affectedObjects);
-					} else {
-						// otherwise, it's just a remove of references, the
-						// notifier is the changed element
-						affectedObjects.add(notifier);
-						notifyListeners(ILibraryChangeListener.OPTION_CHANGED,
-								affectedObjects);
-					}
-					break;
-				}
-				case Notification.REMOVE_MANY: {
-					List oldValue = new ArrayList((Collection) notification
-							.getOldValue());
-					ArrayList deletedElements = new ArrayList();
-					ArrayList removedReferences = new ArrayList();
-					if (!oldValue.isEmpty()) {
-						for (Iterator iter = oldValue.iterator(); iter
-								.hasNext();) {
-							Object element = iter.next();
-							if (element instanceof EObject) {
-								if (((EObject) element).eContainer() == null) {
-									deletedElements.add(element);
-								} else {
-									removedReferences.add(element);
-								}
-							}
-						}
-					}
-					if (!deletedElements.isEmpty()) {
-						// the element is deleted, sent a delete event
-						notifyListeners(ILibraryChangeListener.OPTION_DELETED,
-								deletedElements);
-					}
-					if (!removedReferences.isEmpty()) {
-						// otherwise, it's just a remove of references, the
-						// notifier is the changed element
-						notifyListeners(ILibraryChangeListener.OPTION_CHANGED,
-								removedReferences);
-					}
-					break;
-				}
-				}
-			}
-		}
-	};
-
-	private boolean listenerAdded = false;
-
-	private Adapter libChangedListener = new AdapterImpl() {
-		public void notifyChanged(Notification msg) {
-			switch (msg.getFeatureID(MethodLibrary.class)) {
-			case UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS:
-				MethodPlugin plugin;
-				switch (msg.getEventType()) {
-				case Notification.ADD:
-					plugin = (MethodPlugin) msg.getNewValue();
-					plugin.eResource().eAdapters().add(resourceChangedListener);
-					break;
-				case Notification.ADD_MANY:
-					for (Iterator iter = ((Collection) msg.getNewValue())
-							.iterator(); iter.hasNext();) {
-						plugin = (MethodPlugin) iter.next();
-						plugin.eResource().eAdapters().add(
-								resourceChangedListener);
-					}
-					break;
-				case Notification.REMOVE:
-					plugin = (MethodPlugin) msg.getOldValue();
-					plugin.eResource().eAdapters().remove(
-							resourceChangedListener);
-					break;
-				case Notification.REMOVE_MANY:
-					for (Iterator iter = ((Collection) msg.getOldValue())
-							.iterator(); iter.hasNext();) {
-						plugin = (MethodPlugin) iter.next();
-						plugin.eResource().eAdapters().remove(
-								resourceChangedListener);
-					}
-					break;
-				}
-			}
-		}
-	};
-
-	private Adapter resourceChangedListener = new AdapterImpl() {
-		public void notifyChanged(org.eclipse.emf.common.notify.Notification msg) {
-			if (msg.getFeatureID(null) == Resource.RESOURCE__IS_MODIFIED
-					&& msg.getEventType() == org.eclipse.emf.common.notify.Notification.SET) {
-				// dirty = true;
-				firePropertyChange(msg.getNotifier(), PROP_DIRTY);
-			}
-		}
-	};
-
-	private ListenerList propChangeListeners = new ListenerList();
-
-	private IRefreshListener refreshListener = new IRefreshListener() {
-
-		public void notifyRefreshed(IRefreshEvent event) {
-			handleRefreshEvent(event);
-		}
-		
-	};
-
-	public static LibraryProcessor getInstance() {
-		if (instance == null) {
-			synchronized (LibraryProcessor.class) {
-				if (instance == null) {
-					instance = new LibraryProcessor();
-				}
-			}
-		}
-
-		return instance;
-	}
-
-	/**
-	 * @param event
-	 */
-	protected void handleRefreshEvent(IRefreshEvent event) {
-		if(Log.DEBUG) {
-			System.out.println("LibraryProcessor.handleRefreshEvent()"); //$NON-NLS-N$
-			System.out.println("  refreshed resources: " + event.getRefreshedResources());
-		}
-		if(!event.getUnloadedObjects().isEmpty()) {
-			TngAdapterFactory.INSTANCE.cleanUp();
-		}
-	}
-
-	private LibraryProcessor() {
-		init();
-
-		// this is the main instance, will be treated as singleton
-		isSingletonInstance = true;
-	}
-
-	public LibraryProcessor(Resource res) {
-		this();
-		if (res != null) {
-			setResource(res);
-		}
-
-		isSingletonInstance = false;
-	}
-
-	/**
-	 * this construct should be called only if you want to maintain your own
-	 * LibraryProcessor, such as when for library importing or exporting.
-	 * Otherwise, call the static getInstance() method to retrieve the singleton
-	 * 
-	 * @param libraryPath
-	 */
-	public LibraryProcessor(String libraryPath) throws Exception {
-		this();
-		openLibrary(libraryPath);
-
-		isSingletonInstance = false;
-	}
-	
-	public void addPropertyListener(IPropertyListener l) {
-		propChangeListeners.add(l);
-	}
-
-	public void removePropertyListener(IPropertyListener l) {
-		propChangeListeners.remove(l);
-	}
-
-	/**
-	 * Fires a property changed event.
-	 * 
-	 * @param propertyId
-	 *            the id of the property that changed
-	 */
-	protected void firePropertyChange(final Object source, final int propertyId) {
-		Object[] array = propChangeListeners.getListeners();
-		for (int nX = 0; nX < array.length; nX++) {
-			final IPropertyListener l = (IPropertyListener) array[nX];
-
-			// since this will cause UI update, which must be executed in the UI
-			// thread
-			// otherwise, will cause Invalid Thread Access exception
-			SafeUpdateController.asyncExec(new Runnable() {
-				public void run() {
-					l.propertyChanged(source, propertyId);
-				}
-			});
-		}
-	}
-
-	private void addLibraryListeners() {
-		MethodLibrary library = getLibrary();
-
-		if (library == null || library.eResource() == null)
-			return;
-		// if(!library.eAdapters().contains(libChangedListener)) {
-		// library.eAdapters().add(libChangedListener);
-		// }
-		if (!library.eResource().eAdapters().contains(resourceChangedListener)) {
-			library.eResource().eAdapters().add(resourceChangedListener);
-		}
-		for (Iterator iter = library.getMethodPlugins().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			if (!plugin.eResource().eAdapters().contains(
-					resourceChangedListener)) {
-				plugin.eResource().eAdapters().add(resourceChangedListener);
-			}
-		}
-	}
-
-	private void removeLibraryListeners() {
-		MethodLibrary library = getLibrary();
-
-		if (library == null || library.eResource() == null)
-			return;
-		// library.eAdapters().remove(libChangedListener);
-		library.eResource().eAdapters().remove(resourceChangedListener);
-		for (Iterator iter = library.getMethodPlugins().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			plugin.eResource().eAdapters().remove(resourceChangedListener);
-		}
-	}
-
-	public void addListener(ILibraryChangeListener listener) {
-		synchronized (listeners) {
-			if (!listeners.contains(listener)) {
-				listeners.add(listener);
-			}
-		}
-	}
-
-	public void removeListener(ILibraryChangeListener listener) {
-		synchronized (tmp_listeners_tobe_deleted) {
-			// delay the remove till a notification is requested
-			if (!tmp_listeners_tobe_deleted.contains(listener)) {
-				tmp_listeners_tobe_deleted.add(listener);
-			}
-		}
-	}
-
-	private synchronized void notifyListeners(final int option,
-			final Collection collection) {
-		loaded = true;
-
-		try {
-			// remove the listeners to be deleted
-			if (tmp_listeners_tobe_deleted.size() > 0) {
-				for (Iterator it = tmp_listeners_tobe_deleted.iterator(); it
-						.hasNext();) {
-					Object l = it.next();
-					if (listeners.contains(l)) {
-						listeners.remove(l);
-					}
-				}
-				tmp_listeners_tobe_deleted.clear();
-			}
-
-			// notify listeners,
-			// note, the size may change since notify a listener may caused new
-			// listeners being added
-			// those new listeners will be added to the end of the list so we
-			// are ok
-			int i = 0;
-			while (i < listeners.size()) {
-				final ILibraryChangeListener listener = (ILibraryChangeListener) listeners
-						.get(i);
-				if (listener != null) {
-					// since this will cause UI update, which must be executed
-					// in the UI thread
-					// otherwise, will cause Invalid Thread Access exception
-
-					// execute it in sync mode, otherwise may cause problem
-					// since the notification might be executed too late.
-					// for example, after the listener object is disposed
-					SafeUpdateController.syncExec(new Runnable() {
-						public void run() {
-							listener.libraryChanged(option, collection);
-						}
-					});
-				}
-
-				i++;
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	private void beginOperation() {
-		inOperation = true;
-	}
-
-	private void endOperation() {
-		inOperation = false;
-	}
-	
-	/**
-	 * Checks if the given object is valid in the current resource set
-	 * 
-	 * @param object
-	 * @return
-	 */
-	public boolean isValid(EObject object) {
-		if(object != null && object.eIsProxy()) {
-			EObject e = RefreshJob.getInstance().resolve(object);
-			return (e instanceof MethodElement
-					&& !e.eIsProxy()
-					&& UmaUtil.getMethodLibrary(e) == getLibrary());
-		}
-		return true;
-
-	}
-	
-	/**
-	 * Checks if the library's project is still open. If not, open it
-	 */
-	/*
-	public boolean ensureLibraryProjectOpen(IProgressMonitor monitor) {
-		MethodLibrary lib = getLibrary();
-		if(lib != null) {
-			IProject prj = ResourceUtil.findProject(lib);
-			if(prj != null && !prj.isOpen()) {
-				try {
-					prj.open(IResource.BACKGROUND_REFRESH, monitor);
-					return true;
-				} catch (CoreException e) {
-					LibraryPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-		return false;
-	}
-	*/
-	
-	public void openLibrary() throws Exception {
-		String openLibrary = getLibraryRootPath().getAbsolutePath()
-				+ File.separator + "library.xmi"; //$NON-NLS-1$
-		if (openLibrary != null && !openLibrary.equals("")) { //$NON-NLS-1$
-			openLibrary(openLibrary);
-		}
-	}
-
-	public IStatus openLibrary(String libraryPath) throws Exception {
-		try {
-			beginOperation();
-			
-			// open the method library as a project in the workspace so it will
-			// show up in the Resource view.
-			//
-			File libDir = new File(libraryPath).getParentFile();
-			
-			// only close previous library if the new library's project was
-			// opened successfully
-			// close previous library's project only if it is different than the
-			// new one
-			closeOpenedLibrary();
-
-			// lock the library
-			//
-			lockLibrary(libDir);
-
-			ResourceUtil.open(libDir.getAbsolutePath(), null);
-
-			MultiFileResourceSetImpl resourceSet = ((MultiFileResourceSetImpl) editingDomain
-					.getResourceSet());
-			assignLibrary(resourceSet.loadLibrary(libraryPath));
-
-			IStatus status;
-			if (!resourceSet.hasUnresolvedProxy()) {
-				String msg = LibraryResources
-						.getString("Library.unresolvedProxyError.reason"); //$NON-NLS-1$
-				status = new Status(IStatus.WARNING, LibraryPlugin.getDefault()
-						.getId(), 0, msg, null);
-			} else {
-				status = Status.OK_STATUS;
-			}
-
-			notifyListeners(ILibraryChangeListener.OPTION_LOADED, null);
-			return status;
-		} finally {
-			endOperation();
-
-			// dirty = false;
-			firePropertyChange(getLibrary(), PROP_DIRTY);
-
-			// setCurrentConfiguration(null);
-		}
-
-	}
-
-	/**
-	 * Assigns library to a new value and attach the change listeners to it.
-	 * 
-	 * @param lib
-	 */
-	private void assignLibrary(MethodLibrary lib) {
-		removeLibraryListeners();
-		addLibraryListeners();
-	}
-
-	public void newLibrary(String libraryName, String libraryPath) throws Exception {
-		try {
-			closeOpenedLibrary();
-
-			// isMultipleFiles = bMultiple;
-			beginOperation();
-
-			File lib_path = new File(libraryPath);
-			libraryPath = lib_path.getAbsolutePath();
-
-			// open the method library as a project in the workspace so it will
-			// show up in the Resource view.
-			ResourceUtil.open(libraryPath, null);
-
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) editingDomain
-					.getResourceSet();
-			ModelStorage.newLibrary(resourceSet, libraryName, libraryPath, true);
-			assignLibrary(resourceSet.getMethodLibrary());
-
-			// lock the library
-			lockLibrary(lib_path);
-		} finally {
-			endOperation();
-			// setDirty(true);
-			// setCurrentConfiguration(null);
-			notifyListeners(ILibraryChangeListener.OPTION_CREATED, null);
-		}
-	}
-
-	/**
-	 * Saves the given resource if it belong to the currently open library
-	 * 
-	 * @param resource
-	 * @throws Exception
-	 */
-	public void save(Resource resource) throws Exception {
-		MultiFileResourceSetImpl resourceSet = ((MultiFileResourceSetImpl) editingDomain
-				.getResourceSet());
-		if (resourceSet.getResources().contains(resource)) {
-			resourceSet.save(resource, saveOptions);
-		}
-	}
-
-	public void saveLibrary() throws Exception {
-		MethodLibrary library = getLibrary();
-		if (library != null) {
-			doSave(saveOptions);
-			firePropertyChange(library, PROP_DIRTY);
-
-			notifyListeners(ILibraryChangeListener.OPTION_SAVED, null);
-		}
-	}
-
-	/**
-	 * Saves the open library under a new location
-	 * 
-	 * @param newDir
-	 *            directory to save the open library to
-	 * @param regenerateGUID
-	 *            if true, regenerate GUID for all MethodElements in the open
-	 *            library
-	 */
-	public void saveLibraryAs(String newDir, boolean regenerateGUID,
-			IProgressMonitor monitor) throws Exception {
-		String oldLibDir = getLibraryRootPath()
-				.getAbsolutePath();
-
-		// create new IProject
-		ResourceUtil.open(newDir, monitor);
-
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) getLibrary()
-				.eResource().getResourceSet();
-		resourceSet.saveAs(newDir, regenerateGUID, monitor);
-
-		// handle attachments here
-		CopyAttachmentsToNewLocation.copyAttachmentsLibrary(oldLibDir, newDir,
-				null, monitor);
-	}
-
-	/**
-	 * 
-	 * @param libraryPath
-	 * @param bMultiple
-	 * @throws Exception
-	 * @deprecated
-	 */
-	public void saveLibraryAs(String libraryPath, boolean bMultiple)
-			throws Exception {
-		// Resource res =
-		// ((Resource)editingDomain.getResourceSet().getResources().get(0));
-		// res.setURI(URI.createFileURI(libraryPath));
-		// res.setModified(true);
-		//
-		// setSaveAsMultipleFolder(bMultiple);
-		//        	
-		// doSave(saveAsOptions);
-		// setDirty(false);
-		// isMultipleFiles = bMultiple;
-		//        
-		// notifyListeners(ILibraryChangeListener.OPTION_SAVED, null);
-
-		throw new UnsupportedOperationException();
-	}
-
-	private void setResource(Resource res) {
-		if (res != null) {
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) editingDomain
-					.getResourceSet();
-			resourceSet.reset();
-			resourceSet.getResources().add(res);
-			assignLibrary(resourceSet.getMethodLibrary());
-			notifyListeners(ILibraryChangeListener.OPTION_CHANGED, null);
-		}
-	}
-
-	private Resource getLibraryResource() {
-		List res = getEditingDomain().getResourceSet().getResources();
-		if (res.size() > 0) {
-			return (Resource) res.get(0);
-		}
-
-		return null;
-	}
-
-	public MethodLibrary getLibrary() {
-		Resource resource = getLibraryResource();
-		if (resource != null && resource.getContents().size() > 0) {
-			for (Iterator it = resource.getContents().iterator(); it.hasNext();) {
-				Object o = it.next();
-				if (o instanceof MethodLibrary) {
-					return (MethodLibrary) o;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	public URI getLibraryURI() {
-		Resource savedResource = getLibraryResource();
-		if (savedResource != null) {
-			return savedResource.getURI();
-		}
-
-		return null;
-	}
-
-	public URI getRelativeURI(MethodElement element) {
-		URI libURI = getLibraryURI();
-		URI elemetnURI = element.eResource().getURI();
-		URI relUri = elemetnURI.deresolve(libURI);
-
-		return relUri;
-	}
-
-	public synchronized ElementLayoutManager getLayoutManager() {
-		// no ElementLayoutManager id library is not loaded
-		if (layoutMgr == null) {
-			if (getLibrary() != null) {
-				layoutMgr = new ElementLayoutManager();
-			}
-		}
-
-		return layoutMgr;
-	}
-
-	/*
-	public VersionManager getVersionManager() {
-		if (versionMgr == null) {
-			synchronized (this) {
-				if (versionMgr == null) {
-					versionMgr = new VersionManager(this);
-				}
-			}
-		}
-
-		return versionMgr;
-	}
-	*/
-
-	public void setLibrary(MethodLibrary newLib) {
-		assignLibrary(newLib);
-		Resource res = (Resource) getEditingDomain().getResourceSet()
-				.getResources().get(0);
-		res.getContents().clear();
-		res.getContents().add(newLib);
-		notifyListeners(ILibraryChangeListener.OPTION_LOADED, null);
-	}
-
-	public AdapterFactoryEditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	private void init() {
-		LibraryPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(new IPropertyChangeListener() {
-
-					public void propertyChange(PropertyChangeEvent event) {
-						if (event.getProperty().equals(
-								PreferenceConstants.PREF_BACK_UP_BEFORE_SAVE)) {
-							saveOptions.put(
-									MultiFileXMISaveImpl.BACK_UP_BEFORE_SAVE,
-									event.getNewValue());
-						} else if (event
-								.getProperty()
-								.equals(
-										PreferenceConstants.PREF_DISCARD_UNRESOLVED_REFERENCES)) {
-							saveOptions
-									.put(
-											MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES,
-											event.getNewValue());
-						}
-					}
-
-				});
-
-		// create the default editing domain for library operation
-		List factories = new ArrayList();
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-
-		ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
-				factories);
-
-		// Create the command stack that will notify this editor as commands are
-		// executed.
-		BasicCommandStack commandStack = new BasicCommandStack();
-
-		// Create the editing domain with a special command stack.
-		MultiFileResourceSetImpl resourceSet = new MultiFileResourceSetImpl();
-		
-		resourceSet.addRefreshListener(refreshListener);
-		RefreshJob.getInstance().setResourceSet(resourceSet);
-
-		saveOptions = resourceSet.getDefaultSaveOptions();
-		boolean b = LibraryPlugin.getDefault().getPreferenceStore().getBoolean(
-				PreferenceConstants.PREF_BACK_UP_BEFORE_SAVE);
-		saveOptions.put(MultiFileXMISaveImpl.BACK_UP_BEFORE_SAVE, Boolean
-				.valueOf(b));
-		b = LibraryPlugin.getDefault().getPreferenceStore().getBoolean(
-				PreferenceConstants.PREF_DISCARD_UNRESOLVED_REFERENCES);
-		saveOptions.put(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES,
-				Boolean.valueOf(b));
-
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-				commandStack, resourceSet);
-
-		// Create new IContentDescriptionPersister and set it to the
-		// ContentDescriptionFactory for use.
-		//
-		IMethodLibraryPersister contentDescPersister = new MethodLibraryPersister();
-		ContentDescriptionFactory
-				.setMethodLibraryPersister(contentDescPersister);
-
-		ContentDescriptionFactory.setFileManager(FileManager.getInstance());
-
-		registerEditingDomain(editingDomain);
-	}
-
-	public void doSave(Map options) throws Exception {
-		if (Log.DEBUG) {
-			System.out.println("Save options: " + options); //$NON-NLS-1$
-		}
-
-		// List removedResources = new ArrayList();
-
-		// File libDir = new
-		// File(((Resource)editingDomain.getResourceSet().getResources().get(0)).getURI().toFileString()).getParentFile();
-
-		try {
-			beginOperation();
-			MultiFileResourceSetImpl resourceSet = ((MultiFileResourceSetImpl) editingDomain
-					.getResourceSet());
-			// Save the resource(s)
-			//
-			resourceSet.save(options);
-
-			((BasicCommandStack) editingDomain.getCommandStack()).saveIsDone();
-		} catch (Exception exception) {
-			exception.printStackTrace();
-			throw exception;
-		} finally {
-			endOperation();
-
-		}
-	}
-
-	/*
-	public void discardChanges() {
-		for (Iterator iter = editingDomain.getResourceSet().getResources()
-				.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			resource.setModified(false);
-		}
-	}
-	*/
-
-	public boolean isLibraryLoaded() {
-		return loaded;
-	}
-
-	public ComposedAdapterFactory getAdapterFactory() {
-		return (ComposedAdapterFactory) getEditingDomain().getAdapterFactory();
-	}
-
-	private List getMethodModels() {
-		MethodLibrary library = getLibrary();
-		return (library == null) ? new ArrayList() : library.getMethodPlugins();
-	}
-
-	public MethodPlugin getMethodPlugin(String guid) {
-		if (guid != null) {	
-			for (Iterator it = getMethodModels().iterator(); it.hasNext();) {
-				MethodPlugin p = (MethodPlugin) it.next();
-				if (guid.equals(p.getGuid())) {
-					return p;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * get process family by name
-	 * 
-	 * @param name
-	 * @return ProcessFamily
-	 */
-	public ProcessFamily getProcessFamily(String name) {
-		MethodConfiguration config;
-		MethodLibrary library = getLibrary();
-		if (library != null) {
-			List configs = library.getPredefinedConfigurations();
-			for (Iterator it = configs.iterator(); it.hasNext();) {
-				config = (MethodConfiguration) it.next();
-				if ((config instanceof ProcessFamily)
-						&& config.getName().equals(name)) {
-					return (ProcessFamily) config;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * register edting domain with this library
-	 * 
-	 * @param domain
-	 */
-	public void registerEditingDomain(AdapterFactoryEditingDomain domain) {
-		/**
-		 * this notifys all changes, not just the content change, only pick the
-		 * ones for element updates. The other operations are colvered by the
-		 * Command events
-		 */
-		((ComposedAdapterFactory) domain.getAdapterFactory())
-				.addListener(notifyChangedListener);
-
-		// Add a listener to set the most recent command's affected objects to
-		// be the selection of the viewer with focus.
-		domain.getCommandStack().addCommandStackListener(commandStackListener);
-
-	}
-
-	public void listenTo(ComposedAdapterFactory adapterFactory) {
-		adapterFactory.addListener(notifyChangedListener);
-	}
-
-	public void stopListeningTo(ComposedAdapterFactory adapterFactory) {
-		adapterFactory.removeListener(notifyChangedListener);
-	}
-
-	public void listenTo(CommandStack commandStack) {
-		commandStack.addCommandStackListener(commandStackListener);
-	}
-
-	public void stopListeningTo(CommandStack commandStack) {
-		commandStack.removeCommandStackListener(commandStackListener);
-	}
-
-	/**
-	 * @return Returns the saveOptions.
-	 */
-	public Map getSaveOptions() {
-		return saveOptions;
-	}
-
-	public File getLibraryRootPath() {
-		URI uri = this.getLibraryURI();
-		if (uri != null) {
-			String path = uri.toFileString();
-			File f = new File(path);
-			return f.getParentFile();
-		}
-
-		return null;
-	}
-
-	public void addMethodPlugin(final MethodPlugin model) {
-
-		// since this will cause UI update, which must be executed in the UI
-		// thread
-		// otherwise, will cause Invalid Thread Access exception
-		final Exception[] exceptions = new Exception[1];
-
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				getLibrary().getMethodPlugins().add(model);
-
-				IMethodLibraryPersister.FailSafeMethodLibraryPersister persister = ContentDescriptionFactory
-						.getMethodLibraryPersister().getFailSafePersister();
-				try {
-					persister.save(getLibrary().eResource());
-					persister.commit();
-				} catch (Exception e) {
-					persister.rollback();
-					exceptions[0] = e;
-					return;
-				}
-
-				model.eResource().eAdapters().add(resourceChangedListener);
-			}
-		});
-
-		if (exceptions[0] != null) {
-			throw new WrappedException(exceptions[0]);
-		}
-	}
-
-	/**
-	 * Enables/disables notification entirely.
-	 * 
-	 * @param b
-	 */
-	public void setNotificationEnabled(boolean b) {
-		editingDomain.getResourceSet().eSetDeliver(b);
-	}
-
-	public boolean isNotificationEnabled() {
-		return editingDomain.getResourceSet().eDeliver();
-	}
-
-	/**
-	 * call this method when the current library is to be closed. for example,
-	 * when you try to open a nother library for create a new library
-	 */
-	public void closeOpenedLibrary() {
-		notifyListeners(ILibraryChangeListener.OPTION_LIBRARY_CLOSED, null);
-
-		if (Log.DEBUG) {
-			System.out
-					.println("Used memory before closing library: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())); //$NON-NLS-1$
-		}
-		// RATLC00384598 - Export: Infinite loop NullpointerException after
-		// exporting and unchecking rup plugin in configuration
-		// so don't dispose it if not the main singleton instance
-		if (isSingletonInstance) {
-			// dispose all item providers
-			//
-			TngAdapterFactory.INSTANCE.reset();
-
-			// clear filter constants hashMap
-			if (FilterConstants.hashMap != null) {
-				FilterConstants.hashMap.clear();
-			}
-		}
-
-		if (this.layoutMgr != null) {
-			this.layoutMgr.clear();
-		}
-
-
-		// clear the temp layout 
-		LayoutResources.clear();
-
-		/*
-		 * if ( this.depMgr != null ) { this.depMgr.clear(); } this.depMgr =
-		 * null;
-		 */
-
-		this.layoutMgr = null;
-
-		// this.invalidGuids.clear();
-
-		MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) editingDomain
-				.getResourceSet();
-
-		resourceSet.clearErrors();
-		MethodLibrary library = getLibrary();
-
-		unlockLibrary();
-
-		resourceSet.reset();
-		RefreshJob.getInstance().reset();
-
-		Runtime.getRuntime().gc();
-		if (Log.DEBUG) {
-			System.out
-					.println("Used memory after closing library: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())); //$NON-NLS-1$
-		}
-
-	}
-
-	private void unlockLibrary() {
-		// release lock on old lib's project
-		try {
-			if (lock != null) {
-				lock.release();
-				lock.channel().close();
-			}
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/**
-	 * Locks the .lock file in the given path. Creates a .lock file if one does
-	 * not exist
-	 * 
-	 * @param file
-	 *            path to library
-	 */
-	public void lockLibrary(File libDirFile) {
-		File lockFile = new File(libDirFile, ResourceUtil.LOCK_FILENAME);
-		lock = FileUtil.lockFile(lockFile);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/XMIOppositeFeatureLoader.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/XMIOppositeFeatureLoader.java
deleted file mode 100644
index 13b7b50..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/XMIOppositeFeatureLoader.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.library.edit.util.IOppositeFeatureLoader;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Manages the loading of opposite features for a XMI-based method library.
- *  
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class XMIOppositeFeatureLoader implements IOppositeFeatureLoader {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.edit.util.IOppositeFeatureLoader#loadOppositeFeatures(java.util.Collection)
-	 */
-	public void loadOppositeFeatures(Collection elements) {
-		HashSet oppositeFeatures = new HashSet();
-		HashSet deletedGUIDs = new HashSet();
-		MultiFileResourceSetImpl resourceSet = null;
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object o = (Object) iter.next();
-			if(o instanceof MethodElement) {
-				MethodElement e = (MethodElement) o;
-				if(resourceSet == null) {
-					Resource resource = e.eResource();
-					ResourceSet rset;
-					if(resource == null || !((rset = resource.getResourceSet()) instanceof MultiFileResourceSetImpl)) {
-						continue;
-					}
-					resourceSet = (MultiFileResourceSetImpl) rset;
-				}
-				for (Iterator iterator = e.eAllContents(); iterator.hasNext();) {
-					Object element = iterator.next();
-					if (element instanceof MethodElement) {
-						Collection features = ((MethodElement) element)
-								.getOppositeFeatures();
-						if (features != null
-								&& !features.isEmpty()) {
-							oppositeFeatures
-									.addAll(features);
-							deletedGUIDs.add(((MethodElement) element)
-									.getGuid());
-						}
-					}
-				}
-				Collection features = e.getOppositeFeatures();
-				if (features != null && !features.isEmpty()) {
-					oppositeFeatures.addAll(features);
-					deletedGUIDs.add(e.getGuid());
-				}				
-			}
-		}
-		
-		resourceSet.loadOppositeFeatures(new ArrayList(oppositeFeatures), deletedGUIDs);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/package.html b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/package.html
deleted file mode 100644
index 0e7768e..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for managing a XMI-based method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/package.html b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/package.html
deleted file mode 100644
index fa5de2a..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for managing a XMI-based method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/preferences/XMILibraryPreferences.java b/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/preferences/XMILibraryPreferences.java
deleted file mode 100644
index a731e5f..0000000
--- a/1.5/plugins/org.eclipse.epf.library.xmi/src/org/eclipse/epf/library/xmi/preferences/XMILibraryPreferences.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.xmi.preferences;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.xmi.XMILibraryPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * The XML Method Library preferences.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class XMILibraryPreferences {
-
-	/**
-	 * The default library path preference key.
-	 */
-	public static final String DEFAULT_LIBRARY_PATH = "defaultLibraryPath"; //$NON-NLS-1$
-
-	static {
-		// Initialize the default preference values.
-		IPreferenceStoreWrapper store = XMILibraryPlugin.getDefault()
-				.getPreferenceStore();
-		String defaultLibraryPath = System.getProperty("user.home") //$NON-NLS-1$
-				// FIXME! Avoid using hard coded constant
-				+ FileUtil.FILE_SEP + "EPF" //$NON-NLS-1$
-				+ FileUtil.FILE_SEP + "Method Libraries"; //$NON-NLS-1$
-		store.setDefault(DEFAULT_LIBRARY_PATH, defaultLibraryPath);
-	}
-
-	/**
-	 * Gets the default library path preference.
-	 */
-	public static String getDefaultLibraryPath() {
-		return XMILibraryPlugin.getDefault().getPreferenceStore().getString(
-				DEFAULT_LIBRARY_PATH);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/.classpath b/1.5/plugins/org.eclipse.epf.library/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.library/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.library/.options b/1.5/plugins/org.eclipse.epf.library/.options
deleted file mode 100644
index ac69d3e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Library plug-in
-org.eclipse.epf.library/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.library/.project b/1.5/plugins/org.eclipse.epf.library/.project
deleted file mode 100644
index b50038e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.library</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.library/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.library/META-INF/MANIFEST.MF
deleted file mode 100644
index 7e2d7c3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,32 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.library; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: library.jar
-Bundle-Activator: org.eclipse.epf.library.LibraryPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.library,
- org.eclipse.epf.library.configuration,
- org.eclipse.epf.library.configuration.closure,
- org.eclipse.epf.library.events,
- org.eclipse.epf.library.layout,
- org.eclipse.epf.library.layout.diagram,
- org.eclipse.epf.library.layout.elements,
- org.eclipse.epf.library.layout.util,
- org.eclipse.epf.library.preferences,
- org.eclipse.epf.library.prefs,
- org.eclipse.epf.library.project,
- org.eclipse.epf.library.services,
- org.eclipse.epf.library.util
-Require-Bundle: org.eclipse.epf.diagram.model;visibility:=reexport,
- org.eclipse.epf.library.edit;visibility:=reexport,
- org.eclipse.epf.library.persistence;visibility:=reexport,
- org.apache.ant,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.emf.ecore.xmi;visibility:=reexport,
- org.eclipse.emf.edit.ui
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.library/build.properties b/1.5/plugins/org.eclipse.epf.library/build.properties
deleted file mode 100644
index 1cfe429..0000000
--- a/1.5/plugins/org.eclipse.epf.library/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-source.library.jar = src/
-output.library.jar = bin/
-bin.includes = library.jar,\
-               .options,\
-               META-INF/,\
-               icons/,\
-               layout/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/
diff --git a/1.5/plugins/org.eclipse.epf.library/icons/Role.gif b/1.5/plugins/org.eclipse.epf.library/icons/Role.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.library/icons/Role.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/css/default.css b/1.5/plugins/org.eclipse.epf.library/layout/css/default.css
deleted file mode 100644
index 6668c00..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/css/default.css
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-body {
-	background-image: none;
-	background-color: #ffffff;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-}
-
-p {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-}
-
-h1 {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: large;
-}
-
-h2 {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 150%;
-}
-
-h3 {
-	font-family: arial, helvetica, sans-serif, kanji2;
-}
-
-h4, h5, h6 {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 100%;
-}
-
-a:link {
-	color: #003399;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-decoration: none;
-}
-
-a:active {
-	color: #003399;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-decoration: underline;
-}
-
-a:visited {
-	color: #003399;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-decoration: none;
-}
-
-a[href]:hover {
-	color: #ff0000;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-decoration: underline;
-}
-
-ol {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	list-style-type: decimal;
-	margin-left: 30px;
-}
-
-ol li {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-align: left;
-}
-
-ul {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	list-style-type: disc;
-	margin-left: 30px;
-	margin-top: 0px;
-	padding-left: 0px;
-}
-
-ul li {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-align: left;
-}
-
-table {
-	background-image: none;
-	background: #ffffff;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;	
-}
-
-tbody {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	valign: baseline;
-}
-
-th {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-align: left;
-}
-
-td {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-}
-
-td ul {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	margin-bottom: 0px;
-	margin-left: 30px;
-}
-
-.pageTitle {
-	background: #9999cc;
-	color: #ffffff;
-	font-size: 12pt;
-	font-weight: bold;
-	padding-bottom: 5px;
-	padding-left: 10px;
-	padding-right: 10px;
-	padding-top: 5px;
-	text-align: left;
-}
-
-.pageTitleSeparator {
-	background-color: #000000;
-	padding: 0px;
-}
-
-.tab {
-	background-color: #5c81a7;
-	color: #ffffff;
-	font-family: verdana, arial, sans-serif; 
-	font-size: 11px;
-	font-weight: bold;
-}
-
-.activeTab {
-	background-color: #c8d7e3;
-	color: #293d6b;	
-	font-family: verdana, arial, sans-serif; 
-	font-size: 11px;
-	font-weight: bold;
-}
-
-a.tab:link, a.tab:active, a.tab:visited {
-	color: #ffffff;
-	font-family: verdana, arial, sans-serif; 
-	font-size: 11px;
-	font-weight: bold;
-}
-
-a.tab:hover {
-	text-decoration: underline;	
-}
-
-.overview {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	font-weight: normal;
-	padding-bottom: 10px;
-	padding-left: 20px;
-	padding-right: 0px;
-	padding-top: 10px;
-}
-
-.overviewTable {
-	background: #ffffff;
-	width: 100%;	
-}
-
-.overviewTable td {
-	padding: 5px 5px 5px 5px;
-}
-
-.overviewSeparator {
-	background-color: #000000;
-	padding: 0px;
-}
-
-.expandCollapseText {
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	padding-left: 5px;
-	padding-right: 5px;
-}
-
-.expandCollapseLink {
-	color: #333333;
-	padding-bottom: 5px;
-	text-decoration: none;
-}
-
-.expandCollapseLink:hover {
-	color: #0000ff;
-	text-decoration: underline;
-}
-
-.expandCollapseLink:visited {
-	color: #333333;
-}
-
-.sectionHeading {
-	background-color: #98b1c4;
-	color: #ffffff;
-	cursor: hand;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	font-weight: bold;
-	padding-bottom: 2px;
-	padding-left: 2px;
-	padding-top: 2px;
-	text-decoration: none;
-}
-
-.sectionContent {
-	padding-bottom: 0px;
-	padding-left: 0px;
-	padding-right: 0px;
-	padding-top: 0px;
-	text-align: left;
-}
-
-.sectionTable {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 1px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 1px;
-	border-top-color: #ccc;
-	
-	/*don't define padding in table, the behavior is different in IE and firefox. 
-	 In IE, the padding is applied before the cell's background color is enforced.
-	 in firefox, the padding is applied first, so leave the table's background inthe padding area.
-	 Define the padding in the table cell instead, this works in both IE and mozilla
-	 */
-	padding: 0px 0px 0px 0px;	
-	width: 100%;
-}
-
-.sectionTableHeading {
-	background: #eee;
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-	color: #333333;
-	height: 20;
-	text-align: left;
-	width: 20%;
-	padding: 10px 10px 10px 10px;	
-
-}
-
-.sectionTableCellHeading {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 8pt;
-	font-weight: normal;
-	font-color: #666666;
-	padding: 10px 10px 10px 10px;
-
-}
-
-.sectionTableCell {
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-	padding: 10px 10px 10px 10px;
-
-}
-
-.sectionTableSingleCell {
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-	padding: 10px 10px 10px 10px;
-}
-
-.breakdownTable {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 1px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 1px;
-	padding: 0px 0px 0px 0px;
-	width: 100%;
-}
-
-.breakdownTable th {
-	background: #eee;
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-	color: #333333;
-	height: 20;
-	text-align: left;
-}
-
-.breakdownTable td {
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-}
-
-.defaultTable {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 0px;
-	padding: 0px 0px 0px 0px;
-	width: 100%;
-}
-
-.defaultTable td {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 0px;
-	text-align: left;
-}
-
-.subSectionHeading {
-	color: #333333;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	font-weight: bold;
-	text-decoration: none;
-}
-
-.subSectionContent {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	text-decoration: none;	
-}
-
-.stepHeading {
-	background-color: #ffffff;
-	color: #293d6b;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	font-weight: bold;
-	padding-bottom: 2px;
-	padding-left: 2px;
-	padding-top: 2px;
-	text-decoration: none;
-}
-
-.stepContent {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 0px;
-	padding-bottom: 5px;
-	padding-left: 0px;
-	padding-right: 0px;
-	padding-top: 0px;
-	text-align: left;
-}
-
-.stepTable {
-	border-bottom: #999999 solid 1px;
-	border-left: #999999 solid 0px;
-	border-right: #999999 solid 0px;
-	border-top: #999999 solid 0px;
-	padding-bottom: 20px;
-	padding-left: 10px;
-	padding-right: 10px;
-	padding-top: 10px;
-	width: 100%;
-}
-
-.stepTable td {
-	border: #ccc solid 0px;
-}
-
-.stepSeparator {
-	background-color: #cccccc;
-	padding: 0px;
-}
-
-.backToTopLink {
-	color: #fffff;
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	font-weight: normal;	
-	margin: 0px;
-	padding-bottom: 10px;
-	text-align: middle;	
-	text-decoration: none;
-}
-
-.backToTopLink:hover {
-	color: #969;
-	text-decoration: underline;
-}
-
-.backToTopLink:visited {
-	color: #5c81a7;
-	text-decoration: none;	
-}
-
-.copyright {
-	color: #7080b0;
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	font-weight: normal;
-	padding-left: 0px;
-	padding-right: 10px;
-	padding-top: 25px;
-	text-align: left;
-	width: 100%;
-}
-
-.versionInfo {
-	color: #7080b0;
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	font-weight: normal;
-	padding-left: 10px;
-	padding-right: 0px;
-	padding-top: 25px;
-	text-align: left;
-}
-
-.quote {
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-	font-style: italic;
-}
-
-.codeSample {
-	font-family: courier;
-	font-size: 10pt;		
-}
-
-.elementLink {
-	color: #0000ff;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-}
-
-.elementLinkWithType {
-	color: #0000ff;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-}
-
-.elementLinkWithUserText {
-	color: #0000ff;
-	font-family: arial, helvetica, sans-serif, kanji2;
-	font-size: 10pt;
-}
-
-#results {
- 	border-top: thin solid black;
-	margin: 10px auto 10px auto;
-	max-width: 590px;
-	padding: 10px;
-  	position: relative;
-	text-align: left;
-	width: expression((document.body.clientWidth-30)+'px');
-}
-
-/*
-.contentToolbarIcon {
-	color: #ffffff;
-	text-decoration: none;
-	margin: 0px;
-	padding: 0px;	
-}
-
-.contentToolbarIcon img {
-	cursor: pointer;
-	margin: 0px;
-	padding: 0px;
-	border: 0px;
-}
-
-
-.contentToolbarIcon a:link {
-	color: #ffffff;
-	text-decoration: none;
-}
-
-
-.contentToolbarIcon a:active {
-	color: #ffffff;
-	text-decoration: none;
-}
-
-
-.contentToolbarIcon a:visited {
-	color: #ffffff;
-	text-decoration: none;
-}
-
-
-.contentToolbarIcon a:hover {
-	color: #ffffff;
-	text-decoration: none;
-}
-
-.contentToolbarIcon a[href]:hover {
-	color: #ffffff;
-	text-decoration: none;
-}
-*/
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Artifact.gif b/1.5/plugins/org.eclipse.epf.library/layout/icons/Artifact.gif
deleted file mode 100644
index ba1e4fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Artifact.jpg b/1.5/plugins/org.eclipse.epf.library/layout/icons/Artifact.jpg
deleted file mode 100644
index 6739127..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Artifact.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Deliverable.gif b/1.5/plugins/org.eclipse.epf.library/layout/icons/Deliverable.gif
deleted file mode 100644
index cdfe62e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Deliverable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Outcome.gif b/1.5/plugins/org.eclipse.epf.library/layout/icons/Outcome.gif
deleted file mode 100644
index c673882..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Outcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Role.gif b/1.5/plugins/org.eclipse.epf.library/layout/icons/Role.gif
deleted file mode 100644
index abfa4c6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Role.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Role.jpg b/1.5/plugins/org.eclipse.epf.library/layout/icons/Role.jpg
deleted file mode 100644
index 2f183a2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Role.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Task.gif b/1.5/plugins/org.eclipse.epf.library/layout/icons/Task.gif
deleted file mode 100644
index efc4613..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Task.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/Task.jpg b/1.5/plugins/org.eclipse.epf.library/layout/icons/Task.jpg
deleted file mode 100644
index 65ac2c4..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/Task.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/icons/process.gif b/1.5/plugins/org.eclipse.epf.library/layout/icons/process.gif
deleted file mode 100644
index 8f9a085..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/icons/process.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/activity.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/activity.gif
deleted file mode 100644
index 77393e6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/activity_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/activity_medium.gif
deleted file mode 100644
index 77393e6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/activity_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_acls.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_acls.gif
deleted file mode 100644
index e30b597..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_acls.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_anamd.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_anamd.gif
deleted file mode 100644
index 96666e4..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_anamd.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_class.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_class.gif
deleted file mode 100644
index 5f8352e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_class.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_desmd.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_desmd.gif
deleted file mode 100644
index e40cc92..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_desmd.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_doc.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_doc.gif
deleted file mode 100644
index 5fb9d5f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_doc.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dpkg.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dpkg.gif
deleted file mode 100644
index f726aa8..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dpkg.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dplmod.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dplmod.gif
deleted file mode 100644
index eaf58ee..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dplmod.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dssub.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dssub.gif
deleted file mode 100644
index 377a6b8..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_dssub.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_event.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_event.gif
deleted file mode 100644
index 5b9f65e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_event.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_impmd.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_impmd.gif
deleted file mode 100644
index 7fd06ab..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_impmd.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_intfc.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_intfc.gif
deleted file mode 100644
index 5831ba1..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_intfc.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_poc.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_poc.gif
deleted file mode 100644
index e807fd3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_poc.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_signa.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/ar_signa.gif
deleted file mode 100644
index 78b031b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/ar_signa.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/artifact.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/artifact.gif
deleted file mode 100644
index ba1e4fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/artifact_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/artifact_medium.gif
deleted file mode 100644
index ba1e4fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/artifact_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/back.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/back.gif
deleted file mode 100644
index 4ccdfad..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/back.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/back_to_top.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/back_to_top.gif
deleted file mode 100644
index 356d954..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/back_to_top.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/bookmark.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/bookmark.gif
deleted file mode 100644
index 0fd535d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/bookmark.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/checklist.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/checklist.gif
deleted file mode 100644
index c33aa3b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/checklist.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/circle_close.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/circle_close.gif
deleted file mode 100644
index addd972..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/circle_close.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/circle_open.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/circle_open.gif
deleted file mode 100644
index d218e25..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/circle_open.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/collapse.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/collapse.gif
deleted file mode 100644
index 3f6541f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/collapse.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/collapse_all.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/collapse_all.gif
deleted file mode 100644
index 38f7019..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/collapse_all.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/compositerole.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/compositerole.gif
deleted file mode 100644
index abfa4c6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/compositerole.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/concept.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/concept.gif
deleted file mode 100644
index f0e95cd..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/concept.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/content_package.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/content_package.gif
deleted file mode 100644
index ffc081e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/content_package.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/content_package_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/content_package_medium.gif
deleted file mode 100644
index ffc081e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/content_package_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/display_views.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/display_views.gif
deleted file mode 100644
index 0624021..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/display_views.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/display_views_a.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/display_views_a.gif
deleted file mode 100644
index 0624021..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/display_views_a.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/divider.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/divider.gif
deleted file mode 100644
index 2a9e7dd..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/divider.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close.jpg
deleted file mode 100644
index 66d2024..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close_small.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close_small.jpg
deleted file mode 100644
index 266b814..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close_small.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close_small_right.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close_small_right.jpg
deleted file mode 100644
index a706c91..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_close_small_right.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open.jpg
deleted file mode 100644
index 96904ee..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open_small.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open_small.jpg
deleted file mode 100644
index 3a635b1..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open_small.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open_small_right.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open_small_right.jpg
deleted file mode 100644
index 55b7d4d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/doc_elem_open_small_right.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/down_arrow.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/down_arrow.gif
deleted file mode 100644
index d68c42e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/down_arrow.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/estimationconsiderations.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/estimationconsiderations.gif
deleted file mode 100644
index aed4c3a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/estimationconsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/example.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/example.gif
deleted file mode 100644
index 45310b1..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/example.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/expand.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/expand.gif
deleted file mode 100644
index 2c0fe8f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/expand.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/expand_all.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/expand_all.gif
deleted file mode 100644
index 8a18a39..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/expand_all.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/false.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/false.gif
deleted file mode 100644
index 7b665d7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/false.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/forward.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/forward.gif
deleted file mode 100644
index 645a1ae..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/forward.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/guidance.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/guidance.gif
deleted file mode 100644
index 9e91e5b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/guidance.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/guidance_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/guidance_medium.gif
deleted file mode 100644
index 9e91e5b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/guidance_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/guidline.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/guidline.gif
deleted file mode 100644
index 9e91e5b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/guidline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/indent.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/indent.gif
deleted file mode 100644
index 2d003a5..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/indent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/leftnav_mockup.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/leftnav_mockup.jpg
deleted file mode 100644
index 9b1654b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/leftnav_mockup.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/method_plugin.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/method_plugin.gif
deleted file mode 100644
index 906c276..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/method_plugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/method_plugin_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/method_plugin_medium.gif
deleted file mode 100644
index 906c276..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/method_plugin_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/milestone.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/milestone.gif
deleted file mode 100644
index 576ff94..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/need_icon.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/need_icon.jpg
deleted file mode 100644
index 6ad11c2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/need_icon.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/no_rup.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/no_rup.gif
deleted file mode 100644
index f26c408..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/no_rup.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/practice.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/practice.gif
deleted file mode 100644
index 08c436b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/practice.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/print.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/print.gif
deleted file mode 100644
index 1cd208a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/print.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/process.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/process.gif
deleted file mode 100644
index 8f9a085..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/process.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/process_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/process_medium.gif
deleted file mode 100644
index 8f9a085..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/process_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/report.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/report.gif
deleted file mode 100644
index eea2310..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/report.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/reusableasset.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/reusableasset.gif
deleted file mode 100644
index 7b9788c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/reusableasset.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/roadmap.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/roadmap.gif
deleted file mode 100644
index 2fc513b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/roadmap.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/role.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/role.gif
deleted file mode 100644
index abfa4c6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/role.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/role_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/role_medium.gif
deleted file mode 100644
index abfa4c6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/role_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/roledes_lg_dgm32.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/roledes_lg_dgm32.gif
deleted file mode 100644
index daf22e3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/roledes_lg_dgm32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/rup1.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/rup1.gif
deleted file mode 100644
index 0624021..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/rup1.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/rup1_a.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/rup1_a.gif
deleted file mode 100644
index 0624021..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/rup1_a.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/sample_sectionhead.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/sample_sectionhead.gif
deleted file mode 100644
index 652e821..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/sample_sectionhead.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/shim.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/shim.gif
deleted file mode 100644
index 0aba790..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/shim.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/step_sample.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/step_sample.gif
deleted file mode 100644
index 83f4098..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/step_sample.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/supportingmaterial.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/supportingmaterial.gif
deleted file mode 100644
index ba1e4fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/supportingmaterial.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_end-a.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/tab_end-a.gif
deleted file mode 100644
index 08cc5e6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_end-a.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_end-i.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/tab_end-i.gif
deleted file mode 100644
index 375447f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_end-i.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-a_i.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-a_i.gif
deleted file mode 100644
index 4079557..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-a_i.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-i_a.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-i_a.gif
deleted file mode 100644
index b49867f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-i_a.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-i_i.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-i_i.gif
deleted file mode 100644
index de87b0d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_middle-i_i.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_space.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/tab_space.gif
deleted file mode 100644
index 84a98db..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_space.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_space_middle.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/tab_space_middle.gif
deleted file mode 100644
index 9ba9ba9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/tab_space_middle.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/task.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/task.gif
deleted file mode 100644
index efc4613..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/task.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/task_medium.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/task_medium.gif
deleted file mode 100644
index efc4613..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/task_medium.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/taskdes_lg_dgm32.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/taskdes_lg_dgm32.gif
deleted file mode 100644
index 26ed472..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/taskdes_lg_dgm32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/teamprofile.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/teamprofile.gif
deleted file mode 100644
index 86bd7d6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/teamprofile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/technique.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/technique.gif
deleted file mode 100644
index 9e91e5b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/technique.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/template.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/template.gif
deleted file mode 100644
index 957a7e0..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/template.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/termdefinition.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/termdefinition.gif
deleted file mode 100644
index edc9f24..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/termdefinition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/titleback_left.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/titleback_left.gif
deleted file mode 100644
index c0eca0b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/titleback_left.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/titleback_right.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/titleback_right.gif
deleted file mode 100644
index 98b89c2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/titleback_right.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/toolmentor.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/toolmentor.gif
deleted file mode 100644
index 4c55a2c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/toolmentor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/top.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/top.gif
deleted file mode 100644
index 615acf4..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/top.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/top_sm.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/top_sm.gif
deleted file mode 100644
index 4e7fba2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/top_sm.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/topbar_mockup.jpg b/1.5/plugins/org.eclipse.epf.library/layout/images/topbar_mockup.jpg
deleted file mode 100644
index b966642..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/topbar_mockup.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/true.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/true.gif
deleted file mode 100644
index 454da09..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/true.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/u_bold.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/u_bold.gif
deleted file mode 100644
index 8fcd5a3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/u_bold.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/up_arrow.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/up_arrow.gif
deleted file mode 100644
index 51e5ccc..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/up_arrow.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/whitepaper.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/whitepaper.gif
deleted file mode 100644
index 62e48ef..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/whitepaper.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/images/workdes_lg_dgm32.gif b/1.5/plugins/org.eclipse.epf.library/layout/images/workdes_lg_dgm32.gif
deleted file mode 100644
index f44e5de..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/images/workdes_lg_dgm32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ActivityTreeTable.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/ActivityTreeTable.js
deleted file mode 100644
index 0e908c8..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ActivityTreeTable.js
+++ /dev/null
@@ -1,866 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-function ActivityTreeTable(/*ProcessElementPage*/parent) {
-this.parent = parent;
-this.tree_node_class  = "treeNode";	// !!! don't translate this !!!
-this.expandImage = null;
-this.collapseImage = null;
-this.shimImage = null;
-this.wbsItemHtml = null;
-this.imagePath = null;
-this.NODE_COLLAPSED = 0;
-this.NODE_EXPANDED = 1;
-this.DEFAULT_EXPAND_LEVEL = 0; // 0 - collapse all, 1 - expand the first level, ..., 9999 - if you have this many
-
-};
-
-// Creates the collapsible tree table
-// the expected format of the html source are as follows:
-// each <TR tag has a uinque id and a parentId.
-/*
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=utf-8">
-<link type="text/css" href="./css/default.css" rel="StyleSheet">
-<script src="./treetable.js" type="text/javascript" language="JavaScript"></script>
-</head>
-<body onload="createTree('td', 'treeNode', './images/');" >
-<table border="1">
-<tr id="1" parentId="0">
-<td class="treeNode">col 1-1</td><td>col 1-2</td>
-</tr>
-
-<tr id="2" parentId="1">
-<td class="treeNode">col 1-1</td><td>col 2-2</td>
-</tr>
-
-<tr id="3" parentId="1">
-<td class="treeNode">col 1-1</td><td>col 2-2</td>
-</tr>
-
-<tr id="4" parentId="0">
-<td class="treeNode">col 2-1</td><td>col 2-2</td>
-</tr>
-</table>
-</body>
-*/
-ATTR_ROW_DATA_INDEX = "dataIndex";
-ATTR_CHILD_LOADED = "childLoaded";
-ATTR_INDENT_SIZE = "indentSize";
-ATTR_EXPANDED = "expanded";
-
-ActivityTreeTable.prototype.initialize = function(imgPath)
-{
-	this.imagePath = contentPage.resolveUrl(imgPath);
-	this.expandImage = this.imagePath + 'expand.gif';	
-	this.collapseImage = this.imagePath + 'collapse.gif';
-	//expandAllImage = this.imagePath + 'expand_all.gif';	
-	//collapseAllImage = this.imagePath + 'collapse_all.gif';
-	//backToTopImage = this.imagePath + 'back_to_top.gif';
-	this.shimImage = this.imagePath + 'indent.gif';
-	this.wbsItemHtml = new WBSItemHtml(this, this.imagePath);
-};
-
-ActivityTreeTable.prototype.createTree = function(tagName, classSelector) {
-
-	// create the tree table first
-	this.createTable();
-};
-
-
-ActivityTreeTable.prototype.createTable = function() {
-
-	var div = document.getElementById("treeContent");
-	if ( div == null ) return;
-	
-	// create table
-	var table = document.createElement("TABLE");
-	table.id = "ActivityTreeTable";
-	table.title = this.data.title;
-	table.summary = this.data.summary;
-	table.cellspacing = "0px";
-	table.cellpadding = "0px";
-	table.border="0px";
-	table.width="100%";
-	table.bordercolor = "#999999";
-	table.className = "breakdownTable";
-	
-	// create table head
-	//var tr = document.createElement("TR");
-	var tr = table.insertRow(table.rows.length);
-	
-	tr.setAttribute("valign", "top");
-	
-	var len = this.data.columns.length;
-	for ( i = 0; i < len; i++ ) {
-		var col = this.data.columns[i];
-		var id = BS_ID_PREFIX + col[0];
-		var abbr = col[1];
-		
-		var th = document.createElement("TH");		
-		th.id = id;
-		th.abbr = abbr;
-		th.innerHTML = "<span style='white-space:nowrap;'>" + col[1] + "</span>";
-		tr.appendChild(th);
-	}			
-	
-	
-	//table.appendChild(tr);
-	div.appendChild(table);
-	
-	// create the top rows
-	this.createToplevelRows();
-		
-	// for IE need to reset to fresh the layout
-	//div.innerHTML = "" + div.innerHTML + "";
-};
-
-ActivityTreeTable.prototype.processTR = function(trElement) {
-
-	var indentSize = 0;
-	var parentId = trElement.getAttribute("parentId");
-	var parentTR  = null;
-	if ( parentId != "")
-	{
-
-		// cache it to be faster
-		parentTR = document.getElementById(parentId);
-		//parentTR = createdNodes[parentId];
-		if ( parentTR != null && parentTR != undefined )
-		{
-			indentSize = parseInt(parentTR.getAttribute(ATTR_INDENT_SIZE)) + 1;
-		}
-	}
-
-	var expanded = this.getDefaultExpandState(indentSize);
-
-	trElement.setAttribute(ATTR_INDENT_SIZE, indentSize);
-	trElement.setAttribute(ATTR_EXPANDED, expanded);
-
-	//alert("createTreeNode for id, parentId, indent =" + trElement.id + ", " + parentId + ",  indentSize=" + indentSize);
-	//createTreeNode(element, indentSize);
-
-	//save the created ones so we can referecne it
-	//createdNodes[trElement.id] = trElement;
-
-
-	if ( (parentTR != null) && this.isNodeSuppressed(parentTR) )
-	{
-		this.setNodeSuppressed(trElement, true);
-		//alert("parent suppressed");
-	}
-
-	if ( this.isNodeSuppressed(trElement) == true || (parentTR != null && parentTR.getAttribute(ATTR_EXPANDED) == this.NODE_COLLAPSED) )
-	{
-		trElement.style.display = 'none';
-		//alert("suppressed");
-	}
-				
-};
-
-ActivityTreeTable.prototype.getTreeTable = function() {
-	return document.getElementById("ActivityTreeTable");
-};
-
-ActivityTreeTable.prototype.createToplevelRows = function() {
-
-	var table = this.getTreeTable();
-	if ( table == null ) return;
-
-	var rows = this.data.rows;
-	var len = rows.length;
-	var suppressedRows = new Array();
-	//var parentId = "";
-	
-	for ( var i = 0; i < len; i++ ) {
-	
-		var row = rows[i];
-		if ( row == null ) continue;
-		
-		//parentId = "";
-		
-		// don't create the row if the row is suppressed or if the parent is suppressed
-		if ( this.isRowSuppressed(row) ) {
-			//suppressedRows.push(row.id);
-			//parentId = row.id;
-			
-			// clear the suppressed rows
-			rows[i] = null;
-			
-			//alert("suppressed " + i);
-			continue;
-		}
-		
-		/*		
-		while ( (row.parentId != parentId) && (suppressedRows.length > 0) ) {
-			parentId = suppressedRows.pop();
-		}
-		
-		if ( (row.parentId != "") && (row.parentId == parentId) ) {
-			suppressedRows.push(row.id);
-			
-			// clear the suppressed rows
-			rows[i] = null;
-
-			//alert("suppressed " + i);
-			continue;
-		}
-		*/
-		
-		
-		if ( row.parentId == null || row.parentId == "") {
-			this.wbsItemHtml.parseRow(row);
-			
-			var tr = table.insertRow(table.rows.length);
-			tr.setAttribute(ATTR_ROW_DATA_INDEX, i);
-			this.wbsItemHtml.loadRow(tr);
-			
-			//table.appendChild(tr);
-			
-			this.processTR(tr);
-		}
-	}
-};
-
-
-ActivityTreeTable.prototype.createChildRows = function(trElement) {
-
-	var loaded = trElement.getAttribute(ATTR_CHILD_LOADED);
-	if ( loaded == "true" ) {
-		return;
-	}
-
-
-	var table = this.getTreeTable();
-	//var insertBefore = trElement.getNextSibling;
-	var rowIndex =  parseInt(trElement.rowIndex);
-	
-	// make sure the value is a number otherwise Fire fox will treat it as a string
-	var dataIndex =  parseInt(trElement.getAttribute(ATTR_ROW_DATA_INDEX));
-	
-	for ( var i = dataIndex+1; i < this.data.rows.length; i++ ) {
-		var row = this.data.rows[i];
-		if ( row == null ) continue;
-		if ( row.parentId != trElement.id ) {
-			continue;
-		}
-		
-		this.wbsItemHtml.parseRow(row);
-
-		rowIndex++;
-		var tr = table.insertRow(rowIndex);
-		tr.setAttribute(ATTR_ROW_DATA_INDEX, i);
-		this.wbsItemHtml.loadRow(tr);
-
-		this.processTR(tr);
-		
-	}	
-	
-	trElement.setAttribute(ATTR_CHILD_LOADED, "true");
-	
-};
-
-
-
-ActivityTreeTable.prototype.getDefaultExpandState = function(level)
-{
-
-	if (level >= this.DEFAULT_EXPAND_LEVEL ) {
-		return this.NODE_COLLAPSED;
-	} else {
-		return this.NODE_EXPANDED;
-	}
-
-};
-
-ActivityTreeTable.prototype.getTreeNodeSrc = function(level)
-{
-	if ( this.getDefaultExpandState(level) == this.NODE_COLLAPSED ) {
-		return this.expandImage;
-	}
-	else {
-		return this.collapseImage;
-	}
-};
-
-
-ActivityTreeTable.prototype.getTR = function(element)
-{
-	// the heml structure is
-	// <tr id="2" parentId="1">
-	// <td class="treeNode">col 1-1</td><td>col 2-2</td>
-	// </tr>
-	var e = element;
-	while ( e != null && e.tagName != "TR" || e.className != this.tree_node_class)
-	{	
-		e = e.parentNode;
-		//alert(e.tagName);
-	}
-	
-	return e;
-};
-
-
-// Expands or collapses a section based on the received event.
-ActivityTreeTable.prototype.expandCollapseTreeNode = function(evtElement) {
-
-	//alert(evtElement.tagName);
-
-	var trElement = this.getTR(evtElement);
-	
-	// make sure the child rows are created
-	this.createChildRows(trElement);
-	
-	// if there is no child, remove the tree node image
-	if ( !this._hasChildren(trElement) )
-	{
-		evtElement.src = this.shimImage;
-		evtElement.onclick = null;
-		evtElement.style.cursor = "default";
-		return false;
-	}
-	
-	var expanded = trElement.getAttribute(ATTR_EXPANDED);
-
-	if (expanded == this.NODE_EXPANDED) {
-		this.hideChildren(trElement);
-		evtElement.src = this.expandImage;
-		expanded = this.NODE_COLLAPSED;
-		evtElement.alt = contentPage.res.expandText;
-		evtElement.title = contentPage.res.expandText;
-	}
-	else {
-		this.showHideChildren(trElement, true);
-		evtElement.src = this.collapseImage;
-		expanded = this.NODE_EXPANDED;
-		evtElement.alt = contentPage.res.collapseText;
-		evtElement.title = contentPage.res.collapseText;		
-	}
-	
-	trElement.setAttribute(ATTR_EXPANDED, expanded);
-	
-	/*
-	if (evt && evt.preventDefault) {
-		evt.preventDefault();
-	}
-	*/
-	
-	return false;
-};
-
-
-ActivityTreeTable.prototype.hideChildren = function(parent)
-{	
-	// make sure it's the TR element
-	parent = this.getTR(parent);
-	//var parentId = parent.id;
-	var indentSize = parseInt(parent.getAttribute(ATTR_INDENT_SIZE));
-	
-	var nextTR = parent;
-	while ( (nextTR=this.getNextSibling(nextTR)) != null && nextTR.getAttribute(ATTR_INDENT_SIZE) > indentSize )
-	{		
-		nextTR.style.display = 'none';		
-	}
-		
-};
-
-
-ActivityTreeTable.prototype.showHideChildren = function(parent, show)
-{		
-	// make sure it's the TR element
-	parent = this.getTR(parent);
-	
-	//var indentSize = parent.indentSize;
-	var nextTR = this.getNextSibling(parent);
-	while ( nextTR != null && nextTR.getAttribute("parentId") == parent.id )
-	{
-		if ( show && (this.isNodeSuppressed(nextTR) == false) )
-		{
-			nextTR.style.display = '';
-		}
-		else
-		{
-			
-			nextTR.style.display = 'none';
-		}
-		
-		nextTR = this.showHideChildren(nextTR, (show==true)&&(nextTR.getAttribute(ATTR_EXPANDED)==this.NODE_EXPANDED) );
-	}
-	
-	return nextTR;
-	
-};
-
-
-ActivityTreeTable.prototype._hasChildren = function(parent)
-{
-
-	// make sure it's the TR element
-	parent = this.getTR(parent);
-
-	var nextTR = this.getNextSibling(parent);
-	
-//alert("parent.id=" + parent.id + ", nextTR.parentId=" + nextTR.getAttribute("parentId") + ", isSuppressed=" + isNodeSuppressed(nextTR));
-
-	if ( nextTR != null && nextTR.getAttribute("parentId") == parent.id) 
-	{
-		if (this.isNodeSuppressed(nextTR) == false)
-		{
-			return true;
-		}
-		else
-		{
-			nextTR.nextSibling;
-			while (nextTR != null)
-			{
-				if (this.isNodeSuppressed(nextTR) == false)
-				{
-					return true;
-				}
-				nextTR = nextTR.nextSibling;
-			}
-			return false;
-		}
-	}
-	
-	return false;
-};
-
-
-ActivityTreeTable.prototype.getNextSibling = function(element)
-{
-
-	var nextElement = element.nextSibling;
-	while (nextElement != null && nextElement.tagName != element.tagName )
-	{
-		nextElement = nextElement.nextSibling;
-	}
-	
-	return nextElement;
-};
-
-ActivityTreeTable.prototype.getFirstChild = function(trElement, tagName, className)
-{
-	var e = trElement.firstChild;
-	while (e != null)
-	{
-		//alert(e.tagName);
-		if ( (tagName == null || e.tagName == tagName) && (className == null || e.className == className) )
-		{
-			return e;
-		}
-		
-		e = e.nextSibling;
-	}
-	
-	return null;
-		
-};
-
-ActivityTreeTable.prototype.isNodeSuppressed = function(trElement)
-{
-	// if isSupressed attribute is defined, always use it
-	// only browsign model set this attribute
-	// if not defined, it's in published site, look up the flag from the generated map
-	var attr_suppressed = trElement.getAttribute("isSupressed");
-	var relPath = trElement.getAttribute("relProcessPath");
-	
-	var flag = this.isSuppressed(attr_suppressed, relPath);
-	
-	if ( attr_suppressed == null || attr_suppressed == "" || attr_suppressed == undefined )
-	{		
-		this.setNodeSuppressed(trElement, flag);
-	}
-	
-	return flag;
-};
-
-ActivityTreeTable.prototype.isRowSuppressed = function(row)
-{
-	if ( row == null ) return true;
-	
-	return this.isSuppressed(row.isSuppressed, row.relPath);
-	
-};
-
-ActivityTreeTable.prototype.isSuppressed = function(attr_suppressed, relPath)
-{	
-	// if isSupressed attribute is defined, always use it
-	// only browsign model set this attribute
-	// if not defined, it's in published site, look up the flag from the generated map
-	
-	//alert(attr_suppressed + "=" + relPath);
-	var flag = false;
-	
-	if ( attr_suppressed == null || attr_suppressed == "" || attr_suppressed == "undefined" )
-	{
-		// this method is defined in activitylayout.js
-		if ( relPath != null && relPath != "" && relPath != "undefined" )
-		{
-			flag = this.parent.isSuppressed(contentPage.processPage.par_proc, contentPage.processPage.par_path + relPath);
-		}
-		//alert("x1, flag=" + flag);
-	}
-	else
-	{
-		flag = (attr_suppressed == "true");
-	}
-	
-	//alert(flag + " = " + attr_suppressed + relPath);
-	return flag;
-
-};
-
-
-ActivityTreeTable.prototype.setNodeSuppressed = function(trElement, flag)
-{
-	trElement.setAttribute("isSupressed", flag ? "true" : "false");
-		
-};
-
-
-
-
-// define the break down structure columns ids here
-BS_COL_INDEX = "id";
-BS_COL_NAME = "name";
-BS_COL_PREFIX = "prefix";
-BS_COL_PREDECESSORS = "predecessors";
-BS_COL_IS_REPEATABLE = "is_repeatable";
-BS_COL_IS_ONGOING = "is_ongoing";
-BS_COL_IS_EVENT_DRIVEN = "is_event_driven";
-BS_COL_ENTRY_STATE = "entry_state";
-BS_COL_EXIT_STATE = "exit_state";
-BS_COL_TEAMS = "teams";
-BS_COL_TYPE = "type";
-BS_COL_MODEL_INFO = "model_info";
-BS_COL_PRESENTATION_NAME = "presentation_name"; 
-BS_COL_STEPS = "steps";
-BS_COL_DELIVERABLE = "deliverable"; 
-BS_COL_IS_OPTIONAL = "is_optional"; 
-BS_COL_IS_PLANNED = "is_planned";
-BS_COL_HAS_MULTIPLE_OCCURRENCES = "has_multiple_occurrences";
-
-// id prefix
-BS_ID_PREFIX = "BS_COL_";
-STEP_GROUP_SIZE = 5;
-
-function WBSItemHtml(/*ActivityTreeTable*/parent)
-{
-this.parent = parent;
-//this.imagePath = imgPath;
-
-this.extendVariability = "extend"; // !!! don't translate this !!!
-this.localContributionVariability = "localContribution";	// !!! don't translate this !!!
-this.localReplacementVariability = "localReplacement";	// !!! don't translate this !!!
-
-//this.source_html = new Array();
-//this.columns = [];
-this.fields = [];
-this.indentSize = 0;
-this.hasChildren = false;
-this.id = "";
-this.parentId = "";
-this.relPath = null;
-this.isSupressed = false;
-this.url = "";
-
-
-};
-
-
-
-WBSItemHtml.prototype.getTreeNodeTableHtml = function(indentSize, hasChildren, title, url, relPath)
-{
-
-// test
-// the url is passed in to a string to construct a string literal
-// need to escape the quotes
-url = url.replace(/(\'|\")/g, "\\$1");
-
-url = contentPage.processPage.getActivityItemUrl(url, contentPage.processPage.par_proc, contentPage.processPage.par_path, relPath);
-
-var src = [
-"<table bgcolor=\"#000000\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"defaultTable\"><tr><td nowrap=\"nowrap\">" ];
-src = src.concat(this.getTreeNodeHtml(indentSize, hasChildren)); 
-src = src.concat([
-"</td><td width=\"100%\" nowrap=\"nowrap\">" , 
-"<a href=\"" , url , "\">" , title , "</a>" , 
-"</td></tr></table>"]);
-
-	return src;
-};
-
-
-WBSItemHtml.prototype.getTreeNodeHtml = function(indentSize, hasChildren)
-{
-	var width = 17*indentSize;
-
-	var str = ["<div class=\"treeNode\"><span>"];
-	var slen = 1;
-	if ( indentSize > 0 )
-	{
-		str[slen] = "<img alt=\"\" width=\"" ;
-		str[slen + 1] = width ;
-		str[slen + 2] = "\" height=\"15\" border=\"0\" src=\"" ;
-		str[slen + 3] = this.parent.shimImage ;
-		str[slen + 4] = "\"/>";
-		slen += 5;
-	}
-
-
-	var imgSrc;
-	
-	if ( !hasChildren )
-	{
-		str[slen]= "<img alt=\"\" width=\"17\" height=\"15\" border=\"0\" align=\"absmiddle\" src=\"" ;
-		str[slen + 1] = this.parent.shimImage ;
-		str[slen + 2] = "\">";
-		slen += 3;
-
-	}
-	else 
-	{
-		var imageSrc = this.parent.getTreeNodeSrc(indentSize);
-		str[slen] = "<img alt=\"" ;
-		str[slen + 1] =  contentPage.res.expandText ;
-		str[slen + 2] =  "\" title=\"" ;
-		str[slen + 3] =  contentPage.res.expandText ;
-		str[slen + 4] =  "\" width=\"17\" height=\"15\" border=\"0\" align=\"absmiddle\" src=\"" ;
-		str[slen + 5] =  imageSrc ;
-		str[slen + 6] =  "\"" ;
-		str[slen + 7] =  " style=\"cursor:hand\" onclick=\"contentPage.processPage.treeTable.expandCollapseTreeNode(this);return false;\" />";
-		slen += 8;
-	}
-	
-	
-	str[slen] = "</span>&#160;&#160;</div>";
-
-	return str;	
-};
-
-
-WBSItemHtml.prototype.parseRow = function(row) {
-	/*
-	var _id = row.id;
-	var _parentId = row.parentId;
-	var _relPath = row.relPath;
-	var _isSupressed = row.isSuppressed;
-	var _indentSize = row.indentSize;
-	var _hasChildren = row.hasChildren; 
-	var _index = row.index;
-	var _prefix= row.prefix;
-	name, title, url, steps, predecessors, info, type, 
-	repeatable, multiOccurences, optional, planned, ongoing, eventDriven, 
-	team, entryState, exitState, deliverable, variabilityType;
-	*/
-	
-	this.initRow(row.id, row.parentId, row.relPath, row.isSupressed, row.indentSize, row.hasChildren, 
-		row.index, row.prefix, row.name, row.title, row.url, "", row.predecessors, row.info, row.type, 
-		row.repeatable, row.multiOccurences, row.optional, row.planned, row.ongoing, row.eventDriven, 
-		row.team, row.entryState, row.exitState, row.deliverable, row.variabilityType);
-	
-	if ( row.steps != null ) {
-		var len = row.steps.length;
-		var brk = false;
-		for ( var i = 0; i < len; i++ ) {
-			brk = ((i+1)%STEP_GROUP_SIZE == 0 );
-			this.addStep(row.steps[i], brk);
-		}
-	}
-};
-
-WBSItemHtml.prototype.loadRow = function(/*DOM*/tr)
-{
-	//var tr = document.createElement("TR");
-	tr.id = this.id;
-	tr.className = "treeNode";
-	tr.setAttribute("parentId", this.parentId);
-	tr.setAttribute("relProcessPath", this.relPath);
-
-	// is suppressed flag is set only when in browsing model, it's not set in publishing model
-	if ( this.isSupressed != null && this.isSupressed != "" && this.isSupressed != undefined) {
-		tr.setAttribute("isSupressed", this.isSupressed);
-	}
-	
-	// get the cell source
-	var src = [];
-	var len = this.parent.data.columns.length;
-	for (var i = 0; i < len; i++ ) {
-		var td = tr.insertCell(tr.cells.length);
-		this.loadCell(td, i);
-		//tr.appendChild(td);
-		
-	}
-	
-	return tr;				
-};
-
-
-
-WBSItemHtml.prototype.initRow = function(id, parentId, relPath, isSupressed, indentSize, hasChildren, 
-	index, prefix, name, title, url, steps, predecessors, info, type, 
-	repeatable, multiOccurences, optional, planned, ongoing, eventDriven, 
-	team, entryState, exitState, deliverable, variabilityType)
-{
-	this.indentSize = indentSize;
-	this.hasChildren = hasChildren;
-	this.id = id;
-	this.parentId = parentId;
-	this.relPath = relPath;
-	this.isSupressed = isSupressed;
-	
-	this.fields[BS_COL_INDEX] = index;
-	this.fields[BS_COL_PREFIX] = prefix;
-	this.fields[BS_COL_NAME] = name;
-	this.fields[BS_COL_PRESENTATION_NAME] = title;
-	this.url = url;
-	this.fields[BS_COL_STEPS] = steps;
-	this.fields[BS_COL_PREDECESSORS] = predecessors;
-	if (variabilityType.indexOf(this.extendVariability) != -1 || 
-		variabilityType.indexOf(this.localContributionVariability) != -1 || 
-		variabilityType.indexOf(this.localReplacementVariability) != -1 )
-	{
-		this.fields[BS_COL_MODEL_INFO] = "";
-	}
-	else
-	{
-		this.fields[BS_COL_MODEL_INFO] = info;
-	}	
-	this.fields[BS_COL_TYPE] = type;
-
-	this.fields[BS_COL_TEAMS] = team;
-
-	this.fields[BS_COL_ENTRY_STATE] = entryState;
-	this.fields[BS_COL_EXIT_STATE] = exitState;
-	this.fields[BS_COL_DELIVERABLE] = deliverable;
-	
-	this.setStates(repeatable, multiOccurences, optional, planned, ongoing, eventDriven);
-	
-	
-};
-
-WBSItemHtml.prototype.addStep = function(selected, lineBreak)
-{
-	var img_src;
-	if ( selected ) {
-		img_src = this.parent.imagePath + "circle_close.gif";
-	} else {
-		img_src = this.parent.imagePath + "circle_open.gif";	
-	}
-	
-	var steps = this.fields[BS_COL_STEPS];
-	steps += "<img width=\"10\" height=\"9\" alt=\"\" src=\"" + img_src + "\" />";
-	if (lineBreak)
-	{
-		steps += "<br/>";
-	}
-	
-	this.fields[BS_COL_STEPS] = steps;
-};
-
-
-WBSItemHtml.prototype.setStates = function(repeatable, multiOccurences, optional, planned, ongoing, eventDriven)
-{
-	if ( repeatable == "true") {
-		repeatable = "<img alt=\"" + contentPage.res.checkedAltText + "\" height=\"15\" width=\"20\" src=\"" + this.parent.imagePath + "true.gif\">";
-	} else {
-		repeatable = "&nbsp;";
-	}
-	
-	if ( multiOccurences == "true") {
-		multiOccurences = "<img alt=\"" + contentPage.res.checkedAltText + "\" title=\"" + contentPage.res.checkedAltText + "\" height=\"15\" width=\"20\" src=\"" + this.parent.imagePath + "true.gif\">";
-	} else {
-		multiOccurences = "&nbsp;";
-	}
-	
-	if ( optional == "true") {
-		optional = "<img alt=\"" + contentPage.res.checkedAltText + "\" title=\"" + contentPage.res.checkedAltText + "\" height=\"15\" width=\"20\" src=\"" + this.parent.imagePath + "true.gif\">";
-	} else {
-		optional = "&nbsp;";
-	}
-
-	if ( planned =="true") {
-		planned = "<img alt=\"" + contentPage.res.checkedAltText + "\" title=\"" + contentPage.res.checkedAltText + "\" height=\"15\" width=\"20\" src=\"" + this.parent.imagePath + "true.gif\">";
-	} else {
-		planned = "&nbsp;";
-	}
-
-	if ( ongoing =="true") {
-		ongoing = "<img alt=\"" + contentPage.res.checkedAltText + "\" title=\"" + contentPage.res.checkedAltText + "\" height=\"15\" width=\"20\" src=\"" + this.parent.imagePath + "true.gif\">";
-	} else {
-		ongoing = "&nbsp;";
-	}
-	
-	if ( eventDriven =="true") {
-		eventDriven = "<img alt=\"" + contentPage.res.checkedAltText + "\" title=\"" + contentPage.res.checkedAltText + "\" height=\"15\" width=\"20\" src=\"" + this.parent.imagePath + "true.gif\">";
-	} else {
-		eventDriven = "&nbsp;";
-	}
-	
-	
-	this.fields[BS_COL_IS_REPEATABLE] = repeatable;
-	this.fields[BS_COL_HAS_MULTIPLE_OCCURRENCES] = multiOccurences;
-	this.fields[BS_COL_IS_OPTIONAL] = optional;
-	this.fields[BS_COL_IS_PLANNED] = planned;
-	this.fields[BS_COL_IS_ONGOING] = ongoing;
-	this.fields[BS_COL_IS_EVENT_DRIVEN] = eventDriven;
-
-};
-
-
-
-WBSItemHtml.prototype.loadCell = function(/*DOM*/tdEl, columnCount) {
-
-	var col = this.parent.data.columns[columnCount];
-	var col_id = col[0];
-	var text = this.fields[col_id];
-	if ( text == "" ) {
-		text = "&nbsp;";
-	}
-	
-	var id = BS_ID_PREFIX + col_id;
-	
-	//var tdEl = document.createElement("TD");	
-	tdEl.id = id;
-	tdEl.headers = "";
-	
-	var str = "";
-	var slen = 3;
-	if ( columnCount % 2 != 0 ) {
-		tdEl.style.background = "#cccccc";
-	}
-	
-	if ( col_id.indexOf("is_") >=0 || col_id.indexOf("has_") >=0 ) {	
-		tdEl.align = "center";
-	}
-	
-	if ( col_id == BS_COL_TYPE || col_id == BS_COL_STEPS ) {
-		//tdEl.nowrap = true;
-		text = "<span style='white-space:nowrap;'>" + text + "</span>";
-	}
-	
-	if ( col_id == BS_COL_PRESENTATION_NAME ) {
-		tdEl.width="100%";
-		text = this.getTreeNodeTableHtml(
-			this.indentSize, this.hasChildren, 
-			text, this.url, this.relPath).join("");
-		
-	} 
-	
-
-	tdEl.innerHTML = text;
-	return tdEl;
-
-};
-
-
-
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageResource.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageResource.js
deleted file mode 100644
index 81d0aea..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageResource.js
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2000, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-/* resource files for content page javascript 
- * this file should be localized
-*/
-ContentPageResource = function() {
-
-
-this.expandAllText = "Expand All Sections";
-this.collapseAllText = "Collapse All Sections";
-this.backToTopText = "Back to top";
-
-this.expandAllSubSectionsText = "Expand All Steps";
-this.collapseAllSubSectionsText = "Collapse All Steps";
-
-this.toolbar_bookmark = "Bookmark this page";
-this.toolbar_back = "Back";
-this.toolbar_forward = "Forward";
-this.toolbar_expand_all = "Expand all";
-this.toolbar_collapse_all = "Collapse all";
-this.toolbar_print = "Print";
-
-this.expandText = "Expand"
-this.collapseText = "Collapse"
-this.checkedAltText = "Yes"	
-
-};
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageSection.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageSection.js
deleted file mode 100644
index a755919..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageSection.js
+++ /dev/null
@@ -1,295 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-ContentPageSection = function(){
-
-this.collapseSectionsByDefault = false;
-this.firstSection = null;
-this.expandImage = null;
-this.collapseImage = null;
-this.expandAllImage = null;
-this.collapseAllImage = null;
-this.backToTopImage = null;
-this.shimImage = null;
-this.sectionCollapseDivs = null;
-this.sectionCollapseLinks = null;
-
-// test message, 
-this.backToTopText = null;
-this.expandAllText = null;
-this.collapseAllText = null;
-};
-
-ContentPageSection.prototype.init = function(imgPath) {
-
-	this.backToTopText = contentPage.res.backToTopText;
-	this.expandAllText = contentPage.res.expandAllText;
-	this.collapseAllText = contentPage.res.collapseAllText;
-
-	this.expandImage = contentPage.resolveUrl(imgPath + 'expand.gif');		
-	this.collapseImage = contentPage.resolveUrl(imgPath + 'collapse.gif');
-	this.expandAllImage = contentPage.resolveUrl(imgPath + 'expand_all.gif');	
-	this.collapseAllImage = contentPage.resolveUrl(imgPath + 'collapse_all.gif');
-	this.backToTopImage = contentPage.resolveUrl(imgPath + 'back_to_top.gif');
-	this.shimImage = contentPage.resolveUrl(imgPath + 'shim.gif');
-};
-
-// Creates the collapsible section links.
-ContentPageSection.prototype.createSectionLinks = function(tagName, classSelector) {
-
-	if (document.getElementsByTagName) {
-		var elements = document.getElementsByTagName(tagName);
-		var sectionElements = new Array(elements.length);
-		var totalLinks = 0;
-		for (var i = 0; i < elements.length; i++) {
-			var element = elements[i];
-			
-			// save the element for auto wrap
-			if ( element.getAttribute("autoWrap") == "true" ) {
-				contentPage.addAutoWrapElement(element);
-			}
-			
-			if (element.className == classSelector) {
-				sectionElements[totalLinks++] = element;				
-			}
-		}
-		sectionElements.length = totalLinks;
-		this.sectionCollapseDivs = new Array(totalLinks);
-		this.sectionCollapseLinks = new Array(totalLinks);
-		this.firstSection = sectionElements[0];
-		for (var i = 0; i < sectionElements.length; i++) {
-			var element = sectionElements[i];
-			var siblingContainer;
-			if (document.createElement && (siblingContainer = document.createElement('div')) && siblingContainer.style) {	
-				var nextSibling = element.nextSibling;
-				element.parentNode.insertBefore(siblingContainer, nextSibling);
-				var nextElement = sectionElements[i + 1];
-				while (nextSibling != nextElement && nextSibling != null && nextSibling.className != 'copyright') {
-					var toMove = nextSibling;
-					nextSibling = nextSibling.nextSibling;
-					siblingContainer.appendChild(toMove);
-				}
-				if (this.collapseSectionsByDefault) {
-    				siblingContainer.style.display = 'none';
-    			}
-    			this.sectionCollapseDivs[i] = siblingContainer;
-    			this.createCollapsibleSection(element, siblingContainer, i);
-			}
-			else {
-				return;
-			}
-		}
-		
-		this.createExpandCollapseAllSectionsLinks(sectionElements[0]);
-	}
-};
-
-// Creates a collapsible section.
-ContentPageSection.prototype.createCollapsibleSection = function(element, siblingContainer, index) {
-	if (document.createElement) {
-		// Add a spacing between the sections.
-		var sectionSeparator = document.createElement('img');
-		sectionSeparator.src = this.shimImage;
-		sectionSeparator.alt = '';
-		sectionSeparator.title = '';
-		sectionSeparator.height = '3';
-		sectionSeparator.border = '0';
-		sectionSeparator.align = 'absmiddle';
-		element.parentNode.insertBefore(sectionSeparator, element);
-		
-		// Add a expand/collapse link to the section heading.
-		var span = document.createElement('span');
-		var link = document.createElement('a');
-		link.collapseDiv = siblingContainer;
-		link.href = '';
-		var image = document.createElement('img');
-		if (this.collapseSectionsByDefault) {
-			image.src = this.expandImage;
-			image.alt = contentPage.res.expandText;
-			image.title = contentPage.res.expandText;
-		}
-		else {
-			image.src = this.collapseImage;
-			image.alt = contentPage.res.collapseText;
-			image.title = contentPage.res.collapseText;			
-		}
-				
-		image.width = '17';
-		image.height = '15';
-		image.border = '0';
-		image.align = 'absmiddle';
-		link.appendChild(image);
-		var self = this;
-		link.onclick = function(evt) {
-			// here "this" is the tarhet element, i.e. the IMG
-			// Expands or collapses a section based on the received event.
-			if (this.collapseDiv.style.display == '') {
-				this.parentNode.parentNode.nextSibling.style.display = 'none';
-				this.firstChild.src = self.expandImage;
-				this.firstChild.alt = contentPage.res.expandText;
-				this.firstChild.title = contentPage.res.expandText;
-			}
-			else {
-				this.parentNode.parentNode.nextSibling.style.display = '';
-				this.firstChild.src = self.collapseImage;
-				this.firstChild.alt = contentPage.res.collapseText;
-				this.firstChild.title = contentPage.res.collapseText;				
-			}
-			if (evt && evt.preventDefault) {
-				evt.preventDefault();
-			}
-			return false;
-		};
-
-		this.sectionCollapseLinks[index] = link;
-		span.appendChild(link);
-		element.insertBefore(span, element.firstChild);
-		element.appendChild(document.createTextNode(String.fromCharCode(160)));
-		element.appendChild(document.createTextNode(String.fromCharCode(160)));
-    	
-		// Add a Back To Top link in the section heading.
-		this.createBackToTopLink(siblingContainer);
-	}
-};
-
-// Creates a Back to top link.
-ContentPageSection.prototype.createBackToTopLink = function(element) {
-	var div;
-	
-	if (document.createElement && (div = document.createElement('div'))) {
-		div.className = 'backToTopLink';
-		div.align = 'right';
-		var image = document.createElement('img');
-		image.alt = this.backToTopText;
-		image.title = this.backToTopText;
-		image.src = this.backToTopImage;
-		image.width = '16';
-		image.height = '16';
-		image.border = '0';
-		image.align = 'absmiddle';		
-		var link = document.createElement('a');
-		link.className = 'backToTopLink';
-		link.href = '#';
-		link.appendChild(image);
-		var span = document.createElement('span');
-		span.className = 'backToTopLink';
-		span.appendChild(document.createTextNode(this.backToTopText));		
-		link.appendChild(span);
-		div.appendChild(link);
-		element.appendChild(div);
-	}
-};
-
-
-// Creates the Expand All and Collapse All Sections links.
-ContentPageSection.prototype.createExpandCollapseAllSectionsLinks = function(firstElement) {
-
-	var div;
-	var self = this;
-	
-	if (document.createElement && (div = document.createElement('div'))) {
-		div.className = 'expandCollapseLink';
-		div.align = 'right';
-		var image = document.createElement('img');
-		image.src = this.expandAllImage;
-		image.alt = this.expandAllText;
-		image.title = this.expandAllText;
-		image.width = '16';
-		image.height = '16';
-		image.border = '0';
-		image.align = 'absmiddle';		
-		var link = document.createElement('a');
-		link.className = 'expandCollapseLink';
-		link.href = '';
-		link.appendChild(image);
-		link.onclick = /*this.expandAll;*/ function(evt) {
-			/*
-			 for (var i = 0; i < self.sectionCollapseDivs.length; i++) {
-			 	self.sectionCollapseDivs[i].style.display = '';
-			 	self.sectionCollapseLinks[i].firstChild.src = self.collapseImage;
-			 }
-			 */
-			 self.expandAll();
-			 if (evt && evt.preventDefault) {
-			 	evt.preventDefault();
-			 }
-			 return false;
-		};
-		var span = document.createElement('span');
-		span.className = 'expandCollapseText';
-		span.appendChild(document.createTextNode(this.expandAllText));
-		link.appendChild(span);
-		div.appendChild(link);
-		div.appendChild(document.createTextNode(String.fromCharCode(160)));
-		div.appendChild(document.createTextNode(String.fromCharCode(160)));
-		div.appendChild(document.createTextNode(String.fromCharCode(160)));
-		div.appendChild(document.createTextNode(String.fromCharCode(160)));						
-		
-		image = document.createElement('img');
-		image.src = this.collapseAllImage;
-		image.alt = this.collapseAllText;
-		image.title = this.collapseAllText;
-		image.width = '16';
-		image.height = '16';
-		image.border = '0';
-		image.align = 'absmiddle';
-		link = document.createElement('a');
-		link.className = 'expandCollapseLink';
-		link.href = '#';
-		link.appendChild(image);
-		link.onclick = /*this.collapseAll;*/function(evt) {
-			/*
-			for (var i = 0; i < self.sectionCollapseDivs.length; i++) {
-				self.sectionCollapseDivs[i].style.display = 'none';
-				self.sectionCollapseLinks[i].firstChild.src = self.expandImage;
-			}
-			*/
-			self.collapseAll();
-			
-			if (evt && evt.preventDefault) {
-				evt.preventDefault();
-			}
-			return false;
-		};
-		span = document.createElement('span');
-		span.className = 'expandCollapseText';
-		span.appendChild(document.createTextNode(this.collapseAllText));				
-		link.appendChild(span);
-		div.appendChild(link);
-		
-		/*
-		var overviewSeparator = document.getElementById("overviewSeparator");
-		overviewSeparator.parentNode.insertBefore(div, overviewSeparator);
-		*/
-		if (this.firstSection != null) {
-			this.firstSection.parentNode.insertBefore(div, this.firstSection);
-		}
-		
-		if ( contentPage.getApp() != null ) {
-			div.style.display = "none";
-		}
-	};
-	
-	ContentPageSection.prototype.expandAll = function() {
-			for (var i = 0; i < this.sectionCollapseDivs.length; i++) {
-			 	this.sectionCollapseDivs[i].style.display = '';
-			 	this.sectionCollapseLinks[i].firstChild.src = this.collapseImage;
-			 }
-	};
-	
-	ContentPageSection.prototype.collapseAll = function() {
-			for (var i = 0; i < this.sectionCollapseDivs.length; i++) {
-				this.sectionCollapseDivs[i].style.display = 'none';
-				this.sectionCollapseLinks[i].firstChild.src = this.expandImage;
-			}
-	};
-};
-
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageSubSection.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageSubSection.js
deleted file mode 100644
index b4201d6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageSubSection.js
+++ /dev/null
@@ -1,202 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-// define the class here so we don't need to load the detail implementations 
-ContentPageSubSection = function() {
-
-	this.parent = contentPage;
-	// by default, we reuse the images from section
-	this.expandImage = this.parent.section.expandImage;		
-	this.collapseImage = this.parent.section.collapseImage;
-	this.expandAllImage = this.parent.section.expandAllImage;	
-	this.collapseAllImage = this.parent.section.collapseAllImage;
-
-	// and use the default test, orerride this as needed
-	this.expandAllText = contentPage.res.expandAllSubSectionsText;
-	this.collapseAllText = contentPage.res.collapseAllSubSectionsText;	
-
-	this.collapseStepsByDefault = true;
-	this.firstStepSection = null;
-
-	this.stepCollapseDivs = null;
-	this.stepCollapseLinks = null;
-		
-};
-
-// Creates the collapsible step section links.
-ContentPageSubSection.prototype.createStepLinks = function(tagName, classSelector) {
-	
-	if (document.getElementsByTagName) {
-		var elements = document.getElementsByTagName(tagName);
-		if (elements.length == 0) return;
-		var stepElements = new Array(elements.length);
-		var totalLinks = 0;
-		for (var i = 0; i < elements.length; i++) {
-			var element = elements[i];
-			if (element.className == classSelector) {
-				stepElements[totalLinks++] = element;
-			}
-		}
-		if (totalLinks == 0) return;
-		stepElements.length = totalLinks;
-		this.stepCollapseDivs = new Array(totalLinks);
-		this.stepCollapseLinks = new Array(totalLinks);
-		this.firstStepSection = stepElements[0];
-		for (var i = 0; i < stepElements.length; i++) {
-			var element = stepElements[i];
-			var siblingContainer;
-			if (document.createElement && (siblingContainer = document.createElement('div')) && siblingContainer.style) {
-				var nextSibling = element.nextSibling;
-				element.parentNode.insertBefore(siblingContainer, nextSibling);
-				var nextElement = stepElements[i + 1];
-				while (nextSibling != nextElement && nextSibling != null) {
-					var toMove = nextSibling;
-					nextSibling = nextSibling.nextSibling;
-					siblingContainer.appendChild(toMove);
-				}
-				if (this.collapseStepsByDefault) {
-    				siblingContainer.style.display = 'none';
-    			}
-    			this.stepCollapseDivs[i] = siblingContainer;
-    			this.createCollapsibleStepSection(element, siblingContainer, i);
-			}
-			else {
-				return;
-			}
-		}
-		this.createExpandCollapseAllStepsLinks(stepElements[0]);
-	}
-};
-
-// Creates a collapsible step section.
-ContentPageSubSection.prototype.createCollapsibleStepSection = function(element, siblingContainer, index) {
-	if (document.createElement) {
-		var span = document.createElement('span');
-		var link = document.createElement('a');
-		link.collapseDiv = siblingContainer;
-		link.href = '';
-		var image = document.createElement('img');
-		if (this.collapseStepsByDefault) {
-			image.src = this.expandImage;
-			image.alt = contentPage.res.expandText;
-			image.title = contentPage.res.expandText;	
-		}
-		else {
-			image.src = this.collapseImage;
-			image.alt = contentPage.res.collapseText;
-			image.title = contentPage.res.collapseText;	
-		}
-		image.width = '17';
-		image.height = '15';
-		image.border = '0';
-		image.align = 'absmiddle';
-		link.appendChild(image);
-		
-		var self = this;
-		link.onclick = /*this.expandCollapseStepSection;*/function(evt) {
-			if (this.collapseDiv.style.display == '') {
-				this.parentNode.parentNode.nextSibling.style.display = 'none';
-				this.firstChild.src = self.expandImage;
-				this.firstChild.alt = contentPage.res.expandText;
-				this.firstChild.title = contentPage.res.expandText;	
-			}
-			else {
-				this.parentNode.parentNode.nextSibling.style.display = '';
-				this.firstChild.src = self.collapseImage;
-				this.firstChild.alt = contentPage.res.collapseText;
-				this.firstChild.title = contentPage.res.collapseText;					
-			}
-			if (evt && evt.preventDefault) {
-				evt.preventDefault();
-			}
-			return false;
-		};
-		this.stepCollapseLinks[index] = link;
-		span.appendChild(link);
-		element.insertBefore(span, element.firstChild);
-		element.appendChild(document.createTextNode(String.fromCharCode(160)));
-		element.appendChild(document.createTextNode(String.fromCharCode(160)));
-	}
-};
-
-					
-// Creates the Expand All and Collapse All Steps links.
-ContentPageSubSection.prototype.createExpandCollapseAllStepsLinks = function(firstElement) {
-	var div;
-	var self = this;
-	
-	if (document.createElement && (div = document.createElement('div'))) {
-		div.className = 'expandCollapseLink';
-		div.align = 'right';		
-		var image = document.createElement('img');
-		image.src = this.expandAllImage;
-		image.alt = this.expandAllText
-		image.title = this.expandAllText
-		image.width = '16';
-		image.height = '16';
-		image.border = '0';
-		image.align = 'absmiddle';
-		var link = document.createElement('a');
-		link.className = 'expandCollapseLink';
-		link.href = '';
-		link.appendChild(image);
-		link.onclick = /*this.expandAllSteps;*/function(evt) {
-			 for (var i = 0; i < self.stepCollapseDivs.length; i++) {
-			 	self.stepCollapseDivs[i].style.display = '';
-			 	self.stepCollapseLinks[i].firstChild.src = self.collapseImage;
-			 }
-			 if (evt && evt.preventDefault) {
-			 	evt.preventDefault();
-			 }
-			 return false;
-		};
-		var span = document.createElement('span');
-		span.className = 'expandCollapseText';
-		span.appendChild(document.createTextNode(this.expandAllText));
-		link.appendChild(span);
-		div.appendChild(link);
-		div.appendChild(document.createTextNode(String.fromCharCode(160)));
-		
-		image = document.createElement('img');
-		image.src = this.collapseAllImage;
-		image.alt = this.collapseAllText
-		image.title = this.collapseAllText
-		image.width = '16';
-		image.height = '16';
-		image.border = '0';
-		image.align = 'absmiddle';
-		link = document.createElement('a');
-		link.className = 'expandCollapseLink';
-		link.href = '';
-		link.appendChild(image);
-		link.onclick = /*this.collapseAllSteps;*/function(evt) {
-			for (var i = 0; i < self.stepCollapseDivs.length; i++) {
-				self.stepCollapseDivs[i].style.display = 'none';
-				self.stepCollapseLinks[i].firstChild.src = self.expandImage;
-			}
-			if (evt && evt.preventDefault) {
-				evt.preventDefault();
-			}
-			return false;
-		};
-		span = document.createElement('span');
-		span.className = 'expandCollapseText';
-		span.appendChild(document.createTextNode(this.collapseAllText));
-		link.appendChild(span);
-		div.appendChild(link);
-		
-		if (this.firstStepSection) {
-			this.firstStepSection.parentNode.insertBefore(div, this.firstStepSection);
-		}
-	}
-};
-
-
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageToolbar.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageToolbar.js
deleted file mode 100644
index 4e147e7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ContentPageToolbar.js
+++ /dev/null
@@ -1,169 +0,0 @@
-ContentPageToolbar = function(){
-
-this.expandAllImage = null;
-this.collapseAllImage = null;
-this.bookmarkImage = null;
-this.printImage = null;
-this.backImage = null;
-this.forwardImage = null;
-this.dividerImage = null;
-
-// hold the toolbar item ids
-this.toolbarItems = [];
-
-this.barItemIdPrefix = "contentbar_";
-
-}
-
-ContentPageToolbar.prototype.init = function(imgPath) {
-
-	this.expandAllImage = contentPage.resolveUrl(imgPath + 'expand_all.gif');	
-	this.collapseAllImage = contentPage.resolveUrl(imgPath + 'collapse_all.gif');
-	this.bookmarkImage = contentPage.resolveUrl(imgPath + 'bookmark.gif');
-	this.printImage = contentPage.resolveUrl(imgPath + 'print.gif');
-	this.backImage = contentPage.resolveUrl(imgPath + 'back.gif');
-	this.forwardImage = contentPage.resolveUrl(imgPath + 'forward.gif');
-	this.dividerImage = contentPage.resolveUrl(imgPath + 'divider.gif');
-	//this.shimImage = contentPage.resolveUrl(imgPath + 'shim.gif');
-	
-	this._createToolbar();
-};
-
-ContentPageToolbar.prototype._createToolbar = function() {
-	var container = document.getElementById("contentPageToolbar");
-		
-	if ( container == null ) {
-		return;
-	}
-	
-	var html = ["<table border='0' cellspacing='0' cellpadding='0' >", "<tr>"];
-		
-		// local file can't be added as bookmark
-		if ( !contentPage.isFileUrl(location.href) ) {
-			html = html.concat(this._getToolbarItemHtml(this.bookmarkImage, contentPage.res.toolbar_bookmark));
-		}
-		
-		html = html.concat(this._getToolbarItemHtml(this.backImage, contentPage.res.toolbar_back));
-		html = html.concat(this._getToolbarItemHtml(this.forwardImage, contentPage.res.toolbar_forward));
-		html = html.concat(this._getToolbarItemHtml(this.expandAllImage , contentPage.res.toolbar_expand_all));
-		html = html.concat(this._getToolbarItemHtml(this.collapseAllImage, contentPage.res.toolbar_collapse_all));
-		html = html.concat(["<td width='10px'><img alt='' src='", this.dividerImage, "' title=''/></td>"]);
-		html = html.concat(this._getToolbarItemHtml(this.printImage, contentPage.res.toolbar_print));
-		html = html.concat(["</tr>", "</table>"]);
-		
-	container.innerHTML = html.join("");
-
-	// attach events
-	for (var i = 0; i < this.toolbarItems.length; i++ ) {
-		var id = this.toolbarItems[i];
-		var bar = document.getElementById(id);
-		//alert(bar.tagName);
-		
-		// note: all handler functions should return false to avoid the url action
-		var handler = null;
-		if ( id.indexOf(this.bookmarkImage) >= 0 ) {
-			handler =  function() { 
-				contentPage.saveAsBookmark();
-				return false;
-			};
-		} else if ( id.indexOf(this.backImage) >= 0 ) {
-			handler =  function() { 
-				//alert("back");
-				var app = contentPage.getApp();
-				if ( app != null ) {
-					app.browser.back();
-				}
-				return false;
-			};
-		} else if ( id.indexOf(this.forwardImage) >= 0 ) {
-			handler =  function() { 
-				var app = contentPage.getApp();
-				if ( app != null ) {
-					app.browser.forward();
-				}
-				return false;
-			};
-		} else if ( id.indexOf(this.expandAllImage) >= 0 ) {
-			handler =  function() { 
-				contentPage.section.expandAll();
-				return false;
-			};
-		} else if ( id.indexOf(this.collapseAllImage) >= 0 ) {
-			handler =  function() { 
-				contentPage.section.collapseAll();
-				return false;
-			};
-		} else if ( id.indexOf(this.printImage) >= 0 ) {
-			handler =  function() { 
-				window.print();
-				return false;
-			};
-		} 
-		
-		if ( handler != null ) {
-			bar.onclick = handler;			
-		}
-		
-		// handle the key stroke
-		
-	}
-
-	
-	/*
-	var table = document.createElement("table");
-	table.border = "2";
-	table.cellspacing = "0";
-	table.cellpadding = "0";
-	container.appendChild(table);
-	
-	var tr = document.createElement("tr");
-	table.appendChild(tr);
-	*/
-	// create the bar items
-	//tr.appendChild(this._createToolbarItem(this.bookmarkImage, "Bookmark this page", "20px"));
-	/*
-	tr.appendChild(this.createToolbarItem(this.backImage, "back", "20px"));
-	tr.appendChild(this.createToolbarItem(this.forwardImage, "forward", "20px"));
-	tr.appendChild(this.createToolbarItem(this.expandAllImage, "expand All", "20px"));
-	tr.appendChild(this.createToolbarItem(this.collapseAllImage, "collapse All", "20px"));
-	tr.appendChild(this.createToolbarItem(this.dividerImage, "", "10px"));
-	tr.appendChild(this.createToolbarItem(this.printImage, "Print", "20px"));
-	*/
-	
-};
-
-ContentPageToolbar.prototype._getToolbarItemHtml = function(imgSrc, text) {
-	
-	var index = this.toolbarItems.length;
-	var id = this.barItemIdPrefix + imgSrc;
-	this.toolbarItems[index] = id;
-	
-	var html = ["<td width='20px' class='contentToolbarIcon'><a href='' id='", id, "'>",  
-		"<img alt='", text, "' src='", imgSrc, "' title='", text, "'/></a>", "</td>"];
-
-	return html;	
-};
-
-ContentPageToolbar.prototype._createToolbarItem = function(imgSrc, text, width) {
-	var td = document.createElement("td");
-	td.width = width;
-	
-	var img = document.createElement("img");
-	img.id = this.barItemIdPrefix + imgSrc;
-	
-	img.src = imgSrc;
-	img.title = text;
-	img.alt = text;
-	img.width = '16';
-	img.height = '16';
-	img.border = '0';
-	//img.align = 'absmiddle';
-	
-	td.appendChild(img);
-	
-	//alert("td: " + td);
-	
-	return td;
-};
-
-
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ProcessElementPage.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/ProcessElementPage.js
deleted file mode 100644
index d9b8da6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/ProcessElementPage.js
+++ /dev/null
@@ -1,439 +0,0 @@
-
-// define the class here so we don't need to load the detail implementations 
-function ProcessElementPage() {
-
-	this.par_proc = null;
-	this.par_path = null;
-
-	// images for the activity, generated dynamically when publishing
-	this.imageFiles = [];
-	
-	// suppressed items for the activity, generated dynamically when publishing
-	this.suppressedItems = [];
-	
-	// element urls for the activity, generated dynamically when publishing
-	this.elementUrls = [];
-		
-	this.treeTable = null;
-	
-};
-
-ProcessElementPage.prototype.init = function(hasTree) {
-
-	var parameters = contentPage.getUrlParameters(contentPage.queryStr.substring(1));
-	this.par_proc = parameters["proc"];
-	this.par_path = parameters["path"];
-	
-	if ( this.par_proc == null || this.par_path == null ) {
-		parameters = contentPage.getUrlParameters(contentPage.defaultQueryStr.substring(1));
-		this.par_proc = parameters["proc"];
-		this.par_path = parameters["path"];
-	}	
-	
-	if ( hasTree) {
-		this.createTree(contentPage.imgPath);
-	}
-};
-
-ProcessElementPage.prototype.onload = function() {
-	this.fixMapUrls();
-	this.fixTabUrls();
-	if ( this.treeTable != null && this.treeTable.createTree) {
-		this.treeTable.createTree('div', 'treeNode');
-	}
-	
-};
-
-
-ProcessElementPage.prototype.createTree = function(imgPath) {
-	this.treeTable = new ActivityTreeTable(this);
-	this.treeTable.initialize(imgPath);
-};
-
-ProcessElementPage.prototype.fixTabUrls = function() {
-
-	var a = document.getElementById("TAB_Description");
-	if ( a != null ) {
-		this.fixTabUrl(a);
-	}
-	
-	a = document.getElementById("TAB_WBS");
-	if ( a != null ) {
-		this.fixTabUrl(a);
-	}
-
-	a = document.getElementById("TAB_WPBS");
-	if ( a != null ) {
-		this.fixTabUrl(a);
-	}
-
-	a = document.getElementById("TAB_TBS");
-	if ( a != null ) {
-		this.fixTabUrl(a);
-	}
-};
-
-
-ProcessElementPage.prototype.fixTabUrl = function(a) {
-	if (a == null ||  contentPage.queryStr == null ) return;
-	var url = a.getAttribute("href");
-	if ( url != null ) {
-		a.setAttribute("href", url + contentPage.queryStr);
-	}
-}
-
-ProcessElementPage.prototype.fixMapUrls = function() {
-
-	// fix the map area url
-	if (document.getElementsByTagName) {
-		var elements = document.getElementsByTagName("AREA");
-		if ( elements != null ) {
-			for (var i = 0; i < elements.length; i++) {
-				var element = elements[i];
-				var url = element.getAttribute("href");
-				var relPath = element.getAttribute("relPath");
-				if ( url != null && relPath != null ) {
-					url = this.getActivityItemUrl(url, this.par_proc, this.par_path, relPath);
-					element.setAttribute("href", url);
-				}
-			}
-		}
-		
-	}
-	
-	// fix the diagram img urls
-	var diagramType = "Activity"; // no transtation!
-	var e = document.getElementById("diagram_" + diagramType);
-	if ( e != null ) {
-		var url = this.getDiagramImageUrl(this.par_proc, this.par_path, diagramType);
-		if ( url != null ) {
-			e.src = url;
-		}
-	}
-	
-	diagramType = "ActivityDetail"; // no transtation!
-	e = document.getElementById("diagram_" + diagramType);
-		if ( e != null ) {
-			var url = this.getDiagramImageUrl(this.par_proc, this.par_path, diagramType);
-			if ( url != null ) {
-				e.src = url;
-			}
-	}
-}
-
-
-
-ProcessElementPage.prototype.getActivityItemUrl = function(url, process, elementProcessPath, relProcessPath)
-{
-	var queryString = "?proc=" + process + "&path=" + elementProcessPath + relProcessPath;
-	return contentPage.resolveUrl(url) + queryString;
-	
-};
-
-ProcessElementPage.prototype.getDiagramImageUrl = function(process, elementProcessPath, diagramType)
-{
-	// get the diagram image file for the specified element path and process
-	// retutns null if noting
-	// diagram type is Activity, ActivityDetail, 
-	var imgUrl = this.imageFiles[elementProcessPath+diagramType];
-	//alert("get " + diagramType + " diagram for " + elementProcessPath + " = " + imgUrl);
-
-	if ( imgUrl != null && imgUrl != "undefined" ) {
-		return contentPage.resolveUrl(imgUrl);
-	} 
-	
-	return null;
-};
-
-/*this method fix the url for descriptor links within descriptor*/
-ProcessElementPage.prototype.getDescriptorItemUrl = function(url, relProcessPath)
-{
-	var path = "";
-	var i =  this.par_path.indexOf(relProcessPath);
-	if ( i > 0 ) {
-		path = this.par_path.substring(0, i + relProcessPath.length);
-	} else {
-		// remove the last guid
-		i = this.par_path.lastIndexOf(",");
-		path = this.par_path.substring(0, i+1) + relProcessPath;
-	}
-	
-	var queryString = "?proc=" + this.par_proc + "&path=" + path;
-	url = contentPage.resolveUrl(url) + queryString;
-		
-	return url;
-	
-};
-
-
-ProcessElementPage.prototype.fixDescriptorLinks = function()
-{
-	var elements = document.getElementsByTagName("A");
-	for (var i = 0; i < elements.length; i++) {
-		var element = elements[i];
-
-		var guid = element.getAttribute("guid");
-		var url = element.getAttribute("href");
-
-		if ( guid != null && guid != "" ) {
-			url = this.getDescriptorItemUrl(url, guid);
-			element.setAttribute("href", url);
-		}
-	}
-};
-
-ProcessElementPage.prototype.isSuppressed = function(process, elementProcessPath)
-{
-	var flag = (this.suppressedItems[elementProcessPath] == true);
-	//if ( flag ) alert("got one: " + elementProcessPath);
-		
-	return flag;
-};
-
-ProcessElementPage.prototype.buildTeamTree = function(teamTree) {	
-	
-	var el = document.getElementById("teamTree");
-	if ( el == null ) return;
-	
-	if ( teamTree == null || teamTree.length == 0 ) {
-		return;
-	}
-	
-	teamTree[0][0] = teamTree[0][0].replace(/(\'|\")/g, "\\$1");
-
-	var teamBuffer = [];
-	var len = teamTree.length;
-	for ( var i = 0; i < len; i++ ) {
-
-		if ( !this.isTeamSuppressed(teamTree[i]) ) {
-			teamBuffer[teamBuffer.length] = "<div class=\"teamStructure\" align=\"left\">";
-			teamBuffer = teamBuffer.concat(this.getTeamTreeHtml(teamTree[i]));
-			teamBuffer[teamBuffer.length] = "</div><br/>";
-		}
-
-	}
-	
-	//alert(teamBuffer);
-	//document.write(teamBuffer);
-	el.innerHTML = teamBuffer.join("");
-};
-
-
-// format is [url, title, relPath, suppressed]
-ProcessElementPage.prototype.getTeamTreeHtml = function(teamTree) {
-
-	if ( teamTree == null || teamTree.length < 4) {
-		return [];
-	}
-
-	var url = teamTree[0];
-	var title = teamTree[1];
-	var relPath = teamTree[2];
-	
-	url = this.getActivityItemUrl(url, this.par_proc, this.par_path, relPath);
-	
-	var teamBuffer = ["<a href=\"", url, "\">", title, "</a>"];
-	var slen = 5;
-	
-	if ( teamTree.length > 4 && teamTree[4] != null && teamTree[4] != "" && teamTree[4] != undefined ) {
-		teamBuffer[slen++] = "<ul>";
-		for ( var i = 4; i < teamTree.length; i++ ) {
-			if (typeof teamTree[i] == "object" && !this.isTeamSuppressed(teamTree[i]) ) {
-
-				teamBuffer[slen++] = "<li>";
-				teamBuffer = teamBuffer.concat(this.getTeamTreeHtml(teamTree[i]));
-				slen = teamBuffer.length;
-				teamBuffer[slen++] = "</li>";
-			}
-		}
-		teamBuffer[slen++] = "</ul>";
-	}
-
-	return teamBuffer;
-};
-
-ProcessElementPage.prototype.isTeamSuppressed = function(teamTree) {
-
-	if ( teamTree == null || teamTree.length < 4) {
-		return true;
-	}
-	
-	var relPath = teamTree[2];
-	var sup = teamTree[3];
-
-	if ( sup == "" ) {
-		return this.isSuppressed(this.par_proc, this.par_path + relPath);
-	} else {
-		return (sup == "true");
-	}
-	
-};
-
-ProcessElementPage.prototype.buildProcessElementBreadCrumb = function(url) {
-
-	var div = document.getElementById("breadcrumbs");
-	if ( div == null ) return;
-
-	var viewFrame = contentPage.getViewFrame();
-	if ( viewFrame == null ) {
-		return;
-	}
-		
-	var paths = this.par_path.split(",");
-	
-	var hasApp = (contentPage.getApp() != null);	
-	var nodeInfo = null;
-	
-	if ( hasApp ) {
-		// the first path is the process guid
-		// however, the tree node might be an activity without having a process node
-		// for example, a discipline can have an activity as a referenced work flow
-		// so check all 
-		for (var x = 0; x < paths.length; x++ ) {
-			var id = paths[x];
-			nodeInfo = viewFrame.getNodeInfo(id);
-			if ( nodeInfo != null ) {
-				break;
-			}
-		}
-		
-		// if the process is not in the tree, there is no nodeinfo
-		// in such case, use the node info of the element
-		if ( nodeInfo == null ) {
-			nodeInfo = contentPage.nodeInfo;
-		}
-		
-		if ( nodeInfo != null ) {
-			// remove the first element since it's the view node
-			paths.shift();
-	
-			var self = this;
-			var callback = function(bcs) {
-				self._showProcessElementBreadCrumb(div, bcs, url);
-			};
-			viewFrame.getBreadcrumbsByPath(nodeInfo, paths, callback);
-		} else {
-			// if can't find the tree node, just show the process breadcrumbs
-			var bcs = [];
-			this._showProcessElementBreadCrumb(div, bcs, url);
-		}
-	} else {
-		var bcs = null;
-		while (paths.length > 0 ) {
-			bcs = viewFrame.getBreadcrumbsByPath(paths);
-			if ( bcs != null && bcs.length > 0 ) {
-				break;
-			}
-			
-			paths.shift();
-		}
-		
-		if ( bcs == null || bcs.length == 0 ) {
-			bcs  = viewFrame.getBreadcrumbs(url);
-		}
-		
-		//alert(bcs);
-		this._showProcessElementBreadCrumb(div, bcs, url);
-	}
-	
-
-};
-
-ProcessElementPage.prototype._showProcessElementBreadCrumb = function(div, bcs, url) {
-	var viewFrame = contentPage.getViewFrame();
-	if (viewFrame == null || !viewFrame.getBreadcrumbs ) {
-		return;
-	}
-	
-	var localBcs = [];
-	var count = 0;
-	var linksText = "";
-	var paths = this.par_path.split(",");
-	var path = this.par_path;
-	
-	var hasApp = (contentPage.getApp() != null);
-	//alert("app:" + hasApp);
-	var baseUrl = null;
-	if ( hasApp ) {
-		baseUrl = contentPage.getApp().getBaseUrl();
-	} else {	
-		baseUrl = viewFrame.getBaseUrl();
-	}
-	
-	var lastBcsId = null;
-	if ( bcs == null ) {
-		bcs = [];
-	} else if ( bcs.length > 0 ) {
-		lastBcsId = bcs[bcs.length-1].id;
-	}
-	
-	
-	for (var i = paths.length-1; i >=0; i--) {
-		var guid = paths[i];
-
-		var item_text = "";
-		var item_url = "";
-		
-		var item = this.elementUrls[guid];
-		if ( item != null ) {
-			item_text = item[0];
-			item_url = baseUrl + item[1];
-
-			// get the url with no back path, then conver to a full url			
-			item_url = this.getActivityItemUrl(item_url, this.par_proc, path, '');
-			// get the last tree-node breadcrumbs
-			// process this before the item_url is set
-			//alert("viewFrame.getBreadcrumbs: " + viewFrame.getBreadcrumbs);
-			if ( guid == lastBcsId ) {
-				break;
-			}
-			
-			localBcs[count++] = {id: guid, url: item_url, title: item_text};			
-		}
-		
-		// trim the path
-		var x = path.indexOf("," + guid);
-		if ( x > 0 ) {
-			path = path.substring(0, x);
-		}
-	}
-
-	if ( localBcs.length > 0 ) {
-		// order it right
-		localBcs = localBcs.reverse();
-		if ( bcs == null )  bcs = [];		
-		var count = bcs.length;
-		for (var i = 0; i < localBcs.length; i++) {
-			bcs[count+i] = localBcs[i];
-		}
-	}
-	
-	if ( bcs != null && bcs.length > 0 ) {
-		contentPage.showBreadcrumns(div, bcs);
-	}
-	
-};
-
-
-
-ProcessElementPage.prototype.getProcessElementLinkHtmlFromId = function(guid, elementPath, backPath) {
-
-	var str = [];
-	var item = this.elementUrls[guid];
-	if ( item != null ) {
-		var text = item[0];
-		var url = backPath + item[1];
-		url = this.getActivityItemUrl(url, this.par_proc, elementPath, '');
-		
-		// escape the quotes
-		url = url.replace(/'/g, "\\'");
-		url = url.replace(/\"/g, "\\\"");
-			
-			
-		str = ["<a href=\"", url, "\">", text, "</a>"];
-	}
-
-	
-	return str.join("");
-};
-
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/contentPage.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/contentPage.js
deleted file mode 100644
index 937d863..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/contentPage.js
+++ /dev/null
@@ -1,334 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-// This temporary function helps to resolve Javascript errors in the migrated RUP
-// content pages. It will be removed once the corresponding .js files are being
-// migrated along with the HTML content pages.
-function ReferenceHelpTopic (topicName, book , fileName) {
-   //document.write("<i>"+ topicName + "<\/i>");
-};
-
-
-var contentPage = {
-
-	backPath: null,
-	imgPath: null,
-	defaultQueryStr: null,
-	queryStr: null,
-	isProcessPage: false,
-	nodeInfo: null,
-	
-	// define resource file
-	res : new ContentPageResource(),
-	
-	// define activity layout, need to create this as a place holder 
-	// so that the dynamically generated data can be loaded
-	processPage: ( typeof ProcessElementPage == "undefined" ) ? null : new ProcessElementPage(),
-	
-	// define section
-	section: new ContentPageSection(),
-	
-	// define sub-section
-	subSection: null,
-	
-	toolbar: null,
-	
-	// auto wrap elements
-	autoWrapElements: [],
-	
-	// call this method before the page is loaded
-	// this is used to initialize some parameters before the page content is processed
-	// for example, if the content needs to use some parameters inside the content
-	// this approach is not recommented but keep here for backward compatibility
-	preload: function(imgPath, backPath, nodeInfo, defaultQueryStr, hasSubSection, isProcessPage, hasTree) {
-
-		this.isProcessPage = isProcessPage || hasTree;
-		this.imgPath = imgPath;
-		this.backPath = backPath;
-		this.nodeInfo = nodeInfo;
-		this.defaultQueryStr = defaultQueryStr;
-		this.queryStr = location.search;
-		
-		// convert the image path to absolute path
-		// otherwise the page will resolve to wrong absolute path if the browser cashed the pages
-		var base = window.location.href;
-		var i = base.lastIndexOf("/");
-		this.imgPath = base.substring(0, i+1) + this.imgPath;
-		//alert(this.imgPath);
-
-
-		if ( this.queryStr == null || this.queryStr == "" )
-		{
-			this.queryStr = this.defaultQueryStr;
-		}
-				
-		this.section.init(this.imgPath);
-				
-		if ( hasSubSection ) {
-			this.subSection = new ContentPageSubSection();
-		}
-		
-		if ( this.processPage && (isProcessPage || hasTree) ) {
-			this.processPage.init(hasTree);
-		}
-				
-	},
-	
-	
-	// call this method when page is loaded
-	onload: function() {
-		this.section.createSectionLinks('div', 'sectionHeading', this.imgPath);
-		if ( this.subSection != null ) {
-			this.subSection.createStepLinks('div', 'stepHeading');
-		}
-			
-		var self = this;
-		var app = this.getApp();
-		
-		if ( app != null ) {
-			this.toolbar = new ContentPageToolbar();
-			this.toolbar.init(this.imgPath);
-		}		
-		
-		// register auto wrap element
-		if ( this.autoWrapElements.length > 0 ) {
-			window.onresize = function(e) {
-				contentPage.resizeBlockText();
-			}		
-			this.resizeBlockText();
-		}
-		
-		//alert("content on load: " + location.href);
-		
-		if ( this.processPage ) {
-			this.processPage.onload();
-		} 
-		
-		if ( app != null ) {
-			if ( !app.isInitialized() ) {
-				var callback = function() {
-				//alert("content on load: in callback");
-					app.onContentLoaded(location.href);
-					self.buildBreadcrumns();
-				};
-				app.addPostInitCallback(callback);
-				
-			} else {
-				//alert("content on load: calling breadBreadcrumbs");	
-				app.onContentLoaded(location.href);
-				setTimeout(function () { self.buildBreadcrumns(); }, 10);
-			}
-		} else {
-			this.buildBreadcrumns();
-		}
-		
-		//alert("content page loaded");
-		
-		// user can add customization code here
-		// this method will be called when the page is loaded
-		// this is equivalent to inserting javascript immediately before the </html> tag
-		
-	},
-	
-	buildBreadcrumns : function() {
-		if ( this.processPage ) {
-			this.processPage.buildProcessElementBreadCrumb(location.href);
-		} else {
-			this._buildBreadcrumns(location.href);
-		} 
-	},
-	
-	resizeBlockText: function() {
-		var newWidth = window.document.body.offsetWidth - 20;
-		for ( var i = 0; i < this.autoWrapElements.length; i++ ) {
-			var elem = this.autoWrapElements[i];
-			elem.style.width=newWidth + "px"; // firefox does not work without specifying the unit
-		}
-	},
-	
-	
-	addAutoWrapElement: function(elem) {
-		this.autoWrapElements.push(elem);
-	},
-	
-	// utility methods
-	getUrlParameters: function(queryStr)
-	{
-		var arr = new Array();	
-		var pairs = queryStr.split("&");
-	   	for (var i = 0; i < pairs.length; i++) {
-	     		var pos = pairs[i].indexOf('=');
-	     		if (pos == -1) continue;
-	     		var argname = pairs[i].substring(0,pos);
-	     		var value = pairs[i].substring(pos+1);    	
-	     		arr[argname] = value;
-		}
-		
-		return arr;
-	},
-
-	getApp : function() {
-		if( typeof theApp != "undefined") {
-			return theApp;
-		} else if ( window.parent && typeof window.parent.theApp != "undefined") {
-			return window.parent.theApp;
-		}
-	
-		return null;
-	},
-	
-	getViewFrame: function() {
-	
-		var app = this.getApp();
-		if ( app != null ) {
-		
-			// make sure the app is initialized
-			if ( app.isInitialized() ) {
-				return app.nav;
-			} else { 
-				return null;
-			}
-		}
-				
-		var viewFrame = null;
-		for ( var i = 0; i < window.parent.frames.length; i++ ) {
-			if ( window.parent.frames[i].name == 'ory_toc_frame' ) {
-				var tocFrame = window.parent.frames[i];
-				//alert(tocFrame);
-				if (tocFrame.frames.length > 0 ) {
-					for ( var x = 0; x < tocFrame.frames.length; x++ ) {
-						if (tocFrame.frames[x].name == 'ory_toc' ) {
-							viewFrame = tocFrame.frames[x];
-							break;
-						}
-					}
-				}
-			}
-		}
-	
-		return viewFrame;
-	},
-
-	_buildBreadcrumns: function(url) {
-		var viewFrame = this.getViewFrame();
-		if ( viewFrame == null ) {
-			return;
-		}
-
-		var div = document.getElementById("breadcrumbs");
-		if (div != null && viewFrame != null && viewFrame.getBreadcrumbs ) {
-			if ( this.getApp() == null ) {
-				// don't break old code
-				var bcs = viewFrame.getBreadcrumbs(url);
-				if ( bcs != null && bcs.length > 0 ) {
-					this.showBreadcrumns(div, bcs);
-				}
-			} else {
-				var self = this;
-				var callback = function(bcs) {
-					if ( bcs != null && bcs.length > 0 ) {
-						self.showBreadcrumns(div, bcs);
-					}
-				};
-					
-				if (contentPage.nodeInfo != null && contentPage.nodeInfo.length > 0 ) {
-					viewFrame.getBreadcrumbsByPath(contentPage.nodeInfo, null, callback);
-				} else {
-					// do nothing
-					//viewFrame.getBreadcrumbs(url, callback);
-				}
-				
-			}
-			
-		}
-	
-	},
-
-
-	showBreadcrumns: function(div, /*array*/bcs) {
-		if (div == null || bcs == null || bcs.length == 0  ) {
-			return;
-		}
-		
-		var html = [];
-		var slen = 0;
-		for (var i = 0; i < bcs.length; i++ ) {
-			var bc = bcs[i]; // {url:url, title:title}
-			if ( i > 0 ) {
-				html[slen++] = "<span>&nbsp;>&nbsp;</span>";
-			}
-
-			// escape the quotes
-			var url = bc.url;
-			url = url.replace(/'/g, "\\'");
-			url = url.replace(/\"/g, "\\\"");
-
-			html = html.concat(["<a href=\"", url, "\">", bc.title, "</a>"]) ;
-			slen = html.length;
-		}
-
-		var str = ["<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">",
-			"<tr><td align=\"left\">"];
-		str = str.concat(html);
-		str = str.concat(["</td><tr>", "</table>"]);
-		div.innerHTML = str.join("");
-	},
-	
-	
-	resolveUrl: function(url) {
-
-		// note: don't call the app.resolveContenturl() since the content url might not be set yet
-		// use the window's url directly
-		if ( url.indexOf("./") == 0 ) {			
-				var base = window.location.href;
-				//alert("base:" + base);
-				var i = base.lastIndexOf("/");
-				url = base.substring(0, i) + url.substring(1);
-		} 
-		
-		return url;
-	},
-	
-	/* get the page guid, it's the guid of the element or page*/
-	getPageId : function() {
-		var e = document.getElementById("page-guid");
-		if ( e != null ) {
-			return e.getAttribute("value");
-		}
-		
-		return null;
-	},
-	
-	saveAsBookmark: function() {
-	
-         // for IE, does not work for local file browsing
-         // only on server
-
-		//var app = this.getApp();
-		var url = location.href;
-		var title = document.title;			
- 		if (window.sidebar) { 
-            // for Mozilla Firefox
-            window.sidebar.addPanel(title, url, "");
-        } else if( window.external ) { 
-            window.external.AddFavorite(url, title);
-        } else if(window.opera && window.print) { 
-             
-        }
-        
- 	},
-	
-	isFileUrl: function(url) {
-		return (url != null) && (url.toLowerCase().indexOf("file://") == 0);
-	}
-	// helper methods
-
-};
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/scripts/processElementData.js b/1.5/plugins/org.eclipse.epf.library/layout/scripts/processElementData.js
deleted file mode 100644
index 09ffb6a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/scripts/processElementData.js
+++ /dev/null
@@ -1,12 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-// dynamically generated process layout related data from RMC publishing service 
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity.xsl
deleted file mode 100644
index 15b66db..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity.xsl
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="mapping.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<script type="text/javascript" language="JavaScript">
-					var queryStr = location.search;
-					document.write("&lt;meta http-equiv=\"refresh\" content=\"0;url=<xsl:value-of select="@defaultTabUrl"/>" + queryStr + "\"&gt;");
-				</script>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type"> 
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-			</head>			
-		</html>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_desc.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_desc.xsl
deleted file mode 100644
index e57b50a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_desc.xsl
+++ /dev/null
@@ -1,481 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="activity_helper.xsl"/>	
-	<xsl:include href="property.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title>
-					<xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/>
-				</title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type">
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"/>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"/>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"/>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"/>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"/>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"/>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"/>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"/>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, defaultQueryStr, false, true, false);
-				</script>
-			</head>
-			<body>
-				<div id="breadcrumbs"/>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="activityTabs"/>
-							<xsl:call-template name="generalTextFieldSection">
-								<xsl:with-param name="fieldLabel" select="$scopeText"/>
-								<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='scope']"/>
-							</xsl:call-template>
-							<xsl:call-template name="generalTextFieldSection">
-								<xsl:with-param name="fieldLabel" select="$purposeText"/>
-								<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='purpose']"/>
-							</xsl:call-template>
-							<xsl:if test="$elementType = 'DeliveryProcess' ">
-								<xsl:call-template name="projectSpecificsSection">
-									<xsl:with-param name="contentDescription" select="$contentDescription"/>
-								</xsl:call-template>
-							</xsl:if>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="generalTextFieldSection">
-								<xsl:with-param name="fieldLabel" select="$descriptionText"/>
-								<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='mainDescription']"/>
-							</xsl:call-template>
-							<xsl:call-template name="propertiesSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="IllustrationsSection"/>
-							<xsl:call-template name="generalTextFieldSection">
-								<xsl:with-param name="fieldLabel" select="$staffingText"/>
-								<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='howtoStaff']"/>
-							</xsl:call-template>
-							<xsl:call-template name="usageSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="generalTextFieldSection">
-								<xsl:with-param name="fieldLabel" select="$keyConsiderationsText"/>
-								<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='keyConsiderations']"/>
-							</xsl:call-template>
-							<xsl:call-template name="generalTextFieldSection">
-								<xsl:with-param name="fieldLabel" select="$alternativesText"/>
-								<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='alternatives']"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script language="JavaScript" type="text/javascript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="activityTabs">
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<table width="100%" border="0" cellspacing="0" cellpadding="0">
-			<tr valign="middle">
-				<td width="10" class="activeTab">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="activeTab">
-					<xsl:value-of select="$descriptionText"/>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-a_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_WBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='WBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$wbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="1">
-					<img src="{$imagePath}tab_middle-i_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_TBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='TBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$tbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-i_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_WPBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='WPBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$wpbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_end-i.gif" width="21" height="17" alt="" title=""/>
-				</td>
-				<td width="50%">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="2" class="activeTab">
-					<img src="{$imagePath}shim.gif" height="2" alt="" title=""/>
-				</td>
-				<td class="activeTab">
-					<img src="{$imagePath}tab_space.gif" width="21" height="2" alt="" title=""/>
-				</td>
-				<td colspan="2">
-					<img src="{$imagePath}shim.gif" height="2" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="10" class="activeTab">
-					<img src="{$imagePath}shim.gif" height="5" alt="" title=""/>
-				</td>
-			</tr>
-		</table>
-	</xsl:template>
-
-	<xsl:template name="IllustrationsSection">
-		<xsl:if test="count(referenceList[@name='roadmaps']/Element) + count(referenceList[@name='examples']/Element) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$illustrationsText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$roadmapText"/>
-						<xsl:with-param name="refElement" select="referenceList[@name='roadmaps']/Element"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$examplesText"/>
-						<xsl:with-param name="refElement" select="referenceList[@name='examples']/Element"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="projectSpecificsSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:if test="$contentDescription/attribute[@name='typeOfContract'] != '' or $contentDescription/attribute[@name='projectCharacteristics'] != '' or $contentDescription/attribute[@name='projectMemberExpertise'] != '' or $contentDescription/attribute[@name='riskLevel'] != '' or $contentDescription/attribute[@name='scale'] != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$projectSpecificsText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$typeofContractText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='typeOfContract']"/>
-					</xsl:call-template>
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$projectCharacteristicsText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='projectCharacteristics']"/>
-					</xsl:call-template>
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$projectMemberExpertiseText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='projectMemberExpertise']"/>
-					</xsl:call-template>
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$estimatingTechniqueText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='estimatingTechnique']"/>
-					</xsl:call-template>
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$riskLevelText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='riskLevel']"/>
-					</xsl:call-template>
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$scaleText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='scale']"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="usageSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:if test="$contentDescription/attribute[@name='usageGuidance'] != '' or $contentDescription/attribute[@name='usageNotes'] != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$usageText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$usageGuidanceText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='usageGuidance']"/>
-					</xsl:call-template>
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$usageNotesText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='usageNotes']"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count(referenceList[@name='validContext']/Element) + count(reference[@name='superActivities']/Element) + count(referenceList[@name='includesPatterns']/Element) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$relationshipsText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$categoriesText"/>
-						<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<xsl:choose>
-						<xsl:when test="count(referenceList[@name='validContext']/Element) > 0">
-							<xsl:call-template name="addcontexts">
-								<xsl:with-param name="refName" select="$contextText"/>
-								<xsl:with-param name="refElement" select="referenceList[@name='validContext']/Element"/>
-							</xsl:call-template>
-						</xsl:when>
-						<xsl:otherwise>
-							<xsl:call-template name="addcontexts">
-								<xsl:with-param name="refName" select="$contextText"/>
-								<xsl:with-param name="refElement" select="reference[@name='defaultContext']/Element"/>
-							</xsl:call-template>
-						</xsl:otherwise>
-					</xsl:choose>
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$parentActivitiesText"/>
-						<xsl:with-param name="refElement" select="reference[@name='superActivities']/Element"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$includedPatternsText"/>
-						<xsl:with-param name="refElement" select="referenceList[@name='includesPatterns']/Element"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="propertiesSection">
-		<xsl:param name="contentDescription"/>
-		<div class="sectionHeading">
-			<xsl:value-of select="$propertiesText"/>
-		</div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0" >
-				<xsl:attribute name="title"><xsl:value-of select="$propertiesText"/></xsl:attribute>
-				<xsl:attribute name="summary"><xsl:value-of select="$propertiesText"/></xsl:attribute>
-				<xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$eventDrivenText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='isEventDriven']"/>
-				</xsl:call-template>
-				<xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$multipleOccurrencesText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='hasMultipleOccurrences']"/>
-				</xsl:call-template>
-				<xsl:if test="attribute[@name='isOngoing']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$ongoingText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOngoing']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isOptional']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$optionalText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOptional']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isPlanned']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$plannedText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isPlanned']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='PlanningData']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$planningDataText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='PlanningData']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="referenceList[@name='linkToPredecessor']/Element">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="fieldLabel" select="$predecessorText"/>
-						<xsl:with-param name="elements" select="referenceList[@name='linkToPredecessor']/Element"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isRepeatable']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$repeatableText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isRepeatable']"/>
-					</xsl:call-template>
-				</xsl:if>
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="generalTextFieldSection">
-		<xsl:param name="fieldLabel"/>
-		<xsl:param name="fieldText"/>
-		<xsl:if test="$fieldText != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$fieldLabel"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$fieldText"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:if test="count(referenceList[@name='concepts']/Element) + count(referenceList[@name='checklists']/Element) + count(referenceList[@name='communicationsMaterials']/Element) + count(referenceList[@name='guidelines']/Element) + count(referenceList[@name='supportingMaterials']/Element) + count(referenceList[@name='reusableAssets']/Element) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$moreInfoText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="referenceList[@name='checklists']/Element"/>
-					</xsl:call-template>
-					<xsl:if test="referenceList[@name='communicationsMaterials']">
-						<xsl:call-template name="addReferences">
-							<xsl:with-param name="refName" select="$communicationsMaterialsText"/>
-							<xsl:with-param name="refElement" select="referenceList[@name='communicationsMaterials']/Element"/>
-						</xsl:call-template>
-					</xsl:if>
-					<xsl:if test="referenceList[@name='educationMaterials']">
-						<xsl:call-template name="addReferences">
-							<xsl:with-param name="refName" select="$educationMaterialsText"/>
-							<xsl:with-param name="refElement" select="referenceList[@name='educationMaterials']/Element"/>
-						</xsl:call-template>
-					</xsl:if>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="referenceList[@name='guidelines']/Element"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="referenceList/Element[@Type='Concept']"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReusableAssets">
-						<xsl:with-param name="reusableAssets" select="referenceList[@name='reusableAssets']/Element"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$supportingMaterialsText"/>
-						<xsl:with-param name="refElement" select="referenceList[@name='supportingMaterials']/Element"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="referenceList/Element[@Type='Whitepaper']"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addcontexts">
-		<xsl:param name="refName"/>
-		<xsl:param name="refElement"/>
-		<xsl:if test="$refElement">
-			<xsl:if test="count($refElement)>0">
-				<tr valign="top">
-					<th class="sectionTableHeading" scope="row">
-						<xsl:value-of select="$refName"/>
-					</th>
-					<td class="sectionTableCell">
-						<ul>
-							<xsl:for-each select="$refElement">
-								<li>
-									<a>
-										<xsl:value-of select="@DisplayName"/>
-									</a>
-								</li>
-							</xsl:for-each>
-						</ul>
-					</td>
-				</tr>
-			</xsl:if>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_helper.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_helper.xsl
deleted file mode 100644
index 4956906..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_helper.xsl
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="mapping.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-
-	<xsl:template name="tabUrlAttribute">
-		<xsl:param name="url"/>
-		<xsl:attribute name="href"><xsl:value-of select="$url"/></xsl:attribute>
-	</xsl:template>
-
-	<xsl:template name="displayDiagram">
-		<xsl:param name="diagram"/>
-		<xsl:variable name="single-quote">'</xsl:variable>
-		<xsl:variable name="special-quote">`</xsl:variable>
-		<p/>
-		<img border="0" diagramType="{$diagram/@name}">
-			<xsl:attribute name="id">diagram_<xsl:value-of select="$diagram/@name"/></xsl:attribute>
-			<xsl:attribute name="src"><xsl:value-of select="$diagram/map/@src"/></xsl:attribute>
-			<xsl:attribute name="alt"><xsl:value-of select="translate($diagram/@alt,$single-quote,$special-quote)"/></xsl:attribute>
-			<xsl:attribute name="title"><xsl:value-of select="translate($diagram/@alt,$single-quote,$special-quote)"/></xsl:attribute>
-			<xsl:attribute name="usemap">#<xsl:value-of select="$diagram/map/@name"/></xsl:attribute>
-		</img>
-		<map name="{$diagram/map/@name}">
-			<xsl:for-each select="$diagram/map/area">
-				<area>
-					<xsl:attribute name="href"><xsl:value-of select="@href"/></xsl:attribute>
-					<xsl:attribute name="relPath">,<xsl:value-of select="@guid"/></xsl:attribute>
-					<xsl:attribute name="alt"><xsl:value-of select="@alt"/></xsl:attribute>
-					<xsl:attribute name="title"><xsl:value-of select="@alt"/></xsl:attribute>
-					<xsl:attribute name="coords"><xsl:value-of select="@coords"/></xsl:attribute>
-					<xsl:attribute name="shape"><xsl:value-of select="@shape"/></xsl:attribute>
-				</area>
-			</xsl:for-each>
-		</map>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_tbs.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_tbs.xsl
deleted file mode 100644
index 9b8c531..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_tbs.xsl
+++ /dev/null
@@ -1,322 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="activity_helper.xsl"/>
-	<xsl:include href="escape.xsl"/>	
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>
-		<xsl:variable name="showFullMethodContent" select="@ShowFullMethodContent"/>
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title>
-					<xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/>
-				</title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type">
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  defaultQueryStr, false, true, true);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-						<div autoWrap="true">
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-						</div>
-							<xsl:call-template name="activityTabs"/>
-							<xsl:call-template name="workflowSection"/>
-							<xsl:call-template name="tbsSection">
-								<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script language="JavaScript" type="text/javascript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="activityTabs">
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<table width="100%" border="0" cellspacing="0" cellpadding="0">
-			<tr valign="middle">
-				<td class="tab">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_Description">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='Description']/@url)"/>
-						</xsl:call-template>
-						<xsl:value-of select="$descriptionText"/>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-i_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_WBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='WBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$wbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="1">
-					<img src="{$imagePath}tab_middle-i_a.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="activeTab">
-					<span style="white-space:nowrap;">
-						<xsl:value-of select="$tbsText"/>
-					</span>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-a_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_WPBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='WPBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$wpbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_end-i.gif" width="21" height="17" alt="" title=""/>
-				</td>
-				<td width="50%">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="4">
-					<img src="{$imagePath}shim.gif" alt="" title="" height="2"/>
-				</td>
-				<td>
-					<img src="{$imagePath}tab_space_middle.gif" width="21" height="2" alt="" title=""/>
-				</td>
-				<td class="activeTab">
-					<img src="{$imagePath}shim.gif" width="10" height="2" alt="" title=""/>
-				</td>
-				<td>
-					<img src="{$imagePath}tab_space.gif" width="21" height="2" alt="" title=""/>
-				</td>
-				<td colspan="3">
-					<img src="{$imagePath}shim.gif" height="2" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="10" class="activeTab">
-					<img src="{$imagePath}shim.gif" height="5" alt="" title=""/>
-				</td>
-			</tr>
-		</table>
-	</xsl:template>
-
-	<xsl:template name="workflowSection">
-		<xsl:if test="count(breakdown[@name='Team Breakdown Structure']/Element[@Type='TeamProfile']) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$teamStructureText"/>
-			</div>
-			<div class="sectionContent">
-			<p align="left">
-			<div id="teamTree" ></div>
-			</p>
-				<script type="text/javascript" language="JavaScript">
-		var teamTree = [
-				<xsl:for-each select="breakdown[@name='Team Breakdown Structure']/Element[@Type='TeamProfile' and @hasSuperTeam = 'false' ]">
-						<xsl:call-template name="teamStructure">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-	];
-	contentPage.processPage.buildTeamTree(teamTree);
-					</script>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="teamStructure">
-		<xsl:param name="element"/>
-	["<xsl:value-of select="concat(/Element/@BackPath, $element/@Url)"/>", "<xsl:value-of select="$element/@DisplayName"/>", "<xsl:value-of select="$element/@relProcessPath"/>", "<xsl:value-of select="$element/@isSupressed"/>", 
-		<xsl:if test="count($element/Element[@Type='TeamProfile']) > 0">
-			<xsl:for-each select="$element/Element[@Type='TeamProfile']">
-				<xsl:call-template name="teamStructure">
-					<xsl:with-param name="element" select="."/>
-				</xsl:call-template>
-			</xsl:for-each>
-		</xsl:if>
-		],
-	</xsl:template>
-
-	<xsl:template name="tbsSection">
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="colSize" select="count(breakdown[@name='Team Breakdown Structure']/columns/column)"/>
-		<div class="sectionHeading">
-			<xsl:value-of select="$teamProfileBreakdownText"/>
-		</div>
-		<div class="sectionContent">
-		<div id="treeContent"></div>
-<script language="JavaScript">
-contentPage.processPage.treeTable.data = {
-title: "<xsl:value-of select="$teamProfileBreakdownText"/>", summary: "<xsl:value-of select="$teamProfileBreakdownText"/>", 
-columns: [<xsl:for-each select="breakdown[@name='Team Breakdown Structure']/columns/column">
-["<xsl:value-of select="@id"/>", "<xsl:value-of select="@label"/>"]<xsl:if test="position() != $colSize">,</xsl:if>
-					</xsl:for-each>],
-rows: [<xsl:for-each select="breakdown[@name='Team Breakdown Structure']/Element">
-						<xsl:call-template name="wbsItem">
-							<xsl:with-param name="element" select="."/>
-							<xsl:with-param name="indent" select="0"/>
-							<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-							<xsl:with-param name="parentNodeId" select=" '' "/>
-						</xsl:call-template>
-					</xsl:for-each>
-]};
-				</script>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="wbsItem">
-		<xsl:param name="element"/>
-		<xsl:param name="parentNodeId"/>
-		<xsl:param name="indent"/>
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="elementType" select="$element/@Type"/>	
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="hasChildren">
-			<xsl:choose>
-				<xsl:when test="count($element/Element) > 0">true</xsl:when>
-				<xsl:otherwise>false</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>
-		<xsl:variable name="typeName">
-			<xsl:choose>
-				<xsl:when test="$showFullMethodContent = 'true'">
-					<xsl:choose>										
-						<xsl:when test="$elementType = 'TaskDescriptor'">
-							<xsl:value-of select="$taskText"/>
-						</xsl:when>
-						<xsl:when test="$elementType = 'RoleDescriptor'">
-							<xsl:value-of select="$roleText"/>
-						</xsl:when>
-						<xsl:when test="$elementType = 'WorkProductDescriptor'">
-							<xsl:value-of select="$workProductText"/>
-						</xsl:when>
-						<xsl:otherwise>
-							<xsl:value-of select="$element/@TypeName"/>
-						</xsl:otherwise>
-					</xsl:choose>									
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:value-of select="$element/@TypeName"/>
-				</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>		
-		<xsl:variable name="escapedDisplayName">
-        	<xsl:call-template name="escape">
-				<xsl:with-param name="string" select="$element/@DisplayName"/>
-				<xsl:with-param name="search" select="'&quot;'"/>
-				<xsl:with-param name="replace" select="'&amp;quot;'"/>
-			</xsl:call-template>
-    	</xsl:variable>
-
-{id: "<xsl:value-of select="$element/@nodeId"/>", parentId: "<xsl:value-of select="$parentNodeId"/>", relPath: "<xsl:value-of select="$element/@relProcessPath"/>", isSuppressed: "<xsl:value-of select="$element/@isSupressed"/>", indentSize: <xsl:value-of select="$indent"/>, hasChildren:<xsl:value-of select="$hasChildren"/>, 
-	index: "<xsl:value-of select="$element/@Index"/>", prefix: "<xsl:value-of select="$element/attribute[@name='prefix']"/>", name: "<xsl:value-of select="$element/@Name"/>", title: "<xsl:value-of select="$element/@DisplayName"/>", url: "<xsl:value-of select="concat(/Element/@BackPath, $element/@Url)"/>", 
-	predecessors: "<xsl:value-of select="$element/@Predecessors"/>", info: "<xsl:value-of select="$element/@ModelInfo"/>", type: "<xsl:value-of select="$typeName"/>", 
-	repeatable: "<xsl:value-of select="$element/attribute[@name='isRepeatable']"/>", multiOccurences: "<xsl:value-of select="$element/attribute[@name='hasMultipleOccurrences']"/>", optional: "<xsl:value-of select="$element/attribute[@name='isOptional']"/>", planned: "<xsl:value-of select="$element/attribute[@name='isPlanned']"/>",  ongoing: "<xsl:value-of select="$element/attribute[@name='isOngoing']"/>", eventDriven: "<xsl:value-of select="$element/attribute[@name='isEventDriven']"/>", 
-	team: "<xsl:value-of select="$element/@Team"/>", entryState: "", exitState: "", deliverable: "", variabilityType: ""},
-	
-<!--
-contentPage.processPage.treeTable.wbsItemHtml.initRow("<xsl:value-of select="$element/@nodeId"/>", "<xsl:value-of select="$parentNodeId"/>", "<xsl:value-of select="$element/@relProcessPath"/>", "<xsl:value-of select="$element/@isSupressed"/>", <xsl:value-of select="$indent"/>, <xsl:value-of select="$hasChildren"/>, "<xsl:value-of select="$element/@Index"/>", "<xsl:value-of select="$element/attribute[@name='prefix']"/>", "<xsl:value-of select="$element/@Name"/>", "<xsl:value-of select="$escapedDisplayName"/>", "<xsl:value-of select="concat(/Element/@BackPath, $element/@Url)"/>", "", "<xsl:value-of select="$element/@Predecessors"/>", "<xsl:value-of select="$element/@ModelInfo"/>", "<xsl:value-of select="$typeName"/>", "<xsl:value-of select="$element/attribute[@name='isRepeatable']"/>", "<xsl:value-of select="$element/attribute[@name='hasMultipleOccurrences']"/>", "<xsl:value-of select="$element/attribute[@name='isOptional']"/>", "<xsl:value-of select="$element/attribute[@name='isPlanned']"/>",  "<xsl:value-of select="$element/attribute[@name='isOngoing']"/>", "<xsl:value-of select="$element/attribute[@name='isEventDriven']"/>", "<xsl:value-of select="$element/@Team"/>", "", "", "", "", "");
-contentPage.processPage.treeTable.wbsItemHtml.writeRow();	
--->
-		<xsl:if test="count($element/Element) > 0">
-			<xsl:for-each select="$element/Element">
-				<xsl:call-template name="wbsItem">
-					<xsl:with-param name="element" select="."/>
-					<xsl:with-param name="indent" select="$indent+1"/>
-					<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-					<xsl:with-param name="parentNodeId" select="$element/@nodeId"/>
-				</xsl:call-template>
-			</xsl:for-each>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_wbs.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_wbs.xsl
deleted file mode 100644
index 2f27589..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_wbs.xsl
+++ /dev/null
@@ -1,330 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="activity_helper.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>		
-		<xsl:variable name="showFullMethodContent" select="@ShowFullMethodContent"/>
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title>
-					<xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/>
-				</title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type">
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  defaultQueryStr, false, true, true);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-						<div autoWrap="true">
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-						</div>
-							<xsl:call-template name="activityTabs"/>
-							<xsl:call-template name="workflowSection"/>
-							<xsl:call-template name="wbsSection">
-								<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script language="JavaScript" type="text/javascript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="activityTabs">
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<table width="100%" border="0" cellspacing="0" cellpadding="0">
-			<tr valign="middle">
-				<td width="10" class="tab">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_Description">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='Description']/@url)"/>
-						</xsl:call-template>
-						<xsl:value-of select="$descriptionText"/>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-i_a.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="activeTab">
-					<span style="white-space:nowrap;">
-						<xsl:value-of select="$wbsText"/>
-					</span>
-				</td>
-				<td width="1">
-					<img src="{$imagePath}tab_middle-a_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_TBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='TBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$tbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-i_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_WPBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='WPBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$wpbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_end-i.gif" width="21" height="17" alt="" title=""/>
-				</td>
-				<td width="50%">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="2">
-					<img src="{$imagePath}shim.gif" height="2" alt="" title=""/>
-				</td>
-				<td>
-					<img src="{$imagePath}tab_space_middle.gif" width="21" height="2" alt="" title=""/>
-				</td>
-				<td class="activeTab">
-					<img src="{$imagePath}shim.gif" width="10" height="2" alt="" title=""/>
-				</td>
-				<td>
-					<img src="{$imagePath}tab_space.gif" width="21" height="2" alt="" title=""/>
-				</td>
-				<td colspan="5">
-					<img src="{$imagePath}shim.gif" height="2" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="10" class="activeTab">
-					<img src="{$imagePath}shim.gif" height="5" alt="" title=""/>
-				</td>
-			</tr>
-		</table>
-	</xsl:template>
-
-	<xsl:template name="workflowSection">
-		<xsl:if test="diagrams/diagram[@name='Activity'] or diagrams/diagram[@name='ActivityDetail'] or diagrams/userdiagram[@name='Activity'] or diagrams/userdiagram[@name='ActivityDetail']">
-			<div class="sectionHeading">
-				<xsl:value-of select="$workflowText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:choose>
-						<xsl:when test="diagrams/userdiagram[@name='Activity']">
-							<tr>
-								<td class="sectionTableSingleCell" colspan="2" align="left">
-									<xsl:value-of disable-output-escaping="yes" select="diagrams/userdiagram[@name='Activity']"/>
-								</td>
-							</tr>
-						</xsl:when>
-						<xsl:otherwise>
-							<xsl:if test="diagrams/diagram[@name='Activity']">
-								<tr>
-									<td class="sectionTableSingleCell" colspan="2" align="left">
-										<xsl:call-template name="displayDiagram">
-											<xsl:with-param name="diagram" select="diagrams/diagram[@name='Activity']"/>
-										</xsl:call-template>
-									</td>
-								</tr>
-							</xsl:if>
-						</xsl:otherwise>
-					</xsl:choose>
-					<xsl:choose>
-						<xsl:when test="diagrams/userdiagram[@name='ActivityDetail']">
-							<tr>
-								<td class="sectionTableSingleCell" colspan="2" align="left">
-									<xsl:value-of disable-output-escaping="yes" select="diagrams/userdiagram[@name='ActivityDetail']"/>
-								</td>
-							</tr>
-						</xsl:when>
-						<xsl:otherwise>
-							<xsl:if test="diagrams/diagram[@name='ActivityDetail']">
-								<tr>
-									<td class="sectionTableSingleCell" colspan="2" align="left">
-										<xsl:call-template name="displayDiagram">
-											<xsl:with-param name="diagram" select="diagrams/diagram[@name='ActivityDetail']"/>
-										</xsl:call-template>
-									</td>
-								</tr>
-							</xsl:if>
-						</xsl:otherwise>
-					</xsl:choose>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="wbsSection">
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="colSize" select="count(breakdown[@name='Work Breakdown Structure']/columns/column)"/>
-		<div class="sectionHeading">
-			<xsl:value-of select="$workBreakdownText"/>
-		</div>
-		<div class="sectionContent">
-		<div id="treeContent"></div>
-<script language="JavaScript">
-contentPage.processPage.treeTable.data = {
-title: "<xsl:value-of select="$workBreakdownText"/>", summary: "<xsl:value-of select="$workBreakdownText"/>", 
-columns: [<xsl:for-each select="breakdown[@name='Work Breakdown Structure']/columns/column">
-["<xsl:value-of select="@id"/>", "<xsl:value-of select="@label"/>"]<xsl:if test="position() != $colSize">,</xsl:if>
-					</xsl:for-each>],
-rows: [<xsl:for-each select="breakdown[@name='Work Breakdown Structure']/Element">
-						<xsl:call-template name="wbsItem">
-							<xsl:with-param name="element" select="."/>
-							<xsl:with-param name="indent" select="0"/>
-							<xsl:with-param name="parentNodeId" select=" '' "/>
-							<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-						</xsl:call-template>
-					</xsl:for-each>
-]};
-				</script>
-	
-		</div>
-	</xsl:template>
-
-	<!-- write the wbs tr html -->
-	<!-- init(id, parentId, relPath, isSupressed, indentSize, hasChildren, index, prefix, title, url, steps, predecessors, info, repeatable, multiOccurences, optional, planned, type) -->
-	<xsl:template name="wbsItem">
-		<xsl:param name="element"/>
-		<xsl:param name="parentNodeId"/>
-		<xsl:param name="indent"/>
-		<xsl:param name="showFullMethodContent"/>		
-		<xsl:variable name="elementType" select="$element/@Type"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="hasChildren">
-			<xsl:choose>
-				<xsl:when test="count($element/Element) > 0">true</xsl:when>
-				<xsl:otherwise>false</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>
-		<xsl:variable name="typeName">
-			<xsl:choose>
-				<xsl:when test="$showFullMethodContent = 'true'">
-					<xsl:choose>										
-						<xsl:when test="$elementType = 'TaskDescriptor'">
-							<xsl:value-of select="$taskText"/>
-						</xsl:when>
-						<xsl:when test="$elementType = 'RoleDescriptor'">
-							<xsl:value-of select="$roleText"/>
-						</xsl:when>
-						<xsl:when test="$elementType = 'WorkProductDescriptor'">
-							<xsl:value-of select="$workProductText"/>
-						</xsl:when>
-						<xsl:otherwise>
-							<xsl:value-of select="$element/@TypeName"/>
-						</xsl:otherwise>
-					</xsl:choose>									
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:value-of select="$element/@TypeName"/>
-				</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>
-{id: "<xsl:value-of select="$element/@nodeId"/>", parentId: "<xsl:value-of select="$parentNodeId"/>", relPath: "<xsl:value-of select="$element/@relProcessPath"/>", isSuppressed: "<xsl:value-of select="$element/@isSupressed"/>", indentSize: <xsl:value-of select="$indent"/>, hasChildren:<xsl:value-of select="$hasChildren"/>, 
-	index: "<xsl:value-of select="$element/@Index"/>", prefix: "<xsl:value-of select="$element/attribute[@name='prefix']"/>", name: "<xsl:value-of select="$element/@Name"/>", title: "<xsl:value-of select="$element/@DisplayName"/>", url: "<xsl:value-of select="concat(/Element/@BackPath, $element/@Url)"/>", 
-	predecessors: "<xsl:value-of select="$element/@Predecessors"/>", info: "<xsl:value-of select="$element/@ModelInfo"/>", type: "<xsl:value-of select="$typeName"/>", 
-	repeatable: "<xsl:value-of select="$element/attribute[@name='isRepeatable']"/>", multiOccurences: "<xsl:value-of select="$element/attribute[@name='hasMultipleOccurrences']"/>", optional: "<xsl:value-of select="$element/attribute[@name='isOptional']"/>", planned: "<xsl:value-of select="$element/attribute[@name='isPlanned']"/>",  ongoing: "<xsl:value-of select="$element/attribute[@name='isOngoing']"/>", eventDriven: "<xsl:value-of select="$element/attribute[@name='isEventDriven']"/>", 
-	team: "<xsl:value-of select="$element/@Team"/>", entryState: "", exitState: "", deliverable: "", variabilityType: "<xsl:value-of select="$element/attribute[@name='variabilityType']"/>",
-	steps: [<xsl:variable name="stepSize"><xsl:value-of select="count($element/Steps/Step)"/></xsl:variable>
-	<xsl:for-each select="$element/Steps/Step"><xsl:value-of select="@selected"/>
-	<xsl:if test="position() != $stepSize">,</xsl:if></xsl:for-each>]},
-<xsl:if test="count($element/Element) > 0">
-			<xsl:for-each select="$element/Element">
-				<xsl:call-template name="wbsItem">
-					<xsl:with-param name="element" select="."/>
-					<xsl:with-param name="indent" select="$indent+1"/>
-					<xsl:with-param name="parentNodeId" select="$element/@nodeId"/>
-					<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>					
-				</xsl:call-template>
-			</xsl:for-each>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_wpbs.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_wpbs.xsl
deleted file mode 100644
index c1f513b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/activity_wpbs.xsl
+++ /dev/null
@@ -1,318 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="activity_helper.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>
-		<xsl:variable name="showFullMethodContent" select="@ShowFullMethodContent"/>
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title>
-					<xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/>
-				</title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type">
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, defaultQueryStr, false, true, true);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-						<div autoWrap="true">
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							</div>
-							<xsl:call-template name="activityTabs"/>
-							<xsl:call-template name="workflowSection"/>
-							<xsl:call-template name="wpbsSection">
-								<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script language="JavaScript" type="text/javascript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="activityTabs">
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<table width="100%" border="0" cellspacing="0" cellpadding="0">
-			<tr valign="middle">
-				<td width="10" class="tab">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_Description">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='Description']/@url)"/>
-						</xsl:call-template>
-						<xsl:value-of select="$descriptionText"/>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-i_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_WBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='WBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$wbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="1">
-					<img src="{$imagePath}tab_middle-i_i.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="tab">
-					<a class="tab" id="TAB_TBS">
-						<xsl:call-template name="tabUrlAttribute">
-							<xsl:with-param name="url" select="concat(/Element/@BackPath, tabs/tab[@name='TBS']/@url)"/>
-						</xsl:call-template>
-						<span style="white-space:nowrap;">
-							<xsl:value-of select="$tbsText"/>
-						</span>
-					</a>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_middle-i_a.gif" width="21" height="17" align="absmiddle" alt="" title=""/>
-				</td>
-				<td nowrap="nowrap" class="activeTab">
-					<span style="white-space:nowrap;">
-						<xsl:value-of select="$wpbsText"/>
-					</span>
-				</td>
-				<td width="21">
-					<img src="{$imagePath}tab_end-a.gif" width="21" height="17" alt="" title=""/>
-				</td>
-				<td width="50%">
-					<img src="{$imagePath}shim.gif" width="10" height="17" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="6">
-					<img src="{$imagePath}shim.gif" height="2" alt="" title=""/>
-				</td>
-				<td>
-					<img src="{$imagePath}tab_space_middle.gif" width="21" height="2" alt="" title=""/>
-				</td>
-				<td class="activeTab">
-					<img src="{$imagePath}shim.gif" width="10" height="2" alt="" title=""/>
-				</td>
-				<td>
-					<img src="{$imagePath}tab_space.gif" width="21" height="2" alt="" title=""/>
-				</td>
-				<td colspan="1">
-					<img src="{$imagePath}shim.gif" height="2" alt="" title=""/>
-				</td>
-			</tr>
-			<tr>
-				<td colspan="10" class="activeTab">
-					<img src="{$imagePath}shim.gif" height="5" alt="" title=""/>
-				</td>
-			</tr>
-		</table>
-	</xsl:template>
-
-	<xsl:template name="workflowSection">
-		<xsl:if test="diagrams/diagram[@name='WPDependency'] or diagrams/userdiagram[@name='WPDependency'] ">
-			<div class="sectionHeading">
-				<xsl:value-of select="$workProductDependenciesText"/>
-			</div>
-			<div class="sectionContent">
-				<!--
-			<p align="center">
-				<xsl:value-of disable-output-escaping="yes" select="diagrams/diagram[@name='WPDependency']"/>
-			</p>
-
-				<xsl:call-template name="displayDiagram">
-					<xsl:with-param name="diagram" select="diagrams/diagram[@name='WPDependency']"/>
-				</xsl:call-template>
-							-->
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">			
-					<xsl:choose>
-						<xsl:when test="diagrams/userdiagram[@name='WPDependency']">
-							<tr>
-								<td class="sectionTableSingleCell" colspan="2" align="left">
-									<xsl:value-of disable-output-escaping="yes" select="diagrams/userdiagram[@name='WPDependency']"/>
-								</td>
-							</tr>
-						</xsl:when>
-						<xsl:otherwise>
-							<xsl:if test="diagrams/diagram[@name='WPDependency']">
-								<tr>
-									<td class="sectionTableSingleCell" colspan="2" align="left">
-										<xsl:call-template name="displayDiagram">
-											<xsl:with-param name="diagram" select="diagrams/diagram[@name='WPDependency']"/>
-										</xsl:call-template>
-									</td>
-								</tr>
-							</xsl:if>
-						</xsl:otherwise>
-					</xsl:choose>
-				</table>	
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="wpbsSection">
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="colSize" select="count(breakdown[@name='Work Product Breakdown Structure']/columns/column)"/>
-		<div class="sectionHeading">
-			<xsl:value-of select="$workProductBreakdownText"/>
-		</div>
-		<div class="sectionContent">
-		<div id="treeContent"></div>
-<script language="JavaScript">
-contentPage.processPage.treeTable.data = {
-title: "<xsl:value-of select="$workProductBreakdownText"/>", summary: "<xsl:value-of select="$workProductBreakdownText"/>", 
-columns: [<xsl:for-each select="breakdown[@name='Work Product Breakdown Structure']/columns/column">
-["<xsl:value-of select="@id"/>", "<xsl:value-of select="@label"/>"]<xsl:if test="position() != $colSize">,</xsl:if>
-					</xsl:for-each>],
-rows: [<xsl:for-each select="breakdown[@name='Work Product Breakdown Structure']/Element">
-						<xsl:sort data-type="text" select="@DisplayName" order="ascending"/>
-						<xsl:call-template name="wbsItem">
-							<xsl:with-param name="element" select="."/>
-							<xsl:with-param name="indent" select="0"/>
-							<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-							<xsl:with-param name="parentNodeId" select=" '' "/>
-						</xsl:call-template>
-					</xsl:for-each>
-]};
-				</script>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="wbsItem">
-		<xsl:param name="element"/>
-		<xsl:param name="parentNodeId"/>
-		<xsl:param name="indent"/>
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="elementType" select="$element/@Type"/>			
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="hasChildren">
-			<xsl:choose>
-				<xsl:when test="count($element/Element) > 0">true</xsl:when>
-				<xsl:otherwise>false</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>
-		<xsl:variable name="typeName">
-			<xsl:choose>
-				<xsl:when test="$showFullMethodContent = 'true'">
-					<xsl:choose>										
-						<xsl:when test="$elementType = 'TaskDescriptor'">
-							<xsl:value-of select="$taskText"/>
-						</xsl:when>
-						<xsl:when test="$elementType = 'RoleDescriptor'">
-							<xsl:value-of select="$roleText"/>
-						</xsl:when>
-						<xsl:when test="$elementType = 'WorkProductDescriptor'">
-							<xsl:value-of select="$workProductText"/>
-						</xsl:when>
-						<xsl:otherwise>
-							<xsl:value-of select="$element/@TypeName"/>
-						</xsl:otherwise>
-					</xsl:choose>									
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:value-of select="$element/@TypeName"/>
-				</xsl:otherwise>
-			</xsl:choose>
-		</xsl:variable>		
-{id: "<xsl:value-of select="$element/@nodeId"/>", parentId: "<xsl:value-of select="$parentNodeId"/>", relPath: "<xsl:value-of select="$element/@relProcessPath"/>", isSuppressed: "<xsl:value-of select="$element/@isSupressed"/>", indentSize: <xsl:value-of select="$indent"/>, hasChildren:<xsl:value-of select="$hasChildren"/>, 
-	index: "<xsl:value-of select="$element/@Index"/>", prefix: "<xsl:value-of select="$element/attribute[@name='prefix']"/>", name: "<xsl:value-of select="$element/@Name"/>", title: "<xsl:value-of select="$element/@DisplayName"/>", url: "<xsl:value-of select="concat(/Element/@BackPath, $element/@Url)"/>", 
-	predecessors: "<xsl:value-of select="$element/@Predecessors"/>", info: "<xsl:value-of select="$element/@ModelInfo"/>", type: "<xsl:value-of select="$typeName"/>", 
-	repeatable: "<xsl:value-of select="$element/attribute[@name='isRepeatable']"/>", multiOccurences: "<xsl:value-of select="$element/attribute[@name='hasMultipleOccurrences']"/>", optional: "<xsl:value-of select="$element/attribute[@name='isOptional']"/>", planned: "<xsl:value-of select="$element/attribute[@name='isPlanned']"/>",  ongoing: "<xsl:value-of select="$element/attribute[@name='isOngoing']"/>", eventDriven: "<xsl:value-of select="$element/attribute[@name='isEventDriven']"/>", 
-	team: "", entryState: "<xsl:value-of select="$element/@EntryState"/>", exitState: "<xsl:value-of select="$element/@ExitState"/>", deliverable: "<xsl:value-of select="$element/@Deliverable"/>", variabilityType: ""},
-<!--
-contentPage.processPage.treeTable.wbsItemHtml.initRow("<xsl:value-of select="$element/@nodeId"/>", "<xsl:value-of select="$parentNodeId"/>", "<xsl:value-of select="$element/@relProcessPath"/>", "<xsl:value-of select="$element/@isSupressed"/>", <xsl:value-of select="$indent"/>, <xsl:value-of select="$hasChildren"/>, "<xsl:value-of select="$element/@Index"/>", "<xsl:value-of select="$element/attribute[@name='prefix']"/>", "<xsl:value-of select="$element/@Name"/>", "<xsl:value-of select="$element/@DisplayName"/>", "<xsl:value-of select="concat(/Element/@BackPath, $element/@Url)"/>", "", "<xsl:value-of select="$element/@Predecessors"/>", "<xsl:value-of select="$element/@ModelInfo"/>", "<xsl:value-of select="$typeName"/>", "<xsl:value-of select="$element/attribute[@name='isRepeatable']"/>", "<xsl:value-of select="$element/attribute[@name='hasMultipleOccurrences']"/>", "<xsl:value-of select="$element/attribute[@name='isOptional']"/>", "<xsl:value-of select="$element/attribute[@name='isPlanned']"/>",  "<xsl:value-of select="$element/attribute[@name='isOngoing']"/>", "<xsl:value-of select="$element/attribute[@name='isEventDriven']"/>", "", "<xsl:value-of select="$element/@EntryState"/>", "<xsl:value-of select="$element/@ExitState"/>", "<xsl:value-of select="$element/@Deliverable"/>", "", "");
-contentPage.processPage.treeTable.wbsItemHtml.writeRow();	
--->
-		<xsl:if test="count($element/Element) > 0">
-			<xsl:for-each select="$element/Element">
-				<xsl:call-template name="wbsItem">
-					<xsl:with-param name="element" select="."/>
-					<xsl:with-param name="indent" select="$indent+1"/>
-					<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-					<xsl:with-param name="parentNodeId" select="$element/@nodeId"/>
-				</xsl:call-template>
-			</xsl:for-each>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/artifact.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/artifact.xsl
deleted file mode 100644
index 9c1ca10..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/artifact.xsl
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="workproduct.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>		
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="artifactDescription" select="$presentation/Element[@Type='ArtifactDescription']"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="purposeSection">
-								<xsl:with-param name="description" select="$artifactDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="descriptionSection">
-								<xsl:with-param name="description" select="$artifactDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="workProductIllustrationsSection"/>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$artifactDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="tailoringSection">
-								<xsl:with-param name="description" select="$artifactDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-	
-	<xsl:template name="descriptionSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="briefOutline" select="$description/attribute[@name='briefOutline']"/>
-		<xsl:variable name="mainDescription" select="$description/attribute[@name='mainDescription']"/>
-		<xsl:variable name="representation" select="$description/attribute[@name='representation']"/>
-		<xsl:variable name="notation" select="$description/attribute[@name='notation']"/>
-		<xsl:if test="$briefOutline != '' or $mainDescription != '' or $representation != '' or $notation != ''">
-			<div class="sectionHeading"><xsl:value-of select="$descriptionText"/></div>
-			<div class="sectionContent">			
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">					
-					<xsl:if test="$mainDescription != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$mainDescriptionText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$mainDescription"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$briefOutline != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$briefOutlineText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$briefOutline"/>
-							</td>
-						</tr>
-					</xsl:if>					
-					<xsl:if test="$notation != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$notationText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$notation"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$representation != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$representationText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$representation"/>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>	
-	
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/artifact_descriptor.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/artifact_descriptor.xsl
deleted file mode 100644
index 003392e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/artifact_descriptor.xsl
+++ /dev/null
@@ -1,458 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="descriptor.xsl"/>
-	<xsl:include href="purpose.xsl"/>
-	<xsl:include href="tailoring.xsl"/>
-	<xsl:include href="workproduct_helper.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>		
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>				
-		<xsl:variable name="contentDescription" select="$presentation/Element[@Type='WorkProductDescriptor']"/>
-		<xsl:variable name="workProductDescriptor" select="$presentation/Element[@Type='WorkProductDescriptor']"/>
-		<xsl:variable name="descriptorDescription" select="$presentation/Element[@Type='DescriptorDescription']"/>		
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='RoleDescriptor']"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>
-
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, defaultQueryStr, false, true, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="purposeSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="descriptorRelationshipsSection"/>
-							<xsl:call-template name="deliverableSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-
-							<xsl:choose>
-								<xsl:when test="$descriptorDescription/attribute[@name='briefOutline'] !='' ">
-									<xsl:call-template name="descriptionSection">
-										<xsl:with-param name="description" select="$descriptorDescription"/>
-									</xsl:call-template>	
-								</xsl:when>
-								<xsl:otherwise>
-									<xsl:call-template name="refinedDescriptionSection">
-										<xsl:with-param name="description" select="$descriptorDescription"/>
-									</xsl:call-template>	
-								</xsl:otherwise>
-							</xsl:choose>
-							<xsl:call-template name="propertiesSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="usageSection">
-								<xsl:with-param name="contentDescription" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="workProductIllustrationsSection"/>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="tailoringSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-				<script language="JavaScript" type="text/javascript">
-					contentPage.onload();
-					contentPage.processPage.fixDescriptorLinks();
-				</script>
-		</html>
-	</xsl:template>	
-
-	<xsl:template name="descriptionSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="briefOutline" select="$description/attribute[@name='briefOutline']"/>
-		<xsl:variable name="mainDescription" select="$description/attribute[@name='refinedDescription']"/>
-		<xsl:if test="$briefOutline != '' or $mainDescription != ''">
-			<div class="sectionHeading"><xsl:value-of select="$descriptionText"/></div>
-			<div class="sectionContent">			
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$briefOutline != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$briefOutlineText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$briefOutline"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$mainDescription != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$mainDescriptionText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$mainDescription"/>
-							</td>
-						</tr>
-					</xsl:if>					
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>	
-
-	<xsl:template name="propertiesSection">
-		<xsl:param name="contentDescription"/>
-		<div class="sectionHeading"><xsl:value-of select="$propertiesText"/></div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-			    <xsl:if test="attribute[@name='activityEntryState']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$activityEntryStateText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='activityEntryState']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='activityExitState']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$activityExitStateText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='activityExitState']"/>
-					</xsl:call-template>
-				</xsl:if>			
-				<xsl:if test="attribute[@name='isOptional']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$optionalText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOptional']"/>
-					</xsl:call-template>
-				</xsl:if>				
-				<xsl:if test="attribute[@name='isPlanned']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$plannedText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isPlanned']"/>
-					</xsl:call-template>
-				</xsl:if>		
-				<xsl:if test="attribute[@name='PlanningData']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$planningDataText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='PlanningData']"/>
-					</xsl:call-template>
-				</xsl:if>
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="usageSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:variable name="usageGuidance" select="$contentDescription/attribute[@name='usageGuidance']"/>
-		<xsl:if test="$usageGuidance != ''">
-			<div class="sectionHeading"><xsl:value-of select="$usageGuidanceText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableCell">
-							<xsl:value-of disable-output-escaping="yes" select="$usageGuidance"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="descriptorRelationshipsSection">
-		<xsl:variable name="workProduct" select="reference[@name='WorkProduct']/Element[@Type='Artifact']"/>
-		<xsl:variable name="deliverableParts" select="referenceList[@name='deliverableParts']/Element"/>
-		<xsl:variable name="impacts" select="referenceList[@name='impacts']/Element[@Type='WorkProductDescriptor']"/>
-		<xsl:variable name="impactedBy" select="referenceList[@name='impactedBy']/Element[@Type='WorkProductDescriptor']"/>
-		<xsl:variable name="mandatoryInputTo" select="referenceList[@name='WorkProductDescriptor_MandatoryInputTo_TaskDescriptors']/Element[@Type='TaskDescriptor']"/>
-		<xsl:variable name="optionalInputTo" select="referenceList[@name='WorkProductDescriptor_OptionalInputTo_TaskDescriptors']/Element[@Type='TaskDescriptor']"/>
-		<xsl:variable name="externalInputTo" select="referenceList[@name='WorkProductDescriptor_ExternalInputTo_TaskDescriptors']/Element[@Type='TaskDescriptor']"/>
-		<xsl:variable name="outputFrom" select="referenceList[@name='WorkProductDescriptor_OutputFrom_TaskDescriptors']/Element[@Type='TaskDescriptor']"/>
-		<xsl:variable name="superActivities" select="referenceList[@name='superActivities']/Element[@Type='Activity']"/>
-		<xsl:variable name="responsibleRole" select="referenceList[@name='WorkProductDescriptor_ResponsibleRoleDescriptors']/Element[@Type='RoleDescriptor']"/>
-		<xsl:variable name="workedOnBy" select="referenceList[@name='workedOnBy']/Element"/>
-
-		<xsl:if test="count($responsibleRole) + count($workedOnBy) + count($mandatoryInputTo) + count($optionalInputTo) + count($externalInputTo) + count($outputFrom) + count($impacts) + count($impactedBy)> 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="count($impacts) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$dependentText"/></th>
-							<td class="sectionTableCell" colspan="3">
-							<ul>
-								<xsl:for-each select="$impacts">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>				
-					<xsl:if test="count($impactedBy) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$impactingText"/></th>
-							<td class="sectionTableCell" colspan="3">
-							<ul>
-								<xsl:for-each select="$impactedBy">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($responsibleRole) + count($workedOnBy) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$rolesText"/></th>
-							<td class="sectionTableCell" width="30%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$responsibleText"/>:
-								</span>
-								<xsl:if test="count($responsibleRole) > 0">
-									<ul>
-									<xsl:for-each select="$responsibleRole">
-									<xsl:sort select="@DisplayName"/>
-										<li>
-											<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-										</li>
-									</xsl:for-each>
-									</ul>
-								</xsl:if>									
-							</td>
-							<td class="sectionTableCell" colspan="2">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$modifiedByText"/>:
-								</span>
-								<xsl:if test="count($workedOnBy) > 0">								
-									<ul>
-										<xsl:for-each select="$workedOnBy">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>
-									</ul>
-								</xsl:if>										
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($mandatoryInputTo) + count($optionalInputTo) + count($externalInputTo) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$inputToText"/></th>
-							<td class="sectionTableCell" width="30%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$mandatoryText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($mandatoryInputTo) > 0">
-										<ul>
-										<xsl:for-each select="$mandatoryInputTo">		
-										<xsl:sort select="@DisplayName"/>								
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-										</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>									
-									</ul>
-									</xsl:otherwise>
-								</xsl:choose>
-							</td>
-							<td class="sectionTableCell" width="30%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$optionalText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($optionalInputTo) > 0">
-									<ul>
-										<xsl:for-each select="$optionalInputTo">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-									</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>
-									</ul>									
-									</xsl:otherwise>									
-								</xsl:choose>
-							</td>
-							<td class="sectionTableCell">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$externalText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($externalInputTo) > 0">
-									<ul>
-										<xsl:for-each select="$externalInputTo">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-									</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>
-									</ul>									
-									</xsl:otherwise>									
-								</xsl:choose>
-							</td>					
-						</tr>
-					</xsl:if>					
-					<xsl:if test="count($outputFrom) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$outputFromText"/></th>							
-							<td class="sectionTableCell" colspan="3">
-							<xsl:if test="count($outputFrom) > 0">									
-								<ul>
-									<xsl:for-each select="$outputFrom">
-									<xsl:sort select="@DisplayName"/>
-										<li>
-											<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-										</li>
-									</xsl:for-each>
-								</ul>
-							</xsl:if>
-							</td>							
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="deliverableSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="externalDescription" select="$description/attribute[@name='externalDescription']"/>
-		<xsl:variable name="deliveredWorkProducts" select="referenceList[@name='deliverableParts']/Element"/>
-		<xsl:variable name="packagingGuidance" select="$description/attribute[@name='packagingGuidance']"/>
-		
-		<xsl:if test="$externalDescription != '' or count($deliveredWorkProducts) > 0 or $packagingGuidance != ''">
-			<div class="sectionHeading"><xsl:value-of select="$deliverablePropertiesText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$externalDescription != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$externalDescriptionText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$externalDescription"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($deliveredWorkProducts) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$deliveredPartsText"/></th>
-							<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$deliveredWorkProducts">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$packagingGuidance != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$packagingInstructionsText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$packagingGuidance"/>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-	
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/checklist.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/checklist.xsl
deleted file mode 100644
index bc1f586..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/checklist.xsl
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="guidance.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>		
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-
-    	<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', true, false, false);
-					
-					//override the subsection text
-					contentPage.subSection.expandAllText = '<xsl:value-of select="$expandAllText"/>';
-					contentPage.subSection.collapseAllText = '<xsl:value-of select="$collapseAllText"/>';					
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="checkItemsSection">
-								<xsl:with-param name="description" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection">
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="checkItemsSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="sections" select="$description/referenceList[@name='sections']/Element[@Type='Section']"/>
-		<xsl:if test="count($sections) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$checkItemsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr>
-						<td class="sectionTableCell">
-							<xsl:for-each select="$sections">
-								<div class="stepHeading"><xsl:value-of select="attribute[@name='name']"/></div>
-								<div class="stepContent">
-									<table class="stepTable" border="0" cellspacing="0" cellpadding="0">
-										<tr valign="top">
-											<td>
-												<xsl:value-of disable-output-escaping="yes" select="attribute[@name='sectionDescription']"/>
-											</td>
-										</tr>
-									</table>
-								</div>						
-							</xsl:for-each>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/common.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/common.xsl
deleted file mode 100644
index 74366e4..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/common.xsl
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="umaMetaTags">
-		<xsl:param name="elementType"/>
-		<xsl:param name="elementName"/>
-		<xsl:param name="elementPresentationName"/>
-		<meta name="uma.type" content="{$elementType}"/>
-		<meta name="uma.name" content="{$elementName}"/>
-		<meta name="uma.presentationName" content="{$elementPresentationName}"/>
-		<xsl:if test="$elementType = 'Role'">
-			<xsl:call-template name="roleMetaInfo"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'Task'">
-			<xsl:call-template name="taskMetaInfo"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'Artifact' or $elementType = 'Deliverable' or $elementType = 'Outcome'">
-			<xsl:call-template name="workProductMetaInfo"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'ToolMentor'">
-			<xsl:call-template name="toolMentorMetaInfo"/>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="workProductMetaInfo">
-		<xsl:variable name="domains" select="referenceList[@name='domains']/Element"/>
-		<xsl:variable name="workProductTypes" select="referenceList[@name='workProductTypes']/Element[@Type='WorkProductType']"/>
-		<xsl:if test="count($domains) > 0">
-			<xsl:for-each select="$domains">
-				<meta name="uma.category" content="@Type:@Name:@DisplayName"/>
-			</xsl:for-each>
-		</xsl:if>
-		<xsl:if test="count($workProductTypes) > 0">
-			<xsl:for-each select="$workProductTypes">
-				<meta name="uma.category" content="{$workProductTypes/@Type}:{$workProductTypes/@Name}:{$workProductTypes/@DisplayName}"/>
-			</xsl:for-each>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="taskMetaInfo">
-		<xsl:variable name="disciplines" select="referenceList[@name='disciplines']/Element[@Type='Discipline']"/>
-		<xsl:if test="count($disciplines) > 0">
-			<xsl:for-each select="$disciplines">
-				<meta name="uma.category" content="{$disciplines/@Type}:{$disciplines/@Name}:{$disciplines/@DisplayName}"/>
-			</xsl:for-each>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="roleMetaInfo">
-		<xsl:variable name="roleSets" select="referenceList[@name='roleSets']/Element[@Type='RoleSet']"/>
-		<xsl:if test="$roleSets/@Name != ''">
-			<meta name="uma.category" content="{$roleSets/@Type}:{$roleSets/@Name}:{$roleSets/@DisplayName}"/>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="toolMentorMetaInfo">
-		<xsl:variable name="tool" select="reference[@name='tool']/Element"/>
-		<xsl:if test="$tool/@Name != ''">
-			<meta name="uma.category" content="{$tool/@Type}:{$tool/@Name}:{$tool/@DisplayName}"/>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addReferences">
-		<xsl:param name="refName"/>
-		<xsl:param name="refElement"/>
-		<xsl:if test="$refElement">
-			<xsl:if test="count($refElement)>0">
-				<tr valign="top">
-					<th class="sectionTableHeading" scope="row">
-						<xsl:value-of select="$refName"/>
-					</th>
-					<td class="sectionTableCell">
-						<ul>
-							<xsl:for-each select="$refElement">
-								<li>
-									<xsl:call-template name="addElementWithLink">
-										<xsl:with-param name="element" select="."/>
-									</xsl:call-template>
-								</li>
-							</xsl:for-each>
-						</ul>
-					</td>
-				</tr>
-			</xsl:if>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addElementWithLink">
-		<xsl:param name="element"/>
-		<xsl:choose>
-			<xsl:when test="$element/@Url != '' ">
-				<a>
-					<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="$element/@Url"/></xsl:attribute>
-					<xsl:value-of disable-output-escaping="yes" select="$element/@DisplayName"/>
-				</a>
-			</xsl:when>
-			<xsl:otherwise>
-				<xsl:value-of disable-output-escaping="yes" select="$element/@DisplayName"/>
-			</xsl:otherwise>
-		</xsl:choose>
-	</xsl:template>	
-
-	<xsl:template name="copyright">
-		<xsl:param name="copyright"/>
-		<table class="copyright" border="0" cellspacing="0" cellpadding="0">
-			<tr>
-				<td class="copyright">
-					<xsl:value-of disable-output-escaping="yes" select="$copyright"/>
-				</td>
-			</tr>
-		</table>
-	</xsl:template>
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/compositerole.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/compositerole.xsl
deleted file mode 100644
index b0a0a7f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/compositerole.xsl
+++ /dev/null
@@ -1,196 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="property.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element[@Type='DescriptorDescription']"/>
-		<xsl:variable name="descriptorDescription" select="$presentation/Element[@Type='DescriptorDescription']"/>		
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-
-		<html>	
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, '', false, true, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">	
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>							
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="propertiesSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="usageSection">
-								<xsl:with-param name="contentDescription" select="$descriptorDescription"/>
-							</xsl:call-template>							
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>							
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-				<script language="JavaScript" type="text/javascript">
-					contentPage.onload();
-				</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="propertiesSection">
-		<xsl:param name="contentDescription"/>
-		<div class="sectionHeading"><xsl:value-of select="$propertiesText"/></div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-			    <xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$multipleOccurrencesText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='hasMultipleOccurrences']"/>
-				</xsl:call-template>
-				<xsl:if test="attribute[@name='isOptional']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$optionalText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOptional']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isPlanned']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$plannedText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isPlanned']"/>
-					</xsl:call-template>
-				</xsl:if>
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="aggregatedRoles" select="referenceList[@name='aggregatedRoles']/Element"/>		
-		<xsl:variable name="responsibleFor" select="referenceList[@name='responsibleFor']/Element"/>			
-		<xsl:if test="count($aggregatedRoles) + count($responsibleFor) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="count($aggregatedRoles) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$aggregatesText"/></th>
-							<td class="sectionTableCell" colspan="3">
-							<ul>
-								<xsl:for-each select="$aggregatedRoles">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($responsibleFor) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$responsibleForText"/></th>
-							<td class="sectionTableCell" colspan="3">
-							<ul>
-								<xsl:for-each select="$responsibleFor">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="usageSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:if test="$contentDescription/attribute[@name='usageGuidance'] != ''">
-			<div class="sectionHeading"><xsl:value-of select="$usageText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="'Usage Guidance'"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='usageGuidance']"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/contentcategory.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/contentcategory.xsl
deleted file mode 100644
index 661a49c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/contentcategory.xsl
+++ /dev/null
@@ -1,509 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="mapping.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="illustration.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-	
-	<xsl:template match="/Element">
-		<xsl:variable name="Name" select="@Name"/>
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>	
-		<xsl:variable name="presentationName_temp" select="reference[@name='presentation']/Element/attribute[@name='presentationName']" />
-    	<xsl:variable name="presentationName">
-			<xsl:choose>
-				<xsl:when test="$presentationName_temp != '' "><xsl:value-of select="$presentationName_temp"/></xsl:when>
-				<xsl:otherwise><xsl:value-of select="$Name"/></xsl:otherwise>				
-			</xsl:choose>
-    	</xsl:variable>
-	    <xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="description" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-	    <xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="briefDescription" select="attribute[@name='briefDescription']"/>	    
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<xsl:choose>
-					<xsl:when test="$elementType = 'CustomCategory'">				
-						<title><xsl:value-of select="$elementTypeName"/></title>
-					</xsl:when>				
-					<xsl:otherwise>
-						<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-					</xsl:otherwise>
-				</xsl:choose>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type"> 
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection">
-								<xsl:with-param name="elementType" select="$elementType"/>
-							</xsl:call-template>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$description"/>
-							</xsl:call-template>
-							<xsl:if test="$elementType != 'CustomCategory'">
-								<xsl:call-template name="illustrationsSection"/>
-							</xsl:if>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$description"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="briefDescription" select="$briefDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-    </xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<xsl:param name="elementType"/>
-		<xsl:param name="briefDescription"/>
-		<xsl:variable name="checklists" select="referenceList/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList/Element[@Type='Concept']"/>
-		<xsl:variable name="guidelines" select="referenceList/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList/Element[@Type='SupportingMaterial']"/>
-		<xsl:variable name="whitePapers" select="referenceList/Element[@Type='Whitepaper']"/>
-		<xsl:variable name="conceptsAndPapers" select="referenceList/Element[@Type='conceptsAndPapers']"/>
-
-		<xsl:choose>
-			<xsl:when test="$elementType = 'CustomCategory'">
-			</xsl:when>
-			<xsl:otherwise>
-				<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($whitePapers) > 0">
-					<div class="sectionHeading"><xsl:value-of select="$moreInfoText"/></div>
-					<div class="sectionContent">
-						<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-							<xsl:call-template name="addChecklists">
-								<xsl:with-param name="checklists" select="$checklists"/>
-							</xsl:call-template>
-							<xsl:call-template name="addConcepts">
-								<xsl:with-param name="concepts" select="$concepts"/>
-							</xsl:call-template>
-							<xsl:call-template name="addGuidelines">
-								<xsl:with-param name="guidelines" select="$guidelines"/>
-							</xsl:call-template>
-							<xsl:call-template name="addSupportingMaterials">
-								<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-							</xsl:call-template>
-							<xsl:call-template name="addWhitePapers">
-								<xsl:with-param name="whitePapers" select="$whitePapers"/>
-							</xsl:call-template>
-						</table>
-					</div>
-				</xsl:if>
-			</xsl:otherwise>
-		</xsl:choose>
-	</xsl:template>
-
-    <xsl:template name="relationshipsSection">
-		<xsl:param name="elementType"/>
-		<xsl:if test="$elementType = 'Discipline'">
-			<xsl:call-template name="showDisciple"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'DisciplineGrouping'">
-			<xsl:call-template name="showDiscipleGrouping"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'Domain'">
-			<xsl:call-template name="showDomain"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'WorkProductType'">
-			<xsl:call-template name="showWorkProductType"/>
-		</xsl:if>		
-		<xsl:if test="$elementType = 'RoleSetGrouping'">
-			<xsl:call-template name="showRoleSetGrouping"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'RoleSet'">
-			<xsl:call-template name="showRoleSet"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'Tool'">
-			<xsl:call-template name="showTool"/>
-		</xsl:if>
-		<xsl:if test="$elementType = 'CustomCategory'">
-			<xsl:call-template name="showCustomCategory"/>
-		</xsl:if>		
-    </xsl:template>
-
-    <xsl:template name="showDisciple">
-		<xsl:variable name="referenceWorkflows" select="referenceList[@name='referenceWorkflows']/Element"/>
-		<xsl:variable name="tasks" select="referenceList[@name='tasks']/Element"/>
-		<xsl:variable name="subdisciplines" select="referenceList[@name='subdiscipline']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($referenceWorkflows) + count($tasks) + count($subdisciplines)> 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$categoriesText"/>
-						<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<xsl:if test="count($referenceWorkflows) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$referenceWorkflowsText"/></th>
-							<td class="sectionTableCell">
-								<ul>
-									<xsl:for-each select="$referenceWorkflows">
-									<xsl:sort data-type="text" select="@DisplayName" order="ascending" />
-										<li>
-											<a>
-												<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-												<xsl:value-of select="@DisplayName"/>
-											</a>
-										</li>
-									</xsl:for-each>
-								</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($tasks) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$tasksText"/></th>
-							<td class="sectionTableCell">
-								<ul>
-									<xsl:for-each select="$tasks">
-										<li>
-											<a>
-												<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-												<xsl:value-of select="@DisplayName"/>
-											</a>
-										</li>
-									</xsl:for-each>
-								</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($subdisciplines) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$subdisciplinesText"/></th>
-							<td class="sectionTableCell">
-								<ul>
-									<xsl:for-each select="$subdisciplines">
-										<xsl:sort data-type="text" select="@DisplayName" order="ascending" />
-										<li>
-											<a>
-												<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-												<xsl:value-of select="@DisplayName"/>
-											</a>
-										</li>
-									</xsl:for-each>
-								</ul>
-							</td>
-						</tr>
-					</xsl:if>										
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-    <xsl:template name="showDiscipleGrouping">
-		<xsl:variable name="disciplines" select="referenceList[@name='disciplines']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($disciplines) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$categoriesText"/>
-						<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<tr valign="top">
-						<th class="sectionTableHeading" scope="row"><xsl:value-of select="$disciplinesText"/></th>
-						<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$disciplines">
-								<xsl:sort data-type="text" select="@DisplayName" order="ascending" />
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-    <xsl:template name="showDomain">
-		<xsl:variable name="subdomains" select="referenceList[@name='subdomains']/Element"/>
-		<xsl:variable name="workProducts" select="referenceList[@name='workProducts']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>						
-		<xsl:if test="count($subdomains) + count($workProducts) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$categoriesText"/>
-						<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<xsl:if test="count($subdomains) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$subdomainsText"/></th>
-							<td class="sectionTableCell">
-								<ul>
-									<xsl:for-each select="$subdomains">
-										<xsl:sort data-type="text" select="@DisplayName" order="ascending" />
-										<li>
-											<a>
-												<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-												<xsl:value-of select="@DisplayName"/>
-											</a>
-										</li>
-									</xsl:for-each>
-								</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($workProducts) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$workProductsText"/></th>
-							<td class="sectionTableCell">
-								<ul>
-									<xsl:for-each select="$workProducts">
-										<li>
-											<a>
-												<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-												<xsl:value-of select="@DisplayName"/>
-											</a>
-										</li>
-									</xsl:for-each>
-								</ul>
-							</td>
-						</tr>
-					</xsl:if>														
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-    <xsl:template name="showWorkProductType">
-		<xsl:variable name="workProducts" select="referenceList[@name='workProducts']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($workProducts) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-							<xsl:with-param name="refName" select="$categoriesText"/>
-							<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<tr valign="top">
-						<th class="sectionTableHeading" scope="row"><xsl:value-of select="$workProductsText"/></th>
-						<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$workProducts">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-    <xsl:template name="showRoleSetGrouping">
-		<xsl:variable name="roleSets" select="referenceList[@name='roleSets']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($roleSets) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-							<xsl:with-param name="refName" select="$categoriesText"/>
-							<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<tr valign="top">
-						<th class="sectionTableHeading" scope="row"><xsl:value-of select="$roleSetsText"/></th>
-						<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$roleSets">
-								<xsl:sort data-type="text" select="@DisplayName" order="ascending" />
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-    <xsl:template name="showRoleSet">
-		<xsl:variable name="roles" select="referenceList[@name='roles']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($roles) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-							<xsl:with-param name="refName" select="$categoriesText"/>
-							<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<tr valign="top">
-						<th class="sectionTableHeading" scope="row"><xsl:value-of select="$rolesText"/></th>
-						<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$roles">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-    <xsl:template name="showTool">
-		<xsl:variable name="toolMentors" select="referenceList[@name='toolMentors']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($toolMentors) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-							<xsl:with-param name="refName" select="$categoriesText"/>
-							<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<tr valign="top">
-						<th class="sectionTableHeading" scope="row"><xsl:value-of select="$toolMentorsText"/></th>
-						<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$toolMentors">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-    <xsl:template name="showCustomCategory">
-  		<xsl:variable name="categorizedElements" select="referenceList[@name='categorizedElements']/Element"/>
-        <xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-        <xsl:if test="count($categorizedElements) > 0">
-        	<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-            <div class="sectionContent">
-            	<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">                                 
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$categoriesText"/>
-						<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-               		<tr valign="top">
-                   		<th class="sectionTableHeading" scope="row"><xsl:value-of select="$contentsText"/></th>
-                   		<td class="sectionTableCell">
-                       		<ul>
-                           		<xsl:for-each select="$categorizedElements">
-                               		<li>
-                                   		<a>
-                                       		<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-                                          	<xsl:value-of select="@DisplayName"/>
-                                       	</a>
-                                  	</li>                                                                           
-                               	</xsl:for-each>
-                           	</ul>
-                     	</td>
-                   	</tr>
-            	</table>
-         	</div>
-    	</xsl:if>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/deliverable.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/deliverable.xsl
deleted file mode 100644
index c503fa7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/deliverable.xsl
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="workproduct.xsl"/>
-	<xsl:include href="mapping.xsl"/>
-	<xsl:include href="main_description.xsl"/>	
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="deliverableDescription" select="$presentation/Element[@Type='DeliverableDescription']"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type"> 
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<!-- <meta name="element_type" content="{$elementType}"/> -->
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="purposeSection">
-								<xsl:with-param name="description" select="$deliverableDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$deliverableDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="workProductIllustrationsSection"/>
-							<xsl:call-template name="deliverableSection">
-								<xsl:with-param name="description" select="$deliverableDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$deliverableDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="tailoringSection">
-								<xsl:with-param name="description" select="$deliverableDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="deliverableSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="externalDescription" select="$description/attribute[@name='externalDescription']"/>
-		<xsl:variable name="deliveredWorkProducts" select="referenceList[@name='deliveredWorkProducts']/Element"/>
-		<xsl:variable name="packagingGuidance" select="$description/attribute[@name='packagingGuidance']"/>
-		
-		<xsl:if test="$externalDescription != '' or count($deliveredWorkProducts) > 0 or $packagingGuidance != ''">
-			<div class="sectionHeading"><xsl:value-of select="$deliverablePropertiesText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$externalDescription != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$externalDescriptionText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$externalDescription"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($deliveredWorkProducts) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$deliveredPartsText"/></th>
-							<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$deliveredWorkProducts">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$packagingGuidance != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$packagingInstructionsText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$packagingGuidance"/>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/descriptor.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/descriptor.xsl
deleted file mode 100644
index 8acd7d0..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/descriptor.xsl
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="illustration.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="property.xsl"/>
-
-	<xsl:template name="refinedDescriptionSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="refinedDescription" select="$description/attribute[@name='refinedDescription']"/>
-		<xsl:if test="$refinedDescription != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$mainDescriptionText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$refinedDescription"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>	
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/descriptor_helper.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/descriptor_helper.xsl
deleted file mode 100644
index 00cb9a8..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/descriptor_helper.xsl
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="addDescriptors">
-		<xsl:param name="descriptors"/>
-		<xsl:param name="colspan"/>
-		<xsl:variable name="showFullMethodContent" select="@ShowFullMethodContent"/>		
-		<xsl:if test="count($descriptors) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$processUsageText"/>			
-				</th>
-				<td class="sectionTableCell">
-					<xsl:attribute name="colspan"><xsl:value-of select="$colspan"/></xsl:attribute>
-					<ul>
-						<xsl:for-each select="$descriptors">
-							<li>
-								<!-- add the parent link -->
-								<xsl:for-each select="Element">
-										<xsl:call-template name="addElementWithLink">
-										<xsl:with-param name="element" select="."/>
-									</xsl:call-template>
-									&#160;&gt;&#160;
-								</xsl:for-each>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/escape.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/escape.xsl
deleted file mode 100644
index f0ca14d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/escape.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="escape">
-		<xsl:param name="string"/>
-		<xsl:param name="search"/>
-		<xsl:param name="replace"/>
-		<xsl:choose>
-			<xsl:when test="contains($string, $search)">
-				<xsl:value-of select="concat(substring-before($string, $search), $replace)"/>
-				<xsl:call-template name="escape">
-					<xsl:with-param name="string" select="substring-after($string, $search)"/>
-					<xsl:with-param name="search" select="$search"/>
-					<xsl:with-param name="replace" select="$replace"/>
-				</xsl:call-template>
-			</xsl:when>
-			<xsl:otherwise>
-				<xsl:value-of select="$string"/>
-			</xsl:otherwise>
-		</xsl:choose>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance.xsl
deleted file mode 100644
index f83c088..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance.xsl
+++ /dev/null
@@ -1,181 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="mapping.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-		<xsl:variable name="tool" select="reference[@name='tool']/Element[@Type='Tool']"/>
-
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title>
-					<xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/>
-				</title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type">
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<xsl:if test="$elementType = 'ToolMentor'">
-					<meta name="tool" content="{$tool/@DisplayName}"/>
-				</xsl:if>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection">
-								<xsl:with-param name="referenceList" select="referenceList"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="contentElements" select="referenceList[@name='contentElements']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($contentElements) + count($categories) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$relationshipsText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-						<xsl:call-template name="addReferences">
-								<xsl:with-param name="refName" select="$categoriesText"/>
-								<xsl:with-param name="refElement" select="$categories"/>
-						</xsl:call-template>
-						<xsl:call-template name="addReferences">
-								<xsl:with-param name="refName" select="$relatedElementsText"/>
-								<xsl:with-param name="refElement" select="$contentElements"/>
-						</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<!-- use the specific named list,  otherwise, the variability base element will be included, bug 163885 -->
-		<xsl:variable name="checklists" select="referenceList[@name ='checklists']/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList[@name ='conceptsAndPapers']/Element[@Type='Concept']"/>
-		<xsl:variable name="guidelines" select="referenceList[@name ='guidelines']/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList[@name ='supportingMaterials']/Element"/>
-		<xsl:variable name="toolMentors" select="referenceList[@name !='contentElements']/Element[@Type='ToolMentor']"/>
-		<xsl:variable name="whitePapers" select="referenceList[@name ='conceptsAndPapers']/Element[@Type='Whitepaper']"/>
-		<xsl:variable name="examples" select="referenceList[@name ='examples']/Element[@Type='Example']"/>
-		<xsl:variable name="reusableAssets" select="referenceList[@name ='assets']/Element[@Type='ReusableAsset']"/>
-		<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($toolMentors) + count($whitePapers) + count($reusableAssets) + count($examples) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$moreInfoText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="$checklists"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="$concepts"/>
-					</xsl:call-template>
-					<xsl:call-template name="addExamples">
-						<xsl:with-param name="examples" select="$examples"/>
-					</xsl:call-template>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="$guidelines"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReusableAssets">
-						<xsl:with-param name="reusableAssets" select="$reusableAssets"/>
-					</xsl:call-template>
-					<xsl:call-template name="addSupportingMaterials">
-						<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-					</xsl:call-template>
-					<xsl:call-template name="addToolMentors">
-						<xsl:with-param name="toolMentors" select="$toolMentors"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="$whitePapers"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance_helper.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance_helper.xsl
deleted file mode 100644
index 8159eee..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance_helper.xsl
+++ /dev/null
@@ -1,280 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="addChecklists">
-		<xsl:param name="checklists"/>
-		<xsl:if test="count($checklists) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$checklistsText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$checklists">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addConcepts">
-		<xsl:param name="concepts"/>
-		<xsl:if test="count($concepts) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$conceptsText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$concepts">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addEstimationConsiderations">
-		<xsl:param name="estimationConsiderations"/>
-		<xsl:if test="count($estimationConsiderations) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$estimationConsiderationsText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$estimationConsiderations">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addExamples">
-		<xsl:param name="examples"/>
-		<xsl:if test="count($examples) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$examplesText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$examples">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addGuidelines">
-		<xsl:param name="guidelines"/>
-		<xsl:if test="count($guidelines) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$guidelinesText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$guidelines">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addReports">
-		<xsl:param name="reports"/>
-		<xsl:if test="count($reports) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$reportsText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$reports">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addReusableAssets">
-		<xsl:param name="reusableAssets"/>
-		<xsl:if test="count($reusableAssets) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$reusableAssetsText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$reusableAssets">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addSupportingMaterials">
-		<xsl:param name="supportingMaterials"/>
-		<xsl:if test="count($supportingMaterials) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$supportingMaterialsText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$supportingMaterials">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addTechniques">
-		<xsl:param name="techniques"/>
-		<xsl:if test="count($techniques) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$techniquesText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$techniques">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addTemplates">
-		<xsl:param name="templates"/>
-		<xsl:if test="count($templates) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$templatesText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$templates">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addWhitePapers">
-		<xsl:param name="whitePapers"/>
-		<xsl:if test="count($whitePapers) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$whitepapersText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$whitePapers">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="addToolMentors">
-		<xsl:param name="toolMentors"/>
-		<xsl:if test="count($toolMentors) > 0">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:value-of select="$toolMentorsText"/>
-				</th>
-				<td class="sectionTableCell">
-					<ul>
-						<xsl:for-each select="$toolMentors">
-							<li>
-								<xsl:call-template name="addElementWithLink">
-									<xsl:with-param name="element" select="."/>
-								</xsl:call-template>
-							</li>
-						</xsl:for-each>
-					</ul>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance_with_attachment.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance_with_attachment.xsl
deleted file mode 100644
index 36da02e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/guidance_with_attachment.xsl
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="mapping.xsl"/>	
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-	<xsl:include href="escape.xsl"/>	
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-		<xsl:variable name="tool" select="reference[@name='tool']/Element[@Type='Tool']"/>
-
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title>
-					<xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/>
-				</title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type">
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<xsl:if test="$elementType = 'ToolMentor'">
-					<meta name="tool" content="{$tool/@DisplayName}"/>
-				</xsl:if>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="descriptionSection">
-								<xsl:with-param name="description" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection">
-								<xsl:with-param name="referenceList" select="referenceList"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="contentElements" select="referenceList[@name='contentElements']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($contentElements) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$relationshipsText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$categoriesText"/>
-						<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<tr valign="top">
-						<th class="sectionTableHeading" scope="row">
-							<xsl:value-of select="$relatedElementsText"/>
-						</th>
-						<td class="sectionTableCell">
-							<ul>
-								<xsl:for-each select="$contentElements">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="descriptionSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="mainDescription" select="$description/attribute[@name='mainDescription']"/>		
-		<xsl:variable name="attachments" select="$description/attribute[@name='attachments']"/>				
-
-		<xsl:if test="$mainDescription != '' or $attachments != ''">
-			<div class="sectionHeading"><xsl:value-of select="$descriptionText"/></div>
-			<div class="sectionContent">			
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$mainDescription != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$mainDescriptionText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$mainDescription"/>
-							</td>
-						</tr>
-					</xsl:if>				
-					<xsl:if test="$attachments != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$attachedFilesText"/></th>
-							<td class="sectionTableCell">
-							<UL>
-								<xsl:for-each select="attribute[@name='attachedFile']">
-								<li>
-									<a href="{@url}" target="_blank"><xsl:value-of select="@fileName"/></a>
-								</li>
-								</xsl:for-each>
-							</UL>
-							</td>
-						</tr>
-					</xsl:if>				
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<!-- use the specific named list,  otherwise, the variability base element will be included, bug 163885 -->
-		<xsl:variable name="checklists" select="referenceList[@name ='checklists']/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList[@name ='conceptsAndPapers']/Element[@Type='Concept']"/>
-		<xsl:variable name="guidelines" select="referenceList[@name ='guidelines']/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList[@name ='supportingMaterials']/Element"/>
-		<xsl:variable name="toolMentors" select="referenceList[@name !='contentElements']/Element[@Type='ToolMentor']"/>
-		<xsl:variable name="whitePapers" select="referenceList[@name ='conceptsAndPapers']/Element[@Type='Whitepaper']"/>
-		<xsl:variable name="examples" select="referenceList[@name ='examples']/Element[@Type='Example']"/>
-		<xsl:variable name="reusableAssets" select="referenceList[@name ='assets']/Element[@Type='ReusableAsset']"/>
-		<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($toolMentors) + count($whitePapers) + count($reusableAssets) + count($examples) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$moreInfoText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="$checklists"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="$concepts"/>
-					</xsl:call-template>
-					<xsl:call-template name="addExamples">
-						<xsl:with-param name="examples" select="$examples"/>
-					</xsl:call-template>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="$guidelines"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReusableAssets">
-						<xsl:with-param name="reusableAssets" select="$reusableAssets"/>
-					</xsl:call-template>
-					<xsl:call-template name="addSupportingMaterials">
-						<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-					</xsl:call-template>
-					<xsl:call-template name="addToolMentors">
-						<xsl:with-param name="toolMentors" select="$toolMentors"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="$whitePapers"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/illustration.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/illustration.xsl
deleted file mode 100644
index 54d8f80..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/illustration.xsl
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="illustrationsSection">
-		<xsl:variable name="examples" select="referenceList/Element[@Type='Example']"/>
-		<xsl:variable name="reusableAssets" select="referenceList/Element[@Type='ReusableAsset']"/>
-		<xsl:if test="count($examples) + count($reusableAssets) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$illustrationsText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addExamples">
-						<xsl:with-param name="examples" select="$examples"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReusableAssets">
-						<xsl:with-param name="reusableAssets" select="$reusableAssets"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/key_consideration.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/key_consideration.xsl
deleted file mode 100644
index 50c2f35..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/key_consideration.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="keyConsiderationsSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="keyConsiderations" select="$description/attribute[@name='keyConsiderations']"/>
-		<xsl:if test="$keyConsiderations != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$keyConsiderationsText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$keyConsiderations"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/main_description.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/main_description.xsl
deleted file mode 100644
index 0aa0768..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/main_description.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="mainDescriptionSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="mainDescription" select="$description/attribute[@name='mainDescription']"/>
-		<xsl:if test="$mainDescription != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$mainDescriptionText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$mainDescription"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/mapping.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/mapping.xsl
deleted file mode 100644
index 180640b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/mapping.xsl
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="mapping">
-		<xsl:param name="elementType"/>
-		<xsl:choose>
-			<xsl:when test="$elementType = 'Task'">
-				<xsl:attribute name="content"><xsl:value-of select="'activity'"/></xsl:attribute>
-			</xsl:when>
-			<xsl:when test="$elementType = 'ToolMentor'">
-				<xsl:attribute name="content"><xsl:value-of select="'tool_mentor'"/></xsl:attribute>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Outcome'">
-				<xsl:attribute name="content"><xsl:value-of select="'artifact'"/></xsl:attribute>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Deliverable'">
-				<xsl:attribute name="content"><xsl:value-of select="'artifact'"/></xsl:attribute>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Activity'">
-				<xsl:attribute name="content"><xsl:value-of select="'workflow_detail'"/></xsl:attribute>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Concept'">
-				<xsl:attribute name="content"><xsl:value-of select="'concept'"/></xsl:attribute>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Example'">
-				<xsl:attribute name="content"><xsl:value-of select="'example'"/></xsl:attribute>
-			</xsl:when>
-			<xsl:otherwise>
-				<xsl:attribute name="content"><xsl:value-of select="'other'"/></xsl:attribute>
-			</xsl:otherwise>
-		</xsl:choose>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/milestone.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/milestone.xsl
deleted file mode 100644
index eec3a93..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/milestone.xsl
+++ /dev/null
@@ -1,177 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="property.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element[@Type='Milestone']"/>
-		<xsl:variable name="milestoneDescription" select="$presentation/Element[@Type='Milestone']"/>
-		<xsl:variable name="descriptorDescription" select="$presentation/Element[@Type='BreakdownElementDescription']"/>		
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>				
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, true, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="propertiesSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="usageSection">
-								<xsl:with-param name="contentDescription" select="$descriptorDescription"/>
-							</xsl:call-template>							
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>							
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-				<script language="JavaScript" type="text/javascript">
-					contentPage.onload();
-				</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="propertiesSection">
-		<xsl:param name="contentDescription"/>
-		<div class="sectionHeading"><xsl:value-of select="$propertiesText"/></div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-			    <xsl:if test="referenceList[@name='linkToPredecessor']/Element">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$predecessorText"/>
-						<xsl:with-param name="refElement" select="referenceList[@name='linkToPredecessor']/Element"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='PlanningData']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$planningDataText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='PlanningData']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$multipleOccurrencesText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='hasMultipleOccurrences']"/>
-				</xsl:call-template>
-				<xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$eventDrivenText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='isEventDriven']"/>
-				</xsl:call-template>
-				<xsl:if test="attribute[@name='isOngoing']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$ongoingText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOngoing']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isOptional']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$optionalText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOptional']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isPlanned']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$plannedText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isPlanned']"/>
-					</xsl:call-template>
-				</xsl:if>				
-				<xsl:if test="attribute[@name='isRepeatable']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$repeatableText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isRepeatable']"/>
-					</xsl:call-template>
-				</xsl:if>				
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="usageSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:if test="$contentDescription/attribute[@name='usageGuidance'] != ''">
-			<div class="sectionHeading"><xsl:value-of select="$usageText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$usageGuidanceText"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='usageGuidance']"/>
-					</xsl:call-template>					
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/outcome.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/outcome.xsl
deleted file mode 100644
index bd3a30a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/outcome.xsl
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="workproduct.xsl"/>
-	<xsl:include href="mapping.xsl"/>
-	<xsl:include href="main_description.xsl"/>	
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="outcomeDescription" select="$presentation/Element[@Type='WorkProductDescription']"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-
-		<html>	
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type"> 
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="purposeSection">
-								<xsl:with-param name="description" select="$outcomeDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$outcomeDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="workProductIllustrationsSection"/>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$outcomeDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="tailoringSection">
-								<xsl:with-param name="description" select="$outcomeDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/overview.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/overview.xsl
deleted file mode 100644
index c9cb72c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/overview.xsl
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="overview">
-		<xsl:param name="elementType"/>
-		<xsl:param name="elementTypeName"/>
-		<xsl:param name="elementPresentationName"/>
-		<xsl:param name="elementIcon"/>
-		<xsl:param name="backPath"/>
-		<xsl:param name="showTreeBrowser"/>
-		<xsl:variable name="prefix" select="attribute[@name='prefix']"/>
-		<xsl:variable name="briefDescription" select="attribute[@name='briefDescription']"/>
-		<xsl:variable name="synonyms" select="reference/Element/attribute[@name='synonyms']"/>
-		<xsl:variable name="externalId" select="reference/Element/attribute[@name='externalId']"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="showFullMethodContent" select="@ShowFullMethodContent"/>
-		<div id="page-guid">
-			<xsl:attribute name="value"><xsl:value-of select="attribute[@name='guid']"/></xsl:attribute>
-		</div>
-		<table border="0" cellspacing="0" cellpadding="0" width="100%">
-			<tr>
-				<td class="pageTitle" nowrap="true">
-					<xsl:choose>
-						<xsl:when test="$elementType = 'CustomCategory' or $elementType = 'SupportingMaterial' or $elementType = 'Summary'">
-							<xsl:value-of select="$elementPresentationName"/>
-						</xsl:when>
-						<xsl:otherwise>							
-							<xsl:choose>
-								<xsl:when test="$showFullMethodContent = 'true'">
-									<xsl:choose>										
-										<xsl:when test="$elementType = 'TaskDescriptor'">
-											<xsl:value-of select="$taskText"/>
-										</xsl:when>
-										<xsl:when test="$elementType = 'RoleDescriptor'">
-											<xsl:value-of select="$roleText"/>
-										</xsl:when>
-										<xsl:when test="$elementType = 'WorkProductDescriptor'">
-											<xsl:value-of select="$workProductText"/>
-										</xsl:when>
-										<xsl:otherwise>
-										<!--
-											<xsl:value-of select="$elementTypeName"/>
-										-->
-											<xsl:call-template name="elementTypeText">
-														<xsl:with-param name="elementType" select="$elementType"/>
-														<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-											</xsl:call-template>
-										</xsl:otherwise>
-									</xsl:choose>									
-								</xsl:when>
-								<xsl:otherwise>
-										<!--
-											<xsl:value-of select="$elementTypeName"/>
-										-->
-											<xsl:call-template name="elementTypeText">
-														<xsl:with-param name="elementType" select="$elementType"/>
-														<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-											</xsl:call-template>
-								</xsl:otherwise>
-							</xsl:choose>
-							<xsl:value-of select="$colon_with_space"/>
-							<xsl:choose>
-								<xsl:when test="$prefix != ''">
-									<xsl:value-of select="$prefix"/> - <xsl:value-of select="$elementPresentationName"/>
-								</xsl:when>
-								<xsl:otherwise>
-									<xsl:value-of select="$elementPresentationName"/>
-								</xsl:otherwise>
-							</xsl:choose>
-						</xsl:otherwise>						
-					</xsl:choose>
-					<xsl:if test="$externalId != ''">
-						(<xsl:value-of select="$externalId"/>)
-					</xsl:if>
-				</td>
-				<td width="100%">
-					<div align="right" id="contentPageToolbar"/>
-				</td>
-				<xsl:if test="$showTreeBrowser">
-					<td width="100%" class="expandCollapseLink" align="right">
-						<a name="mainIndex" href="{$backPath}index.htm"/>
-						<script language="JavaScript" type="text/javascript" src="{$backPath}scripts/treebrowser.js"/>
-					</td>
-				</xsl:if>
-			</tr>
-		</table>
-		<table width="100%" border="0" cellpadding="0" cellspacing="0">
-			<tr>
-				<td class="pageTitleSeparator">
-					<img src="{$imagePath}shim.gif" alt="" title="" height="1"/>
-				</td>
-			</tr>
-		</table>
-		<xsl:choose>
-			<xsl:when test="$elementType = 'CustomCategory' and $briefDescription = ''">
-				<br/>
-			</xsl:when>
-			<xsl:otherwise>
-				<div class="overview">
-					<table width="97%" border="0" cellspacing="0" cellpadding="0">
-						<tr>
-							<xsl:if test="$briefDescription != ''">
-								<td width="50">
-									<img src="{$elementIcon}" alt="" title=""/>
-								</td>
-							</xsl:if>
-							<td>
-								<table class="overviewTable" border="0" cellspacing="0" cellpadding="0">
-									<tr>
-										<td valign="top">
-											<xsl:value-of disable-output-escaping="yes" select="$briefDescription"/>
-										</td>
-									</tr>
-									<xsl:choose>
-										<xsl:when test="$elementType = 'Role'">
-											<xsl:call-template name="roleKeyInfo"/>
-										</xsl:when>
-										<xsl:when test="$elementType = 'Task'">
-											<xsl:call-template name="taskKeyInfo"/>
-										</xsl:when>
-										<xsl:when test="$elementType = 'Artifact' or $elementType = 'Deliverable' or $elementType = 'Outcome'">
-											<xsl:call-template name="workProductKeyInfo"/>
-										</xsl:when>
-										<xsl:when test="$elementType = 'ToolMentor'">
-											<xsl:call-template name="toolMentorKeyInfo"/>
-										</xsl:when>
-										<xsl:when test="$elementType = 'TaskDescriptor'">
-											<xsl:call-template name="taskDescriptorKeyInfo">
-												<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-											</xsl:call-template>
-										</xsl:when>
-										<xsl:when test="$elementType = 'RoleDescriptor'">
-											<xsl:call-template name="roleDescriptorKeyInfo">
-												<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-											</xsl:call-template>
-										</xsl:when>
-										<xsl:when test="$elementType = 'WorkProductDescriptor'">
-											<xsl:call-template name="workProductDescriptorKeyInfo">
-												<xsl:with-param name="showFullMethodContent" select="$showFullMethodContent"/>
-											</xsl:call-template>
-										</xsl:when>
-										<xsl:otherwise>
-											<xsl:variable name="baseElement" select="reference[@name='variabilityBasedOnElement']/Element"/>
-											<xsl:variable name="variabilityType" select="attribute[@name='variabilityType']"/>
-											<xsl:if test="count($baseElement) > 0">
-												<tr>
-													<td valign="top">
-														<xsl:if test="$variabilityType = 'replaces'">
-															<xsl:value-of select="$replacesText"/>
-															<xsl:value-of select="$colon_with_space"/>
-														</xsl:if>
-														<xsl:if test="$variabilityType = 'contributes' ">
-															<xsl:value-of select="$contributesText"/>
-															<xsl:value-of select="$colon_with_space"/>
-														</xsl:if>
-														<xsl:if test="$variabilityType = 'extendsReplaces' ">
-															<xsl:value-of select="$extendsReplacesText"/>
-															<xsl:value-of select="$colon_with_space"/>
-														</xsl:if>
-														<!-- display localCOntribution and localReplacement as extends for now -->
-														<xsl:if test="$variabilityType = 'extends' or $variabilityType = 'localContribution' or $variabilityType = 'localReplacement' ">
-															<xsl:value-of select="$extendsText"/>
-															<xsl:value-of select="$colon_with_space"/>
-														</xsl:if>
-														<xsl:for-each select="$baseElement">
-															<xsl:call-template name="addElementWithLink">
-																<xsl:with-param name="element" select="."/>
-															</xsl:call-template>
-														</xsl:for-each>
-													</td>
-												</tr>
-											</xsl:if>
-										</xsl:otherwise>
-									</xsl:choose>
-								</table>
-							</td>
-						</tr>
-					</table>
-				</div>
-			</xsl:otherwise>
-		</xsl:choose>
-	</xsl:template>
-
-	<xsl:template name="elementTypeText">
-		<xsl:param name="elementType"/>
-		<xsl:param name="elementTypeName"/>
-		<xsl:choose>										
-			<xsl:when test="$elementType = 'Activity'">
-					<xsl:value-of select="$activityText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Artifact'">
-					<xsl:value-of select="$artifactText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'CapabilityPattern'">
-					<xsl:value-of select="$capabilityPatternText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Checklist'">
-					<xsl:value-of select="$checklistText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'CompositeRole'">
-					<xsl:value-of select="$compositeRoleText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Concept'">
-					<xsl:value-of select="$conceptText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'CustomCategory'">
-					<xsl:value-of select="$customCategoryText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Deliverable'">
-					<xsl:value-of select="$deliverableText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'DeliveryProcess'">
-					<xsl:value-of select="$deliveryProcessText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Discipline'">
-					<xsl:value-of select="$disciplineText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'DisciplineGrouping'">
-					<xsl:value-of select="$disciplineGroupingText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Domain'">
-					<xsl:value-of select="$domainText"/>
-			</xsl:when>
-			
-			<xsl:when test="$elementType = 'EstimationConsiderations'">
-					<xsl:value-of select="$estimationConsiderationsText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Example'">
-					<xsl:value-of select="$exampleText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Guideline'">
-					<xsl:value-of select="$guidelineText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Iteration'">
-					<xsl:value-of select="$iterationText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Milestone'">
-					<xsl:value-of select="$milestoneText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Outcome'">
-					<xsl:value-of select="$outcomeText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Phase'">
-					<xsl:value-of select="$phaseText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Practice'">
-					<xsl:value-of select="$practiceText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Report'">
-					<xsl:value-of select="$reportText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'ReusableAsset'">
-					<xsl:value-of select="$reusableAssetText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Roadmap'">
-					<xsl:value-of select="$roadmapText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Role'">
-					<xsl:value-of select="$roleText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'RoleDescriptor'">
-					<xsl:value-of select="$roleDescriptorText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'RoleSet'">
-					<xsl:value-of select="$roleSetText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'RoleSetGrouping'">
-					<xsl:value-of select="$roleSetGroupingText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'SupportingMaterial'">
-					<xsl:value-of select="$supportingMaterialText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Task'">
-					<xsl:value-of select="$taskText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'TaskDescriptor'">
-					<xsl:value-of select="$taskDescriptorText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'TeamProfile'">
-					<xsl:value-of select="$teamProfileText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Template'">
-					<xsl:value-of select="$templateText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'TermDefinition'">
-					<xsl:value-of select="$termDefinitionText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Tool'">
-					<xsl:value-of select="$toolText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'ToolMentor'">
-					<xsl:value-of select="$toolMentorText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'Whitepaper'">
-					<xsl:value-of select="$whitepaperText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'WorkProductDescriptor'">
-					<xsl:value-of select="$workProductDescriptorText"/>
-			</xsl:when>
-			<xsl:when test="$elementType = 'WorkProductType'">
-					<xsl:value-of select="$workProductTypeText"/>
-			</xsl:when>
-			<xsl:otherwise>
-					<xsl:value-of select="$elementTypeName"/>
-			</xsl:otherwise>
-		</xsl:choose>	
-	</xsl:template>
-	
-	<xsl:template name="roleKeyInfo">
-		<xsl:variable name="synonyms" select="reference/Element/attribute[@name='synonyms']"/>
-		<xsl:variable name="baseRole" select="reference[@name='variabilityBasedOnElement']/Element[@Type='Role']"/>
-		<xsl:variable name="roleSets" select="referenceList[@name='roleSets']/Element[@Type='RoleSet']"/>
-		<xsl:variable name="variabilityType" select="attribute[@name='variabilityType']"/>
-		<xsl:if test="$synonyms != ''">
-			<tr>
-				<td>
-					<xsl:value-of select="$synonymsText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:value-of disable-output-escaping="yes" select="$synonyms"/>
-				</td>
-			</tr>
-		</xsl:if>
-		<xsl:if test="count($baseRole) > 0">
-			<tr>
-				<td>
-					<xsl:if test="$variabilityType = 'replaces'">
-						<xsl:value-of select="$replacesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'contributes'">
-						<xsl:value-of select="$contributesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'extendsReplaces'">
-						<xsl:value-of select="$extendsReplacesText"/>
-						<xsl:value-of select="$colon_with_space"/>						
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'extends'">
-						<xsl:value-of select="$extendsText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:for-each select="$baseRole">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-				</td>
-			</tr>
-		</xsl:if>
-		<xsl:if test="count($roleSets) > 0">
-			<xsl:variable name="size" select="count($roleSets)"/>
-			<tr>
-				<td>
-					<xsl:value-of select="$roleSetsText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$roleSets">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-						<xsl:if test="position() != $size">,&#160;</xsl:if>
-					</xsl:for-each>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="roleDescriptorKeyInfo">
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="sourceRole" select="reference[@name='Role']/Element[@Type='Role']"/>
-		<xsl:if test="$showFullMethodContent = 'false' and count($sourceRole) > 0">
-			<tr>
-				<td>
-					<xsl:value-of select="$basedOnMethodRoleText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$sourceRole">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="taskKeyInfo">
-		<xsl:variable name="disciplines" select="referenceList[@name='disciplines']/Element[@Type='Discipline']"/>
-		<xsl:variable name="baseTask" select="reference[@name='variabilityBasedOnElement']/Element"/>
-		<xsl:variable name="variabilityType" select="attribute[@name='variabilityType']"/>
-		<xsl:if test="count($disciplines) > 0">
-			<tr>
-				<td>
-					<xsl:value-of select="$disciplinesText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$disciplines">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-						<xsl:if test="count($disciplines) > position()">,&#160;</xsl:if>
-					</xsl:for-each>
-					<xsl:if test="count($baseTask) > 0">
-						<xsl:if test="count($disciplines) > 0">
-							<br/>
-						</xsl:if>
-						<xsl:if test="$variabilityType = 'replaces'">
-							<xsl:value-of select="$replacesText"/>
-							<xsl:value-of select="$colon_with_space"/>
-						</xsl:if>
-						<xsl:if test="$variabilityType = 'contributes'">
-							<xsl:value-of select="$contributesText"/>
-							<xsl:value-of select="$colon_with_space"/>
-						</xsl:if>
-						<xsl:if test="$variabilityType = 'extendsReplaces'">
-							<xsl:value-of select="$extendsReplacesText"/>
-							<xsl:value-of select="$colon_with_space"/>
-						</xsl:if>
-						<xsl:if test="$variabilityType = 'extends'">
-							<xsl:value-of select="$extendsText"/>
-							<xsl:value-of select="$colon_with_space"/>
-						</xsl:if>
-						<xsl:for-each select="$baseTask">
-							<xsl:call-template name="addElementWithLink">
-								<xsl:with-param name="element" select="."/>
-							</xsl:call-template>
-						</xsl:for-each>
-					</xsl:if>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="taskDescriptorKeyInfo">
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="sourceTask" select="reference[@name='Task']/Element[@Type='Task']"/>		
-		<xsl:if test="$showFullMethodContent = 'false' and count($sourceTask) > 0">
-			<tr>
-				<td>
-					<xsl:value-of select="$basedOnMethodTaskText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$sourceTask">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="workProductDescriptorKeyInfo">
-		<xsl:param name="showFullMethodContent"/>
-		<xsl:variable name="sourceWorkProduct" select="reference[@name='WorkProduct']/Element"/>
-		<xsl:if test="$showFullMethodContent = 'false' and count($sourceWorkProduct) > 0">
-			<tr>
-				<td>
-					<xsl:value-of select="$basedOnMethodWorkProductText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$sourceWorkProduct">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-				</td>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="workProductKeyInfo">
-		<xsl:variable name="domains" select="referenceList[@name='domains']/Element"/>
-		<xsl:variable name="baseWorkProduct" select="reference[@name='variabilityBasedOnElement']/Element"/>
-		<xsl:variable name="workProductTypes" select="referenceList[@name='workProductTypes']/Element[@Type='WorkProductType']"/>
-		<xsl:variable name="variabilityType" select="attribute[@name='variabilityType']"/>
-		<tr>
-			<td>
-				<xsl:if test="count($domains) > 0">
-					<xsl:value-of select="$domainsText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$domains">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-						<xsl:if test="count($domains) > position()">,&#160;</xsl:if>
-					</xsl:for-each>
-				</xsl:if>
-				<xsl:if test="count($workProductTypes) > 0">
-					<xsl:if test="count($domains) > 0">
-						<br/>
-					</xsl:if>
-					<xsl:value-of select="$workProductTypesText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$workProductTypes">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-						<xsl:if test="count($workProductTypes) > position()">,&#160;</xsl:if>
-					</xsl:for-each>
-				</xsl:if>
-				<xsl:if test="count($baseWorkProduct) > 0">
-					<xsl:if test="count($domains) + count($workProductTypes) > 0">
-						<br/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'replaces'">
-						<xsl:value-of select="$replacesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'contributes'">
-						<xsl:value-of select="$contributesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'extendsReplaces'">
-						<xsl:value-of select="$extendsReplacesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'extends'">
-						<xsl:value-of select="$extendsText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:for-each select="$baseWorkProduct">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-				</xsl:if>
-			</td>
-		</tr>
-	</xsl:template>
-
-	<xsl:template name="toolMentorKeyInfo">
-		<xsl:variable name="tool" select="reference[@name='tool']/Element"/>
-		<xsl:variable name="baseElement" select="reference[@name='variabilityBasedOnElement']/Element"/>
-		<xsl:variable name="variabilityType" select="attribute[@name='variabilityType']"/>
-		<tr>
-			<td>
-				<xsl:if test="count($tool) > 0">
-					<xsl:value-of select="$toolText"/>
-					<xsl:value-of select="$colon_with_space"/>
-					<xsl:for-each select="$tool">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-				</xsl:if>
-				<xsl:if test="count($baseElement) > 0">
-					<xsl:if test="count($tool)  > 0">
-						<br/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'replaces'">
-						<xsl:value-of select="$replacesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'contributes'">
-						<xsl:value-of select="$contributesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'extendsReplaces'">
-						<xsl:value-of select="$extendsReplacesText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:if test="$variabilityType = 'extends'">
-						<xsl:value-of select="$extendsText"/>
-						<xsl:value-of select="$colon_with_space"/>
-					</xsl:if>
-					<xsl:for-each select="$baseElement">
-						<xsl:call-template name="addElementWithLink">
-							<xsl:with-param name="element" select="."/>
-						</xsl:call-template>
-					</xsl:for-each>
-				</xsl:if>
-			</td>
-		</tr>
-	</xsl:template>
-
-	<xsl:template name="overviewSeparator">
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<table id="overviewSeparator" width="100%" border="0" cellpadding="0" cellspacing="0">
-			<tr>
-				<td class="overviewSeparator">
-					<img src="{$imagePath}shim.gif" alt="" title="" height="1"/>
-				</td>
-			</tr>
-			<tr>
-				<td>
-					<img src="{$imagePath}shim.gif" alt="" title="" height="5"/>
-				</td>
-			</tr>
-		</table>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/page_not_installed.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/page_not_installed.xsl
deleted file mode 100644
index fba939f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/page_not_installed.xsl
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>		
-		<html>	
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$pageNotInstalledText"/></title>
-			</head>		
-			<body>
-			<xsl:choose>
-				<xsl:when test="@invalidLink">
-					<b><h3><xsl:value-of select="$elementDoesNotExistText"/></h3></b>
-					<p/>
-					<xsl:value-of select="$isNotValidText"/>
-					<br/>	
-					<xsl:value-of select="$elementMightBeDeletedText"/>
-					<p/>
-					<xsl:value-of select="$pleaseFixLinkText"/>										
-				</xsl:when>
-			<xsl:otherwise>
-				<b><h3><xsl:value-of select="$missingElementText"/></h3></b>
-				<p/>
-				<xsl:value-of select="$notAvailableText"/>								
-			</xsl:otherwise>
-			</xsl:choose>
-			</body>
-		</html>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/practice.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/practice.xsl
deleted file mode 100644
index 28a629f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/practice.xsl
+++ /dev/null
@@ -1,201 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="guidance.xsl"/>	
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>		
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="responsibleRole" select="reference[@name='responsibleRole']/Element[@Type='Role']"/>
-
-    	<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-				<xsl:attribute name="content"><xsl:value-of select="$responsibleRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection2"/>
-							<xsl:call-template name="descriptionSection">
-								<xsl:with-param name="description" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection2">
-		<xsl:variable name="subPractices" select="referenceList[@name='subPractices']/Element"/>	
-		<xsl:variable name="contentReferences" select="referenceList[@name='contentReferences']/Element"/>
-		<xsl:variable name="activityReferences" select="referenceList[@name='activityReferences']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<xsl:if test="count($contentReferences) + count($subPractices) + count($activityReferences) + count($categories) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$categoriesText"/>
-						<xsl:with-param name="refElement" select="$categories"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$subPracticesText"/>
-						<xsl:with-param name="refElement" select="$subPractices"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$contentReferencesText"/>
-						<xsl:with-param name="refElement" select="$contentReferences"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$activityReferencesText"/>
-						<xsl:with-param name="refElement" select="$activityReferences"/>
-					</xsl:call-template>					
-				</table>
-			</div>
-		</xsl:if>
-    </xsl:template>
-
-	<xsl:template name="descriptionSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="mainDescription" select="$description/attribute[@name='mainDescription']"/>
-		<xsl:variable name="problem" select="$description/attribute[@name='problem']"/>
-		<xsl:variable name="background" select="$description/attribute[@name='background']"/>
-		<xsl:variable name="goals" select="$description/attribute[@name='goals']"/>
-		<xsl:variable name="application" select="$description/attribute[@name='application']"/>
-		<xsl:variable name="levelsOfAdoption" select="$description/attribute[@name='levelsOfAdoption']"/>
-		<xsl:variable name="additionalInfo" select="$description/attribute[@name='additionalInfo']"/>
-		
-		<xsl:if test="$mainDescription != '' or $problem != '' or $background != '' or $goals != '' or $application != '' or $levelsOfAdoption != '' or $additionalInfo != ''">
-			<div class="sectionHeading"><xsl:value-of select="$descriptionText"/></div>
-			<div class="sectionContent">			
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$mainDescription != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$mainDescriptionText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$mainDescription"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$problem != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$problemText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$problem"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$background != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$backgroundText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$background"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$goals != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$goalsText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$goals"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$application != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$applicationText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$application"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$levelsOfAdoption != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$levelsOfAdoptionText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$levelsOfAdoption"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$additionalInfo != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$additionalInfoText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$additionalInfo"/>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>    
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/property.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/property.xsl
deleted file mode 100644
index b5155eb..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/property.xsl
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="property">
-		<xsl:param name="fieldLabel"/>
-		<xsl:param name="fieldText"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="id">property_<xsl:value-of select="$fieldLabel"/></xsl:variable>
-		<xsl:if test="$fieldText != '' ">
-			<tr valign="top">
-				<th class="sectionTableHeading" scope="row">
-					<xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
-					<xsl:attribute name="abbr"><xsl:value-of select="$fieldLabel"/></xsl:attribute>
-					<xsl:value-of select="$fieldLabel"/>
-				</th>
-				<xsl:choose>
-					<xsl:when test="$fieldText = 'true' or $fieldText = 'false'">
-						<td class="sectionTableCell" align="left">
-							<xsl:attribute name="headers"><xsl:value-of select="$id"/></xsl:attribute>
-							<xsl:choose>
-								<xsl:when test="$fieldText = 'true'">
-									<img width="20" height="15" alt="Yes" title="Yes">
-										<xsl:attribute name="src"><xsl:value-of select="$imagePath"/>true.gif</xsl:attribute>
-									</img>
-								</xsl:when>
-								<xsl:otherwise>
-									<img width="20" height="15" alt="" title="">
-										<xsl:attribute name="src"><xsl:value-of select="$imagePath"/>indent.gif</xsl:attribute>
-									</img>
-								</xsl:otherwise>
-							</xsl:choose>
-							<!--
-							<label for="cbox1"/>
-							<input type="checkbox" name="property">
-								<xsl:attribute name="readonly">true</xsl:attribute>
-								<xsl:if test="$fieldText = 'true'">
-									<xsl:attribute name="checked">checked</xsl:attribute>
-								</xsl:if>
-								<xsl:attribute name="id">cbox1</xsl:attribute>
-								<xsl:attribute name="value">cbox1</xsl:attribute>
-								<xsl:attribute name="onclick"><xsl:choose><xsl:when test="$fieldText = 'true'">
-	 								this.checked=true;
- 								</xsl:when><xsl:otherwise>
- 									this.checked=false;
- 								</xsl:otherwise></xsl:choose></xsl:attribute>
-							</input>
-							-->
-						</td>
-					</xsl:when>
-					<xsl:otherwise>
-						<td class="sectionTableCell">
-							<xsl:attribute name="headers"><xsl:value-of select="$id"/></xsl:attribute>
-							<xsl:value-of disable-output-escaping="yes" select="$fieldText"/>
-						</td>
-					</xsl:otherwise>
-				</xsl:choose>
-			</tr>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/purpose.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/purpose.xsl
deleted file mode 100644
index 80ba6c7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/purpose.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="purposeSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="purpose" select="$description/attribute[@name='purpose']"/>
-		<xsl:if test="$purpose != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$purposeText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$purpose"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/resources.properties b/1.5/plugins/org.eclipse.epf.library/layout/xsl/resources.properties
deleted file mode 100644
index e1043d2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/resources.properties
+++ /dev/null
@@ -1,252 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-# The UI text in the XSL stylesheets.
-
-#
-# begin element type text section
-# user can customize the type text before publishing
-#
-activityText=Activity
-artifactText=Artifact
-capabilityPatternText=Capability Pattern
-checklistText=Checklist
-compositeRoleText=Composite Role
-conceptText=Concept
-customCategoryText=Custom Category
-deliverableText=Deliverable
-deliveryProcessText=Delivery Process
-disciplineText=Discipline
-disciplineGroupingText=Discipline Grouping
-domainText=Domain
-estimationConsiderationsText=Estimation Considerations
-exampleText=Example
-guidelineText=Guideline
-iterationText=Iteration
-milestoneText=Milestone
-outcomeText=Outcome
-phaseText=Phase
-practiceText=Practice
-reportText=Report
-reusableAssetText=Reusable Asset
-roadmapText=Roadmap
-roleText=Role
-roleDescriptorText=Role Descriptor
-roleSetText=Role Set
-roleSetGroupingText=Role Set Grouping
-supportingMaterialText=Supporting Material
-taskText=Task
-taskDescriptorText=Task Descriptor
-teamProfileText=Team Profile
-templateText=Template
-termDefinitionText=Term Definition
-toolText=Tool
-toolMentorText=Tool Mentor
-whitepaperText=Whitepaper
-workProductDescriptorText=Work Product Descriptor
-workProductTypeText=Work Product Kind
-
-#
-# end element type text section
-#
-
-#
-# other layout text below
-#
-additionalInfoText=Additional Information
-additionalPerformerText=Additional Performers
-aggregatesText=Aggregates
-alternativesText=Alternatives
-applicationText=Application
-
-assetsText=Assets
-assignmentApproachesText=Assignment Approaches
-assistingText=Assisting
-attachedFilesText=Attached Files
-backgroundText=Background
-briefOutlineText=Brief Outline
-categoriesText=Categories
-checkItemsText=Check Items
-checklistsText=Checklists
-collapseAllText=Collapse All Check Items
-
-conceptsText=Concepts
-containedArtifactsText=Contained Artifacts
-containerArtifactText=Container Artifact
-contentElementsText=Categorized Elements
-contentReferencesText=Content References
-
-deliverablePropertiesText=Deliverable Properties
-deliveredPartsText=Deliverable Parts
-deliveredWorkProductsText=Delivered Work Products
-dependentText=Dependent Work Products
-descriptionText=Description
-descriptorsText=Descriptors
-
-disciplinesText=Disciplines
-subdisciplinesText=Subdisciplines
-
-domainsText=Domains
-examplesText=Examples
-expandAllText=Expand All Check Items
-extendsText=Extends
-externalText=External
-externalDescriptionText=External Description
-goalsText=Goals
-guidelinesText=Guidelines
-illustrationsText=Illustrations	
-impactOfNotHavingText=Impact of not having
-impactingText=Impacting Work Products
-inputsText=Inputs
-inputToText=Input To
-itemsText=Items
-keyConsiderationsText=Key Considerations
-levelsOfAdoptionText=Levels of Adoption
-mandatoryText=Mandatory
-mainText=Main
-mainDescriptionText=Main Description
-mainResponsibleText=Main Responsible
-methodText=Method Work Product
-modifiedByText=Modified By
-moreInfoText=More Information
-notationText=Notation
-optionalText=Optional
-
-outputFromText=Output From
-outputsText=Outputs
-packagingInstructionsText=Packaging Instructions
-packagingGuidanceText=Packaging Guidance
-performingRolesText=Performing Roles
-primaryPerformerText=Primary Performer
-problemText=Problem
-propertiesText=Properties
-purposeText=Purpose
-reasonsForNotNeedingText=Reasons for not needing
-referenceWorkflowsText=Reference Workflows
-relatedElementsText=Related Elements
-relationshipsText=Relationships
-reportsText=Reports
-representationOptionsText=Representation Options
-responsibleText=Responsible
-responsibleForText=Responsible for
-reusableAssetsText=Reusable Assets
-
-rolesText=Roles
-roleSetsText=Role Sets
-skillsText=Skills
-staffingText=Staffing
-stepsText=Steps
-subcategoriesText=Sub-Categories	
-subdomainsText=Subdomains
-subPracticesText=Sub-Practices
-superTeamText=Super-Team Profile
-supportingMaterialsText=Supporting Materials
-subteamsText=Sub-Teams Profiles
-synonymsText=Synonyms
-tailoringText=Tailoring
-
-tasksText=Tasks
-tbsText=Team Allocation
-
-teamRolesText=Team Profile Roles
-techniquesText=Guidelines
-templatesText=Templates
-toolMentorsText=Tool Mentors
-
-usageText=Usage
-wbsText=Work Breakdown Structure
-whitepapersText=Whitepapers
-workProductsText=Work Products
-workProductTypesText=Work Product Kinds
-wpbsText=Work Product Usage
-workBreakdownText=Work Breakdown
-workflowText=Workflow
-workProductBreakdownText=Work Product Breakdown
-workProductDependenciesText=Work Product Dependencies
-teamProfileBreakdownText=Team Breakdown
-teamStructureText=Team Structure
-pageNotInstalledText=Page Not Installed
-elementDoesNotExistText=Element Does Not Exist
-isNotValidText=The referenced element is not a valid element in the current library.
-elementMightBeDeletedText=The element may have been deleted from the library.
-pleaseFixLinkText=Please check your content library and fix the link.
-infoAboutMissingElementText=Information about the missing element:
-elementNameText=Element Name:
-guidText=GUID:
-missingElementText=Referenced page is not in this configuration
-notAvailableText=The referenced page is not available in the current configuration. This page may be available in another process configuration.
-elementTypeText=Element Type:
-pluginNameText=Plug-in Name:
-predecessorText=Predecessor
-planningDataText=Planning Data
-multipleOccurrencesText=Multiple Occurrences
-eventDrivenText=Event Driven
-ongoingText=Ongoing
-plannedText=Planned
-repeatableText=Repeatable
-usageGuidanceText=Usage Guidance
-inputsText=Inputs
-outputsText=Outputs
-activityEntryStateText=Activity Entry State
-activityExitStateText=Activity Exit State
-prefixText=Prefix
-externalIdText=External Id
-scopeText=Scope
-
-typeofContractText=Type of Contract
-projectCharacteristicsText=Project Characteristics
-projectMemberExpertiseText=Project Member Expertise
-riskLevelText=Risk Level
-scaleText=Scale
-usageNotesText=Usage Notes
-contextText=Context
-parentActivitiesText=Parent Activities
-includedPatternsText=Included Patterns
-
-communicationsMaterialsText=Communications Materials
-educationMaterialsText=Education Materials
-estimatingTechniqueText=Estimating Technique
-additionalText=Additional
-modifiesText=Modifies
-additionallyPerformsText=Additionally Performs
-indexText=Index
-prefixText=Prefix
-breakdownElementText=Breakdown Element
-stepsText=Steps
-predecessorsText=Predecessors
-repeatableText=Repeatable
-typeText=Type
-ongoingText=Ongoing
-eventDrivenText=Event-Driven
-modelInfoText=Model Info
-entryStateText=Entry State
-exitStateText=Exit State
-teamText=Team
-parentPackageText=Parent Package
-containedPackagesText=Contained Packages
-contentsText=Contents
-basedOnMethodRoleText=Based on Method Role
-basedOnMethodTaskText=Based on Method Task
-basedOnMethodWorkProductText=Based on Method Work Product
-summaryText=Summary
-performsText=Performs
-replacesText=Replaces
-contributesText=Contributes
-noneText=None
-
-activityReferencesText=Activity References
-nameText=Name
-presentationNameText=Presentation Name
-representationText=Selected Representation
-projectSpecificsText=Project Specifics
-extendsReplacesText=Extends and Replaces
-workProductText=Work Product
-processUsageText=Process Usage
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/resources.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/resources.xsl
deleted file mode 100644
index 0f74ab9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/resources.xsl
+++ /dev/null
@@ -1,227 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-	
-	
-<!-- the element type text -->
-<xsl:param name="activityText"/>
-<xsl:param name="artifactText"/>
-<xsl:param name="capabilityPatternText"/>
-<xsl:param name="checklistText"/>
-<xsl:param name="compositeRoleText"/>
-<xsl:param name="conceptText"/>
-<xsl:param name="customCategoryText"/>
-<xsl:param name="deliverableText"/>
-<xsl:param name="deliveryProcessText"/>
-<xsl:param name="disciplineText"/>
-<xsl:param name="disciplineGroupingText"/>
-<xsl:param name="domainText"/>
-<xsl:param name="estimationConsiderationsText"/>
-<xsl:param name="exampleText"/>
-<xsl:param name="guidelineText"/>
-<xsl:param name="iterationText"/>
-<xsl:param name="milestoneText"/>
-<xsl:param name="outcomeText"/>
-<xsl:param name="phaseText"/>
-<xsl:param name="practiceText"/>
-<xsl:param name="reportText"/>
-<xsl:param name="reusableAssetText"/>
-<xsl:param name="roadmapText"/>
-<xsl:param name="roleText"/>
-<xsl:param name="roleDescriptorText"/>
-<xsl:param name="roleSetText"/>
-<xsl:param name="roleSetGroupingText"/>
-<xsl:param name="supportingMaterialText"/>
-<xsl:param name="taskText"/>
-<xsl:param name="taskDescriptorText"/>
-<xsl:param name="teamProfileText"/>
-<xsl:param name="templateText"/>
-<xsl:param name="termDefinitionText"/>
-<xsl:param name="toolText"/>
-<xsl:param name="toolMentorText"/>
-<xsl:param name="whitepaperText"/>
-<xsl:param name="workProductDescriptorText"/>
-<xsl:param name="workProductTypeText"/>
-
-<!-- other text variables -->
-	<xsl:param name="activityEntryStateText"/>
-	<xsl:param name="activityExitStateText"/>
-	<xsl:param name="additionalInfoText"/>
-	<xsl:param name="additionallyPerformsText"/>
-	<xsl:param name="additionalPerformerText"/>
-	<xsl:param name="additionalText"/>
-	<xsl:param name="aggregatesText"/>
-	<xsl:param name="alternativesText"/>
-	<xsl:param name="applicationText"/>
-	<xsl:param name="assetsText"/>
-	<xsl:param name="assignmentApproachesText"/>
-	<xsl:param name="assistingText"/>
-	<xsl:param name="attachedFilesText"/>
-	<xsl:param name="backgroundText"/>
-	<xsl:param name="basedOnMethodRoleText"/>
-	<xsl:param name="basedOnMethodTaskText"/>
-	<xsl:param name="basedOnMethodWorkProductText"/>
-	<xsl:param name="breakdownElementText"/>
-	<xsl:param name="briefOutlineText"/>
-	<xsl:param name="categoriesText"/>
-	<xsl:param name="checkItemsText"/>
-	<xsl:param name="checklistsText"/>
-
-	<xsl:param name="collapseAllText"/>
-	<xsl:param name="communicationsMaterialsText"/>
-	<xsl:param name="conceptsText"/>
-	<xsl:param name="containedArtifactsText"/>
-	<xsl:param name="containerArtifactText"/>
-	<xsl:param name="contentElementsText"/>
-	<xsl:param name="contentReferencesText"/>
-	<xsl:param name="contentsText"/>
-	<xsl:param name="contextText"/>
-	<xsl:param name="contributesText"/>
-	<xsl:param name="deliverablePropertiesText"/>
-	<xsl:param name="deliveredPartsText"/>
-	<xsl:param name="dependentText"/>
-	<xsl:param name="descriptionText"/>
-	<xsl:param name="descriptorsText"/>	
-	<xsl:param name="disciplinesText"/>
-
-	<xsl:param name="domainsText"/>
-	<xsl:param name="educationMaterialsText"/>
-	<xsl:param name="elementDoesNotExistText"/>
-	<xsl:param name="elementMightBeDeletedText"/>
-	<xsl:param name="elementNameText"/>
-	<xsl:param name="elementTypeText"/>
-	<xsl:param name="entryStateText"/>
-	<xsl:param name="estimatingTechniqueText"/>
-	<xsl:param name="eventDrivenText"/>
-	<xsl:param name="examplesText"/>
-	<xsl:param name="exitStateText"/>
-	<xsl:param name="expandAllText"/>
-	<xsl:param name="extendsText"/>
-	<xsl:param name="externalDescriptionText"/>
-	<xsl:param name="externalIdText"/>
-	<xsl:param name="externalText"/>
-	<xsl:param name="goalsText"/>
-	<xsl:param name="guidelinesText"/>
-	<xsl:param name="guidText"/>
-	<xsl:param name="illustrationsText"/>
-	<xsl:param name="impactingText"/>
-	<xsl:param name="impactOfNotHavingText"/>
-	<xsl:param name="includedPatternsText"/>
-	<xsl:param name="indexText"/>
-	<xsl:param name="infoAboutMissingElementText"/>
-	<xsl:param name="inputsText"/>
-	<xsl:param name="inputToText"/>
-	<xsl:param name="isNotValidText"/>
-	<xsl:param name="keyConsiderationsText"/>
-	<xsl:param name="levelsOfAdoptionText"/>
-	<xsl:param name="mainDescriptionText"/>
-	<xsl:param name="mainResponsibleText"/>
-	<xsl:param name="mainText"/>
-	<xsl:param name="mandatoryText"/>
-	<xsl:param name="missingElementText"/>
-	<xsl:param name="modelInfoText"/>
-	<xsl:param name="modifiedByText"/>
-	<xsl:param name="modifiesText"/>
-	<xsl:param name="moreInfoText"/>
-	<xsl:param name="multipleOccurrencesText"/>
-	<xsl:param name="noneText"/>
-	<xsl:param name="notationText"/>
-	<xsl:param name="notAvailableText"/>
-	<xsl:param name="ongoingText"/>
-	<xsl:param name="optionalText"/>
-	<xsl:param name="outputFromText"/>
-	<xsl:param name="outputsText"/>
-	<xsl:param name="packagingGuidanceText"/>
-	<xsl:param name="packagingInstructionsText"/>
-	<xsl:param name="pageNotInstalledText"/>
-	<xsl:param name="parentActivitiesText"/>
-	<xsl:param name="performingRolesText"/>
-	<xsl:param name="performsText"/>
-	<xsl:param name="plannedText"/>
-	<xsl:param name="planningDataText"/>
-	<xsl:param name="pleaseFixLinkText"/>
-	<xsl:param name="pluginNameText"/>
-	<xsl:param name="predecessorsText"/>
-	<xsl:param name="predecessorText"/>
-	<xsl:param name="prefixText"/>
-	<xsl:param name="primaryPerformerText"/>
-	<xsl:param name="problemText"/>
-	<xsl:param name="projectCharacteristicsText"/>
-	<xsl:param name="projectMemberExpertiseText"/>
-	<xsl:param name="projectSpecificsText"/>
-	<xsl:param name="propertiesText"/>
-	<xsl:param name="purposeText"/>
-	<xsl:param name="reasonsForNotNeedingText"/>
-	<xsl:param name="referenceWorkflowsText"/>
-	<xsl:param name="relatedElementsText"/>
-	<xsl:param name="relationshipsText"/>
-	<xsl:param name="repeatableText"/>
-	<xsl:param name="replacesText"/>
-	<xsl:param name="reportsText"/>
-	<xsl:param name="representationOptionsText"/>
-	<xsl:param name="responsibleForText"/>
-	<xsl:param name="responsibleText"/>
-	<xsl:param name="reusableAssetsText"/>
-	<xsl:param name="riskLevelText"/>
-
-	<xsl:param name="roleSetsText"/>
-	<xsl:param name="rolesText"/>
-	<xsl:param name="scaleText"/>
-	<xsl:param name="scopeText"/>
-	<xsl:param name="skillsText"/>
-	<xsl:param name="staffingText"/>
-	<xsl:param name="stepsText"/>
-	<xsl:param name="subcategoriesText"/>
-	<xsl:param name="subdomainsText"/>
-	<xsl:param name="subPracticesText"/>
-	<xsl:param name="subTeamsText"/>
-	<xsl:param name="summaryText"/>
-	<xsl:param name="supportingMaterialsText"/>
-	<xsl:param name="synonymsText"/>
-	<xsl:param name="tailoringText"/>
-	<xsl:param name="tasksText"/>
-	<xsl:param name="tbsText"/>
-	<xsl:param name="teamProfileBreakdownText"/>
-	<xsl:param name="teamRolesText"/>
-	<xsl:param name="teamStructureText"/>
-	<xsl:param name="teamText"/>
-	<xsl:param name="techniquesText"/>
-	<xsl:param name="templatesText"/>
-	<xsl:param name="toolMentorsText"/>
-
-	<xsl:param name="typeofContractText"/>
-	<xsl:param name="typeText"/>
-	<xsl:param name="usageGuidanceText"/>
-	<xsl:param name="usageNotesText"/>
-	<xsl:param name="usageText"/>
-	<xsl:param name="wbsText"/>
-	<xsl:param name="whitepapersText"/>
-	<xsl:param name="workBreakdownText"/>
-	<xsl:param name="workflowText"/>
-	<xsl:param name="workProductBreakdownText"/>
-	<xsl:param name="workProductDependenciesText"/>
-	<xsl:param name="workProductsText"/>
-	<xsl:param name="workProductTypesText"/>
-	<xsl:param name="wpbsText"/>
-
-	<xsl:param name="activityReferencesText"/>
-	<xsl:param name="colon_with_space"/>
-	<xsl:param name="subdisciplinesText"/>
-	<xsl:param name="representationText"/>
-	<xsl:param name="extendsReplacesText"/>
-
-	<xsl:param name="workProductText"/>
-	<xsl:param name="processUsageText"/>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/role.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/role.xsl
deleted file mode 100644
index f8987f3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/role.xsl
+++ /dev/null
@@ -1,208 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="illustration.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-	<xsl:include href="descriptor_helper.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="roleDescription" select="$presentation/Element[@Type='RoleDescription']"/>
-		<xsl:variable name="roleSets" select="referenceList[@name='roleSets']/Element[@Type='RoleSet']"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-
-		<html>	
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<meta name="role" content="{$elementPresentationName}"/>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">	
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$roleDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="illustrationsSection"/>
-							<xsl:call-template name="staffingSection"/>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$roleDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="additionallyPerforms" select="referenceList[@name='additionallyPerforms']/Element"/>
-		<xsl:variable name="modifies" select="referenceList[@name='modifies']/Element"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-				<tr>
-					<td class="sectionTableSingleCell" colspan="2" align="center">	
-						<xsl:value-of disable-output-escaping="yes" select="diagram"/>
-					</td>
-				</tr>
-				<xsl:call-template name="addReferences">
-					<xsl:with-param name="refName" select="$categoriesText"/>
-					<xsl:with-param name="refElement" select="$categories"/>
-				</xsl:call-template>
-				<xsl:call-template name="addReferences">
-					<xsl:with-param name="refName" select="$additionallyPerformsText"/>
-					<xsl:with-param name="refElement" select="$additionallyPerforms"/>
-				</xsl:call-template>
-				<xsl:call-template name="addReferences">
-					<xsl:with-param name="refName" select="$modifiesText"/>
-					<xsl:with-param name="refElement" select="$modifies"/>
-				</xsl:call-template>	
-				<xsl:call-template name="addDescriptors">
-					<xsl:with-param name="descriptors" select="referenceList[@name='descriptors']/Element"/>
-					<xsl:with-param name="colspan" select="'1'"/>
-				</xsl:call-template>
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<xsl:variable name="checklists" select="referenceList/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList/Element[@Type='Concept']"/>
-		<xsl:variable name="guidelines" select="referenceList/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList/Element[@Type='SupportingMaterial']"/>
-		<xsl:variable name="whitePapers" select="referenceList/Element[@Type='Whitepaper']"/>
-		
-		<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($whitePapers) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$moreInfoText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="$checklists"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="$concepts"/>
-					</xsl:call-template>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="$guidelines"/>
-					</xsl:call-template>
-					<xsl:call-template name="addSupportingMaterials">
-						<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="$whitePapers"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="staffingSection">
-		<xsl:variable name="skills" select="reference/Element/attribute[@name='skills']"/>
-		<xsl:variable name="assignmentApproaches" select="reference/Element/attribute[@name='assignmentApproaches']"/>
-		<xsl:variable name="synonyms" select="reference/Element/attribute[@name='synonyms']"/>
-		
-		<xsl:if test="$skills != '' or $assignmentApproaches != '' or $synonyms != '' " >
-			<div class="sectionHeading"><xsl:value-of select="$staffingText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$skills != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$skillsText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$skills"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$assignmentApproaches != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$assignmentApproachesText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$assignmentApproaches"/>
-							</td>
-						</tr>
-					</xsl:if>			
-					<xsl:if test="$synonyms != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$synonymsText"/></th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$synonyms"/>
-							</td>
-						</tr>
-					</xsl:if>		
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/role_descriptor.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/role_descriptor.xsl
deleted file mode 100644
index 9ef88b2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/role_descriptor.xsl
+++ /dev/null
@@ -1,336 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="descriptor.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element[@Type='RoleDescriptor']"/>
-		<xsl:variable name="roleDescription" select="$presentation/Element[@Type='RoleDescription']"/>
-		<xsl:variable name="descriptorDescription" select="$presentation/Element[@Type='DescriptorDescription']"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title>
-					<xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/>
-				</title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, defaultQueryStr, false, true, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="refinedDescriptionSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="propertiesSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="usageSection">
-								<xsl:with-param name="contentDescription" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="illustrationsSection"/>
-							<xsl:call-template name="staffingSection"/>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>
-					</tr>
-				</table>
-			</body>
-			<script language="JavaScript" type="text/javascript">
-				contentPage.onload();
-				contentPage.processPage.fixDescriptorLinks();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="propertiesSection">
-		<xsl:param name="contentDescription"/>
-		<div class="sectionHeading">
-			<xsl:value-of select="$propertiesText"/>
-		</div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-				<xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$multipleOccurrencesText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='hasMultipleOccurrences']"/>
-				</xsl:call-template>
-				<xsl:if test="attribute[@name='isOptional']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$optionalText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOptional']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isPlanned']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$plannedText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isPlanned']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='PlanningData']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$planningDataText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='PlanningData']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="referenceList[@name='linkToPredecessor']/Element">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$predecessorText"/>
-						<xsl:with-param name="refElement" select="referenceList[@name='linkToPredecessor']/Element"/>
-					</xsl:call-template>
-				</xsl:if>
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="usageSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:variable name="usageGuidance" select="$contentDescription/attribute[@name='usageGuidance']"/>
-		<xsl:if test="$usageGuidance != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$usageGuidanceText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableCell">
-							<xsl:value-of disable-output-escaping="yes" select="$usageGuidance"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="performs" select="referenceList[@name='RoleDescriptor_PrimaryTaskDescriptors']/Element"/>
-		<xsl:variable name="responsibleFor" select="referenceList[@name='responsibleFor']/Element"/>
-		<xsl:variable name="additionallyPerforms" select="referenceList[@name='RoleDescriptor_AdditionalTaskDescriptors']/Element"/>
-		<xsl:variable name="modifies" select="referenceList[@name='modifies']/Element"/>
-		<div class="sectionHeading">
-			<xsl:value-of select="$relationshipsText"/>
-		</div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-				<tr>
-					<td class="sectionTableCell" valign="top">
-						<b><span class="sectionTableCellHeading">
-							<xsl:value-of select="$performsText"/>:</span></b>
-						<xsl:if test="count($performs) > 0">
-							<ul>
-								<xsl:for-each select="$performs">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</xsl:if>
-					</td>
-					<td class="sectionTableCell" valign="top">
-						<b><span class="sectionTableCellHeading">
-							<xsl:value-of select="$responsibleForText"/>:</span></b>
-						<xsl:if test="count($responsibleFor) > 0">
-							<ul>
-								<xsl:for-each select="$responsibleFor">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</xsl:if>
-					</td>
-				</tr>
-				<tr>
-					<td class="sectionTableCell" valign="top">
-						<b><span class="sectionTableCellHeading">
-							<xsl:value-of select="$additionallyPerformsText"/>:</span></b>
-						<xsl:if test="count($additionallyPerforms) > 0">
-							<ul>
-								<xsl:for-each select="$additionallyPerforms">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</xsl:if>
-					</td>
-					<td class="sectionTableCell" valign="top">
-						<b><span class="sectionTableCellHeading">
-							<xsl:value-of select="$modifiesText"/>:</span></b>
-						<xsl:if test="count($modifies) > 0">
-							<ul>
-								<xsl:for-each select="$modifies">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-						</xsl:if>
-					</td>
-				</tr>
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<xsl:variable name="checklists" select="referenceList/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList/Element[@Type='Concept']"/>
-		<xsl:variable name="guidelines" select="referenceList/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList/Element[@Type='SupportingMaterial']"/>
-		<xsl:variable name="whitePapers" select="referenceList/Element[@Type='Whitepaper']"/>
-		<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($whitePapers) > 0">
-			<div class="sectionHeading">
-				<xsl:value-of select="$moreInfoText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="$checklists"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="$concepts"/>
-					</xsl:call-template>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="$guidelines"/>
-					</xsl:call-template>
-					<xsl:call-template name="addSupportingMaterials">
-						<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="$whitePapers"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="staffingSection">
-		<xsl:variable name="skills" select="reference/Element/attribute[@name='skills']"/>
-		<xsl:variable name="assignmentApproaches" select="reference/Element/attribute[@name='assignmentApproaches']"/>
-		<xsl:variable name="synonyms" select="reference/Element/attribute[@name='synonyms']"/>
-		<xsl:if test="$skills != '' or $assignmentApproaches != '' or $synonyms != '' ">
-			<div class="sectionHeading">
-				<xsl:value-of select="$staffingText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$skills != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row">
-								<xsl:value-of select="$skillsText"/>
-							</th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$skills"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$assignmentApproaches != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row">
-								<xsl:value-of select="$assignmentApproachesText"/>
-							</th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$assignmentApproaches"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$synonyms != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row">
-								<xsl:value-of select="$synonymsText"/>
-							</th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$synonyms"/>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/summary.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/summary.xsl
deleted file mode 100644
index 99930d7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/summary.xsl
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>		
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/><xsl:variable name="presentationName" select="@DisplayName"/>	
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementType"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>				
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-			<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<a name="Top"/>
-							<xsl:call-template name="summaryOverview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>							
-							<xsl:for-each select="referenceList">
-								<xsl:if test="count(Element) > 0">
-									<h2 class="banner"><xsl:value-of select="@name"/></h2>
-									<ul>
-										<xsl:for-each select="Element">
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="$backPath"/><xsl:value-of select="@Url"/></xsl:attribute> <xsl:value-of select="@TypeName"/><xsl:value-of select="$colon_with_space"/><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>
-									</ul>
-									<p/>
-								</xsl:if>
-							</xsl:for-each>													
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="summaryOverview">
-		<xsl:param name="elementType"/>
-		<xsl:param name="elementTypeName"/>
-		<xsl:param name="elementPresentationName"/>
-		<xsl:param name="elementIcon"/>
-		<xsl:variable name="briefDescription" select="attribute[@name='briefDescription']"/>		
-		<xsl:variable name="synonyms" select="reference/Element/attribute[@name='synonyms']"/>
-		<xsl:variable name="externalId" select="reference/Element/attribute[@name='externalId']"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		
-		<table border="0" cellspacing="0" cellpadding="0">
-			<tr>
-				<td class="pageTitle">
-					<xsl:value-of select="$summaryText"/><xsl:value-of select="$colon_with_space"/><xsl:value-of select="$elementPresentationName"/>
-					<xsl:if test="$externalId != ''">
-						(<xsl:value-of select="$externalId"/>)
-					</xsl:if>
-				</td>
-			</tr>
-		</table>
-		<table width="100%" border="0" cellpadding="0" cellspacing="0">
-			<tr>
-				<td class="pageTitleSeparator">
-					<img src="{$imagePath}shim.gif" alt="" title="" height="1"/>
-				</td>
-			</tr>
-		</table>		
-	</xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/tailoring.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/tailoring.xsl
deleted file mode 100644
index 3871cf9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/tailoring.xsl
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:template name="tailoringSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="impactOfNotHaving" select="$description/attribute[@name='impactOfNotHaving']"/>
-		<xsl:variable name="reasonsForNotNeeding" select="$description/attribute[@name='reasonsForNotNeeding']"/>
-		<xsl:variable name="representationOptions" select="$description/attribute[@name='representationOptions']"/>
-		<xsl:if test="$impactOfNotHaving != '' or $reasonsForNotNeeding != '' or $representationOptions != ''">
-			<div class="sectionHeading">
-				<xsl:value-of select="$tailoringText"/>
-			</div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="$impactOfNotHaving != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row">
-								<xsl:value-of select="$impactOfNotHavingText"/>
-							</th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$impactOfNotHaving"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$reasonsForNotNeeding != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row">
-								<xsl:value-of select="$reasonsForNotNeedingText"/>
-							</th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$reasonsForNotNeeding"/>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="$representationOptions != ''">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row">
-								<xsl:value-of select="$representationOptionsText"/>
-							</th>
-							<td class="sectionTableCell">
-								<xsl:value-of disable-output-escaping="yes" select="$representationOptions"/>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/task.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/task.xsl
deleted file mode 100644
index 316e6af..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/task.xsl
+++ /dev/null
@@ -1,357 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-		
-				
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="mapping.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="purpose.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="illustration.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-	<xsl:include href="descriptor_helper.xsl"/>
-	
-		
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="taskDescription" select="$presentation/Element[@Type='TaskDescription']"/>
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="performingRole" select="reference[@name='performedBy']/Element[@Type='Role']"/>
-			
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type"> 
-					<xsl:call-template name="mapping">
-						<xsl:with-param name="elementType" select="$elementType"/>
-					</xsl:call-template>
-				</meta>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$performingRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, '', true, false, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>
-							<xsl:call-template name="purposeSection">
-								<xsl:with-param name="description" select="$taskDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$taskDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="stepsSection">
-								<xsl:with-param name="description" select="$taskDescription"/>
-							</xsl:call-template>	
-							<xsl:call-template name="illustrationsSection"/>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$taskDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="alternativesSection">
-								<xsl:with-param name="description" select="$taskDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-			</script>
-
-		</html>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="performingRole" select="reference[@name='performedBy']/Element[@Type='Role']"/>
-		<xsl:variable name="performingRoleName" select="$performingRole/@DisplayName"/>
-		<xsl:variable name="additionallyPerformedBy" select="referenceList[@name='additionallyPerformedBy']/Element"/>
-		<xsl:variable name="mandatoryInputs" select="referenceList[@name='mandatoryInput']/Element"/>
-		<xsl:variable name="optionalInputs" select="referenceList[@name='optionalInput']/Element"/>
-		<xsl:variable name="outputs" select="referenceList[@name='output']/Element"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-
-		<xsl:if test="$performingRoleName != '' or count($categories) + count($additionallyPerformedBy) + count($mandatoryInputs) + count($optionalInputs) + count($outputs) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="count($categories) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$categoriesText"/></th>
-							<td class="sectionTableCell" colspan="2">
-							<ul>
-								<xsl:for-each select="$categories">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>				
-					
-					<xsl:if test="$performingRoleName != '' or count($additionallyPerformedBy) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$rolesText"/></th>
-							<td class="sectionTableCell" width="42%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$primaryPerformerText"/>:
-								</span>
-								<xsl:if test="$performingRoleName">
-									<ul>
-										<li>
-											<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="$performingRole/@Url"/></xsl:attribute><xsl:value-of select="$performingRoleName"/></a>
-										</li>
-									</ul>
-								</xsl:if>
-							</td>
-							<td class="sectionTableCell">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$additionalPerformerText"/>:
-								</span>
-								<xsl:if test="count($additionallyPerformedBy) > 0">									
-								<ul>
-									<xsl:for-each select="$additionallyPerformedBy">
-									<xsl:sort select="@DisplayName"/>
-										<li>
-											<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-										</li>
-									</xsl:for-each>
-								</ul>
-								</xsl:if>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($mandatoryInputs) + count($optionalInputs) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$inputsText"/></th>
-							<td class="sectionTableCell" width="42%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$mandatoryText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($mandatoryInputs) > 0">
-										<ul>
-										<xsl:for-each select="$mandatoryInputs">		
-										<xsl:sort select="@DisplayName"/>								
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-										</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>									
-									</ul>
-									</xsl:otherwise>
-								</xsl:choose>
-							</td>
-							<td class="sectionTableCell">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$optionalText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($optionalInputs) > 0">
-										<ul>
-										<xsl:for-each select="$optionalInputs">				
-										<xsl:sort select="@DisplayName"/>						
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-										</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>									
-									</ul>
-									</xsl:otherwise>
-								</xsl:choose>
-							</td>					
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($outputs) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$outputsText"/></th>
-							<td class="sectionTableCell" colspan="2">
-								<ul>
-								<xsl:for-each select="$outputs">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/>
-												<xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-								</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					
-					<xsl:call-template name="addDescriptors">
-						<xsl:with-param name="descriptors" select="referenceList[@name='descriptors']/Element"/>
-						<xsl:with-param name="colspan" select="'2'"/>
-					</xsl:call-template>
-					
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<xsl:variable name="checklists" select="referenceList/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList/Element[@Type='Concept']"/>	
-		<xsl:variable name="guidelines" select="referenceList/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList/Element[@Type='SupportingMaterial']"/>
-		<xsl:variable name="toolMentors" select="referenceList/Element[@Type='ToolMentor']"/>
-		<xsl:variable name="whitePapers" select="referenceList/Element[@Type='Whitepaper']"/>		
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-		<xsl:variable name="estimationConsiderations" select="referenceList/Element[@Type='EstimationConsiderations']"/>
-
-		<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($toolMentors) + count($whitePapers) + count($estimationConsiderations) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$moreInfoText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="$checklists"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="$concepts"/>
-					</xsl:call-template>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="$guidelines"/>
-					</xsl:call-template>
-					<xsl:call-template name="addSupportingMaterials">
-						<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-					</xsl:call-template>
-					<xsl:call-template name="addToolMentors">
-						<xsl:with-param name="toolMentors" select="$toolMentors"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="$whitePapers"/>
-					</xsl:call-template>
-					<xsl:call-template name="addEstimationConsiderations">
-						<xsl:with-param name="estimationConsiderations" select="$estimationConsiderations"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="stepsSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="sections" select="$description/referenceList[@name='sections']/Element[@Type='Section']"/>
-		<xsl:if test="count($sections) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$stepsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr>
-						<td class="sectionTableSingleCell">
-							<xsl:for-each select="$sections">
-								<div class="stepHeading"><xsl:value-of select="attribute[@name='name']"/></div>
-								<div class="stepContent">
-									<table class="stepTable" border="0" cellspacing="0" cellpadding="0">
-										<tr valign="top">
-											<td>
-												<xsl:value-of disable-output-escaping="yes" select="attribute[@name='sectionDescription']"/>
-											</td>
-										</tr>
-									</table>
-								</div>						
-							</xsl:for-each>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="alternativesSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="alternatives" select="$description/attribute[@name='alternatives']"/>
-		<xsl:if test="$alternatives != '' ">
-			<div class="sectionHeading"><xsl:value-of select="$alternativesText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$alternatives"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/task_descriptor.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/task_descriptor.xsl
deleted file mode 100644
index 8a3fb1b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/task_descriptor.xsl
+++ /dev/null
@@ -1,430 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="descriptor.xsl"/>
-	<xsl:include href="purpose.xsl"/>
-	<xsl:include href="guidance_helper.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementId" select="@Id"/>
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="descriptorDescription" select="$presentation/Element[@Type='DescriptorDescription']"/>		
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="performingRole" select="reference[@name='performedPrimarilyBy']/Element[@Type='RoleDescriptor']"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>		
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="uma.guid" content="{$elementId}"/>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<meta name="role">
-					<xsl:attribute name="content"><xsl:value-of select="$performingRole/@DisplayName"/></xsl:attribute>
-				</meta>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, defaultQueryStr, true, true, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>								
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>		
-							<xsl:call-template name="purposeSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="refinedDescriptionSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="stepsSection"/>
-							<xsl:call-template name="propertiesSection"/>
-							<xsl:call-template name="usageSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="illustrationsSection"/>
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="alternativesSection">
-								<xsl:with-param name="description" select="$descriptorDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="moreInfoSection"/>
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-				<script language="JavaScript" type="text/javascript">
-					contentPage.onload();
-					contentPage.processPage.fixDescriptorLinks();
-				</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="propertiesSection">
-		<xsl:param name="contentDescription"/>
-		<div class="sectionHeading"><xsl:value-of select="$propertiesText"/></div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-			    <xsl:if test="referenceList[@name='linkToPredecessor']/Element">
-					<xsl:call-template name="addReferences">
-						<xsl:with-param name="refName" select="$predecessorText"/>
-						<xsl:with-param name="refElement" select="referenceList[@name='linkToPredecessor']/Element"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='PlanningData']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$planningDataText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='PlanningData']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$multipleOccurrencesText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='hasMultipleOccurrences']"/>
-				</xsl:call-template>
-				<xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$eventDrivenText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='isEventDriven']"/>
-				</xsl:call-template>
-				<xsl:if test="attribute[@name='isOngoing']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$ongoingText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOngoing']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isOptional']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$optionalText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOptional']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isPlanned']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$plannedText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isPlanned']"/>
-					</xsl:call-template>
-				</xsl:if>				
-				<xsl:if test="attribute[@name='isRepeatable']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$repeatableText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isRepeatable']"/>
-					</xsl:call-template>
-				</xsl:if>				
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="usageSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="usageGuidance" select="$description/attribute[@name='usageGuidance']"/>
-		<xsl:if test="$usageGuidance != ''">
-			<div class="sectionHeading"><xsl:value-of select="$usageGuidanceText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$usageGuidance"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>	
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="performingRole" select="reference[@name='performedPrimarilyBy']/Element[@Type='RoleDescriptor']"/>
-		<xsl:variable name="additionallyPerformedBy" select="referenceList[@name='additionallyPerformedBy']/Element"/>
-		<xsl:variable name="assistedBy" select="referenceList[@name='assistedBy']/Element"/>
-		<xsl:variable name="mandatoryInputs" select="referenceList[@name='mandatoryInput']/Element"/>
-		<xsl:variable name="optionalInputs" select="referenceList[@name='optionalInput']/Element"/>
-		<xsl:variable name="externalInput" select="referenceList[@name='externalInput']/Element"/>
-		<xsl:variable name="outputs" select="referenceList[@name='output']/Element"/>
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-
-		<xsl:if test="count($performingRole) + count($additionallyPerformedBy) + count($mandatoryInputs) + count($optionalInputs) + count($outputs) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">					
-					<tr valign="top">
-						<th class="sectionTableHeading" scope="row"><xsl:value-of select="$rolesText"/></th>
-						<td class="sectionTableCell" width="30%">
-							<span class="sectionTableCellHeading">
-								<xsl:value-of select="$mainText"/>:
-							</span>
-							<xsl:if test="count($performingRole) > 0">
-								<ul>
-									<li>
-										<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="$performingRole/@Url"/></xsl:attribute><xsl:value-of select="$performingRole/@DisplayName"/></a>
-									</li>
-								</ul>
-							</xsl:if>
-						</td>
-						<td class="sectionTableCell" width="30%">	
-							<span class="sectionTableCellHeading">							
-								<xsl:value-of select="$additionalText"/>:
-							</span>
-							<xsl:if test="count($additionallyPerformedBy) > 0">
-							<ul>
-								<xsl:for-each select="$additionallyPerformedBy">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</xsl:if>
-						</td>
-						<td class="sectionTableCell">
-							<span class="sectionTableCellHeading">
-								<xsl:value-of select="$assistingText"/>:
-							</span>
-							<xsl:if test="count($assistedBy) > 0">									
-							<ul>
-								<xsl:for-each select="$assistedBy">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</xsl:if>
-						</td>
-					</tr>					
-					<xsl:if test="count($mandatoryInputs) + count($optionalInputs) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$inputsText"/></th>
-							<td class="sectionTableCell" width="30%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$mandatoryText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($mandatoryInputs) > 0">
-									<ul>
-										<xsl:for-each select="$mandatoryInputs">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-									</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>
-									</ul>									
-									</xsl:otherwise>									
-								</xsl:choose>
-							</td>
-							<td class="sectionTableCell" width="30%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$optionalText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($optionalInputs) > 0">
-									<ul>
-										<xsl:for-each select="$optionalInputs">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-									</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>
-									</ul>									
-									</xsl:otherwise>									
-								</xsl:choose>
-							</td>
-							<td class="sectionTableCell">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$externalText"/>:
-								</span>
-								<xsl:choose>
-									<xsl:when test="count($externalInput) > 0">
-									<ul>
-										<xsl:for-each select="$externalInput">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>							
-									</ul>
-									</xsl:when>				
-									<xsl:otherwise>
-									<ul>
-										<li>
-											<xsl:value-of select="$noneText"/>
-										</li>
-									</ul>									
-									</xsl:otherwise>									
-								</xsl:choose>
-							</td>					
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($outputs) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$outputsText"/></th>
-							<td class="sectionTableCell" colspan="3">
-								<ul>
-								<xsl:for-each select="$outputs">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/>
-												<xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-								</ul>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="stepsSection">
-		<xsl:variable name="sections" select="referenceList[@name='selectedSteps']/Element[@Type='Section']"/>
-		<xsl:if test="count($sections) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$stepsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr>
-						<td class="sectionTableCell">
-							<xsl:for-each select="$sections">
-								<div class="stepHeading"><xsl:value-of select="attribute[@name='name']"/></div>
-								<div class="stepContent">
-									<table class="stepTable" border="0" cellspacing="0" cellpadding="0">
-										<tr valign="top">
-											<td>
-												<xsl:value-of disable-output-escaping="yes" select="attribute[@name='sectionDescription']"/>
-											</td>
-										</tr>
-									</table>
-								</div>						
-							</xsl:for-each>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<xsl:variable name="checklists" select="referenceList/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList/Element[@Type='Concept']"/>	
-		<xsl:variable name="guidelines" select="referenceList/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList/Element[@Type='SupportingMaterial']"/>
-		<xsl:variable name="toolMentors" select="referenceList/Element[@Type='ToolMentor']"/>
-		<xsl:variable name="whitePapers" select="referenceList/Element[@Type='Whitepaper']"/>		
-		<xsl:variable name="imagePath" select="concat(/Element/@BackPath, 'images/')"/>
-
-		<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($toolMentors) + count($whitePapers) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$moreInfoText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="$checklists"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="$concepts"/>
-					</xsl:call-template>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="$guidelines"/>
-					</xsl:call-template>
-					<xsl:call-template name="addSupportingMaterials">
-						<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-					</xsl:call-template>
-					<xsl:call-template name="addToolMentors">
-						<xsl:with-param name="toolMentors" select="$toolMentors"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="$whitePapers"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="alternativesSection">
-		<xsl:param name="description"/>
-		<xsl:variable name="alternatives" select="$description/attribute[@name='alternatives']"/>
-		<xsl:if test="$alternatives != '' ">
-			<div class="sectionHeading"><xsl:value-of select="$alternativesText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<tr valign="top">
-						<td class="sectionTableSingleCell">
-							<xsl:value-of disable-output-escaping="yes" select="$alternatives"/>
-						</td>
-					</tr>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/teamprofile.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/teamprofile.xsl
deleted file mode 100644
index f0f0610..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/teamprofile.xsl
+++ /dev/null
@@ -1,202 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="main_description.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="property.xsl"/>
-
-	<xsl:template match="/Element">
-		<xsl:variable name="elementType" select="@Type"/>
-		<xsl:variable name="elementTypeName" select="@TypeName"/>
-		<xsl:variable name="elementName" select="@Name"/>
-		<xsl:variable name="elementPresentationName" select="@DisplayName"/>
-		<xsl:variable name="backPath" select="@BackPath"/>
-		<xsl:variable name="imagePath" select="concat($backPath, 'images/')"/>
-	    <xsl:variable name="shapeImage" select="concat($backPath,@ShapeiconUrl)"/>
-		<xsl:variable name="presentation" select="reference[@name='presentation']"/>
-		<xsl:variable name="contentDescription" select="$presentation/Element[@Type='BreakdownElementDescription']"/>
-		<xsl:variable name="breakdownElementDescription" select="$presentation/Element[@Type='BreakdownElementDescription']"/>
-		<xsl:variable name="descriptorDescription" select="$presentation/Element[@Type='DescriptorDescription']"/>		
-		<xsl:variable name="copyright" select="copyright"/>
-		<xsl:variable name="showTreeBrowser" select="@showTreeBrowser"/>
-		<xsl:variable name="queryString" select="@queryString"/>
-		<xsl:variable name="relProcessPath" select="@relProcessPath"/>
-
-		<html>	
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<title><xsl:value-of select="$elementTypeName"/>: <xsl:value-of select="$elementPresentationName"/></title>
-				<xsl:call-template name="umaMetaTags">
-					<xsl:with-param name="elementType" select="$elementType"/>
-					<xsl:with-param name="elementName" select="$elementName"/>
-					<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-				</xsl:call-template>
-				<meta name="element_type" content="{$elementType}"/>
-				<meta name="filetype" content="description"/>
-				<link rel="StyleSheet" href="{$backPath}css/default.css" type="text/css"/>
-				<script src="{$backPath}scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ActivityTreeTable.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ProcessElementPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-				<script src="{$backPath}scripts/processElementData.js" type="text/javascript" language="JavaScript"></script>
-				<script type="text/javascript" language="JavaScript">
-					var defaultQueryStr = '<xsl:value-of select="$queryString"/>';
-					var backPath = '<xsl:value-of select="$backPath"/>';
-					var imgPath = '<xsl:value-of select="$imagePath"/>';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo, defaultQueryStr, false, true, false);
-				</script>
-			</head>
-			<body>
-			<div id="breadcrumbs"></div>
-				<table border="0" cellpadding="0" cellspacing="0" width="100%">
-					<tr>
-						<td valign="top">	
-							<a name="Top"/>
-							<xsl:call-template name="overview">
-								<xsl:with-param name="elementType" select="$elementType"/>
-								<xsl:with-param name="elementTypeName" select="$elementTypeName"/>
-								<xsl:with-param name="elementPresentationName" select="$elementPresentationName"/>
-								<xsl:with-param name="elementIcon" select="$shapeImage"/>
-								<xsl:with-param name="backPath" select="$backPath"/>
-								<xsl:with-param name="showTreeBrowser" select="$showTreeBrowser"/>
-							</xsl:call-template>							
-							<xsl:call-template name="relationshipsSection"/>
-							<xsl:call-template name="mainDescriptionSection">
-								<xsl:with-param name="description" select="$breakdownElementDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="propertiesSection">
-								<xsl:with-param name="contentDescription" select="$contentDescription"/>
-							</xsl:call-template>
-							<xsl:call-template name="usageSection">
-								<xsl:with-param name="contentDescription" select="$breakdownElementDescription"/>
-							</xsl:call-template>							
-							<xsl:call-template name="keyConsiderationsSection">
-								<xsl:with-param name="description" select="$breakdownElementDescription"/>
-							</xsl:call-template>							
-							<xsl:call-template name="copyright">
-								<xsl:with-param name="copyright" select="$copyright"/>
-							</xsl:call-template>
-						</td>						
-					</tr>
-				</table>
-			</body>
-			<script language="JavaScript" type="text/javascript">
-				contentPage.onload();
-			</script>
-		</html>
-	</xsl:template>
-
-	<xsl:template name="propertiesSection">
-		<xsl:param name="contentDescription"/>
-		<div class="sectionHeading"><xsl:value-of select="$propertiesText"/></div>
-		<div class="sectionContent">
-			<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-			    <xsl:call-template name="property">
-					<xsl:with-param name="fieldLabel" select="$multipleOccurrencesText"/>
-					<xsl:with-param name="fieldText" select="attribute[@name='hasMultipleOccurrences']"/>
-				</xsl:call-template>
-				<xsl:if test="attribute[@name='isOptional']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$optionalText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isOptional']"/>
-					</xsl:call-template>
-				</xsl:if>
-				<xsl:if test="attribute[@name='isPlanned']">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="$plannedText"/>
-						<xsl:with-param name="fieldText" select="attribute[@name='isPlanned']"/>
-					</xsl:call-template>
-				</xsl:if>
-			</table>
-		</div>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="subTeams" select="referenceList[@name='subTeam']/Element"/>		
-		<xsl:variable name="teamRoles" select="referenceList[@name='teamRoles']/Element"/>
-			
-		<xsl:if test="count($subTeams) + count($teamRoles) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:if test="count($subTeams) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$subTeamsText"/></th>
-							<td class="sectionTableCell" colspan="3">
-							<ul>
-								<xsl:for-each select="$subTeams">
-									<xsl:sort data-type="text" select="@DisplayName" order="ascending" />
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($teamRoles) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$teamRolesText"/></th>
-							<td class="sectionTableCell" colspan="3">
-							<ul>
-								<xsl:for-each select="$teamRoles">
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="usageSection">
-		<xsl:param name="contentDescription"/>
-		<xsl:if test="$contentDescription/attribute[@name='usageGuidance'] != ''">
-			<div class="sectionHeading"><xsl:value-of select="$usageText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="property">
-						<xsl:with-param name="fieldLabel" select="'Usage Guidance'"/>
-						<xsl:with-param name="fieldText" select="$contentDescription/attribute[@name='usageGuidance']"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/workproduct.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/workproduct.xsl
deleted file mode 100644
index c8a052e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/workproduct.xsl
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:include href="resources.xsl"/>
-	<xsl:include href="common.xsl"/>
-	<xsl:include href="overview.xsl"/>
-	<xsl:include href="purpose.xsl"/>
-	<xsl:include href="key_consideration.xsl"/>
-	<xsl:include href="tailoring.xsl"/>
-	<xsl:include href="workproduct_helper.xsl"/>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/layout/xsl/workproduct_helper.xsl b/1.5/plugins/org.eclipse.epf.library/layout/xsl/workproduct_helper.xsl
deleted file mode 100644
index b72b491..0000000
--- a/1.5/plugins/org.eclipse.epf.library/layout/xsl/workproduct_helper.xsl
+++ /dev/null
@@ -1,250 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-	<xsl:include href="guidance_helper.xsl"/>
-	<xsl:include href="descriptor_helper.xsl"/>
-
-	<xsl:template name="workProductIllustrationsSection">
-		<xsl:variable name="templates" select="referenceList/Element[@Type='Template']"/>
-		<xsl:variable name="reports" select="referenceList/Element[@Type='Report']"/>
-		<xsl:variable name="examples" select="referenceList/Element[@Type='Example']"/>
-		<xsl:variable name="reusableAssets" select="referenceList/Element[@Type='ReusableAsset']"/>	
-		<xsl:if test="count($templates) + count($reports) + count($examples) + count($reusableAssets) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$illustrationsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addTemplates">
-						<xsl:with-param name="templates" select="$templates"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReports">
-						<xsl:with-param name="reports" select="$reports"/>
-					</xsl:call-template>
-					<xsl:call-template name="addExamples">
-						<xsl:with-param name="examples" select="$examples"/>
-					</xsl:call-template>
-					<xsl:call-template name="addReusableAssets">
-						<xsl:with-param name="reusableAssets" select="$reusableAssets"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="relationshipsSection">
-		<xsl:variable name="containerArtifact" select="reference[@name='containerArtifact']/Element"/>
-		<xsl:variable name="containedArtifacts" select="referenceList[@name='containedArtifacts']/Element[@Type='Artifact']"/>
-		<xsl:variable name="responsibleRoles" select="referenceList[@name='responsibleRoles']/Element[@Type='Role']"/>
-		<xsl:variable name="modifyRoles" select="referenceList[@name='modifyRoles']/Element"/>		
-		<xsl:variable name="mandatoryInputToTasks" select="referenceList[@name='mandatoryInputToTasks']/Element[@Type='Task']"/>
-		<xsl:variable name="optionalInputToTasks" select="referenceList[@name='optionalInputToTasks']/Element[@Type='Task']"/>
-		<xsl:variable name="outputFromTasks" select="referenceList[@name='outputFromTasks']/Element[@Type='Task']"/>
-		<xsl:variable name="categories" select="referenceList[@name='ContentElement_CustomCategories']/Element"/>
-		
-		<xsl:if test="count($categories) + count($responsibleRoles) + count($containerArtifact) + count($containedArtifacts) + count($mandatoryInputToTasks) + count($optionalInputToTasks) + count($outputFromTasks) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$relationshipsText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-
-					<xsl:if test="count($categories) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$categoriesText"/></th>
-							<td class="sectionTableCell" colspan="2">
-							<ul>
-								<xsl:for-each select="$categories">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>				
-					
-					<xsl:if test="count($containerArtifact) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$containerArtifactText"/></th>
-							<td class="sectionTableCell" colspan="2">
-							<ul>
-								<xsl:for-each select="$containerArtifact">
-								<xsl:sort select="@DisplayName"/>
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>				
-					<xsl:if test="count($containedArtifacts) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$containedArtifactsText"/></th>
-							<td class="sectionTableCell" colspan="2">
-							<ul>
-								<xsl:for-each select="$containedArtifacts">
-									<xsl:sort data-type="text" select="@DisplayName" order="ascending" />
-									<li>
-										<a>
-											<xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute>											
-											<xsl:value-of select="@DisplayName"/>
-										</a>
-									</li>
-								</xsl:for-each>
-							</ul>
-							</td>
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($responsibleRoles) + count($modifyRoles) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$rolesText"/></th>
-							<td class="sectionTableCell" width="42%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$responsibleText"/>:
-								</span>
-								<xsl:if test="count($responsibleRoles) > 0">
-								<ul>
-									<xsl:for-each select="$responsibleRoles">
-									<xsl:sort select="@DisplayName"/>
-										<li>
-											<xsl:call-template name="addElementWithLink">
-												<xsl:with-param name="element" select="."/>
-											</xsl:call-template>
-										</li>
-									</xsl:for-each>
-								</ul>
-								</xsl:if>
-							</td>
-							<td class="sectionTableCell">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$modifiedByText"/>:
-								</span>
-								<xsl:if test="count($modifyRoles) > 0">									
-								<ul>
-									<xsl:for-each select="$modifyRoles">
-									<xsl:sort select="@DisplayName"/>
-										<li>
-											<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-										</li>
-									</xsl:for-each>
-								</ul>
-								</xsl:if>
-							</td>							
-						</tr>
-					</xsl:if>
-					<xsl:if test="count($mandatoryInputToTasks) + count($optionalInputToTasks) + count($outputFromTasks) > 0">
-						<tr valign="top">
-							<th class="sectionTableHeading" scope="row"><xsl:value-of select="$tasksText"/></th>
-							<td class="sectionTableCell" width="42%">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$inputToText"/>:
-								</span>
-								<xsl:if test="count($mandatoryInputToTasks) + count($optionalInputToTasks) > 0">
-								    <xsl:if test="count($mandatoryInputToTasks) > 0">
-									<ul>
-										<xsl:for-each select="$mandatoryInputToTasks">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>
-									</ul>
-									</xsl:if>
-									<xsl:if test="count($optionalInputToTasks) > 0">
-									  <xsl:if test="count($mandatoryInputToTasks) > 0"><br/></xsl:if>
-									<ul>		
-										<xsl:for-each select="$optionalInputToTasks">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>										
-									</ul>
-									</xsl:if>
-								</xsl:if>
-							</td>
-							<td class="sectionTableCell">
-								<span class="sectionTableCellHeading">
-									<xsl:value-of select="$outputFromText"/>:
-								</span>
-								<xsl:if test="count($outputFromTasks) > 0">									
-									<ul>
-										<xsl:for-each select="$outputFromTasks">
-										<xsl:sort select="@DisplayName"/>
-											<li>
-												<a><xsl:attribute name="href"><xsl:value-of select="/Element/@BackPath"/><xsl:value-of select="@Url"/></xsl:attribute><xsl:value-of select="@DisplayName"/></a>
-											</li>
-										</xsl:for-each>
-									</ul>
-								</xsl:if>
-							</td>							
-						</tr>
-					</xsl:if>
-					
-					<xsl:call-template name="addDescriptors">
-						<xsl:with-param name="descriptors" select="referenceList[@name='descriptors']/Element"/>
-						<xsl:with-param name="colspan" select="'2'"/>
-					</xsl:call-template>
-
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-	<xsl:template name="moreInfoSection">
-		<xsl:variable name="checklists" select="referenceList/Element[@Type='Checklist']"/>
-		<xsl:variable name="concepts" select="referenceList/Element[@Type='Concept']"/>
-		<xsl:variable name="guidelines" select="referenceList/Element[@Type='Guideline']"/>
-		<xsl:variable name="supportingMaterials" select="referenceList/Element[@Type='SupportingMaterial']"/>
-		<xsl:variable name="toolMentors" select="referenceList/Element[@Type='ToolMentor']"/>
-		<xsl:variable name="whitePapers" select="referenceList/Element[@Type='Whitepaper']"/>
-		<xsl:variable name="estimationConsiderations" select="referenceList/Element[@Type='EstimationConsiderations']"/>
-		
-		<xsl:if test="count($checklists) + count($concepts) + count($guidelines) + count($supportingMaterials) + count($toolMentors) + count($whitePapers) + count($estimationConsiderations) > 0">
-			<div class="sectionHeading"><xsl:value-of select="$moreInfoText"/></div>
-			<div class="sectionContent">
-				<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
-					<xsl:call-template name="addChecklists">
-						<xsl:with-param name="checklists" select="$checklists"/>
-					</xsl:call-template>
-					<xsl:call-template name="addConcepts">
-						<xsl:with-param name="concepts" select="$concepts"/>
-					</xsl:call-template>
-					<xsl:call-template name="addGuidelines">
-						<xsl:with-param name="guidelines" select="$guidelines"/>
-					</xsl:call-template>
-					<xsl:call-template name="addSupportingMaterials">
-						<xsl:with-param name="supportingMaterials" select="$supportingMaterials"/>
-					</xsl:call-template>
-					<xsl:call-template name="addToolMentors">
-						<xsl:with-param name="toolMentors" select="$toolMentors"/>
-					</xsl:call-template>
-					<xsl:call-template name="addWhitePapers">
-						<xsl:with-param name="whitePapers" select="$whitePapers"/>
-					</xsl:call-template>
-					<xsl:call-template name="addEstimationConsiderations">
-						<xsl:with-param name="estimationConsiderations" select="$estimationConsiderations"/>
-					</xsl:call-template>
-				</table>
-			</div>
-		</xsl:if>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.library/plugin.properties b/1.5/plugins/org.eclipse.epf.library/plugin.properties
deleted file mode 100644
index d7bb053..0000000
--- a/1.5/plugins/org.eclipse.epf.library/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Library
-providerName=Eclipse.org
-
-# to anable the exted-replace feature
-#EnableExtendReplace=true
-
-
diff --git a/1.5/plugins/org.eclipse.epf.library/plugin.xml b/1.5/plugins/org.eclipse.epf.library/plugin.xml
deleted file mode 100644
index 0ea54fe..0000000
--- a/1.5/plugins/org.eclipse.epf.library/plugin.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.core.resources.natures"
-         id="project.MethodLibraryProjectNature"
-         name="Method Library Project Nature">
-      <runtime>
-         <run class="org.eclipse.epf.library.project.MethodLibraryProjectNature">
-         </run>
-      </runtime>
-   </extension>
-   
-   <extension-point
-         id="libraryManagers"
-         name="Method Library Managers"
-         schema="schema/LibraryManagers.exsd"/>
-   <extension-point id="elementLayoutExtensions" name="Element layout Extensions" schema="schema/elementLayoutExtensions.exsd"/>
-   <extension
-         point="org.eclipse.epf.library.edit.textReferenceReplacer">
-      <textReferenceReplacer class="org.eclipse.epf.library.util.TextReferenceReplacerImpl"/>
-   </extension>   
-   
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.library/schema/LibraryManagers.exsd b/1.5/plugins/org.eclipse.epf.library/schema/LibraryManagers.exsd
deleted file mode 100644
index c830fa5..0000000
--- a/1.5/plugins/org.eclipse.epf.library/schema/LibraryManagers.exsd
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library" id="libraryManagers" name="Method Library Manager Contributors"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to register a specific Library Manager implementation with the Library Service.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="libraryManager" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="libraryManager">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements a Library Manager. This class must be a public implementation of &lt;code&gt;org.eclipse.epf.library.ILibraryManager&lt;/code&gt; with a public 0-argument constructor.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The identifier of a specific method library type (database, xmi, etc.).
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="typeName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A translatable display name for the library type.
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="version" type="string">
-            <annotation>
-               <documentation>
-                  The version number of this library manager.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a Library Manager extension point: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.library.libraryManagers&quot;&gt;
-      &lt;libraryManager
-         class=&quot;org.eclipse.epf.library.xmi.XMILibraryManager&quot;
-         type=&quot;xmi&quot;
-         typeName=&quot;XMI&quot;&gt;
-      &lt;/libraryManager&gt;                                  
-   &lt;/extension&gt; 
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library/schema/elementLayoutExtensions.exsd b/1.5/plugins/org.eclipse.epf.library/schema/elementLayoutExtensions.exsd
deleted file mode 100644
index d91f85f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/schema/elementLayoutExtensions.exsd
+++ /dev/null
@@ -1,119 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.library">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.library" id="elementLayoutExtensions" name="Element layout Extensions"/>
-      </appInfo>
-      <documentation>
-         allow modify the element layout behavior by providing layout extensions. 
-
-The layout extension is Configuration specific by specifying a an MethodElementProperty key of the configuration that matches with the id attribute of each LayoutExtension.
-
-i.e., if the configuration has a MethodElementProperty key that matches with an LayoutExtension, that extension will be used.
-
-It is the user&apos;s responsibility to make sure the key is unique.
-
-the extension class should extends the org.eclipse.epf.library.layout.LayoutExtension class
-
-
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="LayoutExtension"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="LayoutExtension">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/AbstractLibraryManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/AbstractLibraryManager.java
deleted file mode 100644
index c79b199..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/AbstractLibraryManager.java
+++ /dev/null
@@ -1,1349 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.CreateChildCommand;
-import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.epf.common.preferences.IPropertyChangeEventWrapper;
-import org.eclipse.epf.common.preferences.IPropertyChangeListenerWrapper;
-import org.eclipse.epf.common.serviceability.DebugTrace;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.library.project.MethodLibraryProject;
-import org.eclipse.epf.library.services.LibraryModificationHelper;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.persistence.MultiFileXMISaveImpl;
-import org.eclipse.epf.persistence.refresh.IRefreshEvent;
-import org.eclipse.epf.persistence.refresh.IRefreshListener;
-import org.eclipse.epf.persistence.refresh.RefreshJob;
-import org.eclipse.epf.persistence.util.LibrarySchedulingRule;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.ui.IPropertyListener;
-
-/**
- * The abstract base class for a Library Manager. Concrete implementation of
- * ILibraryManager must be a subclass of this class.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @author Jinhua Xi
- * 
- * @since 1.0
- */
-public abstract class AbstractLibraryManager implements ILibraryManager {
-
-	public static final int PROP_DIRTY = 1;
-
-	/**
-	 * The library name.
-	 */
-	public static final String ARG_LIBRARY_NAME = "library.name"; //$NON-NLS-1$
-
-	public static final String ARG_LIBRARY_REGISTER_TYPE = "libraryRegisterType"; 	//$NON-NLS-1$
-	
-	// If true, generate debug traces.
-	protected static boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	// The managed library.
-	protected MethodLibrary library;	
-
-	// The default editing domain for the managed library.
-	protected AdapterFactoryEditingDomain editingDomain;
-
-	// A list of listeners that monitor changes to the managed library.
-	private List libraryChangedListeners = new ArrayList();
-
-	// remove this one since this may cause potential memory leak
-	// A list of listeners that have been detached from the managed library.
-	//private List detachedLibraryChangedListeners = new ArrayList();
-
-	// A list of listeners that monitor resource changes in the managed library.
-	private ListenerList resourceChangeListeners = new ListenerList();
-
-	// The save library options.
-	private Map saveOptions;
-
-	// If true, skip all event processing.
-	protected boolean skipEventProcessing = false;
-
-	// TODO: find a better way to notify the change in library instead of
-	// relying on the command stack listener
-	private CommandStackListener commandStackListener = new CommandStackListener() {
-		public void commandStackChanged(final EventObject event) {
-			if (debug) {
-				DebugTrace.print(this, "commandStackChanged", "event=" + event); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (!skipEventProcessing) {
-				SafeUpdateController.asyncExec(new Runnable() {
-					public void run() {
-						// Try to select the affected objects.
-						Command mostRecentCommand = LibraryUtil
-								.unwrap(((CommandStack) event.getSource())
-										.getMostRecentCommand());
-						if (mostRecentCommand != null) {
-							if (mostRecentCommand instanceof AddCommand) {
-								AddCommand cmd = (AddCommand) mostRecentCommand;
-								EObject owner = cmd.getOwner();
-
-								// need to send owner changed notification for
-								// all element types
-								// 
-								// 156028 - Reference from WP and Guidence was
-								// not detected
-								// when deselect the related element from
-								// configuration
-
-								Collection objs = new ArrayList();
-								objs.add(owner);
-								notifyListeners(
-										ILibraryChangeListener.OPTION_CHANGED,
-										objs);
-
-								if (!(owner instanceof MethodConfiguration)) {
-
-									objs = mostRecentCommand.getResult();
-
-									// Update the configuration selection if the
-									// object is a newly added method package.
-									if (owner instanceof MethodPackage) {
-										objs = LibraryUtil
-												.getContainedElements(owner,
-														objs);
-										if (!objs.isEmpty()) {
-											addNewPackagesToConfiguration(objs);
-										}
-									}
-									notifyListeners(
-											ILibraryChangeListener.OPTION_NEWCHILD,
-											objs);
-								}
-							} else if (mostRecentCommand instanceof PasteFromClipboardCommand) {
-								Collection objs = mostRecentCommand.getResult();
-								notifyListeners(
-										ILibraryChangeListener.OPTION_NEWCHILD,
-										objs);
-								PasteFromClipboardCommand cmd = ((PasteFromClipboardCommand) mostRecentCommand);
-
-								// Update the configuration selection if the
-								// object is a newly added method package.
-								if (cmd.getOwner() instanceof MethodPackage) {
-									objs = LibraryUtil.getContainedElements(cmd
-											.getOwner(), objs);
-									if (!objs.isEmpty()) {
-										addNewPackagesToConfiguration(objs);
-									}
-								}
-							} else if (mostRecentCommand instanceof CreateChildCommand) {
-								notifyListeners(
-										ILibraryChangeListener.OPTION_NEWCHILD,
-										mostRecentCommand.getAffectedObjects());
-							} else if (mostRecentCommand != null) {
-								notifyListeners(
-										ILibraryChangeListener.OPTION_CHANGED,
-										mostRecentCommand.getAffectedObjects());
-							}
-						}
-					}
-				});
-			}
-		}
-	};
-
-	// Listen to changes to the managed method library.
-	private INotifyChangedListener notifyChangedListener = new INotifyChangedListener() {
-		public void notifyChanged(Notification notification) {
-			if (debug) {
-				DebugTrace.print(this,
-						"notifyChanged", "notification=" + notification); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (!skipEventProcessing) {
-				int eventType = notification.getEventType();
-				switch (eventType) {
-				case Notification.ADD: {
-					// A method element, typically a method plug-in, has been
-					// added to the managed library without using an editing
-					// command.
-					Object notifier = notification.getNotifier();
-					Object value = notification.getNewValue();
-					if ((notifier instanceof MethodLibrary)
-							&& (value instanceof MethodPlugin)) {
-						Collection affectedObjects = new ArrayList();
-						affectedObjects.add(value);
-						notifyListeners(ILibraryChangeListener.OPTION_NEWCHILD,
-								affectedObjects);
-					}
-					break;
-				}
-
-				case Notification.SET: {
-					Object notifier = notification.getNotifier();
-					if (notifier != null) {
-						Collection affectedObjects = new ArrayList();
-						affectedObjects.add(notifier);
-						notifyListeners(ILibraryChangeListener.OPTION_CHANGED,
-								affectedObjects);
-					}
-					break;
-				}
-
-				case Notification.REMOVE: {
-					// Either a method element has been removed from the
-					// containing element, or a method element reference has
-					// been deleted.
-					Object notifier = notification.getNotifier();
-					Object oldValue = notification.getOldValue();
-					Collection affectedObjects = new ArrayList();
-					if (oldValue instanceof EObject
-							&& ((EObject) oldValue).eContainer() == null) {
-						// A method element has been deleted.
-						affectedObjects.add(oldValue);
-						notifyListeners(ILibraryChangeListener.OPTION_DELETED,
-								affectedObjects);
-					} else {
-						// A method element reference has been deleted, notify
-						// the listeners that the containing method element has
-						// changed.
-						affectedObjects.add(notifier);
-						notifyListeners(ILibraryChangeListener.OPTION_CHANGED,
-								affectedObjects);
-					}
-					break;
-				}
-
-				case Notification.REMOVE_MANY: {
-					// Two or more method elements have been removed from
-					// the containing element, or tw or more method element
-					// reference have been deleted.
-					List oldValue = new ArrayList((Collection) notification
-							.getOldValue());
-					ArrayList deletedElements = new ArrayList();
-					ArrayList removedReferences = new ArrayList();
-					if (!oldValue.isEmpty()) {
-						for (Iterator iter = oldValue.iterator(); iter
-								.hasNext();) {
-							Object element = iter.next();
-							if (element instanceof EObject) {
-								if (((EObject) element).eContainer() == null) {
-									deletedElements.add(element);
-								} else {
-									removedReferences.add(element);
-								}
-							}
-						}
-					}
-					if (!deletedElements.isEmpty()) {
-						// Two or more method elements have been deleted.
-						notifyListeners(ILibraryChangeListener.OPTION_DELETED,
-								deletedElements);
-					}
-					if (!removedReferences.isEmpty()) {
-						// Two or more method element reference has been
-						// deleted.
-						notifyListeners(ILibraryChangeListener.OPTION_CHANGED,
-								removedReferences);
-					}
-					break;
-				}
-				}
-			}
-		}
-	};
-
-	// Listen to managed method library resource changes.
-	private Adapter resourceChangedListener = new AdapterImpl() {
-		public void notifyChanged(Notification msg) {
-			if (debug) {
-				DebugTrace.print(this, "notifyChanged", "msg=" + msg); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (msg.getFeatureID(null) == Resource.RESOURCE__IS_MODIFIED
-					&& msg.getEventType() == org.eclipse.emf.common.notify.Notification.SET) {
-				firePropertyChange(msg.getNotifier(), PROP_DIRTY);
-			}
-		}
-	};
-
-	// Listen to persistence refresh events.
-	private IRefreshListener refreshListener = new IRefreshListener() {
-		public void notifyRefreshed(IRefreshEvent event) {
-			if (debug) {
-				DebugTrace.print(this, "notifyRefreshed", "event=" + event); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			handleRefreshEvent(event);
-		}
-	};
-
-	// Listen to preference store changes.
-	private IPropertyChangeListenerWrapper preferenceStoreChangeListener = new IPropertyChangeListenerWrapper() {
-		public void propertyChange(IPropertyChangeEventWrapper event) {
-			if (event.getProperty().equals(
-					LibraryPreferences.DISCARD_UNRESOLVED_REFERENCES)) {
-				saveOptions.put(
-						MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES,
-						event.getNewValue());
-			}
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AbstractLibraryManager() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		if (debug) {
-			DebugTrace.print(this, "init"); //$NON-NLS-1$
-		}
-
-		LibraryPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(preferenceStoreChangeListener);
-
-		// Create the adapter factory.
-		List factories = new ArrayList();
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-		ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(
-				factories);
-
-		// Create the command stack.
-		BasicCommandStack commandStack = new BasicCommandStack();
-
-		// Create the resource set.
-		ILibraryResourceSet resourceSet = createResourceSet();
-		resourceSet.addRefreshListener(refreshListener);
-		RefreshJob.getInstance().setResourceSet(resourceSet);
-
-		// Initialize the library save options.
-		saveOptions = resourceSet.getDefaultSaveOptions();
-		saveOptions.put(MultiFileXMISaveImpl.DISCARD_UNRESOLVED_REFERENCES,
-				LibraryPreferences.getDiscardUnresolvedReferences());
-
-		// Create the editing domain.
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-				commandStack, resourceSet);
-
-		// Register the editing domain.
-		registerEditingDomain(editingDomain);
-	}
-
-	/**
-	 * Saves the managed method library.
-	 * 
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void saveMethodLibrary() throws LibraryServiceException {
-		if (debug) {
-			DebugTrace.print(this, "saveMethodLibrary"); //$NON-NLS-1$
-		}
-
-		try {
-			if (library != null) {
-				skipEventProcessing = true;
-
-				ILibraryResourceSet resourceSet = ((ILibraryResourceSet) editingDomain
-						.getResourceSet());
-				resourceSet.save(saveOptions);
-
-				((BasicCommandStack) editingDomain.getCommandStack())
-						.saveIsDone();
-
-				skipEventProcessing = false;
-
-				firePropertyChange(library, PROP_DIRTY);
-
-			}
-		} catch (Exception e) {
-			throw new LibraryServiceException(e);
-		} finally {
-			skipEventProcessing = false;
-		}
-	}
-
-	/**
-	 * Discards all changes made to the managed method library.
-	 */
-	public void discardMethodLibraryChanges() {
-		if (debug) {
-			DebugTrace.print(this, "discardMethodLibraryChanges"); //$NON-NLS-1$
-		}
-
-		for (Iterator it = getEditingDomain().getResourceSet().getResources()
-				.iterator(); it.hasNext();) {
-			Resource resource = (Resource) it.next();
-			resource.setModified(false);
-		}
-	}
-
-	/**
-	 * Closes the managed method library.
-	 * 
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void closeMethodLibrary() throws LibraryServiceException {
-		if (debug) {
-			String msg = "library=" + library + ", memory on entry=" //$NON-NLS-1$ //$NON-NLS-2$
-					+ (Runtime.getRuntime().totalMemory() - Runtime
-							.getRuntime().freeMemory());
-			DebugTrace.print(this, "closeMethodLibrary", msg); //$NON-NLS-1$
-		}
-
-		// String libPath = LibraryService.getInstance()
-		// .getCurrentMethodLibraryPath();
-		File libFile = new File(library.eResource().getURI().toFileString());
-		String libPath = libFile.getParentFile().getAbsolutePath();
-
-		// remove the configuration managers associated with this library
-		LibraryService.getInstance().removeConfigurationManagers(library);
-
-		removeResourceChangedListeners();
-
-		// Clear the temp layout resources.
-		LayoutResources.clear();
-		
-		Suppression.clearCachedSuppressions();
-
-		TngUtil.umaItemProviderAdapterFactory.dispose();
-
-		ILibraryResourceSet resourceSet = (ILibraryResourceSet) editingDomain
-				.getResourceSet();
-		resourceSet.unload();
-
-		try {
-			// Close the method library project file.
-			MethodLibraryProject.closeProject(libPath, null);
-		} catch (Exception e) {
-			throw new LibraryServiceException(e);
-		} 
-
-		RefreshJob.getInstance().reset();
-
-		// Activates the garbage collector.
-		Runtime.getRuntime().gc();
-
-		if (debug) {
-			String msg = "library=" + library + ", memory on exit=" //$NON-NLS-1$ //$NON-NLS-2$
-					+ (Runtime.getRuntime().totalMemory() - Runtime
-							.getRuntime().freeMemory());
-			DebugTrace.print(this, "closeMethodLibrary", msg); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the managed method library.
-	 * 
-	 * @return a method library
-	 */
-	public MethodLibrary getMethodLibrary() {
-		if (debug) {
-			DebugTrace.print(this, "getMethodLibrary", "library=" + library); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return library;
-	}
-
-	/**
-	 * Sets the managed method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void setMethodLibrary(MethodLibrary library) {
-		if (debug) {
-			DebugTrace.print(this, "setMethodLibrary", "library=" + library); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (this.library != null) {
-			Resource resource = (Resource) this.library.eResource();
-			if (resource != null) {
-				resource.getContents().clear();
-				resource.getContents().add(library);
-			}
-		}
-
-		this.library = library;
-	}
-
-	/**
-	 * Gets the adapter factory for the managed method library.
-	 * 
-	 * @return an adapter factory
-	 */
-	public ComposedAdapterFactory getAdapterFactory() {
-		if (debug) {
-			DebugTrace.print(this, "getAdapterFactory"); //$NON-NLS-1$
-		}
-
-		return (ComposedAdapterFactory) getEditingDomain().getAdapterFactory();
-	}
-
-	/**
-	 * Gets the editing domain for the managed method library.
-	 * 
-	 * @return an editing domain
-	 */
-	public AdapterFactoryEditingDomain getEditingDomain() {
-		if (debug) {
-			DebugTrace.print(this,
-					"getEditingDomain", "editingDomain=" + editingDomain); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return editingDomain;
-	}
-
-	/**
-	 * Registers an editing domain with the managed method library.
-	 * 
-	 * @param domain
-	 *            an editing domain
-	 */
-	public void registerEditingDomain(AdapterFactoryEditingDomain domain) {
-		if (debug) {
-			DebugTrace.print(this, "registerEditingDomain", "domain=" + domain); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		// Add a listener to monitor library changes made in the given editing
-		// domain.
-		((ComposedAdapterFactory) domain.getAdapterFactory())
-				.addListener(notifyChangedListener);
-
-		// Add a listener to monitor changes made to the command stack.
-		// This is used to select the most recently affected objects in the
-		// viewer.
-		domain.getCommandStack().addCommandStackListener(commandStackListener);
-	}
-
-	/**
-	 * Adds a listener to monitor changes to the managed method library.
-	 * 
-	 * @param listener
-	 *            a library change listener
-	 */
-	public void addListener(ILibraryChangeListener listener) {
-		synchronized (libraryChangedListeners) {
-			if (debug) {
-				DebugTrace.print(this, "addListener", "listener=" + listener); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			if (!libraryChangedListeners.contains(listener)) {
-				libraryChangedListeners.add(listener);
-			}
-		}
-	}
-
-	/**
-	 * Removes a listener that was added to monitor changes to the managed
-	 * method library.
-	 * 
-	 * @param listener
-	 *            a library change listener
-	 */
-	public synchronized void removeListener(ILibraryChangeListener listener) {
-		if (debug) {
-			DebugTrace
-					.print(this, "removeListener", "listener=" + listener); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-//			// Cache the listener and remove it just before dispatching the
-//			// library changed events.
-//			if (!detachedLibraryChangedListeners.contains(listener)) {
-//				detachedLibraryChangedListeners.add(listener);
-//			}
-		
-		if(listener != null) {
-			synchronized (libraryChangedListeners) {
-				libraryChangedListeners.remove(listener);
-			}
-		}
-	}
-
-	/**
-	 * Adds a listener to monitor resource changes in the managed method
-	 * library.
-	 * 
-	 * @param listener
-	 *            a property change listener
-	 */
-	public void addPropertyListener(IPropertyListener listener) {
-		if (debug) {
-			DebugTrace.print(this,
-					"addPropertyListener", "listener=" + listener); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		resourceChangeListeners.add(listener);
-	}
-
-	/**
-	 * Removes a listener that was added to monitor resource changes in the
-	 * managed method library.
-	 * 
-	 * @param listener
-	 *            a property change listener
-	 */
-	public void removePropertyListener(IPropertyListener listener) {
-		if (debug) {
-			DebugTrace.print(this,
-					"removePropertyListener", "listener=" + listener); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		resourceChangeListeners.remove(listener);
-	}
-
-	/**
-	 * Starts listening to command processing on a command stack.
-	 * 
-	 * @param commandStack
-	 *            a command stack
-	 */
-	public void startListeningTo(CommandStack commandStack) {
-		if (debug) {
-			DebugTrace.print(this,
-					"startListeningTo", "commandStack=" + commandStack); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		commandStack.addCommandStackListener(commandStackListener);
-	}
-
-	/**
-	 * Stops listening to command processing on a command stack.
-	 * 
-	 * @param commandStack
-	 *            a command stack
-	 */
-	public void stopListeningTo(CommandStack commandStack) {
-		if (debug) {
-			DebugTrace.print(this,
-					"stopListeningTo", "commandStack=" + commandStack); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		commandStack.removeCommandStackListener(commandStackListener);
-	}
-
-	/**
-	 * Starts listening to change notifications sent from an adapter factory.
-	 * 
-	 * @param adapterFactory
-	 *            an adapter factory
-	 */
-	public void startListeningTo(ComposedAdapterFactory adapterFactory) {
-		if (debug) {
-			DebugTrace.print(this,
-					"startListeningTo", "adapterFactory=" + adapterFactory); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		adapterFactory.addListener(notifyChangedListener);
-	}
-
-	/**
-	 * Stops listening to change notifications sent from an adapter factory.
-	 * 
-	 * @param adapterFactory
-	 *            an adapter factory
-	 */
-	public void stopListeningTo(ComposedAdapterFactory adapterFactory) {
-		if (debug) {
-			DebugTrace.print(this,
-					"stopListeningTo", "adapterFactory=" + adapterFactory); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		adapterFactory.removeListener(notifyChangedListener);
-	}
-
-	/**
-	 * Gets a method element from the managed method library.
-	 * 
-	 * @param guid
-	 *            the method element's GUID.
-	 * 
-	 * @return a method element of <code>null</code>
-	 */
-	public MethodElement getMethodElement(String guid) {
-// this printed out too much useless information, comment out
-//		if (debug) {
-//			DebugTrace.print(this, "getMethodElement", "guid=" + guid); //$NON-NLS-1$ //$NON-NLS-2$
-//		}
-
-		try {
-			ILibraryResourceSet resourceSet = (ILibraryResourceSet) library
-					.eResource().getResourceSet();
-			if (resourceSet != null) {
-				return (MethodElement) resourceSet.getEObject(guid);
-			}
-		} catch (Throwable th) {
-			// Log error here
-			th.printStackTrace();
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the relative URI of a method element in the managed method library.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a relative URI
-	 */
-	public URI getElementRelativeURI(MethodElement element) {
-		if (debug) {
-			DebugTrace.print(this,
-					"getElementRelativeURI", "element=" + element); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		if (element != null) {
-			Resource resource = library.eResource();
-			if (resource != null) {
-				URI libraryURI = resource.getURI();
-				URI elementURI = element.eResource().getURI();
-				return elementURI.deresolve(libraryURI);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Checks whether the managed method library is read only.
-	 * 
-	 * @return <code>true</code> if the method library is read only
-	 */
-	public boolean isMethodLibraryReadOnly() {
-		if (debug) {
-			DebugTrace.print(this, "isMethodLibraryReadOnly"); //$NON-NLS-1$
-		}
-
-		URI libraryURI = library.eResource().getURI();
-		if (libraryURI.isFile()) {
-			File libraryXMIFile = new File(libraryURI.toFileString());
-			return libraryXMIFile.exists() && !libraryXMIFile.canWrite();
-		}
-		return false;
-	}
-
-	/**
-	 * Checks whether the managed method library content has been modified.
-	 * 
-	 * @return <code>true</code> if the managed method library content has
-	 *         been modified
-	 */
-	public boolean isMethodLibraryModified() {
-		if (debug) {
-			DebugTrace.print(this, "isMethodLibraryModified"); //$NON-NLS-1$
-		}
-
-		for (Iterator it = getEditingDomain().getResourceSet().getResources()
-				.iterator(); it.hasNext();) {
-			Resource resource = (Resource) it.next();
-			if (resource.isModified()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks whether the managed method library has any unresolved proxy.
-	 * 
-	 * @return <code>true</code> if the managed method library has an
-	 *         unresolved proxy.
-	 */
-	public boolean hasUnresolvedProxy() {
-		if (debug) {
-			DebugTrace.print(this, "hasUnresolvedProxy"); //$NON-NLS-1$
-		}
-
-		ILibraryResourceSet resourceSet = ((ILibraryResourceSet) editingDomain
-				.getResourceSet());
-		return resourceSet.hasUnresolvedProxy();
-	}
-
-	/**
-	 * Reloads the given resources.
-	 * 
-	 * @param resources
-	 *            a collection of resources
-	 * @return a collection of resources that have reloaded
-	 */
-	public Collection reloadResources(final Collection resources) {
-		if (debug) {
-			System.out
-					.println("AbstractLibraryManager.reloadResources(): START"); //$NON-NLS-1$
-		}
-		try {
-			final ArrayList reloadedResources = new ArrayList();
-			IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
-
-				public void run(IProgressMonitor monitor) throws CoreException {
-					reloadedResources.addAll(doReloadResources(resources));
-
-				}
-
-			};
-			try {
-				ResourcesPlugin.getWorkspace().run(runnable,
-						new LibrarySchedulingRule(library),
-						IWorkspace.AVOID_UPDATE, new NullProgressMonitor());
-			} catch (Exception e) {
-				LibraryPlugin.getDefault().getLogger().logError(e);
-			}
-			return reloadedResources;
-		} finally {
-			if (debug) {
-				System.out
-						.println("AbstractLibraryManager.doReloadResources(): END"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private Collection doReloadResources(Collection resources) {
-		if (debug) {
-			DebugTrace.print(this, "reloadResources"); //$NON-NLS-1$
-		}
-		if (library == null) {
-			return Collections.EMPTY_LIST;
-		}
-
-		// check if resources to reload contains any elements cached in
-		// LibraryService
-		// to update them
-		//
-		LibraryService libSvc = (LibraryService) LibraryService.getInstance();
-		Resource currentLibResource = null;
-		ILibraryManager currentLibMgr = null;
-		Resource currentConfigResource = null;
-		MethodConfiguration currentConfig = null;
-		List configResources = new ArrayList();
-		List configs = new ArrayList();
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			MethodElement e = PersistenceUtil.getMethodElement(resource);
-			if (e == libSvc.getCurrentMethodLibrary()) {
-				currentLibMgr = libSvc.getCurrentLibraryManager();
-				currentLibResource = resource;
-			} else if (e == libSvc.getCurrentMethodConfiguration()) {
-				currentConfigResource = resource;
-				currentConfig = libSvc.getCurrentMethodConfiguration();
-			} else if (e instanceof MethodConfiguration) {
-				configResources.add(resource);
-				configs.add(e);
-			}
-		}
-
-		ILibraryResourceSet resourceSet = (ILibraryResourceSet) library
-				.eResource().getResourceSet();
-		Collection reloadedResources = resourceSet.reloadResources(resources);
-		if (!reloadedResources.isEmpty()) {
-			if (currentLibResource != null || currentConfigResource != null) {
-				// update cached elements in LibraryService and this library
-				// manager
-				//
-				for (Iterator iter = reloadedResources.iterator(); iter
-						.hasNext();) {
-					Resource resource = (Resource) iter.next();
-					if (resource == currentLibResource) {
-						MethodElement e = PersistenceUtil
-								.getMethodElement(resource);
-						if (e instanceof MethodLibrary) {
-							MethodLibrary newLib = (MethodLibrary) e;
-							libSvc.setCurrentMethodLibrary(newLib);
-							if (currentLibMgr instanceof AbstractLibraryManager) {
-								libSvc.removeLibraryManager(currentLibMgr);
-								((AbstractLibraryManager) currentLibMgr)
-										.updateMethodLibrary(newLib);
-								libSvc.setLibraryManager(currentLibMgr);
-							}
-						}
-					}
-					if (resource == currentConfigResource) {
-						MethodElement e = PersistenceUtil
-								.getMethodElement(resource);
-						if (e instanceof MethodConfiguration) {
-							// remove config manager of old current config
-							//
-							libSvc.removeConfigurationManager(currentConfig);
-							MethodConfiguration config = (MethodConfiguration) e;
-							libSvc.setCurrentMethodConfiguration(config);
-						}
-					} else if (!configResources.isEmpty()) {
-						int id = configResources.indexOf(resource);
-						if (id != -1) {
-							// remove config manager of old config
-							//
-							libSvc
-									.removeConfigurationManager((MethodConfiguration) configs
-											.get(id));
-						}
-					}
-				}
-			}
-
-			// TODO: Review implementation.
-			Suppression.cleanUp();
-		}
-		return reloadedResources;
-	}
-
-	/**
-	 * @param newLib
-	 */
-	private void updateMethodLibrary(MethodLibrary newLib) {
-		library = newLib;
-	}
-
-	/**
-	 * Gets the options used for saving the managed method library.
-	 * 
-	 * @return a map of method library specific save options
-	 */
-	public Map getSaveOptions() {
-		if (debug) {
-			DebugTrace.print(this, "getSaveOptions"); //$NON-NLS-1$
-		}
-
-		return saveOptions;
-	}
-
-	/**
-	 * Adds a new method plug-in to the managed method library.
-	 * 
-	 * @param plugin
-	 *            a method plug-in
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void addMethodPlugin(final MethodPlugin plugin)
-			throws LibraryServiceException {
-		if (debug) {
-			DebugTrace.print(this, "addMethodPlugin", "plugin=" + plugin); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		// This operation will cause an UI update. It must be executed in
-		// the main UI to aoid an Invalid Thread Access exception.
-		final Exception[] exceptions = new Exception[1];
-
-		try {
-			SafeUpdateController.syncExec(new Runnable() {
-				public void run() {
-					library.getMethodPlugins().add(plugin);
-
-					ILibraryPersister.FailSafeMethodLibraryPersister persister = Services
-							.getLibraryPersister(getLibraryPersisterType())
-							.getFailSafePersister();
-					try {
-						persister.save(library.eResource());
-						persister.commit();
-					} catch (Exception e) {
-						persister.rollback();
-						exceptions[0] = e;
-						return;
-					}
-
-					plugin.eResource().eAdapters().add(resourceChangedListener);
-				}
-			});
-		} catch (Exception e) {
-			throw new LibraryServiceException(e);
-		}
-
-		if (exceptions[0] != null) {
-			throw new LibraryServiceException(exceptions[0]);
-		}
-	}
-
-	/**
-	 * Disposes all resources allocated by this library manager.
-	 */
-	public void dispose() {
-		if (preferenceStoreChangeListener != null) {
-			LibraryPlugin
-					.getDefault()
-					.getPreferenceStore()
-					.removePropertyChangeListener(preferenceStoreChangeListener);
-		}
-
-		if (libraryChangedListeners.size() > 0) {
-			libraryChangedListeners.clear();
-		}
-
-//		if (detachedLibraryChangedListeners.size() > 0) {
-//			detachedLibraryChangedListeners.clear();
-//		}
-
-		if (resourceChangeListeners.size() > 0) {
-			resourceChangeListeners.clear();
-		}
-
-		editingDomain = null;
-		library = null;
-	}
-
-	/**
-	 * Checks the arguments used for creating a new method element.
-	 * 
-	 * @param containingElement
-	 *            the parent/containing method element
-	 * @param name
-	 *            a name for the new method element
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation.
-	 */
-	protected void checkElementCreationArguments(
-			MethodElement containingElement, String name)
-			throws LibraryServiceException {
-		if (containingElement == null) {
-			throw new IllegalArgumentException();
-		}
-		if (name == null || name.length() == 0) {
-			throw new InvalidMethodElementNameException();
-		}
-		// TODO: Check for illegal characters.
-	}
-
-	/**
-	 * Handles a persistence refresh event.
-	 * 
-	 * @param event
-	 *            a refresh event
-	 */
-	protected void handleRefreshEvent(IRefreshEvent event) {
-		if (debug) {
-			DebugTrace.print(this, "handleRefreshEvent", "refreshedResources=" //$NON-NLS-1$ //$NON-NLS-2$
-					+ event.getRefreshedResources());
-		}
-
-		if (!event.getUnloadedObjects().isEmpty()) {
-			TngAdapterFactory.INSTANCE.cleanUp();
-		}
-	}
-
-	/**
-	 * Notifies all library changed listeners attached to the managed library.
-	 * 
-	 * @param type
-	 *            the type of change that has occurred
-	 * @param changedElements
-	 *            a collection of method elements that have changed
-	 */
-	protected synchronized void notifyListeners(final int option,
-			final Collection collection) {
-
-		// send notification might be causing listeners added or removed
-		// to avoid concurrent update of the listener list, 
-		// we keep the list of listeners processed
-		// and check the listener list repeatedly
-		HashSet processed = new HashSet();	
-		while (_doNotifyListeners(option, collection, processed) ) {
-			;
-		}
-	}
-	
-	/**
-	 * Notifies all library changed listeners attached to the managed library.
-	 * 
-	 * @param type
-	 *            the type of change that has occurred
-	 * @param changedElements
-	 *            a collection of method elements that have changed
-	 * @return boolean true if any listener is processed
-	 */
-	private boolean _doNotifyListeners(final int option,
-			final Collection collection, final Collection processed) {
-		if (debug) {
-			DebugTrace.print(this, "notifyListeners", "option=" + option); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		boolean changed = false;
-		
-		try {
-//			// Remove the changed listeners that have been dettached.
-//			if (detachedLibraryChangedListeners.size() > 0) {
-//				for (Iterator it = detachedLibraryChangedListeners.iterator(); it
-//						.hasNext();) {
-//					Object l = it.next();
-//					if (libraryChangedListeners.contains(l)) {
-//						libraryChangedListeners.remove(l);
-//					}
-//				}
-//				detachedLibraryChangedListeners.clear();
-//			}
-
-			// Notify the changed listeners.
-			// Note: more changed listeners may be added while each listener is
-			// being notified. However,
-			// they will be added to the end of the list which does no harm.
-			
-			
-			for ( Iterator it = new ArrayList(libraryChangedListeners).iterator(); it.hasNext(); ) {
-				final ILibraryChangeListener listener = (ILibraryChangeListener) it.next();
-
-				if ( (listener != null) && !processed.contains(listener) ) {
-	
-					// keep the processed ones
-					processed.add(listener);
-					changed = true;
-					
-					// Since this may trigger an update to the UI, the
-					// notification must be executed in the UI thread to avoid
-					// getting an Invalid Thread Access exception. The
-					// notification must also be executed in sync mode to
-					// gurantee delivery of the event before a listener is
-					// disposed.
-					SafeUpdateController.syncExec(new Runnable() {
-						public void run() {
-							if (debug) {
-								DebugTrace
-										.print(
-												this,
-												"notifyListeners", "listener=" + listener); //$NON-NLS-1$ //$NON-NLS-2$
-							}
-							listener.libraryChanged(option, collection);
-						}
-					});
-				}
-			
-			}
-		} catch (Exception e) {
-			if (debug) {
-				DebugTrace.print(this, "notifyListeners", e); //$NON-NLS-1$
-			}
-		}
-		
-		return changed;
-		
-	}
-
-	/**
-	 * Fires a property changed event.
-	 * 
-	 * @param propertyId
-	 *            the id of the changed property
-	 */
-	protected void firePropertyChange(final Object source, final int propertyId) {
-		if (debug) {
-			DebugTrace.print(this, "firePropertyChange", "source=" + source); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		Object[] array = resourceChangeListeners.getListeners();
-		for (int i = 0; i < array.length; i++) {
-			final IPropertyListener listener = (IPropertyListener) array[i];
-
-			// This operation will cause an UI update. It must be executed in
-			// the main UI to aoid an Invalid Thread Access exception.
-			SafeUpdateController.asyncExec(new Runnable() {
-				public void run() {
-					if (debug) {
-						DebugTrace.print(this,
-								"firePropertyChange", "listener=" + listener); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					listener.propertyChanged(source, propertyId);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Adds a resource changed listener to the managed method library resources.
-	 */
-	protected void addResourceChangedListeners() {
-		if (library == null || library.eResource() == null) {
-			return;
-		}
-
-		if (!library.eResource().eAdapters().contains(resourceChangedListener)) {
-			library.eResource().eAdapters().add(resourceChangedListener);
-		}
-
-		for (Iterator it = library.getMethodPlugins().iterator(); it.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) it.next();
-			if (!plugin.eResource().eAdapters().contains(
-					resourceChangedListener)) {
-				plugin.eResource().eAdapters().add(resourceChangedListener);
-			}
-		}
-
-		for (Iterator it = library.getPredefinedConfigurations().iterator(); it
-				.hasNext();) {
-			MethodConfiguration config = (MethodConfiguration) it.next();
-			if (!config.eResource().eAdapters().contains(
-					resourceChangedListener)) {
-				config.eResource().eAdapters().add(resourceChangedListener);
-			}
-		}
-	}
-
-	/**
-	 * Removes the resource changed listener to the managed method library
-	 * resource and method plug-ins.
-	 */
-	protected void removeResourceChangedListeners() {
-		if (library == null || library.eResource() == null) {
-			return;
-		}
-
-		library.eResource().eAdapters().remove(resourceChangedListener);
-
-		for (Iterator iter = library.getMethodPlugins().iterator(); iter
-				.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iter.next();
-			plugin.eResource().eAdapters().remove(resourceChangedListener);
-		}
-
-		for (Iterator it = library.getPredefinedConfigurations().iterator(); it
-				.hasNext();) {
-			MethodConfiguration config = (MethodConfiguration) it.next();
-			config.eResource().eAdapters().remove(resourceChangedListener);
-		}
-	}
-
-	/**
-	 * Gets the managed method library resource.
-	 * 
-	 * @return a method library resource.
-	 */
-	protected Resource getMethodLibraryResource() {
-		return library != null ? library.eResource() : null;
-	}
-
-	/**
-	 * Gets the URI of the managed method library.
-	 * 
-	 * @return a <code>java.net.URI</code>
-	 */
-	public java.net.URI getMethodLibraryURI() {
-		Resource savedResource = getMethodLibraryResource();
-		if (savedResource != null) {
-			URI resourceURI = savedResource.getURI();
-			try {
-				File file = new File(resourceURI.toFileString());
-				return file.getParentFile().toURI();
-			} catch (Exception e) {
-				LibraryPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the new packages into the configurations if the parent is in the
-	 * configuration.
-	 */
-	private void addNewPackagesToConfiguration(Collection newobjs) {
-		if (newobjs == null || newobjs.size() == 0) {
-			return;
-		}
-
-		LibraryModificationHelper helper = new LibraryModificationHelper();
-
-		try {
-			EObject e, parent;
-			for (Iterator it = newobjs.iterator(); it.hasNext();) {
-				e = (EObject) it.next();
-				if ((e instanceof MethodPackage)
-						&& ((parent = e.eContainer()) != null)
-						&& (parent instanceof MethodPackage)) {
-					Object configs = ((MultiResourceEObject) parent)
-							.getOppositeFeatureValue(AssociationHelper.MethodPackage_MethodConfigurations);
-					if (configs instanceof List) {
-						for (Iterator itconfig = ((List) configs).iterator(); itconfig
-								.hasNext();) {
-							MethodConfiguration config = (MethodConfiguration) itconfig
-									.next();
-							List pkgs = config.getMethodPackageSelection();
-							if (!pkgs.contains(e)) {
-								// pkgs.add(e);
-								helper
-										.getActionManager()
-										.doAction(
-												IActionManager.ADD,
-												config,
-												UmaPackage.eINSTANCE
-														.getMethodConfiguration_MethodPackageSelection(),
-												e, -1);
-							}
-						}
-					}
-				}
-			}
-
-			helper.save();
-
-		} catch (RuntimeException e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-		} finally {
-			helper.dispose();
-		}
-	}
-
-	/**
-	 * Gets the type of library persister to be used in this library manager
-	 * 
-	 * @return the library persister type
-	 * @see Services#XMI_PERSISTENCE_TYPE
-	 */
-	protected abstract String getLibraryPersisterType();
-
-	protected abstract ILibraryResourceSet createResourceSet();	
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ConfigurationAlreadyExistsException.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ConfigurationAlreadyExistsException.java
deleted file mode 100644
index e7dbd42..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ConfigurationAlreadyExistsException.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-/**
- * Signals that a Method Configuration already exists.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationAlreadyExistsException extends
-		LibraryServiceException {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationAlreadyExistsException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public ConfigurationAlreadyExistsException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public ConfigurationAlreadyExistsException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the error message and the root cause of the
-	 * exception.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public ConfigurationAlreadyExistsException(String errorMsg,
-			Throwable rootCause) {
-		super(errorMsg, rootCause);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ConfigurationManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ConfigurationManager.java
deleted file mode 100644
index f6a9b74..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ConfigurationManager.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.library.configuration.ConfigurationData;
-import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
-import org.eclipse.epf.library.configuration.closure.DependencyManager;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Manages a method configuration.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationManager implements IConfigurationManager {
-
-	// If true, generate debug traces.
-	protected static boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	// The managed method configuraiton.
-	protected MethodConfiguration config;
-	
-	// The managed configuraiton data.
-	private ConfigurationData configData;
-
-	// The containing method library for the managed method configuration.
-	protected MethodLibrary library;
-
-	// The library manager for the containing method library.
-	protected ILibraryManager libraryManager;
-
-	// The dependency manager.
-	protected DependencyManager dependencyManager;
-
-	// The layout manager.
-	protected ElementLayoutManager layoutManager;
-
-	// The configuration closure.
-	protected ConfigurationClosure closure;
-
-	protected AdapterFactoryContentProvider afcp;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 */
-	public ConfigurationManager(MethodConfiguration config) {
-		this.config = config;
-		configData = new ConfigurationData(config);
-
-		library = LibraryServiceUtil.getMethodLibrary(config);
-
-		libraryManager = LibraryService.getInstance()
-				.getLibraryManager(library);
-		afcp = new AdapterFactoryContentProvider(libraryManager
-				.getAdapterFactory());
-
-		dependencyManager = new DependencyManager(library);
-
-		if (config == null) {
-			layoutManager = new ElementLayoutManager();
-		} else {
-			layoutManager = new ElementLayoutManager(config);
-			// closure = new ConfigurationClosure(this, config);
-		}
-	}
-
-	/**
-	 * Gets the method configuration managed by this configuration manager.
-	 * 
-	 * @return a method configuration
-	 */
-	public MethodConfiguration getMethodConfiguration() {
-		return config;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.IConfigurationManager#getConfigurationData()
-	 */
-	public ConfigurationData getConfigurationData() {
-		return configData;
-	}
-	
-	/**
-	 * Gets the containing method library for the managed method configuration.
-	 * 
-	 * @return a method library
-	 */
-	public MethodLibrary getMethodLibrary() {
-		return library;
-	}
-
-	/**
-	 * Gets the adapter factory.
-	 * 
-	 * @return an adapter factory
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return libraryManager.getAdapterFactory();
-	}
-
-	/**
-	 * Gets the adapter factory content provider.
-	 * 
-	 * @return an adapter factory content provider
-	 */
-	public AdapterFactoryContentProvider getContentProvider() {
-		return afcp;
-	}
-
-	/**
-	 * Gets the dependency manager.
-	 * 
-	 * @return a dependency manager
-	 */
-	public DependencyManager getDependencyManager() {
-		return dependencyManager;
-	}
-
-	/**
-	 * Returns the element layout manager.
-	 * 
-	 * @return an element layout manager
-	 */
-	public ElementLayoutManager getElementLayoutManager() {
-		return layoutManager;
-	}
-
-	/**
-	 * Gets the configuration closure.
-	 * 
-	 * @return a configuration closure
-	 */
-	public ConfigurationClosure getConfigurationClosure() {
-		return closure;
-	}
-
-	/**
-	 * Makes a configuration closure.
-	 */
-	public void makeConfigurationClosure() {
-		if (closure != null) {
-			closure.fixErrors();
-		}
-	}
-
-	/**
-	 * Returns a list of method plug-ins in the containing method library.
-	 * 
-	 * @return a list of method plug-ins
-	 */
-	public List getMethodPlugins() {
-		return library.getMethodPlugins();
-	}
-
-	/**
-	 * Disposes all resources allocated by this configuration manager.
-	 */
-	public void dispose() {
-		configData.dispose();
-		configData = null;
-		config = null;
-		library = null;
-		libraryManager = null;
-		dependencyManager = null;
-		layoutManager = null;
-		closure = null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/CreateLibraryManagerException.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/CreateLibraryManagerException.java
deleted file mode 100644
index ffa0d1d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/CreateLibraryManagerException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-/**
- * Signals that a Library Manager instance cannot be created.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class CreateLibraryManagerException extends LibraryServiceException {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CreateLibraryManagerException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public CreateLibraryManagerException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public CreateLibraryManagerException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the error message and the root cause of the
-	 * exception.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public CreateLibraryManagerException(String errorMsg, Throwable rootCause) {
-		super(errorMsg, rootCause);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/IConfigurationClosure.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/IConfigurationClosure.java
deleted file mode 100644
index 8e731fd..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/IConfigurationClosure.java
+++ /dev/null
@@ -1,157 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.closure.ElementDependencyError;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * The interface for a Method Configuration Closure.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IConfigurationClosure {
-
-	/**
-	 * Returns the method configuration manager.
-	 * 
-	 * @return a configuration manager
-	 */
-	public IConfigurationManager getConfigurationManager();
-
-	/**
-	 * Returns the method configuration.
-	 * 
-	 * @return a method configuration
-	 */
-	public MethodConfiguration getConfiguration();
-
-	/**
-	 * Returns the containining method library.
-	 * 
-	 * @return a method library
-	 */
-	public MethodLibrary getLibrary();
-
-	/**
-	 * Sets the method plug-ins and packages selection.
-	 * 
-	 * @param elements
-	 *            an array of method plug-ins and packages
-	 */
-	//public void setSelections(Object[] elements);
-
-	/**
-	 * Checks whether a method plug-in or package is selected.
-	 * 
-	 * @return <code>true</code> if the given element is selected
-	 */
-	public boolean isSelected(Object input);
-
-	/**
-	 * Gets the element dependency error for a method element.
-	 * 
-	 * @element A method element.
-	 * 
-	 * @return an array of <code>ElementDependencyError</code>
-	 */
-	public ElementDependencyError getError(Object element);
-
-	/**
-	 * Checks whether the closure has any error.
-	 * 
-	 * @return <code>true</code> if the closure has one or more errors
-	 */
-	public boolean hasError();
-
-	/**
-	 * Checks whether the closure has any problem.
-	 * 
-	 * @return <code>true</code> if the closure has one or more problems.\
-	 */
-	public boolean hasProblem();
-
-	/**
-	 * Returns all the errors.
-	 * 
-	 * @return a list of <code>ErrorInfo</code>
-	 */
-	public List getAllErrors();
-
-	/**
-	 * Returns all the dependency errors.
-	 * 
-	 * @return an array of <code>ElementDependencyError</code>
-	 */
-	public Object[] getDependencyErrors();
-
-	/**
-	 * Returns all the invalid elements.
-	 * 
-	 * @return a list of invalid elements
-	 */
-	public List getInvalidElements();
-
-	/**
-	 * Returns all the changed elements. These are elements whose check states
-	 * have changed or whose image have changed due to error.
-	 * 
-	 * @return a list of changed method elements
-	 */
-	//public List getChangedElements();
-
-	/**
-	 * Returns the method plug-ins and packages selection.
-	 * 
-	 * @return an array of method plug-ins and packages
-	 */
-	public Object[] getSelection();
-
-	/**
-	 * fix the errors in the configurations
-	 */
-	public void fixErrors();
-
-	/**
-	 * Fixes all errors and warnings in the closure.
-	 */
-	public void fixProblems();
-
-	/**
-	 * Saves the method configuration.
-	 */
-	//public void saveMethodConfiguration();
-
-	/**
-	 * Packages the library based on the selection.
-	 * <p>
-	 * Note: This will change the current library. Before calling this method, a
-	 * copy of the current library should be created with the following steps:
-	 * 1. Create a new <code>ConfigurationManager</code> with a copy of the
-	 * original library, 2. Rebuild the dependency, 3. Create a
-	 * <code>ConfigurationClosure</code> with the current configuration.
-	 * 
-	 * @param removeBrokenReferences
-	 *            if <code>true</code>, remove all broken references
-	 * @return a method library
-	 */
-	public MethodLibrary packageLibrary(boolean removeBrokenReferences);
-
-	/**
-	 * Disposes resources allocated by this closure.
-	 */
-	public void dispose();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/IConfigurationManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/IConfigurationManager.java
deleted file mode 100644
index 186afcc..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/IConfigurationManager.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.library.configuration.ConfigurationData;
-import org.eclipse.epf.library.configuration.closure.ConfigurationClosure;
-import org.eclipse.epf.library.configuration.closure.DependencyManager;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * The interface for a Method Configuration Manager.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IConfigurationManager {
-
-	/**
-	 * Gets the method configuration managed by this configuration manager.
-	 * 
-	 * @return a method configuration
-	 */
-	public MethodConfiguration getMethodConfiguration();
-	
-	/**
-	 * Gets ConfigurationData object managed by this configuration manager.
-	 * 
-	 * @return a ConfigurationData object
-	 */
-	public ConfigurationData getConfigurationData();
-
-	/**
-	 * Gets the containing method library for the managed method configuration.
-	 * 
-	 * @return a method library
-	 */
-	public MethodLibrary getMethodLibrary();
-
-	/**
-	 * Gets the adapter factory.
-	 * 
-	 * @return an adapter factory
-	 */
-	public AdapterFactory getAdapterFactory();
-
-	/**
-	 * Gets the adapter factory content provider.
-	 * 
-	 * @return an adapter factory content provider
-	 */
-	public AdapterFactoryContentProvider getContentProvider();
-
-	/**
-	 * Gets the dependency manager.
-	 * 
-	 * @return a dependency manager
-	 */
-	public DependencyManager getDependencyManager();
-
-	/**
-	 * Returns the element layout manager.
-	 * 
-	 * @return an element layout manager
-	 */
-	public ElementLayoutManager getElementLayoutManager();
-
-	/**
-	 * Gets the configuration closure.
-	 * 
-	 * @return a configuration closure
-	 */
-	public ConfigurationClosure getConfigurationClosure();
-
-	/**
-	 * Makes a configuration closure.
-	 */
-	public void makeConfigurationClosure();
-
-	/**
-	 * Returns a list of method plug-ins in the containing method library.
-	 * 
-	 * @return a list of method plug-ins
-	 */
-	public List getMethodPlugins();
-	
-	/**
-	 * Disposes all resources allocated by this configuration manager.
-	 */
-	public void dispose();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryManager.java
deleted file mode 100644
index d80ddd2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryManager.java
+++ /dev/null
@@ -1,324 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.ui.IPropertyListener;
-
-/**
- * The interface for a Library Manager.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface ILibraryManager {
-
-	/**
-	 * Creates a new method library.
-	 * 
-	 * @param name
-	 *            a name for the new method library
-	 * @param args
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary createMethodLibrary(String name,
-			Map<String, Object> args) throws LibraryServiceException;
-
-	/**
-	 * Opens a method library.
-	 * 
-	 * @param uri
-	 *            a method library URI
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(java.net.URI uri)
-			throws LibraryServiceException;
-
-	/**
-	 * Opens a method library.
-	 * 
-	 * @param args
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(Map<String, Object> args)
-			throws LibraryServiceException;
-
-	/**
-	 * Reopens the managed method library.
-	 * 
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary reopenMethodLibrary() throws LibraryServiceException;
-
-	/**
-	 * Saves the managed method library.
-	 * 
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void saveMethodLibrary() throws LibraryServiceException;
-
-	/**
-	 * Discards all changes made to the managed method library.
-	 */
-	public void discardMethodLibraryChanges();
-
-	/**
-	 * Closes the managed method library.
-	 * 
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void closeMethodLibrary() throws LibraryServiceException;
-
-	/**
-	 * Gets the managed method library.
-	 * 
-	 * @return a method library
-	 */
-	public MethodLibrary getMethodLibrary();
-
-	/**
-	 * Sets the managed method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void setMethodLibrary(MethodLibrary library);
-
-	/**
-	 * Gets the URI of the managed method library.
-	 * 
-	 * @return a <code>org.eclipse.emf.common.util.URI</code>
-	 */
-	public java.net.URI getMethodLibraryURI();
-
-	/**
-	 * Gets the absolute path to the managed method library. For distributed
-	 * library, this is the library's workspace path.
-	 * 
-	 * @return an absolute path to the method library
-	 */
-	public String getMethodLibraryLocation();
-
-	/**
-	 * Gets the adapter factory for the managed method library.
-	 * 
-	 * @return an adapter factory
-	 */
-	public ComposedAdapterFactory getAdapterFactory();
-
-	/**
-	 * Gets the editing domain for the managed method library.
-	 * 
-	 * @return an editing domain
-	 */
-	public AdapterFactoryEditingDomain getEditingDomain();
-
-	/**
-	 * Registers an editing domain with the managed method library.
-	 * 
-	 * @param domain
-	 *            an editing domain
-	 */
-	public void registerEditingDomain(AdapterFactoryEditingDomain domain);
-
-	/**
-	 * Adds a listener to monitor changes to the managed method library.
-	 * 
-	 * @param listener
-	 *            a library change listener
-	 */
-	public void addListener(ILibraryChangeListener listener);
-
-	/**
-	 * Removes a listener that was added to monitor changes to the managed
-	 * method library.
-	 * 
-	 * @param listener
-	 *            a library change listener
-	 */
-	public void removeListener(ILibraryChangeListener listener);
-
-	/**
-	 * Adds a listener to monitor resource changes in the managed method
-	 * library.
-	 * 
-	 * @param listener
-	 *            a property change listener
-	 */
-	public void addPropertyListener(IPropertyListener listener);
-
-	/**
-	 * Adds a listener to monitor resource changes in the managed method
-	 * library.
-	 * 
-	 * @param listener
-	 *            a property change listener.
-	 */
-	public void removePropertyListener(IPropertyListener listener);
-
-	/**
-	 * Starts listening to command processing on a command stack.
-	 * 
-	 * @param commandStack
-	 *            a command stack
-	 */
-	public void startListeningTo(CommandStack commandStack);
-
-	/**
-	 * Stops listening to command processing on a command stack.
-	 * 
-	 * @param commandStack
-	 *            a command stack
-	 */
-	public void stopListeningTo(CommandStack commandStack);
-
-	/**
-	 * Starts listening to change notifications sent from an adapter factory.
-	 * 
-	 * @param adapterFactory
-	 *            an adapter factory
-	 */
-	public void startListeningTo(ComposedAdapterFactory adapterFactory);
-
-	/**
-	 * Stops listening to change notifications sent from an adapter factory.
-	 * 
-	 * @param adapterFactory
-	 *            an adapter factory
-	 */
-	public void stopListeningTo(ComposedAdapterFactory adapterFactory);
-
-	/**
-	 * Gets a method element from the managed method library.
-	 * 
-	 * @param guid
-	 *            the method element's GUID.
-	 * 
-	 * @return a method element of <code>null</code>
-	 */
-	public MethodElement getMethodElement(String guid);
-
-	/**
-	 * Checks whether the managed method library is read only.
-	 * 
-	 * @return <code>true</code> if the method library is read only
-	 */
-	public boolean isMethodLibraryReadOnly();
-
-	/**
-	 * Checks whether the managed method library content has been modified.
-	 * 
-	 * @return <code>true</code> if the managed method library content has
-	 *         been modified
-	 */
-	public boolean isMethodLibraryModified();
-
-	/**
-	 * Checks whether the managed method library has any unresolved proxy.
-	 * 
-	 * @return <code>true</code> if the managed method library has an
-	 *         unresolved proxy.
-	 */
-	public boolean hasUnresolvedProxy();
-
-	/**
-	 * Reloads the given resources.
-	 * 
-	 * @param resources
-	 *            a collection of resources
-	 * @return a collection of resources that have reloaded
-	 */
-	public Collection<Resource> reloadResources(Collection<Resource> resources);
-
-	/**
-	 * Gets the options used for saving the managed method library.
-	 * 
-	 * @return a map of method library specific save options
-	 */
-	public Map<String, Object> getSaveOptions();
-
-	/**
-	 * Adds a new method plug-in to the managed method library.
-	 * 
-	 * @param plugin
-	 *            a method plug-in
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void addMethodPlugin(MethodPlugin plugin)
-			throws LibraryServiceException;
-
-	/**
-	 * Disposes all resources allocated by this library manager.
-	 */
-	public void dispose();
-
-	/**
-	 * Gets the resource manager for the method library.
-	 * 
-	 * @return the resource manager for the method library
-	 */
-	public ILibraryResourceManager getResourceManager();
-	
-	/**
-	 * Backup method library
-	 * 
-	 * @param path
-	 * 		backup foler file path	
-	 */
-	public void backupMethodLibrary(String path);
-	
-	/**
-	 * Register a loaded method library.
-	 * 
-	 * @param type
-	 *            the given loaded method library
-	 * @param params
-	 *            method library specific arguments
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void registerMethodLibrary(MethodLibrary lib, 
-			Map<String, Object> params) throws LibraryServiceException;
-	
-	/**
-	 * Unregister a registered method library.
-	 * 
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void unRegisterMethodLibrary() throws LibraryServiceException;
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryResourceManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryResourceManager.java
deleted file mode 100644
index 5412279..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryResourceManager.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * interface to manage library resources
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public interface ILibraryResourceManager {
-
-	/**
-	 * get the logical path of the element in the library,
-	 * the path should start with the plugin name. 
-	 * i.e. <plugin name>/path/to/element
-	 * 
-	 * The implementation class should encapsulate the physical storage 
-	 * of the resource and return the path of the element start with it's plugin name
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public String getLogicalPath(MethodElement element);
-
-	/**
-	 * get the element's back path of the element based on the logical path, for example,
-	 * "OpenUP\guidance\concept\c1.xml", the back path is "./../../../"
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public String getBackPath(MethodElement element);
-	
-	/**
-	 * get the logical resource path of the element in the
-	 * library. the path should start with the plugin name. 
-	 * i.e. <plugin name>/path/to/element/resources
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public String getLogicalResourcePath(MethodElement element);
-	
-	/**
-	 * Gets the physical path of a method element
-	 * 
-	 * @param element
-	 * @return the physical path of the element
-	 */
-	public String getPhysicalPath(MethodElement element);
-
-	/**
-	 * Gets the absolute path of the resource folder of the element in the library.
-	 * 
-	 * @param e
-	 * @return the physical resource path of the element
-	 */
-	public String getPhysicalResourcePath(MethodElement element);
-
-	/**
-	 * get the physical path of the plugin associated with the element
-	 * 
-	 * @param element
-	 * @return String
-	 */
-	public String getPhysicalPluginPath(MethodElement element);
-
-	/**
-	 * get the logical path of the plugin 
-	 * 
-	 * @param element
-	 * @return String
-	 */
-	public String getLogicalPluginPath(MethodElement element);
-
-	
-	/**
-	 * get the physical path associated with the given logical path
-	 * 
-	 * @param element MethodElement an element in the library to access the library resource
-	 * usually this is the owner element that references the logicalPath
-	 * @param logicalPath String
-	 * @return String the physical path resolved from the logical path
-	 */
-	public String resolve(MethodElement element, String logicalPath);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryService.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryService.java
deleted file mode 100644
index 989295d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryService.java
+++ /dev/null
@@ -1,288 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.net.URI;
-import java.util.Map;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * The Library Service API.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface ILibraryService {
-
-	/**
-	 * Creates a new method library.
-	 * 
-	 * @param name
-	 *            a name for the new method library
-	 * @param type
-	 *            the method library type
-	 * @param args
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary createMethodLibrary(String name, String type,
-			Map<String, Object> params) throws LibraryServiceException;
-
-	/**
-	 * Opens an existing method library.
-	 * 
-	 * @param type
-	 *            the method library type
-	 * @param uri
-	 *            the method library URI
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(String type,
-			URI uri) throws LibraryServiceException;
-
-	/**
-	 * Opens an existing method library.
-	 * 
-	 * @param type
-	 *            the method library type
-	 * @param params
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(String type,
-			Map<String, Object> params) throws LibraryServiceException;
-
-	/**
-	 * Opens the last opened method library.
-	 * 
-	 * @return a method library or <code>null</code>
-	 */
-	public MethodLibrary openLastOpenedMethodLibrary();
-
-	/**
-	 * Reopens a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary reopenMethodLibrary(MethodLibrary library)
-			throws LibraryServiceException;
-
-	/**
-	 * Reopens the current method library.
-	 * 
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary reopenCurrentMethodLibrary()
-			throws LibraryServiceException;
-
-	/**
-	 * Saves a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void saveMethodLibrary(MethodLibrary library)
-			throws LibraryServiceException;
-
-	/**
-	 * Saves the current method library.
-	 * 
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void saveCurrentMethodLibrary() throws LibraryServiceException;
-
-	/**
-	 * Closes a method library.
-	 * <p>
-	 * This automatically disposes its library manager and the configuration
-	 * managers that manage the method configurations in the method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void closeMethodLibrary(MethodLibrary library)
-			throws LibraryServiceException;
-
-	/**
-	 * Closes the current method library.
-	 * 
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void closeCurrentMethodLibrary() throws LibraryServiceException;
-
-	/**
-	 * Replaces a the method library.
-	 * 
-	 * @param oldLibrary
-	 *            the old method library
-	 * @param newLibrary
-	 *            the new method library
-	 */
-	public void replaceMethodLibrary(MethodLibrary oldLibrary,
-			MethodLibrary newLibrary);
-
-	/**
-	 * Adds a listener to monitor Library Service events.
-	 * 
-	 * @param listener
-	 *            a library service listener
-	 */
-	public void addListener(ILibraryServiceListener listener);
-
-	/**
-	 * Removes a listener that was added to monitor Library Service events.
-	 * 
-	 * @param listener
-	 *            a library service listener
-	 */
-	public void removeListener(ILibraryServiceListener listener);
-
-	/**
-	 * Gets the current method library.
-	 * 
-	 * @return a method library
-	 */
-	public MethodLibrary getCurrentMethodLibrary();
-
-	/**
-	 * Sets the current method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void setCurrentMethodLibrary(MethodLibrary library);
-
-	/**
-	 * Gets the current method library location path.
-	 * <p>
-	 * Note: A file-based method library may return <code>null</code>.
-	 * 
-	 * @return an absolute path to the current method library
-	 */
-	public String getCurrentMethodLibraryLocation();
-
-	/**
-	 * Gets the library manager for a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return a library manager
-	 */
-	public ILibraryManager getLibraryManager(MethodLibrary library);
-
-	public void setLibraryManager(ILibraryManager libMgr);
-
-	public void removeLibraryManager(ILibraryManager libMgr);
-
-	/**
-	 * Gets the library manager for the current method library.
-	 * 
-	 * @return a library manager
-	 */
-	public ILibraryManager getCurrentLibraryManager();
-
-	/**
-	 * Creates a new method configuration.
-	 * 
-	 * @param name
-	 *            a name for the new method configuration
-	 * @param library
-	 *            the containing method library
-	 * @return a method configuration
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodConfiguration createMethodConfiguration(String name,
-			MethodLibrary library) throws LibraryServiceException;
-
-	/**
-	 * Gets the current method configuration.
-	 * 
-	 * @return a method configuration
-	 */
-	public MethodConfiguration getCurrentMethodConfiguration();
-
-	/**
-	 * Sets the current method configuration.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 */
-	public void setCurrentMethodConfiguration(MethodConfiguration config);
-
-	/**
-	 * Gets the configuration manager for a method configuration.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 * @return a configuration manager
-	 */
-	public IConfigurationManager getConfigurationManager(
-			MethodConfiguration config);
-
-	public void removeConfigurationManager(MethodConfiguration config);
-
-	public void removeConfigurationManagers(MethodLibrary library);
-
-	/**
-	 * Gets the configuration manager for the current method configuration.
-	 * 
-	 * @return a configuration manager
-	 */
-	public IConfigurationManager getCurrentConfigurationManager();
-	
-	/**
-	 * Register a loaded method library.
-	 * 
-	 * @param type
-	 *            the given loaded method library
-	 * @param type
-	 *            the method library type
-	 * @param params
-	 *            method library specific arguments
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void  registerMethodLibrary(MethodLibrary lib, String type,
-			Map<String, Object> params) throws LibraryServiceException;
-	
-	/**
-	 * Unregister a registered method library.
-	 * 
-	 * @param type
-	 *            the given registered method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void unRegisterMethodLibrary(MethodLibrary lib) throws LibraryServiceException;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryServiceListener.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryServiceListener.java
deleted file mode 100644
index eabfec9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/ILibraryServiceListener.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.util.EventListener;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * The interface for a Library Service listener.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface ILibraryServiceListener extends EventListener {
-
-	/**
-	 * Receives notification when a method library has been created.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void libraryCreated(MethodLibrary library);
-
-	/**
-	 * Receives notification when a method library has been opened.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void libraryOpened(MethodLibrary library);
-
-	/**
-	 * Receives notification when a method library has been reopened.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void libraryReopened(MethodLibrary library);
-
-	/**
-	 * Receives notification when a method library has been closed.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void libraryClosed(MethodLibrary library);
-
-	/**
-	 * Receives notification when a method library has been set as the current
-	 * method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void librarySet(MethodLibrary library);
-
-	/**
-	 * Receives notification when a method configuration has been set as the
-	 * current method configuration.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 */
-	public void configurationSet(MethodConfiguration config);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/InvalidMethodElementNameException.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/InvalidMethodElementNameException.java
deleted file mode 100644
index c73f6af..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/InvalidMethodElementNameException.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-/**
- * Signals that a method element name is invalid.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class InvalidMethodElementNameException extends LibraryServiceException {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public InvalidMethodElementNameException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public InvalidMethodElementNameException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public InvalidMethodElementNameException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the error message and the root cause of the
-	 * exception.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public InvalidMethodElementNameException(String errorMsg,
-			Throwable rootCause) {
-		super(errorMsg, rootCause);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryAlreadyExistsException.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryAlreadyExistsException.java
deleted file mode 100644
index 9e7115c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryAlreadyExistsException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-/**
- * Signals that a Method Library already exists.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryAlreadyExistsException extends LibraryServiceException {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryAlreadyExistsException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public LibraryAlreadyExistsException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public LibraryAlreadyExistsException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the error message and the root cause of the
-	 * exception.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public LibraryAlreadyExistsException(String errorMsg, Throwable rootCause) {
-		super(errorMsg, rootCause);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryManagerFactory.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryManagerFactory.java
deleted file mode 100644
index 6bde073..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryManagerFactory.java
+++ /dev/null
@@ -1,178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.internal.LibraryManagerElement;
-import org.eclipse.epf.services.Services;
-import org.osgi.framework.Bundle;
-
-/**
- * Manages the creation of Library Manager instances.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryManagerFactory {
-
-	/**
-	 * The extension point namespace.
-	 */
-	public static final String EXTENSION_POINT_NAMESPACE = "org.eclipse.epf.library"; //$NON-NLS-1$
-
-	/**
-	 * The extension point name.
-	 */
-	public static final String EXTENSION_POINT_NAME = "libraryManagers"; //$NON-NLS-1$
-
-	/**
-	 * The "class" attribute name.
-	 */
-	public static final String CLASS_ATTRIB_NAME = "class"; //$NON-NLS-1$
-
-	/**
-	 * The "type" attribute name.
-	 */
-	public static final String TYPE_ATTRIB_NAME = "type"; //$NON-NLS-1$
-
-	/**
-	 * The "typeName" attribute name.
-	 */
-	public static final String TYPE_NAME_ATTRIB_NAME = "typeName"; //$NON-NLS-1$
-
-	private static final String VERSION_ATTRIB_NAME = "version"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static LibraryManagerFactory instance = null;
-
-	// A map of library manager configuration elements.
-	private Map<String, LibraryManagerElement> libraryManagerElements = new HashMap<String, LibraryManagerElement>();
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static LibraryManagerFactory getInstance() {
-		if (instance == null) {
-			synchronized (LibraryManagerFactory.class) {
-				if (instance == null) {
-					instance = new LibraryManagerFactory();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private LibraryManagerFactory() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		// Process the "org.eclipse.epf.library.libraryManagers" extension point
-		// contributors.
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				EXTENSION_POINT_NAMESPACE, EXTENSION_POINT_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String className = configElement
-								.getAttribute(CLASS_ATTRIB_NAME);
-						String typeId = configElement
-								.getAttribute(TYPE_ATTRIB_NAME);
-						String typeName = configElement
-								.getAttribute(TYPE_NAME_ATTRIB_NAME);
-						if (className != null && className.trim().length() > 0
-								&& typeId != null && typeId.trim().length() > 0
-								&& typeName != null
-								&& typeName.trim().length() > 0) {							
-							int version = Services.parseVersion(configElement.getAttribute(VERSION_ATTRIB_NAME));
-							LibraryManagerElement provider = libraryManagerElements.get(typeId);
-							if(provider == null || provider.getVersion() < version) {
-								provider = new LibraryManagerElement(
-										bundle, className, typeId, typeName, version);
-								libraryManagerElements.put(typeId, provider);
-							}
-						}
-					} catch (Exception e) {
-						LibraryPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates a new library manager instance.
-	 * 
-	 * @param type
-	 *            the method library type
-	 * @return a library manager
-	 * @throw <code>CreateLibraryManagerException</code> if an error occurs
-	 *        while performing the operation
-	 */
-	public ILibraryManager createLibraryManager(String type)
-			throws CreateLibraryManagerException {
-		LibraryManagerElement provider = (LibraryManagerElement) libraryManagerElements
-				.get(type);
-		if (provider == null) {
-			throw new CreateLibraryManagerException();
-		}
-		try {
-			Class clazz = provider.getBundle().loadClass(
-					provider.getClassName());
-			return (ILibraryManager) clazz.newInstance();
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-			throw new CreateLibraryManagerException(e);
-		}
-	}
-
-	/**
-	 * Returns all the library types registered via the
-	 * "org.eclipse.epf.library.libraryManagers" extension point.
-	 * 
-	 * @return a map of library types
-	 */
-	public Map getLibraryTypes() {
-		Map<String, String> types = new HashMap<String, String>();
-		for (Iterator it = libraryManagerElements.keySet().iterator(); it
-				.hasNext();) {
-			String typeId = (String) it.next();
-			String typeName = ((LibraryManagerElement) libraryManagerElements
-					.get(typeId)).getTypeName();
-			types.put(typeId, typeName);
-		}
-		return types;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryNotFoundException.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryNotFoundException.java
deleted file mode 100644
index 5a89f22..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryNotFoundException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-/**
- * Signals that a Method Library cannot be located.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryNotFoundException extends LibraryServiceException {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryNotFoundException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public LibraryNotFoundException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public LibraryNotFoundException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the error message and the root cause of the
-	 * exception.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public LibraryNotFoundException(String errorMsg, Throwable rootCause) {
-		super(errorMsg, rootCause);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryPlugin.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryPlugin.java
deleted file mode 100644
index ebacd0c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryPlugin.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.epf.common.AbstractActivator;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Library plug-in class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryPlugin extends AbstractActivator {
-
-	private static final String LAYOUT_PATH = "layout/"; //$NON-NLS-1$;
-
-	public static final String LAYOUT_XSL_PATH = "layout/xsl/"; //$NON-NLS-1$;
-	private static final String LAYOUT_CSS_PATH = "layout/css/"; //$NON-NLS-1$;
-
-	public static final String LAYOUT_SCRIPTS_FOLDER = "scripts"; //$NON-NLS-1$;
-
-	public static final String LAYOUT_SCRIPTS_PATH = "layout/scripts/"; //$NON-NLS-1$;
-
-	// The shared plug-in instance.
-	private static LibraryPlugin plugin;
-
-	private String layoutPath, layoutXslPath, layoutCssPath;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		try {
-			URL url = new URL(super.getInstallURL(), LAYOUT_PATH);
-			layoutPath = FileLocator.resolve(url).getPath();
-
-			url = new URL(super.getInstallURL(), LAYOUT_XSL_PATH);
-			layoutXslPath = FileLocator.resolve(url).getPath();
-
-			url = new URL(super.getInstallURL(), LAYOUT_CSS_PATH);
-			layoutCssPath = FileLocator.resolve(url).getPath();
-
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-
-		LayoutResources.clear();
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static LibraryPlugin getDefault() {
-		return plugin;
-	}
-
-	public String getLayoutPath() {
-		return layoutPath;
-	}
-
-	public String getLayoutXslPath() {
-		return layoutXslPath;
-	}
-
-	public String getLayoutCssPath() {
-		return layoutCssPath;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryResources.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryResources.java
deleted file mode 100644
index aec64e7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryResources.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.library;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class LibraryResources extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.epf.library.Resources";//$NON-NLS-1$
-
-	private LibraryResources() {
-		// Do not instantiate
-	}
-
-	public static String libUpgradeRequired_err_msg;
-	public static String oldToolVersion_err_msg;
-	public static String toolVersionMismatch_err_msg;
-	public static String unknown_text;
-	public static String emptyLibraryPathError_reason;
-	public static String missingLibraryFileError_reason;
-	public static String unresolvedProxyError_reason;
-	public static String configClosureWarning_msg1;
-	public static String configClosureWarning_msg2;
-	public static String configClosureWarning_msg3;
-	public static String loadResourcesError_msg;
-	public static String unsupportedGuidanceTypeError_msg;
-	public static String convertGuidanceError_msg;
-	public static String saveConvertedGuidanceError_msg;
-	public static String convertActivityError_title;
-	public static String convertActivityError_msg;
-	public static String saveConvertedActivityError_msg;
-	public static String error_reason;
-	public static String unsupportedGuidanceTypeError_reason;
-	public static String invalidLibraryPathError_reason;
-	public static String couldNotLockLibrary_reason;
-	public static String copyingAttachmentsTask_name;
-	public static String convertGuidanceDialog_title;
-	public static String convertGuidanceDialog_text;
-	public static String checklist_text;
-	public static String concept_text;
-	public static String example_text;
-	public static String guideline_text;
-	public static String estimate_text;
-	public static String estimatingMetric_text;
-	public static String estimationConsiderations_text;
-	public static String report_text;
-	public static String template_text;
-	public static String supportingMaterial_text;
-	public static String toolMentor_text;
-	public static String whitepaper_text;
-	public static String termDefinition_text;
-	public static String practice_text;
-	public static String reusableAsset_text;
-	public static String ActivityLayout_primaryTasks_text;
-	public static String ActivityLayout_additionalTasks_text;
-	public static String convertGuidanceError_title;
-	public static String loadResourcesError_title;
-	public static String loadResourcesError_reason;
-	public static String roleDiagramPerforms_text;
-	public static String roleDiagramResponsibleFor_text;
-	public static String DefaultContentValidator_MSG0;
-	public static String DefaultContentValidator_MSG1;
-	public static String DefaultContentValidator_MSG4;
-	public static String DefaultContentValidator_MSG7;
-	public static String DefaultContentValidator_MSG10;
-	public static String DefaultContentValidator_MSG11;
-	public static String DefaultContentValidator_MSG12;
-	public static String DefaultContentValidator_MSG15;
-	public static String DefaultContentValidator_MSG17;
-	public static String DefaultContentValidator_MSG19;
-	public static String ImportExportUtil_MSG8;
-	public static String ImportExportUtil_MSG9;
-	public static String unknownGuidance_text;
-	public static String CopyAttachmentsToNewLocation_log_noContentPath;
-	public static String LibraryModificationHelper_cannotUpdate;
-	public static String warningDlg_title;
-	public static String errorDlg_title;
-	public static String errorDlg_saveError;
-	public static String roleDiagramFont_name;
-	public static String roleDiagramFont_name_win32;
-	public static String roleDiagramFont_name_ja;
-	public static String roleDiagramFont_name_win32_ja;
-	public static String roleDiagramFont_name_ko;
-	public static String roleDiagramFont_name_win32_ko;
-	public static String roleDiagramFont_name_zh;
-	public static String roleDiagramFont_name_win32_zh;
-	public static String roleDiagramFont_name_zh_TW;
-	public static String roleDiagramFont_name_win32_zh_TW;
-	public static String roleDiagramFont_size;
-	public static String roleDiagramFont_size_win32;
-	public static String roleDiagram_xMargin;
-	public static String roleDiagram_xSpacing;
-	public static String roleDiagram_ySpacing;
-	public static String activityDiagramName;
-	public static String activityDetailDiagramName;
-	public static String wpDependencyDiagramName;
-	public static String colon_with_space;
-	
-	public static String ElementError_missing_element;
-	public static String ElementError_contributor_missing_base;
-	public static String ElementError_extender_missing_base;
-	public static String ElementError_replacer_missing_base;	
-	public static String ElementError_missing_primary_performer;
-	public static String ElementError_missing_mandatory_input;
-	public static String ElementError_missing_output;
-	
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, LibraryResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryService.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryService.java
deleted file mode 100644
index 7b88579..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryService.java
+++ /dev/null
@@ -1,735 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.io.File;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.common.utils.CommandLineRunUtil;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.I18nUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.UmaFactory;
-
-/**
- * The default Library Service implementation.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LibraryService implements ILibraryService {
-
-	protected static final int EVENT_CREATE_LIBRARY = 1;
-
-	protected static final int EVENT_OPEN_LIBRARY = 2;
-
-	protected static final int EVENT_REOPEN_LIBRARY = 3;
-
-	protected static final int EVENT_CLOSE_LIBRARY = 4;
-
-	protected static final int EVENT_SET_CURRENT_LIBRARY = 5;
-
-	protected static final int EVENT_SET_CURRENT_CONFIGURATION = 6;
-
-	// The shared instance.
-	protected static ILibraryService instance;
-
-	// A map of method libraries to library managers.
-	protected Map<MethodLibrary, ILibraryManager> libraryManagers = new HashMap<MethodLibrary, ILibraryManager>();
-
-	// A map of method configurations to configuration managers.
-	protected Map<MethodConfiguration, IConfigurationManager> configManagers = new HashMap<MethodConfiguration, IConfigurationManager>();
-
-	// The library service listeners.
-	protected List<ILibraryServiceListener> listeners = new ArrayList<ILibraryServiceListener>();
-
-	// The current method library.
-	protected MethodLibrary currentLibrary;
-
-	// The current method configuration.
-	protected MethodConfiguration currentConfig;
-
-	// If true, the current method library is being closed.
-	private boolean closingCurrentLibrary;
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ILibraryService getInstance() {
-		if (instance == null) {
-			synchronized (LibraryService.class) {
-				if (instance == null) {
-					instance = new LibraryService();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private LibraryService() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		// Initialize the library manager factory to pre-process the
-		// "org.eclipse.epf.library.libraryManagers" extension point.
-		LibraryManagerFactory.getInstance();
-
-		if (CommandLineRunUtil.getInstance().isNeedToRun()) {
-			return;
-		}
-	}
-
-	/**
-	 * Creates a new method library.
-	 * 
-	 * @param name
-	 *            a name for the new method library
-	 * @param type
-	 *            the method library type
-	 * @param args
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary createMethodLibrary(String name, String type,
-			Map<String, Object> params) throws LibraryServiceException {
-		if (name == null || type == null || params == null) {
-			throw new IllegalArgumentException();
-		}
-
-		boolean reopenLibrary = LibraryService.getInstance()
-				.getCurrentMethodLibrary() != null;
-
-		try {
-			LibraryService.getInstance().closeCurrentMethodLibrary();
-
-			ILibraryManager manager = LibraryManagerFactory.getInstance()
-					.createLibraryManager(type);
-			MethodLibrary library = manager.createMethodLibrary(name, params);
-			if (library != null) {
-				// open newly created method library without sending out notification
-				//
-				library = manager.openMethodLibrary(manager.getMethodLibraryURI());
-
-				setLibraryManager(manager);
-
-				// Set the current library, do this before notifying the library
-				// listeners.
-				setCurrentMethodLibrary(library);
-
-				// Save the library URI and type to preference store.
-				saveMethodLibraryPreferences(manager.getMethodLibraryURI(),
-						type);
-
-				notifyListeners(library, EVENT_CREATE_LIBRARY);								
-			}
-
-			reopenLibrary = false;
-
-			return library;
-		} catch (LibraryServiceException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new LibraryServiceException(e);
-		} finally {
-			if (reopenLibrary) {
-				openLastOpenedMethodLibrary();
-			}
-		}
-	}
-
-	/**
-	 * Opens an existing method library.
-	 * 
-	 * @param type
-	 *            the method library type
-	 * @param uri
-	 *            the method library URI
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(String type, URI uri)
-			throws LibraryServiceException {
-		if (uri == null) {
-			throw new IllegalArgumentException();
-		}
-
-		try {
-			ILibraryManager manager = LibraryManagerFactory.getInstance()
-					.createLibraryManager(type);
-			MethodLibrary library = manager.openMethodLibrary(uri);
-			if (library != null) {
-				setLibraryManager(manager);
-
-				// Set the current library, do this before notifying the library
-				// listeners.
-				setCurrentMethodLibrary(library);
-
-				// Save the library URI and type to preference store.
-				saveMethodLibraryPreferences(manager.getMethodLibraryURI(),
-						type);
-
-				notifyListeners(library, EVENT_OPEN_LIBRARY);
-			}
-			return library;
-		} catch (CreateLibraryManagerException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new LibraryServiceException(e);
-		}
-	}
-
-	/**
-	 * Opens an existing method library.
-	 * 
-	 * @param type
-	 *            the method library type
-	 * @param params
-	 *            method library specific arguments
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary openMethodLibrary(String type,
-			Map<String, Object> params) throws LibraryServiceException {
-		if (params == null) {
-			throw new IllegalArgumentException();
-		}
-
-		try {
-			ILibraryManager manager = LibraryManagerFactory.getInstance()
-					.createLibraryManager(type);
-			MethodLibrary library = manager.openMethodLibrary(params);
-			if (library != null) {
-				setLibraryManager(manager);
-
-				// Set the current library, do this before notifying the library
-				// listeners.
-				setCurrentMethodLibrary(library);
-
-				// Save the library URI and type to preference store.
-				saveMethodLibraryPreferences(manager.getMethodLibraryURI(),
-						type);
-
-				notifyListeners(library, EVENT_OPEN_LIBRARY);
-			}
-			return library;
-		} catch (CreateLibraryManagerException e) {
-			throw e;
-		} catch (Exception e) {
-			throw new LibraryServiceException(e);
-		}
-	}
-
-	/**
-	 * Opens the last opened method library.
-	 * 
-	 * @return a method library or <code>null</code>
-	 */
-	public MethodLibrary openLastOpenedMethodLibrary() {
-		String savedMethodLibraryURI = LibraryPreferences
-				.getSavedMethodLibraryURI();
-		try {
-			URI uri = new URI(savedMethodLibraryURI);
-			if (uri.getPath().length() == 0) {
-				return null;
-			}
-
-			String type = LibraryPreferences.getSavedMethodLibraryType();
-			if (type == null || type.length() == 0) {
-				return null;
-			}
-
-			return openMethodLibrary(type, uri);
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logWarning(
-					"Unable to open the last opened method library '" //$NON-NLS-1$
-							+ savedMethodLibraryURI + "'."); //$NON-NLS-1$
-			LibraryPreferences.setSavedMethodLibraryURI(""); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * Reopens a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary reopenMethodLibrary(MethodLibrary library)
-			throws LibraryServiceException {
-		ILibraryManager manager = getLibraryManager(library);
-		if (manager != null) {
-			try {
-				removeLibraryManager(manager);
-				library = manager.reopenMethodLibrary();
-
-				// Re-register the library manager since the library instance
-				// will be changed.
-				setLibraryManager(manager);
-
-				// Set the current library, do this before notifying the library
-				// listeners.
-				setCurrentMethodLibrary(library);
-
-				notifyListeners(library, EVENT_REOPEN_LIBRARY);
-			} catch (Exception e) {
-				throw new LibraryServiceException(e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Reopens the current method library.
-	 * 
-	 * @return a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodLibrary reopenCurrentMethodLibrary()
-			throws LibraryServiceException {
-		return reopenMethodLibrary(currentLibrary);
-	}
-
-	/**
-	 * Saves a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void saveMethodLibrary(MethodLibrary library)
-			throws LibraryServiceException {
-		ILibraryManager manager = getLibraryManager(library);
-		if (manager != null) {
-			manager.saveMethodLibrary();
-		}
-	}
-
-	/**
-	 * Saves the current method library.
-	 * 
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void saveCurrentMethodLibrary() throws LibraryServiceException {
-		saveMethodLibrary(currentLibrary);
-	}
-
-	/**
-	 * Closes a method library.
-	 * <p>
-	 * This automatically disposes its library manager and the configuration
-	 * managers that manage the method configurations in the method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public void closeMethodLibrary(MethodLibrary library)
-			throws LibraryServiceException {
-		ILibraryManager manager = getLibraryManager(library);
-		if (manager != null) {
-			notifyListeners(library, EVENT_CLOSE_LIBRARY);
-			manager.closeMethodLibrary();
-			if (currentLibrary == library) {
-				setCurrentMethodLibrary(null);
-				setCurrentMethodConfiguration(null);
-			}
-			removeLibraryManager(manager);
-			manager.dispose();
-		}
-	}
-
-	/**
-	 * Closes the current method library.
-	 * 
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public synchronized void closeCurrentMethodLibrary()
-			throws LibraryServiceException {
-		if (closingCurrentLibrary)
-			return;
-		try {
-			closingCurrentLibrary = true;
-			if (currentLibrary != null) {
-				closeMethodLibrary(currentLibrary);
-			}
-		} finally {
-			closingCurrentLibrary = false;
-		}
-	}
-
-	/**
-	 * Replaces a the method library.
-	 * 
-	 * @param oldLibrary
-	 *            the old method library
-	 * @param newLibrary
-	 *            the new method library
-	 */
-	public void replaceMethodLibrary(MethodLibrary oldLibrary,
-			MethodLibrary newLibrary) {
-		ILibraryManager manager = getLibraryManager(oldLibrary);
-		if (manager != null) {
-			removeLibraryManager(manager);
-
-			// Set the new library instance to prevent the library manager from
-			// referencing the old library instance.
-			manager.setMethodLibrary(newLibrary);
-
-			setLibraryManager(manager);
-		}
-	}
-
-	/**
-	 * Adds a listener to monitor Library Service events.
-	 * 
-	 * @param listener
-	 *            a library service listener
-	 */
-	public void addListener(ILibraryServiceListener listener) {
-		listeners.add(listener);
-	}
-
-	/**
-	 * Removes a listener that was added to monitor Library Service events.
-	 * 
-	 * @param listener
-	 *            a library service listener
-	 */
-	public void removeListener(ILibraryServiceListener listener) {
-		listeners.remove(listener);
-	}
-
-	/**
-	 * Gets the current method library.
-	 * 
-	 * @return a method library
-	 */
-	public MethodLibrary getCurrentMethodLibrary() {
-		return currentLibrary;
-	}
-
-	/**
-	 * Sets the current method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 */
-	public void setCurrentMethodLibrary(MethodLibrary library) {
-		currentLibrary = library;
-		notifyListeners(library, EVENT_SET_CURRENT_LIBRARY);
-	}
-
-	/**
-	 * Gets the current method library location path.
-	 * <p>
-	 * Note: A file-based method library may return <code>null</code>.
-	 * 
-	 * @return an absolute path to the current method library
-	 */
-	public String getCurrentMethodLibraryLocation() {
-		ILibraryManager manager = getLibraryManager(currentLibrary);
-		if (manager != null) {
-			return manager.getMethodLibraryLocation();
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * Gets the library manager for a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return a library manager
-	 */
-	public ILibraryManager getLibraryManager(MethodLibrary library) {
-		return (ILibraryManager) libraryManagers.get(library);
-	}
-
-	public void removeLibraryManager(ILibraryManager libMgr) {
-		if (libMgr != null) {
-			MethodLibrary lib = libMgr.getMethodLibrary();
-			if (lib != null) {
-				removeConfigurationManagers(lib);
-				libraryManagers.remove(lib);
-			}
-		}
-	}
-
-	public void setLibraryManager(ILibraryManager libMgr) {
-		MethodLibrary lib = libMgr.getMethodLibrary();
-		if (lib != null) {
-			libraryManagers.put(lib, libMgr);
-		}
-
-	}
-
-	/**
-	 * Gets the library manager for the current method library.
-	 * 
-	 * @return a library manager
-	 */
-	public ILibraryManager getCurrentLibraryManager() {
-		return getLibraryManager(currentLibrary);
-	}
-
-	/**
-	 * Creates a new method configuration.
-	 * 
-	 * @param name
-	 *            a name for the new method configuration
-	 * @param library
-	 *            the containing method library
-	 * @return a method configuration
-	 * @throw <code>LibraryServiceException</code> if an error occurs while
-	 *        performing the operation
-	 */
-	public MethodConfiguration createMethodConfiguration(String name,
-			MethodLibrary library) throws LibraryServiceException {
-		if (name == null || library == null) {
-			throw new IllegalArgumentException();
-		}
-
-		MethodConfiguration config;
-		List configs = library.getPredefinedConfigurations();
-		for (Iterator it = configs.iterator(); it.hasNext();) {
-			config = (MethodConfiguration) it.next();
-			if (name.equals(config.getName())) {
-				throw new ConfigurationAlreadyExistsException();
-			}
-		}
-
-		config = UmaFactory.eINSTANCE.createMethodConfiguration();
-		config.setName(name);
-		configs.add(config);
-		return config;
-	}
-
-	/**
-	 * Gets the current method configuration.
-	 * 
-	 * @return a method configuration
-	 */
-	public MethodConfiguration getCurrentMethodConfiguration() {
-		return currentConfig;
-	}
-
-	/**
-	 * Sets the current method configuration.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 */
-	public void setCurrentMethodConfiguration(MethodConfiguration config) {
-		currentConfig = config;
-		notifyListeners(config, EVENT_SET_CURRENT_CONFIGURATION);
-	}
-
-	/**
-	 * Gets the configuration manager for a method configuration.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 * @return a configuration manager
-	 */
-	public IConfigurationManager getConfigurationManager(
-			MethodConfiguration config) {
-		if (config == null) {
-			throw new IllegalArgumentException();
-		}
-		IConfigurationManager manager = (IConfigurationManager) configManagers
-				.get(config);
-		if (manager == null) {
-			manager = new ConfigurationManager(config);
-			configManagers.put(config, manager);
-		}
-		return manager;
-	}
-
-	public void removeConfigurationManager(MethodConfiguration config) {
-		if (config == null) {
-			throw new IllegalArgumentException();
-		}
-
-		IConfigurationManager mgr = (IConfigurationManager) configManagers
-				.remove(config);
-		if (mgr != null) {
-			mgr.dispose();
-		}
-	}
-
-	public void removeConfigurationManagers(MethodLibrary library) {
-		if (library == null) {
-			throw new IllegalArgumentException();
-		}
-
-		MethodConfiguration[] configs = LibraryServiceUtil
-				.getMethodConfigurations(library);
-		for (int i = 0; i < configs.length; i++) {
-			removeConfigurationManager(configs[i]);
-		}
-	}
-
-	/**
-	 * Gets the configuration manager for the current method configuration.
-	 * 
-	 * @return a configuration manager
-	 */
-	public IConfigurationManager getCurrentConfigurationManager() {
-		if (currentConfig != null) {
-			return getConfigurationManager(currentConfig);
-		}
-		return null;
-	}
-
-	/**
-	 * Sends a method library related event to all library service listeners.
-	 */
-	protected void notifyListeners(final MethodLibrary library, int eventId) {
-		for (Iterator<ILibraryServiceListener> it = new ArrayList<ILibraryServiceListener>(
-				listeners).iterator(); it.hasNext();) {
-			final ILibraryServiceListener listener = it.next();
-			switch (eventId) {
-			case EVENT_CREATE_LIBRARY:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						listener.libraryCreated(library);
-					}
-				});
-				break;
-			case EVENT_OPEN_LIBRARY:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						listener.libraryOpened(library);
-					}
-				});
-				break;
-			case EVENT_REOPEN_LIBRARY:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						listener.libraryReopened(library);
-					}
-				});
-				break;
-			case EVENT_CLOSE_LIBRARY:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						listener.libraryClosed(library);
-					}
-				});
-				break;
-			case EVENT_SET_CURRENT_LIBRARY:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						listener.librarySet(library);
-					}
-				});
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Sends a method configuration related event to all library service
-	 * listeners.
-	 */
-	protected void notifyListeners(final MethodConfiguration config, int eventId) {
-		for (Iterator<ILibraryServiceListener> it = new ArrayList<ILibraryServiceListener>(
-				listeners).iterator(); it.hasNext();) {
-			final ILibraryServiceListener listener = it.next();
-			switch (eventId) {
-			case EVENT_SET_CURRENT_CONFIGURATION:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						listener.configurationSet(config);
-					}
-				});
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Saves the method library URI and type to preference store.
-	 * 
-	 * @param uri
-	 *            the method library URI
-	 * @param type
-	 *            the menthod library type
-	 */
-	protected void saveMethodLibraryPreferences(URI uri, String type) {
-		LibraryPreferences.setSavedMethodLibraryURI(uri.toString());
-		LibraryPreferences.setSavedMethodLibraryType(type);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.ILibraryService#registerMethodLibrary(org.eclipse.epf.uma.MethodLibrary, java.lang.String, java.util.Map)
-	 */
-	public void  registerMethodLibrary(MethodLibrary lib, String type,
-			Map<String, Object> params) throws LibraryServiceException {
-		//For now, still simply wraping up old implementation (copied from ConfigurationExportService) for smoother change; will definetly change later
-		//so that creating a new lib would not be needed		
-		ILibraryManager libMgr = LibraryManagerFactory.getInstance()
-			.createLibraryManager(type);
-		libMgr.registerMethodLibrary(lib, params);
-		//libMgr.createMethodLibrary(name, params);
-		//libMgr.setMethodLibrary(lib);
-		LibraryService.getInstance().setLibraryManager(libMgr);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.ILibraryService#unRegisterMethodLibrary(org.eclipse.epf.uma.MethodLibrary)
-	 */
-	public void unRegisterMethodLibrary(MethodLibrary lib) throws LibraryServiceException {
-		//For now, still simply wraping up old implementation (copied from ConfigurationExportService) for smoother change
-		ILibraryManager libMgr = getLibraryManager(lib);
-		if (libMgr == null) {
-			return;
-		}
-		removeLibraryManager(libMgr);
-		//libMgr.closeMethodLibrary();
-		libMgr.unRegisterMethodLibrary();
-		libMgr.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceException.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceException.java
deleted file mode 100644
index 7a93231..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-/**
- * Signals that a Library Service operation has failed.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryServiceException extends Exception {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LibraryServiceException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public LibraryServiceException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public LibraryServiceException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the error message and the root cause of the
-	 * exception.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public LibraryServiceException(String errorMsg, Throwable rootCause) {
-		super(errorMsg, rootCause);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceListener.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceListener.java
deleted file mode 100644
index e7d22bc..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceListener.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * A default library service listener.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryServiceListener implements ILibraryServiceListener {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#configurationSet(org.eclipse.epf.uma.MethodConfiguration)
-	 */
-	public void configurationSet(MethodConfiguration config) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryClosed(org.eclipse.epf.uma.MethodLibrary)
-	 */
-	public void libraryClosed(MethodLibrary library) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryCreated(org.eclipse.epf.uma.MethodLibrary)
-	 */
-	public void libraryCreated(MethodLibrary library) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryOpened(org.eclipse.epf.uma.MethodLibrary)
-	 */
-	public void libraryOpened(MethodLibrary library) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#libraryReopened(org.eclipse.epf.uma.MethodLibrary)
-	 */
-	public void libraryReopened(MethodLibrary library) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.ILibraryServiceListener#librarySet(org.eclipse.epf.uma.MethodLibrary)
-	 */
-	public void librarySet(MethodLibrary library) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceUtil.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceUtil.java
deleted file mode 100644
index cc4cc64..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/LibraryServiceUtil.java
+++ /dev/null
@@ -1,614 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-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.ResourceSet;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.configuration.MethodConfigurationElementList;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ModelStorage;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Helper utilities for accessing and managing a method library.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryServiceUtil {
-
-	// A checklist filter.
-	private static final IFilter CHECKLIST_FILTER = new IFilter() {
-		public boolean accept(Object obj) {
-			return obj instanceof Checklist;
-		}
-	};
-
-	/**
-	 * Gets the absolute path to a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return an absolute path to the method library
-	 */
-	public static String getMethodLibraryPath(MethodLibrary library) {
-		if (library == null) {
-			return null;
-		}
-		Resource resource = library.eResource();
-		if (resource != null) {
-			URI resourceURI = resource.getURI();
-			if (resourceURI != null && resourceURI.isFile()) {
-				String path = resourceURI.toFileString();
-				return new File(path).getParentFile().getAbsolutePath();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the absolute path to the current method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return an absolute path to the method library
-	 */
-	public static String getCurrentMethodLibraryPath() {
-		return getMethodLibraryPath(LibraryService.getInstance()
-				.getCurrentMethodLibrary());
-	}
-
-	/**
-	 * Gets the parent method library of a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a method library
-	 */
-	public static MethodLibrary getMethodLibrary(MethodElement element) {
-		for (EObject obj = element; obj != null; obj = obj.eContainer()) {
-			if (obj instanceof MethodLibrary) {
-				return (MethodLibrary) obj;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets a specific method configuration in a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @param name
-	 *            the method configuration name
-	 * @return a method configuration
-	 */
-	public static MethodConfiguration getMethodConfiguration(
-			MethodLibrary library, String name) {
-		if (library != null) {
-			MethodConfiguration config;
-			List<MethodConfiguration> configs = library
-					.getPredefinedConfigurations();
-			for (Iterator<MethodConfiguration> it = configs.iterator(); it
-					.hasNext();) {
-				config = it.next();
-				if (!(config instanceof ProcessFamily)
-						&& config.getName().equals(name)) {
-					return config;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets all the method configurations in a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return an array of method configurations
-	 */
-	public static MethodConfiguration[] getMethodConfigurations(
-			MethodLibrary library) {
-		List<MethodConfiguration> configs;
-		if (library != null) {
-			MethodConfiguration config;
-			configs = new ArrayList<MethodConfiguration>(library
-					.getPredefinedConfigurations());
-			for (Iterator<MethodConfiguration> i = configs.iterator(); i
-					.hasNext();) {
-				config = i.next();
-				if (config == null || config instanceof ProcessFamily) {
-					i.remove();
-				}
-			}
-		} else {
-			configs = Collections.EMPTY_LIST;
-		}
-		MethodConfiguration[] result = new MethodConfiguration[configs.size()];
-		configs.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Gets the names of all method configurations in a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @param name
-	 *            the method configuration name
-	 * @return an array of method configuration names
-	 */
-	public static String[] getMethodConfigurationNames(MethodLibrary library) {
-		List<String> configNames = new ArrayList<String>();
-		if (library != null) {
-			MethodConfiguration config;
-			List<MethodConfiguration> configs = library
-					.getPredefinedConfigurations();
-			for (Iterator<MethodConfiguration> i = configs.iterator(); i
-					.hasNext();) {
-				config = (MethodConfiguration) i.next();
-				if (!(config instanceof ProcessFamily)) {
-					configNames.add(config.getName());
-				}
-			}
-		}
-		String[] result = new String[configNames.size()];
-		configNames.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Gets all the processes in the current method library.
-	 * 
-	 * @retun a collection of <code>CapabilityPattern</code> and
-	 *        <code>DeliveryProcess</code>
-	 */
-	public static Map<String, Process> getProcesses() {
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map<String, Process> result = new TreeMap<String, Process>();
-		List<MethodPlugin> methodPlugins = LibraryUtil
-				.getMethodPlugins(library);
-		for (Iterator<MethodPlugin> i = methodPlugins.iterator(); i.hasNext();) {
-			MethodPlugin methodPlugin = i.next();
-			String capabilityPatternPaths[] = ModelStructure.DEFAULT.capabilityPatternPath;
-			MethodPackage methodPackage = UmaUtil.findMethodPackage(
-					methodPlugin, capabilityPatternPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				if (methodPackage instanceof ProcessPackage) {
-					getCapabilityPatterns((ProcessPackage) methodPackage,
-							result);
-				}
-			}
-			String deliveryProcessPaths[] = ModelStructure.DEFAULT.deliveryProcessPath;
-			methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-					deliveryProcessPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				if (methodPackage instanceof ProcessPackage) {
-					getDeliveryProcesses((ProcessPackage) methodPackage, result);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Gets all the capability patterns in the current method library.
-	 * 
-	 * @retun a collection of <code>CapabilityPattern</code>
-	 */
-	public static Map<String, Process> getCapabilityPatterns() {
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map<String, Process> result = new TreeMap<String, Process>();
-		List<MethodPlugin> methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator<MethodPlugin> i = methodPlugins.iterator(); i.hasNext();) {
-			MethodPlugin methodPlugin = i.next();
-			String capabilityPatternPaths[] = ModelStructure.DEFAULT.capabilityPatternPath;
-			MethodPackage methodPackage = UmaUtil.findMethodPackage(
-					methodPlugin, capabilityPatternPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				getCapabilityPatterns((ProcessPackage) methodPackage, result);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Gets all the capability patterns in a method plug-in.
-	 * 
-	 * @param plugin
-	 *            a method plug-in
-	 * @retun a collection of <code>CapabilityPattern</code>
-	 */
-	public static List<CapabilityPattern> getCapabilityPatterns(
-			MethodPlugin plugin) {
-		List<CapabilityPattern> capabilityPatterns = new ArrayList<CapabilityPattern>();
-		List<Process> items = TngUtil.getAllProcesses(plugin);
-		for (Iterator<Process> it = items.iterator(); it.hasNext();) {
-			Process process = it.next();
-			if (process instanceof CapabilityPattern) {
-				capabilityPatterns.add((CapabilityPattern) process);
-			}
-		}
-		return capabilityPatterns;
-	}
-
-	/**
-	 * Gets all the delivery processes in the current method library.
-	 * 
-	 * @retun a collection of <code>DeliveryProcess</code>
-	 */
-	public static Map<String, Process> getDeliveryProcesses() {
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map<String, Process> result = new TreeMap<String, Process>();
-		List<MethodPlugin> methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator<MethodPlugin> i = methodPlugins.iterator(); i.hasNext();) {
-			MethodPlugin methodPlugin = i.next();
-			String deliveryProcessPaths[] = ModelStructure.DEFAULT.deliveryProcessPath;
-			MethodPackage methodPackage = UmaUtil.findMethodPackage(
-					methodPlugin, deliveryProcessPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				getDeliveryProcesses((ProcessPackage) methodPackage, result);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Gets all the delivery processes in a method plug-in.
-	 * 
-	 * @param plugin
-	 *            a method plug-in
-	 * @retun a collection of <code>DeliveryProcess</code>
-	 */
-	public static List<DeliveryProcess> getDeliveryProcesses(MethodPlugin plugin) {
-		List<DeliveryProcess> deliveryProcesses = new ArrayList<DeliveryProcess>();
-		List<Process> items = TngUtil.getAllProcesses(plugin);
-		for (Iterator<Process> it = items.iterator(); it.hasNext();) {
-			Process process = it.next();
-			if (process instanceof DeliveryProcess) {
-				deliveryProcesses.add((DeliveryProcess) process);
-			}
-		}
-		return deliveryProcesses;
-	}
-
-	/**
-	 * Gets all the capability patterns in a process package.
-	 * 
-	 * @param processPackage
-	 *            a process package
-	 * @param result
-	 *            a map
-	 * @return an updated map containing a collection of
-	 *         <code>CapabilityPattern</code>
-	 */
-	protected static void getCapabilityPatterns(ProcessPackage processPackage,
-			Map<String, Process> result) {
-		List<MethodPackage> childPackages = processPackage.getChildPackages();
-		for (Iterator<MethodPackage> i = childPackages.iterator(); i.hasNext();) {
-			MethodPackage pkg = i.next();
-			if (pkg instanceof ProcessComponent) {
-				ProcessComponent processComponent = (ProcessComponent) pkg;
-				org.eclipse.epf.uma.Process process = processComponent
-						.getProcess();
-				if (process instanceof CapabilityPattern) {
-					String name = process.getName();
-					result.put(name, process);
-				}
-			} else if (pkg instanceof ProcessPackage) {
-				getCapabilityPatterns((ProcessPackage) pkg, result);
-			}
-		}
-	}
-
-	/**
-	 * Gets all the delivery processes in a process package.
-	 * 
-	 * @param processPackage
-	 *            a process package
-	 * @param result
-	 *            a map
-	 * @return an updated map containing a collection of
-	 *         <code>DeliveryProcess</code>
-	 */
-	protected static void getDeliveryProcesses(ProcessPackage processPackage,
-			Map<String, Process> result) {
-		List<MethodPackage> childPackages = processPackage.getChildPackages();
-		for (Iterator<MethodPackage> i = childPackages.iterator(); i.hasNext();) {
-			MethodPackage pkg = i.next();
-			if (pkg instanceof ProcessComponent) {
-				ProcessComponent processComponent = (ProcessComponent) pkg;
-				org.eclipse.epf.uma.Process process = processComponent
-						.getProcess();
-				if (process instanceof DeliveryProcess) {
-					String name = process.getName();
-					result.put(name, process);
-				}
-			} else if (pkg instanceof ProcessPackage) {
-				getDeliveryProcesses((ProcessPackage) pkg, result);
-			}
-		}
-	}
-
-	/**
-	 * Gets the names of all process families in a method library.
-	 * 
-	 * @param library
-	 *            a method library
-	 * @return an array of process family names
-	 */
-	public static String[] getProcessFamilyNames(MethodLibrary library) {
-		List<String> processFamilyNames = new ArrayList<String>();
-		if (library != null) {
-			MethodConfiguration config;
-			List<MethodConfiguration> configs = library.getPredefinedConfigurations();
-			for (Iterator<MethodConfiguration> i = configs.iterator(); i.hasNext();) {
-				config = (MethodConfiguration) i.next();
-				if (config instanceof ProcessFamily) {
-					processFamilyNames.add(config.getName());
-				}
-			}
-		}
-
-		String[] result = new String[processFamilyNames.size()];
-		processFamilyNames.toArray(result);
-
-		return result;
-	}
-
-	/**
-	 * Gets the names of all contexts (method configurations) assigned to a
-	 * process.
-	 * 
-	 * @param process
-	 *            a capability pattern or delivery process
-	 * @return an array of context (method configuration) names
-	 */
-	public static String[] getContexts(Process process) {
-		List<String> contextNames = new ArrayList<String>();
-		if (process != null) {
-			List<MethodConfiguration> contexts = process.getValidContext();
-			for (Iterator<MethodConfiguration> it = contexts.iterator(); it.hasNext();) {
-				MethodConfiguration context = it.next();
-				contextNames.add(context.getName());
-			}
-		}
-		String[] result = new String[contextNames.size()];
-		contextNames.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Gets all the method configurations assigned to a process.
-	 * 
-	 * @param process
-	 *            a capability pattern or delivery process
-	 * @return a collection of <code>MethodConfiguration</code>
-	 */
-	public static Map<String, MethodConfiguration> getMethodConfigurations(Process process) {
-		if (process == null) {
-			return null;
-		}
-
-		Map<String, MethodConfiguration> result = new TreeMap<String, MethodConfiguration>();
-		MethodConfiguration defaultContext = process.getDefaultContext();
-		if (defaultContext != null) {
-			result.put(defaultContext.getName(), defaultContext);
-		}
-
-		List<MethodConfiguration> contexts = process.getValidContext();
-		for (Iterator<MethodConfiguration> i = contexts.iterator(); i.hasNext();) {
-			MethodConfiguration context = i.next();
-			if (context != null) {
-				result.put(context.getName(), context);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Gets all the checklists in a method configuration.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 * @return a collection of <code>Checklist</code>
-	 */
-	public static Map<String, Checklist> getChecklists(
-			MethodConfiguration config) {
-		if (config == null) {
-			return null;
-		}
-
-		Map<String, Checklist> result = new HashMap<String, Checklist>();
-
-		ArrayList<IFilter> filterList = new ArrayList<IFilter>();
-		filterList.add(CHECKLIST_FILTER);
-		MethodConfigurationElementList elementList = new MethodConfigurationElementList(
-				config, filterList);
-		List elements = elementList.getList();
-		for (Iterator it = elements.iterator(); it.hasNext();) {
-			Object obj = it.next();
-			if (obj instanceof Checklist) {
-				Checklist checklist = (Checklist) obj;
-				result.put(checklist.getName(), checklist);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Sets the GUID for a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 */
-	public void setGUID(MethodElement element) {
-		String guid = element.getGuid();
-		if (guid == null || guid.length() == 0) {
-			guid = EcoreUtil.generateUUID();
-			boolean oldNotify = element.eDeliver();
-			try {
-				element.eSetDeliver(false);
-				element.setGuid(guid);
-			} finally {
-				element.eSetDeliver(oldNotify);
-			}
-		}
-
-		List children = element.eContents();
-		if (children != null && children.size() > 0) {
-			for (Iterator it = children.iterator(); it.hasNext();) {
-				Object child = it.next();
-				if (child instanceof MethodElement) {
-					setGUID((MethodElement) child);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Gets the debug string for a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a string containing the method element class name, name and GUID
-	 */
-	public static String getDebugString(MethodElement element) {
-		if (element == null) {
-			return "null"; //$NON-NLS-1$
-		}
-		return element.getClass().getName() + "[name: " + element.getName() //$NON-NLS-1$
-				+ ", guid=" + element.getGuid() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Gets the current method library persister.
-	 * 
-	 * @return the current method library persister
-	 */
-	public static ILibraryPersister getCurrentPersister() {
-		try {
-			ResourceSet resourceSet = LibraryService.getInstance()
-					.getCurrentLibraryManager().getEditingDomain()
-					.getResourceSet();
-			if (resourceSet instanceof ILibraryResourceSet) {
-				return ((ILibraryResourceSet) resourceSet).getPersister();
-			}
-		} catch (NullPointerException e) {
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the method library persister for a given resource.
-	 * 
-	 * @return a method library persister
-	 */
-	public static ILibraryPersister getPersisterFor(Resource resource) {
-		ResourceSet resourceSet = resource.getResourceSet();
-		if (resourceSet instanceof ILibraryResourceSet) {
-			return ((ILibraryResourceSet) resourceSet).getPersister();
-		}
-		return null;
-	}
-
-	/**
-	 * Creates a new method plug-in.
-	 * 
-	 * @param name
-	 *            a name for the new plug-in
-	 * @param briefDesc
-	 *            a brief description for the new plug-in
-	 * @param authors
-	 *            the authors of the new plug-in
-	 * @param referencedPlugins
-	 *            the plug-ins referenced by the new plug-in
-	 */
-	public static MethodPlugin createMethodPlugin(String name,
-			String briefDesc, String authors, Object[] referencedPlugins)
-			throws Exception {
-		if (name == null || name.length() == 0) {
-			throw new IllegalArgumentException();
-		}
-
-		MethodPlugin plugin = UmaFactory.eINSTANCE.createMethodPlugin();
-
-		plugin.setName(StrUtil.makeValidFileName(name));
-		if (briefDesc != null) {
-			plugin.setBriefDescription(briefDesc);
-		}
-		if (authors != null) {
-			plugin.setAuthors(authors);
-		}
-		if (referencedPlugins != null) {
-			for (int i = 0; i < referencedPlugins.length; i++) {
-				MethodPlugin referencedPlugin = (MethodPlugin) referencedPlugins[i];
-				if (plugin != null) {
-					plugin.getBases().add(referencedPlugin);
-				}
-			}
-		}
-
-		ModelStorage.initialize(plugin);
-
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/Resources.properties b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/Resources.properties
deleted file mode 100644
index 2d3a3d7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/Resources.properties
+++ /dev/null
@@ -1,165 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-################################################################################
-# BEGIN NO TRANSLATION
-################################################################################
-
-# Role diagram fonts and layout
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name=Arial
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_ja=\u30c0\u30a4\u30a2\u30ed\u30b0
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_ko=\ub300\ud654 \uc0c1\uc790
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_zh=\u5bf9\u8bdd\u6846
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_zh_TW=Dialog
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_win32=Arial
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_win32_ja=MS Gothic
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_win32_ko=\uad74\ub9bc\uccb4
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_win32_zh=\u9ed1\u4f53
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_name_win32_zh_TW=\u7d30\u660e\u9ad4
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_size=10
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagramFont_size_win32=10
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagram_xMargin=200
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagram_xSpacing=70
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-roleDiagram_ySpacing=30
-
-################################################################################
-# END NO TRANSLATION
-################################################################################
-
-unknown_text=Unknown
-
-# Error Reasons
-emptyLibraryPathError_reason=The method library path is empty.
-missingLibraryFileError_reason=The method library model file is missing.
-unresolvedProxyError_reason=The selected method library contains unresolved element references. This is usually caused by missing or displaced XMI files in the library folder.\n\nClose this dialog and bring up the Problems view to help identify the unresolved references. To avoid corrupting the library, it is highly recommended that you resolve these references first before adding more changes to the library.
-
-# Warning Messages
-configClosureWarning_msg1=IUPL0007W: One or more child elements contain missing references
-configClosureWarning_msg2=IUPL0008W: This element should be selected to resolve one or more missing references
-configClosureWarning_msg3=IUPL0009W: This element references one or more elements in an unselected package
-
-ElementError_missing_element=''{0}'' references unselected element ''{1}''
-ElementError_contributor_missing_base=''{0}'' contributes to unselected element ''{1}''
-ElementError_extender_missing_base=''{0}'' extends unselected element ''{1}''
-ElementError_replacer_missing_base=''{0}'' replaces unselected element ''{1}''
-ElementError_missing_primary_performer=''{0}'' missing primary performer ''{1}''
-ElementError_missing_mandatory_input=''{0}'' missing mandatory input ''{1}''
-ElementError_missing_output=''{0}'' missing output ''{1}''
-
-# Error Messages
-loadResourcesError_msg=IUPL0000E: The method library has been loaded but some errors have been detected.
-unsupportedGuidanceTypeError_msg=IUPL0001E: This guidance cannot be converted to another type.
-convertGuidanceError_msg=IUPL0002E: This guidance cannot be converted to the target type.
-saveConvertedGuidanceError_msg=IUPL0003E: The converted guidance ''{0}'' cannot be saved.
-
-# Convert activity
-convertActivityError_title=Convert Activity Type Error
-convertActivityError_msg=IUPL0006E: This activity cannot be converted to the target type.
-saveConvertedActivityError_msg=IUPL0007E: The converted activity ''{0}'' cannot be saved.
-
-# Error Reasons
-error_reason=IUPL0004E: An error has occurred. Click OK for more information.
-unsupportedGuidanceTypeError_reason=There is no compatible guidance type for {0}.
-invalidLibraryPathError_reason=Invalid library path. The .project file could not be created.
-couldNotLockLibrary_reason=Could not lock library.
-
-# Progress Messages
-copyingAttachmentsTask_name=Copying attachments...
-
-# Convert Guidance Dialog
-convertGuidanceDialog_title=Convert Guidance Type
-convertGuidanceDialog_text=Select the target guidance type.
-
-# Guidance type names for Convert Guidance Dialog
-checklist_text=Checklist
-concept_text=Concept
-example_text=Example
-guideline_text=Guideline
-estimate_text=Estimate
-estimatingMetric_text=Estimating Metric
-estimationConsiderations_text=Estimation Considerations
-report_text=Report
-template_text=Template
-supportingMaterial_text=Supporting Material
-toolMentor_text=Tool Mentor
-whitepaper_text=Whitepaper
-termDefinition_text=Term Definition
-practice_text=Practice
-reusableAsset_text=Reusable Asset
-
-#activity breakdown info strings
-ActivityLayout_primaryTasks_text=Performs as Owner
-ActivityLayout_additionalTasks_text=Performs as Additional
-
-# Convert Guidance Error Messages
-convertGuidanceError_title=Convert Guidance Type Error
-
-# Load Resources Error Dialog
-loadResourcesError_title=Open Method Library Error
-loadResourcesError_reason=Some library resources could not be loaded.\n\nClick Details to review the errors and resolve them before adding more changes to the library.
-
-# Role Diagrams
-roleDiagramPerforms_text=performs
-roleDiagramResponsibleFor_text=responsible for
-
-DefaultContentValidator_MSG0=Referenced element: {0}
-DefaultContentValidator_MSG1=Info: {0}
-DefaultContentValidator_MSG4=Warning: {0}
-DefaultContentValidator_MSG7=Error: {0}
-DefaultContentValidator_MSG10=Missing referenced element {0}
-DefaultContentValidator_MSG11=Unable to find element for guid {0}
-DefaultContentValidator_MSG12=File ''{0}'' references missing resource ''{1}''
-DefaultContentValidator_MSG15=missing resource file ''{0}''
-DefaultContentValidator_MSG17=Unable to connect to URL ''{0}''
-DefaultContentValidator_MSG19=Unable to connect to URL ''{0}'': {1}
-ImportExportUtil_MSG8=Could not find file ''{0}''.
-ImportExportUtil_MSG9=Could not create temporary directory ''{0}''.
-unknownGuidance_text=Unknown
-
-CopyAttachmentsToNewLocation_log_noContentPath=CopyAttachmentsToNewLocation.HandleAttachmentsPlugin: no contentPath for {0}
-LibraryModificationHelper_cannotUpdate=IUPL0006W: Cannot update {0} {1}
-warningDlg_title=Warning
-errorDlg_title=Error
-errorDlg_saveError=IUPL0005E: Error saving changes to file ''{0}''
-
-# activity diagram names
-activityDiagramName=Activity diagram: {0}
-activityDetailDiagramName=Activity detail diagram: {0}
-wpDependencyDiagramName=Work product dependency diagram: {0}
-
-# localize the value based on locale.  for example, 
-# for English, the value is ". "
-#colon_with_space=: 
-# for French, the value is " . ", you need to use a \ to preserve the leading space
-#colon_with_space=\ : 
-# for Chinese, the colon should be double bytes
-# Don't trim the spaces after the colon.
-colon_with_space=: 
-
-oldToolVersion_err_msg=This version of {0} is not compatible with your library file ''{2}''. You must upgrade {0} to version {1} or higher in order to open it.
-toolVersionMismatch_err_msg=This version of {0} is not compatible with your library file ''{2}''. You must upgrade {0} to a higher version in order to open it.
-libUpgradeRequired_err_msg=The specified library needs to be upgraded to the new library structure. Open the library to upgrade it and try again.
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ActivityDeepCopyConfigurator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ActivityDeepCopyConfigurator.java
deleted file mode 100644
index 31fd0a3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ActivityDeepCopyConfigurator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.eclipse.epf.library.configuration;
-
-import org.eclipse.epf.library.edit.VariabilityInfo;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * A configurator used by activity deep copy command to resovle and deep copy contributors and
- * replacers of activity in a metohd configuration.
- *
- */
-public class ActivityDeepCopyConfigurator extends ConfigurationFilter{
-
-	
-	/**
-	 * constructor
-	 * @param methodConfig a <code>MethodConfiguration</code>
-	 * @param viewer a <code>Viewer</code>
-	 */
-	public ActivityDeepCopyConfigurator(MethodConfiguration methodConfig) {
-		super(methodConfig);
-	}
-	
-	
-	/**
-	 * Constructs with null methodConfig which could be set later.
-	 */
-	public ActivityDeepCopyConfigurator() {
-		this(null);
-	}
-	
-
-	@Override
-	public VariabilityInfo getVariabilityInfo(VariabilityElement ve) {
-
-		// calculate the element first
-		ElementRealizer realizer = new DefaultElementRealizer(methodConfig, false, true){
-			@Override
-			public boolean canShow(MethodElement element) {
-				return true;
-			}			
-		};
-		return getVariabilityInfo(ve, realizer);
-	}
-	
-	/**
-	 * Overrides the super method for not resolving the base to include additional contributors. 
-	 */
-	@Override
-	protected void resolveElementVariabilityList(VariabilityElement element,
-			VariabilityInfo info, boolean includeBase, ElementRealizer realizer) {
-
-		if (methodConfig == null) {
-			return;
-		}		
-		//resolve to include contributors
-		resolveElementContributors(element,info,realizer);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/AttributeFeatureValue.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/AttributeFeatureValue.java
deleted file mode 100644
index a15eae8..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/AttributeFeatureValue.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * for a given method element and attribute feature, 
- * realized the feature value based on the given realizer.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class AttributeFeatureValue extends FeatureValue {
-
-	// map of element and the value
-	LinkedHashMap valueMap = new LinkedHashMap();
-
-	/**
-	 * constrctor
-	 * 
-	 * @param element MethodElement the element whose feature value is to be realized
-	 * @param ownerElement MethodElement the owner element of this element, this is needed for handle the spacial cases 
-	 * where the element's eContainer is not properly set yet. For example, when a new ContentDescrition object is created, 
-	 * it's owner is not set until the content is saved.
-	 * @param feature Object The featue or opposite feature whose value is to be realized
-	 * @param realizer ElementRealizer the realizer used to realize the feature value.
-	 */
-	public AttributeFeatureValue(MethodElement element, MethodElement ownerElement, Object feature, ElementRealizer realizer) {
-		super(element, ownerElement, feature, realizer);
-	}
-	
-	/**
-	 * method to add a feature value to the value list. This value could be the element's own feature value, 
-	 * or the feature value of another variability element, such as a contributor. 
-	 * So the owner is passed in to indicate the origination of the value.
-	 * 
-	 * @param owner VariabilityElement the element that provide the value due to variability realization
-	 * @param value Object the feature value from the owner element
-	 */
-	public void add(VariabilityElement owner, Object value) {
-		if ( (value == null) || (value instanceof String)
-				&& value.toString().trim().length() == 0) {
-			return;
-		}
-		
-		// note: owner can be null, this is fine
-		valueMap.put(owner, value);
-	}
-
-	/**
-	 * return the size of the feature value list.
-	 * @return int
-	 */
-	public int size() {
-		return valueMap.size();
-	}
-	
-	/**
-	 * get the realized feature value.
-	 * @return Object the realized feature value.
-	 */
-	public Object getValue() {
-		StringBuffer buffer = new StringBuffer();
-		for (Iterator it = valueMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Map.Entry) it.next();
-			MethodElement e = (MethodElement)entry.getKey();
-			Object v = entry.getValue();
-			
-			if (v == null || v.toString().length() == 0) {
-				continue;
-			}
-
-			if ( isExtendReplaceEnabled() ) {
-				String str = StrUtil.getPlainText(v.toString()).trim();
-				if ( isBlankIndicator(str) ) {
-					continue;
-				}
-			}
-			
-			if (feature == UmaPackage.eINSTANCE
-					.getDescribableElement_PresentationName()) {
-				if (size() > 1) {
-					// something wrong here, will not happen but put test
-					// message here just in case
-					if (debug) {
-						System.out
-								.println("AttributeFeatureValue: Presentation Name get more then one entry: " + LibraryUtil.getTypeName(element)); //$NON-NLS-1$
-					}
-				}
-				return v;
-			}
-
-			if (buffer.length() > 0) {
-				buffer.append(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR); 
-			}
-
-			if ((e == element) && !(e instanceof Section) || e == null ) {
-				buffer.append(v);
-			} else {
-				String contentPath = ResourceHelper
-						.getElementPath((e instanceof ContentDescription) 
-								? (MethodElement) e.eContainer()
-								: e);
-
-				String backPath = ResourceHelper
-						.getBackPath((element instanceof ContentDescription) 
-								? ((ownerElement != null) ? ownerElement
-								: (MethodElement) element.eContainer())
-								: element);
-
-				buffer.append(ResourceHelper.fixContentUrlPath(v.toString(),
-						contentPath, backPath));
-			}
-		}
-
-		return buffer.toString();
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationApplicator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationApplicator.java
deleted file mode 100644
index e67c247..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationApplicator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.epf.library.edit.IConfigurationApplicator;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.1
- */
-public class ConfigurationApplicator implements IConfigurationApplicator {
-	public static final IConfigurationApplicator INSTANCE = new ConfigurationApplicator();
-
-	public Object getAttribute(VariabilityElement e, EAttribute attribute,
-			MethodConfiguration config) {
-		// special handling for presentation name of breakdown element
-		//
-		if(attribute == UmaPackage.eINSTANCE.getDescribableElement_PresentationName()) {
-			if(e instanceof BreakdownElement) {
-				return ProcessUtil.getPresentationName((BreakdownElement) e);
-			}
-			else {
-				return ConfigurationHelper.getPresentationName(e, config);
-			}
-		}
-		return ConfigurationHelper.calcAttributeFeatureValue(e, attribute,
-				config);
-	}
-
-	public Object getReference(VariabilityElement e, EReference ref,
-			MethodConfiguration config) {
-		if (ConfigurationHelper.is0nFeature(ref)) {
-			return ConfigurationHelper.calc0nFeatureValue(e, ref,
-					new DefaultElementRealizer(config));
-		} else if (ConfigurationHelper.is01Feature(ref)) {
-			return ConfigurationHelper.calc01FeatureValue(e, ref,
-					new DefaultElementRealizer(config));
-		}
-		return null;
-	}
-
-	public Object getReference(ContentDescription desc,
-			DescribableElement owner, EReference ref, MethodConfiguration config) {
-
-		List values = ConfigurationHelper.calc0nFeatureValue(desc, owner, ref,
-				new DefaultElementRealizer(config));
-		if (ref.isMany()) {
-			return values;
-		}
-		if (values.isEmpty())
-			return null;
-		return values;
-	}
-
-	public Object getReference(MethodElement element, OppositeFeature feature,
-			MethodConfiguration config) {
-		List values = ConfigurationHelper.calc0nFeatureValue(element, feature,
-				new DefaultElementRealizer(config));
-
-		return values;
-	}
-
-	public Object resolve(Object object, MethodConfiguration config) {
-		if (object instanceof MethodElement) {
-			Object resolved = ConfigurationHelper.getCalculatedElement(
-					(MethodElement) object, config);
-			if (resolved == null) {
-				return object;
-			} else {
-				return resolved;
-			}
-		} else {
-			return object;
-		}
-	}
-
-	public Object getAttribute(ContentDescription desc,
-			DescribableElement owner, EAttribute attr,
-			MethodConfiguration config) {
-		return ConfigurationHelper.calcAttributeFeatureValue(desc, owner, attr,
-				config);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationData.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationData.java
deleted file mode 100644
index 66dc394..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationData.java
+++ /dev/null
@@ -1,591 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.util.DebugUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- *  Class managing configuration data calculation and cache
- * 
- * @author Weiping Lu - Mar 20, 2007
- * @author Jinhua Xi
- * @since 1.2
- */
-public class ConfigurationData {
-
-	private static boolean localDebug = false;
-	private static boolean profiling = false;
-	
-	private MethodConfiguration config;
-	
-	// make sure the map is created.
-	private Map<String, MethodElement> substractedElemMap = new HashMap<String, MethodElement>();
-	private Map<String, MethodElement> addedElemMap = new HashMap<String, MethodElement>();
-
-	private boolean needUpdateChanges = true;
-	private Map<String, ContentCategory> originalSubstracted;
-	private Map<String, ContentCategory> orignalAdded;
-	private ILibraryManager libraryManager; 
-	private Adapter configListener;
-	private ILibraryChangeListener libListener;
-	private boolean enableUpdate = true;
-	
-	public ConfigurationData(MethodConfiguration config) {
-		this.config = config;
-		
-		configListener = new AdapterImpl() {
-			public void notifyChanged(Notification msg) {
-				if (isNeedUpdateChanges()) {
-					return;
-				}
-				int type = msg.getEventType();
-				if (		type == Notification.ADD
-						|| 	type == Notification.ADD_MANY
-						|| 	type == Notification.REMOVE
-						||  type == Notification.REMOVE_MANY) {					
-					setNeedUpdateChanges(true);
-				}
-			}
-		};
-		config.eAdapters().add(configListener);
-				
-		libListener = new ILibraryChangeListener() {
-			public void libraryChanged(int option, Collection changedItems) {
-				if (localDebug) {
-					//System.out.println("LD> libraryChanged, option: " + option + ", " + changedItems);//$NON-NLS-1$//$NON-NLS-2$
-				}
-				
-				if (isNeedUpdateChanges()) {
-					return;
-				}
-				for (Iterator it = changedItems.iterator(); it.hasNext();) {
-					Object item = it.next();
-					if (item instanceof ContentCategory) {
-						setNeedUpdateChanges(true);
-						return;
-					}
-				}
-			}
-		};
-		
-		MethodLibrary library = LibraryServiceUtil.getMethodLibrary(config);
-		libraryManager = LibraryService.getInstance().getLibraryManager(library);
-		if(libraryManager != null) {
-			libraryManager.addListener(libListener);
-		}
-	} 
-	
-	private boolean getUpdatingChanges() {
-		return originalSubstracted != null && orignalAdded != null;
-	}
-	
-	private void updateChanges() {
-		if (! isEnableUpdate()) {
-			return;
-		}		
-		if (! isNeedUpdateChanges()) {
-			return;
-		}
-		if (getUpdatingChanges()) {
-			return;			
-		}
-		
-		long t = 0;
-		if (profiling) {
-			System.out.println("LD> updateChanges_() -> ");	//$NON-NLS-1$
-			t = System.currentTimeMillis();
-		}
-		updateChanges_();
-		if (profiling) {
-			t =  System.currentTimeMillis() - t;
-			System.out.println("LD> updateChanges_() <- time: " + t);	//$NON-NLS-1$
-			System.out.println("");										//$NON-NLS-1$
-		}
-		
-	}
-	
-	private void updateChanges_() {
-		substractedElemMap.clear();
-		addedElemMap.clear();
-		
-		List subList = config.getSubtractedCategory();
-		List addList = config.getAddedCategory();
-		if (subList.isEmpty() && addList.isEmpty()) {
-			if (localDebug) {
-				System.out.println("LD> subList/addList are empty.");	//$NON-NLS-1$
-			}
-			return;
-		}
-		
-		originalSubstracted = convertToMap(subList);
-		orignalAdded = convertToMap(addList);
-		
-		if (localDebug) {
-			DebugUtil.print("originalSubstracted: ", null, originalSubstracted.values(), 2);	//$NON-NLS-1$
-			DebugUtil.print("orignalAdded: ", null, orignalAdded.values(), 2);					//$NON-NLS-1$
-		}
-		
-		boolean changed = remove(originalSubstracted, orignalAdded);
-		if (changed && localDebug) {
-			DebugUtil.print("orignalAdded after remove: ", null, orignalAdded.values(), 2);		//$NON-NLS-1$
-		}
-		
-		Map<String, ContentCategory> calSubstracted = (Map<String, ContentCategory>) 
-							((HashMap<String, ContentCategory>)originalSubstracted).clone();
-		Map<String, ContentCategory> calAdded = (Map<String, ContentCategory>) 
-							((HashMap<String, ContentCategory>)orignalAdded).clone();
-					
-		changed = handleContributors(calSubstracted, true);
-		if (changed && localDebug) {
-			DebugUtil.print("calSubstracted after handleContributors: ", null, calSubstracted.values(), 2);//$NON-NLS-1$
-		}		
-		
-		calSubstracted = handleReplacers(calSubstracted, true);
-		calAdded = handleReplacers(calAdded, false);
-		
-		if (localDebug) {
-			DebugUtil.print("calSubstracted: ", null, calSubstracted.values(), 2);//$NON-NLS-1$
-			DebugUtil.print("calAdded: ", null, calAdded.values(), 2);//$NON-NLS-1$
-		}
-		
-		changed = remove(calSubstracted, calAdded);
-		if (changed && localDebug) {
-			DebugUtil.print("calAdded after remove: ", null, orignalAdded.values(), 2);//$NON-NLS-1$
-		}				
-		
-		if (calSubstracted != null) {
-			updateElementMap(calSubstracted.values(), substractedElemMap);
-		}
-		if (calAdded != null) {
-			updateElementMap(calAdded.values(), addedElemMap);
-		}
-		
-		if (localDebug) {
-			DebugUtil.print("substractedElemMap: ", null, substractedElemMap.values(), 2);	//$NON-NLS-1$
-			DebugUtil.print("addedElemMap: ", null, addedElemMap.values(), 2);					//$NON-NLS-1$
-		}
-		
-		setNeedUpdateChanges(false);		
-		
-		originalSubstracted = null;		//not needed after update
-		orignalAdded = null;			//not needed after update
-	}
-	
-	//return true if something gets removed, otherwise false
-	private boolean remove(Map<String, ContentCategory> sourceMap, Map<String, ContentCategory> targetMap) {
-		if (sourceMap == null || sourceMap.isEmpty() ||
-			targetMap == null || targetMap.isEmpty()) {
-			return false;
-		}
-		
-		boolean ret = false;				
-		for (Iterator<String> it = sourceMap.keySet().iterator(); it.hasNext();) {
-			ContentCategory cc = targetMap.remove(it.next());
-			if (cc != null) {
-				ret = true;
-			}
-		}
-		return ret;
-	}
-		
-	//return true if any change
-	private boolean handleContributors(Map<String, ContentCategory> map,  boolean substracted) {
-		if (map == null || ! substracted) {
-			return false;
-		}
-		List<ContentCategory> addedList = new ArrayList<ContentCategory>();
-				
-		for (Iterator<ContentCategory> it = map.values().iterator(); it.hasNext();) {
-			ContentCategory cc = it.next();
-			List<ContentCategory> contributers = ConfigurationHelper.getContributors(cc, config);
-			addedList.addAll(contributers);
-		}
-		for (Iterator<ContentCategory> it = addedList.iterator(); it.hasNext();) {
-			ContentCategory cc = it.next();
-			map.put(cc.getGuid(), cc);
-		}
-		
-		return ! addedList.isEmpty();
-	}
-	
-	private Map<String, ContentCategory> handleReplacers(Map<String, ContentCategory> originals, boolean substracted) {
-		if (originals == null || originals.isEmpty()) {
-			return originals;
-		}
-		
-		Map<String, ContentCategory> ret = new HashMap<String, ContentCategory>();
-		
-		for (Iterator<ContentCategory> it = originals.values().iterator(); it.hasNext();) {
-			ContentCategory cc = it.next();
-			VariabilityElement replacer = ConfigurationHelper.getReplacer(cc, config);
-			boolean toKeep = true;
-			if (replacer != null) {
-				toKeep = false;
-				
-				VariabilityElement nestedReplacer = replacer;
-				while (nestedReplacer != null) {
-					replacer = nestedReplacer;
-					nestedReplacer = ConfigurationHelper.getReplacer(nestedReplacer, config);
-				}
-				if (substracted) {
-					if (originalSubstracted.containsKey(replacer.getGuid())) {
-						toKeep = true;
-					}
-				}
-			}
-			if (toKeep) {
-				ret.put(cc.getGuid(), cc);
-			}			
-
-		}
-		return ret;
-	}			
-	
-	private Map<String, ContentCategory> convertToMap(Collection<ContentCategory> collection) {
-		if (collection == null || collection.isEmpty()) {
-			return new HashMap<String, ContentCategory>();
-		}
-		Map<String, ContentCategory> map = new LinkedHashMap<String, ContentCategory>();		
-		fillMap(collection, map);
-		return map;
-	}
-	
-	private void fillMap(Collection<ContentCategory> collection, Map<String, ContentCategory> map) {
-		for (Iterator<ContentCategory> it = collection.iterator(); it.hasNext();) {
-			ContentCategory cc = it.next();
-			if (! map.containsKey(cc.getGuid())) {
-				map.put(cc.getGuid(), cc);
-			}
-		}
-	}	
-	
-	private Collection<ContentCategory> getChildCC(ContentCategory cc) {
-		if (cc instanceof CustomCategory) {
-			return ((CustomCategory) cc).getSubCategories();
-		}
-		if (cc instanceof Discipline) {
-			return ((Discipline) cc).getSubdiscipline();
-		}
-		if (cc instanceof DisciplineGrouping) {
-			return ((DisciplineGrouping) cc).getDisciplines();
-		}
-		if (cc instanceof Domain) {
-			return ((Domain) cc).getSubdomains();
-		}
-		if (cc instanceof RoleSet) {
-		}
-		if (cc instanceof RoleSetGrouping) {
-			return ((RoleSetGrouping) cc).getRoleSets();
-		}
-		if (cc instanceof Tool) {
-			return ((Tool) cc).getToolMentors();
-		}
-		if (cc instanceof WorkProductType) {
-		}
-		return null;
-	}	
-	
-	private void updateElementMap(	Collection<ContentCategory> ccList,
-									Map<String, MethodElement> elementMap) {
-		if (ccList == null || ccList.isEmpty()) {
-			return;
-		}
-		
-		Set<String> seens = new HashSet<String>();
-		for (Iterator<ContentCategory> it = ccList.iterator(); it.hasNext();) {
-			ContentCategory cc = it.next();
-			if (! seens.contains(cc.getGuid())) {
-				addToElementMap(cc, elementMap);
-				//elementMap.put(cc.getGuid(), cc);
-			}
-			seens.add(cc.getGuid());
-		}
-	}			
-
-	//No duplicates in the returned elements
-	private Collection<MethodElement> getElements(ContentCategory cc) {
-		Collection<MethodElement> elements = new ArrayList<MethodElement>();
-		elements.addAll(cc.getAssets());
-		elements.addAll(cc.getChecklists());
-		elements.addAll(cc.getConceptsAndPapers());
-		elements.addAll(cc.getExamples());
-		elements.addAll(cc.getGuidelines());
-		elements.addAll(cc.getSupportingMaterials());		
-		
-		if (cc instanceof CustomCategory) {
-			elements.addAll(((CustomCategory) cc).getSubCategories());
-			elements.addAll(((CustomCategory) cc).getCategorizedElements());
-		}
-		else if (cc instanceof Discipline) {
-			elements.addAll(((Discipline) cc).getReferenceWorkflows());
-			elements.addAll(((Discipline) cc).getSubdiscipline());
-			elements.addAll(((Discipline) cc).getTasks());
-		}
-		else if (cc instanceof DisciplineGrouping) {
-			elements.addAll(((DisciplineGrouping) cc).getDisciplines());
-		}
-		else if (cc instanceof Domain) {
-			elements.addAll(((Domain) cc).getSubdomains());
-			elements.addAll(((Domain) cc).getWorkProducts());
-		}
-		else if (cc instanceof RoleSet) {
-			elements.addAll(((RoleSet) cc).getRoles());
-		}
-		else if (cc instanceof RoleSetGrouping) {
-			elements.addAll(((RoleSetGrouping) cc).getRoleSets());
-		}
-		else if (cc instanceof Tool) {
-			elements.addAll(((Tool) cc).getToolMentors());
-		}
-		else if (cc instanceof WorkProductType) {
-			elements.addAll(((WorkProductType) cc).getWorkProducts());
-		}
-
-		return getUniqueCollection(elements);
-	}
-	
-	private Collection<MethodElement> getUniqueCollection(Collection<MethodElement> elements) {
-		Collection<MethodElement> ret = new LinkedHashSet<MethodElement>();
-		for (Iterator<MethodElement> it = elements.iterator(); it.hasNext();) {
-			MethodElement element = it.next();
-			if (! ret.contains(element)) {
-				ret.add(element);
-			}
-		}
-		return ret;
-	}	
-	
-	public boolean isOwnerSelected(MethodElement element, boolean checkSubtracted) {
-		boolean ret = isOwnerSelected_(element, checkSubtracted);
-		if (localDebug) {
-			System.out.println("LD> isOwnerSelected: " + ret + ", " +  //$NON-NLS-1$ //$NON-NLS-2$
-					DebugUtil.toString(element, 2));	
-		}				
-		return ret;
-	}
-	
-	private boolean isOwnerSelected_(MethodElement element, boolean checkSubtracted) {
-		if (element == null) {
-			return false;
-		}
-
-		if (ConfigurationHelper.isDescriptionElement(element)) {
-			return true;
-		}
-		
-		if (getUpdatingChanges()) {
-			if (originalSubstracted.containsKey(element.getGuid()) || 
-				orignalAdded.containsKey(element.getGuid())) {
-				return true;
-			}			
-		} else {
-			updateChanges();
-						
-			//182831
-/*			if (active && element instanceof ContentCategory) {
-				MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-				if (config.getMethodPluginSelection().contains(plugin)) {
-					return true;
-				}
-			}*/
-			
-			// since UMA 1.0.4, configuration can have added categories 
-			// and subtracted categories. The order of filtering is:
-			// 1. any element in the subtracted categories should be excluded
-			// 2. any element in the added categories should be included
-			// 3. any element not in the selected package or plugin should be excluded.		
-			if ( checkSubtracted) {
-				if (substractedElemMap.containsKey(element.getGuid())) {
-					return false;
-				} else if (element instanceof VariabilityElement){
-					if (contributedBaseInSubstracted((VariabilityElement) element)) {
-						return false;
-					}
-				}
-			}
-			
-			if (addedElemMap.containsKey(element.getGuid())) {
-				return true;
-			}
-
-		} 
-		
-		// elements beyond configuration scope should be always visible
-		if ((element instanceof MethodLibrary)
-				|| (element instanceof MethodConfiguration)) {
-			return true;
-		} else if (element instanceof MethodPlugin) {
-			List plugins = config.getMethodPluginSelection();
-			return (plugins != null) && plugins.contains(element);
-		} else {
-			// if the ownerprocess can't show, can't accept
-			if (element instanceof Activity) {
-				Activity base = (Activity) ((Activity) element)
-						.getVariabilityBasedOnElement();
-				if (base != null && base != element) {
-					MethodElement owningProc = TngUtil.getOwningProcess(base);
-					if ( owningProc != null && owningProc != element 
-							&& !ConfigurationHelper.inConfig(owningProc, config, checkSubtracted)) {
-						return false;
-					}
-				}
-			}
-
-			EObject pkg = LibraryUtil.getSelectable(element);
-
-			// accept global package if the plugin is in the configuration
-			if (pkg instanceof MethodPackage
-					&& ConfigurationHelper.isGlobalPackage((MethodPackage) pkg)) {
-				MethodPlugin plugin = LibraryUtil.getMethodPlugin(pkg);
-				return ConfigurationHelper.inConfig(plugin, config, checkSubtracted);
-			}
-
-			List pkgs = config.getMethodPackageSelection();
-			if (pkgs == null) {
-				return false;
-			}
-
-			// per Phong's request, for ProcessPackage, check the
-			// ProcessComponent parent instead
-			if (pkg instanceof ProcessPackage) {
-				EObject pkg_old = pkg;
-				while ((pkg != null) && !(pkg instanceof ProcessComponent)
-						&& !pkgs.contains(pkg)) {
-					pkg = pkg.eContainer();
-				}
-				
-				// if no ProcessComponent, this is a real package, use it
-				if ( pkg == null ) {
-					pkg = pkg_old;
-				}
-			}
-
-			// if package not selected, return false
-			if ((pkg == null) || !pkgs.contains(pkg)) {
-				return false;
-			}
-
-			return true;
-		}
-	}
-
-	private boolean contributedBaseInSubstracted(VariabilityElement ve) {
-		if (ve.getVariabilityType() != VariabilityType.CONTRIBUTES_LITERAL) {
-			return false;
-		}
-		
-		VariabilityElement base = ve.getVariabilityBasedOnElement();
-		if (base == null) {
-			return false;
-		}
-		
-		if (substractedElemMap.containsKey(base.getGuid())) {
-			return true;
-		}
-		
-		if (ConfigurationHelper.inConfig(base, config, true)) {
-			return contributedBaseInSubstracted(base);
-		}
-
-		return false;
-	}	
-	
-	private void addToElementMap(ContentCategory cc, Map<String, MethodElement> elementMap) {
-		Collection<MethodElement> elementList = getElements(cc);		
-		for (Iterator<MethodElement> it = elementList.iterator(); it.hasNext();) {
-			MethodElement element = it.next();
-			elementMap.put(element.getGuid(), element);
-		}
-	}
-	
-	public void dispose() {
-		config.eAdapters().remove(configListener);
-		libraryManager.removeListener(libListener);		
-	}
-
-	private boolean isNeedUpdateChanges() {
-		return needUpdateChanges;
-	}
-
-	public void setNeedUpdateChanges(boolean needUpdateChanges) {
-		this.needUpdateChanges = needUpdateChanges;
-		if (localDebug) {
-			System.out.println("LD> setNeedUpdateChanges: " + needUpdateChanges);	//$NON-NLS-1$
-		}
-	}
-
-	private boolean isEnableUpdate() {
-		return enableUpdate;
-	}
-
-	public void setEnableUpdate(boolean enableUpdate) {
-		this.enableUpdate = enableUpdate;
-		if (localDebug) {
-			System.out.println("LD> setEnableUpdate: " + enableUpdate);	//$NON-NLS-1$
-		}
-	}
-	
-	public Collection<MethodElement> getAddedElements() {
-		return addedElemMap.values();
-	}
-	
-	public Collection<MethodElement> getSubtractedElements() {
-		return substractedElemMap.values();
-	}
-	
-	public boolean isElementInSubtractedCategory(MethodElement element) {
-		return substractedElemMap.containsKey(element.getGuid());
-	}
-	
-	public boolean isElementInAddedCategory(MethodElement element) {
-		return addedElemMap.containsKey(element.getGuid());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationFactory.txt b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationFactory.txt
deleted file mode 100644
index ff7b8ed..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationFactory.txt
+++ /dev/null
@@ -1,193 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.services.DependencyManager;
-import org.eclipse.epf.library.services.LibraryProcessor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-
-
-/**
- * @author Jinhua Xi
- * @sice 1.0
- */
-public class ConfigurationFactory {
-
-	protected AdapterFactoryContentProvider afcp = null;
-
-	// map of MethodConfiguration name to Coniguration object
-	private Map configMap = new HashMap();
-
-	private LibraryProcessor libraryProc = null;
-
-	private String currentConfigName = null;
-
-	// map of config name to layout manager
-	// each config has it's own layout manager
-	private Map layoutMgrMap = new HashMap();
-
-	private DependencyManager depMgr = null;
-
-	public ConfigurationFactory(LibraryProcessor libraryProc) {
-
-		this.libraryProc = libraryProc;
-
-		afcp = new AdapterFactoryContentProvider(libraryProc
-				.getAdapterFactory());
-
-		libraryProc.addListener(new ILibraryChangeListener() {
-			public void libraryChanged(int option, Collection collection) {
-				if (option == ILibraryChangeListener.OPTION_CREATED
-						|| option == ILibraryChangeListener.OPTION_LOADED) {
-					clear();
-				}
-			}
-
-		});
-
-		clear();
-	}
-
-	public void clear() {
-		currentConfigName = null;
-		if (configMap.size() > 0) {
-			for (Iterator it = configMap.values().iterator(); it.hasNext();) {
-				((ConfigurationClosure) it.next()).dispose();
-			}
-		}
-		configMap.clear();
-
-		if (layoutMgrMap.size() > 0) {
-			for (Iterator it = layoutMgrMap.values().iterator(); it.hasNext();) {
-				((ElementLayoutManager) it.next()).clear();
-			}
-		}
-
-		layoutMgrMap.clear();
-
-		if (depMgr != null) {
-			depMgr.clear();
-			depMgr = null;
-		}
-	}
-
-	public MethodLibrary getLibrary() {
-		return libraryProc.getLibrary();
-	}
-
-	public URI getLibraryUri() {
-		return libraryProc.getLibraryURI();
-	}
-
-	public AdapterFactory getAdapterFactory() {
-		return libraryProc.getAdapterFactory();
-	}
-
-	public AdapterFactoryContentProvider getContentProvider() {
-		return afcp;
-	}
-
-	public DependencyManager getDependencyManager() {
-		// return libraryProc.getDependencyManager();
-		if (this.depMgr == null) {
-			depMgr = new DependencyManager(libraryProc);
-		}
-
-		return depMgr;
-	}
-
-	public List getMethodPlugins() {
-		List items = new ArrayList();
-		EList elements = libraryProc.getLibrary().eContents();
-		if (elements != null) {
-			for (Iterator it = elements.iterator(); it.hasNext();) {
-				EObject element = (EObject) it.next();
-				if (element instanceof MethodPlugin) {
-					items.add(element);
-				}
-			}
-		}
-
-		return items;
-	}
-
-	public void setCurrentConfiguration(String configName) {
-		this.currentConfigName = configName;
-	}
-
-	public String getCurrentConfiguration() {
-		return currentConfigName;
-	}
-
-	public ElementLayoutManager getLayoutManager() {
-		return getLayoutManager(this.currentConfigName);
-	}
-
-	public ElementLayoutManager getLayoutManager(String configName) {
-		ElementLayoutManager mgr = null;
-		if (configName == null) {
-			mgr = libraryProc.getLayoutManager();
-		} else {
-			mgr = (ElementLayoutManager) layoutMgrMap.get(configName);
-			if (mgr == null) {
-				MethodConfiguration config = libraryProc
-						.getConfiguration(configName);
-				mgr = new ElementLayoutManager(config);
-				layoutMgrMap.put(configName, mgr);
-			}
-		}
-
-		return mgr;
-	}
-
-	public ConfigurationClosure getClosure() {
-		return getClosure(currentConfigName);
-	}
-
-	public ConfigurationClosure getClosure(String configName) {
-		ConfigurationClosure config = null;
-		if (configName != null) {
-			config = (ConfigurationClosure) configMap.get(configName);
-			if (config == null) {
-				MethodConfiguration modelConfig = libraryProc
-						.getConfiguration(configName);
-				config = new ConfigurationClosure(this, modelConfig);
-				configMap.put(configName, config);
-			}
-		}
-
-		return config;
-	}
-
-	public void makeClosure() {
-		ConfigurationClosure c = getClosure(currentConfigName);
-		if (c != null) {
-			c.makeClosure();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationFilter.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationFilter.java
deleted file mode 100644
index b25bf7a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationFilter.java
+++ /dev/null
@@ -1,416 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.library.edit.IConfigurator;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.VariabilityInfo;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.Log;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * A method configuration filter to allow filtering element 
- * and realize the element feature values within a configuration.
- * 
- * @author Phong Nguyen Le
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConfigurationFilter extends AdapterImpl implements IConfigurator {
-
-	protected MethodConfiguration methodConfig;	
-	//private Viewer viewer;
-	
-	// set the default behavior for configuration view to true, i.e. contributors are discarded.
-	private boolean discardContributors = true;
-	
-
-	/**
-	 * constructor
-	 * @param methodConfig a <code>MethodConfiguration</code>
-	 * @param viewer a <code>Viewer</code>
-	 */
-	public ConfigurationFilter(MethodConfiguration methodConfig) {
-		this.methodConfig = methodConfig;
-		//this.viewer = viewer;
-	}
-
-	public ConfigurationFilter(MethodConfiguration methodConfig, boolean discardContributors) {
-		this(methodConfig);
-		this.discardContributors = discardContributors;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.edit.IFilter#accept(java.lang.Object)
-	 */
-	public boolean accept(Object obj) {
-		if (methodConfig == null)
-			return true;
-
-		obj = LibraryUtil.unwrap(obj);
-
-		if ( (ElementRealizer.isExtendReplaceEnabled() ||  
-				(obj instanceof VariabilityElement) && ConfigurationHelper.isExtendReplacer((VariabilityElement)obj) )
-				&& FeatureValue.isBlankIndicator(obj) ) {
-			return false;
-		}
-		
-		if (obj instanceof MethodPackage) {
-			return methodConfig.getMethodPackageSelection().contains(obj);
-		} else if (obj instanceof MethodElement) {
-			return ConfigurationHelper.canShow((MethodElement) obj,
-					methodConfig);
-		} else if (obj instanceof ItemProviderAdapter) {
-			return true;
-		} else {
-			if (Log.DEBUG) {
-				System.out
-						.println("Object filtered: " + (obj == null ? null : obj.toString())); //$NON-NLS-1$
-			}
-		}
-		return false;
-	}
-	
-
-	/**
-	 * get the realized children for the given object and feature
-	 * 
-	 * @param obj Object
-	 * @param childFeature EStructuralFeature
-	 * 
-	 * @return Collection
-	 */
-	public Collection getChildren(Object obj, EStructuralFeature childFeature) {
-		if (methodConfig == null)
-			return null;
-
-		ElementRealizer realizer = new DefaultElementRealizer(methodConfig);
-		// discard the contributors
-		realizer.setDiscardContributor(this.discardContributors);
-
-		if (childFeature != null && childFeature.isMany()) {
-			if (obj instanceof MethodElement) {
-				List value = ConfigurationHelper.calc0nFeatureValue(
-						(MethodElement) obj, childFeature, realizer);
-				return value;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-	 */
-//	public void notifyChanged(final Notification msg) {
-//		if (viewer == null) {
-//			return;
-//		}
-//
-//		SafeUpdateController.syncExec(new Runnable() {
-//			public void run() {
-//				switch (msg.getEventType()) {
-//				case Notification.ADD:
-//				case Notification.ADD_MANY:
-//				case Notification.REMOVE:
-//				case Notification.REMOVE_MANY:
-//					viewer.refresh();
-//				}
-//			}
-//		});
-//
-//	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.IConfigurator#getMethodConfiguration()
-	 */
-	public MethodConfiguration getMethodConfiguration() {
-		return methodConfig;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.edit.IConfigurator#setMethodConfiguration(org.eclipse.epf.uma.MethodConfiguration)
-	 */
-	public void setMethodConfiguration(MethodConfiguration config) {
-		methodConfig = config;
-	}
-
-	protected void resolveElementVariabilityList(VariabilityElement element,
-			VariabilityInfo info, boolean includeBase, ElementRealizer realizer) {
-
-		if (methodConfig == null) {
-			return;
-		}
-		
-		//resolve to include contributors
-		resolveElementContributors(element,info,realizer);
-
-		// if the element is an extended element, get the base element's
-		// contributors
-		// NOTE: the base element itself should not be included since it's
-		// already handled
-		// in the activity realiztion in ItemProviders.
-		if (ConfigurationHelper.isExtender(element)) {
-			MethodElement base = element.getVariabilityBasedOnElement();
-			VariabilityElement e = (VariabilityElement) ConfigurationHelper
-					.getCalculatedElement(base, realizer);
-
-			// if includebase is true, add the element to the inheritance list
-			if (includeBase) {
-				List values = info.getInheritanceList();
-				if (!values.contains(e)) {
-					values.add(e);
-				}
-			}
-
-			// resolve the base to include additional contributors and/or base
-			resolveElementVariabilityList(e, info, includeBase, realizer);
-
-		}
-
-	}
-	
-	protected void resolveElementContributors(VariabilityElement element,
-			VariabilityInfo info, ElementRealizer realizer){
-		// if the element has contributors in the configuration, get the
-		// reference properties
-		// if a contributor has replacer, it's replacer is used
-		List items = ConfigurationHelper.getContributors(element, methodConfig);
-		if (items != null && items.size() > 0) {
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				VariabilityElement e = (VariabilityElement) it.next();
-				List values = info.getContributors();
-				if (!values.contains(e)) {
-					values.add(e);
-				}
-				resolveElementVariabilityList(e, info, false, realizer);
-			}
-		}
-	}
-
-	/*
-	 * resolve the variability of the element and get a list of contributors.
-	 * 
-	 * This method is used for realizing actitivy breakdown elements in the
-	 * itemProviders.
-	 * 
-	 * @see org.eclipse.epf.library.edit.IConfigurator#getVariabilityInfo(org.eclipse.epf.uma.VariabilityElement)
-	 */
-	public VariabilityInfo getVariabilityInfo(VariabilityElement ve) {
-
-		// calculate the element first
-		ElementRealizer realizer = new DefaultElementRealizer(methodConfig, true, true);
-		return getVariabilityInfo(ve, realizer);
-	}
-
-	protected VariabilityInfo getVariabilityInfo(VariabilityElement ve, ElementRealizer realizer) {
-
-		// calculate the element first
-		VariabilityElement e = (VariabilityElement) ConfigurationHelper
-				.getCalculatedElement(ve, realizer);
-
-		if (e == null) {
-			return null;
-		}
-
-		VariabilityInfo info = new VariabilityInfo(ve);
-		info.getInheritanceList().add(e);
-
-		resolveElementVariabilityList(e, info, true, realizer);
-
-		return info;
-	}
-	
-	public Object resolve(Object element) {
-		if (element instanceof VariabilityElement) {
-			ElementRealizer realizer = new DefaultElementRealizer(methodConfig, true, true);
-			return ConfigurationHelper.getCalculatedElement(
-					(MethodElement) element, realizer);
-		}
-		return element;
-	}
-	
-	
-	/**
-	 * get filter for uncategorized tasks
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getUncategorizedTaskFilter() {
-		return new IFilter() {
-			public boolean accept(Object obj) {
-				// 158924 - wrong categories in configuration view
-				// should use the default realizer
-				// we should not discard the discipline contributors 
-				// instead should realize to the base discipline
-				return ( obj instanceof Task ) && 
-					ConfigurationHelper.calc0nFeatureValue(
-							(Task)obj, 
-							AssociationHelper.Task_Disciplines, 
-							new DefaultElementRealizer(methodConfig)).isEmpty();					
-			}
-		};
-	}
-	
-	/**
-	 * get filter for workproducts without a domain
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getDomainUncategorizedWorkProductFilter(){
-		return new IFilter() {
-			public boolean accept(Object obj) {
-				// 158924 - wrong categories in configuration view
-				// should use the default realizer
-				// we should not discard the domain contributors 
-				// instead should realize to the base domain
-				return ( obj instanceof WorkProduct ) && 
-					ConfigurationHelper.calc0nFeatureValue(
-							(WorkProduct)obj, 
-							AssociationHelper.WorkProduct_Domains, 
-							new DefaultElementRealizer(methodConfig)).isEmpty();					
-			}
-		};
-	}
-	
-	/**
-	 * get filter for workproducts without a WP Type
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getWpTypeUncategorizedWorkProductFilter(){
-		return new IFilter() {
-			public boolean accept(Object obj) {
-				// 158924 - wrong categories in configuration view
-				// should use the default realizer
-				// we should not discard the WPType contributors 
-				// instead should realize to the base 
-				return ( obj instanceof WorkProduct ) && 
-					ConfigurationHelper.calc0nFeatureValue(
-							(WorkProduct)obj, 
-							AssociationHelper.WorkProduct_WorkProductTypes, 
-							new DefaultElementRealizer(methodConfig)).isEmpty();					
-			}
-		};
-	}
-	
-	/**
-	 * get filter for uncategorized roles
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getUncategorizedRoleFilter(){
-		return new IFilter() {
-			public boolean accept(Object obj) {
-				// 158924 - wrong categories in configuration view
-				// should use the default realizer
-				// we should not discard the roleset contributors 
-				// instead should realize to the base 
-				return ( obj instanceof Role ) && 
-					ConfigurationHelper.calc0nFeatureValue(
-							(Role)obj, 
-							AssociationHelper.Role_RoleSets, 
-							new DefaultElementRealizer(methodConfig)).isEmpty();					
-			}
-		};
-	}
-
-	/**
-	 * get filter for uncategorized tool mentors
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getUncategorizedToolMentorFilter() {
-		return new IFilter() {
-			public boolean accept(Object obj) {
-				// 158924 - wrong categories in configuration view
-				// should use the default realizer
-				// we should not discard the tool contributors 
-				// instead should realize to the base 
-				return ( obj instanceof ToolMentor ) && 
-					ConfigurationHelper.calc0nFeatureValue(
-							(ToolMentor)obj, 
-							AssociationHelper.ToolMentor_Tool, 
-							new DefaultElementRealizer(methodConfig)).isEmpty();					
-			}
-		};
-	}
-	
-	/**
-	 * get filter for disciplines and displine groupings
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getDisciplinesFilter() {
-		return new IFilter() {
-			public boolean accept(Object obj) {
-				// [Bug 162603] New: Replacing disciplines do appear inside their replaced elements discipline groupings 
-				// as well as outside of the discipline grouping
-				if ( obj instanceof DisciplineGrouping ) {
-					return true;
-				}
-				
-				return ( obj instanceof Discipline ) && 
-				ConfigurationHelper.calc0nFeatureValue(
-						(MethodElement)obj, 
-						AssociationHelper.Discipline_DisciplineGroupings, 
-						new DefaultElementRealizer(methodConfig)).isEmpty();					
-			}
-		};
-	}
-	
-	/**
-	 * get filter for rolesets and roleset groupings
-	 * 
-	 * @return IFilter
-	 */
-	public IFilter getRoleSetsFilter() {
-		return new IFilter() {
-			public boolean accept(Object obj) {
-				// [Bug 162603] New: Replacing disciplines do appear inside their replaced elements discipline groupings 
-				// as well as outside of the discipline grouping
-				// same for roleset grouping
-				if ( obj instanceof RoleSetGrouping ) {
-					return true;
-				}
-				
-				return ( obj instanceof RoleSet ) && 
-					ConfigurationHelper.calc0nFeatureValue(
-							(MethodElement)obj, 
-							AssociationHelper.RoleSet_RoleSetGrouppings, 
-							new DefaultElementRealizer(methodConfig)).isEmpty();					
-			}
-		};
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationHelper.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationHelper.java
deleted file mode 100644
index 8f85df2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationHelper.java
+++ /dev/null
@@ -1,2103 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.TreeSet;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.util.CategorySortHelper;
-import org.eclipse.epf.library.edit.util.SectionList;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ConfigurationHelper {
-	
-	public static final String ATTRIBUTE_VALUE_SEPERATOR = "<p/>"; //$NON-NLS-1$
-
-	private static boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	/**
-	 * check if the element is a ContentDescription
-	 * 
-	 * @param element {@link MethodElement}
-	 * @return boolean
-	 */
-	public static boolean isDescriptionElement(MethodElement element) {
-		if ( element == null ) {
-			return false;
-		}
-		
-		return (element instanceof ContentDescription || element.eContainer() instanceof ContentDescription);
-
-	}
-
-	/**
-	 * check if the method pacj=kage is a global package
-	 * 
-	 * @param pkg {@link MethodPackage}
-	 * @return boolean
-	 */
-	public static boolean isGlobalPackage(MethodPackage pkg) {
-		if (pkg == null) {
-			if (debug) {
-				System.out
-						.println("ConfigurationHelper.isGlobalPackage: method package is null"); //$NON-NLS-1$
-			}
-			return false;
-		}
-
-		MethodPlugin p = LibraryUtil.getMethodPlugin(pkg);
-		if (p == null) {
-			if (debug) {
-				System.out
-						.println("ConfigurationHelper.isGlobalPackage: Unable to find method plug-in for " + pkg.getName() + ": " + pkg.getGuid()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return false;
-		}
-
-		return TngUtil.getAllSystemPackages(p).contains(pkg);
-	}
-
-	/**
-	 * check if the element is in the configuration
-	 * 
-	 * @param element
-	 * @param config
-	 * @return
-	 */
-	public static boolean inConfig(MethodElement element,
-			MethodConfiguration config) {
-		return inConfig(element, config, true);
-	}
-	
-	
-	/**
-	 * check if the element is in the configuration
-	 * 
-	 * @param element
-	 * @param config
-	 * @return
-	 */
-	public static boolean inConfig(MethodElement element,
-			MethodConfiguration config, boolean checkSubtracted) {
-		return inConfig(element, config, checkSubtracted, true);
-	}
-	
-	/**
-	 * check if the element is in the configuration
-	 * 
-	 * @param element
-	 * @param config
-	 * @return
-	 */
-	public static boolean inConfig(MethodElement element,
-			MethodConfiguration config, boolean checkSubtracted, boolean checkBase) {
-		if (!isOwnerSelected(element, config, checkSubtracted)) {
-			return false;
-		}
-
-		//Bug 207429 - Configration: Warring info should shown when deselect the replaced element
-		// for configuration closure checking, the missing base should be reported 
-		// so the element been checked still treated as in config
-		// added the checkBase flag to ignore the base checking
-		// for configuration realization, this flag should be set to true
-		// so the replacer missing base is not included in the config.
-		
-		// if the element is a repalcer, and it's base element has more than one
-		// replacer
-		// none of the replacers should be included into the configuration
-		if (checkBase && (element instanceof VariabilityElement) ) {
-			VariabilityElement ve = (VariabilityElement) element;
-			if (isReplacer(ve)) {
-				VariabilityElement base = ve.getVariabilityBasedOnElement();
-				if (inConfig(base, config)) {
-					
-//					// Invalid hotspot created for locally replaced activity in activity diagram
-//					// this is because the activity has more than one local replacers
-//					// in version 7.0, local replacement is modeled the same way as nomal replacement
-//					// we need to ignore this checking for activity
-//					if ( element instanceof Activity ) {
-//						return true;
-//					}
-					
-					for (Iterator it = AssociationHelper.getImmediateVarieties(
-							base).iterator(); it.hasNext();) {
-						VariabilityElement e = (VariabilityElement) it.next();
-						if ((e != element)
-								&& (e.getVariabilityType() == VariabilityType.REPLACES_LITERAL)
-								&& isOwnerSelected(e, config, checkSubtracted)) {
-							if (debug) {
-								System.out
-										.println("ConfigurationHelper.inConfig: Ignoring replacing element '" + LibraryUtil.getTypeName(element) + "' since its base element has more than one replacer in the configuration"); //$NON-NLS-1$ //$NON-NLS-2$
-							}
-							return false;
-						}
-					}
-				} else {
-					return false;  // base must be in the configuration
-				}
-			}
-		}
-
-		return true;
-	}
-
-	private static boolean isOwnerSelected(MethodElement element,
-			MethodConfiguration config, boolean checkSubtracted) {
-		MethodLibrary library = LibraryServiceUtil.getMethodLibrary(config);
-		ILibraryManager libraryManager = library == null? null : LibraryService.getInstance().getLibraryManager(library);
-		if (libraryManager != null) {
-			return LibraryService.getInstance()
-						.getConfigurationManager(config)
-							.getConfigurationData()
-								.isOwnerSelected(element, checkSubtracted);
-		}
-				
-		if (element == null) {
-			return false;
-		}
-
-		if (config == null || isDescriptionElement(element)) {
-			return true;
-		}
-
-		// since UMA 1.0.4, configuration can have added categories 
-		// and subtracted categories. The order of filtering is:
-		// 1. any element in the subtracted categories should be excluded
-		// 2. any element in the added categories should be included
-		// 3. any element not in the selected package or plugin should be excluded.
-		
-		if ( checkSubtracted ) {
-			// first check subtracted elements
-			List subtractedCategories = config.getSubtractedCategory();
-			if ( subtractedCategories.size() > 0 ) {
-				for ( Iterator it = subtractedCategories.iterator(); it.hasNext(); ) {
-					ContentCategory cc = (ContentCategory)it.next();
-					if ( cc == element ) {
-						return false;
-					}
-					
-					// need to check all content category types and sub-categories
-					// we need to have an efficient algorithm for this checking.
-					// for now, only check the custom category's categorised elements
-					// TODO. Jinhua Xi, 11/27/2006
-					if ( cc instanceof CustomCategory ) {
-						if ( ((CustomCategory)cc).getCategorizedElements().contains(element) ) {
-							return false;
-						}
-					} else {
-						// TODO, not implemented yet
-						System.out.println("TODO, isOwnerSelected: not implemented yet"); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		
-		// then check added categories
-		// TODO
-		
-		// elements beyond configuration scope should be always visible
-		if ((element instanceof MethodLibrary)
-				|| (element instanceof MethodConfiguration)) {
-			return true;
-		} else if (element instanceof MethodPlugin) {
-			List plugins = config.getMethodPluginSelection();
-			return (plugins != null) && plugins.contains(element);
-		} else {
-			// if the ownerprocess can't show, can't accept
-			if (element instanceof Activity) {
-				Activity base = (Activity) ((Activity) element)
-						.getVariabilityBasedOnElement();
-				if (base != null && base != element) {
-					MethodElement owningProc = TngUtil.getOwningProcess(base);
-					if ( owningProc != null && owningProc != element 
-							&& !inConfig(owningProc, config, checkSubtracted)) {
-						return false;
-					}
-				}
-			}
-
-			EObject pkg = LibraryUtil.getSelectable(element);
-
-			// accept global package if the plugin is in the configuration
-			if (pkg instanceof MethodPackage
-					&& isGlobalPackage((MethodPackage) pkg)) {
-				MethodPlugin plugin = LibraryUtil.getMethodPlugin(pkg);
-				return inConfig(plugin, config, checkSubtracted);
-			}
-
-			List pkgs = config.getMethodPackageSelection();
-			if (pkgs == null) {
-				return false;
-			}
-
-			// per Phong's request, for ProcessPackage, check the
-			// ProcessComponent parent instead
-			if (pkg instanceof ProcessPackage) {
-				while ((pkg != null) && !(pkg instanceof ProcessComponent)
-						&& !pkgs.contains(pkg)) {
-					pkg = pkg.eContainer();
-				}
-			}
-
-			// if package not selected, return false
-			if ((pkg == null) || !pkgs.contains(pkg)) {
-				return false;
-			}
-
-			return true;
-		}
-	}
-
-	/**
-	 * is the element a contributor?
-	 * @param element
-	 * @return boolean
-	 */
-	public static boolean isContributor(VariabilityElement element) {
-		if (element == null || element.getVariabilityBasedOnElement() == null)
-			return false;
-
-		return element.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL;
-	}
-
-	/**
-	 * is the element a replacer?
-	 * @param element
-	 * @return boolean
-	 */
-	public static boolean isReplacer(VariabilityElement element) {
-		if (element == null || element.getVariabilityBasedOnElement() == null)
-			return false;
-
-		return element.getVariabilityType() == VariabilityType.REPLACES_LITERAL;
-	}
-
-	/**
-	 * is the element a extend-replacer?
-	 * @param element
-	 * @return boolean
-	 */
-	public static boolean isExtendReplacer(VariabilityElement element) {
-		if (element == null || element.getVariabilityBasedOnElement() == null)
-			return false;
-
-		return element.getVariabilityType() == VariabilityType.EXTENDS_REPLACES_LITERAL;
-	}
-	
-	/**
-	 * is the element an extender?
-	 * @param element
-	 * @return boolean
-	 */
-	public static boolean isExtender(VariabilityElement element) {
-		if (element == null || element.getVariabilityBasedOnElement() == null)
-			return false;
-
-		return element.getVariabilityType() == VariabilityType.EXTENDS_LITERAL;
-	}
-
-	/**
-	 * get the replacer of the element in the configuration. Only one replacer
-	 * is allowed. If more than one replacer is found, then none of them will be
-	 * returned.
-	 * 
-	 * @param element
-	 *            VariabilityElement the element
-	 * @param config
-	 *            MethodConfiguration
-	 * @return VariabilityElement the replacer if there is one and ONLY one,
-	 *         null otherwise
-	 */
-	public static VariabilityElement getReplacer(VariabilityElement element,
-			MethodConfiguration config) {
-		VariabilityElement ve = null;
-
-		// this will get all replacers recursively. we only need the immediate
-		// ones
-		// for(Iterator iterator = TngUtil.getGeneralizers(element,
-		// VariabilityType.REPLACES_LITERAL); iterator.hasNext();)
-		for (Iterator it = AssociationHelper.getImmediateVarieties(element)
-				.iterator(); it.hasNext();) {
-			VariabilityElement e = (VariabilityElement) it.next();
-			if ( e == null || !inConfig(e, config) ) {
-				continue;
-			}
-
-			VariabilityType type = e.getVariabilityType();
-			if ( type == VariabilityType.REPLACES_LITERAL 
-					|| type == VariabilityType.EXTENDS_REPLACES_LITERAL) {
-				if (ve != null) {
-					if (debug) {
-						System.out
-								.println("ConfigurationHelper.getReplacer: Replacer ignored for element '" + LibraryUtil.getTypeName(element) + "' since it has more than one replacerin the configuration"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return null; // if more than one replacer, return null
-				}
-
-				ve = e;
-			}
-		}
-
-		return ve;
-	}
-
-	/**
-	 * get the immediate contributors of the element within the configuration.
-	 * If a contributor has immediate replacer, it is repalced with the replacer
-	 * 
-	 * @param element
-	 * @param config
-	 * @return
-	 */
-	public static List getContributors(VariabilityElement element,
-			MethodConfiguration config) {
-		List items = new ArrayList();
-
-		if ( element == null ) {
-			return items;
-		}
-		
-		// This method get all contributors recursively,
-		// we only need the first level
-		// for (Iterator it = TngUtil.getContributors(element); it.hasNext(); )
-		for (Iterator it = AssociationHelper.getImmediateVarieties(element)
-				.iterator(); it.hasNext();) {
-			VariabilityElement e = (VariabilityElement) it.next();
-			if ((e != null)
-					&& (e.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL)
-					&& inConfig(e, config)) {
-				VariabilityElement replacer = getReplacer(e, config);
-				if (replacer != null) {
-					items.add(replacer);
-				} else {
-					items.add(e);
-				}
-			}
-		}
-
-		return items;
-	}
-
-	public static List getExtenders(VariabilityElement element,
-			MethodConfiguration config) {
-		List items = new ArrayList();
-
-		if ( element == null ) {
-			return items;
-		}
-		
-		for (Iterator it = AssociationHelper.getImmediateVarieties(element)
-				.iterator(); it.hasNext();) {
-			VariabilityElement e = (VariabilityElement) it.next();
-			if ((e != null)
-					&& (e.getVariabilityType() == VariabilityType.EXTENDS_LITERAL)
-					&& inConfig(e, config)) {
-					items.add(e);
-			}
-		}
-
-		return items;
-	}
-	
-	public static boolean canShow(MethodElement element,
-			MethodConfiguration config) {
-		return canShow(element,config, true);
-	}
-	
-
-	/**
-	 * element can't show in the configuration tree if 1. the element is not in
-	 * the configuration 2. the element is a contribution to another element 3.
-	 * if the element is a replacer to a 3. the element has a replacement
-	 * element in the configuration
-	 * 
-	 * @param element
-	 * @param config
-	 * @return boolean
-	 */
-	public static boolean canShow(MethodElement element,
-			MethodConfiguration config, boolean checkSubtracted) {
-		if (element == null) {
-			return false;
-		}
-
-		if (!inConfig(element, config, checkSubtracted)) {
-			return false;
-		}
-
-//		// if it;s an activity, return since contributors are local contribution and needs to be shown
-//		if (element instanceof Activity) {
-//			return true;
-//		}
-
-//		/////////////////////////////////////////////////////////////////////////////////////////////////
-//		// this is not needed any more since the suppression state is determined by the activity adaptor factory
-//		// just leave it here for now since it does not hurt. take it away in next release
-		// 
-		// NO, we still need to keep this to check the suppression of descriptors referenced by another descriptor. 
-		// for example, when displaying a TD page, we need to handle the suppression of the referenced WPDs and RDs. 
-		// 00395278 - Browsing TD with suppressed RD/WPD under it  -- suppressed ones still showing
-		// Note: this does not handle the case when the descriptor is with an inherited activity. 
-		// in that case, the suppression need to be determined by the activity path. TODO
-		Boolean supressed = element.getSuppressed();
-		if (supressed != null && supressed.booleanValue() == true) {
-			return false;
-		}
-//		/////////////////////////////////////////////////////////////////////////////////////////////////
-		
-		if ( element instanceof VariabilityElement) {
-			if ( !canShowByCheckingVE((VariabilityElement) element,config) ) {
-				return  false;
-			}
-		}
-
-		return true;
-	}
-	
-	/**
-	 * 
-	 * @param e
-	 * @param config
-	 * @return
-	 */
-	public static boolean canShowByCheckingVE(VariabilityElement e, MethodConfiguration config){		
-
-		// if this is an extender, always show, even though it extends a
-		// contributor
-		if (isExtender(e)) {
-			return true;
-		}
-
-		if (isContributor(e) || getReplacer(e, config) != null) {
-			return false;
-		}
-
-		// for activity, don't show the ones that contains contributors 
-		// the resaon for this is to simplify the logic.
-		// assuming that user uses this activity to contribute to other activities
-		// so that part should not be involved in the navigation
-		// 
-		// Jinhua Xi, 07/14/06, 
-		if ( (e instanceof Activity) && hasContributor((Activity)e) ) {
-			return false;
-		}
-
-		while ((e != null) && isReplacer(e)) {
-			e = (VariabilityElement) e.getVariabilityBasedOnElement();
-			if (isContributor(e)) {
-				return false;
-			}
-		}
-		
-		return true;
-	}
-
-	/**
-	 * get the name of the element in the configuration. 1. if it's a
-	 * contributor, show the name of the base element 2. if it has a
-	 * replacemenet, show the name of the replacement element
-	 * 
-	 * @param element
-	 * @param config
-	 * @return String
-	 */
-	public static String getName(MethodElement element,
-			MethodConfiguration config) {
-		if (element instanceof VariabilityElement) {
-			VariabilityElement e = (VariabilityElement) element;
-			if (isContributor(e)) {
-				return getName(e.getVariabilityBasedOnElement(), config);
-			} else {
-				VariabilityElement rep = getReplacer(e, config);
-				if (rep != null) {
-					return getName(rep, config);
-				}
-			}
-		}
-
-		return element.getName();
-	}
-
-	/**
-	 * get the presentation name for an element in the configuration
-	 * @param element
-	 * @param config
-	 * @return String
-	 */
-	public static String getPresentationName(MethodElement element,
-			MethodConfiguration config) {
-		
-		// [Bug 196399] P-name is not inherited from its base element in an extending element
-		String name = null;
-
-		if ( element instanceof DescribableElement ) {
-			name = ((DescribableElement)element).getPresentationName();
-			if ( StrUtil.isBlank(name) && (element instanceof VariabilityElement) ) {
-				
-				EStructuralFeature f = UmaPackage.eINSTANCE.getVariabilityElement_VariabilityBasedOnElement();
-				ElementRealizer r = new DefaultElementRealizer(config);	
-				MethodElement me = element;
-
-				do {
-					VariabilityElement oldMe = (VariabilityElement) me;
-					me = (DescribableElement)ConfigurationHelper.calc01FeatureValue(me, f, r);
-					if ( me == null ) {
-						break;
-					} else if (oldMe == me) {
-						me = oldMe.getVariabilityBasedOnElement();						
-					}					
-					
-					name = ((DescribableElement)me).getPresentationName();
-					
-				} while ( StrUtil.isBlank(name) );
-			}
-		} 
-		
-		if ( StrUtil.isBlank(name) ) {
-			name = TngUtil.getPresentationName(element);
-		}
-
-		return name;
-	}
-
-	/**
-	 * get the variability element owner. If the element is a
-	 * VariabilityElement, return itself otherwise, find it's owner. For
-	 * example, a ContentDescriotion object is ownered by a VariabilityElement
-	 * 
-	 * @param e
-	 *            MethodElement
-	 * @return VariabilityElement
-	 */
-	public static VariabilityElement getVariableOwner(MethodElement e) {
-		if (e instanceof VariabilityElement) {
-			return (VariabilityElement) e;
-		} else if (e instanceof ContentDescription) {
-			// return AssociationHelper.getOwner( (ContentDescription)e );
-			EObject eObj = e.eContainer();
-			if (eObj instanceof VariabilityElement) {
-				return (VariabilityElement) eObj;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * check if the feature value is mergable or not
-	 * @param feature
-	 * @return boolean
-	 */
-	public static boolean isMergableAttribute(EStructuralFeature feature) {
-		if (!feature.getEType().getInstanceClassName().equals(
-				"java.lang.String")) //$NON-NLS-1$
-		{
-			return false;
-		}
-
-		// feature id is not globally unique, can't do a switch here
-		// compare the acture featrue instead
-		/*
-		 * switch ( feature.getFeatureID() ) { case
-		 * UmaPackage.METHOD_ELEMENT__GUID: case
-		 * UmaPackage.METHOD_ELEMENT__NAME:
-		 * Contributing a Unique ID for work product renders
-		 * bad html // don't merge Unique ID: case
-		 * UmaPackage.WORK_PRODUCT_DESCRIPTION__EXTERNAL_ID: return false; }
-		 */
-
-		if (feature == UmaPackage.eINSTANCE.getMethodElement_Guid()
-				|| feature == UmaPackage.eINSTANCE.getNamedElement_Name()
-				|| feature == UmaPackage.eINSTANCE
-						.getContentDescription_ExternalId() 
-				|| feature == UmaPackage.eINSTANCE.getDescribableElement_PresentationName()) {
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * is attribute feature value?
-	 * @param feature
-	 * @return boolean
-	 */
-	public static boolean isAttributeFeature(EStructuralFeature feature) {
-		return (feature.getEType() instanceof EAttribute);
-	}
-	
-	/**
-	 * is this a to-one feature?
-	 * @param feature
-	 * @return boolean
-	 */
-	public static boolean is01Feature(EStructuralFeature feature) {
-		return (feature.getEType() instanceof EClass) && !feature.isMany();
-	}
-
-	/**
-	 * is this a to-many feature?
-	 * @param feature
-	 * @return boolean
-	 */
-	public static boolean is0nFeature(EStructuralFeature feature) {
-		return (feature.getEType() instanceof EClass) && feature.isMany();
-	}
-
-	
-	/**
-	 * calculate the value of the specified element and feature
-	 * 
-	 * @param element
-	 * @param feature
-	 * @param config
-	 * @param values
-	 *            The List of values of the feature. if the feature is a 0..1
-	 *            association, the List holds a single value if any for
-	 *            reference list feature, it's a list of references for
-	 *            attribute feature, it's a list of attribute values to be
-	 *            mergered for 0..1 association, the list may contain 1 value.
-	 */
-//	private static void calculateFeature(MethodElement element,
-//			EStructuralFeature feature, MethodConfiguration config,
-//			List values, ElementRealizer realizer) {
-//		calculateFeature(element, null, feature, config, values, realizer);
-//	}
-
-	private static void calculateFeature(MethodElement element,
-			MethodElement OwnerElement, EStructuralFeature feature,
-			MethodConfiguration config, FeatureValue values, ElementRealizer realizer) {
-		
-		// make sure this is a valid feature 
-		// for example, if an activity contributes to a Capability Pattern,
-		// some CapabilityPattern specific feature may not be a valid feature for the Activity
-//		List features = element.getInstanceProperties();
-		List features = LibraryUtil.getStructuralFeatures(element);
-		if ( !features.contains(feature) ) {
-			return;
-		}
-		
-		// EClassifier type = feature.getEType();
-		VariabilityElement ve = getVariableOwner((OwnerElement == null) ? element
-				: OwnerElement);
-
-		Object value = element.eGet(feature);
-
-		values.add(ve, value);
-
-		if (config == null) {
-			return;
-		}
-
-		// realize the variability relationship
-		if (ve == null) {
-			return;
-		}
-		
-		// according to Peter, the realization should be always top down.
-		// i.e realize the base first, then include the contributions
-		__mergeBase(element, ve, feature, config, values, realizer);	
-		
-		if (!is01Feature(feature) || (values.size() == 0) ) {
-			__mergeContributors(element, ve, feature, config, values, realizer);
-		}
-	}
-	
-	private static void __mergeBase(MethodElement element,
-			VariabilityElement ve, EStructuralFeature feature,
-			MethodConfiguration config, FeatureValue values, ElementRealizer realizer) {
-	
-		// if the element is an extended element, get the base element's
-		// properties if needed
-		boolean extendReplace = isExtendReplacer(ve) || 
-				ElementRealizer.isExtendReplaceEnabled() && isReplacer(ve);
-		boolean isExtender = isExtender(ve);
-		
-		if (isExtender || extendReplace) {
-			boolean mergebase = false;
-			if (is0nFeature(feature)) {
-				mergebase = true;
-				if ( extendReplace 
-						|| isExtender && ElementRealizer.ignoreBaseToManyAssociations()) {
-					mergebase = (values.size() == 0);
-				}
-			} else if (is01Feature(feature)) {
-				mergebase = (values.size() == 0);
-			} else {
-				mergebase = (isMergableAttribute(feature) && (values.size() == 0));
-			}
-
-			if (mergebase) {
-				// Authoring: Extending a base that has been
-				// replaced, does not extend the replacement
-				// need to get the realized element,
-				// the base element might be replaced by another one,
-				// or might be a contributor to another base
-				MethodElement e = ve.getVariabilityBasedOnElement();
-				if ( !extendReplace ) {
-					e= getCalculatedElement(e, config);
-				}					
-				MethodElement o = e;
-
-				// if it's a containment feature, such as sub-artifacts
-				// the base should not be the container
-				// 162154 - Check circular references with parent-/sub-artifacts and practices/sub-practices				
-				if ( isContainmentFeature(feature) ) {
-					List containers = getContainers(ve, config);
-					if (containers.contains(e) ) {
-						mergebase = false;
-					}
-				}
-
-				if (mergebase && (ve != e) && inConfig(e, config)) {
-					// if the current element is a description,
-					// get the the description object of the base
-					if (element instanceof ContentDescription) {
-						try {
-							e = ((DescribableElement) e).getPresentation();
-						} catch (Exception e1) {
-							e1.printStackTrace();
-						}
-					}
-
-					calculateFeature(e, o, feature, config, values, realizer);
-
-					// for extender, we need to re-sort the steps based on the
-					// extender defined order
-					if ((ve instanceof ContentElement)
-							&& (feature == UmaPackage.eINSTANCE
-									.getContentDescription_Sections())) {
-						orderSections((ContentElement) ve, (List)values.getValue());
-					}
-				}
-			}
-		}
-	
-	}
-
-	private static void __mergeContributors(MethodElement element,
-			VariabilityElement ve, EStructuralFeature feature,
-			MethodConfiguration config, FeatureValue values, ElementRealizer realizer) {
-		boolean mergeable = true;
-		if ( isAttributeFeature(feature) && !isMergableAttribute(feature) ) {
-			mergeable = false;
-		} 
-		
-		if ( mergeable ) {
-			// if the element has contributors in the configuration, get the
-			// reference properties
-			// if a contributor has replacer, it's replacer is used
-			List items = getContributors(ve, config);
-			if (items != null && items.size() > 0) {
-				for (Iterator it = items.iterator(); it.hasNext();) {
-					MethodElement e = (MethodElement) it.next();
-					MethodElement o = e;  // the owner
-
-					// if the current element is a description,
-					// get the the description object of the contributor
-					if (element instanceof ContentDescription) {
-						e = ((DescribableElement) e).getPresentation();
-					}
-					calculateFeature(e, o, feature, config, values, realizer);
-				}
-			}
-		}
-		
-	}
-	
-	/**
-	 * calculate the reflist for the specified element and OppositeFeature
-	 * 
-	 * @param element
-	 * @param feature
-	 *            OppositeFeature
-	 * @param realizer ElementRealizer
-	 * @param values
-	 *            The List of values of the feature. for reference list feature,
-	 *            it's a list of references for attribute feature, it's a list
-	 *            of attribute values to be mergered
-	 */
-	private static void calculateOppositeFeature(MethodElement element,
-			OppositeFeature feature, ElementRealizer realizer, FeatureValue values) {
-		calculateOppositeFeature(element, feature, true, false, realizer, values);
-	}
-	
-	
-	/**
-	 * calculate the reflist for the specified element and OppositeFeature
-	 * 
-	 * @param element
-	 * @param feature
-	 *            OppositeFeature
-	 * @param realizer ElementRealizer
-	 * @param values
-	 *            The List of values of the feature. for reference list feature,
-	 *            it's a list of references for attribute feature, it's a list
-	 *            of attribute values to be mergered
-	 */
-	private static void calculateOppositeFeature(MethodElement element,
-			OppositeFeature feature, boolean mergeReplacerBase, boolean mergeExtenderBase, 
-			ElementRealizer realizer, FeatureValue values) {
-		// must be a MultiResourceEObject
-		if (!(element instanceof MultiResourceEObject)) {
-			return;
-		}
-
-		MethodConfiguration config = realizer.getConfiguration();
-
-		VariabilityElement ve = getVariableOwner(element);
-
-		Object value = ((MultiResourceEObject) element)
-				.getOppositeFeatureValue(feature);
-		values.add(ve, value);
-
-		if (element instanceof VariabilityElement && config != null) {
-			VariabilityElement ce = (VariabilityElement) element;
-
-			// if the element has contributors in the configuration, get the
-			// reference properties
-			List items = getContributors(ce, config);
-			if (items != null && items.size() > 0) {
-				for (Iterator it = items.iterator(); it.hasNext();) {
-					MethodElement e = (MethodElement) it.next();
-					calculateOppositeFeature(e, feature, mergeReplacerBase, mergeExtenderBase, realizer, values);
-				}
-			}
-
-			// if the element is a replacer of a base element, 
-			// get the base element's properties
-			// only cover 01 or 0m references
-			// attributes can't be opposite feature
-
-			// replaced element does not show incoming
-			// relationships
-			// imcoming relationships are represented by opposite feature
-			// so keep the references to the base element
-			
-			// Inconsistency between Published Work Product: Workload Analysis Page and Referenced Pages
-			// this is from the base of the extender. 
-			// incoming associations from the base should be discarded for extenders
-			boolean mergebase = false;
-			boolean isExtender = isExtender(ce);
-			boolean isReplacer = isReplacer(ce);
-			boolean isExtendReplacer = isExtendReplacer(ce) || 
-				ElementRealizer.isExtendReplaceEnabled() && isReplacer;
-			
-//			//This is a conservative fix for "Extends-replace displine rendered wrong in conf tree view"
-//			if (isExtendReplacer(ce) &&  realizer.getClass() == DefaultElementRealizer.class) {
-//				if (feature == AssociationHelper.Discipline_DisciplineGroupings) {
-//					isReplacer = true;
-//				}
-//				if (feature == AssociationHelper.RoleSet_RoleSetGrouppings) {
-//					isReplacer = true;
-//				}				
-//			}
-			
-			// extenderReplacer behaves like replacer when realizing incoming associations
-			// Bug 199694 - Extends-Replace ignores incoming relationships of contributer
-			if ( isExtendReplacer ) {
-				isReplacer = true;
-			}
-			
-			if (isReplacer) {
-				mergebase = mergeReplacerBase && ((value instanceof List) || (values.size() == 0));
-			} else if (isExtender) {
-				mergebase = mergeExtenderBase;
-			}
-
-			if (mergebase) {
-				// resolve the base contributor to the base if i am not a
-				// replacer
-				// don't resolve the contributors to the base if i am a
-				// replacer,
-				// the call is coming from the base. So if resolve to base again
-				// will cause deadlock.
-				// don't resolve to the replacer since we need to carry down all
-				// the incoming 0n associations from base
-				// actually should resolve to replacer if i am not a replacer
-				// (i.e. i am an entender)
-				// this handles the senario: G2 replaces G1 and G3 extends G1
-				ElementRealizer realizer2 = 
-					new DefaultElementRealizer(config, (!isReplacer), (!isReplacer));
-
-				MethodElement e = getCalculatedElement(ce
-						.getVariabilityBasedOnElement(), realizer2);
-				
-				// if the base element resolved to null, 
-				// this is because canShow() don't allow replaced element to show.
-				// we don't want to take the risk to fix ElementRealizer
-				// so fix here since 7.0.1_ifix1, 
-				// Jinhua Xi, 4/17/06
-				if ( e == null ) {
-					e = ce.getVariabilityBasedOnElement();
-				}
-				
-				if ((e != ce) && inConfig(e, config)) {
-					calculateOppositeFeature(e, feature, mergeReplacerBase, mergeExtenderBase, realizer, values);
-				}
-			}
-		}
-	}
-
-	/**
-	 * calculate the elements in the list, and returns a new list of unique
-	 * elements
-	 * 
-	 * @param elements
-	 * @param config
-	 * @return List
-	 */
-	public static List getCalculatedElements(List elements,
-			MethodConfiguration config) {
-		return getCalculatedElements(elements, new DefaultElementRealizer(config) );
-	}
-	
-	/**
-	 * calculate the elements in the list, and returns a new list of unique
-	 * elements
-	 * 
-	 * @param elements
-	 * @param realizer ElementRealizer
-	 * @return List
-	 */
-	public static List getCalculatedElements(List elements, ElementRealizer realizer ) {
-		// calculate each element in the list and return a new list of elements
-		List values = new ArrayList();
-		for (Iterator it = elements.iterator(); it.hasNext();) {
-			MethodElement e = (MethodElement) it.next();
-			e = ConfigurationHelper.getCalculatedElement(e, realizer);
-			if ((e != null) && (!values.contains(e))) {
-				values.add(e);
-			}
-		}
-
-		return values;
-	}
-
-	/**
-	 * calculate the element based on tle configuration. If nothing can be
-	 * shown, return null.
-	 * 
-	 * @param element
-	 * @param config
-	 * @return
-	 */
-	public static MethodElement getCalculatedElement(MethodElement element,
-			MethodConfiguration config) {
-		ElementRealizer realizer = new DefaultElementRealizer(config, true, true);
-
-		return getCalculatedElement(element, realizer);
-	}
-	
-	public static MethodElement getCalculatedElement(MethodElement element,
-			ElementRealizer realizer) {
-
-		MethodElement e = element;
-		MethodElement e2;
-		while ((e2 = realizer.realize(e)) != e) {
-			e = e2;
-		}
-		return e;
-	}
-
-	/**
-	 * get the calculated 0..1 feature value of the specipied element and
-	 * feature
-	 * 
-	 * @return MethodElement
-	 */
-	public static MethodElement calc01FeatureValue(MethodElement element,
-			EStructuralFeature feature, ElementRealizer realizer) {
-		return calc01FeatureValue(element, null, feature, realizer);
-	}
-	
-	/**
-	 * get the calculated 0..1 feature value of the specipied element and
-	 * feature
-	 * 
-	 * @return MethodElement
-	 */
-	public static MethodElement calc01FeatureValue(MethodElement element, MethodElement ownerElement, 
-			EStructuralFeature feature, ElementRealizer realizer) {
-		// presentation object feature should never be realized. always keep
-		// it's own value
-		Object v = element.eGet(feature);
-		if (v instanceof ContentDescription) {
-			return (MethodElement) v;
-		}
-
-		ToOneFeatureValue values = new ToOneFeatureValue(element, ownerElement, feature, realizer);
-		calculateFeature(element, ownerElement, feature, realizer.getConfiguration(), values, realizer);
-//		if (values.size() > 0) {
-//			v = (MethodElement) values.get(0);
-//			if (v instanceof MethodElement) {
-//				return getCalculatedElement((MethodElement) v, realizer.getConfiguration());
-//			}
-//		}
-
-		return (MethodElement)values.getValue();
-	}
-
-
-	/**
-	 * is this feature for containd children? such as artifact's contained artifact.
-	 * @param feature 
-	 * @return boolean
-	 */
-	public static boolean isContainmentFeature(EStructuralFeature feature) {
-		return feature == UmaPackage.eINSTANCE.getArtifact_ContainedArtifacts()
-				|| feature == UmaPackage.eINSTANCE.getPractice_SubPractices();
-	}
-
-	/**
-	 * check if the element allow contained element
-	 * @param element
-	 * @return boolean
-	 */
-	public static boolean isContainmentElement(Object element) {
-		return element instanceof Artifact || element instanceof Practice;
-	}
-
-	private static List getContainers(MethodElement element,
-			MethodConfiguration config) {
-		List items = new ArrayList();
-
-		EObject o = element;
-		while ((o != null) && ((o = o.eContainer()) != null)
-				&& o.getClass().isInstance(element)) {
-			if (o instanceof VariabilityElement) {
-				o = getCalculatedElement((VariabilityElement) o, config);
-			}
-
-			if ((o != null) && !items.contains(o)) {
-				items.add(o);
-			}
-		}
-
-		return items;
-	}
-
-	/**
-	 * get the 01 opposite feature (if any) for the given feature. returns null
-	 * if no such feature
-	 * 
-	 * @param feature
-	 *            EStructuralFeature
-	 * @return OppositeFeature the 01 opposite feature of the given feature,
-	 *         null if no such thing
-	 */
-	public static OppositeFeature get01OppositeFeature(
-			EStructuralFeature feature) {
-		
-		// since 1.0m4, these are not 01 feature any more
-//		if (feature == UmaPackage.eINSTANCE.getDiscipline_Tasks()) {
-//			return AssociationHelper.Task_Discipline;
-//		} else if (feature == UmaPackage.eINSTANCE.getRole_ResponsibleFor()) {
-//			return AssociationHelper.WorkProduct_ResponsibleRole;
-//		}
-		
-//		if ( feature == UmaPackage.eINSTANCE.getDomain_WorkProducts() ) {
-//			return AssociationHelper.WorkProduct_Domains;
-//		} 
-		
-		return null;
-	}
-
-
-	/**
-	 * get the target feature for the opposite feature if the target feature is a to-One feature, 
-	 * otherwise, return null.
-	 * @param oFeature
-	 * @return EStructuralFeature
-	 */
-	public static EStructuralFeature get01Feature(OppositeFeature oFeature) {
-		if ( oFeature == AssociationHelper.Role_Primary_Tasks 
-				|| oFeature == AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors ) {
-			return oFeature.getTargetFeature();
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * get the calculated 0..n feature value of the specipied element, it's
-	 * owner element and feature
-	 * 
-	 * @param element {@link MethodElement}
-	 * @param feature {@link EStructuralFeature}
-	 * @param realizer {@link ElementRealizer}
-	 * @return List a list of {@link MethodElement}
-	 */
-	public static List calc0nFeatureValue(MethodElement element,
-			EStructuralFeature feature, ElementRealizer realizer) 
-	{
-		return calc0nFeatureValue(element, null, feature, realizer);
-	}
-	
-	/**
-	 * get the calculated 0..n feature value of the specipied element and
-	 * feature. if the opposite feature on the other end is a to-one feature,
-	 * the feature value item can't be in the value list unless it's opposite
-	 * feature value is the current element. For example, for discipline_tasks,
-	 * the tasks can be selected if and ONLY if the task's task_discipline
-	 * opposite feature value is the current discipline
-	 * 
-	 * @param element MethodElement
-	 * @param ownerElement {@link MethodElement}
-	 * @param feature {@link EStructuralFeature}
-	 * @param realizer {@link ElementRealizer}
-	 * @return List a list of {@link MethodElement}
-	 */
-	public static List calc0nFeatureValue(MethodElement element, MethodElement ownerElement, 
-			EStructuralFeature feature, ElementRealizer realizer) {
-				
-		List v = null;
-		MethodConfiguration config = realizer.getConfiguration();
-		
-		// Wrong "modifies" information published in team allocation view for small configuration
-		// need to manually calculate the modify features
-		// can't rely on the uma model since that is not configuration specific.
-		// role modifies product means:
-		// role performs on tasks, and tasks produce workproducts as output
-		// so handle these scenarios as special cases
-		if ( element instanceof Role && feature == UmaPackage.eINSTANCE.getRole_Modifies() ) {
-//			List v2 = new ArrayList();
-//			calculateOppositeFeature(element, AssociationHelper.Role_Primary_Tasks, realizer, v2);
-//			if ( v2.size() > 0 ) {
-//				for (Iterator it = v2.iterator(); it.hasNext(); ) {
-//					MethodElement e = (MethodElement)it.next();
-//					calculateFeature(e, ownerElement, UmaPackage.eINSTANCE.getTask_Output(), config, v, realizer);					
-//				}
-//			}	
-			v = calcModifiedWorkProducts((Role)element, ownerElement, realizer);
-		}else if ( element instanceof RoleDescriptor && feature == UmaPackage.eINSTANCE.getRoleDescriptor_Modifies() ) {
-//			List v2 = new ArrayList();
-//			calculateOppositeFeature(element, AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors, realizer, v2);
-//			if ( v2.size() > 0 ) {
-//				for (Iterator it = v2.iterator(); it.hasNext(); ) {
-//					MethodElement e = (MethodElement)it.next();
-//					calculateFeature(e, ownerElement, UmaPackage.eINSTANCE.getTaskDescriptor_Output(), config, v, realizer);					
-//				}
-//			}
-			v = calcModifiedWorkProductDescriptors((RoleDescriptor)element, ownerElement, realizer);
-		} else {
-			ToManyFeatureValue fv = new ToManyFeatureValue(element, ownerElement, feature, realizer);
-			calculateFeature(element, ownerElement, feature, config, fv, realizer);
-			v = (List)fv.getValue();
-		}
-		
-		List values = getCalculatedElements(v, realizer);
-		if (values.contains(element)) {
-			values.remove(element);
-		}
-
-		// * if the opposite feature on the other end is a to-one feature,
-		// * the feature value item can't be in the value list unless it's
-		// opposite feature value is the current element.
-		// * For example, for discipline_tasks, the tasks can be selected
-		// * if and ONLY if the task's task_discipline opposite feature value is
-		// the current discipline
-		OppositeFeature of = get01OppositeFeature(feature);
-		if (of != null) {
-			int i = 0;
-			while (i < values.size()) {
-				MethodElement o = (MethodElement) values.get(i);
-
-				// calculate it's opposite feature value, the value must be the
-				// given element
-				// otherwise, remove it
-				// note: don't use the current realizer
-				// use the default realizer since we need to realize the element in the default way
-				// 158924 - wrong categories in configuration view
-
-				
-				// workaround to allow show/hide subtracted elements
-				DefaultElementRealizer r = new DefaultElementRealizer(config);
-				r.setShowSubtracted(realizer.showSubtracted());
-				
-				MethodElement oo = calc01FeatureValue(o, of, r);
-				if (oo != element) {
-					values.remove(i);
-				} else {
-					i++;
-				}
-			}
-		}
-
-		// containment feature value should not contain the owner element or its
-		// parents
-		// for example, artifact_containedArtifacts should not be the artifact
-		// itself or its parents
-		if (isContainmentFeature(feature)) {
-			List containers = getContainers(element, config);
-			int i = 0;
-			while (i < values.size()) {
-				Object o = (Object) values.get(i);
-				if (o == element || containers.contains(o)) {
-					values.remove(i);
-				} else {
-					i++;
-				}
-			}
-		}
-		
-		List returnList = realizer.realize(element, feature, values);
-		if (CategorySortHelper.needToSort(element, feature)) {
-			returnList = CategorySortHelper.sortCategoryElements(element, returnList.toArray(), true);
-		}
-
-		// the following part might not be general to all cases
-		// so put it into the realizer
-		return returnList;
-		
-//		// if the feature value is containment element such as artifact
-//		// the child element can't show if any of the parent(s) are in the list
-//		// Published site: Display of WPs under responsible role
-//		if (feature.isMany() && values.size() > 0
-//				&& isContainmentElement(values.get(0))) {
-//			int i = 0;
-//			while (i < values.size()) {
-//				MethodElement o = (MethodElement) values.get(i);
-//
-//				// if the container of the element is in the list, remove this
-//				// element from the list
-//				if (isContainerInList(o, values, config)) {
-//					values.remove(i);
-//				} else {
-//					i++;
-//				}
-//			}
-//		}
-//
-//		// need to sort the concept and papers by type
-//		if ((feature == UmaPackage.eINSTANCE
-//				.getContentElement_ConceptsAndPapers())
-//				&& (values.size() > 0)) {
-//			List papers = new ArrayList();
-//			int i = 0;
-//			while (i < values.size()) {
-//				Object o = values.get(i);
-//				if (o instanceof Whitepaper) {
-//					papers.add(o);
-//					values.remove(i);
-//				} else {
-//					i++;
-//				}
-//			}
-//
-//			if (papers.size() > 0) {
-//				values.addAll(papers);
-//			}
-//		}
-//
-//		return values;
-	}
-
-	/**
-	 * check if the container of the element is in the list or not
-	 * 
-	 * @param element
-	 * @param items
-	 * @param config
-	 * @return
-	 */
-	public static boolean isContainerInList(MethodElement element, List items,
-			MethodConfiguration config) {
-		EObject o = element;
-		while ((o != null) && ((o = o.eContainer()) != null)
-				&& o.getClass().isInstance(element)) {
-			if (items.contains(o)) {
-				return true;
-			}
-
-			if (o instanceof VariabilityElement) {
-				o = getCalculatedElement((VariabilityElement) o, config);
-			}
-
-			if ((o != null) && items.contains(o)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * get the calculated attribute feature value of the specipied element and
-	 * feature
-	 * 
-	 * @param element {@link MethodElement}
-	 * @param feature {@link EStructuralFeature}
-	 * @param config {@link MethodConfiguration}
-	 * @return Object
-	 */
-	public static Object calcAttributeFeatureValue(MethodElement element,
-			EStructuralFeature feature, MethodConfiguration config) {
-		return calcAttributeFeatureValue(element, null, feature, config);
-	}
-
-	/**
-	 * get the calculated attribute feature value of the specipied element and
-	 * feature
-	 * 
-	 * @param element MethodElement
-	 * @param ownerElement {@link MethodElement}
-	 * @param feature {@link EStructuralFeature}
-	 * @param config {@link MethodConfiguration}
-	 * @return Object
-	 */
-	public static Object calcAttributeFeatureValue(MethodElement element,
-			MethodElement ownerElement, EStructuralFeature feature,
-			MethodConfiguration config) {
-		if (isMergableAttribute(feature)) {
-			// merge the attribute values
-			ElementRealizer realizer = new DefaultElementRealizer(config);
-			AttributeFeatureValue values = new AttributeFeatureValue(element, ownerElement, feature, realizer);
-			calculateFeature(element, ownerElement, feature, config, values,
-						realizer);
-
-//			StringBuffer buffer = new StringBuffer();
-//			for (Iterator it = values.iterator(); it.hasNext();) {
-//				FeatureValue av = (FeatureValue) it.next();
-//				if (av.text == null || av.text.toString().length() == 0) {
-//					continue;
-//				}
-//
-//				if (feature == UmaPackage.eINSTANCE
-//						.getDescribableElement_PresentationName()) {
-//					if (values.size() > 1) {
-//						// something wrong here, will not happen but put test
-//						// message here just in case
-//						if (debug) {
-//							System.out
-//									.println("ConfigurationHelper.calcAttributeFeatureValue: Presentation Name get more then one entry: " + LibraryUtil.getTypeName(element)); //$NON-NLS-1$
-//						}
-//					}
-//					return av.text;
-//				}
-//
-//				if (buffer.length() > 0) {
-//					buffer.append(ATTRIBUTE_VALUE_SEPERATOR); 
-//				}
-//
-//				if (av.element == element) {
-//					buffer.append(av.text);
-//				} else {
-//					String contentPath = ResourceHelper
-//							.getElementPath((av.element instanceof ContentDescription) ? (MethodElement) av.element
-//									.eContainer()
-//									: av.element);
-//
-//					String backPath = ResourceHelper
-//							.getBackPath((element instanceof ContentDescription) ? ((ownerElement != null) ? ownerElement
-//									: (MethodElement) element.eContainer())
-//									: element);
-//
-//					buffer.append(ResourceHelper.fixContentUrlPath(av.text,
-//							contentPath, backPath));
-//				}
-//			}
-//
-//			return buffer.toString();
-			
-			return values.getValue();
-		}
-
-		return element.eGet(feature);
-	}
-
-	/**
-	 * get the calculated 0..n opposite feature value of the specipied element
-	 * and opposite feature
-	 * 
-	 * @param element MethodElement
-	 * @param feature {@link EStructuralFeature}
-	 * @param realizer {@link ElementRealizer}
-	 * @return List a list of {@link MethodElement}
-	 */
-	public static List calc0nFeatureValue(MethodElement element,
-			OppositeFeature feature, ElementRealizer realizer) {
-		return calc0nFeatureValue(element, feature, true, false, realizer);
-	}
-
-	/**
-	 * get the calculated 0..n opposite feature value of the specipied element
-	 * and opposite feature
-	 * 
-	 * @param element MethodElement
-	 * @param ownerElement {@link MethodElement}
-	 * @param feature {@link OppositeFeature}
-	 * @param mergeReplacerBase boolean
-	 * @param mergeExtenderBase boolean
-	 * @param realizer {@link ElementRealizer}
-	 * @return List a list of {@link MethodElement}
-	 */
-	public static List calc0nFeatureValue(MethodElement element,
-			OppositeFeature feature, boolean mergeReplacerBase, boolean mergeExtenderBase, ElementRealizer realizer) {
-		ToManyOppositeFeatureValue values = new ToManyOppositeFeatureValue(element, feature, realizer);
-		calculateOppositeFeature(element, feature, mergeReplacerBase, mergeExtenderBase, realizer, values);
-		return (List)values.getValue();
-	}
-	
-	
-	
-	/**
-	 * get the calculated 0..1 feature value of the specipied element and
-	 * opposite feature
-	 * @param element {@link MethodElement}
-	 * @param feature {@link OppositeFeature}
-	 * @param realizer {@link ElementRealizer}
-	 * 
-	 * @return MethodElement
-	 */
-	public static MethodElement calc01FeatureValue(MethodElement element,
-			OppositeFeature feature, ElementRealizer realizer) {
-		ToOneOppositeFeatureValue values = new ToOneOppositeFeatureValue(element, feature, realizer);
-		calculateOppositeFeature(element, feature, realizer, values);
-//		if (values.size() > 0) {
-//			return getCalculatedElement((MethodElement) values.get(0), realizer);
-//		}
-//
-//		return null;
-		
-		return (MethodElement)values.getValue();
-		
-	}
-
-	/**
-	 * order the sections
-	 * 
-	 * @param element {@link ContentElement}
-	 * @param values {@link List} 
-	 */
-	public static void orderSections(ContentElement element, List values) {
-		String orderingGuide = element.getOrderingGuide();
-		if (orderingGuide == null || orderingGuide.trim().length() == 0) {
-			return;
-		}
-		SectionList slist = new SectionList(element,
-				SectionList.STEPS_FOR_ELEMENT_AND_PARENTS);
-
-		if (isSameList(values, slist)) {
-			values.clear();
-			values.addAll(slist);
-			return;
-		}
-
-		// otherwise, need to reorder the list
-		OrderedListComparator comp = new OrderedListComparator(new ArrayList(
-				values), slist);
-		TreeSet s = new TreeSet(comp);
-		s.addAll(values);
-
-		values.clear();
-		values.addAll(s);
-	}
-
-	private static boolean isSameList(List l1, List l2) {
-		if (l1.size() != l2.size()) {
-			return false;
-		}
-
-		for (Iterator it = l1.iterator(); it.hasNext();) {
-			Object o = it.next();
-			if (!l2.contains(o)) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * calculate the copyright of the element int he configuration. Rule: 1.
-	 * contributors' copyright statment should be merged to the base 2. extended
-	 * element inherites the copyrights from the base 3. replacer don't inherite
-	 * the copyrights from the base 4. copyright elements should be unique, no
-	 * duplicate entry
-	 * 
-	 * @param element
-	 * @param config
-	 * @param values
-	 */
-	private static void calculateCopyright(MethodElement element,
-			MethodConfiguration config, List values) {
-		SupportingMaterial copyright = (SupportingMaterial) getCalculatedElement(
-				LibraryUtil.getCopyright(element), config);
-		if (copyright != null && !values.contains(copyright)) {
-			values.add(copyright);
-		}
-
-		VariabilityElement ve = getVariableOwner(element);
-		if (ve == null) {
-			return;
-		}
-
-		if (config == null) {
-			return;
-		}
-
-		// merge copyrights of contributors
-		List items = getContributors(ve, config);
-		if (items != null && items.size() > 0) {
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				MethodElement e = (MethodElement) it.next();
-				calculateCopyright(e, config, values);
-			}
-		}
-
-		// if the element is an extended element, get the base element's
-		// copyright
-		// the base element's copyright should appear first
-		if (isExtender(ve)) {
-			// realize the base element first.
-			MethodElement e = getCalculatedElement(ve
-					.getVariabilityBasedOnElement(), config);
-			if ((ve != e) && inConfig(e, config)) {
-				List baseItems = new ArrayList();
-				calculateCopyright(e, config, baseItems);
-
-				// add the base items to the begining
-				if (baseItems.size() > 0) {
-					// Authoring: Duplicate copyrights when 2
-					// elements with the same coyright are extending each other
-					// remove the duplicate ones
-					int i = 0;
-					while (i < values.size()) {
-						if (baseItems.contains(values.get(i))) {
-							values.remove(i);
-						} else {
-							i++;
-						}
-					}
-
-					values.addAll(0, baseItems);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * get the copyright text
-	 * 
-	 * @param element {@link MethodElement}
-	 * @param config {@link MethodConfiguration}
-	 * @return String
-	 */
-	public static String getCopyrightText(MethodElement element,
-			MethodConfiguration config) {
-		StringBuffer copyrights = new StringBuffer();
-		List items = new ArrayList();
-		ConfigurationHelper.calculateCopyright(element, config, items);
-		if (items.size() > 0) {
-			SupportingMaterial copyright;
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				copyright = (SupportingMaterial) it.next();
-
-				// Contributing support material does not show
-				// up in copy right
-				// need to resolve the feature value. can't just get the value,
-				// it may have contributors
-				// String statement =
-				// copyright.getPresentation().getMainDescription();
-				//											
-				String statement = (String) calcAttributeFeatureValue(copyright
-						.getPresentation(), copyright, UmaPackage.eINSTANCE
-						.getContentDescription_MainDescription(), config);
-				if (statement != null && statement.length() > 0) {
-					// need to fix the content for relative links.
-					// since the link is a relative path to the
-					// SupportingMaterial location,
-					// need to convert to relative to the current element
-					// so re-calcuate the back path
-					// jxi, 06/28/05
-					String contentPath = ResourceHelper
-							.getElementPath(copyright);
-					String backPath = ResourceHelper.getBackPath(element);
-					statement = ResourceHelper.fixContentUrlPath(statement,
-							contentPath, backPath);
-
-					if (copyrights.length() > 0) {
-						copyrights.append("<p/>"); //$NON-NLS-1$
-					}
-					copyrights.append(statement);
-				}
-			}
-		}
-
-		return copyrights.toString();
-	}
-
-	/**
-	 * Gets String attribute values of an activity
-	 * 
-	 * @param e Activity or it's ContentDescription
-	 * @param attrib
-	 * @param config
-	 * @return String
-	 */
-	public static String getActivityStringAttribute(MethodElement e, MethodElement ownerElement, 
-			EAttribute attrib, MethodConfiguration config) {
-		if(!String.class.isAssignableFrom(attrib.getEAttributeType().getInstanceClass())) {
-			throw new IllegalArgumentException("The specified attribute is not of type String: " + attrib); //$NON-NLS-1$
-		}
-		
-		Object str = null;
-		boolean isDesc;
-		VariabilityElement ve;
-		if ( e instanceof ContentDescription )
-		{
-			ve = (VariabilityElement) e.eContainer();
-			if ( ve == null ) {
-				ve = (VariabilityElement)ownerElement;
-			}
-			isDesc = true;
-		}
-		else if ( e instanceof VariabilityElement)
-		{
-			ve = (VariabilityElement)e;
-			isDesc = false;
-		} else {
-			str = e.eGet(attrib);
-			return (str==null) ? "" : str.toString(); //$NON-NLS-1$
-		}
-		
-		
-		if(attrib == UmaPackage.eINSTANCE.getMethodElement_Guid() || attrib == UmaPackage.eINSTANCE.getNamedElement_Name()) {
-			return (String)e.eGet(attrib);
-		}		
-					
-		VariabilityElement base = ve.getVariabilityBasedOnElement();
-		VariabilityType variabilityType = ve.getVariabilityType();
-		if( base != null && variabilityType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-			// for local contribution, append the text to the base
-			Object strBase;
-			if ( isDesc ) {
-				str = ((DescribableElement)ve).getPresentation().eGet(attrib);
-				strBase = calcAttributeFeatureValue( ((DescribableElement)base).getPresentation(), base, attrib, config);
-			} else {
-				str = ve.eGet(attrib);
-				strBase = calcAttributeFeatureValue(base, null, attrib, config);				
-			}
-			
-			if ( strBase != null && strBase.toString().length() > 0 ) {
-				if ( str != null && str.toString().length() > 0 ) {
-					str = strBase + ATTRIBUTE_VALUE_SEPERATOR + str;
-				} else {
-					str = strBase;
-				}
-			}
-		} else {
-			str = calcAttributeFeatureValue(e, ve, attrib, config);
-		}
-
-		return (str==null) ? "" : str.toString(); //$NON-NLS-1$
-		
-//		List values = new ArrayList();
-//		VariabilityElement base;
-//		VariabilityType variabilityType;	
-//		boolean concat = attrib != UmaPackage.eINSTANCE.getDescribableElement_PresentationName();
-//		while(true) {
-//			base = ve.getVariabilityBasedOnElement();
-//			if(base == null) {
-//				Object str;
-//				if ( isDesc ) {
-//					str = ((DescribableElement)ve).getPresentation().eGet(attrib); 
-//				} else {
-//					str =  ve.eGet(attrib); 
-//				}
-//				if(str == null || str.toString().length() == 0) {
-//					if(values.isEmpty()) {
-//						values.add(str);
-//					}
-//				}
-//				else {
-//					values.add(0, str);
-//				}
-//				break;
-//			}
-//			else if(base instanceof Activity) {
-//				Object str;
-//				if ( isDesc ) {
-//					str = ((DescribableElement)ve).getPresentation().eGet(attrib); 
-//				} else {
-//					str = ve.eGet(attrib); 
-//				}
-//
-//				variabilityType = ve.getVariabilityType();
-//				if(variabilityType == VariabilityType.EXTENDS_LITERAL) {
-//					if(str == null || str.toString().length() == 0) {
-//						// use the value of the base
-//						//
-//						ve = base;
-//					}
-//					else {
-//						values.add(0, str);
-//						break;
-//					}
-//				}
-//				else if(variabilityType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {					
-//					if(str != null && str.toString().length() > 0) {
-//						// add to the list
-//						//
-//						values.add(0, str);
-//						if(!concat) {
-//							break;
-//						}
-//					}
-//					// go to the base
-//					ve = base;
-//				}
-//				else if(variabilityType == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-//					values.add(0, str);
-//					break;
-//				}
-//				//TODO: handle CONTRIBUTES AND REPLACES
-//			}
-//		}
-//		
-//		if ( values.size() == 0 ) {
-//			return ""; //$NON-NLS-1$
-//		}
-//		else if ( values.size() ==1 ) {
-//			return (String)values.get(0);
-//		}
-//		else {
-//			StringBuffer buffer = new StringBuffer();
-//			for (Iterator it = values.iterator(); it.hasNext(); ) {
-//				if ( buffer.length() > 0 ) {
-//					buffer.append(ATTRIBUTE_VALUE_SEPERATOR);
-//				}
-//				buffer.append(it.next());
-//			}
-//			return buffer.toString();			
-//		}
-	}
-	
-	/**
-	 * get all processes in the configuration
-	 * 
-	 * @param config
-	 * @return List
-	 */
-	public static List getAllProcesses(MethodConfiguration config) {
-		List processes = new ArrayList();
-		List plugins = config.getMethodPluginSelection();
-		for (Iterator it = plugins.iterator(); it.hasNext(); ) {
-			List items = TngUtil.getAllProcesses((MethodPlugin)it.next());
-			for ( Iterator itp = items.iterator(); itp.hasNext(); ) {
-				org.eclipse.epf.uma.Process p = (org.eclipse.epf.uma.Process)itp.next();
-				if ( canShow(p, config) && !processes.contains(p) ) {
-					processes.add(p);
-				}
-			}
-		}
-		
-		return processes;
-	}
-	
-	/**
-	 * get all processes in the plugin and the configuration
-	 * 
-	 * @param plugin
-	 * @param config
-	 * @return List
-	 */
-	public static List getAllProcesses(MethodPlugin plugin, MethodConfiguration config) {
-		List processes = new ArrayList();
-		List items = TngUtil.getAllProcesses(plugin);
-		for ( Iterator itp = items.iterator(); itp.hasNext(); ) {
-			org.eclipse.epf.uma.Process p = (org.eclipse.epf.uma.Process)itp.next();
-			if ( canShow(p, config) && !processes.contains(p) ) {
-				processes.add(p);
-			}
-		}
-	
-		return processes;
-	}
-	
-	/**
-	 * get all delivery processes in the plugin and configuration
-	 * @param plugin
-	 * @param config
-	 * @return List
-	 */
-	public static List getAllDeliveryProcesses(MethodPlugin plugin, MethodConfiguration config) {
-		List processes = new ArrayList();
-		List items = TngUtil.getAllProcesses(plugin);
-		for ( Iterator itp = items.iterator(); itp.hasNext(); ) {
-			org.eclipse.epf.uma.Process p = (org.eclipse.epf.uma.Process)itp.next();
-			if ( p instanceof DeliveryProcess ) {
-				if ( canShow(p, config) && !processes.contains(p) ) {
-					processes.add(p);
-				}
-			}
-		}
-	
-		return processes;
-	}
-	
-	/**
-	 * get all CapabilityPatterns in the plugin and configuration
-	 * 
-	 * @param plugin
-	 * @param config
-	 * @return List
-	 */
-	public static List getAllCapabilityPatterns(MethodPlugin plugin, MethodConfiguration config) {
-		List processes = new ArrayList();
-		List items = TngUtil.getAllProcesses(plugin);
-		for ( Iterator itp = items.iterator(); itp.hasNext(); ) {
-			org.eclipse.epf.uma.Process p = (org.eclipse.epf.uma.Process)itp.next();
-			if ( p instanceof CapabilityPattern ) {
-				if ( canShow(p, config) && !processes.contains(p) ) {
-					processes.add(p);
-				}
-			}
-		}
-	
-		return processes;
-	}
-	
-	/**
-	 * calculate the work products modified by the specified role, in the configuration
-	 * 
-	 * @param element Role
-	 * @param ownerElement MethodElement the owner to accept the calculated value
-	 * @param realizer
-	 * @return List list of work products being modified by the role
-	 */
-	public static List calcModifiedWorkProducts(Role element, MethodElement ownerElement, ElementRealizer realizer) {
-		List v = new ArrayList();
-		OppositeFeature ofeature = AssociationHelper.Role_Primary_Tasks;
-		ToManyOppositeFeatureValue fv2 = new ToManyOppositeFeatureValue(element, ofeature, realizer);
-		calculateOppositeFeature(element, ofeature, realizer, fv2);
-		if ( fv2.size() > 0 ) {
-			List v2 = (List)fv2.getValue();
-			EStructuralFeature feature = UmaPackage.eINSTANCE.getTask_Output();
-			for (Iterator it = v2.iterator(); it.hasNext(); ) {
-				MethodElement e = (MethodElement)it.next();
-				ToManyFeatureValue fv = new ToManyFeatureValue(element, ownerElement, feature, realizer);
-				((List)fv.getValue()).addAll(v);
-				
-				calculateFeature(e, ownerElement, 
-						feature, 
-						realizer.getConfiguration(), fv, realizer);	
-				v = (List)fv.getValue();
-			}
-		}	
-		
-		return v;
-	}
-		
-	/**
-	 * calculate the work product descriptors modified by the specified role descriptor, in the configuration
-	 * 
-	 * @param element RoleDescriptor
-	 * @param ownerElement MethodElement the owner to accept the calculated value
-	 * @param realizer
-	 * @return List list of work product descriptors being modified by the role descriptor
-	 * @deprecated use the RoleDescriptorLayout to calculate the feature value
-	 */
-	public static List calcModifiedWorkProductDescriptors(RoleDescriptor element, MethodElement ownerElement, ElementRealizer realizer) {
-		List v = new ArrayList();
-		OppositeFeature ofeature = AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors;
-		ToManyOppositeFeatureValue fv2 = new ToManyOppositeFeatureValue(element, ofeature, realizer);
-		calculateOppositeFeature(element, ofeature, realizer, fv2);
-		if ( fv2.size() > 0 ) {
-			List v2 = (List)fv2.getValue();
-			EStructuralFeature feature = UmaPackage.eINSTANCE.getTaskDescriptor_Output();
-			for (Iterator it = v2.iterator(); it.hasNext(); ) {
-				MethodElement e = (MethodElement)it.next();
-				
-				ToManyFeatureValue fv = new ToManyFeatureValue(element, ownerElement, feature, realizer);
-				((List)fv.getValue()).addAll(v);
-				
-				calculateFeature(e, ownerElement, 
-						feature, 
-						realizer.getConfiguration(), fv, realizer);	
-				v = (List)fv.getValue();
-			}
-		}
-		
-		return v;
-	}
-	
-	/**
-	 * calculate the roles that modifies the specified work product in the configuration
-	 * @param element WorkProduct
-	 * @param realizer
-	 * @return List the roles
-	 */
-	public static List calcModifyRoles(WorkProduct element, ElementRealizer realizer) {
-		List tasks = ConfigurationHelper.calc0nFeatureValue(
-				element, 
-				AssociationHelper.WorkProduct_OutputFrom_Tasks, 
-				realizer);
-		List modifyRoles = new ArrayList();
-		for (Iterator it = tasks.iterator(); it.hasNext(); ) {
-			Task t = (Task)it.next();
-			Role r = (Role)ConfigurationHelper.calc01FeatureValue(
-					t, 
-					UmaPackage.eINSTANCE.getTask_PerformedBy(), 
-					realizer);
-			if ( (r != null) && !modifyRoles.contains(r) ) {
-				modifyRoles.add(r);
-			}
-		}
-		
-		return modifyRoles;
-	}
-	
-	/**
-	 * calculate the role descriptors that modifies the specified work product descriptor in the configuration
-	 * @param element WorkProductDescriptor
-	 * @param realizer
-	 * @return List the role descriptors
-	 * @deprecated use the WorkProductDescriptorlayout to calculate the feature value
-	 */
-	public static List calcModifyRoleDescriptors(WorkProductDescriptor element, ElementRealizer realizer) {
-		List taskDescriptors = ConfigurationHelper.calc0nFeatureValue(
-				element, 
-				AssociationHelper.WorkProductDescriptor_OutputFrom_TaskDescriptors, 
-				realizer);
-		List modifyRoles = new ArrayList();
-		for (Iterator it = taskDescriptors.iterator(); it.hasNext(); ) {
-			TaskDescriptor t = (TaskDescriptor)it.next();
-			RoleDescriptor r = (RoleDescriptor)ConfigurationHelper.calc01FeatureValue(
-					t, 
-					UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(), 
-					realizer);
-			if ( (r != null) && !modifyRoles.contains(r) ) {
-				modifyRoles.add(r);
-			}
-		}
-		
-		return modifyRoles;
-	}
-	
-	/**
-	 * check if the activity is a contributor 
-	 * or contains any sub-activities that are contributors
-	 * @param element Activity
-	 * @return boolean
-	 */
-	public static boolean hasContributor(Activity element) {
-		if ( isContributor(element)) {
-			return true;
-		}
-
-		for ( Iterator it = element.getBreakdownElements().iterator(); it.hasNext(); ) {
-			Object o = it.next();
-			if ( !(o instanceof Activity) ) {
-				continue;
-			}
-			
-			if ( hasContributor( (Activity)o ) ) {
-				return true;
-			}
-		}
-		
-		return false;
-	}
-	
-	/**
-	 * get the base processes for an {@link Activity} in the Configuration
-	 * @param element
-	 * @param config
-	 * @return List
-	 */
-	public static List getBaseProcesses(Activity element, MethodConfiguration config) {
-		List value = new ArrayList();
-		getBaseProcesses(element, config, value);
-		return value;
-	}
-	
-	/**
-	 * get all base processes for an activity in the configuration
-	 * @param element
-	 * @param config
-	 * @param value List the bases processes
-	 */
-	public static void getBaseProcesses(Activity element, MethodConfiguration config, List value) {
-		
-		// get it's own base
-		if ( ConfigurationHelper.isExtender(element) ) {
-			Activity base = (Activity)element.getVariabilityBasedOnElement();
-			if ( base != null 
-					&& !value.contains(base) 
-					&& (base instanceof org.eclipse.epf.uma.Process) ) {
-				if ( canShow(base, config) ) {
-					value.add(base);
-				}
-				getBaseProcesses(base, config, value);
-			}
-		}
-		
-		// if the sub-activities have base, process it
-		for ( Iterator it = element.getBreakdownElements().iterator(); it.hasNext(); ) {
-			Object o = it.next();
-			if ( o instanceof Activity ) {
-				getBaseProcesses((Activity)o, config, value);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/DefaultElementRealizer.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/DefaultElementRealizer.java
deleted file mode 100644
index f971907..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/DefaultElementRealizer.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Whitepaper;
-
-/**
- * Default implementation of the realizer.
- * Realizes the element based on the configuration and realize options.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DefaultElementRealizer extends ElementRealizer {
-
-	/**
-	 * construct an instance with the give configuration
-	 * @param config MethodConfiguration
-	 */
-	public DefaultElementRealizer(MethodConfiguration config) {
-		super(config);
-	}
-
-	/**
-	 * construct an instance with the given configuration and additional realization options.
-	 * 
-	 * @param config MethodConfiguration
-	 * @param resolveContributor boolean if true, contrubutors from feature value list will be resolved. default to false.
-	 * @param resolveReplacer boolean if ture, element with a replacer will be resolved to the replacer. default to true.
-	 */
-	public DefaultElementRealizer(MethodConfiguration config,
-			boolean resolveContributor, boolean resolveReplacer) {
-		super(config, resolveContributor, resolveReplacer);
-	}
-	
-	/**
-	 * @see ElementRealizer.realize
-	 */
-	public MethodElement realize(MethodElement element) {
-		return super.realize(element);
-	}
-	
-	/**
-	 * realize the list of feature values and returns a new list of values
-	 * The new might be a re-sorting of the original list 
-	 * or some of the values can be filtered out, depending on the detail implementation
-	 * Note: the list value passed in might be updated as well.
-	 * @param element MethodElement
-	 * @param feature EStructuralFeature
-	 * @param values List
-	 * @return List
-	 */
-	public List realize(MethodElement element, 
-			EStructuralFeature feature, List values)
-	{
-		if ( values == null || values.size() == 0 ) {
-			return values;
-		}
-		
-		// Wrong "modifies" information published in team allocation view for small configuration
-		// added filter to clean up un-wanted items
-		if ( super.filter != null ) {
-			int i = 0;
-			while (i < values.size()) {
-				MethodElement o = (MethodElement) values.get(i);
-
-				if ( !filter.accept(o) ) {
-					values.remove(i);
-				} else {
-					i++;
-				}
-			}
-		}
-				
-		// if the feature value is containment element such as artifact
-		// the child element can't show if any of the parent(s) are in the list
-		// 00384619 - Published site: Display of WPs under responsible role
-		
-		// this is not a general rule. only apply to the published navigation tree.
-		// so move this logic to the tree generation code in publishing
-		// geenrally, show all elements, see bug
-		// 00386765 - Role responsibilities need to show (contributed) sub-artifacts	
-//		if (feature.isMany() && values.size() > 0
-//				&& ConfigurationHelper.isContainmentElement(values.get(0))) {
-//			int i = 0;
-//			while (i < values.size()) {
-//				MethodElement o = (MethodElement) values.get(i);
-//
-//				// if the container of the element is in the list, remove this
-//				// element from the list
-//				if (ConfigurationHelper.isContainerInList(o, values, config)) {
-//					values.remove(i);
-//				} else {
-//					i++;
-//				}
-//			}
-//		}
-
-		// need to sort the concept and papers by type
-		if ((feature == UmaPackage.eINSTANCE
-				.getContentElement_ConceptsAndPapers())
-				&& (values.size() > 0)) {
-			List papers = new ArrayList();
-			int i = 0;
-			while (i < values.size()) {
-				Object o = values.get(i);
-				if (o instanceof Whitepaper) {
-					papers.add(o);
-					values.remove(i);
-				} else {
-					i++;
-				}
-			}
-
-			if (papers.size() > 0) {
-				values.addAll(papers);
-			}
-		}
-		
-		return values;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ElementRealizer.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ElementRealizer.java
deleted file mode 100644
index dbb5033..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ElementRealizer.java
+++ /dev/null
@@ -1,287 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.layout.BrowsingLayoutSettings;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * Realizes the element based on the configuration and realize options.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public abstract class ElementRealizer {
-
-	protected MethodConfiguration config;
-
-	// note: discard contributor takes higher priority, if set to true,
-	// resolveContributor will be ignored
-	private boolean discardContributor = false;
-
-	private boolean resolveContributor = true;
-
-	private boolean resolveReplacer = true;
-
-	private boolean showSubtracted = false;
-	
-	protected IFilter filter = null;
-	
-	// this is the default setting based on the preference setting
-	// subclass should implement their own method the get the value
-	private static boolean defaultEnableExtendReplace = false;
-	
-	
-	//private static boolean defaultIgnoreBaseToManyAssociations = false;
-
-	static {
-		String str = LibraryPlugin.getDefault().getString("EnableExtendReplace"); //$NON-NLS-1$
-		if ( str != null && str.trim().equals("true") ) { //$NON-NLS-1$
-			defaultEnableExtendReplace = true;
-		}
-		
-		// 171882 - Extends-Replace Variability
-		//defaultIgnoreBaseToManyAssociations = LibraryPreferences.getUseNewExtendsSemantics();		
-	}
-	
-	/**
-	 * construct an instance with the give configuration
-	 * @param config MethodConfiguration
-	 */
-	public ElementRealizer(MethodConfiguration config) {
-		this(config, true, true);
-	}
-
-	/**
-	 * construct an instance with the given configuration and additional realization options.
-	 * 
-	 * @param config MethodConfiguration
-	 * @param resolveContributor boolean if true, contrubutors from feature value list will be resolved. default to false.
-	 * @param resolveReplacer boolean if ture, element with a replacer will be resolved to the replacer. default to true.
-	 */
-	public ElementRealizer(MethodConfiguration config,
-			boolean resolveContributor, boolean resolveReplacer) {
-		this.config = config;
-		this.resolveContributor = resolveContributor;
-		this.resolveReplacer = resolveReplacer;
-		
-	}
-
-	/**
-	 * is extend-replace enabled for replacement
-	 * 
-	 * @return boolean
-	 */
-	public static boolean isExtendReplaceEnabled() {
-		return defaultEnableExtendReplace;
-	}
-	
-	/**
-	 * get the global setting for the extend semantics
-	 * @return
-	 */
-	public static boolean ignoreBaseToManyAssociations() {
-		return BrowsingLayoutSettings.INSTANCE.isUseNewExtendSemantics();
-	}
-	
-	
-	/**
-	 * set the flag. if true, the contributors from a realized feature list will be discarded
-	 * 
-	 * @param discardContributor boolean
-	 */
-	public void setDiscardContributor(boolean discardContributor) {
-		this.discardContributor = discardContributor;
-	}
-
-	/**
-	 * set the flag. if true the contributors will be resolved.
-	 * @param resolveContributor boolean
-	 */
-	public void setResolveContributor(boolean resolveContributor) {
-		this.resolveContributor = resolveContributor;
-	}
-
-	/**
-	 * set the flag. if true the element with a replacer will be resolved to the replacer.
-	 * 
-	 * @param resolveReplacer boolean
-	 */
-	public void setResolveReplacer(boolean resolveReplacer) {
-		this.resolveReplacer = resolveReplacer;
-	}
-
-	public boolean showSubtracted() {
-		return showSubtracted;
-	}
-	
-	public void setShowSubtracted(boolean flag) {
-		this.showSubtracted = flag;
-	}
-	
-
-	/**
-	 * set a filter for this realizer
-	 * @param filter IFilter
-	 */
-	public void setFilter(IFilter filter) {
-		this.filter = filter;
-	}
-	
-	/**
-	 * get tyhe configuration
-	 * @return
-	 */
-	public MethodConfiguration getConfiguration() {
-		return config;
-	}
-	
-	/**
-	 * realize the element
-	 * @param element MethodElement
-	 * @return MethodElement
-	 */
-	public MethodElement realize(MethodElement element) {
-		
-		if (element == null || !inConfig(element)) {
-			return null;
-		}
-
-		// Work product descriptors that point to work products
-		// outside the configuration are still published
-		// linked element must be in config as well
-		MethodElement linkedElement = null;
-		if (element instanceof TaskDescriptor) {
-			linkedElement = ((TaskDescriptor) element).getTask();
-		} else if (element instanceof WorkProductDescriptor) {
-			linkedElement = ((WorkProductDescriptor) element).getWorkProduct();
-		} else if (element instanceof RoleDescriptor) {
-			linkedElement = ((RoleDescriptor) element).getRole();
-		}
-
-		if ((linkedElement != null)
-				&& !inConfig(linkedElement)) {
-			return null;
-		}
-
-		// if no configuration is specified, don't calculate
-		if (config == null) {
-			return element;
-		}
-
-		if (element instanceof VariabilityElement) {
-			VariabilityElement ve = (VariabilityElement) element;
-			VariabilityElement e;
-
-			// if discardContributor set to true, discard the contributor and
-			// return null
-			if (discardContributor && ConfigurationHelper.isContributor(ve)) {
-				return null;
-			}
-
-			if (resolveContributor) {
-				// if the element is a contributor, resovle to it's base
-				while (ConfigurationHelper.isContributor(ve)) {
-					e = ve.getVariabilityBasedOnElement();
-					if (inConfig(e)) {
-						ve = e;
-					} else {
-						// if the base is not in the configuration, it's an
-						// error
-						System.out
-								.println("Configuration closure error: Base element '" + LibraryUtil.getTypeName(ve) + "' not in configuration"); //$NON-NLS-1$ //$NON-NLS-2$
-						break;
-					}
-				}
-			}
-
-			if (resolveReplacer) {
-				e = ConfigurationHelper.getReplacer(ve, config);
-				if (e != null) {
-					return e;
-				}
-			} else if (!inConfig(ve)) {
-				return null;
-			}
-			
-			// if the element is a replacer, and the base is a contributor, 
-			// need to resolve the element to the base if resolveContributor is true
-			// 152230 - Browsing: Role<-->WP relationship shows inconsistancy
-			e = ve;
-			while ((e != null) && ConfigurationHelper.isReplacer(e)) {
-				e = (VariabilityElement) e.getVariabilityBasedOnElement();
-				if (ConfigurationHelper.isContributor(e)) {
-					return realize(e);
-				}
-			}
-			
-			// can't return here, need to check canShow
-			// return ve;
-			if (canShow(ve)) {
-				return ve;
-			}
-
-			return null;
-		}
-
-		if (canShow(element)) {
-			return element;
-		}
-
-		return null;
-	}
-
-	/**
-	 * realize the list of feature values and returns a new list of values
-	 * The new might be a re-sorting of the original list 
-	 * or some of the values can be filtered out, depending on the detail implementation
-	 * Note: the list value passed in might be updated as well.
-	 * @param element MethodElement
-	 * @param feature EStructuralFeature
-	 * @param values List
-	 * @return List
-	 */
-	public abstract List realize(MethodElement element,
-			EStructuralFeature feature, List values);
-	
-	/**
-	 * 
-	 * @param element
-	 * @return boolean
-	 */
-	public boolean inConfig(MethodElement element) {
-		return ConfigurationHelper.inConfig(element, config, !showSubtracted());
-	}
-	
-	/**
-	 * 
-	 * @param element
-	 * @return boolean
-	 */
-	public boolean canShow(MethodElement element) {
-		return ConfigurationHelper.canShow(element, config, !showSubtracted());
-	}
-	
-	public void dispose() {
-		this.filter = null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/FeatureValue.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/FeatureValue.java
deleted file mode 100644
index efddc6e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/FeatureValue.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * Helper class to identify the feature value and the owning element. 
- * this helps to identify where the value is coming from. 
- * For example, the realized value can be from the base element as well as contributors
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-abstract class FeatureValue {
-	
-	private static final String _NULL_ = "_NULL_"; //$NON-NLS-1$
-
-	protected MethodElement element;  // the element
-	protected MethodElement ownerElement;  // the container of the element
-	protected Object feature; // EStructrualFeature or Oppositefeature
-	protected ElementRealizer realizer = null;
-	
-	protected static boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	/**
-	 * construct an instance of the object
-	 * @param element MethodElement the element that the value is calcuated for. 
-	 * @param ownerElement MethodElement the element that owns the value
-	 * @param feature Object either EStructuralFeature or OppositeFeature.
-	 * @param realizer ElementRealizer
-	 */
-	public FeatureValue(MethodElement element, MethodElement ownerElement, Object feature, ElementRealizer realizer) {
-		this.element = element;
-		this.ownerElement = ownerElement;
-		this.feature = feature;
-		this.realizer = realizer;
-	}
-
-	abstract public void add(VariabilityElement owner, Object value);
-	abstract public int size();
-	abstract public Object getValue();
-	
-	/**
-	 * get the element
-	 * @return MethodElement
-	 */
-	public MethodElement getElement() {
-		return element;
-	}
-	
-	/**
-	 * get the owner element
-	 * @return MethodElement
-	 */
-	public MethodElement getOwnerElement() {
-		return ownerElement;
-	}
-	
-	/**
-	 * get the EStructuralFeature. return null if it's not a EStructuralFeature
-	 * @return MethodElement
-	 */
-	public EStructuralFeature getFeature() {
-		if ( feature instanceof EStructuralFeature ) {
-			return (EStructuralFeature)feature;
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * get the OppositeFeature, return null if this is not an OppositeFeature
-	 * @return OppositeFeature
-	 */
-	public OppositeFeature getOppositeFeature() {
-		if ( feature instanceof OppositeFeature ) {
-			return (OppositeFeature)feature;
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * get the realizer
-	 * @return ElementRealizer
-	 */
-	public ElementRealizer getRealizer() {
-		return realizer;
-	}
-	
-	public boolean isExtendReplaceEnabled() {
-		if ( ElementRealizer.isExtendReplaceEnabled() ) {
-			return true;
-		}
-
-		MethodElement e = element;
-		if ( element instanceof ContentDescription) {
-			e = (MethodElement)((ContentDescription)element).eContainer();
-			if ( e == null ) {
-				e = ownerElement;
-			}
-		}
-
-		if ( (e instanceof VariabilityElement) && ConfigurationHelper.isExtendReplacer((VariabilityElement)e) ) {
-			return true;
-		}
-			
-		return false;
-	}
-	
-	public static boolean isBlankIndicator(Object value) {
-		if ( value instanceof String) {
-			return _NULL_.equals(value.toString());
-		} else if ( value instanceof MethodElement) {
-			return _NULL_.equals(((MethodElement)value).getName());
-		}
-		
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/OrderedListComparator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/OrderedListComparator.java
deleted file mode 100644
index cbc9d79..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/OrderedListComparator.java
+++ /dev/null
@@ -1,91 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * a comparator to sort an element list.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class OrderedListComparator implements Comparator {
-
-	// sort the baselist according to the sorted list
-	// any item in sorted list but not in base list are ignored
-	// any item in base list but not in sorted list keeps the original order
-	List baseList;
-
-	List sortedList;
-
-	OrderedListComparator(List baseList, List sortedList) {
-		this.baseList = baseList;
-		this.sortedList = sortedList;
-	}
-
-	/**
-	 * compare to objects.
-	 */
-	public int compare(Object e1, Object e2) {
-		int i1, i2;
-		if (sortedList != null) {
-			i1 = sortedList.lastIndexOf(e1);
-			i2 = sortedList.lastIndexOf(e2);
-			if (i1 >= 0 || i2 >= 0) {
-				// if not in the sorted list, find the immediate predicessor
-				// that is in the list and compare to it.
-				// if no such element, compare to the original list
-				if (i1 < 0) {
-					i1 = findComparableIndex(e1);
-				}
-
-				if (i2 < 0) {
-					i2 = findComparableIndex(e2);
-				}
-
-				if (i1 >= 0 && i2 >= 0 && i1 != i2) {
-					return i1 - i2;
-				}
-			}
-		}
-
-		return originalOrder(e1, e2);
-	}
-
-	private int findComparableIndex(Object e) {
-		int i2 = -1;
-		for (int i = baseList.lastIndexOf(e); i >= 0; i--) {
-			Object o = baseList.get(i);
-			i2 = sortedList.lastIndexOf(o);
-			if (i2 >= 0) {
-				break;
-			}
-		}
-
-		return i2;
-	}
-
-	private int originalOrder(Object e1, Object e2) {
-		int i1, i2;
-		if (baseList != null) {
-			i1 = baseList.lastIndexOf(e1);
-			i2 = baseList.lastIndexOf(e2);
-
-			return i1 - i2;
-		}
-
-		return 0;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessAuthoringConfigurator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessAuthoringConfigurator.java
deleted file mode 100644
index 84a887c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessAuthoringConfigurator.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.VariabilityInfo;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.VariabilityElement;
-
-
-/**
- * Configuration filter that still shows certain elements during process authoring that
- * ProcessConfigurator does not show.
- * 
- * @author Phong Nguyen Le - Jan 11, 2006
- * @since  1.0
- */
-public class ProcessAuthoringConfigurator extends ProcessConfigurator {
-	public static final ProcessAuthoringConfigurator INSTANCE = new ProcessAuthoringConfigurator();
-
-	private ProcessAuthoringConfigurator() {
-		super(null);
-		LibraryService.getInstance().addListener(new ILibraryServiceListener() {
-
-			public void configurationSet(MethodConfiguration config) {
-				setMethodConfiguration(config);
-			}
-
-			public void libraryClosed(MethodLibrary library) {
-			}
-
-			public void libraryCreated(MethodLibrary library) {
-			}
-
-			public void libraryOpened(MethodLibrary library) {
-			}
-
-			public void libraryReopened(MethodLibrary library) {
-			}
-
-			public void librarySet(MethodLibrary library) {
-			}
-			
-		});
-	}
-	
-	/**
-	 * @param methodConfig
-	 * @param viewer
-	 */
-	public ProcessAuthoringConfigurator(MethodConfiguration methodConfig) {
-		super(methodConfig);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.library.configuration.ConfigurationFilter#getChildren(java.lang.Object, org.eclipse.emf.ecore.EStructuralFeature)
-	 * override this,  for process authoring edit, should get direct children no realization.
-	 *  
-	 */
-	public Collection getChildren(Object obj, EStructuralFeature childFeature) {
-		EObject eObject = (EObject) obj;
-		return (List)eObject.eGet(childFeature);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.configuration.ConfigurationFilter#resolve(java.lang.Object)
-	 */
-	public Object resolve(Object object) {
-		return object;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.configuration.ConfigurationFilter#getVariabilityInfo(org.eclipse.epf.uma.VariabilityElement)
-	 */
-	public VariabilityInfo getVariabilityInfo(VariabilityElement ve) {
-		return new VariabilityInfo(ve) {
-			/* (non-Javadoc)
-			 * @see org.eclipse.epf.library.edit.VariabilityInfo#getInheriranceList()
-			 */
-			public List getInheritanceList() {
-				return Collections.singletonList(getOwner());
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.epf.library.edit.VariabilityInfo#getContributors()
-			 */
-			public List getContributors() {
-				return Collections.EMPTY_LIST;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessConfigurator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessConfigurator.java
deleted file mode 100644
index f475e00..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessConfigurator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.TeamProfile;
-
-
-/**
- * 
- * @author Phong Le
- * @author Shilpa Toraskar
- * @since 1.0
- *
- */
-public class ProcessConfigurator extends ConfigurationFilter {
-
-	private boolean checkOwningProcess;
-
-	/**
-	 * @param methodConfig
-	 * @param viewer
-	 */
-	public ProcessConfigurator(MethodConfiguration methodConfig) {
-		super(methodConfig);
-	}
-	
-	/**
-	 * @param methodConfig
-	 * @param viewer
-	 * @param checkOwningProcess if true will check on owning process of activities whether it is in the configuration.
-	 *          This check is not required in process editor and skipping it helps the performance.
-	 */
-	public ProcessConfigurator(MethodConfiguration methodConfig, boolean checkOwningProcess) {
-		this(methodConfig);
-		this.checkOwningProcess = checkOwningProcess;
-	}
-
-	public void setMethodConfiguration(MethodConfiguration newConfig) {
-		methodConfig = newConfig;
-	}
-
-	public boolean accept(Object obj) {
-		if (methodConfig == null)
-			return true;
-
-		if (obj instanceof BreakdownElement) {
-			DefaultElementRealizer realizer = new DefaultElementRealizer(super.methodConfig);
-			return accept((BreakdownElement)obj, realizer);
-		}
-		
-		return super.accept(obj);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.library.configuration.ProcessConfigurator#accept(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected boolean accept(BreakdownElement e, final ElementRealizer realizer) {
-		if (e instanceof Milestone || e instanceof TeamProfile) {
-			// accept all process elements that are not associated with any content
-			// element
-			//
-			return true;
-		} else if (e instanceof Activity) {
-			return ProcessUtil.accept((Activity) e, new IFilter() {
-
-				public boolean accept(Object obj) {
-					return obj instanceof MethodElement ? realizer.inConfig((MethodElement) obj) : true;
-				}
-				
-			}, checkOwningProcess);
-		}
-		else if(e instanceof Descriptor) {
-			// TODO: need to consider checking on owning process of the descriptor whether it is in the configuration.
-			// Currently, this check is not required and skipping it helps the performance.
-			// But this check might affect the current code, e.g.: process properties view.
-			//
-			MethodElement linked_obj = ProcessUtil.getAssociatedElement((Descriptor) e);
-			if (linked_obj == null || linked_obj.eIsProxy()) {
-				// this is the processes own descriptor (independent from the content)
-				// always accept it
-				return true;
-			} else {
-				// make sure that element with replacer might still be accepted
-				//
-				linked_obj = ConfigurationHelper.getCalculatedElement(linked_obj, realizer);
-
-				// if the linked element is not in config, don't accept it
-				return realizer.inConfig(linked_obj);
-			}		
-		}
-		
-		return super.accept(e);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessVariabilityConfigurator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessVariabilityConfigurator.java
deleted file mode 100644
index 3e9395c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ProcessVariabilityConfigurator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- * 
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ProcessVariabilityConfigurator extends ProcessConfigurator {
-
-	/**
-	 * @param methodConfig
-	 * @param viewer
-	 */
-	public ProcessVariabilityConfigurator(MethodConfiguration methodConfig) {
-		super(methodConfig);
-	}
-
-	public void setMethodConfiguration(MethodConfiguration newConfig) {
-		methodConfig = newConfig;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.library.configuration.ProcessConfigurator#accept(org.eclipse.epf.uma.Descriptor)
-	 */
-	protected boolean accept(BreakdownElement e) {
-		if (e instanceof Activity) {
-			Activity base = (Activity) ((Activity) e)
-					.getVariabilityBasedOnElement();
-			if (base == null) {
-				return ConfigurationHelper.inConfig(
-						TngUtil.getOwningProcess(e), methodConfig);
-			} else {
-				return ConfigurationHelper.inConfig(TngUtil
-						.getOwningProcess(base), methodConfig);
-			}
-		}
-
-		return super.accept(e);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToManyFeatureValue.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToManyFeatureValue.java
deleted file mode 100644
index 1b3bce3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToManyFeatureValue.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * realized feature value for a toMany feature
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ToManyFeatureValue extends FeatureValue {
-
-	List values = new ArrayList();
-	
-	/**
-	 * @see org.eclipse.epf.library.configuration.FeatureValue#FeatureValue(MethodElement, MethodElement, Object, ElementRealizer)
-	 * @param element
-	 * @param ownerElement
-	 * @param feature
-	 * @param realizer
-	 */
-	public ToManyFeatureValue(MethodElement element, MethodElement ownerElement, Object feature, ElementRealizer realizer) {
-		super(element, ownerElement, feature, realizer);
-	}
-
-	/**
-	 * add a feature value to the value list
-	 * @param owner VariabilityElement
-	 * @param value Object
-	 */
-	public void add(VariabilityElement owner, Object value) {
-		if ( !(value instanceof List) ) {	
-			return;
-		}
-			
-		for (Iterator it = ((List) value).iterator(); it.hasNext();) {
-			Object obj = it.next();
-			if ( obj instanceof MethodElement ) {
-				MethodElement e = (MethodElement) obj;
-				//MethodElement ce = realizer.realize(e);
-				MethodElement ce = ConfigurationHelper.getCalculatedElement(e, realizer);
-				
-				// calculated element can be null if it can't show
-				if (ce != null && !values.contains(ce)) {
-					values.add(ce);
-				}
-			}
-		}
-		
-		if ( (owner instanceof ContentElement)
-				&& (feature == UmaPackage.eINSTANCE
-						.getContentDescription_Sections())) {
-			ConfigurationHelper.orderSections((ContentElement) owner, values);
-		}
-						
-	}
-	
-
-	/**
-	 * get the realized value
-	 * @return Object
-	 */
-	public Object getValue() {		
-		if ( isExtendReplaceEnabled() ) {
-			List items = new ArrayList();
-			
-			// remove the _NULL_ item. that is used as an indicator to blank out the base 
-			// for the extend-replace
-			for (Iterator it = values.iterator(); it.hasNext(); ) {
-				Object o = (Object) it.next();
-				if ( isBlankIndicator(o) ) {
-					continue;
-				}
-				items.add(o);
-			}
-			
-			return items;
-		}
-		
-		return values;
-
-	}
-
-	/**
-	 * get the size of the value list.
-	 */
-	public int size() {
-		return values.size();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToManyOppositeFeatureValue.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToManyOppositeFeatureValue.java
deleted file mode 100644
index ac5d9a6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToManyOppositeFeatureValue.java
+++ /dev/null
@@ -1,198 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * realized feature value for a toMany opposite feature
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ToManyOppositeFeatureValue extends ToManyFeatureValue {
-	
-	/**
-	 * @see construct a feature value object for to-many opposite feature
-	 * 
-	 * @param element
-	 * @param feature
-	 * @param realizer
-	 */
-	public ToManyOppositeFeatureValue(MethodElement element, OppositeFeature feature, ElementRealizer realizer) {
-		super(element, null, feature, realizer);
-	}
-
-	
-
-	/**
-	 * @see org.eclipse.epf.library.configuration.ToManyFeatureValue#add(VariabilityElement, Object)
-	 */
-	public void add(VariabilityElement owner, Object value) {
-		
-		// work around for opposite feature value that still return a single value instead of a list
-		if ( value instanceof MethodElement ) {
-			ArrayList v = new ArrayList();
-			v.add(value);
-			value = v;
-		}
-		
-		if ( !(value instanceof List) ) {	
-			return;
-		}
-			
-		OppositeFeature of = (OppositeFeature)feature;
-		EStructuralFeature f = of.getTargetFeature();
-
-		for (Iterator it = ((List) value).iterator(); it.hasNext();) {
-			MethodElement e = (MethodElement) it.next();
-
-			// Replace does not completely remove
-			// outgoing associations
-			// if the opposite feature value has replacer in the
-			// configuration
-			// it's outgoing associations (i.e., this element) will be
-			// replaced by the replacing element
-			// as a result, the opposite feature value should drop the
-			// replaced element
-			//
-			// for example, R1 -> responsible for A1, R2 responsible for
-			// A2
-			// if R2 replaces R1, then R2 still responsible for A2
-			// but A1 does not have a responsible role (not R2)
-			// so for A1's responsible role opposite feature,
-			// the value R1 should be dropped instead of realize to R2
-			// Jinhua Xi, 10/27/2005
-			
-			// check the replacer is not enough. If the base element is replaced, 
-			// all the contributors to the base should also be considered as replaced.
-			// so realize the element, see if it is a replacer
-			// Bug 199686 - Replacing roles does not update responsible work product's pages
-			VariabilityElement replacer = null;
-			if ( e instanceof VariabilityElement ) {
-				//replacer = ConfigurationHelper.getReplacer((VariabilityElement) e, realizer.getConfiguration());
-				replacer = (VariabilityElement)ConfigurationHelper.getCalculatedElement(e, realizer);
-				if ( (replacer == e) || !ConfigurationHelper.isReplacer(replacer) ) {
-					replacer = null;
-				}
-				
-			}
-			boolean isValueReplaced = (replacer != null);
-
-			boolean keep = !isValueReplaced;
-			if ( isValueReplaced && 
-					(ConfigurationHelper.isExtendReplacer(replacer) 
-					|| ElementRealizer.isExtendReplaceEnabled()) ) {
-				// if the value is replaced, but the out going feature is inherited by the replacer
-				// then we should keep this value, so we need to calculate the feature value 
-				// of the replacer
-				if ( f.isMany() ) {
-					List items = ConfigurationHelper.calc0nFeatureValue(replacer, f, realizer);
-					keep = items.contains(owner);
-				} else {
-					MethodElement item = ConfigurationHelper.calc01FeatureValue(replacer, f, realizer);
-					keep = (item == owner);
-				}
-			}
-			
-			// if the value's feature to this element is to-one, 
-			// then this value's feature value should be the element,
-			// otherwise drop the value
-			// for example, 
-			// T1 -> R1 (primary performaer)
-			// T2 -> R2
-			// T2 contributes to T1
-			// since T1 already has R1, so R2 is droped
-			// so when calculating R2's performing tasks, T1 should not be included
-			if ( keep ) {
-				MethodElement ve = ConfigurationHelper.getCalculatedElement(e, realizer);
-				if ( ve != null ) {
-					
-					// check if this is a to-one feature, currently only Task->Primary Role and TD -> Primary RD
-					EStructuralFeature f1 = ConfigurationHelper.get01Feature(of);
-					if ( f1 != null ) {
-						MethodElement item = ConfigurationHelper.calc01FeatureValue(ve, f1, realizer);
-						
-						// if the value element's to-one feature value item is not the current element, 
-						// then the element's opposite feature value should not contain this value.
-						// say, the value element is a task and the current element is a role,
-						// then if the task's primary performer (item above) is not this role (the current element), 
-						// then the role's performing tasks (the opposite feature value) 
-						// should not contain this task (the value, ve above)
-						if ( item != element) {
-							keep = false;
-						}
-					}
-				}
-			}
-			
-			
-			if ( keep ) {
-					
-				MethodElement ce = ConfigurationHelper.getCalculatedElement(e, realizer);
-
-				// calculated element can be null if it can't show
-				if (ce != null && !values.contains(ce)) {
-					values.add(ce);
-				}
-			}
-			
-			
-			// if the element e has extenders and the extender's feature is the owner element, 
-			// then we also need to include the extender
-			processExtenders(e, f);
-		}	
-	}
-	
-	private void processExtenders(MethodElement e, EStructuralFeature f) {
-		if ( !(e instanceof VariabilityElement) ) {
-			return;
-		}
-		
-		VariabilityElement ve = (VariabilityElement)e;
-		
-		List items = ConfigurationHelper.getExtenders( ve, realizer.getConfiguration());
-		if ( items.size() > 0 ) {		
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				MethodElement me = (MethodElement) it.next();
-				boolean keep = false;
-				if ( f.isMany() ) {
-					List vx = ConfigurationHelper.calc0nFeatureValue(me, f, realizer);
-					// if the value contains the owner element, then include it
-					keep = (vx != null) && vx.contains(super.element);
-				} else {
-					MethodElement v = ConfigurationHelper.calc01FeatureValue(me, f, realizer);
-					
-					// if the feature value is the owner element, then this value should be included
-					keep = (v == super.element);
-				}
-				
-				if (keep && !super.values.contains(me) ) {
-					super.values.add(me);
-					processExtenders(me, f);
-				}
-			}
-		}
-		
-		// if the element is a contributor or replacer, also need to check the extenders of the base element
-		if ( ConfigurationHelper.isContributor(ve) || ConfigurationHelper.isReplacer(ve) ) {
-			processExtenders(ve.getVariabilityBasedOnElement(), f);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToOneFeatureValue.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToOneFeatureValue.java
deleted file mode 100644
index 3dacf08..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToOneFeatureValue.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * realized feature value for a to-one feature
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ToOneFeatureValue extends FeatureValue {
-
-	// map of element and the value
-	LinkedHashMap valueMap = new LinkedHashMap();
-
-	/**
-	 * construct the object for a to-one feature value
-	 * @param element
-	 * @param ownerElement
-	 * @param feature
-	 * @param realizer
-	 */
-	public ToOneFeatureValue(MethodElement element, MethodElement ownerElement, Object feature, ElementRealizer realizer) {
-		super(element, ownerElement, feature, realizer);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.configuration.FeatureValue#add(VariabilityElement, Object)
-	 */
-	public void add(VariabilityElement owner, Object value) {
-		if ( (value == null) || !(value instanceof MethodElement) ) {	
-			return;
-		}
-		
-		// since this is a to one association, if the base of the owner already has one, 
-		// no contributing value should be added
-		// 172602 - Variability: Primary role missing in the transitive case of contributing tasks
-		if ( ConfigurationHelper.isContributor(owner) ) {
-			VariabilityElement base = owner.getVariabilityBasedOnElement();
-			if ( base != null && valueMap.containsKey(base) ) {
-				return;
-			}
-		}
-		
-		//MethodElement e = super.realizer.realize((MethodElement)value);
-		MethodElement e = ConfigurationHelper.getCalculatedElement((MethodElement)value, super.realizer);
-		
-		if ( e != null ) {
-			Object key = (owner==null) ? element : owner;
-			if ( !valueMap.containsKey(key) ) {
-				valueMap.put(key, e);
-			}
-		}			
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.configuration.FeatureValue#getValue()
-	 */
-	public Object getValue() {
-		
-		Object v = null;
-		if ( size() == 0 ) {
-			return v;
-		}
-		
-		Object[] entries = valueMap.entrySet().toArray();
-		if ( size() == 1 ) {
-			// if just one entry, return it
-			v = ((Map.Entry)entries[0]).getValue();
-		} else {
-			// if more than one entry, if the first entry is from the element itself, then return the value
-			// otherwise, return null
-			Map.Entry entry = (Map.Entry)entries[0];
-			if ( entry.getKey() == super.element ) {
-				v =  entry.getValue();
-			}
-		}
-		
-		if ( isExtendReplaceEnabled() ) {
-			if ( isBlankIndicator(v) ) {
-				// remove the _NULL_ item. that is used as an indicator to blank out the base 
-				// for the extend-replace
-				v = null;
-			}
-		}
-		
-		return v;
-	}
-
-	public int size() {
-		return valueMap.size();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToOneOppositeFeatureValue.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToOneOppositeFeatureValue.java
deleted file mode 100644
index 6f96533..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ToOneOppositeFeatureValue.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration;
-
-import java.util.Map;
-
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * realized feature value for a to-one opposite feature
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ToOneOppositeFeatureValue extends ToOneFeatureValue {
-
-	/**
-	 * constructor
-	 * 
-	 * @param element
-	 * @param feature
-	 * @param realizer
-	 */
-	public ToOneOppositeFeatureValue(MethodElement element, OppositeFeature feature, ElementRealizer realizer) {
-		super(element, null, feature, realizer);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.configuration.ToOneFeatureValue#add(VariabilityElement, Object)
-	 */
-	public void add(VariabilityElement owner, Object value) {
-		if ( (value == null) || !(value instanceof MethodElement) ) {	
-			return;
-		}
-		
-		// Replace does not completely remove outgoing
-		// associations
-		// if the opposite feature value has replacer in the
-		// configuration
-		// it's outgoing associations (i.e., this element) will be
-		// replaced by the replacing element
-		// as a result, the opposite feature value should drop the
-		// replaced element
-		//
-		// for example, R1 -> responsible for A1, R2 responsible for A2
-		// if R2 replaces R1, then R2 still responsible for A2
-		// but A1 does not have a responsible role (not R2)
-		// so for A1's responsible role opposite feature,
-		// the value R1 should be dropped instead of realize to R2
-		// Jinhua Xi, 10/27/2005
-		MethodElement e = (MethodElement) value;
-		boolean isValueReplaced = (e instanceof VariabilityElement)
-				&& (ConfigurationHelper.getReplacer((VariabilityElement) e, realizer.getConfiguration()) != null);
-		if (!isValueReplaced) {
-			// contributor can't contribute 0..1 reference if base
-			// already has one,
-			// or if more than one contributor has the value.
-			// for example, if the base task has no discipline, and only
-			// one of it's contributors has discipline,
-			// then that contributor's discipline will be used,
-			// otherwise, no discipline
-
-			// right now, we can't determine if there is more then one
-			// contributors has the value
-			// so we ignore contributor's 01 imcoming value
-			
-			// (Submit): Inability to add responsible for relationship to a work product
-			// need to fix this issue. always take the first one.
-			e = ConfigurationHelper.getCalculatedElement(e, realizer);
-			if ( e != null ) {
-				Object key = (owner==null) ? element : owner;
-				if ( !valueMap.containsKey(key) ) {
-					valueMap.put(key, e);
-				}
-			}		
-		}
-		
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.configuration.FeatureValue#getValue()
-	 */
-	public Object getValue() {
-		
-		Object v = null;
-		
-		if ( size() == 0 ) {
-			return v;
-		}
-		
-		Object[] entries = valueMap.entrySet().toArray();
-		if ( size() == 1 ) {
-			// if just one entry, return it
-			v = ((Map.Entry)entries[0]).getValue();
-		} else {
-			// if more than one entry, if the first entry is from the element itself, then return the value
-			// otherwise, return null
-			Map.Entry entry = (Map.Entry)entries[0];
-			if ( entry.getKey() == super.element ) {
-				v = entry.getValue();
-			}
-		}
-		
-		if ( isExtendReplaceEnabled() ) {
-			if ( isBlankIndicator(v) ) {
-				// remove the _NULL_ item. that is used as an indicator to blank out the base 
-				// for the extend-replace
-				v = null;
-			}
-		}
-		
-		return v;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ClosureListener.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ClosureListener.java
deleted file mode 100644
index 7186ad9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ClosureListener.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.EventListener;
-
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-/**
- *  Base class for listeners that listen to a ConfigurationClosure for errors
- * @author Jeff Hardy
- *
- */
-public abstract class ClosureListener implements EventListener {
-
-	// error removed
-	public static final int ERROR_REMOVED = 0;
-	
-	// error added
-	public static final int ERROR_ADDED = 1;
-
-	// error changed
-	public static final int ERROR_UPDATED = 2;
-
-	public abstract void errorRemoved(MethodConfiguration config, IConfigurationError error);
-
-	public abstract void errorAdded(MethodConfiguration config, IConfigurationError error);
-
-	public abstract void errorUpdated(MethodConfiguration config, IConfigurationError error);
-	
-	public void fireEvent(int type, final MethodConfiguration config, final IConfigurationError error) {
-		switch (type) {
-			case ERROR_REMOVED:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						errorRemoved(config, error);
-					}
-				});
-				break;
-			case ERROR_ADDED:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						errorAdded(config, error);
-					}
-				});
-				break;
-			case ERROR_UPDATED:
-				SafeUpdateController.syncExec(new Runnable() {
-					public void run() {
-						errorUpdated(config, error);
-					}
-				});
-				break;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ConfigurationClosure.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ConfigurationClosure.java
deleted file mode 100644
index 31bf70d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ConfigurationClosure.java
+++ /dev/null
@@ -1,1064 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.epf.library.IConfigurationClosure;
-import org.eclipse.epf.library.IConfigurationManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * A method configuration closure.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationClosure implements IConfigurationClosure {
-
-	// If true, generate debug traces.
-	protected static boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	protected MethodConfiguration config = null;
-
-	protected MethodLibrary library = null;
-
-	protected IConfigurationManager configManager = null;
-
-	protected DependencyManager dependencyManager = null;
-	
-	protected IActionManager actionMgr;
-
-	// Node change information. The object are the model objects
-	// check the linked objects in needed
-	protected List selectedNotes = new ArrayList();
-	
-	private List<ElementError> errors = new ArrayList<ElementError>();
-	
-	// A map of invalid nodes to ElementDependencyError objects.
-	protected Map<Object, ElementDependencyError> invalidNodesMap =
-		new HashMap<Object, ElementDependencyError>();
-
-	//protected List changedNodes = new ArrayList();
-	
-	private List<ClosureListener> listeners;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param actionMgr
-	 * 			  The IActionManager to use to change the MethodConfiguration.  If null, config will be changed directly.
-	 * @param config
-	 *            A method configuration.
-	 */
-	public ConfigurationClosure(IActionManager actionMgr, MethodConfiguration config) {
-		this.config = config;
-		this.actionMgr = actionMgr;
-
-		configManager = LibraryService.getInstance().getConfigurationManager(
-				config);
-		if (configManager != null) {
-			library = configManager.getMethodLibrary();
-			dependencyManager = configManager.getDependencyManager();
-		}
-
-		// configuration changed, re-build the analyze the configuration for errors
-		checkError();
-	}
-
-	/**
-	 * Returns the method configuration manager.
-	 * 
-	 * @return A <code>ConfigurationManager</code>.
-	 */
-	public IConfigurationManager getConfigurationManager() {
-		return configManager;
-	}
-
-	/**
-	 * Returns the method configuration.
-	 * 
-	 * @return A <code>MethodConfiguration</code>.
-	 */
-	public MethodConfiguration getConfiguration() {
-		return config;
-	}
-
-	/**
-	 * Returns the containining method library.
-	 * 
-	 * @return A <code>MethodConfiguration</code>.
-	 */
-	public MethodLibrary getLibrary() {
-		return library;
-	}
-
-//	/**
-//	 * Sets the method plug-ins and packages selection.
-//	 * 
-//	 * @param elements
-//	 *            an array of method plug-ins and packages
-//	 */
-//	public void setSelections(Object[] elements) {
-//		
-//		if ( elements == null ) {
-//			return;
-//		}
-//		
-//		// clear the old selections
-//		selectedNotes.clear();
-//		for (int i = 0; i < elements.length; i++ ) {
-//			selectedNotes.add(elements[i]);
-//		}
-//	}
-
-	
-	/**
-	 * Builds the selection list based on the method configuration.
-	 * 
-	 */
-	public void checkError() {
-		
-		// Bug 206724 - SCM: Always prompt check out elements for a opened configuration when refresh source control status
-		// don't need to validate the configuration, rely on the caller to validate it before call this method.
-		// Validate the method configuration with the action manager.
-		//LibraryUtil.validateMethodConfiguration(actionMgr, config);
-
-		// initial fill the selections
-		selectedNotes.clear();
-		selectedNotes.addAll(config.getMethodPluginSelection());
-		selectedNotes.addAll(config.getMethodPackageSelection());
-
-		// Re-build the selections to auto add the process packages.
-		clearErrorMarks();
-		
-		// Cleanup the old status and rebuild the list.
-		invalidNodesMap.clear();
-
-		processChangedNodes(getSelection());
-
-	}
-
-	private void clearErrorMarks() {
-		// Re-build the selections to auto add the process packages.
-
-		for (Iterator<ElementError> it = errors.iterator(); it.hasNext(); ) {
-			ElementError error = it.next();
-			notifyError(error, ClosureListener.ERROR_REMOVED);
-		}	
-	}
-	
-//	private void selectProcessPackages(Activity a) {
-//		if (a == null) {
-//			return;
-//		}
-//
-//		for (Iterator it = a.getBreakdownElements().iterator(); it.hasNext();) {
-//			BreakdownElement e = (BreakdownElement) it.next();
-//			Object pkg = e.eContainer();
-//			if (!selectedNotes.contains(pkg)) {
-//				selectedNotes.add(pkg);
-//				changedNodes.add(pkg);
-//			}
-//
-//			if (e instanceof Activity) {
-//				selectProcessPackages((Activity) e);
-//			}
-//		}
-//	}
-
-//	/**
-//	 * Adds a method plug-in or package to the closure.
-//	 * 
-//	 * @param element
-//	 *            A method element.
-//	 * @param addChildren
-//	 *            if <code>true</code>, add all child method elements.
-//	 */
-//	private void add(EObject element, boolean addChildren) {
-//		if (!LibraryUtil.selectable(element)) {
-//			return;
-//		}
-//
-//		if (!selectedNotes.contains(element)) {
-//			selectedNotes.add(element);
-//
-//			// Save the changed nodes so that we can update the status later.
-//			addChanged(element);
-//
-//			if (element instanceof MethodPlugin) {
-//				selectSystemPackages((MethodPlugin) element);
-//			}
-//		}
-//
-//		// Add the parent method element as well.
-//		EObject parent = element.eContainer();
-//		if ((parent != null) && !selectedNotes.contains(parent)) {
-//			add(parent, false);
-//		}
-//
-//		// Add children as needed.
-//		if (addChildren) {
-//			EList elements = element.eContents();
-//			if (elements != null) {
-//				for (Iterator it = elements.iterator(); it.hasNext();) {
-//					EObject child = (EObject) it.next();
-//					add(child, true);
-//				}
-//			}
-//		}
-//	}
-//
-//	private void addChanged(Object element) {
-//		if (!changedNodes.contains(element)) {
-//			changedNodes.add(element);
-//		}
-//	}
-
-//	private void selectSystemPackages(MethodPlugin plugin) {
-//		List pkgs = TngUtil.getAllSystemPackages(plugin);
-//		for (Iterator it = pkgs.iterator(); it.hasNext();) {
-//			EObject pkg = (EObject) it.next();
-//			add(pkg, false);
-//		}
-//	}
-
-	/**
-	 * Checks whether a method plug-in or package is selected.
-	 * 
-	 * @return <code>true</code> if the given element is selected.
-	 */
-	public boolean isSelected(Object input) {
-		if ((input instanceof MethodLibrary) || input == config
-				|| selectedNotes.contains(input)) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Gets the element dependency error for a method element.
-	 * 
-	 * @element A method element.
-	 * 
-	 * @return An <code>ElementDependencyError</code>.
-	 */
-	public ElementDependencyError getError(Object element) {
-		return getError(element, false);
-	}
-
-	private ElementDependencyError getError(Object element, boolean create) {
-		ElementDependencyError error = (ElementDependencyError) invalidNodesMap
-				.get(element);
-		if (error == null && create) {
-			error = new ElementDependencyError(element);
-			invalidNodesMap.put(element, error);
-		}
-		return error;
-	}
-
-	/**
-	 * check if there is error in this configuration closure
-	 * 
-	 * @return boolean
-	 */
-	public boolean hasError() {
-		for (Iterator it = invalidNodesMap.values().iterator(); it.hasNext();) {
-			ElementDependencyError error = (ElementDependencyError) it.next();
-			if (error.isError()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * check if there is any problem (error/warning) with this configuration closure.
-	 * @return boolean
-	 */
-	public boolean hasProblem() {
-		return invalidNodesMap.size() > 0;
-	}
-
-	/**
-	 * Returns all the errors.
-	 * 
-	 * @return A a list of <code>PackageError</code>.
-	 */
-	public List<PackageError> getAllErrors() {
-		List<PackageError> errors = new ArrayList<PackageError>();
-		for (Iterator it = invalidNodesMap.values().iterator(); it.hasNext();) {
-			ElementDependencyError error = (ElementDependencyError) it.next();
-			errors.addAll(error.getAll());
-		}
-		return errors;
-	}
-
-	/**
-	 * Returns all the dependency errors.
-	 * 
-	 * @return An array of <code>ElementDependencyError</code>
-	 */
-	public Object[] getDependencyErrors() {
-		return invalidNodesMap.values().toArray();
-	}
-
-	/**
-	 * Returns all the invalid elements.
-	 * 
-	 * @return A list of invalid elements.
-	 */
-	public List getInvalidElements() {
-		return new ArrayList(invalidNodesMap.keySet());
-	}
-
-	private void removeError(Object element) {
-		if (invalidNodesMap.containsKey(element)) {
-			invalidNodesMap.remove(element);
-
-//			// Error status changed, add it to the changed list.
-//			if (!changedNodes.contains(element)) {
-//				changedNodes.add(element);
-//			}
-		}
-	}
-
-//	/**
-//	 * Returns all the changed elements. These are elements whose check states
-//	 * have changed or whose image have changed due to error.
-//	 * 
-//	 * @return A list of changed method elements.
-//	 */
-//	public List getChangedElements() {
-//		List items = new ArrayList(changedNodes);
-//		for (Iterator it = invalidNodesMap.keySet().iterator(); it.hasNext();) {
-//			Object item = it.next();
-//			if (!items.contains(item)) {
-//				items.add(item);
-//			}
-//		}
-//		return items;
-//	}
-
-	/**
-	 * Returns the method plug-ins and packages selection.
-	 * 
-	 * @return An array of method plug-ins and packages.
-	 */
-	public Object[] getSelection() {
-		return selectedNotes.toArray();
-	}
-
-	private void processChangedNodes(Object[] changedNodes) {
-		
-		// for all the changed notes,
-		// all all contained elements and check if the elements are in config or not
-		// if the elements are in config, the referenced elements should also be in config
-		
-		for (int i = 0; i <changedNodes.length; i++) {
-			
-			// the elements are either plugin or package
-			Object changedElement = changedNodes[i];
-			PackageDependency dependency = dependencyManager
-					.getDependency((MethodElement) changedElement);
-			if (dependency == null) {
-				continue;
-			}
-
-			List refs = dependency.getAllElementReferences();
-			if ( refs == null || refs.size() == 0 ) {
-				continue;
-			}
-			
-			for (Iterator itr = refs.iterator(); itr.hasNext(); ) {
-				ElementReference ref = (ElementReference)itr.next();
-				checkReference(ref);
-			}
-		}
-		
-		// for all the elements in the added category, check their references as well
-		for ( Iterator<MethodElement> it = configManager.getConfigurationData()
-				.getAddedElements().iterator(); it.hasNext(); ) {
-			MethodElement e = it.next();
-			
-			PackageDependency dependency = 
-				dependencyManager.getDependency((MethodElement)e.eContainer());
-			if (dependency == null) {
-				continue;
-			}
-		
-			List refs = dependency.getAllElementReferences();
-			if ( refs == null || refs.size() == 0 ) {
-				continue;
-			}
-			
-			for (Iterator itr = refs.iterator(); itr.hasNext(); ) {
-				ElementReference ref = (ElementReference)itr.next();
-				if ( ref.getElement() == e ) {
-					checkReference(ref);
-				}
-			}
-	
-		}
-		
-	}
-	
-	private void checkReference(ElementReference ref) {
-		MethodElement e = ref.getElement();
-		MethodElement e_ref = ref.getRefElement();
-		
-		if ( e instanceof MethodPackage || e instanceof MethodConfiguration ) {
-			return;
-		}
-		
-		// Bug 207609 - Replaced elements are not considered for configuration error "missing mandatory input"
-		// if the element is replaced, ignore the reference
-		if ( e instanceof VariabilityElement ) {
-			VariabilityElement replacer = ConfigurationHelper.getReplacer((VariabilityElement)e, config);
-			if ( replacer != null ) {
-				return;
-			}
-		}
-		
-		// the element might be subtracted, so ignore it
-		if ( !ConfigurationHelper.inConfig(e, config, true, false)) {
-			return;
-		}
-				
-		// if the referenced element is not in  config, log error
-		if ( !ConfigurationHelper.inConfig(e_ref, config)) {
-			
-			/*
-			String message = LibraryResources.bind(LibraryResources.ElementError_missing_element, 
-					(new String[] {LibraryUtil.getTypeName(e), 
-							LibraryUtil.getTypeName(e_ref) }));
-			
-			ElementError error = new ElementError(
-					this, ErrorInfo.WARNING,
-					message, e, e_ref, ErrorInfo.REFERENCE_TO); //$NON-NLS-1$
-			*/
-			ElementError error = ConfigurationErrorMatrix.getError(config, ref);
-			if ( error == null ) {
-				return;
-			}
-			
-			errors.add(error);
-			notifyError(error, ClosureListener.ERROR_ADDED);
-			
-			// process package error
-			processPackageError(LibraryUtil.getSelectable(e), LibraryUtil.getSelectable(e_ref), error.getErrorLevel() );
-		}	
-	}
-	
-	private void processPackageError(Object pkg, Object pkg_ref, int errorLevel ) {
-		if ( errorLevel > 0 ) {
-			ElementDependencyError error = getError(pkg, true);
-			
-			PackageError pkgerror = error.getError(pkg_ref);
-			if ( pkgerror == null ) {
-				String message = LibraryResources.configClosureWarning_msg1;
-	
-				pkgerror =  new PackageError(errorLevel, message, 
-						pkg, pkg_ref, ErrorInfo.REFERENCE_TO);				
-				error.addError(pkgerror);
-				
-			} else {
-				pkgerror.setErrorLevel(errorLevel);
-				
-				// need to recalc the error bits
-				error.calculateErrorBits();
-			}
-		} else {
-			// remove the error
-			removeError(pkg);
-		}
-		
-		updateParentsForErrors((EObject)pkg);
-
-	}
-	
-	private void notifyError(ElementError error, int type ) {
-		
-		if ( error == null || listeners == null || listeners.size() == 0 ) {
-			return;
-		}
-		
-		try {
-							
-			for (Iterator<ClosureListener> iter = listeners.iterator();iter.hasNext();) {
-				ClosureListener listener = iter.next();
-				
-				listener.fireEvent(type, config, error);
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-	
-	
-//	/**
-//	 * Validates the element dependency when the element is selected. When the
-//	 * element is selected, we need to do the following: 1. Check error for
-//	 * references 2. Remove error for dependents associated with element 3.
-//	 * Update parents: if the selection is valid, remove all errors from parents
-//	 * associated with this element if the selection is invalid, set error to
-//	 * all parents.
-//	 * 
-//	 * @param dependency
-//	 *            ElementDependency
-//	 */
-//	private void validateSelected(PackageDependency dependency) {
-//		Object changedElement = dependency.getElement();
-//
-//		// Since this element is selected, remove all previous errors.
-//		removeError(changedElement);
-//
-//		if (changedElement instanceof MethodLibrary) {
-//			return;
-//		}
-//
-//		// Since this element is selected, check all dependency errors in the
-//		// dependent elements.
-//		List dependents = dependency.getDependents();
-//		if (dependents != null && dependents.size() > 0) {
-//			Object element;
-//			for (Iterator itr = dependents.iterator(); itr.hasNext();) {
-//				element = itr.next();
-//
-//				ElementDependencyError error = getError(element, false);
-//				if (error != null) {
-//					PackageError pkgerror = error.removeError(changedElement);
-//					if (error.size() == 0) {
-//						removeError(element);
-//
-//						// Clear the parent error introduced by this element.
-//						updateParentsForErrors((EObject) element);
-//					}
-//					
-//					// notify the error listener about the error removed
-//					notifyErrorRemoved(pkgerror);
-//
-//				}
-//			}
-//		}
-//
-//		// If an element is checked, check the element it depends on,
-//		// which should be checked as well.
-//		List refs = dependency.getReferences();
-//		if (refs != null && refs.size() > 0) {
-//			PackageReference ref;
-//			Object element;
-//			for (Iterator itr = refs.iterator(); itr.hasNext();) {
-//				ref = (PackageReference) itr.next();
-//				element = ref.getRefElement();
-//
-//				if (element instanceof MethodLibrary) {
-//					continue;
-//				}
-//
-//				// Don't warn on optional inputs not being
-//				// present, so added the canIgnore() method
-//				if (!isSelected(element) && !canIgnore(ref)) {
-//					String message;
-//					int errorType = 0;
-//					if (ref.hasBaseReference()) {
-//						errorType = ErrorInfo.ERROR;
-//						message = LibraryResources.configClosureWarning_msg2;
-//					} else {
-//						errorType = ErrorInfo.WARNING;
-//						message = LibraryResources.configClosureWarning_msg3;
-//					}
-//
-//					ElementDependencyError error = getError(changedElement,
-//							true);
-//					
-//					PackageError pkgerror =  new PackageError(this, errorType, message,
-//							changedElement, element, ErrorInfo.REFERENCE_TO);				
-//					error.addError(pkgerror);
-//
-//					// notify the error listener about the error added
-//					notifyErrorAdded(pkgerror);
-//
-//				} else {
-//					ElementDependencyError error = getError(changedElement,
-//							false);
-//					if (error != null) {
-//						PackageError pkgerror = error.removeError(element);
-//						
-//						// notify the error listener about the error removed
-//						notifyErrorRemoved(pkgerror);
-//
-//					}
-//				}
-//			}
-//		}
-//
-//		// Finally, update the parents.
-//		updateParentsForErrors((EObject) changedElement);
-//	}
-//
-//	/**
-//	 * Validates the ElementDependency when the element is unselected. When the
-//	 * element is unselected, we need to do the following: 1. check error for
-//	 * dependencts 2. remove error for references associated with element, in
-//	 * case of any added when the element was check 3. update parents: if the
-//	 * selection is valid, remove all errors from parents associated with this
-//	 * element if the selection is invalid, set error to all parents.
-//	 * 
-//	 * @param dependency
-//	 *            A <code>ElementDependency</code> object.
-//	 */
-//	private void validateUnSelected(PackageDependency dependency) {
-//		Object changedElement = dependency.getElement();
-//
-//		// Since this element is un-selected, remove all previous errors.
-//		removeError(changedElement);
-//
-//		if (changedElement instanceof MethodLibrary) {
-//			return;
-//		}
-//
-//		// Since this element is un-selected, remove all errors in the
-//		// referenced elements.
-//		List refs = dependency.getReferences();
-//		if (refs != null && refs.size() > 0) {
-//			ElementReference ref;
-//			Object element;
-//			for (Iterator itr = refs.iterator(); itr.hasNext();) {
-//				ref = (ElementReference) itr.next();
-//				element = ref.getRefElement();
-//
-//				ElementDependencyError error = getError(element, false);
-//				if (error != null) {
-//					PackageError pkgerror = error.removeError(changedElement);
-//					if (error.size() == 0) {
-//						removeError(element);
-//
-//						// Clear the parent error introduced by this element.
-//						updateParentsForErrors((EObject) element);
-//
-//					}
-//					
-//					// notify the error listener about the error removed
-//					notifyErrorRemoved(pkgerror);
-//
-//				}
-//			}
-//		}
-//
-//		// If an element is unchecked, check the dependent elements.
-//		// If there are check elements depending on it, the element can't be
-//		// unchecked.
-//		List dependents = dependency.getDependents();
-//		if (dependents != null && dependents.size() > 0) {
-//			Object element;
-//			for (Iterator itr = dependents.iterator(); itr.hasNext();) {
-//				element = itr.next();
-//
-//				if (element instanceof MethodLibrary) {
-//					continue;
-//				}
-//
-//				if (isSelected(element)) {
-//					// Determine the type of dependency.
-//					PackageDependency childDep = dependencyManager
-//							.getDependency((MethodElement) element);
-//
-//					validateSelected(childDep);
-//				} else {
-//					removeError(changedElement);
-//				}
-//			}
-//		}
-//
-//		// finally, update the parents
-//		updateParentsForErrors((EObject) changedElement);
-//	}
-//
-	private void updateParentError(EObject parent, EObject element,
-			int errorType) {
-		if (parent == null || (parent instanceof MethodLibrary)) {
-			return;
-		}
-
-//		if ((parent instanceof MethodPackage)
-//				&& ConfigurationHelper.isGlobalPackage((MethodPackage) parent)) {
-//			updateParentError(parent.eContainer(), element, errorType);
-//			return;
-//		}
-
-		// Remove the error associated with this element from all parents.
-		ElementDependencyError error = getError(parent, false);
-		if (error != null && error.size() > 0) {
-			error.removeError(element);
-		}
-
-		if (errorType != ErrorInfo.NONE) {
-			// Propegate the error to all parents.
-			error = getError(parent, true);
-			String message = LibraryResources.configClosureWarning_msg1;
-			PackageError pkgerr = new PackageError(errorType, message, parent, element,
-					ErrorInfo.NONE);
-			error.addError(pkgerr);
-		} else if ((error != null) && (error.size() == 0)) {
-			removeError(parent);
-		}
-
-		updateParentError(parent.eContainer(), element, errorType);
-	}
-
-	private void updateParentsForErrors(EObject element) {
-		int errorType = ErrorInfo.NONE;
-
-		ElementDependencyError error = getError(element);
-		if (error != null && error.size() > 0) {
-			if (error.isError() || error.isChildError()) {
-				errorType = PackageError.CHILD_ERROR;
-			} else if (error.isWarning() || error.isChildWarning()) {
-				errorType = PackageError.CHILD_WARNING;
-			}
-		}
-
-		updateParentError(element.eContainer(), element, errorType);
-	}
-
-	/**
-	 * accept the cutrrent selection, fix the errors and ignore any warning message.
-	 * 
-	 */
-	public void fixErrors() {
-		boolean changed = true;
-		boolean forceCheck = true;
-		while (changed) {
-			changed = fixProblems(true, forceCheck);
-			forceCheck = false;
-		}
-	}
-
-	/**
-	 * fix all error(s) and warnign(s)
-	 * 
-	 */
-	public void fixProblems() {
-		boolean changed = true;
-		boolean forceCheck = true;
-		while (changed) {
-			changed = fixProblems(false, forceCheck);
-			forceCheck = false;
-		}
-	}
-
-	private boolean fixProblems(boolean errorOnly, boolean forceCheck) {
-		// Note: make closure will select elements as needed.
-		// so we need to make a copy of the current selcted ones
-		// in order to trace the status
-		//List currentSelected = new ArrayList(selectedNotes);
-
-		// if force check is set, run check anyway
-		boolean changed = forceCheck;
-
-		// list of errorInfo objects
-		List errors = getAllErrors();
-		if (errors.size() > 0) {			
-			invalidNodesMap.clear();
-			PackageError error;
-			EObject causeElement;
-			//boolean ownerSelected, causeSelected;
-			for (Iterator it = errors.iterator(); it.hasNext();) {
-				error = (PackageError) it.next();
-
-				//ownerElement = (EObject) error.getOwnerElement();
-				causeElement = (EObject) error.getCauseElement();
-				//addChanged(ownerElement);
-				//addChanged(causeElement);
-//				if (error.isChildError() || error.isChildWarning()) {
-//					continue;
-//				}
-
-				boolean isError = error.isError();
-				boolean isWarning = error.isWarning();
-				if (!isError && !isWarning || !isError && errorOnly) {
-					continue;
-				}
-			
-				if ( !isSelected(causeElement) && selectErrorElement(causeElement) ) {
-					changed = true;
-				}
-			}
-		}
-
-		if ( changed ) {
-			checkError();
-		}
-		
-		return changed;
-	}
-
-	private boolean selectErrorElement(EObject element) {
-
-		boolean selected = true;
-		if (element instanceof MethodPlugin 
-				&& !config.getMethodPluginSelection().contains(element)) {
-			config.getMethodPluginSelection().add(element);
-		} else if ( element instanceof MethodPackage 
-				&& !config.getMethodPackageSelection().contains(element)){
-			config.getMethodPackageSelection().add(element);
-		} else {
-			selected = false;
-		}
-		
-		return selected;
-	}
-
-//	/**
-//	 * update the method configuration in the library with the current selections
-//	 */
-//	public void saveMethodConfiguration() {
-//		List plugins = config.getMethodPluginSelection();
-//		List packages = config.getMethodPackageSelection();
-//
-//		plugins.clear();
-//		packages.clear();
-//
-//		EObject element;
-//		for (Iterator it = selectedNotes.iterator(); it.hasNext();) {
-//			element = (EObject) it.next();
-//			if (element instanceof MethodPlugin) {
-//				if (!plugins.contains(element)) {
-//					plugins.add(element);
-//				}
-//			} else if ((element instanceof MethodPackage)
-//					&& !ConfigurationHelper
-//							.isGlobalPackage((MethodPackage) element)) {
-//				if (!packages.contains(element)) {
-//					packages.add(element);
-//				}
-//			}
-//		}
-//	}
-
-	/**
-	 * Packages the library based on the selection.
-	 * <p>
-	 * Note: This will change the current library. Before calling this method, a
-	 * copy of the current library should be created with the following steps:
-	 * 1. Create a new <code>ConfigurationManager</code> with a copy of the
-	 * original library, 2. Rebuild the dependency, 3. Create a
-	 * <code>ConfigurationClosure</code> with the current configuration.
-	 * 
-	 * @return A <code>MethodLibrary</code>.
-	 */
-	public MethodLibrary packageLibrary(boolean removeBrokenReferences) {
-		processSelection(library, removeBrokenReferences);
-
-		// Remove the configurations except for the current one.
-		List configs = library.getPredefinedConfigurations();
-		configs.clear();
-		configs.add(config);
-
-		return library;
-	}
-
-	/**
-	 * process the selected package by removeing all unselected elements and any
-	 * missing references
-	 * 
-	 * @param element
-	 */
-	private void processSelection(EObject element,
-			boolean removeBrokenReferences) {
-		if (removeBrokenReferences) {
-			// Iterator the references and remove broken references.
-			EList references = element.eCrossReferences();
-			if (references != null) {
-				for (Iterator it = new ArrayList(references).iterator(); it
-						.hasNext();) {
-					EObject ref = (EObject) it.next();
-					EObject pkgRef = LibraryUtil.getSelectable(ref);
-					if (pkgRef != null && !isSelected(pkgRef)) {
-						removeReference(element, ref);
-					}
-				}
-			}
-		}
-
-		EList elements = element.eContents();
-		if (elements != null) {
-			for (Iterator it = new ArrayList(elements).iterator(); it.hasNext();) {
-				EObject child = (EObject) it.next();
-
-				// If the child element is selectable but it is not in the
-				// configuration, remove it.
-				if (LibraryUtil.selectable(child) && !isSelected(child)) {
-					EcoreUtil.remove(child);
-				} else {
-					processSelection(child, removeBrokenReferences);
-				}
-			}
-		}
-	}
-
-	private void removeReference(EObject ownerElement, EObject refElement) {
-		AdapterFactoryContentProvider provider = configManager
-				.getContentProvider();
-		IPropertySource ps = provider.getPropertySource(ownerElement);
-		IPropertyDescriptor[] pds = ps.getPropertyDescriptors();
-		if (pds != null && pds.length > 0) {
-			for (int i = 0; i < pds.length; i++) {
-				IPropertyDescriptor descriptor = (IPropertyDescriptor) pds[i];
-				Object id = descriptor.getId();
-				Object value = ps.getPropertyValue(id);
-
-				// Check whether the value needs to be converted to an editable
-				// value.
-				IPropertySource source = provider.getPropertySource(value);
-				if (source != null) {
-					value = source.getEditableValue();
-				}
-				if (value instanceof EList) {
-					EList refList = (EList) value;
-					if (refList.contains(refElement)) {
-						if (debug) {
-							System.out
-									.println("Reference [" + LibraryUtil.getName(refElement) //$NON-NLS-1$
-											+ "] removed from [" //$NON-NLS-1$
-											+ LibraryUtil.getName(ownerElement)
-											+ "]'s reference list"); //$NON-NLS-1$
-						}
-						refList.remove(refElement);
-						ps.setPropertyValue(id, refList);
-					}
-				} else if (value instanceof MethodElement) {
-					if (debug) {
-						System.out
-								.println("Reference [" + LibraryUtil.getName(refElement) //$NON-NLS-1$
-										+ "] removed from [" //$NON-NLS-1$
-										+ LibraryUtil.getName(ownerElement)
-										+ "]"); //$NON-NLS-1$
-					}
-					ps.setPropertyValue(id, null);
-				}
-
-			}
-		}
-	}
-
-	/**
-	 * Disposes resources allocated by this closure.
-	 */
-	public void dispose() {
-		
-		clearErrorMarks();
-		
-		configManager = null;
-		config = null;
-		library = null;
-		dependencyManager = null;
-		actionMgr = null;
-		//selectedNotes.clear();
-		//changedNodes.clear();
-		if (invalidNodesMap != null) {
-			invalidNodesMap.clear();
-		}
-		if (listeners != null) {
-			listeners.clear();
-		}
-	}
-
-//	private boolean canIgnore(PackageReference pkgRef) {
-//		return pkgRef.canIgnore();
-//	}
-
-	public void addListener(ClosureListener listener) {
-		if (listeners == null) {
-			listeners = new ArrayList<ClosureListener>();
-		}
-		if (!listeners.contains(listener)) {
-			listeners.add(listener);
-		}
-		
-		notifyListener(listener, this.errors);
-	}
-	
-	public void removeListener(ClosureListener listener) {
-		if (listeners != null) {
-			if (listeners.contains(listener)) {
-				listeners.remove(listener);
-			}
-		}
-	}
-	
-//	private void notifyErrorAdded(PackageError pkgerror) {
-//			//notifyListeners(ClosureListener.ERROR_ADDED, pkgerror);
-//	}
-//	
-//	private void notifyErrorRemoved(PackageError pkgerror) {
-//		//notifyListeners(ClosureListener.ERROR_REMOVED, pkgerror);	
-//	}
-	
-	private void notifyListener(ClosureListener listener, List errors) {
-									
-		for ( Iterator it = errors.iterator(); it.hasNext(); ) {
-			ElementError error = (ElementError)it.next();
-			listener.fireEvent(ClosureListener.ERROR_ADDED, config, error);
-		}
-	}
-	
-//	/**
-//	 * add this element into the configuration
-//	 * this is for quick fix action
-//	 * our default implementation is to select the owning package
-//	 * @param element
-//	 * @return IStatus
-//	 */
-//	public IStatus selectElement(MethodElement element) {
-//		
-//		//if the element is subtracted, we can't select the element
-//		// return an error
-//		if ( configManager.getConfigurationData().isElementInSubtractedCategory(element)) {
-//			String message = LibraryResources.bind(LibraryResources.QuickfixError_reason1, 
-//					(new String[] {LibraryUtil.getTypeName(element)}));
-//			return new Status(IStatus.ERROR,
-//					LibraryPlugin.getDefault().getId(), IStatus.OK, message, null);
-//		}
-//		
-//		// for quick fix, we just select the package of the element 
-//		// and the child packages
-//		Object owner = LibraryUtil.getSelectable(element);
-//		if ( owner != null && owner instanceof MethodPackage) {
-//			config.getMethodPackageSelection().add(owner);
-//		}	
-//		
-//		return Status.OK_STATUS;
-//	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ConfigurationErrorMatrix.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ConfigurationErrorMatrix.java
deleted file mode 100644
index 8dbad1c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ConfigurationErrorMatrix.java
+++ /dev/null
@@ -1,134 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * define the configuration error level metrix
- * 
- * @author Jinhua Xi
- * @since 1.2
- *
- */
-public class ConfigurationErrorMatrix {
-	
-//	private static List level1Features = new ArrayList();
-//	private static List level2Features = new ArrayList();
-//	private static List level3Features = new ArrayList();
-//	static {
-//		level2Features.add(UmaPackage.eINSTANCE.getTask_PerformedBy());
-//	}
-	
-//	MethodConfiguration config;
-//	public ConfigurationErrorMatrix(MethodConfiguration config) {
-//		this.config = config;
-//	}
-	
-	public static ElementError getError(MethodConfiguration config, ElementReference ref) {
-		
-		if ( ref.hasFeature(UmaPackage.eINSTANCE.getVariabilityElement_VariabilityBasedOnElement()) ) {
-			return getVariabilityError(config, ref);
-		} 
-		
-		int errorLevel = ErrorInfo.INFO;
-		String messageId = LibraryResources.ElementError_missing_element;
-		
-		MethodElement e = (MethodElement)ref.getElement();
-		MethodElement e_ref = (MethodElement)ref.getRefElement();
-
-		if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_MandatoryInput()) ) {
-			errorLevel = ErrorInfo.ERROR;
-			messageId = LibraryResources.ElementError_missing_mandatory_input;
-		} else if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_Output()) ) {
-			errorLevel = ErrorInfo.ERROR;
-			messageId = LibraryResources.ElementError_missing_output;
-		} else if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_PerformedBy()) ) {
-			errorLevel = ErrorInfo.WARNING;
-			messageId = LibraryResources.ElementError_missing_primary_performer;
-		} else if ( ref.hasFeature(UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy()) 
-				|| ref.hasFeature(UmaPackage.eINSTANCE.getTask_OptionalInput())
-				|| ref.hasFeature(UmaPackage.eINSTANCE.getRole_ResponsibleFor()) 
-				|| ref.hasFeature(UmaPackage.eINSTANCE.getRole_Modifies())
-				 ) {
-			// default
-		} else if ( isBreakdownReference(e, e_ref) ) {
-			errorLevel = ErrorInfo.INFO;
-		} else if( isGuidanceReference(e, e_ref) ) {
-			// default
-		} else {
-			return null;
-		}
-
-		String message = LibraryResources.bind(messageId, 
-				(new String[] {LibraryUtil.getTypePath(e), 
-						LibraryUtil.getTypePath(e_ref) }));
-
-		return new ElementError(config, errorLevel, message, e, e_ref, ErrorInfo.REFERENCE_TO);
-	}
-	
-	private static boolean isBreakdownReference(MethodElement e, MethodElement e_ref) {
-		return (e_ref instanceof Task || e_ref instanceof Role || e_ref instanceof WorkProduct) 
-			&& (e instanceof BreakdownElement);
-	}
-	
-	private static boolean isGuidanceReference(MethodElement e, MethodElement e_ref) {
-		return (e instanceof Task || e instanceof Role || e instanceof WorkProduct) 
-			&& (e_ref instanceof Guidance);
-	}
-	
-	private static ElementError getVariabilityError(MethodConfiguration config, ElementReference ref) {
-	
-		VariabilityElement e = (VariabilityElement)ref.getElement();
-		VariabilityElement e_ref = (VariabilityElement)ref.getRefElement();
-		
-		if ( e.getVariabilityBasedOnElement() != e_ref ) {
-			return null;
-		}
-		
-		VariabilityType type = e.getVariabilityType();
-		
-		int errorLevel = ErrorInfo.WARNING;
-		String messageId = LibraryResources.ElementError_missing_element;
-
-		if ( type == VariabilityType.CONTRIBUTES_LITERAL ) {
-			if ( e instanceof ContentCategory || e instanceof Guidance ) {
-				errorLevel = ErrorInfo.INFO;
-			}
-			
-			messageId = LibraryResources.ElementError_contributor_missing_base;
-		} else if ( type == VariabilityType.EXTENDS_LITERAL ) {
-			messageId = LibraryResources.ElementError_extender_missing_base;
-			
-		} else if ( type == VariabilityType.REPLACES_LITERAL 
-				|| type == VariabilityType.EXTENDS_REPLACES_LITERAL) {
-			messageId = LibraryResources.ElementError_replacer_missing_base;
-		}
-		
-		String message = LibraryResources.bind(messageId, 
-				(new String[] {LibraryUtil.getTypePath(e), 
-						LibraryUtil.getTypePath(e_ref) }));
-
-		return new ElementError(config, errorLevel, message, e, e_ref, ErrorInfo.REFERENCE_TO);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/DependencyManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/DependencyManager.java
deleted file mode 100644
index 3a6c613..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/DependencyManager.java
+++ /dev/null
@@ -1,373 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.events.ILibraryChangeListener;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Manages the method element dependencies in a method library.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class DependencyManager {
-
-	// If true, generate debug traces.
-	protected static boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	// The method library.
-	protected MethodLibrary library;
-
-	// The library manager.
-	protected ILibraryManager libraryManager;
-
-	// A map of package elements to PackageDependency objects.
-	protected Map dependencyMap = new HashMap();
-
-	// A library change listener.
-	private ILibraryChangeListener libListener = null;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public DependencyManager(MethodLibrary library) {
-		this.library = library;
-		this.libraryManager = LibraryService.getInstance().getLibraryManager(
-				library);
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		
-		libListener = new ILibraryChangeListener() {
-			public void libraryChanged(int option, Collection changedItems) {
-//				if (option == ILibraryChangeListener.OPTION_LOADED
-//						|| option == ILibraryChangeListener.OPTION_CREATED) {
-//					// TODO: Is this necessary?
-//					// refresh();
-//				} else 
-				if (option == ILibraryChangeListener.OPTION_DELETED) {
-					handleDeletedElement(changedItems);
-				} else if (option == ILibraryChangeListener.OPTION_CHANGED
-						|| option == ILibraryChangeListener.OPTION_NEWCHILD) {
-					if (changedItems != null && changedItems.size() > 0) {
-						for (Iterator it = changedItems.iterator(); it
-								.hasNext();) {
-							try {
-								Object e = it.next();
-								if (e instanceof MethodElement) {
-									buildDependencyFor((MethodElement) e);
-								} else {
-									if (debug) {
-										System.out.println(e
-												+ " is not a method element"); //$NON-NLS-1$
-									}
-								}
-							} catch (Exception e) {
-								if (debug) {
-									e.printStackTrace();
-								}
-							}
-						}
-					}
-				}
-			}
-		};
-
-		libraryManager.addListener(libListener);
-	}
-
-	/**
-	 * Returns the package dependency for a method element.
-	 * 
-	 * @param element
-	 *            A method element.
-	 * @return A <code>PackageDependency</code>.
-	 */
-	public PackageDependency getDependency(MethodElement element) {
-		if (!LibraryUtil.selectable(element)) {
-			return null;
-		}
-
-		// Always rebuild the dependency for the element since the
-		// dependents may not be fully established.
-		PackageDependency dependency = getDependency(element, false);
-		if (dependency == null || !dependency.isLoaded()) {
-			buildDependency(element);
-		}
-
-		return getDependency(element, false);
-	}
-
-	/**
-	 * Prints the dependency information.
-	 */
-	public void printDependency() {
-		for (Iterator it = dependencyMap.values().iterator(); it.hasNext();) {
-			((PackageDependency) it.next()).print();
-		}
-	}
-
-	/**
-	 * Builds the dependency for a method element.
-	 * 
-	 * @param element
-	 *            A method element.
-	 */
-	private void buildDependency(MethodElement element) {
-		if (element == null) {
-			return;
-		}
-
-		try {
-			PackageDependency dependency = buildDependencyFor(element);
-
-			EList elements = element.eContents();
-			if (elements != null) {
-				for (Iterator it = elements.iterator(); it.hasNext();) {
-					MethodElement methodElement = (MethodElement) it.next();
-					if (methodElement != null
-							&& !LibraryUtil.selectable(methodElement)) {
-						buildDependencyFor(methodElement);
-					}
-				}
-			}
-
-			dependency.setLoaded(true);
-		} catch (Exception e) {
-			if (debug) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	/**
-	 * Builds the dependency for a method element.
-	 * <p>
-	 * This creates an <code>ElementReference</code> for the given element
-	 * that points to all the referenced elements, and adds the given element as
-	 * a dependent element to all the referenced elements. This should only be
-	 * called once for each method element.
-	 * 
-	 * @param element
-	 *            A method element.
-	 * @return A <code>PackageDependency</code>.
-	 */
-	private PackageDependency buildDependencyFor(MethodElement element) {
-		if (element == null) {
-			return null;
-		}
-
-		// Build the dependency on the selectable element/parent only
-		MethodElement selectableElement = (MethodElement)LibraryUtil.getSelectable(element);
-		if (selectableElement == null) {
-			return null;
-		}
-
-		PackageDependency dependency = getDependency(selectableElement, true);
-
-		// Remove any existing element reference for this element.
-		dependency.removeReference(element);
-/*
-		// Get the VariabilityElement.
-		ContentElement baseElement = null;
-		if (element instanceof ContentElement) {
-			baseElement = (ContentElement) ((ContentElement) element)
-					.getVariabilityBasedOnElement();
-			if (baseElement != null) {
-				// Establish the package reference.
-				EObject selectableBase = LibraryUtil.getSelectable(baseElement);
-				if (selectableBase != null) {
-					PackageReference pkgRef = dependency.getReference(
-							selectableBase, true);
-
-					if (!pkgRef.hasReference(element, baseElement)) {
-						// Add the detail element reference to the package
-						// reference.
-						VariabilityElementReference ref = new VariabilityElementReference(
-								element, baseElement);
-						pkgRef.addReference(ref);
-					}
-
-					// Set the dependent of the referenced package.
-					getDependency(selectableBase, true).addDependent(
-							selectableElement);
-				}
-			}
-		}
-
-		List references = element.eCrossReferences();
-
-		// Update the dependents of those elements in the list.
-		if (references != null && references.size() > 0) {
-			// Get the selectable references
-			for (Iterator it = references.iterator(); it.hasNext();) {
-				EObject refElement = (EObject) it.next();
-				EObject selectableRef = LibraryUtil.getSelectable(refElement);
-				if (selectableRef != null) {
-					PackageReference pkgRef = dependency.getReference(
-							selectableRef, true);
-
-					if (element == selectableElement
-							&& refElement == selectableRef) {
-						// No need to add this.
-						continue;
-					}
-
-					if (!pkgRef.hasReference(element, refElement)) {
-						GeneralReference ref = new GeneralReference(element,
-								refElement);
-						pkgRef.addReference(ref);
-					}
-
-					getDependency(selectableRef, true).addDependent(
-							selectableElement);
-				}
-			}
-		}
-*/
-		List properties = LibraryUtil.getStructuralFeatures(element);
-		for (int i = 0; i < properties.size(); i++) {
-			EStructuralFeature f = (EStructuralFeature) properties.get(i);
-			if (!(f instanceof EReference) ) {
-				continue;
-			}
-			
-			EReference feature = (EReference)f;
-			if ( feature.isContainer() || feature.isContainment() ) {
-				continue;
-			}
-						
-			Object value = element.eGet(feature);
-			if ( value == null ) {
-				continue;
-			}
-			
-			MethodElement refElement = null;
-			List values = null;
-			int count = 0;
-			
-			if ( feature.isMany() ) {
-				values = (List)value;
-				if ( values.size() > 0 ) {
-					refElement = (MethodElement)values.get(count);
-				}
-			} else if ( value instanceof MethodElement ) {
-				refElement = (MethodElement)value;				
-			}
-			 
-			while ( refElement != null ) {
-				MethodElement selectableRef = (MethodElement)LibraryUtil.getSelectable(refElement);
-				if (selectableRef != null) {
-					PackageReference pkgRef = dependency.getReference(
-							selectableRef, true);
-	
-					if (element == selectableElement
-							&& refElement == selectableRef) {
-						// No need to add this.
-						break;
-					}
-	
-					ElementReference ref = pkgRef.getReference(element, refElement);
-					if (ref == null) {
-						ref = new ElementReference(element, refElement);
-						pkgRef.addReference(ref);
-					}
-	
-					ref.addFeature(feature);
-					
-					getDependency(selectableRef, true).addDependent(
-							selectableElement);
-				}
-				
-				refElement = null;
-				if ( values != null ) {
-					count++;
-					if ( count < values.size() ) {
-						refElement = (MethodElement)values.get(count);
-					}
-				}
-			}
-		}
-		
-		
-		return dependency;
-	}
-
-	private PackageDependency getDependency(MethodElement element, boolean create) {
-		if (!LibraryUtil.selectable(element)) {
-			if (debug) {
-				System.out
-						.println("Error, Selectable element required: " + element); //$NON-NLS-1$
-			}
-			return null;
-		}
-
-		PackageDependency dependency = (PackageDependency) dependencyMap
-				.get(element);
-		if (dependency == null && create) {
-			dependency = new PackageDependency(element);
-			dependencyMap.put(element, dependency);
-		}
-
-		return dependency;
-
-	}
-
-	private void handleDeletedElement(Collection changedItems) {
-		for (Iterator it = changedItems.iterator(); it.hasNext();) {
-			Object element = it.next();
-			if (element instanceof MethodElement) {
-				removeReference((MethodElement) element);
-			}
-		}
-	}
-
-	/**
-	 * Removes the element reference for the specified element, rebuild later
-	 * 
-	 * @param element
-	 *            A method element.
-	 */
-	private void removeReference(MethodElement element) {
-		PackageDependency dependency = null;
-
-		MethodElement pkg = (MethodElement) LibraryUtil.getSelectable(element);
-		if ((pkg == null) || ((dependency = getDependency(pkg, false)) == null)) {
-			return;
-		}
-
-		dependency.removeReference(element);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementDependency.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementDependency.java
deleted file mode 100644
index b942af2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementDependency.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Holds the a list of package references of one package element it also holds a
- * list of dependant package elements
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ElementDependency {
-
-	// the package element
-	protected MethodElement element;
-
-	/**
-	 * list of ElementReference objects, each ElementReference object holds a
-	 * list of references of the same type
-	 */
-	protected List references = new ArrayList();
-
-	/**
-	 * dependents
-	 */
-	protected List dependents = new ArrayList();
-
-	protected ElementDependency(MethodElement element) {
-		this.element = element;
-	}
-
-	/**
-	 * get the element
-	 * @return Object
-	 */
-	public MethodElement getElement() {
-		return element;
-	}
-
-	/**
-	 * get a list of elements this element depends on
-	 * 
-	 * @return List a list of ElementReference objects
-	 */
-	public List getReferences() {
-		return references;
-	}
-
-	/**
-	 * get the ElementReference with the given refElement that the current
-	 * element recerences to.
-	 * 
-	 * @param RefElement
-	 *            the element to which the current element references
-	 * @return ElementReference
-	 */
-	public ElementReference getReference(MethodElement refElement) {
-		ElementReference ref;
-		Object refEl;
-		for (Iterator it = references.iterator(); it.hasNext();) {
-			ref = (ElementReference) it.next();
-			refEl = ref.getRefElement();
-			if (refEl != null && refEl == refElement) {
-				return ref;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * get the list of elements that depend on this element
-	 * @return List
-	 */
-	public List getDependents() {
-		return dependents;
-	}
-
-	/**
-	 * add a dependent
-	 * @param el Object
-	 */
-	public void addDependent(MethodElement el) {
-		if (!dependents.contains(el)) {
-			dependents.add(el);
-		}
-	}
-
-	/**
-	 * add a reference
-	 * @param ref ElementReference
-	 */
-	public void addReference(ElementReference ref) {
-		references.add(ref);
-	}
-
-	/**
-	 * print out the references. This is a debugging method.
-	 *
-	 */
-	public void print() {
-		for (Iterator it = references.iterator(); it.hasNext();) {
-			Object ref = it.next();
-			if (ref instanceof PackageReference) {
-				((PackageReference) ref).print();
-			} else {
-				((ElementReference) ref).print();
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementDependencyError.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementDependencyError.java
deleted file mode 100644
index 50e4fec..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementDependencyError.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class holds the element dependency error in a configuration closure.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ElementDependencyError {
-
-	// the error element, could be a MethodPackage or a UI package
-	private Object errorElement;
-
-	/**
-	 * map of causeelement to the ErrorInfo object
-	 */
-	private Map<Object, PackageError> errorInfoMap = new HashMap<Object, PackageError>();
-
-	private int errorBits = 0;
-
-	/**
-	 * constructor
-	 * @param element
-	 */
-	public ElementDependencyError(Object element) {
-		this.errorElement = element;
-	}
-
-	/**
-	 * get the element that contains the error
-	 * @return Object
-	 */
-	public Object getErrorElement() {
-		return errorElement;
-	}
-
-	/**
-	 * get the elements that caused the error
-	 * @return Object[]
-	 */
-	public Object[] getCauseElements() {
-		return errorInfoMap.keySet().toArray();
-	}
-
-	/**
-	 * get the count of the error info entry
-	 * @return int
-	 */
-	public int size() {
-		return errorInfoMap.size();
-	}
-
-	/**
-	 * add an error entry
-	 * @param errorInfo PackageError
-	 */
-	public void addError(PackageError errorInfo) {
-		errorInfoMap.put(errorInfo.getCauseElement(), errorInfo);
-		errorBits |= errorInfo.getErrorLevel();
-	}
-
-	/**
-	 * remove the error associated with the causeElement
-	 * 
-	 * @param causeElement
-	 *            Object the element that caused the error
-	 */
-	public PackageError removeError(Object causeElement) {
-		PackageError error = errorInfoMap.remove(causeElement);
-
-		// recalculate the error bits
-		calculateErrorBits();
-		
-		return error;
-	}
-
-	/**
-	 * remove the error associated with the causeElement
-	 * 
-	 * @param causeElement
-	 *            Object the element that caused the error
-	 */
-	public PackageError getError(Object causeElement) {
-		return errorInfoMap.get(causeElement);
-	}
-
-	/**
-	 * get a list of all ErrInfo objects
-	 * 
-	 * @return List a list of ErrorInfo objects
-	 */
-	public List<PackageError> getAll() {
-		return new ArrayList<PackageError>(errorInfoMap.values());
-	}
-
-	/**
-	 * check this is an error or not.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isError() {
-		return (errorBits & ErrorInfo.ERROR) > 0;
-	}
-
-	/**
-	 * check if this is a warning
-	 * 
-	 * @return boolean
-	 */
-	public boolean isWarning() {
-		return (errorBits & ErrorInfo.WARNING) > 0;
-	}
-
-	/**
-	 * check if this is due to an error in it's children
-	 * @return boolean
-	 */
-	public boolean isChildError() {
-		return (errorBits & PackageError.CHILD_ERROR) > 0;
-	}
-
-	/**
-	 * check if this is due to a warning in it's children
-	 * @return boolean
-	 */
-	public boolean isChildWarning() {
-		return (errorBits & PackageError.CHILD_WARNING) > 0;
-	}
-
-	public void calculateErrorBits() {
-		errorBits = 0;
-		for (Iterator it = errorInfoMap.values().iterator(); it.hasNext();) {
-			errorBits |= ((ErrorInfo) it.next()).getErrorLevel();
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementError.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementError.java
deleted file mode 100644
index 87214ea..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementError.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.eclipse.epf.library.configuration.closure;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * This class identifies a configuration error between two elements
- * 
- * @author jxi
- *
- */
-public class ElementError  extends ErrorInfo implements IConfigurationError {
-
-	// need the config id to uniquely identify an error
-	String configId;
-	
-	public ElementError(MethodConfiguration config,  
-			int errorLevel, String message, 
-			Object ownerElement, Object causeElement, 
-			int relation) {
-		super(errorLevel, message, ownerElement, causeElement, relation);
-		this.configId = config.getGuid();
-	}
-
-	
-	// methods for the IConfigurationError
-	//
-	public MethodElement getCauseMethodElement() {
-		if ( this.causeElement instanceof MethodElement) {
-			return (MethodElement)this.causeElement;
-		}
-		
-		return null;
-	}
-
-	public MethodElement getErrorMethodElement() {
-		if ( this.ownerElement instanceof MethodElement ) {
-			return (MethodElement)this.ownerElement;
-		}
-		return null;
-	}
-
-	public String getId() {
-		MethodElement m1 = getErrorMethodElement();
-		MethodElement m2 = getCauseMethodElement();
-		if ( m1 != null && m2 != null ) {
-			return configId + "," + m1.getGuid() + "," + m2.getGuid(); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		
-		return Integer.toHexString(this.hashCode());
-	}
-
-	public int getSeverity() {
-		switch (getErrorLevel() ) {
-		case ErrorInfo.ERROR:
-			return IMarker.SEVERITY_ERROR;
-		case ErrorInfo.WARNING: 
-			return IMarker.SEVERITY_WARNING;
-		}
-		
-		return IMarker.SEVERITY_INFO;
-
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementReference.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementReference.java
deleted file mode 100644
index b7e4b4a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ElementReference.java
+++ /dev/null
@@ -1,127 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.WorkProduct;
-
-
-/**
- * This class defines an Element Reference between two elements.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ElementReference {
-
-	MethodElement element, refElement;
-	
-	// save the features relating to this reference
-	List<EStructuralFeature> features = new ArrayList<EStructuralFeature>();
-	
-
-	/**
-	 * construct the reference instance
-	 * @param element MethodElement the element
-	 * @param refElement MethodElement the referenced element
-	 */
-	public ElementReference(MethodElement element, MethodElement refElement) {
-		this.element = element;
-		this.refElement = refElement;
-	}
-
-	/**
-	 * get the element
-	 * @return Object
-	 */
-	public MethodElement getElement() {
-		return element;
-	}
-
-	/**
-	 * get the referenced element
-	 * @return Object
-	 */
-	public MethodElement getRefElement() {
-		return refElement;
-	}
-
-	public void addFeature(EStructuralFeature feature) {
-		if ( !features.contains(feature) ) {
-			features.add(feature);
-		}
-	}
-	
-	public boolean hasFeature(EStructuralFeature feature) {
-		return features.contains(feature);
-	}
-	
-	/**
-	 * debugging method to print out the relationship
-	 *
-	 */
-	public void print() {
-		System.out
-				.println("    " + LibraryUtil.getName(element) + " --> " + LibraryUtil.getName(refElement)); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * check if the reference can be ignored
-	 * 
-	 * @return boolean
-	 */
-	public boolean canIgnore() {
-		// if the element has no container, it's a deleted element, ignore it
-		if ((element instanceof EObject)
-				&& ((EObject) element).eContainer() == null
-				|| (refElement instanceof EObject)
-				&& ((EObject) refElement).eContainer() == null) {
-			return true;
-		}
-
-		// Don't warn on optional inputs not being present
-		// so added the canIgnore() method
-		if ((element instanceof Task) && (refElement instanceof WorkProduct)) {
-			// if it's a mandatory input, can ignore
-			if (((Task) element).getMandatoryInput().contains(refElement)) {
-				return false;
-			}
-
-			// not mandatory, but optional, ok, ignore it
-			if (((Task) element).getOptionalInput().contains(refElement)) {
-				return true;
-			}
-		}
-
-		// role's modifies feature is actually a dereived opposite feature,
-		// it's value can be an element not visible to this plugin
-		// ignore it
-		// Invalid configuration dependency error reported
-		if ((element instanceof Role) && (refElement instanceof WorkProduct)) {
-			Role r = (Role) element;
-			if (r.getModifies().contains(refElement)
-					&& !r.getResponsibleFor().contains(refElement)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ErrorInfo.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ErrorInfo.java
deleted file mode 100644
index 47672a6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/ErrorInfo.java
+++ /dev/null
@@ -1,146 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * An ErrorInfo object holds the error message info caused by an element. The
- * ErrorInfo object is owned by the owner element which has this error
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ErrorInfo {
-	
-	public static final int NONE = 0;
-
-	public static final int ERROR = 1;
-
-	public static final int WARNING = 2;
-
-	public static final int INFO = 4;
-
-	public static final int CHILD_ERROR = 8;
-
-	public static final int CHILD_WARNING = 16;
-
-	/**
-	 * this defines the relationship between the owner element and the cause element. 
-	 * The owner element references to the the cause element
-	 */
-	public static final int REFERENCE_TO = 16;
-
-	/**
-	 * this defines the relationship between the owner element and the cause element. 
-	 * The owner element is referenced by the the cause element
-	 */
-	public static final int REFERENCED_BY = 32;
-
-	// error category
-	protected String category;
-	
-	protected int errorLevel;
-
-	protected Object ownerElement;
-
-	protected Object causeElement;
-
-	protected String errorMessage;
-
-	protected int relation = 0;
-
-	//protected ConfigurationClosure closure = null;
-	
-	/**
-	 * constructor
-	 * 
-	 * @param errorLevel int the error level
-	 * @param message String the error message
-	 * @param ownerElement Object, the element that owns this error
-	 * @param causeElement Object, the element that caused this error
-	 * @param relation int the relathioship between the owner element and the cause element.
-	 */
-	public ErrorInfo(int errorLevel, String message, Object ownerElement,
-			Object causeElement, int relation) {
-		//this.closure = closure;
-		this.ownerElement = ownerElement;
-		this.causeElement = causeElement;
-		this.errorLevel = errorLevel;
-		this.errorMessage = message;
-		this.relation = relation;
-	}
-
-	/**
-	 * 
-	 * @return int
-	 */
-	public int getRelation() {
-		return relation;
-	}
-
-	/**
-	 * 
-	 * @return Object
-	 */
-	public Object getOwnerElement() {
-		return ownerElement;
-	}
-
-	/**
-	 * 
-	 * @return Object
-	 */
-	public Object getCauseElement() {
-		return causeElement;
-	}
-
-	/**
-	 * 
-	 * @return String
-	 */
-	public String getErrorMessage() {
-		return errorMessage;
-	}
-
-	/**
-	 * 
-	 * @return int
-	 */
-	public int getErrorLevel() {
-		return errorLevel;
-	}
-
-	/**
-	 * 
-	 * @return boolean
-	 */
-	public boolean isError() {
-		return (errorLevel & ERROR) > 0;
-	}
-
-	/**
-	 * 
-	 * @return boolean
-	 */
-	public boolean isWarning() {
-		return (errorLevel & WARNING) > 0;
-	}
-
-	/**
-	 * get the error category
-	 * 
-	 * @return String
-	 */
-	public String getCategory() {
-		return category;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/IConfigurationError.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/IConfigurationError.java
deleted file mode 100644
index 7a676fb..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/IConfigurationError.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Interface for Configuration errors
- * @author Jeff Hardy
- * @author Jinhua Xi
- *
- */
-public interface IConfigurationError {
-	
-	/**
-	 * 
-	 * @return true iff error is a warning
-	 */
-	public boolean isWarning();
-	
-	/**
-	 * 
-	 * @return true iff error is an error
-	 */
-	public boolean isError();
-	
-	/**
-	 * 
-	 * @return the MethodElement containing the error, ie, the element referring to something that is missing
-	 */
-	public MethodElement getErrorMethodElement();
-	
-	/**
-	 * 
-	 * @return the MethodElement causing the error, ie, the element that can be selected to fix the error
-	 */
-	public MethodElement getCauseMethodElement();
-	
-	/**
-	 * 
-	 * @return a unique ID for this error
-	 */
-	public String getId();
-	
-	/**
-	 * 
-	 * @return one of IMarker.SEVERITY_ERROR, IMarker.SEVERITY_WARNING, IMarker.SEVERITY_INFO
-	 * @see org.eclipse.core.resources.IMarker
-	 */
-	public int getSeverity();
-	
-	/**
-	 * get the message string for this error
-	 * @return String
-	 */
-	public String getErrorMessage();
-	
-	/**
-	 * get the error category
-	 * 
-	 * @return String
-	 */
-	public String getCategory();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageDependency.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageDependency.java
deleted file mode 100644
index 983574a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageDependency.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Holds the a list of package references of one package element it also holds a
- * list of dependant package elements.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PackageDependency extends ElementDependency {
-
-	private boolean loaded = false;
-
-	/**
-	 * construct a package dependency for the element
-	 * @param element
-	 */
-	public PackageDependency(MethodElement element) {
-		super(element);
-	}
-
-	/**
-	 * set the loaded flag
-	 * @param loaded boolean
-	 */
-	public void setLoaded(boolean loaded) {
-		this.loaded = loaded;
-	}
-
-	/**
-	 * check if is loaded or not
-	 * @return boolean
-	 */
-	public boolean isLoaded() {
-		return this.loaded;
-	}
-
-	/**
-	 * get the reference for an element
-	 * @param refElement Object
-	 * @param create boolean if true create if not exist.
-	 * @return PackageReference
-	 */
-	public PackageReference getReference(MethodElement refElement, boolean create) {
-		PackageReference ref = (PackageReference) super
-				.getReference(refElement);
-		if (ref == null && create) {
-			ref = new PackageReference(element, refElement);
-			super.addReference(ref);
-		}
-
-		return ref;
-	}
-
-	public List getPackageReferences() {
-		return super.getReferences();
-	}
-	
-	public List getAllElementReferences() {
-		List allRefs = new ArrayList();
-		
-		for ( Iterator it = getPackageReferences().iterator(); it.hasNext(); ) {
-			PackageReference pkgRef = (PackageReference)it.next();
-			allRefs.addAll(pkgRef.getReferences());
-		}
-		
-		return allRefs;
-	}
-	
-	/**
-	 * remove all references with the given owner element
-	 * @param ownerElement Object
-	 */
-	public void removeReference(MethodElement ownerElement) {
-		PackageReference ref;
-		for (Iterator it = super.getReferences().iterator(); it.hasNext();) {
-			ref = (PackageReference) it.next();
-			ref.removeReference(ownerElement);
-		}
-	}
-
-	/**
-	 * debug method to print out the references
-	 */
-	public void print() {
-		super.print();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageError.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageError.java
deleted file mode 100644
index 4ccbdb5..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageError.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.List;
-
-/**
- * this class identifies a configuration error between two packages
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class PackageError extends ErrorInfo {
-
-	List<ElementError> elementErros = null;
-	
-	public PackageError(int errorLevel, String message, Object ownerElement, 
-			Object causeElement, int relation) {
-		super(errorLevel, message, ownerElement, causeElement, relation);
-		
-		//checkElementErrors();
-	}
-	
-	public void setErrorLevel(int level) {
-		errorLevel |= level;
-	}
-	
-	public boolean hasElementError() {
-		return elementErros != null && elementErros.size() > 0;
-	}
-	
-	/**
-	 * 
-	 * @return boolean
-	 */
-	public boolean isChildError() {
-		return (errorLevel & CHILD_ERROR) > 0;
-	}
-
-	/**
-	 * 
-	 * @return boolean
-	 */
-	public boolean isChildWarning() {
-		return (errorLevel & CHILD_WARNING) > 0;
-	}
-	
-//	/**
-//	 * get a list element errors within this PackageError
-//	 * @return
-//	 */
-//	public List<ElementError> getElementErrorList() {
-//		
-//		return this.elementErros;
-//	}
-	
-//
-//	private void checkElementErrors() {
-//		if ( isChildError() || isChildWarning() ) {
-//			return;
-//		}
-//		
-//		this.elementErros = new ArrayList<ElementError>();
-//
-//		int relation = this.getRelation();
-//		MethodElement ownerElement = (MethodElement) this.getOwnerElement();
-//		MethodElement causeElement = (MethodElement) this.getCauseElement();
-//		PackageDependency dep;
-//		PackageReference pkgRef = null;
-//
-//		if (relation == ErrorInfo.REFERENCE_TO) {
-//			dep = closure.getConfigurationManager().getDependencyManager()
-//					.getDependency(ownerElement);
-//			pkgRef = dep.getReference(causeElement, false);
-//		} else if (relation == ErrorInfo.REFERENCED_BY) {
-//			dep = closure.getConfigurationManager().getDependencyManager()
-//					.getDependency(causeElement);
-//			pkgRef = dep.getReference(ownerElement, false);
-//		}
-//
-//		if (pkgRef != null) {
-//			for (Iterator it = pkgRef.getReferences().iterator(); it
-//					.hasNext();) {
-//				ElementReference ref = (ElementReference) it.next();
-//
-//				// Don't show the entry if the reference can be ignored.
-//				if (ref.canIgnore()) {
-//					continue;
-//				}
-//				ElementError elementError;
-//				String message = "";
-//				MethodElement e1, e2;
-//
-//				if (relation == ErrorInfo.REFERENCE_TO) {
-//					e1 = (MethodElement)ref.getElement();
-//					e2 = (MethodElement)ref.getRefElement();
-//				} else {
-//					e2 = (MethodElement)ref.getElement();
-//					e1 = (MethodElement)ref.getRefElement();
-//				}
-//
-//				// if the element is subtracted, don't include the reference
-//				if ( closure.isElementSubtracted(e1) ) {
-//					continue;
-//				}
-//				
-//				message = LibraryResources.bind(LibraryResources.ElementError_missing_element_message, 
-//						(new String[] {LibraryUtil.getTypeName(e1), 
-//								LibraryUtil.getTypeName(e2) }));
-//				
-//				elementError = new ElementError(
-//						this.closure, this.getErrorLevel(),
-//						message, e1, e2, relation); //$NON-NLS-1$
-//
-//				this.elementErros.add(elementError);
-//			}
-//		}
-//	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageReference.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageReference.java
deleted file mode 100644
index 32def23..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/closure/PackageReference.java
+++ /dev/null
@@ -1,164 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.configuration.closure;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * A package reference holds the reference of the current package element to
- * another package element. If one element in the package references to another
- * element in another package, the this package refereces to that package.
- * Unlike element references, PackageReference hold a one to one relationship
- * between two packages The Packagereference object also hold a list of
- * ElementReferences for between the two packages
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PackageReference extends ElementReference {
-	
-	// list of element refereces between the two package
-	private List refList = new ArrayList();
-
-	public PackageReference(MethodElement element, MethodElement refElement) {
-		super(element, refElement);
-	}
-
-	/**
-	 * add a new element reference if the reference is not set. call
-	 * hasReference(Object element, Object refElement) before calling this
-	 * method
-	 * 
-	 * @param ref
-	 */
-	public void addReference(ElementReference ref) {
-		refList.add(ref);
-	}
-
-	/**
-	 * get a list of element references among this package reference
-	 * 
-	 * @return List a list of ElementReference objects
-	 */
-	public List getReferences() {
-		return refList;
-	}
-
-	/**
-	 * get the element reference in this package reference
-	 * 
-	 * @param element
-	 * @param refElement
-	 * @return ElementReference
-	 */
-	public ElementReference getReference(Object element, Object refElement) {
-		for (Iterator it = refList.iterator(); it.hasNext();) {
-			ElementReference ref = (ElementReference) it.next();
-			if (ref.getElement() == element
-					&& ref.getRefElement() == refElement) {
-				return ref;
-			}
-		}
-
-		return null;
-	}
-	
-	/**
-	 * check the element reference exists in this package reference
-	 * 
-	 * @param element
-	 * @param refElement
-	 * @return
-	 */
-	public boolean hasReference(MethodElement element, MethodElement refElement) {
-		
-		return getReference(element, refElement) != null;
-	}
-
-//	/**
-//	 * check if there is a reference of variability base element
-//	 * @return
-//	 */
-//	public boolean hasBaseReference() {
-//		for (Iterator it = refList.iterator(); it.hasNext();) {
-//			ElementReference ref = (ElementReference) it.next();
-//			if (ref instanceof VariabilityElementReference) {
-//				return true;
-//			}
-//		}
-//
-//		return false;
-//	}
-
-	/**
-	 * remove the reference ownerd by the specified element
-	 * 
-	 * @param ownerElement
-	 */
-	public void removeReference(MethodElement ownerElement) {
-		Object e;
-		int i = 0;
-		while (i < refList.size()) {
-			ElementReference ref = (ElementReference) refList.get(i);
-			e = ref.getElement();
-			if (e != null && e == ownerElement) {
-				refList.remove(i);
-			} else {
-				i++;
-			}
-		}
-	}
-
-	/**
-	 * print out
-	 */
-	public void print() {
-		System.out.println(LibraryUtil.getName(element)
-				+ " --> " + LibraryUtil.getName(refElement)); //$NON-NLS-1$
-
-		for (Iterator it = refList.iterator(); it.hasNext();) {
-			((ElementReference) it.next()).print();
-		}
-		System.out.println();
-
-	}
-
-	/**
-	 * check if the package reference can be ignored
-	 * 
-	 */
-	public boolean canIgnore() {
-		// if the package has no element reference or all element references can
-		// be ignored, return true
-		// otherwise, false
-		List refs = this.getReferences();
-
-		if (refs.size() == 0) {
-			return true;
-		}
-
-		for (Iterator it = refs.iterator(); it.hasNext();) {
-			ElementReference ref = (ElementReference) it.next();
-			if (!ref.canIgnore()) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/package.html
deleted file mode 100644
index 7b33fe8..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides element realization support in a method configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/events/ILibraryChangeListener.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/events/ILibraryChangeListener.java
deleted file mode 100644
index 041266b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/events/ILibraryChangeListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.events;
-
-import java.util.Collection;
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface ILibraryChangeListener {
-
-//	public static final int OPTION_LOADED = 0x1;
-
-//	public static final int OPTION_SAVED = 0x2;
-
-//	public static final int OPTION_CREATED = 0x4;
-
-	public static final int OPTION_CHANGED = 0x8;
-
-	public static final int OPTION_DELETED = 0x10;
-
-	public static final int OPTION_NEWCHILD = 0x20;
-
-//	public static final int OPTION_CONFIGURATION_SELECTED = 0x40;
-
-//	public static final int OPTION_LIBRARY_CLOSED = 0x80;
-
-	/**
-	 * notify the listener of the library changes.
-	 * 
-	 * @param option
-	 *            int one of the change options
-	 * @param collection
-	 *            the changed elements in the library, if the option is
-	 *            OPTION_CHANGED, null otherwise
-	 */
-	public void libraryChanged(int option, Collection collection);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/events/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/events/package.html
deleted file mode 100644
index 10bac62..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/events/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for method library events.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/internal/LibraryManagerElement.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/internal/LibraryManagerElement.java
deleted file mode 100644
index aaadb25..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/internal/LibraryManagerElement.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.internal;
-
-import org.osgi.framework.Bundle;
-
-/**
- * Models a "libraryManager" configuration element in the
- * "org.eclipse.epf.library.libraryManagers" extension point.
- * 
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryManagerElement {
-
-	// The contributing plug-in.
-	private Bundle bundle;
-
-	// The library manager class name.
-	private String className;
-
-	// The library type identifier.
-	private String typeId;
-
-	// The library type display name.
-	private String typeName;
-	
-	private int version;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param bundle
-	 *            the contributing plug-in
-	 * @param className
-	 *            the library manager class name
-	 * @param typeId
-	 *            the library type identifier
-	 * @param typeName
-	 *            the library type display name
-	 */
-	public LibraryManagerElement(Bundle bundle, String className,
-			String typeId, String typeName, int version) {
-		this.bundle = bundle;
-		this.className = className;
-		this.typeId = typeId;
-		this.typeName = typeName;
-		this.version = version;
-	}
-
-	/**
-	 * Gets the plug-in that contributed the extension point
-	 * 
-	 * @return a plug-in bundle
-	 */
-	public Bundle getBundle() {
-		return bundle;
-	}
-
-	/**
-	 * Gets the "class" attribute value.
-	 * 
-	 * @return the name of the library manager class
-	 */
-	public String getClassName() {
-		return className;
-	}
-
-	/**
-	 * Gets the "type" attribute value.
-	 * 
-	 * @return a unique string ID for the library type
-	 */
-	public String getTypeId() {
-		return typeId;
-	}
-
-	/**
-	 * Gets the "typeName" attribute value.
-	 * 
-	 * @return a display name for the library type
-	 */
-	public String getTypeName() {
-		return typeName;
-	}
-
-	public int getVersion() {
-		return version;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/internal/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/internal/package.html
deleted file mode 100644
index 571d0a4..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides extension point management for the library service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/Bookmark.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/Bookmark.java
deleted file mode 100644
index 7faefb9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/Bookmark.java
+++ /dev/null
@@ -1,482 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.library.layout.util.XmlElement;
-
-/**
- * This class defines the bookmark data structure for the published bookmark entries. 
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class Bookmark {
-
-	static final long serialVersionUID = -3652582791326323863L;
-
-	// points to the description file in the file system
-	private String _fileName = ""; //$NON-NLS-1$
-
-	// used as "closed" or "default" icon
-	private String _closedIconName = ""; //$NON-NLS-1$
-
-	// used as "open" icon
-	private String _openIconName = ""; //$NON-NLS-1$
-
-	// presentation name of the entry
-	private String _presentationName = ""; //$NON-NLS-1$
-
-	// whether mouse is over the bookmark
-	// this is for backwards compatibility
-	// private boolean _isMouseOver = false;
-
-	// whether the file exists in the file system
-	private boolean _isExist = true;
-
-	// whether the file is from content library
-	private boolean _isFromContentLibrary = true;
-
-	// unique id.
-	// A bookmark may not have a uniqueID in which case the
-	// bookmark has no relation to any layout elements.
-	private String _uniqueId = null;
-
-	// whether the bookmark is visible
-	private boolean _isVisible = true;
-
-	// whether the bookmark is enabled
-	// this is to support a special case where bookmarks
-	// are to remain hidden and cannot be unhidden as
-	// well as transparency
-	private boolean _isEnabled = true;
-
-	// whether the bookmark is transparent
-	private boolean _isTransparent = false;
-
-	// whether the bookmark is a default one
-	// default means that it is published and is read-only
-	private boolean _isDefault = false;
-
-	// whether the bookmark is the current one
-	// current means the first one to be focused on
-	private boolean _isCurrent = false;
-
-	private String queryString = ""; //$NON-NLS-1$
-	
-	private List children = new ArrayList();
-
-	private Bookmark parent = null;
-	
-	// the owner element of the node
-	private Object owner = null;
-	
-	/**
-	 * Default constructor. Takes in the presentation name of the process layout
-	 * entry.
-	 */
-	public Bookmark(String name) {
-		_uniqueId = null;
-		_presentationName = name;
-		if (_presentationName == null) {
-			_presentationName = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Name and uniqueId for a layout node.
-	 */
-	public Bookmark(String presentationName, String uniqueId) {
-		this(presentationName);
-		_uniqueId = uniqueId;
-
-	}
-
-	public void setOwner(Object element) {
-		this.owner = element;
-	}
-	
-	public Object getOwner() {
-		return this.owner;
-	}
-	
-	/**
-	 * Override to return presentation name as the user object.
-	 */
-	public Object getUserObject() {
-		return (_presentationName);
-	}
-
-	/**
-	 * set the user object
-	 * @param userObject Object
-	 */
-	public void setUserObject(Object userObject) {
-		_presentationName = (String) userObject;
-		if (_presentationName == null) {
-			_presentationName = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * set the presentation name
-	 * 
-	 * @param name String
-	 */
-	public void setPresentationName(String name) {
-		_presentationName = name;
-		if (_presentationName == null) {
-			_presentationName = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * get the presentation name
-	 * 
-	 * @return String
-	 */
-	public String getPresentationName() {
-		return (_presentationName);
-	}
-
-	/**
-	 * set the file name
-	 * 
-	 * @param name String
-	 */
-	public void setFileName(String name) {
-		_fileName = name;
-		if (_fileName == null) {
-			_fileName = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * get the file name
-	 * 
-	 * @return String
-	 */
-	public String getFileName() {
-		return (_fileName);
-	}
-
-	/**
-	 * set the icon name for the closed icon
-	 * @param name String
-	 */
-	public void setClosedIconName(String name) {
-		_closedIconName = name;
-	}
-
-	/**
-	 * get the closed icon name
-	 * 
-	 * @return String
-	 */
-	public String getClosedIconName() {
-		return (_closedIconName);
-	}
-
-	/**
-	 * get the open icon name
-	 * 
-	 * @return String the open icon name
-	 */
-	public String getOpenIconName() {
-		return (_openIconName);
-	}
-
-	/**
-	 * set the open icon name
-	 * 
-	 * @param name String
-	 */
-	public void setOpenIconName(String name) {
-		_openIconName = name;
-	}
-
-	/**
-	 * set the exist flag
-	 * 
-	 * @param isExist boolean
-	 */
-	public void setExist(boolean isExist) {
-		_isExist = isExist;
-	}
-
-	/**
-	 * get the exist flag
-	 * 
-	 * @return boolean
-	 */
-	public boolean isExist() {
-		return (_isExist);
-	}
-
-	/**
-	 * this is a legacy method, not used any more
-	 * @deprecated
-	 * @param flag boolean
-	 */
-	public void setFromContentLibrary(boolean flag) {
-		_isFromContentLibrary = flag;
-	}
-
-	/**
-	 * this is a legacy method, not used any more
-	 * @deprecated
-	 * @return boolean
-	 */
-	public boolean isFromContentLibrary() {
-		return (_isFromContentLibrary);
-	}
-
-	/**
-	 * get the unique id of the bookmark
-	 * 
-	 * @return String
-	 */
-	public String getUniqueId() {
-		return (_uniqueId);
-	}
-
-	/**
-	 * set the unique id of the bookmark
-	 * 
-	 * @param uniqueId String
-	 */
-	public void setUniqueId(String uniqueId) {
-		_uniqueId = uniqueId;
-	}
-
-	/**
-	 * set the visible flag
-	 * 
-	 * @param isVisible boolean
-	 */
-	public void setVisible(boolean isVisible) {
-		_isVisible = isVisible;
-		// special case where all children need to change as well
-		for (int i = 0; i < getChildCount(); i++) {
-			Bookmark child = (Bookmark) ((Bookmark) getChildAt(i));
-			child.setVisible(isVisible);
-		}
-	}
-
-	/**
-	 * get the visible flag
-	 * 
-	 * @return boolean
-	 */
-	public boolean isVisible() {
-		return (_isVisible);
-	}
-
-	/**
-	 * set the enabled flag
-	 * 
-	 * @param isEnabled boolean
-	 */
-	public void setEnabled(boolean isEnabled) {
-		_isEnabled = isEnabled;
-		// special case where all children need to change as well
-		for (int i = 0; i < getChildCount(); i++) {
-			Bookmark child = (Bookmark) ((Bookmark) getChildAt(i));
-			child.setEnabled(isEnabled);
-		}
-	}
-
-	/**
-	 * get the enabled flag
-	 * 
-	 * @return boolean
-	 */
-	public boolean isEnabled() {
-		return (_isEnabled);
-	}
-
-	/**
-	 * set the transparant flag
-	 * 
-	 * @param isTransparent boolean
-	 */
-	public void setTransparency(boolean isTransparent) {
-		// set at this bookmark only, not children
-		_isTransparent = isTransparent;
-	}
-
-	/**
-	 * get the transparent flag
-	 * 
-	 * @return boolean
-	 */
-	public boolean isTransparent() {
-		return (_isTransparent);
-	}
-
-	/**
-	 * set the bookmark as default
-	 * 
-	 * @param isDefault boolean
-	 */
-	public void setDefault(boolean isDefault) {
-		_isDefault = isDefault;
-	}
-
-	/**
-	 * check if this bookmark is set as default
-	 * 
-	 * @return boolean
-	 */
-	public boolean isDefault() {
-		return (_isDefault);
-	}
-
-	/**
-	 * set the current flag
-	 * 
-	 * @param isCurrent boolean
-	 */
-	public void setCurrent(boolean isCurrent) {
-		_isCurrent = isCurrent;
-	}
-
-	/**
-	 * get the current flag
-	 * 
-	 * @return boolean
-	 */
-	public boolean isCurrent() {
-		return (_isCurrent);
-	}
-
-	/**
-	 * get the number of children
-	 * 
-	 * @return int
-	 */
-	public int getChildCount() {
-		return children.size();
-	}
-
-	/**
-	 * Retrieves real child count regardless of visibility.
-	 */
-	public int getActualChildCount() {
-		return (getChildCount());
-	}
-
-	/**
-	 * get the specified child
-	 * @param i int position of the child
-	 * @return Object the child bookmark
-	 */
-	public Object getChildAt(int i) {
-		return children.get(i);
-	}
-
-	/**
-	 * same as getChildAt
-	 * 
-	 * @param i int position of the child
-	 * @return Object the child
-	 */
-	public Object getActualChildAt(int i) {
-		return children.get(i);
-	}
-
-	/**
-	 * add a new child bookmark
-	 * 
-	 * @param child Bookmark
-	 */
-	public void addChild(Bookmark child) {
-		children.add(child);
-		child.parent = this;
-	}
-
-	public Bookmark getParent() {
-		return this.parent;
-	}
-	
-	/**
-	 * get the query string to this bookmark.
-	 * 
-	 * @return String
-	 */
-	public String getQueryString()
-	{
-		return queryString;
-	}
-	
-	/**
-	 * set the query string
-	 * 
-	 * @param queryStr String
-	 */
-	public void setQueryString(String queryStr)
-	{
-		this.queryString = queryStr;
-	}
-	
-	/**
-	 * get the xml document for this bookmark.
-	 * 
-	 * @return XmlElement
-	 */
-	public XmlElement getXmlElement() {
-		XmlElement elementXml = new XmlElement("Element") //$NON-NLS-1$
-				.setAttribute("guid", getUniqueId()) //$NON-NLS-1$
-				.setAttribute("name", getPresentationName().trim()) //$NON-NLS-1$
-				.setAttribute("closedIconName", getClosedIconName()) //$NON-NLS-1$
-				.setAttribute("openIconName", getOpenIconName()) //$NON-NLS-1$
-				.setAttribute("exist", isExist() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				.setAttribute(
-						"fromContentLibrary", isFromContentLibrary() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				.setAttribute("visible", isVisible() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				.setAttribute("enabled", isEnabled() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				.setAttribute("transparent", isTransparent() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				.setAttribute("default", isDefault() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				.setAttribute("current", isCurrent() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		elementXml.setAttribute("closedIconId", getIconId(getClosedIconName())); //$NON-NLS-1$
-		
-		String qStr = getQueryString();
-		if ( qStr == null || qStr.length() == 0 ) {
-			qStr = "?nodeId=" + elementXml.getId(); //$NON-NLS-1$
-		} else {
-			qStr += "&nodeId=" + elementXml.getId();  //$NON-NLS-1$
-		}
-		
-		elementXml.setAttribute("url", getFileName() + qStr); //$NON-NLS-1$
-	
-		for (int i = 0; i < getChildCount(); i++) {
-			Bookmark child = (Bookmark) getActualChildAt(i);
-			elementXml.addChild(child.getXmlElement());
-		}
-
-		return elementXml;
-	}
-
-	public String getUrl() {
-		return getFileName() + getQueryString();
-	}
-	
-	public String getIconId(String iconFileName) {
-		if ( iconFileName == null ) {
-			return ""; //$NON-NLS-1$
-		}
-
-		return Integer.toHexString(iconFileName.hashCode());
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/BookmarkList.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/BookmarkList.java
deleted file mode 100644
index 5da106f..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/BookmarkList.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.library.layout.util.XmlElement;
-
-
-/**
- * This class manages a list of bookmarks
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class BookmarkList {
-
-	// a list of bookmark items
-	private List bookmarks = new ArrayList();
-
-	/**
-	 * default constructor
-	 *
-	 */
-	public BookmarkList() {
-	}
-
-	/**
-	 * add a new bookmark  entry to the list
-	 * @param name String the Bookmark name
-	 * @param fileName String the file name of the bookmark
-	 * @param setAsDefault boolean set the bookmark as default if true.
-	 */
-	public void addBookmark(String name, String fileName, boolean setAsDefault) {
-		_BookmarkEntry entry = new _BookmarkEntry(name, fileName, setAsDefault);
-		bookmarks.add(entry);
-	}
-
-	/**
-	 * get a list of bookmark entries
-	 * @return List
-	 */
-	public List getBookmarks() {
-		return bookmarks;
-	}
-
-	/**
-	 * get the xml document for the bookmark entries.
-	 * 
-	 * @return XmlElement
-	 */
-	public XmlElement getXmlElement() {
-		XmlElement elementXml = new XmlElement("Bookmarks"); //$NON-NLS-1$
-
-		for (Iterator it = bookmarks.iterator(); it.hasNext();) {
-			_BookmarkEntry entry = (_BookmarkEntry) it.next();
-			String bookmark = entry.fileName;
-
-			// String tabName="";
-			String url = ""; //$NON-NLS-1$
-			int indx = bookmark.lastIndexOf("."); //$NON-NLS-1$
-			if (indx > 0) {
-				// tabName = bookmark.substring(0, indx).replace('_', ' ');
-				url = bookmark.substring(0, indx) + ".html"; //$NON-NLS-1$
-			}
-			elementXml.newChild("Bookmark") //$NON-NLS-1$
-					.setAttribute("name", bookmark) //$NON-NLS-1$
-					.setAttribute("tabName", entry.tabName) //$NON-NLS-1$
-					.setAttribute("url", url) //$NON-NLS-1$
-					.setAttribute(
-							"default", (entry.isDefault) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-
-		return elementXml;
-	}
-
-	private class _BookmarkEntry {
-		private String fileName;
-
-		private String tabName;
-
-		boolean isDefault;
-
-		_BookmarkEntry(String name, String fileName, boolean isDefault) {
-			this.tabName = name.trim();
-			this.fileName = fileName;
-			this.isDefault = isDefault;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/BrowsingLayoutSettings.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/BrowsingLayoutSettings.java
deleted file mode 100644
index 87c5296..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/BrowsingLayoutSettings.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Define the browsing settings. UI preference can set the options to change the browsing behavior
- * 
- * @author Jinhua Xi
- * @since 1.2
- * 
- */
-public class BrowsingLayoutSettings {
-
-	public static BrowsingLayoutSettings INSTANCE = new BrowsingLayoutSettings();
-	
-	private boolean showExtraInfoForDescriptors = false;
-	private boolean publishUnopenActivitydd = false;
-	private boolean publishADForActivityExtension = false;
-	
-	// if true, the to-many outgoing association from base will be ignored if the extender has its own
-	private boolean useNewExtendSemantics = false;
-	
-	private  File xslPath = null;
-	private  File cssPath = null;
-	
-	// record all the sites updated since the last change
-	private  List updatedSites = new ArrayList();
-	
-	public void setUseNewExtendSemantics(boolean flag) {
-		this.useNewExtendSemantics = flag;
-	}
-	
-	public boolean isUseNewExtendSemantics() {
-		return this.useNewExtendSemantics;
-	}
-	
-	public void setShowExtraInfoForDescriptors(boolean flag) {
-		this.showExtraInfoForDescriptors = flag;
-	}
-	
-	public boolean isShowExtraInfoForDescriptors() {
-		return this.showExtraInfoForDescriptors;
-	}
-	
-	public void setPublishUnopenActivitydd(boolean flag) {
-		this.publishUnopenActivitydd = flag;
-	}
-	
-	public boolean isPublishUnopenActivitydd() {
-		return this.publishUnopenActivitydd;
-	}
-	
-	public void setPublishADForActivityExtension(boolean flag) {
-		this.publishADForActivityExtension = flag;
-	}
-	
-	public boolean isPublishADForActivityExtension() {
-		return this.publishADForActivityExtension;
-	}
-	
-	public  void setXslPath(File path) {
-		xslPath = path;
-	}
-	
-	public  void setCssPath(File path) {
-		cssPath = path;
-	}
-	
-	public  File getXslPath() {
-		return xslPath;
-	}
-	
-	public  File getCssPath() {
-		return cssPath;
-	}
-	
-	public  void setChanged() {
-		updatedSites.clear();
-	}
-	
-	
-	public  boolean needUpdate(String pubDir) {
-		if ( pubDir == null ) {
-			return false;
-		}
-		return !updatedSites.contains(pubDir);
-	}
-	
-	public  void update(HtmlBuilder builder) {
-		if ( (builder == null) || !needUpdate(builder.getPublishDir()) ) {
-			return;
-		}
-		
-		if ( xslPath == null || cssPath == null) {
-			// use the default
-			LayoutResources.copyLayoutFiles(builder.getPublishDir());
-			builder.loadDefaultLayoutXsl();
-		} else {
-			
-			// set the xsl path
-			builder.setLayoutXslRootPath(xslPath.getAbsolutePath());
-			
-			// copy the fils to the publish folder
-			String include = "*.*,**/*.*"; //$NON-NLS-1$
-			String exclude = null;
-			boolean override = true;
-			
-			File folder = new File(builder.getPublishDir(), "css");			 //$NON-NLS-1$
-			LayoutResources.copyDir(cssPath, folder, include, exclude, override);
-		}
-		
-		updatedSites.add(builder.getPublishDir());
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/DefaultContentValidator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/DefaultContentValidator.java
deleted file mode 100644
index 0e48447..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/DefaultContentValidator.java
+++ /dev/null
@@ -1,232 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.io.File;
-import java.io.PrintStream;
-
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.util.ContentResourceScanner;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * default implementation for IContentValidator. This validator is used for browsing and preview
- * 
- * @author Jinhua Xi
- *
- */
-public class DefaultContentValidator implements IContentValidator {
-
-	protected PrintStream info;
-
-	protected PrintStream warning;
-
-	protected PrintStream error;
-
-	protected String pubDir;
-
-	//protected boolean showBrokenLinks = true;
-		
-	/**
-	 * constructor
-	 *
-	 */
-	public DefaultContentValidator() {
-		this(null);
-	}
-
-	/**
-	 * constructor
-	 * @param pubDir
-	 */
-	public DefaultContentValidator(String pubDir) {
-		this.pubDir = pubDir;
-		info = System.out;
-		warning = System.out;
-		error = System.err;
-	}
-
-	/**
-	 * set publish dir
-	 * @param pubDir String
-	 */
-	public void setPublishDir(String pubDir) {
-		this.pubDir = pubDir;
-	}
-	
-	public String getPublishDir() {
-		return this.pubDir;
-	}
-
-//	public void setShowBrokenLinks(boolean flag) {
-//		showBrokenLinks = flag;
-//	}
-	
-	public boolean showBrokenLinks() {
-		return true; // default
-	}
-	
-	public void scanContent(IElementLayout layout, String content) throws Exception {
-		
-		MethodElement owner = layout.getElement();
-		String contentPath = layout.getFilePath();
-
-		ContentResourceScanner scanner = getScanner(owner);
-		if ( scanner != null ) {
-			scanner.resolveResources(owner, content, contentPath);
-		}
-	}
-	
-	/**
-	 * Returns the content resource scanner for the element.
-	 */
-	private ContentResourceScanner getScanner(MethodElement owner) {
-		ILibraryResourceManager resMgr = ResourceHelper.getResourceMgr(owner);
-		if ( resMgr == null ) {
-			return null;
-		}
-		
-		String rootContentPath = resMgr.getLogicalPluginPath(owner);
-		File src_root = new File(resMgr.getPhysicalPluginPath(owner));
-		File tgt_root = new File(pubDir, rootContentPath);
-		ContentResourceScanner scanner = new ContentResourceScanner(src_root, tgt_root, rootContentPath, this);
-
-		return scanner;
-	}
-	
-	public LinkInfo validateLink(MethodElement owner, String attributes,
-			String text, MethodConfiguration config, String tag) {
-
-		LinkInfo info = new LinkInfo(owner, this, pubDir, tag);
-		info.validateLink(attributes, text, config);
-
-		return info;
-	}
-
-	public void logInfo(MethodElement owner, String message) {
-		info
-				.println(NLS.bind(LibraryResources.DefaultContentValidator_MSG1, ((owner == null) ? "" : LibraryUtil.getTypeName(owner)) + ": " + message));  //$NON-NLS-1$ //$NON-NLS-2$
-		info.flush();
-	}
-
-	public void logWarning(MethodElement owner, String message) {
-		warning
-				.println(NLS.bind(LibraryResources.DefaultContentValidator_MSG4, ((owner == null) ? "" : LibraryUtil.getTypeName(owner)) + ": " + message));  //$NON-NLS-1$ //$NON-NLS-2$
-		warning.flush();
-	}
-
-	public void logError(MethodElement owner, String message, Throwable th) {
-		error
-				.println(NLS.bind(LibraryResources.DefaultContentValidator_MSG7, ((owner == null) ? "" : LibraryUtil.getTypeName(owner)) + ": " + message));  //$NON-NLS-1$ //$NON-NLS-2$
-		if (th != null) {
-			th.printStackTrace(error);
-		}
-		error.flush();
-
-	}
-
-	public void logInfo(String message) {
-		logInfo(null, message);
-	}
-
-	public void logWarning(String message) {
-		logWarning(null, message);
-	}
-
-	public void logError(String message, Throwable th) {
-		logError(null, message, th);
-	}
-
-	public void logMissingReference(MethodElement owner,
-			MethodElement refElement) {
-		logWarning(
-				owner,
-				NLS.bind(LibraryResources.DefaultContentValidator_MSG10, LibraryUtil.getTypeName(refElement))); 
-	}
-
-	public void logMissingReference(MethodElement owner, String guid,
-			String linkedText) {
-		logWarning(owner, NLS.bind(LibraryResources.DefaultContentValidator_MSG11, guid)); 
-	}
-
-	public void logMissingResource(MethodElement owner, File resourceFile,
-			String url) {
-		String msg;
-		if (resourceFile != null) {
-			msg = NLS.bind(LibraryResources.DefaultContentValidator_MSG12, resourceFile.getPath(), url); 
-		} else {
-			msg = NLS.bind(LibraryResources.DefaultContentValidator_MSG15, url); 
-		}
-
-		logWarning(owner, msg);
-	}
-
-	public void logInvalidExternalLink(MethodElement owner, String url,
-			String message) {
-		String text;
-		if (message != null && message.length() > 0) {
-			text = NLS.bind(LibraryResources.DefaultContentValidator_MSG19, url, message); 
-		} else {
-			text = NLS.bind(LibraryResources.DefaultContentValidator_MSG17, url); 
-		}
-		logWarning(owner, text);
-	}
-
-	/**
-	 * check if the element is discarded or not
-	 * discarded elements will be treated as out side the configursation
-	 * 
-	 * @param owner MethodElement the owner of the element
-	 * @param Object feature EStructuralFeature or OppositeFeature
-	 * @param e MethodElement the element to be checked
-	 */
-	public boolean isDiscarded(MethodElement owner, Object feature, MethodElement e) {
-		return false;
-	}
-
-	public void dispose() {
-	}
-
-	public void addReferencedElement(MethodElement owner, MethodElement e)
-	{
-	}
-	
-	
-	public void setDiscardedElement(MethodElement e) {
-		
-	}
-	
-	public boolean showExtraInfoForDescriptors() {
-		return BrowsingLayoutSettings.INSTANCE.isShowExtraInfoForDescriptors();
-	}
-		
-	/**
-	 * show descriptors on method element page
-	 */
-	public boolean showRelatedDescriptors() {
-		return true;
-	}
-	
-	/**
-	 * get the tab id for the activity layout
-	 * 
-	 * @return String
-	 */
-	public String getDefaultActivityTab() {
-		return null;  // use the default
-	}
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/DefaultShapeicons.properties b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/DefaultShapeicons.properties
deleted file mode 100644
index 48b562c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/DefaultShapeicons.properties
+++ /dev/null
@@ -1,69 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-# Default Shape Icon Mapping for the Method Elements.
-
-# Core Method Elements
-artifact=images/artifact.gif
-contentelement=images/guidance.gif
-contentpackage=images/content_package.gif
-deliverable=images/artifact.gif
-methodplugin=images/method_plugin.gif
-outcome=images/artifact.gif
-role=images/role.gif
-task=images/task.gif
-
-# Guidance
-checklist=images/checklist.gif
-concept=images/concept.gif
-example=images/example.gif
-estimationconsiderations=images/estimationconsiderations.gif
-guidance=images/guidance.gif
-guidline=images/guidline.gif
-practice=images/practice.gif
-roadmap=images/roadmap.gif
-report=images/report.gif
-reusableasset=images/reusableasset.gif
-supportingmaterial=images/supportingmaterial.gif
-technique=images/technique.gif
-template=images/template.gif
-termdefinition=images/termdefinition.gif
-toolmentor=images/toolmentor.gif
-whitepaper=images/whitepaper.gif
-
-# Content Categories
-customcategory=images/content_package.gif
-discipline=images/content_package.gif
-disciplinegrouping=images/content_package.gif
-domain=images/content_package.gif
-roleset=images/content_package.gif
-rolesetgrouping=images/content_package.gif
-tool=images/content_package.gif
-workproducttype=images/content_package.gif
-
-# Process Elements
-activity=images/process.gif
-capabilitypattern=images/process.gif
-deliveryprocess=images/process.gif
-iteration=images/process.gif
-phase=images/process.gif
-process=images/process.gif
-
-# Descriptors
-compositerole=images/compositerole.gif
-roledescriptor=images/roledes_lg_dgm32.gif
-taskdescriptor=images/taskdes_lg_dgm32.gif
-teamprofile=images/teamprofile.gif
-workproductdescriptor=images/workdes_lg_dgm32.gif
-milestone=images/milestone.gif
-
-# Misc
-general=images/guidance.gif
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/ElementLayoutManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/ElementLayoutManager.java
deleted file mode 100644
index 4fd06b6..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/ElementLayoutManager.java
+++ /dev/null
@@ -1,574 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.configuration.DefaultElementRealizer;
-import org.eclipse.epf.library.configuration.ElementRealizer;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.diagram.IActivityDiagramService;
-import org.eclipse.epf.library.layout.elements.AbstractElementLayout;
-import org.eclipse.epf.library.layout.elements.AbstractProcessElementLayout;
-import org.eclipse.epf.library.layout.elements.GeneralLayout;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ElementLayoutManager {
-
-	private static final String PACKAGE_NAME = ElementLayoutManager.class
-			.getPackage().getName();
-
-	private static final String default_config_path = "noconfig"; //$NON-NLS-1$
-
-	private boolean isPublishingMode = false; // default to browsing mode
-	
-	private String publish_dir = null;
-
-	private MethodConfiguration config = null;
-
-	private IActivityDiagramService diagramService = null;
-
-	// need to seperate the adapter factory form content and diagram
-	// diagram adaptor factory should not be rolled up
-	private LayoutAdapterFactory contentLayoutAdapterFactory = null;
-	private LayoutAdapterFactory diagramLayoutAdapterFactory = null;
-	
-	// cache the suppression object for publishing model only
-	// map of proc guid to Suppresiion object	
-	private Map supressionMap = null;
-	
-	private IContentValidator validator = null;
-	
-	private ElementRealizer realizer = null;
-	
-	// the layout extensions. each extension is identified by the property id of the configuration
-	private Map<String, LayoutExtension> layoutExtensions = new HashMap<String, LayoutExtension>();
-	
-	public boolean isPublishingMode()
-	{
-		return this.isPublishingMode;
-	}
-	
-	public ElementLayoutManager() {
-		this(null, null, null, false);
-	}
-
-	public ElementLayoutManager(MethodConfiguration config) {
-		this(config, null, null, false);
-	}
-
-	public ElementLayoutManager(MethodConfiguration config, String publishdir, IContentValidator validator, boolean isPublishingMode) {
-		this.validator = validator;
-		this.isPublishingMode = isPublishingMode;
-		
-		if (config != null) {
-			this.config = config;
-		}
-
-		if (publishdir == null) {
-			publishdir = LayoutResources.getDefaultPublishDir();
-			if (!publishdir.endsWith(File.separator)) {
-				publishdir += File.separator;
-			}
-
-			// also append the configuration path
-			if (this.config == null) {
-				publishdir += default_config_path;
-			} else {
-				String str = StrUtil.removeSpecialCharacters(this.config.getName());
-				if ( str == "" ) { //$NON-NLS-1$
-					str = Integer.toHexString(this.config.toString().hashCode());
-				}
-				publishdir += str;
-			}
-		}
-
-		setPublishDir(publishdir);
-
-		contentLayoutAdapterFactory = new LayoutAdapterFactory(this.config);
-		diagramLayoutAdapterFactory = new LayoutAdapterFactory(this.config);
-		
-		//	load the layout extensions for this configuration
-		loadLayoutExtensions();
-	}
-
-	private void loadLayoutExtensions() {
-		if ( config == null ) {
-			return;
-		}
-		
-		// load the layout extensions for this configuration
-		List props = config.getMethodElementProperty();
-		if ( props != null && props.size() > 0 ) {
-			for (Iterator itp = props.iterator(); itp.hasNext(); ) {
-				MethodElementProperty prop = (MethodElementProperty)itp.next();
-				String id = prop.getName();
-				LayoutExtension ext= LayoutExtensionFactory.getInstance().createExtension(id);
-				if ( ext != null ) {
-					ext.init(this);
-					layoutExtensions.put(id, ext);
-				}
-				
-			}
-		}		
-	}
-	
-	/**
-	 * Returns the content validator.
-	 */
-	public IContentValidator getValidator() {
-		if (validator == null) {
-			validator = new DefaultContentValidator(getPublishDir());
-		}
-		return validator;
-	}
-	
-	public ElementRealizer getElementRealizer() {
-		if ( realizer == null ) {
-			realizer = new DefaultElementRealizer(config);
-			realizer.setFilter(contentLayoutAdapterFactory.getFilter());
-		}
-		
-		return realizer;		
-	}
-	
-	public void setElementRealizer(ElementRealizer realizer) {
-		this.realizer = realizer;		
-	}
-	
-	public ConfigurableComposedAdapterFactory getWBSAdapterFactory() {
-		return contentLayoutAdapterFactory.wbsAdapterFactory;
-	}
-
-	public ConfigurableComposedAdapterFactory getTBSAdapterFactory() {
-		return contentLayoutAdapterFactory.tbsAdapterFactory;
-	}
-
-	public ConfigurableComposedAdapterFactory getWPBSAdapterFactory() {
-		return contentLayoutAdapterFactory.wpbsAdapterFactory;
-	}
-
-	public ConfigurableComposedAdapterFactory getCBSAdapterFactory() {
-		return contentLayoutAdapterFactory.cbsAdapterFactory;
-	}
-
-	public ConfigurableComposedAdapterFactory getDiagramAdapterFactory() {
-		return diagramLayoutAdapterFactory.wbsAdapterFactory;
-	}
-	
-	public void setActivityDiagramService(IActivityDiagramService diagramService) {
-		this.diagramService = diagramService;
-	}
-
-	public IActivityDiagramService getActivityDiagramService() {
-		return this.diagramService;
-	}
-
-	public Suppression getSuppression(Process proc)
-	{
-		Suppression sup = null;
-		if ( isPublishingMode)
-		{
-			if ( supressionMap == null )
-			{
-				supressionMap = new HashMap();
-			}
-			String guid = proc.getGuid();
-			sup = (Suppression)supressionMap.get(guid);
-			if ( sup == null )
-			{
-				sup = createSuppression(proc);
-				supressionMap.put(guid, sup);
-			}
-		}
-		else
-		{
-			sup = createSuppression(proc);
-		}
-		
-		return sup;
-	}
-	
-	public void prepareAdaptorFactoriesForProcess(Process proc)
-	{
-		// need to iterate the adaptor factory to generate the adaptor tree
-		prepareAdapterfactoryFor(getCBSAdapterFactory(), proc);
-		prepareAdapterfactoryFor(getTBSAdapterFactory(), proc);
-		prepareAdapterfactoryFor(getWBSAdapterFactory(), proc);
-		prepareAdapterfactoryFor(getWPBSAdapterFactory(), proc);
-	}
-	
-	private void prepareAdapterfactoryFor(
-			ComposedAdapterFactory adapterFactory, Object obj) {
-		if (obj == null || adapterFactory == null) {
-			return;
-		}
-
-		ITreeItemContentProvider provider = null;
-
-		if (obj instanceof ITreeItemContentProvider) {
-			provider = (ITreeItemContentProvider) obj;
-		} else {
-			provider = (ITreeItemContentProvider) adapterFactory.adapt(obj,
-					ITreeItemContentProvider.class);
-		}
-
-		if (provider != null) {
-			Collection items = provider.getChildren(obj);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				Object rawitem = it.next();
-
-				MethodElement item = (MethodElement) LibraryUtil
-						.unwrap(rawitem);
-				if ((item instanceof Activity)) {
-					prepareAdapterfactoryFor(adapterFactory, rawitem);
-				}
-			}
-		}
-	}
-	
-	private IElementLayout createLayout(MethodElement element) {
-		
-		// if the element is an activity, we need to fined the path to the process
-		String path = null;
-		Process owningProc = null;
-		if ( element instanceof Activity )
-		{
-			Activity act = (Activity)element;
-			path = AbstractProcessElementLayout.getPath(act);
-			owningProc = TngUtil.getOwningProcess(act);
-		}
-		
-		return createLayout(element, owningProc, path);
-	}
-
-	public IElementLayout createLayout(MethodElement element,
-			Process owningProc, String path) {
-		AbstractElementLayout layout = null;
-
-		String className;
-		if (ConfigurationHelper.isDescriptionElement(element)) {
-			className = "ContentDescription"; //$NON-NLS-1$
-		} else if (element instanceof Activity) {
-			className = "Activity"; //$NON-NLS-1$
-		} else if ((element instanceof WorkBreakdownElement)
-				&& !(element instanceof TaskDescriptor)) {
-			className = "WorkBreakdownElement"; //$NON-NLS-1$  // taskdescriptor has it's own layout
-		} else {
-			Class i[] = element.getClass().getInterfaces();
-			if (i != null && i.length == 1) {
-				className = i[0].getName();
-			} else {
-				className = element.getClass().getName();
-			}
-
-			int index = className.lastIndexOf("."); //$NON-NLS-1$
-			if (index >= 0) {
-				className = className.substring(index + 1);
-			}
-		}
-
-		className = PACKAGE_NAME + ".elements." + className + "Layout"; //$NON-NLS-1$ //$NON-NLS-2$
-
-		try {
-			Class c = Class.forName(className);
-			if (c != null) {
-				layout = (AbstractElementLayout) c.newInstance();
-			}
-		} catch (Exception ex) {
-			// ex.printStackTrace();
-		}
-
-		if (layout == null) {
-			// System.out.println("Layout class '" + className + "' for element
-			// '" + element.getName() + "' not defined. Use GeneralLayout");
-			layout = new GeneralLayout();
-		}
-
-		if (layout instanceof AbstractProcessElementLayout) {
-			((AbstractProcessElementLayout) layout).init(this, element,
-					owningProc, path);
-		} else {
-			layout.init(this, element);
-		}
-
-		return layout;
-	}
-
-	public IElementLayout getLayout(MethodElement element, boolean create) {
-		// String id = element.getGuid();
-		IElementLayout layout = null; // (IElementLayout)layoutMap.get(id);
-		if ((layout == null) && create) {
-			layout = createLayout(element);
-			// layoutMap.put(id, layout);
-		}
-
-		return layout;
-	}
-
-	private static final Pattern p_parameters = Pattern
-			.compile(
-					"\\?proc=(.*?)&path=(.*)?", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public IElementLayout getLayout(String url) {
-
-		Process owningProc = null;
-		String path = null;
-
-		Matcher m = p_parameters.matcher(url);
-		if (m.find()) {
-			String proc = m.group(1);
-			path = m.group(2);
-			ILibraryManager manager = LibraryService.getInstance()
-			.getCurrentLibraryManager();
-			if (manager != null) {
-				owningProc = (Process) manager.getMethodElement(
-						proc);
-			}
-		}
-
-		// MethodElement element = (MethodElement)urlMap.get(url);
-		MethodElement element = ResourceHelper.getElementFromFileName(url);
-		if (element != null) {
-			return createLayout(element, owningProc, path);
-		} else {
-			System.out.println("Can't find element for url '" + url + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return null;
-
-	}
-
-	public static String getQueryString(String proc, String path) {
-		return "?" + ResourceHelper.URL_PARAMETER_PROCESS + "=" + proc + "&" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ ResourceHelper.URL_PARAMETER_PATH + "=" + path; //$NON-NLS-1$
-	}
-
-	public MethodConfiguration getConfiguration() {
-		return this.config;
-	}
-
-	public void setPublishDir(String path) {
-		this.publish_dir = path;
-		if ( !this.publish_dir.endsWith(File.separator) ) {
-			this.publish_dir += File.separator;
-		}
-
-		// initialize publishing site if needed
-		init_publishingSite();
-
-	}
-
-	public String getPublishDir() {
-		return this.publish_dir;
-	}
-
-	private void init_publishingSite() {
-		if ( BrowsingLayoutSettings.INSTANCE.needUpdate(publish_dir) ) {
-			if ( LibraryPlugin.getDefault().isDebugging() ) {
-				System.out
-						.println("Begin initializing publishing site: " + publish_dir); //$NON-NLS-1$
-			}
-			
-			// copy the layout files from plugin layout to publishign site
-			LayoutResources.copyLayoutFiles(publish_dir);
-	
-			if ( LibraryPlugin.getDefault().isDebugging() ) {
-				System.out.println("End initializing publishing site: " + publish_dir); //$NON-NLS-1$
-			}
-		}
-	}
-
-//	public void copyLibraryResources() {
-//		if ( LibraryPlugin.getDefault().isDebugging() ) {
-//			System.out
-//					.println("Begin copying library resources to publishing site: " + publish_dir); //$NON-NLS-1$
-//		}
-//		
-//		// copy library resources from library to publishing site
-//		File libRoot = new File(LibraryService.getInstance().getCurrentMethodLibraryPath());
-//		if (libRoot != null) {
-//			LayoutResources.copyDir(libRoot.getPath(), publish_dir);
-//		}
-//
-//		if ( LibraryPlugin.getDefault().isDebugging() ) {
-//			System.out
-//					.println("End copying library resources to publishing site: " + publish_dir); //$NON-NLS-1$
-//		}
-//	}
-
-	public void clear() {
-		// layoutMap.clear();
-		
-		diagramService = null;
-		
-		if ( supressionMap != null )
-		{
-			supressionMap.clear();
-		}
-		
-		layoutExtensions.clear();
-		layoutExtensions = null;
-		
-		contentLayoutAdapterFactory.clear();
-		diagramLayoutAdapterFactory.clear();
-		
-		if ( validator != null )
-		{
-			validator.dispose();
-			validator = null;
-		}
-		
-		if ( realizer != null ) {
-			realizer.dispose();
-			realizer = null;
-		}
-		
-		if ( contentLayoutAdapterFactory != null ) {
-			contentLayoutAdapterFactory.clear();
-			contentLayoutAdapterFactory = null;			
-		}
-		
-		if ( diagramLayoutAdapterFactory != null ) {
-			diagramLayoutAdapterFactory.clear();
-			diagramLayoutAdapterFactory = null;			
-		}
-		 
-	}
-
-	public class LayoutAdapterFactory
-	{
-		public ConfigurableComposedAdapterFactory wbsAdapterFactory = null;
-		public ConfigurableComposedAdapterFactory tbsAdapterFactory = null;
-		public ConfigurableComposedAdapterFactory wpbsAdapterFactory = null;
-		public ConfigurableComposedAdapterFactory cbsAdapterFactory = null;
-
-		ProcessAdapterFactoryFilter configurator = null;
-		
-		public LayoutAdapterFactory(MethodConfiguration methodConfig)
-		{
-			// create adapt factories
-			//
-			if(isPublishingMode()) {
-				wbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createPublishingWBSAdapterFactory();
-				tbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createPublishingTBSAdapterFactory();
-				wpbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createPublishingWPBSAdapterFactory();
-				cbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createPublishingCBSAdapterFactory();
-			}
-			else {
-				wbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createWBSComposedAdapterFactory();
-				tbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createTBSComposedAdapterFactory();
-				wpbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createWPBSComposedAdapterFactory();
-				cbsAdapterFactory = (ConfigurableComposedAdapterFactory) TngAdapterFactory.INSTANCE
-				.createProcessComposedAdapterFactory();
-			}
-
-			// set configuration filter
-			configurator = new ProcessAdapterFactoryFilter(methodConfig, this);
-
-			wbsAdapterFactory.setFilter(configurator);
-			tbsAdapterFactory.setFilter(configurator);
-			wpbsAdapterFactory.setFilter(configurator);
-			cbsAdapterFactory.setFilter(configurator);		
-		}
-		
-		public IFilter getFilter() {
-			return configurator;
-		}
-		
-		public void clear()
-		{
-			
-			if (wbsAdapterFactory != null) {
-				wbsAdapterFactory.setFilter(null);
-				wbsAdapterFactory.dispose();
-				wbsAdapterFactory = null;
-			}
-
-			if (tbsAdapterFactory != null) {
-				tbsAdapterFactory.setFilter(null);
-				tbsAdapterFactory.dispose();
-				tbsAdapterFactory = null;
-			}
-
-			if (wpbsAdapterFactory != null) {
-				wpbsAdapterFactory.setFilter(null);
-				wpbsAdapterFactory.dispose();
-				wpbsAdapterFactory = null;
-			}
-
-			if (cbsAdapterFactory != null) {
-				cbsAdapterFactory.setFilter(null);
-				cbsAdapterFactory.dispose();
-				cbsAdapterFactory = null;
-			}
-			
-			if ( configurator != null ) {
-				configurator.dispose();
-				configurator = null;
-			}
-		}
-	}
-	
-	private Suppression createSuppression(Process proc) {
-		// check if there are extensions
-		if ( layoutExtensions != null && layoutExtensions.size() > 0 ) {
-			for ( Iterator<LayoutExtension> it = layoutExtensions.values().iterator(); it.hasNext(); ) {
-				LayoutExtension ext = it.next();
-				Suppression sup = ext.getSuppression(proc);
-				if ( sup != null ) {
-					return sup;
-				}
-			}
-		}
-		
-		return new Suppression(proc);
-	}
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/HtmlBuilder.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/HtmlBuilder.java
deleted file mode 100644
index 8c78b77..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/HtmlBuilder.java
+++ /dev/null
@@ -1,524 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
-
-import org.eclipse.epf.common.utils.I18nUtil;
-import org.eclipse.epf.common.utils.Timer;
-import org.eclipse.epf.common.xml.XSLTProcessor;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.layout.util.XmlHelper;
-import org.eclipse.epf.library.prefs.PreferenceUtil;
-import org.eclipse.epf.library.util.ContentResourceScanner;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-
-import com.ibm.icu.util.Calendar;
-
-
-/**
- * Generates the HTML page for a Method element.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class HtmlBuilder {
-
-	private boolean debug = false;
-
-	private Properties xslParams = null;
-
-	private ElementLayoutManager mgr = null;
-
-	private ElementLayoutManager internal_mgr = null;
-
-	//private ContentResourceScanner scanner = null;
-
-	private boolean scanContent = true;
-
-	// If true, display the "Show tree browse" image/link to the right of a
-	// published page.
-	private boolean showTreeBrowser = false;
-
-	//private IContentValidator validator = null;
-
-	// override this path to specify xsl path
-	private String layoutXslRootPath = LibraryPlugin.getDefault().getLayoutXslPath();
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public HtmlBuilder() {
-		this(null);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public HtmlBuilder(ElementLayoutManager mgr) {
-		init();
-		setLayoutManager(mgr);
-	}
-	
-	public void setLayoutXslRootPath(String path) {
-		try {
-			if ( path != null && path.length() > 0 ) {
-				this.layoutXslRootPath = path;
-				if ( !this.layoutXslRootPath.endsWith(File.separator) ) {
-					this.layoutXslRootPath += File.separator;
-				}
-				
-				// get the localized file
-				File file = new File(this.layoutXslRootPath, "resources.properties"); //$NON-NLS-1$
-				Locale locale = Locale.getDefault();
-				String localFileName = I18nUtil.getLocalizedFile(file.getAbsolutePath(), locale);
-				if ( localFileName != null ) {
-					file = new File(localFileName);
-				}
-				if (file.exists()) {
-					xslParams.load(new FileInputStream(file));
-				}	
-				
-				// the PreferenceUtil also uses the xsl properties for activity breakdown layout
-				// so set it as well
-				PreferenceUtil.setXslProperties(xslParams);
-			}
-		} catch (IOException e) {
-		}
-	}
-	
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		debug = LibraryPlugin.getDefault().isDebugging();
-		loadDefaultLayoutXsl();
-	}
-
-	public void loadDefaultLayoutXsl() {
-		layoutXslRootPath = LibraryPlugin.getDefault().getLayoutXslPath();
-		try {
-			xslParams = LibraryPlugin.getDefault().getProperties(
-					"/layout/xsl/resources.properties"); //$NON-NLS-1$
-			
-			// add the colon property, 
-			xslParams.put("colon_with_space", LibraryResources.colon_with_space); //$NON-NLS-1$
-			
-			// the PreferenceUtil also uses the xsl properties for activity breakdown layout
-			// so set it as well
-			PreferenceUtil.setXslProperties(xslParams);
-
-			
-		} catch (IOException e) {
-			xslParams = null;
-		}
-	}
-	
-	/**
-	 * Returns the publish directory.
-	 */
-	public String getPublishDir() {
-		return (mgr == null) ? null : mgr.getPublishDir();
-	}
-
-	/**
-	 * Returns the publish directory.
-	 */
-	public void setPublishDir(String dir) {
-		if (mgr != null) {
-			mgr.setPublishDir(dir);
-		}
-
-		//getScanner().setTargetRootPath(new File(getPublishDir()));
-
-		// Reset the validator's publish dir.
-		getValidator().setPublishDir(dir);
-	}
-
-//	/**
-//	 * Sets the content validator.
-//	 */
-//	public void setValidator(IContentValidator validator) {
-//		this.validator = validator;
-//		getScanner().setValidator(this.validator);
-//	}
-
-	/**
-	 * Returns the content validator.
-	 */
-	public IContentValidator getValidator() {
-//		if (validator == null) {
-//			validator = new DefaultContentValidator(getPublishDir());
-//		}
-//		return validator;
-		
-		return this.mgr.getValidator();
-	}
-
-//	/**
-//	 * Returns the content resource scanner for the element.
-//	 */
-//	private ContentResourceScanner getScanner(MethodElement owner) {
-//		ILibraryResourceManager resMgr = ResourceHelper.getResourceMgr(owner);
-//		if ( resMgr == null ) {
-//			return null;
-//		}
-//		
-//		String rootContentPath = resMgr.getLogicalPluginPath(owner);
-//		File src_root = new File(resMgr.getPhysicalPluginPath(owner));
-//		File tgt_root = new File(getPublishDir(), rootContentPath);
-//		ContentResourceScanner scanner = new ContentResourceScanner(src_root, tgt_root, rootContentPath, getValidator());
-//
-//		return scanner;
-//	}
-
-	/**
-	 * Sets the flag to display the "Show tree browser" image/link.
-	 */
-	public void enableTreeBrowser(boolean flag) {
-		this.showTreeBrowser = flag;
-	}
-
-	/**
-	 * Enables content scanning.
-	 */
-	public void enableContentScan(boolean scan) {
-		this.scanContent = scan;
-	}
-
-	/**
-	 * Returns <code>true</code> if content scanning is enabled.
-	 */
-	public boolean contentScanEnabled() {
-		return scanContent;
-	}
-
-	/**
-	 * Sets the Element Layout Manager.
-	 * <p>
-	 * A Element Layout Manager is associated with a configuration.
-	 */
-	public void setLayoutManager(ElementLayoutManager mgr) {
-		this.mgr = mgr;
-		if (this.mgr == null) {
-			this.mgr = getDefaultLayoutManager(); 
-		}
-
-		// Update the scanner target path.
-		//getScanner().setTargetRootPath(new File(getPublishDir()));
-
-		// Reset the validator pub dir.
-		getValidator().setPublishDir(getPublishDir());
-	}
-
-	/**
-	 * Returns the default Element Layout Manager.
-	 */
-	private ElementLayoutManager getDefaultLayoutManager() {
-		if ( this.internal_mgr == null ) {
-			this.internal_mgr = new ElementLayoutManager();
-		}
-		
-		return this.internal_mgr;
-	}
-
-	/**
-	 * Returns the Element Layout Manager.
-	 */
-	public ElementLayoutManager getLayoutManager() {
-		if (this.mgr == null) {
-			this.mgr = getDefaultLayoutManager();
-		}
-		return mgr;
-	}
-
-	/**
-	 * Generates the HTML for a Method element.
-	 * 
-	 * @param element
-	 *            A Method element.
-	 * @return A url of the generated content HTML file.
-	 */
-	public String generateHtml(MethodElement element) {
-		String url = null;
-		if (debug) {
-			long startTime = System.currentTimeMillis();
-			IElementLayout layout = getLayoutManager().getLayout(element, true);
-			url = generateHtml(layout);
-			long endTime = System.currentTimeMillis();
-			System.out
-					.println("Time taken to render HTML page for " + element.getName() + //$NON-NLS-1$
-							": " + (endTime - startTime) + " ms"); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			IElementLayout layout = getLayoutManager().getLayout(element, true);
-			url = generateHtml(layout);
-		}
-		return url;
-	}
-
-
-	/**
-	 * Generates the HTML for a Method element.
-	 * 
-	 * @param url
-	 *            The URL of a Method element.
-	 */
-	public void generateHtml(String url) {
-		IElementLayout layout = getLayoutManager().getLayout(url);
-		generateHtml(layout);
-	}
-
-	/**
-	 * Generates the HTML for a Method element.
-	 * 
-	 * @param layout
-	 *            A Method Element. Layout object.
-	 * @param linkedElements
-	 *            If not null, this object will be populated with a list of
-	 *            linked elements in the page.
-	 * @return A url of the generated content HTML file.
-	 */
-	public String generateHtml(IElementLayout layout) {
-		if (layout == null) {
-			return "about:blank"; //$NON-NLS-1$
-		}
-
-		//System.out.println("*** generateHtml: " + LibraryUtil.getTypeName(layout.getElement()) );
-		
-		// add time logging when publishing element
-		long time_start = Calendar.getInstance().getTimeInMillis();
-		String elementPath = layout.getFilePath().replace('/',
-				File.separatorChar);
-		String elementPathName = elementPath
-				+ layout.getFileName(ResourceHelper.FILE_EXT_HTML);
-		String filePath = this.getPublishDir() + elementPath;
-		String html_file = this.getPublishDir() + elementPathName;
-
-		try {
-
-			StringBuffer xml = getXml(layout);
-
-			String xsl_uri;
-
-			File f = new File(filePath);
-			if (!f.exists()) {
-				f.mkdirs();
-			}
-
-			// Generate the additonal outputs.
-			List layouts = layout.getLayouts();
-			xsl_uri = layoutXslRootPath + layout.getXslUrl();
-			generateHtml(layout, xsl_uri, html_file, xml);
-
-			// Generate other layout files.
-			if (layouts != null && layouts.size() > 0) {
-				for (Iterator it = layouts.iterator(); it.hasNext();) {
-					LayoutInfo info = (LayoutInfo) it.next();
-					xsl_uri = layoutXslRootPath + info.layout_xsl;
-					String file = filePath + info.fileName;
-					generateHtml(layout, xsl_uri, file, xml);
-				}
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			html_file = null;
-		}
-
-		long time_end = Calendar.getInstance().getTimeInMillis();
-		long mini_seconds = time_end - time_start;
-		if (mini_seconds > 1000) {
-			String msg = mini_seconds
-					+ " mini-second(s) publishing element " + LibraryUtil.getTypeName(layout.getElement()) + "[" + elementPathName + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			IContentValidator validator = getValidator();
-			if (validator == null) {
-				System.out.println(msg);
-			} else {
-				validator.logInfo(msg);
-			}
-		}
-		if (html_file != null) {
-			return html_file;
-		}
-
-		return "about:blank"; //$NON-NLS-1$
-	}
-
-	/**
-	 * Generates the HTML for a Method element.
-	 * 
-	 * @param layout
-	 *            A Method Element. Layout object.
-	 * @param xslURI
-	 *            The XSL stylesheet.
-	 * @param htmlFile
-	 *            The HTML file to be generated.
-	 * @param xml
-	 *            The XML buffer.
-	 * @return A url of the generated content HTML file.
-	 */
-	private void generateHtml(IElementLayout layout,
-			String xsl_uri, String html_file, StringBuffer xml) {
-		Throwable th = null;
-		if (layout == null) {
-			return;
-		}
-
-		Timer timer = null;
-		if ( debug ) {
-			timer = new Timer();
-		}
-		
-		try {
-			StringWriter sw = new StringWriter();
-			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, sw);
-			sw.flush();
-			String content = sw.getBuffer().toString();
-
-			if ( debug) {
-				timer.stop();
-				System.out.println(timer.getTime() + " mini seconds for xml/xslt transformation"); //$NON-NLS-1$
-				timer.start();
-			}
-			// Always validate and fix the content before publishing.
-			content = ResourceHelper.validateContent(layout.getElement(),
-					content, getValidator(), layout.getLayoutMgr()
-							.getConfiguration());
-			if (contentScanEnabled()) {
-//				scanContentForResources(layout.getElement(), content, layout
-//						.getFilePath());
-				getValidator().scanContent(layout, content);
-			}
-
-			if ( debug) {
-				timer.stop();
-				System.out.println(timer.getTime() + " mini seconds scanning content"); //$NON-NLS-1$
-				timer.start();
-			}
-			
-			OutputStreamWriter output = new OutputStreamWriter(
-					new FileOutputStream(html_file), "utf-8"); //$NON-NLS-1$
-			output.write(content);
-			output.flush();
-			output.close();
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-			th = e;
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-			th = e;
-		} catch (IOException e) {
-			e.printStackTrace();
-			th = e;
-		} catch (Exception e) {
-			e.printStackTrace();
-			th = e;
-		}
-
-		if (th != null) {
-			this.getValidator().logError(layout.getElement(),
-					"Error generating element content", th); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Generates the HTML for a Method element.
-	 * 
-	 * @param layout
-	 *            A Method Element. Layout object.
-	 * @return A url of the generated content HTML file.
-	 */
-	private StringBuffer getXml(IElementLayout layout) {
-		StringBuffer xml = new StringBuffer();
-		XmlElement xmlElement = layout.getXmlElement(true);
-		
-		// set the language attribute
-		Locale locale = Locale.getDefault();
-		String lang = locale.getLanguage();
-		xmlElement.setAttribute("lang", lang); //$NON-NLS-1$
-
-		if (showTreeBrowser) {
-			xmlElement.setAttribute("showTreeBrowser", "true"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		xml.append(XmlHelper.XML_HEADER).append(xmlElement.toXml());
-
-		if ( debug ) {
-			try {
-				String xml_file = this.getPublishDir() + "xml" + File.separator; //$NON-NLS-1$
-				xml_file += layout.getType() + "." + layout.getFileName(".xml"); //$NON-NLS-1$ //$NON-NLS-2$
-				File xf = new File(xml_file);
-				if ( !xf.exists() )
-				{
-					xf.getParentFile().mkdirs();
-					xf.createNewFile();
-				}
-							
-				OutputStreamWriter output = new OutputStreamWriter(
-						new FileOutputStream(xf), "utf-8"); //$NON-NLS-1$
-				output.write(xml.toString());
-				output.flush();
-				output.close();
-	
-				// FileWriter xw = new FileWriter(xml_file);
-				// xw.write(xml.toString());
-				// xw.flush();
-				// xw.close();
-			} catch (Exception ex) {
-				ex.printStackTrace();
-			}
-		}
-		
-		return xml;
-	}
-
-//	/**
-//	 * Scans the content for resource references.
-//	 */
-//	private void scanContentForResources(MethodElement owner, String content,
-//			String contentPath) {
-//		ContentResourceScanner scanner = getScanner(owner);
-//		if ( scanner != null ) {
-//			scanner.resolveResources(owner, content, contentPath);
-//		}
-//	}
-
-	public void dispose() {
-//		if (validator != null) {
-//			validator.dispose();
-//		}
-
-		if ( internal_mgr != null ) {
-			internal_mgr.clear();
-			internal_mgr = null;
-		}
-		
-		mgr = null;
-//		scanner = null;
-//		validator = null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/IContentValidator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/IContentValidator.java
deleted file mode 100644
index 18458e4..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/IContentValidator.java
+++ /dev/null
@@ -1,179 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.io.File;
-
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * interface for content validator at browsing and publishing
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public interface IContentValidator  {
-
-	/**
-	 * set publish dir
-	 * @param pubDir String
-	 */
-	public void setPublishDir(String pubDir);
-	
-	/**
-	 * show broken links if true
-	 * @return boolean
-	 */
-	public boolean showBrokenLinks();
-	
-	public void scanContent(IElementLayout layout, String content) throws Exception;
-
-	/**
-	 * validate the link attribute and linked text for the owning element within the configuration. 
-	 * Returns a LinkInfo object.
-	 * 
-	 * @param owner {@link MethodElement} the owner element
-	 * @param attributes String the url attributes
-	 * @param text String the linked text
-	 * @param config MethodConfiguration
-	 * @param tag the HTML tag (a, area)
-	 * @return LinkInfo
-	 */
-	public LinkInfo validateLink(MethodElement owner, String attributes,
-			String text, MethodConfiguration config, String tag);
-
-	/**
-	 * log the info for the element
-	 * @param owner MethodElement
-	 * @param message String
-	 */
-	public void logInfo(MethodElement owner, String message);
-
-	/**
-	 * log a missing reference
-	 * @param owner MethodElement
-	 * @param refElement MethodElement the referneced element that is missing in configuration
-	 */
-	public void logMissingReference(MethodElement owner,
-			MethodElement refElement);
-
-	/**
-	 * log a missing reference
-	 * @param owner MethodElement the owner element
-	 * @param guid String the referenced guid which is not a valid element in the configuration any more
-	 * @param linkedText String the linked text along with the link.
-	 */
-	public void logMissingReference(MethodElement owner, String guid,
-			String linkedText);
-
-	/**
-	 * log a missing resource 
-	 * @param owner MethodElement the owner
-	 * @param resourceFile File the file that owned by the element and references the mising resource, 
-	 * null if the mising reference is referenced by the element itself 
-	 * @param url String the url that can't be resovled to a resource.
-	 */
-	public void logMissingResource(MethodElement owner, File resourceFile,
-			String url);
-
-	/**
-	 * logn a warning message
-	 * @param owner MethodElement
-	 * @param message String
-	 */
-	public void logWarning(MethodElement owner, String message);
-
-	/**
-	 * log an error message
-	 * @param owner MethodElement
-	 * @param message String
-	 * @param th Throwable, null if not
-	 */
-	public void logError(MethodElement owner, String message, Throwable th);
-
-	/**
-	 * log an invalid external link
-	 * @param owner MethodElement
-	 * @param url String the url
-	 * @param message String
-	 */
-	public void logInvalidExternalLink(MethodElement owner, String url,
-			String message);
-
-	/**
-	 * log a message
-	 * @param message String
-	 */
-	public void logInfo(String message);
-
-	/**
-	 * log a warning
-	 * @param message String
- 	 */
-	public void logWarning(String message);
-
-	/**
-	 * log an error
-	 * @param message String
-	 * @param th Throwable
-	 */
-	public void logError(String message, Throwable th);
-
-	/**
-	 * check if the element is discarded or not
-	 * discarded elements will be treated as out side the configursation
-	 * 
-	 * @param owner MethodElement the owner of the element
-	 * @param Object feature EStructuralFeature or OppositeFeature
-	 * @param e MethodElement the element to be checked
-	 */
-	public boolean isDiscarded(MethodElement owner, Object feature, MethodElement e);
-
-	/**
-	 * set an discarded element
-	 * @param e MethodElement
-	 */
-	public void setDiscardedElement(MethodElement e);
-
-	/**
-	 * dispose the object and free resources
-	 *
-	 */
-	public void dispose();
-		
-	/**
-	 * add a referneced element
-	 * 
-	 * @param owner MethodElement
-	 * @param e MethodElement the element referenced by the owner element
-	 */
-	public void addReferencedElement(MethodElement owner, MethodElement e);
-		
-	/**
-	 * get the flag about showing extra information from the linked elements for descriptors
-	 * @return boolean
-	 */
-	public boolean showExtraInfoForDescriptors();
-
-	/**
-	 * show descriptors on method element page
-	 */
-	public boolean showRelatedDescriptors();
-	
-	/**
-	 * get the tab id for the activity layout
-	 * 
-	 * @return String
-	 */
-	public String getDefaultActivityTab();
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/IElementLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/IElementLayout.java
deleted file mode 100644
index 822922d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/IElementLayout.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.util.List;
-
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * This is the interface for element layout. any element layout should implement this interface.
- * An element layout defines how the element should be rendered in browsing and publishing.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface IElementLayout {
-
-	/**
-	 * get the element id, which is the element's GUID
-	 * 
-	 * @return
-	 */
-	public String getId();
-
-	/**
-	 * the type of the element
-	 * 
-	 * @return String
-	 */
-	public String getType();
-
-	/**
-	 * the name of the element
-	 * @return String
-	 */
-	public String getName();
-
-	/**
-	 * the realized presentation name of the element
-	 * @return String
-	 */
-	public String getDisplayName();
-
-	/**
-	 * the url of the element
-	 * @return String
-	 */
-	public String getUrl();
-
-	/**
-	 * the url for shape icon of the element
-	 * @return String
-	 */
-	public String getShapeiconUrl();
-
-	/**
-	 * the url for node icon of the element
-	 * @return String
-	 */
-	public String getNodeiconUrl();
-
-	/**
-	 * the url for diagram icon of the element, 
-	 * for example, the icon for a role in the role-task-wp relationship diagram.
-	 * @return String
-	 */
-	public String getDiagramiconUrl(); // icon for diagram such as Role diagram
-
-	/**
-	 * the layout xsl url
-	 * @return String
-	 */
-	public String getXslUrl();
-
-	/**
-	 * the back path of the element relative to the publishing root dir.
-	 * @return String
-	 */
-	public String getBackPath();
-
-	/**
-	 * get the file path relative to the publishing root
-	 * 
-	 * @return String
-	 */
-	public String getFilePath();
-
-	/**
-	 * get the file path relative to another element. This is the
-	 * relativeTo.backpath + this.elementpath
-	 * 
-	 * @param relativeTo
-	 * @return String
-	 */
-	public String getFilePath(IElementLayout relativeTo);
-
-	/**
-	 * get the file name of the element, with the given extension.
-	 * @param ext String extension, such as ".html"
-	 * @return String
-	 */
-	public String getFileName(String ext);
-
-	/**
-	 * get the element 
-	 * @return MethodElement
-	 */
-	public MethodElement getElement();
-
-	/**
-	 * get the layout manager for randering the layout of the element.
-	 * 
-	 * @return ElementLayoutManager
-	 */
-	public ElementLayoutManager getLayoutMgr();
-
-	/**
-	 * get the XmlElement for the element layout.
-	 * 
-	 * @param includeReferences
-	 *            true to include the xml of the referenced element. false to
-	 *            ignore the xml of the references.
-	 * @return XmlElement
-	 */
-	public XmlElement getXmlElement(boolean includeReferences);
-
-	/**
-	 * return a list of LayoutInfo objects
-	 * 
-	 * @return a list of LayoutInfo objects
-	 */
-	public List getLayouts();
-
-
-	/**
-	 * if the element's content is target for another element, set it here. for
-	 * example, step content cat target for a Task or a task descriptor
-	 * copyright content can target to different elements.
-	 * 
-	 * The purpose of this is that the system will fix the links in the content
-	 * to relative to the target element.
-	 */
-	public void setContentTarget(MethodElement targetElement);
-
-	/**
-	 * need to set the owner of the current layout element. In most cases this
-	 * should be the eContainer of the element. This is needed because in some
-	 * situation the element does not have an owner when the object is created.
-	 * For example, the ContentDescription object's eContiner is null if the
-	 * content file is not saved.
-	 * 
-	 * @param owner
-	 *            MethodElement
-	 */
-	public void setElementOwner(MethodElement owner);
-
-	/**
-	 * check if the html content generated from this xsl file needs to be scanned or not
-	 * scan the content is for identifying element references in the content and copy over resource files
-	 * in some cases we don't need to scan the content, for example, the activity breakdown structure
-	 * 
-	 * @param xslUrl the xsl that html is generated from, null for the default xsl layout
-	 * @return boolean
-	 */
-	public boolean needContentScan(String xslUrl);
-	
-	/**
-	 * 
-	 * @param show
-	 * @deprecated this method is not needed any more
-	 */
-	public void setShowElementLink(boolean show);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutExtension.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutExtension.java
deleted file mode 100644
index 2a2acec..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutExtension.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.eclipse.epf.library.layout;
-
-import org.eclipse.epf.library.configuration.ElementRealizer;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.uma.Process;
-
-/**
- * abstract base class for layout extendsion
- * @author Jinhua Xi
- *
- */
-public abstract class LayoutExtension {
-
-	protected ElementLayoutManager layoutMgr;
-	
-	/**
-	 * default constructor
-	 *
-	 */
-	public LayoutExtension() {
-		
-	}
-	
-	public void init(ElementLayoutManager layoutMgr) {
-		this.layoutMgr = layoutMgr;
-	}
-	
-	public abstract ElementRealizer getElementRealizer();
-	
-	/**
-	 * Returns the content validator.
-	 */
-	public abstract IContentValidator getValidator();
-	
-	public abstract Suppression getSuppression(Process proc);
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutExtensionFactory.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutExtensionFactory.java
deleted file mode 100644
index dcae39a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutExtensionFactory.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.CreateLibraryManagerException;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.internal.LibraryManagerElement;
-import org.eclipse.epf.services.Services;
-import org.osgi.framework.Bundle;
-
-/**
- * Manages the LayoutExtension contributions
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LayoutExtensionFactory {
-
-	/**
-	 * The extension point namespace.
-	 */
-	public static final String EXTENSION_POINT_NAMESPACE = "org.eclipse.epf.library"; //$NON-NLS-1$
-
-	/**
-	 * The extension point name.
-	 */
-	public static final String EXTENSION_POINT_NAME = "elementLayoutExtensions"; //$NON-NLS-1$
-
-	/**
-	 * The "class" attribute name.
-	 */
-	public static final String CLASS_ATTRIB_NAME = "class"; //$NON-NLS-1$
-
-	/**
-	 * The "id" attribute name.
-	 */
-	public static final String ID_ATTRIB_NAME = "id"; //$NON-NLS-1$
-
-	// The shared instance.
-	private static LayoutExtensionFactory instance = null;
-
-	// A map of library manager configuration elements.
-	private Map<String, LayoutExtensionElement> layoutElements = new HashMap<String, LayoutExtensionElement>();
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static synchronized LayoutExtensionFactory getInstance() {
-		if (instance == null) {
-			instance = new LayoutExtensionFactory();
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private LayoutExtensionFactory() {
-		init();
-	}
-
-	/**
-	 * Performs the necessary initialization.
-	 */
-	protected void init() {
-		// Process the "org.eclipse.epf.library.libraryManagers" extension point
-		// contributors.
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				EXTENSION_POINT_NAMESPACE, EXTENSION_POINT_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				Bundle bundle = Platform.getBundle(pluginId);
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String className = configElement
-								.getAttribute(CLASS_ATTRIB_NAME);
-						String id = configElement
-								.getAttribute(ID_ATTRIB_NAME);
-						if (className != null && className.trim().length() > 0
-								&& id != null && id.trim().length() > 0) {							
-							LayoutExtensionElement provider = layoutElements.get(id);
-							if(provider == null ) {
-								provider = new LayoutExtensionElement(
-										bundle, className, id);
-								layoutElements.put(id, provider);
-							}
-						}
-					} catch (Exception e) {
-						LibraryPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-		}
-	}
-
-	public boolean hasExtension(String id) {
-		return layoutElements.containsKey(id);
-	}
-	
-	/**
-	 * Creates layout extension.
-	 * 
-	 * @param id the extension id
-	 * @return LayoutExtension
-	 */
-	public LayoutExtension createExtension(String id) {
-		
-		if ( !hasExtension(id) ) {
-			return null;
-		}
-		
-		LayoutExtensionElement provider = (LayoutExtensionElement) layoutElements.get(id);
-		try {
-			Class clazz = provider.bundle.loadClass(provider.className);
-			return (LayoutExtension) clazz.newInstance();
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-		}
-		
-		return null;
-	}
-
-	private class LayoutExtensionElement {
-		Bundle bundle;
-		String className;
-		String id;
-		private LayoutExtensionElement(Bundle bundle, String className, String id) {
-			this.bundle = bundle;
-			this.className = className;
-			this.id = id;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutInfo.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutInfo.java
deleted file mode 100644
index c6885a5..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutInfo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-/**
- * lLyout info for an element.
- * <p>
- * This is used when an element output more then one layout, such as activity
- * tabs
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LayoutInfo {
-
-	public LayoutInfo(String name, String xsl, String fileName,
-			boolean isPrimary) {
-		this.name = name;
-		this.layout_xsl = xsl;
-		this.fileName = fileName;
-		this.isPrimary = isPrimary;
-	}
-
-	/**
-	 * the name of the layout
-	 */
-	public String name;
-
-	/**
-	 * the layout xsl file name
-	 */
-	public String layout_xsl;
-
-	/**
-	 * the outout file name
-	 */
-	public String fileName;
-
-	/**
-	 * is this the primary layout? this apply to the case when one element has more than one layout.
-	 *  For example, an activity element has 4 layouts.
-	 * 
-	 */
-	public boolean isPrimary;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutResources.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutResources.java
deleted file mode 100644
index 50d5548..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutResources.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.io.File;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Copy;
-import org.apache.tools.ant.taskdefs.Expand;
-import org.apache.tools.ant.types.FileSet;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.LibraryPlugin;
-
-import com.ibm.icu.util.Calendar;
-
-
-/**
- * a utility class to handle layout related resources.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LayoutResources {
-
-	private static ResourceBundle resourceBundle;
-
-	private static ResourceBundle shapeiconBundle;
-
-	private static String TEMP_LAYOUT_DIR = ""; //$NON-NLS-1$
-	static {
-		try {
-			String pkg = LayoutResources.class.getPackage().getName();
-			String resource = LayoutResources.class.getName();
-			resourceBundle = ResourceBundle.getBundle(resource);
-			shapeiconBundle = ResourceBundle.getBundle(pkg
-					+ ".DefaultShapeicons"); //$NON-NLS-1$
-
-			/*
-			 * TEMP_LAYOUT_DIR = getString("temp_layout_dir"); if (
-			 * TEMP_LAYOUT_DIR != null ) { TEMP_LAYOUT_DIR =
-			 * TEMP_LAYOUT_DIR.replace('/', File.separatorChar); }
-			 */
-
-			// Multiple instances of EPF running different libs are sharing the same layout directory
-			// use timestamp to identify each instance
-			// we need to clean the files when the application exit			
-			String userHome = System.getProperty("user.home"); //$NON-NLS-1$
-			TEMP_LAYOUT_DIR = userHome + File.separator
-					+ "EPF" + File.separator + "layout" + File.separator //$NON-NLS-1$ //$NON-NLS-2$
-					+ Long.toHexString(Calendar.getInstance().getTimeInMillis()) + File.separator;
-			
-			File rupTmpDir = new File(TEMP_LAYOUT_DIR);
-			if (!rupTmpDir.exists()) {
-				rupTmpDir.mkdirs();
-			} else {
-				FileUtil.deleteAllFiles(rupTmpDir.getAbsolutePath());
-			}
-
-		} catch (MissingResourceException x) {
-			x.printStackTrace();
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * call this when the application exit
-	 */
-	public static void clear()
-	{
-		try {
-			FileUtil.deleteAllFiles(TEMP_LAYOUT_DIR);
-			
-			// also delete the folder
-			new File(TEMP_LAYOUT_DIR).delete();
-			
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-		
-		// also reset the browser settings so that the layout data will be copied
-		BrowsingLayoutSettings.INSTANCE.setChanged();
-	}
-	
-	/**
-	 * get the default publish path
-	 */
-	public static String getDefaultPublishDir() {
-		return TEMP_LAYOUT_DIR;
-	}
-
-	/**
-	 * get the xsl uri for the given keys
-	 * @param key String
-	 * @param secondKey String
-	 * @return String
-	 */
-	public static String getDefaultXslPath(String key, String secondKey) {
-		String url = getXslUri(key, secondKey);
-
-		if (url != null) {
-			// resolve the file
-			return LibraryPlugin.getDefault().getLayoutXslPath() + url;
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * get the xsl uri for the given keys
-	 * @param key String
-	 * @param secondKey String
-	 * @return String
-	 */
-	public static String getXslUri(String key, String secondKey) {
-		String url = getString(resourceBundle, key.toLowerCase());
-		if ((url == null) && (secondKey != null)) {
-			url = getString(resourceBundle, secondKey.toLowerCase());
-		}
-
-		if (url == null) {
-			url = getString(resourceBundle, "default"); //$NON-NLS-1$
-		}
-
-
-		return url; 
-	}
-	
-	/**
-	 * get the default shape icon url
-	 * @param key String
-	 * @return String
-	 */
-	public static String getDefaultShapeiconUrl(String key) {
-		String url = getString(shapeiconBundle, key);
-		if (url == null) {
-			url = getString(shapeiconBundle, "general"); //$NON-NLS-1$
-		}
-
-		return url;
-	}
-
-	private static String getString(ResourceBundle bundle, String key) {
-		try {
-			return (bundle != null) ? bundle.getString(key) : null;
-		} catch (MissingResourceException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * get resource string for the key
-	 * @param key
-	 * @return String
-	 */
-	public static String getString(String key) {
-		return getString(resourceBundle, key);
-	}
-
-	/**
-	 * copy files from one dir to another
-	 * @param fromDir String
-	 * @param toDir String
-	 */
-	public static void copyDir(String fromDir, String toDir) {
-
-		String includes = "*.*, **/css/*.*, **/icons/*.*, **/images/*.*, **/resources/*.*, **/stylesheets/*.*, **/scripts/*.*"; //$NON-NLS-1$
-		copyDir(fromDir, toDir, includes, null);
-	}
-
-	/**
-	 * copy files from one dir to another, with filters
-	 * @param fromDir String
-	 * @param toDir String
-	 * @param includes String
-	 * @param excludes String
-	 */
-	public static void copyDir(String fromDir, String toDir, String includes,
-			String excludes) {
-		copyDir(new File(fromDir), new File(toDir), includes, excludes);
-	}
-
-	/**
-	 * copy dir
-	 * 
-	 * @param fromDir File
-	 * @param toDir File
-	 * @param includes String
-	 * @param excludes String
-	 */
-	public static void copyDir(File fromDir, File toDir, String includes,
-			String excludes)
-	{
-		copyDir(fromDir, toDir, includes, excludes, true);
-	}
-	
-	/**
-	 * copy dir
-	 * @param fromDir File
-	 * @param toDir File
-	 * @param includes String
-	 * @param excludes String
-	 * @param overwrite boolean true to override existing files
-	 */
-	public static void copyDir(File fromDir, File toDir, String includes,
-			String excludes, boolean overwrite) {
-		Copy cp = new Copy();
-		cp.setOverwrite(overwrite); // only cpoy new files or newer files
-		if (includes != null || excludes != null) {
-			FileSet set = new FileSet();
-			if (includes != null) {
-				set.setIncludes(includes);
-			}
-
-			if (excludes != null) {
-				set.setExcludes(excludes);
-			}
-
-			set.setDir(fromDir);
-			cp.addFileset(set);
-		}
-
-		cp.setTodir(toDir);
-		cp.setProject(new Project());
-		cp.execute();
-
-	}
-
-	/**
-	 * copy the layout files from the library layout path to the specified
-	 * publish folder
-	 * 
-	 * @param toDir
-	 */
-	public static void copyLayoutFiles(String toDir) {
-		// copy the layout files to the temp folder
-		String sourceDir = LibraryPlugin.getDefault().getLayoutPath();
-		copyDir(sourceDir, toDir);
-
-		try {
-			LibraryPlugin.getDefault().copyLocalizedFiles(
-					LibraryPlugin.LAYOUT_SCRIPTS_PATH,
-					new File(toDir, LibraryPlugin.LAYOUT_SCRIPTS_FOLDER), true,
-					false);
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	public static void unzip(File zipFile, File toDir) {
-		Expand exp = new Expand();
-		exp.setOverwrite(true); 
-		exp.setSrc(zipFile);
-		exp.setDest(toDir);
-		exp.setProject(new Project());
-		exp.execute();
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutResources.properties b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutResources.properties
deleted file mode 100644
index 5f10f8e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LayoutResources.properties
+++ /dev/null
@@ -1,79 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-#
-# urls start with the following will be treated as external urls, use | to sperate 
-#
-#externalUrl_startWith=http://|https://|ftp://
-# see all the possible protocals at:
-# http://www.iana.org/assignments/uri-schemes.html
-externalUrl_startWith=[a-zA-Z0-9\\.]{1,15}://
-
-# XSL Stylesheet Mapping for the Method Elements.
-
-# Core Method Elements
-artifact=artifact.xsl
-deliverable=deliverable.xsl
-outcome=outcome.xsl
-role=role.xsl
-task=task.xsl
-
-# Guidance
-checklist=checklist.xsl
-concept=guidance.xsl
-example=guidance_with_attachment.xsl
-guideline=guidance.xsl
-practice=practice.xsl
-report=guidance.xsl
-roadmap=guidance.xsl
-reusableasset=guidance_with_attachment.xsl
-supportingmaterial=guidance.xsl
-template=guidance_with_attachment.xsl
-termdefinition=guidance.xsl
-toolmentor=guidance.xsl
-whitepaper=guidance_with_attachment.xsl
-estimationconsiderations=guidance.xsl
-
-# Content Categories
-customcategory=contentcategory.xsl
-discipline=contentcategory.xsl
-disciplinegrouping=contentcategory.xsl
-domain=contentcategory.xsl
-roleset=contentcategory.xsl
-rolesetgrouping=contentcategory.xsl
-tool=contentcategory.xsl
-workproducttype=contentcategory.xsl
-
-# Process Elements
-# activity layout use the default tab layout xsl
-#was using a refresh to show the default page
-#but caused problem in the navigation history back/forward in browsing
-#so switch to the old way to generate the default layout using the set default tab
-#
-#activity=activity.xsl
-#capabilitypattern=activity.xsl
-#deliveryprocess=activity.xsl
-#iteration=activity.xsl
-#phase=activity.xsl
-#process=activity.xsl
-#processcontribution=activity.xsl
-
-# Descriptors
-compositerole=compositerole.xsl
-milestone=milestone.xsl
-roledescriptor=role_descriptor.xsl
-taskdescriptor=task_descriptor.xsl
-teamprofile=teamprofile.xsl
-workproductdescriptor=artifact_descriptor.xsl
-
-# Misc
-default=default.xsl
-general=general.xsl
-page_not_installed=page_not_installed.xsl
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LinkInfo.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LinkInfo.java
deleted file mode 100644
index e7ac6b3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/LinkInfo.java
+++ /dev/null
@@ -1,473 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Matcher;
-
-import org.eclipse.epf.common.xml.XSLTProcessor;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.layout.util.XmlHelper;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.ProcessComponent;
-
-/**
- * class to process an element link in the content
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LinkInfo {
-
-	public static final String LINK_ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	public static final String LINK_ATTR_GUID = "guid"; //$NON-NLS-1$
-
-	public static final String LINK_ATTR_HREF = "href"; //$NON-NLS-1$
-
-	public static final String LINK_ATTR_KEY = "key"; //$NON-NLS-1$
-
-	public static final String LINK_ATTR_TEXT = "text"; //$NON-NLS-1$
-
-	public static final String LINK_ATTR_NAME = "name"; //$NON-NLS-1$
-
-	private String linkedText = ""; //$NON-NLS-1$
-
-	private MethodElement linkElement = null;
-
-	private MethodElement ownerElement = null;
-
-	private boolean isMissingReference = false;
-
-	private Map<String, String> attributeMap = new LinkedHashMap<String, String>();
-
-	private IContentValidator validator;
-
-	private String pubDir;
-	
-	private String tag;
-	
-	//Temp solution for getting around without having a libMgr during migration
-	//Should be removed when lib loaded during migration is registed with Lib service.
-	private static MethodLibrary library;
-
-	/**
-	 * constructor
-	 * 
-	 * @param owner
-	 * @param validator
-	 * @param pubDir
-	 */
-	public LinkInfo(MethodElement owner, IContentValidator validator,
-			String pubDir, String tag) {
-		this.ownerElement = owner;
-		this.validator = validator;
-		this.pubDir = pubDir;
-		this.tag = tag;
-	}
-
-	/**
-	 * is this an element link?
-	 * @return boolean
-	 */
-	public boolean isElementLink() {
-		return ResourceHelper.isElementLink(getElementLinkType());
-	}
-
-	/**
-	 * get the element link type
-	 * @return String
-	 */
-	public String getElementLinkType() {
-		return getAttribute(LINK_ATTR_CLASS);
-	}
-
-	/**
-	 * get the guid of the element link
-	 * @return String
-	 */
-	public String getGuid() {
-		return getAttribute(LINK_ATTR_GUID);
-	}
-
-	/**
-	 * get the url of the link
-	 * @return String
-	 */
-	public String getUrl() {
-		return getAttribute(LINK_ATTR_HREF);
-	}
-
-	/**
-	 * get the linked text
-	 * @return String
-	 */
-	public String getLinkedText() {
-		return linkedText;
-	}
-
-	/**
-	 * get the linked element
-	 * @return MethodElement
-	 */
-	public MethodElement getLinkedElement() {
-		return linkElement;
-	}
-
-	/**
-	 * get the html for the link.
-	 * 
-	 * @param showBrokenLinks boolean true to show the broken link mark. false to show text only
-	 * @return StringBuffer
-	 */
-	public StringBuffer getHtml(boolean showBrokenLinks) {
-		StringBuffer buffer = new StringBuffer();
-
-		if (isMissingReference && (pubDir != null)) {
-			String url = ""; //$NON-NLS-1$
-			if (!showBrokenLinks) {
-				buffer.append(linkedText);
-				return buffer;
-			}
-
-			url = getMissingElementUrl();
-			buffer
-					.append("<img alt=\"\" src=\"" + ResourceHelper.getBackPath(ownerElement) + "images/no_rup.gif\">&#160;"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			setUrl(url);
-		}
-
-		buffer.append("<" + tag); //$NON-NLS-1$
-
-		for (Iterator<Map.Entry<String, String>> it = attributeMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry<String, String> entry = it.next();
-			String key = entry.getKey();
-			String value = entry.getValue();
-			if (LINK_ATTR_HREF.equals(key)
-					&& (value == null || value.length() == 0)) {
-				continue;
-			}
-
-			buffer.append(" ") //$NON-NLS-1$
-					.append(entry.getKey()).append("=") //$NON-NLS-1$
-					.append("\"").append(entry.getValue()).append("\""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		buffer.append(">").append(linkedText).append("</" + tag + ">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		return buffer;
-	}
-
-	/**
-	 * validate the link attributes
-	 * @param attributes String the link attributes
-	 * @param text String the linked text
-	 * @param config MethodConfiguration
-	 */
-	public void validateLink(String attributes, String text,
-			MethodConfiguration config) {
-		this.linkedText = text;
-
-		Matcher m2 = ResourceHelper.p_tag_attributes.matcher(attributes);
-		while (m2.find()) {
-			String attrName = m2.group(1).trim().toLowerCase();
-			String attrValue = ""; //$NON-NLS-1$
-			if (m2.group(3) != null) {
-				attrValue = m2.group(3).trim();
-			} else if (m2.group(2) != null) {
-				attrValue = m2.group(2).trim();
-			}
-			
-			/*
-			 * if (attrValue.startsWith("\"")) { attrValue =
-			 * attrValue.substring(1); } if (attrValue.endsWith("\"")) {
-			 * attrValue = attrValue.substring(0, attrValue.length() - 1); }
-			 */
-
-			// GVT: Cannot Preview/Browse Description Tab when
-			// the CP contains chinese characters
-			// generated html from xslt got the href urls encoded. we don't want
-			// that make sure decode the url using "UTF-8" encoding
-			if (attrName.equals(LINK_ATTR_HREF)) {
-				try {
-					attrValue = decode(attrValue);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-			attributeMap.put(attrName, attrValue);
-		}
-
-		String guid = getGuid();
-		if (guid == null) {
-			// check if the file contains guid, if yes, need to get the element
-			String url = getUrl();
-			guid = ResourceHelper.getGuidFromFileName(url);
-			if (guid != null) {
-				setGuid(guid);
-			}
-		}
-
-		validateElementUrl(config);
-	}
-
-	protected String decode(String str) throws UnsupportedEncodingException {
-		return URLDecoder.decode(str, "UTF-8"); //$NON-NLS-1$
-	}
-
-	/**
-	 * get attribute
-	 * @param name
-	 * @return String
-	 */
-	private String getAttribute(String name) {
-		return (String) attributeMap.get(name);
-	}
-
-	/**
-	 * set guid
-	 * @param guid String
-	 */
-	private void setGuid(String guid) {
-		attributeMap.put(LINK_ATTR_GUID, guid);
-	}
-
-	public void setUrl(String url) {
-		attributeMap.put(LINK_ATTR_HREF, url);
-	}
-
-	private void validateElementUrl(MethodConfiguration config) {
-		String guid = getGuid();
-		if (guid != null) {
-			MethodElement e = null;
-			e = getMethodElement(guid);
-
-			// if process component, get show the process
-			if (e instanceof ProcessComponent) {
-				e = ((ProcessComponent) e).getProcess();
-			}
-
-			// 156474 - Process Package (either CP package or DP package) can
-			// not be linked in RTE
-			// don't show link for packages.
-			if (e instanceof MethodPackage || e instanceof MethodConfiguration
-					|| e instanceof MethodLibrary) {
-				e = null;
-				// remove the link atytribute
-				setUrl(null);
-				return;
-			}
-
-			if (e != null) {
-				if (config != null) {
-					MethodElement e1 = ConfigurationHelper
-							.getCalculatedElement(e, config);
-					if (e1 != null) {
-						e = e1;
-					} else {
-						isMissingReference = true;
-						validator.logMissingReference(ownerElement, e);
-					}
-				}
-			} else {
-				isMissingReference = true;
-				validator.logMissingReference(ownerElement, guid, linkedText);
-			}
-
-			if (e != null) {
-				guid = e.getGuid();
-				setGuid(guid);
-				String url = getUrl();
-
-				// url can be null, for example, an element link for
-				// presentation name, such as
-				// <a class="PresentationName"
-				// guid="{EE97A8CD-66CA-4A9B-9871-E3B94CCED528}">Project
-				// Manager</a>
-				// we only need to get the element from the guid
-				if (url != null) {
-					url = url.trim();
-					if (!url.toLowerCase().startsWith(
-							ResourceHelper.URL_STR_JAVASCRIPT)) {
-						url = ResourceHelper.getUrl(e, ownerElement,
-								ResourceHelper.FILE_EXT_HTML, url);
-						setUrl(url);
-					}
-				}
-
-				if (isElementLink() && !tag.equals("area")) { //$NON-NLS-1$
-					String text = ResourceHelper.getLinkText(e,
-							getElementLinkType());
-					if (text != null) {
-						// if null, can be used text, don't reset it
-						this.linkedText = text;
-					}
-				}
-
-				if (validator.isDiscarded(ownerElement, null, e)) {
-					isMissingReference = true;
-					validator.logMissingReference(ownerElement, e);
-					e = null; // ignore the element since it's discarded
-				}
-			}
-
-			this.linkElement = e;
-
-		}
-	}
-
-	public static MethodElement getMethodElement(String guid) {
-		MethodElement e;
-		ILibraryManager manager = LibraryService.getInstance()
-				.getCurrentLibraryManager();
-		if (manager != null && getLibrary() == null) {
-			e = manager.getMethodElement(guid);
-		} else {
-			e = getMethodElement_(guid);
-			if (e == null && manager != null) {
-				e = manager.getMethodElement(guid);
-			}
-		}
-		return e;
-	}
-
-	// private static final String MISSING_PAGES_XSL = "pages_not_installed/";
-	// //$NON-NLS-1$
-	private String getMissingElementUrl() {
-		if (!isMissingReference) {
-			return ""; //$NON-NLS-1$
-		}
-
-		String url = null;
-
-		// if (linkElement == null) {
-		// // this is an invalid element, maybe deleted from the library
-		// // already
-		// url = ResourceHelper.MISSING_PAGES_FOLDER + getGuid()
-		// + ResourceHelper.FILE_EXT_HTML;
-		// } else {
-		// url = ResourceHelper.MISSING_PAGES_FOLDER
-		// + ResourceHelper.getFileName(linkElement,
-		// ResourceHelper.FILE_EXT_HTML);
-		// }
-
-		url = ResourceHelper.MISSING_PAGES_FOLDER + "pages_not_installed" //$NON-NLS-1$
-				+ ResourceHelper.FILE_EXT_HTML;
-
-		File f = new File(pubDir, url);
-		File dir = f.getParentFile();
-		if (!dir.exists()) {
-			dir.mkdirs();
-		}
-
-		// if ( !f.exists() )
-		{
-			// generate the html file
-			XmlElement xml = new XmlElement("Element"); //$NON-NLS-1$
-			
-			
-			Locale locale = Locale.getDefault();
-			String lang = locale.getLanguage();
-			xml.setAttribute("lang", lang); //$NON-NLS-1$
-
-
-			if (linkElement == null) {
-				xml.setAttribute("invalidLink", "true") //$NON-NLS-1$ //$NON-NLS-2$
-						.setAttribute("guid", getGuid()) //$NON-NLS-1$
-						.setAttribute("name", linkedText); //$NON-NLS-1$
-			} else {
-				xml
-						.setAttribute("guid", getGuid()) //$NON-NLS-1$
-						.setAttribute("type", linkElement.getType().getName()) //$NON-NLS-1$
-						.setAttribute("name", linkElement.getName()) //$NON-NLS-1$
-						.setAttribute(
-								"pluginName", LibraryUtil.getMethodPlugin(linkElement).getName()); //$NON-NLS-1$
-			}
-			String xslPath = LayoutResources.getDefaultXslPath(
-					"page_not_installed", null); //$NON-NLS-1$
-			saveHtml(xml, xslPath, f);
-		}
-
-		return ResourceHelper.getBackPath(ownerElement).replace(
-				File.separatorChar, '/')
-				+ url;
-	}
-
-	/**
-	 * save a html file 
-	 * @param xmlElement
-	 * @param xsl_uri
-	 * @param outputFile
-	 * @deprecated this method id not used any more
-	 */
-	public void saveHtml(XmlElement xmlElement, String xsl_uri, File outputFile) {
-		try {
-			StringBuffer xml = new StringBuffer();
-			xml.append(XmlHelper.XML_HEADER).append(xmlElement.toXml());
-
-			OutputStreamWriter output = new OutputStreamWriter(
-					new FileOutputStream(outputFile), "utf-8"); //$NON-NLS-1$
-			Properties xslParams = LibraryPlugin.getDefault().getProperties(
-					"/layout/xsl/resources.properties"); //$NON-NLS-1$
-
-			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, output);
-			output.flush();
-			output.close();
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-	
-	private static MethodElement getMethodElement_(String guid) {
-				try {
-					if (getLibrary() == null) {
-						return null;
-					}
-					ILibraryResourceSet resourceSet = (ILibraryResourceSet) getLibrary()
-							.eResource().getResourceSet();
-					if (resourceSet != null) {
-						return (MethodElement) resourceSet.getEObject(guid);
-					}
-				} catch (Throwable th) {
-					// Log error here
-					th.printStackTrace();
-				}
-				return null;
-			}
-
-	public static MethodLibrary getLibrary() {
-		return library;
-	}
-
-	public static void setLibrary(MethodLibrary library) {
-		LinkInfo.library = library;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/ProcessAdapterFactoryFilter.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/ProcessAdapterFactoryFilter.java
deleted file mode 100644
index 6f8b7b5..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/ProcessAdapterFactoryFilter.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.epf.diagram.model.util.IAdapterFactoryFilter;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.uma.MethodConfiguration;
-
-
-
-/**
- * The process filter with adaptor factory.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ProcessAdapterFactoryFilter extends ProcessConfigurator implements
-		IAdapterFactoryFilter {
-
-	private ElementLayoutManager.LayoutAdapterFactory factory;
-
-	/**
-	 * constructor the filter
-	 * 
-	 * @param methodConfig
-	 * @param factory
-	 */
-	public ProcessAdapterFactoryFilter(MethodConfiguration methodConfig, ElementLayoutManager.LayoutAdapterFactory factory) {
-		super(methodConfig);
-		this.factory = factory;
-	}
-
-	/**
-	 * @return AdapterFactory
-	 */
-	public AdapterFactory getWBSAdapterFactory() {
-		return factory.wbsAdapterFactory;
-	}
-
-	/**
-	 * @return AdapterFactory
-	 */
-	public AdapterFactory getTBSAdapterFactory() {
-		return factory.tbsAdapterFactory;
-	}
-
-	/**
-	 * @return AdapterFactory
-	 */
-	public AdapterFactory getWPBSAdapterFactory() {
-		return factory.wpbsAdapterFactory;
-	}
-
-	/**
-	 * @return AdapterFactory
-	 */
-	public AdapterFactory getCBSAdapterFactory() {
-		return factory.cbsAdapterFactory;
-	}
-
-	/**
-	 * accept the object or not.
-	 * @param obj Object
-	 * @return boolean
-	 */
-	public boolean accept(Object obj) {
-		return super.accept(obj);
-	}
-
-	public void dispose() {
-		factory = null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/RichTextContentValidator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/RichTextContentValidator.java
deleted file mode 100644
index ec437af..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/RichTextContentValidator.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.eclipse.epf.library.layout;
-
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.epf.library.layout.DefaultContentValidator;
-import org.eclipse.epf.library.layout.LinkInfo;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Special content validator for the Rich Text Editor
- * @author Jeff Hardy
- *
- */
-public class RichTextContentValidator extends DefaultContentValidator {
-
-	/**
-	 * validates a URL without decoding it
-	 */
-	public LinkInfo validateLink(MethodElement owner, String attributes,
-			String text, MethodConfiguration config, String tag) {
-
-		LinkInfo info = new LinkInfo(owner, this, pubDir, tag) {
-			protected String decode(String str) throws UnsupportedEncodingException {
-				return str;
-			}
-		};
-		info.validateLink(attributes, text, config);
-
-		return info;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/DiagramInfo.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/DiagramInfo.java
deleted file mode 100644
index b4cb16a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/DiagramInfo.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.diagram;
-
-import java.awt.Rectangle;
-import java.io.File;
-
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * class for diagram layout
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class DiagramInfo extends MethodElementDiagram {
-
-	private int suppressedCount = 0;
-	private int nodeCount = 0;
-	
-	/**
-	 * constructor
-	 * @param diagramType
-	 * @param element
-	 */
-	public DiagramInfo(String diagramType, MethodElement element) {
-		super(element);
-
-		super.setHTMLMap(new HTMLMap(diagramType + "_" + element.getName())); //$NON-NLS-1$
-	}
-
-	/**
-	 * add a diagram area
-	 * @param e
-	 * @param x
-	 * @param y
-	 * @param width
-	 * @param height
-	 * @param altTag
-	 * @param suppressed
-	 */
-	public void addArea(MethodElement e, int x, int y, int width, int height,
-			String altTag, boolean suppressed) {
-		if ( suppressed )
-		{
-			suppressedCount++;
-			return;
-		}
-		
-		if (altTag == null) {
-			if (e instanceof DescribableElement) {
-				altTag = ((DescribableElement) e).getPresentationName();
-				if (altTag.length() < 1 || altTag == "") { //$NON-NLS-1$
-					if (e instanceof Activity) {
-						Object base = ((Activity) e).getVariabilityBasedOnElement();
-						altTag = ((Activity) base).getPresentationName();
-					}
-				}
-			} else if (e != null) {
-				altTag = e.getName();
-			} else {
-				altTag = ""; //$NON-NLS-1$
-			}
-		}
-
-		Rectangle coordinates = new Rectangle(x, y, width, height);
-		String href = ResourceHelper.getUrl(e, super.getMethodElement(),
-				ResourceHelper.FILE_EXT_HTML);
-		HTMLMap map = super.getHTMLMap();
-		map.addArea(new HTMLArea(e.getGuid(), href, "rect", coordinates, altTag)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Add graphical nodes
-	 */
-	public void addGraphicalNodes() {
-		nodeCount++;
-	}
-
-	/**
-	 * Sets the image path relative to the publishing dir.
-	 * 
-	 * @param path
-	 */
-	public void setImageFilePath(String path) {
-		super.setImageFileName(ResourceHelper.getBackPath(super
-				.getMethodElement())
-				+ path.replace(File.separatorChar, '/'));
-	}
-
-	/**
-	 * get the number of areas
-	 * @return int
-	 */
-	public int getAreaCount() {
-		return super.getHTMLMap().size();
-	}
-
-	/**
-	 * get the number of suppressed areas
-	 * @return int
-	 */
-	public int getSuppressedCount() {
-		return suppressedCount;
-	}
-	
-	/**
-	 * get the number of graphical nodes in the diagram
-	 * @return int
-	 */
-	public int getGraphicalNodeCount() {
-		return nodeCount;
-	}
-	
-	/**
-	 * is empty?
-	 * @return boolean
-	 */
-	public boolean isEmpty() {
-		
-		return getAreaCount() + getSuppressedCount() + getGraphicalNodeCount() == 0;
-					
-	}
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/HTMLArea.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/HTMLArea.java
deleted file mode 100644
index 794b9ea..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/HTMLArea.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.diagram;
-
-import java.awt.Rectangle;
-
-/**
- * Encapsulates the HTML AREA tag.
- * 
- * @author Kelvin Low
- * @author Jinhua XI
- * @since 1.0
- */
-public class HTMLArea {
-
-	private String guid =  null;
-	
-	private String href;
-
-	private String shape;
-
-	private Rectangle coordinates;
-
-	private String altTag;
-
-	/**
-	 * Creates a new <code>HTMLArea</code>.
-	 */
-	public HTMLArea(String guid, String href, String shape, Rectangle coordinates,
-			String altTag) {
-		this.guid = guid;
-		this.href = href;
-		this.shape = shape;
-		this.coordinates = coordinates;
-		this.altTag = altTag;
-		
-		// remove new line characters, otherwise it will caused a white space in the published html
-		// not as expected. 
-		// see bug 00388978 - Extra space in the flyover text in the Caspian Japanese site		
-		if ( this.altTag != null ) {
-			this.altTag = this.altTag.replaceAll("(\r|\n)+", "");  //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * get the guid
-	 * @return String
-	 */
-	public String getGuid() {
-		return guid;
-	}
-	
-	/**
-	 * Returns the HREF.
-	 */
-	public String getHref() {
-		return href;
-	}
-
-	/**
-	 * Returns the shape.
-	 */
-	public String getShape() {
-		return shape;
-	}
-
-	/**
-	 * Returns the coordinates.
-	 */
-	public Rectangle getCoordinates() {
-		return coordinates;
-	}
-
-	/**
-	 * Returns the alt tag.
-	 */
-	public String getAltTag() {
-		return altTag;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/HTMLMap.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/HTMLMap.java
deleted file mode 100644
index 250abbd..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/HTMLMap.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.diagram;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-/**
- * Encapsulates the HTML MAP tag.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class HTMLMap {
-
-	private String name;
-
-	private ArrayList areas = new ArrayList();
-
-	/**
-	 * Creates a new <code>HTMLMap</code>.
-	 */
-	public HTMLMap(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * Returns the name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Adds a new area to the map.
-	 */
-	public void addArea(HTMLArea area) {
-		if (area != null) {
-			areas.add(area);
-		}
-	}
-
-	/**
-	 * Returns an iterator to iterate the areas.
-	 */
-	public Iterator getAreas() {
-		return areas.iterator();
-	}
-
-	public int size() {
-		return areas.size();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/IActivityDiagramService.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/IActivityDiagramService.java
deleted file mode 100644
index f23a595..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/IActivityDiagramService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.diagram;
-
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.uma.Activity;
-
-public interface IActivityDiagramService {
-
-	/**
-	 * save the element diagram image and returns the image file url.
-	 * 
-	 * @param wraper Object the item provider wrapper of the activity element
-	 * @param imgPath String the generated image path relative to the publishing dir.
-	 * @param diagramType
-	 * @param filter
-	 *            IFilter
-	 * @param sup
-	 *            Suppression
-	 * @return DiagramInfo the diagram info
-	 */
-	public DiagramInfo saveDiagram(Object wraper, String imgPath, String diagramType,
-			IFilter filter, Suppression sup);
-	
-	
-	public Activity getRealizedForUnmodified(Object wrapper, IFilter filter, 
-			Suppression suppression);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/MethodElementDiagram.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/MethodElementDiagram.java
deleted file mode 100644
index 9d6114e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/MethodElementDiagram.java
+++ /dev/null
@@ -1,183 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.diagram;
-
-import java.awt.Rectangle;
-import java.util.Iterator;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * Encapsulates a published diagram for a <code>MethodElement</code>.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class MethodElementDiagram {
-
-	// The MethodElement.
-	private MethodElement element;
-
-	// The generated JPEG file name.
-	private String imageFileName;
-
-	// The HTML Area Map.
-	private HTMLMap htmlMap;
-
-	// The HTML that represents this diagram.
-	// private String diagramHTML;
-
-	/**
-	 * Creates a new <code>RoleDiagramInfo</code>.
-	 * 
-	 * @param element
-	 *            The <code>ContentElement</code>.
-	 */
-	public MethodElementDiagram(MethodElement element) {
-		this.element = element;
-	}
-
-	/**
-	 * Returns the <code>MethodElement</code> associated with the published
-	 * diagram.
-	 * 
-	 * @return The <code>MethodElement</code> associated with the published
-	 *         diagram.
-	 */
-	public MethodElement getMethodElement() {
-		return element;
-	}
-
-	/**
-	 * Returns the image file name.
-	 * 
-	 * @return The image file name.
-	 */
-	public String getImageFileName() {
-		return imageFileName;
-	}
-
-	/**
-	 * Sets the image file name.
-	 * 
-	 * @param imageFileName
-	 *            The image file name.
-	 */
-	public void setImageFileName(String imageFileName) {
-		this.imageFileName = imageFileName;
-	}
-
-	/**
-	 * Returns the HTML Area Map.
-	 * 
-	 * @return The HTML Area Map.
-	 */
-	public HTMLMap getHTMLMap() {
-		return htmlMap;
-	}
-
-	/**
-	 * Sets the HTML Area Map.
-	 * 
-	 * @param htmlMap
-	 *            The HTML Area Map.
-	 */
-	public void setHTMLMap(HTMLMap htmlMap) {
-		this.htmlMap = htmlMap;
-	}
-
-	/**
-	 * Returns the HTML representation for the diagram.
-	 * 
-	 * @return The HTML source that represents the diagram.
-	 */
-	public String getHTML() {
-		StringBuffer html = new StringBuffer();
-		html.append("<p>"); //$NON-NLS-1$
-		if (imageFileName != null && htmlMap != null) {
-			String mapName = htmlMap.getName();
-			html.append("<map name=\"").append(htmlMap.getName()).append("\">"); //$NON-NLS-1$ //$NON-NLS-2$
-			Iterator areas = htmlMap.getAreas();
-			while (areas.hasNext()) {
-				HTMLArea htmlArea = (HTMLArea) areas.next();
-				Rectangle coords = htmlArea.getCoordinates();
-				html
-						.append("<area href=\"").append(htmlArea.getHref()).append("\"") //$NON-NLS-1$ //$NON-NLS-2$
-						.append(" shape=\"").append(htmlArea.getShape()).append("\"") //$NON-NLS-1$ //$NON-NLS-2$
-						.append(" coords=\"") //$NON-NLS-1$
-						.append((int) coords.getX())
-						.append(", ") //$NON-NLS-1$
-						.append((int) coords.getY())
-						.append(", ") //$NON-NLS-1$
-						.append((int) (coords.getX() + coords.getWidth()))
-						.append(", ") //$NON-NLS-1$
-						.append((int) (coords.getY() + coords.getHeight()))
-						.append("\"") //$NON-NLS-1$
-						.append(" alt=\"").append(htmlArea.getAltTag()).append("\"") //$NON-NLS-1$ //$NON-NLS-2$
-						.append(" title=\"").append(htmlArea.getAltTag()).append("\"") //$NON-NLS-1$ //$NON-NLS-2$
-						.append("/>"); //$NON-NLS-1$
-			}
-			html.append("</map>"); //$NON-NLS-1$
-			html
-					.append("<img border=\"0\" src=\"").append(imageFileName).append("\"") //$NON-NLS-1$ //$NON-NLS-2$
-					.append(" alt=\"").append(mapName).append("\"") //$NON-NLS-1$ //$NON-NLS-2$
-					.append(" title=\"").append(mapName).append("\"") //$NON-NLS-1$ //$NON-NLS-2$
-					.append(" usemap=\"#").append(mapName).append("\"/>"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		html.append("</p>"); //$NON-NLS-1$
-		return html.toString();
-	}
-
-	/**
-	 * get the xml element for the diagram
-	 * @return XmlElement
-	 */
-	public XmlElement getXmlElement()
-	{
-		XmlElement xmlElement = null;
-
-		if (imageFileName != null && htmlMap != null) {
-			String mapName = htmlMap.getName();
-			xmlElement = new XmlElement("map") //$NON-NLS-1$
-				.setAttribute("name", mapName)  //$NON-NLS-1$ 
-				.setAttribute("src", imageFileName) //$NON-NLS-1$ 
-				.setAttribute("alt", mapName);  //$NON-NLS-1$ 
-			
-			Iterator areas = htmlMap.getAreas();
-			while (areas.hasNext()) {
-				HTMLArea htmlArea = (HTMLArea) areas.next();
-				Rectangle coords = htmlArea.getCoordinates();
-				StringBuffer buffer = new StringBuffer();
-				buffer.append((int) coords.getX())
-				.append(", ") //$NON-NLS-1$
-				.append((int) coords.getY())
-				.append(", ") //$NON-NLS-1$
-				.append((int) (coords.getX() + coords.getWidth()))
-				.append(", ") //$NON-NLS-1$
-				.append((int) (coords.getY() + coords.getHeight()));
-				
-				// need to escape the url since it will be passed as a literal string to a javascript variable
-				xmlElement.newChild("area") //$NON-NLS-1$
-					.setAttribute("guid", (htmlArea.getGuid() == null) ? "" : htmlArea.getGuid() )  //$NON-NLS-1$ //$NON-NLS-2$
-					.setAttribute("href", StrUtil.escape(htmlArea.getHref()))	//$NON-NLS-1$
-					.setAttribute("shape", htmlArea.getShape())	//$NON-NLS-1$
-					.setAttribute("coords", buffer.toString())	//$NON-NLS-1$
-					.setAttribute("alt", htmlArea.getAltTag());	//$NON-NLS-1$
-			}
-		}
-		
-		return xmlElement;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/RoleDiagramPublisher.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/RoleDiagramPublisher.java
deleted file mode 100644
index 33a3d1e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/RoleDiagramPublisher.java
+++ /dev/null
@@ -1,493 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.diagram;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.TexturePaint;
-import java.awt.geom.Line2D;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-
-import javax.imageio.ImageIO;
-import javax.swing.JPanel;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.utils.I18nUtil;
-import org.eclipse.epf.common.utils.ImageUtil;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.elements.RoleLayout;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.swt.SWT;
-
-/**
- * Renders the Role diagram using Java2D and saves it as a JPEG file.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class RoleDiagramPublisher {
-
-	private static final String DEFAULT_FONT_NAME = "Arial"; //$NON-NLS-1$
-
-	private static final int DEFAULT_FONT_SIZE = 10;
-
-	private static final int DEFAULT_X_MARGIN = 200;
-
-	// The maximum width of the generated image.
-	private int maxImageWidth = 1024;
-
-	// The maximum height of the generated image.
-	private int maxImageHeight = 1024;
-
-	// The border width.
-	private int borderWidth = 10;
-
-	// The border height.
-	private int borderHeight = 10;
-
-	// The additional spacing before the left-most Task and/or Work Product
-	// image.
-	private int xMargin = 240;
-
-	// The horizontal spacing between the element images.
-	private int xSpacing;
-
-	// The vertical spacing between the element images.
-	private int ySpacing;
-
-	// The maximun number of text lines for the element labels.
-	private int maxTextLines;
-
-	private int linePadding = 12;
-
-	private Font textFont = null;
-
-	/**
-	 * Creates a new <code>ImagePublisher</code>.
-	 */
-	public RoleDiagramPublisher() {
-		// Select the font for rendering the element names.
-		String fontName;
-		int fontSize;
-		fontName = getFontName();
-		if (SWT.getPlatform().equals(Platform.WS_WIN32)) {
-			fontSize = I18nUtil.getInt(
-					LibraryResources.roleDiagramFont_size_win32,
-					DEFAULT_FONT_SIZE);
-		} else {
-			fontSize = I18nUtil.getInt(LibraryResources.roleDiagramFont_size,
-					DEFAULT_FONT_SIZE);
-		}
-		if (fontName.startsWith("[")) { //$NON-NLS-1$
-			fontName = DEFAULT_FONT_NAME;
-		}
-		textFont = new Font(fontName, Font.PLAIN, fontSize);
-
-		xMargin = I18nUtil.getInt(LibraryResources.roleDiagram_xMargin,
-				DEFAULT_X_MARGIN);
-
-		xSpacing = LibraryPreferences.getRoleDiagramHorizontalSpacing();
-		ySpacing = LibraryPreferences.getRoleDiagramVerticalSpacing();
-		maxTextLines = LibraryPreferences.getRoleDiagramMaximumTextLines();
-	}
-	
-	private String getFontName() {
-		String fontName;
-		if (Platform.getNL().startsWith("ja")) { //$NON-NLS-1$
-			if (SWT.getPlatform().equals(Platform.WS_WIN32)) {
-				fontName = LibraryResources.roleDiagramFont_name_win32_ja;
-			} else {
-				fontName = LibraryResources.roleDiagramFont_name_ja;
-			}
-		} else if (Platform.getNL().startsWith("ko")) { //$NON-NLS-1$
-			if (SWT.getPlatform().equals(Platform.WS_WIN32)) {
-				fontName = LibraryResources.roleDiagramFont_name_win32_ko;
-			} else {
-				fontName = LibraryResources.roleDiagramFont_name_ko;
-			}
-		} else if (Platform.getNL().startsWith("zh_TW")) { //$NON-NLS-1$
-			if (SWT.getPlatform().equals(Platform.WS_WIN32)) {
-				fontName = LibraryResources.roleDiagramFont_name_win32_zh_TW;
-			} else {
-				fontName = LibraryResources.roleDiagramFont_name_zh_TW;
-			}
-		} else if (Platform.getNL().startsWith("zh")) { //$NON-NLS-1$
-			if (SWT.getPlatform().equals(Platform.WS_WIN32)) {
-				fontName = LibraryResources.roleDiagramFont_name_win32_zh;
-			} else {
-				fontName = LibraryResources.roleDiagramFont_name_zh;
-			}
-		} else {
-			if (SWT.getPlatform().equals(Platform.WS_WIN32)) {
-				fontName = LibraryResources.roleDiagramFont_name_win32;
-			} else {
-				fontName = LibraryResources.roleDiagramFont_name;
-			}
-		}
-		return fontName;
-
-	}
-
-	/**
-	 * Generates the Role Diagram HTML source for the given role.
-	 * 
-	 * @param role
-	 *            The Role element.
-	 * @param path
-	 *            The publish path.
-	 * @return A <code>MethodElementDiagram</code> object associated with the
-	 *         published diagram.
-	 */
-	public MethodElementDiagram publish(RoleLayout roleLayout, File path) {
-
-		Role role = (Role) roleLayout.getElement();
-
-		if (role == null) {
-			throw new IllegalArgumentException();
-		}
-
-		try {
-			MethodElementDiagram elementDiagram = new MethodElementDiagram(role);
-
-			String publishDir = roleLayout.getLayoutMgr().getPublishDir();
-			String mapName = roleLayout.getDisplayName();
-			if (mapName == null || mapName.length() == 0) {
-				mapName = "Unknown"; //$NON-NLS-1$
-			} else {
-				mapName = mapName.replace(' ', '_');
-			}
-			HTMLMap htmlMap = new HTMLMap(mapName);
-			elementDiagram.setHTMLMap(htmlMap);
-
-			// Create the AWT JPanel for rendering the diagram.
-			JPanel panel = new JPanel();
-
-			// Create the output BufferedImage.
-			BufferedImage outputImage = new BufferedImage(maxImageWidth,
-					maxImageHeight, BufferedImage.TYPE_INT_RGB);
-			Graphics2D g2d = (Graphics2D) outputImage.getGraphics();
-
-			// Switch on anti-aliasing.
-			g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
-					RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-			g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-					RenderingHints.VALUE_ANTIALIAS_ON);
-			g2d.fillRect(0, 0, maxImageWidth, maxImageHeight);
-
-			// Set the stroke for drawing the association lines.
-			g2d.setStroke(new BasicStroke(1.25f));
-			g2d.setColor(Color.BLACK);
-
-			int xOffset = xSpacing / 2;
-
-			// Renders the Tasks performed by the Role.
-			List tasks = roleLayout.getPerforms();
-			int totalTasks = tasks != null ? tasks.size() : 0;
-			Point taskStartPoint = new Point(borderWidth + xMargin,
-					borderHeight);
-			Point taskEndPoint = new Point(borderWidth + xMargin, borderHeight);
-			int x = taskStartPoint.x;
-			int y = taskStartPoint.y;
-			int tasksEndX = 0;
-			if (totalTasks > 0) {
-				int taskNo = 1;
-				for (Iterator i = tasks.iterator(); i.hasNext(); taskNo++) {
-					Task task = (Task) i.next();
-
-					IElementLayout taskLayout = roleLayout.getLayoutMgr()
-							.getLayout(task, true);
-
-					String taskName = taskLayout.getDisplayName();
-					String imageFile = publishDir
-							+ taskLayout.getDiagramiconUrl();
-					try {
-						BufferedImage taskImage = ImageUtil.getBufferedImage(
-								imageFile, panel);
-						int taskWidth = taskImage.getWidth();
-						int taskHeight = taskImage.getHeight();
-						if (taskNo == 1) {
-							taskEndPoint.x += taskWidth;
-							taskEndPoint.y += taskHeight;
-							tasksEndX = taskEndPoint.x;
-						}
-						Rectangle taskImageRect = new Rectangle(x, y,
-								taskWidth, taskHeight);
-						TexturePaint taskPaint = new TexturePaint(taskImage,
-								taskImageRect);
-						g2d.setPaint(taskPaint);
-						g2d.fill(taskImageRect);
-						if (taskName != null) {
-							ImageUtil.drawText(g2d, taskName, textFont,
-									Color.BLACK, x - xOffset, taskEndPoint.y,
-									taskWidth + xSpacing, maxTextLines);
-						}
-
-						String href = taskLayout.getFilePath(roleLayout)
-								+ taskLayout.getFileName(".html"); //$NON-NLS-1$
-						HTMLArea htmlArea = new HTMLArea(task.getGuid(), href,
-								"rect", taskImageRect, taskName); //$NON-NLS-1$
-						htmlMap.addArea(htmlArea);
-
-						if (x + taskWidth > tasksEndX) {
-							tasksEndX = x + taskWidth;
-						}
-
-						if (i.hasNext()) {
-							int xIncrement = taskWidth + xSpacing;
-							x += xIncrement;
-							taskEndPoint.x += xIncrement;
-							if ((x + xIncrement + xOffset + borderWidth) > maxImageWidth) {
-								x = taskStartPoint.x;
-								int yIncrement = taskHeight + ySpacing;
-								y += yIncrement;
-								taskEndPoint.y += yIncrement;
-								taskEndPoint.x = taskStartPoint.x + taskWidth;
-							}
-						}
-					} catch (Exception e) {
-						LibraryPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-
-			// Renders the Work Products that the Role is responsible for.
-			List workProducts = roleLayout.getResponsibleFor();
-			int totalWorkProducts = workProducts != null ? workProducts.size()
-					: 0;
-			Point workProductStartPoint = new Point(taskStartPoint.x,
-					borderHeight);
-			Point workProductEndPoint = new Point(taskStartPoint.x,
-					borderHeight);
-			if (totalTasks > 0 && totalWorkProducts > 0) {
-				workProductStartPoint.y = taskEndPoint.y + ySpacing + ySpacing
-						/ 2;
-				workProductEndPoint.y = workProductStartPoint.y;
-			} else if (totalTasks > 0) {
-				workProductEndPoint.y = taskEndPoint.y + borderHeight;
-			}
-			x = workProductStartPoint.x;
-			y = workProductStartPoint.y;
-			int workProductsEndX = 0;
-			if (totalWorkProducts > 0) {
-				int workProductNo = 1;
-				for (Iterator i = workProducts.iterator(); i.hasNext(); workProductNo++) {
-					WorkProduct workProduct = (WorkProduct) i.next();
-
-					IElementLayout wpLayout = roleLayout.getLayoutMgr()
-							.getLayout(workProduct, true);
-
-					String workProductName = wpLayout.getDisplayName();
-					String imageFile = publishDir
-							+ wpLayout.getDiagramiconUrl();
-					try {
-						BufferedImage workProductImage = ImageUtil
-								.getBufferedImage(imageFile, panel);
-						int workProductWidth = workProductImage.getWidth();
-						int workProductHeight = workProductImage.getHeight();
-						if (workProductNo == 1) {
-							workProductEndPoint.x += workProductWidth;
-							workProductEndPoint.y += workProductHeight;
-							workProductsEndX = workProductEndPoint.x;
-						}
-						Rectangle workProductImageRect = new Rectangle(x, y,
-								workProductWidth, workProductHeight);
-						TexturePaint workProductPaint = new TexturePaint(
-								workProductImage, workProductImageRect);
-						g2d.setPaint(workProductPaint);
-						g2d.fill(workProductImageRect);
-						if (workProductName != null) {
-							ImageUtil.drawText(g2d, workProductName, textFont,
-									Color.BLACK, x - xOffset,
-									workProductEndPoint.y, workProductWidth
-											+ xSpacing, maxTextLines);
-						}
-
-						String href = wpLayout.getFilePath(roleLayout)
-								+ wpLayout.getFileName(".html"); //$NON-NLS-1$
-
-						HTMLArea htmlArea = new HTMLArea(workProduct.getGuid(),
-								href,
-								"rect", workProductImageRect, workProductName); //$NON-NLS-1$
-						htmlMap.addArea(htmlArea);
-
-						if (x + workProductWidth > workProductsEndX) {
-							workProductsEndX = x + workProductWidth;
-						}
-
-						if (i.hasNext()) {
-							int xIncrement = workProductWidth + xSpacing;
-							x += xIncrement;
-							workProductEndPoint.x += xIncrement;
-							if ((x + xIncrement + xOffset + borderWidth) > maxImageWidth) {
-								x = workProductStartPoint.x;
-								int yIncrement = workProductHeight + ySpacing;
-								y += yIncrement;
-								workProductEndPoint.y += yIncrement;
-								workProductEndPoint.x = workProductStartPoint.x
-										+ workProductWidth;
-							}
-						}
-					} catch (Exception e) {
-						LibraryPlugin.getDefault().getLogger().logError(e);
-					}
-				}
-			}
-
-			// Render the Role.
-			Point roleStartPoint = new Point(xOffset - 5, borderHeight);
-			Point roleEndPoint = roleStartPoint;
-			try {
-				String roleName = roleLayout.getDisplayName();
-				String imageFile = publishDir + roleLayout.getDiagramiconUrl();
-				BufferedImage roleImage = ImageUtil.getBufferedImage(imageFile,
-						panel);
-				int roleWidth = roleImage.getWidth();
-				int roleHeight = roleImage.getHeight();
-				x = xOffset - 5;
-				y = borderHeight;
-				roleEndPoint.x += roleWidth;
-				roleEndPoint.y += roleHeight;
-				if (totalWorkProducts > 0) {
-					y = borderHeight
-							+ (workProductEndPoint.y - taskStartPoint.y - roleHeight)
-							/ 2;
-
-					// Render the "responsible for" association line.
-					Point startPoint = new Point(x + roleWidth + linePadding
-							/ 2, y + roleHeight / 2);
-					int lineEndPoint = workProductStartPoint.x - linePadding;
-					if (lineEndPoint > (DEFAULT_X_MARGIN - xSpacing / 2)) {
-						lineEndPoint = (DEFAULT_X_MARGIN - xSpacing / 2);
-					}
-					Point endPoint = new Point(workProductStartPoint.x
-							- linePadding, workProductStartPoint.y
-							+ (workProductEndPoint.y - workProductStartPoint.y)
-							/ 2);
-					renderAssociation(g2d, startPoint, endPoint,
-							LibraryResources.roleDiagramResponsibleFor_text,
-							textFont, Color.BLACK);
-				} else if (totalTasks > 0) {
-					y = borderHeight
-							+ (taskEndPoint.y - taskStartPoint.y - roleHeight)
-							/ 2;
-				}
-				roleStartPoint.y = y;
-				roleEndPoint.y = y + roleHeight;
-
-				if (totalTasks > 0) {
-					// Render the "performs" association line.
-					Point startPoint = new Point(x + roleWidth + linePadding
-							/ 2, y + roleHeight / 2);
-					int lineEndPoint = taskStartPoint.x - linePadding;
-					if (lineEndPoint > (DEFAULT_X_MARGIN - xSpacing / 2)) {
-						lineEndPoint = (DEFAULT_X_MARGIN - xSpacing / 2);
-					}
-					Point endPoint = new Point(lineEndPoint, borderHeight
-							+ (taskEndPoint.y - taskStartPoint.y) / 2);
-					renderAssociation(g2d, startPoint, endPoint,
-							LibraryResources.roleDiagramPerforms_text,
-							textFont, Color.BLACK);
-				}
-				Rectangle roleImageRect = new Rectangle(x, y, roleWidth,
-						roleHeight);
-				TexturePaint rolePaint = new TexturePaint(roleImage,
-						roleImageRect);
-				g2d.setPaint(rolePaint);
-				g2d.fill(roleImageRect);
-				if (roleName != null) {
-					ImageUtil.drawText(g2d, roleName, textFont, Color.BLACK, x
-							- xOffset, y + roleHeight, roleWidth + xSpacing,
-							maxTextLines);
-				}
-			} catch (Exception e) {
-				LibraryPlugin.getDefault().getLogger().logError(e);
-			}
-
-			// Calculate the optimal width and height for the rendered image.
-			int optimalWidth = Math.max(tasksEndX, workProductsEndX)
-					+ borderWidth;
-			optimalWidth = Math.max(optimalWidth, roleEndPoint.x + borderWidth);
-
-			optimalWidth = Math.min(optimalWidth, maxImageWidth);
-
-			int optimalHeight = workProductEndPoint.y + borderHeight;
-			optimalHeight = Math.max(optimalHeight, roleEndPoint.y
-					+ borderHeight);
-			optimalWidth += xOffset;
-			optimalHeight += (maxTextLines * 10);
-
-			optimalHeight = Math.min(optimalHeight, maxImageHeight);
-			BufferedImage optimalImage = outputImage.getSubimage(0, 0,
-					optimalWidth, optimalHeight);
-
-			// Save the image as a JPEG file.
-			File jpgFile = new File(path, roleLayout.getFilePath()
-					+ roleLayout.getFileName(".jpg")); //$NON-NLS-1$
-			File parentFolder = jpgFile.getParentFile();
-			if (!parentFolder.exists()) {
-				parentFolder.mkdirs();
-			}
-			ImageIO.write(optimalImage, "jpg", jpgFile); //$NON-NLS-1$
-			elementDiagram.setImageFileName(jpgFile.getName());
-			return elementDiagram;
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-			return null;
-		}
-	}
-
-	/**
-	 * Renders the association line.
-	 * 
-	 * @param g2d
-	 *            The Graphics2D context.
-	 * @param startPoint
-	 *            The start point of the line.
-	 * @param endPoint
-	 *            The end point of the line.
-	 * @param name
-	 *            The association name.
-	 * @param font
-	 *            The font for rendering the association name.
-	 * @param color
-	 *            the color for rendering the association name.
-	 */
-	protected void renderAssociation(Graphics2D g2d, Point startPoint,
-			Point endPoint, String name, Font font, Color color) {
-		g2d.draw(new Line2D.Double(startPoint.x, startPoint.y, endPoint.x,
-				endPoint.y));
-		int textX = startPoint.x + (endPoint.x - startPoint.x) / 2 - 40;
-		int textY = startPoint.y + (endPoint.y - startPoint.y) / 2 - 5;
-		if (startPoint.y != endPoint.y) {
-			g2d.setColor(Color.WHITE);
-			g2d.fillRect(textX, textY, 80, 10);
-		} else {
-			textY -= 10;
-		}
-		ImageUtil.drawText(g2d, name, font, color, textX, textY, 80, 3);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/package.html
deleted file mode 100644
index 21bf303..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/diagram/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides role and activity diagrams in a published configuraiton.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractElementLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractElementLayout.java
deleted file mode 100644
index 38d0197..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractElementLayout.java
+++ /dev/null
@@ -1,1077 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.LayoutInfo;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.persistence.MultiFileXMISaveImpl;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * The abstract layout for all Method Elements.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @sicne 1.0
- */
-public abstract class AbstractElementLayout implements IElementLayout {
-
-	public static final String TAG_REFERENCE = "reference"; //$NON-NLS-1$
-	public static final String TAG_REFERENCELIST = "referenceList"; //$NON-NLS-1$
-	
-	protected ElementLayoutManager layoutManager;
-
-	protected MethodElement element;
-
-	protected MethodElement ownerElement;
-
-	protected String url = null;
-
-	// element element path relative to the publishing root
-	protected String elementPath = ""; //$NON-NLS-1$
-
-	// the back up path to reath the publishing root
-	protected String backPath = ""; //$NON-NLS-1$
-
-	// map of layout file to the output file extention, if the element has more
-	// than one layout output
-	protected List layouts = null;
-
-	protected MethodElement targetElement = null;
-
-	protected boolean showElementLink = true;
-	
-	protected boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	public AbstractElementLayout() {
-	}
-
-	/**
-	 * if the element's content is target for another element, set it here. for
-	 * example, step content cat target for a Task or a task descriptor
-	 * copyright content can target to different elements.
-	 * 
-	 * The purpose of this is that the system will fix the links in the content
-	 * to relative to the target element.
-	 */
-	public void setContentTarget(MethodElement targetElement) {
-		this.targetElement = targetElement;
-	}
-
-	/**
-	 * need to set the owner of the current layout element. In most cases this
-	 * should be the eContainer of the element. This is needed because in some
-	 * situation the element does not have an owner when the object is created.
-	 * For example, the ContentDescription object's eContiner is null if the
-	 * content file is not saved.
-	 * 
-	 * @param owner
-	 *            MethodElement
-	 */
-	public void setElementOwner(MethodElement owner) {
-		this.ownerElement = owner;
-	}
-
-	/**
-	 * @deprecated
-	 */
-	public void setShowElementLink(boolean show) {
-		this.showElementLink = show;
-	}
-	
-	/**
-	 * initialize the layout with the element layout manager and the element.
-	 * @param layoutManager ElementLayoutManager
-	 * @param element MethodElement
-	 */
-	public abstract void init(ElementLayoutManager layoutManager,
-			MethodElement element);
-
-	protected void __init(ElementLayoutManager layoutManager,
-			MethodElement element) {
-		this.layoutManager = layoutManager;
-		this.element = element;
-		if (!ConfigurationHelper.isDescriptionElement(element)) {
-			if ( !(element instanceof MethodConfiguration) ) {
-				// make sure the element is loaded with the correct container
-				// otherwise the  element may not have a valid container
-				// and thus the element content path can't be determined
-				// this is just a workaround. should we have a better way to make sure the elements are loaded correctly???????????
-				// 160441 - Missing template files when publish configuration
-				MethodPlugin plugin = LibraryUtil.getMethodPlugin(element);
-				if ( plugin == null || plugin.eContainer() == null) {
-					
-					// this should not happen in publishing mode since the whole library is already loaded
-					if ( debug && getLayoutMgr().isPublishingMode() ) {
-						System.out.println("Error: Element without a valid container: " + LibraryUtil.getTypeName(element)); //$NON-NLS-1$
-					}
-					
-					LibraryUtil.getMethodPlugins(LibraryService.getInstance().getCurrentMethodLibrary());
-				} 
-			}
-			buildPath();
-			this.url = elementPath + getFileName(ResourceHelper.FILE_EXT_HTML);
-		}
-		
-		// this is a workaround. 
-		// we need to pass parameters in the file url, 
-		// however, if the file does not exist, the parameters is not passed over in browsing
-		// so create a dummy file
-		if (!this.layoutManager.isPublishingMode() && !(
-					element instanceof ContentDescription 
-				|| element.eContainer() instanceof ContentDescription
-				|| element instanceof MethodConfiguration) )
-		{
-			try {
-				String html_file = this.layoutManager.getPublishDir() + this.getFilePath() + getFileName(ResourceHelper.FILE_EXT_HTML);
-				File f = new File(html_file);
-				if ( !f.exists() )
-				{
-					f.getParentFile().mkdirs();
-					f.createNewFile();
-				}
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-		
-		preloadOppositefeatures();
-
-	}
-
-	private void preloadOppositefeatures() {
-		// make sure the processes are loaded before calculating the feature
-		// otherwise the opposite feature map is not populated
-		// fine for publishing since the whole library is loaded already
-		// special handling for browsing
-		// load the opposite feature specifically
-		if ( getLayoutMgr().isPublishingMode() ) {
-			return;
-		}
-		
-		//OppositeFeature of;
-		Resource res = element.eResource();
-		if ( res == null ) {
-			return;
-		}
-		
-		ResourceSet resSet = res.getResourceSet();
-		if ( !(resSet instanceof ILibraryResourceSet) ) {
-			return;
-		}
-		
-		List<OppositeFeature> oppositeFeatures = new ArrayList<OppositeFeature>();
-		if ( this.element instanceof Role ) {
-			oppositeFeatures.add(AssociationHelper.Role_RoleDescriptors);
-		} else if ( this.element instanceof Task ) {
-			oppositeFeatures.add(AssociationHelper.Task_TaskDescriptors);
-		} else if ( this.element instanceof WorkProduct ) {
-			oppositeFeatures.add(AssociationHelper.WorkProduct_WorkProductDescriptors);
-		} else if ( this.element instanceof Checklist ) {
-			oppositeFeatures.add(AssociationHelper.Checklist_Activities);
-		} else if ( this.element instanceof Concept || this.element instanceof Whitepaper ) {
-			oppositeFeatures.add(AssociationHelper.Concept_Activities);
-		} else if ( this.element instanceof Checklist ) {
-			oppositeFeatures.add(AssociationHelper.Checklist_Activities);
-		} else if ( this.element instanceof Example ) {
-			oppositeFeatures.add(AssociationHelper.Example_Activities);
-		} else if ( this.element instanceof Guideline ) {
-			oppositeFeatures.add(AssociationHelper.Guideline_Activities);
-		} else if ( this.element instanceof ReusableAsset ) {
-			oppositeFeatures.add(AssociationHelper.ReusableAsset_Activities);
-		} else if ( this.element instanceof Roadmap ) {
-			oppositeFeatures.add(AssociationHelper.Roadmap_Activites);
-		} else if ( this.element instanceof SupportingMaterial ) {
-			oppositeFeatures.add(AssociationHelper.SupportingMaterial_Activities);
-		} 
-	
-		if ( oppositeFeatures.size() > 0 ) {
-			Set<String> GUIDs = new HashSet<String>();
-			GUIDs.add(element.getGuid());
-			((ILibraryResourceSet)resSet).loadOppositeFeatures(oppositeFeatures, GUIDs);
-		}
-	}
-
-	protected void setLayoutInfo(LayoutInfo info) {
-		if (layouts == null) {
-			layouts = new ArrayList();
-		}
-		layouts.add(info);
-	}
-
-	/**
-	 * return a list of LayoutInfo objects
-	 * 
-	 * @return a list of LayoutInfo objects
-	 */
-	public List getLayouts() {
-		return layouts;
-	}
-
-	/**
-	 * get layout by name
-	 * 
-	 * @param name
-	 * @return LayoutInfo
-	 */
-	public LayoutInfo getLayoutInfo(String name) {
-		if ( layouts == null || layouts.size() == 0 ) {
-			return null;
-		}
-		
-		for (Iterator it = layouts.iterator(); it.hasNext(); ) {
-			LayoutInfo info = (LayoutInfo)it.next();
-			if ( info.name.equals(name) ) {
-				return info;
-			}
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getLayoutMgr()
-	 */
-	public ElementLayoutManager getLayoutMgr() {
-		return this.layoutManager;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getElement()
-	 */
-	public MethodElement getElement() {
-		return element;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getType()
-	 */
-	public String getType() {
-		return element.getType().getName();
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getName()
-	 */
-	public String getName() {
-		return element.getName();
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getDisplayName()
-	 */
-	public String getDisplayName() {
-		
-		// [Bug 196399] P-name is not inherited from its base element in an extending element
-		return ConfigurationHelper.getPresentationName(element, getLayoutMgr().getConfiguration());
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getId()
-	 */
-	public String getId() {
-		return element.getGuid();
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getUrl()
-	 */
-	public String getUrl() {
-		return url;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getBackPath()
-	 */
-	public String getBackPath() {
-		return backPath;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getFilePath()
-	 */
-	public String getFilePath() {
-		return elementPath;
-	}
-
-	/**
-	 * Returns the file path relative to another element. This is the
-	 * relativeTo.backpath + this.elementpath.
-	 *
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getFilePath(IElementLayout)
-	 */
-
-	public String getFilePath(IElementLayout relativeTo) {
-		return relativeTo.getBackPath() + this.getFilePath();
-	}
-
-	/**
-	 * Returns the file name with the given extension.
-	 * 
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getFileName(String)
-	 */
-
-	public String getFileName(String ext) {
-		return ResourceHelper.getFileName(element, ext);
-	}
-
-
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXslUrl()
-	 */
-	public String getXslUrl() {
-		if (element instanceof ContentElement) {
-			return LayoutResources.getXslUri(getType().toLowerCase(),
-					"contentelement"); //$NON-NLS-1$
-		} else {
-			return LayoutResources.getXslUri(getType().toLowerCase(), null);
-		}
-	}
-
-	private void buildPath() {
-		// this is <plugin>/<element type>/
-		elementPath = ""; //$NON-NLS-1$
-		backPath = "./"; //$NON-NLS-1$
-		if ( !(element instanceof MethodConfiguration || element instanceof MethodLibrary) )
-		{
-			String path = ResourceHelper.getElementPath(element);
-			if ( path != null ) {
-				elementPath = path.replace(File.separatorChar, '/');
-				backPath = ResourceHelper.getBackPath(element);
-			}
-
-		}
-	}
-
-	/**
-	 * check if the html content generated from this xsl file needs to be scanned or not
-	 * scan the content is for identifying element references in the content and copy over resource files
-	 * in some cases we don't need to scan the content, for example, the activity breakdown structure
-	 * 
-	 * @param xslUrl the xsl that html is generated from, null for the default xsl layout
-	 * @return boolean
-	 */
-	public boolean needContentScan(String xslUrl)
-	{
-		// by default all contents are scanned
-		return true;
-	}
-	
-	/**
-	 * get the layout for a child element of this element
-	 * ActivityElementLayout should override this method to create layout with node path
-	 * @param child
-	 * @return IElementLayout
-	 */
-	protected IElementLayout getChildLayout(MethodElement child)
-	{
-		return layoutManager.getLayout(child, true);
-	}
-	
-	protected void processChild(Object feature, XmlElement parent, MethodElement e,
-			boolean includeReferences) {
-		if (e != null) {
-			IElementLayout l = getChildLayout(e);
-			if (l != null) {
-				// don't include the references of the refereced elements,
-				// otherwise, may cause deadlock
-				boolean isContent = (e instanceof MethodElement)
-						&& ConfigurationHelper
-								.isDescriptionElement((MethodElement) e);
-				if (isContent) {
-					if (targetElement != null) {
-						l.setContentTarget(targetElement);
-					}
-					l.setElementOwner(element);
-				}
-				parent.addChild(l.getXmlElement(includeReferences));
-			}
-		}
-	}
-
-	protected void processChild(Object feature, XmlElement parent, List items,
-			boolean includeReferences) {
-		if (items != null && items.size() > 0) {
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				Object e = it.next();
-				if (e instanceof MethodElement) {
-					MethodElement me = (MethodElement) e;
-					e = ConfigurationHelper.getCalculatedElement(me,
-							layoutManager.getConfiguration());
-					if (e != null) {
-						IElementLayout l = getChildLayout(me);
-						if (l != null) {							
-							// don't include the references of the refereced
-							// elements, otherwise, may cause deadlock
-							parent.addChild(l.getXmlElement(ConfigurationHelper
-									.isDescriptionElement(me) ? true
-									: includeReferences));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * calculate the to-many references
-	 * @param elementXml XmlElement
-	 * @param includeReferences boolean
-	 */
-	public void calculate0nReferences(XmlElement elementXml,
-			boolean includeReferences) {
-		// referenceMap.clear();
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			// get all string type attributes
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features
-						.get(i);
-				if (feature.isMany()) {
-					loadFeature(feature, elementXml, includeReferences);
-				}
-			}
-		}
-	}
-
-	protected XmlElement getXmlElement() {
-		XmlElement elementXml = new XmlElement("Element") //$NON-NLS-1$
-				.setAttribute("Id", getId()) //$NON-NLS-1$	
-				.setAttribute("Type", getType()) //$NON-NLS-1$
-				.setAttribute("TypeName", TngUtil.getTypeText(element)) //$NON-NLS-1$
-				.setAttribute("Name", getName()) //$NON-NLS-1$
-				.setAttribute("BackPath", getBackPath()) //$NON-NLS-1$
-				.setAttribute("ShapeiconUrl", getShapeiconUrl()) //$NON-NLS-1$
-				.setAttribute("DisplayName", getDisplayName()); //$NON-NLS-1$
-
-		if ( showElementLink ) {
-			elementXml.setAttribute("Url", getUrl()); //$NON-NLS-1$
-		} 
-		
-		return elementXml;
-	}
-
-	/**
-	 * load the attributes
-	 * @param elementXml XmlElement
-	 */
-	public void loadAttributes(XmlElement elementXml) {
-
-		boolean isActivityAttribute = (element instanceof Activity) 
-			|| (element instanceof ContentDescription) 
-				&& (element.eContainer() instanceof Activity || ownerElement instanceof Activity);
-		
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			// get all string type attributes
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature p = (EStructuralFeature) features.get(i);			
-				if (!(p instanceof EAttribute) ) {
-					continue;
-				}
-				EAttribute attrib = (EAttribute)p;
-				String name = p.getName();
-									
-				Object value;
-				if (name.equals("presentationName")) //$NON-NLS-1$
-				{
-					// value = TngUtil.getPresentationName(element);
-					value = ConfigurationHelper.getPresentationName(element,
-							layoutManager.getConfiguration());
-				} else if( isActivityAttribute && String.class.isAssignableFrom(attrib.getEAttributeType().getInstanceClass())) {
-					
-					// for activity, the way to merge attribute from base is different
-					value = ConfigurationHelper.getActivityStringAttribute(element, ownerElement, attrib, getLayoutMgr().getConfiguration());
-				} else {
-					value = getAttributeFeatureValue(p);
-				}
-				
-				// escape Brief Description into HTML entities
-				if (name.equals("briefDescription") && value instanceof String) { //$NON-NLS-1$
-					MultiFileXMISaveImpl.MyEscape myEscape = new MultiFileXMISaveImpl.MyEscape();
-					value = myEscape.convert((String)value);
-					value = StrUtil.convertNewlinesToHTML((String)value);
-				}
-
-				elementXml
-						.newChild("attribute").setAttribute("name", name).setValue((value == null) ? "" : value.toString()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-		}
-	}
-
-	/**
-	 * get the attribute feature value and merge the text, fix url referneces, etc.
-	 * @param feature EStructuralFeature
-	 * @return Object
-	 */
-	public Object getAttributeFeatureValue(EStructuralFeature feature) {
-		Object value = ConfigurationHelper.calcAttributeFeatureValue(element,
-				ownerElement, feature, layoutManager.getConfiguration());
-
-		// now if the target is set and is different from the element or the
-		// element's owner
-		// then fix the content
-		if ((targetElement != null) && (value != null)
-				&& (value.toString().length() > 0)) {
-			String contentPath = ResourceHelper
-					.getElementPath((element instanceof ContentDescription) ? 
-							((ownerElement==null) ? (MethodElement) element.eContainer() : ownerElement) 
-							: element);
-
-			String backPath = ResourceHelper
-					.getBackPath((targetElement instanceof ContentDescription) ? (MethodElement) targetElement
-							.eContainer()
-							: targetElement);
-
-			value = ResourceHelper.fixContentUrlPath(value.toString(),
-					contentPath, backPath);
-
-		}
-
-		return value;
-	}
-
-	/**
-	 * load the copyright text
-	 * @param elementXml XmlElement
-	 */
-	public void loadCopyright(XmlElement elementXml) {
-
-		// List items = new ArrayList();
-		// ConfigurationHelper.calculateCopyright(element,
-		// layoutManager.getConfiguration(), items);
-		// if ( items.size() > 0 )
-		// {
-		// SupportingMaterial copyright;
-		// StringBuffer copyrights = new StringBuffer();
-		// for ( Iterator it = items.iterator(); it.hasNext(); )
-		// {
-		// copyright = (SupportingMaterial) it.next();
-		// String statement = copyright.getPresentation().getMainDescription();
-		//							
-		// // need to fix the content for relative links.
-		// // since the link is a relative path to the SupportingMaterial
-		// location,
-		// // need to convert to relative to the current element
-		// // so re-calcuate the back path
-		// // jxi, 06/28/05
-		// String contentPath = ResourceHelper.getElementPath(copyright);
-		// String backPath = ResourceHelper.getBackPath(element);
-		// statement = ResourceHelper.fixContentUrlPath(statement, contentPath,
-		// backPath);
-		// copyrights.append(statement);
-		// }
-		//			
-		// elementXml.newChild("copyright").setValue(copyrights.toString());
-		// //$NON-NLS-1$
-		// }
-
-		String copyright = ConfigurationHelper.getCopyrightText(element,
-				layoutManager.getConfiguration());
-		if (copyright != null && copyright.length() > 0) {
-			elementXml.newChild("copyright").setValue(copyright); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * calculate the to-one reference
-	 * @param elementXml XmlElement
-	 * @param includeReferences boolean
-	 */
-	public void calculate01References(XmlElement elementXml,
-			boolean includeReferences) {
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			// get element references
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature p = (EStructuralFeature) features.get(i);
-
-				// Object value = element.get(i);
-
-				EClassifier type = p.getEType();
-				if (!(type instanceof EClass) || p.isMany()) {
-					continue;
-				}
-
-				loadFeature(p, elementXml, includeReferences);
-			}
-		}
-	}
-
-	/**
-	 * load the non-attribute feature
-	 * 
-	 * @param feature
-	 * @param elementXml
-	 * @param includeReferences
-	 */
-	public void loadFeature(EStructuralFeature feature, XmlElement elementXml,
-			boolean includeReferences) {
-		getFeatureValue(feature,  elementXml, includeReferences);
-	}
-	
-	/**
-	 * load the non-attribute feature
-	 * 
-	 * @param feature
-	 * @param elementXml
-	 * @param includeReferences
-	 */
-	public Object getFeatureValue(EStructuralFeature feature, XmlElement elementXml,
-			boolean includeReferences) {
-		
-		if (!(feature.getEType() instanceof EClass)) {
-			return null;
-		}
-
-		String name = feature.getName();
-
-		if (!feature.isMany()) {
-			MethodElement e = ConfigurationHelper.calc01FeatureValue(element, ownerElement,
-					feature, layoutManager.getElementRealizer());
-			// Browsing stops working when a role is set to
-			// replaced another role
-			// for replacer, the base will be evaluated to the replacer
-			// and causing deadlock
-			if (e != null && e != element) {
-				boolean showDetail = (ConfigurationHelper
-						.isDescriptionElement(e)
-				/*
-				 * || (p ==
-				 * UmaPackage.eINSTANCE.getMethodUnit_CopyrightStatement())
-				 */) ? true : includeReferences;
-				
-				if ( acceptFeatureValue(feature, e) ) {
-					if ( elementXml != null ) {
-						processChild(feature, elementXml
-										.newChild(TAG_REFERENCE).setAttribute("name", name), e, showDetail); //$NON-NLS-1$ 
-					}
-					
-					return e;
-				} else {
-					return null;
-				}
-			}
-		} else if (feature.isMany()) {
-			List pv = ConfigurationHelper.calc0nFeatureValue(element, ownerElement, feature,
-					layoutManager.getElementRealizer());
-			if ( acceptFeatureValue(feature, pv) ) {
-				if ( elementXml != null ) {
-					addReferences(feature, elementXml, name, pv);
-				}
-				return pv;
-			} else {
-				return null;
-			}
-		}
-		
-		return null;
-	}
-
-	/**
-	 * load the non-attribute feature
-	 * 
-	 * @param feature
-	 * @param elementXml
-	 * @param includeReferences
-	 */
-	public void loadFeature(OppositeFeature feature, XmlElement elementXml,
-			boolean includeReferences) {
-		String name = feature.getName();
-
-		if (!feature.isMany()) {
-			MethodElement e = ConfigurationHelper.calc01FeatureValue(element,
-					feature, layoutManager.getElementRealizer());
-			// Browsing stops working when a role is set to
-			// replaced another role
-			// for replacer, the base will be evaluated to the replacer
-			// and causing deadlock
-			if (e != null && e != element) {
-				boolean showDetail = (ConfigurationHelper
-						.isDescriptionElement(e)
-				/*
-				 * || (p ==
-				 * UmaPackage.eINSTANCE.getMethodUnit_CopyrightStatement())
-				 */) ? true : includeReferences;
-
-				if ( acceptFeatureValue(feature, e) )
-				{
-					processChild(feature, 
-							elementXml
-									.newChild(TAG_REFERENCE).setAttribute("name", name), e, showDetail); //$NON-NLS-1$ 
-				}
-			}
-		} else if (feature.isMany()) {
-			List pv = ConfigurationHelper.calc0nFeatureValue(element, feature,
-					layoutManager.getElementRealizer());
-			if ( acceptFeatureValue(feature, pv) && pv.size() > 0) {
-				addReferences(feature, elementXml, name, pv);
-			}
-		}
-	}
-
-	/**
-	 * load references for the element
-	 * @param elementXml XmlElement
-	 * @param includeReferences boolean
-	 */
-	public void loadReferences(XmlElement elementXml, boolean includeReferences) {
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features
-						.get(i);
-				if (feature.getEType() instanceof EClass) {
-					loadFeature(feature, elementXml, includeReferences);
-				}
-			}
-		}
-		
-		Collection oppositeProperties = new ArrayList(element.getOppositeFeatures());
-		for (Iterator z= oppositeProperties.iterator(); z.hasNext(); )
-		{
-			OppositeFeature ofeature = (OppositeFeature) z.next();
-			loadFeature(ofeature, elementXml, includeReferences);
-		}
-		//elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false");
-	}
-
-	/**
-	 * add the reference layout to the result
-	 * @param feature Object
-	 * @param elementXml XmlElement
-	 * @param referenceName String
-	 * @param element MethodElement
-	 */
-	public void addReference(Object feature, XmlElement elementXml, String referenceName,
-			MethodElement element) {
-		processChild(feature, 
-				elementXml
-						.newChild(TAG_REFERENCE).setAttribute("name", referenceName), element, false); //$NON-NLS-1$ 
-	}
-
-	/**
-	 * add references to the layout
-	 * @param feature
-	 * @param elementXml
-	 * @param referenceName
-	 * @param items
-	 */
-	public void addReferences(Object feature, XmlElement elementXml, String referenceName,
-			List items) {
-		processChild(feature, 
-				elementXml
-						.newChild(TAG_REFERENCELIST).setAttribute("name", referenceName), items, false); //$NON-NLS-1$ 
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = getXmlElement();
-
-		// load the references
-		if (includeReferences) {
-
-			// load the copyright info
-			loadCopyright(elementXml);
-
-			// load the attributes
-			loadAttributes(elementXml);
-
-			loadReferences(elementXml, false);
-		}
-
-		return elementXml;
-	}
-
-	/**
-	 * some layout need to have the feature values for further processing. So
-	 * this method will be called when a feature is calculated in this abstract
-	 * class
-	 * 
-	 * @param name
-	 * @param value
-	 */
-	protected boolean acceptFeatureValue(EStructuralFeature feature, Object value) {
-		return true;
-	}
-
-	protected boolean acceptFeatureValue(OppositeFeature feature, Object value) {
-		if ( feature == AssociationHelper.DescribableElement_CustomCategories) {
-			if ( value instanceof CustomCategory ) {
-				return getPublishCategoryProperty((MethodElement)value);
-			} else if ( value instanceof List) {
-				List items = (List)value;
-				int i = 0;
-				while ( i < items.size() ) {
-					MethodElement e = (MethodElement)items.get(i);
-					if ( !getPublishCategoryProperty(e) ) {
-						items.remove(i);
-					} else {
-						i++;
-					}
-				}
-				
-				return true;
-			}
-		}
-			
-		return true;
-	}
-	
-	private boolean getPublishCategoryProperty(MethodElement e) {
-		MethodElementProperty prop = TngUtil.getPublishCategoryProperty(e);
-		if ( prop == null ) {
-			return false;
-		}
-		
-		String v = prop.getValue();
-		if ( v == null || !v.toString().equals("true") ) { //$NON-NLS-1$
-			return false;
-		}
-	
-		return true;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getShapeiconUrl()
-	 */
-	public String getShapeiconUrl() {
-		URI uri = null;
-		String imageUrl;
-		
-		// String imageFile;
-		if (element instanceof DescribableElement) {
-			uri = ((DescribableElement) element).getShapeicon();
-		}
-
-		ILibraryResourceManager resMgr = ResourceHelper.getResourceMgr(element);
-
-		if (uri == null || resMgr == null ) {
-			imageUrl = getDefaultShapeiconUrl();
-		} else {
-			imageUrl = NetUtil.decodedFileUrl(uri.toString());
-		}
-
-		// need to copy the image file if it's not in the default directory
-		if (!imageUrl.startsWith("images/")) //$NON-NLS-1$
-		{
-		
-			// From EPF 1.2, shapeIcon/nodeIcon stores uri relative to plugin path. 
-			// Below section of code is necessary to append plugin name to shapeIcon/nodeIcon uri.
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-			if(plugin != null){
-				if(!imageUrl.startsWith(plugin.getName()) ){
-//					String pluginPath = ResourceHelper.getPluginPath(element);
-//					File file = new File(pluginPath + File.separator+ imageUrl);
-//					imageUrl = NetUtil.encodeFileURL(FileUtil.getRelativePath(file, 
-//							new File(libRoot)));
-					imageUrl = NetUtil.encodeFileURL(plugin.getName() + "/" + imageUrl); //$NON-NLS-1$
-				}
-			}
-			
-			if ( resMgr != null ) {
-				// need decoded URL for file ops
-				String decodedImageUrl = NetUtil.decodedFileUrl(imageUrl);
-				File source = new File(resMgr.resolve(element, decodedImageUrl));
-				File dest = new File(getLayoutMgr().getPublishDir(), decodedImageUrl);
-				FileUtil.copyFile(source, dest);
-			}
-		}
-
-		return imageUrl;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getNodeiconUrl()
-	 */
-	public String getNodeiconUrl() {
-		return ""; //$NON-NLS-1$
-	}
-
-	public String getDefaultShapeiconUrl() {
-		return LayoutResources.getDefaultShapeiconUrl(element.getType()
-				.getName().toLowerCase());
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getDiagramiconUrl()
-	 */
-	public String getDiagramiconUrl() {
-		return "icons/" + element.getType().getName() + ".gif"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * this is a shared method to load the work order of the work breakdown
-	 * element. will be used by all work breakdown elemnt layout.
-	 * 
-	 * @param elementXml
-	 *            XmlElement the parent xml element to load the work order
-	 *            layout
-	 */
-	protected void loadWorkOrder(XmlElement elementXml) {
-		EStructuralFeature feature = UmaPackage.eINSTANCE
-				.getWorkBreakdownElement_LinkToPredecessor();
-
-		List items = ConfigurationHelper.calc0nFeatureValue(element, feature,
-				layoutManager.getElementRealizer());
-		XmlElement predecessorXml = elementXml
-				.newChild(TAG_REFERENCELIST).setAttribute("name", feature.getName()); //$NON-NLS-1$ 
-		if (items != null && items.size() > 0) {
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				WorkOrder wo = (WorkOrder) it.next();
-				MethodElement me = (MethodElement) ConfigurationHelper
-						.calc01FeatureValue(wo, UmaPackage.eINSTANCE
-								.getWorkOrder_Pred(), layoutManager
-								.getElementRealizer());
-				if (me != null) {
-					IElementLayout l = getChildLayout(me);
-					if (l != null) {
-						predecessorXml.addChild(l.getXmlElement(false));
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * show the descriptors of the method element
-	 * @param descriptors
-	 */
-	protected void processDescriptors(XmlElement elementXml) {
-		
-		// 180583 - Pub options to allow adding (when publishing) all descriptors under a method element in form of their path
-		
-		if ( !getLayoutMgr().getValidator().showRelatedDescriptors() ) {
-			return;
-		}
-		
-		// show the role descriptors referencing this role
-		OppositeFeature of = null;
-		
-		if ( this.element instanceof Role ) {
-			of = AssociationHelper.Role_RoleDescriptors;
-		} else if ( this.element instanceof Task ) {
-			of = AssociationHelper.Task_TaskDescriptors;
-		} else if ( this.element instanceof WorkProduct ) {
-			of = AssociationHelper.WorkProduct_WorkProductDescriptors;
-		}
-			
-		List descriptors = ConfigurationHelper.calc0nFeatureValue(
-				this.element, of,
-				layoutManager.getElementRealizer());
-
-		// create a element nodes for cescriptor list
-		XmlElement descListXml = elementXml.newChild(TAG_REFERENCELIST).setAttribute("name", "descriptors"); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		for (int i = 0; i < descriptors.size(); i++ ) {
-			Descriptor desc = (Descriptor)descriptors.get(i);
-			IElementLayout layout = getChildLayout(desc);
-			XmlElement descXml = layout.getXmlElement(false);
-			descListXml.addChild(descXml);
-			
-			List parents = __getSuperActivities(desc);
-			for (int p = 0; p < parents.size(); p++ ) {
-				Activity act = (Activity)parents.get(p);
-				layout = getChildLayout(act);
-				XmlElement actXml = layout.getXmlElement(false);
-				descXml.addChild(actXml);
-			}			
-		}
-	}
-	
-	private List __getSuperActivities(BreakdownElement element) {
-		List items = new ArrayList();
-		
-		// build the parent nodes
-		BreakdownElement parent = element.getSuperActivities(); 
-		while ( parent != null ) {
-			
-			// need to realize the activity, so that we get the correct link and parent links
-			// 204745 - wrong process usage path for contributing activities
-			parent = (BreakdownElement)ConfigurationHelper.getCalculatedElement(parent, layoutManager.getElementRealizer());
-			if ( parent == null ) {
-				break;
-			}
-
-			items.add(0, parent);
-			if (LibraryUtil.isProcess(parent) ) {
-				break;
-			}
-			parent = parent.getSuperActivities();
-		}
-
-		return items;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractProcessElementLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractProcessElementLayout.java
deleted file mode 100644
index ca025f3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractProcessElementLayout.java
+++ /dev/null
@@ -1,372 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Process;
-
-import com.ibm.icu.util.StringTokenizer;
-
-
-/**
- * abstrct class for process element layout that is process specific
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public abstract class AbstractProcessElementLayout extends
-		AbstractElementLayout {
-
-	protected Process owningProcess = null;
-
-	protected String elementProcessPath = null;
-	protected String relProcessPath = null;
-	protected String[] paths = null;
-	protected String displayName = null;
-	
-	/**
-	 * construct a layout for process element
-	 * 
-	 * @param layoutManager
-	 * @param element
-	 * @param owningProc
-	 * @param path
-	 */
-	public void init(ElementLayoutManager layoutManager, MethodElement element,
-			Process owningProc, String path) {
-
-		init(layoutManager, element);
-
-		this.owningProcess = owningProc;
-		this.elementProcessPath = path;
-
-		if (this.owningProcess == null) {
-			this.owningProcess = TngUtil
-					.getOwningProcess((BreakdownElement) super.element);
-		}
-
-		if (LibraryUtil.isProcess(element)) {
-			owningProcess = (Process) element;
-			elementProcessPath = AbstractProcessElementLayout.makePath(null,
-					element);
-			relProcessPath = elementProcessPath;
-		}
-		
-		if ( elementProcessPath == null && this.element instanceof BreakdownElement)
-		{
-			elementProcessPath = AbstractProcessElementLayout.getPath((BreakdownElement)this.element);
-		}
-		
-		// get the path array
-		paths = getPathArray(elementProcessPath);
-		
-	}
-
-
-	/**
-	 * the process path of this item relative to the calling item
-	 * @param path
-	 */
-	public void setRelativeProcessPath(String path)
-	{
-		this.relProcessPath = path;
-	}
-	
-	/**
-	 * get the relative process path
-	 * @return String
-	 */
-	public String getRelativeProcessPath()
-	{
-		return this.relProcessPath;
-	}
-	
-//	public String getUrl() {
-//		String url = super.getUrl();
-//
-//		return url + getQueryString();
-//	}
-
-	/**
-	 * get query string for the process element
-	 * @return String
-	 */
-	public String getQueryString() {
-//		if (owningProcess == element) {
-//			return "";
-//		}
-		// return "?" + ResourceHelper.URL_PARAMETER_PROCESS + "=" +
-		// owningProcess.getGuid() + "&" + ResourceHelper.URL_PARAMETER_PATH +
-		// "=" + elementProcessPath;
-
-		return ElementLayoutManager.getQueryString(owningProcess.getGuid(),
-				elementProcessPath);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getDisplayName()
-	 */
-	public String getDisplayName() {
-		if ( this.displayName == null ) {
-			Process proc = getOwningProcess();
-			
-			// need to handle the supressed breakdown elements
-			// use the Supress utility
-			Suppression sup = getSuppression(proc);
-	
-			// display name needs to be fixed, extended activity may need to get display name from the base
-			// DVT:  PNs of extended processes no picked up for publish (TCT 638)
-			ComposedAdapterFactory adapterFactory = layoutManager.getCBSAdapterFactory();
-			Object wrapper = sup.getObjectByPath(this.paths, adapterFactory);
-			if ( wrapper == null ) {
-				wrapper = super.element;
-			}
-	
-			IBSItemProvider adapter = (IBSItemProvider) adapterFactory.adapt(
-					wrapper, ITreeItemContentProvider.class);
-	
-			this.displayName = ProcessUtil.getAttribute(element,
-					IBSItemProvider.COL_PRESENTATION_NAME, adapter);
-		}
-		
-		return displayName;
-	}
-	
-	protected Suppression getSuppression(Process proc)
-	{
-		return layoutManager.getSuppression(proc);
-	}
-	
-	protected XmlElement getXmlElement() {
-		XmlElement elementXml = super.getXmlElement();
-		elementXml.setAttribute("queryString", getQueryString()) //$NON-NLS-1$
-			//.setAttribute("owningProcessGuid", owningProcess.getGuid()) // //$NON-NLS-1$
-			//.setAttribute("elementProcessPath", elementProcessPath) //$NON-NLS-1$
-			.setAttribute("relProcessPath", relProcessPath); //$NON-NLS-1$
-
-		return elementXml;
-	}
-	
-	protected Process getOwningProcess() {
-		return owningProcess;
-	}
-
-	protected IElementLayout getLayout(ProcessElementItem item) {
-		IElementLayout layout = layoutManager.createLayout(item.element, owningProcess, item.path);
-		
-		if ( layout instanceof AbstractProcessElementLayout )
-		{		
-			// set the relative path to this layout since this is the caller
-			String relPath = AbstractProcessElementLayout.getRelativePath(item.path, this.elementProcessPath);
-			((AbstractProcessElementLayout)layout).setRelativeProcessPath(relPath);
-		}
-		return layout;
-	}
-
-	protected String getSuperActivityPath() {
-		if ( element instanceof BreakdownElement ) {
-			Activity act = ((BreakdownElement)element).getSuperActivities();
-			String id = act.getGuid();
-			int i = elementProcessPath.indexOf(id);
-			if ( i >=0 ) {
-				return elementProcessPath.substring(0, i + id.length());
-			}
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * static utility methods for make a path for the process elenment
-	 */
-	public static String makePath(String parentPath, MethodElement element) {
-		if (parentPath == null || parentPath.length() == 0) {
-			return element.getGuid();
-		}
-
-		return parentPath + "," + element.getGuid(); //$NON-NLS-1$
-	}
-
-	/**
-	 * static method to get the path of a break down element
-	 * @param element
-	 * @return String
-	 */
-	public static String getPath(BreakdownElement element) {
-		
-		String path = element.getGuid();
-		BreakdownElement act = element;
-		Process proc = TngUtil.getOwningProcess(element);
-
-		// Check superactivity is process and should owning process (this is useful in deepcopy
-		while ( act != proc )
-		{
-			Activity superActs = act.getSuperActivities();
-			if ( superActs != null )
-			{
-				act = superActs;
-				path = act.getGuid() + "," + path; //$NON-NLS-1$
-			}
-			else
-			{
-				break;
-			}
-		}
-		
-		return path;		
-	}
-	
-	/**
-	 * get the path for a given breakdown element item provider
-	 * @param wrapper BreakdownElementWrapperItemProvider
-	 * @return String the path
-	 */
-	public static String getPath(BreakdownElementWrapperItemProvider wrapper)
-	{
-		Object e = LibraryUtil.unwrap(wrapper);
-		if ( !(e instanceof MethodElement) ) {
-			return null;
-		}
-		Object topItem = wrapper.getTopItem();
-		StringBuffer path = new StringBuffer();
-		path.append(((MethodElement)e).getGuid());
-		
-		Object parent = wrapper;
-		while (parent != null && parent != topItem) {
-			if ( parent instanceof BreakdownElement ) {
-				parent = ((BreakdownElement)parent).getSuperActivities();
-				e = parent;
-			} else if ( parent instanceof BreakdownElementWrapperItemProvider ){
-				parent = ((BreakdownElementWrapperItemProvider)parent).getParent(parent);
-				e = LibraryUtil.unwrap(parent);
-			} else {
-				break;
-			}
-			
-			if ( e instanceof MethodElement) {
-				path.insert(0, ((MethodElement)e).getGuid() + ","); //$NON-NLS-1$
-			}
-		}
-		
-		return path.toString();
-	}
-	
-	/**
-	 * utility method to get the relative path to the parent
-	 * @param path String
-	 * @param parentPath String
-	 * @return String
-	 */
-	public static String getRelativePath(String path, String parentPath) {
-		
-		if ( path == null )
-		{
-			return path;
-		}
-		
-		if ( path.startsWith(parentPath) )
-		{
-			return path.substring(parentPath.length());
-		}
-		
-		return path;
-	}
-
-	/**
-	 * get the path arrray
-	 * @param path String
-	 * @return String[]
-	 */
-	public static String[] getPathArray(String path)
-	{
-		if ( path == null )
-		{
-			return new String[]{};			
-		}
-		
-		List items = new ArrayList();
-		StringTokenizer st = new StringTokenizer(path, ","); //$NON-NLS-1$
-		while ( st.hasMoreTokens() )
-		{
-			String s = st.nextToken().trim();
-			if ( s.length() > 0 )
-			{
-				items.add(s);
-			}
-		}
-		
-		String[] arr = new String[items.size()];
-		items.toArray(arr);
-		
-		return arr;
-	}
-	
-	/**
-	 * get the owning process from path, the first part of the path is the guid of the process
-	 * @param path
-	 * @return String
-	 */
-	public static String getOwningProcessGuidFromPath(String path)
-	{
-		if ( path == null )
-		{
-			return null;
-		}
-		
-		int index = path.indexOf(","); //$NON-NLS-1$
-		String guid;
-		if ( index < 0 )
-		{
-			guid = path;
-		}
-		else
-		{
-			guid = path.substring(0, index);
-		}
-		
-		return guid;
-	}
-
-	/**
-	 * get the parent path
-	 * @param path
-	 * @return String
-	 */
-	public static String getParentPath(String path) {
-		if ( path == null ) {
-			return null;
-		}
-		
-		int index = path.lastIndexOf(","); //$NON-NLS-1$
-		if ( index > 0 ) {
-			return path.substring(0, index);
-		}
-		
-		return null;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayout.java
deleted file mode 100644
index 47c5bb2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayout.java
+++ /dev/null
@@ -1,1606 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.common.utils.Timer;
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.edit.util.PredecessorList;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.LayoutInfo;
-import org.eclipse.epf.library.layout.diagram.DiagramInfo;
-import org.eclipse.epf.library.layout.diagram.IActivityDiagramService;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.prefs.BSColumn;
-import org.eclipse.epf.library.prefs.PreferenceUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.osgi.util.NLS;
-
-
-/**
- * The element layout for a Role.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ActivityLayout extends AbstractProcessElementLayout {
-	
-	public static final String TAB_NAME_ACTIVITY_DESC = "Description"; //$NON-NLS-1$
-	public static final String TAB_NAME_ACTIVITY_WBS = "WBS"; //$NON-NLS-1$
-	public static final String TAB_NAME_ACTIVITY_TBS = "TBS"; //$NON-NLS-1$
-	public static final String TAB_NAME_ACTIVITY_WPBS = "WPBS"; //$NON-NLS-1$
-	
-	//public static final String BRACE_REPLACEMENT = "_BR_";	 //$NON-NLS-1$
-	//public static final String OPENBRACE_STRING = "\\{";	 //$NON-NLS-1$
-	
-	org.eclipse.epf.diagram.model.util.DiagramInfo userDiagramInfo = null;
-	boolean debug = LibraryPlugin.getDefault().isDebugging();
-	
-	private TBSItemDetail itemDetail = new TBSItemDetail();
-	
-	public ActivityLayout() {
-		super();
-	}
-
-	/**
-	 * initialize the layout
-	 */
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		
-		// make sure the process is loaded
-		// otherwise the process or process elements may not have a valid container
-		// and thus the element content path can't be determined
-		// this is just a workaround. should we have a better way to make sure the elements are loaded correctly???????????
-		MethodPlugin plugin = LibraryUtil.getMethodPlugin(element);
-		if ( plugin == null || plugin.eContainer() == null ) {
-			// this should not happen in publishing mode since the whole library is already loaded
-			if ( debug && getLayoutMgr().isPublishingMode() ) {
-				System.out.println("Error: Element without a valid container: " + LibraryUtil.getTypeName(element)); //$NON-NLS-1$
-			}
-
-			LibraryUtil.loadAllProcesses(LibraryService.getInstance().getCurrentMethodLibrary());
-		}
-		
-		super.__init(layoutManager, element);
-
-		userDiagramInfo = new org.eclipse.epf.diagram.model.util.DiagramInfo((Activity)element);
-		
-	
-		// setup the multi layout output
-		// String file_desc = super.getFileName(ResourceHelper.FILE_EXT_HTML);		
-		
-		String file;
-		
-//		if (super.element.getGuid().startsWith("{"))
-//		{
-//			String newGuid = super.element.getGuid().replaceFirst( OPENBRACE_STRING, BRACE_REPLACEMENT );
-//			file = super.element.getName() + newGuid.substring(0, newGuid.length()-1);
-//		}
-//		else
-			//file = StrUtil.removeSpecialCharacters(super.element.getName()) + super.element.getGuid();
-		
-		file = getFileName(ResourceHelper.FILE_EXT_HTML);
-		if (file != null ) {
-			// replace ' and " with space
-			file = file.replace('\'', ' ').replace('\"', ' ');
-			
-			setLayoutInfo(new LayoutInfo(
-				TAB_NAME_ACTIVITY_DESC, "activity_desc.xsl", file + TABURL_SUFFIX_DESC, true)); //$NON-NLS-1$ 
-			setLayoutInfo(new LayoutInfo(
-				TAB_NAME_ACTIVITY_WPBS, "activity_wpbs.xsl", file + TABURL_SUFFIX_WPBS, false)); //$NON-NLS-1$ 
-			setLayoutInfo(new LayoutInfo(
-				TAB_NAME_ACTIVITY_TBS, "activity_tbs.xsl", file + TABURL_SUFFIX_TBS, false)); //$NON-NLS-1$ 
-			setLayoutInfo(new LayoutInfo(
-				TAB_NAME_ACTIVITY_WBS, "activity_wbs.xsl", file + TABURL_SUFFIX_WBS, false)); //$NON-NLS-1$ 
-		} else {
-			System.out.println("Error in ActivityLayout.init: no file for element " + super.element.getName()); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXslUrl()
-	 */
-	public String getXslUrl() {
-		// set the default tab url, the default tab will be set in publishing.
-		// for browsing, use the TAB_NAME_ACTIVITY_WBS tab
-		String tabName = getLayoutMgr().getValidator().getDefaultActivityTab();
-		if ( tabName == null ) {
-			tabName = TAB_NAME_ACTIVITY_WBS;
-		}
-		LayoutInfo info = getLayoutInfo(tabName);
-		if ( info == null ) {
-			info = getLayoutInfo(TAB_NAME_ACTIVITY_WBS);
-		}	
-		
-		return info.layout_xsl;
-	}
-	
-	private static final String TABURL_SUFFIX_DESC = "_desc" + ResourceHelper.FILE_EXT_HTML; //$NON-NLS-1$
-	private static final String TABURL_SUFFIX_WPBS = "_wpbs" + ResourceHelper.FILE_EXT_HTML; //$NON-NLS-1$
-	private static final String TABURL_SUFFIX_TBS = "_tbs" + ResourceHelper.FILE_EXT_HTML; //$NON-NLS-1$
-	private static final String TABURL_SUFFIX_WBS = "_wbs" + ResourceHelper.FILE_EXT_HTML; //$NON-NLS-1$
-	
-	public static boolean isActivityTabUrl(String url) {
-		
-		if ( url == null || url.length() == 0 ) {
-			return false;
-		}
-		
-		return (url.endsWith(TABURL_SUFFIX_DESC) 
-				|| url.endsWith(TABURL_SUFFIX_WPBS) 
-				|| url.endsWith(TABURL_SUFFIX_TBS) 
-				|| url.endsWith(TABURL_SUFFIX_WBS) );
-		
-	}
-	/**
-	 * override this method to collect the SupportingMaterials that are for user defined diagrams
-	 */
-	protected boolean acceptFeatureValue(EStructuralFeature feature, Object value) {
-		
-		if ( value instanceof SupportingMaterial ) {			
-			return !userDiagramInfo.isDiagram( (SupportingMaterial)value );
-		}
-		else if ( value instanceof List )
-		{
-			List items = (List)value;
-			int i = 0;
-			while ( i < items.size() )
-			{
-				Object o = items.get(i);
-				if ( (o instanceof SupportingMaterial) && userDiagramInfo.isDiagram((SupportingMaterial)o) ) {			
-					items.remove(i);
-				}
-				else
-				{
-					i++;
-				}
-			}
-		}
-		
-		return true;
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		
-		String msg;
-		Timer t = null;
-		if ( debug ) {
-			t = new Timer();	
-			msg = "Generating layout xml for " + LibraryUtil.getTypeName(element)  //$NON-NLS-1$ 
-				+ ", includeReferences = " + includeReferences; //$NON-NLS-1$
-			System.out.println(msg);
-		}
-		
-
-		XmlElement elementXml = super.getXmlElement();
-		
-		// load the attributes
-		loadAttributes(elementXml);
-		
-//		// set the default tab url, the default tab will be set in publishing.
-//		// for browsing, use the TAB_NAME_ACTIVITY_WBS tab
-//		String tabName = getLayoutMgr().getValidator().getDefaultActivityTab();
-//		if ( tabName == null ) {
-//			tabName = TAB_NAME_ACTIVITY_WBS;
-//		}
-//		LayoutInfo linfo = getLayoutInfo(tabName);
-//		if ( linfo == null ) {
-//			linfo = getLayoutInfo(TAB_NAME_ACTIVITY_WBS);
-//		}	
-//		
-//		elementXml.setAttribute("defaultTabUrl", linfo.fileName);
-//		
-		Process proc = getOwningProcess();
-		
-		// need to handle the supressed breakdown elements
-		// use the Supress utility
-		Suppression sup = getSuppression(proc);
-
-//		// display name needs to be fixed, extended activity may need to get display name from the base
-//		// DVT:  PNs of extended processes no picked up for publish (TCT 638)
-//		ComposedAdapterFactory adapterFactory = layoutManager.getCBSAdapterFactory();
-//		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-//		if ( wrapper == null ) {
-//			wrapper = super.element;
-//		}
-//
-//		IBSItemProvider adapter = (IBSItemProvider) adapterFactory.adapt(
-//				wrapper, ITreeItemContentProvider.class);
-//
-//		String displayName = ProcessUtil.getAttribute(element,
-//				IBSItemProvider.COL_PRESENTATION_NAME, adapter);
-//
-//		elementXml.setAttribute("DisplayName", displayName); //$NON-NLS-1$
-		
-		if (!includeReferences) {
-			return elementXml;
-		}
-		
-		elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		// get the tabs xml section
-		XmlElement tabsXml = elementXml.newChild("tabs"); //$NON-NLS-1$
-		for (Iterator it = layouts.iterator(); it.hasNext();) {
-			LayoutInfo info = (LayoutInfo) it.next();
-			tabsXml.newChild("tab") //$NON-NLS-1$
-					.setAttribute("name", info.name) //$NON-NLS-1$
-					.setAttribute("url", super.elementPath + info.fileName); //$NON-NLS-1$
-		}
-
-		// do it only when it's a process or it's not in publishing model
-		// since in publishing, the iteration always start from process
-		// for browsing, it can start in the middle 
-		if ( !getLayoutMgr().isPublishingMode() || super.element instanceof org.eclipse.epf.uma.Process ) {
-			getLayoutMgr().prepareAdaptorFactoriesForProcess(proc);
-		}
-
-		// load the copyright info
-		loadCopyright(elementXml);
-
-		// calculate other selected referecnes
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			// get element references
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features
-						.get(i);
-
-				// skip the breakdown elements since we will build the breakdown
-				// structure later
-				if (feature == UmaPackage.eINSTANCE
-						.getActivity_BreakdownElements()) {
-					continue;
-				}
-
-				// Object value = element.get(i);
-				EClassifier type = feature.getEType();
-				if (!(type instanceof EClass)) {
-					continue;
-				}
-
-				loadFeature(feature, elementXml, false);
-			}
-		}
-		
-		Collection oppositeProperties = new ArrayList(element.getOppositeFeatures());
-		for (Iterator z= oppositeProperties.iterator(); z.hasNext(); )
-		{
-			OppositeFeature ofeature = (OppositeFeature) z.next();
-			loadFeature(ofeature, elementXml, includeReferences);
-		}
-		
-		if ( debug ) {
-			t.stop();
-			msg = t.getTime() + " mini seconds building Activity Descriotion xml for " + LibraryUtil.getTypeName(element)  ; //$NON-NLS-1$ 			
-			System.out.println(msg);
-			
-			t.start();
-		}
-
-		buildWBS(elementXml, sup);
-		if ( debug ) {
-			t.stop();
-			msg = t.getTime() + " mini seconds building WBS for " + LibraryUtil.getTypeName(element)  ; //$NON-NLS-1$ 			
-			System.out.println(msg);
-			
-			t.start();
-		}
-		
-		buildTBS(elementXml, sup);	
-		
-		if ( debug ) {
-			t.stop();
-			msg = t.getTime() + " mini seconds building TBS for " + LibraryUtil.getTypeName(element)  ; //$NON-NLS-1$ 			
-			System.out.println(msg);
-	
-			t.start();
-		}
-		
-		buildWPBS(elementXml, sup);
-		
-		if ( debug ) {
-			t.stop();
-			msg = t.getTime() + " mini seconds building WPBS for " + LibraryUtil.getTypeName(element)  ; //$NON-NLS-1$ 			
-			System.out.println(msg);
-			
-			msg = t.getTotalTime() + " mini seconds building layout xml for " + LibraryUtil.getTypeName(element)  ; //$NON-NLS-1$ 			
-			System.out.println(msg);
-		}
-		
-		
-//		// for test only
-//		ProcessLayoutData data = new ProcessLayoutData(getOwningProcess().getGuid());
-//		loadLayoutData(data, true, true, true);
-		
-		return elementXml;
-	}
-
-	private String getUserDiagramText(SupportingMaterial userDiagram)
-	{
-		// user defined diagram
-		AbstractElementLayout l = new GeneralLayout();
-		l.init(getLayoutMgr(), userDiagram.getPresentation());
-		l.setContentTarget(element);
-		EStructuralFeature feature = UmaPackage.eINSTANCE.getContentDescription_MainDescription();
-		return (String)l.getAttributeFeatureValue(feature);		
-	}
-	
-	private void setColumns(XmlElement parentXml, List cols) {
-		XmlElement colsXml = parentXml.newChild("columns"); //$NON-NLS-1$
-		for (Iterator it = cols.iterator(); it.hasNext(); ) {
-			BSColumn col = (BSColumn)it.next();
-			colsXml.newChild("column") //$NON-NLS-1$
-				.setAttribute("id", col.id) //$NON-NLS-1$
-				.setAttribute("label", col.label); //$NON-NLS-1$
-		}
-	}
-	
-	private void buildWBS(XmlElement elementXml, Suppression sup)
-	{
-		// build the breakdown structure tree
-		XmlElement bs = elementXml
-				.newChild("breakdown").setAttribute("name", "Work Breakdown Structure") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				.setAttribute("DisplayName", getDisplayName()); //$NON-NLS-1$
-
-		// set the columns
-		setColumns(bs, PreferenceUtil.getWBSColumns());
-		
-		// publish the consolidated view
-		ComposedAdapterFactory adapterFactory = layoutManager
-				.getCBSAdapterFactory();
-		CompositeRoles crs = null; //new CompositeRoles(adapterFactory, (Activity) super.element);
-		// if ( super.element instanceof Process )
-		{
-			ProcessUtil.updateIDs(adapterFactory, sup.getProcess());
-		}
-
-		ActivityLayoutSetting setting = new ActivityLayoutSetting(
-				adapterFactory, crs, sup);
-
-		// escape the quotes in the string sicne we set the string into javascript variables in the layout
-		setting.escapeString = true;
-		
-		// set to only show task descriptors for sub-activities
-		setting.showTaskOnly = true;
-		
-		// need to get the raw item provider from the adapter factory
-		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-		if ( wrapper == null ) {
-			wrapper = super.element;
-		} 
-		
-		if ( sup.isSuppressed(wrapper) ) {
-			return;
-		}
-		
-		ProcessElementItem elementItem = new ProcessElementItem(wrapper, super.element, super.elementProcessPath);
-		iterate(elementItem, bs, setting);
-		
-
-		XmlElement diagrams = elementXml.newChild("diagrams"); //$NON-NLS-1$
-		
-		String diagramType;
-		String imgFile;
-		diagramType = ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
-		SupportingMaterial userDiagram = userDiagramInfo.getActivityDiagram();
-		if ( userDiagramInfo.canPublishADImage() && (userDiagram != null) )
-		{				
-			diagrams.newChild("userdiagram") //$NON-NLS-1$
-				.setAttribute("name", diagramType) //$NON-NLS-1$
-				.setValue(getUserDiagramText(userDiagram));
-		}
-		else
-		{
-			org.eclipse.epf.diagram.model.util.DiagramInfo uddInfo = getRealizedUDD(sup, diagramType);
-			boolean generatedDiagram = true;
-			if(uddInfo != null){
-				userDiagram = uddInfo.getActivityDiagram();
-				if(uddInfo.canPublishADImage() && userDiagram != null){
-					diagrams.newChild("userdiagram") //$NON-NLS-1$
-					.setAttribute("name", diagramType) //$NON-NLS-1$
-					.setValue(getUserDiagramText(userDiagram));
-					generatedDiagram = false;
-				}
-			}
-			
-			if(generatedDiagram){
-				imgFile = ResourceHelper.getDiagramFilePathName(element, diagramType);
-				DiagramInfo diagram_workflow = generateDiagram(sup, diagramType, imgFile);	
-				if (diagram_workflow != null
-					&& diagram_workflow.getImageFileName() != null) {
-				diagrams.newChild("diagram") //$NON-NLS-1$
-						.setAttribute("name", ResourceHelper.DIAGRAM_TYPE_WORKFLOW) //$NON-NLS-1$
-						.setAttribute("alt", getDiagramDisplayName(ResourceHelper.DIAGRAM_TYPE_WORKFLOW)) //$NON-NLS-1$
-						//.setValue(diagram_workflow.getHTML());
-						.addChild(diagram_workflow.getXmlElement());
-				}
-			}
-		}
-		
-		diagramType = ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL;
-		userDiagram = userDiagramInfo.getActivityDetailDiagram();
-		if ( userDiagramInfo.canPublishADDImage() && (userDiagram != null) )
-		{				
-			diagrams.newChild("userdiagram") //$NON-NLS-1$
-				.setAttribute("name", diagramType) //$NON-NLS-1$
-				.setValue(getUserDiagramText(userDiagram));
-		}
-		else
-		{
-			imgFile = ResourceHelper.getDiagramFilePathName(element, diagramType);
-			DiagramInfo diagram_detail = generateDiagram(sup, diagramType, imgFile);	
-			if (diagram_detail != null && diagram_detail.getImageFileName() != null) {
-				diagrams
-						.newChild("diagram") //$NON-NLS-1$
-						.setAttribute("name", ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL) //$NON-NLS-1$
-						.setAttribute(
-								"alt", getDiagramDisplayName(ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL)) //$NON-NLS-1$
-						//.setValue(diagram_detail.getHTML());
-						.addChild(diagram_detail.getXmlElement());
-			}
-		}
-		
-		diagramType = ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY;
-		userDiagram = userDiagramInfo.getWPDDiagram();
-		if ( userDiagramInfo.canPublishWPDImage() && (userDiagram != null) )
-		{				
-			diagrams.newChild("userdiagram") //$NON-NLS-1$
-				.setAttribute("name", diagramType) //$NON-NLS-1$
-				.setValue(getUserDiagramText(userDiagram));
-		}
-		else
-		{
-			imgFile = ResourceHelper.getDiagramFilePathName(element, diagramType);
-			DiagramInfo diagram_wp = generateDiagram(sup, diagramType, imgFile);	
-			if (diagram_wp != null && diagram_wp.getImageFileName() != null) {
-				diagrams.newChild("diagram") //$NON-NLS-1$
-						.setAttribute("name", ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY) //$NON-NLS-1$
-						.setAttribute(
-								"alt", getDiagramDisplayName(ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY)) //$NON-NLS-1$
-						//.setValue(diagram_wp.getHTML());
-						.addChild(diagram_wp.getXmlElement());
-			}
-		}
-	}
-	
-	private String getDiagramDisplayName(String type) {
-	
-		String name = getDisplayName();
-		if ( ResourceHelper.DIAGRAM_TYPE_WORKFLOW.equals(type) ) {
-			return NLS.bind(LibraryResources.activityDiagramName, name);		
-		} else if ( ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL.equals(type) ) {
-			return NLS.bind(LibraryResources.activityDetailDiagramName, name);		
-		} else if ( ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY.equals(type) ) {
-			return NLS.bind(LibraryResources.wpDependencyDiagramName, name);		
-		} else {
-			return ""; //$NON-NLS-1$
-		}
-	}
-	
-//	private DiagramInfo generateDiagram(Suppression sup, String diagramType, String imgFile) {
-//		
-////		if ( "_o3nZoSFrEdqrX8YVzvtlIg,_jin2oCGGEdqMcovRzkCQow".equals(super.elementProcessPath) ) {
-////			System.out.println("xx");
-////		}
-//		
-//		DiagramInfo info = null;
-//		ElementLayoutManager mgr = getLayoutMgr();
-//		if (mgr != null) {
-//			info = mgr.getCachedDiagramInfo(sup, diagramType, imgFile);
-//			if (info != null) {
-//				System.err.println("*** diagram generated: " + info.path + ",  file name: " + imgFile);
-//
-//				return info;
-//			}
-//		}
-//		info = generateDiagram_(sup, diagramType, imgFile);
-//		if ( info != null ) {
-//			info.path = super.elementProcessPath;
-//		}
-//		
-//		if (mgr != null) {
-//			mgr.addCachedDiagramInfo(info, sup, diagramType, imgFile);
-//		}
-//		return info;
-//	}
-	
-	private DiagramInfo generateDiagram(Suppression sup, String diagramType, String imgFile)
-	{
-		Timer timer = null;
-		if (debug ){
-			System.out.println("START: generating diagram " + imgFile);
-			timer = new Timer();			
-		}
-		// generate diagram
-		// show the activity diagrams
-		IActivityDiagramService diagramService = layoutManager
-				.getActivityDiagramService();
-		DiagramInfo diagram = null;
-		if (diagramService != null) {
-			IFilter filter = layoutManager.getDiagramAdapterFactory().getFilter();
-			
-			// get the wrapper from the WBS adapter factory
-			Object wrapper = sup.getObjectByPath(super.paths, layoutManager.getDiagramAdapterFactory());
-			
-			// Set the publishing mode
-			boolean publishingmode = LibraryUtil.PUBLISH_MODE;
-			LibraryUtil.PUBLISH_MODE = true;
-
-			diagram = diagramService.saveDiagram(wrapper,
-					imgFile,
-					diagramType, filter, sup);
-			
-			// set back to 
-			LibraryUtil.PUBLISH_MODE = publishingmode;
-		}
-
-		if ( timer != null ){
-			timer.stop();	
-			String msg = timer.getTime() + " mini seconds generating " + diagramType + " diagram"  ; //$NON-NLS-1$ //$NON-NLS-2$ 			
-			System.out.println(msg);
-			System.out.println("END: generating diagram " + imgFile);
-		}
-		
-		return diagram;
-
-	}
-	
-	private org.eclipse.epf.diagram.model.util.DiagramInfo getRealizedUDD(Suppression sup, String diagramType)
-	{
-		// generate diagram
-		// show the activity diagrams
-		IActivityDiagramService diagramService = layoutManager
-				.getActivityDiagramService();
-		if (diagramService != null) {
-			IFilter filter = layoutManager.getDiagramAdapterFactory().getFilter();
-			
-			// get the wrapper from the WBS adapter factory
-			Object wrapper = sup.getObjectByPath(super.paths, layoutManager.getDiagramAdapterFactory());
-
-			Object realized = diagramService.getRealizedForUnmodified(wrapper, filter, sup);
-			
-			if(realized instanceof Activity){
-				org.eclipse.epf.diagram.model.util.DiagramInfo uddInfo = new org.eclipse.epf.diagram.model.util.DiagramInfo(
-						(Activity)realized);
-				if(uddInfo.canPublishADImage()){
-					return uddInfo; 
-				}
-			}
-		}
-		return null;
-	}
-	
-	private void buildTBS(XmlElement elementXml, Suppression sup)
-	{
-		XmlElement bs = elementXml
-		.newChild("breakdown").setAttribute("name", "Team Breakdown Structure") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		.setAttribute("DisplayName", getDisplayName()); //$NON-NLS-1$
-
-		// set the columns
-		setColumns(bs, PreferenceUtil.getTBSColumns());
-
-		ComposedAdapterFactory adapterFactory = layoutManager.getTBSAdapterFactory();
-		CompositeRoles crs = null; //new CompositeRoles(adapterFactory, (Activity) super.element);
-		
-		// roolup the layout
-		IBSItemProvider provider = (IBSItemProvider) adapterFactory.adapt(
-				super.element, ITreeItemContentProvider.class);
-				
-		// need to get the raw item provider from the adapter factory
-		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-		if ( wrapper == null ) {
-			wrapper = super.element;
-		}
-		ProcessElementItem elementItem = new ProcessElementItem(wrapper, super.element, super.elementProcessPath);
-
-		// collect all RoleDescriptors before rollup
-		provider.setRolledUp(false);
-		itemDetail.iterate(adapterFactory, wrapper);
-
-		provider.setRolledUp(true);		
-		ActivityLayoutSetting setting = new ActivityLayoutSetting(adapterFactory, crs, sup);
-		setting.rollupRoles = true;
-		setting.escapeString = true;
-
-		iterate(elementItem, bs, setting);
-	}
-	
-	private void buildWPBS(XmlElement elementXml, Suppression sup)
-	{
-		XmlElement bs = elementXml
-		.newChild("breakdown").setAttribute("name", "Work Product Breakdown Structure") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		.setAttribute("DisplayName", getDisplayName()); //$NON-NLS-1$
-
-		// set the columns
-		setColumns(bs, PreferenceUtil.getWPBSColumns());
-
-		ComposedAdapterFactory adapterFactory = layoutManager.getWPBSAdapterFactory();
-		CompositeRoles crs = null; //new CompositeRoles(adapterFactory, (Activity) super.element);
-		
-		// roolup the layout
-		IBSItemProvider provider = (IBSItemProvider) adapterFactory.adapt(super.element,
-				ITreeItemContentProvider.class);
-		provider.setRolledUp(true);
-		
-		ActivityLayoutSetting setting = new ActivityLayoutSetting(adapterFactory, crs, sup);
-		setting.escapeString = true;
-
-		// need to get the raw item provider from the adapter factory
-		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-		if ( wrapper == null ) {
-			wrapper = super.element;
-		}
-		ProcessElementItem elementItem = new ProcessElementItem(wrapper, super.element, super.elementProcessPath);
-		iterate(elementItem, bs, setting);
-
-	}
-
-	/**
-	 * iterate the break down structure and build the xml document
-	 * 
-	 * @param parentItem
-	 *            The object to iterate. It can be a breakdown element, or it's
-	 *            adaptor
-	 * @param parentXml
-	 * @param adapterFactory
-	 */
-	private void iterate(ProcessElementItem parentItem, XmlElement parentXml,
-			ActivityLayoutSetting setting) {
-		iterate(parentItem, parentXml, setting, 0);
-	}
-	
-	// level to expand all BWS activities to, 0 for the first level
-	private static final int ACTIVITY_SHOW_LEVEL = 1;
-	
-	/**
-	 * iterate the break down structure and build the xml document
-	 * 
-	 * @param parentItem
-	 *            The object to iterate. It can be a breakdown element, or it's
-	 *            adaptor
-	 * @param parentXml
-	 * @param adapterFactory
-	 */
-	private void iterate(ProcessElementItem parentItem, XmlElement parentXml,
-			ActivityLayoutSetting setting, int actLevel) {
-		ITreeItemContentProvider provider = null;
-		Object parentObj = parentItem.rawItem;
-			
-		Timer timer = null;
-		if (debug ){
-			timer = new Timer();			
-		}
-		
-		if (parentObj instanceof ITreeItemContentProvider) {
-			provider = (ITreeItemContentProvider) parentObj;
-		} else {
-			provider = (ITreeItemContentProvider) setting.adapterFactory.adapt(
-					parentObj, ITreeItemContentProvider.class);
-		}
-
-		// Either delegate the call or return nothing.
-		if (provider != null) {
-//			String displayName = ProcessUtil.getAttribute(parentObj,
-//					IBSItemProvider.COL_PRESENTATION_NAME, provider);
-//			parentXml.setAttribute("DisplayName", displayName); //$NON-NLS-1$
-
-			//List uniqueList = new ArrayList();
-			Collection items = provider.getChildren(parentObj);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				Object rawitem = it.next();
-
-				MethodElement item = (MethodElement) LibraryUtil
-						.unwrap(rawitem);
-
-				if ( setting.showTaskOnly && (actLevel > ACTIVITY_SHOW_LEVEL)
-						&& !(item instanceof Activity || item instanceof TaskDescriptor) ) {
-					continue;
-				}
-
-				if ( item == null ) {
-					continue;
-				}
-				
-				// add the element to the reference list, 
-				// this is for publishing only, for browsing, this call does nothing
-				getLayoutMgr().getValidator().addReferencedElement(super.element, item);
-				
-				ProcessElementItem elementItem = new ProcessElementItem(rawitem, item, parentItem);
-
-				// Process Publishing: Replace role descriptor
-				// with composite role
-				// if it contains the role descriptor during preview/publishing
-				// so if this guy is a RoleDescrptor, find the composite role
-				// descriptor within the scope
-				// 
-				if ((parentObj instanceof Activity && setting.crs != null)
-						&& (item instanceof RoleDescriptor)) {
-					CompositeRole cr = setting.crs.getCompositeRole(
-							(Activity) parentObj, (RoleDescriptor) item);
-					if (cr != null) {
-						item = cr;
-					}
-				}
-
-				XmlElement child = generateChildXml(elementItem, parentXml, setting);
-					
-				parentXml.addChild(child);
-									
-				// show only task task descriptors for sub activities in the tbs layout
-				if ( setting.showTaskOnly && (actLevel > ACTIVITY_SHOW_LEVEL) && !(item instanceof Activity )) {
-					// if act level > 0, only iterate the sub-activities
-					continue;
-				}
-				
-				// ineterate children, not just activity, any child in the
-				// rawitem should be iterated,
-				// such as the sub-artifacts
-				iterate(elementItem, child, setting, 
-						(item instanceof Activity) ? actLevel+1 : actLevel);				
-			}
-		}
-		
-		if ( timer != null ) {
-			timer.stop();	
-			if (timer.getTime() > 100) {
-				String msg = timer.getTime() + " mini seconds iterating breakdown item " + LibraryUtil.getTypeName(parentItem.element)  ; //$NON-NLS-1$ 		
-				System.out.println(msg);
-			}
-		}
-	}
-
-	private XmlElement generateChildXml(ProcessElementItem elementItem, XmlElement parentXml,
-			ActivityLayoutSetting setting)
-	{
-		Timer timer = null;
-		if (debug ){
-			timer = new Timer();			
-		}
-		
-		MethodElement item = elementItem.element;
-		
-		IElementLayout l = getLayout(elementItem);
-	
-		// lat the presentation to determine when to show
-		// set generate the flag for browsing
-		boolean isSupressed = setting.sup.isSuppressed(elementItem.rawItem);
-		if ( isSupressed ) {
-			itemDetail.addSuppressed(elementItem.element);
-		}
-		
-		XmlElement child = l.getXmlElement(false);
-
-		// we still generate the item even though it's suppressed, 
-		// let the layout javascript to handle the show or hide
-		// set the isSupressed flag for browsing model only,
-		// for publishing, the flag will be geenrated and saved in a seperated js file
-		// published html pages will get the isSupressed flag via javascript method.
-		if ( !getLayoutMgr().isPublishingMode() )
-		{
-			child.setAttribute("isSupressed", (isSupressed ? "true" : "false") ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		
-		IBSItemProvider adapter = null;
-		if (elementItem.rawItem instanceof IBSItemProvider) {
-			adapter = (IBSItemProvider) elementItem.rawItem;
-		} else {
-			adapter = (IBSItemProvider) setting.adapterFactory
-					.adapt(elementItem.element, ITreeItemContentProvider.class);
-			;
-		}
-
-		// get the index and predecessor indeces
-		if (elementItem.element instanceof BreakdownElement) {
-			String index = getIndex(adapter);
-			String modelInfo = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_MODEL_INFO, adapter);
-			String team = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_TEAMS, adapter);
-			String prefix = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_PREFIX, adapter);			
-			String isEventDriven = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_IS_EVENT_DRIVEN, adapter);
-			String isOngoing = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_IS_ONGOING, adapter);
-			String isOptional = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_IS_OPTIONAL, adapter);
-			String isPlanned = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_IS_PLANNED, adapter);
-			String isRepeatable = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_IS_REPEATABLE, adapter);
-			String hasMultipleOccurrences = ProcessUtil
-					.getAttribute(
-							item,
-							IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES,
-							adapter);
-			
-			String displayName = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_PRESENTATION_NAME, adapter);
-			
-			String mName = ProcessUtil.getAttribute(item,
-					IBSItemProvider.COL_NAME, adapter);
-
-			// for WBS layout we put the string into javascript variables
-			// so need to escape the quotes " and '
-			if ( setting.escapeString )
-			{
-				modelInfo = StrUtil.escape(modelInfo);
-				displayName = XMLUtil.escape(displayName);
-				mName = XMLUtil.escape(mName);
-				
-				// and the url
-				// need an escaped url for javascript
-				String jsEscapedUrl = StrUtil.escape(l.getUrl());
-				child.setAttribute("Url", jsEscapedUrl); //$NON-NLS-1$
-
-			}
-			
-			child.setAttribute("Index", index) //$NON-NLS-1$
-					.setAttribute("ModelInfo", modelInfo) //$NON-NLS-1$
-					.setAttribute("Team", team); //$NON-NLS-1$
-
-			child.newChild("attribute").setAttribute("name", "prefix").setValue(prefix); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			
-			child
-					.newChild("attribute").setAttribute("name", "isEventDriven").setValue(isEventDriven); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-			child
-					.newChild("attribute").setAttribute("name", "isOngoing").setValue(isOngoing); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-			child
-					.newChild("attribute").setAttribute("name", "isOptional").setValue(isOptional); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-			child
-					.newChild("attribute").setAttribute("name", "isPlanned").setValue(isPlanned); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-			child
-					.newChild("attribute").setAttribute("name", "isRepeatable").setValue(isRepeatable); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-			child
-					.newChild("attribute").setAttribute("name", "hasMultipleOccurrences").setValue(hasMultipleOccurrences); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
-
-			child.setAttribute("DisplayName", displayName); //$NON-NLS-1$
-			child.setAttribute("Name", mName); //$NON-NLS-1$
-		}		
-
-		if (item instanceof WorkProductDescriptor) {
-			String entryState = adapter.getAttribute(item, IBSItemProvider.COL_ENTRY_STATE);
-			String exitState = adapter.getAttribute(item, IBSItemProvider.COL_EXIT_STATE);
-			String deliverable = adapter.getAttribute(item, IBSItemProvider.COL_DELIVERABLE);
-
-			child.setAttribute("EntryState", entryState) //$NON-NLS-1$
-					.setAttribute("ExitState", exitState) //$NON-NLS-1$
-					.setAttribute("Deliverable", deliverable); //$NON-NLS-1$
-		}
-
-		if (item instanceof WorkBreakdownElement) {
-			String predecessors = getPredecessors(adapter,
-					setting.sup);
-			child.setAttribute("Predecessors", predecessors); //$NON-NLS-1$
-		}
-
-		// if it's a task descriptor, get the steps
-		if (item instanceof TaskDescriptor) {
-
-			XmlElement stepsXml = child.newChild("Steps"); //$NON-NLS-1$
-			TaskDescriptor td = (TaskDescriptor) item;
-			List selSteps = td.getSelectedSteps();
-			Task t = (Task) ConfigurationHelper
-					.getCalculatedElement(td.getTask(),
-							getLayoutMgr().getConfiguration());
-			if (t != null) {
-				List steps = ConfigurationHelper
-						.calc0nFeatureValue(t, UmaPackage.eINSTANCE
-								.getTask_Steps(), getLayoutMgr()
-								.getElementRealizer());
-				for (int i = 0; i < steps.size(); i++) {
-					Object step = steps.get(i);
-					boolean selected = selSteps.contains(step);
-					stepsXml
-							.newChild("Step") //$NON-NLS-1$
-							.setAttribute(
-									"index", Integer.toString(i)) //$NON-NLS-1$
-							.setAttribute(
-									"selected", selected ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-			}
-
-		}
-
-		// build the team profile tree.
-		// This is a temporary replacement for the team breakdown
-		// structure diagram
-		if (item instanceof TeamProfile) {
-			TeamProfile superTeam = ((TeamProfile)item).getSuperTeam();
-			child.setAttribute("hasSuperTeam", (superTeam != null) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-
-		// if role rollup is set, build the role sub tree
-		if (setting.rollupRoles && item instanceof RoleDescriptor) {
-			buildRoleRollup((RoleDescriptor) item, child, setting);
-		}
-		
-		if ( timer != null ) {
-			timer.stop();	
-			if (timer.getTime() > 100) {
-				String msg = timer.getTime() + " mini seconds generating xml for breakdown item " + LibraryUtil.getTypeName(elementItem.element)  ; //$NON-NLS-1$ 		
-				System.out.println(msg);
-			}
-		}
-		
-		return child;
-	}
-	
-	
-	private void buildRoleRollup(RoleDescriptor roleItem, XmlElement parentXml,
-			ActivityLayoutSetting setting) {
-		Role r = roleItem.getRole();
-		List descriptors = itemDetail.getDescriptors(r);
-		if ( descriptors == null ) {
-			descriptors = new ArrayList();
-		}
-		if ( !descriptors.contains(roleItem) ) {
-			descriptors.add(roleItem);
-		}
-		
-		List responsibleFor = new ArrayList();
-		List modifies = new ArrayList();
-		List primaryTasks = new ArrayList();
-		List additionalTasks = new ArrayList();	
-		List items;
-		
-		for ( Iterator it = descriptors.iterator(); it.hasNext(); ) {
-			
-			roleItem = (RoleDescriptor) it.next();
-			
-			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
-					UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor(), 
-					getLayoutMgr().getElementRealizer());
-			responsibleFor.addAll(items);
-				
-			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
-					UmaPackage.eINSTANCE.getRoleDescriptor_Modifies(), getLayoutMgr().getElementRealizer());
-			modifies.addAll(items);
-			
-			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
-					AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors,
-					getLayoutMgr().getElementRealizer());
-			primaryTasks.addAll(items);
-			
-			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
-					AssociationHelper.RoleDescriptor_AdditionalTaskDescriptors, 
-					getLayoutMgr().getElementRealizer());
-			additionalTasks.addAll(items);
-		}
-		
-		Collections.sort(responsibleFor, Comparators.PRESENTATION_NAME_COMPARATOR);
-		createRoleRollupNodes(parentXml, responsibleFor, TngUtil
-				.getFeatureText(UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor()));
-
-		Collections.sort(modifies, Comparators.PRESENTATION_NAME_COMPARATOR);
-		createRoleRollupNodes(parentXml, modifies, TngUtil
-				.getFeatureText(UmaPackage.eINSTANCE.getRoleDescriptor_Modifies()));
-
-		Collections.sort(primaryTasks, Comparators.PRESENTATION_NAME_COMPARATOR);
-		createRoleRollupNodes(parentXml, primaryTasks, 
-				LibraryResources.ActivityLayout_primaryTasks_text); 
-
-		Collections.sort(additionalTasks, Comparators.PRESENTATION_NAME_COMPARATOR);
-		createRoleRollupNodes(parentXml, additionalTasks, 
-				LibraryResources.ActivityLayout_additionalTasks_text); 
-
-	}
-	
-	private void createRoleRollupNodes(XmlElement parentXml, List items,
-			String info) {
-		
-		// 160188 - Published Team Allocation tab shows redundant information
-		// only show one descriptor if more than one are linked to the same task or wp.
-		// so keep the processed task and wp instead of the descriptors
-		List processed = new ArrayList();
-		MethodElement linked = null;
-		for (Iterator it = items.iterator(); it.hasNext();) {
-			MethodElement e = (MethodElement) it.next();
-			linked = null;
-			if ( e instanceof TaskDescriptor ) {
-				linked = ((TaskDescriptor)e).getTask();
-			} else if ( e instanceof WorkProductDescriptor ) {
-				linked = ((WorkProductDescriptor)e).getWorkProduct();
-			}
-			if ( linked == null ) {
-				linked = e;
-			}
-			
-			if ( processed.contains(linked) ) {
-				continue;
-			}
-			
-			processed.add(linked);
-			
-			IElementLayout l = layoutManager.getLayout(e, true);
-			XmlElement child = l.getXmlElement(false);
-			child.setAttribute("ModelInfo", info); //$NON-NLS-1$
-			parentXml.addChild(child);
-		}
-
-	}
-
-
-	private String getIndex(IBSItemProvider adapter) {
-		// IBSItemProvider adapter = (IBSItemProvider) factory.adapt(e,
-		// ITreeItemContentProvider.class);;
-		if (adapter != null) {
-			int index = adapter.getId();
-			if (index == 0) {
-				return ""; //$NON-NLS-1$
-			}
-			return Integer.toString(index);
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	private String getPredecessors(IBSItemProvider adapter, Suppression sup) {
-		// IBSItemProvider adapter = (IBSItemProvider) factory.adapt(e,
-		// ITreeItemContentProvider.class);;
-		if (adapter != null) {
-			PredecessorList list = adapter.getPredecessors();
-			if (list != null) {
-				return list.toUnSuppressedString(sup, true);
-			}
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	public class CompositeRoles {
-		// a map of activity to CompositeRoleInfo
-		Map itemMap = new HashMap();
-
-		public CompositeRoles(ComposedAdapterFactory adapterFactory,
-				Activity act) {
-			scan(adapterFactory, null, act);
-		}
-
-		private CompositeRoleInfo getCompositeRoleInfo(Activity parent,
-				Activity act) {
-			CompositeRoleInfo info = (CompositeRoleInfo) itemMap.get(act);
-			if (info == null) {
-				info = new CompositeRoleInfo(parent, act);
-				itemMap.put(act, info);
-			}
-
-			return info;
-		}
-
-		private void scan(ComposedAdapterFactory adapterFactory,
-				Activity parent, Activity act) {
-			ITreeItemContentProvider provider = (ITreeItemContentProvider) adapterFactory
-					.adapt(act, ITreeItemContentProvider.class);
-			if (provider != null) {
-				Collection items = provider.getChildren(act);
-				for (Iterator it = items.iterator(); it.hasNext();) {
-					MethodElement item = (MethodElement) LibraryUtil.unwrap(it
-							.next());
-					if (item instanceof CompositeRole) {
-						getCompositeRoleInfo(parent, act).addCompositeRole(
-								(CompositeRole) item);
-					} else if (item instanceof Activity) {
-						scan(adapterFactory, act, (Activity) item);
-					}
-				}
-			}
-		}
-
-		/**
-		 * find the composite role for the role descriptor from the activity and
-		 * it's parents, return null if not found
-		 * 
-		 * @param activity
-		 * @param item
-		 * @return RoleDescriptor
-		 */
-		private CompositeRole getCompositeRole(Activity activity,
-				RoleDescriptor item) {
-			// iterate the breakdown elements,
-			// if there is a composite role that contains the role, return the
-			// composite,
-			// if not, find in the parent activity
-
-			if (activity == null) {
-				return null;
-			}
-
-			CompositeRole desc = null;
-			CompositeRoleInfo info = (CompositeRoleInfo) itemMap.get(activity);
-			if (info != null) {
-				desc = info.getCompositeRole(item);
-				if (desc != null) {
-					return desc;
-				}
-
-				return getCompositeRole(info.getParentActivity(), item);
-			}
-
-			return null;
-		}
-	}
-
-	public class CompositeRoleInfo {
-		Activity parent;
-
-		Activity owner;
-
-		List items = new ArrayList();
-
-		public CompositeRoleInfo(Activity parent, Activity owner) {
-			this.parent = parent;
-			this.owner = owner;
-		}
-
-		private void addCompositeRole(CompositeRole e) {
-			if (!items.contains(e)) {
-				items.add(e);
-			}
-		}
-
-		private Activity getParentActivity() {
-			return parent;
-		}
-
-		private CompositeRole getCompositeRole(RoleDescriptor item) {
-			if (items.size() == 0) {
-				return null;
-			}
-
-			Role r = item.getRole();
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				CompositeRole cr = (CompositeRole) it.next();
-				if (cr.getAggregatedRoles().contains(r)) {
-					return cr;
-				}
-			}
-
-			return null;
-		}
-	}
-
-	public class ActivityLayoutSetting {
-		public ComposedAdapterFactory adapterFactory;
-
-		public CompositeRoles crs;
-
-		public Suppression sup;
-
-		boolean rollupRoles = false;
-
-		public boolean escapeString = false;
-		
-		// set to show task only for sub activities
-		// this only apply to CBS layout
-		public boolean showTaskOnly = false;
-		
-		public ActivityLayoutSetting(ComposedAdapterFactory adapterFactory,
-				CompositeRoles crs, Suppression sup) {
-			this.adapterFactory = adapterFactory;
-			this.crs = crs;
-			this.sup = sup;
-
-		}
-	}
-
-	public class TBSItemDetail {
-		
-		// record the suppressed items
-		List suppressedItems = new ArrayList();
-		
-		// map of role to role descriptors
-		Map roleDescriptorMap = new HashMap();
-		
-		public TBSItemDetail() {
-			
-		}
-		
-		public void addSuppressed(Object item) {
-			if ( !suppressedItems.contains(item) ) {
-				suppressedItems.add(item);
-			}
-		}
-		
-		public void iterate(ComposedAdapterFactory adapterFactory, Object parentObj) {
-		
-			ITreeItemContentProvider provider = null;
-			if (parentObj instanceof ITreeItemContentProvider) {
-				provider = (ITreeItemContentProvider) parentObj;
-			} else {
-				provider = (ITreeItemContentProvider) adapterFactory.adapt(
-						parentObj, ITreeItemContentProvider.class);
-			}
-
-			// Either delegate the call or return nothing.
-			if (provider == null) {
-				return;
-			}
-				
-			Collection items = provider.getChildren(parentObj);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				Object rawitem = it.next();
-
-				MethodElement item = (MethodElement) LibraryUtil.unwrap(rawitem);
-				if ( item instanceof RoleDescriptor ) {
-					addRoleDescriptor( (RoleDescriptor)item );
-				} else {
-					iterate(adapterFactory, rawitem);
-				}
-			}
-		}
-		
-		
-		private void addRoleDescriptor(RoleDescriptor rdesc) {
-			Role r = rdesc.getRole();
-			if (r != null ) {
-				List items = (List)roleDescriptorMap.get(r);
-				if ( items == null ) {
-					items = new ArrayList();
-					roleDescriptorMap.put(r, items);
-					if (debug ) {
-						System.out.println("Added RoleDescriptor " + rdesc.getPresentationName()); //$NON-NLS-1$
-					}
-				}
-				
-				if ( !items.contains(rdesc) ) {
-					items.add(rdesc);
-				}
-			}
-		}
-		
-		public List getDescriptors(Role r) {
-			return (List)roleDescriptorMap.get(r);
-		}
-	}
-	
-	/**
-	 * load the process specific layout data for publishing.
-	 * browsing does not need this since it's generated on the fly
-	 * @param proc_data
-	 */
-	public void loadLayoutData(ProcessLayoutData proc_data, boolean loadWbs, boolean loadTbs, boolean loadWpbs)
-	{
-		Timer t = new Timer();		
-
-		ActivityLayoutData act_data = proc_data.createActivityLauoutData(this.elementProcessPath);
-		
-		// iterate the breakdown structure and collect the info.
-		Process proc = getOwningProcess();
-		if ( proc == this.element ) {
-			supCount = 0;
-		}
-		
-		// need to handle the supressed breakdown elements
-		// use the Supress utility
-		Suppression sup = getSuppression(proc);
-
-		// need to interate the 3 layout structure sicne their path is different
-		if ( loadWbs ) {
-			loadWBSLayoutData(act_data, sup);
-		}
-		
-		if ( loadTbs ) {
-			loadTBSLayoutData(act_data, sup);
-		}
-		
-		if ( loadWpbs ) {
-			loadWPBSLayoutData(act_data, sup);
-		}
-		
-		if ( debug ) {
-			t.stop();
-			String msg = t.getTime()
-					+ " mini-second(s) loading layout data for process " + LibraryUtil.getTypeName(proc) //$NON-NLS-1$ /
-					+ ", activity: " + LibraryUtil.getTypeName(super.element); //$NON-NLS-1$ /			
-			System.out.println(msg);
-		}
-	}
-	
-	private void loadWBSLayoutData(ActivityLayoutData act_data, Suppression sup)
-	{
-		// publish the consolidated view
-		ComposedAdapterFactory adapterFactory = layoutManager
-				.getCBSAdapterFactory();
-		CompositeRoles crs = null; //new CompositeRoles(adapterFactory, (Activity) super.element);
-
-		ActivityLayoutSetting setting = new ActivityLayoutSetting(
-				adapterFactory, crs, sup);
-
-		// need to get the raw item provider from the adapter factory
-		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-		if ( wrapper == null ) {
-			wrapper = super.element;
-		}
-		ProcessElementItem elementItem = new ProcessElementItem(wrapper, super.element, super.elementProcessPath);
-		iterateProcessItem(elementItem, act_data, setting, true, false, false);
-
-//		// if there is no process-local supressed item, don't generate diagrams
-		// no, this will not work, since the text color ofd the diagram is green, if use base, it's black.
-		// so need to generate the diagram no matter what.
-//		if ( !act_data.hasLocalSuppressed() )
-//		{
-//			return;
-//		}
-		
-		String diagramType, imgFile;
-		
-		// make a short prefix for the file name
-		String prefix = Integer.toHexString(super.elementProcessPath.hashCode());
-		
-		diagramType = ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
-		imgFile = ResourceHelper.getDiagramFilePathName(element, prefix + "_" + diagramType); //$NON-NLS-1$
-		DiagramInfo diagram_workflow = generateDiagram(sup, diagramType, imgFile);	
-		if (diagram_workflow != null
-				&& diagram_workflow.getImageFileName() != null) {
-			act_data.setActivityDiagramPath(diagram_workflow.getImageFileName());
-		}
-		
-		diagramType = ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL;
-		imgFile = ResourceHelper.getDiagramFilePathName(element, prefix + "_" + diagramType); //$NON-NLS-1$
-		DiagramInfo diagram_detail = generateDiagram(sup, diagramType, imgFile);	
-		if (diagram_detail != null && diagram_detail.getImageFileName() != null) {
-			act_data.setActivityDetailDiagramPath(diagram_detail.getImageFileName());
-		}
-
-		diagramType = ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY;
-		imgFile = ResourceHelper.getDiagramFilePathName(element, prefix + "_" + diagramType); //$NON-NLS-1$
-		DiagramInfo diagram_wp = generateDiagram(sup, diagramType, imgFile);	
-		if (diagram_wp != null && diagram_wp.getImageFileName() != null) {
-			act_data.setWPDependencyDiagramPath(diagram_wp.getImageFileName());
-		}
-
-	}
-	
-	private void loadTBSLayoutData(ActivityLayoutData act_data, Suppression sup)
-	{
-		// publish the consolidated view
-		ComposedAdapterFactory adapterFactory = layoutManager
-				.getTBSAdapterFactory();
-		CompositeRoles crs = null; //new CompositeRoles(adapterFactory, (Activity) super.element);
-
-		// roolup the layout
-		IBSItemProvider provider = (IBSItemProvider) adapterFactory.adapt(
-				super.element, ITreeItemContentProvider.class);
-		provider.setRolledUp(true);
-
-		
-		ActivityLayoutSetting setting = new ActivityLayoutSetting(
-				adapterFactory, crs, sup);
-		setting.rollupRoles = true;
-
-		
-		// need to get the raw item provider from the adapter factory
-		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-		if ( wrapper == null ) {
-			wrapper = super.element;
-		}
-		ProcessElementItem elementItem = new ProcessElementItem(wrapper, super.element, super.elementProcessPath);
-		iterateProcessItem(elementItem, act_data, setting, false, true, false);
-
-	}
-	
-	private void loadWPBSLayoutData(ActivityLayoutData act_data, Suppression sup)
-	{
-		// publish the consolidated view
-		ComposedAdapterFactory adapterFactory = layoutManager
-				.getWPBSAdapterFactory();
-		CompositeRoles crs = null; //new CompositeRoles(adapterFactory, (Activity) super.element);
-
-		// roolup the layout
-		IBSItemProvider provider = (IBSItemProvider) adapterFactory.adapt(
-				super.element, ITreeItemContentProvider.class);
-		provider.setRolledUp(true);
-	
-		ActivityLayoutSetting setting = new ActivityLayoutSetting(
-				adapterFactory, crs, sup);
-
-		
-		// need to get the raw item provider from the adapter factory
-		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-		if ( wrapper == null ) {
-			wrapper = super.element;
-		}
-		ProcessElementItem elementItem = new ProcessElementItem(wrapper, super.element, super.elementProcessPath);
-		iterateProcessItem(elementItem, act_data, setting, false, false, true);
-
-	}
-	
-	private static int supCount = 0;
-	
-	private void iterateProcessItem(ProcessElementItem parentItem, ActivityLayoutData act_data, 
-			ActivityLayoutSetting setting, boolean loadWbs, boolean loadTbs, boolean loadWpbs) {
-		
-		//String msg = " --- iterate process item " + LibraryUtil.getTypeName(parentItem.element) + "[" + parentItem.path + "]" ; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 			
-		//System.out.println(msg);
-
-		ITreeItemContentProvider provider = null;
-		Object parentObj = parentItem.rawItem;
-		
-		if (parentObj instanceof ITreeItemContentProvider) {
-			provider = (ITreeItemContentProvider) parentObj;
-		} else {
-			provider = (ITreeItemContentProvider) setting.adapterFactory.adapt(
-					parentObj, ITreeItemContentProvider.class);
-		}
-
-		// Either delegate the call or return nothing.
-		if (provider != null) {
-			Collection items = provider.getChildren(parentObj);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				Object rawitem = it.next();			
-				
-//				// lat the presentation to determine when to show
-//				// set generate the flag for browsing
-				boolean isSupressed = setting.sup.isSuppressed(rawitem);
-				MethodElement item = (MethodElement) LibraryUtil
-						.unwrap(rawitem);
-								
-				ProcessElementItem elementItem = new ProcessElementItem(rawitem, item, parentItem);
-
-				if (debug && isSupressed ) {
-					System.out.println("suppressed: " + ++supCount + " : "  //$NON-NLS-1$ //$NON-NLS-2$
-							+ LibraryUtil.getTypeName(item) 
-							+ ": " + elementItem.path); //$NON-NLS-1$
-					
-				}
-
-				IElementLayout l = getLayout(elementItem);
-				if ( l instanceof AbstractProcessElementLayout )
-				{		
-					if ( isSupressed )
-					{
-						String relPath = ((AbstractProcessElementLayout)l).getRelativeProcessPath();
-						act_data.setSuppressed(relPath);
-					} 
-					else 
-					{				
-						// only iterate un-suppressed item
-						// if the layout is an activity layout, collect the layout data for it
-						if ( l instanceof ActivityLayout )
-						{
-							((ActivityLayout)l).loadLayoutData(act_data.getProcessLayoutData(), 
-								 loadWbs, loadTbs, loadWpbs);
-						}
-						else
-						{
-							// ineterate children, not just activity, any child in the
-							// rawitem should be iterated,
-							// such as the sub-artifacts
-							iterateProcessItem(elementItem, act_data, setting, loadWbs, loadTbs, loadWpbs);						
-						}
-					}
-				}
-			}
-		}
-	}	
-	
-	/**
-	 * get all the linked tasks, roles, and workproducts for this activity and all it's breakdown elements, recursively.
-	 * the element found are notified via IContentValidator.addReferencedElement()
-	 * 
-	 */
-	public void findAllLinkedElements() {
-		// iterate the breakdown structure and collect the info.
-		Process proc = getOwningProcess();
-		
-		// need to handle the supressed breakdown elements
-		// use the Supress utility
-		Suppression sup = getSuppression(proc);
-
-		// publish the consolidated view
-		ComposedAdapterFactory adapterFactory = layoutManager
-				.getCBSAdapterFactory();
-
-		// need to get the raw item provider from the adapter factory
-		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
-		if ( wrapper == null ) {
-			wrapper = super.element;
-		}
-		
-		getLayoutMgr().getValidator().addReferencedElement(null, super.element);
-
-		iterateItemForLinkedElements(wrapper, adapterFactory, sup);
-	}
-
-	private void iterateItemForLinkedElements(Object parentObj, ComposedAdapterFactory adapterFactory, Suppression sup) {
-		
-		ITreeItemContentProvider provider = null;
-		
-		if (parentObj instanceof ITreeItemContentProvider) {
-			provider = (ITreeItemContentProvider) parentObj;
-		} else {
-			provider = (ITreeItemContentProvider) adapterFactory.adapt(
-					parentObj, ITreeItemContentProvider.class);
-		}
-
-		// Either delegate the call or return nothing.
-		if (provider == null) {
-			return;
-		}
-		
-		Collection items = provider.getChildren(parentObj);
-		for (Iterator it = items.iterator(); it.hasNext();) {
-			Object rawitem = it.next();			
-			
-			if ( sup.isSuppressed(rawitem) ) {
-				continue;
-			}
-			
-			MethodElement item = (MethodElement) LibraryUtil
-					.unwrap(rawitem);
-			MethodElement e = null;
-			if ( item instanceof TaskDescriptor ) {
-				e = ((TaskDescriptor)item).getTask();
-			} else if ( item instanceof RoleDescriptor ) {
-				e = ((RoleDescriptor)item).getRole();
-			} else if ( item instanceof WorkProductDescriptor ) {
-				e = ((WorkProductDescriptor)item).getWorkProduct();
-			} 
-			
-			if ( e != null ) {
-				getLayoutMgr().getValidator().addReferencedElement(item, e);
-			} 
-				
-			MethodElement parent = (MethodElement) LibraryUtil.unwrap(rawitem);
-			getLayoutMgr().getValidator().addReferencedElement(parent, item);
-
-			iterateItemForLinkedElements(rawitem, adapterFactory, sup);
-		}
-	}	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayoutData.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayoutData.java
deleted file mode 100644
index 0321e06..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayoutData.java
+++ /dev/null
@@ -1,112 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * class to hold process specific layout data for each activity
- * the data will be write out to a javascript map 
- * so that activity layout in the published site can get the status dynamically.
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ActivityLayoutData {
-
-	private ProcessLayoutData proc_data;
-	
-	public String ad_img_path = null;
-	public String add_img_path = null;
-	public String wpd_img_path = null;
-	
-	// map of supressed item's relative path to the current activity
-	private List supressedItems = new ArrayList();
-	
-	/**
-	 * constuctor
-	 * @param proc_data
-	 * @param activity_path
-	 */
-	public ActivityLayoutData(ProcessLayoutData proc_data, String activity_path)
-	{
-		this.proc_data = proc_data;
-	}
-
-	/**
-	 * get the ProcessLayoutData
-	 * @return ProcessLayoutData
-	 */
-	public ProcessLayoutData getProcessLayoutData()
-	{
-		return proc_data;
-	}
-	
-	/**
-	 * set activity diagram path
-	 * @param path String
-	 */
-	public void setActivityDiagramPath(String path)
-	{
-		ad_img_path = path;
-	}
-	
-	/**
-	 * set activity detail diagram path
-	 * @param path String
-	 */
-	public void setActivityDetailDiagramPath(String path)
-	{
-		add_img_path = path;
-	}
-	
-	/**
-	 * 
-	 * @param path String
-	 */
-	public void setWPDependencyDiagramPath(String path)
-	{
-		wpd_img_path = path;
-	}
-	
-	/**
-	 * set the element's relative path for the suppress element
-	 * @param itemRelPath
-	 */
-	public void setSuppressed(String itemRelPath)
-	{
-		//System.out.println("Suppressed: " + activity_path + ": " + itemRelPath);
-		
-		if ( !supressedItems.contains(itemRelPath) )
-		{
-			supressedItems.add(itemRelPath);
-		}
-	}
-	
-	/**
-	 * get the suppressed elements
-	 * @return List a list of String for the relative path of the suppressed elements
-	 */
-	public List getSuppressedItems()
-	{
-		return supressedItems;
-	}
-	
-	/**
-	 * check if there is any suppressed item local to this process
-	 * @return boolean
-	 */
-	public boolean hasLocalSuppressed()
-	{
-		return (supressedItems.size() > 0);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ArtifactLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ArtifactLayout.java
deleted file mode 100644
index c128692..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ArtifactLayout.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-/**
- * The element layout for an Artifact.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ArtifactLayout extends WorkProductLayout {
-
-	/**
-	 * constructor for ArtifactLayout
-	 *
-	 */
-	public ArtifactLayout() {
-		super();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ChecklistLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ChecklistLayout.java
deleted file mode 100644
index e442193..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ChecklistLayout.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Checklist.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ChecklistLayout extends AbstractElementLayout {
-
-	/**
-	 * constructor for check list layout
-	 *
-	 */
-	public ChecklistLayout() {
-		super();
-	}
-
-	/**
-	 * initialize the layout
-	 */
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Checklist_ContentElements, layoutManager
-							.getElementRealizer());
-			
-			List activities = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Checklist_Activities, layoutManager
-							.getElementRealizer());
-
-			contentElements.addAll(activities);
-
-			addReferences(AssociationHelper.Checklist_ContentElements, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-		}
-
-		return elementXml;
-	}
-
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ConceptLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ConceptLayout.java
deleted file mode 100644
index f122ff0..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ConceptLayout.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Concept.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ConceptLayout extends AbstractElementLayout {
-
-	/**
-	 * construct a layout for Concept
-	 *
-	 */
-	public ConceptLayout() {
-		super();
-	}
-
-	/**
-	 * initialize the layout
-	 */
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Concept_ContentElements, layoutManager
-							.getElementRealizer());
-
-			List activities = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Concept_Activities, layoutManager
-							.getElementRealizer());
-
-			contentElements.addAll(activities);
-			
-			addReferences(AssociationHelper.Concept_ContentElements, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-		}
-
-		return elementXml;
-	}
-
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DeliverableLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DeliverableLayout.java
deleted file mode 100644
index 3b5556c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DeliverableLayout.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-/**
- * The element layout for a Deliverable.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class DeliverableLayout extends WorkProductLayout {
-
-	/**
-	 * layout for Deliverable
-	 *
-	 */
-	public DeliverableLayout() {
-		super();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DescriptorDescriptionLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DescriptorDescriptionLayout.java
deleted file mode 100644
index 3b35f5e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DescriptorDescriptionLayout.java
+++ /dev/null
@@ -1,154 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * layout class for descriptor contents
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DescriptorDescriptionLayout extends AbstractElementLayout {
-
-	MethodElement descriptor;
-	MethodElement linkedElement;
-	AbstractElementLayout linkedDescriptionLayout = null;
-
-	/**
-	 * layout for descriptors
-	 * @param descriptor
-	 */
-	public DescriptorDescriptionLayout(MethodElement descriptor) {
-		this.descriptor = descriptor;
-	}
-	
-	/**
-	 * initialize the layout
-	 */
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-		
-		super.targetElement = descriptor;
-		super.ownerElement = descriptor;
-		
-		if (descriptor instanceof TaskDescriptor) {
-			linkedElement = ((TaskDescriptor) descriptor).getTask();
-		} else if (descriptor instanceof RoleDescriptor) {
-			linkedElement = ((RoleDescriptor) descriptor).getRole();
-		} else if (descriptor instanceof WorkProductDescriptor) {
-			linkedElement = ((WorkProductDescriptor) descriptor).getWorkProduct();
-		}
-		
-		// get the realized one
-		// 196094 - Task descriptor page should show the realized content of the linked element
-		linkedElement = ConfigurationHelper.getCalculatedElement(linkedElement, layoutManager.getElementRealizer());
-
-		if (linkedElement != null) {
-			linkedDescriptionLayout = new GeneralLayout();
-			linkedDescriptionLayout.init(layoutManager, ((DescribableElement)linkedElement).getPresentation());
-			linkedDescriptionLayout.setContentTarget(descriptor);
-			linkedDescriptionLayout.setElementOwner(linkedElement);		
-		}
-
-	}
-
-	public void loadAttributes(XmlElement elementXml) {
-
-		Map featureValueMap = new HashMap();
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			// get all string type attributes
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature p = (EStructuralFeature) features.get(i);			
-				if (!(p instanceof EAttribute) ) {
-					continue;
-				}
-				//EAttribute attrib = (EAttribute)p;
-				String name = p.getName();
-								
-				Object value;
-				if (name.equals("presentationName")) //$NON-NLS-1$
-				{
-					// value = TngUtil.getPresentationName(element);
-					value = ConfigurationHelper.getPresentationName(element,
-							layoutManager.getConfiguration());
-				} else {
-					value = getAttributeFeatureValue(p);
-				}
-				
-				featureValueMap.put(name, value);
-			}
-		}
-		
-		String refinedDescName = UmaPackage.eINSTANCE
-			.getDescriptorDescription_RefinedDescription().getName();
-		String mainDescName = UmaPackage.eINSTANCE
-		.getContentDescription_MainDescription().getName();
-		
-		// now, get the feature value from the link element's decription
-		features = null;
-		if ( ( linkedDescriptionLayout!=null ) && (linkedDescriptionLayout.getElement() != null) ) {
-//			properties = linkedDescriptionLayout.getElement().getInstanceProperties();
-			features = LibraryUtil.getStructuralFeatures(linkedDescriptionLayout.getElement());
-		}
-		
-		if (features != null) {
-			// get all string type attributes
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature p = (EStructuralFeature) features.get(i);			
-				if (!(p instanceof EAttribute) ) {
-					continue;
-				}
-				//EAttribute attrib = (EAttribute)p;
-				String name = p.getName();
-				if ( name.equals(mainDescName) ) {
-					name = refinedDescName;
-				}
-				
-				Object value = featureValueMap.get(name);
-				if ( value == null || value.toString().length() == 0 ) {
-					value = linkedDescriptionLayout.getAttributeFeatureValue(p);
-					featureValueMap.put(name, value);
-				}
-			}
-		}
-		
-		// now set the values
-		for (Iterator it = featureValueMap.entrySet().iterator(); it.hasNext(); ) {
-			Map.Entry entry = (Map.Entry)it.next();
-			String name = (String)entry.getKey();
-			Object value = entry.getValue();
-			elementXml.newChild("attribute")	//$NON-NLS-1$
-				.setAttribute("name", name)		//$NON-NLS-1$
-				.setValue((value == null) ? "" : value.toString());  //$NON-NLS-1$
-		}
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DescriptorLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DescriptorLayout.java
deleted file mode 100644
index a5a02f0..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DescriptorLayout.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * base layout class for descriptors
- * 
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public abstract class DescriptorLayout extends AbstractProcessElementLayout {
-
-	public static final Collection<EStructuralFeature> extraFeaturesFromContentElement = Arrays.asList(new EStructuralFeature[] {
-			UmaPackage.eINSTANCE.getContentElement_Assets(),
-			UmaPackage.eINSTANCE.getContentElement_Checklists(),
-			UmaPackage.eINSTANCE.getContentElement_ConceptsAndPapers(),
-			UmaPackage.eINSTANCE.getContentElement_Examples(),
-			UmaPackage.eINSTANCE.getContentElement_Guidelines(),
-			UmaPackage.eINSTANCE.getContentElement_SupportingMaterials()	
-	});
-
-	MethodElement linkedElement = null;
-
-	AbstractElementLayout elementLayout = null;
-	
-	protected void __init(ElementLayoutManager layoutManager,
-			MethodElement element) {
-		super.__init(layoutManager, element);
-
-		// 196094 - Task descriptor page should show the realized content of the linked element
-		if (element instanceof TaskDescriptor) {
-			linkedElement = ((TaskDescriptor) element).getTask();
-			linkedElement = ConfigurationHelper.getCalculatedElement(linkedElement, layoutManager.getElementRealizer());
-			if (linkedElement != null) {
-				elementLayout = new TaskLayout();
-			}
-		} else if (element instanceof RoleDescriptor) {
-			linkedElement = ((RoleDescriptor) element).getRole();
-			linkedElement = ConfigurationHelper.getCalculatedElement(linkedElement, layoutManager.getElementRealizer());
-			if (linkedElement != null) {
-				elementLayout = new RoleLayout();
-			}
-		} else if (element instanceof WorkProductDescriptor) {
-			linkedElement = ((WorkProductDescriptor) element).getWorkProduct();
-			linkedElement = ConfigurationHelper.getCalculatedElement(linkedElement, layoutManager.getElementRealizer());
-			if (linkedElement != null) {
-				elementLayout = new WorkProductLayout();
-			}
-		}
-
-		if (elementLayout != null) {
-			elementLayout.init(layoutManager, linkedElement);
-			elementLayout.setContentTarget(element);
-		}	
-		
-		// make sure the linked element is loaded
-		if ( linkedElement != null ) {
-			for (Iterator<EObject> iter = linkedElement.eAllContents(); iter.hasNext();) {
-				iter.next();
-			}
-		}
-	}
-
-	/**
-	 * for descriptors, if the attribute is not defined, get from the libed
-	 * element
-	 * 
-	 * @param feature EStructuralFeature
-	 * @return Object
-	 */
-	public Object getAttributeFeatureValue(EStructuralFeature feature) {
-		Object value = super.getAttributeFeatureValue(feature);
-		if ((elementLayout == null) || (value != null)
-				&& (value.toString().length() > 0)) {
-			return value;
-		}
-
-		// if the attribute is not defined, grab the attribute value from the
-		// linked element
-		// specified attributes only. Add more feature here if needed
-		if (feature == UmaPackage.eINSTANCE.getMethodElement_BriefDescription()) {
-			return elementLayout.getAttributeFeatureValue(feature);
-		}
-
-		return value;
-	}
-
-	/**
-	 * get the layout for a child element of this element
-	 * ActivityElementLayout should override this method to create layout with node path
-	 * @param child
-	 * @return IElementLayout
-	 */
-	protected IElementLayout getChildLayout(MethodElement child)
-	{
-		if ( layoutManager.getValidator().showExtraInfoForDescriptors() 
-				&& (child instanceof DescriptorDescription) ) {
-			DescriptorDescriptionLayout l = new DescriptorDescriptionLayout(this.element);
-			l.init(layoutManager, child);
-			return l;
-		} else {
-			return layoutManager.getLayout(child, true);
-		}
-	}
-	
-	protected Collection<EStructuralFeature> getExtraFeaturesFromContentElement() {
-		return extraFeaturesFromContentElement;
-	}
-
-	protected boolean acceptFeatureValue(EStructuralFeature feature,
-			Object value) {
-		
-		Suppression sup = super.getSuppression(super.owningProcess);
-		if ( sup != null ) {
-			// check suppression
-			if ( value instanceof List ) {
-				List items = (List)value;
-				int i = 0;
-				while ( i < items.size() ) {
-					Object v = items.get(i);
-					if ( isSuppressed(sup, feature, v) ) {
-						items.remove(i);
-					} else {
-						i++;
-					}
-				}
-				
-				if ( items.size() == 0 ) {
-					return false;
-				}
-			} else {
-				if ( isSuppressed(sup, feature, value) ) {
-					return false;
-				}
-			}
-		}
-		
-		return super.acceptFeatureValue(feature, value);
-	}
-	
-	protected boolean isSuppressed(Suppression sup, EStructuralFeature feature, Object element) {
-		if ( element instanceof Descriptor ) {
-			return sup.isSuppressed(element);
-		}
-		
-		return false;
-	}
-	
-	protected boolean isTaskOppositeFeature(OppositeFeature feature) {
-		return (feature == AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors)
-		|| ( feature == AssociationHelper.RoleDescriptor_AdditionalTaskDescriptors)
-		|| ( feature == AssociationHelper.RoleDescriptor_AssistsIn_TaskDescriptors)
-		|| ( feature == AssociationHelper.WorkProductDescriptor_ExternalInputTo_TaskDescriptors)
-		|| ( feature == AssociationHelper.WorkProductDescriptor_MandatoryInputTo_TaskDescriptors)
-		|| ( feature == AssociationHelper.WorkProductDescriptor_OptionalInputTo_TaskDescriptors)
-		|| ( feature == AssociationHelper.WorkProductDescriptor_OutputFrom_TaskDescriptors);
-		
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DisciplineLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DisciplineLayout.java
deleted file mode 100644
index db2eede..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/DisciplineLayout.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DisciplineLayout extends AbstractElementLayout {
-
-	public DisciplineLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/EstimationConsiderationsLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/EstimationConsiderationsLayout.java
deleted file mode 100644
index 1bc9ee1..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/EstimationConsiderationsLayout.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a EstimationConsiderations.
- * 
- * @author Weiping Lu
- * @since 1.2
- */
-public class EstimationConsiderationsLayout extends AbstractElementLayout {
-
-	public EstimationConsiderationsLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {						
-			List tasks = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.EstimationConsiderations_Tasks, layoutManager
-							.getElementRealizer());
-			addReferences(AssociationHelper.EstimationConsiderations_Tasks, elementXml, "contentElements", tasks); //$NON-NLS-1$
-			
-			List workProducts = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.EstimationConsiderations_WorkProducts, layoutManager
-							.getElementRealizer());
-			addReferences(AssociationHelper.EstimationConsiderations_WorkProducts, elementXml, "contentElements", workProducts); //$NON-NLS-1$
-		}
-
-		return elementXml;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ExampleLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ExampleLayout.java
deleted file mode 100644
index ecaebe7..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ExampleLayout.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for an Example.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ExampleLayout extends AbstractElementLayout {
-
-	public ExampleLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Example_ContentElements, layoutManager
-							.getElementRealizer());
-			
-			List activities = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Example_Activities, layoutManager
-							.getElementRealizer());
-
-			contentElements.addAll(activities);
-			
-			addReferences(AssociationHelper.Example_ContentElements, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-
-			Guidance guidance = (Guidance) super.element;
-			ContentDescription content = (ContentDescription) guidance
-					.getPresentation();
-			if (content != null) {
-				
-				// Authoring:  Template attachments of a contributing template guidance element are not appended to the base list of attachments				
-				//String attachmentString = ((org.eclipse.epf.uma.GuidanceDescription)content).getAttachments();
-				EStructuralFeature feature = UmaPackage.eINSTANCE.getGuidanceDescription_Attachments();
-				String attachmentString = (String)ConfigurationHelper.calcAttributeFeatureValue(content, super.element, feature, super.layoutManager.getConfiguration());
-				if ( (attachmentString != null) && (attachmentString.indexOf(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR) > 0) )
-				{
-					attachmentString = attachmentString.replaceAll(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR, TngUtil.GUIDANCE_FILESTRING_SEPARATOR); 
-				}
-				List attachmentList = TngUtil.convertGuidanceAttachmentsToList(attachmentString);
-				for (Iterator iter = attachmentList.iterator();iter.hasNext();) {
-					String attachmentFile = (String) iter.next();
-					if (attachmentFile != null) {
-						Matcher m = ResourceHelper.p_template_attachment_url.matcher(attachmentFile);
-						if (!m.find()) {
-							String fileName = FileUtil.getFileName(attachmentFile);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", "file://" + attachmentFile) //$NON-NLS-1$ //$NON-NLS-2$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						} else {
-							String fileName = m.group(2);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", m.group(1)) //$NON-NLS-1$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-}
-
-		return elementXml;
-	}
-
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/GeneralLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/GeneralLayout.java
deleted file mode 100644
index 6e673d3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/GeneralLayout.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- */
-public class GeneralLayout extends AbstractElementLayout {
-
-	public GeneralLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/GuidelineLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/GuidelineLayout.java
deleted file mode 100644
index da6a368..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/GuidelineLayout.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Guideline.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class GuidelineLayout extends AbstractElementLayout {
-
-	public GuidelineLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Guideline_ContentElements, layoutManager
-							.getElementRealizer());
-			
-			List activities = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Guideline_Activities, layoutManager
-							.getElementRealizer());
-
-			contentElements.addAll(activities);
-
-			addReferences(AssociationHelper.Guideline_ContentElements, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-		}
-
-		return elementXml;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/OutcomeLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/OutcomeLayout.java
deleted file mode 100644
index 38499a0..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/OutcomeLayout.java
+++ /dev/null
@@ -1,25 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-/**
- * The element layout for a Outcome.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class OutcomeLayout extends WorkProductLayout {
-
-	public OutcomeLayout() {
-		super();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessElementItem.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessElementItem.java
deleted file mode 100644
index 8d29935..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessElementItem.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * simple holder of process element item info
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ProcessElementItem {
-	
-	public Object rawItem = null;
-	public MethodElement element = null;
-	public String path = null;
-	public String proc_guid = null;
-	
-	public ProcessElementItem(Object rawItem, MethodElement element, String path)
-	{
-		this.rawItem = rawItem;
-		this.element = element;
-		this.path = path;
-		this.proc_guid = AbstractProcessElementLayout.getOwningProcessGuidFromPath(path);
-	}
-	
-	public ProcessElementItem(Object rawItem, MethodElement element, ProcessElementItem parent)
-	{
-		this.rawItem = rawItem;
-		this.element = element;
-		this.path = AbstractProcessElementLayout.makePath(parent.path, this.element); // make path here
-		this.proc_guid = parent.proc_guid;		
-	}
-
-	public String getQueryString()
-	{
-		return ElementLayoutManager.getQueryString(proc_guid, path);		
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessLayout.java
deleted file mode 100644
index db5d807..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessLayout.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * The element layout for a Role.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ProcessLayout extends AbstractElementLayout {
-
-	public ProcessLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement();
-
-		if (!includeReferences) {
-			return elementXml;
-		}
-
-		// build the breakdown structure tree
-		XmlElement bs = elementXml
-				.newChild("breakdown").setAttribute("name", "Work Breakdown Structure"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		ComposedAdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
-				.getWBS_ComposedAdapterFactory();
-		iterate(super.element, bs, adapterFactory);
-
-		bs = elementXml
-				.newChild("breakdown").setAttribute("name", "Team Breakdown Structure"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.getOBS_ComposedAdapterFactory();
-		iterate(super.element, bs, adapterFactory);
-
-		bs = elementXml
-				.newChild("breakdown").setAttribute("name", "Work Product Breakdown Structure"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.getPBS_ComposedAdapterFactory();
-		iterate(super.element, bs, adapterFactory);
-
-		return elementXml;
-	}
-
-	/**
-	 * iterate the break down structure and build the xml document
-	 * 
-	 * @param parentObj
-	 * @param parentXml
-	 * @param adapterFactory
-	 */
-	private void iterate(Object parentObj, XmlElement parentXml,
-			ComposedAdapterFactory adapterFactory) {
-		ITreeItemContentProvider provider = (ITreeItemContentProvider) adapterFactory
-				.adapt(parentObj, ITreeItemContentProvider.class);
-		// Either delegate the call or return nothing.
-		if (provider != null) {
-			Collection items = provider.getChildren(parentObj);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				MethodElement item = (MethodElement) LibraryUtil.unwrap(it
-						.next());
-				// super.processChild(parentXml, item, false);
-				IElementLayout l = layoutManager.getLayout(item, true);
-				if (l != null) {
-					XmlElement child = l.getXmlElement(false);
-					parentXml.addChild(child);
-
-					// ineterate children
-					if (item instanceof Activity) {
-						iterate(item, child, adapterFactory);
-					}
-
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessLayoutData.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessLayoutData.java
deleted file mode 100644
index 0f68357..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ProcessLayoutData.java
+++ /dev/null
@@ -1,137 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.io.PrintWriter;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.epf.library.util.ResourceHelper;
-
-/**
- * 
- * class to hold process specific layout data for each activity
- * the data will be write out to a javascript map 
- * so that activity layout in the published site can get the status dynamically.
- *
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ProcessLayoutData {
-
-	Map activityMap = new HashMap();
-	
-	/**
-	 * constructor
-	 * @param proc_guid
-	 */
-	public ProcessLayoutData(String proc_guid)
-	{
-	}
-	
-	/**
-	 * check if it contains the activity layout of the specified path
-	 * @param activity_path String
-	 * @return boolean
-	 */
-	public boolean hasActivityLayout(String activity_path)
-	{
-		return activityMap.containsKey(activity_path);
-	}
-	
-	/**
-	 * create an ActivityLayoutData for the activity path
-	 * @param activity_path String
-	 * @return ActivityLayoutData
-	 */
-	public ActivityLayoutData createActivityLauoutData(String activity_path)
-	{
-		ActivityLayoutData data = (ActivityLayoutData)activityMap.get(activity_path);
-		if ( data == null )
-		{
-			data = new ActivityLayoutData(this, activity_path);
-			activityMap.put(activity_path, data);
-		}
-		
-		return data;
-	}
-	
-	/**
-	 * get a map of the activity layout data
-	 * @return Map
-	 */
-	public Map getActivityLayoutDataMap()
-	{
-		return activityMap;
-	}
-	
-	/**
-	 * print the info to a javascript file in the published site. 
-	 * These information will be used to determine the layout of process elements.
-	 * @param ps PrintWriter
-	 */
-	public void print(PrintWriter ps)
-	{
-		for ( Iterator it = activityMap.entrySet().iterator(); it.hasNext(); )
-		{
-			Map.Entry entry = (Map.Entry)it.next();
-			String activity_path = (String)entry.getKey();
-			ActivityLayoutData data = (ActivityLayoutData)entry.getValue();
-			if ( data.ad_img_path != null )
-			{
-				String key = activity_path + ResourceHelper.DIAGRAM_TYPE_WORKFLOW;
-				printImgFile(ps, key, data.ad_img_path);
-			}
-			
-			if ( data.add_img_path != null )
-			{
-				String key = activity_path + ResourceHelper.DIAGRAM_TYPE_ACTIVITY_DETAIL;
-				printImgFile(ps, key, data.add_img_path);
-			}
-			
-			if ( data.wpd_img_path != null )
-			{
-				String key = activity_path + ResourceHelper.DIAGRAM_TYPE_WP_DEPENDENCY;
-				printImgFile(ps, key, data.wpd_img_path);
-			}
-
-			if ( data.getSuppressedItems().size() > 0 )
-			{
-				for ( Iterator it2 = data.getSuppressedItems().iterator(); it2.hasNext(); )
-				{
-					String relPath = (String)it2.next();
-					String key = activity_path + relPath;
-					printSuppressedItem(ps, key);
-				}
-			}			
-		}
-	}
-	
-	private void printImgFile(PrintWriter ps, String key, String fileName)
-	{
-		String line = "contentPage.processPage.imageFiles[\"" + key + "\"]=\"" + fileName + "\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		ps.println(line);
-		//System.out.println(line);
-		
-	}
-	
-	private void printSuppressedItem(PrintWriter ps, String key)
-	{
-		String line = "contentPage.processPage.suppressedItems[\"" + key + "\"]=true"; //$NON-NLS-1$ //$NON-NLS-2$
-		ps.println(line);	
-		//System.out.println(line);
-	}
-	
-	public void clear() {
-		activityMap.clear();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ReportLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ReportLayout.java
deleted file mode 100644
index fa99e62..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ReportLayout.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Report.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ReportLayout extends AbstractElementLayout {
-
-	public ReportLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Report_WorkProducts, layoutManager
-							.getElementRealizer());
-			addReferences(AssociationHelper.Report_WorkProducts, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-		}
-
-		return elementXml;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ReusableAssetLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ReusableAssetLayout.java
deleted file mode 100644
index 9936a12..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ReusableAssetLayout.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Reusable Asset.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ReusableAssetLayout extends AbstractElementLayout {
-
-	public ReusableAssetLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.ReusableAsset_ContentElements,
-					layoutManager.getElementRealizer());
-			
-			List activities = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.ReusableAsset_Activities, layoutManager
-							.getElementRealizer());
-
-			contentElements.addAll(activities);
-
-			addReferences(AssociationHelper.ReusableAsset_ContentElements, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-
-			Guidance guidance = (Guidance) super.element;
-			ContentDescription content = (ContentDescription) guidance
-					.getPresentation();
-			if (content != null) {
-				
-				// Authoring:  Template attachments of a contributing template guidance element are not appended to the base list of attachments				
-				//String attachmentString = ((org.eclipse.epf.uma.GuidanceDescription)content).getAttachments();
-				EStructuralFeature feature = UmaPackage.eINSTANCE.getGuidanceDescription_Attachments();
-				String attachmentString = (String)ConfigurationHelper.calcAttributeFeatureValue(content, super.element, feature, super.layoutManager.getConfiguration());
-				if ( (attachmentString != null) && (attachmentString.indexOf(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR) > 0) )
-				{
-					attachmentString = attachmentString.replaceAll(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR, TngUtil.GUIDANCE_FILESTRING_SEPARATOR); 
-				}
-				List attachmentList = TngUtil.convertGuidanceAttachmentsToList(attachmentString);
-				for (Iterator iter = attachmentList.iterator();iter.hasNext();) {
-					String attachmentFile = (String) iter.next();
-					if (attachmentFile != null) {
-						Matcher m = ResourceHelper.p_template_attachment_url.matcher(attachmentFile);
-						if (!m.find()) {
-							String fileName = FileUtil.getFileName(attachmentFile);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", "file://" + attachmentFile) //$NON-NLS-1$ //$NON-NLS-2$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						} else {
-							String fileName = m.group(2);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", m.group(1)) //$NON-NLS-1$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-}
-
-		return elementXml;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoadmapLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoadmapLayout.java
deleted file mode 100644
index 7ca2e49..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoadmapLayout.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Roadmap.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class RoadmapLayout extends AbstractElementLayout {
-
-	public RoadmapLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Roadmap_Activites, layoutManager
-							.getElementRealizer());
-			addReferences(AssociationHelper.Roadmap_Activites, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-		}
-
-		return elementXml;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoleDescriptorLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoleDescriptorLayout.java
deleted file mode 100644
index 65db9bb..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoleDescriptorLayout.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.configuration.ElementRealizer;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The layout for a RoleDescriptor.
- * 
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class RoleDescriptorLayout extends DescriptorLayout {
-	
-	public RoleDescriptorLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		// use the default
-		// if you need to generate diagram, you may need to keep the feature
-		// values.
-		// just do something similar to the RoleLayout
-		// NOTE: for role-tasks relationship, the feature is
-		// RoleDescriptor#getPerformsAsOwner
-		// it's a bidirectional feature, don't need opposite feature
-		return elementXml;
-	}
-	
-	public void loadReferences(XmlElement elementXml, boolean includeReferences) {
-
-		super.loadReferences(elementXml, includeReferences);
-		
-		elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		
-		if ( (super.elementLayout != null ) && layoutManager.getValidator().showExtraInfoForDescriptors() ) {
-			// also load the linked element referenced information
-			for (Iterator<EStructuralFeature> iter = getExtraFeaturesFromContentElement().iterator(); iter.hasNext();) {
-				EStructuralFeature feature = (EStructuralFeature) iter.next();
-				super.elementLayout.loadFeature(feature, elementXml, false);
-			}
-		}
-	}
-
-	
-	/**
-	 * load the non-attribute feature
-	 * 
-	 * @param feature
-	 * @param elementXml
-	 * @param includeReferences
-	 */
-	public void loadFeature(EStructuralFeature feature, XmlElement elementXml,
-			boolean includeReferences) {
-		if ( feature == UmaPackage.eINSTANCE.getRoleDescriptor_Modifies() ) {
-			List v = calcModifiedWorkProductDescriptors();
-			addReferences(feature, elementXml, feature.getName(), v);
-		} else {
-			getFeatureValue(feature,  elementXml, includeReferences);
-		}
-	}
-	
-	public List calcModifiedWorkProductDescriptors() {
-		List v = new ArrayList();
-		ElementRealizer realizer = getLayoutMgr().getElementRealizer();
-		OppositeFeature ofeature = AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors;
-		List v2 = ConfigurationHelper.calc0nFeatureValue(element, ofeature, realizer);
-		if ( v2.size() > 0 ) {
-			EStructuralFeature feature = UmaPackage.eINSTANCE.getTaskDescriptor_Output();
-			for (Iterator it = v2.iterator(); it.hasNext(); ) {
-				MethodElement e = (MethodElement)it.next();
-				
-				String path = super.makePath(getSuperActivityPath(), e);
-				TaskDescriptorLayout tl = (TaskDescriptorLayout)layoutManager.createLayout(e, owningProcess, path);
-				RoleDescriptor r = (RoleDescriptor)tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(), null, false);
-				if ( r == this.element ) {
-					List value = (List)tl.getFeatureValue(feature, null, false);
-					if ( value != null && value.size() > 0 ) {
-						for ( Iterator itr = value.iterator(); itr.hasNext(); ) {
-							Object o = itr.next();
-							if ( !v.contains(o) ) {
-								v.add(o);
-							}
-						}
-					}
-				}
-			}
-		}
-		
-		return v;
-	}
-		
-	protected boolean acceptFeatureValue(OppositeFeature feature, Object value) {
-		
-		if ( !super.acceptFeatureValue(feature, value) ) {
-			return false;
-		}
-		
-		if ( !isTaskOppositeFeature(feature) || !(value instanceof List) ) {
-			return true;
-		}
-		
-		List items = (List)value;
-		int i = 0;
-		while (i < items.size() ) {
-			MethodElement e = (MethodElement)items.get(i);
-			String path = super.makePath(getSuperActivityPath(), e);
-			TaskDescriptorLayout tl = (TaskDescriptorLayout)layoutManager.createLayout(e, owningProcess, path);
-			Object o = null;
-			if ( feature == AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors ) {
-				o = tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(), null, false);			
-			} else if ( feature == AssociationHelper.RoleDescriptor_AdditionalTaskDescriptors ) {
-				o = tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_AdditionallyPerformedBy(), null, false);						
-			} else if ( feature == AssociationHelper.RoleDescriptor_AssistsIn_TaskDescriptors ) {
-			 o = tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_AssistedBy(), null, false);						
-			}
-			
-			if ( (o == this.element) || (o instanceof List) && ((List)o).contains(this.element) ) {
-				i++;
-			} else {
-				items.remove(i);
-			}
-		}
-
-
-		
-		return true;
-	}
-	
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoleLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoleLayout.java
deleted file mode 100644
index 0d981dc..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/RoleLayout.java
+++ /dev/null
@@ -1,165 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.diagram.MethodElementDiagram;
-import org.eclipse.epf.library.layout.diagram.RoleDiagramPublisher;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * The element layout for a Role.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class RoleLayout extends AbstractElementLayout {
-
-	protected Map referenceMap = new HashMap();
-
-	public RoleLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-		if (includeReferences) {
-			List performs = ConfigurationHelper.calc0nFeatureValue(
-					super.element, AssociationHelper.Role_Primary_Tasks,
-					layoutManager.getElementRealizer());
-			referenceMap.put("performs", performs); //$NON-NLS-1$
-
-			// NO, this is wrong! should calculate the realized feature value!
-			// moved to acceptFeatureValue to get the realized value and save to
-			// the map
-			// if (super.element instanceof RoleImpl)
-			// {
-			// referenceMap.put("responsibleFor",
-			// ((RoleImpl)super.element).getResponsibleFor());
-			// }
-
-			List additionallyPerforms = ConfigurationHelper.calc0nFeatureValue(
-					super.element, AssociationHelper.Role_Secondary_Tasks,
-					layoutManager.getElementRealizer());
-			// referenceMap.put("additionallyPerforms", additionallyPerforms);
-			// //$NON-NLS-1$
-			addReferences(AssociationHelper.Role_Secondary_Tasks, elementXml,
-					"additionallyPerforms", additionallyPerforms); //$NON-NLS-1$
-			RoleDiagramPublisher diagramPublisher = new RoleDiagramPublisher();
-			MethodElementDiagram diagram = diagramPublisher.publish(this,
-					new File(layoutManager.getPublishDir()));
-
-			if (diagram != null)
-				elementXml.setContent("diagram", diagram.getHTML()); //$NON-NLS-1$
-
-			List roleSets = ConfigurationHelper.calc0nFeatureValue(
-					super.element, AssociationHelper.Role_RoleSets,
-					layoutManager.getElementRealizer());
-			addReferences(AssociationHelper.Role_RoleSets, elementXml,
-					"roleSets", roleSets); //$NON-NLS-1$
-			
-			// add the descriptors referencing this element
-			super.processDescriptors(elementXml);
-			
-		}
-		
-		elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		
-		return elementXml;
-	}
-	
-	public List getPerforms() {
-		List list = (List) referenceMap.get("performs"); //$NON-NLS-1$
-		Collections.sort(list, Comparators.PRESENTATION_NAME_COMPARATOR);
-		return list;
-	}
-
-	public List getAdditionallyPerforms() {
-		List list = (List) referenceMap.get("additionallyPerforms"); //$NON-NLS-1$
-		Collections.sort(list, Comparators.PRESENTATION_NAME_COMPARATOR);
-		return list;		
-	}
-
-	public List getResponsibleFor() {
-		List list =  (List) referenceMap.get("responsibleFor"); //$NON-NLS-1$
-		Collections.sort(list, Comparators.PRESENTATION_NAME_COMPARATOR);
-		return list;		
-	}
-
-	public List getModifies() {
-		List list =  (List) referenceMap.get("modifies"); //$NON-NLS-1$
-		Collections.sort(list, Comparators.PRESENTATION_NAME_COMPARATOR);
-		return list;		
-	}
-
-	/**
-	 * some layout need to have the feature values for further processing. So
-	 * this method will be called when a feature is calculated in this abstract
-	 * class
-	 * 
-	 * @param name
-	 * @param value
-	 */
-	protected void notifyFeatureValue(String name, Object value) {
-		referenceMap.put(name, value);
-	}
-
-	/**
-	 * some layout need to have the feature values for further processing. So
-	 * this method will be called when a feature is calculated in this abstract
-	 * class
-	 * 
-	 * @param name
-	 * @param value
-	 */
-	protected boolean acceptFeatureValue(EStructuralFeature feature,
-			Object value) {
-
-		// save the feature value for diagram generation
-		if (feature == UmaPackage.eINSTANCE.getRole_ResponsibleFor()) {
-			referenceMap.put("responsibleFor", value); //$NON-NLS-1$
-		}
-
-		return super.acceptFeatureValue(feature, value);
-	}
-
-	protected boolean acceptFeatureValue(OppositeFeature feature, Object value) {
-		return super.acceptFeatureValue(feature, value);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/StepLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/StepLayout.java
deleted file mode 100644
index 2edc18b..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/StepLayout.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- */
-public class StepLayout extends AbstractElementLayout {
-
-	public StepLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/SummaryPageLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/SummaryPageLayout.java
deleted file mode 100644
index e6425d8..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/SummaryPageLayout.java
+++ /dev/null
@@ -1,222 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.LayoutInfo;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * The layout for a summary page of an element.
- * <p>
- * The summarypage layout a list of elements referenced by the owner element
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class SummaryPageLayout implements IElementLayout {
-
-	private static final String LAYOUT_TYPE = "Summary"; //$NON-NLS-1$
-
-	private static final String LAYOUT_XSL = "summary.xsl"; //$NON-NLS-1$
-
-	ElementLayoutManager layoutManager;
-
-	MethodElement element;
-
-	List refList;
-
-	String title;
-	
-	String prefix;
-
-	// String fileName;
-	IElementLayout elementLayout;
-
-//	public SummaryPageLayout(ElementLayoutManager layoutManager,
-//			MethodElement element, String title, List refList) {
-//		this.layoutManager = layoutManager;
-//		this.element = element;
-//		this.refList = refList;
-//		this.title = title;
-//
-//		this.elementLayout = layoutManager.getLayout(element, true);
-//	}
-	
-	public SummaryPageLayout(ElementLayoutManager layoutManager,
-			MethodElement element, String prefix, String title, 
-			List refList) 
-	{
-		this.layoutManager = layoutManager;
-		this.element = element;
-		this.refList = refList;
-		this.title = title;
-		this.prefix = (prefix != null && prefix.length() > 0 && prefix.indexOf("null") < 0) ? prefix : "Summary"; //$NON-NLS-1$ //$NON-NLS-2$
-
-		this.elementLayout = layoutManager.getLayout(element, true);
-	}
-
-	public String getId() {
-		return element.getGuid();
-	}
-
-	public String getType() {
-		return LAYOUT_TYPE;
-	}
-
-	public String getName() {
-		return title;
-	}
-
-	public String getDisplayName() {
-		return title;
-	}
-
-	public String getUrl() {
-		return elementLayout.getFilePath()
-				+ getFileName(ResourceHelper.FILE_EXT_HTML);
-	}
-
-	public String getShapeiconUrl() {
-		return null;
-	}
-
-	public String getNodeiconUrl() {
-		return null;
-	}
-
-	public String getDiagramiconUrl() {
-		return null;
-	}
-
-	public String getXslUrl() {
-		return LAYOUT_XSL;
-	}
-
-	public String getBackPath() {
-		return elementLayout.getBackPath();
-	}
-
-	public String getFilePath() {
-		return elementLayout.getFilePath();
-	}
-
-	public String getFilePath(IElementLayout relativeTo) {
-		return elementLayout.getFilePath(relativeTo);
-	}
-
-//	public String getFileName(String ext) {
-//		return StrUtil.makeValidFileName(title + "_") + elementLayout.getFileName(ext); //$NON-NLS-1$
-//
-//	}
-	
-	public String getFileName(String ext) {
-		return StrUtil.removeSpecialCharacters(prefix + "_") + elementLayout.getFileName(ext); //$NON-NLS-1$
-
-	}
-
-	public MethodElement getElement() {
-		return element;
-	}
-
-	public ElementLayoutManager getLayoutMgr() {
-		return layoutManager;
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		
-		XmlElement elementXml = new XmlElement("Element") //$NON-NLS-1$
-				.setAttribute("Type", getType()) //$NON-NLS-1$
-				.setAttribute("Name", getName()) //$NON-NLS-1$
-				.setAttribute("Url", getUrl()) //$NON-NLS-1$
-				.setAttribute("BackPath", getBackPath()) //$NON-NLS-1$
-				.setAttribute("ImageUrl", getShapeiconUrl()) //$NON-NLS-1$
-				.setAttribute("DisplayName", getDisplayName()); //$NON-NLS-1$
-
-		if (includeReferences) {
-			
-			String copyright = ConfigurationHelper.getCopyrightText(element,
-					layoutManager.getConfiguration());
-			if (copyright != null && copyright.length() > 0) {
-				elementXml.newChild("copyright").setValue(copyright); //$NON-NLS-1$
-			}
-			
-			XmlElement refXml = elementXml
-					.newChild("referenceList").setAttribute("name", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-			for (Iterator it = refList.iterator(); it.hasNext();) {
-				Object e = it.next();
-				if (e instanceof MethodElement) {
-					MethodElement me = (MethodElement) e;
-					me = ConfigurationHelper.getCalculatedElement(me,
-							layoutManager.getConfiguration());
-					if (me != null) {
-						IElementLayout l = layoutManager.getLayout(me, true);
-						if (l != null) {
-							// don't include the references of the refereced
-							// elements, otherwise, may cause deadlock
-							refXml.addChild(l.getXmlElement(false));
-						}
-					}
-				}
-			}
-		}
-
-		return elementXml;
-	}
-
-	public List getLayouts() {
-		return null;
-	}
-
-	/**
-	 * Returns the file name with the given extension for the given layout.
-	 */
-	public String getFileName(LayoutInfo info, String ext) {
-		return ResourceHelper.getFileName(element, null, info.name, ext);
-	}
-
-	public void setContentTarget(MethodElement targetElement) {
-	}
-
-	public void setElementOwner(MethodElement owner) {
-	}
-
-	/**
-	 * check if the html content generated from this xsl file needs to be scanned or not
-	 * scan the content is for identifying element references in the content and copy over resource files
-	 * in some cases we don't need to scan the content, for example, the activity breakdown structure
-	 * 
-	 * @param xslUrl the xsl that html is generated from, null for the default xsl layout
-	 * @return boolean
-	 */
-	public boolean needContentScan(String xslUrl)
-	{
-		return false;
-	}
-	
-	public void setShowElementLink(boolean show) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/SupportingMaterialLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/SupportingMaterialLayout.java
deleted file mode 100644
index 5546d7d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/SupportingMaterialLayout.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Supporting Material.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class SupportingMaterialLayout extends AbstractElementLayout {
-
-	public SupportingMaterialLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.SupportingMaterial_ContentElements,
-					layoutManager.getElementRealizer());
-			
-			List activities = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.SupportingMaterial_Activities, layoutManager
-							.getElementRealizer());
-
-			contentElements.addAll(activities);
-
-			addReferences(AssociationHelper.SupportingMaterial_ContentElements, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-		}
-
-		return elementXml;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TaskDescriptorLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TaskDescriptorLayout.java
deleted file mode 100644
index 775f6f3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TaskDescriptorLayout.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * The layout for a TaskDescriptor.
- * 
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class TaskDescriptorLayout extends DescriptorLayout {
-	public static final Collection<EStructuralFeature> extraFeaturesFromTask = Arrays.asList(new EStructuralFeature[] {
-			UmaPackage.eINSTANCE.getTask_ToolMentors()
-	});
-	
-	public TaskDescriptorLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	public XmlElement getXmlElement(boolean includeReferences) {
-		return super.getXmlElement(includeReferences);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.layout.elements.AbstractElementLayout#loadReferences(XmlElement, boolean)
-	 */
-	public void loadReferences(XmlElement elementXml, boolean includeReferences) {
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features
-						.get(i);
-				if (feature == UmaPackage.eINSTANCE
-						.getTaskDescriptor_SelectedSteps()) {
-					// need to handle the step contents by fixing the links
-					processSteps(elementXml, includeReferences);
-
-				} else if (feature == UmaPackage.eINSTANCE
-						.getWorkBreakdownElement_LinkToPredecessor()) {
-					super.loadWorkOrder(elementXml);
-				} else if (feature.getEType() instanceof EClass) {
-					loadFeature(feature, elementXml, includeReferences);
-				}
-			}
-		}
-		
-		elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		
-		if ((super.elementLayout != null ) && layoutManager.getValidator().showExtraInfoForDescriptors() ) {
-			// also load the linked element referenced information
-			for (Iterator<EStructuralFeature> iterator = getExtraFeaturesFromContentElement().iterator(); iterator.hasNext();) {
-				EStructuralFeature feature = iterator.next();
-				super.elementLayout.loadFeature(feature, elementXml, false);
-			}
-		}
-	}
-
-	private void processSteps(XmlElement elementXml, boolean includeReferences) {
-		
-		// 196094 - Task descriptor page should show the realized content of the linked element
-		
-		EStructuralFeature feature = UmaPackage.eINSTANCE.getTaskDescriptor_SelectedSteps();
-		String feature_name = feature.getName();
-
-		List items;
-		
-		// per Peter, this is not the right behavior
-		// descriptors should always show the selected steps of the original element
-		// it should not show the realized steps
-		// so rollback to the old behavior
-		// Jinhua Xi 08/28/07
-		/*
-		if ( layoutManager.getValidator().showExtraInfoForDescriptors()) {
-			if (linkedElement == null) {
-				items = null;
-			} else {
-				EStructuralFeature f = UmaPackage.eINSTANCE.getTask_Steps();
-				items = ConfigurationHelper.calc0nFeatureValue(linkedElement, f,
-						getLayoutMgr().getElementRealizer());
-			}
-
-		} else 
-		*/
-		{
-			items = ConfigurationHelper.calc0nFeatureValue(element, feature,
-					getLayoutMgr().getElementRealizer());
-		}
-		
-		XmlElement stepXml = elementXml
-				.newChild("referenceList").setAttribute("name", feature_name); //$NON-NLS-1$ //$NON-NLS-2$
-
-		if (items != null && items.size() > 0) {
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				Object e = it.next();
-				if (e instanceof MethodElement) {
-					MethodElement me = (MethodElement) e;
-					e = ConfigurationHelper.getCalculatedElement(me,
-							layoutManager.getConfiguration());
-					if (e != null) {
-						IElementLayout l = layoutManager.getLayout(me, true);
-						if (l != null) {
-							l.setContentTarget(element);
-							stepXml.addChild(l
-									.getXmlElement(ConfigurationHelper
-											.isDescriptionElement(me) ? true
-											: includeReferences));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	@Override
-	protected Collection<EStructuralFeature> getExtraFeaturesFromContentElement() {
-		ArrayList<EStructuralFeature> features = new ArrayList<EStructuralFeature>(extraFeaturesFromTask);
-		features.addAll(super.getExtraFeaturesFromContentElement());
-		return features;
-	}
-
-	protected boolean isSuppressed(Suppression sup, EStructuralFeature feature, Object element) {
-		
-		// make sure all cases are covered
-		if ( element instanceof RoleDescriptor || element instanceof WorkProductDescriptor ) {
-			String path = super.makePath(super.elementProcessPath, (MethodElement)element);
-			String[] paths = super.getPathArray(path);
-			ComposedAdapterFactory adapterFactory = layoutManager.getCBSAdapterFactory();
-			Object wrapper = sup.getObjectByPath(paths, adapterFactory);
-			if ( wrapper == null ) {
-				wrapper = element;
-			}
-			
-			return sup.isSuppressed(wrapper, feature);
-	
-		} else {
-			return super.isSuppressed(sup, feature, element);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TaskLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TaskLayout.java
deleted file mode 100644
index 7dcb015..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TaskLayout.java
+++ /dev/null
@@ -1,88 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Task.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class TaskLayout extends AbstractElementLayout {
-
-	public TaskLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-		if (includeReferences) {
-			Task task = (Task) super.element;
-			Role performingRole = task.getPerformedBy();
-			if (performingRole != null) {
-				MethodElement role = ConfigurationHelper.getCalculatedElement(
-						(MethodElement) performingRole, layoutManager
-								.getConfiguration());
-				if (role != null) {
-					String roleName = ((Role) role).getPresentationName();
-					if (roleName == null || roleName.length() == 0) {
-						roleName = role.getName();
-					}
-					elementXml.setAttribute("performingRoleName", roleName); //$NON-NLS-1$
-					addReference(UmaPackage.eINSTANCE.getTask_PerformedBy(), elementXml, "performingRole", role); //$NON-NLS-1$
-				}
-			}
-
-			// calculate the categories opposite feature
-			// multiplicity change for opposite features
-			List disciplines = ConfigurationHelper.calc0nFeatureValue(
-					super.element, AssociationHelper.Task_Disciplines,
-					layoutManager.getElementRealizer());
-			addReferences(AssociationHelper.Task_Disciplines, elementXml, "disciplines", disciplines); //$NON-NLS-1$
-
-			List usercategories = ConfigurationHelper.calc0nFeatureValue(
-					super.element,
-					AssociationHelper.DescribableElement_CustomCategories,
-					layoutManager.getElementRealizer());
-			processChild(AssociationHelper.DescribableElement_CustomCategories, 
-					elementXml
-							.newChild("referenceList").setAttribute("name", "customCategories"), usercategories, false); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-			// add the descriptors referencing this element
-			super.processDescriptors(elementXml);
-
-		}
-		elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		
-		return elementXml;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TeamProfileLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TeamProfileLayout.java
deleted file mode 100644
index 9b511d9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TeamProfileLayout.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-
-
-/**
- * Team Profile layout for browsing
- * 
- * @author Shilpa Toraskar
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class TeamProfileLayout extends AbstractProcessElementLayout {
-
-	public TeamProfileLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		return super.getXmlElement(includeReferences);
-	}
-	/**
-	 * load the non-attribute feature
-	 * 
-	 * @param feature
-	 * @param elementXml
-	 * @param includeReferences
-	 */
-	public void loadFeature(EStructuralFeature feature, XmlElement elementXml,
-			boolean includeReferences) {
-		if (!(feature.getEType() instanceof EClass)) {
-			return;
-		}
-
-		String name = feature.getName();
-
-		if (!feature.isMany()) {
-			MethodElement e = ConfigurationHelper.calc01FeatureValue(element,
-					feature, layoutManager.getElementRealizer());
-			// Browsing stops working when a role is set to
-			// replaced another role
-			// for replacer, the base will be evaluated to the replacer
-			// and causing deadlock
-			if (e != null && e != element) {
-				boolean showDetail = (ConfigurationHelper
-						.isDescriptionElement(e)
-				/*
-				 * || (p ==
-				 * UmaPackage.eINSTANCE.getMethodUnit_CopyrightStatement())
-				 */) ? true : includeReferences;
-
-				if ( acceptFeatureValue(feature, e) ) {
-					processChild(feature, 
-							elementXml
-									.newChild("reference").setAttribute("name", name), e, showDetail); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		} else if (feature.isMany()) {
-			List pv = ConfigurationHelper.calc0nFeatureValue(element, feature,
-					getLayoutMgr().getElementRealizer());
-			List roleDescList = new ArrayList();
-			if ((pv != null) && (!pv.isEmpty()))
-			{
-				for (Iterator itor=pv.iterator(); itor.hasNext();)
-				{
-					Object obj = itor.next();
-					if (obj instanceof RoleDescriptor) 
-					{
-						RoleDescriptor roleDesc = (RoleDescriptor) obj;
-						if ((roleDesc.getSuperActivities() == null)
-							|| (roleDesc.getSuperActivities() == null))
-							roleDescList.add(obj);
-					}
-				}
-			}
-
-			if ( acceptFeatureValue(feature, roleDescList) && roleDescList.size() > 0 ) {
-				addReferences(feature, elementXml, name, roleDescList);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TemplateLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TemplateLayout.java
deleted file mode 100644
index ea3cd28..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/TemplateLayout.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Template.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class TemplateLayout extends AbstractElementLayout {
-
-	public TemplateLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Template_WorkProducts, layoutManager
-							.getElementRealizer());
-			addReferences(AssociationHelper.Template_WorkProducts, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-
-			Guidance guidance = (Guidance) super.element;
-			ContentDescription content = (ContentDescription) guidance
-					.getPresentation();
-			if (content != null) {
-				
-				// Authoring:  Template attachments of a contributing template guidance element are not appended to the base list of attachments				
-				//String attachmentString = ((org.eclipse.epf.uma.GuidanceDescription)content).getAttachments();
-				EStructuralFeature feature = UmaPackage.eINSTANCE.getGuidanceDescription_Attachments();
-				String attachmentString = (String)ConfigurationHelper.calcAttributeFeatureValue(content, super.element, feature, super.layoutManager.getConfiguration());
-				if ( (attachmentString != null) && (attachmentString.indexOf(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR) > 0) )
-				{
-					attachmentString = attachmentString.replaceAll(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR, TngUtil.GUIDANCE_FILESTRING_SEPARATOR); 
-				}
-				List attachmentList = TngUtil.convertGuidanceAttachmentsToList(attachmentString);
-				for (Iterator iter = attachmentList.iterator();iter.hasNext();) {
-					String attachmentFile = (String) iter.next();
-					if (attachmentFile != null) {
-						Matcher m = ResourceHelper.p_template_attachment_url.matcher(attachmentFile);
-						if (!m.find()) {
-							String fileName = FileUtil.getFileName(attachmentFile);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", "file://" + attachmentFile) //$NON-NLS-1$ //$NON-NLS-2$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						} else {
-							String fileName = m.group(2);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", m.group(1)) //$NON-NLS-1$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-
-		return elementXml;
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ToolMentorLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ToolMentorLayout.java
deleted file mode 100644
index 4ac7f94..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ToolMentorLayout.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Tool Mentor.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ToolMentorLayout extends AbstractElementLayout {
-
-	public ToolMentorLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.ToolMentor_Tasks, layoutManager
-							.getElementRealizer());
-			addReferences(AssociationHelper.ToolMentor_Tasks, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-
-			MethodElement tool = ConfigurationHelper.calc01FeatureValue(
-					super.element, AssociationHelper.ToolMentor_Tool,
-					layoutManager.getElementRealizer());
-			addReference(AssociationHelper.ToolMentor_Tool, elementXml, "tool", tool); //$NON-NLS-1$			
-		}
-
-		return elementXml;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WhitepaperLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WhitepaperLayout.java
deleted file mode 100644
index 5310cb0..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WhitepaperLayout.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for a Whitepaper.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since  1.0
- */
-public class WhitepaperLayout extends AbstractElementLayout {
-	
-	public WhitepaperLayout() {
-		super();
-	}
-	
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-	
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-
-		if (includeReferences) {
-			List contentElements = ConfigurationHelper.calc0nFeatureValue(super.element, 
-					AssociationHelper.Concept_ContentElements, 
-					layoutManager.getElementRealizer());
-			
-			List activities = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.Concept_Activities, layoutManager
-							.getElementRealizer());
-
-			contentElements.addAll(activities);
-
-			addReferences(AssociationHelper.Concept_ContentElements, elementXml, "contentElements", contentElements); //$NON-NLS-1$
-
-			Guidance guidance = (Guidance) super.element;
-			ContentDescription content = (ContentDescription) guidance
-					.getPresentation();
-			if (content != null) {
-				
-				// Authoring:  Template attachments of a contributing template guidance element are not appended to the base list of attachments				
-				//String attachmentString = ((org.eclipse.epf.uma.GuidanceDescription)content).getAttachments();
-				EStructuralFeature feature = UmaPackage.eINSTANCE.getGuidanceDescription_Attachments();
-				String attachmentString = (String)ConfigurationHelper.calcAttributeFeatureValue(content, super.element, feature, super.layoutManager.getConfiguration());
-				if ( (attachmentString != null) && (attachmentString.indexOf(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR) > 0) )
-				{
-					attachmentString = attachmentString.replaceAll(ConfigurationHelper.ATTRIBUTE_VALUE_SEPERATOR, TngUtil.GUIDANCE_FILESTRING_SEPARATOR); 
-				}
-				List attachmentList = TngUtil.convertGuidanceAttachmentsToList(attachmentString);
-				for (Iterator iter = attachmentList.iterator();iter.hasNext();) {
-					String attachmentFile = (String) iter.next();
-					if (attachmentFile != null) {
-						Matcher m = ResourceHelper.p_template_attachment_url.matcher(attachmentFile);
-						if (!m.find()) {
-							String fileName = FileUtil.getFileName(attachmentFile);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", "file://" + attachmentFile) //$NON-NLS-1$ //$NON-NLS-2$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						} else {
-							String fileName = m.group(2);
-							elementXml.newChild("attribute").setAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$
-									"attachedFile").setAttribute( //$NON-NLS-1$
-									"url", m.group(1)) //$NON-NLS-1$ 
-									.setAttribute("fileName", fileName); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-
-		return elementXml;
-	}
-	
-}
-
-
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkBreakdownElementLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkBreakdownElementLayout.java
deleted file mode 100644
index abe5d16..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkBreakdownElementLayout.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * The layout for work breakdown Elements.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class WorkBreakdownElementLayout extends AbstractProcessElementLayout {
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * override this method to handle the workorder
-	 */
-	public void loadReferences(XmlElement elementXml, boolean includeReferences) {
-		List features = LibraryUtil.getStructuralFeatures(element);
-//		List properties = element.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features
-						.get(i);
-				if (feature.getEType() instanceof EClass) {
-					if (feature != UmaPackage.eINSTANCE
-							.getWorkBreakdownElement_LinkToPredecessor()) {
-						loadFeature(feature, elementXml, includeReferences);
-					} else {
-						super.loadWorkOrder(elementXml);
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkProductDescriptorLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkProductDescriptorLayout.java
deleted file mode 100644
index 3bfb741..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkProductDescriptorLayout.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.configuration.ElementRealizer;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-public class WorkProductDescriptorLayout extends DescriptorLayout {
-	
-	public static final Collection<EStructuralFeature> extraFeaturesFromWorkProduct = Arrays.asList(new EStructuralFeature[] {
-			UmaPackage.eINSTANCE.getWorkProduct_EstimationConsiderations(),
-			UmaPackage.eINSTANCE.getWorkProduct_Reports(),
-			UmaPackage.eINSTANCE.getWorkProduct_Templates(),
-			UmaPackage.eINSTANCE.getWorkProduct_ToolMentors()
-	});
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.elements.AbstractElementLayout#loadReferences(XmlElement, boolean)
-	 */
-	public void loadReferences(XmlElement elementXml, boolean includeReferences) {
-
-		super.loadReferences(elementXml, includeReferences);
-		
-		// 161325 - WPDescriptors did not show modify RoleDescriptors
-		// get the modifies feature
-		// this guy does not have a defined opposite feature
-		// this method call is not safe. 
-//		List modifyRoles = ConfigurationHelper.calcModifyRoleDescriptors(
-//				(WorkProductDescriptor)super.element, 
-//				layoutManager.getElementRealizer());
-		
-		List modifyRoles = calcModifyRoleDescriptors();
-		
-		addReferences(null, elementXml, "workedOnBy", modifyRoles); //$NON-NLS-1$
-		
-		elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		
-		if ((super.elementLayout != null ) && layoutManager.getValidator().showExtraInfoForDescriptors() ) {
-			// also load the linked element referenced information
-			for (Iterator<EStructuralFeature> iterator = getExtraFeaturesFromContentElement().iterator(); iterator.hasNext();) {
-				EStructuralFeature feature = iterator.next();
-				super.elementLayout.loadFeature(feature, elementXml, false);
-			}
-
-		}
-	}
-	
-	@Override
-	protected Collection<EStructuralFeature> getExtraFeaturesFromContentElement() {
-		ArrayList<EStructuralFeature> features = new ArrayList<EStructuralFeature>(extraFeaturesFromWorkProduct);
-		features.addAll(super.getExtraFeaturesFromContentElement());
-		return features;
-	}
-	
-	public List calcModifyRoleDescriptors() {
-		
-		List modifyRoles = new ArrayList();
-
-		ElementRealizer realizer = getLayoutMgr().getElementRealizer();
-		List taskDescriptors = ConfigurationHelper.calc0nFeatureValue(
-				element, 
-				AssociationHelper.WorkProductDescriptor_OutputFrom_TaskDescriptors, 
-				realizer);
-		
-		EStructuralFeature feature = UmaPackage.eINSTANCE.getTaskDescriptor_Output();
-		for (Iterator it = taskDescriptors.iterator(); it.hasNext(); ) {
-			TaskDescriptor t = (TaskDescriptor)it.next();
-			
-			// make sure the task descriptor has the current wp descriptor as output
-			String path = super.makePath(getSuperActivityPath(), t);
-			TaskDescriptorLayout tl = (TaskDescriptorLayout)layoutManager.createLayout(t, owningProcess, path);
-			List outputs = (List)tl.getFeatureValue(feature, null, false);
-			
-			if ( outputs != null && outputs.contains(element) ) {	
-				RoleDescriptor r = (RoleDescriptor)tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(), null, false);
-
-				if ( (r != null) && !modifyRoles.contains(r) ) {
-					modifyRoles.add(r);
-				}
-			}
-		}
-		
-		return modifyRoles;
-	}
-	
-	protected boolean acceptFeatureValue(OppositeFeature feature, Object value) {
-		
-		if ( !super.acceptFeatureValue(feature, value) ) {
-			return false;
-		}
-		
-		if ( !isTaskOppositeFeature(feature) || !(value instanceof List) ) {
-			return true;
-		}
-		
-		List items = (List)value;
-		int i = 0;
-		while (i < items.size() ) {
-			MethodElement e = (MethodElement)items.get(i);
-			String path = super.makePath(getSuperActivityPath(), e);
-			TaskDescriptorLayout tl = (TaskDescriptorLayout)layoutManager.createLayout(e, owningProcess, path);
-			List o = null;
-			if ( feature == AssociationHelper.WorkProductDescriptor_ExternalInputTo_TaskDescriptors ) {
-				o = (List)tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_ExternalInput(), null, false);			
-			} else if ( feature == AssociationHelper.WorkProductDescriptor_MandatoryInputTo_TaskDescriptors ) {
-				o = (List)tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput(), null, false);			
-			} else if ( feature == AssociationHelper.WorkProductDescriptor_OptionalInputTo_TaskDescriptors ) {
-				o = (List)tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput(), null, false);			
-			} else if ( feature == AssociationHelper.WorkProductDescriptor_OutputFrom_TaskDescriptors ) {
-				o = (List)tl.getFeatureValue(UmaPackage.eINSTANCE.getTaskDescriptor_Output(), null, false);			
-			} 
-			
-			if ( (o != null) && o.contains(this.element) ) {
-				i++;
-			} else {
-				items.remove(i);
-			}
-		}
-
-
-		
-		return true;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkProductLayout.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkProductLayout.java
deleted file mode 100644
index 0bc4a5a..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/WorkProductLayout.java
+++ /dev/null
@@ -1,146 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.elements;
-
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-
-/**
- * The element layout for an Artifact.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class WorkProductLayout extends AbstractElementLayout {
-
-	public WorkProductLayout() {
-		super();
-	}
-
-	public void init(ElementLayoutManager layoutManager, MethodElement element) {
-		super.__init(layoutManager, element);
-	}
-
-	/**
-	 * @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
-	 */
-	public XmlElement getXmlElement(boolean includeReferences) {
-		XmlElement elementXml = super.getXmlElement(includeReferences);
-		if (includeReferences) {
-
-			// no this will lose the contributor
-			// Role responsibleRole =
-			// AssociationHelper.getResponsibleRole((WorkProduct)super.element);
-			//multiplicity change for opposite features
-			List responsibleRoles = ConfigurationHelper
-					.calc0nFeatureValue(super.element,
-							AssociationHelper.WorkProduct_ResponsibleRoles,
-							layoutManager.getElementRealizer());
-//			if (responsibleRole != null) {
-//				MethodElement role = ConfigurationHelper.getCalculatedElement(
-//						(MethodElement) responsibleRole, layoutManager
-//								.getConfiguration());
-//				if (role != null) {
-//					String roleName = ((Role) role).getPresentationName();
-//					if (roleName == null || roleName.length() == 0) {
-//						roleName = role.getName();
-//					}
-//					elementXml.setAttribute("responsibleRoleName", roleName); //$NON-NLS-1$
-//					addReference(AssociationHelper.WorkProduct_ResponsibleRole, elementXml, "responsibleRole", role); //$NON-NLS-1$
-//				}
-//			}
-			addReferences(AssociationHelper.WorkProduct_ResponsibleRoles, elementXml, "responsibleRoles", responsibleRoles); //$NON-NLS-1$
-
-			// Browsing a Configuration Includes a Relationship that is not Part of the Configuration
-			// should call the configuration helper to realize the value
-			// there is no opposite feature defined for this. 
-			// we get the value in two steps:
-			// 1. get the tasks that output this WP
-			// 2. get the roles that is the responsible for the tasks
-//			List modifyRoles = AssociationHelper
-//					.getModifiedBy((WorkProduct) super.element);
-//			modifyRoles = ConfigurationHelper.getCalculatedElements(
-//					modifyRoles, layoutManager.getConfiguration());
-			
-//			List tasks = ConfigurationHelper.calc0nFeatureValue(
-//					super.element, 
-//					AssociationHelper.WorkProduct_OutputFrom_Tasks, 
-//					layoutManager.getElementRealizer());
-//			List modifyRoles = new ArrayList();
-//			for (Iterator it = tasks.iterator(); it.hasNext(); ) {
-//				Task t = (Task)it.next();
-//				List roles = ConfigurationHelper.calc0nFeatureValue(
-//						t, 
-//						UmaPackage.eINSTANCE.getTask_PerformedBy(), 
-//						layoutManager.getElementRealizer());
-//				for (Iterator itr = roles.iterator(); itr.hasNext(); ) {
-//					Object r = itr.next();
-//					if ( !modifyRoles.contains(r) ) {
-//						modifyRoles.add(r);
-//					}
-//				}
-//			}
-			
-			List modifyRoles = ConfigurationHelper.calcModifyRoles(
-					(WorkProduct)super.element, 
-					layoutManager.getElementRealizer());
-			
-			// this guy does not have a defined opposite feature
-			// just pass null as it's feature object, Jinhua Xi, 04/17/2006
-			addReferences(null, elementXml, "modifyRoles", modifyRoles); //$NON-NLS-1$
-
-			List domains = ConfigurationHelper.calc0nFeatureValue(
-					super.element, AssociationHelper.WorkProduct_Domains,
-					layoutManager.getElementRealizer());
-			addReferences(AssociationHelper.WorkProduct_Domains, elementXml, "domains", domains); //$NON-NLS-1$
-
-			List workProductTypes = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.WorkProduct_WorkProductTypes,
-					layoutManager.getElementRealizer());
-			addReferences(AssociationHelper.WorkProduct_WorkProductTypes, elementXml, "workProductTypes", workProductTypes); //$NON-NLS-1$
-
-			List mandatoryInputToTasks = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.WorkProduct_MandatoryInputTo_Tasks,
-					layoutManager.getElementRealizer());
-			addReferences(AssociationHelper.WorkProduct_MandatoryInputTo_Tasks, elementXml,
-					"mandatoryInputToTasks", mandatoryInputToTasks); //$NON-NLS-1$
-
-			List optionalInputToTasks = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.WorkProduct_OptionalInputTo_Tasks,
-					layoutManager.getElementRealizer());
-			addReferences(AssociationHelper.WorkProduct_OptionalInputTo_Tasks, elementXml,
-					"optionalInputToTasks", optionalInputToTasks); //$NON-NLS-1$
-
-			List outputFromTasks = ConfigurationHelper.calc0nFeatureValue(super.element,
-					AssociationHelper.WorkProduct_OutputFrom_Tasks,
-					layoutManager.getElementRealizer());
-			addReferences(AssociationHelper.WorkProduct_OutputFrom_Tasks, 
-					elementXml, "outputFromTasks", outputFromTasks); //$NON-NLS-1$
-			
-			// add the descriptors referencing this element
-			super.processDescriptors(elementXml);
-
-		}
-		elementXml.setAttribute("ShowFullMethodContent", (layoutManager.getValidator().showExtraInfoForDescriptors()) ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		
-		return elementXml;
-	}
-
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/package.html
deleted file mode 100644
index 87c4f3e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides layout management for method and process elements in a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/package.html
deleted file mode 100644
index 7d5bef5..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for managing the layout of method and process elements in a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/IXmlElement.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/IXmlElement.java
deleted file mode 100644
index 8ec8789..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/IXmlElement.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.util;
-
-/**
- * The interface for an XML element.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface IXmlElement {
-
-	/**
-	 * get the xml string text
-	 * @return StringBuffer
-	 */
-	public StringBuffer toXml();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/XmlElement.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/XmlElement.java
deleted file mode 100644
index 3ff9610..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/XmlElement.java
+++ /dev/null
@@ -1,222 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.util;
-
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.common.utils.FileUtil;
-
-
-/**
- * Implements a XML element.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class XmlElement implements IXmlElement {
-
-	public static final String BR = FileUtil.LINE_SEP;
-
-	private static String NODE_ID = "nodeId"; //$NON-NLS-1$
-
-	// private static String PARENT_NODE_ID = "parentNodeId";
-
-	private String element_name = null;
-
-	private String element_value = null;
-
-	private Map attributes = new HashMap();
-
-	private Map contents = new HashMap();
-
-	private List children = new ArrayList();
-
-	private String id = null;
-
-	/**
-	 * create an XmlElement
-	 * 
-	 * @param name String
-	 */
-	public XmlElement(String name) {
-		this(name, null);
-	}
-
-	/**
-	 * create an XmlElement
-	 * @param name String
-	 * @param id String
-	 */
-	public XmlElement(String name, String id) {
-		this.element_name = name;
-		
-		if (id == null ) {
-			id = Integer.toHexString(this.toString().hashCode());
-		}
-		
-		this.id = id;
-		setAttribute(NODE_ID, this.id);
-	}
-	
-	/**
-	 * set attribute
-	 * @param name
-	 * @param value
-	 * @return XmlElement the element itself
-	 */
-	public XmlElement setAttribute(String name, String value) {
-		attributes.put(name, value);
-		return this;
-	}
-
-	/**
-	 * set the value of the element
-	 * @param value
-	 * @return XmlElement the element itself
-	 */
-	public XmlElement setValue(String value) {
-		this.element_value = value;
-		return this;
-	}
-
-	/**
-	 * set the content of the element.
-	 * @param name
-	 * @param value
-	 * @return XmlElement the element itself
-	 */
-	public XmlElement setContent(String name, Object value) {
-		contents.put(name, value);
-		return this;
-	}
-
-	/**
-	 * add a child element
-	 * @param child
-	 * @return XmlElement the element itself
-	 */
-	public XmlElement addChild(XmlElement child) {
-		children.add(child);
-		return this;
-	}
-
-	/**
-	 * create a new chiild element
-	 * @param name
-	 * @return XmlElement the child element
-	 */
-	public XmlElement newChild(String name) {
-		return newChild(name, null);
-	}
-	
-	/**
-	 * create a new child element
-	 * @param name
-	 * @param id
-	 * @return XmlElement the child element
-	 */
-	public XmlElement newChild(String name, String id) {
-		XmlElement child = new XmlElement(name, id);
-		children.add(child);
-		return child;
-	}
-
-	/**
-	 * get the id
-	 * @return String
-	 */
-	public String getId() {
-		return this.id;
-	}
-	
-	/**
-	 * get the xml string
-	 * @return StringBuffer
-	 */
-	public StringBuffer toXml() {
-		StringBuffer buffer = new StringBuffer();
-		if (contents.size() == 0 && children.size() == 0) {
-			buffer.append(
-					XmlHelper.getElement(element_name, element_value,
-							attributes)).append(BR);
-		} else {
-			buffer.append(XmlHelper.beginElement(element_name, attributes))
-					.append(BR);
-
-			// process the contents
-			for (Iterator it = contents.entrySet().iterator(); it.hasNext();) {
-				Map.Entry entry = (Map.Entry) it.next();
-				String key = (String) entry.getKey();
-				Object value = entry.getValue();
-				if (value instanceof List) {
-					for (Iterator itList = ((List) value).iterator(); itList
-							.hasNext();) {
-						buffer.append(
-								XmlHelper.getElement(key, itList.next()
-										.toString(), null)).append(BR);
-					}
-				} else {
-					buffer
-							.append(
-									XmlHelper
-											.getElement(
-													key,
-													(value == null) ? "" : value.toString(), null)).append(BR); //$NON-NLS-1$
-				}
-			}
-
-			// process the children
-			for (Iterator it = children.iterator(); it.hasNext();) {
-				IXmlElement child = (IXmlElement) it.next();
-				buffer.append(child.toXml());
-			}
-
-			buffer.append(XmlHelper.endElement(element_name)).append(BR);
-		}
-
-		return buffer;
-	}
-
-	/**
-	 * save the element's xml to a file
-	 * @param filePathName
-	 */
-	public void saveTo(String filePathName) {
-		StringBuffer xml = new StringBuffer();
-		xml.append(XmlHelper.XML_HEADER).append(this.toXml());
-
-		try {
-			// may need to create the folders, TODO
-			/*
-			 * File xf = new File( filePath); if ( !xf.exists() ) { xf.mkdirs(); }
-			 */
-
-			// need to enfore utf-8 encoding, can't use FileWriter, jxi
-			// FileWriter xw = new FileWriter(filePathName);
-			OutputStreamWriter xw = new OutputStreamWriter(
-					new FileOutputStream(filePathName), "utf-8"); //$NON-NLS-1$
-
-			xw.write(xml.toString());
-			xw.flush();
-			xw.close();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/XmlHelper.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/XmlHelper.java
deleted file mode 100644
index 55fad25..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/XmlHelper.java
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.layout.util;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.XMLUtil;
-
-
-/**
- * Helper class for processing the XML representation of a Method Element.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- */
-public class XmlHelper {
-
-	/**
-	 * XML declaration.
-	 */
-	public final static String XML_HEADER = XMLUtil.XML_DECLARATION
-			+ FileUtil.LINE_SEP;
-
-	public static String validName(String elementName) {
-		return XMLUtil.escape(elementName.replace(' ', '-'));
-	}
-
-	public static String quote(String str) {
-		return "\"" + str + "\""; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	public static String validate(String s) {
-		return s == null ? "" : s; //$NON-NLS-1$
-	}
-
-	/**
-	 * create the start tag of an xml element
-	 * @param elementName
-	 * @param attributes
-	 * @return String
-	 */
-	public static String beginElement(String elementName, Map attributes) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("<" + validName(elementName)); //$NON-NLS-1$
-		if ((attributes != null) && (attributes.size() > 0)) {
-			Iterator it = attributes.entrySet().iterator();
-			String key, value;
-			while (it.hasNext()) {
-				Map.Entry entry = (Map.Entry) it.next();
-				key = (String) entry.getKey();
-				value = quote(XMLUtil.escape(
-						validate((String) entry.getValue()), true));
-				buffer.append(" " + validName(key) + "=" + value); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		buffer.append(">"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-
-	/**
-	 * create an end tag of an xml element
-	 * @param elementName
-	 * @return String
-	 */
-	public static String endElement(String elementName) {
-		return "</" + validName(elementName) + ">"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * create an xml element string
-	 * @param elementName
-	 * @param elementValue
-	 * @param attributes
-	 * @return String
-	 */
-	public static String getElement(String elementName, String elementValue,
-			Map attributes) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(beginElement(elementName, attributes)).append(
-				XMLUtil.escape(validate(elementValue), true)).append(
-				endElement(elementName));
-		return buffer.toString();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/package.html
deleted file mode 100644
index 0d0f034..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides layout management support for method and process elements.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/package.html
deleted file mode 100644
index 0916151..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the library service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/preferences/LibraryPreferences.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/preferences/LibraryPreferences.java
deleted file mode 100644
index a03d889..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/preferences/LibraryPreferences.java
+++ /dev/null
@@ -1,230 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.preferences;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * The Library preferences.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryPreferences {
-
-	/**
-	 * Preference key for storing the URI of the method library that was opened
-	 * in the last session.
-	 */
-	public static final String SAVED_METHOD_LIRARY_URI = "savedMethodLibraryURI"; //$NON-NLS-1$
-
-	/**
-	 * Preference key for storing the type of the method library that was opened
-	 * in the last session.
-	 */
-	public static final String SAVED_METHOD_LIRARY_TYPE = "savedMethodLibraryType"; //$NON-NLS-1$
-
-	/**
-	 * Preference key for storing the discard unresolved references.
-	 */
-	public static final String DISCARD_UNRESOLVED_REFERENCES = "discardUnresolvedReferences"; //$NON-NLS-1$
-
-	/**
-	 * Preference key for use new extends semantics.
-	 */
-	public static final String USE_NEW_EXTENDS_SEMANTICS = "useNewExtendsSemantics"; //$NON-NLS-1$
-
-	/**
-	 * Preference key for the horizontal spacing between tasks and roles in the
-	 * role diagram.
-	 */
-	public static final String ROLE_DIAGRAM_HORIZONTAL_SPACING = "roleDiagramHorizontalSpacing"; //$NON-NLS-1$
-
-	/**
-	 * Preference key for the vertical spacing between tasks and roles in the
-	 * role diagram.
-	 */
-	public static final String ROLE_DIAGRAM_VERTICAL_SPACING = "roleDiagramVerticalSpacing"; //$NON-NLS-1$
-
-	/**
-	 * Preference key for the maximun element label text lines in the role
-	 * diagram.
-	 */
-	public static final String ROLE_DIAGRAM_MAX_TEXT_LINES = "roleDiagramElementLabelTextLines"; //$NON-NLS-1$
-
-	private static final boolean DEFAULT_DISCARD_UNRESOLVED_REFERENCES = false;
-
-	private static final boolean DEFAULT_USE_NEW_EXTENDS_SEMANTICS = false;
-
-	private static final int DEFAULT_ROLE_DIAGRAM_HORIZONTAL_SPACING = 70;
-
-	private static final int DEFAULT_ROLE_DIAGRAM_VERTICAL_SPACING = 30;
-
-	private static final int DEFAULT_ROLE_DIAGRAM_MAX_TEXT_LINES = 3;
-
-	// The plug-in specific preference store.
-	private static IPreferenceStoreWrapper prefStore = LibraryPlugin.getDefault()
-			.getPreferenceStore();
-
-	static {
-		// Initialize the default preference values.
-		prefStore.setDefault(DISCARD_UNRESOLVED_REFERENCES,
-				DEFAULT_DISCARD_UNRESOLVED_REFERENCES);
-		prefStore.setDefault(USE_NEW_EXTENDS_SEMANTICS,
-				DEFAULT_USE_NEW_EXTENDS_SEMANTICS);
-
-		prefStore.setDefault(ROLE_DIAGRAM_HORIZONTAL_SPACING,
-				DEFAULT_ROLE_DIAGRAM_HORIZONTAL_SPACING);
-		prefStore.setDefault(ROLE_DIAGRAM_VERTICAL_SPACING,
-				DEFAULT_ROLE_DIAGRAM_VERTICAL_SPACING);
-		prefStore.setDefault(ROLE_DIAGRAM_MAX_TEXT_LINES,
-				DEFAULT_ROLE_DIAGRAM_MAX_TEXT_LINES);
-	}
-
-	/**
-	 * Gets the URI of the method library that was opened in the last session.
-	 */
-	public static String getSavedMethodLibraryURI() {
-		return prefStore.getString(SAVED_METHOD_LIRARY_URI);
-	}
-
-	/**
-	 * Saves the URI of the method library that was opened in the last session.
-	 */
-	public static void setSavedMethodLibraryURI(String value) {
-		prefStore.setValue(SAVED_METHOD_LIRARY_URI, value);
-	}
-
-	/**
-	 * Gets the type of the method library that was opened in the last session.
-	 */
-	public static String getSavedMethodLibraryType() {
-		return prefStore.getString(SAVED_METHOD_LIRARY_TYPE);
-	}
-
-	/**
-	 * Saves the type of the method library that was opened in the last session.
-	 */
-	public static void setSavedMethodLibraryType(String value) {
-		prefStore.setValue(SAVED_METHOD_LIRARY_TYPE, value);
-	}
-
-	/**
-	 * Gets the default discard unresolved references preference.
-	 */
-	public static boolean getDefaultDiscardUnresolvedReferences() {
-		return DEFAULT_DISCARD_UNRESOLVED_REFERENCES;
-	}
-
-	/**
-	 * Gets the discard unresolved references preference.
-	 */
-	public static boolean getDiscardUnresolvedReferences() {
-		return prefStore.getBoolean(DISCARD_UNRESOLVED_REFERENCES);
-	}
-
-	/**
-	 * Saves the discard unresolved references preference.
-	 */
-	public static void setDiscardUnresolvedReferences(boolean value) {
-		prefStore.setValue(DISCARD_UNRESOLVED_REFERENCES, value);
-	}
-
-	/**
-	 * Gets the default use new extends semantics preference.
-	 */
-	public static boolean getDefaultUseNewExtendsSemantics() {
-		return DEFAULT_USE_NEW_EXTENDS_SEMANTICS;
-	}
-
-	/**
-	 * Gets the use new extends semantics preference.
-	 */
-	public static boolean getUseNewExtendsSemantics() {
-		return prefStore.getBoolean(USE_NEW_EXTENDS_SEMANTICS);
-	}
-
-	/**
-	 * Saves the use new extends semantics preference.
-	 */
-	public static void setUseNewExtendsSemantics(boolean value) {
-		prefStore.setValue(USE_NEW_EXTENDS_SEMANTICS, value);
-	}
-
-	/**
-	 * Gets the default role diagram horizontal spacing.
-	 */
-	public static int getDefaultRoleDiagramHorizontalSpacing() {
-		return DEFAULT_ROLE_DIAGRAM_HORIZONTAL_SPACING;
-	}
-
-	/**
-	 * Gets the role diagram horizontal spacing.
-	 */
-	public static int getRoleDiagramHorizontalSpacing() {
-		int value = prefStore.getInt(ROLE_DIAGRAM_HORIZONTAL_SPACING);
-		return value > 0 ? value : DEFAULT_ROLE_DIAGRAM_HORIZONTAL_SPACING;
-	}
-
-	/**
-	 * Saves the role diagram horizontal spacing.
-	 */
-	public static void setRoleDiagramHorizontalSpacing(int value) {
-		prefStore.setValue(ROLE_DIAGRAM_HORIZONTAL_SPACING, value);
-	}
-
-	/**
-	 * Gets the default role diagram vertical spacing.
-	 */
-	public static int getDefaultRoleDiagramVerticalSpacing() {
-		return DEFAULT_ROLE_DIAGRAM_VERTICAL_SPACING;
-	}
-
-	/**
-	 * Gets the role diagram vertical spacing.
-	 */
-	public static int getRoleDiagramVerticalSpacing() {
-		int value = prefStore.getInt(ROLE_DIAGRAM_VERTICAL_SPACING);
-		return value > 0 ? value : DEFAULT_ROLE_DIAGRAM_VERTICAL_SPACING;
-	}
-
-	/**
-	 * Saves the role diagram vertical spacing.
-	 */
-	public static void setRoleDiagramVerticalSpacing(int value) {
-		prefStore.setValue(ROLE_DIAGRAM_VERTICAL_SPACING, value);
-	}
-
-	/**
-	 * Gets the default role diagram element label maximum text lines.
-	 */
-	public static int getDefaultRoleDiagramMaximumTextLines() {
-		return DEFAULT_ROLE_DIAGRAM_MAX_TEXT_LINES;
-	}
-
-	/**
-	 * Gets the role diagram element label maximum text lines.
-	 */
-	public static int getRoleDiagramMaximumTextLines() {
-		int value = prefStore.getInt(ROLE_DIAGRAM_MAX_TEXT_LINES);
-		return value > 0 ? value : DEFAULT_ROLE_DIAGRAM_MAX_TEXT_LINES;
-	}
-
-	/**
-	 * Saves the role diagram element label maximum text lines.
-	 */
-	public static void setRoleDiagramMaximumTextLines(int value) {
-		prefStore.setValue(ROLE_DIAGRAM_MAX_TEXT_LINES, value);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/preferences/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/preferences/package.html
deleted file mode 100644
index 29cc039..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the library service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/BSColumn.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/BSColumn.java
deleted file mode 100644
index 1781bab..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/BSColumn.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.prefs;
-
-/**
- * Simple data structure to identify a breakdown layout column.
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class BSColumn {
-
-	public String id;
-	public String label;
-	
-	public BSColumn(String id, String label) {
-		this.id = id;
-		this.label = label;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/LibraryPreferenceConstants.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/LibraryPreferenceConstants.java
deleted file mode 100644
index 06d4f40..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/LibraryPreferenceConstants.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.prefs;
-
-/**
- * @author Bingxue Xu
- * @since 1.0
- */
-public interface LibraryPreferenceConstants extends PreferenceConstants {
-
-	public static final String PREF_LAST_LIBRARY_PARENT_DIRECTORY = PREFIX + "last_library__parent_directory"; //$NON-NLS-1$
-    public static final String PREF_LAST_DEFAULT_DIRECTORY_CHECKED = PREFIX + "last_default_directory_checked"; //$NON-NLS-1$
-    public static final String PREF_RADIO_SAVE_CHOICE = PREFIX + "radio_save_choice"; //$NON-NLS-1$
-	
-	public static final String PREF_LAST_TRANSLATION_EXPORT_DIRECTORY = PREFIX + "last_translation_export_directory"; //$NON-NLS-1$
-
-    public static final String PREF_LAST_PUBLISH_FOLDER = PREFIX + "last_publish_folder"; //$NON-NLS-1$
-	
-	public static final String PREF_DEFAULT_PUBLISH_DIRECTORY = PREFIX + "default_publish_directory"; //$NON-NLS-1$
-	public static final String PREF_DEFAULT_FEEDBACK_URL = PREFIX + "default_feedback_url"; //$NON-NLS-1$
-	
-	public static final String PREF_PROMPT_FOR_LIBRARY_AT_STARTUP = PREFIX + "prompt_for_library_at_startup"; //$NON-NLS-1$
-	
-	public static final String PREF_SELECTED_CONFIG_IN_LAST_SESSION = PREFIX + "selected_config_in_last_session"; //$NON-NLS-1$
-	
-	//public static final String PREF_DEFAULT_HISTORY_SIZE = PREFIX + "default_list_length_label";
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/PreferenceConstants.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/PreferenceConstants.java
deleted file mode 100644
index f694609..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/PreferenceConstants.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.prefs;
-
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.LibraryEditConstants;
-
-/**
- * Constants to be used in preference store.
- * 
- * @author Phong Nguyen Le
- * @author Jinhua Xi
- * @since 1.0
- */
-public interface PreferenceConstants {
-
-	public static final String PREFIX = "org.eclipse.epf.library.pref."; //$NON-NLS-1$
-
-	// moved from to here to share the constants
-	public static final String PREF_WBS_COLUMNS = LibraryEditConstants.PREF_WBS_COLUMNS;
-
-	public static final String PREF_TBS_COLUMNS = LibraryEditConstants.PREF_TBS_COLUMNS;
-
-	public static final String PREF_WPBS_COLUMNS = LibraryEditConstants.PREF_WPBS_COLUMNS;
-
-	// define the default columns for wbs, tbs, and wpbs layout
-	public static final String[] DEFAULT_WBS_COLUMNS = {
-			IBSItemProvider.COL_PRESENTATION_NAME,
-			IBSItemProvider.COL_ID,
-			// IBSItemProvider.COL_PREFIX,
-			IBSItemProvider.COL_PREDECESSORS, IBSItemProvider.COL_MODEL_INFO,
-			IBSItemProvider.COL_TYPE, IBSItemProvider.COL_IS_PLANNED,
-			IBSItemProvider.COL_IS_REPEATABLE,
-			IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES,
-			IBSItemProvider.COL_IS_ONGOING,
-			IBSItemProvider.COL_IS_EVENT_DRIVEN,
-			IBSItemProvider.COL_IS_OPTIONAL };
-
-	public static final String[] DEFAULT_TBS_COLUMNS = {
-			IBSItemProvider.COL_PRESENTATION_NAME,
-			// IBSItemProvider.COL_ID,
-			// IBSItemProvider.COL_PREFIX,
-			IBSItemProvider.COL_MODEL_INFO, IBSItemProvider.COL_TEAMS,
-			IBSItemProvider.COL_TYPE, IBSItemProvider.COL_IS_PLANNED,
-			IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES,
-			IBSItemProvider.COL_IS_OPTIONAL };
-
-	public static final String[] DEFAULT_WPBS_COLUMNS = {
-			IBSItemProvider.COL_PRESENTATION_NAME,
-			// IBSItemProvider.COL_ID,
-			// IBSItemProvider.COL_PREFIX,
-			IBSItemProvider.COL_MODEL_INFO, IBSItemProvider.COL_ENTRY_STATE,
-			IBSItemProvider.COL_EXIT_STATE, IBSItemProvider.COL_DELIVERABLE,
-			IBSItemProvider.COL_TYPE, IBSItemProvider.COL_IS_PLANNED,
-			IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES,
-			IBSItemProvider.COL_IS_OPTIONAL };
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/PreferenceUtil.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/PreferenceUtil.java
deleted file mode 100644
index e91e154..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/PreferenceUtil.java
+++ /dev/null
@@ -1,226 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.prefs;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.eclipse.epf.common.preferences.IPreferenceStoreWrapper;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * utility class to handle the process element layout preferences
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class PreferenceUtil {
-		
-	private static Properties xslParams;
-	private static Map colIdLabelMap = new HashMap();
-	
-	// quick solution, the team column for the WBS view.
-	// 162783 - Publish team information in WBS for TDs
-	private static BSColumn teamCol = null;
-
-	private static final String ID_STEPS = "steps"; //$NON-NLS-1$
-	static {
-		try {
-			Properties params = LibraryPlugin.getDefault().getProperties(
-					"/layout/xsl/resources.properties"); //$NON-NLS-1$
-			
-			setXslProperties(params);
-			
-		} catch (IOException e) {
-		}
-	}
-	
-	public static void setXslProperties(Properties newXslParams) {
-		xslParams = newXslParams;	
-		
-		colIdLabelMap.put(IBSItemProvider.COL_ID, getLabel("indexText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_NAME, getLabel("nameText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_PRESENTATION_NAME, getLabel("breakdownElementText")); //$NON-NLS-1$
-		colIdLabelMap.put(ID_STEPS, getLabel("stepsText"));		 //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_PREFIX, getLabel("prefixText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_TYPE, getLabel("typeText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_MODEL_INFO, getLabel("modelInfoText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_PREDECESSORS, getLabel("predecessorsText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_IS_REPEATABLE, getLabel("repeatableText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_IS_ONGOING, getLabel("ongoingText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_IS_EVENT_DRIVEN, getLabel("eventDrivenText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_IS_OPTIONAL, getLabel("optionalText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_IS_PLANNED, getLabel("plannedText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_HAS_MULTIPLE_OCCURRENCES, getLabel("multipleOccurrencesText")); //$NON-NLS-1$
-
-		colIdLabelMap.put(IBSItemProvider.COL_TEAMS, getLabel("teamText")); //$NON-NLS-1$
-
-		colIdLabelMap.put(IBSItemProvider.COL_DELIVERABLE, getLabel("deliverableText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_ENTRY_STATE, getLabel("entryStateText")); //$NON-NLS-1$
-		colIdLabelMap.put(IBSItemProvider.COL_EXIT_STATE, getLabel("exitStateText")); //$NON-NLS-1$
-
-	}
-	
-	private static String getLabel(String key) {
-		String label = xslParams.getProperty(key);
-		if ( label == null ) {
-			System.out.println("Can't find property entry for " + key); //$NON-NLS-1$
-			label = key;
-		}
-		return label;
-	}
-	
-	/**
-	 * get a list of columns for WBS layout
-	 * @return List of BSColumn objects
-	 */
-	public static List getWBSColumns() {
-		List cols = getPreferenceItems(PreferenceConstants.PREF_WBS_COLUMNS);
-		
-		// if the TBS columns has team, also add to the WBS
-		// 162783 - Publish team information in WBS for TDs
-		teamCol = null;
-		getTBSColumns();
-		if ( teamCol != null ) {
-			cols.add(cols.size(), teamCol);
-		}
-		return cols;
-	}
-	
-	/**
-	 * get a list of columns for TBS layout
-	 * @return List of BSColumn objects
-	 */
-	public static List getTBSColumns() {
-		return getPreferenceItems(PreferenceConstants.PREF_TBS_COLUMNS);
-	}
-	
-	/**
-	 * get a list of columns for WPBS layout
-	 * @return List of BSColumn objects
-	 */
-	public static List getWPBSColumns() {
-		return getPreferenceItems(PreferenceConstants.PREF_WPBS_COLUMNS);
-	}
-	
-	/**
-	 * validate the columns
-	 */
-	public static void validatePreferences() {
-		// call the method to make sure the default is loaded
-		getWBSColumns();
-		getTBSColumns();
-		getWPBSColumns();
-	}
-	
-	private static List getPreferenceItems(String key) {
-		
-		IPreferenceStoreWrapper store = LibraryPlugin.getDefault().getPreferenceStore();		
-		String str = store.getString(key);
-		if (str == null) {
-			str = store.getDefaultString(key);
-		}
-		
-		if ( str == null || str.length() == 0 ) {
-			str = getDefault(key);
-			store.setValue(key, str);
-		}
-		
-		List items = new ArrayList();
-		StringTokenizer tokens = new StringTokenizer(str, ","); //$NON-NLS-1$
-		while (tokens.hasMoreTokens()) {
-			String id = tokens.nextToken().trim();		
-			if (id != null && id.length() != 0 ) {
-				
-				BSColumn col = new BSColumn(id, getColText(id));
-				items.add(col);
-				// add steps column for WBS
-				if ( key.equals(PreferenceConstants.PREF_WBS_COLUMNS) 
-						&& id.equals(IBSItemProvider.COL_PRESENTATION_NAME) ) {
-					col = new BSColumn(ID_STEPS, getColText(ID_STEPS));
-					items.add(col);
-				}
-				
-				// save the team column for WBS
-				// 162783 - Publish team information in WBS for TDs
-				if ( IBSItemProvider.COL_TEAMS.equals(id) ) {
-					teamCol = col;
-				}
-			}
-		}
-		
-		return items;
-	}
-	
-	private static String getColText(String key) {
-		String text = (String)colIdLabelMap.get(key);
-		if ( text == null ) {
-			System.out.println("No label defined for column " + key);  //$NON-NLS-1$
-			text = key;
-		}
-		
-		return text;
-	}
-	
-	private static  String getDefault(String key) {
-		if ( PreferenceConstants.PREF_WBS_COLUMNS.equals(key) ) {
-			return toString(PreferenceConstants.DEFAULT_WBS_COLUMNS);
-		}
-		
-		if ( PreferenceConstants.PREF_TBS_COLUMNS.equals(key) ) {
-			return toString(PreferenceConstants.DEFAULT_TBS_COLUMNS);
-		}
-		
-		if ( PreferenceConstants.PREF_WPBS_COLUMNS.equals(key) ) {
-			return toString(PreferenceConstants.DEFAULT_WPBS_COLUMNS);
-		}
-		
-		return null;
-	}
-	
-	private static String toString(String[] ids) {
-		StringBuffer strBuf = new StringBuffer();
-		int max = ids.length - 1;
-		for (int i = 0; i < max; i++) {
-			strBuf.append(ids[i])
-					.append(',');
-		}
-		strBuf.append(ids[ids.length-1]);
-		return strBuf.toString();
-	}
-
-	public static void saveSelectedConfigIntoPersistence(String configName) {
-		IPreferenceStoreWrapper store = LibraryPlugin.getDefault()
-				.getPreferenceStore();
-		store
-				.setValue(
-						LibraryPreferenceConstants.PREF_SELECTED_CONFIG_IN_LAST_SESSION,
-						configName);
-		LibraryPlugin.getDefault().savePluginPreferences();
-	}
-
-	public static String getSavedLastConfig() {
-		IPreferenceStoreWrapper store = LibraryPlugin.getDefault()
-				.getPreferenceStore();
-		return store
-				.getString(LibraryPreferenceConstants.PREF_SELECTED_CONFIG_IN_LAST_SESSION);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/package.html
deleted file mode 100644
index 29cc039..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/prefs/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the library service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/MethodLibraryProject.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/MethodLibraryProject.java
deleted file mode 100644
index cdc5eae..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/MethodLibraryProject.java
+++ /dev/null
@@ -1,391 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.project;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.uma.MethodLibrary;
-
-
-/**
- * Helper class for managing the Method Library Projects in a workspace.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * 
- * @since 1.0
- */
-public class MethodLibraryProject {
-
-	/**
-	 * Creates a new method library project in the current workspace.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library.
-	 * @param projectName
-	 *            A name for the new method library project.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @return A method library project.
-	 * @throws CoreException
-	 *             if an error occurs while performing the operation.
-	 */
-	public static IProject createProject(String path, String projectName,
-			IProgressMonitor monitor) throws CoreException {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		
-		// find the project by path
-		IProject project = findProject(path);		
-		if (project != null ) {
-			project.delete(IProject.FORCE
-					| IProject.NEVER_DELETE_PROJECT_CONTENT, monitor);
-		}
-		
-		if ( projectName == null ) {
-			File libraryPath = new File(path);
-			projectName = libraryPath.getName();
-		}
-		
-		// if a project of the same name also exists, delete it
-		// this is needed to take care of the following scenario:
-		// a project is opened but not closed for some reason
-		// now create a new library with the same name (same library folder)
-		// we need to delete the previous one
-		project = workspace.getRoot().getProject(projectName);
-		if (project.exists()) {
-			project.delete(IProject.FORCE
-					| IProject.NEVER_DELETE_PROJECT_CONTENT, monitor);
-		}
-		
-
-		IProjectDescription description = workspace
-				.newProjectDescription(projectName);
-		description.setNatureIds(MethodLibraryProjectNature.NATURE_IDS);
-		IPath projectPath = new Path(path);
-		if (!Platform.getLocation().isPrefixOf(projectPath)) {
-			description.setLocation(projectPath);
-		}
-		project.create(description, monitor);
-		return project;
-	}
-
-	/**
-	 * Creates a new method library project in the current workspace.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @return A <code>IProject</code> or <ocde>null</code> if the method
-	 *         library project cannot be created.
-	 * @throws CoreException
-	 *             if an error occurs while performing the operation.
-	 */
-	public static IProject createProject(String path, IProgressMonitor monitor)
-			throws CoreException {
-//		IProject project = findProject(path);
-//		if (project != null) {
-//			project.delete(IProject.FORCE
-//					| IProject.NEVER_DELETE_PROJECT_CONTENT, monitor);
-//		}
-//		File libraryPath = new File(path);
-//		String projectPath = libraryPath.getAbsolutePath();
-//		String projectName = libraryPath.getName();
-//		return createProject(projectPath, projectName, monitor);
-		
-		return createProject(path, null, monitor);
-	}
-
-	/**
-	 * Verifies that a workspace project is a method library project.
-	 * 
-	 * @param project
-	 *            A workspace project.
-	 * @return <code>true</code> if the given workspace project is a method
-	 *         library project, <code>false</clode> otherwise.
-	 */
-	public static boolean isMethodLibraryProject(IProject project) {
-		if (project != null) {
-			boolean closeProjectOnExit = false;
-			try {
-				if (!project.isOpen()) {
-					project.open(IResource.BACKGROUND_REFRESH,
-							new NullProgressMonitor());
-					closeProjectOnExit = true;
-				}
-				IProjectDescription description = project.getDescription();
-				if (description != null) {
-					String[] natureIds = description.getNatureIds();
-					if (Arrays.asList(natureIds).contains(
-							MethodLibraryProjectNature.NATURE_ID)) {
-						return true;
-					}
-				}
-			} catch (CoreException e) {
-			} finally {
-				if (closeProjectOnExit) {
-					try {
-						project.close(new NullProgressMonitor());
-					} catch (CoreException e) {
-					}
-				}
-			}
-
-		}
-		return false;
-	}
-
-	/**
-	 * Locates a method library project in the current workspace.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library.
-	 * @return A <code>IProject</code> or <ocde>null</code> if the method
-	 *         library project cannot be found.
-	 */
-	public static IProject findProject(String path) {
-		if (path == null) {
-			return null;
-		}
-		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject[] projects = workspace.getRoot().getProjects();
-		try {
-			for (int i = 0; i < projects.length; i++) {
-				IProject project = projects[i];
-				if (new File(path).compareTo(project.getLocation().toFile()) == 0
-						&& isMethodLibraryProject(project)) {
-					return project;
-				}
-				if (new File(path).compareTo(project.getLocation().toFile()) == 0) {
-					return project;
-				}
-			}
-		} catch (Exception e) {
-			LibraryPlugin.getDefault().getLogger().logError(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Locates a method library project in the current workspace.
-	 * 
-	 * @param library
-	 *            A method library.
-	 * @return A <code>IProject</code> or <ocde>null</code> if the method
-	 *         library project cannot be found.
-	 */
-	public static IProject findProject(MethodLibrary library) {
-		return findProject(getLibraryPath(library));
-	}
-
-	/**
-	 * Opens an existing method library project in the current workspace.
-	 * <p>
-	 * If the method library project cannot be located, create a new one.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @throws IOException
-	 *             if an I/O error occurs while performing the operation.
-	 * @return A <code>IProject</code>.
-	 * @throws CoreException
-	 *             if an error occurs while performing the operation.
-	 */
-	public static IProject openProject(String path, IProgressMonitor monitor) 
-			throws CoreException {
-		return openProject(path, null,  monitor);
-	}
-
-	/**
-	 * Opens an existing method library project in the current workspace.
-	 * <p>
-	 * If the method library project cannot be located, create a new one.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @throws IOException
-	 *             if an I/O error occurs while performing the operation.
-	 * @return A <code>IProject</code>.
-	 * @throws CoreException
-	 *             if an error occurs while performing the operation.
-	 */
-	public static IProject openProject(String path, String projectName, IProgressMonitor monitor)
-			throws CoreException {
-		IPath projectPath = new Path(path + File.separator
-				+ IProjectDescription.DESCRIPTION_FILE_NAME);
-
-		IProjectDescription description;
-		try {
-			description = ResourcesPlugin.getWorkspace()
-					.loadProjectDescription(projectPath);
-		} catch (CoreException exception) {
-			description = null;
-		}
-
-		IProject project = null;
-
-		if (description == null) {
-			// .project file is missing, create a new method library
-			// project.
-			project = MethodLibraryProject.createProject(path, projectName, monitor);
-		} else {
-			// .project file exists, retrieve the project from the
-			// workspace.
-			if ( projectName != null ) {
-				description.setName(projectName);
-			}
-			
-			project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-					description.getName());
-			if (!project.exists()) {
-				// The project does not exist in the workspace. Create a new
-				// method library project using the project name from the
-				// .project file.
-				project = MethodLibraryProject.createProject(path, project
-						.getName(), monitor);
-			} else {
-				// The project does exist in the workspace.
-				// Verify that the location matches. If not, create a new method
-				// library project.
-				if (new File(path).compareTo(project.getLocation().toFile()) != 0) {
-					project = MethodLibraryProject.createProject(path, monitor);
-				}
-			}
-		}
-
-		if (!project.isOpen()) {
-			project.open(IResource.BACKGROUND_REFRESH, monitor);
-		}
-
-		if (description == null) {
-			description = project.getDescription();
-		}
-
-		// Make sure the project has the MethodLibraryProjectNature.
-		String[] natureIds = description.getNatureIds();
-		if (!Arrays.asList(natureIds).contains(
-				MethodLibraryProjectNature.NATURE_ID)) {
-			description.setNatureIds(MethodLibraryProjectNature.NATURE_IDS);
-			project.setDescription(description, IProject.FORCE
-					| IProject.KEEP_HISTORY, monitor);
-		}
-
-		return project;
-	}
-
-	/**
-	 * Closes a method library project in the workspace.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @throws CoreException
-	 *             if an error occurs while performing the operation.
-	 */
-	public static void closeProject(String path, IProgressMonitor monitor)
-			throws CoreException {
-		IProject project = findProject(path);
-		// check if workspace is modifiable
-		if (project != null && !project.getWorkspace().isTreeLocked() && project.isOpen()) {
-			project.close(monitor);
-		}
-	}
-
-	/**
-	 * Closes a method library project in the workspace.
-	 * 
-	 * @param library
-	 *            A method library.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @throws CoreException
-	 *             if an error occurs while performing the operation.
-	 */
-	public static void closeProject(MethodLibrary library,
-			IProgressMonitor monitor) throws CoreException {
-		closeProject(getLibraryPath(library), monitor);
-	}
-
-	/**
-	 * Deletes a method library project from the current workspace.
-	 * 
-	 * @param path
-	 *            An absolute path to a method library.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @return <code>true</code> if the method library project is successfully
-	 *         deleted, <code>false</code> otherwise.
-	 * @throws CoreException
-	 *             if an error occurs while performing the operation.
-	 */
-	public static boolean deleteProject(String path, IProgressMonitor monitor) {
-		IProject project = findProject(path);
-		if (project != null) {
-			try {
-				if (monitor == null) {
-					monitor = new NullProgressMonitor();
-				}
-				project.delete(IProject.FORCE
-						| IProject.NEVER_DELETE_PROJECT_CONTENT, monitor);
-			} catch (CoreException e) {
-				LibraryPlugin.getDefault().getLogger().logError(e);
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Deletes a method library project from the current workspace.
-	 * 
-	 * @param library
-	 *            A method library.
-	 * @param monitor
-	 *            A progress monitor.
-	 * @return <code>true</code> if the method library project is successfully
-	 *         deleted, <code>false</code> otherwise.
-	 */
-	public static boolean deleteProject(MethodLibrary library,
-			IProgressMonitor monitor) {
-		return deleteProject(getLibraryPath(library), monitor);
-	}
-
-	/**
-	 * Returns the absolute path to a method library.
-	 * 
-	 * @param library
-	 * @return An absolute path to a method library.
-	 */
-	private static String getLibraryPath(MethodLibrary library) {
-		return new File(library.eResource().getURI().toFileString())
-				.getParent();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/MethodLibraryProjectNature.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/MethodLibraryProjectNature.java
deleted file mode 100644
index 3f3c3c9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/MethodLibraryProjectNature.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.project;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A Method Library Project nature.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodLibraryProjectNature implements IProjectNature {
-
-	/**
-	 * The nature ID for a Method Library Project.
-	 */
-	public static final String NATURE_ID = MethodLibraryProjectNature.class
-			.getName();
-
-	/**
-	 * An array of Method Library Project nature IDs.
-	 */
-	public static String[] NATURE_IDS = { NATURE_ID };
-
-	private IProject project;
-
-	/**
-	 * @see org.eclipse.core.resources.IProjectNature#configure()
-	 */
-	public void configure() throws CoreException {
-	}
-
-	/**
-	 * @see org.eclipse.core.resources.IProjectNature#deconfigure()
-	 */
-	public void deconfigure() throws CoreException {
-	}
-
-	/**
-	 * @see org.eclipse.core.resources.IProjectNature#getProject()
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * @see org.eclipse.core.resources.IProjectNature#setProject(IProject)
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/package.html
deleted file mode 100644
index 3318b4d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/project/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides management of method library projects in a workspace.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/ElementFile.java.txt b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/ElementFile.java.txt
deleted file mode 100644
index fa8ec59..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/ElementFile.java.txt
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.services;
-
-/**
- * 
- * This class is depricated. use FileNameGenerator instead
- *
- */
-public class ElementFile implements Comparable {
-	private String guid;
-	private String fileName;
-	private static int indexCounter = 0;
-	
-	public ElementFile(String guid, String fileName) {
-		this.guid = guid;
-		this.fileName = fileName;
-		indexCounter = 0;
-	}
-	
-	public boolean equals(Object e)	{
-		ElementFile eFile = (ElementFile) e;
-		
-		if (!(getGuid().equals(eFile.getGuid())) 
-				&& getFileName().equals(eFile.getFileName())) {			
-			return appendIndex();
-		}
-		indexCounter++;
-		return getFileName().equals(eFile.getFileName());
-	}
-	
-	public int hashCode() {
-		return fileName.hashCode();
-	}
-	
-	public int compareTo(Object e) {		
-		if (e instanceof ElementFile)
-		{
-			ElementFile aFile = (ElementFile) e;
-			return fileName.compareTo(aFile.getFileName());
-		}
-		return 1;
-	}
-	
-	public void setFileName(String fName) {
-		fileName = fName;
-	}
-	
-	public String getFileName()	{
-		return fileName;
-	}
-	
-	public String getGuid()	{
-		return guid;
-	}
-	
-	private boolean appendIndex() {
-		StringBuffer tString = new StringBuffer(getFileName());
-		int begindIdx = getFileName().lastIndexOf("-");
-		int endIdx = getFileName().lastIndexOf(".htm");
-		if (begindIdx > -1 && endIdx > -1) {
-			if (indexCounter > 0) {
-				tString.replace(begindIdx+1, endIdx, Integer.toString(++indexCounter));	
-				setFileName(tString.toString());
-				//indexCounter = 0;
-				return false;
-			}
-			return true;
-		} else if (endIdx > -1) {			
-			tString.insert(endIdx, "-" + Integer.toString(++indexCounter));
-			setFileName(tString.toString());
-			//indexCounter = 0;
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/LibraryModificationHelper.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/LibraryModificationHelper.java
deleted file mode 100644
index 97bfde9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/LibraryModificationHelper.java
+++ /dev/null
@@ -1,176 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.services;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.command.ActionManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.services.ILibraryPersister;
-import org.eclipse.epf.services.ILibraryPersister.FailSafeMethodLibraryPersister;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * This helper is using an instance of IActionManager to keep track of changes.
- * Clien must {@link #dispose() <em>dispose</em>} this helper after use.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class LibraryModificationHelper {
-
-	ActionManager actionMgr = null;
-
-	/**
-	 * constructor
-	 *
-	 */
-	public LibraryModificationHelper() {
-	}
-
-	/**
-	 * get the action manager
-	 * @return ActionManager
-	 */
-	public ActionManager getActionManager() {
-		if (actionMgr != null) {
-			return actionMgr;
-		}
-
-		actionMgr = new ActionManager() {
-			public boolean doAction(int actionType, EObject object,
-					EStructuralFeature feature, Object value, int index) {
-				if (canUpdate(object)) {
-					return super.doAction(actionType, object, feature, value,
-							index);
-				}
-				return false;
-			}
-
-			protected void save(Resource resource) {
-			}
-		};
-
-		return actionMgr;
-	}
-
-	/**
-	 * dispose
-	 *
-	 */
-	public void dispose() {
-		if (actionMgr != null) {
-			actionMgr.dispose();
-			actionMgr = null;
-		}
-	}
-
-	/**
-	 * check if update is allowed
-	 * @param object
-	 * @return boolean
-	 */
-	public static boolean canUpdate(EObject object) {
-		IStatus status = TngUtil.checkEdit(object, null);
-		if (status.isOK()) {
-			return true;
-		} else {
-			String msg = NLS.bind(LibraryResources.LibraryModificationHelper_cannotUpdate, TngUtil.getTypeText(object), object
-			.eGet(UmaPackage.eINSTANCE.getNamedElement_Name()));
-			LibraryPlugin.getDefault().getMsgCallback().displayWarning(LibraryPlugin.getDefault(),
-					LibraryResources.warningDlg_title
-					, msg, TngUtil.getMessage(status));
-
-			return false;
-		}
-	}
-
-	/**
-	 * check if save is needed
-	 * @return boolean
-	 */
-	public boolean isSaveNeeded() {
-		return (actionMgr != null) && actionMgr.isSaveNeeded();
-	}
-
-	/**
-	 * do save
-	 *
-	 */
-	public void save() {
-		if (actionMgr == null) {
-			return;
-		}
-
-		try {			
-			Collection modifiedResources = actionMgr.getModifiedResources();
-			FailSafeMethodLibraryPersister persister = getPersister(modifiedResources);
-			for (Iterator iter = modifiedResources.iterator(); iter.hasNext();) {
-				Resource resource = (Resource) iter.next();
-				try {
-					persister.save(resource);
-				} catch (Exception e) {
-					String msg = NLS.bind(LibraryResources.errorDlg_saveError
-							, resource.getURI().isFile() ? resource.getURI().toFileString() : resource.getURI().toString()); 
-					LibraryPlugin.getDefault().getMsgCallback().displayError(LibraryPlugin.getDefault(),
-							LibraryResources.errorDlg_title
-							, msg, e);
-				}
-			}
-
-			try {
-				persister.commit();
-				actionMgr.saveIsDone();
-			} catch (Exception e) {
-				try {
-					persister.rollback();
-				} catch (Throwable th) {
-					try {
-						// if rollback failed, reload the library
-						LibraryService.getInstance()
-								.reopenCurrentMethodLibrary();
-					} catch (RuntimeException e1) {
-						e1.printStackTrace();
-					}
-				}
-				e.printStackTrace();
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private FailSafeMethodLibraryPersister getPersister(Collection resources) {
-		for (Iterator iter = resources.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			ResourceSet resourceSet = resource.getResourceSet();
-			if(resourceSet instanceof ILibraryResourceSet) {
-				ILibraryPersister persister = ((ILibraryResourceSet)resourceSet).getPersister();
-				if(persister != null) {
-					return persister.getFailSafePersister();
-				}
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/NameCache.java.txt b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/NameCache.java.txt
deleted file mode 100644
index ecf6a21..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/NameCache.java.txt
+++ /dev/null
@@ -1,207 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.services;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.layout.Bookmark;
-import org.eclipse.epf.library.layout.LinkInfo;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * 
- * This class is depricated. use FileNameGenerator instead
- *
- */
-public class NameCache {
-	
-	private static NameCache instance = new NameCache();
-	private Map<String, String> aMap = new HashMap<String, String>();
-	private Set<ElementFile> aSet = new HashSet<ElementFile>();
-	private Map<String, String> gMap = new HashMap<String, String>();
-
-	/**
-	 * Returns the shared instance.
-	 * @deplicated
-	 */
-	private static NameCache getInstance() {
-		return instance;
-	}
-
-	/**
-	 * Private constructor to prevent this class from being instantiated.
-	 */
-	private NameCache() {
-	}
-	
-	public void clear() {
-		aMap.clear();
-		aSet.clear();
-		gMap.clear();
-	}
-	
-	/**
-	 * get the file name with the given prefix and extension
-	 * @param element MethodElement
-	 * @param namePrefix String prefix for the name
-	 * @param nameSuffix String suffix for the name
-	 * @param ext String file extension, for example, ".html"
-	 * @return String
-	 * @deplicated
-	 */	 
-	private String getFileName(MethodElement element, String namePrefix,
-			String nameSuffix, String ext) {
-		
-		String existingElementName = null;
-		StringBuffer buffer = new StringBuffer();
-		if (namePrefix != null) {
-			buffer.append(namePrefix);
-		}
-		
-		if (element.getName() == "")
-			return "0" + ext; //$NON-NLS-1$
-			
-		if (!gMap.isEmpty()) {
-			existingElementName =  (String) gMap.get(element.getGuid());
-		}
-		// Browsing: Browsing CP with special chars failed with
-		// blank pages and Script Error need to make a valid file name
-		buffer.append((existingElementName != null) ? existingElementName : StrUtil.removeSpecialCharacters(element.getName()));
-		if (nameSuffix != null) {
-			buffer.append(nameSuffix);
-		}
-
-		if (ext != null) {
-			if (ext.indexOf(".") < 0) //$NON-NLS-1$
-			{
-				ext = "." + ext; //$NON-NLS-1$
-			}
-			buffer.append(ext);
-		}
-		
-		if (existingElementName == null) {
-			
-			ElementFile a = new ElementFile(element.getGuid(), buffer.toString());
-			
-			if (a != null && aSet.add(a)) {
-				int extDot = a.getFileName().lastIndexOf(".");
-				aMap.put((extDot < 0) ? a.getFileName() : a.getFileName().substring(0, extDot), element.getGuid());			 
-				gMap.put(element.getGuid(), (extDot < 0) ? a.getFileName() : a.getFileName().substring(0, extDot));
-			}
-		
-			return a.getFileName();
-		}
-		return buffer.toString();
-	}
-	
-	
-	private String getFileName(String guid) {
-	
-		if (guid != null && !gMap.isEmpty()) {
-			return (String) gMap.get(guid);
-		}
-		return null; 
-	}
-
-	/**
-	 * get the guid from the file name, assuming the file name is generated from an element, 
-	 * return null if not found.
-	 * @param fileName String
-	 * @return String
-	 */
-	public String getGuidFromFileName(String fileName) {
-		if (fileName == null || (fileName.indexOf("resources/") > -1 && fileName.indexOf(".htm") < 0)) {
-			return null;
-		}			
-		
-		String guid = null;
-		
-		int idx = fileName.lastIndexOf("/");
-		int lastIdx = fileName.lastIndexOf(".");
-
-		if (idx > -1) {
-			guid = (String) aMap.get((lastIdx > -1 && idx < lastIdx) ? 
-					fileName.substring(idx+1, lastIdx) : (idx < fileName.length()) ? 
-							fileName.substring(idx+1) : null);
-		} else {
-			guid = (String) aMap.get((lastIdx > -1) ? fileName.substring(0, lastIdx) : fileName);
-		}
-		if (guid == null)	return null;		
-	
-		// turn off error reporting and see if guid exists in library
-		boolean oldReport_Error = MultiFileResourceSetImpl.REPORT_ERROR;
-		MultiFileResourceSetImpl.REPORT_ERROR = false;
-/*		MethodElement e = LibraryService.getInstance().getCurrentLibraryManager()
-				.getMethodElement(guid);*/
-		//part of temp solution due to not having lib mgr during migration
-		MethodElement e = LinkInfo.getMethodElement(guid);
-		MultiFileResourceSetImpl.REPORT_ERROR = oldReport_Error;
-		if (e == null)
-			return null;
-
-		return guid;
-	}
-	
-	/**
-	 * get the file name with the given prefix and extension
-	 * @param view Bookmark
-	 * @param namePrefix String prefix for the name
-	 * @param nameSuffix String suffix for the name
-	 * @param ext String file extension, for example, ".html"
-	 * @return String
-	 * @deplicated this method is not needed 
-	 */	 
-	private String getFileName(Bookmark view, String namePrefix,
-			String nameSuffix, String ext) {
-		
-		String existingElementName = null;
-		StringBuffer buffer = new StringBuffer();
-		if (namePrefix != null) {
-			buffer.append(namePrefix);
-		}
-		
-		if (view.getPresentationName() == "")
-			return "0" + ext; //$NON-NLS-1$
-		
-		if (!gMap.isEmpty()) {
-			existingElementName =  (String) gMap.get(view.getUniqueId());
-		}
-		// Browsing: Browsing CP with special chars failed with
-		// blank pages and Script Error need to make a valid file name
-		buffer.append((existingElementName != null) ? existingElementName : StrUtil.removeSpecialCharacters(view.getPresentationName()));
-		if (nameSuffix != null) {
-			buffer.append(nameSuffix);
-		}
-
-		if (ext != null) {
-			if (ext.indexOf(".") < 0) //$NON-NLS-1$
-			{
-				ext = "." + ext; //$NON-NLS-1$
-			}
-			buffer.append(ext);
-		}
-
-		ElementFile a = new ElementFile(view.getUniqueId(), buffer.toString());
-		
-		if (a != null && aSet.add(a)) {
-			int extDot = a.getFileName().lastIndexOf(".");
-			aMap.put((extDot < 0) ? a.getFileName() : a.getFileName().substring(0, extDot), view.getUniqueId());			 
-			gMap.put(view.getUniqueId(), (extDot < 0) ? a.getFileName() : a.getFileName().substring(0, extDot));
-		}
-
-		return a.getFileName(); 
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/SafeUpdateController.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/SafeUpdateController.java
deleted file mode 100644
index 5b95044..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/SafeUpdateController.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.services;
-
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * a utility class to allow UI update with the valid UI thread.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public abstract class SafeUpdateController {
-
-	/**
-	 * sync execute the runnable with the valid UI thread.
-	 * @param runnable Runnable
-	 */
-	public static void syncExec(Runnable runnable) {
-		try {
-			// since this will cause UI update, which must be executed in the UI
-			// thread
-			// otherwise, will cause Invalid Thread Access exception
-			Display display = Display.getCurrent();
-			if (display == null) {
-				display = Display.getDefault();
-			}
-			if (display == null) {
-				runnable.run();
-			} else {
-				display.syncExec(runnable);
-			}
-		} catch (Exception ex) {
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-		}
-	}
-
-	/**
-	 * async execute the runnable with the valid UI thread.
-	 * @param runnable Runnable
-	 */
-	public static void asyncExec(Runnable runnable) {
-		try {
-			// since this will cause UI update, which must be executed in the UI
-			// thread
-			// otherwise, will cause Invalid Thread Access exception
-			Display display = Display.getCurrent();
-			if (display == null) {
-				display = Display.getDefault();
-			}
-			if (display == null) {
-				runnable.run();
-			} else {
-				display.asyncExec(runnable);
-			}
-		} catch (Exception ex) {
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/package.html
deleted file mode 100644
index 5594b67..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/services/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for the library service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ContentResourceScanner.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ContentResourceScanner.java
deleted file mode 100644
index 0e22911..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ContentResourceScanner.java
+++ /dev/null
@@ -1,316 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.layout.IContentValidator;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.UmaPackage;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/**
- * utility class to scan content and copy resources to the target location for browsing and publishing
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ContentResourceScanner {
-
-	protected static final Pattern p_image_ref = Pattern
-			.compile(
-					"(<(img|iframe).*?src\\s*=\\s*\")(.*?)(\")", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	private File sourceRootPath;
-
-	private File targetRootPath;
-
-	private String rootContentPath;
-	
-	private IContentValidator validator;
-
-	private List processedItems = new ArrayList();
-
-	/**
-	 * construct the object with the root path of the source content
-	 * @param sourceRootPath File
-	 */
-	public ContentResourceScanner(File sourceRootPath, File targetRootPath, String rootContentPath) {
-		this(sourceRootPath, targetRootPath, rootContentPath, null);
-	}
-
-	/**
-	 * construct the object instance with the root path of the source content and a content validator
-	 * 
-	 * @param sourceRootPath File
-	 * @param validator IContentValidator
-	 */
-	public ContentResourceScanner(File sourceRootPath, File targetRootPath, String rootContentPath, 
-			IContentValidator validator) {
-		this.sourceRootPath = sourceRootPath;
-		this.targetRootPath = targetRootPath;
-		this.rootContentPath = rootContentPath;
-		this.validator = validator;
-	}
-
-	/**
-	 * set content validator
-	 * @param validator IContentValidator
-	 */
-	public void setValidator(IContentValidator validator) {
-		this.validator = validator;
-	}
-
-	/**
-	 * get the source root path
-	 * @return File
-	 */
-	public File getSourceRootPath() {
-		return this.sourceRootPath;
-	}
-	
-	/**
-	 * get the target root path
-	 * @return File
-	 */
-	public File getTargetRootPath() {
-		return this.targetRootPath;
-	}
-	
-	/**
-	 * set the target root path
-	 * @param targetRootPath File
-	 */
-	public void setTargetRootPath(File targetRootPath) {
-		this.targetRootPath = targetRootPath;
-	}
-
-	/**
-	 * resolve the images in the text. copy the image to destination if needed
-	 * This is used for copying resources from a library to another destination
-	 * 
-	 * @param content
-	 * @param contentPath
-	 *            the content path of the source
-	 */
-	public void resolveResources(String content, String contentPath) {
-		resolveResources(null, content, contentPath);
-	}
-
-	/**
-	 * resolve the images in the text. copy the image to destination if needed
-	 * This is used for copying resources from a library to another destination
-	 * 
-	 * @param owner MethodElement
-	 * @param content String
-	 * @param contentPath String
-	 *            the content path of the source
-	 */
-	public void resolveResources(MethodElement owner, String content,
-			String contentPath) {
-		processedItems.clear();
-		ResourceHelper.resolveResources(owner, null, content, contentPath,
-				this.sourceRootPath, this.targetRootPath, this.rootContentPath, processedItems,
-				validator);
-	}
-
-	/**
-	 * resolve the images in the text. copy the image to destination if needed
-	 * This is used for moving resources within a library ie, when
-	 * sourceRootPath.equals(targetRootPath)
-	 * 
-	 * @param source
-	 * @param contentPath
-	 *            the content path of the source
-	 * @return String
-	 */
-	public String resolveResourcesPlugin(String content, String contentPath,
-			String oldContentPath) {
-		StringBuffer sb = new StringBuffer();
-		try {
-			// process images
-			Matcher m = ResourceHelper.p_image_ref.matcher(content);
-			while (m.find()) {
-				String url = m.group(3);
-				url = processResourceUrlPlugin(url, contentPath, oldContentPath);
-				m.appendReplacement(sb, m.group(1) + url + m.group(4));
-			}
-			m.appendTail(sb);
-
-			content = sb.toString();
-			sb = new StringBuffer();
-
-			// process attachments
-			m = ResourceHelper.p_link_ref_gen.matcher(content);
-			while (m.find()) {
-				StringBuffer sbLink = new StringBuffer();
-				// String tag = m.group(1);
-				String urltext = " " + m.group(2) + " "; //$NON-NLS-1$ //$NON-NLS-2$
-				if (ResourceHelper.getGuidFromUrl(urltext) == null) {
-					Matcher m2 = ResourceHelper.p_link_href_picker
-							.matcher(urltext);
-					if (m2.find()) {
-						String url = m2.group(1).trim().replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-						url = processResourceUrlPlugin(url, contentPath,
-								oldContentPath);
-						m2.appendReplacement(sbLink, urltext.substring(m2
-								.start(), m2.start(1))
-								+ url + urltext.substring(m2.end(1), m2.end()));
-						m2.appendTail(sbLink);
-						m.appendReplacement(sb, content.substring(m.start(), m
-								.start(2))
-								+ sbLink.toString()
-								+ content.substring(m.end(2), m.end()));
-					}
-				}
-
-			}
-			m.appendTail(sb);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Processes a resource url for moving within a library
-	 * 
-	 * @param url
-	 * @param contentPath
-	 *            new plugin path
-	 * @param oldContentPath
-	 *            old plugin path
-	 * @return String
-	 */
-	private String processResourceUrlPlugin(String url, String contentPath,
-			String oldContentPath) {
-		String imageFile = ResourceHelper.getFilePathFromUrl(url,
-				oldContentPath);
-		if (imageFile == null) {
-			return url;
-		}
-		String newUrl = null;
-		File source;
-		File dest;
-		// targetRootPath is set to the target plugin directory
-		source = new File(this.sourceRootPath.getParentFile(), imageFile);
-		if (imageFile.indexOf(File.separator) != -1) {
-			String oldPlugin = imageFile.substring(0, imageFile
-					.indexOf(File.separator));
-			String newPlugin = this.targetRootPath.getName();
-			newUrl = url.replaceFirst(oldPlugin, newPlugin);
-			imageFile = imageFile.substring(imageFile.indexOf(File.separator));
-		}
-		dest = new File(this.targetRootPath, imageFile);
-
-		FileUtil.copyFile(source, dest);
-
-		return newUrl;
-	}
-
-	
-	/**
-	 * copy all resources referenced by the the element and all its contained elements, recursively
-	 * @param element EObject
-	 */
-	public void copyResources(EObject element) {
-		
-		if ( element == null ) {
-			return;
-		}
-		
-		if ( element instanceof DescribableElement ) {
-			DescribableElement de = (DescribableElement)element;
-			String elementPath = ResourceHelper.getElementPath(de);
-			
-			//1. icons
-			java.net.URI icon = de.getShapeicon();
-			if ( icon != null ) {
-				String path = icon.getPath();
-				FileUtil.copyFile(
-						new File(getSourceRootPath(), path), 
-						new File(getTargetRootPath(), path));
-			}
-			
-			icon = de.getNodeicon();
-			if ( icon != null ) {
-				String path = icon.getPath();
-				FileUtil.copyFile(
-						new File(getSourceRootPath(), path), 
-						new File(getTargetRootPath(), path));
-			}
-			
-			// 2. attachments
-		
-			
-			// 3. contents
-			ContentDescription desc = de.getPresentation();
-			if ( desc.eContainer() != null ) {
-				List features = LibraryUtil.getStructuralFeatures(desc);
-//				List properties = desc.getInstanceProperties();
-								
-				// get all string type attributes
-				for (int i = 0; i < features.size(); i++) {
-					EStructuralFeature feature = (EStructuralFeature) features
-							.get(i);
-					if ( !(feature instanceof EAttribute) ) {
-						continue;
-					}
-					
-					Object value = desc.eGet(feature);
-					if ( value == null ) {
-						continue;
-					}
-					
-					
-					if (feature == UmaPackage.eINSTANCE.getContentDescription_Sections() ) {
-						List sections = (List)value;
-						for (Iterator it = sections.iterator(); it.hasNext(); ) {
-							String text = ((Section)it.next()).getSectionDescription();
-							resolveResources(de, text, elementPath);
-						}
-					}  else if (feature == UmaPackage.eINSTANCE.getGuidanceDescription_Attachments() ) {
-						String urls = value.toString().trim();
-						if (urls.length() != 0 ) {
-							StringTokenizer st = new StringTokenizer(urls, "|"); // this is hardcoded somehow //$NON-NLS-1$
-							while (st.hasMoreTokens() ) {
-								String url = st.nextToken();
-								FileUtil.copyFile(
-										new File(getSourceRootPath(), elementPath + url), 
-										new File(getTargetRootPath(), elementPath + url));
-
-							}
-						}
-					} else if ( value instanceof String ) {
-						resolveResources(de, value.toString(), elementPath);
-					} else {
-						// do nothing
-					}
-				}
-			}
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ConvertActivityType.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ConvertActivityType.java
deleted file mode 100644
index 01024fa..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ConvertActivityType.java
+++ /dev/null
@@ -1,362 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.uma.UmaPackage;
-
-
-/**
- * class to convert activity types
- * 
- * @author Jeff Hardy
- * @author Shilpa Toraskar
- * @since 1.0
- *
- */
-public class ConvertActivityType {
-
-//	private static Activity oldActivity = null;
-//	private static Activity newActivity = null;
-//	
-//	// original activity's container
-//	private static ProcessPackage oldActivityContainer = null;
-//	
-//	// the original activity's breakdown list
-//	private static List oldActivityBreakdown = null;
-//	
-//	// index of the original activity in it's superActivity's breakdown list
-//	private static int oldActivityBreakdownIndex = -1;
-//	
-//	// original Activity's parent activity
-//	private static Activity superAct = null;
-//	
-//	// parent activity's breakdown list
-//	private static EList superActbreakdownList = null;
-//	
-//	// original Activity's variabilityType
-//	private static VariabilityType oldActVarType = null;
-//	
-//	// original Activity's variabilityElement
-//	private static VariabilityElement oldActVarElement = null;
-//	
-//	// original Activity's immeditateVarieties
-//	private static List oldActImmediateVarietiesList = null;
-
-	public static int[] compatibleActivities = { UmaPackage.ACTIVITY,
-			UmaPackage.ITERATION,
-			UmaPackage.PHASE,
-			UmaPackage.CAPABILITY_PATTERN,
-			UmaPackage.DELIVERY_PROCESS,
-	};
-
-	public static List compatibleActivitiesList = new ArrayList();
-	static {
-		for (int i = 0; i < compatibleActivities.length; i++)
-			compatibleActivitiesList.add(new Integer(compatibleActivities[i]));
-	}
-
-	// This method is buggy and is replaced with TypeConverter.convertActivity()
-	//
-//	public static Activity convertActivity(Activity oldActivity, int newType,
-//			DeleteMethodElementCommand command) {
-//
-//		
-//		ConvertActivityType.oldActivity = oldActivity;
-//		
-//		// activity is already this type
-//		if (newType == oldActivity.eClass().getClassifierID()) {
-//			return null;
-//		}
-//		
-//		// newType is not valid
-//		if (!compatibleActivitiesList.contains(new Integer(newType))) {
-//			return null;
-//		}
-//		
-//		Activity newActivity = doConvert(newType, command);
-//
-//		return newActivity;
-//	}
-//
-//	private static Activity doConvert(int newType, DeleteMethodElementCommand command) {
-//		
-//		try {
-//			File oldActivityPathFile = new File(LibraryService.getInstance()
-//					.getCurrentMethodLibraryPath(), MethodLibraryPersister
-//					.getElementPath(oldActivity));
-//
-//			// create new activity
-//			newActivity = createNewActivity(newType);
-//
-//			// TODO: store oldActivity's features here, and don't set them until
-//			// after oldactivity is deleted
-//			
-//			// store oldActivity's breakdown list
-//			oldActivityBreakdown = new ArrayList();
-//			for (Iterator iter = oldActivity.getBreakdownElements().iterator();iter.hasNext();) {
-//				oldActivityBreakdown.add(iter.next());
-//			}
-//			oldActivityBreakdownIndex = getIndexInBreakdown(oldActivity);
-//			
-//			// copy all data from oldActivity to newActivity
-//			Iterator iter = oldActivity.eClass().getEAllStructuralFeatures()
-//					.iterator();
-//			while (iter.hasNext()) {
-//				EStructuralFeature feature = (EStructuralFeature) iter.next();
-//				Object o = oldActivity.eGet(feature);
-//				if (feature.getFeatureID() != UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION
-//						&& feature.getFeatureID() != UmaPackage.METHOD_ELEMENT__GUID
-//						&& feature.getFeatureID() != UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS
-//						&& feature.getFeatureID() != UmaPackage.ACTIVITY__SUPER_ACTIVITIES 
-//						&& feature.getFeatureID() != UmaPackage.PROCESS__INCLUDES_PATTERNS
-//						&& feature.getFeatureID() != UmaPackage.PROCESS__VALID_CONTEXT
-//						&& feature.getFeatureID() != UmaPackage.PROCESS__DEFAULT_CONTEXT
-//						&& feature.getFeatureID() != UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS
-//						&& feature.getFeatureID() != UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIALS
-//						) {
-//					newActivity.eSet(feature, o);
-//				}
-//			}
-//
-//			// store Guid here
-//			String oldActivityGuid = oldActivity.getGuid();
-//
-//			// store old activity's eContainer
-//			oldActivityContainer = (ProcessPackage) oldActivity
-//					.eContainer();
-//
-//			// set container
-//			oldActivityContainer.getProcessElements().remove(oldActivity);
-//			oldActivityContainer.getProcessElements().add(newActivity);
-//
-//			// create presentation
-//			ContentDescription newContentDesc = ContentDescriptionFactory
-//					.createContentDescription(newActivity);
-//			newActivity.setPresentation(newContentDesc);
-//
-//			File newActivityPathFile = new File(LibraryService.getInstance()
-//					.getCurrentMethodLibraryPath(), MethodLibraryPersister
-//					.getElementPath(newActivity));
-//			ContentResourceScanner scanner = new ContentResourceScanner(
-//					oldActivityPathFile);
-//			scanner.setTargetRootPath(newActivityPathFile);
-//
-//			// copy all presentation data from oldActivity to newActivity
-//			ContentDescription oldContentDesc = oldActivity.getPresentation();
-//			iter = oldContentDesc.eClass().getEAllAttributes().iterator();
-//			while (iter.hasNext()) {
-//				EAttribute attrib = (EAttribute) iter.next();
-//				if (attrib.getFeatureID() != UmaPackage.PROCESS_DESCRIPTION__EXTERNAL_ID
-//						&& attrib.getFeatureID() != UmaPackage.PROCESS_DESCRIPTION__SCOPE
-//						&& attrib.getFeatureID() != UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES
-//						&& attrib.getFeatureID() != UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE
-//						&& attrib.getFeatureID() != UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS
-//						&& attrib.getFeatureID() != UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE
-//						&& attrib.getFeatureID() != UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL
-//						&& attrib.getFeatureID() != UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE
-//						&& attrib.getFeatureID() != UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT
-//						) {
-//					Object o = oldContentDesc.eGet(attrib);
-//					if (o instanceof String && ((String) o).trim().length() > 0) {
-//						// process links
-//						scanner.resolveResources(newActivity, (String) o, ""); //$NON-NLS-1$
-//						// scanner.resolveResources(newActivity, (String) o,
-//						// MethodLibraryPersister.getElementPath(newActivity));
-//						// //$NON-NLS-1$
-//					}
-//					newContentDesc.eSet(attrib, o);
-//				}
-//			}
-//			
-//			// make breakdown links
-//			List oldActBreakdownList = new ArrayList();
-//			oldActBreakdownList.addAll(oldActivity.getBreakdownElements());
-//			for (iter = oldActBreakdownList.iterator();iter.hasNext();) {
-//				BreakdownElement be = (BreakdownElement)iter.next();
-//				be.setSuperActivities(null);
-//			}
-//			
-//			oldActivity.getBreakdownElements().clear();
-//			newActivity.getBreakdownElements().addAll(oldActivityBreakdown);
-//			// move new activity to proper index in the parent act's breakdown list
-//			superAct = UmaUtil.getParentActivity(oldActivity);
-//			superActbreakdownList = (EList)superAct.getBreakdownElements();
-//			superActbreakdownList.add(oldActivityBreakdownIndex, newActivity);
-//			
-//			// handle variability
-//			oldActVarElement = oldActivity.getVariabilityBasedOnElement();
-//			oldActVarType = oldActivity.getVariabilityType();
-//			oldActImmediateVarietiesList = new ArrayList();
-//			oldActImmediateVarietiesList.addAll(AssociationHelper.getImmediateVarieties(oldActivity));
-//			
-//			if (oldActVarElement != null && oldActVarType != null) {
-//				newActivity.setVariabilityBasedOnElement(oldActVarElement);
-//				newActivity.setVariabilityType(oldActVarType);
-//			}
-//			
-//			for (iter = oldActImmediateVarietiesList.iterator();iter.hasNext();) {
-//				VariabilityElement ve = (VariabilityElement) iter.next();
-//				ve.setVariabilityBasedOnElement(newActivity);
-//			}
-//
-//			// create temp ProcessPackage and move oldActivity to it
-//			ProcessPackage tempParent = UmaFactory.eINSTANCE.createProcessPackage();
-//			tempParent.getProcessElements().add(oldActivity);
-//			tempParent.setName("temp PP for deletion"); //$NON-NLS-1$
-//
-//			// delete old Activity here - if fails, roll back by deleting new Activity
-//			command.execute();
-//
-//			if (!command.executed || command.failed) {
-//				// delete failed, or user selected cancel on the "delete
-//				// references" dialog
-//				// clean up new Activity
-//
-//				undo();
-//
-//				newActivity = null;
-//				newContentDesc = null;
-//				return null;
-//			}
-//
-//			// set new activity's GUID
-//			newActivity.setGuid(oldActivityGuid);
-//			
-//			// TODO: update editor contents 
-//
-//			// TODO: on rollback, library may be dirty because of the
-//			// container/contentdesc changes we've done
-//			// fix this by storing all the old activity's info, then only create
-//			// new activity after old one has
-//			// been deleted.
-//
-//			Set modifiedResourceSet = new HashSet();
-//			
-//			// save new activity and its presentation
-//			IFileBasedLibraryPersister.FailSafeMethodLibraryPersister persister = ContentDescriptionFactory
-//					.getMethodLibraryPersister().getFailSafePersister();
-//			try {
-//				if (newActivity.eResource() != null)
-//					modifiedResourceSet.add(newActivity.eResource());
-//				if (newActivity.getPresentation().eResource() != null)
-//					modifiedResourceSet.add(newActivity.getPresentation().eResource());
-//				if (oldActivityContainer.eResource() != null)
-//					modifiedResourceSet.add(oldActivityContainer.eResource());
-//				if (superAct.eResource() != null)
-//					modifiedResourceSet.add(superAct.eResource());
-//
-//				for (iter = modifiedResourceSet.iterator();iter.hasNext();) {
-//					Resource res = (Resource) iter.next();
-//					persister.save(res);
-//				}
-//				persister.commit();
-//
-//			} catch (Exception e) {
-//				persister.rollback();
-//				command.undo();
-//				
-//				undo();
-//				LibraryPlugin
-//						.getDefault()
-//						.getMsgDialog()
-//						.displayError(
-//								LibraryResources.convertActivityError_title,
-//								NLS.bind(LibraryResources.saveConvertedActivityError_msg, newActivity.getName()), 
-//								LibraryResources.error_reason,
-//								e);
-//				newActivity = null;
-//			}
-//		} catch (Exception ex) {
-//			ex.printStackTrace();
-//			command.undo();
-//			undo();
-//			LibraryPlugin
-//					.getDefault()
-//					.getMsgDialog()
-//					.displayError(
-//							LibraryResources.convertActivityError_title,
-//							NLS.bind(LibraryResources.convertActivityError_msg, newActivity.getName()), 
-//							LibraryResources.error_reason, 
-//							ex);
-//			newActivity = null;
-//		}
-//		return newActivity;
-//	}
-//
-//	private static Activity createNewActivity(int newType) {
-//		switch (newType) {
-//			case UmaPackage.ACTIVITY:
-//				return UmaFactory.eINSTANCE.createActivity();
-//			case UmaPackage.ITERATION:
-//				return UmaFactory.eINSTANCE.createIteration();
-//			case UmaPackage.PHASE:
-//				return UmaFactory.eINSTANCE.createPhase();
-//			default:
-//				return null;
-//		}
-//	}
-//	
-//	private static int getIndexInBreakdown(Activity act) {
-//		int index = -1;
-//		Activity superAct = UmaUtil.getParentActivity(act);
-//		if (superAct instanceof ProcessComponent) {
-//			// get process, find breakdown
-//			index = ((ProcessComponent)superAct).getProcess().getBreakdownElements().indexOf(act);
-//		}
-//		else {
-//			index = superAct.getBreakdownElements().indexOf(act);
-//		}
-//		return index;
-//	}
-//	
-//	private static void undo() {
-//		// undo moving of oldActivity to the fake PP
-//		if (oldActivityContainer != null) {
-//			oldActivityContainer.getProcessElements().remove(newActivity);
-//			if (!oldActivityContainer.getProcessElements().contains(oldActivity))
-//				oldActivityContainer.getProcessElements().add(oldActivity);
-//		}
-//		// undo the breakdown link changes
-//		if (newActivity != null) {
-//			newActivity.getBreakdownElements().clear();
-//		}
-//		if (oldActivityBreakdown != null && oldActivity != null) {
-////			oldActivity.getBreakdownElements().clear();
-//			oldActivity.getBreakdownElements().addAll(oldActivityBreakdown);
-//		}
-//		if (superActbreakdownList != null) {
-//			if (newActivity != null) {
-//				superActbreakdownList.remove(newActivity);
-//			}
-//			if (oldActivityBreakdownIndex != -1 && oldActivity != null &&
-//					!superActbreakdownList.contains(oldActivity))
-//				superActbreakdownList.add(oldActivityBreakdownIndex, oldActivity);
-//		}
-//		
-//		// variability
-//		if (oldActVarElement != null && oldActVarType != null) {
-//			oldActivity.setVariabilityBasedOnElement(oldActVarElement);
-//			oldActivity.setVariabilityType(oldActVarType);
-//		}
-//		
-//		if (oldActImmediateVarietiesList != null) {
-//			for (Iterator iter = oldActImmediateVarietiesList.iterator();iter.hasNext();) {
-//				VariabilityElement ve = (VariabilityElement) iter.next();
-//				ve.setVariabilityBasedOnElement(oldActivity);
-//			}
-//		}
-//
-//
-//	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/CopyAttachmentsToNewLocation.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/CopyAttachmentsToNewLocation.java
deleted file mode 100644
index b9d17cd..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/CopyAttachmentsToNewLocation.java
+++ /dev/null
@@ -1,358 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.edit.command.MethodElementAddCommand.BasicResourceManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.IContentValidator;
-import org.eclipse.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * utility class to copy attachmeents to another location
- * @author Jeff Hardy
- * @sicne 1.0
- *
- */
-public class CopyAttachmentsToNewLocation extends BasicResourceManager {
-
-	private Collection modifiedResourceSet;
-
-	private boolean debug;
-
-	private Map elementToOldPluginMap;
-
-	private MethodPlugin lastOldPlugin = null;
-
-	public CopyAttachmentsToNewLocation() {
-		debug = LibraryPlugin.getDefault().isDebugging();
-	}
-
-	/**
-	 * Copy attachments within a library, from one plugin to another
-	 */
-	public Collection copyReferencedContents(Collection elements,
-			Map elementToOldPluginMap) {
-		lastOldPlugin = null;
-		modifiedResourceSet = new HashSet();
-		if (elementToOldPluginMap == null) {
-			return modifiedResourceSet;
-		}
-		this.elementToOldPluginMap = elementToOldPluginMap;
-
-		Iterator iter = elements.iterator();
-		while (iter.hasNext()) {
-			Object o = iter.next();
-			if (o instanceof Resource) {
-				Resource r = (Resource) o;
-				Iterator resourceIter = r.getContents().iterator();
-				while (resourceIter.hasNext()) {
-					EObject e = (EObject) resourceIter.next();
-					HandleAttachmentsPlugin(e);
-				}
-			} else if (o instanceof EObject) {
-				EObject e = (EObject) o;
-				HandleAttachmentsPlugin(e);
-			}
-		}
-		return modifiedResourceSet;
-	}
-
-	private void HandleAttachmentsPlugin(EObject e) {
-		// handle self
-		MethodElement elementToProcess = null;
-		// find the old plugin, if there is one
-		if (elementToOldPluginMap != null
-				&& (MethodPlugin) elementToOldPluginMap.get(e) != null) {
-			lastOldPlugin = (MethodPlugin) elementToOldPluginMap.get(e);
-		}
-
-		if (lastOldPlugin != null) {
-			if (e instanceof DescribableElement) {
-				DescribableElement de = (DescribableElement) e;
-
-				// Custom icons
-				try {
-					// shape icon
-					java.net.URI shapeIconUri = de.getShapeicon();
-					if (shapeIconUri != null) {
-						// To handle the shapeIcon/nodeIcon uri got changed, its relative to pluginPath.
-						java.net.URI srcShapeUri = TngUtil.getFullPathURI(de,
-								shapeIconUri);
-						String shapeIconPath = shapeIconUri.getPath();
-						if(shapeIconPath.indexOf(lastOldPlugin.getName()) < 0){
-							srcShapeUri = new File(ResourceHelper.getPluginPath(lastOldPlugin) + File.separator+ shapeIconPath).toURI();
-						}
-						File srcFile = new File(srcShapeUri);
-						File tgtFile = new File(srcFile.getAbsolutePath()
-								.replaceFirst(
-										"\\" + File.separator //$NON-NLS-1$
-												+ lastOldPlugin.getName()
-												+ "\\" + File.separator, //$NON-NLS-1$
-										"\\" //$NON-NLS-1$
-												+ File.separator
-												+ UmaUtil.getMethodPlugin(de)
-														.getName() + "\\" //$NON-NLS-1$
-												+ File.separator));
-						if (!tgtFile.exists()) {
-							FileUtil.copyFile(srcFile, tgtFile);
-						}
-						java.net.URI newShapeIconUri = new java.net.URI(NetUtil
-								.encodeFileURL(FileUtil.getRelativePath(
-										tgtFile, new File(ResourceHelper.getPluginPath(de)))));
-						de.setShapeicon(newShapeIconUri);
-						modifiedResourceSet.add(de.eResource());
-					}
-
-					// node icon
-					java.net.URI nodeIconUri = de.getNodeicon();
-					if (nodeIconUri != null) {
-						java.net.URI srcNodeUri = TngUtil.getFullPathURI(de,
-								nodeIconUri);
-						String nodeIconPath = nodeIconUri.getPath();
-						if(nodeIconPath.indexOf(lastOldPlugin.getName()) < 0){
-							srcNodeUri = new File(ResourceHelper.getPluginPath(lastOldPlugin) + File.separator+ nodeIconPath).toURI();
-						}
-						File srcFile = new File(srcNodeUri);
-						File tgtFile = new File(srcFile.getAbsolutePath()
-								.replaceFirst(
-										"\\" + File.separator //$NON-NLS-1$
-												+ lastOldPlugin.getName()
-												+ "\\" + File.separator, //$NON-NLS-1$
-										"\\" //$NON-NLS-1$
-												+ File.separator
-												+ UmaUtil.getMethodPlugin(de)
-														.getName() + "\\" //$NON-NLS-1$
-												+ File.separator));
-						if (!tgtFile.exists()) {
-							FileUtil.copyFile(srcFile, tgtFile);
-						}
-						java.net.URI newNodeIconUri = new java.net.URI(NetUtil
-								.encodeFileURL(FileUtil.getRelativePath(
-										tgtFile, new File(ResourceHelper.getPluginPath(de)))));
-						de.setNodeicon(newNodeIconUri);
-						modifiedResourceSet.add(de.eResource());
-					}
-				} catch (Exception ex) {
-					LibraryPlugin.getDefault().getLogger().logError(ex);
-				}
-				HandleAttachmentsPlugin(de.getPresentation());
-				return;
-			} else if (e instanceof ContentDescription) {
-				elementToProcess = (ContentDescription) e;
-			} else if (e instanceof MethodElement) {
-				elementToProcess = (MethodElement) e;
-			} else {
-				if (debug) {
-					System.out
-							.println("CopyAttachmentsToNewLocation.HandleAttachmentsPlugin: unknown type " + e); //$NON-NLS-1$
-				}
-			}
-
-			if (elementToProcess != null
-					&& elementToProcess.eResource() != null) {
-				// set up ContentResourceScanner for this element
-				// give ContentResourceScanner same directory for sourceRootPath
-				// and targetRootPath
-//				ILibraryManager manager = (ILibraryManager) LibraryService
-//						.getInstance().getCurrentLibraryManager();
-//				
-//				URI elementURI = manager != null ? manager.getElementRelativeURI(elementToProcess) : null;
-//				if (elementURI == null || elementURI.segmentCount() < 1)
-//					return;
-				
-				
-				ILibraryResourceManager resMgr = ResourceHelper.getResourceMgr(elementToProcess);
-				ILibraryResourceManager lastOldPluginResMgr = ResourceHelper.getResourceMgr(lastOldPlugin);
-				
-				ContentResourceScanner scanner = getScanner(elementToProcess);
-
-				// iterate thru element's content
-				String contentPath = ResourceHelper
-						.getElementPath((MethodElement) elementToProcess);
-				if (contentPath == null || contentPath.length() == 0) {
-					LibraryPlugin
-							.getDefault()
-							.getLogger()
-							.logWarning(
-									NLS.bind(LibraryResources.CopyAttachmentsToNewLocation_log_noContentPath, (new Object[] { ((MethodElement) elementToProcess).getName() }))); 
-					return;
-				}
-
-				// FIXME: this is not always correct this relative of the element's folder might have been changed
-				// during move/copy
-				String oldContentPath = contentPath.replaceFirst(UmaUtil
-						.getMethodPlugin(elementToProcess).getName(),
-						lastOldPlugin.getName());
-				Iterator iter = elementToProcess.eClass().getEAllAttributes()
-						.iterator();
-				while (iter.hasNext()) {
-					EAttribute attrib = (EAttribute) iter.next();
-					Object o = elementToProcess.eGet(attrib);
-					if (o instanceof String) {
-						String content = (String) o;
-						if (content.length() > 0) {
-							String newContent = scanner.resolveResourcesPlugin(
-									content, contentPath, oldContentPath);
-							if (newContent != null
-									&& newContent.trim().length() != 0
-									&& !content.equals(newContent)) {
-								elementToProcess.eSet(attrib, newContent);
-								modifiedResourceSet.add(elementToProcess
-										.eResource());
-							}
-						}
-					}
-				}
-
-				// Template attachments
-//				String libRoot = ResourceHelper.getVirtualLibraryRoot(elementToProcess);
-				if (elementToProcess instanceof GuidanceDescription) {
-					String attachmentString = ((GuidanceDescription) elementToProcess)
-							.getAttachments();
-					List attachmentList = TngUtil
-							.convertGuidanceAttachmentsToList(attachmentString);
-					for (iter = attachmentList.iterator(); iter.hasNext();) {
-						String attachment = (String) iter.next();
-						if (attachment != null
-								&& attachment.trim().length() > 0) {
-							Matcher m = ResourceHelper.p_template_attachment_url.matcher(attachment);
-							if (!m.find()) {
-								File srcContentPath = new File(lastOldPluginResMgr.resolve(lastOldPlugin, oldContentPath));
-								File srcFile = new File(srcContentPath,
-										attachment);
-								File tgtContentPath = new File(resMgr.getPhysicalPath(elementToProcess));
-								File tgtFile = new File(tgtContentPath,
-										attachment);
-								if (!tgtFile.exists()) {
-									FileUtil.copyFile(srcFile, tgtFile);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// handle children
-		Iterator iter = e.eAllContents();
-		while (iter.hasNext()) {
-			EObject child = (EObject) iter.next();
-			HandleAttachmentsPlugin(child);
-		}
-	}
-
-	/**
-	 * Returns the content resource scanner for the element.
-	 */
-	private ContentResourceScanner getScanner(MethodElement owner) {
-		ILibraryResourceManager resMgr = ResourceHelper.getResourceMgr(owner);
-		if ( resMgr == null ) {
-			return null;
-		}
-		
-		String rootContentPath = resMgr.getLogicalPluginPath(owner);
-		File src_root = new File(resMgr.getPhysicalPluginPath(owner));
-		File tgt_root = src_root;
-		ContentResourceScanner scanner = new ContentResourceScanner(src_root, tgt_root, rootContentPath, getValidator());
-
-		return scanner;
-	}
-	
-	public IContentValidator getValidator() {
-		return null;
-	}
-
-	
-	/**
-	 * Copy all attachments from one library to another
-	 * 
-	 * @param oldLibDir
-	 *            Original library root
-	 * @param newLibDir
-	 *            New library root
-	 * @param xmiList
-	 *            list of xmi File's (pass null to process all files in
-	 *            newLibDir)
-	 * @param monitor
-	 *            optional (can be null) IProgressMonitor
-	 */
-	public static void copyAttachmentsLibrary(String oldLibDir,
-			String newLibDir, List xmiList, IProgressMonitor monitor) {
-
-		// get list of .xmi files in newLibDir
-		if (xmiList == null)
-			xmiList = FileUtil.fileList(new File(newLibDir), "xmi"); //$NON-NLS-1$
-
-		if (monitor != null)
-			monitor.subTask(LibraryResources.copyingAttachmentsTask_name);
-
-		Iterator iter = xmiList.iterator();
-		while (iter.hasNext()) {
-			if (monitor != null)
-				monitor.worked(1);
-			File xmiFile = (File) iter.next();
-			if (xmiFile.exists()) {
-				// parse xmi file
-				SAXParserXMI parser = new SAXParserXMI(null);
-				parser.parse(xmiFile.getAbsolutePath());
-				// iterate thru it's elements, checking content for attachments
-				ContentResourceScanner scanner = new ContentResourceScanner(
-						new File(oldLibDir), new File(newLibDir), null);
-				HandleAttachments(parser.xmiMap, scanner, xmiFile.getParent()
-						.substring(newLibDir.length()));
-			}
-		}
-	}
-
-	private static void HandleAttachments(HashMap eMap,
-			ContentResourceScanner scanner, String contentPath) {
-		// handle self
-		String content = SAXParserXMI.getElementContent(eMap);
-		if (content != null) {
-			// scan content for attachments
-			scanner.resolveResources(content, contentPath);
-		}
-
-		// handle children
-		Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			HashMap childMap = (HashMap) iter.next();
-			HandleAttachments(childMap, scanner, contentPath);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/FileNameGenerator.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/FileNameGenerator.java
deleted file mode 100644
index 696ec26..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/FileNameGenerator.java
+++ /dev/null
@@ -1,204 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.ILibraryServiceListener;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * helper class to produce a unique name for each guid or element
- * 
- * @author Jinhua Xi
- * @since 1.2
- *
- */
-public class FileNameGenerator {
-	public static FileNameGenerator INSTANCE = new FileNameGenerator();
-	
-	private Map<String, String> nameToGuidMap = new HashMap<String, String>();
-	private Map<String, String> guidToNameMap = new HashMap<String, String>();
-	private Map<String, Integer> baseNameIndexMap = new HashMap<String, Integer>();
-	
-	private ILibraryServiceListener svcListener;
-	
-	private FileNameGenerator() {
-		
-		svcListener = new ILibraryServiceListener(){
-
-			public void configurationSet(MethodConfiguration config) {
-				// TODO Auto-generated method stub
-				
-			}
-
-			public void libraryClosed(MethodLibrary library) {
-				FileNameGenerator.this.clear();
-				
-			}
-
-			public void libraryCreated(MethodLibrary library) {
-				FileNameGenerator.this.clear();
-				
-			}
-
-			public void libraryOpened(MethodLibrary library) {
-				FileNameGenerator.this.clear();
-				
-			}
-
-			public void libraryReopened(MethodLibrary library) {
-				FileNameGenerator.this.clear();
-				
-			}
-
-			public void librarySet(MethodLibrary library) {
-				// TODO Auto-generated method stub
-				
-			}
-			
-		};
-		
-		LibraryService.getInstance().addListener(svcListener);
-	}
-	
-	/**
-	 * get the guid from the file name, assuming the file name is generated from an element, 
-	 * return null if not found.
-	 * @param fileName String
-	 * @return String
-	 */
-	public synchronized String getGuidFromFileName(String fileName) {
-		if ( fileName == null || fileName.equals("") ) { //$NON-NLS-1$
-			return null;
-		}
-		
-		return getGuidFromUniqueName(getUniqueName(fileName));
-	}
-
-	/**
-	 * get the file name with the given prefix and extension
-	 * @param element MethodElement
-	 * @param namePrefix String prefix for the name
-	 * @param nameSuffix String suffix for the name
-	 * @param ext String file extension, for example, ".html"
-	 * @return String
-	 */	 
-	public synchronized String getFileName(MethodElement element, String namePrefix,
-			String nameSuffix, String ext) {
-
-		String uniqueName = getUniqueNameForGuid(element.getGuid(), element.getName());
-		
-		StringBuffer buffer = new StringBuffer();
-		if (namePrefix != null) {
-			buffer.append(namePrefix);
-		}
-
-		buffer.append(uniqueName);
-		
-		if (nameSuffix != null) {
-			buffer.append(nameSuffix);
-		}
-
-		if (ext != null) {
-			if (ext.indexOf(".") < 0) //$NON-NLS-1$
-			{
-				ext = "." + ext; //$NON-NLS-1$
-			}
-			buffer.append(ext);
-		}
-		
-		return buffer.toString();
-	}
-	
-	public void clear() {
-		nameToGuidMap.clear();
-		guidToNameMap.clear();
-		baseNameIndexMap.clear();
-	}
-	
-	private static final int MAX_NAME_LENGTH = 64;
-	
-	private String getUniqueNameForGuid(String guid, String defaultName) {
-		if ( guid == null || guid.equals("") ) { //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-		
-		// if the name is already genenrated, return it
-		String uniqueName = guidToNameMap.get(guid);
-		if ( uniqueName != null ) {
-			return uniqueName;
-		}
-		
-		// construct the base file name of the element
-		// note: to make the name consistent everytime the name is generated, 
-		// we still need to make the name guid specific. 
-		// appending the guid makes the string to long, so use the hashcode
-		// however, hashcode may have collision, so still need to append the suffix index,
-		// in such case, the file name may still not uniquely binding to the same element consistently.
-		// but the chance is much smaller
-		if ( defaultName == null ) {
-			defaultName = ""; //$NON-NLS-1$
-		} 
-		
-		// make sure the base name string is valid and not exceed the maximum length
-		String baseName = StrUtil.removeSpecialCharacters(defaultName);	
-		if ( baseName.length() > MAX_NAME_LENGTH ) {
-			baseName = baseName.substring(0, MAX_NAME_LENGTH);
-		}
-			
-		baseName += "_" + Integer.toHexString(guid.hashCode()).toUpperCase(); //$NON-NLS-1$
-
-		uniqueName = baseName;
-		Integer index = baseNameIndexMap.get(baseName);
-		if ( index == null ) {
-			// this is the first with this base name, use it
-			index = new Integer(1);
-		} else {
-			// increase the index by one and append to the end of the base name
-			index++;
-			uniqueName = baseName + "-" + index.toString(); //$NON-NLS-1$
-		}
-		
-		baseNameIndexMap.put(baseName, index);
-		guidToNameMap.put(guid, uniqueName);
-		nameToGuidMap.put(uniqueName, guid);
-		return uniqueName;
-	}
-	
-	private String getGuidFromUniqueName(String uniqueName) {
-		return nameToGuidMap.get(uniqueName);
-	}
-		
-	private String getUniqueName(String fileName) {
-		
-		try {
-		File f = new File(fileName);
-		fileName = f.getName();
-		int index = fileName.lastIndexOf("."); //$NON-NLS-1$
-		if ( index < 0 ) {
-			return fileName;
-		}
-		
-		return fileName.substring(0, index);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		
-		return ""; //$NON-NLS-1$
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/IconUtil.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/IconUtil.java
deleted file mode 100644
index d3cf6c0..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/IconUtil.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-
-/**
- * utility class to manage icon urls
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class IconUtil {
-
-	private static URL nodeIconPluginRoot = null;
-
-	public static final String ICON_Activity = "full/obj16/Activity"; //$NON-NLS-1$
-
-	public static final String ICON_Artifact = "full/obj16/Artifact"; //$NON-NLS-1$
-
-	public static final String ICON_CapabilityPattern = "full/obj16/CapabilityPattern"; //$NON-NLS-1$
-
-	public static final String ICON_Checklist = "full/obj16/Checklist"; //$NON-NLS-1$
-
-	public static final String ICON_Concept = "full/obj16/Concept"; //$NON-NLS-1$
-
-	public static final String ICON_ContentPackage = "full/obj16/ContentPackage"; //$NON-NLS-1$
-
-	public static final String ICON_CustomCategory = "full/obj16/CustomCategory"; //$NON-NLS-1$
-
-	public static final String ICON_Deliverable = "full/obj16/Deliverable"; //$NON-NLS-1$
-
-	public static final String ICON_DeliveryProcess = "full/obj16/DeliveryProcess"; //$NON-NLS-1$
-
-	public static final String ICON_Discipline = "full/obj16/Discipline"; //$NON-NLS-1$
-
-	public static final String ICON_DisciplineGrouping = "full/obj16/DisciplineGrouping"; //$NON-NLS-1$
-
-	public static final String ICON_Domain = "full/obj16/Domain"; //$NON-NLS-1$
-
-	public static final String ICON_Estimate = "full/obj16/Estimate"; //$NON-NLS-1$
-
-	public static final String ICON_EstimationConsiderations = "full/obj16/EstimationConsiderations"; //$NON-NLS-1$
-
-	public static final String ICON_Example = "full/obj16/Example"; //$NON-NLS-1$
-
-	public static final String ICON_Guideline = "full/obj16/Guideline"; //$NON-NLS-1$
-
-	public static final String ICON_Iteration = "full/obj16/Iteration"; //$NON-NLS-1$
-
-	public static final String ICON_MethodConfiguration = "full/obj16/MethodConfiguration"; //$NON-NLS-1$
-
-	public static final String ICON_MethodLibrary = "full/obj16/MethodLibrary"; //$NON-NLS-1$
-
-	public static final String ICON_MethodPackage = "full/obj16/MethodPackage"; //$NON-NLS-1$
-
-	public static final String ICON_MethodPlugin = "full/obj16/MethodPlugin"; //$NON-NLS-1$
-
-	public static final String ICON_Milestone = "full/obj16/Milestone"; //$NON-NLS-1$
-
-	public static final String ICON_Outcome = "full/obj16/Outcome"; //$NON-NLS-1$
-
-	public static final String ICON_Phase = "full/obj16/Phase"; //$NON-NLS-1$
-
-	public static final String ICON_Practice = "full/obj16/Practice"; //$NON-NLS-1$
-
-	public static final String ICON_ProcessContribution = "full/obj16/ProcessContribution"; //$NON-NLS-1$
-
-	public static final String ICON_ProcessFamily = "full/obj16/ProcessFamily"; //$NON-NLS-1$
-
-	public static final String ICON_ProcessPackage = "full/obj16/ProcessPackage"; //$NON-NLS-1$
-
-	public static final String ICON_Report = "full/obj16/Report"; //$NON-NLS-1$
-
-	public static final String ICON_ReusableAsset = "full/obj16/ReusableAsset"; //$NON-NLS-1$
-
-	public static final String ICON_Roadmap = "full/obj16/Roadmap"; //$NON-NLS-1$
-
-	public static final String ICON_Role = "full/obj16/Role"; //$NON-NLS-1$
-
-	public static final String ICON_RoleSet = "full/obj16/RoleSet"; //$NON-NLS-1$
-
-	public static final String ICON_RoleSetGrouping = "full/obj16/RoleSetGrouping"; //$NON-NLS-1$
-
-	public static final String ICON_SupportingMaterial = "full/obj16/SupportingMaterial"; //$NON-NLS-1$
-
-	public static final String ICON_Task = "full/obj16/Task"; //$NON-NLS-1$
-
-	public static final String ICON_Template = "full/obj16/Template"; //$NON-NLS-1$
-
-	public static final String ICON_TermDefinition = "full/obj16/TermDefinition"; //$NON-NLS-1$
-
-	public static final String ICON_Tool = "full/obj16/Tool"; //$NON-NLS-1$
-
-	public static final String ICON_ToolMentor = "full/obj16/ToolMentor"; //$NON-NLS-1$
-
-	public static final String ICON_Whitepaper = "full/obj16/Whitepaper"; //$NON-NLS-1$
-
-	public static final String ICON_WorkProduct = "full/obj16/WorkProduct"; //$NON-NLS-1$
-
-	public static final String ICON_WorkProductType = "full/obj16/WorkProductType"; //$NON-NLS-1$
-
-	// map of image type to image
-	private static Map nodeIconUrlMap = new HashMap();
-	static {
-		nodeIconUrlMap.put("activity", ICON_Activity); //$NON-NLS-1$
-		nodeIconUrlMap.put("artifact", ICON_Artifact); //$NON-NLS-1$
-		nodeIconUrlMap.put("capabilitypattern", ICON_CapabilityPattern); //$NON-NLS-1$
-		nodeIconUrlMap.put("checklist", ICON_Checklist); //$NON-NLS-1$
-		nodeIconUrlMap.put("concept", ICON_Concept); //$NON-NLS-1$
-		nodeIconUrlMap.put("contentpackage", ICON_ContentPackage); //$NON-NLS-1$
-		nodeIconUrlMap.put("customcategory", ICON_CustomCategory); //$NON-NLS-1$
-		nodeIconUrlMap.put("deliverable", ICON_Deliverable); //$NON-NLS-1$
-		nodeIconUrlMap.put("deliveryprocess", ICON_DeliveryProcess); //$NON-NLS-1$
-		nodeIconUrlMap.put("discipline", ICON_Discipline); //$NON-NLS-1$
-		nodeIconUrlMap.put("disciplinegrouping", ICON_DisciplineGrouping); //$NON-NLS-1$
-		nodeIconUrlMap.put("domain", ICON_Domain); //$NON-NLS-1$
-		nodeIconUrlMap.put("estimate", ICON_Estimate); //$NON-NLS-1$
-		nodeIconUrlMap.put(
-				"estimationconsiderations", ICON_EstimationConsiderations); //$NON-NLS-1$
-		nodeIconUrlMap.put("example", ICON_Example); //$NON-NLS-1$
-		nodeIconUrlMap.put("guideline", ICON_Guideline); //$NON-NLS-1$
-		nodeIconUrlMap.put("iteration", ICON_Iteration); //$NON-NLS-1$
-		nodeIconUrlMap.put("methodconfiguration", ICON_MethodConfiguration); //$NON-NLS-1$
-		nodeIconUrlMap.put("methodlibrary", ICON_MethodLibrary); //$NON-NLS-1$
-		nodeIconUrlMap.put("methodpackage", ICON_MethodPackage); //$NON-NLS-1$
-		nodeIconUrlMap.put("methodplugin", ICON_MethodPlugin); //$NON-NLS-1$
-		nodeIconUrlMap.put("milestone", ICON_Milestone); //$NON-NLS-1$
-		nodeIconUrlMap.put("outcome", ICON_Outcome); //$NON-NLS-1$
-		nodeIconUrlMap.put("phase", ICON_Phase); //$NON-NLS-1$
-		nodeIconUrlMap.put("practice", ICON_Practice); //$NON-NLS-1$
-		nodeIconUrlMap.put("processcontribution", ICON_ProcessContribution); //$NON-NLS-1$
-		nodeIconUrlMap.put("processfamily", ICON_ProcessFamily); //$NON-NLS-1$
-		nodeIconUrlMap.put("processpackage", ICON_ProcessPackage); //$NON-NLS-1$
-		nodeIconUrlMap.put("report", ICON_Report); //$NON-NLS-1$
-		nodeIconUrlMap.put("reusableasset", ICON_ReusableAsset); //$NON-NLS-1$
-		nodeIconUrlMap.put("roadmap", ICON_Roadmap); //$NON-NLS-1$
-		nodeIconUrlMap.put("role", ICON_Role); //$NON-NLS-1$
-		nodeIconUrlMap.put("roleset", ICON_RoleSet); //$NON-NLS-1$
-		nodeIconUrlMap.put("rolesetgrouping", ICON_RoleSetGrouping); //$NON-NLS-1$
-		nodeIconUrlMap.put("supportingmaterial", ICON_SupportingMaterial); //$NON-NLS-1$
-		nodeIconUrlMap.put("task", ICON_Task); //$NON-NLS-1$
-		nodeIconUrlMap.put("template", ICON_Template); //$NON-NLS-1$
-		nodeIconUrlMap.put("termdefinition", ICON_TermDefinition); //$NON-NLS-1$
-		nodeIconUrlMap.put("tool", ICON_Tool); //$NON-NLS-1$
-		nodeIconUrlMap.put("toolmentor", ICON_ToolMentor); //$NON-NLS-1$
-		nodeIconUrlMap.put("whitepaper", ICON_Whitepaper); //$NON-NLS-1$
-		nodeIconUrlMap.put("workproduct", ICON_WorkProduct); //$NON-NLS-1$
-		nodeIconUrlMap.put("workproducttype", ICON_WorkProductType); //$NON-NLS-1$
-
-		nodeIconUrlMap.put("roledescriptor", ICON_Role); //$NON-NLS-1$
-		nodeIconUrlMap.put("taskdescriptor", ICON_Task); //$NON-NLS-1$
-		nodeIconUrlMap.put("workproductdescriptor", ICON_WorkProduct); //$NON-NLS-1$
-
-		try {
-			nodeIconPluginRoot = FileLocator.resolve(UmaEditPlugin.INSTANCE
-					.getBaseURL());
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	/**
-	 * get the node icon url
-	 * 
-	 * @param type String the element type
-	 * @return URL
-	 */
-	public static URL getNodeIconURL(String type) {
-		try {
-			String key = (String) nodeIconUrlMap.get(type.toLowerCase());
-			if (key != null) {
-				return new URL(nodeIconPluginRoot, "icons/" + key + ".gif"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} catch (MalformedURLException e) {
-			e.printStackTrace();
-		}
-
-		return null;
-	}
-
-	/**
-	 * get the node icon file location for the element type
-	 * @param type String the element type
-	 * @return File
-	 */
-	public static File getNodeIconFile(String type) {
-		URL url = getNodeIconURL(type);
-		if (url != null) {
-			return new File(url.getFile());
-		}
-
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ImportExportUtil.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ImportExportUtil.java
deleted file mode 100644
index 3c389f9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ImportExportUtil.java
+++ /dev/null
@@ -1,194 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.xml.sax.SAXException;
-
-/**
- * utility class to handle element replace or renaming for import/export
- * 
- * @author ???
- * @since 1.0
- *
- */
-public class ImportExportUtil {
-	
-	/**
-	 * 
-	 * @param procComp
-	 * @param dir
-	 * @throws IOException
-	 * @throws ParserConfigurationException
-	 * @throws FactoryConfigurationError
-	 * @throws SAXException
-	 */
-	public static void replace(ProcessComponent procComp, String dir)
-			throws IOException, ParserConfigurationException,
-			FactoryConfigurationError, SAXException {
-		File newProcCompFile = new File(dir,
-				MultiFileSaveUtil.DEFAULT_MODEL_FILENAME);
-		if (!newProcCompFile.exists()) {
-			throw new FileNotFoundException(
-					MessageFormat
-							.format(
-									LibraryResources.ImportExportUtil_MSG8, new Object[] { newProcCompFile }));
-		}
-
-		String oldModelFileStr = procComp.eResource().getURI().toFileString();
-		String oldProcCompDir = new File(oldModelFileStr).getParent();
-
-		String suffix = MultiFileSaveUtil.getBackupFileSuffix();
-
-		File tempDir = null;
-
-		try {
-			// copy dir a temp dir inside the target dir
-			//
-			tempDir = new File(oldProcCompDir, suffix);
-			if (!tempDir.mkdir()) {
-				throw new IOException(
-						MessageFormat
-								.format(
-										LibraryResources.ImportExportUtil_MSG9, new Object[] { tempDir }));
-			}
-			FileUtil.copyDir(new File(dir), tempDir);
-			newProcCompFile = new File(tempDir,
-					MultiFileSaveUtil.DEFAULT_MODEL_FILENAME);
-
-			// load the new model.xmi
-			//
-			ResourceSet resourceSet = procComp
-					.eResource().getResourceSet();
-			Resource newResource = resourceSet.getResource(URI
-					.createFileURI(newProcCompFile.getAbsolutePath()), true);
-
-			// fix configuration references
-			//
-			ProcessComponent newProcComp = (ProcessComponent) PersistenceUtil
-					.getMethodElement(newResource);
-			Process newProc = newProcComp.getProcess();
-			newProc
-					.setDefaultContext(procComp.getProcess()
-							.getDefaultContext());
-			newProc.getValidContext().clear();
-			newProc.getValidContext().addAll(
-					procComp.getProcess().getValidContext());
-
-			// fix all steps
-			//		
-			for (Iterator iter = newProcComp.eAllContents(); iter.hasNext();) {
-				Object element = iter.next();
-				if (element instanceof TaskDescriptor) {
-					TaskDescriptor taskDesc = (TaskDescriptor) element;
-					Task task = taskDesc.getTask();
-					String taskName = task == null ? "NONE" : "'" + task.getName() + "'"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					System.out.println("Task: " + taskName); //$NON-NLS-1$
-					if (task != null) {
-						taskDesc.getSelectedSteps().clear();
-						taskDesc.getSelectedSteps().addAll(task.getSteps());
-					}
-				}
-			}
-
-			// replace GUID of new ProcessComponent and its ResourceManager with
-			// old ones
-			//
-
-			// // read the model.xmi file
-			// DocumentBuilder builder =
-			// DocumentBuilderFactory.newInstance().newDocumentBuilder();
-			// Document doc = builder.parse(newProcCompFile);
-
-			// set GUID of new ResourceManager to old GUID
-			ResourceManager resMgr = MultiFileSaveUtil
-					.getResourceManager(procComp.eResource());
-			if (resMgr != null) {
-				MultiFileSaveUtil.getResourceManager(newResource).setGuid(
-						resMgr.getGuid());
-			}
-
-			// NodeList list =
-			// doc.getElementsByTagName("org.eclipse.epf.uma.resourcemanager:ResourceManager");
-			// Element e = (Element) list.item(0);
-			// e.setAttribute("xmi:id", guid);
-			// e.setAttribute("guid", guid);
-
-			// set GUID of new ProcessComponent to old GUID
-			newProcComp.setGuid(procComp.getGuid());
-
-			// guid = procComp.getGuid();
-			// list =
-			// doc.getElementsByTagName("org.eclipse.epf.uma:ProcessComponent");
-			// e = (Element) list.item(0);
-			// e.setAttribute("xmi:id", guid);
-			// e.setAttribute("guid", guid);
-
-			// save the new model.xmi
-			ILibraryManager manager = LibraryService.getInstance()
-					.getCurrentLibraryManager();
-			Map saveOptions = manager != null ? manager.getSaveOptions() : new HashMap();			
-			newResource.save(saveOptions);
-
-			// back up old model.xmi
-			File file = new File(oldModelFileStr);
-			FileUtil.moveFile(file, new File(oldModelFileStr + ".bak" + suffix)); //$NON-NLS-1$
-
-			FileUtil.moveFile(newProcCompFile, new File(oldModelFileStr));
-
-			// XMLUtil.saveDocument(doc, oldModelFileStr);
-
-			File newContentFile = new File(tempDir,
-					MultiFileSaveUtil.DEFAULT_CONTENT_FILENAME);
-
-			// back up old content.xmi
-			String contentFileStr = oldProcCompDir + File.separator
-					+ MultiFileSaveUtil.DEFAULT_CONTENT_FILENAME;
-			File oldContentFile = new File(contentFileStr);
-			FileUtil.moveFile(oldContentFile, new File(contentFileStr + ".bak" + suffix)); //$NON-NLS-1$
-
-			// copy new content.xmi
-			if (newContentFile.exists()) {
-				FileUtil.moveFile(newContentFile, oldContentFile);
-			}
-		} finally {
-			if (tempDir != null) {
-				FileUtil.deleteAllFiles(tempDir.getAbsolutePath());
-				tempDir.delete();
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/LibraryManager.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/LibraryManager.java
deleted file mode 100644
index bc0443c..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/LibraryManager.java
+++ /dev/null
@@ -1,899 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractTreeIterator;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.library.edit.command.AddToCategoryCommand;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
-import org.eclipse.epf.library.edit.command.RemoveFromCategoryCommand;
-import org.eclipse.epf.library.edit.util.MethodElementUtil;
-import org.eclipse.epf.library.edit.util.Misc;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * This class contains all the routines used by the tool editor to manipulate
- * the associations of a method element in the library with other categories or
- * method elements
- * 
- * Use getAvailableXXX to retrieve a pick list of categories, method element for
- * a given method element. Use addToXXX to establish a new association. Use
- * removeFromXXX to remove an exisiting association.
- * 
- * Call releaseCategories() before the editor closes, passing in all the
- * categories that you have retrieved with getAvailableXXX() for the editor.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryManager {
-
-	private static Comparator nameComparator = new Comparator() {
-
-		public int compare(Object o1, Object o2) {
-			if (o1 instanceof MethodElement && o2 instanceof MethodElement) {
-				return ((MethodElement) o1).getName().compareTo(
-						((MethodElement) o2).getName());
-			}
-
-			return 0;
-		}
-
-	};
-
-	private static LibraryManager instance = null;
-
-	public static final LibraryManager getInstance() {
-		if (instance == null) {
-			synchronized (LibraryManager.class) {
-				if (instance == null) {
-					instance = new LibraryManager();
-				}
-			}
-		}
-		return instance;
-	}
-
-	protected LibraryManager() {
-	}
-
-	// //////
-	// Begin of code moved from MethodElementUtil and made private
-	// //////
-	/**
-	 * Return categories in the model, given particular object and class
-	 * 
-	 * @param object
-	 * @param class
-	 * @param String[]
-	 * @return
-	 */
-	public List getAvailableCategories(MethodElement object, Class classType,
-			String[] path) {
-		List itemList = new ArrayList();
-		MethodPlugin model = UmaUtil.getMethodPlugin((EObject) object);
-
-		if (model != null) {
-			// add all categories from the current plugin
-			//
-			ContentPackage disciplinePkg = UmaUtil.findContentPackage(model,
-					path);
-			if (disciplinePkg != null) {
-				EList contentCats = (EList) disciplinePkg.getContentElements();
-				for (int i = 0; i < contentCats.size(); i++) {
-					Object element = contentCats.get(i);
-
-					if (classType.isInstance(element) && element != object) {
-						itemList.add(element);
-					}
-				}
-			}
-
-			// add all categories from base plugins that are not extended
-			//
-			List list = Misc.getAllBase(model);
-			// list.add(0, model);
-			for (int j = 0; j < list.size(); j++) {
-				ContentPackage parentDisciplines = UmaUtil.findContentPackage(
-						((MethodPlugin) list.get(j)), path);
-				if (parentDisciplines != null) {
-					EList contentCats = (EList) parentDisciplines
-							.getContentElements();
-					for (int i = 0; i < contentCats.size(); i++) {
-						Object element = contentCats.get(i);
-
-						if (classType.isInstance(element)) {
-							VariabilityElement item = (VariabilityElement) element;
-							if (item.getVariabilityBasedOnElement() == null) {
-								// make sure the itemList doesn't have a
-								// category that extends this
-								int k;
-								for (k = 0; k < itemList.size(); k++) {
-									if (((VariabilityElement) itemList.get(k))
-											.getVariabilityBasedOnElement() == item)
-										break;
-								}
-								if (k == itemList.size())
-									itemList.add(item);
-
-								// itemList.add(item);
-							}
-						}
-					}
-				}
-			}
-		}
-
-		Collections.sort(itemList, nameComparator);
-
-		return itemList;
-	}
-
-	// ////////
-	// End of code moved from MethodElementUtil
-	// ////////
-
-	/**
-	 * Gets all disciplines that are available to the given MethodElement
-	 * object.
-	 * 
-	 * @param e
-	 * @return list of Discipline objects
-	 */
-	public List getAvailableDisciplines(MethodElement e) {
-		return getAvailableCategories(e, Discipline.class,
-				ModelStructure.DEFAULT_DISCIPLINE_DEF_PATH);
-	}
-
-	/**
-	 * Gets all domains that are available to the given MethodElement object.
-	 * 
-	 * @param e
-	 * @return list of Domain objects
-	 */
-	public List getAvailableDomains(MethodElement e) {
-		List domains = getAvailableCategories(e, Domain.class,
-				ModelStructure.DEFAULT_DOMAIN_PATH);
-
-		// get all the domains including subdomains
-		//
-		List allDomains = new ArrayList();
-		for (Iterator iter = domains.iterator(); iter.hasNext();) {
-			Domain domain = (Domain) iter.next();
-			Iterator domainTree = new AbstractTreeIterator(domain, true) {
-
-				protected Iterator getChildren(Object object) {
-					return ((Domain) object).getSubdomains().iterator();
-				}
-
-			};
-			while (domainTree.hasNext()) {
-				allDomains.add(domainTree.next());
-			}
-		}
-
-		Collections.sort(allDomains, nameComparator);
-
-		return allDomains;
-	}
-
-	/**
-	 * Gets all work product types that are available to the given MethodElement
-	 * object.
-	 * 
-	 * @param e
-	 * @return list of WorkProductType objects
-	 */
-	public List getAvailableWorkProductTypes(MethodElement e) {
-		return getAvailableCategories(e, WorkProductType.class,
-				ModelStructure.DEFAULT_WORK_PRODUCT_TYPE_PATH);
-	}
-
-	/**
-	 * Gets all role sets that are available to the given MethodElement object.
-	 * 
-	 * @param e
-	 * @return list of RoleSet objects
-	 */
-	public List getAvailableRoleSets(MethodElement e) {
-		return getAvailableCategories(e, RoleSet.class,
-				ModelStructure.DEFAULT.roleSetPath);
-	}
-
-	/**
-	 * Gets all custom categories that are available to the given MethodElement
-	 * object.
-	 * 
-	 * @param e
-	 * @return list of RoleSet objects
-	 */
-	public List getAvailableCustomCategories(MethodElement e) {
-		List categories = getAvailableCategories(e, CustomCategory.class,
-				ModelStructure.DEFAULT_CUSTOM_CATEGORY_PATH);
-		// filter out the root custom categories
-		//
-		for (Iterator iter = categories.iterator(); iter.hasNext();) {
-			if (TngUtil.isRootCustomCategory((CustomCategory) iter.next())) {
-				iter.remove();
-			}
-		}
-		return categories;
-	}
-
-	/**
-	 * Gets all tools that are available to the given MethodElement object.
-	 * 
-	 * @param e
-	 * @return list of Tool objects
-	 */
-	public List getAvailableTools(MethodElement e) {
-		return getAvailableCategories(e, Tool.class,
-				ModelStructure.DEFAULT.toolPath);
-	}
-
-	/**
-	 * Gets all discipline groupings that are available to the given
-	 * MethodElement object.
-	 * 
-	 * @param e
-	 * @return list of RoleSet objects
-	 */
-	public List getAvailableDisciplineGroupings(MethodElement e) {
-		return getAvailableCategories(e, DisciplineGrouping.class,
-				ModelStructure.DEFAULT.disciplineDefinitionPath);
-	}
-
-	/**
-	 * Gets all role set groupings that are available to the given MethodElement
-	 * object.
-	 * 
-	 * @param e
-	 * @return list of RoleSet objects
-	 */
-	public List getAvailableRoleSetGroupings(MethodElement e) {
-		return getAvailableCategories(e, RoleSetGrouping.class,
-				ModelStructure.DEFAULT.roleSetPath);
-	}
-
-	/**
-	 * add a task to a discipline
-	 * 
-	 * @param actionMgr
-	 * @param discipline
-	 * @param task
-	 * @return Discipline
-	 */
-	public Discipline addToDiscipline(IActionManager actionMgr,
-			Discipline discipline, Task task, List usedCategories) {
-		return (Discipline) addToCategory(actionMgr, discipline, task,
-				UmaPackage.eINSTANCE.getDiscipline_Tasks(),
-				ModelStructure.DEFAULT.disciplineDefinitionPath, true, usedCategories);
-	}
-
-	/**
-	 * add a workproduct to a domain
-	 * 
-	 * @param actionMgr
-	 * @param domain
-	 * @param wp
-	 * @return Domain
-	 */
-	public Domain addToDomain(IActionManager actionMgr, Domain domain,
-			WorkProduct wp, List usedCategories) {
-		return (Domain) addToCategory(actionMgr, domain, wp,
-				UmaPackage.eINSTANCE.getDomain_WorkProducts(),
-				ModelStructure.DEFAULT.domainPath, true, usedCategories);
-	}
-
-
-	/**
-	 * add a work product to a WorkProductType
-	 * 
-	 * @param actionMgr
-	 * @param wpType
-	 * @param wp
-	 * @return WorkProductType
-	 */
-	public WorkProductType addToWorkProductType(IActionManager actionMgr,
-			WorkProductType wpType, WorkProduct wp, List usedCategories) {
-		return (WorkProductType) addToCategory(actionMgr, wpType, wp,
-				UmaPackage.eINSTANCE.getWorkProductType_WorkProducts(),
-				ModelStructure.DEFAULT.workProductTypePath, true, usedCategories);
-	}
-
-
-
-	/**
-	 * add an element to a CustomCategory
-	 * 
-	 * @param actionMgr
-	 * @param userDefinedCategory
-	 * @param element
-	 * @return CustomCategory
-	 */
-	public CustomCategory addToCustomCategory(IActionManager actionMgr,
-			CustomCategory userDefinedCategory, MethodElement element, List usedCategories) {
-		if (element instanceof DescribableElement) {
-			return (CustomCategory) addToCategory(actionMgr,
-					userDefinedCategory, element, UmaPackage.eINSTANCE
-							.getCustomCategory_CategorizedElements(),
-					ModelStructure.DEFAULT.customCategoryPath, true, usedCategories);
-		}
-
-		// if(element instanceof ContentElement) {
-		// return (CustomCategory) addToCategory(actionMgr, userDefinedCategory,
-		// element,
-		// UmaPackage.eINSTANCE.getCustomCategory_CategorizedElements(),
-		// ModelStructure.DEFAULT.customCategoryPath, true);
-		// }
-		// else if(element instanceof ContentCategory) {
-		// return (CustomCategory) addToCategory(actionMgr, userDefinedCategory,
-		// element, UmaPackage.eINSTANCE.getCustomCategory_SubCategories(),
-		// ModelStructure.DEFAULT.customCategoryPath, true);
-		// }
-		// else if(element instanceof Process){
-		// return (CustomCategory) addToCategory(actionMgr, userDefinedCategory,
-		// element, UmaPackage.eINSTANCE.getCustomCategory_ProcessElements(),
-		// ModelStructure.DEFAULT.customCategoryPath, true);
-		// }
-
-		return null;
-	}
-
-
-	/**
-	 * add a toolmentor to a Tool
-	 * 
-	 * @param actionMgr
-	 * @param tool
-	 * @param toolMentor
-	 * @return Tool
-	 */
-	public Tool addToTool(IActionManager actionMgr, Tool tool,
-			ToolMentor toolMentor, List usedCategories) {
-		return (Tool) addToCategory(actionMgr, tool, toolMentor,
-				UmaPackage.eINSTANCE.getTool_ToolMentors(),
-				ModelStructure.DEFAULT.toolPath, true, usedCategories);
-	}
-
-
-	/**
-	 * add a role to a RoleSet
-	 * @param actionMgr
-	 * @param roleSet
-	 * @param role
-	 * @return RoleSet
-	 */
-	public RoleSet addToRoleSet(IActionManager actionMgr, RoleSet roleSet,
-			Role role, List usedCategories) {
-		return (RoleSet) addToCategory(actionMgr, roleSet, role,
-				UmaPackage.eINSTANCE.getRoleSet_Roles(),
-				ModelStructure.DEFAULT.roleSetPath, true, usedCategories);
-	}
-
-	/**
-	 * Adds a method element to the category. This method might create a new
-	 * contributor to the given category in the method element's plugin if the
-	 * given category belongs to the base plugin of the method element's plugin.
-	 * 
-	 * @param actionMgr
-	 * @param category
-	 * @param element
-	 * @param feature
-	 * @param categoryPkgPath
-	 * @param checkForExistingContributor
-	 * @return the actual category that the given method element is added to
-	 */
-	public ContentCategory addToCategory(IActionManager actionMgr,
-			ContentCategory category, MethodElement element,
-			EStructuralFeature feature, String[] categoryPkgPath,
-			boolean checkForExistingContributor, List usedCategories) {
-		AddToCategoryCommand cmd = new AddToCategoryCommand(category, element,
-				feature, categoryPkgPath, checkForExistingContributor, usedCategories);
-		actionMgr.execute(cmd);
-		return (ContentCategory) ((List) cmd.getAffectedObjects()).get(0);
-	}
-
-//	public void setResponsibleRole(IActionManager actionMgr, WorkProduct wp,
-//			Role role) {
-//		IResourceAwareCommand cmd = new SetOppositeFeatureCommand(wp,
-//				AssociationHelper.WorkProduct_ResponsibleRole, role);
-//		actionMgr.execute(cmd);
-//	}
-
-	/**
-	 * Removes the method element from the category. This method might delete
-	 * the category if it is a contributor and became empty after the removal of
-	 * the method element.
-	 * 
-	 * @param category
-	 * @param element
-	 * @param feature
-	 *            feature that contains the given method element
-	 * @param contentPkgPath
-	 * @return true if the method element is successfully removed, false
-	 *         otherwise.
-	 */
-	public boolean removeFromCategory(IActionManager actionMgr,
-			ContentCategory category, MethodElement element,
-			EStructuralFeature feature, String[] contentPkgPath, List usedCategories) {
-		IResourceAwareCommand cmd = new RemoveFromCategoryCommand(category,
-				element, feature, contentPkgPath, usedCategories);
-		actionMgr.execute(cmd);
-		return !cmd.getResult().isEmpty();
-	}
-
-	/**
-	 * Removes the method element from the category. This method might delete
-	 * the category if it is a contributor and became empty after the removal of
-	 * the method element.
-	 * 
-	 * @param category
-	 * @param element
-	 * @param feature
-	 *            feature that contains the given method element
-	 * @param elementFeatures
-	 *            features to check for emptiness before deleting the category
-	 * @param contentPkgPath
-	 * @return true if the method element is successfully removed, false
-	 *         otherwise.
-	 */
-	// public boolean removeFromCategory(ContentCategory category, MethodElement
-	// element, EStructuralFeature feature, EStructuralFeature[]
-	// elementFeatures, String[] contentPkgPath) {
-	// boolean ret;
-	// boolean empty = false;
-	// MethodPlugin categoryPlugin = UmaUtil.getMethodPlugin(category);
-	// MethodPlugin elementPlugin = UmaUtil.getMethodPlugin(element);
-	// ContentCategory usedCategory;
-	// if(categoryPlugin != elementPlugin) {
-	// usedCategory =
-	// TngUtil.findContributor(UmaUtil.findContentPackage(elementPlugin,
-	// contentPkgPath), category);
-	// if(usedCategory == null) return false;
-	// }
-	// else {
-	// usedCategory = category;
-	// }
-	// if(feature.isMany()) {
-	// Collection collection = (Collection) usedCategory.eGet(feature);
-	// ret = collection.remove(element);
-	// empty = true;
-	// //TODO: need revisit to find better way to remove the empty contributors
-	// without adding to much work on in the UI code
-	// //
-	// // for (int i = 0; i < elementFeatures.length; i++) {
-	// // collection = (Collection) category.eGet(elementFeatures[i]);
-	// // if(!collection.isEmpty()) {
-	// // empty = false;
-	// // break;
-	// // }
-	// // }
-	// }
-	// else {
-	// usedCategory.eSet(feature, null);
-	// ret = true;
-	// }
-	// // if(category.getVariabilityBasedOnElement() != null && empty) {
-	// // EcoreUtil.remove(category);
-	// // }
-	// return ret;
-	// }
-	// public boolean removeFromDiscipline(Discipline discipline, Task task) {
-	// EStructuralFeature feature = UmaPackage.eINSTANCE.getDiscipline_Tasks();
-	// return removeFromCategory(discipline, task, feature, new
-	// EStructuralFeature[] { feature },
-	// ModelStructure.DEFAULT.disciplineDefinitionPath);
-	// }
-	public boolean removeFromDiscipline(IActionManager actionMgr,
-			Discipline discipline, Task task, List usedCategories) {
-		EStructuralFeature feature = UmaPackage.eINSTANCE.getDiscipline_Tasks();
-		return removeFromCategory(actionMgr, discipline, task, feature,
-				ModelStructure.DEFAULT.disciplineDefinitionPath, usedCategories);
-	}
-
-	// public boolean removeFromDomain(Domain domain, WorkProduct wp) {
-	// EStructuralFeature feature =
-	// UmaPackage.eINSTANCE.getDomain_WorkProducts();
-	// return removeFromCategory(domain, wp, feature, new EStructuralFeature[] {
-	// feature }, ModelStructure.DEFAULT.domainPath);
-	// }
-
-	public boolean removeFromDomain(IActionManager actionMgr, Domain domain,
-			WorkProduct wp, List usedCategories) {
-		EStructuralFeature feature = UmaPackage.eINSTANCE
-				.getDomain_WorkProducts();
-		return removeFromCategory(actionMgr, domain, wp, feature,
-				ModelStructure.DEFAULT.domainPath, usedCategories);
-	}
-
-	// public boolean removeFromWorkProductType(WorkProductType wpType,
-	// WorkProduct wp) {
-	// EStructuralFeature feature =
-	// UmaPackage.eINSTANCE.getWorkProductType_WorkProducts();
-	// return removeFromCategory(wpType, wp, feature, new EStructuralFeature[] {
-	// feature }, ModelStructure.DEFAULT.workProductTypePath);
-	// }
-
-	public boolean removeFromWorkProductType(IActionManager actionMgr,
-			WorkProductType wpType, WorkProduct wp, List usedCategories) {
-		EStructuralFeature feature = UmaPackage.eINSTANCE
-				.getWorkProductType_WorkProducts();
-		return removeFromCategory(actionMgr, wpType, wp, feature,
-				ModelStructure.DEFAULT.workProductTypePath, usedCategories);
-	}
-
-	// public boolean removeFromRoleSet(RoleSet roleSet, Role role) {
-	// EStructuralFeature feature = UmaPackage.eINSTANCE.getRoleSet_Roles();
-	// return removeFromCategory(roleSet, role, feature, new
-	// EStructuralFeature[] { feature }, ModelStructure.DEFAULT.roleSetPath);
-	// }
-
-	public boolean removeFromRoleSet(IActionManager actionMgr, RoleSet roleSet,
-			Role role, List usedCategories) {
-		EStructuralFeature feature = UmaPackage.eINSTANCE.getRoleSet_Roles();
-		return removeFromCategory(actionMgr, roleSet, role, feature,
-				ModelStructure.DEFAULT.roleSetPath, usedCategories);
-	}
-
-	// public boolean removeFromTool(Tool tool, ToolMentor toolMentor) {
-	// EStructuralFeature feature = UmaPackage.eINSTANCE.getTool_ToolMentors();
-	// return removeFromCategory(tool, toolMentor, feature, new
-	// EStructuralFeature[] { feature }, ModelStructure.DEFAULT.toolPath);
-	// }
-
-	public boolean removeFromTool(IActionManager actionMgr, Tool tool,
-			ToolMentor toolMentor, List usedCategories) {
-		EStructuralFeature feature = UmaPackage.eINSTANCE.getTool_ToolMentors();
-		return removeFromCategory(actionMgr, tool, toolMentor, feature,
-				ModelStructure.DEFAULT.toolPath, usedCategories);
-	}
-
-	// public boolean removeFromCustomCategory(CustomCategory
-	// userDefinedCategory, MethodElement e) {
-	// EStructuralFeature contentElementFeature =
-	// UmaPackage.eINSTANCE.getCustomCategory_CategorizedElements();
-	// EStructuralFeature contentCategoryFeature =
-	// UmaPackage.eINSTANCE.getCustomCategory_SubCategories();
-	// EStructuralFeature[] features = { contentElementFeature,
-	// contentCategoryFeature };
-	// if(e instanceof ContentElement) {
-	// return removeFromCategory(userDefinedCategory, e, contentElementFeature,
-	// features, ModelStructure.DEFAULT.customCategoryPath);
-	// }
-	// else if(e instanceof ContentCategory) {
-	// return removeFromCategory(userDefinedCategory, e, contentCategoryFeature,
-	// features, ModelStructure.DEFAULT.customCategoryPath);
-	// }
-	// return false;
-	// }
-
-	public boolean removeFromCustomCategory(IActionManager actionMgr,
-			CustomCategory userDefinedCategory, MethodElement e, List usedCategories) {
-		if (e instanceof DescribableElement) {
-			EStructuralFeature feature = UmaPackage.eINSTANCE
-					.getCustomCategory_CategorizedElements();
-			return removeFromCategory(actionMgr, userDefinedCategory, e,
-					feature, ModelStructure.DEFAULT.customCategoryPath, usedCategories);
-		}
-		return false;
-	}
-
-	/**
-	 * Call this method before the editor closes, passing in all the categories
-	 * that you have retrieved with getAvailableXXX() for the editor
-	 * 
-	 * @param consumer
-	 * @param categories
-	 */
-	public void releaseCategories(MethodElement consumer, Collection categories) {
-		MethodPlugin consumerPlugin = UmaUtil.getMethodPlugin(consumer);
-		for (Iterator iter = categories.iterator(); iter.hasNext();) {
-			ContentCategory category = (ContentCategory) iter.next();
-			MethodPlugin categoryPlugin = UmaUtil.getMethodPlugin(category);
-			if (category.getVariabilityBasedOnElement() != null
-					&& categoryPlugin == consumerPlugin
-					&& TngUtil.isEmpty(category)) {
-				EcoreUtil.remove(category);
-				if (category instanceof CustomCategory) {
-					TngUtil.getRootCustomCategory(categoryPlugin)
-							.getCategorizedElements().remove(category);
-				}
-			} else {
-				String[] path = getCategoryPackagePath(category);
-				// path can be null if the category is deleted
-				//
-				if (path != null) {
-					ContentPackage categoryPkg = UmaUtil.findContentPackage(
-							consumerPlugin, path);
-					ContentCategory contributor = TngUtil.findContributor(
-							categoryPkg, category);
-					if (contributor != null && TngUtil.isEmpty(contributor)) {
-						EcoreUtil.remove(contributor);
-						if (contributor instanceof CustomCategory) {
-							TngUtil.getRootCustomCategory(consumerPlugin)
-									.getCategorizedElements().remove(contributor);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @param category
-	 * @return List
-	 */
-	public List getAvailableTasks(ContentCategory category) {
-		return getAvailableContentElements(Task.class, category, false);
-	}
-
-	/**
-	 * 
-	 * @param category
-	 * @return List
-	 */
-	public List getAvailableWorkProducts(ContentCategory category) {
-		// // special handling to disallow assigment of work products to domain
-		// with subdomains
-		// //
-		// if(category instanceof Domain &&
-		// !((Domain)category).getSubdomains().isEmpty()) {
-		// return Collections.EMPTY_LIST;
-		// }
-
-		return getAvailableContentElements(WorkProduct.class, category, false);
-	}
-
-	/**
-	 * 
-	 * @param category
-	 * @return List
-	 */
-	public List getAvailableRoles(ContentCategory category) {
-		return getAvailableContentElements(Role.class, category, false);
-	}
-
-	/**
-	 * Gets all content elements that are available to the given content element
-	 * to reference to
-	 * 
-	 * @param methodElementType
-	 *            concrect class of the the given content element.
-	 * @param element
-	 * @param localOnly
-	 *            if true, only the elements in the given element's plugin are
-	 *            included in the result.
-	 * @return
-	 */
-	public List getAvailableContentElements(Class methodElementType,
-			ContentElement element, boolean localOnly) {
-		List elementList = new ArrayList();
-		List modelList;
-		if (localOnly) {
-			modelList = Collections.singletonList(UmaUtil
-					.getMethodPlugin(element));
-		} else {
-			modelList = MethodElementUtil.getAllModels(element);
-		}
-		int size = modelList.size();
-		for (int i = 0; i < size; i++) {
-			MethodPlugin model = (MethodPlugin) modelList.get(i);
-			ContentPackage coreContentPkg = UmaUtil.findContentPackage(model,
-					ModelStructure.DEFAULT.coreContentPath);
-			if (coreContentPkg == null)
-				continue;
-			TreeIterator iterator = coreContentPkg.eAllContents();
-
-			while (iterator.hasNext()) {
-				Object obj = (Object) iterator.next();
-				if (methodElementType.isInstance(obj) && obj != element) {
-					elementList.add(obj);
-				}
-			}
-		}
-
-		Collections.sort(elementList, nameComparator);
-
-		return elementList;
-	}
-
-	/**
-	 * 
-	 * @param role
-	 * @return List
-	 */
-	public List getAvailableTasks(Role role) {
-		// While editing a role, you only can assign this role to a task in the
-		// same plugin.
-		// Othewise you will modify the base plugin.
-		//
-		return getAvailableContentElements(Task.class, role, true);
-	}
-
-	/**
-	 * 
-	 * @param wp
-	 * @return List
-	 */
-	public List getAvailableTasks(WorkProduct wp) {
-		// While editing a work product, you only can assign this work product
-		// to a task in the same plugin.
-		// Othewise you will modify the base plugin.
-		//
-		return getAvailableContentElements(Task.class, wp, true);
-	}
-
-	/**
-	 * 
-	 * @param wp
-	 * @return List
-	 */
-	public List getAvailableRoles(WorkProduct wp) {
-		// While editing a work product, you only can assign this work product
-		// to a role in the same plugin.
-		// Othewise you will modify the base plugin.
-		//
-		return getAvailableContentElements(Role.class, wp, true);
-	}
-
-	/**
-	 * @param role
-	 * @return List
-	 */
-	public List getAvailableWorkProducts(Role role) {
-		return getAvailableContentElements(WorkProduct.class, role, false);
-	}
-
-	/**
-	 * @param task
-	 * @return List
-	 */
-	public List getAvailableWorkProducts(Task task) {
-		return getAvailableContentElements(WorkProduct.class, task, false);
-	}
-
-	/**
-	 * 
-	 * @param task
-	 * @return List
-	 */
-	public List getAvailableRoles(Task task) {
-		return getAvailableContentElements(Role.class, task, false);
-	}
-
-	/**
-	 * 
-	 * @param task
-	 * @return List
-	 */
-	public List getStepList(Task task) {
-		if (task.getVariabilityType() == VariabilityType.EXTENDS_LITERAL
-				|| task.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL) {
-			VariabilityElement base = TngUtil.getBase(task);
-			final List types = new ArrayList();
-			if (types.isEmpty()) {
-				synchronized (types) {
-					if (types.isEmpty()) {
-						types.add(VariabilityType.CONTRIBUTES_LITERAL);
-						types.add(VariabilityType.EXTENDS_LITERAL);
-					}
-				}
-			}
-			Iterator extended = new AbstractTreeIterator(base) {
-				protected Iterator getChildren(Object object) {
-					List list = AssociationHelper
-							.getImmediateVarieties((VariabilityElement) object);
-					if (list == null || list.isEmpty())
-						Collections.EMPTY_LIST.iterator();
-					int size = list.size();
-					List outputList = new ArrayList();
-					for (int i = 0; i < size; i++) {
-						VariabilityElement e = (VariabilityElement) list.get(i);
-						if (types.contains(e.getVariabilityType())) {
-							outputList.add(e);
-						}
-					}
-					return outputList.iterator();
-				}
-			};
-			for (; extended.hasNext();) {
-				Task t = (Task) extended.next();
-				t.getPresentation().getSections();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @param base
-	 * @param variabilityTypes
-	 * @return List
-	 */
-	public List getExtended(VariabilityElement base, Collection variabilityTypes) {
-		List list = new ArrayList();
-		getExtended(list, base, variabilityTypes);
-		return list;
-	}
-
-	private static void getExtended(List outputList, VariabilityElement base,
-			Collection variabilityTypes) {
-		List list = AssociationHelper.getImmediateVarieties(base);
-		if (list == null || list.isEmpty())
-			return;
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			VariabilityElement e = (VariabilityElement) list.get(i);
-			if (variabilityTypes.contains(e.getVariabilityType())) {
-				outputList.add(e);
-			}
-		}
-		for (int i = 0; i < size; i++) {
-			VariabilityElement e = (VariabilityElement) list.get(i);
-			if (variabilityTypes.contains(e.getVariabilityType())) {
-				getExtended(outputList, base, variabilityTypes);
-			}
-		}
-
-	}
-
-	private static String[] getCategoryPackagePath(ContentCategory category) {
-		EObject parent = null;
-		for (parent = category.eContainer(); parent != null
-				&& !(parent instanceof ContentPackage); parent = parent
-				.eContainer())
-			;
-		if (parent == null)
-			return null;
-		ContentPackage categoryPkg = (ContentPackage) parent;
-		return Misc.getPathRelativeToPlugin(categoryPkg);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/LibraryUtil.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/LibraryUtil.java
deleted file mode 100644
index c0e6b0d..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/LibraryUtil.java
+++ /dev/null
@@ -1,871 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.sdo.EProperty;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.command.IActionManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.library.persistence.PersistenceService;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.persistence.MultiFileXMISaveImpl;
-import org.eclipse.epf.services.Services;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * @author Jinhua Xi
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class LibraryUtil {
-
-	public static boolean PUBLISH_MODE = false;
-	
-	/**
-	 * Check is given plugin name is valid name in the library
-	 * 
-	 * @param name
-	 * @return String
-	 */
-	public static String checkPluginName(MethodPlugin plugin, String newName) {
-		MethodLibrary lib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		return IValidatorFactory.INSTANCE.createValidator(lib,
-				UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS,
-				(IFilter) null, null, UmaPackage.Literals.NAMED_ELEMENT__NAME)
-				.isValid(newName);		
-	}
-
-	/**
-	 * method to check if the element is a plugin or package so that is can be selected in configuration editor. 
-	 * May need a better name for this.
-	 * @param element EObject
-	 * @return boolean
-	 */
-	public static boolean selectable(EObject element) {
-		return (element instanceof MethodLibrary
-				|| element instanceof MethodPlugin || element instanceof MethodPackage);
-	}
-
-	/**
-	 * get the container of the element that is selectable.
-	 * @param element EObject
-	 * @return EObject
-	 */
-	public static EObject getSelectable(EObject element) {
-		if (element instanceof BreakdownElement) {
-			EObject pkg = element.eContainer();
-			while (pkg != null && !(pkg instanceof ProcessComponent) ) {
-				pkg = pkg.eContainer();
-			}
-			return pkg;
-			
-		} else {
-			EObject parent = element;
-			while ((parent != null) && !selectable(parent)) {
-				parent = parent.eContainer();
-			}
-
-			return parent;
-		}
-	}
-
-	/**
-	 * get the method plugin for the element
-	 * 
-	 * @param element EObject
-	 * @return MethodPlugin
-	 */
-	public static MethodPlugin getMethodPlugin(EObject element) {
-		// EObject parent = element;
-		// while ((parent != null) && !(parent instanceof MethodPlugin)) {
-		// parent = parent.eContainer();
-		// }
-		//
-		// return (MethodPlugin) parent;
-
-		return UmaUtil.getMethodPlugin(element);
-	}
-
-	/**
-	 * get a printable name string for the element. Note, this is not the element name attribute
-	 * @param element Object
-	 * @return String
-	 */
-	public static String getName(Object element) {
-		if (element == null)
-			return LibraryResources.unknown_text; 
-
-		if (element instanceof MethodElement) {
-			return getFullName((MethodElement) element);
-		}
-
-		return element.toString();
-	}
-
-	/**
-	 * get a printable name for the element.
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getFullName(MethodElement element) {
-		if (selectable(element)) {
-			StringBuffer buffer = new StringBuffer();
-			buffer.append("[").append(element.getName()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-			MethodElement parent = element;
-			while ((parent = (MethodElement) parent.eContainer()) != null) {
-				if (parent instanceof MethodLibrary) {
-					break;
-				}
-				buffer.insert(0, "[" + parent.getName() + "]."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return buffer.toString();
-		} else {
-			return element.getName();
-		}
-	}
-
-	/**
-	 * get the element's type:name as a localized string
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getLocalizeTypeName(MethodElement element) {
-		if (element == null) {
-			return ""; //$NON-NLS-1$
-		}
-		if (element instanceof DescribableElement) {
-			String nameStr = TngUtil.getTypeText(element) + LibraryResources.colon_with_space ;
-			
-			if (((DescribableElement) element).getPresentationName() != null) {
-				nameStr += "(" + ((DescribableElement) element).getPresentationName() //$NON-NLS-1$
-						+ ") " + ((DescribableElement) element).getName(); //$NON-NLS-1$
-			} else {
-				nameStr += element.getName();
-			}
-			return nameStr ;
-		} else {
-			return getTypeName(element);
-		}
-	}
-	
-	/**
-	 * get the element's type:name
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getTypeName(MethodElement element) {
-		return element == null ? "" : element.getType().getName() + ":" + element.getName(); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	/**
-	 * get the element's type:name
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getTypePath(MethodElement element) {
-		return element == null ? "" : element.getType().getName() + ":" + TngUtil.getLabelWithPath(element); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	
-	/**
-	 * get the method plugins in the library
-	 * @param library MethodLibrary
-	 * @return List a list of MethodPlugin objects
-	 */
-	public static List getMethodPlugins(MethodLibrary library) {
-		List items = new ArrayList();
-		EList elements = library.eContents();
-		if (elements != null) {
-			for (Iterator it = elements.iterator(); it.hasNext();) {
-				EObject element = (EObject) it.next();
-				if (element instanceof MethodPlugin) {
-					items.add(element);
-				}
-			}
-		}
-
-		return items;
-	}
-
-	/**
-	 * get a list of guid strings of the method plugins in the library
-	 * @param library MethodLibrary
-	 * @return List
-	 */
-	public static List getMethodPluginGuids(MethodLibrary library) {
-		List items = new ArrayList();
-		List elements = library.getMethodPlugins();
-		if (elements != null) {
-			for (Iterator it = elements.iterator(); it.hasNext();) {
-				MethodPlugin element = (MethodPlugin) it.next();
-				items.add(element.getGuid());
-			}
-		}
-
-		return items;
-	}
-
-	/**
-	 * get the MethodPlugin in the library with the given plugin guid.
-	 * 
-	 * @param library MethodLibrary
-	 * @param pluginGuid String
-	 * @return MethodPlugin
-	 */
-	public static MethodPlugin getMethodPlugin(MethodLibrary library,
-			String pluginGuid) {
-		if (pluginGuid == null) {
-			return null;
-		}
-
-		List elements = library.getMethodPlugins();
-		if (elements != null) {
-			for (Iterator it = elements.iterator(); it.hasNext();) {
-				MethodPlugin element = (MethodPlugin) it.next();
-				if (pluginGuid.equals(element.getGuid())) {
-					return element;
-				}
-			}
-		}
-
-		return null;
-	}
-	
-	/**
-	 * get the MethodPlugin in the library with the given plugin name.
-	 * 
-	 * @param library MethodLibrary
-	 * @param name String
-	 * @return MethodPlugin
-	 */
-	public static MethodPlugin getMethodPluginByName(MethodLibrary library,
-			String name) {
-		if (name == null) {
-			return null;
-		}
-
-		List elements = library.getMethodPlugins();
-		if (elements != null) {
-			for (Iterator it = elements.iterator(); it.hasNext();) {
-				MethodPlugin element = (MethodPlugin) it.next();
-				if (name.equals(element.getName())) {
-					return element;
-				}
-			}
-		}
-
-		return null;
-	}
-
-
-	/**
-	 * get all the contained MethodPackages for the element, return empty list if nothing found.
-	 * @param element MethodElement
-	 * @return List
-	 */
-	public static List getMethodPackages(MethodElement element) {
-		List items = new ArrayList();
-		for (Iterator it = element.eAllContents(); it.hasNext();) {
-			EObject e = (EObject) it.next();
-			if (e instanceof MethodPackage) {
-				items.add(e);
-			}
-		}
-
-		return items;
-	}
-
-	/**
-	 * upwrap the object
-	 * @param obj Object
-	 * @return Object
-	 */
-	public static Object unwrap(Object obj) {
-		return TngUtil.unwrap(obj);
-	}
-
-	/**
-	 * unwrap the command
-	 * @param cmd Command
-	 * @return Command
-	 */
-	public static Command unwrap(Command cmd) {
-		return TngUtil.unwrap(cmd);
-	}
-
-	/**
-	 * clear the resource the elements associated to. So that the element can be
-	 * added to another library and got new resource assigned.
-	 * 
-	 * @param importLibraty
-	 *            MethodLibrary
-	 */
-	public static void detachFromResource(MethodLibrary importLibraty) {
-		ResourceSet resSet = null;
-		Resource res = importLibraty.eResource();
-		if (res != null) {
-			resSet = res.getResourceSet();
-		}
-
-		if (resSet != null) {
-			for (TreeIterator it = resSet.getAllContents(); it.hasNext();) {
-				Object obj = it.next();
-				if (obj instanceof MultiResourceEObject) {
-					((MultiResourceEObject) obj).eSetResource(null);
-				}
-			}
-		}
-
-		// clear all the unresolved proxies
-		clearProxies(importLibraty);
-	}
-
-	/**
-	 * clear proxy for the element. This is used to fix the element when the proxy can't be resolved.
-	 * @param element EObject
-	 */
-	public static void clearProxies(EObject element) {
-		if (element.eIsProxy()) {
-			// reset the proxy to null
-			setProxyURI(element, null);
-		} else {
-			// iterate the children
-			for (TreeIterator it = element.eAllContents(); it.hasNext();) {
-				EObject o = (EObject) it.next();
-				if (o.eIsProxy()) {
-					setProxyURI(o, null);
-				}
-			}
-		}
-	}
-
-	/**
-	 * set the object's proxy uri
-	 * @param obj EObject
-	 * @param uri org.eclipse.emf.common.util.URI
-	 */
-	public static void setProxyURI(EObject obj,
-			org.eclipse.emf.common.util.URI uri) {
-		((org.eclipse.emf.ecore.InternalEObject) obj).eSetProxyURI(uri);
-	}
-
-	public static Collection<Resource> getLoadedResources(MethodLibrary lib, Collection<Resource> excludes) {
-
-		Collection<Resource> loadedres = new HashSet<Resource>();
-
-		for (Iterator<Resource> it = lib.eResource().getResourceSet()
-				.getResources().iterator(); it.hasNext(); ) {
-			Resource res = (Resource)it.next();
-			if ( res.isLoaded() ) {
-				if ( (excludes == null) || !excludes.contains(res) ) {
-					loadedres.add(res);
-				}
-			}
-		}	
-		
-		return loadedres;
-	}
-	
-	/**
-	 * load all elements in the library
-	 * @param lib MethodLibrary
-	 */
-	public static Collection<Resource> loadAll(MethodLibrary lib) {
-
-		Collection<Resource> loadedres = getLoadedResources(lib, null);
-		
-		for (Iterator<EObject> iter = lib.eAllContents(); iter.hasNext();) {
-			try {
-				EObject element = (EObject) iter.next();
-				for (Iterator<EObject> iterator = element.eCrossReferences().iterator(); iterator
-						.hasNext();) {
-					iterator.next();
-				}
-			} catch (Exception e) {
-				LibraryPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-		
-		return getLoadedResources(lib, loadedres);
-	}
-
-	
-	/**
-	 * load all processes in the library
-	 * @param lib MethodLibrary
-	 */
-	public static void loadAllProcesses(MethodLibrary lib) {
-
-		for (Iterator iter = lib.getMethodPlugins().iterator(); iter.hasNext();) {
-			try {
-				MethodPlugin plugin = (MethodPlugin) iter.next();
-				TngUtil.getAllProcesses(plugin);
-			} catch (Exception e) {
-				LibraryPlugin.getDefault().log(e);
-			}
-		}
-	}
-	
-	/**
-	 * save all elements in the library not matter the element is changed or not. 
-	 * Don't refresh the workspace.
-	 * @param lib MethodLibrary
-	 * @throws Exception
-	 */
-	public static void saveAll(MethodLibrary lib) throws Exception {
-		saveLibrary(lib, true, false);
-	}
-
-	/**
-	 * save the specified method library based on the library resourceset. You
-	 * need to set the resource set before calling this method to save the
-	 * library
-	 * 
-	 * @param lib
-	 *            MethodLibrary
-	 * @param saveAll
-	 *            boolean if true, force saving all the resources even if they
-	 *            are not modified.
-	 */
-	public static void saveLibrary(MethodLibrary lib, boolean saveAll,
-			boolean refresh) throws Exception {
-		ILibraryResourceSet libResourceSet = (ILibraryResourceSet) lib.eResource().getResourceSet();
-		if(libResourceSet instanceof MultiFileResourceSetImpl) {
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) libResourceSet;
-
-			ILibraryManager manager = LibraryService.getInstance()
-			.getCurrentLibraryManager();
-			Map saveOptions = manager != null ? manager.getSaveOptions()
-					: new HashMap();
-
-			// back up current REFRESH_NEW_RESOURCE option
-			Object old = saveOptions.get(MultiFileXMISaveImpl.REFRESH_NEW_RESOURCE);
-			Object oldCheckModify = saveOptions
-			.get(MultiFileXMISaveImpl.CHECK_MODIFY);
-			try {
-				// disable workspace refresh when new file is created
-				saveOptions.put(MultiFileXMISaveImpl.REFRESH_NEW_RESOURCE,
-						refresh ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$
-				saveOptions.put(MultiFileXMISaveImpl.CHECK_MODIFY, "false"); //$NON-NLS-1$
-
-				// save resource set here
-				resourceSet.save(saveOptions, saveAll);
-			} finally {
-				// restore REFRESH_NEW_RESOURCE option
-				saveOptions.put(MultiFileXMISaveImpl.REFRESH_NEW_RESOURCE, old);
-				saveOptions.put(MultiFileXMISaveImpl.CHECK_MODIFY, oldCheckModify);
-			}
-		}
-		else {
-			libResourceSet.save(Collections.EMPTY_MAP);
-		}
-	}
-
-	/**
-	 * load the library at the specified path. return the MethodLibrary.
-	 * This method is different from the the open library in LibraryService. 
-	 * It only load the row library object but will not impact the current EPF environment.
-	 * @param libraryPath String
-	 * @return MethodLibrary
-	 * @throws Exception
-	 */
-	public static MethodLibrary loadLibrary(String libraryPath)
-			throws Exception {
-		ILibraryResourceSet resourceSet = PersistenceService.INSTANCE.createResourceSet(Services.XMI_PERSISTENCE_TYPE);
-		resourceSet.loadMethodLibraries(URI.createFileURI(libraryPath), Collections.EMPTY_MAP);
-		return resourceSet.getFirstMethodLibrary();
-	}
-
-	/**
-	 * get the root path of the method library 
-	 * @param lib MethodLibrary
-	 * @return File
-	 */
-	public static File getLibraryRootPath(MethodLibrary lib) {
-		Resource res = lib.eResource();
-		if (res == null) {
-			return null;
-		}
-
-		URI uri = res.getURI();
-		String path = uri.toFileString();
-		File f = new File(path);
-		return f.getParentFile();
-	}
-
-	/**
-	 * get all packages in the plugin
-	 * @param plugin MethodPlugin
-	 * @return List
-	 */
-	public static List getAllPackages(MethodPlugin plugin) {
-		List allPkgs = new ArrayList();
-
-		List pkgs = plugin.getMethodPackages();
-		allPkgs.addAll(pkgs);
-
-		for (Iterator it = pkgs.iterator(); it.hasNext();) {
-			getAllChildPackages((MethodPackage) it.next(), allPkgs);
-		}
-
-		return allPkgs;
-	}
-
-	/**
-	 * get all child packages of the given MethodPackage and add to the list
-	 * @param pkg MethodPackage
-	 * @param result List the packages found
-	 */
-	public static void getAllChildPackages(MethodPackage pkg, List result) {
-		List pkgs = pkg.getChildPackages();
-		result.addAll(pkgs);
-
-		for (Iterator it = pkgs.iterator(); it.hasNext();) {
-			getAllChildPackages((MethodPackage) it.next(), result);
-		}
-	}
-
-	/**
-	 * get all configurations referenced by this plugin
-	 * 
-	 * @param plugin
-	 * @return List of MethodConfiguration
-	 */
-	public static List getAssociatedConfigurations(MethodPlugin plugin) {
-		// get the configs that references this method plugin
-		List allConfigs = new ArrayList();
-		List configs = (List) ((MultiResourceEObject) plugin)
-				.getOppositeFeatureValue(AssociationHelper.MethodPlugin_MethodConfigurations);
-		addUniqueItems(configs, allConfigs);
-
-		// get the configs that references the packages in this plugin
-		List pkgs = getAllPackages(plugin);
-		for (Iterator it = pkgs.iterator(); it.hasNext();) {
-			MultiResourceEObject o = (MultiResourceEObject) it.next();
-
-			configs = (List) o
-					.getOppositeFeatureValue(AssociationHelper.MethodPackage_MethodConfigurations);
-			addUniqueItems(configs, allConfigs);
-		}
-
-		// get the congigurations that referenced by the processes in this
-		// plugin
-		List procs = TngUtil.getAllProcesses(plugin);
-		for (Iterator it = procs.iterator(); it.hasNext();) {
-			org.eclipse.epf.uma.Process p = (org.eclipse.epf.uma.Process) it
-					.next();
-			MethodConfiguration c = p.getDefaultContext();
-			if ((c != null) && !allConfigs.contains(c)) {
-				allConfigs.add(c);
-			}
-			addUniqueItems(p.getValidContext(), allConfigs);
-		}
-
-		return allConfigs;
-	}
-
-	private static void addUniqueItems(List from, List to) {
-		if (from == null || to == null || from.size() == 0) {
-			return;
-		}
-
-		for (Iterator it = from.iterator(); it.hasNext();) {
-			Object o = it.next();
-			if (!to.contains(o)) {
-				to.add(o);
-			}
-		}
-	}
-
-	/**
-	 * validate the configuration by forcing to select the global packages of
-	 * the selected method plugins, this is needed for configuration exporting.
-	 * If global packages are missing, the exported configuration is not valid
-	 * 
-	 * @param actionMgr if not null, will use the given IActionManager to change the configuration, otherwise configuration will be changed directly
-	 * @param plugin
-	 */
-	public static void validateMethodConfiguration(IActionManager actionMgr, MethodConfiguration config) {
-//		List plugins = config.getMethodPluginSelection();
-//		List pkgSels = config.getMethodPackageSelection();
-//
-//		for (Iterator itp = plugins.iterator(); itp.hasNext();) {
-//			MethodPlugin plugin = (MethodPlugin) itp.next();
-//			List pkgs = TngUtil.getAllSystemPackages(plugin);
-//			for (Iterator it = pkgs.iterator(); it.hasNext();) {
-//				Object pkg = it.next();
-//				if (!pkgSels.contains(pkg)) {
-//					pkgSels.add(pkg);
-//				}
-//			}
-//		}
-		
-		// moved to TngUtil
-		TngUtil.validateMethodConfiguration(actionMgr, config);
-	}
-
-	/**
-	 * validate the configuration by forcing to select the global packages of
-	 * the selected method plugins, this is needed for configuration exporting.
-	 * If global packages are missing, the exported configuration is not valid
-	 * @param plugin
-	 */
-	public static void validateMethodConfiguration(MethodConfiguration config) {
-		validateMethodConfiguration(null, config);
-	}
-	
-	/**
-	 * get the copyright object for an element
-	 * @param element MethodElement
-	 * @return SupportingMaterial
-	 */
-	public static SupportingMaterial getCopyright(MethodElement element) {
-		SupportingMaterial sm = null;
-		if (element instanceof MethodUnit) {
-			sm = ((MethodUnit) element).getCopyrightStatement();
-		} else if (element instanceof DescribableElement) {
-			sm = ((DescribableElement) element).getPresentation()
-					.getCopyrightStatement();
-		}
-
-		// if no copyright of it's own, get the copyright from the plugin
-		if (sm == null) {
-			MethodPlugin p = getMethodPlugin(element);
-			if (p != null) {
-				sm = p.getCopyrightStatement();
-			}
-		}
-
-		return sm;
-	}
-
-	/**
-	 * for the given container and elements list, check if the element in the list is contained by the container or not. 
-	 * return all the contained elements for a given container
-	 * @param container Object
-	 * @param elements Collection
-	 * @return Collection
-	 */
-	public static Collection getContainedElements(Object container,
-			Collection elements) {
-		if (container instanceof TransientGroupItemProvider) {
-			container = ((TransientGroupItemProvider) container).getTarget();
-		}
-		ArrayList contained = new ArrayList();
-		for (Iterator iter = elements.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof EObject
-					&& UmaUtil.isContainedBy((EObject) element, container)) {
-				contained.add(element);
-			}
-		}
-		return contained;
-	}
-
-	/**
-	 * check if two method element are identical or not. Two elements are
-	 * identical if and only if: all the attribute values are equal all the
-	 * referenced elements are equal all the contained elements are identical
-	 * 
-	 * @param oldObj
-	 *            MethodElement
-	 * @param newObj
-	 *            MethodElement
-	 * @return boolean
-	 */
-	public static boolean isIdentical(MethodElement oldObj, MethodElement newObj) {
-
-		if ((oldObj == null) && (newObj == null)) {
-			return true;
-		}
-
-		if ((oldObj == null) || (newObj == null)) {
-			return false;
-		}
-
-		// this does not work, the toString contains the object instance info
-		// return oldObj.toString().equals(newObj.toString());
-
-		List features = getStructuralFeatures(oldObj);
-//		List properties = oldObj.getInstanceProperties();
-		if (features != null) {
-			for (int i = 0; i < features.size(); i++) {
-				EStructuralFeature feature = (EStructuralFeature) features
-						.get(i);
-				Object oldValue = oldObj.eGet(feature);
-				Object newValue = newObj.eGet(feature);
-				if (oldValue == null && newValue == null) {
-					continue;
-				}
-
-				if (oldValue == null || newValue == null) {
-					return false;
-				}
-
-				if (oldValue instanceof MethodElement) {
-
-					// if it'c containment feature value, iterate it
-					MethodElement olde = (MethodElement) oldValue;
-					if (olde.eContainer() == oldObj) {
-						if (!isIdentical(olde, (MethodElement) newValue)) {
-							return false;
-						}
-					} else if (oldValue != newValue) {
-						return false;
-					}
-				} else if (oldValue instanceof List) {
-					List oldl = (List) oldValue;
-					List newl = (List) newValue;
-					if (oldl.size() != newl.size()) {
-						return false;
-					}
-
-					for (int x = 0; x < oldl.size(); x++) {
-						Object o = oldl.get(x);
-						Object n = newl.get(x);
-						if (o instanceof MethodElement) {
-							// if it'c containment feature value, iterate it
-							MethodElement olde = (MethodElement) o;
-							if (olde.eContainer() == oldObj) {
-								if (!isIdentical(olde, (MethodElement) n)) {
-									return false;
-								}
-							} else if (oldValue != newValue) {
-								return false;
-							}
-						} else {
-							if (!o.equals(n)) {
-								return false;
-							}
-						}
-					}
-				} else {
-					if (!oldValue.equals(newValue)) {
-						return false;
-					}
-				}
-			}
-		}
-
-		return true;
-	}
-	
-	/**
-	 * check if the element is a process or not. 
-	 * A Process is a CapabilityPattern or DeliveryProcess object 
-	 * that is contained by a ProcessComponent.
-	 * @param e EObject
-	 * @return boolean
-	 */
-	public static boolean isProcess(EObject e) {
-		return (e instanceof org.eclipse.epf.uma.Process) && 
-			(e.eContainer() instanceof ProcessComponent);
-	}
-	
-	public static List getValidViews(MethodConfiguration config) {
-		
-		List views = new ArrayList();
-		for ( Iterator it = config.getProcessViews().iterator(); it.hasNext(); ) {
-			ContentCategory view = (ContentCategory)it.next();
-			if ( !ConfigurationHelper.isContributor(view) ) {
-				view = (ContentCategory)ConfigurationHelper.getCalculatedElement(view, config);
-				if ( view != null && !views.contains(view) ) {
-					views.add(view);
-				} 
-			}	
-		}
-				
-		return views;
-	}
-	
-//	public static List getSuperActivities(BreakdownElement element) {
-//		List items = new ArrayList();
-//
-//		// build the parent nodes
-//		BreakdownElement parent = element.getSuperActivities(); 
-//		while ( parent != null ) {
-//			items.add(0, parent);
-//			if (LibraryUtil.isProcess(parent) ) {
-//				break;
-//			}
-//			parent = parent.getSuperActivities();
-//		}
-//
-//		return items;
-//	}
-	
-	/**
-	 * Returns all structural features for the given method element
-	 * @param element
-	 * @return
-	 */
-	public static List getStructuralFeatures(MethodElement element) {
-		List properties = element.getInstanceProperties();
-
-		if (properties != null) {
-			List<EStructuralFeature> features = new ArrayList<EStructuralFeature>();
-			// get all features
-			for (int i = 0; i < properties.size(); i++) {
-				EProperty property = (EProperty) properties.get(i);
-				if (property != null) {
-					EStructuralFeature feature = property
-							.getEStructuralFeature();
-					features.add(feature);
-				}
-			}
-			return features;
-		} else
-			return null;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/Log.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/Log.java
deleted file mode 100644
index aa6f697..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/Log.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.library.LibraryPlugin;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class Log {
-
-	public static final boolean DEBUG = LibraryPlugin.getDefault()
-			.isDebugging();
-
-	public static final Logger INSTANCE = LibraryPlugin.getDefault()
-			.getLogger();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/MigrationUtil.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/MigrationUtil.java
deleted file mode 100644
index 5bf0937..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/MigrationUtil.java
+++ /dev/null
@@ -1,243 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Helper utilities for the Migration Service.
- *
- * @author Kelvin Low
- * @since  1.0
- */
-public class MigrationUtil {
-
-	/**
-	 * Returns a map of all the <code>CapabilityPattern</code> and <code>DeliveryProcess</code>
-	 * in the current Method Library.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getProcesses() {
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		List methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator i = methodPlugins.iterator(); i.hasNext(); ) {
-			MethodPlugin methodPlugin = (MethodPlugin)i.next();
-			String capabilityPatternPaths[] = ModelStructure.DEFAULT.capabilityPatternPath;
-			MethodPackage methodPackage  = UmaUtil.findMethodPackage(methodPlugin, capabilityPatternPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				if (methodPackage instanceof ProcessPackage) {
-					getCapabilityPatterns((ProcessPackage)methodPackage, result);
-				}
-			}
-			String deliveryProcessPaths[] = ModelStructure.DEFAULT.deliveryProcessPath;
-			methodPackage = UmaUtil.findMethodPackage(methodPlugin, deliveryProcessPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				if (methodPackage instanceof ProcessPackage) {
-					getDeliveryProcesses((ProcessPackage)methodPackage, result);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a map of all <code>CapabilityPattern</code> in the current Method Library.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getCapabilityPatterns() {
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		List methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator i = methodPlugins.iterator(); i.hasNext(); ) {
-			MethodPlugin methodPlugin = (MethodPlugin)i.next();
-			String capabilityPatternPaths[] = ModelStructure.DEFAULT.capabilityPatternPath;
-			MethodPackage methodPackage  = UmaUtil.findMethodPackage(methodPlugin, capabilityPatternPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				getCapabilityPatterns((ProcessPackage)methodPackage, result);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a map of all the <code>DeliveryProcess</code> in the current Method Library.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getDeliveryProcesses() {
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		List methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator i = methodPlugins.iterator(); i.hasNext(); ) {
-			MethodPlugin methodPlugin = (MethodPlugin)i.next();
-			String deliveryProcessPaths[] = ModelStructure.DEFAULT.deliveryProcessPath;
-			MethodPackage methodPackage = UmaUtil.findMethodPackage(methodPlugin, deliveryProcessPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				getDeliveryProcesses((ProcessPackage)methodPackage, result);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a map of all the contexts associated with a process.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getContexts(Process process) {
-		if (process == null) {
-			return null;
-		}
-
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		MethodConfiguration defaultContext = process.getDefaultContext();
-		if (defaultContext != null) {
-			result.put(defaultContext.getName(), defaultContext);
-		}
-
-		List contexts = process.getValidContext();
-		for (Iterator i = contexts.iterator(); i.hasNext(); ) {
-			MethodConfiguration context = (MethodConfiguration)i.next();
-			if (context != null) {
-				result.put(context.getName(), context);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Add a map of all <code>CapabilityPattern</code> in a given <code>ProcessPackage</code>.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	protected static void getCapabilityPatterns(ProcessPackage processPackage, Map result) {
-		List childPackages = processPackage.getChildPackages();
-		for (Iterator i = childPackages.iterator(); i.hasNext(); ) {
-			Object obj = i.next();
-			if (obj instanceof ProcessComponent) {
-				ProcessComponent processComponent = (ProcessComponent)obj;
-				Process process  = processComponent.getProcess();
-				if (process instanceof CapabilityPattern) {
-					String name = process.getName();
-					result.put(name, process);
-				}
-			}
-			else if (obj instanceof ProcessPackage) {
-				getCapabilityPatterns((ProcessPackage)obj, result);
-			}
-		}
-	}
-
-	/**
-	 * Add a map of all <code>DeliveryProcess</code> in a given <code>ProcessPackage</code>.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	protected static void getDeliveryProcesses(ProcessPackage processPackage, Map result) {
-		List childPackages = processPackage.getChildPackages();
-		for (Iterator i = childPackages.iterator(); i.hasNext(); ) {
-			Object obj = i.next();
-			if (obj instanceof ProcessComponent) {
-				ProcessComponent processComponent = (ProcessComponent)obj;
-				Process process  = processComponent.getProcess();
-				if (process instanceof DeliveryProcess) {
-					String name = process.getName();
-					result.put(name, process);
-				}
-			}
-			else if (obj instanceof ProcessPackage) {
-				getDeliveryProcesses((ProcessPackage)obj, result);
-			}
-		}
-	}
-	
-	public static Map getActivities(Process process){
-		return getActivities(process, false);
-	}
-	
-	public static Map getActivities(Process process, boolean linkedHashMap){
-		Map result = linkedHashMap ? new LinkedHashMap() : new TreeMap();
-		MethodConfiguration defaultContext = process.getDefaultContext();
-		ProcessConfigurator filter = new ProcessConfigurator(defaultContext);
-		getActivities(process, result, filter);
-		return result;
-	}
-	
-	/**
-	 * Method returns List of activities (recursively) for particular configuration 
-	 * under a Process (<code>DeliveryProcess</code> or <code>CapabilityPattern</code>).  
-	 *  @param Activity
-	 *  @param Map
-	 *  @param ProcessConfigurator
-	 */
-	protected static void getActivities(Activity process, Map result, ProcessConfigurator filter){
-		result.put(process.getName(), process);
-		List list = process.getBreakdownElements();
-		if(list.size() > 0){
-			for(Iterator iterator = list.iterator(); iterator.hasNext();){
-				Object object = iterator.next();
-				if(object instanceof Activity){
-					if(filter != null && filter.accept(object)){
-						result.put(((Activity)object).getName(), object);
-					}
-					if(object instanceof Activity){
-						getActivities((Activity)object, result, filter);
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ModelStorage.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ModelStorage.java
deleted file mode 100644
index 7f058e2..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ModelStorage.java
+++ /dev/null
@@ -1,289 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.persistence.ILibraryResourceSet;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class ModelStorage {
-	
-	/**
-	 * return the MethodPlugins in the current MethodLibrary
-	 * @return List
-	 */
-	public static List getBaseModels() {
-		MethodLibrary lib = LibraryService.getInstance().getCurrentMethodLibrary();
-		if (lib != null)
-			return new ArrayList(lib.getMethodPlugins());
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * create a new MethodLibrary and return the associated Resource
-	 * 
-	 * @param resourceSet MultiFileResourceSetImpl
-	 * @param name String
-	 * @param dir String
-	 * @param bMultiple boolean
-	 * @return Resource
-	 * @throws Exception
-	 */
-	public static Resource newLibrary(ILibraryResourceSet resourceSet,
-			String name, String dir, boolean bMultiple) throws Exception {
-		String lib_filename = null;
-		// Map options = new
-		// HashMap(MultiFileResourceSetImpl.DEFAULT_SAVE_OPTIONS);
-		if (bMultiple) {
-			lib_filename = MultiFileSaveUtil.DEFAULT_LIBRARY_MODEL_FILENAME;
-			// options.put(MultiFileXMISaveImpl.MULTI_FILE, Boolean.TRUE);
-		} else {
-			lib_filename = name;
-		}
-		resourceSet.unload();
-		Resource res = resourceSet.createResource(URI.createFileURI(dir
-				+ File.separator + lib_filename));
-		MethodLibrary lib = UmaFactory.eINSTANCE.createMethodLibrary();
-		lib.setName(name);
-		res.getContents().add(lib);
-		resourceSet.save(null);
-		return res;
-	}
-	
-	/**
-	 * initialize a new method plugin
-	 * @param emptyModel MethodPlugin
-	 * @return MethodPlugin
-	 */
-	public static MethodPlugin initialize(MethodPlugin emptyModel) {
-		emptyModel.setUserChangeable(Boolean.TRUE);
-
-		createContentPackages(emptyModel, ModelStructure.DEFAULT_DOMAIN_PATH);
-		createContentPackages(emptyModel,
-				ModelStructure.DEFAULT.disciplineDefinitionPath);
-		createContentPackages(emptyModel, ModelStructure.DEFAULT.roleSetPath);
-		createContentPackages(emptyModel,
-				ModelStructure.DEFAULT.coreContentPath);
-		createContentPackages(emptyModel,
-				ModelStructure.DEFAULT.workProductTypePath);
-		createContentPackages(emptyModel, ModelStructure.DEFAULT.toolPath);
-		createContentPackages(emptyModel,
-				ModelStructure.DEFAULT.standardCategoryPath);
-
-		ContentPackage contentPkg = createContentPackages(emptyModel,
-				ModelStructure.DEFAULT.customCategoryPath);
-		TngUtil.createRootCustomCategory(contentPkg);
-
-		// create DeliveryProcesses process package
-		//
-		ProcessPackage pkg = UmaFactory.eINSTANCE.createProcessPackage();
-		pkg.setName(ModelStructure.DEFAULT.deliveryProcessPath[0]);
-		emptyModel.getMethodPackages().add(pkg);
-
-		// create ProcessContributions process package
-		//
-		ModelStructure.createProcessContributionPackage(emptyModel);
-
-		// create CapabilityPatterns process package
-		//
-		pkg = UmaFactory.eINSTANCE.createProcessPackage();
-		int len = ModelStructure.DEFAULT.capabilityPatternPath.length - 1;
-		pkg.setName(ModelStructure.DEFAULT.capabilityPatternPath[len]);
-		String[] path = new String[len];
-		System.arraycopy(ModelStructure.DEFAULT.capabilityPatternPath, 0, path,
-				0, len);
-		ContentPackage contPkg = UmaUtil.findContentPackage(emptyModel, path);
-		contPkg.getChildPackages().add(pkg);
-
-		// // create inherited domains
-		// //
-		// List allBase = Misc.getAllBase(emptyModel);
-		// // System.out.println("ModelStorage.initialize(): allBase="+allBase);
-		// for(Iterator iter = allBase.iterator(); iter.hasNext();) {
-		// MethodPlugin basePlugin = (MethodPlugin) iter.next();
-		// ContentPackage baseDomainPkg = UmaUtil.findContentPackage(basePlugin,
-		// ModelStructure.DEFAULT_DOMAIN_PATH);
-		// InheritedCategoryPackageListener listener = new
-		// InheritedDomainPackageListener(domainPkg);
-		// baseDomainPkg.eAdapters().add(listener);
-		// for (Iterator iterator =
-		// baseDomainPkg.getContentElements().iterator(); iterator.hasNext();) {
-		// Object element = (Object) iterator.next();
-		// if(element instanceof Domain) {
-		// ContentCategory category = (ContentCategory) element;
-		// if(category.getVariabilityBasedOnElement() == null) {
-		// // this category is not a inherited one, can be added.
-		// //
-		// domainPkg.getContentElements().add(listener.createInherited((ContentCategory)
-		// element));
-		// }
-		// }
-		// }
-		// }
-
-		// TODO: test on-fly creation of category contributor
-		// MethodPluginItemProvider itemProvider = (MethodPluginItemProvider)
-		// TngAdapterFactory.INSTANCE.getNavigatorView_ComposedAdapterFactory().adapt(emptyModel,
-		// ITreeItemContentProvider.class);
-		// itemProvider.addInheritedCategories();
-
-		return emptyModel;
-	}
-
-	/**
-	 * @param path
-	 * @param emptyModel
-	 */
-	private static ContentPackage createContentPackages(MethodPlugin model,
-			String[] path) {
-		List list = model.getMethodPackages();
-		ContentPackage pkg = UmaUtil.findContentPackage(list, path[0]);
-		if (pkg == null) {
-			pkg = UmaFactory.eINSTANCE.createContentPackage();
-			pkg.setName(path[0]);
-			list.add(pkg);
-		}
-		for (int i = 1; i < path.length; i++) {
-			list = pkg.getChildPackages();
-			pkg = UmaUtil.findContentPackage(list, path[i]);
-			if (pkg == null) {
-				pkg = UmaFactory.eINSTANCE.createContentPackage();
-				pkg.setName(path[i]);
-				list.add(pkg);
-			}
-		}
-		return pkg;
-	}
-
-	/**
-	 * load the containment proxies for the object
-	 * @param obj EObject
-	 */
-	public static void loadContainmentProxies(EObject obj) {
-		// for(TreeIterator iter = obj.eAllContents(); iter.hasNext();) {
-		List list = obj.eContents();
-		for (int i = 0; i < list.size(); i++) {
-			InternalEObject o = (InternalEObject) list.get(i);
-			// InternalEObject o = (InternalEObject)iter.next();
-			if (o.eProxyURI() != null) {
-				System.out.println("proxy URI = " + o.eProxyURI()); //$NON-NLS-1$
-				ResourceSet resourceSet = o.eResource().getResourceSet();
-				Resource res = resourceSet.getResource(o.eProxyURI(), true);
-				InternalEObject resolvedObj = null;
-				try {
-					resolvedObj = (InternalEObject) res.getContents().get(0);
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-				System.out.println("resolvedObj = " + resolvedObj); //$NON-NLS-1$
-				System.out.println("-----------------------------------"); //$NON-NLS-1$
-				if (resolvedObj != null) {
-					EcoreUtil.replace(o, resolvedObj);
-					((BasicEList) res.getContents()).setData(1,
-							new Object[] { resolvedObj });         
-					o = resolvedObj;
-				}
-			}
-			loadContainmentProxies(o);
-		}
-	}
-
-	/**
-	 * load all proxies for the object
-	 * @param obj EObject
-	 */
-	public static void loadAllProxies(EObject obj) {
-		for (Iterator iter = obj.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-			for (Iterator iterator = element.eCrossReferences().iterator(); iterator
-					.hasNext();) {
-				iterator.next();
-			}
-		}
-
-		// loadContainmentProxies(obj);
-		// loadCrossReferenceProxies(obj);
-	}
-
-	/**
-	 * load all cross reference proxies for the object
-	 * @param obj EObject
-	 */
-	public static void loadCrossReferenceProxies(EObject obj) {
-		List list = obj.eCrossReferences();
-		int size = list.size();
-		for (int i = 0; i < size; i++) {
-			EObject o = (EObject) list.get(i);
-			loadCrossReferenceProxies(o);
-		}
-	}
-
-	/**
-	 * find a MethodElement with the given element name in the element list
-	 * @param methodElements The element list
-	 * @param name String
-	 * @return MethodElement
-	 */
-	public static MethodElement findMethodElement(List methodElements,
-			String name) {
-		int size = methodElements.size();
-		for (int i = 0; i < size; i++) {
-			MethodElement element = (MethodElement) methodElements.get(i);
-			if (name.equals(element.getName()))
-				return element;
-		}
-		return null;
-	}
-
-	/**
-	 * get of index int he list location for the element with the given name.
-	 * @param methodElements List
-	 * @param name String
-	 * @return int
-	 */
-	public static int indexOf(List methodElements, String name) {
-		int size = methodElements.size();
-		for (int i = 0; i < size; i++) {
-			MethodElement element = (MethodElement) methodElements.get(i);
-			if (name.equals(element.getName()))
-				return i;
-		}
-		return -1;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/PluginReferenceChecker.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/PluginReferenceChecker.java
deleted file mode 100644
index 754af77..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/PluginReferenceChecker.java
+++ /dev/null
@@ -1,147 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * utility class to check plugin references
- * @author ???
- * @since 1.0
- */
-public class PluginReferenceChecker {
-
-	/**
-	 * 
-	 * @return List
-	 */
-//	public static List checkCircularDependentPluginsInLibrary() {
-//		List cdList = new ArrayList();
-//
-//		List allPluginList = ModelStorage.getBaseModels();
-//		for (Iterator iter = allPluginList.iterator(); iter.hasNext();) {
-//			MethodPlugin element = (MethodPlugin) iter.next();
-//			if (hasCircularConflictWithPlugin(element))
-//				cdList.add(element);
-//		}
-//		return cdList;
-//	}
-
-	/**
-	 * 
-	 * @param aPlugin
-	 * @return boolean
-	 */
-	public static boolean hasCircularConflictWithPlugin(MethodPlugin aPlugin) {		
-//		boolean answer = false;
-//
-//		List allowableBaseList = getApplicableBasePlugins(aPlugin);
-//		List extendedBaseList = aPlugin.getBases();
-//
-//		if (!allowableBaseList.containsAll(extendedBaseList)) {
-//			System.out
-//					.println("$$$: circular dependency detected for " + aPlugin.getName()); //$NON-NLS-1$
-//			printPluginList("allowable plugin list", allowableBaseList); //$NON-NLS-1$
-//			printPluginList("current base list", extendedBaseList); //$NON-NLS-1$
-//			answer = true;
-//		}
-//
-//		return answer;
-		
-		for (Iterator iter = aPlugin.getBases().iterator(); iter.hasNext();) {
-			Object base = (Object) iter.next();
-			if(!DependencyChecker.checkCircularDependency(aPlugin, UmaPackage.Literals.METHOD_PLUGIN__BASES, base).isOK()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * 
-	 * @param aPlugin
-	 * @return List
-	 */
-	public static List getApplicableBasePlugins(MethodPlugin aPlugin) {
-		List models = ModelStorage.getBaseModels();
-
-		List descendantList = getDescendants(aPlugin);
-		for (Iterator iter = descendantList.iterator(); iter.hasNext();) {
-			MethodPlugin element = (MethodPlugin) iter.next();
-			if (aPlugin.getBases().contains(element)) {		//part of 170367: allow it to show for unselect
-				continue;
-			}
-			models.remove(element);
-		}
-
-		return models;
-	}
-
-	// those two getDescendants() methods should be moved into lower layer
-	private static List getDescendants(MethodPlugin methodObject) {
-		List descendantList = new ArrayList();
-
-		List objList = new ArrayList();
-		objList.add(methodObject);
-
-		getDescendants(descendantList, objList);
-
-		return descendantList;
-	}
-
-	private static List getDescendants(List allDescendantList,
-			List methodObjectList) {
-		if (methodObjectList.isEmpty())
-			return allDescendantList;
-
-		List combDescendantList = new ArrayList();
-
-		for (Iterator iter = methodObjectList.iterator(); iter.hasNext();) {
-			MethodPlugin element = (MethodPlugin) iter.next();
-			List descendantList = AssociationHelper
-					.getPluginDirectExtensions(element);
-			combDescendantList.addAll(descendantList);
-
-		}
-
-		allDescendantList.addAll(methodObjectList);
-		List nextCheckList = new ArrayList();
-		for (Iterator iter = combDescendantList.iterator(); iter.hasNext();) {
-			Object element = iter.next();
-			if (!allDescendantList.contains(element))
-				nextCheckList.add(element);
-		}
-
-		return getDescendants(allDescendantList, nextCheckList);
-	}
-
-	/**
-	 * 
-	 * @param desc
-	 * @param pluginList
-	 */
-	public static void printPluginList(String desc, List pluginList) {
-		System.out.print("$$$ " + desc + ": ["); //$NON-NLS-1$ //$NON-NLS-2$
-		for (Iterator iterator = pluginList.iterator(); iterator.hasNext();) {
-			MethodPlugin plugin = (MethodPlugin) iterator.next();
-			System.out.print(plugin.getName() + ", "); //$NON-NLS-1$
-		}
-		System.out.println("]"); //$NON-NLS-1$
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ResourceHelper.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ResourceHelper.java
deleted file mode 100644
index 8c4ae20..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ResourceHelper.java
+++ /dev/null
@@ -1,1846 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URLDecoder;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.common.xml.XSLTProcessor;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.DefaultContentValidator;
-import org.eclipse.epf.library.layout.IContentValidator;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.layout.LinkInfo;
-import org.eclipse.epf.library.layout.elements.ActivityLayout;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.layout.util.XmlHelper;
-import org.eclipse.epf.persistence.MethodLibraryPersister;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ResourceHelper {
-
-	// public static final String BRACE_REPLACEMENT = "_BR_"; //$NON-NLS-1$
-	// public static final String OPENBRACE_STRING = "\\{"; //$NON-NLS-1$
-
-	public static final String URL_BOOKMARK_INDICATOR = "#"; //$NON-NLS-1$
-
-	public static final String URL_PARAMETER_INDICATOR = "?"; //$NON-NLS-1$
-
-	public static final String URL_PARAMETER_PROCESS = "proc"; //$NON-NLS-1$
-
-	public static final String URL_STR_JAVASCRIPT = "javascript:"; //$NON-NLS-1$
-
-	public static final String URL_STR_MAILTO = "mailto:"; //$NON-NLS-1$
-
-	public static final String URL_PARAMETER_PATH = "path"; //$NON-NLS-1$
-
-	public static final String TAG_ATTR_NAME = "name"; //$NON-NLS-1$
-
-	public static final String TAG_ATTR_KEY = "key"; //$NON-NLS-1$
-
-	public static final String TAG_ATTR_TEXT = "text"; //$NON-NLS-1$
-
-	public static final String TAG_ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	public static final String TAG_ATTR_GUID = "guid"; //$NON-NLS-1$
-
-	public static final String TAG_ATTR_HREF = "href"; //$NON-NLS-1$
-
-	public static final String TAG_ATTR_VALUE_INDEX = "index"; //$NON-NLS-1$
-
-	public static final String FILE_EXT_HTML = ".html"; //$NON-NLS-1$
-
-	public static final String FILE_EXT_HTM = ".htm"; //$NON-NLS-1$
-
-	public static final String FILE_EXT_JPEG = ".jpeg"; //$NON-NLS-1$
-
-	public static final String MISSING_PAGES_FOLDER = "pages_not_installed/"; //$NON-NLS-1$
-
-	public static final String ELEMENT_LINK_CLASS_elementLink = "elementLink"; //$NON-NLS-1$
-
-	public static final String ELEMENT_LINK_CLASS_elementLinkWithType = "elementLinkWithType"; //$NON-NLS-1$
-
-	public static final String ELEMENT_LINK_CLASS_elementLinkWithUserText = "elementLinkWithUserText"; //$NON-NLS-1$
-
-	public static final String RESOURCE_FOLDER = MethodLibraryPersister.RESOURCE_FOLDER;
-
-	public static final Pattern p_html_file_name = Pattern
-			.compile("(.*),(.*)\\.html"); //$NON-NLS-1$
-
-	// this one does not work when containing non-english characters, use the
-	// more general one
-	// public static final Pattern p_link_ref =
-	// Pattern.compile("<a\\s+?([^>]*)>(.*?)</a>", Pattern.CASE_INSENSITIVE |
-	// Pattern.DOTALL); //$NON-NLS-1$
-	public static final Pattern p_link_ref = Pattern
-			.compile(
-					"<a\\s+?(.*?)>(.*?)</a>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_template_attachment_url = Pattern
-			.compile(
-					"<a\\s+?href\\s*?=\\s*?\"(.*?)\"\\s*?>(.*?)</a>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-//	public static final Pattern p_area_ref = Pattern
-//			.compile(
-//					"<area.*?(href\\s*=\\s*\"(.*?)\")", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-	public static final Pattern p_area_ref = Pattern
-	.compile(
-			"<area\\s+?(.*?)/?>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_link_ref_gen = Pattern
-			.compile(
-					"<(a|area)\\s+?([^>]*)>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_link_type_picker = Pattern
-			.compile(
-					" class\\s*?=\\s*?(.*?)\\s+", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_link_guid_picker = Pattern
-			.compile(
-					" guid\\s*?=\\s*?(.*?)\\s+", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_link_href_picker = Pattern
-			.compile(
-					" href\\s*?=\\s*?\"(.*?)\"\\s+", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_tag_ref = Pattern
-			.compile(
-					"<([^>!]*)(\\n|\\r)([^>]*)>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_image_ref = Pattern
-			.compile(
-					"(<(img|iframe).*?src\\s*=\\s*\")(.*?)(\")", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_url_decoder = Pattern
-			.compile(
-					"(<[^>]*?(src|href)\\s*=\\s*\")(.*?)(\"[^>]*?>)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_tag_attributes = Pattern
-	.compile(
-			"([\\S&&[^=]]+)\\s*=\\s*([\\S&&[^\"]]+|\"([\\S &&[^\"]]+)\")", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	public static final Pattern p_css_ref = Pattern.compile(
-			" url\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	// define constants for diagram type.
-	// This will be used when linking diagrams into published contents
-	// Activity diagram
-	public static final String DIAGRAM_TYPE_WORKFLOW = "Activity"; //$NON-NLS-1$
-
-	// activity detail diagram
-	public static final String DIAGRAM_TYPE_ACTIVITY_DETAIL = "ActivityDetail"; //$NON-NLS-1$
-
-	// WPDependency diagram
-	public static final String DIAGRAM_TYPE_WP_DEPENDENCY = "WPDependency"; //$NON-NLS-1$
-
-	private static ILibraryResourceManager defaultResourceMgr;
-		
-	public ResourceHelper() {
-	}
-
-	public static synchronized void setDefaultResourceMgr(ILibraryResourceManager mgr) {
-		defaultResourceMgr = mgr;
-	}
-	
-	public static synchronized ILibraryResourceManager getDefaultResourceMgr() {
-		return defaultResourceMgr;
-	}
-	
-	public static ILibraryResourceManager getResourceMgr(MethodElement element) {
-		MethodLibrary lib = UmaUtil.getMethodLibrary(element);
-		if ( lib != null ) {
-			ILibraryManager libMgr = LibraryService.getInstance().getLibraryManager(lib);
-			if (libMgr == null) {
-				lib = LibraryService.getInstance().getCurrentMethodLibrary();
-				libMgr = LibraryService.getInstance().getLibraryManager(lib);
-			}
-			if (libMgr == null) {
-				return getDefaultResourceMgr();
-			}
-			return libMgr.getResourceManager();
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * the relative path of the resource folder of the plugin in the library,
-	 * relative to the library root
-	 * 
-	 * @param element
-	 * @return String
-	 */
-	public static String getPluginResourcePath(MethodElement element) {
-		ILibraryResourceManager resMgr = getResourceMgr(element);
-		if ( resMgr != null ) {
-			MethodPlugin plugin = UmaUtil.getMethodPlugin(element);
-			if (plugin == null) {
-				return resMgr.getLogicalResourcePath(element);
-			} else {
-				return resMgr.getLogicalResourcePath(plugin);
-			}
-		}
-		
-		return null;
-	}
-
-	/**
-	 * get the relative path of the resource folder of the element in the
-	 * library, relative to the library root
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getElementResourcePath(MethodElement element) {
-		ILibraryResourceManager resMgr = getResourceMgr(element);
-		if ( resMgr != null ) {
-			return resMgr.getLogicalResourcePath(element);
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * Gets the absolute path of the resource folder of the element in the library.
-	 * 
-	 * @param e
-	 * @return absolute path of the element's resource folder
-	 */
-	public static String getAbsoluteElementResourcePath(MethodElement element) {
-		ILibraryResourceManager resMgr = getResourceMgr(element);
-		if ( resMgr != null ) {
-			return resMgr.getPhysicalResourcePath(element);
-		}
-		
-		return null;
-	}
-
-	/**
-	 * get the relative path of the folder of the element in the library,
-	 * relative to the library root
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getElementPath(MethodElement element) {
-//		try {
-//			String path = MethodLibraryPersister.INSTANCE.getRelativeElementPath(element);
-//			if (path == null || path.equals("")) //$NON-NLS-1$
-//			{
-//				System.out
-//						.println("Warning! No Path for Element [" + element.getType().getName() + ": " + element.getName() + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-//				return ""; //$NON-NLS-1$
-//			}
-//			return fixPath(path);
-//		} catch (RuntimeException e) {
-//			e.printStackTrace();
-//		}
-//
-//		return ""; //$NON-NLS-1$
-		ILibraryResourceManager resMgr = getResourceMgr(element);
-		if ( resMgr != null ) {
-			return resMgr.getLogicalPath(element);
-		}
-		
-		return null;
-	}
-	
-//	private static IFileBasedLibraryPersister getFileBasedLibraryPersister(MethodElement element) {
-//		Resource resource = element.eResource();
-//		if(resource != null) {
-//			ILibraryPersister persister = LibraryServiceUtil.getPersisterFor(resource);
-//			if(persister instanceof IFileBasedLibraryPersister) {
-//				return ((IFileBasedLibraryPersister)persister);
-//			}
-//		}
-//		return null;
-//	}
-//	
-//	/**
-//	 * Gets the path of a method element's folder relative to its plug-in.
-//	 * 
-//	 * @param element
-//	 * @return
-//	 * @deplicated 
-//	 */
-//	private static String getFolderRelativePath(MethodElement element) {
-//		IFileBasedLibraryPersister persister = getFileBasedLibraryPersister(element);
-//		return persister != null ? persister.getFolderRelativePath(element) : null;
-//	}
-	
-	/**
-	 * Gets the absolute path of a method element's folder.
-	 * 
-	 * @param element
-	 * @return the absolute path
-	 */
-	public static String getFolderAbsolutePath(MethodElement element) {
-//		if ( element == null ) {
-//			return null;
-//		}
-//		
-//		IFileBasedLibraryPersister persister = getFileBasedLibraryPersister(element);
-//		return persister != null ? persister.getFolderAbsolutePath(element) : null;
-		ILibraryResourceManager resMgr = getResourceMgr(element);
-		if ( resMgr != null ) {
-			return resMgr.getPhysicalPath(element);
-		}
-		
-		return null;
-	}
-
-//	/**
-//	 * return the parent folder of the plugin or configuration of the element.
-//	 * or the library root if the element is the MethodLibrary.
-//	 * 
-//	 * @param element MethodElement
-//	 * @return String
-//	 */
-//	public static String getVirtualLibraryRoot(MethodElement element) {
-//		if ( element instanceof MethodLibrary ) {
-//			// default, return the current library path
-//			return LibraryService.getInstance().getCurrentMethodLibraryLocation();					
-//		} 
-//		
-//		String path = null;
-//		if (element instanceof MethodConfiguration ) {
-//			path = getFolderAbsolutePath(element);
-//		} else {
-//			path = getPluginPath(element);
-//		}
-//		
-//		if ( path != null ) {
-//			File f = new File(path);
-//			return f.getParentFile().getAbsolutePath();
-//		}
-//		
-//		return null;
-//	}
-	
-//	/**
-//	 * fix the path by appending a File.seperator to the end of it
-//	 * @param path String
-//	 * @return String
-//	 */
-//	public static String fixPath(String path) {
-//		if (path == null || path.equals("")) //$NON-NLS-1$
-//		{
-//			return ""; //$NON-NLS-1$
-//		} else if (!path.endsWith(File.separator)) {
-//			return path + File.separator;
-//		} else {
-//			return path;
-//		}
-//	}
-
-	
-	/**
-	 * get the element's back path relative to the library root. For example,
-	 * "OpenUP\guidance\concept\c1.xml", the back path is "./../../../"
-	 * 
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getBackPath(MethodElement element) {
-//		// Linux: Browsing and preview shows only plain text.
-//		// There are no images/sections
-//		// element path should check File.separatorChar instead of "\"
-//		String backPath = ""; //$NON-NLS-1$
-//		String path = getElementPath(element);
-//		if (path != null && path.length() > 0) {
-//			backPath = path.replace(File.separatorChar, '/').replaceAll(
-//					".*?/", "\\.\\./"); //$NON-NLS-1$ //$NON-NLS-2$
-//		}
-//		return "./" + backPath; //$NON-NLS-1$
-		
-		ILibraryResourceManager resMgr = getResourceMgr(element);
-		if ( resMgr != null ) {
-			return resMgr.getBackPath(element);
-		}
-		
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * get the file name with the given extension
-	 * 
-	 * @param element MethodElement
-	 * @param ext String the file extenasion, for example, ".html"
-	 * @return String
-	 */
-	public static String getFileName(MethodElement element, String ext) {
-		return getFileName(element, null, null, ext);
-	}
-
-	/**
-	 * get the file name with the given prefix and extension
-	 * @param element MethodElement
-	 * @param namePrefix String prefix for the name
-	 * @param nameSuffix String suffix for the name
-	 * @param ext String file extension, for example, ".html"
-	 * @return String
-	 */	 
-	public static String getFileName(MethodElement element, String namePrefix,
-			String nameSuffix, String ext) {		
-		return FileNameGenerator.INSTANCE.getFileName(element, namePrefix, nameSuffix, ext);
-	}
-
-	/**
-	 * get the guid from the file name, assuming the file name is generated from an element, 
-	 * return null if not found.
-	 * @param fileName String
-	 * @return String
-	 */
-	public static String getGuidFromFileName(String fileName) {
-		return FileNameGenerator.INSTANCE.getGuidFromFileName(fileName);
-	}
-
-	/**
-	 * get the element from the file name, assuming the file name is generated from an element,
-	 * return null if not.
-	 * @param fileName String
-	 * @return MethodElement
-	 */
-	public static MethodElement getElementFromFileName(String fileName) {
-		String guid = getGuidFromFileName(fileName);
-		if (guid != null) {
-			ILibraryManager manager = LibraryService.getInstance()
-					.getCurrentLibraryManager();
-			if (manager != null) {
-				return manager.getMethodElement(guid);
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * get the element url relative to the refElement
-	 * 
-	 * @param element MethodElement
-	 * @param refElement MethodElement
-	 * @param fileExt String file extension
-	 * @param old_url String the old url of the element. If the old url is not null, 
-	 * any bookmark or url parameters are passed to the new url
-	 * @return String String the new element
-	 */
-	public static String getUrl(MethodElement element,
-			MethodElement refElement, String fileExt, String old_url) {
-		String url = getUrl(element, refElement, fileExt);
-
-		// if the old url has bookmark in it, keep it
-		if (old_url != null) {
-			int indx = old_url.indexOf(URL_BOOKMARK_INDICATOR);
-			if (indx < 0) {
-				// keep url query string as well
-				indx = old_url.indexOf(URL_PARAMETER_INDICATOR);
-			}
-
-			if (indx >= 0) {
-				url = url + old_url.substring(indx);
-			}
-		}
-
-		return url;
-	}
-
-	/**
-	 * get the element url relative to the refElement
-	 * 
-	 * @param element MethodElement
-	 * @param refElement MethodElement
-	 * @param fileExt String file extension
-	 * @return String the url
-	 */
-	public static String getUrl(MethodElement element,
-			MethodElement refElement, String fileExt) {
-		if (element == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		if (refElement == null) {
-			return getElementPath(element).replace(File.separatorChar, '/')
-					+ getFileName(element, fileExt);
-		} else {
-			return (getBackPath(refElement) + getElementPath(element)).replace(
-					File.separatorChar, '/')
-					+ getFileName(element, fileExt);
-		}
-	}
-
-	/**
-	 * get the link text for an element
-	 * @param e MethodElement
-	 * @param linkType String
-	 * @return String
-	 */
-	public static String getLinkText(MethodElement e, String linkType) {
-		String linkedText = null;
-		
-		// RTE may change the case of attributes.
-		if ((linkType != null)
-				&& !ELEMENT_LINK_CLASS_elementLinkWithUserText.equalsIgnoreCase(linkType)) {
-			if (ELEMENT_LINK_CLASS_elementLinkWithType.equalsIgnoreCase(linkType)) {
-				linkedText = getElementLinkText(e, true);
-			} else if (ELEMENT_LINK_CLASS_elementLink.equalsIgnoreCase(linkType)) {
-				linkedText = getElementLinkText(e, false);
-			}
-		}
-
-		return linkedText;
-	}
-
-	/**
-	 * get the element link text for the given element
-	 * @param element MethodElement
-	 * @param withType boolean if true the element type string will be included
-	 * @return String
-	 */
-	public static String getElementLinkText(MethodElement element,
-			boolean withType) {
-		String text = TngUtil.getPresentationName(element);
-
-		if (withType) {
-			return getElementTypeText(element) + LibraryResources.colon_with_space + text; 
-		}
-
-		return text;
-	}
-
-	/**
-	 * gte the element type string
-	 * @param element MethodElement
-	 * @return String
-	 */
-	public static String getElementTypeText(MethodElement element) {
-		if (element == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		return TngUtil.getTypeText(element);
-	}
-
-	/**
-	 * auto generated element link <a class="elementLink" href="element_url"
-	 * guid="element_guid">element_type: element_presentation_name</a>
-	 * 
-	 * @param element
-	 *            MethodElement
-	 * @param withType
-	 *            boolean
-	 * @param url
-	 *            String
-	 * @return String
-	 */
-	public static String getElementLink(MethodElement element,
-			boolean withType, String url) {
-		String text = getElementLinkText(element, withType);
-		String linkClass = ELEMENT_LINK_CLASS_elementLink;
-		if (withType)
-			linkClass = ELEMENT_LINK_CLASS_elementLinkWithType;
-		return getElementLink(element, text, url, linkClass);
-	}
-
-	/**
-	 * element link with user specified link text
-	 * 
-	 * @param element
-	 * @param text
-	 * @param url
-	 * @return String
-	 */
-	public static String getElementLink(MethodElement element, String text,
-			String url) {
-		return getElementLink(element, text, url,
-				ELEMENT_LINK_CLASS_elementLinkWithUserText);
-	}
-
-	/**
-	 * element link with user specified link text
-	 * 
-	 * @param element
-	 * @param text
-	 * @param url
-	 * @return String
-	 */
-	public static String getElementLink(MethodElement element, String text,
-			String url, String linkClass) {
-		return "<a class=\"" + linkClass + "\" " + getUrlText(url) + " guid=\"" + element.getGuid() + "\" >" + text + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-	}
-
-	/**
-	 * the passed in url might contain the href attribute with it, or even other
-	 * attributes, so check if this is a pure url or not. return the url href
-	 * term string
-	 * 
-	 * @param url
-	 * @return
-	 */
-	private static String getUrlText(String url) {
-		if (url == null) {
-			url = ""; //$NON-NLS-1$
-		} else {
-			url = url.trim();
-		}
-
-		// starts with href, or contains an href term in it
-		if (url.toLowerCase().startsWith("href") || url.toLowerCase().indexOf(" href") > 0) //$NON-NLS-1$ //$NON-NLS-2$
-		{
-			return url;
-		}
-
-		return "href=\"" + url + "\""; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * validate the content by checking element links and images
-	 * 
-	 * @param element
-	 * @param source
-	 * @return String
-	 */
-	public static String validateContent(MethodElement element, String source) {
-		return validateContent(element, source, new DefaultContentValidator(),
-				null);
-	}
-
-	/**
-	 * check if the link type is element link or not
-	 * @param linkType String
-	 * @return boolean
-	 */
-	public static boolean isElementLink(String linkType) {
-		if (linkType == null || linkType.length() == 0) {
-			return false;
-		}
-
-		// RTE may change the case of attributes.
-		return linkType.equalsIgnoreCase(ELEMENT_LINK_CLASS_elementLink)
-				|| linkType.equalsIgnoreCase(ELEMENT_LINK_CLASS_elementLinkWithType)
-				|| linkType.equalsIgnoreCase(ELEMENT_LINK_CLASS_elementLinkWithUserText);
-	}
-
-	/**
-	 * validate the content by checking element links and images, for the
-	 * specified element owner
-	 * 
-	 * @param element
-	 *            MethodElement, the element that owns the content
-	 * @param content
-	 * @param config
-	 *            MethodConfiguration the configuration to which the content is
-	 *            validated
-	 * @param linkedElements
-	 *            List a passed in list to collect the linked elements in this
-	 *            content, if null, no linked elements are collected.
-	 * @return String the validated content
-	 */
-	public static String validateContent(MethodElement element, String source,
-			IContentValidator validator, MethodConfiguration config) {
-		try {
-			// first validate the tags, remove any CF/LF from the tag text
-			source = validateTag(source);
-
-			StringBuffer sb = new StringBuffer();
-			Matcher m = p_link_ref.matcher(source);
-
-			while (m.find()) {
-				String text = m.group();
-
-				// Problems parsing <a href> tags
-				// need to remove all LF, CR within the <a ..> tag
-				String urltext = m.group(1);
-				String linkedText = m.group(2);
-				LinkInfo info = validator.validateLink(element, urltext,
-						linkedText, config, "a"); //$NON-NLS-1$
-				if (info != null) {
-					text = info.getHtml(validator.showBrokenLinks()).toString();
-					MethodElement e = info.getLinkedElement();
-					if (e != null) {
-						validator.addReferencedElement(element, e);
-					}
-				}
-
-				String replacement = text.replaceAll("file:///", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				replacement = replacement.replaceAll("file://", ""); //$NON-NLS-1$ //$NON-NLS-2$				
-				m.appendReplacement(sb, regExpEscape(replacement));
-			}
-
-			m.appendTail(sb);
-
-			if (element == null) {
-				return sb.toString();
-			}
-
-			// also fix the area map
-			source = sb.toString();
-			m = p_area_ref.matcher(source);
-			sb.setLength(0);
-			while (m.find()) {
-				String text = m.group();
-
-				String urltext = m.group(1);
-				LinkInfo info = validator.validateLink(element, urltext,
-						"", config, "area");  //$NON-NLS-1$ //$NON-NLS-2$
-				if (info != null) {
-					
-					// don't show broken links in area map. Show plan text instead
-					text = info.getHtml(false/*validator.showBrokenLinks()*/).toString();
-					MethodElement e = info.getLinkedElement();
-					if (e != null) {
-						validator.addReferencedElement(element, e);
-					}
-				}
-
-				String replacement = text.replaceAll("file:///", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				replacement = replacement.replaceAll("file://", ""); //$NON-NLS-1$ //$NON-NLS-2$				
-				m.appendReplacement(sb, regExpEscape(replacement));
-			}
-
-			m.appendTail(sb);
-
-			// Shape icon broken in preview and browsing
-			// // need to decode the image path unless we can disable the url
-			// encoding in xslt
-			// source = sb.toString();
-			// sb.setLength(0);
-			// m = ResourceHelper.p_image_ref.matcher(source);
-			// while ( m.find() )
-			// {
-			// String url = m.group(3);
-			// url = URLDecoder.decode(url, "UTF-8");
-			// m.appendReplacement(sb, m.group(1) + url + m.group(4));
-			// }
-			// m.appendTail(sb);
-			// return sb.toString();
-
-			// decode the urls
-			return decodeUrlsInContent(sb.toString());
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-
-		return source;
-	}
-
-	/**
-	 * decode the urls in the content. Content from xslt output are encoded. We
-	 * don't want this to be encoded since the browser may decode it in a wrong
-	 * encoding.
-	 * 
-	 * @param content
-	 * @return String
-	 */
-	public static String decodeUrlsInContent(String content) {
-		try {
-			// Shape icon broken in preview and browsing
-			// need to decode the image path unless we can disable the url
-			// encoding in xslt
-			StringBuffer sb = new StringBuffer();
-			Matcher m = ResourceHelper.p_url_decoder.matcher(content);
-			while (m.find()) {
-				String url = m.group(3);
-				url = URLDecoder.decode(url, "UTF-8"); //$NON-NLS-1$
-				String text = m.group(1) + url + m.group(4);
-				m.appendReplacement(sb, regExpEscape(text)); 	
-			}
-			m.appendTail(sb);
-
-			return sb.toString();
-
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-
-		return content;
-	}
-
-	/**
-	 * escape the regexp reserved words, such as $
-	 * @param text String
-	 * @return String
-	 */
-	public static String regExpEscape(String text) {
-		// escape the regExp reserved words,
-		// the $ sign is reserved for group matching 
-		int i=text.indexOf('$'); 
-		if ( i < 0 ) {
-			return text;
-		}
-		
-		int start = 0;
-		StringBuffer buffer = new StringBuffer();
-		while ( i > start ) {
-			buffer.append(text.substring(start, i)).append("\\"); //$NON-NLS-1$
-			start = i;
-			i=text.indexOf('$', start+1); 
-		}
-		
-		buffer.append(text.substring(start));
-		
-		return buffer.toString();
-	}
-	
-	/**
-	 * fix the element url in the urltext. the text is the part from the
-	 * p_link_ref pattern match
-	 * 
-	 * @param urltext
-	 * @param config
-	 *            MethodConfiguration the configuration to which the content is
-	 *            validated
-	 * @return String the fixed text
-	 */
-	public static String fixElementUrl(MethodElement element, String urltext,
-			MethodConfiguration config) {
-		Matcher m = p_link_href_picker.matcher(" " + urltext + " "); //$NON-NLS-1$ //$NON-NLS-2$
-		StringBuffer sb = new StringBuffer();
-		if (m.find()) {
-			String url = m.group(1);
-			String newurl = null;
-			if (element != null) {
-				String guid = getGuidFromUrl(urltext);
-				if (guid != null) {
-					ILibraryManager manager = LibraryService.getInstance()
-							.getCurrentLibraryManager();
-					MethodElement e = manager != null ? manager
-							.getMethodElement(guid) : null;
-					if (e != null) {
-						if (config != null) {
-							e = ConfigurationHelper.getCalculatedElement(e,
-									config);
-						}
-						newurl = getUrl(e, element, FILE_EXT_HTML, url);
-					}
-
-					// if the element is null, we should remove the url link and
-					// log an error
-					// TODO
-				}
-			}
-
-			if (newurl != null && !newurl.equals(url)) {
-				String replacement = " href=\"" + newurl + "\" "; //$NON-NLS-1$ //$NON-NLS-2$
-				m.appendReplacement(sb, regExpEscape(replacement));
-				m.appendTail(sb);
-				return sb.toString();
-
-			}
-		}
-
-		return urltext;
-	}
-
-	/**
-	 * get the element link type for the url
-	 * @param source String the link
-	 * @return String the type string
-	 */
-	public static String getElementLinkType(String source) {
-		Matcher m = p_link_type_picker.matcher(" " + source + " "); //$NON-NLS-1$ //$NON-NLS-2$
-		if (m.find()) {
-			return m.group(1).trim().replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		return null;
-	}
-
-	/**
-	 * get the guid from the url
-	 * @param source String the url
-	 * @return Strign the guid
-	 */
-	public static String getGuidFromUrl(String source) {
-		Matcher m = p_link_guid_picker.matcher(" " + source + " "); //$NON-NLS-1$ //$NON-NLS-2$
-		if (m.find()) {
-			return m.group(1).trim().replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		m = p_link_href_picker.matcher(" " + source + " "); //$NON-NLS-1$ //$NON-NLS-2$
-		if (m.find()) {
-			String href = m.group(1).trim().replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			return getGuidFromFileName(href);
-		}
-
-		return null;
-	}
-
-	/**
-	 * handle a bug in IE. anchor tag can't have CR LF, like <A \r\n
-	 * href="www.yahoo.com" \r\n> scan the string source, find all anchor tags
-	 * and replace with space.
-	 * 
-	 * @param source
-	 * @return String the fixed source
-	 */
-	public static String validateTag(String source) {
-		// Pattern p_anchor_ref = Pattern.compile("(*+?)=(*.?)",
-		// Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
-
-		StringBuffer sb = new StringBuffer();
-		Matcher m = p_tag_ref.matcher(source);
-		// StringBuffer tempSb = new StringBuffer();
-
-		while (m.find()) {
-			String text = m.group();
-			String replacement = fixTagAttribute(text);
-			m.appendReplacement(sb, regExpEscape(replacement));
-		}
-
-		m.appendTail(sb);
-
-		return sb.toString();
-	}
-
-	/**
-	 * fix tag attribute
-	 * @param source
-	 * @return String
-	 */
-	public static String fixTagAttribute(String source) {
-		// simply replace all CR LF with ' ', fine tune later
-		return source
-				.replaceAll("\\\r\\\n", " ").replaceAll("\\\r", " ").replaceAll("\\\n", " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-	}
-
-//	/**
-//	 * get the resource file url relative to the library root
-//	 * 
-//	 * @param e
-//	 *            MethodElement the element that references this resource
-//	 * @param file
-//	 *            File the resource's physical path
-//	 * @return String the url to this resource from the element
-//	 * @deplicated this method is not valid for distributed library
-//	 */
-//	private static String getResourceFileUrl(MethodElement e, File file) {
-//		String fileUrl = getFileUrl(file);
-//		// String elementPath =
-//		// ResourceHelper.getElementResourcePath(e).replace(File.separatorChar,
-//		// '/');
-//
-//		fileUrl = ResourceHelper.getBackPath(e) + fileUrl;
-//
-//		return fileUrl;
-//
-//	}
-//
-//	/**
-//	 * return the file's relative path to the plugin root
-//	 * 
-//	 * @param f
-//	 * @return String
-//	 * @deplicated this method is not valid for distributed library
-//	 */
-//	private static String getFileUrl(File f) {
-//		String path = getFileRelPath(f);
-//		path = path.replace(File.separatorChar, '/');
-//		return path;
-//	}
-
-//	/**
-//	 * get the URI relative to the specified base
-//	 * 
-//	 * @param uri
-//	 * @return java.net.URI
-//	 */
-//	public static URI getRelativeURI(URI uri, String rootPath) {
-//		return getRelativeURI(uri, new File(rootPath).toURI());
-//	}
-
-	/**
-	 * get the URI relative to the specified base
-	 * 
-	 * @param uri
-	 * @return java.net.URI
-	 * @deplicated
-	 */
-	public static URI getRelativeURI(URI uri, URI relativeTo) {
-		URI relUri = relativeTo.relativize(uri);
-		return relUri;
-	}
-
-//	/**
-//	 * resolve the relative path to the library root
-//	 * 
-//	 * @param f
-//	 * @return String the raltive path
-//	 * @deplicated this method is not valid for distributed library
-//	 */
-//	private static String getFileRelPath(File f) {
-//		File libraryRootPath = new File(LibraryService.getInstance()
-//				.getCurrentMethodLibraryLocation());
-//		String root = libraryRootPath.getAbsolutePath();
-//		String path = f.getAbsolutePath();
-//		if (path.startsWith(root)) {
-//			path = path.substring(root.length());
-//		}
-//
-//		if (path.startsWith(File.separator)) {
-//			path = path.substring(1);
-//		}
-//
-//		return path;
-//	}
-
-//	/**
-//	 * get the URI relative to the library root
-//	 * 
-//	 * @param f
-//	 * @return java.net.URI
-//	 * @deplicated this method is not valid for distributed library
-//	 */
-//	private static java.net.URI getFileRelativeURI(File f) {
-//		File libraryRootPath = new File(LibraryService.getInstance()
-//				.getCurrentMethodLibraryLocation());
-//		java.net.URI libURI = libraryRootPath.toURI();
-//		java.net.URI fileURI = f.toURI();
-//		java.net.URI relUri = libURI.relativize(fileURI);
-//
-//		return relUri;
-//	}
-
-
-
-	/**
-	 * 
-	 * @param element
-	 * @param attachment
-	 * @return String
-	 */
-	public static String getRelativePathToFileFromElement(
-			MethodElement element, File attachment) {
-		String elementLoc = getFolderAbsolutePath(element);	
-		return FileUtil.getRelativePath(attachment, new File(elementLoc));
-	}
-
-	/**
-	 * get the file path name of the type of diagram for the specified element
-	 * 
-	 * @param e
-	 * @param diagramType
-	 *            String diagram type defined in one of the diagram type
-	 *            constants
-	 * @return String the file path relative to the library root
-	 */
-	public static String getDiagramFilePathName(MethodElement e,
-			String diagramType) {
-		// Instances of the same activity/CP share the
-		// same diagram in a Delivery Process
-		// need to make the name unique
-//		return getElementResourcePath(e)
-//				+ StrUtil.removeSpecialCharacters(e.getName())
-//				+ "_" + e.getGuid() + "_" + diagramType + FILE_EXT_JPEG; //$NON-NLS-1$ //$NON-NLS-2$
-		
-		return getElementResourcePath(e)
-		+ FileNameGenerator.INSTANCE.getFileName(e, "", "_" + diagramType, FILE_EXT_JPEG); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	public static String getXmlExportedDiagramImageFileName(MethodElement e, String diagramType, String format) {
-		String str = e.getName() + " " + e.getGuid() + "_" + diagramType + format; //$NON-NLS-1$ //$NON-NLS-2$
-		return str;
-	}
-	
-	public static boolean isAbsolutepath(String path) {
-		
-		if ( path == null ) {
-			return false;
-		}
-		
-		if ( 	path.startsWith("/")  //$NON-NLS-1$
-				|| path.startsWith(File.separator) 
-				|| path.indexOf(":") > 0 ) { //$NON-NLS-1$
-			return true;
-		}
-		
-		return false;
-	}
-	
-	/**
-	 * get the relative path of the file based on the url
-	 * 
-	 * @param url
-	 *            String the url
-	 * @param contentPath
-	 *            String the path of the content that contains this url
-	 * @return String the file path relative to the content publishing root
-	 */
-	public static String getFilePathFromUrl(String url, String contentPath) {
-
-		String filePath = url;
-		if (isExternalLink(filePath)
-				|| filePath.startsWith("mailto:") || filePath.startsWith(URL_BOOKMARK_INDICATOR)) //$NON-NLS-1$ 
-		{
-			return null;
-		}
-
-		int index = filePath.indexOf(NetUtil.FILE_PREFIX_3);
-		if (index == 0) {
-			filePath = filePath.substring(NetUtil.FILE_PREFIX_3.length());
-		}
-
-		index = filePath.indexOf(NetUtil.FILE_PREFIX_2);
-		if (index == 0) {
-			filePath = filePath.substring(NetUtil.FILE_PREFIX_2.length());
-		}
-		
-		if ( isAbsolutepath(filePath) ) {
-			// assume this is an absolute path
-			return url;
-		}
-
-		File f = new File(contentPath);
-		
-		int start = 0;
-		index = 0;
-		while ((f != null) && (index = filePath.indexOf("../", start)) >= 0) //$NON-NLS-1$
-		{
-			f = f.getParentFile();
-			start = index + 3;
-		}
-		
-		String rootFolder = ""; //$NON-NLS-1$
-		if (f != null) {
-			rootFolder = f.getPath();
-		}
-
-		if (rootFolder.length() > 0 && !rootFolder.endsWith(File.separator)) {
-			rootFolder += File.separator;
-		}
-
-		// the file path is
-		String path = rootFolder
-				+ filePath.substring(start).replace('/', File.separatorChar);
-
-		return XMLUtil.unescape(NetUtil.decodedFileUrl(path));
-	}
-
-	/**
-	 * for the given content with url based on the oldContentPath, resolve to
-	 * the path relative to the root of the contentPath. If backpath is
-	 * specified, add the backPath. return the updated content. A typical
-	 * scenario is the content is from a contributing element, which has urls
-	 * relative to the contributing element's contentPath. This method will fix
-	 * the url to based on the base element's contentPath.
-	 * 
-	 * So call fixContentUrlPath(contributor_text, contributor_elementPath,
-	 * baseElement_backPath)
-	 * 
-	 * @param content
-	 * @param contentPath
-	 * @param oldContentPath
-	 * @return String the updated content with fixed path.
-	 */
-	public static String fixContentUrlPath(String content, String contentPath,
-			String backPath) {
-		
-		if ( contentPath == null || backPath == null ) {
-			return content;
-		}
-		
-		StringBuffer sb = new StringBuffer();
-		try {
-			// process images
-			Matcher m = ResourceHelper.p_image_ref.matcher(content);
-			while (m.find()) {
-				String url = m.group(3);
-				url = resolveUrl(url, contentPath, backPath);
-				if (url != null) {
-					m.appendReplacement(sb, regExpEscape(m.group(1) + url + m.group(4)));
-				}
-			}
-			m.appendTail(sb);
-
-			content = sb.toString();
-			sb = new StringBuffer();
-
-			// process attachments
-			m = ResourceHelper.p_link_ref_gen.matcher(content);
-			while (m.find()) {
-				StringBuffer sbLink = new StringBuffer();
-				// String tag = m.group(1);
-				String urltext = " " + m.group(2) + " "; //$NON-NLS-1$ //$NON-NLS-2$
-				if (ResourceHelper.getGuidFromUrl(urltext) == null) {
-					Matcher m2 = ResourceHelper.p_link_href_picker
-							.matcher(urltext);
-					if (m2.find()) {
-						String url = m2.group(1).trim().replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-						url = resolveUrl(url, contentPath, backPath);
-						if (url != null) {
-							String replacement = urltext.substring(m2.start(), m2.start(1))
-									+ url
-									+ urltext.substring(m2.end(1), m2.end());
-							
-							m2.appendReplacement(sbLink, regExpEscape(replacement));
-							m2.appendTail(sbLink);
-							
-							replacement = content.substring(m.start(), m.start(2))
-									+ sbLink.toString() + content.substring(m.end(2), m.end());
-							m.appendReplacement(sb, regExpEscape(replacement));
-						}
-					}
-				}
-
-			}
-			m.appendTail(sb);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * 
-	 * @param url
-	 * @param contentPath
-	 * @param backPath
-	 * @return String
-	 */
-	public static String resolveUrl(String url, String contentPath,
-			String backPath) {
-		String new_url = getFilePathFromUrl(url, contentPath);
-		if (new_url != null && !new_url.equals(url) ) {
-			if (backPath != null) {
-				new_url = backPath + new_url;
-			}
-
-			return new_url.replace(File.separatorChar, '/');
-		}
-
-		return null;
-	}
-
-	private static final String EXTERNAL_URL_START_WITH = LayoutResources
-			.getString("externalUrl_startWith"); //$NON-NLS-1$
-
-	public static final Pattern p_external_url_startWith = Pattern
-			.compile(
-					"(" + EXTERNAL_URL_START_WITH + ")", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * check if this is an external url or not
-	 * @param url
-	 * @return boolean
-	 */
-	public static boolean isExternalLink(String url) {
-		// 162969 - Refine external link's regular exp in epf.library/layout/LayoutResources.properties
-		// file:// should be excluded
-		if ( url == null ) {
-			return false;
-		}
-		
-		url = url.toLowerCase();
-		if ( url.startsWith("file://") ) {  //$NON-NLS-1$
-			return false;
-		}
-		
-		if ( url.startsWith("http://") 	//$NON-NLS-1$
-				|| url.startsWith("https://") //$NON-NLS-1$
-				|| url.startsWith("ftp://")  //$NON-NLS-1$
-				|| url.startsWith("www.") ) { //$NON-NLS-1$
-			return true;
-		}
-		
-		Matcher m = p_external_url_startWith.matcher(url);
-		if (m.find()) {
-			return (m.start(1) == 0);
-		}
-
-		return false;
-	}
-
-	/**
-	 * 
-	 * @param url
-	 * @return boolean
-	 */
-	public static boolean isJavascriptUrl(String url) {
-		if (url == null ) {
-			return false;
-		}
-		return url.startsWith(URL_STR_MAILTO)
-				|| url.toLowerCase().startsWith(URL_STR_JAVASCRIPT);
-	}
-	
-	/**
-	 * find the resource file based on the url, copy the file to the destination
-	 * folder. if the file is an html attachment, scan the file recursively and
-	 * copy contained images, resources.
-	 * 
-	 * @param owner
-	 *            MethodElement, the owner element
-	 * @param resourceFile
-	 *            File, the resource file
-	 * @param url
-	 *            String the url to be processed
-	 * @param contentPath
-	 *            String the content path of the url owner, relative to the
-	 *            source root path
-	 * @param sourceRootPath
-	 *            File the source root path, usually it's the library root path
-	 * @param targetRootPath
-	 *            File the target root path, usually it's the publishing root
-	 *            path
-	 * @param rootContentPath String the content path of the root
-	 * @param processedItems
-	 *            List, a list to hold all processed urls, to avoid duplicate
-	 *            processing
-	 * @param validator
-	 *            IContentValidator
-	 * @return String the fixed url, not used.
-	 */
-	public static String processResourceUrl(MethodElement owner,
-			File resourceFile, String url, String contentPath,
-			File sourceRootPath, File targetRootPath, String rootContentPath, List processedItems,
-			IContentValidator validator) {
-		if (url == null || isExternalLink(url) || isJavascriptUrl(url)
-				|| url.startsWith(URL_BOOKMARK_INDICATOR)) {
-			return url;
-		}
-		
-		// if the url contains the guid, it might be some kind of element link,
-		// for example, activity can have model than one element link
-		String guid = ""; //$NON-NLS-1$
-		if (owner != null) {
-			guid = owner.getGuid();
-			if (url.indexOf(guid) >= 0 || isActivityTabUrl(url) ) {				
-				return url;
-			}			
-		}
-		
-		// Publishing report lists missing resource files that
-		// are present
-		// bookmarks should be stripped out when checking resource
-		int index = url.indexOf(URL_BOOKMARK_INDICATOR);
-		if (index < 0) {
-			index = url.indexOf(URL_PARAMETER_INDICATOR);
-		}
-
-		String url_tail = ""; //$NON-NLS-1$
-		if (index > 0) {
-			url_tail = url.substring(index);
-			url = url.substring(0, index);
-		}
-
-		String imageFile = ResourceHelper.getFilePathFromUrl(url, contentPath);
-		if (imageFile == null) {
-			if (validator != null) {
-				validator.logMissingResource(owner, resourceFile, url);
-			}
-			return null;
-		}
-			
-		// index.htm is the default index file, always ignore it
-		if (imageFile.equalsIgnoreCase("index.htm") || imageFile.equalsIgnoreCase("index.html")) //$NON-NLS-1$ //$NON-NLS-2$
-		{
-			return url + url_tail;
-		}
-
-		String newUrl = url;
-
-		File source;
-		File dest;
-		
-		// if the url is a local file in an absolute path, we don't copy the file, leave as is
-		source = new File(imageFile);
-		if ( source.exists() ) {
-			return url + url_tail;
-		}
-
-		// if root Content path is set, remove from the file path
-		boolean usePubRoot = true;
-		String filePath = imageFile;
-		if ( rootContentPath != null && rootContentPath.length() > 0 ) {
-			if ( filePath.startsWith(rootContentPath) ) {
-				filePath = filePath.substring(rootContentPath.length());
-				usePubRoot = false;
-			}
-		}
-		// check if this is a real file, if not, it is a reference to a base
-		// plugin
-		source = new File(sourceRootPath, filePath);
-		
-		// if the source does not exist, might be a reference to a resource in another plugin?
-		// for example, if the content is contributed from another element in another plugin, this will happen
-		if (!source.exists()) {
-			ILibraryResourceManager mgr = getResourceMgr(owner);
-			if ( mgr != null ) {
-				String tmpPath = mgr.resolve(owner, filePath);
-				if ( tmpPath != null ) {
-					source = new File(tmpPath);
-				}
-			}
-		}
-		
-		// if the file is not in the library, check the plugin layout folder
-		if (!source.exists()) {
-			source = new File(LibraryPlugin.getDefault().getLayoutPath(),
-					filePath);
-		}
-
-		// if the filePath is relative to the pub root, fix the target path
-		if ( usePubRoot && rootContentPath != null && rootContentPath.length() > 0 ) {
-			File tmpf =  new File(rootContentPath);
-			while ( tmpf != null ) {
-				tmpf = tmpf.getParentFile();
-				targetRootPath = targetRootPath.getParentFile();
-			}
-		}
-		
-		dest = new File(targetRootPath, filePath);
-
-		if (source.exists()) {
-			FileUtil.copyFile(source, dest);
-
-			// if the file is an html attachment, need to scan the file and copy
-			// the referenced file in it, recursively
-			if (imageFile.endsWith(ResourceHelper.FILE_EXT_HTM)
-					|| imageFile.endsWith(ResourceHelper.FILE_EXT_HTML)) {
-				File f = new File(imageFile);
-				try {
-					resolveResources(owner, f, FileUtil.readFile(source,
-							FileUtil.ENCODING_UTF_8).toString(), f.getParent(),
-							sourceRootPath, targetRootPath, rootContentPath, processedItems,
-							validator);
-				} catch (Exception ex) {
-					ex.printStackTrace();
-				}
-			}
-		}
-		// if the destination file is there, might be generated dynamically, so
-		// don't log it
-		else if (!dest.exists() && isValidFileUrl(url) && (validator != null)) {
-			validator.logMissingResource(owner, resourceFile, url);
-		}
-
-		return newUrl + url_tail;
-
-	}
-
-	private static boolean isActivityTabUrl(String url) {
-		return ActivityLayout.isActivityTabUrl(url);
-	}
-	
-	private static boolean isValidFileUrl(String url) {
-		// just a temp solution here to get rid of the wrong reporting of mssing
-		// resource
-		if (url == null || url.equals("' + diagram_img + '")) { //$NON-NLS-1$
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * resolve the images in the text. copy the image to destination if needed
-	 * This is used for copying resources from a library to another destination
-	 * 
-	 * @param owner
-	 *            MethodElement, the owner element
-	 * @param resourceFile
-	 *            File, the resource file
-	 * @param content
-	 *            String the content string to be processed
-	 * @param contentPath
-	 *            String the content path of the source text, relative to the
-	 *            source root path
-	 * @param sourceRootPath
-	 *            File the source root path, usually it's the library root path
-	 * @param targetRootPath
-	 *            File the target root path, usually it's the publishing root
-	 *            path
-	 * @param rootContentPath String the content path of the root
-	 * @param processedItems
-	 *            List, a list to hold all processed urls, to avoid duplicate
-	 *            processing
-	 * @param validator
-	 *            IContentValidator
-	 */
-	public static void resolveResources(MethodElement owner, File resourceFile,
-			String content, String contentPath, File sourceRootPath,
-			File targetRootPath, String rootContentPath, List processedItems,
-			IContentValidator validator) {
-		try {
-			// process images
-			Matcher m = ResourceHelper.p_image_ref.matcher(content);
-			while (m.find()) {
-				String url = m.group(3);
-				if (!processedItems.contains(url)) {
-					// note: add the url into the processedItems list first,
-					// otherwise may get deadlock if the url content has
-					// reference back to the owner
-					processedItems.add(url);
-					ResourceHelper.processResourceUrl(owner, resourceFile, url,
-							contentPath, sourceRootPath, targetRootPath, rootContentPath, 
-							processedItems, validator);
-				}
-			}
-
-			m = ResourceHelper.p_css_ref.matcher(content);
-			while (m.find()) {
-				String cssURL = m.group(1);
-
-				// it's hard to tell if this is a right match or not
-				// since we can't tell if the matched one is actually from a css
-				// or just a html text
-				// for example, text can have something like url(xxx) which is
-				// matched here
-				// we don't want to report missing resource for this
-				// so don't set the validator
-				// Publishing warnings: inappropriate warnings
-				// coming from required copyrite.htm
-
-				if (!processedItems.contains(cssURL)) {
-					// note: add the url into the processedItems list first,
-					// otherwise may get deadlock if the url content has
-					// reference back to the owner
-					processedItems.add(cssURL);
-					ResourceHelper
-							.processResourceUrl(owner, resourceFile, cssURL,
-									contentPath, sourceRootPath,
-									targetRootPath, rootContentPath, processedItems, null/* validator */);
-				}
-			}
-
-			// process attachments
-			m = ResourceHelper.p_link_ref_gen.matcher(content);
-			while (m.find()) {
-				// String tag = m.group(1);
-				String urltext = m.group(2);
-				if (ResourceHelper.getGuidFromUrl(urltext) == null) {
-					Matcher m2 = ResourceHelper.p_link_href_picker
-							.matcher(" " + urltext + " "); //$NON-NLS-1$ //$NON-NLS-2$
-					if (m2.find()) {
-						String url = m2.group(1).trim().replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-						if (!processedItems.contains(url)) {
-							// note: add the url into the processedItems list
-							// first, otherwise may get deadlock if the url
-							// content has reference back to the owner
-							processedItems.add(url);
-							ResourceHelper.processResourceUrl(owner,
-									resourceFile, url, contentPath,
-									sourceRootPath, targetRootPath, rootContentPath, 
-									processedItems, validator);
-						}
-					}
-				}
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	/**
-	 * take the tag attributes string as input and returns the attribute
-	 * name-value map
-	 * 
-	 * @param attributesStr
-	 * @return Map the attribute name-value map
-	 */
-	public static Map getTagAttributes(String attributesStr) {
-		try {
-			// use LinkedHashMap to reserve the order of the attributes
-			Map attributeMap = new LinkedHashMap(3);
-			Matcher m2 = p_tag_attributes.matcher(attributesStr);
-
-			while (m2.find()) {
-				String attrName = m2.group(1).trim().toLowerCase();
-				String attrValue = ""; //$NON-NLS-1$
-				if (m2.group(3) != null) {
-					attrValue = m2.group(3).trim();
-				} else if (m2.group(2) != null) {
-					attrValue = m2.group(2).trim();
-				}				
-		
-				// Cannot Preview/Browse Description Tab when
-				// the CP contains chinese characters
-				// generated html from xslt got the href urls encoded. we don't want
-				// that make sure decode the url using "UTF-8" encoding
-				if (attrName.equals(TAG_ATTR_HREF)) {
-					try {
-						attrValue = URLDecoder.decode(attrValue, "UTF-8"); //$NON-NLS-1$
-					} catch (UnsupportedEncodingException e) {
-						e.printStackTrace();
-					}					
-				}
-				attributeMap.put(attrName, attrValue);
-			}
-			return attributeMap;
-		} catch (Exception e) {			
-			e.printStackTrace();
-		}
-		return null;
-	}
-
-	/**
-	 * returns the attribute name-value map for an HTML link
-	 * 
-	 * @param link
-	 * @return Map
-	 */
-	public static Map getAttributesFromLink(String link) {
-		Matcher m = p_link_ref.matcher(link);
-		if (m.find()) {
-			String attributes = m.group(1);
-			return getTagAttributes(attributes);
-		}
-		return null;
-	}
-
-	/**
-	 * returns the attribute name-value map for an HTML link
-	 * 
-	 * @param link
-	 * @return Map
-	 */
-	public static Map getAttributesFromLink(Pattern pattern, String link) {
-		Matcher m = pattern.matcher(link);
-		if (m.find()) {
-			String attributes = m.group(1);
-			return getTagAttributes(attributes);
-		}
-		return null;
-	}
-	
-	/**
-	 * takes an attributeMap (ie, from #getTagAttributes) and returns the String
-	 * representation
-	 * 
-	 * @param attributeMap
-	 * @return String
-	 */
-	public static String getAttributesAsString(Map attributeMap) {
-		StringBuffer buf = new StringBuffer();
-		for (Iterator iter = attributeMap.keySet().iterator(); iter.hasNext();) {
-			String key = (String) iter.next();
-			String value = (String) attributeMap.get(key);
-			if (buf.length() > 0)
-				buf.append(" "); //$NON-NLS-1$
-			buf.append(key + "=\"" + value + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Bad link from Welcome page hump chart
-	 * 
-	 */
-	private static String getDiscardedElementURL(MethodElement ownerElement,
-			MethodElement linkElement, String guid, String pubDir) {
-		StringBuffer discardedElementURL = new StringBuffer();
-
-		discardedElementURL.append(MISSING_PAGES_FOLDER).append(
-				"pages_not_installed").append(FILE_EXT_HTML); //$NON-NLS-1$
-
-		File outputFile = new File(pubDir, discardedElementURL.toString());
-		File dir = outputFile.getParentFile();
-		if (!dir.exists()) {
-			dir.mkdirs();
-		}
-
-		// generate the html file
-		XmlElement xml = new XmlElement("Element"); //$NON-NLS-1$
-
-		xml
-				.setAttribute("guid", guid).setAttribute("type", linkElement.getType().getName()) //$NON-NLS-1$ //$NON-NLS-2$
-				.setAttribute("name", linkElement.getName()) //$NON-NLS-1$
-				.setAttribute(
-						"pluginName", LibraryUtil.getMethodPlugin(linkElement).getName()); //$NON-NLS-1$								
-		String xslPath = LayoutResources.getDefaultXslPath("page_not_installed", null); //$NON-NLS-1$
-
-		try {
-			StringBuffer xml2 = new StringBuffer();
-			xml2.append(XmlHelper.XML_HEADER).append(xml.toXml());
-
-			OutputStreamWriter output = new OutputStreamWriter(
-					new FileOutputStream(outputFile), "utf-8"); //$NON-NLS-1$
-			Properties xslParams = LibraryPlugin.getDefault().getProperties(
-					"/layout/xsl/resources.properties"); //$NON-NLS-1$
-
-			XSLTProcessor
-					.transform(xslPath, xml2.toString(), xslParams, output);
-			output.flush();
-			output.close();
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-
-		return getBackPath(ownerElement).replace(File.separatorChar, '/')
-				+ discardedElementURL.toString();
-	}
-	
-	
-	
-	/**
-	 * FOR USE WITH RICH TEXT EDITOR
-	 * validate the content by checking element links and images, for the
-	 * specified element owner
-	 * 
-	 * This is identical to the validateContent method, except it does not decode the results
-	 * via URLDecoder.decode()
-	 * 
-	 *  this will do the following to the HTML:
-	 *  1.  update Element Links
-	 *  2.  change <A ..> to <a ..>
-	 *  3.  change </A> to </a>
-	 *  4.  add double-quotes (") around all attribute values if they are missing
-	 * 
-	 * @param element
-	 *            MethodElement, the element that owns the content
-	 * @param content
-	 * @param config
-	 *            MethodConfiguration the configuration to which the content is
-	 *            validated
-	 * @param linkedElements
-	 *            List a passed in list to collect the linked elements in this
-	 *            content, if null, no linked elements are collected.
-	 * @return String the validated content
-	 */
-	public static String validateRichTextContent(MethodElement element, String source, IContentValidator validator) {
- 		try {
-			MethodConfiguration config = null;
-			
-			// first validate the tags, remove any CF/LF from the tag text
-			source = validateTag(source);
-
-			StringBuffer sb = new StringBuffer();
-			Matcher m = p_link_ref.matcher(source);
-
-			while (m.find()) {
-				String text = m.group();
-
-				// Problems parsing <a href> tags
-				// need to remove all LF, CR within the <a ..> tag
-				String urltext = m.group(1);
-				String linkedText = m.group(2);
-				LinkInfo info = validator.validateLink(element, urltext,
-						linkedText, config, "a"); //$NON-NLS-1$
-				if (info != null) {
-					text = info.getHtml(validator.showBrokenLinks()).toString();
-					MethodElement e = info.getLinkedElement();
-					if (e != null) {
-						validator.addReferencedElement(element, e);
-					}
-				}
-
-				String replacement = text.replaceAll("file:///", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				replacement = replacement.replaceAll("file://", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				m.appendReplacement(sb, regExpEscape(replacement));
-			}
-
-			m.appendTail(sb);
-
-			if (element == null) {
-				return sb.toString();
-			}
-
-			// also fix the area map
-			source = sb.toString();
-			m = p_area_ref.matcher(source);
-			sb.setLength(0);
-
-			while (m.find()) {
-				String text = m.group();
-
-				// Problems parsing <a href> tags
-				// need to remove all LF, CR within the <a ..> tag
-				String urltext = m.group(1);
-				LinkInfo info = validator.validateLink(element, urltext,
-						"", config, "area"); //$NON-NLS-1$ //$NON-NLS-2$
-				if (info != null) {
-					text = info.getHtml(validator.showBrokenLinks()).toString();
-					MethodElement e = info.getLinkedElement();
-					if (e != null) {
-						validator.addReferencedElement(element, e);
-					}
-				}
-
-				String replacement = text.replaceAll("file:///", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				replacement = replacement.replaceAll("file://", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				m.appendReplacement(sb, regExpEscape(replacement));
-			}
-
-			m.appendTail(sb);
-
-			return sb.toString();
-
-		} catch (Exception ex) {
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-		}
-
-		return source;
-	}
-
-//	/**
-//	 * copy all resource files associated with the element to the target location.
-//	 * recursive all it's contained elements if recursive is true.
-//	 * 
-//	 * @param element
-//	 * @param from
-//	 * @param to
-//	 */
-//	public static void copyAllResources(MethodElement element, File from, File to, boolean recursive) {
-//		
-//		ContentResourceScanner scanner = new ContentResourceScanner(from, to, );
-//		scanner.setTargetRootPath(to);
-//		scanner.copyResources(element);
-//		
-//		if ( recursive ) {
-//			for ( Iterator it = element.eAllContents(); it.hasNext(); ) {
-//				Object obj = it.next();
-//				if ( obj instanceof MethodElement ) {
-//					scanner.copyResources((MethodElement)obj);
-//				}
-//			}
-//		}
-//	}
-	
-	public static String getPluginPath(MethodElement e) {		
-		MethodPlugin plugin = UmaUtil.getMethodPlugin(e);
-		return getFolderAbsolutePath(plugin);
-	}
-
-	public static String getPluginPath(MethodPlugin plugin) {
-		return getFolderAbsolutePath(plugin);
-	}
-	
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ResourceUtil.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ResourceUtil.java
deleted file mode 100644
index d6e33aa..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ResourceUtil.java
+++ /dev/null
@@ -1,544 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.LibraryResources;
-import org.eclipse.epf.library.project.MethodLibraryProject;
-import org.eclipse.epf.persistence.FileManager;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * Helper class for managing the Method Library as a project in the Eclipse
- * workspace.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class ResourceUtil {
-
-	private static final String methodLibraryNature = "org.eclipse.epf.library.project.MethodLibraryProjectNature"; //$NON-NLS-1$
-
-	private static final String[] methodLibraryNatures = { methodLibraryNature };
-
-	private static final boolean debug = LibraryPlugin.getDefault().isDebugging();
-
-	public static final String LOCK_FILENAME = ".lock"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 * @param lib MethodLibrary
-	 * @param monitor IProgressMonitor
-	 * @throws CoreException
-	 * @throws IOException
-	 */
-	public static final void open(MethodLibrary lib, IProgressMonitor monitor)
-			throws CoreException, IOException {
-		open(getLibraryDirectory(lib), monitor);
-	}
-
-	/**
-	 * 
-	 * @param libDir String
-	 * @param monitor IProgressMonitor
-	 * @throws CoreException
-	 * @throws IOException
-	 */
-	public static final void open(String libDir, IProgressMonitor monitor)
-			throws CoreException, IOException {
-		IPath path = new Path(libDir + File.separator
-				+ IProjectDescription.DESCRIPTION_FILE_NAME);
-		IProjectDescription description = null;
-
-		try {
-			description = ResourcesPlugin.getWorkspace()
-					.loadProjectDescription(path);
-		} catch (CoreException exception) {
-			// missing .project file
-			if (debug) {
-				System.out.println("### - exception in loadProjectDescription"); //$NON-NLS-1$
-			}
-		}
-
-		IProject project = null;
-		try {
-			if (description == null) {
-				// .project file is missing - create a new project
-				if (debug) {
-					System.out
-							.println("### - creating new method library project"); //$NON-NLS-1$
-				}
-				project = createValidProjectFromPath(libDir, monitor);
-			} else {
-				// .project file exists
-				if (debug) {
-					System.out
-							.println("### - opening existing method library project " + description.getName()); //$NON-NLS-1$
-				}
-
-				// check if project of this name exists in workspace
-				project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-						description.getName());
-
-				if (!project.exists()) {
-					// project doesn't exist in workspace, so make one with the
-					// project name in .project
-					try {
-						if (debug) {
-							System.out
-									.println("### - creating existing .project " + description.getName() + " in workspace"); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-						project = createProject(libDir, project.getName(),
-								monitor);
-					} catch (CoreException ex) {
-						// failed to make this project in the workspace -
-						// another project may exist in the workspace at this
-						// location
-						// so we need to delete that conflicting project and try
-						// again
-						if (debug) {
-							System.out
-									.println("### - creating existing .project failed - deleting workspace-project in " + //$NON-NLS-1$
-											libDir
-											+ " and creating workspace-project " + project.getName()); //$NON-NLS-1$
-						}
-						deleteProject(libDir, monitor);
-						project = createProject(libDir, project.getName(),
-								monitor);
-					}
-				} else {
-					// project does exist in workspace - make sure location
-					// matches, if not, make a new project
-					if (debug) {
-						System.out
-								.println("### - project " + project.getName() + " exists in workspace"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					if (new File(libDir).compareTo(project.getLocation()
-							.toFile()) != 0) {
-						if (debug) {
-							System.out
-									.println("### - project " + project.getName() + " exists in workspace, but location differs - create a new project"); //$NON-NLS-1$ //$NON-NLS-2$
-						}
-						File projectFile = path.toFile();
-						if (projectFile.canWrite()) {
-							projectFile.delete();
-						} else {
-							// this will cause the caller to display a
-							// messagebox asking the user to make .project
-							// writable
-							// TODO: use our own type of Exception?
-							throw new IOException(
-									"###" + projectFile.getAbsolutePath()); //$NON-NLS-1$
-						}
-						project = createValidProjectFromPath(libDir, monitor);
-					}
-				}
-			}
-			if (project == null) {
-				// libDir must be an invalid path (overlaps workspace?)
-				// TODO: this exception isn't handled well - it shouldn't happen
-				throw new IOException(LibraryResources.invalidLibraryPathError_reason);
-			}
-			project.open(IResource.BACKGROUND_REFRESH, monitor);						
-			
-			// Set lock file as team private member so it will not be shared (added to source control).
-			// This must be done before the project folder got refreshed. So this portion of code must be
-			// executed right after IProject.open() returned. Project must be opened with IResource.BACKGROUND_REFRESH
-			// to prevent lock file from being added to the project before it is set as team private member
-			//
-			File lockFile = new File(libDir, ResourceUtil.LOCK_FILENAME);
-			if(lockFile.exists()) {
-				try {
-					IResource wsRes = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(lockFile.getAbsolutePath()));
-					if(wsRes != null) {
-						wsRes.refreshLocal(IResource.DEPTH_ZERO, null);
-						wsRes.setTeamPrivateMember(true);
-					}
-				} catch (Exception e) {
-					LibraryPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-
-			// monitor for change in the resource
-//			RefreshManager.getInstance().monitor(project);
-
-			description = project.getDescription();
-
-			// make sure project has the MethodLibraryNature
-			String[] existingNatures = description.getNatureIds();
-			if (!(Arrays.asList(existingNatures).contains(methodLibraryNature))) {
-				if (debug) {
-					System.out
-							.println("### - adding methodlibrarynature to " + description.getName()); //$NON-NLS-1$
-				}
-				description.setNatureIds(methodLibraryNatures);
-				project.setDescription(description, IProject.FORCE
-						| IProject.KEEP_HISTORY, monitor);
-			}
-		} catch (CoreException ex) {
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-			throw ex;
-		}
-	}
-
-	/**
-	 * Closes a library's project. It finds the project by locating a project
-	 * with the same location as the library.
-	 * 
-	 * @param lib
-	 * @param monitor
-	 * @throws CoreException
-	 */
-	public static final void close(MethodLibrary lib, IProgressMonitor monitor)
-			throws CoreException {
-//		IProject project = findProject(lib);
-//		if (project != null && project.isOpen()) {
-//			if (debug) {
-//				System.out
-//						.println("### - closing project " + project.getName()); //$NON-NLS-1$
-//			}
-//			project.close(monitor);
-//		} else {
-//			if (debug) {
-//				System.out
-//						.println("### - ERROR closing project for library in \"" + getLibraryDirectory(lib) + "\": project could not be found."); //$NON-NLS-1$ //$NON-NLS-2$
-//			}
-//		}
-		
-		close(getLibraryDirectory(lib), monitor);
-	}
-
-	/**
-	 * 
-	 * @param dir String
-	 * @param monitor IProgressMonitor
-	 * @throws CoreException
-	 */
-	public static final void close(String dir, IProgressMonitor monitor)
-	throws CoreException {
-		IProject project = findProject(dir);
-		if (project != null && project.isOpen()) {
-			if (debug) {
-				System.out
-						.println("### - closing project " + project.getName()); //$NON-NLS-1$
-			}
-			project.close(monitor);
-			
-			// stop monitoring change on the project
-			//
-//			RefreshManager.getInstance().unmonitor(project);
-			
-		} else {
-			if (debug) {
-				System.out
-						.println("### - ERROR closing project for library in \"" + dir + "\": project could not be found."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-		
-	/**
-	 * Locates the project with the same location as the library's directory.
-	 * 
-	 * @param lib MethodLibrary
-	 * @return IProject
-	 */
-	public static IProject findProject(MethodLibrary lib) {
-		return findProject(getLibraryDirectory(lib));
-	}
-
-	/**
-	 * Locatest the project whose location matches the specified directory.
-	 * 
-	 * @param dir String
-	 * @return IProject
-	 */
-	public static IProject findProject(String dir) {
-		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject[] projects = workspace.getRoot().getProjects();
-		try {
-			for (int i = 0; i < projects.length; i++) {
-				IProject project = projects[i];
-				if (new File(dir).compareTo(project.getLocation().toFile()) == 0) {
-					if (debug) {
-						System.out
-								.println("### - found project " + project.getName() + " with location " + dir); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					return project;
-				}
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-		}
-		return null;
-	}
-
-	/**
-	 * Deletes the project whose location is the same as the library.
-	 * 
-	 * @param lib MethodLibrary
-	 * @param monitor IProgressMonitor
-	 * @throws CoreException
-	 */
-	public static final boolean deleteProject(MethodLibrary lib,
-			IProgressMonitor monitor) throws CoreException {
-		return deleteProject(getLibraryDirectory(lib), monitor);
-	}
-
-	/**
-	 * Deletes the project whose location is the same as the given path.
-	 * 
-	 * @param path
-	 * @param monitor
-	 * @return
-	 * @throws CoreException
-	 */
-	private static boolean deleteProject(String path, IProgressMonitor monitor)
-			throws CoreException {
-		// delete any workspace project that exists for this path
-		IProject project = findProject(path);
-		try {
-			if (project != null) {
-				if (debug) {
-					System.out
-							.println("### - deleting project " + project.getName()); //$NON-NLS-1$
-				}
-				if (monitor == null) {
-					monitor = new NullProgressMonitor();
-				}
-				project.delete(IProject.FORCE
-						| IProject.NEVER_DELETE_PROJECT_CONTENT, monitor);
-			}
-		} catch (CoreException ex) {
-			ex.printStackTrace();
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Creates a project for the library.
-	 * 
-	 * @return null if the library is not in a valid project location (ie,
-	 *         overlaps the workspace).
-	 */
-	public static IProject createProject(MethodLibrary lib,
-			IProgressMonitor monitor) {
-		return createValidProjectFromPath(getLibraryDirectory(lib), monitor);
-	}
-
-	/**
-	 * Creates a project for the path specified, using the last path fragment as
-	 * the project name. Will append increasing integers to the project name in
-	 * order to create a valid project. First deletes any workspace project
-	 * whose location is the given path.
-	 * 
-	 * @param path
-	 * @param monitor
-	 * @return IProject
-	 */
-	public static IProject createValidProjectFromPath(String path,
-			IProgressMonitor monitor) {
-		// delete any workspace project that exists for this path
-		IProject project = findProject(path);
-		try {
-			if (project != null) {
-				project.delete(IProject.FORCE
-						| IProject.NEVER_DELETE_PROJECT_CONTENT, monitor);
-			}
-		} catch (CoreException ex) {
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-			return null;
-		}
-
-		String libName = new File(path).getName();
-		String libDir = new File(path).getAbsolutePath();
-
-		String projectName = libName;
-		int i = 2;
-		while (i < 100) {
-			try {
-				project = createProject(libDir, projectName, monitor);
-				if (debug) {
-					System.out
-							.println("### - creating new method library project " + projectName); //$NON-NLS-1$
-				}
-				return project;
-			} catch (CoreException ex) {
-				projectName = new StringBuffer(libName).append(' ').append(i++)
-						.toString();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Attempts to create a project named projectName in the directory dir.
-	 * Throws CoreException if this fails for any reason.
-	 * 
-	 * @param dir
-	 * @param projectName
-	 * @param monitor
-	 * @return
-	 * @throws CoreException
-	 */
-	private static final IProject createProject(String dir, String projectName,
-			IProgressMonitor monitor) throws CoreException {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-
-		// get a project handle
-		IProject newProjectHandle = workspace.getRoot().getProject(projectName);
-		IProjectDescription description = workspace
-				.newProjectDescription(newProjectHandle.getName());
-		description.setNatureIds(methodLibraryNatures);
-		IPath projectPath = new Path(dir);
-		if (!Platform.getLocation().isPrefixOf(projectPath)) {
-			description.setLocation(projectPath);
-		}
-
-		newProjectHandle.create(description, monitor);
-		return newProjectHandle;
-	}
-
-	/**
-	 * Closes all (open) projects that have the MethodLibrary nature
-	 * 
-	 * @param monitor IProgressMonitor
-	 */
-	public static void closeAllMethodLibraryProjects(IProgressMonitor monitor) {
-		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject[] projects = workspace.getRoot().getProjects();
-		try {
-			for (int i = 0; i < projects.length; i++) {
-				IProject project = projects[i];
-				if (project.isOpen()
-						&& project.getNature(methodLibraryNature) != null) {
-					if (debug) {
-						System.out
-								.println("### - closing method library project " + project.getName()); //$NON-NLS-1$
-					}
-					project.close(monitor);
-				}
-			}
-		} catch (CoreException ex) {
-			ex.printStackTrace();
-			LibraryPlugin.getDefault().getLogger().logError(ex);
-		}
-	}
-
-	/**
-	 * 
-	 * @param lib MethodLibrary
-	 * @return String
-	 */
-	public static String getLibraryDirectory(MethodLibrary lib) {
-		return new File(lib.eResource().getURI().toFileString()).getParent();
-	}
-
-	/**
-	 * 
-	 * @param usedResources
-	 * @return Collection
-	 */
-	public static Collection<Resource> getOutOfSyncResources(Collection<Resource> usedResources) {
-		ArrayList<Resource> changedResources = new ArrayList<Resource>();
-		for (Resource resource : usedResources) {
-			String filePath = resource.getURI().toFileString();
-			IResource wsRes = FileManager.getResourceForLocation(filePath);
-			if(wsRes != null && !wsRes.isSynchronized(IResource.DEPTH_ZERO)) {
-				changedResources.add(resource);
-			}
-
-		}
-		return changedResources;
-	}	
-	
-	/**
-	 * 
-	 * @param resources Collection
-	 * @return boolean
-	 */
-	public static boolean hasOutOfSynch(Collection<Resource> resources) {
-		for (Resource resource : resources) {
-			if(resource.getURI().isFile()) {
-				String filePath = resource.getURI().toFileString();
-				IResource wsRes = FileManager.getResourceForLocation(filePath);
-				if(wsRes != null && !wsRes.isSynchronized(IResource.DEPTH_ZERO)) {
-					return true;
-				}
-			}
-		}	
-		return false;
-	}
-	
-	/**
-	 * 
-	 * @param resourcesToCheck Collection
-	 * @param removedResources Collection
-	 * @param changedResources Collection
-	 */
-	public static void checkOutOfSynchResources(Collection resourcesToCheck, 
-			Collection removedResources, Collection changedResources)
-	{
-		for (Iterator iter = resourcesToCheck.iterator(); iter.hasNext();) {
-			Resource resource = (Resource) iter.next();
-			String filePath = resource.getURI().toFileString();
-			IResource wsRes = FileManager.getResourceForLocation(filePath);
-			if(wsRes == null) {
-				removedResources.add(resource);
-			}
-			else if(!wsRes.isSynchronized(IResource.DEPTH_ZERO)) {
-				changedResources.add(resource);
-			}
-
-		}
-	}
-
-	/**
-	 * 
-	 * @param lib MethodLibrary
-	 * @param monitor IProgressMonitor
-	 */
-	public static void refreshResources(MethodLibrary lib, IProgressMonitor monitor) {
-		if(lib != null) {
-			IProject prj = MethodLibraryProject.findProject(lib);
-			if(prj != null) {
-				try {
-					prj.refreshLocal(IResource.DEPTH_INFINITE, monitor);
-				} catch (CoreException e) {
-					LibraryPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/SAXParserXMI.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/SAXParserXMI.java
deleted file mode 100644
index 19933d9..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/SAXParserXMI.java
+++ /dev/null
@@ -1,392 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.library.util;
-
-import java.util.ArrayList;
-import java.util.EmptyStackException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.xml.AbstractSAXParser;
-import org.eclipse.epf.persistence.MultiFileXMISaveImpl.MyEscape;
-import org.xml.sax.Attributes;
-
-
-/**
- * This class parses an XMI file, and stores the data in a HashMap called an
- * "eMap".
- * <p>
- * An eMap has 4 entries:
- * <li>"tag" - the element's tag</li>
- * <li>"attributes" - an ArrayList of the XML attributes. Each attribute is of
- * the form (attribute name),(attribute value)</li>
- * <li>"content" - the element's content</li>
- * <li>"children" - an ArrayList of the element's sub-elements. Each child is
- * an eMap.</li>
- * </p>
- * <p>
- * The root element's eMap is referenced by TNGSAXParserXMI.xmiMap
- * </p>
- * 
- * @author Jeff Hardy
- * @since 1.0
- */
-public class SAXParserXMI extends AbstractSAXParser {
-
-	public HashMap xmiMap;
-
-	// private int elementCount = 0;
-	private Stack stack;
-
-	private MyEscape escape = new MyEscape();
-
-	public SAXParserXMI(Logger logger) {
-		// validating is false since we don't have a DTD
-		super(logger, false);
-	}
-
-	/**
-	 * Called when the XML parser starts to parse the document.
-	 */
-	public void startDocument() {
-		super.startDocument();
-		stack = new Stack();
-	}
-
-	/**
-	 * 
-	 */
-	public void endDocument() {
-		super.endDocument();
-	}
-
-	/**
-	 * 
-	 */
-	public void startElement(String namespaceURL, String localName,
-			String qname, Attributes attributes) {
-		HashMap eMap = new HashMap();
-		try {
-			HashMap parent = (HashMap) stack.peek();
-			((ArrayList) parent.get("children")).add(eMap); //$NON-NLS-1$
-		} catch (EmptyStackException e) {
-			xmiMap = eMap;
-		}
-
-		// put tag
-		eMap.put("tag", qname); //$NON-NLS-1$
-
-		// put attributeMap
-		List attributeList = new ArrayList();
-		if (attributes.getLength() > 0) {
-			for (int i = 0; i < attributes.getLength(); i++) {
-				attributeList.add(attributes.getQName(i)
-						+ "," + attributes.getValue(i)); //$NON-NLS-1$
-			}
-		}
-
-		strBuf = new StringBuffer();
-
-		eMap.put("attributes", attributeList); //$NON-NLS-1$
-
-		eMap.put("children", new ArrayList()); //$NON-NLS-1$
-		stack.push(eMap);
-	}
-
-	public void endElement(String namespaceURL, String localName, String qname) {
-		try {
-			HashMap eMap = (HashMap) stack.peek();
-			List attributeList = (ArrayList) eMap.get("attributes"); //$NON-NLS-1$
-			if (attributeList.size() == 0)
-				if (strBuf.toString().trim().length() > 0) {
-					eMap.put("content", escape.convertLines(strBuf.toString())); //$NON-NLS-1$
-				}
-		} catch (EmptyStackException e) {
-			e.printStackTrace();
-		}
-		stack.pop();
-	}
-
-	/**
-	 * For use with TNGSAXParserXMI. Find a guid's element tag within the XMI
-	 * file.
-	 * 
-	 * @param elementTag
-	 * @param guid
-	 * @param xmiMap
-	 * @return
-	 */
-	public static HashMap findElementTagofGuid(String elementTag, String guid,
-			HashMap xmiMap) {
-		HashMap eMap = SAXParserXMI.findGuid(guid, xmiMap);
-
-		// we have hashmap of the guid's element - search children for the
-		// elementTag
-		Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			HashMap childMap = (HashMap) iter.next();
-			if (SAXParserXMI.getTag(childMap).equals(elementTag))
-				return childMap;
-		}
-		return null;
-	}
-
-	/**
-	 * For use with TNGSAXParserXMI. searches eMap's children for elementTag
-	 * 
-	 * @param elementTag
-	 * @param eMap
-	 * @return HashMap
-	 */
-	public static HashMap getChildElementTag(String elementTag, HashMap eMap) {
-		// search children for the elementTag
-		Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			HashMap childMap = (HashMap) iter.next();
-			if (SAXParserXMI.getTag(childMap).equals(elementTag))
-				return childMap;
-		}
-		return null;
-	}
-
-	/**
-	 * For use with TNGSAXParserXMI. returns Tag of element. Does not return
-	 * null, returns "" instead.
-	 * 
-	 * @param eMap
-	 * @return String
-	 */
-	public static String getTag(HashMap eMap) {
-		String tag = ""; //$NON-NLS-1$
-		if (eMap != null)
-			tag = (String) eMap.get("tag"); //$NON-NLS-1$
-		if (tag != null)
-			return tag;
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * For use with TNGSAXParserXMI. gets content of element - can be null
-	 * 
-	 * @param eMap
-	 * @return String
-	 */
-	public static String getElementContent(HashMap eMap) {
-		String content = null;
-		if (eMap != null)
-			content = (String) eMap.get("content"); //$NON-NLS-1$
-		return content;
-	}
-
-	/**
-	 * Finds a guid contained within the given eMap - can return null
-	 * 
-	 * @param guid
-	 *            guid to find
-	 * @param eMap
-	 *            use TNGSAXParserXMI.xmiMap, or a sub-eMap
-	 * @return HashMap
-	 */
-	public static HashMap findGuid(String guid, HashMap eMap) {
-		ArrayList attList = (ArrayList) eMap.get("attributes"); //$NON-NLS-1$
-		if (guid.equals(SAXParserXMI.getGuidOfList(attList)))
-			return eMap;
-
-		Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			HashMap childMap = (HashMap) iter.next();
-			HashMap result = findGuid(guid, childMap);
-			if (result != null)
-				return result;
-		}
-		return null;
-	}
-
-	/**
-	 * For use with TNGSAXParserXMI.
-	 * 
-	 * @param attList
-	 * @return String
-	 */
-	public static String getGuidOfList(ArrayList attList) {
-		Iterator iter = attList.iterator();
-		while (iter.hasNext()) {
-			String attpair = (String) iter.next();
-			String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$
-			String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$
-			if (attname.equals("guid")) //$NON-NLS-1$
-				return attval;
-		}
-		return null;
-	}
-
-	/**
-	 * For use with TNGSAXParserXMI when parsing resmgr.xmi
-	 * 
-	 * @param attList
-	 * @return String
-	 */
-	public static String getIdOfList(ArrayList attList) {
-		Iterator iter = attList.iterator();
-		while (iter.hasNext()) {
-			String attpair = (String) iter.next();
-			String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$
-			String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$
-			if (attname.equals("id")) //$NON-NLS-1$
-				return attval;
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @param eMap
-	 * @return URI
-	 */
-	public static URI getPresentationUriOfElement(HashMap eMap) {
-		if (eMap == null)
-			return null;
-		String tag = SAXParserXMI.getTag(eMap);
-
-		// // check to see if this is an breakdownElement - if so, return null
-		// // because while breakdownElements have presentations, they are not
-		// used.
-		// if (tag.equals("breakdownElements")) {
-		// return null;
-		// }
-		// // processes don't use their presentation either
-		// if (tag.equals("process")) {
-		// return null;
-		// }
-
-		// look for childPackage presentations, which are an href attribute
-		if (tag.equals("childPackages")) { //$NON-NLS-1$
-			ArrayList attList = (ArrayList) eMap.get("attributes"); //$NON-NLS-1$
-			Iterator iter = attList.iterator();
-			while (iter.hasNext()) {
-				String attpair = (String) iter.next();
-				String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$
-				String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$
-				if (attname.equals("href")) { //$NON-NLS-1$
-					try {
-						URI uri = URI.createURI(attval);
-						return uri;
-					} catch (Exception ex) {
-						ex.printStackTrace();
-					}
-					// if (attval.indexOf("uma://") != -1) {
-					// String presId =
-					// attval.substring(attval.indexOf("uma://")+6);
-					// return presId;
-					// }
-				}
-			}
-		}
-
-		ArrayList childList = (ArrayList) eMap.get("children"); //$NON-NLS-1$
-		Iterator iter = childList.iterator();
-		while (iter.hasNext()) {
-			HashMap childMap = (HashMap) iter.next();
-			tag = SAXParserXMI.getTag(childMap);
-			if (tag.equals("presentation")) { // || //$NON-NLS-1$
-				// tag.equals("variabilityBasedOnElement"))
-				// { //$NON-NLS-1$ //$NON-NLS-2$
-				ArrayList attList = (ArrayList) childMap.get("attributes"); //$NON-NLS-1$
-				Iterator attIter = attList.iterator();
-				while (attIter.hasNext()) {
-					String attpair = (String) attIter.next();
-					String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$
-					String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$
-					if (attname.equals("href")) { //$NON-NLS-1$
-						try {
-							URI uri = URI.createURI(attval);
-							return uri;
-						} catch (Exception ex) {
-							ex.printStackTrace();
-						}
-						// if (attval.indexOf("uma://") != -1) {
-						// String presId =
-						// attval.substring(attval.indexOf("uma://")+6);
-						// return presId;
-						// }
-					}
-				}
-
-				// if (attList.size() == 0)
-				// continue;
-				// String attpair = (String)attList.get(0);
-				// // String attname = attpair.substring(0,
-				// attpair.indexOf(","));
-				// String attval = attpair.substring(attpair.indexOf(",")+1);
-				// if (attval.indexOf("uma://") != -1) {
-				// String presId = attval.substring(attval.indexOf("uma://")+6);
-				// return presId;
-				// }
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @param eMap
-	 * @param attributeName
-	 * @param attributeValue
-	 * @return HashMap
-	 */
-	public static HashMap findElementByAttribute(HashMap eMap,
-			String attributeName, String attributeValue) {
-		// search this eMap's children
-		Iterator iter = ((ArrayList) eMap.get("children")).iterator(); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			HashMap childMap = (HashMap) iter.next();
-			HashMap result = findElementByAttribute(childMap, attributeName,
-					attributeValue);
-			if (result != null)
-				return result;
-		}
-
-		// search this eMap
-		iter = ((ArrayList) eMap.get("attributes")).iterator(); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			String attpair = (String) iter.next();
-			String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$
-			String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$
-			if (attname.equals(attributeName) && attval.equals(attributeValue))
-				return eMap;
-		}
-		return null;
-	}
-
-	/**
-	 * 
-	 * @param eMap
-	 * @param attributeName
-	 * @return String
-	 */
-	public static String getAttributeOfElement(HashMap eMap,
-			String attributeName) {
-		Iterator iter = ((ArrayList) eMap.get("attributes")).iterator(); //$NON-NLS-1$
-		while (iter.hasNext()) {
-			String attpair = (String) iter.next();
-			String attname = attpair.substring(0, attpair.indexOf(",")); //$NON-NLS-1$
-			String attval = attpair.substring(attpair.indexOf(",") + 1); //$NON-NLS-1$
-			if (attname.equals(attributeName))
-				return attval;
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/TextReferenceReplacerImpl.java b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/TextReferenceReplacerImpl.java
deleted file mode 100644
index e0bc04e..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/TextReferenceReplacerImpl.java
+++ /dev/null
@@ -1,178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-/**
- * Implementation for ITextReferenceReplacer. Used in deep copy
- * 
- * @author Weiping Lu
- *
- */
-package org.eclipse.epf.library.util;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.regex.Matcher;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.LibraryPlugin;
-import org.eclipse.epf.library.edit.util.ITextReferenceReplacer;
-import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodElement;
-
-public class TextReferenceReplacerImpl implements ITextReferenceReplacer {
-	
-	private static String CAPABILITY_PATH = MultiFileSaveUtil.CAPABILITY_PATTERN_PATH + "/"; //$NON-NLS-1$
-	private static String DELIVERY_PATH = MultiFileSaveUtil.DELIVERY_PROCESS_PATH + "/"; //$NON-NLS-1$
-	private static boolean debug = LibraryPlugin.getDefault().isDebugging();
-	private final static boolean localDebug  = false;	
-	
-	private Map convertMap(Map oldToNewObjectMap) {
-		if (oldToNewObjectMap == null) {
-			if (localDebug) {
-				System.out.println("LD> oldToNewObjectMap is null."); //$NON-NLS-1$
-			}
-			return null;
-		}
-		Map m = null;
-		Iterator it = oldToNewObjectMap.entrySet().iterator();
-		while (it.hasNext()) {
-			Map.Entry entry = (Map.Entry) it.next();
-			Object key = entry.getKey();
-			Object val = entry.getValue();
-			if (localDebug) {
-				System.out.println("LD> old key = " + key); //$NON-NLS-1$
-				System.out.println("LD> old val = " + val); //$NON-NLS-1$
-			}
-			if ( key instanceof MethodElement && val instanceof MethodElement) {
-				String newKey = ((MethodElement)key).getGuid();
-				String newVal = ((MethodElement)val).getGuid();
-				if (key != null && val != null) {
-					if (m == null) {
-						m = new HashMap();
-					}
-					m.put(newKey, newVal);
-				}
-				if (localDebug) {
-					System.out.println("LD> new key = " + newKey + ", newVal = " + newVal); //$NON-NLS-1$ //$NON-NLS-2$
-					System.out.println(""); //$NON-NLS-1$
-				}
-			} 
-		}
-		return m;
-	}
-
-	/**
-	 * @param source String
-	 * @param owner EObject
-	 * @oldToNewObjectMap Map
-	 * @return String
-	 */
-	public String replace(String source, EObject owner, Map oldToNewObjectMap) {
-		if (localDebug) {
-			System.out.println("LD> Entering TextReferenceReplacerImpl.replace: " + source); //$NON-NLS-1$
-			System.out.println("LD> owner: " + owner); //$NON-NLS-1$
-		}
-		String ret = replace_(source, owner, oldToNewObjectMap);
-		if (localDebug) {
-			boolean noChange = ! source.equals(ret);
-			String str = source.equals(ret) ? "No chnange!" : ret; //$NON-NLS-1$
-			System.out.println("LD> Exiting TextReferenceReplacerImpl.replace: " + str); //$NON-NLS-1$
-			System.out.println(""); //$NON-NLS-1$
-		}
-		return ret;
-	}
-	
-	private String replace_(String source, EObject owner, Map oldToNewObjectMap) {	
-		Map localMap = convertMap(oldToNewObjectMap);
-		if (localMap == null) {
-			return source;
-		}
-		
-		String replacingPath = null;
-		String replacedPath = null;			
-		if (owner instanceof DeliveryProcess) {
-			replacingPath = DELIVERY_PATH;
-			replacedPath = CAPABILITY_PATH;
-		}
-		else if (owner instanceof CapabilityPattern) {
-			replacingPath = CAPABILITY_PATH;
-			replacedPath = DELIVERY_PATH;
-		} else {
-			replacingPath = ""; //$NON-NLS-1$
-			replacedPath = ""; //$NON-NLS-1$
-		}
-		
-		StringBuffer sb = new StringBuffer();
-		Matcher m = ResourceHelper.p_link_ref.matcher(source);
-
-		while (m.find()) {
-			String text = m.group();						
-			Map attributeMap = ResourceHelper.getAttributesFromLink(text);
-			String oldGuid = (String) attributeMap.get(ResourceHelper.TAG_ATTR_GUID);	
-			String newGuid = oldGuid == null ? null : (String) localMap.get(oldGuid);
-			
-			if (localDebug) {
-				System.out.println("LD> text:      " + text); //$NON-NLS-1$
-				System.out.println("LD> attributeMap: " + attributeMap); //$NON-NLS-1$
-				System.out.println("LD> oldGuid: " + oldGuid); //$NON-NLS-1$
-				System.out.println("LD> newGuid: " + newGuid); //$NON-NLS-1$
-			}			
-			if (newGuid != null && !newGuid.equals(oldGuid)) {
-								
-				//String replacement = text.replaceAll(oldGuid, newGuid);
-				//Can't use the above commented out line, because some guid strings are not valid regex patterns
-				String replacement = replaceAll(text, oldGuid, newGuid);		
-				if (replacement.indexOf(replacedPath) > 0) {
-					replacement = replacement.replaceFirst(replacedPath, replacingPath);
-				}
-				if (localDebug) {
-					System.out.println("LD> replacement: " + replacement); //$NON-NLS-1$
-				}
-				m.appendReplacement(sb, replacement);	
-			}
-			
-		}
-		m.appendTail(sb);
-		return sb.toString();
-	}
-	
-	/**
-	 * 
-	 * @param text String
-	 * @param replaced String
-	 * @param replacing String
-	 * @return String
-	 */
-	public static String replaceAll(String text, String replaced, String replacing) {
-		int fromIndex = 0;
-		int ix = text.indexOf(replaced, fromIndex);
-		if (ix < 0) {
-			return text;
-		}			
-		int replacedLen = replaced.length();
-		StringBuffer newText = new StringBuffer();
-		while (ix >= fromIndex) {
-			if (ix > fromIndex) {
-				newText.append(text.substring(fromIndex, ix));
-			}
-			newText.append(replacing);
-			fromIndex = ix + replacedLen;
-			ix = text.indexOf(replaced, fromIndex);
-		}
-		if (fromIndex < text.length() ) {
-			newText.append(text.substring(fromIndex, text.length()));
-		}
-		return newText.toString();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/package.html b/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/package.html
deleted file mode 100644
index a40e0e3..0000000
--- a/1.5/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides access and editing support for a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/.classpath b/1.5/plugins/org.eclipse.epf.migration.diagram/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/.options b/1.5/plugins/org.eclipse.epf.migration.diagram/.options
deleted file mode 100644
index 3ac3557..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the diagram migration plug-in
-org.eclipse.epf.migration.diagram/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/.project b/1.5/plugins/org.eclipse.epf.migration.diagram/.project
deleted file mode 100644
index 961e15e..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.migration.diagram</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.migration.diagram/META-INF/MANIFEST.MF
deleted file mode 100644
index 580467a..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,23 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.migration.diagram;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.migration.diagram.DiagramMigrationPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.epf.common,
- org.eclipse.epf.uma,
- org.eclipse.epf.library,
- org.eclipse.epf.diagram.ad,
- org.eclipse.epf.authoring.ui,
- org.eclipse.epf.diagram.core,
- org.eclipse.epf.diagram.add,
- org.eclipse.epf.diagram.wpdd,
- org.eclipse.epf.library.xmi,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Bundle-Vendor: %providerName
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.epf.migration.diagram.util
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/build.properties b/1.5/plugins/org.eclipse.epf.migration.diagram/build.properties
deleted file mode 100644
index bef8e62..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties,\
-               icons/
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/icons/full/obj16/XMLFile.gif b/1.5/plugins/org.eclipse.epf.migration.diagram/icons/full/obj16/XMLFile.gif
deleted file mode 100644
index 83b44bb..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/icons/full/obj16/XMLFile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/icons/full/wizban/ExportXML.gif b/1.5/plugins/org.eclipse.epf.migration.diagram/icons/full/wizban/ExportXML.gif
deleted file mode 100644
index e249831..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/icons/full/wizban/ExportXML.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/plugin.properties b/1.5/plugins/org.eclipse.epf.migration.diagram/plugin.properties
deleted file mode 100644
index 8f781c8..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-pluginName=EPF Diagram Migration
-providerName=Eclipse.org
-
-# Wizards
-exportWorkflowTemplateWizardName=Workflow Template
-exportWorkflowTemplateWizardDescription=Export a capability pattern or delivery process diagram template.
-# ====================================================================
-
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/plugin.xml b/1.5/plugins/org.eclipse.epf.migration.diagram/plugin.xml
deleted file mode 100644
index 4b39785..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/plugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-<!--
-   <extension
-         point="org.eclipse.ui.exportWizards">
-      <wizard
-     	    category="org.eclipse.epf.ui.exportWizards.category"
-            class="org.eclipse.epf.migration.diagram.ad.wizards.MigrationExportWizard"
-            icon="icons/full/obj16/XMLFile.gif"
-            id="org.eclipse.epf.migration.diagram.ad.wizards.MigrationExportWizard"
-            name="%exportWorkflowTemplateWizardName">
-         <description>
-	         %exportWorkflowTemplateWizardDescription
-         </description>
-      </wizard>
-   </extension>
-   
-   <extension
-         point="org.eclipse.epf.ui.exportWizards">
-      <wizard id="org.eclipse.epf.migration.diagram.ad.wizards.MigrationExportWizard"/>
-   </extension>
-   -->
-   <extension
-         point="org.eclipse.epf.library.xmi.diagramMigration">
-      <diagramMigration class="org.eclipse.epf.migration.diagram.DiagramMigration"/>
-   </extension>
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/DiagramMigration.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/DiagramMigration.java
deleted file mode 100644
index cce2387..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/DiagramMigration.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.library.util.ResourceUtil;
-import org.eclipse.epf.library.xmi.IDiagramMigration;
-import org.eclipse.epf.migration.diagram.ad.services.WorkflowExportService;
-import org.eclipse.epf.migration.diagram.util.MigrationUtil;
-import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Implementation class for digram migration 
- * 
- * @author Weiping Lu - April 04, 2007
- * @since  1.2
- */
-public class DiagramMigration implements IDiagramMigration {
-
-	protected boolean debug;
-	
-	public void migrate(Collection<Process> processes) throws Exception {	
-		// debug
-		debug = DiagramMigrationPlugin.getDefault().isDebugging();
-		
-		WorkflowExportService service = new WorkflowExportService();
-		
-		int  errorCount = 0;
-		MethodLibrary lib = null;
-		
-		for (Iterator<Process> it = processes.iterator(); it.hasNext();) {
-			Process proc = it.next();
-			if (lib == null) {
-				lib = UmaUtil.getMethodLibrary(proc);
-			}
-			
-			if (debug) {
-				System.out.println("LD> proc: " + proc);	//$NON-NLS-1$
-				System.out.println("LD>  proc.eResource(): " +  proc.eResource());//$NON-NLS-1$
-				if (proc.eResource() != null) {
-					System.out.println("LD>  proc.eResource().getURI(): " +  proc.eResource()); //$NON-NLS-1$
-				}
-			}
-
-			String modelFilePath = proc.eResource() == null ? null : 
-										proc.eResource().getURI().toFileString();
-			if (modelFilePath == null) {
-				continue;
-			}
-						
-			File cpFolderPath = new File(modelFilePath).getParentFile();
-			String diagramFilePath = cpFolderPath.getAbsolutePath() + File.separator +
-										"diagram.xmi";				//$NON-NLS-1$
-			File diagramFile = new File(diagramFilePath);
-			if (diagramFile.exists()) {
-				diagramFile.delete();
-				System.out.println("LD> Deleted diagramFile: " + diagramFile);//$NON-NLS-1$
-				ResourceUtil.refreshResources(lib, null);
-			}
-			//diagramFile.createNewFile();
-			if (debug) {
-				System.out.println("LD> diagramFile: " + diagramFile);//$NON-NLS-1$
-			}
-			try {
-				service.export(proc, proc, "diagram.xmi", cpFolderPath); //$NON-NLS-1$
-			} catch (Exception e) {
-				errorCount++;
-				if (debug) {
-					System.out.println("LD> failed: " + diagramFile);	//$NON-NLS-1$
-				}
-			}
-		}
-		if (debug) {
-			System.out.println("LD> processes.size(): " + processes.size());	//$NON-NLS-1$
-			System.out.println("LD> errorCount: " + errorCount);	//$NON-NLS-1$
-			System.out.println(""); //$NON-NLS-1$
-		}
-		
-		removeOldDiagrams(processes, lib);				
-
-	}
-
-	private void removeOldDiagrams(Collection<Process> processes, MethodLibrary lib) {		
-		if (lib == null) {
-			return;
-		}
-		boolean needSave = false;
-		if (debug) {
-			System.out.println("LD> removeOldDiagrams ...");	//$NON-NLS-1$
-		}
-		for (Iterator<Process> it = processes.iterator(); it.hasNext();) {
-			Process proc = it.next();
-			boolean dirty = false;
-			try {
-				Map activities = MigrationUtil.getActivities(proc, true);
-				for (Iterator iit = activities.values().iterator(); iit.hasNext();) {				
-						Activity act = (Activity) iit.next();						
-						EObject container = act.eContainer();
-						if (container instanceof ProcessPackage) {
-							ProcessPackage pkg = (ProcessPackage) container;
-							if (! pkg.getDiagrams().isEmpty()) {
-								ArrayList removeList = new ArrayList(pkg.getDiagrams());
-								pkg.getDiagrams().removeAll(removeList);
-								dirty = true;
-								if (debug) {
-									System.out.println("LD> proc: " + proc);	//$NON-NLS-1$
-									System.out.println("LD>  pkg: ");			//$NON-NLS-1$
-								}
-							}
-						}
-				}
-				if (dirty) {
-					proc.eResource().setModified(true);
-					needSave = true;
-				}
-			} catch (Exception e) {
-				if (debug) {
-					e.printStackTrace();
-				}
-			}			
-		}
-		if (needSave) {
-			Resource resource = lib.eResource();
-			MultiFileResourceSetImpl resourceSet = (MultiFileResourceSetImpl) resource.getResourceSet();
-			Map saveOptions = resourceSet.getDefaultSaveOptions();
-			try {
-				resourceSet.save(saveOptions, true);
-			} catch (Exception e) {
-				if (debug) {
-					e.printStackTrace();
-				}
-			}	
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/DiagramMigrationPlugin.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/DiagramMigrationPlugin.java
deleted file mode 100644
index 3516f9d..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/DiagramMigrationPlugin.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.eclipse.epf.migration.diagram;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class DiagramMigrationPlugin extends AbstractPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.migration.diagram"; //$NON-NLS-1$
-
-	// The shared instance
-	private static DiagramMigrationPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public DiagramMigrationPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static DiagramMigrationPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationExportConstants.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationExportConstants.java
deleted file mode 100644
index ca54a8b..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationExportConstants.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.2
- *
- */
-public class MigrationExportConstants {
-	
-	/**
-	 * The process type preference key.
-	 */
-	public static final String PROCESS_TYPE = "processType"; //$NON-NLS-1$
-
-	/**
-	 * The process name preference key.
-	 */
-	public static final String PROCESS_NAME = "processName"; //$NON-NLS-1$
-
-	/**
-	 * The process context preference key.
-	 */
-	public static final String PROCESS_CONTEXT = "context"; //$NON-NLS-1$
-
-	/**
-	 * The target directories preference key.
-	 */
-	public static final String TARGET_DIRECTORIES = "targetDirs"; //$NON-NLS-1$
-
-	/**
-	 * The template names preference key.
-	 */
-	public static final String TEMPLATE_NAMES = "templateNames"; //$NON-NLS-1$
-	
-	/**
-	 * The process context preference key.
-	 */
-	public static final String ACTIVITY_CONTEXT = "activity"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static boolean debug = true;
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationExportException.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationExportException.java
deleted file mode 100644
index 1eb1124..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationExportException.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram;
-
-/**
- * @author Shashidhar Kannoori
- * @since 1.2
- *
- */
-public class MigrationExportException extends Exception {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 5049400350527710614L;
-
-	/**
-	 * 
-	 */
-	public MigrationExportException() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param message
-	 */
-	public MigrationExportException(String message) {
-		super(message);
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param cause
-	 */
-	public MigrationExportException(Throwable cause) {
-		super(cause);
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param message
-	 * @param cause
-	 */
-	public MigrationExportException(String message, Throwable cause) {
-		super(message, cause);
-		// TODO Auto-generated constructor stub
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationResources.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationResources.java
deleted file mode 100644
index d7e3b16..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/MigrationResources.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Migration resources
- * 
- * @author Shilpa Toraskar
- * @since 1.2
- *
- */
-public final class MigrationResources extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.epf.migration.diagram.Resources";//$NON-NLS-1$
-	private MigrationResources() {
-		// Do not instantiate
-	}
-	
-
-	public static String workflow_export_wizard_title;
-	public static String workflow_export_wizard_text;
-	public static String workflow_export_wizard_processGroup_text;
-	public static String workflow_export_wizard_capabilityPatternRadioButton_text;
-	public static String workflow_export_wizard_deliveryProcessRadioButton_text;
-	public static String workflow_export_wizard_processNameLabel_text;
-	public static String workflow_export_wizard_contextNameLabel_text;
-	public static String workflow_export_wizard_templateGroup_text;
-	public static String workflow_export_wizard_templateNameLabel_text;
-	public static String workflow_export_wizard_dirLabel_text;
-	public static String workflow_export_wizard_browseButton_text;
-	public static String workflow_overwriteTextDialog_title;
-	public static String workflow_overwriteText_msg;
-	public static String workflow_export_wizard_activitiesNameLabel_text;
-
-		
-	public static String open_method_library_error_title;
-	public static String open_method_library_error_text;
-	
-	public static String GRAPH_NODE_FORK;
-	public static String GRAPH_NODE_INITIAL;
-	public static String GRAPH_NODE_FINAL;
-	public static String GRAPH_NODE_DECISION;
-	public static String GRAPH_NODE_FREE_TEXT;
-	public static String GRAPH_NODE_MERGE;
-	public static String GRAPH_NODE_JOIN;
-	public static String GRAPH_NODE_LINK;
-	
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, MigrationResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/Resources.properties b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/Resources.properties
deleted file mode 100644
index ec1f384..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/Resources.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-workflow_export_wizard_title=Export Workflow Wizard
-workflow_export_wizard_text=Wizard to export workflow (activity diagrams)
-workflow_export_wizard_processGroup_text=Process
-workflow_export_wizard_capabilityPatternRadioButton_text=Capability Pattern
-workflow_export_wizard_deliveryProcessRadioButton_text=Delivery Process
-workflow_export_wizard_processNameLabel_text=Process:
-workflow_export_wizard_contextNameLabel_text=Configuration:
-workflow_export_wizard_templateGroup_text=Template
-workflow_export_wizard_templateNameLabel_text=File Name:
-workflow_export_wizard_dirLabel_text=Directory:
-workflow_export_wizard_browseButton_text=Browse...
-workflow_overwriteTextDialog_title=Overwrite
-workflow_overwriteText_msg=Do you want to overwrite the existing file?
-workflow_export_wizard_activitiesNameLabel_text=Activity:
-
-open_method_library_error_title=Open Method Library Error
-open_method_library_error_text=You need to open a method library before performing an export.
-
-# Graph Node names
-
-GRAPH_NODE_FORK=Fork Node
-GRAPH_NODE_INITIAL=Start Node
-GRAPH_NODE_FINAL=End Node
-GRAPH_NODE_DECISION=Decision node
-GRAPH_NODE_FREE_TEXT=Free Text
-GRAPH_NODE_MERGE=Merge Node
-GRAPH_NODE_JOIN=Join Node
-GRAPH_NODE_LINK=Link
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ActivityMapNode.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ActivityMapNode.java
deleted file mode 100644
index 940f9b6..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ActivityMapNode.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @author Weiping Lu
- * @since 1.2
- */
-public class ActivityMapNode extends MapNode {
-
-	public ActivityMapNode(Node node) {
-		super(node);
-	}
-
-	/**
-	 * Update uml node
-	 */
-	public void updateNode() {
-		super.updateNode();
-		umlNode = (StructuredActivityNode) getActivity().createNode(name,
-				UMLPackage.eINSTANCE.getStructuredActivityNode());
-		Object obj = (Object) node.getObject();
-/*		if (obj instanceof MethodElement) {
-			BridgeHelper.addEAnnotation(umlNode, ((MethodElement) obj));
-		}
-		if (obj instanceof Phase) {
-			BridgeHelper.addEAnnotationType(umlNode, 
-					BridgeHelper.UMA_PHASE);
-		} else if (obj instanceof Iteration) {
-			BridgeHelper.addEAnnotationType(umlNode, 
-					BridgeHelper.UMA_ITERATION);
-		} else {
-			BridgeHelper.addEAnnotationType(umlNode, 
-					BridgeHelper.UMA_ACTIVITY);
-		}*/
-		if (obj instanceof MethodElement) {
-			BridgeHelper.associate(umlNode, ((MethodElement) obj));
-		}
-
-		if (umlNode != null) {
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ActivityParameterMapeNode.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ActivityParameterMapeNode.java
deleted file mode 100644
index f04b223..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ActivityParameterMapeNode.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class ActivityParameterMapeNode extends MapNode {
-
-	public ActivityParameterMapeNode(Node node) {
-		super(node);
-	}
-
-	/**
-	 * Update uml node
-	 */
-	public void updateNode() {
-		super.updateNode();
-		umlNode = (ActivityParameterNode) getActivity().createNode(name,
-				UMLPackage.eINSTANCE.getActivityParameterNode());
-		Object obj = (Object) node.getObject();
-		if (obj instanceof MethodElement) {
-			BridgeHelper.addEAnnotation(umlNode, ((MethodElement) obj));
-		}
-		if (obj instanceof Milestone) {
-			BridgeHelper.addEAnnotationType(umlNode, 
-					BridgeHelper.UMA_MILESTONE);
-		} else if (obj instanceof TaskDescriptor) {
-			BridgeHelper.addEAnnotationType(umlNode, 
-					BridgeHelper.UMA_TASK_DESCRIPTOR);
-		}
-
-		if (umlNode != null) {
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/DecisionNodeMap.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/DecisionNodeMap.java
deleted file mode 100644
index ba858a6..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/DecisionNodeMap.java
+++ /dev/null
@@ -1,46 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.uml2.uml.DecisionNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class DecisionNodeMap extends MapNode {
-
-
-	/**
-	 * @param node
-	 */
-	public DecisionNodeMap(Node node) {
-		super(node);
-	}
-	
-	
-	/**
-	 * Update uml node
-	 */
-	public void updateNode() {
-		super.updateNode();
-
-		umlNode = (DecisionNode)getActivity().createNode(name = (name != null)? name : " ", //$NON-NLS-1$ 
-						UMLPackage.eINSTANCE.getDecisionNode());
-		
-		if(umlNode != null){
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/FinalNodeMap.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/FinalNodeMap.java
deleted file mode 100644
index 5127963..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/FinalNodeMap.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.uml2.uml.ActivityFinalNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class FinalNodeMap extends MapNode {
-
-
-	/**
-	 * @param node
-	 */
-	public FinalNodeMap(Node node) {
-		super(node);
-	}
-	
-	/**
-	 * Update uml node
-	 */
-	public void updateNode() {
-		
-		super.updateNode();
-		umlNode = (ActivityFinalNode)getActivity().createNode(name = (name != null)? name : GRAPH_NODE_FINAL, 
-				UMLPackage.eINSTANCE.getActivityFinalNode());
-		
-		if(umlNode != null){
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ForkNodeMap.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ForkNodeMap.java
deleted file mode 100644
index 15a9f2a..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/ForkNodeMap.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class ForkNodeMap extends MapNode {
-
-	/**
-	 * @param node
-	 */
-	public ForkNodeMap(Node node) {
-		super(node);
-	}
-	
-	/**
-	 *  Update uml node
-	 */
-	public void updateNode() {
-		super.updateNode();
-
-		umlNode = (ForkNode)getActivity().createNode(name = (name != null)? name : GRAPH_NODE_FORK_NODE, 
-						UMLPackage.eINSTANCE.getForkNode());
-	
-		if(umlNode != null){
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/IMapConstants.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/IMapConstants.java
deleted file mode 100644
index 2015f84..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/IMapConstants.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.epf.migration.diagram.MigrationResources;
-
-/**
- * 
- * @author Shashidhar Kannoori
- * @since 1.2
- *
- */
-public interface IMapConstants {
-	
-	public static boolean debug  = true;
-	
-	public static final String GRAPH_NODE_FORK_NODE = ""; //MigrationResources.GRAPH_NODE_FORK; //$NON-NLS-1$
-
-	public static final String GRAPH_NODE_INITIAL = ""; //MigrationResources.GRAPH_NODE_INITIAL; //$NON-NLS-1$
-
-	public static final String GRAPH_NODE_FINAL = ""; // MigrationResources.GRAPH_NODE_FINAL; //$NON-NLS-1$
-
-	public static final String GRAPH_NODE_DECISION =  MigrationResources.GRAPH_NODE_DECISION;
-
-	public static final String GRAPH_NODE_FREE_TEXT = MigrationResources.GRAPH_NODE_FREE_TEXT;
-	
-	public static final String GRAPH_NODE_MERGE = MigrationResources.GRAPH_NODE_MERGE;
-	
-	public static final String GRAPH_NODE_JOIN = ""; //MigrationResources.GRAPH_NODE_JOIN; //$NON-NLS-1$
-
-	public static Map graphUMLNodeMap = new HashMap();
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/InitialNodeMap.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/InitialNodeMap.java
deleted file mode 100644
index af65a4b..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/InitialNodeMap.java
+++ /dev/null
@@ -1,44 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.uml2.uml.InitialNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- */
-public class InitialNodeMap extends MapNode {
-
-	
-	/**
-	 * @param node
-	 */
-	public InitialNodeMap(Node node) {
-		super(node);
-	}
-	
-	/**
-	 * Update uml node
-	 */
-	public void updateNode() {
-		super.updateNode();
-		umlNode = (InitialNode)getActivity().createNode(name = (name != null)? name : GRAPH_NODE_INITIAL, 
-						UMLPackage.eINSTANCE.getInitialNode());
-		
-		if(umlNode != null){
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/JoinNodeMap.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/JoinNodeMap.java
deleted file mode 100644
index 6292a57..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/JoinNodeMap.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.uml2.uml.JoinNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * 
- * @author Shilpa Toraskar
- * @since 1.2
- *
- */
-public class JoinNodeMap extends MapNode {
-
-	public JoinNodeMap(Node node) {
-		super(node);
-	}
-	
-	/**
-	 * Update uml node
-	 */
-	public void updateNode() {
-		super.updateNode();
-		umlNode = (JoinNode)getActivity().createNode(name = (name != null)? name : GRAPH_NODE_JOIN, 
-						UMLPackage.eINSTANCE.getJoinNode());
-		
-		if(umlNode != null){
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapFactory.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapFactory.java
deleted file mode 100644
index 2fb536b..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapFactory.java
+++ /dev/null
@@ -1,146 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.diagram.model.ModelPackage;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.TaskDescriptor;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- */
-
-
-public class MapFactory {
-	Map map = new HashMap();
-
-	static MapFactory factory = null;
-
-	
-	public static MapFactory getInstance() {
-		if (factory == null) {
-			factory = new MapFactory();
-		}
-		return factory;
-	}
-
-	/**
-	 * Crete map node
-	 * @param node
-	 * @return
-	 */
-	public MapNode create(Node node) {
-		int classifier = node.eClass().getClassifierID();
-		switch (classifier) {
-		case ModelPackage.WORK_BREAKDOWN_ELEMENT_NODE:
-			return createWorkBreakDownElementNode(node);
-		case ModelPackage.TYPED_NODE:
-			TypedNode typedNode = (TypedNode) node;
-			if (typedNode.getType() == TypedNode.DECISION) {
-				List incomingConnections = typedNode.getIncomingConnections();
-				
-				if (incomingConnections.size() > 1)
-					return createMergeNode(node);
-				else
-					return createDecisionNode(node);
-				
-//				List outgoingConnections = typedNode.getOutgoingConnections();
-//				if (incomingConnections.size() > 1 && outgoingConnections.size() == 1)
-//					return createMergeNode(node);
-//				if (incomingConnections.size() == 1 && outgoingConnections.size() > 1)
-//					return createDecisionNode(node);
-//				if (incomingConnections.size() > 1
-//						&& outgoingConnections.size() > 1) {
-//					createMergeNode(node);
-//					return createDecisionNode(node);
-//				}
-			} else if (typedNode.getType() == TypedNode.START)
-				return createInitialNode(node);
-			else if (typedNode.getType() == TypedNode.END)
-				return createFinalNode(node);
-			else if (typedNode.getType() == TypedNode.SYNCH_BAR) {
-				List incomingConnections = typedNode.getIncomingConnections();
-				if (incomingConnections.size() > 1)
-					return createJoinNode(node);
-				else
-					return createForkNode(node);
-//				List outgoingConnections = typedNode.getOutgoingConnections();
-//				if (incomingConnections.size() > 1 && outgoingConnections.size() == 1)
-//					return createJoinNode(node);
-//				if (incomingConnections.size() == 1 && outgoingConnections.size() > 1)
-//					return createForkNode(node);
-//				if (incomingConnections.size() > 1
-//						&& outgoingConnections.size() > 1) {
-//					createJoinNode(node);
-//					return createForkNode(node);
-//				}
-			} else if (typedNode.getType() == TypedNode.FREE_TEXT) {
-				return createFreeTextNode(node);
-			}
-		case ModelPackage.LINK:
-			return createControlFlow(node);
-		default:
-			throw new IllegalArgumentException("The class '" //$NON-NLS-1$
-					+ node.eClass().getName() + "' is not a valid classifier"); //$NON-NLS-1$
-		}
-	}
-
-	private MapNode createWorkBreakDownElementNode(Node node) {
-		Object obj = node.getObject();
-		if (obj instanceof Activity) 
-			return new ActivityMapNode(node);
-		else if (obj instanceof TaskDescriptor || obj instanceof Milestone) 
-			return new ActivityParameterMapeNode(node);
-		
-		return null;
-	}
-
-	private MapNode createFreeTextNode(Node node) {
-		return null;
-	}
-
-	private MapNode createFinalNode(Node node) {
-		return new FinalNodeMap(node);
-	}
-
-	private MapNode createInitialNode(Node node) {
-		return new InitialNodeMap(node);
-	}
-
-	private MapNode createControlFlow(Node node) {
-		return null;
-	}
-
-	private MapNode createMergeNode(Node node) {
-		return new MergeNodeMap(node);
-	}
-
-	private MapNode createJoinNode(Node node) {
-		return new JoinNodeMap(node);
-	}
-
-	private MapNode createDecisionNode(Node node) {
-		return new DecisionNodeMap(node);
-	}
-
-	private MapNode createForkNode(Node node) {
-		return new ForkNodeMap(node);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapNode.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapNode.java
deleted file mode 100644
index 7187a4b..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapNode.java
+++ /dev/null
@@ -1,528 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionPoint;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.util.DiagramCoreUtil;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.NamedNode;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.gmf.runtime.notation.Bounds;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.IdentityAnchor;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint;
-import org.eclipse.uml2.uml.Activity;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- * 
- */
-public class MapNode implements IMapConstants {
-
-	protected Node node;
-
-	//private ResourceSet resourceSet;
-
-	protected org.eclipse.gmf.runtime.notation.Node notationNode;
-
-	private Activity activity;
-	
-	private Diagram diagram;
-
-	protected String name;
-
-	protected ActivityNode umlNode;
-
-	private static final int IMAGE_HEIGHT = 32;
-	
-	public MapNode(Node node) {
-		this.node = node;
-	}
-
-	public MapNode() {
-	}
-
-	/**
-	 * Update resource
-	 * 
-	 * @param resourceSet
-	 * @return
-	 */
-	public org.eclipse.gmf.runtime.notation.Node updateResource() {
-		Diagram diagram = getDiagram();
-
-		// Check if notation element already created.
-		if (graphUMLNodeMap.get(node) != null) {
-			org.eclipse.uml2.uml.ActivityNode tempUMLNode = (ActivityNode) graphUMLNodeMap
-					.get(node);
-			org.eclipse.gmf.runtime.notation.Node tempNotationNode = findNotationNode(
-					diagram, tempUMLNode);
-			if (tempNotationNode != null)
-				return tempNotationNode;
-
-		}
-
-		// Create Activity Node
-		updateNode();
-
-		// Create Notation nnode
-		notationNode = MapUtil.createNotationNode_AD(diagram, umlNode);
-		diagram.insertChild(notationNode);
-
-		// set size
-		setLayoutConstraint(node, notationNode);
-
-		// set element
-		notationNode.setElement(umlNode);
-
-		// mark inherited
-		setInheritedAttribute(node, notationNode);
-		
-		return notationNode;
-	}
-
-	
-	/**
-	 * @param node
-	 * @param notationNode
-	 */
-	private void setLayoutConstraint(org.eclipse.epf.diagram.model.Node node,
-			org.eclipse.gmf.runtime.notation.Node notationNode) {
-		Bounds bounds = NotationFactory.eINSTANCE.createBounds();
-		
-		int type = new Integer(notationNode.getType()).intValue();
-		if (node.getHeight() == -1) {
-			 if (type == DecisionNodeEditPart.VISUAL_ID || type == MergeNodeEditPart.VISUAL_ID)	{
-				 bounds.setHeight(24);
-			 }
-			 else if (type == ForkNodeEditPart.VISUAL_ID || type == JoinNodeEditPart.VISUAL_ID)	{
-				 bounds.setHeight(5);
-			 }
-			 else if (type == ActivityFinalNodeEditPart.VISUAL_ID){
-				 bounds.setHeight(24);
-			 }
-		} else {
-			bounds.setHeight(node.getHeight());
-		}
-		
-		// Due to bug in old diagram, some of the decisionNode width is -1
-		if ((node.getWidth() == -1) && (type == DecisionNodeEditPart.VISUAL_ID
-					|| type == MergeNodeEditPart.VISUAL_ID)) {
-				bounds.setWidth(48);
-		} else {
-			bounds.setWidth(node.getWidth());
-		}
-		
-		int w = bounds.getWidth();
-		int h = bounds.getHeight();
-		Dimension dim = DiagramCoreUtil.getTextSizeInWrapLabel(name, null, w, h, null);
-		int dimw = dim.width;
-		if (w < dimw && dimw != 0) {
-			bounds.setWidth(dimw);
-		}
-		
-//		bounds.setHeight(node.getHeight());
-//		bounds.setWidth(node.getWidth());
-		bounds.setX(node.getLocation().x);
-		bounds.setY(node.getLocation().y);
-		notationNode.setLayoutConstraint(bounds);
-	}
-
-	/**
-	 * Set inherited attribute
-	 * @param node
-	 * @param notationNode
-	 */
-	private void setInheritedAttribute(org.eclipse.epf.diagram.model.Node node,
-			org.eclipse.gmf.runtime.notation.Node notationNode) {
-		if (node.getLinkedElement() == null) {
-			if (node.getGraphNode().getBriefDescription() != null
-					&& !(node.getGraphNode().getBriefDescription().trim()
-							.equals(""))) //$NON-NLS-1$
-				BridgeHelper.markInherited(notationNode);
-		} 
-	}
-	
-	
-	/**
-	 * Find corresponding notation node for the uml node in the diagram
-	 * @param diagram
-	 * @param umlNode
-	 * @return
-	 */
-	private org.eclipse.gmf.runtime.notation.Node findNotationNode(
-			Diagram diagram, ActivityNode umlNode) {
-		List list = diagram.getChildren();
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				org.eclipse.gmf.runtime.notation.Node node = (org.eclipse.gmf.runtime.notation.Node) iterator
-						.next();
-				if (umlNode.equals(node.getElement())) {
-					return node;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Update Uml node
-	 */
-	public void updateNode() {
-		if (node instanceof NamedNode) {
-			name = ((NamedNode) node).getName();
-		}
-	}
-
-	/**
-	 * Create outgoing connections
-	 * @param node
-	 */
-	public void outgoingConnections(Node node) {
-		List connections = node.getOutgoingConnections();
-
-		if (connections != null && connections.size() > 0) {
-			for (Iterator iterator = connections.iterator(); iterator.hasNext();) {
-				Link link = (Link) iterator.next();
-				
-				// create connection
-				Edge edge = createConnection(link);
-
-				ActivityNode sourceNode = (org.eclipse.uml2.uml.ActivityNode) graphUMLNodeMap
-						.get(node);
-				org.eclipse.gmf.runtime.notation.Node sourceNotationNode = findNotationNode(
-						getDiagram(), sourceNode);
-
-				// add the edge as source edge
-				sourceNotationNode.getSourceEdges().add(edge);
-				sourceNotationNode.getDiagram().insertEdge(edge);
-
-			}
-		}
-	}
-
-	/**
-	 * Create UML control flow
-	 * @return
-	 */
-	private ControlFlow createControlFlow() {
-		ControlFlow controlFlow = (org.eclipse.uml2.uml.ControlFlow) getActivity()
-				.createEdge("", /*MigrationResources.GRAPH_NODE_LINK,*/ //$NON-NLS-1$
-						UMLPackage.eINSTANCE.getControlFlow());
-
-		return controlFlow;
-	}
-
-	/**
-	 * Loads source and target end points for synchronization bar and decision node
-	 * @param edge
-	 * @param flow
-	 */
-	private void loadSourceAndTargetEndPoint(Edge edge, Link flow) {
-		Point srcPoint = flow.getSourceEndPoint();
-		Point targetPoint = flow.getTargetEndPoint();
-
-		View srcView = edge.getSource();
-		View targetView = edge.getTarget();
-		int srcType = new Integer(srcView.getType()).intValue();
-		int targetType = new Integer(targetView.getType()).intValue();
-
-		if (srcType == ForkNodeEditPart.VISUAL_ID || srcType == JoinNodeEditPart.VISUAL_ID ||
-				srcType == DecisionNodeEditPart.VISUAL_ID || srcType == MergeNodeEditPart.VISUAL_ID) {
-			if (srcPoint != null
-					&& srcView instanceof org.eclipse.gmf.runtime.notation.Node ) {
-				Bounds bounds = (Bounds) ((org.eclipse.gmf.runtime.notation.Node) srcView)
-						.getLayoutConstraint();
-				IdentityAnchor anchor = createIdentityAnchor(srcPoint, bounds);
-				if (anchor != null)
-					edge.setSourceAnchor(anchor);
-			}
-		}
-		if (targetType == ForkNodeEditPart.VISUAL_ID || targetType == JoinNodeEditPart.VISUAL_ID ||
-				targetType == DecisionNodeEditPart.VISUAL_ID || targetType == MergeNodeEditPart.VISUAL_ID) {
-			if (targetPoint != null
-					&& targetView instanceof org.eclipse.gmf.runtime.notation.Node) {
-				Bounds bounds = (Bounds) ((org.eclipse.gmf.runtime.notation.Node) targetView)
-						.getLayoutConstraint();
-				IdentityAnchor anchor = createIdentityAnchor(targetPoint, bounds);
-				if (anchor != null)
-					edge.setTargetAnchor(anchor);
-			}
-		}
-	}
-	
-	
-	/**
-	 * Create identity anchor
-	 * @param point
-	 * @param bounds
-	 * @return
-	 */
-	private IdentityAnchor createIdentityAnchor(Point point, Bounds bounds) {
-		Point tempPoint = new Point(bounds.getX() + point.x, bounds.getY()
-				+ point.y);
-
-		PrecisionPoint prePoint = MapUtil.getAnchorRelativeLocation(tempPoint, bounds);
-		String id = MapUtil.composeTerminalString(prePoint);
-
-		IdentityAnchor value = NotationFactory.eINSTANCE.createIdentityAnchor();
-		value.setId(id);
-
-		return value;
-	}
-	
-	
-	
-	/**
-	 * Load relative bend points
-	 * @param edge
-	 * @param flow
-	 */
-	private void loadBendPoints(Edge edge, Link flow) {
-		List list = flow.getBendpoints();
-		List<RelativeBendpoint> relativePoints = new ArrayList<RelativeBendpoint>();
-
-		RelativeBendpoint rbp = new RelativeBendpoint(0, 0, 0, 0);
-
-		relativePoints.add(rbp);
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				AbsoluteBendpoint abp = (AbsoluteBendpoint) iterator.next();
-				
-				org.eclipse.gmf.runtime.notation.Node srcNode = (org.eclipse.gmf.runtime.notation.Node) edge.getSource();
-				org.eclipse.gmf.runtime.notation.Node targetNode = (org.eclipse.gmf.runtime.notation.Node) edge.getTarget();
-				int srcType = new Integer(srcNode.getType()).intValue();
-				int targetType = new Integer(targetNode.getType()).intValue();
-				
-				Bounds sourceBounds = (Bounds) srcNode.getLayoutConstraint();				
-				Bounds targetBounds = (Bounds) targetNode.getLayoutConstraint();
-						
-				int srcLine = MapUtil.getNoOfLines(srcNode);
-				int targetLine = MapUtil.getNoOfLines(targetNode);
-				int srcHeight = MapUtil.getTextHeight(srcNode);
-				int targetHeight = MapUtil.getTextHeight(targetNode);
-				
-				int srcX = sourceBounds.getX() + sourceBounds.getWidth() / 2;
-				int srcY = sourceBounds.getY() + (IMAGE_HEIGHT + (srcLine * srcHeight)) / 2;
-				int tarX = targetBounds.getX() + targetBounds.getWidth() / 2;
-				int tarY = targetBounds.getY() + (IMAGE_HEIGHT + (targetLine * targetHeight)) / 2;
-
-				if (srcType == ForkNodeEditPart.VISUAL_ID
-						|| srcType == JoinNodeEditPart.VISUAL_ID
-						|| srcType == DecisionNodeEditPart.VISUAL_ID
-						|| srcType == MergeNodeEditPart.VISUAL_ID) {
-					Point srcPoint = flow.getSourceEndPoint();
-					if (srcPoint != null) {
-						srcX = sourceBounds.getX() + srcPoint.x;
-						srcY = sourceBounds.getY() + srcPoint.y;
-					}
-				}
-				if (targetType == ForkNodeEditPart.VISUAL_ID
-						|| targetType == JoinNodeEditPart.VISUAL_ID
-						|| targetType == DecisionNodeEditPart.VISUAL_ID
-						|| targetType == MergeNodeEditPart.VISUAL_ID) {
-					Point targetPoint = flow.getTargetEndPoint();		
-					if (targetPoint != null) {
-						tarX = targetBounds.getX() + targetPoint.x;
-						tarY = targetBounds.getY() + targetPoint.y;
-					}			
-				}			
-				if (targetType == ActivityFinalNodeEditPart.VISUAL_ID){	
-					tarX = targetBounds.getX() + targetBounds.getWidth() / 2;
-					tarY = targetBounds.getY() + targetBounds.getHeight() / 2;		
-				}
-
-				int rel1 = abp.x - srcX;
-				int rel2 = abp.y - srcY;
-				int rel3 = abp.x - tarX;
-				int rel4 = abp.y - tarY;
-
-				RelativeBendpoint rbp1 = new RelativeBendpoint(rel1, rel2,
-						rel3, rel4);
-				relativePoints.add(rbp1);
-			}
-		}
-		relativePoints.add(rbp);
-
-		if (relativePoints.size() > 0) {
-			RelativeBendpoints bendpoints = NotationFactory.eINSTANCE
-					.createRelativeBendpoints();
-			bendpoints.setPoints(relativePoints);
-			edge.setBendpoints(bendpoints);
-		}
-	}
-
-	/**
-	 * Find edge in diagram given source and target nodes
-	 * @param sourceNode
-	 * @param targetNode
-	 * @return
-	 */
-	private Edge findEdge(org.eclipse.gmf.runtime.notation.Node sourceNode,
-			org.eclipse.gmf.runtime.notation.Node targetNode) {
-		List list = notationNode.getDiagram().getEdges();
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				Edge edge = (Edge) iterator.next();
-				if ((edge.getTarget() != null)
-						&& targetNode.equals(edge.getTarget())
-						&& (edge.getSource() != null)
-						&& sourceNode.equals(edge.getSource())) {
-					return edge;
-				}
-			}
-		}
-		return null;
-	}
-
-
-	/**
-	 * Create incoming connections
-	 * @param node
-	 */
-	public void incomingConnections(Node node) {
-		List connections = node.getIncomingConnections();
-
-		if (connections != null && connections.size() > 0) {
-			for (Iterator iterator = connections.iterator(); iterator.hasNext();) {
-				Link link = (Link) iterator.next();
-				
-				// create edge
-				Edge edge = createConnection(link);
-
-				ActivityNode sourceNode = (org.eclipse.uml2.uml.ActivityNode) graphUMLNodeMap
-						.get(node);
-				org.eclipse.gmf.runtime.notation.Node sourceNotationNode = findNotationNode(
-						getDiagram(), sourceNode);
-
-				// add the edge as target edge
-				sourceNotationNode.getTargetEdges().add(edge);
-				sourceNotationNode.getDiagram().insertEdge(edge);
-			}
-		}
-	}
-
-	/**
-	 * Create notation edge for the given link
-	 * @param link
-	 * @return
-	 */
-	private Edge createConnection(Link link) {
-		// get source and target objects of the link
-		Node sourceObj = link.getSource();
-		Node targetObj = link.getTarget();
-
-		// get uml nodes
-		ActivityNode sourceUMLNode = (org.eclipse.uml2.uml.ActivityNode) graphUMLNodeMap
-				.get(sourceObj);
-		ActivityNode targetUMLNode = (org.eclipse.uml2.uml.ActivityNode) graphUMLNodeMap
-				.get(targetObj);
-
-		// get notation nodes
-		org.eclipse.gmf.runtime.notation.Node sourceNotationNode = findNotationNode(
-				getDiagram(), sourceUMLNode);
-		org.eclipse.gmf.runtime.notation.Node targetNotationNode = findNotationNode(
-				getDiagram(), targetUMLNode);
-
-		Edge edge = findEdge(sourceNotationNode, targetNotationNode);
-		if (edge == null && targetNotationNode != null) {
-			ControlFlow controlFlow = createControlFlow();
-
-			if (targetUMLNode instanceof ActivityNode) {
-				controlFlow.setSource((ActivityNode) sourceUMLNode);
-				controlFlow.setTarget((ActivityNode) targetUMLNode);
-			}
-
-			// create notation edge
-			edge = MapUtil.createEdge_AD(sourceNotationNode, targetNotationNode,
-					controlFlow);
-			edge.setElement(controlFlow);
-			loadSourceAndTargetEndPoint(edge, link);
-			loadBendPoints(edge, link);
-		}
-		return edge;
-	}
-
-	// private Edge findEdge(org.eclipse.uml2.uml.ControlFlow flow, Diagram
-	// diagram) {
-	// List list = diagram.getChildren();
-	// for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-	// Object object = iterator.next();
-	// if (object instanceof Edge) {
-	// Object element = ((Edge) object).getElement();
-	// if (flow.equals(element)) {
-	// return (Edge) object;
-	// }
-	// }
-	// }
-	// return null;
-	// }
-
-	private Diagram getDiagram() {
-/*		if (diagram == null) {
-			Resource resource = (Resource) resourceSet.getResources().get(0);
-			diagram = (Diagram) resource.getContents().get(1);
-		}*/
-		return diagram;
-	}
-
-	public Activity getActivity() {
-/*		if (activity == null) {
-			// return
-			// (Activity)((Model)getUMLObject()).allOwnedElements().get(0);
-			Resource resource = (Resource) resourceSet.getResources().get(0);
-			activity = (Activity) resource.getContents().get(0);
-		}*/
-		return activity;
-	}
-	// public EObject getUMLObject(){
-	// if(eObject == null){
-	//			
-	// eObject = (Activity)getResource(0).getContents().get(0);
-	// }
-	// return eObject;
-	// }
-
-	public void setDiagram(Diagram diagram) {
-		this.diagram = diagram;
-	}
-
-	public void setActivity(Activity activity) {
-		this.activity = activity;
-	}
-
-	// private Resource getResource(int i){
-	// return (Resource)resourceSet.getResources().get(i);
-	// }
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapUtil.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapUtil.java
deleted file mode 100644
index b8f0e2b..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MapUtil.java
+++ /dev/null
@@ -1,618 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionPoint;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.authoring.gef.util.TemplateConstants;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityFinalNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ActivityParameterNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ControlFlowNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.DecisionNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.ForkNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.InitialNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.JoinNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.MergeNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNode3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeEditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName2EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeName3EditPart;
-import org.eclipse.epf.diagram.ad.edit.parts.StructuredActivityNodeNameEditPart;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.add.edit.parts.RoleTaskCompositeEditPart;
-import org.eclipse.epf.diagram.add.edit.parts.WorkProductCompositeEditPart;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.RoleTaskComposite;
-import org.eclipse.epf.diagram.model.WorkProductComposite;
-import org.eclipse.epf.diagram.model.WorkProductNode;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeEditPart;
-import org.eclipse.epf.diagram.wpdd.edit.parts.WorkProductNodeNameEditPart;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.gmf.runtime.common.ui.services.parser.CommonParserHint;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.diagram.core.util.ViewType;
-import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
-import org.eclipse.gmf.runtime.notation.Bounds;
-import org.eclipse.gmf.runtime.notation.DescriptionStyle;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.FillStyle;
-import org.eclipse.gmf.runtime.notation.FontStyle;
-import org.eclipse.gmf.runtime.notation.LineStyle;
-import org.eclipse.gmf.runtime.notation.Node;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.uml2.uml.ActivityEdge;
-import org.eclipse.uml2.uml.ActivityNode;
-import org.eclipse.uml2.uml.ActivityParameterNode;
-import org.eclipse.uml2.uml.ControlFlow;
-import org.eclipse.uml2.uml.DecisionNode;
-import org.eclipse.uml2.uml.FinalNode;
-import org.eclipse.uml2.uml.ForkNode;
-import org.eclipse.uml2.uml.InitialNode;
-import org.eclipse.uml2.uml.JoinNode;
-import org.eclipse.uml2.uml.MergeNode;
-import org.eclipse.uml2.uml.NamedElement;
-import org.eclipse.uml2.uml.StructuredActivityNode;
-
-/**
- * @author Shilpa Toraskar
- * @since 1.2
- */
-
-public class MapUtil {
-
-	/**
-	 * Create notation node in diagram corresponding to activity node
-	 * 
-	 * @param diagram
-	 * @param umlNode
-	 * @return
-	 */
-	public static Node createNotationNode_AD(Diagram diagram, Object obj) {
-		Node notationNode = null;
-
-		ActivityNode umlNode = obj instanceof ActivityNode ? (ActivityNode) obj
-				: null;
-		if (umlNode instanceof StructuredActivityNode) {
-			String type = BridgeHelper.getEAnnotationType(umlNode,
-					BridgeHelper.UMA_TYPE);
-			if (type.equalsIgnoreCase(BridgeHelper.UMA_PHASE)) {
-				// Phase
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(StructuredActivityNode2EditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						StructuredActivityNodeName2EditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				
-			} else if (type.equalsIgnoreCase(BridgeHelper.UMA_ITERATION)) {
-				// Iteration
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(StructuredActivityNode3EditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						StructuredActivityNodeName3EditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else {
-				// Activity
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(StructuredActivityNodeEditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						StructuredActivityNodeNameEditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			}
-			
-			// set default font style
-			setDefaultFontStyle(notationNode);
-			
-		} else if (umlNode instanceof InitialNode) {
-			notationNode = ViewService.createNode(diagram, umlNode,
-					new Integer(InitialNodeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(notationNode, umlNode, new Integer(
-					InitialNodeNameEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		} else if (umlNode instanceof DecisionNode) {
-			notationNode = ViewService.createNode(diagram, umlNode,
-					new Integer(DecisionNodeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(notationNode, umlNode, new Integer(
-					DecisionNodeNameEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		} else if (umlNode instanceof MergeNode) {
-			notationNode = ViewService.createNode(diagram, umlNode,
-					new Integer(MergeNodeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(notationNode, umlNode, new Integer(
-					MergeNodeNameEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		} else if (umlNode instanceof ForkNode) {
-			notationNode = ViewService.createNode(diagram, umlNode,
-					new Integer(ForkNodeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		} else if (umlNode instanceof JoinNode) {
-			notationNode = ViewService.createNode(diagram, umlNode,
-					new Integer(JoinNodeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		} else if (umlNode instanceof FinalNode) {
-			notationNode = ViewService
-					.createNode(diagram, umlNode, new Integer(
-							ActivityFinalNodeEditPart.VISUAL_ID).toString(),
-							ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(notationNode, umlNode, new Integer(
-					ActivityFinalNodeNameEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		} else if (umlNode instanceof ActivityParameterNode) {
-			String type = BridgeHelper.getEAnnotationType(umlNode,
-					BridgeHelper.UMA_TYPE);
-			if (type.equalsIgnoreCase(BridgeHelper.UMA_MILESTONE)) {
-				// Milestone
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(ActivityParameterNode2EditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService.createNode(notationNode, umlNode, new Integer(
-						ActivityParameterNodeName2EditPart.VISUAL_ID)
-						.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			} else if (type.equalsIgnoreCase(BridgeHelper.UMA_TASK_DESCRIPTOR)) {
-				// TaskDescriptor
-				notationNode = ViewService.createNode(diagram, umlNode,
-						new Integer(ActivityParameterNodeEditPart.VISUAL_ID)
-								.toString(),
-						ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-				ViewService
-						.createNode(notationNode, umlNode, new Integer(
-								ActivityParameterNodeNameEditPart.VISUAL_ID)
-								.toString(),
-								ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			}
-
-			//	set default font style
-			setDefaultFontStyle(notationNode);
-		}
-
-		return notationNode;
-	}
-
-	/**
-	 * Create notation node for model node in ADD and WPD
-	 * @param diagram
-	 * @param obj
-	 * @return
-	 */
-	public static Node createNotationNode_ADDorWPD(Diagram diagram, org.eclipse.epf.diagram.model.Node obj) {
-		Node notationNode = null;
-		org.eclipse.epf.diagram.model.Node node = obj instanceof org.eclipse.epf.diagram.model.Node ? (org.eclipse.epf.diagram.model.Node) obj
-				: null;
-		if (node instanceof RoleTaskComposite) {
-			notationNode = ViewService.createNode(diagram, node, new Integer(
-					RoleTaskCompositeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			/*
-			 * ViewService.createNode(notationNode, node, new Integer(
-			 * RoleTaskCompositeRoleTaskCompartmentEditPart.VISUAL_ID).toString(),
-			 * ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			 */
-		} else if (node instanceof WorkProductComposite) {
-			notationNode = ViewService.createNode(diagram, node, new Integer(
-					WorkProductCompositeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			/*
-			 * ViewService.createNode(notationNode, node, new Integer(
-			 * WorkProductCompositeWorkProductCompartmentEditPart.VISUAL_ID).toString(),
-			 * ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			 */
-		} else if (node instanceof WorkProductNode) {
-			notationNode = ViewService.createNode(diagram, node, new Integer(
-					WorkProductNodeEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(notationNode, node, new Integer(
-					WorkProductNodeNameEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		}
-		
-		// set default font style for notation node
-		setDefaultFontStyle(notationNode);
-		return notationNode;
-	}
-
-	/**
-	 * 
-	 * Create text for free form text
-	 * @param diagram
-	 * @param node
-	 * @return
-	 */
-	public static Node createText(Diagram diagram,
-			org.eclipse.epf.diagram.model.Node node) {
-
-		// create text
-		Node text = ViewService.createNode(diagram, ViewType.TEXT,
-				ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		
-		ViewService.createNode(text, ViewType.DIAGRAM_NAME,
-				ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		ViewService.createNode(text, CommonParserHint.DESCRIPTION,
-				ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-
-		// create description
-		GraphNode graphNode = (GraphNode) node.getObject();
-		String description = ""; //$NON-NLS-1$
-		Property prop = GraphicalDataHelper.getPropertyByKey(graphNode
-				.getProperty(), GraphicalDataHelper.GRAPH_NODE_FREE_TEXT);
-
-		if (prop != null)
-			description = prop.getValue();
-		DescriptionStyle descStyle = (DescriptionStyle) text
-				.getStyle(NotationPackage.Literals.DESCRIPTION_STYLE);
-		descStyle.setDescription(description);
-		
-		// 
-		IPreferenceStore store = (IPreferenceStore) ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT
-				.getPreferenceStore();
-
-		// create fill style
-		FillStyle fillStyle = (FillStyle) text
-				.getStyle(NotationPackage.Literals.FILL_STYLE);
-		if (fillStyle != null) {
-			// fill color
-			RGB fillRGB = PreferenceConverter.getColor(store,
-					IPreferenceConstants.PREF_FILL_COLOR);
-			fillStyle.setFillColor(FigureUtilities.RGBToInteger(fillRGB)
-					.intValue());
-		}
-
-		// create line style
-		LineStyle lineStyle = (LineStyle) text
-				.getStyle(NotationPackage.Literals.LINE_STYLE);
-		if (lineStyle != null) {
-			// line color
-			RGB lineRGB = PreferenceConverter.getColor(store,
-					IPreferenceConstants.PREF_LINE_COLOR);
-			lineStyle.setLineColor(FigureUtilities.RGBToInteger(lineRGB)
-					.intValue());
-		}
-
-		// create font style
-		FontStyle fontStyle = (FontStyle) text
-				.getStyle(NotationPackage.Literals.FONT_STYLE);
-		Font oldFont = null;
-		if (fontStyle != null) {
-			// get font properties
-			String fontName = getPropertyValue(graphNode,
-					TemplateConstants.PROPERTY_FONT_NAME);
-			if (fontName == null) fontName = TemplateConstants.DEFAULT_FONT_NAME;
-			String oldFontStyleStr = getPropertyValue(graphNode,
-					TemplateConstants.PROPERTY_FONT_STYLE);	
-			String fontHeightStr = getPropertyValue(graphNode,
-					TemplateConstants.PROPERTY_FONT_HEIGHT);			
-			String fontRed = getPropertyValue(graphNode,
-					TemplateConstants.PROPERTY_FONT_RED);
-			String fontGreen = getPropertyValue(graphNode,
-					TemplateConstants.PROPERTY_FONT_GREEN);
-			String fontBlue = getPropertyValue(graphNode,
-					TemplateConstants.PROPERTY_FONT_BLUE);
-			
-			int red = 0;
-			int green = 0;
-			int blue = 0;
-
-			if (fontName != null)
-				fontStyle.setFontName(fontName);
-			
-			int oldFontStyle = 0;
-			if (oldFontStyleStr != null) {
-				oldFontStyle = new Integer(oldFontStyleStr).intValue();
-				if (oldFontStyle == 1)
-					fontStyle.setBold(true);
-				if (oldFontStyle == 2)
-					fontStyle.setItalic(true);
-				if (oldFontStyle == 3) {
-					fontStyle.setBold(true);
-					fontStyle.setItalic(true);
-				}
-			}
-			
-			// set font height
-			int fontHeight = TemplateConstants.DEFAULT_FONT_SIZE;
-			if (fontHeightStr != null)
-				fontHeight = new Integer(fontHeightStr).intValue();
-			fontStyle.setFontHeight(fontHeight);
-			
-			// set font RGB color
-			if (fontRed != null)
-				red = new Integer(fontRed).intValue();
-			if (fontGreen != null)
-				green = new Integer(fontGreen).intValue();
-			if (fontBlue != null)
-				blue = new Integer(fontBlue).intValue();
-
-			RGB fontRGB = new RGB(red, green, blue);
-			fontStyle.setFontColor(FigureUtilities.RGBToInteger(fontRGB)
-					.intValue());			
-			
-			// make old font as well
-			oldFont = new Font(null, fontName, fontHeight, oldFontStyle);
-		}
-	
-		Dimension d = FigureUtilities.getTextExtents(description, oldFont);
-		if (oldFont != null) {
-			oldFont.dispose();
-		}
-		int noOfLines = 1;
-		if (d != null && d.width > 0) {
-			if (node.getWidth() == -1)
-				noOfLines = 1;
-			else {
-				int div = d.width / node.getWidth();		
-				int mod = d.width % node.getWidth();
-//				if (mod != 0)
-					div++;
-				noOfLines = div;
-			}
-		}
-
-		int textHeight = d.height;		
-
-		// create layout contraint
-		Bounds bounds = NotationFactory.eINSTANCE.createBounds();
-//		bounds.setHeight(noOfLines * textHeight);
-		if (node.getWidth() == -1) {
-			int textWidth = d.width;
-			bounds.setWidth(textWidth);
-		}
-		else
-			bounds.setWidth(node.getWidth());
-		bounds.setX(node.getLocation().x);
-		bounds.setY(node.getLocation().y);
-
-		text.setLayoutConstraint(bounds);
-		return text;
-	}
-
-	/**
-	 * Create edge for AD diagram
-	 * 
-	 * @param sourceNode
-	 * @param targetNode
-	 * @param actEdge
-	 * @return
-	 */
-	public static Edge createEdge_AD(Node sourceNode, Node targetNode,
-			ActivityEdge actEdge) {
-		if (actEdge instanceof ControlFlow) {
-			Edge edge = ViewService.createEdge(sourceNode, targetNode, actEdge,
-					new Integer(ControlFlowEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(edge, actEdge, new Integer(
-					ControlFlowNameEditPart.VISUAL_ID).toString(),
-					ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			return edge;
-		}
-		
-
-		return null;
-	}
-
-	
-	/**
-	 * Create edge for WPD diagram
-	 * 
-	 * @param sourceNode
-	 * @param targetNode
-	 * @param actEdge
-	 * @return
-	 */
-	public static Edge createEdge_WPD(Node sourceNode, Node targetNode,
-			EObject actEdge) {
-		if (actEdge instanceof Link) {
-			Edge edge = ViewService.createEdge(sourceNode, targetNode, actEdge,
-					new Integer(org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart.VISUAL_ID).toString(),
-					WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(edge, actEdge, new Integer(
-					org.eclipse.epf.diagram.wpdd.edit.parts.LinkEditPart.VISUAL_ID).toString(),
-					WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			return edge;
-		}
-		return null;
-	}
-	
-	
-	/**
-	 * Create edge for ADD diagram
-	 * 
-	 * @param sourceNode
-	 * @param targetNode
-	 * @param actEdge
-	 * @return
-	 */
-	public static Edge createEdge_ADD(Node sourceNode, Node targetNode,
-			EObject actEdge) {
-		if (actEdge instanceof Link) {
-			Edge edge = ViewService.createEdge(sourceNode, targetNode, actEdge,
-					new Integer(org.eclipse.epf.diagram.add.edit.parts.LinkEditPart.VISUAL_ID).toString(),
-					ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			ViewService.createNode(edge, actEdge, new Integer(
-					org.eclipse.epf.diagram.add.edit.parts.LinkEditPart.VISUAL_ID).toString(),
-					ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-			return edge;
-		}
-		return null;
-	}
-	
-	/**
-	 * 
-	 */
-	private static String getPropertyValue(GraphNode graphNode, String key) {
-		Property prop = GraphicalDataHelper.getPropertyByKey(graphNode
-				.getProperty(), key);
-
-		if (prop != null) {
-			return prop.getValue();
-		}
-
-		return null;
-	}
-
-	/**
-	 * Calculates no of lines in the node text based on text width and width of
-	 * figure
-	 * 
-	 * @param node
-	 * @return
-	 */
-	public static int getNoOfLines(Node node) {
-		int noOfLines = 1;
-		if (node.getElement() != null
-				&& node.getElement() instanceof NamedElement) {
-			String text = ((NamedElement) node.getElement()).getName();
-			Font f = TemplateConstants.DEFAULT_FONT;
-			Dimension d = FigureUtilities.getTextExtents(text, f);
-
-			Bounds bounds = (Bounds) node.getLayoutConstraint();
-			if (d != null && d.width > 0) {
-				int div = d.width / bounds.getWidth();
-				int mod = d.width % bounds.getWidth();
-				if (mod != 0)
-					div++;
-				noOfLines = div;
-			}
-		}
-		return noOfLines;
-	}
-
-	/**
-	 * Return height of text of th enode
-	 * 
-	 * @param node
-	 * @return
-	 */
-	public static int getTextHeight(Node node) {
-		if (node.getElement() != null
-				&& node.getElement() instanceof NamedElement) {
-			String text = ((NamedElement) node.getElement()).getName();
-			Font f = TemplateConstants.DEFAULT_FONT;
-			Dimension d = FigureUtilities.getTextExtents(text, f);
-
-			if (d != null)
-				return d.height;
-		}
-		return 0;
-	}
-
-	/**
-	 * Convert point to terminal string
-	 * 
-	 * @param p
-	 * @return
-	 */
-	public static String composeTerminalString(PrecisionPoint p) {
-		final char TERMINAL_START_CHAR = '(';
-		final char TERMINAL_DELIMITER_CHAR = ',';
-		final char TERMINAL_END_CHAR = ')';
-
-		StringBuffer s = new StringBuffer(24);
-		s.append(TERMINAL_START_CHAR); // 1 char
-		s.append((float) p.preciseX); // 10 chars
-		s.append(TERMINAL_DELIMITER_CHAR); // 1 char
-		s.append((float) p.preciseY); // 10 chars
-		s.append(TERMINAL_END_CHAR); // 1 char
-		return s.toString(); // 24 chars max (+1 for safety, i.e. for string
-								// termination)
-	}
-
-	/**
-	 * Get relative anchor location
-	 * 
-	 * @param p
-	 * @param bounds
-	 * @return
-	 */
-	public static PrecisionPoint getAnchorRelativeLocation(Point p,
-			Bounds bounds) {
-		PrecisionPoint relLocation;
-		Point temp = new Point(p);
-		if (p.x < bounds.getX() || p.x > bounds.getX() + bounds.getWidth()
-				|| p.y < bounds.getY()
-				|| p.y > bounds.getY() + bounds.getHeight()) {
-			if (p.x < bounds.getX() || p.x > bounds.getX() + bounds.getWidth()) {
-				temp.x = p.x < bounds.getX() ? bounds.getX() : bounds.getX()
-						+ bounds.getWidth();
-			}
-			if (p.y < bounds.getY() || p.y > bounds.getY() + bounds.getHeight()) {
-				temp.y = p.y < bounds.getY() ? bounds.getY() : bounds.getY()
-						+ bounds.getHeight();
-			}
-			relLocation = new PrecisionPoint((double) (temp.x - bounds.getX())
-					/ bounds.getWidth(), (double) (temp.y - bounds.getY())
-					/ bounds.getHeight());
-		} else {
-
-			relLocation = new PrecisionPoint((double) (temp.x - bounds.getX())
-					/ bounds.getWidth(), (double) (temp.y - bounds.getY())
-					/ bounds.getHeight());
-		}
-		return relLocation;
-	}
-
-	
-	/**
-	 * Set default font style for notation node
-	 * @param notationNode
-	 */
-	private static void setDefaultFontStyle(Node notationNode) {
-		//	create font style
-		FontStyle fontStyle = (FontStyle) notationNode
-				.getStyle(NotationPackage.Literals.FONT_STYLE);
-
-		if (fontStyle != null) {
-
-			// set font name
-			String fontName = TemplateConstants.DEFAULT_FONT_NAME;
-			if (fontName != null)
-				fontStyle.setFontName(fontName);
-
-			// set font height
-			int fontHeight = TemplateConstants.DEFAULT_FONT_SIZE;
-			fontStyle.setFontHeight(fontHeight);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MergeNodeMap.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MergeNodeMap.java
deleted file mode 100644
index c262eee..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/map/MergeNodeMap.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.map;
-
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.uml2.uml.MergeNode;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * 
- * @author Shilpa Toraskar
- * @since 1.2
- *
- */
-public class MergeNodeMap extends MapNode {
-
-	public MergeNodeMap(Node node) {
-		super(node);
-	}
-	
-	/**
-	 * Update uml node
-	 */
-	public void updateNode() {
-		super.updateNode();
-		umlNode = (MergeNode)getActivity().createNode(name = (name != null)? name : " ", //$NON-NLS-1$ 
-						UMLPackage.eINSTANCE.getMergeNode());
-		
-		if(umlNode != null){
-			graphUMLNodeMap.put(node, umlNode);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/services/Workflow2XMIResourceImpl.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/services/Workflow2XMIResourceImpl.java
deleted file mode 100644
index 7d48d74..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/services/Workflow2XMIResourceImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.services;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.XMIResource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.ecore.xmi.XMLSave;
-import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMISaveImpl;
-
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- * 
- */
-
-public class Workflow2XMIResourceImpl extends XMIResourceImpl {
-
-	public static final String DEFAULT_ENCODING = "UTF-8"; //$NON-NLS-1$
-	Map map = new HashMap();
-	/**
-	 * 
-	 */
-	public Workflow2XMIResourceImpl() {
-		super();
-	}
-
-	/**
-	 * @param uri
-	 */
-	public Workflow2XMIResourceImpl(URI uri) {
-		super(uri);
-
-		getDefaultSaveOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-		getDefaultLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
-
-		getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
-
-		getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-		getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-		
-		getDefaultLoadOptions().put(XMLResource.OPTION_ENCODING, DEFAULT_ENCODING);
-		getDefaultSaveOptions().put(XMLResource.OPTION_ENCODING, DEFAULT_ENCODING);
-		
-
-		getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-
-		getDefaultSaveOptions().put(XMIResource.OPTION_USE_XMI_TYPE, Boolean.TRUE);
-		getDefaultLoadOptions().put(XMIResource.OPTION_USE_XMI_TYPE, Boolean.TRUE);
-		setTrackingModification(true);
-		//setIntrinsicIDToEObjectMap(map);
-		idToEObjectMap = new HashMap();
-		createXMLHelper();
-	}
-	
-	protected boolean useUUIDs() {
-		return true;
-	}
-	
-	protected XMLSave createXMLSave() {
-		return new XMISaveImpl(createXMLHelper());
-	}
-	
-	public void save(Map options) throws IOException {
-		super.save(options);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/services/WorkflowExportService.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/services/WorkflowExportService.java
deleted file mode 100644
index a7e5486..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/services/WorkflowExportService.java
+++ /dev/null
@@ -1,473 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.services;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EModelElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.transaction.Transaction;
-import org.eclipse.epf.diagram.ad.part.ActivityDiagramEditorPlugin;
-import org.eclipse.epf.diagram.add.part.ActivityDetailDiagramEditorPlugin;
-import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.model.ActivityDetailDiagram;
-import org.eclipse.epf.diagram.model.ActivityDiagram;
-import org.eclipse.epf.diagram.model.ModelFactory;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.diagram.model.TypedNode;
-import org.eclipse.epf.diagram.model.WorkProductDependencyDiagram;
-import org.eclipse.epf.diagram.model.util.GraphicalDataHelper;
-import org.eclipse.epf.diagram.model.util.GraphicalDataManager;
-import org.eclipse.epf.diagram.wpdd.part.WPDDiagramEditorPlugin;
-import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
-import org.eclipse.epf.library.edit.util.DiagramOptions;
-import org.eclipse.epf.library.edit.util.IDiagramManager;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.migration.diagram.DiagramMigrationPlugin;
-import org.eclipse.epf.migration.diagram.MigrationExportException;
-import org.eclipse.epf.migration.diagram.ad.map.IMapConstants;
-import org.eclipse.epf.migration.diagram.ad.map.MapFactory;
-import org.eclipse.epf.migration.diagram.ad.map.MapNode;
-import org.eclipse.epf.migration.diagram.ad.map.MapUtil;
-import org.eclipse.epf.migration.diagram.addwpd.map.ConnectionFactory;
-import org.eclipse.epf.migration.diagram.util.MigrationUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
-import org.eclipse.gmf.runtime.notation.Bounds;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.uml2.uml.UMLFactory;
-import org.eclipse.uml2.uml.UMLPackage;
-
-/**
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @author Weiping Lu
- * @since 1.2
- */
-
-public class WorkflowExportService {
-
-	public static final String DEFAULT_XMI_EXTENSION = ".xmi"; //$NON-NLS-1$
-
-	protected boolean debug;
-	
-	public static WorkflowExportService singleton = null;
-
-	public static WorkflowExportService getInstance() {
-		if (singleton == null) {
-			singleton = new WorkflowExportService();
-		}
-		return singleton;
-	}
-
-	/**
-	 * Export activity diagram data
-	 * @param proc
-	 * @param activity
-	 * @param fileName
-	 * @param targetDir
-	 * @return
-	 * @throws MigrationExportException
-	 */
-	public boolean export(Process proc, Activity activity, String fileName,
-			File targetDir) throws MigrationExportException {
-
-		debug = DiagramMigrationPlugin.getDefault().isDebugging();
-		
-		// construct the export target xml file path
-		Path exportPath = new Path(targetDir.getAbsolutePath());
-		boolean endWithXmiExt = fileName.toLowerCase().endsWith(
-				DEFAULT_XMI_EXTENSION);
-
-		String exportXMIPath = (exportPath.append(endWithXmiExt ? fileName
-				: (fileName + DEFAULT_XMI_EXTENSION))).toOSString();
-
-
-		URI uri = URI.createFileURI(exportXMIPath);
-		
-/*		// Create resource set
-		ResourceSet resourceSet = new ResourceSetImpl();
-
-		//XMLResourceImpl xmires = new Workflow2XMIResourceImpl(uri);
-		//Resource xmires =  new GMFResourceFactory().createResource(uri);
-		Resource xmires =  DiagramManager.getInstance(proc)
-							.getEditingDomain().getResourceSet().createResource(uri);
-
-		resourceSet.getResources().add(xmires);*/
-		DiagramManager mgr = DiagramManager.getInstance(proc, this);
-		
-		try {
-			Transaction tx =  mgr.getEditingDomain().startTransaction(false,
-					Collections.EMPTY_MAP);
-			Resource xmires = mgr.getResource();
-			tx.commit();
-			
-			// Create temp map
-			IMapConstants.graphUMLNodeMap.clear();
-			
-			if (proc == activity) {
-				Map activities = MigrationUtil.getActivities(proc, true);
-				for (Iterator it = activities.values().iterator(); it.hasNext();) {
-					Activity act = (Activity) it.next();
-					addAD(xmires, proc, act, mgr);
-					addADD(xmires, proc, act, mgr);
-					addWPD(xmires, proc, act, mgr);
-				}
-			} else {
-				addAD(xmires, proc, activity, mgr);
-				addADD(xmires, proc, activity, mgr);
-				addWPD(xmires, proc, activity, mgr);
-			}
-
-/*			tx.commit();*/
-			
-			List contents = xmires.getContents();
-			if (contents != null && ! contents.isEmpty()) {
-				xmires.save(null);
-			}
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw new MigrationExportException(e);
-		} finally {
-			if(mgr != null) {
-				mgr.removeConsumer(this);
-			}
-		}
-
-		return true;
-	}
-	
-	private void addDataToResource_WPD(Resource xmiResource, Process proc,
-			Activity umaActivity) {	
-		
-		org.eclipse.epf.uma.Diagram d  = GraphicalDataManager.getInstance().getUMADiagram(umaActivity, IDiagramManager.WORK_PRODUCT_DEPENDENCY_DIAGRAM, false);
-		if (d != null) {
-			if (debug) {
-				System.out.println("WPDD->"+proc.getName()+"::"+umaActivity.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			WorkProductDependencyDiagram wpdDiagram = ModelFactory.eINSTANCE
-					.createWorkProductDependencyDiagram();
-			addDataToResource_ADDorWPD(proc, umaActivity, xmiResource,
-					wpdDiagram);
-		}
-	}
-	
-
-	private void addDataToResource_ADD(Resource xmiResource,
-			Process proc, Activity umaActivity) {
-		org.eclipse.epf.uma.Diagram d = GraphicalDataManager.getInstance()
-				.getUMADiagram(umaActivity,
-						IDiagramManager.ACTIVITY_DETAIL_DIAGRAM, false);
-		if (d != null) {
-			if (debug) {
-				System.out.println("ADD->"+proc.getName()+":"+umaActivity.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			ActivityDetailDiagram addDiagram = ModelFactory.eINSTANCE
-					.createActivityDetailDiagram();
-			addDataToResource_ADDorWPD(proc, umaActivity, xmiResource,
-					addDiagram);
-		}
-	}
-
-	private void addDataToResource_ADDorWPD(Process proc, Activity umaActivity, 
-			Resource xmiResource, org.eclipse.epf.diagram.model.Diagram addOrWpdDiagram) {
-		Suppression sup = new Suppression(proc);
-		addOrWpdDiagram.setSuppression(sup);
-		String kind = null;
-		PreferencesHint prefHint = null;
-		if (addOrWpdDiagram instanceof ActivityDetailDiagram) {
-			addOrWpdDiagram.setFilter(ProcessAuthoringConfigurator.INSTANCE);
-			kind = DiagramManager.ADD_kind;
-			prefHint = ActivityDetailDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		} else if (addOrWpdDiagram instanceof WorkProductDependencyDiagram) {
-			kind = DiagramManager.WPD_kind;
-			prefHint = WPDDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT;
-		} else {
-			throw new UnsupportedOperationException();
-		}
-		addOrWpdDiagram.setObject(umaActivity);
-		addOrWpdDiagram.setLinkedElement(umaActivity);
-		
-		//	set suppression/published info for ADD/ WPDD
-		org.eclipse.epf.uma.Diagram umaDiagram = addOrWpdDiagram.getUMADiagram();
-		if (umaDiagram != null) {
-			if (umaDiagram.getSuppressed().booleanValue()) {	
-				if (addOrWpdDiagram instanceof ActivityDetailDiagram){
-					DiagramOptions.setPublishADD(umaActivity, false);
-				}
-				else if (addOrWpdDiagram instanceof WorkProductDependencyDiagram) {
-					DiagramOptions.setPublishWPDD(umaActivity, false);
-				}
-			}
-		}
-		// get autoLayout flag if diagram is ADD
-		if (addOrWpdDiagram instanceof ActivityDetailDiagram) {
-			boolean value = GraphicalDataHelper
-					.isAutoLayout((ActivityDetailDiagram) addOrWpdDiagram);
-			((ActivityDetailDiagram) addOrWpdDiagram).setAutoLayout(value);
-		}
-		
-		// Create diagram
-		Diagram diagram = ViewService.createDiagram(addOrWpdDiagram, kind,
-				prefHint);
-		diagram.setElement(addOrWpdDiagram);
-		diagram.setName(umaActivity.getName());
-		
-		xmiResource.getContents().add(addOrWpdDiagram);
-		xmiResource.getContents().add(diagram);
-		
-		List nodes = new ArrayList();
-		HashMap map = new HashMap();
-		
-		
-		List diagramNodes = addOrWpdDiagram.getNodes();
-		for (Iterator iterator = diagramNodes.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof Node ) {
-				Node node = (Node) obj;
-				if ((obj instanceof TypedNode) &&
-						(((TypedNode)obj).getType() == TypedNode.FREE_TEXT))	{	
-					// do special handing for free text node					
-					org.eclipse.gmf.runtime.notation.Node text = MapUtil.createText(diagram, (Node) obj);
-					diagram.insertChild(text);
-				}
-				else {
-					// Create Notation nnode
-					org.eclipse.gmf.runtime.notation.Node notationNode = MapUtil.createNotationNode_ADDorWPD(diagram, node);
-					if (notationNode == null) {
-						continue;
-					}
-					diagram.insertChild(notationNode);
-
-					Bounds bounds = NotationFactory.eINSTANCE.createBounds();
-					bounds.setHeight(node.getHeight());
-					bounds.setWidth(node.getWidth());
-					bounds.setX(node.getLocation().x);
-					bounds.setY(node.getLocation().y);
-					notationNode.setLayoutConstraint(bounds);
-
-					notationNode.setElement(node);
-				
-					nodes.add(node);
-					map.put(node, notationNode);
-				}
-			}
-		}
-		
-		
-		ConnectionFactory factory = new ConnectionFactory(diagram, map, kind);
-		// Create Outgoing connections
-		for (Iterator iterator = nodes.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof Node) {
-				factory.outgoingConnections((Node) obj);
-			}
-		}
-
-		// Create Outgoing connections
-		for (Iterator iterator = nodes.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof Node) {
-				factory.incomingConnections((Node) obj);
-			}
-		}
-		
-	}
-	
-
-	/**
-	 * 
-	 * @param resource
-	 * @param list
-	 * @param process
-	 */
-	private void addDataToResource_AD( Resource xmiResource, Process proc,
-			Activity umaActivity) {
-
-		org.eclipse.epf.uma.Diagram d = GraphicalDataManager.getInstance()
-				.getUMADiagram(umaActivity, IDiagramManager.ACTIVITY_DIAGRAM,
-						false);
-		if (d == null) {
-			return;
-		}
-		if (debug) {
-			System.out.println("AD->"+proc.getName()+":"+umaActivity.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		
-		// Create top level UML activity
-		EObject activity = UMLFactory.eINSTANCE.create(UMLPackage.eINSTANCE
-				.getActivity());
-		if (activity instanceof org.eclipse.uml2.uml.Activity) {
-			((org.eclipse.uml2.uml.Activity)activity).setName(umaActivity.getName());
-		}
-		if (activity instanceof EModelElement) {
-			//BridgeHelper.addEAnnotation((EModelElement) activity, ((MethodElement) umaActivity));
-//			UmaUmlUtil.createEAnnotationForUml((NamedElement) activity,
-//					umaActivity.getGuid());
-			
-			BridgeHelper.associate((EModelElement) activity, umaActivity);
-		}
-		
-		// Create diagram
-		Diagram diagram = ViewService.createDiagram(activity, DiagramManager.AD_kind,
-				ActivityDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
-		diagram.setElement(activity);
-		if (activity instanceof org.eclipse.uml2.uml.Activity) {
-			diagram.setName(umaActivity.getName());
-		}
-	
-		Suppression suppression = new Suppression(proc);
-		
-		ActivityDiagram ad = ModelFactory.eINSTANCE.createActivityDiagram();
-		ad.setSuppression(suppression);
-		ad.setObject(umaActivity);
-		if (ad.isNew()) {
-			return;
-		}
-		
-		// set suppression/published info for AD 
-		org.eclipse.epf.uma.Diagram umaDiagram = ad.getUMADiagram();
-		if (umaDiagram != null) {
-			if (umaDiagram.getSuppressed().booleanValue()) {	
-				DiagramOptions.setPublishAD(umaActivity, false);
-			}
-		}
-		
-//		return (List) ad.getNodes();
-		
-//		List diagramNodes = getActivityDiagramData(suppression, umaActivity);
-		List diagramNodes = ad.getNodes();
-		if (diagramNodes == null) {
-			return;
-		}
-		
-
-
-		xmiResource.getContents().add(activity);
-		xmiResource.getContents().add(diagram);
-			
-		List mapNodes = new ArrayList();
-		HashMap mapNodesMap = new HashMap();
-		
-		// Create UML and notation nodes
-		for (Iterator iterator = diagramNodes.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof Node ) {
-				if ((obj instanceof TypedNode) &&
-						(((TypedNode)obj).getType() == TypedNode.FREE_TEXT))	{	
-					// do special handing for free text node
-					org.eclipse.gmf.runtime.notation.Node text = MapUtil.createText(diagram, (Node) obj);
-				}
-				else {
-					MapNode mapNode = MapFactory.getInstance().create((Node) obj);
-					mapNode.setActivity((org.eclipse.uml2.uml.Activity)activity);
-					mapNode.setDiagram(diagram);
-					
-					mapNode.updateResource();
-					mapNodes.add(mapNode);
-					mapNodesMap.put(mapNode, (Node) obj);
-				}
-			}
-		}
-		
-		// Create Outgoing connections
-		for (Iterator iterator = mapNodes.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof MapNode) {
-				((MapNode) obj).outgoingConnections((Node) mapNodesMap.get((MapNode) obj));
-			}
-		}
-		
-		// Create incoming connections
-		for (Iterator iterator = mapNodes.iterator(); iterator.hasNext();) {
-			Object obj = iterator.next();
-			if (obj instanceof MapNode) {
-				((MapNode) obj).incomingConnections((Node) mapNodesMap.get((MapNode) obj));
-			}
-		}
-	}
-	
-	
-	/**
-	 * Return activity diagram data
-	 * @param sup
-	 * @param activity
-	 * @return
-	 */
-	private List getActivityDiagramData(Suppression sup, Activity activity) {
-		ActivityDiagram ad = ModelFactory.eINSTANCE.createActivityDiagram();
-		ad.setSuppression(sup);
-		ad.setObject(activity);
-		if (ad.isNew()) {
-			return null;
-		}
-		return (List) ad.getNodes();
-
-	}
-	
-	private void addAD(final Resource resource, final Process proc,
-			final Activity umaActivity, final DiagramManager mgr) {
-		addToResource(resource, proc, umaActivity, mgr, 0);
-	}
-	
-	private void addADD(final Resource resource, final Process proc,
-			final Activity umaActivity, final DiagramManager mgr) {
-		addToResource(resource, proc, umaActivity, mgr, 1);
-	}
-	
-	private void addWPD(final Resource resource, final Process proc,
-			final Activity umaActivity, final DiagramManager mgr) {
-		addToResource(resource, proc, umaActivity, mgr, 2);
-	}
-	
-	//type: 0=AD, 1=ADD, 2=WPD
-	private void addToResource(final Resource resource,
-			final Process proc, final Activity umaActivity,
-			final DiagramManager mgr, final int type) {
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				try {
-					Transaction tx = mgr.getEditingDomain().startTransaction(
-							false, Collections.EMPTY_MAP);
-
-					if (type == 0) {
-						addDataToResource_AD(resource, proc, umaActivity);
-					} else if (type == 1) {
-						addDataToResource_ADD(resource, proc, umaActivity);
-					} else if (type == 2) {
-						addDataToResource_WPD(resource, proc, umaActivity);
-					} else {
-						assert (false);
-					}
-					
-					tx.commit();
-				} catch (Exception e) {
-
-				}
-			}
-		});
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/wizards/MigrationExportWizard.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/wizards/MigrationExportWizard.java
deleted file mode 100644
index cd23b80..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/wizards/MigrationExportWizard.java
+++ /dev/null
@@ -1,150 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.migration.diagram.DiagramMigrationPlugin;
-import org.eclipse.epf.migration.diagram.MigrationExportException;
-import org.eclipse.epf.migration.diagram.MigrationResources;
-import org.eclipse.epf.migration.diagram.ad.services.WorkflowExportService;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Export wizard for exporting diagrams
- * 
- * @author Shashidhar Kannoori
- * @author Shilpa Toraskar
- * @since 1.2
- * 
- */
-public class MigrationExportWizard extends Wizard implements IExportWizard {
-
-	// The workbench instance.
-	protected IWorkbench workbench;
-
-	// The workbench selection when the wizard was started.
-	protected IStructuredSelection selection;
-
-	// The first wizard page.
-	protected MigrationExportWizardPage page1;
-
-	/**
-	 * Constructor for diagram migration export
-	 */
-	public MigrationExportWizard() {
-		super();
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (page1 != null) {
-
-			Process proc = page1.getProcess();
-			Activity activity = page1.getActivity();
-			// MethodConfiguration mc = page1.getContext();
-
-			String fileName = page1.getTemplateName();
-			String targetDir = page1.getTargetDirectory();
-
-			String templateFileName = fileName + ".xmi"; //$NON-NLS-1$
-			File templateFile = new File(targetDir, templateFileName);
-			if (templateFile.exists()) {
-				boolean ok = DiagramMigrationPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayPrompt(
-								MigrationResources.workflow_overwriteTextDialog_title,
-								MigrationResources
-										.bind(
-												MigrationResources.workflow_overwriteText_msg,
-												new Object[] {
-														templateFileName,
-														targetDir }));
-
-				if (!ok) {
-					return false;
-				}
-			}
-
-			try {
-				boolean success = WorkflowExportService.getInstance().export(
-						proc, activity, fileName, new File(targetDir));
-
-				if (success) {
-					return true;
-				}
-
-			} catch (MigrationExportException xe) {
-				xe.printStackTrace();
-			}
-
-		}
-
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		this.workbench = workbench;
-		this.selection = selection;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		// super.addPages();
-		MethodLibrary lib = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		if (lib == null) {
-			DiagramMigrationPlugin.getDefault().getMsgDialog()
-					.displayError(
-							MigrationResources.open_method_library_error_title,
-							MigrationResources.open_method_library_error_text);
-
-			return;
-		}
-
-		page1 = new MigrationExportWizardPage();
-		addPage(page1);
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
-	 */
-	public boolean canFinish() {
-		// return super.canFinish();
-		return page1.isPageComplete();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/wizards/MigrationExportWizardPage.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/wizards/MigrationExportWizardPage.java
deleted file mode 100644
index 86e019e..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/ad/wizards/MigrationExportWizardPage.java
+++ /dev/null
@@ -1,423 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.ad.wizards;
-
-import java.util.Map;
-
-import org.eclipse.epf.migration.diagram.DiagramMigrationPlugin;
-import org.eclipse.epf.migration.diagram.MigrationExportConstants;
-import org.eclipse.epf.migration.diagram.MigrationResources;
-import org.eclipse.epf.migration.diagram.util.MigrationUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Export wizard page for exporting diagrams
- * 
- * @author Shilpa Toraskar
- * @since 1.2
- *
- */
-public class MigrationExportWizardPage extends WizardPage implements
-		IWizardPage, Listener {
-
-	public static final String PAGE_NAME = MigrationExportWizardPage.class
-			.getName();
-
-	private static final String[] EMPTY_ARRAY = new String[0];
-
-	private Button capabilityPatternRadioButton;
-
-	private Button deliveryProcessRadioButton;
-
-	private Combo processCombo;
-
-//	private Combo contextCombo;
-
-	private Combo activityCombo;
-
-	private Combo templateNameCombo;
-
-	private Combo templateDirCombo;
-
-	private Map capabilityPatterns;
-
-	private Map deliveryProcesses;
-
-	private Map activities;
-
-	private ModifyListener modifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			setPageComplete(isPageComplete());
-		}
-	};
-
-	protected MigrationExportWizardPage() {
-		super(PAGE_NAME);
-		setTitle(MigrationResources.workflow_export_wizard_title);
-		setDescription(MigrationResources.workflow_export_wizard_text);
-		
-		setImageDescriptor(DiagramMigrationPlugin.getDefault()
-				.getImageDescriptor("full/wizban/ExportXML.gif")); //$NON-NLS-1$
-	}
-
-	public void createControl(Composite parent) {
-		final Shell shell = parent.getShell();
-
-		// Create the composite to hold the widgets.
-		Composite composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout(1, false));
-
-		// Create the Process group.
-		Group processGroup = new Group(composite, SWT.NULL);
-		processGroup.setLayout(new GridLayout(1, false));
-		processGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		processGroup
-				.setText(MigrationResources.workflow_export_wizard_processGroup_text);
-
-		Composite buttonComposite = new Composite(processGroup, SWT.NULL);
-		buttonComposite.setLayout(new GridLayout(2, false));
-
-		capabilityPatternRadioButton = new Button(buttonComposite, SWT.RADIO);
-		capabilityPatternRadioButton
-				.setText(MigrationResources.workflow_export_wizard_capabilityPatternRadioButton_text);
-		capabilityPatternRadioButton
-				.addSelectionListener(new SelectionListener() {
-					public void widgetSelected(SelectionEvent event) {
-						updateProcessCombo(capabilityPatterns);
-						updateActivityCombo(getProcess());
-					}
-
-					public void widgetDefaultSelected(SelectionEvent event) {
-					}
-				});
-
-		deliveryProcessRadioButton = new Button(buttonComposite, SWT.RADIO);
-		deliveryProcessRadioButton
-				.setText(MigrationResources.workflow_export_wizard_deliveryProcessRadioButton_text);
-		deliveryProcessRadioButton
-				.addSelectionListener(new SelectionListener() {
-					public void widgetSelected(SelectionEvent event) {
-						updateProcessCombo(deliveryProcesses);
-						updateActivityCombo(getProcess());
-					}
-
-					public void widgetDefaultSelected(SelectionEvent event) {
-					}
-				});
-
-		Composite processComposite = new Composite(processGroup, SWT.NULL);
-		processComposite.setLayout(new GridLayout(2, false));
-		processComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label processNameLabel = new Label(processComposite, SWT.NONE);
-		processNameLabel
-				.setText(MigrationResources.workflow_export_wizard_processNameLabel_text);
-
-		processCombo = new Combo(processComposite, SWT.BORDER | SWT.READ_ONLY);
-		processCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		processCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-//				updateContextCombo(getProcess());
-//				if (getProcessContextName() != null) {
-//					String contextName = getProcessContextName();
-//					Map result = MigrationUtil.getContexts(getProcess());
-//					updateActivityCombo(getProcess(),
-//							(MethodConfiguration) result.get(contextName));
-//				}
-				updateActivityCombo(getProcess());
-			}
-
-			public void widgetDefaultSelected(SelectionEvent event) {
-			}
-		});
-
-//		Label contextNameLabel = new Label(processComposite, SWT.NONE);
-//		contextNameLabel
-//				.setText(MigrationResources.workflow_export_wizard_contextNameLabel_text);
-//
-//		contextCombo = new Combo(processComposite, SWT.BORDER | SWT.READ_ONLY);
-//		contextCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-//		contextCombo.addModifyListener(modifyListener);
-//
-//		contextCombo.addSelectionListener(new SelectionListener() {
-//			public void widgetSelected(SelectionEvent event) {
-//				String contextName = getProcessContextName();
-//				Map result = MigrationUtil.getContexts(getProcess());
-//				updateActivityCombo(getProcess(), (MethodConfiguration) result
-//						.get(contextName));
-//			}
-//
-//			public void widgetDefaultSelected(SelectionEvent event) {
-//			}
-//		});
-
-		Label activitiesNameLabel = new Label(processComposite, SWT.NONE);
-		activitiesNameLabel
-				.setText(MigrationResources.workflow_export_wizard_activitiesNameLabel_text);
-
-		activityCombo = new Combo(processComposite, SWT.BORDER | SWT.READ_ONLY);
-		activityCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		activityCombo.addModifyListener(modifyListener);
-
-		capabilityPatterns = MigrationUtil.getCapabilityPatterns();
-		deliveryProcesses = MigrationUtil.getDeliveryProcesses();
-		String savedProcessType = DiagramMigrationPlugin.getDefault()
-				.getPreferenceStore().getString(
-						MigrationExportConstants.PROCESS_TYPE);
-		if (savedProcessType != null
-				&& savedProcessType.equals("DeliveryProcess") && deliveryProcesses.size() > 0) { //$NON-NLS-1$
-			deliveryProcessRadioButton.setSelection(true);
-			updateProcessCombo(deliveryProcesses);
-		} else if (savedProcessType != null && capabilityPatterns != null && capabilityPatterns.size() > 0) {
-			capabilityPatternRadioButton.setSelection(true);
-			updateProcessCombo(capabilityPatterns);
-		} else if (capabilityPatterns != null && capabilityPatterns.size() > 0) {
-			capabilityPatternRadioButton.setSelection(true);
-			updateProcessCombo(capabilityPatterns);
-		} else {
-			deliveryProcessRadioButton.setSelection(true);
-			updateProcessCombo(deliveryProcesses);
-		}
-
-		updateActivityCombo(getProcess());
-		
-		// Create the Project Template group.
-		Group templateGroup = new Group(composite, SWT.NULL);
-		templateGroup.setLayout(new GridLayout(1, false));
-		templateGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		templateGroup
-				.setText(MigrationResources.workflow_export_wizard_templateGroup_text);
-
-		Composite templateComposite = new Composite(templateGroup, SWT.NULL);
-		templateComposite.setLayout(new GridLayout(3, false));
-		templateComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label templateNameLabel = new Label(templateComposite, SWT.NONE);
-		templateNameLabel
-				.setText(MigrationResources.workflow_export_wizard_templateNameLabel_text);
-
-		templateNameCombo = new Combo(templateComposite, SWT.BORDER);
-		templateNameCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		String prevName = DiagramMigrationPlugin.getDefault()
-				.getPreferenceStore().getString(
-						MigrationExportConstants.TEMPLATE_NAMES);
-		if (prevName != null) {
-			templateNameCombo.add(prevName);
-		}
-		templateNameCombo.addModifyListener(modifyListener);
-
-		new Label(templateComposite, SWT.NONE);
-
-		Label dirLabel = new Label(templateComposite, SWT.NONE);
-		dirLabel
-				.setText(MigrationResources.workflow_export_wizard_dirLabel_text);
-
-		templateDirCombo = new Combo(templateComposite, SWT.BORDER);
-		templateDirCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		String savedDir = DiagramMigrationPlugin.getDefault()
-				.getPreferenceStore().getString(
-						MigrationExportConstants.TARGET_DIRECTORIES);
-		if (savedDir != null) {
-			templateDirCombo.add(savedDir);
-			templateDirCombo.setText(savedDir);
-		}
-		templateDirCombo.addModifyListener(modifyListener);
-
-		Button browseButton = new Button(templateComposite, SWT.NONE);
-		browseButton
-				.setText(MigrationResources.workflow_export_wizard_browseButton_text);
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				try {
-					DirectoryDialog dialog = new DirectoryDialog(shell,
-							SWT.NONE);
-					String selectedDir = dialog.open();
-					if (selectedDir != null) {
-						templateDirCombo.add(selectedDir, 0);
-						templateDirCombo.setText(selectedDir);
-					}
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
-			}
-		});
-
-		setControl(composite);
-	}
-
-	public void handleEvent(Event event) {
-	}
-
-	/**
-	 * Updates the Process Combo.
-	 */
-	protected void updateProcessCombo(Map processes) {
-		if (processes != null && processes.size() > 0) {
-			String[] names = new String[processes.size()];
-			processes.keySet().toArray(names);
-			processCombo.setItems(names);
-			String savedProcess = DiagramMigrationPlugin.getDefault()
-					.getPreferenceStore().getString(
-							MigrationExportConstants.PROCESS_NAME);
-			if (savedProcess != null && processes.containsKey(savedProcess)) {
-				processCombo.setText(savedProcess);
-			} else {
-				processCombo.setText(processCombo.getItem(0));
-			}
-//			updateContextCombo(getProcess());
-		} else {
-			processCombo.setItems(EMPTY_ARRAY);
-		}
-	}
-
-	/**
-	 * Updates the Context Combo.
-	 */
-//	protected void updateContextCombo(Process process) {
-//		try {
-//			Map contexts = MigrationUtil.getContexts(process);
-//			if (contexts != null && contexts.size() > 0) {
-//				String[] names = new String[contexts.size()];
-//				contexts.keySet().toArray(names);
-//				contextCombo.setItems(names);
-//				String savedContext = DiagrammingMigrationPlugin.getDefault()
-//						.getPreferenceStore().getString(
-//								MigrationExportConstants.PROCESS_CONTEXT);
-//				if (savedContext != null && contexts.containsKey(savedContext)) {
-//					contextCombo.setText(savedContext);
-//				} else {
-//					String defaultContext = process.getDefaultContext()
-//							.getName();
-//					contextCombo.setText(defaultContext);
-//				}
-//			} else {
-//				contextCombo.setItems(EMPTY_ARRAY);
-//			}
-//		} catch (Exception e) {
-//		}
-//	}
-
-	/**
-	 * Updates the activitity Combo.
-	 */
-	protected void updateActivityCombo(Process process) {
-		try {
-			activities = MigrationUtil.getActivities(process);
-			if (activities != null && activities.size() > 0) {
-				String[] names = new String[activities.size()];
-				activities.keySet().toArray(names);
-				activityCombo.setItems(names);
-				// String savedContext = WorkflowExpPlugin.getDefault()
-				// .getPreferenceStore().getString(
-				// WorkflowExportConstants.ACTIVITY_CONTEXT);
-				// if (savedContext != null &&
-				// contexts.containsKey(savedContext)) {
-				// activityCombo.setText(savedContext);
-				// } else {
-				// String defaultContext = process.getDefaultContext()
-				// .getName();
-				// activityCombo.setText(defaultContext);
-				// }
-				activityCombo.setText(names[0]);
-			} else {
-				activityCombo.setItems(EMPTY_ARRAY);
-			}
-			
-		} catch (Exception e) {
-		}
-	}
-
-	/**
-	 * Returns the selected Process.
-	 */
-	public Process getProcess() {
-		if (capabilityPatternRadioButton.getSelection()) {
-			String name = processCombo.getText();
-			return (Process) capabilityPatterns.get(name);
-		} else {
-			String name = processCombo.getText();
-			return (Process) deliveryProcesses.get(name);
-		}
-	}
-
-	/**
-	 * Returns the selected Process context.
-	 */
-//	public String getProcessContextName() {
-//		return (String) contextCombo.getText();
-//	}
-
-	/**
-	 * Returns the template name.
-	 */
-	public String getTemplateName() {
-		return templateNameCombo.getText();
-	}
-
-	/**
-	 * Returns the target directory.
-	 */
-	public String getTargetDirectory() {
-		return templateDirCombo.getText();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		if (processCombo.getText().trim().length() > 0
-//				&& contextCombo.getText().trim().length() > 0
-				&& templateNameCombo.getText().trim().length() > 0
-				&& templateDirCombo.getText().trim().length() > 0
-				&& activityCombo.getText().trim().length() > 0) {
-			return true;
-		}
-		return false;
-	}
-
-	public Activity getActivity() {
-		if (activityCombo.getSelectionIndex() != -1) {
-			String activityName = activityCombo.getText();
-			Activity activity = (Activity) activities.get(activityName);
-			return activity;
-		}
-		return null;
-	}
-
-//	public MethodConfiguration getContext() {
-//		if (getProcessContextName() != null) {
-//			String contextName = getProcessContextName();
-//			Map result = MigrationUtil.getContexts(getProcess());
-//			return (MethodConfiguration) result.get(contextName);
-//		}
-//		return null;
-//	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/addwpd/map/ConnectionFactory.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/addwpd/map/ConnectionFactory.java
deleted file mode 100644
index 487a225..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/addwpd/map/ConnectionFactory.java
+++ /dev/null
@@ -1,286 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.addwpd.map;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AbsoluteBendpoint;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionPoint;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.diagram.model.Link;
-import org.eclipse.epf.diagram.model.Node;
-import org.eclipse.epf.migration.diagram.ad.map.MapUtil;
-import org.eclipse.gmf.runtime.notation.Bounds;
-import org.eclipse.gmf.runtime.notation.Diagram;
-import org.eclipse.gmf.runtime.notation.Edge;
-import org.eclipse.gmf.runtime.notation.IdentityAnchor;
-import org.eclipse.gmf.runtime.notation.NotationFactory;
-import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
-import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint;
-
-/**
- * 
- * @author Shilpa Toraskar
- * @since 1.2
- * 
- */
-public class ConnectionFactory {
-
-	private HashMap map = null;
-
-	private Diagram diagram = null;
-
-	private String kind;
-
-	private static final int IMAGE_HEIGHT = 32;
-
-	public ConnectionFactory(Diagram diagram, HashMap map, String kind) {
-		this.map = map;
-		this.diagram = diagram;
-		this.kind = kind;
-	}
-
-	/**
-	 * Create outgoing connections
-	 * 
-	 * @param node
-	 */
-	public void outgoingConnections(Node node) {
-		List connections = node.getOutgoingConnections();
-
-		if (connections != null && connections.size() > 0) {
-			for (Iterator iterator = connections.iterator(); iterator.hasNext();) {
-				Link link = (Link) iterator.next();
-
-				// create connection
-				Edge edge = createConnection(link);
-
-				// get source node
-				org.eclipse.gmf.runtime.notation.Node sourceNotationNode = (org.eclipse.gmf.runtime.notation.Node) map
-						.get(node);
-
-				// add the edge as source edge
-				sourceNotationNode.getSourceEdges().add(edge);
-				sourceNotationNode.getDiagram().insertEdge(edge);
-
-			}
-		}
-	}
-
-	/**
-	 * Create incoming connections
-	 * 
-	 * @param node
-	 */
-	public void incomingConnections(Node node) {
-		List connections = node.getIncomingConnections();
-
-		if (connections != null && connections.size() > 0) {
-			for (Iterator iterator = connections.iterator(); iterator.hasNext();) {
-				Link link = (Link) iterator.next();
-
-				// create edge
-				Edge edge = createConnection(link);
-
-				// get source node
-				org.eclipse.gmf.runtime.notation.Node sourceNotationNode = (org.eclipse.gmf.runtime.notation.Node) map
-						.get(node);
-
-				// add the edge as target edge
-				sourceNotationNode.getTargetEdges().add(edge);
-				sourceNotationNode.getDiagram().insertEdge(edge);
-			}
-		}
-	}
-
-	/**
-	 * Create notation edge for the given link
-	 * 
-	 * @param link
-	 * @return
-	 */
-	private Edge createConnection(Link link) {
-		// get source and target objects of the link
-		Node sourceObj = link.getSource();
-		Node targetObj = link.getTarget();
-
-		// get notation nodes
-		org.eclipse.gmf.runtime.notation.Node sourceNotationNode = (org.eclipse.gmf.runtime.notation.Node) map
-				.get(sourceObj);
-		org.eclipse.gmf.runtime.notation.Node targetNotationNode = (org.eclipse.gmf.runtime.notation.Node) map
-				.get(targetObj);
-
-		Edge edge = findEdge(sourceNotationNode, targetNotationNode);
-		if (edge == null && targetNotationNode != null) {
-			// create notation edge
-			if (kind == DiagramManager.ADD_kind)
-				edge = MapUtil.createEdge_WPD(sourceNotationNode,
-						targetNotationNode, link);
-			else if (kind == DiagramManager.WPD_kind)
-				edge = MapUtil.createEdge_WPD(sourceNotationNode,
-						targetNotationNode, link);
-
-			if (edge == null)
-				return null;
-
-			edge.setElement(link);
-			loadSourceAndTargetEndPoint(edge, link);
-			loadBendPoints(edge, link);
-		}
-		return edge;
-	}
-
-	/**
-	 * Loads source and target end points for synchronization bar and decision
-	 * node
-	 * 
-	 * @param edge
-	 * @param flow
-	 */
-	private void loadSourceAndTargetEndPoint(Edge edge, Link flow) {
-		Point srcPoint = flow.getSourceEndPoint();
-		Point targetPoint = flow.getTargetEndPoint();
-
-		View srcView = edge.getSource();
-		View targetView = edge.getTarget();
-
-		if (srcPoint != null
-				&& srcView instanceof org.eclipse.gmf.runtime.notation.Node) {
-			Bounds bounds = (Bounds) ((org.eclipse.gmf.runtime.notation.Node) srcView)
-					.getLayoutConstraint();
-			// for WPD, height is not stored and it's always same.
-			// We do need correct height to calculate identity anchor in GMF
-			if (bounds.getHeight() == -1)
-				bounds.setHeight(40);
-			IdentityAnchor anchor = createIdentityAnchor(srcPoint, bounds);
-			if (anchor != null)
-				edge.setSourceAnchor(anchor);
-		}
-
-		if (targetPoint != null
-				&& targetView instanceof org.eclipse.gmf.runtime.notation.Node) {
-			Bounds bounds = (Bounds) ((org.eclipse.gmf.runtime.notation.Node) targetView)
-					.getLayoutConstraint();
-			// For WPD, height is not stored and it's always same.
-			// We do need correct height to calculate identity anchor in GMF
-			if (bounds.getHeight() == -1)
-				bounds.setHeight(40);
-			IdentityAnchor anchor = createIdentityAnchor(targetPoint, bounds);
-			if (anchor != null)
-				edge.setTargetAnchor(anchor);
-		}
-	}
-
-	/**
-	 * Create identity anchor
-	 * 
-	 * @param point
-	 * @param bounds
-	 * @return
-	 */
-	private IdentityAnchor createIdentityAnchor(Point point, Bounds bounds) {
-		PrecisionPoint prePoint = MapUtil.getAnchorRelativeLocation(point,
-				bounds);
-		String id = MapUtil.composeTerminalString(prePoint);
-
-		IdentityAnchor value = NotationFactory.eINSTANCE.createIdentityAnchor();
-		value.setId(id);
-
-		return value;
-	}
-
-	/**
-	 * Load relative bend points
-	 * 
-	 * @param edge
-	 * @param flow
-	 */
-	private void loadBendPoints(Edge edge, Link flow) {
-		List list = flow.getBendpoints();
-		List<RelativeBendpoint> relativePoints = new ArrayList<RelativeBendpoint>();
-
-		RelativeBendpoint rbp = new RelativeBendpoint(0, 0, 0, 0);
-
-		relativePoints.add(rbp);
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				AbsoluteBendpoint abp = (AbsoluteBendpoint) iterator.next();
-
-				org.eclipse.gmf.runtime.notation.Node srcNode = (org.eclipse.gmf.runtime.notation.Node) edge
-						.getSource();
-				org.eclipse.gmf.runtime.notation.Node targetNode = (org.eclipse.gmf.runtime.notation.Node) edge
-						.getTarget();
-
-				Bounds sourceBounds = (Bounds) srcNode.getLayoutConstraint();
-				Bounds targetBounds = (Bounds) targetNode.getLayoutConstraint();
-
-				int srcLine = MapUtil.getNoOfLines(srcNode);
-				int targetLine = MapUtil.getNoOfLines(targetNode);
-				int srcHeight = MapUtil.getTextHeight(srcNode);
-				int targetHeight = MapUtil.getTextHeight(targetNode);
-
-				int srcX = sourceBounds.getX() + sourceBounds.getWidth() / 2;
-				int srcY = sourceBounds.getY()
-						+ (IMAGE_HEIGHT + (srcLine * srcHeight)) / 2;
-				int tarX = targetBounds.getX() + targetBounds.getWidth() / 2;
-				int tarY = targetBounds.getY()
-						+ (IMAGE_HEIGHT + (targetLine * targetHeight)) / 2;
-
-				int rel1 = abp.x - srcX;
-				int rel2 = abp.y - srcY;
-				int rel3 = abp.x - tarX;
-				int rel4 = abp.y - tarY;
-
-				RelativeBendpoint rbp1 = new RelativeBendpoint(rel1, rel2,
-						rel3, rel4);
-				relativePoints.add(rbp1);
-			}
-		}
-		relativePoints.add(rbp);
-
-		if (relativePoints.size() > 0) {
-			RelativeBendpoints bendpoints = NotationFactory.eINSTANCE
-					.createRelativeBendpoints();
-			bendpoints.setPoints(relativePoints);
-			edge.setBendpoints(bendpoints);
-		}
-	}
-
-	/**
-	 * Find edge in diagram given source and target nodes
-	 * 
-	 * @param sourceNode
-	 * @param targetNode
-	 * @return
-	 */
-	private Edge findEdge(org.eclipse.gmf.runtime.notation.Node sourceNode,
-			org.eclipse.gmf.runtime.notation.Node targetNode) {
-		List list = diagram.getEdges();
-		if (list != null && list.size() > 0) {
-			for (Iterator iterator = list.iterator(); iterator.hasNext();) {
-				Edge edge = (Edge) iterator.next();
-				if ((edge.getTarget() != null)
-						&& targetNode.equals(edge.getTarget())
-						&& (edge.getSource() != null)
-						&& sourceNode.equals(edge.getSource())) {
-					return edge;
-				}
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/util/MigrationUtil.java b/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/util/MigrationUtil.java
deleted file mode 100644
index b8e2d70..0000000
--- a/1.5/plugins/org.eclipse.epf.migration.diagram/src/org/eclipse/epf/migration/diagram/util/MigrationUtil.java
+++ /dev/null
@@ -1,244 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.migration.diagram.util;
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ProcessConfigurator;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * Helper utilities for the Migration Service.
- *
- * @author Kelvin Low
- * @since  1.0
- */
-public class MigrationUtil {
-
-	/**
-	 * Returns a map of all the <code>CapabilityPattern</code> and <code>DeliveryProcess</code>
-	 * in the current Method Library.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getProcesses() {
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		List methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator i = methodPlugins.iterator(); i.hasNext(); ) {
-			MethodPlugin methodPlugin = (MethodPlugin)i.next();
-			String capabilityPatternPaths[] = ModelStructure.DEFAULT.capabilityPatternPath;
-			MethodPackage methodPackage  = UmaUtil.findMethodPackage(methodPlugin, capabilityPatternPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				if (methodPackage instanceof ProcessPackage) {
-					getCapabilityPatterns((ProcessPackage)methodPackage, result);
-				}
-			}
-			String deliveryProcessPaths[] = ModelStructure.DEFAULT.deliveryProcessPath;
-			methodPackage = UmaUtil.findMethodPackage(methodPlugin, deliveryProcessPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				if (methodPackage instanceof ProcessPackage) {
-					getDeliveryProcesses((ProcessPackage)methodPackage, result);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a map of all <code>CapabilityPattern</code> in the current Method Library.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getCapabilityPatterns() {
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		List methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator i = methodPlugins.iterator(); i.hasNext(); ) {
-			MethodPlugin methodPlugin = (MethodPlugin)i.next();
-			String capabilityPatternPaths[] = ModelStructure.DEFAULT.capabilityPatternPath;
-			MethodPackage methodPackage  = UmaUtil.findMethodPackage(methodPlugin, capabilityPatternPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				getCapabilityPatterns((ProcessPackage)methodPackage, result);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a map of all the <code>DeliveryProcess</code> in the current Method Library.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getDeliveryProcesses() {
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		List methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator i = methodPlugins.iterator(); i.hasNext(); ) {
-			MethodPlugin methodPlugin = (MethodPlugin)i.next();
-			String deliveryProcessPaths[] = ModelStructure.DEFAULT.deliveryProcessPath;
-			MethodPackage methodPackage = UmaUtil.findMethodPackage(methodPlugin, deliveryProcessPaths);
-			if (methodPackage instanceof ProcessPackage) {
-				getDeliveryProcesses((ProcessPackage)methodPackage, result);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Returns a map of all the contexts associated with a process.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	public static Map getContexts(Process process) {
-		if (process == null) {
-			return null;
-		}
-
-		MethodLibrary library = LibraryService.getInstance()
-		.getCurrentMethodLibrary();
-		if (library == null) {
-			return null;
-		}
-
-		Map result = new TreeMap();
-		MethodConfiguration defaultContext = process.getDefaultContext();
-		if (defaultContext != null) {
-			result.put(defaultContext.getName(), defaultContext);
-		}
-
-		List contexts = process.getValidContext();
-		for (Iterator i = contexts.iterator(); i.hasNext(); ) {
-			MethodConfiguration context = (MethodConfiguration)i.next();
-			if (context != null) {
-				result.put(context.getName(), context);
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Add a map of all <code>CapabilityPattern</code> in a given <code>ProcessPackage</code>.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	protected static void getCapabilityPatterns(ProcessPackage processPackage, Map result) {
-		List childPackages = processPackage.getChildPackages();
-		for (Iterator i = childPackages.iterator(); i.hasNext(); ) {
-			Object obj = i.next();
-			if (obj instanceof ProcessComponent) {
-				ProcessComponent processComponent = (ProcessComponent)obj;
-				Process process  = processComponent.getProcess();
-				if (process instanceof CapabilityPattern) {
-					String name = process.getName();
-					result.put(name, process);
-				}
-			}
-			else if (obj instanceof ProcessPackage) {
-				getCapabilityPatterns((ProcessPackage)obj, result);
-			}
-		}
-	}
-
-	/**
-	 * Add a map of all <code>DeliveryProcess</code> in a given <code>ProcessPackage</code>.
-	 *
-	 * TODO: Move this method to the com.ibm.rmm.library.services.LibraryUtil class.
-	 */
-	protected static void getDeliveryProcesses(ProcessPackage processPackage, Map result) {
-		List childPackages = processPackage.getChildPackages();
-		for (Iterator i = childPackages.iterator(); i.hasNext(); ) {
-			Object obj = i.next();
-			if (obj instanceof ProcessComponent) {
-				ProcessComponent processComponent = (ProcessComponent)obj;
-				Process process  = processComponent.getProcess();
-				if (process instanceof DeliveryProcess) {
-					String name = process.getName();
-					result.put(name, process);
-				}
-			}
-			else if (obj instanceof ProcessPackage) {
-				getDeliveryProcesses((ProcessPackage)obj, result);
-			}
-		}
-	}
-	
-	public static Map getActivities(Process process){
-		return getActivities(process, false);
-	}
-	
-	public static Map getActivities(Process process, boolean linkedHashMap){
-		Map result = linkedHashMap ? new LinkedHashMap() : new TreeMap();
-		MethodConfiguration defaultContext = process.getDefaultContext();
-		ProcessConfigurator filter = new ProcessConfigurator(defaultContext);
-		getActivities(process, result, filter);
-		return result;
-	}
-	
-	/**
-	 * Method returns List of activities (recursively) for particular configuration 
-	 * under a Process (<code>DeliveryProcess</code> or <code>CapabilityPattern</code>).  
-	 *  @param Activity
-	 *  @param Map
-	 *  @param ProcessConfigurator
-	 */
-	protected static void getActivities(Activity process, Map result, ProcessConfigurator filter){
-		result.put(process.getName(), process);
-		List list = process.getBreakdownElements();
-		if(list.size() > 0){
-			for(Iterator iterator = list.iterator(); iterator.hasNext();){
-				Object object = iterator.next();
-				if(object instanceof Activity){
-					if(filter != null && filter.accept(object)){
-						result.put(((Activity)object).getName(), object);
-					}
-					if(object instanceof Activity){
-						getActivities((Activity)object, result, filter);
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.msproject/.classpath b/1.5/plugins/org.eclipse.epf.msproject/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.msproject/.project b/1.5/plugins/org.eclipse.epf.msproject/.project
deleted file mode 100644
index ac9f795..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.msproject</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.msproject/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.msproject/META-INF/MANIFEST.MF
deleted file mode 100644
index c4f556b..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.msproject; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.epf.msproject,
- org.eclipse.epf.msproject.impl,
- org.eclipse.epf.msproject.util
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.emf.ecore.xmi;visibility:=reexport,
- com.ibm.icu
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.msproject/build.properties b/1.5/plugins/org.eclipse.epf.msproject/build.properties
deleted file mode 100644
index 8494eff..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               model/,\
-               plugin.properties,\
-               plugin.xml
-
diff --git a/1.5/plugins/org.eclipse.epf.msproject/model/MS_Project_2003.genmodel b/1.5/plugins/org.eclipse.epf.msproject/model/MS_Project_2003.genmodel
deleted file mode 100644
index 6946f2c..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/model/MS_Project_2003.genmodel
+++ /dev/null
@@ -1,598 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.epf.msproject/src"
-    modelPluginID="org.eclipse.epf.msproject" modelName="MS_Project_2003" importerID="org.eclipse.xsd.ecore.importer">
-  <foreignModel>file:/C:/Eclipse311/MS_Project_2003.xsd</foreignModel>
-  <genPackages prefix="Msproject" basePackage="org.eclipse.epf" resource="XML" disposableProviderFactory="true"
-      loadInitialization="true" ecorePackage="msproject.ecore#/">
-    <genDataTypes ecoreDataType="msproject.ecore#//AccrueAt"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//ActiveDirectoryGUIDType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//AliasType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//AuthorType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//BaselineForEarnedValueType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//BookingTypeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//BookingTypeType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//CalculationTypeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//CategoryType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//CodeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//CompanyType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//ConstraintTypeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//ContactType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//CostRateTableType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//CurrencySymbolPositionType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//CurrencySymbolType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DayTypeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DefaultFixedCostAccrualType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DefaultTaskEVMethodType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DefaultTaskTypeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DurationFormatType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DurationFormatType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DurationFormatType2"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DurationFormatType3"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DurationFormatType4"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//DurationFormatType5"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//EarnedValueMethodType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//EarnedValueMethodType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//EmailAddressType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//ExternalTaskProjectType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//FixedCostAccrualType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//FYStartDateType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//GroupType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkAddressType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkAddressType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkAddressType2"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkSubAddressType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkSubAddressType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkSubAddressType2"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//HyperlinkType2"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//InitialsType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//LagFormatType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//LevelingDelayFormatType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//LevelingDelayFormatType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//ManagerType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//MaterialLabelType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//NameType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//NameType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//NameType2"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//NameType3"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//NewTaskStartDateType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//NTAccountType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//OutlineNumberType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//OvertimeRateFormatType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//OvertimeRateFormatType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//PhoneticAliasType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//PhoneticsType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//PrefixType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//RateTableType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//RollupTypeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//StandardRateFormatType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//StandardRateFormatType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//SubjectType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//SubprojectNameType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//TitleType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//TypeType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//TypeType1"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//TypeType2"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//TypeType3"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//TypeType4"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//TypeType5"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//UIDType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//UnitType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//ValuelistSortOrderType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//WeekStartDayType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//WorkContourType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//WorkFormatType"/>
-    <genDataTypes ecoreDataType="msproject.ecore#//WorkGroupType"/>
-    <genClasses ecoreClass="msproject.ecore#//Assignment">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/taskUID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/resourceUID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/percentWorkComplete"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualFinish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualOvertimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualOvertimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualStart"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/aCWP"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/confirmed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/cost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/costRateTable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/costVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/cV"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/delay"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/finish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/finishVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/hyperlink"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/hyperlinkAddress"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/hyperlinkSubAddress"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/workVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/hasFixedRateUnits"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/fixedMaterial"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/levelingDelay"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/levelingDelayFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/linkedFields"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/milestone"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/notes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/overallocated"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/overtimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/overtimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/regularWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/remainingCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/remainingOvertimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/remainingOvertimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/remainingWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/responsePending"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/start"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/stop"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/resume"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/startVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/units"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/updateNeeded"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/vAC"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/work"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/workContour"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/bCWS"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/bCWP"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/bookingType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualWorkProtected"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/actualOvertimeWorkProtected"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Assignment/creationDate"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Assignment/extendedAttribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Assignment/baseline"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Assignment/timephasedData"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Assignments">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Assignments/assignment"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//AvailabilityPeriod">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//AvailabilityPeriod/availableFrom"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//AvailabilityPeriod/availableTo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//AvailabilityPeriod/availableUnits"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//AvailabilityPeriods">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//AvailabilityPeriods/availabilityPeriod"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Baseline">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Baseline/timephasedData"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/number"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/interim"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/start"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/finish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/duration"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/durationFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/estimatedDuration"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/work"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/cost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/bCWS"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline/bCWP"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Baseline2">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline2/number"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline2/work"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline2/cost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline2/bCWS"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline2/bCWP"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Baseline3">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Baseline3/timephasedData"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline3/number"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline3/start"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline3/finish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline3/work"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline3/cost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline3/bCWS"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Baseline3/bCWP"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Calendar">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Calendar/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Calendar/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Calendar/isBaseCalendar"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Calendar/baseCalendarUID"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Calendar/weekDays"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Calendars">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Calendars/calendar"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//DocumentRoot">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute msproject.ecore#//DocumentRoot/mixed"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference msproject.ecore#//DocumentRoot/xMLNSPrefixMap"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference msproject.ecore#//DocumentRoot/xSISchemaLocation"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference msproject.ecore#//DocumentRoot/project"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//ExtendedAttribute">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/fieldID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/fieldName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/alias"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/phoneticAlias"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/rollupType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/calculationType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/formula"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/restrictValues"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/valuelistSortOrder"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/appendNewValues"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute/default"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//ExtendedAttribute/valueList"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//ExtendedAttribute2">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute2/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute2/fieldID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute2/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute2/valueID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute2/durationFormat"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//ExtendedAttribute3">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute3/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute3/fieldID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute3/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute3/valueID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute3/durationFormat"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//ExtendedAttribute4">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute4/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute4/fieldID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute4/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute4/valueID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//ExtendedAttribute4/durationFormat"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//ExtendedAttributes">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//ExtendedAttributes/extendedAttribute"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Mask">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Mask/level"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Mask/type"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Mask/length"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Mask/separator"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Masks">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Masks/mask"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//OutlineCode">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/fieldID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/fieldName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/alias"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/phoneticAlias"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//OutlineCode/values"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/enterprise"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/enterpriseOutlineCodeAlias"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/resourceSubstitutionEnabled"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/leafOnly"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/allLevelsRequired"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode/onlyTableValuesAllowed"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//OutlineCode/masks"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//OutlineCode2">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode2/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode2/fieldID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode2/valueID"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//OutlineCode3">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode3/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode3/fieldID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//OutlineCode3/valueID"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//OutlineCodes">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//OutlineCodes/outlineCode"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//PredecessorLink">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//PredecessorLink/predecessorUID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//PredecessorLink/type"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//PredecessorLink/crossProject"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//PredecessorLink/crossProjectName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//PredecessorLink/linkLag"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//PredecessorLink/lagFormat"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Project">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/title"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/subject"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/category"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/company"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/manager"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/author"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/creationDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/revision"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/lastSaved"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/scheduleFromStart"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/startDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/finishDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/fYStartDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/criticalSlackLimit"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/currencyDigits"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/currencySymbol"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/currencySymbolPosition"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/calendarUID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/defaultStartTime"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/defaultFinishTime"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/minutesPerDay"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/minutesPerWeek"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/daysPerMonth"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/defaultTaskType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/defaultFixedCostAccrual"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/defaultStandardRate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/defaultOvertimeRate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/durationFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/workFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/editableActualCosts"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/honorConstraints"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/earnedValueMethod"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/insertedProjectsLikeSummary"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/multipleCriticalPaths"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/newTasksEffortDriven"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/newTasksEstimated"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/splitsInProgressTasks"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/spreadActualCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/spreadPercentComplete"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/taskUpdatesResource"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/fiscalYearStart"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/weekStartDay"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/moveCompletedEndsBack"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/moveRemainingStartsBack"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/moveRemainingStartsForward"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/moveCompletedEndsForward"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/baselineForEarnedValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/autoAddNewResourcesAndTasks"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/statusDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/currentDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/microsoftProjectServerURL"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/autolink"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/newTaskStartDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/defaultTaskEVMethod"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/projectExternallyEdited"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/extendedCreationDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/actualsInSync"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/removeFileProperties"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Project/adminProject"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Project/outlineCodes"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Project/wBSMasks"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Project/extendedAttributes"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Project/calendars"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Project/tasks"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Project/resources"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Project/assignments"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Rate">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/ratesFrom"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/ratesTo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/rateTable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/standardRate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/standardRateFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/overtimeRate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/overtimeRateFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Rate/costPerUse"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Rates">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Rates/rate"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Resource">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/iD"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/type"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/isNull"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/initials"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/phonetics"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/nTAccount"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/materialLabel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/code"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/group"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/workGroup"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/emailAddress"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/hyperlink"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/hyperlinkAddress"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/hyperlinkSubAddress"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/maxUnits"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/peakUnits"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/overAllocated"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/availableFrom"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/availableTo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/start"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/finish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/canLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/accrueAt"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/work"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/regularWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/overtimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/actualWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/remainingWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/actualOvertimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/remainingOvertimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/percentWorkComplete"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/standardRate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/standardRateFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/cost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/overtimeRate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/overtimeRateFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/overtimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/costPerUse"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/actualCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/actualOvertimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/remainingCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/remainingOvertimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/workVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/costVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/sV"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/cV"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/aCWP"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/calendarUID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/notes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/bCWS"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/bCWP"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/isGeneric"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/isInactive"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/isEnterprise"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/bookingType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/actualWorkProtected"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/actualOvertimeWorkProtected"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/activeDirectoryGUID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Resource/creationDate"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Resource/extendedAttribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Resource/baseline"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Resource/outlineCode"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Resource/availabilityPeriods"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Resource/rates"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Resource/timephasedData"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Resources">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Resources/resource"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Task">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/iD"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/type"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/isNull"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/createDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/contact"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/wBS"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/wBSLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/outlineNumber"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/outlineLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/priority"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/start"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/finish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/duration"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/durationFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/work"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/stop"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/resume"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/resumeValid"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/effortDriven"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/recurring"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/overAllocated"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/estimated"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/milestone"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/summary"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/critical"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/isSubproject"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/isSubprojectReadOnly"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/subprojectName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/externalTask"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/externalTaskProject"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/earlyStart"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/earlyFinish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/lateStart"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/lateFinish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/startVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/finishVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/workVariance"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/freeSlack"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/totalSlack"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/fixedCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/fixedCostAccrual"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/percentComplete"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/percentWorkComplete"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/cost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/overtimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/overtimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualStart"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualFinish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualDuration"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualOvertimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualOvertimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/regularWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/remainingDuration"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/remainingCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/remainingWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/remainingOvertimeCost"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/remainingOvertimeWork"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/aCWP"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/cV"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/constraintType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/calendarUID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/constraintDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/deadline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/levelAssignments"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/levelingCanSplit"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/levelingDelay"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/levelingDelayFormat"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/preLeveledStart"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/preLeveledFinish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/hyperlink"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/hyperlinkAddress"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/hyperlinkSubAddress"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/ignoreResourceCalendar"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/notes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/hideBar"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/rollup"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/bCWS"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/bCWP"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/physicalPercentComplete"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/earnedValueMethod"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Task/predecessorLink"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualWorkProtected"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Task/actualOvertimeWorkProtected"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Task/extendedAttribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Task/baseline"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Task/outlineCode"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Task/timephasedData"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Tasks">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//Tasks/task"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//TimePeriod">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimePeriod/fromDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimePeriod/toDate"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//TimephasedDataType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimephasedDataType/type"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimephasedDataType/uID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimephasedDataType/start"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimephasedDataType/finish"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimephasedDataType/unit"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//TimephasedDataType/value"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Value">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Value/valueID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Value/parentValueID"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Value/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Value/description"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Value2">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Value2/iD"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Value2/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//Value2/description"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//ValueList">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//ValueList/value"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//Values">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute msproject.ecore#//Values/group"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference msproject.ecore#//Values/value"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//WBSMask">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WBSMask/level"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WBSMask/type"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WBSMask/length"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WBSMask/separator"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//WBSMasks">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WBSMasks/verifyUniqueCodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WBSMasks/generateCodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WBSMasks/prefix"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//WBSMasks/wBSMask"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//WeekDay">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WeekDay/dayType"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WeekDay/dayWorking"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//WeekDay/timePeriod"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//WeekDay/workingTimes"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//WeekDays">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//WeekDays/weekDay"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//WorkingTime">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WorkingTime/fromTime"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute msproject.ecore#//WorkingTime/toTime"/>
-    </genClasses>
-    <genClasses ecoreClass="msproject.ecore#//WorkingTimes">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference msproject.ecore#//WorkingTimes/workingTime"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.msproject/model/msproject.ecore b/1.5/plugins/org.eclipse.epf.msproject/model/msproject.ecore
deleted file mode 100644
index c1ebd22..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/model/msproject.ecore
+++ /dev/null
@@ -1,5511 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="msproject"
-    nsURI="http://epf.eclipse.org/msproject" nsPrefix="msproject">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="The full project schema definition from the project level down, &#xD;&#xA;&#x9;&#x9;starting with data type definitions."/>
-  </eAnnotations>
-  <eAnnotations>
-    <details key="appinfo" value="The Microsoft Project Data Interchange Schema for Microsoft Project 10.&#xD;&#xA;&#x9;&#x9;"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EDataType" name="AccrueAt" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="AccrueAt_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ActiveDirectoryGUIDType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ActiveDirectoryGUID_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="16"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="AliasType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Alias_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="50"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Assignment">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Assignment_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="taskUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the task.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TaskUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resourceUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the resource.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResourceUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentWorkComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of work completed on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentWorkComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual finish date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime cost incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual amount of overtime work incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual start date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual amount of work incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of work performed on the assignment to-date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ACWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="confirmed" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the Resource has accepted all of his or her assignments.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Confirmed"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected or scheduled cost of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costRateTable" unique="false"
-        eType="#//CostRateTableType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The cost rate table used for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostRateTable"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between the cost and baseline cost for a resource.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value cost variance.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="delay" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount that the assignment is delayed.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Delay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the assignment finish date from the baseline finish date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FinishVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlink" unique="false"
-        eType="#//HyperlinkType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the hyperlink associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Hyperlink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkAddress" unique="false"
-        eType="#//HyperlinkAddressType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The hyperlink associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkSubAddress" unique="false"
-        eType="#//HyperlinkSubAddressType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The document bookmark of the hyperlink associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkSubAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of assignment work from the baseline work as minutes x 1000.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hasFixedRateUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the Units are Fixed Rate.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HasFixedRateUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fixedMaterial" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the consumption of the assigned material resource occurs in a single, fixed amount.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FixedMaterial"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelay" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The delay caused by leveling.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelayFormat" unique="false"
-        eType="#//LevelingDelayFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the duration of the delay.  &#xD;&#xA;                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 21=null, &#xD;&#xA;                            35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelayFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkedFields" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the Project is linked to another OLE object.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LinkedFields"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="milestone" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the assignment is a milestone.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Milestone"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notes" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Text notes associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Notes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overallocated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the assignment is overallocated.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Overallocated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The sum of the actual and remaining overtime cost of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled overtime work scheduled for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="regularWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of non-overtime work scheduled for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RegularWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected cost of completing the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeCost"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected overtime cost of completing the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeWork"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining overtime work scheduled to complete the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining work scheduled to complete the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="responsePending" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="True if a response has not been received for a TeamAssign message. &#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResponsePending"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="stop" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the assignment was stopped.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Stop"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resume" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the assignment resumed.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resume"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the assignment start date from the baseline start date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StartVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="units" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of units for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Units"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="updateNeeded" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="True if the resource assigned to a task needs to be updated as to the status of the task.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UpdateNeeded"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="vAC" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between basline cost and total cost.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="VAC"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of scheduled work for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workContour" unique="false"
-        eType="#//WorkContourType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The work contour of the assignment. &#xD;&#xA;                            Values are: 0=Flat, 1=Back Loaded, 2=Front Loaded, 3=Double Peak, 4=Early Peak, 5=Late Peak, &#xD;&#xA;                            6=Bell, 7=Turtle, 8=Contoured&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkContour"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the assignment to-date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookingType" unique="false"
-        eType="#//BookingTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the booking type of the assignment. 1=Commited, 2=Proposed&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BookingType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWorkProtected" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual work is protected.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWorkProtected"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual overtime work is protected.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="creationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the assignment was created."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute4" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an extended attribute.  Two pieces of data are necessary - &#xD;&#xA;                            a pointer back to the extended attribute table which is specified either by the unique ID or the &#xD;&#xA;                            Field ID, and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseline" upperBound="-1"
-        eType="#//Baseline3" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of baseline values associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Baseline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Assignments">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Assignments_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assignment" upperBound="-1"
-        eType="#//Assignment" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="There must be at least one assignment in each Assignments collection.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Assignment"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="AuthorType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Author_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AvailabilityPeriod">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="AvailabilityPeriod_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableFrom" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the resource becomes available for the specified period.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableFrom"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableTo" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The last date that the resource is available for the specified period.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableTo"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage that the resource is available during the specified period.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AvailabilityPeriods">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="AvailabilityPeriods_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="availabilityPeriod" upperBound="-1"
-        eType="#//AvailabilityPeriod" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The period the resource is available.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailabilityPeriod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Baseline">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Baseline_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data block associated with the task baseline.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique number of the baseline data record.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Number"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="interim" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether this is an Interim Baseline.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Interim"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="duration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled duration of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Duration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the Duration of the Task baseline.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, &#xD;&#xA;                                            21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, &#xD;&#xA;                                            51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimatedDuration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the baseline duration of the task was estimated.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EstimatedDuration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled work of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected cost of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work scheduled for the task.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the task to-date.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Baseline2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Baseline_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique number of the baseline data record.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Number"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The work assigned the resource when the baseline is saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected cost for the resource when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budget cost of work scheduled for the resource.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of of the work performed by the resource for the project to-date.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Baseline3">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Baseline_._2_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data associated with the Baseline.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique number of the baseline data record.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Number"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total amount of work scheduled on the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total projected cost of the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work on the assignment.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the assignment to-date.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="BaselineForEarnedValueType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BaselineForEarnedValue_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7 8 9 10"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="BookingTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BookingType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="BookingTypeType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BookingType_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CalculationTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CalculationType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Calendar">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Calendar_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the calendar."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isBaseCalendar" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the calendar is a base calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsBaseCalendar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="baseCalendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the base calendar &#xD;&#xA;                                on which this calendar depends. Only applicable if the calendar is &#xD;&#xA;                                not a base calendar."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BaseCalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="weekDays" eType="#//WeekDays"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of Weekdays that defines this calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WeekDays"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Calendars">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Calendars_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="calendar" lowerBound="1"
-        upperBound="-1" eType="#//Calendar" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Calendars are used to define standard working and &#xD;&#xA;                    non-working times. Projects must have one base calendar. Tasks and resources &#xD;&#xA;                    may have their own non-base calendars which are based on a base calendar.&#xD;&#xA;                    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Calendar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CategoryType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Category_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CodeType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Code_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CompanyType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Company_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ConstraintTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ConstraintType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ContactType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Contact_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CostRateTableType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CostRateTable_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CurrencySymbolPositionType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CurrencySymbolPosition_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CurrencySymbolType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CurrencySymbol_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="20"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DayTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DayType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DefaultFixedCostAccrualType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DefaultFixedCostAccrual_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DefaultTaskEVMethodType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DefaultTaskEVMethod_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DefaultTaskTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DefaultTaskType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value=""/>
-      <details key="kind" value="mixed"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="name" value=":mixed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns:prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xsi:schemaLocation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="project" upperBound="-2"
-        eType="#//Project" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The project is the top level element of the document.&#xD;&#xA;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Project"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType2" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType3" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._3_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType4" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._4_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType5" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._5_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="EarnedValueMethodType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EarnedValueMethod_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="EarnedValueMethodType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EarnedValueMethod_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="EmailAddressType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EmailAddress_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This corresponds to the PID of the custom field.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the custom field."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alias" unique="false" eType="#//AliasType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The alias of the custom field"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Alias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="phoneticAlias" unique="false"
-        eType="#//PhoneticAliasType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The phonetic pronunciation of the alias of the &#xD;&#xA;                                custom field"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PhoneticAlias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rollupType" unique="false"
-        eType="#//RollupTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How rollups are calculated. Values are: 0=Maximum &#xD;&#xA;                                (OR for flag fields), 1=Minimum (AND for flag fields), 2=Count all, 3=Sum, &#xD;&#xA;                                4=Average, 5=Average First Sublevel, 6=Count First Sublevel, 7=Count &#xD;&#xA;                                Nonsummaries"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RollupType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calculationType" unique="false"
-        eType="#//CalculationTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether rollups are calculated for task and group summary rows. &#xD;&#xA;                                Values are: 0=None, 1=Rollup, 2=Calculation"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalculationType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="formula" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The formula that Microsoft Project uses to populate the &#xD;&#xA;                                custom task field."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Formula"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="restrictValues" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If RestrictValues=True then only values in the list are &#xD;&#xA;                                allowed in the file"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RestrictValues"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valuelistSortOrder" unique="false"
-        eType="#//ValuelistSortOrderType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How value lists are sorted. Values are: &#xD;&#xA;                                0=Descending, 1=Ascending"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValuelistSortOrder"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="appendNewValues" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If AppendNewValues=True then any new values added in a project &#xD;&#xA;                                are automatically appended to the list."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AppendNewValues"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="default" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This points to the default value in the list. &#xD;&#xA;                                Not present if no default is set."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Default"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueList" eType="#//ValueList"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="When values of extended attributes are specified as &#xD;&#xA;                                properties of elements in the schema, they may either be specified by values &#xD;&#xA;                                or by references to the values contained in this list.  Applications may &#xD;&#xA;                                assume ordering of the list by ordering specified here."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueList"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the extended attribute collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The PID of the custom field.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value of the extended attribute.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The ID of the value in the extended attribut lookup table.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, &#xD;&#xA;                                            19=%, 20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, &#xD;&#xA;                                            42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute3">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._2_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the extended attribute collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The PID of the custom field.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value of the extended attribute.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The ID of the value in the extended attribut lookup table.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType3">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                            20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, &#xD;&#xA;                                            43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute4">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._3_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the extended attribute collection.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The field ID in the localised language.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value of the extended attribute.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The ID of the value in the extended attribut lookup table.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  &#xD;&#xA;                                        Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, &#xD;&#xA;                                        21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, &#xD;&#xA;                                        51=%?, 52=e%? and 53=null.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttributes">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttributes_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Each of the individual entries in the extended attributes definition &#xD;&#xA;                    collection.  There are no limits to the number of children that may appear, but project &#xD;&#xA;                    will only understand Flag1-Flag10, etc.  This must appear once in each ExtendedAttributes &#xD;&#xA;                    collection."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ExternalTaskProjectType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExternalTaskProject_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="FixedCostAccrualType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="FixedCostAccrual_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="enumeration" value="1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="FYStartDateType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="FYStartDate_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 6 7 8 9 10 11 12"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="GroupType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Group_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkAddressType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkAddress_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkAddressType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkAddress_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkAddressType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkAddress_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkSubAddressType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkSubAddress_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkSubAddressType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkSubAddress_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkSubAddressType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkSubAddress_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Hyperlink_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Hyperlink_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Hyperlink_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="InitialsType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Initials_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="LagFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="LagFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="LevelingDelayFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="LevelingDelayFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="LevelingDelayFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="LevelingDelayFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ManagerType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Manager_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Mask">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Mask_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="level" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The level of the mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Level"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType5">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of mask. Values are: 0=Numbers, 1=Upper Case Letters, 2=Lower Case Letters, 3=Characters"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="length" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The maximum length in characters of the outline code values.  If length is any, the value is zero."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Length"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="separator" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The separator value of the code values."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Separator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Masks">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Masks_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mask" upperBound="-1" eType="#//Mask"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The four elements of the mask constitute the format in which the outline code must appear."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Mask"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="MaterialLabelType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MaterialLabel_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType3" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._3_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="255"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NewTaskStartDateType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="NewTaskStartDate_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NTAccountType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="NTAccount_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCode">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCode_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Coresponds to the field number of outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alias" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The alias of the custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Alias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="phoneticAlias" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The phonetic pronunciation of the alias of the custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PhoneticAlias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="values" eType="#//Values"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The values of the table associated with this outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Values"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enterprise" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Indicates whether the custom outline code is an enterprise custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Enterprise"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enterpriseOutlineCodeAlias"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to another custom field for which this is an alias."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EnterpriseOutlineCodeAlias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resourceSubstitutionEnabled"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the custom outline code can be used by the Resource Substitution Wizard in Microsoft Project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResourceSubstitutionEnabled"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="leafOnly" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether or not values specified in this outline code field must be leaf values."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LeafOnly"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="allLevelsRequired" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="New codes must have all levels present.  Not available for Enterprise Codes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AllLevelsRequired"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="onlyTableValuesAllowed"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether values specified must come from values table."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OnlyTableValuesAllowed"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="masks" eType="#//Masks"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The table of entries that define the outline code mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Masks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCode2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCode_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the outline code collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The field ID in the localised language.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID in the value list associated with the definition in the &#xD;&#xA;                                            outline code collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCode3">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCode_._2_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the outline code collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The field ID in the localised language.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID in the value list associated with the definition &#xD;&#xA;                                            in the outline code collection."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCodes">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCodes_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCode" upperBound="-1"
-        eType="#//OutlineCode" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The individual outline codes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCode"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="OutlineNumberType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineNumber_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="OvertimeRateFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OvertimeRateFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="OvertimeRateFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OvertimeRateFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="PhoneticAliasType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="PhoneticAlias_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="50"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="PhoneticsType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Phonetics_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PredecessorLink">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="PredecessorLink_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="predecessorUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the predecessor task.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PredecessorUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The link type.  Values are 0=FF, 1=FS, 2=SF and 3=SS&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="crossProject" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the predecessor is part of another project.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CrossProject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="crossProjectName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The external predecessor project.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CrossProjectName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkLag" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of lag in tenths of a minute.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LinkLag"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lagFormat" unique="false"
-        eType="#//LagFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the lag format.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                            20=e%, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, &#xD;&#xA;                                            44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LagFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="PrefixType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Prefix_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="50"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Project">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Project_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="#//UIDType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType3">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="title" unique="false" eType="#//TitleType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Title"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="subject" unique="false"
-        eType="#//SubjectType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The subject of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Subject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="category" unique="false"
-        eType="#//CategoryType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The category of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Category"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="company" unique="false"
-        eType="#//CompanyType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The company that owns the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Company"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="manager" unique="false"
-        eType="#//ManagerType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The manager of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="author" unique="false"
-        eType="#//AuthorType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The author of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Author"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="creationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the project was created."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="revision" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of times a project has been saved."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Revision"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lastSaved" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the project was last saved."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LastSaved"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scheduleFromStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project is schduled from the start date or finish date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ScheduleFromStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The start date of the project. Required if ScheduleFromStart is true.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StartDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The finish date of the project. Required if ScheduleFromStart is false.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FinishDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fYStartDate" unique="false"
-        eType="#//FYStartDateType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Fiscal Year starting month. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;1=January, 2=February, 3=March, 4=April, 5=May, 6=June, 7=July, &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;8=August, 9=September, 10=October, 11=November, 12=December "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FYStartDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="criticalSlackLimit" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of days past its end date that a task can go &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;before Microsoft Project marks that task as a critical task."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CriticalSlackLimit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currencyDigits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of digits after the decimal symbol."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrencyDigits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currencySymbol" unique="false"
-        eType="#//CurrencySymbolType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The currency symbol used in the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrencySymbol"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currencySymbolPosition"
-        unique="false" eType="#//CurrencySymbolPositionType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The position of the currency symbol.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Before, 1=After, 2=Before With Space, 3=After with space."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrencySymbolPosition"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The project calendar.  Refers to a valid UID in the &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Calendars element of the Microsoft Project XML Schema."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultStartTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default start time of new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultStartTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultFinishTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default finish time of new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultFinishTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minutesPerDay" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of minutes per day."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MinutesPerDay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minutesPerWeek" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of minutes per week."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MinutesPerWeek"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="daysPerMonth" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of days per month."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DaysPerMonth"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultTaskType" unique="false"
-        eType="#//DefaultTaskTypeType" defaultValueLiteral="1" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default type of new tasks. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Fixed Units, 1=Fixed Duration, 2=Fixed Work."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultTaskType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultFixedCostAccrual"
-        unique="false" eType="#//DefaultFixedCostAccrualType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default from where fixed costs are accrued.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;1=Start, 2=Prorated, 3=End"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultFixedCostAccrual"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultStandardRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default standard rate for new resources."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultStandardRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultOvertimeRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default overtime rate for new resources."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultOvertimeRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType5">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 21=null, &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;53=null."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workFormat" unique="false"
-        eType="#//WorkFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default work unit format. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;1=m, 2=h, 3=d, 4=w, 5=mo"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="editableActualCosts" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether or not actual costs are editable."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EditableActualCosts"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="honorConstraints" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether tasks honour their constraint dates."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HonorConstraints"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earnedValueMethod" unique="false"
-        eType="#//EarnedValueMethodType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default method for calculating earned value. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Percent Complete, 1=Physical Percent Complete"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarnedValueMethod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="insertedProjectsLikeSummary"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to calculate subtasks as summary tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="InsertedProjectsLikeSummary"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="multipleCriticalPaths"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether multiple critical paths are calculated."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MultipleCriticalPaths"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="newTasksEffortDriven" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether new tasks are effort driven."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NewTasksEffortDriven"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="newTasksEstimated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to show the estimated duration by default."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NewTasksEstimated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="splitsInProgressTasks"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether in-progress tasks can be split."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SplitsInProgressTasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="spreadActualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether actual costs are spread to the status date."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SpreadActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="spreadPercentComplete"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether percent complete is spread to the status date."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SpreadPercentComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="taskUpdatesResource" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether updates to tasks update resources."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TaskUpdatesResource"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fiscalYearStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether to use fiscal year numbering"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FiscalYearStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="weekStartDay" unique="false"
-        eType="#//WeekStartDayType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Start day of the week. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WeekStartDay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveCompletedEndsBack"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the end of completed portions of tasks scheduled to begin after the &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;status date but begun early should be moved back to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveCompletedEndsBack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveRemainingStartsBack"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the beginning of remaining portions of tasks scheduled to begin after the &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;status date but begun early should be moved back to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveRemainingStartsBack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveRemainingStartsForward"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the beginning of remaining portions of tasks scheduled to have begun late &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;should be moved up to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveRemainingStartsForward"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveCompletedEndsForward"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the end of completed portions of tasks scheduled to have been completed &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;before the status date but begun late should be moved up to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveCompletedEndsForward"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="baselineForEarnedValue"
-        unique="false" eType="#//BaselineForEarnedValueType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The specific baseline used to calculate Variance values.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Baseline, 1=Baseline 1, 2=Baseline 2, 3=Baseline 3, 4=Baseline 4, 5=Baseline 5, 6=Baseline 6, &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;7=Baseline 7, 8=Baseline 8, 9=Baseline 9, 10=Baseline 10"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BaselineForEarnedValue"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="autoAddNewResourcesAndTasks"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to automatically add new resources to the resource pool."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AutoAddNewResourcesAndTasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="statusDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Date used for calculation and reporting."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StatusDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currentDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The system date that the XML was generated."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrentDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="microsoftProjectServerURL"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project was created by a Project Server user as opposed to an NT user.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MicrosoftProjectServerURL"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="autolink" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to autolink inserted or moved tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Autolink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="newTaskStartDate" unique="false"
-        eType="#//NewTaskStartDateType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default date for new tasks start.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Project Start Date, 1=Current Date"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NewTaskStartDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultTaskEVMethod" unique="false"
-        eType="#//DefaultTaskEVMethodType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default earned value method for tasks.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Percent Complete, 1=Physical Percent Complete"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultTaskEVMethod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectExternallyEdited"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project XML was edited."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ProjectExternallyEdited"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="extendedCreationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Date used for calculation and reporting."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedCreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualsInSync" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether all actual work has been synchronized with the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualsInSync"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="removeFileProperties" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to remove all file properties on save."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemoveFileProperties"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="adminProject" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project is an administrative project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AdminProject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCodes" eType="#//OutlineCodes"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of outline code definitions associated with the project.  These codes may be associated only with this project, or may be common among several projects (enterprise codes)."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCodes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="wBSMasks" eType="#//WBSMasks"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The table of entries that define the outline code mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBSMasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttributes" eType="#//ExtendedAttributes"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of extended attribute (custom field) definitions &#xD;&#xA;        associated with the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttributes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="calendars" eType="#//Calendars"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of calendars that is associated with the &#xD;&#xA;        project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Calendars"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tasks" eType="#//Tasks"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of tasks that make up the project.&#xD;&#xA;        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Tasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resources" eType="#//Resources"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of resources that make up the project.&#xD;&#xA;        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resources"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" eType="#//Assignments"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of assignments that make up the project.&#xD;&#xA;    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Assignments"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Rate">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Rate_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ratesFrom" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the rate becomes effective.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RatesFrom"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ratesTo" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The last date that the rate is effective.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RatesTo"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rateTable" unique="false"
-        eType="#//RateTableType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the rate table for the resource. &#xD;&#xA;                                                        Values are: 0=A, 1=B, 2=C, 3=D, 4=E"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RateTable"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The standard rate for the resource for the period specified.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRateFormat" unique="false"
-        eType="#//StandardRateFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the standard rate.  &#xD;&#xA;                                                        1=m, 2=h, 3=d, 4=w, 5=mo, 7=y&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The overtime rate for the resource for the period specified.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRateFormat" unique="false"
-        eType="#//OvertimeRateFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the overtime rate.  &#xD;&#xA;                                                        1=m, 2=h, 3=d, 4=w, 5=mo, 7=y"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costPerUse" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The cost per use of the resource. &#xD;&#xA;                                                        This value is as of the current date if a rate table exists for the resource.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostPerUse"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Rates">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Rates_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rate" upperBound="25" eType="#//Rate"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The definition of a time period, and the rates applicable for &#xD;&#xA;                                            the resource during that period."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Rate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="RateTableType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RateTable_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Resource">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Resource_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="iD" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The position identifier of the resource within the list of resources.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType4">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of resource. Values are: 0=Material, 1=Work&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isNull" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsNull"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="initials" unique="false"
-        eType="#//InitialsType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The initials of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Initials"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="phonetics" unique="false"
-        eType="#//PhoneticsType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The phonetic spelling of the resource name.  &#xD;&#xA;                                For use with Japanese only.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Phonetics"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nTAccount" unique="false"
-        eType="#//NTAccountType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The NT account associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NTAccount"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="materialLabel" unique="false"
-        eType="#//MaterialLabelType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unit of measure for the material resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MaterialLabel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="code" unique="false" eType="#//CodeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The code or other information about the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Code"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group" unique="false" eType="#//GroupType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The group to which the resource belongs.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Group"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workGroup" unique="false"
-        eType="#//WorkGroupType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of workgroup to which the resource belongs. &#xD;&#xA;                                Values are: 0=Default, 1=None, 2=Email, 3=Web&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkGroup"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="emailAddress" unique="false"
-        eType="#//EmailAddressType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The email address of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EmailAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlink" unique="false"
-        eType="#//HyperlinkType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the hyperlink associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Hyperlink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkAddress" unique="false"
-        eType="#//HyperlinkAddressType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The hyperlink associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkSubAddress" unique="false"
-        eType="#//HyperlinkSubAddressType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The document bookmark of the hyperlink associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkSubAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maxUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" defaultValueLiteral="1.0"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The maximum number of units that the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MaxUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="peakUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The largest number of units assigned to the resource at any time.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PeakUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overAllocated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the resource is overallocated.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OverAllocated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableFrom" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The first date that the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableFrom"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableTo" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The last date the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableTo"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="canLevel" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the resource can be leveled.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CanLevel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="accrueAt" unique="false"
-        eType="#//AccrueAt">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How cost is accrued against the resource. &#xD;&#xA;                                Values are: 1=Start, 2=End, 3=Prorated&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AccrueAt"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total work assigned to the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="regularWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of non-overtime work assigned to the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RegularWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of overtime work assigned to the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of actual work performed by the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of remaining work required to complete all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of actual overtime work performed by the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeWork"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of remaining overtime work required to complete all tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentWorkComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage of work completed across all tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentWorkComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The standard rate of the resource. &#xD;&#xA;                                This value is as of the current date if a rate table exists for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRateFormat" unique="false"
-        eType="#//StandardRateFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the standard rate.  &#xD;&#xA;                                1=m, 2=h, 3=d, 4=w, 5=mo, 7=y, 8=material resource rate (or blank symbol specified)&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total project cost for the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The overtime rate of the resource. &#xD;&#xA;                                This value is as of the current date if a rate table exists for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRateFormat" unique="false"
-        eType="#//OvertimeRateFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the overtime rate.  &#xD;&#xA;                                1=m, 2=h, 3=d, 4=w, 5=mo, 7=y&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total overtime cost for the resource including actual and remaining overtime costs.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costPerUse" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The cost per use of the resource. This value is as of the current date if a rate table &#xD;&#xA;                                exists for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostPerUse"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost incurred by the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime cost incurred by the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected cost of the resource to complete all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeCost"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected overtime cost of the resource to complete all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between the baseline work and the work as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between the baseline cost and the cost.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value schedule variance, through the project status date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value cost variance, through the project status date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of the work performed by the resource for the project to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ACWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The resource calendar.Refers to a valid UID in the Calendars element of &#xD;&#xA;                                the Microsoft Project XML Schema.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notes" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Text notes associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Notes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budget cost of work scheduled for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of of the work performed by the resource for the project to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isGeneric" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is generic.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsGeneric"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isInactive" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is set to inactive.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsInactive"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEnterprise" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is an Enterprise resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsEnterprise"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookingType" unique="false"
-        eType="#//BookingTypeType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the booking type of the resource. 1=Commited, 2=Proposed&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BookingType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWorkProtected" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWorkProtected"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual overtime work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activeDirectoryGUID" unique="false"
-        eType="#//ActiveDirectoryGUIDType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The Active Directory GUID for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActiveDirectoryGUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="creationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the resource was created.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute3" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an extended attribute.  Two pieces of data are necessary - &#xD;&#xA;                                a pointer back to the extended attribute table which is specified either by the unique ID or the Field ID, &#xD;&#xA;                                and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseline" upperBound="-1"
-        eType="#//Baseline2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The baseline values for the resources.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Baseline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCode" upperBound="-1"
-        eType="#//OutlineCode3" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an outline code.  Two pieces of data are necessary - a pointer back to &#xD;&#xA;                                the outline code table which is specified either by the unique ID or the Field ID, and the value which is &#xD;&#xA;                                specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCode"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="availabilityPeriods" eType="#//AvailabilityPeriods"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A collection of periods during which the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailabilityPeriods"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rates" eType="#//Rates"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A collection of periods and the rates associated with each one.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Rates"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Resources">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Resources_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resource" upperBound="-1"
-        eType="#//Resource" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="There must be at least one resource in each Resources collection.&#xD;&#xA;                    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resource"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="RollupTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RollupType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="StandardRateFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="StandardRateFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="StandardRateFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="StandardRateFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7 8"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="SubjectType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Subject_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="SubprojectNameType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="SubprojectName_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Task">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Task_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="iD" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The position identifier of the task within the list of tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of task. &#xD;&#xA;                                Values are: 0=Fixed Units, 1=Fixed Duration, 2=Fixed Work.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isNull" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the task is null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsNull"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="createDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the task was created.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreateDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="contact" unique="false"
-        eType="#//ContactType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The contact person for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Contact"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="wBS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The work breakdown structure code of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="wBSLevel" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The rightmost WBS level of the task. &#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBSLevel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="outlineNumber" unique="false"
-        eType="#//OutlineNumberType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The outline number of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineNumber"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="outlineLevel" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The outline level of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineLevel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="priority" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The priority of the task from 0 to 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Priority"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="duration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The planned duration of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Duration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType4">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the Duration of the Task.  &#xD;&#xA;                                Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, &#xD;&#xA;                                43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of scheduled work for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="stop" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the task was stopped.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Stop"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resume" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the task resumed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resume"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resumeValid" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task can be resumed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResumeValid"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="effortDriven" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is effort-driven.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EffortDriven"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="recurring" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is a recurring task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Recurring"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overAllocated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is overallocated. &#xD;&#xA;                                This element is informational only.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OverAllocated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is estimated.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Estimated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="milestone" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is a milestone.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Milestone"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="summary" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is a summary task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Summary"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="critical" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is in the critical chain.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Critical"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSubproject" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is an inserted project.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsSubproject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSubprojectReadOnly" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the inserted project is read-only.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsSubprojectReadOnly"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="subprojectName" unique="false"
-        eType="#//SubprojectNameType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The source location of the inserted project.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubprojectName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalTask" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is external.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExternalTask"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalTaskProject" unique="false"
-        eType="#//ExternalTaskProjectType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The source location and task identifier of the external task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExternalTaskProject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earlyStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The early start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarlyStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earlyFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The early finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarlyFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lateStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The late start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LateStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lateFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The late finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LateFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the task start date from &#xD;&#xA;                                the baseline start date as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StartVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the task finish date from &#xD;&#xA;                                the baseline finish date as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FinishVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of task work from the baseline &#xD;&#xA;                                task work as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="freeSlack" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of free slack.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FreeSlack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="totalSlack" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of total slack.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TotalSlack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fixedCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The fixed cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FixedCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fixedCostAccrual" unique="false"
-        eType="#//FixedCostAccrualType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How the fixed cost is accrued against the task. &#xD;&#xA;                                Values are: 1=Start, 2=Prorated and 3=End.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FixedCostAccrual"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage of the task duration completed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentWorkComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage of the task work completed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentWorkComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected or scheduled cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The sum of the actual and remaining overtime cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of overtime work scheduled for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualDuration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual duration of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualDuration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual work for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime work for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="regularWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of non-overtime work scheduled for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RegularWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingDuration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of time required to complete the unfinished portion of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingDuration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected cost of completing the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining work scheduled to complete the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeCost"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining overtime cost projected to finish the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeWork"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining overtime work scheduled to finish the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of work performed on the task to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ACWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value cost variance.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="constraintType" unique="false"
-        eType="#//ConstraintTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The constraint on the start or finish date of the task. &#xD;&#xA;                                Values are: 0=As Soon As Possible, 1=As Late As Possible, 2=Must Start On, 3=Must Finish On, &#xD;&#xA;                                4=Start No Earlier Than, 5=Start No Later Than, 6=Finish No Earlier Than and 7=Finish No Later Than&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ConstraintType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The task calendar.Refers to a valid UID in the Calendars element of &#xD;&#xA;                                the Microsoft Project XML Schema.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="constraintDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date argument for the task constraint type.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ConstraintDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="deadline" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The deadline for the task to be completed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Deadline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelAssignments" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether leveling can adjust assignments.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelAssignments"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingCanSplit" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether leveling can split the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingCanSplit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelay" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The delay caused by leveling the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelayFormat" unique="false"
-        eType="#//LevelingDelayFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the duration of the delay.  &#xD;&#xA;                                Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, &#xD;&#xA;                                43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelayFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="preLeveledStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The start date of the task before it was leveled.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PreLeveledStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="preLeveledFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The finish date of the task before it was leveled.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PreLeveledFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlink" unique="false"
-        eType="#//HyperlinkType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the hyperlink associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Hyperlink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkAddress" unique="false"
-        eType="#//HyperlinkAddressType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The hyperlink associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkSubAddress" unique="false"
-        eType="#//HyperlinkSubAddressType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The document bookmark of the hyperlink associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkSubAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ignoreResourceCalendar"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task ignores the resource calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IgnoreResourceCalendar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notes" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Text notes associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Notes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hideBar" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the GANTT bar of the task is hidden when displayed in Microsoft Project.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HideBar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rollup" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is rolled up.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Rollup"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work scheduled for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the task to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="physicalPercentComplete"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage complete value entered by the Project Manager.  &#xD;&#xA;                                This can be used as an alternative for calculating BCWP.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PhysicalPercentComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earnedValueMethod" unique="false"
-        eType="#//EarnedValueMethodType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The method for calculating earned value. &#xD;&#xA;                                Values are: 0=Percent Complete, 1=Physical Percent Complete&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarnedValueMethod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predecessorLink" upperBound="-1"
-        eType="#//PredecessorLink" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the predecessor task of the task that contains it.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PredecessorLink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWorkProtected" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWorkProtected"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual overtime work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an extended attribute.  Two pieces of data are necessary - &#xD;&#xA;                                a pointer back to the extended attribute table which is specified either by the unique ID or &#xD;&#xA;                                the Field ID, and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseline" upperBound="-1"
-        eType="#//Baseline" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of baseline values of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Baseline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCode" upperBound="-1"
-        eType="#//OutlineCode2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an outline code.  Two pieces of data are necessary - &#xD;&#xA;                                a pointer back to the outline code table which is specified either by the unique ID or the Field ID, &#xD;&#xA;                                and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCode"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data block associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Tasks">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Tasks_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="task" upperBound="-1" eType="#//Task"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="There must be at least one task in each Tasks collection.&#xD;&#xA;                    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Task"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TimePeriod">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TimePeriod_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fromDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The beginning of the exception time.&#xD;&#xA;                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FromDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="toDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The end of the exception time.&#xD;&#xA;                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ToDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TimephasedDataType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="The definition of the time phased data block.&#xD;&#xA;&#x9;&#x9;        "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TimephasedDataType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType3">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;                The type of task timephased data. Values are:&#xD;&#xA;                    1=Assignment Remaining Work&#xD;&#xA;                    2=Assignment Actual Work&#xD;&#xA;                    3=Assignment Actual Overtime Work&#xD;&#xA;                    4=Assignment Baseline Work&#xD;&#xA;                    5=Assignment Baseline Cost&#xD;&#xA;                    6=Assignment Actual Cost&#xD;&#xA;                    7=Resource Baseline Work&#xD;&#xA;                    8=Resource Baseline Cost&#xD;&#xA;                    9=Task Baseline Work&#xD;&#xA;                    10=Task Baseline Cost&#xD;&#xA;                    11=Task Percent Complete&#xD;&#xA;                    16=Assignment Baseline 1 Work&#xD;&#xA;                    17=Assignment Baseline 1 Cost&#xD;&#xA;                    18=Task Baseline 1 Work&#xD;&#xA;                    19=Task Baseline 1 Cost&#xD;&#xA;                    20=Resource Baseline 1 Work&#xD;&#xA;                    21=Resource Baseline 1 Cost&#xD;&#xA;                    22=Assignment Baseline 2 Work&#xD;&#xA;                    23=Assignment Baseline 2 Cost&#xD;&#xA;                    24=Task Baseline 2 Work&#xD;&#xA;                    25=Task Baseline 2 Cost&#xD;&#xA;                    26=Resource Baseline 2 Work&#xD;&#xA;                    27=Resource Baseline 2 Cost&#xD;&#xA;                    28=Assignment Baseline 3 Work&#xD;&#xA;                    29=Assignment Baseline 3 Cost&#xD;&#xA;                    30=Task Baseline 3 Work&#xD;&#xA;                    31=Task Baseline 3 Cost&#xD;&#xA;                    32=Resource Baseline 3 Work&#xD;&#xA;                    33=Resource Baseline 3 Cost&#xD;&#xA;                    34=Assignment Baseline 4 Work&#xD;&#xA;                    35=Assignment Baseline 4 Cost&#xD;&#xA;                    36=Task Baseline 4 Work&#xD;&#xA;                    37=Task Baseline 4 Cost&#xD;&#xA;                    38=Resource Baseline 4 Work&#xD;&#xA;                    39=Resource Baseline 4 Cost&#xD;&#xA;                    40=Assignment Baseline 5 Work&#xD;&#xA;                    41=Assignment Baseline 5 Cost&#xD;&#xA;                    42=Task Baseline 5 Work&#xD;&#xA;                    43=Task Baseline 5 Cost&#xD;&#xA;                    44=Resource Baseline 5 Work&#xD;&#xA;                    45=Resource Baseline 5 Cost&#xD;&#xA;                    46=Assignment Baseline 6 Work&#xD;&#xA;                    47=Assignment Baseline 6 Cost&#xD;&#xA;                    48=Task Baseline 6 Work&#xD;&#xA;                    49=Task Baseline 6 Cost&#xD;&#xA;                    50=Resource Baseline 6 Work&#xD;&#xA;                    51=Resource Baseline 6 Cost&#xD;&#xA;                    52=Assignment Baseline 7 Work&#xD;&#xA;                    53=Assignment Baseline 7 Cost&#xD;&#xA;                    54=Task Baseline 7 Work&#xD;&#xA;                    55=Task Baseline 7 Cost&#xD;&#xA;                    56=Resource Baseline 7 Work&#xD;&#xA;                    57=Resource Baseline 7 Cost&#xD;&#xA;                    58=Assignment Baseline 8 Work&#xD;&#xA;                    59=Assignment Baseline 8 Cost&#xD;&#xA;                    60=Task Baseline 8 Work&#xD;&#xA;                    61=Task Baseline 8 Cost&#xD;&#xA;                    62=Resource Baseline 8 Work&#xD;&#xA;                    63=Resource Baseline 8 Cost&#xD;&#xA;                    64=Assignment Baseline 9 Work&#xD;&#xA;                    65=Assignment Baseline 9 Cost&#xD;&#xA;                    66=Task Baseline 9 Work&#xD;&#xA;                    67=Task Baseline 9 Cost&#xD;&#xA;                    68=Resource Baseline 9 Work&#xD;&#xA;                    69=Resource Baseline 9 Cost&#xD;&#xA;                    70=Assignment Baseline 10 Work&#xD;&#xA;                    71=Assignment Baseline 10 Cost&#xD;&#xA;                    72=Task Baseline 10 Work&#xD;&#xA;                    73=Task Baseline 10 Cost&#xD;&#xA;                    74=Resource Baseline 10 Work&#xD;&#xA;                    75=Resource Baseline 10 Cost&#xD;&#xA;                    76=Physical Percent Complete&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the timephased data record.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The start date of the timephased data period.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The finish date of the timephased data period.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="unit" unique="false" eType="#//UnitType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time unit of the timephased data period. &#xD;&#xA;                Values are: 0=m, 1=h, 2=d, 3=w, 5=mo, 8=y&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Unit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value per unit of time for the timephased data period.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TitleType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Title_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType2" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType3" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._3_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 6 7 8 9 10 11 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType4" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._4_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType5" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._5_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="UIDType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="UID_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="16"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="UnitType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Unit_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 5 8"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Value">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Value_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the outline code value across the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="parentValueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of the parent node of the outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ParentValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A description of this value."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Value2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Value_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="iD" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Unique ID of value across &#xD;&#xA;                                                        the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the value &#xD;&#xA;                                                        in the list."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueList">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ValueList_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" upperBound="-1"
-        eType="#//Value2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The values that make up the value list.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ValuelistSortOrderType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ValuelistSortOrder_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Values">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Values_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:0"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
-        eType="#//Value" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The individual values."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-        <details key="group" value="#group:0"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WBSMask">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WBSMask_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="level" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The level of the mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Level"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" lowerBound="1"
-        eType="#//TypeType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of the node value. &#xD;&#xA;                                The values are: 0=Numbers, 1=Uppercase Letters, 2=Lowercase Letters, 3=Characters."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="length" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The maximum length in characters.  &#xD;&#xA;                                This element is omitted when length is &quot;any&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Length"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="separator" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The separator character of the node."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Separator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WBSMasks">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WBSMasks_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="verifyUniqueCodes" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether WBS codes are unique for new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="VerifyUniqueCodes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="generateCodes" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether WBS codes are generated for new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="GenerateCodes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="prefix" unique="false"
-        eType="#//PrefixType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The prefix for all WBS codes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Prefix"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="wBSMask" upperBound="-1"
-        eType="#//WBSMask" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The WBS Mask that is applied to all tasks in the Project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBSMask"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WeekDay">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WeekDay_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dayType" unique="false"
-        lowerBound="1" eType="#//DayTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of day. &#xD;&#xA;                                                         Values are: 0=Exception, 1=Monday, 2=Tuesday, &#xD;&#xA;                                                         3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday, &#xD;&#xA;                                                         7=Sunday"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DayType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dayWorking" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the specified date or day &#xD;&#xA;                                                         type is working."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DayWorking"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timePeriod" eType="#//TimePeriod"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines a contiguous set of exception days.&#xD;&#xA;                                                         "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimePeriod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workingTimes" eType="#//WorkingTimes"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of working times that define the time worked &#xD;&#xA;                                                         on the weekday.  One of these must be present, and there may be no more than five.&#xD;&#xA;                                                         "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkingTimes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WeekDays">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WeekDays_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="weekDay" upperBound="-1"
-        eType="#//WeekDay" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A weekday either defines regular days &#xD;&#xA;                                            of the week or exception days in the calendar."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WeekDay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WeekStartDayType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WeekStartDay_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WorkContourType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkContour_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7 8"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WorkFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WorkGroupType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkGroup_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkingTime">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkingTime_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fromTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The beginning of the working time.&#xD;&#xA;                                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FromTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="toTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The end of the working  time.&#xD;&#xA;                                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ToTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkingTimes">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkingTimes_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workingTime" upperBound="5"
-        eType="#//WorkingTime" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the working time during the weekday.&#xD;&#xA;                                                                         "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkingTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.msproject/plugin.properties b/1.5/plugins/org.eclipse.epf.msproject/plugin.properties
deleted file mode 100644
index 34343b1..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/plugin.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-# <copyright>
-# </copyright>
-#
-# $Id: plugin.properties,v 1.1 2008/01/15 08:52:57 jtham Exp $
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-# NLS_MESSAGEFORMAT_VAR
-
-pluginName = EPF MSProject2003 Model
-providerName=Eclipse.org
-
diff --git a/1.5/plugins/org.eclipse.epf.msproject/plugin.xml b/1.5/plugins/org.eclipse.epf.msproject/plugin.xml
deleted file mode 100644
index 1261958..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/plugin.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- <copyright>
- </copyright>
-
- $Id: plugin.xml,v 1.1 2008/01/15 08:52:57 jtham Exp $
--->
-
-<plugin>
-
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http://epf.eclipse.org/msproject" 
-       class = "org.eclipse.epf.msproject.MsprojectPackage"
-       genModel = "model/MS_Project_2003.genmodel" /> 
-  </extension>
-
-  <extension point="org.eclipse.emf.ecore.extension_parser">
-    <parser 
-       type="msproject" 
-       class="org.eclipse.epf.msproject.util.MsprojectResourceFactoryImpl" />
-  </extension>
-
-</plugin>
-
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Assignment.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Assignment.java
deleted file mode 100644
index 238bc44..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Assignment.java
+++ /dev/null
@@ -1,2034 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Assignment.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Assignment</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getTaskUID <em>Task UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getResourceUID <em>Resource UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getPercentWorkComplete <em>Percent Work Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualCost <em>Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualFinish <em>Actual Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeCost <em>Actual Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeWork <em>Actual Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualStart <em>Actual Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualWork <em>Actual Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getACWP <em>ACWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isConfirmed <em>Confirmed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getCostRateTable <em>Cost Rate Table</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getCostVariance <em>Cost Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getCV <em>CV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getDelay <em>Delay</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getFinishVariance <em>Finish Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getHyperlink <em>Hyperlink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getHyperlinkAddress <em>Hyperlink Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getWorkVariance <em>Work Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isHasFixedRateUnits <em>Has Fixed Rate Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isFixedMaterial <em>Fixed Material</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getLevelingDelay <em>Leveling Delay</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getLevelingDelayFormat <em>Leveling Delay Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isLinkedFields <em>Linked Fields</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isMilestone <em>Milestone</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getNotes <em>Notes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isOverallocated <em>Overallocated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getOvertimeCost <em>Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getOvertimeWork <em>Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getRegularWork <em>Regular Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getRemainingCost <em>Remaining Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getRemainingWork <em>Remaining Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isResponsePending <em>Response Pending</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getStop <em>Stop</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getResume <em>Resume</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getStartVariance <em>Start Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getUnits <em>Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#isUpdateNeeded <em>Update Needed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getVAC <em>VAC</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getWorkContour <em>Work Contour</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getBCWP <em>BCWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getBookingType <em>Booking Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualWorkProtected <em>Actual Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getCreationDate <em>Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getExtendedAttribute <em>Extended Attribute</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getBaseline <em>Baseline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Assignment#getTimephasedData <em>Timephased Data</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment()
- * @model extendedMetaData="name='Assignment_._type' kind='elementOnly'"
- * @generated
- */
-public interface Assignment extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Task UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the task.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Task UID</em>' attribute.
-	 * @see #setTaskUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_TaskUID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='TaskUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getTaskUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getTaskUID <em>Task UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Task UID</em>' attribute.
-	 * @see #getTaskUID()
-	 * @generated
-	 */
-	void setTaskUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Resource UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the resource.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resource UID</em>' attribute.
-	 * @see #setResourceUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ResourceUID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ResourceUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getResourceUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getResourceUID <em>Resource UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resource UID</em>' attribute.
-	 * @see #getResourceUID()
-	 * @generated
-	 */
-	void setResourceUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Percent Work Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of work completed on the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Percent Work Complete</em>' attribute.
-	 * @see #setPercentWorkComplete(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_PercentWorkComplete()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='PercentWorkComplete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getPercentWorkComplete();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getPercentWorkComplete <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Percent Work Complete</em>' attribute.
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 */
-	void setPercentWorkComplete(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual cost incurred on the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Cost</em>' attribute.
-	 * @see #setActualCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='ActualCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getActualCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualCost <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Cost</em>' attribute.
-	 * @see #getActualCost()
-	 * @generated
-	 */
-	void setActualCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual finish date of the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Finish</em>' attribute.
-	 * @see #setActualFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualFinish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='ActualFinish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualFinish <em>Actual Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Finish</em>' attribute.
-	 * @see #getActualFinish()
-	 * @generated
-	 */
-	void setActualFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual overtime cost incurred on the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Cost</em>' attribute.
-	 * @see #setActualOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualOvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getActualOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeCost <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Cost</em>' attribute.
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 */
-	void setActualOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual amount of overtime work incurred on the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Work</em>' attribute.
-	 * @see #setActualOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualOvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeWork <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Work</em>' attribute.
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 */
-	void setActualOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual start date of the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Start</em>' attribute.
-	 * @see #setActualStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualStart()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='ActualStart' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualStart <em>Actual Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Start</em>' attribute.
-	 * @see #getActualStart()
-	 * @generated
-	 */
-	void setActualStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual amount of work incurred on the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Work</em>' attribute.
-	 * @see #setActualWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualWork <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Work</em>' attribute.
-	 * @see #getActualWork()
-	 * @generated
-	 */
-	void setActualWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>ACWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual cost of work performed on the assignment to-date.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>ACWP</em>' attribute.
-	 * @see #isSetACWP()
-	 * @see #unsetACWP()
-	 * @see #setACWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ACWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='ACWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getACWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getACWP <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>ACWP</em>' attribute.
-	 * @see #isSetACWP()
-	 * @see #unsetACWP()
-	 * @see #getACWP()
-	 * @generated
-	 */
-	void setACWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getACWP <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetACWP()
-	 * @see #getACWP()
-	 * @see #setACWP(float)
-	 * @generated
-	 */
-	void unsetACWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getACWP <em>ACWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>ACWP</em>' attribute is set.
-	 * @see #unsetACWP()
-	 * @see #getACWP()
-	 * @see #setACWP(float)
-	 * @generated
-	 */
-	boolean isSetACWP();
-
-	/**
-	 * Returns the value of the '<em><b>Confirmed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the Resource has accepted all of his or her assignments.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Confirmed</em>' attribute.
-	 * @see #isSetConfirmed()
-	 * @see #unsetConfirmed()
-	 * @see #setConfirmed(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Confirmed()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Confirmed' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isConfirmed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isConfirmed <em>Confirmed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Confirmed</em>' attribute.
-	 * @see #isSetConfirmed()
-	 * @see #unsetConfirmed()
-	 * @see #isConfirmed()
-	 * @generated
-	 */
-	void setConfirmed(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isConfirmed <em>Confirmed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetConfirmed()
-	 * @see #isConfirmed()
-	 * @see #setConfirmed(boolean)
-	 * @generated
-	 */
-	void unsetConfirmed();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isConfirmed <em>Confirmed</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Confirmed</em>' attribute is set.
-	 * @see #unsetConfirmed()
-	 * @see #isConfirmed()
-	 * @see #setConfirmed(boolean)
-	 * @generated
-	 */
-	boolean isSetConfirmed();
-
-	/**
-	 * Returns the value of the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The projected or scheduled cost of the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost</em>' attribute.
-	 * @see #setCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Cost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='Cost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getCost <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost</em>' attribute.
-	 * @see #getCost()
-	 * @generated
-	 */
-	void setCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost Rate Table</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The cost rate table used for the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost Rate Table</em>' attribute.
-	 * @see #setCostRateTable(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_CostRateTable()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.CostRateTableType"
-	 *        extendedMetaData="kind='element' name='CostRateTable' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCostRateTable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getCostRateTable <em>Cost Rate Table</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost Rate Table</em>' attribute.
-	 * @see #getCostRateTable()
-	 * @generated
-	 */
-	void setCostRateTable(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The difference between the cost and baseline cost for a resource.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost Variance</em>' attribute.
-	 * @see #isSetCostVariance()
-	 * @see #unsetCostVariance()
-	 * @see #setCostVariance(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_CostVariance()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='CostVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getCostVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getCostVariance <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost Variance</em>' attribute.
-	 * @see #isSetCostVariance()
-	 * @see #unsetCostVariance()
-	 * @see #getCostVariance()
-	 * @generated
-	 */
-	void setCostVariance(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getCostVariance <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCostVariance()
-	 * @see #getCostVariance()
-	 * @see #setCostVariance(float)
-	 * @generated
-	 */
-	void unsetCostVariance();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getCostVariance <em>Cost Variance</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Cost Variance</em>' attribute is set.
-	 * @see #unsetCostVariance()
-	 * @see #getCostVariance()
-	 * @see #setCostVariance(float)
-	 * @generated
-	 */
-	boolean isSetCostVariance();
-
-	/**
-	 * Returns the value of the '<em><b>CV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Earned value cost variance.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>CV</em>' attribute.
-	 * @see #isSetCV()
-	 * @see #unsetCV()
-	 * @see #setCV(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_CV()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='CV' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getCV();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getCV <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>CV</em>' attribute.
-	 * @see #isSetCV()
-	 * @see #unsetCV()
-	 * @see #getCV()
-	 * @generated
-	 */
-	void setCV(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getCV <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCV()
-	 * @see #getCV()
-	 * @see #setCV(float)
-	 * @generated
-	 */
-	void unsetCV();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getCV <em>CV</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>CV</em>' attribute is set.
-	 * @see #unsetCV()
-	 * @see #getCV()
-	 * @see #setCV(float)
-	 * @generated
-	 */
-	boolean isSetCV();
-
-	/**
-	 * Returns the value of the '<em><b>Delay</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount that the assignment is delayed.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Delay</em>' attribute.
-	 * @see #setDelay(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Delay()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='Delay' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDelay();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getDelay <em>Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Delay</em>' attribute.
-	 * @see #getDelay()
-	 * @generated
-	 */
-	void setDelay(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled finish date of the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish</em>' attribute.
-	 * @see #setFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Finish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Finish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getFinish <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish</em>' attribute.
-	 * @see #getFinish()
-	 * @generated
-	 */
-	void setFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The variance of the assignment finish date from the baseline finish date.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish Variance</em>' attribute.
-	 * @see #setFinishVariance(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_FinishVariance()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='FinishVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getFinishVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getFinishVariance <em>Finish Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish Variance</em>' attribute.
-	 * @see #getFinishVariance()
-	 * @generated
-	 */
-	void setFinishVariance(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The title of the hyperlink associated with the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink</em>' attribute.
-	 * @see #setHyperlink(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Hyperlink()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkType"
-	 *        extendedMetaData="kind='element' name='Hyperlink' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlink();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getHyperlink <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink</em>' attribute.
-	 * @see #getHyperlink()
-	 * @generated
-	 */
-	void setHyperlink(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The hyperlink associated with the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink Address</em>' attribute.
-	 * @see #setHyperlinkAddress(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_HyperlinkAddress()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkAddressType"
-	 *        extendedMetaData="kind='element' name='HyperlinkAddress' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlinkAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getHyperlinkAddress <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink Address</em>' attribute.
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 */
-	void setHyperlinkAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink Sub Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The document bookmark of the hyperlink associated with the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink Sub Address</em>' attribute.
-	 * @see #setHyperlinkSubAddress(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_HyperlinkSubAddress()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkSubAddressType1"
-	 *        extendedMetaData="kind='element' name='HyperlinkSubAddress' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlinkSubAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink Sub Address</em>' attribute.
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 */
-	void setHyperlinkSubAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Work Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The variance of assignment work from the baseline work as minutes x 1000.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work Variance</em>' attribute.
-	 * @see #isSetWorkVariance()
-	 * @see #unsetWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_WorkVariance()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='WorkVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getWorkVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getWorkVariance <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Variance</em>' attribute.
-	 * @see #isSetWorkVariance()
-	 * @see #unsetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @generated
-	 */
-	void setWorkVariance(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getWorkVariance <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @generated
-	 */
-	void unsetWorkVariance();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getWorkVariance <em>Work Variance</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Work Variance</em>' attribute is set.
-	 * @see #unsetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @generated
-	 */
-	boolean isSetWorkVariance();
-
-	/**
-	 * Returns the value of the '<em><b>Has Fixed Rate Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the Units are Fixed Rate.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Has Fixed Rate Units</em>' attribute.
-	 * @see #isSetHasFixedRateUnits()
-	 * @see #unsetHasFixedRateUnits()
-	 * @see #setHasFixedRateUnits(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_HasFixedRateUnits()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='HasFixedRateUnits' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isHasFixedRateUnits();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isHasFixedRateUnits <em>Has Fixed Rate Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Has Fixed Rate Units</em>' attribute.
-	 * @see #isSetHasFixedRateUnits()
-	 * @see #unsetHasFixedRateUnits()
-	 * @see #isHasFixedRateUnits()
-	 * @generated
-	 */
-	void setHasFixedRateUnits(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isHasFixedRateUnits <em>Has Fixed Rate Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetHasFixedRateUnits()
-	 * @see #isHasFixedRateUnits()
-	 * @see #setHasFixedRateUnits(boolean)
-	 * @generated
-	 */
-	void unsetHasFixedRateUnits();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isHasFixedRateUnits <em>Has Fixed Rate Units</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Has Fixed Rate Units</em>' attribute is set.
-	 * @see #unsetHasFixedRateUnits()
-	 * @see #isHasFixedRateUnits()
-	 * @see #setHasFixedRateUnits(boolean)
-	 * @generated
-	 */
-	boolean isSetHasFixedRateUnits();
-
-	/**
-	 * Returns the value of the '<em><b>Fixed Material</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the consumption of the assigned material resource occurs in a single, fixed amount.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Fixed Material</em>' attribute.
-	 * @see #isSetFixedMaterial()
-	 * @see #unsetFixedMaterial()
-	 * @see #setFixedMaterial(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_FixedMaterial()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='FixedMaterial' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isFixedMaterial();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isFixedMaterial <em>Fixed Material</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Fixed Material</em>' attribute.
-	 * @see #isSetFixedMaterial()
-	 * @see #unsetFixedMaterial()
-	 * @see #isFixedMaterial()
-	 * @generated
-	 */
-	void setFixedMaterial(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isFixedMaterial <em>Fixed Material</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetFixedMaterial()
-	 * @see #isFixedMaterial()
-	 * @see #setFixedMaterial(boolean)
-	 * @generated
-	 */
-	void unsetFixedMaterial();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isFixedMaterial <em>Fixed Material</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Fixed Material</em>' attribute is set.
-	 * @see #unsetFixedMaterial()
-	 * @see #isFixedMaterial()
-	 * @see #setFixedMaterial(boolean)
-	 * @generated
-	 */
-	boolean isSetFixedMaterial();
-
-	/**
-	 * Returns the value of the '<em><b>Leveling Delay</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The delay caused by leveling.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Leveling Delay</em>' attribute.
-	 * @see #setLevelingDelay(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_LevelingDelay()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='LevelingDelay' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLevelingDelay();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getLevelingDelay <em>Leveling Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Leveling Delay</em>' attribute.
-	 * @see #getLevelingDelay()
-	 * @generated
-	 */
-	void setLevelingDelay(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Leveling Delay Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the duration of the delay.  
-	 *                             Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 21=null, 
-	 *                             35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Leveling Delay Format</em>' attribute.
-	 * @see #setLevelingDelayFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_LevelingDelayFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.LevelingDelayFormatType"
-	 *        extendedMetaData="kind='element' name='LevelingDelayFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLevelingDelayFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getLevelingDelayFormat <em>Leveling Delay Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Leveling Delay Format</em>' attribute.
-	 * @see #getLevelingDelayFormat()
-	 * @generated
-	 */
-	void setLevelingDelayFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Linked Fields</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the Project is linked to another OLE object.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Linked Fields</em>' attribute.
-	 * @see #isSetLinkedFields()
-	 * @see #unsetLinkedFields()
-	 * @see #setLinkedFields(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_LinkedFields()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='LinkedFields' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isLinkedFields();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isLinkedFields <em>Linked Fields</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Linked Fields</em>' attribute.
-	 * @see #isSetLinkedFields()
-	 * @see #unsetLinkedFields()
-	 * @see #isLinkedFields()
-	 * @generated
-	 */
-	void setLinkedFields(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isLinkedFields <em>Linked Fields</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLinkedFields()
-	 * @see #isLinkedFields()
-	 * @see #setLinkedFields(boolean)
-	 * @generated
-	 */
-	void unsetLinkedFields();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isLinkedFields <em>Linked Fields</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Linked Fields</em>' attribute is set.
-	 * @see #unsetLinkedFields()
-	 * @see #isLinkedFields()
-	 * @see #setLinkedFields(boolean)
-	 * @generated
-	 */
-	boolean isSetLinkedFields();
-
-	/**
-	 * Returns the value of the '<em><b>Milestone</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the assignment is a milestone.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Milestone</em>' attribute.
-	 * @see #isSetMilestone()
-	 * @see #unsetMilestone()
-	 * @see #setMilestone(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Milestone()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Milestone' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMilestone();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isMilestone <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Milestone</em>' attribute.
-	 * @see #isSetMilestone()
-	 * @see #unsetMilestone()
-	 * @see #isMilestone()
-	 * @generated
-	 */
-	void setMilestone(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isMilestone <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMilestone()
-	 * @see #isMilestone()
-	 * @see #setMilestone(boolean)
-	 * @generated
-	 */
-	void unsetMilestone();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isMilestone <em>Milestone</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Milestone</em>' attribute is set.
-	 * @see #unsetMilestone()
-	 * @see #isMilestone()
-	 * @see #setMilestone(boolean)
-	 * @generated
-	 */
-	boolean isSetMilestone();
-
-	/**
-	 * Returns the value of the '<em><b>Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Text notes associated with the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Notes</em>' attribute.
-	 * @see #setNotes(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Notes()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Notes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getNotes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getNotes <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Notes</em>' attribute.
-	 * @see #getNotes()
-	 * @generated
-	 */
-	void setNotes(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Overallocated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the assignment is overallocated.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overallocated</em>' attribute.
-	 * @see #isSetOverallocated()
-	 * @see #unsetOverallocated()
-	 * @see #setOverallocated(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Overallocated()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Overallocated' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isOverallocated();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isOverallocated <em>Overallocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overallocated</em>' attribute.
-	 * @see #isSetOverallocated()
-	 * @see #unsetOverallocated()
-	 * @see #isOverallocated()
-	 * @generated
-	 */
-	void setOverallocated(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isOverallocated <em>Overallocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetOverallocated()
-	 * @see #isOverallocated()
-	 * @see #setOverallocated(boolean)
-	 * @generated
-	 */
-	void unsetOverallocated();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isOverallocated <em>Overallocated</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Overallocated</em>' attribute is set.
-	 * @see #unsetOverallocated()
-	 * @see #isOverallocated()
-	 * @see #setOverallocated(boolean)
-	 * @generated
-	 */
-	boolean isSetOverallocated();
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The sum of the actual and remaining overtime cost of the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Cost</em>' attribute.
-	 * @see #setOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_OvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='OvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getOvertimeCost <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Cost</em>' attribute.
-	 * @see #getOvertimeCost()
-	 * @generated
-	 */
-	void setOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled overtime work scheduled for the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Work</em>' attribute.
-	 * @see #setOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_OvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='OvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getOvertimeWork <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Work</em>' attribute.
-	 * @see #getOvertimeWork()
-	 * @generated
-	 */
-	void setOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Regular Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of non-overtime work scheduled for the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Regular Work</em>' attribute.
-	 * @see #setRegularWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_RegularWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RegularWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRegularWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getRegularWork <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Regular Work</em>' attribute.
-	 * @see #getRegularWork()
-	 * @generated
-	 */
-	void setRegularWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining projected cost of completing the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Cost</em>' attribute.
-	 * @see #setRemainingCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_RemainingCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='RemainingCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getRemainingCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getRemainingCost <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Cost</em>' attribute.
-	 * @see #getRemainingCost()
-	 * @generated
-	 */
-	void setRemainingCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining projected overtime cost of completing the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Overtime Cost</em>' attribute.
-	 * @see #setRemainingOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_RemainingOvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='RemainingOvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getRemainingOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Overtime Cost</em>' attribute.
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 */
-	void setRemainingOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining overtime work scheduled to complete the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Overtime Work</em>' attribute.
-	 * @see #setRemainingOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_RemainingOvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RemainingOvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRemainingOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Overtime Work</em>' attribute.
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 */
-	void setRemainingOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining work scheduled to complete the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Work</em>' attribute.
-	 * @see #setRemainingWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_RemainingWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RemainingWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRemainingWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getRemainingWork <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Work</em>' attribute.
-	 * @see #getRemainingWork()
-	 * @generated
-	 */
-	void setRemainingWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Response Pending</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * True if a response has not been received for a TeamAssign message. 
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Response Pending</em>' attribute.
-	 * @see #isSetResponsePending()
-	 * @see #unsetResponsePending()
-	 * @see #setResponsePending(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ResponsePending()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='ResponsePending' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isResponsePending();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isResponsePending <em>Response Pending</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Response Pending</em>' attribute.
-	 * @see #isSetResponsePending()
-	 * @see #unsetResponsePending()
-	 * @see #isResponsePending()
-	 * @generated
-	 */
-	void setResponsePending(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isResponsePending <em>Response Pending</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetResponsePending()
-	 * @see #isResponsePending()
-	 * @see #setResponsePending(boolean)
-	 * @generated
-	 */
-	void unsetResponsePending();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isResponsePending <em>Response Pending</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Response Pending</em>' attribute is set.
-	 * @see #unsetResponsePending()
-	 * @see #isResponsePending()
-	 * @see #setResponsePending(boolean)
-	 * @generated
-	 */
-	boolean isSetResponsePending();
-
-	/**
-	 * Returns the value of the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled start date of the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start</em>' attribute.
-	 * @see #setStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Start()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Start' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getStart <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start</em>' attribute.
-	 * @see #getStart()
-	 * @generated
-	 */
-	void setStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Stop</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the assignment was stopped.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Stop</em>' attribute.
-	 * @see #setStop(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Stop()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Stop' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStop();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getStop <em>Stop</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Stop</em>' attribute.
-	 * @see #getStop()
-	 * @generated
-	 */
-	void setStop(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Resume</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the assignment resumed.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resume</em>' attribute.
-	 * @see #setResume(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Resume()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Resume' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getResume();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getResume <em>Resume</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resume</em>' attribute.
-	 * @see #getResume()
-	 * @generated
-	 */
-	void setResume(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Start Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The variance of the assignment start date from the baseline start date.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start Variance</em>' attribute.
-	 * @see #setStartVariance(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_StartVariance()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='StartVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getStartVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getStartVariance <em>Start Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start Variance</em>' attribute.
-	 * @see #getStartVariance()
-	 * @generated
-	 */
-	void setStartVariance(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The number of units for the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Units</em>' attribute.
-	 * @see #isSetUnits()
-	 * @see #unsetUnits()
-	 * @see #setUnits(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Units()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='Units' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getUnits();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getUnits <em>Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Units</em>' attribute.
-	 * @see #isSetUnits()
-	 * @see #unsetUnits()
-	 * @see #getUnits()
-	 * @generated
-	 */
-	void setUnits(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getUnits <em>Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetUnits()
-	 * @see #getUnits()
-	 * @see #setUnits(float)
-	 * @generated
-	 */
-	void unsetUnits();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getUnits <em>Units</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Units</em>' attribute is set.
-	 * @see #unsetUnits()
-	 * @see #getUnits()
-	 * @see #setUnits(float)
-	 * @generated
-	 */
-	boolean isSetUnits();
-
-	/**
-	 * Returns the value of the '<em><b>Update Needed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * True if the resource assigned to a task needs to be updated as to the status of the task.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Update Needed</em>' attribute.
-	 * @see #isSetUpdateNeeded()
-	 * @see #unsetUpdateNeeded()
-	 * @see #setUpdateNeeded(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_UpdateNeeded()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='UpdateNeeded' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isUpdateNeeded();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#isUpdateNeeded <em>Update Needed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Update Needed</em>' attribute.
-	 * @see #isSetUpdateNeeded()
-	 * @see #unsetUpdateNeeded()
-	 * @see #isUpdateNeeded()
-	 * @generated
-	 */
-	void setUpdateNeeded(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#isUpdateNeeded <em>Update Needed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetUpdateNeeded()
-	 * @see #isUpdateNeeded()
-	 * @see #setUpdateNeeded(boolean)
-	 * @generated
-	 */
-	void unsetUpdateNeeded();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#isUpdateNeeded <em>Update Needed</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Update Needed</em>' attribute is set.
-	 * @see #unsetUpdateNeeded()
-	 * @see #isUpdateNeeded()
-	 * @see #setUpdateNeeded(boolean)
-	 * @generated
-	 */
-	boolean isSetUpdateNeeded();
-
-	/**
-	 * Returns the value of the '<em><b>VAC</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The difference between basline cost and total cost.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>VAC</em>' attribute.
-	 * @see #isSetVAC()
-	 * @see #unsetVAC()
-	 * @see #setVAC(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_VAC()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='VAC' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getVAC();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getVAC <em>VAC</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>VAC</em>' attribute.
-	 * @see #isSetVAC()
-	 * @see #unsetVAC()
-	 * @see #getVAC()
-	 * @generated
-	 */
-	void setVAC(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getVAC <em>VAC</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetVAC()
-	 * @see #getVAC()
-	 * @see #setVAC(float)
-	 * @generated
-	 */
-	void unsetVAC();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getVAC <em>VAC</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>VAC</em>' attribute is set.
-	 * @see #unsetVAC()
-	 * @see #getVAC()
-	 * @see #setVAC(float)
-	 * @generated
-	 */
-	boolean isSetVAC();
-
-	/**
-	 * Returns the value of the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of scheduled work for the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work</em>' attribute.
-	 * @see #setWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Work()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Work' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getWork <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work</em>' attribute.
-	 * @see #getWork()
-	 * @generated
-	 */
-	void setWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Work Contour</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The work contour of the assignment. 
-	 *                             Values are: 0=Flat, 1=Back Loaded, 2=Front Loaded, 3=Double Peak, 4=Early Peak, 5=Late Peak, 
-	 *                             6=Bell, 7=Turtle, 8=Contoured
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work Contour</em>' attribute.
-	 * @see #setWorkContour(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_WorkContour()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.WorkContourType"
-	 *        extendedMetaData="kind='element' name='WorkContour' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getWorkContour();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getWorkContour <em>Work Contour</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Contour</em>' attribute.
-	 * @see #getWorkContour()
-	 * @generated
-	 */
-	void setWorkContour(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work on the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #setBCWS(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_BCWS()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWS' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWS();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @generated
-	 */
-	void setBCWS(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	void unsetBCWS();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getBCWS <em>BCWS</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWS</em>' attribute is set.
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	boolean isSetBCWS();
-
-	/**
-	 * Returns the value of the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work performed on the assignment to-date.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #setBCWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_BCWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @generated
-	 */
-	void setBCWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Assignment#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	void unsetBCWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Assignment#getBCWP <em>BCWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWP</em>' attribute is set.
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	boolean isSetBCWP();
-
-	/**
-	 * Returns the value of the '<em><b>Booking Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the booking type of the assignment. 1=Commited, 2=Proposed
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Booking Type</em>' attribute.
-	 * @see #setBookingType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_BookingType()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.BookingTypeType"
-	 *        extendedMetaData="kind='element' name='BookingType' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getBookingType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getBookingType <em>Booking Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Booking Type</em>' attribute.
-	 * @see #getBookingType()
-	 * @generated
-	 */
-	void setBookingType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the duration through which actual work is protected.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Work Protected</em>' attribute.
-	 * @see #setActualWorkProtected(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualWorkProtected()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualWorkProtected' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualWorkProtected();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualWorkProtected <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Work Protected</em>' attribute.
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 */
-	void setActualWorkProtected(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the duration through which actual overtime work is protected.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Work Protected</em>' attribute.
-	 * @see #setActualOvertimeWorkProtected(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ActualOvertimeWorkProtected()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeWorkProtected' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualOvertimeWorkProtected();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Work Protected</em>' attribute.
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 */
-	void setActualOvertimeWorkProtected(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the assignment was created.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Creation Date</em>' attribute.
-	 * @see #setCreationDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_CreationDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='CreationDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getCreationDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Assignment#getCreationDate <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Creation Date</em>' attribute.
-	 * @see #getCreationDate()
-	 * @generated
-	 */
-	void setCreationDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.ExtendedAttribute4}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The value of an extended attribute.  Two pieces of data are necessary - 
-	 *                             a pointer back to the extended attribute table which is specified either by the unique ID or the 
-	 *                             Field ID, and the value which is specified either with the value, or a pointer back to the value list.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Extended Attribute</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_ExtendedAttribute()
-	 * @model type="org.eclipse.epf.msproject.ExtendedAttribute4" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='ExtendedAttribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExtendedAttribute();
-
-	/**
-	 * Returns the value of the '<em><b>Baseline</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Baseline3}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of baseline values associated with the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Baseline</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_Baseline()
-	 * @model type="org.eclipse.epf.msproject.Baseline3" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Baseline' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getBaseline();
-
-	/**
-	 * Returns the value of the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.TimephasedDataType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The time phased data associated with the assignment.
-	 *                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Timephased Data</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignment_TimephasedData()
-	 * @model type="org.eclipse.epf.msproject.TimephasedDataType" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='TimephasedData' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTimephasedData();
-
-} // Assignment
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Assignments.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Assignments.java
deleted file mode 100644
index ba80cec..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Assignments.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Assignments.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Assignments</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Assignments#getAssignment <em>Assignment</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignments()
- * @model extendedMetaData="name='Assignments_._type' kind='elementOnly'"
- * @generated
- */
-public interface Assignments extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Assignment</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Assignment}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * There must be at least one assignment in each Assignments collection.
-	 *                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Assignment</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAssignments_Assignment()
-	 * @model type="org.eclipse.epf.msproject.Assignment" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Assignment' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAssignment();
-
-} // Assignments
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/AvailabilityPeriod.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/AvailabilityPeriod.java
deleted file mode 100644
index 5a7d806..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/AvailabilityPeriod.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AvailabilityPeriod.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Availability Period</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableFrom <em>Available From</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableTo <em>Available To</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableUnits <em>Available Units</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getAvailabilityPeriod()
- * @model extendedMetaData="name='AvailabilityPeriod_._type' kind='elementOnly'"
- * @generated
- */
-public interface AvailabilityPeriod extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Available From</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the resource becomes available for the specified period.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Available From</em>' attribute.
-	 * @see #setAvailableFrom(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAvailabilityPeriod_AvailableFrom()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='AvailableFrom' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getAvailableFrom();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableFrom <em>Available From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Available From</em>' attribute.
-	 * @see #getAvailableFrom()
-	 * @generated
-	 */
-	void setAvailableFrom(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Available To</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The last date that the resource is available for the specified period.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Available To</em>' attribute.
-	 * @see #setAvailableTo(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAvailabilityPeriod_AvailableTo()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='AvailableTo' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getAvailableTo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableTo <em>Available To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Available To</em>' attribute.
-	 * @see #getAvailableTo()
-	 * @generated
-	 */
-	void setAvailableTo(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Available Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The percentage that the resource is available during the specified period.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Available Units</em>' attribute.
-	 * @see #isSetAvailableUnits()
-	 * @see #unsetAvailableUnits()
-	 * @see #setAvailableUnits(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAvailabilityPeriod_AvailableUnits()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='AvailableUnits' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getAvailableUnits();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableUnits <em>Available Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Available Units</em>' attribute.
-	 * @see #isSetAvailableUnits()
-	 * @see #unsetAvailableUnits()
-	 * @see #getAvailableUnits()
-	 * @generated
-	 */
-	void setAvailableUnits(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableUnits <em>Available Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetAvailableUnits()
-	 * @see #getAvailableUnits()
-	 * @see #setAvailableUnits(float)
-	 * @generated
-	 */
-	void unsetAvailableUnits();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableUnits <em>Available Units</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Available Units</em>' attribute is set.
-	 * @see #unsetAvailableUnits()
-	 * @see #getAvailableUnits()
-	 * @see #setAvailableUnits(float)
-	 * @generated
-	 */
-	boolean isSetAvailableUnits();
-
-} // AvailabilityPeriod
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/AvailabilityPeriods.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/AvailabilityPeriods.java
deleted file mode 100644
index 80de96d..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/AvailabilityPeriods.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AvailabilityPeriods.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Availability Periods</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.AvailabilityPeriods#getAvailabilityPeriod <em>Availability Period</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getAvailabilityPeriods()
- * @model extendedMetaData="name='AvailabilityPeriods_._type' kind='elementOnly'"
- * @generated
- */
-public interface AvailabilityPeriods extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Availability Period</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.AvailabilityPeriod}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The period the resource is available.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Availability Period</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getAvailabilityPeriods_AvailabilityPeriod()
-	 * @model type="org.eclipse.epf.msproject.AvailabilityPeriod" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='AvailabilityPeriod' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAvailabilityPeriod();
-
-} // AvailabilityPeriods
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline.java
deleted file mode 100644
index 535add3..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Baseline.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Baseline</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getTimephasedData <em>Timephased Data</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#isInterim <em>Interim</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getDuration <em>Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getDurationFormat <em>Duration Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#isEstimatedDuration <em>Estimated Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline#getBCWP <em>BCWP</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline()
- * @model extendedMetaData="name='Baseline_._type' kind='elementOnly'"
- * @generated
- */
-public interface Baseline extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.TimephasedDataType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The time phased data block associated with the task baseline.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Timephased Data</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_TimephasedData()
-	 * @model type="org.eclipse.epf.msproject.TimephasedDataType" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='TimephasedData' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTimephasedData();
-
-	/**
-	 * Returns the value of the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique number of the baseline data record.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Number</em>' attribute.
-	 * @see #setNumber(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_Number()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='Number' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getNumber();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getNumber <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Number</em>' attribute.
-	 * @see #getNumber()
-	 * @generated
-	 */
-	void setNumber(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Interim</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether this is an Interim Baseline.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Interim</em>' attribute.
-	 * @see #isSetInterim()
-	 * @see #unsetInterim()
-	 * @see #setInterim(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_Interim()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Interim' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isInterim();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#isInterim <em>Interim</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Interim</em>' attribute.
-	 * @see #isSetInterim()
-	 * @see #unsetInterim()
-	 * @see #isInterim()
-	 * @generated
-	 */
-	void setInterim(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline#isInterim <em>Interim</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetInterim()
-	 * @see #isInterim()
-	 * @see #setInterim(boolean)
-	 * @generated
-	 */
-	void unsetInterim();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline#isInterim <em>Interim</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Interim</em>' attribute is set.
-	 * @see #unsetInterim()
-	 * @see #isInterim()
-	 * @see #setInterim(boolean)
-	 * @generated
-	 */
-	boolean isSetInterim();
-
-	/**
-	 * Returns the value of the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled start date of the task when the baseline was saved.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start</em>' attribute.
-	 * @see #setStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_Start()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Start' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getStart <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start</em>' attribute.
-	 * @see #getStart()
-	 * @generated
-	 */
-	void setStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled finish date of the task when the baseline was saved.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish</em>' attribute.
-	 * @see #setFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_Finish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Finish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getFinish <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish</em>' attribute.
-	 * @see #getFinish()
-	 * @generated
-	 */
-	void setFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled duration of the task when the baseline was saved.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration</em>' attribute.
-	 * @see #setDuration(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_Duration()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Duration' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getDuration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getDuration <em>Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration</em>' attribute.
-	 * @see #getDuration()
-	 * @generated
-	 */
-	void setDuration(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the Duration of the Task baseline.  
-	 *                                             Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 
-	 *                                             21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 
-	 *                                             51=%?, 52=e%? and 53=null.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration Format</em>' attribute.
-	 * @see #setDurationFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_DurationFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DurationFormatType1"
-	 *        extendedMetaData="kind='element' name='DurationFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDurationFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getDurationFormat <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration Format</em>' attribute.
-	 * @see #getDurationFormat()
-	 * @generated
-	 */
-	void setDurationFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Estimated Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the baseline duration of the task was estimated.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Estimated Duration</em>' attribute.
-	 * @see #isSetEstimatedDuration()
-	 * @see #unsetEstimatedDuration()
-	 * @see #setEstimatedDuration(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_EstimatedDuration()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='EstimatedDuration' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isEstimatedDuration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#isEstimatedDuration <em>Estimated Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Estimated Duration</em>' attribute.
-	 * @see #isSetEstimatedDuration()
-	 * @see #unsetEstimatedDuration()
-	 * @see #isEstimatedDuration()
-	 * @generated
-	 */
-	void setEstimatedDuration(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline#isEstimatedDuration <em>Estimated Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetEstimatedDuration()
-	 * @see #isEstimatedDuration()
-	 * @see #setEstimatedDuration(boolean)
-	 * @generated
-	 */
-	void unsetEstimatedDuration();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline#isEstimatedDuration <em>Estimated Duration</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Estimated Duration</em>' attribute is set.
-	 * @see #unsetEstimatedDuration()
-	 * @see #isEstimatedDuration()
-	 * @see #setEstimatedDuration(boolean)
-	 * @generated
-	 */
-	boolean isSetEstimatedDuration();
-
-	/**
-	 * Returns the value of the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled work of the task when the baseline was saved.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work</em>' attribute.
-	 * @see #setWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_Work()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Work' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getWork <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work</em>' attribute.
-	 * @see #getWork()
-	 * @generated
-	 */
-	void setWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The projected cost of the task when the baseline was saved.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost</em>' attribute.
-	 * @see #setCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_Cost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='Cost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getCost <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost</em>' attribute.
-	 * @see #getCost()
-	 * @generated
-	 */
-	void setCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work scheduled for the task.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #setBCWS(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_BCWS()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWS' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWS();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @generated
-	 */
-	void setBCWS(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	void unsetBCWS();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline#getBCWS <em>BCWS</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWS</em>' attribute is set.
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	boolean isSetBCWS();
-
-	/**
-	 * Returns the value of the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work performed on the task to-date.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #setBCWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline_BCWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @generated
-	 */
-	void setBCWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	void unsetBCWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline#getBCWP <em>BCWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWP</em>' attribute is set.
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	boolean isSetBCWP();
-
-} // Baseline
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline2.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline2.java
deleted file mode 100644
index 3aa771d..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline2.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Baseline2.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Baseline2</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Baseline2#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline2#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline2#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline2#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline2#getBCWP <em>BCWP</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline2()
- * @model extendedMetaData="name='Baseline_._1_._type' kind='elementOnly'"
- * @generated
- */
-public interface Baseline2 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique number of the baseline data record.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Number</em>' attribute.
-	 * @see #setNumber(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline2_Number()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='Number' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getNumber();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getNumber <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Number</em>' attribute.
-	 * @see #getNumber()
-	 * @generated
-	 */
-	void setNumber(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The work assigned the resource when the baseline is saved.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work</em>' attribute.
-	 * @see #setWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline2_Work()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Work' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getWork <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work</em>' attribute.
-	 * @see #getWork()
-	 * @generated
-	 */
-	void setWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The projected cost for the resource when the baseline was saved.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost</em>' attribute.
-	 * @see #isSetCost()
-	 * @see #unsetCost()
-	 * @see #setCost(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline2_Cost()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='Cost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getCost <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost</em>' attribute.
-	 * @see #isSetCost()
-	 * @see #unsetCost()
-	 * @see #getCost()
-	 * @generated
-	 */
-	void setCost(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getCost <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCost()
-	 * @see #getCost()
-	 * @see #setCost(float)
-	 * @generated
-	 */
-	void unsetCost();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline2#getCost <em>Cost</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Cost</em>' attribute is set.
-	 * @see #unsetCost()
-	 * @see #getCost()
-	 * @see #setCost(float)
-	 * @generated
-	 */
-	boolean isSetCost();
-
-	/**
-	 * Returns the value of the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budget cost of work scheduled for the resource.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #setBCWS(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline2_BCWS()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWS' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWS();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @generated
-	 */
-	void setBCWS(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	void unsetBCWS();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline2#getBCWS <em>BCWS</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWS</em>' attribute is set.
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	boolean isSetBCWS();
-
-	/**
-	 * Returns the value of the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of of the work performed by the resource for the project to-date.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #setBCWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline2_BCWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @generated
-	 */
-	void setBCWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline2#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	void unsetBCWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline2#getBCWP <em>BCWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWP</em>' attribute is set.
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	boolean isSetBCWP();
-
-} // Baseline2
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline3.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline3.java
deleted file mode 100644
index ce9a6c8..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Baseline3.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Baseline3.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Baseline3</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getTimephasedData <em>Timephased Data</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Baseline3#getBCWP <em>BCWP</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3()
- * @model extendedMetaData="name='Baseline_._2_._type' kind='elementOnly'"
- * @generated
- */
-public interface Baseline3 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.TimephasedDataType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The time phased data associated with the Baseline.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Timephased Data</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_TimephasedData()
-	 * @model type="org.eclipse.epf.msproject.TimephasedDataType" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='TimephasedData' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTimephasedData();
-
-	/**
-	 * Returns the value of the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique number of the baseline data record.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Number</em>' attribute.
-	 * @see #setNumber(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_Number()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" required="true"
-	 *        extendedMetaData="kind='element' name='Number' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getNumber();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getNumber <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Number</em>' attribute.
-	 * @see #getNumber()
-	 * @generated
-	 */
-	void setNumber(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled start date of the assignment when the baseline was saved.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start</em>' attribute.
-	 * @see #setStart(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_Start()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Start' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getStart <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start</em>' attribute.
-	 * @see #getStart()
-	 * @generated
-	 */
-	void setStart(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled finish date of the assignment when the baseline was saved.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish</em>' attribute.
-	 * @see #setFinish(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_Finish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Finish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getFinish <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish</em>' attribute.
-	 * @see #getFinish()
-	 * @generated
-	 */
-	void setFinish(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The total amount of work scheduled on the assignment when the baseline was saved.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work</em>' attribute.
-	 * @see #setWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_Work()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Work' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getWork <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work</em>' attribute.
-	 * @see #getWork()
-	 * @generated
-	 */
-	void setWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The total projected cost of the assignment when the baseline was saved.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost</em>' attribute.
-	 * @see #setCost(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_Cost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Cost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getCost <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost</em>' attribute.
-	 * @see #getCost()
-	 * @generated
-	 */
-	void setCost(String value);
-
-	/**
-	 * Returns the value of the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work on the assignment.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #setBCWS(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_BCWS()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWS' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWS();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @generated
-	 */
-	void setBCWS(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	void unsetBCWS();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline3#getBCWS <em>BCWS</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWS</em>' attribute is set.
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	boolean isSetBCWS();
-
-	/**
-	 * Returns the value of the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work performed on the assignment to-date.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #setBCWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getBaseline3_BCWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @generated
-	 */
-	void setBCWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Baseline3#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	void unsetBCWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Baseline3#getBCWP <em>BCWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWP</em>' attribute is set.
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	boolean isSetBCWP();
-
-} // Baseline3
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Calendar.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Calendar.java
deleted file mode 100644
index d295d03..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Calendar.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Calendar.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Calendar</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Calendar#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Calendar#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Calendar#isIsBaseCalendar <em>Is Base Calendar</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Calendar#getBaseCalendarUID <em>Base Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Calendar#getWeekDays <em>Week Days</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendar()
- * @model extendedMetaData="name='Calendar_._type' kind='elementOnly'"
- * @generated
- */
-public interface Calendar extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the calendar.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendar_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Calendar#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The name of the calendar.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendar_Name()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.NameType"
-	 *        extendedMetaData="kind='element' name='Name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Calendar#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Is Base Calendar</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the calendar is a base calendar.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Base Calendar</em>' attribute.
-	 * @see #isSetIsBaseCalendar()
-	 * @see #unsetIsBaseCalendar()
-	 * @see #setIsBaseCalendar(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendar_IsBaseCalendar()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsBaseCalendar' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsBaseCalendar();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Calendar#isIsBaseCalendar <em>Is Base Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Base Calendar</em>' attribute.
-	 * @see #isSetIsBaseCalendar()
-	 * @see #unsetIsBaseCalendar()
-	 * @see #isIsBaseCalendar()
-	 * @generated
-	 */
-	void setIsBaseCalendar(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Calendar#isIsBaseCalendar <em>Is Base Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsBaseCalendar()
-	 * @see #isIsBaseCalendar()
-	 * @see #setIsBaseCalendar(boolean)
-	 * @generated
-	 */
-	void unsetIsBaseCalendar();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Calendar#isIsBaseCalendar <em>Is Base Calendar</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Base Calendar</em>' attribute is set.
-	 * @see #unsetIsBaseCalendar()
-	 * @see #isIsBaseCalendar()
-	 * @see #setIsBaseCalendar(boolean)
-	 * @generated
-	 */
-	boolean isSetIsBaseCalendar();
-
-	/**
-	 * Returns the value of the '<em><b>Base Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the base calendar 
-	 *                                 on which this calendar depends. Only applicable if the calendar is 
-	 *                                 not a base calendar.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Base Calendar UID</em>' attribute.
-	 * @see #setBaseCalendarUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendar_BaseCalendarUID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='BaseCalendarUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getBaseCalendarUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Calendar#getBaseCalendarUID <em>Base Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Base Calendar UID</em>' attribute.
-	 * @see #getBaseCalendarUID()
-	 * @generated
-	 */
-	void setBaseCalendarUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Week Days</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of Weekdays that defines this calendar.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Week Days</em>' containment reference.
-	 * @see #setWeekDays(WeekDays)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendar_WeekDays()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='WeekDays' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	WeekDays getWeekDays();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Calendar#getWeekDays <em>Week Days</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Week Days</em>' containment reference.
-	 * @see #getWeekDays()
-	 * @generated
-	 */
-	void setWeekDays(WeekDays value);
-
-} // Calendar
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Calendars.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Calendars.java
deleted file mode 100644
index 3db62ca..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Calendars.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Calendars.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Calendars</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Calendars#getCalendar <em>Calendar</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendars()
- * @model extendedMetaData="name='Calendars_._type' kind='elementOnly'"
- * @generated
- */
-public interface Calendars extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Calendar</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Calendar}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Calendars are used to define standard working and 
-	 *                     non-working times. Projects must have one base calendar. Tasks and resources 
-	 *                     may have their own non-base calendars which are based on a base calendar.
-	 *                     
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Calendar</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getCalendars_Calendar()
-	 * @model type="org.eclipse.epf.msproject.Calendar" containment="true" resolveProxies="false" required="true"
-	 *        extendedMetaData="kind='element' name='Calendar' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getCalendar();
-
-} // Calendars
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/DocumentRoot.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/DocumentRoot.java
deleted file mode 100644
index 2277556..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/DocumentRoot.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DocumentRoot.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.DocumentRoot#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.DocumentRoot#getProject <em>Project</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getDocumentRoot()
- * @model extendedMetaData="name='' kind='mixed'"
- * @generated
- */
-public interface DocumentRoot extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Mixed</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mixed</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>Mixed</em>' attribute list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getDocumentRoot_Mixed()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='elementWildcard' name=':mixed'"
-	 * @generated
-	 */
-	FeatureMap getMixed();
-
-	/**
-	 * Returns the value of the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XMLNS Prefix Map</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XMLNS Prefix Map</em>' map.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getDocumentRoot_XMLNSPrefixMap()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xmlns:prefix'"
-	 * @generated
-	 */
-	EMap getXMLNSPrefixMap();
-
-	/**
-	 * Returns the value of the '<em><b>XSI Schema Location</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XSI Schema Location</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XSI Schema Location</em>' map.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getDocumentRoot_XSISchemaLocation()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xsi:schemaLocation'"
-	 * @generated
-	 */
-	EMap getXSISchemaLocation();
-
-	/**
-	 * Returns the value of the '<em><b>Project</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The project is the top level element of the document.
-	 * 			
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Project</em>' containment reference.
-	 * @see #setProject(Project)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getDocumentRoot_Project()
-	 * @model containment="true" resolveProxies="false" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Project' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Project getProject();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.DocumentRoot#getProject <em>Project</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Project</em>' containment reference.
-	 * @see #getProject()
-	 * @generated
-	 */
-	void setProject(Project value);
-
-} // DocumentRoot
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute.java
deleted file mode 100644
index 0593783..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttribute.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extended Attribute</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getFieldName <em>Field Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getAlias <em>Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getPhoneticAlias <em>Phonetic Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getRollupType <em>Rollup Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getCalculationType <em>Calculation Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getFormula <em>Formula</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#isRestrictValues <em>Restrict Values</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getValuelistSortOrder <em>Valuelist Sort Order</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#isAppendNewValues <em>Append New Values</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getDefault <em>Default</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute#getValueList <em>Value List</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute()
- * @model extendedMetaData="name='ExtendedAttribute_._type' kind='elementOnly'"
- * @generated
- */
-public interface ExtendedAttribute extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This corresponds to the PID of the custom field.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field ID</em>' attribute.
-	 * @see #setFieldID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_FieldID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getFieldID <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field ID</em>' attribute.
-	 * @see #getFieldID()
-	 * @generated
-	 */
-	void setFieldID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Field Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The name of the custom field.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field Name</em>' attribute.
-	 * @see #setFieldName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_FieldName()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldName' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getFieldName <em>Field Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field Name</em>' attribute.
-	 * @see #getFieldName()
-	 * @generated
-	 */
-	void setFieldName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The alias of the custom field
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Alias</em>' attribute.
-	 * @see #setAlias(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_Alias()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.AliasType"
-	 *        extendedMetaData="kind='element' name='Alias' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getAlias();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getAlias <em>Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Alias</em>' attribute.
-	 * @see #getAlias()
-	 * @generated
-	 */
-	void setAlias(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Phonetic Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The phonetic pronunciation of the alias of the 
-	 *                                 custom field
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Phonetic Alias</em>' attribute.
-	 * @see #setPhoneticAlias(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_PhoneticAlias()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.PhoneticAliasType"
-	 *        extendedMetaData="kind='element' name='PhoneticAlias' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getPhoneticAlias();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getPhoneticAlias <em>Phonetic Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Phonetic Alias</em>' attribute.
-	 * @see #getPhoneticAlias()
-	 * @generated
-	 */
-	void setPhoneticAlias(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Rollup Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * How rollups are calculated. Values are: 0=Maximum 
-	 *                                 (OR for flag fields), 1=Minimum (AND for flag fields), 2=Count all, 3=Sum, 
-	 *                                 4=Average, 5=Average First Sublevel, 6=Count First Sublevel, 7=Count 
-	 *                                 Nonsummaries
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rollup Type</em>' attribute.
-	 * @see #setRollupType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_RollupType()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.RollupTypeType"
-	 *        extendedMetaData="kind='element' name='RollupType' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getRollupType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getRollupType <em>Rollup Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rollup Type</em>' attribute.
-	 * @see #getRollupType()
-	 * @generated
-	 */
-	void setRollupType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Calculation Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether rollups are calculated for task and group summary rows. 
-	 *                                 Values are: 0=None, 1=Rollup, 2=Calculation
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Calculation Type</em>' attribute.
-	 * @see #setCalculationType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_CalculationType()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.CalculationTypeType"
-	 *        extendedMetaData="kind='element' name='CalculationType' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCalculationType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getCalculationType <em>Calculation Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Calculation Type</em>' attribute.
-	 * @see #getCalculationType()
-	 * @generated
-	 */
-	void setCalculationType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Formula</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The formula that Microsoft Project uses to populate the 
-	 *                                 custom task field.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Formula</em>' attribute.
-	 * @see #setFormula(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_Formula()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Formula' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFormula();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getFormula <em>Formula</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Formula</em>' attribute.
-	 * @see #getFormula()
-	 * @generated
-	 */
-	void setFormula(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Restrict Values</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * If RestrictValues=True then only values in the list are 
-	 *                                 allowed in the file
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Restrict Values</em>' attribute.
-	 * @see #isSetRestrictValues()
-	 * @see #unsetRestrictValues()
-	 * @see #setRestrictValues(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_RestrictValues()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='RestrictValues' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isRestrictValues();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#isRestrictValues <em>Restrict Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Restrict Values</em>' attribute.
-	 * @see #isSetRestrictValues()
-	 * @see #unsetRestrictValues()
-	 * @see #isRestrictValues()
-	 * @generated
-	 */
-	void setRestrictValues(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#isRestrictValues <em>Restrict Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetRestrictValues()
-	 * @see #isRestrictValues()
-	 * @see #setRestrictValues(boolean)
-	 * @generated
-	 */
-	void unsetRestrictValues();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#isRestrictValues <em>Restrict Values</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Restrict Values</em>' attribute is set.
-	 * @see #unsetRestrictValues()
-	 * @see #isRestrictValues()
-	 * @see #setRestrictValues(boolean)
-	 * @generated
-	 */
-	boolean isSetRestrictValues();
-
-	/**
-	 * Returns the value of the '<em><b>Valuelist Sort Order</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * How value lists are sorted. Values are: 
-	 *                                 0=Descending, 1=Ascending
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Valuelist Sort Order</em>' attribute.
-	 * @see #setValuelistSortOrder(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_ValuelistSortOrder()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.ValuelistSortOrderType"
-	 *        extendedMetaData="kind='element' name='ValuelistSortOrder' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getValuelistSortOrder();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getValuelistSortOrder <em>Valuelist Sort Order</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Valuelist Sort Order</em>' attribute.
-	 * @see #getValuelistSortOrder()
-	 * @generated
-	 */
-	void setValuelistSortOrder(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Append New Values</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * If AppendNewValues=True then any new values added in a project 
-	 *                                 are automatically appended to the list.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Append New Values</em>' attribute.
-	 * @see #isSetAppendNewValues()
-	 * @see #unsetAppendNewValues()
-	 * @see #setAppendNewValues(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_AppendNewValues()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='AppendNewValues' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isAppendNewValues();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#isAppendNewValues <em>Append New Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Append New Values</em>' attribute.
-	 * @see #isSetAppendNewValues()
-	 * @see #unsetAppendNewValues()
-	 * @see #isAppendNewValues()
-	 * @generated
-	 */
-	void setAppendNewValues(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#isAppendNewValues <em>Append New Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetAppendNewValues()
-	 * @see #isAppendNewValues()
-	 * @see #setAppendNewValues(boolean)
-	 * @generated
-	 */
-	void unsetAppendNewValues();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#isAppendNewValues <em>Append New Values</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Append New Values</em>' attribute is set.
-	 * @see #unsetAppendNewValues()
-	 * @see #isAppendNewValues()
-	 * @see #setAppendNewValues(boolean)
-	 * @generated
-	 */
-	boolean isSetAppendNewValues();
-
-	/**
-	 * Returns the value of the '<em><b>Default</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This points to the default value in the list. 
-	 *                                 Not present if no default is set.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default</em>' attribute.
-	 * @see #setDefault(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_Default()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Default' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getDefault();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getDefault <em>Default</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default</em>' attribute.
-	 * @see #getDefault()
-	 * @generated
-	 */
-	void setDefault(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value List</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * When values of extended attributes are specified as 
-	 *                                 properties of elements in the schema, they may either be specified by values 
-	 *                                 or by references to the values contained in this list.  Applications may 
-	 *                                 assume ordering of the list by ordering specified here.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value List</em>' containment reference.
-	 * @see #setValueList(ValueList)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute_ValueList()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='ValueList' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueList getValueList();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute#getValueList <em>Value List</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value List</em>' containment reference.
-	 * @see #getValueList()
-	 * @generated
-	 */
-	void setValueList(ValueList value);
-
-} // ExtendedAttribute
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute2.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute2.java
deleted file mode 100644
index 3d5a78b..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute2.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttribute2.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extended Attribute2</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute2#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute2#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute2#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute2#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute2#getDurationFormat <em>Duration Format</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute2()
- * @model extendedMetaData="name='ExtendedAttribute_._1_._type' kind='elementOnly'"
- * @generated
- */
-public interface ExtendedAttribute2 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the value in the extended attribute collection.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute2_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The PID of the custom field.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field ID</em>' attribute.
-	 * @see #setFieldID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute2_FieldID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getFieldID <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field ID</em>' attribute.
-	 * @see #getFieldID()
-	 * @generated
-	 */
-	void setFieldID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual value of the extended attribute.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute2_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The ID of the value in the extended attribut lookup table.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value ID</em>' attribute.
-	 * @see #setValueID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute2_ValueID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ValueID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getValueID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getValueID <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value ID</em>' attribute.
-	 * @see #getValueID()
-	 * @generated
-	 */
-	void setValueID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the bulk duration.  
-	 *                                             Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 
-	 *                                             19=%, 20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 
-	 *                                             42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration Format</em>' attribute.
-	 * @see #setDurationFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute2_DurationFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DurationFormatType2"
-	 *        extendedMetaData="kind='element' name='DurationFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDurationFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getDurationFormat <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration Format</em>' attribute.
-	 * @see #getDurationFormat()
-	 * @generated
-	 */
-	void setDurationFormat(BigInteger value);
-
-} // ExtendedAttribute2
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute3.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute3.java
deleted file mode 100644
index df8b28c..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute3.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttribute3.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extended Attribute3</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute3#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute3#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute3#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute3#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute3#getDurationFormat <em>Duration Format</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute3()
- * @model extendedMetaData="name='ExtendedAttribute_._2_._type' kind='elementOnly'"
- * @generated
- */
-public interface ExtendedAttribute3 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the value in the extended attribute collection.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute3_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The PID of the custom field.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field ID</em>' attribute.
-	 * @see #setFieldID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute3_FieldID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getFieldID <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field ID</em>' attribute.
-	 * @see #getFieldID()
-	 * @generated
-	 */
-	void setFieldID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual value of the extended attribute.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute3_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The ID of the value in the extended attribut lookup table.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value ID</em>' attribute.
-	 * @see #setValueID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute3_ValueID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ValueID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getValueID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getValueID <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value ID</em>' attribute.
-	 * @see #getValueID()
-	 * @generated
-	 */
-	void setValueID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the bulk duration.  
-	 *                                             Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 
-	 *                                             20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 
-	 *                                             43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration Format</em>' attribute.
-	 * @see #setDurationFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute3_DurationFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DurationFormatType3"
-	 *        extendedMetaData="kind='element' name='DurationFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDurationFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getDurationFormat <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration Format</em>' attribute.
-	 * @see #getDurationFormat()
-	 * @generated
-	 */
-	void setDurationFormat(BigInteger value);
-
-} // ExtendedAttribute3
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute4.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute4.java
deleted file mode 100644
index 04d1ecc..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttribute4.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttribute4.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extended Attribute4</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute4#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute4#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute4#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute4#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttribute4#getDurationFormat <em>Duration Format</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute4()
- * @model extendedMetaData="name='ExtendedAttribute_._3_._type' kind='elementOnly'"
- * @generated
- */
-public interface ExtendedAttribute4 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the value in the extended attribute collection.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute4_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The field ID in the localised language.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field ID</em>' attribute.
-	 * @see #setFieldID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute4_FieldID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getFieldID <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field ID</em>' attribute.
-	 * @see #getFieldID()
-	 * @generated
-	 */
-	void setFieldID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual value of the extended attribute.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute4_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The ID of the value in the extended attribut lookup table.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value ID</em>' attribute.
-	 * @see #setValueID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute4_ValueID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ValueID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getValueID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getValueID <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value ID</em>' attribute.
-	 * @see #getValueID()
-	 * @generated
-	 */
-	void setValueID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the bulk duration.  
-	 *                                         Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 
-	 *                                         21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 
-	 *                                         51=%?, 52=e%? and 53=null.
-	 *                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration Format</em>' attribute.
-	 * @see #setDurationFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttribute4_DurationFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DurationFormatType"
-	 *        extendedMetaData="kind='element' name='DurationFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDurationFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getDurationFormat <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration Format</em>' attribute.
-	 * @see #getDurationFormat()
-	 * @generated
-	 */
-	void setDurationFormat(BigInteger value);
-
-} // ExtendedAttribute4
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttributes.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttributes.java
deleted file mode 100644
index f548f07..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ExtendedAttributes.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttributes.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extended Attributes</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.ExtendedAttributes#getExtendedAttribute <em>Extended Attribute</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttributes()
- * @model extendedMetaData="name='ExtendedAttributes_._type' kind='elementOnly'"
- * @generated
- */
-public interface ExtendedAttributes extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.ExtendedAttribute}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Each of the individual entries in the extended attributes definition 
-	 *                     collection.  There are no limits to the number of children that may appear, but project 
-	 *                     will only understand Flag1-Flag10, etc.  This must appear once in each ExtendedAttributes 
-	 *                     collection.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Extended Attribute</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getExtendedAttributes_ExtendedAttribute()
-	 * @model type="org.eclipse.epf.msproject.ExtendedAttribute" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='ExtendedAttribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExtendedAttribute();
-
-} // ExtendedAttributes
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Mask.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Mask.java
deleted file mode 100644
index c7f99b1..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Mask.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Mask.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Mask</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Mask#getLevel <em>Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Mask#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Mask#getLength <em>Length</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Mask#getSeparator <em>Separator</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getMask()
- * @model extendedMetaData="name='Mask_._type' kind='elementOnly'"
- * @generated
- */
-public interface Mask extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The level of the mask.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Level</em>' attribute.
-	 * @see #setLevel(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getMask_Level()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='Level' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Mask#getLevel <em>Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Level</em>' attribute.
-	 * @see #getLevel()
-	 * @generated
-	 */
-	void setLevel(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The type of mask. Values are: 0=Numbers, 1=Upper Case Letters, 2=Lower Case Letters, 3=Characters
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see #setType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getMask_Type()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.TypeType5"
-	 *        extendedMetaData="kind='element' name='Type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Mask#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Length</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The maximum length in characters of the outline code values.  If length is any, the value is zero.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Length</em>' attribute.
-	 * @see #setLength(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getMask_Length()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='Length' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLength();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Mask#getLength <em>Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Length</em>' attribute.
-	 * @see #getLength()
-	 * @generated
-	 */
-	void setLength(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Separator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The separator value of the code values.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Separator</em>' attribute.
-	 * @see #setSeparator(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getMask_Separator()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Separator' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getSeparator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Mask#getSeparator <em>Separator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Separator</em>' attribute.
-	 * @see #getSeparator()
-	 * @generated
-	 */
-	void setSeparator(String value);
-
-} // Mask
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Masks.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Masks.java
deleted file mode 100644
index 0d064af..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Masks.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Masks.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Masks</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Masks#getMask <em>Mask</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getMasks()
- * @model extendedMetaData="name='Masks_._type' kind='elementOnly'"
- * @generated
- */
-public interface Masks extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Mask</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Mask}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The four elements of the mask constitute the format in which the outline code must appear.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Mask</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getMasks_Mask()
-	 * @model type="org.eclipse.epf.msproject.Mask" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Mask' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getMask();
-
-} // Masks
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/MsprojectFactory.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/MsprojectFactory.java
deleted file mode 100644
index b75e7fa..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/MsprojectFactory.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectFactory.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-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.epf.msproject.MsprojectPackage
- * @generated
- */
-public interface MsprojectFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	MsprojectFactory eINSTANCE = new org.eclipse.epf.msproject.impl.MsprojectFactoryImpl();
-
-	/**
-	 * Returns a new object of class '<em>Assignment</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Assignment</em>'.
-	 * @generated
-	 */
-	Assignment createAssignment();
-
-	/**
-	 * Returns a new object of class '<em>Assignments</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Assignments</em>'.
-	 * @generated
-	 */
-	Assignments createAssignments();
-
-	/**
-	 * Returns a new object of class '<em>Availability Period</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Availability Period</em>'.
-	 * @generated
-	 */
-	AvailabilityPeriod createAvailabilityPeriod();
-
-	/**
-	 * Returns a new object of class '<em>Availability Periods</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Availability Periods</em>'.
-	 * @generated
-	 */
-	AvailabilityPeriods createAvailabilityPeriods();
-
-	/**
-	 * Returns a new object of class '<em>Baseline</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Baseline</em>'.
-	 * @generated
-	 */
-	Baseline createBaseline();
-
-	/**
-	 * Returns a new object of class '<em>Baseline2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Baseline2</em>'.
-	 * @generated
-	 */
-	Baseline2 createBaseline2();
-
-	/**
-	 * Returns a new object of class '<em>Baseline3</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Baseline3</em>'.
-	 * @generated
-	 */
-	Baseline3 createBaseline3();
-
-	/**
-	 * Returns a new object of class '<em>Calendar</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Calendar</em>'.
-	 * @generated
-	 */
-	Calendar createCalendar();
-
-	/**
-	 * Returns a new object of class '<em>Calendars</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Calendars</em>'.
-	 * @generated
-	 */
-	Calendars createCalendars();
-
-	/**
-	 * Returns a new object of class '<em>Document Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Document Root</em>'.
-	 * @generated
-	 */
-	DocumentRoot createDocumentRoot();
-
-	/**
-	 * Returns a new object of class '<em>Extended Attribute</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Extended Attribute</em>'.
-	 * @generated
-	 */
-	ExtendedAttribute createExtendedAttribute();
-
-	/**
-	 * Returns a new object of class '<em>Extended Attribute2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Extended Attribute2</em>'.
-	 * @generated
-	 */
-	ExtendedAttribute2 createExtendedAttribute2();
-
-	/**
-	 * Returns a new object of class '<em>Extended Attribute3</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Extended Attribute3</em>'.
-	 * @generated
-	 */
-	ExtendedAttribute3 createExtendedAttribute3();
-
-	/**
-	 * Returns a new object of class '<em>Extended Attribute4</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Extended Attribute4</em>'.
-	 * @generated
-	 */
-	ExtendedAttribute4 createExtendedAttribute4();
-
-	/**
-	 * Returns a new object of class '<em>Extended Attributes</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Extended Attributes</em>'.
-	 * @generated
-	 */
-	ExtendedAttributes createExtendedAttributes();
-
-	/**
-	 * Returns a new object of class '<em>Mask</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Mask</em>'.
-	 * @generated
-	 */
-	Mask createMask();
-
-	/**
-	 * Returns a new object of class '<em>Masks</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Masks</em>'.
-	 * @generated
-	 */
-	Masks createMasks();
-
-	/**
-	 * Returns a new object of class '<em>Outline Code</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Outline Code</em>'.
-	 * @generated
-	 */
-	OutlineCode createOutlineCode();
-
-	/**
-	 * Returns a new object of class '<em>Outline Code2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Outline Code2</em>'.
-	 * @generated
-	 */
-	OutlineCode2 createOutlineCode2();
-
-	/**
-	 * Returns a new object of class '<em>Outline Code3</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Outline Code3</em>'.
-	 * @generated
-	 */
-	OutlineCode3 createOutlineCode3();
-
-	/**
-	 * Returns a new object of class '<em>Outline Codes</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Outline Codes</em>'.
-	 * @generated
-	 */
-	OutlineCodes createOutlineCodes();
-
-	/**
-	 * Returns a new object of class '<em>Predecessor Link</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Predecessor Link</em>'.
-	 * @generated
-	 */
-	PredecessorLink createPredecessorLink();
-
-	/**
-	 * Returns a new object of class '<em>Project</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Project</em>'.
-	 * @generated
-	 */
-	Project createProject();
-
-	/**
-	 * Returns a new object of class '<em>Rate</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Rate</em>'.
-	 * @generated
-	 */
-	Rate createRate();
-
-	/**
-	 * Returns a new object of class '<em>Rates</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Rates</em>'.
-	 * @generated
-	 */
-	Rates createRates();
-
-	/**
-	 * Returns a new object of class '<em>Resource</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resource</em>'.
-	 * @generated
-	 */
-	Resource createResource();
-
-	/**
-	 * Returns a new object of class '<em>Resources</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resources</em>'.
-	 * @generated
-	 */
-	Resources createResources();
-
-	/**
-	 * Returns a new object of class '<em>Task</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task</em>'.
-	 * @generated
-	 */
-	Task createTask();
-
-	/**
-	 * Returns a new object of class '<em>Tasks</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tasks</em>'.
-	 * @generated
-	 */
-	Tasks createTasks();
-
-	/**
-	 * Returns a new object of class '<em>Time Period</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Time Period</em>'.
-	 * @generated
-	 */
-	TimePeriod createTimePeriod();
-
-	/**
-	 * Returns a new object of class '<em>Timephased Data Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Timephased Data Type</em>'.
-	 * @generated
-	 */
-	TimephasedDataType createTimephasedDataType();
-
-	/**
-	 * Returns a new object of class '<em>Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Value</em>'.
-	 * @generated
-	 */
-	Value createValue();
-
-	/**
-	 * Returns a new object of class '<em>Value2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Value2</em>'.
-	 * @generated
-	 */
-	Value2 createValue2();
-
-	/**
-	 * Returns a new object of class '<em>Value List</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Value List</em>'.
-	 * @generated
-	 */
-	ValueList createValueList();
-
-	/**
-	 * Returns a new object of class '<em>Values</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Values</em>'.
-	 * @generated
-	 */
-	Values createValues();
-
-	/**
-	 * Returns a new object of class '<em>WBS Mask</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>WBS Mask</em>'.
-	 * @generated
-	 */
-	WBSMask createWBSMask();
-
-	/**
-	 * Returns a new object of class '<em>WBS Masks</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>WBS Masks</em>'.
-	 * @generated
-	 */
-	WBSMasks createWBSMasks();
-
-	/**
-	 * Returns a new object of class '<em>Week Day</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Week Day</em>'.
-	 * @generated
-	 */
-	WeekDay createWeekDay();
-
-	/**
-	 * Returns a new object of class '<em>Week Days</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Week Days</em>'.
-	 * @generated
-	 */
-	WeekDays createWeekDays();
-
-	/**
-	 * Returns a new object of class '<em>Working Time</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Working Time</em>'.
-	 * @generated
-	 */
-	WorkingTime createWorkingTime();
-
-	/**
-	 * Returns a new object of class '<em>Working Times</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Working Times</em>'.
-	 * @generated
-	 */
-	WorkingTimes createWorkingTimes();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	MsprojectPackage getMsprojectPackage();
-
-} //MsprojectFactory
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/MsprojectPackage.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/MsprojectPackage.java
deleted file mode 100644
index a387c4b..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/MsprojectPackage.java
+++ /dev/null
@@ -1,11546 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectPackage.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-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 -->
- * <!-- begin-model-doc -->
- * The full project schema definition from the project level down, 
- * 		starting with data type definitions.
- * <!-- end-model-doc -->
- * @see org.eclipse.epf.msproject.MsprojectFactory
- * @model kind="package"
- * @generated
- */
-public interface MsprojectPackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "msproject";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://epf.eclipse.org/msproject";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "msproject";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	MsprojectPackage eINSTANCE = org.eclipse.epf.msproject.impl.MsprojectPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.AssignmentImpl <em>Assignment</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.AssignmentImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getAssignment()
-	 * @generated
-	 */
-	int ASSIGNMENT = 0;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Task UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__TASK_UID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Resource UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__RESOURCE_UID = 2;
-
-	/**
-	 * The feature id for the '<em><b>Percent Work Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__PERCENT_WORK_COMPLETE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Actual Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_COST = 4;
-
-	/**
-	 * The feature id for the '<em><b>Actual Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_FINISH = 5;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_OVERTIME_COST = 6;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_OVERTIME_WORK = 7;
-
-	/**
-	 * The feature id for the '<em><b>Actual Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_START = 8;
-
-	/**
-	 * The feature id for the '<em><b>Actual Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_WORK = 9;
-
-	/**
-	 * The feature id for the '<em><b>ACWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACWP = 10;
-
-	/**
-	 * The feature id for the '<em><b>Confirmed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__CONFIRMED = 11;
-
-	/**
-	 * The feature id for the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__COST = 12;
-
-	/**
-	 * The feature id for the '<em><b>Cost Rate Table</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__COST_RATE_TABLE = 13;
-
-	/**
-	 * The feature id for the '<em><b>Cost Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__COST_VARIANCE = 14;
-
-	/**
-	 * The feature id for the '<em><b>CV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__CV = 15;
-
-	/**
-	 * The feature id for the '<em><b>Delay</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__DELAY = 16;
-
-	/**
-	 * The feature id for the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__FINISH = 17;
-
-	/**
-	 * The feature id for the '<em><b>Finish Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__FINISH_VARIANCE = 18;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__HYPERLINK = 19;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__HYPERLINK_ADDRESS = 20;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink Sub Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__HYPERLINK_SUB_ADDRESS = 21;
-
-	/**
-	 * The feature id for the '<em><b>Work Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__WORK_VARIANCE = 22;
-
-	/**
-	 * The feature id for the '<em><b>Has Fixed Rate Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__HAS_FIXED_RATE_UNITS = 23;
-
-	/**
-	 * The feature id for the '<em><b>Fixed Material</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__FIXED_MATERIAL = 24;
-
-	/**
-	 * The feature id for the '<em><b>Leveling Delay</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__LEVELING_DELAY = 25;
-
-	/**
-	 * The feature id for the '<em><b>Leveling Delay Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__LEVELING_DELAY_FORMAT = 26;
-
-	/**
-	 * The feature id for the '<em><b>Linked Fields</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__LINKED_FIELDS = 27;
-
-	/**
-	 * The feature id for the '<em><b>Milestone</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__MILESTONE = 28;
-
-	/**
-	 * The feature id for the '<em><b>Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__NOTES = 29;
-
-	/**
-	 * The feature id for the '<em><b>Overallocated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__OVERALLOCATED = 30;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__OVERTIME_COST = 31;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__OVERTIME_WORK = 32;
-
-	/**
-	 * The feature id for the '<em><b>Regular Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__REGULAR_WORK = 33;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__REMAINING_COST = 34;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__REMAINING_OVERTIME_COST = 35;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__REMAINING_OVERTIME_WORK = 36;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__REMAINING_WORK = 37;
-
-	/**
-	 * The feature id for the '<em><b>Response Pending</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__RESPONSE_PENDING = 38;
-
-	/**
-	 * The feature id for the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__START = 39;
-
-	/**
-	 * The feature id for the '<em><b>Stop</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__STOP = 40;
-
-	/**
-	 * The feature id for the '<em><b>Resume</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__RESUME = 41;
-
-	/**
-	 * The feature id for the '<em><b>Start Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__START_VARIANCE = 42;
-
-	/**
-	 * The feature id for the '<em><b>Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__UNITS = 43;
-
-	/**
-	 * The feature id for the '<em><b>Update Needed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__UPDATE_NEEDED = 44;
-
-	/**
-	 * The feature id for the '<em><b>VAC</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__VAC = 45;
-
-	/**
-	 * The feature id for the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__WORK = 46;
-
-	/**
-	 * The feature id for the '<em><b>Work Contour</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__WORK_CONTOUR = 47;
-
-	/**
-	 * The feature id for the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__BCWS = 48;
-
-	/**
-	 * The feature id for the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__BCWP = 49;
-
-	/**
-	 * The feature id for the '<em><b>Booking Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__BOOKING_TYPE = 50;
-
-	/**
-	 * The feature id for the '<em><b>Actual Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_WORK_PROTECTED = 51;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__ACTUAL_OVERTIME_WORK_PROTECTED = 52;
-
-	/**
-	 * The feature id for the '<em><b>Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__CREATION_DATE = 53;
-
-	/**
-	 * The feature id for the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__EXTENDED_ATTRIBUTE = 54;
-
-	/**
-	 * The feature id for the '<em><b>Baseline</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__BASELINE = 55;
-
-	/**
-	 * The feature id for the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT__TIMEPHASED_DATA = 56;
-
-	/**
-	 * The number of structural features of the the '<em>Assignment</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENT_FEATURE_COUNT = 57;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.AssignmentsImpl <em>Assignments</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.AssignmentsImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getAssignments()
-	 * @generated
-	 */
-	int ASSIGNMENTS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Assignment</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENTS__ASSIGNMENT = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Assignments</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ASSIGNMENTS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.AvailabilityPeriodImpl <em>Availability Period</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.AvailabilityPeriodImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getAvailabilityPeriod()
-	 * @generated
-	 */
-	int AVAILABILITY_PERIOD = 2;
-
-	/**
-	 * The feature id for the '<em><b>Available From</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int AVAILABILITY_PERIOD__AVAILABLE_FROM = 0;
-
-	/**
-	 * The feature id for the '<em><b>Available To</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int AVAILABILITY_PERIOD__AVAILABLE_TO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Available Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int AVAILABILITY_PERIOD__AVAILABLE_UNITS = 2;
-
-	/**
-	 * The number of structural features of the the '<em>Availability Period</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int AVAILABILITY_PERIOD_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.AvailabilityPeriodsImpl <em>Availability Periods</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.AvailabilityPeriodsImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getAvailabilityPeriods()
-	 * @generated
-	 */
-	int AVAILABILITY_PERIODS = 3;
-
-	/**
-	 * The feature id for the '<em><b>Availability Period</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int AVAILABILITY_PERIODS__AVAILABILITY_PERIOD = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Availability Periods</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int AVAILABILITY_PERIODS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.BaselineImpl <em>Baseline</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.BaselineImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getBaseline()
-	 * @generated
-	 */
-	int BASELINE = 4;
-
-	/**
-	 * The feature id for the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__TIMEPHASED_DATA = 0;
-
-	/**
-	 * The feature id for the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__NUMBER = 1;
-
-	/**
-	 * The feature id for the '<em><b>Interim</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__INTERIM = 2;
-
-	/**
-	 * The feature id for the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__START = 3;
-
-	/**
-	 * The feature id for the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__FINISH = 4;
-
-	/**
-	 * The feature id for the '<em><b>Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__DURATION = 5;
-
-	/**
-	 * The feature id for the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__DURATION_FORMAT = 6;
-
-	/**
-	 * The feature id for the '<em><b>Estimated Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__ESTIMATED_DURATION = 7;
-
-	/**
-	 * The feature id for the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__WORK = 8;
-
-	/**
-	 * The feature id for the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__COST = 9;
-
-	/**
-	 * The feature id for the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__BCWS = 10;
-
-	/**
-	 * The feature id for the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE__BCWP = 11;
-
-	/**
-	 * The number of structural features of the the '<em>Baseline</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE_FEATURE_COUNT = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.Baseline2Impl <em>Baseline2</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.Baseline2Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getBaseline2()
-	 * @generated
-	 */
-	int BASELINE2 = 5;
-
-	/**
-	 * The feature id for the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE2__NUMBER = 0;
-
-	/**
-	 * The feature id for the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE2__WORK = 1;
-
-	/**
-	 * The feature id for the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE2__COST = 2;
-
-	/**
-	 * The feature id for the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE2__BCWS = 3;
-
-	/**
-	 * The feature id for the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE2__BCWP = 4;
-
-	/**
-	 * The number of structural features of the the '<em>Baseline2</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE2_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.Baseline3Impl <em>Baseline3</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.Baseline3Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getBaseline3()
-	 * @generated
-	 */
-	int BASELINE3 = 6;
-
-	/**
-	 * The feature id for the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__TIMEPHASED_DATA = 0;
-
-	/**
-	 * The feature id for the '<em><b>Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__NUMBER = 1;
-
-	/**
-	 * The feature id for the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__START = 2;
-
-	/**
-	 * The feature id for the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__FINISH = 3;
-
-	/**
-	 * The feature id for the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__WORK = 4;
-
-	/**
-	 * The feature id for the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__COST = 5;
-
-	/**
-	 * The feature id for the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__BCWS = 6;
-
-	/**
-	 * The feature id for the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3__BCWP = 7;
-
-	/**
-	 * The number of structural features of the the '<em>Baseline3</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BASELINE3_FEATURE_COUNT = 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.CalendarImpl <em>Calendar</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.CalendarImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCalendar()
-	 * @generated
-	 */
-	int CALENDAR = 7;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDAR__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDAR__NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>Is Base Calendar</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDAR__IS_BASE_CALENDAR = 2;
-
-	/**
-	 * The feature id for the '<em><b>Base Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDAR__BASE_CALENDAR_UID = 3;
-
-	/**
-	 * The feature id for the '<em><b>Week Days</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDAR__WEEK_DAYS = 4;
-
-	/**
-	 * The number of structural features of the the '<em>Calendar</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDAR_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.CalendarsImpl <em>Calendars</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.CalendarsImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCalendars()
-	 * @generated
-	 */
-	int CALENDARS = 8;
-
-	/**
-	 * The feature id for the '<em><b>Calendar</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDARS__CALENDAR = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Calendars</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CALENDARS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.DocumentRootImpl <em>Document Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.DocumentRootImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDocumentRoot()
-	 * @generated
-	 */
-	int DOCUMENT_ROOT = 9;
-
-	/**
-	 * The feature id for the '<em><b>Mixed</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MIXED = 0;
-
-	/**
-	 * The feature id for the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XMLNS_PREFIX_MAP = 1;
-
-	/**
-	 * The feature id for the '<em><b>XSI Schema Location</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Project</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROJECT = 3;
-
-	/**
-	 * The number of structural features of the the '<em>Document Root</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl <em>Extended Attribute</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ExtendedAttributeImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getExtendedAttribute()
-	 * @generated
-	 */
-	int EXTENDED_ATTRIBUTE = 10;
-
-	/**
-	 * The feature id for the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__FIELD_ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Field Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__FIELD_NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__ALIAS = 2;
-
-	/**
-	 * The feature id for the '<em><b>Phonetic Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__PHONETIC_ALIAS = 3;
-
-	/**
-	 * The feature id for the '<em><b>Rollup Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__ROLLUP_TYPE = 4;
-
-	/**
-	 * The feature id for the '<em><b>Calculation Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__CALCULATION_TYPE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Formula</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__FORMULA = 6;
-
-	/**
-	 * The feature id for the '<em><b>Restrict Values</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__RESTRICT_VALUES = 7;
-
-	/**
-	 * The feature id for the '<em><b>Valuelist Sort Order</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__VALUELIST_SORT_ORDER = 8;
-
-	/**
-	 * The feature id for the '<em><b>Append New Values</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__APPEND_NEW_VALUES = 9;
-
-	/**
-	 * The feature id for the '<em><b>Default</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__DEFAULT = 10;
-
-	/**
-	 * The feature id for the '<em><b>Value List</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE__VALUE_LIST = 11;
-
-	/**
-	 * The number of structural features of the the '<em>Extended Attribute</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE_FEATURE_COUNT = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ExtendedAttribute2Impl <em>Extended Attribute2</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ExtendedAttribute2Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getExtendedAttribute2()
-	 * @generated
-	 */
-	int EXTENDED_ATTRIBUTE2 = 11;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE2__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE2__FIELD_ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE2__VALUE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE2__VALUE_ID = 3;
-
-	/**
-	 * The feature id for the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE2__DURATION_FORMAT = 4;
-
-	/**
-	 * The number of structural features of the the '<em>Extended Attribute2</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE2_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ExtendedAttribute3Impl <em>Extended Attribute3</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ExtendedAttribute3Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getExtendedAttribute3()
-	 * @generated
-	 */
-	int EXTENDED_ATTRIBUTE3 = 12;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE3__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE3__FIELD_ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE3__VALUE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE3__VALUE_ID = 3;
-
-	/**
-	 * The feature id for the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE3__DURATION_FORMAT = 4;
-
-	/**
-	 * The number of structural features of the the '<em>Extended Attribute3</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE3_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ExtendedAttribute4Impl <em>Extended Attribute4</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ExtendedAttribute4Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getExtendedAttribute4()
-	 * @generated
-	 */
-	int EXTENDED_ATTRIBUTE4 = 13;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE4__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE4__FIELD_ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE4__VALUE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE4__VALUE_ID = 3;
-
-	/**
-	 * The feature id for the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE4__DURATION_FORMAT = 4;
-
-	/**
-	 * The number of structural features of the the '<em>Extended Attribute4</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTE4_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ExtendedAttributesImpl <em>Extended Attributes</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ExtendedAttributesImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getExtendedAttributes()
-	 * @generated
-	 */
-	int EXTENDED_ATTRIBUTES = 14;
-
-	/**
-	 * The feature id for the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTES__EXTENDED_ATTRIBUTE = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Extended Attributes</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTENDED_ATTRIBUTES_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.MaskImpl <em>Mask</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.MaskImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getMask()
-	 * @generated
-	 */
-	int MASK = 15;
-
-	/**
-	 * The feature id for the '<em><b>Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MASK__LEVEL = 0;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MASK__TYPE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Length</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MASK__LENGTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>Separator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MASK__SEPARATOR = 3;
-
-	/**
-	 * The number of structural features of the the '<em>Mask</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MASK_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.MasksImpl <em>Masks</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.MasksImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getMasks()
-	 * @generated
-	 */
-	int MASKS = 16;
-
-	/**
-	 * The feature id for the '<em><b>Mask</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MASKS__MASK = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Masks</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MASKS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl <em>Outline Code</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.OutlineCodeImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getOutlineCode()
-	 * @generated
-	 */
-	int OUTLINE_CODE = 17;
-
-	/**
-	 * The feature id for the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__FIELD_ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Field Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__FIELD_NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__ALIAS = 2;
-
-	/**
-	 * The feature id for the '<em><b>Phonetic Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__PHONETIC_ALIAS = 3;
-
-	/**
-	 * The feature id for the '<em><b>Values</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__VALUES = 4;
-
-	/**
-	 * The feature id for the '<em><b>Enterprise</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__ENTERPRISE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Enterprise Outline Code Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__ENTERPRISE_OUTLINE_CODE_ALIAS = 6;
-
-	/**
-	 * The feature id for the '<em><b>Resource Substitution Enabled</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__RESOURCE_SUBSTITUTION_ENABLED = 7;
-
-	/**
-	 * The feature id for the '<em><b>Leaf Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__LEAF_ONLY = 8;
-
-	/**
-	 * The feature id for the '<em><b>All Levels Required</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__ALL_LEVELS_REQUIRED = 9;
-
-	/**
-	 * The feature id for the '<em><b>Only Table Values Allowed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__ONLY_TABLE_VALUES_ALLOWED = 10;
-
-	/**
-	 * The feature id for the '<em><b>Masks</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE__MASKS = 11;
-
-	/**
-	 * The number of structural features of the the '<em>Outline Code</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE_FEATURE_COUNT = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.OutlineCode2Impl <em>Outline Code2</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.OutlineCode2Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getOutlineCode2()
-	 * @generated
-	 */
-	int OUTLINE_CODE2 = 18;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE2__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE2__FIELD_ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE2__VALUE_ID = 2;
-
-	/**
-	 * The number of structural features of the the '<em>Outline Code2</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE2_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.OutlineCode3Impl <em>Outline Code3</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.OutlineCode3Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getOutlineCode3()
-	 * @generated
-	 */
-	int OUTLINE_CODE3 = 19;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE3__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE3__FIELD_ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE3__VALUE_ID = 2;
-
-	/**
-	 * The number of structural features of the the '<em>Outline Code3</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODE3_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.OutlineCodesImpl <em>Outline Codes</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.OutlineCodesImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getOutlineCodes()
-	 * @generated
-	 */
-	int OUTLINE_CODES = 20;
-
-	/**
-	 * The feature id for the '<em><b>Outline Code</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODES__OUTLINE_CODE = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Outline Codes</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTLINE_CODES_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl <em>Predecessor Link</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.PredecessorLinkImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getPredecessorLink()
-	 * @generated
-	 */
-	int PREDECESSOR_LINK = 21;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PREDECESSOR_LINK__PREDECESSOR_UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PREDECESSOR_LINK__TYPE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Cross Project</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PREDECESSOR_LINK__CROSS_PROJECT = 2;
-
-	/**
-	 * The feature id for the '<em><b>Cross Project Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PREDECESSOR_LINK__CROSS_PROJECT_NAME = 3;
-
-	/**
-	 * The feature id for the '<em><b>Link Lag</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PREDECESSOR_LINK__LINK_LAG = 4;
-
-	/**
-	 * The feature id for the '<em><b>Lag Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PREDECESSOR_LINK__LAG_FORMAT = 5;
-
-	/**
-	 * The number of structural features of the the '<em>Predecessor Link</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PREDECESSOR_LINK_FEATURE_COUNT = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ProjectImpl <em>Project</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ProjectImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getProject()
-	 * @generated
-	 */
-	int PROJECT = 22;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>Title</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__TITLE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Subject</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__SUBJECT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Category</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CATEGORY = 4;
-
-	/**
-	 * The feature id for the '<em><b>Company</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__COMPANY = 5;
-
-	/**
-	 * The feature id for the '<em><b>Manager</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MANAGER = 6;
-
-	/**
-	 * The feature id for the '<em><b>Author</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__AUTHOR = 7;
-
-	/**
-	 * The feature id for the '<em><b>Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CREATION_DATE = 8;
-
-	/**
-	 * The feature id for the '<em><b>Revision</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__REVISION = 9;
-
-	/**
-	 * The feature id for the '<em><b>Last Saved</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__LAST_SAVED = 10;
-
-	/**
-	 * The feature id for the '<em><b>Schedule From Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__SCHEDULE_FROM_START = 11;
-
-	/**
-	 * The feature id for the '<em><b>Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__START_DATE = 12;
-
-	/**
-	 * The feature id for the '<em><b>Finish Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__FINISH_DATE = 13;
-
-	/**
-	 * The feature id for the '<em><b>FY Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__FYSTART_DATE = 14;
-
-	/**
-	 * The feature id for the '<em><b>Critical Slack Limit</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CRITICAL_SLACK_LIMIT = 15;
-
-	/**
-	 * The feature id for the '<em><b>Currency Digits</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CURRENCY_DIGITS = 16;
-
-	/**
-	 * The feature id for the '<em><b>Currency Symbol</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CURRENCY_SYMBOL = 17;
-
-	/**
-	 * The feature id for the '<em><b>Currency Symbol Position</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CURRENCY_SYMBOL_POSITION = 18;
-
-	/**
-	 * The feature id for the '<em><b>Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CALENDAR_UID = 19;
-
-	/**
-	 * The feature id for the '<em><b>Default Start Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DEFAULT_START_TIME = 20;
-
-	/**
-	 * The feature id for the '<em><b>Default Finish Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DEFAULT_FINISH_TIME = 21;
-
-	/**
-	 * The feature id for the '<em><b>Minutes Per Day</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MINUTES_PER_DAY = 22;
-
-	/**
-	 * The feature id for the '<em><b>Minutes Per Week</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MINUTES_PER_WEEK = 23;
-
-	/**
-	 * The feature id for the '<em><b>Days Per Month</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DAYS_PER_MONTH = 24;
-
-	/**
-	 * The feature id for the '<em><b>Default Task Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DEFAULT_TASK_TYPE = 25;
-
-	/**
-	 * The feature id for the '<em><b>Default Fixed Cost Accrual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DEFAULT_FIXED_COST_ACCRUAL = 26;
-
-	/**
-	 * The feature id for the '<em><b>Default Standard Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DEFAULT_STANDARD_RATE = 27;
-
-	/**
-	 * The feature id for the '<em><b>Default Overtime Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DEFAULT_OVERTIME_RATE = 28;
-
-	/**
-	 * The feature id for the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DURATION_FORMAT = 29;
-
-	/**
-	 * The feature id for the '<em><b>Work Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__WORK_FORMAT = 30;
-
-	/**
-	 * The feature id for the '<em><b>Editable Actual Costs</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__EDITABLE_ACTUAL_COSTS = 31;
-
-	/**
-	 * The feature id for the '<em><b>Honor Constraints</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__HONOR_CONSTRAINTS = 32;
-
-	/**
-	 * The feature id for the '<em><b>Earned Value Method</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__EARNED_VALUE_METHOD = 33;
-
-	/**
-	 * The feature id for the '<em><b>Inserted Projects Like Summary</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__INSERTED_PROJECTS_LIKE_SUMMARY = 34;
-
-	/**
-	 * The feature id for the '<em><b>Multiple Critical Paths</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MULTIPLE_CRITICAL_PATHS = 35;
-
-	/**
-	 * The feature id for the '<em><b>New Tasks Effort Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__NEW_TASKS_EFFORT_DRIVEN = 36;
-
-	/**
-	 * The feature id for the '<em><b>New Tasks Estimated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__NEW_TASKS_ESTIMATED = 37;
-
-	/**
-	 * The feature id for the '<em><b>Splits In Progress Tasks</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__SPLITS_IN_PROGRESS_TASKS = 38;
-
-	/**
-	 * The feature id for the '<em><b>Spread Actual Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__SPREAD_ACTUAL_COST = 39;
-
-	/**
-	 * The feature id for the '<em><b>Spread Percent Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__SPREAD_PERCENT_COMPLETE = 40;
-
-	/**
-	 * The feature id for the '<em><b>Task Updates Resource</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__TASK_UPDATES_RESOURCE = 41;
-
-	/**
-	 * The feature id for the '<em><b>Fiscal Year Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__FISCAL_YEAR_START = 42;
-
-	/**
-	 * The feature id for the '<em><b>Week Start Day</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__WEEK_START_DAY = 43;
-
-	/**
-	 * The feature id for the '<em><b>Move Completed Ends Back</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MOVE_COMPLETED_ENDS_BACK = 44;
-
-	/**
-	 * The feature id for the '<em><b>Move Remaining Starts Back</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MOVE_REMAINING_STARTS_BACK = 45;
-
-	/**
-	 * The feature id for the '<em><b>Move Remaining Starts Forward</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MOVE_REMAINING_STARTS_FORWARD = 46;
-
-	/**
-	 * The feature id for the '<em><b>Move Completed Ends Forward</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MOVE_COMPLETED_ENDS_FORWARD = 47;
-
-	/**
-	 * The feature id for the '<em><b>Baseline For Earned Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__BASELINE_FOR_EARNED_VALUE = 48;
-
-	/**
-	 * The feature id for the '<em><b>Auto Add New Resources And Tasks</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__AUTO_ADD_NEW_RESOURCES_AND_TASKS = 49;
-
-	/**
-	 * The feature id for the '<em><b>Status Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__STATUS_DATE = 50;
-
-	/**
-	 * The feature id for the '<em><b>Current Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CURRENT_DATE = 51;
-
-	/**
-	 * The feature id for the '<em><b>Microsoft Project Server URL</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__MICROSOFT_PROJECT_SERVER_URL = 52;
-
-	/**
-	 * The feature id for the '<em><b>Autolink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__AUTOLINK = 53;
-
-	/**
-	 * The feature id for the '<em><b>New Task Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__NEW_TASK_START_DATE = 54;
-
-	/**
-	 * The feature id for the '<em><b>Default Task EV Method</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__DEFAULT_TASK_EV_METHOD = 55;
-
-	/**
-	 * The feature id for the '<em><b>Project Externally Edited</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__PROJECT_EXTERNALLY_EDITED = 56;
-
-	/**
-	 * The feature id for the '<em><b>Extended Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__EXTENDED_CREATION_DATE = 57;
-
-	/**
-	 * The feature id for the '<em><b>Actuals In Sync</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__ACTUALS_IN_SYNC = 58;
-
-	/**
-	 * The feature id for the '<em><b>Remove File Properties</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__REMOVE_FILE_PROPERTIES = 59;
-
-	/**
-	 * The feature id for the '<em><b>Admin Project</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__ADMIN_PROJECT = 60;
-
-	/**
-	 * The feature id for the '<em><b>Outline Codes</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__OUTLINE_CODES = 61;
-
-	/**
-	 * The feature id for the '<em><b>WBS Masks</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__WBS_MASKS = 62;
-
-	/**
-	 * The feature id for the '<em><b>Extended Attributes</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__EXTENDED_ATTRIBUTES = 63;
-
-	/**
-	 * The feature id for the '<em><b>Calendars</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__CALENDARS = 64;
-
-	/**
-	 * The feature id for the '<em><b>Tasks</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__TASKS = 65;
-
-	/**
-	 * The feature id for the '<em><b>Resources</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__RESOURCES = 66;
-
-	/**
-	 * The feature id for the '<em><b>Assignments</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT__ASSIGNMENTS = 67;
-
-	/**
-	 * The number of structural features of the the '<em>Project</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROJECT_FEATURE_COUNT = 68;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.RateImpl <em>Rate</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.RateImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getRate()
-	 * @generated
-	 */
-	int RATE = 23;
-
-	/**
-	 * The feature id for the '<em><b>Rates From</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__RATES_FROM = 0;
-
-	/**
-	 * The feature id for the '<em><b>Rates To</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__RATES_TO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Rate Table</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__RATE_TABLE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Standard Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__STANDARD_RATE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Standard Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__STANDARD_RATE_FORMAT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__OVERTIME_RATE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__OVERTIME_RATE_FORMAT = 6;
-
-	/**
-	 * The feature id for the '<em><b>Cost Per Use</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE__COST_PER_USE = 7;
-
-	/**
-	 * The number of structural features of the the '<em>Rate</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATE_FEATURE_COUNT = 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.RatesImpl <em>Rates</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.RatesImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getRates()
-	 * @generated
-	 */
-	int RATES = 24;
-
-	/**
-	 * The feature id for the '<em><b>Rate</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATES__RATE = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Rates</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RATES_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ResourceImpl <em>Resource</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ResourceImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getResource()
-	 * @generated
-	 */
-	int RESOURCE = 25;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__NAME = 2;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__TYPE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Is Null</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__IS_NULL = 4;
-
-	/**
-	 * The feature id for the '<em><b>Initials</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__INITIALS = 5;
-
-	/**
-	 * The feature id for the '<em><b>Phonetics</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__PHONETICS = 6;
-
-	/**
-	 * The feature id for the '<em><b>NT Account</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__NTACCOUNT = 7;
-
-	/**
-	 * The feature id for the '<em><b>Material Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__MATERIAL_LABEL = 8;
-
-	/**
-	 * The feature id for the '<em><b>Code</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__CODE = 9;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__GROUP = 10;
-
-	/**
-	 * The feature id for the '<em><b>Work Group</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__WORK_GROUP = 11;
-
-	/**
-	 * The feature id for the '<em><b>Email Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__EMAIL_ADDRESS = 12;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__HYPERLINK = 13;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__HYPERLINK_ADDRESS = 14;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink Sub Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__HYPERLINK_SUB_ADDRESS = 15;
-
-	/**
-	 * The feature id for the '<em><b>Max Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__MAX_UNITS = 16;
-
-	/**
-	 * The feature id for the '<em><b>Peak Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__PEAK_UNITS = 17;
-
-	/**
-	 * The feature id for the '<em><b>Over Allocated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__OVER_ALLOCATED = 18;
-
-	/**
-	 * The feature id for the '<em><b>Available From</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__AVAILABLE_FROM = 19;
-
-	/**
-	 * The feature id for the '<em><b>Available To</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__AVAILABLE_TO = 20;
-
-	/**
-	 * The feature id for the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__START = 21;
-
-	/**
-	 * The feature id for the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__FINISH = 22;
-
-	/**
-	 * The feature id for the '<em><b>Can Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__CAN_LEVEL = 23;
-
-	/**
-	 * The feature id for the '<em><b>Accrue At</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACCRUE_AT = 24;
-
-	/**
-	 * The feature id for the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__WORK = 25;
-
-	/**
-	 * The feature id for the '<em><b>Regular Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__REGULAR_WORK = 26;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__OVERTIME_WORK = 27;
-
-	/**
-	 * The feature id for the '<em><b>Actual Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACTUAL_WORK = 28;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__REMAINING_WORK = 29;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACTUAL_OVERTIME_WORK = 30;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__REMAINING_OVERTIME_WORK = 31;
-
-	/**
-	 * The feature id for the '<em><b>Percent Work Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__PERCENT_WORK_COMPLETE = 32;
-
-	/**
-	 * The feature id for the '<em><b>Standard Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__STANDARD_RATE = 33;
-
-	/**
-	 * The feature id for the '<em><b>Standard Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__STANDARD_RATE_FORMAT = 34;
-
-	/**
-	 * The feature id for the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__COST = 35;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__OVERTIME_RATE = 36;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__OVERTIME_RATE_FORMAT = 37;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__OVERTIME_COST = 38;
-
-	/**
-	 * The feature id for the '<em><b>Cost Per Use</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__COST_PER_USE = 39;
-
-	/**
-	 * The feature id for the '<em><b>Actual Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACTUAL_COST = 40;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACTUAL_OVERTIME_COST = 41;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__REMAINING_COST = 42;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__REMAINING_OVERTIME_COST = 43;
-
-	/**
-	 * The feature id for the '<em><b>Work Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__WORK_VARIANCE = 44;
-
-	/**
-	 * The feature id for the '<em><b>Cost Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__COST_VARIANCE = 45;
-
-	/**
-	 * The feature id for the '<em><b>SV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__SV = 46;
-
-	/**
-	 * The feature id for the '<em><b>CV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__CV = 47;
-
-	/**
-	 * The feature id for the '<em><b>ACWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACWP = 48;
-
-	/**
-	 * The feature id for the '<em><b>Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__CALENDAR_UID = 49;
-
-	/**
-	 * The feature id for the '<em><b>Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__NOTES = 50;
-
-	/**
-	 * The feature id for the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__BCWS = 51;
-
-	/**
-	 * The feature id for the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__BCWP = 52;
-
-	/**
-	 * The feature id for the '<em><b>Is Generic</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__IS_GENERIC = 53;
-
-	/**
-	 * The feature id for the '<em><b>Is Inactive</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__IS_INACTIVE = 54;
-
-	/**
-	 * The feature id for the '<em><b>Is Enterprise</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__IS_ENTERPRISE = 55;
-
-	/**
-	 * The feature id for the '<em><b>Booking Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__BOOKING_TYPE = 56;
-
-	/**
-	 * The feature id for the '<em><b>Actual Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACTUAL_WORK_PROTECTED = 57;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACTUAL_OVERTIME_WORK_PROTECTED = 58;
-
-	/**
-	 * The feature id for the '<em><b>Active Directory GUID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__ACTIVE_DIRECTORY_GUID = 59;
-
-	/**
-	 * The feature id for the '<em><b>Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__CREATION_DATE = 60;
-
-	/**
-	 * The feature id for the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__EXTENDED_ATTRIBUTE = 61;
-
-	/**
-	 * The feature id for the '<em><b>Baseline</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__BASELINE = 62;
-
-	/**
-	 * The feature id for the '<em><b>Outline Code</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__OUTLINE_CODE = 63;
-
-	/**
-	 * The feature id for the '<em><b>Availability Periods</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__AVAILABILITY_PERIODS = 64;
-
-	/**
-	 * The feature id for the '<em><b>Rates</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__RATES = 65;
-
-	/**
-	 * The feature id for the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__TIMEPHASED_DATA = 66;
-
-	/**
-	 * The number of structural features of the the '<em>Resource</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_FEATURE_COUNT = 67;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ResourcesImpl <em>Resources</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ResourcesImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getResources()
-	 * @generated
-	 */
-	int RESOURCES = 26;
-
-	/**
-	 * The feature id for the '<em><b>Resource</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCES__RESOURCE = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Resources</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCES_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.TaskImpl <em>Task</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.TaskImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTask()
-	 * @generated
-	 */
-	int TASK = 27;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__UID = 0;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__NAME = 2;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__TYPE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Is Null</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__IS_NULL = 4;
-
-	/**
-	 * The feature id for the '<em><b>Create Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CREATE_DATE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Contact</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CONTACT = 6;
-
-	/**
-	 * The feature id for the '<em><b>WBS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__WBS = 7;
-
-	/**
-	 * The feature id for the '<em><b>WBS Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__WBS_LEVEL = 8;
-
-	/**
-	 * The feature id for the '<em><b>Outline Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OUTLINE_NUMBER = 9;
-
-	/**
-	 * The feature id for the '<em><b>Outline Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OUTLINE_LEVEL = 10;
-
-	/**
-	 * The feature id for the '<em><b>Priority</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRIORITY = 11;
-
-	/**
-	 * The feature id for the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__START = 12;
-
-	/**
-	 * The feature id for the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__FINISH = 13;
-
-	/**
-	 * The feature id for the '<em><b>Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__DURATION = 14;
-
-	/**
-	 * The feature id for the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__DURATION_FORMAT = 15;
-
-	/**
-	 * The feature id for the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__WORK = 16;
-
-	/**
-	 * The feature id for the '<em><b>Stop</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__STOP = 17;
-
-	/**
-	 * The feature id for the '<em><b>Resume</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__RESUME = 18;
-
-	/**
-	 * The feature id for the '<em><b>Resume Valid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__RESUME_VALID = 19;
-
-	/**
-	 * The feature id for the '<em><b>Effort Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EFFORT_DRIVEN = 20;
-
-	/**
-	 * The feature id for the '<em><b>Recurring</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__RECURRING = 21;
-
-	/**
-	 * The feature id for the '<em><b>Over Allocated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OVER_ALLOCATED = 22;
-
-	/**
-	 * The feature id for the '<em><b>Estimated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ESTIMATED = 23;
-
-	/**
-	 * The feature id for the '<em><b>Milestone</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__MILESTONE = 24;
-
-	/**
-	 * The feature id for the '<em><b>Summary</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SUMMARY = 25;
-
-	/**
-	 * The feature id for the '<em><b>Critical</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CRITICAL = 26;
-
-	/**
-	 * The feature id for the '<em><b>Is Subproject</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__IS_SUBPROJECT = 27;
-
-	/**
-	 * The feature id for the '<em><b>Is Subproject Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__IS_SUBPROJECT_READ_ONLY = 28;
-
-	/**
-	 * The feature id for the '<em><b>Subproject Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SUBPROJECT_NAME = 29;
-
-	/**
-	 * The feature id for the '<em><b>External Task</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EXTERNAL_TASK = 30;
-
-	/**
-	 * The feature id for the '<em><b>External Task Project</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EXTERNAL_TASK_PROJECT = 31;
-
-	/**
-	 * The feature id for the '<em><b>Early Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EARLY_START = 32;
-
-	/**
-	 * The feature id for the '<em><b>Early Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EARLY_FINISH = 33;
-
-	/**
-	 * The feature id for the '<em><b>Late Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__LATE_START = 34;
-
-	/**
-	 * The feature id for the '<em><b>Late Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__LATE_FINISH = 35;
-
-	/**
-	 * The feature id for the '<em><b>Start Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__START_VARIANCE = 36;
-
-	/**
-	 * The feature id for the '<em><b>Finish Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__FINISH_VARIANCE = 37;
-
-	/**
-	 * The feature id for the '<em><b>Work Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__WORK_VARIANCE = 38;
-
-	/**
-	 * The feature id for the '<em><b>Free Slack</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__FREE_SLACK = 39;
-
-	/**
-	 * The feature id for the '<em><b>Total Slack</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__TOTAL_SLACK = 40;
-
-	/**
-	 * The feature id for the '<em><b>Fixed Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__FIXED_COST = 41;
-
-	/**
-	 * The feature id for the '<em><b>Fixed Cost Accrual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__FIXED_COST_ACCRUAL = 42;
-
-	/**
-	 * The feature id for the '<em><b>Percent Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PERCENT_COMPLETE = 43;
-
-	/**
-	 * The feature id for the '<em><b>Percent Work Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PERCENT_WORK_COMPLETE = 44;
-
-	/**
-	 * The feature id for the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__COST = 45;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OVERTIME_COST = 46;
-
-	/**
-	 * The feature id for the '<em><b>Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OVERTIME_WORK = 47;
-
-	/**
-	 * The feature id for the '<em><b>Actual Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_START = 48;
-
-	/**
-	 * The feature id for the '<em><b>Actual Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_FINISH = 49;
-
-	/**
-	 * The feature id for the '<em><b>Actual Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_DURATION = 50;
-
-	/**
-	 * The feature id for the '<em><b>Actual Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_COST = 51;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_OVERTIME_COST = 52;
-
-	/**
-	 * The feature id for the '<em><b>Actual Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_WORK = 53;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_OVERTIME_WORK = 54;
-
-	/**
-	 * The feature id for the '<em><b>Regular Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__REGULAR_WORK = 55;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__REMAINING_DURATION = 56;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__REMAINING_COST = 57;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__REMAINING_WORK = 58;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__REMAINING_OVERTIME_COST = 59;
-
-	/**
-	 * The feature id for the '<em><b>Remaining Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__REMAINING_OVERTIME_WORK = 60;
-
-	/**
-	 * The feature id for the '<em><b>ACWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACWP = 61;
-
-	/**
-	 * The feature id for the '<em><b>CV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CV = 62;
-
-	/**
-	 * The feature id for the '<em><b>Constraint Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CONSTRAINT_TYPE = 63;
-
-	/**
-	 * The feature id for the '<em><b>Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CALENDAR_UID = 64;
-
-	/**
-	 * The feature id for the '<em><b>Constraint Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CONSTRAINT_DATE = 65;
-
-	/**
-	 * The feature id for the '<em><b>Deadline</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__DEADLINE = 66;
-
-	/**
-	 * The feature id for the '<em><b>Level Assignments</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__LEVEL_ASSIGNMENTS = 67;
-
-	/**
-	 * The feature id for the '<em><b>Leveling Can Split</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__LEVELING_CAN_SPLIT = 68;
-
-	/**
-	 * The feature id for the '<em><b>Leveling Delay</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__LEVELING_DELAY = 69;
-
-	/**
-	 * The feature id for the '<em><b>Leveling Delay Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__LEVELING_DELAY_FORMAT = 70;
-
-	/**
-	 * The feature id for the '<em><b>Pre Leveled Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRE_LEVELED_START = 71;
-
-	/**
-	 * The feature id for the '<em><b>Pre Leveled Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRE_LEVELED_FINISH = 72;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__HYPERLINK = 73;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__HYPERLINK_ADDRESS = 74;
-
-	/**
-	 * The feature id for the '<em><b>Hyperlink Sub Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__HYPERLINK_SUB_ADDRESS = 75;
-
-	/**
-	 * The feature id for the '<em><b>Ignore Resource Calendar</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__IGNORE_RESOURCE_CALENDAR = 76;
-
-	/**
-	 * The feature id for the '<em><b>Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__NOTES = 77;
-
-	/**
-	 * The feature id for the '<em><b>Hide Bar</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__HIDE_BAR = 78;
-
-	/**
-	 * The feature id for the '<em><b>Rollup</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ROLLUP = 79;
-
-	/**
-	 * The feature id for the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__BCWS = 80;
-
-	/**
-	 * The feature id for the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__BCWP = 81;
-
-	/**
-	 * The feature id for the '<em><b>Physical Percent Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PHYSICAL_PERCENT_COMPLETE = 82;
-
-	/**
-	 * The feature id for the '<em><b>Earned Value Method</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EARNED_VALUE_METHOD = 83;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor Link</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PREDECESSOR_LINK = 84;
-
-	/**
-	 * The feature id for the '<em><b>Actual Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_WORK_PROTECTED = 85;
-
-	/**
-	 * The feature id for the '<em><b>Actual Overtime Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ACTUAL_OVERTIME_WORK_PROTECTED = 86;
-
-	/**
-	 * The feature id for the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EXTENDED_ATTRIBUTE = 87;
-
-	/**
-	 * The feature id for the '<em><b>Baseline</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__BASELINE = 88;
-
-	/**
-	 * The feature id for the '<em><b>Outline Code</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OUTLINE_CODE = 89;
-
-	/**
-	 * The feature id for the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__TIMEPHASED_DATA = 90;
-
-	/**
-	 * The number of structural features of the the '<em>Task</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_FEATURE_COUNT = 91;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.TasksImpl <em>Tasks</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.TasksImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTasks()
-	 * @generated
-	 */
-	int TASKS = 28;
-
-	/**
-	 * The feature id for the '<em><b>Task</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASKS__TASK = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Tasks</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASKS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.TimePeriodImpl <em>Time Period</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.TimePeriodImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTimePeriod()
-	 * @generated
-	 */
-	int TIME_PERIOD = 29;
-
-	/**
-	 * The feature id for the '<em><b>From Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIME_PERIOD__FROM_DATE = 0;
-
-	/**
-	 * The feature id for the '<em><b>To Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIME_PERIOD__TO_DATE = 1;
-
-	/**
-	 * The number of structural features of the the '<em>Time Period</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIME_PERIOD_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl <em>Timephased Data Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTimephasedDataType()
-	 * @generated
-	 */
-	int TIMEPHASED_DATA_TYPE = 30;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIMEPHASED_DATA_TYPE__TYPE = 0;
-
-	/**
-	 * The feature id for the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIMEPHASED_DATA_TYPE__UID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIMEPHASED_DATA_TYPE__START = 2;
-
-	/**
-	 * The feature id for the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIMEPHASED_DATA_TYPE__FINISH = 3;
-
-	/**
-	 * The feature id for the '<em><b>Unit</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIMEPHASED_DATA_TYPE__UNIT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIMEPHASED_DATA_TYPE__VALUE = 5;
-
-	/**
-	 * The number of structural features of the the '<em>Timephased Data Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TIMEPHASED_DATA_TYPE_FEATURE_COUNT = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ValueImpl <em>Value</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ValueImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getValue()
-	 * @generated
-	 */
-	int VALUE = 31;
-
-	/**
-	 * The feature id for the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE__VALUE_ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Parent Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE__PARENT_VALUE_ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE__VALUE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE__DESCRIPTION = 3;
-
-	/**
-	 * The number of structural features of the the '<em>Value</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.Value2Impl <em>Value2</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.Value2Impl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getValue2()
-	 * @generated
-	 */
-	int VALUE2 = 32;
-
-	/**
-	 * The feature id for the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE2__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE2__VALUE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE2__DESCRIPTION = 2;
-
-	/**
-	 * The number of structural features of the the '<em>Value2</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE2_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ValueListImpl <em>Value List</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ValueListImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getValueList()
-	 * @generated
-	 */
-	int VALUE_LIST = 33;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_LIST__VALUE = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Value List</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_LIST_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.ValuesImpl <em>Values</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.ValuesImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getValues()
-	 * @generated
-	 */
-	int VALUES = 34;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUES__GROUP = 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUES__VALUE = 1;
-
-	/**
-	 * The number of structural features of the the '<em>Values</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUES_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.WBSMaskImpl <em>WBS Mask</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.WBSMaskImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWBSMask()
-	 * @generated
-	 */
-	int WBS_MASK = 35;
-
-	/**
-	 * The feature id for the '<em><b>Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASK__LEVEL = 0;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASK__TYPE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Length</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASK__LENGTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>Separator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASK__SEPARATOR = 3;
-
-	/**
-	 * The number of structural features of the the '<em>WBS Mask</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASK_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.WBSMasksImpl <em>WBS Masks</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.WBSMasksImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWBSMasks()
-	 * @generated
-	 */
-	int WBS_MASKS = 36;
-
-	/**
-	 * The feature id for the '<em><b>Verify Unique Codes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASKS__VERIFY_UNIQUE_CODES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Generate Codes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASKS__GENERATE_CODES = 1;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASKS__PREFIX = 2;
-
-	/**
-	 * The feature id for the '<em><b>WBS Mask</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASKS__WBS_MASK = 3;
-
-	/**
-	 * The number of structural features of the the '<em>WBS Masks</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WBS_MASKS_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.WeekDayImpl <em>Week Day</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.WeekDayImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWeekDay()
-	 * @generated
-	 */
-	int WEEK_DAY = 37;
-
-	/**
-	 * The feature id for the '<em><b>Day Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WEEK_DAY__DAY_TYPE = 0;
-
-	/**
-	 * The feature id for the '<em><b>Day Working</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WEEK_DAY__DAY_WORKING = 1;
-
-	/**
-	 * The feature id for the '<em><b>Time Period</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WEEK_DAY__TIME_PERIOD = 2;
-
-	/**
-	 * The feature id for the '<em><b>Working Times</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WEEK_DAY__WORKING_TIMES = 3;
-
-	/**
-	 * The number of structural features of the the '<em>Week Day</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WEEK_DAY_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.WeekDaysImpl <em>Week Days</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.WeekDaysImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWeekDays()
-	 * @generated
-	 */
-	int WEEK_DAYS = 38;
-
-	/**
-	 * The feature id for the '<em><b>Week Day</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WEEK_DAYS__WEEK_DAY = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Week Days</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WEEK_DAYS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.WorkingTimeImpl <em>Working Time</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.WorkingTimeImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWorkingTime()
-	 * @generated
-	 */
-	int WORKING_TIME = 39;
-
-	/**
-	 * The feature id for the '<em><b>From Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKING_TIME__FROM_TIME = 0;
-
-	/**
-	 * The feature id for the '<em><b>To Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKING_TIME__TO_TIME = 1;
-
-	/**
-	 * The number of structural features of the the '<em>Working Time</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKING_TIME_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.msproject.impl.WorkingTimesImpl <em>Working Times</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.msproject.impl.WorkingTimesImpl
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWorkingTimes()
-	 * @generated
-	 */
-	int WORKING_TIMES = 40;
-
-	/**
-	 * The feature id for the '<em><b>Working Time</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKING_TIMES__WORKING_TIME = 0;
-
-	/**
-	 * The number of structural features of the the '<em>Working Times</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORKING_TIMES_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '<em>Accrue At</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getAccrueAt()
-	 * @generated
-	 */
-	int ACCRUE_AT = 41;
-
-	/**
-	 * The meta object id for the '<em>Active Directory GUID Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getActiveDirectoryGUIDType()
-	 * @generated
-	 */
-	int ACTIVE_DIRECTORY_GUID_TYPE = 42;
-
-	/**
-	 * The meta object id for the '<em>Alias Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getAliasType()
-	 * @generated
-	 */
-	int ALIAS_TYPE = 43;
-
-	/**
-	 * The meta object id for the '<em>Author Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getAuthorType()
-	 * @generated
-	 */
-	int AUTHOR_TYPE = 44;
-
-	/**
-	 * The meta object id for the '<em>Baseline For Earned Value Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getBaselineForEarnedValueType()
-	 * @generated
-	 */
-	int BASELINE_FOR_EARNED_VALUE_TYPE = 45;
-
-	/**
-	 * The meta object id for the '<em>Booking Type Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getBookingTypeType()
-	 * @generated
-	 */
-	int BOOKING_TYPE_TYPE = 46;
-
-	/**
-	 * The meta object id for the '<em>Booking Type Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getBookingTypeType1()
-	 * @generated
-	 */
-	int BOOKING_TYPE_TYPE1 = 47;
-
-	/**
-	 * The meta object id for the '<em>Calculation Type Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCalculationTypeType()
-	 * @generated
-	 */
-	int CALCULATION_TYPE_TYPE = 48;
-
-	/**
-	 * The meta object id for the '<em>Category Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCategoryType()
-	 * @generated
-	 */
-	int CATEGORY_TYPE = 49;
-
-	/**
-	 * The meta object id for the '<em>Code Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCodeType()
-	 * @generated
-	 */
-	int CODE_TYPE = 50;
-
-	/**
-	 * The meta object id for the '<em>Company Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCompanyType()
-	 * @generated
-	 */
-	int COMPANY_TYPE = 51;
-
-	/**
-	 * The meta object id for the '<em>Constraint Type Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getConstraintTypeType()
-	 * @generated
-	 */
-	int CONSTRAINT_TYPE_TYPE = 52;
-
-	/**
-	 * The meta object id for the '<em>Contact Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getContactType()
-	 * @generated
-	 */
-	int CONTACT_TYPE = 53;
-
-	/**
-	 * The meta object id for the '<em>Cost Rate Table Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCostRateTableType()
-	 * @generated
-	 */
-	int COST_RATE_TABLE_TYPE = 54;
-
-	/**
-	 * The meta object id for the '<em>Currency Symbol Position Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCurrencySymbolPositionType()
-	 * @generated
-	 */
-	int CURRENCY_SYMBOL_POSITION_TYPE = 55;
-
-	/**
-	 * The meta object id for the '<em>Currency Symbol Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getCurrencySymbolType()
-	 * @generated
-	 */
-	int CURRENCY_SYMBOL_TYPE = 56;
-
-	/**
-	 * The meta object id for the '<em>Day Type Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDayTypeType()
-	 * @generated
-	 */
-	int DAY_TYPE_TYPE = 57;
-
-	/**
-	 * The meta object id for the '<em>Default Fixed Cost Accrual Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDefaultFixedCostAccrualType()
-	 * @generated
-	 */
-	int DEFAULT_FIXED_COST_ACCRUAL_TYPE = 58;
-
-	/**
-	 * The meta object id for the '<em>Default Task EV Method Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDefaultTaskEVMethodType()
-	 * @generated
-	 */
-	int DEFAULT_TASK_EV_METHOD_TYPE = 59;
-
-	/**
-	 * The meta object id for the '<em>Default Task Type Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDefaultTaskTypeType()
-	 * @generated
-	 */
-	int DEFAULT_TASK_TYPE_TYPE = 60;
-
-	/**
-	 * The meta object id for the '<em>Duration Format Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDurationFormatType()
-	 * @generated
-	 */
-	int DURATION_FORMAT_TYPE = 61;
-
-	/**
-	 * The meta object id for the '<em>Duration Format Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDurationFormatType1()
-	 * @generated
-	 */
-	int DURATION_FORMAT_TYPE1 = 62;
-
-	/**
-	 * The meta object id for the '<em>Duration Format Type2</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDurationFormatType2()
-	 * @generated
-	 */
-	int DURATION_FORMAT_TYPE2 = 63;
-
-	/**
-	 * The meta object id for the '<em>Duration Format Type3</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDurationFormatType3()
-	 * @generated
-	 */
-	int DURATION_FORMAT_TYPE3 = 64;
-
-	/**
-	 * The meta object id for the '<em>Duration Format Type4</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDurationFormatType4()
-	 * @generated
-	 */
-	int DURATION_FORMAT_TYPE4 = 65;
-
-	/**
-	 * The meta object id for the '<em>Duration Format Type5</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getDurationFormatType5()
-	 * @generated
-	 */
-	int DURATION_FORMAT_TYPE5 = 66;
-
-	/**
-	 * The meta object id for the '<em>Earned Value Method Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getEarnedValueMethodType()
-	 * @generated
-	 */
-	int EARNED_VALUE_METHOD_TYPE = 67;
-
-	/**
-	 * The meta object id for the '<em>Earned Value Method Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getEarnedValueMethodType1()
-	 * @generated
-	 */
-	int EARNED_VALUE_METHOD_TYPE1 = 68;
-
-	/**
-	 * The meta object id for the '<em>Email Address Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getEmailAddressType()
-	 * @generated
-	 */
-	int EMAIL_ADDRESS_TYPE = 69;
-
-	/**
-	 * The meta object id for the '<em>External Task Project Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getExternalTaskProjectType()
-	 * @generated
-	 */
-	int EXTERNAL_TASK_PROJECT_TYPE = 70;
-
-	/**
-	 * The meta object id for the '<em>Fixed Cost Accrual Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getFixedCostAccrualType()
-	 * @generated
-	 */
-	int FIXED_COST_ACCRUAL_TYPE = 71;
-
-	/**
-	 * The meta object id for the '<em>FY Start Date Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getFYStartDateType()
-	 * @generated
-	 */
-	int FY_START_DATE_TYPE = 72;
-
-	/**
-	 * The meta object id for the '<em>Group Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getGroupType()
-	 * @generated
-	 */
-	int GROUP_TYPE = 73;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Address Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkAddressType()
-	 * @generated
-	 */
-	int HYPERLINK_ADDRESS_TYPE = 74;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Address Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkAddressType1()
-	 * @generated
-	 */
-	int HYPERLINK_ADDRESS_TYPE1 = 75;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Address Type2</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkAddressType2()
-	 * @generated
-	 */
-	int HYPERLINK_ADDRESS_TYPE2 = 76;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Sub Address Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkSubAddressType()
-	 * @generated
-	 */
-	int HYPERLINK_SUB_ADDRESS_TYPE = 77;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Sub Address Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkSubAddressType1()
-	 * @generated
-	 */
-	int HYPERLINK_SUB_ADDRESS_TYPE1 = 78;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Sub Address Type2</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkSubAddressType2()
-	 * @generated
-	 */
-	int HYPERLINK_SUB_ADDRESS_TYPE2 = 79;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkType()
-	 * @generated
-	 */
-	int HYPERLINK_TYPE = 80;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkType1()
-	 * @generated
-	 */
-	int HYPERLINK_TYPE1 = 81;
-
-	/**
-	 * The meta object id for the '<em>Hyperlink Type2</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getHyperlinkType2()
-	 * @generated
-	 */
-	int HYPERLINK_TYPE2 = 82;
-
-	/**
-	 * The meta object id for the '<em>Initials Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getInitialsType()
-	 * @generated
-	 */
-	int INITIALS_TYPE = 83;
-
-	/**
-	 * The meta object id for the '<em>Lag Format Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getLagFormatType()
-	 * @generated
-	 */
-	int LAG_FORMAT_TYPE = 84;
-
-	/**
-	 * The meta object id for the '<em>Leveling Delay Format Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getLevelingDelayFormatType()
-	 * @generated
-	 */
-	int LEVELING_DELAY_FORMAT_TYPE = 85;
-
-	/**
-	 * The meta object id for the '<em>Leveling Delay Format Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getLevelingDelayFormatType1()
-	 * @generated
-	 */
-	int LEVELING_DELAY_FORMAT_TYPE1 = 86;
-
-	/**
-	 * The meta object id for the '<em>Manager Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getManagerType()
-	 * @generated
-	 */
-	int MANAGER_TYPE = 87;
-
-	/**
-	 * The meta object id for the '<em>Material Label Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getMaterialLabelType()
-	 * @generated
-	 */
-	int MATERIAL_LABEL_TYPE = 88;
-
-	/**
-	 * The meta object id for the '<em>Name Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getNameType()
-	 * @generated
-	 */
-	int NAME_TYPE = 89;
-
-	/**
-	 * The meta object id for the '<em>Name Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getNameType1()
-	 * @generated
-	 */
-	int NAME_TYPE1 = 90;
-
-	/**
-	 * The meta object id for the '<em>Name Type2</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getNameType2()
-	 * @generated
-	 */
-	int NAME_TYPE2 = 91;
-
-	/**
-	 * The meta object id for the '<em>Name Type3</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getNameType3()
-	 * @generated
-	 */
-	int NAME_TYPE3 = 92;
-
-	/**
-	 * The meta object id for the '<em>New Task Start Date Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getNewTaskStartDateType()
-	 * @generated
-	 */
-	int NEW_TASK_START_DATE_TYPE = 93;
-
-	/**
-	 * The meta object id for the '<em>NT Account Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getNTAccountType()
-	 * @generated
-	 */
-	int NT_ACCOUNT_TYPE = 94;
-
-	/**
-	 * The meta object id for the '<em>Outline Number Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getOutlineNumberType()
-	 * @generated
-	 */
-	int OUTLINE_NUMBER_TYPE = 95;
-
-	/**
-	 * The meta object id for the '<em>Overtime Rate Format Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getOvertimeRateFormatType()
-	 * @generated
-	 */
-	int OVERTIME_RATE_FORMAT_TYPE = 96;
-
-	/**
-	 * The meta object id for the '<em>Overtime Rate Format Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getOvertimeRateFormatType1()
-	 * @generated
-	 */
-	int OVERTIME_RATE_FORMAT_TYPE1 = 97;
-
-	/**
-	 * The meta object id for the '<em>Phonetic Alias Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getPhoneticAliasType()
-	 * @generated
-	 */
-	int PHONETIC_ALIAS_TYPE = 98;
-
-	/**
-	 * The meta object id for the '<em>Phonetics Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getPhoneticsType()
-	 * @generated
-	 */
-	int PHONETICS_TYPE = 99;
-
-	/**
-	 * The meta object id for the '<em>Prefix Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getPrefixType()
-	 * @generated
-	 */
-	int PREFIX_TYPE = 100;
-
-	/**
-	 * The meta object id for the '<em>Rate Table Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getRateTableType()
-	 * @generated
-	 */
-	int RATE_TABLE_TYPE = 101;
-
-	/**
-	 * The meta object id for the '<em>Rollup Type Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getRollupTypeType()
-	 * @generated
-	 */
-	int ROLLUP_TYPE_TYPE = 102;
-
-	/**
-	 * The meta object id for the '<em>Standard Rate Format Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getStandardRateFormatType()
-	 * @generated
-	 */
-	int STANDARD_RATE_FORMAT_TYPE = 103;
-
-	/**
-	 * The meta object id for the '<em>Standard Rate Format Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getStandardRateFormatType1()
-	 * @generated
-	 */
-	int STANDARD_RATE_FORMAT_TYPE1 = 104;
-
-	/**
-	 * The meta object id for the '<em>Subject Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getSubjectType()
-	 * @generated
-	 */
-	int SUBJECT_TYPE = 105;
-
-	/**
-	 * The meta object id for the '<em>Subproject Name Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getSubprojectNameType()
-	 * @generated
-	 */
-	int SUBPROJECT_NAME_TYPE = 106;
-
-	/**
-	 * The meta object id for the '<em>Title Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTitleType()
-	 * @generated
-	 */
-	int TITLE_TYPE = 107;
-
-	/**
-	 * The meta object id for the '<em>Type Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTypeType()
-	 * @generated
-	 */
-	int TYPE_TYPE = 108;
-
-	/**
-	 * The meta object id for the '<em>Type Type1</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTypeType1()
-	 * @generated
-	 */
-	int TYPE_TYPE1 = 109;
-
-	/**
-	 * The meta object id for the '<em>Type Type2</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTypeType2()
-	 * @generated
-	 */
-	int TYPE_TYPE2 = 110;
-
-	/**
-	 * The meta object id for the '<em>Type Type3</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTypeType3()
-	 * @generated
-	 */
-	int TYPE_TYPE3 = 111;
-
-	/**
-	 * The meta object id for the '<em>Type Type4</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTypeType4()
-	 * @generated
-	 */
-	int TYPE_TYPE4 = 112;
-
-	/**
-	 * The meta object id for the '<em>Type Type5</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getTypeType5()
-	 * @generated
-	 */
-	int TYPE_TYPE5 = 113;
-
-	/**
-	 * The meta object id for the '<em>UID Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getUIDType()
-	 * @generated
-	 */
-	int UID_TYPE = 114;
-
-	/**
-	 * The meta object id for the '<em>Unit Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getUnitType()
-	 * @generated
-	 */
-	int UNIT_TYPE = 115;
-
-	/**
-	 * The meta object id for the '<em>Valuelist Sort Order Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getValuelistSortOrderType()
-	 * @generated
-	 */
-	int VALUELIST_SORT_ORDER_TYPE = 116;
-
-	/**
-	 * The meta object id for the '<em>Week Start Day Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWeekStartDayType()
-	 * @generated
-	 */
-	int WEEK_START_DAY_TYPE = 117;
-
-	/**
-	 * The meta object id for the '<em>Work Contour Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWorkContourType()
-	 * @generated
-	 */
-	int WORK_CONTOUR_TYPE = 118;
-
-	/**
-	 * The meta object id for the '<em>Work Format Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWorkFormatType()
-	 * @generated
-	 */
-	int WORK_FORMAT_TYPE = 119;
-
-	/**
-	 * The meta object id for the '<em>Work Group Type</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.math.BigInteger
-	 * @see org.eclipse.epf.msproject.impl.MsprojectPackageImpl#getWorkGroupType()
-	 * @generated
-	 */
-	int WORK_GROUP_TYPE = 120;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Assignment <em>Assignment</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Assignment</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment
-	 * @generated
-	 */
-	EClass getAssignment();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getUID()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getTaskUID <em>Task UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Task UID</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getTaskUID()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_TaskUID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getResourceUID <em>Resource UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resource UID</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getResourceUID()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ResourceUID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getPercentWorkComplete <em>Percent Work Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Percent Work Complete</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getPercentWorkComplete()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_PercentWorkComplete();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualCost <em>Actual Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualCost()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualFinish <em>Actual Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualFinish()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualFinish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeCost <em>Actual Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualOvertimeCost()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualOvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeWork <em>Actual Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualOvertimeWork()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualOvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualStart <em>Actual Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Start</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualStart()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualStart();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualWork <em>Actual Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Work</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualWork()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getACWP <em>ACWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ACWP</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getACWP()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ACWP();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isConfirmed <em>Confirmed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Confirmed</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isConfirmed()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Confirmed();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getCost <em>Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getCost()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Cost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getCostRateTable <em>Cost Rate Table</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost Rate Table</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getCostRateTable()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_CostRateTable();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getCostVariance <em>Cost Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getCostVariance()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_CostVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getCV <em>CV</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>CV</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getCV()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_CV();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getDelay <em>Delay</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Delay</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getDelay()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Delay();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getFinish <em>Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getFinish()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Finish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getFinishVariance <em>Finish Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getFinishVariance()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_FinishVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getHyperlink <em>Hyperlink</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getHyperlink()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Hyperlink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getHyperlinkAddress <em>Hyperlink Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink Address</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getHyperlinkAddress()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_HyperlinkAddress();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink Sub Address</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getHyperlinkSubAddress()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_HyperlinkSubAddress();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getWorkVariance <em>Work Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getWorkVariance()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_WorkVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isHasFixedRateUnits <em>Has Fixed Rate Units</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Has Fixed Rate Units</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isHasFixedRateUnits()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_HasFixedRateUnits();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isFixedMaterial <em>Fixed Material</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Fixed Material</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isFixedMaterial()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_FixedMaterial();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getLevelingDelay <em>Leveling Delay</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Leveling Delay</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getLevelingDelay()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_LevelingDelay();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getLevelingDelayFormat <em>Leveling Delay Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Leveling Delay Format</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getLevelingDelayFormat()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_LevelingDelayFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isLinkedFields <em>Linked Fields</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Linked Fields</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isLinkedFields()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_LinkedFields();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isMilestone <em>Milestone</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Milestone</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isMilestone()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Milestone();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getNotes <em>Notes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Notes</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getNotes()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Notes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isOverallocated <em>Overallocated</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overallocated</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isOverallocated()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Overallocated();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getOvertimeCost <em>Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getOvertimeCost()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_OvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getOvertimeWork <em>Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getOvertimeWork()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_OvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getRegularWork <em>Regular Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Regular Work</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getRegularWork()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_RegularWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getRemainingCost <em>Remaining Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getRemainingCost()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_RemainingCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getRemainingOvertimeCost()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_RemainingOvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getRemainingOvertimeWork()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_RemainingOvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getRemainingWork <em>Remaining Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Work</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getRemainingWork()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_RemainingWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isResponsePending <em>Response Pending</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Response Pending</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isResponsePending()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ResponsePending();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getStart <em>Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getStart()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Start();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getStop <em>Stop</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Stop</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getStop()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Stop();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getResume <em>Resume</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resume</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getResume()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Resume();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getStartVariance <em>Start Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getStartVariance()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_StartVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getUnits <em>Units</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Units</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getUnits()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Units();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#isUpdateNeeded <em>Update Needed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Update Needed</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#isUpdateNeeded()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_UpdateNeeded();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getVAC <em>VAC</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>VAC</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getVAC()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_VAC();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getWork <em>Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getWork()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_Work();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getWorkContour <em>Work Contour</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work Contour</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getWorkContour()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_WorkContour();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getBCWS <em>BCWS</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWS</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getBCWS()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_BCWS();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getBCWP <em>BCWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWP</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getBCWP()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_BCWP();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getBookingType <em>Booking Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Booking Type</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getBookingType()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_BookingType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualWorkProtected <em>Actual Work Protected</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Work Protected</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualWorkProtected()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualWorkProtected();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Work Protected</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getActualOvertimeWorkProtected()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_ActualOvertimeWorkProtected();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Assignment#getCreationDate <em>Creation Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Creation Date</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getCreationDate()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EAttribute getAssignment_CreationDate();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Assignment#getExtendedAttribute <em>Extended Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Extended Attribute</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getExtendedAttribute()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EReference getAssignment_ExtendedAttribute();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Assignment#getBaseline <em>Baseline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Baseline</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getBaseline()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EReference getAssignment_Baseline();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Assignment#getTimephasedData <em>Timephased Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Timephased Data</em>'.
-	 * @see org.eclipse.epf.msproject.Assignment#getTimephasedData()
-	 * @see #getAssignment()
-	 * @generated
-	 */
-	EReference getAssignment_TimephasedData();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Assignments <em>Assignments</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Assignments</em>'.
-	 * @see org.eclipse.epf.msproject.Assignments
-	 * @generated
-	 */
-	EClass getAssignments();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Assignments#getAssignment <em>Assignment</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Assignment</em>'.
-	 * @see org.eclipse.epf.msproject.Assignments#getAssignment()
-	 * @see #getAssignments()
-	 * @generated
-	 */
-	EReference getAssignments_Assignment();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.AvailabilityPeriod <em>Availability Period</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Availability Period</em>'.
-	 * @see org.eclipse.epf.msproject.AvailabilityPeriod
-	 * @generated
-	 */
-	EClass getAvailabilityPeriod();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableFrom <em>Available From</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Available From</em>'.
-	 * @see org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableFrom()
-	 * @see #getAvailabilityPeriod()
-	 * @generated
-	 */
-	EAttribute getAvailabilityPeriod_AvailableFrom();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableTo <em>Available To</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Available To</em>'.
-	 * @see org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableTo()
-	 * @see #getAvailabilityPeriod()
-	 * @generated
-	 */
-	EAttribute getAvailabilityPeriod_AvailableTo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableUnits <em>Available Units</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Available Units</em>'.
-	 * @see org.eclipse.epf.msproject.AvailabilityPeriod#getAvailableUnits()
-	 * @see #getAvailabilityPeriod()
-	 * @generated
-	 */
-	EAttribute getAvailabilityPeriod_AvailableUnits();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.AvailabilityPeriods <em>Availability Periods</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Availability Periods</em>'.
-	 * @see org.eclipse.epf.msproject.AvailabilityPeriods
-	 * @generated
-	 */
-	EClass getAvailabilityPeriods();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.AvailabilityPeriods#getAvailabilityPeriod <em>Availability Period</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Availability Period</em>'.
-	 * @see org.eclipse.epf.msproject.AvailabilityPeriods#getAvailabilityPeriod()
-	 * @see #getAvailabilityPeriods()
-	 * @generated
-	 */
-	EReference getAvailabilityPeriods_AvailabilityPeriod();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Baseline <em>Baseline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Baseline</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline
-	 * @generated
-	 */
-	EClass getBaseline();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Baseline#getTimephasedData <em>Timephased Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Timephased Data</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getTimephasedData()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EReference getBaseline_TimephasedData();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getNumber <em>Number</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Number</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getNumber()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_Number();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#isInterim <em>Interim</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Interim</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#isInterim()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_Interim();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getStart <em>Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getStart()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_Start();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getFinish <em>Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getFinish()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_Finish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getDuration <em>Duration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getDuration()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_Duration();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getDurationFormat <em>Duration Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration Format</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getDurationFormat()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_DurationFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#isEstimatedDuration <em>Estimated Duration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Estimated Duration</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#isEstimatedDuration()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_EstimatedDuration();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getWork <em>Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getWork()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_Work();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getCost <em>Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getCost()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_Cost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getBCWS <em>BCWS</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWS</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getBCWS()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_BCWS();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline#getBCWP <em>BCWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWP</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline#getBCWP()
-	 * @see #getBaseline()
-	 * @generated
-	 */
-	EAttribute getBaseline_BCWP();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Baseline2 <em>Baseline2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Baseline2</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline2
-	 * @generated
-	 */
-	EClass getBaseline2();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline2#getNumber <em>Number</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Number</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline2#getNumber()
-	 * @see #getBaseline2()
-	 * @generated
-	 */
-	EAttribute getBaseline2_Number();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline2#getWork <em>Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline2#getWork()
-	 * @see #getBaseline2()
-	 * @generated
-	 */
-	EAttribute getBaseline2_Work();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline2#getCost <em>Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline2#getCost()
-	 * @see #getBaseline2()
-	 * @generated
-	 */
-	EAttribute getBaseline2_Cost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline2#getBCWS <em>BCWS</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWS</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline2#getBCWS()
-	 * @see #getBaseline2()
-	 * @generated
-	 */
-	EAttribute getBaseline2_BCWS();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline2#getBCWP <em>BCWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWP</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline2#getBCWP()
-	 * @see #getBaseline2()
-	 * @generated
-	 */
-	EAttribute getBaseline2_BCWP();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Baseline3 <em>Baseline3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Baseline3</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3
-	 * @generated
-	 */
-	EClass getBaseline3();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Baseline3#getTimephasedData <em>Timephased Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Timephased Data</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getTimephasedData()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EReference getBaseline3_TimephasedData();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline3#getNumber <em>Number</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Number</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getNumber()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EAttribute getBaseline3_Number();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline3#getStart <em>Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getStart()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EAttribute getBaseline3_Start();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline3#getFinish <em>Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getFinish()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EAttribute getBaseline3_Finish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline3#getWork <em>Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getWork()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EAttribute getBaseline3_Work();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline3#getCost <em>Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getCost()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EAttribute getBaseline3_Cost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline3#getBCWS <em>BCWS</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWS</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getBCWS()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EAttribute getBaseline3_BCWS();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Baseline3#getBCWP <em>BCWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWP</em>'.
-	 * @see org.eclipse.epf.msproject.Baseline3#getBCWP()
-	 * @see #getBaseline3()
-	 * @generated
-	 */
-	EAttribute getBaseline3_BCWP();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Calendar <em>Calendar</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Calendar</em>'.
-	 * @see org.eclipse.epf.msproject.Calendar
-	 * @generated
-	 */
-	EClass getCalendar();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Calendar#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.Calendar#getUID()
-	 * @see #getCalendar()
-	 * @generated
-	 */
-	EAttribute getCalendar_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Calendar#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.msproject.Calendar#getName()
-	 * @see #getCalendar()
-	 * @generated
-	 */
-	EAttribute getCalendar_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Calendar#isIsBaseCalendar <em>Is Base Calendar</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Base Calendar</em>'.
-	 * @see org.eclipse.epf.msproject.Calendar#isIsBaseCalendar()
-	 * @see #getCalendar()
-	 * @generated
-	 */
-	EAttribute getCalendar_IsBaseCalendar();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Calendar#getBaseCalendarUID <em>Base Calendar UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Base Calendar UID</em>'.
-	 * @see org.eclipse.epf.msproject.Calendar#getBaseCalendarUID()
-	 * @see #getCalendar()
-	 * @generated
-	 */
-	EAttribute getCalendar_BaseCalendarUID();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Calendar#getWeekDays <em>Week Days</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Week Days</em>'.
-	 * @see org.eclipse.epf.msproject.Calendar#getWeekDays()
-	 * @see #getCalendar()
-	 * @generated
-	 */
-	EReference getCalendar_WeekDays();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Calendars <em>Calendars</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Calendars</em>'.
-	 * @see org.eclipse.epf.msproject.Calendars
-	 * @generated
-	 */
-	EClass getCalendars();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Calendars#getCalendar <em>Calendar</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Calendar</em>'.
-	 * @see org.eclipse.epf.msproject.Calendars#getCalendar()
-	 * @see #getCalendars()
-	 * @generated
-	 */
-	EReference getCalendars_Calendar();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.DocumentRoot <em>Document Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Document Root</em>'.
-	 * @see org.eclipse.epf.msproject.DocumentRoot
-	 * @generated
-	 */
-	EClass getDocumentRoot();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.msproject.DocumentRoot#getMixed <em>Mixed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Mixed</em>'.
-	 * @see org.eclipse.epf.msproject.DocumentRoot#getMixed()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EAttribute getDocumentRoot_Mixed();
-
-	/**
-	 * Returns the meta object for the map '{@link org.eclipse.epf.msproject.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XMLNS Prefix Map</em>'.
-	 * @see org.eclipse.epf.msproject.DocumentRoot#getXMLNSPrefixMap()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XMLNSPrefixMap();
-
-	/**
-	 * Returns the meta object for the map '{@link org.eclipse.epf.msproject.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XSI Schema Location</em>'.
-	 * @see org.eclipse.epf.msproject.DocumentRoot#getXSISchemaLocation()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XSISchemaLocation();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.DocumentRoot#getProject <em>Project</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Project</em>'.
-	 * @see org.eclipse.epf.msproject.DocumentRoot#getProject()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Project();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.ExtendedAttribute <em>Extended Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extended Attribute</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute
-	 * @generated
-	 */
-	EClass getExtendedAttribute();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getFieldID <em>Field ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field ID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getFieldID()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_FieldID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getFieldName <em>Field Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field Name</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getFieldName()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_FieldName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getAlias <em>Alias</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Alias</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getAlias()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_Alias();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getPhoneticAlias <em>Phonetic Alias</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Phonetic Alias</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getPhoneticAlias()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_PhoneticAlias();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getRollupType <em>Rollup Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rollup Type</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getRollupType()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_RollupType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getCalculationType <em>Calculation Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Calculation Type</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getCalculationType()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_CalculationType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getFormula <em>Formula</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Formula</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getFormula()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_Formula();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#isRestrictValues <em>Restrict Values</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Restrict Values</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#isRestrictValues()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_RestrictValues();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getValuelistSortOrder <em>Valuelist Sort Order</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Valuelist Sort Order</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getValuelistSortOrder()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_ValuelistSortOrder();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#isAppendNewValues <em>Append New Values</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Append New Values</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#isAppendNewValues()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_AppendNewValues();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute#getDefault <em>Default</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getDefault()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute_Default();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.ExtendedAttribute#getValueList <em>Value List</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value List</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute#getValueList()
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 */
-	EReference getExtendedAttribute_ValueList();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.ExtendedAttribute2 <em>Extended Attribute2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extended Attribute2</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute2
-	 * @generated
-	 */
-	EClass getExtendedAttribute2();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute2#getUID()
-	 * @see #getExtendedAttribute2()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute2_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getFieldID <em>Field ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field ID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute2#getFieldID()
-	 * @see #getExtendedAttribute2()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute2_FieldID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute2#getValue()
-	 * @see #getExtendedAttribute2()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute2_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getValueID <em>Value ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value ID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute2#getValueID()
-	 * @see #getExtendedAttribute2()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute2_ValueID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute2#getDurationFormat <em>Duration Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration Format</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute2#getDurationFormat()
-	 * @see #getExtendedAttribute2()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute2_DurationFormat();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.ExtendedAttribute3 <em>Extended Attribute3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extended Attribute3</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute3
-	 * @generated
-	 */
-	EClass getExtendedAttribute3();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute3#getUID()
-	 * @see #getExtendedAttribute3()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute3_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getFieldID <em>Field ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field ID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute3#getFieldID()
-	 * @see #getExtendedAttribute3()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute3_FieldID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute3#getValue()
-	 * @see #getExtendedAttribute3()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute3_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getValueID <em>Value ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value ID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute3#getValueID()
-	 * @see #getExtendedAttribute3()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute3_ValueID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute3#getDurationFormat <em>Duration Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration Format</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute3#getDurationFormat()
-	 * @see #getExtendedAttribute3()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute3_DurationFormat();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.ExtendedAttribute4 <em>Extended Attribute4</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extended Attribute4</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute4
-	 * @generated
-	 */
-	EClass getExtendedAttribute4();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute4#getUID()
-	 * @see #getExtendedAttribute4()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute4_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getFieldID <em>Field ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field ID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute4#getFieldID()
-	 * @see #getExtendedAttribute4()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute4_FieldID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute4#getValue()
-	 * @see #getExtendedAttribute4()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute4_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getValueID <em>Value ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value ID</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute4#getValueID()
-	 * @see #getExtendedAttribute4()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute4_ValueID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.ExtendedAttribute4#getDurationFormat <em>Duration Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration Format</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttribute4#getDurationFormat()
-	 * @see #getExtendedAttribute4()
-	 * @generated
-	 */
-	EAttribute getExtendedAttribute4_DurationFormat();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.ExtendedAttributes <em>Extended Attributes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extended Attributes</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttributes
-	 * @generated
-	 */
-	EClass getExtendedAttributes();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.ExtendedAttributes#getExtendedAttribute <em>Extended Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Extended Attribute</em>'.
-	 * @see org.eclipse.epf.msproject.ExtendedAttributes#getExtendedAttribute()
-	 * @see #getExtendedAttributes()
-	 * @generated
-	 */
-	EReference getExtendedAttributes_ExtendedAttribute();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Mask <em>Mask</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Mask</em>'.
-	 * @see org.eclipse.epf.msproject.Mask
-	 * @generated
-	 */
-	EClass getMask();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Mask#getLevel <em>Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Level</em>'.
-	 * @see org.eclipse.epf.msproject.Mask#getLevel()
-	 * @see #getMask()
-	 * @generated
-	 */
-	EAttribute getMask_Level();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Mask#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.msproject.Mask#getType()
-	 * @see #getMask()
-	 * @generated
-	 */
-	EAttribute getMask_Type();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Mask#getLength <em>Length</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Length</em>'.
-	 * @see org.eclipse.epf.msproject.Mask#getLength()
-	 * @see #getMask()
-	 * @generated
-	 */
-	EAttribute getMask_Length();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Mask#getSeparator <em>Separator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Separator</em>'.
-	 * @see org.eclipse.epf.msproject.Mask#getSeparator()
-	 * @see #getMask()
-	 * @generated
-	 */
-	EAttribute getMask_Separator();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Masks <em>Masks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Masks</em>'.
-	 * @see org.eclipse.epf.msproject.Masks
-	 * @generated
-	 */
-	EClass getMasks();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Masks#getMask <em>Mask</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Mask</em>'.
-	 * @see org.eclipse.epf.msproject.Masks#getMask()
-	 * @see #getMasks()
-	 * @generated
-	 */
-	EReference getMasks_Mask();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.OutlineCode <em>Outline Code</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Outline Code</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode
-	 * @generated
-	 */
-	EClass getOutlineCode();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#getFieldID <em>Field ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field ID</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#getFieldID()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_FieldID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#getFieldName <em>Field Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field Name</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#getFieldName()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_FieldName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#getAlias <em>Alias</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Alias</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#getAlias()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_Alias();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#getPhoneticAlias <em>Phonetic Alias</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Phonetic Alias</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#getPhoneticAlias()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_PhoneticAlias();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.OutlineCode#getValues <em>Values</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Values</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#getValues()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EReference getOutlineCode_Values();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#isEnterprise <em>Enterprise</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Enterprise</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#isEnterprise()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_Enterprise();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#getEnterpriseOutlineCodeAlias <em>Enterprise Outline Code Alias</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Enterprise Outline Code Alias</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#getEnterpriseOutlineCodeAlias()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_EnterpriseOutlineCodeAlias();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#isResourceSubstitutionEnabled <em>Resource Substitution Enabled</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resource Substitution Enabled</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#isResourceSubstitutionEnabled()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_ResourceSubstitutionEnabled();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#isLeafOnly <em>Leaf Only</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Leaf Only</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#isLeafOnly()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_LeafOnly();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#isAllLevelsRequired <em>All Levels Required</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>All Levels Required</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#isAllLevelsRequired()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_AllLevelsRequired();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode#isOnlyTableValuesAllowed <em>Only Table Values Allowed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Only Table Values Allowed</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#isOnlyTableValuesAllowed()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EAttribute getOutlineCode_OnlyTableValuesAllowed();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.OutlineCode#getMasks <em>Masks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Masks</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode#getMasks()
-	 * @see #getOutlineCode()
-	 * @generated
-	 */
-	EReference getOutlineCode_Masks();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.OutlineCode2 <em>Outline Code2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Outline Code2</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode2
-	 * @generated
-	 */
-	EClass getOutlineCode2();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode2#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode2#getUID()
-	 * @see #getOutlineCode2()
-	 * @generated
-	 */
-	EAttribute getOutlineCode2_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode2#getFieldID <em>Field ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field ID</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode2#getFieldID()
-	 * @see #getOutlineCode2()
-	 * @generated
-	 */
-	EAttribute getOutlineCode2_FieldID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode2#getValueID <em>Value ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value ID</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode2#getValueID()
-	 * @see #getOutlineCode2()
-	 * @generated
-	 */
-	EAttribute getOutlineCode2_ValueID();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.OutlineCode3 <em>Outline Code3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Outline Code3</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode3
-	 * @generated
-	 */
-	EClass getOutlineCode3();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode3#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode3#getUID()
-	 * @see #getOutlineCode3()
-	 * @generated
-	 */
-	EAttribute getOutlineCode3_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode3#getFieldID <em>Field ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Field ID</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode3#getFieldID()
-	 * @see #getOutlineCode3()
-	 * @generated
-	 */
-	EAttribute getOutlineCode3_FieldID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.OutlineCode3#getValueID <em>Value ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value ID</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCode3#getValueID()
-	 * @see #getOutlineCode3()
-	 * @generated
-	 */
-	EAttribute getOutlineCode3_ValueID();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.OutlineCodes <em>Outline Codes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Outline Codes</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCodes
-	 * @generated
-	 */
-	EClass getOutlineCodes();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.OutlineCodes#getOutlineCode <em>Outline Code</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Outline Code</em>'.
-	 * @see org.eclipse.epf.msproject.OutlineCodes#getOutlineCode()
-	 * @see #getOutlineCodes()
-	 * @generated
-	 */
-	EReference getOutlineCodes_OutlineCode();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.PredecessorLink <em>Predecessor Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Predecessor Link</em>'.
-	 * @see org.eclipse.epf.msproject.PredecessorLink
-	 * @generated
-	 */
-	EClass getPredecessorLink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.PredecessorLink#getPredecessorUID <em>Predecessor UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Predecessor UID</em>'.
-	 * @see org.eclipse.epf.msproject.PredecessorLink#getPredecessorUID()
-	 * @see #getPredecessorLink()
-	 * @generated
-	 */
-	EAttribute getPredecessorLink_PredecessorUID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.PredecessorLink#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.msproject.PredecessorLink#getType()
-	 * @see #getPredecessorLink()
-	 * @generated
-	 */
-	EAttribute getPredecessorLink_Type();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.PredecessorLink#isCrossProject <em>Cross Project</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cross Project</em>'.
-	 * @see org.eclipse.epf.msproject.PredecessorLink#isCrossProject()
-	 * @see #getPredecessorLink()
-	 * @generated
-	 */
-	EAttribute getPredecessorLink_CrossProject();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.PredecessorLink#getCrossProjectName <em>Cross Project Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cross Project Name</em>'.
-	 * @see org.eclipse.epf.msproject.PredecessorLink#getCrossProjectName()
-	 * @see #getPredecessorLink()
-	 * @generated
-	 */
-	EAttribute getPredecessorLink_CrossProjectName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.PredecessorLink#getLinkLag <em>Link Lag</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Link Lag</em>'.
-	 * @see org.eclipse.epf.msproject.PredecessorLink#getLinkLag()
-	 * @see #getPredecessorLink()
-	 * @generated
-	 */
-	EAttribute getPredecessorLink_LinkLag();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.PredecessorLink#getLagFormat <em>Lag Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Lag Format</em>'.
-	 * @see org.eclipse.epf.msproject.PredecessorLink#getLagFormat()
-	 * @see #getPredecessorLink()
-	 * @generated
-	 */
-	EAttribute getPredecessorLink_LagFormat();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Project <em>Project</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Project</em>'.
-	 * @see org.eclipse.epf.msproject.Project
-	 * @generated
-	 */
-	EClass getProject();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getUID()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getName()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getTitle <em>Title</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Title</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getTitle()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Title();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getSubject <em>Subject</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Subject</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getSubject()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Subject();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCategory <em>Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Category</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCategory()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Category();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCompany <em>Company</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Company</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCompany()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Company();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getManager <em>Manager</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Manager</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getManager()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Manager();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getAuthor <em>Author</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Author</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getAuthor()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Author();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCreationDate <em>Creation Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Creation Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCreationDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_CreationDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getRevision <em>Revision</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Revision</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getRevision()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Revision();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getLastSaved <em>Last Saved</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Last Saved</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getLastSaved()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_LastSaved();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isScheduleFromStart <em>Schedule From Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Schedule From Start</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isScheduleFromStart()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_ScheduleFromStart();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getStartDate <em>Start Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getStartDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_StartDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getFinishDate <em>Finish Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getFinishDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_FinishDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getFYStartDate <em>FY Start Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>FY Start Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getFYStartDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_FYStartDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCriticalSlackLimit <em>Critical Slack Limit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Critical Slack Limit</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCriticalSlackLimit()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_CriticalSlackLimit();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCurrencyDigits <em>Currency Digits</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Currency Digits</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCurrencyDigits()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_CurrencyDigits();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCurrencySymbol <em>Currency Symbol</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Currency Symbol</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCurrencySymbol()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_CurrencySymbol();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCurrencySymbolPosition <em>Currency Symbol Position</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Currency Symbol Position</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCurrencySymbolPosition()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_CurrencySymbolPosition();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCalendarUID <em>Calendar UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Calendar UID</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCalendarUID()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_CalendarUID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDefaultStartTime <em>Default Start Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Start Time</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDefaultStartTime()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DefaultStartTime();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDefaultFinishTime <em>Default Finish Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Finish Time</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDefaultFinishTime()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DefaultFinishTime();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getMinutesPerDay <em>Minutes Per Day</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Minutes Per Day</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getMinutesPerDay()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MinutesPerDay();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getMinutesPerWeek <em>Minutes Per Week</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Minutes Per Week</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getMinutesPerWeek()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MinutesPerWeek();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDaysPerMonth <em>Days Per Month</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Days Per Month</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDaysPerMonth()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DaysPerMonth();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDefaultTaskType <em>Default Task Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Task Type</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDefaultTaskType()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DefaultTaskType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDefaultFixedCostAccrual <em>Default Fixed Cost Accrual</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Fixed Cost Accrual</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDefaultFixedCostAccrual()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DefaultFixedCostAccrual();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDefaultStandardRate <em>Default Standard Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Standard Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDefaultStandardRate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DefaultStandardRate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDefaultOvertimeRate <em>Default Overtime Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Overtime Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDefaultOvertimeRate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DefaultOvertimeRate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDurationFormat <em>Duration Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration Format</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDurationFormat()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DurationFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getWorkFormat <em>Work Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work Format</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getWorkFormat()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_WorkFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isEditableActualCosts <em>Editable Actual Costs</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Editable Actual Costs</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isEditableActualCosts()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_EditableActualCosts();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isHonorConstraints <em>Honor Constraints</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Honor Constraints</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isHonorConstraints()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_HonorConstraints();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getEarnedValueMethod <em>Earned Value Method</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Earned Value Method</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getEarnedValueMethod()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_EarnedValueMethod();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isInsertedProjectsLikeSummary <em>Inserted Projects Like Summary</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Inserted Projects Like Summary</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isInsertedProjectsLikeSummary()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_InsertedProjectsLikeSummary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isMultipleCriticalPaths <em>Multiple Critical Paths</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Multiple Critical Paths</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isMultipleCriticalPaths()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MultipleCriticalPaths();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isNewTasksEffortDriven <em>New Tasks Effort Driven</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>New Tasks Effort Driven</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isNewTasksEffortDriven()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_NewTasksEffortDriven();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isNewTasksEstimated <em>New Tasks Estimated</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>New Tasks Estimated</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isNewTasksEstimated()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_NewTasksEstimated();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isSplitsInProgressTasks <em>Splits In Progress Tasks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Splits In Progress Tasks</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isSplitsInProgressTasks()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_SplitsInProgressTasks();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isSpreadActualCost <em>Spread Actual Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Spread Actual Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isSpreadActualCost()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_SpreadActualCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isSpreadPercentComplete <em>Spread Percent Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Spread Percent Complete</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isSpreadPercentComplete()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_SpreadPercentComplete();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isTaskUpdatesResource <em>Task Updates Resource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Task Updates Resource</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isTaskUpdatesResource()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_TaskUpdatesResource();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isFiscalYearStart <em>Fiscal Year Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Fiscal Year Start</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isFiscalYearStart()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_FiscalYearStart();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getWeekStartDay <em>Week Start Day</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Week Start Day</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getWeekStartDay()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_WeekStartDay();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsBack <em>Move Completed Ends Back</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Move Completed Ends Back</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isMoveCompletedEndsBack()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MoveCompletedEndsBack();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsBack <em>Move Remaining Starts Back</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Move Remaining Starts Back</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isMoveRemainingStartsBack()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MoveRemainingStartsBack();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsForward <em>Move Remaining Starts Forward</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Move Remaining Starts Forward</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isMoveRemainingStartsForward()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MoveRemainingStartsForward();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsForward <em>Move Completed Ends Forward</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Move Completed Ends Forward</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isMoveCompletedEndsForward()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MoveCompletedEndsForward();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getBaselineForEarnedValue <em>Baseline For Earned Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Baseline For Earned Value</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getBaselineForEarnedValue()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_BaselineForEarnedValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isAutoAddNewResourcesAndTasks <em>Auto Add New Resources And Tasks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Auto Add New Resources And Tasks</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isAutoAddNewResourcesAndTasks()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_AutoAddNewResourcesAndTasks();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getStatusDate <em>Status Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Status Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getStatusDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_StatusDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getCurrentDate <em>Current Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Current Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCurrentDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_CurrentDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isMicrosoftProjectServerURL <em>Microsoft Project Server URL</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Microsoft Project Server URL</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isMicrosoftProjectServerURL()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_MicrosoftProjectServerURL();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isAutolink <em>Autolink</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Autolink</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isAutolink()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_Autolink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getNewTaskStartDate <em>New Task Start Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>New Task Start Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getNewTaskStartDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_NewTaskStartDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getDefaultTaskEVMethod <em>Default Task EV Method</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Task EV Method</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getDefaultTaskEVMethod()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_DefaultTaskEVMethod();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isProjectExternallyEdited <em>Project Externally Edited</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Project Externally Edited</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isProjectExternallyEdited()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_ProjectExternallyEdited();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#getExtendedCreationDate <em>Extended Creation Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Extended Creation Date</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getExtendedCreationDate()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_ExtendedCreationDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isActualsInSync <em>Actuals In Sync</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actuals In Sync</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isActualsInSync()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_ActualsInSync();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isRemoveFileProperties <em>Remove File Properties</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remove File Properties</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isRemoveFileProperties()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_RemoveFileProperties();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Project#isAdminProject <em>Admin Project</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Admin Project</em>'.
-	 * @see org.eclipse.epf.msproject.Project#isAdminProject()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EAttribute getProject_AdminProject();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Project#getOutlineCodes <em>Outline Codes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Outline Codes</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getOutlineCodes()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EReference getProject_OutlineCodes();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Project#getWBSMasks <em>WBS Masks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>WBS Masks</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getWBSMasks()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EReference getProject_WBSMasks();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Project#getExtendedAttributes <em>Extended Attributes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Extended Attributes</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getExtendedAttributes()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EReference getProject_ExtendedAttributes();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Project#getCalendars <em>Calendars</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Calendars</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getCalendars()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EReference getProject_Calendars();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Project#getTasks <em>Tasks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Tasks</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getTasks()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EReference getProject_Tasks();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Project#getResources <em>Resources</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Resources</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getResources()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EReference getProject_Resources();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Project#getAssignments <em>Assignments</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Assignments</em>'.
-	 * @see org.eclipse.epf.msproject.Project#getAssignments()
-	 * @see #getProject()
-	 * @generated
-	 */
-	EReference getProject_Assignments();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Rate <em>Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Rate
-	 * @generated
-	 */
-	EClass getRate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getRatesFrom <em>Rates From</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rates From</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getRatesFrom()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_RatesFrom();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getRatesTo <em>Rates To</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rates To</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getRatesTo()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_RatesTo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getRateTable <em>Rate Table</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rate Table</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getRateTable()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_RateTable();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getStandardRate <em>Standard Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Standard Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getStandardRate()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_StandardRate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getStandardRateFormat <em>Standard Rate Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Standard Rate Format</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getStandardRateFormat()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_StandardRateFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getOvertimeRate <em>Overtime Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getOvertimeRate()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_OvertimeRate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getOvertimeRateFormat <em>Overtime Rate Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Rate Format</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getOvertimeRateFormat()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_OvertimeRateFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Rate#getCostPerUse <em>Cost Per Use</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost Per Use</em>'.
-	 * @see org.eclipse.epf.msproject.Rate#getCostPerUse()
-	 * @see #getRate()
-	 * @generated
-	 */
-	EAttribute getRate_CostPerUse();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Rates <em>Rates</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Rates</em>'.
-	 * @see org.eclipse.epf.msproject.Rates
-	 * @generated
-	 */
-	EClass getRates();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Rates#getRate <em>Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Rates#getRate()
-	 * @see #getRates()
-	 * @generated
-	 */
-	EReference getRates_Rate();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Resource <em>Resource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource</em>'.
-	 * @see org.eclipse.epf.msproject.Resource
-	 * @generated
-	 */
-	EClass getResource();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getUID()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getID <em>ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ID</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getID()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getName()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getType()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Type();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#isIsNull <em>Is Null</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Null</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#isIsNull()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_IsNull();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getInitials <em>Initials</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Initials</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getInitials()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Initials();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getPhonetics <em>Phonetics</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Phonetics</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getPhonetics()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Phonetics();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getNTAccount <em>NT Account</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>NT Account</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getNTAccount()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_NTAccount();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getMaterialLabel <em>Material Label</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Material Label</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getMaterialLabel()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_MaterialLabel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getCode <em>Code</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Code</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getCode()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Code();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getGroup <em>Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Group</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getGroup()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Group();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getWorkGroup <em>Work Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work Group</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getWorkGroup()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_WorkGroup();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getEmailAddress <em>Email Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Email Address</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getEmailAddress()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_EmailAddress();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getHyperlink <em>Hyperlink</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getHyperlink()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Hyperlink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getHyperlinkAddress <em>Hyperlink Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink Address</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getHyperlinkAddress()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_HyperlinkAddress();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink Sub Address</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getHyperlinkSubAddress()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_HyperlinkSubAddress();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getMaxUnits <em>Max Units</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Max Units</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getMaxUnits()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_MaxUnits();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getPeakUnits <em>Peak Units</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Peak Units</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getPeakUnits()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_PeakUnits();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#isOverAllocated <em>Over Allocated</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Over Allocated</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#isOverAllocated()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_OverAllocated();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getAvailableFrom <em>Available From</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Available From</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getAvailableFrom()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_AvailableFrom();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getAvailableTo <em>Available To</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Available To</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getAvailableTo()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_AvailableTo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getStart <em>Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getStart()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Start();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getFinish <em>Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getFinish()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Finish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#isCanLevel <em>Can Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Can Level</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#isCanLevel()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_CanLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getAccrueAt <em>Accrue At</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Accrue At</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getAccrueAt()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_AccrueAt();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getWork <em>Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getWork()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Work();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getRegularWork <em>Regular Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Regular Work</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getRegularWork()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_RegularWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getOvertimeWork <em>Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getOvertimeWork()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_OvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getActualWork <em>Actual Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Work</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getActualWork()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ActualWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getRemainingWork <em>Remaining Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Work</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getRemainingWork()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_RemainingWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getActualOvertimeWork <em>Actual Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getActualOvertimeWork()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ActualOvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getRemainingOvertimeWork()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_RemainingOvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getPercentWorkComplete <em>Percent Work Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Percent Work Complete</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getPercentWorkComplete()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_PercentWorkComplete();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getStandardRate <em>Standard Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Standard Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getStandardRate()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_StandardRate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getStandardRateFormat <em>Standard Rate Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Standard Rate Format</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getStandardRateFormat()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_StandardRateFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getCost <em>Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getCost()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Cost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getOvertimeRate <em>Overtime Rate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Rate</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getOvertimeRate()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_OvertimeRate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getOvertimeRateFormat <em>Overtime Rate Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Rate Format</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getOvertimeRateFormat()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_OvertimeRateFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getOvertimeCost <em>Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getOvertimeCost()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_OvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getCostPerUse <em>Cost Per Use</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost Per Use</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getCostPerUse()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_CostPerUse();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getActualCost <em>Actual Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getActualCost()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ActualCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getActualOvertimeCost <em>Actual Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getActualOvertimeCost()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ActualOvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getRemainingCost <em>Remaining Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getRemainingCost()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_RemainingCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getRemainingOvertimeCost()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_RemainingOvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getWorkVariance <em>Work Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getWorkVariance()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_WorkVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getCostVariance <em>Cost Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getCostVariance()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_CostVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getSV <em>SV</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>SV</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getSV()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_SV();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getCV <em>CV</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>CV</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getCV()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_CV();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getACWP <em>ACWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ACWP</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getACWP()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ACWP();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getCalendarUID <em>Calendar UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Calendar UID</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getCalendarUID()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_CalendarUID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getNotes <em>Notes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Notes</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getNotes()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_Notes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getBCWS <em>BCWS</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWS</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getBCWS()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_BCWS();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getBCWP <em>BCWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWP</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getBCWP()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_BCWP();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#isIsGeneric <em>Is Generic</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Generic</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#isIsGeneric()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_IsGeneric();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#isIsInactive <em>Is Inactive</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Inactive</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#isIsInactive()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_IsInactive();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#isIsEnterprise <em>Is Enterprise</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Enterprise</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#isIsEnterprise()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_IsEnterprise();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getBookingType <em>Booking Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Booking Type</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getBookingType()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_BookingType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getActualWorkProtected <em>Actual Work Protected</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Work Protected</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getActualWorkProtected()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ActualWorkProtected();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Work Protected</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getActualOvertimeWorkProtected()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ActualOvertimeWorkProtected();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getActiveDirectoryGUID <em>Active Directory GUID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Active Directory GUID</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getActiveDirectoryGUID()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_ActiveDirectoryGUID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Resource#getCreationDate <em>Creation Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Creation Date</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getCreationDate()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EAttribute getResource_CreationDate();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Resource#getExtendedAttribute <em>Extended Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Extended Attribute</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getExtendedAttribute()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EReference getResource_ExtendedAttribute();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Resource#getBaseline <em>Baseline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Baseline</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getBaseline()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EReference getResource_Baseline();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Resource#getOutlineCode <em>Outline Code</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Outline Code</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getOutlineCode()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EReference getResource_OutlineCode();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Resource#getAvailabilityPeriods <em>Availability Periods</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Availability Periods</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getAvailabilityPeriods()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EReference getResource_AvailabilityPeriods();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.Resource#getRates <em>Rates</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Rates</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getRates()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EReference getResource_Rates();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Resource#getTimephasedData <em>Timephased Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Timephased Data</em>'.
-	 * @see org.eclipse.epf.msproject.Resource#getTimephasedData()
-	 * @see #getResource()
-	 * @generated
-	 */
-	EReference getResource_TimephasedData();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Resources <em>Resources</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resources</em>'.
-	 * @see org.eclipse.epf.msproject.Resources
-	 * @generated
-	 */
-	EClass getResources();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Resources#getResource <em>Resource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Resource</em>'.
-	 * @see org.eclipse.epf.msproject.Resources#getResource()
-	 * @see #getResources()
-	 * @generated
-	 */
-	EReference getResources_Resource();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Task <em>Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task</em>'.
-	 * @see org.eclipse.epf.msproject.Task
-	 * @generated
-	 */
-	EClass getTask();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getUID()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getID <em>ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ID</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getID()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getName()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getType()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Type();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isIsNull <em>Is Null</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Null</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isIsNull()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_IsNull();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getCreateDate <em>Create Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Create Date</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getCreateDate()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_CreateDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getContact <em>Contact</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Contact</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getContact()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Contact();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getWBS <em>WBS</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>WBS</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getWBS()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_WBS();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getWBSLevel <em>WBS Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>WBS Level</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getWBSLevel()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_WBSLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getOutlineNumber <em>Outline Number</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Outline Number</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getOutlineNumber()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_OutlineNumber();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getOutlineLevel <em>Outline Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Outline Level</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getOutlineLevel()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_OutlineLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getPriority <em>Priority</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Priority</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getPriority()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Priority();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getStart <em>Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getStart()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Start();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getFinish <em>Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getFinish()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Finish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getDuration <em>Duration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getDuration()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Duration();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getDurationFormat <em>Duration Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Duration Format</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getDurationFormat()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_DurationFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getWork <em>Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getWork()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Work();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getStop <em>Stop</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Stop</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getStop()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Stop();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getResume <em>Resume</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resume</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getResume()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Resume();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isResumeValid <em>Resume Valid</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resume Valid</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isResumeValid()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ResumeValid();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isEffortDriven <em>Effort Driven</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Effort Driven</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isEffortDriven()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_EffortDriven();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isRecurring <em>Recurring</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Recurring</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isRecurring()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Recurring();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isOverAllocated <em>Over Allocated</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Over Allocated</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isOverAllocated()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_OverAllocated();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isEstimated <em>Estimated</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Estimated</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isEstimated()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Estimated();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isMilestone <em>Milestone</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Milestone</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isMilestone()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Milestone();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isSummary <em>Summary</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Summary</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isSummary()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Summary();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isCritical <em>Critical</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Critical</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isCritical()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Critical();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isIsSubproject <em>Is Subproject</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Subproject</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isIsSubproject()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_IsSubproject();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isIsSubprojectReadOnly <em>Is Subproject Read Only</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Subproject Read Only</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isIsSubprojectReadOnly()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_IsSubprojectReadOnly();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getSubprojectName <em>Subproject Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Subproject Name</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getSubprojectName()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_SubprojectName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isExternalTask <em>External Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>External Task</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isExternalTask()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ExternalTask();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getExternalTaskProject <em>External Task Project</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>External Task Project</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getExternalTaskProject()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ExternalTaskProject();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getEarlyStart <em>Early Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Early Start</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getEarlyStart()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_EarlyStart();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getEarlyFinish <em>Early Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Early Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getEarlyFinish()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_EarlyFinish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getLateStart <em>Late Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Late Start</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getLateStart()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_LateStart();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getLateFinish <em>Late Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Late Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getLateFinish()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_LateFinish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getStartVariance <em>Start Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getStartVariance()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_StartVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getFinishVariance <em>Finish Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getFinishVariance()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_FinishVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getWorkVariance <em>Work Variance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work Variance</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getWorkVariance()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_WorkVariance();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getFreeSlack <em>Free Slack</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Free Slack</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getFreeSlack()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_FreeSlack();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getTotalSlack <em>Total Slack</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Total Slack</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getTotalSlack()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_TotalSlack();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getFixedCost <em>Fixed Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Fixed Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getFixedCost()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_FixedCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getFixedCostAccrual <em>Fixed Cost Accrual</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Fixed Cost Accrual</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getFixedCostAccrual()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_FixedCostAccrual();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getPercentComplete <em>Percent Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Percent Complete</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getPercentComplete()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_PercentComplete();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getPercentWorkComplete <em>Percent Work Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Percent Work Complete</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getPercentWorkComplete()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_PercentWorkComplete();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getCost <em>Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getCost()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Cost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getOvertimeCost <em>Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getOvertimeCost()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_OvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getOvertimeWork <em>Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getOvertimeWork()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_OvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualStart <em>Actual Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Start</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualStart()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualStart();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualFinish <em>Actual Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualFinish()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualFinish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualDuration <em>Actual Duration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Duration</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualDuration()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualDuration();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualCost <em>Actual Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualCost()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualOvertimeCost <em>Actual Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualOvertimeCost()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualOvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualWork <em>Actual Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Work</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualWork()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualOvertimeWork <em>Actual Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualOvertimeWork()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualOvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getRegularWork <em>Regular Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Regular Work</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getRegularWork()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_RegularWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getRemainingDuration <em>Remaining Duration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Duration</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getRemainingDuration()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_RemainingDuration();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getRemainingCost <em>Remaining Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getRemainingCost()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_RemainingCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getRemainingWork <em>Remaining Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Work</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getRemainingWork()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_RemainingWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Overtime Cost</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getRemainingOvertimeCost()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_RemainingOvertimeCost();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Remaining Overtime Work</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getRemainingOvertimeWork()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_RemainingOvertimeWork();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getACWP <em>ACWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ACWP</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getACWP()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ACWP();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getCV <em>CV</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>CV</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getCV()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_CV();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getConstraintType <em>Constraint Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Constraint Type</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getConstraintType()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ConstraintType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getCalendarUID <em>Calendar UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Calendar UID</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getCalendarUID()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_CalendarUID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getConstraintDate <em>Constraint Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Constraint Date</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getConstraintDate()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ConstraintDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getDeadline <em>Deadline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Deadline</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getDeadline()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Deadline();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isLevelAssignments <em>Level Assignments</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Level Assignments</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isLevelAssignments()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_LevelAssignments();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isLevelingCanSplit <em>Leveling Can Split</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Leveling Can Split</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isLevelingCanSplit()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_LevelingCanSplit();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getLevelingDelay <em>Leveling Delay</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Leveling Delay</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getLevelingDelay()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_LevelingDelay();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getLevelingDelayFormat <em>Leveling Delay Format</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Leveling Delay Format</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getLevelingDelayFormat()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_LevelingDelayFormat();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getPreLeveledStart <em>Pre Leveled Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Pre Leveled Start</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getPreLeveledStart()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_PreLeveledStart();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getPreLeveledFinish <em>Pre Leveled Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Pre Leveled Finish</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getPreLeveledFinish()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_PreLeveledFinish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getHyperlink <em>Hyperlink</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getHyperlink()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Hyperlink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getHyperlinkAddress <em>Hyperlink Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink Address</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getHyperlinkAddress()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_HyperlinkAddress();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hyperlink Sub Address</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getHyperlinkSubAddress()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_HyperlinkSubAddress();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isIgnoreResourceCalendar <em>Ignore Resource Calendar</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Ignore Resource Calendar</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isIgnoreResourceCalendar()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_IgnoreResourceCalendar();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getNotes <em>Notes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Notes</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getNotes()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Notes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isHideBar <em>Hide Bar</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Hide Bar</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isHideBar()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_HideBar();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#isRollup <em>Rollup</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rollup</em>'.
-	 * @see org.eclipse.epf.msproject.Task#isRollup()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Rollup();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getBCWS <em>BCWS</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWS</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getBCWS()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_BCWS();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getBCWP <em>BCWP</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>BCWP</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getBCWP()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_BCWP();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getPhysicalPercentComplete <em>Physical Percent Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Physical Percent Complete</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getPhysicalPercentComplete()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_PhysicalPercentComplete();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getEarnedValueMethod <em>Earned Value Method</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Earned Value Method</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getEarnedValueMethod()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_EarnedValueMethod();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Task#getPredecessorLink <em>Predecessor Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Predecessor Link</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getPredecessorLink()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_PredecessorLink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualWorkProtected <em>Actual Work Protected</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Work Protected</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualWorkProtected()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualWorkProtected();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Task#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Actual Overtime Work Protected</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getActualOvertimeWorkProtected()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ActualOvertimeWorkProtected();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Task#getExtendedAttribute <em>Extended Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Extended Attribute</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getExtendedAttribute()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_ExtendedAttribute();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Task#getBaseline <em>Baseline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Baseline</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getBaseline()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_Baseline();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Task#getOutlineCode <em>Outline Code</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Outline Code</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getOutlineCode()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_OutlineCode();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Task#getTimephasedData <em>Timephased Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Timephased Data</em>'.
-	 * @see org.eclipse.epf.msproject.Task#getTimephasedData()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_TimephasedData();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Tasks <em>Tasks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tasks</em>'.
-	 * @see org.eclipse.epf.msproject.Tasks
-	 * @generated
-	 */
-	EClass getTasks();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Tasks#getTask <em>Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Task</em>'.
-	 * @see org.eclipse.epf.msproject.Tasks#getTask()
-	 * @see #getTasks()
-	 * @generated
-	 */
-	EReference getTasks_Task();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.TimePeriod <em>Time Period</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Time Period</em>'.
-	 * @see org.eclipse.epf.msproject.TimePeriod
-	 * @generated
-	 */
-	EClass getTimePeriod();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimePeriod#getFromDate <em>From Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>From Date</em>'.
-	 * @see org.eclipse.epf.msproject.TimePeriod#getFromDate()
-	 * @see #getTimePeriod()
-	 * @generated
-	 */
-	EAttribute getTimePeriod_FromDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimePeriod#getToDate <em>To Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>To Date</em>'.
-	 * @see org.eclipse.epf.msproject.TimePeriod#getToDate()
-	 * @see #getTimePeriod()
-	 * @generated
-	 */
-	EAttribute getTimePeriod_ToDate();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.TimephasedDataType <em>Timephased Data Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Timephased Data Type</em>'.
-	 * @see org.eclipse.epf.msproject.TimephasedDataType
-	 * @generated
-	 */
-	EClass getTimephasedDataType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimephasedDataType#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.msproject.TimephasedDataType#getType()
-	 * @see #getTimephasedDataType()
-	 * @generated
-	 */
-	EAttribute getTimephasedDataType_Type();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimephasedDataType#getUID <em>UID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>UID</em>'.
-	 * @see org.eclipse.epf.msproject.TimephasedDataType#getUID()
-	 * @see #getTimephasedDataType()
-	 * @generated
-	 */
-	EAttribute getTimephasedDataType_UID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimephasedDataType#getStart <em>Start</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start</em>'.
-	 * @see org.eclipse.epf.msproject.TimephasedDataType#getStart()
-	 * @see #getTimephasedDataType()
-	 * @generated
-	 */
-	EAttribute getTimephasedDataType_Start();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimephasedDataType#getFinish <em>Finish</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish</em>'.
-	 * @see org.eclipse.epf.msproject.TimephasedDataType#getFinish()
-	 * @see #getTimephasedDataType()
-	 * @generated
-	 */
-	EAttribute getTimephasedDataType_Finish();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimephasedDataType#getUnit <em>Unit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Unit</em>'.
-	 * @see org.eclipse.epf.msproject.TimephasedDataType#getUnit()
-	 * @see #getTimephasedDataType()
-	 * @generated
-	 */
-	EAttribute getTimephasedDataType_Unit();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.TimephasedDataType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.TimephasedDataType#getValue()
-	 * @see #getTimephasedDataType()
-	 * @generated
-	 */
-	EAttribute getTimephasedDataType_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Value <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.Value
-	 * @generated
-	 */
-	EClass getValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Value#getValueID <em>Value ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value ID</em>'.
-	 * @see org.eclipse.epf.msproject.Value#getValueID()
-	 * @see #getValue()
-	 * @generated
-	 */
-	EAttribute getValue_ValueID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Value#getParentValueID <em>Parent Value ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Parent Value ID</em>'.
-	 * @see org.eclipse.epf.msproject.Value#getParentValueID()
-	 * @see #getValue()
-	 * @generated
-	 */
-	EAttribute getValue_ParentValueID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Value#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.Value#getValue()
-	 * @see #getValue()
-	 * @generated
-	 */
-	EAttribute getValue_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Value#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Description</em>'.
-	 * @see org.eclipse.epf.msproject.Value#getDescription()
-	 * @see #getValue()
-	 * @generated
-	 */
-	EAttribute getValue_Description();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Value2 <em>Value2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Value2</em>'.
-	 * @see org.eclipse.epf.msproject.Value2
-	 * @generated
-	 */
-	EClass getValue2();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Value2#getID <em>ID</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>ID</em>'.
-	 * @see org.eclipse.epf.msproject.Value2#getID()
-	 * @see #getValue2()
-	 * @generated
-	 */
-	EAttribute getValue2_ID();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Value2#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.Value2#getValue()
-	 * @see #getValue2()
-	 * @generated
-	 */
-	EAttribute getValue2_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.Value2#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Description</em>'.
-	 * @see org.eclipse.epf.msproject.Value2#getDescription()
-	 * @see #getValue2()
-	 * @generated
-	 */
-	EAttribute getValue2_Description();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.ValueList <em>Value List</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Value List</em>'.
-	 * @see org.eclipse.epf.msproject.ValueList
-	 * @generated
-	 */
-	EClass getValueList();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.ValueList#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.ValueList#getValue()
-	 * @see #getValueList()
-	 * @generated
-	 */
-	EReference getValueList_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.Values <em>Values</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Values</em>'.
-	 * @see org.eclipse.epf.msproject.Values
-	 * @generated
-	 */
-	EClass getValues();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.msproject.Values#getGroup <em>Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group</em>'.
-	 * @see org.eclipse.epf.msproject.Values#getGroup()
-	 * @see #getValues()
-	 * @generated
-	 */
-	EAttribute getValues_Group();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.Values#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Value</em>'.
-	 * @see org.eclipse.epf.msproject.Values#getValue()
-	 * @see #getValues()
-	 * @generated
-	 */
-	EReference getValues_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.WBSMask <em>WBS Mask</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>WBS Mask</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMask
-	 * @generated
-	 */
-	EClass getWBSMask();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WBSMask#getLevel <em>Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Level</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMask#getLevel()
-	 * @see #getWBSMask()
-	 * @generated
-	 */
-	EAttribute getWBSMask_Level();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WBSMask#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMask#getType()
-	 * @see #getWBSMask()
-	 * @generated
-	 */
-	EAttribute getWBSMask_Type();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WBSMask#getLength <em>Length</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Length</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMask#getLength()
-	 * @see #getWBSMask()
-	 * @generated
-	 */
-	EAttribute getWBSMask_Length();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WBSMask#getSeparator <em>Separator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Separator</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMask#getSeparator()
-	 * @see #getWBSMask()
-	 * @generated
-	 */
-	EAttribute getWBSMask_Separator();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.WBSMasks <em>WBS Masks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>WBS Masks</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMasks
-	 * @generated
-	 */
-	EClass getWBSMasks();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WBSMasks#isVerifyUniqueCodes <em>Verify Unique Codes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Verify Unique Codes</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMasks#isVerifyUniqueCodes()
-	 * @see #getWBSMasks()
-	 * @generated
-	 */
-	EAttribute getWBSMasks_VerifyUniqueCodes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WBSMasks#isGenerateCodes <em>Generate Codes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Generate Codes</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMasks#isGenerateCodes()
-	 * @see #getWBSMasks()
-	 * @generated
-	 */
-	EAttribute getWBSMasks_GenerateCodes();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WBSMasks#getPrefix <em>Prefix</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Prefix</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMasks#getPrefix()
-	 * @see #getWBSMasks()
-	 * @generated
-	 */
-	EAttribute getWBSMasks_Prefix();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.WBSMasks#getWBSMask <em>WBS Mask</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>WBS Mask</em>'.
-	 * @see org.eclipse.epf.msproject.WBSMasks#getWBSMask()
-	 * @see #getWBSMasks()
-	 * @generated
-	 */
-	EReference getWBSMasks_WBSMask();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.WeekDay <em>Week Day</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Week Day</em>'.
-	 * @see org.eclipse.epf.msproject.WeekDay
-	 * @generated
-	 */
-	EClass getWeekDay();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WeekDay#getDayType <em>Day Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Day Type</em>'.
-	 * @see org.eclipse.epf.msproject.WeekDay#getDayType()
-	 * @see #getWeekDay()
-	 * @generated
-	 */
-	EAttribute getWeekDay_DayType();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WeekDay#isDayWorking <em>Day Working</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Day Working</em>'.
-	 * @see org.eclipse.epf.msproject.WeekDay#isDayWorking()
-	 * @see #getWeekDay()
-	 * @generated
-	 */
-	EAttribute getWeekDay_DayWorking();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.WeekDay#getTimePeriod <em>Time Period</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Time Period</em>'.
-	 * @see org.eclipse.epf.msproject.WeekDay#getTimePeriod()
-	 * @see #getWeekDay()
-	 * @generated
-	 */
-	EReference getWeekDay_TimePeriod();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.msproject.WeekDay#getWorkingTimes <em>Working Times</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Working Times</em>'.
-	 * @see org.eclipse.epf.msproject.WeekDay#getWorkingTimes()
-	 * @see #getWeekDay()
-	 * @generated
-	 */
-	EReference getWeekDay_WorkingTimes();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.WeekDays <em>Week Days</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Week Days</em>'.
-	 * @see org.eclipse.epf.msproject.WeekDays
-	 * @generated
-	 */
-	EClass getWeekDays();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.WeekDays#getWeekDay <em>Week Day</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Week Day</em>'.
-	 * @see org.eclipse.epf.msproject.WeekDays#getWeekDay()
-	 * @see #getWeekDays()
-	 * @generated
-	 */
-	EReference getWeekDays_WeekDay();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.WorkingTime <em>Working Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Working Time</em>'.
-	 * @see org.eclipse.epf.msproject.WorkingTime
-	 * @generated
-	 */
-	EClass getWorkingTime();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WorkingTime#getFromTime <em>From Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>From Time</em>'.
-	 * @see org.eclipse.epf.msproject.WorkingTime#getFromTime()
-	 * @see #getWorkingTime()
-	 * @generated
-	 */
-	EAttribute getWorkingTime_FromTime();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.msproject.WorkingTime#getToTime <em>To Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>To Time</em>'.
-	 * @see org.eclipse.epf.msproject.WorkingTime#getToTime()
-	 * @see #getWorkingTime()
-	 * @generated
-	 */
-	EAttribute getWorkingTime_ToTime();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.msproject.WorkingTimes <em>Working Times</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Working Times</em>'.
-	 * @see org.eclipse.epf.msproject.WorkingTimes
-	 * @generated
-	 */
-	EClass getWorkingTimes();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.msproject.WorkingTimes#getWorkingTime <em>Working Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Working Time</em>'.
-	 * @see org.eclipse.epf.msproject.WorkingTimes#getWorkingTime()
-	 * @see #getWorkingTimes()
-	 * @generated
-	 */
-	EReference getWorkingTimes_WorkingTime();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Accrue At</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Accrue At</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='AccrueAt_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3'" 
-	 * @generated
-	 */
-	EDataType getAccrueAt();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Active Directory GUID Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Active Directory GUID Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='ActiveDirectoryGUID_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='16'" 
-	 * @generated
-	 */
-	EDataType getActiveDirectoryGUIDType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Alias Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Alias Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Alias_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='50'" 
-	 * @generated
-	 */
-	EDataType getAliasType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Author Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Author Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Author_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getAuthorType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Baseline For Earned Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Baseline For Earned Value Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='BaselineForEarnedValue_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4 5 6 7 8 9 10'" 
-	 * @generated
-	 */
-	EDataType getBaselineForEarnedValueType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Booking Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Booking Type Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='BookingType_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getBookingTypeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Booking Type Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Booking Type Type1</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='BookingType_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getBookingTypeType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Calculation Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Calculation Type Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='CalculationType_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2'" 
-	 * @generated
-	 */
-	EDataType getCalculationTypeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Category Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Category Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Category_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getCategoryType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Code Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Code Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Code_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getCodeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Company Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Company Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Company_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getCompanyType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Constraint Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Constraint Type Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='ConstraintType_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4 5 6 7'" 
-	 * @generated
-	 */
-	EDataType getConstraintTypeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Contact Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Contact Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Contact_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getContactType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Cost Rate Table Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Cost Rate Table Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='CostRateTable_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4'" 
-	 * @generated
-	 */
-	EDataType getCostRateTableType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Currency Symbol Position Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Currency Symbol Position Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='CurrencySymbolPosition_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3'" 
-	 * @generated
-	 */
-	EDataType getCurrencySymbolPositionType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Currency Symbol Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Currency Symbol Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='CurrencySymbol_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='20'" 
-	 * @generated
-	 */
-	EDataType getCurrencySymbolType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Day Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Day Type Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DayType_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4 5 6 7'" 
-	 * @generated
-	 */
-	EDataType getDayTypeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Default Fixed Cost Accrual Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Default Fixed Cost Accrual Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DefaultFixedCostAccrual_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3'" 
-	 * @generated
-	 */
-	EDataType getDefaultFixedCostAccrualType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Default Task EV Method Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Default Task EV Method Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DefaultTaskEVMethod_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getDefaultTaskEVMethodType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Default Task Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Default Task Type Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DefaultTaskType_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2'" 
-	 * @generated
-	 */
-	EDataType getDefaultTaskTypeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Duration Format Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Duration Format Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DurationFormat_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getDurationFormatType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Duration Format Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Duration Format Type1</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DurationFormat_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getDurationFormatType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Duration Format Type2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Duration Format Type2</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DurationFormat_._2_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getDurationFormatType2();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Duration Format Type3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Duration Format Type3</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DurationFormat_._3_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getDurationFormatType3();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Duration Format Type4</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Duration Format Type4</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DurationFormat_._4_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getDurationFormatType4();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Duration Format Type5</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Duration Format Type5</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='DurationFormat_._5_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getDurationFormatType5();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Earned Value Method Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Earned Value Method Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='EarnedValueMethod_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getEarnedValueMethodType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Earned Value Method Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Earned Value Method Type1</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='EarnedValueMethod_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getEarnedValueMethodType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Email Address Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Email Address Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='EmailAddress_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getEmailAddressType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>External Task Project Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>External Task Project Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='ExternalTaskProject_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getExternalTaskProjectType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Fixed Cost Accrual Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Fixed Cost Accrual Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='FixedCostAccrual_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' enumeration='1 2 3'" 
-	 * @generated
-	 */
-	EDataType getFixedCostAccrualType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>FY Start Date Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>FY Start Date Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='FYStartDate_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3 4 5 6 7 8 9 10 11 12'" 
-	 * @generated
-	 */
-	EDataType getFYStartDateType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Group Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Group Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Group_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getGroupType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Address Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Address Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='HyperlinkAddress_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkAddressType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Address Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Address Type1</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='HyperlinkAddress_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkAddressType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Address Type2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Address Type2</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='HyperlinkAddress_._2_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkAddressType2();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Sub Address Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Sub Address Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='HyperlinkSubAddress_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkSubAddressType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Sub Address Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Sub Address Type1</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='HyperlinkSubAddress_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkSubAddressType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Sub Address Type2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Sub Address Type2</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='HyperlinkSubAddress_._2_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkSubAddressType2();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Hyperlink_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Type1</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Hyperlink_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Hyperlink Type2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Hyperlink Type2</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Hyperlink_._2_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getHyperlinkType2();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Initials Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Initials Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Initials_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getInitialsType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Lag Format Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Lag Format Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='LagFormat_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getLagFormatType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Leveling Delay Format Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Leveling Delay Format Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='LevelingDelayFormat_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getLevelingDelayFormatType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Leveling Delay Format Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Leveling Delay Format Type1</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='LevelingDelayFormat_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53'" 
-	 * @generated
-	 */
-	EDataType getLevelingDelayFormatType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Manager Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Manager Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Manager_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getManagerType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Material Label Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Material Label Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='MaterialLabel_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getMaterialLabelType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Name Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Name_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getNameType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Name Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Name Type1</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Name_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getNameType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Name Type2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Name Type2</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Name_._2_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getNameType2();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Name Type3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Name Type3</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Name_._3_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='255'" 
-	 * @generated
-	 */
-	EDataType getNameType3();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>New Task Start Date Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>New Task Start Date Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='NewTaskStartDate_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getNewTaskStartDateType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>NT Account Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>NT Account Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='NTAccount_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getNTAccountType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Outline Number Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Outline Number Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='OutlineNumber_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getOutlineNumberType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Overtime Rate Format Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Overtime Rate Format Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='OvertimeRateFormat_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3 4 5 7'" 
-	 * @generated
-	 */
-	EDataType getOvertimeRateFormatType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Overtime Rate Format Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Overtime Rate Format Type1</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='OvertimeRateFormat_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3 4 5 7'" 
-	 * @generated
-	 */
-	EDataType getOvertimeRateFormatType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Phonetic Alias Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Phonetic Alias Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='PhoneticAlias_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='50'" 
-	 * @generated
-	 */
-	EDataType getPhoneticAliasType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Phonetics Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Phonetics Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Phonetics_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getPhoneticsType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Prefix Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Prefix Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Prefix_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='50'" 
-	 * @generated
-	 */
-	EDataType getPrefixType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Rate Table Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Rate Table Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='RateTable_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4'" 
-	 * @generated
-	 */
-	EDataType getRateTableType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Rollup Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Rollup Type Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='RollupType_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4 5 6 7'" 
-	 * @generated
-	 */
-	EDataType getRollupTypeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Standard Rate Format Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Standard Rate Format Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='StandardRateFormat_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3 4 5 7'" 
-	 * @generated
-	 */
-	EDataType getStandardRateFormatType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Standard Rate Format Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Standard Rate Format Type1</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='StandardRateFormat_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3 4 5 7 8'" 
-	 * @generated
-	 */
-	EDataType getStandardRateFormatType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Subject Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Subject Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Subject_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getSubjectType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Subproject Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Subproject Name Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='SubprojectName_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getSubprojectNameType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>Title Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Title Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='Title_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='512'" 
-	 * @generated
-	 */
-	EDataType getTitleType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Type Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='Type_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2'" 
-	 * @generated
-	 */
-	EDataType getTypeType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Type Type1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Type Type1</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='Type_._1_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3'" 
-	 * @generated
-	 */
-	EDataType getTypeType1();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Type Type2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Type Type2</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='Type_._2_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3'" 
-	 * @generated
-	 */
-	EDataType getTypeType2();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Type Type3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Type Type3</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='Type_._3_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3 4 5 6 7 8 9 10 11 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76'" 
-	 * @generated
-	 */
-	EDataType getTypeType3();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Type Type4</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Type Type4</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='Type_._4_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getTypeType4();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Type Type5</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Type Type5</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='Type_._5_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3'" 
-	 * @generated
-	 */
-	EDataType getTypeType5();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>UID Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>UID Type</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 *        extendedMetaData="name='UID_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#string' maxLength='16'" 
-	 * @generated
-	 */
-	EDataType getUIDType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Unit Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Unit Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='Unit_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 5 8'" 
-	 * @generated
-	 */
-	EDataType getUnitType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Valuelist Sort Order Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Valuelist Sort Order Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='ValuelistSortOrder_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1'" 
-	 * @generated
-	 */
-	EDataType getValuelistSortOrderType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Week Start Day Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Week Start Day Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='WeekStartDay_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4 5 6'" 
-	 * @generated
-	 */
-	EDataType getWeekStartDayType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Work Contour Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Work Contour Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='WorkContour_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3 4 5 6 7 8'" 
-	 * @generated
-	 */
-	EDataType getWorkContourType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Work Format Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Work Format Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='WorkFormat_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='1 2 3 4 5'" 
-	 * @generated
-	 */
-	EDataType getWorkFormatType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.math.BigInteger <em>Work Group Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Work Group Type</em>'.
-	 * @see java.math.BigInteger
-	 * @model instanceClass="java.math.BigInteger"
-	 *        extendedMetaData="name='WorkGroup_._type' baseType='http://www.eclipse.org/emf/2003/XMLType#integer' enumeration='0 1 2 3'" 
-	 * @generated
-	 */
-	EDataType getWorkGroupType();
-
-	/**
-	 * 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
-	 */
-	MsprojectFactory getMsprojectFactory();
-
-} //MsprojectPackage
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode.java
deleted file mode 100644
index de19af4..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCode.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Outline Code</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#getFieldName <em>Field Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#getAlias <em>Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#getPhoneticAlias <em>Phonetic Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#getValues <em>Values</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#isEnterprise <em>Enterprise</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#getEnterpriseOutlineCodeAlias <em>Enterprise Outline Code Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#isResourceSubstitutionEnabled <em>Resource Substitution Enabled</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#isLeafOnly <em>Leaf Only</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#isAllLevelsRequired <em>All Levels Required</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#isOnlyTableValuesAllowed <em>Only Table Values Allowed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode#getMasks <em>Masks</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode()
- * @model extendedMetaData="name='OutlineCode_._type' kind='elementOnly'"
- * @generated
- */
-public interface OutlineCode extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Coresponds to the field number of outline code.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field ID</em>' attribute.
-	 * @see #setFieldID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_FieldID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#getFieldID <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field ID</em>' attribute.
-	 * @see #getFieldID()
-	 * @generated
-	 */
-	void setFieldID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Field Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The name of the custom outline code.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field Name</em>' attribute.
-	 * @see #setFieldName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_FieldName()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldName' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#getFieldName <em>Field Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field Name</em>' attribute.
-	 * @see #getFieldName()
-	 * @generated
-	 */
-	void setFieldName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The alias of the custom outline code.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Alias</em>' attribute.
-	 * @see #setAlias(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_Alias()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Alias' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getAlias();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#getAlias <em>Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Alias</em>' attribute.
-	 * @see #getAlias()
-	 * @generated
-	 */
-	void setAlias(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Phonetic Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The phonetic pronunciation of the alias of the custom outline code.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Phonetic Alias</em>' attribute.
-	 * @see #setPhoneticAlias(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_PhoneticAlias()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='PhoneticAlias' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getPhoneticAlias();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#getPhoneticAlias <em>Phonetic Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Phonetic Alias</em>' attribute.
-	 * @see #getPhoneticAlias()
-	 * @generated
-	 */
-	void setPhoneticAlias(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Values</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The values of the table associated with this outline code.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Values</em>' containment reference.
-	 * @see #setValues(Values)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_Values()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Values' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Values getValues();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#getValues <em>Values</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Values</em>' containment reference.
-	 * @see #getValues()
-	 * @generated
-	 */
-	void setValues(Values value);
-
-	/**
-	 * Returns the value of the '<em><b>Enterprise</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Indicates whether the custom outline code is an enterprise custom outline code.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Enterprise</em>' attribute.
-	 * @see #isSetEnterprise()
-	 * @see #unsetEnterprise()
-	 * @see #setEnterprise(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_Enterprise()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Enterprise' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isEnterprise();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isEnterprise <em>Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Enterprise</em>' attribute.
-	 * @see #isSetEnterprise()
-	 * @see #unsetEnterprise()
-	 * @see #isEnterprise()
-	 * @generated
-	 */
-	void setEnterprise(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isEnterprise <em>Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetEnterprise()
-	 * @see #isEnterprise()
-	 * @see #setEnterprise(boolean)
-	 * @generated
-	 */
-	void unsetEnterprise();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isEnterprise <em>Enterprise</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Enterprise</em>' attribute is set.
-	 * @see #unsetEnterprise()
-	 * @see #isEnterprise()
-	 * @see #setEnterprise(boolean)
-	 * @generated
-	 */
-	boolean isSetEnterprise();
-
-	/**
-	 * Returns the value of the '<em><b>Enterprise Outline Code Alias</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A reference to another custom field for which this is an alias.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Enterprise Outline Code Alias</em>' attribute.
-	 * @see #setEnterpriseOutlineCodeAlias(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_EnterpriseOutlineCodeAlias()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='EnterpriseOutlineCodeAlias' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getEnterpriseOutlineCodeAlias();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#getEnterpriseOutlineCodeAlias <em>Enterprise Outline Code Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Enterprise Outline Code Alias</em>' attribute.
-	 * @see #getEnterpriseOutlineCodeAlias()
-	 * @generated
-	 */
-	void setEnterpriseOutlineCodeAlias(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Resource Substitution Enabled</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the custom outline code can be used by the Resource Substitution Wizard in Microsoft Project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resource Substitution Enabled</em>' attribute.
-	 * @see #isSetResourceSubstitutionEnabled()
-	 * @see #unsetResourceSubstitutionEnabled()
-	 * @see #setResourceSubstitutionEnabled(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_ResourceSubstitutionEnabled()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='ResourceSubstitutionEnabled' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isResourceSubstitutionEnabled();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isResourceSubstitutionEnabled <em>Resource Substitution Enabled</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resource Substitution Enabled</em>' attribute.
-	 * @see #isSetResourceSubstitutionEnabled()
-	 * @see #unsetResourceSubstitutionEnabled()
-	 * @see #isResourceSubstitutionEnabled()
-	 * @generated
-	 */
-	void setResourceSubstitutionEnabled(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isResourceSubstitutionEnabled <em>Resource Substitution Enabled</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetResourceSubstitutionEnabled()
-	 * @see #isResourceSubstitutionEnabled()
-	 * @see #setResourceSubstitutionEnabled(boolean)
-	 * @generated
-	 */
-	void unsetResourceSubstitutionEnabled();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isResourceSubstitutionEnabled <em>Resource Substitution Enabled</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Resource Substitution Enabled</em>' attribute is set.
-	 * @see #unsetResourceSubstitutionEnabled()
-	 * @see #isResourceSubstitutionEnabled()
-	 * @see #setResourceSubstitutionEnabled(boolean)
-	 * @generated
-	 */
-	boolean isSetResourceSubstitutionEnabled();
-
-	/**
-	 * Returns the value of the '<em><b>Leaf Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether or not values specified in this outline code field must be leaf values.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Leaf Only</em>' attribute.
-	 * @see #isSetLeafOnly()
-	 * @see #unsetLeafOnly()
-	 * @see #setLeafOnly(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_LeafOnly()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='LeafOnly' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isLeafOnly();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isLeafOnly <em>Leaf Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Leaf Only</em>' attribute.
-	 * @see #isSetLeafOnly()
-	 * @see #unsetLeafOnly()
-	 * @see #isLeafOnly()
-	 * @generated
-	 */
-	void setLeafOnly(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isLeafOnly <em>Leaf Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLeafOnly()
-	 * @see #isLeafOnly()
-	 * @see #setLeafOnly(boolean)
-	 * @generated
-	 */
-	void unsetLeafOnly();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isLeafOnly <em>Leaf Only</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Leaf Only</em>' attribute is set.
-	 * @see #unsetLeafOnly()
-	 * @see #isLeafOnly()
-	 * @see #setLeafOnly(boolean)
-	 * @generated
-	 */
-	boolean isSetLeafOnly();
-
-	/**
-	 * Returns the value of the '<em><b>All Levels Required</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * New codes must have all levels present.  Not available for Enterprise Codes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>All Levels Required</em>' attribute.
-	 * @see #isSetAllLevelsRequired()
-	 * @see #unsetAllLevelsRequired()
-	 * @see #setAllLevelsRequired(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_AllLevelsRequired()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='AllLevelsRequired' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isAllLevelsRequired();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isAllLevelsRequired <em>All Levels Required</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>All Levels Required</em>' attribute.
-	 * @see #isSetAllLevelsRequired()
-	 * @see #unsetAllLevelsRequired()
-	 * @see #isAllLevelsRequired()
-	 * @generated
-	 */
-	void setAllLevelsRequired(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isAllLevelsRequired <em>All Levels Required</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetAllLevelsRequired()
-	 * @see #isAllLevelsRequired()
-	 * @see #setAllLevelsRequired(boolean)
-	 * @generated
-	 */
-	void unsetAllLevelsRequired();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isAllLevelsRequired <em>All Levels Required</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>All Levels Required</em>' attribute is set.
-	 * @see #unsetAllLevelsRequired()
-	 * @see #isAllLevelsRequired()
-	 * @see #setAllLevelsRequired(boolean)
-	 * @generated
-	 */
-	boolean isSetAllLevelsRequired();
-
-	/**
-	 * Returns the value of the '<em><b>Only Table Values Allowed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether values specified must come from values table.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Only Table Values Allowed</em>' attribute.
-	 * @see #isSetOnlyTableValuesAllowed()
-	 * @see #unsetOnlyTableValuesAllowed()
-	 * @see #setOnlyTableValuesAllowed(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_OnlyTableValuesAllowed()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='OnlyTableValuesAllowed' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isOnlyTableValuesAllowed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isOnlyTableValuesAllowed <em>Only Table Values Allowed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Only Table Values Allowed</em>' attribute.
-	 * @see #isSetOnlyTableValuesAllowed()
-	 * @see #unsetOnlyTableValuesAllowed()
-	 * @see #isOnlyTableValuesAllowed()
-	 * @generated
-	 */
-	void setOnlyTableValuesAllowed(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isOnlyTableValuesAllowed <em>Only Table Values Allowed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetOnlyTableValuesAllowed()
-	 * @see #isOnlyTableValuesAllowed()
-	 * @see #setOnlyTableValuesAllowed(boolean)
-	 * @generated
-	 */
-	void unsetOnlyTableValuesAllowed();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.OutlineCode#isOnlyTableValuesAllowed <em>Only Table Values Allowed</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Only Table Values Allowed</em>' attribute is set.
-	 * @see #unsetOnlyTableValuesAllowed()
-	 * @see #isOnlyTableValuesAllowed()
-	 * @see #setOnlyTableValuesAllowed(boolean)
-	 * @generated
-	 */
-	boolean isSetOnlyTableValuesAllowed();
-
-	/**
-	 * Returns the value of the '<em><b>Masks</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The table of entries that define the outline code mask.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Masks</em>' containment reference.
-	 * @see #setMasks(Masks)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode_Masks()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Masks' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Masks getMasks();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode#getMasks <em>Masks</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Masks</em>' containment reference.
-	 * @see #getMasks()
-	 * @generated
-	 */
-	void setMasks(Masks value);
-
-} // OutlineCode
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode2.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode2.java
deleted file mode 100644
index a0301b2..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode2.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCode2.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Outline Code2</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode2#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode2#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode2#getValueID <em>Value ID</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode2()
- * @model extendedMetaData="name='OutlineCode_._1_._type' kind='elementOnly'"
- * @generated
- */
-public interface OutlineCode2 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the value in the outline code collection.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode2_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode2#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The field ID in the localised language.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field ID</em>' attribute.
-	 * @see #setFieldID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode2_FieldID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode2#getFieldID <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field ID</em>' attribute.
-	 * @see #getFieldID()
-	 * @generated
-	 */
-	void setFieldID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID in the value list associated with the definition in the 
-	 *                                             outline code collection.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value ID</em>' attribute.
-	 * @see #setValueID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode2_ValueID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ValueID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getValueID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode2#getValueID <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value ID</em>' attribute.
-	 * @see #getValueID()
-	 * @generated
-	 */
-	void setValueID(BigInteger value);
-
-} // OutlineCode2
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode3.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode3.java
deleted file mode 100644
index a65e833..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCode3.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCode3.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Outline Code3</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode3#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode3#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCode3#getValueID <em>Value ID</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode3()
- * @model extendedMetaData="name='OutlineCode_._2_._type' kind='elementOnly'"
- * @generated
- */
-public interface OutlineCode3 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the value in the outline code collection.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode3_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode3#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Field ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The field ID in the localised language.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Field ID</em>' attribute.
-	 * @see #setFieldID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode3_FieldID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='FieldID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFieldID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode3#getFieldID <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Field ID</em>' attribute.
-	 * @see #getFieldID()
-	 * @generated
-	 */
-	void setFieldID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID in the value list associated with the definition 
-	 *                                             in the outline code collection.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value ID</em>' attribute.
-	 * @see #setValueID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCode3_ValueID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ValueID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getValueID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.OutlineCode3#getValueID <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value ID</em>' attribute.
-	 * @see #getValueID()
-	 * @generated
-	 */
-	void setValueID(BigInteger value);
-
-} // OutlineCode3
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCodes.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCodes.java
deleted file mode 100644
index e06862e..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/OutlineCodes.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCodes.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Outline Codes</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.OutlineCodes#getOutlineCode <em>Outline Code</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCodes()
- * @model extendedMetaData="name='OutlineCodes_._type' kind='elementOnly'"
- * @generated
- */
-public interface OutlineCodes extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Outline Code</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.OutlineCode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The individual outline codes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Outline Code</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getOutlineCodes_OutlineCode()
-	 * @model type="org.eclipse.epf.msproject.OutlineCode" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='OutlineCode' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getOutlineCode();
-
-} // OutlineCodes
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/PredecessorLink.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/PredecessorLink.java
deleted file mode 100644
index 0ccab7e..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/PredecessorLink.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PredecessorLink.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Predecessor Link</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.PredecessorLink#getPredecessorUID <em>Predecessor UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.PredecessorLink#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.PredecessorLink#isCrossProject <em>Cross Project</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.PredecessorLink#getCrossProjectName <em>Cross Project Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.PredecessorLink#getLinkLag <em>Link Lag</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.PredecessorLink#getLagFormat <em>Lag Format</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getPredecessorLink()
- * @model extendedMetaData="name='PredecessorLink_._type' kind='elementOnly'"
- * @generated
- */
-public interface PredecessorLink extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Predecessor UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the predecessor task.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Predecessor UID</em>' attribute.
-	 * @see #setPredecessorUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getPredecessorLink_PredecessorUID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='PredecessorUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getPredecessorUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#getPredecessorUID <em>Predecessor UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Predecessor UID</em>' attribute.
-	 * @see #getPredecessorUID()
-	 * @generated
-	 */
-	void setPredecessorUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The link type.  Values are 0=FF, 1=FS, 2=SF and 3=SS
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see #setType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getPredecessorLink_Type()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.TypeType1"
-	 *        extendedMetaData="kind='element' name='Type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Cross Project</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the predecessor is part of another project.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cross Project</em>' attribute.
-	 * @see #isSetCrossProject()
-	 * @see #unsetCrossProject()
-	 * @see #setCrossProject(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getPredecessorLink_CrossProject()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='CrossProject' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isCrossProject();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#isCrossProject <em>Cross Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cross Project</em>' attribute.
-	 * @see #isSetCrossProject()
-	 * @see #unsetCrossProject()
-	 * @see #isCrossProject()
-	 * @generated
-	 */
-	void setCrossProject(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#isCrossProject <em>Cross Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCrossProject()
-	 * @see #isCrossProject()
-	 * @see #setCrossProject(boolean)
-	 * @generated
-	 */
-	void unsetCrossProject();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#isCrossProject <em>Cross Project</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Cross Project</em>' attribute is set.
-	 * @see #unsetCrossProject()
-	 * @see #isCrossProject()
-	 * @see #setCrossProject(boolean)
-	 * @generated
-	 */
-	boolean isSetCrossProject();
-
-	/**
-	 * Returns the value of the '<em><b>Cross Project Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The external predecessor project.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cross Project Name</em>' attribute.
-	 * @see #setCrossProjectName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getPredecessorLink_CrossProjectName()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='CrossProjectName' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getCrossProjectName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#getCrossProjectName <em>Cross Project Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cross Project Name</em>' attribute.
-	 * @see #getCrossProjectName()
-	 * @generated
-	 */
-	void setCrossProjectName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Link Lag</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of lag in tenths of a minute.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Link Lag</em>' attribute.
-	 * @see #setLinkLag(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getPredecessorLink_LinkLag()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='LinkLag' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLinkLag();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#getLinkLag <em>Link Lag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Link Lag</em>' attribute.
-	 * @see #getLinkLag()
-	 * @generated
-	 */
-	void setLinkLag(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Lag Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the lag format.  
-	 *                                             Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 
-	 *                                             20=e%, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 
-	 *                                             44=emo?, 51=%?, 52=e%? and 53=null.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Lag Format</em>' attribute.
-	 * @see #setLagFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getPredecessorLink_LagFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.LagFormatType"
-	 *        extendedMetaData="kind='element' name='LagFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLagFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.PredecessorLink#getLagFormat <em>Lag Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lag Format</em>' attribute.
-	 * @see #getLagFormat()
-	 * @generated
-	 */
-	void setLagFormat(BigInteger value);
-
-} // PredecessorLink
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Project.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Project.java
deleted file mode 100644
index 1880703..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Project.java
+++ /dev/null
@@ -1,2621 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Project.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Project</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Project#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getTitle <em>Title</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getSubject <em>Subject</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCategory <em>Category</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCompany <em>Company</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getManager <em>Manager</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getAuthor <em>Author</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCreationDate <em>Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getRevision <em>Revision</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getLastSaved <em>Last Saved</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isScheduleFromStart <em>Schedule From Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getStartDate <em>Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getFinishDate <em>Finish Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getFYStartDate <em>FY Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCriticalSlackLimit <em>Critical Slack Limit</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCurrencyDigits <em>Currency Digits</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCurrencySymbol <em>Currency Symbol</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCurrencySymbolPosition <em>Currency Symbol Position</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCalendarUID <em>Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDefaultStartTime <em>Default Start Time</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDefaultFinishTime <em>Default Finish Time</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getMinutesPerDay <em>Minutes Per Day</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getMinutesPerWeek <em>Minutes Per Week</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDaysPerMonth <em>Days Per Month</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDefaultTaskType <em>Default Task Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDefaultFixedCostAccrual <em>Default Fixed Cost Accrual</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDefaultStandardRate <em>Default Standard Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDefaultOvertimeRate <em>Default Overtime Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDurationFormat <em>Duration Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getWorkFormat <em>Work Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isEditableActualCosts <em>Editable Actual Costs</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isHonorConstraints <em>Honor Constraints</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getEarnedValueMethod <em>Earned Value Method</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isInsertedProjectsLikeSummary <em>Inserted Projects Like Summary</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isMultipleCriticalPaths <em>Multiple Critical Paths</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isNewTasksEffortDriven <em>New Tasks Effort Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isNewTasksEstimated <em>New Tasks Estimated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isSplitsInProgressTasks <em>Splits In Progress Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isSpreadActualCost <em>Spread Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isSpreadPercentComplete <em>Spread Percent Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isTaskUpdatesResource <em>Task Updates Resource</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isFiscalYearStart <em>Fiscal Year Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getWeekStartDay <em>Week Start Day</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsBack <em>Move Completed Ends Back</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsBack <em>Move Remaining Starts Back</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsForward <em>Move Remaining Starts Forward</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsForward <em>Move Completed Ends Forward</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getBaselineForEarnedValue <em>Baseline For Earned Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isAutoAddNewResourcesAndTasks <em>Auto Add New Resources And Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getStatusDate <em>Status Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCurrentDate <em>Current Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isMicrosoftProjectServerURL <em>Microsoft Project Server URL</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isAutolink <em>Autolink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getNewTaskStartDate <em>New Task Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getDefaultTaskEVMethod <em>Default Task EV Method</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isProjectExternallyEdited <em>Project Externally Edited</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getExtendedCreationDate <em>Extended Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isActualsInSync <em>Actuals In Sync</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isRemoveFileProperties <em>Remove File Properties</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#isAdminProject <em>Admin Project</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getOutlineCodes <em>Outline Codes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getWBSMasks <em>WBS Masks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getExtendedAttributes <em>Extended Attributes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getCalendars <em>Calendars</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getTasks <em>Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getResources <em>Resources</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Project#getAssignments <em>Assignments</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getProject()
- * @model extendedMetaData="name='Project_._type' kind='elementOnly'"
- * @generated
- */
-public interface Project extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_UID()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.UIDType"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The name of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Name()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.NameType3"
-	 *        extendedMetaData="kind='element' name='Name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Title</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The title of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Title</em>' attribute.
-	 * @see #setTitle(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Title()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.TitleType"
-	 *        extendedMetaData="kind='element' name='Title' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getTitle();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getTitle <em>Title</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Title</em>' attribute.
-	 * @see #getTitle()
-	 * @generated
-	 */
-	void setTitle(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Subject</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The subject of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Subject</em>' attribute.
-	 * @see #setSubject(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Subject()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.SubjectType"
-	 *        extendedMetaData="kind='element' name='Subject' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getSubject();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getSubject <em>Subject</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Subject</em>' attribute.
-	 * @see #getSubject()
-	 * @generated
-	 */
-	void setSubject(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Category</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The category of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Category</em>' attribute.
-	 * @see #setCategory(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Category()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.CategoryType"
-	 *        extendedMetaData="kind='element' name='Category' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getCategory();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCategory <em>Category</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Category</em>' attribute.
-	 * @see #getCategory()
-	 * @generated
-	 */
-	void setCategory(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Company</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The company that owns the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Company</em>' attribute.
-	 * @see #setCompany(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Company()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.CompanyType"
-	 *        extendedMetaData="kind='element' name='Company' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getCompany();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCompany <em>Company</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Company</em>' attribute.
-	 * @see #getCompany()
-	 * @generated
-	 */
-	void setCompany(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Manager</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The manager of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Manager</em>' attribute.
-	 * @see #setManager(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Manager()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.ManagerType"
-	 *        extendedMetaData="kind='element' name='Manager' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getManager();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getManager <em>Manager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Manager</em>' attribute.
-	 * @see #getManager()
-	 * @generated
-	 */
-	void setManager(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Author</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The author of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Author</em>' attribute.
-	 * @see #setAuthor(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Author()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.AuthorType"
-	 *        extendedMetaData="kind='element' name='Author' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getAuthor();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getAuthor <em>Author</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Author</em>' attribute.
-	 * @see #getAuthor()
-	 * @generated
-	 */
-	void setAuthor(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the project was created.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Creation Date</em>' attribute.
-	 * @see #setCreationDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_CreationDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='CreationDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getCreationDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCreationDate <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Creation Date</em>' attribute.
-	 * @see #getCreationDate()
-	 * @generated
-	 */
-	void setCreationDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Revision</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The number of times a project has been saved.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Revision</em>' attribute.
-	 * @see #setRevision(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Revision()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='Revision' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getRevision();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getRevision <em>Revision</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Revision</em>' attribute.
-	 * @see #getRevision()
-	 * @generated
-	 */
-	void setRevision(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Last Saved</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the project was last saved.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Last Saved</em>' attribute.
-	 * @see #setLastSaved(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_LastSaved()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='LastSaved' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getLastSaved();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getLastSaved <em>Last Saved</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Last Saved</em>' attribute.
-	 * @see #getLastSaved()
-	 * @generated
-	 */
-	void setLastSaved(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Schedule From Start</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the project is schduled from the start date or finish date.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Schedule From Start</em>' attribute.
-	 * @see #isSetScheduleFromStart()
-	 * @see #unsetScheduleFromStart()
-	 * @see #setScheduleFromStart(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_ScheduleFromStart()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='ScheduleFromStart' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isScheduleFromStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isScheduleFromStart <em>Schedule From Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Schedule From Start</em>' attribute.
-	 * @see #isSetScheduleFromStart()
-	 * @see #unsetScheduleFromStart()
-	 * @see #isScheduleFromStart()
-	 * @generated
-	 */
-	void setScheduleFromStart(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isScheduleFromStart <em>Schedule From Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetScheduleFromStart()
-	 * @see #isScheduleFromStart()
-	 * @see #setScheduleFromStart(boolean)
-	 * @generated
-	 */
-	void unsetScheduleFromStart();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isScheduleFromStart <em>Schedule From Start</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Schedule From Start</em>' attribute is set.
-	 * @see #unsetScheduleFromStart()
-	 * @see #isScheduleFromStart()
-	 * @see #setScheduleFromStart(boolean)
-	 * @generated
-	 */
-	boolean isSetScheduleFromStart();
-
-	/**
-	 * Returns the value of the '<em><b>Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The start date of the project. Required if ScheduleFromStart is true.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start Date</em>' attribute.
-	 * @see #setStartDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_StartDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='StartDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStartDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getStartDate <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start Date</em>' attribute.
-	 * @see #getStartDate()
-	 * @generated
-	 */
-	void setStartDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The finish date of the project. Required if ScheduleFromStart is false.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish Date</em>' attribute.
-	 * @see #setFinishDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_FinishDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='FinishDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFinishDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getFinishDate <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish Date</em>' attribute.
-	 * @see #getFinishDate()
-	 * @generated
-	 */
-	void setFinishDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>FY Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Fiscal Year starting month. Values are: 
-	 * 						1=January, 2=February, 3=March, 4=April, 5=May, 6=June, 7=July, 
-	 * 						8=August, 9=September, 10=October, 11=November, 12=December 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>FY Start Date</em>' attribute.
-	 * @see #setFYStartDate(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_FYStartDate()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.FYStartDateType"
-	 *        extendedMetaData="kind='element' name='FYStartDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getFYStartDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getFYStartDate <em>FY Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>FY Start Date</em>' attribute.
-	 * @see #getFYStartDate()
-	 * @generated
-	 */
-	void setFYStartDate(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Critical Slack Limit</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The number of days past its end date that a task can go 
-	 * 						before Microsoft Project marks that task as a critical task.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Critical Slack Limit</em>' attribute.
-	 * @see #setCriticalSlackLimit(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_CriticalSlackLimit()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='CriticalSlackLimit' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCriticalSlackLimit();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCriticalSlackLimit <em>Critical Slack Limit</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Critical Slack Limit</em>' attribute.
-	 * @see #getCriticalSlackLimit()
-	 * @generated
-	 */
-	void setCriticalSlackLimit(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Currency Digits</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The number of digits after the decimal symbol.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Currency Digits</em>' attribute.
-	 * @see #setCurrencyDigits(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_CurrencyDigits()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='CurrencyDigits' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCurrencyDigits();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCurrencyDigits <em>Currency Digits</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Currency Digits</em>' attribute.
-	 * @see #getCurrencyDigits()
-	 * @generated
-	 */
-	void setCurrencyDigits(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Currency Symbol</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The currency symbol used in the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Currency Symbol</em>' attribute.
-	 * @see #setCurrencySymbol(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_CurrencySymbol()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.CurrencySymbolType"
-	 *        extendedMetaData="kind='element' name='CurrencySymbol' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getCurrencySymbol();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCurrencySymbol <em>Currency Symbol</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Currency Symbol</em>' attribute.
-	 * @see #getCurrencySymbol()
-	 * @generated
-	 */
-	void setCurrencySymbol(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Currency Symbol Position</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The position of the currency symbol.  Values are: 
-	 * 						0=Before, 1=After, 2=Before With Space, 3=After with space.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Currency Symbol Position</em>' attribute.
-	 * @see #setCurrencySymbolPosition(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_CurrencySymbolPosition()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.CurrencySymbolPositionType"
-	 *        extendedMetaData="kind='element' name='CurrencySymbolPosition' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCurrencySymbolPosition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCurrencySymbolPosition <em>Currency Symbol Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Currency Symbol Position</em>' attribute.
-	 * @see #getCurrencySymbolPosition()
-	 * @generated
-	 */
-	void setCurrencySymbolPosition(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The project calendar.  Refers to a valid UID in the 
-	 * 						Calendars element of the Microsoft Project XML Schema.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Calendar UID</em>' attribute.
-	 * @see #setCalendarUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_CalendarUID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='CalendarUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCalendarUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCalendarUID <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Calendar UID</em>' attribute.
-	 * @see #getCalendarUID()
-	 * @generated
-	 */
-	void setCalendarUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Default Start Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default start time of new tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Start Time</em>' attribute.
-	 * @see #setDefaultStartTime(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DefaultStartTime()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Time"
-	 *        extendedMetaData="kind='element' name='DefaultStartTime' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getDefaultStartTime();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultStartTime <em>Default Start Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Start Time</em>' attribute.
-	 * @see #getDefaultStartTime()
-	 * @generated
-	 */
-	void setDefaultStartTime(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Default Finish Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default finish time of new tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Finish Time</em>' attribute.
-	 * @see #setDefaultFinishTime(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DefaultFinishTime()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Time"
-	 *        extendedMetaData="kind='element' name='DefaultFinishTime' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getDefaultFinishTime();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultFinishTime <em>Default Finish Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Finish Time</em>' attribute.
-	 * @see #getDefaultFinishTime()
-	 * @generated
-	 */
-	void setDefaultFinishTime(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Minutes Per Day</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The number of minutes per day.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Minutes Per Day</em>' attribute.
-	 * @see #setMinutesPerDay(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MinutesPerDay()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='MinutesPerDay' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getMinutesPerDay();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getMinutesPerDay <em>Minutes Per Day</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Minutes Per Day</em>' attribute.
-	 * @see #getMinutesPerDay()
-	 * @generated
-	 */
-	void setMinutesPerDay(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Minutes Per Week</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The number of minutes per week.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Minutes Per Week</em>' attribute.
-	 * @see #setMinutesPerWeek(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MinutesPerWeek()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='MinutesPerWeek' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getMinutesPerWeek();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getMinutesPerWeek <em>Minutes Per Week</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Minutes Per Week</em>' attribute.
-	 * @see #getMinutesPerWeek()
-	 * @generated
-	 */
-	void setMinutesPerWeek(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Days Per Month</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The number of days per month.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Days Per Month</em>' attribute.
-	 * @see #setDaysPerMonth(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DaysPerMonth()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='DaysPerMonth' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDaysPerMonth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDaysPerMonth <em>Days Per Month</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Days Per Month</em>' attribute.
-	 * @see #getDaysPerMonth()
-	 * @generated
-	 */
-	void setDaysPerMonth(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Default Task Type</b></em>' attribute.
-	 * The default value is <code>"1"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default type of new tasks. Values are: 
-	 * 						0=Fixed Units, 1=Fixed Duration, 2=Fixed Work.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Task Type</em>' attribute.
-	 * @see #isSetDefaultTaskType()
-	 * @see #unsetDefaultTaskType()
-	 * @see #setDefaultTaskType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DefaultTaskType()
-	 * @model default="1" unique="false" unsettable="true" dataType="org.eclipse.epf.msproject.DefaultTaskTypeType"
-	 *        extendedMetaData="kind='element' name='DefaultTaskType' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDefaultTaskType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultTaskType <em>Default Task Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Task Type</em>' attribute.
-	 * @see #isSetDefaultTaskType()
-	 * @see #unsetDefaultTaskType()
-	 * @see #getDefaultTaskType()
-	 * @generated
-	 */
-	void setDefaultTaskType(BigInteger value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultTaskType <em>Default Task Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetDefaultTaskType()
-	 * @see #getDefaultTaskType()
-	 * @see #setDefaultTaskType(BigInteger)
-	 * @generated
-	 */
-	void unsetDefaultTaskType();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultTaskType <em>Default Task Type</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Default Task Type</em>' attribute is set.
-	 * @see #unsetDefaultTaskType()
-	 * @see #getDefaultTaskType()
-	 * @see #setDefaultTaskType(BigInteger)
-	 * @generated
-	 */
-	boolean isSetDefaultTaskType();
-
-	/**
-	 * Returns the value of the '<em><b>Default Fixed Cost Accrual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default from where fixed costs are accrued.  Values are: 
-	 * 						1=Start, 2=Prorated, 3=End
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Fixed Cost Accrual</em>' attribute.
-	 * @see #setDefaultFixedCostAccrual(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DefaultFixedCostAccrual()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DefaultFixedCostAccrualType"
-	 *        extendedMetaData="kind='element' name='DefaultFixedCostAccrual' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDefaultFixedCostAccrual();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultFixedCostAccrual <em>Default Fixed Cost Accrual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Fixed Cost Accrual</em>' attribute.
-	 * @see #getDefaultFixedCostAccrual()
-	 * @generated
-	 */
-	void setDefaultFixedCostAccrual(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Default Standard Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default standard rate for new resources.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Standard Rate</em>' attribute.
-	 * @see #isSetDefaultStandardRate()
-	 * @see #unsetDefaultStandardRate()
-	 * @see #setDefaultStandardRate(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DefaultStandardRate()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='DefaultStandardRate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getDefaultStandardRate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultStandardRate <em>Default Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Standard Rate</em>' attribute.
-	 * @see #isSetDefaultStandardRate()
-	 * @see #unsetDefaultStandardRate()
-	 * @see #getDefaultStandardRate()
-	 * @generated
-	 */
-	void setDefaultStandardRate(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultStandardRate <em>Default Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetDefaultStandardRate()
-	 * @see #getDefaultStandardRate()
-	 * @see #setDefaultStandardRate(float)
-	 * @generated
-	 */
-	void unsetDefaultStandardRate();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultStandardRate <em>Default Standard Rate</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Default Standard Rate</em>' attribute is set.
-	 * @see #unsetDefaultStandardRate()
-	 * @see #getDefaultStandardRate()
-	 * @see #setDefaultStandardRate(float)
-	 * @generated
-	 */
-	boolean isSetDefaultStandardRate();
-
-	/**
-	 * Returns the value of the '<em><b>Default Overtime Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default overtime rate for new resources.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Overtime Rate</em>' attribute.
-	 * @see #isSetDefaultOvertimeRate()
-	 * @see #unsetDefaultOvertimeRate()
-	 * @see #setDefaultOvertimeRate(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DefaultOvertimeRate()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='DefaultOvertimeRate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getDefaultOvertimeRate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultOvertimeRate <em>Default Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Overtime Rate</em>' attribute.
-	 * @see #isSetDefaultOvertimeRate()
-	 * @see #unsetDefaultOvertimeRate()
-	 * @see #getDefaultOvertimeRate()
-	 * @generated
-	 */
-	void setDefaultOvertimeRate(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultOvertimeRate <em>Default Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetDefaultOvertimeRate()
-	 * @see #getDefaultOvertimeRate()
-	 * @see #setDefaultOvertimeRate(float)
-	 * @generated
-	 */
-	void unsetDefaultOvertimeRate();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultOvertimeRate <em>Default Overtime Rate</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Default Overtime Rate</em>' attribute is set.
-	 * @see #unsetDefaultOvertimeRate()
-	 * @see #getDefaultOvertimeRate()
-	 * @see #setDefaultOvertimeRate(float)
-	 * @generated
-	 */
-	boolean isSetDefaultOvertimeRate();
-
-	/**
-	 * Returns the value of the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the bulk duration.  Values are: 
-	 * 						3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 21=null, 
-	 * 						35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and 
-	 * 						53=null.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration Format</em>' attribute.
-	 * @see #setDurationFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DurationFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DurationFormatType5"
-	 *        extendedMetaData="kind='element' name='DurationFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDurationFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDurationFormat <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration Format</em>' attribute.
-	 * @see #getDurationFormat()
-	 * @generated
-	 */
-	void setDurationFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Work Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default work unit format. Values are: 
-	 * 						1=m, 2=h, 3=d, 4=w, 5=mo
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work Format</em>' attribute.
-	 * @see #setWorkFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_WorkFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.WorkFormatType"
-	 *        extendedMetaData="kind='element' name='WorkFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getWorkFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getWorkFormat <em>Work Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Format</em>' attribute.
-	 * @see #getWorkFormat()
-	 * @generated
-	 */
-	void setWorkFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Editable Actual Costs</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether or not actual costs are editable.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Editable Actual Costs</em>' attribute.
-	 * @see #isSetEditableActualCosts()
-	 * @see #unsetEditableActualCosts()
-	 * @see #setEditableActualCosts(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_EditableActualCosts()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='EditableActualCosts' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isEditableActualCosts();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isEditableActualCosts <em>Editable Actual Costs</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Editable Actual Costs</em>' attribute.
-	 * @see #isSetEditableActualCosts()
-	 * @see #unsetEditableActualCosts()
-	 * @see #isEditableActualCosts()
-	 * @generated
-	 */
-	void setEditableActualCosts(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isEditableActualCosts <em>Editable Actual Costs</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetEditableActualCosts()
-	 * @see #isEditableActualCosts()
-	 * @see #setEditableActualCosts(boolean)
-	 * @generated
-	 */
-	void unsetEditableActualCosts();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isEditableActualCosts <em>Editable Actual Costs</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Editable Actual Costs</em>' attribute is set.
-	 * @see #unsetEditableActualCosts()
-	 * @see #isEditableActualCosts()
-	 * @see #setEditableActualCosts(boolean)
-	 * @generated
-	 */
-	boolean isSetEditableActualCosts();
-
-	/**
-	 * Returns the value of the '<em><b>Honor Constraints</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether tasks honour their constraint dates.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Honor Constraints</em>' attribute.
-	 * @see #isSetHonorConstraints()
-	 * @see #unsetHonorConstraints()
-	 * @see #setHonorConstraints(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_HonorConstraints()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='HonorConstraints' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isHonorConstraints();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isHonorConstraints <em>Honor Constraints</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Honor Constraints</em>' attribute.
-	 * @see #isSetHonorConstraints()
-	 * @see #unsetHonorConstraints()
-	 * @see #isHonorConstraints()
-	 * @generated
-	 */
-	void setHonorConstraints(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isHonorConstraints <em>Honor Constraints</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetHonorConstraints()
-	 * @see #isHonorConstraints()
-	 * @see #setHonorConstraints(boolean)
-	 * @generated
-	 */
-	void unsetHonorConstraints();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isHonorConstraints <em>Honor Constraints</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Honor Constraints</em>' attribute is set.
-	 * @see #unsetHonorConstraints()
-	 * @see #isHonorConstraints()
-	 * @see #setHonorConstraints(boolean)
-	 * @generated
-	 */
-	boolean isSetHonorConstraints();
-
-	/**
-	 * Returns the value of the '<em><b>Earned Value Method</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default method for calculating earned value. Values are: 
-	 * 						0=Percent Complete, 1=Physical Percent Complete
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Earned Value Method</em>' attribute.
-	 * @see #setEarnedValueMethod(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_EarnedValueMethod()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.EarnedValueMethodType1"
-	 *        extendedMetaData="kind='element' name='EarnedValueMethod' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getEarnedValueMethod();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getEarnedValueMethod <em>Earned Value Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Earned Value Method</em>' attribute.
-	 * @see #getEarnedValueMethod()
-	 * @generated
-	 */
-	void setEarnedValueMethod(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Inserted Projects Like Summary</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether to calculate subtasks as summary tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Inserted Projects Like Summary</em>' attribute.
-	 * @see #isSetInsertedProjectsLikeSummary()
-	 * @see #unsetInsertedProjectsLikeSummary()
-	 * @see #setInsertedProjectsLikeSummary(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_InsertedProjectsLikeSummary()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='InsertedProjectsLikeSummary' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isInsertedProjectsLikeSummary();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isInsertedProjectsLikeSummary <em>Inserted Projects Like Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Inserted Projects Like Summary</em>' attribute.
-	 * @see #isSetInsertedProjectsLikeSummary()
-	 * @see #unsetInsertedProjectsLikeSummary()
-	 * @see #isInsertedProjectsLikeSummary()
-	 * @generated
-	 */
-	void setInsertedProjectsLikeSummary(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isInsertedProjectsLikeSummary <em>Inserted Projects Like Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetInsertedProjectsLikeSummary()
-	 * @see #isInsertedProjectsLikeSummary()
-	 * @see #setInsertedProjectsLikeSummary(boolean)
-	 * @generated
-	 */
-	void unsetInsertedProjectsLikeSummary();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isInsertedProjectsLikeSummary <em>Inserted Projects Like Summary</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Inserted Projects Like Summary</em>' attribute is set.
-	 * @see #unsetInsertedProjectsLikeSummary()
-	 * @see #isInsertedProjectsLikeSummary()
-	 * @see #setInsertedProjectsLikeSummary(boolean)
-	 * @generated
-	 */
-	boolean isSetInsertedProjectsLikeSummary();
-
-	/**
-	 * Returns the value of the '<em><b>Multiple Critical Paths</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether multiple critical paths are calculated.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Multiple Critical Paths</em>' attribute.
-	 * @see #isSetMultipleCriticalPaths()
-	 * @see #unsetMultipleCriticalPaths()
-	 * @see #setMultipleCriticalPaths(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MultipleCriticalPaths()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='MultipleCriticalPaths' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMultipleCriticalPaths();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isMultipleCriticalPaths <em>Multiple Critical Paths</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Multiple Critical Paths</em>' attribute.
-	 * @see #isSetMultipleCriticalPaths()
-	 * @see #unsetMultipleCriticalPaths()
-	 * @see #isMultipleCriticalPaths()
-	 * @generated
-	 */
-	void setMultipleCriticalPaths(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isMultipleCriticalPaths <em>Multiple Critical Paths</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMultipleCriticalPaths()
-	 * @see #isMultipleCriticalPaths()
-	 * @see #setMultipleCriticalPaths(boolean)
-	 * @generated
-	 */
-	void unsetMultipleCriticalPaths();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isMultipleCriticalPaths <em>Multiple Critical Paths</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Multiple Critical Paths</em>' attribute is set.
-	 * @see #unsetMultipleCriticalPaths()
-	 * @see #isMultipleCriticalPaths()
-	 * @see #setMultipleCriticalPaths(boolean)
-	 * @generated
-	 */
-	boolean isSetMultipleCriticalPaths();
-
-	/**
-	 * Returns the value of the '<em><b>New Tasks Effort Driven</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether new tasks are effort driven.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>New Tasks Effort Driven</em>' attribute.
-	 * @see #isSetNewTasksEffortDriven()
-	 * @see #unsetNewTasksEffortDriven()
-	 * @see #setNewTasksEffortDriven(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_NewTasksEffortDriven()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='NewTasksEffortDriven' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isNewTasksEffortDriven();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isNewTasksEffortDriven <em>New Tasks Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>New Tasks Effort Driven</em>' attribute.
-	 * @see #isSetNewTasksEffortDriven()
-	 * @see #unsetNewTasksEffortDriven()
-	 * @see #isNewTasksEffortDriven()
-	 * @generated
-	 */
-	void setNewTasksEffortDriven(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isNewTasksEffortDriven <em>New Tasks Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNewTasksEffortDriven()
-	 * @see #isNewTasksEffortDriven()
-	 * @see #setNewTasksEffortDriven(boolean)
-	 * @generated
-	 */
-	void unsetNewTasksEffortDriven();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isNewTasksEffortDriven <em>New Tasks Effort Driven</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>New Tasks Effort Driven</em>' attribute is set.
-	 * @see #unsetNewTasksEffortDriven()
-	 * @see #isNewTasksEffortDriven()
-	 * @see #setNewTasksEffortDriven(boolean)
-	 * @generated
-	 */
-	boolean isSetNewTasksEffortDriven();
-
-	/**
-	 * Returns the value of the '<em><b>New Tasks Estimated</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether to show the estimated duration by default.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>New Tasks Estimated</em>' attribute.
-	 * @see #isSetNewTasksEstimated()
-	 * @see #unsetNewTasksEstimated()
-	 * @see #setNewTasksEstimated(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_NewTasksEstimated()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='NewTasksEstimated' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isNewTasksEstimated();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isNewTasksEstimated <em>New Tasks Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>New Tasks Estimated</em>' attribute.
-	 * @see #isSetNewTasksEstimated()
-	 * @see #unsetNewTasksEstimated()
-	 * @see #isNewTasksEstimated()
-	 * @generated
-	 */
-	void setNewTasksEstimated(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isNewTasksEstimated <em>New Tasks Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNewTasksEstimated()
-	 * @see #isNewTasksEstimated()
-	 * @see #setNewTasksEstimated(boolean)
-	 * @generated
-	 */
-	void unsetNewTasksEstimated();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isNewTasksEstimated <em>New Tasks Estimated</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>New Tasks Estimated</em>' attribute is set.
-	 * @see #unsetNewTasksEstimated()
-	 * @see #isNewTasksEstimated()
-	 * @see #setNewTasksEstimated(boolean)
-	 * @generated
-	 */
-	boolean isSetNewTasksEstimated();
-
-	/**
-	 * Returns the value of the '<em><b>Splits In Progress Tasks</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether in-progress tasks can be split.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Splits In Progress Tasks</em>' attribute.
-	 * @see #isSetSplitsInProgressTasks()
-	 * @see #unsetSplitsInProgressTasks()
-	 * @see #setSplitsInProgressTasks(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_SplitsInProgressTasks()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='SplitsInProgressTasks' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isSplitsInProgressTasks();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isSplitsInProgressTasks <em>Splits In Progress Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Splits In Progress Tasks</em>' attribute.
-	 * @see #isSetSplitsInProgressTasks()
-	 * @see #unsetSplitsInProgressTasks()
-	 * @see #isSplitsInProgressTasks()
-	 * @generated
-	 */
-	void setSplitsInProgressTasks(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isSplitsInProgressTasks <em>Splits In Progress Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSplitsInProgressTasks()
-	 * @see #isSplitsInProgressTasks()
-	 * @see #setSplitsInProgressTasks(boolean)
-	 * @generated
-	 */
-	void unsetSplitsInProgressTasks();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isSplitsInProgressTasks <em>Splits In Progress Tasks</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Splits In Progress Tasks</em>' attribute is set.
-	 * @see #unsetSplitsInProgressTasks()
-	 * @see #isSplitsInProgressTasks()
-	 * @see #setSplitsInProgressTasks(boolean)
-	 * @generated
-	 */
-	boolean isSetSplitsInProgressTasks();
-
-	/**
-	 * Returns the value of the '<em><b>Spread Actual Cost</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether actual costs are spread to the status date.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Spread Actual Cost</em>' attribute.
-	 * @see #isSetSpreadActualCost()
-	 * @see #unsetSpreadActualCost()
-	 * @see #setSpreadActualCost(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_SpreadActualCost()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='SpreadActualCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isSpreadActualCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isSpreadActualCost <em>Spread Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Spread Actual Cost</em>' attribute.
-	 * @see #isSetSpreadActualCost()
-	 * @see #unsetSpreadActualCost()
-	 * @see #isSpreadActualCost()
-	 * @generated
-	 */
-	void setSpreadActualCost(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isSpreadActualCost <em>Spread Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSpreadActualCost()
-	 * @see #isSpreadActualCost()
-	 * @see #setSpreadActualCost(boolean)
-	 * @generated
-	 */
-	void unsetSpreadActualCost();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isSpreadActualCost <em>Spread Actual Cost</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Spread Actual Cost</em>' attribute is set.
-	 * @see #unsetSpreadActualCost()
-	 * @see #isSpreadActualCost()
-	 * @see #setSpreadActualCost(boolean)
-	 * @generated
-	 */
-	boolean isSetSpreadActualCost();
-
-	/**
-	 * Returns the value of the '<em><b>Spread Percent Complete</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether percent complete is spread to the status date.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Spread Percent Complete</em>' attribute.
-	 * @see #isSetSpreadPercentComplete()
-	 * @see #unsetSpreadPercentComplete()
-	 * @see #setSpreadPercentComplete(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_SpreadPercentComplete()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='SpreadPercentComplete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isSpreadPercentComplete();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isSpreadPercentComplete <em>Spread Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Spread Percent Complete</em>' attribute.
-	 * @see #isSetSpreadPercentComplete()
-	 * @see #unsetSpreadPercentComplete()
-	 * @see #isSpreadPercentComplete()
-	 * @generated
-	 */
-	void setSpreadPercentComplete(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isSpreadPercentComplete <em>Spread Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSpreadPercentComplete()
-	 * @see #isSpreadPercentComplete()
-	 * @see #setSpreadPercentComplete(boolean)
-	 * @generated
-	 */
-	void unsetSpreadPercentComplete();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isSpreadPercentComplete <em>Spread Percent Complete</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Spread Percent Complete</em>' attribute is set.
-	 * @see #unsetSpreadPercentComplete()
-	 * @see #isSpreadPercentComplete()
-	 * @see #setSpreadPercentComplete(boolean)
-	 * @generated
-	 */
-	boolean isSetSpreadPercentComplete();
-
-	/**
-	 * Returns the value of the '<em><b>Task Updates Resource</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether updates to tasks update resources.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Task Updates Resource</em>' attribute.
-	 * @see #isSetTaskUpdatesResource()
-	 * @see #unsetTaskUpdatesResource()
-	 * @see #setTaskUpdatesResource(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_TaskUpdatesResource()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='TaskUpdatesResource' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isTaskUpdatesResource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isTaskUpdatesResource <em>Task Updates Resource</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Task Updates Resource</em>' attribute.
-	 * @see #isSetTaskUpdatesResource()
-	 * @see #unsetTaskUpdatesResource()
-	 * @see #isTaskUpdatesResource()
-	 * @generated
-	 */
-	void setTaskUpdatesResource(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isTaskUpdatesResource <em>Task Updates Resource</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetTaskUpdatesResource()
-	 * @see #isTaskUpdatesResource()
-	 * @see #setTaskUpdatesResource(boolean)
-	 * @generated
-	 */
-	void unsetTaskUpdatesResource();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isTaskUpdatesResource <em>Task Updates Resource</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Task Updates Resource</em>' attribute is set.
-	 * @see #unsetTaskUpdatesResource()
-	 * @see #isTaskUpdatesResource()
-	 * @see #setTaskUpdatesResource(boolean)
-	 * @generated
-	 */
-	boolean isSetTaskUpdatesResource();
-
-	/**
-	 * Returns the value of the '<em><b>Fiscal Year Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies whether to use fiscal year numbering
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Fiscal Year Start</em>' attribute.
-	 * @see #isSetFiscalYearStart()
-	 * @see #unsetFiscalYearStart()
-	 * @see #setFiscalYearStart(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_FiscalYearStart()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='FiscalYearStart' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isFiscalYearStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isFiscalYearStart <em>Fiscal Year Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Fiscal Year Start</em>' attribute.
-	 * @see #isSetFiscalYearStart()
-	 * @see #unsetFiscalYearStart()
-	 * @see #isFiscalYearStart()
-	 * @generated
-	 */
-	void setFiscalYearStart(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isFiscalYearStart <em>Fiscal Year Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetFiscalYearStart()
-	 * @see #isFiscalYearStart()
-	 * @see #setFiscalYearStart(boolean)
-	 * @generated
-	 */
-	void unsetFiscalYearStart();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isFiscalYearStart <em>Fiscal Year Start</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Fiscal Year Start</em>' attribute is set.
-	 * @see #unsetFiscalYearStart()
-	 * @see #isFiscalYearStart()
-	 * @see #setFiscalYearStart(boolean)
-	 * @generated
-	 */
-	boolean isSetFiscalYearStart();
-
-	/**
-	 * Returns the value of the '<em><b>Week Start Day</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Start day of the week. Values are: 
-	 * 						0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Week Start Day</em>' attribute.
-	 * @see #setWeekStartDay(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_WeekStartDay()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.WeekStartDayType"
-	 *        extendedMetaData="kind='element' name='WeekStartDay' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getWeekStartDay();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getWeekStartDay <em>Week Start Day</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Week Start Day</em>' attribute.
-	 * @see #getWeekStartDay()
-	 * @generated
-	 */
-	void setWeekStartDay(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Move Completed Ends Back</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * 							Specifies whether the end of completed portions of tasks scheduled to begin after the 
-	 * 							status date but begun early should be moved back to the status date.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Move Completed Ends Back</em>' attribute.
-	 * @see #isSetMoveCompletedEndsBack()
-	 * @see #unsetMoveCompletedEndsBack()
-	 * @see #setMoveCompletedEndsBack(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MoveCompletedEndsBack()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='MoveCompletedEndsBack' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMoveCompletedEndsBack();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsBack <em>Move Completed Ends Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Move Completed Ends Back</em>' attribute.
-	 * @see #isSetMoveCompletedEndsBack()
-	 * @see #unsetMoveCompletedEndsBack()
-	 * @see #isMoveCompletedEndsBack()
-	 * @generated
-	 */
-	void setMoveCompletedEndsBack(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsBack <em>Move Completed Ends Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMoveCompletedEndsBack()
-	 * @see #isMoveCompletedEndsBack()
-	 * @see #setMoveCompletedEndsBack(boolean)
-	 * @generated
-	 */
-	void unsetMoveCompletedEndsBack();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsBack <em>Move Completed Ends Back</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Move Completed Ends Back</em>' attribute is set.
-	 * @see #unsetMoveCompletedEndsBack()
-	 * @see #isMoveCompletedEndsBack()
-	 * @see #setMoveCompletedEndsBack(boolean)
-	 * @generated
-	 */
-	boolean isSetMoveCompletedEndsBack();
-
-	/**
-	 * Returns the value of the '<em><b>Move Remaining Starts Back</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * 							Specifies whether the beginning of remaining portions of tasks scheduled to begin after the 
-	 * 							status date but begun early should be moved back to the status date.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Move Remaining Starts Back</em>' attribute.
-	 * @see #isSetMoveRemainingStartsBack()
-	 * @see #unsetMoveRemainingStartsBack()
-	 * @see #setMoveRemainingStartsBack(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MoveRemainingStartsBack()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='MoveRemainingStartsBack' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMoveRemainingStartsBack();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsBack <em>Move Remaining Starts Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Move Remaining Starts Back</em>' attribute.
-	 * @see #isSetMoveRemainingStartsBack()
-	 * @see #unsetMoveRemainingStartsBack()
-	 * @see #isMoveRemainingStartsBack()
-	 * @generated
-	 */
-	void setMoveRemainingStartsBack(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsBack <em>Move Remaining Starts Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMoveRemainingStartsBack()
-	 * @see #isMoveRemainingStartsBack()
-	 * @see #setMoveRemainingStartsBack(boolean)
-	 * @generated
-	 */
-	void unsetMoveRemainingStartsBack();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsBack <em>Move Remaining Starts Back</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Move Remaining Starts Back</em>' attribute is set.
-	 * @see #unsetMoveRemainingStartsBack()
-	 * @see #isMoveRemainingStartsBack()
-	 * @see #setMoveRemainingStartsBack(boolean)
-	 * @generated
-	 */
-	boolean isSetMoveRemainingStartsBack();
-
-	/**
-	 * Returns the value of the '<em><b>Move Remaining Starts Forward</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * 							Specifies whether the beginning of remaining portions of tasks scheduled to have begun late 
-	 * 							should be moved up to the status date.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Move Remaining Starts Forward</em>' attribute.
-	 * @see #isSetMoveRemainingStartsForward()
-	 * @see #unsetMoveRemainingStartsForward()
-	 * @see #setMoveRemainingStartsForward(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MoveRemainingStartsForward()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='MoveRemainingStartsForward' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMoveRemainingStartsForward();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsForward <em>Move Remaining Starts Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Move Remaining Starts Forward</em>' attribute.
-	 * @see #isSetMoveRemainingStartsForward()
-	 * @see #unsetMoveRemainingStartsForward()
-	 * @see #isMoveRemainingStartsForward()
-	 * @generated
-	 */
-	void setMoveRemainingStartsForward(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsForward <em>Move Remaining Starts Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMoveRemainingStartsForward()
-	 * @see #isMoveRemainingStartsForward()
-	 * @see #setMoveRemainingStartsForward(boolean)
-	 * @generated
-	 */
-	void unsetMoveRemainingStartsForward();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isMoveRemainingStartsForward <em>Move Remaining Starts Forward</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Move Remaining Starts Forward</em>' attribute is set.
-	 * @see #unsetMoveRemainingStartsForward()
-	 * @see #isMoveRemainingStartsForward()
-	 * @see #setMoveRemainingStartsForward(boolean)
-	 * @generated
-	 */
-	boolean isSetMoveRemainingStartsForward();
-
-	/**
-	 * Returns the value of the '<em><b>Move Completed Ends Forward</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * 							Specifies whether the end of completed portions of tasks scheduled to have been completed 
-	 * 							before the status date but begun late should be moved up to the status date.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Move Completed Ends Forward</em>' attribute.
-	 * @see #isSetMoveCompletedEndsForward()
-	 * @see #unsetMoveCompletedEndsForward()
-	 * @see #setMoveCompletedEndsForward(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MoveCompletedEndsForward()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='MoveCompletedEndsForward' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMoveCompletedEndsForward();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsForward <em>Move Completed Ends Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Move Completed Ends Forward</em>' attribute.
-	 * @see #isSetMoveCompletedEndsForward()
-	 * @see #unsetMoveCompletedEndsForward()
-	 * @see #isMoveCompletedEndsForward()
-	 * @generated
-	 */
-	void setMoveCompletedEndsForward(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsForward <em>Move Completed Ends Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMoveCompletedEndsForward()
-	 * @see #isMoveCompletedEndsForward()
-	 * @see #setMoveCompletedEndsForward(boolean)
-	 * @generated
-	 */
-	void unsetMoveCompletedEndsForward();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isMoveCompletedEndsForward <em>Move Completed Ends Forward</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Move Completed Ends Forward</em>' attribute is set.
-	 * @see #unsetMoveCompletedEndsForward()
-	 * @see #isMoveCompletedEndsForward()
-	 * @see #setMoveCompletedEndsForward(boolean)
-	 * @generated
-	 */
-	boolean isSetMoveCompletedEndsForward();
-
-	/**
-	 * Returns the value of the '<em><b>Baseline For Earned Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The specific baseline used to calculate Variance values.  Values are: 
-	 * 						0=Baseline, 1=Baseline 1, 2=Baseline 2, 3=Baseline 3, 4=Baseline 4, 5=Baseline 5, 6=Baseline 6, 
-	 * 						7=Baseline 7, 8=Baseline 8, 9=Baseline 9, 10=Baseline 10
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Baseline For Earned Value</em>' attribute.
-	 * @see #setBaselineForEarnedValue(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_BaselineForEarnedValue()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.BaselineForEarnedValueType"
-	 *        extendedMetaData="kind='element' name='BaselineForEarnedValue' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getBaselineForEarnedValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getBaselineForEarnedValue <em>Baseline For Earned Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Baseline For Earned Value</em>' attribute.
-	 * @see #getBaselineForEarnedValue()
-	 * @generated
-	 */
-	void setBaselineForEarnedValue(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Auto Add New Resources And Tasks</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether to automatically add new resources to the resource pool.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Auto Add New Resources And Tasks</em>' attribute.
-	 * @see #isSetAutoAddNewResourcesAndTasks()
-	 * @see #unsetAutoAddNewResourcesAndTasks()
-	 * @see #setAutoAddNewResourcesAndTasks(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_AutoAddNewResourcesAndTasks()
-	 * @model default="true" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='AutoAddNewResourcesAndTasks' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isAutoAddNewResourcesAndTasks();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isAutoAddNewResourcesAndTasks <em>Auto Add New Resources And Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Auto Add New Resources And Tasks</em>' attribute.
-	 * @see #isSetAutoAddNewResourcesAndTasks()
-	 * @see #unsetAutoAddNewResourcesAndTasks()
-	 * @see #isAutoAddNewResourcesAndTasks()
-	 * @generated
-	 */
-	void setAutoAddNewResourcesAndTasks(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isAutoAddNewResourcesAndTasks <em>Auto Add New Resources And Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetAutoAddNewResourcesAndTasks()
-	 * @see #isAutoAddNewResourcesAndTasks()
-	 * @see #setAutoAddNewResourcesAndTasks(boolean)
-	 * @generated
-	 */
-	void unsetAutoAddNewResourcesAndTasks();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isAutoAddNewResourcesAndTasks <em>Auto Add New Resources And Tasks</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Auto Add New Resources And Tasks</em>' attribute is set.
-	 * @see #unsetAutoAddNewResourcesAndTasks()
-	 * @see #isAutoAddNewResourcesAndTasks()
-	 * @see #setAutoAddNewResourcesAndTasks(boolean)
-	 * @generated
-	 */
-	boolean isSetAutoAddNewResourcesAndTasks();
-
-	/**
-	 * Returns the value of the '<em><b>Status Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Date used for calculation and reporting.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Status Date</em>' attribute.
-	 * @see #setStatusDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_StatusDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='StatusDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStatusDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getStatusDate <em>Status Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Status Date</em>' attribute.
-	 * @see #getStatusDate()
-	 * @generated
-	 */
-	void setStatusDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Current Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The system date that the XML was generated.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Current Date</em>' attribute.
-	 * @see #setCurrentDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_CurrentDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='CurrentDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getCurrentDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCurrentDate <em>Current Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Current Date</em>' attribute.
-	 * @see #getCurrentDate()
-	 * @generated
-	 */
-	void setCurrentDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Microsoft Project Server URL</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the project was created by a Project Server user as opposed to an NT user.
-	 * 						
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Microsoft Project Server URL</em>' attribute.
-	 * @see #isSetMicrosoftProjectServerURL()
-	 * @see #unsetMicrosoftProjectServerURL()
-	 * @see #setMicrosoftProjectServerURL(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_MicrosoftProjectServerURL()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='MicrosoftProjectServerURL' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMicrosoftProjectServerURL();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isMicrosoftProjectServerURL <em>Microsoft Project Server URL</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Microsoft Project Server URL</em>' attribute.
-	 * @see #isSetMicrosoftProjectServerURL()
-	 * @see #unsetMicrosoftProjectServerURL()
-	 * @see #isMicrosoftProjectServerURL()
-	 * @generated
-	 */
-	void setMicrosoftProjectServerURL(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isMicrosoftProjectServerURL <em>Microsoft Project Server URL</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMicrosoftProjectServerURL()
-	 * @see #isMicrosoftProjectServerURL()
-	 * @see #setMicrosoftProjectServerURL(boolean)
-	 * @generated
-	 */
-	void unsetMicrosoftProjectServerURL();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isMicrosoftProjectServerURL <em>Microsoft Project Server URL</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Microsoft Project Server URL</em>' attribute is set.
-	 * @see #unsetMicrosoftProjectServerURL()
-	 * @see #isMicrosoftProjectServerURL()
-	 * @see #setMicrosoftProjectServerURL(boolean)
-	 * @generated
-	 */
-	boolean isSetMicrosoftProjectServerURL();
-
-	/**
-	 * Returns the value of the '<em><b>Autolink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether to autolink inserted or moved tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Autolink</em>' attribute.
-	 * @see #isSetAutolink()
-	 * @see #unsetAutolink()
-	 * @see #setAutolink(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Autolink()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Autolink' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isAutolink();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isAutolink <em>Autolink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Autolink</em>' attribute.
-	 * @see #isSetAutolink()
-	 * @see #unsetAutolink()
-	 * @see #isAutolink()
-	 * @generated
-	 */
-	void setAutolink(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isAutolink <em>Autolink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetAutolink()
-	 * @see #isAutolink()
-	 * @see #setAutolink(boolean)
-	 * @generated
-	 */
-	void unsetAutolink();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isAutolink <em>Autolink</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Autolink</em>' attribute is set.
-	 * @see #unsetAutolink()
-	 * @see #isAutolink()
-	 * @see #setAutolink(boolean)
-	 * @generated
-	 */
-	boolean isSetAutolink();
-
-	/**
-	 * Returns the value of the '<em><b>New Task Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default date for new tasks start.  Values are: 
-	 * 						0=Project Start Date, 1=Current Date
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>New Task Start Date</em>' attribute.
-	 * @see #setNewTaskStartDate(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_NewTaskStartDate()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.NewTaskStartDateType"
-	 *        extendedMetaData="kind='element' name='NewTaskStartDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getNewTaskStartDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getNewTaskStartDate <em>New Task Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>New Task Start Date</em>' attribute.
-	 * @see #getNewTaskStartDate()
-	 * @generated
-	 */
-	void setNewTaskStartDate(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Default Task EV Method</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default earned value method for tasks.  Values are: 
-	 * 						0=Percent Complete, 1=Physical Percent Complete
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Task EV Method</em>' attribute.
-	 * @see #setDefaultTaskEVMethod(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_DefaultTaskEVMethod()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DefaultTaskEVMethodType"
-	 *        extendedMetaData="kind='element' name='DefaultTaskEVMethod' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDefaultTaskEVMethod();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getDefaultTaskEVMethod <em>Default Task EV Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Task EV Method</em>' attribute.
-	 * @see #getDefaultTaskEVMethod()
-	 * @generated
-	 */
-	void setDefaultTaskEVMethod(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Project Externally Edited</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the project XML was edited.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Project Externally Edited</em>' attribute.
-	 * @see #isSetProjectExternallyEdited()
-	 * @see #unsetProjectExternallyEdited()
-	 * @see #setProjectExternallyEdited(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_ProjectExternallyEdited()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='ProjectExternallyEdited' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isProjectExternallyEdited();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isProjectExternallyEdited <em>Project Externally Edited</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Project Externally Edited</em>' attribute.
-	 * @see #isSetProjectExternallyEdited()
-	 * @see #unsetProjectExternallyEdited()
-	 * @see #isProjectExternallyEdited()
-	 * @generated
-	 */
-	void setProjectExternallyEdited(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isProjectExternallyEdited <em>Project Externally Edited</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetProjectExternallyEdited()
-	 * @see #isProjectExternallyEdited()
-	 * @see #setProjectExternallyEdited(boolean)
-	 * @generated
-	 */
-	void unsetProjectExternallyEdited();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isProjectExternallyEdited <em>Project Externally Edited</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Project Externally Edited</em>' attribute is set.
-	 * @see #unsetProjectExternallyEdited()
-	 * @see #isProjectExternallyEdited()
-	 * @see #setProjectExternallyEdited(boolean)
-	 * @generated
-	 */
-	boolean isSetProjectExternallyEdited();
-
-	/**
-	 * Returns the value of the '<em><b>Extended Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Date used for calculation and reporting.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Extended Creation Date</em>' attribute.
-	 * @see #setExtendedCreationDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_ExtendedCreationDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='ExtendedCreationDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getExtendedCreationDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getExtendedCreationDate <em>Extended Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Extended Creation Date</em>' attribute.
-	 * @see #getExtendedCreationDate()
-	 * @generated
-	 */
-	void setExtendedCreationDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actuals In Sync</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether all actual work has been synchronized with the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actuals In Sync</em>' attribute.
-	 * @see #isSetActualsInSync()
-	 * @see #unsetActualsInSync()
-	 * @see #setActualsInSync(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_ActualsInSync()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='ActualsInSync' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isActualsInSync();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isActualsInSync <em>Actuals In Sync</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actuals In Sync</em>' attribute.
-	 * @see #isSetActualsInSync()
-	 * @see #unsetActualsInSync()
-	 * @see #isActualsInSync()
-	 * @generated
-	 */
-	void setActualsInSync(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isActualsInSync <em>Actuals In Sync</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetActualsInSync()
-	 * @see #isActualsInSync()
-	 * @see #setActualsInSync(boolean)
-	 * @generated
-	 */
-	void unsetActualsInSync();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isActualsInSync <em>Actuals In Sync</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Actuals In Sync</em>' attribute is set.
-	 * @see #unsetActualsInSync()
-	 * @see #isActualsInSync()
-	 * @see #setActualsInSync(boolean)
-	 * @generated
-	 */
-	boolean isSetActualsInSync();
-
-	/**
-	 * Returns the value of the '<em><b>Remove File Properties</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether to remove all file properties on save.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remove File Properties</em>' attribute.
-	 * @see #isSetRemoveFileProperties()
-	 * @see #unsetRemoveFileProperties()
-	 * @see #setRemoveFileProperties(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_RemoveFileProperties()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='RemoveFileProperties' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isRemoveFileProperties();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isRemoveFileProperties <em>Remove File Properties</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remove File Properties</em>' attribute.
-	 * @see #isSetRemoveFileProperties()
-	 * @see #unsetRemoveFileProperties()
-	 * @see #isRemoveFileProperties()
-	 * @generated
-	 */
-	void setRemoveFileProperties(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isRemoveFileProperties <em>Remove File Properties</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetRemoveFileProperties()
-	 * @see #isRemoveFileProperties()
-	 * @see #setRemoveFileProperties(boolean)
-	 * @generated
-	 */
-	void unsetRemoveFileProperties();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isRemoveFileProperties <em>Remove File Properties</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Remove File Properties</em>' attribute is set.
-	 * @see #unsetRemoveFileProperties()
-	 * @see #isRemoveFileProperties()
-	 * @see #setRemoveFileProperties(boolean)
-	 * @generated
-	 */
-	boolean isSetRemoveFileProperties();
-
-	/**
-	 * Returns the value of the '<em><b>Admin Project</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the project is an administrative project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Admin Project</em>' attribute.
-	 * @see #isSetAdminProject()
-	 * @see #unsetAdminProject()
-	 * @see #setAdminProject(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_AdminProject()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='AdminProject' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isAdminProject();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#isAdminProject <em>Admin Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Admin Project</em>' attribute.
-	 * @see #isSetAdminProject()
-	 * @see #unsetAdminProject()
-	 * @see #isAdminProject()
-	 * @generated
-	 */
-	void setAdminProject(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Project#isAdminProject <em>Admin Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetAdminProject()
-	 * @see #isAdminProject()
-	 * @see #setAdminProject(boolean)
-	 * @generated
-	 */
-	void unsetAdminProject();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Project#isAdminProject <em>Admin Project</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Admin Project</em>' attribute is set.
-	 * @see #unsetAdminProject()
-	 * @see #isAdminProject()
-	 * @see #setAdminProject(boolean)
-	 * @generated
-	 */
-	boolean isSetAdminProject();
-
-	/**
-	 * Returns the value of the '<em><b>Outline Codes</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of outline code definitions associated with the project.  These codes may be associated only with this project, or may be common among several projects (enterprise codes).
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Outline Codes</em>' containment reference.
-	 * @see #setOutlineCodes(OutlineCodes)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_OutlineCodes()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='OutlineCodes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OutlineCodes getOutlineCodes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getOutlineCodes <em>Outline Codes</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Outline Codes</em>' containment reference.
-	 * @see #getOutlineCodes()
-	 * @generated
-	 */
-	void setOutlineCodes(OutlineCodes value);
-
-	/**
-	 * Returns the value of the '<em><b>WBS Masks</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The table of entries that define the outline code mask.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>WBS Masks</em>' containment reference.
-	 * @see #setWBSMasks(WBSMasks)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_WBSMasks()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='WBSMasks' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	WBSMasks getWBSMasks();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getWBSMasks <em>WBS Masks</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>WBS Masks</em>' containment reference.
-	 * @see #getWBSMasks()
-	 * @generated
-	 */
-	void setWBSMasks(WBSMasks value);
-
-	/**
-	 * Returns the value of the '<em><b>Extended Attributes</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of extended attribute (custom field) definitions 
-	 *         associated with the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Extended Attributes</em>' containment reference.
-	 * @see #setExtendedAttributes(ExtendedAttributes)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_ExtendedAttributes()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='ExtendedAttributes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ExtendedAttributes getExtendedAttributes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getExtendedAttributes <em>Extended Attributes</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Extended Attributes</em>' containment reference.
-	 * @see #getExtendedAttributes()
-	 * @generated
-	 */
-	void setExtendedAttributes(ExtendedAttributes value);
-
-	/**
-	 * Returns the value of the '<em><b>Calendars</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of calendars that is associated with the 
-	 *         project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Calendars</em>' containment reference.
-	 * @see #setCalendars(Calendars)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Calendars()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Calendars' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Calendars getCalendars();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getCalendars <em>Calendars</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Calendars</em>' containment reference.
-	 * @see #getCalendars()
-	 * @generated
-	 */
-	void setCalendars(Calendars value);
-
-	/**
-	 * Returns the value of the '<em><b>Tasks</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of tasks that make up the project.
-	 *         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Tasks</em>' containment reference.
-	 * @see #setTasks(Tasks)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Tasks()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Tasks' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Tasks getTasks();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getTasks <em>Tasks</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tasks</em>' containment reference.
-	 * @see #getTasks()
-	 * @generated
-	 */
-	void setTasks(Tasks value);
-
-	/**
-	 * Returns the value of the '<em><b>Resources</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of resources that make up the project.
-	 *         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resources</em>' containment reference.
-	 * @see #setResources(Resources)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Resources()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Resources' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Resources getResources();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getResources <em>Resources</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resources</em>' containment reference.
-	 * @see #getResources()
-	 * @generated
-	 */
-	void setResources(Resources value);
-
-	/**
-	 * Returns the value of the '<em><b>Assignments</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of assignments that make up the project.
-	 *     
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Assignments</em>' containment reference.
-	 * @see #setAssignments(Assignments)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getProject_Assignments()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Assignments' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Assignments getAssignments();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Project#getAssignments <em>Assignments</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Assignments</em>' containment reference.
-	 * @see #getAssignments()
-	 * @generated
-	 */
-	void setAssignments(Assignments value);
-
-} // Project
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Rate.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Rate.java
deleted file mode 100644
index 2ee4805..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Rate.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Rate.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Rate</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getRatesFrom <em>Rates From</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getRatesTo <em>Rates To</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getRateTable <em>Rate Table</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getStandardRate <em>Standard Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getStandardRateFormat <em>Standard Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getOvertimeRate <em>Overtime Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getOvertimeRateFormat <em>Overtime Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Rate#getCostPerUse <em>Cost Per Use</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getRate()
- * @model extendedMetaData="name='Rate_._type' kind='elementOnly'"
- * @generated
- */
-public interface Rate extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Rates From</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the rate becomes effective.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rates From</em>' attribute.
-	 * @see #setRatesFrom(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_RatesFrom()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime" required="true"
-	 *        extendedMetaData="kind='element' name='RatesFrom' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRatesFrom();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getRatesFrom <em>Rates From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rates From</em>' attribute.
-	 * @see #getRatesFrom()
-	 * @generated
-	 */
-	void setRatesFrom(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Rates To</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The last date that the rate is effective.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rates To</em>' attribute.
-	 * @see #setRatesTo(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_RatesTo()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime" required="true"
-	 *        extendedMetaData="kind='element' name='RatesTo' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRatesTo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getRatesTo <em>Rates To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rates To</em>' attribute.
-	 * @see #getRatesTo()
-	 * @generated
-	 */
-	void setRatesTo(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Rate Table</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the rate table for the resource. 
-	 *                                                         Values are: 0=A, 1=B, 2=C, 3=D, 4=E
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rate Table</em>' attribute.
-	 * @see #setRateTable(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_RateTable()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.RateTableType"
-	 *        extendedMetaData="kind='element' name='RateTable' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getRateTable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getRateTable <em>Rate Table</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rate Table</em>' attribute.
-	 * @see #getRateTable()
-	 * @generated
-	 */
-	void setRateTable(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Standard Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The standard rate for the resource for the period specified.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Standard Rate</em>' attribute.
-	 * @see #setStandardRate(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_StandardRate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='StandardRate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getStandardRate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getStandardRate <em>Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Standard Rate</em>' attribute.
-	 * @see #getStandardRate()
-	 * @generated
-	 */
-	void setStandardRate(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Standard Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The units used by Microsoft Project to display the standard rate.  
-	 *                                                         1=m, 2=h, 3=d, 4=w, 5=mo, 7=y
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Standard Rate Format</em>' attribute.
-	 * @see #setStandardRateFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_StandardRateFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.StandardRateFormatType"
-	 *        extendedMetaData="kind='element' name='StandardRateFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getStandardRateFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getStandardRateFormat <em>Standard Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Standard Rate Format</em>' attribute.
-	 * @see #getStandardRateFormat()
-	 * @generated
-	 */
-	void setStandardRateFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The overtime rate for the resource for the period specified.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Rate</em>' attribute.
-	 * @see #setOvertimeRate(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_OvertimeRate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='OvertimeRate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getOvertimeRate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getOvertimeRate <em>Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Rate</em>' attribute.
-	 * @see #getOvertimeRate()
-	 * @generated
-	 */
-	void setOvertimeRate(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The units used by Microsoft Project to display the overtime rate.  
-	 *                                                         1=m, 2=h, 3=d, 4=w, 5=mo, 7=y
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Rate Format</em>' attribute.
-	 * @see #setOvertimeRateFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_OvertimeRateFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.OvertimeRateFormatType"
-	 *        extendedMetaData="kind='element' name='OvertimeRateFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getOvertimeRateFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getOvertimeRateFormat <em>Overtime Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Rate Format</em>' attribute.
-	 * @see #getOvertimeRateFormat()
-	 * @generated
-	 */
-	void setOvertimeRateFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost Per Use</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The cost per use of the resource. 
-	 *                                                         This value is as of the current date if a rate table exists for the resource.
-	 *                                                         
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost Per Use</em>' attribute.
-	 * @see #setCostPerUse(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRate_CostPerUse()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='CostPerUse' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getCostPerUse();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Rate#getCostPerUse <em>Cost Per Use</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost Per Use</em>' attribute.
-	 * @see #getCostPerUse()
-	 * @generated
-	 */
-	void setCostPerUse(BigDecimal value);
-
-} // Rate
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Rates.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Rates.java
deleted file mode 100644
index efd7ed4..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Rates.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Rates.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Rates</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Rates#getRate <em>Rate</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getRates()
- * @model extendedMetaData="name='Rates_._type' kind='elementOnly'"
- * @generated
- */
-public interface Rates extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Rate</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Rate}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The definition of a time period, and the rates applicable for 
-	 *                                             the resource during that period.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rate</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getRates_Rate()
-	 * @model type="org.eclipse.epf.msproject.Rate" containment="true" resolveProxies="false" upper="25"
-	 *        extendedMetaData="kind='element' name='Rate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRate();
-
-} // Rates
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Resource.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Resource.java
deleted file mode 100644
index 5064f9b..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Resource.java
+++ /dev/null
@@ -1,2286 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Resource.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#isIsNull <em>Is Null</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getInitials <em>Initials</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getPhonetics <em>Phonetics</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getNTAccount <em>NT Account</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getMaterialLabel <em>Material Label</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getCode <em>Code</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getWorkGroup <em>Work Group</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getEmailAddress <em>Email Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getHyperlink <em>Hyperlink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getHyperlinkAddress <em>Hyperlink Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getMaxUnits <em>Max Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getPeakUnits <em>Peak Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#isOverAllocated <em>Over Allocated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getAvailableFrom <em>Available From</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getAvailableTo <em>Available To</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#isCanLevel <em>Can Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getAccrueAt <em>Accrue At</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getRegularWork <em>Regular Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getOvertimeWork <em>Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getActualWork <em>Actual Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getRemainingWork <em>Remaining Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getActualOvertimeWork <em>Actual Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getPercentWorkComplete <em>Percent Work Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getStandardRate <em>Standard Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getStandardRateFormat <em>Standard Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getOvertimeRate <em>Overtime Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getOvertimeRateFormat <em>Overtime Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getOvertimeCost <em>Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getCostPerUse <em>Cost Per Use</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getActualCost <em>Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getActualOvertimeCost <em>Actual Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getRemainingCost <em>Remaining Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getWorkVariance <em>Work Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getCostVariance <em>Cost Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getSV <em>SV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getCV <em>CV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getACWP <em>ACWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getCalendarUID <em>Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getNotes <em>Notes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getBCWP <em>BCWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#isIsGeneric <em>Is Generic</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#isIsInactive <em>Is Inactive</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#isIsEnterprise <em>Is Enterprise</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getBookingType <em>Booking Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getActualWorkProtected <em>Actual Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getActiveDirectoryGUID <em>Active Directory GUID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getCreationDate <em>Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getExtendedAttribute <em>Extended Attribute</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getBaseline <em>Baseline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getOutlineCode <em>Outline Code</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getAvailabilityPeriods <em>Availability Periods</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getRates <em>Rates</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Resource#getTimephasedData <em>Timephased Data</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getResource()
- * @model extendedMetaData="name='Resource_._type' kind='elementOnly'"
- * @generated
- */
-public interface Resource extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The position identifier of the resource within the list of resources.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>ID</em>' attribute.
-	 * @see #setID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getID <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>ID</em>' attribute.
-	 * @see #getID()
-	 * @generated
-	 */
-	void setID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The name of the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Name()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.NameType1"
-	 *        extendedMetaData="kind='element' name='Name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The type of resource. Values are: 0=Material, 1=Work
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see #setType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Type()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.TypeType4"
-	 *        extendedMetaData="kind='element' name='Type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Is Null</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies whether the resource is null.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Null</em>' attribute.
-	 * @see #isSetIsNull()
-	 * @see #unsetIsNull()
-	 * @see #setIsNull(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_IsNull()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsNull' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsNull();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsNull <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Null</em>' attribute.
-	 * @see #isSetIsNull()
-	 * @see #unsetIsNull()
-	 * @see #isIsNull()
-	 * @generated
-	 */
-	void setIsNull(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsNull <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsNull()
-	 * @see #isIsNull()
-	 * @see #setIsNull(boolean)
-	 * @generated
-	 */
-	void unsetIsNull();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#isIsNull <em>Is Null</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Null</em>' attribute is set.
-	 * @see #unsetIsNull()
-	 * @see #isIsNull()
-	 * @see #setIsNull(boolean)
-	 * @generated
-	 */
-	boolean isSetIsNull();
-
-	/**
-	 * Returns the value of the '<em><b>Initials</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The initials of the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Initials</em>' attribute.
-	 * @see #setInitials(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Initials()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.InitialsType"
-	 *        extendedMetaData="kind='element' name='Initials' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getInitials();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getInitials <em>Initials</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Initials</em>' attribute.
-	 * @see #getInitials()
-	 * @generated
-	 */
-	void setInitials(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Phonetics</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The phonetic spelling of the resource name.  
-	 *                                 For use with Japanese only.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Phonetics</em>' attribute.
-	 * @see #setPhonetics(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Phonetics()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.PhoneticsType"
-	 *        extendedMetaData="kind='element' name='Phonetics' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getPhonetics();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getPhonetics <em>Phonetics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Phonetics</em>' attribute.
-	 * @see #getPhonetics()
-	 * @generated
-	 */
-	void setPhonetics(String value);
-
-	/**
-	 * Returns the value of the '<em><b>NT Account</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The NT account associated with the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>NT Account</em>' attribute.
-	 * @see #setNTAccount(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_NTAccount()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.NTAccountType"
-	 *        extendedMetaData="kind='element' name='NTAccount' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getNTAccount();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getNTAccount <em>NT Account</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>NT Account</em>' attribute.
-	 * @see #getNTAccount()
-	 * @generated
-	 */
-	void setNTAccount(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Material Label</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unit of measure for the material resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Material Label</em>' attribute.
-	 * @see #setMaterialLabel(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_MaterialLabel()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.MaterialLabelType"
-	 *        extendedMetaData="kind='element' name='MaterialLabel' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getMaterialLabel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getMaterialLabel <em>Material Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Material Label</em>' attribute.
-	 * @see #getMaterialLabel()
-	 * @generated
-	 */
-	void setMaterialLabel(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Code</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The code or other information about the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Code</em>' attribute.
-	 * @see #setCode(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Code()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.CodeType"
-	 *        extendedMetaData="kind='element' name='Code' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getCode();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getCode <em>Code</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Code</em>' attribute.
-	 * @see #getCode()
-	 * @generated
-	 */
-	void setCode(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Group</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The group to which the resource belongs.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Group</em>' attribute.
-	 * @see #setGroup(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Group()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.GroupType"
-	 *        extendedMetaData="kind='element' name='Group' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getGroup();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getGroup <em>Group</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Group</em>' attribute.
-	 * @see #getGroup()
-	 * @generated
-	 */
-	void setGroup(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Work Group</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The type of workgroup to which the resource belongs. 
-	 *                                 Values are: 0=Default, 1=None, 2=Email, 3=Web
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work Group</em>' attribute.
-	 * @see #setWorkGroup(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_WorkGroup()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.WorkGroupType"
-	 *        extendedMetaData="kind='element' name='WorkGroup' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getWorkGroup();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getWorkGroup <em>Work Group</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Group</em>' attribute.
-	 * @see #getWorkGroup()
-	 * @generated
-	 */
-	void setWorkGroup(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Email Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The email address of the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Email Address</em>' attribute.
-	 * @see #setEmailAddress(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_EmailAddress()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.EmailAddressType"
-	 *        extendedMetaData="kind='element' name='EmailAddress' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getEmailAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getEmailAddress <em>Email Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Email Address</em>' attribute.
-	 * @see #getEmailAddress()
-	 * @generated
-	 */
-	void setEmailAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The title of the hyperlink associated with the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink</em>' attribute.
-	 * @see #setHyperlink(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Hyperlink()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkType1"
-	 *        extendedMetaData="kind='element' name='Hyperlink' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlink();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getHyperlink <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink</em>' attribute.
-	 * @see #getHyperlink()
-	 * @generated
-	 */
-	void setHyperlink(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The hyperlink associated with the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink Address</em>' attribute.
-	 * @see #setHyperlinkAddress(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_HyperlinkAddress()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkAddressType1"
-	 *        extendedMetaData="kind='element' name='HyperlinkAddress' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlinkAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getHyperlinkAddress <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink Address</em>' attribute.
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 */
-	void setHyperlinkAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink Sub Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The document bookmark of the hyperlink associated with the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink Sub Address</em>' attribute.
-	 * @see #setHyperlinkSubAddress(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_HyperlinkSubAddress()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkSubAddressType"
-	 *        extendedMetaData="kind='element' name='HyperlinkSubAddress' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlinkSubAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink Sub Address</em>' attribute.
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 */
-	void setHyperlinkSubAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Max Units</b></em>' attribute.
-	 * The default value is <code>"1.0"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The maximum number of units that the resource is available.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Max Units</em>' attribute.
-	 * @see #isSetMaxUnits()
-	 * @see #unsetMaxUnits()
-	 * @see #setMaxUnits(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_MaxUnits()
-	 * @model default="1.0" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='MaxUnits' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getMaxUnits();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getMaxUnits <em>Max Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Max Units</em>' attribute.
-	 * @see #isSetMaxUnits()
-	 * @see #unsetMaxUnits()
-	 * @see #getMaxUnits()
-	 * @generated
-	 */
-	void setMaxUnits(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getMaxUnits <em>Max Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMaxUnits()
-	 * @see #getMaxUnits()
-	 * @see #setMaxUnits(float)
-	 * @generated
-	 */
-	void unsetMaxUnits();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getMaxUnits <em>Max Units</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Max Units</em>' attribute is set.
-	 * @see #unsetMaxUnits()
-	 * @see #getMaxUnits()
-	 * @see #setMaxUnits(float)
-	 * @generated
-	 */
-	boolean isSetMaxUnits();
-
-	/**
-	 * Returns the value of the '<em><b>Peak Units</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The largest number of units assigned to the resource at any time.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Peak Units</em>' attribute.
-	 * @see #isSetPeakUnits()
-	 * @see #unsetPeakUnits()
-	 * @see #setPeakUnits(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_PeakUnits()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='PeakUnits' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getPeakUnits();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getPeakUnits <em>Peak Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Peak Units</em>' attribute.
-	 * @see #isSetPeakUnits()
-	 * @see #unsetPeakUnits()
-	 * @see #getPeakUnits()
-	 * @generated
-	 */
-	void setPeakUnits(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getPeakUnits <em>Peak Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetPeakUnits()
-	 * @see #getPeakUnits()
-	 * @see #setPeakUnits(float)
-	 * @generated
-	 */
-	void unsetPeakUnits();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getPeakUnits <em>Peak Units</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Peak Units</em>' attribute is set.
-	 * @see #unsetPeakUnits()
-	 * @see #getPeakUnits()
-	 * @see #setPeakUnits(float)
-	 * @generated
-	 */
-	boolean isSetPeakUnits();
-
-	/**
-	 * Returns the value of the '<em><b>Over Allocated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the resource is overallocated.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Over Allocated</em>' attribute.
-	 * @see #isSetOverAllocated()
-	 * @see #unsetOverAllocated()
-	 * @see #setOverAllocated(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_OverAllocated()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='OverAllocated' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isOverAllocated();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#isOverAllocated <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Over Allocated</em>' attribute.
-	 * @see #isSetOverAllocated()
-	 * @see #unsetOverAllocated()
-	 * @see #isOverAllocated()
-	 * @generated
-	 */
-	void setOverAllocated(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#isOverAllocated <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetOverAllocated()
-	 * @see #isOverAllocated()
-	 * @see #setOverAllocated(boolean)
-	 * @generated
-	 */
-	void unsetOverAllocated();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#isOverAllocated <em>Over Allocated</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Over Allocated</em>' attribute is set.
-	 * @see #unsetOverAllocated()
-	 * @see #isOverAllocated()
-	 * @see #setOverAllocated(boolean)
-	 * @generated
-	 */
-	boolean isSetOverAllocated();
-
-	/**
-	 * Returns the value of the '<em><b>Available From</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The first date that the resource is available.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Available From</em>' attribute.
-	 * @see #setAvailableFrom(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_AvailableFrom()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='AvailableFrom' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getAvailableFrom();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getAvailableFrom <em>Available From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Available From</em>' attribute.
-	 * @see #getAvailableFrom()
-	 * @generated
-	 */
-	void setAvailableFrom(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Available To</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The last date the resource is available.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Available To</em>' attribute.
-	 * @see #setAvailableTo(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_AvailableTo()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='AvailableTo' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getAvailableTo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getAvailableTo <em>Available To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Available To</em>' attribute.
-	 * @see #getAvailableTo()
-	 * @generated
-	 */
-	void setAvailableTo(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled start date of the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start</em>' attribute.
-	 * @see #setStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Start()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Start' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getStart <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start</em>' attribute.
-	 * @see #getStart()
-	 * @generated
-	 */
-	void setStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled finish date of the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish</em>' attribute.
-	 * @see #setFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Finish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Finish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getFinish <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish</em>' attribute.
-	 * @see #getFinish()
-	 * @generated
-	 */
-	void setFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Can Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the resource can be leveled.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Can Level</em>' attribute.
-	 * @see #isSetCanLevel()
-	 * @see #unsetCanLevel()
-	 * @see #setCanLevel(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_CanLevel()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='CanLevel' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isCanLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#isCanLevel <em>Can Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Can Level</em>' attribute.
-	 * @see #isSetCanLevel()
-	 * @see #unsetCanLevel()
-	 * @see #isCanLevel()
-	 * @generated
-	 */
-	void setCanLevel(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#isCanLevel <em>Can Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCanLevel()
-	 * @see #isCanLevel()
-	 * @see #setCanLevel(boolean)
-	 * @generated
-	 */
-	void unsetCanLevel();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#isCanLevel <em>Can Level</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Can Level</em>' attribute is set.
-	 * @see #unsetCanLevel()
-	 * @see #isCanLevel()
-	 * @see #setCanLevel(boolean)
-	 * @generated
-	 */
-	boolean isSetCanLevel();
-
-	/**
-	 * Returns the value of the '<em><b>Accrue At</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * How cost is accrued against the resource. 
-	 *                                 Values are: 1=Start, 2=End, 3=Prorated
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Accrue At</em>' attribute.
-	 * @see #setAccrueAt(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_AccrueAt()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.AccrueAt"
-	 *        extendedMetaData="kind='element' name='AccrueAt' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getAccrueAt();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getAccrueAt <em>Accrue At</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Accrue At</em>' attribute.
-	 * @see #getAccrueAt()
-	 * @generated
-	 */
-	void setAccrueAt(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The total work assigned to the resource across all assigned tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work</em>' attribute.
-	 * @see #setWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Work()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Work' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getWork <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work</em>' attribute.
-	 * @see #getWork()
-	 * @generated
-	 */
-	void setWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Regular Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of non-overtime work assigned to the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Regular Work</em>' attribute.
-	 * @see #setRegularWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_RegularWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RegularWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRegularWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getRegularWork <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Regular Work</em>' attribute.
-	 * @see #getRegularWork()
-	 * @generated
-	 */
-	void setRegularWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of overtime work assigned to the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Work</em>' attribute.
-	 * @see #setOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_OvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='OvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getOvertimeWork <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Work</em>' attribute.
-	 * @see #getOvertimeWork()
-	 * @generated
-	 */
-	void setOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of actual work performed by the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Work</em>' attribute.
-	 * @see #setActualWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ActualWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getActualWork <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Work</em>' attribute.
-	 * @see #getActualWork()
-	 * @generated
-	 */
-	void setActualWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of remaining work required to complete all assigned tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Work</em>' attribute.
-	 * @see #setRemainingWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_RemainingWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RemainingWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRemainingWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getRemainingWork <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Work</em>' attribute.
-	 * @see #getRemainingWork()
-	 * @generated
-	 */
-	void setRemainingWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of actual overtime work performed by the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Work</em>' attribute.
-	 * @see #setActualOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ActualOvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getActualOvertimeWork <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Work</em>' attribute.
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 */
-	void setActualOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of remaining overtime work required to complete all tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Overtime Work</em>' attribute.
-	 * @see #setRemainingOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_RemainingOvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RemainingOvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRemainingOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Overtime Work</em>' attribute.
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 */
-	void setRemainingOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Percent Work Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The percentage of work completed across all tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Percent Work Complete</em>' attribute.
-	 * @see #setPercentWorkComplete(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_PercentWorkComplete()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='PercentWorkComplete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getPercentWorkComplete();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getPercentWorkComplete <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Percent Work Complete</em>' attribute.
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 */
-	void setPercentWorkComplete(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Standard Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The standard rate of the resource. 
-	 *                                 This value is as of the current date if a rate table exists for the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Standard Rate</em>' attribute.
-	 * @see #setStandardRate(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_StandardRate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='StandardRate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getStandardRate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getStandardRate <em>Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Standard Rate</em>' attribute.
-	 * @see #getStandardRate()
-	 * @generated
-	 */
-	void setStandardRate(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Standard Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The units used by Microsoft Project to display the standard rate.  
-	 *                                 1=m, 2=h, 3=d, 4=w, 5=mo, 7=y, 8=material resource rate (or blank symbol specified)
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Standard Rate Format</em>' attribute.
-	 * @see #setStandardRateFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_StandardRateFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.StandardRateFormatType1"
-	 *        extendedMetaData="kind='element' name='StandardRateFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getStandardRateFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getStandardRateFormat <em>Standard Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Standard Rate Format</em>' attribute.
-	 * @see #getStandardRateFormat()
-	 * @generated
-	 */
-	void setStandardRateFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The total project cost for the resource across all assigned tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost</em>' attribute.
-	 * @see #setCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Cost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='Cost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getCost <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost</em>' attribute.
-	 * @see #getCost()
-	 * @generated
-	 */
-	void setCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Rate</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The overtime rate of the resource. 
-	 *                                 This value is as of the current date if a rate table exists for the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Rate</em>' attribute.
-	 * @see #setOvertimeRate(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_OvertimeRate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='OvertimeRate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getOvertimeRate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getOvertimeRate <em>Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Rate</em>' attribute.
-	 * @see #getOvertimeRate()
-	 * @generated
-	 */
-	void setOvertimeRate(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Rate Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The units used by Microsoft Project to display the overtime rate.  
-	 *                                 1=m, 2=h, 3=d, 4=w, 5=mo, 7=y
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Rate Format</em>' attribute.
-	 * @see #setOvertimeRateFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_OvertimeRateFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.OvertimeRateFormatType1"
-	 *        extendedMetaData="kind='element' name='OvertimeRateFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getOvertimeRateFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getOvertimeRateFormat <em>Overtime Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Rate Format</em>' attribute.
-	 * @see #getOvertimeRateFormat()
-	 * @generated
-	 */
-	void setOvertimeRateFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The total overtime cost for the resource including actual and remaining overtime costs.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Cost</em>' attribute.
-	 * @see #setOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_OvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='OvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getOvertimeCost <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Cost</em>' attribute.
-	 * @see #getOvertimeCost()
-	 * @generated
-	 */
-	void setOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost Per Use</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The cost per use of the resource. This value is as of the current date if a rate table 
-	 *                                 exists for the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost Per Use</em>' attribute.
-	 * @see #setCostPerUse(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_CostPerUse()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='CostPerUse' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getCostPerUse();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getCostPerUse <em>Cost Per Use</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost Per Use</em>' attribute.
-	 * @see #getCostPerUse()
-	 * @generated
-	 */
-	void setCostPerUse(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual cost incurred by the resource across all assigned tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Cost</em>' attribute.
-	 * @see #setActualCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ActualCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='ActualCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getActualCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getActualCost <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Cost</em>' attribute.
-	 * @see #getActualCost()
-	 * @generated
-	 */
-	void setActualCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual overtime cost incurred by the resource across all assigned tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Cost</em>' attribute.
-	 * @see #setActualOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ActualOvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getActualOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getActualOvertimeCost <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Cost</em>' attribute.
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 */
-	void setActualOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining projected cost of the resource to complete all assigned tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Cost</em>' attribute.
-	 * @see #setRemainingCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_RemainingCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='RemainingCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getRemainingCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getRemainingCost <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Cost</em>' attribute.
-	 * @see #getRemainingCost()
-	 * @generated
-	 */
-	void setRemainingCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining projected overtime cost of the resource to complete all assigned tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Overtime Cost</em>' attribute.
-	 * @see #setRemainingOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_RemainingOvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='RemainingOvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getRemainingOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Overtime Cost</em>' attribute.
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 */
-	void setRemainingOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Work Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The difference between the baseline work and the work as minutes x 1000.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work Variance</em>' attribute.
-	 * @see #isSetWorkVariance()
-	 * @see #unsetWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_WorkVariance()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='WorkVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getWorkVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getWorkVariance <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Variance</em>' attribute.
-	 * @see #isSetWorkVariance()
-	 * @see #unsetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @generated
-	 */
-	void setWorkVariance(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getWorkVariance <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @generated
-	 */
-	void unsetWorkVariance();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getWorkVariance <em>Work Variance</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Work Variance</em>' attribute is set.
-	 * @see #unsetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @generated
-	 */
-	boolean isSetWorkVariance();
-
-	/**
-	 * Returns the value of the '<em><b>Cost Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The difference between the baseline cost and the cost.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost Variance</em>' attribute.
-	 * @see #isSetCostVariance()
-	 * @see #unsetCostVariance()
-	 * @see #setCostVariance(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_CostVariance()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='CostVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getCostVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getCostVariance <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost Variance</em>' attribute.
-	 * @see #isSetCostVariance()
-	 * @see #unsetCostVariance()
-	 * @see #getCostVariance()
-	 * @generated
-	 */
-	void setCostVariance(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getCostVariance <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCostVariance()
-	 * @see #getCostVariance()
-	 * @see #setCostVariance(float)
-	 * @generated
-	 */
-	void unsetCostVariance();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getCostVariance <em>Cost Variance</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Cost Variance</em>' attribute is set.
-	 * @see #unsetCostVariance()
-	 * @see #getCostVariance()
-	 * @see #setCostVariance(float)
-	 * @generated
-	 */
-	boolean isSetCostVariance();
-
-	/**
-	 * Returns the value of the '<em><b>SV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Earned value schedule variance, through the project status date.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>SV</em>' attribute.
-	 * @see #isSetSV()
-	 * @see #unsetSV()
-	 * @see #setSV(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_SV()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='SV' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getSV();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getSV <em>SV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>SV</em>' attribute.
-	 * @see #isSetSV()
-	 * @see #unsetSV()
-	 * @see #getSV()
-	 * @generated
-	 */
-	void setSV(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getSV <em>SV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSV()
-	 * @see #getSV()
-	 * @see #setSV(float)
-	 * @generated
-	 */
-	void unsetSV();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getSV <em>SV</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>SV</em>' attribute is set.
-	 * @see #unsetSV()
-	 * @see #getSV()
-	 * @see #setSV(float)
-	 * @generated
-	 */
-	boolean isSetSV();
-
-	/**
-	 * Returns the value of the '<em><b>CV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Earned value cost variance, through the project status date.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>CV</em>' attribute.
-	 * @see #isSetCV()
-	 * @see #unsetCV()
-	 * @see #setCV(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_CV()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='CV' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getCV();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getCV <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>CV</em>' attribute.
-	 * @see #isSetCV()
-	 * @see #unsetCV()
-	 * @see #getCV()
-	 * @generated
-	 */
-	void setCV(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getCV <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCV()
-	 * @see #getCV()
-	 * @see #setCV(float)
-	 * @generated
-	 */
-	void unsetCV();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getCV <em>CV</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>CV</em>' attribute is set.
-	 * @see #unsetCV()
-	 * @see #getCV()
-	 * @see #setCV(float)
-	 * @generated
-	 */
-	boolean isSetCV();
-
-	/**
-	 * Returns the value of the '<em><b>ACWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual cost of the work performed by the resource for the project to-date.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>ACWP</em>' attribute.
-	 * @see #isSetACWP()
-	 * @see #unsetACWP()
-	 * @see #setACWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ACWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='ACWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getACWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getACWP <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>ACWP</em>' attribute.
-	 * @see #isSetACWP()
-	 * @see #unsetACWP()
-	 * @see #getACWP()
-	 * @generated
-	 */
-	void setACWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getACWP <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetACWP()
-	 * @see #getACWP()
-	 * @see #setACWP(float)
-	 * @generated
-	 */
-	void unsetACWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getACWP <em>ACWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>ACWP</em>' attribute is set.
-	 * @see #unsetACWP()
-	 * @see #getACWP()
-	 * @see #setACWP(float)
-	 * @generated
-	 */
-	boolean isSetACWP();
-
-	/**
-	 * Returns the value of the '<em><b>Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The resource calendar.Refers to a valid UID in the Calendars element of 
-	 *                                 the Microsoft Project XML Schema.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Calendar UID</em>' attribute.
-	 * @see #setCalendarUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_CalendarUID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='CalendarUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCalendarUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getCalendarUID <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Calendar UID</em>' attribute.
-	 * @see #getCalendarUID()
-	 * @generated
-	 */
-	void setCalendarUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Text notes associated with the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Notes</em>' attribute.
-	 * @see #setNotes(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Notes()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Notes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getNotes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getNotes <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Notes</em>' attribute.
-	 * @see #getNotes()
-	 * @generated
-	 */
-	void setNotes(String value);
-
-	/**
-	 * Returns the value of the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budget cost of work scheduled for the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #setBCWS(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_BCWS()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWS' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWS();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @generated
-	 */
-	void setBCWS(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	void unsetBCWS();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getBCWS <em>BCWS</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWS</em>' attribute is set.
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	boolean isSetBCWS();
-
-	/**
-	 * Returns the value of the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of of the work performed by the resource for the project to-date.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #setBCWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_BCWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @generated
-	 */
-	void setBCWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	void unsetBCWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#getBCWP <em>BCWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWP</em>' attribute is set.
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	boolean isSetBCWP();
-
-	/**
-	 * Returns the value of the '<em><b>Is Generic</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies whether the resource is generic.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Generic</em>' attribute.
-	 * @see #isSetIsGeneric()
-	 * @see #unsetIsGeneric()
-	 * @see #setIsGeneric(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_IsGeneric()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsGeneric' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsGeneric();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsGeneric <em>Is Generic</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Generic</em>' attribute.
-	 * @see #isSetIsGeneric()
-	 * @see #unsetIsGeneric()
-	 * @see #isIsGeneric()
-	 * @generated
-	 */
-	void setIsGeneric(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsGeneric <em>Is Generic</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsGeneric()
-	 * @see #isIsGeneric()
-	 * @see #setIsGeneric(boolean)
-	 * @generated
-	 */
-	void unsetIsGeneric();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#isIsGeneric <em>Is Generic</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Generic</em>' attribute is set.
-	 * @see #unsetIsGeneric()
-	 * @see #isIsGeneric()
-	 * @see #setIsGeneric(boolean)
-	 * @generated
-	 */
-	boolean isSetIsGeneric();
-
-	/**
-	 * Returns the value of the '<em><b>Is Inactive</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies whether the resource is set to inactive.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Inactive</em>' attribute.
-	 * @see #isSetIsInactive()
-	 * @see #unsetIsInactive()
-	 * @see #setIsInactive(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_IsInactive()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsInactive' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsInactive();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsInactive <em>Is Inactive</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Inactive</em>' attribute.
-	 * @see #isSetIsInactive()
-	 * @see #unsetIsInactive()
-	 * @see #isIsInactive()
-	 * @generated
-	 */
-	void setIsInactive(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsInactive <em>Is Inactive</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsInactive()
-	 * @see #isIsInactive()
-	 * @see #setIsInactive(boolean)
-	 * @generated
-	 */
-	void unsetIsInactive();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#isIsInactive <em>Is Inactive</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Inactive</em>' attribute is set.
-	 * @see #unsetIsInactive()
-	 * @see #isIsInactive()
-	 * @see #setIsInactive(boolean)
-	 * @generated
-	 */
-	boolean isSetIsInactive();
-
-	/**
-	 * Returns the value of the '<em><b>Is Enterprise</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies whether the resource is an Enterprise resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Enterprise</em>' attribute.
-	 * @see #isSetIsEnterprise()
-	 * @see #unsetIsEnterprise()
-	 * @see #setIsEnterprise(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_IsEnterprise()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsEnterprise' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsEnterprise();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsEnterprise <em>Is Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Enterprise</em>' attribute.
-	 * @see #isSetIsEnterprise()
-	 * @see #unsetIsEnterprise()
-	 * @see #isIsEnterprise()
-	 * @generated
-	 */
-	void setIsEnterprise(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Resource#isIsEnterprise <em>Is Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsEnterprise()
-	 * @see #isIsEnterprise()
-	 * @see #setIsEnterprise(boolean)
-	 * @generated
-	 */
-	void unsetIsEnterprise();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Resource#isIsEnterprise <em>Is Enterprise</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Enterprise</em>' attribute is set.
-	 * @see #unsetIsEnterprise()
-	 * @see #isIsEnterprise()
-	 * @see #setIsEnterprise(boolean)
-	 * @generated
-	 */
-	boolean isSetIsEnterprise();
-
-	/**
-	 * Returns the value of the '<em><b>Booking Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the booking type of the resource. 1=Commited, 2=Proposed
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Booking Type</em>' attribute.
-	 * @see #setBookingType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_BookingType()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.BookingTypeType1"
-	 *        extendedMetaData="kind='element' name='BookingType' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getBookingType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getBookingType <em>Booking Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Booking Type</em>' attribute.
-	 * @see #getBookingType()
-	 * @generated
-	 */
-	void setBookingType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the duration through which actual work is protected.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Work Protected</em>' attribute.
-	 * @see #setActualWorkProtected(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ActualWorkProtected()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualWorkProtected' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualWorkProtected();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getActualWorkProtected <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Work Protected</em>' attribute.
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 */
-	void setActualWorkProtected(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the duration through which actual overtime work is protected.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Work Protected</em>' attribute.
-	 * @see #setActualOvertimeWorkProtected(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ActualOvertimeWorkProtected()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeWorkProtected' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualOvertimeWorkProtected();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Work Protected</em>' attribute.
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 */
-	void setActualOvertimeWorkProtected(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Active Directory GUID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The Active Directory GUID for the resource.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Active Directory GUID</em>' attribute.
-	 * @see #setActiveDirectoryGUID(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ActiveDirectoryGUID()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.ActiveDirectoryGUIDType"
-	 *        extendedMetaData="kind='element' name='ActiveDirectoryGUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getActiveDirectoryGUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getActiveDirectoryGUID <em>Active Directory GUID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Active Directory GUID</em>' attribute.
-	 * @see #getActiveDirectoryGUID()
-	 * @generated
-	 */
-	void setActiveDirectoryGUID(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Creation Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the resource was created.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Creation Date</em>' attribute.
-	 * @see #setCreationDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_CreationDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='CreationDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getCreationDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getCreationDate <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Creation Date</em>' attribute.
-	 * @see #getCreationDate()
-	 * @generated
-	 */
-	void setCreationDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.ExtendedAttribute3}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The value of an extended attribute.  Two pieces of data are necessary - 
-	 *                                 a pointer back to the extended attribute table which is specified either by the unique ID or the Field ID, 
-	 *                                 and the value which is specified either with the value, or a pointer back to the value list.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Extended Attribute</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_ExtendedAttribute()
-	 * @model type="org.eclipse.epf.msproject.ExtendedAttribute3" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='ExtendedAttribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExtendedAttribute();
-
-	/**
-	 * Returns the value of the '<em><b>Baseline</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Baseline2}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The baseline values for the resources.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Baseline</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Baseline()
-	 * @model type="org.eclipse.epf.msproject.Baseline2" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Baseline' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getBaseline();
-
-	/**
-	 * Returns the value of the '<em><b>Outline Code</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.OutlineCode3}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The value of an outline code.  Two pieces of data are necessary - a pointer back to 
-	 *                                 the outline code table which is specified either by the unique ID or the Field ID, and the value which is 
-	 *                                 specified either with the value, or a pointer back to the value list.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Outline Code</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_OutlineCode()
-	 * @model type="org.eclipse.epf.msproject.OutlineCode3" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='OutlineCode' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getOutlineCode();
-
-	/**
-	 * Returns the value of the '<em><b>Availability Periods</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A collection of periods during which the resource is available.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Availability Periods</em>' containment reference.
-	 * @see #setAvailabilityPeriods(AvailabilityPeriods)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_AvailabilityPeriods()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='AvailabilityPeriods' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AvailabilityPeriods getAvailabilityPeriods();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getAvailabilityPeriods <em>Availability Periods</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Availability Periods</em>' containment reference.
-	 * @see #getAvailabilityPeriods()
-	 * @generated
-	 */
-	void setAvailabilityPeriods(AvailabilityPeriods value);
-
-	/**
-	 * Returns the value of the '<em><b>Rates</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A collection of periods and the rates associated with each one.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rates</em>' containment reference.
-	 * @see #setRates(Rates)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_Rates()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Rates' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Rates getRates();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Resource#getRates <em>Rates</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rates</em>' containment reference.
-	 * @see #getRates()
-	 * @generated
-	 */
-	void setRates(Rates value);
-
-	/**
-	 * Returns the value of the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.TimephasedDataType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The time phased data
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Timephased Data</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResource_TimephasedData()
-	 * @model type="org.eclipse.epf.msproject.TimephasedDataType" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='TimephasedData' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTimephasedData();
-
-} // Resource
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Resources.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Resources.java
deleted file mode 100644
index 76bf6f1..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Resources.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Resources.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resources</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Resources#getResource <em>Resource</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getResources()
- * @model extendedMetaData="name='Resources_._type' kind='elementOnly'"
- * @generated
- */
-public interface Resources extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Resource</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Resource}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * There must be at least one resource in each Resources collection.
-	 *                     
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resource</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getResources_Resource()
-	 * @model type="org.eclipse.epf.msproject.Resource" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Resource' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getResource();
-
-} // Resources
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Task.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Task.java
deleted file mode 100644
index 40b4129..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Task.java
+++ /dev/null
@@ -1,3171 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Task.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Task</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Task#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isIsNull <em>Is Null</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getCreateDate <em>Create Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getContact <em>Contact</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getWBS <em>WBS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getWBSLevel <em>WBS Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getOutlineNumber <em>Outline Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getOutlineLevel <em>Outline Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getPriority <em>Priority</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getDuration <em>Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getDurationFormat <em>Duration Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getStop <em>Stop</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getResume <em>Resume</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isResumeValid <em>Resume Valid</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isEffortDriven <em>Effort Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isRecurring <em>Recurring</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isOverAllocated <em>Over Allocated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isEstimated <em>Estimated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isMilestone <em>Milestone</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isSummary <em>Summary</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isCritical <em>Critical</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isIsSubproject <em>Is Subproject</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isIsSubprojectReadOnly <em>Is Subproject Read Only</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getSubprojectName <em>Subproject Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isExternalTask <em>External Task</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getExternalTaskProject <em>External Task Project</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getEarlyStart <em>Early Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getEarlyFinish <em>Early Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getLateStart <em>Late Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getLateFinish <em>Late Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getStartVariance <em>Start Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getFinishVariance <em>Finish Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getWorkVariance <em>Work Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getFreeSlack <em>Free Slack</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getTotalSlack <em>Total Slack</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getFixedCost <em>Fixed Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getFixedCostAccrual <em>Fixed Cost Accrual</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getPercentComplete <em>Percent Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getPercentWorkComplete <em>Percent Work Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getOvertimeCost <em>Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getOvertimeWork <em>Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualStart <em>Actual Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualFinish <em>Actual Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualDuration <em>Actual Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualCost <em>Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualOvertimeCost <em>Actual Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualWork <em>Actual Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualOvertimeWork <em>Actual Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getRegularWork <em>Regular Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getRemainingDuration <em>Remaining Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getRemainingCost <em>Remaining Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getRemainingWork <em>Remaining Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getACWP <em>ACWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getCV <em>CV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getConstraintType <em>Constraint Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getCalendarUID <em>Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getConstraintDate <em>Constraint Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getDeadline <em>Deadline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isLevelAssignments <em>Level Assignments</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isLevelingCanSplit <em>Leveling Can Split</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getLevelingDelay <em>Leveling Delay</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getLevelingDelayFormat <em>Leveling Delay Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getPreLeveledStart <em>Pre Leveled Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getPreLeveledFinish <em>Pre Leveled Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getHyperlink <em>Hyperlink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getHyperlinkAddress <em>Hyperlink Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isIgnoreResourceCalendar <em>Ignore Resource Calendar</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getNotes <em>Notes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isHideBar <em>Hide Bar</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#isRollup <em>Rollup</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getBCWP <em>BCWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getPhysicalPercentComplete <em>Physical Percent Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getEarnedValueMethod <em>Earned Value Method</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getPredecessorLink <em>Predecessor Link</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualWorkProtected <em>Actual Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getExtendedAttribute <em>Extended Attribute</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getBaseline <em>Baseline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getOutlineCode <em>Outline Code</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Task#getTimephasedData <em>Timephased Data</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getTask()
- * @model extendedMetaData="name='Task_._type' kind='elementOnly'"
- * @generated
- */
-public interface Task extends EObject {
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The position identifier of the task within the list of tasks.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>ID</em>' attribute.
-	 * @see #setID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getID <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>ID</em>' attribute.
-	 * @see #getID()
-	 * @generated
-	 */
-	void setID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The name of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Name()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.NameType2"
-	 *        extendedMetaData="kind='element' name='Name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The type of task. 
-	 *                                 Values are: 0=Fixed Units, 1=Fixed Duration, 2=Fixed Work.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see #setType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Type()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.TypeType"
-	 *        extendedMetaData="kind='element' name='Type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Is Null</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies whether the task is null.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Null</em>' attribute.
-	 * @see #isSetIsNull()
-	 * @see #unsetIsNull()
-	 * @see #setIsNull(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_IsNull()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsNull' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsNull();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isIsNull <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Null</em>' attribute.
-	 * @see #isSetIsNull()
-	 * @see #unsetIsNull()
-	 * @see #isIsNull()
-	 * @generated
-	 */
-	void setIsNull(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isIsNull <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsNull()
-	 * @see #isIsNull()
-	 * @see #setIsNull(boolean)
-	 * @generated
-	 */
-	void unsetIsNull();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isIsNull <em>Is Null</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Null</em>' attribute is set.
-	 * @see #unsetIsNull()
-	 * @see #isIsNull()
-	 * @see #setIsNull(boolean)
-	 * @generated
-	 */
-	boolean isSetIsNull();
-
-	/**
-	 * Returns the value of the '<em><b>Create Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the task was created.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Create Date</em>' attribute.
-	 * @see #setCreateDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_CreateDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='CreateDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getCreateDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getCreateDate <em>Create Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Create Date</em>' attribute.
-	 * @see #getCreateDate()
-	 * @generated
-	 */
-	void setCreateDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Contact</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The contact person for the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Contact</em>' attribute.
-	 * @see #setContact(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Contact()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.ContactType"
-	 *        extendedMetaData="kind='element' name='Contact' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getContact();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getContact <em>Contact</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Contact</em>' attribute.
-	 * @see #getContact()
-	 * @generated
-	 */
-	void setContact(String value);
-
-	/**
-	 * Returns the value of the '<em><b>WBS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The work breakdown structure code of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>WBS</em>' attribute.
-	 * @see #setWBS(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_WBS()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='WBS' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getWBS();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getWBS <em>WBS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>WBS</em>' attribute.
-	 * @see #getWBS()
-	 * @generated
-	 */
-	void setWBS(String value);
-
-	/**
-	 * Returns the value of the '<em><b>WBS Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The rightmost WBS level of the task. 
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>WBS Level</em>' attribute.
-	 * @see #setWBSLevel(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_WBSLevel()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='WBSLevel' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getWBSLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getWBSLevel <em>WBS Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>WBS Level</em>' attribute.
-	 * @see #getWBSLevel()
-	 * @generated
-	 */
-	void setWBSLevel(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Outline Number</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The outline number of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Outline Number</em>' attribute.
-	 * @see #setOutlineNumber(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_OutlineNumber()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.OutlineNumberType"
-	 *        extendedMetaData="kind='element' name='OutlineNumber' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getOutlineNumber();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getOutlineNumber <em>Outline Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Outline Number</em>' attribute.
-	 * @see #getOutlineNumber()
-	 * @generated
-	 */
-	void setOutlineNumber(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Outline Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The outline level of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Outline Level</em>' attribute.
-	 * @see #setOutlineLevel(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_OutlineLevel()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='OutlineLevel' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getOutlineLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getOutlineLevel <em>Outline Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Outline Level</em>' attribute.
-	 * @see #getOutlineLevel()
-	 * @generated
-	 */
-	void setOutlineLevel(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Priority</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The priority of the task from 0 to 1000.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Priority</em>' attribute.
-	 * @see #setPriority(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Priority()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='Priority' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getPriority();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getPriority <em>Priority</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Priority</em>' attribute.
-	 * @see #getPriority()
-	 * @generated
-	 */
-	void setPriority(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled start date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start</em>' attribute.
-	 * @see #setStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Start()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Start' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getStart <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start</em>' attribute.
-	 * @see #getStart()
-	 * @generated
-	 */
-	void setStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The scheduled finish date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish</em>' attribute.
-	 * @see #setFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Finish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Finish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getFinish <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish</em>' attribute.
-	 * @see #getFinish()
-	 * @generated
-	 */
-	void setFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The planned duration of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration</em>' attribute.
-	 * @see #setDuration(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Duration()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Duration' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getDuration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getDuration <em>Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration</em>' attribute.
-	 * @see #getDuration()
-	 * @generated
-	 */
-	void setDuration(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Duration Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the Duration of the Task.  
-	 *                                 Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 
-	 *                                 20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 
-	 *                                 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Duration Format</em>' attribute.
-	 * @see #setDurationFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_DurationFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DurationFormatType4"
-	 *        extendedMetaData="kind='element' name='DurationFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDurationFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getDurationFormat <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Duration Format</em>' attribute.
-	 * @see #getDurationFormat()
-	 * @generated
-	 */
-	void setDurationFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of scheduled work for the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work</em>' attribute.
-	 * @see #setWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Work()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='Work' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getWork <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work</em>' attribute.
-	 * @see #getWork()
-	 * @generated
-	 */
-	void setWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Stop</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the task was stopped.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Stop</em>' attribute.
-	 * @see #setStop(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Stop()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Stop' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStop();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getStop <em>Stop</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Stop</em>' attribute.
-	 * @see #getStop()
-	 * @generated
-	 */
-	void setStop(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Resume</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date that the task resumed.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resume</em>' attribute.
-	 * @see #setResume(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Resume()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Resume' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getResume();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getResume <em>Resume</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resume</em>' attribute.
-	 * @see #getResume()
-	 * @generated
-	 */
-	void setResume(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Resume Valid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task can be resumed.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resume Valid</em>' attribute.
-	 * @see #isSetResumeValid()
-	 * @see #unsetResumeValid()
-	 * @see #setResumeValid(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ResumeValid()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='ResumeValid' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isResumeValid();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isResumeValid <em>Resume Valid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resume Valid</em>' attribute.
-	 * @see #isSetResumeValid()
-	 * @see #unsetResumeValid()
-	 * @see #isResumeValid()
-	 * @generated
-	 */
-	void setResumeValid(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isResumeValid <em>Resume Valid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetResumeValid()
-	 * @see #isResumeValid()
-	 * @see #setResumeValid(boolean)
-	 * @generated
-	 */
-	void unsetResumeValid();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isResumeValid <em>Resume Valid</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Resume Valid</em>' attribute is set.
-	 * @see #unsetResumeValid()
-	 * @see #isResumeValid()
-	 * @see #setResumeValid(boolean)
-	 * @generated
-	 */
-	boolean isSetResumeValid();
-
-	/**
-	 * Returns the value of the '<em><b>Effort Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is effort-driven.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Effort Driven</em>' attribute.
-	 * @see #isSetEffortDriven()
-	 * @see #unsetEffortDriven()
-	 * @see #setEffortDriven(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_EffortDriven()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='EffortDriven' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isEffortDriven();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isEffortDriven <em>Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Effort Driven</em>' attribute.
-	 * @see #isSetEffortDriven()
-	 * @see #unsetEffortDriven()
-	 * @see #isEffortDriven()
-	 * @generated
-	 */
-	void setEffortDriven(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isEffortDriven <em>Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetEffortDriven()
-	 * @see #isEffortDriven()
-	 * @see #setEffortDriven(boolean)
-	 * @generated
-	 */
-	void unsetEffortDriven();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isEffortDriven <em>Effort Driven</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Effort Driven</em>' attribute is set.
-	 * @see #unsetEffortDriven()
-	 * @see #isEffortDriven()
-	 * @see #setEffortDriven(boolean)
-	 * @generated
-	 */
-	boolean isSetEffortDriven();
-
-	/**
-	 * Returns the value of the '<em><b>Recurring</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is a recurring task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Recurring</em>' attribute.
-	 * @see #isSetRecurring()
-	 * @see #unsetRecurring()
-	 * @see #setRecurring(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Recurring()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Recurring' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isRecurring();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isRecurring <em>Recurring</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Recurring</em>' attribute.
-	 * @see #isSetRecurring()
-	 * @see #unsetRecurring()
-	 * @see #isRecurring()
-	 * @generated
-	 */
-	void setRecurring(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isRecurring <em>Recurring</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetRecurring()
-	 * @see #isRecurring()
-	 * @see #setRecurring(boolean)
-	 * @generated
-	 */
-	void unsetRecurring();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isRecurring <em>Recurring</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Recurring</em>' attribute is set.
-	 * @see #unsetRecurring()
-	 * @see #isRecurring()
-	 * @see #setRecurring(boolean)
-	 * @generated
-	 */
-	boolean isSetRecurring();
-
-	/**
-	 * Returns the value of the '<em><b>Over Allocated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is overallocated. 
-	 *                                 This element is informational only.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Over Allocated</em>' attribute.
-	 * @see #isSetOverAllocated()
-	 * @see #unsetOverAllocated()
-	 * @see #setOverAllocated(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_OverAllocated()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='OverAllocated' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isOverAllocated();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isOverAllocated <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Over Allocated</em>' attribute.
-	 * @see #isSetOverAllocated()
-	 * @see #unsetOverAllocated()
-	 * @see #isOverAllocated()
-	 * @generated
-	 */
-	void setOverAllocated(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isOverAllocated <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetOverAllocated()
-	 * @see #isOverAllocated()
-	 * @see #setOverAllocated(boolean)
-	 * @generated
-	 */
-	void unsetOverAllocated();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isOverAllocated <em>Over Allocated</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Over Allocated</em>' attribute is set.
-	 * @see #unsetOverAllocated()
-	 * @see #isOverAllocated()
-	 * @see #setOverAllocated(boolean)
-	 * @generated
-	 */
-	boolean isSetOverAllocated();
-
-	/**
-	 * Returns the value of the '<em><b>Estimated</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is estimated.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Estimated</em>' attribute.
-	 * @see #isSetEstimated()
-	 * @see #unsetEstimated()
-	 * @see #setEstimated(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Estimated()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Estimated' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isEstimated();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isEstimated <em>Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Estimated</em>' attribute.
-	 * @see #isSetEstimated()
-	 * @see #unsetEstimated()
-	 * @see #isEstimated()
-	 * @generated
-	 */
-	void setEstimated(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isEstimated <em>Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetEstimated()
-	 * @see #isEstimated()
-	 * @see #setEstimated(boolean)
-	 * @generated
-	 */
-	void unsetEstimated();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isEstimated <em>Estimated</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Estimated</em>' attribute is set.
-	 * @see #unsetEstimated()
-	 * @see #isEstimated()
-	 * @see #setEstimated(boolean)
-	 * @generated
-	 */
-	boolean isSetEstimated();
-
-	/**
-	 * Returns the value of the '<em><b>Milestone</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is a milestone.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Milestone</em>' attribute.
-	 * @see #isSetMilestone()
-	 * @see #unsetMilestone()
-	 * @see #setMilestone(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Milestone()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Milestone' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMilestone();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isMilestone <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Milestone</em>' attribute.
-	 * @see #isSetMilestone()
-	 * @see #unsetMilestone()
-	 * @see #isMilestone()
-	 * @generated
-	 */
-	void setMilestone(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isMilestone <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetMilestone()
-	 * @see #isMilestone()
-	 * @see #setMilestone(boolean)
-	 * @generated
-	 */
-	void unsetMilestone();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isMilestone <em>Milestone</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Milestone</em>' attribute is set.
-	 * @see #unsetMilestone()
-	 * @see #isMilestone()
-	 * @see #setMilestone(boolean)
-	 * @generated
-	 */
-	boolean isSetMilestone();
-
-	/**
-	 * Returns the value of the '<em><b>Summary</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is a summary task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Summary</em>' attribute.
-	 * @see #isSetSummary()
-	 * @see #unsetSummary()
-	 * @see #setSummary(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Summary()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Summary' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isSummary();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isSummary <em>Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Summary</em>' attribute.
-	 * @see #isSetSummary()
-	 * @see #unsetSummary()
-	 * @see #isSummary()
-	 * @generated
-	 */
-	void setSummary(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isSummary <em>Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSummary()
-	 * @see #isSummary()
-	 * @see #setSummary(boolean)
-	 * @generated
-	 */
-	void unsetSummary();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isSummary <em>Summary</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Summary</em>' attribute is set.
-	 * @see #unsetSummary()
-	 * @see #isSummary()
-	 * @see #setSummary(boolean)
-	 * @generated
-	 */
-	boolean isSetSummary();
-
-	/**
-	 * Returns the value of the '<em><b>Critical</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is in the critical chain.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Critical</em>' attribute.
-	 * @see #isSetCritical()
-	 * @see #unsetCritical()
-	 * @see #setCritical(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Critical()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Critical' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isCritical();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isCritical <em>Critical</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Critical</em>' attribute.
-	 * @see #isSetCritical()
-	 * @see #unsetCritical()
-	 * @see #isCritical()
-	 * @generated
-	 */
-	void setCritical(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isCritical <em>Critical</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCritical()
-	 * @see #isCritical()
-	 * @see #setCritical(boolean)
-	 * @generated
-	 */
-	void unsetCritical();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isCritical <em>Critical</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Critical</em>' attribute is set.
-	 * @see #unsetCritical()
-	 * @see #isCritical()
-	 * @see #setCritical(boolean)
-	 * @generated
-	 */
-	boolean isSetCritical();
-
-	/**
-	 * Returns the value of the '<em><b>Is Subproject</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is an inserted project.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Subproject</em>' attribute.
-	 * @see #isSetIsSubproject()
-	 * @see #unsetIsSubproject()
-	 * @see #setIsSubproject(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_IsSubproject()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsSubproject' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsSubproject();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isIsSubproject <em>Is Subproject</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Subproject</em>' attribute.
-	 * @see #isSetIsSubproject()
-	 * @see #unsetIsSubproject()
-	 * @see #isIsSubproject()
-	 * @generated
-	 */
-	void setIsSubproject(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isIsSubproject <em>Is Subproject</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsSubproject()
-	 * @see #isIsSubproject()
-	 * @see #setIsSubproject(boolean)
-	 * @generated
-	 */
-	void unsetIsSubproject();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isIsSubproject <em>Is Subproject</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Subproject</em>' attribute is set.
-	 * @see #unsetIsSubproject()
-	 * @see #isIsSubproject()
-	 * @see #setIsSubproject(boolean)
-	 * @generated
-	 */
-	boolean isSetIsSubproject();
-
-	/**
-	 * Returns the value of the '<em><b>Is Subproject Read Only</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the inserted project is read-only.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Subproject Read Only</em>' attribute.
-	 * @see #isSetIsSubprojectReadOnly()
-	 * @see #unsetIsSubprojectReadOnly()
-	 * @see #setIsSubprojectReadOnly(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_IsSubprojectReadOnly()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IsSubprojectReadOnly' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIsSubprojectReadOnly();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isIsSubprojectReadOnly <em>Is Subproject Read Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Subproject Read Only</em>' attribute.
-	 * @see #isSetIsSubprojectReadOnly()
-	 * @see #unsetIsSubprojectReadOnly()
-	 * @see #isIsSubprojectReadOnly()
-	 * @generated
-	 */
-	void setIsSubprojectReadOnly(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isIsSubprojectReadOnly <em>Is Subproject Read Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsSubprojectReadOnly()
-	 * @see #isIsSubprojectReadOnly()
-	 * @see #setIsSubprojectReadOnly(boolean)
-	 * @generated
-	 */
-	void unsetIsSubprojectReadOnly();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isIsSubprojectReadOnly <em>Is Subproject Read Only</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Subproject Read Only</em>' attribute is set.
-	 * @see #unsetIsSubprojectReadOnly()
-	 * @see #isIsSubprojectReadOnly()
-	 * @see #setIsSubprojectReadOnly(boolean)
-	 * @generated
-	 */
-	boolean isSetIsSubprojectReadOnly();
-
-	/**
-	 * Returns the value of the '<em><b>Subproject Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The source location of the inserted project.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Subproject Name</em>' attribute.
-	 * @see #setSubprojectName(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_SubprojectName()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.SubprojectNameType"
-	 *        extendedMetaData="kind='element' name='SubprojectName' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getSubprojectName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getSubprojectName <em>Subproject Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Subproject Name</em>' attribute.
-	 * @see #getSubprojectName()
-	 * @generated
-	 */
-	void setSubprojectName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>External Task</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is external.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Task</em>' attribute.
-	 * @see #isSetExternalTask()
-	 * @see #unsetExternalTask()
-	 * @see #setExternalTask(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ExternalTask()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='ExternalTask' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isExternalTask();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isExternalTask <em>External Task</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Task</em>' attribute.
-	 * @see #isSetExternalTask()
-	 * @see #unsetExternalTask()
-	 * @see #isExternalTask()
-	 * @generated
-	 */
-	void setExternalTask(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isExternalTask <em>External Task</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetExternalTask()
-	 * @see #isExternalTask()
-	 * @see #setExternalTask(boolean)
-	 * @generated
-	 */
-	void unsetExternalTask();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isExternalTask <em>External Task</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>External Task</em>' attribute is set.
-	 * @see #unsetExternalTask()
-	 * @see #isExternalTask()
-	 * @see #setExternalTask(boolean)
-	 * @generated
-	 */
-	boolean isSetExternalTask();
-
-	/**
-	 * Returns the value of the '<em><b>External Task Project</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The source location and task identifier of the external task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Task Project</em>' attribute.
-	 * @see #setExternalTaskProject(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ExternalTaskProject()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.ExternalTaskProjectType"
-	 *        extendedMetaData="kind='element' name='ExternalTaskProject' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getExternalTaskProject();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getExternalTaskProject <em>External Task Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Task Project</em>' attribute.
-	 * @see #getExternalTaskProject()
-	 * @generated
-	 */
-	void setExternalTaskProject(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Early Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The early start date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Early Start</em>' attribute.
-	 * @see #setEarlyStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_EarlyStart()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='EarlyStart' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getEarlyStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getEarlyStart <em>Early Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Early Start</em>' attribute.
-	 * @see #getEarlyStart()
-	 * @generated
-	 */
-	void setEarlyStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Early Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The early finish date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Early Finish</em>' attribute.
-	 * @see #setEarlyFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_EarlyFinish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='EarlyFinish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getEarlyFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getEarlyFinish <em>Early Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Early Finish</em>' attribute.
-	 * @see #getEarlyFinish()
-	 * @generated
-	 */
-	void setEarlyFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Late Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The late start date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Late Start</em>' attribute.
-	 * @see #setLateStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_LateStart()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='LateStart' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getLateStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getLateStart <em>Late Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Late Start</em>' attribute.
-	 * @see #getLateStart()
-	 * @generated
-	 */
-	void setLateStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Late Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The late finish date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Late Finish</em>' attribute.
-	 * @see #setLateFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_LateFinish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='LateFinish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getLateFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getLateFinish <em>Late Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Late Finish</em>' attribute.
-	 * @see #getLateFinish()
-	 * @generated
-	 */
-	void setLateFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Start Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The variance of the task start date from 
-	 *                                 the baseline start date as minutes x 1000.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start Variance</em>' attribute.
-	 * @see #setStartVariance(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_StartVariance()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='StartVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getStartVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getStartVariance <em>Start Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start Variance</em>' attribute.
-	 * @see #getStartVariance()
-	 * @generated
-	 */
-	void setStartVariance(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The variance of the task finish date from 
-	 *                                 the baseline finish date as minutes x 1000.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish Variance</em>' attribute.
-	 * @see #setFinishVariance(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_FinishVariance()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='FinishVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getFinishVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getFinishVariance <em>Finish Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish Variance</em>' attribute.
-	 * @see #getFinishVariance()
-	 * @generated
-	 */
-	void setFinishVariance(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Work Variance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The variance of task work from the baseline 
-	 *                                 task work as minutes x 1000.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Work Variance</em>' attribute.
-	 * @see #isSetWorkVariance()
-	 * @see #unsetWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_WorkVariance()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='WorkVariance' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getWorkVariance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getWorkVariance <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Variance</em>' attribute.
-	 * @see #isSetWorkVariance()
-	 * @see #unsetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @generated
-	 */
-	void setWorkVariance(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#getWorkVariance <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @generated
-	 */
-	void unsetWorkVariance();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#getWorkVariance <em>Work Variance</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Work Variance</em>' attribute is set.
-	 * @see #unsetWorkVariance()
-	 * @see #getWorkVariance()
-	 * @see #setWorkVariance(float)
-	 * @generated
-	 */
-	boolean isSetWorkVariance();
-
-	/**
-	 * Returns the value of the '<em><b>Free Slack</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of free slack.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Free Slack</em>' attribute.
-	 * @see #setFreeSlack(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_FreeSlack()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='FreeSlack' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getFreeSlack();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getFreeSlack <em>Free Slack</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Free Slack</em>' attribute.
-	 * @see #getFreeSlack()
-	 * @generated
-	 */
-	void setFreeSlack(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Total Slack</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of total slack.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Total Slack</em>' attribute.
-	 * @see #setTotalSlack(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_TotalSlack()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='TotalSlack' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getTotalSlack();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getTotalSlack <em>Total Slack</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Total Slack</em>' attribute.
-	 * @see #getTotalSlack()
-	 * @generated
-	 */
-	void setTotalSlack(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Fixed Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The fixed cost of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Fixed Cost</em>' attribute.
-	 * @see #isSetFixedCost()
-	 * @see #unsetFixedCost()
-	 * @see #setFixedCost(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_FixedCost()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='FixedCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getFixedCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getFixedCost <em>Fixed Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Fixed Cost</em>' attribute.
-	 * @see #isSetFixedCost()
-	 * @see #unsetFixedCost()
-	 * @see #getFixedCost()
-	 * @generated
-	 */
-	void setFixedCost(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#getFixedCost <em>Fixed Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetFixedCost()
-	 * @see #getFixedCost()
-	 * @see #setFixedCost(float)
-	 * @generated
-	 */
-	void unsetFixedCost();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#getFixedCost <em>Fixed Cost</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Fixed Cost</em>' attribute is set.
-	 * @see #unsetFixedCost()
-	 * @see #getFixedCost()
-	 * @see #setFixedCost(float)
-	 * @generated
-	 */
-	boolean isSetFixedCost();
-
-	/**
-	 * Returns the value of the '<em><b>Fixed Cost Accrual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * How the fixed cost is accrued against the task. 
-	 *                                 Values are: 1=Start, 2=Prorated and 3=End.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Fixed Cost Accrual</em>' attribute.
-	 * @see #setFixedCostAccrual(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_FixedCostAccrual()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.FixedCostAccrualType"
-	 *        extendedMetaData="kind='element' name='FixedCostAccrual' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getFixedCostAccrual();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getFixedCostAccrual <em>Fixed Cost Accrual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Fixed Cost Accrual</em>' attribute.
-	 * @see #getFixedCostAccrual()
-	 * @generated
-	 */
-	void setFixedCostAccrual(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Percent Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The percentage of the task duration completed.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Percent Complete</em>' attribute.
-	 * @see #setPercentComplete(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_PercentComplete()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='PercentComplete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getPercentComplete();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getPercentComplete <em>Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Percent Complete</em>' attribute.
-	 * @see #getPercentComplete()
-	 * @generated
-	 */
-	void setPercentComplete(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Percent Work Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The percentage of the task work completed.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Percent Work Complete</em>' attribute.
-	 * @see #setPercentWorkComplete(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_PercentWorkComplete()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='PercentWorkComplete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getPercentWorkComplete();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getPercentWorkComplete <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Percent Work Complete</em>' attribute.
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 */
-	void setPercentWorkComplete(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The projected or scheduled cost of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Cost</em>' attribute.
-	 * @see #setCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Cost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='Cost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getCost <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Cost</em>' attribute.
-	 * @see #getCost()
-	 * @generated
-	 */
-	void setCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The sum of the actual and remaining overtime cost of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Cost</em>' attribute.
-	 * @see #setOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_OvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='OvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getOvertimeCost <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Cost</em>' attribute.
-	 * @see #getOvertimeCost()
-	 * @generated
-	 */
-	void setOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of overtime work scheduled for the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Overtime Work</em>' attribute.
-	 * @see #setOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_OvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='OvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getOvertimeWork <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Overtime Work</em>' attribute.
-	 * @see #getOvertimeWork()
-	 * @generated
-	 */
-	void setOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual start date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Start</em>' attribute.
-	 * @see #setActualStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualStart()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='ActualStart' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualStart <em>Actual Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Start</em>' attribute.
-	 * @see #getActualStart()
-	 * @generated
-	 */
-	void setActualStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual finish date of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Finish</em>' attribute.
-	 * @see #setActualFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualFinish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='ActualFinish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualFinish <em>Actual Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Finish</em>' attribute.
-	 * @see #getActualFinish()
-	 * @generated
-	 */
-	void setActualFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual duration of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Duration</em>' attribute.
-	 * @see #setActualDuration(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualDuration()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualDuration' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualDuration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualDuration <em>Actual Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Duration</em>' attribute.
-	 * @see #getActualDuration()
-	 * @generated
-	 */
-	void setActualDuration(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual cost of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Cost</em>' attribute.
-	 * @see #setActualCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='ActualCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getActualCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualCost <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Cost</em>' attribute.
-	 * @see #getActualCost()
-	 * @generated
-	 */
-	void setActualCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual overtime cost of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Cost</em>' attribute.
-	 * @see #setActualOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualOvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getActualOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualOvertimeCost <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Cost</em>' attribute.
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 */
-	void setActualOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual work for the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Work</em>' attribute.
-	 * @see #setActualWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualWork <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Work</em>' attribute.
-	 * @see #getActualWork()
-	 * @generated
-	 */
-	void setActualWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual overtime work for the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Work</em>' attribute.
-	 * @see #setActualOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualOvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualOvertimeWork <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Work</em>' attribute.
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 */
-	void setActualOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Regular Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of non-overtime work scheduled for the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Regular Work</em>' attribute.
-	 * @see #setRegularWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_RegularWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RegularWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRegularWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getRegularWork <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Regular Work</em>' attribute.
-	 * @see #getRegularWork()
-	 * @generated
-	 */
-	void setRegularWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Duration</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The amount of time required to complete the unfinished portion of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Duration</em>' attribute.
-	 * @see #setRemainingDuration(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_RemainingDuration()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RemainingDuration' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRemainingDuration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getRemainingDuration <em>Remaining Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Duration</em>' attribute.
-	 * @see #getRemainingDuration()
-	 * @generated
-	 */
-	void setRemainingDuration(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining projected cost of completing the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Cost</em>' attribute.
-	 * @see #setRemainingCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_RemainingCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='RemainingCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getRemainingCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getRemainingCost <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Cost</em>' attribute.
-	 * @see #getRemainingCost()
-	 * @generated
-	 */
-	void setRemainingCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining work scheduled to complete the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Work</em>' attribute.
-	 * @see #setRemainingWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_RemainingWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RemainingWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRemainingWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getRemainingWork <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Work</em>' attribute.
-	 * @see #getRemainingWork()
-	 * @generated
-	 */
-	void setRemainingWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Overtime Cost</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining overtime cost projected to finish the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Overtime Cost</em>' attribute.
-	 * @see #setRemainingOvertimeCost(BigDecimal)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_RemainingOvertimeCost()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Decimal"
-	 *        extendedMetaData="kind='element' name='RemainingOvertimeCost' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigDecimal getRemainingOvertimeCost();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Overtime Cost</em>' attribute.
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 */
-	void setRemainingOvertimeCost(BigDecimal value);
-
-	/**
-	 * Returns the value of the '<em><b>Remaining Overtime Work</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The remaining overtime work scheduled to finish the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Remaining Overtime Work</em>' attribute.
-	 * @see #setRemainingOvertimeWork(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_RemainingOvertimeWork()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='RemainingOvertimeWork' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getRemainingOvertimeWork();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Remaining Overtime Work</em>' attribute.
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 */
-	void setRemainingOvertimeWork(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>ACWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual cost of work performed on the task to-date.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>ACWP</em>' attribute.
-	 * @see #isSetACWP()
-	 * @see #unsetACWP()
-	 * @see #setACWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ACWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='ACWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getACWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getACWP <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>ACWP</em>' attribute.
-	 * @see #isSetACWP()
-	 * @see #unsetACWP()
-	 * @see #getACWP()
-	 * @generated
-	 */
-	void setACWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#getACWP <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetACWP()
-	 * @see #getACWP()
-	 * @see #setACWP(float)
-	 * @generated
-	 */
-	void unsetACWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#getACWP <em>ACWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>ACWP</em>' attribute is set.
-	 * @see #unsetACWP()
-	 * @see #getACWP()
-	 * @see #setACWP(float)
-	 * @generated
-	 */
-	boolean isSetACWP();
-
-	/**
-	 * Returns the value of the '<em><b>CV</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Earned value cost variance.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>CV</em>' attribute.
-	 * @see #isSetCV()
-	 * @see #unsetCV()
-	 * @see #setCV(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_CV()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='CV' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getCV();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getCV <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>CV</em>' attribute.
-	 * @see #isSetCV()
-	 * @see #unsetCV()
-	 * @see #getCV()
-	 * @generated
-	 */
-	void setCV(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#getCV <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetCV()
-	 * @see #getCV()
-	 * @see #setCV(float)
-	 * @generated
-	 */
-	void unsetCV();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#getCV <em>CV</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>CV</em>' attribute is set.
-	 * @see #unsetCV()
-	 * @see #getCV()
-	 * @see #setCV(float)
-	 * @generated
-	 */
-	boolean isSetCV();
-
-	/**
-	 * Returns the value of the '<em><b>Constraint Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The constraint on the start or finish date of the task. 
-	 *                                 Values are: 0=As Soon As Possible, 1=As Late As Possible, 2=Must Start On, 3=Must Finish On, 
-	 *                                 4=Start No Earlier Than, 5=Start No Later Than, 6=Finish No Earlier Than and 7=Finish No Later Than
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Constraint Type</em>' attribute.
-	 * @see #setConstraintType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ConstraintType()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.ConstraintTypeType"
-	 *        extendedMetaData="kind='element' name='ConstraintType' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getConstraintType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getConstraintType <em>Constraint Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Constraint Type</em>' attribute.
-	 * @see #getConstraintType()
-	 * @generated
-	 */
-	void setConstraintType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Calendar UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The task calendar.Refers to a valid UID in the Calendars element of 
-	 *                                 the Microsoft Project XML Schema.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Calendar UID</em>' attribute.
-	 * @see #setCalendarUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_CalendarUID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='CalendarUID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getCalendarUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getCalendarUID <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Calendar UID</em>' attribute.
-	 * @see #getCalendarUID()
-	 * @generated
-	 */
-	void setCalendarUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Constraint Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date argument for the task constraint type.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Constraint Date</em>' attribute.
-	 * @see #setConstraintDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ConstraintDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='ConstraintDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getConstraintDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getConstraintDate <em>Constraint Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Constraint Date</em>' attribute.
-	 * @see #getConstraintDate()
-	 * @generated
-	 */
-	void setConstraintDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Deadline</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The deadline for the task to be completed.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Deadline</em>' attribute.
-	 * @see #setDeadline(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Deadline()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Deadline' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getDeadline();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getDeadline <em>Deadline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Deadline</em>' attribute.
-	 * @see #getDeadline()
-	 * @generated
-	 */
-	void setDeadline(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Level Assignments</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether leveling can adjust assignments.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Level Assignments</em>' attribute.
-	 * @see #isSetLevelAssignments()
-	 * @see #unsetLevelAssignments()
-	 * @see #setLevelAssignments(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_LevelAssignments()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='LevelAssignments' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isLevelAssignments();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isLevelAssignments <em>Level Assignments</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Level Assignments</em>' attribute.
-	 * @see #isSetLevelAssignments()
-	 * @see #unsetLevelAssignments()
-	 * @see #isLevelAssignments()
-	 * @generated
-	 */
-	void setLevelAssignments(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isLevelAssignments <em>Level Assignments</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLevelAssignments()
-	 * @see #isLevelAssignments()
-	 * @see #setLevelAssignments(boolean)
-	 * @generated
-	 */
-	void unsetLevelAssignments();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isLevelAssignments <em>Level Assignments</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Level Assignments</em>' attribute is set.
-	 * @see #unsetLevelAssignments()
-	 * @see #isLevelAssignments()
-	 * @see #setLevelAssignments(boolean)
-	 * @generated
-	 */
-	boolean isSetLevelAssignments();
-
-	/**
-	 * Returns the value of the '<em><b>Leveling Can Split</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether leveling can split the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Leveling Can Split</em>' attribute.
-	 * @see #isSetLevelingCanSplit()
-	 * @see #unsetLevelingCanSplit()
-	 * @see #setLevelingCanSplit(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_LevelingCanSplit()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='LevelingCanSplit' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isLevelingCanSplit();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isLevelingCanSplit <em>Leveling Can Split</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Leveling Can Split</em>' attribute.
-	 * @see #isSetLevelingCanSplit()
-	 * @see #unsetLevelingCanSplit()
-	 * @see #isLevelingCanSplit()
-	 * @generated
-	 */
-	void setLevelingCanSplit(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isLevelingCanSplit <em>Leveling Can Split</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLevelingCanSplit()
-	 * @see #isLevelingCanSplit()
-	 * @see #setLevelingCanSplit(boolean)
-	 * @generated
-	 */
-	void unsetLevelingCanSplit();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isLevelingCanSplit <em>Leveling Can Split</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Leveling Can Split</em>' attribute is set.
-	 * @see #unsetLevelingCanSplit()
-	 * @see #isLevelingCanSplit()
-	 * @see #setLevelingCanSplit(boolean)
-	 * @generated
-	 */
-	boolean isSetLevelingCanSplit();
-
-	/**
-	 * Returns the value of the '<em><b>Leveling Delay</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The delay caused by leveling the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Leveling Delay</em>' attribute.
-	 * @see #setLevelingDelay(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_LevelingDelay()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='LevelingDelay' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLevelingDelay();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getLevelingDelay <em>Leveling Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Leveling Delay</em>' attribute.
-	 * @see #getLevelingDelay()
-	 * @generated
-	 */
-	void setLevelingDelay(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Leveling Delay Format</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The format for expressing the duration of the delay.  
-	 *                                 Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 
-	 *                                 20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 
-	 *                                 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Leveling Delay Format</em>' attribute.
-	 * @see #setLevelingDelayFormat(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_LevelingDelayFormat()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.LevelingDelayFormatType1"
-	 *        extendedMetaData="kind='element' name='LevelingDelayFormat' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLevelingDelayFormat();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getLevelingDelayFormat <em>Leveling Delay Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Leveling Delay Format</em>' attribute.
-	 * @see #getLevelingDelayFormat()
-	 * @generated
-	 */
-	void setLevelingDelayFormat(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Pre Leveled Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The start date of the task before it was leveled.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Pre Leveled Start</em>' attribute.
-	 * @see #setPreLeveledStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_PreLeveledStart()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='PreLeveledStart' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getPreLeveledStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getPreLeveledStart <em>Pre Leveled Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Pre Leveled Start</em>' attribute.
-	 * @see #getPreLeveledStart()
-	 * @generated
-	 */
-	void setPreLeveledStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Pre Leveled Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The finish date of the task before it was leveled.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Pre Leveled Finish</em>' attribute.
-	 * @see #setPreLeveledFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_PreLeveledFinish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='PreLeveledFinish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getPreLeveledFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getPreLeveledFinish <em>Pre Leveled Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Pre Leveled Finish</em>' attribute.
-	 * @see #getPreLeveledFinish()
-	 * @generated
-	 */
-	void setPreLeveledFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The title of the hyperlink associated with the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink</em>' attribute.
-	 * @see #setHyperlink(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Hyperlink()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkType2"
-	 *        extendedMetaData="kind='element' name='Hyperlink' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlink();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getHyperlink <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink</em>' attribute.
-	 * @see #getHyperlink()
-	 * @generated
-	 */
-	void setHyperlink(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The hyperlink associated with the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink Address</em>' attribute.
-	 * @see #setHyperlinkAddress(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_HyperlinkAddress()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkAddressType2"
-	 *        extendedMetaData="kind='element' name='HyperlinkAddress' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlinkAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getHyperlinkAddress <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink Address</em>' attribute.
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 */
-	void setHyperlinkAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hyperlink Sub Address</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The document bookmark of the hyperlink associated with the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hyperlink Sub Address</em>' attribute.
-	 * @see #setHyperlinkSubAddress(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_HyperlinkSubAddress()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.HyperlinkSubAddressType2"
-	 *        extendedMetaData="kind='element' name='HyperlinkSubAddress' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getHyperlinkSubAddress();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hyperlink Sub Address</em>' attribute.
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 */
-	void setHyperlinkSubAddress(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Ignore Resource Calendar</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task ignores the resource calendar.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Ignore Resource Calendar</em>' attribute.
-	 * @see #isSetIgnoreResourceCalendar()
-	 * @see #unsetIgnoreResourceCalendar()
-	 * @see #setIgnoreResourceCalendar(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_IgnoreResourceCalendar()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='IgnoreResourceCalendar' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIgnoreResourceCalendar();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isIgnoreResourceCalendar <em>Ignore Resource Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ignore Resource Calendar</em>' attribute.
-	 * @see #isSetIgnoreResourceCalendar()
-	 * @see #unsetIgnoreResourceCalendar()
-	 * @see #isIgnoreResourceCalendar()
-	 * @generated
-	 */
-	void setIgnoreResourceCalendar(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isIgnoreResourceCalendar <em>Ignore Resource Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIgnoreResourceCalendar()
-	 * @see #isIgnoreResourceCalendar()
-	 * @see #setIgnoreResourceCalendar(boolean)
-	 * @generated
-	 */
-	void unsetIgnoreResourceCalendar();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isIgnoreResourceCalendar <em>Ignore Resource Calendar</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Ignore Resource Calendar</em>' attribute is set.
-	 * @see #unsetIgnoreResourceCalendar()
-	 * @see #isIgnoreResourceCalendar()
-	 * @see #setIgnoreResourceCalendar(boolean)
-	 * @generated
-	 */
-	boolean isSetIgnoreResourceCalendar();
-
-	/**
-	 * Returns the value of the '<em><b>Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Text notes associated with the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Notes</em>' attribute.
-	 * @see #setNotes(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Notes()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Notes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getNotes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getNotes <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Notes</em>' attribute.
-	 * @see #getNotes()
-	 * @generated
-	 */
-	void setNotes(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Hide Bar</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the GANTT bar of the task is hidden when displayed in Microsoft Project.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Hide Bar</em>' attribute.
-	 * @see #isSetHideBar()
-	 * @see #unsetHideBar()
-	 * @see #setHideBar(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_HideBar()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='HideBar' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isHideBar();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isHideBar <em>Hide Bar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Hide Bar</em>' attribute.
-	 * @see #isSetHideBar()
-	 * @see #unsetHideBar()
-	 * @see #isHideBar()
-	 * @generated
-	 */
-	void setHideBar(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isHideBar <em>Hide Bar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetHideBar()
-	 * @see #isHideBar()
-	 * @see #setHideBar(boolean)
-	 * @generated
-	 */
-	void unsetHideBar();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isHideBar <em>Hide Bar</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Hide Bar</em>' attribute is set.
-	 * @see #unsetHideBar()
-	 * @see #isHideBar()
-	 * @see #setHideBar(boolean)
-	 * @generated
-	 */
-	boolean isSetHideBar();
-
-	/**
-	 * Returns the value of the '<em><b>Rollup</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the task is rolled up.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rollup</em>' attribute.
-	 * @see #isSetRollup()
-	 * @see #unsetRollup()
-	 * @see #setRollup(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Rollup()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='Rollup' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isRollup();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#isRollup <em>Rollup</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rollup</em>' attribute.
-	 * @see #isSetRollup()
-	 * @see #unsetRollup()
-	 * @see #isRollup()
-	 * @generated
-	 */
-	void setRollup(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#isRollup <em>Rollup</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetRollup()
-	 * @see #isRollup()
-	 * @see #setRollup(boolean)
-	 * @generated
-	 */
-	void unsetRollup();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#isRollup <em>Rollup</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Rollup</em>' attribute is set.
-	 * @see #unsetRollup()
-	 * @see #isRollup()
-	 * @see #setRollup(boolean)
-	 * @generated
-	 */
-	boolean isSetRollup();
-
-	/**
-	 * Returns the value of the '<em><b>BCWS</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work scheduled for the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #setBCWS(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_BCWS()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWS' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWS();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWS</em>' attribute.
-	 * @see #isSetBCWS()
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @generated
-	 */
-	void setBCWS(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#getBCWS <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	void unsetBCWS();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#getBCWS <em>BCWS</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWS</em>' attribute is set.
-	 * @see #unsetBCWS()
-	 * @see #getBCWS()
-	 * @see #setBCWS(float)
-	 * @generated
-	 */
-	boolean isSetBCWS();
-
-	/**
-	 * Returns the value of the '<em><b>BCWP</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The budgeted cost of work performed on the task to-date.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #setBCWP(float)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_BCWP()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Float"
-	 *        extendedMetaData="kind='element' name='BCWP' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	float getBCWP();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>BCWP</em>' attribute.
-	 * @see #isSetBCWP()
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @generated
-	 */
-	void setBCWP(float value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.Task#getBCWP <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	void unsetBCWP();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.Task#getBCWP <em>BCWP</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>BCWP</em>' attribute is set.
-	 * @see #unsetBCWP()
-	 * @see #getBCWP()
-	 * @see #setBCWP(float)
-	 * @generated
-	 */
-	boolean isSetBCWP();
-
-	/**
-	 * Returns the value of the '<em><b>Physical Percent Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The percentage complete value entered by the Project Manager.  
-	 *                                 This can be used as an alternative for calculating BCWP.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Physical Percent Complete</em>' attribute.
-	 * @see #setPhysicalPercentComplete(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_PhysicalPercentComplete()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='PhysicalPercentComplete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getPhysicalPercentComplete();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getPhysicalPercentComplete <em>Physical Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Physical Percent Complete</em>' attribute.
-	 * @see #getPhysicalPercentComplete()
-	 * @generated
-	 */
-	void setPhysicalPercentComplete(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Earned Value Method</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The method for calculating earned value. 
-	 *                                 Values are: 0=Percent Complete, 1=Physical Percent Complete
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Earned Value Method</em>' attribute.
-	 * @see #setEarnedValueMethod(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_EarnedValueMethod()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.EarnedValueMethodType"
-	 *        extendedMetaData="kind='element' name='EarnedValueMethod' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getEarnedValueMethod();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getEarnedValueMethod <em>Earned Value Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Earned Value Method</em>' attribute.
-	 * @see #getEarnedValueMethod()
-	 * @generated
-	 */
-	void setEarnedValueMethod(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Predecessor Link</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.PredecessorLink}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Defines the predecessor task of the task that contains it.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Predecessor Link</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_PredecessorLink()
-	 * @model type="org.eclipse.epf.msproject.PredecessorLink" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='PredecessorLink' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPredecessorLink();
-
-	/**
-	 * Returns the value of the '<em><b>Actual Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the duration through which actual work is protected.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Work Protected</em>' attribute.
-	 * @see #setActualWorkProtected(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualWorkProtected()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualWorkProtected' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualWorkProtected();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualWorkProtected <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Work Protected</em>' attribute.
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 */
-	void setActualWorkProtected(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Actual Overtime Work Protected</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Specifies the duration through which actual overtime work is protected.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Actual Overtime Work Protected</em>' attribute.
-	 * @see #setActualOvertimeWorkProtected(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ActualOvertimeWorkProtected()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Duration"
-	 *        extendedMetaData="kind='element' name='ActualOvertimeWorkProtected' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getActualOvertimeWorkProtected();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Task#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Actual Overtime Work Protected</em>' attribute.
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 */
-	void setActualOvertimeWorkProtected(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Extended Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.ExtendedAttribute2}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The value of an extended attribute.  Two pieces of data are necessary - 
-	 *                                 a pointer back to the extended attribute table which is specified either by the unique ID or 
-	 *                                 the Field ID, and the value which is specified either with the value, or a pointer back to the value list.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Extended Attribute</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_ExtendedAttribute()
-	 * @model type="org.eclipse.epf.msproject.ExtendedAttribute2" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='ExtendedAttribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExtendedAttribute();
-
-	/**
-	 * Returns the value of the '<em><b>Baseline</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Baseline}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of baseline values of the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Baseline</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_Baseline()
-	 * @model type="org.eclipse.epf.msproject.Baseline" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Baseline' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getBaseline();
-
-	/**
-	 * Returns the value of the '<em><b>Outline Code</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.OutlineCode2}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The value of an outline code.  Two pieces of data are necessary - 
-	 *                                 a pointer back to the outline code table which is specified either by the unique ID or the Field ID, 
-	 *                                 and the value which is specified either with the value, or a pointer back to the value list.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Outline Code</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_OutlineCode()
-	 * @model type="org.eclipse.epf.msproject.OutlineCode2" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='OutlineCode' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getOutlineCode();
-
-	/**
-	 * Returns the value of the '<em><b>Timephased Data</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.TimephasedDataType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The time phased data block associated with the task.
-	 *                                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Timephased Data</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTask_TimephasedData()
-	 * @model type="org.eclipse.epf.msproject.TimephasedDataType" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='TimephasedData' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTimephasedData();
-
-} // Task
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Tasks.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Tasks.java
deleted file mode 100644
index 65c43c0..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Tasks.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Tasks.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tasks</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Tasks#getTask <em>Task</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getTasks()
- * @model extendedMetaData="name='Tasks_._type' kind='elementOnly'"
- * @generated
- */
-public interface Tasks extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Task</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Task}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * There must be at least one task in each Tasks collection.
-	 *                     
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Task</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTasks_Task()
-	 * @model type="org.eclipse.epf.msproject.Task" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='Task' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTask();
-
-} // Tasks
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/TimePeriod.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/TimePeriod.java
deleted file mode 100644
index 578cbae..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/TimePeriod.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TimePeriod.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Time Period</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.TimePeriod#getFromDate <em>From Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.TimePeriod#getToDate <em>To Date</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getTimePeriod()
- * @model extendedMetaData="name='TimePeriod_._type' kind='elementOnly'"
- * @generated
- */
-public interface TimePeriod extends EObject {
-	/**
-	 * Returns the value of the '<em><b>From Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The beginning of the exception time.
-	 *                                                                      
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From Date</em>' attribute.
-	 * @see #setFromDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimePeriod_FromDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='FromDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFromDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimePeriod#getFromDate <em>From Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Date</em>' attribute.
-	 * @see #getFromDate()
-	 * @generated
-	 */
-	void setFromDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>To Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The end of the exception time.
-	 *                                                                      
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>To Date</em>' attribute.
-	 * @see #setToDate(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimePeriod_ToDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='ToDate' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getToDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimePeriod#getToDate <em>To Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>To Date</em>' attribute.
-	 * @see #getToDate()
-	 * @generated
-	 */
-	void setToDate(Object value);
-
-} // TimePeriod
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/TimephasedDataType.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/TimephasedDataType.java
deleted file mode 100644
index 66dd0f5..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/TimephasedDataType.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TimephasedDataType.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Timephased Data Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * The definition of the time phased data block.
- * 		        
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.TimephasedDataType#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.TimephasedDataType#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.TimephasedDataType#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.TimephasedDataType#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.TimephasedDataType#getUnit <em>Unit</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.TimephasedDataType#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getTimephasedDataType()
- * @model extendedMetaData="name='TimephasedDataType' kind='elementOnly'"
- * @generated
- */
-public interface TimephasedDataType extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 *                 The type of task timephased data. Values are:
-	 *                     1=Assignment Remaining Work
-	 *                     2=Assignment Actual Work
-	 *                     3=Assignment Actual Overtime Work
-	 *                     4=Assignment Baseline Work
-	 *                     5=Assignment Baseline Cost
-	 *                     6=Assignment Actual Cost
-	 *                     7=Resource Baseline Work
-	 *                     8=Resource Baseline Cost
-	 *                     9=Task Baseline Work
-	 *                     10=Task Baseline Cost
-	 *                     11=Task Percent Complete
-	 *                     16=Assignment Baseline 1 Work
-	 *                     17=Assignment Baseline 1 Cost
-	 *                     18=Task Baseline 1 Work
-	 *                     19=Task Baseline 1 Cost
-	 *                     20=Resource Baseline 1 Work
-	 *                     21=Resource Baseline 1 Cost
-	 *                     22=Assignment Baseline 2 Work
-	 *                     23=Assignment Baseline 2 Cost
-	 *                     24=Task Baseline 2 Work
-	 *                     25=Task Baseline 2 Cost
-	 *                     26=Resource Baseline 2 Work
-	 *                     27=Resource Baseline 2 Cost
-	 *                     28=Assignment Baseline 3 Work
-	 *                     29=Assignment Baseline 3 Cost
-	 *                     30=Task Baseline 3 Work
-	 *                     31=Task Baseline 3 Cost
-	 *                     32=Resource Baseline 3 Work
-	 *                     33=Resource Baseline 3 Cost
-	 *                     34=Assignment Baseline 4 Work
-	 *                     35=Assignment Baseline 4 Cost
-	 *                     36=Task Baseline 4 Work
-	 *                     37=Task Baseline 4 Cost
-	 *                     38=Resource Baseline 4 Work
-	 *                     39=Resource Baseline 4 Cost
-	 *                     40=Assignment Baseline 5 Work
-	 *                     41=Assignment Baseline 5 Cost
-	 *                     42=Task Baseline 5 Work
-	 *                     43=Task Baseline 5 Cost
-	 *                     44=Resource Baseline 5 Work
-	 *                     45=Resource Baseline 5 Cost
-	 *                     46=Assignment Baseline 6 Work
-	 *                     47=Assignment Baseline 6 Cost
-	 *                     48=Task Baseline 6 Work
-	 *                     49=Task Baseline 6 Cost
-	 *                     50=Resource Baseline 6 Work
-	 *                     51=Resource Baseline 6 Cost
-	 *                     52=Assignment Baseline 7 Work
-	 *                     53=Assignment Baseline 7 Cost
-	 *                     54=Task Baseline 7 Work
-	 *                     55=Task Baseline 7 Cost
-	 *                     56=Resource Baseline 7 Work
-	 *                     57=Resource Baseline 7 Cost
-	 *                     58=Assignment Baseline 8 Work
-	 *                     59=Assignment Baseline 8 Cost
-	 *                     60=Task Baseline 8 Work
-	 *                     61=Task Baseline 8 Cost
-	 *                     62=Resource Baseline 8 Work
-	 *                     63=Resource Baseline 8 Cost
-	 *                     64=Assignment Baseline 9 Work
-	 *                     65=Assignment Baseline 9 Cost
-	 *                     66=Task Baseline 9 Work
-	 *                     67=Task Baseline 9 Cost
-	 *                     68=Resource Baseline 9 Work
-	 *                     69=Resource Baseline 9 Cost
-	 *                     70=Assignment Baseline 10 Work
-	 *                     71=Assignment Baseline 10 Cost
-	 *                     72=Task Baseline 10 Work
-	 *                     73=Task Baseline 10 Cost
-	 *                     74=Resource Baseline 10 Work
-	 *                     75=Resource Baseline 10 Cost
-	 *                     76=Physical Percent Complete
-	 *                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see #setType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimephasedDataType_Type()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.TypeType3"
-	 *        extendedMetaData="kind='element' name='Type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimephasedDataType#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>UID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique identifier of the timephased data record.
-	 *                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>UID</em>' attribute.
-	 * @see #setUID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimephasedDataType_UID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='UID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimephasedDataType#getUID <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>UID</em>' attribute.
-	 * @see #getUID()
-	 * @generated
-	 */
-	void setUID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Start</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The start date of the timephased data period.
-	 *                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start</em>' attribute.
-	 * @see #setStart(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimephasedDataType_Start()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Start' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getStart();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimephasedDataType#getStart <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start</em>' attribute.
-	 * @see #getStart()
-	 * @generated
-	 */
-	void setStart(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The finish date of the timephased data period.
-	 *                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish</em>' attribute.
-	 * @see #setFinish(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimephasedDataType_Finish()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='element' name='Finish' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFinish();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimephasedDataType#getFinish <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish</em>' attribute.
-	 * @see #getFinish()
-	 * @generated
-	 */
-	void setFinish(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Unit</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The time unit of the timephased data period. 
-	 *                 Values are: 0=m, 1=h, 2=d, 3=w, 5=mo, 8=y
-	 *                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Unit</em>' attribute.
-	 * @see #setUnit(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimephasedDataType_Unit()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.UnitType"
-	 *        extendedMetaData="kind='element' name='Unit' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getUnit();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimephasedDataType#getUnit <em>Unit</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Unit</em>' attribute.
-	 * @see #getUnit()
-	 * @generated
-	 */
-	void setUnit(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The value per unit of time for the timephased data period.
-	 *                 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getTimephasedDataType_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.TimephasedDataType#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // TimephasedDataType
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Value.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Value.java
deleted file mode 100644
index 6a538b0..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Value.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Value.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Value#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Value#getParentValueID <em>Parent Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Value#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Value#getDescription <em>Description</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getValue()
- * @model extendedMetaData="name='Value_._type' kind='elementOnly'"
- * @generated
- */
-public interface Value extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The unique ID of the outline code value across the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value ID</em>' attribute.
-	 * @see #setValueID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValue_ValueID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ValueID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getValueID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Value#getValueID <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value ID</em>' attribute.
-	 * @see #getValueID()
-	 * @generated
-	 */
-	void setValueID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Parent Value ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The value of the parent node of the outline code.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Parent Value ID</em>' attribute.
-	 * @see #setParentValueID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValue_ParentValueID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer"
-	 *        extendedMetaData="kind='element' name='ParentValueID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getParentValueID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Value#getParentValueID <em>Parent Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Parent Value ID</em>' attribute.
-	 * @see #getParentValueID()
-	 * @generated
-	 */
-	void setParentValueID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual value.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValue_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Value#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A description of this value.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Description</em>' attribute.
-	 * @see #setDescription(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValue_Description()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Value#getDescription <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Description</em>' attribute.
-	 * @see #getDescription()
-	 * @generated
-	 */
-	void setDescription(String value);
-
-} // Value
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Value2.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Value2.java
deleted file mode 100644
index 5a989ed..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Value2.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Value2.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value2</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Value2#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Value2#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Value2#getDescription <em>Description</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getValue2()
- * @model extendedMetaData="name='Value_._1_._type' kind='elementOnly'"
- * @generated
- */
-public interface Value2 extends EObject {
-	/**
-	 * Returns the value of the '<em><b>ID</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Unique ID of value across 
-	 *                                                         the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>ID</em>' attribute.
-	 * @see #setID(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValue2_ID()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='ID' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getID();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Value2#getID <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>ID</em>' attribute.
-	 * @see #getID()
-	 * @generated
-	 */
-	void setID(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The actual value.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValue2_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Value2#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The description of the value 
-	 *                                                         in the list.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Description</em>' attribute.
-	 * @see #setDescription(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValue2_Description()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.Value2#getDescription <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Description</em>' attribute.
-	 * @see #getDescription()
-	 * @generated
-	 */
-	void setDescription(String value);
-
-} // Value2
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ValueList.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ValueList.java
deleted file mode 100644
index 00902b8..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/ValueList.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValueList.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value List</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.ValueList#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getValueList()
- * @model extendedMetaData="name='ValueList_._type' kind='elementOnly'"
- * @generated
- */
-public interface ValueList extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Value2}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The values that make up the value list.
-	 *                                             
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValueList_Value()
-	 * @model type="org.eclipse.epf.msproject.Value2" containment="true" resolveProxies="false" required="true"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getValue();
-
-} // ValueList
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Values.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Values.java
deleted file mode 100644
index b4d1cdd..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/Values.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Values.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Values</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.Values#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.Values#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getValues()
- * @model extendedMetaData="name='Values_._type' kind='elementOnly'"
- * @generated
- */
-public interface Values extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Group</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group</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>Group</em>' attribute list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValues_Group()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:0'"
-	 * @generated
-	 */
-	FeatureMap getGroup();
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.Value}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The individual values.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getValues_Value()
-	 * @model type="org.eclipse.epf.msproject.Value" containment="true" resolveProxies="false" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Value' namespace='##targetNamespace' group='#group:0'"
-	 * @generated
-	 */
-	EList getValue();
-
-} // Values
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WBSMask.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WBSMask.java
deleted file mode 100644
index e969fb1..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WBSMask.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WBSMask.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>WBS Mask</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.WBSMask#getLevel <em>Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WBSMask#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WBSMask#getLength <em>Length</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WBSMask#getSeparator <em>Separator</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMask()
- * @model extendedMetaData="name='WBSMask_._type' kind='elementOnly'"
- * @generated
- */
-public interface WBSMask extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The level of the mask.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Level</em>' attribute.
-	 * @see #setLevel(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMask_Level()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Integer" required="true"
-	 *        extendedMetaData="kind='element' name='Level' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WBSMask#getLevel <em>Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Level</em>' attribute.
-	 * @see #getLevel()
-	 * @generated
-	 */
-	void setLevel(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The type of the node value. 
-	 *                                 The values are: 0=Numbers, 1=Uppercase Letters, 2=Lowercase Letters, 3=Characters.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see #setType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMask_Type()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.TypeType2" required="true"
-	 *        extendedMetaData="kind='element' name='Type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WBSMask#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Length</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The maximum length in characters.  
-	 *                                 This element is omitted when length is "any".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Length</em>' attribute.
-	 * @see #setLength(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMask_Length()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" required="true"
-	 *        extendedMetaData="kind='element' name='Length' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getLength();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WBSMask#getLength <em>Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Length</em>' attribute.
-	 * @see #getLength()
-	 * @generated
-	 */
-	void setLength(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Separator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The separator character of the node.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Separator</em>' attribute.
-	 * @see #setSeparator(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMask_Separator()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" required="true"
-	 *        extendedMetaData="kind='element' name='Separator' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getSeparator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WBSMask#getSeparator <em>Separator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Separator</em>' attribute.
-	 * @see #getSeparator()
-	 * @generated
-	 */
-	void setSeparator(String value);
-
-} // WBSMask
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WBSMasks.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WBSMasks.java
deleted file mode 100644
index 4116887..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WBSMasks.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WBSMasks.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>WBS Masks</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.WBSMasks#isVerifyUniqueCodes <em>Verify Unique Codes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WBSMasks#isGenerateCodes <em>Generate Codes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WBSMasks#getPrefix <em>Prefix</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WBSMasks#getWBSMask <em>WBS Mask</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMasks()
- * @model extendedMetaData="name='WBSMasks_._type' kind='elementOnly'"
- * @generated
- */
-public interface WBSMasks extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Verify Unique Codes</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether WBS codes are unique for new tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Verify Unique Codes</em>' attribute.
-	 * @see #isSetVerifyUniqueCodes()
-	 * @see #unsetVerifyUniqueCodes()
-	 * @see #setVerifyUniqueCodes(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMasks_VerifyUniqueCodes()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='VerifyUniqueCodes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isVerifyUniqueCodes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WBSMasks#isVerifyUniqueCodes <em>Verify Unique Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Verify Unique Codes</em>' attribute.
-	 * @see #isSetVerifyUniqueCodes()
-	 * @see #unsetVerifyUniqueCodes()
-	 * @see #isVerifyUniqueCodes()
-	 * @generated
-	 */
-	void setVerifyUniqueCodes(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.WBSMasks#isVerifyUniqueCodes <em>Verify Unique Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetVerifyUniqueCodes()
-	 * @see #isVerifyUniqueCodes()
-	 * @see #setVerifyUniqueCodes(boolean)
-	 * @generated
-	 */
-	void unsetVerifyUniqueCodes();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.WBSMasks#isVerifyUniqueCodes <em>Verify Unique Codes</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Verify Unique Codes</em>' attribute is set.
-	 * @see #unsetVerifyUniqueCodes()
-	 * @see #isVerifyUniqueCodes()
-	 * @see #setVerifyUniqueCodes(boolean)
-	 * @generated
-	 */
-	boolean isSetVerifyUniqueCodes();
-
-	/**
-	 * Returns the value of the '<em><b>Generate Codes</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether WBS codes are generated for new tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Generate Codes</em>' attribute.
-	 * @see #isSetGenerateCodes()
-	 * @see #unsetGenerateCodes()
-	 * @see #setGenerateCodes(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMasks_GenerateCodes()
-	 * @model default="false" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='GenerateCodes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isGenerateCodes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WBSMasks#isGenerateCodes <em>Generate Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Generate Codes</em>' attribute.
-	 * @see #isSetGenerateCodes()
-	 * @see #unsetGenerateCodes()
-	 * @see #isGenerateCodes()
-	 * @generated
-	 */
-	void setGenerateCodes(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.WBSMasks#isGenerateCodes <em>Generate Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetGenerateCodes()
-	 * @see #isGenerateCodes()
-	 * @see #setGenerateCodes(boolean)
-	 * @generated
-	 */
-	void unsetGenerateCodes();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.WBSMasks#isGenerateCodes <em>Generate Codes</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Generate Codes</em>' attribute is set.
-	 * @see #unsetGenerateCodes()
-	 * @see #isGenerateCodes()
-	 * @see #setGenerateCodes(boolean)
-	 * @generated
-	 */
-	boolean isSetGenerateCodes();
-
-	/**
-	 * Returns the value of the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The prefix for all WBS codes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Prefix</em>' attribute.
-	 * @see #setPrefix(String)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMasks_Prefix()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.PrefixType"
-	 *        extendedMetaData="kind='element' name='Prefix' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getPrefix();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WBSMasks#getPrefix <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Prefix</em>' attribute.
-	 * @see #getPrefix()
-	 * @generated
-	 */
-	void setPrefix(String value);
-
-	/**
-	 * Returns the value of the '<em><b>WBS Mask</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.WBSMask}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The WBS Mask that is applied to all tasks in the Project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>WBS Mask</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWBSMasks_WBSMask()
-	 * @model type="org.eclipse.epf.msproject.WBSMask" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='WBSMask' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getWBSMask();
-
-} // WBSMasks
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WeekDay.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WeekDay.java
deleted file mode 100644
index b5a3476..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WeekDay.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WeekDay.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Week Day</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.WeekDay#getDayType <em>Day Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WeekDay#isDayWorking <em>Day Working</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WeekDay#getTimePeriod <em>Time Period</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WeekDay#getWorkingTimes <em>Working Times</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getWeekDay()
- * @model extendedMetaData="name='WeekDay_._type' kind='elementOnly'"
- * @generated
- */
-public interface WeekDay extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Day Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The type of day. 
-	 *                                                          Values are: 0=Exception, 1=Monday, 2=Tuesday, 
-	 *                                                          3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday, 
-	 *                                                          7=Sunday
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Day Type</em>' attribute.
-	 * @see #setDayType(BigInteger)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWeekDay_DayType()
-	 * @model unique="false" dataType="org.eclipse.epf.msproject.DayTypeType" required="true"
-	 *        extendedMetaData="kind='element' name='DayType' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BigInteger getDayType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WeekDay#getDayType <em>Day Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Day Type</em>' attribute.
-	 * @see #getDayType()
-	 * @generated
-	 */
-	void setDayType(BigInteger value);
-
-	/**
-	 * Returns the value of the '<em><b>Day Working</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Whether the specified date or day 
-	 *                                                          type is working.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Day Working</em>' attribute.
-	 * @see #isSetDayWorking()
-	 * @see #unsetDayWorking()
-	 * @see #setDayWorking(boolean)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWeekDay_DayWorking()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='element' name='DayWorking' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isDayWorking();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WeekDay#isDayWorking <em>Day Working</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Day Working</em>' attribute.
-	 * @see #isSetDayWorking()
-	 * @see #unsetDayWorking()
-	 * @see #isDayWorking()
-	 * @generated
-	 */
-	void setDayWorking(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.msproject.WeekDay#isDayWorking <em>Day Working</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetDayWorking()
-	 * @see #isDayWorking()
-	 * @see #setDayWorking(boolean)
-	 * @generated
-	 */
-	void unsetDayWorking();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.msproject.WeekDay#isDayWorking <em>Day Working</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Day Working</em>' attribute is set.
-	 * @see #unsetDayWorking()
-	 * @see #isDayWorking()
-	 * @see #setDayWorking(boolean)
-	 * @generated
-	 */
-	boolean isSetDayWorking();
-
-	/**
-	 * Returns the value of the '<em><b>Time Period</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Defines a contiguous set of exception days.
-	 *                                                          
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Time Period</em>' containment reference.
-	 * @see #setTimePeriod(TimePeriod)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWeekDay_TimePeriod()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='TimePeriod' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	TimePeriod getTimePeriod();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WeekDay#getTimePeriod <em>Time Period</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Time Period</em>' containment reference.
-	 * @see #getTimePeriod()
-	 * @generated
-	 */
-	void setTimePeriod(TimePeriod value);
-
-	/**
-	 * Returns the value of the '<em><b>Working Times</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The collection of working times that define the time worked 
-	 *                                                          on the weekday.  One of these must be present, and there may be no more than five.
-	 *                                                          
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Working Times</em>' containment reference.
-	 * @see #setWorkingTimes(WorkingTimes)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWeekDay_WorkingTimes()
-	 * @model containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='WorkingTimes' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	WorkingTimes getWorkingTimes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WeekDay#getWorkingTimes <em>Working Times</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Working Times</em>' containment reference.
-	 * @see #getWorkingTimes()
-	 * @generated
-	 */
-	void setWorkingTimes(WorkingTimes value);
-
-} // WeekDay
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WeekDays.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WeekDays.java
deleted file mode 100644
index 731caeb..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WeekDays.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WeekDays.java,v 1.1 2008/01/15 08:52:45 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Week Days</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.WeekDays#getWeekDay <em>Week Day</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getWeekDays()
- * @model extendedMetaData="name='WeekDays_._type' kind='elementOnly'"
- * @generated
- */
-public interface WeekDays extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Week Day</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.WeekDay}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A weekday either defines regular days 
-	 *                                             of the week or exception days in the calendar.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Week Day</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWeekDays_WeekDay()
-	 * @model type="org.eclipse.epf.msproject.WeekDay" containment="true" resolveProxies="false"
-	 *        extendedMetaData="kind='element' name='WeekDay' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getWeekDay();
-
-} // WeekDays
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WorkingTime.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WorkingTime.java
deleted file mode 100644
index 06a520f..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WorkingTime.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkingTime.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Working Time</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.WorkingTime#getFromTime <em>From Time</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.WorkingTime#getToTime <em>To Time</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getWorkingTime()
- * @model extendedMetaData="name='WorkingTime_._type' kind='elementOnly'"
- * @generated
- */
-public interface WorkingTime extends EObject {
-	/**
-	 * Returns the value of the '<em><b>From Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The beginning of the working time.
-	 *                                                                                      
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From Time</em>' attribute.
-	 * @see #setFromTime(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWorkingTime_FromTime()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Time"
-	 *        extendedMetaData="kind='element' name='FromTime' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getFromTime();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WorkingTime#getFromTime <em>From Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Time</em>' attribute.
-	 * @see #getFromTime()
-	 * @generated
-	 */
-	void setFromTime(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>To Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The end of the working  time.
-	 *                                                                                      
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>To Time</em>' attribute.
-	 * @see #setToTime(Object)
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWorkingTime_ToTime()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Time"
-	 *        extendedMetaData="kind='element' name='ToTime' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	Object getToTime();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.msproject.WorkingTime#getToTime <em>To Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>To Time</em>' attribute.
-	 * @see #getToTime()
-	 * @generated
-	 */
-	void setToTime(Object value);
-
-} // WorkingTime
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WorkingTimes.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WorkingTimes.java
deleted file mode 100644
index 71800a2..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/WorkingTimes.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkingTimes.java,v 1.1 2008/01/15 08:52:46 jtham Exp $
- */
-package org.eclipse.epf.msproject;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Working Times</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.WorkingTimes#getWorkingTime <em>Working Time</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.msproject.MsprojectPackage#getWorkingTimes()
- * @model extendedMetaData="name='WorkingTimes_._type' kind='elementOnly'"
- * @generated
- */
-public interface WorkingTimes extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Working Time</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.msproject.WorkingTime}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Defines the working time during the weekday.
-	 *                                                                          
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Working Time</em>' containment reference list.
-	 * @see org.eclipse.epf.msproject.MsprojectPackage#getWorkingTimes_WorkingTime()
-	 * @model type="org.eclipse.epf.msproject.WorkingTime" containment="true" resolveProxies="false" upper="5"
-	 *        extendedMetaData="kind='element' name='WorkingTime' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getWorkingTime();
-
-} // WorkingTimes
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AssignmentImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AssignmentImpl.java
deleted file mode 100644
index 18cae5a..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AssignmentImpl.java
+++ /dev/null
@@ -1,3700 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AssignmentImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-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.EStructuralFeature;
-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.epf.msproject.Assignment;
-import org.eclipse.epf.msproject.Baseline3;
-import org.eclipse.epf.msproject.ExtendedAttribute4;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.TimephasedDataType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Assignment</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getTaskUID <em>Task UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getResourceUID <em>Resource UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getPercentWorkComplete <em>Percent Work Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualCost <em>Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualFinish <em>Actual Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualOvertimeCost <em>Actual Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualOvertimeWork <em>Actual Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualStart <em>Actual Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualWork <em>Actual Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getACWP <em>ACWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isConfirmed <em>Confirmed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getCostRateTable <em>Cost Rate Table</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getCostVariance <em>Cost Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getCV <em>CV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getDelay <em>Delay</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getFinishVariance <em>Finish Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getHyperlink <em>Hyperlink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getHyperlinkAddress <em>Hyperlink Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getWorkVariance <em>Work Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isHasFixedRateUnits <em>Has Fixed Rate Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isFixedMaterial <em>Fixed Material</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getLevelingDelay <em>Leveling Delay</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getLevelingDelayFormat <em>Leveling Delay Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isLinkedFields <em>Linked Fields</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isMilestone <em>Milestone</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getNotes <em>Notes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isOverallocated <em>Overallocated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getOvertimeCost <em>Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getOvertimeWork <em>Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getRegularWork <em>Regular Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getRemainingCost <em>Remaining Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getRemainingWork <em>Remaining Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isResponsePending <em>Response Pending</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getStop <em>Stop</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getResume <em>Resume</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getStartVariance <em>Start Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getUnits <em>Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#isUpdateNeeded <em>Update Needed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getVAC <em>VAC</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getWorkContour <em>Work Contour</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getBCWP <em>BCWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getBookingType <em>Booking Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualWorkProtected <em>Actual Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getCreationDate <em>Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getExtendedAttribute <em>Extended Attribute</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getBaseline <em>Baseline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentImpl#getTimephasedData <em>Timephased Data</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AssignmentImpl extends EObjectImpl implements Assignment {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTaskUID() <em>Task UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTaskUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TASK_UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTaskUID() <em>Task UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTaskUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger taskUID = TASK_UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getResourceUID() <em>Resource UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResourceUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger RESOURCE_UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getResourceUID() <em>Resource UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResourceUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger resourceUID = RESOURCE_UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPercentWorkComplete() <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PERCENT_WORK_COMPLETE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPercentWorkComplete() <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger percentWorkComplete = PERCENT_WORK_COMPLETE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualCost() <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal ACTUAL_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualCost() <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal actualCost = ACTUAL_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualFinish() <em>Actual Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualFinish() <em>Actual Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualFinish = ACTUAL_FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeCost() <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal ACTUAL_OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeCost() <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal actualOvertimeCost = ACTUAL_OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeWork() <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeWork() <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualOvertimeWork = ACTUAL_OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualStart() <em>Actual Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualStart() <em>Actual Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualStart = ACTUAL_START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualWork() <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualWork() <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualWork = ACTUAL_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getACWP() <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getACWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float ACWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getACWP() <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getACWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float aCWP = ACWP_EDEFAULT;
-
-	/**
-	 * This is true if the ACWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean aCWPESet = false;
-
-	/**
-	 * The default value of the '{@link #isConfirmed() <em>Confirmed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isConfirmed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean CONFIRMED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isConfirmed() <em>Confirmed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isConfirmed()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean confirmed = CONFIRMED_EDEFAULT;
-
-	/**
-	 * This is true if the Confirmed attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean confirmedESet = false;
-
-	/**
-	 * The default value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal cost = COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCostRateTable() <em>Cost Rate Table</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostRateTable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger COST_RATE_TABLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCostRateTable() <em>Cost Rate Table</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostRateTable()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger costRateTable = COST_RATE_TABLE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCostVariance() <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float COST_VARIANCE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getCostVariance() <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected float costVariance = COST_VARIANCE_EDEFAULT;
-
-	/**
-	 * This is true if the Cost Variance attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean costVarianceESet = false;
-
-	/**
-	 * The default value of the '{@link #getCV() <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCV()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float CV_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getCV() <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCV()
-	 * @generated
-	 * @ordered
-	 */
-	protected float cV = CV_EDEFAULT;
-
-	/**
-	 * This is true if the CV attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean cVESet = false;
-
-	/**
-	 * The default value of the '{@link #getDelay() <em>Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDelay()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DELAY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDelay() <em>Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDelay()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger delay = DELAY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object finish = FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinishVariance() <em>Finish Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger FINISH_VARIANCE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinishVariance() <em>Finish Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger finishVariance = FINISH_VARIANCE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlink() <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlink()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlink() <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlink()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlink = HYPERLINK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlinkAddress() <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlinkAddress() <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlinkAddress = HYPERLINK_ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlinkSubAddress() <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_SUB_ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlinkSubAddress() <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlinkSubAddress = HYPERLINK_SUB_ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWorkVariance() <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float WORK_VARIANCE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getWorkVariance() <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected float workVariance = WORK_VARIANCE_EDEFAULT;
-
-	/**
-	 * This is true if the Work Variance attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean workVarianceESet = false;
-
-	/**
-	 * The default value of the '{@link #isHasFixedRateUnits() <em>Has Fixed Rate Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHasFixedRateUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean HAS_FIXED_RATE_UNITS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isHasFixedRateUnits() <em>Has Fixed Rate Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHasFixedRateUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean hasFixedRateUnits = HAS_FIXED_RATE_UNITS_EDEFAULT;
-
-	/**
-	 * This is true if the Has Fixed Rate Units attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean hasFixedRateUnitsESet = false;
-
-	/**
-	 * The default value of the '{@link #isFixedMaterial() <em>Fixed Material</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isFixedMaterial()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean FIXED_MATERIAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isFixedMaterial() <em>Fixed Material</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isFixedMaterial()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean fixedMaterial = FIXED_MATERIAL_EDEFAULT;
-
-	/**
-	 * This is true if the Fixed Material attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean fixedMaterialESet = false;
-
-	/**
-	 * The default value of the '{@link #getLevelingDelay() <em>Leveling Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelay()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LEVELING_DELAY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLevelingDelay() <em>Leveling Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelay()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger levelingDelay = LEVELING_DELAY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLevelingDelayFormat() <em>Leveling Delay Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelayFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LEVELING_DELAY_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLevelingDelayFormat() <em>Leveling Delay Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelayFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger levelingDelayFormat = LEVELING_DELAY_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isLinkedFields() <em>Linked Fields</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLinkedFields()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean LINKED_FIELDS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isLinkedFields() <em>Linked Fields</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLinkedFields()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean linkedFields = LINKED_FIELDS_EDEFAULT;
-
-	/**
-	 * This is true if the Linked Fields attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean linkedFieldsESet = false;
-
-	/**
-	 * The default value of the '{@link #isMilestone() <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMilestone()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MILESTONE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMilestone() <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMilestone()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean milestone = MILESTONE_EDEFAULT;
-
-	/**
-	 * This is true if the Milestone attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean milestoneESet = false;
-
-	/**
-	 * The default value of the '{@link #getNotes() <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NOTES_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNotes() <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected String notes = NOTES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isOverallocated() <em>Overallocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOverallocated()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean OVERALLOCATED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isOverallocated() <em>Overallocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOverallocated()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean overallocated = OVERALLOCATED_EDEFAULT;
-
-	/**
-	 * This is true if the Overallocated attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean overallocatedESet = false;
-
-	/**
-	 * The default value of the '{@link #getOvertimeCost() <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeCost() <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal overtimeCost = OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeWork() <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeWork() <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object overtimeWork = OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRegularWork() <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegularWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REGULAR_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRegularWork() <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegularWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object regularWork = REGULAR_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingCost() <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal REMAINING_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingCost() <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal remainingCost = REMAINING_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingOvertimeCost() <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal REMAINING_OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingOvertimeCost() <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal remainingOvertimeCost = REMAINING_OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingOvertimeWork() <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REMAINING_OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingOvertimeWork() <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object remainingOvertimeWork = REMAINING_OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingWork() <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REMAINING_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingWork() <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object remainingWork = REMAINING_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isResponsePending() <em>Response Pending</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResponsePending()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESPONSE_PENDING_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isResponsePending() <em>Response Pending</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResponsePending()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean responsePending = RESPONSE_PENDING_EDEFAULT;
-
-	/**
-	 * This is true if the Response Pending attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean responsePendingESet = false;
-
-	/**
-	 * The default value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object start = START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStop() <em>Stop</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStop()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object STOP_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStop() <em>Stop</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStop()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object stop = STOP_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getResume() <em>Resume</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResume()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object RESUME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getResume() <em>Resume</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResume()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object resume = RESUME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStartVariance() <em>Start Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger START_VARIANCE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStartVariance() <em>Start Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger startVariance = START_VARIANCE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getUnits() <em>Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float UNITS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getUnits() <em>Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected float units = UNITS_EDEFAULT;
-
-	/**
-	 * This is true if the Units attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean unitsESet = false;
-
-	/**
-	 * The default value of the '{@link #isUpdateNeeded() <em>Update Needed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isUpdateNeeded()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean UPDATE_NEEDED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isUpdateNeeded() <em>Update Needed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isUpdateNeeded()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean updateNeeded = UPDATE_NEEDED_EDEFAULT;
-
-	/**
-	 * This is true if the Update Needed attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean updateNeededESet = false;
-
-	/**
-	 * The default value of the '{@link #getVAC() <em>VAC</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVAC()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float VAC_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getVAC() <em>VAC</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVAC()
-	 * @generated
-	 * @ordered
-	 */
-	protected float vAC = VAC_EDEFAULT;
-
-	/**
-	 * This is true if the VAC attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean vACESet = false;
-
-	/**
-	 * The default value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object work = WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWorkContour() <em>Work Contour</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkContour()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger WORK_CONTOUR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWorkContour() <em>Work Contour</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkContour()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger workContour = WORK_CONTOUR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWS = BCWS_EDEFAULT;
-
-	/**
-	 * This is true if the BCWS attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWSESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWP = BCWP_EDEFAULT;
-
-	/**
-	 * This is true if the BCWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWPESet = false;
-
-	/**
-	 * The default value of the '{@link #getBookingType() <em>Booking Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBookingType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger BOOKING_TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBookingType() <em>Booking Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBookingType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger bookingType = BOOKING_TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualWorkProtected() <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_WORK_PROTECTED_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualWorkProtected() <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualWorkProtected = ACTUAL_WORK_PROTECTED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeWorkProtected() <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeWorkProtected() <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualOvertimeWorkProtected = ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCreationDate() <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CREATION_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCreationDate() <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object creationDate = CREATION_DATE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getExtendedAttribute() <em>Extended Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList extendedAttribute = null;
-
-	/**
-	 * The cached value of the '{@link #getBaseline() <em>Baseline</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaseline()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList baseline = null;
-
-	/**
-	 * The cached value of the '{@link #getTimephasedData() <em>Timephased Data</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTimephasedData()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList timephasedData = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AssignmentImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getAssignment();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getTaskUID() {
-		return taskUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTaskUID(BigInteger newTaskUID) {
-		BigInteger oldTaskUID = taskUID;
-		taskUID = newTaskUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__TASK_UID, oldTaskUID, taskUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getResourceUID() {
-		return resourceUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResourceUID(BigInteger newResourceUID) {
-		BigInteger oldResourceUID = resourceUID;
-		resourceUID = newResourceUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__RESOURCE_UID, oldResourceUID, resourceUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getPercentWorkComplete() {
-		return percentWorkComplete;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPercentWorkComplete(BigInteger newPercentWorkComplete) {
-		BigInteger oldPercentWorkComplete = percentWorkComplete;
-		percentWorkComplete = newPercentWorkComplete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__PERCENT_WORK_COMPLETE, oldPercentWorkComplete, percentWorkComplete));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getActualCost() {
-		return actualCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualCost(BigDecimal newActualCost) {
-		BigDecimal oldActualCost = actualCost;
-		actualCost = newActualCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_COST, oldActualCost, actualCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualFinish() {
-		return actualFinish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualFinish(Object newActualFinish) {
-		Object oldActualFinish = actualFinish;
-		actualFinish = newActualFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_FINISH, oldActualFinish, actualFinish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getActualOvertimeCost() {
-		return actualOvertimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeCost(BigDecimal newActualOvertimeCost) {
-		BigDecimal oldActualOvertimeCost = actualOvertimeCost;
-		actualOvertimeCost = newActualOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_COST, oldActualOvertimeCost, actualOvertimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualOvertimeWork() {
-		return actualOvertimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeWork(Object newActualOvertimeWork) {
-		Object oldActualOvertimeWork = actualOvertimeWork;
-		actualOvertimeWork = newActualOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK, oldActualOvertimeWork, actualOvertimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualStart() {
-		return actualStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualStart(Object newActualStart) {
-		Object oldActualStart = actualStart;
-		actualStart = newActualStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_START, oldActualStart, actualStart));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualWork() {
-		return actualWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualWork(Object newActualWork) {
-		Object oldActualWork = actualWork;
-		actualWork = newActualWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_WORK, oldActualWork, actualWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getACWP() {
-		return aCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setACWP(float newACWP) {
-		float oldACWP = aCWP;
-		aCWP = newACWP;
-		boolean oldACWPESet = aCWPESet;
-		aCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACWP, oldACWP, aCWP, !oldACWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetACWP() {
-		float oldACWP = aCWP;
-		boolean oldACWPESet = aCWPESet;
-		aCWP = ACWP_EDEFAULT;
-		aCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__ACWP, oldACWP, ACWP_EDEFAULT, oldACWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetACWP() {
-		return aCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isConfirmed() {
-		return confirmed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConfirmed(boolean newConfirmed) {
-		boolean oldConfirmed = confirmed;
-		confirmed = newConfirmed;
-		boolean oldConfirmedESet = confirmedESet;
-		confirmedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__CONFIRMED, oldConfirmed, confirmed, !oldConfirmedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetConfirmed() {
-		boolean oldConfirmed = confirmed;
-		boolean oldConfirmedESet = confirmedESet;
-		confirmed = CONFIRMED_EDEFAULT;
-		confirmedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__CONFIRMED, oldConfirmed, CONFIRMED_EDEFAULT, oldConfirmedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetConfirmed() {
-		return confirmedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getCost() {
-		return cost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCost(BigDecimal newCost) {
-		BigDecimal oldCost = cost;
-		cost = newCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__COST, oldCost, cost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCostRateTable() {
-		return costRateTable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCostRateTable(BigInteger newCostRateTable) {
-		BigInteger oldCostRateTable = costRateTable;
-		costRateTable = newCostRateTable;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__COST_RATE_TABLE, oldCostRateTable, costRateTable));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getCostVariance() {
-		return costVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCostVariance(float newCostVariance) {
-		float oldCostVariance = costVariance;
-		costVariance = newCostVariance;
-		boolean oldCostVarianceESet = costVarianceESet;
-		costVarianceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__COST_VARIANCE, oldCostVariance, costVariance, !oldCostVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCostVariance() {
-		float oldCostVariance = costVariance;
-		boolean oldCostVarianceESet = costVarianceESet;
-		costVariance = COST_VARIANCE_EDEFAULT;
-		costVarianceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__COST_VARIANCE, oldCostVariance, COST_VARIANCE_EDEFAULT, oldCostVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCostVariance() {
-		return costVarianceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getCV() {
-		return cV;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCV(float newCV) {
-		float oldCV = cV;
-		cV = newCV;
-		boolean oldCVESet = cVESet;
-		cVESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__CV, oldCV, cV, !oldCVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCV() {
-		float oldCV = cV;
-		boolean oldCVESet = cVESet;
-		cV = CV_EDEFAULT;
-		cVESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__CV, oldCV, CV_EDEFAULT, oldCVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCV() {
-		return cVESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDelay() {
-		return delay;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDelay(BigInteger newDelay) {
-		BigInteger oldDelay = delay;
-		delay = newDelay;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__DELAY, oldDelay, delay));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFinish() {
-		return finish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinish(Object newFinish) {
-		Object oldFinish = finish;
-		finish = newFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__FINISH, oldFinish, finish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getFinishVariance() {
-		return finishVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinishVariance(BigInteger newFinishVariance) {
-		BigInteger oldFinishVariance = finishVariance;
-		finishVariance = newFinishVariance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__FINISH_VARIANCE, oldFinishVariance, finishVariance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlink() {
-		return hyperlink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlink(String newHyperlink) {
-		String oldHyperlink = hyperlink;
-		hyperlink = newHyperlink;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__HYPERLINK, oldHyperlink, hyperlink));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlinkAddress() {
-		return hyperlinkAddress;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlinkAddress(String newHyperlinkAddress) {
-		String oldHyperlinkAddress = hyperlinkAddress;
-		hyperlinkAddress = newHyperlinkAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__HYPERLINK_ADDRESS, oldHyperlinkAddress, hyperlinkAddress));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlinkSubAddress() {
-		return hyperlinkSubAddress;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlinkSubAddress(String newHyperlinkSubAddress) {
-		String oldHyperlinkSubAddress = hyperlinkSubAddress;
-		hyperlinkSubAddress = newHyperlinkSubAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__HYPERLINK_SUB_ADDRESS, oldHyperlinkSubAddress, hyperlinkSubAddress));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getWorkVariance() {
-		return workVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkVariance(float newWorkVariance) {
-		float oldWorkVariance = workVariance;
-		workVariance = newWorkVariance;
-		boolean oldWorkVarianceESet = workVarianceESet;
-		workVarianceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__WORK_VARIANCE, oldWorkVariance, workVariance, !oldWorkVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetWorkVariance() {
-		float oldWorkVariance = workVariance;
-		boolean oldWorkVarianceESet = workVarianceESet;
-		workVariance = WORK_VARIANCE_EDEFAULT;
-		workVarianceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__WORK_VARIANCE, oldWorkVariance, WORK_VARIANCE_EDEFAULT, oldWorkVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetWorkVariance() {
-		return workVarianceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isHasFixedRateUnits() {
-		return hasFixedRateUnits;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHasFixedRateUnits(boolean newHasFixedRateUnits) {
-		boolean oldHasFixedRateUnits = hasFixedRateUnits;
-		hasFixedRateUnits = newHasFixedRateUnits;
-		boolean oldHasFixedRateUnitsESet = hasFixedRateUnitsESet;
-		hasFixedRateUnitsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__HAS_FIXED_RATE_UNITS, oldHasFixedRateUnits, hasFixedRateUnits, !oldHasFixedRateUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetHasFixedRateUnits() {
-		boolean oldHasFixedRateUnits = hasFixedRateUnits;
-		boolean oldHasFixedRateUnitsESet = hasFixedRateUnitsESet;
-		hasFixedRateUnits = HAS_FIXED_RATE_UNITS_EDEFAULT;
-		hasFixedRateUnitsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__HAS_FIXED_RATE_UNITS, oldHasFixedRateUnits, HAS_FIXED_RATE_UNITS_EDEFAULT, oldHasFixedRateUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetHasFixedRateUnits() {
-		return hasFixedRateUnitsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isFixedMaterial() {
-		return fixedMaterial;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFixedMaterial(boolean newFixedMaterial) {
-		boolean oldFixedMaterial = fixedMaterial;
-		fixedMaterial = newFixedMaterial;
-		boolean oldFixedMaterialESet = fixedMaterialESet;
-		fixedMaterialESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__FIXED_MATERIAL, oldFixedMaterial, fixedMaterial, !oldFixedMaterialESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetFixedMaterial() {
-		boolean oldFixedMaterial = fixedMaterial;
-		boolean oldFixedMaterialESet = fixedMaterialESet;
-		fixedMaterial = FIXED_MATERIAL_EDEFAULT;
-		fixedMaterialESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__FIXED_MATERIAL, oldFixedMaterial, FIXED_MATERIAL_EDEFAULT, oldFixedMaterialESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetFixedMaterial() {
-		return fixedMaterialESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLevelingDelay() {
-		return levelingDelay;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelingDelay(BigInteger newLevelingDelay) {
-		BigInteger oldLevelingDelay = levelingDelay;
-		levelingDelay = newLevelingDelay;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__LEVELING_DELAY, oldLevelingDelay, levelingDelay));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLevelingDelayFormat() {
-		return levelingDelayFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelingDelayFormat(BigInteger newLevelingDelayFormat) {
-		BigInteger oldLevelingDelayFormat = levelingDelayFormat;
-		levelingDelayFormat = newLevelingDelayFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__LEVELING_DELAY_FORMAT, oldLevelingDelayFormat, levelingDelayFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isLinkedFields() {
-		return linkedFields;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLinkedFields(boolean newLinkedFields) {
-		boolean oldLinkedFields = linkedFields;
-		linkedFields = newLinkedFields;
-		boolean oldLinkedFieldsESet = linkedFieldsESet;
-		linkedFieldsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__LINKED_FIELDS, oldLinkedFields, linkedFields, !oldLinkedFieldsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLinkedFields() {
-		boolean oldLinkedFields = linkedFields;
-		boolean oldLinkedFieldsESet = linkedFieldsESet;
-		linkedFields = LINKED_FIELDS_EDEFAULT;
-		linkedFieldsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__LINKED_FIELDS, oldLinkedFields, LINKED_FIELDS_EDEFAULT, oldLinkedFieldsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLinkedFields() {
-		return linkedFieldsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMilestone() {
-		return milestone;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMilestone(boolean newMilestone) {
-		boolean oldMilestone = milestone;
-		milestone = newMilestone;
-		boolean oldMilestoneESet = milestoneESet;
-		milestoneESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__MILESTONE, oldMilestone, milestone, !oldMilestoneESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMilestone() {
-		boolean oldMilestone = milestone;
-		boolean oldMilestoneESet = milestoneESet;
-		milestone = MILESTONE_EDEFAULT;
-		milestoneESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__MILESTONE, oldMilestone, MILESTONE_EDEFAULT, oldMilestoneESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMilestone() {
-		return milestoneESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNotes() {
-		return notes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNotes(String newNotes) {
-		String oldNotes = notes;
-		notes = newNotes;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__NOTES, oldNotes, notes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isOverallocated() {
-		return overallocated;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOverallocated(boolean newOverallocated) {
-		boolean oldOverallocated = overallocated;
-		overallocated = newOverallocated;
-		boolean oldOverallocatedESet = overallocatedESet;
-		overallocatedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__OVERALLOCATED, oldOverallocated, overallocated, !oldOverallocatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetOverallocated() {
-		boolean oldOverallocated = overallocated;
-		boolean oldOverallocatedESet = overallocatedESet;
-		overallocated = OVERALLOCATED_EDEFAULT;
-		overallocatedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__OVERALLOCATED, oldOverallocated, OVERALLOCATED_EDEFAULT, oldOverallocatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetOverallocated() {
-		return overallocatedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getOvertimeCost() {
-		return overtimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeCost(BigDecimal newOvertimeCost) {
-		BigDecimal oldOvertimeCost = overtimeCost;
-		overtimeCost = newOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__OVERTIME_COST, oldOvertimeCost, overtimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getOvertimeWork() {
-		return overtimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeWork(Object newOvertimeWork) {
-		Object oldOvertimeWork = overtimeWork;
-		overtimeWork = newOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__OVERTIME_WORK, oldOvertimeWork, overtimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRegularWork() {
-		return regularWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRegularWork(Object newRegularWork) {
-		Object oldRegularWork = regularWork;
-		regularWork = newRegularWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__REGULAR_WORK, oldRegularWork, regularWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getRemainingCost() {
-		return remainingCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingCost(BigDecimal newRemainingCost) {
-		BigDecimal oldRemainingCost = remainingCost;
-		remainingCost = newRemainingCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__REMAINING_COST, oldRemainingCost, remainingCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getRemainingOvertimeCost() {
-		return remainingOvertimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingOvertimeCost(BigDecimal newRemainingOvertimeCost) {
-		BigDecimal oldRemainingOvertimeCost = remainingOvertimeCost;
-		remainingOvertimeCost = newRemainingOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_COST, oldRemainingOvertimeCost, remainingOvertimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRemainingOvertimeWork() {
-		return remainingOvertimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingOvertimeWork(Object newRemainingOvertimeWork) {
-		Object oldRemainingOvertimeWork = remainingOvertimeWork;
-		remainingOvertimeWork = newRemainingOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_WORK, oldRemainingOvertimeWork, remainingOvertimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRemainingWork() {
-		return remainingWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingWork(Object newRemainingWork) {
-		Object oldRemainingWork = remainingWork;
-		remainingWork = newRemainingWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__REMAINING_WORK, oldRemainingWork, remainingWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isResponsePending() {
-		return responsePending;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResponsePending(boolean newResponsePending) {
-		boolean oldResponsePending = responsePending;
-		responsePending = newResponsePending;
-		boolean oldResponsePendingESet = responsePendingESet;
-		responsePendingESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__RESPONSE_PENDING, oldResponsePending, responsePending, !oldResponsePendingESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetResponsePending() {
-		boolean oldResponsePending = responsePending;
-		boolean oldResponsePendingESet = responsePendingESet;
-		responsePending = RESPONSE_PENDING_EDEFAULT;
-		responsePendingESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__RESPONSE_PENDING, oldResponsePending, RESPONSE_PENDING_EDEFAULT, oldResponsePendingESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetResponsePending() {
-		return responsePendingESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStart() {
-		return start;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStart(Object newStart) {
-		Object oldStart = start;
-		start = newStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__START, oldStart, start));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStop() {
-		return stop;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStop(Object newStop) {
-		Object oldStop = stop;
-		stop = newStop;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__STOP, oldStop, stop));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getResume() {
-		return resume;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResume(Object newResume) {
-		Object oldResume = resume;
-		resume = newResume;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__RESUME, oldResume, resume));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getStartVariance() {
-		return startVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStartVariance(BigInteger newStartVariance) {
-		BigInteger oldStartVariance = startVariance;
-		startVariance = newStartVariance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__START_VARIANCE, oldStartVariance, startVariance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getUnits() {
-		return units;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUnits(float newUnits) {
-		float oldUnits = units;
-		units = newUnits;
-		boolean oldUnitsESet = unitsESet;
-		unitsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__UNITS, oldUnits, units, !oldUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetUnits() {
-		float oldUnits = units;
-		boolean oldUnitsESet = unitsESet;
-		units = UNITS_EDEFAULT;
-		unitsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__UNITS, oldUnits, UNITS_EDEFAULT, oldUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetUnits() {
-		return unitsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isUpdateNeeded() {
-		return updateNeeded;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUpdateNeeded(boolean newUpdateNeeded) {
-		boolean oldUpdateNeeded = updateNeeded;
-		updateNeeded = newUpdateNeeded;
-		boolean oldUpdateNeededESet = updateNeededESet;
-		updateNeededESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__UPDATE_NEEDED, oldUpdateNeeded, updateNeeded, !oldUpdateNeededESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetUpdateNeeded() {
-		boolean oldUpdateNeeded = updateNeeded;
-		boolean oldUpdateNeededESet = updateNeededESet;
-		updateNeeded = UPDATE_NEEDED_EDEFAULT;
-		updateNeededESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__UPDATE_NEEDED, oldUpdateNeeded, UPDATE_NEEDED_EDEFAULT, oldUpdateNeededESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetUpdateNeeded() {
-		return updateNeededESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getVAC() {
-		return vAC;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVAC(float newVAC) {
-		float oldVAC = vAC;
-		vAC = newVAC;
-		boolean oldVACESet = vACESet;
-		vACESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__VAC, oldVAC, vAC, !oldVACESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetVAC() {
-		float oldVAC = vAC;
-		boolean oldVACESet = vACESet;
-		vAC = VAC_EDEFAULT;
-		vACESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__VAC, oldVAC, VAC_EDEFAULT, oldVACESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetVAC() {
-		return vACESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getWork() {
-		return work;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWork(Object newWork) {
-		Object oldWork = work;
-		work = newWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__WORK, oldWork, work));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getWorkContour() {
-		return workContour;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkContour(BigInteger newWorkContour) {
-		BigInteger oldWorkContour = workContour;
-		workContour = newWorkContour;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__WORK_CONTOUR, oldWorkContour, workContour));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWS() {
-		return bCWS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWS(float newBCWS) {
-		float oldBCWS = bCWS;
-		bCWS = newBCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWSESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__BCWS, oldBCWS, bCWS, !oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWS() {
-		float oldBCWS = bCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWS = BCWS_EDEFAULT;
-		bCWSESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__BCWS, oldBCWS, BCWS_EDEFAULT, oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWS() {
-		return bCWSESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWP() {
-		return bCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWP(float newBCWP) {
-		float oldBCWP = bCWP;
-		bCWP = newBCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__BCWP, oldBCWP, bCWP, !oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWP() {
-		float oldBCWP = bCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWP = BCWP_EDEFAULT;
-		bCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.ASSIGNMENT__BCWP, oldBCWP, BCWP_EDEFAULT, oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWP() {
-		return bCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getBookingType() {
-		return bookingType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBookingType(BigInteger newBookingType) {
-		BigInteger oldBookingType = bookingType;
-		bookingType = newBookingType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__BOOKING_TYPE, oldBookingType, bookingType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualWorkProtected() {
-		return actualWorkProtected;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualWorkProtected(Object newActualWorkProtected) {
-		Object oldActualWorkProtected = actualWorkProtected;
-		actualWorkProtected = newActualWorkProtected;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_WORK_PROTECTED, oldActualWorkProtected, actualWorkProtected));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualOvertimeWorkProtected() {
-		return actualOvertimeWorkProtected;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeWorkProtected(Object newActualOvertimeWorkProtected) {
-		Object oldActualOvertimeWorkProtected = actualOvertimeWorkProtected;
-		actualOvertimeWorkProtected = newActualOvertimeWorkProtected;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK_PROTECTED, oldActualOvertimeWorkProtected, actualOvertimeWorkProtected));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getCreationDate() {
-		return creationDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCreationDate(Object newCreationDate) {
-		Object oldCreationDate = creationDate;
-		creationDate = newCreationDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.ASSIGNMENT__CREATION_DATE, oldCreationDate, creationDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExtendedAttribute() {
-		if (extendedAttribute == null) {
-			extendedAttribute = new EObjectContainmentEList(ExtendedAttribute4.class, this, MsprojectPackage.ASSIGNMENT__EXTENDED_ATTRIBUTE);
-		}
-		return extendedAttribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBaseline() {
-		if (baseline == null) {
-			baseline = new EObjectContainmentEList(Baseline3.class, this, MsprojectPackage.ASSIGNMENT__BASELINE);
-		}
-		return baseline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTimephasedData() {
-		if (timephasedData == null) {
-			timephasedData = new EObjectContainmentEList(TimephasedDataType.class, this, MsprojectPackage.ASSIGNMENT__TIMEPHASED_DATA);
-		}
-		return timephasedData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.ASSIGNMENT__EXTENDED_ATTRIBUTE:
-					return ((InternalEList)getExtendedAttribute()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.ASSIGNMENT__BASELINE:
-					return ((InternalEList)getBaseline()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.ASSIGNMENT__TIMEPHASED_DATA:
-					return ((InternalEList)getTimephasedData()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENT__UID:
-				return getUID();
-			case MsprojectPackage.ASSIGNMENT__TASK_UID:
-				return getTaskUID();
-			case MsprojectPackage.ASSIGNMENT__RESOURCE_UID:
-				return getResourceUID();
-			case MsprojectPackage.ASSIGNMENT__PERCENT_WORK_COMPLETE:
-				return getPercentWorkComplete();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_COST:
-				return getActualCost();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_FINISH:
-				return getActualFinish();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_COST:
-				return getActualOvertimeCost();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK:
-				return getActualOvertimeWork();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_START:
-				return getActualStart();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK:
-				return getActualWork();
-			case MsprojectPackage.ASSIGNMENT__ACWP:
-				return new Float(getACWP());
-			case MsprojectPackage.ASSIGNMENT__CONFIRMED:
-				return isConfirmed() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__COST:
-				return getCost();
-			case MsprojectPackage.ASSIGNMENT__COST_RATE_TABLE:
-				return getCostRateTable();
-			case MsprojectPackage.ASSIGNMENT__COST_VARIANCE:
-				return new Float(getCostVariance());
-			case MsprojectPackage.ASSIGNMENT__CV:
-				return new Float(getCV());
-			case MsprojectPackage.ASSIGNMENT__DELAY:
-				return getDelay();
-			case MsprojectPackage.ASSIGNMENT__FINISH:
-				return getFinish();
-			case MsprojectPackage.ASSIGNMENT__FINISH_VARIANCE:
-				return getFinishVariance();
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK:
-				return getHyperlink();
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_ADDRESS:
-				return getHyperlinkAddress();
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_SUB_ADDRESS:
-				return getHyperlinkSubAddress();
-			case MsprojectPackage.ASSIGNMENT__WORK_VARIANCE:
-				return new Float(getWorkVariance());
-			case MsprojectPackage.ASSIGNMENT__HAS_FIXED_RATE_UNITS:
-				return isHasFixedRateUnits() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__FIXED_MATERIAL:
-				return isFixedMaterial() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY:
-				return getLevelingDelay();
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY_FORMAT:
-				return getLevelingDelayFormat();
-			case MsprojectPackage.ASSIGNMENT__LINKED_FIELDS:
-				return isLinkedFields() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__MILESTONE:
-				return isMilestone() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__NOTES:
-				return getNotes();
-			case MsprojectPackage.ASSIGNMENT__OVERALLOCATED:
-				return isOverallocated() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_COST:
-				return getOvertimeCost();
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_WORK:
-				return getOvertimeWork();
-			case MsprojectPackage.ASSIGNMENT__REGULAR_WORK:
-				return getRegularWork();
-			case MsprojectPackage.ASSIGNMENT__REMAINING_COST:
-				return getRemainingCost();
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_COST:
-				return getRemainingOvertimeCost();
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_WORK:
-				return getRemainingOvertimeWork();
-			case MsprojectPackage.ASSIGNMENT__REMAINING_WORK:
-				return getRemainingWork();
-			case MsprojectPackage.ASSIGNMENT__RESPONSE_PENDING:
-				return isResponsePending() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__START:
-				return getStart();
-			case MsprojectPackage.ASSIGNMENT__STOP:
-				return getStop();
-			case MsprojectPackage.ASSIGNMENT__RESUME:
-				return getResume();
-			case MsprojectPackage.ASSIGNMENT__START_VARIANCE:
-				return getStartVariance();
-			case MsprojectPackage.ASSIGNMENT__UNITS:
-				return new Float(getUnits());
-			case MsprojectPackage.ASSIGNMENT__UPDATE_NEEDED:
-				return isUpdateNeeded() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.ASSIGNMENT__VAC:
-				return new Float(getVAC());
-			case MsprojectPackage.ASSIGNMENT__WORK:
-				return getWork();
-			case MsprojectPackage.ASSIGNMENT__WORK_CONTOUR:
-				return getWorkContour();
-			case MsprojectPackage.ASSIGNMENT__BCWS:
-				return new Float(getBCWS());
-			case MsprojectPackage.ASSIGNMENT__BCWP:
-				return new Float(getBCWP());
-			case MsprojectPackage.ASSIGNMENT__BOOKING_TYPE:
-				return getBookingType();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK_PROTECTED:
-				return getActualWorkProtected();
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK_PROTECTED:
-				return getActualOvertimeWorkProtected();
-			case MsprojectPackage.ASSIGNMENT__CREATION_DATE:
-				return getCreationDate();
-			case MsprojectPackage.ASSIGNMENT__EXTENDED_ATTRIBUTE:
-				return getExtendedAttribute();
-			case MsprojectPackage.ASSIGNMENT__BASELINE:
-				return getBaseline();
-			case MsprojectPackage.ASSIGNMENT__TIMEPHASED_DATA:
-				return getTimephasedData();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENT__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__TASK_UID:
-				setTaskUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__RESOURCE_UID:
-				setResourceUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__PERCENT_WORK_COMPLETE:
-				setPercentWorkComplete((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_COST:
-				setActualCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_FINISH:
-				setActualFinish((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_COST:
-				setActualOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK:
-				setActualOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_START:
-				setActualStart((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK:
-				setActualWork((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACWP:
-				setACWP(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__CONFIRMED:
-				setConfirmed(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__COST:
-				setCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__COST_RATE_TABLE:
-				setCostRateTable((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__COST_VARIANCE:
-				setCostVariance(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__CV:
-				setCV(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__DELAY:
-				setDelay((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__FINISH:
-				setFinish((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__FINISH_VARIANCE:
-				setFinishVariance((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK:
-				setHyperlink((String)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_ADDRESS:
-				setHyperlinkAddress((String)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_SUB_ADDRESS:
-				setHyperlinkSubAddress((String)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__WORK_VARIANCE:
-				setWorkVariance(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__HAS_FIXED_RATE_UNITS:
-				setHasFixedRateUnits(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__FIXED_MATERIAL:
-				setFixedMaterial(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY:
-				setLevelingDelay((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY_FORMAT:
-				setLevelingDelayFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__LINKED_FIELDS:
-				setLinkedFields(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__MILESTONE:
-				setMilestone(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__NOTES:
-				setNotes((String)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__OVERALLOCATED:
-				setOverallocated(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_COST:
-				setOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_WORK:
-				setOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REGULAR_WORK:
-				setRegularWork((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_COST:
-				setRemainingCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_COST:
-				setRemainingOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_WORK:
-				setRemainingOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_WORK:
-				setRemainingWork((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__RESPONSE_PENDING:
-				setResponsePending(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__START:
-				setStart((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__STOP:
-				setStop((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__RESUME:
-				setResume((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__START_VARIANCE:
-				setStartVariance((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__UNITS:
-				setUnits(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__UPDATE_NEEDED:
-				setUpdateNeeded(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__VAC:
-				setVAC(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__WORK:
-				setWork((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__WORK_CONTOUR:
-				setWorkContour((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__BCWS:
-				setBCWS(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__BCWP:
-				setBCWP(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.ASSIGNMENT__BOOKING_TYPE:
-				setBookingType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK_PROTECTED:
-				setActualWorkProtected((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK_PROTECTED:
-				setActualOvertimeWorkProtected((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__CREATION_DATE:
-				setCreationDate((Object)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				getExtendedAttribute().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__BASELINE:
-				getBaseline().clear();
-				getBaseline().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.ASSIGNMENT__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				getTimephasedData().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENT__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__TASK_UID:
-				setTaskUID(TASK_UID_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__RESOURCE_UID:
-				setResourceUID(RESOURCE_UID_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__PERCENT_WORK_COMPLETE:
-				setPercentWorkComplete(PERCENT_WORK_COMPLETE_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_COST:
-				setActualCost(ACTUAL_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_FINISH:
-				setActualFinish(ACTUAL_FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_COST:
-				setActualOvertimeCost(ACTUAL_OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK:
-				setActualOvertimeWork(ACTUAL_OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_START:
-				setActualStart(ACTUAL_START_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK:
-				setActualWork(ACTUAL_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACWP:
-				unsetACWP();
-				return;
-			case MsprojectPackage.ASSIGNMENT__CONFIRMED:
-				unsetConfirmed();
-				return;
-			case MsprojectPackage.ASSIGNMENT__COST:
-				setCost(COST_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__COST_RATE_TABLE:
-				setCostRateTable(COST_RATE_TABLE_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__COST_VARIANCE:
-				unsetCostVariance();
-				return;
-			case MsprojectPackage.ASSIGNMENT__CV:
-				unsetCV();
-				return;
-			case MsprojectPackage.ASSIGNMENT__DELAY:
-				setDelay(DELAY_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__FINISH:
-				setFinish(FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__FINISH_VARIANCE:
-				setFinishVariance(FINISH_VARIANCE_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK:
-				setHyperlink(HYPERLINK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_ADDRESS:
-				setHyperlinkAddress(HYPERLINK_ADDRESS_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_SUB_ADDRESS:
-				setHyperlinkSubAddress(HYPERLINK_SUB_ADDRESS_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__WORK_VARIANCE:
-				unsetWorkVariance();
-				return;
-			case MsprojectPackage.ASSIGNMENT__HAS_FIXED_RATE_UNITS:
-				unsetHasFixedRateUnits();
-				return;
-			case MsprojectPackage.ASSIGNMENT__FIXED_MATERIAL:
-				unsetFixedMaterial();
-				return;
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY:
-				setLevelingDelay(LEVELING_DELAY_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY_FORMAT:
-				setLevelingDelayFormat(LEVELING_DELAY_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__LINKED_FIELDS:
-				unsetLinkedFields();
-				return;
-			case MsprojectPackage.ASSIGNMENT__MILESTONE:
-				unsetMilestone();
-				return;
-			case MsprojectPackage.ASSIGNMENT__NOTES:
-				setNotes(NOTES_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__OVERALLOCATED:
-				unsetOverallocated();
-				return;
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_COST:
-				setOvertimeCost(OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_WORK:
-				setOvertimeWork(OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REGULAR_WORK:
-				setRegularWork(REGULAR_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_COST:
-				setRemainingCost(REMAINING_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_COST:
-				setRemainingOvertimeCost(REMAINING_OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_WORK:
-				setRemainingOvertimeWork(REMAINING_OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__REMAINING_WORK:
-				setRemainingWork(REMAINING_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__RESPONSE_PENDING:
-				unsetResponsePending();
-				return;
-			case MsprojectPackage.ASSIGNMENT__START:
-				setStart(START_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__STOP:
-				setStop(STOP_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__RESUME:
-				setResume(RESUME_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__START_VARIANCE:
-				setStartVariance(START_VARIANCE_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__UNITS:
-				unsetUnits();
-				return;
-			case MsprojectPackage.ASSIGNMENT__UPDATE_NEEDED:
-				unsetUpdateNeeded();
-				return;
-			case MsprojectPackage.ASSIGNMENT__VAC:
-				unsetVAC();
-				return;
-			case MsprojectPackage.ASSIGNMENT__WORK:
-				setWork(WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__WORK_CONTOUR:
-				setWorkContour(WORK_CONTOUR_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__BCWS:
-				unsetBCWS();
-				return;
-			case MsprojectPackage.ASSIGNMENT__BCWP:
-				unsetBCWP();
-				return;
-			case MsprojectPackage.ASSIGNMENT__BOOKING_TYPE:
-				setBookingType(BOOKING_TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK_PROTECTED:
-				setActualWorkProtected(ACTUAL_WORK_PROTECTED_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK_PROTECTED:
-				setActualOvertimeWorkProtected(ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__CREATION_DATE:
-				setCreationDate(CREATION_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.ASSIGNMENT__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				return;
-			case MsprojectPackage.ASSIGNMENT__BASELINE:
-				getBaseline().clear();
-				return;
-			case MsprojectPackage.ASSIGNMENT__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENT__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.ASSIGNMENT__TASK_UID:
-				return TASK_UID_EDEFAULT == null ? taskUID != null : !TASK_UID_EDEFAULT.equals(taskUID);
-			case MsprojectPackage.ASSIGNMENT__RESOURCE_UID:
-				return RESOURCE_UID_EDEFAULT == null ? resourceUID != null : !RESOURCE_UID_EDEFAULT.equals(resourceUID);
-			case MsprojectPackage.ASSIGNMENT__PERCENT_WORK_COMPLETE:
-				return PERCENT_WORK_COMPLETE_EDEFAULT == null ? percentWorkComplete != null : !PERCENT_WORK_COMPLETE_EDEFAULT.equals(percentWorkComplete);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_COST:
-				return ACTUAL_COST_EDEFAULT == null ? actualCost != null : !ACTUAL_COST_EDEFAULT.equals(actualCost);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_FINISH:
-				return ACTUAL_FINISH_EDEFAULT == null ? actualFinish != null : !ACTUAL_FINISH_EDEFAULT.equals(actualFinish);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_COST:
-				return ACTUAL_OVERTIME_COST_EDEFAULT == null ? actualOvertimeCost != null : !ACTUAL_OVERTIME_COST_EDEFAULT.equals(actualOvertimeCost);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK:
-				return ACTUAL_OVERTIME_WORK_EDEFAULT == null ? actualOvertimeWork != null : !ACTUAL_OVERTIME_WORK_EDEFAULT.equals(actualOvertimeWork);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_START:
-				return ACTUAL_START_EDEFAULT == null ? actualStart != null : !ACTUAL_START_EDEFAULT.equals(actualStart);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK:
-				return ACTUAL_WORK_EDEFAULT == null ? actualWork != null : !ACTUAL_WORK_EDEFAULT.equals(actualWork);
-			case MsprojectPackage.ASSIGNMENT__ACWP:
-				return isSetACWP();
-			case MsprojectPackage.ASSIGNMENT__CONFIRMED:
-				return isSetConfirmed();
-			case MsprojectPackage.ASSIGNMENT__COST:
-				return COST_EDEFAULT == null ? cost != null : !COST_EDEFAULT.equals(cost);
-			case MsprojectPackage.ASSIGNMENT__COST_RATE_TABLE:
-				return COST_RATE_TABLE_EDEFAULT == null ? costRateTable != null : !COST_RATE_TABLE_EDEFAULT.equals(costRateTable);
-			case MsprojectPackage.ASSIGNMENT__COST_VARIANCE:
-				return isSetCostVariance();
-			case MsprojectPackage.ASSIGNMENT__CV:
-				return isSetCV();
-			case MsprojectPackage.ASSIGNMENT__DELAY:
-				return DELAY_EDEFAULT == null ? delay != null : !DELAY_EDEFAULT.equals(delay);
-			case MsprojectPackage.ASSIGNMENT__FINISH:
-				return FINISH_EDEFAULT == null ? finish != null : !FINISH_EDEFAULT.equals(finish);
-			case MsprojectPackage.ASSIGNMENT__FINISH_VARIANCE:
-				return FINISH_VARIANCE_EDEFAULT == null ? finishVariance != null : !FINISH_VARIANCE_EDEFAULT.equals(finishVariance);
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK:
-				return HYPERLINK_EDEFAULT == null ? hyperlink != null : !HYPERLINK_EDEFAULT.equals(hyperlink);
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_ADDRESS:
-				return HYPERLINK_ADDRESS_EDEFAULT == null ? hyperlinkAddress != null : !HYPERLINK_ADDRESS_EDEFAULT.equals(hyperlinkAddress);
-			case MsprojectPackage.ASSIGNMENT__HYPERLINK_SUB_ADDRESS:
-				return HYPERLINK_SUB_ADDRESS_EDEFAULT == null ? hyperlinkSubAddress != null : !HYPERLINK_SUB_ADDRESS_EDEFAULT.equals(hyperlinkSubAddress);
-			case MsprojectPackage.ASSIGNMENT__WORK_VARIANCE:
-				return isSetWorkVariance();
-			case MsprojectPackage.ASSIGNMENT__HAS_FIXED_RATE_UNITS:
-				return isSetHasFixedRateUnits();
-			case MsprojectPackage.ASSIGNMENT__FIXED_MATERIAL:
-				return isSetFixedMaterial();
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY:
-				return LEVELING_DELAY_EDEFAULT == null ? levelingDelay != null : !LEVELING_DELAY_EDEFAULT.equals(levelingDelay);
-			case MsprojectPackage.ASSIGNMENT__LEVELING_DELAY_FORMAT:
-				return LEVELING_DELAY_FORMAT_EDEFAULT == null ? levelingDelayFormat != null : !LEVELING_DELAY_FORMAT_EDEFAULT.equals(levelingDelayFormat);
-			case MsprojectPackage.ASSIGNMENT__LINKED_FIELDS:
-				return isSetLinkedFields();
-			case MsprojectPackage.ASSIGNMENT__MILESTONE:
-				return isSetMilestone();
-			case MsprojectPackage.ASSIGNMENT__NOTES:
-				return NOTES_EDEFAULT == null ? notes != null : !NOTES_EDEFAULT.equals(notes);
-			case MsprojectPackage.ASSIGNMENT__OVERALLOCATED:
-				return isSetOverallocated();
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_COST:
-				return OVERTIME_COST_EDEFAULT == null ? overtimeCost != null : !OVERTIME_COST_EDEFAULT.equals(overtimeCost);
-			case MsprojectPackage.ASSIGNMENT__OVERTIME_WORK:
-				return OVERTIME_WORK_EDEFAULT == null ? overtimeWork != null : !OVERTIME_WORK_EDEFAULT.equals(overtimeWork);
-			case MsprojectPackage.ASSIGNMENT__REGULAR_WORK:
-				return REGULAR_WORK_EDEFAULT == null ? regularWork != null : !REGULAR_WORK_EDEFAULT.equals(regularWork);
-			case MsprojectPackage.ASSIGNMENT__REMAINING_COST:
-				return REMAINING_COST_EDEFAULT == null ? remainingCost != null : !REMAINING_COST_EDEFAULT.equals(remainingCost);
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_COST:
-				return REMAINING_OVERTIME_COST_EDEFAULT == null ? remainingOvertimeCost != null : !REMAINING_OVERTIME_COST_EDEFAULT.equals(remainingOvertimeCost);
-			case MsprojectPackage.ASSIGNMENT__REMAINING_OVERTIME_WORK:
-				return REMAINING_OVERTIME_WORK_EDEFAULT == null ? remainingOvertimeWork != null : !REMAINING_OVERTIME_WORK_EDEFAULT.equals(remainingOvertimeWork);
-			case MsprojectPackage.ASSIGNMENT__REMAINING_WORK:
-				return REMAINING_WORK_EDEFAULT == null ? remainingWork != null : !REMAINING_WORK_EDEFAULT.equals(remainingWork);
-			case MsprojectPackage.ASSIGNMENT__RESPONSE_PENDING:
-				return isSetResponsePending();
-			case MsprojectPackage.ASSIGNMENT__START:
-				return START_EDEFAULT == null ? start != null : !START_EDEFAULT.equals(start);
-			case MsprojectPackage.ASSIGNMENT__STOP:
-				return STOP_EDEFAULT == null ? stop != null : !STOP_EDEFAULT.equals(stop);
-			case MsprojectPackage.ASSIGNMENT__RESUME:
-				return RESUME_EDEFAULT == null ? resume != null : !RESUME_EDEFAULT.equals(resume);
-			case MsprojectPackage.ASSIGNMENT__START_VARIANCE:
-				return START_VARIANCE_EDEFAULT == null ? startVariance != null : !START_VARIANCE_EDEFAULT.equals(startVariance);
-			case MsprojectPackage.ASSIGNMENT__UNITS:
-				return isSetUnits();
-			case MsprojectPackage.ASSIGNMENT__UPDATE_NEEDED:
-				return isSetUpdateNeeded();
-			case MsprojectPackage.ASSIGNMENT__VAC:
-				return isSetVAC();
-			case MsprojectPackage.ASSIGNMENT__WORK:
-				return WORK_EDEFAULT == null ? work != null : !WORK_EDEFAULT.equals(work);
-			case MsprojectPackage.ASSIGNMENT__WORK_CONTOUR:
-				return WORK_CONTOUR_EDEFAULT == null ? workContour != null : !WORK_CONTOUR_EDEFAULT.equals(workContour);
-			case MsprojectPackage.ASSIGNMENT__BCWS:
-				return isSetBCWS();
-			case MsprojectPackage.ASSIGNMENT__BCWP:
-				return isSetBCWP();
-			case MsprojectPackage.ASSIGNMENT__BOOKING_TYPE:
-				return BOOKING_TYPE_EDEFAULT == null ? bookingType != null : !BOOKING_TYPE_EDEFAULT.equals(bookingType);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_WORK_PROTECTED:
-				return ACTUAL_WORK_PROTECTED_EDEFAULT == null ? actualWorkProtected != null : !ACTUAL_WORK_PROTECTED_EDEFAULT.equals(actualWorkProtected);
-			case MsprojectPackage.ASSIGNMENT__ACTUAL_OVERTIME_WORK_PROTECTED:
-				return ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT == null ? actualOvertimeWorkProtected != null : !ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT.equals(actualOvertimeWorkProtected);
-			case MsprojectPackage.ASSIGNMENT__CREATION_DATE:
-				return CREATION_DATE_EDEFAULT == null ? creationDate != null : !CREATION_DATE_EDEFAULT.equals(creationDate);
-			case MsprojectPackage.ASSIGNMENT__EXTENDED_ATTRIBUTE:
-				return extendedAttribute != null && !extendedAttribute.isEmpty();
-			case MsprojectPackage.ASSIGNMENT__BASELINE:
-				return baseline != null && !baseline.isEmpty();
-			case MsprojectPackage.ASSIGNMENT__TIMEPHASED_DATA:
-				return timephasedData != null && !timephasedData.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", taskUID: ");
-		result.append(taskUID);
-		result.append(", resourceUID: ");
-		result.append(resourceUID);
-		result.append(", percentWorkComplete: ");
-		result.append(percentWorkComplete);
-		result.append(", actualCost: ");
-		result.append(actualCost);
-		result.append(", actualFinish: ");
-		result.append(actualFinish);
-		result.append(", actualOvertimeCost: ");
-		result.append(actualOvertimeCost);
-		result.append(", actualOvertimeWork: ");
-		result.append(actualOvertimeWork);
-		result.append(", actualStart: ");
-		result.append(actualStart);
-		result.append(", actualWork: ");
-		result.append(actualWork);
-		result.append(", aCWP: ");
-		if (aCWPESet) result.append(aCWP); else result.append("<unset>");
-		result.append(", confirmed: ");
-		if (confirmedESet) result.append(confirmed); else result.append("<unset>");
-		result.append(", cost: ");
-		result.append(cost);
-		result.append(", costRateTable: ");
-		result.append(costRateTable);
-		result.append(", costVariance: ");
-		if (costVarianceESet) result.append(costVariance); else result.append("<unset>");
-		result.append(", cV: ");
-		if (cVESet) result.append(cV); else result.append("<unset>");
-		result.append(", delay: ");
-		result.append(delay);
-		result.append(", finish: ");
-		result.append(finish);
-		result.append(", finishVariance: ");
-		result.append(finishVariance);
-		result.append(", hyperlink: ");
-		result.append(hyperlink);
-		result.append(", hyperlinkAddress: ");
-		result.append(hyperlinkAddress);
-		result.append(", hyperlinkSubAddress: ");
-		result.append(hyperlinkSubAddress);
-		result.append(", workVariance: ");
-		if (workVarianceESet) result.append(workVariance); else result.append("<unset>");
-		result.append(", hasFixedRateUnits: ");
-		if (hasFixedRateUnitsESet) result.append(hasFixedRateUnits); else result.append("<unset>");
-		result.append(", fixedMaterial: ");
-		if (fixedMaterialESet) result.append(fixedMaterial); else result.append("<unset>");
-		result.append(", levelingDelay: ");
-		result.append(levelingDelay);
-		result.append(", levelingDelayFormat: ");
-		result.append(levelingDelayFormat);
-		result.append(", linkedFields: ");
-		if (linkedFieldsESet) result.append(linkedFields); else result.append("<unset>");
-		result.append(", milestone: ");
-		if (milestoneESet) result.append(milestone); else result.append("<unset>");
-		result.append(", notes: ");
-		result.append(notes);
-		result.append(", overallocated: ");
-		if (overallocatedESet) result.append(overallocated); else result.append("<unset>");
-		result.append(", overtimeCost: ");
-		result.append(overtimeCost);
-		result.append(", overtimeWork: ");
-		result.append(overtimeWork);
-		result.append(", regularWork: ");
-		result.append(regularWork);
-		result.append(", remainingCost: ");
-		result.append(remainingCost);
-		result.append(", remainingOvertimeCost: ");
-		result.append(remainingOvertimeCost);
-		result.append(", remainingOvertimeWork: ");
-		result.append(remainingOvertimeWork);
-		result.append(", remainingWork: ");
-		result.append(remainingWork);
-		result.append(", responsePending: ");
-		if (responsePendingESet) result.append(responsePending); else result.append("<unset>");
-		result.append(", start: ");
-		result.append(start);
-		result.append(", stop: ");
-		result.append(stop);
-		result.append(", resume: ");
-		result.append(resume);
-		result.append(", startVariance: ");
-		result.append(startVariance);
-		result.append(", units: ");
-		if (unitsESet) result.append(units); else result.append("<unset>");
-		result.append(", updateNeeded: ");
-		if (updateNeededESet) result.append(updateNeeded); else result.append("<unset>");
-		result.append(", vAC: ");
-		if (vACESet) result.append(vAC); else result.append("<unset>");
-		result.append(", work: ");
-		result.append(work);
-		result.append(", workContour: ");
-		result.append(workContour);
-		result.append(", bCWS: ");
-		if (bCWSESet) result.append(bCWS); else result.append("<unset>");
-		result.append(", bCWP: ");
-		if (bCWPESet) result.append(bCWP); else result.append("<unset>");
-		result.append(", bookingType: ");
-		result.append(bookingType);
-		result.append(", actualWorkProtected: ");
-		result.append(actualWorkProtected);
-		result.append(", actualOvertimeWorkProtected: ");
-		result.append(actualOvertimeWorkProtected);
-		result.append(", creationDate: ");
-		result.append(creationDate);
-		result.append(')');
-		return result.toString();
-	}
-
-} //AssignmentImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AssignmentsImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AssignmentsImpl.java
deleted file mode 100644
index 1025672..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AssignmentsImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AssignmentsImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.Assignment;
-import org.eclipse.epf.msproject.Assignments;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Assignments</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.AssignmentsImpl#getAssignment <em>Assignment</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AssignmentsImpl extends EObjectImpl implements Assignments {
-	/**
-	 * The cached value of the '{@link #getAssignment() <em>Assignment</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssignment()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList assignment = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AssignmentsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getAssignments();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAssignment() {
-		if (assignment == null) {
-			assignment = new EObjectContainmentEList(Assignment.class, this, MsprojectPackage.ASSIGNMENTS__ASSIGNMENT);
-		}
-		return assignment;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.ASSIGNMENTS__ASSIGNMENT:
-					return ((InternalEList)getAssignment()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENTS__ASSIGNMENT:
-				return getAssignment();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENTS__ASSIGNMENT:
-				getAssignment().clear();
-				getAssignment().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENTS__ASSIGNMENT:
-				getAssignment().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.ASSIGNMENTS__ASSIGNMENT:
-				return assignment != null && !assignment.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //AssignmentsImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AvailabilityPeriodImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AvailabilityPeriodImpl.java
deleted file mode 100644
index 4860bac..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AvailabilityPeriodImpl.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AvailabilityPeriodImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.AvailabilityPeriod;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Availability Period</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.AvailabilityPeriodImpl#getAvailableFrom <em>Available From</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AvailabilityPeriodImpl#getAvailableTo <em>Available To</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.AvailabilityPeriodImpl#getAvailableUnits <em>Available Units</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AvailabilityPeriodImpl extends EObjectImpl implements AvailabilityPeriod {
-	/**
-	 * The default value of the '{@link #getAvailableFrom() <em>Available From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableFrom()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object AVAILABLE_FROM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAvailableFrom() <em>Available From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableFrom()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object availableFrom = AVAILABLE_FROM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAvailableTo() <em>Available To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableTo()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object AVAILABLE_TO_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAvailableTo() <em>Available To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableTo()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object availableTo = AVAILABLE_TO_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAvailableUnits() <em>Available Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float AVAILABLE_UNITS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getAvailableUnits() <em>Available Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected float availableUnits = AVAILABLE_UNITS_EDEFAULT;
-
-	/**
-	 * This is true if the Available Units attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean availableUnitsESet = false;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AvailabilityPeriodImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getAvailabilityPeriod();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getAvailableFrom() {
-		return availableFrom;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAvailableFrom(Object newAvailableFrom) {
-		Object oldAvailableFrom = availableFrom;
-		availableFrom = newAvailableFrom;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_FROM, oldAvailableFrom, availableFrom));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getAvailableTo() {
-		return availableTo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAvailableTo(Object newAvailableTo) {
-		Object oldAvailableTo = availableTo;
-		availableTo = newAvailableTo;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_TO, oldAvailableTo, availableTo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getAvailableUnits() {
-		return availableUnits;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAvailableUnits(float newAvailableUnits) {
-		float oldAvailableUnits = availableUnits;
-		availableUnits = newAvailableUnits;
-		boolean oldAvailableUnitsESet = availableUnitsESet;
-		availableUnitsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_UNITS, oldAvailableUnits, availableUnits, !oldAvailableUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetAvailableUnits() {
-		float oldAvailableUnits = availableUnits;
-		boolean oldAvailableUnitsESet = availableUnitsESet;
-		availableUnits = AVAILABLE_UNITS_EDEFAULT;
-		availableUnitsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_UNITS, oldAvailableUnits, AVAILABLE_UNITS_EDEFAULT, oldAvailableUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetAvailableUnits() {
-		return availableUnitsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_FROM:
-				return getAvailableFrom();
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_TO:
-				return getAvailableTo();
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_UNITS:
-				return new Float(getAvailableUnits());
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_FROM:
-				setAvailableFrom((Object)newValue);
-				return;
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_TO:
-				setAvailableTo((Object)newValue);
-				return;
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_UNITS:
-				setAvailableUnits(((Float)newValue).floatValue());
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_FROM:
-				setAvailableFrom(AVAILABLE_FROM_EDEFAULT);
-				return;
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_TO:
-				setAvailableTo(AVAILABLE_TO_EDEFAULT);
-				return;
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_UNITS:
-				unsetAvailableUnits();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_FROM:
-				return AVAILABLE_FROM_EDEFAULT == null ? availableFrom != null : !AVAILABLE_FROM_EDEFAULT.equals(availableFrom);
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_TO:
-				return AVAILABLE_TO_EDEFAULT == null ? availableTo != null : !AVAILABLE_TO_EDEFAULT.equals(availableTo);
-			case MsprojectPackage.AVAILABILITY_PERIOD__AVAILABLE_UNITS:
-				return isSetAvailableUnits();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (availableFrom: ");
-		result.append(availableFrom);
-		result.append(", availableTo: ");
-		result.append(availableTo);
-		result.append(", availableUnits: ");
-		if (availableUnitsESet) result.append(availableUnits); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //AvailabilityPeriodImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AvailabilityPeriodsImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AvailabilityPeriodsImpl.java
deleted file mode 100644
index 3e65481..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/AvailabilityPeriodsImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: AvailabilityPeriodsImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.AvailabilityPeriod;
-import org.eclipse.epf.msproject.AvailabilityPeriods;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Availability Periods</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.AvailabilityPeriodsImpl#getAvailabilityPeriod <em>Availability Period</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AvailabilityPeriodsImpl extends EObjectImpl implements AvailabilityPeriods {
-	/**
-	 * The cached value of the '{@link #getAvailabilityPeriod() <em>Availability Period</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailabilityPeriod()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList availabilityPeriod = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AvailabilityPeriodsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getAvailabilityPeriods();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAvailabilityPeriod() {
-		if (availabilityPeriod == null) {
-			availabilityPeriod = new EObjectContainmentEList(AvailabilityPeriod.class, this, MsprojectPackage.AVAILABILITY_PERIODS__AVAILABILITY_PERIOD);
-		}
-		return availabilityPeriod;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.AVAILABILITY_PERIODS__AVAILABILITY_PERIOD:
-					return ((InternalEList)getAvailabilityPeriod()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIODS__AVAILABILITY_PERIOD:
-				return getAvailabilityPeriod();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIODS__AVAILABILITY_PERIOD:
-				getAvailabilityPeriod().clear();
-				getAvailabilityPeriod().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIODS__AVAILABILITY_PERIOD:
-				getAvailabilityPeriod().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.AVAILABILITY_PERIODS__AVAILABILITY_PERIOD:
-				return availabilityPeriod != null && !availabilityPeriod.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //AvailabilityPeriodsImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Baseline2Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Baseline2Impl.java
deleted file mode 100644
index 84dc3d1..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Baseline2Impl.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Baseline2Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.Baseline2;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Baseline2</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline2Impl#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline2Impl#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline2Impl#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline2Impl#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline2Impl#getBCWP <em>BCWP</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class Baseline2Impl extends EObjectImpl implements Baseline2 {
-	/**
-	 * The default value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger NUMBER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger number = NUMBER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object work = WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float COST_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected float cost = COST_EDEFAULT;
-
-	/**
-	 * This is true if the Cost attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean costESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWS = BCWS_EDEFAULT;
-
-	/**
-	 * This is true if the BCWS attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWSESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWP = BCWP_EDEFAULT;
-
-	/**
-	 * This is true if the BCWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWPESet = false;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Baseline2Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getBaseline2();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getNumber() {
-		return number;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNumber(BigInteger newNumber) {
-		BigInteger oldNumber = number;
-		number = newNumber;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE2__NUMBER, oldNumber, number));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getWork() {
-		return work;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWork(Object newWork) {
-		Object oldWork = work;
-		work = newWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE2__WORK, oldWork, work));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getCost() {
-		return cost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCost(float newCost) {
-		float oldCost = cost;
-		cost = newCost;
-		boolean oldCostESet = costESet;
-		costESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE2__COST, oldCost, cost, !oldCostESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCost() {
-		float oldCost = cost;
-		boolean oldCostESet = costESet;
-		cost = COST_EDEFAULT;
-		costESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE2__COST, oldCost, COST_EDEFAULT, oldCostESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCost() {
-		return costESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWS() {
-		return bCWS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWS(float newBCWS) {
-		float oldBCWS = bCWS;
-		bCWS = newBCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWSESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE2__BCWS, oldBCWS, bCWS, !oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWS() {
-		float oldBCWS = bCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWS = BCWS_EDEFAULT;
-		bCWSESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE2__BCWS, oldBCWS, BCWS_EDEFAULT, oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWS() {
-		return bCWSESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWP() {
-		return bCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWP(float newBCWP) {
-		float oldBCWP = bCWP;
-		bCWP = newBCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE2__BCWP, oldBCWP, bCWP, !oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWP() {
-		float oldBCWP = bCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWP = BCWP_EDEFAULT;
-		bCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE2__BCWP, oldBCWP, BCWP_EDEFAULT, oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWP() {
-		return bCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE2__NUMBER:
-				return getNumber();
-			case MsprojectPackage.BASELINE2__WORK:
-				return getWork();
-			case MsprojectPackage.BASELINE2__COST:
-				return new Float(getCost());
-			case MsprojectPackage.BASELINE2__BCWS:
-				return new Float(getBCWS());
-			case MsprojectPackage.BASELINE2__BCWP:
-				return new Float(getBCWP());
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE2__NUMBER:
-				setNumber((BigInteger)newValue);
-				return;
-			case MsprojectPackage.BASELINE2__WORK:
-				setWork((Object)newValue);
-				return;
-			case MsprojectPackage.BASELINE2__COST:
-				setCost(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.BASELINE2__BCWS:
-				setBCWS(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.BASELINE2__BCWP:
-				setBCWP(((Float)newValue).floatValue());
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE2__NUMBER:
-				setNumber(NUMBER_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE2__WORK:
-				setWork(WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE2__COST:
-				unsetCost();
-				return;
-			case MsprojectPackage.BASELINE2__BCWS:
-				unsetBCWS();
-				return;
-			case MsprojectPackage.BASELINE2__BCWP:
-				unsetBCWP();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE2__NUMBER:
-				return NUMBER_EDEFAULT == null ? number != null : !NUMBER_EDEFAULT.equals(number);
-			case MsprojectPackage.BASELINE2__WORK:
-				return WORK_EDEFAULT == null ? work != null : !WORK_EDEFAULT.equals(work);
-			case MsprojectPackage.BASELINE2__COST:
-				return isSetCost();
-			case MsprojectPackage.BASELINE2__BCWS:
-				return isSetBCWS();
-			case MsprojectPackage.BASELINE2__BCWP:
-				return isSetBCWP();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (number: ");
-		result.append(number);
-		result.append(", work: ");
-		result.append(work);
-		result.append(", cost: ");
-		if (costESet) result.append(cost); else result.append("<unset>");
-		result.append(", bCWS: ");
-		if (bCWSESet) result.append(bCWS); else result.append("<unset>");
-		result.append(", bCWP: ");
-		if (bCWPESet) result.append(bCWP); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //Baseline2Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Baseline3Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Baseline3Impl.java
deleted file mode 100644
index 675cf40..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Baseline3Impl.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Baseline3Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.Baseline3;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.TimephasedDataType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Baseline3</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getTimephasedData <em>Timephased Data</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Baseline3Impl#getBCWP <em>BCWP</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class Baseline3Impl extends EObjectImpl implements Baseline3 {
-	/**
-	 * The cached value of the '{@link #getTimephasedData() <em>Timephased Data</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTimephasedData()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList timephasedData = null;
-
-	/**
-	 * The default value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NUMBER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected String number = NUMBER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected String start = START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected String finish = FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object work = WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected String cost = COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWS = BCWS_EDEFAULT;
-
-	/**
-	 * This is true if the BCWS attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWSESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWP = BCWP_EDEFAULT;
-
-	/**
-	 * This is true if the BCWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWPESet = false;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Baseline3Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getBaseline3();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTimephasedData() {
-		if (timephasedData == null) {
-			timephasedData = new EObjectContainmentEList(TimephasedDataType.class, this, MsprojectPackage.BASELINE3__TIMEPHASED_DATA);
-		}
-		return timephasedData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNumber() {
-		return number;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNumber(String newNumber) {
-		String oldNumber = number;
-		number = newNumber;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE3__NUMBER, oldNumber, number));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getStart() {
-		return start;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStart(String newStart) {
-		String oldStart = start;
-		start = newStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE3__START, oldStart, start));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFinish() {
-		return finish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinish(String newFinish) {
-		String oldFinish = finish;
-		finish = newFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE3__FINISH, oldFinish, finish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getWork() {
-		return work;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWork(Object newWork) {
-		Object oldWork = work;
-		work = newWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE3__WORK, oldWork, work));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCost() {
-		return cost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCost(String newCost) {
-		String oldCost = cost;
-		cost = newCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE3__COST, oldCost, cost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWS() {
-		return bCWS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWS(float newBCWS) {
-		float oldBCWS = bCWS;
-		bCWS = newBCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWSESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE3__BCWS, oldBCWS, bCWS, !oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWS() {
-		float oldBCWS = bCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWS = BCWS_EDEFAULT;
-		bCWSESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE3__BCWS, oldBCWS, BCWS_EDEFAULT, oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWS() {
-		return bCWSESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWP() {
-		return bCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWP(float newBCWP) {
-		float oldBCWP = bCWP;
-		bCWP = newBCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE3__BCWP, oldBCWP, bCWP, !oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWP() {
-		float oldBCWP = bCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWP = BCWP_EDEFAULT;
-		bCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE3__BCWP, oldBCWP, BCWP_EDEFAULT, oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWP() {
-		return bCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.BASELINE3__TIMEPHASED_DATA:
-					return ((InternalEList)getTimephasedData()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE3__TIMEPHASED_DATA:
-				return getTimephasedData();
-			case MsprojectPackage.BASELINE3__NUMBER:
-				return getNumber();
-			case MsprojectPackage.BASELINE3__START:
-				return getStart();
-			case MsprojectPackage.BASELINE3__FINISH:
-				return getFinish();
-			case MsprojectPackage.BASELINE3__WORK:
-				return getWork();
-			case MsprojectPackage.BASELINE3__COST:
-				return getCost();
-			case MsprojectPackage.BASELINE3__BCWS:
-				return new Float(getBCWS());
-			case MsprojectPackage.BASELINE3__BCWP:
-				return new Float(getBCWP());
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE3__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				getTimephasedData().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.BASELINE3__NUMBER:
-				setNumber((String)newValue);
-				return;
-			case MsprojectPackage.BASELINE3__START:
-				setStart((String)newValue);
-				return;
-			case MsprojectPackage.BASELINE3__FINISH:
-				setFinish((String)newValue);
-				return;
-			case MsprojectPackage.BASELINE3__WORK:
-				setWork((Object)newValue);
-				return;
-			case MsprojectPackage.BASELINE3__COST:
-				setCost((String)newValue);
-				return;
-			case MsprojectPackage.BASELINE3__BCWS:
-				setBCWS(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.BASELINE3__BCWP:
-				setBCWP(((Float)newValue).floatValue());
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE3__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				return;
-			case MsprojectPackage.BASELINE3__NUMBER:
-				setNumber(NUMBER_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE3__START:
-				setStart(START_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE3__FINISH:
-				setFinish(FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE3__WORK:
-				setWork(WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE3__COST:
-				setCost(COST_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE3__BCWS:
-				unsetBCWS();
-				return;
-			case MsprojectPackage.BASELINE3__BCWP:
-				unsetBCWP();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE3__TIMEPHASED_DATA:
-				return timephasedData != null && !timephasedData.isEmpty();
-			case MsprojectPackage.BASELINE3__NUMBER:
-				return NUMBER_EDEFAULT == null ? number != null : !NUMBER_EDEFAULT.equals(number);
-			case MsprojectPackage.BASELINE3__START:
-				return START_EDEFAULT == null ? start != null : !START_EDEFAULT.equals(start);
-			case MsprojectPackage.BASELINE3__FINISH:
-				return FINISH_EDEFAULT == null ? finish != null : !FINISH_EDEFAULT.equals(finish);
-			case MsprojectPackage.BASELINE3__WORK:
-				return WORK_EDEFAULT == null ? work != null : !WORK_EDEFAULT.equals(work);
-			case MsprojectPackage.BASELINE3__COST:
-				return COST_EDEFAULT == null ? cost != null : !COST_EDEFAULT.equals(cost);
-			case MsprojectPackage.BASELINE3__BCWS:
-				return isSetBCWS();
-			case MsprojectPackage.BASELINE3__BCWP:
-				return isSetBCWP();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (number: ");
-		result.append(number);
-		result.append(", start: ");
-		result.append(start);
-		result.append(", finish: ");
-		result.append(finish);
-		result.append(", work: ");
-		result.append(work);
-		result.append(", cost: ");
-		result.append(cost);
-		result.append(", bCWS: ");
-		if (bCWSESet) result.append(bCWS); else result.append("<unset>");
-		result.append(", bCWP: ");
-		if (bCWPESet) result.append(bCWP); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //Baseline3Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/BaselineImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/BaselineImpl.java
deleted file mode 100644
index 1707058..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/BaselineImpl.java
+++ /dev/null
@@ -1,896 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: BaselineImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-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.EStructuralFeature;
-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.epf.msproject.Baseline;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.TimephasedDataType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Baseline</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getTimephasedData <em>Timephased Data</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getNumber <em>Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#isInterim <em>Interim</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getDuration <em>Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getDurationFormat <em>Duration Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#isEstimatedDuration <em>Estimated Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.BaselineImpl#getBCWP <em>BCWP</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BaselineImpl extends EObjectImpl implements Baseline {
-	/**
-	 * The cached value of the '{@link #getTimephasedData() <em>Timephased Data</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTimephasedData()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList timephasedData = null;
-
-	/**
-	 * The default value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger NUMBER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNumber() <em>Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger number = NUMBER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isInterim() <em>Interim</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isInterim()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean INTERIM_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isInterim() <em>Interim</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isInterim()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean interim = INTERIM_EDEFAULT;
-
-	/**
-	 * This is true if the Interim attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean interimESet = false;
-
-	/**
-	 * The default value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object start = START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object finish = FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDuration() <em>Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object DURATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDuration() <em>Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object duration = DURATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DURATION_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger durationFormat = DURATION_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isEstimatedDuration() <em>Estimated Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEstimatedDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ESTIMATED_DURATION_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isEstimatedDuration() <em>Estimated Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEstimatedDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean estimatedDuration = ESTIMATED_DURATION_EDEFAULT;
-
-	/**
-	 * This is true if the Estimated Duration attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean estimatedDurationESet = false;
-
-	/**
-	 * The default value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object work = WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal cost = COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWS = BCWS_EDEFAULT;
-
-	/**
-	 * This is true if the BCWS attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWSESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWP = BCWP_EDEFAULT;
-
-	/**
-	 * This is true if the BCWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWPESet = false;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BaselineImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getBaseline();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTimephasedData() {
-		if (timephasedData == null) {
-			timephasedData = new EObjectContainmentEList(TimephasedDataType.class, this, MsprojectPackage.BASELINE__TIMEPHASED_DATA);
-		}
-		return timephasedData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getNumber() {
-		return number;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNumber(BigInteger newNumber) {
-		BigInteger oldNumber = number;
-		number = newNumber;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__NUMBER, oldNumber, number));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isInterim() {
-		return interim;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setInterim(boolean newInterim) {
-		boolean oldInterim = interim;
-		interim = newInterim;
-		boolean oldInterimESet = interimESet;
-		interimESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__INTERIM, oldInterim, interim, !oldInterimESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetInterim() {
-		boolean oldInterim = interim;
-		boolean oldInterimESet = interimESet;
-		interim = INTERIM_EDEFAULT;
-		interimESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE__INTERIM, oldInterim, INTERIM_EDEFAULT, oldInterimESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetInterim() {
-		return interimESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStart() {
-		return start;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStart(Object newStart) {
-		Object oldStart = start;
-		start = newStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__START, oldStart, start));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFinish() {
-		return finish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinish(Object newFinish) {
-		Object oldFinish = finish;
-		finish = newFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__FINISH, oldFinish, finish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getDuration() {
-		return duration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDuration(Object newDuration) {
-		Object oldDuration = duration;
-		duration = newDuration;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__DURATION, oldDuration, duration));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDurationFormat() {
-		return durationFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDurationFormat(BigInteger newDurationFormat) {
-		BigInteger oldDurationFormat = durationFormat;
-		durationFormat = newDurationFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__DURATION_FORMAT, oldDurationFormat, durationFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isEstimatedDuration() {
-		return estimatedDuration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEstimatedDuration(boolean newEstimatedDuration) {
-		boolean oldEstimatedDuration = estimatedDuration;
-		estimatedDuration = newEstimatedDuration;
-		boolean oldEstimatedDurationESet = estimatedDurationESet;
-		estimatedDurationESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__ESTIMATED_DURATION, oldEstimatedDuration, estimatedDuration, !oldEstimatedDurationESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetEstimatedDuration() {
-		boolean oldEstimatedDuration = estimatedDuration;
-		boolean oldEstimatedDurationESet = estimatedDurationESet;
-		estimatedDuration = ESTIMATED_DURATION_EDEFAULT;
-		estimatedDurationESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE__ESTIMATED_DURATION, oldEstimatedDuration, ESTIMATED_DURATION_EDEFAULT, oldEstimatedDurationESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetEstimatedDuration() {
-		return estimatedDurationESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getWork() {
-		return work;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWork(Object newWork) {
-		Object oldWork = work;
-		work = newWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__WORK, oldWork, work));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getCost() {
-		return cost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCost(BigDecimal newCost) {
-		BigDecimal oldCost = cost;
-		cost = newCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__COST, oldCost, cost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWS() {
-		return bCWS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWS(float newBCWS) {
-		float oldBCWS = bCWS;
-		bCWS = newBCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWSESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__BCWS, oldBCWS, bCWS, !oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWS() {
-		float oldBCWS = bCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWS = BCWS_EDEFAULT;
-		bCWSESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE__BCWS, oldBCWS, BCWS_EDEFAULT, oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWS() {
-		return bCWSESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWP() {
-		return bCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWP(float newBCWP) {
-		float oldBCWP = bCWP;
-		bCWP = newBCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.BASELINE__BCWP, oldBCWP, bCWP, !oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWP() {
-		float oldBCWP = bCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWP = BCWP_EDEFAULT;
-		bCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.BASELINE__BCWP, oldBCWP, BCWP_EDEFAULT, oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWP() {
-		return bCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.BASELINE__TIMEPHASED_DATA:
-					return ((InternalEList)getTimephasedData()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE__TIMEPHASED_DATA:
-				return getTimephasedData();
-			case MsprojectPackage.BASELINE__NUMBER:
-				return getNumber();
-			case MsprojectPackage.BASELINE__INTERIM:
-				return isInterim() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.BASELINE__START:
-				return getStart();
-			case MsprojectPackage.BASELINE__FINISH:
-				return getFinish();
-			case MsprojectPackage.BASELINE__DURATION:
-				return getDuration();
-			case MsprojectPackage.BASELINE__DURATION_FORMAT:
-				return getDurationFormat();
-			case MsprojectPackage.BASELINE__ESTIMATED_DURATION:
-				return isEstimatedDuration() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.BASELINE__WORK:
-				return getWork();
-			case MsprojectPackage.BASELINE__COST:
-				return getCost();
-			case MsprojectPackage.BASELINE__BCWS:
-				return new Float(getBCWS());
-			case MsprojectPackage.BASELINE__BCWP:
-				return new Float(getBCWP());
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				getTimephasedData().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.BASELINE__NUMBER:
-				setNumber((BigInteger)newValue);
-				return;
-			case MsprojectPackage.BASELINE__INTERIM:
-				setInterim(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.BASELINE__START:
-				setStart((Object)newValue);
-				return;
-			case MsprojectPackage.BASELINE__FINISH:
-				setFinish((Object)newValue);
-				return;
-			case MsprojectPackage.BASELINE__DURATION:
-				setDuration((Object)newValue);
-				return;
-			case MsprojectPackage.BASELINE__DURATION_FORMAT:
-				setDurationFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.BASELINE__ESTIMATED_DURATION:
-				setEstimatedDuration(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.BASELINE__WORK:
-				setWork((Object)newValue);
-				return;
-			case MsprojectPackage.BASELINE__COST:
-				setCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.BASELINE__BCWS:
-				setBCWS(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.BASELINE__BCWP:
-				setBCWP(((Float)newValue).floatValue());
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				return;
-			case MsprojectPackage.BASELINE__NUMBER:
-				setNumber(NUMBER_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE__INTERIM:
-				unsetInterim();
-				return;
-			case MsprojectPackage.BASELINE__START:
-				setStart(START_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE__FINISH:
-				setFinish(FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE__DURATION:
-				setDuration(DURATION_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE__DURATION_FORMAT:
-				setDurationFormat(DURATION_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE__ESTIMATED_DURATION:
-				unsetEstimatedDuration();
-				return;
-			case MsprojectPackage.BASELINE__WORK:
-				setWork(WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE__COST:
-				setCost(COST_EDEFAULT);
-				return;
-			case MsprojectPackage.BASELINE__BCWS:
-				unsetBCWS();
-				return;
-			case MsprojectPackage.BASELINE__BCWP:
-				unsetBCWP();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.BASELINE__TIMEPHASED_DATA:
-				return timephasedData != null && !timephasedData.isEmpty();
-			case MsprojectPackage.BASELINE__NUMBER:
-				return NUMBER_EDEFAULT == null ? number != null : !NUMBER_EDEFAULT.equals(number);
-			case MsprojectPackage.BASELINE__INTERIM:
-				return isSetInterim();
-			case MsprojectPackage.BASELINE__START:
-				return START_EDEFAULT == null ? start != null : !START_EDEFAULT.equals(start);
-			case MsprojectPackage.BASELINE__FINISH:
-				return FINISH_EDEFAULT == null ? finish != null : !FINISH_EDEFAULT.equals(finish);
-			case MsprojectPackage.BASELINE__DURATION:
-				return DURATION_EDEFAULT == null ? duration != null : !DURATION_EDEFAULT.equals(duration);
-			case MsprojectPackage.BASELINE__DURATION_FORMAT:
-				return DURATION_FORMAT_EDEFAULT == null ? durationFormat != null : !DURATION_FORMAT_EDEFAULT.equals(durationFormat);
-			case MsprojectPackage.BASELINE__ESTIMATED_DURATION:
-				return isSetEstimatedDuration();
-			case MsprojectPackage.BASELINE__WORK:
-				return WORK_EDEFAULT == null ? work != null : !WORK_EDEFAULT.equals(work);
-			case MsprojectPackage.BASELINE__COST:
-				return COST_EDEFAULT == null ? cost != null : !COST_EDEFAULT.equals(cost);
-			case MsprojectPackage.BASELINE__BCWS:
-				return isSetBCWS();
-			case MsprojectPackage.BASELINE__BCWP:
-				return isSetBCWP();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (number: ");
-		result.append(number);
-		result.append(", interim: ");
-		if (interimESet) result.append(interim); else result.append("<unset>");
-		result.append(", start: ");
-		result.append(start);
-		result.append(", finish: ");
-		result.append(finish);
-		result.append(", duration: ");
-		result.append(duration);
-		result.append(", durationFormat: ");
-		result.append(durationFormat);
-		result.append(", estimatedDuration: ");
-		if (estimatedDurationESet) result.append(estimatedDuration); else result.append("<unset>");
-		result.append(", work: ");
-		result.append(work);
-		result.append(", cost: ");
-		result.append(cost);
-		result.append(", bCWS: ");
-		if (bCWSESet) result.append(bCWS); else result.append("<unset>");
-		result.append(", bCWP: ");
-		if (bCWPESet) result.append(bCWP); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //BaselineImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/CalendarImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/CalendarImpl.java
deleted file mode 100644
index 57d08d4..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/CalendarImpl.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CalendarImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.Calendar;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.WeekDays;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Calendar</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.CalendarImpl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.CalendarImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.CalendarImpl#isIsBaseCalendar <em>Is Base Calendar</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.CalendarImpl#getBaseCalendarUID <em>Base Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.CalendarImpl#getWeekDays <em>Week Days</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class CalendarImpl extends EObjectImpl implements Calendar {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isIsBaseCalendar() <em>Is Base Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsBaseCalendar()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_BASE_CALENDAR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsBaseCalendar() <em>Is Base Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsBaseCalendar()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isBaseCalendar = IS_BASE_CALENDAR_EDEFAULT;
-
-	/**
-	 * This is true if the Is Base Calendar attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isBaseCalendarESet = false;
-
-	/**
-	 * The default value of the '{@link #getBaseCalendarUID() <em>Base Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaseCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger BASE_CALENDAR_UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBaseCalendarUID() <em>Base Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaseCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger baseCalendarUID = BASE_CALENDAR_UID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getWeekDays() <em>Week Days</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeekDays()
-	 * @generated
-	 * @ordered
-	 */
-	protected WeekDays weekDays = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CalendarImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getCalendar();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.CALENDAR__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.CALENDAR__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsBaseCalendar() {
-		return isBaseCalendar;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsBaseCalendar(boolean newIsBaseCalendar) {
-		boolean oldIsBaseCalendar = isBaseCalendar;
-		isBaseCalendar = newIsBaseCalendar;
-		boolean oldIsBaseCalendarESet = isBaseCalendarESet;
-		isBaseCalendarESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.CALENDAR__IS_BASE_CALENDAR, oldIsBaseCalendar, isBaseCalendar, !oldIsBaseCalendarESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsBaseCalendar() {
-		boolean oldIsBaseCalendar = isBaseCalendar;
-		boolean oldIsBaseCalendarESet = isBaseCalendarESet;
-		isBaseCalendar = IS_BASE_CALENDAR_EDEFAULT;
-		isBaseCalendarESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.CALENDAR__IS_BASE_CALENDAR, oldIsBaseCalendar, IS_BASE_CALENDAR_EDEFAULT, oldIsBaseCalendarESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsBaseCalendar() {
-		return isBaseCalendarESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getBaseCalendarUID() {
-		return baseCalendarUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBaseCalendarUID(BigInteger newBaseCalendarUID) {
-		BigInteger oldBaseCalendarUID = baseCalendarUID;
-		baseCalendarUID = newBaseCalendarUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.CALENDAR__BASE_CALENDAR_UID, oldBaseCalendarUID, baseCalendarUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WeekDays getWeekDays() {
-		return weekDays;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetWeekDays(WeekDays newWeekDays, NotificationChain msgs) {
-		WeekDays oldWeekDays = weekDays;
-		weekDays = newWeekDays;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.CALENDAR__WEEK_DAYS, oldWeekDays, newWeekDays);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWeekDays(WeekDays newWeekDays) {
-		if (newWeekDays != weekDays) {
-			NotificationChain msgs = null;
-			if (weekDays != null)
-				msgs = ((InternalEObject)weekDays).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.CALENDAR__WEEK_DAYS, null, msgs);
-			if (newWeekDays != null)
-				msgs = ((InternalEObject)newWeekDays).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.CALENDAR__WEEK_DAYS, null, msgs);
-			msgs = basicSetWeekDays(newWeekDays, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.CALENDAR__WEEK_DAYS, newWeekDays, newWeekDays));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.CALENDAR__WEEK_DAYS:
-					return basicSetWeekDays(null, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDAR__UID:
-				return getUID();
-			case MsprojectPackage.CALENDAR__NAME:
-				return getName();
-			case MsprojectPackage.CALENDAR__IS_BASE_CALENDAR:
-				return isIsBaseCalendar() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.CALENDAR__BASE_CALENDAR_UID:
-				return getBaseCalendarUID();
-			case MsprojectPackage.CALENDAR__WEEK_DAYS:
-				return getWeekDays();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDAR__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.CALENDAR__NAME:
-				setName((String)newValue);
-				return;
-			case MsprojectPackage.CALENDAR__IS_BASE_CALENDAR:
-				setIsBaseCalendar(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.CALENDAR__BASE_CALENDAR_UID:
-				setBaseCalendarUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.CALENDAR__WEEK_DAYS:
-				setWeekDays((WeekDays)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDAR__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.CALENDAR__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.CALENDAR__IS_BASE_CALENDAR:
-				unsetIsBaseCalendar();
-				return;
-			case MsprojectPackage.CALENDAR__BASE_CALENDAR_UID:
-				setBaseCalendarUID(BASE_CALENDAR_UID_EDEFAULT);
-				return;
-			case MsprojectPackage.CALENDAR__WEEK_DAYS:
-				setWeekDays((WeekDays)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDAR__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.CALENDAR__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case MsprojectPackage.CALENDAR__IS_BASE_CALENDAR:
-				return isSetIsBaseCalendar();
-			case MsprojectPackage.CALENDAR__BASE_CALENDAR_UID:
-				return BASE_CALENDAR_UID_EDEFAULT == null ? baseCalendarUID != null : !BASE_CALENDAR_UID_EDEFAULT.equals(baseCalendarUID);
-			case MsprojectPackage.CALENDAR__WEEK_DAYS:
-				return weekDays != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", name: ");
-		result.append(name);
-		result.append(", isBaseCalendar: ");
-		if (isBaseCalendarESet) result.append(isBaseCalendar); else result.append("<unset>");
-		result.append(", baseCalendarUID: ");
-		result.append(baseCalendarUID);
-		result.append(')');
-		return result.toString();
-	}
-
-} //CalendarImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/CalendarsImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/CalendarsImpl.java
deleted file mode 100644
index acf5ee4..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/CalendarsImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CalendarsImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.Calendar;
-import org.eclipse.epf.msproject.Calendars;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Calendars</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.CalendarsImpl#getCalendar <em>Calendar</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class CalendarsImpl extends EObjectImpl implements Calendars {
-	/**
-	 * The cached value of the '{@link #getCalendar() <em>Calendar</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendar()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList calendar = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CalendarsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getCalendars();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getCalendar() {
-		if (calendar == null) {
-			calendar = new EObjectContainmentEList(Calendar.class, this, MsprojectPackage.CALENDARS__CALENDAR);
-		}
-		return calendar;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.CALENDARS__CALENDAR:
-					return ((InternalEList)getCalendar()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDARS__CALENDAR:
-				return getCalendar();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDARS__CALENDAR:
-				getCalendar().clear();
-				getCalendar().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDARS__CALENDAR:
-				getCalendar().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.CALENDARS__CALENDAR:
-				return calendar != null && !calendar.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //CalendarsImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/DocumentRootImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/DocumentRootImpl.java
deleted file mode 100644
index 171301e..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/DocumentRootImpl.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DocumentRootImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EcoreEMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.msproject.DocumentRoot;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Project;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.DocumentRootImpl#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.DocumentRootImpl#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.DocumentRootImpl#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.DocumentRootImpl#getProject <em>Project</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DocumentRootImpl extends EObjectImpl implements DocumentRoot {
-	/**
-	 * The cached value of the '{@link #getMixed() <em>Mixed</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMixed()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap mixed = null;
-
-	/**
-	 * The cached value of the '{@link #getXMLNSPrefixMap() <em>XMLNS Prefix Map</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXMLNSPrefixMap()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xMLNSPrefixMap = null;
-
-	/**
-	 * The cached value of the '{@link #getXSISchemaLocation() <em>XSI Schema Location</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXSISchemaLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xSISchemaLocation = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DocumentRootImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getDocumentRoot();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getMixed() {
-		if (mixed == null) {
-			mixed = new BasicFeatureMap(this, MsprojectPackage.DOCUMENT_ROOT__MIXED);
-		}
-		return mixed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXMLNSPrefixMap() {
-		if (xMLNSPrefixMap == null) {
-			xMLNSPrefixMap = new EcoreEMap(EcorePackage.eINSTANCE.getEStringToStringMapEntry(), EStringToStringMapEntryImpl.class, this, MsprojectPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-		}
-		return xMLNSPrefixMap;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXSISchemaLocation() {
-		if (xSISchemaLocation == null) {
-			xSISchemaLocation = new EcoreEMap(EcorePackage.eINSTANCE.getEStringToStringMapEntry(), EStringToStringMapEntryImpl.class, this, MsprojectPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-		}
-		return xSISchemaLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Project getProject() {
-		return (Project)getMixed().get(MsprojectPackage.eINSTANCE.getDocumentRoot_Project(), true);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetProject(Project newProject, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(MsprojectPackage.eINSTANCE.getDocumentRoot_Project(), newProject, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProject(Project newProject) {
-		((FeatureMap.Internal)getMixed()).set(MsprojectPackage.eINSTANCE.getDocumentRoot_Project(), newProject);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.DOCUMENT_ROOT__MIXED:
-					return ((InternalEList)getMixed()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-					return ((InternalEList)getXMLNSPrefixMap()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-					return ((InternalEList)getXSISchemaLocation()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.DOCUMENT_ROOT__PROJECT:
-					return basicSetProject(null, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.DOCUMENT_ROOT__MIXED:
-				return getMixed();
-			case MsprojectPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return getXMLNSPrefixMap();
-			case MsprojectPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return getXSISchemaLocation();
-			case MsprojectPackage.DOCUMENT_ROOT__PROJECT:
-				return getProject();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.DOCUMENT_ROOT__MIXED:
-				getMixed().clear();
-				getMixed().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				getXMLNSPrefixMap().clear();
-				getXMLNSPrefixMap().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				getXSISchemaLocation().clear();
-				getXSISchemaLocation().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.DOCUMENT_ROOT__PROJECT:
-				setProject((Project)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.DOCUMENT_ROOT__MIXED:
-				getMixed().clear();
-				return;
-			case MsprojectPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				getXMLNSPrefixMap().clear();
-				return;
-			case MsprojectPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				getXSISchemaLocation().clear();
-				return;
-			case MsprojectPackage.DOCUMENT_ROOT__PROJECT:
-				setProject((Project)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.DOCUMENT_ROOT__MIXED:
-				return mixed != null && !mixed.isEmpty();
-			case MsprojectPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return xMLNSPrefixMap != null && !xMLNSPrefixMap.isEmpty();
-			case MsprojectPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return xSISchemaLocation != null && !xSISchemaLocation.isEmpty();
-			case MsprojectPackage.DOCUMENT_ROOT__PROJECT:
-				return getProject() != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (mixed: ");
-		result.append(mixed);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DocumentRootImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute2Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute2Impl.java
deleted file mode 100644
index 0e14e43..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute2Impl.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttribute2Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.ExtendedAttribute2;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extended Attribute2</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute2Impl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute2Impl#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute2Impl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute2Impl#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute2Impl#getDurationFormat <em>Duration Format</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExtendedAttribute2Impl extends EObjectImpl implements ExtendedAttribute2 {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldID = FIELD_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger VALUE_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger valueID = VALUE_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DURATION_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger durationFormat = DURATION_FORMAT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExtendedAttribute2Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getExtendedAttribute2();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE2__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldID() {
-		return fieldID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldID(String newFieldID) {
-		String oldFieldID = fieldID;
-		fieldID = newFieldID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE2__FIELD_ID, oldFieldID, fieldID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getValueID() {
-		return valueID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueID(BigInteger newValueID) {
-		BigInteger oldValueID = valueID;
-		valueID = newValueID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE_ID, oldValueID, valueID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDurationFormat() {
-		return durationFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDurationFormat(BigInteger newDurationFormat) {
-		BigInteger oldDurationFormat = durationFormat;
-		durationFormat = newDurationFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE2__DURATION_FORMAT, oldDurationFormat, durationFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__UID:
-				return getUID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__FIELD_ID:
-				return getFieldID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE:
-				return getValue();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE_ID:
-				return getValueID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__DURATION_FORMAT:
-				return getDurationFormat();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__FIELD_ID:
-				setFieldID((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE:
-				setValue((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE_ID:
-				setValueID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__DURATION_FORMAT:
-				setDurationFormat((BigInteger)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__FIELD_ID:
-				setFieldID(FIELD_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE_ID:
-				setValueID(VALUE_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__DURATION_FORMAT:
-				setDurationFormat(DURATION_FORMAT_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__FIELD_ID:
-				return FIELD_ID_EDEFAULT == null ? fieldID != null : !FIELD_ID_EDEFAULT.equals(fieldID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__VALUE_ID:
-				return VALUE_ID_EDEFAULT == null ? valueID != null : !VALUE_ID_EDEFAULT.equals(valueID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2__DURATION_FORMAT:
-				return DURATION_FORMAT_EDEFAULT == null ? durationFormat != null : !DURATION_FORMAT_EDEFAULT.equals(durationFormat);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", fieldID: ");
-		result.append(fieldID);
-		result.append(", value: ");
-		result.append(value);
-		result.append(", valueID: ");
-		result.append(valueID);
-		result.append(", durationFormat: ");
-		result.append(durationFormat);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExtendedAttribute2Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute3Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute3Impl.java
deleted file mode 100644
index 0ea6a95..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute3Impl.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttribute3Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.ExtendedAttribute3;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extended Attribute3</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute3Impl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute3Impl#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute3Impl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute3Impl#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute3Impl#getDurationFormat <em>Duration Format</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExtendedAttribute3Impl extends EObjectImpl implements ExtendedAttribute3 {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldID = FIELD_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger VALUE_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger valueID = VALUE_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DURATION_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger durationFormat = DURATION_FORMAT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExtendedAttribute3Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getExtendedAttribute3();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE3__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldID() {
-		return fieldID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldID(String newFieldID) {
-		String oldFieldID = fieldID;
-		fieldID = newFieldID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE3__FIELD_ID, oldFieldID, fieldID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getValueID() {
-		return valueID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueID(BigInteger newValueID) {
-		BigInteger oldValueID = valueID;
-		valueID = newValueID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE_ID, oldValueID, valueID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDurationFormat() {
-		return durationFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDurationFormat(BigInteger newDurationFormat) {
-		BigInteger oldDurationFormat = durationFormat;
-		durationFormat = newDurationFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE3__DURATION_FORMAT, oldDurationFormat, durationFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__UID:
-				return getUID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__FIELD_ID:
-				return getFieldID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE:
-				return getValue();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE_ID:
-				return getValueID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__DURATION_FORMAT:
-				return getDurationFormat();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__FIELD_ID:
-				setFieldID((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE:
-				setValue((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE_ID:
-				setValueID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__DURATION_FORMAT:
-				setDurationFormat((BigInteger)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__FIELD_ID:
-				setFieldID(FIELD_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE_ID:
-				setValueID(VALUE_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__DURATION_FORMAT:
-				setDurationFormat(DURATION_FORMAT_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__FIELD_ID:
-				return FIELD_ID_EDEFAULT == null ? fieldID != null : !FIELD_ID_EDEFAULT.equals(fieldID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__VALUE_ID:
-				return VALUE_ID_EDEFAULT == null ? valueID != null : !VALUE_ID_EDEFAULT.equals(valueID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3__DURATION_FORMAT:
-				return DURATION_FORMAT_EDEFAULT == null ? durationFormat != null : !DURATION_FORMAT_EDEFAULT.equals(durationFormat);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", fieldID: ");
-		result.append(fieldID);
-		result.append(", value: ");
-		result.append(value);
-		result.append(", valueID: ");
-		result.append(valueID);
-		result.append(", durationFormat: ");
-		result.append(durationFormat);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExtendedAttribute3Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute4Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute4Impl.java
deleted file mode 100644
index 5f48b7e..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttribute4Impl.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttribute4Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.ExtendedAttribute4;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extended Attribute4</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute4Impl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute4Impl#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute4Impl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute4Impl#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttribute4Impl#getDurationFormat <em>Duration Format</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExtendedAttribute4Impl extends EObjectImpl implements ExtendedAttribute4 {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldID = FIELD_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger VALUE_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger valueID = VALUE_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DURATION_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger durationFormat = DURATION_FORMAT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExtendedAttribute4Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getExtendedAttribute4();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE4__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldID() {
-		return fieldID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldID(String newFieldID) {
-		String oldFieldID = fieldID;
-		fieldID = newFieldID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE4__FIELD_ID, oldFieldID, fieldID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getValueID() {
-		return valueID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueID(BigInteger newValueID) {
-		BigInteger oldValueID = valueID;
-		valueID = newValueID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE_ID, oldValueID, valueID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDurationFormat() {
-		return durationFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDurationFormat(BigInteger newDurationFormat) {
-		BigInteger oldDurationFormat = durationFormat;
-		durationFormat = newDurationFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE4__DURATION_FORMAT, oldDurationFormat, durationFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__UID:
-				return getUID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__FIELD_ID:
-				return getFieldID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE:
-				return getValue();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE_ID:
-				return getValueID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__DURATION_FORMAT:
-				return getDurationFormat();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__FIELD_ID:
-				setFieldID((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE:
-				setValue((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE_ID:
-				setValueID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__DURATION_FORMAT:
-				setDurationFormat((BigInteger)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__FIELD_ID:
-				setFieldID(FIELD_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE_ID:
-				setValueID(VALUE_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__DURATION_FORMAT:
-				setDurationFormat(DURATION_FORMAT_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__FIELD_ID:
-				return FIELD_ID_EDEFAULT == null ? fieldID != null : !FIELD_ID_EDEFAULT.equals(fieldID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__VALUE_ID:
-				return VALUE_ID_EDEFAULT == null ? valueID != null : !VALUE_ID_EDEFAULT.equals(valueID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4__DURATION_FORMAT:
-				return DURATION_FORMAT_EDEFAULT == null ? durationFormat != null : !DURATION_FORMAT_EDEFAULT.equals(durationFormat);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", fieldID: ");
-		result.append(fieldID);
-		result.append(", value: ");
-		result.append(value);
-		result.append(", valueID: ");
-		result.append(valueID);
-		result.append(", durationFormat: ");
-		result.append(durationFormat);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExtendedAttribute4Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttributeImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttributeImpl.java
deleted file mode 100644
index 99f0dc2..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttributeImpl.java
+++ /dev/null
@@ -1,853 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttributeImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.ExtendedAttribute;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.ValueList;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extended Attribute</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getFieldName <em>Field Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getAlias <em>Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getPhoneticAlias <em>Phonetic Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getRollupType <em>Rollup Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getCalculationType <em>Calculation Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getFormula <em>Formula</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#isRestrictValues <em>Restrict Values</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getValuelistSortOrder <em>Valuelist Sort Order</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#isAppendNewValues <em>Append New Values</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getDefault <em>Default</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributeImpl#getValueList <em>Value List</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExtendedAttributeImpl extends EObjectImpl implements ExtendedAttribute {
-	/**
-	 * The default value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldID = FIELD_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFieldName() <em>Field Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldName() <em>Field Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldName = FIELD_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAlias() <em>Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ALIAS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAlias() <em>Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected String alias = ALIAS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPhoneticAlias() <em>Phonetic Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhoneticAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PHONETIC_ALIAS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPhoneticAlias() <em>Phonetic Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhoneticAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected String phoneticAlias = PHONETIC_ALIAS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRollupType() <em>Rollup Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRollupType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger ROLLUP_TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRollupType() <em>Rollup Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRollupType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger rollupType = ROLLUP_TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCalculationType() <em>Calculation Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalculationType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CALCULATION_TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCalculationType() <em>Calculation Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalculationType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger calculationType = CALCULATION_TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFormula() <em>Formula</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFormula()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FORMULA_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFormula() <em>Formula</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFormula()
-	 * @generated
-	 * @ordered
-	 */
-	protected String formula = FORMULA_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isRestrictValues() <em>Restrict Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRestrictValues()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESTRICT_VALUES_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isRestrictValues() <em>Restrict Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRestrictValues()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean restrictValues = RESTRICT_VALUES_EDEFAULT;
-
-	/**
-	 * This is true if the Restrict Values attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean restrictValuesESet = false;
-
-	/**
-	 * The default value of the '{@link #getValuelistSortOrder() <em>Valuelist Sort Order</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValuelistSortOrder()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger VALUELIST_SORT_ORDER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValuelistSortOrder() <em>Valuelist Sort Order</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValuelistSortOrder()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger valuelistSortOrder = VALUELIST_SORT_ORDER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isAppendNewValues() <em>Append New Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAppendNewValues()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean APPEND_NEW_VALUES_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isAppendNewValues() <em>Append New Values</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAppendNewValues()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean appendNewValues = APPEND_NEW_VALUES_EDEFAULT;
-
-	/**
-	 * This is true if the Append New Values attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean appendNewValuesESet = false;
-
-	/**
-	 * The default value of the '{@link #getDefault() <em>Default</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefault()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DEFAULT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDefault() <em>Default</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefault()
-	 * @generated
-	 * @ordered
-	 */
-	protected String default_ = DEFAULT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getValueList() <em>Value List</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueList()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueList valueList = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExtendedAttributeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getExtendedAttribute();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldID() {
-		return fieldID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldID(String newFieldID) {
-		String oldFieldID = fieldID;
-		fieldID = newFieldID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_ID, oldFieldID, fieldID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldName() {
-		return fieldName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldName(String newFieldName) {
-		String oldFieldName = fieldName;
-		fieldName = newFieldName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_NAME, oldFieldName, fieldName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAlias() {
-		return alias;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAlias(String newAlias) {
-		String oldAlias = alias;
-		alias = newAlias;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__ALIAS, oldAlias, alias));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPhoneticAlias() {
-		return phoneticAlias;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPhoneticAlias(String newPhoneticAlias) {
-		String oldPhoneticAlias = phoneticAlias;
-		phoneticAlias = newPhoneticAlias;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__PHONETIC_ALIAS, oldPhoneticAlias, phoneticAlias));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getRollupType() {
-		return rollupType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRollupType(BigInteger newRollupType) {
-		BigInteger oldRollupType = rollupType;
-		rollupType = newRollupType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__ROLLUP_TYPE, oldRollupType, rollupType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCalculationType() {
-		return calculationType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCalculationType(BigInteger newCalculationType) {
-		BigInteger oldCalculationType = calculationType;
-		calculationType = newCalculationType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__CALCULATION_TYPE, oldCalculationType, calculationType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFormula() {
-		return formula;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFormula(String newFormula) {
-		String oldFormula = formula;
-		formula = newFormula;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__FORMULA, oldFormula, formula));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isRestrictValues() {
-		return restrictValues;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRestrictValues(boolean newRestrictValues) {
-		boolean oldRestrictValues = restrictValues;
-		restrictValues = newRestrictValues;
-		boolean oldRestrictValuesESet = restrictValuesESet;
-		restrictValuesESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__RESTRICT_VALUES, oldRestrictValues, restrictValues, !oldRestrictValuesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetRestrictValues() {
-		boolean oldRestrictValues = restrictValues;
-		boolean oldRestrictValuesESet = restrictValuesESet;
-		restrictValues = RESTRICT_VALUES_EDEFAULT;
-		restrictValuesESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.EXTENDED_ATTRIBUTE__RESTRICT_VALUES, oldRestrictValues, RESTRICT_VALUES_EDEFAULT, oldRestrictValuesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetRestrictValues() {
-		return restrictValuesESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getValuelistSortOrder() {
-		return valuelistSortOrder;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValuelistSortOrder(BigInteger newValuelistSortOrder) {
-		BigInteger oldValuelistSortOrder = valuelistSortOrder;
-		valuelistSortOrder = newValuelistSortOrder;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__VALUELIST_SORT_ORDER, oldValuelistSortOrder, valuelistSortOrder));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isAppendNewValues() {
-		return appendNewValues;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAppendNewValues(boolean newAppendNewValues) {
-		boolean oldAppendNewValues = appendNewValues;
-		appendNewValues = newAppendNewValues;
-		boolean oldAppendNewValuesESet = appendNewValuesESet;
-		appendNewValuesESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__APPEND_NEW_VALUES, oldAppendNewValues, appendNewValues, !oldAppendNewValuesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetAppendNewValues() {
-		boolean oldAppendNewValues = appendNewValues;
-		boolean oldAppendNewValuesESet = appendNewValuesESet;
-		appendNewValues = APPEND_NEW_VALUES_EDEFAULT;
-		appendNewValuesESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.EXTENDED_ATTRIBUTE__APPEND_NEW_VALUES, oldAppendNewValues, APPEND_NEW_VALUES_EDEFAULT, oldAppendNewValuesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetAppendNewValues() {
-		return appendNewValuesESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDefault() {
-		return default_;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefault(String newDefault) {
-		String oldDefault = default_;
-		default_ = newDefault;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__DEFAULT, oldDefault, default_));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueList getValueList() {
-		return valueList;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValueList(ValueList newValueList, NotificationChain msgs) {
-		ValueList oldValueList = valueList;
-		valueList = newValueList;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST, oldValueList, newValueList);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueList(ValueList newValueList) {
-		if (newValueList != valueList) {
-			NotificationChain msgs = null;
-			if (valueList != null)
-				msgs = ((InternalEObject)valueList).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST, null, msgs);
-			if (newValueList != null)
-				msgs = ((InternalEObject)newValueList).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST, null, msgs);
-			msgs = basicSetValueList(newValueList, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST, newValueList, newValueList));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST:
-					return basicSetValueList(null, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_ID:
-				return getFieldID();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_NAME:
-				return getFieldName();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ALIAS:
-				return getAlias();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__PHONETIC_ALIAS:
-				return getPhoneticAlias();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ROLLUP_TYPE:
-				return getRollupType();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__CALCULATION_TYPE:
-				return getCalculationType();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FORMULA:
-				return getFormula();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__RESTRICT_VALUES:
-				return isRestrictValues() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUELIST_SORT_ORDER:
-				return getValuelistSortOrder();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__APPEND_NEW_VALUES:
-				return isAppendNewValues() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__DEFAULT:
-				return getDefault();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST:
-				return getValueList();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_ID:
-				setFieldID((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_NAME:
-				setFieldName((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ALIAS:
-				setAlias((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__PHONETIC_ALIAS:
-				setPhoneticAlias((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ROLLUP_TYPE:
-				setRollupType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__CALCULATION_TYPE:
-				setCalculationType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FORMULA:
-				setFormula((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__RESTRICT_VALUES:
-				setRestrictValues(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUELIST_SORT_ORDER:
-				setValuelistSortOrder((BigInteger)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__APPEND_NEW_VALUES:
-				setAppendNewValues(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__DEFAULT:
-				setDefault((String)newValue);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST:
-				setValueList((ValueList)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_ID:
-				setFieldID(FIELD_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_NAME:
-				setFieldName(FIELD_NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ALIAS:
-				setAlias(ALIAS_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__PHONETIC_ALIAS:
-				setPhoneticAlias(PHONETIC_ALIAS_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ROLLUP_TYPE:
-				setRollupType(ROLLUP_TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__CALCULATION_TYPE:
-				setCalculationType(CALCULATION_TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FORMULA:
-				setFormula(FORMULA_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__RESTRICT_VALUES:
-				unsetRestrictValues();
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUELIST_SORT_ORDER:
-				setValuelistSortOrder(VALUELIST_SORT_ORDER_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__APPEND_NEW_VALUES:
-				unsetAppendNewValues();
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__DEFAULT:
-				setDefault(DEFAULT_EDEFAULT);
-				return;
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST:
-				setValueList((ValueList)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_ID:
-				return FIELD_ID_EDEFAULT == null ? fieldID != null : !FIELD_ID_EDEFAULT.equals(fieldID);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FIELD_NAME:
-				return FIELD_NAME_EDEFAULT == null ? fieldName != null : !FIELD_NAME_EDEFAULT.equals(fieldName);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ALIAS:
-				return ALIAS_EDEFAULT == null ? alias != null : !ALIAS_EDEFAULT.equals(alias);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__PHONETIC_ALIAS:
-				return PHONETIC_ALIAS_EDEFAULT == null ? phoneticAlias != null : !PHONETIC_ALIAS_EDEFAULT.equals(phoneticAlias);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__ROLLUP_TYPE:
-				return ROLLUP_TYPE_EDEFAULT == null ? rollupType != null : !ROLLUP_TYPE_EDEFAULT.equals(rollupType);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__CALCULATION_TYPE:
-				return CALCULATION_TYPE_EDEFAULT == null ? calculationType != null : !CALCULATION_TYPE_EDEFAULT.equals(calculationType);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__FORMULA:
-				return FORMULA_EDEFAULT == null ? formula != null : !FORMULA_EDEFAULT.equals(formula);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__RESTRICT_VALUES:
-				return isSetRestrictValues();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUELIST_SORT_ORDER:
-				return VALUELIST_SORT_ORDER_EDEFAULT == null ? valuelistSortOrder != null : !VALUELIST_SORT_ORDER_EDEFAULT.equals(valuelistSortOrder);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__APPEND_NEW_VALUES:
-				return isSetAppendNewValues();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__DEFAULT:
-				return DEFAULT_EDEFAULT == null ? default_ != null : !DEFAULT_EDEFAULT.equals(default_);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE__VALUE_LIST:
-				return valueList != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (fieldID: ");
-		result.append(fieldID);
-		result.append(", fieldName: ");
-		result.append(fieldName);
-		result.append(", alias: ");
-		result.append(alias);
-		result.append(", phoneticAlias: ");
-		result.append(phoneticAlias);
-		result.append(", rollupType: ");
-		result.append(rollupType);
-		result.append(", calculationType: ");
-		result.append(calculationType);
-		result.append(", formula: ");
-		result.append(formula);
-		result.append(", restrictValues: ");
-		if (restrictValuesESet) result.append(restrictValues); else result.append("<unset>");
-		result.append(", valuelistSortOrder: ");
-		result.append(valuelistSortOrder);
-		result.append(", appendNewValues: ");
-		if (appendNewValuesESet) result.append(appendNewValues); else result.append("<unset>");
-		result.append(", default: ");
-		result.append(default_);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExtendedAttributeImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttributesImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttributesImpl.java
deleted file mode 100644
index 72de09b..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ExtendedAttributesImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExtendedAttributesImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.ExtendedAttribute;
-import org.eclipse.epf.msproject.ExtendedAttributes;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extended Attributes</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ExtendedAttributesImpl#getExtendedAttribute <em>Extended Attribute</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExtendedAttributesImpl extends EObjectImpl implements ExtendedAttributes {
-	/**
-	 * The cached value of the '{@link #getExtendedAttribute() <em>Extended Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList extendedAttribute = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExtendedAttributesImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getExtendedAttributes();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExtendedAttribute() {
-		if (extendedAttribute == null) {
-			extendedAttribute = new EObjectContainmentEList(ExtendedAttribute.class, this, MsprojectPackage.EXTENDED_ATTRIBUTES__EXTENDED_ATTRIBUTE);
-		}
-		return extendedAttribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.EXTENDED_ATTRIBUTES__EXTENDED_ATTRIBUTE:
-					return ((InternalEList)getExtendedAttribute()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTES__EXTENDED_ATTRIBUTE:
-				return getExtendedAttribute();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTES__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				getExtendedAttribute().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTES__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.EXTENDED_ATTRIBUTES__EXTENDED_ATTRIBUTE:
-				return extendedAttribute != null && !extendedAttribute.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //ExtendedAttributesImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MaskImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MaskImpl.java
deleted file mode 100644
index 8633635..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MaskImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MaskImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.Mask;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Mask</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.MaskImpl#getLevel <em>Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.MaskImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.MaskImpl#getLength <em>Length</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.MaskImpl#getSeparator <em>Separator</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MaskImpl extends EObjectImpl implements Mask {
-	/**
-	 * The default value of the '{@link #getLevel() <em>Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LEVEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLevel() <em>Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger level = LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger type = TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLength() <em>Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLength()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LENGTH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLength()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger length = LENGTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSeparator() <em>Separator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSeparator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SEPARATOR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSeparator() <em>Separator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSeparator()
-	 * @generated
-	 * @ordered
-	 */
-	protected String separator = SEPARATOR_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MaskImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getMask();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLevel() {
-		return level;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevel(BigInteger newLevel) {
-		BigInteger oldLevel = level;
-		level = newLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.MASK__LEVEL, oldLevel, level));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(BigInteger newType) {
-		BigInteger oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.MASK__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLength() {
-		return length;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLength(BigInteger newLength) {
-		BigInteger oldLength = length;
-		length = newLength;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.MASK__LENGTH, oldLength, length));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSeparator() {
-		return separator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSeparator(String newSeparator) {
-		String oldSeparator = separator;
-		separator = newSeparator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.MASK__SEPARATOR, oldSeparator, separator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASK__LEVEL:
-				return getLevel();
-			case MsprojectPackage.MASK__TYPE:
-				return getType();
-			case MsprojectPackage.MASK__LENGTH:
-				return getLength();
-			case MsprojectPackage.MASK__SEPARATOR:
-				return getSeparator();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASK__LEVEL:
-				setLevel((BigInteger)newValue);
-				return;
-			case MsprojectPackage.MASK__TYPE:
-				setType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.MASK__LENGTH:
-				setLength((BigInteger)newValue);
-				return;
-			case MsprojectPackage.MASK__SEPARATOR:
-				setSeparator((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASK__LEVEL:
-				setLevel(LEVEL_EDEFAULT);
-				return;
-			case MsprojectPackage.MASK__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.MASK__LENGTH:
-				setLength(LENGTH_EDEFAULT);
-				return;
-			case MsprojectPackage.MASK__SEPARATOR:
-				setSeparator(SEPARATOR_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASK__LEVEL:
-				return LEVEL_EDEFAULT == null ? level != null : !LEVEL_EDEFAULT.equals(level);
-			case MsprojectPackage.MASK__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MsprojectPackage.MASK__LENGTH:
-				return LENGTH_EDEFAULT == null ? length != null : !LENGTH_EDEFAULT.equals(length);
-			case MsprojectPackage.MASK__SEPARATOR:
-				return SEPARATOR_EDEFAULT == null ? separator != null : !SEPARATOR_EDEFAULT.equals(separator);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (level: ");
-		result.append(level);
-		result.append(", type: ");
-		result.append(type);
-		result.append(", length: ");
-		result.append(length);
-		result.append(", separator: ");
-		result.append(separator);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MaskImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MasksImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MasksImpl.java
deleted file mode 100644
index c7a7ef8..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MasksImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MasksImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.Mask;
-import org.eclipse.epf.msproject.Masks;
-import org.eclipse.epf.msproject.MsprojectPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Masks</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.MasksImpl#getMask <em>Mask</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MasksImpl extends EObjectImpl implements Masks {
-	/**
-	 * The cached value of the '{@link #getMask() <em>Mask</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMask()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList mask = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MasksImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getMasks();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMask() {
-		if (mask == null) {
-			mask = new EObjectContainmentEList(Mask.class, this, MsprojectPackage.MASKS__MASK);
-		}
-		return mask;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.MASKS__MASK:
-					return ((InternalEList)getMask()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASKS__MASK:
-				return getMask();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASKS__MASK:
-				getMask().clear();
-				getMask().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASKS__MASK:
-				getMask().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.MASKS__MASK:
-				return mask != null && !mask.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //MasksImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MsprojectFactoryImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MsprojectFactoryImpl.java
deleted file mode 100644
index d102cfe..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MsprojectFactoryImpl.java
+++ /dev/null
@@ -1,2344 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectFactoryImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.epf.msproject.Assignment;
-import org.eclipse.epf.msproject.Assignments;
-import org.eclipse.epf.msproject.AvailabilityPeriod;
-import org.eclipse.epf.msproject.AvailabilityPeriods;
-import org.eclipse.epf.msproject.Baseline;
-import org.eclipse.epf.msproject.Baseline2;
-import org.eclipse.epf.msproject.Baseline3;
-import org.eclipse.epf.msproject.Calendar;
-import org.eclipse.epf.msproject.Calendars;
-import org.eclipse.epf.msproject.DocumentRoot;
-import org.eclipse.epf.msproject.ExtendedAttribute;
-import org.eclipse.epf.msproject.ExtendedAttribute2;
-import org.eclipse.epf.msproject.ExtendedAttribute3;
-import org.eclipse.epf.msproject.ExtendedAttribute4;
-import org.eclipse.epf.msproject.ExtendedAttributes;
-import org.eclipse.epf.msproject.Mask;
-import org.eclipse.epf.msproject.Masks;
-import org.eclipse.epf.msproject.MsprojectFactory;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode;
-import org.eclipse.epf.msproject.OutlineCode2;
-import org.eclipse.epf.msproject.OutlineCode3;
-import org.eclipse.epf.msproject.OutlineCodes;
-import org.eclipse.epf.msproject.PredecessorLink;
-import org.eclipse.epf.msproject.Project;
-import org.eclipse.epf.msproject.Rate;
-import org.eclipse.epf.msproject.Rates;
-import org.eclipse.epf.msproject.Resource;
-import org.eclipse.epf.msproject.Resources;
-import org.eclipse.epf.msproject.Task;
-import org.eclipse.epf.msproject.Tasks;
-import org.eclipse.epf.msproject.TimePeriod;
-import org.eclipse.epf.msproject.TimephasedDataType;
-import org.eclipse.epf.msproject.Value;
-import org.eclipse.epf.msproject.Value2;
-import org.eclipse.epf.msproject.ValueList;
-import org.eclipse.epf.msproject.Values;
-import org.eclipse.epf.msproject.WBSMask;
-import org.eclipse.epf.msproject.WBSMasks;
-import org.eclipse.epf.msproject.WeekDay;
-import org.eclipse.epf.msproject.WeekDays;
-import org.eclipse.epf.msproject.WorkingTime;
-import org.eclipse.epf.msproject.WorkingTimes;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class MsprojectFactoryImpl extends EFactoryImpl implements MsprojectFactory {
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MsprojectFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case MsprojectPackage.ASSIGNMENT: return createAssignment();
-			case MsprojectPackage.ASSIGNMENTS: return createAssignments();
-			case MsprojectPackage.AVAILABILITY_PERIOD: return createAvailabilityPeriod();
-			case MsprojectPackage.AVAILABILITY_PERIODS: return createAvailabilityPeriods();
-			case MsprojectPackage.BASELINE: return createBaseline();
-			case MsprojectPackage.BASELINE2: return createBaseline2();
-			case MsprojectPackage.BASELINE3: return createBaseline3();
-			case MsprojectPackage.CALENDAR: return createCalendar();
-			case MsprojectPackage.CALENDARS: return createCalendars();
-			case MsprojectPackage.DOCUMENT_ROOT: return createDocumentRoot();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE: return createExtendedAttribute();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2: return createExtendedAttribute2();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3: return createExtendedAttribute3();
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4: return createExtendedAttribute4();
-			case MsprojectPackage.EXTENDED_ATTRIBUTES: return createExtendedAttributes();
-			case MsprojectPackage.MASK: return createMask();
-			case MsprojectPackage.MASKS: return createMasks();
-			case MsprojectPackage.OUTLINE_CODE: return createOutlineCode();
-			case MsprojectPackage.OUTLINE_CODE2: return createOutlineCode2();
-			case MsprojectPackage.OUTLINE_CODE3: return createOutlineCode3();
-			case MsprojectPackage.OUTLINE_CODES: return createOutlineCodes();
-			case MsprojectPackage.PREDECESSOR_LINK: return createPredecessorLink();
-			case MsprojectPackage.PROJECT: return createProject();
-			case MsprojectPackage.RATE: return createRate();
-			case MsprojectPackage.RATES: return createRates();
-			case MsprojectPackage.RESOURCE: return createResource();
-			case MsprojectPackage.RESOURCES: return createResources();
-			case MsprojectPackage.TASK: return createTask();
-			case MsprojectPackage.TASKS: return createTasks();
-			case MsprojectPackage.TIME_PERIOD: return createTimePeriod();
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE: return createTimephasedDataType();
-			case MsprojectPackage.VALUE: return createValue();
-			case MsprojectPackage.VALUE2: return createValue2();
-			case MsprojectPackage.VALUE_LIST: return createValueList();
-			case MsprojectPackage.VALUES: return createValues();
-			case MsprojectPackage.WBS_MASK: return createWBSMask();
-			case MsprojectPackage.WBS_MASKS: return createWBSMasks();
-			case MsprojectPackage.WEEK_DAY: return createWeekDay();
-			case MsprojectPackage.WEEK_DAYS: return createWeekDays();
-			case MsprojectPackage.WORKING_TIME: return createWorkingTime();
-			case MsprojectPackage.WORKING_TIMES: return createWorkingTimes();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case MsprojectPackage.ACCRUE_AT:
-				return createAccrueAtFromString(eDataType, initialValue);
-			case MsprojectPackage.ACTIVE_DIRECTORY_GUID_TYPE:
-				return createActiveDirectoryGUIDTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.ALIAS_TYPE:
-				return createAliasTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.AUTHOR_TYPE:
-				return createAuthorTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.BASELINE_FOR_EARNED_VALUE_TYPE:
-				return createBaselineForEarnedValueTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.BOOKING_TYPE_TYPE:
-				return createBookingTypeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.BOOKING_TYPE_TYPE1:
-				return createBookingTypeType1FromString(eDataType, initialValue);
-			case MsprojectPackage.CALCULATION_TYPE_TYPE:
-				return createCalculationTypeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.CATEGORY_TYPE:
-				return createCategoryTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.CODE_TYPE:
-				return createCodeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.COMPANY_TYPE:
-				return createCompanyTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.CONSTRAINT_TYPE_TYPE:
-				return createConstraintTypeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.CONTACT_TYPE:
-				return createContactTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.COST_RATE_TABLE_TYPE:
-				return createCostRateTableTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.CURRENCY_SYMBOL_POSITION_TYPE:
-				return createCurrencySymbolPositionTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.CURRENCY_SYMBOL_TYPE:
-				return createCurrencySymbolTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.DAY_TYPE_TYPE:
-				return createDayTypeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.DEFAULT_FIXED_COST_ACCRUAL_TYPE:
-				return createDefaultFixedCostAccrualTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.DEFAULT_TASK_EV_METHOD_TYPE:
-				return createDefaultTaskEVMethodTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.DEFAULT_TASK_TYPE_TYPE:
-				return createDefaultTaskTypeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE:
-				return createDurationFormatTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE1:
-				return createDurationFormatType1FromString(eDataType, initialValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE2:
-				return createDurationFormatType2FromString(eDataType, initialValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE3:
-				return createDurationFormatType3FromString(eDataType, initialValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE4:
-				return createDurationFormatType4FromString(eDataType, initialValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE5:
-				return createDurationFormatType5FromString(eDataType, initialValue);
-			case MsprojectPackage.EARNED_VALUE_METHOD_TYPE:
-				return createEarnedValueMethodTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.EARNED_VALUE_METHOD_TYPE1:
-				return createEarnedValueMethodType1FromString(eDataType, initialValue);
-			case MsprojectPackage.EMAIL_ADDRESS_TYPE:
-				return createEmailAddressTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.EXTERNAL_TASK_PROJECT_TYPE:
-				return createExternalTaskProjectTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.FIXED_COST_ACCRUAL_TYPE:
-				return createFixedCostAccrualTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.FY_START_DATE_TYPE:
-				return createFYStartDateTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.GROUP_TYPE:
-				return createGroupTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE:
-				return createHyperlinkAddressTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE1:
-				return createHyperlinkAddressType1FromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE2:
-				return createHyperlinkAddressType2FromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE:
-				return createHyperlinkSubAddressTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE1:
-				return createHyperlinkSubAddressType1FromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE2:
-				return createHyperlinkSubAddressType2FromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_TYPE:
-				return createHyperlinkTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_TYPE1:
-				return createHyperlinkType1FromString(eDataType, initialValue);
-			case MsprojectPackage.HYPERLINK_TYPE2:
-				return createHyperlinkType2FromString(eDataType, initialValue);
-			case MsprojectPackage.INITIALS_TYPE:
-				return createInitialsTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.LAG_FORMAT_TYPE:
-				return createLagFormatTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.LEVELING_DELAY_FORMAT_TYPE:
-				return createLevelingDelayFormatTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.LEVELING_DELAY_FORMAT_TYPE1:
-				return createLevelingDelayFormatType1FromString(eDataType, initialValue);
-			case MsprojectPackage.MANAGER_TYPE:
-				return createManagerTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.MATERIAL_LABEL_TYPE:
-				return createMaterialLabelTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.NAME_TYPE:
-				return createNameTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.NAME_TYPE1:
-				return createNameType1FromString(eDataType, initialValue);
-			case MsprojectPackage.NAME_TYPE2:
-				return createNameType2FromString(eDataType, initialValue);
-			case MsprojectPackage.NAME_TYPE3:
-				return createNameType3FromString(eDataType, initialValue);
-			case MsprojectPackage.NEW_TASK_START_DATE_TYPE:
-				return createNewTaskStartDateTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.NT_ACCOUNT_TYPE:
-				return createNTAccountTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.OUTLINE_NUMBER_TYPE:
-				return createOutlineNumberTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.OVERTIME_RATE_FORMAT_TYPE:
-				return createOvertimeRateFormatTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.OVERTIME_RATE_FORMAT_TYPE1:
-				return createOvertimeRateFormatType1FromString(eDataType, initialValue);
-			case MsprojectPackage.PHONETIC_ALIAS_TYPE:
-				return createPhoneticAliasTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.PHONETICS_TYPE:
-				return createPhoneticsTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.PREFIX_TYPE:
-				return createPrefixTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.RATE_TABLE_TYPE:
-				return createRateTableTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.ROLLUP_TYPE_TYPE:
-				return createRollupTypeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.STANDARD_RATE_FORMAT_TYPE:
-				return createStandardRateFormatTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.STANDARD_RATE_FORMAT_TYPE1:
-				return createStandardRateFormatType1FromString(eDataType, initialValue);
-			case MsprojectPackage.SUBJECT_TYPE:
-				return createSubjectTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.SUBPROJECT_NAME_TYPE:
-				return createSubprojectNameTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.TITLE_TYPE:
-				return createTitleTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.TYPE_TYPE:
-				return createTypeTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.TYPE_TYPE1:
-				return createTypeType1FromString(eDataType, initialValue);
-			case MsprojectPackage.TYPE_TYPE2:
-				return createTypeType2FromString(eDataType, initialValue);
-			case MsprojectPackage.TYPE_TYPE3:
-				return createTypeType3FromString(eDataType, initialValue);
-			case MsprojectPackage.TYPE_TYPE4:
-				return createTypeType4FromString(eDataType, initialValue);
-			case MsprojectPackage.TYPE_TYPE5:
-				return createTypeType5FromString(eDataType, initialValue);
-			case MsprojectPackage.UID_TYPE:
-				return createUIDTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.UNIT_TYPE:
-				return createUnitTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.VALUELIST_SORT_ORDER_TYPE:
-				return createValuelistSortOrderTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.WEEK_START_DAY_TYPE:
-				return createWeekStartDayTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.WORK_CONTOUR_TYPE:
-				return createWorkContourTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.WORK_FORMAT_TYPE:
-				return createWorkFormatTypeFromString(eDataType, initialValue);
-			case MsprojectPackage.WORK_GROUP_TYPE:
-				return createWorkGroupTypeFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case MsprojectPackage.ACCRUE_AT:
-				return convertAccrueAtToString(eDataType, instanceValue);
-			case MsprojectPackage.ACTIVE_DIRECTORY_GUID_TYPE:
-				return convertActiveDirectoryGUIDTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.ALIAS_TYPE:
-				return convertAliasTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.AUTHOR_TYPE:
-				return convertAuthorTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.BASELINE_FOR_EARNED_VALUE_TYPE:
-				return convertBaselineForEarnedValueTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.BOOKING_TYPE_TYPE:
-				return convertBookingTypeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.BOOKING_TYPE_TYPE1:
-				return convertBookingTypeType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.CALCULATION_TYPE_TYPE:
-				return convertCalculationTypeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.CATEGORY_TYPE:
-				return convertCategoryTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.CODE_TYPE:
-				return convertCodeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.COMPANY_TYPE:
-				return convertCompanyTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.CONSTRAINT_TYPE_TYPE:
-				return convertConstraintTypeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.CONTACT_TYPE:
-				return convertContactTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.COST_RATE_TABLE_TYPE:
-				return convertCostRateTableTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.CURRENCY_SYMBOL_POSITION_TYPE:
-				return convertCurrencySymbolPositionTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.CURRENCY_SYMBOL_TYPE:
-				return convertCurrencySymbolTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.DAY_TYPE_TYPE:
-				return convertDayTypeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.DEFAULT_FIXED_COST_ACCRUAL_TYPE:
-				return convertDefaultFixedCostAccrualTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.DEFAULT_TASK_EV_METHOD_TYPE:
-				return convertDefaultTaskEVMethodTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.DEFAULT_TASK_TYPE_TYPE:
-				return convertDefaultTaskTypeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE:
-				return convertDurationFormatTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE1:
-				return convertDurationFormatType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE2:
-				return convertDurationFormatType2ToString(eDataType, instanceValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE3:
-				return convertDurationFormatType3ToString(eDataType, instanceValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE4:
-				return convertDurationFormatType4ToString(eDataType, instanceValue);
-			case MsprojectPackage.DURATION_FORMAT_TYPE5:
-				return convertDurationFormatType5ToString(eDataType, instanceValue);
-			case MsprojectPackage.EARNED_VALUE_METHOD_TYPE:
-				return convertEarnedValueMethodTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.EARNED_VALUE_METHOD_TYPE1:
-				return convertEarnedValueMethodType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.EMAIL_ADDRESS_TYPE:
-				return convertEmailAddressTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.EXTERNAL_TASK_PROJECT_TYPE:
-				return convertExternalTaskProjectTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.FIXED_COST_ACCRUAL_TYPE:
-				return convertFixedCostAccrualTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.FY_START_DATE_TYPE:
-				return convertFYStartDateTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.GROUP_TYPE:
-				return convertGroupTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE:
-				return convertHyperlinkAddressTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE1:
-				return convertHyperlinkAddressType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE2:
-				return convertHyperlinkAddressType2ToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE:
-				return convertHyperlinkSubAddressTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE1:
-				return convertHyperlinkSubAddressType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE2:
-				return convertHyperlinkSubAddressType2ToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_TYPE:
-				return convertHyperlinkTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_TYPE1:
-				return convertHyperlinkType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.HYPERLINK_TYPE2:
-				return convertHyperlinkType2ToString(eDataType, instanceValue);
-			case MsprojectPackage.INITIALS_TYPE:
-				return convertInitialsTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.LAG_FORMAT_TYPE:
-				return convertLagFormatTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.LEVELING_DELAY_FORMAT_TYPE:
-				return convertLevelingDelayFormatTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.LEVELING_DELAY_FORMAT_TYPE1:
-				return convertLevelingDelayFormatType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.MANAGER_TYPE:
-				return convertManagerTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.MATERIAL_LABEL_TYPE:
-				return convertMaterialLabelTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.NAME_TYPE:
-				return convertNameTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.NAME_TYPE1:
-				return convertNameType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.NAME_TYPE2:
-				return convertNameType2ToString(eDataType, instanceValue);
-			case MsprojectPackage.NAME_TYPE3:
-				return convertNameType3ToString(eDataType, instanceValue);
-			case MsprojectPackage.NEW_TASK_START_DATE_TYPE:
-				return convertNewTaskStartDateTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.NT_ACCOUNT_TYPE:
-				return convertNTAccountTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.OUTLINE_NUMBER_TYPE:
-				return convertOutlineNumberTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.OVERTIME_RATE_FORMAT_TYPE:
-				return convertOvertimeRateFormatTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.OVERTIME_RATE_FORMAT_TYPE1:
-				return convertOvertimeRateFormatType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.PHONETIC_ALIAS_TYPE:
-				return convertPhoneticAliasTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.PHONETICS_TYPE:
-				return convertPhoneticsTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.PREFIX_TYPE:
-				return convertPrefixTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.RATE_TABLE_TYPE:
-				return convertRateTableTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.ROLLUP_TYPE_TYPE:
-				return convertRollupTypeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.STANDARD_RATE_FORMAT_TYPE:
-				return convertStandardRateFormatTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.STANDARD_RATE_FORMAT_TYPE1:
-				return convertStandardRateFormatType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.SUBJECT_TYPE:
-				return convertSubjectTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.SUBPROJECT_NAME_TYPE:
-				return convertSubprojectNameTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.TITLE_TYPE:
-				return convertTitleTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.TYPE_TYPE:
-				return convertTypeTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.TYPE_TYPE1:
-				return convertTypeType1ToString(eDataType, instanceValue);
-			case MsprojectPackage.TYPE_TYPE2:
-				return convertTypeType2ToString(eDataType, instanceValue);
-			case MsprojectPackage.TYPE_TYPE3:
-				return convertTypeType3ToString(eDataType, instanceValue);
-			case MsprojectPackage.TYPE_TYPE4:
-				return convertTypeType4ToString(eDataType, instanceValue);
-			case MsprojectPackage.TYPE_TYPE5:
-				return convertTypeType5ToString(eDataType, instanceValue);
-			case MsprojectPackage.UID_TYPE:
-				return convertUIDTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.UNIT_TYPE:
-				return convertUnitTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.VALUELIST_SORT_ORDER_TYPE:
-				return convertValuelistSortOrderTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.WEEK_START_DAY_TYPE:
-				return convertWeekStartDayTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.WORK_CONTOUR_TYPE:
-				return convertWorkContourTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.WORK_FORMAT_TYPE:
-				return convertWorkFormatTypeToString(eDataType, instanceValue);
-			case MsprojectPackage.WORK_GROUP_TYPE:
-				return convertWorkGroupTypeToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Assignment createAssignment() {
-		AssignmentImpl assignment = new AssignmentImpl();
-		return assignment;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Assignments createAssignments() {
-		AssignmentsImpl assignments = new AssignmentsImpl();
-		return assignments;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AvailabilityPeriod createAvailabilityPeriod() {
-		AvailabilityPeriodImpl availabilityPeriod = new AvailabilityPeriodImpl();
-		return availabilityPeriod;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AvailabilityPeriods createAvailabilityPeriods() {
-		AvailabilityPeriodsImpl availabilityPeriods = new AvailabilityPeriodsImpl();
-		return availabilityPeriods;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Baseline createBaseline() {
-		BaselineImpl baseline = new BaselineImpl();
-		return baseline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Baseline2 createBaseline2() {
-		Baseline2Impl baseline2 = new Baseline2Impl();
-		return baseline2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Baseline3 createBaseline3() {
-		Baseline3Impl baseline3 = new Baseline3Impl();
-		return baseline3;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Calendar createCalendar() {
-		CalendarImpl calendar = new CalendarImpl();
-		return calendar;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Calendars createCalendars() {
-		CalendarsImpl calendars = new CalendarsImpl();
-		return calendars;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DocumentRoot createDocumentRoot() {
-		DocumentRootImpl documentRoot = new DocumentRootImpl();
-		return documentRoot;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExtendedAttribute createExtendedAttribute() {
-		ExtendedAttributeImpl extendedAttribute = new ExtendedAttributeImpl();
-		return extendedAttribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExtendedAttribute2 createExtendedAttribute2() {
-		ExtendedAttribute2Impl extendedAttribute2 = new ExtendedAttribute2Impl();
-		return extendedAttribute2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExtendedAttribute3 createExtendedAttribute3() {
-		ExtendedAttribute3Impl extendedAttribute3 = new ExtendedAttribute3Impl();
-		return extendedAttribute3;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExtendedAttribute4 createExtendedAttribute4() {
-		ExtendedAttribute4Impl extendedAttribute4 = new ExtendedAttribute4Impl();
-		return extendedAttribute4;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExtendedAttributes createExtendedAttributes() {
-		ExtendedAttributesImpl extendedAttributes = new ExtendedAttributesImpl();
-		return extendedAttributes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Mask createMask() {
-		MaskImpl mask = new MaskImpl();
-		return mask;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Masks createMasks() {
-		MasksImpl masks = new MasksImpl();
-		return masks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OutlineCode createOutlineCode() {
-		OutlineCodeImpl outlineCode = new OutlineCodeImpl();
-		return outlineCode;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OutlineCode2 createOutlineCode2() {
-		OutlineCode2Impl outlineCode2 = new OutlineCode2Impl();
-		return outlineCode2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OutlineCode3 createOutlineCode3() {
-		OutlineCode3Impl outlineCode3 = new OutlineCode3Impl();
-		return outlineCode3;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OutlineCodes createOutlineCodes() {
-		OutlineCodesImpl outlineCodes = new OutlineCodesImpl();
-		return outlineCodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PredecessorLink createPredecessorLink() {
-		PredecessorLinkImpl predecessorLink = new PredecessorLinkImpl();
-		return predecessorLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Project createProject() {
-		ProjectImpl project = new ProjectImpl();
-		return project;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Rate createRate() {
-		RateImpl rate = new RateImpl();
-		return rate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Rates createRates() {
-		RatesImpl rates = new RatesImpl();
-		return rates;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resource createResource() {
-		ResourceImpl resource = new ResourceImpl();
-		return resource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resources createResources() {
-		ResourcesImpl resources = new ResourcesImpl();
-		return resources;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Task createTask() {
-		TaskImpl task = new TaskImpl();
-		return task;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Tasks createTasks() {
-		TasksImpl tasks = new TasksImpl();
-		return tasks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TimePeriod createTimePeriod() {
-		TimePeriodImpl timePeriod = new TimePeriodImpl();
-		return timePeriod;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TimephasedDataType createTimephasedDataType() {
-		TimephasedDataTypeImpl timephasedDataType = new TimephasedDataTypeImpl();
-		return timephasedDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Value createValue() {
-		ValueImpl value = new ValueImpl();
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Value2 createValue2() {
-		Value2Impl value2 = new Value2Impl();
-		return value2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueList createValueList() {
-		ValueListImpl valueList = new ValueListImpl();
-		return valueList;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Values createValues() {
-		ValuesImpl values = new ValuesImpl();
-		return values;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WBSMask createWBSMask() {
-		WBSMaskImpl wbsMask = new WBSMaskImpl();
-		return wbsMask;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WBSMasks createWBSMasks() {
-		WBSMasksImpl wbsMasks = new WBSMasksImpl();
-		return wbsMasks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WeekDay createWeekDay() {
-		WeekDayImpl weekDay = new WeekDayImpl();
-		return weekDay;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WeekDays createWeekDays() {
-		WeekDaysImpl weekDays = new WeekDaysImpl();
-		return weekDays;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkingTime createWorkingTime() {
-		WorkingTimeImpl workingTime = new WorkingTimeImpl();
-		return workingTime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkingTimes createWorkingTimes() {
-		WorkingTimesImpl workingTimes = new WorkingTimesImpl();
-		return workingTimes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createAccrueAtFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertAccrueAtToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createActiveDirectoryGUIDTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertActiveDirectoryGUIDTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createAliasTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertAliasTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createAuthorTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertAuthorTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createBaselineForEarnedValueTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertBaselineForEarnedValueTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createBookingTypeTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertBookingTypeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createBookingTypeType1FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertBookingTypeType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createCalculationTypeTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertCalculationTypeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createCategoryTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertCategoryTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createCodeTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertCodeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createCompanyTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertCompanyTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createConstraintTypeTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertConstraintTypeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createContactTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertContactTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createCostRateTableTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertCostRateTableTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createCurrencySymbolPositionTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertCurrencySymbolPositionTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createCurrencySymbolTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertCurrencySymbolTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDayTypeTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDayTypeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDefaultFixedCostAccrualTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDefaultFixedCostAccrualTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDefaultTaskEVMethodTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDefaultTaskEVMethodTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDefaultTaskTypeTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDefaultTaskTypeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDurationFormatTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDurationFormatTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDurationFormatType1FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDurationFormatType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDurationFormatType2FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDurationFormatType2ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDurationFormatType3FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDurationFormatType3ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDurationFormatType4FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDurationFormatType4ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createDurationFormatType5FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDurationFormatType5ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createEarnedValueMethodTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertEarnedValueMethodTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createEarnedValueMethodType1FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertEarnedValueMethodType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createEmailAddressTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertEmailAddressTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createExternalTaskProjectTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertExternalTaskProjectTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createFixedCostAccrualTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertFixedCostAccrualTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createFYStartDateTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertFYStartDateTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createGroupTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertGroupTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkAddressTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkAddressTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkAddressType1FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkAddressType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkAddressType2FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkAddressType2ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkSubAddressTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkSubAddressTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkSubAddressType1FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkSubAddressType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkSubAddressType2FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkSubAddressType2ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkType1FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createHyperlinkType2FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertHyperlinkType2ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createInitialsTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertInitialsTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createLagFormatTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertLagFormatTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createLevelingDelayFormatTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertLevelingDelayFormatTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createLevelingDelayFormatType1FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertLevelingDelayFormatType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createManagerTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertManagerTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createMaterialLabelTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertMaterialLabelTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createNameTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertNameTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createNameType1FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertNameType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createNameType2FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertNameType2ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createNameType3FromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertNameType3ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createNewTaskStartDateTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertNewTaskStartDateTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createNTAccountTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertNTAccountTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createOutlineNumberTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertOutlineNumberTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createOvertimeRateFormatTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertOvertimeRateFormatTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createOvertimeRateFormatType1FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertOvertimeRateFormatType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createPhoneticAliasTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertPhoneticAliasTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createPhoneticsTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertPhoneticsTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createPrefixTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertPrefixTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createRateTableTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertRateTableTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createRollupTypeTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertRollupTypeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createStandardRateFormatTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertStandardRateFormatTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createStandardRateFormatType1FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertStandardRateFormatType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createSubjectTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertSubjectTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createSubprojectNameTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertSubprojectNameTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createTitleTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertTitleTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createTypeTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertTypeTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createTypeType1FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertTypeType1ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createTypeType2FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertTypeType2ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createTypeType3FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertTypeType3ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createTypeType4FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertTypeType4ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createTypeType5FromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertTypeType5ToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createUIDTypeFromString(EDataType eDataType, String initialValue) {
-		return (String)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getString(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertUIDTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getString(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createUnitTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertUnitTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createValuelistSortOrderTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertValuelistSortOrderTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createWeekStartDayTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWeekStartDayTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createWorkContourTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWorkContourTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createWorkFormatTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWorkFormatTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger createWorkGroupTypeFromString(EDataType eDataType, String initialValue) {
-		return (BigInteger)XMLTypeFactory.eINSTANCE.createFromString(XMLTypePackage.eINSTANCE.getInteger(), initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWorkGroupTypeToString(EDataType eDataType, Object instanceValue) {
-		return XMLTypeFactory.eINSTANCE.convertToString(XMLTypePackage.eINSTANCE.getInteger(), instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MsprojectPackage getMsprojectPackage() {
-		return (MsprojectPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static MsprojectPackage getPackage() {
-		return MsprojectPackage.eINSTANCE;
-	}
-
-} //MsprojectFactoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MsprojectPackageImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MsprojectPackageImpl.java
deleted file mode 100644
index 37b2a04..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/MsprojectPackageImpl.java
+++ /dev/null
@@ -1,6313 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectPackageImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
-import org.eclipse.emf.ecore.xml.type.impl.XMLTypePackageImpl;
-import org.eclipse.epf.msproject.MsprojectFactory;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.util.MsprojectValidator;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class MsprojectPackageImpl extends EPackageImpl implements MsprojectPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected String packageFilename = "msproject.ecore";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass assignmentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass assignmentsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass availabilityPeriodEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass availabilityPeriodsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass baselineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass baseline2EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass baseline3EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass calendarEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass calendarsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass documentRootEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extendedAttributeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extendedAttribute2EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extendedAttribute3EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extendedAttribute4EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass extendedAttributesEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass maskEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass masksEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass outlineCodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass outlineCode2EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass outlineCode3EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass outlineCodesEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass predecessorLinkEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass projectEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass ratesEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resourceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resourcesEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tasksEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass timePeriodEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass timephasedDataTypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass value2EClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueListEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valuesEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass wbsMaskEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass wbsMasksEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass weekDayEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass weekDaysEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workingTimeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workingTimesEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType accrueAtEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType activeDirectoryGUIDTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType aliasTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType authorTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType baselineForEarnedValueTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType bookingTypeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType bookingTypeType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType calculationTypeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType categoryTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType codeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType companyTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType constraintTypeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType contactTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType costRateTableTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType currencySymbolPositionTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType currencySymbolTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType dayTypeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType defaultFixedCostAccrualTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType defaultTaskEVMethodTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType defaultTaskTypeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType durationFormatTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType durationFormatType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType durationFormatType2EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType durationFormatType3EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType durationFormatType4EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType durationFormatType5EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType earnedValueMethodTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType earnedValueMethodType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType emailAddressTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType externalTaskProjectTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType fixedCostAccrualTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType fyStartDateTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType groupTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkAddressTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkAddressType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkAddressType2EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkSubAddressTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkSubAddressType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkSubAddressType2EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType hyperlinkType2EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType initialsTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType lagFormatTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType levelingDelayFormatTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType levelingDelayFormatType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType managerTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType materialLabelTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType nameTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType nameType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType nameType2EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType nameType3EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType newTaskStartDateTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType ntAccountTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType outlineNumberTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType overtimeRateFormatTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType overtimeRateFormatType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType phoneticAliasTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType phoneticsTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType prefixTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType rateTableTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType rollupTypeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType standardRateFormatTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType standardRateFormatType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType subjectTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType subprojectNameTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType titleTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType typeTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType typeType1EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType typeType2EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType typeType3EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType typeType4EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType typeType5EDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType uidTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType unitTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType valuelistSortOrderTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType weekStartDayTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType workContourTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType workFormatTypeEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType workGroupTypeEDataType = 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.epf.msproject.MsprojectPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private MsprojectPackageImpl() {
-		super(eNS_URI, MsprojectFactory.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.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @generated
-	 */
-	public static MsprojectPackage init() {
-		if (isInited) return (MsprojectPackage)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI);
-
-		// Obtain or create and register package
-		MsprojectPackageImpl theMsprojectPackage = (MsprojectPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof MsprojectPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new MsprojectPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		XMLTypePackageImpl.init();
-
-		// Load packages
-		theMsprojectPackage.loadPackage();
-
-		// Fix loaded packages
-		theMsprojectPackage.fixPackageContents();
-
-		// Register package validator
-		EValidator.Registry.INSTANCE.put
-			(theMsprojectPackage, 
-			 new EValidator.Descriptor() {
-				 public EValidator getEValidator() {
-					 return MsprojectValidator.INSTANCE;
-				 }
-			 });
-
-		// Mark meta-data to indicate it can't be changed
-		theMsprojectPackage.freeze();
-
-		return theMsprojectPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAssignment() {
-		if (assignmentEClass == null) {
-			assignmentEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(3);
-		}
-		return assignmentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_UID() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_TaskUID() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ResourceUID() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_PercentWorkComplete() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualCost() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualFinish() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualOvertimeCost() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualOvertimeWork() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualStart() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualWork() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ACWP() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Confirmed() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Cost() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_CostRateTable() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_CostVariance() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_CV() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Delay() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Finish() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_FinishVariance() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Hyperlink() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_HyperlinkAddress() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_HyperlinkSubAddress() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_WorkVariance() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_HasFixedRateUnits() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_FixedMaterial() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_LevelingDelay() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(25);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_LevelingDelayFormat() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(26);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_LinkedFields() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(27);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Milestone() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(28);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Notes() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(29);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Overallocated() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(30);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_OvertimeCost() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(31);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_OvertimeWork() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(32);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_RegularWork() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(33);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_RemainingCost() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(34);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_RemainingOvertimeCost() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(35);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_RemainingOvertimeWork() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(36);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_RemainingWork() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(37);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ResponsePending() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(38);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Start() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(39);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Stop() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(40);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Resume() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(41);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_StartVariance() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(42);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Units() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(43);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_UpdateNeeded() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(44);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_VAC() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(45);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_Work() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(46);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_WorkContour() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(47);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_BCWS() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(48);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_BCWP() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(49);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_BookingType() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(50);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualWorkProtected() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(51);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_ActualOvertimeWorkProtected() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(52);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAssignment_CreationDate() {
-        return (EAttribute)getAssignment().getEStructuralFeatures().get(53);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssignment_ExtendedAttribute() {
-        return (EReference)getAssignment().getEStructuralFeatures().get(54);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssignment_Baseline() {
-        return (EReference)getAssignment().getEStructuralFeatures().get(55);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssignment_TimephasedData() {
-        return (EReference)getAssignment().getEStructuralFeatures().get(56);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAssignments() {
-		if (assignmentsEClass == null) {
-			assignmentsEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(4);
-		}
-		return assignmentsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAssignments_Assignment() {
-        return (EReference)getAssignments().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAvailabilityPeriod() {
-		if (availabilityPeriodEClass == null) {
-			availabilityPeriodEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(6);
-		}
-		return availabilityPeriodEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAvailabilityPeriod_AvailableFrom() {
-        return (EAttribute)getAvailabilityPeriod().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAvailabilityPeriod_AvailableTo() {
-        return (EAttribute)getAvailabilityPeriod().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAvailabilityPeriod_AvailableUnits() {
-        return (EAttribute)getAvailabilityPeriod().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAvailabilityPeriods() {
-		if (availabilityPeriodsEClass == null) {
-			availabilityPeriodsEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(7);
-		}
-		return availabilityPeriodsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAvailabilityPeriods_AvailabilityPeriod() {
-        return (EReference)getAvailabilityPeriods().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBaseline() {
-		if (baselineEClass == null) {
-			baselineEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(8);
-		}
-		return baselineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBaseline_TimephasedData() {
-        return (EReference)getBaseline().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_Number() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_Interim() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_Start() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_Finish() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_Duration() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_DurationFormat() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_EstimatedDuration() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_Work() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_Cost() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_BCWS() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline_BCWP() {
-        return (EAttribute)getBaseline().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBaseline2() {
-		if (baseline2EClass == null) {
-			baseline2EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(9);
-		}
-		return baseline2EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline2_Number() {
-        return (EAttribute)getBaseline2().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline2_Work() {
-        return (EAttribute)getBaseline2().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline2_Cost() {
-        return (EAttribute)getBaseline2().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline2_BCWS() {
-        return (EAttribute)getBaseline2().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline2_BCWP() {
-        return (EAttribute)getBaseline2().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBaseline3() {
-		if (baseline3EClass == null) {
-			baseline3EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(10);
-		}
-		return baseline3EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBaseline3_TimephasedData() {
-        return (EReference)getBaseline3().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline3_Number() {
-        return (EAttribute)getBaseline3().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline3_Start() {
-        return (EAttribute)getBaseline3().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline3_Finish() {
-        return (EAttribute)getBaseline3().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline3_Work() {
-        return (EAttribute)getBaseline3().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline3_Cost() {
-        return (EAttribute)getBaseline3().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline3_BCWS() {
-        return (EAttribute)getBaseline3().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBaseline3_BCWP() {
-        return (EAttribute)getBaseline3().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCalendar() {
-		if (calendarEClass == null) {
-			calendarEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(15);
-		}
-		return calendarEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCalendar_UID() {
-        return (EAttribute)getCalendar().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCalendar_Name() {
-        return (EAttribute)getCalendar().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCalendar_IsBaseCalendar() {
-        return (EAttribute)getCalendar().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCalendar_BaseCalendarUID() {
-        return (EAttribute)getCalendar().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCalendar_WeekDays() {
-        return (EReference)getCalendar().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCalendars() {
-		if (calendarsEClass == null) {
-			calendarsEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(16);
-		}
-		return calendarsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCalendars_Calendar() {
-        return (EReference)getCalendars().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDocumentRoot() {
-		if (documentRootEClass == null) {
-			documentRootEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(29);
-		}
-		return documentRootEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDocumentRoot_Mixed() {
-        return (EAttribute)getDocumentRoot().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XMLNSPrefixMap() {
-        return (EReference)getDocumentRoot().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XSISchemaLocation() {
-        return (EReference)getDocumentRoot().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Project() {
-        return (EReference)getDocumentRoot().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtendedAttribute() {
-		if (extendedAttributeEClass == null) {
-			extendedAttributeEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(39);
-		}
-		return extendedAttributeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_FieldID() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_FieldName() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_Alias() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_PhoneticAlias() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_RollupType() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_CalculationType() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_Formula() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_RestrictValues() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_ValuelistSortOrder() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_AppendNewValues() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute_Default() {
-        return (EAttribute)getExtendedAttribute().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtendedAttribute_ValueList() {
-        return (EReference)getExtendedAttribute().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtendedAttribute2() {
-		if (extendedAttribute2EClass == null) {
-			extendedAttribute2EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(40);
-		}
-		return extendedAttribute2EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute2_UID() {
-        return (EAttribute)getExtendedAttribute2().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute2_FieldID() {
-        return (EAttribute)getExtendedAttribute2().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute2_Value() {
-        return (EAttribute)getExtendedAttribute2().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute2_ValueID() {
-        return (EAttribute)getExtendedAttribute2().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute2_DurationFormat() {
-        return (EAttribute)getExtendedAttribute2().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtendedAttribute3() {
-		if (extendedAttribute3EClass == null) {
-			extendedAttribute3EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(41);
-		}
-		return extendedAttribute3EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute3_UID() {
-        return (EAttribute)getExtendedAttribute3().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute3_FieldID() {
-        return (EAttribute)getExtendedAttribute3().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute3_Value() {
-        return (EAttribute)getExtendedAttribute3().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute3_ValueID() {
-        return (EAttribute)getExtendedAttribute3().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute3_DurationFormat() {
-        return (EAttribute)getExtendedAttribute3().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtendedAttribute4() {
-		if (extendedAttribute4EClass == null) {
-			extendedAttribute4EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(42);
-		}
-		return extendedAttribute4EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute4_UID() {
-        return (EAttribute)getExtendedAttribute4().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute4_FieldID() {
-        return (EAttribute)getExtendedAttribute4().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute4_Value() {
-        return (EAttribute)getExtendedAttribute4().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute4_ValueID() {
-        return (EAttribute)getExtendedAttribute4().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExtendedAttribute4_DurationFormat() {
-        return (EAttribute)getExtendedAttribute4().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExtendedAttributes() {
-		if (extendedAttributesEClass == null) {
-			extendedAttributesEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(43);
-		}
-		return extendedAttributesEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExtendedAttributes_ExtendedAttribute() {
-        return (EReference)getExtendedAttributes().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMask() {
-		if (maskEClass == null) {
-			maskEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(62);
-		}
-		return maskEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMask_Level() {
-        return (EAttribute)getMask().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMask_Type() {
-        return (EAttribute)getMask().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMask_Length() {
-        return (EAttribute)getMask().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMask_Separator() {
-        return (EAttribute)getMask().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMasks() {
-		if (masksEClass == null) {
-			masksEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(63);
-		}
-		return masksEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMasks_Mask() {
-        return (EReference)getMasks().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOutlineCode() {
-		if (outlineCodeEClass == null) {
-			outlineCodeEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(71);
-		}
-		return outlineCodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_FieldID() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_FieldName() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_Alias() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_PhoneticAlias() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOutlineCode_Values() {
-        return (EReference)getOutlineCode().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_Enterprise() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_EnterpriseOutlineCodeAlias() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_ResourceSubstitutionEnabled() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_LeafOnly() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_AllLevelsRequired() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode_OnlyTableValuesAllowed() {
-        return (EAttribute)getOutlineCode().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOutlineCode_Masks() {
-        return (EReference)getOutlineCode().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOutlineCode2() {
-		if (outlineCode2EClass == null) {
-			outlineCode2EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(72);
-		}
-		return outlineCode2EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode2_UID() {
-        return (EAttribute)getOutlineCode2().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode2_FieldID() {
-        return (EAttribute)getOutlineCode2().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode2_ValueID() {
-        return (EAttribute)getOutlineCode2().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOutlineCode3() {
-		if (outlineCode3EClass == null) {
-			outlineCode3EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(73);
-		}
-		return outlineCode3EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode3_UID() {
-        return (EAttribute)getOutlineCode3().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode3_FieldID() {
-        return (EAttribute)getOutlineCode3().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOutlineCode3_ValueID() {
-        return (EAttribute)getOutlineCode3().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOutlineCodes() {
-		if (outlineCodesEClass == null) {
-			outlineCodesEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(74);
-		}
-		return outlineCodesEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOutlineCodes_OutlineCode() {
-        return (EReference)getOutlineCodes().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPredecessorLink() {
-		if (predecessorLinkEClass == null) {
-			predecessorLinkEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(80);
-		}
-		return predecessorLinkEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPredecessorLink_PredecessorUID() {
-        return (EAttribute)getPredecessorLink().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPredecessorLink_Type() {
-        return (EAttribute)getPredecessorLink().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPredecessorLink_CrossProject() {
-        return (EAttribute)getPredecessorLink().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPredecessorLink_CrossProjectName() {
-        return (EAttribute)getPredecessorLink().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPredecessorLink_LinkLag() {
-        return (EAttribute)getPredecessorLink().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPredecessorLink_LagFormat() {
-        return (EAttribute)getPredecessorLink().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProject() {
-		if (projectEClass == null) {
-			projectEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(82);
-		}
-		return projectEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_UID() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Name() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Title() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Subject() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Category() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Company() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Manager() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Author() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_CreationDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Revision() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_LastSaved() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_ScheduleFromStart() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_StartDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_FinishDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_FYStartDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_CriticalSlackLimit() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_CurrencyDigits() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_CurrencySymbol() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_CurrencySymbolPosition() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_CalendarUID() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DefaultStartTime() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DefaultFinishTime() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MinutesPerDay() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MinutesPerWeek() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DaysPerMonth() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DefaultTaskType() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(25);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DefaultFixedCostAccrual() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(26);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DefaultStandardRate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(27);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DefaultOvertimeRate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(28);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DurationFormat() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(29);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_WorkFormat() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(30);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_EditableActualCosts() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(31);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_HonorConstraints() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(32);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_EarnedValueMethod() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(33);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_InsertedProjectsLikeSummary() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(34);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MultipleCriticalPaths() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(35);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_NewTasksEffortDriven() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(36);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_NewTasksEstimated() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(37);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_SplitsInProgressTasks() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(38);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_SpreadActualCost() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(39);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_SpreadPercentComplete() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(40);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_TaskUpdatesResource() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(41);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_FiscalYearStart() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(42);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_WeekStartDay() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(43);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MoveCompletedEndsBack() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(44);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MoveRemainingStartsBack() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(45);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MoveRemainingStartsForward() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(46);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MoveCompletedEndsForward() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(47);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_BaselineForEarnedValue() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(48);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_AutoAddNewResourcesAndTasks() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(49);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_StatusDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(50);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_CurrentDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(51);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_MicrosoftProjectServerURL() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(52);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_Autolink() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(53);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_NewTaskStartDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(54);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_DefaultTaskEVMethod() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(55);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_ProjectExternallyEdited() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(56);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_ExtendedCreationDate() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(57);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_ActualsInSync() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(58);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_RemoveFileProperties() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(59);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProject_AdminProject() {
-        return (EAttribute)getProject().getEStructuralFeatures().get(60);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProject_OutlineCodes() {
-        return (EReference)getProject().getEStructuralFeatures().get(61);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProject_WBSMasks() {
-        return (EReference)getProject().getEStructuralFeatures().get(62);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProject_ExtendedAttributes() {
-        return (EReference)getProject().getEStructuralFeatures().get(63);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProject_Calendars() {
-        return (EReference)getProject().getEStructuralFeatures().get(64);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProject_Tasks() {
-        return (EReference)getProject().getEStructuralFeatures().get(65);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProject_Resources() {
-        return (EReference)getProject().getEStructuralFeatures().get(66);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProject_Assignments() {
-        return (EReference)getProject().getEStructuralFeatures().get(67);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRate() {
-		if (rateEClass == null) {
-			rateEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(83);
-		}
-		return rateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_RatesFrom() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_RatesTo() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_RateTable() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_StandardRate() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_StandardRateFormat() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_OvertimeRate() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_OvertimeRateFormat() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRate_CostPerUse() {
-        return (EAttribute)getRate().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRates() {
-		if (ratesEClass == null) {
-			ratesEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(84);
-		}
-		return ratesEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRates_Rate() {
-        return (EReference)getRates().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResource() {
-		if (resourceEClass == null) {
-			resourceEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(86);
-		}
-		return resourceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_UID() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ID() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Name() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Type() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_IsNull() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Initials() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Phonetics() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_NTAccount() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_MaterialLabel() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Code() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Group() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_WorkGroup() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_EmailAddress() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Hyperlink() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_HyperlinkAddress() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_HyperlinkSubAddress() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_MaxUnits() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_PeakUnits() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_OverAllocated() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_AvailableFrom() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_AvailableTo() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Start() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Finish() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_CanLevel() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_AccrueAt() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Work() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(25);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_RegularWork() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(26);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_OvertimeWork() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(27);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ActualWork() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(28);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_RemainingWork() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(29);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ActualOvertimeWork() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(30);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_RemainingOvertimeWork() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(31);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_PercentWorkComplete() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(32);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_StandardRate() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(33);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_StandardRateFormat() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(34);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Cost() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(35);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_OvertimeRate() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(36);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_OvertimeRateFormat() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(37);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_OvertimeCost() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(38);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_CostPerUse() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(39);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ActualCost() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(40);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ActualOvertimeCost() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(41);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_RemainingCost() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(42);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_RemainingOvertimeCost() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(43);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_WorkVariance() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(44);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_CostVariance() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(45);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_SV() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(46);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_CV() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(47);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ACWP() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(48);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_CalendarUID() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(49);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_Notes() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(50);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_BCWS() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(51);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_BCWP() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(52);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_IsGeneric() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(53);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_IsInactive() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(54);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_IsEnterprise() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(55);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_BookingType() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(56);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ActualWorkProtected() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(57);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ActualOvertimeWorkProtected() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(58);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_ActiveDirectoryGUID() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(59);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResource_CreationDate() {
-        return (EAttribute)getResource().getEStructuralFeatures().get(60);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResource_ExtendedAttribute() {
-        return (EReference)getResource().getEStructuralFeatures().get(61);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResource_Baseline() {
-        return (EReference)getResource().getEStructuralFeatures().get(62);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResource_OutlineCode() {
-        return (EReference)getResource().getEStructuralFeatures().get(63);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResource_AvailabilityPeriods() {
-        return (EReference)getResource().getEStructuralFeatures().get(64);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResource_Rates() {
-        return (EReference)getResource().getEStructuralFeatures().get(65);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResource_TimephasedData() {
-        return (EReference)getResource().getEStructuralFeatures().get(66);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResources() {
-		if (resourcesEClass == null) {
-			resourcesEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(87);
-		}
-		return resourcesEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResources_Resource() {
-        return (EReference)getResources().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTask() {
-		if (taskEClass == null) {
-			taskEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(93);
-		}
-		return taskEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_UID() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ID() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Name() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Type() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_IsNull() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_CreateDate() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Contact() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_WBS() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_WBSLevel() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_OutlineNumber() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_OutlineLevel() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Priority() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Start() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Finish() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Duration() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_DurationFormat() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(15);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Work() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(16);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Stop() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(17);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Resume() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(18);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ResumeValid() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(19);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_EffortDriven() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(20);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Recurring() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(21);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_OverAllocated() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(22);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Estimated() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(23);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Milestone() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(24);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Summary() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(25);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Critical() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(26);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_IsSubproject() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(27);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_IsSubprojectReadOnly() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(28);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_SubprojectName() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(29);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ExternalTask() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(30);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ExternalTaskProject() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(31);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_EarlyStart() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(32);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_EarlyFinish() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(33);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_LateStart() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(34);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_LateFinish() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(35);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_StartVariance() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(36);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_FinishVariance() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(37);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_WorkVariance() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(38);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_FreeSlack() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(39);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_TotalSlack() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(40);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_FixedCost() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(41);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_FixedCostAccrual() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(42);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_PercentComplete() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(43);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_PercentWorkComplete() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(44);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Cost() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(45);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_OvertimeCost() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(46);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_OvertimeWork() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(47);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualStart() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(48);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualFinish() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(49);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualDuration() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(50);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualCost() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(51);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualOvertimeCost() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(52);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualWork() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(53);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualOvertimeWork() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(54);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_RegularWork() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(55);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_RemainingDuration() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(56);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_RemainingCost() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(57);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_RemainingWork() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(58);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_RemainingOvertimeCost() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(59);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_RemainingOvertimeWork() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(60);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ACWP() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(61);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_CV() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(62);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ConstraintType() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(63);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_CalendarUID() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(64);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ConstraintDate() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(65);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Deadline() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(66);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_LevelAssignments() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(67);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_LevelingCanSplit() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(68);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_LevelingDelay() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(69);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_LevelingDelayFormat() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(70);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_PreLeveledStart() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(71);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_PreLeveledFinish() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(72);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Hyperlink() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(73);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_HyperlinkAddress() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(74);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_HyperlinkSubAddress() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(75);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_IgnoreResourceCalendar() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(76);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Notes() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(77);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_HideBar() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(78);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Rollup() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(79);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_BCWS() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(80);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_BCWP() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(81);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_PhysicalPercentComplete() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(82);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_EarnedValueMethod() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(83);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_PredecessorLink() {
-        return (EReference)getTask().getEStructuralFeatures().get(84);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualWorkProtected() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(85);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ActualOvertimeWorkProtected() {
-        return (EAttribute)getTask().getEStructuralFeatures().get(86);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_ExtendedAttribute() {
-        return (EReference)getTask().getEStructuralFeatures().get(87);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_Baseline() {
-        return (EReference)getTask().getEStructuralFeatures().get(88);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_OutlineCode() {
-        return (EReference)getTask().getEStructuralFeatures().get(89);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_TimephasedData() {
-        return (EReference)getTask().getEStructuralFeatures().get(90);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTasks() {
-		if (tasksEClass == null) {
-			tasksEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(94);
-		}
-		return tasksEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTasks_Task() {
-        return (EReference)getTasks().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTimePeriod() {
-		if (timePeriodEClass == null) {
-			timePeriodEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(95);
-		}
-		return timePeriodEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimePeriod_FromDate() {
-        return (EAttribute)getTimePeriod().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimePeriod_ToDate() {
-        return (EAttribute)getTimePeriod().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTimephasedDataType() {
-		if (timephasedDataTypeEClass == null) {
-			timephasedDataTypeEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(96);
-		}
-		return timephasedDataTypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimephasedDataType_Type() {
-        return (EAttribute)getTimephasedDataType().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimephasedDataType_UID() {
-        return (EAttribute)getTimephasedDataType().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimephasedDataType_Start() {
-        return (EAttribute)getTimephasedDataType().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimephasedDataType_Finish() {
-        return (EAttribute)getTimephasedDataType().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimephasedDataType_Unit() {
-        return (EAttribute)getTimephasedDataType().getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTimephasedDataType_Value() {
-        return (EAttribute)getTimephasedDataType().getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValue() {
-		if (valueEClass == null) {
-			valueEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(106);
-		}
-		return valueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValue_ValueID() {
-        return (EAttribute)getValue().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValue_ParentValueID() {
-        return (EAttribute)getValue().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValue_Value() {
-        return (EAttribute)getValue().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValue_Description() {
-        return (EAttribute)getValue().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValue2() {
-		if (value2EClass == null) {
-			value2EClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(107);
-		}
-		return value2EClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValue2_ID() {
-        return (EAttribute)getValue2().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValue2_Value() {
-        return (EAttribute)getValue2().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValue2_Description() {
-        return (EAttribute)getValue2().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValueList() {
-		if (valueListEClass == null) {
-			valueListEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(108);
-		}
-		return valueListEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValueList_Value() {
-        return (EReference)getValueList().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValues() {
-		if (valuesEClass == null) {
-			valuesEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(110);
-		}
-		return valuesEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValues_Group() {
-        return (EAttribute)getValues().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValues_Value() {
-        return (EReference)getValues().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWBSMask() {
-		if (wbsMaskEClass == null) {
-			wbsMaskEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(111);
-		}
-		return wbsMaskEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWBSMask_Level() {
-        return (EAttribute)getWBSMask().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWBSMask_Type() {
-        return (EAttribute)getWBSMask().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWBSMask_Length() {
-        return (EAttribute)getWBSMask().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWBSMask_Separator() {
-        return (EAttribute)getWBSMask().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWBSMasks() {
-		if (wbsMasksEClass == null) {
-			wbsMasksEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(112);
-		}
-		return wbsMasksEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWBSMasks_VerifyUniqueCodes() {
-        return (EAttribute)getWBSMasks().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWBSMasks_GenerateCodes() {
-        return (EAttribute)getWBSMasks().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWBSMasks_Prefix() {
-        return (EAttribute)getWBSMasks().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWBSMasks_WBSMask() {
-        return (EReference)getWBSMasks().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWeekDay() {
-		if (weekDayEClass == null) {
-			weekDayEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(113);
-		}
-		return weekDayEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWeekDay_DayType() {
-        return (EAttribute)getWeekDay().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWeekDay_DayWorking() {
-        return (EAttribute)getWeekDay().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWeekDay_TimePeriod() {
-        return (EReference)getWeekDay().getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWeekDay_WorkingTimes() {
-        return (EReference)getWeekDay().getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWeekDays() {
-		if (weekDaysEClass == null) {
-			weekDaysEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(114);
-		}
-		return weekDaysEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWeekDays_WeekDay() {
-        return (EReference)getWeekDays().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkingTime() {
-		if (workingTimeEClass == null) {
-			workingTimeEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(119);
-		}
-		return workingTimeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkingTime_FromTime() {
-        return (EAttribute)getWorkingTime().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkingTime_ToTime() {
-        return (EAttribute)getWorkingTime().getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkingTimes() {
-		if (workingTimesEClass == null) {
-			workingTimesEClass = (EClass)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(120);
-		}
-		return workingTimesEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkingTimes_WorkingTime() {
-        return (EReference)getWorkingTimes().getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getAccrueAt() {
-		if (accrueAtEDataType == null) {
-			accrueAtEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(0);
-		}
-		return accrueAtEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getActiveDirectoryGUIDType() {
-		if (activeDirectoryGUIDTypeEDataType == null) {
-			activeDirectoryGUIDTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(1);
-		}
-		return activeDirectoryGUIDTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getAliasType() {
-		if (aliasTypeEDataType == null) {
-			aliasTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(2);
-		}
-		return aliasTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getAuthorType() {
-		if (authorTypeEDataType == null) {
-			authorTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(5);
-		}
-		return authorTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getBaselineForEarnedValueType() {
-		if (baselineForEarnedValueTypeEDataType == null) {
-			baselineForEarnedValueTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(11);
-		}
-		return baselineForEarnedValueTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getBookingTypeType() {
-		if (bookingTypeTypeEDataType == null) {
-			bookingTypeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(12);
-		}
-		return bookingTypeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getBookingTypeType1() {
-		if (bookingTypeType1EDataType == null) {
-			bookingTypeType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(13);
-		}
-		return bookingTypeType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getCalculationTypeType() {
-		if (calculationTypeTypeEDataType == null) {
-			calculationTypeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(14);
-		}
-		return calculationTypeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getCategoryType() {
-		if (categoryTypeEDataType == null) {
-			categoryTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(17);
-		}
-		return categoryTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getCodeType() {
-		if (codeTypeEDataType == null) {
-			codeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(18);
-		}
-		return codeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getCompanyType() {
-		if (companyTypeEDataType == null) {
-			companyTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(19);
-		}
-		return companyTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getConstraintTypeType() {
-		if (constraintTypeTypeEDataType == null) {
-			constraintTypeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(20);
-		}
-		return constraintTypeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getContactType() {
-		if (contactTypeEDataType == null) {
-			contactTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(21);
-		}
-		return contactTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getCostRateTableType() {
-		if (costRateTableTypeEDataType == null) {
-			costRateTableTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(22);
-		}
-		return costRateTableTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getCurrencySymbolPositionType() {
-		if (currencySymbolPositionTypeEDataType == null) {
-			currencySymbolPositionTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(23);
-		}
-		return currencySymbolPositionTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getCurrencySymbolType() {
-		if (currencySymbolTypeEDataType == null) {
-			currencySymbolTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(24);
-		}
-		return currencySymbolTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDayTypeType() {
-		if (dayTypeTypeEDataType == null) {
-			dayTypeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(25);
-		}
-		return dayTypeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDefaultFixedCostAccrualType() {
-		if (defaultFixedCostAccrualTypeEDataType == null) {
-			defaultFixedCostAccrualTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(26);
-		}
-		return defaultFixedCostAccrualTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDefaultTaskEVMethodType() {
-		if (defaultTaskEVMethodTypeEDataType == null) {
-			defaultTaskEVMethodTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(27);
-		}
-		return defaultTaskEVMethodTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDefaultTaskTypeType() {
-		if (defaultTaskTypeTypeEDataType == null) {
-			defaultTaskTypeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(28);
-		}
-		return defaultTaskTypeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDurationFormatType() {
-		if (durationFormatTypeEDataType == null) {
-			durationFormatTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(30);
-		}
-		return durationFormatTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDurationFormatType1() {
-		if (durationFormatType1EDataType == null) {
-			durationFormatType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(31);
-		}
-		return durationFormatType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDurationFormatType2() {
-		if (durationFormatType2EDataType == null) {
-			durationFormatType2EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(32);
-		}
-		return durationFormatType2EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDurationFormatType3() {
-		if (durationFormatType3EDataType == null) {
-			durationFormatType3EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(33);
-		}
-		return durationFormatType3EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDurationFormatType4() {
-		if (durationFormatType4EDataType == null) {
-			durationFormatType4EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(34);
-		}
-		return durationFormatType4EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDurationFormatType5() {
-		if (durationFormatType5EDataType == null) {
-			durationFormatType5EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(35);
-		}
-		return durationFormatType5EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getEarnedValueMethodType() {
-		if (earnedValueMethodTypeEDataType == null) {
-			earnedValueMethodTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(36);
-		}
-		return earnedValueMethodTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getEarnedValueMethodType1() {
-		if (earnedValueMethodType1EDataType == null) {
-			earnedValueMethodType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(37);
-		}
-		return earnedValueMethodType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getEmailAddressType() {
-		if (emailAddressTypeEDataType == null) {
-			emailAddressTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(38);
-		}
-		return emailAddressTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getExternalTaskProjectType() {
-		if (externalTaskProjectTypeEDataType == null) {
-			externalTaskProjectTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(44);
-		}
-		return externalTaskProjectTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getFixedCostAccrualType() {
-		if (fixedCostAccrualTypeEDataType == null) {
-			fixedCostAccrualTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(45);
-		}
-		return fixedCostAccrualTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getFYStartDateType() {
-		if (fyStartDateTypeEDataType == null) {
-			fyStartDateTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(46);
-		}
-		return fyStartDateTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getGroupType() {
-		if (groupTypeEDataType == null) {
-			groupTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(47);
-		}
-		return groupTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkAddressType() {
-		if (hyperlinkAddressTypeEDataType == null) {
-			hyperlinkAddressTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(48);
-		}
-		return hyperlinkAddressTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkAddressType1() {
-		if (hyperlinkAddressType1EDataType == null) {
-			hyperlinkAddressType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(49);
-		}
-		return hyperlinkAddressType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkAddressType2() {
-		if (hyperlinkAddressType2EDataType == null) {
-			hyperlinkAddressType2EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(50);
-		}
-		return hyperlinkAddressType2EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkSubAddressType() {
-		if (hyperlinkSubAddressTypeEDataType == null) {
-			hyperlinkSubAddressTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(51);
-		}
-		return hyperlinkSubAddressTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkSubAddressType1() {
-		if (hyperlinkSubAddressType1EDataType == null) {
-			hyperlinkSubAddressType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(52);
-		}
-		return hyperlinkSubAddressType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkSubAddressType2() {
-		if (hyperlinkSubAddressType2EDataType == null) {
-			hyperlinkSubAddressType2EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(53);
-		}
-		return hyperlinkSubAddressType2EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkType() {
-		if (hyperlinkTypeEDataType == null) {
-			hyperlinkTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(54);
-		}
-		return hyperlinkTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkType1() {
-		if (hyperlinkType1EDataType == null) {
-			hyperlinkType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(55);
-		}
-		return hyperlinkType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getHyperlinkType2() {
-		if (hyperlinkType2EDataType == null) {
-			hyperlinkType2EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(56);
-		}
-		return hyperlinkType2EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getInitialsType() {
-		if (initialsTypeEDataType == null) {
-			initialsTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(57);
-		}
-		return initialsTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getLagFormatType() {
-		if (lagFormatTypeEDataType == null) {
-			lagFormatTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(58);
-		}
-		return lagFormatTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getLevelingDelayFormatType() {
-		if (levelingDelayFormatTypeEDataType == null) {
-			levelingDelayFormatTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(59);
-		}
-		return levelingDelayFormatTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getLevelingDelayFormatType1() {
-		if (levelingDelayFormatType1EDataType == null) {
-			levelingDelayFormatType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(60);
-		}
-		return levelingDelayFormatType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getManagerType() {
-		if (managerTypeEDataType == null) {
-			managerTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(61);
-		}
-		return managerTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getMaterialLabelType() {
-		if (materialLabelTypeEDataType == null) {
-			materialLabelTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(64);
-		}
-		return materialLabelTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getNameType() {
-		if (nameTypeEDataType == null) {
-			nameTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(65);
-		}
-		return nameTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getNameType1() {
-		if (nameType1EDataType == null) {
-			nameType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(66);
-		}
-		return nameType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getNameType2() {
-		if (nameType2EDataType == null) {
-			nameType2EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(67);
-		}
-		return nameType2EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getNameType3() {
-		if (nameType3EDataType == null) {
-			nameType3EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(68);
-		}
-		return nameType3EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getNewTaskStartDateType() {
-		if (newTaskStartDateTypeEDataType == null) {
-			newTaskStartDateTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(69);
-		}
-		return newTaskStartDateTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getNTAccountType() {
-		if (ntAccountTypeEDataType == null) {
-			ntAccountTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(70);
-		}
-		return ntAccountTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getOutlineNumberType() {
-		if (outlineNumberTypeEDataType == null) {
-			outlineNumberTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(75);
-		}
-		return outlineNumberTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getOvertimeRateFormatType() {
-		if (overtimeRateFormatTypeEDataType == null) {
-			overtimeRateFormatTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(76);
-		}
-		return overtimeRateFormatTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getOvertimeRateFormatType1() {
-		if (overtimeRateFormatType1EDataType == null) {
-			overtimeRateFormatType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(77);
-		}
-		return overtimeRateFormatType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getPhoneticAliasType() {
-		if (phoneticAliasTypeEDataType == null) {
-			phoneticAliasTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(78);
-		}
-		return phoneticAliasTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getPhoneticsType() {
-		if (phoneticsTypeEDataType == null) {
-			phoneticsTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(79);
-		}
-		return phoneticsTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getPrefixType() {
-		if (prefixTypeEDataType == null) {
-			prefixTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(81);
-		}
-		return prefixTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getRateTableType() {
-		if (rateTableTypeEDataType == null) {
-			rateTableTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(85);
-		}
-		return rateTableTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getRollupTypeType() {
-		if (rollupTypeTypeEDataType == null) {
-			rollupTypeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(88);
-		}
-		return rollupTypeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getStandardRateFormatType() {
-		if (standardRateFormatTypeEDataType == null) {
-			standardRateFormatTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(89);
-		}
-		return standardRateFormatTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getStandardRateFormatType1() {
-		if (standardRateFormatType1EDataType == null) {
-			standardRateFormatType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(90);
-		}
-		return standardRateFormatType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getSubjectType() {
-		if (subjectTypeEDataType == null) {
-			subjectTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(91);
-		}
-		return subjectTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getSubprojectNameType() {
-		if (subprojectNameTypeEDataType == null) {
-			subprojectNameTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(92);
-		}
-		return subprojectNameTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getTitleType() {
-		if (titleTypeEDataType == null) {
-			titleTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(97);
-		}
-		return titleTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getTypeType() {
-		if (typeTypeEDataType == null) {
-			typeTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(98);
-		}
-		return typeTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getTypeType1() {
-		if (typeType1EDataType == null) {
-			typeType1EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(99);
-		}
-		return typeType1EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getTypeType2() {
-		if (typeType2EDataType == null) {
-			typeType2EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(100);
-		}
-		return typeType2EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getTypeType3() {
-		if (typeType3EDataType == null) {
-			typeType3EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(101);
-		}
-		return typeType3EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getTypeType4() {
-		if (typeType4EDataType == null) {
-			typeType4EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(102);
-		}
-		return typeType4EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getTypeType5() {
-		if (typeType5EDataType == null) {
-			typeType5EDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(103);
-		}
-		return typeType5EDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getUIDType() {
-		if (uidTypeEDataType == null) {
-			uidTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(104);
-		}
-		return uidTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getUnitType() {
-		if (unitTypeEDataType == null) {
-			unitTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(105);
-		}
-		return unitTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getValuelistSortOrderType() {
-		if (valuelistSortOrderTypeEDataType == null) {
-			valuelistSortOrderTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(109);
-		}
-		return valuelistSortOrderTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getWeekStartDayType() {
-		if (weekStartDayTypeEDataType == null) {
-			weekStartDayTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(115);
-		}
-		return weekStartDayTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getWorkContourType() {
-		if (workContourTypeEDataType == null) {
-			workContourTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(116);
-		}
-		return workContourTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getWorkFormatType() {
-		if (workFormatTypeEDataType == null) {
-			workFormatTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(117);
-		}
-		return workFormatTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getWorkGroupType() {
-		if (workGroupTypeEDataType == null) {
-			workGroupTypeEDataType = (EDataType)EPackage.Registry.INSTANCE.getEPackage(MsprojectPackage.eNS_URI).getEClassifiers().get(118);
-		}
-		return workGroupTypeEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MsprojectFactory getMsprojectFactory() {
-		return (MsprojectFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isLoaded = false;
-
-	/**
-	 * Laods the package and any sub-packages from their serialized form.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void loadPackage() {
-		if (isLoaded) return;
-		isLoaded = true;
-
-		URL url = getClass().getResource(packageFilename);
-		if (url == null) {
-			throw new RuntimeException("Missing serialized package: " + packageFilename);
-		}
-		Resource resource = new EcoreResourceFactoryImpl().createResource(URI.createURI(url.toString()));
-		try {
-			resource.load(null);
-		}
-		catch (IOException exception) {
-			throw new WrappedException(exception);
-		}
-		initializeFromLoadedEPackage(this, (EPackage)resource.getContents().get(0));
-		createResource(eNS_URI);
-	}
-
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isFixed = false;
-
-	/**
-	 * Fixes up the loaded package, to make it appear as if it had been programmatically built.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fixPackageContents() {
-		if (isFixed) return;
-		isFixed = true;
-		fixEClassifiers();
-	}
-} //MsprojectPackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCode2Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCode2Impl.java
deleted file mode 100644
index e006b12..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCode2Impl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCode2Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode2;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Outline Code2</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCode2Impl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCode2Impl#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCode2Impl#getValueID <em>Value ID</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OutlineCode2Impl extends EObjectImpl implements OutlineCode2 {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldID = FIELD_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger VALUE_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger valueID = VALUE_ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OutlineCode2Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getOutlineCode2();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE2__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldID() {
-		return fieldID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldID(String newFieldID) {
-		String oldFieldID = fieldID;
-		fieldID = newFieldID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE2__FIELD_ID, oldFieldID, fieldID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getValueID() {
-		return valueID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueID(BigInteger newValueID) {
-		BigInteger oldValueID = valueID;
-		valueID = newValueID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE2__VALUE_ID, oldValueID, valueID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE2__UID:
-				return getUID();
-			case MsprojectPackage.OUTLINE_CODE2__FIELD_ID:
-				return getFieldID();
-			case MsprojectPackage.OUTLINE_CODE2__VALUE_ID:
-				return getValueID();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE2__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE2__FIELD_ID:
-				setFieldID((String)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE2__VALUE_ID:
-				setValueID((BigInteger)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE2__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE2__FIELD_ID:
-				setFieldID(FIELD_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE2__VALUE_ID:
-				setValueID(VALUE_ID_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE2__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.OUTLINE_CODE2__FIELD_ID:
-				return FIELD_ID_EDEFAULT == null ? fieldID != null : !FIELD_ID_EDEFAULT.equals(fieldID);
-			case MsprojectPackage.OUTLINE_CODE2__VALUE_ID:
-				return VALUE_ID_EDEFAULT == null ? valueID != null : !VALUE_ID_EDEFAULT.equals(valueID);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", fieldID: ");
-		result.append(fieldID);
-		result.append(", valueID: ");
-		result.append(valueID);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OutlineCode2Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCode3Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCode3Impl.java
deleted file mode 100644
index 40fda78..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCode3Impl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCode3Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode3;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Outline Code3</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCode3Impl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCode3Impl#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCode3Impl#getValueID <em>Value ID</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OutlineCode3Impl extends EObjectImpl implements OutlineCode3 {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldID = FIELD_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger VALUE_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger valueID = VALUE_ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OutlineCode3Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getOutlineCode3();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE3__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldID() {
-		return fieldID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldID(String newFieldID) {
-		String oldFieldID = fieldID;
-		fieldID = newFieldID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE3__FIELD_ID, oldFieldID, fieldID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getValueID() {
-		return valueID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueID(BigInteger newValueID) {
-		BigInteger oldValueID = valueID;
-		valueID = newValueID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE3__VALUE_ID, oldValueID, valueID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE3__UID:
-				return getUID();
-			case MsprojectPackage.OUTLINE_CODE3__FIELD_ID:
-				return getFieldID();
-			case MsprojectPackage.OUTLINE_CODE3__VALUE_ID:
-				return getValueID();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE3__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE3__FIELD_ID:
-				setFieldID((String)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE3__VALUE_ID:
-				setValueID((BigInteger)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE3__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE3__FIELD_ID:
-				setFieldID(FIELD_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE3__VALUE_ID:
-				setValueID(VALUE_ID_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE3__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.OUTLINE_CODE3__FIELD_ID:
-				return FIELD_ID_EDEFAULT == null ? fieldID != null : !FIELD_ID_EDEFAULT.equals(fieldID);
-			case MsprojectPackage.OUTLINE_CODE3__VALUE_ID:
-				return VALUE_ID_EDEFAULT == null ? valueID != null : !VALUE_ID_EDEFAULT.equals(valueID);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", fieldID: ");
-		result.append(fieldID);
-		result.append(", valueID: ");
-		result.append(valueID);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OutlineCode3Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCodeImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCodeImpl.java
deleted file mode 100644
index 499afc4..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCodeImpl.java
+++ /dev/null
@@ -1,968 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCodeImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.Masks;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode;
-import org.eclipse.epf.msproject.Values;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Outline Code</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#getFieldID <em>Field ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#getFieldName <em>Field Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#getAlias <em>Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#getPhoneticAlias <em>Phonetic Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#getValues <em>Values</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#isEnterprise <em>Enterprise</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#getEnterpriseOutlineCodeAlias <em>Enterprise Outline Code Alias</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#isResourceSubstitutionEnabled <em>Resource Substitution Enabled</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#isLeafOnly <em>Leaf Only</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#isAllLevelsRequired <em>All Levels Required</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#isOnlyTableValuesAllowed <em>Only Table Values Allowed</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodeImpl#getMasks <em>Masks</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OutlineCodeImpl extends EObjectImpl implements OutlineCode {
-	/**
-	 * The default value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldID() <em>Field ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldID = FIELD_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFieldName() <em>Field Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIELD_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFieldName() <em>Field Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFieldName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fieldName = FIELD_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAlias() <em>Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ALIAS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAlias() <em>Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected String alias = ALIAS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPhoneticAlias() <em>Phonetic Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhoneticAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PHONETIC_ALIAS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPhoneticAlias() <em>Phonetic Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhoneticAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected String phoneticAlias = PHONETIC_ALIAS_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getValues() <em>Values</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValues()
-	 * @generated
-	 * @ordered
-	 */
-	protected Values values = null;
-
-	/**
-	 * The default value of the '{@link #isEnterprise() <em>Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEnterprise()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ENTERPRISE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isEnterprise() <em>Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEnterprise()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean enterprise = ENTERPRISE_EDEFAULT;
-
-	/**
-	 * This is true if the Enterprise attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean enterpriseESet = false;
-
-	/**
-	 * The default value of the '{@link #getEnterpriseOutlineCodeAlias() <em>Enterprise Outline Code Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEnterpriseOutlineCodeAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger ENTERPRISE_OUTLINE_CODE_ALIAS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEnterpriseOutlineCodeAlias() <em>Enterprise Outline Code Alias</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEnterpriseOutlineCodeAlias()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger enterpriseOutlineCodeAlias = ENTERPRISE_OUTLINE_CODE_ALIAS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isResourceSubstitutionEnabled() <em>Resource Substitution Enabled</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResourceSubstitutionEnabled()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESOURCE_SUBSTITUTION_ENABLED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isResourceSubstitutionEnabled() <em>Resource Substitution Enabled</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResourceSubstitutionEnabled()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resourceSubstitutionEnabled = RESOURCE_SUBSTITUTION_ENABLED_EDEFAULT;
-
-	/**
-	 * This is true if the Resource Substitution Enabled attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resourceSubstitutionEnabledESet = false;
-
-	/**
-	 * The default value of the '{@link #isLeafOnly() <em>Leaf Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLeafOnly()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean LEAF_ONLY_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isLeafOnly() <em>Leaf Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLeafOnly()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean leafOnly = LEAF_ONLY_EDEFAULT;
-
-	/**
-	 * This is true if the Leaf Only attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean leafOnlyESet = false;
-
-	/**
-	 * The default value of the '{@link #isAllLevelsRequired() <em>All Levels Required</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAllLevelsRequired()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ALL_LEVELS_REQUIRED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isAllLevelsRequired() <em>All Levels Required</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAllLevelsRequired()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean allLevelsRequired = ALL_LEVELS_REQUIRED_EDEFAULT;
-
-	/**
-	 * This is true if the All Levels Required attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean allLevelsRequiredESet = false;
-
-	/**
-	 * The default value of the '{@link #isOnlyTableValuesAllowed() <em>Only Table Values Allowed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOnlyTableValuesAllowed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ONLY_TABLE_VALUES_ALLOWED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isOnlyTableValuesAllowed() <em>Only Table Values Allowed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOnlyTableValuesAllowed()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean onlyTableValuesAllowed = ONLY_TABLE_VALUES_ALLOWED_EDEFAULT;
-
-	/**
-	 * This is true if the Only Table Values Allowed attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean onlyTableValuesAllowedESet = false;
-
-	/**
-	 * The cached value of the '{@link #getMasks() <em>Masks</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected Masks masks = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OutlineCodeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getOutlineCode();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldID() {
-		return fieldID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldID(String newFieldID) {
-		String oldFieldID = fieldID;
-		fieldID = newFieldID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__FIELD_ID, oldFieldID, fieldID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFieldName() {
-		return fieldName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFieldName(String newFieldName) {
-		String oldFieldName = fieldName;
-		fieldName = newFieldName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__FIELD_NAME, oldFieldName, fieldName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAlias() {
-		return alias;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAlias(String newAlias) {
-		String oldAlias = alias;
-		alias = newAlias;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__ALIAS, oldAlias, alias));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPhoneticAlias() {
-		return phoneticAlias;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPhoneticAlias(String newPhoneticAlias) {
-		String oldPhoneticAlias = phoneticAlias;
-		phoneticAlias = newPhoneticAlias;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__PHONETIC_ALIAS, oldPhoneticAlias, phoneticAlias));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Values getValues() {
-		return values;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValues(Values newValues, NotificationChain msgs) {
-		Values oldValues = values;
-		values = newValues;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__VALUES, oldValues, newValues);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValues(Values newValues) {
-		if (newValues != values) {
-			NotificationChain msgs = null;
-			if (values != null)
-				msgs = ((InternalEObject)values).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.OUTLINE_CODE__VALUES, null, msgs);
-			if (newValues != null)
-				msgs = ((InternalEObject)newValues).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.OUTLINE_CODE__VALUES, null, msgs);
-			msgs = basicSetValues(newValues, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__VALUES, newValues, newValues));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isEnterprise() {
-		return enterprise;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEnterprise(boolean newEnterprise) {
-		boolean oldEnterprise = enterprise;
-		enterprise = newEnterprise;
-		boolean oldEnterpriseESet = enterpriseESet;
-		enterpriseESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__ENTERPRISE, oldEnterprise, enterprise, !oldEnterpriseESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetEnterprise() {
-		boolean oldEnterprise = enterprise;
-		boolean oldEnterpriseESet = enterpriseESet;
-		enterprise = ENTERPRISE_EDEFAULT;
-		enterpriseESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.OUTLINE_CODE__ENTERPRISE, oldEnterprise, ENTERPRISE_EDEFAULT, oldEnterpriseESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetEnterprise() {
-		return enterpriseESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getEnterpriseOutlineCodeAlias() {
-		return enterpriseOutlineCodeAlias;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEnterpriseOutlineCodeAlias(BigInteger newEnterpriseOutlineCodeAlias) {
-		BigInteger oldEnterpriseOutlineCodeAlias = enterpriseOutlineCodeAlias;
-		enterpriseOutlineCodeAlias = newEnterpriseOutlineCodeAlias;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__ENTERPRISE_OUTLINE_CODE_ALIAS, oldEnterpriseOutlineCodeAlias, enterpriseOutlineCodeAlias));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isResourceSubstitutionEnabled() {
-		return resourceSubstitutionEnabled;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResourceSubstitutionEnabled(boolean newResourceSubstitutionEnabled) {
-		boolean oldResourceSubstitutionEnabled = resourceSubstitutionEnabled;
-		resourceSubstitutionEnabled = newResourceSubstitutionEnabled;
-		boolean oldResourceSubstitutionEnabledESet = resourceSubstitutionEnabledESet;
-		resourceSubstitutionEnabledESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__RESOURCE_SUBSTITUTION_ENABLED, oldResourceSubstitutionEnabled, resourceSubstitutionEnabled, !oldResourceSubstitutionEnabledESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetResourceSubstitutionEnabled() {
-		boolean oldResourceSubstitutionEnabled = resourceSubstitutionEnabled;
-		boolean oldResourceSubstitutionEnabledESet = resourceSubstitutionEnabledESet;
-		resourceSubstitutionEnabled = RESOURCE_SUBSTITUTION_ENABLED_EDEFAULT;
-		resourceSubstitutionEnabledESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.OUTLINE_CODE__RESOURCE_SUBSTITUTION_ENABLED, oldResourceSubstitutionEnabled, RESOURCE_SUBSTITUTION_ENABLED_EDEFAULT, oldResourceSubstitutionEnabledESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetResourceSubstitutionEnabled() {
-		return resourceSubstitutionEnabledESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isLeafOnly() {
-		return leafOnly;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLeafOnly(boolean newLeafOnly) {
-		boolean oldLeafOnly = leafOnly;
-		leafOnly = newLeafOnly;
-		boolean oldLeafOnlyESet = leafOnlyESet;
-		leafOnlyESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__LEAF_ONLY, oldLeafOnly, leafOnly, !oldLeafOnlyESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLeafOnly() {
-		boolean oldLeafOnly = leafOnly;
-		boolean oldLeafOnlyESet = leafOnlyESet;
-		leafOnly = LEAF_ONLY_EDEFAULT;
-		leafOnlyESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.OUTLINE_CODE__LEAF_ONLY, oldLeafOnly, LEAF_ONLY_EDEFAULT, oldLeafOnlyESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLeafOnly() {
-		return leafOnlyESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isAllLevelsRequired() {
-		return allLevelsRequired;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAllLevelsRequired(boolean newAllLevelsRequired) {
-		boolean oldAllLevelsRequired = allLevelsRequired;
-		allLevelsRequired = newAllLevelsRequired;
-		boolean oldAllLevelsRequiredESet = allLevelsRequiredESet;
-		allLevelsRequiredESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__ALL_LEVELS_REQUIRED, oldAllLevelsRequired, allLevelsRequired, !oldAllLevelsRequiredESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetAllLevelsRequired() {
-		boolean oldAllLevelsRequired = allLevelsRequired;
-		boolean oldAllLevelsRequiredESet = allLevelsRequiredESet;
-		allLevelsRequired = ALL_LEVELS_REQUIRED_EDEFAULT;
-		allLevelsRequiredESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.OUTLINE_CODE__ALL_LEVELS_REQUIRED, oldAllLevelsRequired, ALL_LEVELS_REQUIRED_EDEFAULT, oldAllLevelsRequiredESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetAllLevelsRequired() {
-		return allLevelsRequiredESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isOnlyTableValuesAllowed() {
-		return onlyTableValuesAllowed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOnlyTableValuesAllowed(boolean newOnlyTableValuesAllowed) {
-		boolean oldOnlyTableValuesAllowed = onlyTableValuesAllowed;
-		onlyTableValuesAllowed = newOnlyTableValuesAllowed;
-		boolean oldOnlyTableValuesAllowedESet = onlyTableValuesAllowedESet;
-		onlyTableValuesAllowedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__ONLY_TABLE_VALUES_ALLOWED, oldOnlyTableValuesAllowed, onlyTableValuesAllowed, !oldOnlyTableValuesAllowedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetOnlyTableValuesAllowed() {
-		boolean oldOnlyTableValuesAllowed = onlyTableValuesAllowed;
-		boolean oldOnlyTableValuesAllowedESet = onlyTableValuesAllowedESet;
-		onlyTableValuesAllowed = ONLY_TABLE_VALUES_ALLOWED_EDEFAULT;
-		onlyTableValuesAllowedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.OUTLINE_CODE__ONLY_TABLE_VALUES_ALLOWED, oldOnlyTableValuesAllowed, ONLY_TABLE_VALUES_ALLOWED_EDEFAULT, oldOnlyTableValuesAllowedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetOnlyTableValuesAllowed() {
-		return onlyTableValuesAllowedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Masks getMasks() {
-		return masks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMasks(Masks newMasks, NotificationChain msgs) {
-		Masks oldMasks = masks;
-		masks = newMasks;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__MASKS, oldMasks, newMasks);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMasks(Masks newMasks) {
-		if (newMasks != masks) {
-			NotificationChain msgs = null;
-			if (masks != null)
-				msgs = ((InternalEObject)masks).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.OUTLINE_CODE__MASKS, null, msgs);
-			if (newMasks != null)
-				msgs = ((InternalEObject)newMasks).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.OUTLINE_CODE__MASKS, null, msgs);
-			msgs = basicSetMasks(newMasks, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.OUTLINE_CODE__MASKS, newMasks, newMasks));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.OUTLINE_CODE__VALUES:
-					return basicSetValues(null, msgs);
-				case MsprojectPackage.OUTLINE_CODE__MASKS:
-					return basicSetMasks(null, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE__FIELD_ID:
-				return getFieldID();
-			case MsprojectPackage.OUTLINE_CODE__FIELD_NAME:
-				return getFieldName();
-			case MsprojectPackage.OUTLINE_CODE__ALIAS:
-				return getAlias();
-			case MsprojectPackage.OUTLINE_CODE__PHONETIC_ALIAS:
-				return getPhoneticAlias();
-			case MsprojectPackage.OUTLINE_CODE__VALUES:
-				return getValues();
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE:
-				return isEnterprise() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE_OUTLINE_CODE_ALIAS:
-				return getEnterpriseOutlineCodeAlias();
-			case MsprojectPackage.OUTLINE_CODE__RESOURCE_SUBSTITUTION_ENABLED:
-				return isResourceSubstitutionEnabled() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.OUTLINE_CODE__LEAF_ONLY:
-				return isLeafOnly() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.OUTLINE_CODE__ALL_LEVELS_REQUIRED:
-				return isAllLevelsRequired() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.OUTLINE_CODE__ONLY_TABLE_VALUES_ALLOWED:
-				return isOnlyTableValuesAllowed() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.OUTLINE_CODE__MASKS:
-				return getMasks();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE__FIELD_ID:
-				setFieldID((String)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__FIELD_NAME:
-				setFieldName((String)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ALIAS:
-				setAlias((String)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__PHONETIC_ALIAS:
-				setPhoneticAlias((String)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__VALUES:
-				setValues((Values)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE:
-				setEnterprise(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE_OUTLINE_CODE_ALIAS:
-				setEnterpriseOutlineCodeAlias((BigInteger)newValue);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__RESOURCE_SUBSTITUTION_ENABLED:
-				setResourceSubstitutionEnabled(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.OUTLINE_CODE__LEAF_ONLY:
-				setLeafOnly(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ALL_LEVELS_REQUIRED:
-				setAllLevelsRequired(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ONLY_TABLE_VALUES_ALLOWED:
-				setOnlyTableValuesAllowed(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.OUTLINE_CODE__MASKS:
-				setMasks((Masks)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE__FIELD_ID:
-				setFieldID(FIELD_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__FIELD_NAME:
-				setFieldName(FIELD_NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ALIAS:
-				setAlias(ALIAS_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__PHONETIC_ALIAS:
-				setPhoneticAlias(PHONETIC_ALIAS_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__VALUES:
-				setValues((Values)null);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE:
-				unsetEnterprise();
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE_OUTLINE_CODE_ALIAS:
-				setEnterpriseOutlineCodeAlias(ENTERPRISE_OUTLINE_CODE_ALIAS_EDEFAULT);
-				return;
-			case MsprojectPackage.OUTLINE_CODE__RESOURCE_SUBSTITUTION_ENABLED:
-				unsetResourceSubstitutionEnabled();
-				return;
-			case MsprojectPackage.OUTLINE_CODE__LEAF_ONLY:
-				unsetLeafOnly();
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ALL_LEVELS_REQUIRED:
-				unsetAllLevelsRequired();
-				return;
-			case MsprojectPackage.OUTLINE_CODE__ONLY_TABLE_VALUES_ALLOWED:
-				unsetOnlyTableValuesAllowed();
-				return;
-			case MsprojectPackage.OUTLINE_CODE__MASKS:
-				setMasks((Masks)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODE__FIELD_ID:
-				return FIELD_ID_EDEFAULT == null ? fieldID != null : !FIELD_ID_EDEFAULT.equals(fieldID);
-			case MsprojectPackage.OUTLINE_CODE__FIELD_NAME:
-				return FIELD_NAME_EDEFAULT == null ? fieldName != null : !FIELD_NAME_EDEFAULT.equals(fieldName);
-			case MsprojectPackage.OUTLINE_CODE__ALIAS:
-				return ALIAS_EDEFAULT == null ? alias != null : !ALIAS_EDEFAULT.equals(alias);
-			case MsprojectPackage.OUTLINE_CODE__PHONETIC_ALIAS:
-				return PHONETIC_ALIAS_EDEFAULT == null ? phoneticAlias != null : !PHONETIC_ALIAS_EDEFAULT.equals(phoneticAlias);
-			case MsprojectPackage.OUTLINE_CODE__VALUES:
-				return values != null;
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE:
-				return isSetEnterprise();
-			case MsprojectPackage.OUTLINE_CODE__ENTERPRISE_OUTLINE_CODE_ALIAS:
-				return ENTERPRISE_OUTLINE_CODE_ALIAS_EDEFAULT == null ? enterpriseOutlineCodeAlias != null : !ENTERPRISE_OUTLINE_CODE_ALIAS_EDEFAULT.equals(enterpriseOutlineCodeAlias);
-			case MsprojectPackage.OUTLINE_CODE__RESOURCE_SUBSTITUTION_ENABLED:
-				return isSetResourceSubstitutionEnabled();
-			case MsprojectPackage.OUTLINE_CODE__LEAF_ONLY:
-				return isSetLeafOnly();
-			case MsprojectPackage.OUTLINE_CODE__ALL_LEVELS_REQUIRED:
-				return isSetAllLevelsRequired();
-			case MsprojectPackage.OUTLINE_CODE__ONLY_TABLE_VALUES_ALLOWED:
-				return isSetOnlyTableValuesAllowed();
-			case MsprojectPackage.OUTLINE_CODE__MASKS:
-				return masks != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (fieldID: ");
-		result.append(fieldID);
-		result.append(", fieldName: ");
-		result.append(fieldName);
-		result.append(", alias: ");
-		result.append(alias);
-		result.append(", phoneticAlias: ");
-		result.append(phoneticAlias);
-		result.append(", enterprise: ");
-		if (enterpriseESet) result.append(enterprise); else result.append("<unset>");
-		result.append(", enterpriseOutlineCodeAlias: ");
-		result.append(enterpriseOutlineCodeAlias);
-		result.append(", resourceSubstitutionEnabled: ");
-		if (resourceSubstitutionEnabledESet) result.append(resourceSubstitutionEnabled); else result.append("<unset>");
-		result.append(", leafOnly: ");
-		if (leafOnlyESet) result.append(leafOnly); else result.append("<unset>");
-		result.append(", allLevelsRequired: ");
-		if (allLevelsRequiredESet) result.append(allLevelsRequired); else result.append("<unset>");
-		result.append(", onlyTableValuesAllowed: ");
-		if (onlyTableValuesAllowedESet) result.append(onlyTableValuesAllowed); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //OutlineCodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCodesImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCodesImpl.java
deleted file mode 100644
index e6cd3c7..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/OutlineCodesImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutlineCodesImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode;
-import org.eclipse.epf.msproject.OutlineCodes;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Outline Codes</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.OutlineCodesImpl#getOutlineCode <em>Outline Code</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OutlineCodesImpl extends EObjectImpl implements OutlineCodes {
-	/**
-	 * The cached value of the '{@link #getOutlineCode() <em>Outline Code</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineCode()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList outlineCode = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OutlineCodesImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getOutlineCodes();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOutlineCode() {
-		if (outlineCode == null) {
-			outlineCode = new EObjectContainmentEList(OutlineCode.class, this, MsprojectPackage.OUTLINE_CODES__OUTLINE_CODE);
-		}
-		return outlineCode;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.OUTLINE_CODES__OUTLINE_CODE:
-					return ((InternalEList)getOutlineCode()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODES__OUTLINE_CODE:
-				return getOutlineCode();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODES__OUTLINE_CODE:
-				getOutlineCode().clear();
-				getOutlineCode().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODES__OUTLINE_CODE:
-				getOutlineCode().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.OUTLINE_CODES__OUTLINE_CODE:
-				return outlineCode != null && !outlineCode.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //OutlineCodesImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/PredecessorLinkImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/PredecessorLinkImpl.java
deleted file mode 100644
index 376a398..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/PredecessorLinkImpl.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PredecessorLinkImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.PredecessorLink;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Predecessor Link</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getPredecessorUID <em>Predecessor UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#isCrossProject <em>Cross Project</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getCrossProjectName <em>Cross Project Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getLinkLag <em>Link Lag</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.PredecessorLinkImpl#getLagFormat <em>Lag Format</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PredecessorLinkImpl extends EObjectImpl implements PredecessorLink {
-	/**
-	 * The default value of the '{@link #getPredecessorUID() <em>Predecessor UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPredecessorUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PREDECESSOR_UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPredecessorUID() <em>Predecessor UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPredecessorUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger predecessorUID = PREDECESSOR_UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger type = TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isCrossProject() <em>Cross Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isCrossProject()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean CROSS_PROJECT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isCrossProject() <em>Cross Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isCrossProject()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean crossProject = CROSS_PROJECT_EDEFAULT;
-
-	/**
-	 * This is true if the Cross Project attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean crossProjectESet = false;
-
-	/**
-	 * The default value of the '{@link #getCrossProjectName() <em>Cross Project Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCrossProjectName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CROSS_PROJECT_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCrossProjectName() <em>Cross Project Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCrossProjectName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String crossProjectName = CROSS_PROJECT_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLinkLag() <em>Link Lag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkLag()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LINK_LAG_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLinkLag() <em>Link Lag</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkLag()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger linkLag = LINK_LAG_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLagFormat() <em>Lag Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLagFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LAG_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLagFormat() <em>Lag Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLagFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger lagFormat = LAG_FORMAT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PredecessorLinkImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getPredecessorLink();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getPredecessorUID() {
-		return predecessorUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPredecessorUID(BigInteger newPredecessorUID) {
-		BigInteger oldPredecessorUID = predecessorUID;
-		predecessorUID = newPredecessorUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID, oldPredecessorUID, predecessorUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(BigInteger newType) {
-		BigInteger oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isCrossProject() {
-		return crossProject;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCrossProject(boolean newCrossProject) {
-		boolean oldCrossProject = crossProject;
-		crossProject = newCrossProject;
-		boolean oldCrossProjectESet = crossProjectESet;
-		crossProjectESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT, oldCrossProject, crossProject, !oldCrossProjectESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCrossProject() {
-		boolean oldCrossProject = crossProject;
-		boolean oldCrossProjectESet = crossProjectESet;
-		crossProject = CROSS_PROJECT_EDEFAULT;
-		crossProjectESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT, oldCrossProject, CROSS_PROJECT_EDEFAULT, oldCrossProjectESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCrossProject() {
-		return crossProjectESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCrossProjectName() {
-		return crossProjectName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCrossProjectName(String newCrossProjectName) {
-		String oldCrossProjectName = crossProjectName;
-		crossProjectName = newCrossProjectName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME, oldCrossProjectName, crossProjectName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLinkLag() {
-		return linkLag;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLinkLag(BigInteger newLinkLag) {
-		BigInteger oldLinkLag = linkLag;
-		linkLag = newLinkLag;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__LINK_LAG, oldLinkLag, linkLag));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLagFormat() {
-		return lagFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLagFormat(BigInteger newLagFormat) {
-		BigInteger oldLagFormat = lagFormat;
-		lagFormat = newLagFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT, oldLagFormat, lagFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
-				return getPredecessorUID();
-			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
-				return getType();
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
-				return isCrossProject() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
-				return getCrossProjectName();
-			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
-				return getLinkLag();
-			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
-				return getLagFormat();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
-				setPredecessorUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
-				setType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
-				setCrossProject(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
-				setCrossProjectName((String)newValue);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
-				setLinkLag((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
-				setLagFormat((BigInteger)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
-				setPredecessorUID(PREDECESSOR_UID_EDEFAULT);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
-				unsetCrossProject();
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
-				setCrossProjectName(CROSS_PROJECT_NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
-				setLinkLag(LINK_LAG_EDEFAULT);
-				return;
-			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
-				setLagFormat(LAG_FORMAT_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PREDECESSOR_LINK__PREDECESSOR_UID:
-				return PREDECESSOR_UID_EDEFAULT == null ? predecessorUID != null : !PREDECESSOR_UID_EDEFAULT.equals(predecessorUID);
-			case MsprojectPackage.PREDECESSOR_LINK__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT:
-				return isSetCrossProject();
-			case MsprojectPackage.PREDECESSOR_LINK__CROSS_PROJECT_NAME:
-				return CROSS_PROJECT_NAME_EDEFAULT == null ? crossProjectName != null : !CROSS_PROJECT_NAME_EDEFAULT.equals(crossProjectName);
-			case MsprojectPackage.PREDECESSOR_LINK__LINK_LAG:
-				return LINK_LAG_EDEFAULT == null ? linkLag != null : !LINK_LAG_EDEFAULT.equals(linkLag);
-			case MsprojectPackage.PREDECESSOR_LINK__LAG_FORMAT:
-				return LAG_FORMAT_EDEFAULT == null ? lagFormat != null : !LAG_FORMAT_EDEFAULT.equals(lagFormat);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (predecessorUID: ");
-		result.append(predecessorUID);
-		result.append(", type: ");
-		result.append(type);
-		result.append(", crossProject: ");
-		if (crossProjectESet) result.append(crossProject); else result.append("<unset>");
-		result.append(", crossProjectName: ");
-		result.append(crossProjectName);
-		result.append(", linkLag: ");
-		result.append(linkLag);
-		result.append(", lagFormat: ");
-		result.append(lagFormat);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PredecessorLinkImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ProjectImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ProjectImpl.java
deleted file mode 100644
index f4f4d07..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ProjectImpl.java
+++ /dev/null
@@ -1,4771 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProjectImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.Assignments;
-import org.eclipse.epf.msproject.Calendars;
-import org.eclipse.epf.msproject.ExtendedAttributes;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCodes;
-import org.eclipse.epf.msproject.Project;
-import org.eclipse.epf.msproject.Resources;
-import org.eclipse.epf.msproject.Tasks;
-import org.eclipse.epf.msproject.WBSMasks;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Project</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getTitle <em>Title</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getSubject <em>Subject</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCategory <em>Category</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCompany <em>Company</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getManager <em>Manager</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getAuthor <em>Author</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCreationDate <em>Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getRevision <em>Revision</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getLastSaved <em>Last Saved</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isScheduleFromStart <em>Schedule From Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getStartDate <em>Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getFinishDate <em>Finish Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getFYStartDate <em>FY Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCriticalSlackLimit <em>Critical Slack Limit</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCurrencyDigits <em>Currency Digits</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCurrencySymbol <em>Currency Symbol</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCurrencySymbolPosition <em>Currency Symbol Position</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCalendarUID <em>Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDefaultStartTime <em>Default Start Time</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDefaultFinishTime <em>Default Finish Time</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getMinutesPerDay <em>Minutes Per Day</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getMinutesPerWeek <em>Minutes Per Week</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDaysPerMonth <em>Days Per Month</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDefaultTaskType <em>Default Task Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDefaultFixedCostAccrual <em>Default Fixed Cost Accrual</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDefaultStandardRate <em>Default Standard Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDefaultOvertimeRate <em>Default Overtime Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDurationFormat <em>Duration Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getWorkFormat <em>Work Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isEditableActualCosts <em>Editable Actual Costs</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isHonorConstraints <em>Honor Constraints</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getEarnedValueMethod <em>Earned Value Method</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isInsertedProjectsLikeSummary <em>Inserted Projects Like Summary</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isMultipleCriticalPaths <em>Multiple Critical Paths</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isNewTasksEffortDriven <em>New Tasks Effort Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isNewTasksEstimated <em>New Tasks Estimated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isSplitsInProgressTasks <em>Splits In Progress Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isSpreadActualCost <em>Spread Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isSpreadPercentComplete <em>Spread Percent Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isTaskUpdatesResource <em>Task Updates Resource</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isFiscalYearStart <em>Fiscal Year Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getWeekStartDay <em>Week Start Day</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isMoveCompletedEndsBack <em>Move Completed Ends Back</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isMoveRemainingStartsBack <em>Move Remaining Starts Back</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isMoveRemainingStartsForward <em>Move Remaining Starts Forward</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isMoveCompletedEndsForward <em>Move Completed Ends Forward</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getBaselineForEarnedValue <em>Baseline For Earned Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isAutoAddNewResourcesAndTasks <em>Auto Add New Resources And Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getStatusDate <em>Status Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCurrentDate <em>Current Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isMicrosoftProjectServerURL <em>Microsoft Project Server URL</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isAutolink <em>Autolink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getNewTaskStartDate <em>New Task Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getDefaultTaskEVMethod <em>Default Task EV Method</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isProjectExternallyEdited <em>Project Externally Edited</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getExtendedCreationDate <em>Extended Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isActualsInSync <em>Actuals In Sync</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isRemoveFileProperties <em>Remove File Properties</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#isAdminProject <em>Admin Project</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getOutlineCodes <em>Outline Codes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getWBSMasks <em>WBS Masks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getExtendedAttributes <em>Extended Attributes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getCalendars <em>Calendars</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getTasks <em>Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getResources <em>Resources</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ProjectImpl#getAssignments <em>Assignments</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProjectImpl extends EObjectImpl implements Project {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTitle() <em>Title</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTitle()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TITLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTitle() <em>Title</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTitle()
-	 * @generated
-	 * @ordered
-	 */
-	protected String title = TITLE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSubject() <em>Subject</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubject()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SUBJECT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSubject() <em>Subject</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubject()
-	 * @generated
-	 * @ordered
-	 */
-	protected String subject = SUBJECT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCategory() <em>Category</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCategory()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CATEGORY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCategory() <em>Category</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCategory()
-	 * @generated
-	 * @ordered
-	 */
-	protected String category = CATEGORY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCompany() <em>Company</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCompany()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COMPANY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCompany() <em>Company</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCompany()
-	 * @generated
-	 * @ordered
-	 */
-	protected String company = COMPANY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getManager() <em>Manager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManager()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MANAGER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getManager() <em>Manager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManager()
-	 * @generated
-	 * @ordered
-	 */
-	protected String manager = MANAGER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAuthor() <em>Author</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthor()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String AUTHOR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAuthor() <em>Author</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthor()
-	 * @generated
-	 * @ordered
-	 */
-	protected String author = AUTHOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCreationDate() <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CREATION_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCreationDate() <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object creationDate = CREATION_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRevision() <em>Revision</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRevision()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger REVISION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRevision() <em>Revision</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRevision()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger revision = REVISION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLastSaved() <em>Last Saved</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLastSaved()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object LAST_SAVED_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLastSaved() <em>Last Saved</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLastSaved()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object lastSaved = LAST_SAVED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isScheduleFromStart() <em>Schedule From Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isScheduleFromStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SCHEDULE_FROM_START_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isScheduleFromStart() <em>Schedule From Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isScheduleFromStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean scheduleFromStart = SCHEDULE_FROM_START_EDEFAULT;
-
-	/**
-	 * This is true if the Schedule From Start attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean scheduleFromStartESet = false;
-
-	/**
-	 * The default value of the '{@link #getStartDate() <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object START_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStartDate() <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object startDate = START_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinishDate() <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FINISH_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinishDate() <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object finishDate = FINISH_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFYStartDate() <em>FY Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFYStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger FYSTART_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFYStartDate() <em>FY Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFYStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger fYStartDate = FYSTART_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCriticalSlackLimit() <em>Critical Slack Limit</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCriticalSlackLimit()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CRITICAL_SLACK_LIMIT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCriticalSlackLimit() <em>Critical Slack Limit</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCriticalSlackLimit()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger criticalSlackLimit = CRITICAL_SLACK_LIMIT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCurrencyDigits() <em>Currency Digits</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrencyDigits()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CURRENCY_DIGITS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCurrencyDigits() <em>Currency Digits</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrencyDigits()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger currencyDigits = CURRENCY_DIGITS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCurrencySymbol() <em>Currency Symbol</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrencySymbol()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CURRENCY_SYMBOL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCurrencySymbol() <em>Currency Symbol</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrencySymbol()
-	 * @generated
-	 * @ordered
-	 */
-	protected String currencySymbol = CURRENCY_SYMBOL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCurrencySymbolPosition() <em>Currency Symbol Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrencySymbolPosition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CURRENCY_SYMBOL_POSITION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCurrencySymbolPosition() <em>Currency Symbol Position</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrencySymbolPosition()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger currencySymbolPosition = CURRENCY_SYMBOL_POSITION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCalendarUID() <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CALENDAR_UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCalendarUID() <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger calendarUID = CALENDAR_UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDefaultStartTime() <em>Default Start Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultStartTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object DEFAULT_START_TIME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultStartTime() <em>Default Start Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultStartTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object defaultStartTime = DEFAULT_START_TIME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDefaultFinishTime() <em>Default Finish Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultFinishTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object DEFAULT_FINISH_TIME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultFinishTime() <em>Default Finish Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultFinishTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object defaultFinishTime = DEFAULT_FINISH_TIME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinutesPerDay() <em>Minutes Per Day</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinutesPerDay()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger MINUTES_PER_DAY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMinutesPerDay() <em>Minutes Per Day</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinutesPerDay()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger minutesPerDay = MINUTES_PER_DAY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinutesPerWeek() <em>Minutes Per Week</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinutesPerWeek()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger MINUTES_PER_WEEK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMinutesPerWeek() <em>Minutes Per Week</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinutesPerWeek()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger minutesPerWeek = MINUTES_PER_WEEK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDaysPerMonth() <em>Days Per Month</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDaysPerMonth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DAYS_PER_MONTH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDaysPerMonth() <em>Days Per Month</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDaysPerMonth()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger daysPerMonth = DAYS_PER_MONTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDefaultTaskType() <em>Default Task Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultTaskType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DEFAULT_TASK_TYPE_EDEFAULT = new BigInteger("1");
-
-	/**
-	 * The cached value of the '{@link #getDefaultTaskType() <em>Default Task Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultTaskType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger defaultTaskType = DEFAULT_TASK_TYPE_EDEFAULT;
-
-	/**
-	 * This is true if the Default Task Type attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean defaultTaskTypeESet = false;
-
-	/**
-	 * The default value of the '{@link #getDefaultFixedCostAccrual() <em>Default Fixed Cost Accrual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultFixedCostAccrual()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DEFAULT_FIXED_COST_ACCRUAL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultFixedCostAccrual() <em>Default Fixed Cost Accrual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultFixedCostAccrual()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger defaultFixedCostAccrual = DEFAULT_FIXED_COST_ACCRUAL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDefaultStandardRate() <em>Default Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultStandardRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float DEFAULT_STANDARD_RATE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getDefaultStandardRate() <em>Default Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultStandardRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected float defaultStandardRate = DEFAULT_STANDARD_RATE_EDEFAULT;
-
-	/**
-	 * This is true if the Default Standard Rate attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean defaultStandardRateESet = false;
-
-	/**
-	 * The default value of the '{@link #getDefaultOvertimeRate() <em>Default Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultOvertimeRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float DEFAULT_OVERTIME_RATE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getDefaultOvertimeRate() <em>Default Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultOvertimeRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected float defaultOvertimeRate = DEFAULT_OVERTIME_RATE_EDEFAULT;
-
-	/**
-	 * This is true if the Default Overtime Rate attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean defaultOvertimeRateESet = false;
-
-	/**
-	 * The default value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DURATION_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger durationFormat = DURATION_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWorkFormat() <em>Work Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger WORK_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWorkFormat() <em>Work Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger workFormat = WORK_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isEditableActualCosts() <em>Editable Actual Costs</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEditableActualCosts()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean EDITABLE_ACTUAL_COSTS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isEditableActualCosts() <em>Editable Actual Costs</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEditableActualCosts()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean editableActualCosts = EDITABLE_ACTUAL_COSTS_EDEFAULT;
-
-	/**
-	 * This is true if the Editable Actual Costs attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean editableActualCostsESet = false;
-
-	/**
-	 * The default value of the '{@link #isHonorConstraints() <em>Honor Constraints</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHonorConstraints()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean HONOR_CONSTRAINTS_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isHonorConstraints() <em>Honor Constraints</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHonorConstraints()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean honorConstraints = HONOR_CONSTRAINTS_EDEFAULT;
-
-	/**
-	 * This is true if the Honor Constraints attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean honorConstraintsESet = false;
-
-	/**
-	 * The default value of the '{@link #getEarnedValueMethod() <em>Earned Value Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarnedValueMethod()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger EARNED_VALUE_METHOD_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEarnedValueMethod() <em>Earned Value Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarnedValueMethod()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger earnedValueMethod = EARNED_VALUE_METHOD_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isInsertedProjectsLikeSummary() <em>Inserted Projects Like Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isInsertedProjectsLikeSummary()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean INSERTED_PROJECTS_LIKE_SUMMARY_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isInsertedProjectsLikeSummary() <em>Inserted Projects Like Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isInsertedProjectsLikeSummary()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean insertedProjectsLikeSummary = INSERTED_PROJECTS_LIKE_SUMMARY_EDEFAULT;
-
-	/**
-	 * This is true if the Inserted Projects Like Summary attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean insertedProjectsLikeSummaryESet = false;
-
-	/**
-	 * The default value of the '{@link #isMultipleCriticalPaths() <em>Multiple Critical Paths</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultipleCriticalPaths()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MULTIPLE_CRITICAL_PATHS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMultipleCriticalPaths() <em>Multiple Critical Paths</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultipleCriticalPaths()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean multipleCriticalPaths = MULTIPLE_CRITICAL_PATHS_EDEFAULT;
-
-	/**
-	 * This is true if the Multiple Critical Paths attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean multipleCriticalPathsESet = false;
-
-	/**
-	 * The default value of the '{@link #isNewTasksEffortDriven() <em>New Tasks Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNewTasksEffortDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEW_TASKS_EFFORT_DRIVEN_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isNewTasksEffortDriven() <em>New Tasks Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNewTasksEffortDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean newTasksEffortDriven = NEW_TASKS_EFFORT_DRIVEN_EDEFAULT;
-
-	/**
-	 * This is true if the New Tasks Effort Driven attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean newTasksEffortDrivenESet = false;
-
-	/**
-	 * The default value of the '{@link #isNewTasksEstimated() <em>New Tasks Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNewTasksEstimated()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEW_TASKS_ESTIMATED_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isNewTasksEstimated() <em>New Tasks Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNewTasksEstimated()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean newTasksEstimated = NEW_TASKS_ESTIMATED_EDEFAULT;
-
-	/**
-	 * This is true if the New Tasks Estimated attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean newTasksEstimatedESet = false;
-
-	/**
-	 * The default value of the '{@link #isSplitsInProgressTasks() <em>Splits In Progress Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSplitsInProgressTasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SPLITS_IN_PROGRESS_TASKS_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isSplitsInProgressTasks() <em>Splits In Progress Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSplitsInProgressTasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean splitsInProgressTasks = SPLITS_IN_PROGRESS_TASKS_EDEFAULT;
-
-	/**
-	 * This is true if the Splits In Progress Tasks attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean splitsInProgressTasksESet = false;
-
-	/**
-	 * The default value of the '{@link #isSpreadActualCost() <em>Spread Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSpreadActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SPREAD_ACTUAL_COST_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isSpreadActualCost() <em>Spread Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSpreadActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean spreadActualCost = SPREAD_ACTUAL_COST_EDEFAULT;
-
-	/**
-	 * This is true if the Spread Actual Cost attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean spreadActualCostESet = false;
-
-	/**
-	 * The default value of the '{@link #isSpreadPercentComplete() <em>Spread Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSpreadPercentComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SPREAD_PERCENT_COMPLETE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isSpreadPercentComplete() <em>Spread Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSpreadPercentComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean spreadPercentComplete = SPREAD_PERCENT_COMPLETE_EDEFAULT;
-
-	/**
-	 * This is true if the Spread Percent Complete attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean spreadPercentCompleteESet = false;
-
-	/**
-	 * The default value of the '{@link #isTaskUpdatesResource() <em>Task Updates Resource</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isTaskUpdatesResource()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean TASK_UPDATES_RESOURCE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isTaskUpdatesResource() <em>Task Updates Resource</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isTaskUpdatesResource()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean taskUpdatesResource = TASK_UPDATES_RESOURCE_EDEFAULT;
-
-	/**
-	 * This is true if the Task Updates Resource attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean taskUpdatesResourceESet = false;
-
-	/**
-	 * The default value of the '{@link #isFiscalYearStart() <em>Fiscal Year Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isFiscalYearStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean FISCAL_YEAR_START_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isFiscalYearStart() <em>Fiscal Year Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isFiscalYearStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean fiscalYearStart = FISCAL_YEAR_START_EDEFAULT;
-
-	/**
-	 * This is true if the Fiscal Year Start attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean fiscalYearStartESet = false;
-
-	/**
-	 * The default value of the '{@link #getWeekStartDay() <em>Week Start Day</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeekStartDay()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger WEEK_START_DAY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWeekStartDay() <em>Week Start Day</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeekStartDay()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger weekStartDay = WEEK_START_DAY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isMoveCompletedEndsBack() <em>Move Completed Ends Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveCompletedEndsBack()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MOVE_COMPLETED_ENDS_BACK_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMoveCompletedEndsBack() <em>Move Completed Ends Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveCompletedEndsBack()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveCompletedEndsBack = MOVE_COMPLETED_ENDS_BACK_EDEFAULT;
-
-	/**
-	 * This is true if the Move Completed Ends Back attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveCompletedEndsBackESet = false;
-
-	/**
-	 * The default value of the '{@link #isMoveRemainingStartsBack() <em>Move Remaining Starts Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveRemainingStartsBack()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MOVE_REMAINING_STARTS_BACK_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMoveRemainingStartsBack() <em>Move Remaining Starts Back</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveRemainingStartsBack()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveRemainingStartsBack = MOVE_REMAINING_STARTS_BACK_EDEFAULT;
-
-	/**
-	 * This is true if the Move Remaining Starts Back attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveRemainingStartsBackESet = false;
-
-	/**
-	 * The default value of the '{@link #isMoveRemainingStartsForward() <em>Move Remaining Starts Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveRemainingStartsForward()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MOVE_REMAINING_STARTS_FORWARD_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMoveRemainingStartsForward() <em>Move Remaining Starts Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveRemainingStartsForward()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveRemainingStartsForward = MOVE_REMAINING_STARTS_FORWARD_EDEFAULT;
-
-	/**
-	 * This is true if the Move Remaining Starts Forward attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveRemainingStartsForwardESet = false;
-
-	/**
-	 * The default value of the '{@link #isMoveCompletedEndsForward() <em>Move Completed Ends Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveCompletedEndsForward()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MOVE_COMPLETED_ENDS_FORWARD_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMoveCompletedEndsForward() <em>Move Completed Ends Forward</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMoveCompletedEndsForward()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveCompletedEndsForward = MOVE_COMPLETED_ENDS_FORWARD_EDEFAULT;
-
-	/**
-	 * This is true if the Move Completed Ends Forward attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean moveCompletedEndsForwardESet = false;
-
-	/**
-	 * The default value of the '{@link #getBaselineForEarnedValue() <em>Baseline For Earned Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaselineForEarnedValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger BASELINE_FOR_EARNED_VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBaselineForEarnedValue() <em>Baseline For Earned Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaselineForEarnedValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger baselineForEarnedValue = BASELINE_FOR_EARNED_VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isAutoAddNewResourcesAndTasks() <em>Auto Add New Resources And Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAutoAddNewResourcesAndTasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean AUTO_ADD_NEW_RESOURCES_AND_TASKS_EDEFAULT = true;
-
-	/**
-	 * The cached value of the '{@link #isAutoAddNewResourcesAndTasks() <em>Auto Add New Resources And Tasks</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAutoAddNewResourcesAndTasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean autoAddNewResourcesAndTasks = AUTO_ADD_NEW_RESOURCES_AND_TASKS_EDEFAULT;
-
-	/**
-	 * This is true if the Auto Add New Resources And Tasks attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean autoAddNewResourcesAndTasksESet = false;
-
-	/**
-	 * The default value of the '{@link #getStatusDate() <em>Status Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStatusDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object STATUS_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStatusDate() <em>Status Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStatusDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object statusDate = STATUS_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCurrentDate() <em>Current Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrentDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CURRENT_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCurrentDate() <em>Current Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCurrentDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object currentDate = CURRENT_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isMicrosoftProjectServerURL() <em>Microsoft Project Server URL</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMicrosoftProjectServerURL()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MICROSOFT_PROJECT_SERVER_URL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMicrosoftProjectServerURL() <em>Microsoft Project Server URL</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMicrosoftProjectServerURL()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean microsoftProjectServerURL = MICROSOFT_PROJECT_SERVER_URL_EDEFAULT;
-
-	/**
-	 * This is true if the Microsoft Project Server URL attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean microsoftProjectServerURLESet = false;
-
-	/**
-	 * The default value of the '{@link #isAutolink() <em>Autolink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAutolink()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean AUTOLINK_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isAutolink() <em>Autolink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAutolink()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean autolink = AUTOLINK_EDEFAULT;
-
-	/**
-	 * This is true if the Autolink attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean autolinkESet = false;
-
-	/**
-	 * The default value of the '{@link #getNewTaskStartDate() <em>New Task Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNewTaskStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger NEW_TASK_START_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNewTaskStartDate() <em>New Task Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNewTaskStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger newTaskStartDate = NEW_TASK_START_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDefaultTaskEVMethod() <em>Default Task EV Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultTaskEVMethod()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DEFAULT_TASK_EV_METHOD_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultTaskEVMethod() <em>Default Task EV Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultTaskEVMethod()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger defaultTaskEVMethod = DEFAULT_TASK_EV_METHOD_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isProjectExternallyEdited() <em>Project Externally Edited</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isProjectExternallyEdited()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean PROJECT_EXTERNALLY_EDITED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isProjectExternallyEdited() <em>Project Externally Edited</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isProjectExternallyEdited()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean projectExternallyEdited = PROJECT_EXTERNALLY_EDITED_EDEFAULT;
-
-	/**
-	 * This is true if the Project Externally Edited attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean projectExternallyEditedESet = false;
-
-	/**
-	 * The default value of the '{@link #getExtendedCreationDate() <em>Extended Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExtendedCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object EXTENDED_CREATION_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getExtendedCreationDate() <em>Extended Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExtendedCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object extendedCreationDate = EXTENDED_CREATION_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isActualsInSync() <em>Actuals In Sync</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isActualsInSync()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ACTUALS_IN_SYNC_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isActualsInSync() <em>Actuals In Sync</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isActualsInSync()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean actualsInSync = ACTUALS_IN_SYNC_EDEFAULT;
-
-	/**
-	 * This is true if the Actuals In Sync attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean actualsInSyncESet = false;
-
-	/**
-	 * The default value of the '{@link #isRemoveFileProperties() <em>Remove File Properties</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRemoveFileProperties()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean REMOVE_FILE_PROPERTIES_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isRemoveFileProperties() <em>Remove File Properties</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRemoveFileProperties()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean removeFileProperties = REMOVE_FILE_PROPERTIES_EDEFAULT;
-
-	/**
-	 * This is true if the Remove File Properties attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean removeFilePropertiesESet = false;
-
-	/**
-	 * The default value of the '{@link #isAdminProject() <em>Admin Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAdminProject()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ADMIN_PROJECT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isAdminProject() <em>Admin Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isAdminProject()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean adminProject = ADMIN_PROJECT_EDEFAULT;
-
-	/**
-	 * This is true if the Admin Project attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean adminProjectESet = false;
-
-	/**
-	 * The cached value of the '{@link #getOutlineCodes() <em>Outline Codes</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineCodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected OutlineCodes outlineCodes = null;
-
-	/**
-	 * The cached value of the '{@link #getWBSMasks() <em>WBS Masks</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWBSMasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected WBSMasks wBSMasks = null;
-
-	/**
-	 * The cached value of the '{@link #getExtendedAttributes() <em>Extended Attributes</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExtendedAttributes()
-	 * @generated
-	 * @ordered
-	 */
-	protected ExtendedAttributes extendedAttributes = null;
-
-	/**
-	 * The cached value of the '{@link #getCalendars() <em>Calendars</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendars()
-	 * @generated
-	 * @ordered
-	 */
-	protected Calendars calendars = null;
-
-	/**
-	 * The cached value of the '{@link #getTasks() <em>Tasks</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected Tasks tasks = null;
-
-	/**
-	 * The cached value of the '{@link #getResources() <em>Resources</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResources()
-	 * @generated
-	 * @ordered
-	 */
-	protected Resources resources = null;
-
-	/**
-	 * The cached value of the '{@link #getAssignments() <em>Assignments</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssignments()
-	 * @generated
-	 * @ordered
-	 */
-	protected Assignments assignments = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProjectImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getProject();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(String newUID) {
-		String oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTitle(String newTitle) {
-		String oldTitle = title;
-		title = newTitle;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__TITLE, oldTitle, title));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSubject() {
-		return subject;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSubject(String newSubject) {
-		String oldSubject = subject;
-		subject = newSubject;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__SUBJECT, oldSubject, subject));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCategory() {
-		return category;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCategory(String newCategory) {
-		String oldCategory = category;
-		category = newCategory;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CATEGORY, oldCategory, category));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCompany() {
-		return company;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCompany(String newCompany) {
-		String oldCompany = company;
-		company = newCompany;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__COMPANY, oldCompany, company));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getManager() {
-		return manager;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManager(String newManager) {
-		String oldManager = manager;
-		manager = newManager;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MANAGER, oldManager, manager));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAuthor() {
-		return author;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAuthor(String newAuthor) {
-		String oldAuthor = author;
-		author = newAuthor;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__AUTHOR, oldAuthor, author));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getCreationDate() {
-		return creationDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCreationDate(Object newCreationDate) {
-		Object oldCreationDate = creationDate;
-		creationDate = newCreationDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CREATION_DATE, oldCreationDate, creationDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getRevision() {
-		return revision;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRevision(BigInteger newRevision) {
-		BigInteger oldRevision = revision;
-		revision = newRevision;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__REVISION, oldRevision, revision));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getLastSaved() {
-		return lastSaved;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLastSaved(Object newLastSaved) {
-		Object oldLastSaved = lastSaved;
-		lastSaved = newLastSaved;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__LAST_SAVED, oldLastSaved, lastSaved));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isScheduleFromStart() {
-		return scheduleFromStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setScheduleFromStart(boolean newScheduleFromStart) {
-		boolean oldScheduleFromStart = scheduleFromStart;
-		scheduleFromStart = newScheduleFromStart;
-		boolean oldScheduleFromStartESet = scheduleFromStartESet;
-		scheduleFromStartESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__SCHEDULE_FROM_START, oldScheduleFromStart, scheduleFromStart, !oldScheduleFromStartESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetScheduleFromStart() {
-		boolean oldScheduleFromStart = scheduleFromStart;
-		boolean oldScheduleFromStartESet = scheduleFromStartESet;
-		scheduleFromStart = SCHEDULE_FROM_START_EDEFAULT;
-		scheduleFromStartESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__SCHEDULE_FROM_START, oldScheduleFromStart, SCHEDULE_FROM_START_EDEFAULT, oldScheduleFromStartESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetScheduleFromStart() {
-		return scheduleFromStartESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStartDate() {
-		return startDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStartDate(Object newStartDate) {
-		Object oldStartDate = startDate;
-		startDate = newStartDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__START_DATE, oldStartDate, startDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFinishDate() {
-		return finishDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinishDate(Object newFinishDate) {
-		Object oldFinishDate = finishDate;
-		finishDate = newFinishDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__FINISH_DATE, oldFinishDate, finishDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getFYStartDate() {
-		return fYStartDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFYStartDate(BigInteger newFYStartDate) {
-		BigInteger oldFYStartDate = fYStartDate;
-		fYStartDate = newFYStartDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__FYSTART_DATE, oldFYStartDate, fYStartDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCriticalSlackLimit() {
-		return criticalSlackLimit;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCriticalSlackLimit(BigInteger newCriticalSlackLimit) {
-		BigInteger oldCriticalSlackLimit = criticalSlackLimit;
-		criticalSlackLimit = newCriticalSlackLimit;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CRITICAL_SLACK_LIMIT, oldCriticalSlackLimit, criticalSlackLimit));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCurrencyDigits() {
-		return currencyDigits;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCurrencyDigits(BigInteger newCurrencyDigits) {
-		BigInteger oldCurrencyDigits = currencyDigits;
-		currencyDigits = newCurrencyDigits;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CURRENCY_DIGITS, oldCurrencyDigits, currencyDigits));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCurrencySymbol() {
-		return currencySymbol;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCurrencySymbol(String newCurrencySymbol) {
-		String oldCurrencySymbol = currencySymbol;
-		currencySymbol = newCurrencySymbol;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CURRENCY_SYMBOL, oldCurrencySymbol, currencySymbol));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCurrencySymbolPosition() {
-		return currencySymbolPosition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCurrencySymbolPosition(BigInteger newCurrencySymbolPosition) {
-		BigInteger oldCurrencySymbolPosition = currencySymbolPosition;
-		currencySymbolPosition = newCurrencySymbolPosition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CURRENCY_SYMBOL_POSITION, oldCurrencySymbolPosition, currencySymbolPosition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCalendarUID() {
-		return calendarUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCalendarUID(BigInteger newCalendarUID) {
-		BigInteger oldCalendarUID = calendarUID;
-		calendarUID = newCalendarUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CALENDAR_UID, oldCalendarUID, calendarUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getDefaultStartTime() {
-		return defaultStartTime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultStartTime(Object newDefaultStartTime) {
-		Object oldDefaultStartTime = defaultStartTime;
-		defaultStartTime = newDefaultStartTime;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DEFAULT_START_TIME, oldDefaultStartTime, defaultStartTime));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getDefaultFinishTime() {
-		return defaultFinishTime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultFinishTime(Object newDefaultFinishTime) {
-		Object oldDefaultFinishTime = defaultFinishTime;
-		defaultFinishTime = newDefaultFinishTime;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DEFAULT_FINISH_TIME, oldDefaultFinishTime, defaultFinishTime));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getMinutesPerDay() {
-		return minutesPerDay;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinutesPerDay(BigInteger newMinutesPerDay) {
-		BigInteger oldMinutesPerDay = minutesPerDay;
-		minutesPerDay = newMinutesPerDay;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MINUTES_PER_DAY, oldMinutesPerDay, minutesPerDay));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getMinutesPerWeek() {
-		return minutesPerWeek;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinutesPerWeek(BigInteger newMinutesPerWeek) {
-		BigInteger oldMinutesPerWeek = minutesPerWeek;
-		minutesPerWeek = newMinutesPerWeek;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MINUTES_PER_WEEK, oldMinutesPerWeek, minutesPerWeek));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDaysPerMonth() {
-		return daysPerMonth;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDaysPerMonth(BigInteger newDaysPerMonth) {
-		BigInteger oldDaysPerMonth = daysPerMonth;
-		daysPerMonth = newDaysPerMonth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DAYS_PER_MONTH, oldDaysPerMonth, daysPerMonth));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDefaultTaskType() {
-		return defaultTaskType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultTaskType(BigInteger newDefaultTaskType) {
-		BigInteger oldDefaultTaskType = defaultTaskType;
-		defaultTaskType = newDefaultTaskType;
-		boolean oldDefaultTaskTypeESet = defaultTaskTypeESet;
-		defaultTaskTypeESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DEFAULT_TASK_TYPE, oldDefaultTaskType, defaultTaskType, !oldDefaultTaskTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetDefaultTaskType() {
-		BigInteger oldDefaultTaskType = defaultTaskType;
-		boolean oldDefaultTaskTypeESet = defaultTaskTypeESet;
-		defaultTaskType = DEFAULT_TASK_TYPE_EDEFAULT;
-		defaultTaskTypeESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__DEFAULT_TASK_TYPE, oldDefaultTaskType, DEFAULT_TASK_TYPE_EDEFAULT, oldDefaultTaskTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetDefaultTaskType() {
-		return defaultTaskTypeESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDefaultFixedCostAccrual() {
-		return defaultFixedCostAccrual;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultFixedCostAccrual(BigInteger newDefaultFixedCostAccrual) {
-		BigInteger oldDefaultFixedCostAccrual = defaultFixedCostAccrual;
-		defaultFixedCostAccrual = newDefaultFixedCostAccrual;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DEFAULT_FIXED_COST_ACCRUAL, oldDefaultFixedCostAccrual, defaultFixedCostAccrual));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getDefaultStandardRate() {
-		return defaultStandardRate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultStandardRate(float newDefaultStandardRate) {
-		float oldDefaultStandardRate = defaultStandardRate;
-		defaultStandardRate = newDefaultStandardRate;
-		boolean oldDefaultStandardRateESet = defaultStandardRateESet;
-		defaultStandardRateESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DEFAULT_STANDARD_RATE, oldDefaultStandardRate, defaultStandardRate, !oldDefaultStandardRateESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetDefaultStandardRate() {
-		float oldDefaultStandardRate = defaultStandardRate;
-		boolean oldDefaultStandardRateESet = defaultStandardRateESet;
-		defaultStandardRate = DEFAULT_STANDARD_RATE_EDEFAULT;
-		defaultStandardRateESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__DEFAULT_STANDARD_RATE, oldDefaultStandardRate, DEFAULT_STANDARD_RATE_EDEFAULT, oldDefaultStandardRateESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetDefaultStandardRate() {
-		return defaultStandardRateESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getDefaultOvertimeRate() {
-		return defaultOvertimeRate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultOvertimeRate(float newDefaultOvertimeRate) {
-		float oldDefaultOvertimeRate = defaultOvertimeRate;
-		defaultOvertimeRate = newDefaultOvertimeRate;
-		boolean oldDefaultOvertimeRateESet = defaultOvertimeRateESet;
-		defaultOvertimeRateESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DEFAULT_OVERTIME_RATE, oldDefaultOvertimeRate, defaultOvertimeRate, !oldDefaultOvertimeRateESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetDefaultOvertimeRate() {
-		float oldDefaultOvertimeRate = defaultOvertimeRate;
-		boolean oldDefaultOvertimeRateESet = defaultOvertimeRateESet;
-		defaultOvertimeRate = DEFAULT_OVERTIME_RATE_EDEFAULT;
-		defaultOvertimeRateESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__DEFAULT_OVERTIME_RATE, oldDefaultOvertimeRate, DEFAULT_OVERTIME_RATE_EDEFAULT, oldDefaultOvertimeRateESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetDefaultOvertimeRate() {
-		return defaultOvertimeRateESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDurationFormat() {
-		return durationFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDurationFormat(BigInteger newDurationFormat) {
-		BigInteger oldDurationFormat = durationFormat;
-		durationFormat = newDurationFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DURATION_FORMAT, oldDurationFormat, durationFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getWorkFormat() {
-		return workFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkFormat(BigInteger newWorkFormat) {
-		BigInteger oldWorkFormat = workFormat;
-		workFormat = newWorkFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__WORK_FORMAT, oldWorkFormat, workFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isEditableActualCosts() {
-		return editableActualCosts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEditableActualCosts(boolean newEditableActualCosts) {
-		boolean oldEditableActualCosts = editableActualCosts;
-		editableActualCosts = newEditableActualCosts;
-		boolean oldEditableActualCostsESet = editableActualCostsESet;
-		editableActualCostsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__EDITABLE_ACTUAL_COSTS, oldEditableActualCosts, editableActualCosts, !oldEditableActualCostsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetEditableActualCosts() {
-		boolean oldEditableActualCosts = editableActualCosts;
-		boolean oldEditableActualCostsESet = editableActualCostsESet;
-		editableActualCosts = EDITABLE_ACTUAL_COSTS_EDEFAULT;
-		editableActualCostsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__EDITABLE_ACTUAL_COSTS, oldEditableActualCosts, EDITABLE_ACTUAL_COSTS_EDEFAULT, oldEditableActualCostsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetEditableActualCosts() {
-		return editableActualCostsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isHonorConstraints() {
-		return honorConstraints;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHonorConstraints(boolean newHonorConstraints) {
-		boolean oldHonorConstraints = honorConstraints;
-		honorConstraints = newHonorConstraints;
-		boolean oldHonorConstraintsESet = honorConstraintsESet;
-		honorConstraintsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__HONOR_CONSTRAINTS, oldHonorConstraints, honorConstraints, !oldHonorConstraintsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetHonorConstraints() {
-		boolean oldHonorConstraints = honorConstraints;
-		boolean oldHonorConstraintsESet = honorConstraintsESet;
-		honorConstraints = HONOR_CONSTRAINTS_EDEFAULT;
-		honorConstraintsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__HONOR_CONSTRAINTS, oldHonorConstraints, HONOR_CONSTRAINTS_EDEFAULT, oldHonorConstraintsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetHonorConstraints() {
-		return honorConstraintsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getEarnedValueMethod() {
-		return earnedValueMethod;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEarnedValueMethod(BigInteger newEarnedValueMethod) {
-		BigInteger oldEarnedValueMethod = earnedValueMethod;
-		earnedValueMethod = newEarnedValueMethod;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__EARNED_VALUE_METHOD, oldEarnedValueMethod, earnedValueMethod));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isInsertedProjectsLikeSummary() {
-		return insertedProjectsLikeSummary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setInsertedProjectsLikeSummary(boolean newInsertedProjectsLikeSummary) {
-		boolean oldInsertedProjectsLikeSummary = insertedProjectsLikeSummary;
-		insertedProjectsLikeSummary = newInsertedProjectsLikeSummary;
-		boolean oldInsertedProjectsLikeSummaryESet = insertedProjectsLikeSummaryESet;
-		insertedProjectsLikeSummaryESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__INSERTED_PROJECTS_LIKE_SUMMARY, oldInsertedProjectsLikeSummary, insertedProjectsLikeSummary, !oldInsertedProjectsLikeSummaryESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetInsertedProjectsLikeSummary() {
-		boolean oldInsertedProjectsLikeSummary = insertedProjectsLikeSummary;
-		boolean oldInsertedProjectsLikeSummaryESet = insertedProjectsLikeSummaryESet;
-		insertedProjectsLikeSummary = INSERTED_PROJECTS_LIKE_SUMMARY_EDEFAULT;
-		insertedProjectsLikeSummaryESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__INSERTED_PROJECTS_LIKE_SUMMARY, oldInsertedProjectsLikeSummary, INSERTED_PROJECTS_LIKE_SUMMARY_EDEFAULT, oldInsertedProjectsLikeSummaryESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetInsertedProjectsLikeSummary() {
-		return insertedProjectsLikeSummaryESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMultipleCriticalPaths() {
-		return multipleCriticalPaths;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMultipleCriticalPaths(boolean newMultipleCriticalPaths) {
-		boolean oldMultipleCriticalPaths = multipleCriticalPaths;
-		multipleCriticalPaths = newMultipleCriticalPaths;
-		boolean oldMultipleCriticalPathsESet = multipleCriticalPathsESet;
-		multipleCriticalPathsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MULTIPLE_CRITICAL_PATHS, oldMultipleCriticalPaths, multipleCriticalPaths, !oldMultipleCriticalPathsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMultipleCriticalPaths() {
-		boolean oldMultipleCriticalPaths = multipleCriticalPaths;
-		boolean oldMultipleCriticalPathsESet = multipleCriticalPathsESet;
-		multipleCriticalPaths = MULTIPLE_CRITICAL_PATHS_EDEFAULT;
-		multipleCriticalPathsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__MULTIPLE_CRITICAL_PATHS, oldMultipleCriticalPaths, MULTIPLE_CRITICAL_PATHS_EDEFAULT, oldMultipleCriticalPathsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMultipleCriticalPaths() {
-		return multipleCriticalPathsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNewTasksEffortDriven() {
-		return newTasksEffortDriven;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNewTasksEffortDriven(boolean newNewTasksEffortDriven) {
-		boolean oldNewTasksEffortDriven = newTasksEffortDriven;
-		newTasksEffortDriven = newNewTasksEffortDriven;
-		boolean oldNewTasksEffortDrivenESet = newTasksEffortDrivenESet;
-		newTasksEffortDrivenESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__NEW_TASKS_EFFORT_DRIVEN, oldNewTasksEffortDriven, newTasksEffortDriven, !oldNewTasksEffortDrivenESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetNewTasksEffortDriven() {
-		boolean oldNewTasksEffortDriven = newTasksEffortDriven;
-		boolean oldNewTasksEffortDrivenESet = newTasksEffortDrivenESet;
-		newTasksEffortDriven = NEW_TASKS_EFFORT_DRIVEN_EDEFAULT;
-		newTasksEffortDrivenESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__NEW_TASKS_EFFORT_DRIVEN, oldNewTasksEffortDriven, NEW_TASKS_EFFORT_DRIVEN_EDEFAULT, oldNewTasksEffortDrivenESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetNewTasksEffortDriven() {
-		return newTasksEffortDrivenESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNewTasksEstimated() {
-		return newTasksEstimated;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNewTasksEstimated(boolean newNewTasksEstimated) {
-		boolean oldNewTasksEstimated = newTasksEstimated;
-		newTasksEstimated = newNewTasksEstimated;
-		boolean oldNewTasksEstimatedESet = newTasksEstimatedESet;
-		newTasksEstimatedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__NEW_TASKS_ESTIMATED, oldNewTasksEstimated, newTasksEstimated, !oldNewTasksEstimatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetNewTasksEstimated() {
-		boolean oldNewTasksEstimated = newTasksEstimated;
-		boolean oldNewTasksEstimatedESet = newTasksEstimatedESet;
-		newTasksEstimated = NEW_TASKS_ESTIMATED_EDEFAULT;
-		newTasksEstimatedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__NEW_TASKS_ESTIMATED, oldNewTasksEstimated, NEW_TASKS_ESTIMATED_EDEFAULT, oldNewTasksEstimatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetNewTasksEstimated() {
-		return newTasksEstimatedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSplitsInProgressTasks() {
-		return splitsInProgressTasks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSplitsInProgressTasks(boolean newSplitsInProgressTasks) {
-		boolean oldSplitsInProgressTasks = splitsInProgressTasks;
-		splitsInProgressTasks = newSplitsInProgressTasks;
-		boolean oldSplitsInProgressTasksESet = splitsInProgressTasksESet;
-		splitsInProgressTasksESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__SPLITS_IN_PROGRESS_TASKS, oldSplitsInProgressTasks, splitsInProgressTasks, !oldSplitsInProgressTasksESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSplitsInProgressTasks() {
-		boolean oldSplitsInProgressTasks = splitsInProgressTasks;
-		boolean oldSplitsInProgressTasksESet = splitsInProgressTasksESet;
-		splitsInProgressTasks = SPLITS_IN_PROGRESS_TASKS_EDEFAULT;
-		splitsInProgressTasksESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__SPLITS_IN_PROGRESS_TASKS, oldSplitsInProgressTasks, SPLITS_IN_PROGRESS_TASKS_EDEFAULT, oldSplitsInProgressTasksESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSplitsInProgressTasks() {
-		return splitsInProgressTasksESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSpreadActualCost() {
-		return spreadActualCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSpreadActualCost(boolean newSpreadActualCost) {
-		boolean oldSpreadActualCost = spreadActualCost;
-		spreadActualCost = newSpreadActualCost;
-		boolean oldSpreadActualCostESet = spreadActualCostESet;
-		spreadActualCostESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__SPREAD_ACTUAL_COST, oldSpreadActualCost, spreadActualCost, !oldSpreadActualCostESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSpreadActualCost() {
-		boolean oldSpreadActualCost = spreadActualCost;
-		boolean oldSpreadActualCostESet = spreadActualCostESet;
-		spreadActualCost = SPREAD_ACTUAL_COST_EDEFAULT;
-		spreadActualCostESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__SPREAD_ACTUAL_COST, oldSpreadActualCost, SPREAD_ACTUAL_COST_EDEFAULT, oldSpreadActualCostESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSpreadActualCost() {
-		return spreadActualCostESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSpreadPercentComplete() {
-		return spreadPercentComplete;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSpreadPercentComplete(boolean newSpreadPercentComplete) {
-		boolean oldSpreadPercentComplete = spreadPercentComplete;
-		spreadPercentComplete = newSpreadPercentComplete;
-		boolean oldSpreadPercentCompleteESet = spreadPercentCompleteESet;
-		spreadPercentCompleteESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__SPREAD_PERCENT_COMPLETE, oldSpreadPercentComplete, spreadPercentComplete, !oldSpreadPercentCompleteESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSpreadPercentComplete() {
-		boolean oldSpreadPercentComplete = spreadPercentComplete;
-		boolean oldSpreadPercentCompleteESet = spreadPercentCompleteESet;
-		spreadPercentComplete = SPREAD_PERCENT_COMPLETE_EDEFAULT;
-		spreadPercentCompleteESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__SPREAD_PERCENT_COMPLETE, oldSpreadPercentComplete, SPREAD_PERCENT_COMPLETE_EDEFAULT, oldSpreadPercentCompleteESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSpreadPercentComplete() {
-		return spreadPercentCompleteESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isTaskUpdatesResource() {
-		return taskUpdatesResource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTaskUpdatesResource(boolean newTaskUpdatesResource) {
-		boolean oldTaskUpdatesResource = taskUpdatesResource;
-		taskUpdatesResource = newTaskUpdatesResource;
-		boolean oldTaskUpdatesResourceESet = taskUpdatesResourceESet;
-		taskUpdatesResourceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__TASK_UPDATES_RESOURCE, oldTaskUpdatesResource, taskUpdatesResource, !oldTaskUpdatesResourceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetTaskUpdatesResource() {
-		boolean oldTaskUpdatesResource = taskUpdatesResource;
-		boolean oldTaskUpdatesResourceESet = taskUpdatesResourceESet;
-		taskUpdatesResource = TASK_UPDATES_RESOURCE_EDEFAULT;
-		taskUpdatesResourceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__TASK_UPDATES_RESOURCE, oldTaskUpdatesResource, TASK_UPDATES_RESOURCE_EDEFAULT, oldTaskUpdatesResourceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetTaskUpdatesResource() {
-		return taskUpdatesResourceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isFiscalYearStart() {
-		return fiscalYearStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFiscalYearStart(boolean newFiscalYearStart) {
-		boolean oldFiscalYearStart = fiscalYearStart;
-		fiscalYearStart = newFiscalYearStart;
-		boolean oldFiscalYearStartESet = fiscalYearStartESet;
-		fiscalYearStartESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__FISCAL_YEAR_START, oldFiscalYearStart, fiscalYearStart, !oldFiscalYearStartESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetFiscalYearStart() {
-		boolean oldFiscalYearStart = fiscalYearStart;
-		boolean oldFiscalYearStartESet = fiscalYearStartESet;
-		fiscalYearStart = FISCAL_YEAR_START_EDEFAULT;
-		fiscalYearStartESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__FISCAL_YEAR_START, oldFiscalYearStart, FISCAL_YEAR_START_EDEFAULT, oldFiscalYearStartESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetFiscalYearStart() {
-		return fiscalYearStartESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getWeekStartDay() {
-		return weekStartDay;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWeekStartDay(BigInteger newWeekStartDay) {
-		BigInteger oldWeekStartDay = weekStartDay;
-		weekStartDay = newWeekStartDay;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__WEEK_START_DAY, oldWeekStartDay, weekStartDay));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMoveCompletedEndsBack() {
-		return moveCompletedEndsBack;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMoveCompletedEndsBack(boolean newMoveCompletedEndsBack) {
-		boolean oldMoveCompletedEndsBack = moveCompletedEndsBack;
-		moveCompletedEndsBack = newMoveCompletedEndsBack;
-		boolean oldMoveCompletedEndsBackESet = moveCompletedEndsBackESet;
-		moveCompletedEndsBackESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_BACK, oldMoveCompletedEndsBack, moveCompletedEndsBack, !oldMoveCompletedEndsBackESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMoveCompletedEndsBack() {
-		boolean oldMoveCompletedEndsBack = moveCompletedEndsBack;
-		boolean oldMoveCompletedEndsBackESet = moveCompletedEndsBackESet;
-		moveCompletedEndsBack = MOVE_COMPLETED_ENDS_BACK_EDEFAULT;
-		moveCompletedEndsBackESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_BACK, oldMoveCompletedEndsBack, MOVE_COMPLETED_ENDS_BACK_EDEFAULT, oldMoveCompletedEndsBackESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMoveCompletedEndsBack() {
-		return moveCompletedEndsBackESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMoveRemainingStartsBack() {
-		return moveRemainingStartsBack;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMoveRemainingStartsBack(boolean newMoveRemainingStartsBack) {
-		boolean oldMoveRemainingStartsBack = moveRemainingStartsBack;
-		moveRemainingStartsBack = newMoveRemainingStartsBack;
-		boolean oldMoveRemainingStartsBackESet = moveRemainingStartsBackESet;
-		moveRemainingStartsBackESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_BACK, oldMoveRemainingStartsBack, moveRemainingStartsBack, !oldMoveRemainingStartsBackESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMoveRemainingStartsBack() {
-		boolean oldMoveRemainingStartsBack = moveRemainingStartsBack;
-		boolean oldMoveRemainingStartsBackESet = moveRemainingStartsBackESet;
-		moveRemainingStartsBack = MOVE_REMAINING_STARTS_BACK_EDEFAULT;
-		moveRemainingStartsBackESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_BACK, oldMoveRemainingStartsBack, MOVE_REMAINING_STARTS_BACK_EDEFAULT, oldMoveRemainingStartsBackESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMoveRemainingStartsBack() {
-		return moveRemainingStartsBackESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMoveRemainingStartsForward() {
-		return moveRemainingStartsForward;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMoveRemainingStartsForward(boolean newMoveRemainingStartsForward) {
-		boolean oldMoveRemainingStartsForward = moveRemainingStartsForward;
-		moveRemainingStartsForward = newMoveRemainingStartsForward;
-		boolean oldMoveRemainingStartsForwardESet = moveRemainingStartsForwardESet;
-		moveRemainingStartsForwardESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_FORWARD, oldMoveRemainingStartsForward, moveRemainingStartsForward, !oldMoveRemainingStartsForwardESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMoveRemainingStartsForward() {
-		boolean oldMoveRemainingStartsForward = moveRemainingStartsForward;
-		boolean oldMoveRemainingStartsForwardESet = moveRemainingStartsForwardESet;
-		moveRemainingStartsForward = MOVE_REMAINING_STARTS_FORWARD_EDEFAULT;
-		moveRemainingStartsForwardESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_FORWARD, oldMoveRemainingStartsForward, MOVE_REMAINING_STARTS_FORWARD_EDEFAULT, oldMoveRemainingStartsForwardESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMoveRemainingStartsForward() {
-		return moveRemainingStartsForwardESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMoveCompletedEndsForward() {
-		return moveCompletedEndsForward;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMoveCompletedEndsForward(boolean newMoveCompletedEndsForward) {
-		boolean oldMoveCompletedEndsForward = moveCompletedEndsForward;
-		moveCompletedEndsForward = newMoveCompletedEndsForward;
-		boolean oldMoveCompletedEndsForwardESet = moveCompletedEndsForwardESet;
-		moveCompletedEndsForwardESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_FORWARD, oldMoveCompletedEndsForward, moveCompletedEndsForward, !oldMoveCompletedEndsForwardESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMoveCompletedEndsForward() {
-		boolean oldMoveCompletedEndsForward = moveCompletedEndsForward;
-		boolean oldMoveCompletedEndsForwardESet = moveCompletedEndsForwardESet;
-		moveCompletedEndsForward = MOVE_COMPLETED_ENDS_FORWARD_EDEFAULT;
-		moveCompletedEndsForwardESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_FORWARD, oldMoveCompletedEndsForward, MOVE_COMPLETED_ENDS_FORWARD_EDEFAULT, oldMoveCompletedEndsForwardESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMoveCompletedEndsForward() {
-		return moveCompletedEndsForwardESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getBaselineForEarnedValue() {
-		return baselineForEarnedValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBaselineForEarnedValue(BigInteger newBaselineForEarnedValue) {
-		BigInteger oldBaselineForEarnedValue = baselineForEarnedValue;
-		baselineForEarnedValue = newBaselineForEarnedValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__BASELINE_FOR_EARNED_VALUE, oldBaselineForEarnedValue, baselineForEarnedValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isAutoAddNewResourcesAndTasks() {
-		return autoAddNewResourcesAndTasks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAutoAddNewResourcesAndTasks(boolean newAutoAddNewResourcesAndTasks) {
-		boolean oldAutoAddNewResourcesAndTasks = autoAddNewResourcesAndTasks;
-		autoAddNewResourcesAndTasks = newAutoAddNewResourcesAndTasks;
-		boolean oldAutoAddNewResourcesAndTasksESet = autoAddNewResourcesAndTasksESet;
-		autoAddNewResourcesAndTasksESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__AUTO_ADD_NEW_RESOURCES_AND_TASKS, oldAutoAddNewResourcesAndTasks, autoAddNewResourcesAndTasks, !oldAutoAddNewResourcesAndTasksESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetAutoAddNewResourcesAndTasks() {
-		boolean oldAutoAddNewResourcesAndTasks = autoAddNewResourcesAndTasks;
-		boolean oldAutoAddNewResourcesAndTasksESet = autoAddNewResourcesAndTasksESet;
-		autoAddNewResourcesAndTasks = AUTO_ADD_NEW_RESOURCES_AND_TASKS_EDEFAULT;
-		autoAddNewResourcesAndTasksESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__AUTO_ADD_NEW_RESOURCES_AND_TASKS, oldAutoAddNewResourcesAndTasks, AUTO_ADD_NEW_RESOURCES_AND_TASKS_EDEFAULT, oldAutoAddNewResourcesAndTasksESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetAutoAddNewResourcesAndTasks() {
-		return autoAddNewResourcesAndTasksESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStatusDate() {
-		return statusDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStatusDate(Object newStatusDate) {
-		Object oldStatusDate = statusDate;
-		statusDate = newStatusDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__STATUS_DATE, oldStatusDate, statusDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getCurrentDate() {
-		return currentDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCurrentDate(Object newCurrentDate) {
-		Object oldCurrentDate = currentDate;
-		currentDate = newCurrentDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CURRENT_DATE, oldCurrentDate, currentDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMicrosoftProjectServerURL() {
-		return microsoftProjectServerURL;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMicrosoftProjectServerURL(boolean newMicrosoftProjectServerURL) {
-		boolean oldMicrosoftProjectServerURL = microsoftProjectServerURL;
-		microsoftProjectServerURL = newMicrosoftProjectServerURL;
-		boolean oldMicrosoftProjectServerURLESet = microsoftProjectServerURLESet;
-		microsoftProjectServerURLESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__MICROSOFT_PROJECT_SERVER_URL, oldMicrosoftProjectServerURL, microsoftProjectServerURL, !oldMicrosoftProjectServerURLESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMicrosoftProjectServerURL() {
-		boolean oldMicrosoftProjectServerURL = microsoftProjectServerURL;
-		boolean oldMicrosoftProjectServerURLESet = microsoftProjectServerURLESet;
-		microsoftProjectServerURL = MICROSOFT_PROJECT_SERVER_URL_EDEFAULT;
-		microsoftProjectServerURLESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__MICROSOFT_PROJECT_SERVER_URL, oldMicrosoftProjectServerURL, MICROSOFT_PROJECT_SERVER_URL_EDEFAULT, oldMicrosoftProjectServerURLESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMicrosoftProjectServerURL() {
-		return microsoftProjectServerURLESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isAutolink() {
-		return autolink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAutolink(boolean newAutolink) {
-		boolean oldAutolink = autolink;
-		autolink = newAutolink;
-		boolean oldAutolinkESet = autolinkESet;
-		autolinkESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__AUTOLINK, oldAutolink, autolink, !oldAutolinkESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetAutolink() {
-		boolean oldAutolink = autolink;
-		boolean oldAutolinkESet = autolinkESet;
-		autolink = AUTOLINK_EDEFAULT;
-		autolinkESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__AUTOLINK, oldAutolink, AUTOLINK_EDEFAULT, oldAutolinkESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetAutolink() {
-		return autolinkESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getNewTaskStartDate() {
-		return newTaskStartDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNewTaskStartDate(BigInteger newNewTaskStartDate) {
-		BigInteger oldNewTaskStartDate = newTaskStartDate;
-		newTaskStartDate = newNewTaskStartDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__NEW_TASK_START_DATE, oldNewTaskStartDate, newTaskStartDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDefaultTaskEVMethod() {
-		return defaultTaskEVMethod;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultTaskEVMethod(BigInteger newDefaultTaskEVMethod) {
-		BigInteger oldDefaultTaskEVMethod = defaultTaskEVMethod;
-		defaultTaskEVMethod = newDefaultTaskEVMethod;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__DEFAULT_TASK_EV_METHOD, oldDefaultTaskEVMethod, defaultTaskEVMethod));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isProjectExternallyEdited() {
-		return projectExternallyEdited;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProjectExternallyEdited(boolean newProjectExternallyEdited) {
-		boolean oldProjectExternallyEdited = projectExternallyEdited;
-		projectExternallyEdited = newProjectExternallyEdited;
-		boolean oldProjectExternallyEditedESet = projectExternallyEditedESet;
-		projectExternallyEditedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__PROJECT_EXTERNALLY_EDITED, oldProjectExternallyEdited, projectExternallyEdited, !oldProjectExternallyEditedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetProjectExternallyEdited() {
-		boolean oldProjectExternallyEdited = projectExternallyEdited;
-		boolean oldProjectExternallyEditedESet = projectExternallyEditedESet;
-		projectExternallyEdited = PROJECT_EXTERNALLY_EDITED_EDEFAULT;
-		projectExternallyEditedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__PROJECT_EXTERNALLY_EDITED, oldProjectExternallyEdited, PROJECT_EXTERNALLY_EDITED_EDEFAULT, oldProjectExternallyEditedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetProjectExternallyEdited() {
-		return projectExternallyEditedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getExtendedCreationDate() {
-		return extendedCreationDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExtendedCreationDate(Object newExtendedCreationDate) {
-		Object oldExtendedCreationDate = extendedCreationDate;
-		extendedCreationDate = newExtendedCreationDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__EXTENDED_CREATION_DATE, oldExtendedCreationDate, extendedCreationDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isActualsInSync() {
-		return actualsInSync;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualsInSync(boolean newActualsInSync) {
-		boolean oldActualsInSync = actualsInSync;
-		actualsInSync = newActualsInSync;
-		boolean oldActualsInSyncESet = actualsInSyncESet;
-		actualsInSyncESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__ACTUALS_IN_SYNC, oldActualsInSync, actualsInSync, !oldActualsInSyncESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetActualsInSync() {
-		boolean oldActualsInSync = actualsInSync;
-		boolean oldActualsInSyncESet = actualsInSyncESet;
-		actualsInSync = ACTUALS_IN_SYNC_EDEFAULT;
-		actualsInSyncESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__ACTUALS_IN_SYNC, oldActualsInSync, ACTUALS_IN_SYNC_EDEFAULT, oldActualsInSyncESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetActualsInSync() {
-		return actualsInSyncESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isRemoveFileProperties() {
-		return removeFileProperties;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemoveFileProperties(boolean newRemoveFileProperties) {
-		boolean oldRemoveFileProperties = removeFileProperties;
-		removeFileProperties = newRemoveFileProperties;
-		boolean oldRemoveFilePropertiesESet = removeFilePropertiesESet;
-		removeFilePropertiesESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__REMOVE_FILE_PROPERTIES, oldRemoveFileProperties, removeFileProperties, !oldRemoveFilePropertiesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetRemoveFileProperties() {
-		boolean oldRemoveFileProperties = removeFileProperties;
-		boolean oldRemoveFilePropertiesESet = removeFilePropertiesESet;
-		removeFileProperties = REMOVE_FILE_PROPERTIES_EDEFAULT;
-		removeFilePropertiesESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__REMOVE_FILE_PROPERTIES, oldRemoveFileProperties, REMOVE_FILE_PROPERTIES_EDEFAULT, oldRemoveFilePropertiesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetRemoveFileProperties() {
-		return removeFilePropertiesESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isAdminProject() {
-		return adminProject;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAdminProject(boolean newAdminProject) {
-		boolean oldAdminProject = adminProject;
-		adminProject = newAdminProject;
-		boolean oldAdminProjectESet = adminProjectESet;
-		adminProjectESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__ADMIN_PROJECT, oldAdminProject, adminProject, !oldAdminProjectESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetAdminProject() {
-		boolean oldAdminProject = adminProject;
-		boolean oldAdminProjectESet = adminProjectESet;
-		adminProject = ADMIN_PROJECT_EDEFAULT;
-		adminProjectESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.PROJECT__ADMIN_PROJECT, oldAdminProject, ADMIN_PROJECT_EDEFAULT, oldAdminProjectESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetAdminProject() {
-		return adminProjectESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OutlineCodes getOutlineCodes() {
-		return outlineCodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOutlineCodes(OutlineCodes newOutlineCodes, NotificationChain msgs) {
-		OutlineCodes oldOutlineCodes = outlineCodes;
-		outlineCodes = newOutlineCodes;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__OUTLINE_CODES, oldOutlineCodes, newOutlineCodes);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOutlineCodes(OutlineCodes newOutlineCodes) {
-		if (newOutlineCodes != outlineCodes) {
-			NotificationChain msgs = null;
-			if (outlineCodes != null)
-				msgs = ((InternalEObject)outlineCodes).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__OUTLINE_CODES, null, msgs);
-			if (newOutlineCodes != null)
-				msgs = ((InternalEObject)newOutlineCodes).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__OUTLINE_CODES, null, msgs);
-			msgs = basicSetOutlineCodes(newOutlineCodes, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__OUTLINE_CODES, newOutlineCodes, newOutlineCodes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WBSMasks getWBSMasks() {
-		return wBSMasks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetWBSMasks(WBSMasks newWBSMasks, NotificationChain msgs) {
-		WBSMasks oldWBSMasks = wBSMasks;
-		wBSMasks = newWBSMasks;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__WBS_MASKS, oldWBSMasks, newWBSMasks);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWBSMasks(WBSMasks newWBSMasks) {
-		if (newWBSMasks != wBSMasks) {
-			NotificationChain msgs = null;
-			if (wBSMasks != null)
-				msgs = ((InternalEObject)wBSMasks).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__WBS_MASKS, null, msgs);
-			if (newWBSMasks != null)
-				msgs = ((InternalEObject)newWBSMasks).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__WBS_MASKS, null, msgs);
-			msgs = basicSetWBSMasks(newWBSMasks, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__WBS_MASKS, newWBSMasks, newWBSMasks));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExtendedAttributes getExtendedAttributes() {
-		return extendedAttributes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetExtendedAttributes(ExtendedAttributes newExtendedAttributes, NotificationChain msgs) {
-		ExtendedAttributes oldExtendedAttributes = extendedAttributes;
-		extendedAttributes = newExtendedAttributes;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES, oldExtendedAttributes, newExtendedAttributes);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExtendedAttributes(ExtendedAttributes newExtendedAttributes) {
-		if (newExtendedAttributes != extendedAttributes) {
-			NotificationChain msgs = null;
-			if (extendedAttributes != null)
-				msgs = ((InternalEObject)extendedAttributes).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES, null, msgs);
-			if (newExtendedAttributes != null)
-				msgs = ((InternalEObject)newExtendedAttributes).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES, null, msgs);
-			msgs = basicSetExtendedAttributes(newExtendedAttributes, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES, newExtendedAttributes, newExtendedAttributes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Calendars getCalendars() {
-		return calendars;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetCalendars(Calendars newCalendars, NotificationChain msgs) {
-		Calendars oldCalendars = calendars;
-		calendars = newCalendars;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CALENDARS, oldCalendars, newCalendars);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCalendars(Calendars newCalendars) {
-		if (newCalendars != calendars) {
-			NotificationChain msgs = null;
-			if (calendars != null)
-				msgs = ((InternalEObject)calendars).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__CALENDARS, null, msgs);
-			if (newCalendars != null)
-				msgs = ((InternalEObject)newCalendars).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__CALENDARS, null, msgs);
-			msgs = basicSetCalendars(newCalendars, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__CALENDARS, newCalendars, newCalendars));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Tasks getTasks() {
-		return tasks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTasks(Tasks newTasks, NotificationChain msgs) {
-		Tasks oldTasks = tasks;
-		tasks = newTasks;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__TASKS, oldTasks, newTasks);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTasks(Tasks newTasks) {
-		if (newTasks != tasks) {
-			NotificationChain msgs = null;
-			if (tasks != null)
-				msgs = ((InternalEObject)tasks).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__TASKS, null, msgs);
-			if (newTasks != null)
-				msgs = ((InternalEObject)newTasks).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__TASKS, null, msgs);
-			msgs = basicSetTasks(newTasks, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__TASKS, newTasks, newTasks));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resources getResources() {
-		return resources;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResources(Resources newResources, NotificationChain msgs) {
-		Resources oldResources = resources;
-		resources = newResources;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__RESOURCES, oldResources, newResources);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResources(Resources newResources) {
-		if (newResources != resources) {
-			NotificationChain msgs = null;
-			if (resources != null)
-				msgs = ((InternalEObject)resources).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__RESOURCES, null, msgs);
-			if (newResources != null)
-				msgs = ((InternalEObject)newResources).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__RESOURCES, null, msgs);
-			msgs = basicSetResources(newResources, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__RESOURCES, newResources, newResources));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Assignments getAssignments() {
-		return assignments;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAssignments(Assignments newAssignments, NotificationChain msgs) {
-		Assignments oldAssignments = assignments;
-		assignments = newAssignments;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__ASSIGNMENTS, oldAssignments, newAssignments);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAssignments(Assignments newAssignments) {
-		if (newAssignments != assignments) {
-			NotificationChain msgs = null;
-			if (assignments != null)
-				msgs = ((InternalEObject)assignments).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__ASSIGNMENTS, null, msgs);
-			if (newAssignments != null)
-				msgs = ((InternalEObject)newAssignments).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.PROJECT__ASSIGNMENTS, null, msgs);
-			msgs = basicSetAssignments(newAssignments, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.PROJECT__ASSIGNMENTS, newAssignments, newAssignments));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.PROJECT__OUTLINE_CODES:
-					return basicSetOutlineCodes(null, msgs);
-				case MsprojectPackage.PROJECT__WBS_MASKS:
-					return basicSetWBSMasks(null, msgs);
-				case MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES:
-					return basicSetExtendedAttributes(null, msgs);
-				case MsprojectPackage.PROJECT__CALENDARS:
-					return basicSetCalendars(null, msgs);
-				case MsprojectPackage.PROJECT__TASKS:
-					return basicSetTasks(null, msgs);
-				case MsprojectPackage.PROJECT__RESOURCES:
-					return basicSetResources(null, msgs);
-				case MsprojectPackage.PROJECT__ASSIGNMENTS:
-					return basicSetAssignments(null, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PROJECT__UID:
-				return getUID();
-			case MsprojectPackage.PROJECT__NAME:
-				return getName();
-			case MsprojectPackage.PROJECT__TITLE:
-				return getTitle();
-			case MsprojectPackage.PROJECT__SUBJECT:
-				return getSubject();
-			case MsprojectPackage.PROJECT__CATEGORY:
-				return getCategory();
-			case MsprojectPackage.PROJECT__COMPANY:
-				return getCompany();
-			case MsprojectPackage.PROJECT__MANAGER:
-				return getManager();
-			case MsprojectPackage.PROJECT__AUTHOR:
-				return getAuthor();
-			case MsprojectPackage.PROJECT__CREATION_DATE:
-				return getCreationDate();
-			case MsprojectPackage.PROJECT__REVISION:
-				return getRevision();
-			case MsprojectPackage.PROJECT__LAST_SAVED:
-				return getLastSaved();
-			case MsprojectPackage.PROJECT__SCHEDULE_FROM_START:
-				return isScheduleFromStart() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__START_DATE:
-				return getStartDate();
-			case MsprojectPackage.PROJECT__FINISH_DATE:
-				return getFinishDate();
-			case MsprojectPackage.PROJECT__FYSTART_DATE:
-				return getFYStartDate();
-			case MsprojectPackage.PROJECT__CRITICAL_SLACK_LIMIT:
-				return getCriticalSlackLimit();
-			case MsprojectPackage.PROJECT__CURRENCY_DIGITS:
-				return getCurrencyDigits();
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL:
-				return getCurrencySymbol();
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL_POSITION:
-				return getCurrencySymbolPosition();
-			case MsprojectPackage.PROJECT__CALENDAR_UID:
-				return getCalendarUID();
-			case MsprojectPackage.PROJECT__DEFAULT_START_TIME:
-				return getDefaultStartTime();
-			case MsprojectPackage.PROJECT__DEFAULT_FINISH_TIME:
-				return getDefaultFinishTime();
-			case MsprojectPackage.PROJECT__MINUTES_PER_DAY:
-				return getMinutesPerDay();
-			case MsprojectPackage.PROJECT__MINUTES_PER_WEEK:
-				return getMinutesPerWeek();
-			case MsprojectPackage.PROJECT__DAYS_PER_MONTH:
-				return getDaysPerMonth();
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_TYPE:
-				return getDefaultTaskType();
-			case MsprojectPackage.PROJECT__DEFAULT_FIXED_COST_ACCRUAL:
-				return getDefaultFixedCostAccrual();
-			case MsprojectPackage.PROJECT__DEFAULT_STANDARD_RATE:
-				return new Float(getDefaultStandardRate());
-			case MsprojectPackage.PROJECT__DEFAULT_OVERTIME_RATE:
-				return new Float(getDefaultOvertimeRate());
-			case MsprojectPackage.PROJECT__DURATION_FORMAT:
-				return getDurationFormat();
-			case MsprojectPackage.PROJECT__WORK_FORMAT:
-				return getWorkFormat();
-			case MsprojectPackage.PROJECT__EDITABLE_ACTUAL_COSTS:
-				return isEditableActualCosts() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__HONOR_CONSTRAINTS:
-				return isHonorConstraints() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__EARNED_VALUE_METHOD:
-				return getEarnedValueMethod();
-			case MsprojectPackage.PROJECT__INSERTED_PROJECTS_LIKE_SUMMARY:
-				return isInsertedProjectsLikeSummary() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__MULTIPLE_CRITICAL_PATHS:
-				return isMultipleCriticalPaths() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__NEW_TASKS_EFFORT_DRIVEN:
-				return isNewTasksEffortDriven() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__NEW_TASKS_ESTIMATED:
-				return isNewTasksEstimated() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__SPLITS_IN_PROGRESS_TASKS:
-				return isSplitsInProgressTasks() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__SPREAD_ACTUAL_COST:
-				return isSpreadActualCost() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__SPREAD_PERCENT_COMPLETE:
-				return isSpreadPercentComplete() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__TASK_UPDATES_RESOURCE:
-				return isTaskUpdatesResource() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__FISCAL_YEAR_START:
-				return isFiscalYearStart() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__WEEK_START_DAY:
-				return getWeekStartDay();
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_BACK:
-				return isMoveCompletedEndsBack() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_BACK:
-				return isMoveRemainingStartsBack() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_FORWARD:
-				return isMoveRemainingStartsForward() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_FORWARD:
-				return isMoveCompletedEndsForward() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__BASELINE_FOR_EARNED_VALUE:
-				return getBaselineForEarnedValue();
-			case MsprojectPackage.PROJECT__AUTO_ADD_NEW_RESOURCES_AND_TASKS:
-				return isAutoAddNewResourcesAndTasks() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__STATUS_DATE:
-				return getStatusDate();
-			case MsprojectPackage.PROJECT__CURRENT_DATE:
-				return getCurrentDate();
-			case MsprojectPackage.PROJECT__MICROSOFT_PROJECT_SERVER_URL:
-				return isMicrosoftProjectServerURL() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__AUTOLINK:
-				return isAutolink() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__NEW_TASK_START_DATE:
-				return getNewTaskStartDate();
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_EV_METHOD:
-				return getDefaultTaskEVMethod();
-			case MsprojectPackage.PROJECT__PROJECT_EXTERNALLY_EDITED:
-				return isProjectExternallyEdited() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__EXTENDED_CREATION_DATE:
-				return getExtendedCreationDate();
-			case MsprojectPackage.PROJECT__ACTUALS_IN_SYNC:
-				return isActualsInSync() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__REMOVE_FILE_PROPERTIES:
-				return isRemoveFileProperties() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__ADMIN_PROJECT:
-				return isAdminProject() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.PROJECT__OUTLINE_CODES:
-				return getOutlineCodes();
-			case MsprojectPackage.PROJECT__WBS_MASKS:
-				return getWBSMasks();
-			case MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES:
-				return getExtendedAttributes();
-			case MsprojectPackage.PROJECT__CALENDARS:
-				return getCalendars();
-			case MsprojectPackage.PROJECT__TASKS:
-				return getTasks();
-			case MsprojectPackage.PROJECT__RESOURCES:
-				return getResources();
-			case MsprojectPackage.PROJECT__ASSIGNMENTS:
-				return getAssignments();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PROJECT__UID:
-				setUID((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__NAME:
-				setName((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__TITLE:
-				setTitle((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__SUBJECT:
-				setSubject((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CATEGORY:
-				setCategory((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__COMPANY:
-				setCompany((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__MANAGER:
-				setManager((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__AUTHOR:
-				setAuthor((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CREATION_DATE:
-				setCreationDate((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__REVISION:
-				setRevision((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__LAST_SAVED:
-				setLastSaved((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__SCHEDULE_FROM_START:
-				setScheduleFromStart(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__START_DATE:
-				setStartDate((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__FINISH_DATE:
-				setFinishDate((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__FYSTART_DATE:
-				setFYStartDate((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CRITICAL_SLACK_LIMIT:
-				setCriticalSlackLimit((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CURRENCY_DIGITS:
-				setCurrencyDigits((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL:
-				setCurrencySymbol((String)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL_POSITION:
-				setCurrencySymbolPosition((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CALENDAR_UID:
-				setCalendarUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_START_TIME:
-				setDefaultStartTime((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_FINISH_TIME:
-				setDefaultFinishTime((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__MINUTES_PER_DAY:
-				setMinutesPerDay((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__MINUTES_PER_WEEK:
-				setMinutesPerWeek((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__DAYS_PER_MONTH:
-				setDaysPerMonth((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_TYPE:
-				setDefaultTaskType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_FIXED_COST_ACCRUAL:
-				setDefaultFixedCostAccrual((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_STANDARD_RATE:
-				setDefaultStandardRate(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_OVERTIME_RATE:
-				setDefaultOvertimeRate(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.PROJECT__DURATION_FORMAT:
-				setDurationFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__WORK_FORMAT:
-				setWorkFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__EDITABLE_ACTUAL_COSTS:
-				setEditableActualCosts(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__HONOR_CONSTRAINTS:
-				setHonorConstraints(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__EARNED_VALUE_METHOD:
-				setEarnedValueMethod((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__INSERTED_PROJECTS_LIKE_SUMMARY:
-				setInsertedProjectsLikeSummary(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__MULTIPLE_CRITICAL_PATHS:
-				setMultipleCriticalPaths(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__NEW_TASKS_EFFORT_DRIVEN:
-				setNewTasksEffortDriven(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__NEW_TASKS_ESTIMATED:
-				setNewTasksEstimated(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__SPLITS_IN_PROGRESS_TASKS:
-				setSplitsInProgressTasks(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__SPREAD_ACTUAL_COST:
-				setSpreadActualCost(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__SPREAD_PERCENT_COMPLETE:
-				setSpreadPercentComplete(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__TASK_UPDATES_RESOURCE:
-				setTaskUpdatesResource(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__FISCAL_YEAR_START:
-				setFiscalYearStart(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__WEEK_START_DAY:
-				setWeekStartDay((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_BACK:
-				setMoveCompletedEndsBack(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_BACK:
-				setMoveRemainingStartsBack(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_FORWARD:
-				setMoveRemainingStartsForward(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_FORWARD:
-				setMoveCompletedEndsForward(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__BASELINE_FOR_EARNED_VALUE:
-				setBaselineForEarnedValue((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__AUTO_ADD_NEW_RESOURCES_AND_TASKS:
-				setAutoAddNewResourcesAndTasks(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__STATUS_DATE:
-				setStatusDate((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CURRENT_DATE:
-				setCurrentDate((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__MICROSOFT_PROJECT_SERVER_URL:
-				setMicrosoftProjectServerURL(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__AUTOLINK:
-				setAutolink(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__NEW_TASK_START_DATE:
-				setNewTaskStartDate((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_EV_METHOD:
-				setDefaultTaskEVMethod((BigInteger)newValue);
-				return;
-			case MsprojectPackage.PROJECT__PROJECT_EXTERNALLY_EDITED:
-				setProjectExternallyEdited(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__EXTENDED_CREATION_DATE:
-				setExtendedCreationDate((Object)newValue);
-				return;
-			case MsprojectPackage.PROJECT__ACTUALS_IN_SYNC:
-				setActualsInSync(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__REMOVE_FILE_PROPERTIES:
-				setRemoveFileProperties(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__ADMIN_PROJECT:
-				setAdminProject(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.PROJECT__OUTLINE_CODES:
-				setOutlineCodes((OutlineCodes)newValue);
-				return;
-			case MsprojectPackage.PROJECT__WBS_MASKS:
-				setWBSMasks((WBSMasks)newValue);
-				return;
-			case MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES:
-				setExtendedAttributes((ExtendedAttributes)newValue);
-				return;
-			case MsprojectPackage.PROJECT__CALENDARS:
-				setCalendars((Calendars)newValue);
-				return;
-			case MsprojectPackage.PROJECT__TASKS:
-				setTasks((Tasks)newValue);
-				return;
-			case MsprojectPackage.PROJECT__RESOURCES:
-				setResources((Resources)newValue);
-				return;
-			case MsprojectPackage.PROJECT__ASSIGNMENTS:
-				setAssignments((Assignments)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PROJECT__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__TITLE:
-				setTitle(TITLE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__SUBJECT:
-				setSubject(SUBJECT_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CATEGORY:
-				setCategory(CATEGORY_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__COMPANY:
-				setCompany(COMPANY_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__MANAGER:
-				setManager(MANAGER_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__AUTHOR:
-				setAuthor(AUTHOR_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CREATION_DATE:
-				setCreationDate(CREATION_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__REVISION:
-				setRevision(REVISION_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__LAST_SAVED:
-				setLastSaved(LAST_SAVED_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__SCHEDULE_FROM_START:
-				unsetScheduleFromStart();
-				return;
-			case MsprojectPackage.PROJECT__START_DATE:
-				setStartDate(START_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__FINISH_DATE:
-				setFinishDate(FINISH_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__FYSTART_DATE:
-				setFYStartDate(FYSTART_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CRITICAL_SLACK_LIMIT:
-				setCriticalSlackLimit(CRITICAL_SLACK_LIMIT_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CURRENCY_DIGITS:
-				setCurrencyDigits(CURRENCY_DIGITS_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL:
-				setCurrencySymbol(CURRENCY_SYMBOL_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL_POSITION:
-				setCurrencySymbolPosition(CURRENCY_SYMBOL_POSITION_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CALENDAR_UID:
-				setCalendarUID(CALENDAR_UID_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_START_TIME:
-				setDefaultStartTime(DEFAULT_START_TIME_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_FINISH_TIME:
-				setDefaultFinishTime(DEFAULT_FINISH_TIME_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__MINUTES_PER_DAY:
-				setMinutesPerDay(MINUTES_PER_DAY_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__MINUTES_PER_WEEK:
-				setMinutesPerWeek(MINUTES_PER_WEEK_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__DAYS_PER_MONTH:
-				setDaysPerMonth(DAYS_PER_MONTH_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_TYPE:
-				unsetDefaultTaskType();
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_FIXED_COST_ACCRUAL:
-				setDefaultFixedCostAccrual(DEFAULT_FIXED_COST_ACCRUAL_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_STANDARD_RATE:
-				unsetDefaultStandardRate();
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_OVERTIME_RATE:
-				unsetDefaultOvertimeRate();
-				return;
-			case MsprojectPackage.PROJECT__DURATION_FORMAT:
-				setDurationFormat(DURATION_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__WORK_FORMAT:
-				setWorkFormat(WORK_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__EDITABLE_ACTUAL_COSTS:
-				unsetEditableActualCosts();
-				return;
-			case MsprojectPackage.PROJECT__HONOR_CONSTRAINTS:
-				unsetHonorConstraints();
-				return;
-			case MsprojectPackage.PROJECT__EARNED_VALUE_METHOD:
-				setEarnedValueMethod(EARNED_VALUE_METHOD_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__INSERTED_PROJECTS_LIKE_SUMMARY:
-				unsetInsertedProjectsLikeSummary();
-				return;
-			case MsprojectPackage.PROJECT__MULTIPLE_CRITICAL_PATHS:
-				unsetMultipleCriticalPaths();
-				return;
-			case MsprojectPackage.PROJECT__NEW_TASKS_EFFORT_DRIVEN:
-				unsetNewTasksEffortDriven();
-				return;
-			case MsprojectPackage.PROJECT__NEW_TASKS_ESTIMATED:
-				unsetNewTasksEstimated();
-				return;
-			case MsprojectPackage.PROJECT__SPLITS_IN_PROGRESS_TASKS:
-				unsetSplitsInProgressTasks();
-				return;
-			case MsprojectPackage.PROJECT__SPREAD_ACTUAL_COST:
-				unsetSpreadActualCost();
-				return;
-			case MsprojectPackage.PROJECT__SPREAD_PERCENT_COMPLETE:
-				unsetSpreadPercentComplete();
-				return;
-			case MsprojectPackage.PROJECT__TASK_UPDATES_RESOURCE:
-				unsetTaskUpdatesResource();
-				return;
-			case MsprojectPackage.PROJECT__FISCAL_YEAR_START:
-				unsetFiscalYearStart();
-				return;
-			case MsprojectPackage.PROJECT__WEEK_START_DAY:
-				setWeekStartDay(WEEK_START_DAY_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_BACK:
-				unsetMoveCompletedEndsBack();
-				return;
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_BACK:
-				unsetMoveRemainingStartsBack();
-				return;
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_FORWARD:
-				unsetMoveRemainingStartsForward();
-				return;
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_FORWARD:
-				unsetMoveCompletedEndsForward();
-				return;
-			case MsprojectPackage.PROJECT__BASELINE_FOR_EARNED_VALUE:
-				setBaselineForEarnedValue(BASELINE_FOR_EARNED_VALUE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__AUTO_ADD_NEW_RESOURCES_AND_TASKS:
-				unsetAutoAddNewResourcesAndTasks();
-				return;
-			case MsprojectPackage.PROJECT__STATUS_DATE:
-				setStatusDate(STATUS_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__CURRENT_DATE:
-				setCurrentDate(CURRENT_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__MICROSOFT_PROJECT_SERVER_URL:
-				unsetMicrosoftProjectServerURL();
-				return;
-			case MsprojectPackage.PROJECT__AUTOLINK:
-				unsetAutolink();
-				return;
-			case MsprojectPackage.PROJECT__NEW_TASK_START_DATE:
-				setNewTaskStartDate(NEW_TASK_START_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_EV_METHOD:
-				setDefaultTaskEVMethod(DEFAULT_TASK_EV_METHOD_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__PROJECT_EXTERNALLY_EDITED:
-				unsetProjectExternallyEdited();
-				return;
-			case MsprojectPackage.PROJECT__EXTENDED_CREATION_DATE:
-				setExtendedCreationDate(EXTENDED_CREATION_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.PROJECT__ACTUALS_IN_SYNC:
-				unsetActualsInSync();
-				return;
-			case MsprojectPackage.PROJECT__REMOVE_FILE_PROPERTIES:
-				unsetRemoveFileProperties();
-				return;
-			case MsprojectPackage.PROJECT__ADMIN_PROJECT:
-				unsetAdminProject();
-				return;
-			case MsprojectPackage.PROJECT__OUTLINE_CODES:
-				setOutlineCodes((OutlineCodes)null);
-				return;
-			case MsprojectPackage.PROJECT__WBS_MASKS:
-				setWBSMasks((WBSMasks)null);
-				return;
-			case MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES:
-				setExtendedAttributes((ExtendedAttributes)null);
-				return;
-			case MsprojectPackage.PROJECT__CALENDARS:
-				setCalendars((Calendars)null);
-				return;
-			case MsprojectPackage.PROJECT__TASKS:
-				setTasks((Tasks)null);
-				return;
-			case MsprojectPackage.PROJECT__RESOURCES:
-				setResources((Resources)null);
-				return;
-			case MsprojectPackage.PROJECT__ASSIGNMENTS:
-				setAssignments((Assignments)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.PROJECT__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.PROJECT__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case MsprojectPackage.PROJECT__TITLE:
-				return TITLE_EDEFAULT == null ? title != null : !TITLE_EDEFAULT.equals(title);
-			case MsprojectPackage.PROJECT__SUBJECT:
-				return SUBJECT_EDEFAULT == null ? subject != null : !SUBJECT_EDEFAULT.equals(subject);
-			case MsprojectPackage.PROJECT__CATEGORY:
-				return CATEGORY_EDEFAULT == null ? category != null : !CATEGORY_EDEFAULT.equals(category);
-			case MsprojectPackage.PROJECT__COMPANY:
-				return COMPANY_EDEFAULT == null ? company != null : !COMPANY_EDEFAULT.equals(company);
-			case MsprojectPackage.PROJECT__MANAGER:
-				return MANAGER_EDEFAULT == null ? manager != null : !MANAGER_EDEFAULT.equals(manager);
-			case MsprojectPackage.PROJECT__AUTHOR:
-				return AUTHOR_EDEFAULT == null ? author != null : !AUTHOR_EDEFAULT.equals(author);
-			case MsprojectPackage.PROJECT__CREATION_DATE:
-				return CREATION_DATE_EDEFAULT == null ? creationDate != null : !CREATION_DATE_EDEFAULT.equals(creationDate);
-			case MsprojectPackage.PROJECT__REVISION:
-				return REVISION_EDEFAULT == null ? revision != null : !REVISION_EDEFAULT.equals(revision);
-			case MsprojectPackage.PROJECT__LAST_SAVED:
-				return LAST_SAVED_EDEFAULT == null ? lastSaved != null : !LAST_SAVED_EDEFAULT.equals(lastSaved);
-			case MsprojectPackage.PROJECT__SCHEDULE_FROM_START:
-				return isSetScheduleFromStart();
-			case MsprojectPackage.PROJECT__START_DATE:
-				return START_DATE_EDEFAULT == null ? startDate != null : !START_DATE_EDEFAULT.equals(startDate);
-			case MsprojectPackage.PROJECT__FINISH_DATE:
-				return FINISH_DATE_EDEFAULT == null ? finishDate != null : !FINISH_DATE_EDEFAULT.equals(finishDate);
-			case MsprojectPackage.PROJECT__FYSTART_DATE:
-				return FYSTART_DATE_EDEFAULT == null ? fYStartDate != null : !FYSTART_DATE_EDEFAULT.equals(fYStartDate);
-			case MsprojectPackage.PROJECT__CRITICAL_SLACK_LIMIT:
-				return CRITICAL_SLACK_LIMIT_EDEFAULT == null ? criticalSlackLimit != null : !CRITICAL_SLACK_LIMIT_EDEFAULT.equals(criticalSlackLimit);
-			case MsprojectPackage.PROJECT__CURRENCY_DIGITS:
-				return CURRENCY_DIGITS_EDEFAULT == null ? currencyDigits != null : !CURRENCY_DIGITS_EDEFAULT.equals(currencyDigits);
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL:
-				return CURRENCY_SYMBOL_EDEFAULT == null ? currencySymbol != null : !CURRENCY_SYMBOL_EDEFAULT.equals(currencySymbol);
-			case MsprojectPackage.PROJECT__CURRENCY_SYMBOL_POSITION:
-				return CURRENCY_SYMBOL_POSITION_EDEFAULT == null ? currencySymbolPosition != null : !CURRENCY_SYMBOL_POSITION_EDEFAULT.equals(currencySymbolPosition);
-			case MsprojectPackage.PROJECT__CALENDAR_UID:
-				return CALENDAR_UID_EDEFAULT == null ? calendarUID != null : !CALENDAR_UID_EDEFAULT.equals(calendarUID);
-			case MsprojectPackage.PROJECT__DEFAULT_START_TIME:
-				return DEFAULT_START_TIME_EDEFAULT == null ? defaultStartTime != null : !DEFAULT_START_TIME_EDEFAULT.equals(defaultStartTime);
-			case MsprojectPackage.PROJECT__DEFAULT_FINISH_TIME:
-				return DEFAULT_FINISH_TIME_EDEFAULT == null ? defaultFinishTime != null : !DEFAULT_FINISH_TIME_EDEFAULT.equals(defaultFinishTime);
-			case MsprojectPackage.PROJECT__MINUTES_PER_DAY:
-				return MINUTES_PER_DAY_EDEFAULT == null ? minutesPerDay != null : !MINUTES_PER_DAY_EDEFAULT.equals(minutesPerDay);
-			case MsprojectPackage.PROJECT__MINUTES_PER_WEEK:
-				return MINUTES_PER_WEEK_EDEFAULT == null ? minutesPerWeek != null : !MINUTES_PER_WEEK_EDEFAULT.equals(minutesPerWeek);
-			case MsprojectPackage.PROJECT__DAYS_PER_MONTH:
-				return DAYS_PER_MONTH_EDEFAULT == null ? daysPerMonth != null : !DAYS_PER_MONTH_EDEFAULT.equals(daysPerMonth);
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_TYPE:
-				return isSetDefaultTaskType();
-			case MsprojectPackage.PROJECT__DEFAULT_FIXED_COST_ACCRUAL:
-				return DEFAULT_FIXED_COST_ACCRUAL_EDEFAULT == null ? defaultFixedCostAccrual != null : !DEFAULT_FIXED_COST_ACCRUAL_EDEFAULT.equals(defaultFixedCostAccrual);
-			case MsprojectPackage.PROJECT__DEFAULT_STANDARD_RATE:
-				return isSetDefaultStandardRate();
-			case MsprojectPackage.PROJECT__DEFAULT_OVERTIME_RATE:
-				return isSetDefaultOvertimeRate();
-			case MsprojectPackage.PROJECT__DURATION_FORMAT:
-				return DURATION_FORMAT_EDEFAULT == null ? durationFormat != null : !DURATION_FORMAT_EDEFAULT.equals(durationFormat);
-			case MsprojectPackage.PROJECT__WORK_FORMAT:
-				return WORK_FORMAT_EDEFAULT == null ? workFormat != null : !WORK_FORMAT_EDEFAULT.equals(workFormat);
-			case MsprojectPackage.PROJECT__EDITABLE_ACTUAL_COSTS:
-				return isSetEditableActualCosts();
-			case MsprojectPackage.PROJECT__HONOR_CONSTRAINTS:
-				return isSetHonorConstraints();
-			case MsprojectPackage.PROJECT__EARNED_VALUE_METHOD:
-				return EARNED_VALUE_METHOD_EDEFAULT == null ? earnedValueMethod != null : !EARNED_VALUE_METHOD_EDEFAULT.equals(earnedValueMethod);
-			case MsprojectPackage.PROJECT__INSERTED_PROJECTS_LIKE_SUMMARY:
-				return isSetInsertedProjectsLikeSummary();
-			case MsprojectPackage.PROJECT__MULTIPLE_CRITICAL_PATHS:
-				return isSetMultipleCriticalPaths();
-			case MsprojectPackage.PROJECT__NEW_TASKS_EFFORT_DRIVEN:
-				return isSetNewTasksEffortDriven();
-			case MsprojectPackage.PROJECT__NEW_TASKS_ESTIMATED:
-				return isSetNewTasksEstimated();
-			case MsprojectPackage.PROJECT__SPLITS_IN_PROGRESS_TASKS:
-				return isSetSplitsInProgressTasks();
-			case MsprojectPackage.PROJECT__SPREAD_ACTUAL_COST:
-				return isSetSpreadActualCost();
-			case MsprojectPackage.PROJECT__SPREAD_PERCENT_COMPLETE:
-				return isSetSpreadPercentComplete();
-			case MsprojectPackage.PROJECT__TASK_UPDATES_RESOURCE:
-				return isSetTaskUpdatesResource();
-			case MsprojectPackage.PROJECT__FISCAL_YEAR_START:
-				return isSetFiscalYearStart();
-			case MsprojectPackage.PROJECT__WEEK_START_DAY:
-				return WEEK_START_DAY_EDEFAULT == null ? weekStartDay != null : !WEEK_START_DAY_EDEFAULT.equals(weekStartDay);
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_BACK:
-				return isSetMoveCompletedEndsBack();
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_BACK:
-				return isSetMoveRemainingStartsBack();
-			case MsprojectPackage.PROJECT__MOVE_REMAINING_STARTS_FORWARD:
-				return isSetMoveRemainingStartsForward();
-			case MsprojectPackage.PROJECT__MOVE_COMPLETED_ENDS_FORWARD:
-				return isSetMoveCompletedEndsForward();
-			case MsprojectPackage.PROJECT__BASELINE_FOR_EARNED_VALUE:
-				return BASELINE_FOR_EARNED_VALUE_EDEFAULT == null ? baselineForEarnedValue != null : !BASELINE_FOR_EARNED_VALUE_EDEFAULT.equals(baselineForEarnedValue);
-			case MsprojectPackage.PROJECT__AUTO_ADD_NEW_RESOURCES_AND_TASKS:
-				return isSetAutoAddNewResourcesAndTasks();
-			case MsprojectPackage.PROJECT__STATUS_DATE:
-				return STATUS_DATE_EDEFAULT == null ? statusDate != null : !STATUS_DATE_EDEFAULT.equals(statusDate);
-			case MsprojectPackage.PROJECT__CURRENT_DATE:
-				return CURRENT_DATE_EDEFAULT == null ? currentDate != null : !CURRENT_DATE_EDEFAULT.equals(currentDate);
-			case MsprojectPackage.PROJECT__MICROSOFT_PROJECT_SERVER_URL:
-				return isSetMicrosoftProjectServerURL();
-			case MsprojectPackage.PROJECT__AUTOLINK:
-				return isSetAutolink();
-			case MsprojectPackage.PROJECT__NEW_TASK_START_DATE:
-				return NEW_TASK_START_DATE_EDEFAULT == null ? newTaskStartDate != null : !NEW_TASK_START_DATE_EDEFAULT.equals(newTaskStartDate);
-			case MsprojectPackage.PROJECT__DEFAULT_TASK_EV_METHOD:
-				return DEFAULT_TASK_EV_METHOD_EDEFAULT == null ? defaultTaskEVMethod != null : !DEFAULT_TASK_EV_METHOD_EDEFAULT.equals(defaultTaskEVMethod);
-			case MsprojectPackage.PROJECT__PROJECT_EXTERNALLY_EDITED:
-				return isSetProjectExternallyEdited();
-			case MsprojectPackage.PROJECT__EXTENDED_CREATION_DATE:
-				return EXTENDED_CREATION_DATE_EDEFAULT == null ? extendedCreationDate != null : !EXTENDED_CREATION_DATE_EDEFAULT.equals(extendedCreationDate);
-			case MsprojectPackage.PROJECT__ACTUALS_IN_SYNC:
-				return isSetActualsInSync();
-			case MsprojectPackage.PROJECT__REMOVE_FILE_PROPERTIES:
-				return isSetRemoveFileProperties();
-			case MsprojectPackage.PROJECT__ADMIN_PROJECT:
-				return isSetAdminProject();
-			case MsprojectPackage.PROJECT__OUTLINE_CODES:
-				return outlineCodes != null;
-			case MsprojectPackage.PROJECT__WBS_MASKS:
-				return wBSMasks != null;
-			case MsprojectPackage.PROJECT__EXTENDED_ATTRIBUTES:
-				return extendedAttributes != null;
-			case MsprojectPackage.PROJECT__CALENDARS:
-				return calendars != null;
-			case MsprojectPackage.PROJECT__TASKS:
-				return tasks != null;
-			case MsprojectPackage.PROJECT__RESOURCES:
-				return resources != null;
-			case MsprojectPackage.PROJECT__ASSIGNMENTS:
-				return assignments != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", name: ");
-		result.append(name);
-		result.append(", title: ");
-		result.append(title);
-		result.append(", subject: ");
-		result.append(subject);
-		result.append(", category: ");
-		result.append(category);
-		result.append(", company: ");
-		result.append(company);
-		result.append(", manager: ");
-		result.append(manager);
-		result.append(", author: ");
-		result.append(author);
-		result.append(", creationDate: ");
-		result.append(creationDate);
-		result.append(", revision: ");
-		result.append(revision);
-		result.append(", lastSaved: ");
-		result.append(lastSaved);
-		result.append(", scheduleFromStart: ");
-		if (scheduleFromStartESet) result.append(scheduleFromStart); else result.append("<unset>");
-		result.append(", startDate: ");
-		result.append(startDate);
-		result.append(", finishDate: ");
-		result.append(finishDate);
-		result.append(", fYStartDate: ");
-		result.append(fYStartDate);
-		result.append(", criticalSlackLimit: ");
-		result.append(criticalSlackLimit);
-		result.append(", currencyDigits: ");
-		result.append(currencyDigits);
-		result.append(", currencySymbol: ");
-		result.append(currencySymbol);
-		result.append(", currencySymbolPosition: ");
-		result.append(currencySymbolPosition);
-		result.append(", calendarUID: ");
-		result.append(calendarUID);
-		result.append(", defaultStartTime: ");
-		result.append(defaultStartTime);
-		result.append(", defaultFinishTime: ");
-		result.append(defaultFinishTime);
-		result.append(", minutesPerDay: ");
-		result.append(minutesPerDay);
-		result.append(", minutesPerWeek: ");
-		result.append(minutesPerWeek);
-		result.append(", daysPerMonth: ");
-		result.append(daysPerMonth);
-		result.append(", defaultTaskType: ");
-		if (defaultTaskTypeESet) result.append(defaultTaskType); else result.append("<unset>");
-		result.append(", defaultFixedCostAccrual: ");
-		result.append(defaultFixedCostAccrual);
-		result.append(", defaultStandardRate: ");
-		if (defaultStandardRateESet) result.append(defaultStandardRate); else result.append("<unset>");
-		result.append(", defaultOvertimeRate: ");
-		if (defaultOvertimeRateESet) result.append(defaultOvertimeRate); else result.append("<unset>");
-		result.append(", durationFormat: ");
-		result.append(durationFormat);
-		result.append(", workFormat: ");
-		result.append(workFormat);
-		result.append(", editableActualCosts: ");
-		if (editableActualCostsESet) result.append(editableActualCosts); else result.append("<unset>");
-		result.append(", honorConstraints: ");
-		if (honorConstraintsESet) result.append(honorConstraints); else result.append("<unset>");
-		result.append(", earnedValueMethod: ");
-		result.append(earnedValueMethod);
-		result.append(", insertedProjectsLikeSummary: ");
-		if (insertedProjectsLikeSummaryESet) result.append(insertedProjectsLikeSummary); else result.append("<unset>");
-		result.append(", multipleCriticalPaths: ");
-		if (multipleCriticalPathsESet) result.append(multipleCriticalPaths); else result.append("<unset>");
-		result.append(", newTasksEffortDriven: ");
-		if (newTasksEffortDrivenESet) result.append(newTasksEffortDriven); else result.append("<unset>");
-		result.append(", newTasksEstimated: ");
-		if (newTasksEstimatedESet) result.append(newTasksEstimated); else result.append("<unset>");
-		result.append(", splitsInProgressTasks: ");
-		if (splitsInProgressTasksESet) result.append(splitsInProgressTasks); else result.append("<unset>");
-		result.append(", spreadActualCost: ");
-		if (spreadActualCostESet) result.append(spreadActualCost); else result.append("<unset>");
-		result.append(", spreadPercentComplete: ");
-		if (spreadPercentCompleteESet) result.append(spreadPercentComplete); else result.append("<unset>");
-		result.append(", taskUpdatesResource: ");
-		if (taskUpdatesResourceESet) result.append(taskUpdatesResource); else result.append("<unset>");
-		result.append(", fiscalYearStart: ");
-		if (fiscalYearStartESet) result.append(fiscalYearStart); else result.append("<unset>");
-		result.append(", weekStartDay: ");
-		result.append(weekStartDay);
-		result.append(", moveCompletedEndsBack: ");
-		if (moveCompletedEndsBackESet) result.append(moveCompletedEndsBack); else result.append("<unset>");
-		result.append(", moveRemainingStartsBack: ");
-		if (moveRemainingStartsBackESet) result.append(moveRemainingStartsBack); else result.append("<unset>");
-		result.append(", moveRemainingStartsForward: ");
-		if (moveRemainingStartsForwardESet) result.append(moveRemainingStartsForward); else result.append("<unset>");
-		result.append(", moveCompletedEndsForward: ");
-		if (moveCompletedEndsForwardESet) result.append(moveCompletedEndsForward); else result.append("<unset>");
-		result.append(", baselineForEarnedValue: ");
-		result.append(baselineForEarnedValue);
-		result.append(", autoAddNewResourcesAndTasks: ");
-		if (autoAddNewResourcesAndTasksESet) result.append(autoAddNewResourcesAndTasks); else result.append("<unset>");
-		result.append(", statusDate: ");
-		result.append(statusDate);
-		result.append(", currentDate: ");
-		result.append(currentDate);
-		result.append(", microsoftProjectServerURL: ");
-		if (microsoftProjectServerURLESet) result.append(microsoftProjectServerURL); else result.append("<unset>");
-		result.append(", autolink: ");
-		if (autolinkESet) result.append(autolink); else result.append("<unset>");
-		result.append(", newTaskStartDate: ");
-		result.append(newTaskStartDate);
-		result.append(", defaultTaskEVMethod: ");
-		result.append(defaultTaskEVMethod);
-		result.append(", projectExternallyEdited: ");
-		if (projectExternallyEditedESet) result.append(projectExternallyEdited); else result.append("<unset>");
-		result.append(", extendedCreationDate: ");
-		result.append(extendedCreationDate);
-		result.append(", actualsInSync: ");
-		if (actualsInSyncESet) result.append(actualsInSync); else result.append("<unset>");
-		result.append(", removeFileProperties: ");
-		if (removeFilePropertiesESet) result.append(removeFileProperties); else result.append("<unset>");
-		result.append(", adminProject: ");
-		if (adminProjectESet) result.append(adminProject); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProjectImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/RateImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/RateImpl.java
deleted file mode 100644
index 6acdaf6..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/RateImpl.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RateImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Rate;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Rate</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getRatesFrom <em>Rates From</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getRatesTo <em>Rates To</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getRateTable <em>Rate Table</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getStandardRate <em>Standard Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getStandardRateFormat <em>Standard Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getOvertimeRate <em>Overtime Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getOvertimeRateFormat <em>Overtime Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.RateImpl#getCostPerUse <em>Cost Per Use</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RateImpl extends EObjectImpl implements Rate {
-	/**
-	 * The default value of the '{@link #getRatesFrom() <em>Rates From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRatesFrom()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object RATES_FROM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRatesFrom() <em>Rates From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRatesFrom()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object ratesFrom = RATES_FROM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRatesTo() <em>Rates To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRatesTo()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object RATES_TO_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRatesTo() <em>Rates To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRatesTo()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object ratesTo = RATES_TO_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRateTable() <em>Rate Table</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRateTable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger RATE_TABLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRateTable() <em>Rate Table</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRateTable()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger rateTable = RATE_TABLE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStandardRate() <em>Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal STANDARD_RATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStandardRate() <em>Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal standardRate = STANDARD_RATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStandardRateFormat() <em>Standard Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger STANDARD_RATE_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStandardRateFormat() <em>Standard Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger standardRateFormat = STANDARD_RATE_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeRate() <em>Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal OVERTIME_RATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeRate() <em>Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal overtimeRate = OVERTIME_RATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeRateFormat() <em>Overtime Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger OVERTIME_RATE_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeRateFormat() <em>Overtime Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger overtimeRateFormat = OVERTIME_RATE_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCostPerUse() <em>Cost Per Use</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostPerUse()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal COST_PER_USE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCostPerUse() <em>Cost Per Use</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostPerUse()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal costPerUse = COST_PER_USE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RateImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getRate();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRatesFrom() {
-		return ratesFrom;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRatesFrom(Object newRatesFrom) {
-		Object oldRatesFrom = ratesFrom;
-		ratesFrom = newRatesFrom;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__RATES_FROM, oldRatesFrom, ratesFrom));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRatesTo() {
-		return ratesTo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRatesTo(Object newRatesTo) {
-		Object oldRatesTo = ratesTo;
-		ratesTo = newRatesTo;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__RATES_TO, oldRatesTo, ratesTo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getRateTable() {
-		return rateTable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRateTable(BigInteger newRateTable) {
-		BigInteger oldRateTable = rateTable;
-		rateTable = newRateTable;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__RATE_TABLE, oldRateTable, rateTable));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getStandardRate() {
-		return standardRate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStandardRate(BigDecimal newStandardRate) {
-		BigDecimal oldStandardRate = standardRate;
-		standardRate = newStandardRate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__STANDARD_RATE, oldStandardRate, standardRate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getStandardRateFormat() {
-		return standardRateFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStandardRateFormat(BigInteger newStandardRateFormat) {
-		BigInteger oldStandardRateFormat = standardRateFormat;
-		standardRateFormat = newStandardRateFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__STANDARD_RATE_FORMAT, oldStandardRateFormat, standardRateFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getOvertimeRate() {
-		return overtimeRate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeRate(BigDecimal newOvertimeRate) {
-		BigDecimal oldOvertimeRate = overtimeRate;
-		overtimeRate = newOvertimeRate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__OVERTIME_RATE, oldOvertimeRate, overtimeRate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getOvertimeRateFormat() {
-		return overtimeRateFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeRateFormat(BigInteger newOvertimeRateFormat) {
-		BigInteger oldOvertimeRateFormat = overtimeRateFormat;
-		overtimeRateFormat = newOvertimeRateFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__OVERTIME_RATE_FORMAT, oldOvertimeRateFormat, overtimeRateFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getCostPerUse() {
-		return costPerUse;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCostPerUse(BigDecimal newCostPerUse) {
-		BigDecimal oldCostPerUse = costPerUse;
-		costPerUse = newCostPerUse;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RATE__COST_PER_USE, oldCostPerUse, costPerUse));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATE__RATES_FROM:
-				return getRatesFrom();
-			case MsprojectPackage.RATE__RATES_TO:
-				return getRatesTo();
-			case MsprojectPackage.RATE__RATE_TABLE:
-				return getRateTable();
-			case MsprojectPackage.RATE__STANDARD_RATE:
-				return getStandardRate();
-			case MsprojectPackage.RATE__STANDARD_RATE_FORMAT:
-				return getStandardRateFormat();
-			case MsprojectPackage.RATE__OVERTIME_RATE:
-				return getOvertimeRate();
-			case MsprojectPackage.RATE__OVERTIME_RATE_FORMAT:
-				return getOvertimeRateFormat();
-			case MsprojectPackage.RATE__COST_PER_USE:
-				return getCostPerUse();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATE__RATES_FROM:
-				setRatesFrom((Object)newValue);
-				return;
-			case MsprojectPackage.RATE__RATES_TO:
-				setRatesTo((Object)newValue);
-				return;
-			case MsprojectPackage.RATE__RATE_TABLE:
-				setRateTable((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RATE__STANDARD_RATE:
-				setStandardRate((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RATE__STANDARD_RATE_FORMAT:
-				setStandardRateFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RATE__OVERTIME_RATE:
-				setOvertimeRate((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RATE__OVERTIME_RATE_FORMAT:
-				setOvertimeRateFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RATE__COST_PER_USE:
-				setCostPerUse((BigDecimal)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATE__RATES_FROM:
-				setRatesFrom(RATES_FROM_EDEFAULT);
-				return;
-			case MsprojectPackage.RATE__RATES_TO:
-				setRatesTo(RATES_TO_EDEFAULT);
-				return;
-			case MsprojectPackage.RATE__RATE_TABLE:
-				setRateTable(RATE_TABLE_EDEFAULT);
-				return;
-			case MsprojectPackage.RATE__STANDARD_RATE:
-				setStandardRate(STANDARD_RATE_EDEFAULT);
-				return;
-			case MsprojectPackage.RATE__STANDARD_RATE_FORMAT:
-				setStandardRateFormat(STANDARD_RATE_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.RATE__OVERTIME_RATE:
-				setOvertimeRate(OVERTIME_RATE_EDEFAULT);
-				return;
-			case MsprojectPackage.RATE__OVERTIME_RATE_FORMAT:
-				setOvertimeRateFormat(OVERTIME_RATE_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.RATE__COST_PER_USE:
-				setCostPerUse(COST_PER_USE_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATE__RATES_FROM:
-				return RATES_FROM_EDEFAULT == null ? ratesFrom != null : !RATES_FROM_EDEFAULT.equals(ratesFrom);
-			case MsprojectPackage.RATE__RATES_TO:
-				return RATES_TO_EDEFAULT == null ? ratesTo != null : !RATES_TO_EDEFAULT.equals(ratesTo);
-			case MsprojectPackage.RATE__RATE_TABLE:
-				return RATE_TABLE_EDEFAULT == null ? rateTable != null : !RATE_TABLE_EDEFAULT.equals(rateTable);
-			case MsprojectPackage.RATE__STANDARD_RATE:
-				return STANDARD_RATE_EDEFAULT == null ? standardRate != null : !STANDARD_RATE_EDEFAULT.equals(standardRate);
-			case MsprojectPackage.RATE__STANDARD_RATE_FORMAT:
-				return STANDARD_RATE_FORMAT_EDEFAULT == null ? standardRateFormat != null : !STANDARD_RATE_FORMAT_EDEFAULT.equals(standardRateFormat);
-			case MsprojectPackage.RATE__OVERTIME_RATE:
-				return OVERTIME_RATE_EDEFAULT == null ? overtimeRate != null : !OVERTIME_RATE_EDEFAULT.equals(overtimeRate);
-			case MsprojectPackage.RATE__OVERTIME_RATE_FORMAT:
-				return OVERTIME_RATE_FORMAT_EDEFAULT == null ? overtimeRateFormat != null : !OVERTIME_RATE_FORMAT_EDEFAULT.equals(overtimeRateFormat);
-			case MsprojectPackage.RATE__COST_PER_USE:
-				return COST_PER_USE_EDEFAULT == null ? costPerUse != null : !COST_PER_USE_EDEFAULT.equals(costPerUse);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (ratesFrom: ");
-		result.append(ratesFrom);
-		result.append(", ratesTo: ");
-		result.append(ratesTo);
-		result.append(", rateTable: ");
-		result.append(rateTable);
-		result.append(", standardRate: ");
-		result.append(standardRate);
-		result.append(", standardRateFormat: ");
-		result.append(standardRateFormat);
-		result.append(", overtimeRate: ");
-		result.append(overtimeRate);
-		result.append(", overtimeRateFormat: ");
-		result.append(overtimeRateFormat);
-		result.append(", costPerUse: ");
-		result.append(costPerUse);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RateImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/RatesImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/RatesImpl.java
deleted file mode 100644
index 172c054..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/RatesImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RatesImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Rate;
-import org.eclipse.epf.msproject.Rates;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Rates</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.RatesImpl#getRate <em>Rate</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RatesImpl extends EObjectImpl implements Rates {
-	/**
-	 * The cached value of the '{@link #getRate() <em>Rate</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList rate = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RatesImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getRates();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRate() {
-		if (rate == null) {
-			rate = new EObjectContainmentEList(Rate.class, this, MsprojectPackage.RATES__RATE);
-		}
-		return rate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.RATES__RATE:
-					return ((InternalEList)getRate()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATES__RATE:
-				return getRate();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATES__RATE:
-				getRate().clear();
-				getRate().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATES__RATE:
-				getRate().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RATES__RATE:
-				return rate != null && !rate.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //RatesImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ResourceImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ResourceImpl.java
deleted file mode 100644
index 4527d7b..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ResourceImpl.java
+++ /dev/null
@@ -1,4215 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ResourceImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-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.EStructuralFeature;
-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.epf.msproject.AvailabilityPeriods;
-import org.eclipse.epf.msproject.Baseline2;
-import org.eclipse.epf.msproject.ExtendedAttribute3;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode3;
-import org.eclipse.epf.msproject.Rates;
-import org.eclipse.epf.msproject.Resource;
-import org.eclipse.epf.msproject.TimephasedDataType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#isIsNull <em>Is Null</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getInitials <em>Initials</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getPhonetics <em>Phonetics</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getNTAccount <em>NT Account</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getMaterialLabel <em>Material Label</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getCode <em>Code</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getWorkGroup <em>Work Group</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getEmailAddress <em>Email Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getHyperlink <em>Hyperlink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getHyperlinkAddress <em>Hyperlink Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getMaxUnits <em>Max Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getPeakUnits <em>Peak Units</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#isOverAllocated <em>Over Allocated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getAvailableFrom <em>Available From</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getAvailableTo <em>Available To</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#isCanLevel <em>Can Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getAccrueAt <em>Accrue At</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getRegularWork <em>Regular Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getOvertimeWork <em>Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getActualWork <em>Actual Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getRemainingWork <em>Remaining Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getActualOvertimeWork <em>Actual Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getPercentWorkComplete <em>Percent Work Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getStandardRate <em>Standard Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getStandardRateFormat <em>Standard Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getOvertimeRate <em>Overtime Rate</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getOvertimeRateFormat <em>Overtime Rate Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getOvertimeCost <em>Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getCostPerUse <em>Cost Per Use</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getActualCost <em>Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getActualOvertimeCost <em>Actual Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getRemainingCost <em>Remaining Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getWorkVariance <em>Work Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getCostVariance <em>Cost Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getSV <em>SV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getCV <em>CV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getACWP <em>ACWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getCalendarUID <em>Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getNotes <em>Notes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getBCWP <em>BCWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#isIsGeneric <em>Is Generic</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#isIsInactive <em>Is Inactive</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#isIsEnterprise <em>Is Enterprise</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getBookingType <em>Booking Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getActualWorkProtected <em>Actual Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getActiveDirectoryGUID <em>Active Directory GUID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getCreationDate <em>Creation Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getExtendedAttribute <em>Extended Attribute</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getBaseline <em>Baseline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getOutlineCode <em>Outline Code</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getAvailabilityPeriods <em>Availability Periods</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getRates <em>Rates</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourceImpl#getTimephasedData <em>Timephased Data</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceImpl extends EObjectImpl implements Resource {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger iD = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger type = TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isIsNull() <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsNull()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_NULL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsNull() <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsNull()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isNull = IS_NULL_EDEFAULT;
-
-	/**
-	 * This is true if the Is Null attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isNullESet = false;
-
-	/**
-	 * The default value of the '{@link #getInitials() <em>Initials</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInitials()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String INITIALS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getInitials() <em>Initials</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInitials()
-	 * @generated
-	 * @ordered
-	 */
-	protected String initials = INITIALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPhonetics() <em>Phonetics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhonetics()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PHONETICS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPhonetics() <em>Phonetics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhonetics()
-	 * @generated
-	 * @ordered
-	 */
-	protected String phonetics = PHONETICS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNTAccount() <em>NT Account</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNTAccount()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NTACCOUNT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNTAccount() <em>NT Account</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNTAccount()
-	 * @generated
-	 * @ordered
-	 */
-	protected String nTAccount = NTACCOUNT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMaterialLabel() <em>Material Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaterialLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MATERIAL_LABEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMaterialLabel() <em>Material Label</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaterialLabel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String materialLabel = MATERIAL_LABEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCode() <em>Code</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCode()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CODE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCode() <em>Code</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCode()
-	 * @generated
-	 * @ordered
-	 */
-	protected String code = CODE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGroup() <em>Group</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String GROUP_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getGroup() <em>Group</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup()
-	 * @generated
-	 * @ordered
-	 */
-	protected String group = GROUP_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWorkGroup() <em>Work Group</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkGroup()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger WORK_GROUP_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWorkGroup() <em>Work Group</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkGroup()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger workGroup = WORK_GROUP_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEmailAddress() <em>Email Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEmailAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String EMAIL_ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEmailAddress() <em>Email Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEmailAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String emailAddress = EMAIL_ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlink() <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlink()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlink() <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlink()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlink = HYPERLINK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlinkAddress() <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlinkAddress() <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlinkAddress = HYPERLINK_ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlinkSubAddress() <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_SUB_ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlinkSubAddress() <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlinkSubAddress = HYPERLINK_SUB_ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMaxUnits() <em>Max Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaxUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float MAX_UNITS_EDEFAULT = 1.0F;
-
-	/**
-	 * The cached value of the '{@link #getMaxUnits() <em>Max Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaxUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected float maxUnits = MAX_UNITS_EDEFAULT;
-
-	/**
-	 * This is true if the Max Units attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean maxUnitsESet = false;
-
-	/**
-	 * The default value of the '{@link #getPeakUnits() <em>Peak Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPeakUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float PEAK_UNITS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getPeakUnits() <em>Peak Units</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPeakUnits()
-	 * @generated
-	 * @ordered
-	 */
-	protected float peakUnits = PEAK_UNITS_EDEFAULT;
-
-	/**
-	 * This is true if the Peak Units attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean peakUnitsESet = false;
-
-	/**
-	 * The default value of the '{@link #isOverAllocated() <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOverAllocated()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean OVER_ALLOCATED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isOverAllocated() <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOverAllocated()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean overAllocated = OVER_ALLOCATED_EDEFAULT;
-
-	/**
-	 * This is true if the Over Allocated attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean overAllocatedESet = false;
-
-	/**
-	 * The default value of the '{@link #getAvailableFrom() <em>Available From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableFrom()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object AVAILABLE_FROM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAvailableFrom() <em>Available From</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableFrom()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object availableFrom = AVAILABLE_FROM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAvailableTo() <em>Available To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableTo()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object AVAILABLE_TO_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAvailableTo() <em>Available To</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailableTo()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object availableTo = AVAILABLE_TO_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object start = START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object finish = FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isCanLevel() <em>Can Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isCanLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean CAN_LEVEL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isCanLevel() <em>Can Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isCanLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean canLevel = CAN_LEVEL_EDEFAULT;
-
-	/**
-	 * This is true if the Can Level attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean canLevelESet = false;
-
-	/**
-	 * The default value of the '{@link #getAccrueAt() <em>Accrue At</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAccrueAt()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger ACCRUE_AT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAccrueAt() <em>Accrue At</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAccrueAt()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger accrueAt = ACCRUE_AT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object work = WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRegularWork() <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegularWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REGULAR_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRegularWork() <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegularWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object regularWork = REGULAR_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeWork() <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeWork() <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object overtimeWork = OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualWork() <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualWork() <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualWork = ACTUAL_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingWork() <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REMAINING_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingWork() <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object remainingWork = REMAINING_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeWork() <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeWork() <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualOvertimeWork = ACTUAL_OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingOvertimeWork() <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REMAINING_OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingOvertimeWork() <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object remainingOvertimeWork = REMAINING_OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPercentWorkComplete() <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PERCENT_WORK_COMPLETE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPercentWorkComplete() <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger percentWorkComplete = PERCENT_WORK_COMPLETE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStandardRate() <em>Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal STANDARD_RATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStandardRate() <em>Standard Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal standardRate = STANDARD_RATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStandardRateFormat() <em>Standard Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger STANDARD_RATE_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStandardRateFormat() <em>Standard Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStandardRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger standardRateFormat = STANDARD_RATE_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal cost = COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeRate() <em>Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal OVERTIME_RATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeRate() <em>Overtime Rate</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRate()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal overtimeRate = OVERTIME_RATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeRateFormat() <em>Overtime Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger OVERTIME_RATE_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeRateFormat() <em>Overtime Rate Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeRateFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger overtimeRateFormat = OVERTIME_RATE_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeCost() <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeCost() <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal overtimeCost = OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCostPerUse() <em>Cost Per Use</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostPerUse()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal COST_PER_USE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCostPerUse() <em>Cost Per Use</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostPerUse()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal costPerUse = COST_PER_USE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualCost() <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal ACTUAL_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualCost() <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal actualCost = ACTUAL_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeCost() <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal ACTUAL_OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeCost() <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal actualOvertimeCost = ACTUAL_OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingCost() <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal REMAINING_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingCost() <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal remainingCost = REMAINING_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingOvertimeCost() <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal REMAINING_OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingOvertimeCost() <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal remainingOvertimeCost = REMAINING_OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWorkVariance() <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float WORK_VARIANCE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getWorkVariance() <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected float workVariance = WORK_VARIANCE_EDEFAULT;
-
-	/**
-	 * This is true if the Work Variance attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean workVarianceESet = false;
-
-	/**
-	 * The default value of the '{@link #getCostVariance() <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float COST_VARIANCE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getCostVariance() <em>Cost Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCostVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected float costVariance = COST_VARIANCE_EDEFAULT;
-
-	/**
-	 * This is true if the Cost Variance attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean costVarianceESet = false;
-
-	/**
-	 * The default value of the '{@link #getSV() <em>SV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSV()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float SV_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getSV() <em>SV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSV()
-	 * @generated
-	 * @ordered
-	 */
-	protected float sV = SV_EDEFAULT;
-
-	/**
-	 * This is true if the SV attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean sVESet = false;
-
-	/**
-	 * The default value of the '{@link #getCV() <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCV()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float CV_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getCV() <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCV()
-	 * @generated
-	 * @ordered
-	 */
-	protected float cV = CV_EDEFAULT;
-
-	/**
-	 * This is true if the CV attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean cVESet = false;
-
-	/**
-	 * The default value of the '{@link #getACWP() <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getACWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float ACWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getACWP() <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getACWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float aCWP = ACWP_EDEFAULT;
-
-	/**
-	 * This is true if the ACWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean aCWPESet = false;
-
-	/**
-	 * The default value of the '{@link #getCalendarUID() <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CALENDAR_UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCalendarUID() <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger calendarUID = CALENDAR_UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNotes() <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NOTES_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNotes() <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected String notes = NOTES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWS = BCWS_EDEFAULT;
-
-	/**
-	 * This is true if the BCWS attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWSESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWP = BCWP_EDEFAULT;
-
-	/**
-	 * This is true if the BCWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWPESet = false;
-
-	/**
-	 * The default value of the '{@link #isIsGeneric() <em>Is Generic</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsGeneric()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_GENERIC_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsGeneric() <em>Is Generic</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsGeneric()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isGeneric = IS_GENERIC_EDEFAULT;
-
-	/**
-	 * This is true if the Is Generic attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isGenericESet = false;
-
-	/**
-	 * The default value of the '{@link #isIsInactive() <em>Is Inactive</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsInactive()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_INACTIVE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsInactive() <em>Is Inactive</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsInactive()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isInactive = IS_INACTIVE_EDEFAULT;
-
-	/**
-	 * This is true if the Is Inactive attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isInactiveESet = false;
-
-	/**
-	 * The default value of the '{@link #isIsEnterprise() <em>Is Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsEnterprise()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_ENTERPRISE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsEnterprise() <em>Is Enterprise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsEnterprise()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isEnterprise = IS_ENTERPRISE_EDEFAULT;
-
-	/**
-	 * This is true if the Is Enterprise attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isEnterpriseESet = false;
-
-	/**
-	 * The default value of the '{@link #getBookingType() <em>Booking Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBookingType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger BOOKING_TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBookingType() <em>Booking Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBookingType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger bookingType = BOOKING_TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualWorkProtected() <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_WORK_PROTECTED_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualWorkProtected() <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualWorkProtected = ACTUAL_WORK_PROTECTED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeWorkProtected() <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeWorkProtected() <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualOvertimeWorkProtected = ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActiveDirectoryGUID() <em>Active Directory GUID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActiveDirectoryGUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ACTIVE_DIRECTORY_GUID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActiveDirectoryGUID() <em>Active Directory GUID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActiveDirectoryGUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected String activeDirectoryGUID = ACTIVE_DIRECTORY_GUID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCreationDate() <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CREATION_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCreationDate() <em>Creation Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreationDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object creationDate = CREATION_DATE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getExtendedAttribute() <em>Extended Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList extendedAttribute = null;
-
-	/**
-	 * The cached value of the '{@link #getBaseline() <em>Baseline</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaseline()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList baseline = null;
-
-	/**
-	 * The cached value of the '{@link #getOutlineCode() <em>Outline Code</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineCode()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList outlineCode = null;
-
-	/**
-	 * The cached value of the '{@link #getAvailabilityPeriods() <em>Availability Periods</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAvailabilityPeriods()
-	 * @generated
-	 * @ordered
-	 */
-	protected AvailabilityPeriods availabilityPeriods = null;
-
-	/**
-	 * The cached value of the '{@link #getRates() <em>Rates</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRates()
-	 * @generated
-	 * @ordered
-	 */
-	protected Rates rates = null;
-
-	/**
-	 * The cached value of the '{@link #getTimephasedData() <em>Timephased Data</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTimephasedData()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList timephasedData = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResourceImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getResource();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getID() {
-		return iD;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setID(BigInteger newID) {
-		BigInteger oldID = iD;
-		iD = newID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ID, oldID, iD));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(BigInteger newType) {
-		BigInteger oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsNull() {
-		return isNull;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsNull(boolean newIsNull) {
-		boolean oldIsNull = isNull;
-		isNull = newIsNull;
-		boolean oldIsNullESet = isNullESet;
-		isNullESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__IS_NULL, oldIsNull, isNull, !oldIsNullESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsNull() {
-		boolean oldIsNull = isNull;
-		boolean oldIsNullESet = isNullESet;
-		isNull = IS_NULL_EDEFAULT;
-		isNullESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__IS_NULL, oldIsNull, IS_NULL_EDEFAULT, oldIsNullESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsNull() {
-		return isNullESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getInitials() {
-		return initials;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setInitials(String newInitials) {
-		String oldInitials = initials;
-		initials = newInitials;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__INITIALS, oldInitials, initials));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPhonetics() {
-		return phonetics;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPhonetics(String newPhonetics) {
-		String oldPhonetics = phonetics;
-		phonetics = newPhonetics;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__PHONETICS, oldPhonetics, phonetics));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNTAccount() {
-		return nTAccount;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNTAccount(String newNTAccount) {
-		String oldNTAccount = nTAccount;
-		nTAccount = newNTAccount;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__NTACCOUNT, oldNTAccount, nTAccount));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getMaterialLabel() {
-		return materialLabel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMaterialLabel(String newMaterialLabel) {
-		String oldMaterialLabel = materialLabel;
-		materialLabel = newMaterialLabel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__MATERIAL_LABEL, oldMaterialLabel, materialLabel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCode() {
-		return code;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCode(String newCode) {
-		String oldCode = code;
-		code = newCode;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__CODE, oldCode, code));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getGroup() {
-		return group;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGroup(String newGroup) {
-		String oldGroup = group;
-		group = newGroup;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__GROUP, oldGroup, group));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getWorkGroup() {
-		return workGroup;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkGroup(BigInteger newWorkGroup) {
-		BigInteger oldWorkGroup = workGroup;
-		workGroup = newWorkGroup;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__WORK_GROUP, oldWorkGroup, workGroup));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getEmailAddress() {
-		return emailAddress;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEmailAddress(String newEmailAddress) {
-		String oldEmailAddress = emailAddress;
-		emailAddress = newEmailAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__EMAIL_ADDRESS, oldEmailAddress, emailAddress));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlink() {
-		return hyperlink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlink(String newHyperlink) {
-		String oldHyperlink = hyperlink;
-		hyperlink = newHyperlink;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__HYPERLINK, oldHyperlink, hyperlink));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlinkAddress() {
-		return hyperlinkAddress;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlinkAddress(String newHyperlinkAddress) {
-		String oldHyperlinkAddress = hyperlinkAddress;
-		hyperlinkAddress = newHyperlinkAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__HYPERLINK_ADDRESS, oldHyperlinkAddress, hyperlinkAddress));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlinkSubAddress() {
-		return hyperlinkSubAddress;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlinkSubAddress(String newHyperlinkSubAddress) {
-		String oldHyperlinkSubAddress = hyperlinkSubAddress;
-		hyperlinkSubAddress = newHyperlinkSubAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__HYPERLINK_SUB_ADDRESS, oldHyperlinkSubAddress, hyperlinkSubAddress));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getMaxUnits() {
-		return maxUnits;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMaxUnits(float newMaxUnits) {
-		float oldMaxUnits = maxUnits;
-		maxUnits = newMaxUnits;
-		boolean oldMaxUnitsESet = maxUnitsESet;
-		maxUnitsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__MAX_UNITS, oldMaxUnits, maxUnits, !oldMaxUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMaxUnits() {
-		float oldMaxUnits = maxUnits;
-		boolean oldMaxUnitsESet = maxUnitsESet;
-		maxUnits = MAX_UNITS_EDEFAULT;
-		maxUnitsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__MAX_UNITS, oldMaxUnits, MAX_UNITS_EDEFAULT, oldMaxUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMaxUnits() {
-		return maxUnitsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getPeakUnits() {
-		return peakUnits;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPeakUnits(float newPeakUnits) {
-		float oldPeakUnits = peakUnits;
-		peakUnits = newPeakUnits;
-		boolean oldPeakUnitsESet = peakUnitsESet;
-		peakUnitsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__PEAK_UNITS, oldPeakUnits, peakUnits, !oldPeakUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetPeakUnits() {
-		float oldPeakUnits = peakUnits;
-		boolean oldPeakUnitsESet = peakUnitsESet;
-		peakUnits = PEAK_UNITS_EDEFAULT;
-		peakUnitsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__PEAK_UNITS, oldPeakUnits, PEAK_UNITS_EDEFAULT, oldPeakUnitsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetPeakUnits() {
-		return peakUnitsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isOverAllocated() {
-		return overAllocated;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOverAllocated(boolean newOverAllocated) {
-		boolean oldOverAllocated = overAllocated;
-		overAllocated = newOverAllocated;
-		boolean oldOverAllocatedESet = overAllocatedESet;
-		overAllocatedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__OVER_ALLOCATED, oldOverAllocated, overAllocated, !oldOverAllocatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetOverAllocated() {
-		boolean oldOverAllocated = overAllocated;
-		boolean oldOverAllocatedESet = overAllocatedESet;
-		overAllocated = OVER_ALLOCATED_EDEFAULT;
-		overAllocatedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__OVER_ALLOCATED, oldOverAllocated, OVER_ALLOCATED_EDEFAULT, oldOverAllocatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetOverAllocated() {
-		return overAllocatedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getAvailableFrom() {
-		return availableFrom;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAvailableFrom(Object newAvailableFrom) {
-		Object oldAvailableFrom = availableFrom;
-		availableFrom = newAvailableFrom;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__AVAILABLE_FROM, oldAvailableFrom, availableFrom));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getAvailableTo() {
-		return availableTo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAvailableTo(Object newAvailableTo) {
-		Object oldAvailableTo = availableTo;
-		availableTo = newAvailableTo;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__AVAILABLE_TO, oldAvailableTo, availableTo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStart() {
-		return start;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStart(Object newStart) {
-		Object oldStart = start;
-		start = newStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__START, oldStart, start));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFinish() {
-		return finish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinish(Object newFinish) {
-		Object oldFinish = finish;
-		finish = newFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__FINISH, oldFinish, finish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isCanLevel() {
-		return canLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCanLevel(boolean newCanLevel) {
-		boolean oldCanLevel = canLevel;
-		canLevel = newCanLevel;
-		boolean oldCanLevelESet = canLevelESet;
-		canLevelESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__CAN_LEVEL, oldCanLevel, canLevel, !oldCanLevelESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCanLevel() {
-		boolean oldCanLevel = canLevel;
-		boolean oldCanLevelESet = canLevelESet;
-		canLevel = CAN_LEVEL_EDEFAULT;
-		canLevelESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__CAN_LEVEL, oldCanLevel, CAN_LEVEL_EDEFAULT, oldCanLevelESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCanLevel() {
-		return canLevelESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getAccrueAt() {
-		return accrueAt;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAccrueAt(BigInteger newAccrueAt) {
-		BigInteger oldAccrueAt = accrueAt;
-		accrueAt = newAccrueAt;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACCRUE_AT, oldAccrueAt, accrueAt));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getWork() {
-		return work;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWork(Object newWork) {
-		Object oldWork = work;
-		work = newWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__WORK, oldWork, work));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRegularWork() {
-		return regularWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRegularWork(Object newRegularWork) {
-		Object oldRegularWork = regularWork;
-		regularWork = newRegularWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__REGULAR_WORK, oldRegularWork, regularWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getOvertimeWork() {
-		return overtimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeWork(Object newOvertimeWork) {
-		Object oldOvertimeWork = overtimeWork;
-		overtimeWork = newOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__OVERTIME_WORK, oldOvertimeWork, overtimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualWork() {
-		return actualWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualWork(Object newActualWork) {
-		Object oldActualWork = actualWork;
-		actualWork = newActualWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACTUAL_WORK, oldActualWork, actualWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRemainingWork() {
-		return remainingWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingWork(Object newRemainingWork) {
-		Object oldRemainingWork = remainingWork;
-		remainingWork = newRemainingWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__REMAINING_WORK, oldRemainingWork, remainingWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualOvertimeWork() {
-		return actualOvertimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeWork(Object newActualOvertimeWork) {
-		Object oldActualOvertimeWork = actualOvertimeWork;
-		actualOvertimeWork = newActualOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK, oldActualOvertimeWork, actualOvertimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRemainingOvertimeWork() {
-		return remainingOvertimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingOvertimeWork(Object newRemainingOvertimeWork) {
-		Object oldRemainingOvertimeWork = remainingOvertimeWork;
-		remainingOvertimeWork = newRemainingOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__REMAINING_OVERTIME_WORK, oldRemainingOvertimeWork, remainingOvertimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getPercentWorkComplete() {
-		return percentWorkComplete;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPercentWorkComplete(BigInteger newPercentWorkComplete) {
-		BigInteger oldPercentWorkComplete = percentWorkComplete;
-		percentWorkComplete = newPercentWorkComplete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__PERCENT_WORK_COMPLETE, oldPercentWorkComplete, percentWorkComplete));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getStandardRate() {
-		return standardRate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStandardRate(BigDecimal newStandardRate) {
-		BigDecimal oldStandardRate = standardRate;
-		standardRate = newStandardRate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__STANDARD_RATE, oldStandardRate, standardRate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getStandardRateFormat() {
-		return standardRateFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStandardRateFormat(BigInteger newStandardRateFormat) {
-		BigInteger oldStandardRateFormat = standardRateFormat;
-		standardRateFormat = newStandardRateFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__STANDARD_RATE_FORMAT, oldStandardRateFormat, standardRateFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getCost() {
-		return cost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCost(BigDecimal newCost) {
-		BigDecimal oldCost = cost;
-		cost = newCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__COST, oldCost, cost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getOvertimeRate() {
-		return overtimeRate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeRate(BigDecimal newOvertimeRate) {
-		BigDecimal oldOvertimeRate = overtimeRate;
-		overtimeRate = newOvertimeRate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__OVERTIME_RATE, oldOvertimeRate, overtimeRate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getOvertimeRateFormat() {
-		return overtimeRateFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeRateFormat(BigInteger newOvertimeRateFormat) {
-		BigInteger oldOvertimeRateFormat = overtimeRateFormat;
-		overtimeRateFormat = newOvertimeRateFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__OVERTIME_RATE_FORMAT, oldOvertimeRateFormat, overtimeRateFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getOvertimeCost() {
-		return overtimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeCost(BigDecimal newOvertimeCost) {
-		BigDecimal oldOvertimeCost = overtimeCost;
-		overtimeCost = newOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__OVERTIME_COST, oldOvertimeCost, overtimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getCostPerUse() {
-		return costPerUse;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCostPerUse(BigDecimal newCostPerUse) {
-		BigDecimal oldCostPerUse = costPerUse;
-		costPerUse = newCostPerUse;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__COST_PER_USE, oldCostPerUse, costPerUse));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getActualCost() {
-		return actualCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualCost(BigDecimal newActualCost) {
-		BigDecimal oldActualCost = actualCost;
-		actualCost = newActualCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACTUAL_COST, oldActualCost, actualCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getActualOvertimeCost() {
-		return actualOvertimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeCost(BigDecimal newActualOvertimeCost) {
-		BigDecimal oldActualOvertimeCost = actualOvertimeCost;
-		actualOvertimeCost = newActualOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_COST, oldActualOvertimeCost, actualOvertimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getRemainingCost() {
-		return remainingCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingCost(BigDecimal newRemainingCost) {
-		BigDecimal oldRemainingCost = remainingCost;
-		remainingCost = newRemainingCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__REMAINING_COST, oldRemainingCost, remainingCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getRemainingOvertimeCost() {
-		return remainingOvertimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingOvertimeCost(BigDecimal newRemainingOvertimeCost) {
-		BigDecimal oldRemainingOvertimeCost = remainingOvertimeCost;
-		remainingOvertimeCost = newRemainingOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__REMAINING_OVERTIME_COST, oldRemainingOvertimeCost, remainingOvertimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getWorkVariance() {
-		return workVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkVariance(float newWorkVariance) {
-		float oldWorkVariance = workVariance;
-		workVariance = newWorkVariance;
-		boolean oldWorkVarianceESet = workVarianceESet;
-		workVarianceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__WORK_VARIANCE, oldWorkVariance, workVariance, !oldWorkVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetWorkVariance() {
-		float oldWorkVariance = workVariance;
-		boolean oldWorkVarianceESet = workVarianceESet;
-		workVariance = WORK_VARIANCE_EDEFAULT;
-		workVarianceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__WORK_VARIANCE, oldWorkVariance, WORK_VARIANCE_EDEFAULT, oldWorkVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetWorkVariance() {
-		return workVarianceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getCostVariance() {
-		return costVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCostVariance(float newCostVariance) {
-		float oldCostVariance = costVariance;
-		costVariance = newCostVariance;
-		boolean oldCostVarianceESet = costVarianceESet;
-		costVarianceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__COST_VARIANCE, oldCostVariance, costVariance, !oldCostVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCostVariance() {
-		float oldCostVariance = costVariance;
-		boolean oldCostVarianceESet = costVarianceESet;
-		costVariance = COST_VARIANCE_EDEFAULT;
-		costVarianceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__COST_VARIANCE, oldCostVariance, COST_VARIANCE_EDEFAULT, oldCostVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCostVariance() {
-		return costVarianceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getSV() {
-		return sV;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSV(float newSV) {
-		float oldSV = sV;
-		sV = newSV;
-		boolean oldSVESet = sVESet;
-		sVESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__SV, oldSV, sV, !oldSVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSV() {
-		float oldSV = sV;
-		boolean oldSVESet = sVESet;
-		sV = SV_EDEFAULT;
-		sVESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__SV, oldSV, SV_EDEFAULT, oldSVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSV() {
-		return sVESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getCV() {
-		return cV;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCV(float newCV) {
-		float oldCV = cV;
-		cV = newCV;
-		boolean oldCVESet = cVESet;
-		cVESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__CV, oldCV, cV, !oldCVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCV() {
-		float oldCV = cV;
-		boolean oldCVESet = cVESet;
-		cV = CV_EDEFAULT;
-		cVESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__CV, oldCV, CV_EDEFAULT, oldCVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCV() {
-		return cVESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getACWP() {
-		return aCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setACWP(float newACWP) {
-		float oldACWP = aCWP;
-		aCWP = newACWP;
-		boolean oldACWPESet = aCWPESet;
-		aCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACWP, oldACWP, aCWP, !oldACWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetACWP() {
-		float oldACWP = aCWP;
-		boolean oldACWPESet = aCWPESet;
-		aCWP = ACWP_EDEFAULT;
-		aCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__ACWP, oldACWP, ACWP_EDEFAULT, oldACWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetACWP() {
-		return aCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCalendarUID() {
-		return calendarUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCalendarUID(BigInteger newCalendarUID) {
-		BigInteger oldCalendarUID = calendarUID;
-		calendarUID = newCalendarUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__CALENDAR_UID, oldCalendarUID, calendarUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNotes() {
-		return notes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNotes(String newNotes) {
-		String oldNotes = notes;
-		notes = newNotes;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__NOTES, oldNotes, notes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWS() {
-		return bCWS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWS(float newBCWS) {
-		float oldBCWS = bCWS;
-		bCWS = newBCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWSESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__BCWS, oldBCWS, bCWS, !oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWS() {
-		float oldBCWS = bCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWS = BCWS_EDEFAULT;
-		bCWSESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__BCWS, oldBCWS, BCWS_EDEFAULT, oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWS() {
-		return bCWSESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWP() {
-		return bCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWP(float newBCWP) {
-		float oldBCWP = bCWP;
-		bCWP = newBCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__BCWP, oldBCWP, bCWP, !oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWP() {
-		float oldBCWP = bCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWP = BCWP_EDEFAULT;
-		bCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__BCWP, oldBCWP, BCWP_EDEFAULT, oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWP() {
-		return bCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsGeneric() {
-		return isGeneric;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsGeneric(boolean newIsGeneric) {
-		boolean oldIsGeneric = isGeneric;
-		isGeneric = newIsGeneric;
-		boolean oldIsGenericESet = isGenericESet;
-		isGenericESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__IS_GENERIC, oldIsGeneric, isGeneric, !oldIsGenericESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsGeneric() {
-		boolean oldIsGeneric = isGeneric;
-		boolean oldIsGenericESet = isGenericESet;
-		isGeneric = IS_GENERIC_EDEFAULT;
-		isGenericESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__IS_GENERIC, oldIsGeneric, IS_GENERIC_EDEFAULT, oldIsGenericESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsGeneric() {
-		return isGenericESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsInactive() {
-		return isInactive;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsInactive(boolean newIsInactive) {
-		boolean oldIsInactive = isInactive;
-		isInactive = newIsInactive;
-		boolean oldIsInactiveESet = isInactiveESet;
-		isInactiveESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__IS_INACTIVE, oldIsInactive, isInactive, !oldIsInactiveESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsInactive() {
-		boolean oldIsInactive = isInactive;
-		boolean oldIsInactiveESet = isInactiveESet;
-		isInactive = IS_INACTIVE_EDEFAULT;
-		isInactiveESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__IS_INACTIVE, oldIsInactive, IS_INACTIVE_EDEFAULT, oldIsInactiveESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsInactive() {
-		return isInactiveESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsEnterprise() {
-		return isEnterprise;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsEnterprise(boolean newIsEnterprise) {
-		boolean oldIsEnterprise = isEnterprise;
-		isEnterprise = newIsEnterprise;
-		boolean oldIsEnterpriseESet = isEnterpriseESet;
-		isEnterpriseESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__IS_ENTERPRISE, oldIsEnterprise, isEnterprise, !oldIsEnterpriseESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsEnterprise() {
-		boolean oldIsEnterprise = isEnterprise;
-		boolean oldIsEnterpriseESet = isEnterpriseESet;
-		isEnterprise = IS_ENTERPRISE_EDEFAULT;
-		isEnterpriseESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.RESOURCE__IS_ENTERPRISE, oldIsEnterprise, IS_ENTERPRISE_EDEFAULT, oldIsEnterpriseESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsEnterprise() {
-		return isEnterpriseESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getBookingType() {
-		return bookingType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBookingType(BigInteger newBookingType) {
-		BigInteger oldBookingType = bookingType;
-		bookingType = newBookingType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__BOOKING_TYPE, oldBookingType, bookingType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualWorkProtected() {
-		return actualWorkProtected;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualWorkProtected(Object newActualWorkProtected) {
-		Object oldActualWorkProtected = actualWorkProtected;
-		actualWorkProtected = newActualWorkProtected;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACTUAL_WORK_PROTECTED, oldActualWorkProtected, actualWorkProtected));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualOvertimeWorkProtected() {
-		return actualOvertimeWorkProtected;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeWorkProtected(Object newActualOvertimeWorkProtected) {
-		Object oldActualOvertimeWorkProtected = actualOvertimeWorkProtected;
-		actualOvertimeWorkProtected = newActualOvertimeWorkProtected;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK_PROTECTED, oldActualOvertimeWorkProtected, actualOvertimeWorkProtected));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getActiveDirectoryGUID() {
-		return activeDirectoryGUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActiveDirectoryGUID(String newActiveDirectoryGUID) {
-		String oldActiveDirectoryGUID = activeDirectoryGUID;
-		activeDirectoryGUID = newActiveDirectoryGUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__ACTIVE_DIRECTORY_GUID, oldActiveDirectoryGUID, activeDirectoryGUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getCreationDate() {
-		return creationDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCreationDate(Object newCreationDate) {
-		Object oldCreationDate = creationDate;
-		creationDate = newCreationDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__CREATION_DATE, oldCreationDate, creationDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExtendedAttribute() {
-		if (extendedAttribute == null) {
-			extendedAttribute = new EObjectContainmentEList(ExtendedAttribute3.class, this, MsprojectPackage.RESOURCE__EXTENDED_ATTRIBUTE);
-		}
-		return extendedAttribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBaseline() {
-		if (baseline == null) {
-			baseline = new EObjectContainmentEList(Baseline2.class, this, MsprojectPackage.RESOURCE__BASELINE);
-		}
-		return baseline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOutlineCode() {
-		if (outlineCode == null) {
-			outlineCode = new EObjectContainmentEList(OutlineCode3.class, this, MsprojectPackage.RESOURCE__OUTLINE_CODE);
-		}
-		return outlineCode;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AvailabilityPeriods getAvailabilityPeriods() {
-		return availabilityPeriods;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAvailabilityPeriods(AvailabilityPeriods newAvailabilityPeriods, NotificationChain msgs) {
-		AvailabilityPeriods oldAvailabilityPeriods = availabilityPeriods;
-		availabilityPeriods = newAvailabilityPeriods;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS, oldAvailabilityPeriods, newAvailabilityPeriods);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAvailabilityPeriods(AvailabilityPeriods newAvailabilityPeriods) {
-		if (newAvailabilityPeriods != availabilityPeriods) {
-			NotificationChain msgs = null;
-			if (availabilityPeriods != null)
-				msgs = ((InternalEObject)availabilityPeriods).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS, null, msgs);
-			if (newAvailabilityPeriods != null)
-				msgs = ((InternalEObject)newAvailabilityPeriods).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS, null, msgs);
-			msgs = basicSetAvailabilityPeriods(newAvailabilityPeriods, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS, newAvailabilityPeriods, newAvailabilityPeriods));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Rates getRates() {
-		return rates;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRates(Rates newRates, NotificationChain msgs) {
-		Rates oldRates = rates;
-		rates = newRates;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__RATES, oldRates, newRates);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRates(Rates newRates) {
-		if (newRates != rates) {
-			NotificationChain msgs = null;
-			if (rates != null)
-				msgs = ((InternalEObject)rates).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.RESOURCE__RATES, null, msgs);
-			if (newRates != null)
-				msgs = ((InternalEObject)newRates).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.RESOURCE__RATES, null, msgs);
-			msgs = basicSetRates(newRates, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.RESOURCE__RATES, newRates, newRates));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTimephasedData() {
-		if (timephasedData == null) {
-			timephasedData = new EObjectContainmentEList(TimephasedDataType.class, this, MsprojectPackage.RESOURCE__TIMEPHASED_DATA);
-		}
-		return timephasedData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.RESOURCE__EXTENDED_ATTRIBUTE:
-					return ((InternalEList)getExtendedAttribute()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.RESOURCE__BASELINE:
-					return ((InternalEList)getBaseline()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.RESOURCE__OUTLINE_CODE:
-					return ((InternalEList)getOutlineCode()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS:
-					return basicSetAvailabilityPeriods(null, msgs);
-				case MsprojectPackage.RESOURCE__RATES:
-					return basicSetRates(null, msgs);
-				case MsprojectPackage.RESOURCE__TIMEPHASED_DATA:
-					return ((InternalEList)getTimephasedData()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCE__UID:
-				return getUID();
-			case MsprojectPackage.RESOURCE__ID:
-				return getID();
-			case MsprojectPackage.RESOURCE__NAME:
-				return getName();
-			case MsprojectPackage.RESOURCE__TYPE:
-				return getType();
-			case MsprojectPackage.RESOURCE__IS_NULL:
-				return isIsNull() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.RESOURCE__INITIALS:
-				return getInitials();
-			case MsprojectPackage.RESOURCE__PHONETICS:
-				return getPhonetics();
-			case MsprojectPackage.RESOURCE__NTACCOUNT:
-				return getNTAccount();
-			case MsprojectPackage.RESOURCE__MATERIAL_LABEL:
-				return getMaterialLabel();
-			case MsprojectPackage.RESOURCE__CODE:
-				return getCode();
-			case MsprojectPackage.RESOURCE__GROUP:
-				return getGroup();
-			case MsprojectPackage.RESOURCE__WORK_GROUP:
-				return getWorkGroup();
-			case MsprojectPackage.RESOURCE__EMAIL_ADDRESS:
-				return getEmailAddress();
-			case MsprojectPackage.RESOURCE__HYPERLINK:
-				return getHyperlink();
-			case MsprojectPackage.RESOURCE__HYPERLINK_ADDRESS:
-				return getHyperlinkAddress();
-			case MsprojectPackage.RESOURCE__HYPERLINK_SUB_ADDRESS:
-				return getHyperlinkSubAddress();
-			case MsprojectPackage.RESOURCE__MAX_UNITS:
-				return new Float(getMaxUnits());
-			case MsprojectPackage.RESOURCE__PEAK_UNITS:
-				return new Float(getPeakUnits());
-			case MsprojectPackage.RESOURCE__OVER_ALLOCATED:
-				return isOverAllocated() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.RESOURCE__AVAILABLE_FROM:
-				return getAvailableFrom();
-			case MsprojectPackage.RESOURCE__AVAILABLE_TO:
-				return getAvailableTo();
-			case MsprojectPackage.RESOURCE__START:
-				return getStart();
-			case MsprojectPackage.RESOURCE__FINISH:
-				return getFinish();
-			case MsprojectPackage.RESOURCE__CAN_LEVEL:
-				return isCanLevel() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.RESOURCE__ACCRUE_AT:
-				return getAccrueAt();
-			case MsprojectPackage.RESOURCE__WORK:
-				return getWork();
-			case MsprojectPackage.RESOURCE__REGULAR_WORK:
-				return getRegularWork();
-			case MsprojectPackage.RESOURCE__OVERTIME_WORK:
-				return getOvertimeWork();
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK:
-				return getActualWork();
-			case MsprojectPackage.RESOURCE__REMAINING_WORK:
-				return getRemainingWork();
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK:
-				return getActualOvertimeWork();
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_WORK:
-				return getRemainingOvertimeWork();
-			case MsprojectPackage.RESOURCE__PERCENT_WORK_COMPLETE:
-				return getPercentWorkComplete();
-			case MsprojectPackage.RESOURCE__STANDARD_RATE:
-				return getStandardRate();
-			case MsprojectPackage.RESOURCE__STANDARD_RATE_FORMAT:
-				return getStandardRateFormat();
-			case MsprojectPackage.RESOURCE__COST:
-				return getCost();
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE:
-				return getOvertimeRate();
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE_FORMAT:
-				return getOvertimeRateFormat();
-			case MsprojectPackage.RESOURCE__OVERTIME_COST:
-				return getOvertimeCost();
-			case MsprojectPackage.RESOURCE__COST_PER_USE:
-				return getCostPerUse();
-			case MsprojectPackage.RESOURCE__ACTUAL_COST:
-				return getActualCost();
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_COST:
-				return getActualOvertimeCost();
-			case MsprojectPackage.RESOURCE__REMAINING_COST:
-				return getRemainingCost();
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_COST:
-				return getRemainingOvertimeCost();
-			case MsprojectPackage.RESOURCE__WORK_VARIANCE:
-				return new Float(getWorkVariance());
-			case MsprojectPackage.RESOURCE__COST_VARIANCE:
-				return new Float(getCostVariance());
-			case MsprojectPackage.RESOURCE__SV:
-				return new Float(getSV());
-			case MsprojectPackage.RESOURCE__CV:
-				return new Float(getCV());
-			case MsprojectPackage.RESOURCE__ACWP:
-				return new Float(getACWP());
-			case MsprojectPackage.RESOURCE__CALENDAR_UID:
-				return getCalendarUID();
-			case MsprojectPackage.RESOURCE__NOTES:
-				return getNotes();
-			case MsprojectPackage.RESOURCE__BCWS:
-				return new Float(getBCWS());
-			case MsprojectPackage.RESOURCE__BCWP:
-				return new Float(getBCWP());
-			case MsprojectPackage.RESOURCE__IS_GENERIC:
-				return isIsGeneric() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.RESOURCE__IS_INACTIVE:
-				return isIsInactive() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.RESOURCE__IS_ENTERPRISE:
-				return isIsEnterprise() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.RESOURCE__BOOKING_TYPE:
-				return getBookingType();
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK_PROTECTED:
-				return getActualWorkProtected();
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK_PROTECTED:
-				return getActualOvertimeWorkProtected();
-			case MsprojectPackage.RESOURCE__ACTIVE_DIRECTORY_GUID:
-				return getActiveDirectoryGUID();
-			case MsprojectPackage.RESOURCE__CREATION_DATE:
-				return getCreationDate();
-			case MsprojectPackage.RESOURCE__EXTENDED_ATTRIBUTE:
-				return getExtendedAttribute();
-			case MsprojectPackage.RESOURCE__BASELINE:
-				return getBaseline();
-			case MsprojectPackage.RESOURCE__OUTLINE_CODE:
-				return getOutlineCode();
-			case MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS:
-				return getAvailabilityPeriods();
-			case MsprojectPackage.RESOURCE__RATES:
-				return getRates();
-			case MsprojectPackage.RESOURCE__TIMEPHASED_DATA:
-				return getTimephasedData();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCE__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ID:
-				setID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__NAME:
-				setName((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__TYPE:
-				setType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__IS_NULL:
-				setIsNull(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.RESOURCE__INITIALS:
-				setInitials((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__PHONETICS:
-				setPhonetics((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__NTACCOUNT:
-				setNTAccount((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__MATERIAL_LABEL:
-				setMaterialLabel((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__CODE:
-				setCode((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__GROUP:
-				setGroup((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__WORK_GROUP:
-				setWorkGroup((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__EMAIL_ADDRESS:
-				setEmailAddress((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__HYPERLINK:
-				setHyperlink((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__HYPERLINK_ADDRESS:
-				setHyperlinkAddress((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__HYPERLINK_SUB_ADDRESS:
-				setHyperlinkSubAddress((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__MAX_UNITS:
-				setMaxUnits(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__PEAK_UNITS:
-				setPeakUnits(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__OVER_ALLOCATED:
-				setOverAllocated(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.RESOURCE__AVAILABLE_FROM:
-				setAvailableFrom((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__AVAILABLE_TO:
-				setAvailableTo((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__START:
-				setStart((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__FINISH:
-				setFinish((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__CAN_LEVEL:
-				setCanLevel(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.RESOURCE__ACCRUE_AT:
-				setAccrueAt((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__WORK:
-				setWork((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__REGULAR_WORK:
-				setRegularWork((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_WORK:
-				setOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK:
-				setActualWork((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_WORK:
-				setRemainingWork((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK:
-				setActualOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_WORK:
-				setRemainingOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__PERCENT_WORK_COMPLETE:
-				setPercentWorkComplete((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__STANDARD_RATE:
-				setStandardRate((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__STANDARD_RATE_FORMAT:
-				setStandardRateFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__COST:
-				setCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE:
-				setOvertimeRate((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE_FORMAT:
-				setOvertimeRateFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_COST:
-				setOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__COST_PER_USE:
-				setCostPerUse((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_COST:
-				setActualCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_COST:
-				setActualOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_COST:
-				setRemainingCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_COST:
-				setRemainingOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__WORK_VARIANCE:
-				setWorkVariance(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__COST_VARIANCE:
-				setCostVariance(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__SV:
-				setSV(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__CV:
-				setCV(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__ACWP:
-				setACWP(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__CALENDAR_UID:
-				setCalendarUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__NOTES:
-				setNotes((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__BCWS:
-				setBCWS(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__BCWP:
-				setBCWP(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.RESOURCE__IS_GENERIC:
-				setIsGeneric(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.RESOURCE__IS_INACTIVE:
-				setIsInactive(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.RESOURCE__IS_ENTERPRISE:
-				setIsEnterprise(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.RESOURCE__BOOKING_TYPE:
-				setBookingType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK_PROTECTED:
-				setActualWorkProtected((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK_PROTECTED:
-				setActualOvertimeWorkProtected((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__ACTIVE_DIRECTORY_GUID:
-				setActiveDirectoryGUID((String)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__CREATION_DATE:
-				setCreationDate((Object)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				getExtendedAttribute().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__BASELINE:
-				getBaseline().clear();
-				getBaseline().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__OUTLINE_CODE:
-				getOutlineCode().clear();
-				getOutlineCode().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS:
-				setAvailabilityPeriods((AvailabilityPeriods)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__RATES:
-				setRates((Rates)newValue);
-				return;
-			case MsprojectPackage.RESOURCE__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				getTimephasedData().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCE__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ID:
-				setID(ID_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__IS_NULL:
-				unsetIsNull();
-				return;
-			case MsprojectPackage.RESOURCE__INITIALS:
-				setInitials(INITIALS_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__PHONETICS:
-				setPhonetics(PHONETICS_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__NTACCOUNT:
-				setNTAccount(NTACCOUNT_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__MATERIAL_LABEL:
-				setMaterialLabel(MATERIAL_LABEL_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__CODE:
-				setCode(CODE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__GROUP:
-				setGroup(GROUP_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__WORK_GROUP:
-				setWorkGroup(WORK_GROUP_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__EMAIL_ADDRESS:
-				setEmailAddress(EMAIL_ADDRESS_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__HYPERLINK:
-				setHyperlink(HYPERLINK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__HYPERLINK_ADDRESS:
-				setHyperlinkAddress(HYPERLINK_ADDRESS_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__HYPERLINK_SUB_ADDRESS:
-				setHyperlinkSubAddress(HYPERLINK_SUB_ADDRESS_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__MAX_UNITS:
-				unsetMaxUnits();
-				return;
-			case MsprojectPackage.RESOURCE__PEAK_UNITS:
-				unsetPeakUnits();
-				return;
-			case MsprojectPackage.RESOURCE__OVER_ALLOCATED:
-				unsetOverAllocated();
-				return;
-			case MsprojectPackage.RESOURCE__AVAILABLE_FROM:
-				setAvailableFrom(AVAILABLE_FROM_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__AVAILABLE_TO:
-				setAvailableTo(AVAILABLE_TO_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__START:
-				setStart(START_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__FINISH:
-				setFinish(FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__CAN_LEVEL:
-				unsetCanLevel();
-				return;
-			case MsprojectPackage.RESOURCE__ACCRUE_AT:
-				setAccrueAt(ACCRUE_AT_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__WORK:
-				setWork(WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__REGULAR_WORK:
-				setRegularWork(REGULAR_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_WORK:
-				setOvertimeWork(OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK:
-				setActualWork(ACTUAL_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_WORK:
-				setRemainingWork(REMAINING_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK:
-				setActualOvertimeWork(ACTUAL_OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_WORK:
-				setRemainingOvertimeWork(REMAINING_OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__PERCENT_WORK_COMPLETE:
-				setPercentWorkComplete(PERCENT_WORK_COMPLETE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__STANDARD_RATE:
-				setStandardRate(STANDARD_RATE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__STANDARD_RATE_FORMAT:
-				setStandardRateFormat(STANDARD_RATE_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__COST:
-				setCost(COST_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE:
-				setOvertimeRate(OVERTIME_RATE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE_FORMAT:
-				setOvertimeRateFormat(OVERTIME_RATE_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__OVERTIME_COST:
-				setOvertimeCost(OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__COST_PER_USE:
-				setCostPerUse(COST_PER_USE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_COST:
-				setActualCost(ACTUAL_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_COST:
-				setActualOvertimeCost(ACTUAL_OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_COST:
-				setRemainingCost(REMAINING_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_COST:
-				setRemainingOvertimeCost(REMAINING_OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__WORK_VARIANCE:
-				unsetWorkVariance();
-				return;
-			case MsprojectPackage.RESOURCE__COST_VARIANCE:
-				unsetCostVariance();
-				return;
-			case MsprojectPackage.RESOURCE__SV:
-				unsetSV();
-				return;
-			case MsprojectPackage.RESOURCE__CV:
-				unsetCV();
-				return;
-			case MsprojectPackage.RESOURCE__ACWP:
-				unsetACWP();
-				return;
-			case MsprojectPackage.RESOURCE__CALENDAR_UID:
-				setCalendarUID(CALENDAR_UID_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__NOTES:
-				setNotes(NOTES_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__BCWS:
-				unsetBCWS();
-				return;
-			case MsprojectPackage.RESOURCE__BCWP:
-				unsetBCWP();
-				return;
-			case MsprojectPackage.RESOURCE__IS_GENERIC:
-				unsetIsGeneric();
-				return;
-			case MsprojectPackage.RESOURCE__IS_INACTIVE:
-				unsetIsInactive();
-				return;
-			case MsprojectPackage.RESOURCE__IS_ENTERPRISE:
-				unsetIsEnterprise();
-				return;
-			case MsprojectPackage.RESOURCE__BOOKING_TYPE:
-				setBookingType(BOOKING_TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK_PROTECTED:
-				setActualWorkProtected(ACTUAL_WORK_PROTECTED_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK_PROTECTED:
-				setActualOvertimeWorkProtected(ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__ACTIVE_DIRECTORY_GUID:
-				setActiveDirectoryGUID(ACTIVE_DIRECTORY_GUID_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__CREATION_DATE:
-				setCreationDate(CREATION_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.RESOURCE__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				return;
-			case MsprojectPackage.RESOURCE__BASELINE:
-				getBaseline().clear();
-				return;
-			case MsprojectPackage.RESOURCE__OUTLINE_CODE:
-				getOutlineCode().clear();
-				return;
-			case MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS:
-				setAvailabilityPeriods((AvailabilityPeriods)null);
-				return;
-			case MsprojectPackage.RESOURCE__RATES:
-				setRates((Rates)null);
-				return;
-			case MsprojectPackage.RESOURCE__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCE__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.RESOURCE__ID:
-				return ID_EDEFAULT == null ? iD != null : !ID_EDEFAULT.equals(iD);
-			case MsprojectPackage.RESOURCE__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case MsprojectPackage.RESOURCE__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MsprojectPackage.RESOURCE__IS_NULL:
-				return isSetIsNull();
-			case MsprojectPackage.RESOURCE__INITIALS:
-				return INITIALS_EDEFAULT == null ? initials != null : !INITIALS_EDEFAULT.equals(initials);
-			case MsprojectPackage.RESOURCE__PHONETICS:
-				return PHONETICS_EDEFAULT == null ? phonetics != null : !PHONETICS_EDEFAULT.equals(phonetics);
-			case MsprojectPackage.RESOURCE__NTACCOUNT:
-				return NTACCOUNT_EDEFAULT == null ? nTAccount != null : !NTACCOUNT_EDEFAULT.equals(nTAccount);
-			case MsprojectPackage.RESOURCE__MATERIAL_LABEL:
-				return MATERIAL_LABEL_EDEFAULT == null ? materialLabel != null : !MATERIAL_LABEL_EDEFAULT.equals(materialLabel);
-			case MsprojectPackage.RESOURCE__CODE:
-				return CODE_EDEFAULT == null ? code != null : !CODE_EDEFAULT.equals(code);
-			case MsprojectPackage.RESOURCE__GROUP:
-				return GROUP_EDEFAULT == null ? group != null : !GROUP_EDEFAULT.equals(group);
-			case MsprojectPackage.RESOURCE__WORK_GROUP:
-				return WORK_GROUP_EDEFAULT == null ? workGroup != null : !WORK_GROUP_EDEFAULT.equals(workGroup);
-			case MsprojectPackage.RESOURCE__EMAIL_ADDRESS:
-				return EMAIL_ADDRESS_EDEFAULT == null ? emailAddress != null : !EMAIL_ADDRESS_EDEFAULT.equals(emailAddress);
-			case MsprojectPackage.RESOURCE__HYPERLINK:
-				return HYPERLINK_EDEFAULT == null ? hyperlink != null : !HYPERLINK_EDEFAULT.equals(hyperlink);
-			case MsprojectPackage.RESOURCE__HYPERLINK_ADDRESS:
-				return HYPERLINK_ADDRESS_EDEFAULT == null ? hyperlinkAddress != null : !HYPERLINK_ADDRESS_EDEFAULT.equals(hyperlinkAddress);
-			case MsprojectPackage.RESOURCE__HYPERLINK_SUB_ADDRESS:
-				return HYPERLINK_SUB_ADDRESS_EDEFAULT == null ? hyperlinkSubAddress != null : !HYPERLINK_SUB_ADDRESS_EDEFAULT.equals(hyperlinkSubAddress);
-			case MsprojectPackage.RESOURCE__MAX_UNITS:
-				return isSetMaxUnits();
-			case MsprojectPackage.RESOURCE__PEAK_UNITS:
-				return isSetPeakUnits();
-			case MsprojectPackage.RESOURCE__OVER_ALLOCATED:
-				return isSetOverAllocated();
-			case MsprojectPackage.RESOURCE__AVAILABLE_FROM:
-				return AVAILABLE_FROM_EDEFAULT == null ? availableFrom != null : !AVAILABLE_FROM_EDEFAULT.equals(availableFrom);
-			case MsprojectPackage.RESOURCE__AVAILABLE_TO:
-				return AVAILABLE_TO_EDEFAULT == null ? availableTo != null : !AVAILABLE_TO_EDEFAULT.equals(availableTo);
-			case MsprojectPackage.RESOURCE__START:
-				return START_EDEFAULT == null ? start != null : !START_EDEFAULT.equals(start);
-			case MsprojectPackage.RESOURCE__FINISH:
-				return FINISH_EDEFAULT == null ? finish != null : !FINISH_EDEFAULT.equals(finish);
-			case MsprojectPackage.RESOURCE__CAN_LEVEL:
-				return isSetCanLevel();
-			case MsprojectPackage.RESOURCE__ACCRUE_AT:
-				return ACCRUE_AT_EDEFAULT == null ? accrueAt != null : !ACCRUE_AT_EDEFAULT.equals(accrueAt);
-			case MsprojectPackage.RESOURCE__WORK:
-				return WORK_EDEFAULT == null ? work != null : !WORK_EDEFAULT.equals(work);
-			case MsprojectPackage.RESOURCE__REGULAR_WORK:
-				return REGULAR_WORK_EDEFAULT == null ? regularWork != null : !REGULAR_WORK_EDEFAULT.equals(regularWork);
-			case MsprojectPackage.RESOURCE__OVERTIME_WORK:
-				return OVERTIME_WORK_EDEFAULT == null ? overtimeWork != null : !OVERTIME_WORK_EDEFAULT.equals(overtimeWork);
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK:
-				return ACTUAL_WORK_EDEFAULT == null ? actualWork != null : !ACTUAL_WORK_EDEFAULT.equals(actualWork);
-			case MsprojectPackage.RESOURCE__REMAINING_WORK:
-				return REMAINING_WORK_EDEFAULT == null ? remainingWork != null : !REMAINING_WORK_EDEFAULT.equals(remainingWork);
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK:
-				return ACTUAL_OVERTIME_WORK_EDEFAULT == null ? actualOvertimeWork != null : !ACTUAL_OVERTIME_WORK_EDEFAULT.equals(actualOvertimeWork);
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_WORK:
-				return REMAINING_OVERTIME_WORK_EDEFAULT == null ? remainingOvertimeWork != null : !REMAINING_OVERTIME_WORK_EDEFAULT.equals(remainingOvertimeWork);
-			case MsprojectPackage.RESOURCE__PERCENT_WORK_COMPLETE:
-				return PERCENT_WORK_COMPLETE_EDEFAULT == null ? percentWorkComplete != null : !PERCENT_WORK_COMPLETE_EDEFAULT.equals(percentWorkComplete);
-			case MsprojectPackage.RESOURCE__STANDARD_RATE:
-				return STANDARD_RATE_EDEFAULT == null ? standardRate != null : !STANDARD_RATE_EDEFAULT.equals(standardRate);
-			case MsprojectPackage.RESOURCE__STANDARD_RATE_FORMAT:
-				return STANDARD_RATE_FORMAT_EDEFAULT == null ? standardRateFormat != null : !STANDARD_RATE_FORMAT_EDEFAULT.equals(standardRateFormat);
-			case MsprojectPackage.RESOURCE__COST:
-				return COST_EDEFAULT == null ? cost != null : !COST_EDEFAULT.equals(cost);
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE:
-				return OVERTIME_RATE_EDEFAULT == null ? overtimeRate != null : !OVERTIME_RATE_EDEFAULT.equals(overtimeRate);
-			case MsprojectPackage.RESOURCE__OVERTIME_RATE_FORMAT:
-				return OVERTIME_RATE_FORMAT_EDEFAULT == null ? overtimeRateFormat != null : !OVERTIME_RATE_FORMAT_EDEFAULT.equals(overtimeRateFormat);
-			case MsprojectPackage.RESOURCE__OVERTIME_COST:
-				return OVERTIME_COST_EDEFAULT == null ? overtimeCost != null : !OVERTIME_COST_EDEFAULT.equals(overtimeCost);
-			case MsprojectPackage.RESOURCE__COST_PER_USE:
-				return COST_PER_USE_EDEFAULT == null ? costPerUse != null : !COST_PER_USE_EDEFAULT.equals(costPerUse);
-			case MsprojectPackage.RESOURCE__ACTUAL_COST:
-				return ACTUAL_COST_EDEFAULT == null ? actualCost != null : !ACTUAL_COST_EDEFAULT.equals(actualCost);
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_COST:
-				return ACTUAL_OVERTIME_COST_EDEFAULT == null ? actualOvertimeCost != null : !ACTUAL_OVERTIME_COST_EDEFAULT.equals(actualOvertimeCost);
-			case MsprojectPackage.RESOURCE__REMAINING_COST:
-				return REMAINING_COST_EDEFAULT == null ? remainingCost != null : !REMAINING_COST_EDEFAULT.equals(remainingCost);
-			case MsprojectPackage.RESOURCE__REMAINING_OVERTIME_COST:
-				return REMAINING_OVERTIME_COST_EDEFAULT == null ? remainingOvertimeCost != null : !REMAINING_OVERTIME_COST_EDEFAULT.equals(remainingOvertimeCost);
-			case MsprojectPackage.RESOURCE__WORK_VARIANCE:
-				return isSetWorkVariance();
-			case MsprojectPackage.RESOURCE__COST_VARIANCE:
-				return isSetCostVariance();
-			case MsprojectPackage.RESOURCE__SV:
-				return isSetSV();
-			case MsprojectPackage.RESOURCE__CV:
-				return isSetCV();
-			case MsprojectPackage.RESOURCE__ACWP:
-				return isSetACWP();
-			case MsprojectPackage.RESOURCE__CALENDAR_UID:
-				return CALENDAR_UID_EDEFAULT == null ? calendarUID != null : !CALENDAR_UID_EDEFAULT.equals(calendarUID);
-			case MsprojectPackage.RESOURCE__NOTES:
-				return NOTES_EDEFAULT == null ? notes != null : !NOTES_EDEFAULT.equals(notes);
-			case MsprojectPackage.RESOURCE__BCWS:
-				return isSetBCWS();
-			case MsprojectPackage.RESOURCE__BCWP:
-				return isSetBCWP();
-			case MsprojectPackage.RESOURCE__IS_GENERIC:
-				return isSetIsGeneric();
-			case MsprojectPackage.RESOURCE__IS_INACTIVE:
-				return isSetIsInactive();
-			case MsprojectPackage.RESOURCE__IS_ENTERPRISE:
-				return isSetIsEnterprise();
-			case MsprojectPackage.RESOURCE__BOOKING_TYPE:
-				return BOOKING_TYPE_EDEFAULT == null ? bookingType != null : !BOOKING_TYPE_EDEFAULT.equals(bookingType);
-			case MsprojectPackage.RESOURCE__ACTUAL_WORK_PROTECTED:
-				return ACTUAL_WORK_PROTECTED_EDEFAULT == null ? actualWorkProtected != null : !ACTUAL_WORK_PROTECTED_EDEFAULT.equals(actualWorkProtected);
-			case MsprojectPackage.RESOURCE__ACTUAL_OVERTIME_WORK_PROTECTED:
-				return ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT == null ? actualOvertimeWorkProtected != null : !ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT.equals(actualOvertimeWorkProtected);
-			case MsprojectPackage.RESOURCE__ACTIVE_DIRECTORY_GUID:
-				return ACTIVE_DIRECTORY_GUID_EDEFAULT == null ? activeDirectoryGUID != null : !ACTIVE_DIRECTORY_GUID_EDEFAULT.equals(activeDirectoryGUID);
-			case MsprojectPackage.RESOURCE__CREATION_DATE:
-				return CREATION_DATE_EDEFAULT == null ? creationDate != null : !CREATION_DATE_EDEFAULT.equals(creationDate);
-			case MsprojectPackage.RESOURCE__EXTENDED_ATTRIBUTE:
-				return extendedAttribute != null && !extendedAttribute.isEmpty();
-			case MsprojectPackage.RESOURCE__BASELINE:
-				return baseline != null && !baseline.isEmpty();
-			case MsprojectPackage.RESOURCE__OUTLINE_CODE:
-				return outlineCode != null && !outlineCode.isEmpty();
-			case MsprojectPackage.RESOURCE__AVAILABILITY_PERIODS:
-				return availabilityPeriods != null;
-			case MsprojectPackage.RESOURCE__RATES:
-				return rates != null;
-			case MsprojectPackage.RESOURCE__TIMEPHASED_DATA:
-				return timephasedData != null && !timephasedData.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", iD: ");
-		result.append(iD);
-		result.append(", name: ");
-		result.append(name);
-		result.append(", type: ");
-		result.append(type);
-		result.append(", isNull: ");
-		if (isNullESet) result.append(isNull); else result.append("<unset>");
-		result.append(", initials: ");
-		result.append(initials);
-		result.append(", phonetics: ");
-		result.append(phonetics);
-		result.append(", nTAccount: ");
-		result.append(nTAccount);
-		result.append(", materialLabel: ");
-		result.append(materialLabel);
-		result.append(", code: ");
-		result.append(code);
-		result.append(", group: ");
-		result.append(group);
-		result.append(", workGroup: ");
-		result.append(workGroup);
-		result.append(", emailAddress: ");
-		result.append(emailAddress);
-		result.append(", hyperlink: ");
-		result.append(hyperlink);
-		result.append(", hyperlinkAddress: ");
-		result.append(hyperlinkAddress);
-		result.append(", hyperlinkSubAddress: ");
-		result.append(hyperlinkSubAddress);
-		result.append(", maxUnits: ");
-		if (maxUnitsESet) result.append(maxUnits); else result.append("<unset>");
-		result.append(", peakUnits: ");
-		if (peakUnitsESet) result.append(peakUnits); else result.append("<unset>");
-		result.append(", overAllocated: ");
-		if (overAllocatedESet) result.append(overAllocated); else result.append("<unset>");
-		result.append(", availableFrom: ");
-		result.append(availableFrom);
-		result.append(", availableTo: ");
-		result.append(availableTo);
-		result.append(", start: ");
-		result.append(start);
-		result.append(", finish: ");
-		result.append(finish);
-		result.append(", canLevel: ");
-		if (canLevelESet) result.append(canLevel); else result.append("<unset>");
-		result.append(", accrueAt: ");
-		result.append(accrueAt);
-		result.append(", work: ");
-		result.append(work);
-		result.append(", regularWork: ");
-		result.append(regularWork);
-		result.append(", overtimeWork: ");
-		result.append(overtimeWork);
-		result.append(", actualWork: ");
-		result.append(actualWork);
-		result.append(", remainingWork: ");
-		result.append(remainingWork);
-		result.append(", actualOvertimeWork: ");
-		result.append(actualOvertimeWork);
-		result.append(", remainingOvertimeWork: ");
-		result.append(remainingOvertimeWork);
-		result.append(", percentWorkComplete: ");
-		result.append(percentWorkComplete);
-		result.append(", standardRate: ");
-		result.append(standardRate);
-		result.append(", standardRateFormat: ");
-		result.append(standardRateFormat);
-		result.append(", cost: ");
-		result.append(cost);
-		result.append(", overtimeRate: ");
-		result.append(overtimeRate);
-		result.append(", overtimeRateFormat: ");
-		result.append(overtimeRateFormat);
-		result.append(", overtimeCost: ");
-		result.append(overtimeCost);
-		result.append(", costPerUse: ");
-		result.append(costPerUse);
-		result.append(", actualCost: ");
-		result.append(actualCost);
-		result.append(", actualOvertimeCost: ");
-		result.append(actualOvertimeCost);
-		result.append(", remainingCost: ");
-		result.append(remainingCost);
-		result.append(", remainingOvertimeCost: ");
-		result.append(remainingOvertimeCost);
-		result.append(", workVariance: ");
-		if (workVarianceESet) result.append(workVariance); else result.append("<unset>");
-		result.append(", costVariance: ");
-		if (costVarianceESet) result.append(costVariance); else result.append("<unset>");
-		result.append(", sV: ");
-		if (sVESet) result.append(sV); else result.append("<unset>");
-		result.append(", cV: ");
-		if (cVESet) result.append(cV); else result.append("<unset>");
-		result.append(", aCWP: ");
-		if (aCWPESet) result.append(aCWP); else result.append("<unset>");
-		result.append(", calendarUID: ");
-		result.append(calendarUID);
-		result.append(", notes: ");
-		result.append(notes);
-		result.append(", bCWS: ");
-		if (bCWSESet) result.append(bCWS); else result.append("<unset>");
-		result.append(", bCWP: ");
-		if (bCWPESet) result.append(bCWP); else result.append("<unset>");
-		result.append(", isGeneric: ");
-		if (isGenericESet) result.append(isGeneric); else result.append("<unset>");
-		result.append(", isInactive: ");
-		if (isInactiveESet) result.append(isInactive); else result.append("<unset>");
-		result.append(", isEnterprise: ");
-		if (isEnterpriseESet) result.append(isEnterprise); else result.append("<unset>");
-		result.append(", bookingType: ");
-		result.append(bookingType);
-		result.append(", actualWorkProtected: ");
-		result.append(actualWorkProtected);
-		result.append(", actualOvertimeWorkProtected: ");
-		result.append(actualOvertimeWorkProtected);
-		result.append(", activeDirectoryGUID: ");
-		result.append(activeDirectoryGUID);
-		result.append(", creationDate: ");
-		result.append(creationDate);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResourceImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ResourcesImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ResourcesImpl.java
deleted file mode 100644
index 3afe630..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ResourcesImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ResourcesImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Resource;
-import org.eclipse.epf.msproject.Resources;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resources</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ResourcesImpl#getResource <em>Resource</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourcesImpl extends EObjectImpl implements Resources {
-	/**
-	 * The cached value of the '{@link #getResource() <em>Resource</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResource()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList resource = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResourcesImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getResources();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getResource() {
-		if (resource == null) {
-			resource = new EObjectContainmentEList(Resource.class, this, MsprojectPackage.RESOURCES__RESOURCE);
-		}
-		return resource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.RESOURCES__RESOURCE:
-					return ((InternalEList)getResource()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCES__RESOURCE:
-				return getResource();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCES__RESOURCE:
-				getResource().clear();
-				getResource().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCES__RESOURCE:
-				getResource().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.RESOURCES__RESOURCE:
-				return resource != null && !resource.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //ResourcesImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TaskImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TaskImpl.java
deleted file mode 100644
index 9987841..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TaskImpl.java
+++ /dev/null
@@ -1,5740 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TaskImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-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.EStructuralFeature;
-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.epf.msproject.Baseline;
-import org.eclipse.epf.msproject.ExtendedAttribute2;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode2;
-import org.eclipse.epf.msproject.PredecessorLink;
-import org.eclipse.epf.msproject.Task;
-import org.eclipse.epf.msproject.TimephasedDataType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Task</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isIsNull <em>Is Null</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getCreateDate <em>Create Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getContact <em>Contact</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getWBS <em>WBS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getWBSLevel <em>WBS Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getOutlineNumber <em>Outline Number</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getOutlineLevel <em>Outline Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getPriority <em>Priority</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getDuration <em>Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getDurationFormat <em>Duration Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getWork <em>Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getStop <em>Stop</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getResume <em>Resume</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isResumeValid <em>Resume Valid</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isEffortDriven <em>Effort Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isRecurring <em>Recurring</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isOverAllocated <em>Over Allocated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isEstimated <em>Estimated</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isMilestone <em>Milestone</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isSummary <em>Summary</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isCritical <em>Critical</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isIsSubproject <em>Is Subproject</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isIsSubprojectReadOnly <em>Is Subproject Read Only</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getSubprojectName <em>Subproject Name</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isExternalTask <em>External Task</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getExternalTaskProject <em>External Task Project</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getEarlyStart <em>Early Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getEarlyFinish <em>Early Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getLateStart <em>Late Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getLateFinish <em>Late Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getStartVariance <em>Start Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getFinishVariance <em>Finish Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getWorkVariance <em>Work Variance</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getFreeSlack <em>Free Slack</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getTotalSlack <em>Total Slack</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getFixedCost <em>Fixed Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getFixedCostAccrual <em>Fixed Cost Accrual</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getPercentComplete <em>Percent Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getPercentWorkComplete <em>Percent Work Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getCost <em>Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getOvertimeCost <em>Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getOvertimeWork <em>Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualStart <em>Actual Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualFinish <em>Actual Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualDuration <em>Actual Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualCost <em>Actual Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualOvertimeCost <em>Actual Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualWork <em>Actual Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualOvertimeWork <em>Actual Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getRegularWork <em>Regular Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getRemainingDuration <em>Remaining Duration</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getRemainingCost <em>Remaining Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getRemainingWork <em>Remaining Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getRemainingOvertimeCost <em>Remaining Overtime Cost</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getRemainingOvertimeWork <em>Remaining Overtime Work</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getACWP <em>ACWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getCV <em>CV</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getConstraintType <em>Constraint Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getCalendarUID <em>Calendar UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getConstraintDate <em>Constraint Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getDeadline <em>Deadline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isLevelAssignments <em>Level Assignments</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isLevelingCanSplit <em>Leveling Can Split</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getLevelingDelay <em>Leveling Delay</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getLevelingDelayFormat <em>Leveling Delay Format</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getPreLeveledStart <em>Pre Leveled Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getPreLeveledFinish <em>Pre Leveled Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getHyperlink <em>Hyperlink</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getHyperlinkAddress <em>Hyperlink Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getHyperlinkSubAddress <em>Hyperlink Sub Address</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isIgnoreResourceCalendar <em>Ignore Resource Calendar</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getNotes <em>Notes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isHideBar <em>Hide Bar</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#isRollup <em>Rollup</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getBCWS <em>BCWS</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getBCWP <em>BCWP</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getPhysicalPercentComplete <em>Physical Percent Complete</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getEarnedValueMethod <em>Earned Value Method</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getPredecessorLink <em>Predecessor Link</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualWorkProtected <em>Actual Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getActualOvertimeWorkProtected <em>Actual Overtime Work Protected</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getExtendedAttribute <em>Extended Attribute</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getBaseline <em>Baseline</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getOutlineCode <em>Outline Code</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TaskImpl#getTimephasedData <em>Timephased Data</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskImpl extends EObjectImpl implements Task {
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger iD = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger type = TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isIsNull() <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsNull()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_NULL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsNull() <em>Is Null</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsNull()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isNull = IS_NULL_EDEFAULT;
-
-	/**
-	 * This is true if the Is Null attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isNullESet = false;
-
-	/**
-	 * The default value of the '{@link #getCreateDate() <em>Create Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreateDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CREATE_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCreateDate() <em>Create Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCreateDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object createDate = CREATE_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getContact() <em>Contact</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getContact()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CONTACT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getContact() <em>Contact</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getContact()
-	 * @generated
-	 * @ordered
-	 */
-	protected String contact = CONTACT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWBS() <em>WBS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWBS()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String WBS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWBS() <em>WBS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWBS()
-	 * @generated
-	 * @ordered
-	 */
-	protected String wBS = WBS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWBSLevel() <em>WBS Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWBSLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String WBS_LEVEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWBSLevel() <em>WBS Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWBSLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String wBSLevel = WBS_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOutlineNumber() <em>Outline Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String OUTLINE_NUMBER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOutlineNumber() <em>Outline Number</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineNumber()
-	 * @generated
-	 * @ordered
-	 */
-	protected String outlineNumber = OUTLINE_NUMBER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOutlineLevel() <em>Outline Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger OUTLINE_LEVEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOutlineLevel() <em>Outline Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger outlineLevel = OUTLINE_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPriority() <em>Priority</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPriority()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PRIORITY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPriority() <em>Priority</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPriority()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger priority = PRIORITY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object start = START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object finish = FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDuration() <em>Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object DURATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDuration() <em>Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object duration = DURATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DURATION_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDurationFormat() <em>Duration Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDurationFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger durationFormat = DURATION_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWork() <em>Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object work = WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStop() <em>Stop</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStop()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object STOP_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStop() <em>Stop</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStop()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object stop = STOP_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getResume() <em>Resume</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResume()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object RESUME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getResume() <em>Resume</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResume()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object resume = RESUME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isResumeValid() <em>Resume Valid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResumeValid()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESUME_VALID_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isResumeValid() <em>Resume Valid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResumeValid()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resumeValid = RESUME_VALID_EDEFAULT;
-
-	/**
-	 * This is true if the Resume Valid attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resumeValidESet = false;
-
-	/**
-	 * The default value of the '{@link #isEffortDriven() <em>Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEffortDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean EFFORT_DRIVEN_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isEffortDriven() <em>Effort Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEffortDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean effortDriven = EFFORT_DRIVEN_EDEFAULT;
-
-	/**
-	 * This is true if the Effort Driven attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean effortDrivenESet = false;
-
-	/**
-	 * The default value of the '{@link #isRecurring() <em>Recurring</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRecurring()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RECURRING_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isRecurring() <em>Recurring</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRecurring()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean recurring = RECURRING_EDEFAULT;
-
-	/**
-	 * This is true if the Recurring attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean recurringESet = false;
-
-	/**
-	 * The default value of the '{@link #isOverAllocated() <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOverAllocated()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean OVER_ALLOCATED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isOverAllocated() <em>Over Allocated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isOverAllocated()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean overAllocated = OVER_ALLOCATED_EDEFAULT;
-
-	/**
-	 * This is true if the Over Allocated attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean overAllocatedESet = false;
-
-	/**
-	 * The default value of the '{@link #isEstimated() <em>Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEstimated()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ESTIMATED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isEstimated() <em>Estimated</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEstimated()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean estimated = ESTIMATED_EDEFAULT;
-
-	/**
-	 * This is true if the Estimated attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean estimatedESet = false;
-
-	/**
-	 * The default value of the '{@link #isMilestone() <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMilestone()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MILESTONE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMilestone() <em>Milestone</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMilestone()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean milestone = MILESTONE_EDEFAULT;
-
-	/**
-	 * This is true if the Milestone attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean milestoneESet = false;
-
-	/**
-	 * The default value of the '{@link #isSummary() <em>Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSummary()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SUMMARY_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isSummary() <em>Summary</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSummary()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean summary = SUMMARY_EDEFAULT;
-
-	/**
-	 * This is true if the Summary attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean summaryESet = false;
-
-	/**
-	 * The default value of the '{@link #isCritical() <em>Critical</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isCritical()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean CRITICAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isCritical() <em>Critical</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isCritical()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean critical = CRITICAL_EDEFAULT;
-
-	/**
-	 * This is true if the Critical attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean criticalESet = false;
-
-	/**
-	 * The default value of the '{@link #isIsSubproject() <em>Is Subproject</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSubproject()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_SUBPROJECT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsSubproject() <em>Is Subproject</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSubproject()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSubproject = IS_SUBPROJECT_EDEFAULT;
-
-	/**
-	 * This is true if the Is Subproject attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSubprojectESet = false;
-
-	/**
-	 * The default value of the '{@link #isIsSubprojectReadOnly() <em>Is Subproject Read Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSubprojectReadOnly()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_SUBPROJECT_READ_ONLY_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsSubprojectReadOnly() <em>Is Subproject Read Only</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSubprojectReadOnly()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSubprojectReadOnly = IS_SUBPROJECT_READ_ONLY_EDEFAULT;
-
-	/**
-	 * This is true if the Is Subproject Read Only attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSubprojectReadOnlyESet = false;
-
-	/**
-	 * The default value of the '{@link #getSubprojectName() <em>Subproject Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubprojectName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SUBPROJECT_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSubprojectName() <em>Subproject Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubprojectName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String subprojectName = SUBPROJECT_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isExternalTask() <em>External Task</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isExternalTask()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean EXTERNAL_TASK_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isExternalTask() <em>External Task</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isExternalTask()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean externalTask = EXTERNAL_TASK_EDEFAULT;
-
-	/**
-	 * This is true if the External Task attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean externalTaskESet = false;
-
-	/**
-	 * The default value of the '{@link #getExternalTaskProject() <em>External Task Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalTaskProject()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String EXTERNAL_TASK_PROJECT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getExternalTaskProject() <em>External Task Project</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalTaskProject()
-	 * @generated
-	 * @ordered
-	 */
-	protected String externalTaskProject = EXTERNAL_TASK_PROJECT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEarlyStart() <em>Early Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarlyStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object EARLY_START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEarlyStart() <em>Early Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarlyStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object earlyStart = EARLY_START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEarlyFinish() <em>Early Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarlyFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object EARLY_FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEarlyFinish() <em>Early Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarlyFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object earlyFinish = EARLY_FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLateStart() <em>Late Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLateStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object LATE_START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLateStart() <em>Late Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLateStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object lateStart = LATE_START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLateFinish() <em>Late Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLateFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object LATE_FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLateFinish() <em>Late Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLateFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object lateFinish = LATE_FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStartVariance() <em>Start Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger START_VARIANCE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStartVariance() <em>Start Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger startVariance = START_VARIANCE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinishVariance() <em>Finish Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger FINISH_VARIANCE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinishVariance() <em>Finish Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger finishVariance = FINISH_VARIANCE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWorkVariance() <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float WORK_VARIANCE_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getWorkVariance() <em>Work Variance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkVariance()
-	 * @generated
-	 * @ordered
-	 */
-	protected float workVariance = WORK_VARIANCE_EDEFAULT;
-
-	/**
-	 * This is true if the Work Variance attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean workVarianceESet = false;
-
-	/**
-	 * The default value of the '{@link #getFreeSlack() <em>Free Slack</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFreeSlack()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger FREE_SLACK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFreeSlack() <em>Free Slack</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFreeSlack()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger freeSlack = FREE_SLACK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTotalSlack() <em>Total Slack</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTotalSlack()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TOTAL_SLACK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTotalSlack() <em>Total Slack</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTotalSlack()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger totalSlack = TOTAL_SLACK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFixedCost() <em>Fixed Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFixedCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float FIXED_COST_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getFixedCost() <em>Fixed Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFixedCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected float fixedCost = FIXED_COST_EDEFAULT;
-
-	/**
-	 * This is true if the Fixed Cost attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean fixedCostESet = false;
-
-	/**
-	 * The default value of the '{@link #getFixedCostAccrual() <em>Fixed Cost Accrual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFixedCostAccrual()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FIXED_COST_ACCRUAL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFixedCostAccrual() <em>Fixed Cost Accrual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFixedCostAccrual()
-	 * @generated
-	 * @ordered
-	 */
-	protected String fixedCostAccrual = FIXED_COST_ACCRUAL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPercentComplete() <em>Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PERCENT_COMPLETE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPercentComplete() <em>Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger percentComplete = PERCENT_COMPLETE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPercentWorkComplete() <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PERCENT_WORK_COMPLETE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPercentWorkComplete() <em>Percent Work Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPercentWorkComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger percentWorkComplete = PERCENT_WORK_COMPLETE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCost() <em>Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal cost = COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeCost() <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeCost() <em>Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal overtimeCost = OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOvertimeWork() <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOvertimeWork() <em>Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object overtimeWork = OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualStart() <em>Actual Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualStart() <em>Actual Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualStart = ACTUAL_START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualFinish() <em>Actual Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualFinish() <em>Actual Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualFinish = ACTUAL_FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualDuration() <em>Actual Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_DURATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualDuration() <em>Actual Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualDuration = ACTUAL_DURATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualCost() <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal ACTUAL_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualCost() <em>Actual Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal actualCost = ACTUAL_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeCost() <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal ACTUAL_OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeCost() <em>Actual Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal actualOvertimeCost = ACTUAL_OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualWork() <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualWork() <em>Actual Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualWork = ACTUAL_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeWork() <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeWork() <em>Actual Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualOvertimeWork = ACTUAL_OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRegularWork() <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegularWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REGULAR_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRegularWork() <em>Regular Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegularWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object regularWork = REGULAR_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingDuration() <em>Remaining Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REMAINING_DURATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingDuration() <em>Remaining Duration</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingDuration()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object remainingDuration = REMAINING_DURATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingCost() <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal REMAINING_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingCost() <em>Remaining Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal remainingCost = REMAINING_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingWork() <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REMAINING_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingWork() <em>Remaining Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object remainingWork = REMAINING_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingOvertimeCost() <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigDecimal REMAINING_OVERTIME_COST_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingOvertimeCost() <em>Remaining Overtime Cost</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeCost()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigDecimal remainingOvertimeCost = REMAINING_OVERTIME_COST_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRemainingOvertimeWork() <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object REMAINING_OVERTIME_WORK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRemainingOvertimeWork() <em>Remaining Overtime Work</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRemainingOvertimeWork()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object remainingOvertimeWork = REMAINING_OVERTIME_WORK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getACWP() <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getACWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float ACWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getACWP() <em>ACWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getACWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float aCWP = ACWP_EDEFAULT;
-
-	/**
-	 * This is true if the ACWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean aCWPESet = false;
-
-	/**
-	 * The default value of the '{@link #getCV() <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCV()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float CV_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getCV() <em>CV</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCV()
-	 * @generated
-	 * @ordered
-	 */
-	protected float cV = CV_EDEFAULT;
-
-	/**
-	 * This is true if the CV attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean cVESet = false;
-
-	/**
-	 * The default value of the '{@link #getConstraintType() <em>Constraint Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConstraintType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CONSTRAINT_TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getConstraintType() <em>Constraint Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConstraintType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger constraintType = CONSTRAINT_TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCalendarUID() <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger CALENDAR_UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCalendarUID() <em>Calendar UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCalendarUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger calendarUID = CALENDAR_UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getConstraintDate() <em>Constraint Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConstraintDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CONSTRAINT_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getConstraintDate() <em>Constraint Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConstraintDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object constraintDate = CONSTRAINT_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDeadline() <em>Deadline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDeadline()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object DEADLINE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDeadline() <em>Deadline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDeadline()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object deadline = DEADLINE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isLevelAssignments() <em>Level Assignments</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLevelAssignments()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean LEVEL_ASSIGNMENTS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isLevelAssignments() <em>Level Assignments</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLevelAssignments()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean levelAssignments = LEVEL_ASSIGNMENTS_EDEFAULT;
-
-	/**
-	 * This is true if the Level Assignments attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean levelAssignmentsESet = false;
-
-	/**
-	 * The default value of the '{@link #isLevelingCanSplit() <em>Leveling Can Split</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLevelingCanSplit()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean LEVELING_CAN_SPLIT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isLevelingCanSplit() <em>Leveling Can Split</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isLevelingCanSplit()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean levelingCanSplit = LEVELING_CAN_SPLIT_EDEFAULT;
-
-	/**
-	 * This is true if the Leveling Can Split attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean levelingCanSplitESet = false;
-
-	/**
-	 * The default value of the '{@link #getLevelingDelay() <em>Leveling Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelay()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LEVELING_DELAY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLevelingDelay() <em>Leveling Delay</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelay()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger levelingDelay = LEVELING_DELAY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLevelingDelayFormat() <em>Leveling Delay Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelayFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LEVELING_DELAY_FORMAT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLevelingDelayFormat() <em>Leveling Delay Format</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelingDelayFormat()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger levelingDelayFormat = LEVELING_DELAY_FORMAT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPreLeveledStart() <em>Pre Leveled Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPreLeveledStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object PRE_LEVELED_START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPreLeveledStart() <em>Pre Leveled Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPreLeveledStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object preLeveledStart = PRE_LEVELED_START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPreLeveledFinish() <em>Pre Leveled Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPreLeveledFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object PRE_LEVELED_FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPreLeveledFinish() <em>Pre Leveled Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPreLeveledFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object preLeveledFinish = PRE_LEVELED_FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlink() <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlink()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlink() <em>Hyperlink</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlink()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlink = HYPERLINK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlinkAddress() <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlinkAddress() <em>Hyperlink Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlinkAddress = HYPERLINK_ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHyperlinkSubAddress() <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HYPERLINK_SUB_ADDRESS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHyperlinkSubAddress() <em>Hyperlink Sub Address</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHyperlinkSubAddress()
-	 * @generated
-	 * @ordered
-	 */
-	protected String hyperlinkSubAddress = HYPERLINK_SUB_ADDRESS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isIgnoreResourceCalendar() <em>Ignore Resource Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIgnoreResourceCalendar()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IGNORE_RESOURCE_CALENDAR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIgnoreResourceCalendar() <em>Ignore Resource Calendar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIgnoreResourceCalendar()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean ignoreResourceCalendar = IGNORE_RESOURCE_CALENDAR_EDEFAULT;
-
-	/**
-	 * This is true if the Ignore Resource Calendar attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean ignoreResourceCalendarESet = false;
-
-	/**
-	 * The default value of the '{@link #getNotes() <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NOTES_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNotes() <em>Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected String notes = NOTES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isHideBar() <em>Hide Bar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHideBar()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean HIDE_BAR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isHideBar() <em>Hide Bar</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHideBar()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean hideBar = HIDE_BAR_EDEFAULT;
-
-	/**
-	 * This is true if the Hide Bar attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean hideBarESet = false;
-
-	/**
-	 * The default value of the '{@link #isRollup() <em>Rollup</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRollup()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean ROLLUP_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isRollup() <em>Rollup</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isRollup()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean rollup = ROLLUP_EDEFAULT;
-
-	/**
-	 * This is true if the Rollup attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean rollupESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWS_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWS() <em>BCWS</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWS()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWS = BCWS_EDEFAULT;
-
-	/**
-	 * This is true if the BCWS attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWSESet = false;
-
-	/**
-	 * The default value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float BCWP_EDEFAULT = 0.0F;
-
-	/**
-	 * The cached value of the '{@link #getBCWP() <em>BCWP</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBCWP()
-	 * @generated
-	 * @ordered
-	 */
-	protected float bCWP = BCWP_EDEFAULT;
-
-	/**
-	 * This is true if the BCWP attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean bCWPESet = false;
-
-	/**
-	 * The default value of the '{@link #getPhysicalPercentComplete() <em>Physical Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhysicalPercentComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PHYSICAL_PERCENT_COMPLETE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPhysicalPercentComplete() <em>Physical Percent Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhysicalPercentComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger physicalPercentComplete = PHYSICAL_PERCENT_COMPLETE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEarnedValueMethod() <em>Earned Value Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarnedValueMethod()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger EARNED_VALUE_METHOD_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEarnedValueMethod() <em>Earned Value Method</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEarnedValueMethod()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger earnedValueMethod = EARNED_VALUE_METHOD_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getPredecessorLink() <em>Predecessor Link</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPredecessorLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList predecessorLink = null;
-
-	/**
-	 * The default value of the '{@link #getActualWorkProtected() <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_WORK_PROTECTED_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualWorkProtected() <em>Actual Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualWorkProtected = ACTUAL_WORK_PROTECTED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActualOvertimeWorkProtected() <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActualOvertimeWorkProtected() <em>Actual Overtime Work Protected</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActualOvertimeWorkProtected()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object actualOvertimeWorkProtected = ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getExtendedAttribute() <em>Extended Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExtendedAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList extendedAttribute = null;
-
-	/**
-	 * The cached value of the '{@link #getBaseline() <em>Baseline</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaseline()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList baseline = null;
-
-	/**
-	 * The cached value of the '{@link #getOutlineCode() <em>Outline Code</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutlineCode()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList outlineCode = null;
-
-	/**
-	 * The cached value of the '{@link #getTimephasedData() <em>Timephased Data</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTimephasedData()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList timephasedData = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getTask();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getID() {
-		return iD;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setID(BigInteger newID) {
-		BigInteger oldID = iD;
-		iD = newID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ID, oldID, iD));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(BigInteger newType) {
-		BigInteger oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsNull() {
-		return isNull;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsNull(boolean newIsNull) {
-		boolean oldIsNull = isNull;
-		isNull = newIsNull;
-		boolean oldIsNullESet = isNullESet;
-		isNullESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__IS_NULL, oldIsNull, isNull, !oldIsNullESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsNull() {
-		boolean oldIsNull = isNull;
-		boolean oldIsNullESet = isNullESet;
-		isNull = IS_NULL_EDEFAULT;
-		isNullESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__IS_NULL, oldIsNull, IS_NULL_EDEFAULT, oldIsNullESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsNull() {
-		return isNullESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getCreateDate() {
-		return createDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCreateDate(Object newCreateDate) {
-		Object oldCreateDate = createDate;
-		createDate = newCreateDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__CREATE_DATE, oldCreateDate, createDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getContact() {
-		return contact;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setContact(String newContact) {
-		String oldContact = contact;
-		contact = newContact;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__CONTACT, oldContact, contact));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getWBS() {
-		return wBS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWBS(String newWBS) {
-		String oldWBS = wBS;
-		wBS = newWBS;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__WBS, oldWBS, wBS));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getWBSLevel() {
-		return wBSLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWBSLevel(String newWBSLevel) {
-		String oldWBSLevel = wBSLevel;
-		wBSLevel = newWBSLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__WBS_LEVEL, oldWBSLevel, wBSLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getOutlineNumber() {
-		return outlineNumber;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOutlineNumber(String newOutlineNumber) {
-		String oldOutlineNumber = outlineNumber;
-		outlineNumber = newOutlineNumber;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__OUTLINE_NUMBER, oldOutlineNumber, outlineNumber));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getOutlineLevel() {
-		return outlineLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOutlineLevel(BigInteger newOutlineLevel) {
-		BigInteger oldOutlineLevel = outlineLevel;
-		outlineLevel = newOutlineLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__OUTLINE_LEVEL, oldOutlineLevel, outlineLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getPriority() {
-		return priority;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPriority(BigInteger newPriority) {
-		BigInteger oldPriority = priority;
-		priority = newPriority;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__PRIORITY, oldPriority, priority));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStart() {
-		return start;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStart(Object newStart) {
-		Object oldStart = start;
-		start = newStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__START, oldStart, start));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFinish() {
-		return finish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinish(Object newFinish) {
-		Object oldFinish = finish;
-		finish = newFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__FINISH, oldFinish, finish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getDuration() {
-		return duration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDuration(Object newDuration) {
-		Object oldDuration = duration;
-		duration = newDuration;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__DURATION, oldDuration, duration));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDurationFormat() {
-		return durationFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDurationFormat(BigInteger newDurationFormat) {
-		BigInteger oldDurationFormat = durationFormat;
-		durationFormat = newDurationFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__DURATION_FORMAT, oldDurationFormat, durationFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getWork() {
-		return work;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWork(Object newWork) {
-		Object oldWork = work;
-		work = newWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__WORK, oldWork, work));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStop() {
-		return stop;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStop(Object newStop) {
-		Object oldStop = stop;
-		stop = newStop;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__STOP, oldStop, stop));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getResume() {
-		return resume;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResume(Object newResume) {
-		Object oldResume = resume;
-		resume = newResume;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__RESUME, oldResume, resume));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isResumeValid() {
-		return resumeValid;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResumeValid(boolean newResumeValid) {
-		boolean oldResumeValid = resumeValid;
-		resumeValid = newResumeValid;
-		boolean oldResumeValidESet = resumeValidESet;
-		resumeValidESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__RESUME_VALID, oldResumeValid, resumeValid, !oldResumeValidESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetResumeValid() {
-		boolean oldResumeValid = resumeValid;
-		boolean oldResumeValidESet = resumeValidESet;
-		resumeValid = RESUME_VALID_EDEFAULT;
-		resumeValidESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__RESUME_VALID, oldResumeValid, RESUME_VALID_EDEFAULT, oldResumeValidESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetResumeValid() {
-		return resumeValidESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isEffortDriven() {
-		return effortDriven;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEffortDriven(boolean newEffortDriven) {
-		boolean oldEffortDriven = effortDriven;
-		effortDriven = newEffortDriven;
-		boolean oldEffortDrivenESet = effortDrivenESet;
-		effortDrivenESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__EFFORT_DRIVEN, oldEffortDriven, effortDriven, !oldEffortDrivenESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetEffortDriven() {
-		boolean oldEffortDriven = effortDriven;
-		boolean oldEffortDrivenESet = effortDrivenESet;
-		effortDriven = EFFORT_DRIVEN_EDEFAULT;
-		effortDrivenESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__EFFORT_DRIVEN, oldEffortDriven, EFFORT_DRIVEN_EDEFAULT, oldEffortDrivenESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetEffortDriven() {
-		return effortDrivenESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isRecurring() {
-		return recurring;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRecurring(boolean newRecurring) {
-		boolean oldRecurring = recurring;
-		recurring = newRecurring;
-		boolean oldRecurringESet = recurringESet;
-		recurringESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__RECURRING, oldRecurring, recurring, !oldRecurringESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetRecurring() {
-		boolean oldRecurring = recurring;
-		boolean oldRecurringESet = recurringESet;
-		recurring = RECURRING_EDEFAULT;
-		recurringESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__RECURRING, oldRecurring, RECURRING_EDEFAULT, oldRecurringESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetRecurring() {
-		return recurringESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isOverAllocated() {
-		return overAllocated;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOverAllocated(boolean newOverAllocated) {
-		boolean oldOverAllocated = overAllocated;
-		overAllocated = newOverAllocated;
-		boolean oldOverAllocatedESet = overAllocatedESet;
-		overAllocatedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__OVER_ALLOCATED, oldOverAllocated, overAllocated, !oldOverAllocatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetOverAllocated() {
-		boolean oldOverAllocated = overAllocated;
-		boolean oldOverAllocatedESet = overAllocatedESet;
-		overAllocated = OVER_ALLOCATED_EDEFAULT;
-		overAllocatedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__OVER_ALLOCATED, oldOverAllocated, OVER_ALLOCATED_EDEFAULT, oldOverAllocatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetOverAllocated() {
-		return overAllocatedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isEstimated() {
-		return estimated;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEstimated(boolean newEstimated) {
-		boolean oldEstimated = estimated;
-		estimated = newEstimated;
-		boolean oldEstimatedESet = estimatedESet;
-		estimatedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ESTIMATED, oldEstimated, estimated, !oldEstimatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetEstimated() {
-		boolean oldEstimated = estimated;
-		boolean oldEstimatedESet = estimatedESet;
-		estimated = ESTIMATED_EDEFAULT;
-		estimatedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__ESTIMATED, oldEstimated, ESTIMATED_EDEFAULT, oldEstimatedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetEstimated() {
-		return estimatedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMilestone() {
-		return milestone;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMilestone(boolean newMilestone) {
-		boolean oldMilestone = milestone;
-		milestone = newMilestone;
-		boolean oldMilestoneESet = milestoneESet;
-		milestoneESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__MILESTONE, oldMilestone, milestone, !oldMilestoneESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetMilestone() {
-		boolean oldMilestone = milestone;
-		boolean oldMilestoneESet = milestoneESet;
-		milestone = MILESTONE_EDEFAULT;
-		milestoneESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__MILESTONE, oldMilestone, MILESTONE_EDEFAULT, oldMilestoneESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetMilestone() {
-		return milestoneESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSummary() {
-		return summary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSummary(boolean newSummary) {
-		boolean oldSummary = summary;
-		summary = newSummary;
-		boolean oldSummaryESet = summaryESet;
-		summaryESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__SUMMARY, oldSummary, summary, !oldSummaryESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSummary() {
-		boolean oldSummary = summary;
-		boolean oldSummaryESet = summaryESet;
-		summary = SUMMARY_EDEFAULT;
-		summaryESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__SUMMARY, oldSummary, SUMMARY_EDEFAULT, oldSummaryESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSummary() {
-		return summaryESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isCritical() {
-		return critical;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCritical(boolean newCritical) {
-		boolean oldCritical = critical;
-		critical = newCritical;
-		boolean oldCriticalESet = criticalESet;
-		criticalESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__CRITICAL, oldCritical, critical, !oldCriticalESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCritical() {
-		boolean oldCritical = critical;
-		boolean oldCriticalESet = criticalESet;
-		critical = CRITICAL_EDEFAULT;
-		criticalESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__CRITICAL, oldCritical, CRITICAL_EDEFAULT, oldCriticalESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCritical() {
-		return criticalESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsSubproject() {
-		return isSubproject;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsSubproject(boolean newIsSubproject) {
-		boolean oldIsSubproject = isSubproject;
-		isSubproject = newIsSubproject;
-		boolean oldIsSubprojectESet = isSubprojectESet;
-		isSubprojectESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__IS_SUBPROJECT, oldIsSubproject, isSubproject, !oldIsSubprojectESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsSubproject() {
-		boolean oldIsSubproject = isSubproject;
-		boolean oldIsSubprojectESet = isSubprojectESet;
-		isSubproject = IS_SUBPROJECT_EDEFAULT;
-		isSubprojectESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__IS_SUBPROJECT, oldIsSubproject, IS_SUBPROJECT_EDEFAULT, oldIsSubprojectESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsSubproject() {
-		return isSubprojectESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsSubprojectReadOnly() {
-		return isSubprojectReadOnly;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsSubprojectReadOnly(boolean newIsSubprojectReadOnly) {
-		boolean oldIsSubprojectReadOnly = isSubprojectReadOnly;
-		isSubprojectReadOnly = newIsSubprojectReadOnly;
-		boolean oldIsSubprojectReadOnlyESet = isSubprojectReadOnlyESet;
-		isSubprojectReadOnlyESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__IS_SUBPROJECT_READ_ONLY, oldIsSubprojectReadOnly, isSubprojectReadOnly, !oldIsSubprojectReadOnlyESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsSubprojectReadOnly() {
-		boolean oldIsSubprojectReadOnly = isSubprojectReadOnly;
-		boolean oldIsSubprojectReadOnlyESet = isSubprojectReadOnlyESet;
-		isSubprojectReadOnly = IS_SUBPROJECT_READ_ONLY_EDEFAULT;
-		isSubprojectReadOnlyESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__IS_SUBPROJECT_READ_ONLY, oldIsSubprojectReadOnly, IS_SUBPROJECT_READ_ONLY_EDEFAULT, oldIsSubprojectReadOnlyESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsSubprojectReadOnly() {
-		return isSubprojectReadOnlyESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSubprojectName() {
-		return subprojectName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSubprojectName(String newSubprojectName) {
-		String oldSubprojectName = subprojectName;
-		subprojectName = newSubprojectName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__SUBPROJECT_NAME, oldSubprojectName, subprojectName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isExternalTask() {
-		return externalTask;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalTask(boolean newExternalTask) {
-		boolean oldExternalTask = externalTask;
-		externalTask = newExternalTask;
-		boolean oldExternalTaskESet = externalTaskESet;
-		externalTaskESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__EXTERNAL_TASK, oldExternalTask, externalTask, !oldExternalTaskESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetExternalTask() {
-		boolean oldExternalTask = externalTask;
-		boolean oldExternalTaskESet = externalTaskESet;
-		externalTask = EXTERNAL_TASK_EDEFAULT;
-		externalTaskESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__EXTERNAL_TASK, oldExternalTask, EXTERNAL_TASK_EDEFAULT, oldExternalTaskESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetExternalTask() {
-		return externalTaskESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getExternalTaskProject() {
-		return externalTaskProject;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalTaskProject(String newExternalTaskProject) {
-		String oldExternalTaskProject = externalTaskProject;
-		externalTaskProject = newExternalTaskProject;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__EXTERNAL_TASK_PROJECT, oldExternalTaskProject, externalTaskProject));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getEarlyStart() {
-		return earlyStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEarlyStart(Object newEarlyStart) {
-		Object oldEarlyStart = earlyStart;
-		earlyStart = newEarlyStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__EARLY_START, oldEarlyStart, earlyStart));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getEarlyFinish() {
-		return earlyFinish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEarlyFinish(Object newEarlyFinish) {
-		Object oldEarlyFinish = earlyFinish;
-		earlyFinish = newEarlyFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__EARLY_FINISH, oldEarlyFinish, earlyFinish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getLateStart() {
-		return lateStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLateStart(Object newLateStart) {
-		Object oldLateStart = lateStart;
-		lateStart = newLateStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__LATE_START, oldLateStart, lateStart));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getLateFinish() {
-		return lateFinish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLateFinish(Object newLateFinish) {
-		Object oldLateFinish = lateFinish;
-		lateFinish = newLateFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__LATE_FINISH, oldLateFinish, lateFinish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getStartVariance() {
-		return startVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStartVariance(BigInteger newStartVariance) {
-		BigInteger oldStartVariance = startVariance;
-		startVariance = newStartVariance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__START_VARIANCE, oldStartVariance, startVariance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getFinishVariance() {
-		return finishVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinishVariance(BigInteger newFinishVariance) {
-		BigInteger oldFinishVariance = finishVariance;
-		finishVariance = newFinishVariance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__FINISH_VARIANCE, oldFinishVariance, finishVariance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getWorkVariance() {
-		return workVariance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkVariance(float newWorkVariance) {
-		float oldWorkVariance = workVariance;
-		workVariance = newWorkVariance;
-		boolean oldWorkVarianceESet = workVarianceESet;
-		workVarianceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__WORK_VARIANCE, oldWorkVariance, workVariance, !oldWorkVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetWorkVariance() {
-		float oldWorkVariance = workVariance;
-		boolean oldWorkVarianceESet = workVarianceESet;
-		workVariance = WORK_VARIANCE_EDEFAULT;
-		workVarianceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__WORK_VARIANCE, oldWorkVariance, WORK_VARIANCE_EDEFAULT, oldWorkVarianceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetWorkVariance() {
-		return workVarianceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getFreeSlack() {
-		return freeSlack;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFreeSlack(BigInteger newFreeSlack) {
-		BigInteger oldFreeSlack = freeSlack;
-		freeSlack = newFreeSlack;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__FREE_SLACK, oldFreeSlack, freeSlack));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getTotalSlack() {
-		return totalSlack;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTotalSlack(BigInteger newTotalSlack) {
-		BigInteger oldTotalSlack = totalSlack;
-		totalSlack = newTotalSlack;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__TOTAL_SLACK, oldTotalSlack, totalSlack));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getFixedCost() {
-		return fixedCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFixedCost(float newFixedCost) {
-		float oldFixedCost = fixedCost;
-		fixedCost = newFixedCost;
-		boolean oldFixedCostESet = fixedCostESet;
-		fixedCostESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__FIXED_COST, oldFixedCost, fixedCost, !oldFixedCostESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetFixedCost() {
-		float oldFixedCost = fixedCost;
-		boolean oldFixedCostESet = fixedCostESet;
-		fixedCost = FIXED_COST_EDEFAULT;
-		fixedCostESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__FIXED_COST, oldFixedCost, FIXED_COST_EDEFAULT, oldFixedCostESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetFixedCost() {
-		return fixedCostESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getFixedCostAccrual() {
-		return fixedCostAccrual;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFixedCostAccrual(String newFixedCostAccrual) {
-		String oldFixedCostAccrual = fixedCostAccrual;
-		fixedCostAccrual = newFixedCostAccrual;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__FIXED_COST_ACCRUAL, oldFixedCostAccrual, fixedCostAccrual));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getPercentComplete() {
-		return percentComplete;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPercentComplete(BigInteger newPercentComplete) {
-		BigInteger oldPercentComplete = percentComplete;
-		percentComplete = newPercentComplete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__PERCENT_COMPLETE, oldPercentComplete, percentComplete));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getPercentWorkComplete() {
-		return percentWorkComplete;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPercentWorkComplete(BigInteger newPercentWorkComplete) {
-		BigInteger oldPercentWorkComplete = percentWorkComplete;
-		percentWorkComplete = newPercentWorkComplete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__PERCENT_WORK_COMPLETE, oldPercentWorkComplete, percentWorkComplete));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getCost() {
-		return cost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCost(BigDecimal newCost) {
-		BigDecimal oldCost = cost;
-		cost = newCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__COST, oldCost, cost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getOvertimeCost() {
-		return overtimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeCost(BigDecimal newOvertimeCost) {
-		BigDecimal oldOvertimeCost = overtimeCost;
-		overtimeCost = newOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__OVERTIME_COST, oldOvertimeCost, overtimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getOvertimeWork() {
-		return overtimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOvertimeWork(Object newOvertimeWork) {
-		Object oldOvertimeWork = overtimeWork;
-		overtimeWork = newOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__OVERTIME_WORK, oldOvertimeWork, overtimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualStart() {
-		return actualStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualStart(Object newActualStart) {
-		Object oldActualStart = actualStart;
-		actualStart = newActualStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_START, oldActualStart, actualStart));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualFinish() {
-		return actualFinish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualFinish(Object newActualFinish) {
-		Object oldActualFinish = actualFinish;
-		actualFinish = newActualFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_FINISH, oldActualFinish, actualFinish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualDuration() {
-		return actualDuration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualDuration(Object newActualDuration) {
-		Object oldActualDuration = actualDuration;
-		actualDuration = newActualDuration;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_DURATION, oldActualDuration, actualDuration));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getActualCost() {
-		return actualCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualCost(BigDecimal newActualCost) {
-		BigDecimal oldActualCost = actualCost;
-		actualCost = newActualCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_COST, oldActualCost, actualCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getActualOvertimeCost() {
-		return actualOvertimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeCost(BigDecimal newActualOvertimeCost) {
-		BigDecimal oldActualOvertimeCost = actualOvertimeCost;
-		actualOvertimeCost = newActualOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_OVERTIME_COST, oldActualOvertimeCost, actualOvertimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualWork() {
-		return actualWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualWork(Object newActualWork) {
-		Object oldActualWork = actualWork;
-		actualWork = newActualWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_WORK, oldActualWork, actualWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualOvertimeWork() {
-		return actualOvertimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeWork(Object newActualOvertimeWork) {
-		Object oldActualOvertimeWork = actualOvertimeWork;
-		actualOvertimeWork = newActualOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK, oldActualOvertimeWork, actualOvertimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRegularWork() {
-		return regularWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRegularWork(Object newRegularWork) {
-		Object oldRegularWork = regularWork;
-		regularWork = newRegularWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__REGULAR_WORK, oldRegularWork, regularWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRemainingDuration() {
-		return remainingDuration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingDuration(Object newRemainingDuration) {
-		Object oldRemainingDuration = remainingDuration;
-		remainingDuration = newRemainingDuration;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__REMAINING_DURATION, oldRemainingDuration, remainingDuration));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getRemainingCost() {
-		return remainingCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingCost(BigDecimal newRemainingCost) {
-		BigDecimal oldRemainingCost = remainingCost;
-		remainingCost = newRemainingCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__REMAINING_COST, oldRemainingCost, remainingCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRemainingWork() {
-		return remainingWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingWork(Object newRemainingWork) {
-		Object oldRemainingWork = remainingWork;
-		remainingWork = newRemainingWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__REMAINING_WORK, oldRemainingWork, remainingWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigDecimal getRemainingOvertimeCost() {
-		return remainingOvertimeCost;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingOvertimeCost(BigDecimal newRemainingOvertimeCost) {
-		BigDecimal oldRemainingOvertimeCost = remainingOvertimeCost;
-		remainingOvertimeCost = newRemainingOvertimeCost;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__REMAINING_OVERTIME_COST, oldRemainingOvertimeCost, remainingOvertimeCost));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getRemainingOvertimeWork() {
-		return remainingOvertimeWork;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRemainingOvertimeWork(Object newRemainingOvertimeWork) {
-		Object oldRemainingOvertimeWork = remainingOvertimeWork;
-		remainingOvertimeWork = newRemainingOvertimeWork;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__REMAINING_OVERTIME_WORK, oldRemainingOvertimeWork, remainingOvertimeWork));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getACWP() {
-		return aCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setACWP(float newACWP) {
-		float oldACWP = aCWP;
-		aCWP = newACWP;
-		boolean oldACWPESet = aCWPESet;
-		aCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACWP, oldACWP, aCWP, !oldACWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetACWP() {
-		float oldACWP = aCWP;
-		boolean oldACWPESet = aCWPESet;
-		aCWP = ACWP_EDEFAULT;
-		aCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__ACWP, oldACWP, ACWP_EDEFAULT, oldACWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetACWP() {
-		return aCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getCV() {
-		return cV;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCV(float newCV) {
-		float oldCV = cV;
-		cV = newCV;
-		boolean oldCVESet = cVESet;
-		cVESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__CV, oldCV, cV, !oldCVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetCV() {
-		float oldCV = cV;
-		boolean oldCVESet = cVESet;
-		cV = CV_EDEFAULT;
-		cVESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__CV, oldCV, CV_EDEFAULT, oldCVESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetCV() {
-		return cVESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getConstraintType() {
-		return constraintType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConstraintType(BigInteger newConstraintType) {
-		BigInteger oldConstraintType = constraintType;
-		constraintType = newConstraintType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__CONSTRAINT_TYPE, oldConstraintType, constraintType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getCalendarUID() {
-		return calendarUID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCalendarUID(BigInteger newCalendarUID) {
-		BigInteger oldCalendarUID = calendarUID;
-		calendarUID = newCalendarUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__CALENDAR_UID, oldCalendarUID, calendarUID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getConstraintDate() {
-		return constraintDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConstraintDate(Object newConstraintDate) {
-		Object oldConstraintDate = constraintDate;
-		constraintDate = newConstraintDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__CONSTRAINT_DATE, oldConstraintDate, constraintDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getDeadline() {
-		return deadline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDeadline(Object newDeadline) {
-		Object oldDeadline = deadline;
-		deadline = newDeadline;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__DEADLINE, oldDeadline, deadline));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isLevelAssignments() {
-		return levelAssignments;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelAssignments(boolean newLevelAssignments) {
-		boolean oldLevelAssignments = levelAssignments;
-		levelAssignments = newLevelAssignments;
-		boolean oldLevelAssignmentsESet = levelAssignmentsESet;
-		levelAssignmentsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__LEVEL_ASSIGNMENTS, oldLevelAssignments, levelAssignments, !oldLevelAssignmentsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLevelAssignments() {
-		boolean oldLevelAssignments = levelAssignments;
-		boolean oldLevelAssignmentsESet = levelAssignmentsESet;
-		levelAssignments = LEVEL_ASSIGNMENTS_EDEFAULT;
-		levelAssignmentsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__LEVEL_ASSIGNMENTS, oldLevelAssignments, LEVEL_ASSIGNMENTS_EDEFAULT, oldLevelAssignmentsESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLevelAssignments() {
-		return levelAssignmentsESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isLevelingCanSplit() {
-		return levelingCanSplit;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelingCanSplit(boolean newLevelingCanSplit) {
-		boolean oldLevelingCanSplit = levelingCanSplit;
-		levelingCanSplit = newLevelingCanSplit;
-		boolean oldLevelingCanSplitESet = levelingCanSplitESet;
-		levelingCanSplitESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__LEVELING_CAN_SPLIT, oldLevelingCanSplit, levelingCanSplit, !oldLevelingCanSplitESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLevelingCanSplit() {
-		boolean oldLevelingCanSplit = levelingCanSplit;
-		boolean oldLevelingCanSplitESet = levelingCanSplitESet;
-		levelingCanSplit = LEVELING_CAN_SPLIT_EDEFAULT;
-		levelingCanSplitESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__LEVELING_CAN_SPLIT, oldLevelingCanSplit, LEVELING_CAN_SPLIT_EDEFAULT, oldLevelingCanSplitESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLevelingCanSplit() {
-		return levelingCanSplitESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLevelingDelay() {
-		return levelingDelay;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelingDelay(BigInteger newLevelingDelay) {
-		BigInteger oldLevelingDelay = levelingDelay;
-		levelingDelay = newLevelingDelay;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__LEVELING_DELAY, oldLevelingDelay, levelingDelay));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLevelingDelayFormat() {
-		return levelingDelayFormat;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelingDelayFormat(BigInteger newLevelingDelayFormat) {
-		BigInteger oldLevelingDelayFormat = levelingDelayFormat;
-		levelingDelayFormat = newLevelingDelayFormat;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__LEVELING_DELAY_FORMAT, oldLevelingDelayFormat, levelingDelayFormat));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getPreLeveledStart() {
-		return preLeveledStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPreLeveledStart(Object newPreLeveledStart) {
-		Object oldPreLeveledStart = preLeveledStart;
-		preLeveledStart = newPreLeveledStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__PRE_LEVELED_START, oldPreLeveledStart, preLeveledStart));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getPreLeveledFinish() {
-		return preLeveledFinish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPreLeveledFinish(Object newPreLeveledFinish) {
-		Object oldPreLeveledFinish = preLeveledFinish;
-		preLeveledFinish = newPreLeveledFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__PRE_LEVELED_FINISH, oldPreLeveledFinish, preLeveledFinish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlink() {
-		return hyperlink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlink(String newHyperlink) {
-		String oldHyperlink = hyperlink;
-		hyperlink = newHyperlink;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__HYPERLINK, oldHyperlink, hyperlink));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlinkAddress() {
-		return hyperlinkAddress;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlinkAddress(String newHyperlinkAddress) {
-		String oldHyperlinkAddress = hyperlinkAddress;
-		hyperlinkAddress = newHyperlinkAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__HYPERLINK_ADDRESS, oldHyperlinkAddress, hyperlinkAddress));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHyperlinkSubAddress() {
-		return hyperlinkSubAddress;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHyperlinkSubAddress(String newHyperlinkSubAddress) {
-		String oldHyperlinkSubAddress = hyperlinkSubAddress;
-		hyperlinkSubAddress = newHyperlinkSubAddress;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__HYPERLINK_SUB_ADDRESS, oldHyperlinkSubAddress, hyperlinkSubAddress));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIgnoreResourceCalendar() {
-		return ignoreResourceCalendar;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIgnoreResourceCalendar(boolean newIgnoreResourceCalendar) {
-		boolean oldIgnoreResourceCalendar = ignoreResourceCalendar;
-		ignoreResourceCalendar = newIgnoreResourceCalendar;
-		boolean oldIgnoreResourceCalendarESet = ignoreResourceCalendarESet;
-		ignoreResourceCalendarESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__IGNORE_RESOURCE_CALENDAR, oldIgnoreResourceCalendar, ignoreResourceCalendar, !oldIgnoreResourceCalendarESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIgnoreResourceCalendar() {
-		boolean oldIgnoreResourceCalendar = ignoreResourceCalendar;
-		boolean oldIgnoreResourceCalendarESet = ignoreResourceCalendarESet;
-		ignoreResourceCalendar = IGNORE_RESOURCE_CALENDAR_EDEFAULT;
-		ignoreResourceCalendarESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__IGNORE_RESOURCE_CALENDAR, oldIgnoreResourceCalendar, IGNORE_RESOURCE_CALENDAR_EDEFAULT, oldIgnoreResourceCalendarESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIgnoreResourceCalendar() {
-		return ignoreResourceCalendarESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNotes() {
-		return notes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNotes(String newNotes) {
-		String oldNotes = notes;
-		notes = newNotes;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__NOTES, oldNotes, notes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isHideBar() {
-		return hideBar;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHideBar(boolean newHideBar) {
-		boolean oldHideBar = hideBar;
-		hideBar = newHideBar;
-		boolean oldHideBarESet = hideBarESet;
-		hideBarESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__HIDE_BAR, oldHideBar, hideBar, !oldHideBarESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetHideBar() {
-		boolean oldHideBar = hideBar;
-		boolean oldHideBarESet = hideBarESet;
-		hideBar = HIDE_BAR_EDEFAULT;
-		hideBarESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__HIDE_BAR, oldHideBar, HIDE_BAR_EDEFAULT, oldHideBarESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetHideBar() {
-		return hideBarESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isRollup() {
-		return rollup;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRollup(boolean newRollup) {
-		boolean oldRollup = rollup;
-		rollup = newRollup;
-		boolean oldRollupESet = rollupESet;
-		rollupESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ROLLUP, oldRollup, rollup, !oldRollupESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetRollup() {
-		boolean oldRollup = rollup;
-		boolean oldRollupESet = rollupESet;
-		rollup = ROLLUP_EDEFAULT;
-		rollupESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__ROLLUP, oldRollup, ROLLUP_EDEFAULT, oldRollupESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetRollup() {
-		return rollupESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWS() {
-		return bCWS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWS(float newBCWS) {
-		float oldBCWS = bCWS;
-		bCWS = newBCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWSESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__BCWS, oldBCWS, bCWS, !oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWS() {
-		float oldBCWS = bCWS;
-		boolean oldBCWSESet = bCWSESet;
-		bCWS = BCWS_EDEFAULT;
-		bCWSESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__BCWS, oldBCWS, BCWS_EDEFAULT, oldBCWSESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWS() {
-		return bCWSESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public float getBCWP() {
-		return bCWP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBCWP(float newBCWP) {
-		float oldBCWP = bCWP;
-		bCWP = newBCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWPESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__BCWP, oldBCWP, bCWP, !oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetBCWP() {
-		float oldBCWP = bCWP;
-		boolean oldBCWPESet = bCWPESet;
-		bCWP = BCWP_EDEFAULT;
-		bCWPESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.TASK__BCWP, oldBCWP, BCWP_EDEFAULT, oldBCWPESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetBCWP() {
-		return bCWPESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getPhysicalPercentComplete() {
-		return physicalPercentComplete;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPhysicalPercentComplete(BigInteger newPhysicalPercentComplete) {
-		BigInteger oldPhysicalPercentComplete = physicalPercentComplete;
-		physicalPercentComplete = newPhysicalPercentComplete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__PHYSICAL_PERCENT_COMPLETE, oldPhysicalPercentComplete, physicalPercentComplete));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getEarnedValueMethod() {
-		return earnedValueMethod;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEarnedValueMethod(BigInteger newEarnedValueMethod) {
-		BigInteger oldEarnedValueMethod = earnedValueMethod;
-		earnedValueMethod = newEarnedValueMethod;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__EARNED_VALUE_METHOD, oldEarnedValueMethod, earnedValueMethod));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPredecessorLink() {
-		if (predecessorLink == null) {
-			predecessorLink = new EObjectContainmentEList(PredecessorLink.class, this, MsprojectPackage.TASK__PREDECESSOR_LINK);
-		}
-		return predecessorLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualWorkProtected() {
-		return actualWorkProtected;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualWorkProtected(Object newActualWorkProtected) {
-		Object oldActualWorkProtected = actualWorkProtected;
-		actualWorkProtected = newActualWorkProtected;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_WORK_PROTECTED, oldActualWorkProtected, actualWorkProtected));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getActualOvertimeWorkProtected() {
-		return actualOvertimeWorkProtected;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActualOvertimeWorkProtected(Object newActualOvertimeWorkProtected) {
-		Object oldActualOvertimeWorkProtected = actualOvertimeWorkProtected;
-		actualOvertimeWorkProtected = newActualOvertimeWorkProtected;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK_PROTECTED, oldActualOvertimeWorkProtected, actualOvertimeWorkProtected));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExtendedAttribute() {
-		if (extendedAttribute == null) {
-			extendedAttribute = new EObjectContainmentEList(ExtendedAttribute2.class, this, MsprojectPackage.TASK__EXTENDED_ATTRIBUTE);
-		}
-		return extendedAttribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBaseline() {
-		if (baseline == null) {
-			baseline = new EObjectContainmentEList(Baseline.class, this, MsprojectPackage.TASK__BASELINE);
-		}
-		return baseline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOutlineCode() {
-		if (outlineCode == null) {
-			outlineCode = new EObjectContainmentEList(OutlineCode2.class, this, MsprojectPackage.TASK__OUTLINE_CODE);
-		}
-		return outlineCode;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTimephasedData() {
-		if (timephasedData == null) {
-			timephasedData = new EObjectContainmentEList(TimephasedDataType.class, this, MsprojectPackage.TASK__TIMEPHASED_DATA);
-		}
-		return timephasedData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.TASK__PREDECESSOR_LINK:
-					return ((InternalEList)getPredecessorLink()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.TASK__EXTENDED_ATTRIBUTE:
-					return ((InternalEList)getExtendedAttribute()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.TASK__BASELINE:
-					return ((InternalEList)getBaseline()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.TASK__OUTLINE_CODE:
-					return ((InternalEList)getOutlineCode()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.TASK__TIMEPHASED_DATA:
-					return ((InternalEList)getTimephasedData()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASK__UID:
-				return getUID();
-			case MsprojectPackage.TASK__ID:
-				return getID();
-			case MsprojectPackage.TASK__NAME:
-				return getName();
-			case MsprojectPackage.TASK__TYPE:
-				return getType();
-			case MsprojectPackage.TASK__IS_NULL:
-				return isIsNull() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__CREATE_DATE:
-				return getCreateDate();
-			case MsprojectPackage.TASK__CONTACT:
-				return getContact();
-			case MsprojectPackage.TASK__WBS:
-				return getWBS();
-			case MsprojectPackage.TASK__WBS_LEVEL:
-				return getWBSLevel();
-			case MsprojectPackage.TASK__OUTLINE_NUMBER:
-				return getOutlineNumber();
-			case MsprojectPackage.TASK__OUTLINE_LEVEL:
-				return getOutlineLevel();
-			case MsprojectPackage.TASK__PRIORITY:
-				return getPriority();
-			case MsprojectPackage.TASK__START:
-				return getStart();
-			case MsprojectPackage.TASK__FINISH:
-				return getFinish();
-			case MsprojectPackage.TASK__DURATION:
-				return getDuration();
-			case MsprojectPackage.TASK__DURATION_FORMAT:
-				return getDurationFormat();
-			case MsprojectPackage.TASK__WORK:
-				return getWork();
-			case MsprojectPackage.TASK__STOP:
-				return getStop();
-			case MsprojectPackage.TASK__RESUME:
-				return getResume();
-			case MsprojectPackage.TASK__RESUME_VALID:
-				return isResumeValid() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__EFFORT_DRIVEN:
-				return isEffortDriven() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__RECURRING:
-				return isRecurring() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__OVER_ALLOCATED:
-				return isOverAllocated() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__ESTIMATED:
-				return isEstimated() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__MILESTONE:
-				return isMilestone() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__SUMMARY:
-				return isSummary() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__CRITICAL:
-				return isCritical() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__IS_SUBPROJECT:
-				return isIsSubproject() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__IS_SUBPROJECT_READ_ONLY:
-				return isIsSubprojectReadOnly() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__SUBPROJECT_NAME:
-				return getSubprojectName();
-			case MsprojectPackage.TASK__EXTERNAL_TASK:
-				return isExternalTask() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__EXTERNAL_TASK_PROJECT:
-				return getExternalTaskProject();
-			case MsprojectPackage.TASK__EARLY_START:
-				return getEarlyStart();
-			case MsprojectPackage.TASK__EARLY_FINISH:
-				return getEarlyFinish();
-			case MsprojectPackage.TASK__LATE_START:
-				return getLateStart();
-			case MsprojectPackage.TASK__LATE_FINISH:
-				return getLateFinish();
-			case MsprojectPackage.TASK__START_VARIANCE:
-				return getStartVariance();
-			case MsprojectPackage.TASK__FINISH_VARIANCE:
-				return getFinishVariance();
-			case MsprojectPackage.TASK__WORK_VARIANCE:
-				return new Float(getWorkVariance());
-			case MsprojectPackage.TASK__FREE_SLACK:
-				return getFreeSlack();
-			case MsprojectPackage.TASK__TOTAL_SLACK:
-				return getTotalSlack();
-			case MsprojectPackage.TASK__FIXED_COST:
-				return new Float(getFixedCost());
-			case MsprojectPackage.TASK__FIXED_COST_ACCRUAL:
-				return getFixedCostAccrual();
-			case MsprojectPackage.TASK__PERCENT_COMPLETE:
-				return getPercentComplete();
-			case MsprojectPackage.TASK__PERCENT_WORK_COMPLETE:
-				return getPercentWorkComplete();
-			case MsprojectPackage.TASK__COST:
-				return getCost();
-			case MsprojectPackage.TASK__OVERTIME_COST:
-				return getOvertimeCost();
-			case MsprojectPackage.TASK__OVERTIME_WORK:
-				return getOvertimeWork();
-			case MsprojectPackage.TASK__ACTUAL_START:
-				return getActualStart();
-			case MsprojectPackage.TASK__ACTUAL_FINISH:
-				return getActualFinish();
-			case MsprojectPackage.TASK__ACTUAL_DURATION:
-				return getActualDuration();
-			case MsprojectPackage.TASK__ACTUAL_COST:
-				return getActualCost();
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_COST:
-				return getActualOvertimeCost();
-			case MsprojectPackage.TASK__ACTUAL_WORK:
-				return getActualWork();
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK:
-				return getActualOvertimeWork();
-			case MsprojectPackage.TASK__REGULAR_WORK:
-				return getRegularWork();
-			case MsprojectPackage.TASK__REMAINING_DURATION:
-				return getRemainingDuration();
-			case MsprojectPackage.TASK__REMAINING_COST:
-				return getRemainingCost();
-			case MsprojectPackage.TASK__REMAINING_WORK:
-				return getRemainingWork();
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_COST:
-				return getRemainingOvertimeCost();
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_WORK:
-				return getRemainingOvertimeWork();
-			case MsprojectPackage.TASK__ACWP:
-				return new Float(getACWP());
-			case MsprojectPackage.TASK__CV:
-				return new Float(getCV());
-			case MsprojectPackage.TASK__CONSTRAINT_TYPE:
-				return getConstraintType();
-			case MsprojectPackage.TASK__CALENDAR_UID:
-				return getCalendarUID();
-			case MsprojectPackage.TASK__CONSTRAINT_DATE:
-				return getConstraintDate();
-			case MsprojectPackage.TASK__DEADLINE:
-				return getDeadline();
-			case MsprojectPackage.TASK__LEVEL_ASSIGNMENTS:
-				return isLevelAssignments() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__LEVELING_CAN_SPLIT:
-				return isLevelingCanSplit() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__LEVELING_DELAY:
-				return getLevelingDelay();
-			case MsprojectPackage.TASK__LEVELING_DELAY_FORMAT:
-				return getLevelingDelayFormat();
-			case MsprojectPackage.TASK__PRE_LEVELED_START:
-				return getPreLeveledStart();
-			case MsprojectPackage.TASK__PRE_LEVELED_FINISH:
-				return getPreLeveledFinish();
-			case MsprojectPackage.TASK__HYPERLINK:
-				return getHyperlink();
-			case MsprojectPackage.TASK__HYPERLINK_ADDRESS:
-				return getHyperlinkAddress();
-			case MsprojectPackage.TASK__HYPERLINK_SUB_ADDRESS:
-				return getHyperlinkSubAddress();
-			case MsprojectPackage.TASK__IGNORE_RESOURCE_CALENDAR:
-				return isIgnoreResourceCalendar() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__NOTES:
-				return getNotes();
-			case MsprojectPackage.TASK__HIDE_BAR:
-				return isHideBar() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__ROLLUP:
-				return isRollup() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.TASK__BCWS:
-				return new Float(getBCWS());
-			case MsprojectPackage.TASK__BCWP:
-				return new Float(getBCWP());
-			case MsprojectPackage.TASK__PHYSICAL_PERCENT_COMPLETE:
-				return getPhysicalPercentComplete();
-			case MsprojectPackage.TASK__EARNED_VALUE_METHOD:
-				return getEarnedValueMethod();
-			case MsprojectPackage.TASK__PREDECESSOR_LINK:
-				return getPredecessorLink();
-			case MsprojectPackage.TASK__ACTUAL_WORK_PROTECTED:
-				return getActualWorkProtected();
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK_PROTECTED:
-				return getActualOvertimeWorkProtected();
-			case MsprojectPackage.TASK__EXTENDED_ATTRIBUTE:
-				return getExtendedAttribute();
-			case MsprojectPackage.TASK__BASELINE:
-				return getBaseline();
-			case MsprojectPackage.TASK__OUTLINE_CODE:
-				return getOutlineCode();
-			case MsprojectPackage.TASK__TIMEPHASED_DATA:
-				return getTimephasedData();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASK__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__ID:
-				setID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__NAME:
-				setName((String)newValue);
-				return;
-			case MsprojectPackage.TASK__TYPE:
-				setType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__IS_NULL:
-				setIsNull(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__CREATE_DATE:
-				setCreateDate((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__CONTACT:
-				setContact((String)newValue);
-				return;
-			case MsprojectPackage.TASK__WBS:
-				setWBS((String)newValue);
-				return;
-			case MsprojectPackage.TASK__WBS_LEVEL:
-				setWBSLevel((String)newValue);
-				return;
-			case MsprojectPackage.TASK__OUTLINE_NUMBER:
-				setOutlineNumber((String)newValue);
-				return;
-			case MsprojectPackage.TASK__OUTLINE_LEVEL:
-				setOutlineLevel((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__PRIORITY:
-				setPriority((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__START:
-				setStart((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__FINISH:
-				setFinish((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__DURATION:
-				setDuration((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__DURATION_FORMAT:
-				setDurationFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__WORK:
-				setWork((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__STOP:
-				setStop((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__RESUME:
-				setResume((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__RESUME_VALID:
-				setResumeValid(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__EFFORT_DRIVEN:
-				setEffortDriven(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__RECURRING:
-				setRecurring(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__OVER_ALLOCATED:
-				setOverAllocated(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__ESTIMATED:
-				setEstimated(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__MILESTONE:
-				setMilestone(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__SUMMARY:
-				setSummary(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__CRITICAL:
-				setCritical(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__IS_SUBPROJECT:
-				setIsSubproject(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__IS_SUBPROJECT_READ_ONLY:
-				setIsSubprojectReadOnly(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__SUBPROJECT_NAME:
-				setSubprojectName((String)newValue);
-				return;
-			case MsprojectPackage.TASK__EXTERNAL_TASK:
-				setExternalTask(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__EXTERNAL_TASK_PROJECT:
-				setExternalTaskProject((String)newValue);
-				return;
-			case MsprojectPackage.TASK__EARLY_START:
-				setEarlyStart((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__EARLY_FINISH:
-				setEarlyFinish((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__LATE_START:
-				setLateStart((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__LATE_FINISH:
-				setLateFinish((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__START_VARIANCE:
-				setStartVariance((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__FINISH_VARIANCE:
-				setFinishVariance((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__WORK_VARIANCE:
-				setWorkVariance(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.TASK__FREE_SLACK:
-				setFreeSlack((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__TOTAL_SLACK:
-				setTotalSlack((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__FIXED_COST:
-				setFixedCost(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.TASK__FIXED_COST_ACCRUAL:
-				setFixedCostAccrual((String)newValue);
-				return;
-			case MsprojectPackage.TASK__PERCENT_COMPLETE:
-				setPercentComplete((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__PERCENT_WORK_COMPLETE:
-				setPercentWorkComplete((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__COST:
-				setCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.TASK__OVERTIME_COST:
-				setOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.TASK__OVERTIME_WORK:
-				setOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_START:
-				setActualStart((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_FINISH:
-				setActualFinish((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_DURATION:
-				setActualDuration((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_COST:
-				setActualCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_COST:
-				setActualOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_WORK:
-				setActualWork((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK:
-				setActualOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__REGULAR_WORK:
-				setRegularWork((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__REMAINING_DURATION:
-				setRemainingDuration((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__REMAINING_COST:
-				setRemainingCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.TASK__REMAINING_WORK:
-				setRemainingWork((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_COST:
-				setRemainingOvertimeCost((BigDecimal)newValue);
-				return;
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_WORK:
-				setRemainingOvertimeWork((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__ACWP:
-				setACWP(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.TASK__CV:
-				setCV(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.TASK__CONSTRAINT_TYPE:
-				setConstraintType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__CALENDAR_UID:
-				setCalendarUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__CONSTRAINT_DATE:
-				setConstraintDate((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__DEADLINE:
-				setDeadline((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__LEVEL_ASSIGNMENTS:
-				setLevelAssignments(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__LEVELING_CAN_SPLIT:
-				setLevelingCanSplit(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__LEVELING_DELAY:
-				setLevelingDelay((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__LEVELING_DELAY_FORMAT:
-				setLevelingDelayFormat((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__PRE_LEVELED_START:
-				setPreLeveledStart((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__PRE_LEVELED_FINISH:
-				setPreLeveledFinish((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__HYPERLINK:
-				setHyperlink((String)newValue);
-				return;
-			case MsprojectPackage.TASK__HYPERLINK_ADDRESS:
-				setHyperlinkAddress((String)newValue);
-				return;
-			case MsprojectPackage.TASK__HYPERLINK_SUB_ADDRESS:
-				setHyperlinkSubAddress((String)newValue);
-				return;
-			case MsprojectPackage.TASK__IGNORE_RESOURCE_CALENDAR:
-				setIgnoreResourceCalendar(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__NOTES:
-				setNotes((String)newValue);
-				return;
-			case MsprojectPackage.TASK__HIDE_BAR:
-				setHideBar(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__ROLLUP:
-				setRollup(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.TASK__BCWS:
-				setBCWS(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.TASK__BCWP:
-				setBCWP(((Float)newValue).floatValue());
-				return;
-			case MsprojectPackage.TASK__PHYSICAL_PERCENT_COMPLETE:
-				setPhysicalPercentComplete((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__EARNED_VALUE_METHOD:
-				setEarnedValueMethod((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TASK__PREDECESSOR_LINK:
-				getPredecessorLink().clear();
-				getPredecessorLink().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_WORK_PROTECTED:
-				setActualWorkProtected((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK_PROTECTED:
-				setActualOvertimeWorkProtected((Object)newValue);
-				return;
-			case MsprojectPackage.TASK__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				getExtendedAttribute().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.TASK__BASELINE:
-				getBaseline().clear();
-				getBaseline().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.TASK__OUTLINE_CODE:
-				getOutlineCode().clear();
-				getOutlineCode().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.TASK__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				getTimephasedData().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASK__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ID:
-				setID(ID_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__IS_NULL:
-				unsetIsNull();
-				return;
-			case MsprojectPackage.TASK__CREATE_DATE:
-				setCreateDate(CREATE_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__CONTACT:
-				setContact(CONTACT_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__WBS:
-				setWBS(WBS_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__WBS_LEVEL:
-				setWBSLevel(WBS_LEVEL_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__OUTLINE_NUMBER:
-				setOutlineNumber(OUTLINE_NUMBER_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__OUTLINE_LEVEL:
-				setOutlineLevel(OUTLINE_LEVEL_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__PRIORITY:
-				setPriority(PRIORITY_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__START:
-				setStart(START_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__FINISH:
-				setFinish(FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__DURATION:
-				setDuration(DURATION_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__DURATION_FORMAT:
-				setDurationFormat(DURATION_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__WORK:
-				setWork(WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__STOP:
-				setStop(STOP_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__RESUME:
-				setResume(RESUME_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__RESUME_VALID:
-				unsetResumeValid();
-				return;
-			case MsprojectPackage.TASK__EFFORT_DRIVEN:
-				unsetEffortDriven();
-				return;
-			case MsprojectPackage.TASK__RECURRING:
-				unsetRecurring();
-				return;
-			case MsprojectPackage.TASK__OVER_ALLOCATED:
-				unsetOverAllocated();
-				return;
-			case MsprojectPackage.TASK__ESTIMATED:
-				unsetEstimated();
-				return;
-			case MsprojectPackage.TASK__MILESTONE:
-				unsetMilestone();
-				return;
-			case MsprojectPackage.TASK__SUMMARY:
-				unsetSummary();
-				return;
-			case MsprojectPackage.TASK__CRITICAL:
-				unsetCritical();
-				return;
-			case MsprojectPackage.TASK__IS_SUBPROJECT:
-				unsetIsSubproject();
-				return;
-			case MsprojectPackage.TASK__IS_SUBPROJECT_READ_ONLY:
-				unsetIsSubprojectReadOnly();
-				return;
-			case MsprojectPackage.TASK__SUBPROJECT_NAME:
-				setSubprojectName(SUBPROJECT_NAME_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__EXTERNAL_TASK:
-				unsetExternalTask();
-				return;
-			case MsprojectPackage.TASK__EXTERNAL_TASK_PROJECT:
-				setExternalTaskProject(EXTERNAL_TASK_PROJECT_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__EARLY_START:
-				setEarlyStart(EARLY_START_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__EARLY_FINISH:
-				setEarlyFinish(EARLY_FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__LATE_START:
-				setLateStart(LATE_START_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__LATE_FINISH:
-				setLateFinish(LATE_FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__START_VARIANCE:
-				setStartVariance(START_VARIANCE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__FINISH_VARIANCE:
-				setFinishVariance(FINISH_VARIANCE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__WORK_VARIANCE:
-				unsetWorkVariance();
-				return;
-			case MsprojectPackage.TASK__FREE_SLACK:
-				setFreeSlack(FREE_SLACK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__TOTAL_SLACK:
-				setTotalSlack(TOTAL_SLACK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__FIXED_COST:
-				unsetFixedCost();
-				return;
-			case MsprojectPackage.TASK__FIXED_COST_ACCRUAL:
-				setFixedCostAccrual(FIXED_COST_ACCRUAL_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__PERCENT_COMPLETE:
-				setPercentComplete(PERCENT_COMPLETE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__PERCENT_WORK_COMPLETE:
-				setPercentWorkComplete(PERCENT_WORK_COMPLETE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__COST:
-				setCost(COST_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__OVERTIME_COST:
-				setOvertimeCost(OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__OVERTIME_WORK:
-				setOvertimeWork(OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_START:
-				setActualStart(ACTUAL_START_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_FINISH:
-				setActualFinish(ACTUAL_FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_DURATION:
-				setActualDuration(ACTUAL_DURATION_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_COST:
-				setActualCost(ACTUAL_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_COST:
-				setActualOvertimeCost(ACTUAL_OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_WORK:
-				setActualWork(ACTUAL_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK:
-				setActualOvertimeWork(ACTUAL_OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__REGULAR_WORK:
-				setRegularWork(REGULAR_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__REMAINING_DURATION:
-				setRemainingDuration(REMAINING_DURATION_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__REMAINING_COST:
-				setRemainingCost(REMAINING_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__REMAINING_WORK:
-				setRemainingWork(REMAINING_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_COST:
-				setRemainingOvertimeCost(REMAINING_OVERTIME_COST_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_WORK:
-				setRemainingOvertimeWork(REMAINING_OVERTIME_WORK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACWP:
-				unsetACWP();
-				return;
-			case MsprojectPackage.TASK__CV:
-				unsetCV();
-				return;
-			case MsprojectPackage.TASK__CONSTRAINT_TYPE:
-				setConstraintType(CONSTRAINT_TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__CALENDAR_UID:
-				setCalendarUID(CALENDAR_UID_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__CONSTRAINT_DATE:
-				setConstraintDate(CONSTRAINT_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__DEADLINE:
-				setDeadline(DEADLINE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__LEVEL_ASSIGNMENTS:
-				unsetLevelAssignments();
-				return;
-			case MsprojectPackage.TASK__LEVELING_CAN_SPLIT:
-				unsetLevelingCanSplit();
-				return;
-			case MsprojectPackage.TASK__LEVELING_DELAY:
-				setLevelingDelay(LEVELING_DELAY_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__LEVELING_DELAY_FORMAT:
-				setLevelingDelayFormat(LEVELING_DELAY_FORMAT_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__PRE_LEVELED_START:
-				setPreLeveledStart(PRE_LEVELED_START_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__PRE_LEVELED_FINISH:
-				setPreLeveledFinish(PRE_LEVELED_FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__HYPERLINK:
-				setHyperlink(HYPERLINK_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__HYPERLINK_ADDRESS:
-				setHyperlinkAddress(HYPERLINK_ADDRESS_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__HYPERLINK_SUB_ADDRESS:
-				setHyperlinkSubAddress(HYPERLINK_SUB_ADDRESS_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__IGNORE_RESOURCE_CALENDAR:
-				unsetIgnoreResourceCalendar();
-				return;
-			case MsprojectPackage.TASK__NOTES:
-				setNotes(NOTES_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__HIDE_BAR:
-				unsetHideBar();
-				return;
-			case MsprojectPackage.TASK__ROLLUP:
-				unsetRollup();
-				return;
-			case MsprojectPackage.TASK__BCWS:
-				unsetBCWS();
-				return;
-			case MsprojectPackage.TASK__BCWP:
-				unsetBCWP();
-				return;
-			case MsprojectPackage.TASK__PHYSICAL_PERCENT_COMPLETE:
-				setPhysicalPercentComplete(PHYSICAL_PERCENT_COMPLETE_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__EARNED_VALUE_METHOD:
-				setEarnedValueMethod(EARNED_VALUE_METHOD_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__PREDECESSOR_LINK:
-				getPredecessorLink().clear();
-				return;
-			case MsprojectPackage.TASK__ACTUAL_WORK_PROTECTED:
-				setActualWorkProtected(ACTUAL_WORK_PROTECTED_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK_PROTECTED:
-				setActualOvertimeWorkProtected(ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT);
-				return;
-			case MsprojectPackage.TASK__EXTENDED_ATTRIBUTE:
-				getExtendedAttribute().clear();
-				return;
-			case MsprojectPackage.TASK__BASELINE:
-				getBaseline().clear();
-				return;
-			case MsprojectPackage.TASK__OUTLINE_CODE:
-				getOutlineCode().clear();
-				return;
-			case MsprojectPackage.TASK__TIMEPHASED_DATA:
-				getTimephasedData().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASK__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.TASK__ID:
-				return ID_EDEFAULT == null ? iD != null : !ID_EDEFAULT.equals(iD);
-			case MsprojectPackage.TASK__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case MsprojectPackage.TASK__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MsprojectPackage.TASK__IS_NULL:
-				return isSetIsNull();
-			case MsprojectPackage.TASK__CREATE_DATE:
-				return CREATE_DATE_EDEFAULT == null ? createDate != null : !CREATE_DATE_EDEFAULT.equals(createDate);
-			case MsprojectPackage.TASK__CONTACT:
-				return CONTACT_EDEFAULT == null ? contact != null : !CONTACT_EDEFAULT.equals(contact);
-			case MsprojectPackage.TASK__WBS:
-				return WBS_EDEFAULT == null ? wBS != null : !WBS_EDEFAULT.equals(wBS);
-			case MsprojectPackage.TASK__WBS_LEVEL:
-				return WBS_LEVEL_EDEFAULT == null ? wBSLevel != null : !WBS_LEVEL_EDEFAULT.equals(wBSLevel);
-			case MsprojectPackage.TASK__OUTLINE_NUMBER:
-				return OUTLINE_NUMBER_EDEFAULT == null ? outlineNumber != null : !OUTLINE_NUMBER_EDEFAULT.equals(outlineNumber);
-			case MsprojectPackage.TASK__OUTLINE_LEVEL:
-				return OUTLINE_LEVEL_EDEFAULT == null ? outlineLevel != null : !OUTLINE_LEVEL_EDEFAULT.equals(outlineLevel);
-			case MsprojectPackage.TASK__PRIORITY:
-				return PRIORITY_EDEFAULT == null ? priority != null : !PRIORITY_EDEFAULT.equals(priority);
-			case MsprojectPackage.TASK__START:
-				return START_EDEFAULT == null ? start != null : !START_EDEFAULT.equals(start);
-			case MsprojectPackage.TASK__FINISH:
-				return FINISH_EDEFAULT == null ? finish != null : !FINISH_EDEFAULT.equals(finish);
-			case MsprojectPackage.TASK__DURATION:
-				return DURATION_EDEFAULT == null ? duration != null : !DURATION_EDEFAULT.equals(duration);
-			case MsprojectPackage.TASK__DURATION_FORMAT:
-				return DURATION_FORMAT_EDEFAULT == null ? durationFormat != null : !DURATION_FORMAT_EDEFAULT.equals(durationFormat);
-			case MsprojectPackage.TASK__WORK:
-				return WORK_EDEFAULT == null ? work != null : !WORK_EDEFAULT.equals(work);
-			case MsprojectPackage.TASK__STOP:
-				return STOP_EDEFAULT == null ? stop != null : !STOP_EDEFAULT.equals(stop);
-			case MsprojectPackage.TASK__RESUME:
-				return RESUME_EDEFAULT == null ? resume != null : !RESUME_EDEFAULT.equals(resume);
-			case MsprojectPackage.TASK__RESUME_VALID:
-				return isSetResumeValid();
-			case MsprojectPackage.TASK__EFFORT_DRIVEN:
-				return isSetEffortDriven();
-			case MsprojectPackage.TASK__RECURRING:
-				return isSetRecurring();
-			case MsprojectPackage.TASK__OVER_ALLOCATED:
-				return isSetOverAllocated();
-			case MsprojectPackage.TASK__ESTIMATED:
-				return isSetEstimated();
-			case MsprojectPackage.TASK__MILESTONE:
-				return isSetMilestone();
-			case MsprojectPackage.TASK__SUMMARY:
-				return isSetSummary();
-			case MsprojectPackage.TASK__CRITICAL:
-				return isSetCritical();
-			case MsprojectPackage.TASK__IS_SUBPROJECT:
-				return isSetIsSubproject();
-			case MsprojectPackage.TASK__IS_SUBPROJECT_READ_ONLY:
-				return isSetIsSubprojectReadOnly();
-			case MsprojectPackage.TASK__SUBPROJECT_NAME:
-				return SUBPROJECT_NAME_EDEFAULT == null ? subprojectName != null : !SUBPROJECT_NAME_EDEFAULT.equals(subprojectName);
-			case MsprojectPackage.TASK__EXTERNAL_TASK:
-				return isSetExternalTask();
-			case MsprojectPackage.TASK__EXTERNAL_TASK_PROJECT:
-				return EXTERNAL_TASK_PROJECT_EDEFAULT == null ? externalTaskProject != null : !EXTERNAL_TASK_PROJECT_EDEFAULT.equals(externalTaskProject);
-			case MsprojectPackage.TASK__EARLY_START:
-				return EARLY_START_EDEFAULT == null ? earlyStart != null : !EARLY_START_EDEFAULT.equals(earlyStart);
-			case MsprojectPackage.TASK__EARLY_FINISH:
-				return EARLY_FINISH_EDEFAULT == null ? earlyFinish != null : !EARLY_FINISH_EDEFAULT.equals(earlyFinish);
-			case MsprojectPackage.TASK__LATE_START:
-				return LATE_START_EDEFAULT == null ? lateStart != null : !LATE_START_EDEFAULT.equals(lateStart);
-			case MsprojectPackage.TASK__LATE_FINISH:
-				return LATE_FINISH_EDEFAULT == null ? lateFinish != null : !LATE_FINISH_EDEFAULT.equals(lateFinish);
-			case MsprojectPackage.TASK__START_VARIANCE:
-				return START_VARIANCE_EDEFAULT == null ? startVariance != null : !START_VARIANCE_EDEFAULT.equals(startVariance);
-			case MsprojectPackage.TASK__FINISH_VARIANCE:
-				return FINISH_VARIANCE_EDEFAULT == null ? finishVariance != null : !FINISH_VARIANCE_EDEFAULT.equals(finishVariance);
-			case MsprojectPackage.TASK__WORK_VARIANCE:
-				return isSetWorkVariance();
-			case MsprojectPackage.TASK__FREE_SLACK:
-				return FREE_SLACK_EDEFAULT == null ? freeSlack != null : !FREE_SLACK_EDEFAULT.equals(freeSlack);
-			case MsprojectPackage.TASK__TOTAL_SLACK:
-				return TOTAL_SLACK_EDEFAULT == null ? totalSlack != null : !TOTAL_SLACK_EDEFAULT.equals(totalSlack);
-			case MsprojectPackage.TASK__FIXED_COST:
-				return isSetFixedCost();
-			case MsprojectPackage.TASK__FIXED_COST_ACCRUAL:
-				return FIXED_COST_ACCRUAL_EDEFAULT == null ? fixedCostAccrual != null : !FIXED_COST_ACCRUAL_EDEFAULT.equals(fixedCostAccrual);
-			case MsprojectPackage.TASK__PERCENT_COMPLETE:
-				return PERCENT_COMPLETE_EDEFAULT == null ? percentComplete != null : !PERCENT_COMPLETE_EDEFAULT.equals(percentComplete);
-			case MsprojectPackage.TASK__PERCENT_WORK_COMPLETE:
-				return PERCENT_WORK_COMPLETE_EDEFAULT == null ? percentWorkComplete != null : !PERCENT_WORK_COMPLETE_EDEFAULT.equals(percentWorkComplete);
-			case MsprojectPackage.TASK__COST:
-				return COST_EDEFAULT == null ? cost != null : !COST_EDEFAULT.equals(cost);
-			case MsprojectPackage.TASK__OVERTIME_COST:
-				return OVERTIME_COST_EDEFAULT == null ? overtimeCost != null : !OVERTIME_COST_EDEFAULT.equals(overtimeCost);
-			case MsprojectPackage.TASK__OVERTIME_WORK:
-				return OVERTIME_WORK_EDEFAULT == null ? overtimeWork != null : !OVERTIME_WORK_EDEFAULT.equals(overtimeWork);
-			case MsprojectPackage.TASK__ACTUAL_START:
-				return ACTUAL_START_EDEFAULT == null ? actualStart != null : !ACTUAL_START_EDEFAULT.equals(actualStart);
-			case MsprojectPackage.TASK__ACTUAL_FINISH:
-				return ACTUAL_FINISH_EDEFAULT == null ? actualFinish != null : !ACTUAL_FINISH_EDEFAULT.equals(actualFinish);
-			case MsprojectPackage.TASK__ACTUAL_DURATION:
-				return ACTUAL_DURATION_EDEFAULT == null ? actualDuration != null : !ACTUAL_DURATION_EDEFAULT.equals(actualDuration);
-			case MsprojectPackage.TASK__ACTUAL_COST:
-				return ACTUAL_COST_EDEFAULT == null ? actualCost != null : !ACTUAL_COST_EDEFAULT.equals(actualCost);
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_COST:
-				return ACTUAL_OVERTIME_COST_EDEFAULT == null ? actualOvertimeCost != null : !ACTUAL_OVERTIME_COST_EDEFAULT.equals(actualOvertimeCost);
-			case MsprojectPackage.TASK__ACTUAL_WORK:
-				return ACTUAL_WORK_EDEFAULT == null ? actualWork != null : !ACTUAL_WORK_EDEFAULT.equals(actualWork);
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK:
-				return ACTUAL_OVERTIME_WORK_EDEFAULT == null ? actualOvertimeWork != null : !ACTUAL_OVERTIME_WORK_EDEFAULT.equals(actualOvertimeWork);
-			case MsprojectPackage.TASK__REGULAR_WORK:
-				return REGULAR_WORK_EDEFAULT == null ? regularWork != null : !REGULAR_WORK_EDEFAULT.equals(regularWork);
-			case MsprojectPackage.TASK__REMAINING_DURATION:
-				return REMAINING_DURATION_EDEFAULT == null ? remainingDuration != null : !REMAINING_DURATION_EDEFAULT.equals(remainingDuration);
-			case MsprojectPackage.TASK__REMAINING_COST:
-				return REMAINING_COST_EDEFAULT == null ? remainingCost != null : !REMAINING_COST_EDEFAULT.equals(remainingCost);
-			case MsprojectPackage.TASK__REMAINING_WORK:
-				return REMAINING_WORK_EDEFAULT == null ? remainingWork != null : !REMAINING_WORK_EDEFAULT.equals(remainingWork);
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_COST:
-				return REMAINING_OVERTIME_COST_EDEFAULT == null ? remainingOvertimeCost != null : !REMAINING_OVERTIME_COST_EDEFAULT.equals(remainingOvertimeCost);
-			case MsprojectPackage.TASK__REMAINING_OVERTIME_WORK:
-				return REMAINING_OVERTIME_WORK_EDEFAULT == null ? remainingOvertimeWork != null : !REMAINING_OVERTIME_WORK_EDEFAULT.equals(remainingOvertimeWork);
-			case MsprojectPackage.TASK__ACWP:
-				return isSetACWP();
-			case MsprojectPackage.TASK__CV:
-				return isSetCV();
-			case MsprojectPackage.TASK__CONSTRAINT_TYPE:
-				return CONSTRAINT_TYPE_EDEFAULT == null ? constraintType != null : !CONSTRAINT_TYPE_EDEFAULT.equals(constraintType);
-			case MsprojectPackage.TASK__CALENDAR_UID:
-				return CALENDAR_UID_EDEFAULT == null ? calendarUID != null : !CALENDAR_UID_EDEFAULT.equals(calendarUID);
-			case MsprojectPackage.TASK__CONSTRAINT_DATE:
-				return CONSTRAINT_DATE_EDEFAULT == null ? constraintDate != null : !CONSTRAINT_DATE_EDEFAULT.equals(constraintDate);
-			case MsprojectPackage.TASK__DEADLINE:
-				return DEADLINE_EDEFAULT == null ? deadline != null : !DEADLINE_EDEFAULT.equals(deadline);
-			case MsprojectPackage.TASK__LEVEL_ASSIGNMENTS:
-				return isSetLevelAssignments();
-			case MsprojectPackage.TASK__LEVELING_CAN_SPLIT:
-				return isSetLevelingCanSplit();
-			case MsprojectPackage.TASK__LEVELING_DELAY:
-				return LEVELING_DELAY_EDEFAULT == null ? levelingDelay != null : !LEVELING_DELAY_EDEFAULT.equals(levelingDelay);
-			case MsprojectPackage.TASK__LEVELING_DELAY_FORMAT:
-				return LEVELING_DELAY_FORMAT_EDEFAULT == null ? levelingDelayFormat != null : !LEVELING_DELAY_FORMAT_EDEFAULT.equals(levelingDelayFormat);
-			case MsprojectPackage.TASK__PRE_LEVELED_START:
-				return PRE_LEVELED_START_EDEFAULT == null ? preLeveledStart != null : !PRE_LEVELED_START_EDEFAULT.equals(preLeveledStart);
-			case MsprojectPackage.TASK__PRE_LEVELED_FINISH:
-				return PRE_LEVELED_FINISH_EDEFAULT == null ? preLeveledFinish != null : !PRE_LEVELED_FINISH_EDEFAULT.equals(preLeveledFinish);
-			case MsprojectPackage.TASK__HYPERLINK:
-				return HYPERLINK_EDEFAULT == null ? hyperlink != null : !HYPERLINK_EDEFAULT.equals(hyperlink);
-			case MsprojectPackage.TASK__HYPERLINK_ADDRESS:
-				return HYPERLINK_ADDRESS_EDEFAULT == null ? hyperlinkAddress != null : !HYPERLINK_ADDRESS_EDEFAULT.equals(hyperlinkAddress);
-			case MsprojectPackage.TASK__HYPERLINK_SUB_ADDRESS:
-				return HYPERLINK_SUB_ADDRESS_EDEFAULT == null ? hyperlinkSubAddress != null : !HYPERLINK_SUB_ADDRESS_EDEFAULT.equals(hyperlinkSubAddress);
-			case MsprojectPackage.TASK__IGNORE_RESOURCE_CALENDAR:
-				return isSetIgnoreResourceCalendar();
-			case MsprojectPackage.TASK__NOTES:
-				return NOTES_EDEFAULT == null ? notes != null : !NOTES_EDEFAULT.equals(notes);
-			case MsprojectPackage.TASK__HIDE_BAR:
-				return isSetHideBar();
-			case MsprojectPackage.TASK__ROLLUP:
-				return isSetRollup();
-			case MsprojectPackage.TASK__BCWS:
-				return isSetBCWS();
-			case MsprojectPackage.TASK__BCWP:
-				return isSetBCWP();
-			case MsprojectPackage.TASK__PHYSICAL_PERCENT_COMPLETE:
-				return PHYSICAL_PERCENT_COMPLETE_EDEFAULT == null ? physicalPercentComplete != null : !PHYSICAL_PERCENT_COMPLETE_EDEFAULT.equals(physicalPercentComplete);
-			case MsprojectPackage.TASK__EARNED_VALUE_METHOD:
-				return EARNED_VALUE_METHOD_EDEFAULT == null ? earnedValueMethod != null : !EARNED_VALUE_METHOD_EDEFAULT.equals(earnedValueMethod);
-			case MsprojectPackage.TASK__PREDECESSOR_LINK:
-				return predecessorLink != null && !predecessorLink.isEmpty();
-			case MsprojectPackage.TASK__ACTUAL_WORK_PROTECTED:
-				return ACTUAL_WORK_PROTECTED_EDEFAULT == null ? actualWorkProtected != null : !ACTUAL_WORK_PROTECTED_EDEFAULT.equals(actualWorkProtected);
-			case MsprojectPackage.TASK__ACTUAL_OVERTIME_WORK_PROTECTED:
-				return ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT == null ? actualOvertimeWorkProtected != null : !ACTUAL_OVERTIME_WORK_PROTECTED_EDEFAULT.equals(actualOvertimeWorkProtected);
-			case MsprojectPackage.TASK__EXTENDED_ATTRIBUTE:
-				return extendedAttribute != null && !extendedAttribute.isEmpty();
-			case MsprojectPackage.TASK__BASELINE:
-				return baseline != null && !baseline.isEmpty();
-			case MsprojectPackage.TASK__OUTLINE_CODE:
-				return outlineCode != null && !outlineCode.isEmpty();
-			case MsprojectPackage.TASK__TIMEPHASED_DATA:
-				return timephasedData != null && !timephasedData.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uID: ");
-		result.append(uID);
-		result.append(", iD: ");
-		result.append(iD);
-		result.append(", name: ");
-		result.append(name);
-		result.append(", type: ");
-		result.append(type);
-		result.append(", isNull: ");
-		if (isNullESet) result.append(isNull); else result.append("<unset>");
-		result.append(", createDate: ");
-		result.append(createDate);
-		result.append(", contact: ");
-		result.append(contact);
-		result.append(", wBS: ");
-		result.append(wBS);
-		result.append(", wBSLevel: ");
-		result.append(wBSLevel);
-		result.append(", outlineNumber: ");
-		result.append(outlineNumber);
-		result.append(", outlineLevel: ");
-		result.append(outlineLevel);
-		result.append(", priority: ");
-		result.append(priority);
-		result.append(", start: ");
-		result.append(start);
-		result.append(", finish: ");
-		result.append(finish);
-		result.append(", duration: ");
-		result.append(duration);
-		result.append(", durationFormat: ");
-		result.append(durationFormat);
-		result.append(", work: ");
-		result.append(work);
-		result.append(", stop: ");
-		result.append(stop);
-		result.append(", resume: ");
-		result.append(resume);
-		result.append(", resumeValid: ");
-		if (resumeValidESet) result.append(resumeValid); else result.append("<unset>");
-		result.append(", effortDriven: ");
-		if (effortDrivenESet) result.append(effortDriven); else result.append("<unset>");
-		result.append(", recurring: ");
-		if (recurringESet) result.append(recurring); else result.append("<unset>");
-		result.append(", overAllocated: ");
-		if (overAllocatedESet) result.append(overAllocated); else result.append("<unset>");
-		result.append(", estimated: ");
-		if (estimatedESet) result.append(estimated); else result.append("<unset>");
-		result.append(", milestone: ");
-		if (milestoneESet) result.append(milestone); else result.append("<unset>");
-		result.append(", summary: ");
-		if (summaryESet) result.append(summary); else result.append("<unset>");
-		result.append(", critical: ");
-		if (criticalESet) result.append(critical); else result.append("<unset>");
-		result.append(", isSubproject: ");
-		if (isSubprojectESet) result.append(isSubproject); else result.append("<unset>");
-		result.append(", isSubprojectReadOnly: ");
-		if (isSubprojectReadOnlyESet) result.append(isSubprojectReadOnly); else result.append("<unset>");
-		result.append(", subprojectName: ");
-		result.append(subprojectName);
-		result.append(", externalTask: ");
-		if (externalTaskESet) result.append(externalTask); else result.append("<unset>");
-		result.append(", externalTaskProject: ");
-		result.append(externalTaskProject);
-		result.append(", earlyStart: ");
-		result.append(earlyStart);
-		result.append(", earlyFinish: ");
-		result.append(earlyFinish);
-		result.append(", lateStart: ");
-		result.append(lateStart);
-		result.append(", lateFinish: ");
-		result.append(lateFinish);
-		result.append(", startVariance: ");
-		result.append(startVariance);
-		result.append(", finishVariance: ");
-		result.append(finishVariance);
-		result.append(", workVariance: ");
-		if (workVarianceESet) result.append(workVariance); else result.append("<unset>");
-		result.append(", freeSlack: ");
-		result.append(freeSlack);
-		result.append(", totalSlack: ");
-		result.append(totalSlack);
-		result.append(", fixedCost: ");
-		if (fixedCostESet) result.append(fixedCost); else result.append("<unset>");
-		result.append(", fixedCostAccrual: ");
-		result.append(fixedCostAccrual);
-		result.append(", percentComplete: ");
-		result.append(percentComplete);
-		result.append(", percentWorkComplete: ");
-		result.append(percentWorkComplete);
-		result.append(", cost: ");
-		result.append(cost);
-		result.append(", overtimeCost: ");
-		result.append(overtimeCost);
-		result.append(", overtimeWork: ");
-		result.append(overtimeWork);
-		result.append(", actualStart: ");
-		result.append(actualStart);
-		result.append(", actualFinish: ");
-		result.append(actualFinish);
-		result.append(", actualDuration: ");
-		result.append(actualDuration);
-		result.append(", actualCost: ");
-		result.append(actualCost);
-		result.append(", actualOvertimeCost: ");
-		result.append(actualOvertimeCost);
-		result.append(", actualWork: ");
-		result.append(actualWork);
-		result.append(", actualOvertimeWork: ");
-		result.append(actualOvertimeWork);
-		result.append(", regularWork: ");
-		result.append(regularWork);
-		result.append(", remainingDuration: ");
-		result.append(remainingDuration);
-		result.append(", remainingCost: ");
-		result.append(remainingCost);
-		result.append(", remainingWork: ");
-		result.append(remainingWork);
-		result.append(", remainingOvertimeCost: ");
-		result.append(remainingOvertimeCost);
-		result.append(", remainingOvertimeWork: ");
-		result.append(remainingOvertimeWork);
-		result.append(", aCWP: ");
-		if (aCWPESet) result.append(aCWP); else result.append("<unset>");
-		result.append(", cV: ");
-		if (cVESet) result.append(cV); else result.append("<unset>");
-		result.append(", constraintType: ");
-		result.append(constraintType);
-		result.append(", calendarUID: ");
-		result.append(calendarUID);
-		result.append(", constraintDate: ");
-		result.append(constraintDate);
-		result.append(", deadline: ");
-		result.append(deadline);
-		result.append(", levelAssignments: ");
-		if (levelAssignmentsESet) result.append(levelAssignments); else result.append("<unset>");
-		result.append(", levelingCanSplit: ");
-		if (levelingCanSplitESet) result.append(levelingCanSplit); else result.append("<unset>");
-		result.append(", levelingDelay: ");
-		result.append(levelingDelay);
-		result.append(", levelingDelayFormat: ");
-		result.append(levelingDelayFormat);
-		result.append(", preLeveledStart: ");
-		result.append(preLeveledStart);
-		result.append(", preLeveledFinish: ");
-		result.append(preLeveledFinish);
-		result.append(", hyperlink: ");
-		result.append(hyperlink);
-		result.append(", hyperlinkAddress: ");
-		result.append(hyperlinkAddress);
-		result.append(", hyperlinkSubAddress: ");
-		result.append(hyperlinkSubAddress);
-		result.append(", ignoreResourceCalendar: ");
-		if (ignoreResourceCalendarESet) result.append(ignoreResourceCalendar); else result.append("<unset>");
-		result.append(", notes: ");
-		result.append(notes);
-		result.append(", hideBar: ");
-		if (hideBarESet) result.append(hideBar); else result.append("<unset>");
-		result.append(", rollup: ");
-		if (rollupESet) result.append(rollup); else result.append("<unset>");
-		result.append(", bCWS: ");
-		if (bCWSESet) result.append(bCWS); else result.append("<unset>");
-		result.append(", bCWP: ");
-		if (bCWPESet) result.append(bCWP); else result.append("<unset>");
-		result.append(", physicalPercentComplete: ");
-		result.append(physicalPercentComplete);
-		result.append(", earnedValueMethod: ");
-		result.append(earnedValueMethod);
-		result.append(", actualWorkProtected: ");
-		result.append(actualWorkProtected);
-		result.append(", actualOvertimeWorkProtected: ");
-		result.append(actualOvertimeWorkProtected);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TaskImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TasksImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TasksImpl.java
deleted file mode 100644
index c7f5eed..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TasksImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TasksImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Task;
-import org.eclipse.epf.msproject.Tasks;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tasks</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.TasksImpl#getTask <em>Task</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TasksImpl extends EObjectImpl implements Tasks {
-	/**
-	 * The cached value of the '{@link #getTask() <em>Task</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTask()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList task = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TasksImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getTasks();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTask() {
-		if (task == null) {
-			task = new EObjectContainmentEList(Task.class, this, MsprojectPackage.TASKS__TASK);
-		}
-		return task;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.TASKS__TASK:
-					return ((InternalEList)getTask()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASKS__TASK:
-				return getTask();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASKS__TASK:
-				getTask().clear();
-				getTask().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASKS__TASK:
-				getTask().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TASKS__TASK:
-				return task != null && !task.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //TasksImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TimePeriodImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TimePeriodImpl.java
deleted file mode 100644
index d4e718c..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TimePeriodImpl.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TimePeriodImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.TimePeriod;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Time Period</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimePeriodImpl#getFromDate <em>From Date</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimePeriodImpl#getToDate <em>To Date</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TimePeriodImpl extends EObjectImpl implements TimePeriod {
-	/**
-	 * The default value of the '{@link #getFromDate() <em>From Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FROM_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFromDate() <em>From Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object fromDate = FROM_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getToDate() <em>To Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object TO_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getToDate() <em>To Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object toDate = TO_DATE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TimePeriodImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getTimePeriod();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFromDate() {
-		return fromDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromDate(Object newFromDate) {
-		Object oldFromDate = fromDate;
-		fromDate = newFromDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIME_PERIOD__FROM_DATE, oldFromDate, fromDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getToDate() {
-		return toDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setToDate(Object newToDate) {
-		Object oldToDate = toDate;
-		toDate = newToDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIME_PERIOD__TO_DATE, oldToDate, toDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIME_PERIOD__FROM_DATE:
-				return getFromDate();
-			case MsprojectPackage.TIME_PERIOD__TO_DATE:
-				return getToDate();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIME_PERIOD__FROM_DATE:
-				setFromDate((Object)newValue);
-				return;
-			case MsprojectPackage.TIME_PERIOD__TO_DATE:
-				setToDate((Object)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIME_PERIOD__FROM_DATE:
-				setFromDate(FROM_DATE_EDEFAULT);
-				return;
-			case MsprojectPackage.TIME_PERIOD__TO_DATE:
-				setToDate(TO_DATE_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIME_PERIOD__FROM_DATE:
-				return FROM_DATE_EDEFAULT == null ? fromDate != null : !FROM_DATE_EDEFAULT.equals(fromDate);
-			case MsprojectPackage.TIME_PERIOD__TO_DATE:
-				return TO_DATE_EDEFAULT == null ? toDate != null : !TO_DATE_EDEFAULT.equals(toDate);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (fromDate: ");
-		result.append(fromDate);
-		result.append(", toDate: ");
-		result.append(toDate);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TimePeriodImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TimephasedDataTypeImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TimephasedDataTypeImpl.java
deleted file mode 100644
index 072a0cb..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/TimephasedDataTypeImpl.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TimephasedDataTypeImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.TimephasedDataType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Timephased Data Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl#getUID <em>UID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl#getStart <em>Start</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl#getFinish <em>Finish</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl#getUnit <em>Unit</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.TimephasedDataTypeImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TimephasedDataTypeImpl extends EObjectImpl implements TimephasedDataType {
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger type = TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUID() <em>UID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger uID = UID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object START_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStart() <em>Start</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStart()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object start = START_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FINISH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinish() <em>Finish</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinish()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object finish = FINISH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getUnit() <em>Unit</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUnit()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger UNIT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUnit() <em>Unit</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUnit()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger unit = UNIT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TimephasedDataTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getTimephasedDataType();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(BigInteger newType) {
-		BigInteger oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIMEPHASED_DATA_TYPE__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUID() {
-		return uID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUID(BigInteger newUID) {
-		BigInteger oldUID = uID;
-		uID = newUID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIMEPHASED_DATA_TYPE__UID, oldUID, uID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStart() {
-		return start;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStart(Object newStart) {
-		Object oldStart = start;
-		start = newStart;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIMEPHASED_DATA_TYPE__START, oldStart, start));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFinish() {
-		return finish;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinish(Object newFinish) {
-		Object oldFinish = finish;
-		finish = newFinish;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIMEPHASED_DATA_TYPE__FINISH, oldFinish, finish));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getUnit() {
-		return unit;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUnit(BigInteger newUnit) {
-		BigInteger oldUnit = unit;
-		unit = newUnit;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIMEPHASED_DATA_TYPE__UNIT, oldUnit, unit));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.TIMEPHASED_DATA_TYPE__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__TYPE:
-				return getType();
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UID:
-				return getUID();
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__START:
-				return getStart();
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__FINISH:
-				return getFinish();
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UNIT:
-				return getUnit();
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__VALUE:
-				return getValue();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__TYPE:
-				setType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UID:
-				setUID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__START:
-				setStart((Object)newValue);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__FINISH:
-				setFinish((Object)newValue);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UNIT:
-				setUnit((BigInteger)newValue);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UID:
-				setUID(UID_EDEFAULT);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__START:
-				setStart(START_EDEFAULT);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__FINISH:
-				setFinish(FINISH_EDEFAULT);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UNIT:
-				setUnit(UNIT_EDEFAULT);
-				return;
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UID:
-				return UID_EDEFAULT == null ? uID != null : !UID_EDEFAULT.equals(uID);
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__START:
-				return START_EDEFAULT == null ? start != null : !START_EDEFAULT.equals(start);
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__FINISH:
-				return FINISH_EDEFAULT == null ? finish != null : !FINISH_EDEFAULT.equals(finish);
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__UNIT:
-				return UNIT_EDEFAULT == null ? unit != null : !UNIT_EDEFAULT.equals(unit);
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (type: ");
-		result.append(type);
-		result.append(", uID: ");
-		result.append(uID);
-		result.append(", start: ");
-		result.append(start);
-		result.append(", finish: ");
-		result.append(finish);
-		result.append(", unit: ");
-		result.append(unit);
-		result.append(", value: ");
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TimephasedDataTypeImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Value2Impl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Value2Impl.java
deleted file mode 100644
index c094493..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/Value2Impl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Value2Impl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Value2;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value2</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.Value2Impl#getID <em>ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Value2Impl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.Value2Impl#getDescription <em>Description</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class Value2Impl extends EObjectImpl implements Value2 {
-	/**
-	 * The default value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getID() <em>ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger iD = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String description = DESCRIPTION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Value2Impl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getValue2();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getID() {
-		return iD;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setID(BigInteger newID) {
-		BigInteger oldID = iD;
-		iD = newID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.VALUE2__ID, oldID, iD));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.VALUE2__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDescription(String newDescription) {
-		String oldDescription = description;
-		description = newDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.VALUE2__DESCRIPTION, oldDescription, description));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE2__ID:
-				return getID();
-			case MsprojectPackage.VALUE2__VALUE:
-				return getValue();
-			case MsprojectPackage.VALUE2__DESCRIPTION:
-				return getDescription();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE2__ID:
-				setID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.VALUE2__VALUE:
-				setValue((String)newValue);
-				return;
-			case MsprojectPackage.VALUE2__DESCRIPTION:
-				setDescription((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE2__ID:
-				setID(ID_EDEFAULT);
-				return;
-			case MsprojectPackage.VALUE2__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-			case MsprojectPackage.VALUE2__DESCRIPTION:
-				setDescription(DESCRIPTION_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE2__ID:
-				return ID_EDEFAULT == null ? iD != null : !ID_EDEFAULT.equals(iD);
-			case MsprojectPackage.VALUE2__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-			case MsprojectPackage.VALUE2__DESCRIPTION:
-				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (iD: ");
-		result.append(iD);
-		result.append(", value: ");
-		result.append(value);
-		result.append(", description: ");
-		result.append(description);
-		result.append(')');
-		return result.toString();
-	}
-
-} //Value2Impl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValueImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValueImpl.java
deleted file mode 100644
index b0e1dec..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValueImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValueImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Value;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ValueImpl#getValueID <em>Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ValueImpl#getParentValueID <em>Parent Value ID</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ValueImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ValueImpl#getDescription <em>Description</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueImpl extends EObjectImpl implements Value {
-	/**
-	 * The default value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger VALUE_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValueID() <em>Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger valueID = VALUE_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getParentValueID() <em>Parent Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParentValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger PARENT_VALUE_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getParentValueID() <em>Parent Value ID</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParentValueID()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger parentValueID = PARENT_VALUE_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String description = DESCRIPTION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getValueID() {
-		return valueID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueID(BigInteger newValueID) {
-		BigInteger oldValueID = valueID;
-		valueID = newValueID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.VALUE__VALUE_ID, oldValueID, valueID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getParentValueID() {
-		return parentValueID;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentValueID(BigInteger newParentValueID) {
-		BigInteger oldParentValueID = parentValueID;
-		parentValueID = newParentValueID;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.VALUE__PARENT_VALUE_ID, oldParentValueID, parentValueID));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.VALUE__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDescription(String newDescription) {
-		String oldDescription = description;
-		description = newDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.VALUE__DESCRIPTION, oldDescription, description));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE__VALUE_ID:
-				return getValueID();
-			case MsprojectPackage.VALUE__PARENT_VALUE_ID:
-				return getParentValueID();
-			case MsprojectPackage.VALUE__VALUE:
-				return getValue();
-			case MsprojectPackage.VALUE__DESCRIPTION:
-				return getDescription();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE__VALUE_ID:
-				setValueID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.VALUE__PARENT_VALUE_ID:
-				setParentValueID((BigInteger)newValue);
-				return;
-			case MsprojectPackage.VALUE__VALUE:
-				setValue((String)newValue);
-				return;
-			case MsprojectPackage.VALUE__DESCRIPTION:
-				setDescription((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE__VALUE_ID:
-				setValueID(VALUE_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.VALUE__PARENT_VALUE_ID:
-				setParentValueID(PARENT_VALUE_ID_EDEFAULT);
-				return;
-			case MsprojectPackage.VALUE__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-			case MsprojectPackage.VALUE__DESCRIPTION:
-				setDescription(DESCRIPTION_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE__VALUE_ID:
-				return VALUE_ID_EDEFAULT == null ? valueID != null : !VALUE_ID_EDEFAULT.equals(valueID);
-			case MsprojectPackage.VALUE__PARENT_VALUE_ID:
-				return PARENT_VALUE_ID_EDEFAULT == null ? parentValueID != null : !PARENT_VALUE_ID_EDEFAULT.equals(parentValueID);
-			case MsprojectPackage.VALUE__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-			case MsprojectPackage.VALUE__DESCRIPTION:
-				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (valueID: ");
-		result.append(valueID);
-		result.append(", parentValueID: ");
-		result.append(parentValueID);
-		result.append(", value: ");
-		result.append(value);
-		result.append(", description: ");
-		result.append(description);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValueImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValueListImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValueListImpl.java
deleted file mode 100644
index 58e77e3..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValueListImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValueListImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Value2;
-import org.eclipse.epf.msproject.ValueList;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value List</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ValueListImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueListImpl extends EObjectImpl implements ValueList {
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList value = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueListImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getValueList();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValue() {
-		if (value == null) {
-			value = new EObjectContainmentEList(Value2.class, this, MsprojectPackage.VALUE_LIST__VALUE);
-		}
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.VALUE_LIST__VALUE:
-					return ((InternalEList)getValue()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE_LIST__VALUE:
-				return getValue();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE_LIST__VALUE:
-				getValue().clear();
-				getValue().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE_LIST__VALUE:
-				getValue().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUE_LIST__VALUE:
-				return value != null && !value.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //ValueListImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValuesImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValuesImpl.java
deleted file mode 100644
index 4de8525..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/ValuesImpl.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ValuesImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.Values;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Values</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.ValuesImpl#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.ValuesImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValuesImpl extends EObjectImpl implements Values {
-	/**
-	 * The cached value of the '{@link #getGroup() <em>Group</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValuesImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getValues();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup() {
-		if (group == null) {
-			group = new BasicFeatureMap(this, MsprojectPackage.VALUES__GROUP);
-		}
-		return group;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValue() {
-		return ((FeatureMap)getGroup()).list(MsprojectPackage.eINSTANCE.getValues_Value());
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.VALUES__GROUP:
-					return ((InternalEList)getGroup()).basicRemove(otherEnd, msgs);
-				case MsprojectPackage.VALUES__VALUE:
-					return ((InternalEList)getValue()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUES__GROUP:
-				return getGroup();
-			case MsprojectPackage.VALUES__VALUE:
-				return getValue();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUES__GROUP:
-				getGroup().clear();
-				getGroup().addAll((Collection)newValue);
-				return;
-			case MsprojectPackage.VALUES__VALUE:
-				getValue().clear();
-				getValue().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUES__GROUP:
-				getGroup().clear();
-				return;
-			case MsprojectPackage.VALUES__VALUE:
-				getValue().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.VALUES__GROUP:
-				return group != null && !group.isEmpty();
-			case MsprojectPackage.VALUES__VALUE:
-				return !getValue().isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group: ");
-		result.append(group);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValuesImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WBSMaskImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WBSMaskImpl.java
deleted file mode 100644
index 765aa00..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WBSMaskImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WBSMaskImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.WBSMask;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>WBS Mask</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMaskImpl#getLevel <em>Level</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMaskImpl#getType <em>Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMaskImpl#getLength <em>Length</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMaskImpl#getSeparator <em>Separator</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WBSMaskImpl extends EObjectImpl implements WBSMask {
-	/**
-	 * The default value of the '{@link #getLevel() <em>Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger LEVEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLevel() <em>Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger level = LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger type = TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLength() <em>Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLength()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LENGTH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLength()
-	 * @generated
-	 * @ordered
-	 */
-	protected String length = LENGTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSeparator() <em>Separator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSeparator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SEPARATOR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSeparator() <em>Separator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSeparator()
-	 * @generated
-	 * @ordered
-	 */
-	protected String separator = SEPARATOR_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WBSMaskImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getWBSMask();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getLevel() {
-		return level;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevel(BigInteger newLevel) {
-		BigInteger oldLevel = level;
-		level = newLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WBS_MASK__LEVEL, oldLevel, level));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(BigInteger newType) {
-		BigInteger oldType = type;
-		type = newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WBS_MASK__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLength() {
-		return length;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLength(String newLength) {
-		String oldLength = length;
-		length = newLength;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WBS_MASK__LENGTH, oldLength, length));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSeparator() {
-		return separator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSeparator(String newSeparator) {
-		String oldSeparator = separator;
-		separator = newSeparator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WBS_MASK__SEPARATOR, oldSeparator, separator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASK__LEVEL:
-				return getLevel();
-			case MsprojectPackage.WBS_MASK__TYPE:
-				return getType();
-			case MsprojectPackage.WBS_MASK__LENGTH:
-				return getLength();
-			case MsprojectPackage.WBS_MASK__SEPARATOR:
-				return getSeparator();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASK__LEVEL:
-				setLevel((BigInteger)newValue);
-				return;
-			case MsprojectPackage.WBS_MASK__TYPE:
-				setType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.WBS_MASK__LENGTH:
-				setLength((String)newValue);
-				return;
-			case MsprojectPackage.WBS_MASK__SEPARATOR:
-				setSeparator((String)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASK__LEVEL:
-				setLevel(LEVEL_EDEFAULT);
-				return;
-			case MsprojectPackage.WBS_MASK__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.WBS_MASK__LENGTH:
-				setLength(LENGTH_EDEFAULT);
-				return;
-			case MsprojectPackage.WBS_MASK__SEPARATOR:
-				setSeparator(SEPARATOR_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASK__LEVEL:
-				return LEVEL_EDEFAULT == null ? level != null : !LEVEL_EDEFAULT.equals(level);
-			case MsprojectPackage.WBS_MASK__TYPE:
-				return TYPE_EDEFAULT == null ? type != null : !TYPE_EDEFAULT.equals(type);
-			case MsprojectPackage.WBS_MASK__LENGTH:
-				return LENGTH_EDEFAULT == null ? length != null : !LENGTH_EDEFAULT.equals(length);
-			case MsprojectPackage.WBS_MASK__SEPARATOR:
-				return SEPARATOR_EDEFAULT == null ? separator != null : !SEPARATOR_EDEFAULT.equals(separator);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (level: ");
-		result.append(level);
-		result.append(", type: ");
-		result.append(type);
-		result.append(", length: ");
-		result.append(length);
-		result.append(", separator: ");
-		result.append(separator);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WBSMaskImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WBSMasksImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WBSMasksImpl.java
deleted file mode 100644
index dcfd713..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WBSMasksImpl.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WBSMasksImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.WBSMask;
-import org.eclipse.epf.msproject.WBSMasks;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>WBS Masks</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMasksImpl#isVerifyUniqueCodes <em>Verify Unique Codes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMasksImpl#isGenerateCodes <em>Generate Codes</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMasksImpl#getPrefix <em>Prefix</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WBSMasksImpl#getWBSMask <em>WBS Mask</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WBSMasksImpl extends EObjectImpl implements WBSMasks {
-	/**
-	 * The default value of the '{@link #isVerifyUniqueCodes() <em>Verify Unique Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isVerifyUniqueCodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean VERIFY_UNIQUE_CODES_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isVerifyUniqueCodes() <em>Verify Unique Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isVerifyUniqueCodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean verifyUniqueCodes = VERIFY_UNIQUE_CODES_EDEFAULT;
-
-	/**
-	 * This is true if the Verify Unique Codes attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean verifyUniqueCodesESet = false;
-
-	/**
-	 * The default value of the '{@link #isGenerateCodes() <em>Generate Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isGenerateCodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean GENERATE_CODES_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isGenerateCodes() <em>Generate Codes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isGenerateCodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean generateCodes = GENERATE_CODES_EDEFAULT;
-
-	/**
-	 * This is true if the Generate Codes attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean generateCodesESet = false;
-
-	/**
-	 * The default value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrefix()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PREFIX_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrefix()
-	 * @generated
-	 * @ordered
-	 */
-	protected String prefix = PREFIX_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getWBSMask() <em>WBS Mask</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWBSMask()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList wBSMask = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WBSMasksImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getWBSMasks();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isVerifyUniqueCodes() {
-		return verifyUniqueCodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVerifyUniqueCodes(boolean newVerifyUniqueCodes) {
-		boolean oldVerifyUniqueCodes = verifyUniqueCodes;
-		verifyUniqueCodes = newVerifyUniqueCodes;
-		boolean oldVerifyUniqueCodesESet = verifyUniqueCodesESet;
-		verifyUniqueCodesESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WBS_MASKS__VERIFY_UNIQUE_CODES, oldVerifyUniqueCodes, verifyUniqueCodes, !oldVerifyUniqueCodesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetVerifyUniqueCodes() {
-		boolean oldVerifyUniqueCodes = verifyUniqueCodes;
-		boolean oldVerifyUniqueCodesESet = verifyUniqueCodesESet;
-		verifyUniqueCodes = VERIFY_UNIQUE_CODES_EDEFAULT;
-		verifyUniqueCodesESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.WBS_MASKS__VERIFY_UNIQUE_CODES, oldVerifyUniqueCodes, VERIFY_UNIQUE_CODES_EDEFAULT, oldVerifyUniqueCodesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetVerifyUniqueCodes() {
-		return verifyUniqueCodesESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isGenerateCodes() {
-		return generateCodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGenerateCodes(boolean newGenerateCodes) {
-		boolean oldGenerateCodes = generateCodes;
-		generateCodes = newGenerateCodes;
-		boolean oldGenerateCodesESet = generateCodesESet;
-		generateCodesESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WBS_MASKS__GENERATE_CODES, oldGenerateCodes, generateCodes, !oldGenerateCodesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetGenerateCodes() {
-		boolean oldGenerateCodes = generateCodes;
-		boolean oldGenerateCodesESet = generateCodesESet;
-		generateCodes = GENERATE_CODES_EDEFAULT;
-		generateCodesESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.WBS_MASKS__GENERATE_CODES, oldGenerateCodes, GENERATE_CODES_EDEFAULT, oldGenerateCodesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetGenerateCodes() {
-		return generateCodesESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrefix(String newPrefix) {
-		String oldPrefix = prefix;
-		prefix = newPrefix;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WBS_MASKS__PREFIX, oldPrefix, prefix));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getWBSMask() {
-		if (wBSMask == null) {
-			wBSMask = new EObjectContainmentEList(WBSMask.class, this, MsprojectPackage.WBS_MASKS__WBS_MASK);
-		}
-		return wBSMask;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.WBS_MASKS__WBS_MASK:
-					return ((InternalEList)getWBSMask()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASKS__VERIFY_UNIQUE_CODES:
-				return isVerifyUniqueCodes() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.WBS_MASKS__GENERATE_CODES:
-				return isGenerateCodes() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.WBS_MASKS__PREFIX:
-				return getPrefix();
-			case MsprojectPackage.WBS_MASKS__WBS_MASK:
-				return getWBSMask();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASKS__VERIFY_UNIQUE_CODES:
-				setVerifyUniqueCodes(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.WBS_MASKS__GENERATE_CODES:
-				setGenerateCodes(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.WBS_MASKS__PREFIX:
-				setPrefix((String)newValue);
-				return;
-			case MsprojectPackage.WBS_MASKS__WBS_MASK:
-				getWBSMask().clear();
-				getWBSMask().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASKS__VERIFY_UNIQUE_CODES:
-				unsetVerifyUniqueCodes();
-				return;
-			case MsprojectPackage.WBS_MASKS__GENERATE_CODES:
-				unsetGenerateCodes();
-				return;
-			case MsprojectPackage.WBS_MASKS__PREFIX:
-				setPrefix(PREFIX_EDEFAULT);
-				return;
-			case MsprojectPackage.WBS_MASKS__WBS_MASK:
-				getWBSMask().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WBS_MASKS__VERIFY_UNIQUE_CODES:
-				return isSetVerifyUniqueCodes();
-			case MsprojectPackage.WBS_MASKS__GENERATE_CODES:
-				return isSetGenerateCodes();
-			case MsprojectPackage.WBS_MASKS__PREFIX:
-				return PREFIX_EDEFAULT == null ? prefix != null : !PREFIX_EDEFAULT.equals(prefix);
-			case MsprojectPackage.WBS_MASKS__WBS_MASK:
-				return wBSMask != null && !wBSMask.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (verifyUniqueCodes: ");
-		if (verifyUniqueCodesESet) result.append(verifyUniqueCodes); else result.append("<unset>");
-		result.append(", generateCodes: ");
-		if (generateCodesESet) result.append(generateCodes); else result.append("<unset>");
-		result.append(", prefix: ");
-		result.append(prefix);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WBSMasksImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WeekDayImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WeekDayImpl.java
deleted file mode 100644
index ace49c0..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WeekDayImpl.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WeekDayImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import java.math.BigInteger;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.TimePeriod;
-import org.eclipse.epf.msproject.WeekDay;
-import org.eclipse.epf.msproject.WorkingTimes;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Week Day</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.WeekDayImpl#getDayType <em>Day Type</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WeekDayImpl#isDayWorking <em>Day Working</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WeekDayImpl#getTimePeriod <em>Time Period</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WeekDayImpl#getWorkingTimes <em>Working Times</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WeekDayImpl extends EObjectImpl implements WeekDay {
-	/**
-	 * The default value of the '{@link #getDayType() <em>Day Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDayType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final BigInteger DAY_TYPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDayType() <em>Day Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDayType()
-	 * @generated
-	 * @ordered
-	 */
-	protected BigInteger dayType = DAY_TYPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isDayWorking() <em>Day Working</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDayWorking()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean DAY_WORKING_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isDayWorking() <em>Day Working</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isDayWorking()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean dayWorking = DAY_WORKING_EDEFAULT;
-
-	/**
-	 * This is true if the Day Working attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean dayWorkingESet = false;
-
-	/**
-	 * The cached value of the '{@link #getTimePeriod() <em>Time Period</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTimePeriod()
-	 * @generated
-	 * @ordered
-	 */
-	protected TimePeriod timePeriod = null;
-
-	/**
-	 * The cached value of the '{@link #getWorkingTimes() <em>Working Times</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkingTimes()
-	 * @generated
-	 * @ordered
-	 */
-	protected WorkingTimes workingTimes = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WeekDayImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getWeekDay();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BigInteger getDayType() {
-		return dayType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDayType(BigInteger newDayType) {
-		BigInteger oldDayType = dayType;
-		dayType = newDayType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WEEK_DAY__DAY_TYPE, oldDayType, dayType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isDayWorking() {
-		return dayWorking;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDayWorking(boolean newDayWorking) {
-		boolean oldDayWorking = dayWorking;
-		dayWorking = newDayWorking;
-		boolean oldDayWorkingESet = dayWorkingESet;
-		dayWorkingESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WEEK_DAY__DAY_WORKING, oldDayWorking, dayWorking, !oldDayWorkingESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetDayWorking() {
-		boolean oldDayWorking = dayWorking;
-		boolean oldDayWorkingESet = dayWorkingESet;
-		dayWorking = DAY_WORKING_EDEFAULT;
-		dayWorkingESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, MsprojectPackage.WEEK_DAY__DAY_WORKING, oldDayWorking, DAY_WORKING_EDEFAULT, oldDayWorkingESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetDayWorking() {
-		return dayWorkingESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TimePeriod getTimePeriod() {
-		return timePeriod;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTimePeriod(TimePeriod newTimePeriod, NotificationChain msgs) {
-		TimePeriod oldTimePeriod = timePeriod;
-		timePeriod = newTimePeriod;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.WEEK_DAY__TIME_PERIOD, oldTimePeriod, newTimePeriod);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTimePeriod(TimePeriod newTimePeriod) {
-		if (newTimePeriod != timePeriod) {
-			NotificationChain msgs = null;
-			if (timePeriod != null)
-				msgs = ((InternalEObject)timePeriod).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.WEEK_DAY__TIME_PERIOD, null, msgs);
-			if (newTimePeriod != null)
-				msgs = ((InternalEObject)newTimePeriod).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.WEEK_DAY__TIME_PERIOD, null, msgs);
-			msgs = basicSetTimePeriod(newTimePeriod, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WEEK_DAY__TIME_PERIOD, newTimePeriod, newTimePeriod));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkingTimes getWorkingTimes() {
-		return workingTimes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetWorkingTimes(WorkingTimes newWorkingTimes, NotificationChain msgs) {
-		WorkingTimes oldWorkingTimes = workingTimes;
-		workingTimes = newWorkingTimes;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MsprojectPackage.WEEK_DAY__WORKING_TIMES, oldWorkingTimes, newWorkingTimes);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkingTimes(WorkingTimes newWorkingTimes) {
-		if (newWorkingTimes != workingTimes) {
-			NotificationChain msgs = null;
-			if (workingTimes != null)
-				msgs = ((InternalEObject)workingTimes).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.WEEK_DAY__WORKING_TIMES, null, msgs);
-			if (newWorkingTimes != null)
-				msgs = ((InternalEObject)newWorkingTimes).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MsprojectPackage.WEEK_DAY__WORKING_TIMES, null, msgs);
-			msgs = basicSetWorkingTimes(newWorkingTimes, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WEEK_DAY__WORKING_TIMES, newWorkingTimes, newWorkingTimes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.WEEK_DAY__TIME_PERIOD:
-					return basicSetTimePeriod(null, msgs);
-				case MsprojectPackage.WEEK_DAY__WORKING_TIMES:
-					return basicSetWorkingTimes(null, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAY__DAY_TYPE:
-				return getDayType();
-			case MsprojectPackage.WEEK_DAY__DAY_WORKING:
-				return isDayWorking() ? Boolean.TRUE : Boolean.FALSE;
-			case MsprojectPackage.WEEK_DAY__TIME_PERIOD:
-				return getTimePeriod();
-			case MsprojectPackage.WEEK_DAY__WORKING_TIMES:
-				return getWorkingTimes();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAY__DAY_TYPE:
-				setDayType((BigInteger)newValue);
-				return;
-			case MsprojectPackage.WEEK_DAY__DAY_WORKING:
-				setDayWorking(((Boolean)newValue).booleanValue());
-				return;
-			case MsprojectPackage.WEEK_DAY__TIME_PERIOD:
-				setTimePeriod((TimePeriod)newValue);
-				return;
-			case MsprojectPackage.WEEK_DAY__WORKING_TIMES:
-				setWorkingTimes((WorkingTimes)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAY__DAY_TYPE:
-				setDayType(DAY_TYPE_EDEFAULT);
-				return;
-			case MsprojectPackage.WEEK_DAY__DAY_WORKING:
-				unsetDayWorking();
-				return;
-			case MsprojectPackage.WEEK_DAY__TIME_PERIOD:
-				setTimePeriod((TimePeriod)null);
-				return;
-			case MsprojectPackage.WEEK_DAY__WORKING_TIMES:
-				setWorkingTimes((WorkingTimes)null);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAY__DAY_TYPE:
-				return DAY_TYPE_EDEFAULT == null ? dayType != null : !DAY_TYPE_EDEFAULT.equals(dayType);
-			case MsprojectPackage.WEEK_DAY__DAY_WORKING:
-				return isSetDayWorking();
-			case MsprojectPackage.WEEK_DAY__TIME_PERIOD:
-				return timePeriod != null;
-			case MsprojectPackage.WEEK_DAY__WORKING_TIMES:
-				return workingTimes != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (dayType: ");
-		result.append(dayType);
-		result.append(", dayWorking: ");
-		if (dayWorkingESet) result.append(dayWorking); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //WeekDayImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WeekDaysImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WeekDaysImpl.java
deleted file mode 100644
index 2c0bdaa..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WeekDaysImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WeekDaysImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.WeekDay;
-import org.eclipse.epf.msproject.WeekDays;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Week Days</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.WeekDaysImpl#getWeekDay <em>Week Day</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WeekDaysImpl extends EObjectImpl implements WeekDays {
-	/**
-	 * The cached value of the '{@link #getWeekDay() <em>Week Day</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWeekDay()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList weekDay = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WeekDaysImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getWeekDays();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getWeekDay() {
-		if (weekDay == null) {
-			weekDay = new EObjectContainmentEList(WeekDay.class, this, MsprojectPackage.WEEK_DAYS__WEEK_DAY);
-		}
-		return weekDay;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.WEEK_DAYS__WEEK_DAY:
-					return ((InternalEList)getWeekDay()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAYS__WEEK_DAY:
-				return getWeekDay();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAYS__WEEK_DAY:
-				getWeekDay().clear();
-				getWeekDay().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAYS__WEEK_DAY:
-				getWeekDay().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WEEK_DAYS__WEEK_DAY:
-				return weekDay != null && !weekDay.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //WeekDaysImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WorkingTimeImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WorkingTimeImpl.java
deleted file mode 100644
index 0ca56c0..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WorkingTimeImpl.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkingTimeImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.WorkingTime;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Working Time</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.WorkingTimeImpl#getFromTime <em>From Time</em>}</li>
- *   <li>{@link org.eclipse.epf.msproject.impl.WorkingTimeImpl#getToTime <em>To Time</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkingTimeImpl extends EObjectImpl implements WorkingTime {
-	/**
-	 * The default value of the '{@link #getFromTime() <em>From Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FROM_TIME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFromTime() <em>From Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object fromTime = FROM_TIME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getToTime() <em>To Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object TO_TIME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getToTime() <em>To Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object toTime = TO_TIME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkingTimeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getWorkingTime();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFromTime() {
-		return fromTime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromTime(Object newFromTime) {
-		Object oldFromTime = fromTime;
-		fromTime = newFromTime;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WORKING_TIME__FROM_TIME, oldFromTime, fromTime));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getToTime() {
-		return toTime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setToTime(Object newToTime) {
-		Object oldToTime = toTime;
-		toTime = newToTime;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MsprojectPackage.WORKING_TIME__TO_TIME, oldToTime, toTime));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIME__FROM_TIME:
-				return getFromTime();
-			case MsprojectPackage.WORKING_TIME__TO_TIME:
-				return getToTime();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIME__FROM_TIME:
-				setFromTime((Object)newValue);
-				return;
-			case MsprojectPackage.WORKING_TIME__TO_TIME:
-				setToTime((Object)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIME__FROM_TIME:
-				setFromTime(FROM_TIME_EDEFAULT);
-				return;
-			case MsprojectPackage.WORKING_TIME__TO_TIME:
-				setToTime(TO_TIME_EDEFAULT);
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIME__FROM_TIME:
-				return FROM_TIME_EDEFAULT == null ? fromTime != null : !FROM_TIME_EDEFAULT.equals(fromTime);
-			case MsprojectPackage.WORKING_TIME__TO_TIME:
-				return TO_TIME_EDEFAULT == null ? toTime != null : !TO_TIME_EDEFAULT.equals(toTime);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (fromTime: ");
-		result.append(fromTime);
-		result.append(", toTime: ");
-		result.append(toTime);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkingTimeImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WorkingTimesImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WorkingTimesImpl.java
deleted file mode 100644
index cff24e6..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/WorkingTimesImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkingTimesImpl.java,v 1.1 2008/01/15 08:51:53 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.EStructuralFeature;
-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.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.WorkingTime;
-import org.eclipse.epf.msproject.WorkingTimes;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Working Times</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.msproject.impl.WorkingTimesImpl#getWorkingTime <em>Working Time</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkingTimesImpl extends EObjectImpl implements WorkingTimes {
-	/**
-	 * The cached value of the '{@link #getWorkingTime() <em>Working Time</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkingTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList workingTime = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkingTimesImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return MsprojectPackage.eINSTANCE.getWorkingTimes();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getWorkingTime() {
-		if (workingTime == null) {
-			workingTime = new EObjectContainmentEList(WorkingTime.class, this, MsprojectPackage.WORKING_TIMES__WORKING_TIME);
-		}
-		return workingTime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-				case MsprojectPackage.WORKING_TIMES__WORKING_TIME:
-					return ((InternalEList)getWorkingTime()).basicRemove(otherEnd, msgs);
-				default:
-					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIMES__WORKING_TIME:
-				return getWorkingTime();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIMES__WORKING_TIME:
-				getWorkingTime().clear();
-				getWorkingTime().addAll((Collection)newValue);
-				return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIMES__WORKING_TIME:
-				getWorkingTime().clear();
-				return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-			case MsprojectPackage.WORKING_TIMES__WORKING_TIME:
-				return workingTime != null && !workingTime.isEmpty();
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-} //WorkingTimesImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/msproject.ecore b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/msproject.ecore
deleted file mode 100644
index c1ebd22..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/msproject.ecore
+++ /dev/null
@@ -1,5511 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="msproject"
-    nsURI="http://epf.eclipse.org/msproject" nsPrefix="msproject">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="The full project schema definition from the project level down, &#xD;&#xA;&#x9;&#x9;starting with data type definitions."/>
-  </eAnnotations>
-  <eAnnotations>
-    <details key="appinfo" value="The Microsoft Project Data Interchange Schema for Microsoft Project 10.&#xD;&#xA;&#x9;&#x9;"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EDataType" name="AccrueAt" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="AccrueAt_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ActiveDirectoryGUIDType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ActiveDirectoryGUID_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="16"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="AliasType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Alias_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="50"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Assignment">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Assignment_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="taskUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the task.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TaskUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resourceUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the resource.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResourceUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentWorkComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of work completed on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentWorkComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual finish date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime cost incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual amount of overtime work incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual start date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual amount of work incurred on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of work performed on the assignment to-date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ACWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="confirmed" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the Resource has accepted all of his or her assignments.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Confirmed"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected or scheduled cost of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costRateTable" unique="false"
-        eType="#//CostRateTableType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The cost rate table used for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostRateTable"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between the cost and baseline cost for a resource.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value cost variance.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="delay" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount that the assignment is delayed.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Delay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the assignment finish date from the baseline finish date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FinishVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlink" unique="false"
-        eType="#//HyperlinkType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the hyperlink associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Hyperlink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkAddress" unique="false"
-        eType="#//HyperlinkAddressType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The hyperlink associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkSubAddress" unique="false"
-        eType="#//HyperlinkSubAddressType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The document bookmark of the hyperlink associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkSubAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of assignment work from the baseline work as minutes x 1000.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hasFixedRateUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the Units are Fixed Rate.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HasFixedRateUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fixedMaterial" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the consumption of the assigned material resource occurs in a single, fixed amount.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FixedMaterial"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelay" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The delay caused by leveling.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelayFormat" unique="false"
-        eType="#//LevelingDelayFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the duration of the delay.  &#xD;&#xA;                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 21=null, &#xD;&#xA;                            35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelayFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkedFields" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the Project is linked to another OLE object.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LinkedFields"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="milestone" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the assignment is a milestone.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Milestone"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notes" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Text notes associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Notes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overallocated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the assignment is overallocated.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Overallocated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The sum of the actual and remaining overtime cost of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled overtime work scheduled for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="regularWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of non-overtime work scheduled for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RegularWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected cost of completing the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeCost"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected overtime cost of completing the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeWork"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining overtime work scheduled to complete the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining work scheduled to complete the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="responsePending" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="True if a response has not been received for a TeamAssign message. &#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResponsePending"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="stop" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the assignment was stopped.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Stop"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resume" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the assignment resumed.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resume"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the assignment start date from the baseline start date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StartVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="units" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of units for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Units"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="updateNeeded" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="True if the resource assigned to a task needs to be updated as to the status of the task.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UpdateNeeded"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="vAC" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between basline cost and total cost.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="VAC"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of scheduled work for the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workContour" unique="false"
-        eType="#//WorkContourType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The work contour of the assignment. &#xD;&#xA;                            Values are: 0=Flat, 1=Back Loaded, 2=Front Loaded, 3=Double Peak, 4=Early Peak, 5=Late Peak, &#xD;&#xA;                            6=Bell, 7=Turtle, 8=Contoured&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkContour"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work on the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the assignment to-date.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookingType" unique="false"
-        eType="#//BookingTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the booking type of the assignment. 1=Commited, 2=Proposed&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BookingType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWorkProtected" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual work is protected.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWorkProtected"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual overtime work is protected.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="creationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the assignment was created."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute4" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an extended attribute.  Two pieces of data are necessary - &#xD;&#xA;                            a pointer back to the extended attribute table which is specified either by the unique ID or the &#xD;&#xA;                            Field ID, and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseline" upperBound="-1"
-        eType="#//Baseline3" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of baseline values associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Baseline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data associated with the assignment.&#xD;&#xA;                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Assignments">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Assignments_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assignment" upperBound="-1"
-        eType="#//Assignment" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="There must be at least one assignment in each Assignments collection.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Assignment"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="AuthorType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Author_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AvailabilityPeriod">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="AvailabilityPeriod_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableFrom" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the resource becomes available for the specified period.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableFrom"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableTo" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The last date that the resource is available for the specified period.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableTo"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage that the resource is available during the specified period.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AvailabilityPeriods">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="AvailabilityPeriods_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="availabilityPeriod" upperBound="-1"
-        eType="#//AvailabilityPeriod" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The period the resource is available.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailabilityPeriod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Baseline">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Baseline_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data block associated with the task baseline.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique number of the baseline data record.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Number"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="interim" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether this is an Interim Baseline.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Interim"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="duration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled duration of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Duration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the Duration of the Task baseline.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, &#xD;&#xA;                                            21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, &#xD;&#xA;                                            51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimatedDuration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the baseline duration of the task was estimated.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EstimatedDuration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled work of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected cost of the task when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work scheduled for the task.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the task to-date.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Baseline2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Baseline_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique number of the baseline data record.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Number"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The work assigned the resource when the baseline is saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected cost for the resource when the baseline was saved.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budget cost of work scheduled for the resource.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of of the work performed by the resource for the project to-date.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Baseline3">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Baseline_._2_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data associated with the Baseline.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="number" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique number of the baseline data record.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Number"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total amount of work scheduled on the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total projected cost of the assignment when the baseline was saved.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work on the assignment.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the assignment to-date.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="BaselineForEarnedValueType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BaselineForEarnedValue_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7 8 9 10"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="BookingTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BookingType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="BookingTypeType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BookingType_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CalculationTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CalculationType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Calendar">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Calendar_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the calendar."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isBaseCalendar" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the calendar is a base calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsBaseCalendar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="baseCalendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the base calendar &#xD;&#xA;                                on which this calendar depends. Only applicable if the calendar is &#xD;&#xA;                                not a base calendar."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BaseCalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="weekDays" eType="#//WeekDays"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of Weekdays that defines this calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WeekDays"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Calendars">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Calendars_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="calendar" lowerBound="1"
-        upperBound="-1" eType="#//Calendar" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Calendars are used to define standard working and &#xD;&#xA;                    non-working times. Projects must have one base calendar. Tasks and resources &#xD;&#xA;                    may have their own non-base calendars which are based on a base calendar.&#xD;&#xA;                    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Calendar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CategoryType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Category_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CodeType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Code_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CompanyType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Company_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ConstraintTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ConstraintType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ContactType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Contact_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CostRateTableType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CostRateTable_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CurrencySymbolPositionType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CurrencySymbolPosition_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="CurrencySymbolType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CurrencySymbol_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="20"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DayTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DayType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DefaultFixedCostAccrualType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DefaultFixedCostAccrual_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DefaultTaskEVMethodType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DefaultTaskEVMethod_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DefaultTaskTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DefaultTaskType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value=""/>
-      <details key="kind" value="mixed"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="name" value=":mixed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns:prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xsi:schemaLocation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="project" upperBound="-2"
-        eType="#//Project" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The project is the top level element of the document.&#xD;&#xA;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Project"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType2" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType3" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._3_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType4" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._4_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="DurationFormatType5" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DurationFormat_._5_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="EarnedValueMethodType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EarnedValueMethod_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="EarnedValueMethodType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EarnedValueMethod_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="EmailAddressType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EmailAddress_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This corresponds to the PID of the custom field.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the custom field."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alias" unique="false" eType="#//AliasType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The alias of the custom field"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Alias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="phoneticAlias" unique="false"
-        eType="#//PhoneticAliasType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The phonetic pronunciation of the alias of the &#xD;&#xA;                                custom field"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PhoneticAlias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rollupType" unique="false"
-        eType="#//RollupTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How rollups are calculated. Values are: 0=Maximum &#xD;&#xA;                                (OR for flag fields), 1=Minimum (AND for flag fields), 2=Count all, 3=Sum, &#xD;&#xA;                                4=Average, 5=Average First Sublevel, 6=Count First Sublevel, 7=Count &#xD;&#xA;                                Nonsummaries"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RollupType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calculationType" unique="false"
-        eType="#//CalculationTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether rollups are calculated for task and group summary rows. &#xD;&#xA;                                Values are: 0=None, 1=Rollup, 2=Calculation"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalculationType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="formula" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The formula that Microsoft Project uses to populate the &#xD;&#xA;                                custom task field."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Formula"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="restrictValues" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If RestrictValues=True then only values in the list are &#xD;&#xA;                                allowed in the file"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RestrictValues"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valuelistSortOrder" unique="false"
-        eType="#//ValuelistSortOrderType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How value lists are sorted. Values are: &#xD;&#xA;                                0=Descending, 1=Ascending"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValuelistSortOrder"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="appendNewValues" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If AppendNewValues=True then any new values added in a project &#xD;&#xA;                                are automatically appended to the list."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AppendNewValues"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="default" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This points to the default value in the list. &#xD;&#xA;                                Not present if no default is set."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Default"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueList" eType="#//ValueList"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="When values of extended attributes are specified as &#xD;&#xA;                                properties of elements in the schema, they may either be specified by values &#xD;&#xA;                                or by references to the values contained in this list.  Applications may &#xD;&#xA;                                assume ordering of the list by ordering specified here."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueList"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the extended attribute collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The PID of the custom field.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value of the extended attribute.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The ID of the value in the extended attribut lookup table.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, &#xD;&#xA;                                            19=%, 20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, &#xD;&#xA;                                            42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute3">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._2_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the extended attribute collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The PID of the custom field.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value of the extended attribute.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The ID of the value in the extended attribut lookup table.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType3">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                            20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, &#xD;&#xA;                                            43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttribute4">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttribute_._3_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the extended attribute collection.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The field ID in the localised language.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value of the extended attribute.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The ID of the value in the extended attribut lookup table.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  &#xD;&#xA;                                        Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, &#xD;&#xA;                                        21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, &#xD;&#xA;                                        51=%?, 52=e%? and 53=null.&#xD;&#xA;                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtendedAttributes">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExtendedAttributes_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Each of the individual entries in the extended attributes definition &#xD;&#xA;                    collection.  There are no limits to the number of children that may appear, but project &#xD;&#xA;                    will only understand Flag1-Flag10, etc.  This must appear once in each ExtendedAttributes &#xD;&#xA;                    collection."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ExternalTaskProjectType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ExternalTaskProject_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="FixedCostAccrualType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="FixedCostAccrual_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="enumeration" value="1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="FYStartDateType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="FYStartDate_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 6 7 8 9 10 11 12"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="GroupType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Group_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkAddressType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkAddress_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkAddressType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkAddress_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkAddressType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkAddress_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkSubAddressType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkSubAddress_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkSubAddressType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkSubAddress_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkSubAddressType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="HyperlinkSubAddress_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Hyperlink_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Hyperlink_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="HyperlinkType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Hyperlink_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="InitialsType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Initials_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="LagFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="LagFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="LevelingDelayFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="LevelingDelayFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="LevelingDelayFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="LevelingDelayFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="3 4 5 6 7 8 9 10 11 12 19 20 21 35 36 37 38 39 40 41 42 43 44 51 52 53"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ManagerType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Manager_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Mask">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Mask_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="level" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The level of the mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Level"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType5">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of mask. Values are: 0=Numbers, 1=Upper Case Letters, 2=Lower Case Letters, 3=Characters"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="length" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The maximum length in characters of the outline code values.  If length is any, the value is zero."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Length"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="separator" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The separator value of the code values."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Separator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Masks">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Masks_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mask" upperBound="-1" eType="#//Mask"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The four elements of the mask constitute the format in which the outline code must appear."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Mask"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="MaterialLabelType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MaterialLabel_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType1" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType2" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NameType3" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Name_._3_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="255"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NewTaskStartDateType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="NewTaskStartDate_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="NTAccountType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="NTAccount_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCode">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCode_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Coresponds to the field number of outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alias" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The alias of the custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Alias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="phoneticAlias" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The phonetic pronunciation of the alias of the custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PhoneticAlias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="values" eType="#//Values"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The values of the table associated with this outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Values"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enterprise" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Indicates whether the custom outline code is an enterprise custom outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Enterprise"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="enterpriseOutlineCodeAlias"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to another custom field for which this is an alias."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EnterpriseOutlineCodeAlias"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resourceSubstitutionEnabled"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the custom outline code can be used by the Resource Substitution Wizard in Microsoft Project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResourceSubstitutionEnabled"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="leafOnly" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether or not values specified in this outline code field must be leaf values."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LeafOnly"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="allLevelsRequired" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="New codes must have all levels present.  Not available for Enterprise Codes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AllLevelsRequired"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="onlyTableValuesAllowed"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether values specified must come from values table."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OnlyTableValuesAllowed"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="masks" eType="#//Masks"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The table of entries that define the outline code mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Masks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCode2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCode_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the outline code collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The field ID in the localised language.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID in the value list associated with the definition in the &#xD;&#xA;                                            outline code collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCode3">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCode_._2_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the value in the outline code collection.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fieldID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The field ID in the localised language.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FieldID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID in the value list associated with the definition &#xD;&#xA;                                            in the outline code collection."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OutlineCodes">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineCodes_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCode" upperBound="-1"
-        eType="#//OutlineCode" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The individual outline codes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCode"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="OutlineNumberType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OutlineNumber_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="OvertimeRateFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OvertimeRateFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="OvertimeRateFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="OvertimeRateFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="PhoneticAliasType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="PhoneticAlias_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="50"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="PhoneticsType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Phonetics_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PredecessorLink">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="PredecessorLink_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="predecessorUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the predecessor task.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PredecessorUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The link type.  Values are 0=FF, 1=FS, 2=SF and 3=SS&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="crossProject" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the predecessor is part of another project.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CrossProject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="crossProjectName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The external predecessor project.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CrossProjectName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkLag" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of lag in tenths of a minute.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LinkLag"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lagFormat" unique="false"
-        eType="#//LagFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the lag format.  &#xD;&#xA;                                            Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                            20=e%, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, &#xD;&#xA;                                            44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LagFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="PrefixType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Prefix_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="50"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Project">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Project_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" eType="#//UIDType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType3">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="title" unique="false" eType="#//TitleType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Title"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="subject" unique="false"
-        eType="#//SubjectType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The subject of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Subject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="category" unique="false"
-        eType="#//CategoryType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The category of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Category"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="company" unique="false"
-        eType="#//CompanyType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The company that owns the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Company"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="manager" unique="false"
-        eType="#//ManagerType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The manager of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="author" unique="false"
-        eType="#//AuthorType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The author of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Author"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="creationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the project was created."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="revision" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of times a project has been saved."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Revision"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lastSaved" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the project was last saved."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LastSaved"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scheduleFromStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project is schduled from the start date or finish date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ScheduleFromStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The start date of the project. Required if ScheduleFromStart is true.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StartDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The finish date of the project. Required if ScheduleFromStart is false.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FinishDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fYStartDate" unique="false"
-        eType="#//FYStartDateType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Fiscal Year starting month. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;1=January, 2=February, 3=March, 4=April, 5=May, 6=June, 7=July, &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;8=August, 9=September, 10=October, 11=November, 12=December "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FYStartDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="criticalSlackLimit" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of days past its end date that a task can go &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;before Microsoft Project marks that task as a critical task."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CriticalSlackLimit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currencyDigits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of digits after the decimal symbol."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrencyDigits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currencySymbol" unique="false"
-        eType="#//CurrencySymbolType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The currency symbol used in the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrencySymbol"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currencySymbolPosition"
-        unique="false" eType="#//CurrencySymbolPositionType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The position of the currency symbol.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Before, 1=After, 2=Before With Space, 3=After with space."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrencySymbolPosition"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The project calendar.  Refers to a valid UID in the &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Calendars element of the Microsoft Project XML Schema."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultStartTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default start time of new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultStartTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultFinishTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default finish time of new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultFinishTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minutesPerDay" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of minutes per day."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MinutesPerDay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minutesPerWeek" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of minutes per week."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MinutesPerWeek"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="daysPerMonth" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The number of days per month."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DaysPerMonth"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultTaskType" unique="false"
-        eType="#//DefaultTaskTypeType" defaultValueLiteral="1" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default type of new tasks. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Fixed Units, 1=Fixed Duration, 2=Fixed Work."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultTaskType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultFixedCostAccrual"
-        unique="false" eType="#//DefaultFixedCostAccrualType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default from where fixed costs are accrued.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;1=Start, 2=Prorated, 3=End"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultFixedCostAccrual"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultStandardRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default standard rate for new resources."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultStandardRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultOvertimeRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default overtime rate for new resources."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultOvertimeRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType5">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the bulk duration.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, 20=e%, 21=null, &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, 43=mo?, 44=emo?, 51=%?, 52=e%? and &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;53=null."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workFormat" unique="false"
-        eType="#//WorkFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default work unit format. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;1=m, 2=h, 3=d, 4=w, 5=mo"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="editableActualCosts" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether or not actual costs are editable."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EditableActualCosts"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="honorConstraints" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether tasks honour their constraint dates."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HonorConstraints"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earnedValueMethod" unique="false"
-        eType="#//EarnedValueMethodType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default method for calculating earned value. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Percent Complete, 1=Physical Percent Complete"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarnedValueMethod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="insertedProjectsLikeSummary"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to calculate subtasks as summary tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="InsertedProjectsLikeSummary"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="multipleCriticalPaths"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether multiple critical paths are calculated."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MultipleCriticalPaths"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="newTasksEffortDriven" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether new tasks are effort driven."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NewTasksEffortDriven"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="newTasksEstimated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to show the estimated duration by default."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NewTasksEstimated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="splitsInProgressTasks"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether in-progress tasks can be split."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SplitsInProgressTasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="spreadActualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether actual costs are spread to the status date."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SpreadActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="spreadPercentComplete"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether percent complete is spread to the status date."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SpreadPercentComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="taskUpdatesResource" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether updates to tasks update resources."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TaskUpdatesResource"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fiscalYearStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether to use fiscal year numbering"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FiscalYearStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="weekStartDay" unique="false"
-        eType="#//WeekStartDayType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Start day of the week. Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Sunday, 1=Monday, 2=Tuesday, 3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WeekStartDay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveCompletedEndsBack"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the end of completed portions of tasks scheduled to begin after the &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;status date but begun early should be moved back to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveCompletedEndsBack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveRemainingStartsBack"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the beginning of remaining portions of tasks scheduled to begin after the &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;status date but begun early should be moved back to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveRemainingStartsBack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveRemainingStartsForward"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the beginning of remaining portions of tasks scheduled to have begun late &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;should be moved up to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveRemainingStartsForward"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="moveCompletedEndsForward"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;Specifies whether the end of completed portions of tasks scheduled to have been completed &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;before the status date but begun late should be moved up to the status date.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MoveCompletedEndsForward"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="baselineForEarnedValue"
-        unique="false" eType="#//BaselineForEarnedValueType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The specific baseline used to calculate Variance values.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Baseline, 1=Baseline 1, 2=Baseline 2, 3=Baseline 3, 4=Baseline 4, 5=Baseline 5, 6=Baseline 6, &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;7=Baseline 7, 8=Baseline 8, 9=Baseline 9, 10=Baseline 10"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BaselineForEarnedValue"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="autoAddNewResourcesAndTasks"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="true" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to automatically add new resources to the resource pool."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AutoAddNewResourcesAndTasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="statusDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Date used for calculation and reporting."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StatusDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="currentDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The system date that the XML was generated."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CurrentDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="microsoftProjectServerURL"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project was created by a Project Server user as opposed to an NT user.&#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MicrosoftProjectServerURL"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="autolink" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to autolink inserted or moved tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Autolink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="newTaskStartDate" unique="false"
-        eType="#//NewTaskStartDateType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default date for new tasks start.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Project Start Date, 1=Current Date"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NewTaskStartDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultTaskEVMethod" unique="false"
-        eType="#//DefaultTaskEVMethodType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default earned value method for tasks.  Values are: &#xD;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;0=Percent Complete, 1=Physical Percent Complete"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultTaskEVMethod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectExternallyEdited"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project XML was edited."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ProjectExternallyEdited"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="extendedCreationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Date used for calculation and reporting."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedCreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualsInSync" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether all actual work has been synchronized with the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualsInSync"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="removeFileProperties" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether to remove all file properties on save."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemoveFileProperties"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="adminProject" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the project is an administrative project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AdminProject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCodes" eType="#//OutlineCodes"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of outline code definitions associated with the project.  These codes may be associated only with this project, or may be common among several projects (enterprise codes)."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCodes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="wBSMasks" eType="#//WBSMasks"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The table of entries that define the outline code mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBSMasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttributes" eType="#//ExtendedAttributes"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of extended attribute (custom field) definitions &#xD;&#xA;        associated with the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttributes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="calendars" eType="#//Calendars"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of calendars that is associated with the &#xD;&#xA;        project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Calendars"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tasks" eType="#//Tasks"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of tasks that make up the project.&#xD;&#xA;        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Tasks"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resources" eType="#//Resources"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of resources that make up the project.&#xD;&#xA;        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resources"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" eType="#//Assignments"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of assignments that make up the project.&#xD;&#xA;    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Assignments"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Rate">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Rate_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ratesFrom" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the rate becomes effective.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RatesFrom"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ratesTo" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The last date that the rate is effective.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RatesTo"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rateTable" unique="false"
-        eType="#//RateTableType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the rate table for the resource. &#xD;&#xA;                                                        Values are: 0=A, 1=B, 2=C, 3=D, 4=E"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RateTable"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The standard rate for the resource for the period specified.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRateFormat" unique="false"
-        eType="#//StandardRateFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the standard rate.  &#xD;&#xA;                                                        1=m, 2=h, 3=d, 4=w, 5=mo, 7=y&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The overtime rate for the resource for the period specified.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRateFormat" unique="false"
-        eType="#//OvertimeRateFormatType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the overtime rate.  &#xD;&#xA;                                                        1=m, 2=h, 3=d, 4=w, 5=mo, 7=y"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costPerUse" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The cost per use of the resource. &#xD;&#xA;                                                        This value is as of the current date if a rate table exists for the resource.&#xD;&#xA;                                                        "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostPerUse"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Rates">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Rates_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rate" upperBound="25" eType="#//Rate"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The definition of a time period, and the rates applicable for &#xD;&#xA;                                            the resource during that period."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Rate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="RateTableType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RateTable_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Resource">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Resource_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="iD" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The position identifier of the resource within the list of resources.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType4">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of resource. Values are: 0=Material, 1=Work&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isNull" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsNull"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="initials" unique="false"
-        eType="#//InitialsType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The initials of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Initials"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="phonetics" unique="false"
-        eType="#//PhoneticsType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The phonetic spelling of the resource name.  &#xD;&#xA;                                For use with Japanese only.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Phonetics"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nTAccount" unique="false"
-        eType="#//NTAccountType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The NT account associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="NTAccount"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="materialLabel" unique="false"
-        eType="#//MaterialLabelType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unit of measure for the material resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MaterialLabel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="code" unique="false" eType="#//CodeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The code or other information about the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Code"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group" unique="false" eType="#//GroupType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The group to which the resource belongs.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Group"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workGroup" unique="false"
-        eType="#//WorkGroupType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of workgroup to which the resource belongs. &#xD;&#xA;                                Values are: 0=Default, 1=None, 2=Email, 3=Web&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkGroup"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="emailAddress" unique="false"
-        eType="#//EmailAddressType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The email address of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EmailAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlink" unique="false"
-        eType="#//HyperlinkType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the hyperlink associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Hyperlink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkAddress" unique="false"
-        eType="#//HyperlinkAddressType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The hyperlink associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkSubAddress" unique="false"
-        eType="#//HyperlinkSubAddressType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The document bookmark of the hyperlink associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkSubAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maxUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" defaultValueLiteral="1.0"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The maximum number of units that the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MaxUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="peakUnits" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The largest number of units assigned to the resource at any time.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PeakUnits"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overAllocated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the resource is overallocated.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OverAllocated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableFrom" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The first date that the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableFrom"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="availableTo" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The last date the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailableTo"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="canLevel" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the resource can be leveled.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CanLevel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="accrueAt" unique="false"
-        eType="#//AccrueAt">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How cost is accrued against the resource. &#xD;&#xA;                                Values are: 1=Start, 2=End, 3=Prorated&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AccrueAt"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total work assigned to the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="regularWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of non-overtime work assigned to the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RegularWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of overtime work assigned to the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of actual work performed by the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of remaining work required to complete all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of actual overtime work performed by the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeWork"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of remaining overtime work required to complete all tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentWorkComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage of work completed across all tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentWorkComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The standard rate of the resource. &#xD;&#xA;                                This value is as of the current date if a rate table exists for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="standardRateFormat" unique="false"
-        eType="#//StandardRateFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the standard rate.  &#xD;&#xA;                                1=m, 2=h, 3=d, 4=w, 5=mo, 7=y, 8=material resource rate (or blank symbol specified)&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StandardRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total project cost for the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The overtime rate of the resource. &#xD;&#xA;                                This value is as of the current date if a rate table exists for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeRateFormat" unique="false"
-        eType="#//OvertimeRateFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The units used by Microsoft Project to display the overtime rate.  &#xD;&#xA;                                1=m, 2=h, 3=d, 4=w, 5=mo, 7=y&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeRateFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The total overtime cost for the resource including actual and remaining overtime costs.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costPerUse" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The cost per use of the resource. This value is as of the current date if a rate table &#xD;&#xA;                                exists for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostPerUse"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost incurred by the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime cost incurred by the resource across all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected cost of the resource to complete all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeCost"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected overtime cost of the resource to complete all assigned tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between the baseline work and the work as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="costVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The difference between the baseline cost and the cost.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CostVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value schedule variance, through the project status date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value cost variance, through the project status date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of the work performed by the resource for the project to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ACWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The resource calendar.Refers to a valid UID in the Calendars element of &#xD;&#xA;                                the Microsoft Project XML Schema.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notes" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Text notes associated with the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Notes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budget cost of work scheduled for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of of the work performed by the resource for the project to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isGeneric" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is generic.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsGeneric"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isInactive" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is set to inactive.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsInactive"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEnterprise" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the resource is an Enterprise resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsEnterprise"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookingType" unique="false"
-        eType="#//BookingTypeType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the booking type of the resource. 1=Commited, 2=Proposed&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BookingType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWorkProtected" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWorkProtected"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual overtime work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activeDirectoryGUID" unique="false"
-        eType="#//ActiveDirectoryGUIDType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The Active Directory GUID for the resource.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActiveDirectoryGUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="creationDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the resource was created.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreationDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute3" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an extended attribute.  Two pieces of data are necessary - &#xD;&#xA;                                a pointer back to the extended attribute table which is specified either by the unique ID or the Field ID, &#xD;&#xA;                                and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseline" upperBound="-1"
-        eType="#//Baseline2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The baseline values for the resources.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Baseline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCode" upperBound="-1"
-        eType="#//OutlineCode3" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an outline code.  Two pieces of data are necessary - a pointer back to &#xD;&#xA;                                the outline code table which is specified either by the unique ID or the Field ID, and the value which is &#xD;&#xA;                                specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCode"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="availabilityPeriods" eType="#//AvailabilityPeriods"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A collection of periods during which the resource is available.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AvailabilityPeriods"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rates" eType="#//Rates"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A collection of periods and the rates associated with each one.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Rates"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Resources">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Resources_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resource" upperBound="-1"
-        eType="#//Resource" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="There must be at least one resource in each Resources collection.&#xD;&#xA;                    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resource"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="RollupTypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RollupType_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="StandardRateFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="StandardRateFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="StandardRateFormatType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="StandardRateFormat_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 7 8"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="SubjectType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Subject_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="SubprojectNameType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="SubprojectName_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Task">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Task_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="iD" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The position identifier of the task within the list of tasks.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//NameType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The name of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of task. &#xD;&#xA;                                Values are: 0=Fixed Units, 1=Fixed Duration, 2=Fixed Work.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isNull" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies whether the task is null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsNull"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="createDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the task was created.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CreateDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="contact" unique="false"
-        eType="#//ContactType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The contact person for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Contact"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="wBS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The work breakdown structure code of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="wBSLevel" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The rightmost WBS level of the task. &#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBSLevel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="outlineNumber" unique="false"
-        eType="#//OutlineNumberType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The outline number of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineNumber"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="outlineLevel" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The outline level of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineLevel"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="priority" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The priority of the task from 0 to 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Priority"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The scheduled finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="duration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The planned duration of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Duration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="durationFormat" unique="false"
-        eType="#//DurationFormatType4">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the Duration of the Task.  &#xD;&#xA;                                Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, &#xD;&#xA;                                43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DurationFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="work" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of scheduled work for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Work"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="stop" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the task was stopped.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Stop"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resume" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date that the task resumed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Resume"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resumeValid" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task can be resumed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResumeValid"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="effortDriven" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is effort-driven.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EffortDriven"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="recurring" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is a recurring task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Recurring"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overAllocated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is overallocated. &#xD;&#xA;                                This element is informational only.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OverAllocated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimated" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is estimated.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Estimated"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="milestone" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is a milestone.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Milestone"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="summary" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is a summary task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Summary"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="critical" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is in the critical chain.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Critical"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSubproject" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is an inserted project.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsSubproject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSubprojectReadOnly" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the inserted project is read-only.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IsSubprojectReadOnly"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="subprojectName" unique="false"
-        eType="#//SubprojectNameType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The source location of the inserted project.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubprojectName"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalTask" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is external.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExternalTask"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalTaskProject" unique="false"
-        eType="#//ExternalTaskProjectType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The source location and task identifier of the external task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExternalTaskProject"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earlyStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The early start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarlyStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earlyFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The early finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarlyFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lateStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The late start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LateStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lateFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The late finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LateFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the task start date from &#xD;&#xA;                                the baseline start date as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="StartVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of the task finish date from &#xD;&#xA;                                the baseline finish date as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FinishVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workVariance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The variance of task work from the baseline &#xD;&#xA;                                task work as minutes x 1000.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkVariance"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="freeSlack" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of free slack.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FreeSlack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="totalSlack" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of total slack.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TotalSlack"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fixedCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The fixed cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FixedCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fixedCostAccrual" unique="false"
-        eType="#//FixedCostAccrualType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="How the fixed cost is accrued against the task. &#xD;&#xA;                                Values are: 1=Start, 2=Prorated and 3=End.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FixedCostAccrual"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage of the task duration completed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="percentWorkComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage of the task work completed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PercentWorkComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cost" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The projected or scheduled cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Cost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The sum of the actual and remaining overtime cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="overtimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of overtime work scheduled for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual start date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual finish date of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualDuration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual duration of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualDuration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime cost of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual work for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual overtime work for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="regularWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of non-overtime work scheduled for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RegularWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingDuration" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The amount of time required to complete the unfinished portion of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingDuration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingCost" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining projected cost of completing the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingWork" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining work scheduled to complete the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeCost"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Decimal">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining overtime cost projected to finish the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeCost"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="remainingOvertimeWork"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The remaining overtime work scheduled to finish the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RemainingOvertimeWork"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual cost of work performed on the task to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ACWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cV" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Earned value cost variance.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CV"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="constraintType" unique="false"
-        eType="#//ConstraintTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The constraint on the start or finish date of the task. &#xD;&#xA;                                Values are: 0=As Soon As Possible, 1=As Late As Possible, 2=Must Start On, 3=Must Finish On, &#xD;&#xA;                                4=Start No Earlier Than, 5=Start No Later Than, 6=Finish No Earlier Than and 7=Finish No Later Than&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ConstraintType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="calendarUID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The task calendar.Refers to a valid UID in the Calendars element of &#xD;&#xA;                                the Microsoft Project XML Schema.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CalendarUID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="constraintDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date argument for the task constraint type.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ConstraintDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="deadline" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The deadline for the task to be completed.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Deadline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelAssignments" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether leveling can adjust assignments.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelAssignments"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingCanSplit" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether leveling can split the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingCanSplit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelay" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The delay caused by leveling the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelingDelayFormat" unique="false"
-        eType="#//LevelingDelayFormatType1">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The format for expressing the duration of the delay.  &#xD;&#xA;                                Values are: 3=m, 4=em, 5=h, 6=eh, 7=d, 8=ed, 9=w, 10=ew, 11=mo, 12=emo, 19=%, &#xD;&#xA;                                20=e%, 21=null, 35=m?, 36=em?, 37=h?, 38=eh?, 39=d?, 40=ed?, 41=w?, 42=ew?, &#xD;&#xA;                                43=mo?, 44=emo?, 51=%?, 52=e%? and 53=null.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelingDelayFormat"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="preLeveledStart" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The start date of the task before it was leveled.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PreLeveledStart"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="preLeveledFinish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The finish date of the task before it was leveled.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PreLeveledFinish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlink" unique="false"
-        eType="#//HyperlinkType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The title of the hyperlink associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Hyperlink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkAddress" unique="false"
-        eType="#//HyperlinkAddressType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The hyperlink associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hyperlinkSubAddress" unique="false"
-        eType="#//HyperlinkSubAddressType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The document bookmark of the hyperlink associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HyperlinkSubAddress"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ignoreResourceCalendar"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task ignores the resource calendar.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IgnoreResourceCalendar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notes" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Text notes associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Notes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hideBar" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the GANTT bar of the task is hidden when displayed in Microsoft Project.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HideBar"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rollup" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the task is rolled up.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Rollup"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWS" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work scheduled for the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWS"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bCWP" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Float"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The budgeted cost of work performed on the task to-date.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BCWP"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="physicalPercentComplete"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The percentage complete value entered by the Project Manager.  &#xD;&#xA;                                This can be used as an alternative for calculating BCWP.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PhysicalPercentComplete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="earnedValueMethod" unique="false"
-        eType="#//EarnedValueMethodType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The method for calculating earned value. &#xD;&#xA;                                Values are: 0=Percent Complete, 1=Physical Percent Complete&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EarnedValueMethod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predecessorLink" upperBound="-1"
-        eType="#//PredecessorLink" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the predecessor task of the task that contains it.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PredecessorLink"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualWorkProtected" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="actualOvertimeWorkProtected"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Duration">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Specifies the duration through which actual overtime work is protected.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActualOvertimeWorkProtected"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="extendedAttribute" upperBound="-1"
-        eType="#//ExtendedAttribute2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an extended attribute.  Two pieces of data are necessary - &#xD;&#xA;                                a pointer back to the extended attribute table which is specified either by the unique ID or &#xD;&#xA;                                the Field ID, and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExtendedAttribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseline" upperBound="-1"
-        eType="#//Baseline" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of baseline values of the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Baseline"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outlineCode" upperBound="-1"
-        eType="#//OutlineCode2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of an outline code.  Two pieces of data are necessary - &#xD;&#xA;                                a pointer back to the outline code table which is specified either by the unique ID or the Field ID, &#xD;&#xA;                                and the value which is specified either with the value, or a pointer back to the value list.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutlineCode"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timephasedData" upperBound="-1"
-        eType="#//TimephasedDataType" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time phased data block associated with the task.&#xD;&#xA;                                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimephasedData"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Tasks">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Tasks_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="task" upperBound="-1" eType="#//Task"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="There must be at least one task in each Tasks collection.&#xD;&#xA;                    "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Task"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TimePeriod">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TimePeriod_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fromDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The beginning of the exception time.&#xD;&#xA;                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FromDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="toDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The end of the exception time.&#xD;&#xA;                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ToDate"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TimephasedDataType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="The definition of the time phased data block.&#xD;&#xA;&#x9;&#x9;        "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TimephasedDataType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//TypeType3">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="&#xD;&#xA;                The type of task timephased data. Values are:&#xD;&#xA;                    1=Assignment Remaining Work&#xD;&#xA;                    2=Assignment Actual Work&#xD;&#xA;                    3=Assignment Actual Overtime Work&#xD;&#xA;                    4=Assignment Baseline Work&#xD;&#xA;                    5=Assignment Baseline Cost&#xD;&#xA;                    6=Assignment Actual Cost&#xD;&#xA;                    7=Resource Baseline Work&#xD;&#xA;                    8=Resource Baseline Cost&#xD;&#xA;                    9=Task Baseline Work&#xD;&#xA;                    10=Task Baseline Cost&#xD;&#xA;                    11=Task Percent Complete&#xD;&#xA;                    16=Assignment Baseline 1 Work&#xD;&#xA;                    17=Assignment Baseline 1 Cost&#xD;&#xA;                    18=Task Baseline 1 Work&#xD;&#xA;                    19=Task Baseline 1 Cost&#xD;&#xA;                    20=Resource Baseline 1 Work&#xD;&#xA;                    21=Resource Baseline 1 Cost&#xD;&#xA;                    22=Assignment Baseline 2 Work&#xD;&#xA;                    23=Assignment Baseline 2 Cost&#xD;&#xA;                    24=Task Baseline 2 Work&#xD;&#xA;                    25=Task Baseline 2 Cost&#xD;&#xA;                    26=Resource Baseline 2 Work&#xD;&#xA;                    27=Resource Baseline 2 Cost&#xD;&#xA;                    28=Assignment Baseline 3 Work&#xD;&#xA;                    29=Assignment Baseline 3 Cost&#xD;&#xA;                    30=Task Baseline 3 Work&#xD;&#xA;                    31=Task Baseline 3 Cost&#xD;&#xA;                    32=Resource Baseline 3 Work&#xD;&#xA;                    33=Resource Baseline 3 Cost&#xD;&#xA;                    34=Assignment Baseline 4 Work&#xD;&#xA;                    35=Assignment Baseline 4 Cost&#xD;&#xA;                    36=Task Baseline 4 Work&#xD;&#xA;                    37=Task Baseline 4 Cost&#xD;&#xA;                    38=Resource Baseline 4 Work&#xD;&#xA;                    39=Resource Baseline 4 Cost&#xD;&#xA;                    40=Assignment Baseline 5 Work&#xD;&#xA;                    41=Assignment Baseline 5 Cost&#xD;&#xA;                    42=Task Baseline 5 Work&#xD;&#xA;                    43=Task Baseline 5 Cost&#xD;&#xA;                    44=Resource Baseline 5 Work&#xD;&#xA;                    45=Resource Baseline 5 Cost&#xD;&#xA;                    46=Assignment Baseline 6 Work&#xD;&#xA;                    47=Assignment Baseline 6 Cost&#xD;&#xA;                    48=Task Baseline 6 Work&#xD;&#xA;                    49=Task Baseline 6 Cost&#xD;&#xA;                    50=Resource Baseline 6 Work&#xD;&#xA;                    51=Resource Baseline 6 Cost&#xD;&#xA;                    52=Assignment Baseline 7 Work&#xD;&#xA;                    53=Assignment Baseline 7 Cost&#xD;&#xA;                    54=Task Baseline 7 Work&#xD;&#xA;                    55=Task Baseline 7 Cost&#xD;&#xA;                    56=Resource Baseline 7 Work&#xD;&#xA;                    57=Resource Baseline 7 Cost&#xD;&#xA;                    58=Assignment Baseline 8 Work&#xD;&#xA;                    59=Assignment Baseline 8 Cost&#xD;&#xA;                    60=Task Baseline 8 Work&#xD;&#xA;                    61=Task Baseline 8 Cost&#xD;&#xA;                    62=Resource Baseline 8 Work&#xD;&#xA;                    63=Resource Baseline 8 Cost&#xD;&#xA;                    64=Assignment Baseline 9 Work&#xD;&#xA;                    65=Assignment Baseline 9 Cost&#xD;&#xA;                    66=Task Baseline 9 Work&#xD;&#xA;                    67=Task Baseline 9 Cost&#xD;&#xA;                    68=Resource Baseline 9 Work&#xD;&#xA;                    69=Resource Baseline 9 Cost&#xD;&#xA;                    70=Assignment Baseline 10 Work&#xD;&#xA;                    71=Assignment Baseline 10 Cost&#xD;&#xA;                    72=Task Baseline 10 Work&#xD;&#xA;                    73=Task Baseline 10 Cost&#xD;&#xA;                    74=Resource Baseline 10 Work&#xD;&#xA;                    75=Resource Baseline 10 Cost&#xD;&#xA;                    76=Physical Percent Complete&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uID" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique identifier of the timephased data record.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="start" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The start date of the timephased data period.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Start"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finish" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The finish date of the timephased data period.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Finish"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="unit" unique="false" eType="#//UnitType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The time unit of the timephased data period. &#xD;&#xA;                Values are: 0=m, 1=h, 2=d, 3=w, 5=mo, 8=y&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Unit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value per unit of time for the timephased data period.&#xD;&#xA;                "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TitleType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Title_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="512"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType1" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._1_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType2" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._2_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType3" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._3_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5 6 7 8 9 10 11 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType4" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._4_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="TypeType5" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Type_._5_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="UIDType" instanceClassName="java.lang.String">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="UID_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/>
-      <details key="maxLength" value="16"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="UnitType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Unit_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 5 8"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Value">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Value_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="valueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The unique ID of the outline code value across the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="parentValueID" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The value of the parent node of the outline code."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ParentValueID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A description of this value."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Value2">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Value_._1_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="iD" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Unique ID of value across &#xD;&#xA;                                                        the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ID"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The actual value."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the value &#xD;&#xA;                                                        in the list."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueList">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ValueList_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" upperBound="-1"
-        eType="#//Value2" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The values that make up the value list.&#xD;&#xA;                                            "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="ValuelistSortOrderType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ValuelistSortOrder_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Values">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Values_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:0"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
-        eType="#//Value" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The individual values."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Value"/>
-        <details key="namespace" value="##targetNamespace"/>
-        <details key="group" value="#group:0"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WBSMask">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WBSMask_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="level" unique="false" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The level of the mask."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Level"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" lowerBound="1"
-        eType="#//TypeType2">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of the node value. &#xD;&#xA;                                The values are: 0=Numbers, 1=Uppercase Letters, 2=Lowercase Letters, 3=Characters."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="length" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The maximum length in characters.  &#xD;&#xA;                                This element is omitted when length is &quot;any&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Length"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="separator" unique="false"
-        lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The separator character of the node."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Separator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WBSMasks">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WBSMasks_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="verifyUniqueCodes" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether WBS codes are unique for new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="VerifyUniqueCodes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="generateCodes" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        defaultValueLiteral="false" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether WBS codes are generated for new tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="GenerateCodes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="prefix" unique="false"
-        eType="#//PrefixType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The prefix for all WBS codes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Prefix"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="wBSMask" upperBound="-1"
-        eType="#//WBSMask" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The WBS Mask that is applied to all tasks in the Project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WBSMask"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WeekDay">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WeekDay_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dayType" unique="false"
-        lowerBound="1" eType="#//DayTypeType">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The type of day. &#xD;&#xA;                                                         Values are: 0=Exception, 1=Monday, 2=Tuesday, &#xD;&#xA;                                                         3=Wednesday, 4=Thursday, 5=Friday, 6=Saturday, &#xD;&#xA;                                                         7=Sunday"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DayType"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="dayWorking" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Whether the specified date or day &#xD;&#xA;                                                         type is working."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DayWorking"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="timePeriod" eType="#//TimePeriod"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines a contiguous set of exception days.&#xD;&#xA;                                                         "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TimePeriod"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workingTimes" eType="#//WorkingTimes"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The collection of working times that define the time worked &#xD;&#xA;                                                         on the weekday.  One of these must be present, and there may be no more than five.&#xD;&#xA;                                                         "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkingTimes"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WeekDays">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WeekDays_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="weekDay" upperBound="-1"
-        eType="#//WeekDay" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A weekday either defines regular days &#xD;&#xA;                                            of the week or exception days in the calendar."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WeekDay"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WeekStartDayType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WeekStartDay_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WorkContourType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkContour_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3 4 5 6 7 8"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WorkFormatType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkFormat_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="1 2 3 4 5"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WorkGroupType" instanceClassName="java.math.BigInteger">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkGroup_._type"/>
-      <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/>
-      <details key="enumeration" value="0 1 2 3"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkingTime">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkingTime_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="fromTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The beginning of the working time.&#xD;&#xA;                                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="FromTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="toTime" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Time">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The end of the working  time.&#xD;&#xA;                                                                                     "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ToTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkingTimes">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkingTimes_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workingTime" upperBound="5"
-        eType="#//WorkingTime" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the working time during the weekday.&#xD;&#xA;                                                                         "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkingTime"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/package.html b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/package.html
deleted file mode 100644
index c167fd8..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for the Microsoft Project model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/package.html b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/package.html
deleted file mode 100644
index 3e3b80c..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the Microsoft Project model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectAdapterFactory.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectAdapterFactory.java
deleted file mode 100644
index 81253df..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectAdapterFactory.java
+++ /dev/null
@@ -1,838 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectAdapterFactory.java,v 1.1 2008/01/15 08:52:41 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.epf.msproject.Assignment;
-import org.eclipse.epf.msproject.Assignments;
-import org.eclipse.epf.msproject.AvailabilityPeriod;
-import org.eclipse.epf.msproject.AvailabilityPeriods;
-import org.eclipse.epf.msproject.Baseline;
-import org.eclipse.epf.msproject.Baseline2;
-import org.eclipse.epf.msproject.Baseline3;
-import org.eclipse.epf.msproject.Calendar;
-import org.eclipse.epf.msproject.Calendars;
-import org.eclipse.epf.msproject.DocumentRoot;
-import org.eclipse.epf.msproject.ExtendedAttribute;
-import org.eclipse.epf.msproject.ExtendedAttribute2;
-import org.eclipse.epf.msproject.ExtendedAttribute3;
-import org.eclipse.epf.msproject.ExtendedAttribute4;
-import org.eclipse.epf.msproject.ExtendedAttributes;
-import org.eclipse.epf.msproject.Mask;
-import org.eclipse.epf.msproject.Masks;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode;
-import org.eclipse.epf.msproject.OutlineCode2;
-import org.eclipse.epf.msproject.OutlineCode3;
-import org.eclipse.epf.msproject.OutlineCodes;
-import org.eclipse.epf.msproject.PredecessorLink;
-import org.eclipse.epf.msproject.Project;
-import org.eclipse.epf.msproject.Rate;
-import org.eclipse.epf.msproject.Rates;
-import org.eclipse.epf.msproject.Resource;
-import org.eclipse.epf.msproject.Resources;
-import org.eclipse.epf.msproject.Task;
-import org.eclipse.epf.msproject.Tasks;
-import org.eclipse.epf.msproject.TimePeriod;
-import org.eclipse.epf.msproject.TimephasedDataType;
-import org.eclipse.epf.msproject.Value;
-import org.eclipse.epf.msproject.Value2;
-import org.eclipse.epf.msproject.ValueList;
-import org.eclipse.epf.msproject.Values;
-import org.eclipse.epf.msproject.WBSMask;
-import org.eclipse.epf.msproject.WBSMasks;
-import org.eclipse.epf.msproject.WeekDay;
-import org.eclipse.epf.msproject.WeekDays;
-import org.eclipse.epf.msproject.WorkingTime;
-import org.eclipse.epf.msproject.WorkingTimes;
-
-/**
- * <!-- 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.epf.msproject.MsprojectPackage
- * @generated
- */
-public class MsprojectAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static MsprojectPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MsprojectAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = MsprojectPackage.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
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MsprojectSwitch modelSwitch =
-		new MsprojectSwitch() {
-			public Object caseAssignment(Assignment object) {
-				return createAssignmentAdapter();
-			}
-			public Object caseAssignments(Assignments object) {
-				return createAssignmentsAdapter();
-			}
-			public Object caseAvailabilityPeriod(AvailabilityPeriod object) {
-				return createAvailabilityPeriodAdapter();
-			}
-			public Object caseAvailabilityPeriods(AvailabilityPeriods object) {
-				return createAvailabilityPeriodsAdapter();
-			}
-			public Object caseBaseline(Baseline object) {
-				return createBaselineAdapter();
-			}
-			public Object caseBaseline2(Baseline2 object) {
-				return createBaseline2Adapter();
-			}
-			public Object caseBaseline3(Baseline3 object) {
-				return createBaseline3Adapter();
-			}
-			public Object caseCalendar(Calendar object) {
-				return createCalendarAdapter();
-			}
-			public Object caseCalendars(Calendars object) {
-				return createCalendarsAdapter();
-			}
-			public Object caseDocumentRoot(DocumentRoot object) {
-				return createDocumentRootAdapter();
-			}
-			public Object caseExtendedAttribute(ExtendedAttribute object) {
-				return createExtendedAttributeAdapter();
-			}
-			public Object caseExtendedAttribute2(ExtendedAttribute2 object) {
-				return createExtendedAttribute2Adapter();
-			}
-			public Object caseExtendedAttribute3(ExtendedAttribute3 object) {
-				return createExtendedAttribute3Adapter();
-			}
-			public Object caseExtendedAttribute4(ExtendedAttribute4 object) {
-				return createExtendedAttribute4Adapter();
-			}
-			public Object caseExtendedAttributes(ExtendedAttributes object) {
-				return createExtendedAttributesAdapter();
-			}
-			public Object caseMask(Mask object) {
-				return createMaskAdapter();
-			}
-			public Object caseMasks(Masks object) {
-				return createMasksAdapter();
-			}
-			public Object caseOutlineCode(OutlineCode object) {
-				return createOutlineCodeAdapter();
-			}
-			public Object caseOutlineCode2(OutlineCode2 object) {
-				return createOutlineCode2Adapter();
-			}
-			public Object caseOutlineCode3(OutlineCode3 object) {
-				return createOutlineCode3Adapter();
-			}
-			public Object caseOutlineCodes(OutlineCodes object) {
-				return createOutlineCodesAdapter();
-			}
-			public Object casePredecessorLink(PredecessorLink object) {
-				return createPredecessorLinkAdapter();
-			}
-			public Object caseProject(Project object) {
-				return createProjectAdapter();
-			}
-			public Object caseRate(Rate object) {
-				return createRateAdapter();
-			}
-			public Object caseRates(Rates object) {
-				return createRatesAdapter();
-			}
-			public Object caseResource(Resource object) {
-				return createResourceAdapter();
-			}
-			public Object caseResources(Resources object) {
-				return createResourcesAdapter();
-			}
-			public Object caseTask(Task object) {
-				return createTaskAdapter();
-			}
-			public Object caseTasks(Tasks object) {
-				return createTasksAdapter();
-			}
-			public Object caseTimePeriod(TimePeriod object) {
-				return createTimePeriodAdapter();
-			}
-			public Object caseTimephasedDataType(TimephasedDataType object) {
-				return createTimephasedDataTypeAdapter();
-			}
-			public Object caseValue(Value object) {
-				return createValueAdapter();
-			}
-			public Object caseValue2(Value2 object) {
-				return createValue2Adapter();
-			}
-			public Object caseValueList(ValueList object) {
-				return createValueListAdapter();
-			}
-			public Object caseValues(Values object) {
-				return createValuesAdapter();
-			}
-			public Object caseWBSMask(WBSMask object) {
-				return createWBSMaskAdapter();
-			}
-			public Object caseWBSMasks(WBSMasks object) {
-				return createWBSMasksAdapter();
-			}
-			public Object caseWeekDay(WeekDay object) {
-				return createWeekDayAdapter();
-			}
-			public Object caseWeekDays(WeekDays object) {
-				return createWeekDaysAdapter();
-			}
-			public Object caseWorkingTime(WorkingTime object) {
-				return createWorkingTimeAdapter();
-			}
-			public Object caseWorkingTimes(WorkingTimes object) {
-				return createWorkingTimesAdapter();
-			}
-			public Object 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
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Assignment <em>Assignment</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.epf.msproject.Assignment
-	 * @generated
-	 */
-	public Adapter createAssignmentAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Assignments <em>Assignments</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.epf.msproject.Assignments
-	 * @generated
-	 */
-	public Adapter createAssignmentsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.AvailabilityPeriod <em>Availability Period</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.epf.msproject.AvailabilityPeriod
-	 * @generated
-	 */
-	public Adapter createAvailabilityPeriodAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.AvailabilityPeriods <em>Availability Periods</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.epf.msproject.AvailabilityPeriods
-	 * @generated
-	 */
-	public Adapter createAvailabilityPeriodsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Baseline <em>Baseline</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.epf.msproject.Baseline
-	 * @generated
-	 */
-	public Adapter createBaselineAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Baseline2 <em>Baseline2</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.epf.msproject.Baseline2
-	 * @generated
-	 */
-	public Adapter createBaseline2Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Baseline3 <em>Baseline3</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.epf.msproject.Baseline3
-	 * @generated
-	 */
-	public Adapter createBaseline3Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Calendar <em>Calendar</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.epf.msproject.Calendar
-	 * @generated
-	 */
-	public Adapter createCalendarAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Calendars <em>Calendars</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.epf.msproject.Calendars
-	 * @generated
-	 */
-	public Adapter createCalendarsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.DocumentRoot <em>Document Root</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.epf.msproject.DocumentRoot
-	 * @generated
-	 */
-	public Adapter createDocumentRootAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.ExtendedAttribute <em>Extended Attribute</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.epf.msproject.ExtendedAttribute
-	 * @generated
-	 */
-	public Adapter createExtendedAttributeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.ExtendedAttribute2 <em>Extended Attribute2</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.epf.msproject.ExtendedAttribute2
-	 * @generated
-	 */
-	public Adapter createExtendedAttribute2Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.ExtendedAttribute3 <em>Extended Attribute3</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.epf.msproject.ExtendedAttribute3
-	 * @generated
-	 */
-	public Adapter createExtendedAttribute3Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.ExtendedAttribute4 <em>Extended Attribute4</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.epf.msproject.ExtendedAttribute4
-	 * @generated
-	 */
-	public Adapter createExtendedAttribute4Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.ExtendedAttributes <em>Extended Attributes</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.epf.msproject.ExtendedAttributes
-	 * @generated
-	 */
-	public Adapter createExtendedAttributesAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Mask <em>Mask</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.epf.msproject.Mask
-	 * @generated
-	 */
-	public Adapter createMaskAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Masks <em>Masks</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.epf.msproject.Masks
-	 * @generated
-	 */
-	public Adapter createMasksAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.OutlineCode <em>Outline Code</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.epf.msproject.OutlineCode
-	 * @generated
-	 */
-	public Adapter createOutlineCodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.OutlineCode2 <em>Outline Code2</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.epf.msproject.OutlineCode2
-	 * @generated
-	 */
-	public Adapter createOutlineCode2Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.OutlineCode3 <em>Outline Code3</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.epf.msproject.OutlineCode3
-	 * @generated
-	 */
-	public Adapter createOutlineCode3Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.OutlineCodes <em>Outline Codes</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.epf.msproject.OutlineCodes
-	 * @generated
-	 */
-	public Adapter createOutlineCodesAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.PredecessorLink <em>Predecessor Link</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.epf.msproject.PredecessorLink
-	 * @generated
-	 */
-	public Adapter createPredecessorLinkAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Project <em>Project</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.epf.msproject.Project
-	 * @generated
-	 */
-	public Adapter createProjectAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Rate <em>Rate</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.epf.msproject.Rate
-	 * @generated
-	 */
-	public Adapter createRateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Rates <em>Rates</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.epf.msproject.Rates
-	 * @generated
-	 */
-	public Adapter createRatesAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Resource <em>Resource</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.epf.msproject.Resource
-	 * @generated
-	 */
-	public Adapter createResourceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Resources <em>Resources</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.epf.msproject.Resources
-	 * @generated
-	 */
-	public Adapter createResourcesAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Task <em>Task</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.epf.msproject.Task
-	 * @generated
-	 */
-	public Adapter createTaskAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Tasks <em>Tasks</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.epf.msproject.Tasks
-	 * @generated
-	 */
-	public Adapter createTasksAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.TimePeriod <em>Time Period</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.epf.msproject.TimePeriod
-	 * @generated
-	 */
-	public Adapter createTimePeriodAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.TimephasedDataType <em>Timephased Data Type</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.epf.msproject.TimephasedDataType
-	 * @generated
-	 */
-	public Adapter createTimephasedDataTypeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Value <em>Value</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.epf.msproject.Value
-	 * @generated
-	 */
-	public Adapter createValueAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Value2 <em>Value2</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.epf.msproject.Value2
-	 * @generated
-	 */
-	public Adapter createValue2Adapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.ValueList <em>Value List</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.epf.msproject.ValueList
-	 * @generated
-	 */
-	public Adapter createValueListAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.Values <em>Values</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.epf.msproject.Values
-	 * @generated
-	 */
-	public Adapter createValuesAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.WBSMask <em>WBS Mask</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.epf.msproject.WBSMask
-	 * @generated
-	 */
-	public Adapter createWBSMaskAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.WBSMasks <em>WBS Masks</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.epf.msproject.WBSMasks
-	 * @generated
-	 */
-	public Adapter createWBSMasksAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.WeekDay <em>Week Day</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.epf.msproject.WeekDay
-	 * @generated
-	 */
-	public Adapter createWeekDayAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.WeekDays <em>Week Days</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.epf.msproject.WeekDays
-	 * @generated
-	 */
-	public Adapter createWeekDaysAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.WorkingTime <em>Working Time</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.epf.msproject.WorkingTime
-	 * @generated
-	 */
-	public Adapter createWorkingTimeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.msproject.WorkingTimes <em>Working Times</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.epf.msproject.WorkingTimes
-	 * @generated
-	 */
-	public Adapter createWorkingTimesAdapter() {
-		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;
-	}
-
-} //MsprojectAdapterFactory
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectResourceFactoryImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectResourceFactoryImpl.java
deleted file mode 100644
index 0a97b97..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectResourceFactoryImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectResourceFactoryImpl.java,v 1.1 2008/01/15 08:52:41 jtham Exp $
- */
-package org.eclipse.epf.msproject.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.epf.msproject.util.MsprojectResourceImpl
- * @generated
- */
-public class MsprojectResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MsprojectResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resource createResource(URI uri) {
-		XMLResource result = new MsprojectResourceImpl(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.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
-
-		result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
-		return result;
-	}
-
-} //MsprojectResourceFactoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectResourceImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectResourceImpl.java
deleted file mode 100644
index ef7e104..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectResourceImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectResourceImpl.java,v 1.1 2008/01/15 08:52:41 jtham Exp $
- */
-package org.eclipse.epf.msproject.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-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.epf.msproject.util.MsprojectResourceFactoryImpl
- * @generated
- */
-public class MsprojectResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public MsprojectResourceImpl(URI uri) {
-		super(uri);
-	}
-
-	protected XMLHelper createXMLHelper(){
-	    return new MsprojectXMLHelperImpl(this);
-	}
-} //MsprojectResourceImpl
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectSwitch.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectSwitch.java
deleted file mode 100644
index 68a90b8..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectSwitch.java
+++ /dev/null
@@ -1,1010 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectSwitch.java,v 1.1 2008/01/15 08:52:41 jtham Exp $
- */
-package org.eclipse.epf.msproject.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.msproject.Assignment;
-import org.eclipse.epf.msproject.Assignments;
-import org.eclipse.epf.msproject.AvailabilityPeriod;
-import org.eclipse.epf.msproject.AvailabilityPeriods;
-import org.eclipse.epf.msproject.Baseline;
-import org.eclipse.epf.msproject.Baseline2;
-import org.eclipse.epf.msproject.Baseline3;
-import org.eclipse.epf.msproject.Calendar;
-import org.eclipse.epf.msproject.Calendars;
-import org.eclipse.epf.msproject.DocumentRoot;
-import org.eclipse.epf.msproject.ExtendedAttribute;
-import org.eclipse.epf.msproject.ExtendedAttribute2;
-import org.eclipse.epf.msproject.ExtendedAttribute3;
-import org.eclipse.epf.msproject.ExtendedAttribute4;
-import org.eclipse.epf.msproject.ExtendedAttributes;
-import org.eclipse.epf.msproject.Mask;
-import org.eclipse.epf.msproject.Masks;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode;
-import org.eclipse.epf.msproject.OutlineCode2;
-import org.eclipse.epf.msproject.OutlineCode3;
-import org.eclipse.epf.msproject.OutlineCodes;
-import org.eclipse.epf.msproject.PredecessorLink;
-import org.eclipse.epf.msproject.Project;
-import org.eclipse.epf.msproject.Rate;
-import org.eclipse.epf.msproject.Rates;
-import org.eclipse.epf.msproject.Resource;
-import org.eclipse.epf.msproject.Resources;
-import org.eclipse.epf.msproject.Task;
-import org.eclipse.epf.msproject.Tasks;
-import org.eclipse.epf.msproject.TimePeriod;
-import org.eclipse.epf.msproject.TimephasedDataType;
-import org.eclipse.epf.msproject.Value;
-import org.eclipse.epf.msproject.Value2;
-import org.eclipse.epf.msproject.ValueList;
-import org.eclipse.epf.msproject.Values;
-import org.eclipse.epf.msproject.WBSMask;
-import org.eclipse.epf.msproject.WBSMasks;
-import org.eclipse.epf.msproject.WeekDay;
-import org.eclipse.epf.msproject.WeekDays;
-import org.eclipse.epf.msproject.WorkingTime;
-import org.eclipse.epf.msproject.WorkingTimes;
-
-/**
- * <!-- 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.epf.msproject.MsprojectPackage
- * @generated
- */
-public class MsprojectSwitch {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static MsprojectPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MsprojectSwitch() {
-		if (modelPackage == null) {
-			modelPackage = MsprojectPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case MsprojectPackage.ASSIGNMENT: {
-				Assignment assignment = (Assignment)theEObject;
-				Object result = caseAssignment(assignment);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.ASSIGNMENTS: {
-				Assignments assignments = (Assignments)theEObject;
-				Object result = caseAssignments(assignments);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.AVAILABILITY_PERIOD: {
-				AvailabilityPeriod availabilityPeriod = (AvailabilityPeriod)theEObject;
-				Object result = caseAvailabilityPeriod(availabilityPeriod);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.AVAILABILITY_PERIODS: {
-				AvailabilityPeriods availabilityPeriods = (AvailabilityPeriods)theEObject;
-				Object result = caseAvailabilityPeriods(availabilityPeriods);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.BASELINE: {
-				Baseline baseline = (Baseline)theEObject;
-				Object result = caseBaseline(baseline);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.BASELINE2: {
-				Baseline2 baseline2 = (Baseline2)theEObject;
-				Object result = caseBaseline2(baseline2);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.BASELINE3: {
-				Baseline3 baseline3 = (Baseline3)theEObject;
-				Object result = caseBaseline3(baseline3);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.CALENDAR: {
-				Calendar calendar = (Calendar)theEObject;
-				Object result = caseCalendar(calendar);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.CALENDARS: {
-				Calendars calendars = (Calendars)theEObject;
-				Object result = caseCalendars(calendars);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.DOCUMENT_ROOT: {
-				DocumentRoot documentRoot = (DocumentRoot)theEObject;
-				Object result = caseDocumentRoot(documentRoot);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.EXTENDED_ATTRIBUTE: {
-				ExtendedAttribute extendedAttribute = (ExtendedAttribute)theEObject;
-				Object result = caseExtendedAttribute(extendedAttribute);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2: {
-				ExtendedAttribute2 extendedAttribute2 = (ExtendedAttribute2)theEObject;
-				Object result = caseExtendedAttribute2(extendedAttribute2);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3: {
-				ExtendedAttribute3 extendedAttribute3 = (ExtendedAttribute3)theEObject;
-				Object result = caseExtendedAttribute3(extendedAttribute3);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4: {
-				ExtendedAttribute4 extendedAttribute4 = (ExtendedAttribute4)theEObject;
-				Object result = caseExtendedAttribute4(extendedAttribute4);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.EXTENDED_ATTRIBUTES: {
-				ExtendedAttributes extendedAttributes = (ExtendedAttributes)theEObject;
-				Object result = caseExtendedAttributes(extendedAttributes);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.MASK: {
-				Mask mask = (Mask)theEObject;
-				Object result = caseMask(mask);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.MASKS: {
-				Masks masks = (Masks)theEObject;
-				Object result = caseMasks(masks);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.OUTLINE_CODE: {
-				OutlineCode outlineCode = (OutlineCode)theEObject;
-				Object result = caseOutlineCode(outlineCode);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.OUTLINE_CODE2: {
-				OutlineCode2 outlineCode2 = (OutlineCode2)theEObject;
-				Object result = caseOutlineCode2(outlineCode2);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.OUTLINE_CODE3: {
-				OutlineCode3 outlineCode3 = (OutlineCode3)theEObject;
-				Object result = caseOutlineCode3(outlineCode3);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.OUTLINE_CODES: {
-				OutlineCodes outlineCodes = (OutlineCodes)theEObject;
-				Object result = caseOutlineCodes(outlineCodes);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.PREDECESSOR_LINK: {
-				PredecessorLink predecessorLink = (PredecessorLink)theEObject;
-				Object result = casePredecessorLink(predecessorLink);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.PROJECT: {
-				Project project = (Project)theEObject;
-				Object result = caseProject(project);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.RATE: {
-				Rate rate = (Rate)theEObject;
-				Object result = caseRate(rate);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.RATES: {
-				Rates rates = (Rates)theEObject;
-				Object result = caseRates(rates);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.RESOURCE: {
-				Resource resource = (Resource)theEObject;
-				Object result = caseResource(resource);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.RESOURCES: {
-				Resources resources = (Resources)theEObject;
-				Object result = caseResources(resources);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.TASK: {
-				Task task = (Task)theEObject;
-				Object result = caseTask(task);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.TASKS: {
-				Tasks tasks = (Tasks)theEObject;
-				Object result = caseTasks(tasks);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.TIME_PERIOD: {
-				TimePeriod timePeriod = (TimePeriod)theEObject;
-				Object result = caseTimePeriod(timePeriod);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE: {
-				TimephasedDataType timephasedDataType = (TimephasedDataType)theEObject;
-				Object result = caseTimephasedDataType(timephasedDataType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.VALUE: {
-				Value value = (Value)theEObject;
-				Object result = caseValue(value);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.VALUE2: {
-				Value2 value2 = (Value2)theEObject;
-				Object result = caseValue2(value2);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.VALUE_LIST: {
-				ValueList valueList = (ValueList)theEObject;
-				Object result = caseValueList(valueList);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.VALUES: {
-				Values values = (Values)theEObject;
-				Object result = caseValues(values);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.WBS_MASK: {
-				WBSMask wbsMask = (WBSMask)theEObject;
-				Object result = caseWBSMask(wbsMask);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.WBS_MASKS: {
-				WBSMasks wbsMasks = (WBSMasks)theEObject;
-				Object result = caseWBSMasks(wbsMasks);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.WEEK_DAY: {
-				WeekDay weekDay = (WeekDay)theEObject;
-				Object result = caseWeekDay(weekDay);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.WEEK_DAYS: {
-				WeekDays weekDays = (WeekDays)theEObject;
-				Object result = caseWeekDays(weekDays);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.WORKING_TIME: {
-				WorkingTime workingTime = (WorkingTime)theEObject;
-				Object result = caseWorkingTime(workingTime);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case MsprojectPackage.WORKING_TIMES: {
-				WorkingTimes workingTimes = (WorkingTimes)theEObject;
-				Object result = caseWorkingTimes(workingTimes);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Assignment</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 interpretting the object as an instance of '<em>Assignment</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAssignment(Assignment object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Assignments</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 interpretting the object as an instance of '<em>Assignments</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAssignments(Assignments object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Availability Period</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 interpretting the object as an instance of '<em>Availability Period</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAvailabilityPeriod(AvailabilityPeriod object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Availability Periods</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 interpretting the object as an instance of '<em>Availability Periods</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAvailabilityPeriods(AvailabilityPeriods object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Baseline</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 interpretting the object as an instance of '<em>Baseline</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBaseline(Baseline object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Baseline2</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 interpretting the object as an instance of '<em>Baseline2</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBaseline2(Baseline2 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Baseline3</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 interpretting the object as an instance of '<em>Baseline3</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBaseline3(Baseline3 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Calendar</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 interpretting the object as an instance of '<em>Calendar</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCalendar(Calendar object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Calendars</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 interpretting the object as an instance of '<em>Calendars</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCalendars(Calendars object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Document Root</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 interpretting the object as an instance of '<em>Document Root</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDocumentRoot(DocumentRoot object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Extended Attribute</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 interpretting the object as an instance of '<em>Extended Attribute</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExtendedAttribute(ExtendedAttribute object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Extended Attribute2</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 interpretting the object as an instance of '<em>Extended Attribute2</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExtendedAttribute2(ExtendedAttribute2 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Extended Attribute3</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 interpretting the object as an instance of '<em>Extended Attribute3</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExtendedAttribute3(ExtendedAttribute3 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Extended Attribute4</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 interpretting the object as an instance of '<em>Extended Attribute4</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExtendedAttribute4(ExtendedAttribute4 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Extended Attributes</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 interpretting the object as an instance of '<em>Extended Attributes</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExtendedAttributes(ExtendedAttributes object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Mask</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 interpretting the object as an instance of '<em>Mask</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMask(Mask object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Masks</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 interpretting the object as an instance of '<em>Masks</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMasks(Masks object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Outline Code</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 interpretting the object as an instance of '<em>Outline Code</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOutlineCode(OutlineCode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Outline Code2</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 interpretting the object as an instance of '<em>Outline Code2</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOutlineCode2(OutlineCode2 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Outline Code3</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 interpretting the object as an instance of '<em>Outline Code3</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOutlineCode3(OutlineCode3 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Outline Codes</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 interpretting the object as an instance of '<em>Outline Codes</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOutlineCodes(OutlineCodes object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Predecessor Link</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 interpretting the object as an instance of '<em>Predecessor Link</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePredecessorLink(PredecessorLink object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Project</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 interpretting the object as an instance of '<em>Project</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProject(Project object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Rate</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 interpretting the object as an instance of '<em>Rate</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRate(Rate object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Rates</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 interpretting the object as an instance of '<em>Rates</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRates(Rates object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Resource</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 interpretting the object as an instance of '<em>Resource</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseResource(Resource object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Resources</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 interpretting the object as an instance of '<em>Resources</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseResources(Resources object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Task</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 interpretting the object as an instance of '<em>Task</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTask(Task object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tasks</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 interpretting the object as an instance of '<em>Tasks</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTasks(Tasks object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Time Period</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 interpretting the object as an instance of '<em>Time Period</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTimePeriod(TimePeriod object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Timephased Data Type</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 interpretting the object as an instance of '<em>Timephased Data Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTimephasedDataType(TimephasedDataType object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Value</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 interpretting the object as an instance of '<em>Value</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValue(Value object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Value2</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 interpretting the object as an instance of '<em>Value2</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValue2(Value2 object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Value List</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 interpretting the object as an instance of '<em>Value List</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValueList(ValueList object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Values</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 interpretting the object as an instance of '<em>Values</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValues(Values object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>WBS Mask</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 interpretting the object as an instance of '<em>WBS Mask</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWBSMask(WBSMask object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>WBS Masks</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 interpretting the object as an instance of '<em>WBS Masks</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWBSMasks(WBSMasks object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Week Day</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 interpretting the object as an instance of '<em>Week Day</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWeekDay(WeekDay object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Week Days</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 interpretting the object as an instance of '<em>Week Days</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWeekDays(WeekDays object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Working Time</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 interpretting the object as an instance of '<em>Working Time</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkingTime(WorkingTime object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Working Times</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 interpretting the object as an instance of '<em>Working Times</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkingTimes(WorkingTimes object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting 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 interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //MsprojectSwitch
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectValidator.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectValidator.java
deleted file mode 100644
index 964c08b..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectValidator.java
+++ /dev/null
@@ -1,3583 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MsprojectValidator.java,v 1.1 2008/01/15 08:52:41 jtham Exp $
- */
-package org.eclipse.epf.msproject.util;
-
-import java.math.BigInteger;
-import java.util.Collection;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.DiagnosticChain;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.util.EObjectValidator;
-import org.eclipse.emf.ecore.xml.type.util.XMLTypeValidator;
-import org.eclipse.epf.msproject.Assignment;
-import org.eclipse.epf.msproject.Assignments;
-import org.eclipse.epf.msproject.AvailabilityPeriod;
-import org.eclipse.epf.msproject.AvailabilityPeriods;
-import org.eclipse.epf.msproject.Baseline;
-import org.eclipse.epf.msproject.Baseline2;
-import org.eclipse.epf.msproject.Baseline3;
-import org.eclipse.epf.msproject.Calendar;
-import org.eclipse.epf.msproject.Calendars;
-import org.eclipse.epf.msproject.DocumentRoot;
-import org.eclipse.epf.msproject.ExtendedAttribute;
-import org.eclipse.epf.msproject.ExtendedAttribute2;
-import org.eclipse.epf.msproject.ExtendedAttribute3;
-import org.eclipse.epf.msproject.ExtendedAttribute4;
-import org.eclipse.epf.msproject.ExtendedAttributes;
-import org.eclipse.epf.msproject.Mask;
-import org.eclipse.epf.msproject.Masks;
-import org.eclipse.epf.msproject.MsprojectPackage;
-import org.eclipse.epf.msproject.OutlineCode;
-import org.eclipse.epf.msproject.OutlineCode2;
-import org.eclipse.epf.msproject.OutlineCode3;
-import org.eclipse.epf.msproject.OutlineCodes;
-import org.eclipse.epf.msproject.PredecessorLink;
-import org.eclipse.epf.msproject.Project;
-import org.eclipse.epf.msproject.Rate;
-import org.eclipse.epf.msproject.Rates;
-import org.eclipse.epf.msproject.Resource;
-import org.eclipse.epf.msproject.Resources;
-import org.eclipse.epf.msproject.Task;
-import org.eclipse.epf.msproject.Tasks;
-import org.eclipse.epf.msproject.TimePeriod;
-import org.eclipse.epf.msproject.TimephasedDataType;
-import org.eclipse.epf.msproject.Value;
-import org.eclipse.epf.msproject.Value2;
-import org.eclipse.epf.msproject.ValueList;
-import org.eclipse.epf.msproject.Values;
-import org.eclipse.epf.msproject.WBSMask;
-import org.eclipse.epf.msproject.WBSMasks;
-import org.eclipse.epf.msproject.WeekDay;
-import org.eclipse.epf.msproject.WeekDays;
-import org.eclipse.epf.msproject.WorkingTime;
-import org.eclipse.epf.msproject.WorkingTimes;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Validator</b> for the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.epf.msproject.MsprojectPackage
- * @generated
- */
-public class MsprojectValidator extends EObjectValidator {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final MsprojectValidator INSTANCE = new MsprojectValidator();
-
-	/**
-	 * A constant for the {@link org.eclipse.emf.common.util.Diagnostic#getSource() source} of diagnostic {@link org.eclipse.emf.common.util.Diagnostic#getCode() codes} from this package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.common.util.Diagnostic#getSource()
-	 * @see org.eclipse.emf.common.util.Diagnostic#getCode()
-	 * @generated
-	 */
-	public static final String DIAGNOSTIC_SOURCE = "org.eclipse.epf.msproject";
-
-	/**
-	 * A constant with a fixed name that can be used as the base value for additional hand written constants.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 0;
-
-	/**
-	 * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static final int DIAGNOSTIC_CODE_COUNT = GENERATED_DIAGNOSTIC_CODE_COUNT;
-
-	/**
-	 * The cached base package validator.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected XMLTypeValidator xmlTypeValidator;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MsprojectValidator() {
-		super();
-		xmlTypeValidator = XMLTypeValidator.INSTANCE;
-	}
-
-	/**
-	 * Returns the package of this validator switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EPackage getEPackage() {
-	  return MsprojectPackage.eINSTANCE;
-	}
-
-	/**
-	 * Calls <code>validateXXX</code> for the corresonding classifier of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected boolean validate(int classifierID, Object value, DiagnosticChain diagnostics, Map context) {
-		switch (classifierID) {
-			case MsprojectPackage.ASSIGNMENT:
-				return validateAssignment((Assignment)value, diagnostics, context);
-			case MsprojectPackage.ASSIGNMENTS:
-				return validateAssignments((Assignments)value, diagnostics, context);
-			case MsprojectPackage.AVAILABILITY_PERIOD:
-				return validateAvailabilityPeriod((AvailabilityPeriod)value, diagnostics, context);
-			case MsprojectPackage.AVAILABILITY_PERIODS:
-				return validateAvailabilityPeriods((AvailabilityPeriods)value, diagnostics, context);
-			case MsprojectPackage.BASELINE:
-				return validateBaseline((Baseline)value, diagnostics, context);
-			case MsprojectPackage.BASELINE2:
-				return validateBaseline2((Baseline2)value, diagnostics, context);
-			case MsprojectPackage.BASELINE3:
-				return validateBaseline3((Baseline3)value, diagnostics, context);
-			case MsprojectPackage.CALENDAR:
-				return validateCalendar((Calendar)value, diagnostics, context);
-			case MsprojectPackage.CALENDARS:
-				return validateCalendars((Calendars)value, diagnostics, context);
-			case MsprojectPackage.DOCUMENT_ROOT:
-				return validateDocumentRoot((DocumentRoot)value, diagnostics, context);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE:
-				return validateExtendedAttribute((ExtendedAttribute)value, diagnostics, context);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE2:
-				return validateExtendedAttribute2((ExtendedAttribute2)value, diagnostics, context);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE3:
-				return validateExtendedAttribute3((ExtendedAttribute3)value, diagnostics, context);
-			case MsprojectPackage.EXTENDED_ATTRIBUTE4:
-				return validateExtendedAttribute4((ExtendedAttribute4)value, diagnostics, context);
-			case MsprojectPackage.EXTENDED_ATTRIBUTES:
-				return validateExtendedAttributes((ExtendedAttributes)value, diagnostics, context);
-			case MsprojectPackage.MASK:
-				return validateMask((Mask)value, diagnostics, context);
-			case MsprojectPackage.MASKS:
-				return validateMasks((Masks)value, diagnostics, context);
-			case MsprojectPackage.OUTLINE_CODE:
-				return validateOutlineCode((OutlineCode)value, diagnostics, context);
-			case MsprojectPackage.OUTLINE_CODE2:
-				return validateOutlineCode2((OutlineCode2)value, diagnostics, context);
-			case MsprojectPackage.OUTLINE_CODE3:
-				return validateOutlineCode3((OutlineCode3)value, diagnostics, context);
-			case MsprojectPackage.OUTLINE_CODES:
-				return validateOutlineCodes((OutlineCodes)value, diagnostics, context);
-			case MsprojectPackage.PREDECESSOR_LINK:
-				return validatePredecessorLink((PredecessorLink)value, diagnostics, context);
-			case MsprojectPackage.PROJECT:
-				return validateProject((Project)value, diagnostics, context);
-			case MsprojectPackage.RATE:
-				return validateRate((Rate)value, diagnostics, context);
-			case MsprojectPackage.RATES:
-				return validateRates((Rates)value, diagnostics, context);
-			case MsprojectPackage.RESOURCE:
-				return validateResource((Resource)value, diagnostics, context);
-			case MsprojectPackage.RESOURCES:
-				return validateResources((Resources)value, diagnostics, context);
-			case MsprojectPackage.TASK:
-				return validateTask((Task)value, diagnostics, context);
-			case MsprojectPackage.TASKS:
-				return validateTasks((Tasks)value, diagnostics, context);
-			case MsprojectPackage.TIME_PERIOD:
-				return validateTimePeriod((TimePeriod)value, diagnostics, context);
-			case MsprojectPackage.TIMEPHASED_DATA_TYPE:
-				return validateTimephasedDataType((TimephasedDataType)value, diagnostics, context);
-			case MsprojectPackage.VALUE:
-				return validateValue((Value)value, diagnostics, context);
-			case MsprojectPackage.VALUE2:
-				return validateValue2((Value2)value, diagnostics, context);
-			case MsprojectPackage.VALUE_LIST:
-				return validateValueList((ValueList)value, diagnostics, context);
-			case MsprojectPackage.VALUES:
-				return validateValues((Values)value, diagnostics, context);
-			case MsprojectPackage.WBS_MASK:
-				return validateWBSMask((WBSMask)value, diagnostics, context);
-			case MsprojectPackage.WBS_MASKS:
-				return validateWBSMasks((WBSMasks)value, diagnostics, context);
-			case MsprojectPackage.WEEK_DAY:
-				return validateWeekDay((WeekDay)value, diagnostics, context);
-			case MsprojectPackage.WEEK_DAYS:
-				return validateWeekDays((WeekDays)value, diagnostics, context);
-			case MsprojectPackage.WORKING_TIME:
-				return validateWorkingTime((WorkingTime)value, diagnostics, context);
-			case MsprojectPackage.WORKING_TIMES:
-				return validateWorkingTimes((WorkingTimes)value, diagnostics, context);
-			case MsprojectPackage.ACCRUE_AT:
-				return validateAccrueAt((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.ACTIVE_DIRECTORY_GUID_TYPE:
-				return validateActiveDirectoryGUIDType((String)value, diagnostics, context);
-			case MsprojectPackage.ALIAS_TYPE:
-				return validateAliasType((String)value, diagnostics, context);
-			case MsprojectPackage.AUTHOR_TYPE:
-				return validateAuthorType((String)value, diagnostics, context);
-			case MsprojectPackage.BASELINE_FOR_EARNED_VALUE_TYPE:
-				return validateBaselineForEarnedValueType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.BOOKING_TYPE_TYPE:
-				return validateBookingTypeType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.BOOKING_TYPE_TYPE1:
-				return validateBookingTypeType1((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.CALCULATION_TYPE_TYPE:
-				return validateCalculationTypeType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.CATEGORY_TYPE:
-				return validateCategoryType((String)value, diagnostics, context);
-			case MsprojectPackage.CODE_TYPE:
-				return validateCodeType((String)value, diagnostics, context);
-			case MsprojectPackage.COMPANY_TYPE:
-				return validateCompanyType((String)value, diagnostics, context);
-			case MsprojectPackage.CONSTRAINT_TYPE_TYPE:
-				return validateConstraintTypeType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.CONTACT_TYPE:
-				return validateContactType((String)value, diagnostics, context);
-			case MsprojectPackage.COST_RATE_TABLE_TYPE:
-				return validateCostRateTableType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.CURRENCY_SYMBOL_POSITION_TYPE:
-				return validateCurrencySymbolPositionType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.CURRENCY_SYMBOL_TYPE:
-				return validateCurrencySymbolType((String)value, diagnostics, context);
-			case MsprojectPackage.DAY_TYPE_TYPE:
-				return validateDayTypeType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DEFAULT_FIXED_COST_ACCRUAL_TYPE:
-				return validateDefaultFixedCostAccrualType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DEFAULT_TASK_EV_METHOD_TYPE:
-				return validateDefaultTaskEVMethodType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DEFAULT_TASK_TYPE_TYPE:
-				return validateDefaultTaskTypeType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DURATION_FORMAT_TYPE:
-				return validateDurationFormatType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DURATION_FORMAT_TYPE1:
-				return validateDurationFormatType1((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DURATION_FORMAT_TYPE2:
-				return validateDurationFormatType2((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DURATION_FORMAT_TYPE3:
-				return validateDurationFormatType3((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DURATION_FORMAT_TYPE4:
-				return validateDurationFormatType4((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.DURATION_FORMAT_TYPE5:
-				return validateDurationFormatType5((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.EARNED_VALUE_METHOD_TYPE:
-				return validateEarnedValueMethodType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.EARNED_VALUE_METHOD_TYPE1:
-				return validateEarnedValueMethodType1((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.EMAIL_ADDRESS_TYPE:
-				return validateEmailAddressType((String)value, diagnostics, context);
-			case MsprojectPackage.EXTERNAL_TASK_PROJECT_TYPE:
-				return validateExternalTaskProjectType((String)value, diagnostics, context);
-			case MsprojectPackage.FIXED_COST_ACCRUAL_TYPE:
-				return validateFixedCostAccrualType((String)value, diagnostics, context);
-			case MsprojectPackage.FY_START_DATE_TYPE:
-				return validateFYStartDateType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.GROUP_TYPE:
-				return validateGroupType((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE:
-				return validateHyperlinkAddressType((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE1:
-				return validateHyperlinkAddressType1((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_ADDRESS_TYPE2:
-				return validateHyperlinkAddressType2((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE:
-				return validateHyperlinkSubAddressType((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE1:
-				return validateHyperlinkSubAddressType1((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_SUB_ADDRESS_TYPE2:
-				return validateHyperlinkSubAddressType2((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_TYPE:
-				return validateHyperlinkType((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_TYPE1:
-				return validateHyperlinkType1((String)value, diagnostics, context);
-			case MsprojectPackage.HYPERLINK_TYPE2:
-				return validateHyperlinkType2((String)value, diagnostics, context);
-			case MsprojectPackage.INITIALS_TYPE:
-				return validateInitialsType((String)value, diagnostics, context);
-			case MsprojectPackage.LAG_FORMAT_TYPE:
-				return validateLagFormatType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.LEVELING_DELAY_FORMAT_TYPE:
-				return validateLevelingDelayFormatType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.LEVELING_DELAY_FORMAT_TYPE1:
-				return validateLevelingDelayFormatType1((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.MANAGER_TYPE:
-				return validateManagerType((String)value, diagnostics, context);
-			case MsprojectPackage.MATERIAL_LABEL_TYPE:
-				return validateMaterialLabelType((String)value, diagnostics, context);
-			case MsprojectPackage.NAME_TYPE:
-				return validateNameType((String)value, diagnostics, context);
-			case MsprojectPackage.NAME_TYPE1:
-				return validateNameType1((String)value, diagnostics, context);
-			case MsprojectPackage.NAME_TYPE2:
-				return validateNameType2((String)value, diagnostics, context);
-			case MsprojectPackage.NAME_TYPE3:
-				return validateNameType3((String)value, diagnostics, context);
-			case MsprojectPackage.NEW_TASK_START_DATE_TYPE:
-				return validateNewTaskStartDateType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.NT_ACCOUNT_TYPE:
-				return validateNTAccountType((String)value, diagnostics, context);
-			case MsprojectPackage.OUTLINE_NUMBER_TYPE:
-				return validateOutlineNumberType((String)value, diagnostics, context);
-			case MsprojectPackage.OVERTIME_RATE_FORMAT_TYPE:
-				return validateOvertimeRateFormatType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.OVERTIME_RATE_FORMAT_TYPE1:
-				return validateOvertimeRateFormatType1((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.PHONETIC_ALIAS_TYPE:
-				return validatePhoneticAliasType((String)value, diagnostics, context);
-			case MsprojectPackage.PHONETICS_TYPE:
-				return validatePhoneticsType((String)value, diagnostics, context);
-			case MsprojectPackage.PREFIX_TYPE:
-				return validatePrefixType((String)value, diagnostics, context);
-			case MsprojectPackage.RATE_TABLE_TYPE:
-				return validateRateTableType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.ROLLUP_TYPE_TYPE:
-				return validateRollupTypeType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.STANDARD_RATE_FORMAT_TYPE:
-				return validateStandardRateFormatType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.STANDARD_RATE_FORMAT_TYPE1:
-				return validateStandardRateFormatType1((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.SUBJECT_TYPE:
-				return validateSubjectType((String)value, diagnostics, context);
-			case MsprojectPackage.SUBPROJECT_NAME_TYPE:
-				return validateSubprojectNameType((String)value, diagnostics, context);
-			case MsprojectPackage.TITLE_TYPE:
-				return validateTitleType((String)value, diagnostics, context);
-			case MsprojectPackage.TYPE_TYPE:
-				return validateTypeType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.TYPE_TYPE1:
-				return validateTypeType1((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.TYPE_TYPE2:
-				return validateTypeType2((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.TYPE_TYPE3:
-				return validateTypeType3((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.TYPE_TYPE4:
-				return validateTypeType4((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.TYPE_TYPE5:
-				return validateTypeType5((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.UID_TYPE:
-				return validateUIDType((String)value, diagnostics, context);
-			case MsprojectPackage.UNIT_TYPE:
-				return validateUnitType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.VALUELIST_SORT_ORDER_TYPE:
-				return validateValuelistSortOrderType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.WEEK_START_DAY_TYPE:
-				return validateWeekStartDayType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.WORK_CONTOUR_TYPE:
-				return validateWorkContourType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.WORK_FORMAT_TYPE:
-				return validateWorkFormatType((BigInteger)value, diagnostics, context);
-			case MsprojectPackage.WORK_GROUP_TYPE:
-				return validateWorkGroupType((BigInteger)value, diagnostics, context);
-			default: 
-				return true;
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAssignment(Assignment assignment, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(assignment, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAssignments(Assignments assignments, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(assignments, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAvailabilityPeriod(AvailabilityPeriod availabilityPeriod, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(availabilityPeriod, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAvailabilityPeriods(AvailabilityPeriods availabilityPeriods, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(availabilityPeriods, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBaseline(Baseline baseline, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(baseline, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBaseline2(Baseline2 baseline2, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(baseline2, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBaseline3(Baseline3 baseline3, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(baseline3, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCalendar(Calendar calendar, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(calendar, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCalendars(Calendars calendars, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(calendars, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDocumentRoot(DocumentRoot documentRoot, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(documentRoot, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateExtendedAttribute(ExtendedAttribute extendedAttribute, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(extendedAttribute, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateExtendedAttribute2(ExtendedAttribute2 extendedAttribute2, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(extendedAttribute2, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateExtendedAttribute3(ExtendedAttribute3 extendedAttribute3, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(extendedAttribute3, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateExtendedAttribute4(ExtendedAttribute4 extendedAttribute4, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(extendedAttribute4, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateExtendedAttributes(ExtendedAttributes extendedAttributes, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(extendedAttributes, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateMask(Mask mask, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(mask, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateMasks(Masks masks, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(masks, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOutlineCode(OutlineCode outlineCode, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(outlineCode, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOutlineCode2(OutlineCode2 outlineCode2, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(outlineCode2, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOutlineCode3(OutlineCode3 outlineCode3, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(outlineCode3, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOutlineCodes(OutlineCodes outlineCodes, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(outlineCodes, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validatePredecessorLink(PredecessorLink predecessorLink, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(predecessorLink, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateProject(Project project, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(project, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateRate(Rate rate, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(rate, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateRates(Rates rates, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(rates, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateResource(Resource resource, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(resource, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateResources(Resources resources, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(resources, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTask(Task task, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(task, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTasks(Tasks tasks, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(tasks, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTimePeriod(TimePeriod timePeriod, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(timePeriod, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTimephasedDataType(TimephasedDataType timephasedDataType, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(timephasedDataType, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateValue(Value value, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(value, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateValue2(Value2 value2, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(value2, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateValueList(ValueList valueList, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(valueList, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateValues(Values values, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(values, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWBSMask(WBSMask wbsMask, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(wbsMask, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWBSMasks(WBSMasks wbsMasks, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(wbsMasks, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWeekDay(WeekDay weekDay, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(weekDay, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWeekDays(WeekDays weekDays, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(weekDays, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkingTime(WorkingTime workingTime, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(workingTime, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkingTimes(WorkingTimes workingTimes, DiagnosticChain diagnostics, Map context) {
-		return validate_EveryDefaultConstraint(workingTimes, diagnostics, context);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAccrueAt(BigInteger accrueAt, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateAccrueAt_Enumeration(accrueAt, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateAccrueAt_Enumeration
-	 */
-	public static final Collection ACCRUE_AT__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Accrue At</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAccrueAt_Enumeration(BigInteger accrueAt, DiagnosticChain diagnostics, Map context) {
-		boolean result = ACCRUE_AT__ENUMERATION__VALUES.contains(accrueAt);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getAccrueAt(), accrueAt, ACCRUE_AT__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateActiveDirectoryGUIDType(String activeDirectoryGUIDType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateActiveDirectoryGUIDType_MaxLength(activeDirectoryGUIDType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Active Directory GUID Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateActiveDirectoryGUIDType_MaxLength(String activeDirectoryGUIDType, DiagnosticChain diagnostics, Map context) {
-		int length = activeDirectoryGUIDType.length();  
-		boolean result = length <= 16;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getActiveDirectoryGUIDType(), activeDirectoryGUIDType, length, 16, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAliasType(String aliasType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateAliasType_MaxLength(aliasType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Alias Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAliasType_MaxLength(String aliasType, DiagnosticChain diagnostics, Map context) {
-		int length = aliasType.length();  
-		boolean result = length <= 50;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getAliasType(), aliasType, length, 50, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAuthorType(String authorType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateAuthorType_MaxLength(authorType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Author Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateAuthorType_MaxLength(String authorType, DiagnosticChain diagnostics, Map context) {
-		int length = authorType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getAuthorType(), authorType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBaselineForEarnedValueType(BigInteger baselineForEarnedValueType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateBaselineForEarnedValueType_Enumeration(baselineForEarnedValueType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateBaselineForEarnedValueType_Enumeration
-	 */
-	public static final Collection BASELINE_FOR_EARNED_VALUE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Baseline For Earned Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBaselineForEarnedValueType_Enumeration(BigInteger baselineForEarnedValueType, DiagnosticChain diagnostics, Map context) {
-		boolean result = BASELINE_FOR_EARNED_VALUE_TYPE__ENUMERATION__VALUES.contains(baselineForEarnedValueType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getBaselineForEarnedValueType(), baselineForEarnedValueType, BASELINE_FOR_EARNED_VALUE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBookingTypeType(BigInteger bookingTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateBookingTypeType_Enumeration(bookingTypeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateBookingTypeType_Enumeration
-	 */
-	public static final Collection BOOKING_TYPE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Booking Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBookingTypeType_Enumeration(BigInteger bookingTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = BOOKING_TYPE_TYPE__ENUMERATION__VALUES.contains(bookingTypeType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getBookingTypeType(), bookingTypeType, BOOKING_TYPE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBookingTypeType1(BigInteger bookingTypeType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateBookingTypeType1_Enumeration(bookingTypeType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateBookingTypeType1_Enumeration
-	 */
-	public static final Collection BOOKING_TYPE_TYPE1__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Booking Type Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateBookingTypeType1_Enumeration(BigInteger bookingTypeType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = BOOKING_TYPE_TYPE1__ENUMERATION__VALUES.contains(bookingTypeType1);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getBookingTypeType1(), bookingTypeType1, BOOKING_TYPE_TYPE1__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCalculationTypeType(BigInteger calculationTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateCalculationTypeType_Enumeration(calculationTypeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateCalculationTypeType_Enumeration
-	 */
-	public static final Collection CALCULATION_TYPE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Calculation Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCalculationTypeType_Enumeration(BigInteger calculationTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = CALCULATION_TYPE_TYPE__ENUMERATION__VALUES.contains(calculationTypeType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getCalculationTypeType(), calculationTypeType, CALCULATION_TYPE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCategoryType(String categoryType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateCategoryType_MaxLength(categoryType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Category Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCategoryType_MaxLength(String categoryType, DiagnosticChain diagnostics, Map context) {
-		int length = categoryType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getCategoryType(), categoryType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCodeType(String codeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateCodeType_MaxLength(codeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Code Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCodeType_MaxLength(String codeType, DiagnosticChain diagnostics, Map context) {
-		int length = codeType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getCodeType(), codeType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCompanyType(String companyType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateCompanyType_MaxLength(companyType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Company Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCompanyType_MaxLength(String companyType, DiagnosticChain diagnostics, Map context) {
-		int length = companyType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getCompanyType(), companyType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateConstraintTypeType(BigInteger constraintTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateConstraintTypeType_Enumeration(constraintTypeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateConstraintTypeType_Enumeration
-	 */
-	public static final Collection CONSTRAINT_TYPE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Constraint Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateConstraintTypeType_Enumeration(BigInteger constraintTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = CONSTRAINT_TYPE_TYPE__ENUMERATION__VALUES.contains(constraintTypeType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getConstraintTypeType(), constraintTypeType, CONSTRAINT_TYPE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateContactType(String contactType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateContactType_MaxLength(contactType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Contact Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateContactType_MaxLength(String contactType, DiagnosticChain diagnostics, Map context) {
-		int length = contactType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getContactType(), contactType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCostRateTableType(BigInteger costRateTableType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateCostRateTableType_Enumeration(costRateTableType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateCostRateTableType_Enumeration
-	 */
-	public static final Collection COST_RATE_TABLE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Cost Rate Table Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCostRateTableType_Enumeration(BigInteger costRateTableType, DiagnosticChain diagnostics, Map context) {
-		boolean result = COST_RATE_TABLE_TYPE__ENUMERATION__VALUES.contains(costRateTableType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getCostRateTableType(), costRateTableType, COST_RATE_TABLE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCurrencySymbolPositionType(BigInteger currencySymbolPositionType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateCurrencySymbolPositionType_Enumeration(currencySymbolPositionType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateCurrencySymbolPositionType_Enumeration
-	 */
-	public static final Collection CURRENCY_SYMBOL_POSITION_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Currency Symbol Position Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCurrencySymbolPositionType_Enumeration(BigInteger currencySymbolPositionType, DiagnosticChain diagnostics, Map context) {
-		boolean result = CURRENCY_SYMBOL_POSITION_TYPE__ENUMERATION__VALUES.contains(currencySymbolPositionType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getCurrencySymbolPositionType(), currencySymbolPositionType, CURRENCY_SYMBOL_POSITION_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCurrencySymbolType(String currencySymbolType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateCurrencySymbolType_MaxLength(currencySymbolType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Currency Symbol Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateCurrencySymbolType_MaxLength(String currencySymbolType, DiagnosticChain diagnostics, Map context) {
-		int length = currencySymbolType.length();  
-		boolean result = length <= 20;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getCurrencySymbolType(), currencySymbolType, length, 20, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDayTypeType(BigInteger dayTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDayTypeType_Enumeration(dayTypeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDayTypeType_Enumeration
-	 */
-	public static final Collection DAY_TYPE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Day Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDayTypeType_Enumeration(BigInteger dayTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = DAY_TYPE_TYPE__ENUMERATION__VALUES.contains(dayTypeType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDayTypeType(), dayTypeType, DAY_TYPE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDefaultFixedCostAccrualType(BigInteger defaultFixedCostAccrualType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDefaultFixedCostAccrualType_Enumeration(defaultFixedCostAccrualType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDefaultFixedCostAccrualType_Enumeration
-	 */
-	public static final Collection DEFAULT_FIXED_COST_ACCRUAL_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Default Fixed Cost Accrual Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDefaultFixedCostAccrualType_Enumeration(BigInteger defaultFixedCostAccrualType, DiagnosticChain diagnostics, Map context) {
-		boolean result = DEFAULT_FIXED_COST_ACCRUAL_TYPE__ENUMERATION__VALUES.contains(defaultFixedCostAccrualType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDefaultFixedCostAccrualType(), defaultFixedCostAccrualType, DEFAULT_FIXED_COST_ACCRUAL_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDefaultTaskEVMethodType(BigInteger defaultTaskEVMethodType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDefaultTaskEVMethodType_Enumeration(defaultTaskEVMethodType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDefaultTaskEVMethodType_Enumeration
-	 */
-	public static final Collection DEFAULT_TASK_EV_METHOD_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Default Task EV Method Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDefaultTaskEVMethodType_Enumeration(BigInteger defaultTaskEVMethodType, DiagnosticChain diagnostics, Map context) {
-		boolean result = DEFAULT_TASK_EV_METHOD_TYPE__ENUMERATION__VALUES.contains(defaultTaskEVMethodType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDefaultTaskEVMethodType(), defaultTaskEVMethodType, DEFAULT_TASK_EV_METHOD_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDefaultTaskTypeType(BigInteger defaultTaskTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDefaultTaskTypeType_Enumeration(defaultTaskTypeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDefaultTaskTypeType_Enumeration
-	 */
-	public static final Collection DEFAULT_TASK_TYPE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Default Task Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDefaultTaskTypeType_Enumeration(BigInteger defaultTaskTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = DEFAULT_TASK_TYPE_TYPE__ENUMERATION__VALUES.contains(defaultTaskTypeType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDefaultTaskTypeType(), defaultTaskTypeType, DEFAULT_TASK_TYPE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType(BigInteger durationFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDurationFormatType_Enumeration(durationFormatType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDurationFormatType_Enumeration
-	 */
-	public static final Collection DURATION_FORMAT_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Duration Format Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType_Enumeration(BigInteger durationFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = DURATION_FORMAT_TYPE__ENUMERATION__VALUES.contains(durationFormatType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDurationFormatType(), durationFormatType, DURATION_FORMAT_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType1(BigInteger durationFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDurationFormatType1_Enumeration(durationFormatType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDurationFormatType1_Enumeration
-	 */
-	public static final Collection DURATION_FORMAT_TYPE1__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Duration Format Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType1_Enumeration(BigInteger durationFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = DURATION_FORMAT_TYPE1__ENUMERATION__VALUES.contains(durationFormatType1);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDurationFormatType1(), durationFormatType1, DURATION_FORMAT_TYPE1__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType2(BigInteger durationFormatType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDurationFormatType2_Enumeration(durationFormatType2, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDurationFormatType2_Enumeration
-	 */
-	public static final Collection DURATION_FORMAT_TYPE2__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Duration Format Type2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType2_Enumeration(BigInteger durationFormatType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = DURATION_FORMAT_TYPE2__ENUMERATION__VALUES.contains(durationFormatType2);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDurationFormatType2(), durationFormatType2, DURATION_FORMAT_TYPE2__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType3(BigInteger durationFormatType3, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDurationFormatType3_Enumeration(durationFormatType3, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDurationFormatType3_Enumeration
-	 */
-	public static final Collection DURATION_FORMAT_TYPE3__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Duration Format Type3</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType3_Enumeration(BigInteger durationFormatType3, DiagnosticChain diagnostics, Map context) {
-		boolean result = DURATION_FORMAT_TYPE3__ENUMERATION__VALUES.contains(durationFormatType3);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDurationFormatType3(), durationFormatType3, DURATION_FORMAT_TYPE3__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType4(BigInteger durationFormatType4, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDurationFormatType4_Enumeration(durationFormatType4, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDurationFormatType4_Enumeration
-	 */
-	public static final Collection DURATION_FORMAT_TYPE4__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Duration Format Type4</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType4_Enumeration(BigInteger durationFormatType4, DiagnosticChain diagnostics, Map context) {
-		boolean result = DURATION_FORMAT_TYPE4__ENUMERATION__VALUES.contains(durationFormatType4);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDurationFormatType4(), durationFormatType4, DURATION_FORMAT_TYPE4__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType5(BigInteger durationFormatType5, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateDurationFormatType5_Enumeration(durationFormatType5, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateDurationFormatType5_Enumeration
-	 */
-	public static final Collection DURATION_FORMAT_TYPE5__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Duration Format Type5</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateDurationFormatType5_Enumeration(BigInteger durationFormatType5, DiagnosticChain diagnostics, Map context) {
-		boolean result = DURATION_FORMAT_TYPE5__ENUMERATION__VALUES.contains(durationFormatType5);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getDurationFormatType5(), durationFormatType5, DURATION_FORMAT_TYPE5__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateEarnedValueMethodType(BigInteger earnedValueMethodType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateEarnedValueMethodType_Enumeration(earnedValueMethodType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateEarnedValueMethodType_Enumeration
-	 */
-	public static final Collection EARNED_VALUE_METHOD_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Earned Value Method Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateEarnedValueMethodType_Enumeration(BigInteger earnedValueMethodType, DiagnosticChain diagnostics, Map context) {
-		boolean result = EARNED_VALUE_METHOD_TYPE__ENUMERATION__VALUES.contains(earnedValueMethodType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getEarnedValueMethodType(), earnedValueMethodType, EARNED_VALUE_METHOD_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateEarnedValueMethodType1(BigInteger earnedValueMethodType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateEarnedValueMethodType1_Enumeration(earnedValueMethodType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateEarnedValueMethodType1_Enumeration
-	 */
-	public static final Collection EARNED_VALUE_METHOD_TYPE1__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Earned Value Method Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateEarnedValueMethodType1_Enumeration(BigInteger earnedValueMethodType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = EARNED_VALUE_METHOD_TYPE1__ENUMERATION__VALUES.contains(earnedValueMethodType1);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getEarnedValueMethodType1(), earnedValueMethodType1, EARNED_VALUE_METHOD_TYPE1__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateEmailAddressType(String emailAddressType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateEmailAddressType_MaxLength(emailAddressType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Email Address Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateEmailAddressType_MaxLength(String emailAddressType, DiagnosticChain diagnostics, Map context) {
-		int length = emailAddressType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getEmailAddressType(), emailAddressType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateExternalTaskProjectType(String externalTaskProjectType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateExternalTaskProjectType_MaxLength(externalTaskProjectType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>External Task Project Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateExternalTaskProjectType_MaxLength(String externalTaskProjectType, DiagnosticChain diagnostics, Map context) {
-		int length = externalTaskProjectType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getExternalTaskProjectType(), externalTaskProjectType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateFixedCostAccrualType(String fixedCostAccrualType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateFixedCostAccrualType_Enumeration(fixedCostAccrualType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateFixedCostAccrualType_Enumeration
-	 */
-	public static final Collection FIXED_COST_ACCRUAL_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 "1",
-				 "2",
-				 "3"
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Fixed Cost Accrual Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateFixedCostAccrualType_Enumeration(String fixedCostAccrualType, DiagnosticChain diagnostics, Map context) {
-		boolean result = FIXED_COST_ACCRUAL_TYPE__ENUMERATION__VALUES.contains(fixedCostAccrualType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getFixedCostAccrualType(), fixedCostAccrualType, FIXED_COST_ACCRUAL_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateFYStartDateType(BigInteger fyStartDateType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateFYStartDateType_Enumeration(fyStartDateType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateFYStartDateType_Enumeration
-	 */
-	public static final Collection FY_START_DATE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>FY Start Date Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateFYStartDateType_Enumeration(BigInteger fyStartDateType, DiagnosticChain diagnostics, Map context) {
-		boolean result = FY_START_DATE_TYPE__ENUMERATION__VALUES.contains(fyStartDateType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getFYStartDateType(), fyStartDateType, FY_START_DATE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateGroupType(String groupType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateGroupType_MaxLength(groupType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Group Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateGroupType_MaxLength(String groupType, DiagnosticChain diagnostics, Map context) {
-		int length = groupType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getGroupType(), groupType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkAddressType(String hyperlinkAddressType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkAddressType_MaxLength(hyperlinkAddressType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Address Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkAddressType_MaxLength(String hyperlinkAddressType, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkAddressType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkAddressType(), hyperlinkAddressType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkAddressType1(String hyperlinkAddressType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkAddressType1_MaxLength(hyperlinkAddressType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Address Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkAddressType1_MaxLength(String hyperlinkAddressType1, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkAddressType1.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkAddressType1(), hyperlinkAddressType1, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkAddressType2(String hyperlinkAddressType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkAddressType2_MaxLength(hyperlinkAddressType2, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Address Type2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkAddressType2_MaxLength(String hyperlinkAddressType2, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkAddressType2.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkAddressType2(), hyperlinkAddressType2, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkSubAddressType(String hyperlinkSubAddressType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkSubAddressType_MaxLength(hyperlinkSubAddressType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Sub Address Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkSubAddressType_MaxLength(String hyperlinkSubAddressType, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkSubAddressType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkSubAddressType(), hyperlinkSubAddressType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkSubAddressType1(String hyperlinkSubAddressType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkSubAddressType1_MaxLength(hyperlinkSubAddressType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Sub Address Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkSubAddressType1_MaxLength(String hyperlinkSubAddressType1, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkSubAddressType1.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkSubAddressType1(), hyperlinkSubAddressType1, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkSubAddressType2(String hyperlinkSubAddressType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkSubAddressType2_MaxLength(hyperlinkSubAddressType2, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Sub Address Type2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkSubAddressType2_MaxLength(String hyperlinkSubAddressType2, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkSubAddressType2.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkSubAddressType2(), hyperlinkSubAddressType2, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkType(String hyperlinkType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkType_MaxLength(hyperlinkType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkType_MaxLength(String hyperlinkType, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkType(), hyperlinkType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkType1(String hyperlinkType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkType1_MaxLength(hyperlinkType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkType1_MaxLength(String hyperlinkType1, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkType1.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkType1(), hyperlinkType1, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkType2(String hyperlinkType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateHyperlinkType2_MaxLength(hyperlinkType2, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Hyperlink Type2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateHyperlinkType2_MaxLength(String hyperlinkType2, DiagnosticChain diagnostics, Map context) {
-		int length = hyperlinkType2.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getHyperlinkType2(), hyperlinkType2, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateInitialsType(String initialsType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateInitialsType_MaxLength(initialsType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Initials Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateInitialsType_MaxLength(String initialsType, DiagnosticChain diagnostics, Map context) {
-		int length = initialsType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getInitialsType(), initialsType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateLagFormatType(BigInteger lagFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateLagFormatType_Enumeration(lagFormatType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateLagFormatType_Enumeration
-	 */
-	public static final Collection LAG_FORMAT_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Lag Format Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateLagFormatType_Enumeration(BigInteger lagFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = LAG_FORMAT_TYPE__ENUMERATION__VALUES.contains(lagFormatType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getLagFormatType(), lagFormatType, LAG_FORMAT_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateLevelingDelayFormatType(BigInteger levelingDelayFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateLevelingDelayFormatType_Enumeration(levelingDelayFormatType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateLevelingDelayFormatType_Enumeration
-	 */
-	public static final Collection LEVELING_DELAY_FORMAT_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Leveling Delay Format Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateLevelingDelayFormatType_Enumeration(BigInteger levelingDelayFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = LEVELING_DELAY_FORMAT_TYPE__ENUMERATION__VALUES.contains(levelingDelayFormatType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getLevelingDelayFormatType(), levelingDelayFormatType, LEVELING_DELAY_FORMAT_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateLevelingDelayFormatType1(BigInteger levelingDelayFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateLevelingDelayFormatType1_Enumeration(levelingDelayFormatType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateLevelingDelayFormatType1_Enumeration
-	 */
-	public static final Collection LEVELING_DELAY_FORMAT_TYPE1__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("12"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Leveling Delay Format Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateLevelingDelayFormatType1_Enumeration(BigInteger levelingDelayFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = LEVELING_DELAY_FORMAT_TYPE1__ENUMERATION__VALUES.contains(levelingDelayFormatType1);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getLevelingDelayFormatType1(), levelingDelayFormatType1, LEVELING_DELAY_FORMAT_TYPE1__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateManagerType(String managerType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateManagerType_MaxLength(managerType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Manager Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateManagerType_MaxLength(String managerType, DiagnosticChain diagnostics, Map context) {
-		int length = managerType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getManagerType(), managerType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateMaterialLabelType(String materialLabelType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateMaterialLabelType_MaxLength(materialLabelType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Material Label Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateMaterialLabelType_MaxLength(String materialLabelType, DiagnosticChain diagnostics, Map context) {
-		int length = materialLabelType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getMaterialLabelType(), materialLabelType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType(String nameType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateNameType_MaxLength(nameType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType_MaxLength(String nameType, DiagnosticChain diagnostics, Map context) {
-		int length = nameType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getNameType(), nameType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType1(String nameType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateNameType1_MaxLength(nameType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Name Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType1_MaxLength(String nameType1, DiagnosticChain diagnostics, Map context) {
-		int length = nameType1.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getNameType1(), nameType1, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType2(String nameType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateNameType2_MaxLength(nameType2, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Name Type2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType2_MaxLength(String nameType2, DiagnosticChain diagnostics, Map context) {
-		int length = nameType2.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getNameType2(), nameType2, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType3(String nameType3, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateNameType3_MaxLength(nameType3, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Name Type3</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNameType3_MaxLength(String nameType3, DiagnosticChain diagnostics, Map context) {
-		int length = nameType3.length();  
-		boolean result = length <= 255;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getNameType3(), nameType3, length, 255, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNewTaskStartDateType(BigInteger newTaskStartDateType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateNewTaskStartDateType_Enumeration(newTaskStartDateType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateNewTaskStartDateType_Enumeration
-	 */
-	public static final Collection NEW_TASK_START_DATE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>New Task Start Date Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNewTaskStartDateType_Enumeration(BigInteger newTaskStartDateType, DiagnosticChain diagnostics, Map context) {
-		boolean result = NEW_TASK_START_DATE_TYPE__ENUMERATION__VALUES.contains(newTaskStartDateType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getNewTaskStartDateType(), newTaskStartDateType, NEW_TASK_START_DATE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNTAccountType(String ntAccountType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateNTAccountType_MaxLength(ntAccountType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>NT Account Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateNTAccountType_MaxLength(String ntAccountType, DiagnosticChain diagnostics, Map context) {
-		int length = ntAccountType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getNTAccountType(), ntAccountType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOutlineNumberType(String outlineNumberType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateOutlineNumberType_MaxLength(outlineNumberType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Outline Number Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOutlineNumberType_MaxLength(String outlineNumberType, DiagnosticChain diagnostics, Map context) {
-		int length = outlineNumberType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getOutlineNumberType(), outlineNumberType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOvertimeRateFormatType(BigInteger overtimeRateFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateOvertimeRateFormatType_Enumeration(overtimeRateFormatType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateOvertimeRateFormatType_Enumeration
-	 */
-	public static final Collection OVERTIME_RATE_FORMAT_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("7")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Overtime Rate Format Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOvertimeRateFormatType_Enumeration(BigInteger overtimeRateFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = OVERTIME_RATE_FORMAT_TYPE__ENUMERATION__VALUES.contains(overtimeRateFormatType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getOvertimeRateFormatType(), overtimeRateFormatType, OVERTIME_RATE_FORMAT_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOvertimeRateFormatType1(BigInteger overtimeRateFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateOvertimeRateFormatType1_Enumeration(overtimeRateFormatType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateOvertimeRateFormatType1_Enumeration
-	 */
-	public static final Collection OVERTIME_RATE_FORMAT_TYPE1__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("7")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Overtime Rate Format Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateOvertimeRateFormatType1_Enumeration(BigInteger overtimeRateFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = OVERTIME_RATE_FORMAT_TYPE1__ENUMERATION__VALUES.contains(overtimeRateFormatType1);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getOvertimeRateFormatType1(), overtimeRateFormatType1, OVERTIME_RATE_FORMAT_TYPE1__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validatePhoneticAliasType(String phoneticAliasType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validatePhoneticAliasType_MaxLength(phoneticAliasType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Phonetic Alias Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validatePhoneticAliasType_MaxLength(String phoneticAliasType, DiagnosticChain diagnostics, Map context) {
-		int length = phoneticAliasType.length();  
-		boolean result = length <= 50;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getPhoneticAliasType(), phoneticAliasType, length, 50, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validatePhoneticsType(String phoneticsType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validatePhoneticsType_MaxLength(phoneticsType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Phonetics Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validatePhoneticsType_MaxLength(String phoneticsType, DiagnosticChain diagnostics, Map context) {
-		int length = phoneticsType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getPhoneticsType(), phoneticsType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validatePrefixType(String prefixType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validatePrefixType_MaxLength(prefixType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Prefix Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validatePrefixType_MaxLength(String prefixType, DiagnosticChain diagnostics, Map context) {
-		int length = prefixType.length();  
-		boolean result = length <= 50;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getPrefixType(), prefixType, length, 50, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateRateTableType(BigInteger rateTableType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateRateTableType_Enumeration(rateTableType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateRateTableType_Enumeration
-	 */
-	public static final Collection RATE_TABLE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Rate Table Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateRateTableType_Enumeration(BigInteger rateTableType, DiagnosticChain diagnostics, Map context) {
-		boolean result = RATE_TABLE_TYPE__ENUMERATION__VALUES.contains(rateTableType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getRateTableType(), rateTableType, RATE_TABLE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateRollupTypeType(BigInteger rollupTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateRollupTypeType_Enumeration(rollupTypeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateRollupTypeType_Enumeration
-	 */
-	public static final Collection ROLLUP_TYPE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Rollup Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateRollupTypeType_Enumeration(BigInteger rollupTypeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = ROLLUP_TYPE_TYPE__ENUMERATION__VALUES.contains(rollupTypeType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getRollupTypeType(), rollupTypeType, ROLLUP_TYPE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateStandardRateFormatType(BigInteger standardRateFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateStandardRateFormatType_Enumeration(standardRateFormatType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateStandardRateFormatType_Enumeration
-	 */
-	public static final Collection STANDARD_RATE_FORMAT_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("7")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Standard Rate Format Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateStandardRateFormatType_Enumeration(BigInteger standardRateFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = STANDARD_RATE_FORMAT_TYPE__ENUMERATION__VALUES.contains(standardRateFormatType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getStandardRateFormatType(), standardRateFormatType, STANDARD_RATE_FORMAT_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateStandardRateFormatType1(BigInteger standardRateFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateStandardRateFormatType1_Enumeration(standardRateFormatType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateStandardRateFormatType1_Enumeration
-	 */
-	public static final Collection STANDARD_RATE_FORMAT_TYPE1__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("7"),
-				 new BigInteger("8")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Standard Rate Format Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateStandardRateFormatType1_Enumeration(BigInteger standardRateFormatType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = STANDARD_RATE_FORMAT_TYPE1__ENUMERATION__VALUES.contains(standardRateFormatType1);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getStandardRateFormatType1(), standardRateFormatType1, STANDARD_RATE_FORMAT_TYPE1__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateSubjectType(String subjectType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateSubjectType_MaxLength(subjectType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Subject Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateSubjectType_MaxLength(String subjectType, DiagnosticChain diagnostics, Map context) {
-		int length = subjectType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getSubjectType(), subjectType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateSubprojectNameType(String subprojectNameType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateSubprojectNameType_MaxLength(subprojectNameType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Subproject Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateSubprojectNameType_MaxLength(String subprojectNameType, DiagnosticChain diagnostics, Map context) {
-		int length = subprojectNameType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getSubprojectNameType(), subprojectNameType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTitleType(String titleType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateTitleType_MaxLength(titleType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>Title Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTitleType_MaxLength(String titleType, DiagnosticChain diagnostics, Map context) {
-		int length = titleType.length();  
-		boolean result = length <= 512;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getTitleType(), titleType, length, 512, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType(BigInteger typeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateTypeType_Enumeration(typeType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateTypeType_Enumeration
-	 */
-	public static final Collection TYPE_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType_Enumeration(BigInteger typeType, DiagnosticChain diagnostics, Map context) {
-		boolean result = TYPE_TYPE__ENUMERATION__VALUES.contains(typeType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getTypeType(), typeType, TYPE_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType1(BigInteger typeType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateTypeType1_Enumeration(typeType1, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateTypeType1_Enumeration
-	 */
-	public static final Collection TYPE_TYPE1__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Type Type1</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType1_Enumeration(BigInteger typeType1, DiagnosticChain diagnostics, Map context) {
-		boolean result = TYPE_TYPE1__ENUMERATION__VALUES.contains(typeType1);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getTypeType1(), typeType1, TYPE_TYPE1__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType2(BigInteger typeType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateTypeType2_Enumeration(typeType2, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateTypeType2_Enumeration
-	 */
-	public static final Collection TYPE_TYPE2__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Type Type2</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType2_Enumeration(BigInteger typeType2, DiagnosticChain diagnostics, Map context) {
-		boolean result = TYPE_TYPE2__ENUMERATION__VALUES.contains(typeType2);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getTypeType2(), typeType2, TYPE_TYPE2__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType3(BigInteger typeType3, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateTypeType3_Enumeration(typeType3, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateTypeType3_Enumeration
-	 */
-	public static final Collection TYPE_TYPE3__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8"),
-				 new BigInteger("9"),
-				 new BigInteger("10"),
-				 new BigInteger("11"),
-				 new BigInteger("16"),
-				 new BigInteger("17"),
-				 new BigInteger("18"),
-				 new BigInteger("19"),
-				 new BigInteger("20"),
-				 new BigInteger("21"),
-				 new BigInteger("22"),
-				 new BigInteger("23"),
-				 new BigInteger("24"),
-				 new BigInteger("25"),
-				 new BigInteger("26"),
-				 new BigInteger("27"),
-				 new BigInteger("28"),
-				 new BigInteger("29"),
-				 new BigInteger("30"),
-				 new BigInteger("31"),
-				 new BigInteger("32"),
-				 new BigInteger("33"),
-				 new BigInteger("34"),
-				 new BigInteger("35"),
-				 new BigInteger("36"),
-				 new BigInteger("37"),
-				 new BigInteger("38"),
-				 new BigInteger("39"),
-				 new BigInteger("40"),
-				 new BigInteger("41"),
-				 new BigInteger("42"),
-				 new BigInteger("43"),
-				 new BigInteger("44"),
-				 new BigInteger("45"),
-				 new BigInteger("46"),
-				 new BigInteger("47"),
-				 new BigInteger("48"),
-				 new BigInteger("49"),
-				 new BigInteger("50"),
-				 new BigInteger("51"),
-				 new BigInteger("52"),
-				 new BigInteger("53"),
-				 new BigInteger("54"),
-				 new BigInteger("55"),
-				 new BigInteger("56"),
-				 new BigInteger("57"),
-				 new BigInteger("58"),
-				 new BigInteger("59"),
-				 new BigInteger("60"),
-				 new BigInteger("61"),
-				 new BigInteger("62"),
-				 new BigInteger("63"),
-				 new BigInteger("64"),
-				 new BigInteger("65"),
-				 new BigInteger("66"),
-				 new BigInteger("67"),
-				 new BigInteger("68"),
-				 new BigInteger("69"),
-				 new BigInteger("70"),
-				 new BigInteger("71"),
-				 new BigInteger("72"),
-				 new BigInteger("73"),
-				 new BigInteger("74"),
-				 new BigInteger("75"),
-				 new BigInteger("76")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Type Type3</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType3_Enumeration(BigInteger typeType3, DiagnosticChain diagnostics, Map context) {
-		boolean result = TYPE_TYPE3__ENUMERATION__VALUES.contains(typeType3);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getTypeType3(), typeType3, TYPE_TYPE3__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType4(BigInteger typeType4, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateTypeType4_Enumeration(typeType4, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateTypeType4_Enumeration
-	 */
-	public static final Collection TYPE_TYPE4__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Type Type4</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType4_Enumeration(BigInteger typeType4, DiagnosticChain diagnostics, Map context) {
-		boolean result = TYPE_TYPE4__ENUMERATION__VALUES.contains(typeType4);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getTypeType4(), typeType4, TYPE_TYPE4__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType5(BigInteger typeType5, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateTypeType5_Enumeration(typeType5, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateTypeType5_Enumeration
-	 */
-	public static final Collection TYPE_TYPE5__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Type Type5</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateTypeType5_Enumeration(BigInteger typeType5, DiagnosticChain diagnostics, Map context) {
-		boolean result = TYPE_TYPE5__ENUMERATION__VALUES.contains(typeType5);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getTypeType5(), typeType5, TYPE_TYPE5__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateUIDType(String uidType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateUIDType_MaxLength(uidType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * Validates the MaxLength constraint of '<em>UID Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateUIDType_MaxLength(String uidType, DiagnosticChain diagnostics, Map context) {
-		int length = uidType.length();  
-		boolean result = length <= 16;
-		if (!result && diagnostics != null) 
-			reportMaxLengthViolation(MsprojectPackage.eINSTANCE.getUIDType(), uidType, length, 16, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateUnitType(BigInteger unitType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateUnitType_Enumeration(unitType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateUnitType_Enumeration
-	 */
-	public static final Collection UNIT_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("5"),
-				 new BigInteger("8")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Unit Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateUnitType_Enumeration(BigInteger unitType, DiagnosticChain diagnostics, Map context) {
-		boolean result = UNIT_TYPE__ENUMERATION__VALUES.contains(unitType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getUnitType(), unitType, UNIT_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateValuelistSortOrderType(BigInteger valuelistSortOrderType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateValuelistSortOrderType_Enumeration(valuelistSortOrderType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateValuelistSortOrderType_Enumeration
-	 */
-	public static final Collection VALUELIST_SORT_ORDER_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Valuelist Sort Order Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateValuelistSortOrderType_Enumeration(BigInteger valuelistSortOrderType, DiagnosticChain diagnostics, Map context) {
-		boolean result = VALUELIST_SORT_ORDER_TYPE__ENUMERATION__VALUES.contains(valuelistSortOrderType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getValuelistSortOrderType(), valuelistSortOrderType, VALUELIST_SORT_ORDER_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWeekStartDayType(BigInteger weekStartDayType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateWeekStartDayType_Enumeration(weekStartDayType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateWeekStartDayType_Enumeration
-	 */
-	public static final Collection WEEK_START_DAY_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Week Start Day Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWeekStartDayType_Enumeration(BigInteger weekStartDayType, DiagnosticChain diagnostics, Map context) {
-		boolean result = WEEK_START_DAY_TYPE__ENUMERATION__VALUES.contains(weekStartDayType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getWeekStartDayType(), weekStartDayType, WEEK_START_DAY_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkContourType(BigInteger workContourType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateWorkContourType_Enumeration(workContourType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateWorkContourType_Enumeration
-	 */
-	public static final Collection WORK_CONTOUR_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5"),
-				 new BigInteger("6"),
-				 new BigInteger("7"),
-				 new BigInteger("8")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Work Contour Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkContourType_Enumeration(BigInteger workContourType, DiagnosticChain diagnostics, Map context) {
-		boolean result = WORK_CONTOUR_TYPE__ENUMERATION__VALUES.contains(workContourType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getWorkContourType(), workContourType, WORK_CONTOUR_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkFormatType(BigInteger workFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateWorkFormatType_Enumeration(workFormatType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateWorkFormatType_Enumeration
-	 */
-	public static final Collection WORK_FORMAT_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3"),
-				 new BigInteger("4"),
-				 new BigInteger("5")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Work Format Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkFormatType_Enumeration(BigInteger workFormatType, DiagnosticChain diagnostics, Map context) {
-		boolean result = WORK_FORMAT_TYPE__ENUMERATION__VALUES.contains(workFormatType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getWorkFormatType(), workFormatType, WORK_FORMAT_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkGroupType(BigInteger workGroupType, DiagnosticChain diagnostics, Map context) {
-		boolean result = validateWorkGroupType_Enumeration(workGroupType, diagnostics, context);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @see #validateWorkGroupType_Enumeration
-	 */
-	public static final Collection WORK_GROUP_TYPE__ENUMERATION__VALUES =
-		wrapEnumerationValues
-			(new Object[] {
-				 new BigInteger("0"),
-				 new BigInteger("1"),
-				 new BigInteger("2"),
-				 new BigInteger("3")
-			 });
-
-	/**
-	 * Validates the Enumeration constraint of '<em>Work Group Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean validateWorkGroupType_Enumeration(BigInteger workGroupType, DiagnosticChain diagnostics, Map context) {
-		boolean result = WORK_GROUP_TYPE__ENUMERATION__VALUES.contains(workGroupType);
-		if (!result && diagnostics != null) 
-			reportEnumerationViolation(MsprojectPackage.eINSTANCE.getWorkGroupType(), workGroupType, WORK_GROUP_TYPE__ENUMERATION__VALUES, diagnostics, context);
-		return result; 
-	}
-
-} //MsprojectValidator
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectXMLHelperImpl.java b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectXMLHelperImpl.java
deleted file mode 100644
index 65cd77d..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/MsprojectXMLHelperImpl.java
+++ /dev/null
@@ -1,147 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-//------------------------------------------------------------------------------
-package org.eclipse.epf.msproject.util;
-
-import java.text.FieldPosition;
-import java.text.ParseException;
-import java.util.Date;
-
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EFactory;
-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.internal.XMLCalendar;
-import org.eclipse.emf.ecore.xml.type.util.XMLTypeUtil;
-
-import com.ibm.icu.text.DateFormat;
-import com.ibm.icu.text.SimpleDateFormat;
-
-/**
- * Create a slightly customized XMLHelperImpl class
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-public class MsprojectXMLHelperImpl extends XMLHelperImpl implements XMLHelper {
-
-	 protected static final DateFormat [] EDATE_FORMATS =
-	  {
-		new SafeSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"),
-	    new SafeSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"),
-	    new SafeSimpleDateFormat("yyyy-MM-ddZ")
-	  };
-	 
-	 /**
-	  * Constructor
-	  * @param resource
-	  */
-	public MsprojectXMLHelperImpl(XMLResource resource) {
-		super(resource);
-	}
-	
-	/**
-	 * Convert boolean value to either "0" or "1"
-	 * Convert DateTime value to be compatible with MS project
-	 */
-	 public String convertToString(EFactory factory, EDataType dataType, Object value)
-	  {
-		 
-//		 org.eclipse.emf.ecore.xml.type.impl.XMLTypeFactoryImpl aFactory = new org.eclipse.emf.ecore.xml.type.impl.XMLTypeFactoryImpl();
-//		 System.out.println("$$$$$ dataType name = " + dataType.getName());
-		 
-		 if ("Boolean".equalsIgnoreCase(dataType.getName())) {
-//			 System.out.println("$$$ need to override the Boolean: " + value);
-			 if (value != null) {
-				 String rs = "0";
-				 try {
-					 Boolean bObject = (Boolean)value;
-					 if (bObject.booleanValue())
-						 rs = "1";
-				 } catch (Exception e) {}
-//				 System.out.println("$$$ converted string = " + rs);
-				 return rs;
-			 }
-			 return null; 
-		 } else if ("DateTime".equalsIgnoreCase(dataType.getName())) {
-//			 System.out.println("$$$ need to override the DateTime: " + value.getClass() + "," + value);
-			 if (value != null) {
-				   String rs = value.toString();
-				   if (value instanceof Date)
-				    {
-				      rs = EDATE_FORMATS[0].format((Date)value);
-				    } else if (value instanceof XMLCalendar){
-					  rs = ((XMLCalendar)value).toString();
-					  int idx = rs.indexOf('.');
-					  if (idx > 0)
-						  rs = rs.substring(0, idx);
-					}
-//				   System.out.println("$$$ converted string = " + rs);
-				   return rs;
-			 }
-			 return null; 
-		 }
-		 
-//		 System.out.println("$$$ EFactory, EDataType, value = " + factory + "," + dataType + "," + value);
-		 String rs = super.convertToString( factory,  dataType,  value);
-//		 System.out.println("$$$ converted string (out) = " + rs);
-		 return rs;
-	  }
-	 
-	 /**
-	  * Convert the 1 or 0 boolean value to an Boolean Object
-	  * convert the datetime string into XMLCalendar object.
-	  */
-	 protected Object createFromString(EFactory eFactory, EDataType eDataType, String value)
-	  {
-		 if ("Boolean".equalsIgnoreCase(eDataType.getName())) {
-//			 System.out.println("$$$ need to convert from Boolean: " + value);
-			 if (value != null) {
-				 if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("1"))
-					 return Boolean.TRUE;
-				 else
-					 return Boolean.FALSE;
-			 }
-			 return null; 
-		 } else if ("DateTime".equalsIgnoreCase(eDataType.getName())) {
-//			 System.out.println("$$$ need to convert from DateTime: " + value);
-			 if (value != null) {
-				   return new XMLCalendar(collapseWhiteSpace(value), XMLCalendar.DATETIME);
-			 }
-			 return null; 
-		 }
-		 
-//		 System.out.println("$$$ EFactory, EDataType, value = " + eFactory + "," + eDataType + "," + value);
-		 Object ro = super.createFromString( eFactory,  eDataType,  value);
-//		 System.out.println("$$$ converted object (in) = " + ro);
-		 return ro;
-	  }
-	 
-	 protected String collapseWhiteSpace(String value)
-	 {
-		 return XMLTypeUtil.normalize(value, true);
-	 }
-	  
-	 private static class SafeSimpleDateFormat extends SimpleDateFormat
-	 {
-		private static final long serialVersionUID = 1L;
-
-		public SafeSimpleDateFormat(String pattern)
-	    {
-	      super(pattern);
-	    }
-
-	    public synchronized Date parse(String source) throws ParseException
-	    {
-	      return super.parse(source);
-	    }
-
-	    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos)
-	    {
-	      StringBuffer result = super.format(date, toAppendTo, pos);
-//	      result.insert(result.length() - 2, ":");
-	      return result;
-	    }
-	  }
-}
diff --git a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/package.html b/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/package.html
deleted file mode 100644
index 1f03d88..0000000
--- a/1.5/plugins/org.eclipse.epf.msproject/src/org/eclipse/epf/msproject/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for accessing the Microsoft Project model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.platform/.project b/1.5/plugins/org.eclipse.epf.platform/.project
deleted file mode 100644
index fee7404..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.platform</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.platform/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.platform/META-INF/MANIFEST.MF
deleted file mode 100644
index 404fb80..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %featurePluginName
-Bundle-SymbolicName: org.eclipse.epf.platform; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.platform/about.html b/1.5/plugins/org.eclipse.epf.platform/about.html
deleted file mode 100644
index 4c99086..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</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.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.platform/about.ini b/1.5/plugins/org.eclipse.epf.platform/about.ini
deleted file mode 100644
index 77d496d..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/about.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "appName" contains name of the application (translated)
-appName=%featureName
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# ($nl$/ prefix to permit locale-specific translations of entire file)
-welcomePage=$nl$/welcome.xml
-
diff --git a/1.5/plugins/org.eclipse.epf.platform/about.properties b/1.5/plugins/org.eclipse.epf.platform/about.properties
deleted file mode 100644
index 081a88e..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 with EMF GEF GMF
-
-blurb=Eclipse Platform\n\
-\n\
-Version: 3.3.0\n\
-Build id: I20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/platform\n\
-\n\
-This product includes software developed by the\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/1.5/plugins/org.eclipse.epf.platform/build.properties b/1.5/plugins/org.eclipse.epf.platform/build.properties
deleted file mode 100644
index 55d8b31..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-bin.includes = .,\
-               META-INF/,\
-               about.html,\
-               about.ini,\
-               about.properties,\
-               eclipse32.gif,\
-               welcome.xml,\
-               plugin.properties,\
-               nl/
diff --git a/1.5/plugins/org.eclipse.epf.platform/eclipse32.gif b/1.5/plugins/org.eclipse.epf.platform/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/da/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/da/about.properties
deleted file mode 100644
index 4a3fbfb..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/da/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 med EMF GEF GMF
-
-blurb=Eclipse-platform\n\
-\n\
-Version: 3.3.0\n\
-Byg-id: I20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007. All rights reserved.\n\
-Bes\u00f8g http://www.eclipse.org/platform\n\
-\n\
-Dette produkt indeholder software, der er udviklet af\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/de/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/de/about.properties
deleted file mode 100644
index 5477fab..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/de/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 mit EMF GEF GMF
-
-blurb=Eclipse Platform\n\
-\n\
-Version: 3.3.0\n\
-Build-ID: I20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All rights reserved.\n\
-Besuchen Sie die Webseite http://www.eclipse.org/platform.\n\
-\n\
-Dieses Produkt enth\u00e4lt Software, die von der\n\
-Apache Software Foundation (http://www.apache.org/) entwickelt wurde.
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/es/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/es/about.properties
deleted file mode 100644
index bfc38a4..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/es/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 con EMF GEF GMF
-
-blurb=Plataforma Eclipse\n\
-\n\
-Versi\u00f3n: 3.3.0\n\
-ID de build: I20070625-1500\n\
-\n\
-(c) Copyright Colaboradores de Eclipse y otros 2000, 2007.  Reservados todos los derechos.\n\
-Visite la p\u00e1gina http://www.eclipse.org/platform\n\
-\n\
-Este producto incluye software desarrollado por la\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/fr/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/fr/about.properties
deleted file mode 100644
index e58247d..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/fr/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 avec EMF GEF GMF
-
-blurb=Eclipse Platform\n\
-\n\
-Version : 3.3.0\n\
-ID de construction : I20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All rights reserved.\n\
-Visitez la page suivante : http://www.eclipse.org/platform\n\
-\n\
-Ce produit contient des logiciels d\u00e9velopp\u00e9s par\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/it/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/it/about.properties
deleted file mode 100644
index 5b55b3f..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/it/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Piattaforma Eclipse 3.3.0 con EMF GEF GMF
-
-blurb=Piattaforma Eclipse\n\
-\n\
-Versione: 3.3.0\n\
-Id build: I20070625-1500\n\
-\n\
-(c) Copyright contributor Eclipse e altri 2000, 2007.  Tutti i diritti riservati.\n\
-Visitare l'indirizzo http://www.eclipse.org/platform\n\
-\n\
-Questo prodotto include software sviluppato da\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/ja/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/ja/about.properties
deleted file mode 100644
index 2f83694..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/ja/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 with EMF GEF GMF
-
-blurb=Eclipse Platform\n\
-\n\
-\u30d0\u30fc\u30b8\u30e7\u30f3: 3.3.0\n\
-\u30d3\u30eb\u30c9 ID: I20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All rights reserved.\n\
-http://www.eclipse.org/platform \u3092\u53c2\u7167\u3002\n\
-\n\
-\u3053\u306e\u88fd\u54c1\u306b\u306f\u3001Apache Software Foundation (http://www.apache.org/)\n\
-\u306b\u3088\u308a\u958b\u767a\u3055\u308c\u305f\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/ko/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/ko/about.properties
deleted file mode 100644
index e4af9da..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/ko/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse \ud50c\ub7ab\ud3fc 3.3.0(EMF GEF GMF \ud3ec\ud568)
-
-blurb=Eclipse \ud50c\ub7ab\ud3fc\n\
-\n\
-\ubc84\uc804: 3.3.0\n\
-\ube4c\ub4dc ID: I20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All rights reserved.\n\
-http://www.eclipse.org/platform \uc6f9\uc0ac\uc774\ud2b8\ub97c \ubc29\ubb38\ud558\uc2ed\uc2dc\uc624.\n\
-\n\
-\uc774 \uc81c\ud488\uc5d0\ub294 Apache Software Foundation(http://www.apache.org/)\uc5d0\uc11c \n\
-\uac1c\ubc1c\ud55c \uc18c\ud504\ud2b8\uc6e8\uc5b4\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/pt/BR/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/pt/BR/about.properties
deleted file mode 100644
index e54b324..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/pt/BR/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 com EMF GEF GMF
-
-blurb=Eclipse Platform\n\
-\n\
-Vers\u00e3o: 3.3.0\n\
-ID da Constru\u00e7\u00e3o: I20070625-1500\n\
-\n\
-(c) Copyright contribuidores Eclipse e outros 2000, 2007. Todos os direitos reservados.\n\
-Visite http://www.eclipse.org/platform\n\
-\n\
-Este produto inclui software desenvolvido pela\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/ru/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/ru/about.properties
deleted file mode 100644
index bb81f04..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/ru/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 Eclipse 3.3.0 \u0441 EMF GEF GMF
-
-blurb=\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 Eclipse\n\
-\n\
-\u0412\u0435\u0440\u0441\u0438\u044f: 3.3.0\n\
-\u0418\u0414 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438: I20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b.\n\
-\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 http://www.eclipse.org/platform\n\
-\n\
-\u0412 \u0441\u043e\u0441\u0442\u0430\u0432 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0432\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u0434, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439\n\
-Apache Software Foundation http://www.apache.org/
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/zh/CN/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/zh/CN/about.properties
deleted file mode 100644
index cd9ae45..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/zh/CN/about.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=\u5e26\u6709 EMF GEF GMF \u7684 Eclipse Platform 3.3.0
-
-blurb=Eclipse Platform\n\
-\n\
-\u7248\u672c\uff1a3.3.0\n\
-\u5de5\u4f5c\u7248\u672c\u6807\u8bc6\uff1aI20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All rights reserved.\n\
-\u8bf7\u8bbf\u95ee http://www.eclipse.org/platform\n\
-\n\
-\u672c\u4ea7\u54c1\u5305\u542b\u7531 Apache Software Foundation\uff08http://www.apache.org/\uff09\u5f00\u53d1\u7684\u8f6f\u4ef6\n
diff --git a/1.5/plugins/org.eclipse.epf.platform/nl/zh/TW/about.properties b/1.5/plugins/org.eclipse.epf.platform/nl/zh/TW/about.properties
deleted file mode 100644
index 72751c5..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/nl/zh/TW/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-# NLS_MESSAGEFORMAT_VAR
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-featureName=Eclipse Platform 3.3.0 with EMF GEF GMF
-
-blurb=Eclipse \u5e73\u53f0\n\
-\n\
-\u7248\u672c\uff1a3.3.0\n\
-\u5efa\u7f6e ID\uff1aI20070625-1500\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All rights reserved.\n\
-\u8acb\u9020\u8a2a http://www.eclipse.org/platform\n\
-\n\
-\u672c\u7522\u54c1\u5305\u542b Apache Software Foundation http://www.apache.org/\n\
-\u6240\u958b\u767c\u7684\u8edf\u9ad4
diff --git a/1.5/plugins/org.eclipse.epf.platform/plugin.properties b/1.5/plugins/org.eclipse.epf.platform/plugin.properties
deleted file mode 100644
index 47e4659..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-featurePluginName=EPF Platform Feature
-featurePluginNameNL=EPF Platform Feature
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.platform/welcome.xml b/1.5/plugins/org.eclipse.epf.platform/welcome.xml
deleted file mode 100644
index a009245..0000000
--- a/1.5/plugins/org.eclipse.epf.platform/welcome.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?> 
-<welcomePage 
-	title="Eclipse Modeling Framework (EMF)">
-
-<intro>EMF is a Java/XML framework for generating tools and other applications
-based on simple class models.
-</intro>
-
-<item><b>What is EMF?</b>
-	Read the <topic href="/org.eclipse.emf.doc/references/overview/EMF.html">overview</topic> article to learn about EMF.
-	Then, follow the <topic href="/org.eclipse.emf.doc/tutorials/clibmod/clibmod.html">tutorial</topic> to see how easy it is to generate a model.
-</item>
-
-<item><b>Learn More</b>
-	This is the official site of EMF: <topic href="http://www.eclipse.org/emf">http://www.eclipse.org/emf</topic>
-</item>
-
-</welcomePage>
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/.classpath b/1.5/plugins/org.eclipse.epf.publishing.ui/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/.project b/1.5/plugins/org.eclipse.epf.publishing.ui/.project
deleted file mode 100644
index 3ce6e6c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.publishing.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.publishing.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 3906bf1..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.publishing.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.publishing.ui.PublishingUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.epf.authoring.ui;visibility:=reexport,
- org.eclipse.epf.publishing;visibility:=reexport,
- org.eclipse.jface.text,
- org.eclipse.help.base,
- org.eclipse.ui.browser,
- org.eclipse.epf.common.ui,
- org.eclipse.epf.library.edit.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.publishing.ui,
- org.eclipse.epf.publishing.ui.preferences,
- org.eclipse.epf.publishing.ui.wizards
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/build.properties b/1.5/plugins/org.eclipse.epf.publishing.ui/build.properties
deleted file mode 100644
index b4b8249..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/icons/Reporting.gif b/1.5/plugins/org.eclipse.epf.publishing.ui/icons/Reporting.gif
deleted file mode 100644
index a38cc8a..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/icons/Reporting.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/icons/WebPublish.gif b/1.5/plugins/org.eclipse.epf.publishing.ui/icons/WebPublish.gif
deleted file mode 100644
index 76dcf0f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/icons/WebPublish.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/icons/full/wizban/PublishConfiguration.gif b/1.5/plugins/org.eclipse.epf.publishing.ui/icons/full/wizban/PublishConfiguration.gif
deleted file mode 100644
index e249831..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/icons/full/wizban/PublishConfiguration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.publishing.ui/plugin.properties
deleted file mode 100644
index cda8b1d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/plugin.properties
+++ /dev/null
@@ -1,50 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-################################################################################
-# BEGIN NO TRANSLATION
-################################################################################
-# Default Publish Path
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-publishPath=<user.home>/<app.name>/Publish
-################################################################################
-# END NO TRANSLATION
-################################################################################
-
-# Plug-in
-pluginName=EPF Publishing UI
-providerName=Eclipse.org
-
-# Default Feedback URL
-feedbackURL=http://www.published_website.com/feedback
-
-# Publish Configuration Action
-publishConfigAction=&Publish...
-publishConfigActionTooltip=Publish a web site for a configuration
-
-# Preference Page
-rootPageName=Publishing/Browsing
-roleDiagramPageName=Role Diagram
-activityDiagramPageName=Activity Diagrams
-publishingOptions=Publishing Options
-
-# Publishing Actions
-configActionSet=Configuration
-configMenu=&Configuration
-
-# Print Configuration Action
-printConfigAction=Print
-
-# the title for the published site
-#don't define here, let user specify it.
-#title=OpenUP/Basic
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.publishing.ui/plugin.xml
deleted file mode 100644
index dc3721e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/plugin.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point
-         id="publishConfigWizard"
-         name="Publish Method Configuraiton Wizard Extension"
-         schema="schema/PublishConfigWizard.exsd" />
-
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            id="org.eclipse.epf.library.ConfigActionSet"
-            label="%configActionSet"
-            visible="false">
-         <menu
-               id="org.eclipse.epf.publishing.ui.menu.configuration"
-               label="%configMenu"
-               path="additions"/>  
-         <action
-               class="org.eclipse.epf.publishing.ui.actions.PublishConfigAction"
-               helpContextId="org.eclipse.epf.authoring.ui.configuration_publish_context"
-               icon="icons/WebPublish.gif"
-               id="org.eclipse.epf.library.actions.Publish"
-               label="%publishConfigAction"
-               menubarPath="org.eclipse.epf.publishing.ui.menu.configuration/additions"
-               style="push"/>
-      </actionSet>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.epf.authoring.ui.AuthoringPerspective">
-         <actionSet
-               id="org.eclipse.epf.library.ConfigActionSet">
-         </actionSet>
-      </perspectiveExtension>
-      <perspectiveExtension
-            targetID="org.eclipse.epf.authoring.ui.BrowsingPerspective">
-         <actionSet
-               id="org.eclipse.epf.library.ConfigActionSet">
-         </actionSet>
-      </perspectiveExtension>      
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.actionSetPartAssociations">
-      <actionSetPartAssociation
-            targetID="org.eclipse.epf.library.ConfigActionSet">
-         <part
-               id="org.eclipse.epf.authoring.ui.editors.ConfigurationEditor">
-         </part>
-      </actionSetPartAssociation>
-   </extension>
-
-   <extension point="org.eclipse.ui.preferencePages">
-      <page
-            id="org.eclipse.epf.publishing.ui.preferences.PublishingPreferencePage"
-            class="org.eclipse.epf.publishing.ui.preferences.PublishingPreferencePage"
-            category="org.eclipse.epf.ui.preferences.RootPreferencePage"
-            name="%rootPageName"/>
-      <page
-            id="org.eclipse.epf.publishing.ui.preferences.RoleDiagramPreferencePage"
-            class="org.eclipse.epf.publishing.ui.preferences.RoleDiagramPreferencePage"
-            category="org.eclipse.epf.publishing.ui.preferences.PublishingPreferencePage"
-            name="%roleDiagramPageName"/>
-      <page
-            id="org.eclipse.epf.publishing.ui.preferences.ActivityDiagramPreferencePage"
-	        class="org.eclipse.epf.publishing.ui.preferences.ActivityDiagramPreferencePage"
-		    category="org.eclipse.epf.publishing.ui.preferences.PublishingPreferencePage"
-		    name="%activityDiagramPageName"/>    
-   </extension>
-
-   <extension
-         point="org.eclipse.epf.library.edit.commandListeners">
-      <commandListener class="org.eclipse.epf.publishing.ui.preferences.DeleteConfigCommandListener"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/schema/PublishConfigWizard.exsd b/1.5/plugins/org.eclipse.epf.publishing.ui/schema/PublishConfigWizard.exsd
deleted file mode 100644
index 5e5b896..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/schema/PublishConfigWizard.exsd
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.publishing.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.publishing.ui" id="publishConfigWizard" name="Publish Method Confguration Wizard Extension"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to extend the Publish Method Configuration wizard by replacing existing wizard pages or adding new ones.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizardExtender" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  A fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  An optional identifier of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  An optional name of the extension instance.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardExtender">
-      <complexType>
-         <sequence>
-            <element ref="wizardPage" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="publisher" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard extender. This class must implements &lt;code&gt;org.eclipse.epf.publishing.ui.wizards.IPublishConfigWizardExtender&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizardPage">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the wizard page. This class must implements &lt;code&gt;org.eclipse.jface.wizard.IWizardPage&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The type of extension - &quot;replace&quot; or &quot;new&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="target" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the base wizard page to be replaced or used as a reference for inserting a new wizard page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="insert" type="string">
-            <annotation>
-               <documentation>
-                  The insertion type for a new wizard page - &quot;before&quot; or &quot;after&quot;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="publisher">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The Java class that implements the configuration publisher. This class must extends &lt;code&gt;org.eclipse.epf.publishing.sefrvices.AbstractPublishManager&lt;/code&gt;.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of how the extension point can be used: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.publishing.ui.publishConfigWizard&quot;&gt;
-      &lt;wizardExtender
-            class=&quot;org.eclipse.epf.publishing.ui.wizards.MyPublishConfigWizardExtender&quot;&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.publishing.ui.wizards.MySelectPublishOptionsPage&quot;
-               type=&quot;replace&quot;
-               target=&quot;org.eclipse.epf.publishing.ui.wizards.SelectPublishOptionsPage&quot;/&gt;
-         &lt;wizardPage
-               class=&quot;org.eclipse.epf.publishing.ui.wizards.MyNewPublishPage&quot;
-               type=&quot;new&quot;
-               target=&quot;org.eclipse.epf.publishing.ui.wizards.SelectPublishOptionsPage&quot;               
-               insert=&quot;after&quot;/&gt;               
-         &lt;publisher
-               class=&quot;org.eclipse.epf.publishing.MyConfigPublisher&quot;/&gt;
-      &lt;/wizardExtender&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublisherElement.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublisherElement.java
deleted file mode 100644
index 81b687a..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublisherElement.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui;
-
-import java.net.URL;
-
-import org.eclipse.epf.publishing.services.AbstractPublishManager;
-import org.eclipse.epf.publishing.ui.wizards.AbstractPublishWizard;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.osgi.framework.Bundle;
-
-/**
- * This class defines the attributes for a publisher extension point
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class PublisherElement {
-	Bundle bundle;
-	private String id;
-	private String label;
-	private String icon;
-	private String wizardClass;
-	private String managerClass;	
-	
-	/**
-	 * constructor for PublisherElement extension point
-	 * @param bundle Bundle the bundle that laod the element definition file
-	 * @param id String
-	 * @param label String
-	 * @param icon String icon path
-	 * @param wizardClass String the publishing wizard class. 
-	 * This class must extends org.eclipse.epf.publishing.wizards.AbstractPublishWizard class
-	 * @param managerClass String the publish mamager class. 
-	 * this class must extends the org.eclipse.epf.publishing.services.AbstractPublishManager class.
-	 */
-	public PublisherElement(Bundle bundle, String id, String label, String icon, String wizardClass, String managerClass) {
-		this.bundle = bundle; 
-		this.id = id;
-		this.label = label;
-		this.icon = icon;
-		this.wizardClass = wizardClass;
-		this.managerClass = managerClass;		
-	}
-	
-	/**
-	 * get the publish wizard
-	 * 
-	 * @return AbstractPublishWizard
-	 * @throws Exception
-	 */
-	public AbstractPublishWizard getPublishWizard() throws Exception {
-		Class clazz = bundle.loadClass(wizardClass);
-		return (AbstractPublishWizard) clazz.newInstance();
-	}
-	
-	/**
-	 * get the publish manager
-	 * 
-	 * @return AbstractPublishManager
-	 * @throws Exception
-	 */
-	public AbstractPublishManager getPublishManager() throws Exception {
-		Class clazz = bundle.loadClass(managerClass);
-		return (AbstractPublishManager) clazz.newInstance();
-	}
-	
-	/**
-	 * get the id of the publisher
-	 * 
-	 * @return String
-	 */
-	public String getId() { 
-		return id; 
-	}
-	
-	/**
-	 * get the label of the publisher
-	 * 
-	 * @return String
-	 */
-	public String getLabel() {
-		return label;
-	}
-	
-	/**
-	 * get the image descriptor for the publisher icon.
-	 * 
-	 * @return ImageDescriptor
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		if ( icon == null || icon.length() == 0 ) {
-			return null;
-		}
-		
-		try {
-			URL installURL = bundle.getEntry("/"); //$NON-NLS-1$
-			URL iconURL = new URL(installURL, icon);
-			return ImageDescriptor.createFromURL(iconURL);
-		} catch (Exception e) {
-		}
-		
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublishingUIPlugin.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublishingUIPlugin.java
deleted file mode 100644
index 9603944..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublishingUIPlugin.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.eclipse.epf.library.layout.BrowsingLayoutSettings;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.publishing.ui.preferences.PublishingUIPreferences;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * The main plugin class for the publishing UI plugin.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PublishingUIPlugin extends AbstractPlugin {
-
-	// The shared instance.
-	private static PublishingUIPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishingUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		
-		updateLayoutSettings();
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.core.plugin.AbstractPlugin#start(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static PublishingUIPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * update the publishing/browsing layout settings.
-	 * Call this method when ever publishing/browsing related preferences are changed.
-	 *
-	 */
-	public void updateLayoutSettings() 
-	{
-		// call the library UI to update the settings first
-		LibraryUIPlugin.getDefault().updateLayoutSettings();
-		
-		// get the skin setting from preference
-		//boolean publishUnopenActivitydd = LibraryUIPreferences.getPublishUnopenActivitydd();	
-		//boolean publishADForActivityExtension = LibraryUIPreferences.getPublishADForActivityExtension();
-		boolean extraDescriptorInfo = PublishingUIPreferences.getExtraDescriptorInfo();
-		//boolean usenewExtends = LibraryPreferences.getUseNewExtendsSemantics();
-		
-		//BrowsingLayoutSettings.INSTANCE.setPublishADForActivityExtension(publishADForActivityExtension);
-		//BrowsingLayoutSettings.INSTANCE.setPublishUnopenActivitydd(publishUnopenActivitydd);
-		BrowsingLayoutSettings.INSTANCE.setShowExtraInfoForDescriptors(extraDescriptorInfo);
-		
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublishingUIResources.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublishingUIResources.java
deleted file mode 100644
index 9cc97de..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/PublishingUIResources.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.publishing.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Publishing UI resource bundle.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public final class PublishingUIResources extends NLS {
-
-	private static final String BUNDLE_NAME = PublishingUIResources.class
-			.getPackage().getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private PublishingUIResources() {
-	}
-
-	public static String publishConfigWizard_title;
-
-	public static String selectConfigWizardPage_title;
-
-	public static String selectConfigWizardPage_text;
-
-	public static String configLabel_text;
-
-	public static String selectContentWizardPage_title;
-
-	public static String selectContentWizardPage_text;
-
-	public static String publishConfigRadioButton_text;
-
-	public static String publishProcessesRadioButton_text;
-
-	public static String includeBaseProcessesCheckboxLabel_text;
-
-	public static String selectPublishingOptionsWizardPage_title;
-
-	public static String selectPublishingOptionsWizardPage_text;
-
-	public static String publishWebSiteGroup_text;
-	public static String browsingLayoutGroup_text;
-
-	public static String titleAndLinksGroup_text;
-
-	public static String lookAndFeelGroup_text;
-
-	public static String titleLabel_text;
-
-	public static String bannerImageLabel_text;
-
-	public static String aboutHTMLLabel_text;
-
-	public static String feedbackURLLabel_text;
-
-	public static String glossaryAndIndexGroup_text;
-
-	public static String publishGlossaryLabel_text;
-
-	public static String publishIndexLabel_text;
-
-	public static String validationGroup_text;
-
-	public static String checkExternalLinksLabel_text;
-
-	public static String convertBrokenLinksLabel_text;
-
-	public static String diagramGroup_text;
-
-	public static String publishActivityDetailDiagramsLabel_text;
-
-	public static String publishExtendedActivityDiagramsLabel_text;
-
-	public static String layoutGroup_text;
-
-	public static String publishLightWeightTreeLabel_text;
-
-	public static String publishExtraDescriptorInfoLabel_text;
-
-	public static String publishEmptyCategoriesLabel_text;
-
-	public static String selectDestinationWizardPage_title;
-
-	public static String selectDestinationWizardPage_text;
-
-	public static String dirLabel_text;
-
-	public static String webAppGroup_text;
-
-	public static String staticWebSiteRadioButton_text;
-
-	public static String dynamicWebAppRadioButton_text;
-
-	public static String includeSearchCheckbox_text;
-
-	public static String webApplicationNameLabel_text;
-
-	public static String destinationDirectoryGroup_text;
-
-	public static String pathLabel_text;
-
-	public static String useDefaultPathCheckbox_text;
-
-	public static String useDefaultFeedbackLabel_text;
-
-	public static String includeSearchesLabel_text;
-
-	public static String clientSideSearchRadioButton_text;
-
-	public static String serverSideSearchRadioButton_text;
-
-	public static String generateWARFileLabel_text;
-
-	public static String useAppletCheckbox_text;
-
-	public static String siteCustomizationWizardPage_title;
-
-	public static String siteCustomizationWizardPage_text;
-
-	public static String themeAndSkinGroup_text;
-
-	public static String showBannerCheckbox_text;
-
-	public static String selectSkinLabel_text;
-
-	public static String capabilityPatterns_text;
-
-	public static String deliveryProcesses_text;
-
-	public static String invalidViewsInfo_msg;
-
-	public static String invalidViewContributorInfo_msg;
-
-	public static String invalidViewSameViewInfo_msg;
-
-	public static String preferencePage_defaultPath_text;
-
-	public static String elementSpacingGroup_text;
-
-	public static String tasksHorizonalSpacingLabel_text;
-
-	public static String tasksVerticalSpacingLabel_text;
-
-	public static String elementTextLabelGroup_text;
-
-	public static String maxLineOfTextLabel_text;
-
-	public static String invalidHorizonalSpacingError_msg;
-
-	public static String invalidVerticalSpacingError_msg;
-
-	public static String invalidTextLinesError_msg;
-
-	public static String publishConfigDialog_title;
-
-	public static String confirmPathDialog_text;
-
-	public static String overwriteDialog_text;
-
-	public static String cancelPublishConfig_msg;
-
-	public static String previewConfigError_title;
-
-	public static String viewReportError_title;
-
-	public static String missingViewError_msg;
-
-	public static String cannotPublishError_msg;
-
-	public static String invalidPathError_msg;
-
-	public static String invalidPathCharsError_msg;
-
-	public static String publishConfigError_msg;
-
-	public static String previewConfigError_msg;
-
-	public static String viewReportError_msg;
-
-	public static String publishConfigError_reason;
-
-	public static String deleteFilesError_reason;
-
-	public static String createDirError_reason;
-
-	public static String openBrowserError_reason;
-
-	public static String webAppNameError_msg;
-
-	public static String webAppNameCharsError_msg;
-
-	public static String showRelatedDescriptors_text;
-
-	public static String showDescriptorsInNavigationTree_text;
-
-	public static String invalidAboutPathError_msg;
-
-	public static String invalidAboutPathCharsError_msg;
-
-	public static String selectDefaultActivityTab_text;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PublishingUIResources.class);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/Resources.properties b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/Resources.properties
deleted file mode 100644
index 7afca26..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/Resources.properties
+++ /dev/null
@@ -1,136 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Publish Method Configuration Wizard
-publishConfigWizard_title=Publish Method Configuration
-
-# Select Method Configuration Wizard Page
-selectConfigWizardPage_title=Select method configuration
-selectConfigWizardPage_text=Select a method configuration that contains the method content and processes which you would like to publish.
-configLabel_text=Method configuration:
-
-# Select Method Configuration Content Wizard Page
-selectContentWizardPage_title=Select method configuration content
-selectContentWizardPage_text=Select the method configuration content to publish. You can choose to publish the entire configuration or only a few select processes in the configuration.
-publishConfigRadioButton_text=Publish the entire configuration
-publishProcessesRadioButton_text=Publish selected processes:
-includeBaseProcessesCheckboxLabel_text=Publish referenced base processes
-
-# Select Publishing Options Wizard Page
-selectPublishingOptionsWizardPage_title=Select publishing options
-selectPublishingOptionsWizardPage_text=Select the publishing options. These options will be used to customize the look and behavior of the published website.
-titleAndLinksGroup_text=Title and links
-titleLabel_text=Title:
-aboutHTMLLabel_text=About content:
-feedbackURLLabel_text=Feedback URL:
-glossaryAndIndexGroup_text=Glossary and index
-publishGlossaryLabel_text=Publish glossary
-publishIndexLabel_text=Publish index
-lookAndFeelGroup_text=Look and feel
-bannerImageLabel_text=Banner image:
-validationGroup_text=Validation
-checkExternalLinksLabel_text=Check external hyperlinks
-convertBrokenLinksLabel_text=Convert broken hyperlinks to plain text
-diagramGroup_text=Diagrams
-publishActivityDetailDiagramsLabel_text=Publish activity detail diagrams that have not been manually created
-publishExtendedActivityDiagramsLabel_text=Publish activity diagrams for unmodified activity extensions
-layoutGroup_text=Layout
-publishLightWeightTreeLabel_text=Show relationship sub-folders in navigation trees
-publishExtraDescriptorInfoLabel_text=Include method content in descriptor pages
-publishEmptyCategoriesLabel_text=Publish categories with no categorized elements
-publishWebSiteGroup_text=Published website
-browsingLayoutGroup_text=Browsing Layout
-showRelatedDescriptors_text=Include links to related descriptors in role, task and work product pages
-showDescriptorsInNavigationTree_text=Show task descriptors in navigation trees
-selectDefaultActivityTab_text=Default tab for activity pages:
-
-# Select Destination Wizard Page
-selectDestinationWizardPage_title=Select destination directory and website format
-selectDestinationWizardPage_text=Select the destination directory and format for the published website.
-dirLabel_text=Directory:
-webAppGroup_text=Website format
-staticWebSiteRadioButton_text=Static web site
-dynamicWebAppRadioButton_text=Java EE web application packaged in a WAR file (requires Java Servlet 2.3 or above compliant servlet container)
-includeSearchCheckbox_text=Include search capability
-webApplicationNameLabel_text=Web application name:
-
-destinationDirectoryGroup_text=Destination directory
-pathLabel_text=Path:
-useDefaultPathCheckbox_text=Use default path
-useDefaultFeedbackLabel_text=Use default feedback URL
-
-includeSearchCheckbox_text=Include search capability (requires container for servlet)
-includeSearchesLabel_text=Include search capability
-clientSideSearchRadioButton_text= Client side search (requires Java applet support in browser)
-serverSideSearchRadioButton_text= Server side search (requires Container for servlet)
-generateWARFileLabel_text=Generate WAR (Web ARchive) file
-
-useAppletCheckbox_text=Support view customization (requires Java applet support in browser)
-
-siteCustomizationWizardPage_title=Customize Website
-siteCustomizationWizardPage_text=Customize Website look and feel
-themeAndSkinGroup_text=Theme and Skin
-showBannerCheckbox_text=Show banner
-selectSkinLabel_text=Select skin:
-
-# FIXME! Should these be warning messages?
-# Information Message
-invalidViewsInfo_msg=The following view(s) in configuration ''{0}'' will not be published:
-invalidViewContributorInfo_msg={0}: The view is a contributor
-invalidViewSameViewInfo_msg={0}: This view is a duplicate of another view
-
-capabilityPatterns_text=Capability Patterns
-deliveryProcesses_text=Delivery Processes
-
-# Publishing Preference Page
-preferencePage_defaultPath_text=Default path:
-
-# Role Diagram Preference Page
-elementSpacingGroup_text=Spacing between task and work product elements
-tasksHorizonalSpacingLabel_text=Horizontal spacing:
-tasksVerticalSpacingLabel_text=Vertical spacing:
-elementTextLabelGroup_text=Element labels
-maxLineOfTextLabel_text=Maximum line of text:
-
-# Role Diagram Preference Page Error Messages
-invalidHorizonalSpacingError_msg=Horizontal spacing must be an integer with value ranging from {0} to {1}.
-invalidVerticalSpacingError_msg=Vertical spacing must be an integer with value ranging from {0} to {1}.
-invalidTextLinesError_msg=Number of text lines must be an integer with value ranging from {0} to {1}.
-
-# Confirmation Dialogs
-publishConfigDialog_title=Publish Method Configuration
-confirmPathDialog_text=The destination path has been resolved to ''{0}''. Do you want to proceed?
-overwriteDialog_text=The destination path ''{0}'' already exists. All files in the folder will be deleted. Do you want to proceed?
-cancelPublishConfig_msg=The publishing operation has been cancelled.
-
-# Error Dialogs
-previewConfigError_title=Preview Published Method Configuration
-viewReportError_title=View Publishing Report
-
-# Error Messages
-missingViewError_msg=IUPP0100E: The selected configuration does not contain a valid view. Edit the configuration and add a view, or select another configuration.
-cannotPublishError_msg=IUPP0101E: The selected configuration cannot be published.
-invalidPathError_msg=IUPP0102E: The destination path is blank or invalid.
-invalidPathCharsError_msg=IUPP0103E: The destination path cannot contain these characters: \\ # * ? " < > | ! % /
-publishConfigError_msg=IUPP0104E: The selected configuration was not published successfully.
-previewConfigError_msg=IUPP0105E: Unable to open an HTML browser to preview the published configuration.
-viewReportError_msg=IUPP0106E: Unable to open an HTML browser to view the publishing report.
-webAppNameError_msg=IUPP0107E: The web application name must be specified.
-webAppNameCharsError_msg=IUPP0108E: The web application name cannot contain these characters: \\ # * ? " < > | ! % /
-invalidAboutPathError_msg=IUPP0109E: The path is invalid.
-invalidAboutPathCharsError_msg=IUPP0110E: The path cannot contain these characters: # * ? " < > | ! % /
-
-# Error Reasons & Recommended Actions
-publishConfigError_reason=Click Details for more information.
-deleteFilesError_reason=The destination path ''{0}'' contains files that cannot be deleted.\n\nClose this dialog and specify another path.
-createDirError_reason=The destination path ''{0}'' cannot be created.\n\nClose this dialog and specify another path.
-openBrowserError_reason=The default HTML browser on this system cannot be detected or located.\n\nClose this dialog and open the file ''{0}'' manually with an HTML browser.
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/actions/PublishConfigAction.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/actions/PublishConfigAction.java
deleted file mode 100644
index 3ea9919..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/actions/PublishConfigAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.actions;
-
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.wizards.PublishConfigWizard;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Invokes the Publish Method Configuration wizard.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PublishConfigAction implements IWorkbenchWindowActionDelegate {
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {
-		try {
-			// Instantiate and initialize the Publish Method Configuraiton
-			// wizard.
-			PublishConfigWizard wizard = new PublishConfigWizard();
-			wizard.init(PlatformUI.getWorkbench(), null);
-
-			// Instantiate the wizard container with the wizard and open it.
-			WizardDialog dialog = new WizardDialog(Display.getCurrent()
-					.getActiveShell(), wizard);
-			dialog.create();
-			dialog.open();
-		} catch (Exception e) {
-			PublishingUIPlugin.getDefault().getLogger().logError(
-					"Error publishing content", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/actions/package.html b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/actions/package.html
deleted file mode 100644
index d58ee07..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/actions/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides actions for the publishing UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/internal/wizards/PublishConfigOperation.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/internal/wizards/PublishConfigOperation.java
deleted file mode 100644
index bf3739f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/internal/wizards/PublishConfigOperation.java
+++ /dev/null
@@ -1,229 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.internal.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.epf.publishing.services.AbstractPublishManager;
-import org.eclipse.epf.publishing.services.AbstractViewBuilder;
-import org.eclipse.epf.publishing.services.PublishHTMLOptions;
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.program.Program;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The publish configuration operation.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PublishConfigOperation implements IRunnableWithProgress {
-
-	private static final String PUBLISH_CONFIG_ERROR_TITLE = PublishingUIResources.publishConfigDialog_title; //$NON-NLS-1$
-
-	private static final String PUBLISH_CONFIG_ERROR_MSG = PublishingUIResources.publishConfigError_msg; //$NON-NLS-1$
-
-	private static final String PUBLISH_CONFIG_ERROR_REASON = PublishingUIResources.publishConfigError_reason; //$NON-NLS-1$
-
-	private static final String PREVIEW_CONFIG_ERROR_TITLE = PublishingUIResources.previewConfigError_title; //$NON-NLS-1$
-
-	private static final String PREVIEW_CONFIG_ERROR_MSG = PublishingUIResources.previewConfigError_msg; //$NON-NLS-1$
-
-	private static final String VIEW_REPORT_ERROR_TITLE = PublishingUIResources.viewReportError_title; //$NON-NLS-1$
-
-	private static final String VIEW_REPORT_ERROR_MSG = PublishingUIResources.viewReportError_msg; //$NON-NLS-1$	
-
-	private static final String OPEN_BROWSER_ERROR_REASON = PublishingUIResources.openBrowserError_reason; //$NON-NLS-1$
-
-	private static final String PUBLISH_CONFIG_CANCEL_MSG = PublishingUIResources.cancelPublishConfig_msg; //$NON-NLS-1$
-
-	private AbstractPublishManager publishMgr;
-
-	private String published_url;
-
-	private String report_url;
-
-	private MsgDialog msgDialog;
-
-	private Exception runException;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishConfigOperation(AbstractPublishManager publishMgr) {
-		super();
-		this.publishMgr = publishMgr;
-		this.msgDialog = PublishingUIPlugin.getDefault().getMsgDialog();
-	}
-
-	/**
-	 * get the view builder.
-	 * 
-	 * @return AbstractViewBuilder
-	 */
-	public AbstractViewBuilder getViewBuilder() {
-		return this.publishMgr.getViewBuilder();
-	}
-
-	/**
-	 * get the url for the published site
-	 * 
-	 * @return String
-	 */
-	public String getPublishedUrl() {
-		return published_url;
-	}
-
-	/**
-	 * run the operation to perform the publishing task.
-	 * 
-	 * @param monitor
-	 *            IProgressMonitor
-	 * @throws InvocationTargetException
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException,
-			InterruptedException {
-		runException = null;
-		try {
-			monitor
-					.setTaskName(PublishingResources.publishingConfigurationTask_name); //$NON-NLS-1$			
-			publishMgr.publish(monitor);
-
-			published_url = publishMgr.getPublishedUrl();
-			report_url = publishMgr.getPublishReportUrl();
-		} catch (Exception e) {
-			runException = e;
-		}
-
-		final boolean canceled = monitor.isCanceled();
-
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				if (canceled) {
-					msgDialog.displayInfo(PUBLISH_CONFIG_ERROR_TITLE,
-							PUBLISH_CONFIG_CANCEL_MSG);
-					return;
-				}
-
-				if (published_url == null || report_url == null) {
-					msgDialog.displayError(PUBLISH_CONFIG_ERROR_TITLE,
-							PUBLISH_CONFIG_ERROR_MSG,
-							PUBLISH_CONFIG_ERROR_REASON, runException);
-					return;
-				}
-
-				PublishOptions options = publishMgr.getViewBuilder()
-						.getOptions();
-				if (options instanceof PublishHTMLOptions) {
-					if (!((PublishHTMLOptions) options)
-							.isPublishDynamicWebApp()) {
-						// Launch a HTML browser to view the published site.
-						if (openBrowser(published_url) == false) {
-							String reason = MessageFormat.format(
-									OPEN_BROWSER_ERROR_REASON,
-									new Object[] { published_url });
-							msgDialog.displayError(PREVIEW_CONFIG_ERROR_TITLE,
-									PREVIEW_CONFIG_ERROR_MSG, reason);
-						}
-					}
-				}
-
-				// Launch a HTML browser to view the report on the published
-				// site.
-				if (openBrowser(report_url) == false) {
-					String reason = MessageFormat.format(
-							OPEN_BROWSER_ERROR_REASON,
-							new Object[] { report_url });
-					msgDialog.displayError(VIEW_REPORT_ERROR_TITLE,
-							VIEW_REPORT_ERROR_MSG, reason);
-				}
-			}
-		});
-	}
-
-	/**
-	 * open a browser to show the published content.
-	 * 
-	 * @param url
-	 *            String the site url
-	 * @return boolean true if browser opened successfully.
-	 */
-	public boolean openBrowser(final String url) {
-		boolean success = false;
-		try {
-			// Launch the default HTML viewer to display the HTML page.
-			// On Linux, this can't launch urls, only local files can be
-			// launched.
-			// Sorry I have use internal class here.
-			// hope Eclipse.org can have a public api to do so.
-			if (SWT.getPlatform().equals("win32")) { //$NON-NLS-1$
-				success = Program.launch(url);
-			} else {
-				// IBrowser browser =
-				// org.eclipse.help.internal.browser.BrowserManager
-				// .getInstance().createBrowser(true);
-				// if (browser == null) {
-				// try {
-				// browser.displayURL(url);
-				// success = true;
-				// } catch (Exception e) {
-				// e.printStackTrace();
-				// }
-				// }
-
-				// 155490 - Cannot detected default browser when preview
-				// published configuration on Linux
-				// changed to use swt browser
-				success = true;
-				Display.getCurrent().asyncExec(new Runnable() {
-					public void run() {
-						// // open another swt browser since we have no (simple)
-						// way of creating a system default browser
-						// // the Eclipse guys hide all the good apis as
-						// internal
-						Shell shell = new Shell();
-						shell.setText(url);
-						GridLayout layout = new GridLayout();
-						layout.marginHeight = 0;
-						layout.marginWidth = 0;
-						shell.setLayout(layout);
-						Browser popup_browser = new Browser(shell, SWT.NONE);
-						popup_browser.setLayoutData(new GridData(
-								GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL
-										| GridData.GRAB_VERTICAL));
-						popup_browser.setUrl(url);
-						shell.open();
-					}
-				});
-			}
-		} catch (Exception e) {
-			e.printStackTrace();
-			success = false;
-		}
-
-		return success;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/package.html b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/package.html
deleted file mode 100644
index cb738fc..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for managing the publishing UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/ActivityDiagramPreferencePage.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/ActivityDiagramPreferencePage.java
deleted file mode 100644
index 234e4e3..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/ActivityDiagramPreferencePage.java
+++ /dev/null
@@ -1,168 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.preferences;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.library.ui.LibraryUIPlugin;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.ui.preferences.BasePreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-
-/**
- * Preference page for diagram options
- * 
- * @author Phong Le
- * @author Shilpa Toraskar
- * @since 1.0
- * 
- */
-public class ActivityDiagramPreferencePage extends BasePreferencePage implements
-		IWorkbenchPreferencePage, SelectionListener {
-
-	Composite composite;
-
-	int NUM_COLUMN = 3;
-
-	private Button ctrl_publish_unopen_activitydd;
-
-	private Button ctrl_publish_ad_for_activity_extension;
-	
-	public ActivityDiagramPreferencePage() {
-		super();
-	}
-
-	protected Control createContents(Composite parent) {
-
-		composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout(1, false));
-
-		// Create activity diagram group.
-		Group activityDiagramGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.preference_Activity_Diagram, 1);
-
-		ctrl_publish_ad_for_activity_extension = createCheckbox(
-				activityDiagramGroup,
-				AuthoringUIResources.prompt_for_publish_extend_activity_diagram);
-
-		// Create activity detatil diagram group.
-		Group activityDetailDiagramGroup = createGridLayoutGroup(composite,
-				AuthoringUIResources.preference_Activity_Detail_Diagram, 1);
-
-		ctrl_publish_unopen_activitydd = createCheckbox(
-				activityDetailDiagramGroup,
-				AuthoringUIResources.promptfor_publish_unopen_activitydd_text);
-		
-//		ctrl_publish_unopen_activitydd = new Button(composite, SWT.CHECK);
-//		ctrl_publish_unopen_activitydd
-//				.setText(AuthoringUIResources.promptfor_publish_unopen_activitydd_text); 
-//
-//		GridData data = new GridData();
-//		data.horizontalSpan = 3;
-//		data.horizontalAlignment = GridData.FILL;
-//		ctrl_publish_unopen_activitydd.setLayoutData(data);
-//		
-//		ctrl_publish_ad_for_activity_extension = new Button(composite, SWT.CHECK);
-//		ctrl_publish_ad_for_activity_extension
-//				.setText(AuthoringUIResources.prompt_for_publish_extend_activity_diagram); 
-//				
-		
-		initializeValues();
-
-		return composite;
-	}
-
-	public void init(IWorkbench workbench) {
-
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PreferencePage
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		initializeDefaults();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PreferencePage
-	 */
-	public boolean performOk() {
-		storeValues();
-		LibraryUIPlugin.getDefault().savePluginPreferences();
-
-		// update the settings for browsing
-		PublishingUIPlugin.getDefault().updateLayoutSettings();
-
-		return true;
-	}
-
-	/**
-	 * Stores the values of the controls back to the preference store.
-	 */
-	private void storeValues() {
-		// IPreferenceStore store = getPreferenceStore();
-		// store.setValue(LibraryPreferenceConstants.PREF_PROMPT_FOR_LIBRARY_AT_STARTUP,
-		// ctrl_publish_unopen_activitydd.getSelection());
-		LibraryUIPreferences
-				.setPublishUnopenActivitydd(ctrl_publish_unopen_activitydd
-						.getSelection());
-		LibraryUIPreferences
-				.setPublishADForActivityExtension(ctrl_publish_ad_for_activity_extension
-						.getSelection());
-	}
-
-	private void initializeDefaults() {
-		// IPreferenceStore store = getPreferenceStore();
-		ctrl_publish_unopen_activitydd.setSelection(false);
-		ctrl_publish_ad_for_activity_extension.setSelection(true);
-	}
-
-	/**
-	 * Initializes states of the controls from the preference store.
-	 */
-	private void initializeValues() {
-		// IPreferenceStore store = getPreferenceStore();
-		// ctrl_publish_unopen_activitydd.setSelection(store.getBoolean(LibraryPreferenceConstants.PREF_PROMPT_FOR_LIBRARY_AT_STARTUP));
-		ctrl_publish_unopen_activitydd.setSelection(LibraryUIPreferences
-				.getPublishUnopenActivitydd());
-		ctrl_publish_ad_for_activity_extension
-				.setSelection(LibraryUIPreferences
-						.getPublishADForActivityExtension());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.authoring.ui.preferences.CommonPrefPage#doGetPreferenceStore()
-	 */
-	protected IPreferenceStore doGetPreferenceStore() {
-		return LibraryUIPlugin.getDefault().getPreferenceStore();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/DeleteConfigCommandListener.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/DeleteConfigCommandListener.java
deleted file mode 100644
index 596f96e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/DeleteConfigCommandListener.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.preferences;
-
-import java.util.Collection;
-import java.util.Iterator;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.library.edit.command.DeleteMethodElementCommand;
-import org.eclipse.epf.library.edit.command.IDeleteMethodElementCommandListener;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * Command listener for DeleteMethodElementCommand
- * Clean all configuration specific publishing preferences when the configuration is deleted
- * @author Xiang Dong Hu
- * @since 1.2
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=181487
- */
-public class DeleteConfigCommandListener implements
-		IDeleteMethodElementCommandListener {
-
-	public void collectObjectsToDeleteContent(Collection collectedObjects,
-			MethodElement element) {
-
-	}
-
-	public boolean collectObjectsToRemove(Collection objectsToRemove,
-			EObject elementToDelete, EObject referencer, Collection references) {
-		return false;
-	}
-
-	public Class getCommandType() {
-		return DeleteMethodElementCommand.class;
-	}
-
-	public void notifyExecuted(Command command) {
-		Collection result = ((DeleteMethodElementCommand)command).getResult();
-		for (Iterator it = result.iterator(); it.hasNext();){
-			Object element = it.next();
-			if(element instanceof MethodConfiguration){
-				String configId = ((MethodConfiguration)element).getGuid();
-				removePublishPreferences(configId);
-			}
-		}
-		PublishingUIPreferences.saveAllPreferences();
-	}
-
-	public void preExecute(Command command) {
-
-	}
-
-	public void preUndo(Command command) {
-
-	}
-	
-	protected void removePublishPreferences(String configId){
-		PublishingUIPreferences.removeAboutHTML(configId);
-		PublishingUIPreferences.removeBannerImage(configId);
-		PublishingUIPreferences.removeCheckExternalLinks(configId);
-		PublishingUIPreferences.removeConfigPrefInitialized(configId);
-		PublishingUIPreferences.removeConvertBrokenLinks(configId);
-		PublishingUIPreferences.removeExtraDescriptorInfo(configId);
-		PublishingUIPreferences.removeFeedbackURL(configId);
-		PublishingUIPreferences.removeIncludeGlossary(configId);
-		PublishingUIPreferences.removeIncludeIndex(configId);
-		PublishingUIPreferences.removeIncludeSearch(configId);
-		PublishingUIPreferences.removeIncludeServletSearch(configId);
-		PublishingUIPreferences.removeLightWeightTree(configId);
-		PublishingUIPreferences.removePublishEntireConfig(configId);
-		PublishingUIPreferences.removePublishADForActivityExtension(configId);
-		PublishingUIPreferences.removePublishPath(configId);
-		PublishingUIPreferences.removePublishStaticWebSite(configId);
-		PublishingUIPreferences.removePublishUnopenActivityDD(configId);
-		PublishingUIPreferences.removeTitle(configId);
-		PublishingUIPreferences.removeWebAppName(configId);
-		PublishingUIPreferences.removeShowRelatedDescriptors(configId);
-		PublishingUIPreferences.removeShowDescriptorsInNavigationTree(configId);
-	}
-
-	public void postUndo(Command command) {
-		// TODO Auto-generated method stub
-		
-	}
-
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/PublishingPreferencePage.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/PublishingPreferencePage.java
deleted file mode 100644
index ea59cea..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/PublishingPreferencePage.java
+++ /dev/null
@@ -1,224 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.preferences;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.ui.preferences.BasePreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * The Publishing preference page.
- * 
- * @author Kelvin Low
- * @since 1.0
- * 
- * Bugs fixed:
- * <ul>
- * <li>https://bugs.eclipse.org/bugs/show_bug.cgi?id=156957</li>
- * </ul>
- */
-public class PublishingPreferencePage extends BasePreferencePage {
-
-	private Composite composite;
-
-	private Text destinationPathText;
-
-	private Text feedbackURLText;
-
-	private Button browseButton;
-
-	private Button extraDescriptorInfoCheckbox;
-
-	/**
-	 * Creates and returns the SWT control for the customized body of this
-	 * preference page under the given parent composite.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return the new control
-	 */
-	protected Control createContents(Composite parent) {
-		composite = createGridLayoutComposite(parent, 1);
-
-		// Create the Destination path group.
-		/*
-		 * Group destinationGroup = createGridLayoutGroup(composite,
-		 * PublishingUIResources.destinationDirectoryGroup_text, 3);
-		 */
-
-		// Create the Published Website group.
-		Group webSiteGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.publishWebSiteGroup_text, 3);
-		createLabel(webSiteGroup,
-				PublishingUIResources.preferencePage_defaultPath_text);
-		destinationPathText = createEditableText(webSiteGroup);
-		browseButton = createButton(webSiteGroup,
-				AuthoringUIText.BROWSE_BUTTON_TEXT);
-		createLabel(webSiteGroup, PublishingUIResources.feedbackURLLabel_text);
-		feedbackURLText = createEditableText(webSiteGroup, 2);
-
-		// Create the Browsing group.
-		Group browsingGroup = createGridLayoutGroup(composite, PublishingUIResources.browsingLayoutGroup_text, 1);
-		extraDescriptorInfoCheckbox = createCheckbox(browsingGroup,
-				PublishingUIResources.publishExtraDescriptorInfoLabel_text, 1);
-
-		initControls();
-
-		addListeners();
-
-		return composite;
-	}
-
-	/**
-	 * Initializes the preference page controls with data.
-	 */
-	protected void initControls() {
-		destinationPathText.setText(PublishingUIPreferences.getPublishPath());
-		feedbackURLText.setText(PublishingUIPreferences.getFeedbackURL());
-		extraDescriptorInfoCheckbox.setSelection(PublishingUIPreferences
-				.getExtraDescriptorInfo());
-	}
-
-	/**
-	 * Adds event listeners to the preference page controls.
-	 */
-	protected void addListeners() {
-		destinationPathText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (!isPathValid(destinationPathText.getText())) {
-					setValid(false);
-				} else {
-					setValid(true);
-				}
-			}
-		});
-
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				openDirectoryDialog();
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		initializeDefaults();
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		storeValues();
-		PublishingUIPreferences.saveAllPreferences();
-		
-		// update the settings for browsing
-		PublishingUIPlugin.getDefault().updateLayoutSettings();
-
-		return true;
-	}
-
-	/**
-	 * Stores the values of the controls back to the preference store.
-	 */
-	private void storeValues() {
-		PublishingUIPreferences.setPublishPath(destinationPathText.getText()
-				.trim());
-		PublishingUIPreferences
-				.setFeedbackURL(feedbackURLText.getText().trim());
-		PublishingUIPreferences
-				.setExtraDescriptorInfo(extraDescriptorInfoCheckbox
-						.getSelection());
-
-//		// FIXME! Review implementation.
-//		// allow to pass the value to the library browsing
-//		// System.setProperty(EXTRA_DESCRIPTOR_INFO,
-//		// extraDescriptorInfoCtr.getSelection() ? "true" : "false");
-//		DefaultContentValidator
-//				.setDefaultShowExtraInfoForDescriptors(extraDescriptorInfoCheckbox
-//						.getSelection());
-	}
-
-	private void initializeDefaults() {
-		destinationPathText.setText(PublishingUIPreferences
-				.getDefaultPublishPath());
-		feedbackURLText
-				.setText(PublishingUIPreferences.getDefaultFeedbackURL());
-		extraDescriptorInfoCheckbox.setSelection(PublishingUIPreferences
-				.getDefaultExtraDescriptorInfo());
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
-	 */
-	protected IPreferenceStore doGetPreferenceStore() {
-		return PublishingUIPlugin.getDefault().getPreferenceStore();
-	}
-
-	/**
-	 * Validates the user specified destination path.
-	 */
-	private boolean isPathValid(String path) {
-		if (path == null || path.length() <= 0) {
-			setErrorMessage(PublishingUIResources.invalidPathError_msg); //$NON-NLS-1$
-			return false;
-		}
-
-		IPath ecPath = Path.fromOSString(path);
-		boolean isValid = ecPath.isValidPath(path);
-		if (!isValid) {
-			setErrorMessage(PublishingUIResources.invalidPathError_msg); //$NON-NLS-1$
-			return false;
-		} else if (!StrUtil.isValidPublishPath(path)) {
-			setErrorMessage(PublishingUIResources.invalidPathCharsError_msg); //$NON-NLS-1$
-			return false;
-		}
-
-		setErrorMessage(null);
-		return true;
-	}
-
-	/**
-	 * Opens the directory dialog.
-	 */
-	private void openDirectoryDialog() {
-		try {
-			DirectoryDialog dd = new DirectoryDialog(composite.getShell(),
-					SWT.NONE);
-			String destination = dd.open();
-			if (destination != null) {
-				destinationPathText.setText(destination);
-			}
-		} catch (Exception e) {
-			PublishingUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/PublishingUIPreferences.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/PublishingUIPreferences.java
deleted file mode 100644
index ab65376..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/PublishingUIPreferences.java
+++ /dev/null
@@ -1,1131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.preferences;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.layout.elements.ActivityLayout;
-import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Manages the Publishing UI preferences.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PublishingUIPreferences {
-
-	private static final String PUBLISH_ENTIRE_CONFIG = "publishEntireConfig"; //$NON-NLS-1$
-
-	private static final String TITLE = "title"; //$NON-NLS-1$
-
-	private static final String BANNER_IMAGE = "bannerImage"; //$NON-NLS-1$
-
-	private static final String ABOUT_HTML = "aboutHTML"; //$NON-NLS-1$
-
-	private static final String FEEDBACK_URL = "feedbackURL"; //$NON-NLS-1$	
-
-	private static final String INCLUDE_GLOSSARY = "includeGlossary"; //$NON-NLS-1$
-
-	private static final String INCLUDE_INDEX = "includeIndex"; //$NON-NLS-1$
-
-	private static final String CHECK_EXTERNAL_LINKS = "checkExternalLinks"; //$NON-NLS-1$
-
-	private static final String CONVERT_BROKEN_LINKS = "convertBrokenLinks"; //$NON-NLS-1$
-
-	private static final String LIGHT_WEIGHT_TREE = "lightWeightTree"; //$NON-NLS-1$
-
-	private static final String EXTRA_DESCRIPTOR_INFO = "extraDescriptorInfo"; //$NON-NLS-1$
-
-	private static final String PUBLISH_UNOPEN_ACTIVITY_DD = "publishUnopenActivityDD"; //$NON-NLS-1$
-
-	private static final String PUBLISH_AD_FOR_ACTIVITY_EXTENSION = "publishADForActivityExtension"; //$NON-NLS-1$
-
-	private static final String PUBLISH_PATH = "publishPath"; //$NON-NLS-1$
-
-	private static final String PUBLISH_STATIC_WEB_SITE = "publishStaticWebSite"; //$NON-NLS-1$
-
-	private static final String INCLUDE_SERVLET_SEARCH = "includeServletSearch"; //$NON-NLS-1$
-
-	private static final String WEBAPP_NAME = "webAppName"; //$NON-NLS-1$
-
-	private static final String INCLUDE_SEARCH = "includeSearch"; //$NON-NLS-1$
-
-	private static final String INITIALIZED = "initialized"; //$NON-NLS-1$
-
-	private static final String SHOW_RELATED_DESCRIPTORS = "showRelatedDescriptors"; //$NON-NLS-1$
-
-	private static final String SHOW_DESCRIPTORS_IN_NAVIGATIONTREE = "showDescriptorsInNavigationTree"; //$NON-NLS-1$
-
-	private static final String DEFAULT_ACTIVITY_TAB = "defaultActivityTab"; //$NON-NLS-1$
-
-	private static final String DEFAULT_PUBLISH_FOLDER_NAME = "Publish"; //$NON-NLS-1$
-
-	private static String defaultTitle = null;
-
-	private static String defaultBannerImage = null;
-
-	private static String defaultAboutHTML = null;
-
-	private static String defaultFeedbackURL = null;
-
-	private static String defaultPublishPath = null;
-
-	// The plug-in specific preference store.
-	private static IPreferenceStore prefStore = PublishingUIPlugin.getDefault()
-			.getPreferenceStore();
-
-	static {
-		// Initialize the default preference values.
-		prefStore.setDefault(PUBLISH_ENTIRE_CONFIG, true);
-
-		prefStore.setDefault(TITLE, getDefaultTitle());
-		prefStore.setDefault(BANNER_IMAGE, getDefaultBannerImage());
-		prefStore.setDefault(ABOUT_HTML, getDefaultAboutHTML());
-		prefStore.setDefault(FEEDBACK_URL, getDefaultFeedbackURL());
-		prefStore.setDefault(INCLUDE_GLOSSARY, false);
-		prefStore.setDefault(INCLUDE_INDEX, false);
-		prefStore.setDefault(CHECK_EXTERNAL_LINKS, false);
-		prefStore.setDefault(CONVERT_BROKEN_LINKS, false);
-		prefStore.setDefault(PUBLISH_UNOPEN_ACTIVITY_DD, false);
-		prefStore.setDefault(PUBLISH_AD_FOR_ACTIVITY_EXTENSION, false);
-		prefStore.setDefault(LIGHT_WEIGHT_TREE, true);
-		prefStore.setDefault(EXTRA_DESCRIPTOR_INFO,
-				getDefaultExtraDescriptorInfo());
-		prefStore.setDefault(DEFAULT_ACTIVITY_TAB,
-				ActivityLayout.TAB_NAME_ACTIVITY_WBS);
-
-		prefStore.setDefault(PUBLISH_PATH, getDefaultPublishPath());
-		prefStore.setDefault(PUBLISH_STATIC_WEB_SITE, true);
-		prefStore.setDefault(INCLUDE_SERVLET_SEARCH, true);
-		prefStore.setDefault(WEBAPP_NAME, ""); //$NON-NLS-1$			
-		prefStore.setDefault(INCLUDE_SEARCH, true);
-	}
-
-	/**
-	 * Gets the publish entire configuration preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getPublishEntireConfig(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ PUBLISH_ENTIRE_CONFIG);
-		} else {
-			return prefStore.getBoolean(PUBLISH_ENTIRE_CONFIG);
-		}
-	}
-
-	/**
-	 * Sets the publish entire configurationpreference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setPublishEntireConfig(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ PUBLISH_ENTIRE_CONFIG, value);
-	}
-
-	/**
-	 * Sets the publish entire configuration preference to be default value
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removePublishEntireConfig(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ PUBLISH_ENTIRE_CONFIG);
-	}
-
-	/**
-	 * Gets the default title for a published website.
-	 * 
-	 * @return the default title for a published website
-	 */
-	public static String getDefaultTitle() {
-		if (defaultTitle == null) {
-			String url = PublishingUIPlugin.getDefault().getString("title"); //$NON-NLS-1$
-			if (url == null || url.length() == 0 || url.startsWith("[")) { //$NON-NLS-1$
-				url = ""; //$NON-NLS-1$
-			}
-			defaultTitle = url;
-		}
-		return defaultTitle;
-	}
-
-	/**
-	 * Gets the web site title preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the web site title
-	 */
-	public static String getTitle(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getString(getConfigPrefPrefix(configId) + TITLE);
-		} else {
-			return prefStore.getString(TITLE);
-		}
-	}
-
-	/**
-	 * Sets the web site title preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param title
-	 *            the web site title
-	 */
-	public static void setTitle(String configId, String title) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + TITLE, title);
-	}
-
-	/**
-	 * Sets the web site title preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeTitle(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + TITLE);
-	}
-
-	/**
-	 * Gets the default banner image for a published website.
-	 * 
-	 * @return the default banner image for a published website
-	 */
-	public static String getDefaultBannerImage() {
-		if (defaultBannerImage == null) {
-			String image = PublishingUIPlugin.getDefault().getString(
-					"bannerImage"); //$NON-NLS-1$
-			if (image == null || image.length() == 0 || image.startsWith("[")) { //$NON-NLS-1$
-				image = ""; //$NON-NLS-1$
-			}
-			defaultBannerImage = image;
-		}
-		return defaultBannerImage;
-	}
-
-	/**
-	 * Gets the banner image preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the banner image
-	 */
-	public static String getBannerImage(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getString(getConfigPrefPrefix(configId)
-					+ BANNER_IMAGE);
-		} else {
-			return prefStore.getString(BANNER_IMAGE);
-		}
-	}
-
-	/**
-	 * Sets the banner image preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param image
-	 *            the banner image URL
-	 */
-	public static void setBannerImage(String configId, String image) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + BANNER_IMAGE, image);
-	}
-
-	/**
-	 * Sets the banner image preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeBannerImage(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + BANNER_IMAGE);
-	}
-
-	/**
-	 * Gets the default about HTML for a published website.
-	 * 
-	 * @return the default about HTML for a published website
-	 */
-	public static String getDefaultAboutHTML() {
-		if (defaultAboutHTML == null) {
-			String file = PublishingUIPlugin.getDefault()
-					.getString("aboutHTML"); //$NON-NLS-1$
-			if (file == null || file.length() == 0 || file.startsWith("[")) { //$NON-NLS-1$
-				file = ""; //$NON-NLS-1$
-			}
-			defaultAboutHTML = file;
-		}
-		return defaultAboutHTML;
-	}
-
-	/**
-	 * Gets the about HTML preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the about HTML file path
-	 */
-	public static String getAboutHTML(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getString(getConfigPrefPrefix(configId)
-					+ ABOUT_HTML);
-		} else {
-			return prefStore.getString(ABOUT_HTML);
-		}
-	}
-
-	/**
-	 * Sets the about HTML preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param path
-	 *            the about HTML file path
-	 */
-	public static void setAboutHTML(String configId, String path) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + ABOUT_HTML, path);
-	}
-
-	/**
-	 * Sets the about HTML preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeAboutHTML(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + ABOUT_HTML);
-	}
-
-	/**
-	 * Gets the default feedback URL for a published website.
-	 * 
-	 * @return the default feedback URL for a published website
-	 */
-	public static String getDefaultFeedbackURL() {
-		if (defaultFeedbackURL == null) {
-			defaultFeedbackURL = "http://www.published_website.com/feedback"; //$NON-NLS-1$
-		}
-		return defaultFeedbackURL;
-	}
-
-	/**
-	 * Gets the feedback URL preference value.
-	 * 
-	 * @return the feedback URL
-	 */
-	public static String getFeedbackURL() {
-		return prefStore.getString(FEEDBACK_URL);
-	}
-
-	/**
-	 * Sets the feedback URL preference value.
-	 * 
-	 * @param url
-	 *            the feedback URL
-	 */
-	public static void setFeedbackURL(String url) {
-		prefStore.setValue(FEEDBACK_URL, url);
-	}
-
-	/**
-	 * Gets the feedback URL preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the feedback URL
-	 */
-	public static String getFeedbackURL(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getString(getConfigPrefPrefix(configId)
-					+ FEEDBACK_URL);
-		} else {
-			return prefStore.getString(FEEDBACK_URL);
-		}
-	}
-
-	/**
-	 * Sets the feedback URL preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param url
-	 *            the feedback URL
-	 */
-	public static void setFeedbackURL(String configId, String url) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + FEEDBACK_URL, url);
-	}
-
-	/**
-	 * Sets the feedback URL preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeFeedbackURL(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + FEEDBACK_URL);
-	}
-
-	/**
-	 * Gets the include glossary preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getIncludeGlossary(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ INCLUDE_GLOSSARY);
-		} else {
-			return prefStore.getBoolean(INCLUDE_GLOSSARY);
-		}
-	}
-
-	/**
-	 * Sets the include glossary preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setIncludeGlossary(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + INCLUDE_GLOSSARY,
-				value);
-	}
-
-	/**
-	 * Sets the include glossary preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeIncludeGlossary(String configId) {
-		prefStore
-				.setToDefault(getConfigPrefPrefix(configId) + INCLUDE_GLOSSARY);
-	}
-
-	/**
-	 * Gets the include index preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getIncludeIndex(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ INCLUDE_INDEX);
-		} else {
-			return prefStore.getBoolean(INCLUDE_INDEX);
-		}
-	}
-
-	/**
-	 * Sets the include index preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setIncludeIndex(String configId, boolean value) {
-		prefStore
-				.setValue(getConfigPrefPrefix(configId) + INCLUDE_INDEX, value);
-	}
-
-	/**
-	 * Sets the include index preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeIncludeIndex(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + INCLUDE_INDEX);
-	}
-
-	/**
-	 * Gets the check external links preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getCheckExternalLinks(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ CHECK_EXTERNAL_LINKS);
-		} else {
-			return prefStore.getBoolean(CHECK_EXTERNAL_LINKS);
-		}
-	}
-
-	/**
-	 * Sets the check external links preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setCheckExternalLinks(String configId, boolean value) {
-		prefStore.setValue(
-				getConfigPrefPrefix(configId) + CHECK_EXTERNAL_LINKS, value);
-	}
-
-	/**
-	 * Sets the check external links preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeCheckExternalLinks(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ CHECK_EXTERNAL_LINKS);
-	}
-
-	/**
-	 * Gets the convert broken links preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getConvertBrokenLinks(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ CONVERT_BROKEN_LINKS);
-		} else {
-			return prefStore.getBoolean(CONVERT_BROKEN_LINKS);
-		}
-	}
-
-	/**
-	 * Sets the convert broken links preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setConvertBrokenLinks(String configId, boolean value) {
-		prefStore.setValue(
-				getConfigPrefPrefix(configId) + CONVERT_BROKEN_LINKS, value);
-	}
-
-	/**
-	 * Sets the convert broken links preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeConvertBrokenLinks(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ CONVERT_BROKEN_LINKS);
-	}
-
-	/**
-	 * Gets the publish unopen activity detail diagrams preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getPublishUnopenActivityDD(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ PUBLISH_UNOPEN_ACTIVITY_DD);
-		} else {
-			return prefStore.getBoolean(PUBLISH_UNOPEN_ACTIVITY_DD);
-		}
-	}
-
-	/**
-	 * Sets the publish unopen activity detail diagrams preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setPublishUnopenActivityDD(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ PUBLISH_UNOPEN_ACTIVITY_DD, value);
-	}
-
-	/**
-	 * Sets the publish unopen activity detail diagrams preference to be default
-	 * value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removePublishUnopenActivityDD(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ PUBLISH_UNOPEN_ACTIVITY_DD);
-	}
-
-	/**
-	 * Gets the publish activiy diagrams for base activities with unmodified
-	 * extension preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getPublishADForActivityExtension(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ PUBLISH_AD_FOR_ACTIVITY_EXTENSION);
-		} else {
-			return prefStore.getBoolean(PUBLISH_AD_FOR_ACTIVITY_EXTENSION);
-		}
-	}
-
-	/**
-	 * Sets the publish activiy diagrams for base activities with unmodified
-	 * extension preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setPublishADForActivityExtension(String configId,
-			boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ PUBLISH_AD_FOR_ACTIVITY_EXTENSION, value);
-	}
-
-	/**
-	 * Sets the publish activiy diagrams for base activities with unmodified
-	 * extension preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removePublishADForActivityExtension(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ PUBLISH_AD_FOR_ACTIVITY_EXTENSION);
-	}
-
-	/**
-	 * Gets the light weight tree preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getLightWeightTree(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ LIGHT_WEIGHT_TREE);
-		} else {
-			return prefStore.getBoolean(LIGHT_WEIGHT_TREE);
-		}
-	}
-
-	/**
-	 * Sets the light weight tree preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setLightWeightTree(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + LIGHT_WEIGHT_TREE,
-				value);
-	}
-
-	/**
-	 * Sets the light weight tree preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeLightWeightTree(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ LIGHT_WEIGHT_TREE);
-	}
-
-	/**
-	 * Gets the default extra descriptor info preference value.
-	 * 
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getDefaultExtraDescriptorInfo() {
-		return false;
-	}
-
-	/**
-	 * Gets the extra descriptor info preference value.
-	 * 
-	 * @return the preference value
-	 */
-	public static boolean getExtraDescriptorInfo() {
-		return prefStore.getBoolean(EXTRA_DESCRIPTOR_INFO);
-	}
-
-	/**
-	 * Sets the default extra descriptor info preference value.
-	 * 
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setExtraDescriptorInfo(boolean value) {
-		prefStore.setValue(EXTRA_DESCRIPTOR_INFO, value);
-	}
-
-	/**
-	 * Gets the extra descriptor info preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getExtraDescriptorInfo(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ EXTRA_DESCRIPTOR_INFO);
-		} else {
-			return prefStore.getBoolean(EXTRA_DESCRIPTOR_INFO);
-		}
-	}
-
-	/**
-	 * Sets the extra descriptor info preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setExtraDescriptorInfo(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ EXTRA_DESCRIPTOR_INFO, value);
-	}
-
-	/**
-	 * Sets the extra descriptor info preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeExtraDescriptorInfo(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ EXTRA_DESCRIPTOR_INFO);
-	}
-
-	/**
-	 * Gets the default path for a published web site.
-	 * 
-	 * @return the default path for a published web site.
-	 */
-	public static String getDefaultPublishPath() {
-		if (defaultPublishPath == null) {
-			defaultPublishPath = System.getProperty("user.home"); //$NON-NLS-1$
-			String appName = LibraryUIPreferences.getApplicationShortName();
-			if (appName != null && appName.length() > 0) {
-				defaultPublishPath = defaultPublishPath + FileUtil.FILE_SEP
-						+ appName + FileUtil.FILE_SEP
-						+ DEFAULT_PUBLISH_FOLDER_NAME;
-			} else {
-				defaultPublishPath = defaultPublishPath + FileUtil.FILE_SEP
-						+ DEFAULT_PUBLISH_FOLDER_NAME;
-			}
-		}
-		return defaultPublishPath;
-	}
-
-	/**
-	 * Gets the publish path preference value.
-	 * 
-	 * @return the publish path
-	 */
-	public static String getPublishPath() {
-		return prefStore.getString(PUBLISH_PATH);
-	}
-
-	/**
-	 * Sets the publish path preference value.
-	 * 
-	 * @param path
-	 *            the publish path
-	 */
-	public static void setPublishPath(String path) {
-		prefStore.setValue(PUBLISH_PATH, path);
-	}
-
-	/**
-	 * Gets the publish path preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the publish path
-	 */
-	public static String getPublishPath(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getString(getConfigPrefPrefix(configId)
-					+ PUBLISH_PATH);
-		} else {
-			return prefStore.getString(PUBLISH_PATH);
-		}
-	}
-
-	/**
-	 * Sets the publish path preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param path
-	 *            the publish path
-	 */
-	public static void setPublishPath(String configId, String path) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + PUBLISH_PATH, path);
-	}
-
-	/**
-	 * Sets the publish path preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removePublishPath(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + PUBLISH_PATH);
-	}
-
-	/**
-	 * Gets the publish static web site preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getPublishStaticWebSite(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ PUBLISH_STATIC_WEB_SITE);
-		} else {
-			return prefStore.getBoolean(PUBLISH_STATIC_WEB_SITE);
-		}
-	}
-
-	/**
-	 * Sets the publish static web site preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setPublishStaticWebSite(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ PUBLISH_STATIC_WEB_SITE, value);
-	}
-
-	/**
-	 * Sets the publish static web site preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removePublishStaticWebSite(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ PUBLISH_STATIC_WEB_SITE);
-	}
-
-	/**
-	 * Gets the include applet search preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getIncludeServletSearch(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ INCLUDE_SERVLET_SEARCH);
-		} else {
-			return prefStore.getBoolean(INCLUDE_SERVLET_SEARCH);
-		}
-	}
-
-	/**
-	 * Sets the include servlet search preference value..
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setIncludeServletSearch(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ INCLUDE_SERVLET_SEARCH, value);
-	}
-
-	/**
-	 * Sets the include servlet search preference to be default value..
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeIncludeServletSearch(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ INCLUDE_SERVLET_SEARCH);
-	}
-
-	/**
-	 * Gets the include search preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return <code>true</code> if the preference is set
-	 */
-	public static boolean getIncludeSearch(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getBoolean(getConfigPrefPrefix(configId)
-					+ INCLUDE_SEARCH);
-		} else {
-			return prefStore.getBoolean(INCLUDE_SEARCH);
-		}
-	}
-
-	/**
-	 * Sets the include search preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setIncludeSearch(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + INCLUDE_SEARCH,
-				value);
-	}
-
-	/**
-	 * Sets the include search preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeIncludeSearch(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + INCLUDE_SEARCH);
-	}
-
-	/**
-	 * Gets the web application name preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the preference value
-	 */
-	public static String getWebAppName(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getString(getConfigPrefPrefix(configId)
-					+ WEBAPP_NAME);
-		} else {
-			return prefStore.getString(WEBAPP_NAME);
-		}
-	}
-
-	/**
-	 * Sets the web application name preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param name
-	 *            the web application name
-	 */
-	public static void setWebAppName(String configId, String name) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + WEBAPP_NAME, name);
-	}
-
-	/**
-	 * Sets the web application name preference to be default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeWebAppName(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + WEBAPP_NAME);
-	}
-
-	/**
-	 * Gets the method configuration specific preference prefix.
-	 * 
-	 * @param configId
-	 *            the name of a method configuration
-	 * @return a preference prefix assigned to the configuration
-	 */
-	public static String getConfigPrefPrefix(String configId) {
-		return configId + "."; //$NON-NLS-1$
-	}
-
-	/**
-	 * Gets the configuration specific preferences initialized preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the preference value
-	 */
-	public static boolean getConfigPrefInitialized(String configId) {
-		return prefStore
-				.getBoolean(getConfigPrefPrefix(configId) + INITIALIZED);
-	}
-
-	/**
-	 * Sets the configuration specific preferences initialized preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setConfigPrefInitialized(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId) + INITIALIZED, value);
-	}
-
-	/**
-	 * Sets the configuration specific preferences initialized preference to be
-	 * default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeConfigPrefInitialized(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId) + INITIALIZED);
-	}
-
-	/**
-	 * Gets the show related descriptors in content page preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the preference value
-	 */
-	public static boolean getShowRelatedDescriptors(String configId) {
-		return prefStore.getBoolean(getConfigPrefPrefix(configId)
-				+ SHOW_RELATED_DESCRIPTORS);
-	}
-
-	/**
-	 * Sets the show related descriptors in content page preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setShowRelatedDescriptors(String configId, boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ SHOW_RELATED_DESCRIPTORS, value);
-	}
-
-	/**
-	 * Sets the show related descriptors in content page preference to be
-	 * default value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeShowRelatedDescriptors(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ SHOW_RELATED_DESCRIPTORS);
-	}
-
-	/**
-	 * Gets the show descriptors in navigation tree preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the preference value
-	 */
-	public static boolean getShowDescriptorsInNavigationTree(String configId) {
-		return prefStore.getBoolean(getConfigPrefPrefix(configId)
-				+ SHOW_DESCRIPTORS_IN_NAVIGATIONTREE);
-	}
-
-	/**
-	 * Sets the show descriptors in navigation tree preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param value
-	 *            the preference value
-	 */
-	public static void setShowDescriptorsInNavigationTree(String configId,
-			boolean value) {
-		prefStore.setValue(getConfigPrefPrefix(configId)
-				+ SHOW_DESCRIPTORS_IN_NAVIGATIONTREE, value);
-	}
-
-	/**
-	 * Sets the show descriptors in navigation tree preference to be default
-	 * value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 */
-	public static void removeShowDescriptorsInNavigationTree(String configId) {
-		prefStore.setToDefault(getConfigPrefPrefix(configId)
-				+ SHOW_DESCRIPTORS_IN_NAVIGATIONTREE);
-	}
-
-	/**
-	 * Gets the default activity tab preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @return the default activity tab name
-	 */
-	public static String getDefaultActivityTab(String configId) {
-		if (getConfigPrefInitialized(configId)) {
-			return prefStore.getString(getConfigPrefPrefix(configId)
-					+ DEFAULT_ACTIVITY_TAB);
-		} else {
-			return prefStore.getString(DEFAULT_ACTIVITY_TAB);
-		}
-	}
-
-	/**
-	 * Sets the default activity tab preference value.
-	 * 
-	 * @param configId
-	 *            a method configuration GUID
-	 * @param tabName
-	 *            the default activity tab name
-	 */
-	public static void setDefaultActivityTab(String configId, String tabName) {
-		prefStore.setValue(
-				getConfigPrefPrefix(configId) + DEFAULT_ACTIVITY_TAB, tabName);
-	}
-
-	/**
-	 * Saves all the preferences.
-	 */
-	public static void saveAllPreferences() {
-		PublishingUIPlugin.getDefault().savePluginPreferences();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/RoleDiagramPreferencePage.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/RoleDiagramPreferencePage.java
deleted file mode 100644
index d48e443..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/RoleDiagramPreferencePage.java
+++ /dev/null
@@ -1,208 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.preferences;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.preferences.LibraryPreferences;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.ui.preferences.BasePreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * The Publishing preference page.
- * 
- * @author Kelvin Low
- * @since 1.0
- * 
- * Bugs fixed:
- * <ul>
- * <li>https://bugs.eclipse.org/bugs/show_bug.cgi?id=156957</li>
- * </ul>
- */
-public class RoleDiagramPreferencePage extends BasePreferencePage implements
-		ModifyListener {
-
-	private static int MIN_HORIZONTAL_SPACING = 50;
-
-	private static int MAX_HORIZONTAL_SPACING = 200;
-
-	private static int MIN_VERTICAL_SPACING = 25;
-
-	private static int MAX_VERTICAL_SPACING = 100;
-
-	private static int MIN_TEXT_LINES = 1;
-
-	private static int MAX_TEXT_LINES = 5;
-
-	private Composite composite;
-
-	private Text horizonalSpacingText;
-
-	private Text verticalSpacingText;
-
-	private Text textLinesText;
-
-	/**
-	 * Creates and returns the SWT control for the customized body of this
-	 * preference page under the given parent composite.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return the new control
-	 */
-	protected Control createContents(Composite parent) {
-		composite = new Composite(parent, SWT.NULL);
-		composite.setLayout(new GridLayout(1, false));
-
-		// Create Spacing between task and work product elements group.
-		Group elementSpacingGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.elementSpacingGroup_text, 2);
-
-		createLabel(elementSpacingGroup,
-				PublishingUIResources.tasksHorizonalSpacingLabel_text);
-		horizonalSpacingText = createEditableText(elementSpacingGroup, "", 25); //$NON-NLS-1$
-
-		createLabel(elementSpacingGroup,
-				PublishingUIResources.tasksVerticalSpacingLabel_text);
-		verticalSpacingText = createEditableText(elementSpacingGroup, "", 25); //$NON-NLS-1$
-
-		// Create Element text label group.
-		Group elementTextLabelGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.elementTextLabelGroup_text, 2);
-
-		createLabel(elementTextLabelGroup,
-				PublishingUIResources.maxLineOfTextLabel_text);
-		textLinesText = createEditableText(elementTextLabelGroup, "", 15); //$NON-NLS-1$
-
-		initControls();
-
-		addListeners();
-
-		return composite;
-	}
-
-	/**
-	 * Initializes the preference page controls with data.
-	 */
-	protected void initControls() {
-		horizonalSpacingText.setText(String.valueOf(LibraryPreferences
-				.getRoleDiagramHorizontalSpacing()));
-		verticalSpacingText.setText(String.valueOf(LibraryPreferences
-				.getRoleDiagramVerticalSpacing()));
-		textLinesText.setText(String.valueOf(LibraryPreferences
-				.getRoleDiagramMaximumTextLines()));
-	}
-
-	/**
-	 * Adds event listeners to the preference page controls.
-	 */
-	protected void addListeners() {
-		horizonalSpacingText.addModifyListener(this);
-		verticalSpacingText.addModifyListener(this);
-		textLinesText.addModifyListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.ModifyListener#modifyText(ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-		setErrorMessage(null);
-		setValid(true);
-
-		int value = 0;
-		if (e.widget == horizonalSpacingText) {
-			value = getHorizontalSpacing();
-			if (value < MIN_HORIZONTAL_SPACING
-					|| value > MAX_HORIZONTAL_SPACING) {
-				setErrorMessage(PublishingUIResources.bind(
-						PublishingUIResources.invalidHorizonalSpacingError_msg,
-						new Object[] { new Integer(MIN_HORIZONTAL_SPACING),
-								new Integer(MAX_HORIZONTAL_SPACING) }));
-				setValid(false);
-			}
-		} else if (e.widget == verticalSpacingText) {
-			value = getVerticalSpacing();
-			if (value < MIN_VERTICAL_SPACING || value > MAX_VERTICAL_SPACING) {
-				setErrorMessage(PublishingUIResources.bind(
-						PublishingUIResources.invalidVerticalSpacingError_msg,
-						new Object[] { new Integer(MIN_VERTICAL_SPACING),
-								new Integer(MAX_VERTICAL_SPACING) }));
-				setValid(false);
-			}
-		} else if (e.widget == textLinesText) {
-			value = getMaximumTextLines();
-			if (value < MIN_TEXT_LINES || value > MAX_TEXT_LINES) {
-				setErrorMessage(PublishingUIResources.bind(
-						PublishingUIResources.invalidTextLinesError_msg,
-						new Object[] { new Integer(MIN_TEXT_LINES),
-								new Integer(MAX_TEXT_LINES) }));
-				setValid(false);
-			}
-		}
-
-		updateApplyButton();
-	}
-
-	/**
-	 * Performs special processing when this page's Defaults button has been
-	 * pressed.
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		horizonalSpacingText.setText("" //$NON-NLS-1$
-				+ LibraryPreferences.getDefaultRoleDiagramHorizontalSpacing());
-		verticalSpacingText.setText("" //$NON-NLS-1$
-				+ LibraryPreferences.getDefaultRoleDiagramVerticalSpacing());
-		textLinesText.setText("" //$NON-NLS-1$
-				+ LibraryPreferences.getDefaultRoleDiagramMaximumTextLines());
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		LibraryPreferences
-				.setRoleDiagramHorizontalSpacing(getHorizontalSpacing());
-		LibraryPreferences.setRoleDiagramVerticalSpacing(getVerticalSpacing());
-		LibraryPreferences
-				.setRoleDiagramMaximumTextLines(getMaximumTextLines());
-		return true;
-	}
-
-	/**
-	 * Gets the user specified horizontal spacing between tasks and roles.
-	 */
-	protected int getHorizontalSpacing() {
-		return StrUtil.getIntValue(horizonalSpacingText.getText().trim(), 0);
-	}
-
-	/**
-	 * Gets the user specified vertical spacing between tasks and roles.
-	 */
-	protected int getVerticalSpacing() {
-		return StrUtil.getIntValue(verticalSpacingText.getText().trim(), 0);
-	}
-
-	/**
-	 * Gets the user specified element label text lines.
-	 */
-	protected int getMaximumTextLines() {
-		return StrUtil.getIntValue(textLinesText.getText().trim(), 0);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/package.html b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/package.html
deleted file mode 100644
index 9258c21..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the publishing UI.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/AbstractPublishWizard.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/AbstractPublishWizard.java
deleted file mode 100644
index 78f79c5..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/AbstractPublishWizard.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Abstract publishing wizard class. 
- * use the org.eclipse.epf.publishing.ui.publishers extension point to extend this class 
- * if you need to customize the publishing ui.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public abstract class AbstractPublishWizard extends Wizard implements INewWizard {
-
-	// The publishing options.
-	protected PublishOptions dataModel = null;
-
-	/**
-	 * constructor
-	 *
-	 */
-	public AbstractPublishWizard() {
-		super();
-	}
-	
-	/**
-	 * finish the wizard
-	 * 
-	 * @return boolean return true if successful
-	 */
-	public abstract boolean performFinish();
-
-	/**
-	 * initialize the wizard.
-	 * 
-	 * @param workbench IWorkbench
-	 * @param selection IStructuredSelection
-	 */
-	public abstract void init(IWorkbench workbench, IStructuredSelection selection);
-	
-	/**
-	 * get the publish options
-	 * 
-	 * @return PublishOptions
-	 */
-	public abstract PublishOptions getPublishOptions();
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishConfigWizard.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishConfigWizard.java
deleted file mode 100644
index 3b06626..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishConfigWizard.java
+++ /dev/null
@@ -1,393 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.edit.ui.UIHelper;
-import org.eclipse.epf.publishing.services.PublishHTMLOptions;
-import org.eclipse.epf.publishing.services.PublishManager;
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.publishing.ui.preferences.PublishingUIPreferences;
-import org.eclipse.epf.ui.wizards.BaseWizard;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * A wizard that guides the user to publish a method configuration to a web
- * site.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PublishConfigWizard extends BaseWizard implements INewWizard {
-
-	/**
-	 * The wizard ID.
-	 */
-	public static final String WIZARD_ID = PublishConfigWizard.class.getName();
-
-	/**
-	 * The Publish Configuration wizard extension point ID.
-	 */
-	public static final String WIZARD_EXTENSION_POINT_ID = "org.eclipse.epf.publishing.ui.publishConfigWizard"; //$NON-NLS-1$	
-
-	// The select configuration wizard page.
-	protected SelectConfigPage selectConfigPage;
-
-	// The select configuration content wizard page.
-	protected SelectContentPage selectContentPage;
-
-	// The select publishing options wizard page.
-	protected SelectPublishingOptionsPage selectPublishingOptionsPage;
-
-	// The select destination wizard page.
-	protected SelectDestinationPage selectDestinationPage;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishConfigWizard() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		super.init(workbench, selection);
-		setWindowTitle(PublishingUIResources.publishConfigWizard_title);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizard#getWizardExtenderExtensionPointId()
-	 */
-	public String getWizardExtenderExtensionPointId() {
-		return WIZARD_EXTENSION_POINT_ID;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		if (wizardExtender == null) {
-			selectConfigPage = new SelectConfigPage();
-			selectContentPage = new SelectContentPage();
-			selectPublishingOptionsPage = new SelectPublishingOptionsPage();
-			selectDestinationPage = new SelectDestinationPage();
-			super.addPage(selectConfigPage);
-			super.addPage(selectContentPage);
-			super.addPage(selectPublishingOptionsPage);
-			super.addPage(selectDestinationPage);
-		} else {
-			List<IWizardPage> wizardPages = new ArrayList<IWizardPage>();
-
-			IWizardPage page = wizardExtender
-					.getReplaceWizardPage(SelectConfigPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectConfigPage = new SelectConfigPage();
-				wizardPages.add(selectConfigPage);
-			}
-
-			page = wizardExtender
-					.getReplaceWizardPage(SelectContentPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectContentPage = new SelectContentPage();
-				wizardPages.add(selectContentPage);
-			}
-
-			page = wizardExtender
-					.getReplaceWizardPage(SelectPublishingOptionsPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectPublishingOptionsPage = new SelectPublishingOptionsPage();
-				wizardPages.add(selectPublishingOptionsPage);
-			}
-
-			page = wizardExtender
-					.getReplaceWizardPage(SelectDestinationPage.PAGE_NAME);
-			if (page != null) {
-				wizardPages.add(page);
-			} else {
-				selectDestinationPage = new SelectDestinationPage();
-				wizardPages.add(selectDestinationPage);
-			}
-
-			super.getNewWizardPages(wizardPages);
-
-			for (Iterator it = wizardPages.iterator(); it.hasNext();) {
-				IWizardPage wizardPage = (IWizardPage) it.next();
-				super.addPage(wizardPage);
-			}
-
-			wizardExtender.initWizardPages(wizardPages);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#createPageControls(Composite)
-	 */
-	public void createPageControls(Composite pageContainer) {
-		super.createPageControls(pageContainer);
-		pageContainer.getShell().setImage(
-				AuthoringUIPlugin.getDefault().getSharedImage(
-						"full/obj16/MethodConfiguration.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (wizardExtender != null) {
-			return wizardExtender.doFinish();
-		} else {
-			PublishManager publisher = new PublishManager();
-			boolean success = publishConfig(selectConfigPage.getConfigName(),
-					getPublishingOptions(), publisher);
-			if (publisher != null) {
-				publisher.dispose();
-			}
-			return success;
-		}
-	}
-
-	/**
-	 * Publishes the selected method configuration.
-	 * 
-	 * @param configName
-	 *            the method configuration name
-	 * @param options
-	 *            the publishing options
-	 */
-	public boolean publishConfig(String configName, PublishOptions options,
-			PublishManager publisher) {
-		try {
-			if (checkAndCreateDir(options)) {
-				MethodConfiguration config = LibraryServiceUtil
-						.getMethodConfiguration(LibraryService.getInstance()
-								.getCurrentMethodLibrary(), configName);
-
-				publisher.init(options.getPublishDir(), config, options);
-				PublishingOperation operation = new PublishingOperation(
-						publisher);
-
-				PublishProgressMonitorDialog dlg = new PublishProgressMonitorDialog(
-						Display.getCurrent().getActiveShell(), publisher
-								.getViewBuilder());
-
-				UIHelper.runWithProgress(operation, dlg, true,
-						PublishingUIResources.publishConfigWizard_title);
-
-				return true;
-			} else {
-				return false;
-			}
-		} catch (Exception e) {
-			PublishingUIPlugin.getDefault().getMsgDialog().displayError(
-					PublishingUIResources.publishConfigWizard_title,
-					PublishingUIResources.publishConfigError_msg,
-					PublishingUIResources.publishConfigError_reason, e);
-		} finally {
-			if (selectPublishingOptionsPage != null) {
-				selectPublishingOptionsPage.savePreferences();
-			}
-			if (selectDestinationPage != null) {
-				selectDestinationPage.savePreferences();
-			}
-			MethodConfiguration config = LibraryServiceUtil
-					.getMethodConfiguration(LibraryService.getInstance()
-							.getCurrentMethodLibrary(), configName);
-			String configId = config.getGuid();
-			PublishingUIPreferences.setConfigPrefInitialized(configId, true);
-			PublishingUIPreferences.saveAllPreferences();
-		}
-
-		return true;
-	}
-
-	/**
-	 * Gets the user specified publishing options.
-	 * 
-	 * @return the user specified publishing options.
-	 */
-	public PublishOptions getPublishingOptions() {
-		PublishOptions options;
-		
-		if (selectPublishingOptionsPage != null) {
-			options = selectPublishingOptionsPage.getPublishingOptions();
-		}
-		else {
-			options = new PublishOptions();
-		}
-
-		if (selectContentPage != null) {
-			boolean publishConfig = selectContentPage.getPublishConfigSelection();
-			options.setPublishConfiguration(publishConfig);
-			options.setPublishProcess(!publishConfig);
-			if (!publishConfig) {
-				options.setProcesses(selectContentPage.getSelectedProcesses());
-			}
-		}
-		
-		if (selectDestinationPage != null) {
-			options.setPublishDir(selectDestinationPage.getPublishDirectory());
-
-			if (!selectDestinationPage.getStaticWebSiteSelection()
-					&& options instanceof PublishHTMLOptions) {
-				PublishHTMLOptions htmlOptions = (PublishHTMLOptions) options;
-				htmlOptions.setPublishDynamicWebApp(true);
-				htmlOptions.setDynamicWebAppName(selectDestinationPage
-						.getWebAppName());
-				htmlOptions.setIncludeServletSearch(selectDestinationPage
-						.getIncludeSearchSelection());
-			}
-		}
-
-		return options;
-	}
-
-	/**
-	 * Checks and creates the destination path where the method configuration
-	 * will be published.
-	 * 
-	 * @param options
-	 *            the publishing options
-	 * @return <code>true</code> if the destination path is valid,
-	 *         <code>false</code> otherwise
-	 */
-	public boolean checkAndCreateDir(PublishOptions options) {
-		String dir = options.getPublishDir();
-		String defaultPublishPath = PublishingUIPreferences
-				.getDefaultPublishPath();
-		boolean answer = false;
-
-		IPath ecPath = Path.fromOSString(dir);
-		if (!ecPath.isAbsolute()) {
-			String path = defaultPublishPath
-					+ System.getProperty("file.separator") + dir; //$NON-NLS-1$
-			answer = PublishingUIPlugin
-					.getDefault()
-					.getMsgDialog()
-					.displayPrompt(
-							PublishingUIResources.publishConfigDialog_title,
-							PublishingUIResources
-									.bind(
-											PublishingUIResources.confirmPathDialog_text,
-											path));
-
-			if (answer) {
-				options.setPublishDir(dir);
-			} else {
-				return false;
-			}
-		}
-
-		File file = new File(dir);
-
-		if (file.exists()) {
-			File[] files = file.listFiles();
-			if (files != null && files.length > 0) {
-				answer = PublishingUIPlugin
-						.getDefault()
-						.getMsgDialog()
-						.displayConfirmation(
-								PublishingUIResources.publishConfigDialog_title,
-								PublishingUIResources
-										.bind(
-												PublishingUIResources.overwriteDialog_text,
-												dir));
-
-				if (answer == true) {
-					try {
-						answer = FileUtil
-								.deleteAllFiles(file.getAbsolutePath());
-						if (answer == false) {
-							PublishingUIPlugin
-									.getDefault()
-									.getMsgDialog()
-									.displayError(
-											PublishingUIResources.publishConfigDialog_title,
-											PublishingUIResources.cannotPublishError_msg,
-											PublishingUIResources
-													.bind(
-															PublishingUIResources.deleteFilesError_reason,
-															dir));
-							return false;
-
-						}
-					} catch (Exception e) {
-						PublishingUIPlugin
-								.getDefault()
-								.getMsgDialog()
-								.displayError(
-										PublishingUIResources.publishConfigDialog_title,
-										PublishingUIResources.cannotPublishError_msg,
-										PublishingUIResources
-												.bind(
-														PublishingUIResources.deleteFilesError_reason,
-														dir), e);
-						return false;
-					}
-				}
-			} else {
-				return true;
-			}
-		} else {
-			try {
-				answer = file.mkdirs();
-			} catch (Exception e) {
-				PublishingUIPlugin.getDefault().getMsgDialog().displayError(
-						PublishingUIResources.publishConfigDialog_title,
-						PublishingUIResources.cannotPublishError_msg,
-						PublishingUIResources.bind(
-								PublishingUIResources.createDirError_reason,
-								file.getAbsolutePath()), e);
-				return false;
-			}
-			if (!answer) {
-				PublishingUIPlugin.getDefault().getMsgDialog().displayError(
-						PublishingUIResources.publishConfigDialog_title,
-						PublishingUIResources.cannotPublishError_msg,
-						PublishingUIResources.bind(
-								PublishingUIResources.createDirError_reason,
-								file.getAbsolutePath()));
-				return false;
-			}
-		}
-
-		return answer;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishOptionContribution.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishOptionContribution.java
deleted file mode 100644
index 5f8b3b6..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishOptionContribution.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-/**
- * Models a "publishOption" configuration element in the
- * "org.eclipse.epf.publishing.ui.publishConfigurationWizard" extension point.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class PublishOptionContribution {
-
-	private String name;
-
-	private String description;
-
-	private boolean defaultSelection;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            the export option name
-	 * @param description
-	 *            the export option description
-	 * @param defaultSelection
-	 *            if <code>true</code>, this option is selected by default
-	 */
-	public PublishOptionContribution(String name, String description,
-			boolean defaultSelection) {
-		this.name = name;
-		this.description = description;
-		this.defaultSelection = defaultSelection;
-	}
-
-	/**
-	 * Returns the name of this export option.
-	 * 
-	 * @return the export option name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Returns the description of this export option.
-	 * 
-	 * @return the export option description
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * Returns the default seleciton of this export option.
-	 * 
-	 * @return <code>true</code> if this option should be selected by default
-	 */
-	public boolean getDefaultSelection() {
-		return defaultSelection;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishProgressMonitorDialog.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishProgressMonitorDialog.java
deleted file mode 100644
index 3b8e093..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishProgressMonitorDialog.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import java.io.File;
-
-import org.eclipse.epf.authoring.gef.viewer.ActivityDiagramService;
-import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
-import org.eclipse.epf.diagram.ui.service.DiagramImageService;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.publishing.services.AbstractViewBuilder;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-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.Shell;
-
-
-/**
- * The publish configuration progress dialog.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PublishProgressMonitorDialog extends ProgressMonitorDialog {
-
-	private Composite diagramViewerHolder;
-
-	private AbstractViewBuilder viewBuilder;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishProgressMonitorDialog(Shell parent,
-			AbstractViewBuilder viewBuilder) {
-		super(parent);
-		this.viewBuilder = viewBuilder;
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Control ctrl = super.createDialogArea(parent);
-
-		if (viewBuilder != null) {
-			// Create the diagram viewer holder and the diagram service.
-			diagramViewerHolder = new Composite(parent, SWT.NONE);
-			diagramViewerHolder.setLayoutData(new GridData(1, 1));
-			diagramViewerHolder.setLayout(new GridLayout());
-			diagramViewerHolder.setVisible(false);
-
-			ElementLayoutManager layoutMgr = viewBuilder.getLayoutMgr();
-			String newDiagrams = AuthoringUIPlugin.getDefault().getPreferenceStore().getString("PUBLISH_NEW_DIAGRAM"); //$NON-NLS-1$
-			Boolean newDiagram = new Boolean(true);
-			if(newDiagrams != null && newDiagrams.length() > 0){
-				newDiagram = new Boolean(newDiagrams);
-			}
-			if (newDiagram.booleanValue()) {
-				DiagramImageService diagramService = new DiagramImageService(
-						diagramViewerHolder,
-						new File(layoutMgr.getPublishDir()));
-				diagramService.setConfig(layoutMgr.getConfiguration());
-				diagramService.setPublishedUnCreatedADD(viewBuilder
-						.getOptions().isPublishUnopenADD());
-				diagramService.setPublishADForActivityExtension(viewBuilder
-						.getOptions().isPublishBaseAD());
-				layoutMgr.setActivityDiagramService(diagramService);
-			} else {
-				ActivityDiagramService diagramService = new ActivityDiagramService(
-						diagramViewerHolder,
-						new File(layoutMgr.getPublishDir()));
-				diagramService.setPublishedUnCreatedADD(viewBuilder
-						.getOptions().isPublishUnopenADD());
-				diagramService.setPublishADForActivityExtension(viewBuilder
-						.getOptions().isPublishBaseAD());
-				layoutMgr.setActivityDiagramService(diagramService);
-			}
-		}
-
-		return ctrl;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Window.
-	 */
-	public boolean close() {
-		
-		viewBuilder = null;
-		return super.close();
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishingOperation.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishingOperation.java
deleted file mode 100644
index e410946..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/PublishingOperation.java
+++ /dev/null
@@ -1,267 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.text.MessageFormat;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.common.ui.util.MsgDialog;
-import org.eclipse.epf.library.services.SafeUpdateController;
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.epf.publishing.services.AbstractPublishManager;
-import org.eclipse.epf.publishing.services.AbstractViewBuilder;
-import org.eclipse.epf.publishing.services.PublishHTMLOptions;
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.program.Program;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-
-/**
- * Performs the real work of publishing a Method Configuration.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PublishingOperation implements IRunnableWithProgress, org.eclipse.epf.library.edit.util.IRunnableWithProgress {
-
-	private static final String PUBLISH_CONFIG_ERROR_TITLE = PublishingUIResources.publishConfigDialog_title; //$NON-NLS-1$
-
-	private static final String PUBLISH_CONFIG_ERROR_MSG = PublishingUIResources.publishConfigError_msg; //$NON-NLS-1$
-
-	private static final String PUBLISH_CONFIG_ERROR_REASON = PublishingUIResources.publishConfigError_reason; //$NON-NLS-1$
-
-	private static final String PREVIEW_CONFIG_ERROR_TITLE = PublishingUIResources.previewConfigError_title; //$NON-NLS-1$
-
-	private static final String PREVIEW_CONFIG_ERROR_MSG = PublishingUIResources.previewConfigError_msg; //$NON-NLS-1$
-
-	private static final String VIEW_REPORT_ERROR_TITLE = PublishingUIResources.viewReportError_title; //$NON-NLS-1$
-
-	private static final String VIEW_REPORT_ERROR_MSG = PublishingUIResources.viewReportError_msg; //$NON-NLS-1$	
-
-	private static final String OPEN_BROWSER_ERROR_REASON = PublishingUIResources.openBrowserError_reason; //$NON-NLS-1$
-
-	private static final String PUBLISH_CONFIG_CANCEL_MSG = PublishingUIResources.cancelPublishConfig_msg; //$NON-NLS-1$
-
-	private AbstractPublishManager publishMgr;
-
-	private String published_url;
-
-	private String report_url;
-
-	private MsgDialog msgDialog;
-
-	private Exception runException;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishingOperation(AbstractPublishManager publishMgr) {
-		super();
-		this.publishMgr = publishMgr;
-		this.msgDialog = PublishingUIPlugin.getDefault().getMsgDialog();
-	}
-
-	/**
-	 * get the view builder.
-	 * 
-	 * @return AbstractViewBuilder
-	 */
-	public AbstractViewBuilder getViewBuilder() {
-		return this.publishMgr.getViewBuilder();
-	}
-
-	/**
-	 * get the url for the published site
-	 * 
-	 * @return String
-	 */
-	public String getPublishedUrl() {
-		return published_url;
-	}
-
-	/**
-	 * run the operation to perform the publishing task.
-	 * 
-	 * @param monitor
-	 *            IProgressMonitor
-	 * @throws InvocationTargetException
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException,
-			InterruptedException {
-		
-		try {
-			_runIt(monitor);
-		} finally {
-			this.publishMgr = null;
-			this.msgDialog = null;
-		}
-	}
-
-	/**
-	 * run the operation to perform the publishing task.
-	 * 
-	 * @param monitor
-	 *            IProgressMonitor
-	 * @throws InvocationTargetException
-	 */
-	private void _runIt(IProgressMonitor monitor) throws InvocationTargetException,
-			InterruptedException {
-		runException = null;
-		try {
-			monitor
-					.setTaskName(PublishingResources.publishingConfigurationTask_name); //$NON-NLS-1$			
-			publishMgr.publish(monitor);
-
-			published_url = publishMgr.getPublishedUrl();
-			report_url = publishMgr.getPublishReportUrl();
-		} catch (Exception e) {
-			runException = e;
-		}
-
-		final boolean canceled = monitor.isCanceled();
-
-		SafeUpdateController.syncExec(new Runnable() {
-			public void run() {
-				if (canceled) {
-					msgDialog.displayInfo(PUBLISH_CONFIG_ERROR_TITLE,
-							PUBLISH_CONFIG_CANCEL_MSG);
-					return;
-				}
-
-				if (report_url == null) {
-					msgDialog.displayError(PUBLISH_CONFIG_ERROR_TITLE,
-							PUBLISH_CONFIG_ERROR_MSG,
-							PUBLISH_CONFIG_ERROR_REASON, runException);
-					return;
-				}
-
-				PublishOptions options = publishMgr.getViewBuilder()
-						.getOptions();
-				boolean toOpenPublishedUri = false;
-				if (options instanceof PublishHTMLOptions) {
-					if (!((PublishHTMLOptions) options)
-							.isPublishDynamicWebApp()) {
-						toOpenPublishedUri = true;
-						if (published_url == null) {
-							msgDialog.displayError(PUBLISH_CONFIG_ERROR_TITLE,
-									PUBLISH_CONFIG_ERROR_MSG,
-									PUBLISH_CONFIG_ERROR_REASON, runException);
-							return;
-						}
-
-					}
-				}
-				
-				// removed launch of published_url
-				// because launching 2 URLS at nearly the same time 
-				// was causing problems with IE7 & Firefox
-				// instead, the report HTML file has an
-				// onload script of the body element that will
-				// load the published url
-				
-				// Launch a HTML browser to view the published site.
-				if (toOpenPublishedUri && openBrowser(published_url) == false) {
-					String reason = MessageFormat.format(
-							OPEN_BROWSER_ERROR_REASON,
-							new Object[] { published_url });
-					msgDialog.displayError(PREVIEW_CONFIG_ERROR_TITLE,
-							PREVIEW_CONFIG_ERROR_MSG, reason);
-				}
-
-
-				// Launch a HTML browser to view the report on the published
-				// site.
-				if (openSWTBrowser(report_url) == false) {
-					String reason = MessageFormat.format(
-							OPEN_BROWSER_ERROR_REASON,
-							new Object[] { report_url });
-					msgDialog.displayError(VIEW_REPORT_ERROR_TITLE,
-							VIEW_REPORT_ERROR_MSG, reason);
-				}
-			}
-		});
-		
-
-	}
-	
-	public boolean openSWTBrowser(final String urlString) {
-		boolean success = false;
-		try {
-			Shell shell = new Shell(Display.getDefault(), SWT.SHELL_TRIM);
-			shell.setText(urlString);
-			GridLayout layout = new GridLayout();
-			layout.marginHeight = 0;
-			layout.marginWidth = 0;
-			shell.setLayout(layout);
-			Browser popup_browser = new Browser(shell, SWT.NONE);
-			popup_browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-			popup_browser.setUrl(urlString);
-			shell.open();
-			success = true;
-		} catch (Exception ex) {
-			PublishingUIPlugin.getDefault().getLogger().logError(ex);
-		}
-		return success;
-	}
-
-	/**
-	 * open a browser to show the published content.
-	 * 
-	 * @param urlString
-	 *            String the site url
-	 * @return boolean true if browser opened successfully.
-	 */
-	public boolean openBrowser(final String urlString) {
-		boolean success = false;
-		try {
-			if (SWT.getPlatform().equals("win32")) { //$NON-NLS-1$
-				success = Program.launch(urlString);
-			} else {
-				success = true;
-				IWebBrowser browser = null;
-				IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
-				try {
-					browser = browserSupport.getExternalBrowser();
-					if (browser != null) {
-						URL url = new File(urlString).toURL();
-						browser.openURL(url);
-					}
-				} catch (PartInitException ex) {
-					PublishingUIPlugin.getDefault().getLogger().logError(ex);
-				} catch (MalformedURLException ex) {
-					PublishingUIPlugin.getDefault().getLogger().logError(ex);
-				}
-			}
-		} catch (Exception e) {
-			PublishingUIPlugin.getDefault().getLogger().logError(e);
-			success = false;
-		}
-
-		return success;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectConfigPage.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectConfigPage.java
deleted file mode 100644
index e8b0664..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectConfigPage.java
+++ /dev/null
@@ -1,306 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.util.Comparators;
-import org.eclipse.epf.library.ui.LibraryUIResources;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A wizard page that prompts the user to select a method configuration to
- * publish.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @author Jinhua Xi
- * @since 1.0
- */
-public class SelectConfigPage extends BaseWizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = SelectConfigPage.class.getName();
-
-	protected Table table;
-
-	protected TableViewer configViewer;
-
-	protected Text briefDescText;
-
-	protected List processViews;
-
-	protected String selectedConfigName;
-
-	/**
-	 * 
-	 * @author skannoor
-	 * @deprecated (see below AdapterFactoryLabelProvider.)
-	 */
-	protected class ConfigurationTableLabelProvider extends LabelProvider
-			implements ITableLabelProvider {
-
-		public Image getColumnImage(Object element, int index) {
-			return null;
-		}
-
-		public String getColumnText(Object element, int index) {
-			MethodConfiguration config = (MethodConfiguration) element;
-			return config.getName();
-		}
-	}
-
-	protected ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			TngAdapterFactory.INSTANCE
-					.getNavigatorView_ComposedAdapterFactory()) {
-		@Override
-		public String getColumnText(Object object, int columnIndex) {
-			return super.getColumnText(object, columnIndex);
-		}
-
-		@Override
-		public Image getColumnImage(Object object, int columnIndex) {
-			return super.getColumnImage(object, columnIndex);
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectConfigPage() {
-		super(PAGE_NAME);
-		setTitle(PublishingUIResources.selectConfigWizardPage_title);
-		setDescription(PublishingUIResources.selectConfigWizardPage_text);
-		setImageDescriptor(PublishingUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/PublishConfiguration.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = createGridLayoutComposite(parent, 1);
-
-		createLabel(composite, PublishingUIResources.configLabel_text);
-
-		table = new Table(composite, SWT.BORDER | SWT.V_SCROLL);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		gridData.heightHint = 120;
-		gridData.widthHint = 280;
-		table.setLayoutData(gridData);
-
-		configViewer = new TableViewer(table);
-
-		createLabel(composite, AuthoringUIText.DESCRIPTION_TEXT);
-
-		briefDescText = createMultiLineText(composite, "", 360, 80, 1); //$NON-NLS-1$
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						composite,
-						AuthoringUIHelpContexts.CONFIGURATION_PUBLISH_WIZARD_ALL_PAGES_CONTEXT);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		// configViewer.setLabelProvider(new ConfigurationTableLabelProvider());
-		configViewer.setLabelProvider(labelProvider);
-		configViewer.setContentProvider(new ArrayContentProvider());
-		MethodConfiguration[] configs = LibraryServiceUtil
-				.getMethodConfigurations(LibraryService.getInstance()
-						.getCurrentMethodLibrary());
-		List<Object> configsList = new ArrayList<Object>();
-		configsList.addAll(Arrays.asList(configs));
-		Collections.sort(configsList, Comparators.DEFAULT_COMPARATOR);
-		configViewer.setInput(configsList.toArray());
-		// configViewer.setInput(configs);
-
-		if (configs.length > 0) {
-			// Select the first config and display its brief description.
-			table.select(0);
-			setBriefDescription(configs[0]);
-		}
-	}
-
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {
-		configViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						StructuredSelection selection = (StructuredSelection) event
-								.getSelection();
-						if (!selection.isEmpty()) {
-							Object[] configs = selection.toArray();
-							setBriefDescription((MethodConfiguration) configs[0]);
-						}
-						setPageComplete(isPageComplete());
-						getWizard().getContainer().updateButtons();
-					}
-				});
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
-			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
-			return false;
-		}
-
-		setErrorMessage(null);
-
-		if (table.getSelectionCount() > 0) {
-			TableItem[] items = table.getSelection();
-			selectedConfigName = items[0].getText();
-			MethodConfiguration config = LibraryServiceUtil
-					.getMethodConfiguration(LibraryService.getInstance()
-							.getCurrentMethodLibrary(), selectedConfigName);
-			processViews = null;
-			if (config != null) {
-				processViews = getValidConfigViews(config);
-			}
-
-			if (processViews != null && processViews.size() > 0) {
-				return true;
-			} else {
-				setErrorMessage(PublishingUIResources.missingViewError_msg);
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#getNextPageData()
-	 */
-	public Object getNextPageData() {
-		return getConfigName();
-	}
-
-	/**
-	 * Gets a list of valid configuration views.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 * @return a list of configuration views
-	 */
-	protected List<ContentCategory> getValidConfigViews(
-			MethodConfiguration config) {
-		String msg;
-		StringBuffer message = new StringBuffer();
-		List<ContentCategory> views = new ArrayList<ContentCategory>();
-		for (Iterator<ContentCategory> it = config.getProcessViews().iterator(); it
-				.hasNext();) {
-			ContentCategory view = it.next();
-			if (ConfigurationHelper.isContributor(view)) {
-				msg = PublishingUIResources.bind(
-						PublishingUIResources.invalidViewContributorInfo_msg,
-						view.getPresentationName());
-				message.append(StrUtil.TAB).append(msg).append(
-						StrUtil.LINE_FEED);
-			} else {
-				view = (ContentCategory) ConfigurationHelper
-						.getCalculatedElement(view, config);
-				if (view != null) {
-					if (views.contains(view)) {
-						msg = PublishingUIResources
-								.bind(
-										PublishingUIResources.invalidViewSameViewInfo_msg,
-										view.getPresentationName());
-						message.append(StrUtil.TAB).append(msg).append(
-								StrUtil.LINE_FEED);
-
-					} else {
-						views.add(view);
-					}
-				}
-			}
-		}
-
-		if (message.length() > 0) {
-			msg = PublishingUIResources.bind(
-					PublishingUIResources.invalidViewsInfo_msg, config
-							.getName());
-			message.insert(0, msg + StrUtil.LINE_FEED + StrUtil.LINE_FEED);
-
-			// FIXME! Should not display warning messages in the brief
-			// description field.
-			briefDescText.setText(message.toString());
-		}
-
-		return views;
-	}
-
-	/**
-	 * Gets the user selected method configuration.
-	 * 
-	 * @return the name of the user selected configuration or <code>null</code>
-	 */
-	public String getConfigName() {
-		return selectedConfigName;
-	}
-
-	/**
-	 * Populates the Brief Description text control with the given
-	 * configuration's brief descripotion.
-	 */
-	private void setBriefDescription(MethodConfiguration config) {
-		briefDescText.setText(config.getBriefDescription());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectContentPage.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectContentPage.java
deleted file mode 100644
index b9d4a2b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectContentPage.java
+++ /dev/null
@@ -1,368 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceUtil;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.ui.views.ProcessTreeContentProvider;
-import org.eclipse.epf.library.ui.views.ProcessTreeLabelProvider;
-import org.eclipse.epf.library.ui.views.ProcessTreeUIFolder;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.publishing.ui.preferences.PublishingUIPreferences;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * A wizard page that prompts the user to publish the entire method
- * configuration or only specific processes in the configuration.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @author Jinhua Xi
- * @since 1.0
- */
-public class SelectContentPage extends BaseWizardPage implements Listener {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = SelectContentPage.class.getName();
-
-	protected Button publishConfigRadioButton;
-
-	protected Button publishProcessesRadioButton;
-
-	protected CheckboxTreeViewer processViewer;
-
-	protected Button includeBaseProcessesCheckbox;
-
-	protected MethodConfiguration config;
-
-	protected class ProcessViewerContentProvider extends
-			ProcessTreeContentProvider {
-
-		private List<MethodPackage> packages = new ArrayList<MethodPackage>();
-
-		/**
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#inputChanged(Viewer,
-		 *      Object, Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			super.inputChanged(viewer, oldInput, newInput);
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof MethodConfiguration) {
-				MethodConfiguration config = (MethodConfiguration) parentElement;
-				List<Object> children = new ArrayList<Object>();
-				packages = config.getMethodPackageSelection();
-				List<MethodPlugin> plugins = config.getMethodPluginSelection();
-				for (Iterator<MethodPlugin> it = plugins.iterator(); it
-						.hasNext();) {
-					MethodPlugin plugin = it.next();
-					List<Process> processes = TngUtil.getAllProcesses(plugin);
-					if (processes.size() > 0) {
-						children.add(plugin);
-					}
-				}
-				return children.toArray();
-			} else if (parentElement instanceof ProcessTreeUIFolder) {
-				ProcessTreeUIFolder uiFolder = (ProcessTreeUIFolder) parentElement;
-				MethodPlugin plugin = (MethodPlugin) uiFolder.getParent();
-				if (uiFolder.getName() == CAPABILITY_PATTERNS) {
-					List<CapabilityPattern> selectedCapabilityPatterns = new ArrayList<CapabilityPattern>();
-					List<CapabilityPattern> capabilityPatterns = LibraryServiceUtil
-							.getCapabilityPatterns(plugin);
-					for (Iterator<CapabilityPattern> it = capabilityPatterns
-							.iterator(); it.hasNext();) {
-						CapabilityPattern cp = it.next();
-						ProcessPackage pkg = UmaUtil.getProcessPackage(cp);
-						if (packages.contains(pkg)) {
-							selectedCapabilityPatterns.add(cp);
-						}
-					}
-					return selectedCapabilityPatterns.toArray();
-				} else {
-					List<DeliveryProcess> selectedDeliveryProcesses = new ArrayList<DeliveryProcess>();
-					List<DeliveryProcess> deliveryProcesses = LibraryServiceUtil
-							.getDeliveryProcesses(plugin);
-					for (Iterator<DeliveryProcess> it = deliveryProcesses
-							.iterator(); it.hasNext();) {
-						DeliveryProcess dp = it.next();
-						ProcessPackage pkg = UmaUtil.getProcessPackage(dp);
-						if (packages.contains(pkg)) {
-							selectedDeliveryProcesses.add(dp);
-						}
-					}
-					return selectedDeliveryProcesses.toArray();
-				}
-			} else {
-				return super.getChildren(parentElement);
-			}
-		}
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectContentPage() {
-		super(PAGE_NAME);
-		setTitle(PublishingUIResources.selectContentWizardPage_title);
-		setDescription(PublishingUIResources.selectContentWizardPage_text);
-		setImageDescriptor(PublishingUIPlugin.getDefault().getImageDescriptor(
-				"full/wizban/PublishConfiguration.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite = createGridLayoutComposite(parent, 1);
-
-		publishConfigRadioButton = createRadioButton(composite,
-				PublishingUIResources.publishConfigRadioButton_text, 1, true);
-
-		publishProcessesRadioButton = createRadioButton(composite,
-				PublishingUIResources.publishProcessesRadioButton_text, 1,
-				false);
-
-		Composite processComposite = createChildGridLayoutComposite(composite,
-				1);
-
-		processViewer = new CheckboxTreeViewer(processComposite);
-		GridData gridData = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		gridData.heightHint = 300;
-		processViewer.getTree().setLayoutData(gridData);
-
-		includeBaseProcessesCheckbox = createCheckbox(processComposite,
-				PublishingUIResources.includeBaseProcessesCheckboxLabel_text);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		processViewer.setContentProvider(new ProcessViewerContentProvider());
-		processViewer.setLabelProvider(new ProcessTreeLabelProvider());
-
-		String configId = config != null ? config.getGuid() : ""; //$NON-NLS-1$
-		boolean publishConfig = PublishingUIPreferences
-				.getPublishEntireConfig(configId);
-		publishConfigRadioButton.setSelection(publishConfig);
-		publishProcessesRadioButton.setSelection(!publishConfig);
-		processViewer.getControl().setEnabled(!publishConfig);
-	}
-
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {
-		publishConfigRadioButton.addListener(SWT.Selection, this);
-		publishProcessesRadioButton.addListener(SWT.Selection, this);
-		includeBaseProcessesCheckbox.addListener(SWT.Selection, this);
-
-		processViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				Object checkedElement = event.getElement();
-				boolean checked = event.getChecked();
-
-				processViewer.setChecked(checkedElement, checked);
-				processViewer.setSubtreeChecked(checkedElement, checked);
-				if (includeBaseProcessesCheckbox.getSelection()) {
-					selectBaseProcesses();
-				}
-				updateCheckedStates();
-
-				setPageComplete(isPageComplete());
-			}
-		});
-	}
-
-	/**
-	 * Updates the check states of process tree viewer.
-	 */
-	private void updateCheckedStates() {
-		ITreeContentProvider cp = (ITreeContentProvider) processViewer
-				.getContentProvider();
-		if (config != null) {
-			Object[] plugins = cp.getChildren(config);
-			for (int i = 0; i < plugins.length; i++) {
-				Object[] uiFolders = cp.getChildren(plugins[i]);
-				int totalUIFolders = uiFolders.length;
-				int checkedUIFolders = 0;
-				for (int j = 0; j < uiFolders.length; j++) {
-					Object[] processes = cp.getChildren(uiFolders[j]);
-					int totalProcesses = processes.length;
-					int checkedProcesses = 0;
-					for (int k = 0; k < processes.length; k++) {
-						if (processViewer.getChecked(processes[k])) {
-							checkedProcesses++;
-						}
-					}
-					if (checkedProcesses == 0) {
-						processViewer.setGrayChecked(uiFolders[j], false);
-					} else if (checkedProcesses == totalProcesses) {
-						processViewer.setGrayed(uiFolders[j], false);
-						processViewer.setChecked(uiFolders[j], true);
-					} else {
-						processViewer.setGrayChecked(uiFolders[j], true);
-					}
-					if (processViewer.getChecked(uiFolders[j])) {
-						checkedUIFolders++;
-					}
-				}
-				if (checkedUIFolders == totalUIFolders) {
-					processViewer.setGrayed(plugins[i], false);
-					processViewer.setChecked(plugins[i], true);
-				} else if (checkedUIFolders == 0) {
-					processViewer.setGrayChecked(plugins[i], false);
-				} else {
-					processViewer.setGrayChecked(plugins[i], true);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Selects the referenced base processes in the process tree viewer.
-	 */
-	private void selectBaseProcesses() {
-		// Get the referenced base processes.
-		List<Process> processes = getSelectedProcesses();
-		List<Process> baseProcesses = new ArrayList<Process>();
-		for (Iterator it = processes.iterator(); it.hasNext();) {
-			ConfigurationHelper.getBaseProcesses((Activity) it.next(), config,
-					baseProcesses);
-		}
-
-		// Update the process tree viewer.
-		for (Iterator it = baseProcesses.iterator(); it.hasNext();) {
-			Object element = it.next();
-			processViewer.setChecked(element, true);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets.Listener#handleEvent(Event)
-	 */
-	public void handleEvent(Event event) {
-		processViewer.getControl().setEnabled(
-				publishProcessesRadioButton.getSelection());
-
-		if (event.widget == includeBaseProcessesCheckbox) {
-			// If selected, select all referenced base processes.
-			selectBaseProcesses();
-			updateCheckedStates();
-		}
-
-		setPageComplete(isPageComplete());
-		getWizard().getContainer().updateButtons();
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (obj != null && obj instanceof String) {
-			String configName = (String) obj;
-			config = LibraryServiceUtil.getMethodConfiguration(LibraryService
-					.getInstance().getCurrentMethodLibrary(), configName);
-			if (config != null) {
-				processViewer.setInput(config);
-				processViewer.expandAll();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageCompleted()
-	 */
-	public boolean isPageComplete() {
-		if (getErrorMessage() != null) {
-			return false;
-		}
-		if (publishConfigRadioButton.getSelection()) {
-			return true;
-		}
-		return getSelectedProcesses().size() > 0;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#getNextPageData()
-	 */
-	public Object getNextPageData() {
-		return config;
-	}
-
-	/**
-	 * Gets the user specified selected processes to be published.
-	 * 
-	 * @return a list of <code>Process</code>
-	 */
-	public boolean getPublishConfigSelection() {
-		return publishConfigRadioButton.getSelection();
-	}
-
-	/**
-	 * Gets all the user selected processes to be published.
-	 * 
-	 * @return a list of <code>Process</code>
-	 */
-	public List<Process> getSelectedProcesses() {
-		List<Process> processes = new ArrayList<Process>();
-		Object[] selected = processViewer.getCheckedElements();
-		if (selected != null && selected.length > 0) {
-			for (int i = 0; i < selected.length; i++) {
-				if (selected[i] instanceof Process) {
-					processes.add((Process) selected[i]);
-				}
-			}
-		}
-		return processes;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectDestinationPage.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectDestinationPage.java
deleted file mode 100644
index f04db2e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectDestinationPage.java
+++ /dev/null
@@ -1,385 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.common.ui.util.CommonPreferences;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.publishing.ui.preferences.PublishingUIPreferences;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * A wizard page that prompts the user to select the destination directory and
- * format for the published web site.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class SelectDestinationPage extends BaseWizardPage {
-
-	public static final String PAGE_NAME = SelectDestinationPage.class
-			.getName();
-
-	public static final String PREFERENCE_DELIMITER = "|"; //$NON-NLS-1$
-
-	public static final String SPLIT_PREFERENCE_DELIMITER = "\\" + PREFERENCE_DELIMITER;//$NON-NLS-1$
-
-	private String defaultPath = PublishingUIPreferences
-			.getDefaultPublishPath();
-
-	protected Shell shell;
-
-	protected Combo dirCombo;
-
-	protected Button browseButton;
-
-	protected Group webAppGroup;
-
-	protected Button staticWebSiteRadioButton;
-
-	protected Composite staticWebSiteComposite;
-
-	protected Button javaWebAppRadioButton;
-
-	protected Composite javaWebAppComposite;
-
-	protected Label webAppNameLabel;
-
-	protected Combo webAppNameCombo;
-
-	protected Button includeSearchCheckbox;
-
-	protected MethodConfiguration config;
-
-	protected List<MethodConfiguration> selectedConfigs = new ArrayList<MethodConfiguration>();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectDestinationPage(String pageName) {
-		super(pageName,
-				PublishingUIResources.selectDestinationWizardPage_title,
-				PublishingUIResources.selectDestinationWizardPage_text,
-				PublishingUIPlugin.getDefault().getImageDescriptor(
-						"full/wizban/PublishConfiguration.gif")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectDestinationPage() {
-		this(PAGE_NAME);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		shell = parent.getShell();
-
-		Composite composite = createGridLayoutComposite(parent, 1);
-
-		Composite dirComposite = createGridLayoutComposite(composite, 3);
-
-		createLabel(dirComposite, PublishingUIResources.dirLabel_text);
-
-		dirCombo = createCombobox(dirComposite);
-
-		browseButton = createButton(dirComposite,
-				AuthoringUIText.BROWSE_BUTTON_TEXT);
-
-		webAppGroup = super.createGridLayoutGroup(composite,
-				PublishingUIResources.webAppGroup_text, 1);
-
-		staticWebSiteRadioButton = createRadioButton(webAppGroup,
-				PublishingUIResources.staticWebSiteRadioButton_text);
-
-		staticWebSiteComposite = createChildGridLayoutComposite(webAppGroup, 1);
-
-		javaWebAppRadioButton = createRadioButton(webAppGroup,
-				PublishingUIResources.dynamicWebAppRadioButton_text);
-
-		javaWebAppComposite = createChildGridLayoutComposite(webAppGroup, 3);
-
-		includeSearchCheckbox = createCheckbox(javaWebAppComposite,
-				PublishingUIResources.includeSearchCheckbox_text, 3);
-
-		webAppNameLabel = createLabel(javaWebAppComposite,
-				PublishingUIResources.webApplicationNameLabel_text);
-
-		webAppNameCombo = createCombobox(javaWebAppComposite, 2);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String configId = config != null ? config.getGuid() : ""; //$NON-NLS-1$
-
-		String dir = PublishingUIPreferences.getPublishPath(configId);
-		if (dir != null && dir.length() > 0) {
-			dirCombo.setItems(subArray(coverStringToArray(dir)));
-			dirCombo.select(0);
-		}
-
-		boolean publishStaticWebSite = PublishingUIPreferences
-				.getPublishStaticWebSite(configId);
-		staticWebSiteRadioButton.setSelection(publishStaticWebSite);
-		javaWebAppRadioButton.setSelection(!publishStaticWebSite);
-
-		includeSearchCheckbox.setSelection(PublishingUIPreferences
-				.getIncludeSearch(configId));
-
-		String webAppName = PublishingUIPreferences.getWebAppName(configId);
-		if (webAppName != null && webAppName.length() > 0) {
-			webAppNameCombo.setItems(new String[] { webAppName });
-			webAppNameCombo.setText(webAppName);
-		}
-
-		updateControls();
-	}
-
-	/**
-	 * Adds event handlers to the wizard page controls.
-	 */
-	protected void addListeners() {
-		dirCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-			}
-		});
-
-		browseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				try {
-					DirectoryDialog dialog = new DirectoryDialog(shell,
-							SWT.NONE);
-					String selectedDir = dialog.open();
-					if (selectedDir != null) {
-						dirCombo.setText(selectedDir);
-					}
-				} catch (Exception e) {
-					PublishingUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		});
-
-		staticWebSiteRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				updateControls();
-			}
-		});
-
-		javaWebAppRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				updateControls();
-			}
-		});
-
-		webAppNameCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-			}
-		});
-	}
-
-	protected String[] subArray(String[] arr) {
-		int ll = CommonPreferences.getPreferenceHistorySize();
-		if (ll < 1)
-			ll = CommonPreferences.getDefaultPreferenceHistorySize();
-
-		int arrLength = arr.length;
-
-		if (arrLength < ll && arr[0].equals(defaultPath))
-			return arr;
-
-		ll = arrLength >= ll ? ll : arrLength + 1;
-		String[] result = new String[ll];
-		for (int i = 0; i < ll - 1; i++) {
-			result[i] = arr[i];
-		}
-		result[ll - 1] = arr[0].equals(defaultPath) ? arr[ll] : defaultPath;
-
-		return result;
-	}
-
-	protected String[] coverStringToArray(String preferenceStr) {
-		return preferenceStr.split(SPLIT_PREFERENCE_DELIMITER);
-	}
-
-	protected String convertArrayToString(String[] arr) {
-		StringBuffer sBuffer = new StringBuffer();
-		if (arr == null || arr.length == 0)
-			return sBuffer.toString();
-		sBuffer.append(arr[0]);
-		for (int i = 1; i < arr.length; i++) {
-			sBuffer.append(PREFERENCE_DELIMITER);
-			sBuffer.append(arr[i]);
-		}
-		return sBuffer.toString();
-	}
-
-	/**
-	 * Updates the control.
-	 */
-	protected void updateControls() {
-		boolean publishStaticWebSite = getStaticWebSiteSelection();
-		webAppNameLabel.setEnabled(!publishStaticWebSite);
-		webAppNameCombo.setEnabled(!publishStaticWebSite);
-		includeSearchCheckbox.setEnabled(!publishStaticWebSite);
-		setPageComplete(isPageComplete());
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (obj != null && obj instanceof MethodConfiguration) {
-			config = (MethodConfiguration) obj;
-			if (!selectedConfigs.contains(config)) {
-				selectedConfigs.add(config);
-				initControls();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
-	 */
-	public boolean isPageComplete() {
-		String path = getPublishDirectory();
-		IPath ecPath = Path.fromOSString(path);
-		boolean isValid = ecPath.isValidPath(path);
-		if (!isValid) {
-			setErrorMessage(PublishingUIResources.invalidPathError_msg);
-			return false;
-		} else if (!StrUtil.isValidPublishPath(path)) {
-			setErrorMessage(PublishingUIResources.invalidPathCharsError_msg);
-			return false;
-		} else {
-			setErrorMessage(null);
-		}
-		if (path.length() == 0) {
-			return false;
-		}
-
-		if (!getStaticWebSiteSelection()) {
-			String webAppName = getWebAppName();
-			if (webAppName.length() == 0) {
-				setErrorMessage(PublishingUIResources.webAppNameError_msg);
-				return false;
-			} else if (!StrUtil.isValidName(webAppName)) {
-				setErrorMessage(PublishingUIResources.webAppNameCharsError_msg);
-				return false;
-			} else {
-				setErrorMessage(null);
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Gets the user specified publish directory.
-	 */
-	public String getPublishDirectory() {
-		String dirText = dirCombo.getText().trim();
-		if (dirText.length() > 0) {
-			File dir = new File(dirCombo.getText().trim());
-			return dir.getAbsolutePath();
-		}
-		return dirText;
-	}
-
-	protected String[] getPublishDirectoryArray() {
-		String selectedtext = dirCombo.getText();
-
-		if (dirCombo.indexOf(selectedtext) > 0) {
-			dirCombo.remove(selectedtext);
-		}
-
-		if (dirCombo.indexOf(selectedtext) < 0) {
-			dirCombo.add(selectedtext, 0);
-		}
-
-		if (dirCombo.indexOf(defaultPath) > 0) {
-			dirCombo.remove(defaultPath);
-		}
-
-		return dirCombo.getItems();
-	}
-
-	/**
-	 * Gets the user specified static web site selection.
-	 */
-	public boolean getStaticWebSiteSelection() {
-		return staticWebSiteRadioButton.getSelection();
-	}
-
-	/**
-	 * Gets the user specified include search selection.
-	 */
-	public boolean getIncludeSearchSelection() {
-		return includeSearchCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the web aplication name.
-	 */
-	public String getWebAppName() {
-		return webAppNameCombo.getText().trim();
-	}
-
-	/**
-	 * Saves the user selections in this wizard page to preference store.
-	 */
-	public void savePreferences() {
-		if (config != null) {
-			String configId = config.getGuid();
-			PublishingUIPreferences.setPublishPath(configId,
-					convertArrayToString(getPublishDirectoryArray()));
-			PublishingUIPreferences.setPublishStaticWebSite(configId,
-					getStaticWebSiteSelection());
-			PublishingUIPreferences.setIncludeSearch(configId,
-					getIncludeSearchSelection());
-			PublishingUIPreferences.setWebAppName(configId, getWebAppName());
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectPublishingOptionsPage.java b/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectPublishingOptionsPage.java
deleted file mode 100644
index d7cf022..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/ui/wizards/SelectPublishingOptionsPage.java
+++ /dev/null
@@ -1,695 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.AuthoringUIResources;
-import org.eclipse.epf.authoring.ui.AuthoringUIText;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.layout.elements.ActivityLayout;
-import org.eclipse.epf.publishing.services.PublishHTMLOptions;
-import org.eclipse.epf.publishing.services.PublishOptions;
-import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
-import org.eclipse.epf.publishing.ui.PublishingUIResources;
-import org.eclipse.epf.publishing.ui.preferences.PublishingUIPreferences;
-import org.eclipse.epf.ui.wizards.BaseWizardPage;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A wizard page that prompts the user to select the publishing options for the
- * generated web site.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @author Jinhua Xi
- * @since 1.0
- * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=206567
- */
-public class SelectPublishingOptionsPage extends BaseWizardPage {
-
-	/**
-	 * The wizard page name.
-	 */
-	public static final String PAGE_NAME = SelectPublishingOptionsPage.class
-			.getName();
-
-	protected Shell shell;
-
-	protected Text titleText;
-
-	protected Text aboutHTMLText;
-
-	protected Text feedbackURLText;
-
-	protected Button selectHTMLButton;
-
-	protected Button publishGlossaryCheckbox;
-
-	protected Button publishIndexCheckbox;
-
-	protected Text bannerImageText;
-
-	protected Button selectImageButton;
-
-	protected Button checkExternalLinksCheckbox;
-
-	protected Button convertBrokenLinksCheckbox;
-
-	protected Button publishUnopenADDCheckbox;
-
-	protected Button publishBaseADCheckbox;
-
-	protected Button publishLightWeightTreeCheckbox;
-
-	protected Button extraDescriptorInfoCtr;
-
-	protected Button showRelatedDescriptors;
-
-	protected Button showDescriptorsInNavigationTree;
-
-	protected ComboViewer activityTabViewer;
-
-	protected MethodConfiguration config;
-
-	protected List<MethodConfiguration> selectedConfigs = new ArrayList<MethodConfiguration>();
-
-	protected static Map<String, String> activityTabMap = new TreeMap<String, String>();
-
-	static {
-		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_DESC,
-				AuthoringUIResources.descriptionPage_title);
-		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_WBS,
-				AuthoringUIResources.ProcessEditor_WorkBreakdownStructure);
-		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_TBS,
-				AuthoringUIResources.ProcessEditor_TeamAllocation);
-		activityTabMap.put(ActivityLayout.TAB_NAME_ACTIVITY_WPBS,
-				AuthoringUIResources.ProcessEditor_WorkProductUsage);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectPublishingOptionsPage(String pageName) {
-		super(pageName,
-				PublishingUIResources.selectPublishingOptionsWizardPage_title,
-				PublishingUIResources.selectPublishingOptionsWizardPage_text,
-				PublishingUIPlugin.getDefault().getImageDescriptor(
-						"full/wizban/PublishConfiguration.gif")); //$NON-NLS-1$			
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SelectPublishingOptionsPage() {
-		this(PAGE_NAME);
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		shell = parent.getShell();
-
-		Composite composite = createGridLayoutComposite(parent, 1);
-
-		createTitleAndLinksGroup(composite);
-		createGlossaryAndIndexGroup(composite);
-		createLookAndFeelGroup(composite);
-		createValidation(composite);
-		createDiagramGenerationGroup(composite);
-		createLayoutGroup(composite);
-
-		initControls();
-
-		addListeners();
-
-		setControl(composite);
-
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						composite,
-						AuthoringUIHelpContexts.CONFIGURATION_PUBLISH_WIZARD_ALL_PAGES_CONTEXT);
-	}
-
-	/**
-	 * Creates the Title and links group.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @return the group composite
-	 */
-	protected Group createTitleAndLinksGroup(Composite composite) {
-		Group titleAndLinksGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.titleAndLinksGroup_text, 3);
-
-		createLabel(titleAndLinksGroup, PublishingUIResources.titleLabel_text);
-		titleText = createEditableText(titleAndLinksGroup, "", 360, 1); //$NON-NLS-1$
-		createLabel(titleAndLinksGroup, ""); //$NON-NLS-1$
-
-		createLabel(titleAndLinksGroup,
-				PublishingUIResources.aboutHTMLLabel_text);
-		aboutHTMLText = createEditableText(titleAndLinksGroup, "", 360, 1); //$NON-NLS-1$
-		selectHTMLButton = new Button(titleAndLinksGroup, SWT.NONE);
-		selectHTMLButton.setText(AuthoringUIText.SELECT_BUTTON_TEXT);
-
-		createLabel(titleAndLinksGroup,
-				PublishingUIResources.feedbackURLLabel_text);
-		feedbackURLText = createEditableText(titleAndLinksGroup, "", 360, 1); //$NON-NLS-1$
-		createLabel(titleAndLinksGroup, ""); //$NON-NLS-1$
-
-		return titleAndLinksGroup;
-	}
-
-	/**
-	 * Creates the Look and feel group.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @return the group composite
-	 */
-	protected Group createLookAndFeelGroup(Composite composite) {
-		Group lookAndFeelGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.lookAndFeelGroup_text, 3);
-
-		createLabel(lookAndFeelGroup,
-				PublishingUIResources.bannerImageLabel_text);
-		bannerImageText = createEditableText(lookAndFeelGroup, "", 360, 1); //$NON-NLS-1$
-		selectImageButton = new Button(lookAndFeelGroup, SWT.NONE);
-		selectImageButton.setText(AuthoringUIText.SELECT_BUTTON_TEXT);
-
-		return lookAndFeelGroup;
-	}
-
-	/**
-	 * Creates the Glosary and index group.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @return the group composite
-	 */
-	protected Group createGlossaryAndIndexGroup(Composite composite) {
-		Group glossaryAndIndexGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.glossaryAndIndexGroup_text, 2);
-
-		publishGlossaryCheckbox = createCheckbox(glossaryAndIndexGroup,
-				PublishingUIResources.publishGlossaryLabel_text);
-		publishIndexCheckbox = createCheckbox(glossaryAndIndexGroup,
-				PublishingUIResources.publishIndexLabel_text);
-
-		return glossaryAndIndexGroup;
-	}
-
-	/**
-	 * Creates the Validation group.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @return the group composite
-	 */
-	protected Group createValidation(Composite composite) {
-		Group validationGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.validationGroup_text, 2);
-
-		checkExternalLinksCheckbox = createCheckbox(validationGroup,
-				PublishingUIResources.checkExternalLinksLabel_text);
-
-		convertBrokenLinksCheckbox = createCheckbox(validationGroup,
-				PublishingUIResources.convertBrokenLinksLabel_text);
-
-		return validationGroup;
-	}
-
-	/**
-	 * Creates the Diagram Generation group.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @return the group composite
-	 */
-	protected Group createDiagramGenerationGroup(Composite composite) {
-		Group diagramGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.diagramGroup_text, 1);
-
-		publishUnopenADDCheckbox = createCheckbox(diagramGroup,
-				PublishingUIResources.publishActivityDetailDiagramsLabel_text);
-
-		publishBaseADCheckbox = createCheckbox(diagramGroup,
-				PublishingUIResources.publishExtendedActivityDiagramsLabel_text);
-
-		return diagramGroup;
-	}
-
-	/**
-	 * Creates the Layout group.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @return the group composite
-	 */
-	protected Group createLayoutGroup(Composite composite) {
-		Group layoutGroup = createGridLayoutGroup(composite,
-				PublishingUIResources.layoutGroup_text, 1);
-
-		publishLightWeightTreeCheckbox = createCheckbox(layoutGroup,
-				PublishingUIResources.publishLightWeightTreeLabel_text);
-
-		showDescriptorsInNavigationTree = createCheckbox(layoutGroup,
-				PublishingUIResources.showDescriptorsInNavigationTree_text);
-
-		extraDescriptorInfoCtr = createCheckbox(layoutGroup,
-				PublishingUIResources.publishExtraDescriptorInfoLabel_text);
-
-		showRelatedDescriptors = createCheckbox(layoutGroup,
-				PublishingUIResources.showRelatedDescriptors_text);
-
-		Composite activityTabComposite = createGridLayoutComposite(layoutGroup,
-				2);
-		((GridLayout) activityTabComposite.getLayout()).marginTop = -5;
-		((GridLayout) activityTabComposite.getLayout()).marginLeft = -5;
-
-		createLabel(activityTabComposite,
-				PublishingUIResources.selectDefaultActivityTab_text);
-
-		activityTabViewer = new ComboViewer(activityTabComposite, SWT.BORDER
-				| SWT.READ_ONLY);
-		GridData gd = new GridData(GridData.BEGINNING
-				| GridData.FILL_HORIZONTAL);
-		activityTabViewer.getCombo().setLayoutData(gd);
-
-		ILabelProvider labelProvider = new LabelProvider() {
-			public String getText(Object param) {
-				if (param instanceof Map.Entry) {
-					return (String) ((Map.Entry) param).getValue();
-				} else {
-					return param.toString();
-				}
-			}
-		};
-		activityTabViewer.setLabelProvider(labelProvider);
-
-		return layoutGroup;
-	}
-
-	/**
-	 * Provide a means to add additional options to the published web site
-	 * group.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 */
-	protected void includeAdditionalPublishingOptions(Composite composite) {
-	}
-
-	/**
-	 * Creates the publishing options groups to this wizard page.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 */
-	protected void createPublishingOptionsGroups(Composite composite) {
-	}
-
-	/**
-	 * Initializes the wizard page controls with data.
-	 */
-	protected void initControls() {
-		String configId = config != null ? config.getGuid() : ""; //$NON-NLS-1$
-
-		titleText.setText(PublishingUIPreferences.getTitle(configId));
-		bannerImageText.setText(PublishingUIPreferences
-				.getBannerImage(configId));
-		aboutHTMLText.setText(PublishingUIPreferences.getAboutHTML(configId));
-		feedbackURLText.setText(PublishingUIPreferences
-				.getFeedbackURL(configId));
-		publishGlossaryCheckbox.setSelection(PublishingUIPreferences
-				.getIncludeGlossary(configId));
-		publishIndexCheckbox.setSelection(PublishingUIPreferences
-				.getIncludeIndex(configId));
-		checkExternalLinksCheckbox.setSelection(PublishingUIPreferences
-				.getCheckExternalLinks(configId));
-		convertBrokenLinksCheckbox.setSelection(PublishingUIPreferences
-				.getConvertBrokenLinks(configId));
-		publishUnopenADDCheckbox.setSelection(PublishingUIPreferences
-				.getPublishUnopenActivityDD(configId));
-		publishBaseADCheckbox.setSelection(PublishingUIPreferences
-				.getPublishADForActivityExtension(configId));
-		publishLightWeightTreeCheckbox.setSelection(!PublishingUIPreferences
-				.getLightWeightTree(configId));
-		extraDescriptorInfoCtr.setSelection(PublishingUIPreferences
-				.getExtraDescriptorInfo(configId));
-		showRelatedDescriptors.setSelection(PublishingUIPreferences
-				.getShowRelatedDescriptors(configId));
-		showDescriptorsInNavigationTree.setSelection(PublishingUIPreferences
-				.getShowDescriptorsInNavigationTree(configId));
-
-		if (activityTabViewer.getCombo().getItemCount() == 0) {
-			activityTabViewer.add(activityTabMap.entrySet().toArray());
-		}
-		activityTabViewer.getCombo().setText(
-				activityTabMap.get(PublishingUIPreferences
-						.getDefaultActivityTab(configId)));
-
-	}
-
-	/**
-	 * Adds the listeners for the controls on this page.
-	 */
-	protected void addListeners() {
-		selectImageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				try {
-					FileDialog dialog = new FileDialog(shell, SWT.OPEN);
-					dialog.setFilterExtensions(new String[] {
-							"*.gif", "*.jpg", "*.bmp" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					String imageFile = dialog.open();
-					if (imageFile != null) {
-						bannerImageText.setText(imageFile);
-					}
-				} catch (Exception e) {
-					PublishingUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		});
-
-		selectHTMLButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				try {
-					FileDialog dialog = new FileDialog(shell, SWT.OPEN);
-					dialog
-							.setFilterExtensions(new String[] {
-									"*.htm", "*.html" }); //$NON-NLS-1$ //$NON-NLS-2$
-					String htmlFile = dialog.open();
-					if (htmlFile != null) {
-						aboutHTMLText.setText(htmlFile);
-					}
-				} catch (Exception e) {
-					PublishingUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		});
-
-		aboutHTMLText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-			}
-		});
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#onEnterPage(Object)
-	 */
-	public void onEnterPage(Object obj) {
-		if (obj != null && obj instanceof MethodConfiguration) {
-			MethodConfiguration selectedConfig = (MethodConfiguration) obj;
-			if (!selectedConfigs.contains(selectedConfig)) {
-				selectedConfigs.add(selectedConfig);
-			}
-			if (selectedConfig != config) {
-				config = selectedConfig;
-				initControls();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		String path = aboutHTMLText.getText();
-		IPath ecPath = Path.fromOSString(path);
-		boolean isValid = ecPath.isValidPath(path);
-		if (!isValid) {
-			setErrorMessage(PublishingUIResources.invalidAboutPathError_msg);
-			return false;
-		} else if (!StrUtil.isValidPublishPath(path)) {
-			setErrorMessage(PublishingUIResources.invalidAboutPathCharsError_msg);
-			return false;
-		} else {
-			setErrorMessage(null);
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.BaseWizardPage#getNextPageData()
-	 */
-	public Object getNextPageData() {
-		return config;
-	}
-
-	/**
-	 * Gets the user selected publishing options.
-	 * 
-	 * @return a <code>PublishOptions</code> object
-	 */
-	public PublishOptions getPublishingOptions() {
-		PublishHTMLOptions options = new PublishHTMLOptions();
-
-		options.setTitle(getWebSiteTitle());
-		options.setBannerImage(getBannerImagePath());
-		options.setAboutHTML(getAboutHTMLPath());
-		options.setFeedbackURL(getFeedbackURL());
-		options.setPublishGlossary(getPublishGlossarySelection());
-		options.setPublishIndex(getPublishIndexSelection());
-		options.setCheckExternalLinks(getCheckExternalLinksSelection());
-		options.setPublishUnopenADD(getPublishUnopenADDSelection());
-		options.setPublishBaseAD(getPublishBaseADSelection());
-		options.setConvertBrokenLinks(getConvertBrokenLinksSelection());
-		options.setPublishLightWeightTree(getPublishLightWeightTreeSelection());
-		options
-				.setShowMethodContentInDescriptors(getShowExtraDescriptorInfoSelection());
-		options
-				.setShowRelatedDescriptors(showRelatedDescriptors
-						.getSelection());
-		options
-				.setShowDescriptorsInNavigationTree(showDescriptorsInNavigationTree
-						.getSelection());
-
-		String defaultActivityTab = getDefaultActivityTabSelection();
-		if (defaultActivityTab != null) {
-			options.setDefaultActivityTab(defaultActivityTab);
-		}
-
-		return options;
-	}
-
-	/**
-	 * Gets the user specified web site title.
-	 */
-	protected String getWebSiteTitle() {
-		return titleText.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified banner image path.
-	 */
-	protected String getBannerImagePath() {
-		return bannerImageText.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified about HTML path.
-	 */
-	protected String getAboutHTMLPath() {
-		return aboutHTMLText.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified feedback URL.
-	 */
-	protected String getFeedbackURL() {
-		return feedbackURLText.getText().trim();
-	}
-
-	/**
-	 * Gets the user specified publish glossary selection.
-	 */
-	protected boolean getPublishGlossarySelection() {
-		return publishGlossaryCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified publish index selection.
-	 */
-	protected boolean getPublishIndexSelection() {
-		return publishIndexCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified check external links selection.
-	 */
-	protected boolean getCheckExternalLinksSelection() {
-		return checkExternalLinksCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified convert broken links selection.
-	 */
-	protected boolean getConvertBrokenLinksSelection() {
-		return convertBrokenLinksCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified auto generate activity detail diagrams selection.
-	 */
-	protected boolean getPublishUnopenADDSelection() {
-		return publishUnopenADDCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified publish activity diagram for base activties with
-	 * unmodified extensions.
-	 */
-	protected boolean getPublishBaseADSelection() {
-		return publishBaseADCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified generate light weight tree selection.
-	 */
-	protected boolean getPublishLightWeightTreeSelection() {
-		return !publishLightWeightTreeCheckbox.getSelection();
-	}
-
-	/**
-	 * Gets the user specified show extra descriptor info selection.
-	 */
-	protected boolean getShowExtraDescriptorInfoSelection() {
-		return extraDescriptorInfoCtr.getSelection();
-	}
-
-	/**
-	 * Gets the user specified show related descriptor in content page
-	 * selection.
-	 */
-	protected boolean getShowRelatedDescriptorsSelection() {
-		return showRelatedDescriptors.getSelection();
-	}
-
-	/**
-	 * Gets the user specified show descriptors in navigation tree selection.
-	 */
-	protected boolean getShowDescriptorsInNavigationTreeSelection() {
-		return showDescriptorsInNavigationTree.getSelection();
-	}
-
-	/**
-	 * Gets the user specified default activity tab selection.
-	 */
-	protected String getDefaultActivityTabSelection() {
-		IStructuredSelection sel = (IStructuredSelection) activityTabViewer
-				.getSelection();
-		Map.Entry item = (Map.Entry) sel.getFirstElement();
-		if (item == null) {
-			return null;
-		} else {
-			return (String) item.getKey();
-		}
-	}
-
-	/**
-	 * Saves the user selections in this wizard page to preference store.
-	 */
-	public void savePreferences() {
-		if (config != null) {
-			String configId = config.getGuid();
-			saveTitleAndLinksPreferences(configId);
-			saveGlossaryAndIndexPreferences(configId);
-			saveValidationPreferences(configId);
-			saveDiagramGenerationPreferences(configId);
-			saveLayoutPreferences(configId);
-		}
-	}
-
-	/**
-	 * Saves the title and links preferences.
-	 */
-	protected void saveTitleAndLinksPreferences(String configId) {
-		PublishingUIPreferences.setTitle(configId, getWebSiteTitle());
-		PublishingUIPreferences.setBannerImage(configId, getBannerImagePath());
-		PublishingUIPreferences.setAboutHTML(configId, getAboutHTMLPath());
-		PublishingUIPreferences.setFeedbackURL(configId, getFeedbackURL());
-	}
-
-	/**
-	 * Saves the glosaary and index preferences.
-	 */
-	protected void saveGlossaryAndIndexPreferences(String configId) {
-		PublishingUIPreferences.setIncludeGlossary(configId,
-				getPublishGlossarySelection());
-		PublishingUIPreferences.setIncludeIndex(configId,
-				getPublishIndexSelection());
-	}
-
-	/**
-	 * Saves the validation preferences.
-	 */
-	protected void saveValidationPreferences(String configId) {
-		PublishingUIPreferences.setCheckExternalLinks(configId,
-				getCheckExternalLinksSelection());
-		PublishingUIPreferences.setConvertBrokenLinks(configId,
-				getConvertBrokenLinksSelection());
-	}
-
-	/**
-	 * Saves the diagram generation preferences.
-	 */
-	protected void saveDiagramGenerationPreferences(String configId) {
-		PublishingUIPreferences.setPublishUnopenActivityDD(configId,
-				getPublishUnopenADDSelection());
-		PublishingUIPreferences.setPublishADForActivityExtension(configId,
-				getPublishBaseADSelection());
-	}
-
-	/**
-	 * Saves the layout preferences.
-	 */
-	protected void saveLayoutPreferences(String configId) {
-		PublishingUIPreferences.setLightWeightTree(configId,
-				getPublishLightWeightTreeSelection());
-		PublishingUIPreferences.setExtraDescriptorInfo(configId,
-				getShowExtraDescriptorInfoSelection());
-		PublishingUIPreferences.setShowRelatedDescriptors(configId,
-				getShowRelatedDescriptorsSelection());
-		PublishingUIPreferences.setShowDescriptorsInNavigationTree(configId,
-				getShowDescriptorsInNavigationTreeSelection());
-		PublishingUIPreferences.setDefaultActivityTab(configId,
-				getDefaultActivityTabSelection());
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/.classpath b/1.5/plugins/org.eclipse.epf.publishing/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/.options b/1.5/plugins/org.eclipse.epf.publishing/.options
deleted file mode 100644
index 4aa974d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/.options
+++ /dev/null
@@ -1,3 +0,0 @@
-# Turn on debug trace for the Publishing plug-in
-org.eclipse.epf.publishing/debug=true
-org.eclipse.epf.publishing/profiling=true
diff --git a/1.5/plugins/org.eclipse.epf.publishing/.project b/1.5/plugins/org.eclipse.epf.publishing/.project
deleted file mode 100644
index 99ed557..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.publishing</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.publishing/META-INF/MANIFEST.MF
deleted file mode 100644
index ae0016d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.publishing
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: publishing.jar, lib/rpwcore.jar
-Bundle-Activator: org.eclipse.epf.publishing.PublishingPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.search;visibility:=reexport,
- org.eclipse.core.runtime,
- org.eclipse.epf.diagram.core
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.publishing,
- org.eclipse.epf.publishing.services,
- org.eclipse.epf.publishing.services.index,
- org.eclipse.epf.publishing.services.search,
- org.eclipse.epf.publishing.util,
- org.eclipse.epf.publishing.util.http
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.publishing/build.properties b/1.5/plugins/org.eclipse.epf.publishing/build.properties
deleted file mode 100644
index dd82fc1..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-source.publishing.jar = src/
-output.publishing.jar = bin/
-bin.includes = publishing.jar,\
-               .options,\
-               META-INF/,\
-               plugin.properties,\
-               docroot/,\
-               icons/,\
-               images/,\
-               keywordindexdef.txt,\
-               keywordpostamble.txt,\
-               keywordpreamble.txt,\
-               keywords.txt,\
-               xsl/
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/epf-web-search.jar b/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/epf-web-search.jar
deleted file mode 100644
index d0ed319..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/epf-web-search.jar
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/epf-web.jar b/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/epf-web.jar
deleted file mode 100644
index 52aa05d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/epf-web.jar
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/icu4j_3_4.jar b/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/icu4j_3_4.jar
deleted file mode 100644
index d35e3c3..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/icu4j_3_4.jar
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/lucene-core-1.9.1.jar b/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/lucene-core-1.9.1.jar
deleted file mode 100644
index f143e9d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/lib/lucene-core-1.9.1.jar
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/web.xml b/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/web.xml
deleted file mode 100644
index cf4a2e7..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/WEB-INF/web.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!DOCTYPE web-app
-    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-    "http://java.sun.com/dtd/web-app_2_3.dtd">
-
-<web-app>
-  <servlet>
-  	<servlet-name>SearchServlet</servlet-name>
-  	<servlet-class>org.eclipse.epf.web.servlet.SearchServlet</servlet-class>
-  	<init-param>
-  		<param-name>searchIndex</param-name>
-  		<param-value>search/index</param-value>
-  	</init-param>
-  	<init-param>
-  		<param-name>xslFile</param-name>
-  		<param-value>/search/search_result.xsl</param-value>
-  	</init-param>
-  </servlet>
-  <servlet-mapping>
-  <!-- note: don't change the servlet mapping here since the string is used in other files as well -->
-  	<servlet-name>SearchServlet</servlet-name>
-  	<url-pattern>/SearchServlet</url-pattern>
-  </servlet-mapping>
-</web-app>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/about.htm b/1.5/plugins/org.eclipse.epf.publishing/docroot/about.htm
deleted file mode 100644
index 1da570e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/about.htm
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html lang="en" xml:lang="en">
-<!--
-    Copyright (c) 2004, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
-	<title>About</title>
-<script src="scripts/common.js" type="text/javascript" language="JavaScript"></script>
-	<style type="text/css">
-		body {
-			margin: 8px;
-		}
-	</style>
-</head>
-
-<body>
-
-	<img src="./images/icon_about.gif" width="32" height="32" alt="about icon" border="0"/><br /><br />
-<span class="pop">Eclipse Process Framework<br />
-Version 1.2<br />
-<br />
-(c) Copyright Eclipse contributors and others 2004, 2007.<br />
-All Rights Reserved.</span><br /><br />
-	<table summary="" border="0" cellspacing="0" cellpadding="0">
-	  <tr>
-	    <td><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td class="buttonbody" colspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td colspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	  </tr>
-	  <tr>
-	    <td class="buttonbody" colspan="4" rowspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	  </tr>
-	  <tr>
-	    <td class="buttonshadow"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	  </tr>
-	  <tr>
-	    <td class="buttonbody" colspan="2" rowspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td class="buttonbody"><a class="button" href="javascript:self.close();"><span class="buttontxt">&nbsp;Close&nbsp;</span></a></td>
-	    <td class="buttonbody" rowspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td class="buttonshadow"  rowspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	  </tr>
-	  <tr>
-	    <td class="buttonbody"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	  </tr>
-	  <tr>
-	    <td><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td class="buttonbody"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td class="buttonbody"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td class="buttonshadow"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	  </tr>
-	  <tr>
-	    <td colspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td class="buttonshadow"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	    <td colspan="2"><img src="./images/shim.gif" alt="" width="1" height="1" /></td>
-	  </tr>
-	</table>
-
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/epf.ico b/1.5/plugins/org.eclipse.epf.publishing/docroot/epf.ico
deleted file mode 100644
index 43c8bb9..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/epf.ico
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/EPFC_banner.jpg b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/EPFC_banner.jpg
deleted file mode 100644
index d2e3ddb..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/EPFC_banner.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/banner.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/banner.gif
deleted file mode 100644
index 83300e8..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/banner.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/collapse_all.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/collapse_all.gif
deleted file mode 100644
index 38f7019..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/collapse_all.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close.jpg b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close.jpg
deleted file mode 100644
index 66d2024..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close_small.jpg b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close_small.jpg
deleted file mode 100644
index 266b814..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close_small.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close_small_right.jpg b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close_small_right.jpg
deleted file mode 100644
index a706c91..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_close_small_right.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open.jpg b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open.jpg
deleted file mode 100644
index 96904ee..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open_small.jpg b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open_small.jpg
deleted file mode 100644
index 3a635b1..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open_small.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open_small_right.jpg b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open_small_right.jpg
deleted file mode 100644
index 55b7d4d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/doc_elem_open_small_right.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/down_arrow.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/down_arrow.gif
deleted file mode 100644
index d68c42e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/down_arrow.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/expand_all.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/expand_all.gif
deleted file mode 100644
index 8a18a39..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/expand_all.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/icon_about.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/icon_about.gif
deleted file mode 100644
index e113e5f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/icon_about.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_about.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_about.gif
deleted file mode 100644
index 78aa14c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_about.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_displayTree.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_displayTree.gif
deleted file mode 100644
index 18bcbab..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_displayTree.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_feedback.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_feedback.gif
deleted file mode 100644
index c5d52f4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_feedback.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_getStarted.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_getStarted.gif
deleted file mode 100644
index a7d8ca0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_getStarted.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_glossary.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_glossary.gif
deleted file mode 100644
index 032a23f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_glossary.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_handle.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_handle.gif
deleted file mode 100644
index f08d09c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_handle.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_index.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_index.gif
deleted file mode 100644
index 6d6d31f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_index.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_print.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_print.gif
deleted file mode 100644
index 34aa1d7..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_print.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_search.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_search.gif
deleted file mode 100644
index 16770f2..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_search.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_siteMap.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_siteMap.gif
deleted file mode 100644
index 2f212b5..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/ni_siteMap.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/shim.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/shim.gif
deleted file mode 100644
index 0aba790..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/shim.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/splash.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/splash.gif
deleted file mode 100644
index 923956e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/splash.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/titleback_left.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/titleback_left.gif
deleted file mode 100644
index c0eca0b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/titleback_left.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/titleback_right.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/titleback_right.gif
deleted file mode 100644
index 98b89c2..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/titleback_right.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/top.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/top.gif
deleted file mode 100644
index 615acf4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/top.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/top_sm.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/top_sm.gif
deleted file mode 100644
index 4e7fba2..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/top_sm.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/up_arrow.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/images/up_arrow.gif
deleted file mode 100644
index 51e5ccc..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/images/up_arrow.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/index/index.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/index/index.css
deleted file mode 100644
index 63b8e5e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/index/index.css
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-p.indexheading
-{
-font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
-margin-top: +2px; 
-margin-bottom: -2px;
-}
-
-p.indexlevel1
-{
-font-family: Arial, Helvetica, sans-serif;
- font-size: smaller;
- margin-top: -0px; 
-margin-bottom: -2px;
-}
-
-p.indexlevel2
-{
-font-family: Arial, Helvetica, sans-serif;
- font-size: smaller;
- margin-left: +16px;
- margin-top: -1px; 
-margin-bottom: -2px;
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/index/index.htm b/1.5/plugins/org.eclipse.epf.publishing/docroot/index/index.htm
deleted file mode 100644
index 86a2a91..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/index/index.htm
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-	
-<html lang="en" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<title>Index - Eclipse Process Framework</title>
-</head>
-<frameset rows="25,*">
-<frame name="index_t" title="Navigation bar" src="navig.htm" scrolling="no" marginheight="2" marginwidth="2"/>
-<frame name="keyword_t" title="Contents" src="contents.htm" marginheight="0" marginwidth="2" scrolling="auto"/>
-</frameset>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/index/loading.htm b/1.5/plugins/org.eclipse.epf.publishing/docroot/index/loading.htm
deleted file mode 100644
index 1d0e27f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/index/loading.htm
+++ /dev/null
@@ -1,136 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN"
-  "http://www.w3.org/TR/html4/loose.dtd">
-<html lang="en" xml:lang="en">
-
-<head>
-<meta HTTP-EQUIV="refresh" CONTENT="1; url=contents.htm">
-<title></title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000" link="#004080" vlink="#666666" alink="#0000FF">
-
-
-<table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td valign="top">
-
-
-
-
-
-
-<h3 align="center">Index</h3>
-
-<p><br>
-</p>
-
-<h4 align="center">Please wait while index page is loading...</h4>
-<pre msnavigation> </pre></td><td valign="top" width="24">
-
-
-      <p> <small><small>Copyright&nbsp;
-        &copy; 2005, 2006 IBM Corporation and others</small></small></p>
-
-</td><td valign="top" width="24"></td><td valign="top" width="1%">
-<p>
-<a href="../index.htm"></a>
-</p>
-
-<script language="JavaScript">
-<!--
-function loadTop()
-{
-  if(parent.frames.length!=0 && parent.frames[1].name=="ory_toc")
-  {
-     alert("The Eclipse Process Framework is already displayed using frames");
-  }
-  else
-  {
-    var expires = new Date();
-    expires.setTime (expires.getTime() + (1000 * 20));
-    document.cookie = "rup_ory_doc=" + escape (document.URL) +
-    "; expires=" + expires.toUTCString() +  "; path=/";
-
-    var new_ory_doc_loc = null;
-
-    for(i=document.links.length-1;i>=0;i--)
-    {
-       if(document.links[i].href.indexOf("index.htm")!=-1)
-       {
-         new_ory_doc_loc = document.links[i].href;
-         break;
-       }
-    }
-
-    if(new_ory_doc_loc!=null)
-    {
-	if( self.name == "ory_doc" )
-	{
-		window.close();
-		window.open( new_ory_doc_loc );
-	}
-	else
-	{
-	       	top.location = new_ory_doc_loc;
-	}
-    }
-   }
-}
-// -->
-</script>
-<script language="JavaScript">
-<!--
-  function getImageUrl(image)
-  {
-    var new_ory_doc_loc=null;
-    for(i=document.links.length-1;i>=0;i--)
-    {
-       if(document.links[i].href.indexOf("index.htm")!=-1)
-       {
-         new_ory_doc_loc = document.links[i].href.substring(0,document.links[i].href.lastIndexOf("/"));
-         new_ory_doc_loc = new_ory_doc_loc + "" + image;
-         return new_ory_doc_loc;
-       }
-    }
-    return null;
-  }
-// -->
-</script>
-<script
-language="JavaScript">
-<!--
-MSFPhover =
-(((navigator.appName == "Netscape") &&
-  (parseInt(navigator.appVersion) >= 3 )) ||
-  ((navigator.appName == "Microsoft Internet Explorer") &&
-  (parseInt(navigator.appVersion) >= 4 )));
-
-  function MSFPpreload(img)
-  {
-     var a=new Image();
-     a.src=img;
-     return a;
-  }
-// -->
-</script>
-<script language="JavaScript">
-<!--
-    if(MSFPhover)
-    {
-        RupGray=MSFPpreload(getImageUrl('/images/display_views.gif'));
-        RupBlue=MSFPpreload(getImageUrl('/images/display_views_a.gif'));
-    }
-// -->
-</script>
-
-<a href="JavaScript:loadTop();" onmouseover="if(MSFPhover) document['Home'].src=RupBlue.src; self.status='Display Eclipse Process Framework using frames'; return true" onmouseout="if(MSFPhover) document['Home'].src=RupGray.src; self.status= ' ';return true">
-<p>
-<img src="../images/rup1.gif" border="0" alt="Display Eclipse Process Framework using frames" name="Home" width="20" height="110"></p></a>
-</td></tr></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
-<p align="right"><small><small>Eclipse Process
-Framework&nbsp;&nbsp;
-</small></small>
-</td></tr></table>
-
-
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/bookmarkviews.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/bookmarkviews.js
deleted file mode 100644
index cf4bf16..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/bookmarkviews.js
+++ /dev/null
@@ -1,183 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-// javascript for the bookmarks frame ( the ory_toc_frame frame)
-// this frame contains a child iframe (ory_toc)
-
-// messages to be externized
-// here defines all the I18N specific messages used in the javascripts
-var bookmarkviews_js_MESSAGE1 = "This page could not be found in the navigation tree view.";
-
-function displayTree(tab)
-{
-	url = tab.getAttribute('url');
-
-	if ( selectedTab != null )
-	{
-		selectedTab.className = "tab"
-	}
-	tab.className = "selectedTab"
-	selectedTab = tab;
-
-	loadIframe("ory_toc", url);
-}
-
-function loadIframe(iframeName, url)
-{
-	if ( window.frames[iframeName] )
-	{
-		window.frames[iframeName].toc_loaded = false;
-		window.frames[iframeName].location = url;
-		return true;
-	}
-	else return false;
-}
-
-function showPage()
-{
-
-	parent.frames["ory_doc"].location.href = decodeURI(topicToDisplay);
-}
-
-
-/**
- * find a topic in the tree: the topic is set in topicToDisplay
- * returns true if success
- */
-function findTocTopic()
-{
-	var toc_window = window.frames["ory_toc"];
-
-	// check for false is not safe since the value might be undefined if the frame is not loaded yet
-	//if (toc_window.toc_loaded == false )
-	if ( toc_window.toc_loaded != true )
-	{
-		//if ( toc_window.toc_loaded == undefined )
-		//{
-		//	alert("got it!");
-		//}
-		window.setTimeout("findTocTopic()", 200);
-	}
-	else
-	{
-		if ( topicToDisplay == null )
-		{
-			topicToDisplay = toc_window.getFirstTopicUrl();
-		}
-	
-		var topic = topicToDisplay;
-		var found = toc_window.selectTopic(topic);
-		if ( found == false )
-		{
-			var anchorIndex = topic.lastIndexOf("#");
-			if (anchorIndex > 0)
-			{
-				topic = topic.substring(0, anchorIndex);
-			}
-			found = toc_window.selectTopic(topic);
-		}						
-
-		// find the topic in the current view, if not, look for the next view
-		if ( found == false )
-		{
-			if ( loadingTabIndex < viewTabs.length )
-			{
-				displayTree(viewTabs[loadingTabIndex++]);
-				findTocTopic();
-			}
-			else
-			{
-				// end finding and got nothing
-				// display the default
-				alert(bookmarkviews_js_MESSAGE1);
-				loadingTabIndex = 0;
-				showPage();
-			}
-		}
-		else
-		{
-			loadingTabIndex = 0;
-			// find successful, display the topic page
-			showPage();
-		}
-	}
-}
-
-// find the topic in the current tab
-function whereAmI()
-{
-	var url = parent.frames["ory_doc"].document.URL;
-	
-	if ( url != null )
-	{
-		topicToDisplay = url;
-		findTocTopic();
-	}
-}
-
-
-function togViews()
-{
-	// if currently visible, hide all except the currently selected
-	isViewsVisible = (!isViewsVisible);
-	
-	for ( var i = 0;  i < viewTabs.length; i++)
-	{
-		var show = isViewsVisible || (viewTabs[i] == selectedTab);
-		if ( show )
-		{		
-			//viewTabs[i].style.visibility = "visible";
-			viewTabs[i].style.display = '';
-		}
-		else
-		{
-			//viewTabs[i].style.visibility = "hidden";
-			viewTabs[i].style.display = 'none';
-		}
-	}
-		
-		
-
-}
-
-
-// display the default page and navigate to the node
-// if no default page is set, display the first node of the first view
-function init()
-{
-	loadingTabIndex = 0;
-	var tabs = document.getElementsByTagName("span");
-	var tabcount = 0;
-	for (var i=0; i<tabs.length; i++)
-	{
-		if ( tabs[i].getAttribute('url') != null )
-		{			
-			var isDefaultView = tabs[i].getAttribute('isDefaultView');
-			if ( isDefaultView == "true" )
-			{
-				loadingTabIndex = tabcount;
-			}
-			
-			viewTabs[tabcount++] = tabs[i];
-		}
-	}
-
-	topicToDisplay = parent.getCookie("rup_ory_doc");
-	displayTree(viewTabs[loadingTabIndex]);
-	findTocTopic();
-}
-
-
-var selectedTab = null;
-var viewTabs = new Array();;
-var loadingTabIndex = 0;
-var topicToDisplay = null;
-var isViewsVisible = true;
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/action_hide.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/action_hide.gif
deleted file mode 100644
index 75fcde2..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/action_hide.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/action_unhide.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/action_unhide.gif
deleted file mode 100644
index 84a4cfe..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/action_unhide.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/file.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/file.gif
deleted file mode 100644
index cea9e73..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/file.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/folder.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/folder.gif
deleted file mode 100644
index 06419d8..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/folder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/minus.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/minus.gif
deleted file mode 100644
index 90d1d34..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/minus.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/ni_where.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/ni_where.gif
deleted file mode 100644
index 41a4fd6..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/ni_where.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/noplus.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/noplus.gif
deleted file mode 100644
index 4d9e114..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/noplus.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/plus.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/plus.gif
deleted file mode 100644
index 014671f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/images/plus.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/toc.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/toc.js
deleted file mode 100644
index 4a9ca22..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/toc.js
+++ /dev/null
@@ -1,970 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
- 
-// Common scripts for IE and Mozilla.
-
-var isMozilla = navigator.userAgent.indexOf('Mozilla') != -1 && parseInt(navigator.appVersion.substring(0,1)) >= 5;
-var isIE = navigator.userAgent.indexOf('MSIE') != -1;
-
-// this is the selected node
-var oldActive;
-var oldActiveClass = "";
-var toc_loaded = false;
-
-function setLoaded()
-{
-	toc_loaded = true;
-	selectFirstTopic();
-}
-
-// Preload images
-// **********************************************************
-// Note: code moved into the jsp, for dynamic image preferences
-
-/**
- * Returns the target node of an event
- */
-function getTarget(e) {
-	var target;
-  	if (isMozilla)
-  		target = e.target;
-  	else if (isIE)
-   		target = window.event.srcElement;
-
-	return target;
-}
-
-/**
- * Returns the next tree node "down" from current one
- */
-function getNextDown(node)
-{
-	var a = getAnchorNode(node);
-	if (!a) return null;
-		
-	// Try visible child first
-	var li = a.parentNode;
-	var ul = getChildNode(li, "UL");
-	if (ul && ul.className == "expanded")
-		return getDescendantNode(ul, "A");
-	
-	// Try next sibling
-	var li_sib = getNextSibling(li);
-	if (li_sib != null)
-		return getDescendantNode(li_sib, "A");
-		
-	// Try looking to parent's sibling
-	while(li_sib == null) {
-		var ul = li.parentNode;
-		li = ul.parentNode;
-		if (li.tagName != "LI") // reached the top, nothing else to do
-			return null;
-			
-		li_sib = getNextSibling(li);		
-	}
-		
-	// found the next down sibling
-	return getDescendantNode(li_sib, "A");		
-}
-
-/**
- * Returns the next tree node "down" from current one
- */
-function getNextUp(node)
-{
-	var a = getAnchorNode(node);
-	if (!a) return null;
-		
-	// Get previous sibling first
-	var li = a.parentNode;
-	var li_sib = getPrevSibling(li);
-	if (li_sib != null) {
-		// try to get the deepest node that preceeds this current node
-		var candidate = getDescendantNode(li_sib, "A");
-		var nextDown = getNextDown(candidate);
-		while(nextDown != null && nextDown != node){
-			candidate = nextDown;
-			nextDown = getNextDown(nextDown);
-		}
-		return getDescendantNode(candidate, "A");	;
-	} else {
-		// get the parent
-		var li = li.parentNode.parentNode;
-		if (li && li.tagName == "LI")
-			return getDescendantNode(li, "A");
-		else
-			return null;
-	}
-}
-
-/**
- * Returns the next sibling element
- */
-function getNextSibling(node) 
-{
-	var sib = node.nextSibling;
-	while (sib && (sib.nodeType == 3 || sib.tagName=="SCRIPT")) // text or script node
-		sib = sib.nextSibling;
-	return sib;
-}
-
-/**
- * Returns the next sibling element
- */
-function getPrevSibling(node) 
-{
-	var sib = node.previousSibling;
-	while (sib && (sib.nodeType == 3 || sib.tagName=="SCRIPT")) // text or script node
-		sib = sib.previousSibling;
-	return sib;
-}
-
-
-/**
- * Returns the child node with specified tag
- */
-function getChildNode(parent, childTag)
-{
-	var list = parent.childNodes;
-	if (list == null) return null;
-	for (var i=0; i<list.length; i++)
-		if (list.item(i).tagName == childTag)
-			return list.item(i);
-	return null;
-}
-
-/**
- * Returns the descendat node with specified tag (depth-first searches)
- */
-function getDescendantNode(parent, childTag)
-{	
-	if (parent == null) return null;
-	
-	if (parent.tagName == childTag)
-		return parent;
-		
-	var list = parent.childNodes;
-	if (list == null) return null;
-	for (var i=0; i<list.length; i++) {
-		var child = list.item(i);
-		if(child.tagName == childTag)
-			return child;
-		
-		child = getDescendantNode(child, childTag);
-		if (child != null)
-			return child;
-	}
-	return null;
-}
-
-
-/**
- * Returns the anchor of this click
- * NOTE: MOZILLA BUG WITH A:focus and A:active styles
- */
-function getAnchorNode(node) {
-  if (node == null) return null;
-   
-  if (node.nodeType == 3)  //"Node.TEXT_NODE") 
-	return node.parentNode;
-  else if (node.tagName == "A") 
-    return node;
-  else if (node.tagName == "IMG")
-  	return getChildNode(node.parentNode, "A");
-  return null;
-}
-
-/**
- * Returns the plus/minus icon for this tree node
- */
-function getPlusMinus(node)
-{
-	if (isPlusMinus(node))
-		return node;
-  	else if (node.nodeType == 3)  //"Node.TEXT_NODE") 
-		return getChildNode(node.parentNode.parentNode, "IMG");
-	else if (node.tagName == "IMG")
-    	return getChildNode(node.parentNode.parentNode, "IMG");
-  	else if (node.tagName == "A") 
-    	return getChildNode(node.parentNode, "IMG");
-
- 	return null;
-}
-
-
-/**
- * Returns true when the node is the plus or minus icon
- */
-function isPlusMinus(node)
-{
-	return (node.nodeType != 3 && node.tagName == "IMG" && (node.className == "expanded" || node.className == "collapsed"));
-}
-
-/**
- * Collapses a tree rooted at the specified element
- */
-function collapse(node) {
-  node.className = "collapsed";
-  node.src = plus.src;
-  node.alt = altTopicClosed;
-  // set the UL as well
-  var ul = getChildNode(node.parentNode, "UL");
-  if (ul != null) ul.className = "collapsed";
-}
-
-/**
- * Expands a tree rooted at the specified element
- */
-function expand(node) {
-  	node.className = "expanded";
-  	node.src = minus.src;
-    node.alt = altTopicOpen;
-  	// set the UL as well
-  	var ul = getChildNode(node.parentNode, "UL");
-  	if (ul != null){
-  		ul.className = "expanded";
-  		if (ul.id.length > 0){
-  			if (!frames.dynLoadFrame) {
-  				return;
-  			}
-  			var ix = window.location.href.indexOf('?');
-  			if (ix < 0) {
-  				return;
-  			}
-  			var query = window.location.href.substr(ix);
-  			frames.dynLoadFrame.location = "tocFragment.jsp" + query + "&path=" + ul.id;
-  		}
-  	}
-}
-
-/**
- * Expands the nodes from root to the specified node
- */
-function expandPathTo(node, inclusive)
-{
-
-	// when the node is a link, get the plus/minus image
-	if (node.tagName == "A") 
-	{
-		var img = getChildNode(node.parentNode, "IMG")
-		if (img != null)
-		{			
-			expandPathTo(img, inclusive);
-			return;
-		}
-	}
-	
-	if (inclusive && isCollapsed(node))
-		expand(node);
-		
-	var li = node.parentNode;
-	if (li == null) return;
-	var ul = li.parentNode;
-	if (ul == null) return;
-	li = ul.parentNode;
-	if (li == null) return;
-	var img = getChildNode(li, "IMG");
-	if (img == null) return;
-		
-	expandPathTo(img, true);
-}
-
-/**
- * Returns true when this is an expanded tree node
- */
-function isExpanded(node) {
-  return node.className == "expanded";
-}
-
-/**
- * Returns true when this is a collapsed tree node
- */
-function isCollapsed(node) {
-  return  node.className == "collapsed";
-}
-
-/**
- * Highlights link
- */
-function highlightTopic(topic)
-{
-	if (isMozilla)
-		window.getSelection().removeAllRanges();
-
-  	var a = getAnchorNode(topic); 
-  	if (a != null)
-  	{
-  	 // 	parent.parent.parent.setContentToolbarTitle(tocTitle);
-  	  	if (oldActive) 
-  	  		oldActive.className = oldActiveClass;
-
-  		oldActive = a;
-  		oldActiveClass = a.className;
-  		a.className = "active";
-  		// it looks like the onclick event is not handled in mozilla
-  		// *** TO DO: handle failed synchronization, do not select in that case
-  		if (isMozilla && a.onclick) 
-  			a.onclick()
-  		//if (isIE)
-  		//	a.hideFocus = "true";
-  		
-  	}
-}
-
-
-function getFirstTopicUrl()
-{
-	var links = document.getElementsByTagName("a");
-	if ( links.length > 0 )
-	{
-		return links[0].href;
-	}
-	
-	return null;
-}
-
-function selectFirstTopic() {
-	//var url = getFirstTopicUrl();
-	//selectTopic(url);
-
-	var links = document.getElementsByTagName("a");
-	if ( links.length > 0 )
-	{
-		highlightTopic(links[0]);
-		parent.parent.frames["ory_doc"].location.href = links[0].href;
-	}
-
-
-}
-
-
-/**
- * Selects a topic in the tree: expand tree and highlight it
- * returns true if success
- */
-function selectTopic(topic)
-{
-	if (!topic)
-		return false;
-		
-	topic = parent.parent.fixUrl(topic);
-	
-	// remove the query, if any
-	var i = topic.indexOf('?');
-	if (i != -1)
-		topic = topic.substring(0, i);
-
-
-	var links = document.getElementsByTagName("a");
-
-	for (var i=0; i<links.length; i++)
-	{			
-		var fixed_href = parent.parent.fixUrl(links[i].href);
-		
-		// remove the query, if any
-		var indx = fixed_href.indexOf('?');
-		if (indx != -1) {
-			fixed_href = fixed_href.substring(0, indx);
-		}
-
-		//alert("fixed href=" + fixed_href);
-		if (topic == fixed_href)
-		{
-			expandPathTo(links[i], false);
-			highlightTopic(links[i]);
-			scrollIntoView(links[i]);
-			return true;
-		}
-	}
-	return false;
-}
-
-/**
- * Selects a topic in the tree: expand tree and highlight it
- * returns true if success
- */
-function selectTopicById(id)
-{
-	var topic = document.getElementById(id);
-	if (topic)
-	{
-		expandPathTo(topic, false);
-		highlightTopic(topic);
-		scrollIntoView(topic);
-		return true;
-	}
-	return false;
-}
-
-/**
- * Scrolls the page to show the specified element
- */
-function scrollIntoView(node)
-{
-	var scroll = getVerticalScroll(node);
-	if (scroll != 0)
-		window.scrollBy(0, scroll);
-}
-
-/**
- * Scrolls the page to show the specified element
- */
-function getVerticalScroll(node)
-{
-	var nodeTop = node.offsetTop;
-	var nodeBottom = nodeTop + node.offsetHeight;
-	var pageTop = 0;
-	var pageBottom = 0;
-	
-	if (isIE)
-	{
-		pageTop = document.body.scrollTop; 
-		pageBottom = pageTop + document.body.clientHeight;
-	
-	} 
-	else if (isMozilla)
-	{
-		pageTop = window.pageYOffset;
-		pageBottom = pageTop + window.innerHeight - node.offsetHeight;
-	}
-	
-	var scroll = 0;
-	if (nodeTop >= pageTop )
-	{
-		if (nodeBottom <= pageBottom)
-			scroll = 0; // already in view
-		else
-			scroll = nodeBottom - pageBottom;
-	}
-	else
-	{
-		scroll = nodeTop - pageTop;
-	}
-	
-	return scroll;
-}
-
-/*
- * Currently called on IE only
- */
-function focusHandler(e)
-{
-	/*if (isMozilla)
-		return;
-	*/
-		
-	try{
-		if (oldActive){
-			// only focus when the element is visible
-			var scroll = getVerticalScroll(oldActive);
-			if (scroll == 0)
-				oldActive.focus();
-		}		
-	}
-	catch(e){}
-}
-
-
-/**
- * display topic label in the status line on mouse over topic
- */
-function mouseMoveHandler(e) {
-	var overNode = getTarget(e);
- 	if (!overNode) return;
-  	
-	overNode = getAnchorNode(overNode);
-	  if (overNode == null){
-	   window.status = "";
-	   return;
-	  }
- 
-	if (isMozilla)
-		e.cancelBubble = false;
-  	 
-	if (overNode.title == "") {
-		if (overNode.innerText)
-			overNode.title = overNode.innerText;
-		else if (overNode.text)
-			overNode.title = overNode.text;
-	}
-	window.status = overNode.title;
-}
-
-/**
- * handler for expanding / collapsing topic tree
- */
-function mouseClickHandler(e) {
-
-  	var clickedNode = getTarget(e);
-
-  	if (isPlusMinus(clickedNode) )
-  	{	
-    	if (isCollapsed(clickedNode)) 
-   			expand(clickedNode);
-  		else if (isExpanded(clickedNode)) 
-  	  		collapse(clickedNode);
-  	}
-  	else
-  	{
-  		var plus_minus = getPlusMinus(clickedNode);
-  		if (plus_minus != null)
-  			highlightTopic(plus_minus);
-  	}
-  	
-  	if (isMozilla)
-  		e.cancelBubble = true;
-  	else if (isIE)
-  		window.event.cancelBubble = true;
-}
-
-/**
- * handler for expanding / collapsing topic tree
- */
-function mouseDblClickHandler(e) {
-
-  	var clickedNode = getTarget(e);
-  	if (!clickedNode) return;
-
-  	var plus_minus = getPlusMinus(clickedNode);
-  	if (plus_minus != null)
-  	{	
-    	if (clickedNode.tagName == "A" && getChildNode(clickedNode.parentNode, "UL") == null) 
-  		{
-  			highlightTopic(plus_minus);
-  		}
-  		else
-  		{  		
-    		if (isCollapsed(plus_minus)) 
-   				expand(plus_minus);
-  			else if (isExpanded(plus_minus)) 
-  	  			collapse(plus_minus);  	  		  		  
-  	  			
-  			highlightTopic(plus_minus);
-  		}
-  	}
-  
-  	if (isMozilla)
-  		e.cancelBubble = true;
-  	else if (isIE)
-  		window.event.cancelBubble = true;
-}
-
-/**
- * Handler for key down (arrows)
- */
-function keyDownHandler(e)
-{
-	var key;
-
-	if (isIE) {
-		key = window.event.keyCode;
-	} else if (isMozilla) {
-		key = e.keyCode;
-	}
-		
-	if (key <37 || key > 40) 
-		return true;
-	
-	if (isMozilla)
-  		e.cancelBubble = true;
-  	else if (isIE)
-  		window.event.cancelBubble = true;
-  		
-  	if (key == 39) { // Right arrow, expand
-		var clickedNode = getTarget(e);
-  		if (!clickedNode) return;
-  		if (isIE){
-			if(clickedNode.id!=null){
-				if(clickedNode.id.charAt(0)=='b'){
-					if(clickedNode.name!="opened"){
-						loadTOC(clickedNode.name);
-						return true;
-					}
-				}
-			}
-		}
-
-  		var plus_minus = getPlusMinus(clickedNode);
-  		if (plus_minus != null)
-  		{	
-    		if (isCollapsed(plus_minus)) 
-   				expand(plus_minus);
-  			
-  			highlightTopic(plus_minus);
-  			scrollIntoView(clickedNode);
-  		}
-  	} else if (key == 37) { // Left arrow,collapse
-		var clickedNode = getTarget(e);
-  		if (!clickedNode) return;
-  		
-  		if(clickedNode.id!=null){
-  			if(clickedNode.id.charAt(0)=='b'){
-				if(clickedNode.name=="opened"){
-					loadTOC(" ");
-					return true;
-				}
-				else{ 	
-					return true;
-				}
-			}
-			
-		}
-
-  		var plus_minus = getPlusMinus(clickedNode);
-  		if (plus_minus != null)
-  		{	
-    		if (isExpanded(plus_minus)) 
-   				collapse(plus_minus);
-  			
-  			highlightTopic(plus_minus);
-  			scrollIntoView(clickedNode);
-  		}
-  	} else if (key == 40 ) { // down arrow
-  		var clickedNode = getTarget(e);
-  		if (!clickedNode) return;
-
-		var next = getNextDown(clickedNode);
-		if (next)
-			next.focus();
-
-  	} else if (key == 38 ) { // up arrow
-  		var clickedNode = getTarget(e);
-  		if (!clickedNode) return;
-
-		var next = getNextUp(clickedNode);
-		if (next)
-			next.focus();
-  	}
-  	
-  	 			
-  	return true;
-}
-
-if (isMozilla) {
-  document.addEventListener('click', mouseClickHandler, true);
-  document.addEventListener('dblclick', mouseDblClickHandler, true);
-  document.addEventListener('mousemove', mouseMoveHandler, true);
-  document.addEventListener('keydown', keyDownHandler, true);
-}
-else if (isIE){
-  document.onclick = mouseClickHandler;
-  document.ondblclick = mouseDblClickHandler;
-  document.onmousemove = mouseMoveHandler;
-  document.onkeydown = keyDownHandler;
-  //window.onfocus = focusHandler;
-}
-
-function setCookie( name, value, expires, path, domain, secure ) 
-{
-	// set time, it's in milliseconds
-	var today = new Date();
-	today.setTime( today.getTime() );
-
-	/*
-	if the expires variable is set, make the correct 
-	expires time, the current script below will set 
-	it for x number of days, to make it for hours, 
-	delete * 24, for minutes, delete * 60 * 24
-	*/
-	if ( expires )
-	{
-	expires = expires * 1000 * 60 * 60 * 24;
-	}
-	var expires_date = new Date( today.getTime() + (expires) );
-
-	document.cookie = name + "=" +escape( value ) +
-	( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) + 
-	( ( path ) ? ";path=" + path : "" ) + 
-	( ( domain ) ? ";domain=" + domain : "" ) +
-	( ( secure ) ? ";secure" : "" );
-}
-
-
-function getCookie( name ) {	
-	var start = document.cookie.indexOf( name + "=" );
-	var len = start + name.length + 1;
-	if ( ( !start ) &&
-	( name != document.cookie.substring( 0, name.length ) ) )
-	{
-	return null;
-	}
-	if ( start == -1 ) return null;
-	var end = document.cookie.indexOf( ";", len );
-	if ( end == -1 ) end = document.cookie.length;
-	return unescape( document.cookie.substring( len, end ) );
-}
-
-
-function Delete_Cookie( name, path, domain ) {
-	if ( Get_Cookie( name ) ) document.cookie = name + "=" +
-	( ( path ) ? ";path=" + path : "") +
-	( ( domain ) ? ";domain=" + domain : "" ) +
-	";expires=Thu, 01-Jan-1970 00:00:01 GMT";
-}
-
-function fixTopicUrl(url) {
-
-	var fixed_href = parent.parent.fixUrl(url);
-	// remove the query, if any
-	var indx = fixed_href.indexOf('?');
-	if (indx != -1) {
-		fixed_href = fixed_href.substring(0, indx);
-	}
-
-	return fixed_href;
-}
-
-/* find the node with the given url and return the A element */	
-function findNode(topic) {
-	if (!topic) {
-		return null;
-	}
-	
-	topic = fixTopicUrl(topic);	
-	var links = document.getElementsByTagName("a");
-	for (var i=0; i<links.length; i++)
-	{			
-		var fixed_href = fixTopicUrl(links[i].href);			
-		if (topic == fixed_href)
-		{
-			//alert(topic + "\n" + links[i].href);
-			return links[i];
-		}
-	}
-	
-	return null;
-}
-
-
-function getNodeIdFromUrl(url) {
-
-	var indx = url.indexOf("?");
-	if ( indx < 0 ) {
-		return null;
-	}
-	
-	queryStr = url.substring(indx+1);
-	var pairs = queryStr.split("&");
-   	for (var i = 0; i < pairs.length; i++) {
-     		var pos = pairs[i].indexOf('=');
-     		if (pos == -1) continue;
-     		var argname = pairs[i].substring(0,pos);
-     		var value = pairs[i].substring(pos+1);    	
-     		if ( argname == "nodeId" ) {
-     			return value;
-     		}
-	}
-	
-	return null;
-}
-
-function getBreadcrumbsByGuid(guid) {
-
-	var node = getNodeByGuid(guid);
-	if (node != null) {
-		id = node.getAttribute("id");
-		return getBreadcrumbsByNodeId(id);
-	}
-	
-	return "";	
-}
-
-function getNodeByGuid(guid) {
-
-	var links = document.getElementsByTagName("a");
-	for (var i=0; i<links.length; i++)
-	{	
-		var node = links[i];
-		if (guid == node.getAttribute("guid") ) {
-			return node;
-		}
-	}
-	
-	return null;	
-}
-
-function getBreadcrumbs(url) {
-
-	var id = getNodeIdFromUrl(url);
-	//alert("id: url : " + id + ", " + url);
-
-	if ( id == null || id == "" ) {
-		/*
-		// get the parent node, assuming the current node is navigated from the previous node
-		var previousBreadCrumbId = getCookie("previousBreadCrumbId");
-		
-		//alert("previousBreadCrumbId=" + previousBreadCrumbId);
-		var pNode = null;
-		if ( previousBreadCrumbId != null ) {
-			pNode = document.getElementById(previousBreadCrumbId);
-			if ( pNode != null ) {
-				// get the parent nod of the link
-				pNode = pNode.parentNode;
-				//alert(pNode.tagName);
-			}
-		}
-		*/
-		
-		var node = findNode(url);		
-		if ( node != null ) {
-			id = node.getAttribute("id");
-		}
-		
-		if ( id == null ) {
-			return "";
-		}
-		
-		// save the current id
-		// setCookie("previousBreadCrumbId", id);
-	}
-	
-	selectTopicById(id);
-
-	return getBreadcrumbsByNodeId(id);
-}
-
-
-function getBreadcrumbsByNodeId(id) {
-
-	var bcs = [];
-	var count = 0;
-	var pId = id;
-	while ( pId != "" ) {
-		var topic = document.getElementById(pId);
-		if ( topic == null ) {
-			break;
-		}
-
-		bcs[count++] = _constructBreadcrumb(topic);
-		
-		pId = topic.getAttribute("parentId");
-	}
-	
-	return bcs.reverse();
-
-}
-
-function _constructBreadcrumb(node) {
-
-
-	var str = node.innerHTML;
-	var url = node.href;
-	var guid = node.getAttribute("guid");
-	
-	var i = str.indexOf(">");
-	if ( i > 0 ) {
-		str = str.substring(i+1);
-	}
-
-	return {id: guid, url: url, title: str};
-
-}
-
-
-
-function getBaseUrl() {
-	var url = parent.parent.location.href;
-	var i = url.lastIndexOf("/");
-	return url.substring(0, i+1);
-}
-
-function getCurrentSelection() {
-	return oldActive;
-}
-
-/* give the LI node as parent, find the child <A node with the given guid*/
-function getChildNodeWithGuid(/*LI*/pNode, guid)
-{
-	//alert("parent Link: " + pNode.tagName);
-
-	if ( pNode == null ) {
-		return null;
-	}
-	
-	if ( pNode.tagName == "A" ) {
-		pNode = pNode.parentNode;
-	}
-	
-	var ul = getChildNode(pNode, "UL");
-		
-	if ( ul == null ) {
-		return null;
-	}
-		
-	var list = ul.childNodes;
-	if (list == null) return null;
-	
-	for (var i=0; i<list.length; i++) {
-		var tag = list.item(i);
-		if (tag.tagName == "LI" ) {
-			var a = getChildNode(tag, "A");
-			if ( a != null && a.getAttribute("guid") == guid) {		
-				return a;
-			}
-		}
-	}
-	
-	return null;
-}
-
-
-/* give an array of guids, returns the breadcrumbs*/
-function getBreadcrumbsByPath(guids) {
-
-	if ( guids == null || guids.length == 0 ) {
-		return [];
-	}
-	
-	// start from the first guid, or from the current selection
-	var start = 0;
-	var pNode = null;
-	var curNode = getCurrentSelection();
-	if ( curNode != null ) {
-		var curGuid = curNode.getAttribute("guid");
-		for ( var i = 0; i < guids.length-1; i++ ) {
-			var guid = guids[i];
-			if ( guid == curGuid ) {
-				start = i;
-				pNode = curNode;
-				break;
-			}			
-		}
-	}
-	
-
-	if ( pNode == null ) {
-		pNode = getNodeByGuid(guids[0]);
-	}
-	
-	if ( pNode == null ) {
-		return [];
-	}
-	
-	var bcs = getBreadcrumbsByNodeId( pNode.getAttribute("id") );
-		
-	for ( var i = start+1; i < guids.length; i++ ) {
-		var node = getChildNodeWithGuid(pNode, guid[i]);
-		if ( node == null ) {
-			break;
-		}
-		
-		bcs.push(_constructBreadcrumb(node));		
-		pNode = node;
-	}
-
-	// select the node
-	//selectTopicById(pNode.getAttribute("id") );
-
-	return bcs;	
-}
-
-
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/tree.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/tree.js
deleted file mode 100644
index a0f2e3e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/noapplet/tree.js
+++ /dev/null
@@ -1,103 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-/**
- * Loads the specified table of contents
- */
-function loadTOC(tocHref)
-{
-	// navigate to this toc, if not already loaded
-	if (window.location.href.indexOf("tocView.jsp?toc="+tocHref) != -1)
-		return;
-	window.location.replace("tocView.jsp?toc="+tocHref);
-}
-
-var tocTitle = "";
-var tocId = "";
-
-function onloadHandler()
-{
-	return;
-	tocTitle = 'Workbench\u0020User\u0020Guide';
-	var tocTopic = "about:blank";
-
-	// set title on the content toolbar
-	parent.parent.parent.setContentToolbarTitle(tocTitle);
-
-	var topicSelected=false;
-	// select specified topic, or else the book
-	var topic = "about:blank";
-	if (topic != "about:blank" && topic != tocTopic) {
-		if (topic.indexOf(window.location.protocol) != 0 && topic.length > 2) {
-			// remove the .. from topic
-			topic = topic.substring(2);
-			// remove advanced/tocView.jsp from path to obtain contextPath
-			var contextPath = window.location.pathname;
-			var slash = contextPath.lastIndexOf('/');
-			if(slash > 0) {
-				slash = contextPath.lastIndexOf('/', slash-1);
-				if(slash >= 0) {
-					contextPath = contextPath.substr(0, slash);
-					topic = window.location.protocol + "//" +window.location.host + contextPath + topic;
-				}
-			}
-		}
-		topicSelected = selectTopic(topic);
-	} else {
-		topicSelected = selectTopicById(tocId);
-	}
-
-	if(!topicSelected){
-		if(parent.parent.activityFiltering){
-			askShowAll();
-		}
-	}
-
-
-	focusHandler("e");
-}
-
-var askShowAllDialog;
-var w = 470;
-var h = 270;
-
-function askShowAll(){
-
-	var l = top.screenLeft + (top.document.body.clientWidth - w) / 2;
-	var t = top.screenTop + (top.document.body.clientHeight - h) / 2;
-
-	// move the dialog just a bit higher than the middle
-	if (t-50 > 0) t = t-50;
-
-	window.location="javascript://needModal";
-	askShowAllDialog = window.open("askShowAll.jsp", "askShowAllDialog", "resizeable=no,height="+h+",width="+w+",left="+l+",top="+t );
-	askShowAllDialog.focus();
-}
-
-function yesShowAll(){
-	window.parent.parent.showAll();
-}
-
-function closeAskShowAllDialog(){
-	try {
-		if (askShowAllDialog){
-			askShowAllDialog.close();
-		}
-	}
-	catch(e) {}
-}
-
-function onunloadHandler() {
-	closeAskShowAllDialog();
-
-	document.body.innerHTML = "";
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/process/glossary/index.htm b/1.5/plugins/org.eclipse.epf.publishing/docroot/process/glossary/index.htm
deleted file mode 100644
index 80bbbf4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/process/glossary/index.htm
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN"
-  "http://www.w3.org/TR/html4/loose.dtd">
-<html lang="en" xml:lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<meta name="meta_tagged" content="true">
-<title>Glossary - Eclipse Process Framework</title>
-</head>
-<frameset rows="25,*">
-<frame name="glossary_nav" src="navig.htm" scrolling="no" marginheight="2" marginwidth="2" title="Navigation Area">
-<frame name="glossary_doc" src="../glossary.htm" marginheight="0" marginwidth="2" scrolling="auto" title="Content Area">
-</frameset>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/rop.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/rop.css
deleted file mode 100644
index 64220e6..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/rop.css
+++ /dev/null
@@ -1,1685 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-body
-{
-	background-image: none;
-	background-color: white;
- 	font-family: Arial, Helvetica, sans-serif;
- 	font-size: 10pt
-}
-
-body.navbuttons
-{
-	margin-left: 0px;
-	margin-top: 0px;
-	margin-right: 0px
-}
-
-.bgwhite
-{ 
-	 background-color: #ffffff
-} 
-
-.buttons
-{
-   	background-color: #efefef;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 10px;
-	text-decoration: none	
-}
-
-.buttonon 
-{
-	background-color: #dedede;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 10px;
-	text-decoration: none;
-	vertical-align: middle
-} 
-
-td.buttons
-{
-	vertical-align: middle;
-	font-family: Arial, sans-serif;
-	font-size: 10pt
-}
-
-.iconborder
-{ 
-	 background-color: #dedede
-}
-
-a.buttons:link 
-{ 
-	color: #000000
-}
-
-a.buttons:visited 
-{ 
-	color: #000000
-}
-
-a.buttons:hover 
-{ 
-	color: #cc0000
-}
-
-a.buttons:active
-{ 
-	color: #cc0000
-}
-
-/*for pages with button navigation on top*/  
-div.margins20 
-{ 	
-	margin-left: 7px;
-	margin-top: 20px;
-	margin-right: 7px
-}   
-
-
-h1
-{
-	font-family: Arial, sans-serif;
-	font-size: large
-}
-        
-h1.banner
-{
-        text-align: left;
-        font-family: Arial, sans-serif;
-	  	font-size: large;
-	  	text-decoration: underline
-}
-
-h2
-{
-        font-family: Arial, sans-serif;
-        font-size: 150%	
-}
-        
-h2.banner
-{
-        text-align: left;
-        font-family: Arial, sans-serif;
-        font-size: 150%;
-        text-decoration: underline
-}
-
-h3
-{
-        font-family: Arial, sans-serif
-}
-
-h4, h5, h6
-{
-        font-family: Arial, sans-serif;
-        margin-left: 0px
-}
-  
-    
-a:link
-{
-    color: #003399
-}
-
-a:active
-{
-    color: #0000ff
-}
-
-a:visited
-{
-    color: #660066
-}
-
-dl
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-dt
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-dd
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-p
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        margin-left: 0px
-}
-
-p.node
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        margin-left: 15px
-        
-}
-
-p.exampleheading
-{
-        font-family: Arial, sans-serif;
-        font-weight: bold;
-        font-size: 10pt;
-        margin-left: 15px
-}
-
-p.example
-{
-	font-family: Arial, Helvetica, sans-serif;
-	margin-left: 70px;
-}
-
-p.picturetext
-{
-	text-align: center;
-	font-family: sans-serif;
-	font-size: 80%;
-        margin-left: 70px;
-        margin-right: 50px
-}
-
-p.definition
-{
-	background: #ffffcc;
-	border: thin double black
-}
-
-p.tableheading
-{
-	font-weight: bold;
-        margin-left: 0
-}
-
-p.tabletext
-{
-        margin-left: 0
-}
-
-p.paramname
-{
-   text-align: left
-}
-
-p.paramexample
-{
-   text-align: left;
-   color: red
-}
-
-p.paramdescription
-{
-   text-align: left
-}
-
-ol
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        margin-left: +45px
-}
-
-ol ol
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        margin-left: +23px
-}
-
-ol ol ol
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        margin-left: +23px
-}
-
-ol.alpha
-{
-	list-style-type: lower-alpha
-}
-
-ul
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-}
-
-ul li
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +20px
-	text-align: justify
-}
-
-
-ul ul li
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul ul li
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul li.node
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul li.ck
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul li.ck
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul ul li.ck
-{
-        font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +10px;
-    	text-align: justify
-}
-
-
-ul.plus
-{
-        list-style-image: 
-}
-
-ul.minus
-{
-        list-style-image: 
-}
-
-ul.ck
-{
-
-}
-
-table
-{
-/*	border: 1;*/
-/*	width: 85%;*/
-/*	cellspacing: 0;*/
-/*	cellpadding: 4;*/
-/*	style="border: 1px solid rgb(128,128,128)";*/
-/*	bordercolor="#808080";*/
-/*	bordercolorlight: #808080;*/
-/*	bordercolordark: #808080*/
-}
-
-tbody
-{
-	valign: baseline;
-	font-family: Arial, Helvetica, sans-serif
-}
-
-th
-{
-	font-size: smaller
-}
-
-td
-{
-	vertical-align: top;
-	font-family: Arial, sans-serif;
-	font-size: 10pt
-}
-
-td ul
-{
-	margin-left: +20px;
-	font-family: Arial, sans-serif;
-	font-size: 10pt
-}
-
-font.paramexample
-{
-   color: red
-}
-
-font.imageexample
-{
-   font-size: smaller
-}
-
-/* used for not-included plugins*/
-h1.notincludedbanner
-{
-        background: #FFFFCC;
-        text-align: center;
-        font-family: Arial, sans-serif;
-	  font-size: large;
-}
-
-
-/*the following is used for ibm content*/
-
-h1.ibm
-{
-        font-family: Arial, sans-serif;
-}
-        
-h1.ibmbanner
-{
-        text-align: left;
-        font-family: Arial, sans-serif;
-	  font-size: large;
-	 text-decoration: underline
-}
-
-
-    
-
-h2.ibm
-{
-        font-family: Arial, sans-serif;
-}
-        
-h2.ibmbanner
-{
-        text-align: left;
-        font-family: Arial, sans-serif;
-	font-size: 150%; 
-	text-decoration: underline;
-}
-
-h3.ibm
-{
-        font-family: Arial, sans-serif;
-}
-
-h4.ibm, h5.ibm, h6.ibm
-{
-        font-family: Arial, sans-serif;
-        margin-left: 0px
-}
-
-dl.ibm
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-dt.ibm
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-dd.ibm
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-   
-p.ibm
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-       	 margin-left: 0px
-}
-
-p.ibmnode
-{
-        margin-left: 15px
-        leftMargin: 15px
-}
-
-p.ibmexampleheading
-{
-        font-family: Arial, sans-serif;
-        font-weight: bold;
-        font-size: 10pt;
-        margin-left: 15px
-}
-
-p.ibmexample
-{
-	margin-left: 70px;
-}
-
-p.ibmpicturetext
-{
-	text-align: center;
-	font-family: sans-serif;
-	font-size: 80%;
-        margin-left: 70px;
-        margin-right: 50px
-}
-
-p.ibmdefinition
-{
-	background: #ffffcc;
-	border: thin double black
-}
-
-p.ibmtableheading
-{
-	font-weight: bold;
-        margin-left: 0
-}
-
-p.ibmtabletext
-{
-        margin-left: 0
-}
-
-p.ibmparamname
-{
-   text-align: left
-}
-
-p.ibmparamexample
-{
-   text-align: left;
-   color: red
-}
-
-p.ibmparamdescription
-{
-   text-align: left
-}
-
-ol.ibm
-{
-        margin-left: +45px
-}
-
-ol ol.ibm
-{
-        margin-left: +23px
-}
-
-ol ol ol.ibm
-{
-        margin-left: +23px
-}
-
-ol.ibmalpha
-{
-	list-style-type: lower-alpha
-}
-
-
-
-ul li.ibm
-{
-        text-indent: +20px
-	text-align: justify
-}
-
-
-ul ul li.ibm
-{
-        text-indent: +10px
-	  text-align: justify
-}
-
-
-ul ul ul li.ibm
-{
-        text-indent: +10px
-	  text-align: justify
-}
-
-ul li.ibmnode
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul li.ibmck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul li.ibmck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul ul li.ibmck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul.ibmplus
-{
-        list-style-image: 
-}
-
-ul.ibmminus
-{
-        list-style-image: 
-}
-
-
-ul.ibmck
-{
-
-}
-
-table.ibm
-{
-}
-
-tr.ibm
-{
-}
-
-td.ibm
-{
-        vertical-align: top
-}
-
-td ul.ibm
-{
-        margin-left: +20px
-}
-
-font.ibmparamexample
-{
-   color: red
-}
-
-font.ibmimageexample
-{
-   font-size: smaller
-}
-
-/*the following is used for real time content*/
-
-h1.reactive
-{
-        font-family: Arial, sans-serif;
-}
-        
-h1.reactivebanner
-{
-        
-        text-align: left;
-        font-family: Arial, sans-serif;
-	font-size: large;
-	text-decoration: underline;
-}
-
-h2.reactive
-{
-        font-family: Arial, sans-serif;
-	font-size: 150%;
-}
-        
-h2.reactivebanner
-{
-        text-align: left;
-        font-family: Arial, sans-serif;
-        font-size: 150%;
-        text-decoration: underline;
-}
-
-h3.reactive
-{
-        font-family: Arial, sans-serif;
-}
-
-h4.reactive, h5.reactive, h6.reactive
-{
-        font-family: Arial, sans-serif;
-        margin-left: 0px
-}
-
-dl.reactive
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-dt.reactive
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-      
-dd.reactive
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-p.reactive
-{
-	font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        margin-left: 0px
-}
-
-p.reactivenode
-{
-        margin-left: 15px
-        leftMargin: 15px
-}
-
-p.reactiveexampleheading
-{
-        font-family: Arial, sans-serif;
-        font-weight: bold;
-        font-size: 10pt;
-        margin-left: 15px
-}
-
-p.reactiveexample
-{
-	margin-left: 70px;
-}
-
-p.reactivepicturetext
-{
-	text-align: center;
-	font-family: sans-serif;
-	font-size: 80%;
-        margin-left: 70px;
-        margin-right: 50px
-}
-
-p.reactivedefinition
-{
-	background: #ffffcc;
-	border: thin double black
-}
-
-p.reactivetableheading
-{
-	font-weight: bold;
-        margin-left: 0
-}
-
-p.reactivetabletext
-{
-        margin-left: 0
-}
-
-p.reactiveparamname
-{
-   text-align: left
-}
-
-p.reactiveparamexample
-{
-   text-align: left;
-   color: red
-}
-
-p.reactiveparamdescription
-{
-   text-align: left
-}
-
-ol.reactive
-{
-        margin-left: +45px
-}
-
-ol ol.reactive
-{
-        margin-left: +23px
-}
-
-ol ol ol.reactive
-{
-        margin-left: +23px
-}
-
-ol.reactivealpha
-{
-	list-style-type: lower-alpha
-}
-
-
-
-ul li.reactive
-{
-	font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +20px
-	text-align: justify
-}
-
-
-ul ul li.reactive
-{
-	font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +10px
-	  text-align: justify
-}
-
-
-ul ul ul li.reactive
-{
-	font-family: Arial, Helvetica, sans-serif;
-        font-size: 10pt;
-        text-indent: +10px
-	  text-align: justify
-}
-
-ul li.reactivenode
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul li.reactiveck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul li.reactiveck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul ul li.reactiveck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul.reactiveplus
-{
-        list-style-image: 
-}
-
-ul.reactiveminus
-{
-        list-style-image: 
-}
-
-
-ul.reactiveck
-{
-}
-
-table.reactive
-{
-}
-
-tr.reactive
-{
-}
-
-td.reactive
-{
-        vertical-align: top
-}
-
-td ul.reactive
-{
-        margin-left: +20px
-}
-
-font.reactiveparamexample
-{
-   color: red
-}
-
-font.reactiveimageexample
-{
-   font-size: smaller
-}
-
-/*the following is used for Microsoft content*/
-
-h1.msft
-{
-        font-family: Arial, sans-serif;
-	font-size: large;
-}
-        
-h1.msftbanner
-{
-        text-align: left;
-        font-family: Arial, sans-serif;
-	  	 font-size: large;
-	  	 text-decoration: underline;
-}
-
-h2.msft
-{
-             font-family: Arial, sans-serif;
-        font-size: 150%;	
-}
-        
-h2.msftbanner
-{
-     text-align: left;
-        font-family: Arial, sans-serif;
-	 font-size: 150%;
-	 text-decoration: underline;
-	  	
-}
-
-h3.msft
-{
-        font-family: Arial, sans-serif;
-}
-
-h4.msft, h5.msft, h6.msft
-{
-        font-family: Arial, sans-serif;
-        margin-left: 0px
-}
-
-dl.msft
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-dt.msft
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-      
-dd.msft
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-p.msft
-{
-	font-family: Arial, Helvetica, sans-serif;
-	 font-size: 10pt;
-}
-
-p.msftnode
-{
-        margin-left: 15px
-        leftMargin: 15px
-}
-
-p.msftexampleheading
-{
-        font-family: Arial, sans-serif;
-        font-weight: bold;
-        font-size: 10pt;
-        margin-left: 15px
-}
-
-p.msftexample
-{
-	margin-left: 70px;
-}
-
-p.msftpicturetext
-{
-	text-align: center;
-	font-family: sans-serif;
-	font-size: 80%;
-        margin-left: 70px;
-        margin-right: 50px
-}
-
-p.msftdefinition
-{
-	background: #ffffcc;
-	border: thin double black
-}
-
-p.msfttableheading
-{
-	font-weight: bold;
-        margin-left: 0
-}
-
-p.msfttabletext
-{
-        margin-left: 0
-}
-
-p.msftparamname
-{
-   text-align: left
-}
-
-p.msftparamexample
-{
-   text-align: left;
-   color: red
-}
-
-p.msftparamdescription
-{
-   text-align: left
-}
-
-ol.msft
-{
-        margin-left: +45px
-}
-
-ol ol.msft
-{
-        margin-left: +23px
-}
-
-ol ol ol.msft
-{
-        margin-left: +23px
-}
-
-ol.msftalpha
-{
-	list-style-type: lower-alpha
-}
-
-
-
-ul li.msft
-{
-        text-indent: +20px
-	text-align: justify
-}
-
-
-ul ul li.msft
-{
-        text-indent: +10px
-	  text-align: justify
-}
-
-
-ul ul ul li.msft
-{
-        text-indent: +10px
-	  text-align: justify
-}
-
-ul li.msftnode
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul li.msftck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul li.msftck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul ul li.msftck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul.msftplus
-{
-        list-style-image: 
-}
-
-ul.msftminus
-{
-        list-style-image: 
-}
-
-
-ul.msftck
-{
-}
-
-table.msft
-{
-}
-
-tr.msft
-{
-}
-
-td.msft
-{
-        vertical-align: top
-}
-
-td ul.msft
-{
-        margin-left: +20px
-}
-
-font.msftparamexample
-{
-   color: red
-}
-
-font.msftimageexample
-{
-   font-size: smaller
-}
-
-/*the following is used for database content*/
-
-h1.dbms
-{
-        font-family: Arial, sans-serif;
-}
-        
-h1.dbmsbanner
-{
-        background: #6a8fbd;
-        text-align: center;
-        font-family: Arial, sans-serif;
-	  font-size: large;
-}
-
-h2.dbms
-{
-        font-family: Arial, sans-serif;
-}
-        
-h2.dbmsbanner
-{
-        background: #6a8fbd;
-        text-align: center;
-        font-family: Arial, sans-serif;
-}
-
-h3.dbms
-{
-        font-family: Arial, sans-serif;
-}
-
-h4.dbms, h5.dbms, h6.dbms
-{
-        font-family: Arial, sans-serif;
-        margin-left: 0px
-}
-
-dl.dbms
-{
-}
-
-dt.dbms
-{
-}
-      
-dd.dbms
-{
-}
-
-p.dbms
-{
-        margin-left: 0px
-}
-
-p.dbmsnode
-{
-        margin-left: 15px
-        leftMargin: 15px
-}
-
-p.dbmsexampleheading
-{
-        font-family: Arial, sans-serif;
-        font-weight: bold;
-        font-size: 10pt;
-        margin-left: 15px
-}
-
-p.dbmsexample
-{
-	margin-left: 70px;
-}
-
-p.dbmspicturetext
-{
-	text-align: center;
-	font-family: sans-serif;
-	font-size: 80%;
-        margin-left: 70px;
-        margin-right: 50px
-}
-
-p.dbmsdefinition
-{
-	background: #ffffcc;
-	border: thin double black
-}
-
-p.dbmstableheading
-{
-	font-weight: bold;
-        margin-left: 0
-}
-
-p.dbmstabletext
-{
-        margin-left: 0
-}
-
-p.dbmsparamname
-{
-   text-align: left
-}
-
-p.dbmsparamexample
-{
-   text-align: left;
-   color: red
-}
-
-p.dbmsparamdescription
-{
-   text-align: left
-}
-
-ol.dbms
-{
-        margin-left: +45px
-}
-
-ol ol.dbms
-{
-        margin-left: +23px
-}
-
-ol ol ol.dbms
-{
-        margin-left: +23px
-}
-
-ol.dbmsalpha
-{
-	list-style-type: lower-alpha
-}
-
-
-
-ul li.dbms
-{
-        text-indent: +20px
-	text-align: justify
-}
-
-
-ul ul li.dbms
-{
-        text-indent: +10px
-	  text-align: justify
-}
-
-
-ul ul ul li.dbms
-{
-        text-indent: +10px
-	  text-align: justify
-}
-
-ul li.dbmsnode
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul li.dbmsck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul li.dbmsck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-
-ul ul ul li.dbmsck
-{
-        text-indent: +10px
-	text-align: justify
-}
-
-ul.dbmsplus
-{
-        list-style-image: 
-}
-
-ul.dbmsminus
-{
-        list-style-image: 
-}
-
-
-ul.dbmsck
-{
-}
-
-table.dbms
-{
-}
-
-tr.dbms
-{
-}
-
-td.dbms
-{
-        vertical-align: top
-}
-
-td ul.dbms
-{
-        margin-left: +20px
-}
-
-font.dbmsparamexample
-{
-   color: red
-}
-
-font.dbmsimageexample
-{
-   font-size: smaller
-}
-
-/*the following is used for large-scale development content*/
-
-h1.large
-{
-        font-family: Arial, sans-serif;
-}
-        
-h1.largebanner
-{
-        background: #6a8fbd;
-        text-align: center;
-        font-family: Arial, sans-serif;
-	  font-size: large;
-}
-
-h2.large
-{
-        font-family: Arial, sans-serif;
-}
-        
-h2.largebanner
-{
-        background: #6a8fbd;
-        text-align: center;
-        font-family: Arial, sans-serif;
-}
-
-h3.large
-{
-        font-family: Arial, sans-serif;
-}
-
-h4.large, h5.large, h6.large
-{
-        font-family: Arial, sans-serif;
-        margin-left: 0px
-}
-
-dl.large
-{
-}
-
-dt.large
-{
-}
-      
-dd.large
-{
-}
-
-p.large
-{
-        margin-left: 0px
-}
-
-p.largenode
-{
-        margin-left: 15px
-        leftMargin: 15px
-}
-
-p.largeexampleheading
-{
-        font-family: Arial, sans-serif;
-        font-weight: bold;
-        font-size: 10pt;
-        margin-left: 15px
-}
-
-p.largeexample
-{
-	margin-left: 70px;
-}
-
-p.largepicturetext
-{
-	text-align: center;
-	font-family: sans-serif;
-	font-size: 80%;
-        margin-left: 70px;
-        margin-right: 50px
-}
-
-p.largedefinition
-{
-	background: #ffffcc;
-	border: thin double black
-}
-
-p.largetableheading
-{
-	font-weight: bold;
-        margin-left: 0
-}
-
-p.largetabletext
-{
-        margin-left: 0
-}
-
-p.largeparamname
-{
-   text-align: left
-}
-
-p.largeparamexample
-{
-   text-align: left;
-   color: red
-}
-
-p.largeparamdescription
-{
-   text-align: left
-}
-
-ol.large
-{
-        margin-left: +45px
-}
-
-ol ol.large
-{
-        margin-left: +23px
-}
-
-ol ol ol.large
-{
-        margin-left: +23px
-}
-
-ol.largealpha
-{
-	list-style-type: lower-alpha
-}
-
-
-
-ul li.large
-{
-    text-indent: +20px;
-	text-align: justify
-}
-
-
-ul ul li.large
-{
-    text-indent: +10px;
-	text-align: justify
-}
-
-
-ul ul ul li.large
-{
-    text-indent: +10px;
-	text-align: justify
-}
-
-ul li.largenode
-{
-    text-indent: +10px;
-	text-align: justify
-}
-
-ul li.largeck
-{
-    text-indent: +10px;
-	text-align: justify
-}
-
-
-ul ul li.largeck
-{
-    text-indent: +10px;
-	text-align: justify
-}
-
-
-ul ul ul li.largeck
-{
-    text-indent: +10px;
-	text-align: justify
-}
-
-ul.largeplus
-{
-    list-style-image: 
-}
-
-ul.largeminus
-{
-    list-style-image: 
-}
-
-
-ul.largeck
-{
-}
-
-table.large
-{
-}
-
-tr.large
-{
-}
-
-td.large
-{
-        vertical-align: top
-}
-
-td ul.large
-{
-        margin-left: +20px
-}
-
-font.largeparamexample
-{
-   color: red
-}
-
-font.largeimageexample
-{
-   font-size: smaller
-}
-
-rpw
-{
-  color: #000066
-}
-
-rpw.process_component
-{
-  color: green
-}
-
-rpw.process_component.remove_text
-{
-  color: green;
-  background-color: #CCCCCC;
-  text-decoration: line-through
-}
-/*was color: #FFCC99*/ 
-
-rpw.remove_text
-{
-  color: green;
-  background-color: #CCCCCC;
-  text-decoration: line-through
-}
-
-rpw.plugin_process_component
-{
-  color: red
-}
-
-rpw.plugin_remove_text
-{
-  color: red;
-  background-color: #CCCCCC;
-  text-decoration: line-through
-}
-
-rpw.rpw_comment
-{
-  color: gray;
-  font-style: oblique
-}
-
-
-rpw.msft
-{
-  color: blue
-}
-
-rpw.ibm
-{
-  color: blue
-}
-
-rpw.reactive
-{
-  color: red
-}
-
-rpw.busmod
-{
-  color: red
-}
-
-rpw.rup_rt_design
-{
-  color: green
-}
-
-rpw.rup_db_design
-{
-  color: green
-}
-
-rpw.rup_gui_design
-{
-  color: green
-}
-
-.hottext
-{	
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration:none;
-}
-a.hottext:link 
-{ 
-	color: #000000;
-	text-decoration:none; 
-}
-
-a.hottext:visited 
-{ 
-	color: #000000;
-	text-decoration:none; 
-}
-
-a.hottext:hover 
-{ 
-	color: #000000;
-	text-decoration:none; 
-}
-
-a.hottext:active
-{ 
-	color: #000000;
-	text-decoration:none; 
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/common.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/common.js
deleted file mode 100644
index aacacb5..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/common.js
+++ /dev/null
@@ -1,494 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-var globalLayer = "";
-
-//for popup submenu with red arrows
-var checked = false;
-
-/* Browser sensing */
-/* Set up boolian variables to record the browser type */
-var isNS4 = 0;
-var isIE4 = 0;
-var isNew = 0;
-var docObj, styleObj, currObj, layOn, layOff, dom;
-/* Determines the browser name and browser version */
-var brow = ((navigator.appName) + (parseInt(navigator.appVersion)));
-/* reassign variable depending on the browser */
-
-
-
-//capture event
-NS4 = (document.captureEvents);
-if (NS4) { document.captureEvents(Event.MOUSEDOWN); }
-document.onmousedown = doAccessKeys;	
-
-
-
-if (parseInt(navigator.appVersion >= 5)) {isNew = 1}
-	else if (brow == "Netscape4") 
-	{isNS4 = 1;}
-		else if (brow == "Microsoft Internet Explorer4") 
-		{isIE4 = 1;}
-				
-if (isNS4||isIE4||isNew) {
-	docObj = (isNS4) ? 'document' : 'document.all';
-	styleObj = (isNS4) ? '' : '.style';
-	}
-
-
-
-/////////////////////SNIFFER BEGINS HERE////////////////////////////////////
-var c='.css" />';
-var l='<link rel="stylesheet" type="text/css" href="./stylesheets/';
-
-//Sniffer variables begins
-//converting to lowercase
-var snn = navigator;
-var snpl = snn.platform.toLowerCase(); // not supported in NS3.0
-var snua = ' ' + snn.userAgent.toLowerCase();
-var snun = snn.appName.toLowerCase();
-
-// platform
-var snvpl_mac = snua.indexOf('mac') > 0;
-var snvpl_unix = snua.indexOf("x11") > 0;
-var snvpl_win = snua.indexOf('win') > 0;
-
-// browser version
-var snvv_ie = snua.indexOf('msie') > 0;
-var snvv_nn = snua.indexOf('mozilla') > 0;
-var snvversion = snn.appVersion;
-
-
-// 'compatible' versions of "mozilla" aren't navigator
-if(snua.indexOf('compatible') > 0) {
-	snnvv_nn = false;
-}
-//Ends sniffer variables 
-	
-		
-/* This is a basic sniffer */
-  
-if(snvpl_win)//windows
-
-{  
-  if(snvv_ie)    
-  {
-    if (snua.indexOf('ie 5')!=-1)document.write(l+'common_base'+c);
-    else if(snua.indexOf('ie 5.5')!=-1)document.write(l+'common_base'+c);
-    else if(snua.indexOf('ie 6')!=-1)document.write(l+'common_adv'+c);
-    else
-	  {
-	    document.write(l+'common_adv'+c);
-	  }
-  }
-  else if (snvv_nn) 
-  {
-  
-  if (snua.indexOf("/4")!=-1)document.write(l+'common_base'+c);
-  else if(snua.indexOf("/5")!=-1)document.write(l+'common_adv'+c);
-  else if(snua.indexOf("/6")!=-1)document.write(l+'common_adv'+c);
-  else
-	  {
-	   document.write(l+'common_adv'+c);
-	  }
-  }
-  else
-  {
-   document.write(l+'common_adv'+c);
-  }
-}
-else if(snvpl_unix)//unix
-  {  
-  if(snvv_ie)    
-  {
-    if (snua.indexOf('ie 5')!=-1)document.write(l+'common_baseUNX'+c);
-    else if(snua.indexOf('ie 5.5')!=-1)document.write(l+'common_baseUNX'+c);
-    else if(snua.indexOf('ie 6')!=-1)document.write(l+'common_advUNX'+c);
-    else
-	  {
-	  document.write(l+'common_adv'+c);
-	  }
-  }
-
-  else if (snvv_nn) 
-  {
-  if (snua.indexOf("/4")!=-1)document.write(l+'common_baseUNX'+c);
-  else if(snua.indexOf("/5")!=-1)document.write(l+'common_advUNX'+c);
-  else if(snua.indexOf("/6")!=-1)document.write(l+'common_advUNX'+c);
-  else
-	  {
-	  document.write(l+'common_advUNX'+c);
-	  }
-  } 
-  else
-  {
-  document.write(l+'common_advUNX'+c);
-  }
-}
-
-else if(snvpl_mac)//mac
-  {  
-  if(snvv_ie)    
-  {
-    if (snua.indexOf('ie 5')!=-1)document.write(l+'common_base'+c);
-    else if(snua.indexOf('ie 5.5')!=-1)document.write(l+'common_base'+c);
-    else if(snua.indexOf('ie 6')!=-1)document.write(l+'common_adv'+c);
-    else
-	  {
-	   document.write(l+'common_adv'+c);
-	  }
-  }
-
-  else if (snvv_nn) 
-  {
-  if (snua.indexOf("/4")!=-1)document.write(l+'common_base'+c);
-  else if(snua.indexOf("/6")!=-1)document.write(l+'common_advMac'+c);
-  else
-	  {
-	   document.write(l+'common_adv'+c);
-	  }
-  } 
-  else
-  {
- document.write(l+'common_adv'+c);
-  }
-}
-
-else//others 
-{
-  document.write(l+'common_adv'+c);
-
-}
-
-//SNIFFER ENDS HERE
-
-
-function ns_reload(init) {  //reloads the window if Nav4 resized
-  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
-    document.NSW=innerWidth; document.NSH=innerHeight; onresize=ns_reload; }}
-  else if (innerWidth!=document.NSW || innerHeight!=document.NSH) location.reload();
-}
-ns_reload(true);
-
-
-
-
-
-///////////////////////SNIFFER ENDS HERE//////////////////////////////
-
-
-//loop to change background color for ie
-function bcolor(bcol,d_name)
-{
-if (document.all)
-{
- var thestyle= eval ('document.all.'+d_name+'.style');
- thestyle.backgroundColor=bcol;
- }
-}
-
-// new page to load in frame
-function changeframe(url) {
-top.checkinbottom.location.href= url 
-}
-
-// checked all checkboxes
-function checkAll(field) {
-     if (!checked) { // if checkboxes are not checked then check them
-          for (i = 0; i < field.length; i++) { // loop through the array of checkboxes & check them
-               field[i].checked = true;
-          }
-          checked = true;
-     }
-} 
-
-function checkedIn(id) {
-  if (document.all) {
-    return document.all[id].style;
-  } else if(document.layers) {
-    return document.layers[id];
-  }
-}
-
-// For IE Only: to enable linking before pop-ups dissappear when clicked.
-function disablecapture() {
-document.onmousedown = null;
-}
-
-
-// hide layers when clicked
-function doAccessKeys(ev) {
-	if(globalLayer != "") {
-		if(document.layers) { document.layers[globalLayer].visibility = "hidden"; }	
-		else { document.all[globalLayer].style.visibility = "hidden"; }
-	}
-}
-
-
-
-//allows two bottom frames to link to new pages at the same time
-function framedirect() {
-page = document.formTopframe.newLocation.options[document.formTopframe.newLocation.selectedIndex].value;
-tempIndex = page.indexOf('?');
-firstURL = page.substring(0,tempIndex);
-secondURL = page.substring(tempIndex + 1,page.length);
-
-top.treeFrame.location.href = firstURL;
-top.viewFrame.location.href = secondURL;
-}
-
-
-function MM_reloadPage(init) {  //reloads the window if Nav4 resized
-  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
-    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
-  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
-}
-MM_reloadPage(true);
-
-
-function MM_findObj(n, d) { //v4.01
-  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
-    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
-  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
-  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
-  if(!x && d.getElementById) x=d.getElementById(n); return x;
-}
-
-function MM_goToURL() { //v3.0
-  var i, args=MM_goToURL.arguments; document.MM_returnValue = false;
-  for (i=0; i<(args.length-1); i+=2) eval(args[i]+".location='"+args[i+1]+"'");
-}
-
-
-function MM_preloadImages() { //v3.0
-  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
-    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
-    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
-}
-
-
-function MM_swapImage() { //v3.0
-  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
-   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
-}
-
-
-function MM_openBrWindow(theURL,winName,features) { //v2.0
-  window.open(theURL,winName,features);
-}
-
-
-
-function MM_showHideLayers() { //v3.0
-  var i,p,v,obj,args=MM_showHideLayers.arguments;
-  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
-    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
-    obj.visibility=v; }
-}
-
-
-function mschangeframe(url) {
-top.contentFrame.location.href= url 
-}
-
-//changes middle nav and content frame, currently used in multisite
-function MSframeChange() {
-page = document.formBannerFrame.newLocation.options[document.formBannerFrame.newLocation.selectedIndex].value;
-tempIndex = page.indexOf('?');
-firstURL = page.substring(0,tempIndex);
-secondURL = page.substring(tempIndex + 1,page.length);
-
-top.middleNav.location.href = firstURL;
-top.contentFrame.location.href = secondURL;
-}
-
-
-
-//opens up a dynamic window
-function open_help(helpfile) {
-    var winleft, wintop;
-    var helpleft, helptop;
-    var helpwidth, helpheight;
-    if (document.layers) {
-        winleft = top.screenX;
-        wintop = top.screenY;
-    }
-    else {
-        winleft = top.screenLeft;
-        wintop = top.screenTop;
-    }
-    helpwidth = Math.min(screen.availWidth);
-    helpheight = Math.min(screen.availHeight);
- 	helpwidth=helpwidth *.6;
-	helpheight=helpheight *.85;	
-	helptop = 0;
-    if (winleft > 20)
-        helpleft = 0;
-    else
-        helpleft = screen.width - helpwidth - 10;
-    top.open(helpfile, 'ccweb_help',
-             'left='+helpleft+',top='+helptop+',width='+helpwidth+',height='+helpheight+',resizable=1,scrollbars=1');
-}
-
-
-
-// regular popup up layer according to event
-function popLeftMenu(evt,currElem,upChk){
-	// checks to see if this is a DHTML browser 
-	// and that currElem is not set to 0 in which case 
-	// this was triggered by the HREF and cannot be treated as an event
-	//upChk should be set to 1 for NS 4 form fix if you want the popdown to pop up instead, so that it doesn't appear over forms.	
-	globalLayer = currElem;
-	
-	if ((isNS4 && currElem != 0) || (isIE4 && currElem != 0)){
-		dom = eval(docObj +  '.' + currElem + styleObj);
-		state = dom.visibility;
-		if (state == "visible" || state == "show")
-			{dom.visibility = "hidden";}
-			else 
-			// finds the position of the mouse 
-			// and then offsets the coordinates slightly
-				{
-		if (isNS4){
-				 if ((upChk == 1) && (window.innerWidth < 670)) {
-			topVal = eval(evt.pageY - 50);
-			leftVal = eval(evt.pageX - 9);
-			}				  
-				else {
-				topVal = eval(evt.pageY - 0);
-				leftVal = eval(evt.pageX - 0);
-				}
-		}		
-			else if (isIE4) {
-				{
-				topVal = eval(event.y+document.body.scrollTop - 0);
-				leftVal = eval(event.x+document.body.scrollLeft - 0);
-				//bottomVal = eval(event.y+document.body.scrollBottom + 2);
-				}
-			    }
-			// keeps the element from going off screen to the left
-			if(leftVal < 2) {leftVal = 2;}
-			if(topVal < 2) {topVal = -5;}				
-			dom.top = topVal;
-			dom.left = leftVal;
-			dom.visibility = "visible";					
-				}
-	} 
-
-}
-
-
-
-// special pupup layer to keep it from going off the page
-
-function popLeftMenuSpecial(evt,currElem){
-	// checks to see if this is a DHTML browser 
-	// and that currElem is not set to 0 in which case 
-	// this was triggered by the HREF and cannot be treated as an event
-	//upChk should be set to 1 for NS 4 form fix if you want the popdown to pop up instead, so that it doesn't appear over forms.	
-	globalLayer = currElem;
-	
-	if ((isNS4 && currElem != 0) || (isIE4 && currElem != 0)){
-		dom = eval(docObj +  '.' + currElem + styleObj);
-		state = dom.visibility;
-		if (state == "visible" || state == "show")
-			{dom.visibility = "hidden";}
-			else 
-			// finds the position of the mouse 
-			// and then offsets the coordinates slightly
-				{
-		if (isNS4){
-			 if (window.innerWidth < 600) {
-			topVal = eval(evt.pageY - 0);
-			leftVal = eval(evt.pageX - 110);
-			}		
-				
-				else {
-				topVal = eval(evt.pageY - 0);
-				leftVal = eval(evt.pageX - 0);
-				}
-		}		
-			else if (isIE4) {
-				if (document.body.clientWidth < 600) {
-				  topVal = eval(event.y+document.body.scrollTop - 0);
-				leftVal = eval(event.x+document.body.scrollLeft - 110);
-				}
-				
-				else{
-				topVal = eval(event.y+document.body.scrollTop - 0);
-				leftVal = eval(event.x+document.body.scrollLeft - 0);
-				//bottomVal = eval(event.y+document.body.scrollBottom + 2);
-				}
-			    }
-			// keeps the element from going off screen to the left
-			if(leftVal < 2) {leftVal = 2;}
-			if(topVal < 2) {topVal = -5;}				
-			dom.top = topVal;
-			dom.left = leftVal;
-			dom.visibility = "visible";					
-				}
-	} 
-		
-}
-
-
-
-
-function searchOptions(newLoc) { //Opens new page in the right frame depending on the "Advanced Search for:" selection
-			newPage = newLoc.options[newLoc.selectedIndex].value
-	
-			if (newPage != "") {
-				parent.viewFrame.location.href = newPage
-			}
-		}
-
-
-//uncheck checkboxes
-function uncheckAll(field) {
-     if (checked) { // if checkboxes are checked then check them
-          for (i = 0; i < field.length; i++) { // loop through the array of checkboxes & uncheck them
-               field[i].checked = false;
-          }
-          checked = false;
-     }
-} 
-
-// show hide layers for CQ deflect_login_err
-ns4 = (document.layers)? true:false
-ie4 = (document.all)? true:false
-
-function show(id) {
-if (ns4) document.layers[id].visibility = "show"
-if (ie4) document.all[id].style.visibility = "visible"
-}
-
-function hide(id) {
-if (ns4) document.layers[id].visibility = "hide"
-if (ie4) document.all[id].style.visibility = "hidden"
-}
-
-// pop up window according to mouse event
-function showWindow(e,url) {
-    var x=y=0;
-	
-	if (e != '') {
-        x = e.screenX;
-        y = e.screenY;
-    }
-
-    myWindow=window.open(url,'windowName','width=200,height=150,screenX=' + x + ',screenY=' + y + ',left=' + x + ',top=' + y);
-}
-
-
-
-
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/scripts.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/scripts.js
deleted file mode 100644
index 786ed38..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/scripts.js
+++ /dev/null
@@ -1,134 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-var c='.css" />';
-var l='<link rel="stylesheet" type="text/css" href=\"./stylesheets/';
-
-//Sniffer variables begins
-//converting to lowercase
-var snn = navigator;
-var snpl = snn.platform.toLowerCase(); // not supported in NS3.0
-var snua = ' ' + snn.userAgent.toLowerCase();
-var snun = snn.appName.toLowerCase();
-
-// platform
-var snvpl_mac = snua.indexOf('mac') > 0;
-var snvpl_unix = snua.indexOf("x11") > 0;
-var snvpl_win = snua.indexOf('win') > 0;
-
-// browser version
-var snvv_ie = snua.indexOf('msie') > 0;
-var snvv_nn = snua.indexOf('mozilla') > 0;
-var snvversion = snn.appVersion;
-
-
-// 'compatible' versions of "mozilla" aren't navigator
-if(snua.indexOf('compatible') > 0) {
-	snnvv_nn = false;
-}
-//Ends sniffer variables 
-	
-		
-/* This is a basic sniffer */
-  
-if(snvpl_win)//windows
-
-{  
-  if(snvv_ie)    
-  {
-    if (snua.indexOf('ie 5')!=-1)document.write(l+'design'+c);
-    else if(snua.indexOf('ie 5.5')!=-1)document.write(l+'design'+c);
-    else if(snua.indexOf('ie 6')!=-1)document.write(l+'design'+c);
-    else
-	  {
-	   document.write(l+'design'+c);
-	  }
-  }
-  else if (snvv_nn) 
-  {
-  
-  if (snua.indexOf("/4")!=-1)document.write(l+'design_ns'+c);
-  else if(snua.indexOf("/5")!=-1)document.write(l+'design_ns'+c);
-  else if(snua.indexOf("/6")!=-1)document.write(l+'design_ns'+c);
-  else
-	  {
-	   document.write(l+'design_ns'+c);
-	  }
-  }
-  else
-  {
-   document.write(l+'design'+c);
-  }
-}
-else if(snvpl_unix)//unix
-  {  
-  if(snvv_ie)    
-  {
-    if (snua.indexOf('ie 5')!=-1)document.write(l+'design'+c);
-    else if(snua.indexOf('ie 5.5')!=-1)document.write(l+'design'+c);
-    else if(snua.indexOf('ie 6')!=-1)document.write(l+'design'+c);
-    else
-	  {
-	  document.write(l+'design'+c);
-	  }
-  }
-
-  else if (snvv_nn) 
-  {
-  if (snua.indexOf("/4")!=-1)document.write(l+'design_ns'+c);
-  else if(snua.indexOf("/5")!=-1)document.write(l+'design_ns'+c);
-  else if(snua.indexOf("/6")!=-1)document.write(l+'design_ns'+c);
-  else
-	  {
-	  document.write(l+'design_ns'+c);
-	  }
-  } 
-  else
-  {
-  document.write(l+'design_ns'+c);
-  }
-}
-
-else if(snvpl_mac)//mac
-  {  
-  if(snvv_ie)    
-  {
-    if (snua.indexOf('ie 5')!=-1)document.write(l+'design'+c);
-    else if(snua.indexOf('ie 5.5')!=-1)document.write(l+'design'+c);
-    else if(snua.indexOf('ie 6')!=-1)document.write(l+'design'+c);
-    else
-	  {
-	   document.write(l+'design'+c);
-	  }
-  }
-
-  else if (snvv_nn) 
-  {
-  if (snua.indexOf("/4")!=-1)document.write(l+'design_ns'+c);
-  else if(snua.indexOf("/6")!=-1)document.write(l+'design_ns'+c);
-  else
-	  {
-	   document.write(l+'design_ns'+c);
-	  }
-  } 
-  else
-  {
- document.write(l+'design_ns'+c);
-  }
-}
-
-else//others 
-{
-  document.write(l+'design_ns'+c);
-
-}
-
-//SNIFFER ENDS HERE
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/scripts_unixFrame.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/scripts_unixFrame.js
deleted file mode 100644
index 4c40767..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/scripts_unixFrame.js
+++ /dev/null
@@ -1,12 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-if(snnvv_nn && snvpl_unix) {	  window.location = "unix_frames.html"	}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/topnav.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/topnav.js
deleted file mode 100644
index 6a132a4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/topnav.js
+++ /dev/null
@@ -1,809 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-// messages to be externized
-// here defines all the I18N specific messages used in the javascripts
-
-var topnav_js_MESSAGE1 = "The TreeBrowse is not yet loaded!\nPlease wait!";
-var topnav_js_MESSAGE2 = "There is no '{0}' page for this page.\nTry one of the other navigation buttons.";
-var topnav_js_MESSAGE3 = "There is no {0} page!";
-var topnav_js_MESSAGE_prev = "previous";
-var topnav_js_MESSAGE_next = "next";
-var topnav_js_MESSAGE_up = "up";
-var topnav_js_MESSAGE4 = "The current file is not in the tree browser.";
-var topnav_js_MESSAGE5 = "The published site is already displayed using frames";
-
-function formatString(message, replace0)
-{
-   	return message.replace(/\{0\}/, replace0);
-} 
-
-// this script is for the topnav.html
-// this is NOT for general use
-MSFPhover =
-(((navigator.appName == "Netscape") &&
-  (parseInt(navigator.appVersion) >= 3 )) ||
-  ((navigator.appName == "Microsoft Internet Explorer") &&
-  (parseInt(navigator.appVersion) >= 4 )));
-
-  function MSFPpreload(img)
-  {
-     var a=new Image();
-     a.src=img;
-     return a;
-  }
-  
-var tour = 0;
-
-function openFirstTour ()
-// open the guided tour /haakan 990324
-{
-if(!tour || tour==null || tour.closed)
-    {
-      tour = open("./tour/tour.htm","tour_page","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=350,height=700,resizable=yes");
-      tour.focus();
-    }
-    else
-    {
-      tour.focus();
-    }
-}
-
-function openTour ()
-// open the guided tour /haakan 990324
-{
-if(!tour || tour==null || tour.closed)
-    {
-      tour = open("./tour/tour.htm","tour_page","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=350,height=700,resizable=yes");
-      tour.focus();
-    }
-    else
-    {
-      tour.focus();
-    }
-}
-
-//Addition by Chinh Vo 03/28/00
- function displayGettingStarted()
- {
- 	var pagePattern = /ovu_proc/;
- 	var mainPage = window.parent.ory_doc.location;
-
- 	if ( pagePattern.test( mainPage ) ) {
-    	if (getCookie("RUP") != "checked") { openFirstTour(); }
-	}
-	else {
-		setTimeout( "displayGettingStarted()", 1000 );
-	}
-}
-
-function getCookie (name)
-{
-  var dcookie = document.cookie;
-  var cname = name + "=";
-  var clen = dcookie.length;
-  var cbegin = 0;
-  while (cbegin < clen)
-  {
-    var vbegin = cbegin + cname.length;
-    if (dcookie.substring(cbegin, vbegin) == cname)
-    {
-      var vend = dcookie.indexOf (";", vbegin);
-      if (vend == -1)
-      {
-        vend = clen;
-      }
-      return unescape(dcookie.substring(vbegin, vend));
-    }
-    cbegin = dcookie.indexOf(" ", cbegin) + 1;
-    if (cbegin == 0)
-    {
-      break;
-    }
-  }
-  return null;
- }
-
-
-  var index=null;
-  var tour=null;
-  var search=null;
-  var glossary=null;
-  var feedback=null;
-  var treeLoaded=false;
-  function checkTreeLoaded()
-  {
-    if(treeLoaded)
-    {
-      return treeLoaded;
-    }
-
-    /*
-     if(parent.ory_toc.document.RupPresenterApplet != null
-        && parent.ory_toc.document.RupPresenterApplet.isReady())
-     {
-       treeLoaded = true;
-     }
-     */
-     if(parent.ory_toc.document.RupPresenterApplet != null)
-     {
-      	var method = typeof parent.ory_toc.document.RupPresenterApplet.isReady;
-	 if (method != "undefined") {
-		if (parent.ory_toc.document.RupPresenterApplet.isReady())
-		{
-       			treeLoaded = true;
-		}
-
-	  }
-
-     }
-
-     return treeLoaded;
-   }
-
-
-    function showAlertNotLoaded()
-    {
-      alert(topnav_js_MESSAGE1);
-    }
-
-function showStatusNotLoaded()
-  {
-    //return "The TreeBrowse is not yet loaded!\nPlease wait!";
-    return topnav_js_MESSAGE1;
-  }
-
-  function showAlertNoPage(text)
-  {
-     var parentLabel = parent.ory_toc.document.applets.Tree.getParentLabel(parent.ory_doc.document.URL);
-     if(parentLabel!="" && parentLabel!=null)
-     {
-          //alert("There is no '" + text + "' page for this page.\nTry one of the other navigation buttons.");
-          alert(formatString(topnav_js_MESSAGE2, text));
-     }
-     else
-     {
-         //alert("There is no '" + text + "' page for this page.\nTry one of the other navigation buttons");
-         alert(formatString(topnav_js_MESSAGE2, text));
-     }
-  }
-
-  function showStatusNoPage(text)
-  {
-
-     var parentLabel = parent.ory_toc.document.applets.Tree.getParentLabel(parent.ory_doc.document.URL);
-     var msg;
-     if(parentLabel!="" && parentLabel!=null)
-     {
-        //msg = "There is no " + text + " page!";
-        msg = formatString(topnav_js_MESSAGE3, text);
-     }
-     else
-     {
-        //msg = "There is no " + text + " page!";
-        msg = formatString(topnav_js_MESSAGE3, text);
-     }
-
-     return msg;
-  }
-
-  function showParentLabel()
-  {
-    if(checkTreeLoaded())
-    {
-      var label = parent.ory_toc.document.applets.Tree.getParentLabel(parent.ory_doc.document.URL);
-      var parenturl = parent.ory_toc.document.applets.Tree.getParentUrl(parent.ory_doc.document.URL);
-
-     if(label!="" && label!=null && parenturl!="" && parenturl!=null)
-     {
-       self.status = label;
-     }
-     else
-     {
-       self.status = showStatusNoPage("up");
-     }
-    }
-    else
-    {
-        self.status = showStatusNotLoaded();
-    }
-  }
-
-  function showHomeLabel()
-  {
-    self.status = "Home";
-  }
-
-  function showPreviousLabel()
-  {
-    if(checkTreeLoaded())
-    {
-      var label = parent.ory_toc.document.applets.Tree.getPreviousLabel(parent.ory_doc.document.URL);
-      var prevurl = parent.ory_toc.document.applets.Tree.getPreviousUrl(parent.ory_doc.document.URL);
-
-     if(label!="" && label!=null && prevurl!="" && prevurl!=null)
-     {
-       self.status = label;
-     }
-     else
-     {
-        self.status = showStatusNoPage("previous");
-     }
-    }
-    else
-    {
-        self.status = showStatusNotLoaded();
-    }
-  }
-
-  function showNextLabel()
-  {
-    if(checkTreeLoaded())
-    {
-      var label = parent.ory_toc.document.applets.Tree.getNextLabel(parent.ory_doc.document.URL);
-      var nexturl = parent.ory_toc.document.applets.Tree.getNextUrl(parent.ory_doc.document.URL);
-      if(label!="" && label!=null && nexturl!="" && nexturl!=null)
-      {
-        self.status = label;
-      }
-      else
-      {
-        self.status =  showStatusNoPage("next");
-      }
-    }
-    else
-    {
-       self.status =  showStatusNotLoaded();
-    }
-  }
-
-  function loadPrevious()
-  {
-    if(checkTreeLoaded())
-    {
-     var newLabel = parent.ory_toc.document.applets.Tree.getPreviousLabel(parent.ory_doc.document.URL);
-     var newLocation = parent.ory_toc.document.applets.Tree.getPreviousUrl(parent.ory_doc.document.URL);
-
-     if(newLocation!="" && newLocation!=null)
-     {
-
-	if ((newLocation.indexOf("applet")==-1) && (newLocation.indexOf("www")==-1))
-	{
-		parent.ory_doc.location = newLocation;
-	}
-	else if (newLocation.indexOf("applet")!=-1)
-	{
-	 	parent.ory_toc.document.applets.Tree.getAppletPage(newLocation, newLabel);
-	}
-	else if (newLocation.indexOf("www")!=-1)
-	{
-		newLocation = parent.ory_toc.document.applets.Tree.getHttpPage(newLocation, newLabel, "Previous");
-	}
-	      	parent.ory_toc.document.applets.Tree.selectNode(newLocation);
-     }
-     else
-     {
-       showAlertNoPage(topnav_js_MESSAGE_prev);
-     }
-     }
-    else
-    {
-        showAlertNotLoaded();
-    }
-     return;
-  }
-
-  function loadNext()
-  {
-    if(checkTreeLoaded())
-    {
-     var newLabel = parent.ory_toc.document.applets.Tree.getNextLabel(parent.ory_doc.document.URL);
-     var newLocation = parent.ory_toc.document.applets.Tree.getNextUrl(parent.ory_doc.document.URL);
-     if(newLocation!="" && newLocation!=null)
-     {
-
-	if ((newLocation.indexOf("applet")==-1) && (newLocation.indexOf("www")==-1))
-	{
-		parent.ory_doc.location = newLocation;
-	}
-	else if (newLocation.indexOf("applet")!=-1)
-	{
-	 	parent.ory_toc.document.applets.Tree.getAppletPage(newLocation, newLabel);
-	}
-	else if (newLocation.indexOf("www")!=-1)
-	{
-		newLocation = parent.ory_toc.document.applets.Tree.getHttpPage(newLocation, newLabel, "Next");
-	}
-       parent.ory_toc.document.applets.Tree.selectNode(newLocation);
-
-     }
-     else
-     {
-        showAlertNoPage(topnav_js_MESSAGE_next);
-     }
-    }
-    else
-    {
-      showAlertNotLoaded();
-    }
-
-     return;
-  }
-
-  function loadParent()
-  {
-    if(checkTreeLoaded())
-    {
-     var newLocation = parent.ory_toc.document.applets.Tree.getParentUrl(parent.ory_doc.document.URL);
-     if(newLocation!="" && newLocation!=null)
-     {
-       parent.ory_doc.location = newLocation;
-       parent.ory_toc.document.applets.Tree.selectNode(newLocation);
-     }
-     else
-     {
-       showAlertNoPage(topnav_js_MESSAGE_up);
-     }
-    }
-    else
-    {
-       showAlertNotLoaded();
-    }
-
-     return;
-  }
-
-function whereAmI()
-  {
-    if(checkTreeLoaded())
-    {
-	var status = parent.ory_toc.document.applets.Tree.selectNode(parent.ory_doc.document.URL);
-    	if( status == false )
-	{
-		alert( topnav_js_MESSAGE4 );
-	}
-    }
-    else
-    {
-      showAlertNotLoaded();
-    }
-     return;
-  }
-
-  function upArrow()
-  {
-    if(checkTreeLoaded())
-    {
-      var newLocation = parent.ory_toc.document.applets.Tree.upArrow();
-      if(newLocation!="" && newLocation!=null)
-      {
-       parent.ory_doc.location = newLocation;
-      }
-    }
-    else
-    {
-      showAlertNotLoaded();
-    }
-     return;
-  }
-
-  function downArrow()
-  {
-    if(checkTreeLoaded())
-    {
-      var newLocation = parent.ory_toc.document.applets.Tree.downArrow();
-      if(newLocation!="" && newLocation!=null)
-      {
-       parent.ory_doc.location = newLocation;
-      }
-
-    }
-    else
-    {
-      showAlertNotLoaded();
-    }
-     return;
-  }
-
-    function leftArrow()
-  {
-    if(checkTreeLoaded())
-    {
-     parent.ory_toc.document.applets.Tree.leftArrow();
-    }
-    else
-    {
-      showAlertNotLoaded();
-    }
-     return;
-  }
-
-    function rightArrow()
-  {
-    if(checkTreeLoaded())
-    {
-     parent.ory_toc.document.applets.Tree.rightArrow();
-    }
-    else
-    {
-      showAlertNotLoaded();
-    }
-     return;
-  }
-
-
-function loadTop()
-{
-  if(parent.frames.length!=0 && parent.frames[1].name=="ory_toc")
-  {
-     alert(topnav_js_MESSAGE5);
-  }
-  else
-  {
-    var expires = new Date();
-    expires.setTime (expires.getTime() + (1000 * 20));
-    document.cookie = "rup_ory_doc=" + escape (document.URL) +
-    "; expires=" + expires.toUTCString() +  "; path=/";
-
-    var new_ory_doc_loc = null;
-
-    for(i=document.links.length-1;i>=0;i--)
-    {
-       if(document.links[i].href.indexOf("index.htm")!=-1)
-       {
-         new_ory_doc_loc = document.links[i].href;
-         break;
-       }
-    }
-
-    if(new_ory_doc_loc!=null)
-    {
-	if( self.name == "ory_doc" )
-	{
-		window.close();
-		window.open( new_ory_doc_loc );
-	}
-	else
-	{
-	       	top.location = new_ory_doc_loc;
-	}
-    }
-   }
-}
-
-
-function openOry (page, target)
-{
-    if(!index || index.closed)
-    {
-      index = open(page,target,"toolbar=no,directories=no,menubar=no,scrollbars=yes,width=395,height=500,resizable=yes");
-    }
-    else
-    {
-      index.focus();
-    }
-}
-
-function openSearch()
-{
-    if(!search || search.closed)
-    {
-      search = open("./applet/search.htm","search_page","toolbar=no,directories=no,menubar=no,scrollbars=no,width=630,height=450,resizable=yes");
-    }
-    else
-    {
-      search.focus();
-    }
-}
-
-function openProcessSearch()
-{
-    if(!search || search.closed)
-    {
-      search = open("./search/search.html","search_page","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=630,height=450,resizable=yes");
-    }
-    else
-    {
-      search.focus();
-    }
-   
-}
-
-function getBaseUrl() {
-
-    // get the url base for the search url
-	var url = location.href;
-	var i = url.lastIndexOf("/");
-	url = url.substring(0, i);
-	
-	return url;
-}
-
-function openIndex()
-{
-   openOry("./index/index.htm","index_win");
-}
-
-function openGlossary()
-{
- if(!glossary || glossary.closed)
-    {
-      glossary = open("./process/glossary/index.htm","glossary_win","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=385,height=500,resizable=yes");
-    }
-    else
-    {
-      glossary.focus();
-    }
-}
-
-function printPage()
-{
- parent.ory_doc.focus();
- parent.ory_doc.print();
-}
-
-
-function sendFeedback(url)
-{
-	if ( url == null || url == '' )
-	{
-		return;
-	}
-	
-	if ( url.indexOf("mailto:") >= 0 )
-	{
-		sendmail(url);
-	}
-	else
-	{
-		
- 	    if(!feedback || feedback.closed)
-	    {
-	      feedback = open(url,"feedback_win","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=600,height=500,resizable=yes");
-	    }
-	    else
-	    {
-	      feedback.focus();
-	    }
-    	}
-    	
-}
-
-
-function sendmail(url)
-{
-	if ( url.indexOf("?subject") == -1 )
-	{
-		var link=parent.ory_doc.location;
-		url = url + '?subject=Feedback: - '+link;
-	}
-	location.replace(url);
-}
-
-//calculates relative path
-//path must be all relative from website base or contain full urls
-function calculateRelativePath(sourcePath, targetPath)
-{
-	if (targetPath.indexOf("http:/") != -1)
-	{
-		return targetPath;
-	}
-
-	//replace all '\' with '/'
-	sourcePath = sourcePath.replace(/\\/g,"$1/$2");
-	targetPath = targetPath.replace(/\\/g,"/");
-
-	//alert("Replace(Source)=>" + sourcePath);
-	//alert("Replace(target)=>" + targetPath);
-
-
-	sourceArray = sourcePath.split("/");
-	targetArray = targetPath.split("/");
-
-	var theRelPath = "";
-
-	//loop until we find a difference
-	var idx = 0;
-	for(idx = 0; idx < sourceArray.length; idx++)
-	{
-		if (idx > targetPath.length)
-		{
-			break;
-		}
-
-		if (sourceArray[idx] != targetArray[idx])
-		{
-			break;
-		}
-	}
-
-	//append the appropriate number of ./
-	var maxIdx = sourceArray.length - 1;
-	for (var i = idx; i < maxIdx; i++)
-	{
-		theRelPath = theRelPath + "./";
-
-		//alert("RelPath=>" + theRelPath);
-	}
-
-	//append any remaining target path
-	while(idx < targetArray.length)
-	{
-		theRelPath = theRelPath + targetArray[idx++] + "/";
-		//alert("RelPath(final)=>" + theRelPath);
-	}
-
-	//remove the last path separator
-	if (theRelPath.length > 0)
-	{
-		//alert("RelPath(Trim1)=>" + theRelPath);
-		theRelPath = theRelPath.substring(0, (theRelPath.length - 1));
-		//alert("RelPath(Trim1)=>" + theRelPath);
-	}
-
-	//alert("Return Relative Path => " + theRelPath);
-
-	return theRelPath;
-}
-
-function getTreePath()
-{
-	return buildTreePathLocation();
-}
-
-//This method will remove the website base from the url
-function calculatCurrentPage(currURL) {
-
-	var theCurrentLocation = document.location.href;
-	//replace all '\' with '/'
-	theCurrentLocation = theCurrentLocation.replace(/\\/g,"$1/$2");
-	currURL = currURL.replace(/\\/g,"$1/$2");
-
-	var sourceArray = theCurrentLocation.split("/");
-	var currArray = currURL.split("/");
-
-	var numToRemove = sourceArray.length - 2;
-	var idx = 0;
-	var theReturnPath = "";
-	for (idx = numToRemove; idx < currArray.length; idx++) {
-		if (theReturnPath != "") {
-			theReturnPath = theReturnPath + "/";
-		}
-		theReturnPath = theReturnPath + currArray[idx];
-	}
-
-	//alert("ArrayTest=>" + currURL + "," + theReturnPath);
-	return theReturnPath;
-}
-
-//builds tree path
-function buildTreePathLocation()
-{
-	var theDelimiter = "##*";
-	var thisPage = "applet/rup_topnav.htm";
-	var theLoc = "";
-
-
-
-	if(checkTreeLoaded())
-	{
-		var theCurrentLocation = parent.ory_doc.document.location.href;
-		thisPage = calculatCurrentPage(theCurrentLocation);
-
-		//alert("PathName:" + thisPage);
-
-		//alert("Trying to find the path for =>" + theCurrentLocation);
-
-		var thePath = parent.ory_toc.document.RupPresenterApplet.getTreePathArray(theCurrentLocation);
-
-		//alert("The Tree Path: " + thePath);
-
-		thePathString = thePath + "";
-    		arrayFromString = thePathString.split(theDelimiter);
-
-		//build the path from the array
-		//param 1 = path to icon, param 2 - label, param 3 - path to file
-		var counter = 0;
-		var theLabel;
-		var theRelPath;
-		if (arrayFromString.length > 2)
-		{
-		   theLoc = "";
-		   for(var i = 0; i < (arrayFromString.length - 1) ; i++)
-		   {
-			//it's the icon path
-			if (counter < 2)
-			{
-				if (counter > 0)
-				{
-					theLoc = theLoc + " &gt; ";
-				}
-
-				//alert("Calculating path from(1) " + thisPage + " => " + arrayFromString[i]);
-
-				if (arrayFromString[i].indexOf("\\") == -1 && arrayFromString[i].indexOf("/") == -1)
-				{
-					if (arrayFromString[i] != "null")
-					{
-						theRelPath = "applet/images/" + arrayFromString[i];
-						theRelPath = calculateRelativePath(thisPage, theRelPath);
-					}
-					//alert("Modifying Path => " + theRelPath);
-				}
-				else {
-					theRelPath = calculateRelativePath(thisPage, arrayFromString[i]);
-				}
-
-				if (theRelPath != "null")
-				{
-					theLoc = theLoc +
-						 "<img border=0 src=\"" +
-						 theRelPath  +
-						 "\">";
-				}
-
-				//alert("the curr path=>" + theLoc);
-				counter = 2;
-			}
-			// it's the label
-			else if (counter == 2)
-			{
-				theLabel = arrayFromString[i];
-				counter = 3;
-			}
-			else if (counter == 3)
-			{
-				//alert("Calculating path from(3) " + thisPage + " => " + arrayFromString[i]);
-				if (arrayFromString[i] != "null")
-				{
-					theRelPath = calculateRelativePath(thisPage, arrayFromString[i]);
-					if (theRelPath != "") {
-						theLoc = theLoc +
-					 		"<a class=\"hottext\" target=\"ory_doc\" href=\"" +
-							 theRelPath +
-					 		"\">" +
-					 		theLabel +
-					 		"<\/a>\n";
-					 }
-					 else {
-					 	theLoc = theLoc +
-					 		"<a class=\"hottext\">"  +
-					 		theLabel +
-					 		"<\/a>\n";
-					 }
-				}
-				else
-				{
-					theLoc = theLoc +
-					 	"<a class=\"hottext\">"  +
-					 	theLabel +
-					 	"<\/a>\n";
-				}
-				//alert("the curr path=>" + theLoc);
-				counter = 1;
-				theRelPath = "null";
-				theLabel = "null";
-			}
-		   }
-
-		//alert("Finished Building => " + theLoc);
-		}
-
-	}
-
-	//theLoc = "Current Location&nbsp;&#045;&nbsp;" + theLoc;
-
-	//alert("the Final String=>" + theLoc);
-
-	//document.write(theLoc);
-	return theLoc;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/treebrowser.js b/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/treebrowser.js
deleted file mode 100644
index 66246ee..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/scripts/treebrowser.js
+++ /dev/null
@@ -1,95 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-// Here defines all the I18N specific messages used in the javascripts
-var treebrowser_js_MESSAGE1 = "The configuration is already displayed using views";
-var treebrowser_js_MESSAGE2 = "Display views";
-var treebrowser_js_MESSAGE3 = "Home";
-
-function loadTop()
-{
-  if(parent.frames.length!=0 && (parent.frames[1].name=="ory_toc" || parent.frames[1].name=="ory_toc_frame") )
-  {
-     alert(treebrowser_js_MESSAGE1);
-  }
-  else
-  {
-    var expires = new Date();
-    expires.setTime (expires.getTime() + (1000 * 20));
-    document.cookie = "rup_ory_doc=" + escape (document.URL) +
-    "; expires=" + expires.toUTCString() +  "; path=/";
-    	
-    var mainIndex_a = document.getElementsByName("mainIndex"); 
-	var new_ory_doc_loc = null; 
-	if (  mainIndex_a != null ) { 
-        new_ory_doc_loc = mainIndex_a.item(0).href; 
-	} 
-
-    if(new_ory_doc_loc!=null)
-    {
-	if( self.name == "ory_doc" )
-	{
-		window.close();
-		window.open( new_ory_doc_loc );		
-	}
-	else
-	{
-	       	top.location = new_ory_doc_loc;
-	}
-    }
-   }
-}
-
-
-  function getImageUrl(image)
-  {
-    var new_ory_doc_loc=null;    
-    var mainIndex_a = document.getElementsByName("mainIndex"); 
-    new_ory_doc_loc = mainIndex_a.item(0).href.substring(0,mainIndex_a.item(0).href.lastIndexOf("/"));
-    new_ory_doc_loc = new_ory_doc_loc + "" + image;
-    return new_ory_doc_loc;    
-  }
-
-MSFPhover =
-(((navigator.appName == "Netscape") &&
-  (parseInt(navigator.appVersion) >= 3 )) ||
-  ((navigator.appName == "Microsoft Internet Explorer") &&
-  (parseInt(navigator.appVersion) >= 4 )));
-
-  function MSFPpreload(img)
-  {
-     var a=new Image();
-     a.src=img;
-     return a;
-  }
-
-    if(MSFPhover)
-    {
-        RupGray=MSFPpreload(getImageUrl('/images/display_views.gif'));
-        RupBlue=MSFPpreload(getImageUrl('/images/display_views_a.gif'));
-    }
-
-
-//new code to display the load button or not
-var ory_toc_exist = typeof parent.ory_toc;
-if (ory_toc_exist == "undefined") {
-   ory_toc_exist = typeof parent.ory_toc_frame;
-}
-
-if (ory_toc_exist == "undefined") {
-	document.write("<a class=\"expandCollapseLink\" href=\"JavaScript:loadTop();\" onmouseover=\"if(MSFPhover) document['Home'].src=RupBlue.src; self.status=treebrowser_js_MESSAGE2; return true\" onmouseout=\"if(MSFPhover) document['Home'].src=RupGray.src; self.status= ' ';return true\"> <br> <img src=\"" + backPath + "images/display_views.gif");
-//START NON-TRANSLATABLE
-	document.write("\"  border=\"0\" align=\"absmiddle\" alt=\"" + treebrowser_js_MESSAGE2 + "\" name=\"" + treebrowser_js_MESSAGE3 + "\" width=\"16\" height=\"16\">" + treebrowser_js_MESSAGE2 + "<\/a>");
-//END NON-TRANSLATABLE
-}
-else {
-	document.write("&nbsp;");
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Activity.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Artifact.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Artifact.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/CapabilityPattern.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/CapabilityPattern.gif
deleted file mode 100644
index 15ffbb0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/CapabilityPattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Checklist.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Checklist.gif
deleted file mode 100644
index 88f6d8b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Checklist.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Concept.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Concept.gif
deleted file mode 100644
index 1df84da..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Concept.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/CustomCategory.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/CustomCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/CustomCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Deliverable.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Deliverable.gif
deleted file mode 100644
index 9ae222a..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Deliverable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/DeliveryProcess.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/DeliveryProcess.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/DeliveryProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Discipline.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Discipline.gif
deleted file mode 100644
index 35bd476..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Discipline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/DisciplineGrouping.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/DisciplineGrouping.gif
deleted file mode 100644
index 3ee8089..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/DisciplineGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Domain.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Domain.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Domain.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/EstimationConsiderations.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/EstimationConsiderations.gif
deleted file mode 100644
index 4fc84e4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/EstimationConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Example.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Example.gif
deleted file mode 100644
index 1b944fd..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Example.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Guideline.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Guideline.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Guideline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Iteration.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Iteration.gif
deleted file mode 100644
index e6f5ff0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Milestone.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Milestone.gif
deleted file mode 100644
index cb8f5d9..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Other.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Other.gif
deleted file mode 100644
index a63d801..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Other.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Outcome.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Outcome.gif
deleted file mode 100644
index 4903da3..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Outcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Phase.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Phase.gif
deleted file mode 100644
index ad60bd9..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Practice.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Practice.gif
deleted file mode 100644
index fe8075a..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Practice.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Report.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Report.gif
deleted file mode 100644
index c22c85e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Report.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/ReusableAsset.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/ReusableAsset.gif
deleted file mode 100644
index 49227f3..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/ReusableAsset.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Roadmap.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Roadmap.gif
deleted file mode 100644
index 7ee9126..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Roadmap.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Role.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Role.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Role.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleDescriptor.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleDescriptor.gif
deleted file mode 100644
index 75524ab..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleSet.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleSet.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleSet.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleSetGrouping.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleSetGrouping.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/RoleSetGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Summary.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Summary.gif
deleted file mode 100644
index a5a88f6..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Summary.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/SupportingMaterial.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/SupportingMaterial.gif
deleted file mode 100644
index 05a21ec..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/SupportingMaterial.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Task.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Task.gif
deleted file mode 100644
index 5c3b2b8..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Task.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/TaskDescriptor.gif
deleted file mode 100644
index 149efe0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Template.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Template.gif
deleted file mode 100644
index ca5f822..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Template.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/TermDefinition.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/TermDefinition.gif
deleted file mode 100644
index ccb3e75..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/TermDefinition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Tool.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Tool.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Tool.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/ToolMentor.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/ToolMentor.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/ToolMentor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Whitepaper.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Whitepaper.gif
deleted file mode 100644
index e5b4800..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/Whitepaper.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/WorkProductDescriptor.gif
deleted file mode 100644
index 0eea8cc..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/WorkProductType.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/WorkProductType.gif
deleted file mode 100644
index a7ecac0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/WorkProductType.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/new_topic.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/new_topic.gif
deleted file mode 100644
index fd39292..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/new_topic.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/next.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/next.gif
deleted file mode 100644
index 3927fd0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/next.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/no_next.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/no_next.gif
deleted file mode 100644
index aa788c1..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/no_next.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/no_previous.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/no_previous.gif
deleted file mode 100644
index a80782b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/no_previous.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/previous.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/previous.gif
deleted file mode 100644
index ee99904..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/previous.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/searchrecord.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/searchrecord.gif
deleted file mode 100644
index a63d801..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/searchrecord.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/tab_pencil.gif b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/tab_pencil.gif
deleted file mode 100644
index d4484cd..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/images/tab_pencil.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/search_result.xsl b/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/search_result.xsl
deleted file mode 100644
index 537f74f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/server_search/search/search_result.xsl
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
- Licensed Materials - Property of IBM
- Restricted Materials of IBM  - Modification is prohibited.
-
- (c) Copyright IBM Corporation 2004, 2007. All Rights Reserved. 
-
- Note to U.S. Government Users Restricted Rights:  Use, duplication or
- disclosure restricted by GSA ADP  Schedule Contract with IBM Corp.
--->
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xalan="http://xml.apache.org/xalan"
-	exclude-result-prefixes="xalan">
-	
-<xsl:output method="html" xalan:omit-meta-tag="yes" xalan:use-url-escaping="no"/>
-	
-<xsl:template match="/SearchResult">
-	<xsl:variable name="initPageNum" select="@initPageNum"/>
-	<xsl:variable name="maxPageNum" select="@maxPageNum"/>
-	<xsl:variable name="nextEnabled" select="@nextEnabled"/>
-	<xsl:variable name="prevEnabled" select="@prevEnabled"/>
-	<xsl:variable name="nextText" select="@nextText"/>
-	<xsl:variable name="prevText" select="@prevText"/>	
-	<xsl:variable name="imagePath" select="@imagePath"/>
-	<xsl:variable name="searchString" select="@searchString"/>	
-	<xsl:variable name="nextHref" select="@nextHref"/>	
-	<xsl:variable name="prevHref" select="@prevHref"/>	
-	<xsl:variable name="icon" select="@icon"/>	
-
-	<div class="searchResultPane">
-		<table border="0" cellpadding="0" cellspacing="0" width="100%" >
-			<tr align="top">
-				<td align="right" nowrap="nowrap">
-					(<b><xsl:value-of select="@initPageNum"/> - <xsl:value-of select="@maxPageNum"/></b><xsl:text> / </xsl:text><xsl:value-of select="@totalHits"/>)
-					<xsl:choose>
-						<xsl:when test="$prevEnabled = 'true'">
-							<img onclick="javascript:getPrevNextPage('{$prevHref}'); return false;" onmouseover="style.cursor='pointer';" alt="{$prevText}" src="{$imagePath}previous.gif"/><xsl:text> </xsl:text>
-						</xsl:when>
-						<xsl:otherwise>
-							<img onclick="" onmouseover="style.cursor='pointer';" alt="{$prevText}" src="{$imagePath}no_previous.gif"/><xsl:text> </xsl:text>
-						</xsl:otherwise>
-					</xsl:choose>
-					<xsl:choose>
-						<xsl:when test="$nextEnabled = 'true'">
-							<img onclick="javascript:getPrevNextPage('{$nextHref}'); return false;" onmouseover="style.cursor='pointer';" alt="{$nextText}" src="{$imagePath}next.gif"/>
-						</xsl:when>
-						<xsl:otherwise>
-							<img onclick="" onmouseover="style.cursor='pointer';" alt="{$nextText}" src="{$imagePath}no_next.gif"/><xsl:text> </xsl:text>
-						</xsl:otherwise>
-					</xsl:choose>
-					&#160;	&#160;
-				</td>			
-			</tr>
-		</table>	
-	</div><br />
-	<xsl:for-each select="SearchHit">
-		<xsl:variable name="url" select="@url"/>
-		<div class="searchHit">
-			<table border="0" cellpadding="0" cellspacing="0" >
-				<tr>
-					<td align="right">
-						<xsl:choose>
-							<xsl:when test="@icon != ''">
-								<img src="{$imagePath}{@icon}" alt=""/>
-							</xsl:when>
-							<xsl:otherwise>
-								<img src="{$imagePath}searchrecord.gif" alt=""/>
-							</xsl:otherwise>
-						</xsl:choose>						
-					</td>
-					<td align="left">
-						<a href="{$url}" target="ory_doc"><xsl:value-of select="@title"/></a>
-					</td>
-				</tr>
-				<tr>
-					<td align="right"></td>
-					<td align="left"><xsl:value-of select="@summary"/></td>
-				</tr>
-			</table>
-		</div>
-	</xsl:for-each>
-	<br/>
-	<table border="0" cellpadding="0" cellspacing="0" width="100%">
-		<tr valign="middle">
-			<td align="right" nowrap="nowrap">				
-				<xsl:choose>
-					<xsl:when test="$prevEnabled = 'true'">
-						<img onclick="javascript:getPrevNextPage('{$prevHref}'); return false;" onmouseover="style.cursor='pointer';" alt="{$prevText}" src="{$imagePath}previous.gif"/><xsl:text> </xsl:text>
-					</xsl:when>
-					<xsl:otherwise>
-						<img onclick="" onmouseover="style.cursor='pointer';" alt="{$prevText}" src="{$imagePath}no_previous.gif"/><xsl:text> </xsl:text>
-					</xsl:otherwise>
-				</xsl:choose>
-				<xsl:choose>
-					<xsl:when test="$nextEnabled = 'true'">
-						<img onclick="javascript:getPrevNextPage('{$nextHref}'); return false;" onmouseover="style.cursor='pointer';" alt="{$nextText}" src="{$imagePath}next.gif"/>
-					</xsl:when>
-					<xsl:otherwise>
-						<img onclick="" onmouseover="style.cursor='pointer';" alt="{$nextText}" src="{$imagePath}no_next.gif"/><xsl:text> </xsl:text>
-					</xsl:otherwise>
-				</xsl:choose>
-				&#160;	&#160;
-			</td>	
-		</tr>
-	</table>    
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/spscreen.htm b/1.5/plugins/org.eclipse.epf.publishing/docroot/spscreen.htm
deleted file mode 100644
index 17ad6a9..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/spscreen.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<!-- RPW META DATA START --
-
-
--- RPW META DATA END -->
-
-<html lang="en" xml:lang="en">
-
-<head>
-<link rel="StyleSheet" href="rop.css" type="text/css"/>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
-<title>Splash Screen</title>
-</head>
-
-<body>
-
-
-
-<p align="center">&nbsp;</p>
-<h2 align="center">Please wait while the tree browser is being loaded...<br/></h2>
-<p align="center">&nbsp;</p>
-<!--
-<p align="center"><img src="images/splash.gif" alt="Welcome to the Eclipse Process Framework"/></p>
- -->
-<br/>
-<br/>
-
-
-</body>
-
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common.css
deleted file mode 100644
index 490a0a5..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common.css
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-a
-{	
-	color: #336699;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-a.basic
-{ 	
-    color: #000000;
-}
-	
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} /* font for action on content page usually located on top of page ;ie., select all*/
-a.action
-{  
-	color: #333333;
-	font-size: 11px;	
-} 
-
-a.copyright
-{ 	
-   color: #336699;    
-	font-size : 10px;
- }  
- 
-a.navtree
-{ 	
-    color: #000000;
-	font-size : 11px;
-	font-weight: 600;
-	text-decoration: none;
-} 
- 
-/* because of an intervening link tag, text options were attached to this element instead of the outermost cell */ 
-a.activetab
- { 
- 	color: #000000;
- 	font-size: 12px;
-  	text-decoration: none;
-  }
- 
- /* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
- a.nonactivetab
- {
-	color: #b4b4b4;
-	font-size: 12px;
-	text-decoration: none;
-}
- 
- a.red
-{
-	color: #cc3300;
-}
-
-a.topbar
-{
-  color: #666666;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  text-decoration: none;
-}
-
- /* bgcolor  for action text usually located on top of page;ie., select all*/
-.actionbg
-{ 
-background-color: #efefef;
- }
- 
-.bgblack
-{ 
- background-color: #000000;
- }
- 
-.bgwhite
-{ 
- background-color: #ffffff;
- } 
-  
-body 
-{
-	background-color : #ffffff;   
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	text-decoration : none;	
-}
-
-.bold
-{ 
-   font-weight : 600;
- }
-
- .bottombardrk
-{ 
-	background-color: #003366;
- }
-
-
-.bottombarlight
-{ 
-	background-color: #3399cc;
- }
-
-.bottombarshadow
-{ 
-	background-color: #000000;
- }
- 
-.buttons
- {
-    background-color: #efefef;
-    color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 10px;
-	text-decoration: none;	
-}
-
-.code
-{ 
-   font-family: Courier New, Courier, mono;   
-   font-size: 12px;
- }
-
- /*medium grey cell background*/
-.contentborder
- {
-	background-color: #dedede;
-}
-
- /* font for regular content text */
-.comments
-{ 	
-	font-size: 11px;	
-	background-color: #efefef;
-}
-
-.copyright
-{ 
-	color : #999999;
-	font-size : 10px;
- }
- 
- .dialgbxshadow2 
-{  
-background-color: #848484;
-}
-
- .dialogueboxborder
-{ 
- background-color: #333333
- }
- 
- .dialogueboxbg 
-{  background-color: #d2d2d2
-}
- 
-.dialogueboxhighlight 
- {
-	background-color: #efefef;
-}
-
- .dialogueboxMedium
-{ 
- background-color: #8b8b8b
- }
- 
- .dialogueboxTitle
- {	   
-	font-size: 14px;
-	font-weight : bold;
-}
- 
-.divider
- {
-	background-color: #f6f9f0;
-}
- 
-h1
-{  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 17px;	
-	font-weight: 600;
-}
-
-/*main header for frame navigation, ie, clearcase merge files*/
-.headermain
-{  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 17px;	
-	font-weight: 600;
-}
-
-/*replacing sidemenu_boldleft moving forward*/
-.navleftbold
-{
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-/*left nav submenu*/
-.navleftsub
-{
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-/*.leftmenuactive*/
-.sidemenu_boldleft_selected
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-/*use navleftbold instead to work in NS6*/
-.sidemenu_boldleft
-{
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-.sidemenu_bullet_colored
- {
-	background-color: #cd3301;
-}
-
-.leftmenu
- {
-	background-color: #999999;
-}
-
-.sidemenu_bullet_grey
- {
-	background-color: #999999;
-}
-
-.sidemenu_standard
-{
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.sidemenu_standard_selected
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.textgray
-{  
-	color: #999999;	
-}
-
-.h1
-{  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 20px;	
-	font-weight: 400;
-}
-
-.headerblue
-{
-	color: #006699;	
-	font-weight : 600;
-	text-decoration: none;
-}
-
-i
-{
-	font-style : italic;
-}
-
-.iconborder
-{ 
- background-color: #dedede;
-}
-
-input
-{
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 12px;
-} 
-
-input.px25
-{
-    width: 25px
-}
-
-input.px45
-{
-    width: 45px
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE, but NS
-*/
-input.max50
-{
-	width: 360px;
-}
-
-input.px85
-{
-    width: 85px
-}
-
-input.px135
-{
-    width: 135px
-}
-
-
-input.px155
-{
-    width: 155px
-}
-
-input.px230
-{
-    width: 230px
-}
-
-
-input.px305
-{
-    width: 305px;
-}
-
-.leftnavhead 
- {
-   color: #000000;
-	font-weight: bold;	
-	font-size: 13px;	
-} 
-
-.leftnavlabel
-{
-color: #000000;
-font-weight : 600;
-font-size: 11px;
- }
- 
-/*topnav*/ 
-.midbarlight
-{ 
-	background-color: #3399cc;
- }
-
-/*topnav*/ 
- .midbarmed
-{ 
-	background-color: #006699;
- }
-  
-.pagebold
-{ 
-	color: #000000;
-	font-weight : 600;	
- }
-
- /*font for previous & next in pagination*/
-.pagesteps
-{ 
-	color: #676767;	
-	font-size: 11px;
-	 text-decoration: none;
- }
-
- /*use for popupmenus but not including top nav*/
-.popuptext
-{
-	color: #333333;
-	font-size: 11px;
-	text-decoration : none;
-} 
- 
-select
-{
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 12px;
-}
-
-select.selpx144
-{
-    width: 144px;
-}
-
-.smalltext
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-	color: #000000;
-}
-
-.tableheader
-{  
-	color: #333333;	
-	font-size: 13px;	
-    font-weight: bold
-}
-
-/* font for regular content text */
-td
-{
-  color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
-}
-
-td.activetab
-/* because of an intervening link tag, text options were attached to a similar element for links */
- { 
- 	background-color: #c4c4c4;
-  }
- 
- td.nonactivetab
- /* because of an intervening link tag, text options were attached to a similar element for links */
- {
-	background-color: #efefef;
-}
-
-.tdLight
- {
-	background-color: #efefef;
-}
-
-/*dark grey cell background and bold text */
- .tdDarkBold
- {
-	background-color: #cccccc;
-	font-weight : 600;
-}
-
-.topframebg 
-{  background-color: #d2d2d2;
-}
-
-.topframebgGreyed
-{  background-color: #ededed;
-}
-
-.topframehighlight 
-{  
-background-color: #b6b5b5;
-}
-
-.topframehighlightGreyed
-{  
-background-color: #e1e1e1;
-}
-
-.topframeshadow 
-{  
-background-color: #848484;
-}
-
-.topframeshadowGreyed
-{  
-background-color: #cecece;
-}
-
-.topframehighlight2 
-{ 
- background-color: #efefef;
- }
- 
- .topframehighlight2Greyed
-{ 
- background-color: #f9f9f9;
- } 
- 
- .topframelogobg 
-{  
-background-color: #006699;
-}
-
-.topframelogobgGreyed
-{  
-background-color: #99c2d6;
-}
-
-.topleftnav
-{	
-    font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-	color: #000000;
-}
-
-.topleftnavGreyed
-{	
-   font-family: Verdana, Arial, Helvetica, sans-serif;
-   color: #999999;
-	font-size: 10px;
-	text-decoration: none;
-	}
-
-.topleftnavbold 
-{ 
-font-family: Verdana, Arial, Helvetica, sans-serif;
-font-size: 10px; 
-text-decoration: none; 
-font-weight: bold;
-}
-
-.topleftnavboldGreyed
-{ 
-font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 10px; 
-color: #999999;
-text-decoration: none; 
-font-weight: bold;
-}
-
-.toprightnav
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #ffffff;
-	text-decoration: none;
-}
-
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
-.topbardivider
- { 
- background-color: #3399cc 
- }
-
- .topbardividerGreyed
- { 
- background-color: #add6eb
- }  
-
- tr.bgmidframe
- /* this was initially declared the same colour as the class topframe bg but because it lies in a different functional area, has been recreated here  */
-{
-	background-color: #d2d2d2;
-}
- 
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_adv.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_adv.css
deleted file mode 100644
index 94592a4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_adv.css
+++ /dev/null
@@ -1,612 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*must add font type if class is being used as both link and  no-link text*/
-
-a {
-	color: #336699;
-}
-
-/* action text usually located on top of page;ie., select all*/
-a.actionlink {
-	color: #336699;
-	font-size: 11px;
-	text-decoration : none;
-}
-
-/* font for action;ie., select all*/
-a.actionselector {
-	color: #000000;
-	font-size: 11px;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-a.basic {
-	color: #000000;
-}
-
-a.breadcrumbs {	
-	color: #000000;
-	font-size: 11px;
-}
-
-/* for non-image buttons, for internationalization */
-a.button {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* Descoped, It's not used in current projects, to be archived after 6 months. Ali Rokni, 09/09/02 */
-/* for context toolbar buttons in Multisite, for internationalization */
-a.button2 {
-	color: #000000;
-	font-size : 11px;
-	text-decoration: none;	
-}
-
-a.button:active {
-	color: #333333;
-	text-decoration: none;
-}
-
-/* for non-image buttons, for internationalization */
-a.button:hover {
-	color: #333333;
-}
-
-a.copyright {
-	color: #999999;
-	font-size: 10px;
-} 
-
-/*actionbar on white background*/
-.actionselect2 {
-	color: #000000;
-	font-size: 11px;
-}
-
-/*actionbar appears on top and/or bottom of page*/
-.actionselector {
-	background-color: #E9E9E9;
-	color: #000000;
-	font-size: 11px;
-}
-
-/*column headings*/
-a.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} 
-
-/*navtree item or doc*/
-a.navtreeitem {
-	color: #000000;
-	font-size : 11px;
-	text-decoration: none;
-} 
-
-/*sitemap header*/
-a.sitemaph {
-	font-size: 17px;
-	font-weight: 600;
-}
-
-/*used in forgot password, any other small text links*/
-a.small {
-	font-size: 11px;
-}
-
-b {
-	font-weight : 600;
-}
-
-/*standard text*/  
-.basic {
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	font-weight: 400;
-}
-
-.bgbasic {
-	background-color: #FFFFFF;
-}
-
-/*descoped (remove after wa-lt release); use bgbasic */
-.bgwhite {
-	background-color: #FFFFFF;
-}
-
-/* size input for basic tags such as p and li that do not inherit from td */  
-body {
-	background-color : #FFFFFF;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	margin-left: 0px;
-	margin-top: 0px;
-	margin-right: 0px;
-	text-decoration: none;
-}
-
-.bold {
-	font-weight: 600;
-}
-
-.borderdrk {
-	background-color: #000000;
-}
-
-/*use in popups as borders in Multisite*/ 
-.borderpopup {
-	background-color: #DEDEDE;
-}
-
-/*borders used around data, see RUP*/ 
-.bordertbl {
-	background-color: #E9E9E9;
-}
-
-/*design element simulating a dimensional boundary to a table */ 
-.bordertbl2 {
-	background-color: #BDBDBD;
-}
-
-/*used in content area as a horizontal div in Multisite*/
-.bordertbl3 {
-	background-color: #EDEDED;
-}
-
-.breadcrumbs {
-	font-size: 11px;
-}
-
-/*used in topnav , similar to context toolbar*/
-.button {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*descoped; use button instead; used in topnav , similar to context toolbar*/
-.button3 {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*active navigation button, not form buttons*/ 
-.buttonon {
-	background-color: #DEDEDE;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*navigation buttons, not form buttons*/ 
-.buttons {
-	background-color: #EFEFEF;
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*descoped (remove after wa-lt release)--use a.button; these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-.buttontxt {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* disabled state of non-image button*/ 
-.buttontxtdsbl {
-	color: #7E7E7E;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.copyright { 
-	color: #999999;
-	font-size: 10px;
-}
-
-/*black copyright used in RUP*/
-.copyrightb {
-	color: #000000;
-	font-size: 10px;
-}
-
-dd {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	margin-left: -1px;
-}
-
-/*defect page subhead , used in project console*/
-.defectsubhd {
-	color: #006699;
-	font-weight : 600;
-	text-decoration: none;
-}
-
-.dialgbxshadow2 {
-	background-color: #848484;
-}
-
-.dialogueboxbg {
-	background-color: #D2D2D2;
-}
-
-/*background for login pages*/
-.dialogueboxbg2 {
-	background-color: #999999;
-}
-
-.dialogueboxborder {
-	background-color: #333333;
-}
-
-.dialogueboxhighlight {
-	background-color: #EFEFEF;
-}
-
-.dialogueboxmedium {
-	background-color: #8B8B8B;
-}
-
-div { 
-	font-family: arial, helvetica, sans-serif;
-} 
-
-/*used to affect right margin*/ 
-div.marginrt {
-	clear: right;
-	float: right;
-	width: 7px;
-}
-
-div.margins { 
-	float: left;
-	margin-left: 7px;
-	margin-top: 25px;
-	margin-right: 7px;
-}
-
-/*for pages with button navigation on top*/  
-div.margins20 {
-	float: left;
-	margin-left: 7px;
-	margin-top: 20px;
-	margin-right: 7px;
-}
-
-/*adds 10 px padding around text*/
-div.pad10 {
-	padding: 10px;
-}
-
-dl {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-}
-
-/*removes default bottom margin, doesn't work in NS4.7x */  
-dl.data {
-	margin-bottom: -1px;
-}
-
-/*title for error messages*/
-.error {
-	color: #CC0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 27px;
-	font-weight: 800;
-}
-
-.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-/*current sorted column*/
-.formtblheadc {
-	background-color: #E4E4E4;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-/*to replace h1 and contentheader large*/
-.header1 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;
-	font-weight: 800;
-}
-
-/*headers within page*/
-.header2 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 19px;
-	font-weight: 400;
-}
-
-/*usually used next to header1, for document root folder*/
-.header3 {
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;
-	font-weight: 800;
-}
-
-i {
-	font-style : italic;
-}
-
-.iconborder {
-	background-color: #DEDEDE;
-}
-
-/*used in controlstrip*/
-.iconoff {
-	float: right;
-	position: absolute;
-	top:1px;
-	visibility:hidden;
-	width:100%;
-}
-
-/*used in controlstrip*/
-.iconon {
-	float: right;
-	position: absolute;
-	top:1px;
-	visibility:show;
-	width: 100%;
-}
-
-/*font size setup shown in the input box which is inherited by inputXX*/
-input {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-}
-
-/* 1,business standard multiline input box 
-2,this style only activate in IE */
-input.max50 {
-	width: 360px;
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE
-*/
-input.px85 {
-	width: 85px
-}
-
-input.radio {
-
-}
-
-/*used in treescripts, leftnav*/
-.leftmenu {
-	background-color: #999999;
-}
-
-.notes {
-	font-size: 11px;
-	font-weight : 400;
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-}
-
-/*font for the numbers in pagination library*/
-.pagenumber {
-	color: #676767;
-	font-size: 11px;
-	font-weight: 400;
-	text-decoration: none;
-}
-
-/*font for previous & next in pagination*/
-.pagesteps {
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-/*popup header*/
-.poph1 {
-	font-size: 16px;
-	font-weight : bold;
-}
-
-/*used in treescripts*/
-.popleftmenu {
-	background-color: #F0F0F0;
-	border: thin solid #CCCCCC;
-	left: 210px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	padding: 2px;
-	position: absolute;
-	top: 25px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	visibility: hidden;
-	width: auto;
-	z-index: 10;
-}
-
-/*progressbar borders in Multisite*/
-.progressbarbrd {
-	background-color: #666666;
-}
-
-select {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-}
-
-/*descoped (remove after wa-lt release)--use buttons3; used in topnav*/
-.smalltext {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/* font for regular content text */
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-}
-
-/* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-td.buttonbody {
-	background-color: #D4D4D4;
-}
-
-/* disabled version */ 
-td.buttonbodydsbl {
-	background-color: #DADADA;
-}
-
-/* descoped (remove after wa-lt release); use bgbasic */
-td.buttonhighlight {
-	background-color: #FFFFFF;
-}
-
-/*non-image button*/
-td.buttonshadow {
-	background-color: #6D6D6D;
-}
-
-/* non-image button--disabled version */
-td.buttonshadowdsbl {
-	background-color: #A2A2A2;
-}
-
-/* data within a table highlighted in light gray*/
-td.tblhighlt3 {
-	background-color: #E9E9E9;
-}   
-
-/*gray data highlight or page background*/ 
-.tdlight1 {
-	background-color: #EFEFEF;
-}
-
-textarea {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-}
-
-/*global nav*/
-.topbardivider {
-	background-color: #3399CC;
-}
-
-/*global nav*/
-.topframebg {
-	background-color: #D2D2D2;
-}
-
-/*descoped (remove after wa-lt release)--use bordertbl3; used in content area as a horizontal div in Multisite*/
-.topframebggreyed {
-	background-color: #EDEDED;
-}
-
-/*global nav*/
-.topframehighlight {
-	background-color: #B6B5B5;
-}
-
-/*global nav*/
-.topframehighlight2 {
-	background-color: #EFEFEF;
-}
-
-/*global nav*/
-.topframelogobg {
-	background-color: #006699;
-}
-
-/*global nav*/
-.topframeshadow {
-	background-color: #848484;
-}
-
-/*global icon operations toolbar*/
-.topleftnav {	
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*global input operations toolbar*/
-.topleftnavbold {
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/*text on topnav, top right section*/
-.toprightnav {
-	color: #FFFFFF;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-.toprightnavgrey 
-{
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*list-style-image: url(images/downbutton.gif);*/
-ul {
-	list-style-type: square;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_advUNX.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_advUNX.css
deleted file mode 100644
index c5950a7..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_advUNX.css
+++ /dev/null
@@ -1,611 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*must add font type if class is being used as a link as well as no-link*/
-
-a {
-	color: #336699;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-/* action text usually located on top of page;ie., select all*/
-a.actionlink {
-	color: #336699;
-	font-size: 16px;
-	text-decoration : none;
-}
- 
-/* font for action;ie., select all*/
-a.actionselector {
-	color: #000000;
-	font-size: 16px;
-}
-
-a.basic {
-	color: #000000;
-}
-
-a.breadcrumbs {
-	color: #000000;
-	font-size: 16px;
-}
-
-/* for non-image buttons, for internationalization */
-a.button {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* Descoped, It's not used in current projects, to be archived after 6 months. Ali Rokni, 09/09/02 */
-/* for context toolbar buttons in Multisite, for internationalization */
-a.button2 {
-	color: #000000;
-	font-size: 16px;
-	text-decoration: none;
-}
-
-a.button:active {
-	color: #333333;
-	text-decoration: none;
-}
-
-/* for non-image buttons, for internationalization */
-a.button:hover {
-	color: #333333;
-}
-
-a.copyright {
-	color: #336699;
-	font-size: 15px;
-}
-
-/*actionbar on white background*/
-.actionselect2 {
-	color: #000000;
-	font-size: 16px;
-}
-
-/*actionbar appears on top and/or bottom of page*/
-.actionselector {
-	background-color: #E9E9E9;
-	color: #000000;
-	font-size: 16px;
-}
-
-/*column headings*/
-a.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-size: 16px;
-	font-weight: 600;
-}
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} /*navtree item or doc*/
-a.navtreeitem {
-	color: #000000;
-	font-size: 16px;
-	text-decoration: none;
-}
-
-/*sitemap header*/
-a.sitemaph {
-	font-size: 25px;
-	font-weight: 600;
-}
-
-/*used in forgot password, any other small text links*/
-a.small {
-	font-size: 16px;
-}
-
-b {
-	font-weight: 600;
-}
-
-/*standard text*/
-.basic {
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-	font-weight: 400;
-}
-
-.bgbasic {
-	background-color: #FFFFFF;
-}
-
-/*descoped (remove after wa-lt release); use bgbasic */
-.bgwhite {
-	background-color: #FFFFFF;
-}
-
-/* size input for basic tags such as p and li that do not inherit from td */ 
-body {
-	background-color: #FFFFFF;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-	margin-left: 0px;
-	margin-right: 0px;
-	margin-top: 0px;
-	text-decoration: none;
-}
-
-.bold {
-	font-weight: 600;
-}
-
-.borderdrk {
-	background-color: #000000;
-}
-
-/*use in popups as borders in Multisite*/ 
-.borderpopup {
-	background-color: #DEDEDE;
-}
-
-/*borders used around data, see RUP*/
-.bordertbl {
-	background-color: #E9E9E9;
-}
-
-/*design element simulating a dimensional boundary to a table */ 
-.bordertbl2{
-	background-color: #BDBDBD;
-}
-
-/*used in content area as a horizontal div in Multisite*/
-.bordertbl3 {
-	background-color: #EDEDED;
-}
-
-.breadcrumbs{
-font-size: 11px;
-}
-
-/*used in topnav , similar to context toolbar*/
-.button {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*descped; use button instead; used in topnav , similar to context toolbar*/
-.button3 {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*active state of navigation button in context toolbar*/ 
-.buttonon {
-	background-color: #DEDEDE;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*navigation buttons in context toolbar*/
-.buttons {
-	background-color: #EFEFEF;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 15px;
-	text-decoration: none;	
-}
-
-/* descoped (remove after wa-lt release)--use a.button; these button styles are for the textual buttons intended to replace image constructs for internalization*/
-.buttontxt {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* disabled state of non-image button*/ 
-.buttontxtdsbl {
-	color: #7E7E7E;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.copyright {
-	color: #999999;
-	font-size: 15px;
-}
-
-/*black copyright used in RUP*/
-.copyrightb {
-	color: #000000;
-	font-size: 15px;
-}
-
-dd {
-font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-	margin-left: -1px;
-}
-
-/*defect page subhead , used in project console*/
-.defectsubhd {
-	color: #006699;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.dialgbxshadow2 {
-	background-color: #848484;
-}
-
-.dialogueboxbg {
-	background-color: #D2D2D2;
-}
-
-/*background for login pages*/
-.dialogueboxbg2 {
-	background-color: #999999;
-}
-
-.dialogueboxborder {
-	background-color: #333333;
-}
-
-.dialogueboxhighlight {
-	background-color: #EFEFEF;
-}
-
-.dialogueboxmedium {
-	background-color: #8B8B8B;
-}
-
-div {
-	font-family: arial, helvetica, sans-serif;
-}
-
-/*used to affect right margin*/
-div.marginrt {
-	clear: right;
-	float: right;
-	width: 7px;
-}
-
-div.margins {
-	float: left;
-	margin-left: 7px;
-	margin-right: 7px;
-	margin-top: 25px;
-}
-
-/*for pages with button navigation on top*/ 
-div.margins20 {
-	float: left;
-	margin-left: 7px;
-	margin-right: 7px;
-	margin-top: 20px;
-}
-
-/*adds 10 px padding around text*/
-div.pad10 {
-	padding: 10px;
-}
-
-dl {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-}
-
-/*removes default bottom margin, doesn't work in NS4.7x */ 
-dl.data {
-	margin-bottom: -1px;
-}
-
-/*title for error messages*/
-.error {
-	color: #CC0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 30px;
-	font-weight: 800;
-}
-
-.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-size: 16px;
-	font-weight: 600;
-}
-
-/*current sorted column*/
-.formtblheadc {
-	background-color: #E4E4E4;
-	color: #000000;
-	font-size: 16px;
-	font-weight: 600;
-}
-
-/*to replace h1 and contentheader large*/
-.header1 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;
-	font-weight: 800;
-}
-
-/*headers within page*/
-.header2 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 28px;
-	font-weight: 400;
-}
-
-/*usually used next to header1; for document root folder*/
-.header3 {
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;
-	font-weight: 800;
-}
-
-i {
-	font-style: italic;
-}
-
-.iconborder {
-	background-color: #DEDEDE;
-}
-
-/*used in controlstrip*/
-.iconoff {
-	float: right;
-	position: absolute;
-	top: 1px;
-	visibility: hidden;
-	width: 100%;
-}
-
-/*used in controlstrip*/
-.iconon {
-	float: right;
-	position: absolute;
-	top: 1px;
-	visibility:show;
-	width: 100%;
-}
-
-
-/*font size setup shown in the input box which is inherited by inputXX*/
-input {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-}
-
-/* 1,business standard multiline input box 
-2,this style only activate in IE */
-input.max50 {
-	width: 360px;
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE
-*/
-input.px85 {
-	width: 85px;
-}
-
-input.radio { 
-
-}
-
- /*used in treescripts, leftnav*/
-.leftmenu {
-	background-color: #999999;
-}
-
-.notes {
-	font-size: 16px;
-	font-weight : 400;
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-}
-
-/*font for the numbers in pagination library*/
-.pagenumber {
-	color: #676767;
-	font-size: 16px;
-	font-weight : 400;
-	text-decoration: none;
-}
-
-/*font for previous & next in pagination*/
-.pagesteps {
-	color: #000000;
-	font-size: 16px;
-	font-weight : 600;
-}
-
-/*popup header*/
-.poph1 {
-	font-size: 24px;
-	font-weight: bold;
-}
-
-/*used in treescripts*/
-.popleftmenu {
-	background-color: #F0F0F0;
-	border: thin solid #CCCCCC;
-	left: 210px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	padding: 2px;
-	position: absolute;
-	top: 25px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	visibility: hidden; 
-	width:75px;
-	z-index:10;	
-}
-
-/*progressbar borders in Multisite*/
-.progressbarbrd {
-	background-color: #666666;
-}
-
-select {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-}
-
-/*descoped (remove after wa-lt release)--use buttons3; used in topnav*/
-.smalltext {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/* font for regular content text */
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 14px;
-}
-
- /* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-td.buttonbody {
-	background-color: #D4D4D4;
-}
-
-/* disabled version */
-td.buttonbodydsbl {
-	background-color: #DADADA;
-}
-
-/* descoped (remove after wa-lt release); use bgbasic */
-td.buttonhighlight {
-	background-color: #FFFFFF;
-}
-
-/*non-image button*/
-td.buttonshadow {
-	background-color: #6D6D6D;
-}
-
-/* non-image button--disabled version */
-td.buttonshadowdsbl {
-	background-color: #A2A2A2;
-}
-
- /* data within a table highlighted in light gray*/
-td.tblhighlt3 {
-	background-color: #E9E9E9;
-}
-
-/*gray data highlight or page background*/ 
-.tdlight1 {
-	background-color: #EFEFEF;
-}
-
-textarea {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-}
-
-/*global nav*/
-.topbardivider {
-	background-color: #3399CC;
-}
-
-/*global nav*/
-.topframebg {
-	background-color: #D2D2D2;
-}
-
-/*descoped (remove after wa-lt release)-use bordertbl3; used in content area as a horizontal div in Multisite*/
-.topframebggreyed {
-	background-color: #EDEDED;
-}
-
-/*global nav*/
-.topframehighlight {
-	background-color: #B6B5B5;
-}
-
-/*global nav*/
-.topframehighlight2 {
-	background-color: #EFEFEF;
-}
-
-/*global nav*/
-.topframelogobg {
-	background-color: #006699;
-}
-
-/*global nav*/
-.topframeshadow {
-	background-color: #848484;
-}
-
-/*global icon operations toolbar*/
-.topleftnav {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*global input operations toolbar*/
-.topleftnavbold {
-	font-family: verdana, brial, helvetica, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/*text on topnav, top right section*/
-.toprightnav {
-	color: #FFFFFF;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 14px;
-	text-decoration: none;
-}
-
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
-/*list-style-image: url(images/downbutton.gif); doesn't work for ns4*/
-ul {
-	list-style-type: square;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_base.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_base.css
deleted file mode 100644
index 65bb516..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_base.css
+++ /dev/null
@@ -1,617 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*must add font type if class is being used as a link as well as no-link*/
-
-a {
-	color: #336699;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} /* Descoped, It's not used in current projects, to be archived after 6 months. Ali Rokni, 09/09/02 */
-/* action text usually located on top of page;ie., select all*/
-a.actionlink {
-	color: #336699;
-	font-size: 11px;
-	text-decoration : none;
-}
-
-/* font for action;ie., select all*/
-a.actionselector {
-	color: #000000;
-	font-size: 11px;
-}
-
-a.basic {
-	color: #000000;
-}
-
-a.breadcrumbs {
-	color: #000000;
-	font-size: 11px;
-}
-
-/* for non-image buttons, for internationalization */
-a.button {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* for context toolbar buttons in Multisite, for internationalization */
-a.button2 {
-	color: #000000;
-	font-size: 11px;
-	text-decoration: none;
-}
-
-a.button:active {
-	color: 333333;
-	text-decoration: none;
-}
-
-/* for non-image buttons, for internationalization */
-a.button:hover {
-	color: 333333;
-}
-
-a.copyright {
-	color: #999999;
-	font-size: 10px;
-}
-
-/*actionbar on white background*/
-.actionselect2 {
-	color: #000000;
-	font-size: 11px;
-}
-
-/*actionbar appears on top and/or bottom of page*/
-.actionselector {
-	background-color: #E9E9E9;
-	color: #000000;
-	font-size: 11px;
-}
-
-/*column headings*/
-a.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-/*navtree item or doc*/
-a.navtreeitem {
-	color: #000000;
-	font-size: 11px;
-	text-decoration: none;
-}
-
-/*sitemap header*/
-a.sitemaph {
-	font-size: 17px;
-	font-weight: 600;
-}
-
-/*used in forgot password, any other small text links*/
-a.small {
-	font-size: 11px;
-}
-
-b {
-	font-weight : 600;
-}
-
-/*standard text*/
-.basic {
-color: #000000;
-font-family: arial, helvetica, sans-serif;
-font-size: 12px;
-font-weight: 400;
-}
-
-.bgbasic {
-	background-color: #FFFFFF;
-}
-
-/*descoped (remove after wa-lt release); use bgbasic */
-.bgwhite {
-	background-color: #FFFFFF;
-}
-
-/* size input for basic tags such as p and li that do not inherit from td */ 
-body {
-	background-color: #FFFFFF;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	margin-left: 0px;
-	margin-right: 0px;
-	margin-top: 0px;
-	text-decoration: none;
-}
-
-.bold {
-	font-weight : 600;
-}
-
-.borderdrk {
-	background-color: #000000;
-}
-
-/*use in popups as borders in Multisite*/ 
-.borderpopup {
-	background-color: #DEDEDE;
-}
-
-/*borders used around data, see RUP*/ 
-.bordertbl {
-	background-color: #E9E9E9;
-}
-
-/*design element simulating a dimensional boundary to a table */ 
-.bordertbl2{
-	background-color: #BDBDBD;
-}
-
-/*used in content area as a horizontal div in Multisite*/
-.bordertbl3 {
-	background-color: #EDEDED;
-}
-
-.breadcrumbs{ 
-font-size: 11px;
-}
-
-/*used in topnav , similar to context toolbar*/
-.button {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*descoped; use button instead; used in topnav , similar to context toolbar*/
-.button3 {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*active state of navigation button in context toolbar*/ 
-.buttonon {
-	background-color: #DEDEDE;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*navigation buttons in context toolbar*/ 
-.buttons {
-	background-color: #EFEFEF;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/* descoped (remove after wa-lt release)--use a.button; these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-.buttontxt {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* disabled state of non-image button*/ 
-.buttontxtdsbl {
-	color: #7E7E7E;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.copyright {
-	color: #999999;
-	font-size: 10px;
-}
-
-/*black copyright used in RUP*/
-.copyrightb {
-	color: #000000;
-	font-size: 10px;
-}
-
-dd {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	margin-left: -1px;
-}
- 
-/*defect page subhead , used in project console*/
-.defectsubhd {
-	color: #006699;
-	font-weight: 600;
-	text-decoration: none;
-}
- 
-.dialgbxshadow2 {
-	background-color: #848484;
-}
-
-.dialogueboxbg {
-	background-color: #D2D2D2;
-}
-
-/*background for login pages*/
-.dialogueboxbg2 {
-	background-color: #999999;
-}
-
-.dialogueboxborder {
-	background-color: #333333;
-}
- 
-.dialogueboxhighlight {
-	background-color: #EFEFEF;
-}
-
- .dialogueboxmedium {
-	background-color: #8B8B8B;
-}
-
-div {
-	font-family: arial, helvetica, sans-serif;
-}
-
-/*used to affect right margin*/ 
-div.marginrt {
-	clear: right;
-	float: right;
-	width: 7px;
-}
-
-div.margins {
-	float: left;
-	margin-left: 7px;
-	margin-right: 7px;
-	margin-top: 25px;
-}
-
-/*for pages with button navigation on top*/ 
-div.margins20 {
-	float: left;
-	margin-left: 7px;
-	margin-right: 7px;
-	margin-top: 20px;
-}
-
-/*adds 10 px padding around text*/
-div.pad10 {
-	padding: 10px;
-}
-
-dl {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-}
-
-/*removes default bottom margin, doesn't work in NS4.7x */
-dl.data {
-	margin-bottom: -1px;
-}
-
-/*title for error messages*/
-.error {
-	color: #CC0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 27px;
-	font-weight: 800;
-}
- 
-.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-size: 11px;
-	font-weight: 600;
-}
-
-/*current sorted column*/
-.formtblheadc {
-	background-color: #E4E4E4;
-	color: #000000;
-	font-size: 11px;
-	font-weight: 600;
-}
-
-/*to replace h1 and contentheader large*/
-.header1 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;
-	font-weight: 800;
-}
-
-/*headers within page*/
-.header2 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 19px;
-	font-weight: 400;
-}
-
-/*usually used next to header1 for document root folder*/
-.header3 {
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;
-	font-weight: 800;
-}
-
-i {
-	font-style: italic;
-}
-
-.iconborder {
-	background-color: #DEDEDE;
-}
-
-/*used in controlstrip*/
-.iconoff {
-	position: absolute;
-	top: 1px;
-	visibility: hidden;
-}
-
-/*used in controlstrip*/
-.iconon {
-	position: absolute;
-	top: 1px;
-	visibility: show;
-}
-
-/*font size setup shown in the input box which is inherited by inputXX*/
-input {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-}
-
-/* 1,business standard multiline input box 
-2,this style only activate in IE */
-input.max50 {
-	width: 360px;
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE
-*/
-input.px85 {
-	width: 85px;
-}
-
-input.radio{
-	margin-top: -2px;
-}
-
- /*used in treescripts, leftnav*/
-.leftmenu {
-	background-color: #999999;
-}
-
-/*added for xsl_process--remove 12/02*/
-.leftnavtree {
-	position: absolute;
-	width: 200px;
-	height: 115px;
-	left: 5;
-	top: 25;
-	visibility: visible;
-	z-index: 0;
-}
-
-.notes {
-	font-size: 11px;
-	font-weight: 400;	
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-}
-
-/*font for the numbers in pagination library*/
-.pagenumber {
-	color: #676767;	
-	font-size: 11px;
-	font-weight: 400;
-	text-decoration: none;
-}
-
- /*font for previous & next in pagination*/
-.pagesteps {
-	color: #000000;
-	font-size: 11px;
-	font-weight: 600;
- }
-
-/*popup header*/
-.poph1 {
-	font-size: 16px;
-	font-weight: bold;
-}
-
-/*used in treescripts*/
-.popleftmenu {
-	background-color: #F0F0F0;
-	border: thin solid #CCCCCC;
-	left: 210px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	padding: 2px;
-	position:absolute; 
-	top: 25px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	visibility: hidden;
-	width:auto;
-	z-index:10;	
-}
-
-/*progressbar borders in Multisite*/
-.progressbarbrd{
-	background-color: #666666;
-}
- 
-select {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-}
-
-/*descoped (remove after wa-lt release)--use button3; used in topnav*/
-.smalltext {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/* font for regular content text */
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-}
-
-/* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-td.buttonbody {
-	background-color: #D4D4D4;
-}
-
- /* disabled version */ 
-td.buttonbodydsbl {
-	background-color: #DADADA;
-}
-
-/* descoped (remove after wa-lt release); use bgbasic */
-td.buttonhighlight {
-	background-color: #FFFFFF;
-}
-
-/*non-image button*/
-td.buttonshadow {
-	background-color: #6D6D6D;
-}
-
-/* non-image button--disabled version */
-td.buttonshadowdsbl {
-	background-color: #A2A2A2;
-}
-
-/* data within a table highlighted in light gray*/
-td.tblhighlt3 {
-	background-color: #E9E9E9;
-}
-
- /*gray data highlight or page background*/ 
-.tdlight1 {
-	background-color: #EFEFEF;
-}
-
-textarea {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-}
-
-/*global nav*/
-.topbardivider {
-	background-color: #3399CC;
-}
- 
- /*global nav*/
-.topframebg {
-	background-color: #D2D2D2;
-}
-
-/*descoped (remove after wa-lt release)--used bordertbl3; used in content area as a horizontal div in Multisite*/
-.topframebggreyed {
-	background-color: #EDEDED;
-}
-
-/*global nav*/
-.topframehighlight {
-	background-color: #B6B5B5;
-}
-
-/*global nav*/
-.topframehighlight2 { 
-	background-color: #EFEFEF;
-}
-
-/*global nav*/
-.topframelogobg {
-	background-color: #006699;
-}
-
-/*global nav*/
-.topframeshadow {
-	background-color: #848484;
-}
-
-/*global icon operations toolbar*/
-.topleftnav {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/*global input operations toolbar*/
-.topleftnavbold {
-	font-family: verdana, brial, helvetica, sans-serif;
-	font-size: 10px; 
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/*text on topnav, top right section*/
-.toprightnav {
-	color: #FFFFFF;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
-/*list-style-image: url(images/downbutton.gif); doesn't work for ns4*/
-ul {
-	list-style-type: square;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_baseUNX.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_baseUNX.css
deleted file mode 100644
index 04ec91c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/common_baseUNX.css
+++ /dev/null
@@ -1,615 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*must add font type if class is being used as a link as well as no-link*/
-
-a {
-	color: #336699;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-/* action text usually located on top of page;ie., select all*/
-a.actionlink {
-	color: #336699;
-	font-size: 16px;
-	text-decoration : none;	
-}
- 
-/* font for action;ie., select all*/
-a.actionselector {
-	color: #000000;
-	font-family: verdana, helvetica, arial, sans-serif;	
-	font-size: 16px;
-}
-
-a.basic {
-	color: #000000;
-}
-
-a.breadcrumbs {
-	color: #000000;
-	font-size: 16px;
-}
-
-/* for non-image buttons, for internationalization */
-a.button {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* Descoped, It's not used in current projects, to be archived after 6 months. Ali Rokni, 09/09/02 */
-/* for context toolbar buttons in Multisite, for internationalization */
-a.button2 {
-	color: #000000;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 16px;
-	text-decoration: none;
-}
-
-a.button:active {
-	color: #333333;
-	text-decoration: none;
-}
-
-/* for non-image buttons, for internationalization */
-a.button:hover {
-	color: #333333;
-}
-
-a.copyright {
-	color: #336699;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-}
-
-/*actionbar on white background*/
-.actionselect2 {
-	color: #000000;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 16px;
-}
-
-/*actionbar appears on top and/or bottom of page*/
-.actionselector {
-	background-color: #E9E9E9;
-	color: #000000;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 16px;
-}
-
-/*column headings*/
-a.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 16px;
-	font-weight : 600;
-}
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} /*navtree item or doc*/
-a.navtreeitem {
-	color: #000000;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 16px;
-	text-decoration: none;
-}
-
-/*sitemap header*/
-a.sitemaph{
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 25px;
-	font-weight: 600;
-}
-
-/*used in forgot password, any other small text links*/
-a.small {
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 16px;
-}
-
-b {
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-weight: 600;
-}
-
-/*standard text*/
-.basic {
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-	font-weight: 400;
-}
-
-.bgbasic {
-	background-color: #FFFFFF;
-}
-
-/*descoped (remove after wa-lt release); use bgbasic */
-.bgwhite {
-	background-color: #FFFFFF;
-}
-
-/* size input for basic tags such as p and li that do not inherit from td */ 
-body {
-	background-color : #FFFFFF;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-	text-decoration: none;
-	margin-left: 0px;
-	margin-right: 0px;
-	margin-top: 0px;
-}
-
-.bold {
-	font-weight: 600;
-}
-
-.borderdrk {
-	background-color: #000000;
-}
-
-/*use in popups as borders in Multisite*/ 
-.borderpopup {
-	background-color: #DEDEDE;
-}
-
-/*borders used around data, see RUP*/
-.bordertbl {
-	background-color: #E9E9E9;
-}
-
-/*design element simulating a dimensional boundary to a table */ 
-.bordertbl2 {
-	background-color: #BDBDBD;
-}
-
-/*used in content area as a horizontal div in Multisite*/
-.bordertbl3 {
-	background-color: #EDEDED;
-}
-
-.breadcrumbs {
-font-size: 11px;
-}
-
-/*used in topnav , similar to context toolbar*/
-.button {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*descoped; use button instead; used in topnav , similar to context toolbar*/
-.button3 {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*active state of navigation button in context toolbar*/ 
-.buttonon {
-	background-color: #DEDEDE;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*navigation buttons in context toolbar*/
-.buttons {
-	background-color: #EFEFEF;
-	color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/* descoped (remove after wa-lt release)--use a.button; these button styles are for the textual buttons intended to replace image constructs for internalization*/
-.buttontxt {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* disabled state of non-image button*/ 
-.buttontxtdsbl {
-	color: #7E7E7E;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.copyright {
-	color: #999999;
-	font-size: 15px;
-}
-
-/*black copyright used in RUP*/
-.copyrightb {
-	color: #000000;
-	font-size: 15px;
-}
-
-dd {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-	margin-left: -1px;
-}
-
-/*defect page subhead , used in project console*/
-.defectsubhd {
-	color: #006699;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.dialgbxshadow2 {
-	background-color: #848484;
-}
-
-.dialogueboxbg {
-	background-color: #D2D2D2;
-}
-
-/*background for login pages*/
-.dialogueboxbg2 {
-	background-color: #999999;
-}
-
-.dialogueboxborder {
-	background-color: #333333;
-}
-
-.dialogueboxhighlight {
-	background-color: #EFEFEF;
-}
-
-.dialogueboxmedium {
-	background-color: #8B8B8B;
-}
-
-div {
-	font-family: arial, helvetica, sans-serif;
-}
-
-/*used to affect right margin*/ 
-div.marginrt {
-	clear: right;
-	float: right;
-	width: 7px;
-}
-
-div.margins {
-	float: left;
-	margin-left: 7px;
-	margin-right: 7px;
-	margin-top: 25px;
-}
-
-/*for pages with button navigation on top*/ 
-div.margins20 {
-	float: left;
-	margin-left: 7px;
-	margin-right: 7px;
-	margin-top: 20px;	
-}
-
-/*adds 10 px padding around text*/
-div.pad10 {
-	padding: 10px;
-}
-
-dl {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-}
-
-/*removes default bottom margin, doesn't work in NS4.7x */ 
-dl.data { 
-	margin-bottom: -1px;
-}
-
-/*title for error messages*/
-.error {
-	color: #CC0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 30px;
-	font-weight: 800;
-}
-
-.formtblhead {
-	background-color: #CCCCCC;
-	color: #000000;
-	font-size: 16px;
-	font-weight: 600;
-}
-
-/*current sorted column*/
-.formtblheadc {
-	background-color: #E4E4E4;
-	color: #000000;
-	font-size: 16px;
-	font-weight: 600;
-}
-
-/*to replace h1 and contentheader large*/
-.header1 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;
-	font-weight: 800;
-}
-
-/*headers within page*/
-.header2 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 28px;
-	font-weight: 400;
-}
-
-/*usually used next to header1; for document root folder*/
-.header3 {
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;
-	font-weight: 800;
-}
-
-i {
-	font-style: italic;
-}
-
-.iconborder {
-	background-color: #DEDEDE;
-}
-
-/*used in controlstrip*/
-.iconoff {
-	position: absolute; 
-	top: 1px;
-	visibility: hidden;
-}
-
-/*used in controlstrip*/
-.iconon {
-	position: absolute;
-	top: 1px;
-	visibility: show;
-}
-
-/*font size setup shown in the input box which is inherited by inputXX*/
-input {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-}
-
-/* 1,business standard multiline input box 
-2,this style only activate in IE */
-input.max50 {
-	width: 360px;
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE
-*/
-input.px85 {
-	width: 85px;
-}
-
-input.radio {
-
-}
-
- /*used in treescripts, leftnav*/
-.leftmenu {
-	background-color: #999999;
-}
-
-.notes {
-	font-size: 16px;
-	font-weight: 400;
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-}
-
-/*font for the numbers in pagination library*/
-.pagenumber {
-	color: #676767;
-	font-size: 16px;
-	font-weight : 400;
-	text-decoration: none;
-}
-
- /*font for previous & next in pagination*/
-.pagesteps {
-	color: #000000;
-	font-size: 16px;
-	font-weight: 600;
-}
-
-/*popup header*/
-.poph1 {
-	font-size: 24px;
-	font-weight: bold;
-}
-
-/*used in treescripts*/
-.popleftmenu {
-	background-color: #F0F0F0;
-	border: thin solid #CCCCCC; 
-	left: 210px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	padding: 2px;
-	position: absolute; 
-	top: 25px;	/* it's not working on ns 6.2, ie 5.5, ie 6 and ns 7, possibly can be removed safely, Ali Rokni, 09/18/02*/
-	visibility: hidden; 
-	width:75px;
-	z-index:10;
-}
-
-/*progressbar borders in Multisite*/
-.progressbarbrd {
-	background-color: #666666;
-}
-
-select {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-}
-
-/*descoped (remove after wa-lt release)--use buttons3; used in topnav*/
-.smalltext {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/* font for regular content text */
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-}
-
-/* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-td.buttonbody {
-	background-color: #D4D4D4;
-}
-
-/* disabled version */
-td.buttonbodydsbl {
-	background-color: #DADADA;
-}
-
-/* descoped (remove after wa-lt release); use bgbasic */
-td.buttonhighlight {
-	background-color: #FFFFFF;
-}
-
-/*non-image button*/
-td.buttonshadow {
-	background-color: #6D6D6D;
-}
-
-/* non-image button--disabled version */
-td.buttonshadowdsbl {
-	background-color: #A2A2A2;
-}
-
-/* data within a table highlighted in light gray*/
-td.tblhighlt3 {
-	background-color: #E9E9E9;
-}
-
-/*gray data highlight or page background*/ 
-.tdlight1 {
-	background-color: #EFEFEF;
-}
-
-textarea {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-}
-
-/*global nav*/
-.topbardivider {
-	background-color: #3399CC;
-}
-
-/*global nav*/
-.topframebg {
-	background-color: #D2D2D2;
-}
-
-/*descoped (remove after wa-lt release)-use bordertbl3; used in content area as a horizontal div in Multisite*/
-.topframebggreyed {
-	background-color: #EDEDED;
-}
-
-/*global nav*/
-.topframehighlight {
-	background-color: #B6B5B5;
-}
-
-/*global nav*/
-.topframehighlight2 {
-	background-color: #EFEFEF;
-}
-
-/*global nav*/
-.topframelogobg {
-	background-color: #006699;
-}
-
-/*global nav*/
-.topframeshadow {
-	background-color: #848484;
-}
-
-/*global icon operations toolbar*/
-.topleftnav {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-/*global input operations toolbar*/
-.topleftnavbold {
-	font-family: verdana, brial, helvetica, sans-serif;
-	font-size: 15px; 
-	font-weight: 600;
-	text-decoration: none; 
-}
-
-/*text on topnav, top right section*/
-.toprightnav {
-	color: #FFFFFF;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 14px;
-	text-decoration: none;
-}
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
-/*list-style-image: url(images/downbutton.gif); doesn't work for ns4*/
-ul {
-	list-style-type: square;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/design.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/design.css
deleted file mode 100644
index 48d9246..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/design.css
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
- /* this is a border style for the top menu box */
- .boxthin {
-	border-color: #E9E9E9;
-	border-style: solid;
-	border-width: thin;
-	float: left;
-	margin-bottom: 1em;
-	margin-top: 1em;
-	padding: 1em;
-	width: 275px;
-}
-
- /* this is a container to keep the top menu isolated from material below it */
-.container {
-	clear: both;
-	width: 100%;
-}
-
- /* a simple inset for blocked elements to indent */
-.inset {
-	clear: both;
-	margin-left: 13px;
-	margin-top: 4px;
-	width: 100%;
-}
-
-.midalign {
-	vertical-align: middle;
-}
-
- /* an empty element for the benefit of I.E. 5+ so that the top menu is constrained to left */
-.spacing {
-	clear: right;
-	float: right;
-	width: 100px;
-}
-
- /* The classes below all relate to the upper right button on the nav frame*/
-
-.whrbtn {
-	position: absolute;
-	right: 0;
-	top: 0;
-	width: 100%;
-}
-
-.whrbuttonbg {
-	background-color: #FBFBFB;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 9px;
-	font-weight: 600;
-}
-
-.whrbuttonhighlight {
-	background-color: #CBCBCB;
-}
-
-.whrbuttonshadow {
-	background-color: #686868;
-}
-
-.whrmargin{
-	background-color: #EFEFEF;
-}
-
-.whrmarginbrdr {
-	background-color: #DEDEDE;
-}
-
- /* This class is provided for netscape so that the scroll bar doesn't cover the button. An image inside of a div helps push the button to the left. Here the div is simply turned off since it is unneeded */
-.whrspacer {
-	position: absolute;
-	visibility: hidden;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/design_ns.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/design_ns.css
deleted file mode 100644
index a8e60e7..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/design_ns.css
+++ /dev/null
@@ -1,78 +0,0 @@
-﻿/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-.boxthin {
-	border-color: #E9E9E9;
-	border-style: solid;
-	border-width: thin;
-	width: 275px;
-}
-
-.container {
-	margin-left: 12px;
-	width: 100%;
-}
-
-.content {
-	margin-left: 12px;
-	width: 100%;
-}
-
- /* a simple inset for blocked elements to indent */
-.inset {
-	clear: both;
-	margin-left: 13px;
-	margin-top: 4px;
-	width: 100%;
-}
-
-.midalign {
-	vertical-align: middle;
-}
-
-.spacing {
-}
-
- /* The classes below all relate to the upper right button on the nav frame*/
-
-.whrbtn {
-	position: absolute;
-	top: 0;
-	width: 90%;
-}
-
-.whrbuttonbg {
-	background-color: #FBFBFB;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-}
-
-.whrbuttonhighlight {
-	background-color: #CBCBCB;
-}
-
-.whrbuttonshadow {
-	background-color: #686868;
-}
-
-.whrmargin{
-	background-color: #EFEFEF;
-}
-
-.whrmarginbrdr {
-	background-color: #DEDEDE;
-}
-
- /* This class is provided for netscape so that the scroll bar doesn't cover the button. The spacing is provided by an image inside a div. In other browsers, it is simply turned off */
-.whrspacer {
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_explorer.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_explorer.css
deleted file mode 100644
index 79d9eaf..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_explorer.css
+++ /dev/null
@@ -1,1345 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-a
-{
-    color: #336699;
-}
-.accentcolor
-/*used as highlighted description above tables*/
-{
-	color : #cc3300;
-	font-size : 1em;
-	font-weight : 600;
-	text-decoration: none;
-}
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} a.breadcrumbs
-/*linked breadcrumbs*/
-{
-	color: #ffffff;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight: 400;
-	text-decoration: underline
-
-a.breadcrumbs:hover
-{
-  color: #ffffff
-}
-
-
-a.link_container_editor
-/*EDIT link under container banner*/
-{
-	font-size: 11px;
-	text-decoration : none;
-}
-
-
-a.link_byline
-/*written by XX author in content*/
-{
-	font-size: .9em;
-	color: #336699;
-}
-
-
-a.link_func_option
-/*Advanced link in search container*/
-{
-	font-weight: bold;
-}
-
-
-a.linktyped
-/*view all link under container*/
-{
-	font-size: 11px;
-}
-
-
-a.menubar_link
-/*
-white font for the text in the table header, usually in the 1nd level of the table header if there are 2
-1st level: regular 
-2nd level: bold
-*/
-{
-	color: #ffffff;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight: 400;
-	text-decoration: underline
-}
-
-
-a.menubar_link:hover
-{
-	color: #ffffff;
-}
-
-a.navtree
-{ 	
-    color: #000000;
-	font-size : 11px;
-	font-weight: 600;
-	text-decoration: none;
-} 
-
-a.project_nav
-/*project explorer menubar option links in left nav*/
-{
-	color: #006699;
-	font-family : arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration: underline;
-}
-a.project_navtree
-/*topNav tree submenu*/
-{
-  color: #000000;
-  font-family: arial, helvetica, sans-serif;
-  font-size: .9em;
-  text-decoration: none;
-}
-a.topbar
-/*topNav*/
-{
-  color: #666666;
-  font-family: arial, helvetica, sans-serif;
-  font-size: .9em;
-  text-decoration: none;
-}
-
-
-body
-/*original body background setup*/
-{
-	font-family: arial, helvetica, sans-serif;
-	font-size: 9px;
-	background-color : ffffff;
-}
-
-
-.border_decoration
-/*dotted line border of tables in content*/
-{
-	border : thin dotted #666666;
-	float : right;
-	margin-bottom : 15px;
-	margin-left : 15px;
-	padding: 5px;
-}
-
-
-.bottombar_dark
-/*background color behind breadcrumbs*/
-{
-	background: #003366;
-}
-
-
-.bottombar_light
-/*thin line between dropdown menu & breadcrumb bar*/ 
-{
-	background: #3399cc;
- }
-
-
- .bottombar_medium
- /*thin line between dropdown menu & shadow color */
-{ 
-	background: #006699;
- }
-
-
- .bottombar_shadow
-  /*dark lines under breadcrumbbar &  dropdownmenu bar */
-{
-	background: #000000;
-}
-
-
-code
-/*code asset in content*/
-{
-	color: #676767;
-}
-
-.code2
-/*indent code asset in content*/
-{
-   	margin-left : 15px;
-	margin-right : 15px;
-}
-
-.copyright
-/*copyright line at the bottom of the page*/
-{ 
-	color : #999999;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 86%;
- }
- 
-.content_basic
-/*
-font for regular content texts
-font for regular container texts
-font for regular form texts
-*/
-{
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 1em;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-
-.content_basic_emphasis
-/*
-bold font for regular content texts
-bold font for regular container texts
-bold font for regular form texts
-*/
-{ 
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 600;
-	line-height : 135%;
-	text-decoration : none;
- }
-
-
- .content_colored
- /*content*/
-{
-	color: #336699;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 1em;
-}
-
-
- .content_container
- /*bottom margin yield the space between byline & paragraph*/
- {
-	margin-bottom : 15px;
-}
-
- .content_diagram
- /*diagram description, eg." figure 1..."*/
- {
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 90%;
-	font-style : italic;	
-	}
-
-.header_of_article_table
-/*colored table header in content*/
-{
-	color: #336699;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 12px;
-	font-style : italic;
-}
-
- .content_emphasis
- /*bold font in content*/
- {
-	color: #000000;
-	font-weight : 600;
-}
-
-
-.content_grey_mid
-/*welcome container*/
-{
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 1em;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.content_grey_mid2
-/*font in floating box*/
-{
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 100%;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
- .content_header
- /*header of content paragraph*/
- {
-	color: #006699;
-	font-family : arial, helvetica, sans-serif;
-	font-weight : 600;
-	text-decoration: none;
-}
-
- .content_header_large
- /*font for page header except for article pages, (see header_of_article)*/
- {
-	color: #333333;
-	font-family : arial, helvetica, sans-serif;
-	font-size: 1.8em;
-	font-weight : 400;
-	text-decoration: none;
-}
-
-
- .content_header_colored
-  /*colored title of the page used with content_header_large*/
- {
-	color: #676767;z
-	text-decoration: none;
-}
-
-
-.content_reference
-/*fornt for reference, eg. "see ...."*/ 
-{
-	font-style : italic;
-	font-size: 1em;
-}
-
- .content_right
-  /*floating table on the right of the content*/
-{
-	float : right;
-	margin-left : 5px;
-	margin-right : 10px;
-	margin-top : 10px;
-	width: 172;
-}
-
- .content_right_table
- /*inner table of content_right*/
-{
-	width: 100%;
-}
-
-
- .content_small
- /*smaller font than content_basic*/
-{
-	font-family : arial, helvetica, sans-serif;
-	font-size : .9em;
-	text-decoration : none;
-}
-
-
- .content_small_colored
- /*small blue font*/
-{
-	color : #999999;
-	font-family : arial, helvetica, sans-serif;
-	font-size : .9em;
-}
-
-
- .content_small_colored_2
- /*date in rating bar*/
-{
-	color: #336699;
-	font-family : arial, helvetica, sans-serif;
-	font-size : .9em;
-	font-weight: 400;
-	text-decoration : none;
-}
-
-
-.content_small_colored_3
-/*average in rating bar*/
-{
-	color: #336699;
-	font-family : arial, helvetica, sans-serif;
-	font-size : .9em;
-}
-
-
-.content_emphasis
-/*bold font*/
- {
-	font-weight : 600;
-	font-size : .9em;
-}
-
-
-.content_subheader
-/*bold font bigger than content_basic*/
-{
-	font-family: arial, helvetica, sans-serif;
-	font-weight: bold;
-	font-size : 1em;
-}
-
-
-.content_subheader_2
-/*black content title in containers*/
-{
-	color: #000000;
-	font-size: 1em;
-	font-weight: 500;
-}
-
-
-.discussion_content
-/*black texts in tables*/
-{
-	color: 000000;
-	font-size: .9em;
-	margin-left: 5px;
-}
-
-
-
-.discussion_content_emphasis
-/*bold texts in tables*/
-{
-	color: 000000;
-	font-size: .9em;
-	margin-left: 5px;
-	font-weight : 600;
-}
-
-
- .discussion_description
- /*black texts in tables for descriptions*/
- { 
-	color: 666666;
-	font-size: .9em;
-	margin-left: 5px;
-  }
-
-
-.editornote
-/*not used*/
- { 
-  font-style: italic
- }
- 
- /*the following two classes are used expressly in the knowledge_announcements_view*/
- 
- .floatclear
-{
-	padding: 5px;
-	padding-bottom: 0px;
-	padding-right: 0 px;
-	width: 100%;
-}
-
-.floatgrey
-{
-	background-color: #efefef;
-	padding: 5px;
-	width: 65px;
-}
-
-
-.footnote
-/*foot note at the bottom of content */
-{ 
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
- }
-
-
-.foot_starindex
-/*the * symbol indicate the required field */
-{
-	color : cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-
-.foot_description
-/*
-colored font
-description about the user status. eq. "subscriptions are updated"
-it's usually on the upper part of the pages
-*/
-{
-	color : #ff6500;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-
-.foot_text
-/*the descriptions for * symbol , eg. required field*/
-{
-	color: #b4b4b4;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-
-.foot_title
-/*foot index aside the page header, eg. * symbol */
-{
-	color : #ff6500;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-}
-.formfield_desc 
-/*form object description or instruction*/
-{
-color: #333333; 
-font-family: arial, helvetica, sans-serif; 
-font-size: 1em; 
-font-weight : 400; 
- font-style: italic
-}
-.formfield_title
-/*form object title*/
-{
-	font-family: arial, helvetica, sans-serif;
-	font-weight: bold;
-	font-size : 1em;
-}
-.flowchart
-/*not used*/
-{  
-	font-size: 8pt; color: #666666
-}
-
-.grey_dark
-/*dark grey cell background*/
- {
-	background-color: #cccccc;
-}
-
-.grey_medium
-/*medium grey cell background*/
- {
-	background-color: #dedede;
-}
-
-.header_discussion_link
-/*
-same as menubar_link
-white font for the text in the table header, usually in the 1nd level of the table header if there are 2
-1st level: regular 
-2nd level: bold
-*/
- {
-	color: 	ffffff;
-	font-size: 0.9em;
-}
-
-.header_discussion_linkdk
-{
-	color: 	000000;
-	font-size: 0.9em;
-}
-
-.header_discussion_title
-/*
-table titles
-white bold font for the text in the table header, usually in the 2nd level of the table header if there are 2
-1st level: regular 
-2nd level: bold
-*/
- {
-	color: ffffff;
-	font-size: .9em;
-	font-weight: 600;
-	margin-left : 5px;
-}
-
-
-.headerb
-/*not used*/
-{
-    color: #ff6600;
-    font-family: arial,verdana,helvetica,sans-serif;
-    font-size: 12pt;
-    font-weight: bold;
-}
-
-
-.header_of_container
-/*colored font for the title of the container eg. Feature*/
-{
-	color: #cd3301;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 1em;
-	font-weight: bold;
-	text-decoration : none;
-}
-
-
-.header_colored
-/*colored header in login page*/
-{
-	color: #cc3300;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 1em;
-	font-weight: bold;
-}
-
-
-.header_of_article
-/*colored article header*/
-{
-	color: #cd3301;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 1.23em;
-	font-weight: bold;
-}
-
-.header_of_article2
-/*article header*/
-{
-	color: #333333;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 18px;
-	font-weight: 500;
-}
-
-.subhead1_of_article2
-/*article second level head*/
-{
-	color: #333333;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 13px;
-	font-weight: bold;
-}
-
-.subhead2_of_article2
-/*article third level head*/
-{
-	color: #336699;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 13 px;
-	font-weight: bold;
-	margin-bottom: 5px;
-}
-
-.subhead3_of_article2
-/*article 4th level head*/
- {
-	font-weight : 600;
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-}
-
-.header_of_steps
-/*fornt for steps title in forms*/
-{ 
-	color: #a4a4a4;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12pt;
-	font-weight: 600;
-}
-
-
-.header_of_sitemap
-/*header of sitemap page*/
-{
-	color: #6699cc;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12pt;
-	font-weight: 600;
-	text-decoration : none;
-}
-
-
-.header_of_sitemap:hover
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12pt;
-	font-weight: 600;
-	text-decoration : none;
-}
-
-
-.header_of_table
-/*header of tables in content usually has a background color assigned to the cell*/
-{
-	color: #ffffff;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 14px;
-	font-weight: bold;
-}
-
-.header_right
-{
-	color: 000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 12px;
-	font-weight: 800;
-}
-
-.imagecaption
-/*image caption in content page*/
-{ 
- font-size: 9pt; color: #003366
- }
-
-
-.sidebar 
-/*not used*/
-{  
-	background-color: #f4f4f4;
-}
-
-
-input
-/*font size setup shown in the input box which is inherited by inputXX*/
-{
-	font-size: 11px;
-	font-family : Arial, Helvetica, sans-serif;
-}
-
-
-input.input25
-{
-    width: 25px
-}
-
-
-input.input45
-{
-    width: 45px
-}
-
-
-input.inputmax50
-/*
-1,business standard multiline input box 
-2,this style only activate in IE, but NS
-*/
-{
-	width: 360px;
-}
-
-
-input.input85
-{
-    width: 85px
-}
-
-
-input.input135
-{
-    width: 135px
-}
-
-
-input.input155
-{
-    width: 155px
-}
-
-
-input.input230
-{
-    width: 230px
-}
-
-
-input.input305
-{
-    width: 305px;
-}
-
-
-.menubar
-/*
-white font for the text in the table header, usually in the 1nd level of the table header if htere are 2
-1st level: regular 
-2nd level: bold
-*/
-{
-	color: #ffffff;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight: 400;
-	text-decoration: none;
-}
-
-
-.menubar:hover
-{
-  color: #ffffff
-}
-
-
-.menubar_bg
-/*background of table header*/
-{   
-background-color:#003366; 
-}
-
-
-.menubar_emphasis
-/*
-1,bold font for the last item of the breadcrumbs
-2,bold font of table header with menubar_bg(blue) as background color 
-3,bold text on colored background eg. Logged In
-*/
-{
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
-}
-
-.menubar_emphasisdk
-
-{
-  color: #000000;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
-}
-
-
-.midbar_bg
-/*the light point above the tabs */
-{
-	background: #ffffff;
-}
-
-
-.midbar_dark
-/*dark color between tabs*/
-{ 
-	background: #003366;
- }
-
-
-.midbar_light
-/*
-1,light color on the left hand side of the tabs
-2,light color above tabs
-*/
-{ 
-	background: #3399cc;
- }
-
- 
- .midbar_medium
- /*background  of  tabs*/
-{ 
-	background: #006699;
- }
-
-/*shadow color between tabs*/
- .midbar_shadow
-{
-	background: #666666;
-}
-
-
-.page_number
-/*font for the numbers in pagination library*/
-{
-	color: #676767;
-	font-weight : 400;
-}
-
-
-.page_steps
-/*font for previous & next in pagination*/
-{ 
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration: none;
- }
-
-
- .pageheader
- /*same as content_header_large*/
-{
-	color: #006699;
-	font-family : arial, helvetica, sans-serif;
-	font-size: 115%;
-	font-weight : 600;
-	text-decoration: none;
-}
-
-
- .pageheader_colored
- /*colored title of the page used with content_header_large*/
-{
-    color: #999999;
-	font-family: arial, helvetica, sans-serif;
-    font-size: 16pt;
-    font-weight: 400;
-}
-
-.popup_border
-{
-	background: #f0f0f0;
-	border : thin solid cccccc;
-	padding : 2px;
-}
-
-.popup_text
-{
-	color: #333333;
-	font : 11px;
-	text-decoration : none;
-}
-
-.popup_text : active
-{
-	color: #cc0000;
-}
-
-.popup_text : hover
-{
-	color: #cc0000;
-}
-
-.project_menu_border1
-/*project explorer menu options background style in left nav*/
- {
-	border-top : 1px solid #cccccc;
-	border-right : 1px solid #cccccc;
-	background : #efefef;
-}
-.project_menu_topborder
-/*project explorer menu options background style in left nav*/
- {
-	border-top : 1px solid #cccccc;	
-	background : #efefef;
-}
-.project_nav
-/*field titles for project explorer menu located in left nav*/
-{
-	color: #006699;
-	font-family : arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-select
-/*font size setup shown in the select box which is inherited by inputXX*/
-{
-	font-size: 11px;
-	font-family : Arial, Helvetica, sans-serif;
-}
-
-
-select.input25
-{
-    width: 25px
-}
-
-
-select.input45
-{
-    width: 45px
-}
-
-
-select.input85
-{
-    width: 85px
-}
-
-
-select.input155
-{
-    width: 155px
-}
-
-
-select.input230
-{
-    width: 230px
-}
-
-
-select.input305
-{
-    width: 305px;
-}
-
-/* All shim classes are for spacing elements used to control layout, especially in older browsers that don't understand margins and padding */
-
-.shim3x1px
-{
-	font-size: 1px;
-	height : 1px;
-}
-
-a.sidemenu_header
-/*not used?*/
-{
-    color: #666666;
-    font-family: arial, helvetica, sans-serif;
-    text-decoration: none;
-    font-weight: bold;
-}
-
-
-a.sidemenu_header:hover
-/*not used?*/
-{
-  color: #cc0000
-}
-
-
-.sidemenu_boldleft
-/*
-1,bold font for the items in search container
-2,bold lefNav unselected
-*/
-{
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_boldleft_selected
-/*bold font lefNav selected*/
-{
-	color: #CC0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_boldright
-/*
-1,bold font for the items in right hand side
-2,same as sidemenu_boldright
-*/
-{
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_boldright:hover
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_boldright_coursecatalog
-/*not used*/
-{
-	color: #639602;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 600;
-	text-align: right;
-}
-
-
-.sidemenu_standard
-/*leftNav stadard*/
-{
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-
-.sidemenu_standard_selected
-/*leftNav selected*/
-{
-	color: #CC0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-
-
-td
-{
-	font-family: arial, helvetica, sans-serif;
-	font-size: 75%;
-}
-
-
-
- td.bg_discussion_1
- /*same as grey_medium*/
-{
-	background-color: #dedede;
-}
-
-
-td.bg_discussion_2
- /*same as grey_light*/
-{ 
-	background-color: #efefef;
- }
- 
-td.content_cell
-/*for eliminate table structure & keep the cellpadding in content*/
- {
-	padding: 5px;
-}
-
-
-td.divider
-/*thin line divide the page columns*/
- {
-	background-color: #f6f9f0;
-}
-
-td.divider2
-/*thin line divide the page columns - used in the viewframe frame page*/
- {
-	background-color: #cccccc;
-}
-
-
-.grey_dark
-/*dark grey cell background*/
- {
-	background-color: #cccccc;
-}
-
-td.grey_medium2
-/*medium grey cell background w/ cell padding*/
- {
-	background-color: #dedede;
-	padding: 5 px;
-}
-
-td.grey_light2
-/*light grey cell background w/ cell padding*/
- {
-	background-color: #efefef;
-	padding: 5px;
-}
-
-.grey_light
-/*light grey cell background*/
- {
-	background-color: #efefef;
-}
-
-
-td.cellcolor_light
-/*light cell background color for specific color scheme*/
- {
-	background-color: #99cc00;
-}
-
-
-td.cellcolor_dark
-/*dark cell background color for specific color scheme*/
-{
-	background-color: #639c00;
-}
-
-
-td.cellcolor_white
-/*white cell background color*/
- {
-	background-color: #ffffff;
-}
-
-
-td.sidemenu_bullet_colored
-/*bullet color for the leftNav*/
- {
-	background-color: #cd3301;
-}
-
-
-td.sidemenu_bullet_grey
-/*grey bullet color for the leftNav*/
- {
-	background-color: #999999;
-}
-
-
-textarea
-/*font size setup shown in the multiline textarea which is inherited by inputXX*/
-{
-	font-size: 11px;
-	font-family : Arial, Helvetica, sans-serif;
-}
-
-
-textarea.textarea45
-{
-    width: 45px
-}
-
-
-textarea.inputmax50
-/*
-1,business standard multiline input box 
-2,this style only activate in IE, but NS
-*/
-{
-	width: 360px
-}
-
-
-textarea.input190
-{
-    width: 190px
-}
-
-
-textarea.input230
-{
-    width: 230px
-}
-
-
-textarea.input350
-{
-    width: 350px
-}
-
-
-.topbar_separator
-/*separator of the topNav*/
-{
-  color: #cc3300;
-  font-family: arial, helvetica, sans-serif;
-  font-size: .9em;
-  text-decoration: none;
-}
-
-
-.topline_color
-/*the thin color line on the top of the browser window*/
-{ 
-	background: #006699;
- }
- 
- /* borrowed styles from common.css to be trimmed later */
- 
- .topframebg 
-{  background-color: #d2d2d2
-}
-
-.topframebglight 
-{  
-background-color: #b6b5b5
-}
-
-.topframebgdark 
-{  
-background-color: #848484
-}
-
-.topframebglight2 
-{ 
- background-color: #efefef
- }
-   
- .topframelogobg 
-{  
-background-color: #006699
-}
-
-.topleftnav
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-.topleftnavbold 
-{ 
-font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 10px; 
-text-decoration: none; 
-font-weight: bold;
-}
-
-.toprightnav
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #ffffff;
-	text-decoration: none;
-}
-
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
-.verticalblue
- { 
- background: #3399cc 
- }
-
- .whitebg
-{ 
- background-color: #ffffff;
- }
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_ie5ns4.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_ie5ns4.css
deleted file mode 100644
index adc50fb..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_ie5ns4.css
+++ /dev/null
@@ -1,1190 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*must add font type if class is being used as a link as well as no-link*/
-
-a {	
-	color: #336699;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} /* font for action on content page usually located on top of page ;ie., select all*/
-a.action {  
-	color: #333333;
-	font-size: 11px;	
-} 
-
-a.actionselector {
-   
-	color: #000000;
-	font-size: 11px;
-}
-
- /* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-a.activetab { 
- 	color: #000000;
- 	font-size: 12px;
-  	text-decoration: none;
-}
-
- /* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-a.activetabselected { 
- 	color: #2c2c2c;
- 	font-size: 12px;
-  	text-decoration: none;
-}
-
-a.basic { 	
-    color: #000000;
-}
-
-/* for non-image buttons, for internationalization */
-a.button {
-	color: #333333;
-	text-decoration: none;
-}
-
-a.button:active {
-	color: 333333;
-	text-decoration: none;
-}
-
-/* for non-image buttons, for internationalization */
-a.button:hover {
-	color: 333333;
-}
-
-/* for non-image buttons in Multisite, for internationalization */
-a.button2 {
-	color: #000000;
-	font-size : 11px;
-	text-decoration: none;	
-}
-
-/*main container  actions/links for editing*/
-a.conlinkedit {
-	text-decoration : none;
-	font-size : 11px;
-}
-
-a.copyright { 	
-	color : #999999;
-	font-size : 10px;
-} 
-
-a.formtblhead {
-   background-color: #cccccc;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-/* light coloured heading link for discussion and similar uses - was header_discussion_link in previous versions */
- a.headerlinklight {
-	color: 	ffffff;
-	font-size: 0.9em;
-	text-decoration: none;
-}	
-
-/*bold link, ie, advanced search link in pe*/
-a.linkfuncoption {  	
-	font-size: 11px;
-	font-weight: 600;
-}
-
- a.navtree { 	
-    color: #000000;
-	font-size : 11px;
-	font-weight: 600;
-	text-decoration: none;
-} 
-
-/*navtree item or doc, nodes that don't expand*/
-a.navtreeitem { 	
-    color: #000000;
-	font-size : 11px;
-	text-decoration: none;
-} 
- 
- /* simple mechanism to turn text decoration off */  
-a.noline {
- 	text-decoration: none;
- }
-
-a.popuptext {	
-   color: #333333;
-	font-size: 11px;	
-	text-decoration: none;
-}
-
-a.poptext {
-	color: #333333;
-	font : 11px;
-	text-decoration: none;
-}
-
-a.popuptext: active {
-	color: #cc0000;
-}
-
-
-a.small {	
-	font-size: 11px;	
-}
-
-a.smallb {	
-   color: #000000;
-	font-size: 11px;	
-}
-
-a.topbar {
-  color: #666666;
-  font-size: 11px;
-  text-decoration: none;
-}
-
-/*used as highlighted description above tables*/
-.accentcolor {
-	color : #cc3300;
-	font-weight : 600;
-}
-
- /* bgcolor  for action text usually located on top of page;ie., select all*/
-.actionbg { 
-	background-color: #efefef;
-}
-
-.actionselector {
-   background-color: #e9e9e9;
-	color: #000000;
-	font-size: 11px;
-}
-
-.actionselectordis {
-background-color: #e9e9e9;
-	color: #cccccc;
-	font-size: 11px;
-	text-decoration: none;
-}
-
-b { 
-   font-weight : bold;
- }
-  
-.baselineitalics {
-	color: #666666;
-	font-size: 11px;
-	text-decoration: none;
-}
-
-.bgblack { 
-	background-color: #000000;
- }
- 
- /* basic column background colour for discussions, files, other such tabulated data */
-.bgcolumnbasic { 
-	background-color: #efefef;
- }
- 
-.bgwhite { 
-	background-color: #ffffff;
- } 
- 
-/* size input for basic tags such as p and li that do not inherit from td */ 
-body {
-	background-color : #ffffff;   
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	text-decoration : none;		
-	margin-left: 0px;
-	margin-right: 0px;
-	margin-top: 0px;	
-}
-
-.bold { 
-   font-weight : 600;
- }
-
-.bordergray { 
-	background-color: #e9e9e9;
- }
-
-.bottombardark { 
-	background-color: #003366;
- }
-  
-.bottombarlight { 
-	background-color: #3399cc;
- }
-
-.bottombarshadow { 
-	background-color: #000000;
- }
-
-.breadcrumbs{ 
-color: #336699;
-font-weight: 600;
- }
-
-.breadcrumbs2{ 
-color: #ffffff;
-font-size: 11px;
- } 
-
-/*navigation buttons, not form buttons*/ 
-.buttons {
-    background-color: #efefef;
-    color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 10px;
-	text-decoration: none;	
-}
-
-/*active navigation button, not form buttons*/ 
-.buttonon {
-    background-color: #dedede;
-    color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 10px;
-	text-decoration: none;	
-} 
-
-/* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-.buttontxt {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.code { 
-   font-family: Courier New, Courier, mono;   
-   font-size: 12px;
- }
- 
-  /* font for regular content text */
-.comments { 	
-	font-size: 11px;	
-	background-color: #efefef;
-}
-
-/*main container header*/
-.conhead { 
-color: #cc3300;
-font-weight: 600;
-text-decoration : none;
- }
- 
- /*main container data labels*/
-.conlabel { 
-background-color: #efefef;
- } 
- 
-/*main container data labels in bold*/
-.conlabelbold { 
-background-color: #e1e1e1;
-font-weight: bold;
- }  
- 
-/*replacing sidemenu_boldright moving forward*/
-.conrbold {
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-/*header for right hand container*/
-.conrhead {
-	color: 000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 12px;
-	font-weight: 800;
-}
-
-/*main container table header*/
-.contblhead {  
-   background-color: #cccccc;
-	color: #333333;	
-	font-size: 11px;	
-    font-weight: 600;
-}
-
-.content{ 
-font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
- }
-
- /*medium grey cell background*/
-.contentborder {
-	background-color: #dedede;
-}
-
-/* added for text representing disabled functions. */
-.contentdisabled {
-	color: #cccccc;
-}
-
-/* font for bold text */
-.contentemphasis {
-	color: #000000;
-	font-weight : 600;
-}
-
-/* used text reminding user that there is required content */
-.contentrequired {
-	color: #b4b4b4;
-	font-weight: 500;
-}
-
-.copyright { 
-color : #999999;
-	font-size : 10px;
-}
-
-/*black copyright*/
-.copyrightb { 
-color : #000000;
-	font-size : 10px;
-}
-
-dd { 
-font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
-margin-left: -1px;
- }
- 
-.dialgbxshadow2 {  
-	background-color: #848484;
-}
-
-.dialogueboxbg {  
-	background-color: #d2d2d2;
-}
-
-/*background for login pages*/
-.dialogueboxbg2 {  
-	background-color: #999999;
-}
-
-.dialogueboxborder { 
-	background-color: #333333;
- }
- 
-.dialogueboxhighlight {
-	background-color: #efefef;
-}
-
- .dialogueboxmedium { 
-	background-color: #8b8b8b;
- }
- 
- .dialogueboxtitle {	   
-	font-size: 14px;
-	font-size: 11px;	
-	font-weight : bold;
-}
-
-/*text for disabled buttons*/
-.disable{ 
-color: #999999;
-font-family: verdana, helvetica, arial, sans-serif;
-font-size: 11px;  
-	font-weight: 600;
-	text-decoration: none;
- }
- 
-div{ 
-font-family: arial, helvetica, sans-serif;
- } 
- 
-/*used to affect right margin*/ 
-div.marginrt{ 
-	clear: right;
-	float: right;
-	width: 7px;
- }  
- 
-div.margins { 
-float: left;
-margin-left: 7px;
-margin-top: 25px;	
-margin-right: 7px;
- }   
-
-/*for pages with button navigation on top*/ 
-div.margins20 { 
-float: left;
-margin-left: 7px;
-margin-top: 20px;	
-margin-right: 7px;
- }    
- 
- /*adds 10 px padding*/
- div.pad10{ 
- padding: 10px; 
-  }
-
-.divider {
-	background-color: #f6f9f0;
-}
-
-dl{  
-font-family: arial, helvetica, sans-serif;
-font-size: 12px;   
-	}
-
-/*removes default bottom margin, doesn't work in NS4.7x */ 
-dl.data { 
-margin-bottom: -1px;
- }  
-
-.docbold {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 11px;       
-	font-weight : 600;
-}
-
-/*for applet download splash page*/
-.download{ 
-background-color: #efeeee;
- }
-
-.errormsg {
-	color : #cc0000;	
-} 
- 
-/*
-colored font
-description about the user status. eq. "subscriptions are updated"
-it's usually on the upper part of the pages
-*/
-.footerbold {
-	color : #a4a4a4;
-	font-size: 90%;
-	font-weight: 600;
-}
-
-/*the * symbol indicate the required field */
-.footerboldcolored {
-	color : #ff6500;
-	font-size: 90%;
-	font-weight: 600;
-}
-
-.footindicator {
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 11px;       
-	text-decoration: none;
-}
-
-/*the * symbol indicate the required field */
-.footstarindex {
-	color : #cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-/*move to design_pe*/
-.formlabel {
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-.formtblhead {
-   background-color: #cccccc;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-.greymedium {
-	background-color: #dedede;
-}
-
-.grayfold {
-	color: #cccccc;	
-	text-decoration: none;
-	font-size: 15px;
-}
-
-/*Note: remove this note if using this style or will be deleted*/
-	/* Currently used in cq_deflect_login_err.html - should be renamed to something that has less descriptive name */
-.headerblue {
-	color: #006699;	
-	font-weight : 600;
-	text-decoration: none;
-}
-
-/*used in cc for frameset display*/ 
-.headerinframes {  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10px;	
-	font-weight: 600;
-	margin-bottom: 2px;
-	margin-top: 0px;
-}
-
- /*font for page header except for article pages, (see header_of_article)*/
-.headerlarge {
-	color: #333333;
-	font-size: 160%;
-	font-weight : 400;
-	text-decoration: none;
-}
-
-/*main header for frame navigation, ie, clearcase merge files*/
-.headermain {  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 17px;	
-	font-weight: 600;
-}
-
-/* header element for form tables containing mid-size fixed height text */
-.headermedlist {
-	font-size: 11px;
-}
-
-/*fornt for steps title in forms*/
-.headerofsteps { 
-	color: #666666;
-	font-size: 17px;
-	font-weight: bold;
-}
-
-.headerofstepsnon { 
-	color: #666666;
-	font-size: 17px;
-	font-weight: bold;
-	text-decoration: none;
-}
-
-/*use header1 instead*/
-.h1 {  
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;	
-	font-weight: 800;
-}
-
-/*to replace h1 and contentheader large*/
-.header1 {  
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;	
-	font-weight: 800;
-}
-
-/*document root folder*/
-.h1root{  
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;	
-	font-weight: 400;
-}
-
-
-/*used in cc, cq, sl*/ 
-h1 {  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 17px;	
-	font-weight: 600;
-}
-
-//*use header2 instead*/
-.h2 { 
-	font-family: arial, helvetica, sans-serif;
-	font-size: 19px;
-	font-weight: 400;	 	
-}
-
-/*headers within page*/
-.header2 { 
-	font-family: arial, helvetica, sans-serif;
-	font-size: 19px;
-	font-weight: 400;	 	
-}
-
-i {
-	font-style : italic;
-}
-
-.iconborder { 
-	background-color: #dedede;
-}
-
-/*font size setup shown in the input box which is inherited by inputXX*/
-input {
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-} 
-
-input.input135 {
-	width: 135px
-} 
-
-/* 1,business standard multiline input box 
-2,this style only activate in IE */
-input.max50 {
-	width: 360px;
-}
-
-input.px25 {
-    width: 25px;
-}
-
-input.px45 {
-    width: 45px;
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE
-*/
-input.px85 {
-    width: 85px;
-}
-
-input.px135 {
-    width: 135px;
-}
-
-input.px155 {
-    width: 155px;
-}
-
-input.px230 {
-    width: 230px;
-}
-
-input.px305 {
-    width: 305px;
-}
-
-.leftmenu {
-	background-color: #999999;
-}
-
-.leftmenubullet { 
-background-color: #999999;
- }
-
-.leftmenubulletactive { 
-background-color: #cd3301;
- }
-	
-
-.leftnavhead {
-	color: #000000;
-	font-size: 13px;	
-	font-weight: bold;	
-} 
-
-.leftnavlabel {
-color: #000000;
-font-weight : 600;
-font-size: 11px;
- }
-
-.lightgray { 
-background-color: #e4e4e4;
- }
- 
-.menubar {
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 400;
-  text-decoration: none
-}
-
-/*menubar within top of content page  */
-.menubarmid{ 
-font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
- }
-
-/*
-1,bold font for the last item of the breadcrumbs
-2,bold font of table header with menubar_bg(blue) as background color 
-3,bold text on colored background eg. Logged In
-*/
-.menubaremphasis {
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
-}
-
-.menubar:hover {
-  color: #ffffff
-} 
- 
-.midbarbg { 
-	background-color: #ffffff;
- } 
- 
-/*topnav*/ 
-.midbarlight { 
-	background-color: #3399cc;
- }
- 
-/*dark color between tabs*/
- .midbardark { 
-	background: #003366;
- }
- 
- /*topnav*/ 
- .midbarmed { 
-	background-color: #006699;
- }
- 
- /*background  of  tabs*/ 
- .midbarmedium { 
-	background: #006699;
- }
- 
- .midbarshadow { 
-	background-color: #666666;
- } 
-  
-/*replacing sidemenu_boldleft moving forward*/
-.navleftbold {
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-/*left nav submenu*/
-.navleftsub {
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
- 
-/* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-.nonactivetab {
-	color: #b4b4b4;
-	font-size: 12px;
-	text-decoration: none;
-}
-
-/*notes/ description of icon */
-.notes{  
- font-size: 11px;
- font-weight : 400;	
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
-}
-
-.pagebold { 
-	color: #000000;
-	font-weight : 600;	
- }
- 
-/*font for the numbers in pagination library*/
- .pagenumber {
-	color: #676767;
-	font-weight : 400;
-}
-
- /*font for previous & next in pagination*/
-.pagesteps { 
-	color: #676767;	
-	font-size: 11px;
-	text-decoration: none;
- }
-
-.pop {
-	font-family: arial, helvetica, sans-serif; 
-	font-size : 12px;
-	font-weight : 200;
-	text-decoration: none;
-}
-
-.popbackground {
-
-	background: #d6d3ce;
-}
-
-.poph1 {
-	font-size: 16px;
-	font-weight : bold;
-}
-
-.popleftmenu {
-	background: #f0f0f0;
-	border: thin solid cccccc; 
-	left: 210px; 
-	padding: 2px;
-	position:absolute; 
-	top: 25px;
-	visibility: hidden; 
-	width:75px;
-	z-index:10;	
- }
-
- /* use popleftmenu instead of this one*/
-.popupborder {
-	background: #f0f0f0;
-	border : thin solid cccccc;
-	padding : 2px;
-}
-
-.popuptext {	
-   color: #333333;
-	font-size: 11px;	
-	text-decoration: none;
-}
-
-.projectatt { 
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 12px; 
-	font-weight: 600;
-	text-decoration: none; 
-	color: #cd3301;
-}
-
-/*date associated with article ratings*/
-.ratingsdate
-{
-	color: #336699;
-	font-size : 11px;
-	text-decoration : none;
-	text-align: right;
-}
-
-select {
-    font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-}
-
-select.selpx144 {
-    width: 144px;
-}
-
-/* .sidemenu_boldleft replace with .leftmenubold*/ 
-
-/* .sidemenu_boldleft_selected replace with .leftmenuactive*/
-
-/* .sidemenu_bullet_colored replace with .leftmenubulletactive*/
- 
-/*.sidemenu_bullet_grey replace with leftmenubullet*/
-
-.sidemenuboldleft {
-	color: #000000;	
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-} 
-
-.sidemenuboldleftselected {
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-.sidemenustandard {
-	color: #676767;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.sidemenustandardselected {
-	color: #cc0000;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.smalltext {
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-	color: #000000;
-}
-
-.tableheader { 
-
-	color: #000000;	
-	font-size: 13px;	
-    font-weight: bold
-}
-
-
-/* font for regular content text */
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
-}
-
-/* because of an intervening link tag, text options were attached to a similar element for links */
-td.activetab { 
- 	background-color: #c4c4c4;
-  }
- 
-/* because of an intervening link tag, text options were attached to a similar element for links */
-td.activetabselected { 
- 	background-color: #dddddd;
-  }
-  
- /* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-td.buttonbody {
-	background-color: #d4d4d4;
-}
-
-td.buttonhighlight {
-	background-color: #ffffff;
-}
-
-td.buttonshadow {
-	background-color: #6d6d6d;
-}
- 
-/* design element rarely used for line colour in certain decorative tables */
-td.design1 {
-	background-color: #d4d4d4;
-}
- 
-/*design element simulating a dimensional boundary to a table */
-td.dividerdimens {
-	background-color: #bdbdbd;
-}
- 
- /* because of an intervening link tag, text options were attached to a similar element for links */
-td.nonactivetab {
-	background-color: #efefef;
-}
-
-/* data within a table highlighted in gray*/
-td.tblhighlt { 
-   background-color: #dedede;
-   padding: 2px;
- }
- 
- td.tblhighlt1 { 
-   background-color: #dedede;
- }
- 
-/* data within a table highlighted in light gray*/
-td.tblhighlt2 { 
-   background-color: #efefef;
- } 
-
-/*dark grey cell background and bold text */
-.tddarkbold {
-	background-color: #cccccc;	
-	font-weight : 600;
-}
-
-.tdlight {
-	background-color: #efefef;
-	padding: 2px;
-}
-
-.tdlight1 {
-	background-color: #efefef;
-}
- 
- 
-textarea {
-    font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-}
-
-textarea.px380{
- width: 380px; 
- }
-
-.texterrormsg {
-	color : cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 110%;
-	font-weight: bold;
-}
-
-.textgray {  
-	color: #999999;	
-}
-
-.topbardivider { 
-	background: #3399cc 
-}
-
-.topbardividergreyed { 
-	background: #add6eb
- }  
-
-.topbarseparator {
-  color: #cc3300;  
-  font-size: 11px;
-  text-decoration: none;
-} 
- 
-.topframebg {
-	background-color: #d2d2d2;
-}
-
-.topframebggreyed {
-	background-color: #ededed;
-}
-
-.topframehighlight {  
-	background-color: #b6b5b5;
-}
-
-.topframehighlightgreyed {  
-	background-color: #e1e1e1;
-}
-
-.topframehighlight2 { 
-	background-color: #efefef;
-}
-
-.topframehighlight2greyed { 
-	background-color: #f9f9f9;
- } 
- 
-.topframelogobg {  
-	background-color: #006699;
-}
-
-.topframelogobggreyed {  
-	background-color: #99c2d6;
-}
-
-.topframeshadow {  
-	background-color: #848484;
-}
-
-.topframeshadowgreyed {  
-background-color: #cecece;
-}
-
-.topleftnav {	
-    color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-.topleftnavbold { 
-	font-family: verdana, brial, helvetica, sans-serif;
-	font-size: 10px; 
-	font-weight: 600;
-	text-decoration: none; 
-}
-
-.topleftnavboldgreyed { 
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif; 
-	font-size: 10px; 
-	font-weight: bold;
-	text-decoration: none; 
-}
-
-.topleftnavgreyed {	
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-	}
-
-.toplinecolor { 
-	background-color: #006699;
- }	
-	
-.toprightnav {
-	color: #ffffff;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
- /* this was initially declared the same colour as the class topframe bg but because it lies in a different functional area, has been recreated here  */
-tr.bgmidframe {
-	background-color: #d2d2d2;
-}
-
-td.sidemenubulletgrey {
-	background-color: #999999;
-}
-
-
-td.sidemenubulletcolored {
-	background-color: #cd3301;
-}
-
-/*list-style-image: url(images/downbutton.gif);*/
-ul {	
-	list-style-type: square;
-}
- 
-
-.vob {
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 150%;
-	color: #006699;
-	text-decoration: none;
-	font-weight: 400;
-}
-
-.vobbottom {
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 14px;
-	text-decoration: none;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_ie6ns6.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_ie6ns6.css
deleted file mode 100644
index 40dc46d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_ie6ns6.css
+++ /dev/null
@@ -1,1184 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*must add font type if class is being used as a link as well as  no-link */
-
-a {	
-	color: #336699;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} /* font for action on content page usually located on top of page ;ie., select all*/
-a.action {  
-	color: #333333;
-	font-size: 11px;	
-} 
-
-a.actionselector {  
-	color: #000000;
-	font-size: 11px;	
-}
-
-/* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-a.activetab { 
- 	color: #000000;
- 	font-size: 12px;
-  	text-decoration: none;
-}
-
-/* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-a.activetabselected { 
- 	color: #2c2c2c;
- 	font-size: 12px;
-  	text-decoration: none;
-}
-
-a.basic { 	
-    color: #000000;
-}
-
-/* for non-image buttons, for internationalization */
-a.button {
-	color: #333333;
-	text-decoration: none;
-}
-
-a.button:active {
-	color: 333333;
-	text-decoration: none;
-}
-
-/* for non-image buttons, for internationalization */
-a.button:hover {
-	color: 333333;
-}
-
-/* for non-image buttons in Multisite, for internationalization */
-a.button2 {
-	color: #000000;
-	font-size : 11px;
-	text-decoration: none;	
-}
-
-/*main container  actions/links for editing*/
-a.conlinkedit
-{
-	text-decoration : none;
-	font-size : 11px;
-}
-
-a.copyright { 	
-	color : #999999;
-	font-size : 10px;
-} 
-
-a.formtblhead {
-   background-color: #cccccc;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-/* light coloured heading link for discussion and similar uses - was header_discussion_link in previous versions */
- a.headerlinklight {
-	color: 	ffffff;
-	font-size: 0.9em;
-	text-decoration: none;
-}	
-
-/*bold link, ie, advanced search link in pe*/
-a.linkfuncoption {  		
-	font-size: 11px;
-	font-weight: 600;
-}
-	
-a.navtree{ 	
-    color: #000000;
-	font-size : 11px;
-	font-weight: 600;
-	text-decoration: none;
-} 
-
-/*navtree item or doc, nodes that don't expand*/
-a.navtreeitem{ 	
-    color: #000000;
-	font-size : 11px;
-	text-decoration: none;
-} 
-
-/* simple mechanism to turn text decoration off */
-a.noline {
- 	text-decoration: none;
- }
-
-a.popuptext {	
-   color: #333333;
-	font-size: 11px;	
-	text-decoration: none;
-}
-
-a.poptext {
-	color: #333333;
-	font : 11px;
-	text-decoration: none;
-}
-
-a.popuptext:active{	
-color: #cc0000;
-}
-
-a.small {	
-	font-size: 11px;	
-}
-
-a.smallb {	
-   color: #000000;
-	font-size: 11px;	
-}
-
-a.topbar{
-  color: #666666;
-   font-size: 11px;
-  text-decoration: none;
-} 
-
-/*used as highlighted description above tables*/
-.accentcolor {
-	color : #cc3300;
-	font-weight : 600;
-}
-
- /* bgcolor  for action text usually located on top of page;ie., select all*/
-.actionbg { 
-background-color: #efefef;
-}
-
-.actionselector {
-   background-color: #e9e9e9;
-	color: #000000;
-	font-size: 11px;
-}
-
-.actionselectordis {
-background-color: #e9e9e9;
-	color: #cccccc;
-	font-size: 11px;
-	text-decoration: none;
-}
-
-b { 
-   font-weight : bold;
- }
- 
-.baselineitalics {
-	color: #666666;
-	font-size: 11px;
-	text-decoration: none;
-}
-
-.bgblack { 
-	background-color: #000000;
-}
-
- /* basic column background colour for discussions, files, other such tabulated data */
-.bgcolumnbasic { 
-	background-color: #efefef;
- }
- 
-.bgwhite { 
-	background-color: #ffffff;
- } 
- 
- /* size input for basic tags such as p and li that do not inherit from td */  
-body {
-	background-color : #ffffff;   
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	text-decoration : none;		
-	margin-left: 0px;
-	margin-top: 0px;
-}
-
-.bold { 
-   font-weight : 600;
- }
-
- .bordergray { 
-	background-color: #e9e9e9;
- }
- 
- .bottombardark{ 
-	background-color: #003366;
- }
- 
-.bottombarlight{ 
-	background-color: #3399cc;
- }
-
-.bottombarshadow{ 
-	background-color: #000000;
- }
-
-.breadcrumbs{ 
-color: #336699;
-font-weight: 600;
- } 
- 
-.breadcrumbs2{ 
-color: #ffffff;
-font-size: 11px;
- } 
-  
- /*navigation buttons, not form buttons*/ 
-.buttons {
-    background-color: #efefef;
-    color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;	
-	font-size: 10px;
-	text-decoration: none;	
-}
-
-/*active navigation button, not form buttons*/ 
-.buttonon {
-    background-color: #dedede;
-    color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 10px;
-	text-decoration: none;	
-} 
-
-/* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-.buttontxt {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 10px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.code { 
-   font-family: Courier New, Courier, mono;   
-   font-size: 12px;
-}
-
-/* font for regular content text */
-.comments { 	
-	background-color: #efefef;
-	font-size: 11px;	
-}
-
-/*main container header*/
-.conhead{ 
-color: #cc3300;
-font-weight: 600;
-text-decoration : none;
- }
-
- /*main container data labels*/
-.conlabel{ 
-background-color: #efefef;
- } 
-
-/*main container data labels in bold*/
-.conlabelbold { 
-background-color: #e1e1e1;
-font-weight: bold;
- }  
- 
-/*replacing sidemenu_boldright moving forward, use for links and non-links*/
-.conrbold
-{
-	color: #000000;	
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-} 
- 
- 
-/*header for right hand container*/
-.conrhead {
-	color: 000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 12px;
-	font-weight: 800;
-}
-
-/*main container table header*/
-.contblhead { 
-   background-color: #cccccc;
-	color: #333333;	
-	font-size: 70%;	
-    font-weight: 600;
-}
-
-.content{ 
-font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
- }
-
- /*medium grey cell background*/
-.contentborder {
-	background-color: #dedede;
-}
-
-/* added for text representing disabled functions. */
-.contentdisabled {
-	color: #cccccc;
-}
-
-/* font for bold text */
-.contentemphasis {
-	color: #000000;
-	font-weight : 600;
-}
-
-/* used text reminding user that there is required content */
-.contentrequired {
-	color: #b4b4b4;
-	font-weight: 500;
-}
-
-.copyright { 
-	color : #999999;
-	font-size : 10px;
-}
-
-/*black copyright*/
-.copyrightb { 
-color : #000000;
-	font-size : 10px;
-}
-
-dd { 
-font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
-margin-left: -1px;
- }
- 
-.dialgbxshadow2 {  
-	background-color: #848484;
-}
-
-.dialogueboxbg {
- 	background-color: #d2d2d2
-}
-
-/*background for login pages*/
-.dialogueboxbg2 {  
-	background-color: #999999;
-}
-
-.dialogueboxborder { 
-	background-color: #333333
- }
- 
-.dialogueboxhighlight {
-	background-color: #efefef;
-}
-
-.dialogueboxmedium { 
-	background-color: #8b8b8b
- }
- 
-.dialogueboxtitle {	   
-	font-size: 14px;
-	font-weight : bold;
-}
-
-/*text for disabled buttons*/
-.disable{ 
-color: #999999;
-font-family: verdana, helvetica, arial, sans-serif;
-font-size: 11px;  
-	font-weight: 600;
-	text-decoration: none;
- } 
-
- div{ 
-font-family: arial, helvetica, sans-serif;
- } 
-
-/*used to affect right margin*/ 
-div.marginrt{ 
-	clear: right;
-	float: right;
-	width: 7px;
- } 
- 
-div.margins { 
-float: left;
-margin-left: 7px;
-margin-top: 25px;	
-margin-right: 7px;
- }   
-
-/*for pages with button navigation on top*/  
-div.margins20 { 
-float: left;
-margin-left: 7px;
-margin-top: 20px;	
-margin-right: 7px;
- }   
-
- /*adds 10 px padding*/
- div.pad10{ 
- padding: 10px; 
-  }
-  
-.divider {
-	background-color: #f6f9f0;
-}
-
-dl{  
-font-family: arial, helvetica, sans-serif;
-font-size: 12px;   
-	}
-	
-/*removes default bottom margin, doesn't work in NS4.7x */  
- dl.data { 
-margin-bottom: -1px;
- } 
- 
-.docbold {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 11px;       
-	font-weight : 600;
-}
-
-/*for applet download splash page*/
-.download{ 
-background-color: #efeeee;
- }
- 
-.errormsg {
-	color : #cc0000;	
-}  
-
-/*
-colored font
-description about the user status. eq. "subscriptions are updated"
-it's usually on the upper part of the pages
-*/
-.footerbold {
-	color : #a4a4a4;
-	font-size: 90%;
-	font-weight: 600;
-}
-
-/*the * symbol indicate the required field */
-.footerboldcolored {
-	color : #ff6500;
-	font-size: 90%;
-	font-weight: 600;
-}
-
-.footindicator {
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 11px;       
-	text-decoration: none;
-}
-
-/*the * symbol indicate the required field */
-.footstarindex {
-	color : #cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-.formlabel {
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-.formtblhead {
-   background-color: #cccccc;
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-}
-
-.greymedium {
-	background-color: #dedede;
-}
-
-.grayfold {
-	color: #cccccc;	
-	text-decoration: none;
-	font-size: 15px;
-}
-
-/*Note: remove this note if using this style or will be deleted*/
-	/* Currently used in cq_deflect_login_err.html - should be renamed to something that has less descriptive name */
-.headerblue {
-	color: #006699;	
-	font-weight : 600;
-	text-decoration: none;
-}
-
-/*used in cc for frameset display*/ 
-.headerinframes {  
-	color: #333333;
-	font-size: 90%;
-	font-weight: 600;
-	margin-bottom: 2px;
-	margin-top: 0px;
-}
-
-
- /*font for page header except for article pages, (see header_of_article)*/
-.headerlarge {
-	color: #333333;
-	font-size: 160%;
-	font-weight : 400;
-	text-decoration: none;
-}
-
-/*main header for frame navigation, ie, clearcase merge files*/
-.headermain {  
-	color: #333333;
-	font-size: 17px;	
-	font-weight: 600;
-}
-
-/* header element for form tables containing mid-size fixed height text */
-.headermedlist {
-	font-size: 11px;
-}
-
-/*fornt for steps title in forms*/
-.headerofsteps { 
-	color: #666666;
-	font-size: 17px;
-	font-weight: bold;
-}
-
-.headerofstepsnon { 
-	color: #666666;
-	font-size: 16px;
-	font-weight: bold;
-	text-decoration: none;
-}
-
-/*use header1 instead*/
-.h1 {  
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;	
-	font-weight: 800;
-}
-
-/*to replace h1 and contentheader large*/
-.header1 {  
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;	
-	font-weight: 800;
-}
-
-/*document root folder*/
-.h1root{  
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 22px;	
-	font-weight: 400;
-}
-
-/*used in cc, cq, sl*/  
-h1 {  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 17px;	
-	font-weight: 600;
-}
-
-/*use header2 instead*/
-.h2 { 
-	font-family: arial, helvetica, sans-serif;
-	font-size: 19px;
-	font-weight: 400;	 	
-}
-
-/*headers within page*/
-.header2 { 
-	font-family: arial, helvetica, sans-serif;
-	font-size: 19px;
-	font-weight: 400;	 	
-}
-
-i {
-	font-style : italic;
-}
-
-.iconborder { 
- background-color: #dedede;
-}
-
-/*font size setup shown in the input box which is inherited by inputXX*/
-input {
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-} 
-
-/* 1,business standard multiline input box 
-2,this style only activate in IE */
-input.max50 {
-	width: 360px;
-}
-
-input.px25 {
-    width: 25px
-}
-
-input.px45 {
-
-    width: 45px
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE
-*/
-input.px85 {
-    width: 85px
-}
-
-input.input135 {
-	width: 135px
-}
-
-input.px135 {
-    width: 135px
-}
-
-input.px155 {
-    width: 155px
-}
-
-input.px230 {
-    width: 230px
-}
-
-input.px305 {
-    width: 305px;
-}
-
-
-.leftmenu {
-	background-color: #999999;
-}
-
-.leftmenubullet { 
-background-color: #999999;
- }
- 
-.leftmenubulletactive { 
-background-color: #cd3301;
- } 
- 
-.leftnavhead {
-	color: #000000;
-	font-weight: bold;	
-	font-size: 13px;	
-} 
-
-.leftnavlabel {
-color: #000000;
-font-weight : 600;
-font-size: 11px;
- }
-
- .lightgray { 
-background-color: #e4e4e4;
- }
-
-.menubar {
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 400;
-  text-decoration: none
-}
-
-
-.menubar:hover {
-  color: #ffffff
-} 
-
-/*menubar within top of content page  */
-.menubarmid{ 
-font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
- }
- 
-/*
-1,bold font for the last item of the breadcrumbs
-2,bold font of table header with menubar_bg(blue) as background color 
-3,bold text on colored background eg. Logged In
-*/
- .menubaremphasis {
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
-}
-
-.menubar:hover {
-  color: #ffffff
-} 
-
-.midbarbg { 
-	background-color: #ffffff;
- }
-  
-/*topnav*/ 
-.midbarlight { 
-	background-color: #3399cc;
- }
-
-/*dark color between tabs*/
-.midbardark { 
-	background: #003366;
- }
- 
-/*topnav*/ 
- .midbarmed { 
-	background-color: #006699;
- }
- 
- /*background  of  tabs*/
-.midbarmedium { 
-	background: #006699;
- }
- 
- .midbarshadow { 
-	background-color: #666666;
- }
- 
-/*replacing sidemenu_boldleft moving forward*/
-.navleftbold {
-	color: #000000;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-/*left nav submenu*/
-.navleftsub
-{
-	color: #676767;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-  
-/* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-.nonactivetab {
-	color: #b4b4b4;
-	font-size: 12px;
-	text-decoration: none;
-}
-
-/*notes/ description of icon */
-.notes{  
- font-size: 11px;
- font-weight : 400;	
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
-}
-
-.pagebold { 
-	color: #000000;
-	font-weight : 600;	
- }
- 
- /*font for the numbers in pagination library*/
- .pagenumber {
-	color: #676767;
-	font-weight : 400;
-}
-
- /*font for previous & next in pagination*/
-.pagesteps { 
-	color: #676767;	
-	font-size: 11px;
-	text-decoration: none;
- }
-
-.pop {
-	font-size : 12px;
-	font-weight : 200;
-	text-decoration: none;
-}
-
-.popbackground {
-	background: #d6d3ce;
-}
-
-.poph1 {
-	font-size: 16px;
-	font-weight : bold;
-}
-
-.popleftmenu {
-	background: #f0f0f0;
-	border: thin solid cccccc; 
-	left: 210px; 
-	padding: 2px;
-	position:absolute; 
-	top: 25px;
-	visibility: hidden; 
-	width:75px;
-	z-index:10;
- }
-
- /* use popleftmenu instead of this one*/
- .popupborder {	
-	background: #f0f0f0;
-	border : thin solid cccccc;
-	padding : 2px;
-}
-
-.popuptext {	
-   color: #333333;
-	font-size: 11px;	
-	text-decoration: none;
-}
-
- 
-.projectatt { 
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 12px; 
-	font-weight: 600;
-	text-decoration: none; 
-	color: #cd3301;
-}
-
-/*date associated with article ratings*/
-.ratingsdate
-{
-	color: #336699;
-	font-size : 11px;
-	text-decoration : none;
-	text-align: right;
-}
-
-select {
-    font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-}
-
-select.selpx144 {
-    width: 144px;
-}
-
-/* .sidemenu_boldleft replace with .leftmenubold*/ 
-
-/* .sidemenu_boldleft_selected replace with .leftmenuactive*/
- 
-/* .sidemenu_bullet_colored replace with .leftmenubulletactive*/
- 
-/*.sidemenu_bullet_grey replace with leftmenubullet*/
- 
-.sidemenuboldleft {
-	color: #000000;	
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-} 
-
-.sidemenuboldleftselected {
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-.sidemenustandard {
-	color: #676767;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.sidemenustandardselected {
-	color: #cc0000;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.smalltext {
-	font-size: 10px;
-	text-decoration: none;
-	color: #000000;
-}
-
-.tableheader {  
-	color: #000000;	
-	font-size: 13px;	
-    font-weight: bold
-}
-
-/* font for regular content text */
-/* font for regular content text */
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;	
-}	
-
-/* because of an intervening link tag, text options were attached to a similar element for links */
-td.activetab { 
- 	background-color: #c4c4c4;
-}
-
-/* because of an intervening link tag, text options were attached to a similar element for links */
-td.activetabselected { 
- 	background-color: #dddddd;
-  }
-
-/* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-td.buttonbody {
-	background-color: #d4d4d4;
-}
-
-td.buttonhighlight {
-	background-color: #ffffff;
-}
-
-td.buttonshadow {
-	background-color: #6d6d6d;
-}
-  
-/* design element rarely used for line colour in certain decorative tables */
-td.design1 {
-	background-color: #d4d4d4;
-}
-
-/*design element simulating a dimensional boundary to a table */
-td.dividerdimens {
-	background-color: #bdbdbd;
-}
-
- /* because of an intervening link tag, text options were attached to a similar element for links */
- td.nonactivetab {
-	background-color: #efefef;
-}
-
-/* data within a table highlighted in gray*/
-td.tblhighlt { 
-   background-color: #dedede;
-   padding: 2px;
- }
- 
- td.tblhighlt1 { 
-   background-color: #dedede;
- }
- 
-/* data within a table highlighted in light gray*/
-td.tblhighlt2 { 
-   background-color: #efefef;
- } 
-
-/*dark grey cell background and bold text */
-.tddarkbold {
-	background-color: #cccccc;
-	font-weight : 600;
-}
-
-.tdlight {
-	background-color: #efefef;
-	padding: 2px;
-}
-
-.tdlight1 {
-	background-color: #efefef;
-}
-
-textarea {
-    font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-}
-
-textarea.px380{
- width: 380px; 
- }
-
-.texterrormsg {
-	color : cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 110%;
-	font-weight: bold;
-}
-
-.textgray {  
-	color: #999999;	
-}
-
-.topbardivider { 
-	background: #3399cc 
-}
-
-.topbardividergreyed { 
-	background: #add6eb
-}  
-
-.topbarseparator {
-  color: #cc3300;  
-  font-size: 11px;
-  text-decoration: none;
-}
-
-.topframebg {
-	background-color: #d2d2d2;
-}
-
-.topframebggreyed {
-	background-color: #ededed;
-}
-
-.topframehighlight {  
-	background-color: #b6b5b5;
-}
-
-.topframehighlightgreyed {  
-	background-color: #e1e1e1;
-}
-
-.topframehighlight2 { 
-	background-color: #efefef;
-}
- 
-.topframehighlight2greyed { 
-	background-color: #f9f9f9;
-} 
-
-.topframelogobg {  
-	background-color: #006699;
-}
-
-.topframelogobggreyed {  
-	background-color: #99c2d6;
-}
-
-.topframeshadow {  
-	background-color: #848484;
-}
-
-.topframeshadowgreyed {  
-	background-color: #cecece;
-}
-
-.topleftnav {	
-    font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-	color: #000000;
-}
-
-.topleftnavbold { 
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px; 
-	font-weight: 600;
-	text-decoration: none; 
-}
-
-.topleftnavboldgreyed { 
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif; 
-	font-size: 10px; 
-	font-weight: bold;
-	text-decoration: none; 
-}
-
-.topleftnavgreyed {	
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-.toplinecolor { 
-	background-color: #006699;
- }
-
-.toprightnav {
-	color: #ffffff;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-.toprightnavgrey 
-{
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-/* this was initially declared the same colour as the class topframe bg but because it lies in a different functional area, has been recreated here  */
-tr.bgmidframe {
-	background-color: #d2d2d2;
-}
-
-td.sidemenu_bullet_grey {
-	background-color: #999999;
-}
-
-
-td.sidemenu_bullet_colored {
-	background-color: #cd3301;
-}
-
-/*list-style-image: url(images/downbutton.gif);*/
-ul {
-	list-style-type: square;
-}
-
-.vob
-{
-	font-size: 150%;
-	color: #006699;
-	text-decoration: none;
-	font-weight: 400;
-}
-
-.vobbottom
-{
-	font-size: 14px;
-	text-decoration: none;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_netscape4.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_netscape4.css
deleted file mode 100644
index c575d40..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_netscape4.css
+++ /dev/null
@@ -1,1153 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-td.span.content_basic
- {
-	padding-left : 5px;
-}
-
-a
-{
-	color: #336699;
-}
-
-
-.accentcolor
-{
-	color : #cc3300;
-	font-size : 12px;
-	font-weight : 600;
-	text-decoration: none;
-}
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} a.breadcrumbs
-{
-	color: #ffffff;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight: 400;
-	text-decoration: underline
-}
-
-
-a.breadcrumbs:hover
-{
-  color: #ffffff
-}
-
-
-a.link_reverse:hover
-{
-    background: #dcdcdc;
-}
-
-
-a.link_container_editor
-{
-	text-decoration : none;
-	font-size : 11px;
-}
-
-
-a.link_byline
-{
-	color: #336699;
-	font-size : .9em;
-}
-
-
-a.link_func_option
-{
-  	font-family: arial, helvetica, sans-serif;
-	color: #336699;
-	font-size: 11px;
-	font-weight: bold;
-}
-
-
-a.linktyped
-{
-	font-size: 11px;
-}
-
-a.menubar_link
-{
-	color: #ffffff;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight: 400;
-	text-decoration: underline
-}
-
-a.menubar_link:hover
-{
-	color: #ffffff;
-}
-
-a.navtree
-{ 	
-    color: #000000;
-	font-size : 11px;
-	font-weight: 600;
-	text-decoration: none;
-} 
-
-a.project_nav
-{
-	color: #006699;
-	font-family : arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration: underline;
-}
-a.project_navtree
-{
-  color: #000000;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  text-decoration: none;
-}
-a.topbar
-{
-  color: #666666;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  text-decoration: none;
-}
-
-body 
-{
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 9px;
-	background-color : White;
-}
-
-
-.border_decoration
-{
-	border : thin dotted #666666;
-}
-
-
-.bottombar_dark
-{ 
-	background: #003366;
- }
-
-
-.bottombar_light
-{ 
-	background: #3399cc;
- }
-
-
- .bottom_medium
-{ 
-	background: #006699;
- }
-
-
- .bottombar_shadow
-{ 
-	background: #000000;
- }
-
-
-code 
-{
-	color: #676767;	
-}
-
-.code2
-{
-   	margin-left : 15px;
-	margin-right : 15px;
-}
-
-.copyright
-{ 
-	color : #999999;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 60%;
- }
-
-
-.content_basic
-{
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	font-weight : 400;
-	text-decoration : none;
-}
-
-
-.content_basic_emphasis
-{
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-
-.content_colored
-{
-	color: #336699;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 12px;
-}
-
-
-.content_container
- {
-	margin-bottom : 15px;
-}
-
- .content_diagram
- {
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size:60%;
-	font-style : italic;
-	
-}
-
-.content_grey_mid
-{
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.content_grey_mid2
-{
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12px;
-	font-weight : 400;
-	text-decoration : none;
-}
-
-
-.content_emphasis
- {
-	color: #000000;
-	font-weight : 600;
-	font-size : 11px;
-}
-
-.content_header
-{
-	color: #006699;
-	font-family : arial, helvetica, sans-serif;
-	font-size: 110%;
-	font-weight : 600;
-	text-decoration: none;
-}
-
-.content_header_large
-{
-	font-family : arial, helvetica, sans-serif;
-	font-size: 1.2em;
-	font-weight : 600;
-	color: #333333;
-	text-decoration: none;
-}
-
-
- .content_header_colored
-{
-	color: #676767;
-	text-decoration: none;
-}
-
-
- .content_reference
- {
-	font-style : italic;
-}
-
- .content_right
-{
-	float: right;
-	margin-top : 5px;
-	width: 166;
-}
-
- .content_right_table
-{
-	width: 100%;
-}
-
-
- .content_small
-{
-	color: #000000;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 11px;
-	text-decoration : none;
-}
-
-
- .content_small_colored
-{
-	color : #999999;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 11px;
-}
-
-
- .content_small_colored_2
-{
-	color: #336699;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 11px;
-	text-decoration : none;
-}
-
-
-  .content_small_colored_3
-{
-	color: #336699;
-	font-family : arial, helvetica, sans-serif;
-	font-size : 11px;
-}
-
-
-.content_small_emphasis
- {
- 	font-size : 11px;
-	font-weight : 600;
-}
-
-
-.content_subheader
-{
-    font-size : 12px;
-	font-family: arial, helvetica, sans-serif;	
-	font-weight:  bold;
-}
-
-
-.content_subheader_2
-{ 
-	color: #000000;
-	font-size: 12px;
-	font-weight: 400;
- }
-
-
- .discussion_content
-{ 
-	color: 000000;
-	font-size: 11px;
-	margin-left: 5px;
- }
-
-
-.discussion_content_emphasis
-{
-	color: 000000;
-	font-size: 11px;
-	margin-left: 5px;
-	font-weight : 600;
-}
-
-
- .discussion_description
- { 
-	color: 666666;
-	font-size: 11px;
-	margin-left: 5px;
-  }
-
-
-.editornote 
-{  
-	font-style: italic
-}
-
- /*the following two classes are used expressly in the knowledge_announcements_view*/
- 
- .floatclear
-{
-	padding: 5px;
-	padding-bottom: 0px;
-	padding-right: 0 px;
-	width: 100%;
-}
-
-.floatgrey
-{
-	background-color: #efefef;
-	padding: 5px;
-	width: 65px;
-}
-
-
-.footnote
-{ 
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: .9em;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
- }
-.formfield_desc 
-{
-color: #333333; 
-font-family: arial, helvetica, sans-serif; 
-font-size: 1em; 
-font-weight : 400; 
- font-style: italic
-}
-.formfield_title
-{
-    font-size : 12px;
-	font-family: arial, helvetica, sans-serif;	
-	font-weight:  bold;
-}
-.foot_starindex
-{
-	color : #cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-
-.foot_description
-{
-	color : #ff6500;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-
-.foot_text
-{
-	color: #b4b4b4;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-	font-weight: bold;
-}
-
-
-.foot_title
-{
-	color : #ff6500;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 8pt;
-}
-
-
-.flowchart 
-{  
-	font-size: 8pt; color: #666666
-}
-
-
-.header_discussion_link
- {
-	color: ffffff;
-	font-size: 11px;
-}
-
-.header_discussion_linkdk
- {
-	color: 000000;
-	font-size: 11px;
-}
-
-
-.header_discussion_title
- {
-	color: ffffff;
-	font-size: 11px;
-	font-weight: 600;
-	margin-left : 5px;
-	margin-right: 5px;
-}
-
-
-.headerlink_of_container
-{
-	color: #6699cc;
-	font-family: arial,verdana,helvetica,sans-serif;
-	font-size: 14pt;
-	font-weight: bold;
-	text-decoration : none;
-}
-
-
-.headerb
-{
-    color: #ff6600;
-    font-family: arial,verdana,helvetica,sans-serif;
-    font-size: 12pt;
-    font-weight: bold;
-}
-
-
-.header_colored
-{
-	color: #cc3300;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 1em;
-	font-weight: bold;
-}
-
-
-.header_of_article
-{
-	color: #cd3301;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 16px;
-	font-weight: bold;
-	}
-
-.header_of_article_table
-{
-	color: #336699;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 12px;
-	font-style : italic;
-}
-	
-.header_of_article2
-{
-	color: #333333;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 18px;
-	font-weight: 800;
-}
-
-.header_right
-{
-	color: 000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 12px;
-	font-weight: 800;
-}
-
-.subhead1_of_article2
-{
-	color: #333333;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 14px;
-	font-weight: bold;
-}
-
-.subhead2_of_article2
-{
-	color: #336699;
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 14px;
-	font-weight: bold;
-	margin-bottom: 5px;
-}
-
-.subhead3_of_article2
- {
-	font-weight : 600;
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 80%;
-}
-
-.header_of_steps
-{
-	color: #A4A4A4;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12pt;
-	font-weight: bold;
-}
-
-
-
-.header_of_sitemap
-{
-	color:# 6699cc;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12pt;
-	font-weight: bold;
-	text-decoration : none;
-}
-
-
-.header_of_sitemap:hover
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 12pt;
-	font-weight: bold;
-	text-decoration : none;
-}
-
-
-.header_of_table
-{
-	color: #ffffff;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 14px;
-	font-weight: 400;
-}
-
-
-.image_caption 
-{  
-	font-size: 9pt; color: #003366
-}
-
-
-.sidebar
-{  
-	background-color: #f4f4f4;
-}
-
-input
-{
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-}
-
-
-input.input25
-{
-    width: 25px
-}
-
-
-input.input45
-{ 
-    width: 45px
-}
-
-
-input.input85
-{
-    width: 85px
-}
-
-
-input.inputmax50
-{
-	width: 360px
-}
-
-
-input.input135
-{
-	width: 135px
-}
-
-
-input.input155
-{
-  	 width: 155px
-}
-
-input.input230
-{
-    width: 230px;
-}
-
-
-input.input305
-{ 
-    width: 305px
-}
-
-
-.menubar
-{
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 400;
-  text-decoration: none
-}
-
-
-.menubar:hover
-{
-  color: #ffffff
-}
-
-
-.menubar_bg
-{   
-background-color:#003366; 
-}
-
-
-.menubar_emphasis
-{ 
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
-}
-
-.menubar_emphasisdk
-{ 
-  color: #000000;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  font-weight: 600;
-  text-decoration: none
-}
-
-
-.midbar_bg
-{ 
-	background: #ffffff;
- }
-
-
-.midbar_dark
-{ 
-	background: #003366;
- }
-
-
-.midbar_light
-{ 
-	background: #3399cc;
- }
-
-
- .midbar_medium
-{ 
-	background: #006699;
- }
-
-
- .midbar_shadow
-{ 
-	background: #666666;
- }
-
-
-.page_number
-{
-	color: #676767;
-	font-weight : 400;
-}
-
-
-.page_steps
-{ 
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 400;
-	 text-decoration: none;
- }
-.pageheader
-{
-    font-family: arial, helvetica, sans-serif;
-    font-size: 16pt;
-    font-weight: bold
-}
- .pageheader_colored
-{
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16pt;
-	font-weight: 400;
-}
-
-.popup_text : active
-{
-	color: #cc0000;
-}
-
-.popup_text : hover
-{
-	color: #cc0000;
-}
-
-.project_menu_border1
- {
-	border-top : 1px solid #cccccc;
-	border-right : 1px solid #cccccc;
-	background : #efefef;
-}
-.project_menu_topborder
- {
-	border-top : 1px solid #cccccc;	
-	background : #efefef;
-}
-.project_nav
-{
-	color: #006699;
-	font-family : arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-}
-select
-{
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 11px;
-}
-
-
-select.input25
-{ 
-    width: 25px
-}
-
-
-select.input45
-{
-    width: 45px
-}
-
-
-select.input85
-{
-    width: 85px
-}
-
-
-select.input155
-{
-   width: 155px
-}
-
-
-select.input230
-{
-    width: 230px
-}
-
-
-select.input305
-{
-    width: 305px;
-}
-
-/* All shim classes are for spacing elements used to control layout, especially in older browsers that don't understand margins and padding */
-
-.shim3x1px
-{
-	height: 1px;
-	width: 3px;
-}
-
-a.sidemenu_header
-{
-    color: #666666;
-    font-family: arial, helvetica, sans-serif;
-    text-decoration: none;
-    font-weight: bold;
-}
-
-
-a.sidemenu_header:hover
-{
-  color: #cc0000
-}
-
-
-.sidemenu_boldleft
-{
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_boldleft_selected
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_boldright
-{
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_boldright:hover
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-
-.sidemenu_standard
-{
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-
-.sidemenu_standard_selected
-{
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 11px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-td
-{
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 70%
-}
-
-td.searchbox
-{
-	font-family: courier;
-}
-
-
- td.bg_discussion_1
-{
-	background-color: #dedede;
-	
-}
-
-
-td.bg_discussion_2
-{ 
-	background-color: #efefef;
- }
- 
- td.content_cell
- {
- 
-}
-
-
-td.divider
- {
-	background-color: #f6f9f0;
-}
-
-
-.grey_dark
-{
-	background-color: #cccccc;
-}
-
-td.grey_medium2
- {
-	background-color: #dedede;
-}
-
-td.grey_light2
- {
-	background-color: #efefef;
-}
-
-.grey_light
- {
-	background-color: #efefef;
-}
-
-.grey_medium
- {
-	background-color: #dedede;
-}
-
-
-td.cellcolor_light
- {
-	background-color: #99cc00;
-}
-
-
-
-td.cellcolor_dark
- {
-	background-color: #639c00;
-}
-
-
-td.cellcolor_white
- {
-	background-color: #ffffff;
-}
-
-
-td.sidemenu_bullet_grey
- {
-	background-color: #999999;
-}
-
-
-td.sidemenu_bullet_colored
- {
-	background-color: #cd3301;
-}
-
-
-textarea
-{
-	font-size: 11px;
-	font-family : Arial, Helvetica, sans-serif;
-}
-
-
-textarea.input45
-{
-    width: 45px
-}
-
-
-textarea.inputmax50
-{
-	width: 360px
-}
-
-
-textarea.input190
-{
-    width: 190px
-}
-
-
-textarea.input230
-{
-    width: 230px
-}
-
-
-textarea.input350
-{
-    width: 350px
-}
-
-
-.topbar_separator
-{
-  color: #cc3300;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 11px;
-  text-decoration: none;
-}
-
-
-.topline_color
-{ 
-	background: #006699;
- }
- 
-/* borrowed styles from common.css to be trimmed later */
- 
- .topframebg 
-{  background-color: #d2d2d2
-}
-
-.topframebglight 
-{  
-background-color: #b6b5b5
-}
-
-.topframebgdark 
-{  
-background-color: #848484
-}
-
-.topframebglight2 
-{ 
- background-color: #efefef
- }
-   
- .topframelogobg 
-{  
-background-color: #006699
-}
-
-.topleftnav
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	text-decoration: none;
-}
-
-.topleftnavbold 
-{ 
-font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 10px; 
-text-decoration: none; 
-font-weight: bold;
-}
-
-.toprightnav
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #ffffff;
-	text-decoration: none;
-}
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
-.verticalblue
- { 
- background: #3399cc 
- }
-
- .whitebg
-{ 
- background-color: #ffffff;
- }
diff --git a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_unix.css b/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_unix.css
deleted file mode 100644
index e100081..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/docroot/stylesheets/styles_unix.css
+++ /dev/null
@@ -1,1244 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*must add font type if class is being used as a link as well as no-link*/
-
-a {	
-	color: #336699;
-}
-
-a.toprightnav:active {
-	color: #99CCCC;
-}
-
-a.toprightnavgrey:active {
-	color: #CC0000;
-}
-
-
-/* action text usually located on top of page;ie., select all*/
-a.actionlink
-{ 
-color: #336699;
-font-size: 11px;
-text-decoration : none;	
- }
- 
- a.actionlink:active { 
- color: #336699;
- font-weight: bold;
-  }
-
-a.toprightnavgrey:hover {
-	color: #CC0000;
-} 
-a.toprightnav:hover {
-	color: #99CCCC;
-} /* font for action on content page usually located on top of page ;ie., select all*/
-a.action {  
-	color: #333333;
-	font-size: 16px;	
-} 
-
-a.actionselector {
-   
-	color: #000000;
-	font-size: 16px;
-}
-
- /* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-a.activetab { 
- 	color: #000000;
- 	font-size: 18px;
-  	text-decoration: none;
-}
-
- /* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-a.activetabselected { 
- 	color: #2c2c2c;
- 	font-size: 18px;
-  	text-decoration: none;
-}
-
-a.basic { 	
-    color: #000000;
-}
-
-/* for non-image buttons, for internationalization */
-a.button {
-	color: #333333;
-	text-decoration: none;
-}
-
-a.button:active {
-	color: 333333;
-	text-decoration: none;
-}
-
-/* for non-image buttons, for internationalization */
-a.button:hover {
-	color: 333333;
-}
-
-/* for non-image buttons in Multisite, for internationalization */
-a.button2 {
-	color: #000000;
-	font-size : 16px;
-	text-decoration: none;	
-}
-
-/*main container  actions/links for editing*/
-a.conlinkedit {
-	text-decoration : none;
-	font-size : 16px;
-}
-
-a.copyright { 	
-	color: #336699;    
-	font-size : 15px;
-} 
-
-a.formtblhead {
-   background-color: #cccccc;
-	color: #000000;
-	font-size: 16px;
-	font-weight : 600;
-}
-
-/* light coloured heading link for discussion and similar uses - was header_discussion_link in previous versions */
- a.headerlinklight {
-	color: 	ffffff;
-	font-size: 0.9em;
-	text-decoration: none;
-}	
-
-/*bold link, ie, advanced search link in pe*/
-a.linkfuncoption {  	
-	font-size: 16px;
-	font-weight: 600;
-}
-
- a.navtree { 	
-    color: #000000;
-	font-size : 16px;
-	font-weight: 600;
-	text-decoration: none;
-} 
-
-/*navtree item or doc, nodes that don't expand*/
-a.navtreeitem { 	
-    color: #000000;
-	font-size : 16px;
-	text-decoration: none;
-} 
- 
- /* simple mechanism to turn text decoration off */  
-a.noline {
- 	text-decoration: none;
- }
-
-a.popuptext {	
-   color: #333333;
-	font-size: 16px;	
-	text-decoration: none;
-}
-
-a.poptext {
-	color: #333333;
-	font : 16px;
-	text-decoration: none;
-}
-
-a.popuptext: active {
-	color: #cc0000;
-}
-
-
-a.small {	
-	font-size: 16px;	
-}
-
-a.smallb {	
-   color: #000000;
-	font-size: 16px;	
-}
-
-a.topbar {
-  color: #666666;
-  font-size: 16px;
-  text-decoration: none;
-}
-
-/*used as highlighted description above tables*/
-.accentcolor {
-	color : #cc3300;
-	font-weight : 600;
-}
-
- /* bgcolor  for action text usually located on top of page;ie., select all*/
-.actionbg { 
-	background-color: #efefef;
-}
-
-/*actionbar appears on top and/or bottom of page*/
-.actionselector {
-   background-color: #e9e9e9;
-	color: #000000;
-	font-size: 16px;
-}
-
-/*actionbar on white background*/
-.actionselect2 {   
-	color: #000000;
-	font-size: 16px;
-}
-
-.actionselectordis {
-background-color: #e9e9e9;
-	color: #cccccc;
-	font-size: 16px;
-	text-decoration: none;
-}
-
-b { 
-   font-weight : bold;
- }
-  
-.baselineitalics {
-	color: #666666;
-	font-size: 16px;
-	text-decoration: none;
-}
-
-.bgblack { 
-	background-color: #000000;
- }
- 
- /* basic column background colour for discussions, files, other such tabulated data */
-.bgcolumnbasic { 
-	background-color: #efefef;
- }
- 
-.bgwhite { 
-	background-color: #ffffff;
- } 
- 
-/* size input for basic tags such as p and li that do not inherit from td */ 
-body {
-	background-color : #ffffff;   
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;
-	text-decoration : none;		
-	margin-left: 0px;
-	margin-top: 0px;	
-	margin-right: 0px;
-}
-
-.bold { 
-   font-weight : 600;
- }
-
-.bordergray { 
-	background-color: #e9e9e9;
- }
-
-.bottombardark { 
-	background-color: #003366;
- }
-  
-.bottombarlight { 
-	background-color: #3399cc;
- }
-
-.bottombarshadow { 
-	background-color: #000000;
- }
-
-.breadcrumbs{ 
-color: #336699;
-font-weight: 600;
- }
-
-.breadcrumbs2{ 
-color: #ffffff;
-font-size: 16px;
- } 
- 
-/*active navigation button, not form buttons*/ 
-.buttonon {
-    background-color: #dedede;
-    color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 15px;
-	text-decoration: none;	
-}
-  
-/*navigation buttons, not form buttons*/ 
-.buttons {
-    background-color: #efefef;
-    color: #000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;	
-	font-size: 15px;
-	text-decoration: none;	
-}
-
-/* disabled state */ 
-.buttontxt {
-	color: #333333;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-/* these button styles are for the textual buttons intended to replace image constructs for internationalization - this is for the disabled state */ 
-.buttontxtdsbl {
-	color: #7E7E7E;
-	font-family: verdana, helvetica, arial, sans-serif;
-	font-size: 15px;
-	font-weight: 600;
-	text-decoration: none;
-}
-
-.code { 
-   font-family: Courier New, Courier, mono;   
-   font-size: 18px;
- }
- 
-  /* font for regular content text */
-.comments { 	
-	font-size: 16px;	
-	background-color: #efefef;
-}
-
-/*main container header*/
-.conhead { 
-color: #cc3300;
-font-weight: 600;
-text-decoration : none;
- }
- 
- /*main container data labels*/
-.conlabel { 
-background-color: #efefef;
- } 
- 
-/*main container data labels in bold*/
-.conlabelbold { 
-background-color: #e1e1e1;
-font-weight: bold;
- }  
- 
-/*replacing sidemenu_boldright moving forward*/
-.conrbold {
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-/*header for right hand container*/
-.conrhead {
-	color: 000000;
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 18px;
-	font-weight: 800;
-}
-
-/*main container table header*/
-.contblhead {  
-   background-color: #cccccc;
-	color: #333333;	
-	font-size: 16px;	
-    font-weight: 600;
-}
-
-.content{ 
-font-family: arial, helvetica, sans-serif;
-	font-size: 18px;	
- }
-
- /*medium grey cell background*/
-.contentborder {
-	background-color: #dedede;
-}
-
-/* added for text representing disabled functions. */
-.contentdisabled {
-	color: #cccccc;
-}
-
-/* font for bold text */
-.contentemphasis {
-	color: #000000;
-	font-weight : 600;
-}
-
-/* used text reminding user that there is required content */
-.contentrequired {
-	color: #b4b4b4;
-	font-weight: 500;
-}
-
-.copyright { 
-	color : #999999;
-	font-size : 15px;
-}
-
-/*black copyright*/
-.copyrightb { 
-color : #000000;
-	font-size : 15px;
-}
-
-dd { 
-font-family: arial, helvetica, sans-serif;
-	font-size: 18px;	
-margin-left: -1px;
- }
- 
-.dialgbxshadow2 {  
-	background-color: #848484;
-}
-
-.dialogueboxbg {  
-	background-color: #d2d2d2;
-}
-
-/*background for login pages*/
-.dialogueboxbg2 {  
-	background-color: #999999;
-}
-
-.dialogueboxborder { 
-	background-color: #333333;
- }
- 
-.dialogueboxhighlight {
-	background-color: #efefef;
-}
-
- .dialogueboxmedium { 
-	background-color: #8b8b8b;
- }
- 
- .dialogueboxtitle {	   
-	font-size: 21px;
-	font-weight : bold;
-}
-
-/*text for disabled buttons*/
-.disable{ 
-color: #999999;
-font-family: verdana, helvetica, arial, sans-serif;
-font-size: 16px;  
-	font-weight: 600;
-	text-decoration: none;
- }
- 
-div{ 
-font-family: arial, helvetica, sans-serif;
- } 
- 
-/*used to affect right margin*/ 
-div.marginrt{ 
-	clear: right;
-	float: right;
-	width: 7px;
- }  
- 
-div.margins { 
-float: left;
-margin-left: 7px;
-margin-top: 25px;	
-margin-right: 7px;
- }   
-
-/*for pages with button navigation on top*/ 
-div.margins20 { 
-float: left;
-margin-left: 7px;
-margin-top: 20px;	
-margin-right: 7px;
- }    
- 
- /*adds 10 px padding*/
- div.pad10{ 
- padding: 10px; 
-  }
-
-.divider {
-	background-color: #f6f9f0;
-}
-
-dl{  
-font-family: arial, helvetica, sans-serif;
-font-size: 18px;   
-	}
-
-/*removes default bottom margin, doesn't work in NS4.7x */ 
-dl.data { 
-margin-bottom: -1px;
- }  
-
-.docbold {
-	color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 16px;       
-	font-weight : 600;
-}
-
-/*for applet download splash page*/
-.download{ 
-background-color: #efeeee;
- }
-
- .errormsg {
-	color : #cc0000;	
-} 
-
-/*
-colored font
-description about the user status. eq. "subscriptions are updated"
-it's usually on the upper part of the pages
-*/
-.footerbold {
-	color : #a4a4a4;
-	font-size: 90%;
-	font-weight: 600;
-}
-
-/*the * symbol indicate the required field */
-.footerboldcolored {
-	color : #ff6500;
-	font-size: 90%;
-	font-weight: 600;
-}
-
-.footindicator {
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 16px;       
-	text-decoration: none;
-}
-
-/*the * symbol indicate the required field */
-.footstarindex {
-	color : #cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 12pt;
-	font-weight: bold;
-}
-
-/*move to design_pe*/
-.formlabel {
-	color: #000000;
-	font-size: 16px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-.formtblhead {
-   background-color: #cccccc;
-	color: #000000;
-	font-size: 16px;
-	font-weight : 600;
-}
-
-.greymedium {
-	background-color: #dedede;
-}
-
-.grayfold {
-	color: #cccccc;	
-	text-decoration: none;
-	font-size: 22px;
-}
-
-/*Note: remove this note if using this style or will be deleted*/
-	/* Currently used in cq_deflect_login_err.html - should be renamed to something that has less descriptive name */
-.headerblue {
-	color: #006699;	
-	font-weight : 600;
-	text-decoration: none;
-}
-
-/*used in cc for frameset display*/ 
-.headerinframes {  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 15px;	
-	font-weight: 600;
-	margin-bottom: 2px;
-	margin-top: 0px;
-}
-
- /*font for page header except for article pages, (see header_of_article)*/
-.headerlarge {
-	color: #333333;
-	font-size: 160%;
-	font-weight : 400;
-	text-decoration: none;
-}
-
-/*main header for frame navigation, ie, clearcase merge files*/
-.headermain {  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 25px;	
-	font-weight: 600;
-}
-
-/* header element for form tables containing mid-size fixed height text */
-.headermedlist {
-	font-size: 16px;
-}
-
-/*fornt for steps title in forms*/
-.headerofsteps { 
-	color: #666666;
-	font-size: 25px;
-	font-weight: bold;
-}
-
-.headerofstepsnon { 
-	color: #666666;
-	font-size: 25px;
-	font-weight: bold;
-	text-decoration: none;
-}
-
-
-/*use header1 instead*/
-.h1 {  
-
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;	
-	font-weight: 800;
-}
-
-/*to replace h1 and contentheader large*/
-.header1 {  
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;	
-	font-weight: 800;
-}
-
-/*use subhead1 instead*/
-.h1root{  
-	color: #999999;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;	
-	font-weight: 400;
-}
-
-
-/*used in cc, cq, sl*/ 
-h1 {  
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 25px;	
-	font-weight: 600;
-}
-
-/*use header2 instead*/
-.h2 { 
-	font-family: arial, helvetica, sans-serif;
-	font-size: 28px;
-	font-weight: 400;	 	
-}
-
-/*headers within page*/
-.header2 { 
-	font-family: arial, helvetica, sans-serif;
-	font-size: 28px;
-	font-weight: 400;	 	
-}
-
-
-i {
-	font-style : italic;
-}
-
-.iconborder { 
-	background-color: #dedede;
-}
-
-/*font size setup shown in the input box which is inherited by inputXX*/
-input {
-	font-family: arial, helvetica, sans-serif;	
-	font-size: 16px;
-} 
-
-input.input135 {
-	width: 135px
-} 
-
-/* 1,business standard multiline input box 
-2,this style only activate in IE */
-input.max50 {
-	width: 360px;
-}
-
-input.px25 {
-    width: 25px;
-}
-
-input.px45 {
-    width: 45px;
-}
-
-/*
-1,business standard multiline input box 
-2,this style only activate in IE
-*/
-input.px85 {
-    width: 85px;
-}
-
-input.px135 {
-    width: 135px;
-}
-
-input.px155 {
-    width: 155px;
-}
-
-input.px230 {
-    width: 230px;
-}
-
-input.px305 {
-    width: 305px;
-}
-
-.leftmenu {
-	background-color: #999999;
-}
-
-.leftmenubullet { 
-background-color: #999999;
- }
-
-.leftmenubulletactive { 
-background-color: #cd3301;
- }
-	
-
-.leftnavhead {
-	color: #000000;
-	font-size: 19px;	
-	font-weight: bold;	
-} 
-
-.leftnavlabel {
-color: #000000;
-font-weight : 600;
-font-size: 16px;
- }
-
-.lightgray { 
-background-color: #e4e4e4;
- }
- 
-.menubar {
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 16px;
-  font-weight: 400;
-  text-decoration: none
-}
-
-/*menubar within top of content page  */
-.menubarmid{ 
-font-size: 16px;
-  font-weight: 600;
-  text-decoration: none
- }
-
-/*
-1,bold font for the last item of the breadcrumbs
-2,bold font of table header with menubar_bg(blue) as background color 
-3,bold text on colored background eg. Logged In
-*/
-.menubaremphasis {
-  color: #ffffff;
-  font-family: arial, helvetica, sans-serif;
-  font-size: 16px;
-  font-weight: 600;
-  text-decoration: none
-}
-
-.menubar:hover {
-  color: #ffffff
-} 
- 
-.midbarbg { 
-	background-color: #ffffff;
- } 
- 
-/*topnav*/ 
-.midbarlight { 
-	background-color: #3399cc;
- }
- 
-/*dark color between tabs*/
- .midbardark { 
-	background: #003366;
- }
- 
- /*topnav*/ 
- .midbarmed { 
-	background-color: #006699;
- }
- 
- /*background  of  tabs*/ 
- .midbarmedium { 
-	background: #006699;
- }
- 
- .midbarshadow { 
-	background-color: #666666;
- } 
-  
-/*replacing sidemenu_boldleft moving forward*/
-.navleftbold {
-	color: #000000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-/*left nav submenu*/
-.navleftsub {
-	color: #676767;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
- 
-/* because of an intervening link tag, text options were attached to this element instead of the outermost cell */
-.nonactivetab {
-	color: #b4b4b4;
-	font-size: 18px;
-	text-decoration: none;
-}
-
-/*notes/ description of icon */
-.notes{  
- font-size: 16px;
- font-weight : 400;	
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;	
-}
-
-.pagebold { 
-	color: #000000;
-	font-weight : 600;	
- }
- 
-/*font for the numbers in pagination library*/
- .pagenumber {
-	color: #676767;
-	font-weight : 400;
-}
-
- /*font for previous & next in pagination*/
-.pagesteps { 
-	color: #676767;	
-	font-size: 16px;
-	text-decoration: none;
- }
-
-.pop {
-	font-family: arial, helvetica, sans-serif; 
-	font-size : 18px;
-	font-weight : 200;
-	text-decoration: none;
-}
-
-.popbackground {
-
-	background: #d6d3ce;
-}
-
-.poph1 {
-	font-size: 24px;
-	font-weight : bold;
-}
-
-.popleftmenu {
-	background: #f0f0f0;
-	border: thin solid cccccc; 
-	left: 210px; 
-	padding: 2px;
-	position:absolute; 
-	top: 25px;
-	visibility: hidden; 
-	width:75px;
-	z-index:10;	
- }
-
- /* use popleftmenu instead of this one*/
-.popupborder {
-	background: #f0f0f0;
-	border : thin solid cccccc;
-	padding : 2px;
-}
-
-.popuptext {	
-   color: #333333;
-	font-size: 16px;	
-	text-decoration: none;
-}
-
-.projectatt { 
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 18px; 
-	font-weight: 600;
-	text-decoration: none; 
-	color: #cd3301;
-}
-
-/*date associated with article ratings*/
-.ratingsdate
-{
-	color: #336699;
-	font-size : 16px;
-	text-decoration : none;
-	text-align: right;
-}
-
-select {
-    font-family: arial, helvetica, sans-serif;	
-	font-size: 16px;
-}
-
-select.selpx144 {
-    width: 144px;
-}
-
-/* .sidemenu_boldleft replace with .leftmenubold*/ 
-
-/* .sidemenu_boldleft_selected replace with .leftmenuactive*/
-
-/* .sidemenu_bullet_colored replace with .leftmenubulletactive*/
- 
-/*.sidemenu_bullet_grey replace with leftmenubullet*/
-
-.sidemenuboldleft {
-	color: #000000;	
-	font-size: 16px;
-	font-weight : 600;
-	text-decoration : none;
-} 
-
-.sidemenuboldleftselected {
-	color: #cc0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 16px;
-	font-weight : 600;
-	text-decoration : none;
-}
-
-.sidemenustandard {
-	color: #676767;
-	font-size: 16px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.sidemenustandardselected {
-	color: #cc0000;
-	font-size: 16px;
-	font-weight : 400;
-	line-height : 135%;
-	text-decoration : none;
-}
-
-.smalltext {
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-	color: #000000;
-}
-
-/*to replace h1root,  for document root folder*/
-.subhead1 {  
-	font-family: arial, helvetica, sans-serif;
-	font-size: 33px;	
-	font-weight: 800;
-}
-
-.tableheader { 
-
-	color: #000000;	
-	font-size: 19px;	
-    font-weight: bold
-}
-
-/* font for regular content text */
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 18px;	
-}
-
-/* because of an intervening link tag, text options were attached to a similar element for links */
-td.activetab { 
- 	background-color: #c4c4c4;
-  }
- 
-/* because of an intervening link tag, text options were attached to a similar element for links */
-td.activetabselected { 
- 	background-color: #dddddd;
-  }
-  
- /* these button styles are for the textual buttons intended to replace image constructs for internationalization */ 
-td.buttonbody {
-	background-color: #DADADA;
-}
-
- /* disabled version */ 
-td.buttonbodydsbl {
-	background-color: #DADADA;
-}
-
-/* this style is descoped and will be removed in future */
-td.buttonhighlight {
-	background-color: #ffffff;
-}
-
-td.buttonshadow {
-	background-color: #6d6d6d;
-}
-
-/* disabled version */
-td.buttonshadowdsbl {
-	background-color: #A2A2A2;
-}
- 
-/* design element rarely used for line colour in certain decorative tables */
-td.design1 {
-	background-color: #d4d4d4;
-}
- 
-/*design element simulating a dimensional boundary to a table */
-td.dividerdimens {
-	background-color: #bdbdbd;
-}
- 
- /* because of an intervening link tag, text options were attached to a similar element for links */
-td.nonactivetab {
-	background-color: #efefef;
-}
-
-/* data within a table highlighted in gray*/
-td.tblhighlt { 
-   background-color: #dedede;
-   padding: 2px;
- }
- 
- td.tblhighlt1 { 
-   background-color: #dedede;
- }
- 
-/* data within a table highlighted in light gray*/
-td.tblhighlt2 { 
-   background-color: #efefef;
- } 
-
- /* data within a table highlighted in light gray*/
-td.tblhighlt3 { 
-   background-color: #e9e9e9;
- }  
- 
-/*dark grey cell background and bold text */
-.tddarkbold {
-	background-color: #cccccc;	
-	font-weight : 600;
-}
-
-.tdlight {
-	background-color: #efefef;
-	padding: 2px;
-}
-
-.tdlight1 {
-	background-color: #efefef;
-}
- 
- 
-textarea {
-    font-family: arial, helvetica, sans-serif;	
-	font-size: 16px;
-}
-
-textarea.px380{
- width: 380px; 
- }
-
-.texterrormsg {
-	color : cc0000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 110%;
-	font-weight: bold;
-}
-
-.textgray {  
-	color: #999999;	
-}
-
-.topbardivider { 
-	background: #3399cc 
-}
-
-.topbardividergreyed { 
-	background: #add6eb
- }  
-
-.topbarseparator {
-  color: #cc3300;  
-  font-size: 16px;
-  text-decoration: none;
-} 
- 
-.topframebg {
-	background-color: #d2d2d2;
-}
-
-.topframebggreyed {
-	background-color: #ededed;
-}
-
-.topframehighlight {  
-	background-color: #b6b5b5;
-}
-
-.topframehighlightgreyed {  
-	background-color: #e1e1e1;
-}
-
-.topframehighlight2 { 
-	background-color: #efefef;
-}
-
-.topframehighlight2greyed { 
-	background-color: #f9f9f9;
- } 
- 
-.topframelogobg {  
-	background-color: #006699;
-}
-
-.topframelogobggreyed {  
-	background-color: #99c2d6;
-}
-
-.topframeshadow {  
-	background-color: #848484;
-}
-
-.topframeshadowgreyed {  
-background-color: #cecece;
-}
-
-.topleftnav {	
-    color: #000000;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-}
-
-.topleftnavbold { 
-	font-family: verdana, brial, helvetica, sans-serif;
-	font-size: 15px; 
-	font-weight: 600;
-	text-decoration: none; 
-}
-
-.topleftnavboldgreyed { 
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif; 
-	font-size: 15px; 
-	font-weight: bold;
-	text-decoration: none; 
-}
-
-.topleftnavgreyed {	
-	color: #999999;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 15px;
-	text-decoration: none;
-	}
-
-.toplinecolor { 
-	background-color: #006699;
- }	
-	
-.toprightnav {
-	color: #ffffff;
-	font-family: verdana, arial, helvetica, sans-serif;
-	font-size: 14px;
-	text-decoration: none;
-}
-
-.toprightnavgrey
-{
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-	font-size: 10px;
-	color: #000000;
-	text-decoration: none;
-}
-
-
- /* this was initially declared the same colour as the class topframe bg but because it lies in a different functional area, has been recreated here  */
-tr.bgmidframe {
-	background-color: #d2d2d2;
-}
-
-td.sidemenubulletgrey {
-	background-color: #999999;
-}
-
-
-td.sidemenubulletcolored {
-	background-color: #cd3301;
-}
-
-/*list-style-image: url(images/downbutton.gif);*/
-ul {	
-
-	list-style-type: square;
-}
- 
-
-.vob {
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 150%;
-	color: #006699;
-	text-decoration: none;
-	font-weight: 400;
-}
-
-.vobbottom {
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 21px;
-	text-decoration: none;
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/icons/Publishing.gif b/1.5/plugins/org.eclipse.epf.publishing/icons/Publishing.gif
deleted file mode 100644
index 531baf2..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/icons/Publishing.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/images/Artifact.jpg b/1.5/plugins/org.eclipse.epf.publishing/images/Artifact.jpg
deleted file mode 100644
index 6739127..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/images/Artifact.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/images/Role.jpg b/1.5/plugins/org.eclipse.epf.publishing/images/Role.jpg
deleted file mode 100644
index 2f183a2..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/images/Role.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/images/Task.jpg b/1.5/plugins/org.eclipse.epf.publishing/images/Task.jpg
deleted file mode 100644
index 65ac2c4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/images/Task.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/images/top.gif b/1.5/plugins/org.eclipse.epf.publishing/images/top.gif
deleted file mode 100644
index 615acf4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/images/top.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/keywordindexdef.txt b/1.5/plugins/org.eclipse.epf.publishing/keywordindexdef.txt
deleted file mode 100644
index 441718c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/keywordindexdef.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-relativepath	..
-wwwroot	..
-mainresultfile	/index/index.htm
-indexresultfile	/index/navig.htm
-keywordresultfile	/index/contents.htm
-maintitle	Index - Basic Unified Process
-target	ory_doc
-indextarget	index_t
-keywordtarget	keyword_t
-indexheight	25
-headerfile	keywordpreamble.txt
-footerfile	keywordpostamble.txt
-keywordfile	keywords.txt
-leaveDir	_borders
-mulitdocumentkeyword	false
-showdocumenttitle	false
-prefix	XE_
-levelseparator	__
-see	, See
-seealso	, See also
-levelstyle	defaultstyle	indexlevel2
-levelstyle	1	indexlevel1
-levelstyle	2	indexlevel2
-levelstyle	headlinestyle	indexheading 
diff --git a/1.5/plugins/org.eclipse.epf.publishing/keywordpostamble.txt b/1.5/plugins/org.eclipse.epf.publishing/keywordpostamble.txt
deleted file mode 100644
index 11a09ca..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/keywordpostamble.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/keywordpreamble.txt b/1.5/plugins/org.eclipse.epf.publishing/keywordpreamble.txt
deleted file mode 100644
index 962e751..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/keywordpreamble.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-<html>
-<head>
-<META http-equiv="Content-Type" content="text/html; charset=utf-8">
-<link rel="StyleSheet" href="index.css" type="text/css">
-<title>Index - Basic Unified Process</title>
-
-</head>
-<body bgcolor="#FFFFFF" text="#000000" link="#004080" vlink="#8000FF" alink="#0000FF">
-  
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/keywords.txt b/1.5/plugins/org.eclipse.epf.publishing/keywords.txt
deleted file mode 100644
index cdd257d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/keywords.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-XE_KeyWordIndex__Copyright	XE_Copyright
-XE_SiteMap__Copyright	XE_Copyright
-XE_SearchEngine__Copyright	XE_Copyright
-XE_TreeBrowser__Copyright	XE_Copyright
-XE_TreeBrowser__Example	XE_System_requirements
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/lib/rpwcore.jar b/1.5/plugins/org.eclipse.epf.publishing/lib/rpwcore.jar
deleted file mode 100644
index ef91494..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/lib/rpwcore.jar
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.publishing/plugin.properties b/1.5/plugins/org.eclipse.epf.publishing/plugin.properties
deleted file mode 100644
index 53597c0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/plugin.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Publishing
-providerName=Eclipse.org
-
-
-
-               
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/PublishingPlugin.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/PublishingPlugin.java
deleted file mode 100644
index 7838854..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/PublishingPlugin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing;
-
-import org.eclipse.epf.common.AbstractActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Publishing plug-in activator.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PublishingPlugin extends AbstractActivator {
-
-	/**
-	 * The plug-in ID.
-	 */
-	public static final String PLUGIN_ID = PublishingPlugin.class.getName();
-
-	/**
-	 * The shared plug-in instance.
-	 */
-	private static PublishingPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishingPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static PublishingPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/PublishingResources.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/PublishingResources.java
deleted file mode 100644
index d5afec0..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/PublishingResources.java
+++ /dev/null
@@ -1,117 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Publishing resource bundle.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public final class PublishingResources extends NLS {
-
-	private static String BUNDLE_NAME = PublishingResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private PublishingResources() {
-		// Do not instantiate
-	}
-
-	public static String publishingConfigurationTask_name;
-
-	public static String initializingDirTask_name;
-
-	public static String copyingFilesTask_name;
-
-	public static String generatingBookmarksTask_name;
-
-	public static String generatingBookmarkTask_name;
-
-	public static String generatingBookmarkIndexTask_name;
-
-	public static String publishingLinkedElementTask_name;
-
-	public static String publishingElementTask_name;
-
-	public static String generatingGlossaryTask_name;
-
-	public static String generatingSearchIndexTask_name;
-
-	public static String generatingWARFileTask_name;
-
-	public static String buildingProcessClosureTask_name;
-
-	public static String buildingElementClosureTask_name;
-
-	public static String loadLibraryTask_name;
-
-	public static String publishElementError_msg;
-
-	public static String serverError_msg;
-
-	public static String invalidHttpResponseError_msg;
-
-	public static String invalidElementWarning_msg;
-
-	public static String invalidMethodElementWarning_msg;
-
-	public static String copyFileWarning_msg;
-
-	public static String missingIconFileWarning_msg;
-
-	public static String missingIconNameWarning_msg;
-
-	public static String externalUrl_msg;
-
-	public static String createSearchIndexError_msg;
-
-	public static String referenceWorkflowsNode_text;
-
-	public static String taskNode_text;
-
-	public static String primarilyPerformsNode_text;
-
-	public static String additionallyPerformsNode_text;
-
-	public static String performingRolesNode_text;
-
-	public static String inputWorkProductsNode_text;
-
-	public static String outputWorkProductsNode_text;
-
-	public static String responsibleForNode_text;
-
-	public static String modifiesNode_text;
-
-	public static String responsibleRoleNode_text;
-
-	public static String containingWorkProductNode_text;
-
-	public static String containedWorkProductsNode_text;
-
-	public static String guidanceNode_text;
-
-	public static String inputToNode_text;
-
-	public static String outputFromNode_text;
-
-	public static String indexLabel_text;
-
-	public static String discaredCategoryWarning_msg;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PublishingResources.class);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/Resources.properties b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/Resources.properties
deleted file mode 100644
index 729525f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/Resources.properties
+++ /dev/null
@@ -1,67 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-#
-# Message ID Range: IUPP0000E - IUPP0099E
-#
-
-# Progress Messages
-publishingConfigurationTask_name=Publishing configuration...
-initializingDirTask_name=Initializing destination directory...
-copyingFilesTask_name=Copying files...
-generatingBookmarksTask_name=Generating bookmarks...
-generatingBookmarkTask_name=Generating bookmark ''{0}''...
-generatingBookmarkIndexTask_name=Generating bookmark index...
-publishingLinkedElementTask_name=Publishing method elements: {0} published, {1} remaining
-publishingElementTask_name=Publishing method element: {0}:{1}
-generatingGlossaryTask_name=Generating glossary...
-generatingSearchIndexTask_name=Generating search index...
-generatingWARFileTask_name=Generating WAR file...
-buildingProcessClosureTask_name=Building process closure...
-buildingElementClosureTask_name=Building element closure for ''{0}''...
-loadLibraryTask_name=Loading library contents...
-
-# Error Messages logged in the Publishing Report
-publishElementError_msg=IUPP0000E: Error publishing element: {0}
-serverError_msg=IUPP0001E: No data returned from server.
-invalidHttpResponseError_msg=IUPP0002E: Invalid response from http://{0}:{1}:{2}
-
-# Warning Messages logged in the Publishing Report
-invalidElementWarning_msg=IUPP0003W: Element was not published because it is not a valid element in the configuration.
-invalidMethodElementWarning_msg=IUPP0004W: Element was not published because it is not a method element: {0}
-copyFileWarning_msg=IUPP0005W: Unable to copy file from ''{0}'' to ''{1}''.
-missingIconFileWarning_msg=IUPP0006W: Node icon file ''{0}'' does not exists.
-missingIconNameWarning_msg=IUPP0007W: Unable to retrieve the name of the the node icon.
-externalUrl_msg={0} mini-seconds referencing external URL: {1}
-discaredCategoryWarning_msg=Empty content category element not published.
-
-# Error Details
-createSearchIndexError_msg=IUPP0008E: The search index file was not created.
-
-# Process Tree Nodes
-referenceWorkflowsNode_text=Reference Workflows
-taskNode_text=Tasks
-primarilyPerformsNode_text=Primarily Performs
-additionallyPerformsNode_text=Additionally Performs
-performingRolesNode_text=Performing Roles
-inputWorkProductsNode_text=Input Work Products
-outputWorkProductsNode_text=Output Work Products
-responsibleForNode_text=Responsible For
-modifiesNode_text=Modifies
-responsibleRoleNode_text=Responsible Role
-containingWorkProductNode_text=Containing Work Product
-containedWorkProductsNode_text=Contained Work Products
-guidanceNode_text=Guidance
-inputToNode_text=Input to
-outputFromNode_text=Output from
-
-# HTML Title for Index Page
-indexLabel_text=Index
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/package.html b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/package.html
deleted file mode 100644
index 87c42c8..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the activator for managing the Publishing plug-in's life cycle.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractPublishManager.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractPublishManager.java
deleted file mode 100644
index 2753318..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractPublishManager.java
+++ /dev/null
@@ -1,247 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.common.serviceability.DebugTrace;
-import org.eclipse.epf.library.util.FileNameGenerator;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * The abstract base class for all Publish Managers.
- * <p>
- * Use the org.eclipse.epf.publishing.ui.publishers extension point to extend
- * this class if you need to customize the publishing.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public abstract class AbstractPublishManager {
-
-	protected static boolean debug = PublishingPlugin.getDefault()
-			.isDebugging();
-
-	protected static boolean profiling = PublishingPlugin.getDefault()
-			.isProfiling();
-
-	protected String pubDir;
-
-	protected MethodConfiguration config;
-
-	protected PublishHTMLOptions options;
-
-	protected AbstractViewBuilder viewBuilder;
-
-	protected boolean success = false;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AbstractPublishManager() {
-	}
-
-	/**
-	 * Initilizes the publishing manager.
-	 * 
-	 * @param pubDir
-	 *            the publish directory
-	 * @param config
-	 *            a method configuration
-	 * @param options
-	 *            the publishing options
-	 */
-	public void init(String pubDir, MethodConfiguration config,
-			PublishOptions options) {
-		this.pubDir = pubDir;
-
-		if (!this.pubDir.endsWith(File.separator)) {
-			this.pubDir += File.separator;
-		}
-
-		this.config = config;
-		if (options instanceof PublishHTMLOptions) {
-			this.options = (PublishHTMLOptions) options;
-		} else {
-			throw new IllegalArgumentException();
-		}
-		this.viewBuilder = createViewBuilder();
-
-		// clear the file name cache
-		// NameCache.getInstance().clear();
-	}
-
-	/**
-	 * get the publishing view builder. The view builder is responsible to build
-	 * the publishing views and contents.
-	 * 
-	 * @return AbstractViewBuilder
-	 */
-	public AbstractViewBuilder getViewBuilder() {
-		return this.viewBuilder;
-	}
-
-	public ISiteGenerator getSiteGenerator() {
-		return viewBuilder.getSiteGenerator();
-	}
-
-	/**
-	 * do publishing. The publishing process is defined in three steps.
-	 * prePublish to do some preparation before the actual publishing doPublish
-	 * to publish the views and contents postPublish to do some cleanup work
-	 * after publish. Extended classes can override these methods to achieve
-	 * additional publishing results.
-	 * 
-	 * @param monitor
-	 *            IProgressMonitor
-	 * @throws PublishingServiceException
-	 */
-	public void publish(IProgressMonitor monitor)
-			throws PublishingServiceException {
-
-		if (options != null) {
-			options.validate();
-		}
-
-		// clear the file name cache so that the file name will be based on the latest library data
-		// this can avoid the cases where element name changed before publishing
-		FileNameGenerator.INSTANCE.clear();
-		
-		long beginTime = 0L;
-		long startTime = 0L;
-
-		// do a gc before getting stared
-		Runtime.getRuntime().gc();
-		
-		try {
-			if (profiling) {
-				beginTime = startTime = System.currentTimeMillis();
-			}
-			
-			prePublish(monitor);
-			if (profiling) {
-				DebugTrace.print(this, "prePublish", //$NON-NLS-1$
-						(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-			}
-
-			if (profiling) {
-				startTime = System.currentTimeMillis();
-			}
-						
-			doPublish(monitor);
-			if (profiling) {
-				DebugTrace.print(this, "doPublish", //$NON-NLS-1$
-						(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-			}
-
-			if (profiling) {
-				startTime = System.currentTimeMillis();
-			}
-			postPublish(monitor);
-			if (profiling) {
-				DebugTrace.print(this, "postPublish", //$NON-NLS-1$
-						(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-			}
-
-			success = true;
-		} catch (Exception e) {
-			throw new PublishingServiceException(e);
-		} finally {
-			if (profiling) {
-				System.out
-						.println("Time taken to publish configuration '" + config.getName() //$NON-NLS-1$
-								+ "': " + (System.currentTimeMillis() - beginTime) + " ms"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	protected Collection<Resource> loadLibrary(IProgressMonitor monitor) {
-		// first of all, we need to load the library,
-		// otherwise, some relationships and opposite features are not
-		// established
-		long startTime = 0L;
-		monitor.subTask(PublishingResources.loadLibraryTask_name);
-		if (profiling) {
-			startTime = System.currentTimeMillis();
-		}
-		
-		Collection<Resource> changedResources = LibraryUtil.loadAll((MethodLibrary) config.eContainer());
-		if (profiling) {
-			DebugTrace.print(this, "loadLibrary", "LibraryUtil.loadAll: " //$NON-NLS-1$  //$NON-NLS-2$
-							+ (System.currentTimeMillis() - startTime)
-							+ " ms"); //$NON-NLS-1$
-		}
-
-		return changedResources;
-	}
-	
-//	protected void unloadResources(Collection<Resource> resources) {
-//		
-//		//Runtime.getRuntime().gc();
-//		//long m1 = Runtime.getRuntime().freeMemory()/1000000;
-//		PersistenceUtil.unload(resources);
-//		//Runtime.getRuntime().gc();		
-//		//long m2 = Runtime.getRuntime().freeMemory()/1000000;
-//		//System.out.println("*** " + Long.toString(m2-m1) + " MB freed by unloading resources");
-//	}
-//
-//	protected void disposeDiagramManagers(Collection<DiagramManager> mgrs, Collection<DiagramManager> keeplist) {
-//		for ( Iterator<DiagramManager> it = mgrs.iterator(); it.hasNext(); ) {
-//			DiagramManager mgr = it.next();
-//			if ( keeplist == null || !keeplist.contains(mgr) ) {
-//				mgr.dispose();
-//			}
-//		}
-//	}
-	
-	/**
-	 * Disposes the object. Once disposed, the object is not valid any more.
-	 */
-	public void dispose() {
-		if (viewBuilder != null) {
-			viewBuilder.dispose();
-			viewBuilder = null;
-		}
-	}
-
-	/**
-	 * abstract method to get the url to the published site
-	 * 
-	 * @return String the url
-	 */
-	public abstract String getPublishedUrl();
-
-	/**
-	 * abstract method to get the url to the publish report
-	 * 
-	 * @return String
-	 */
-	public abstract String getPublishReportUrl();
-
-	protected abstract AbstractViewBuilder createViewBuilder();
-
-	protected abstract void prePublish(IProgressMonitor monitor)
-			throws Exception;
-
-	protected abstract void doPublish(IProgressMonitor monitor)
-			throws Exception;
-
-	protected abstract void postPublish(IProgressMonitor monitor)
-			throws Exception;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractSiteGenerator.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractSiteGenerator.java
deleted file mode 100644
index 504804f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractSiteGenerator.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.net.URL;
-import java.util.List;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.library.layout.Bookmark;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.publishing.PublishingPlugin;
-
-/**
- * The abstract base class for a Site Generator.
- * 
- * @author Jinhua Xi
- */
-public abstract class AbstractSiteGenerator implements ISiteGenerator {
-	
-	public static final String DOC_ROOT = "docroot/"; //$NON-NLS-1$;
-
-	private static final String WEB_INF_PATH = "docroot/WEB-INF"; //$NON-NLS-1$
-	private static final String WEB_INF_DIR = "WEB-INF"; //$NON-NLS-1$
-	
-	protected String pubDir;
-	protected PublishHTMLOptions options;
-	protected HtmlBuilder builder;
-	
-	public AbstractSiteGenerator(HtmlBuilder builder, PublishHTMLOptions options) {
-		this.options = options;
-		this.builder = builder;
-		this.pubDir = builder.getPublishDir();
-	}
-
-	public abstract HtmlBuilder getHtmlBuilder();
-
-	public abstract String getIndexFilePath();
-
-	public abstract String getNodeIconPath(); 
-
-	public abstract String getDefaultBannerImageFile();
-	
-	public abstract PublishOptions getPublishOptions();
-
-	public abstract void postPublish() throws Exception;
-
-	public abstract void prePublish() throws Exception;
-	
-	public abstract void writePublishedBookmarks(List bookmarks, Bookmark defaultView)
-			throws Exception;
-	
-	protected void copyCustomizedFiles() throws Exception {
-		if (options.bannerImage != null && options.bannerImage.length() > 0) {
-			FileUtil.copyFile(options.bannerImage, pubDir + "images"); //$NON-NLS-1$
-			options.bannerImage = FileUtil.getFileName(options.bannerImage);
-		} else {
-			options.bannerImage = getDefaultBannerImageFile();
-		}
-		
-		if (options.isPublishDynamicWebApp()) {
-			URL plugin_url = PublishingPlugin.getDefault().getInstallURL();
-			String path = FileLocator.resolve(new URL(plugin_url, WEB_INF_PATH)).getPath();
-			String includes = "*.*, **/"; //$NON-NLS-1$
-			LayoutResources.copyDir(path, pubDir + WEB_INF_DIR, includes, null);
-		}
-	}
-
-	protected void copyLocalizedFiles() throws Exception {
-
-		// copy scripts, rename the localse specific name to the default
-		// name
-		PublishingPlugin
-				.getDefault()
-				.copyLocalizedFiles(
-						DOC_ROOT + "scripts/", new File(pubDir, "scripts/"), true, false); //$NON-NLS-1$ //$NON-NLS-2$
-
-		PublishingPlugin.getDefault().copyLocalizedFiles(
-				DOC_ROOT + "images/", new File(pubDir, "images/"), true, false); //$NON-NLS-1$ //$NON-NLS-2$
-
-		PublishingPlugin.getDefault().copyLocalizedFiles(DOC_ROOT,
-				new File(pubDir, "/"), false, false); //$NON-NLS-1$ //$NON-NLS-2$
-
-	}
-	
-	protected String getViewDataFileName(Bookmark b, String ext) {
-		File f = new File(b.getFileName());
-		String fileName = f.getName();
-		int i = fileName.lastIndexOf("."); //$NON-NLS-1$
-		if (i >= 0) {
-			fileName = fileName.substring(0, i);
-		}
-
-		return fileName + ext; //$NON-NLS-1$
-	}
-	
-	public void dispose() {
-		if ( builder != null ) {
-			builder.getLayoutManager().clear();
-			builder.dispose();
-			builder = null;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractViewBuilder.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractViewBuilder.java
deleted file mode 100644
index 9b7ce8b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/AbstractViewBuilder.java
+++ /dev/null
@@ -1,543 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.Timer;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.Bookmark;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.util.IconUtil;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The abstract base class for all publishing view builders.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class AbstractViewBuilder {
-
-	protected static final int TIMEOUT_INTERVAL = 600000; // in milliseconds
-
-	protected static boolean profiling = PublishingPlugin.getDefault()
-			.isProfiling();
-
-	protected ISiteGenerator siteGenerator;
-
-	protected PublishOptions options;
-
-	protected MethodConfiguration config;
-
-	protected Bookmark defaultView;
-
-	PublishingRunnable runnable = null;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param generator
-	 *            a site generator
-	 */
-	public AbstractViewBuilder(ISiteGenerator generator) {
-		this.siteGenerator = generator;
-		this.options = generator.getPublishOptions();
-		this.config = generator.getHtmlBuilder().getLayoutManager()
-				.getConfiguration();
-		this.runnable = new PublishingRunnable(generator.getHtmlBuilder(), TIMEOUT_INTERVAL);
-	}
-
-	/**
-	 * Gets the site generator.
-	 * 
-	 * @return the site generator assigned to this view builder
-	 */
-	public ISiteGenerator getSiteGenerator() {
-		return this.siteGenerator;
-	}
-
-	/**
-	 * Gets the HTML builder.
-	 * 
-	 * @return the HTML builder assigned to this view builder
-	 */
-	public HtmlBuilder getHtmlBuilder() {
-		return this.siteGenerator.getHtmlBuilder();
-	}
-
-	/**
-	 * Gets the publishing options.
-	 * 
-	 * @return the publishing options assigned to this view builder
-	 */
-	public PublishOptions getOptions() {
-		return this.siteGenerator.getPublishOptions();
-	}
-
-	/**
-	 * Gets the layout manager.
-	 * 
-	 * @return an element layout manager assigned to this view builder
-	 */
-	public ElementLayoutManager getLayoutMgr() {
-		return getHtmlBuilder().getLayoutManager();
-	}
-
-	/**
-	 * Gets the content validator.
-	 * 
-	 * @return an element layout manager assigned to this view builder
-	 */
-	public PublishingContentValidator getValidator() {
-		return (PublishingContentValidator) getHtmlBuilder().getValidator();
-	}
-
-	/**
-	 * Checks whether a method element can be published or not.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return <code>true</code> if the method element can be published
-	 */
-	protected boolean canPublish(MethodElement element) {
-		return isVisible(element);
-	}
-
-	/**
-	 * Checks whether a method element will be visible in the published web
-	 * site.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return <code>true</code> if the method element will be visible in the
-	 *         published web site
-	 */
-	protected boolean isVisible(MethodElement element) {
-		if (element == null) {
-			return false;
-		}
-
-		if (getValidator().isDiscarded(null, null, element)) {
-			return false;
-		}
-
-		if (!ConfigurationHelper.canShow(element, config)) {
-			return false;
-		}
-
-		if (options.isPublishProcess()) {
-			return getValidator().inClosure(element);
-		} else {
-			return true;
-		}
-	}
-
-	protected void discardEmptyCategory(ContentCategory element, boolean discard) {
-		if (discard) {
-			getValidator().setDiscardedElement(element);
-			getValidator().logWarning(element,
-					PublishingResources.discaredCategoryWarning_msg);
-		} else {
-			getValidator().addValidCategory((ContentCategory) element);
-		}
-	}
-
-	protected MethodElement calc01FeatureValue(MethodElement element,
-			EStructuralFeature feature) {
-		return ConfigurationHelper.calc01FeatureValue(element, feature,
-				getLayoutMgr().getElementRealizer());
-	}
-
-	protected List calc0nFeatureValue(MethodElement element,
-			EStructuralFeature feature) {
-		return ConfigurationHelper.calc0nFeatureValue(element, feature,
-				getLayoutMgr().getElementRealizer());
-	}
-
-	protected MethodElement calc01FeatureValue(MethodElement element,
-			OppositeFeature feature) {
-		return ConfigurationHelper.calc01FeatureValue(element, feature,
-				getLayoutMgr().getElementRealizer());
-	}
-
-	protected List calc0nFeatureValue(MethodElement element,
-			OppositeFeature feature) {
-		return ConfigurationHelper.calc0nFeatureValue(element, feature,
-				getLayoutMgr().getElementRealizer());
-	}
-
-	protected List getPublishedElements() {
-		return getValidator().getPublishedElements();
-	}
-
-	
-	/**
-	 * Publishes the element, collects the linked elements in the published
-	 * content.
-	 * 
-	 * @param monitor
-	 *            a progress monitor
-	 * @param element
-	 *            a method element
-	 */
-	protected void publish(final IProgressMonitor monitor,
-			final MethodElement element) {
-		
-		// System.out.println("--- Begin publishing element " +
-		// element.getGuid() + ":" + element.getType().getName() + ":" +
-		// element.getName() );
-		try {
-			List linkedElements = getValidator()
-					.getReferencedElements();
-			List publishedElements = getValidator()
-					.getPublishedElements();					
-			HtmlBuilder htmlBuilder = getHtmlBuilder();
-			if (!canPublish(element)) {
-				htmlBuilder.getValidator().logWarning(element,
-						PublishingResources.invalidElementWarning_msg);
-			} else if (!publishedElements.contains(element)) {
-				try {
-					if (monitor != null) {
-						String str;
-						if (linkedElements != null) {
-							str = NLS
-									.bind(
-											PublishingResources.publishingLinkedElementTask_name,
-											Integer
-													.toString(publishedElements
-															.size()),
-											Integer
-													.toString(linkedElements
-															.size()));
-						} else {
-							str = NLS
-									.bind(
-											PublishingResources.publishingElementTask_name,
-											element.getType().getName(),
-											element.getName());
-						}
-						monitor.subTask(str);
-
-					}
-					IElementLayout layout = htmlBuilder
-							.getLayoutManager()
-							.getLayout(element, true);
-//					String htmlfile = htmlBuilder.generateHtml(layout);
-					String htmlfile = runnable.generateHtml(layout);
-					elementPublished(layout, htmlfile);
-
-				} catch (Exception ex) {
-					htmlBuilder
-							.getValidator()
-							.logError(
-									element,
-									NLS
-											.bind(
-													PublishingResources.publishElementError_msg,
-													ex.getMessage()),
-									ex);
-				}
-				publishedElements.add(element);
-			} else {
-				// System.out.println("Already generated: " +
-				// getURL(element) );
-			}
-		} catch (RuntimeException e) {
-			getHtmlBuilder()
-					.getValidator()
-					.logError(
-							element,
-							NLS
-									.bind(
-											PublishingResources.publishElementError_msg,
-											e.getMessage()), e);
-		}
-	}
-
-	protected void elementPublished(IElementLayout layout, String htmlfile) {
-	}
-
-	private void copyNodeIcon(File source) {
-		String name = source.getName();
-
-		File dest = new File(siteGenerator.getNodeIconPath(), name);
-		if (FileUtil.copyFile(source, dest) == false) {
-			getHtmlBuilder().getValidator().logWarning(
-					NLS.bind(PublishingResources.copyFileWarning_msg, source
-							.getAbsolutePath(), dest.getAbsolutePath()));
-		}
-
-	}
-
-	private String getNodeIconName(Object obj) {
-		File iconFile = null;
-		String iconName = null;
-
-		if (obj instanceof DescribableElement) {
-			URI uri = ((DescribableElement) obj).getNodeicon();
-
-			String elementName = ((DescribableElement) obj).getType().getName()
-					.toLowerCase();
-			if (DefaultElementTypeResources.useDefaultIcon(elementName))
-				uri = null;
-
-			if (uri != null) {
-				// try if this is a valid URL or not
-				boolean isFullPath = false;
-				try {
-					URL url = uri.toURL();
-					if (url != null) {
-						iconFile = new File(URLDecoder.decode(url.getFile(),
-								"UTF-8")); //$NON-NLS-1$
-						isFullPath = true;
-					}
-				} catch (Exception ex) {
-					// not a valid url, maybe a relative path
-				}
-
-				if (!isFullPath) {
-					// iconFile = new
-					// File(LibraryService.getInstance().getCurrentMethodLibraryPath(),
-					// URLDecoder.decode(uri.toString()));
-					// To handle the nodeIcon uri, EPF 1.2, its changed now it
-					// is relative to plugin path.
-					iconFile = new File(
-							TngUtil.getFullPathofNodeorShapeIconURI(
-									(EObject) obj, uri));
-				}
-			}
-		}
-
-		if ((iconFile != null) && !iconFile.exists()) {
-			iconFile = null;
-		}
-
-		if (iconFile == null) {
-			// get the default icon name
-			if (obj instanceof MethodElement) {
-				String type = ((MethodElement) obj).getType().getName()
-						.toLowerCase();
-				iconFile = IconUtil.getNodeIconFile(type);
-			}
-		}
-
-		if (iconFile != null) {
-			// need to copy the file together and zip for the applet
-			if (!iconFile.exists()) {
-				if (obj instanceof MethodElement) {
-					getHtmlBuilder()
-							.getValidator()
-							.logWarning(
-									(MethodElement) obj,
-									NLS
-											.bind(
-													PublishingResources.missingIconFileWarning_msg,
-													iconFile.getAbsolutePath()));
-				} else {
-					getHtmlBuilder()
-							.getValidator()
-							.logWarning(
-									NLS
-											.bind(
-													PublishingResources.missingIconFileWarning_msg,
-													iconFile.getAbsolutePath()));
-				}
-			}
-
-			copyNodeIcon(iconFile);
-			iconName = iconFile.getName();
-		}
-
-		if (iconName == null || iconName.length() == 0) {
-			String name;
-			if (obj instanceof MethodElement) {
-				name = ((MethodElement) obj).getName();
-			} else {
-				name = obj.toString();
-			}
-
-			getHtmlBuilder().getValidator().logWarning(
-					NLS.bind(PublishingResources.missingIconNameWarning_msg,
-							name));
-		}
-
-		return iconName;
-	}
-
-	/**
-	 * Gets the display name for a method element or iterm provider adapter.
-	 * 
-	 * @param obj
-	 *            a method element or iterm provider adapter
-	 * @return the display name or <code>null</code>
-	 */
-	private String getName(Object obj) {
-		String name = null;
-		if (obj instanceof MethodElement) {
-			MethodElement e = (MethodElement) obj;
-
-			// calculate the presentation name, for extenders, get from base if
-			// needed
-			name = ConfigurationHelper.getPresentationName(e, config);
-			if (name == null || name.equals("")) { //$NON-NLS-1$
-				name = e.getClass().getName();
-				int index = name.lastIndexOf("."); //$NON-NLS-1$
-				if (index >= 0) {
-					name = name.substring(index + 1);
-					if (name.endsWith("Impl")) { //$NON-NLS-1$
-						name = name.substring(0, name.length() - 4);
-					}
-				}
-			}
-		} else if (obj instanceof ItemProviderAdapter) {
-			ItemProviderAdapter provider = (ItemProviderAdapter) obj;
-			name = provider.getText(obj);
-		}
-		return name;
-	}
-
-	/**
-	 * Gets the GUID for a method element.
-	 * 
-	 * @param obj
-	 *            a method element
-	 * @return the GUID for a method element or <code>null</code>
-	 */
-	private String getGUID(Object obj) {
-		if (obj instanceof MethodElement) {
-			return ((MethodElement) obj).getGuid();
-		} else
-			return null;
-	}
-
-	/**
-	 * Gets thr URL for a method element.
-	 * 
-	 * @param obj
-	 *            a method element
-	 * @return the URL for a method element or a blank HTML
-	 */
-	private String getURL(Object obj) {
-		if (obj instanceof MethodElement) {
-			return getLayoutMgr().getLayout((MethodElement) obj, true).getUrl();
-		} else {
-			// FIXME: layout needs to be provided for uncategorized and category
-			// object
-			return "applet//empty.htm"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Creates a bookmark for a method element
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a <code>Bookmark</code>
-	 */
-	protected Bookmark createBookmark(IProgressMonitor monitor, Object element) {
-		// publish this element
-		if (element instanceof MethodElement) {
-			// delay the publishing till the bookmarks are created.
-			getHtmlBuilder().getValidator().addReferencedElement(null,
-					(MethodElement) element);
-		}
-
-		// create a bookmark for this element
-		String name = getName(element);
-		String guid = getGUID(element);
-		String url = getURL(element);
-		String nodeIcon = getNodeIconName(element);
-
-		String msg = NLS.bind(PublishingResources.generatingBookmarkTask_name,
-				name);
-		monitor.subTask(msg);
-		return createBookmark(name, guid, url, nodeIcon, nodeIcon, element);
-	}
-
-	protected Bookmark createBookmark(String name, String guid, String url,
-			String closeIcon, String openIcon, Object owner) {
-
-		Bookmark b = new Bookmark(name);
-		b.setPresentationName(name);
-		b.setUniqueId(guid);
-		b.setClosedIconName(closeIcon);
-		b.setOpenIconName(openIcon);
-		b.setFileName(url);
-		b.setFromContentLibrary(true);
-		b.setEnabled(true);
-		b.setExist(true);
-		b.setVisible(true);
-		b.setTransparency(false);
-		b.setDefault(true);
-		b.setCurrent(false);
-		b.setOwner(owner);
-		return b;
-	}
-
-	/**
-	 * Gets the default view.
-	 * 
-	 * @return a <code>Bookmark</code> that encapsulates the default view
-	 */
-	public Bookmark getDefaultView() {
-		return defaultView;
-	}
-
-	/**
-	 * Builds the views and returns a list of bookmark objects.
-	 * 
-	 * @param monitor
-	 *            a progress monitor
-	 * @return a list of <code>Bookmark</code>
-	 */
-	public abstract List<Bookmark> buildViews(IProgressMonitor monitor);
-
-	/**
-	 * Disposes this object.
-	 */
-	public void dispose() {
-
-		config = null;
-		if ( runnable != null ) {
-			runnable.dispose();
-			runnable = null;
-		}
-		
-		if ( siteGenerator != null ) {
-			siteGenerator.dispose();
-			siteGenerator = null;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
deleted file mode 100644
index 6516d28..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
+++ /dev/null
@@ -1,1685 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.serviceability.DebugTrace;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.common.utils.Timer;
-import org.eclipse.epf.library.configuration.ConfigurationFilter;
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.Bookmark;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.library.layout.elements.ActivityLayout;
-import org.eclipse.epf.library.layout.elements.ProcessElementItem;
-import org.eclipse.epf.library.layout.elements.ProcessLayoutData;
-import org.eclipse.epf.library.layout.elements.SummaryPageLayout;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.epf.publishing.util.PublishingUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * Builds the views defined for a method configuration.
- * 
- * @author Shilpa Toraskar
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationViewBuilder extends AbstractViewBuilder {
-
-	private static final String PREFIX_Reference_Workflows = "Reference_Workflows"; //$NON-NLS-1$
-
-	private static final String PREFIX_Tasks = "Tasks"; //$NON-NLS-1$
-
-	private static final String PREFIX_ResponsibleFor_Tasks = "Primarily_Performs"; //$NON-NLS-1$
-
-	private static final String PREFIX_ParticipatesIn_Tasks = "Additionally_Performs"; //$NON-NLS-1$
-
-	private static final String PREFIX_Performing_Roles = "Performing_Roles"; //$NON-NLS-1$
-
-	private static final String PREFIX_Input_Work_Products = "Input_Work_Products"; //$NON-NLS-1$
-
-	private static final String PREFIX_Output_Work_Products = "Output_Work_Products"; //$NON-NLS-1$
-
-	private static final String PREFIX_Work_Products_Created = "Responsible_For"; //$NON-NLS-1$
-
-	private static final String PREFIX_Work_Products_Modified = "Modifies"; //$NON-NLS-1$
-
-	private static final String PREFIX_Responsible_Role = "Responsible_Role"; //$NON-NLS-1$
-
-	private static final String PREFIX_Containing_Work_Product = "Containing_Work_Product"; //$NON-NLS-1$
-
-	private static final String PREFIX_Contained_Work_Products = "Contained_Work_Products"; //$NON-NLS-1$
-
-	private static final String PREFIX_Guidances = "Guidance"; //$NON-NLS-1$
-
-	private static final String PREFIX_InputTo_Task = "Input_to"; //$NON-NLS-1$
-
-	private static final String PREFIX_OutputOf_Task = "Output_from"; //$NON-NLS-1$
-
-	private static final String ICON_FOLDER = DefaultNodeIconResources
-			.getIconName("folder"); //$NON-NLS-1$
-
-	private static final String NODE_Reference_Workflows = PublishingResources.referenceWorkflowsNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Tasks = PublishingResources.taskNode_text; //$NON-NLS-1$
-
-	private static final String NODE_ResponsibleFor_Tasks = PublishingResources.primarilyPerformsNode_text; //$NON-NLS-1$
-
-	private static final String NODE_ParticipatesIn_Tasks = PublishingResources.additionallyPerformsNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Performing_Roles = PublishingResources.performingRolesNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Input_Work_Products = PublishingResources.inputWorkProductsNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Output_Work_Products = PublishingResources.outputWorkProductsNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Work_Products_Created = PublishingResources.responsibleForNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Work_Products_Modified = PublishingResources.modifiesNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Responsible_Role = PublishingResources.responsibleRoleNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Containing_Work_Product = PublishingResources.containingWorkProductNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Contained_Work_Products = PublishingResources.containedWorkProductsNode_text; //$NON-NLS-1$
-
-	private static final String NODE_Guidances = PublishingResources.guidanceNode_text; //$NON-NLS-1$
-
-	private static final String NODE_InputTo_Task = PublishingResources.inputToNode_text; //$NON-NLS-1$
-
-	private static final String NODE_OutputOf_Task = PublishingResources.outputFromNode_text; //$NON-NLS-1$
-
-	private static final String PROCESS_LAYOUT_DATA_FILE = "/scripts/processElementData.js"; //$NON-NLS-1$
-
-	private static final Class ITreeItemContentProviderClass = ITreeItemContentProvider.class;
-
-	protected static boolean debug = PublishingPlugin.getDefault()
-			.isDebugging();
-
-	protected List<Bookmark> bookmarks = new ArrayList<Bookmark>();
-
-	protected AdapterFactory adapterFactory;
-
-	protected IProgressMonitor monitor = null;
-
-	protected EObjectComparator nameComparator = new EObjectComparator();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationViewBuilder(ISiteGenerator siteGenerator) {
-		super(siteGenerator);
-	}
-
-	/**
-	 * Build the views defined in the configuration and publish the related
-	 * contents.
-	 * 
-	 * @param monitor
-	 *            IProgressMonitor
-	 * @return List a list of Bookmarks for the views
-	 */
-	public List<Bookmark> buildViews(IProgressMonitor monitor) {
-		this.monitor = monitor;
-
-		// System.out.println("Building views..."); //$NON-NLS-1$
-
-		long startTime = 0L;
-
-		if (config != null) {
-			
-// already done in PublishManager
-//			// first of all, we need to load the library,
-//			// otherwise, some relationships and opposite features are not
-//			// established
-//			monitor.subTask(PublishingResources.loadLibraryTask_name);
-//			if (profiling) {
-//				startTime = System.currentTimeMillis();
-//			}
-//			LibraryUtil.loadAll((MethodLibrary) config.eContainer());
-//			if (profiling) {
-//				DebugTrace.print(this, "buildViews", "LibraryUtil.loadAll: " //$NON-NLS-1$  //$NON-NLS-2$
-//								+ (System.currentTimeMillis() - startTime)
-//								+ " ms"); //$NON-NLS-1$
-//			}
-
-			// create a filter that does not discard the contributors.
-			// so we get the contributors in to show in the navigation tree
-			IFilter configFilter = new ConfigurationFilter(config, false);
-			adapterFactory = TngAdapterFactory.INSTANCE
-					.getConfigurationView_AdapterFactory(configFilter);
-
-			if (options != null && options.isPublishProcess()) {
-				makeProcessClosure();
-			}
-
-			// publish all the views in the configuration
-			if (profiling) {
-				startTime = System.currentTimeMillis();
-			}
-			List views = LibraryUtil.getValidViews(config);
-			for (Iterator it = views.iterator(); it.hasNext();) {
-				if (monitor.isCanceled()) {
-					return null;
-				}
-
-				ContentCategory v = (ContentCategory) it.next();
-				if (!ConfigurationHelper.canShow(v, config)) {
-					continue;
-				}
-
-				Object element = LibraryUtil.unwrap(v);
-				Bookmark b = createBookmark(this.monitor, element);
-
-				if (v == config.getDefaultView()) {
-					super.defaultView = b;
-				}
-
-				// iterate thru configuration to build the view
-				iterate(v, b);
-				if (b.getChildCount() > 0) {
-					bookmarks.add(b);
-				}
-			}
-			if (profiling) {
-				System.out.println("Time taken to publish bookmarks: " //$NON-NLS-1$
-						+ (System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-			}
-
-			if (monitor.isCanceled()) {
-				return null;
-			}
-		}
-
-		if (profiling) {
-			startTime = System.currentTimeMillis();
-		}
-		publishReferenceElements();
-		if (profiling) {
-			DebugTrace.print(this, "publishReferenceElements", //$NON-NLS-1$
-					(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-		}
-
-		// copyIconsForNonApplet();
-
-		if (monitor.isCanceled()) {
-			return null;
-		}
-
-		// save published element urls
-		if (profiling) {
-			startTime = System.currentTimeMillis();
-		}
-		saveElementUrls();
-		if (profiling) {
-			DebugTrace.print(this, "saveElementUrls", //$NON-NLS-1$
-					(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-		}
-
-		return bookmarks;
-	}
-
-	/**
-	 * The process element closure is generated as follows:
-	 * <p>
-	 * 1. publish the selected processses, which brings in all the related
-	 * process elements
-	 * <p>
-	 * 2. publish all the referenced process elements from step 1, this brings
-	 * in all the directly referenced content elements. make a first level
-	 * closure to include the published elements and the referenced elements.
-	 * Any direct references to any type of guidances are also in this closure.
-	 * <p>
-	 * 3. publish all the referened non-ContentCategory content elements from
-	 * step 2. based on the first level closure. The purpose of the first level
-	 * closure is to allow bring in guidances with valid element link and any
-	 * other references such as a Task or Role, being linked with a missing
-	 * element link. This again brings in all the direct references
-	 * <p>
-	 * 4.Make the final closure by including the following elements:
-	 * <p>
-	 * a. all published elements from step 1,2,3.
-	 * <p>
-	 * b. all referenced Guidances from step 3
-	 * <p>
-	 * c. all Guidances of type Practice, RoadMap, Suporting Material, and Term
-	 * Definition, in the configuration
-	 * <p>
-	 * d. all Content Categories that contains at least one element of type a,
-	 * b, or c. and their parent categories
-	 * <p>
-	 * The selected view is published based on the element closure defined
-	 * above.
-	 */
-	private void makeProcessClosure() {
-		monitor.subTask(PublishingResources.buildingProcessClosureTask_name);
-
-		// publish the selected processes
-		// need to build a closure of all the elements involved in the
-		// processes
-		List<Process> processes = options.getProcesses();
-		if (processes != null && processes.size() > 0) {
-			for (Iterator<Process> it = processes.iterator(); it.hasNext();) {
-				makeProcessClosure(it.next());
-				if (monitor.isCanceled()) {
-					return;
-				}
-			}
-		}
-
-		// make the first level closure to include all the process elements and
-		// it's referenced elements
-		// any thing except Guidances and ContentCategories outside the closure
-		// is filtered
-		getValidator()
-				.addClosureElements(getValidator().getPublishedElements());
-		getValidator().addClosureElements(
-				getValidator().getReferencedElements());
-
-		// now publish all referenced elements, any direct references in the
-		// process elements are
-		// part of the closure
-		// don't publish content categories for now since they might be empty
-		// and discarded later
-		List refs = new ArrayList(getValidator().getReferencedElements());
-		for (Iterator it = refs.iterator(); it.hasNext();) {
-			MethodElement e = (MethodElement) it.next();
-			if (!(e instanceof ContentCategory)) {
-				super.publish(monitor, e);
-
-				// collect process specific layout info with suppression status
-				// this will incldue the diagrams and the supression states of
-				// each item under the current procee
-				if (LibraryUtil.isProcess(e)) {
-					publishProcessLayout((org.eclipse.epf.uma.Process) e);
-				}
-
-			}
-		}
-
-		// now, any referenced guidance should be in the closure,
-		// so include them and make the final closure
-		refs.clear();
-		for (Iterator it = getValidator().getReferencedElements().iterator(); it
-				.hasNext();) {
-			MethodElement e = (MethodElement) it.next();
-			if (e instanceof Guidance) {
-				refs.add(e);
-			}
-		}
-
-		if (refs.size() > 0) {
-			getValidator().addClosureElements(refs);
-		}
-
-		// now all the published elements are the element closure, make the
-		// final closure
-		getValidator().makeElementClosure();
-	}
-
-	private void makeProcessClosure(org.eclipse.epf.uma.Process proc) {
-
-		if (proc == null) {
-			return;
-		}
-
-		if (ConfigurationHelper.canShow(proc, config)) {
-			ActivityLayout l = new ActivityLayout();
-			l.init(getLayoutMgr(), proc, proc, null);
-			l.findAllLinkedElements();
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		if (ConfigurationHelper.isExtender(proc)) {
-			org.eclipse.epf.uma.Process baseProc = (org.eclipse.epf.uma.Process) proc
-					.getVariabilityBasedOnElement();
-			if (ConfigurationHelper.inConfig(baseProc, config)) {
-				makeProcessClosure(baseProc);
-			}
-		}
-
-	}
-
-	private void publishReferenceElements() {
-		// now process the referenced elements and publish the contents
-		while (getValidator().getReferencedElements().size() > 0) {
-			MethodElement e = (MethodElement) getValidator()
-					.getReferencedElements().remove(0);
-
-			try {
-				if (monitor.isCanceled()) {
-					return;
-				}
-
-				// references to method plugins and method packages can be
-				// ignored
-				if (e instanceof MethodPlugin || e instanceof MethodPackage) {
-					continue;
-				}
-
-				long startTime = System.currentTimeMillis();
-
-				super.publish(monitor, e);
-
-				// collect process specific layout info with suppression status
-				// this will incldue the diagrams and the supression states of
-				// each item under the current procee
-				if (LibraryUtil.isProcess(e)) {
-					// long startTime1 = System.currentTimeMillis();
-					publishProcessLayout((org.eclipse.epf.uma.Process) e);
-					// long endTime1 = System.currentTimeMillis();
-					// System.out.println("Published process " + e.getName() +
-					// ": " + (endTime1 - startTime1) + " ms");
-				}
-
-				long endTime = System.currentTimeMillis();
-				long timeTaken = endTime - startTime;
-				if (timeTaken >= 5000) {
-					System.out.println("Published " + e.getName() + ": " //$NON-NLS-1$ //$NON-NLS-2$
-							+ timeTaken + " ms"); //$NON-NLS-1$
-				}
-
-			} catch (Exception ex) {
-				ex.printStackTrace();
-				getValidator().logError(e, "Error publishing element", ex); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private void publishProcessLayout(final org.eclipse.epf.uma.Process e) {
-
-		Runnable runnable = new Runnable() {
-			public void run() {
-				try {
-					ActivityLayout layout = new ActivityLayout();
-					layout.init(getLayoutMgr(),
-							(org.eclipse.epf.uma.Process) e, null, null);
-					ProcessLayoutData pd = new ProcessLayoutData(e.getGuid());
-					layout.loadLayoutData(pd, true, true, true);
-					printLayoutScript(pd);
-					pd.clear();
-				} catch (Exception e1) {
-					getValidator()
-							.logError(
-									e,
-									"Error publishing process specific layout data", e1); //$NON-NLS-1$
-				}
-
-			}
-		};
-
-		Timer timer = new Timer();
-		try {
-
-			// run the publishing and check the time, if timeout, terminate it
-			Thread t = new Thread(runnable);
-			t.start();
-			t.join(TIMEOUT_INTERVAL);
-			if (t.isAlive()) {
-				// wait for the thread to die and log an error
-				timer.stop();
-				getValidator()
-						.logInfo(
-								e,
-								"publishing process specific layout data takes " + timer.getTime() + " mini seconds already and is still not done yet ..."); //$NON-NLS-1$ //$NON-NLS-2$
-				timer.start();
-				t.join();
-			}
-		} catch (InterruptedException e1) {
-			e1.printStackTrace();
-		} finally {
-			timer.stop();
-			getValidator()
-					.logInfo(
-							e,
-							timer.getTotalTime()
-									+ " mini seconds publishing process specific layout data"); //$NON-NLS-1$
-		}
-
-	}
-
-	private void printLayoutScript(ProcessLayoutData data) {
-		File outputFile = new File(getLayoutMgr().getPublishDir(),
-				PROCESS_LAYOUT_DATA_FILE); //$NON-NLS-1$
-		PrintWriter pw = null;
-		try {
-			// create a stream with append enabled
-			FileOutputStream os = new FileOutputStream(outputFile, true);
-
-			// create a write with utf-8 encoding
-			OutputStreamWriter writer = new OutputStreamWriter(os, "utf-8"); //$NON-NLS-1$
-
-			// create a print writer with auto flush
-			pw = new PrintWriter(writer, true);
-			data.print(pw);
-		} catch (Exception e) {
-			getValidator().logError("unable to save process layout data", e); //$NON-NLS-1$
-
-		} finally {
-			if (pw != null) {
-				pw.flush();
-				pw.close();
-			}
-		}
-
-	}
-
-	/**
-	 * Iterate thru tuee
-	 * 
-	 * @param obj
-	 * @param parent
-	 */
-	private void iterate(Object obj, Bookmark parent) {
-		try {
-			if (monitor.isCanceled()) {
-				return;
-			}
-
-			// Get the adapter from the factory.
-			ITreeItemContentProvider treeItemContentProvider = null;
-			if (obj instanceof ITreeItemContentProvider) {
-				treeItemContentProvider = (ITreeItemContentProvider) obj;
-			} else {
-				treeItemContentProvider = (ITreeItemContentProvider) adapterFactory
-						.adapt(obj, ITreeItemContentProvider.class);
-			}
-
-			// Either delegate the call or return nothing.
-			if (treeItemContentProvider != null) {
-				Collection items = treeItemContentProvider.getChildren(obj);
-				for (Iterator it = items.iterator(); it.hasNext();) {
-					if (monitor.isCanceled()) {
-						return;
-					}
-
-					// create bookmark
-					Object itorObj = it.next();
-					Object element = LibraryUtil.unwrap(itorObj);
-
-					if ((element instanceof MethodElement)) {
-						MethodElement me = (MethodElement) element;
-						try {
-							if (ConfigurationHelper.canShow(me, config)) {
-								me = ConfigurationHelper
-										.getCalculatedElement(me,
-												getLayoutMgr()
-														.getElementRealizer());
-								if (me != null) {
-									if (me instanceof Tool) {
-										buildToolSubTree((Tool) me, parent);
-									} else if (me instanceof Discipline) {
-										buildDisciplineSubTree((Discipline) me,
-												parent);
-									}
-
-									// else if (me instanceof DisciplineGrouping
-									// || me instanceof Domain || me instanceof
-									// WorkProductType
-									// || me instanceof RoleSetGrouping || me
-									// instanceof RoleSet )
-									else if (me instanceof ContentCategory) {
-
-										ContentCategory cc = (ContentCategory) me;
-
-										// if the content category is empty,
-										// don't add to the parent
-										Bookmark b = createBookmark(
-												this.monitor, cc);
-										iterate(itorObj, b);
-										if (options.isPublishEmptyCategories()
-												|| b.getChildCount() > 0) {
-											parent.addChild(b);
-											discardEmptyCategory(cc, false);
-										} else {
-											discardEmptyCategory(cc, true);
-										}
-									} else {
-										Bookmark b = createBookmark(me, parent);
-										if (!buildSubTree(itorObj, me, b)) {
-											iterate(itorObj, b);
-										}
-									}
-								}
-							}
-						} catch (Exception e) {
-							String message = "Error building navigation tree for " + LibraryUtil.getTypeName(me); //$NON-NLS-1$
-							getHtmlBuilder().getValidator()
-									.logError(message, e);
-							e.printStackTrace();
-						}
-					} else {
-						iterate(itorObj, parent);
-					}
-
-				}
-			}
-		} catch (Exception e) {
-			String message = "Error building navigation tree"; //$NON-NLS-1$
-			getHtmlBuilder().getValidator().logError(message, e);
-
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * create a bookmark under the specified parent. If no parent is specified,
-	 * 
-	 * @param monitor
-	 * @param element
-	 * @param parent
-	 * @return
-	 */
-	protected Bookmark createBookmark(Object element, Bookmark parent) {
-		Bookmark b = createBookmark(this.monitor, element);
-		if (parent == null) {
-			bookmarks.add(b);
-		} else {
-			parent.addChild(b);
-		}
-
-		return b;
-	}
-
-	/**
-	 * build the sub tree for the given element. return true if the element is
-	 * handled, false otherwise
-	 * 
-	 * @param element
-	 * @param bm
-	 * @return boolean
-	 */
-	private boolean buildSubTree(Object obj, MethodElement element, Bookmark bm) {
-		if (element instanceof Task) {
-			buildTaskSubTree((Task) element, bm);
-		} else if (element instanceof Role) {
-			buildRoleSubTree((Role) element, bm);
-		} else if (element instanceof WorkProduct) {
-			buildWorkProductSubTree((WorkProduct) element, bm);
-		} else if (LibraryUtil.isProcess(element)) {
-			buildProcessSubTree(obj, (org.eclipse.epf.uma.Process) element, bm);
-		} else {
-			// System.out.println("Not handled: " + element);
-			return false;
-		}
-
-		return true;
-	}
-
-	private void buildItems(List elements, Bookmark bm) {
-		buildItems(elements, bm, false);
-	}
-
-	private void buildItems(List elements, Bookmark bm, boolean buildSubTree) {
-		for (Iterator it = elements.iterator(); it.hasNext();) {
-			if (monitor.isCanceled()) {
-				return;
-			}
-
-			MethodElement element = (MethodElement) it.next();
-
-			// filter away the containment child-element if any of the parent(s)
-			// are in the list
-			// 00384619 - Published site: Display of WPs under responsible role
-			// if the container of the element is in the list, ignore it
-			if (ConfigurationHelper.isContainmentElement(element)
-					&& ConfigurationHelper.isContainerInList(element, elements,
-							config)) {
-				continue;
-			}
-
-			buildItem(element, bm, buildSubTree);
-		}
-	}
-
-	private Bookmark buildItem(MethodElement element, Bookmark parent,
-			boolean buildSubTree) {
-		if (monitor.isCanceled()) {
-			return null;
-		}
-
-		Bookmark b = null;
-
-		// make sure the element is showable
-		MethodElement e = ConfigurationHelper.getCalculatedElement(element,
-				getLayoutMgr().getElementRealizer());
-		if (isVisible(e)) {
-			b = createBookmark(this.monitor, e);
-			if (b == null) {
-				return b;
-			}
-
-			parent.addChild(b);
-
-			if (buildSubTree) {
-				if (e instanceof Artifact) {
-					buildContainedArtifactsSubTree((Artifact) e, b, true);
-				}
-			}
-		}
-
-		return b;
-	}
-
-//	/**
-//	 * create the folder bookmark and it's children. generate the folder summary
-//	 * page
-//	 * 
-//	 * @param element
-//	 * @param bm
-//	 * @param nodeName
-//	 * @param items
-//	 */
-//
-//	private Bookmark createFolderBookmark(MethodElement element, Bookmark bm,
-//			String nodeName, List items, boolean createChildren) {
-//		Bookmark b = null;
-//		if (items.size() > 0) {
-//			IElementLayout l = new SummaryPageLayout(getHtmlBuilder()
-//					.getLayoutManager(), element, nodeName, items);
-//			String url = l.getUrl();
-//			getHtmlBuilder().generateHtml(l);
-//			b = createBookmark(nodeName, EcoreUtil.generateUUID(), url,
-//					ICON_FOLDER, ICON_FOLDER, null);
-//			bm.addChild(b);
-//			if (createChildren) {
-//				buildItems(items, b);
-//			}
-//		}
-//
-//		return b;
-//	}
-
-	Set<String> summaryPagesGenerated = new HashSet<String>();
-	
-	private Bookmark createFolderBookmark(MethodElement element, Bookmark bm,
-			String prefixName, String nodeName, List items,
-			boolean createChildren) {
-		Bookmark b = null;
-		if (items.size() > 0) {
-			IElementLayout l = new SummaryPageLayout(getHtmlBuilder()
-					.getLayoutManager(), element, prefixName, nodeName, items);
-			String url = l.getUrl();
-			
-			// don't regenerate the page
-			// 200619 - Summary page html was generated multiple times when publishing
-			if ( !summaryPagesGenerated.contains(url) ) {
-				getHtmlBuilder().generateHtml(l);
-				summaryPagesGenerated.add(url);
-			}
-			
-			b = createBookmark(nodeName, EcoreUtil.generateUUID(), url,
-					ICON_FOLDER, ICON_FOLDER, null);
-			bm.addChild(b);
-			if (createChildren) {
-				buildItems(items, b);
-			}
-		}
-
-		return b;
-	}
-
-	private Bookmark buildDisciplineSubTree(Discipline element, Bookmark parent) {
-		String url = ""; //$NON-NLS-1$
-		Bookmark b;
-
-		// need to calculate the realized value of the feature
-		List items_workflow = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getDiscipline_ReferenceWorkflows());
-
-		// Tasks in published site under Disciplines are in
-		// random order
-		// use the adaptor factory to get the childrens
-		// List items_task = ConfigurationHelper.calc0nFeatureValue(element,
-		// UmaPackage.eINSTANCE.getDiscipline_Tasks(), config);
-		List items_task = new ArrayList();
-		List item_subDisciplies = new ArrayList();
-		ITreeItemContentProvider treeItemContentProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(element, ITreeItemContentProvider.class);
-		if (treeItemContentProvider != null) {
-			Collection items = treeItemContentProvider.getChildren(element);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				if (monitor.isCanceled()) {
-					return null;
-				}
-
-				// create bookmark
-				Object itorObj = it.next();
-				Object e = LibraryUtil.unwrap(itorObj);
-				if ((e instanceof Task)) {
-					MethodElement t = ConfigurationHelper.getCalculatedElement(
-							(MethodElement) e, getLayoutMgr()
-									.getElementRealizer());
-					if (t != null) {
-						items_task.add(t);
-					}
-				} else if (e instanceof Discipline) {
-					MethodElement d = ConfigurationHelper.getCalculatedElement(
-							(MethodElement) e, getLayoutMgr()
-									.getElementRealizer());
-					if (d != null) {
-						item_subDisciplies.add(d);
-					}
-
-				}
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return null;
-		}
-
-		// all guidances
-		List items_guidance = new ArrayList();
-		items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Assets()));
-		items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Checklists()));
-		items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_ConceptsAndPapers()));
-		items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Examples()));
-		items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Guidelines()));
-		items_guidance.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_SupportingMaterials()));
-
-		if (!options.isPublishEmptyCategories()
-				&& items_workflow.size() + items_task.size()
-						+ items_guidance.size() + item_subDisciplies.size() == 0) {
-			// do nothing, don't show the folder
-			discardEmptyCategory(element, true);
-			return null;
-		}
-
-		if (monitor.isCanceled()) {
-			return null;
-		}
-
-		// create the item bookmark
-		// don't set to the parent yet. make sure it's not empty
-		// need to check the sub-disciplines
-		// 150984 - Publishing: Nested discipline is not display in the publish
-		// page
-		// Bookmark bm = createBookmark(element, parent);
-		Bookmark bm = createBookmark(this.monitor, element);
-
-		// sub-disciplines come first
-		if (item_subDisciplies.size() > 0) {
-			for (Iterator it = item_subDisciplies.iterator(); it.hasNext();) {
-				Discipline d = (Discipline) it.next();
-				buildDisciplineSubTree(d, bm);
-			}
-		}
-
-		if (options.isPublishLightWeightTree()) {
-
-			Collections.sort(items_workflow, nameComparator);
-			Collections.sort(items_task, nameComparator);
-			Collections.sort(items_guidance, nameComparator);
-
-			buildItems(items_workflow, bm);
-			buildItems(items_task, bm);
-			buildItems(items_guidance, bm);
-		} else {
-			if (items_workflow.size() > 0) {
-				Bookmark wfFolder = createFolderBookmark(element, bm,
-						PREFIX_Reference_Workflows, NODE_Reference_Workflows,
-						items_workflow, false);
-
-				// Capability Patterns in treebrowser under
-				// disciplines-reference workflows cannot be expanded
-				for (Iterator it = items_workflow.iterator(); it.hasNext();) {
-					if (monitor.isCanceled()) {
-						return null;
-					}
-
-					// 179609 - Exception when assign activity as discipline's
-					// referenced workflow
-					// this is a model change, referenced workflow can be
-					// Activity,
-					// old model references Process
-					Activity act = (Activity) it.next();
-					Bookmark bmWorkflow = buildItem(act, wfFolder, false);
-					buildActivitySubTree(act, act, bmWorkflow);
-				}
-			}
-
-			if (monitor.isCanceled()) {
-				return null;
-			}
-
-			if (items_task.size() > 0) {
-				createFolderBookmark(element, bm, PREFIX_Tasks, NODE_Tasks,
-						items_task, true);
-			}
-
-			if (monitor.isCanceled()) {
-				return null;
-			}
-
-			if (items_guidance.size() > 0) {
-				createFolderBookmark(element, bm, PREFIX_Guidances,
-						NODE_Guidances, items_guidance, true);
-			}
-		}
-
-		if (options.isPublishEmptyCategories() || bm.getChildCount() > 0) {
-			parent.addChild(bm);
-			discardEmptyCategory(element, false);
-		} else {
-			discardEmptyCategory(element, true);
-		}
-
-		return bm;
-	}
-
-	private void buildActivitySubTree(Object obj, Activity element, Bookmark bm) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		List items = new ArrayList();
-
-		org.eclipse.epf.uma.Process proc = TngUtil.getOwningProcess(element);
-		ProcessElementItem procItem = new ProcessElementItem(obj, element,
-				element.getGuid());
-
-		ComposedAdapterFactory adapterFactory = super.getLayoutMgr()
-				.getWBSAdapterFactory();
-		Suppression sup = new Suppression(proc);
-		iterateActivity(procItem, bm, adapterFactory, sup);
-	}
-
-	private void buildToolSubTree(Tool element, Bookmark parent) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		List items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getTool_ToolMentors());
-		if (options.isPublishEmptyCategories() || items.size() > 0) {
-			Bookmark b = createBookmark(element, parent);
-			buildItems(items, b);
-			discardEmptyCategory(element, false);
-		} else {
-			discardEmptyCategory(element, true);
-		}
-	}
-
-	private void buildTaskSubTree(Task element, Bookmark bm) {
-
-		String url;
-		Bookmark b;
-
-		List allItems = new ArrayList();
-
-		// performing roles
-		List items = new ArrayList();
-		Role r = (Role) calc01FeatureValue(element, UmaPackage.eINSTANCE
-				.getTask_PerformedBy());
-		if (r != null) {
-			items.add(r);
-		}
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getTask_AdditionallyPerformedBy()));
-
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				createFolderBookmark(element, bm, PREFIX_Performing_Roles,
-						NODE_Performing_Roles, items, true);
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		if (!options.isPublishLightWeightTree()) {
-			// input work products, need a summary page,
-			items = new ArrayList();
-			items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-					.getTask_MandatoryInput()));
-			items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-					.getTask_OptionalInput()));
-
-			if (items.size() > 0) {
-				createFolderBookmark(element, bm, PREFIX_Input_Work_Products,
-						NODE_Input_Work_Products, items, true);
-			}
-
-			if (monitor.isCanceled()) {
-				return;
-			}
-		}
-
-		// output work products, need a summary page, TODO
-		items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getTask_Output());
-
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				createFolderBookmark(element, bm, PREFIX_Output_Work_Products,
-						NODE_Output_Work_Products, items, true);
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// all guidances
-		items.clear();
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Assets()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Checklists()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_ConceptsAndPapers()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Examples()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Guidelines()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_SupportingMaterials()));
-		// Object e = calc01FeatureValue(element, UmaPackage.eINSTANCE
-		// .getTask_Estimate());
-		// if (e != null) {
-		// items.add(e);
-		// }
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getTask_ToolMentors()));
-
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				createFolderBookmark(element, bm, PREFIX_Guidances,
-						NODE_Guidances, items, true);
-			}
-		}
-
-		if (options.isPublishLightWeightTree()) {
-			buildItems(allItems, bm);
-		}
-
-	}
-
-	private void buildRoleSubTree(Role element, Bookmark bm) {
-		String url;
-		Bookmark b;
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		List allItems = new ArrayList();
-
-		// tasks, // need a general overview page, TODO
-		// List items = AssociationHelper.getPrimaryTasks(element);
-		List items = calc0nFeatureValue(element,
-				AssociationHelper.Role_Primary_Tasks);
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				createFolderBookmark(element, bm, PREFIX_ResponsibleFor_Tasks,
-						NODE_ResponsibleFor_Tasks, items, true);
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		if (!options.isPublishLightWeightTree()) {
-			// secondary tasks
-			items = calc0nFeatureValue(element,
-					AssociationHelper.Role_Secondary_Tasks);
-			if (items.size() > 0) {
-				createFolderBookmark(element, bm, PREFIX_ParticipatesIn_Tasks,
-						NODE_ParticipatesIn_Tasks, items, true);
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// responsible for work products,
-		items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getRole_ResponsibleFor());
-
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				b = createFolderBookmark(element, bm,
-						PREFIX_Work_Products_Created,
-						NODE_Work_Products_Created, items, false);
-				buildItems(items, b, true);
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		if (!options.isPublishLightWeightTree()) {
-			// modifies work products, need a summary page, TODO
-			items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-					.getRole_Modifies());
-			if (items.size() > 0) {
-				b = createFolderBookmark(element, bm,
-						PREFIX_Work_Products_Modified,
-						NODE_Work_Products_Modified, items, false);
-				buildItems(items, b, true);
-			}
-
-			if (monitor.isCanceled()) {
-				return;
-			}
-		}
-
-		// all guidances
-		items.clear();
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Assets()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Checklists()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_ConceptsAndPapers()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Examples()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Guidelines()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_SupportingMaterials()));
-
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				createFolderBookmark(element, bm, PREFIX_Guidances, NODE_Guidances, items, true);
-			}
-		}
-
-		if (options.isPublishLightWeightTree()) {
-			// light weight tree, no sub folders
-			buildItems(allItems, bm);
-		}
-	}
-
-	private void buildWorkProductSubTree(WorkProduct element, Bookmark bm) {
-		List items;
-		String url = ""; //$NON-NLS-1$
-		// Bookmark b;
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		List allItems = new ArrayList();
-
-		// performing roles, 0.1 reference element will be realized in buildItem
-		// multiplicity change for opposite features
-		// Role r = AssociationHelper.getResponsibleRole(element);
-		items = calc0nFeatureValue(element,
-				AssociationHelper.WorkProduct_ResponsibleRoles);
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				createFolderBookmark(element, bm, PREFIX_Responsible_Role,
-						NODE_Responsible_Role, items, true);
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// containing work products, need a summary page, TODO
-		if (element instanceof Artifact) {
-
-			if (!options.isPublishLightWeightTree()) {
-				WorkProduct wp = ((Artifact) element).getContainerArtifact();
-				// createBookmark(NODE_Containing_Work_Product,
-				// NODE_Containing_Work_Product, url, "", ""); //$NON-NLS-1$
-				// //$NON-NLS-2$
-				if (wp != null) {
-					items = new ArrayList();
-					items.add(wp);
-					createFolderBookmark(element, bm,
-							PREFIX_Containing_Work_Product,
-							NODE_Containing_Work_Product, items, true);
-				}
-
-				if (monitor.isCanceled()) {
-					return;
-				}
-			}
-
-			// contained work products, need a summary page, TODO
-			// items = ((Artifact)element).getContainedArtifacts();
-			items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-					.getArtifact_ContainedArtifacts());
-
-			// make sure the contained elements does not contain the container,
-			// this is possible due to realization, say, the containing element
-			// contribute to the container
-			items.remove(element);
-
-			if (items.size() > 0) {
-				if (options.isPublishLightWeightTree()) {
-					Collections.sort(items, nameComparator);
-					allItems.addAll(items);
-				} else {
-					Bookmark b = createFolderBookmark(element, bm,
-							PREFIX_Contained_Work_Products,
-							NODE_Contained_Work_Products, items, false);
-
-					// for each contained work product, create the nested sub
-					// tree
-					buildItems(items, b, true);
-				}
-			}
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		if (!options.isPublishLightWeightTree()) {
-			// input to tasks
-			items = new ArrayList();
-			items.addAll(calc0nFeatureValue(element,
-					AssociationHelper.WorkProduct_MandatoryInputTo_Tasks));
-			items.addAll(calc0nFeatureValue(element,
-					AssociationHelper.WorkProduct_OptionalInputTo_Tasks));
-			if (items.size() > 0) {
-				createFolderBookmark(element, bm, PREFIX_InputTo_Task,
-						NODE_InputTo_Task, items, true);
-			}
-
-			if (monitor.isCanceled()) {
-				return;
-			}
-
-			// output from tasks
-			items = calc0nFeatureValue(element,
-					AssociationHelper.WorkProduct_OutputFrom_Tasks);
-			if (items.size() > 0) {
-				createFolderBookmark(element, bm, PREFIX_OutputOf_Task,
-						NODE_OutputOf_Task, items, true);
-			}
-
-			if (monitor.isCanceled()) {
-				return;
-			}
-		}
-
-		// all guidances
-		items = new ArrayList();
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Assets()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Checklists()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_ConceptsAndPapers()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Examples()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Guidelines()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_SupportingMaterials()));
-		// Object e = calc01FeatureValue(element, UmaPackage.eINSTANCE
-		// .getWorkProduct_Estimate());
-		// if (e != null) {
-		// items.add(e);
-		// }
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getWorkProduct_Reports()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getWorkProduct_Templates()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getWorkProduct_ToolMentors()));
-
-		if (items.size() > 0) {
-			if (options.isPublishLightWeightTree()) {
-				Collections.sort(items, nameComparator);
-				allItems.addAll(items);
-			} else {
-				createFolderBookmark(element, bm, PREFIX_Guidances,
-						NODE_Guidances, items, true);
-			}
-		}
-
-		if (options.isPublishLightWeightTree()) {
-			buildItems(allItems, bm);
-		}
-	}
-
-	private void buildContainedArtifactsSubTree(Artifact element, Bookmark bm,
-			boolean showGuidances) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		List items;
-		String url = ""; //$NON-NLS-1$
-
-		// contained work products, need a summary page, TODO
-		// items = ((Artifact)element).getContainedArtifacts();
-		items = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getArtifact_ContainedArtifacts());
-
-		// make sure the contained elements does not contain the container,
-		// this is possible due to realization, say, the containing element
-		// contribute to the container
-		items.remove(element);
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		if (items.size() > 0) {
-			// Bookmark b = createFolderBookmark(element, bm,
-			// NODE_Contained_Work_Products, items, false);
-
-			// for each contained work product, create the nested sub tree
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				if (monitor.isCanceled()) {
-					return;
-				}
-
-				Artifact e = (Artifact) it.next();
-				buildItem(e, bm, true);
-			}
-		}
-
-		if (!showGuidances) {
-			return;
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// all guidances
-		items = new ArrayList();
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Assets()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Checklists()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_ConceptsAndPapers()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Examples()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_Guidelines()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getContentElement_SupportingMaterials()));
-		// Object e = calc01FeatureValue(element, UmaPackage.eINSTANCE
-		// .getWorkProduct_Estimate());
-		// if (e != null) {
-		// items.add(e);
-		// }
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getWorkProduct_Reports()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getWorkProduct_Templates()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getWorkProduct_ToolMentors()));
-
-		if (items.size() > 0) {
-			// createFolderBookmark(element, bm, NODE_Guidances, items, true);
-			buildItems(items, bm);
-		}
-	}
-
-	/**
-	 * iterate the break down structure and build the xml document
-	 * 
-	 * @param parentObj
-	 *            The object to iterate. It can be a breakdown element, or it's
-	 *            adaptor
-	 * @param parentXml
-	 * @param adapterFactory
-	 */
-	private void iterateActivity(ProcessElementItem parentItem,
-			Bookmark parentBm, ComposedAdapterFactory adapterFactory,
-			Suppression sup) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		ITreeItemContentProvider provider = null;
-		Object parentObj = parentItem.rawItem;
-
-		if (parentObj instanceof ITreeItemContentProvider) {
-			provider = (ITreeItemContentProvider) parentObj;
-		} else {
-			provider = (ITreeItemContentProvider) adapterFactory.adapt(
-					parentObj, ITreeItemContentProvider.class);
-		}
-
-		if (provider != null) {
-			// String displayName = ProcessUtil.getAttribute(parentObj,
-			// IBSItemProvider.COL_PRESENTATION_NAME, provider);
-			// parentXml.setAttribute("DisplayName", displayName);
-
-			Collection children = provider.getChildren(parentObj);
-			for (Iterator it = children.iterator(); it.hasNext();) {
-				if (monitor.isCanceled()) {
-					return;
-				}
-
-				Object rawitem = it.next();
-				if (sup.isSuppressed(rawitem)) {
-					continue;
-				}
-
-				MethodElement item = (MethodElement) LibraryUtil
-						.unwrap(rawitem);
-
-				if (!options.showDescriptorsInNavigationTree
-						&& (item instanceof Descriptor)) {
-					continue;
-				}
-
-				ProcessElementItem elementItem = new ProcessElementItem(
-						rawitem, item, parentItem);
-
-				Bookmark child = buildItem(elementItem.element, parentBm, false);
-				if (child != null) {
-					// set the query string
-					child.setQueryString(elementItem.getQueryString());
-
-					IBSItemProvider adapter = null;
-					if (rawitem instanceof IBSItemProvider) {
-						adapter = (IBSItemProvider) rawitem;
-					} else {
-						adapter = (IBSItemProvider) adapterFactory.adapt(item,
-								ITreeItemContentProvider.class);
-						;
-					}
-
-					String displayName = ProcessUtil.getAttribute(item,
-							IBSItemProvider.COL_PRESENTATION_NAME, adapter);
-					child.setPresentationName(displayName);
-
-					if (item instanceof Activity) {
-						iterateActivity(elementItem, child, adapterFactory, sup);
-					}
-				}
-			}
-		}
-	}
-
-	private void buildProcessSubTree(Object obj,
-			org.eclipse.epf.uma.Process element, Bookmark bm) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		List items = new ArrayList();
-
-		ProcessElementItem procItem = new ProcessElementItem(obj, element,
-				element.getGuid());
-
-		ComposedAdapterFactory adapterFactory = super.getLayoutMgr()
-				.getWBSAdapterFactory();
-		Suppression sup = new Suppression(element);
-		iterateActivity(procItem, bm, adapterFactory, sup);
-
-		String url;
-		Bookmark b;
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// all guidances
-		items = new ArrayList();
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getActivity_Checklists()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getActivity_Concepts()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getActivity_Examples()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getActivity_Guidelines()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getActivity_ReusableAssets()));
-		items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getActivity_Roadmaps()));
-
-		// need to include supporting materials as well
-		// fix bug: supporting material served as user defined diagram should not 
-		// show up in the navigation tree of a published process.	
-		org.eclipse.epf.diagram.model.util.DiagramInfo userDiagramInfo = 
-				new org.eclipse.epf.diagram.model.util.DiagramInfo(element);
-		List v = calc0nFeatureValue(element, UmaPackage.eINSTANCE
-				.getActivity_SupportingMaterials());
-		for ( Iterator it = v.iterator(); it.hasNext(); ) {
-			SupportingMaterial s = (SupportingMaterial)it.next();
-			if ( !userDiagramInfo.isDiagram( (SupportingMaterial)s ) ) {
-				items.add(s);
-			}
-		}
-
-		if (element instanceof DeliveryProcess) {
-			DeliveryProcess dp = (DeliveryProcess) element;
-			items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-					.getDeliveryProcess_CommunicationsMaterials()));
-			items.addAll(calc0nFeatureValue(element, UmaPackage.eINSTANCE
-					.getDeliveryProcess_EducationMaterials()));
-		}
-
-		if (items.size() > 0) {
-			createFolderBookmark(element, bm, PREFIX_Guidances, NODE_Guidances,
-					items, true);
-		}
-	}
-
-	/**
-	 * dispose the object
-	 */
-	public void dispose() {
-		super.dispose();
-
-		adapterFactory = null;
-		nameComparator = null;
-		bookmarks.clear();
-		elementUrls.clear();
-		summaryPagesGenerated.clear();
-	}
-
-	protected Set elementUrls = new HashSet();
-
-	protected void elementPublished(IElementLayout layout, String htmlfile) {
-		// only for process element for now
-		// may cover all method elements later
-		if (layout.getElement() instanceof ProcessElement) {
-			ElementUrl url = new ElementUrl(layout.getElement().getGuid(),
-					layout.getUrl(), layout.getDisplayName());
-			elementUrls.add(url);
-		}
-	}
-
-	private void saveElementUrls() {
-		// save published element urls
-		// need to escape the url and text since it will be assigned to a
-		// javascript variable as literal
-		XmlElement xml = new XmlElement("ElementUrls"); //$NON-NLS-1$
-		for (Iterator it = elementUrls.iterator(); it.hasNext();) {
-			ElementUrl url = (ElementUrl) it.next();
-			xml.newChild("elementUrl", url.guid) //$NON-NLS-1$
-					.setAttribute("text", StrUtil.escape(url.text)) //$NON-NLS-1$
-					.setAttribute("url", StrUtil.escape(url.url)); //$NON-NLS-1$
-		}
-
-		// StringBuffer buffer = new StringBuffer();
-		// buffer.append(XmlHelper.XML_HEADER).append(xml.toXml());
-		// File f = new File(getLayoutMgr().getPublishDir(), "ElementUrls.xml");
-		// //$NON-NLS-1$
-		// FileUtil.writeUTF8File(f.getAbsolutePath(), buffer.toString());
-
-		String html = PublishingUtil.getHtml(xml, "xsl/elementUrls.xsl"); //$NON-NLS-1$
-		File f = new File(getLayoutMgr().getPublishDir(),
-				PROCESS_LAYOUT_DATA_FILE); //$NON-NLS-1$
-		FileUtil.writeUTF8File(f.getAbsolutePath(), html, true);
-	}
-
-	/**
-	 * data structure to define url of an element
-	 * 
-	 * @author Jinhua Xi
-	 * 
-	 */
-	public class ElementUrl {
-
-		String guid;
-		String url;
-		String text;
-
-		/**
-		 * constructor
-		 * 
-		 * @param guid
-		 *            String the guid of the element
-		 * @param url
-		 *            String the url of the element
-		 * @param text
-		 *            String the text alone with the url
-		 */
-		public ElementUrl(String guid, String url, String text) {
-			this.guid = guid;
-			this.url = url;
-			this.text = text;
-		}
-	}
-
-	class EObjectComparator implements Comparator {
-		private EStructuralFeature pName = UmaPackage.eINSTANCE
-				.getDescribableElement_PresentationName();
-		private EStructuralFeature name = UmaPackage.eINSTANCE
-				.getNamedElement_Name();
-
-		public EObjectComparator() {
-
-		}
-
-		public int compare(Object e1, Object e2) {
-			if (e1 instanceof EObject && e2 instanceof EObject) {
-				Object v1 = getValue(e1);
-				Object v2 = getValue(e2);
-
-				if (v1 == null && v2 == null) {
-					return e1.toString().compareTo(e2.toString());
-				} else if (v1 == null) {
-					return -1;
-				} else if (v2 == null) {
-					return 1;
-				} else {
-					return v1.toString().compareTo(v2.toString());
-				}
-			} else {
-				return e1.toString().compareTo(e2.toString());
-			}
-		}
-
-		private Object getValue(Object e) {
-			Object v = null;
-			try {
-				v = ((EObject) e).eGet(pName);
-			} catch (Exception ex) {
-
-			}
-			;
-
-			if (v == null || v.toString().length() == 0) {
-				try {
-					v = ((EObject) e).eGet(name);
-				} catch (Exception ex) {
-
-				}
-				;
-			}
-
-			return v;
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources
deleted file mode 100644
index c977284..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources
+++ /dev/null
@@ -1,10 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-#------------------------------------------------------------------------------
-#
-# defines which elements will use the default icon
-#
-discipline=true
-capabilityPattern=true
-role=true
-task=true
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources.java
deleted file mode 100644
index e0c3fcf..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class DefaultElementTypeResources 
-{
-	private static ResourceBundle resourceBundle;
-	static
-	{
-		try 
-		{
-			String resource = DefaultElementTypeResources.class.getName();
-		    resourceBundle = ResourceBundle.getBundle(resource);
-			    		    
-		} catch (MissingResourceException x) {
-		    x.printStackTrace();
-			resourceBundle = null;
-		}
-	}
-	
-
-	
-	private static String getString(String key)
-	{
-		try 
-		{
-			return (resourceBundle != null) ? resourceBundle.getString(key) : null;
-		} 
-		catch (MissingResourceException e) 
-		{
-			return null;
-		}		
-	}
-	
-	/**
-	 * check if a default icon is ised or not for the specified key
-	 * 
-	 * @param key String
-	 * @return boolean
-	 */
-	public static boolean useDefaultIcon(String key)
-	{
-		String booleanResult = getString(key);
-		if ( booleanResult == null )
-		{
-			return false;
-		}
-		
-		return (booleanResult.toLowerCase().indexOf("true") > -1) ? true : false; //$NON-NLS-1$
-	}	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources.properties b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources.properties
deleted file mode 100644
index c922f84..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultElementTypeResources.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#------------------------------------------------------------------------------
-#
-# defines which elements will use the default icon
-#
-discipline=true
-capabilityPattern=true
-role=true
-task=true
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultNodeIconResources.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultNodeIconResources.java
deleted file mode 100644
index cb7d68b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultNodeIconResources.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-
-package org.eclipse.epf.publishing.services;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author Jinhua Xi
- * @since 1.0
- */
-public class DefaultNodeIconResources {
-
-	private static ResourceBundle resourceBundle;
-
-	private static String DEFAULT_ICON_NAME = ""; //$NON-NLS-1$
-	static {
-		try {
-			String resource = DefaultNodeIconResources.class.getName();
-			resourceBundle = ResourceBundle.getBundle(resource);
-			DEFAULT_ICON_NAME = getString("folder"); //$NON-NLS-1$
-
-		} catch (MissingResourceException x) {
-			x.printStackTrace();
-			resourceBundle = null;
-		}
-	}
-
-	private static String getString(String key) {
-		try {
-			return (resourceBundle != null) ? resourceBundle.getString(key)
-					: null;
-		} catch (MissingResourceException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * get the icon name for the specified key
-	 * 
-	 * @param key String
-	 * @return String the icon name.
-	 */
-	public static String getIconName(String key) {
-		String iconName = getString(key);
-		if (iconName == null) {
-			iconName = DEFAULT_ICON_NAME;
-		}
-
-		return iconName;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultNodeIconResources.properties b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultNodeIconResources.properties
deleted file mode 100644
index 0af1ce2..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultNodeIconResources.properties
+++ /dev/null
@@ -1,35 +0,0 @@
-#------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#------------------------------------------------------------------------------
-#
-# defines the default node icon names
-#
-activity=activity.gif
-artifact=artifact.gif
-role=worker.gif
-task=activity.gif
-guideline=guideline.gif
-checklist=checklist.gif
-concept=concept.gif
-example=example.gif
-report=
-supportingmaterial=
-technique=
-template=
-termdefinition=
-toolmentor=
-trainingmodule=
-whitepaper=
-workproductguideline=
-general=
-process=
-capabilitypattern=
-deliveryprocess=
-folder=folder.gif
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultSiteGenerator.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultSiteGenerator.java
deleted file mode 100644
index 262a57c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/DefaultSiteGenerator.java
+++ /dev/null
@@ -1,310 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.net.URL;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.layout.Bookmark;
-import org.eclipse.epf.library.layout.BookmarkList;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-import org.eclipse.epf.library.layout.LayoutResources;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.publishing.util.PublishingUtil;
-
-
-/**
- * default implementation of the site generator.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class DefaultSiteGenerator extends AbstractSiteGenerator {
-
-	public static final String NO_APPLET_DIRECTORY = "noapplet"; //$NON-NLS-1$
-
-	// public static final String BOOKMARK_SUFFIX = ".bkm"; //$NON-NLS-1$
-	public static final String BOOKMARK_SUFFIX_XML = ".xml"; //$NON-NLS-1$
-
-	public static final String BOOKMARK_SUFFIX_HTML = ".html"; //$NON-NLS-1$
-
-	public static final String SPACE_REPLACEMENT = "_"; //$NON-NLS-1$
-
-	public static final String SPACE_STRING = " "; //$NON-NLS-1$
-
-	// public static final String DEFAULT_BOOKMARK_CFG_NAME =
-	// "DefaultBookmark.cfg"; //$NON-NLS-1$
-	public static final String PUBLISHED_BOOKMARKS_CFG_NAME = "PublishedBookmarks.xml"; //$NON-NLS-1$
-
-	public static final String PUBLISHED_BOOKMARKS_DELIMITER = "*"; //$NON-NLS-1$
-
-	protected static final String BOOKMARK_XSL_FILE = "xsl/bookmark.xsl"; //$NON-NLS-1$
-
-	protected static final String BOOKMARKS_XSL_FILE = "xsl/PublishedBookmarks.xsl"; //$NON-NLS-1$
-
-	protected static final String INDEX_XSL_FILE = "xsl/index.xsl"; //$NON-NLS-1$
-
-	protected static final String TOPNAV_XSL_FILE = "xsl/topnav.xsl"; //$NON-NLS-1$
-	
-	protected static final String SEARCH_XSL_FILE = "xsl/search.xsl"; //$NON-NLS-1$
-
-	private static final String APPLET_PATH = "applet" + File.separatorChar; //$NON-NLS-1$
-	private static final String NO_APPLET_PATH = "noapplet" + File.separatorChar; //$NON-NLS-1$
-	private static final String ICON_PATH = "images" + File.separatorChar; //$NON-NLS-1$
-	
-	private static final String SERVER_SEARCH_PATH = "docroot/server_search"; //$NON-NLS-1$	
-	
-	private static final String DEFAULT_BANNER_FILE = "EPFC_banner.jpg"; //$NON-NLS-1$
-
-	protected File iconPath;
-
-	public DefaultSiteGenerator(HtmlBuilder builder, PublishHTMLOptions options) {
-		super(builder, options);
-
-		iconPath = new File(pubDir, (options.isPublishDynamicWebApp() ) ? NO_APPLET_PATH  + ICON_PATH 
-				: APPLET_PATH + ICON_PATH);
-	}
-	
-	public HtmlBuilder getHtmlBuilder() {
-		return builder;
-	}
-	
-	public PublishOptions getPublishOptions() {
-		return options;
-	}
-
-	public String getNodeIconPath() {
-		return iconPath.getAbsolutePath();
-	}
-	
-	public String getDefaultBannerImageFile() {
-		//return "banner.gif"; //$NON-NLS-1$
-		return DEFAULT_BANNER_FILE;
-	}
-	
-	public void prePublish() throws Exception {
-		copyFiles();
-	}
-	
-	public void postPublish() throws Exception {
-		copyIconsForNonApplet();
-		writeIndexAndTopNavHtml();
-		writeSearchHtml();
-	}
-	
-	protected void copyFiles() throws Exception {
-
-		copyDocRootFiles();
-
-		// copy localized files
-		copyLocalizedFiles();
-
-		// copy user customized files last
-		copyCustomizedFiles();
-	}
-
-	protected void copyDocRootFiles() throws Exception {
-
-		URL plugin_url = PublishingPlugin.getDefault().getInstallURL();
-		URL url = new URL(plugin_url, DOC_ROOT);
-		String fromPath = Platform.resolve(url).getPath();
-
-		// folders that apply to all
-		// NOTE: applet images should always be included since it's used in
-		// Atlantic configuration
-		// applet/help.htm is used in RSA to check character encoding, so
-		// need to include this file
-		// Process Advisor: FileNotFoundException in RSA log
-		// when indexing start on a non-applet published site
-		String includes = "*.*, process/**, images/**, index/**, scripts/**, stylesheets/**"; //$NON-NLS-1$
-
-		String excludes = ""; //$NON-NLS-1$
-
-		// based on the selection, copy the other folders
-		if (options.isPublishJavaScriptTree()) {
-			includes += ", noapplet/**"; //$NON-NLS-1$
-		}
-
-		// String publishDir = viewBuilder.getHtmlBuilder().getPublishDir();
-
-		LayoutResources.copyDir(fromPath, pubDir, includes, excludes);		
-		
-		String path = FileLocator.resolve(new URL(plugin_url, SERVER_SEARCH_PATH)).getPath();
-		includes = "*.*, search/**"; //$NON-NLS-1$
-		LayoutResources.copyDir(path, pubDir, includes, null);		
-	}
-
-	protected void copyCustomizedFiles() throws Exception {
-		super.copyCustomizedFiles();
-
-		if (options.aboutHTML != null && options.aboutHTML.length() > 0) {
-			FileUtil.copyFile(options.aboutHTML, pubDir + "about.htm"); //$NON-NLS-1$
-		}
-	}	
-
-	protected void copyLocalizedFiles() throws Exception {
-
-		super.copyLocalizedFiles();
-
-		if (options.isPublishJavaScriptTree()) {
-			// copy the applet html files, rename locale specific names
-			PublishingPlugin
-					.getDefault()
-					.copyLocalizedFiles(
-							DOC_ROOT + "noapplet/", new File(pubDir, "noapplet/"), false, false); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-	}
-	
-	protected void copyIconsForNonApplet()
-	{
-		try
-		{
-			// don't jar it. copy the icons to the images
-//			File jarFile = new File(builder.getPublishDir(), APPLET_PATH + ICON_ZIP_FILE);
-//			PublishingUtil.jarFiles(iconPath, jarFile);
-
-			if ( options.isPublishJavaScriptTree() )
-			{
-				// also copy the icons to the no-applet folder
-				LayoutResources.copyDir(iconPath.getAbsolutePath(), pubDir + NO_APPLET_PATH + ICON_PATH);
-			}
-		}
-		catch (Exception ex)
-		{
-			ex.printStackTrace();
-		}
-	}
-
-	private String writeBookmark(Bookmark b) {
-
-		// get the bookmark name from the bookmark url
-		String bookmarkFileName = super.getViewDataFileName(b, BOOKMARK_SUFFIX_XML);
-		XmlElement xml = b.getXmlElement();
-
-		String buffer = PublishingUtil.getHtml(xml, BOOKMARK_XSL_FILE);
-		if (buffer != null) {
-			String htmlPath = getBookmarkHtmlPath(bookmarkFileName);
-			FileUtil.writeUTF8File(htmlPath, buffer.toString());
-		}
-
-		return bookmarkFileName;
-	}
-	
-	public void writePublishedBookmarks(List bookmarks, Bookmark defaultView) throws Exception {
-		
-		// first write xml for each individual view 
-		BookmarkList list = new BookmarkList();
-
-		if ((defaultView == null) && (bookmarks.size() > 0)) {
-			defaultView = (Bookmark) bookmarks.get(0);
-		}
-
-		for (Iterator it = bookmarks.iterator(); it.hasNext();) {
-			Bookmark b = (Bookmark) it.next();
-			String fileName = writeBookmark(b);
-			list.addBookmark(b.getPresentationName(), fileName,
-					(defaultView == b));
-		}
-		
-		// then write the top level bookmark xml
-		XmlElement xml = list.getXmlElement();
-
-		String buffer = PublishingUtil.getHtml(xml, BOOKMARKS_XSL_FILE);
-		if (buffer != null) {
-			String htmlPath = getBookmarkHtmlPath(PUBLISHED_BOOKMARKS_CFG_NAME);
-			FileUtil.writeUTF8File(htmlPath, buffer.toString());
-		}
-	}
-	
-	protected void writeIndexAndTopNavHtml() {
-				
-		XmlElement optionXml = getOptionXml();		
-				
-		String buffer = PublishingUtil.getHtml(optionXml, INDEX_XSL_FILE);
-		if (buffer != null) {
-			String htmlPath = getIndexFilePath();
-			FileUtil.writeUTF8File(htmlPath, buffer.toString());
-		}
-
-		buffer = PublishingUtil.getHtml(optionXml, TOPNAV_XSL_FILE);
-		if (buffer != null) {
-			String htmlPath = pubDir + "topnav.htm"; //$NON-NLS-1$
-			FileUtil.writeUTF8File(htmlPath, buffer.toString());
-		}
-	}
-	
-	protected void writeSearchHtml() {
-
-		boolean serverSideSearch = (options == null) || options.isIncludeServletSearch();
-		
-		String webAppName = options.getDynamicWebAppName();
-		
-		if (webAppName != null && webAppName.length() > 0 && serverSideSearch) {
-		
-			XmlElement searchXml = new XmlElement("Search").setAttribute( //$NON-NLS-1$
-					"webAppName", webAppName); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			
-			String buffer = PublishingUtil.getHtml(searchXml, SEARCH_XSL_FILE);
-			if (buffer != null) {
-				String htmlPath = getSearchFilePath();
-				FileUtil.writeUTF8File(htmlPath + "search.html", buffer.toString()); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	protected String getBookmarkHtmlPath(String boomkarkFile) {
-		int indx = boomkarkFile.lastIndexOf(BOOKMARK_SUFFIX_XML);
-		return pubDir
-				+ NO_APPLET_DIRECTORY + File.separatorChar
-				+ boomkarkFile.substring(0, indx) + BOOKMARK_SUFFIX_HTML;
-	}
-	
-	public String getIndexFilePath() {
-		return pubDir + "index.htm"; //$NON-NLS-1$
-	}
-	
-	private String getSearchFilePath() {
-		return pubDir + File.separatorChar + "search" + File.separatorChar; //$NON-NLS-1$
-	}
-
-	protected XmlElement getOptionXml() {
-		boolean showGlossary = (options == null) || options.isPublishGlossary();
-		boolean showIndex = (options == null) || options.isPublishIndex();
-
-		XmlElement optionXml = new XmlElement("PublishingOption"); //$NON-NLS-1$
-		if ( options != null ) {		
-			optionXml.setAttribute("title", options.getTitle()) //$NON-NLS-1$ //$NON-NLS-2$
-			.setAttribute("bannerImage", options.bannerImage) //$NON-NLS-1$ //$NON-NLS-2$
-			.setAttribute("bannerImageHeight", Integer.toString(options.getBannerImageHeight())) //$NON-NLS-1$ //$NON-NLS-2$
-			.setAttribute(
-					"feedbackUrl", options.feedbackURL) //$NON-NLS-1$ //$NON-NLS-2$
-			.setAttribute("showGlossary", (showGlossary ? "true" : "false")) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			.setAttribute("showIndex", (showIndex ? "true" : "false")) //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			.setAttribute("serverSideSearch", options.isIncludeServletSearch() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		}
-		
-		return optionXml;
-	}
-	
-	public void dispose() {
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/GlossaryBuilder.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/GlossaryBuilder.java
deleted file mode 100644
index e11e1fc..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/GlossaryBuilder.java
+++ /dev/null
@@ -1,296 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.regex.Matcher;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.xml.XSLTProcessor;
-import org.eclipse.epf.library.ILibraryManager;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.configuration.ConfigurationFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.configuration.GuidanceGroupingItemProvider;
-import org.eclipse.epf.library.edit.configuration.GuidanceItemProvider;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.TermDefinition;
-
-/**
- * Build the glossary file for the published configuration.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class GlossaryBuilder {
-
-	public static final String GLOSSARY_BACKPATH = "./../"; //$NON-NLS-1$
-
-	private AdapterFactory adapterFactory;
-
-	private static final Class ITreeItemContentProviderClass = ITreeItemContentProvider.class;
-
-	// generated glossary html file relative to the publishing dir
-	private static final String GLOSSARY_HTML_FILE = "process/glossary.htm"; //$NON-NLS-1$
-
-	private static final String GLOSSARY_INDEX_HTML_FILE = "process/glossary/index.htm"; //$NON-NLS-1$	
-
-	private static final String GLOSSARY_NAVIG_HTML_FILE = "process/glossary/navig.htm"; //$NON-NLS-1$
-
-	// xsl template
-	private static final String GLOSSARY_XSL_FILE = "xsl/glossary.xsl"; //$NON-NLS-1$
-
-	private static final String GLOSSARY_INDEX_XSL_FILE = "xsl/glossary_index.xsl"; //$NON-NLS-1$	
-
-	private static final String GLOSSARY_NAVIG_XSL_FILE = "xsl/glossary_navig.xsl"; //$NON-NLS-1$
-
-	// list to hold all glossary items.
-	private GlossaryList glossaryItems;
-
-	/**
-	 * default constructor
-	 *
-	 */
-	public GlossaryBuilder() {
-
-	}
-
-	/**
-	 * build the glossary and generate the related files.
-	 * 
-	 * @param config MethodConfiguration
-	 * @param pubDir String
-	 * @param title String the title of the glossary page
-	 * @param monitor IProgressMonitor
-	 */
-	public void execute(MethodConfiguration config, String pubDir,
-			String title, IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		glossaryItems = new GlossaryList(pubDir);
-		
-		glossaryItems.clear();
-		IFilter configFilter = new ConfigurationFilter(config);
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.getConfigurationView_AdapterFactory(configFilter);
-		// iterate thru configuration to get all glossary items
-		iterate(config, monitor);
-
-		// create the glossary file
-		createGlossary(pubDir, title);
-
-	}
-
-	/**
-	 * Iterate thru the configuration tree and find all term definition elements
-	 * in the configuration
-	 * 
-	 * @param obj
-	 * @param parent
-	 */
-	private void iterate(Object obj, IProgressMonitor monitor) {
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// Get the adapter from the factory.
-		ITreeItemContentProvider treeItemContentProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(obj, ITreeItemContentProviderClass);
-
-		// Either delegate the call or return nothing.
-		if (treeItemContentProvider != null) {
-			Collection items = treeItemContentProvider.getChildren(obj);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				if (monitor.isCanceled()) {
-					return;
-				}
-
-				// create bookmark
-				Object itorObj = LibraryUtil.unwrap(it.next());
-				if (itorObj instanceof GuidanceGroupingItemProvider) {
-					iterate(itorObj, monitor);
-				} else if (itorObj instanceof GuidanceItemProvider) {
-					iterate(itorObj, monitor);
-				} else if (itorObj instanceof TermDefinition) {
-					// create a glossary entry for the TermDefinition
-					// System.out.println(itorObj);
-					glossaryItems.add((TermDefinition) itorObj);
-				}
-
-			}
-		}
-	}
-
-	private void createGlossary(String pubDir, String title) {
-		try {
-			URL url = new URL(PublishingPlugin.getDefault().getInstallURL(),
-					GLOSSARY_XSL_FILE);
-			if (url == null) {
-				System.out
-						.println("Unable to get glossary xsl template " + GLOSSARY_XSL_FILE); //$NON-NLS-1$
-				return;
-			}
-
-			String xsl_uri = Platform.resolve(url).getPath();
-			StringBuffer xml = glossaryItems.getXml();
-
-			File f = new File(pubDir, GLOSSARY_HTML_FILE);
-			File parent = f.getParentFile();
-			if (!parent.exists()) {
-				parent.mkdirs();
-			}
-
-			// geenrate the html
-			Properties xslParams = PublishingPlugin.getDefault().getProperties(
-					"/xsl/resources.properties"); //$NON-NLS-1$
-			// Properties xslParams = new Properties();
-			xslParams.setProperty("title", title); //$NON-NLS-1$			
-			StringWriter sw = new StringWriter();
-			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, sw);
-			sw.flush();
-			// String content = sw.getBuffer().toString();
-
-			// need to decode the urls
-			String content = ResourceHelper.decodeUrlsInContent(sw.getBuffer()
-					.toString());
-			FileUtil.writeUTF8File(f.getAbsolutePath(), fixContent(content));
-
-			// // fix the element links
-			// FileWriter output = new FileWriter(f);
-			// output.write(fixContent(content));
-			// output.flush();
-			// output.close();
-			sw.close();
-
-			// also save the glossary navigation header html file
-			url = new URL(PublishingPlugin.getDefault().getInstallURL(),
-					GLOSSARY_INDEX_XSL_FILE);
-			if (url == null) {
-				System.out
-						.println("Unable to get glossary xsl template " + GLOSSARY_INDEX_XSL_FILE); //$NON-NLS-1$
-				return;
-			}
-
-			xsl_uri = Platform.resolve(url).getPath();
-			f = new File(pubDir, GLOSSARY_INDEX_HTML_FILE);
-			sw = new StringWriter();
-			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, sw);
-			sw.flush();
-
-			// make sure the file is created.
-			if ( !f.exists() ) {
-				File pf = f.getParentFile();
-				if (!pf.exists()) {
-					pf.mkdirs();
-				}
-				f.createNewFile();
-			}
-			
-			FileUtil.writeUTF8File(f.getAbsolutePath(), sw.toString());
-
-			sw.close();
-
-			// also save the glossary navigation header html file
-			url = new URL(PublishingPlugin.getDefault().getInstallURL(),
-					GLOSSARY_NAVIG_XSL_FILE);
-			if (url == null) {
-				System.out
-						.println("Unable to get glossary xsl template " + GLOSSARY_NAVIG_XSL_FILE); //$NON-NLS-1$
-				return;
-			}
-
-			xsl_uri = Platform.resolve(url).getPath();
-			f = new File(pubDir, GLOSSARY_NAVIG_HTML_FILE);
-			sw = new StringWriter();
-			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, sw);
-			sw.flush();
-
-			FileUtil.writeUTF8File(f.getAbsolutePath(), sw.toString());
-
-			sw.close();
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	private String fixContent(String source) {
-		StringBuffer sb = new StringBuffer();
-		Matcher m = ResourceHelper.p_link_ref.matcher(source);
-
-		while (m.find()) {
-			String urltext = m.group(1);
-			String linkedText = m.group(2);
-
-			urltext = fixUrlText(urltext);
-
-			// update the url text
-			String text = "<a " + urltext + ">" + linkedText + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-			m.appendReplacement(sb, text);
-		}
-
-		m.appendTail(sb);
-		return sb.toString();
-	}
-
-	private String fixUrlText(String urltext) {
-		String guid = ResourceHelper.getGuidFromUrl(urltext);
-		if (guid == null) {
-			return urltext;
-		}
-
-		ILibraryManager manager = LibraryService.getInstance()
-				.getCurrentLibraryManager();
-		MethodElement e = manager != null ? manager.getMethodElement(guid)
-				: null;
-		if (e == null) {
-			return urltext;
-		}
-
-		// if the element is a TermDefinition, use the bookmark in the file
-		// otherwise, find the path to the element
-		String href = ""; //$NON-NLS-1$
-		if (e instanceof TermDefinition) {
-			href = "#" + e.getName(); //$NON-NLS-1$
-		} else {
-			// one level back
-			href = "../" + ResourceHelper.getElementPath(e).replace(File.separatorChar, '/') + ResourceHelper.getFileName(e, ".html"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		StringBuffer sb = new StringBuffer();
-		Matcher m = ResourceHelper.p_link_href_picker
-				.matcher(" " + urltext + " "); //$NON-NLS-1$ //$NON-NLS-2$
-		if (m.find()) {
-			m.appendReplacement(sb, " href=\"" + href + "\" "); //$NON-NLS-1$ //$NON-NLS-2$
-			m.appendTail(sb);
-
-			return sb.toString();
-		}
-
-		return urltext;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/GlossaryList.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/GlossaryList.java
deleted file mode 100644
index b5e0758..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/GlossaryList.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.epf.library.ILibraryResourceManager;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.ContentResourceScanner;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.TermDefinition;
-
-
-/**
- * Holds all glossary items and sort them in desired order grouped by first
- * letter of the glossary name TODO: Add a brief description for this class.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class GlossaryList {
-
-	// using the default order from the configuration explorer.
-	// maybe a special sorted list later,
-	// TreeMap of the first letter of the glossary map to a (Sorted) List of
-	// glossary Items
-	private TreeMap itemMap = new TreeMap();
-
-	private String pubDir;
-	
-	/**
-	 * default constructor
-	 *
-	 */
-	public GlossaryList(String pubDir) {
-		this.pubDir = pubDir;
-	}
-
-	/**
-	 * initialize the list
-	 *
-	 */
-	public void clear() {
-		itemMap.clear();
-	}
-
-	/**
-	 * add a TermDefinition into the glossary list
-	 * 
-	 * @param element TermDefinition
-	 */
-	public void add(TermDefinition element) {
-		String name = TngUtil.getPresentationName(element);
-		String group = "" + name.charAt(0); //$NON-NLS-1$
-		getItemList(group).add(element);
-	}
-
-	private List getItemList(String group) {
-		group = group.toUpperCase();
-		List l = (List) itemMap.get(group);
-		if (l == null) {
-			l = new ArrayList();
-			itemMap.put(group, l);
-		}
-
-		return l;
-	}
-
-	/**
-	 * get the xml document for the list
-	 * 
-	 * @return StringBuffer
-	 */
-	public StringBuffer getXml() {
-		XmlElement xe = new XmlElement("Glossary"); //$NON-NLS-1$
-
-		// set the language attribute
-		Locale locale = Locale.getDefault();
-		String lang = locale.getLanguage();
-		xe.setAttribute("lang", lang); //$NON-NLS-1$
-
-		for (Iterator it = itemMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Map.Entry) it.next();
-			String group = (String) entry.getKey();
-			List items = (List) entry.getValue();
-
-			// create a bookmark for the group
-			xe.newChild("item") //$NON-NLS-1$
-					.setAttribute("name", group) //$NON-NLS-1$
-					.setAttribute("presentationName", group) //$NON-NLS-1$
-					.setAttribute("navigation-mark", "true") //$NON-NLS-1$ //$NON-NLS-2$
-					.setAttribute("content", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
-			// then create entry for each item
-			for (Iterator itItem = items.iterator(); itItem.hasNext();) {
-				TermDefinition element = (TermDefinition) itItem.next();
-				String name = element.getName();
-				String presentationName = TngUtil.getPresentationName(element);
-				String content = element.getPresentation().getMainDescription();
-
-				// scan the content and copy images if any
-				scanContentForResources(element, content, ResourceHelper.getElementPath(element));
-
-				// fix the links in the content
-				content = ResourceHelper.fixContentUrlPath(content,
-						ResourceHelper.getElementPath(element),
-						GlossaryBuilder.GLOSSARY_BACKPATH);
-				
-				xe.newChild("item") //$NON-NLS-1$
-						.setAttribute("name", name) //$NON-NLS-1$
-						.setAttribute("presentationName", presentationName) //$NON-NLS-1$
-						.setAttribute("content", content); //$NON-NLS-1$
-			}
-		}
-
-		return xe.toXml();
-	}
-
-	/**
-	 * Scans the content for resource references.
-	 */
-	private void scanContentForResources(MethodElement owner, String content,
-			String contentPath) {
-		ContentResourceScanner scanner = getScanner(owner);
-		if ( scanner != null ) {
-			scanner.resolveResources(owner, content, contentPath);
-		}
-	}
-	
-	/**
-	 * Returns the content resource scanner for the element.
-	 */
-	private ContentResourceScanner getScanner(MethodElement owner) {
-		ILibraryResourceManager resMgr = ResourceHelper.getResourceMgr(owner);
-		if ( resMgr == null ) {
-			return null;
-		}
-		
-		String rootContentPath = resMgr.getLogicalPluginPath(owner);
-		File src_root = new File(resMgr.getPhysicalPluginPath(owner));
-		File tgt_root = new File(this.pubDir, rootContentPath);
-		ContentResourceScanner scanner = new ContentResourceScanner(src_root, tgt_root, rootContentPath, null);
-
-		return scanner;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ISiteGenerator.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ISiteGenerator.java
deleted file mode 100644
index 826de16..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ISiteGenerator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.util.List;
-
-import org.eclipse.epf.library.layout.Bookmark;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-
-/**
- * define the interface for site generator. 
- * Each publisher should implement a site generator to handle the site generation properly.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public interface ISiteGenerator {
-			
-	public void prePublish() throws Exception;
-	public void postPublish() throws Exception;
-
-	public void writePublishedBookmarks(List bookmarks, Bookmark defaultView) throws Exception;
-
-	public HtmlBuilder getHtmlBuilder();
-	public PublishOptions getPublishOptions();
-	public String getIndexFilePath();
-	public String getNodeIconPath(); 
-	public void dispose();
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/IndexBuilder.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/IndexBuilder.java
deleted file mode 100644
index 42f9b0b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/IndexBuilder.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.common.xml.XSLTProcessor;
-import org.eclipse.epf.library.configuration.ConfigurationFilter;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.TngAdapterFactory;
-import org.eclipse.epf.library.edit.configuration.GuidanceGroupingItemProvider;
-import org.eclipse.epf.library.edit.configuration.GuidanceItemProvider;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.TermDefinition;
-
-
-/**
- * Build the glossary file for the published configuration.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class IndexBuilder {
-
-	private AdapterFactory adapterFactory;
-
-	private static final Class ITreeItemContentProviderClass = ITreeItemContentProvider.class;
-
-	// generated glossary html file relative to the publishing dir
-	private static final String INDEX_HTML_FILE = "index/contents.htm"; //$NON-NLS-1$
-
-	private static final String INDEX_NAVIG_HTML_FILE = "index/navig.htm"; //$NON-NLS-1$
-
-	// xsl template
-	private static final String INDEX_XSL_FILE = "xsl/index_contents.xsl"; //$NON-NLS-1$
-
-	private static final String INDEX_NAVIG_XSL_FILE = "xsl/index_navig.xsl"; //$NON-NLS-1$
-
-	// list to hold all glossary items.
-	private IndexList indexItems = new IndexList();
-
-	/**
-	 * default constructor
-	 *
-	 */
-	public IndexBuilder() {
-
-	}
-
-	/**
-	 * build the index for the published site.
-	 * 
-	 * @param config MethodConfiguration
-	 * @param pubDir String
-	 * @param title String the title for the glossary index page
-	 * @param monitor IProgressMonitor
-	 */
-	public void execute(MethodConfiguration config, String pubDir,
-			String title, IProgressMonitor monitor) {
-		indexItems.clear();
-		IFilter configFilter = new ConfigurationFilter(config);
-		adapterFactory = TngAdapterFactory.INSTANCE
-				.getConfigurationView_AdapterFactory(configFilter);
-		// iterate thru configuration to get all glossary items
-		iterate(config);
-
-		// create the glossary file
-		createIndex(pubDir, title);
-
-	}
-
-	/**
-	 * Iterate thru the configuration tree and find all term definition elements
-	 * in the configuration
-	 * 
-	 * @param obj
-	 * @param parent
-	 */
-	private void iterate(Object obj) {
-		// Get the adapter from the factory.
-		ITreeItemContentProvider treeItemContentProvider = (ITreeItemContentProvider) adapterFactory
-				.adapt(obj, ITreeItemContentProviderClass);
-
-		// Either delegate the call or return nothing.
-		if (treeItemContentProvider != null) {
-			Collection items = treeItemContentProvider.getChildren(obj);
-			for (Iterator it = items.iterator(); it.hasNext();) {
-				// create bookmark
-				Object itorObj = LibraryUtil.unwrap(it.next());
-				if (itorObj instanceof GuidanceGroupingItemProvider) {
-					iterate(itorObj);
-				} else if (itorObj instanceof GuidanceItemProvider) {
-					iterate(itorObj);
-				} else if (itorObj instanceof TermDefinition) {
-					// index the term definition objects
-					TermDefinition term = (TermDefinition) itorObj;
-					String name = term.getName();
-					String content = "definition in glossary"; //$NON-NLS-1$
-					String url = "../glossary/glossary.htm#" + term.getName(); //$NON-NLS-1$
-					indexItems.add(name, content, url);
-				}
-
-			}
-		}
-	}
-
-	private void createIndex(String pubDir, String title) {
-		try {
-			URL url = new URL(PublishingPlugin.getDefault().getInstallURL(),
-					INDEX_XSL_FILE);
-			if (url == null) {
-				System.out
-						.println("Unable to get index xsl template " + INDEX_XSL_FILE); //$NON-NLS-1$
-				return;
-			}
-
-			String xsl_uri = Platform.resolve(url).getPath();
-			StringBuffer xml = indexItems.getXml();
-			// System.out.println(xml);
-
-			File f = new File(pubDir, INDEX_HTML_FILE);
-			File parent = f.getParentFile();
-			if (!parent.exists()) {
-				parent.mkdirs();
-			}
-
-			// geenrate the html
-			Properties xslParams = new Properties();
-			xslParams.setProperty("title", title); //$NON-NLS-1$			
-			StringWriter sw = new StringWriter();
-			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, sw);
-			sw.flush();
-			String content = sw.getBuffer().toString();
-
-			// fix the element links
-			FileWriter output = new FileWriter(f);
-			output.write(content);
-			output.flush();
-			output.close();
-
-			// also save the glossary navigation header html file
-			url = new URL(PublishingPlugin.getDefault().getInstallURL(),
-					INDEX_NAVIG_XSL_FILE);
-			if (url == null) {
-				System.out
-						.println("Unable to get glossary xsl template " + INDEX_NAVIG_XSL_FILE); //$NON-NLS-1$
-				return;
-			}
-
-			xsl_uri = Platform.resolve(url).getPath();
-			f = new File(pubDir, INDEX_NAVIG_HTML_FILE);
-			output = new FileWriter(f);
-			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, output);
-			output.flush();
-			output.close();
-
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/IndexList.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/IndexList.java
deleted file mode 100644
index fe7b18c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/IndexList.java
+++ /dev/null
@@ -1,123 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.epf.library.layout.util.XmlElement;
-
-/**
- * Holds all glossary items and sort them in desired order grouped by first
- * letter of the glossary name TODO: Add a brief description for this class.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class IndexList {
-
-	// using the default order from the configuration explorer.
-	// maybe a special sorted list later,
-	// TreeMap of the first letter of the glossary map to a (Sorted) List of
-	// glossary Items
-	private TreeMap itemMap = new TreeMap();
-
-	/**
-	 * default constructor
-	 *
-	 */
-	public IndexList() {
-	}
-
-	/**
-	 * inislize the list
-	 *
-	 */
-	public void clear() {
-		itemMap.clear();
-	}
-
-	/**
-	 * add an entry to the list
-	 * 
-	 * @param term String
-	 * @param content String
-	 * @param url String
-	 */
-	public void add(String term, String content, String url) {
-		IndexItem item = new IndexItem(term, content, url);
-		String group = "" + item.termName.charAt(0); //$NON-NLS-1$
-		getItemList(group).add(item);
-	}
-
-	private List getItemList(String group) {
-		group = group.toUpperCase();
-		List l = (List) itemMap.get(group);
-		if (l == null) {
-			l = new ArrayList();
-			itemMap.put(group, l);
-		}
-
-		return l;
-	}
-
-	/**
-	 * get the xml document for the list
-	 * 
-	 * @return StringBuffer
-	 */
-	public StringBuffer getXml() {
-		XmlElement xe = new XmlElement("Index"); //$NON-NLS-1$
-
-		for (Iterator it = itemMap.entrySet().iterator(); it.hasNext();) {
-			Map.Entry entry = (Map.Entry) it.next();
-			String group = (String) entry.getKey();
-			List items = (List) entry.getValue();
-
-			// create a bookmark for the group
-			xe.newChild("item") //$NON-NLS-1$
-					.setAttribute("name", group) //$NON-NLS-1$
-					.setAttribute("presentationName", group) //$NON-NLS-1$
-					.setAttribute("navigation-mark", "true") //$NON-NLS-1$ //$NON-NLS-2$
-					.setAttribute("content", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
-			// then create entry for each item
-			for (Iterator itItem = items.iterator(); itItem.hasNext();) {
-				IndexItem item = (IndexItem) itItem.next();
-				xe.newChild("item") //$NON-NLS-1$
-						.setAttribute("name", item.termName) //$NON-NLS-1$
-						.setAttribute("presentationName", item.termName) //$NON-NLS-1$
-						.setAttribute("content", item.content) //$NON-NLS-1$
-						.setAttribute("url", item.url); //$NON-NLS-1$
-			}
-		}
-
-		return xe.toXml();
-	}
-
-	class IndexItem {
-		public String termName;
-
-		public String content;
-
-		public String url;
-
-		public IndexItem(String termName, String content, String url) {
-			this.termName = termName;
-			this.content = content;
-			this.url = url;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingContentValidator.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingContentValidator.java
deleted file mode 100644
index ddad6cf..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingContentValidator.java
+++ /dev/null
@@ -1,284 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.TermDefinition;
-
-/**
- * This is the content validator for publishing a process closure. 
- * The validator will check elements against the process closure and determine if 
- * an element should be published or not.
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class ProcessPublishingContentValidator extends PublishingContentValidator {
-
-	protected static final String CLOSURE_LOG_FILENAME = "processClosure.html"; //$NON-NLS-1$
-
-	// closure elements for process publishing, null for config publishing
-	List closureElements = null;
-	private boolean isFinalClosure = false;
-	
-//	// maintain the object references generated from TaskDescriptors
-//	// map of owner element to a list of referenced elements
-//	Map objReferences = new HashMap();
-	
-	private boolean debug = PublishingPlugin.getDefault().isDebugging();
-	
-	protected PrintStream closureLog = null;
-	
-	/**
-	 * constructor
-	 * 
-	 * @param pubDir String
-	 * @param validateExternalLinks boolean
-	 */
-	public ProcessPublishingContentValidator(String pubDir, PublishHTMLOptions options) {
-		super(pubDir, options);
-		
-		closureLog = getStream(CLOSURE_LOG_FILENAME);
-		beginClosureLog();
-
-	}
-
-	/**
-	 * add the elements to the process closure.
-	 * @param items List
-	 */
-	public void addClosureElements(List items) {
-		// do nothing
-		if ( closureElements == null ) {
-			closureElements = new ArrayList();
-		}
-		
-		closureElements.addAll(items);
-	}
-
-	/**
-	 * 	make element closure 
-	 *  all the published and referenced elements are the element closure. 
-	 *  since they are all the elements referenced by the processes and their related process elements. 
-	 */
-	public void makeElementClosure() {
-		this.isFinalClosure = true;
-		
-		endClosureLog();
-		
-		// test
-		if ( debug) {
-			System.out.println("====================== Closure elements ======================="); //$NON-NLS-1$
-			for (Iterator it = closureElements.iterator(); it.hasNext(); ) {
-				System.out.println(LibraryUtil.getTypeName((MethodElement)it.next()));
-			}
-			System.out.println("====================== Closure elements end ======================="); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * check if a closure is created or not.
-	 * @return boolean
-	 */
-	public boolean hasClosure() {
-		return (closureElements != null) && (closureElements.size() > 0);
-	}
-	
-	/**
-	 * determine if the element is in the process element closure or not
-	 * The process element closure contains all the process elements of the selected processes, 
-	 * plus all the content elements those elements referenced.
-	 * 
-	 * @param e MethodElement
-	 * @return boolean
-	 */
-	public boolean inClosure(MethodElement e) {
-		
-		if ( e == null ) {
-			return false;
-		}
-		
-		if ( !hasClosure() ) {
-			return true;
-		}
-		
-		if ( e instanceof ContentCategory ) {
-			return true;
-		}
-		
-		// 166048 - check-items, task-steps don't appear when using the publishing type "publish the processes selected below"
-		if ( ConfigurationHelper.isDescriptionElement(e) ) {
-			return true;
-		}
-		
-		if ( closureElements.contains(e) ) {
-			return true;
-		}
-		
-		if ( !(e instanceof Guidance) ) {
-			return false;
-		}
-		
-		if ( e instanceof Practice 
-				|| e instanceof Roadmap 
-				|| e instanceof SupportingMaterial 
-				|| e instanceof TermDefinition )
-		{
-			return true;
-		}
-
-		return false;
-			
-	}
-	
-	/**
-	 * check if the element is discarded or not
-	 * discarded elements will be treated as out side the configursation
-	 * 
-	 * @param owner MethodElement the owner of the element
-	 * @param feature Object EStructuralFeature or OppositeFeature
-	 * @param e MethodElement the element to be checked
-	 */
-	/* (non-Javadoc)
-	 * @see com.ibm.rmc.library.layout.IContentValidator#isDiscarded(org.eclipse.epf.uma.MethodElement, java.lang.Object, org.eclipse.epf.uma.MethodElement)
-	 */
-	public boolean isDiscarded(MethodElement owner, Object feature, MethodElement e) {
-	
-		if ( owner == null ) {
-			owner = defaultTarget;
-		} else if ( defaultTarget != null && owner != defaultTarget ) {
-			
-			super.logWarning("Target mismatch" + LibraryUtil.getTypeName(owner) + "<--->" + LibraryUtil.getTypeName(defaultTarget)); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		
-		if ( super.isDiscarded(owner, feature, e) ) {
-			return true;
-		}
-		
-		boolean inCls = inClosure(e);
-		if (!inCls && !isFinalClosure ) {
-			// if the closure is not final, then if the owner is in closure and the element is a Guidance, 
-			// this element is also in closure
-			inCls = inClosure(owner) && (e instanceof Guidance);
-		}
-		
-		if ( !inCls ) {
-			return true;
-		}
-		
-//		// special handling for Tasks
-//		if ( owner instanceof Task ) {
-//			if ( feature == UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy() || 
-//					feature == UmaPackage.eINSTANCE.getTask_MandatoryInput() ||
-//					feature == UmaPackage.eINSTANCE.getTask_OptionalInput() || 
-//					feature == UmaPackage.eINSTANCE.getTask_Output() ) {
-//				List refs = (List)objReferences.get(owner);
-//				if ( refs != null && !refs.contains(e) ) {
-//					return true;
-//				}
-//			}
-//		}
-		
-		return false;
-	}
-	
-	
-	/**
-	 * dispose the object
-	 */
-	public void dispose() {
-		
-		if ( closureElements != null ) {
-			closureElements.clear();
-		}
-		
-//		if ( objReferences != null ) {
-//			objReferences.clear();
-//		}
-		
-		if ( closureLog != null ) {
-			closureLog.close();
-			closureLog = null;
-		}
-		
-		super.dispose();
-		
-	}
-	
-	private void beginClosureLog() {
-		closureLog.println("<table>"); //$NON-NLS-1$
-		addLogEntry("<b>Element</b>", "<b>Referenced By</b>"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-	
-	private void endClosureLog() {
-		closureLog.println("</table>"); //$NON-NLS-1$
-	}
-	
-	private void addLogEntry(String str1, String str2) {
-		StringBuffer b = new StringBuffer();
-		b.append("<tr><td>").append(str1).append("</td><td>").append(str2).append("</td></tr>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		closureLog.println(b);
-	}
-	
-	/**
-	 * log the referenced element.
-	 * 
-	 * @param owner MethodElement the referencing element
-	 * @param e MethodElement the referenced element
-	 */
-	public void logReference(MethodElement owner, MethodElement e)
-	{
-		super.logReference(owner, e);
-		if ( e instanceof Descriptor ) {
-			return;
-		}
-		
-		if ( !isFinalClosure && closureLog != null) {
-			
-			StringBuffer b = new StringBuffer();
-			if ( owner instanceof BreakdownElement ) {
-				b.append(getBreakdownElementLabel((BreakdownElement)owner));
-			} else if ( owner != null ) {
-				b.append(LibraryUtil.getTypeName(owner));
-			}
-			
-			addLogEntry(LibraryUtil.getTypeName(e), b.toString());
-		}
-	}
-	
-	private StringBuffer getBreakdownElementLabel(BreakdownElement e) {
-		StringBuffer b = new StringBuffer();
-		b.append(LibraryUtil.getTypeName(e));
-
-		while ( (e=e.getSuperActivities()) != null ) {
-			b.insert(0, LibraryUtil.getTypeName(e) + "/"); //$NON-NLS-1$
-		}
-		
-		return b;
-	}
-		
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingElementRealizer.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingElementRealizer.java
deleted file mode 100644
index 081f9a4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingElementRealizer.java
+++ /dev/null
@@ -1,78 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-// 
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * ElementRealizer for process publishing.
- * Realizes the element based on the configuration, realize options, and the process closure.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class ProcessPublishingElementRealizer extends PublishingElementRealizer {
-	
-	/**
-	 * constructor
-	 * 
-	 * @param config MethodConfiguration
-	 * @param validator ProcessPublishingContentValidator
-	 */
-	public ProcessPublishingElementRealizer(MethodConfiguration config, ProcessPublishingContentValidator validator) {
-		super(config, validator);
-	}
-
-	/**
-	 * realize the element. 
-	 * 
-	 * @param element MethodElement
-	 * @return MethodElement the realized element.
-	 */
-	public MethodElement realize(MethodElement element) {
-		
-		return super.realize(element);
-	}
-	
-	/**
-	 * realize the list of feature values and returns a new list of values
-	 * The new might be a re-sorting of the original list 
-	 * or some of the values can be filtered out, depending on the detail implementation
-	 * Note: the list value passed in might be updated as well.
-	 * @param element MethodElement
-	 * @param feature EStructuralFeature
-	 * @param values List
-	 * @return List
-	 */
-	public List realize(MethodElement element, 
-			EStructuralFeature feature, List values)
-	{		
-		List items = super.realize(element, feature, values);
-	
-//		// add the feature references in case the validator need feature-based reference information,
-//		// for example, when publishing process, the output WPs in a Task should not be published 
-//		// it none of the TaskDescriptors for this task has reference to that WP.
-//		if ( element instanceof TaskDescriptor ) {
-//			Task t = (Task)realize(((TaskDescriptor)element).getTask());
-//			
-//			((ProcessPublishingContentValidator)validator).setElementReferences(t, items);
-//			
-//		}
-		
-		return items;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishHTMLOptions.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishHTMLOptions.java
deleted file mode 100644
index d35c174..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishHTMLOptions.java
+++ /dev/null
@@ -1,393 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.awt.Image;
-import java.io.File;
-
-import javax.imageio.ImageIO;
-
-import org.eclipse.epf.library.layout.elements.ActivityLayout;
-
-/**
- * Extends tbe basic publish options to include HTML options.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class PublishHTMLOptions extends PublishOptions {
-
-	// The HTML title.
-	protected String title;
-
-	// The about HTML.
-	protected String aboutHTML;
-
-	// The feedback URL.
-	protected String feedbackURL;
-
-	// Publish glossary option.
-	protected boolean publishGlossary;
-
-	// Publish index option.
-	protected boolean publishIndex;
-
-	// The banner image.
-	protected String bannerImage;
-	
-	protected int bannerImageHeight = 67; // banner image height, can we auto calc it???
-
-	// Check external links option.
-	protected boolean checkExternalLinks;
-
-	// Convert broken links to plain text option.
-	protected boolean convertBrokenLinks;
-
-	// Publish JavaScript navigation tree option.
-	protected boolean publishJavaScriptTree = true;
-
-	// Publish dynamic web application option.
-	protected boolean publishDynamicWebApp;
-
-	// The dynamic web application name.
-	protected String dynamicWebAppName;
-
-	// Include servlet search option.
-	protected boolean includeServletSearch;
-
-	// define the default activity tab
-	protected String defaultActivityTab = ActivityLayout.TAB_NAME_ACTIVITY_WBS;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishHTMLOptions() {
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishHTMLOptions(PublishOptions options) {
-		this.publishDir = options.getPublishDir();
-		this.processes = options.getProcesses();
-		this.publishConfiguration = options.isPublishConfiguration();
-		this.publishProcess = options.isPublishProcess();
-		this.publishUnopenADD = options.isPublishUnopenADD();
-		this.publishBaseAD = options.isPublishBaseAD();
-		this.publishLightWeightTree = options.isPublishLightWeightTree();
-		this.publishEmptyCategories = options.isPublishEmptyCategories();
-		this.showMethodContentInDescriptors = options
-				.isShowMethodContentInDescriptors();
-		this.showRelatedDescriptors = options.isShowRelatedDescriptors();
-		this.showDescriptorsInNavigationTree = options
-				.isShowDescriptorsInNavigationTree();
-		this.publishEmptyCategories = options.isPublishEmptyCategories();
-	}
-
-	/**
-	 * Gets the HTML title.
-	 * 
-	 * @return the HTML title
-	 */
-	public String getTitle() {
-		return title;
-	}
-
-	/**
-	 * Sets the HTML title.
-	 * 
-	 * @param title
-	 *            the HTML title
-	 */
-	public void setTitle(String title) {
-		this.title = title;
-	}
-
-	/**
-	 * Gets the About HTML.
-	 * 
-	 * @return the About HTML
-	 */
-	public String getAboutHTML() {
-		return aboutHTML;
-	}
-
-	/**
-	 * Sets the About HTML.
-	 * 
-	 * @param aboutHTML
-	 *            the About HTML
-	 */
-	public void setAboutHTML(String aboutHTML) {
-		this.aboutHTML = aboutHTML;
-	}
-
-	/**
-	 * Gets the feedback URL.
-	 * 
-	 * @return the feedback URL
-	 */
-	public String getFeedbackURL() {
-		return feedbackURL;
-	}
-
-	/**
-	 * Sets the feedback URL.
-	 * 
-	 * @param feedbackURL
-	 *            the feedback URL
-	 */
-	public void setFeedbackURL(String feedbackURL) {
-		this.feedbackURL = feedbackURL;
-	}
-
-	/**
-	 * Gets the publish glossary option.
-	 * 
-	 * @return <code>true</code> if the glossary needs to be published
-	 */
-	public boolean isPublishGlossary() {
-		return publishGlossary;
-	}
-
-	/**
-	 * Sets the publish glossary option.
-	 * 
-	 * @param publishGlossary
-	 *            if <code>true</code>, publish the glossary
-	 */
-	public void setPublishGlossary(boolean publishGlossary) {
-		this.publishGlossary = publishGlossary;
-	}
-
-	/**
-	 * Gets the publish index option.
-	 * 
-	 * @return <code>true</code> if the index needs to be published
-	 */
-	public boolean isPublishIndex() {
-		return publishIndex;
-	}
-
-	/**
-	 * Sets the publish index option.
-	 * 
-	 * @param publishIndex
-	 *            if <code>true</code>, publish the index
-	 */
-	public void setPublishIndex(boolean publishIndex) {
-		this.publishIndex = publishIndex;
-	}
-
-	/**
-	 * Gets the banner image.
-	 * 
-	 * @return the banner image
-	 */
-	public String getBannerImage() {
-		return bannerImage;
-	}
-
-	/**
-	 * Sets the banner image.
-	 * 
-	 * @param bannerImage
-	 *            the banner image
-	 */
-	public void setBannerImage(String bannerImage) {
-		this.bannerImage = bannerImage;
-		
-		// set the height of the banner
-		Image image = null;
-		File f = new File(this.bannerImage);
-		if ( f.exists() ) {
-			try {
-				image = ImageIO.read(f);
-				if ( image != null ) {
-					int height = image.getHeight(null);
-					if ( height > 0 ) {
-						this.bannerImageHeight = height;
-					}
-				}
-			} catch (Exception ex ) {
-				// error read the file, ignore error and use the default banner height
-				;
-			} finally {
-			}
-		}
-	}
-
-	/**
-	 * Gets the banner image.
-	 * 
-	 * @return the banner image height
-	 */
-	public int getBannerImageHeight() {
-		return bannerImageHeight;
-	}
-
-	/**
-	 * Sets the banner image.
-	 * 
-	 * @param bannerImage
-	 *            the banner image height in pixels
-	 */
-	public void setBannerImageHeight(int bannerImageheight) {
-		this.bannerImageHeight = bannerImageheight;
-	}
-	
-	/**
-	 * Gets the check external links option.
-	 * 
-	 * @return <code>true</code> if the external links need to be checked
-	 */
-	public boolean isCheckExternalLinks() {
-		return checkExternalLinks;
-	}
-
-	/**
-	 * Sets the check external links option.
-	 * 
-	 * @param checkExternalLinks
-	 *            if <code>true</code>, check the external links
-	 */
-	public void setCheckExternalLinks(boolean checkExternalLinks) {
-		this.checkExternalLinks = checkExternalLinks;
-	}
-
-	/**
-	 * Gets the convert broken links option.
-	 * 
-	 * @return <code>true</code> if the convert broken links need to be
-	 *         converted to plain text
-	 */
-	public boolean isConvertBrokenLinks() {
-		return convertBrokenLinks;
-	}
-
-	/**
-	 * Sets the convert broken links option.
-	 * 
-	 * @param convertBrokenLinks
-	 *            if <code>true</code>, convert broken links to plian text
-	 */
-	public void setConvertBrokenLinks(boolean convertBrokenLinks) {
-		this.convertBrokenLinks = convertBrokenLinks;
-	}
-
-	/**
-	 * Gets the publish JavaScript navigation tree option.
-	 * 
-	 * @return <code>true</code> if a JavaScript navigation tree will be
-	 *         published
-	 */
-	public boolean isPublishJavaScriptTree() {
-		return publishJavaScriptTree;
-	}
-
-	/**
-	 * Sets the publish JavaScript navigation tree option.
-	 * 
-	 * @param publishJavaScriptTree
-	 *            if <code>true</code>, publish a JavaScript navigation tree
-	 */
-	public void setPublishJavaScriptTree(boolean publishJavaScriptTree) {
-		this.publishJavaScriptTree = publishJavaScriptTree;
-	}
-
-	/**
-	 * Gets the publish dynamic web application option.
-	 * 
-	 * @return <code>true</code> if a dynamic web application will be
-	 *         published
-	 */
-	public boolean isPublishDynamicWebApp() {
-		return this.publishDynamicWebApp 
-		&& (this.dynamicWebAppName != null)
-		&& (this.dynamicWebAppName.length() > 0);
-	}
-
-	/**
-	 * Sets the publish dynamic web application option.
-	 * 
-	 * @param publishDynamicWebApp
-	 *            if <code>true</code>, publish a dynamic web application
-	 */
-	public void setPublishDynamicWebApp(boolean publishDynamicWebApp) {
-		this.publishDynamicWebApp = publishDynamicWebApp;
-	}
-
-	/**
-	 * Gets the dynamic web application name.
-	 * 
-	 * @return the dynamic web application name
-	 */
-	public String getDynamicWebAppName() {
-		return dynamicWebAppName;
-	}
-
-	/**
-	 * Sets the dynamic web application name.
-	 * 
-	 * @param dynamicWebAppName
-	 *            the dynamic web application name.
-	 */
-	public void setDynamicWebAppName(String dynamicWebAppName) {
-		this.dynamicWebAppName = dynamicWebAppName;
-	}
-
-	/**
-	 * Gets the include servlet search option.
-	 * 
-	 * @return <code>true</code> if include servlet search will be added to
-	 *         the published dynamic web application
-	 */
-	public boolean isIncludeServletSearch() {
-		return includeServletSearch && isPublishDynamicWebApp();
-	}
-
-	/**
-	 * Sets the include servlet search option.
-	 * 
-	 * @param includeServletSearch
-	 *            if <code>true</code>, include servlet search in the
-	 *            published dynamic web application
-	 */
-	public void setIncludeServletSearch(boolean includeServletSearch) {
-		this.includeServletSearch = includeServletSearch;
-	}
-
-	/**
-	 * get the default activity tab
-	 * @return String
-	 */
-	public String getDefaultActivityTab() {
-		return this.defaultActivityTab;
-	}
-	
-	/**
-	 * set the default activity tab
-	 * @param tabName
-	 */
-	public void setDefaultActivityTab(String tabName) {
-		this.defaultActivityTab = tabName;
-	}
-	
-	/**
-	 * Validates the publish options.
-	 * 
-	 * @return <code>true</code> if the publish options is valid.
-	 */
-	public void validate() {
-		super.validate();
-		
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishManager.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishManager.java
deleted file mode 100644
index 331c329..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishManager.java
+++ /dev/null
@@ -1,328 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.net.URL;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.common.serviceability.DebugTrace;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.library.configuration.ElementRealizer;
-import org.eclipse.epf.library.layout.Bookmark;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.epf.publishing.services.index.DefinitionObject;
-import org.eclipse.epf.publishing.services.index.KeyWordIndexHelper;
-import org.eclipse.epf.publishing.util.PublishingUtil;
-import org.eclipse.epf.search.SearchService;
-
-/**
- * Manages the publishing of a method configuration.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PublishManager extends AbstractPublishManager {
-
-	protected static final String KEYWORD_DEF_FILE = "keywordindexdef.txt"; //$NON-NLS-1$
-
-	protected static final String PUBLISHING_REPORT_XSL_FILE = "xsl/PublishingReport.xsl"; //$NON-NLS-1$
-
-	protected static final String PUBLISHING_REPORT_HTML_FILE = "PublishingReport.html"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishManager() {
-	}
-
-	protected AbstractViewBuilder createViewBuilder() {
-		// boolean validateExternalLinks = (options != null)
-		// && options.isCheckExternalLinks();
-
-		PublishingContentValidator validator = null;
-		ElementRealizer realizer = null;
-		if ((options != null) && options.publishProcess) {
-			validator = new ProcessPublishingContentValidator(pubDir, options);
-			realizer = new ProcessPublishingElementRealizer(config,
-					(ProcessPublishingContentValidator) validator);
-		} else {
-			validator = new PublishingContentValidator(pubDir, options);
-			realizer = new PublishingElementRealizer(config, validator);
-		}
-
-		// validator.setShowBrokenLinks(options.convertBrokenLinks == false);
-		// validator.setShowExtraInfoForDescriptors(options
-		// .isShowMethodContentInDescriptors());
-		// validator.setShowRelatedDescriptors(options.showRelatedDescriptors);
-
-		ElementLayoutManager layoutMgr = new ElementLayoutManager(config,
-				pubDir, validator, true);
-		layoutMgr.setElementRealizer(realizer);
-		HtmlBuilder builder = new HtmlBuilder(layoutMgr);
-
-		builder.enableContentScan(true);
-		builder.enableTreeBrowser(true);
-
-		ISiteGenerator generator = new DefaultSiteGenerator(builder, options);
-		return new ConfigurationViewBuilder(generator);
-	}
-
-	protected void prePublish(IProgressMonitor monitor) throws Exception {
-
-		// fixOptions(options);
-
-		monitor.subTask(PublishingResources.initializingDirTask_name); //$NON-NLS-1$
-
-		// make sure the publish directory is created
-		File f = new File(viewBuilder.getHtmlBuilder().getPublishDir());
-		if (!f.exists()) {
-			f.mkdirs();
-		}
-
-		// copy the configuration files
-		monitor.subTask(PublishingResources.copyingFilesTask_name); //$NON-NLS-1$
-		/*
-		 * copyDocRootFiles(); // copy localized files copyLocalizedFiles(); //
-		 * copy user customized files last copyCustomizedFiles();
-		 */
-		getSiteGenerator().prePublish();
-
-	}
-
-	protected void doPublish(IProgressMonitor monitor) throws Exception {
-		
-		// before doing publishing, load the whole library and remember the resouces loaded
-		// so we can unload those resources later to free memory
-		Collection<Resource> changedResources = loadLibrary(monitor);
-		Collection<DiagramManager> existingMgrs = DiagramManager.getDiagramManagers();
-
-		// don't copy all the content resources
-		// let the system scan the content and copy only the required
-		// resource
-		// viewBuilder.getHtmlBuilder().enableContentScan(true);
-		// viewBuilder.getHtmlBuilder().enableTreeBrowser(true);
-
-		// generate bookmarks and published the contents as needed
-		monitor.subTask(PublishingResources.generatingBookmarksTask_name); //$NON-NLS-1$
-		generateBookmarks(monitor);
-
-		String title = options == null ? "" : options.getTitle(); //$NON-NLS-1$
-
-		if (!monitor.isCanceled()) {			
-			// creating glossary
-			if (options == null || options.isPublishGlossary()) {
-				monitor.subTask(PublishingResources.generatingGlossaryTask_name); //$NON-NLS-1$
-				new GlossaryBuilder().execute(config, pubDir, title, monitor);
-			}
-		}
-		
-		// make sure the resources are unloaded before return
-		// now it's time to unload the resoruces
-		Collection<DiagramManager> newMgrs = DiagramManager.getDiagramManagers();
-		PublishingUtil.disposeDiagramManagers(newMgrs, existingMgrs);
-		PublishingUtil.unloadResources(changedResources);
-		changedResources.clear();
-		existingMgrs.clear();
-		newMgrs.clear();
-		Runtime.getRuntime().gc();	
-		
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// creating content index
-		if (options == null || options.isPublishIndex()) {
-			monitor
-					.subTask(PublishingResources.generatingBookmarkIndexTask_name); //$NON-NLS-1$
-			// new IndexBuilder().execute(config, publishDir, monitor);
-			generateBookmarkIndex(pubDir, title, monitor);
-		}
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// enable searching
-		if (options != null && options.isPublishDynamicWebApp()
-				&& options.isIncludeServletSearch()) {
-			// generating the search index
-			monitor.subTask(PublishingResources.generatingSearchIndexTask_name);
-			SearchService.getInstance().createIndex(pubDir, false);
-		}
-	}
-
-	protected void postPublish(IProgressMonitor monitor) throws Exception {
-		// finally, generate a report
-		getSiteGenerator().postPublish();
-
-		createWARFile();
-
-		getPublishReportUrl();
-	}
-
-	private void generateBookmarks(IProgressMonitor monitor) throws Exception {
-		long beginTime = 0L;
-		long startTime = 0L;
-		if (profiling) {
-			beginTime = startTime = System.currentTimeMillis();
-		}
-		List<Bookmark> bookmarks = viewBuilder.buildViews(monitor);
-		if (profiling) {
-			DebugTrace.print(viewBuilder, "buildViews", //$NON-NLS-1$
-					(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-		}
-		
-		Bookmark defaultView = viewBuilder.getDefaultView();
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// 3. finally, write the published bookmarks file
-		if (profiling) {
-			startTime = System.currentTimeMillis();
-		}
-		getSiteGenerator().writePublishedBookmarks(bookmarks, defaultView);
-		if (profiling) {
-			DebugTrace.print(getSiteGenerator(), "writePublishedBookmarks", //$NON-NLS-1$
-					(System.currentTimeMillis() - startTime) + " ms"); //$NON-NLS-1$
-			DebugTrace.print(this, "generateBookmarks", //$NON-NLS-1$
-					(System.currentTimeMillis() - beginTime) + " ms"); //$NON-NLS-1$			
-		}
-	}
-
-	/**
-	 * get the url for the published site.
-	 * 
-	 * @return String
-	 */
-	public String getPublishedUrl() {
-		if (success) {
-			String url = getSiteGenerator().getIndexFilePath();
-			File f = new File(url);
-			if (f.exists()) {
-				return url;
-			}
-		}
-
-		return null;
-	}
-
-	protected void generateBookmarkIndex(String publishDir, String title,
-			IProgressMonitor monitor) {
-		try {
-
-			URL url = new URL(PublishingPlugin.getDefault().getInstallURL(),
-					KEYWORD_DEF_FILE);
-			if (url == null) {
-				System.out.println("Unable to get index definition file "); //$NON-NLS-1$
-				return;
-			}
-
-			String deffile = Platform.resolve(url).getPath();
-			String charSet = "utf-8"; //$NON-NLS-1$
-			String helpFile = null;
-			KeyWordIndexHelper indexHelper = new KeyWordIndexHelper(deffile,
-					charSet, helpFile);
-			DefinitionObject defObj = indexHelper.loadDefinition(publishDir);
-			if (defObj != null) {
-				defObj.setwwwRoot(publishDir);
-				defObj.setIndexTitle(PublishingResources.indexLabel_text
-						+ " - " + title); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			indexHelper.execute(monitor);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * generate the publishing report and return the url
-	 * 
-	 * @return String the report url
-	 */
-	public String getPublishReportUrl() {
-		String publishDir = viewBuilder.getHtmlBuilder().getPublishDir();
-		String file_pathname = PublishingContentValidator.LOGS_FOLDER
-				+ File.separator + PUBLISHING_REPORT_HTML_FILE;
-		File f = new File(publishDir, file_pathname);
-		String report_file = f.getAbsolutePath();
-		if (!f.exists()) {
-			File errorLog = new File(publishDir,
-					PublishingContentValidator.LOGS_FOLDER + File.separator
-							+ PublishingContentValidator.ERROR_LOG_FILENAME);
-			File warningLog = new File(publishDir,
-					PublishingContentValidator.LOGS_FOLDER + File.separator
-							+ PublishingContentValidator.WARNING_LOG_FILENAME);
-			File infoLog = new File(publishDir,
-					PublishingContentValidator.LOGS_FOLDER + File.separator
-							+ PublishingContentValidator.INFO_LOG_FILENAME);
-
-			// geenrate the index.htm
-			XmlElement reportXml = new XmlElement("PublishingReport"); //$NON-NLS-1$
-
-			reportXml.newChild("pubDir").setAttribute("path", publishDir); //$NON-NLS-1$ //$NON-NLS-2$
-			reportXml
-					.newChild("errorLog") //$NON-NLS-1$
-					.setAttribute(
-							"name", PublishingContentValidator.ERROR_LOG_FILENAME) //$NON-NLS-1$
-					.setAttribute("path", "./" + errorLog.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-
-			reportXml
-					.newChild("warningLog") //$NON-NLS-1$
-					.setAttribute(
-							"name", PublishingContentValidator.WARNING_LOG_FILENAME) //$NON-NLS-1$
-					.setAttribute("path", "./" + warningLog.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-
-			reportXml
-					.newChild("infoLog") //$NON-NLS-1$
-					.setAttribute(
-							"name", PublishingContentValidator.INFO_LOG_FILENAME) //$NON-NLS-1$
-					.setAttribute("path", "./" + infoLog.getName()); //$NON-NLS-1$ //$NON-NLS-2$
-
-			// detail information
-			PublishingContentValidator validator = (PublishingContentValidator) viewBuilder
-					.getHtmlBuilder().getValidator();
-			reportXml.addChild(validator.getReport());
-
-			String buffer = PublishingUtil.getHtml(reportXml,
-					PUBLISHING_REPORT_XSL_FILE);
-			if (buffer != null) {
-				FileUtil.writeUTF8File(report_file, buffer.toString());
-			}
-		}
-
-		return report_file;
-	}
-
-	protected void createWARFile() throws Exception {
-		if (options != null && options.isPublishDynamicWebApp()
-				&& options.getDynamicWebAppName().length() > 0) {
-			SearchService.getInstance().createWAR(pubDir,
-					options.getDynamicWebAppName());
-		}
-	}
-
-	public void dispose() {
-		super.dispose();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishOptions.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishOptions.java
deleted file mode 100644
index a36d044..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishOptions.java
+++ /dev/null
@@ -1,306 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.util.List;
-
-import org.eclipse.epf.uma.Process;
-
-/**
- * The Publishing Options.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PublishOptions {
-
-	// The publish directory.
-	protected String publishDir;
-
-	// The list of processes to be published.
-	protected List<Process> processes;
-
-	// Publish entire method configuration option.
-	protected boolean publishConfiguration;
-
-	// Publish one or more processes option.
-	protected boolean publishProcess;
-
-	// Publish unopen activity detail diagrams option.
-	protected boolean publishUnopenADD;
-
-	// Publish activity diagram for base activties with unmodified
-	// extensions option.
-	protected boolean publishBaseAD;
-
-	// Publish light weight navigation tree option.
-	protected boolean publishLightWeightTree;
-
-	// Show method content in the descriptor pages option.
-	protected boolean showMethodContentInDescriptors;
-
-	// Show related descriptors in the task, role, and work product pages
-	// option.
-	protected boolean showRelatedDescriptors;
-
-	// Show task descriptors in the navigation tree option.
-	protected boolean showDescriptorsInNavigationTree;
-
-	// Publish empty categories option (currently not supported in the UI).
-	protected boolean publishEmptyCategories;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishOptions() {
-	}
-
-	/**
-	 * Gets the publish directory.
-	 * 
-	 * @return a directory for storing the published content
-	 */
-	public String getPublishDir() {
-		return publishDir;
-	}
-
-	/**
-	 * Sets the publish directory.
-	 * 
-	 * @param publishDir
-	 *            a directory for storing the published content
-	 */
-	public void setPublishDir(String publishDir) {
-		this.publishDir = publishDir;
-	}
-
-	/**
-	 * Gets the list of processes that will be published.
-	 * 
-	 * @return a collection of <code>Process</code>
-	 */
-	public List<Process> getProcesses() {
-		return processes;
-	}
-
-	/**
-	 * Sets the list of processes that will be published.
-	 * 
-	 * @param processes
-	 *            a collection of <code>Process</code>
-	 */
-	public void setProcesses(List<Process> processes) {
-		this.processes = processes;
-	}
-
-	/**
-	 * Gets the publish method configuration option.
-	 * 
-	 * @return <code>true</code> if the entire method configuration will be
-	 *         published
-	 */
-	public boolean isPublishConfiguration() {
-		return publishConfiguration;
-	}
-
-	/**
-	 * Sets the publish method configuration option.
-	 * 
-	 * @param publishConfiguration
-	 *            if <code>true</code>, publish the entire method
-	 *            configuration
-	 */
-	public void setPublishConfiguration(boolean publishConfiguration) {
-		this.publishConfiguration = publishConfiguration;
-	}
-
-	/**
-	 * Gets the publish process option.
-	 * 
-	 * @return <code>true</code> if the one or more processes in a method
-	 *         configuration will be published
-	 */
-	public boolean isPublishProcess() {
-		return publishProcess;
-	}
-
-	/**
-	 * Sets the publish process option.
-	 * 
-	 * @param publishProcess
-	 *            if <code>true</code>, publish one or more processes in a
-	 *            method configuration
-	 */
-	public void setPublishProcess(boolean publishProcess) {
-		this.publishProcess = publishProcess;
-	}
-
-	/**
-	 * Gets the publish unopen activity detail diagrams option.
-	 * 
-	 * @return <code>true</code> if the unopen activity detail diagrams will
-	 *         be published
-	 */
-	public boolean isPublishUnopenADD() {
-		return publishUnopenADD;
-	}
-
-	/**
-	 * Sets the publish unopen activity detail diagrams option.
-	 * 
-	 * @param publishUnopenADD
-	 *            if <code>true</code>, publish unopen activity detail
-	 *            diagrams
-	 */
-	public void setPublishUnopenADD(boolean publishUnopenADD) {
-		this.publishUnopenADD = publishUnopenADD;
-	}
-
-	/**
-	 * Gets the publish activity diagram for base activties with unmodified
-	 * extensions option.
-	 * 
-	 * @return <code>true</code> if the activity diagram for base activties
-	 *         with unmodified extensions will be published
-	 */
-	public boolean isPublishBaseAD() {
-		return publishBaseAD;
-	}
-
-	/**
-	 * Sets the publish activity diagram for base activties with unmodified
-	 * extensions option.
-	 * 
-	 * @param publishBaseAD
-	 *            if <code>true</code>, publish activity diagram for base
-	 *            activties with unmodified extensions
-	 */
-	public void setPublishBaseAD(boolean publishBaseAD) {
-		this.publishBaseAD = publishBaseAD;
-	}
-
-	/**
-	 * Gets the publish light weight navigation tree option.
-	 * 
-	 * @return <code>true</code> if a light weight navigation tree will be
-	 *         published
-	 */
-	public boolean isPublishLightWeightTree() {
-		return publishLightWeightTree;
-	}
-
-	/**
-	 * Sets the publish light weight navigation tree option.
-	 * 
-	 * @param publishLightWeightTree
-	 *            if <code>true</code>, publish a light weight navigation
-	 *            tree
-	 */
-	public void setPublishLightWeightTree(boolean publishLightWeightTree) {
-		this.publishLightWeightTree = publishLightWeightTree;
-	}
-
-	/**
-	 * Gets the show method content in descriptor pages option.
-	 * 
-	 * @return <code>true</code> if the method content will be displayed in
-	 *         the descriptor pages
-	 */
-	public boolean isShowMethodContentInDescriptors() {
-		return showMethodContentInDescriptors;
-	}
-
-	/**
-	 * Sets the show method content in descriptor pages option.
-	 * 
-	 * @param showMethodContentInDescriptors
-	 *            if <code>true</code>, display the method content in the
-	 *            descriptor pages
-	 */
-	public void setShowMethodContentInDescriptors(
-			boolean showMethodContentInDescriptors) {
-		this.showMethodContentInDescriptors = showMethodContentInDescriptors;
-	}
-
-	/**
-	 * Gets the show related descriptors in the task, role, and work product
-	 * pages option.
-	 * 
-	 * @return <code>true</code> if related descriptors will be displayed in
-	 *         the task, role, and work product pages
-	 */
-	public boolean isShowRelatedDescriptors() {
-		return showRelatedDescriptors;
-	}
-
-	/**
-	 * Sets the show related descriptors in the task, role, and work product
-	 * pages option.
-	 * 
-	 * @param showRelatedDescriptors
-	 *            if <code>true</code>, display the related descriptors in
-	 *            the task, role, and work product pages
-	 */
-	public void setShowRelatedDescriptors(boolean showRelatedDescriptors) {
-		this.showRelatedDescriptors = showRelatedDescriptors;
-	}
-
-	/**
-	 * Gets the show task descriptors in navigation tree option.
-	 * 
-	 * @return <code>true</code> if task descriptors will be displayed in the
-	 *         navigation tree
-	 */
-	public boolean isShowDescriptorsInNavigationTree() {
-		return showDescriptorsInNavigationTree;
-	}
-
-	/**
-	 * Sets the show task descriptors in navigation tree option.
-	 * 
-	 * @param showDescriptorsInTree
-	 *            if <code>true</code>, display the task descriptors in the
-	 *            navigation tree
-	 */
-	public void setShowDescriptorsInNavigationTree(
-			boolean showDescriptorsInNavigationTree) {
-		this.showDescriptorsInNavigationTree = showDescriptorsInNavigationTree;
-	}
-
-	/**
-	 * Gets the publish empty categories option.
-	 * 
-	 * @return <code>true</code> if empty categories will be published
-	 */
-	public boolean isPublishEmptyCategories() {
-		return publishEmptyCategories;
-	}
-
-	/**
-	 * Sets the publish empty categories option.
-	 * 
-	 * @param publishEmptyCategories
-	 *            if <code>true</code>, publish the empty categories
-	 */
-	public void setPublishEmptyCategories(boolean publishEmptyCategories) {
-		this.publishEmptyCategories = publishEmptyCategories;
-	}
-
-	/**
-	 * Validates the publish options.
-	 * 
-	 * @return <code>true</code> if the publish options is valid.
-	 */
-	public void validate() {
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingContentValidator.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingContentValidator.java
deleted file mode 100644
index 9e27a2e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingContentValidator.java
+++ /dev/null
@@ -1,618 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.common.utils.Timer;
-import org.eclipse.epf.library.layout.DefaultContentValidator;
-import org.eclipse.epf.library.layout.LinkInfo;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.epf.publishing.util.http.HttpResponse;
-import org.eclipse.epf.publishing.util.http.HttpUtil;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.util.Calendar;
-
-/**
- * content validator used for publishing. This class will be responsible for validating the content to be published, 
- * fixing problems such as links in the content, 
- * and logging information about missing elements, missing resources, etc.
- * 
- * @author Jinhua Xi
- * @since 1.0
- * 
- */
-public class PublishingContentValidator extends DefaultContentValidator {
-
-	private boolean debug = PublishingPlugin.getDefault().isDebugging();
-
-	//private boolean showExtraInfoForDescriptors = false;
-	//private boolean showRelatedDescriptors = false;
-	
-	protected PublishHTMLOptions options = null;
-	
-	class InvalidExternalLinkInfo {
-		public MethodElement owner;
-
-		public String url;
-
-		public String message;
-
-		public InvalidExternalLinkInfo(MethodElement owner, String url,
-				String message) {
-			this.owner = owner;
-			this.url = url;
-			this.message = message;
-		}
-	}
-
-	class MissingReference {
-		public MethodElement owner;
-
-		public MethodElement refElement;
-
-		public String guid;
-
-		public String linkedText;
-
-		public MissingReference(MethodElement owner, MethodElement refElement) {
-			this.owner = owner;
-			this.refElement = refElement;
-		}
-
-		public MissingReference(MethodElement owner, String guid,
-				String linkedText) {
-			this.owner = owner;
-			this.guid = guid;
-			this.linkedText = linkedText;
-		}
-	}
-
-	class MissingResource {
-		public MethodElement owner;
-
-		public File resourceFile;
-
-		public String url;
-
-		public MissingResource(MethodElement owner, File resourceFile,
-				String url) {
-			this.owner = owner;
-			this.resourceFile = resourceFile;
-			this.url = url;
-		}
-	}
-
-	static final String LOGS_FOLDER = "logs"; //$NON-NLS-1$
-
-	static final String ERROR_LOG_FILENAME = "error.log"; //$NON-NLS-1$
-
-	static final String WARNING_LOG_FILENAME = "warning.log"; //$NON-NLS-1$
-
-	static final String INFO_LOG_FILENAME = "info.log"; //$NON-NLS-1$
-
-	protected File logPath;
-
-	protected boolean validateExternalLinks = false;
-
-	protected List invalidExternalLinks = new ArrayList();
-
-	// cache the valided external links to avoid multiple checking
-	protected List validatedExternalLinks = new ArrayList();
-
-	protected List missingReferences = new ArrayList();
-
-	protected List missingResources = new ArrayList();
-
-	protected List discardedElements = new ArrayList();
-
-	protected List validCategories = new ArrayList();
-
-	protected long publishing_start = 0;
-
-	protected long time_for_external_link_checking = 0;
-
-	// collect the elements referenced by the published contents so we can
-	// publish them
-	// this will be the elements to be published
-	protected List referencedElements = new ArrayList();
-
-	// published elements
-	protected List publishedElements = new ArrayList();
-
-	// this is the default target element for the content validator
-	// set this before publishing the element and set to null after the
-	// publishign is done
-	protected MethodElement defaultTarget = null;
-
-	/**
-	 * consructor
-	 * 
-	 * @param pubDir String
-	 * @param validateExternalLinks boolean
-	 */
-	public PublishingContentValidator(String pubDir, PublishHTMLOptions options) {
-		super(pubDir);
-		this.options = options;
-		
-		this.validateExternalLinks = options.isCheckExternalLinks();
-
-		this.logPath = new File(pubDir, LOGS_FOLDER);
-		super.info = getStream(INFO_LOG_FILENAME);
-		super.warning = getStream(WARNING_LOG_FILENAME);
-		super.error = getStream(ERROR_LOG_FILENAME);
-
-		// set the start time
-		publishing_start = Calendar.getInstance().getTimeInMillis();
-	}
-
-	/**
-	 * dispose the object
-	 */
-	public void dispose() {
-		invalidExternalLinks.clear();
-		validatedExternalLinks.clear();
-		missingReferences.clear();
-		missingResources.clear();
-		discardedElements.clear();
-		validCategories.clear();
-
-		referencedElements.clear();
-		publishedElements.clear();
-
-		info.close();
-		warning.close();
-		error.close();
-
-	}
-
-	protected PrintStream getStream(String fileName) {
-		try {
-			File f = new File(logPath, fileName);
-			File dir = f.getParentFile();
-			dir.mkdirs();
-
-			if (!f.exists()) {
-				f.createNewFile();
-			}
-
-			return new PrintStream(new FileOutputStream(f), true);
-		} catch (Exception e) {
-
-		}
-
-		return null;
-	}
-
-	/**
-	 * validate the link attributes fro the element.
-	 * 
-	 * @param owner MethodElement the owner element
-	 * @param attributes String the attributes in the link
-	 * @param text String the text allow with the link
-	 * @param config MethodConfiguration 
-	 * 
-	 * @return LinkInfo
-	 */
-	public LinkInfo validateLink(MethodElement owner, String attributes,
-			String text, MethodConfiguration config, String tag) {
-		LinkInfo info = super.validateLink(owner, attributes, text, config, tag);
-
-		if (validateExternalLinks) {
-			
-			String url = info.getUrl();
-			if ((url != null) && ResourceHelper.isExternalLink(url)
-					&& !url.startsWith("ftp://")) //$NON-NLS-1$
-			{
-				if (!validatedExternalLinks.contains(url)) {
-					Timer t = new Timer();
-					try {
-						HttpResponse resp = HttpUtil.doGet(url, null, 6000); // timeout
-						// System.out
-						// .println(time
-						// + " mini-seconds querying Url '" + url + "', return
-						// status=" + resp.getStatus()); //$NON-NLS-1$
-						// //$NON-NLS-2$
-					} catch (java.net.UnknownHostException e) {
-						logInvalidExternalLink(owner, url, null);
-					} catch (Exception e) {
-						logInvalidExternalLink(owner, url, e.getMessage());
-					}
-
-					t.stop();
-					time_for_external_link_checking += t.getTime();
-					
-					// cache it
-					validatedExternalLinks.add(url);
-					
-					// do we need to log the info so that user know what external
-					// urls are referenced in the content?
-					logInfo(owner, NLS.bind(PublishingResources.externalUrl_msg,
-							new Object[]{new Integer(t.getTime()), url}));
-				}
-
-			}			
-		}
-		return info;
-	}
-
-	/**
-	 * log missing reference.
-	 * @param owner MethodElement
-	 * @param refElement MethodElement the missing element
-	 */
-	public void logMissingReference(MethodElement owner,
-			MethodElement refElement) {
-		super.logMissingReference(owner, refElement);
-		missingReferences.add(new MissingReference(owner, refElement));
-	}
-
-	/**
-	 * log missing reference
-	 * @param owner M<ethodElement
-	 * @param guid String the guid of the missing element
-	 * @param linkedText String the linked text. 
-	 */
-	public void logMissingReference(MethodElement owner, String guid,
-			String linkedText) {
-		super.logMissingReference(owner, guid, linkedText);
-		missingReferences.add(new MissingReference(owner, guid, linkedText));
-	}
-
-	/**
-	 * log missing resource.
-	 * 
-	 * @param owner MethodElement
-	 * @param resourceFile File
-	 * @param url String
-	 */
-	public void logMissingResource(MethodElement owner, File resourceFile,
-			String url) {
-		super.logMissingResource(owner, resourceFile, url);
-		missingResources.add(new MissingResource(owner, resourceFile, url));
-	}
-
-	/**
-	 * log invalid external link
-	 * @param owner
-	 * @param url String
-	 * @param message String
-	 */
-	public void logInvalidExternalLink(MethodElement owner, String url,
-			String message) {
-		super.logInvalidExternalLink(owner, url, message);
-		invalidExternalLinks.add(new InvalidExternalLinkInfo(owner, url,
-				message));
-	}
-
-	/**
-	 * get report about the content validation.
-	 * 
-	 * @return XmlElement
-	 */
-	public XmlElement getReport() {
-		XmlElement reportXml = new XmlElement("validatorInfo"); //$NON-NLS-1$
-
-		if (invalidExternalLinks.size() > 0) {
-			String msg = time_for_external_link_checking / 1000
-			+ " seconds validating external links"; //$NON-NLS-1$
-			System.out.println(msg);
-			logInfo(msg);
-
-			XmlElement invalidExternalLinksXml = reportXml
-					.newChild("invalidExternalLinks"); //$NON-NLS-1$
-			for (Iterator it = invalidExternalLinks.iterator(); it.hasNext();) {
-				InvalidExternalLinkInfo info = (InvalidExternalLinkInfo) it
-						.next();
-				invalidExternalLinksXml.newChild("entry") //$NON-NLS-1$
-						.setAttribute("url", info.url) //$NON-NLS-1$
-						.setAttribute(
-								"owner", (info.owner == null) ? "" : LibraryUtil.getLocalizeTypeName(info.owner)) //$NON-NLS-1$ //$NON-NLS-2$
-						.setAttribute("message", info.message); //$NON-NLS-1$
-			}
-		}
-
-		if (missingReferences.size() > 0) {
-			XmlElement invalidReferencesXml = reportXml
-					.newChild("invalidReferences"); //$NON-NLS-1$
-			XmlElement missingReferencesXml = reportXml
-					.newChild("missingReferences"); //$NON-NLS-1$
-			for (Iterator it = missingReferences.iterator(); it.hasNext();) {
-				MissingReference info = (MissingReference) it.next();
-				if (info.refElement == null) {
-					invalidReferencesXml
-							.newChild("entry") //$NON-NLS-1$
-							.setAttribute("element", info.linkedText) //$NON-NLS-1$
-							.setAttribute("guid", info.guid) //$NON-NLS-1$
-							.setAttribute(
-									"owner", (info.owner == null) ? "" : LibraryUtil.getLocalizeTypeName(info.owner)); //$NON-NLS-1$ //$NON-NLS-2$
-				} else {
-					missingReferencesXml
-							.newChild("entry") //$NON-NLS-1$
-							.setAttribute(
-									"element", (info.refElement == null ) ? "" : LibraryUtil.getLocalizeTypeName(info.refElement)) //$NON-NLS-1$ //$NON-NLS-2$
-							.setAttribute("guid", info.refElement.getGuid()) //$NON-NLS-1$
-							.setAttribute(
-									"owner", (info.owner == null) ? "" : LibraryUtil.getLocalizeTypeName(info.owner)); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-
-		if (missingResources.size() > 0) {
-			XmlElement missingResourcesXml = reportXml
-					.newChild("missingResources"); //$NON-NLS-1$
-			for (Iterator it = missingResources.iterator(); it.hasNext();) {
-				MissingResource info = (MissingResource) it.next();
-				missingResourcesXml
-						.newChild("entry") //$NON-NLS-1$
-						.setAttribute("url", info.url) //$NON-NLS-1$
-						.setAttribute(
-								"resource", (info.resourceFile == null) ? "" : info.resourceFile.getPath()) //$NON-NLS-1$ //$NON-NLS-2$
-						.setAttribute(
-								"owner", (info.owner == null) ? "" : LibraryUtil.getLocalizeTypeName(info.owner)); //$NON-NLS-1$ //$NON-NLS-2$
-
-			}
-		}
-
-		long publishing_time = (Calendar.getInstance().getTimeInMillis() - publishing_start) / 1000;
-		int minutes = (int) publishing_time / 60;
-		int seconds = (int) publishing_time - minutes * 60;
-
-		logInfo("Publishing time: " + minutes + " minutes " + seconds + " seconds"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-		return reportXml;
-	}
-
-	/**
-	 * add a category that should be published.
-	 * 
-	 * @param e ContentCategory
-	 */
-	public void addValidCategory(ContentCategory e) {
-		if (!validCategories.contains(e)) {
-			validCategories.add(e);
-		}
-	}
-
-	/**
-	 * check if the element is discarded or not discarded elements will be
-	 * treated as out side the configursation
-	 * 
-	 * @param owner
-	 *            MethodElement the owner of the element
-	 * @param feature 
-	 * 			  Object EStructuralFeature or OppositeFeature
-	 * @param e
-	 *            MethodElement the element to be checked
-	 *            
-	 * @return boolean
-	 */
-	public boolean isDiscarded(MethodElement owner, Object feature,
-			MethodElement e) {
-		if (discardedElements.contains(e)) {
-			return true;
-		}
-
-		// if the element is a ContentCategory and is not discarded
-		if (e instanceof ContentCategory) {
-			if (validCategories.contains(e)) {
-				return false;
-			}
-
-			// otherwise, check if it should be discarded or not
-			// TODO
-			// for now, discard all referenced content categories if they are
-			// not included in the publishing view.
-			// NO!!!!!!!!!!!! This will lead to a lot of broken links and
-			// missing element
-			// TOO strong limitation. Let open it for now
-			// Publishing:Overview page in published website
-			// have broken links to BM
-			// return true;
-			return false;
-		}
-		return false;
-	}
-
-	/**
-	 * add a referenced element
-	 * 
-	 * @param owner MethodElement
-	 * @param e MethodElement
-	 */
-	public void addReferencedElement(MethodElement owner, MethodElement e) {
-		if (e == null) {
-			return;
-		}
-
-		// don't add discarded elements
-		if (isDiscarded(owner, null, e)) {
-			if (debug) {
-				System.out
-						.println("Element is discarded: " + LibraryUtil.getLocalizeTypeName(e)); //$NON-NLS-1$
-			}
-			return;
-		}
-
-		if (e != null && !referencedElements.contains(e)
-				&& !publishedElements.contains(e)) {
-			referencedElements.add(e);
-			logReference(owner, e);
-		}
-	}
-
-	/**
-	 * log a refernece
-	 * 
-	 * @param owner MethodElement
-	 * @param e MethodElement
-	 */
-	public void logReference(MethodElement owner, MethodElement e) {
-		if (debug) {
-			System.out
-					.println("--- Referenece Element Added: " + LibraryUtil.getLocalizeTypeName(e)); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * remove element from referenced list
-	 * 
-	 * @param e MethodElement
-	 */
-	public void removeReferencedElement(MethodElement e) {
-		if (referencedElements.contains(e)) {
-			referencedElements.remove(e);
-			if (debug) {
-				System.out
-						.println("--- Reference Element Removed: " + LibraryUtil.getLocalizeTypeName(e)); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * get all the referenced elements
-	 * 
-	 * @return List
-	 */
-	public List getReferencedElements() {
-		return referencedElements;
-	}
-
-	/**
-	 * aet the discarded element for this publication. If an element is
-	 * discarded, it should not be published and link to it should be link to
-	 * mising element page
-	 * 
-	 * @param e
-	 *            MethodElement
-	 */
-	public void setDiscardedElement(MethodElement e) {
-
-		if (e == null) {
-			return;
-		}
-
-		if (!discardedElements.contains(e)) {
-			discardedElements.add(e);
-		}
-
-		// if th fdiscarded element is in the reference list, remove it as well
-		removeReferencedElement(e);
-	}
-
-	/**
-	 * check if an elenment is referenced or not.
-	 * 
-	 * @param e MethodElement
-	 * @return boolean
-	 */
-	public boolean isReferencedElement(MethodElement e) {
-		return (e != null) && referencedElements.contains(e);
-	}
-
-	/**
-	 * get the published elements
-	 * 
-	 * @return List
-	 */
-	public List getPublishedElements() {
-		return publishedElements;
-	}
-
-	/**
-	 * set the default target for the referenced elements
-	 * 
-	 * @param target MethodElement
-	 */
-	public void setTargetElement(MethodElement target) {
-		this.defaultTarget = target;
-	}
-
-	/**
-	 * check if there is a closure or not
-	 * 
-	 * @return boolean
-	 */
-	public boolean hasClosure() {
-		return false;
-	}
-
-	/**
-	 * check if an element is in closure or not.
-	 * 
-	 * @param e MethodElement
-	 * @return boolean
-	 */
-	public boolean inClosure(MethodElement e) {
-		return true;
-	}
-
-	/**
-	 * add elements to closure
-	 * 
-	 * @param items List
-	 */
-	public void addClosureElements(List items) {
-		// do nothing
-	}
-
-	/**
-	 * make a closure
-	 *
-	 */
-	public void makeElementClosure() {
-		// do nothing
-	}
-
-	public boolean showBrokenLinks() {
-		return !options.isConvertBrokenLinks();
-	}
-	
-	/**
-	 * get the flag on whether to show extra descriptor info. 
-	 * If true, information from linked element will be included in the descriptor page.
-	 * 
-	 * @return boolean
-	 */
-	public boolean showExtraInfoForDescriptors() {
-		return options.isShowMethodContentInDescriptors();
-	}
-
-
-	/**
-	 * show descriptors on method element page
-	 */
-	public boolean showRelatedDescriptors() {
-		return options.showRelatedDescriptors;
-	}
-	
-	/**
-	 * get the tab id for the activity layout
-	 * 
-	 * @return String
-	 */
-	public String getDefaultActivityTab() {
-		return options.getDefaultActivityTab();
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingElementRealizer.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingElementRealizer.java
deleted file mode 100644
index c5e9c97..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingElementRealizer.java
+++ /dev/null
@@ -1,98 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.library.configuration.DefaultElementRealizer;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-
-
-/**
- * Realizer for publishing.
- * Realizes the element based on the configuration and realize options.
- * 
- * @author Jinhua Xi
- * @since 1.0
- */
-public class PublishingElementRealizer extends DefaultElementRealizer {
-
-	PublishingContentValidator validator;
-	
-	/**
-	 * constructor
-	 * 
-	 * @param config MethodConfiguration
-	 * @param validator PublishingContentValidator
-	 */
-	public PublishingElementRealizer(MethodConfiguration config, PublishingContentValidator validator) {
-		super(config);
-		this.validator = validator;
-	}
-
-	/**
-	 * realize the element
-	 * 
-	 * @param element MethodElement
-	 */
-	public MethodElement realize(MethodElement element) {
-		
-		element = super.realize(element);
-		
-		if ( element == null ) {
-			return null;
-		}
-		
-		// Publishing should not generate links to unpublished categories
-		if ( validator.isDiscarded(null, null, element) ) {
-			return null;
-		}
-		
-		return element;
-	}
-	
-	/**
-	 * realize the list of feature values and returns a new list of values
-	 * The new might be a re-sorting of the original list 
-	 * or some of the values can be filtered out, depending on the detail implementation
-	 * Note: the list value passed in might be updated as well.
-	 * @param element MethodElement
-	 * @param feature EStructuralFeature
-	 * @param values List
-	 * @return List
-	 */
-	public List realize(MethodElement element, 
-			EStructuralFeature feature, List values)
-	{
-		if ( values == null || values.size() == 0 ) {
-			return values;
-		}
-		
-		List items = super.realize(element, feature, values);
-		if ( validator.hasClosure() ) {
-			int i = 0;
-			while ( i < items.size() ) {
-				MethodElement e = (MethodElement)items.get(i);
-				if ( validator.isDiscarded(null, feature, e) ) {
-					items.remove(i);
-				} else {
-					i++;
-				}
-			}
-		}
-		
-		return items;
-	}
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingRunnable.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingRunnable.java
deleted file mode 100644
index 8b0e702..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingRunnable.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-import org.eclipse.epf.common.utils.Timer;
-import org.eclipse.epf.library.layout.HtmlBuilder;
-import org.eclipse.epf.library.layout.IElementLayout;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * runnable class to monitor the html generation
- * 
- * @author Jinhua Xi
- * @since 1.2
- *
- */
-public class PublishingRunnable implements Runnable {
-
-	int timeout_limit = 600000; 
-	//PublishingContentValidator validator; 
-	HtmlBuilder htmlBuilder;
-	String html_file;
-	IElementLayout layout;
-	
-	public PublishingRunnable(HtmlBuilder htmlBuilder, int timeout) {
-		this.timeout_limit = timeout;
-		this.htmlBuilder = htmlBuilder;
-	}
-	
-	private PublishingContentValidator getValidator() {
-		return (PublishingContentValidator)htmlBuilder.getValidator();
-	}
-	
-	public void run() {
-		if ( htmlBuilder != null && this.layout != null ) {
-			this.html_file = null;
-			this.html_file = htmlBuilder.generateHtml(layout);
-		}
-	}
-	
-	public String generateHtml(IElementLayout layout) {
-		
-		this.layout = layout;
-		MethodElement element = this.layout.getElement();
-		
-		Timer timer = new Timer();
-		try {
-			// set the target element for thre content validator
-			getValidator().setTargetElement(element);
-
-			// run the publishing and check the time, if timeout, terminate it
-			Thread t = new Thread(this);
-			t.start();
-			t.join(timeout_limit);
-			if (t.isAlive()) {
-				// wait for the thread to die and log an error
-				timer.stop();
-				getValidator()
-						.logInfo(
-								element,
-								"publishing element takes " + timer.getTime() + " mini seconds already and is still not done yet ..."); //$NON-NLS-1$ //$NON-NLS-2$
-				timer.start();
-				t.join();			
-			}
-		} catch (InterruptedException e1) {
-			e1.printStackTrace();
-		} finally {
-			getValidator().setTargetElement(null);
-			getValidator().getReferencedElements().remove(element);
-
-			timer.stop();
-			getValidator().logInfo(element,
-					timer.getTotalTime() + " mini seconds publishing element"); //$NON-NLS-1$
-		}
-		
-		return this.html_file;
-		
-	}
-
-	public void dispose() {
-		this.layout = null;
-		this.html_file = null;
-		this.htmlBuilder = null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingServiceException.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingServiceException.java
deleted file mode 100644
index 1f5c0fc..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingServiceException.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services;
-
-/**
- * Signals that a Publishing Service operation has failed.
- * 
- * @author Kelvin Low
- * @since  1.0
- */
-public class PublishingServiceException extends Exception {
-	
-	private static final long serialVersionUID = -6069175188598613513L;
-
-	/**
-	 * The root cause of the exception.
-	 */
-	protected Throwable rootCause;
-	
-	/**
-	 * The error message associated with the exception.
-	 */
-	protected String errorMsg;
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public PublishingServiceException() {
-        super();
-    }
-	
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param	rootCause	The root cause of the exception.
-	 */
-	public PublishingServiceException(Throwable rootCause) {
-		this(rootCause, rootCause.getMessage());
-	}
-	
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param	errorMsg	The error message.
-	 */
-	public PublishingServiceException(String errorMsg) {
-		this(null, errorMsg);
-	}
-	
-	/**
-	 * Creates a new instance given the root cause of the exception and the error message.
-	 * 
-	 * @param	rootCause	The root cause of the exception.
-	 * @param	errorMsg	The error message.
-	 */
-	public PublishingServiceException(Throwable rootCause, String errorMsg) {
-		super(errorMsg);
-		this.rootCause = rootCause;
-		this.errorMsg = errorMsg;
-	}
-	
-	/**
-	 * Returns the root cause of the exception.
-	 * 
-	 * @return	The root cause of the exception.
-	 */
-	public Throwable getRootCause() {
-		return rootCause;
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Anchor.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Anchor.java
deleted file mode 100644
index 20b658b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Anchor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-public class Anchor
-{
-   private String text=null;
-   private String anchor=null;
-
-   Anchor(String text, String anchor)
-   {
-      this.text = text;
-      this.anchor = anchor;
-   }
-
-   String getAnchor()
-   {
-      return anchor;
-   }
-
-   String getText()
-   {
-      return text;
-   }
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Def.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Def.java
deleted file mode 100644
index 27f423c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Def.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-
-public class Def
-{
-
-    // Argument parameter
-    static String ArgumentPrefix = "-"; //$NON-NLS-1$
-    static String PrintTempFileArg = Def.ArgumentPrefix + "tf"; //$NON-NLS-1$
-    static String ResponseFileArg = Def.ArgumentPrefix + "r"; //$NON-NLS-1$
-    static String CharacterSetArg = Def.ArgumentPrefix + "c"; //$NON-NLS-1$
-    static String LanguageFileArg = Def.ArgumentPrefix + "l"; //$NON-NLS-1$
-    static String TrimArg = Def.ArgumentPrefix + "t"; //$NON-NLS-1$
-    static String TopDirArg = Def.ArgumentPrefix + "d"; //$NON-NLS-1$
-    static String ResultFileArg = Def.ArgumentPrefix + "rf"; //$NON-NLS-1$
-    static String ShowUsageArg = Def.ArgumentPrefix + "h"; //$NON-NLS-1$
-    static String FileArg = Def.ArgumentPrefix + "f"; //$NON-NLS-1$
-    static String PrintDebugArg = Def.ArgumentPrefix + "debug"; //$NON-NLS-1$
-    //KeywordindexerParam
-    static String IndexTitle = "maintitle"; //$NON-NLS-1$
-    static String SeeAlso = "seealso"; //$NON-NLS-1$
-    static String See = "see"; //$NON-NLS-1$
-    static String Delimeters = "delimeters"; //$NON-NLS-1$
-    static String CharacterSet = "characterset"; //$NON-NLS-1$
-    static String KeyWordPrefix = "prefix"; //$NON-NLS-1$
-    static String KeyWordLevelSeparator = "levelseparator"; //$NON-NLS-1$
-    static String DefaultKeyWordPrefix = "XE_"; //$NON-NLS-1$
-    static String DefaultKeyWordLevelSeparator = "__"; //$NON-NLS-1$
-    static String LeaveDir = "leaveDir"; //$NON-NLS-1$
-    static String StartDir = "startDir"; //$NON-NLS-1$
-    static String KeyWordFile = "keywordfile"; //$NON-NLS-1$
-    static String MainResultFile = "mainresultfile"; //$NON-NLS-1$
-    static String IndexResultFile = "indexresultfile"; //$NON-NLS-1$
-    static String IndexHeight = "indexheight"; //$NON-NLS-1$
-    static String KeyWordResultFile = "keywordresultfile"; //$NON-NLS-1$
-    static String KeyWordTarget = "keywordtarget"; //$NON-NLS-1$
-    static String IndexTarget = "indextarget"; //$NON-NLS-1$
-    static String MultiDocKeyWord = "mulitdocumentkeyword"; //$NON-NLS-1$
-    static String ShowDocTitle = "showdocumenttitle"; //$NON-NLS-1$
-
-    static String HeaderFile = "headerfile"; //$NON-NLS-1$
-    static String FooterFile = "footerfile"; //$NON-NLS-1$
-
-    //Sitmap parameter
-    static String TruncateLabel = "truncatelabel"; //$NON-NLS-1$
-    static String ConvertAmpersand = "convertampersand"; //$NON-NLS-1$
-    static String TableWidth = "tablewidth"; //$NON-NLS-1$
-    static int DefaultRowSpan = 1;
-    static int DefaultColSpan = 1;
-    static String Mode = "mode"; //$NON-NLS-1$
-    static String NodeStart = "<--"; //$NON-NLS-1$
-    static String NodeEnd = "-->"; //$NON-NLS-1$
-    static String NodeText = "label"; //$NON-NLS-1$
-    static String NodeLevel = "level"; //$NON-NLS-1$
-    static String ColumnWidth = "colwidth"; //$NON-NLS-1$
-    static String Column = "col"; //$NON-NLS-1$
-    static String Row = "row"; //$NON-NLS-1$
-    static String ColSpan = "colspan"; //$NON-NLS-1$
-    static String RowSpan = "rowspan"; //$NON-NLS-1$
-    static String CellColor = "cellcolor"; //$NON-NLS-1$
-    static String Links = "links"; //$NON-NLS-1$
-    static String VisitOnce = "visitonce"; //$NON-NLS-1$
-    static String OnlyThis = "onlythis"; //$NON-NLS-1$
-    static String TitleLength = "titlelength"; //$NON-NLS-1$
-    static String DefaultTitleLength = "defaulttitlelength"; //$NON-NLS-1$
-
-    static String RemoveDatFile = "removedatfile"; //$NON-NLS-1$
-    static String SynonymFile = "synonymfile"; //$NON-NLS-1$
-    static String SubTree = "includesubtree"; //$NON-NLS-1$
- //   static String DatTop = "datatop";
-    static String ResFile = "resultfile"; //$NON-NLS-1$
-    static String RelPath = "relativepath"; //$NON-NLS-1$
-    static String MaxLevels = "maxlevels"; //$NON-NLS-1$
-    static String LevelStyle = "levelstyle"; //$NON-NLS-1$
-    static String DefaultStyle = "defaultstyle"; //$NON-NLS-1$
-    static String HeadLineStyle = "headlinestyle"; //$NON-NLS-1$
-    static String LevelFont = "levelfont"; //$NON-NLS-1$
-    static String DefaultFont = "defaultfont"; //$NON-NLS-1$
-    static String HeadLineFont = "headlinefont"; //$NON-NLS-1$
-    static String Bold = "bold"; //$NON-NLS-1$
-    static String Italic = "italic"; //$NON-NLS-1$
-    static String Plain = "plain"; //$NON-NLS-1$
-
-    static String MaxOpenNodesParam = "maxvisiblenodes"; //$NON-NLS-1$
-    static int DefaultMaxOpenNodes = 100;
-    static String GarbageCollectorParam = "gc"; //$NON-NLS-1$
-    static String DefaultGarbageCollector = "10"; //$NON-NLS-1$
-    static String VerticalIncrementParam = "verticalincrement"; //$NON-NLS-1$
-    static String HorizontalIncrementParam = "horizontalincrement"; //$NON-NLS-1$
-    static String Mailto = "mailto:"; //$NON-NLS-1$
-    static String DebugParam = "debug"; //$NON-NLS-1$
-    static String WWWRootParam = "wwwroot"; //$NON-NLS-1$
-    static String ImageDir = "images"; //$NON-NLS-1$
-    static String ImageIconParam = "frameimage"; //$NON-NLS-1$
-    static String BgImageParam = "bgimage"; //$NON-NLS-1$
-    static String VisitOnceMarkAllParam ="visitoncemarkall"; //$NON-NLS-1$
-    static String ShadowParam ="mouseovershadow"; //$NON-NLS-1$
-
-    static String LoadingTreeParam = "loadinglabel"; //$NON-NLS-1$
-    static String LoadingTreeBrowser = "TreeBrowser is loading::"; //$NON-NLS-1$
-    static String LoadingTree = "Loading tree. Please wait..."; //$NON-NLS-1$
-    static String LoadingSubTree = "Loading sub tree. Please wait..."; //$NON-NLS-1$
-
-
-    static String CharactersetParam = "characterset"; //$NON-NLS-1$
-    static String DelimParam = "delimeters"; //$NON-NLS-1$
-    static String LOAD_PAGE = "loadpage"; //$NON-NLS-1$
-    static String FINISH_PAGE = "finishpage"; //$NON-NLS-1$
-    static String DataFileParam = "datafile"; //$NON-NLS-1$
-    static String DataFile = "tree.dat"; //$NON-NLS-1$
-    static String None = ""; //$NON-NLS-1$
-    static String Http = "http://"; //$NON-NLS-1$
-    static String Https = "https://"; //$NON-NLS-1$
-    static String Ftp = "ftp://"; //$NON-NLS-1$
-    static String File = "file:/"; //$NON-NLS-1$
-    static String Slash = "/"; //$NON-NLS-1$
-    static String Space = " "; //$NON-NLS-1$
-    static String ZipFile = ".zip"; //$NON-NLS-1$
-    //Color parameters
-    static String BgColorParam = "bgcolor"; //$NON-NLS-1$
-    static String BgColor = "255,255,255"; //$NON-NLS-1$
-    static String FgColorParam = "fgcolor"; //$NON-NLS-1$
-    static String FgColor = "0,0,0"; //$NON-NLS-1$
-    static String SelBgColorParam = "selbgcolor"; //$NON-NLS-1$
-    static String SelBgColor = "0,0,255"; //$NON-NLS-1$
-    static String SelFgColorParam = "selfgcolor"; //$NON-NLS-1$
-    static String SelFgColor = "255,255,255"; //$NON-NLS-1$
-    static String VisitColorParam = "visitcolor"; //$NON-NLS-1$
-    static String VisitColor = "255,51,51"; //$NON-NLS-1$
-    static String MouseOverColorParam = "mouseovercolor"; //$NON-NLS-1$
-    static String MouseOverColor = "blue"; //$NON-NLS-1$
-
-
-    //Frame parameters
-    static String LabelPosParam = "labelpos"; //$NON-NLS-1$
-    static String LabelPos = "below"; //$NON-NLS-1$
-    static String FrameTitleParam = "frametitle"; //$NON-NLS-1$
-    static String FrameTitle = "Tree Browser"; //$NON-NLS-1$
-    static String FrameWidthParam = "framewidth"; //$NON-NLS-1$
-    static String FrameHeightParam = "frameheight"; //$NON-NLS-1$
-    static String FrameWidth = "250"; //$NON-NLS-1$
-    static String FrameHeight = "400"; //$NON-NLS-1$
-    static String FrameParam = "frame"; //$NON-NLS-1$
-    static String DefaultFrame = "false"; //$NON-NLS-1$
-    static String False = "false"; //$NON-NLS-1$
-    static String True = "true"; //$NON-NLS-1$
-
-    static String LabelParam = "framelabel"; //$NON-NLS-1$
-    static String DefaultLabel = "Tree Browser"; //$NON-NLS-1$
-    static String LabelBgColorParam= "framelabelbgcolor"; //$NON-NLS-1$
-    static String DefaultLabelBgColor= "255,255,255"; //$NON-NLS-1$
-    static String BorderParam = "border"; //$NON-NLS-1$
-    static String DefaultBorder = "false"; //$NON-NLS-1$
-
-    //Tree constants
-    static String CellSizeParam = "cellsize"; //$NON-NLS-1$
-    static String DefaultCellSize = "16"; //$NON-NLS-1$
-    static int ImageInset = 3;
-    static int TextInset = 6;
-    static int TextBaseLine = 3;
-    static int DoubleClickResolution = 333;
-    static int ScrollWidth = 16;
-    static String ScrollBarLeftParam = "scrollbartoleft"; //$NON-NLS-1$
-
-
-    static String DefaultTargetParam = "target"; //$NON-NLS-1$
-    static String DefaultTarget = "_top"; //$NON-NLS-1$
-    static String TreeFontParam = "treefont"; //$NON-NLS-1$
-    static String DefaultTreeFont = "Arial,PLAIN,12"; //$NON-NLS-1$
-    static String LabelFontParam = "framelabelfont"; //$NON-NLS-1$
-    static String DefaultLabelFont = "Arial,BOLD,12"; //$NON-NLS-1$
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/DefinitionObject.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/DefinitionObject.java
deleted file mode 100644
index 687684b..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/DefinitionObject.java
+++ /dev/null
@@ -1,578 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import com.ibm.icu.util.StringTokenizer;
-
-//Object holding definitionfile information
-public class DefinitionObject
-{
-  private String indextitle = "Index - Basic Unified Process"; //$NON-NLS-1$
-  private String see = ", See "; //$NON-NLS-1$
-  private String seealso  = ", See also "; //$NON-NLS-1$
-  private String characterset = "utf-8"; //$NON-NLS-1$
-  String keyWordSeparator = "|"; //$NON-NLS-1$
-  String levelSeparatorReplace = ":"; //$NON-NLS-1$
-  String wwwRoot = null;
-  int stipLength=0;
-  String relativepath = null;
-  String target=null;
-  String specKeyWordFile=null;
-  String mainResultFile=null;
-  String indexResultFile=null;
-  String indexTarget=null;
-  String indexHeight=null;
-  String keywordTarget=null;
-  String keywordResultFile=null;
-  String headerFile=null;
-  String footerFile=null;
-  String keyWordPrefix=Def.DefaultKeyWordPrefix;
-  String keyWordLevelSeparator=Def.DefaultKeyWordLevelSeparator;
-
-  boolean multidocumentkeyword=false;
-  boolean showdocumenttitle=false;
-  Vector stopDirsV=null;
-   Hashtable fontDefinitions=null;
-  Hashtable styleDefinitions=null;
-
-  private File defFileRoot;
-
-  //Constructor that parses the definitionfile
-  DefinitionObject(String pubDir, String deffile, String charSet)
-  {
-	  setwwwRoot(pubDir);
-	  defFileRoot = new File(deffile).getParentFile();
-
-     // Read the definition file and split the deffile into it's individual lines.
-	String infile = MiscStatic.loadFile(deffile,charSet);
-    StringTokenizer parser = new StringTokenizer(infile, "\t\n"); //$NON-NLS-1$
-
-     stopDirsV = new Vector();
-     fontDefinitions = new Hashtable(10);
-     styleDefinitions = new Hashtable(10);
-     while(parser.hasMoreTokens())
-     {
-        String param = parser.nextToken().trim();
-
-        if(param.equalsIgnoreCase(Def.LevelFont))
-        {
-           asignFont(parser);
-        }
-        else if(param.equalsIgnoreCase(Def.LevelStyle))
-        {
-           asignStyle(parser);
-        }      
-        else
-        {
-           String value = parser.nextToken().trim();
-           if(value==null)
-           {
-             System.err.println("DefinitionObject:addValue\n" + //$NON-NLS-1$
-                      HelpMessages.PARAMETER_MISSING_VALUE + param);
-             return;
-           }
-           asignValue(param, value);
-        }
-     }
-
-  }
-
-  //Check if enough input is read
-  boolean enoughInput()
-  {
-     boolean enough=true;
-     StringBuffer buff = new StringBuffer();
-     buff.append("\n"); //$NON-NLS-1$
-     if(wwwRoot==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.WWWRootParam);
-        enough=false;
-     }
-
-     if(keywordResultFile==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.KeyWordResultFile);
-        enough=false;
-     }
-
-     if(indexResultFile!=null && mainResultFile==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.MainResultFile);
-        enough=false;
-     }
-
-     if(indexResultFile!=null && indexTarget==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.IndexTarget);
-        enough=false;
-     }
-
-     if(indexResultFile!=null && keywordTarget==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.KeyWordTarget);
-        enough=false;
-     }
-
-     if(indexResultFile!=null && indexHeight==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.IndexHeight);
-        enough=false;
-     }
-
-     if(relativepath==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.RelPath);
-        enough=false;
-     }
-
-     if(headerFile==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.HeaderFile);
-        enough=false;
-     }
-
-     if(footerFile==null)
-     {
-        buff.append(HelpMessages.PARAMETER_MISSING + Def.FooterFile);
-        enough=false;
-     }
-
-     FontObject f = (FontObject)fontDefinitions.get(Def.DefaultFont);
-     FontObject fs = (FontObject)styleDefinitions.get(Def.DefaultStyle);
-     if(f==null && fs==null)
-     {
-        buff.append(HelpMessages.FONT_AND_STYLE_MISSING + Def.DefaultFont + " " + Def.DefaultStyle); //$NON-NLS-1$
-        enough=false;
-     }
-     if(!enough)
-     {
-        buff.append("\n"); //$NON-NLS-1$
-        System.err.println(buff);
-     }
-     return enough;
-  }
-
-
-  //Asigns values to the different attributes
-  private void asignValue(String param, String value)
-  {
-
-    if(param.equalsIgnoreCase(Def.MainResultFile))
-    {
-       mainResultFile = value;
-    }
-    else if(param.equalsIgnoreCase(Def.CharacterSet))
-    {
-       characterset = value;
-    }
-    else if(param.equalsIgnoreCase(Def.See))
-    {
-       see = value;
-    }
-    else if(param.equalsIgnoreCase(Def.SeeAlso))
-    {
-       seealso = value;
-    }
-    else if(param.equalsIgnoreCase(Def.IndexResultFile))
-    {
-       indexResultFile = value;
-    }
-    else if(param.equalsIgnoreCase(Def.KeyWordResultFile))
-    {
-       keywordResultFile = value;
-    }
-    else if(param.equalsIgnoreCase(Def.HeaderFile))
-    {
-       headerFile = new File(defFileRoot, value).getAbsolutePath();;
-    }
-    else if(param.equalsIgnoreCase(Def.FooterFile))
-    {
-       footerFile = new File(defFileRoot, value).getAbsolutePath();;
-    }
-    else if(param.equalsIgnoreCase(Def.RelPath))
-    {
-       relativepath = value;
-    }
-    else if(param.equalsIgnoreCase(Def.DefaultTargetParam))
-    {
-       target = value;
-    }
-    else if(param.equalsIgnoreCase(Def.KeyWordFile))
-    {
-       specKeyWordFile = new File(defFileRoot, value).getAbsolutePath();
-    }
-    else if(param.equalsIgnoreCase(Def.IndexTitle))
-    {
-       indextitle = value;
-    }
-    else if(param.equalsIgnoreCase(Def.KeyWordTarget))
-    {
-       keywordTarget = value;
-    }
-    else if(param.equalsIgnoreCase(Def.IndexTarget))
-    {
-       indexTarget = value;
-    }
-    else if(param.equalsIgnoreCase(Def.IndexHeight))
-    {
-       indexHeight = value;
-    }
-    else if(param.equalsIgnoreCase(Def.MultiDocKeyWord))
-    {
-       multidocumentkeyword = value.equalsIgnoreCase(Def.True);
-    }
-    else if(param.equalsIgnoreCase(Def.ShowDocTitle))
-    {
-       showdocumenttitle = value.equalsIgnoreCase(Def.True);
-    }
-    else if(param.equalsIgnoreCase(Def.LeaveDir))
-    {
-       stopDirsV.addElement(value);
-    }
-      else if(param.equalsIgnoreCase(Def.KeyWordPrefix))
-    {
-       keyWordPrefix = value;
-    }
-    else if(param.equalsIgnoreCase(Def.KeyWordLevelSeparator))
-    {
-       keyWordLevelSeparator = value;
-    }
-    else
-    {
-
-       System.err.println(HelpMessages.INVALID_PARAMETER_NAME + param);
-    }
-
-  }
-
-  //Parses a fontdefinition
-  private void asignFont(StringTokenizer parser)
-  {
-    String stringLevel = parser.nextToken().trim();
-    Object key = stringLevel;
-    if(!stringLevel.equalsIgnoreCase(Def.DefaultFont) && !stringLevel.equalsIgnoreCase(Def.HeadLineFont))
-    {
-       key =  new Integer(stringLevel);
-    }
-    String name = parser.nextToken().trim();
-    String style = parser.nextToken().trim();
-    String size = parser.nextToken().trim();
-
-    fontDefinitions.put(key,new FontObject(name, style, size));
-  }
-
-  //Parses a styledefinition
-  private void asignStyle(StringTokenizer parser)
-  {
-    String stringLevel = parser.nextToken().trim();
-    Object key = stringLevel;
-    if(!stringLevel.equalsIgnoreCase(Def.DefaultStyle) && !stringLevel.equalsIgnoreCase(Def.HeadLineStyle))
-    {
-       key =  new Integer(stringLevel);
-    }
-
-    String style = parser.nextToken().trim();
-    styleDefinitions.put(key,new FontObject(style));
-  }
-  
-  //Check if the reached directory is whithin the stopdirlist
-    boolean isInStopdir(String str)
-   {
-      for(int i=0;i<stopDirsV.size();i++)
-      {
-         String tmpStr = (String) stopDirsV.elementAt(i);
-         if(str.substring(KeyWordIndexHelper.defObj.getWwwRoot().length()+1).compareTo(tmpStr)==0)
-         {
-            return true;
-         }
-      }
-      return false;
-  }
-
-  //Accessmethods
-  String getIndexTitle()
-  {
-    return indextitle;
-  }
-
-  String getSee()
-  {
-    return see;
-  }
-
-  String getSeeAlso()
-  {
-    return seealso;
-  }
-
-  String getCharacterSet()
-  {
-    return characterset;
-  }
-  boolean getMulitDocumentKeyword()
-  {
-    return multidocumentkeyword;
-  }
-
-  boolean getShowDocumentTitle()
-  {
-    return showdocumenttitle;
-  }
-
-  String getKeyWordTarget()
-  {
-    return keywordTarget;
-  }
-
-  String getIndexTarget()
-  {
-    return indexTarget;
-  }
-
-  String getIndexHeight()
-  {
-    return indexHeight;
-  }
-
-  String getWwwRoot()
-  {
-    return wwwRoot;
-  }
-
-  int getWwwRootLength()
-  {
-    return stipLength;
-  }
-
-  String getTarget()
-  {
-    return target;
-  }
-
-  String getKeyWordFile()
-  {
-    return specKeyWordFile;
-  }
-
-  String getMainResultFile()
-  {
-    return mainResultFile;
-  }
-
-  String getIndexResultFile()
-  {
-    return indexResultFile;
-  }
-
-  String getKeywordResultFile()
-  {
-    return keywordResultFile;
-  }
-
-
-  String getRelativePath()
-  {
-    return relativepath;
-  }
-
-  String getHeaderFile()
-  {
-    return headerFile;
-  }
-
-   String getFooterFile()
-  {
-    return footerFile;
-  }
-
- String getKeyWordPrefix()
- {
-   return keyWordPrefix;
- }
-
- String getKeyWordLevelSeparator()
- {
-   return keyWordLevelSeparator;
- }
-
- FontObject getFont(int level)
-  {
-     FontObject f = (FontObject)fontDefinitions.get(new Integer(level));
-     if(f==null)
-     {
-        f = (FontObject)fontDefinitions.get(Def.DefaultFont);
-     }
-     return f;
-  }
-
-  FontObject getFont(Object key)
-  {
-     return (FontObject)fontDefinitions.get(key);
-
-  }
-
-  FontObject getStyleSheet(int level)
-  {
-     FontObject f = (FontObject)styleDefinitions.get(new Integer(level));
-     if(f==null)
-     {
-        f = (FontObject)styleDefinitions.get(Def.DefaultStyle);
-     }
-     return f;
-  }
-
-  FontObject getStyleSheet(Object key)
-  {
-    return (FontObject)styleDefinitions.get(key);
-  }
-
-  void printStart(OutputStreamWriter outP,int level)
-  {
-    if(getStyleSheet(Def.DefaultStyle)==null)
-    {
-      FontObject f = getFont(level);
-      if(f==null)
-      {
-        f = getFont(Def.DefaultFont);
-      }
-      printStart(outP, f);
-    }
-    else
-    {
-        FontObject f = getStyleSheet(level);
-        if(f==null)
-        {
-           f = getStyleSheet(Def.DefaultStyle);
-        }
-        printStart(outP, f);
-    }
-  }
-  void printStart(OutputStreamWriter outP,FontObject f)
-  {
-
-    if(outP==null)
-    {
-        System.out.println("DefinitionObject:printStart\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-        return;
-    }
-
-
-    if(f!=null && f.getStyleSheet()==null)
-    {
-      MiscStatic.print(outP,"<FONT FACE=\"" + f.getName() + "\" SIZE=\"" + f.getSize() + "\" >\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-      if(f.isItalic())
-      {
-        MiscStatic.print(outP,"<I>"); //$NON-NLS-1$
-      }
-
-      if(f.isBold())
-      {
-        MiscStatic.print(outP,"<B>"); //$NON-NLS-1$
-      }
-    }
-    else
-    {
-        MiscStatic.print(outP, "<P CLASS=\"" + f.getStyleSheet() + "\">\n"); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-  }
-
-  void printEnd(OutputStreamWriter outP, int level)
-  {
-
-    if(outP==null)
-    {
-        System.out.println("DefinitionObject:printEnd\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-        return;
-    }
-
-    if(getStyleSheet(Def.DefaultStyle)==null)
-    {
-      FontObject f = getFont(level);
-      if(f==null)
-      {
-        f = getFont(Def.DefaultFont);
-      }
-      printEnd(outP, f);
-    }
-    else
-    {
-        printEnd(outP, null);
-    }
-  }
-
-  void printEnd(OutputStreamWriter outP, FontObject f)
-  {
-        if(outP==null)
-    {
-        System.out.println("DefinitionObject:printEnd\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-        return;
-    }
-
-    if(f!=null && f.getStyleSheet()==null)
-    {
-      if(f.isBold())
-      {
-        MiscStatic.print(outP,"</B>"); //$NON-NLS-1$
-      }
-
-      if(f.isItalic())
-      {
-        MiscStatic.print(outP,"</I>"); //$NON-NLS-1$
-      }
-      MiscStatic.print(outP,"</FONT>\n"); //$NON-NLS-1$
-    }
-    else
-    {
-        MiscStatic.print(outP,"</P>\n"); //$NON-NLS-1$
-    }
-  }
-  //---------------------------------------------------------------------------------------------
-  //
-  //	RPW 2.0 Integration -- Do not modify this code unless you know what you are doing.
-  //	  //	Because RPW calls these applications from a different location than the batch file
-  //	it is neccessary to override the defaults in the config file.
-  //
-  //	The following methods simply allow the values to be over-ridden.
-  //
-  //----------------------------------------------------------------------------------------------
-  public void setwwwRoot(String newRoot)
-  {
-      try {
-		File wwwDir = new File(newRoot);
-		wwwRoot = wwwDir.getCanonicalPath() + "/"; //$NON-NLS-1$
-		wwwRoot = wwwRoot.replace('\\' , '/');
-		stipLength = wwwRoot.length()-1;
-	} catch (IOException e) {
-		e.printStackTrace();
-	}
-  }
-
-  void setRelativePath(String newPath)
-  {
-	relativepath = newPath;
-  }
-  
-  /**
-   * set the index title
-   * 
-   * @param title String
-   */
-  public void setIndexTitle(String title)
-  {
-	  indextitle = title;
-  }  
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Document.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Document.java
deleted file mode 100644
index 05b83f6..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/Document.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.OutputStreamWriter;
-
-class Document
-{
-    //The title of the document
-    private String title=null;
-
-    //The url to the document
-    private String url=null;
-   // private Anchor anchor=null;
-
-    //The parent KeyWord
-    private KeyWord parentM=null;
-
-    Document(String title, String url)
-    {
-       this.title = title;
-       this.url =  url.replace('\\','/');
-    }
-
-    void setKeyWord(KeyWord key)
-    {
-       parentM = key;
-    }
-    String getTitle()
-    {
-       return title;
-    }
-
-    String getUrl()
-    {
-    	int first = url.indexOf("#"); //$NON-NLS-1$
-
-        if(parentM!=null && first < 0)
-        {
-           return url +="#" + parentM.getAnchor(); //$NON-NLS-1$ 
-        }
-
-		if (first > 0 && url.indexOf("#", first) > 0) //$NON-NLS-1$
-		{
-			return url.substring(0, first + url.indexOf("#", first)); //$NON-NLS-1$
-		}
-
-       return url;
-    }
-
-    void print(OutputStreamWriter outP)
-    {
-        if(outP==null)
-        {
-          System.out.println("Document.print\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-          return;
-        }
-        String totalUrl = url;
-        String tmpTitle=null;
-
-           tmpTitle  = title;
-           if(parentM!=null)
-           {
-             totalUrl+="#" + parentM.getAnchor(); //$NON-NLS-1$ 
-           }
-
-
-        if(tmpTitle==null || tmpTitle.equals("")) //$NON-NLS-1$
-        {
-          tmpTitle = "<FONT COLOR=\"#009933\">HelpMessages.TITLE_ANCHOR_MISSING</FONT>"; //$NON-NLS-1$
-        }
-
-        String target=null;
-        if(!KeyWordIndexHelper.defObj.getTarget().equals(" ")) //$NON-NLS-1$
-        {
-           target = " TARGET=\"" + KeyWordIndexHelper.defObj.getTarget() + "\" "; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        MiscStatic.print(outP, "<A HREF=\"" + totalUrl + "\" "); //$NON-NLS-1$ //$NON-NLS-2$
-        if(target!=null)
-        {
-           MiscStatic.print(outP, target);
-        }
-
-        MiscStatic.print(outP, ">" + //$NON-NLS-1$
-          tmpTitle + "</A>"); //$NON-NLS-1$
-    }
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/FontObject.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/FontObject.java
deleted file mode 100644
index 2c304ed..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/FontObject.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-
-
-class FontObject
-{
-  String name = null;
-  String style = null;
-  String size = null;
-  String styleSheet = null;
-
-  FontObject(String name, String style, String size)
-  {
-    this.name = name;
-    this.style = style;
-    this.size = size;
-  }
-
-  FontObject(String styleSheet)
-  {
-    this.styleSheet = styleSheet;
-  }
-
-  String getStyleSheet()
-  {
-    return styleSheet;
-  }
-
-  boolean isBold()
-  {
-    return style.equalsIgnoreCase(Def.Bold);
-  }
-
-  boolean isItalic()
-  {
-    return style.equalsIgnoreCase(Def.Italic);
-  }
-
-  String getSize()
-  {
-    return size;
-  }
-
-  String getName()
-  {
-    return name;
-  }
-
-  void print(StringBuffer outP)
-  {
-    if(styleSheet!=null)
-    {
-        outP.append(styleSheet);
-    }
-    else
-    {
-       outP.append(name + "\t" + style + "\t" + size); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    outP.append("\n"); //$NON-NLS-1$
-  }
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/HelpMessages.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/HelpMessages.java
deleted file mode 100644
index 6731d47..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/HelpMessages.java
+++ /dev/null
@@ -1,307 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.util.StringTokenizer;
-
-class HelpMessages
-{
-
-  static String EXCEPTION = "Exception: "; //$NON-NLS-1$
-  static String BAD_OUTPUT_STREAM = "Bad output stream!"; //$NON-NLS-1$
-  static String BAD_PARSER = "Bad parser object!"; //$NON-NLS-1$
-  static String INPUT_PARAMETER_NULL = "Input parameter is null!"; //$NON-NLS-1$
-  static String INVALID_PARAMETER_NAME = "No valid parameter named "; //$NON-NLS-1$
-  static String WRITE_EXCEPTION = "Exception writing to file "; //$NON-NLS-1$
-  static String MISSING_URL = "Missing url "; //$NON-NLS-1$
-  static String MISSING_LABEL = "Missing label "; //$NON-NLS-1$
-  static String MISSING_NODE = "Missing node "; //$NON-NLS-1$
-  static String OPEN_FILE_FAILED = "Error reading file "; //$NON-NLS-1$
-  static String WRITE_FILE = "Writes file: "; //$NON-NLS-1$
-  static String WRITE_ERROR = "Error writing file: "; //$NON-NLS-1$
-  static String PARAMETER_MISSING = "Parameter missing: "; //$NON-NLS-1$
-  static String PARAMETER_NOT_NUMBER = " have to be a number, the value is not a number "; //$NON-NLS-1$
-  static String PARAMETER_MISSING_VALUE = "Value missing for parameter "; //$NON-NLS-1$
-  static String FONT_AND_STYLE_MISSING = "Both of the following parameters are missing "; //$NON-NLS-1$
-  static String NO_DIRECTORY = " is not a readable directory!"; //$NON-NLS-1$
-  static String DIRECTORY_NOT_PARSED = "Does not parse directory "; //$NON-NLS-1$
-  static String NOT_ENOUGH_INPUT = "Not enough input, operation canceled!"; //$NON-NLS-1$
-  static String INCORRECT_HEADERFILE = "Header file probably incorrect!"; //$NON-NLS-1$
-  static String INCORRECT_FOOTERFILE = "Footer file probably incorrect!"; //$NON-NLS-1$
-  static String KEYWORD_SYNTAX_ERROR = " is not a valid key word! Have to begin with "; //$NON-NLS-1$
-  static String KEYWORD_FILE_SYNTAX_ERROR = " containing keywords contains syntax errors!"; //$NON-NLS-1$
-  static String RELATED_KEYWORD_NOT_FOUND = " reffered by the following keyword does not exist "; //$NON-NLS-1$
-  static String PARSE_DIRECTORY = "Parses directory: "; //$NON-NLS-1$
-  static String TAKE_A_WHILE = "It may take a while ..."; //$NON-NLS-1$
-  static String TITLE_ANCHOR_MISSING = "Title and/or anchor text is missing!"; //$NON-NLS-1$
-  static String MISSING_RESPONSE_FILE = "Error: Missing -r response file"; //$NON-NLS-1$
-  static String NO_OF_CHARACTERS_READ = " chars read in "; //$NON-NLS-1$
-  static String NO_OF_FILES_CHECKED = " files checked in "; //$NON-NLS-1$
-  static String SECOND = " s "; //$NON-NLS-1$
-  static String WORDS = " words"; //$NON-NLS-1$
-  static String COMPILED = "Compiled "; //$NON-NLS-1$
-  static String DOCUMENTS_CONATINING = " documents, containing "; //$NON-NLS-1$
-  static String BYTES_STORED = " bytes, stored in "; //$NON-NLS-1$
-  static String WEB_DATABASE = "Web database of "; //$NON-NLS-1$
-  static String CDROM_DATABASE = "CD-ROM database of "; //$NON-NLS-1$
-  static String BYTES =  "bytes"; //$NON-NLS-1$
-  static String BYTES_AND =  "bytes, and "; //$NON-NLS-1$
-  static String FATAL_ERROR = "Fatal Error: "; //$NON-NLS-1$
-  static String FILE_DOES_NOT_EXIST = "Error: Couldn't find file: "; //$NON-NLS-1$
-  static String MISSING_F_FILE = "Error: Missing -f filename"; //$NON-NLS-1$
-  static String CANONICAL_FILE_PATH_FAILED = "Error: couldn't create canonical filepath for "; //$NON-NLS-1$
-  static String DOCUMENT_DEPENDENCY_LIST =  "Document dependancy list for "; //$NON-NLS-1$
-  static String DATA_DEPENDENCY_LIST =  "Data dependancy list for "; //$NON-NLS-1$
-  static String EXTERNAL_LINK_LIST =  "External links list for "; //$NON-NLS-1$
-  static String MISSING_LINK_LIST =  "Missing links list for "; //$NON-NLS-1$
-  static String NOTHING_TO_DO =  "Error: nothing to do: -nb -nh -nl -nt"; //$NON-NLS-1$
-  static String INTERMEDIATE_DATA_FILE =  "Intermediate data: file://"; //$NON-NLS-1$
-  static String TOO_MANY_FILES =  "Error: Too many files for the search applet database"; //$NON-NLS-1$
-  static String ILLEGAL_NUMERIC_VALUE = "Error: Illegal numeric value -im "; //$NON-NLS-1$
-
-  static void loadHelpMessages(String fileName, String characterset)
-  {
-       String helpTexts = MiscStatic.loadFile(fileName,characterset);
-       StringTokenizer parser = new StringTokenizer(
-                       helpTexts, "\n\t"); //$NON-NLS-1$
-
-       while(parser.hasMoreTokens())
-       {
-          String param = parser.nextToken().trim();
-          String value = parser.nextToken().trim();
-          HelpMessages.addValue(param, " " + value + " "); //$NON-NLS-1$ //$NON-NLS-2$
-       }
-  }
-
-  static void addValue(String param, String value)
-  {
-
-    if(param.equalsIgnoreCase("INPUT_PARAMETER_NULL")) //$NON-NLS-1$
-    {
-      HelpMessages.INPUT_PARAMETER_NULL = value;
-    }
-    else if(param.equalsIgnoreCase("ILLEGAL_NUMERIC_VALUE")) //$NON-NLS-1$
-    {
-      HelpMessages.ILLEGAL_NUMERIC_VALUE = value;
-    }
-    else if(param.equalsIgnoreCase("EXCEPTION")) //$NON-NLS-1$
-    {
-      HelpMessages.EXCEPTION = value;
-    }
-    else if(param.equalsIgnoreCase("INTERMEDIATE_DATA_FILE")) //$NON-NLS-1$
-    {
-      HelpMessages.INTERMEDIATE_DATA_FILE = value;
-    }
-    else if(param.equalsIgnoreCase("TOO_MANY_FILES")) //$NON-NLS-1$
-    {
-      HelpMessages.TOO_MANY_FILES = value;
-    }
-    else if(param.equalsIgnoreCase("NO_OF_FILES_CHECKED")) //$NON-NLS-1$
-    {
-      HelpMessages.NO_OF_FILES_CHECKED = value;
-    }
-    else if(param.equalsIgnoreCase("NOTHING_TO_DO")) //$NON-NLS-1$
-    {
-      HelpMessages.NOTHING_TO_DO = value;
-    }
-    else if(param.equalsIgnoreCase("INTERMEDIATE_DATA_FILE")) //$NON-NLS-1$
-    {
-      HelpMessages.INTERMEDIATE_DATA_FILE = value;
-    }
-    else if(param.equalsIgnoreCase("DOCUMENT_DEPENDENCY_LIST")) //$NON-NLS-1$
-    {
-      HelpMessages.DOCUMENT_DEPENDENCY_LIST = value;
-    }
-    else if(param.equalsIgnoreCase("DATA_DEPENDENCY_LIST")) //$NON-NLS-1$
-    {
-      HelpMessages.DATA_DEPENDENCY_LIST = value;
-    }
-    else if(param.equalsIgnoreCase("EXTERNAL_LINK_LIST")) //$NON-NLS-1$
-    {
-      HelpMessages.EXTERNAL_LINK_LIST = value;
-    }
-    else if(param.equalsIgnoreCase("MISSING_LINK_LIST")) //$NON-NLS-1$
-    {
-      HelpMessages.MISSING_LINK_LIST = value;
-    }
-    else if(param.equalsIgnoreCase("WORDS")) //$NON-NLS-1$
-    {
-      HelpMessages.WORDS = value;
-    }
-    else if(param.equalsIgnoreCase("COMPILED")) //$NON-NLS-1$
-    {
-      HelpMessages.COMPILED = value;
-    }
-    else if(param.equalsIgnoreCase("DOCUMENTS_CONATINING")) //$NON-NLS-1$
-    {
-      HelpMessages.DOCUMENTS_CONATINING = value;
-    }
-    else if(param.equalsIgnoreCase("BYTES_STORED")) //$NON-NLS-1$
-    {
-      HelpMessages.BYTES_STORED = value;
-    }
-    else if(param.equalsIgnoreCase("WEB_DATABASE")) //$NON-NLS-1$
-    {
-      HelpMessages.WEB_DATABASE = value;
-    }
-    else if(param.equalsIgnoreCase("CDROM_DATABASE")) //$NON-NLS-1$
-    {
-      HelpMessages.CDROM_DATABASE = value;
-    }
-    else if(param.equalsIgnoreCase("BYTES")) //$NON-NLS-1$
-    {
-      HelpMessages.BYTES = value;
-    }
-    else if(param.equalsIgnoreCase("BYTES_AND")) //$NON-NLS-1$
-    {
-      HelpMessages.BYTES_AND = value;
-    }
-    else if(param.equalsIgnoreCase("MISSING_F_FILE")) //$NON-NLS-1$
-    {
-      HelpMessages.MISSING_F_FILE = value;
-    }
-    else if(param.equalsIgnoreCase("CANONICAL_FILE_PATH_FAILED")) //$NON-NLS-1$
-    {
-      HelpMessages.CANONICAL_FILE_PATH_FAILED = value;
-    }
-    else if(param.equalsIgnoreCase("NO_OF_CHARACTERS_READ")) //$NON-NLS-1$
-    {
-      HelpMessages.NO_OF_CHARACTERS_READ = value;
-    }
-    else if(param.equalsIgnoreCase("FILE_DOES_NOT_EXIST")) //$NON-NLS-1$
-    {
-      HelpMessages.FILE_DOES_NOT_EXIST = value;
-    }
-    else if(param.equalsIgnoreCase("FATAL_ERROR")) //$NON-NLS-1$
-    {
-      HelpMessages.FATAL_ERROR = value;
-    }
-    else if(param.equalsIgnoreCase("SECOND")) //$NON-NLS-1$
-    {
-      HelpMessages.SECOND = value;
-    }
-    else if(param.equalsIgnoreCase("BAD_PARSER")) //$NON-NLS-1$
-    {
-      HelpMessages.BAD_PARSER = value;
-    }
-     else if(param.equalsIgnoreCase("MISSING_RESPONSE_FILE")) //$NON-NLS-1$
-    {
-      HelpMessages.MISSING_RESPONSE_FILE = value;
-    }
-    else if(param.equalsIgnoreCase("TITLE_ANCHOR_MISSING")) //$NON-NLS-1$
-    {
-      HelpMessages.TITLE_ANCHOR_MISSING = value;
-    }
-    else if(param.equalsIgnoreCase("KEYWORD_FILE_SYNTAX_ERROR")) //$NON-NLS-1$
-    {
-      HelpMessages.KEYWORD_FILE_SYNTAX_ERROR = value;
-    }
-    else if(param.equalsIgnoreCase("KEYWORD_SYNTAX_ERROR")) //$NON-NLS-1$
-    {
-      HelpMessages.KEYWORD_SYNTAX_ERROR = value;
-    }
-    else if(param.equalsIgnoreCase("PARSE_DIRECTORY")) //$NON-NLS-1$
-    {
-      HelpMessages.PARSE_DIRECTORY = value;
-    }
-    else if(param.equalsIgnoreCase("TAKE_A_WHILE")) //$NON-NLS-1$
-    {
-      HelpMessages.TAKE_A_WHILE = value;
-    }
-    else if(param.equalsIgnoreCase("INCORRECT_HEADERFILE")) //$NON-NLS-1$
-    {
-      HelpMessages.INCORRECT_HEADERFILE = value;
-    }
-    else if(param.equalsIgnoreCase("RELATED_KEYWORD_NOT_FOUND")) //$NON-NLS-1$
-    {
-      HelpMessages.RELATED_KEYWORD_NOT_FOUND = value;
-    }
-    else if(param.equalsIgnoreCase("INCORRECT_FOOTERFILE")) //$NON-NLS-1$
-    {
-      HelpMessages.INCORRECT_FOOTERFILE = value;
-    }
-    else if(param.equalsIgnoreCase("NOT_ENOUGH_INPUT")) //$NON-NLS-1$
-    {
-      HelpMessages.NOT_ENOUGH_INPUT = value;
-    }
-    else if(param.equalsIgnoreCase("NO_DIRECTORY")) //$NON-NLS-1$
-    {
-      HelpMessages.NO_DIRECTORY = value;
-    }
-    else if(param.equalsIgnoreCase("DIRECTORY_NOT_PARSED")) //$NON-NLS-1$
-    {
-      HelpMessages.DIRECTORY_NOT_PARSED = value;
-    }
-    else if(param.equalsIgnoreCase("BAD_OUTPUT_STREAM")) //$NON-NLS-1$
-    {
-      HelpMessages.BAD_OUTPUT_STREAM = value;
-    }
-    else if(param.equalsIgnoreCase("WRITE_EXCEPTION")) //$NON-NLS-1$
-    {
-      HelpMessages.WRITE_EXCEPTION = value;
-    }
-    else if(param.equalsIgnoreCase("OPEN_FILE_FAILED")) //$NON-NLS-1$
-    {
-      HelpMessages.OPEN_FILE_FAILED = value;
-    }
-    else if(param.equalsIgnoreCase("WRITE_ERROR")) //$NON-NLS-1$
-    {
-      HelpMessages.WRITE_ERROR = value;
-    }
-    else if(param.equalsIgnoreCase("WRITE_FILE")) //$NON-NLS-1$
-    {
-      HelpMessages.WRITE_FILE = value;
-    }
-    else if(param.equalsIgnoreCase("MISSING_LABEL")) //$NON-NLS-1$
-    {
-      HelpMessages.MISSING_LABEL  = value;
-    }
-     else if(param.equalsIgnoreCase("MISSING_URL")) //$NON-NLS-1$
-    {
-      HelpMessages.MISSING_URL  = value;
-    }
-    else if(param.equalsIgnoreCase("MISSING_LABEL")) //$NON-NLS-1$
-    {
-      HelpMessages.MISSING_LABEL  = value;
-    }
-    else if(param.equalsIgnoreCase("MISSING_NODE")) //$NON-NLS-1$
-    {
-      HelpMessages.MISSING_NODE  = value;
-    }
-    else if(param.equalsIgnoreCase("PARAMETER_MISSING")) //$NON-NLS-1$
-    {
-      HelpMessages.PARAMETER_MISSING  = value;
-    }
-     else if(param.equalsIgnoreCase("PARAMETER_MISSING_VALUE")) //$NON-NLS-1$
-    {
-      HelpMessages.PARAMETER_MISSING_VALUE  = value;
-    }
-    else if(param.equalsIgnoreCase("FONT_AND_STYLE_MISSING")) //$NON-NLS-1$
-    {
-      HelpMessages.FONT_AND_STYLE_MISSING  = value;
-    }
-     else if(param.equalsIgnoreCase("PARAMETER_NOT_NUMBER")) //$NON-NLS-1$
-    {
-      HelpMessages.PARAMETER_NOT_NUMBER  = value;
-    }
-    else if(param.equalsIgnoreCase("INVALID_PARAMETER_NAME")) //$NON-NLS-1$
-    {
-      HelpMessages.INVALID_PARAMETER_NAME  = value;
-    }
-    else
-    {
-      System.out.println("Unknown parameter " + param); //$NON-NLS-1$
-    }
-  }
-}
-
-
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/IO.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/IO.java
deleted file mode 100644
index 00e7022..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/IO.java
+++ /dev/null
@@ -1,203 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.util.NoSuchElementException;
-
-import com.ibm.icu.util.StringTokenizer;
-
-/*********************************************************************
-*  Class with only class methods that simplifies some communications
-*  with a www-server and also output to the Java Console Window.
-*
-*  Due to security limitations, the only www-server reachable,
-*  is the server from which the current applet is loaded from.
-*
-*  This class uses the ErrorWindow class for showing error messages.
-*
-* @see ruptools.io.ErrorWindow
-*
-* @version 1.0
-* @author Rational Software
-*********************************************************************/
-class IO
-{
-   private static boolean debugOn=false;
-
-   /**
-   *  Class method that returns a set of string delimiters that can be
-   *  used when tokenizing a text string.
-   *
-   */
-   static String getDelim()
-   {
-      return new String("*"); //$NON-NLS-1$
-   }
-
-   /**
-   *  Class method that controls if debug info shall be showed or not
-   *  in the Java Console Window.
-   *
-   * @param isOn If <b>true</b> then debug info will be showed.
-   *
-   */
-   static void debug(boolean isOn)
-   {
-        debugOn = isOn;
-   }
-
-
-   /**
-   *  Print Error messages in the Java Console Window
-   *
-   * @param str String to print
-   *
-   */
-   static void printError( String str )
-   {
-        System.out.println( "Error:" + str ); //$NON-NLS-1$
-   }
-
-   /**
-   *  Print Debug messages in the Java Console Window if the debug flag
-   *  is set (setDebug method)
-   *
-   * @param str String to print
-   *
-   */
-   static void printDebug( String str )
-   {
-        if (debugOn)
-             System.out.println( "Debug:" + str ); //$NON-NLS-1$
-   }
-
-   static Color getColor(String sPBG)
-   {
-         // Check if a pre-defined color is specified.
-      sPBG = sPBG.trim();
-      if (sPBG.equalsIgnoreCase("black")) //$NON-NLS-1$
-        return(Color.black);
-      if (sPBG.equalsIgnoreCase("blue")) //$NON-NLS-1$
-        return(Color.blue);
-      if (sPBG.equalsIgnoreCase("cyan")) //$NON-NLS-1$
-        return(Color.cyan);
-      if (sPBG.equalsIgnoreCase("darkGray")) //$NON-NLS-1$
-        return(Color.darkGray);
-      if (sPBG.equalsIgnoreCase("gray")) //$NON-NLS-1$
-        return(Color.gray);
-      if (sPBG.equalsIgnoreCase("green")) //$NON-NLS-1$
-        return(Color.green);
-      if (sPBG.equalsIgnoreCase("lightGray")) //$NON-NLS-1$
-        return(Color.lightGray);
-      if (sPBG.equalsIgnoreCase("magenta")) //$NON-NLS-1$
-        return(Color.magenta);
-      if (sPBG.equalsIgnoreCase("orange")) //$NON-NLS-1$
-        return(Color.orange);
-      if (sPBG.equalsIgnoreCase("pink")) //$NON-NLS-1$
-        return(Color.pink);
-      if (sPBG.equalsIgnoreCase("red")) //$NON-NLS-1$
-        return(Color.red);
-      if (sPBG.equalsIgnoreCase("white")) //$NON-NLS-1$
-        return(Color.white);
-      if (sPBG.equalsIgnoreCase("yellow")) //$NON-NLS-1$
-        return(Color.yellow);
-      else
-      {
-       // If the color is specified in HTML format, build it from the red, green and blue values
-      int iRed = 255;
-      int iBlue = 255;
-      int iGreen = 255;
-      if (sPBG.length() == 7 && sPBG.charAt(0) == '#')
-      {
-        iRed = Integer.parseInt(sPBG.substring(1,3),16);
-        iGreen = Integer.parseInt(sPBG.substring(5,7),16);
-        iBlue = Integer.parseInt(sPBG.substring(3,5),16);
-        return(new Color(iRed, iGreen, iBlue));
-      }
-
-        StringTokenizer parser = new StringTokenizer(sPBG, ","); //$NON-NLS-1$
-        try
-        {
-            String sRed = parser.nextToken();
-            String sGreen = parser.nextToken();
-            String sBlue = parser.nextToken();
-            iRed = Integer.parseInt(sRed.trim());
-            iGreen = Integer.parseInt(sGreen.trim());
-            iBlue = Integer.parseInt(sBlue.trim());
-            return new Color(iRed, iGreen, iBlue);
-
-        }
-        catch (NoSuchElementException e1)
-        {
-            System.out.println("IO.getColor\nException 1:" + e1.toString() + sPBG); //$NON-NLS-1$
-        }
-        catch (Exception e2)
-        {
-            System.out.println("IO.getColor\nException 2:" + e2.toString() + sPBG); //$NON-NLS-1$
-        }
-      }
-       return Color.black;
-    }
-
-    static Font getFont(String sPBG)
-     {
-        String font = "Arial"; //$NON-NLS-1$
-        String style = "PLAIN"; //$NON-NLS-1$
-        int size = 12;
-        int realStyle=Font.PLAIN;
-        sPBG = sPBG.trim();
-        StringTokenizer parser = new StringTokenizer(sPBG, ","); //$NON-NLS-1$
-        try
-        {
-           font = parser.nextToken();
-           font = font.trim();
-           if (font.equalsIgnoreCase("Arial")) //$NON-NLS-1$
-              font = "Arial"; //$NON-NLS-1$
-           else if (font.equalsIgnoreCase("Courier")) //$NON-NLS-1$
-              font = "Courier"; //$NON-NLS-1$
-           else if (font.equalsIgnoreCase("Dialog")) //$NON-NLS-1$
-             font = "Dialog"; //$NON-NLS-1$
-           else if (font.equalsIgnoreCase("Helvetica")) //$NON-NLS-1$
-             font = "Helvetica"; //$NON-NLS-1$
-           else if (font.equalsIgnoreCase("Symbol")) //$NON-NLS-1$
-             font = "Symbol"; //$NON-NLS-1$
-           else if (font.equalsIgnoreCase("TimesRoman")) //$NON-NLS-1$
-             font = "TimesRoman"; //$NON-NLS-1$
-
-           style = parser.nextToken();
-           style = style.trim();
-           if(style.equalsIgnoreCase("ITALIC")) //$NON-NLS-1$
-           {
-             realStyle=Font.ITALIC;
-           }
-           else if(style.equalsIgnoreCase("BOLD")) //$NON-NLS-1$
-           {
-             realStyle=Font.BOLD;
-           }
-           else if(style.equalsIgnoreCase("BOLDITALIC")) //$NON-NLS-1$
-           {
-             realStyle=Font.BOLD + Font.BOLD;
-           }
-           size = new Integer(parser.nextToken().trim()).intValue();
-        }
-        catch (NoSuchElementException e1)
-        {
-            System.out.println("IO.getFont\nException 1:" + e1.toString()); //$NON-NLS-1$
-        }
-        catch (Exception e2)
-        {
-            System.out.println("IO.getFont\nException 2:" + e2.toString()); //$NON-NLS-1$
-        }
-       return new Font(font, realStyle, size);
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/JarResources.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/JarResources.java
deleted file mode 100644
index f51b210..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/JarResources.java
+++ /dev/null
@@ -1,154 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-/**
- * JarResources: JarResources maps all resources included in a
- * Zip or Jar file. Additionaly, it provides a method to extract one
- * as a blob.
- */
-final class JarResources {
-
-   // external debug flag
-   boolean debugOn=false;
-
-   // jar resource mapping tables
-   private Hashtable htJarContents=new Hashtable();
-
-   // a jar file
-   private String jarFileName;
-
-   /**
-    * creates a JarResources. It extracts all resources from a Jar
-    * into an internal hashtable, keyed by resource names.
-    * @param jarFileName a jar or zip file
-    */
-   JarResources(String jarFileName) {
-      this.jarFileName=jarFileName;
-      init();
-   }
-
-   /**
-    * Extracts a jar resource as a blob.
-    * @param name a resource name.
-    */
-   byte[] getResource(String name) {
-      return (byte[])htJarContents.get(name);
-   }
-
-   byte[] getResource()
-   {
-      Enumeration keys = htJarContents.keys();
-      return (byte[])htJarContents.get(keys.nextElement());
-   }
-
-/**
-  * initializes internal hash tables with Jar file resources.
-  */
-private void init() {
-  try {
-      // System.out.println("Processing Jar Archive " + jarFileName);
-	  DataInputStream in = null;
-      if(jarFileName.startsWith(Def.Http) || jarFileName.startsWith(Def.Https)|| jarFileName.startsWith(Def.File))
-      {
-        // System.out.println("Opening the Jar File as a URL stream");
-		in = new DataInputStream( new URL(jarFileName).openStream() );
-      }
-      else
-      {
-		// System.out.println("Opening the Jar File as a local file stream");
-        in = new DataInputStream( new FileInputStream(jarFileName));
-      }
-      // extract resources and put them into the hashtable.
-      BufferedInputStream bis=new BufferedInputStream(in);
-      ZipInputStream zis=new ZipInputStream(bis);
-      ZipEntry ze=null;
-      while ((ze=zis.getNextEntry())!=null)
-      {
-        if (ze.isDirectory()) {
-           continue;
-        }
-        if (debugOn) {
-           System.out.println(
-              "ze.getName()="+ze.getName()+","+"getSize()="+ze.getSize() //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-           );
-        }
-        int size=(int)ze.getSize();
-        // -1 means unknown size.
-		if ( size == -1 ) {
-			System.out.println("ERROR: Returned size of zip file is -1. Filename: " + ze.getName()); //$NON-NLS-1$
-		}
-
-        byte[] b=new byte[(int)size];
-        int rb=0;
-        int chunk=0;
-        while (((int)size - rb) > 0) {
-           chunk=zis.read(b,rb,(int)size - rb);
-           if (chunk==-1) {
-               break;
-           }
-           rb+=chunk;
-        }
-        // add to internal resource hashtable
-        htJarContents.put(ze.getName(),b);
-        if (debugOn) {
-           System.out.println(
-               ze.getName()+"  rb="+rb+ //$NON-NLS-1$
-               ",size="+size+ //$NON-NLS-1$
-               ",csize="+ze.getCompressedSize() //$NON-NLS-1$
-               );
-        }
-     }
-  } catch (NullPointerException e) {
-     System.out.println("done."); //$NON-NLS-1$
-  } catch (FileNotFoundException e) {
-     e.printStackTrace();
-  } catch (IOException e) {
-     e.printStackTrace();
-  }
-}
-
-   /**
-    * Dumps a zip entry into a string.
-    * @param ze a ZipEntry
-    */
-   private String dumpZipEntry(ZipEntry ze) {
-       StringBuffer sb=new StringBuffer();
-       if (ze.isDirectory()) {
-          sb.append("d "); //$NON-NLS-1$
-       } else {
-          sb.append("f "); //$NON-NLS-1$
-       }
-       if (ze.getMethod()==ZipEntry.STORED) {
-          sb.append("stored   "); //$NON-NLS-1$
-       } else {
-          sb.append("defalted "); //$NON-NLS-1$
-       }
-       sb.append(ze.getName());
-       sb.append("\t"); //$NON-NLS-1$
-       sb.append(""+ze.getSize()); //$NON-NLS-1$
-       if (ze.getMethod()==ZipEntry.DEFLATED) {
-          sb.append("/"+ze.getCompressedSize()); //$NON-NLS-1$
-       }
-       return (sb.toString());
-   }
-
-}	// End of JarResources class.
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWord.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWord.java
deleted file mode 100644
index 7d3e004..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWord.java
+++ /dev/null
@@ -1,356 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.OutputStreamWriter;
-import java.util.Vector;
-
-class KeyWord
-{
-   private String keyWord=null;
-   private Vector myKeyWords=null;
-   private Vector myDocuments=null;
-   private SpecKeyWord mySpecKeyWord=null;
-   private KeyWord parentM=null;
-   KeyWordDef def = null;
-   
-   KeyWord(KeyWordDef def)
-   {
-	   this.def = def;
-	   keyWord = def.getKey();
-   }
-
-   private KeyWord(KeyWordDef def, String keyWord, KeyWord key)
-   {
-	   this.def = def;
-	   this.keyWord = keyWord;
-	   this.parentM = key;
-	   
-   }
-
-   String getKeyWord()
-   {
-     return keyWord;
-   }
-
-   void addKeyWord(KeyWordDef def, String key, Document doc)
-   {	   
-     int index = MiscStatic.getIndex(key, KeyWordIndexHelper.defObj.levelSeparatorReplace, 0);
-     //If the bottom of the keyword is reached
-     if(index==-1)
-     {
-        addDocument(doc);
-     }
-     else
-     {
-        int index2 =  MiscStatic.getIndex(key, KeyWordIndexHelper.defObj.levelSeparatorReplace, index+1);
-        String nextKeyWord=null;
-        if(index2!=-1)
-        {
-           nextKeyWord = key.substring(index+1,index2);
-        }
-        else
-        {
-          nextKeyWord = key.substring(index+1);
-        }
-
-        KeyWord tmpKey = createKeyWord(def, nextKeyWord);
-        if(tmpKey!=null)
-        {
-          tmpKey.addKeyWord(def, key.substring(index+1), doc);
-        }
-     }
-   }
-
-   void setSpecKeyWord(String relatedKey, boolean see)
-   {
-     IO.printDebug("setSpecKeyWord " + relatedKey); //$NON-NLS-1$
-     mySpecKeyWord = new SpecKeyWord(relatedKey, see);
-   }
-
-   void insertSpecKeyWord(String specKeyWordString, String relatedKeyWord)
-   {
-
-      boolean found=false;
-      int i=0;
-      String firstKeyWord = specKeyWordString;
-      int pos = specKeyWordString.indexOf(KeyWordIndexHelper.defObj.levelSeparatorReplace,0);
-      if(pos!=-1)
-      {
-        firstKeyWord = specKeyWordString.substring(0,pos);
-      }
-
-      while(!found && myKeyWords!=null && i<myKeyWords.size())
-      {
-         KeyWord tmpK =  (KeyWord)myKeyWords.elementAt(i);
-         if(firstKeyWord.equals(tmpK.getKeyWord()))
-         {
-
-         found=true;
-         if(pos!=-1)
-          {
-            tmpK.insertSpecKeyWord(specKeyWordString.substring(pos+1), relatedKeyWord);
-          }
-          else
-          {
-            tmpK.setSpecKeyWord(relatedKeyWord, false);
-          }
-         }
-          i++;
-      }
-      if(!found)
-      {
-         int index=-1;
-         i=0;
-         KeyWord newKeyWord2 = new KeyWord(null, firstKeyWord, this);
-         IO.printDebug("new keyword " + firstKeyWord); //$NON-NLS-1$
-         if(pos==-1)
-         {
-           newKeyWord2.setSpecKeyWord(relatedKeyWord, true);
-         }
-         else
-         {
-             newKeyWord2.insertSpecKeyWord(specKeyWordString.substring(pos+1), relatedKeyWord);
-         }
-         if(myKeyWords==null)
-         {
-            IO.printDebug("myKeyWords"); //$NON-NLS-1$
-            myKeyWords = new Vector();
-         }
-         while(index==-1 && i<myKeyWords.size())
-         {
-            KeyWord tmpK =  (KeyWord)myKeyWords.elementAt(i);
-            if(newKeyWord2.getKeyWord().toUpperCase().
-                  compareTo(tmpK.getKeyWord().toUpperCase())<0)
-            {
-                index = i;
-            }
-            else if(newKeyWord2.getKeyWord().toUpperCase().
-                  compareTo(tmpK.getKeyWord().toUpperCase())==0)
-            {
-
-                if(newKeyWord2.getKeyWord().compareTo(tmpK.getKeyWord())!=0)
-                {
-                   if(newKeyWord2.getKeyWord().compareTo(tmpK.getKeyWord())>0)
-                   {
-                     index = i;
-                   }
-                   else
-                   {
-                      index = i-1;
-                   }
-                }
-            }
-            i++;
-         }
-
-         if(index!=-1)
-         {
-              myKeyWords.insertElementAt(newKeyWord2, index);
-         }
-         else
-         {
-            myKeyWords.insertElementAt(newKeyWord2, myKeyWords.size());
-         }
-      }
-   }
-
-   private KeyWord createKeyWord(KeyWordDef def, String key)
-   {
-
-     if(myKeyWords==null)
-     {
-        myKeyWords = new Vector();
-        KeyWord newKeyWord = new KeyWord(def, key, this);
-        myKeyWords.addElement(newKeyWord);
-        return newKeyWord;
-     }
-     else
-     {
-        int index=-1;
-         int i=0;
-          KeyWord newKeyWord2 = new KeyWord(def, key, this);
-         while(index==-1 && i<myKeyWords.size())
-         {
-            KeyWord tmpK =  (KeyWord)myKeyWords.elementAt(i);
-
-
-            if(newKeyWord2.getKeyWord().toUpperCase().
-                compareTo(tmpK.getKeyWord().toUpperCase())<0)
-            {
-                  index = i;
-            }
-            else if(newKeyWord2.getKeyWord().toUpperCase().
-                compareTo(tmpK.getKeyWord().toUpperCase())==0)
-            {
-
-                if(newKeyWord2.getKeyWord().compareTo(tmpK.getKeyWord())!=0)
-                {
-                   if(newKeyWord2.getKeyWord().compareTo(tmpK.getKeyWord())<0)
-                   {
-                     index = i;
-                   }
-                   else
-                   {
-                      index = i+1;
-                   }
-                }
-                else
-                {
-                  return tmpK;
-                }
-            }
-            i++;
-         }
-
-         if(index!=-1)
-         {
-              myKeyWords.insertElementAt(newKeyWord2, index);
-              return newKeyWord2;
-         }
-         else
-         {
-            myKeyWords.insertElementAt(newKeyWord2, myKeyWords.size());
-            return newKeyWord2;
-         }
-
-     }
-   }
-
-   private void addDocument(Document doc)
-   {
-    doc.setKeyWord(this);
-      if(myDocuments==null)
-      {
-         myDocuments = new Vector();
-         myDocuments.addElement(doc);
-      }
-      else
-      {
-         int index=-1;
-         int i=0;
-         while(index==-1 && i<myDocuments.size())
-         {
-            Document tmpD =  (Document)myDocuments.elementAt(i);
-            if(doc.getTitle().compareTo(tmpD.getTitle())<0)
-            {
-                index = i;
-            }
-            i++;
-         }
-
-         if(index!=-1)
-         {
-              myDocuments.insertElementAt(doc, index);
-         }
-         else
-         {
-            myDocuments.insertElementAt(doc, myDocuments.size());
-         }
-      }
-   }
-
-   void print(OutputStreamWriter outP, int level)
-   {
-     if(outP==null)
-      {
-         System.err.println("KeyWord:print\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-         return;
-      }
-      KeyWordIndexHelper.defObj.printStart(outP,level+1);
-      if(level==0)
-      {
-        MiscStatic.print(outP, "<A NAME=\"" + keyWord+ "\"> </A>"); //$NON-NLS-1$ //$NON-NLS-2$
-      }
-      MiscStatic.printSpace(outP, level*4);
-      if(level!=0)
-      {
-        MiscStatic.printSpace(outP,2);
-      }
-      if(myDocuments!=null)
-      {
-        if(!KeyWordIndexHelper.defObj.getShowDocumentTitle() && !KeyWordIndexHelper.defObj.getMulitDocumentKeyword())
-        {
-          Document tmpD = (Document)  myDocuments.elementAt(0);
-          tmpD.setKeyWord(this);
-          MiscStatic.print(outP, "<A HREF=\"" + tmpD.getUrl() + "\" TARGET=\"" //$NON-NLS-1$ //$NON-NLS-2$
-          + KeyWordIndexHelper.defObj.getTarget() +"\">" + keyWord + "</A>"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        }
-        else if(!KeyWordIndexHelper.defObj.getMulitDocumentKeyword())
-        {
-           MiscStatic.print(outP, keyWord);
-           Document tmpD = (Document)  myDocuments.elementAt(0);
-           tmpD.setKeyWord(this);
-           tmpD.print(outP);
-        }
-        else
-        {
-         MiscStatic.print(outP, keyWord);
-         MiscStatic.printSpace(outP, 1);
-
-         for(int i=0;i<myDocuments.size();i++)
-         {
-            Document tmpD = (Document)  myDocuments.elementAt(i);
-             tmpD.setKeyWord(this);
-            tmpD.print(outP);
-            if(i!=myDocuments.size()-1)
-            {
-              MiscStatic.print(outP, ", "); //$NON-NLS-1$
-            }
-            MiscStatic.print(outP, "\n"); //$NON-NLS-1$
-         }
-        }
-      }
-      else
-      {
-         MiscStatic.print(outP, keyWord);
-      }
-      if(mySpecKeyWord!=null)
-      {
-        mySpecKeyWord.print(outP);
-      }
-
-      if(KeyWordIndexHelper.defObj.getStyleSheet(Def.DefaultStyle)==null)
-      {
-        MiscStatic.print(outP, "<BR>"); //$NON-NLS-1$
-      }
-      KeyWordIndexHelper.defObj.printEnd(outP,level+1);
-      if(myKeyWords!=null)
-      {
-
-         int tmpL = level+1;
-         for(int i=0;i<myKeyWords.size();i++)
-         {
-            KeyWord tmpK = (KeyWord)  myKeyWords.elementAt(i);
-            tmpK.print(outP, tmpL);
-         }
-      }
-
-   }
-
-   String getAnchor()
-   {
-	   if ( this.def != null)
-      {
-         return this.def.getAnchor();
-      }
-	   
-      if(parentM!=null)
-      {
-         return parentM.getAnchor();
-      }
-       
-      return ""; //$NON-NLS-1$
-   }
-   
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordDef.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordDef.java
deleted file mode 100644
index e8d50bc..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordDef.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-/**
- * this class defines a key word
- *
- * @author Jinhua Xi
- * @since  1.0
- */
-class KeyWordDef {
-
-	private String anchor;
-	private String key;
-	private String text;
-
-	private String keyWordString;
-
-	KeyWordDef(String anchor)
-	{
-		this(anchor, null, null);
-	}
-
-	KeyWordDef(String anchor, String key, String text)
-	{
-		this.anchor = anchor;
-		this.key = key;
-		this.text = text;
-		
-		if ( this.text == null )
-		{
-			this.text = ""; //$NON-NLS-1$
-		}
-
-		this.keyWordString = KeyWordStatic.convertKeyWord(this.anchor, this.key, this.text);
-		if ( this.key == null || this.key.equals("") ) //$NON-NLS-1$
-		{
-			int index = this.keyWordString.indexOf(KeyWordIndexHelper.defObj.levelSeparatorReplace);
-			if ( index < 0 )
-			{
-				this.key = this.keyWordString;
-			}
-			else
-			{
-				this.key = this.keyWordString.substring(0, index);
-			}
-		}
-	}
-	
-	String getAnchor()
-	{
-		return anchor;
-	}
-	
-	String getKey()
-	{
-		return key;
-	}
-	
-	public String toString()
-	{
-		return keyWordString;
-	}
-
-
-
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordFile.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordFile.java
deleted file mode 100644
index 356ad59..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordFile.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.util.List;
-
-//Represents a html file that contains keywords
-class KeyWordFile
-{
-    private String title=null;
-    private String url=null;
-
-    private int nextKeyWord=0;
-    private List keyWordVector=null;
-	//-------------------------------------------------------------------------------------------------------
-	// Constructor.
-    KeyWordFile(String title, String url, List keyWords) // list of KeyWordDef object
-    {
-       this.title = title;
-       this.url = url;
-       this.keyWordVector =  keyWords;
-    }
-    	//------------------------------------------------------------------------------------------------------
-    KeyWordDef getNextKeyWord()
-    {
-       if(nextKeyWord<keyWordVector.size())
-       {
-    	   KeyWordDef next = (KeyWordDef)keyWordVector.get(nextKeyWord);
-        nextKeyWord++;
-        if(next!=null)
-        {
-          return next;
-        }
-        else
-        {
-           return null;
-        }
-       }
-       return null;
-    }
-    	//------------------------------------------------------------------------------------------------------
-    Document getDocument(String keyWord, int noOfDoc)
-    {
-
-        if(noOfDoc>1)
-        {
-           return null;
-        }
-
-        return new Document(title, url);
-    }
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordHolder.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordHolder.java
deleted file mode 100644
index cd3c24f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordHolder.java
+++ /dev/null
@@ -1,453 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.util.Locale;
-import java.util.Vector;
-
-import com.ibm.icu.util.StringTokenizer;
-
-class KeyWordHolder {
-	private static final String lang = Locale.getDefault().getLanguage();
-
-	private Vector keyWordFiles = null;
-
-	private Vector keyWords = null;
-
-	KeyWordHolder() {
-		keyWordFiles = new Vector();
-	}
-
-	void add(KeyWordFile key) {
-		keyWordFiles.addElement(key);
-	}
-
-	void divide() {
-		if (keyWordFiles != null) {
-			for (int i = 0; i < keyWordFiles.size(); i++) {
-				String nextKeyWord = ""; //$NON-NLS-1$
-				KeyWordFile tmp = (KeyWordFile) keyWordFiles.elementAt(i);
-				while (nextKeyWord != null) {
-					nextKeyWord = null;
-					KeyWordDef def = tmp.getNextKeyWord();
-					if (def != null) {
-						nextKeyWord = def.toString();
-					}
-
-					if (nextKeyWord != null) {
-
-						int noOfDoc = 1;
-						Document tmpD = tmp.getDocument(nextKeyWord, noOfDoc);
-
-						while (tmpD != null) {
-							int index = MiscStatic
-									.getIndex(
-											nextKeyWord,
-											KeyWordIndexHelper.defObj.levelSeparatorReplace,
-											0);
-							if (index == -1) {
-								index = nextKeyWord.length();
-							}
-
-							KeyWord tmpK = createKeyWord(def);
-							if (tmpK != null && tmpD != null) {
-								tmpK.addKeyWord(def, nextKeyWord, tmpD);
-							}
-
-							noOfDoc++;
-							tmpD = tmp.getDocument(nextKeyWord, noOfDoc);
-
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private KeyWord createKeyWord(KeyWordDef def) {
-
-		if (keyWords == null) {
-			keyWords = new Vector();
-			KeyWord newKeyWord = new KeyWord(def);
-			keyWords.addElement(newKeyWord);
-			return newKeyWord;
-		} else {
-			int index = -1;
-			int i = 0;
-			KeyWord newKeyWord2 = new KeyWord(def);
-			String str2 = newKeyWord2.getKeyWord();
-
-			while (index == -1 && i < keyWords.size()) {
-				KeyWord tmpK = (KeyWord) keyWords.elementAt(i);
-				String str = tmpK.getKeyWord();
-				int cmp = str2.toUpperCase().compareTo(str.toUpperCase());
-				if (cmp < 0) {
-					index = i;
-				} else if (cmp == 0) {
-					int cmp2 = str2.compareTo(str);
-					if (cmp2 != 0) {
-						
-						// this is wrong, will put the entry to the previous item
-//						if (cmp2 > 0) {
-//							index = i;
-//						} else {
-//							index = i - 1;
-//						}
-						if (cmp2 < 0) {
-							index = i;
-						}
-					} else {
-						return tmpK;
-					}
-				}
-				i++;
-			}
-
-			if (index == -1) {
-				index = keyWords.size();
-			}
-			keyWords.insertElementAt(newKeyWord2, index);
-			
-			return newKeyWord2;
-
-		}
-	}
-
-	void readSpecKeyWords(StringTokenizer parser) {
-		while (parser.hasMoreTokens()) {
-			String specKeyWordString = parser.nextToken().trim();
-			String relatedKeyWord = parser.nextToken().trim();
-			KeyWordDef specKeyDef = new KeyWordDef(specKeyWordString);
-			KeyWordDef relatedKeyDef = new KeyWordDef(relatedKeyWord);
-
-			specKeyWordString = specKeyDef.toString();
-			relatedKeyWord = relatedKeyWord.toString();
-
-			if (specKeyWordString != null && relatedKeyWord != null
-					&& relatedKeyWordExists(specKeyWordString, relatedKeyWord)) {
-				boolean found = false;
-				int i = 0;
-				String firstKeyWord = specKeyWordString;
-				int pos = specKeyWordString.indexOf(
-						KeyWordIndexHelper.defObj.levelSeparatorReplace, 0);
-				if (pos != -1) {
-					firstKeyWord = specKeyWordString.substring(0, pos);
-				}
-				IO.printDebug("firstKeyWord " + firstKeyWord); //$NON-NLS-1$
-				while (!found && i < keyWords.size()) {
-					IO.printDebug("holder in first while " + i); //$NON-NLS-1$
-					KeyWord tmpK = (KeyWord) keyWords.elementAt(i);
-					if (firstKeyWord.equals(tmpK.getKeyWord())) {
-
-						found = true;
-						if (pos != -1) {
-							tmpK.insertSpecKeyWord(specKeyWordString
-									.substring(pos + 1), relatedKeyWord);
-						} else {
-							tmpK.setSpecKeyWord(relatedKeyWord, false);
-						}
-					}
-					i++;
-				}
-				if (!found) {
-					IO.printDebug("!found"); //$NON-NLS-1$
-					int index = -1;
-					i = 0;
-					KeyWord newKeyWord2 = new KeyWord(specKeyDef);
-					if (pos == -1) {
-						newKeyWord2.setSpecKeyWord(relatedKeyWord, true);
-					} else {
-						newKeyWord2.insertSpecKeyWord(specKeyWordString
-								.substring(pos + 1), relatedKeyWord);
-					}
-					while (index == -1 && i < keyWords.size()) {
-						IO.printDebug("holder in second while " + i); //$NON-NLS-1$
-						KeyWord tmpK = (KeyWord) keyWords.elementAt(i);
-						if (newKeyWord2.getKeyWord().toUpperCase().compareTo(
-								tmpK.getKeyWord().toUpperCase()) < 0) {
-							index = i;
-						} else if (newKeyWord2.getKeyWord().toUpperCase()
-								.compareTo(tmpK.getKeyWord().toUpperCase()) == 0) {
-
-							if (newKeyWord2.getKeyWord().compareTo(
-									tmpK.getKeyWord()) != 0) {
-								if (newKeyWord2.getKeyWord().compareTo(
-										tmpK.getKeyWord()) > 0) {
-									index = i;
-								} else {
-									index = i - 1;
-								}
-							}
-						}
-						i++;
-					}
-
-					if (index != -1) {
-						keyWords.insertElementAt(newKeyWord2, index);
-					} else {
-						keyWords.insertElementAt(newKeyWord2, keyWords.size());
-					}
-				}
-			}
-		}
-	}
-
-	private boolean relatedKeyWordExists(String specKeyWordString,
-			String relatedKeyWord) {
-		if (keyWords != null) {
-			int i = 0;
-
-			while (i < keyWords.size()) {
-				KeyWord tmpK = (KeyWord) keyWords.elementAt(i);
-				if (tmpK.getKeyWord().equals(relatedKeyWord)) {
-					return true;
-				}
-				i++;
-			}
-		}
-		System.err.println(relatedKeyWord
-				+ HelpMessages.RELATED_KEYWORD_NOT_FOUND + specKeyWordString);
-		return false;
-
-	}
-
-	void print() {
-
-		if (KeyWordIndexHelper.defObj.getIndexResultFile() != null) {
-			printFrameset();
-			printIndex();
-		}
-		printKeyWords();
-	}
-
-	// Prints the htmlfile containing the frameset
-	private void printFrameset() {
-		try {
-			File file = new File(KeyWordIndexHelper.defObj.getWwwRoot()
-					+ KeyWordIndexHelper.defObj.getMainResultFile());
-			if (!file.exists()) {
-				file.getParentFile().mkdirs();
-				file.createNewFile();
-			}
-
-			OutputStreamWriter outP;
-			if (KeyWordIndexHelper.defObj.getCharacterSet() != null) {
-				outP = new OutputStreamWriter(new FileOutputStream(file),
-						KeyWordIndexHelper.defObj.getCharacterSet());
-			} else {
-				outP = new OutputStreamWriter(new FileOutputStream(file));
-			}
-			System.out.println(HelpMessages.WRITE_FILE
-					+ KeyWordIndexHelper.defObj.getWwwRoot()
-					+ "" + KeyWordIndexHelper.defObj.getMainResultFile()); //$NON-NLS-1$
-			//MiscStatic.print(outP, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"); //$NON-NLS-1$
-			MiscStatic.print(outP, "<html lang=\"" + lang + "\" xml:lang=\"" + lang + "\">\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			MiscStatic.print(outP, "<head>\n"); //$NON-NLS-1$
-			MiscStatic
-					.print(outP,
-							"<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"); //$NON-NLS-1$          
-			MiscStatic
-					.print(
-							outP,
-							"<title>" + KeyWordIndexHelper.defObj.getIndexTitle() + "</title>\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			MiscStatic.print(outP, "</head>\n"); //$NON-NLS-1$
-			File keyWordsFile = new File(KeyWordIndexHelper.defObj.getWwwRoot()
-					+ KeyWordIndexHelper.defObj.getKeywordResultFile());
-			String keyWordPath = KeyWordIndexHelper.defObj.getRelativePath()
-					+ KeyWordIndexHelper.defObj.getKeywordResultFile();
-
-			File indxeFile = new File(KeyWordIndexHelper.defObj.getWwwRoot()
-					+ KeyWordIndexHelper.defObj.getIndexResultFile());
-			String indexPath = KeyWordIndexHelper.defObj.getRelativePath()
-					+ KeyWordIndexHelper.defObj.getIndexResultFile();
-			MiscStatic
-					.print(
-							outP,
-							"<frameset rows=\"" + KeyWordIndexHelper.defObj.getIndexHeight() + ",*\">\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			MiscStatic
-					.print(
-							outP,
-							"<frame name=\"" + KeyWordIndexHelper.defObj.getIndexTarget() //$NON-NLS-1$
-									+ "\" title=\"Navigation bar\" src=\"" + indexPath //$NON-NLS-1$
-									+ "\" marginheight=\"2\" marginwidth=\"2\" scrolling=\"auto\">\n"); //$NON-NLS-1$
-			MiscStatic
-					.print(
-							outP,
-							"<frame name=\"" + KeyWordIndexHelper.defObj.getKeyWordTarget() //$NON-NLS-1$
-									+ "\" title=\"Contents\" src=\"" + keyWordPath //$NON-NLS-1$
-									+ "\" marginheight=\"0\" marginwidth=\"2\" scrolling=\"auto\">\n"); //$NON-NLS-1$
-			MiscStatic.print(outP, "</frameset>\n"); //$NON-NLS-1$
-			MiscStatic.print(outP, "</html>"); //$NON-NLS-1$
-			outP.close();
-		} catch (Exception e) {
-			System.err
-					.println("KeyWordHolder:printFrameset\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$
-		}
-	}
-
-	// Prints the html file with the shortcuts to each anchor in the keywordfile
-	private void printIndex() {
-		try {
-
-			File file = new File(KeyWordIndexHelper.defObj.getWwwRoot()
-					+ KeyWordIndexHelper.defObj.getIndexResultFile());
-			if (!file.exists()) {
-				file.getParentFile().mkdirs();
-				file.createNewFile();
-			}
-
-			OutputStreamWriter outP;
-			if (KeyWordIndexHelper.defObj.getCharacterSet() != null) {
-				outP = new OutputStreamWriter(new FileOutputStream(file),
-						KeyWordIndexHelper.defObj.getCharacterSet());
-			} else {
-				outP = new OutputStreamWriter(new FileOutputStream(file));
-			}
-			System.out.println(HelpMessages.WRITE_FILE
-					+ KeyWordIndexHelper.defObj.getWwwRoot()
-					+ "" + KeyWordIndexHelper.defObj.getIndexResultFile()); //$NON-NLS-1$
-
-			//MiscStatic.print(outP, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"); //$NON-NLS-1$
-			MiscStatic.print(outP, "<html lang=\"" + lang + "\" xml:lang=\"" + lang + "\">\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			MiscStatic.print(outP, "<head>\n"); //$NON-NLS-1$
-			MiscStatic
-					.print(outP,
-							"<META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"); //$NON-NLS-1$          
-			MiscStatic.print(outP, "</head><BODY>\n"); //$NON-NLS-1$
-
-			String beginChar = ""; //$NON-NLS-1$
-			if (keyWords != null) {
-				File keyWordsFile = new File(KeyWordIndexHelper.defObj
-						.getWwwRoot()
-						+ KeyWordIndexHelper.defObj.getKeywordResultFile());
-				String path = KeyWordIndexHelper.defObj.getRelativePath()
-						+ KeyWordIndexHelper.defObj.getKeywordResultFile();
-
-				for (int i = 0; i < keyWords.size(); i++) {
-					KeyWord tmp = (KeyWord) keyWords.elementAt(i);
-					String firstL = tmp.getKeyWord().substring(0, 1)
-							.toUpperCase();
-
-					if (firstL.compareTo(beginChar) != 0) {
-						beginChar = firstL;
-						MiscStatic.print(outP, "<A HREF=\"" + path + "#"); //$NON-NLS-1$ //$NON-NLS-2$
-						MiscStatic.print(outP, beginChar);
-						MiscStatic
-								.print(
-										outP,
-										"\" TARGET=\"" + KeyWordIndexHelper.defObj.getKeyWordTarget() + "\">"); //$NON-NLS-1$ //$NON-NLS-2$
-						MiscStatic.print(outP, beginChar);
-						MiscStatic.print(outP, "</A>\n"); //$NON-NLS-1$
-					}
-				}
-			}
-			MiscStatic.print(outP, "</BODY></html>"); //$NON-NLS-1$
-			outP.close();
-		} catch (Exception e) {
-			System.err
-					.println("KeyWordHolder:printIndex\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$
-		}
-	}
-
-	// Prints the keywordfile
-	private void printKeyWords() {
-
-		try {
-			OutputStreamWriter outP;
-
-			File file = new File(KeyWordIndexHelper.defObj.getWwwRoot()
-					+ KeyWordIndexHelper.defObj.getKeywordResultFile());
-			if (!file.exists()) {
-				file.getParentFile().mkdirs();
-				file.createNewFile();
-			}
-
-			if (KeyWordIndexHelper.defObj.getCharacterSet() != null) {
-				outP = new OutputStreamWriter(new FileOutputStream(file),
-						KeyWordIndexHelper.defObj.getCharacterSet());
-			} else {
-				outP = new OutputStreamWriter(new FileOutputStream(file));
-			}
-			System.out.println(HelpMessages.WRITE_FILE
-					+ KeyWordIndexHelper.defObj.getWwwRoot() + "" + //$NON-NLS-1$
-					KeyWordIndexHelper.defObj.getKeywordResultFile());
-			String headerFile = MiscStatic.loadFile(KeyWordIndexHelper.defObj
-					.getHeaderFile(), KeyWordIndexHelper.defObj
-					.getCharacterSet());
-			if (headerFile.equalsIgnoreCase(Def.None)) {
-				System.err.println(HelpMessages.INCORRECT_HEADERFILE
-						+ KeyWordIndexHelper.defObj.getHeaderFile());
-			}
-			MiscStatic.print(outP, headerFile);
-
-			String beginChar = ""; //$NON-NLS-1$
-			if (keyWords != null) {
-				for (int i = 0; i < keyWords.size(); i++) {
-
-					KeyWord tmp = (KeyWord) keyWords.elementAt(i);
-					String firstL = tmp.getKeyWord().substring(0, 1)
-							.toUpperCase();
-
-					if (firstL.compareTo(beginChar) != 0) {
-						beginChar = firstL;
-						FontObject fs = KeyWordIndexHelper.defObj
-								.getStyleSheet(Def.HeadLineStyle);
-						if (fs == null) {
-							fs = KeyWordIndexHelper.defObj
-									.getStyleSheet(Def.DefaultStyle);
-						}
-						FontObject f = null;
-						FontObject fr = fs;
-						if (fs == null) {
-							f = KeyWordIndexHelper.defObj
-									.getFont(Def.HeadLineFont);
-							if (f == null) {
-								f = KeyWordIndexHelper.defObj
-										.getFont(Def.DefaultFont);
-							}
-							fr = f;
-						}
-						KeyWordIndexHelper.defObj.printStart(outP, fr);
-						if (fs == null) {
-							MiscStatic.print(outP, "<BR>"); //$NON-NLS-1$
-						}
-						MiscStatic
-								.print(
-										outP,
-										"<A NAME=\"" + beginChar + "\">" + beginChar + "</A>"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						if (fs == null) {
-							MiscStatic.print(outP, "<BR>"); //$NON-NLS-1$
-						}
-						KeyWordIndexHelper.defObj.printEnd(outP, fr);
-					}
-					tmp.print(outP, 0);
-				}
-			}
-			String footerFile = MiscStatic.loadFile(KeyWordIndexHelper.defObj
-					.getFooterFile(), KeyWordIndexHelper.defObj
-					.getCharacterSet());
-			if (footerFile.equalsIgnoreCase(Def.None)) {
-				System.err.println(HelpMessages.INCORRECT_FOOTERFILE
-						+ KeyWordIndexHelper.defObj.getFooterFile());
-			}
-			MiscStatic.print(outP, footerFile);
-			outP.close();
-		} catch (Exception e) {
-			System.err
-					.println("KeyWordHolder:printKeyWords\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$
-			e.printStackTrace();
-		}
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndex.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndex.java
deleted file mode 100644
index 0e62192..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndex.java
+++ /dev/null
@@ -1,27 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-// Debug.// import javax.swing.*;
-
-class KeyWordIndex
-{
-// private static KeyWordHolder holder = new KeyWordHolder();
-
-
-//  private static DefinitionObject defObj=null;
-//  private static String deffile = null;
-//  private static String charSet = null; 
-//  private static String helpFile = null;
-//  private static boolean showUsage = false;
-
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndexException.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndexException.java
deleted file mode 100644
index c9b4339..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndexException.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-/**
- *
- * This exception is used by all classes that are involved with the keywordindex
- *
- */
-
-
-class KeyWordIndexException extends Exception
-{
-	private String name;
-	private String reason;
-
-	//-------------------------------------------------------------------------------
-	// Class Constructor.
-	KeyWordIndexException(String exceptionName, String exceptionReason)
-	{
-		super( exceptionReason );
-		name	= exceptionName;
-		reason	= exceptionReason;
-	}
-
-	//-------------------------------------------------------------------------------
-	// Return the name of the exception.
-	String getExceptionName()
-	{
-		return name;
-	}
-
-	//-------------------------------------------------------------------------------
-	// Return the reason for the exception.
-	String getExceptionReason()
-	{
-		return reason;
-	}
-
-	public String toString() {
-
-		return name + ":" + reason; //$NON-NLS-1$
-
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndexHelper.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndexHelper.java
deleted file mode 100644
index a49b576..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordIndexHelper.java
+++ /dev/null
@@ -1,240 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.File;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import com.ibm.icu.util.StringTokenizer;
-
-public class KeyWordIndexHelper {
-	KeyWordHolder holder = new KeyWordHolder();
-
-	static DefinitionObject defObj = null;
-
-	private static String deffile = null;
-
-	private static String charSet = null;
-
-	private static String helpFile = null;
-
-	// Constructor
-	KeyWordIndexHelper() {
-
-		deffile = null;
-		// do nothing
-
-	}
-
-	/**
-	 * Constructor
-	 * @param pDeffile
-	 * @param pCharSet
-	 * @param pHelpFile
-	 */
-	public KeyWordIndexHelper(String pDeffile, String pCharSet, String pHelpFile) {
-		deffile = pDeffile;
-		charSet = pCharSet;
-		helpFile = pHelpFile;
-	}
-
-	void setDeffile(String pFile) {
-
-		deffile = pFile;
-
-	}
-
-	void setCharSet(String pCharSet) {
-
-		charSet = pCharSet;
-
-	}
-
-	void setHelpFile(String pHelpFile) {
-
-		helpFile = pHelpFile;
-
-	}
-
-	/**
-	 * load the definition object 
-	 * 
-	 * @param pubDir String
-	 * @return DefinitionObject
-	 * @throws Exception
-	 */
-	public DefinitionObject loadDefinition(String pubDir) throws Exception {
-		if (deffile == null) {
-			throw new KeyWordIndexException(
-					"KeyWordIndexHelper:execute()", StringDefinitions.ERROR_DEFINITION_FILE_NOT_FOUND); //$NON-NLS-1$
-		}
-
-		if (helpFile != null) {
-			HelpMessages.loadHelpMessages(helpFile, charSet);
-		}
-
-		defObj = new DefinitionObject(pubDir, deffile, charSet);
-
-		return defObj;
-	}
-
-	/**
-	 * execute the keyword index generation.
-	 * 
-	 * @param monitor IProgressMonitor
-	 * @throws KeyWordIndexException
-	 */
-	public void execute(IProgressMonitor monitor) throws KeyWordIndexException {
-
-		if (monitor.isCanceled()) {
-			return;
-		}
-
-		// Check if enough input in definitionfile
-		if (defObj.enoughInput()) {
-			File topDir = new File(defObj.getWwwRoot());
-
-			// The wwwRoot have to be a directory
-			if (topDir.isDirectory()) {
-				System.out.println(HelpMessages.PARSE_DIRECTORY
-						+ defObj.getWwwRoot());
-				System.out.println(HelpMessages.TAKE_A_WHILE);
-				readDir(topDir, monitor);
-			} else {
-				throw new KeyWordIndexException(
-						"KeyWordIndexHelper:execute()", //$NON-NLS-1$
-						Def.StartDir
-								+ ": " + defObj.getWwwRoot() + HelpMessages.NO_DIRECTORY); //$NON-NLS-1$
-			}
-
-			if (monitor.isCanceled()) {
-				return;
-			}
-
-			// Splits and sorts the keywords
-			holder.divide();
-
-			String specKeyWordsFile = defObj.getKeyWordFile();
-			if (specKeyWordsFile != null) {
-				// Reads the speckeywordfile
-				String specKeyWords = MiscStatic.loadFile(specKeyWordsFile,
-						defObj.getCharacterSet());
-				if (!specKeyWords.equals(Def.None)) {
-					StringTokenizer parser = new StringTokenizer(specKeyWords,
-							"\t\n"); //$NON-NLS-1$
-					holder.readSpecKeyWords(parser);
-				} else {
-					throw new KeyWordIndexException(
-							"KeyWordIndexHelper:execute()", //$NON-NLS-1$
-							specKeyWordsFile
-									+ HelpMessages.KEYWORD_FILE_SYNTAX_ERROR);
-				}
-			}
-
-			// Print the KeyWordIndexHelper
-			holder.print();
-		} else {
-			throw new KeyWordIndexException("KeyWordIndexHelper:execute()", //$NON-NLS-1$
-					HelpMessages.NOT_ENOUGH_INPUT);
-		}
-
-	}
-
-	// ------------------------------------------------------------------------------------------------------
-	// Recursively process each directory in the directory heirarchy.
-	private void readDir(File file, IProgressMonitor monitor) {
-		String files[] = file.list();
-
-		for (int i = 0; i < files.length; i++) {
-			if (monitor.isCanceled()) {
-				return;
-			}
-
-			String filePath = file.getAbsolutePath();
-
-			try {
-				filePath = file.getCanonicalPath();
-			} catch (Exception e) {
-				System.out.println("KeyWordIndexHelper:readDir\n" + //$NON-NLS-1$
-						HelpMessages.EXCEPTION + e.toString());
-			}
-			filePath = filePath.replace('\\', '/');
-			File tmp = new File(filePath + "/" + files[i]); //$NON-NLS-1$
-			
-			if (tmp.isDirectory()) {
-				// If the file is a directory
-				String tmpPath = tmp.getAbsolutePath();
-				try {
-					tmpPath = tmp.getCanonicalPath();
-				} catch (Exception e) {
-					System.out
-							.println("KeyWordIndexHelper:readDir\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$
-				}
-				// On pc the separator may be \ and not /
-				tmpPath = tmpPath.replace('\\', '/');
-				if (!defObj.isInStopdir(tmpPath)) {
-					// If not in stopdir
-					readDir(tmp, monitor);
-					if (monitor.isCanceled()) {
-						return;
-					}
-
-				} else {
-					try {
-
-						System.out.println(HelpMessages.DIRECTORY_NOT_PARSED
-								+ tmp.getCanonicalPath());
-					} catch (Exception e) {
-						System.out
-								.println("KeyWordIndexHelper:readDir\n" + HelpMessages.EXCEPTION + e.toString()); //$NON-NLS-1$
-					}
-				}
-
-			}
-			// Parse all the files which have one of the extensions we are
-			// interested in.
-			else if (files[i].endsWith(".htm") || files[i].endsWith(".html") //$NON-NLS-1$ //$NON-NLS-2$
-					|| files[i].endsWith(".shtml") || files[i].endsWith(".shtm")) //$NON-NLS-1$ //$NON-NLS-2$
-			{
-				loadFile(file.getAbsolutePath() + "/" + files[i]); //$NON-NLS-1$
-			}
-
-		}
-	}
-
-	// ------------------------------------------------------------------------------------------------------
-	// Parse each of the found files and extract the keywords from them.
-	private void loadFile(String fileName) {
-		String htmlFile = MiscStatic.loadFile(fileName, defObj
-				.getCharacterSet());
-		if (htmlFile != null && htmlFile.length() > 0) 
-		{
-			List keyWord = KeyWordStatic.getKeyWords(htmlFile);
-			if (keyWord != null && keyWord.size() > 0 ) {
-				IO.printDebug("keyword " + keyWord); //$NON-NLS-1$
-				String title = MiscStatic.getTitle(htmlFile);
-
-				// Adds a file with keywords to the holder object
-				holder.add(new KeyWordFile(title, defObj.getRelativePath()
-						+ "" + fileName.substring(defObj.getWwwRootLength()), //$NON-NLS-1$
-						keyWord));
-				
-				//System.out.println("keywords=" + keyWord.size()  + " file: " + fileName);
-			}
-			
-		}
-		
-
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordStatic.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordStatic.java
deleted file mode 100644
index 6bf78b9..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/KeyWordStatic.java
+++ /dev/null
@@ -1,131 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.epf.library.util.ResourceHelper;
-
-
-class KeyWordStatic {
-
-	// note: pattern with [^>] does not match when there are non-english
-	// characters, maybe it's a jre bug?
-	static final Pattern p_index_ref = Pattern.compile(
-			"<a\\s+?(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-	// "<a\\s+?([^>]*?(name\\s*=\\s*\"XE_|class\\s*=\\s*\"index).*?)>",
-	// Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	/**
-	 * get the key words with key and text description. There are two types of
-	 * index format: 1. old format: <a name="KEY__TEXT" ...> 2. new format: <a
-	 * class="index" name="bookmark" key="KEY" text="TEXT" ...> TEXT part is
-	 * optional
-	 */
-	static List getKeyWords(String realString) {
-		if (realString == null) {
-			System.err
-					.println("KeyWordStatic:getKeyWords\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-			return null;
-		}
-
-		List anchors = new ArrayList(2); //$NON-NLS-1$
-
-		Matcher m = p_index_ref.matcher(realString);
-		while (m.find()) {
-			String attributes = m.group(1);
-			if (attributes.length() == 0) {
-				continue;
-			}
-			
-			Map attrMap = ResourceHelper.getTagAttributes(attributes);
-			String keyWord = (String) attrMap.get(ResourceHelper.TAG_ATTR_NAME);
-			if (keyWord == null || keyWord.length() == 0) {
-				continue;
-			}
-
-			String cls = (String) attrMap.get(ResourceHelper.TAG_ATTR_CLASS);
-			String key = null;
-			String text = null;
-			if ((cls != null)
-					&& cls.equals(ResourceHelper.TAG_ATTR_VALUE_INDEX)) {
-				key = (String) attrMap.get(ResourceHelper.TAG_ATTR_KEY);
-				text = (String) attrMap.get(ResourceHelper.TAG_ATTR_TEXT);
-			}
-			// The getKeyWordPrefix() returns the tag which is used to delimit
-			// keywords.
-			// Currently this tag is XE and is defined in keywordconfig.txt
-			if ((key != null)
-					|| keyWord.startsWith(KeyWordIndexHelper.defObj
-							.getKeyWordPrefix())) {
-				anchors.add(new KeyWordDef(keyWord, key, text));
-			}
-		}
-		return anchors;
-
-	}
-
-	static String convertKeyWord(String keyWord) {
-		return convertKeyWord(keyWord, null, null);
-	}
-
-	static String convertKeyWord(String keyWord, String key, String text) {
-
-		if (keyWord == null) {
-			System.err
-					.println("KeyWordStatic:convertKeyWord\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-			return null;
-		}
-		IO.printDebug("convertKeyWord " + keyWord); // Error if we get a keyword //$NON-NLS-1$
-		// that does not contain the
-		// tag. //$NON-NLS-1$
-		if ((key != null) && (key.length() > 0)) {
-			if (text == null || text.length() == 0) {
-				return key;
-			} else {
-				return key + KeyWordIndexHelper.defObj.levelSeparatorReplace
-						+ text;
-			}
-		}
-
-		if (!keyWord.startsWith(KeyWordIndexHelper.defObj.getKeyWordPrefix())) {
-			System.out
-					.println("KeyWordStatic:convertKeyWord\n" + keyWord + HelpMessages.KEYWORD_SYNTAX_ERROR + KeyWordIndexHelper.defObj.getKeyWordPrefix()); //$NON-NLS-1$
-			return null;
-		}
-
-		// Remove the first three characters from the keyWord (namely XE_).
-		String tmpK = keyWord.substring(3);
-		String tmp = ""; //$NON-NLS-1$
-		int i = 0;
-		int pos = 0;
-		while (i != -1) {
-			// getKeyWordLevelSeparator() is hard-coded as __
-			i = tmpK.indexOf(KeyWordIndexHelper.defObj
-					.getKeyWordLevelSeparator(), pos);
-			if (i != -1) {
-				// Insert a separator between keywords, which in this case is
-				// the ":"
-				tmp += tmpK.substring(pos, i);
-				tmp += KeyWordIndexHelper.defObj.levelSeparatorReplace;
-				pos = i + 2;
-			} else {
-				tmp += tmpK.substring(pos);
-			}
-		}
-		return tmp.replace('_', ' ');
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/MiscStatic.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/MiscStatic.java
deleted file mode 100644
index 31e372d..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/MiscStatic.java
+++ /dev/null
@@ -1,660 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.util.Hashtable;
-
-import org.eclipse.epf.common.utils.FileUtil;
-
-import com.ibm.icu.util.StringTokenizer;
-
-class MiscStatic
-{
-  static Hashtable twoValueFile=null;
-  static String topDir=null;
-  static int topDirL=0;
-
-  static boolean speccharfound=false;
-  static boolean tmpspeccharfound=false;
-
-  static long diff;
-
-  //Reads a file where each row contains two values separated with \t sign
-  // The syntax of each line can be eighter
-  // value  value
-  // or
-  // "value"    "value"
-  //
-  // The syntax must be the same for each row in the file.
-  static boolean readTwoValueFile(String file, String characterSet)
-  {
-       IO.printDebug("readTwoValueFile " ); //$NON-NLS-1$
-     if(file==null)
-     {
-        System.err.println("MiscStatic:readTwoValueFile" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return false;
-     }
-       IO.printDebug("before loadfile "  + file); //$NON-NLS-1$
-     String infile = loadFile(file,characterSet);
-    IO.printDebug("after loadfile"); //$NON-NLS-1$
-      if(!infile.equals(Def.None))
-      {
-       if(infile.charAt(0)=='"')
-       {
-        StringTokenizer parser = new StringTokenizer(
-                       infile, "\n"); //$NON-NLS-1$
-
-        twoValueFile = new Hashtable();
-        while(parser.hasMoreTokens())
-        {
-
-           String line = parser.nextToken();
-           int firstFnutt = getIndex(line,"\"",0); //$NON-NLS-1$
-           int secondFnutt = getIndex(line,"\"", firstFnutt+1); //$NON-NLS-1$
-
-           int thirdFnutt = getIndex(line,"\"", secondFnutt+1); //$NON-NLS-1$
-           int forthFnutt = getIndex(line,"\"", thirdFnutt+1); //$NON-NLS-1$
-
-           if(firstFnutt==-1 || secondFnutt==-1 ||
-               thirdFnutt==-1 || forthFnutt==-1)
-           {
-              return false;
-           }
-           String def = line.substring(firstFnutt+1, secondFnutt);
-           String text = line.substring(thirdFnutt+1, forthFnutt);
-           twoValueFile.put(def,text);
-        }
-      }
-      else
-      {
-         StringTokenizer parser = new StringTokenizer(
-                       infile, "\t\n"); //$NON-NLS-1$
-
-         twoValueFile = new Hashtable();
-         while(parser.hasMoreTokens())
-         {
-            twoValueFile.put(parser.nextToken().trim(),parser.nextToken().trim());
-         }
-      }
-        return true;
-     }
-     return false;
-  }
-
-    //---------------------------------------------------------------------------------------------------
-  //Returns the text within the title tags in the input string
-  static String getTitle(String realString)
-  {
-      if(realString==null)
-      {
-        System.err.println("MiscStatic:getTitle" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return null;
-      }
-     String upperString = realString.toUpperCase();
-     int titleStart = getIndex(upperString, "TITLE",0); //$NON-NLS-1$
-     if(titleStart!=-1)
-     {
-        int titleStartEndT = getIndex(upperString, ">",titleStart); //$NON-NLS-1$
-        if(titleStartEndT!=-1)
-        {
-          int titleEnd = getIndex(upperString, "</TITLE",titleStartEndT+1); //$NON-NLS-1$
-          if(titleEnd!=-1)
-          {
-            String title = realString.substring(titleStartEndT+1,titleEnd).trim();
-            return title;
-           }
-         }
-       }
-     return null;
-  }
-
-
-  //--------------------------------------------------------------------------------------------------
-  //Return the index within the input string where the first occurance of the sting match
-  // starts. Searches from the index defined by the parameter start
-  static int getIndex(String str, String match, int start)
-  {
-     if(str==null)
-      {
-        System.err.println("MiscStatic:getIndex\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return -1;
-     }
-
-      if(match==null)
-      {
-        System.err.println("MiscStatic:getIndex\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return -1;
-     }
-     int found = str.indexOf(match.toUpperCase(), start);
-     if(found==-1)
-     {
-        found = str.indexOf(match.toLowerCase(), start);
-     }
-
-     if(found==-1)
-     {
-        found = str.indexOf(match, start);
-     }
-     return found;
-  }
-   //--------------------------------------------------------------------------------------------------
-   // Prints the a string to a DataOutputStream
-   static boolean print(OutputStreamWriter outP, String str)
-   {
-    if(outP==null)
-    {
-        System.err.println("MiscStatic:print\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-        return false;
-     }
-     if(str==null)
-     {
-        System.err.println("MiscStatic:print\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return false;
-     }
-       try
-        {
-           outP.write(str,0,str.length());
-           return true;
-        }
-        catch(Exception e)
-        {
-         System.err.println("MiscStatic:print" + HelpMessages.WRITE_EXCEPTION + //$NON-NLS-1$
-              e.toString());
-        }
-
-        return false;
-   }
-
-   // Prints the a string to a DataOutputStream in UTF format
-   static boolean printUTF(DataOutputStream outP, String str)
-   {
-    if(outP==null)
-    {
-        System.err.println("MiscStatic:printUTF\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-        return false;
-     }
-     if(str==null)
-     {
-        System.err.println("MiscStatic:printUTF\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return false;
-     }
-       try
-        {
-
-         outP.writeUTF(str);
-         return true;
-        }
-        catch(Exception e)
-        {
-         System.err.println("MiscStatic:printUTF" + HelpMessages.WRITE_EXCEPTION + //$NON-NLS-1$
-              e.toString());
-           return false;
-        }
-   }
-
-
-  static void printSpace(OutputStreamWriter outP, int noOfSpace)
-   {
-      for(int i=0;i<noOfSpace;i++)
-      {
-        try
-        {
-         outP.write("&nbsp;",0,6); //$NON-NLS-1$
-        }
-        catch(Exception e)
-        {
-           System.err.println("MiscStatic:printSpace" + HelpMessages.WRITE_EXCEPTION + //$NON-NLS-1$
-              e.toString());
-        }
-      }
-
-   }
-
-   //---------------------------------------------------------------------------------------------------
-   // Read a file and return it as a concatenated string.
-   static String loadFile(String fileName,String characterset)
-   {	  
-	   try
-	   {
-		   return FileUtil.readFile(new File(fileName), characterset).toString();   
-	   }
-	   catch (Exception ex)
-	   {
-		   ;
-	   }
-	   
-	   return ""; //$NON-NLS-1$
-	}
-
-   // Converts all letters like \ufffd,\ufffd,\ufffd to special codes
-   static void specChar(String in, String out, String characterset)
-   {
-     if(in==null)
-     {
-        System.err.println("MiscStatic:specChar\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return;
-     }
-
-     if(out==null)
-     {
-        System.err.println("MiscStatic:specChar\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        return;
-     }
-        String tmpFile = "13d84.hwr"; //$NON-NLS-1$
-        String infile = null;
-        String tmpInfile = MiscStatic.loadFile(in,characterset);
-        boolean writeResult = true;
-        try
-        {
-
-           OutputStreamWriter outP;
-           if(characterset!=null)
-           {
-             outP = new OutputStreamWriter(
-                  new FileOutputStream(tmpFile),characterset);
-           }
-            else
-            {
-               outP = new OutputStreamWriter(
-                  new FileOutputStream(tmpFile));
-            }
-
-           writeResult  = MiscStatic.print(outP,tmpInfile);
-           if(!writeResult)
-           {
-              System.err.println("MiscStatic:specChar" + HelpMessages.WRITE_EXCEPTION + //$NON-NLS-1$
-              in);
-           }
-           outP.close();
-         }
-         catch(Exception e)
-         {
-             System.err.println("MiscStatic:specChar" + HelpMessages.WRITE_EXCEPTION + //$NON-NLS-1$
-              e);
-         }
-
-           if(writeResult)
-           {
-             infile = MiscStatic.loadFile(tmpFile,characterset);
-           }
-           else
-           {
-             infile=null;
-           }
-
-
-
-
-        if(infile!=null)
-        {
-           try
-            {
-             StringBuffer resultfile= new StringBuffer();
-
-             for(int i=0;i<infile.length();i++)
-             {
-                tmpspeccharfound=false;
-                char t = infile.charAt(i);
-                if(t!='&')
-                {
-                    if((t>'a' && t<'z') || (t>'A' && t<'Z') || (t>'0' && t<'9') ||
-                       t=='<' || t=='>' || t=='/' || t=='.' || t=='=' ||
-                       t=='-' || t=='%' || t=='@')
-                    {
-                        resultfile.append(t);
-                    }
-                    else
-                    {
-                      resultfile.append(MiscStatic.toSpecChar(t));
-                    }
-                }
-                else
-                {
-                   char t2 = infile.charAt(i+1);
-                   if(t2==' ' || t2=='\n')
-                   {
-                     resultfile.append("&amp;"); //$NON-NLS-1$
-                     tmpspeccharfound=true;
-                   }
-                   else
-                   {
-                      resultfile.append(MiscStatic.toSpecChar(t));
-                   }
-                }
-                if(tmpspeccharfound==true)
-                {
-                   speccharfound=true;
-                }
-             }
-
-             if(speccharfound)
-             {
-                System.out.println(HelpMessages.WRITE_FILE + out);
-                OutputStreamWriter outP;
-                if(characterset!=null)
-                {
-                  outP = new OutputStreamWriter(
-                      new FileOutputStream(out),characterset);
-                }
-                else
-                {
-                   outP = new OutputStreamWriter(
-                      new FileOutputStream(out));
-                }
-                MiscStatic.print(outP, resultfile.toString());
-                outP.close();
-             }
-
-             speccharfound=false;
-
-            }
-            catch(Exception e)
-            {
-               System.err.println("MiscStatic:specChar" + HelpMessages.WRITE_EXCEPTION + //$NON-NLS-1$
-                 e);
-            }
-
-              File tmp = new File(tmpFile);
-              tmp.delete();
-
-     }
-   }
-
-   //converts a character to a special code if needed
-   static String toSpecChar(char token)
-   {
-        tmpspeccharfound=true;
-        if(token=='\ufffd')
-		{
-		    return "&aring;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-	      return "&Aring;"; //$NON-NLS-1$
-	    }
-
-		if(token=='\ufffd')
-		{
-			return "&Auml;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-	    {
-		 return "&auml;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-		{
-		  return "&Ouml;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-		{
-		  return "&ouml;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-		{
-			return "&Eacute;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&Egrave;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			   return "&Uuml;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			 return "&aacute;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			 return "&Aacute;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&agrave;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&eacute;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&egrave;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&iacute;"; //$NON-NLS-1$
-
-		}
-		if(token=='\ufffd')
-		{
-			return "&igrave;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&euml;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-		{
-			return "&oacute;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			 return "&ograve;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			return "&uacute;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&ugrave;"; //$NON-NLS-1$
-
-		}
-	    if(token=='\ufffd')
-		 {
-			return "&uuml;"; //$NON-NLS-1$
-
-		}
-
-		 if(token=='\ufffd')
-		 {
-			return "&yuml;"; //$NON-NLS-1$
-		 }
-		if(token=='\ufffd')
-		{
-			return "&acirc;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			 return "&Acirc;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&ecirc;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-		{
-		return "&Ecirc;"; //$NON-NLS-1$
-
-		}
-		if(token=='\ufffd')
-		{
-		   return "&ucirc;"; //$NON-NLS-1$
-
-		}
-		if(token=='\ufffd')
-		{
-			return "&Ucirc;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&ocirc;"; //$NON-NLS-1$
-		}
-		 if(token=='\ufffd')
-		{
-			return "&Ocirc;"; //$NON-NLS-1$
-
-		}
-		if(token=='\ufffd')
-		{
-			return "&icirc;"; //$NON-NLS-1$
-
-		}
-
-		if(token=='\ufffd')
-		{
-			 return "&AElig;"; //$NON-NLS-1$
-		}
-
-	    if(token=='\ufffd')
-		{
-			 return "&aelig;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			 return "&Icirc;"; //$NON-NLS-1$
-
-		}
-		if(token=='\ufffd')
-		{
-			return "&Agrave;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-        {
-	       return "&Atilde;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			 return "&atilde;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			 return "&ETH;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			 return "&eth;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			 return "&Igrave;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-		{
-		    return "&Ntilde;"; //$NON-NLS-1$
-		}
-
-	    if(token=='\ufffd')
-		{
-			return "&ntilde;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&Otilde;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&otilde;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&szlig;"; //$NON-NLS-1$
-		}
-
-	    if(token=='\ufffd')
-		{
-			return "&THORN;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-			return "&thorn;"; //$NON-NLS-1$
-		}
-
-        if(token=='\ufffd')
-		{
-		  return "&Oslash;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-		  return "&oslash;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-		  return "&Ograve;"; //$NON-NLS-1$
-		}
-	    if(token=='\ufffd')
-		{
-			  return "&Ugrave;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-		   return "&iuml;"; //$NON-NLS-1$
-		}
-
-	    if(token=='\ufffd')
-		{
-			  return "&Yacute;"; //$NON-NLS-1$
-		}
-		if(token=='\ufffd')
-		{
-		   return "&yacute;"; //$NON-NLS-1$
-		}
-
-
-		if(token=='\ufffd')
-		{
-			return "&Ccedil;"; //$NON-NLS-1$
-		}
-
-		if(token=='\ufffd')
-		{
-			return "&ccedil;"; //$NON-NLS-1$
-		}
-
-		/*if(token=='\ufffd')
-		{
-			return "&frac12;";
-		}*/
-
-        tmpspeccharfound = false;
-		return new Character(token).toString();
-
-     }
-
-      /**
-  * Trims double quotes from an argument.
-  * @param str	the string to trim.
-  * @return the trimmed string.
- **/
-
- static String trimQuotes(String str) {
-
-  int len = str.length();
-  if(len <= 0) return str;
-
-  if(str.charAt(len - 1) == '"') str = str.substring(0, len - 1);
-  if(str.charAt(0) == '"') str = str.substring(1);
-
-  return str;
-  }
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/OS.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/OS.java
deleted file mode 100644
index 0955415..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/OS.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-
-final class OS
-{
-    private static boolean isWindows98 = false;
-    private static boolean isWindows95 = false;
-    private static boolean isWindowsNT = false;
-    private static boolean isMacintosh = false;
-
-    static
-    {
-        String s;
-
-        s = System.getProperty("os.name"); //$NON-NLS-1$
-
-        if(s.equals("Windows NT")) //$NON-NLS-1$
-        {
-            isWindowsNT = true;
-        }
-        else if(s.equals("Windows 95")) //$NON-NLS-1$
-        {
-            isWindows95 = true;
-        }
-        else if(s.equals("Windows 98")) //$NON-NLS-1$
-        {
-            isWindows98 = true;
-        }
-        else if (s.equals("Macintosh") || //$NON-NLS-1$
-				 s.equals("macos") ||		//Applet Viewer //$NON-NLS-1$
-				 s.equals("Mac OS") ||		//Netscape //$NON-NLS-1$
-				 s.equals("MacOS"))			//Internet Exploder //$NON-NLS-1$
-        {
-            isMacintosh = true;
-        }
-    }
-
-    private OS()
-    {
-    }
-
-    static boolean isWindows()
-    {
-        return (isWindows95() || isWindowsNT() || isWindows98);
-    }
-
-    static boolean isWindows95()
-    {
-        return (isWindows95);
-    }
-
-    static boolean isWindowsNT()
-    {
-        return (isWindowsNT);
-    }
-
-    static boolean isMacintosh()
-    {
-        return (isMacintosh);
-    }
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/SpecKeyWord.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/SpecKeyWord.java
deleted file mode 100644
index eb41fee..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/SpecKeyWord.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-import java.io.OutputStreamWriter;
-
-//A keyword defined in a separate file
-//This keyword reffers to a keyword defined in a html file
-class SpecKeyWord
-{
-    private String relatedKeyWord=null;
-    private boolean see=true;
-
-    SpecKeyWord(String relatedKeyWord, boolean mode)
-    {
-        if(relatedKeyWord==null)
-        {
-           System.err.println("SpecKeyWord:SpecKeyWord\n" + HelpMessages.INPUT_PARAMETER_NULL); //$NON-NLS-1$
-        }
-       this.relatedKeyWord = relatedKeyWord;
-       this.see = mode;
-    }
-
-    //Prints the keyword
-    void print(OutputStreamWriter outP)
-    {
-      if(outP==null)
-      {
-         System.err.println("SpecKeyWord:print\n" + HelpMessages.BAD_OUTPUT_STREAM); //$NON-NLS-1$
-         return;
-      }
-      if(relatedKeyWord!=null)
-      {
-       if(see)
-       {
-         MiscStatic.print(outP, KeyWordIndexHelper.defObj.getSee());
-       }
-       else
-       {
-         MiscStatic.print(outP, KeyWordIndexHelper.defObj.getSeeAlso());
-       }
-        MiscStatic.print(outP, "<A HREF=\"#" + //$NON-NLS-1$
-          relatedKeyWord + "\">" + relatedKeyWord + "</A>\n"); //$NON-NLS-1$ //$NON-NLS-2$
-      }
-    }
-
-    boolean isSee()
-    {
-       return see;
-    }
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/StringDefinitions.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/StringDefinitions.java
deleted file mode 100644
index 5fc6d80..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/StringDefinitions.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.index;
-
-/**Classes used for all string messages that may need to be localized
- */
-class StringDefinitions
-{
-	public static String ERROR_DEFINITION_FILE_NOT_FOUND = "The configuration/definition files has not been defined"; //$NON-NLS-1$
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/package.html b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/package.html
deleted file mode 100644
index 1b471d9..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/index/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for generating the index and glossary pages in a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/package.html b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/package.html
deleted file mode 100644
index 0f1c6db..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for the publishing service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/search/StopWordReader.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/search/StopWordReader.java
deleted file mode 100644
index f064c55..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/search/StopWordReader.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.services.search;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.util.Vector;
-
-/**
- * This class reads in a configuration file of stop words
- * and provides the stop words as a list. <br>
- */
-class StopWordReader
-{
-	private static Vector _stopwords = null;
-
-	/**
-	 * Default constructor.
-	 */
-	private StopWordReader()
-	{
-	}
-
-	/**
-	 * Retrieve the set of stopwords from the given file.
-	 */
-	static String[] getStopwords( String filepath,
-	                                     String filename )
-	{
-		if( null == _stopwords )
-		{
-			_stopwords = new Vector();
-
-	    	try
- 	   		{
-				// read in the file
-				String fullFilename = filepath +
-									  File.separator +
-		 							  filename;
-		        FileInputStream inStream = new FileInputStream( fullFilename );
-				InputStreamReader streamReader = new InputStreamReader( inStream );
-				BufferedReader read = new BufferedReader(streamReader);
-/*	  	    	char[] charRead = new char[ inStream.available() ];
-	        	streamReader.read( charRead );
-	        	String content = new String( charRead );
-*/
-
-				String word = read.readLine();
-				while (word != null)
-				{
-					_stopwords.add(word);
-					word = read.readLine();
-				}
-
-	        	// close stream
-	        	read.close();
-	        	streamReader.close();
-	        	inStream.close();
-
-	        	// parseContent
-//	        	parseContent( content, _stopwords );
-			}
-			catch( Exception e )
-			{
-				e.printStackTrace();
-			}
-		}
-
-		Object[] stopObjects = _stopwords.toArray();
-		String[] stopStrings = new String[ stopObjects.length ];
-		for( int i = 0; i < stopObjects.length; i++ )
-		{
-			stopStrings[ i ] = (String)stopObjects[ i ];
-		}
-		return( stopStrings );
-
-	}
-
-	/**
-	 * Parses the content into stopwords.
-	 */
-/*
-	private static void parseContent( String content,
-	                                  Vector _stopwords )
-	{
-		StringTokenizer tokenizer = new StringTokenizer( content,
-		                                                 System.getProperty( "line.separator" ) );
-		while( tokenizer.hasMoreElements() )
-		{
-			_stopwords.addElement( tokenizer.nextElement() );
-		}
-	}
-*/
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/search/package.html b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/search/package.html
deleted file mode 100644
index 13bb677..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/search/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for indexing a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/PublishingUtil.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/PublishingUtil.java
deleted file mode 100644
index 1dc0356..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/PublishingUtil.java
+++ /dev/null
@@ -1,192 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.common.xml.XSLTProcessor;
-import org.eclipse.epf.diagram.core.services.DiagramManager;
-import org.eclipse.epf.library.layout.util.XmlElement;
-import org.eclipse.epf.library.layout.util.XmlHelper;
-import org.eclipse.epf.library.util.ResourceHelper;
-import org.eclipse.epf.persistence.util.PersistenceUtil;
-import org.eclipse.epf.publishing.PublishingPlugin;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.Process;
-
-/**
- * Helper utilities for publishing.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.0
- */
-public class PublishingUtil {
-
-	/**
-	 * Zips the content of a directory into a JAR file.
-	 * <p>
-	 * Non-sub-folders are included.
-	 * 
-	 * @param jarDir
-	 *            the directory to be zipped
-	 * @param jarFile
-	 *            the output JAR file
-	 * @throws IOException
-	 *             if an error occurs while creating the JAR file
-	 */
-	public static void jarFiles(File jarDir, File jarFile) throws IOException {
-		File[] files = jarDir.listFiles();
-		if (jarFile.exists()) {
-			jarFile.delete();
-		}
-		BufferedOutputStream bStream = new BufferedOutputStream(
-				new FileOutputStream(jarFile));
-		ZipOutputStream zipperStream = new ZipOutputStream(bStream);
-
-		byte[] bytes = new byte[4096];
-		for (int i = 0; i < files.length; i++) {
-			File currentFile = files[i];
-			if (currentFile.isDirectory()) {
-				continue;
-			}
-			ZipEntry currEntry = new ZipEntry(currentFile.getName());
-			zipperStream.putNextEntry(currEntry);
-			BufferedInputStream biStream = new BufferedInputStream(
-					new FileInputStream(currentFile));
-			while (biStream.available() > 0) {
-				int num = biStream.read(bytes);
-				zipperStream.write(bytes, 0, num);
-			}
-			biStream.close();
-			zipperStream.closeEntry();
-		}
-		zipperStream.close();
-		bStream.close();
-	}
-
-	/**
-	 * Generates the HTML content for a given XML element and XSL file path
-	 * 
-	 * @param xmlElement
-	 *            an object that contains the XML representation for a metod
-	 *            element
-	 * @param xslPath
-	 *            path to a XSL file
-	 * @return the output HTML
-	 */
-	public static String getHtml(XmlElement xmlElement, String xslPath) {
-		try {
-			// set the language attribute
-			Locale locale = Locale.getDefault();
-			String lang = locale.getLanguage();
-			xmlElement.setAttribute("lang", lang); //$NON-NLS-1$
-
-			URL url = new URL(PublishingPlugin.getDefault().getInstallURL(),
-					xslPath);
-			if (url == null) {
-				PublishingPlugin.getDefault().getLogger().logError(
-						"Unable to access XSL template " + xslPath); //$NON-NLS-1$
-				return null;
-			}
-
-			String xslURI = FileLocator.resolve(url).getPath();
-
-			StringBuffer xml = new StringBuffer();
-			xml.append(XmlHelper.XML_HEADER).append(xmlElement.toXml());
-
-			Properties xslParams = PublishingPlugin.getDefault().getProperties(
-					"/xsl/resources.properties"); //$NON-NLS-1$
-
-			// generate the HTML
-			StringWriter sw = new StringWriter();
-			XSLTProcessor.transform(xslURI, xml.toString(), xslParams, sw);
-			sw.flush();
-
-			// urls are encoded in XSLT output, decode it
-			return ResourceHelper
-					.decodeUrlsInContent(sw.getBuffer().toString());
-		} catch (Exception e) {
-			PublishingPlugin.getDefault().getLogger().logError(
-					"Unable to generate HTML", e); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-	/**
-	 * Checks whether a configuration contains a view that references a process.
-	 * 
-	 * @param config
-	 *            a method configuration
-	 * @param process
-	 *            a capability pattern or delivery process
-	 * @return <code>true</code> if the configuration contains a view that
-	 *         references a process
-	 */
-	public static boolean hasValidProcessView(MethodConfiguration config,
-			Process process) {
-		for (Iterator<ContentCategory> views = config.getProcessViews()
-				.iterator(); views.hasNext();) {
-			ContentCategory view = views.next();
-			if (view instanceof CustomCategory) {
-				CustomCategory cc = (CustomCategory) view;
-				for (Iterator<DescribableElement> it = cc
-						.getCategorizedElements().iterator(); it.hasNext();) {
-					DescribableElement element = it.next();
-					if (element instanceof Process) {
-						if (((Process) element).getGuid() == process.getGuid()) {
-							return true;
-						}
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	public static void unloadResources(Collection<Resource> resources) {
-		
-		//Runtime.getRuntime().gc();
-		//long m1 = Runtime.getRuntime().freeMemory()/1000000;
-		PersistenceUtil.unload(resources);
-		//Runtime.getRuntime().gc();		
-		//long m2 = Runtime.getRuntime().freeMemory()/1000000;
-		//System.out.println("*** " + Long.toString(m2-m1) + " MB freed by unloading resources");
-	}
-
-	public static void disposeDiagramManagers(Collection<DiagramManager> mgrs, Collection<DiagramManager> keeplist) {
-		for ( Iterator<DiagramManager> it = mgrs.iterator(); it.hasNext(); ) {
-			DiagramManager mgr = it.next();
-			if ( keeplist == null || !keeplist.contains(mgr) ) {
-				mgr.dispose();
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpClientTimeout.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpClientTimeout.java
deleted file mode 100644
index d2e436e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpClientTimeout.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util.http;
-
-import java.io.BufferedOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.net.SocketException;
-import java.net.URL;
-
-import sun.net.www.http.HttpClient;
-//import sun.net.*;
-//import sun.net.www.*;
-class HttpClientTimeout extends HttpClient
-{
-	private int timeout = 0 ;
-
-    HttpClientTimeout(URL url, String proxy, int proxyPort, int timeout) throws IOException
-	{
-		super(url, proxy, proxyPort);
-		_setTimeout(timeout);
-
-	}
-
-    HttpClientTimeout(URL url, int timeout) throws IOException
-	{
-		super(url, (String)null, -1);
-		setTimeout(timeout);
-    }
-
-	private void _setTimeout(int i)
-    	throws SocketException
-	{
-    	this.timeout = i;
-    	serverSocket.setSoTimeout(i) ;
- 	}
-
-    /* This class has no public constructor for HTTP.  This method is used to
-     * get an HttpClient to the specifed URL.  If there's currently an
-     * active HttpClient to that server/port, you'll get that one.
-	 *
-	 * no longer syncrhonized -- it slows things down too much
-	 * synchronize at a higher level
-     */
-    static HttpClientTimeout GetNew(URL url, int timeout)
-    throws IOException {
-		/* see if one's already around */
-		HttpClientTimeout ret = (HttpClientTimeout) kac.get(url);
-		if (ret == null) {
-	    	ret = new HttpClientTimeout (url, timeout);  // CTOR called openServer()
-		} else {
-	    	ret.url = url;
-		}
-		// don't know if we're keeping alive until we parse the headers
-		// for now, keepingAlive is false
-		return ret;
-    }
-
-    public void openServer(String s, int i)
-        throws IOException
-    {
-        serverSocket = doConnect(s, i);
-        serverOutput = new PrintStream(new BufferedOutputStream(serverSocket.getOutputStream()));
-        serverSocket.setTcpNoDelay(true);
-        serverSocket.setSoTimeout(timeout);
-    }
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpResponse.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpResponse.java
deleted file mode 100644
index 0b13f2a..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpResponse.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util.http;
-
-import java.util.Properties;
-import java.util.Vector;
-/**
- * @author Phong Nguyen Le 09/21/2001
- */
-public class HttpResponse {
-	static final String SESSION_COOKIE_NAME = "SMSESSION"; //$NON-NLS-1$
-
-	static class Cookie implements Cloneable {
-		private String name;
-		private String value;
-		private String domain;
-		private String path;
-
-		Cookie(String name, String value) {
-			this.name = name;
-			this.value = value;
-		}
-
-		String getName() {
-			return name;
-		}
-
-		String getValue() {
-			return value;
-		}
-
-		void setValue(String value) {
-			this.value = value;
-		}
-
-		String getDomain() {
-			return domain;
-		}
-
-		void setDomain(String domain) {
-			this.domain = domain;
-		}
-
-		String getPath() {
-			return path;
-		}
-
-		void setPath(String path) {
-			this.path = path;
-		}
-
-		public Object clone() {
-	    	try {
-	        	return super.clone();
-	    	}
-	    	catch(CloneNotSupportedException e) {
-	        	return null;
-	    	}
-		}
-
-		public String toString() {
-			return getClass().getName()+"(name="+name+", value="+value+", domain="+domain+", path="+path+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-		}
-	}
-		private int status;
-		private Properties headers;
-		private Vector cookies;
-
-		private String data;
-
-		HttpResponse(int status, Properties headers, Vector cookies, String data) {
-			this.status = status;
-			this.headers = headers;
-			this.cookies = cookies;
-			this.data = data;
-		}
-
-		int getStatus() {
-			return status;
-		}
-
-		Properties getHeaders() {
-			return headers;
-		}
-
-		Vector getCookies() {
-			return cookies;
-		}
-
-		String getData() {
-			return data;
-		}
-
-		public String toString() {
-			return getClass().getName() + "(status="+status+", headers="+headers+", cookies="+cookies+", data="+data+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-		}
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpTimeoutFactory.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpTimeoutFactory.java
deleted file mode 100644
index d12409c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpTimeoutFactory.java
+++ /dev/null
@@ -1,26 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util.http;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
-
-class HttpTimeoutFactory implements URLStreamHandlerFactory
-{
-	private int timeout;
-	HttpTimeoutFactory(int timeout) { this.timeout = timeout; }
-	public URLStreamHandler createURLStreamHandler(String str)
-	{
-		HttpTimeoutHandler handler = new HttpTimeoutHandler();
-		handler.setTimeout(timeout);
-		return handler;
-	}
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpTimeoutHandler.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpTimeoutHandler.java
deleted file mode 100644
index a453a1c..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpTimeoutHandler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util.http;
-
-import java.io.IOException;
-import java.net.URL;
-
-class HttpTimeoutHandler extends sun.net.www.protocol.http.Handler implements TimeoutHandler
-{
-	private int timeout = 0;
-
-	HttpTimeoutHandler() {
-		super();
-	}
-
-	HttpTimeoutHandler(int timeout) {
-		this();
-		this.timeout = timeout;
-	}
-
-    protected java.net.URLConnection openConnection(URL u) throws IOException {
-		return new HttpURLConnectionTimeout(u, this, timeout);
-    }
-
-    public void setTimeout(int timeout) {
-    	this.timeout = timeout;
-    }
-
-    String getProxy() { return proxy; }		// breaking encapsulation
-    int getProxyPort() { return proxyPort; }    // breaking encapsulation
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpURLConnectionTimeout.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpURLConnectionTimeout.java
deleted file mode 100644
index 8c86615..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpURLConnectionTimeout.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util.http;
-
-import java.io.IOException;
-import java.io.PrintStream;
-import java.net.URL;
-
-import sun.net.www.http.HttpClient;
-
-class HttpURLConnectionTimeout extends sun.net.www.protocol.http.HttpURLConnection
-{
-	private int timeout;
-	private HttpTimeoutHandler timeoutHandler;
-
-  	HttpURLConnectionTimeout(URL u, HttpTimeoutHandler handler, int timeout) throws IOException
-	{
-    	super(u, handler);
-		this.timeout = timeout;
-		timeoutHandler = handler;
-	}
-
-	HttpURLConnectionTimeout(URL u,  String host, int port, int timeout) throws IOException
-	{
-    	super(u, host, port);
-    	this.timeout = timeout;
-	}
-
-    public void connect() throws IOException {
-		if (connected) {
-	    	return;
-		}
-		try {
-	    	if ("http".equals(url.getProtocol()) /* && !failedOnce <- PRIVATE */ ) { //$NON-NLS-1$
-				// for safety's sake, as reported by KLGroup
-				synchronized (url) {
-					http = HttpClientTimeout.GetNew(url, timeout);
-				}
-	    	}
-	    	else {
-				// make sure to construct new connection if first
-				// attempt failed
-				http = new HttpClientTimeout(url, timeoutHandler.getProxy(), timeoutHandler.getProxyPort(), timeout);
-	    	}
-	    	ps = (PrintStream)http.getOutputStream();
-		} catch (IOException e) {
-	    	throw e;
-		}
-		// this was missing from the original version
-		connected = true;
-	}
-
-    protected HttpClient getProxiedClient(URL url, String s, int i)
-        throws IOException
-    {
-        return (HttpClient)new HttpClientTimeout(url, s, i, timeout);
-    }
-
-
-
-    /**
-     * Create a new HttpClient object, bypassing the cache of
-     * HTTP client objects/connections.
-     *
-     * @param url	the URL being accessed
-     */
-    protected HttpClient getNewClient(URL url)
-    throws IOException {
-		return (HttpClient)(new HttpClientTimeout (url, (String)null, -1, timeout));
-    }
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpUtil.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpUtil.java
deleted file mode 100644
index 81472ef..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/HttpUtil.java
+++ /dev/null
@@ -1,744 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util.http;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.net.HttpURLConnection;
-import java.net.Socket;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.net.URLStreamHandler;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Vector;
-
-import org.eclipse.epf.publishing.PublishingResources;
-import org.eclipse.osgi.util.NLS;
-
-import com.ibm.icu.util.StringTokenizer;
-
-
-/**
- * @author Phong Nguyen Le 09/21/2001
- */
-public class HttpUtil {
-	private final static boolean DEBUG = false;
-	/**
-	 * Do a GET using low level socket to have control over timeout
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 *            <li> CataHttpException invalid response from server
-	 */
-	static HttpResponse doGet(Socket sock, String url, Properties headers) throws Exception
-	{
-		int respStatus;
-		Properties respHeaders = new Properties();
-		Vector respCookies = new Vector();
-		String resp = null;
-		DataOutputStream out = null;
-		DataInputStream in = null;
-		try {
-			String host = sock.getInetAddress().getHostName();
-			int port = sock.getPort();
-			out = new DataOutputStream(sock.getOutputStream());
-			in = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
-			out.writeBytes("GET " + url + " HTTP/1.1\r\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			out.writeBytes("Host: " + host + ":" + port + "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			out.writeBytes("User-Agent: Mozilla/4.0\r\n"); //$NON-NLS-1$
-			out.writeBytes("Content-Length: 0\r\n"); //$NON-NLS-1$
-			// send addional headers if any
-			if(headers != null && headers.size() > 0) {
-				Enumeration names = headers.keys();
-				while(names.hasMoreElements()) {
-					String name = (String)names.nextElement();
-					if(name.equalsIgnoreCase("Host") || name.equalsIgnoreCase("User-Agent") || name.equalsIgnoreCase("Content-Length")) continue; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					out.writeBytes(name + ": " + headers.getProperty(name) + "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			out.writeBytes("\r\n"); //$NON-NLS-1$
-			out.flush();
-			String line;
-			boolean endFound = false;
-			int contentLen = -1;
-			final String contentLenHeader = "content-length: "; //$NON-NLS-1$
-			int contentLenHeaderLen = contentLenHeader.length();
-			String httpResp = ""; //$NON-NLS-1$
-
-			// read the first line
-			line = in.readLine();
-			//logger.debug("line="+line);
-			if(line == null) {
-				throw new Exception(PublishingResources.serverError_msg); 
-			}
-			httpResp += line + "\n"; //$NON-NLS-1$
-			StringTokenizer tokens = new StringTokenizer(line);
-			try {
-				// skip the first token which is "HTTP/1.1" or "HTTP/1.0"
-				tokens.nextToken();
-				respStatus = Integer.parseInt(tokens.nextToken());
-			}
-			catch(Exception e) {
-				e.printStackTrace();
-				throw new Exception(NLS.bind(PublishingResources.invalidHttpResponseError_msg, (new Object[]{host, Integer.toString(port), line}))); 
-			}
-
-			// read the headers
-			while((line = in.readLine()) != null) {
-				//logger.debug("line="+line);
-				httpResp += line + "\n"; //$NON-NLS-1$
-				if(line.length() == 0) {
-					endFound = true;
-					break;
-				}
-				int id = line.indexOf(": "); //$NON-NLS-1$
-				if(id > 0) {
-					String header = line.substring(0, id).toLowerCase();
-					String value = ""; //$NON-NLS-1$
-					if(line.length() > id + 2) {
-						value = line.substring(id + 2);
-					}
-
-					if(header.equalsIgnoreCase("set-cookie")) { //$NON-NLS-1$
-						HttpResponse.Cookie cookie = parseCookie(value);
-						if(cookie != null) {
-							respCookies.addElement(cookie);
-						}
-					}
-					else {
-						respHeaders.put(header, value);
-					}
-
-					//respHeaders.put(header, value);
-				}
-			}
-			String contentLenStr = respHeaders.getProperty("content-length"); //$NON-NLS-1$
-			if(contentLenStr == null) {
-				contentLen = -1;
-			}
-			else {
-				contentLen = Integer.parseInt(contentLenStr);
-			}
-			if(DEBUG) {
-			System.out.println("++++BEGIN HEADERS++++"); //$NON-NLS-1$
-			System.out.println(httpResp);
-			System.out.println("++++END HEADERS++++"); //$NON-NLS-1$
-			}
-			if(!endFound) {
-				throw new Exception(NLS.bind(PublishingResources.invalidHttpResponseError_msg, (new Object[]{host, Integer.toString(port), httpResp}))); 
-			}
-			//System.out.println("contentLen="+contentLen);
-			if(contentLen > 0) {
-				/*
-				byte[] buff = new byte[contentLen];
-				in.readFully(buff);
-				resp = new String(buff);
-				*/
-				ByteArrayOutputStream bos = new ByteArrayOutputStream();
-				byte[] buff = new byte[Math.min(2048, contentLen)];
-				int num;
-				while((num = in.read(buff)) != -1) {
-					//System.out.println("num="+num);
-					int n = contentLen - bos.size();
-					if(n <= num) {
-						bos.write(buff, 0, n);
-						break;
-					}
-					bos.write(buff, 0, num);
-				}
-				resp = bos.toString();
-			}
-			else if(contentLen < 0) {
-				ByteArrayOutputStream bos = new ByteArrayOutputStream();
-				byte[] buff = new byte[2048];
-				int num;
-				while((num = in.read(buff)) != -1) {
-					//System.out.println("num="+num);
-					bos.write(buff, 0, num);
-				}
-				resp = bos.toString();
-			}
-		}
-		finally {
-			try { in.close(); } catch(Exception e) {  }
-			try { out.close(); } catch(Exception e) {  }
-		}
-		return new HttpResponse(respStatus, respHeaders, respCookies, resp);
-	}
-
-
-	/**
-	 * Do a GET using low level socket to have control over timeout
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 *            <li> CataHttpException invalid response from server
-	 */
-	public static HttpResponse doGet(String host, int port, String url, int timeout, Properties headers) throws Exception
-	{
-		Socket sock = null;
-		try {
-			sock = new Socket(host, port);
-			sock.setSoTimeout(timeout);
-			return doGet(sock, url, headers);
-		}
-		finally {
-			try { sock.close(); } catch(Exception e) {}
-		}
-	}
-
-	private static Map handlerMap = new HashMap();
-	private static URLStreamHandler getHandler(int timeout) {
-		Integer key = new Integer(timeout);
-		URLStreamHandler handler = (URLStreamHandler)handlerMap.get(key);
-		if(handler == null) {
-			synchronized(handlerMap) {
-				if((handler = (URLStreamHandler)handlerMap.get(key)) == null) {
-					handler = new HttpTimeoutHandler(timeout);
-					handlerMap.put(key, handler);
-				}
-			}
-		}
-		return handler;
-	}
-
-	/**
-	 * Do a GET
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 */
-	public static HttpResponse doGet(String url, Properties headers, int timeout) throws Exception
-	{
-		return doGet(new URL((URL)null, url, getHandler(timeout)), headers);
-	}
-
-	/**
-	 * Do a GET
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 */
-	static HttpResponse doGet(URL url, Properties headers) throws Exception
-	{
-		Properties respHeaders = new Properties();
-		Vector respCookies = new Vector();
-		HttpURLConnection.setFollowRedirects(false);
-		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
-		//conn.setInstanceFollowRedirects(false); //JDK1.3
-		conn.setRequestMethod("GET"); //$NON-NLS-1$
-		conn.setUseCaches(false);
-		// send addional headers if any
-		if(headers != null && headers.size() > 0) {
-			Enumeration names = headers.keys();
-			while(names.hasMoreElements()) {
-				String name = (String)names.nextElement();
-				if(name.equalsIgnoreCase("Host") || name.equalsIgnoreCase("User-Agent") || name.equalsIgnoreCase("Content-Length")) continue; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				conn.setRequestProperty(name, headers.getProperty(name));
-			}
-		}
-		int respStatus = conn.getResponseCode();
-		String name;
-		for(int i = 1; (name = conn.getHeaderFieldKey(i)) != null; i++) {
-			String value = conn.getHeaderField(name);
-			if(name.equalsIgnoreCase("set-cookie")) { //$NON-NLS-1$
-				HttpResponse.Cookie cookie = parseCookie(value);
-				if(cookie != null) {
-					respCookies.addElement(cookie);
-				}
-			}
-			else {
-				respHeaders.put(name.toLowerCase(), value);
-			}
-		}
-		int contentLen = conn.getContentLength();
-		BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
-		String resp = null;
-		if(contentLen > 0) {
-			/*
-			byte[] buff = new byte[contentLen];
-			in.readFully(buff);
-			resp = new String(buff);
-			*/
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			byte[] buff = new byte[Math.min(2048, contentLen)];
-			int num;
-			while((num = in.read(buff)) != -1) {
-				//System.out.println("num="+num);
-				int n = contentLen - bos.size();
-				if(n <= num) {
-					bos.write(buff, 0, n);
-					break;
-				}
-				bos.write(buff, 0, num);
-			}
-			resp = bos.toString();
-		}
-		else if(contentLen < 0) {
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			byte[] buff = new byte[2048];
-			int num;
-			while((num = in.read(buff)) != -1) {
-				//System.out.println("num="+num);
-				bos.write(buff, 0, num);
-			}
-			resp = bos.toString();
-		}
-		return new HttpResponse(respStatus, respHeaders, respCookies, resp);
-	}
-
-	/**
-	 * Do a POST
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 */
-	static HttpResponse doPost(String url, Properties headers, Properties data, int timeout) throws Exception
-	{
-		return doPost(new URL((URL)null, url, getHandler(timeout)), headers, data);
-	}
-
-	/**
-	 * Do a POST
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 */
-	static HttpResponse doPost(URL url, Properties headers, Properties data) throws Exception
-	{
-		Properties respHeaders = new Properties();
-		Vector respCookies = new Vector();
-		HttpURLConnection.setFollowRedirects(false);
-		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
-		//conn.setInstanceFollowRedirects(false); //JDK1.3
-		conn.setRequestMethod("POST"); //$NON-NLS-1$
-		conn.setUseCaches(false);
-		conn.setDoOutput(true);
-		conn.setDoInput(true);
-		// send addional headers if any
-		if(headers != null && headers.size() > 0) {
-			Enumeration names = headers.keys();
-			while(names.hasMoreElements()) {
-				String name = (String)names.nextElement();
-				if(name.equalsIgnoreCase("Host") || name.equalsIgnoreCase("User-Agent") || name.equalsIgnoreCase("Content-Length")) continue; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				conn.setRequestProperty(name, headers.getProperty(name));
-			}
-		}
-		DataOutputStream out = new DataOutputStream(conn.getOutputStream());
-
-		String content = ""; //$NON-NLS-1$
-		Enumeration enu = data.propertyNames();
-		while(enu.hasMoreElements()) {
-			String name = (String)enu.nextElement();
-			content += (name + "=" + URLEncoder.encode(data.getProperty(name))); //$NON-NLS-1$
-			if(enu.hasMoreElements()) {
-				content += "&"; //$NON-NLS-1$
-			}
-		}
-		if(content.length() > 0) {
-			out.writeBytes(content);
-		}
-
-		int respStatus = conn.getResponseCode();
-		String name;
-		for(int i = 1; (name = conn.getHeaderFieldKey(i)) != null; i++) {
-			String value = conn.getHeaderField(name);
-			if(name.equalsIgnoreCase("set-cookie")) { //$NON-NLS-1$
-				HttpResponse.Cookie cookie = parseCookie(value);
-				if(cookie != null) {
-					respCookies.addElement(cookie);
-				}
-			}
-			else {
-				respHeaders.put(name.toLowerCase(), value);
-			}
-		}
-		int contentLen = conn.getContentLength();
-		BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
-		String resp = null;
-		if(contentLen > 0) {
-			/*
-			byte[] buff = new byte[contentLen];
-			in.readFully(buff);
-			resp = new String(buff);
-			*/
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			byte[] buff = new byte[Math.min(2048, contentLen)];
-			int num;
-			while((num = in.read(buff)) != -1) {
-				//System.out.println("num="+num);
-				int n = contentLen - bos.size();
-				if(n <= num) {
-					bos.write(buff, 0, n);
-					break;
-				}
-				bos.write(buff, 0, num);
-			}
-			resp = bos.toString();
-		}
-		else if(contentLen < 0) {
-			ByteArrayOutputStream bos = new ByteArrayOutputStream();
-			byte[] buff = new byte[2048];
-			int num;
-			while((num = in.read(buff)) != -1) {
-				//System.out.println("num="+num);
-				bos.write(buff, 0, num);
-			}
-			resp = bos.toString();
-		}
-		return new HttpResponse(respStatus, respHeaders, respCookies, resp);
-	}
-
-	/**
-	 * Do a POST using low level socket to have control over timeout
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 *            <li> CataHttpException invalid response from server
-	 */
-	static HttpResponse doPost(Socket sock, String url, Properties headers, Properties data) throws Exception
-	{
-		int respStatus;
-		Properties respHeaders = new Properties();
-		Vector respCookies = new Vector();
-		String resp = null;
-		DataOutputStream out = null;
-		DataInputStream in = null;
-		try {
-			String host = sock.getInetAddress().getHostName();
-			int port = sock.getPort();
-			out = new DataOutputStream(sock.getOutputStream());
-			in = new DataInputStream(new BufferedInputStream(sock.getInputStream()));
-			String content = ""; //$NON-NLS-1$
-			Enumeration enu = data.propertyNames();
-			while(enu.hasMoreElements()) {
-				String name = (String)enu.nextElement();
-				content += (name + "=" + URLEncoder.encode(data.getProperty(name))); //$NON-NLS-1$
-				if(enu.hasMoreElements()) {
-					content += "&"; //$NON-NLS-1$
-				}
-			}
-			//logger.debug("postdata="+content);
-			out.writeBytes("POST " + url + " HTTP/1.1\r\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			out.writeBytes("Host: " + host + ":" + port + "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			out.writeBytes("User-Agent: Mozilla/4.0\r\n"); //$NON-NLS-1$
-			//out.writeBytes("Accept: text/html");
-			out.writeBytes("Content-Type: application/x-www-form-urlencoded\r\n"); //$NON-NLS-1$
-			out.writeBytes("Content-Length: " + content.length() + "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			// send addional headers if any
-			if(headers != null && headers.size() > 0) {
-				Enumeration names = headers.keys();
-				while(names.hasMoreElements()) {
-					String name = (String)names.nextElement();
-					if(name.equalsIgnoreCase("Host") || name.equalsIgnoreCase("User-Agent") || name.equalsIgnoreCase("Content-Length") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						|| name.equalsIgnoreCase("Content-Type")) continue; //$NON-NLS-1$
-					out.writeBytes(name + ": " + headers.getProperty(name) + "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			out.writeBytes("\r\n"); //$NON-NLS-1$
-			if(content.length() > 0) {
-				out.writeBytes(content);
-			}
-			out.flush();
-			String line;
-			boolean endFound = false;
-			int contentLen = -1;
-			final String contentLenHeader = "content-length: "; //$NON-NLS-1$
-			int contentLenHeaderLen = contentLenHeader.length();
-			String httpResp = ""; //$NON-NLS-1$
-
-			// read the first line
-			line = in.readLine();
-			//logger.debug("line="+line);
-			if(line == null) {
-				throw new Exception(PublishingResources.serverError_msg); 
-			}
-			httpResp += line + "\n"; //$NON-NLS-1$
-			StringTokenizer tokens = new StringTokenizer(line);
-			try {
-				// skip the first token which is "HTTP/1.1" or "HTTP/1.0"
-				tokens.nextToken();
-				respStatus = Integer.parseInt(tokens.nextToken());
-			}
-			catch(Exception e) {
-				e.printStackTrace();
-				throw new Exception(NLS.bind(PublishingResources.invalidHttpResponseError_msg, (new Object[]{host, Integer.toString(port), line}))); 
-			}
-
-			// read the headers
-			while((line = in.readLine()) != null) {
-				//logger.debug("line="+line);
-				httpResp += line + "\n"; //$NON-NLS-1$
-				if(line.length() == 0) {
-					endFound = true;
-					break;
-				}
-				int id = line.indexOf(": "); //$NON-NLS-1$
-				if(id > 0) {
-					String header = line.substring(0, id).toLowerCase();
-					String value = ""; //$NON-NLS-1$
-					if(line.length() > id + 2) {
-						value = line.substring(id + 2);
-					}
-
-					if(header.equals("set-cookie")) { //$NON-NLS-1$
-						HttpResponse.Cookie cookie = parseCookie(value);
-						if(cookie != null) {
-							respCookies.addElement(cookie);
-						}
-					}
-					else {
-						respHeaders.put(header, value);
-					}
-
-					//respHeaders.put(header, value);
-				}
-			}
-			String contentLenStr = respHeaders.getProperty("content-length"); //$NON-NLS-1$
-			if(contentLenStr == null) {
-				contentLen = 0;
-			}
-			else {
-				contentLen = Integer.parseInt(contentLenStr);
-			}
-			if(DEBUG) {
-			System.out.println("++++BEGIN HEADERS++++"); //$NON-NLS-1$
-			System.out.println(httpResp);
-			System.out.println("++++END HEADERS++++"); //$NON-NLS-1$
-			}
-			if(!endFound || contentLen == -1) {
-				throw new Exception(NLS.bind(PublishingResources.invalidHttpResponseError_msg, (new Object[]{host, Integer.toString(port), httpResp}))); 
-			}
-			if(contentLen > 0) {
-				byte[] buff = new byte[contentLen];
-				in.readFully(buff);
-				resp = new String(buff);
-			}
-			else if(contentLenStr == null) {
-				ByteArrayOutputStream bos = new ByteArrayOutputStream();
-				byte[] buff = new byte[2048];
-				int num;
-				while((num = in.read(buff)) != -1) {
-					bos.write(buff, 0, num);
-				}
-				resp = bos.toString();
-			}
-		}
-		finally {
-			try { in.close(); } catch(Exception e) {}
-			try { out.close(); } catch(Exception e) {}
-		}
-		return new HttpResponse(respStatus, respHeaders, respCookies, resp);
-	}
-
-	/**
-	 * Do a POST using low level socket to have control over timeout
-	 *
-	 * @return response
-	 * @exception <li> java.net.ConnectException could not connect to host:port
-	 *            <li> java.io.InterruptedIOException timeout exceeded
-	 *            <li> java.io.IOException I/O error
-	 *            <li> CataHttpException invalid response from server
-	 */
-	public static HttpResponse doPost(String host, int port, String url, int timeout,
-		Properties headers, Properties data) throws Exception
-	{
-		Socket sock = null;
-		try {
-			sock = new Socket(host, port);
-			sock.setSoTimeout(timeout);
-			return doPost(sock, url, headers, data);
-		}
-		finally {
-			try { sock.close(); } catch(Exception e) {}
-		}
-	}
-
-	/**
-	 * Parses a query string and URL-decodes the parameter values
-	 */
-	public static Map parseQueryString(String str) throws Exception {
-		StringTokenizer tokens = new StringTokenizer(str, "&"); //$NON-NLS-1$
-		Map map = new HashMap();
-		int maxId = str.length() - 1;
-		while(tokens.hasMoreTokens()) {
-			String token = tokens.nextToken();
-			int id = token.indexOf('=');
-			if(id == -1) {
-				continue;
-			}
-			else if(id == 0 || id == maxId) {
-				map.put(token, null);
-			}
-			else {
-				map.put(token.substring(0, id), urlDecode(token.substring(id + 1)));
-			}
-		}
-		return map;
-	}
-
-	/**
-	 * Parses the cookie from the value of response header Set-Cookie
-	 */
-    public static HttpResponse.Cookie parseCookie(String str) {
-    	//logger.debug(str);
-    	int id = str.indexOf('=');
-    	if(id <= 0) return null;
-    	String name = str.substring(0, id);
-    	int fromId =name.length() + 1;
-    	int toId = str.indexOf(";"); //$NON-NLS-1$
-    	String value;
-    	String theRest = null;
-    	if(toId == -1) {
-    		value = str.substring(fromId);
-    	}
-    	else {
-    		value = str.substring(fromId, toId);
-    		if(toId < str.length() - 1) {
-    			theRest = str.substring(toId + 1);
-    		}
-    	}
-    	HttpResponse.Cookie cookie = new HttpResponse.Cookie(name, value);
-    	if(theRest != null) {
-    		StringTokenizer tokens = new StringTokenizer(theRest, ";"); //$NON-NLS-1$
-    		while(tokens.hasMoreTokens()) {
-    			String token = tokens.nextToken().trim();
-    			id = token.indexOf('=');
-    			if(id <= 0) continue;
-    			name = token.substring(0, id);
-    			if(id == token.length() - 1) {
-    				value = ""; //$NON-NLS-1$
-    			}
-    			else {
-    				value = token.substring(id + 1);
-    			}
-    			if(name.equalsIgnoreCase("domain")) { //$NON-NLS-1$
-    				cookie.setDomain(value);
-    			}
-    			else if(name.equalsIgnoreCase("path")) { //$NON-NLS-1$
-    				cookie.setPath(value);
-				}
-			}
-        }
-
-    	return cookie;
-    }
-
-    /**
-     * Parses the cookies from the value of request header Cookie
-     * @return an enumeration of HttpResponse.Cookie objects
-     */
-    public static Enumeration parseCookies(String str) {
-    	StringTokenizer tokens = new StringTokenizer(str, ";"); //$NON-NLS-1$
-    	Vector cookies = new Vector();
-    	while(tokens.hasMoreTokens()) {
-    		String token = tokens.nextToken().trim();
-    		int id = token.indexOf('=');
-    		if(id == -1) continue;
-    		String name = token.substring(0, id);
-    		String value = ""; //$NON-NLS-1$
-    		if(id < token.length() - 1) {
-    			value = token.substring(id + 1);
-    		}
-    		if(DEBUG) System.out.println(name+"="+value); //$NON-NLS-1$
-    		cookies.addElement(new HttpResponse.Cookie(name, value));
-    	}
-    	return cookies.elements();
-    }
-
-    public static String toCookieString(Enumeration cookies) {
-		StringBuffer strBuf = new StringBuffer();
-		while(cookies.hasMoreElements()) {
-			HttpResponse.Cookie cookie = (HttpResponse.Cookie)cookies.nextElement();
-			strBuf.append(cookie.getName()).append('=').append(cookie.getValue()).append("; "); //$NON-NLS-1$
-		}
-		return strBuf.toString();
-    }
-
-	/**
-	* This utility method is for converting from
-	* a MIME format called "<code>x-www-form-urlencoded</code>"
-	* to a <code>String</code>
-	* <p>
-	* To convert to a <code>String</code>, each character is examined in turn:
-	* <ul>
-	* <li>The ASCII characters '<code>a</code>' through '<code>z</code>',
-	* '<code>A</code>' through '<code>Z</code>', and '<code>0</code>'
-	* through '<code>9</code>' remain the same.
-	* <li>The plus sign '<code>+</code>'is converted into a
-	* space character '<code>&nbsp;</code>'.
-	* <li>The remaining characters are represented by 3-character
-	* strings which begin with the percent sign,
-	* "<code>%<i>xy</i></code>", where <i>xy</i> is the two-digit
-	* hexadecimal representation of the lower 8-bits of the character.
-	* </ul>
-	*
-	*/
-    public static String urlDecode(String s) throws Exception {
-        StringBuffer sb = new StringBuffer();
-        for(int i=0; i<s.length(); i++) {
-            char c = s.charAt(i);
-            switch (c) {
-                case '+':
-                    sb.append(' ');
-                    break;
-                case '%':
-                    try {
-                        sb.append((char)Integer.parseInt(
-                                        s.substring(i+1,i+3),16));
-                    }
-                    catch (NumberFormatException e) {
-                        throw new IllegalArgumentException();
-                    }
-                    i += 2;
-                    break;
-                default:
-                    sb.append(c);
-                    break;
-            }
-        }
-        // Undo conversion to external encoding
-        String result = sb.toString();
-        byte[] inputBytes = result.getBytes("8859_1"); //$NON-NLS-1$
-        return new String(inputBytes);
-    }
-
-    public static void main(String[] args) throws Exception {
-    	//System.out.println(doGet(args[0], null, 0));
-    	String url = args[0];
-    	String uid = args[1];
-    	String email = args[2];
-    	Properties data = new Properties();
-    	data.put("uid", uid); //$NON-NLS-1$
-    	data.put("email", email); //$NON-NLS-1$
-    	System.out.println(doPost(url, null, data, 0));
-	}
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/TimeoutHandler.java b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/TimeoutHandler.java
deleted file mode 100644
index ffcdeb5..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/TimeoutHandler.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.publishing.util.http;
-
-interface TimeoutHandler {
-    void setTimeout(int timeout);
-}
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/package.html b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/package.html
deleted file mode 100644
index 74dcf80..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/http/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for checking external links in a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/package.html b/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/package.html
deleted file mode 100644
index 04a5e23..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for the publishing service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/PublishedBookmarks.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/PublishedBookmarks.xsl
deleted file mode 100644
index 6c43171..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/PublishedBookmarks.xsl
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	indent="yes"/>
-<!-- this mess up the layout. disable it before the layout csss is fixed.
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
--->
-
-	<xsl:param name="whereAmIText"/>
-	<xsl:param name="treeSetsText"/>
-	<xsl:template match="Bookmarks">
-	
-<xsl:text disable-output-escaping="yes">
-	<![CDATA[
-<!--
-	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
--->
-]]>
-</xsl:text>
-
-
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<style type="text/css">
-body {
-        background-color: #ffffff;
-        font-family: arial, helvetica, sans-serif;
-        font-size: 10pt;
-        margin-left: 0px;
-        margin-right: 0px;
-        margin-top: 0px;
-        margin-bottom: 0px;
-        text-decoration: none;
-}
-
-td.menu {
-        background:#006699;
-}
-
-span.menu {
-        cursor : hand;
-        font-size: 8pt;
-        color: #ffffff;
-        white-space:nowrap;
-        padding-right: 0.5em;
-        border-right: 2px solid #ffffff;
-}
-
-span.menu img {
-        vertical-align: middle;
-}
-
-td.tab {
-        background:#ffffff;
-        padding-top: 1px;
-        padding-bottom: 1px;
-}
-
-span.tab, span.selectedTab {
-	cursor: pointer;
-        font-size: 10pt;
-        white-space:nowrap;
-        line-height: 1.4em;
-}
-
-span.tab {
-        background:#c0c0c0;
-        border-top:   1px solid #666666;
-        border-right: 1px solid #666666;
-        border-left:  1px solid #666666;
-}
-
-span.selectedTab {
-        background:#e0e0e0;
-        border-top:   1px solid #a0a0a0;
-        border-right: 1px solid #a0a0a0;
-        border-left:  1px solid #a0a0a0;
-}
-
-td.tree {
-        border-top: 1px solid #999999;
-}
-</style>
-				<script type="text/javascript" src="bookmarkviews.js">
-</script>
-				<script>
-function checkKey(e, func) {
-        if (window.event) {
-                key = window.event.keyCode;
-                target = window.event.srcElement;
-        } else if (e) {
-                key = e.which;
-                target = e.target;
-        }
-
-        if (key==13 || key==32) {
-                func(target);
-        }
-}
-</script>
-			</head>
-			<body marginheight="0" marginwidth="0" onload="init();">
-				<table cellspacing="1px" cellpadding="0px" border="0" height="100%" width="100%">
-					<!-- add the tab menus -->
-					<tr>
-						<td class="menu">
-							<xsl:text>
-</xsl:text>
-							<span class="menu" tabindex="1" onclick="whereAmI();" onkeypress="checkKey(event, whereAmI);">
-								<img alt="" title="" src="images/ni_where.gif"/>
-								<xsl:value-of select="$whereAmIText"/>
-							</span>
-							<xsl:text>
-</xsl:text>
-							<span class="menu" tabindex="1" onclick="togViews();" onkeypress="checkKey(event, togViews);">
-								<img alt="" title="" src="images/action_unhide.gif"/>
-								<xsl:value-of select="$treeSetsText"/>
-							</span>
-							<xsl:text>
-</xsl:text>
-						</td>
-					</tr>
-					<!-- load the tabs -->
-					<tr>
-						<td class="tab">
-							<xsl:text>
-</xsl:text>
-							<xsl:for-each select="Bookmark">
-								<xsl:variable name="pos">
-									<xsl:value-of select="position()-1"/>
-								</xsl:variable>
-								<span class="tab" id="tab{$pos}" tabindex="1" onkeypress="checkKey(event, displayTree);" onclick="displayTree(this);">
-									<xsl:attribute name="url"><xsl:value-of select="@url"/></xsl:attribute>
-									<xsl:attribute name="isDefaultView"><xsl:value-of select="@default"/></xsl:attribute>&#160;<xsl:value-of select="@tabName"/>&#160;</span>
-								<xsl:text>
-</xsl:text>
-							</xsl:for-each>
-						</td>
-					</tr>
-					<!-- placeholder for the content tree -->
-					<tr height="100%">
-						<td class="tree">
-							<iframe name="ory_toc" title="" style="visibility:visible" tabindex="1" frameborder="no" width="100%" height="100%" scrolling="auto"/>
-						</td>
-					</tr>
-				</table>
-			</body>
-		</html>
-	</xsl:template>
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/PublishingReport.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/PublishingReport.xsl
deleted file mode 100644
index cf90964..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/PublishingReport.xsl
+++ /dev/null
@@ -1,201 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:param name="selectedConfigurationText"/>
-<xsl:param name="detailInfoText"/>
-<xsl:param name="showErrorText"/>
-<xsl:param name="logsWarningText"/>
-<xsl:param name="pagesNotInstalledText"/>
-<xsl:param name="invalidExternalText"/>
-<xsl:param name="nonExistingText"/>
-<xsl:param name="missingReferencesTitleText"/>
-<xsl:param name="missingReferencesText"/>
-<xsl:param name="missingResourceFilesTitleText"/>
-<xsl:param name="missingResourceFilesText"/>
-<xsl:param name="missingResourceText"/>
-<xsl:param name="ownerResourceText"/>
-<xsl:param name="ownerElementText"/>
-<xsl:param name="missingElementText"/>
-<xsl:param name="invalidElementText"/>
-<xsl:param name="invalidElementLinksText"/>
-<xsl:param name="pleaseCheckText"/>
-<xsl:param name="pleaseFindText"/>
-<xsl:param name="publishingReportText"/>
-<xsl:param name="summaryText"/>
-<xsl:param name="infoText"/>
-
-
-<xsl:template match="PublishingReport">
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-<head>
-<link type="text/css" href="./../css/default.css" rel="StyleSheet"/>
-<script src="./../scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script>
-<script src="./../scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script>
-<script src="./../scripts/contentPage.js" type="text/javascript" language="JavaScript"></script>
-<script type="text/javascript" language="JavaScript">
-					backPath = '../';
-					imgPath = '../images/';
-					var nodeInfo=null;
-					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
-				</script>
-</head>
-
-<body>
-<h2><xsl:value-of select="$publishingReportText"/></h2>
-
-<div class="sectionHeading"><xsl:value-of select="$summaryText"/></div>
-<div align="left">
-<p/><xsl:value-of select="$selectedConfigurationText"/>:<p/>
-
-<b>
-<xsl:value-of select="pubDir/@path"/>
-</b>
-
-<p/>
-
-<xsl:value-of select="$detailInfoText"/>:
-<ul>
-<li>
-<a>
-<xsl:attribute name="href">
-<xsl:value-of select="errorLog/@path"/>
-</xsl:attribute>
-<xsl:value-of select="errorLog/@name"/>
-</a>
- - <xsl:value-of select="$showErrorText"/> </li>
-<li>
-<a>
-<xsl:attribute name="href">
-<xsl:value-of select="warningLog/@path"/>
-</xsl:attribute>
-<xsl:value-of select="warningLog/@name"/>
-</a>
- - <xsl:value-of select="$logsWarningText"/> </li>
-</ul>
-
-<xsl:value-of select="$pagesNotInstalledText"/>
-
-</div>
-
-
-<xsl:if test="validatorInfo/invalidExternalLinks">
-<div class="sectionHeading"><xsl:value-of select="$invalidExternalText"/>:</div>
-<div align="left">
-<p/>
-<table class="sectionTable">
-	<tbody>
-		<tr>
-			<th>Url</th><th><xsl:value-of select="$ownerElementText"/></th><th><xsl:value-of select="$infoText"/></th>
-		</tr>
-		<xsl:for-each select="validatorInfo/invalidExternalLinks/entry">
-		<tr>
-			<td><xsl:value-of select="@url"/></td>
-			<td><xsl:value-of select="@owner"/></td>
-			<td><xsl:value-of select="@message"/>&#160;</td>
-		</tr>
-	</xsl:for-each>
-	</tbody>
-</table>
-</div>
-</xsl:if>
-
-<xsl:if test="validatorInfo/invalidReferences and count(validatorInfo/invalidReferences/entry) > 0">
-
-<div class="sectionHeading"><xsl:value-of select="$invalidElementLinksText"/>:</div>
-<div align="left">
-<p/>
-<xsl:value-of select="$nonExistingText"/><br/>
-<xsl:value-of select="$pleaseFindText"/>
-<p/>
-<table class="sectionTable">
-	<tbody>
-		<tr>
-			<th><xsl:value-of select="$invalidElementText"/></th><th><xsl:value-of select="$ownerElementText"/></th>
-		</tr>
-		<xsl:for-each select="validatorInfo/invalidReferences/entry">
-		<tr>
-			<td><xsl:value-of select="@element"/> (<xsl:value-of select="@guid"/>)</td>
-			<td><xsl:value-of select="@owner"/></td>
-		</tr>
-	</xsl:for-each>
-	</tbody>
-</table>
-</div>
-</xsl:if>
-
-
-<xsl:if test="validatorInfo/missingReferences and count(validatorInfo/missingReferences/entry) > 0">
-
-<div class="sectionHeading"> <xsl:value-of select="$missingReferencesTitleText"/>:</div>
-<div align="left">
-<p/>
-<xsl:value-of select="$missingReferencesText"/><br/>
-<xsl:value-of select="$pleaseCheckText"/>
-<p/>
-<table class="sectionTable">
-	<tbody>
-		<tr>
-			<th><xsl:value-of select="$missingElementText"/></th><th><xsl:value-of select="$ownerElementText"/></th>
-		</tr>
-		<xsl:for-each select="validatorInfo/missingReferences/entry">
-		<tr>
-			<td><xsl:value-of select="@element"/></td>
-			<td><xsl:value-of select="@owner"/></td>
-		</tr>
-	</xsl:for-each>
-	</tbody>
-</table>
-</div>
-</xsl:if>
-
-<xsl:if test="validatorInfo/missingResources and count(validatorInfo/missingResources/entry) > 0">
-
-<div class="sectionHeading"><xsl:value-of select="$missingResourceFilesTitleText"/>:</div>
-<div align="left">
-<p/>
-<xsl:value-of select="$missingResourceFilesText"/><br/>
-<p/>
-<table class="sectionTable">
-	<tbody>
-		<tr>
-			<th><xsl:value-of select="$missingResourceText"/></th><th><xsl:value-of select="$ownerResourceText"/></th><th><xsl:value-of select="$ownerElementText"/></th>
-		</tr>
-		<xsl:for-each select="validatorInfo/missingResources/entry">
-		<tr>
-			<td><xsl:value-of select="@url"/></td>
-			<td><xsl:value-of select="@resource"/></td>
-			<td><xsl:value-of select="@owner"/></td>
-		</tr>
-	</xsl:for-each>
-	</tbody>
-</table>
-</div>
-</xsl:if>
-
-
-</body>
-<script type="text/javascript" language="JavaScript">
-				contentPage.onload();
-</script>
-</html>
-
-
-</xsl:template>
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/bookmark.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/bookmark.xsl
deleted file mode 100644
index bfec1f3..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/bookmark.xsl
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-	<xsl:template match="/Element">
-		<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<head>
-				<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-				<title>Contents</title>
-				<style type="text/css">
-/*******************************************************************************
- * Copyright (c) 2000, 2004, 2005 IBM Corporation. All Rights Reserved. 
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-* {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 9pt;
-	margin: 0;
-	padding: 0;
-}
-
-BODY {
-	background-color: Window;
-	font: icon;
-	margin:0;
-	padding:0;
-	border:0;
-}
-
-UL {
-	border-width:0;
-	margin-left:15px;
-}
-
-#root {
-	margin-top:5px;
-	margin-left:5px;
-}
-
-UL.expanded {
-	display:block;
-}
-
-UL.collapsed {
-	display: none;
-}
-
-LI {
-	margin-top:3px;
-	list-style-image:none;
-	list-style-type:none;
-		white-space: nowrap;
-}
-
-IMG {
-	vertical-align: top;
-	border:0px;
-	margin:0px;
-	padding:0px;
-	margin-right:4px;
-}
-
-
-A {
-	text-decoration:none;
-	color:#258
-	padding-right:2px;
-	/* this works in ie5.5, but not in ie5.0  */
-	white-space: nowrap;
-}
-
-A:hover{
-	text-decoration:underline;
-}
-
-A.active{
-	background:Highlight;
-	color:HighlightText;
-	width:100%;
-}
-
-A.active:hover{
-	text-decoration:underline;
-	background:Highlight;
-	color:HighlightText;
-	width:100%;
-}
-
-
-
-.h {
-	visibility:hidden;
-}
-
-</style>
-				<base target="ory_doc"/>
-				<script language="JavaScript">
-
-// Preload images
-minus = new Image();
-minus.src = "images"+"/minus.gif";
-plus = new Image();
-plus.src = "images"+"/plus.gif";
-altTopicClosed = "Topic\u0020closed";
-altTopicOpen = "Topic\u0020open";
-</script>
-				<script language="JavaScript" src="toc.js"/>
-				<script language="JavaScript" src="tree.js"/>
-			</head>
-			<body dir="ltr" onload="setLoaded();">
-				<ul dir="ltr" class="expanded" id="root">
-					<xsl:call-template name="processNode">
-						<xsl:with-param name="node" select="Element"/>
-						<xsl:with-param name="parentId" select="''"/>
-					</xsl:call-template>
-				</ul>
-			</body>
-		</html>
-	</xsl:template>
-	<xsl:template name="processNode">
-		<xsl:param name="node"/>
-		<xsl:param name="parentId"/>
-		<xsl:for-each select="$node">
-			<xsl:variable name="name">
-				<xsl:value-of select="@name"/>
-			</xsl:variable>
-			<xsl:variable name="id">
-				<xsl:value-of select="@nodeId"/>
-			</xsl:variable>
-			<xsl:variable name="guid">
-				<xsl:value-of select="@guid"/>
-			</xsl:variable>
-			<xsl:variable name="iconurl">./images/<xsl:value-of select="@closedIconName"/>
-			</xsl:variable>
-			<xsl:variable name="url">./../<xsl:value-of select="@url"/>
-			</xsl:variable>
-			<li>
-				<xsl:choose>
-					<xsl:when test="count(Element) > 0 ">
-						<img src="images/plus.gif" class="collapsed" alt="" title=""/>
-					</xsl:when>
-					<xsl:otherwise>
-						<!-- <span style="width:12"></span> -->
-						<img src="images/noplus.gif" class="collapsed" alt="" title=""/>
-					</xsl:otherwise>
-				</xsl:choose>
-				<a id="{$id}" parentId="{$parentId}" guid="{$guid}" href="{$url}">
-					<img src="{$iconurl}" alt="" title=""/>
-					<xsl:value-of select="$name"/>
-				</a>
-				<xsl:if test="count(Element) > 0 ">
-					<ul class="collapsed">
-						<xsl:call-template name="processNode">
-							<xsl:with-param name="node" select="Element"/>
-							<xsl:with-param name="parentId" select="$id"/>
-						</xsl:call-template>
-					</ul>
-				</xsl:if>
-			</li>
-		</xsl:for-each>
-	</xsl:template>
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/elementUrls.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/elementUrls.xsl
deleted file mode 100644
index 14d2859..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/elementUrls.xsl
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
-<xsl:output omit-xml-declaration="yes"/>
-
-<xsl:template match="/ElementUrls">
-<xsl:for-each select="elementUrl">contentPage.processPage.elementUrls["<xsl:value-of select="@nodeId"/>"] = ["<xsl:value-of select="@text"/>","<xsl:value-of select="@url"/>"];
-</xsl:for-each>		
-</xsl:template>
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary.xsl
deleted file mode 100644
index 72add4e..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary.xsl
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:param name="title"/>
-<xsl:param name="glossaryText"/>
-
-<xsl:template match="Glossary">
-
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<title><xsl:value-of select="$glossaryText"/> - <xsl:value-of select="$title"/></title>
-</head>
-<body text="#000000" bgcolor="#ffffff">
-<font face="Arial, Helvetica, sans-serif">
-<dl>
-
-<xsl:for-each select="item">
-<dt>
-<b>
-<a>
-<xsl:attribute name="id">_GLOSSARY_ITEM_<xsl:value-of select="@name"/></xsl:attribute>
-<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@presentationName"/>
-</a>
-</b>
-</dt>
-
-<dd>
-<xsl:value-of disable-output-escaping="yes" select="@content"/>	
-</dd>
-</xsl:for-each>
-
-</dl>
-</font>
-</body>
-</html>
-
-</xsl:template>
-	
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary_index.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary_index.xsl
deleted file mode 100644
index d82ec87..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary_index.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:param name="title"/>
-<xsl:param name="glossaryText"/>
-
-<xsl:template match="Glossary">
-
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<meta name="meta_tagged" content="true"/>
-<title><xsl:value-of select="$glossaryText"/> - <xsl:value-of select="$title"/></title>
-</head>
-<frameset rows="25,*">
-<frame name="glossary_nav" src="navig.htm" scrolling="auto" marginheight="2" marginwidth="2" title="Navigation Area"/>
-<frame name="glossary_doc" src="../glossary.htm" marginheight="0" marginwidth="2" scrolling="auto" title="Content Area"/>
-</frameset>
-</html>
-
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary_navig.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary_navig.xsl
deleted file mode 100644
index a6476a8..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/glossary_navig.xsl
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:param name="title"/>
-<xsl:param name="glossaryText"/>
-
-<xsl:template match="Glossary">
-
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<title><xsl:value-of select="$glossaryText"/> - <xsl:value-of select="$title"/></title>
-</head>
-<body text="#000000" bgcolor="#ffffff">
-<font face="Arial, Helvetica, sans-serif"><xsl:text>
-</xsl:text>
-<xsl:for-each select="item[@navigation-mark='true']">
-<a  target="glossary_doc">
-<xsl:attribute name="href">../glossary.htm#<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@presentationName"/></a><xsl:text>
-</xsl:text>
-</xsl:for-each>
-</font>
-</body>
-</html>
-
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/index.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/index.xsl
deleted file mode 100644
index 60b9df4..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/index.xsl
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:template match="/PublishingOption">
-
-<xsl:variable name="title"><xsl:value-of select="@title"/></xsl:variable>
-
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-
-<head>
-<title><xsl:value-of select="$title"/></title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<meta name="meta_tagged" content="true"/>
-
-<!-- include additional meta tags if any -->
-<xsl:for-each select="metaTags/metaTag">
-<meta>
-<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
-<xsl:attribute name="content"><xsl:value-of select="@content"/></xsl:attribute>
-</meta>
-</xsl:for-each>
-
-<script language="JavaScript">
-<![CDATA[
-<!--
-var tour = 0;
-
-function getCookie (name) 
-{
-  var dcookie = document.cookie; 
-  var cname = name + "=";
-  var clen = dcookie.length;
-  var cbegin = 0;
-  while (cbegin < clen) 
-  {
-    var vbegin = cbegin + cname.length;
-    if (dcookie.substring(cbegin, vbegin) == cname) 
-    { 
-      var vend = dcookie.indexOf (";", vbegin);
-      if (vend == -1) 
-      {
-        vend = clen;
-      }
-      return unescape(dcookie.substring(vbegin, vend));
-    }
-
-    cbegin = dcookie.indexOf(" ", cbegin) + 1;
-    if (cbegin == 0) 
-    {
-      break;
-    }
-  }
-  return null;
- }
-
-function fixUrl(url)
-{
-	if ( url == null )
-	{
-		return null;
-	}
-
-	var indx = url.indexOf("file:///");
-	if ( indx >=0 )
-	{
-		url = url.substring(indx+8, url.length);
-	}
-	else
-	{
-		indx = url.indexOf("file://");
-		if ( indx >=0 )
-		{
-			url = url.substring(indx+7, url.length);
-		}
-	}
-
-	url = url.replace(/\\/g, "/");
-
-   return unescape(url);
-}
-
-// -->
-]]>
-</script>
-</head>
-<script language="JavaScript">
-var bannerheight = 21 + <xsl:value-of select="@bannerImageHeight"/>;
-<xsl:choose>
-	<xsl:when test="@useApplet='true'">
-var toc_frame = "ory_toc";
-var toc_url = "applet/myruptree.htm";
-var default_page_url = "spscreen.htm";
-	</xsl:when>
-	<xsl:otherwise>
-var toc_frame = "ory_toc_frame";
-var toc_url = "noapplet/PublishedBookmarks.html";
-var default_page_url = getCookie("rup_ory_doc");
-if ( default_page_url == null )
-{
-	default_page_url = "about:blank";
-}
-	</xsl:otherwise>
-</xsl:choose>
-<![CDATA[
-  if((navigator.appName == "Netscape" && parseInt(navigator.appVersion) >= 4 ) || 
-      (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) >= 4 ))
-  {
-    document.write("  <frameset  frameborder=\"0\" framespacing=\"1\" border=\"1\" rows=\"" + bannerheight + ",*\">\n");
-    document.write("    <frame src=\"topnav.htm\" noresize name=\"ory_button\" frameborder=\"0\" scrolling=\"no\" marginheight=\"0\" marginwidth=\"0\">\n");
-    document.writeln("<frameset cols=\"205,*\" frameborder=\"1\" framespacing=\"1\" border=\"1\" >\n");
-    document.write("      <frame src=\"" + toc_url + "\" name=\"" + toc_frame + "\" frameborder=\"1\" scrolling=\"no\">\n");
-    document.writeln("<frame name=\"ory_doc\" src=\"" + default_page_url + "\"  frameborder=\"0\" scrolling=\"yes\">\n");
-    document.writeln("   </frameset>");
-    document.writeln("   </frameset>");
-
-  }
-  else
-  {
-    parent.location = "applet/browser.htm";
-  }
-]]>
-
-  </script>
-
-<body>
-<table border="0" cellpadding="0" cellspacing="0" width="100%">
-  <tr>
-    <td valign="top">
-      <br/>
-      <br/>
-	</td>
-    <td valign="top" width="24"></td>
-    <td valign="top" width="1%">
-      <p>&#160;</p>
-    </td>
-  </tr>
-</table>
-
-
-</body>
-
-</html>
-
-
-</xsl:template>
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/index_contents.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/index_contents.xsl
deleted file mode 100644
index 58dd0a8..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/index_contents.xsl
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:param name="title"/>
-
-<xsl:template match="Index">
-		
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<link rel="StyleSheet" href="index.css" type="text/css" />
-<title>Index - <xsl:value-of select="$title"/></title>
-</head>
-<body bgcolor="#FFFFFF" text="#000000" link="#004080" vlink="#8000FF" alink="#0000FF">
-<xsl:for-each select="item">
-<xsl:choose>
-	<xsl:when test="@navigation-mark='true' ">
-	<P CLASS="indexheading">
-	<a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@presentationName"/></a>
-   </P>
-	</xsl:when>
-	<xsl:otherwise>
-	<P CLASS="indexlevel1">
-	<a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@presentationName"/></a>
-   </P>
-   <P CLASS="indexlevel2">&#160;&#160;&#160;&#160;&#160;&#160;
-   <a TARGET="ory_doc">
-   <xsl:attribute name="href"><xsl:value-of select="@url" /></xsl:attribute>
-	<xsl:value-of disable-output-escaping="yes" select="@content"/></a></P>
-	</xsl:otherwise>
-</xsl:choose>
-</xsl:for-each>
-</body>
-</html>
-
-</xsl:template>
-	
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/index_navig.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/index_navig.xsl
deleted file mode 100644
index 6eda749..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/index_navig.xsl
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:param name="title"/>
-
-<xsl:template match="Index">
-
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<title>Glossary - <xsl:value-of select="$title"/></title>
-</head>
-<body text="#000000" bgcolor="#ffffff">
-<font face="Arial, Helvetica, sans-serif"><xsl:text>
-</xsl:text>
-<xsl:for-each select="item[@navigation-mark='true']">
-<a  target="keyword_t">
-<xsl:attribute name="href">contents.htm#<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@presentationName"/></a><xsl:text>
-</xsl:text>
-</xsl:for-each>
-</font>
-</body>
-</html>
-
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/resources.properties b/1.5/plugins/org.eclipse.epf.publishing/xsl/resources.properties
deleted file mode 100644
index ac518a8..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/resources.properties
+++ /dev/null
@@ -1,55 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-# The UI text in the XSL stylesheets.
-
-selectedConfigurationText=The Selected configuration is published to the following location
-detailInfoText=Detail information is logged into the following files in the logs folder
-showErrorText=show any error occurred during publishing.
-logsWarningText=logs all warning messages such as missing references, broken links, and unpublished categories with no categorized elements.
-pagesNotInstalledText=In the pages_not_installed folder, you will find all of the missing references in this configuration.
-invalidExternalText=Invalid external links identified in the configuration
-ownerElementText=Owner Element
-nonExistingText=The owner elements refer to non-existing elements. Maybe the elements were deleted from the library after the element links were created. Please find the owner elements and fix these invalid references.
-missingReferencesTitleText=Missing References
-missingReferencesText=The owner elements refer to  missing elements  in the selected configuration. Please check the configuration closure and fix the missing references.                   
-missingResourceFilesTitleText=Missing Resource Files
-missingResourceFilesText=The owner elements refer to missing resource files. Those resource files are referenced in the elements' content or in the associated attachments.
-missingResourceText=Missing Resource
-ownerResourceText=Owner Resource
-missingElementText=Missing Element
-invalidElementText=Invalid Element
-invalidElementLinksText=Invalid Element Links
-pleaseCheckText=Please check the configuration closure and fix the missing references.
-pleaseFindText=Please find the owner elements and fix these invalid references.
-glossaryText=Glossary
-indexText=Index
-feedbackText=Feedback
-aboutText=About
-searchText=Search
-printText=Print
-summaryText=Summary
-publishingReportText=Publishing Report:
-whereAmIText=Where am I
-treeSetsText=Tree Sets
-
-searchTitleText=Process Search
-label1Text=
-label2Text=
-label3Text=
-lable4Text=
-searchButtonText=Search
-searchExpressionText=* = any string, ? = any character, "" = phrase, AND, OR, NOT = boolean operators
-
-detailsText=Details
-infoText=Info
-messgeText=Message
-descriptionText=Description
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/search.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/search.xsl
deleted file mode 100644
index 9206587..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/search.xsl
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2007 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:param name="searchTitleText"/>
-<xsl:param name="label1Text"/>
-<xsl:param name="label2Text"/>
-<xsl:param name="label3Text"/>
-<xsl:param name="lable4Text"/>
-<xsl:param name="searchButtonText"/>
-
-<xsl:template match="/Search">
-	<xsl:variable name="webAppName"><xsl:value-of select="@webAppName"/></xsl:variable>
-	<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-		<head>
-		<title><xsl:value-of select="$searchTitleText"/></title>
-		<link rel="StyleSheet" href="./../css/default.css" type="text/css"/>
-		<script type="text/javascript" language="JavaScript">
-		<![CDATA[
-		
-			// should not hard code the web app name here, user can change the app name
-			//var webAppName= '<xsl:value-of select="$webAppName"/>';
-			
-			// the openenr is the topnav
-			// this method is defined in topnav.js
-			var baseUrl = window.opener.getBaseUrl();
-
-			function createRequest() {
-     			try {
-       				request = new XMLHttpRequest();
-    	 		} catch (tryMs) {
-	       			try {
-         				request = new ActiveXObject("Msxml2.XMLHTTP");
-      				} catch (otherMs) {
-        	 			try {
-    	       				request = new ActiveXObject("Microsoft.XMLHTTP");
-	         			} catch (failed) {
-           					request = null;
-         				}
-       				}
-     			}
-			}
-
-		   	function doSearch() {
-		   		var searchString = document.searchForm.searchInput.value;
-		   		var resultsPerPage = document.searchForm.searchScopeSizePerPage.value;
-		   		var url = baseUrl + "\/SearchServlet?searchString=" + encodeURIComponent(searchString) + "&hitsPerPage=" + resultsPerPage;
-     			createRequest();
-     			request.open("GET", makeUnique(url), true);
-     			request.onreadystatechange = updatePage;
-     			request.send(null);    			   			   
-  			}
-
-			function updatePage() {
-    			if (request.readyState == 4) {
-    				var rDiv = document.getElementById("container");
-					if (rDiv != null) 
-						rDiv.parentNode.removeChild(rDiv);
-      				rDiv = document.createElement("div");
-      				rDiv.setAttribute("id", "container");
-					rDiv.innerHTML = request.responseText;
-					var resultsContainer = document.getElementById("results");
-					resultsContainer.appendChild(rDiv);
-    			}    			
-  			}
-  			
-  			function getPrevNextPage(url) {				
-				createRequest();
-
-     			request.open("GET", makeUnique(url), true);
-     			request.onreadystatechange = updatePage;
-     			request.send(null);				
-			}
-			
-			function makeUnique(url) {
-				// note some browser such as IE will try to determine if the cached page is up to date or not,
-				// and may not issue a request for the same url
-				// for example, if you use the same url to get next or previous page, 
-				// the subsequent calls for next or previous will not be executed.
-				// you need to set the Last Modified header to make sure the content is loaded.
-				// to avoid this problem, we allways issue a different url by appending the request time
-				
-				var t = new Date().getTime();
-				url = url + "&timeRequested=" + t;
-
-				return url;
-			}
-				]]>
-		</script>
-		</head>
-		<body bgcolor="#FFFFFF">
-			<form id="searchForm" name="searchForm" action="javascript:doSearch();" >
-				<table border="0" cellspacing="0" cellpadding="0" align="left">
-					<tr>
-						<td>
-							<input ucfirst="false" trim="true" value="" name="searchString" type="text" id="searchInput"/>
-						</td>
-						<td>
-							<input value="Search" caption="" style="vertical-align:middle" id="searchButton" type="button"  onClick="doSearch(); return false;"/>
-						</td>
-						<td>
-							<select name="searchScopeSizePerPage" id="searchScopeSizePerPage" onChange="doSearch(); return false;">
-								<option selected="selected" value="10">10</option>
-								<option value="20">20</option>
-								<option value="50">50</option>
-								<option value="100">100</option>
-								<option value="200">200</option>
-							</select>
-						</td>
-					</tr>
-				</table>
-			</form>
-			<br/><br/>
-			<div id="results"></div>			
-		</body>
-	</html>
-</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.publishing/xsl/topnav.xsl b/1.5/plugins/org.eclipse.epf.publishing/xsl/topnav.xsl
deleted file mode 100644
index 71c211f..0000000
--- a/1.5/plugins/org.eclipse.epf.publishing/xsl/topnav.xsl
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
-
-<xsl:output method="html" version="1.0" encoding="UTF-8" 
-	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
-	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
-	indent="yes"/>
-	
-<xsl:param name="glossaryText"/>
-<xsl:param name="indexText"/>
-<xsl:param name="feedbackText"/>
-<xsl:param name="aboutText"/>
-<xsl:param name="searchText"/>
-<xsl:param name="printText"/>
-
-
-<xsl:template match="/PublishingOption">
-
-<xsl:variable name="title"><xsl:value-of select="@title"/></xsl:variable>
-<xsl:variable name="bannerImage"><xsl:value-of select="@bannerImage"/></xsl:variable>
-<xsl:variable name="bannerImageHeight"><xsl:value-of select="@bannerImageHeight"/></xsl:variable>
-<xsl:variable name="allowAppletSearch"><xsl:value-of select="@allowAppletSearch"/></xsl:variable>
-<xsl:variable name="showGlossary"><xsl:value-of select="@showGlossary"/></xsl:variable>
-<xsl:variable name="showIndex"><xsl:value-of select="@showIndex"/></xsl:variable>
-<xsl:variable name="feedbackUrl"><xsl:value-of select="@feedbackUrl"/></xsl:variable>
-<xsl:variable name="serverSideSearch"><xsl:value-of select="@serverSideSearch"/></xsl:variable>
-
-<html>
-			<xsl:attribute name="lang"><xsl:value-of select="@lang"/></xsl:attribute>
-			<xsl:attribute name="xml:lang"><xsl:value-of select="@lang"/></xsl:attribute>
-<head>
-<title><xsl:value-of select="$title"/></title>
-
-<script language="javascript" src="scripts/common.js" type="text/javascript"></script>
-<script language="JavaScript" src="scripts/scripts.js" type="text/javascript"></script>
-<script language="JavaScript" src="scripts/topnav.js" type="text/javascript"></script>
-<script type="text/javascript" language="JavaScript">
-var feedback_url= '<xsl:value-of select="$feedbackUrl"/>';
-</script>
-<style type="text/css">
-
-.banner {
-	background-color: #999999;
-	background-image: url('images/<xsl:value-of select="$bannerImage"/>');
-	background-repeat: no-repeat;
-	width: 100%;
-	height: <xsl:value-of select="$bannerImageHeight"/>px;
-}
-.topbardivider { 
-	 background-color: #d0d0d0 
- }
-</style>
-
-</head>
-
-<body marginheight="0" marginwidth="0">
-
- <form action="#" name="formTopframe">
-  <table class="banner" border="0" cellspacing="0" cellpadding="0" >
-    <tr>
-	  <td>
-       <table border="0" cellspacing="0" cellpadding="0" align="right" summary="">
-          <tr>
-			  <xsl:if test="$showGlossary='true' ">
-   			<td><a href="JavaScript:openGlossary();" class="toprightnav"><img src="./images/ni_glossary.gif" width="18" height="10" border="0" alt="{$glossaryText}" title="{$glossaryText}" /></a></td>
-			<td nowrap="nowrap"><a href="JavaScript:openGlossary();" class="toprightnav"><xsl:value-of select="$glossaryText"/></a></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title="" /></td>
-            <td class="topbardivider"><img src="./images/shim.gif" width="1" height="11" alt="" title="" /></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title="" /></td>                  
-			</xsl:if>
-			<xsl:if test="$showIndex='true' ">
-  			<td><a href="javascript:openIndex();" class="toprightnav">
-			<img src="./images/ni_index.gif" width="17" height="9" border="0" alt="{$indexText}" title="{$indexText}" /></a></td>
-            <td nowrap="nowrap"><a href="javascript:openIndex();" class="toprightnav"><xsl:value-of select="$indexText"/></a></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title=""/></td>
-            <td class="topbardivider"><img src="./images/shim.gif" width="1" height="11" alt="" title=""/></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title=""/></td>
-          </xsl:if>
-
-			<td><a href="JavaScript:sendFeedback(feedback_url);" class="toprightnav">
-			<img src="./images/ni_feedback.gif" width="18" height="10" border="0" alt="{$feedbackText}" title="{$feedbackText}"/></a></td>
-            <td nowrap="nowrap">
-				<a href="JavaScript:sendFeedback(feedback_url);" class="toprightnav"><xsl:value-of select="$feedbackText"/></a></td>
-            
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title=""/></td>
-            <td class="topbardivider"><img src="./images/shim.gif" width="1" height="11" alt="" title=""/></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title=""/></td>
-			<td><a href="javascript:void(null)" class="toprightnav" onclick="javascript:window.open('about.htm','about','height=250,width=250,status=no,resizable=yes');">
-              <img src="./images/ni_about.gif" width="10" height="10" border="0" alt="{$aboutText}" title="{$aboutText}"/></a></td>
-            <td nowrap="nowrap"><a href="javascript:void(null)" class="toprightnav" onclick="javascript:window.open('about.htm','about','height=250,width=250,status=no,resizable=yes');">&#160;<xsl:value-of select="$aboutText"/></a></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title=""/></td>
-          </tr>
-        </table> 
-      </td>
-    </tr>
-  </table>
-  
-  <!-- toolbar goes here -->
-<table border="0" cellspacing="0" cellpadding="0" width="100%">
-    <tr>
-      <td class="topframebg" >
-	  <table border="0" cellspacing="0" cellpadding="0" align="right"  summary="">
-          <tr>
-            <td><img src="./images/shim.gif" width="5" height="20" alt="image" title="image"/></td>
-			<td>
-            <font size="1">
-			</font>
-            </td>
- <xsl:if test="$allowAppletSearch='true' ">
-			<td>&#160;</td>
-            <td nowrap="nowrap" class="headermedlist">&#160;</td>
-			<td><img src="./images/shim.gif" width="5" height="20" alt="image" title="image"/></td>
-            <td nowrap="nowrap" class="headermedlist">&#160;</td>
-			<td><img src="./images/shim.gif" width="10" height="8" alt="" title=""/></td>
-            <td class="topframeshadow"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-            <td class="topframehighlight2"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-            <td><img src="./images/shim.gif" width="10" height="1" alt="" title=""/></td>
-		    <td><a href="JavaScript:openSearch();" class="toprightnav"><img src="./images/ni_search.gif" width="17" height="17" border="0" alt="{$searchText}" title="{$searchText}"/></a></td>
-            <td nowrap="nowrap"><a href="JavaScript:openSearch();"  class="toprightnavgrey"><xsl:value-of select="$searchText"/></a></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title=""/></td>
-            <td><img src="./images/shim.gif" width="10" height="1" alt="" title=""/></td>
-   </xsl:if>
-    <xsl:if test="$serverSideSearch='true' ">
-			<td>&#160;</td>
-            <td nowrap="nowrap" class="headermedlist">&#160;</td>
-			<td><img src="./images/shim.gif" width="5" height="20" alt="image" title="image"/></td>
-            <td nowrap="nowrap" class="headermedlist">&#160;</td>
-			<td><img src="./images/shim.gif" width="10" height="8" alt="" title=""/></td>
-            <td class="topframeshadow"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-            <td class="topframehighlight2"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-            <td><img src="./images/shim.gif" width="10" height="1" alt="" title=""/></td>
-		    <td><a href="JavaScript:openProcessSearch();" class="toprightnav"><img src="./images/ni_search.gif" width="17" height="17" border="0" alt="{$searchText}" title="{$searchText}"/></a></td>
-            <td nowrap="nowrap"><a href="JavaScript:openProcessSearch();"  class="toprightnavgrey"><xsl:value-of select="$searchText"/></a></td>
-            <td><img src="./images/shim.gif" width="5" height="11" alt="" title=""/></td>
-            <td><img src="./images/shim.gif" width="10" height="1" alt="" title=""/></td>
-   </xsl:if>
-            <td class="topframeshadow"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-            <td class="topframehighlight2"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-            <td><img src="./images/shim.gif" width="10" height="1" alt="" title=""/></td>
-            <td><a href="JavaScript:printPage();" class="toprightnav"><img src="./images/ni_print.gif" width="16" height="17" border="0" alt="{$printText}" title="{$printText}"/></a></td>
-            <td nowrap="nowrap"><a href="JavaScript:printPage();"  class="toprightnavgrey"><xsl:value-of select="$printText"/></a></td>
-            <td><img src="./images/shim.gif" width="10" height="1" alt="" title=""/></td>
-          </tr>
-        </table>
-	  </td>
-    </tr>
-    <tr>
-      <td class="topframeshadow" colspan="3"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-    </tr>
-    <tr>
-      <td class="bgblack" colspan="3"><img src="./images/shim.gif" width="1" height="1" alt="" title=""/></td>
-    </tr>
-  </table>
- </form>
-
-</body>
-
-</html>
-
-
-</xsl:template>
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/.classpath b/1.5/plugins/org.eclipse.epf.rcp.ui/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/.project b/1.5/plugins/org.eclipse.epf.rcp.ui/.project
deleted file mode 100644
index 77a1105..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.rcp.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.rcp.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index ddce581..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,27 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.rcp.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.rcp.ui.RCPUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Export-Package: 
- org.eclipse.epf.rcp.ui,
- org.eclipse.epf.rcp.ui.actions,
- org.eclipse.epf.rcp.ui.wizards
-Require-Bundle: org.eclipse.epf.authoring.ui;visibility:=reexport,
- org.eclipse.epf.library.ui,
- org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.emf.edit,
- org.eclipse.ui,
- org.eclipse.ui.ide,
- org.eclipse.ui.intro,
- org.eclipse.help.ui,
- org.eclipse.help.webapp,
- org.eclipse.tomcat,
- org.eclipse.epf.publishing.ui,
- org.eclipse.epf.common.ui
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/about.mappings b/1.5/plugins/org.eclipse.epf.rcp.ui/about.mappings
deleted file mode 100644
index 0b80b3b..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/about.mappings
+++ /dev/null
@@ -1,8 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-# Usually generated at build time.
-
-0=@build-ID@
-1=1.2.0.2
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/build.properties b/1.5/plugins/org.eclipse.epf.rcp.ui/build.properties
deleted file mode 100644
index 771ddbd..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/build.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               plugin.xml,\
-               plugin.properties,\
-               icons/,\
-               plugin_customization.ini,\
-               splash.bmp,\
-               about.mappings,\
-               META-INF/
-               
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/composer.product b/1.5/plugins/org.eclipse.epf.rcp.ui/composer.product
deleted file mode 100644
index 71ca617..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/composer.product
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?pde version="3.1"?>
-
-<product name="Eclipse Process Framework Composer" id="org.eclipse.epf.rcp.ui.composer" application="org.eclipse.epf.rcp.ui.MainApplication" useFeatures="true">
-
-   <aboutInfo>
-      <image path="icons/about.gif"/>
-      <text>
-         %aboutText
-      </text>
-   </aboutInfo>
-
-   <configIni use="default"/>
-
-   <launcherArgs>
-      <programArgs>-data @user.home/EPF/workspace.120M3 -defaultlibrary OpenUP</programArgs>
-      <vmArgs>-Xms64m -Xmx512m</vmArgs>
-   </launcherArgs>
-
-   <windowImages i16="/org.eclipse.epf.rcp.ui/icons/full/obj16/product.gif" i32="/org.eclipse.epf.rcp.ui/icons/full/obj32/product32.gif"/>
-
-   <splash
-      startupProgressRect="0,280,455,15"
-      startupMessageRect="7,220,441,20"
-      startupForegroundColor="C8D5EA" />
-   <launcher name="epf">
-      <solaris/>
-      <win useIco="false">
-         <bmp/>
-      </win>
-   </launcher>
-
-   <plugins>
-   </plugins>
-
-   <features>
-      <feature id="org.eclipse.epf.product.feature" version="1.2.0.qualifier"/>
-   </features>
-
-</product>
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/config/rcp_packaging/config.ini b/1.5/plugins/org.eclipse.epf.rcp.ui/config/rcp_packaging/config.ini
deleted file mode 100644
index 5fb2931..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/config/rcp_packaging/config.ini
+++ /dev/null
@@ -1,58 +0,0 @@
-# Eclipse runtime configuration file
-# This file contains a number of key/value pairs that are merged into the 
-# System properties on system startup.  The values control the way the 
-# runtime is structured and runs.
-
-# Note:  Only platform:/base/ and file: URLs are supported.  In general the 
-# URLs given may include a version number (e.g., .../location_1.2.3).  
-# If a version is not specified, the system binds
-# to the location which matches exactly or to the versioned location with the
-# latest version number.  If a version number is given then only exact matches
-# are considered.
-
-# The URL for the runtime entry point.  The default value is
-# platform:/base/plugins/org.eclipse.osgi 
-#osgi.framework=platform:/base/plugins/org.eclipse.osgi
-
-# The classpath for the framework found at the osgi.framework location.  This 
-# comma-separated list contains either URLs or simple element names.  Simple
-# names are assumed to be relative to the framework's install directory.  
-# Typically this value need not be set as it is initialized by the framework itself.
-# Version match searching is not done for URLs listed here.
-#osgi.frameworkClassPath =
-
-# The comma-separated list of locations to search for the splash screen file (splash.bmp).
-# For each list element a subdirectory structure based on the pattern nl/<locale> is searched.
-# The system binds to the first matching file.  There is no default value.
-#osgi.splashPath=
-
-# The location of the splash screen file.  If this value is set at system startup it is used 
-# in favour of the osgi.splashPath searching outlined above.  If the value is not set 
-# the searching is done and this key is bound to the result of the search.
-#osgi.splashLocation =
-
-# The comma-separated list of bundles which are automatically installed and optionally started
-# once the system is up and running.  Each entry if of the form
-#     <URL | simple bundle location>[@ [<startlevel>] [":start"]]
-# If the startlevel is omitted then the framework will use the default start level for the bundle.
-# If the "start" tag is added then the bundle will be marked as started after being installed.
-# Simple bundle locations are interepreted as relative to the framework's parent directory.
-# The startlevel indicates the OSGi start level at which the bundle should run.
-# If this value is not set, the system computes an appropriate default.
-#osgi.bundles=org.eclipse.core.runtime@2:start,com.ibm.rmc.library,org.eclipse.ui.ide,org.eclipse.help.appserver,org.eclipse.help.base,org.eclipse.update.ui,com.ibm.uma,com.ibm.uma.core,com.ibm.umaf.ecore,com.ibm.tngui.edit,org.eclipse.core.resources,org.eclipse.emf,org.eclipse.emf.ecore.xmi,org.eclipse.emf.edit,org.eclipse.emf.edit.ui,org.eclipse.ui,org.eclipse.ui.ide
-
-# The product to run.  A given Eclipse configuration may contain many products.
-# The product identified will supply the branding (window icons, title bar text) etc 
-# as well as define the default application to run.  
-#eclipse.product=org.eclipse.platform
-
-# The application to run.  The value specified here is the id of the application extension
-# the runtime will find, instantiate and execute once the system is up.  Note that typically 
-# the identified eclipse.product defines the default application to run.
-eclipse.application=org.eclipse.epf.rcp.ui.MainApplication
-
-# The build identifier
-eclipse.buildId=M200409161125
-
-# End of file marker - must be here
-eof=eof
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/eclipse32.png b/1.5/plugins/org.eclipse.epf.rcp.ui/eclipse32.png
deleted file mode 100644
index 568fac1..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/about.gif b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/about.gif
deleted file mode 100644
index bf8b872..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/about.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/application.gif b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/application.gif
deleted file mode 100644
index bdc2912..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/application.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/eclipse.png b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/eclipse.png
deleted file mode 100644
index 7397524..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/eclipse.png
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/etool16/help.gif b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/etool16/help.gif
deleted file mode 100644
index 9d70301..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/etool16/help.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/etool16/search_menu.gif b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/etool16/search_menu.gif
deleted file mode 100644
index f0f5d83..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/etool16/search_menu.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/full/obj16/product.gif b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/full/obj16/product.gif
deleted file mode 100644
index bdc2912..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/full/obj16/product.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/full/obj32/product32.gif b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/full/obj32/product32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/full/obj32/product32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/new_con.gif b/1.5/plugins/org.eclipse.epf.rcp.ui/icons/new_con.gif
deleted file mode 100644
index 7aea894..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/icons/new_con.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.rcp.ui/plugin.properties
deleted file mode 100644
index f5df679..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/plugin.properties
+++ /dev/null
@@ -1,75 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Composer RCP UI
-productName=EPF Composer
-providerName=Eclipse.org
-
-# About text
-aboutText=Eclipse Process Framework Composer\n\
-\n\
-Version: {1}\n\
-Build Label: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007. All Rights Reserved.\n
-
-# Category
-methodCategoryName=Method
-
-# Views
-welcomeViewName=Welcome
-
-# Actions
-globalActionSet=Global Action Set
-newAction=&New
-newActionTooltip=New
-openAction=&Open...
-openActionTooltip=Open
-searchAction=&Search...
-searchActionTooltip=Search
-welcomeAction=&Welcome
-welcomeActionToolTip=Welcome
-
-# Tooltips
-shortcut.overview.tooltip=Return to Overview page
-shortcut.tutorials.tooltip=Return to Tutorial page
-shortcut.firststeps.tooltip=Return to First Steps page
-shortcut.webresources.tooltip=Return to Web Resources page       
-
-#Action Set
-actionSet.description = Help System Toolbar Actions
-actionSet.label = Help System
-searchAction.label = S&earch Help
-searchAction.tooltip = Search Help
-dynamicHelpAction.label = &Dynamic Help 
-dynamicHelpAction.tooltip = Dynamic Help
-
-#Activities/Capabilities
-activity.general=Import and Export Projects and Resources
-activity.general.desc=Use the standard Eclipse Import/Export Project/Resources capabilities.
-activity.team.cvs=CVS Support
-activity.team.cvs.desc=Use the Concurrent Versions System (CVS) to manage resources.
-activity.team=Core Team Support
-activity.team.desc=Share projects using configuration management systems.
-
-activity.cat.general=General
-activity.cat.general.desc=Use the standard Eclipse capabilities.
-activity.cat.team=Team
-activity.cat.team.desc=Use configuration management systems to manage resources.
-
-PreferencePages.Capabilities = Capabilities
-PreferencePages.Capabilities.activityName = &Capabilities
-PreferencePages.Capabilities.categoryName = &Capabilities
-PreferencePages.Capabilities.activityPromptButton = &Prompt when enabling capabilities
-PreferencePages.Capabilities.activityPromptButtonTooltip = Prompt when a feature is first used that requires enablement of capabilities
-PreferencePages.Capabilities.captionMessage = Capabilities allow you to enable or disable various product components.  These capabilities are grouped according to a set of predefined categories.
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.rcp.ui/plugin.xml
deleted file mode 100644
index 72f7bfa..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/plugin.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         id="MainApplication"
-         point="org.eclipse.core.runtime.applications">
-      <application>
-         <run
-            class="org.eclipse.epf.rcp.ui.MainApplication">
-         </run>
-      </application>
-   </extension>
-   
-   <extension
-         id="composer"
-         point="org.eclipse.core.runtime.products">
-      <product
-            application="org.eclipse.epf.rcp.ui.MainApplication"
-            name="Eclipse Process Framework Composer">
-         <property
-               name="preferenceCustomization"
-               value="plugin_customization.ini"/>
-         <property
-               name="startupForegroundColor"
-               value="C8D5EA"/>
-         <property
-               name="startupMessageRect"
-               value="7,220,441,20"/>
-         <property
-               name="startupProgressRect"
-               value="0,280,455,15"/>
-         <property
-               name="aboutImage"
-               value="icons/about.gif"/>
-         <property
-               name="aboutText"
-               value="%aboutText"/>
-         <property
-               name="windowImages"
-               value="icons/full/obj16/product.gif,icons/full/obj32/product32.gif"/>
-         <property
-               name="appName"
-               value="Eclipse Process Framework Composer">
-         </property>
-      </product>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            name="edit"
-            description="Open a method element"
-            categoryId="org.eclipse.ui.category.edit"
-            id="org.eclipse.epf.rcp.ui.actions.openElement"/>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            description="%actionSet.description"
-            id="org.eclipse.help.ui.actions"
-            label="%actionSet.label"
-            visible="true">
-        <action
-               class="org.eclipse.help.ui.internal.SearchAction"
-               icon="$nl$/icons/etool16/search_menu.gif"
-               id="org.eclipse.help.ui.search"
-               label="%searchAction.label"
-               menubarPath="help/group.help"
-               style="push"
-               toolbarPath="org.eclipse.ui.workbench.file/build.group"
-               tooltip="%searchAction.tooltip"/>
-         <action
-               class="org.eclipse.help.ui.internal.DynamicHelpAction"
-               icon="$nl$/icons/etool16/help.gif"
-               id="org.eclipse.help.ui.dynamicHelp"
-               label="%dynamicHelpAction.label"
-               menubarPath="help/group.help"
-               style="push"
-               toolbarPath="org.eclipse.ui.workbench.file/build.group"
-               tooltip="%dynamicHelpAction.tooltip"/>
-      </actionSet>
-   </extension>
-   
-	<extension point="org.eclipse.ui.activities">
-    	<activity
- 			id="activity.externaltool"
- 			name="hideExternaltoolMenus">
- 		</activity>
- 		<activityPatternBinding
-	 		activityId="activity.externaltool"
-			pattern="org\.eclipse\.ui\.externaltools/org\.eclipse\.ui\.externaltools\.ExternalToolMenuDelegate.*">
- 		</activityPatternBinding>
-	</extension>
-	
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/plugin_customization.ini b/1.5/plugins/org.eclipse.epf.rcp.ui/plugin_customization.ini
deleted file mode 100644
index fa26ddb..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/plugin_customization.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-org.eclipse.ui/DOCK_PERSPECTIVE_BAR=TOP_RIGHT
-org.eclipse.ui/initialFastViewBarLocation=right
-org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
-org.eclipse.ui/OPEN_NEW_PERSPECTIVE=OPEN_PERSPECTIVE_REPLACE
-org.eclipse.epf.library.ui/appname=EPF
-org.eclipse.epf.library.edit/ACTIVITY_DETAIL_DIAGRAM_TASKS_PER_ROW=5
-org.eclipse.epf.authoring.ui/ADD_ROLE_TASKS_BOX_BG_COLOR_RGB=255,255,156
-org.eclipse.epf.authoring.ui/ADD_WP_BOX_BG_COLOR_RGB=255,255,205
-org.eclipse.team.core/ignore_files=.lock\ntrue\n
-org.eclipse.epf.authoring.ui/PUBLISH_NEW_DIAGRAM=true
-org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP=true
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/splash.bmp b/1.5/plugins/org.eclipse.epf.rcp.ui/splash.bmp
deleted file mode 100644
index b1eee40..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/splash.bmp
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainActionBarAdvisor.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainActionBarAdvisor.java
deleted file mode 100644
index a9ded53..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainActionBarAdvisor.java
+++ /dev/null
@@ -1,624 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui;
-
-import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
-import org.eclipse.epf.authoring.ui.views.ViewHelper;
-import org.eclipse.epf.rcp.ui.actions.NewWizardMenu;
-import org.eclipse.epf.rcp.ui.actions.UIActionFactory;
-import org.eclipse.epf.rcp.ui.actions.UIOpenPerspectiveDialogAction;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.ContributionItemFactory;
-import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.ide.IDEActionFactory;
-import org.eclipse.ui.ide.IIDEActionConstants;
-import org.eclipse.ui.internal.provisional.application.IActionBarConfigurer2;
-
-/**
- * Creates, adds and disposes the actions added to a workbench window.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @author Phong Nguyen Le
- * @author Jinhua Xi
- * @since 1.0
- */
-public class MainActionBarAdvisor extends ActionBarAdvisor {
-
-	// All actions should be created in makeActions and referenced in the
-	// fill methods. This ensures that the actions aren't recreated
-	// when fillActionBars is called with FILL_PROXY.
-
-	// File actions.
-	protected IWorkbenchAction newAction;
-
-	protected IWorkbenchAction closeAction;
-
-	protected IWorkbenchAction closeAllAction;
-
-	protected IWorkbenchAction saveAction;
-
-	protected IWorkbenchAction saveAsAction;
-
-	protected IWorkbenchAction saveAllAction;
-
-	protected IWorkbenchAction revertAction;
-
-	protected IWorkbenchAction moveAction;
-
-	protected IWorkbenchAction renameAction;
-
-	protected IWorkbenchAction refreshAction;
-
-	protected IWorkbenchAction importAction;
-
-	protected IWorkbenchAction exportAction;
-
-	protected IWorkbenchAction propertiesAction;
-
-	protected IWorkbenchAction exitAction;
-
-	// Edit actions.
-	protected IWorkbenchAction openElementAction;
-
-	protected IWorkbenchAction undoAction;
-
-	protected IWorkbenchAction redoAction;
-
-	protected IWorkbenchAction cutAction;
-
-	protected IWorkbenchAction copyAction;
-
-	protected IWorkbenchAction pasteAction;
-
-	protected IWorkbenchAction deleteAction;
-
-	protected IWorkbenchAction selectAllAction;
-
-	protected IWorkbenchAction findAction;
-
-	// Navigate actions.
-	protected IWorkbenchAction goIntoAction;
-
-	protected IWorkbenchAction nextAction;
-
-	protected IWorkbenchAction previousAction;
-
-	protected IWorkbenchAction backAction;
-
-	protected IWorkbenchAction forwardAction;
-
-	// Window actions.
-	protected IWorkbenchAction openNewWindowAction;
-
-	protected IWorkbenchAction openPerspectiveDialogAction;
-
-	protected IWorkbenchAction customizePerspectiveAction;
-
-	protected IWorkbenchAction savePerspectiveAction;
-
-	protected IWorkbenchAction resetPerspectiveAction;
-
-	protected IWorkbenchAction closePerspectiveAction;
-
-	protected IWorkbenchAction closeAllPerspectiveAction;
-
-	protected IWorkbenchAction preferencesAction;
-
-	// Window navigation actions.
-	protected IWorkbenchAction nextEditorAction;
-
-	protected IWorkbenchAction previousEditorAction;
-
-	protected IWorkbenchAction nextPartAction;
-
-	protected IWorkbenchAction previousPartAction;
-
-	protected IWorkbenchAction nextPerspectiveAction;
-
-	protected IWorkbenchAction previousPerspectiveAction;
-
-	// Help actions.
-	protected IWorkbenchAction welcomeAction;
-
-	protected IWorkbenchAction helpContentsAction;
-
-	protected IWorkbenchAction aboutAction;
-
-	protected IWorkbenchAction newWizardDropDownAction;
-
-	protected IWorkbenchAction lockToolBarAction;
-
-	protected IWorkbenchAction editActionSetAction;
-
-	protected MenuManager mainHelpMenu;
-
-	protected MenuManager mainFileMenu;
-
-	protected MenuManager internalMenu;
-
-	protected IWorkbenchWindow window;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param configurer
-	 *            the action bar configurer
-	 */
-	public MainActionBarAdvisor(IActionBarConfigurer configurer) {
-		super(configurer);
-		window = configurer.getWindowConfigurer().getWindow();
-	}
-
-	/**
-	 * Getd the workbench window.
-	 * 
-	 * @return the workbench window
-	 */
-	public IWorkbenchWindow getWindow() {
-		return window;
-	}
-
-	/**
-	 * @see org.eclipse.ui.application.ActionBarAdvisor#makeActions(final
-	 *      IWorkbenchWindow window)
-	 */
-	protected void makeActions(final IWorkbenchWindow window) {
-		if (PlatformUI.getWorkbench().isClosing())
-			return;
-
-		// Creates the actions and registers them. Registering is needed to
-		// ensure that key bindings work. The corresponding commands key
-		// bindings are defined in the plugin.xml file. Registering also
-		// provides automatic disposal of the actions when the window is closed.
-
-		newAction = ActionFactory.NEW.create(window);
-		register(newAction);
-
-		closeAction = ActionFactory.CLOSE.create(window);
-		register(closeAction);
-
-		closeAllAction = ActionFactory.CLOSE_ALL.create(window);
-		register(closeAllAction);
-
-		saveAction = ActionFactory.SAVE.create(window);
-		register(saveAction);
-
-		saveAsAction = ActionFactory.SAVE_AS.create(window);
-		register(saveAsAction);
-
-		saveAllAction = ActionFactory.SAVE_ALL.create(window);
-		register(saveAllAction);
-
-		revertAction = ActionFactory.REVERT.create(window);
-		register(revertAction);
-
-		moveAction = ActionFactory.MOVE.create(window);
-		register(moveAction);
-
-		renameAction = ActionFactory.RENAME.create(window);
-		register(renameAction);
-
-		refreshAction = ActionFactory.REFRESH.create(window);
-		register(refreshAction);
-
-		importAction = UIActionFactory.UI_IMPORT.create(window);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(importAction,
-				AuthoringUIHelpContexts.FILE_IMPORT_CONTEXT);
-		register(importAction);
-
-		exportAction = UIActionFactory.UI_EXPORT.create(window);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(exportAction,
-				AuthoringUIHelpContexts.FILE_EXPORT_CONTEXT);
-		register(exportAction);
-
-		propertiesAction = ActionFactory.PROPERTIES.create(window);
-		register(propertiesAction);
-
-		exitAction = ActionFactory.QUIT.create(window);
-		register(exitAction);
-
-		openElementAction = UIActionFactory.OPEN_ELEMENT.create(window);
-		register(openElementAction);
-
-		undoAction = ActionFactory.UNDO.create(window);
-		register(undoAction);
-
-		redoAction = ActionFactory.REDO.create(window);
-		register(redoAction);
-
-		cutAction = ActionFactory.CUT.create(window);
-		register(cutAction);
-
-		copyAction = ActionFactory.COPY.create(window);
-		register(copyAction);
-
-		pasteAction = ActionFactory.PASTE.create(window);
-		register(pasteAction);
-
-		deleteAction = ActionFactory.DELETE.create(window);
-		register(deleteAction);
-
-		selectAllAction = ActionFactory.SELECT_ALL.create(window);
-		register(selectAllAction);
-
-		findAction = ActionFactory.FIND.create(window);
-		register(findAction);
-
-		goIntoAction = ActionFactory.GO_INTO.create(window);
-		register(goIntoAction);
-
-		nextAction = ActionFactory.NEXT.create(window);
-		register(nextAction);
-
-		previousAction = ActionFactory.PREVIOUS.create(window);
-		register(previousAction);
-
-		backAction = ActionFactory.BACK.create(window);
-		register(backAction);
-
-		forwardAction = ActionFactory.FORWARD.create(window);
-		register(forwardAction);
-
-		openNewWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
-		register(openNewWindowAction);
-
-		nextEditorAction = ActionFactory.NEXT_EDITOR.create(window);
-		register(nextEditorAction);
-
-		previousEditorAction = ActionFactory.PREVIOUS_EDITOR.create(window);
-		register(previousEditorAction);
-
-		nextPartAction = ActionFactory.NEXT_PART.create(window);
-		register(nextPartAction);
-
-		previousPartAction = ActionFactory.PREVIOUS_PART.create(window);
-		register(previousPartAction);
-
-		nextPerspectiveAction = ActionFactory.NEXT_PERSPECTIVE.create(window);
-		register(nextPerspectiveAction);
-
-		previousPerspectiveAction = ActionFactory.PREVIOUS_PERSPECTIVE
-				.create(window);
-		register(previousPerspectiveAction);
-
-		openPerspectiveDialogAction = createTNGOpenPerspectiveDialogAction(window);
-		openPerspectiveDialogAction.setText(RCPUIResources.otherMenuItem_text);
-		register(openPerspectiveDialogAction);
-
-		customizePerspectiveAction = ActionFactory.EDIT_ACTION_SETS
-				.create(window);
-		register(customizePerspectiveAction);
-
-		savePerspectiveAction = ActionFactory.SAVE_PERSPECTIVE.create(window);
-		register(savePerspectiveAction);
-
-		resetPerspectiveAction = ActionFactory.RESET_PERSPECTIVE.create(window);
-		register(resetPerspectiveAction);
-
-		closePerspectiveAction = ActionFactory.CLOSE_PERSPECTIVE.create(window);
-		register(closePerspectiveAction);
-
-		closeAllPerspectiveAction = ActionFactory.CLOSE_ALL_PERSPECTIVES
-				.create(window);
-		register(closeAllPerspectiveAction);
-
-		preferencesAction = ActionFactory.PREFERENCES.create(window);
-		register(preferencesAction);
-
-		welcomeAction = UIActionFactory.SHOW_INTRO.create(window);
-		register(welcomeAction);
-		ImageDescriptor imgDes = RCPUIPlugin.getDefault().getImageDescriptor(
-				"full/obj16/product.gif"); //$NON-NLS-1$
-		welcomeAction.setImageDescriptor(imgDes);
-
-		helpContentsAction = ActionFactory.HELP_CONTENTS.create(window);
-		register(helpContentsAction);
-
-		aboutAction = ActionFactory.ABOUT.create(window);
-		register(aboutAction);
-
-		// FIXME! Filter out Project... from the drop-down menu.
-		newWizardDropDownAction = IDEActionFactory.NEW_WIZARD_DROP_DOWN
-				.create(window);
-		register(newWizardDropDownAction);
-
-		lockToolBarAction = ActionFactory.LOCK_TOOL_BAR.create(window);
-		register(lockToolBarAction);
-
-		editActionSetAction = ActionFactory.EDIT_ACTION_SETS.create(window);
-		register(editActionSetAction);
-	}
-
-	/**
-	 * @see org.eclipse.ui.application.ActionBarAdvisor#fillMenuBar(IMenuManager
-	 *      menuBar)
-	 */
-	protected void fillMenuBar(IMenuManager menuBar) {
-		if (PlatformUI.getWorkbench().isClosing())
-			return;
-		mainFileMenu = createFileMenu(menuBar);
-		menuBar.add(mainFileMenu);
-		menuBar.add(createEditMenu(menuBar));
-
-		IMenuManager navManager = createNavigateMenu(menuBar);
-		menuBar.add(navManager);
-		navManager.setVisible(false);
-
-		menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-		menuBar.add(createWindowMenu(menuBar));
-
-		mainHelpMenu = createHelpMenu(menuBar);
-		menuBar.add(mainHelpMenu);
-	}
-
-	/**
-	 * Gets the File menu manager.
-	 */
-	public MenuManager getFileMenuManager() {
-		return mainFileMenu;
-	}
-
-	/**
-	 * Gets the Help menu manager.
-	 */
-	public MenuManager getHelpMenuManager() {
-		return mainHelpMenu;
-	}
-
-	/**
-	 * @see org.eclipse.ui.application.ActionBarAdvisor#fillCoolBar(ICoolBarManager
-	 *      coolBar)
-	 */
-	protected void fillCoolBar(ICoolBarManager coolBar) {
-		if (PlatformUI.getWorkbench().isClosing())
-			return;
-		coolBar.add(createFileToolbar(coolBar));
-	}
-
-	/**
-	 * Creates the File menu.
-	 */
-	protected MenuManager createFileMenu(IMenuManager menuBar) {
-		MenuManager fileMenu = new MenuManager(
-				RCPUIResources.fileMenuItem_text,
-				IWorkbenchActionConstants.M_FILE);
-		fileMenu.add(new GroupMarker(IWorkbenchActionConstants.FILE_START));
-
-		// Create the New sub menu, using the same id for it as the New action.
-		String newText = RCPUIResources.fileNewMenuItem_text;
-		String newId = ActionFactory.NEW.getId();
-		MenuManager newMenu = new MenuManager(newText, newId) {
-			public String getMenuText() {
-				return super.getMenuText();
-			}
-		};
-		newMenu.add(new Separator(newId));
-		newMenu.add(new NewWizardMenu(getWindow(), null));
-		newMenu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		fileMenu.add(newMenu);
-		fileMenu.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT));
-
-		fileMenu.add(new Separator());
-		MenuManager openSubMenu = new MenuManager(
-				RCPUIResources.fileOpenMenuItem_text,
-				IWorkbenchActionConstants.OPEN_EXT);
-		openSubMenu
-				.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-		openSubMenu.add(new Separator());
-		fileMenu.add(openSubMenu);
-
-		fileMenu.add(closeAction);
-		fileMenu.add(closeAllAction);
-		fileMenu.add(new Separator());
-		fileMenu.add(saveAction);
-		fileMenu.add(saveAsAction);
-		fileMenu.add(saveAllAction);
-		fileMenu.add(revertAction);
-		fileMenu.add(new Separator());
-		fileMenu.add(moveAction);
-		fileMenu.add(renameAction);
-		fileMenu.add(refreshAction);
-		fileMenu.add(new Separator());
-		fileMenu.add(importAction);
-		fileMenu.add(exportAction);
-		fileMenu.add(new Separator());
-		fileMenu.add(propertiesAction);
-		fileMenu.add(new Separator());
-		fileMenu.add(exitAction);
-		fileMenu.add(new GroupMarker(IWorkbenchActionConstants.FILE_END));
-
-		return fileMenu;
-	}
-
-	/**
-	 * Creates the Edit menu.
-	 */
-	protected MenuManager createEditMenu(IMenuManager menuBar) {
-		MenuManager editMenu = new MenuManager(
-				RCPUIResources.editMenuItem_text,
-				IWorkbenchActionConstants.M_EDIT);
-		editMenu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_START));
-		editMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-		editMenu.add(new Separator());
-		editMenu.add(new GroupMarker("opengroup")); //$NON-NLS-1$
-		editMenu.add(openElementAction);
-		editMenu.add(cutAction);
-		editMenu.add(copyAction);
-		editMenu.add(pasteAction);
-		editMenu.add(new Separator());
-		editMenu.add(deleteAction);
-		editMenu.add(selectAllAction);
-		editMenu.add(new Separator());
-		editMenu.add(findAction);
-		editMenu.add(new GroupMarker(IWorkbenchActionConstants.EDIT_END));
-		return editMenu;
-	}
-
-	/**
-	 * Creates the Navigate menu.
-	 */
-	protected MenuManager createNavigateMenu(IMenuManager menuBar) {
-		MenuManager navMenu = new MenuManager(
-				RCPUIResources.navigateMenuItem_text,
-				IWorkbenchActionConstants.M_NAVIGATE);
-		navMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-		navMenu.add(goIntoAction);
-		navMenu.add(new Separator());
-		navMenu.add(nextAction);
-		navMenu.add(previousAction);
-		navMenu.add(new Separator());
-		navMenu.add(backAction);
-		navMenu.add(forwardAction);
-		navMenu.add(new GroupMarker(IWorkbenchActionConstants.WB_END));
-		return navMenu;
-	}
-
-	/**
-	 * Creates the Window menu.
-	 */
-	protected MenuManager createWindowMenu(IMenuManager menuBar) {
-		MenuManager windowMenu = new MenuManager(
-				RCPUIResources.windowMenuItem_text,
-				IWorkbenchActionConstants.M_WINDOW);
-		windowMenu.add(new GroupMarker(IWorkbenchActionConstants.WB_START));
-		windowMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-
-		MenuManager changePerspMenuMgr = new MenuManager(
-				RCPUIResources.windowOpenPerspectiveMenuItem_text,
-				"openPerspective"); //$NON-NLS-1$
-		IContributionItem changePerspMenuItem = ContributionItemFactory.PERSPECTIVES_SHORTLIST
-				.create(getWindow());
-		changePerspMenuMgr.add(changePerspMenuItem);
-		windowMenu.add(changePerspMenuMgr);
-		MenuManager showViewMenuMgr = new MenuManager(
-				RCPUIResources.windowShowViewMenuItem_text, "showView"); //$NON-NLS-1$
-		IContributionItem showViewMenu = ContributionItemFactory.VIEWS_SHORTLIST
-				.create(getWindow());
-		showViewMenuMgr.add(showViewMenu);
-		windowMenu.add(showViewMenuMgr);
-
-		windowMenu.add(new Separator());
-		windowMenu.add(customizePerspectiveAction);
-		windowMenu.add(savePerspectiveAction);
-		windowMenu.add(resetPerspectiveAction);
-		windowMenu.add(closePerspectiveAction);
-		windowMenu.add(closeAllPerspectiveAction);
-		windowMenu.add(new Separator());
-		windowMenu.add(preferencesAction);
-		windowMenu.add(new GroupMarker(IWorkbenchActionConstants.WB_END));
-		return windowMenu;
-	}
-
-	protected void createInternalMenu(final IMenuManager helpMmenu) {
-		internalMenu = new MenuManager(
-				RCPUIResources.mainActionBarAdvisor_Diagnosis, ""); //$NON-NLS-1$
-
-		internalMenu.add(new Action(
-				RCPUIResources.mainActionBarAdvisor_HealthCheck) {
-			public void run() {
-				ViewHelper.checkLibraryHealth();
-			}
-		});
-	}
-
-	/**
-	 * Creates the Help menu.
-	 */
-	protected MenuManager createHelpMenu(IMenuManager menuBar) {
-		MenuManager helpMmenu = new MenuManager(
-				RCPUIResources.helpMenuItem_text,
-				IWorkbenchActionConstants.M_HELP);
-		helpMmenu.add(new GroupMarker(IWorkbenchActionConstants.HELP_START));
-		helpMmenu.add(welcomeAction);
-
-		helpMmenu.add(new Separator());
-		helpMmenu.add(helpContentsAction);
-		helpMmenu.add(new GroupMarker("group.help")); //$NON-NLS-1$
-
-		helpMmenu.add(new Separator());
-		helpMmenu.add(new GroupMarker("group.assist")); //$NON-NLS-1$
-
-		helpMmenu.add(new Separator());
-		helpMmenu.add(new GroupMarker("group.tools")); //$NON-NLS-1$
-
-		helpMmenu.add(new Separator());
-		helpMmenu.add(new GroupMarker("group.updates")); //$NON-NLS-1$
-
-		// Menu items for internal tool
-		helpMmenu.add(new Separator());
-		helpMmenu.add(new GroupMarker("group.internal")); //$NON-NLS-1$
-		createInternalMenu(helpMmenu);
-
-		helpMmenu.add(new Separator());
-		helpMmenu.add(aboutAction);
-		helpMmenu.add(new GroupMarker(IWorkbenchActionConstants.HELP_END));
-
-		return helpMmenu;
-	}
-
-	/**
-	 * Creates the File toolbar.
-	 */
-	protected IToolBarManager createFileToolbar(ICoolBarManager coolBar) {
-		IActionBarConfigurer2 actionBarConfigurer = (IActionBarConfigurer2) getActionBarConfigurer();
-		IMenuManager popUpMenu = new MenuManager();
-		popUpMenu.add(new ActionContributionItem(lockToolBarAction));
-		popUpMenu.add(new ActionContributionItem(editActionSetAction));
-		coolBar.setContextMenuManager(popUpMenu);
-
-		coolBar.add(new GroupMarker(IIDEActionConstants.GROUP_FILE));
-		IToolBarManager fileToolBar = actionBarConfigurer
-				.createToolBarManager();
-		fileToolBar.add(new Separator(IWorkbenchActionConstants.NEW_GROUP));
-		fileToolBar.add(newWizardDropDownAction);
-		fileToolBar.add(new GroupMarker(IWorkbenchActionConstants.NEW_EXT));
-		fileToolBar.add(new GroupMarker(IWorkbenchActionConstants.SAVE_GROUP));
-		fileToolBar.add(saveAction);
-		fileToolBar.add(saveAllAction);
-		fileToolBar.add(new GroupMarker(IWorkbenchActionConstants.SAVE_EXT));
-		fileToolBar.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-
-		return fileToolBar;
-	}
-
-	/**
-	 * Create a custom open perspective dialog
-	 * 
-	 * @param window
-	 * @return
-	 */
-	protected IWorkbenchAction createTNGOpenPerspectiveDialogAction(
-			IWorkbenchWindow window) {
-		if (window == null) {
-			throw new IllegalArgumentException();
-		}
-		IWorkbenchAction action = new UIOpenPerspectiveDialogAction(window);
-		action.setId("openPerspectiveDialog"); //$NON-NLS-1$
-		return action;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainApplication.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainApplication.java
deleted file mode 100644
index 4f74ac9..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainApplication.java
+++ /dev/null
@@ -1,169 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.utils.CommandLineRunUtil;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.equinox.app.IApplication;
-import org.eclipse.equinox.app.IApplicationContext;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.service.datalocation.Location;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class controls all aspects of the application's execution.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MainApplication implements IApplication {
-	
-	// Data mode constants for user, configuration and data locations.
-	private static final String NONE = "@none"; //$NON-NLS-1$
-	private static final String NO_DEFAULT = "@noDefault"; //$NON-NLS-1$
-	private static final String USER_HOME = "@user.home"; //$NON-NLS-1$
-	private static final String USER_DIR = "@user.dir"; //$NON-NLS-1$
-	public static final String PROP_USER_HOME = "user.home"; //$NON-NLS-1$
-	public static final String PROP_USER_DIR = "user.dir"; //$NON-NLS-1$
-
-	/*
-	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
-	 */
-	public Object start(IApplicationContext context) {
-		Display display = PlatformUI.createDisplay();
-		Shell shell = new Shell(display, SWT.ON_TOP);
-		try {
-			boolean noLock = false;
-			String[] appArgs = Platform.getApplicationArgs();
-			for (int i = 0; i < appArgs.length; i++) {
-				if (appArgs[i].equalsIgnoreCase("-library") && i < (appArgs.length - 1)) { //$NON-NLS-1$
-					String location = appArgs[i + 1];
-					location = buildLocation(location);
-					if (location != null) {
-						LibraryUIManager.setCommandLineLibrary(location);
-					}
-				} else if (appArgs[i].equalsIgnoreCase("-defaultlibrary") && i < (appArgs.length - 1)) { //$NON-NLS-1$
-					String location = appArgs[i + 1];
-					location = buildLocation(location);
-					if (location != null) {
-						LibraryUIManager.setCommandLineDefaultLibrary(location);
-					}
-				} else if (appArgs[i].equalsIgnoreCase("-nolock")) { //$NON-NLS-1$
-					noLock = true;
-				} else if (appArgs[i].equalsIgnoreCase("-batch")) { //$NON-NLS-1$
-					CommandLineRunUtil.getInstance().setNeedToRun(true);
-				}
-			}
-
-			if (!noLock && !checkWorkspaceLock(shell)) {
-				Platform.endSplash();
-				return IApplication.EXIT_OK;
-			}
-
-			int returnCode = createWorkbenchAdvisor(display);
-			if (returnCode == PlatformUI.RETURN_RESTART) {
-				return IApplication.EXIT_RESTART;
-			}
-			return IApplication.EXIT_OK;
-		} finally {
-			if (shell != null) {
-				shell.dispose();
-			}
-			display.dispose();
-		}
-	}
-
-	/*
-	 * @see org.eclipse.equinox.app.IApplication#stop()
-	 */
-	public void stop() {
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench == null)
-			return;
-		final Display display = workbench.getDisplay();
-		display.syncExec(new Runnable() {
-			public void run() {
-				if (!display.isDisposed()) {
-					workbench.close();
-				}
-			}
-		});
-	}
-
-	/**
-	 * Creates the workbench advisor.
-	 */
-	protected int createWorkbenchAdvisor(Display display) {
-		return PlatformUI.createAndRunWorkbench(display,
-				new MainWorkbenchAdvisor());
-	}
-
-	/**
-	 * Checks the workspace lock that is used to prevent a library been opened
-	 * multiple times.
-	 */
-	protected boolean checkWorkspaceLock(Shell shell) {
-		Location workspaceLocation = Platform.getInstanceLocation();
-		String appName = Platform.getProduct().getName();
-		try {
-			if (workspaceLocation.lock()) {
-				return true;
-			}
-			MessageDialog.openInformation(shell, NLS.bind(
-					RCPUIResources.workspaceCannotLockTitle, appName), NLS
-					.bind(RCPUIResources.workspaceCannotLockMessage, appName));
-		} catch (IOException e) {
-			RCPUIPlugin.getDefault().getLogger().logError(
-					NLS
-							.bind(RCPUIResources.workspaceCannotLockMessage,
-									appName), e);
-			MessageDialog.openInformation(shell, NLS.bind(
-					RCPUIResources.workspaceCannotLockTitle, appName), e
-					.getMessage());
-		}
-		return false;
-	}
-
-	/*
-	 * taken from org.eclipse.core.runtime.adaptor.LocationManager.buildLocation
-	 */
-	private String buildLocation(String location) {
-		String trimmedLocation = location.trim();
-		String result = trimmedLocation;
-		if (trimmedLocation.equalsIgnoreCase(NONE))
-			return null;
-		if (trimmedLocation.equalsIgnoreCase(NO_DEFAULT))
-			return null;
-		if (trimmedLocation.startsWith(USER_HOME)) {
-			String base = substituteVar(location, USER_HOME, PROP_USER_HOME);
-			result = new File(base).getAbsolutePath();
-		} else if (trimmedLocation.startsWith(USER_DIR)) {
-			String base = substituteVar(location, USER_DIR, PROP_USER_DIR);
-			result = new File(base).getAbsolutePath();
-		}
-		return result;
-	}
-	
-	private static String substituteVar(String source, String var, String prop) {
-		String value = System.getProperty(prop, ""); //$NON-NLS-1$
-		return value + source.substring(var.length());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainWorkbenchAdvisor.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainWorkbenchAdvisor.java
deleted file mode 100644
index 9e19ef6..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainWorkbenchAdvisor.java
+++ /dev/null
@@ -1,203 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui;
-
-import java.net.URL;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.authoring.ui.AuthoringPerspective;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.utils.CommandLineRunUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.ui.LibraryUIManager;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.WorkbenchPage;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.model.WorkbenchAdapterBuilder;
-import org.osgi.framework.Bundle;
-
-/**
- * Creates the window advisor and specifies the perspective id for the initial
- * window.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MainWorkbenchAdvisor extends WorkbenchAdvisor {
-
-	protected Logger logger;
-
-	private void declareWorkbenchImage(Bundle ideBundle, String symbolicName,
-			String path, boolean shared) {
-		URL url = FileLocator.find(ideBundle, new Path(path), null);
-		ImageDescriptor desc = ImageDescriptor.createFromURL(url);
-		getWorkbenchConfigurer().declareImage(symbolicName, desc, shared);
-	}
-
-	/**
-	 * Declares all IDE-specific workbench images that are used by some bundled
-	 * plugins
-	 * 
-	 * @see IWorkbenchConfigurer#declareImage
-	 */
-	private void declareWorkbenchImages() {
-		final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$
-		final String PATH_OBJECT = ICONS_PATH + "obj16/"; // Model object // icons//$NON-NLS-1$
-		final String PATH_ETOOL = ICONS_PATH + "etool16/"; // Enabled toolbar icons.//$NON-NLS-1$
-
-		Bundle ideBundle = Platform.getBundle("org.eclipse.ui.ide"); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT,
-				PATH_OBJECT + "prj_obj.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT
-						+ "cprj_obj.gif", true); //$NON-NLS-1$
-
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT
-						+ "error_tsk.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT
-						+ "warn_tsk.gif", true); //$NON-NLS-1$
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT
-						+ "info_tsk.gif", true); //$NON-NLS-1$  	  	
-		declareWorkbenchImage(ideBundle,
-				IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY,
-				PATH_ETOOL + "problem_category.gif", true); //$NON-NLS-1$
-	}
-
-	/*
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#initialize(IWorkbenchConfigurer)
-	 */
-	public void initialize(IWorkbenchConfigurer configurer) {
-		logger = RCPUIPlugin.getDefault().getLogger();
-		super.initialize(configurer);
-		configurer.setSaveAndRestore(true);
-
-		// Remember the install dir and handle the -library command line
-		// parameter.
-		String appStartDir = System.getProperty("user.dir"); //$NON-NLS-1$
-		logger.logInfo(RCPUIResources.startup_dir_log_info_text + appStartDir); 
-
-		declareWorkbenchImages();
-	}
-
-	/*
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer)
-	 */
-	public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
-			IWorkbenchWindowConfigurer configurer) {
-		return new MainWorkbenchWindowAdvisor(configurer);
-	}
-
-	/*
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#getInitialWindowPerspectiveId()
-	 */
-	public String getInitialWindowPerspectiveId() {
-		if (PlatformUI.getWorkbench().isClosing())
-			return null;
-		return AuthoringPerspective.PERSPECTIVE_ID;
-	}
-
-	/*
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#preStartup()
-	 */
-	public void preStartup() {
-		super.preStartup();
-		WorkbenchAdapterBuilder.registerAdapters();
-	}
-
-	/*
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#preShutdown()
-	 */
-	public boolean preShutdown() {
-		// Remember whether the welcome view exists or not before exiting.
-		IWorkbenchWindow activeWindow = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (activeWindow != null) {
-
-			IWorkbenchPage page = activeWindow.getActivePage();
-			if (page != null) {
-				if (page instanceof WorkbenchPage) {
-					IViewReference[] vwRefList = page.getViewReferences();
-
-					boolean introViewExists = false;
-					for (int i = 0; i < vwRefList.length; i++) {
-						if (vwRefList[i].getId().equals(
-								"org.eclipse.ui.internal.introview")) { //$NON-NLS-1$
-							introViewExists = true;
-							break;
-						}
-					}
-
-					IPreferenceStore store = RCPUIPlugin.getDefault()
-							.getPreferenceStore();
-					store
-							.setValue(
-									"welcome_intro_view_exists", introViewExists); //$NON-NLS-1$
-					RCPUIPlugin.getDefault().savePluginPreferences();
-				}
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#postShutdown()
-	 */
-	public void postShutdown() {
-		try {
-			// Save the workspace and remove .snap file in the
-			// workspace\.metadata\.plugins\org.eclipse.core.resources folder.
-			ResourcesPlugin.getWorkspace().save(true, null);
-		} catch (CoreException e) {
-		}
-	}
-
-	/*
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#postStartup()
-	 */
-	public void postStartup() {
-		CommandLineRunUtil runUtil = CommandLineRunUtil.getInstance();
-		if (runUtil.isNeedToRun()) {
-			runUtil.execute(Platform.getApplicationArgs());
-
-			final IWorkbench workbench = getWorkbenchConfigurer()
-					.getWorkbench();
-			workbench.getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					workbench.close();
-				}
-			});
-		}
-
-		super.postStartup();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainWorkbenchWindowAdvisor.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainWorkbenchWindowAdvisor.java
deleted file mode 100644
index 17c6123..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/MainWorkbenchWindowAdvisor.java
+++ /dev/null
@@ -1,240 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IPerspectiveListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.WorkbenchException;
-import org.eclipse.ui.application.ActionBarAdvisor;
-import org.eclipse.ui.application.IActionBarConfigurer;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
-import org.eclipse.ui.internal.ActionSetContributionItem;
-import org.eclipse.ui.internal.PluginActionContributionItem;
-import org.eclipse.ui.intro.IIntroPart;
-
-/**
- * The application specific workbench window advisor.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- * fix to hide the working set and external tool bar buttons @ 2007-06-14
- */
-public class MainWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
-
-	protected static String[] fileMenuRemovalList = {
-			"org.eclipse.ui.openLocalFile", //$NON-NLS-1$
-			"org.eclipse.ui.edit.text.newTextEditor", //$NON-NLS-1$
-			"org.eclipse.ui.edit.text.openExternalFile", //$NON-NLS-1$
-			"converstLineDelimitersTo" //$NON-NLS-1$
-	};
-
-	protected MainActionBarAdvisor mainActionBar;
-
-	private static final String	ANNOTATIONNAVIGATION_ID		= "org.eclipse.ui.edit.text.actionSet.annotationNavigation";	//$NON-NLS-1$
-	private static final String	WORKINGSETACTIONSET_ID		= "org.eclipse.ui.WorkingSetActionSet";							//$NON-NLS-1$
-//	private static final String	EXTERNALTOOLSSET_ID			= "org.eclipse.ui.externaltools.ExternalToolsSet";				//$NON-NLS-1$
-	
-	private IPerspectiveListener perspectiveListener = new IPerspectiveListener() {
-		public void perspectiveChanged(IWorkbenchPage page,
-				IPerspectiveDescriptor perspective, String changeId) {
-		}
-		
-		public void perspectiveActivated(IWorkbenchPage page,
-				IPerspectiveDescriptor perspective) {
-			// do not show the WorkingSetsactionSet toolbar buttons
-			page.hideActionSet(WORKINGSETACTIONSET_ID); 
-			// do not show the External Tools button on the toolbar
-//			page.hideActionSet(EXTERNALTOOLSSET_ID);
-			page.hideActionSet(ANNOTATIONNAVIGATION_ID);	
-		}
-	};
-	
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param configurer
-	 *            An object for configuring the workbench window.
-	 */
-	public MainWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
-		super(configurer);
-	}
-
-	/**
-	 * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#createActionBarAdvisor(IActionBarConfigurer)
-	 */
-	public ActionBarAdvisor createActionBarAdvisor(
-			IActionBarConfigurer configurer) {
-		mainActionBar = new MainActionBarAdvisor(configurer);
-		return mainActionBar;
-	}
-
-	/**
-	 * add operations to be performed at postWindowCreate
-	 */
-	public void postWindowCreate() {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		Object data = configurer.getData("isRestoredWorkbench"); //$NON-NLS-1$
-		if (data == null) {
-			configurer.getWindow().getShell().setLocation(30, 30);
-			configurer.getWindow().getShell().setSize(1024, 760);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.application.WorkbenchWindowAdvisor#preWindowOpen()
-	 */
-	public void preWindowOpen() {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		configurer.setShowCoolBar(true);
-		configurer.setShowPerspectiveBar(true);
-		configurer.setShowStatusLine(true);
-		configurer.setShowProgressIndicator(true);
-		configurer.setTitle(RCPUIPlugin.getDefault().getString("productName")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.ui.application.WorkbenchAdvisor#postWindowOpen()
-	 */
-	public void postWindowOpen() {
-		if (PlatformUI.getWorkbench().isClosing())     
-			return;                                    
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		configurer.getWindow().getShell().setImage(
-				RCPUIPlugin.getDefault().getSharedImage("full/obj16/product.gif")); //$NON-NLS-1$
-
-		MenuManager fileMmenu = mainActionBar.getFileMenuManager();
-		IContributionItem[] items = fileMmenu.getItems();
-		for (int i = 0; i < items.length; i++) {
-			if (needToRemoveFrom(items[i].getId(), fileMenuRemovalList))
-				fileMmenu.remove(items[i]);
-		}
-
-		// this is a hack to change the Help | Software Updates | Manage
-		// Configurations to Manage Software Configuration...
-		MenuManager helpMmenu = mainActionBar.getHelpMenuManager();
-		items = helpMmenu.getItems();
-		for (int i = 0; i < items.length; i++) {
-			if (items[i] instanceof ActionSetContributionItem) {
-				ActionSetContributionItem element = (ActionSetContributionItem) items[i];
-				if (element.getId().equals("org.eclipse.update.ui.updateMenu")) { //$NON-NLS-1$
-					IContributionItem contribMenuMgr = element.getInnerItem();
-					IContributionItem[] subMenuItems = ((MenuManager) contribMenuMgr)
-							.getItems();
-					for (int j = 0; j < subMenuItems.length; j++) {
-						IContributionItem innerItem = ((ActionSetContributionItem) subMenuItems[j])
-								.getInnerItem();
-						if (innerItem instanceof PluginActionContributionItem
-								&& innerItem.getId().equals(
-										"org.eclipse.update.ui.configManager")) { //$NON-NLS-1$
-							IAction action = ((PluginActionContributionItem) innerItem)
-									.getAction();
-							action
-									.setText(RCPUIResources.menu_help_software_updates_manage_software_config_text); 
-						}
-					}
-				}
-			}
-		}
-		
-		PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener(perspectiveListener);
-		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		// do not show the WorkingSetsactionSet toolbar buttons
-		page.hideActionSet(WORKINGSETACTIONSET_ID); 
-		// do not show the External Tools button on the toolbar
-//		page.hideActionSet(EXTERNALTOOLSSET_ID);
-		page.hideActionSet(ANNOTATIONNAVIGATION_ID);	
-		
-	}
-
-	private boolean needToRemoveFrom(String id, String[] list) {
-		boolean rc = false;
-
-		for (int i = 0; i < list.length; i++) {
-			if (list[i].equals(id)) {
-				rc = true;
-				break;
-			}
-		}
-		return rc;
-	}
-
-	/**
-	 * add custom operations at postWindowRestore
-	 */
-	public void postWindowRestore() throws WorkbenchException {
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		configurer.setData("isRestoredWorkbench", "true"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	}
-
-	/**
-	* Customize openIntro to avoid an Eclipse bug
-	* Customizes it so it will open in the standby mode if this is a restored
-	* session and the last session had the IntroView open, otherwise close it
-	* 
-	*/
-	public void openIntro() {
-		super.openIntro();
-
-		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
-		Object data = configurer.getData("isRestoredWorkbench"); //$NON-NLS-1$
-		if (data == null) {
-			// if not restored workspace, just exec the default in super.
-			return;
-		}
-
-		// always allows the intro view to open first, and then put it into
-		// standby mode
-		// otherwise other fast views such as search help will be open-ed as
-		// full mode
-		// even the welcome page is closed.
-		// if (isIntroViewExistsInLastSession()) {
-		IWorkbenchConfigurer wbConfig = getWindowConfigurer()
-				.getWorkbenchConfigurer();
-		IIntroPart introPart = wbConfig.getWorkbench().getIntroManager()
-				.getIntro();
-		wbConfig.getWorkbench().getIntroManager().setIntroStandby(introPart,
-				true);
-		// } else {
-		if (!isIntroViewExistsInLastSession()) {
-			closeIntroView();
-		}
-	}
-
-	private boolean isIntroViewExistsInLastSession() {
-		IPreferenceStore store = RCPUIPlugin.getDefault().getPreferenceStore();
-		return store.getBoolean("welcome_intro_view_exists"); //$NON-NLS-1$
-	}
-
-	private void closeIntroView() {
-		try {
-			IViewPart vp = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().findView(
-							"org.eclipse.ui.internal.introview"); //$NON-NLS-1$
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().hideView(vp);
-
-		} catch (Exception e) {
-
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/RCPUIPlugin.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/RCPUIPlugin.java
deleted file mode 100644
index 92ad3fa..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/RCPUIPlugin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The RCP UI plug-in class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RCPUIPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static RCPUIPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public RCPUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static RCPUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/RCPUIResources.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/RCPUIResources.java
deleted file mode 100644
index e8d8afa..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/RCPUIResources.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.epf.rcp.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class RCPUIResources extends NLS {
-
-	private static String BUNDLE_NAME = RCPUIResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private RCPUIResources() {
-		// Do not instantiate
-	}
-
-	public static String fileMenuItem_text;
-
-	public static String fileNewMenuItem_text;
-
-	public static String fileOpenMenuItem_text;
-
-	public static String editMenuItem_text;
-
-	public static String navigateMenuItem_text;
-
-	public static String searchMenuItem_text;
-
-	public static String configurationMenuItem_text;
-
-	public static String windowMenuItem_text;
-
-	public static String windowOpenPerspectiveMenuItem_text;
-
-	public static String windowShowViewMenuItem_text;
-
-	public static String helpMenuItem_text;
-
-	public static String newDropDown_tooltip_text;
-
-	public static String otherMenuItem_text;
-
-	public static String openAuthoringPerspectiveAction_text;
-
-	public static String openBrowsingPerspectiveAction_text;
-
-	public static String editAction_text;
-
-	public static String upgradeLibraryAction_text;
-
-	public static String startup_dir_log_info_text;
-
-	public static String menu_help_software_updates_manage_software_config_text;
-
-	public static String workspaceCannotLockTitle;
-
-	public static String workspaceCannotLockMessage;
-
-	public static String mainActionBarAdvisor_Diagnosis;
-
-	public static String mainActionBarAdvisor_HealthCheck;
-
-	public static String mainActionBarAdvisor_RemoveReference;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, RCPUIResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/Resources.properties b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/Resources.properties
deleted file mode 100644
index b130672..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/Resources.properties
+++ /dev/null
@@ -1,57 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# File Menu
-fileMenuItem_text=&File
-fileNewMenuItem_text=&New
-fileOpenMenuItem_text=O&pen
-
-# Edit Menu
-editMenuItem_text=&Edit
-
-# Navigate Menu
-navigateMenuItem_text=&Navigate
-
-# Search Menu
-searchMenuItem_text=&Search
-
-# Configuration Menu
-configurationMenuItem_text=&Configuration
-
-# Window Menu
-windowMenuItem_text=&Window
-windowOpenPerspectiveMenuItem_text=&Open Perspective
-windowShowViewMenuItem_text=Show &View
-
-# Help Menu
-helpMenuItem_text=&Help
-
-# New Drop Down Menu
-newDropDown_tooltip_text=New
-otherMenuItem_text=Other...
-
-# Open Perspective Actions
-openAuthoringPerspectiveAction_text=Authoring
-openBrowsingPerspectiveAction_text=Browsing
-
-# Misc Actions
-editAction_text=&Edit
-upgradeLibraryAction_text=Upgrade Method Library from I1 to I2...
-
-startup_dir_log_info_text=INFO: Application start directory =
-menu_help_software_updates_manage_software_config_text=&Manage Software Configuration...
-
-workspaceCannotLockTitle=Cannot start {0}
-workspaceCannotLockMessage={0} cannot be started while another instance is running.  Switch to the running instance or close it and restart the application again.
-mainActionBarAdvisor_Diagnosis=Diagnosis and Repair Tools
-mainActionBarAdvisor_HealthCheck=Perform Health Check on Library...
-mainActionBarAdvisor_RemoveReference=Remove References to Invalid Objects...
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/ActionConstants.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/ActionConstants.java
deleted file mode 100644
index 57f92d6..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/ActionConstants.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-/**
- * Defines the menu and toolbar paths for adding actions.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ActionConstants {
-
-	/**
-	 * File > New menu group name for adding New actions
-	 */
-	public static final String NEW = "new"; //$NON-NLS-1$
-
-	/**
-	 * File > Open menu group name for adding Open actions
-	 */
-	public static final String OPEN = "open"; //$NON-NLS-1$
-
-	/**
-	 * Search menu group names for adding Search actions
-	 */
-	public static final String SEARCH = "search"; //$NON-NLS-1$
-
-	public static final String SEARCH_START = "searchStart"; //$NON-NLS-1$
-
-	public static final String SEARCH_END = "searchEnd"; //$NON-NLS-1$ 
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/IntroductionAction.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/IntroductionAction.java
deleted file mode 100644
index 35ef6ee..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/IntroductionAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-import org.eclipse.epf.rcp.ui.RCPUIPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.IntroAction;
-
-/**
- * Displays the welcome screen for the application.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class IntroductionAction extends IntroAction {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param window
-	 *            the workbench window
-	 */
-	public IntroductionAction(IWorkbenchWindow window) {
-		super(window);
-	}
-
-	/**
-	 * Gets the image descriptor for this action.
-	 * 
-	 * @return an image descriptor associated with this action.
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		ImageDescriptor imgDescriptor = RCPUIPlugin.getDefault()
-				.getImageDescriptor("full/obj16/product.gif"); //$NON-NLS-1$
-		return imgDescriptor;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/NewButtonAction.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/NewButtonAction.java
deleted file mode 100644
index 676a236..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/NewButtonAction.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.rcp.ui.RCPUIPlugin;
-import org.eclipse.epf.rcp.ui.RCPUIResources;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-/**
- * Displays a drop down combo for creating new method library, plug-in and
- * configuration. This action is invoked via the New button on the system
- * toolbar.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public class NewButtonAction extends Action implements IMenuCreator {
-
-	private Menu fileNewDropdown = null;
-
-	/* Shell-Sharing
-	private NewLibraryAction newLibraryAction = null;
-
-	private NewPluginAction newPluginAction = null;
-
-	private NewConfigurationAction newConfigurationAction = null;
-
-	private NewWizardAction newWizardAction = null;
-	*/
-
-	/**
-	 * Creates a new instance.
-	 */
-	public NewButtonAction() {
-		setId("fileNewDropdown"); //$NON-NLS-1$
-		setToolTipText(RCPUIResources.newDropDown_tooltip_text);
-
-		ImageDescriptor imageDescriptor = RCPUIPlugin.getDefault()
-				.getImageDescriptor("new_con.gif"); //$NON-NLS-1$
-		setImageDescriptor(imageDescriptor);
-
-		setMenuCreator(this);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(Control)
-	 */
-	public Menu getMenu(Control parent) {
-		if (fileNewDropdown != null) {
-			return fileNewDropdown;
-		}
-
-		fileNewDropdown = new Menu(parent);
-		MenuItem newLibraryMItem = new MenuItem(fileNewDropdown, SWT.PUSH);
-		newLibraryMItem.setText(LibraryUIText.TEXT_METHOD_LIBARARY);
-		new MenuItem(fileNewDropdown, SWT.SEPARATOR);
-		MenuItem newPluginMItem = new MenuItem(fileNewDropdown, SWT.PUSH);
-		newPluginMItem.setText(LibraryUIText.TEXT_METHOD_PLUGIN);
-		MenuItem newConfigMItem = new MenuItem(fileNewDropdown, SWT.PUSH);
-		newConfigMItem.setText(LibraryUIText.TEXT_METHOD_CONFIGURATON);
-		new MenuItem(fileNewDropdown, SWT.SEPARATOR);
-		MenuItem newOtherMItem = new MenuItem(fileNewDropdown, SWT.PUSH);
-		newOtherMItem.setText(RCPUIResources.otherMenuItem_text);
-
-		/* Shell-Sharing		
-		newLibraryAction = new NewLibraryAction();
-		newPluginAction = new NewPluginAction();
-		newConfigurationAction = new NewConfigurationAction();
-		if (newWizardAction == null) {
-			IWorkbenchWindow wbWindow = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			newWizardAction = new NewWizardAction(wbWindow);
-		}
-
-		newLibraryMItem.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				newLibraryAction.run();
-			}
-		});
-		
-		newPluginMItem.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				newPluginAction.run();
-			}
-		});
-		newConfigMItem.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				newConfigurationAction.run();
-			}
-		});
-		
-		newOtherMItem.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				newWizardAction.run();
-			}
-		});
-		*/
-
-		return fileNewDropdown;
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		/*
-		if (newWizardAction == null) {
-			IWorkbenchWindow wbWindow = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow();
-			newWizardAction = new NewWizardAction(wbWindow);
-		}
-		newWizardAction.run();
-		*/
-	}
-
-	/**
-	 * dispose the fileNewDropdown object
-	 */
-	public void dispose() {
-		if (fileNewDropdown != null) {
-			fileNewDropdown.dispose();
-			fileNewDropdown = null;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/NewWizardMenu.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/NewWizardMenu.java
deleted file mode 100644
index 660d442..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/NewWizardMenu.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-import java.util.List;
-
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.BaseNewWizardMenu;
-
-/**
- * Populates the File > New menu with new wizards categorized under
- * "org.eclipse.epf.ui.newWizards.category".
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class NewWizardMenu extends BaseNewWizardMenu {
-
-	/**
-	 * Creates a new wizard shortcut menu for the IDE.
-	 * 
-	 * @param window
-	 *            the window containing the menu
-	 * @param id
-	 *            the contribution item identifier, or <code>null</code>
-	 */
-	public NewWizardMenu(IWorkbenchWindow window, String id) {
-		super(window, id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.BaseNewWizardMenu#addItems(org.eclipse.jface.action.IContributionManager)
-	 */
-	protected void addItems(List list) {
-		if (addShortcuts(list)) {
-			// Add a separator after the Method COnfiguration menu item.
-			if (list.size() > 3) {
-				list.add(3, new Separator());
-			}
-			list.add(new Separator());
-		}
-		list.add(new ActionContributionItem(getShowDialogAction()));
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIActionFactory.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIActionFactory.java
deleted file mode 100644
index e361e74..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIActionFactory.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/eplv10.html
-//
-// Contributors:
-// IBM Corporation  initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-import org.eclipse.epf.rcp.ui.RCPUIResources;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.actions.RetargetAction;
-
-/**
- * Creates actions that are specific to the EPF Composer workbench.
- * 
- * @author Bingxue Xu
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class UIActionFactory extends ActionFactory {
-
-	/**
-	 * Creates a new instance.
-	 */
-	protected UIActionFactory(String actionId) {
-		super(actionId);
-	}
-
-	/**
-	 * Create a customized SHOW_INTRO action
-	 */
-	public static final ActionFactory SHOW_INTRO = new ActionFactory("intro") { //$NON-NLS-1$
-		public IWorkbenchAction create(IWorkbenchWindow window) {
-			if (window == null) {
-				throw new IllegalArgumentException();
-			}
-			IWorkbenchAction action = new IntroductionAction(window);
-			action.setId(getId());
-			return action;
-		}
-	};
-
-	/**
-	 * Create a customized OPEN_ELEMENT action that is equavilent to the EDIT menu
-	 */
-	public static final ActionFactory OPEN_ELEMENT = new ActionFactory("edit") { //$NON-NLS-1$
-		public IWorkbenchAction create(IWorkbenchWindow window) {
-			if (window == null) {
-				throw new IllegalArgumentException();
-			}
-			RetargetAction action = new RetargetAction("OpenElement",  //$NON-NLS-1$
-					RCPUIResources.editMenuItem_text);
-			window.getPartService().addPartListener(action);
-			action
-					.setActionDefinitionId("org.eclipse.epf.rcp.ui.actions.openElement");  //$NON-NLS-1$
-			ISharedImages sharedImages = window.getWorkbench()
-					.getSharedImages();
-			action.setImageDescriptor(sharedImages
-					.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-			action.setDisabledImageDescriptor(sharedImages
-					.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-
-			return action;
-		}
-	};
-	
-	/**
-	 * Create a customized IMPORT action
-	 */
-	public static final ActionFactory UI_IMPORT = new ActionFactory("import") { //$NON-NLS-1$
-				public IWorkbenchAction create(IWorkbenchWindow window) {
-					if (window == null) {
-						throw new IllegalArgumentException();
-					}
-					IWorkbenchAction action = new UIImportResourcesAction(window);
-					action.setId(getId());
-					return action;
-				}
-	};
-		
-	/**
-	 * Workbench action (id "export"): Opens the export wizard. This action
-	 * maintains its enablement state.
-	 */
-	public static final ActionFactory UI_EXPORT = new ActionFactory("export") { //$NON-NLS-1$
-		public IWorkbenchAction create(IWorkbenchWindow window) {
-			if (window == null) {
-				throw new IllegalArgumentException();
-			}
-			IWorkbenchAction action = new UIExportResourcesAction(window);
-			action.setId(getId());
-			return action;
-		}
-	};
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIExportResourcesAction.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIExportResourcesAction.java
deleted file mode 100644
index 7d3dfad..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIExportResourcesAction.java
+++ /dev/null
@@ -1,127 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/eplv10.html
-//
-// Contributors:
-// IBM Corporation  initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-import org.eclipse.epf.rcp.ui.wizards.UIExportWizard;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ExportResourcesAction;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-/**
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-
-public class UIExportResourcesAction extends ExportResourcesAction {
-
-	private static final int SIZING_WIZARD_WIDTH = 470;
-
-	private static final int SIZING_WIZARD_HEIGHT = 550;
-
-	/**
-	 * The workbench window; or <code>null</code> if this action has been
-	 * <code>dispose</code>d.
-	 */
-	private IWorkbenchWindow workbenchWindow;
-
-	/**
-	 * Constructor
-	 * @param workbench
-	 */
-	public UIExportResourcesAction(IWorkbench workbench) {
-		this(workbench.getActiveWorkbenchWindow());
-	}
-
-	/**
-	 * Constructor
-	 * @param workbench
-	 * @param label
-	 */
-	public UIExportResourcesAction(IWorkbench workbench, String label) {
-		this(workbench.getActiveWorkbenchWindow(), label);
-	}
-
-	/**
-	 * Constructor
-	 * @param window
-	 */
-	public UIExportResourcesAction(IWorkbenchWindow window) {
-		this(window, WorkbenchMessages.ExportResourcesAction_text);
-	}
-
-	/**
-	 * Constructor
-	 * @param window
-	 * @param label
-	 */
-	public UIExportResourcesAction(IWorkbenchWindow window, String label) {
-		super(window, label);
-		this.workbenchWindow = window;
-	}
-
-	public UIExportWizard getUIExportWizard() {
-		return new UIExportWizard();
-	}
-	
-	/**
-	 * Invoke the Export wizards selection Wizard.
-	 */
-	public void run() {
-		if (workbenchWindow == null) {
-			// action has been disposed
-			return;
-		}
-		UIExportWizard wizard = getUIExportWizard();
-		IStructuredSelection selectionToPass;
-		// get the current workbench selection
-		ISelection workbenchSelection = workbenchWindow.getSelectionService()
-				.getSelection();
-		if (workbenchSelection instanceof IStructuredSelection) {
-			selectionToPass = (IStructuredSelection) workbenchSelection;
-		} else {
-			selectionToPass = StructuredSelection.EMPTY;
-		}
-
-		wizard.init(workbenchWindow.getWorkbench(), selectionToPass);
-		IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		IDialogSettings wizardSettings = workbenchSettings
-				.getSection("ExportResourcesAction");  //$NON-NLS-1$
-		if (wizardSettings == null)
-			wizardSettings = workbenchSettings
-					.addNewSection("ExportResourcesAction");  //$NON-NLS-1$
-		wizard.setDialogSettings(wizardSettings);
-		wizard.setForcePreviousAndNextButtons(true);
-
-		Shell parent = workbenchWindow.getShell();
-		WizardDialog dialog = new WizardDialog(parent, wizard);
-		dialog.create();
-		dialog.getShell().setSize(
-				Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-				SIZING_WIZARD_HEIGHT);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
-				IWorkbenchHelpContextIds.EXPORT_WIZARD);
-		dialog.open();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIImportResourcesAction.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIImportResourcesAction.java
deleted file mode 100644
index a5cc65f..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIImportResourcesAction.java
+++ /dev/null
@@ -1,105 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/eplv10.html
-//
-// Contributors:
-// IBM Corporation  initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-import org.eclipse.epf.rcp.ui.wizards.UIExportWizard;
-import org.eclipse.epf.rcp.ui.wizards.UIImportWizard;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ImportResourcesAction;
-import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-/**
- * Defines the class.
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-
-public class UIImportResourcesAction extends ImportResourcesAction {
-
-	private IWorkbenchWindow workbenchWindow;
-
-	private static final int SIZING_WIZARD_WIDTH = 470;
-
-	private static final int SIZING_WIZARD_HEIGHT = 550;
-
-	/**
-	 * Constructor
-	 * @param workbench
-	 */
-	public UIImportResourcesAction(IWorkbench workbench) {
-		this(workbench.getActiveWorkbenchWindow());
-	}
-
-	/**
-	 * Constructor
-	 * @param window
-	 */
-	public UIImportResourcesAction(IWorkbenchWindow window) {
-		super(window);
-		this.workbenchWindow = window;
-	}
-
-	public UIImportWizard getUIImportWizard() {
-		return new UIImportWizard();
-	}
-	
-	/**
-	 * Invoke the Import wizards selection Wizard.
-	 */
-	public void run() {
-		if (workbenchWindow == null) {
-			// action has been disposed
-			return;
-		}
-		UIImportWizard wizard = getUIImportWizard();
-		IStructuredSelection selectionToPass;
-		// get the current workbench selection
-		ISelection workbenchSelection = workbenchWindow.getSelectionService()
-				.getSelection();
-		if (workbenchSelection instanceof IStructuredSelection) {
-			selectionToPass = (IStructuredSelection) workbenchSelection;
-		} else {
-			selectionToPass = StructuredSelection.EMPTY;
-		}
-
-		wizard.init(workbenchWindow.getWorkbench(), selectionToPass);
-		IDialogSettings workbenchSettings = WorkbenchPlugin.getDefault()
-				.getDialogSettings();
-		IDialogSettings wizardSettings = workbenchSettings
-				.getSection("ImportResourcesAction"); //$NON-NLS-1$
-		if (wizardSettings == null)
-			wizardSettings = workbenchSettings
-					.addNewSection("ImportResourcesAction"); //$NON-NLS-1$
-		wizard.setDialogSettings(wizardSettings);
-		wizard.setForcePreviousAndNextButtons(true);
-
-		Shell parent = workbenchWindow.getShell();
-		WizardDialog dialog = new WizardDialog(parent, wizard);
-		dialog.create();
-		dialog.getShell().setSize(
-				Math.max(SIZING_WIZARD_WIDTH, dialog.getShell().getSize().x),
-				SIZING_WIZARD_HEIGHT);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(dialog.getShell(),
-				IWorkbenchHelpContextIds.IMPORT_WIZARD);
-		dialog.open();
-	}
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIOpenPerspectiveDialogAction.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIOpenPerspectiveDialogAction.java
deleted file mode 100644
index 1b17d39..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/UIOpenPerspectiveDialogAction.java
+++ /dev/null
@@ -1,65 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/eplv10.html
-//
-// Contributors:
-// IBM Corporation  initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.actions;
-
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.jface.window.Window;
-import org.eclipse.ui.IPerspectiveDescriptor;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.internal.actions.OpenPerspectiveDialogAction;
-import org.eclipse.ui.internal.dialogs.SelectPerspectiveDialog;
-
-/**
- * Defines the class.
- * 
- * @author Bingxue Xu
- * @since 1.0
- */
-
-public class UIOpenPerspectiveDialogAction extends OpenPerspectiveDialogAction {
-	private IWorkbenchWindow workbenchWindow;
-
-	/**
-	 * Constructor
-	 * @param window
-	 */
-	public UIOpenPerspectiveDialogAction(IWorkbenchWindow window) {
-		super(window);
-		this.workbenchWindow = window;
-	}
-
-	 /**
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.Action#run()
-     */
-	public void run() {
-		if (workbenchWindow == null) {
-			return;
-		}
-		SelectPerspectiveDialog dlg = new SelectPerspectiveDialog(
-				workbenchWindow.getShell(), workbenchWindow.getWorkbench()
-						.getPerspectiveRegistry());
-		dlg.open();
-		if (dlg.getReturnCode() == Window.CANCEL)
-			return;
-		IPerspectiveDescriptor desc = dlg.getSelection();
-		if (desc != null) {
-			PerspectiveUtil.openPerspective(desc.getId());
-		}
-	}
-
-	public void dispose() {
-		workbenchWindow = null;
-		super.dispose();
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/package.html b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/package.html
deleted file mode 100644
index b48e761..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/actions/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides actions for the standalone RCP-based EPF Composer.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/package.html b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/package.html
deleted file mode 100644
index 8fdced8..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for the standalone RCP-based EPF Composer.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIExportWizard.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIExportWizard.java
deleted file mode 100644
index 8d875eb..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIExportWizard.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.wizards;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.ui.wizards.WizardCategories;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.ExportWizard;
-import org.eclipse.ui.internal.dialogs.WizardCollectionElement;
-import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.wizards.IWizardCategory;
-
-/**
- * UIExport class will filter out the wizard categories which are not related 
- * to EPF. UIExport allows only UnCategorized <link>WizardsRegistryReader.UNCATEGORIZED_WIZARD_CATEGORY</link>
- * category  (<link>org.eclipse.ui.Others</link>)
- * and filters as well in Others category wizards list.  
- * 
- * @author Bingxue Xu
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class UIExportWizard extends ExportWizard {
-
-	protected AdaptableList getAvailableExportWizards() {
-		// TODO: exports are still flat - we need to get at the flat list. All
-		// wizards will be in the "other" category.
-		IWizardCategory root = WorkbenchPlugin.getDefault()
-				.getExportWizardRegistry().getRootCategory();
-		WizardCollectionElement category = (WizardCollectionElement) root
-				.findCategory(new Path(WizardCategories.EXPORT_WIZARDS_CATEGORY));
-		
-		AdaptableList result;
-		if (category == null)
-			result = new AdaptableList();
-		else
-			result = category.getWizardAdaptableList();
-
-		AdaptableList filteredResult = doFilter(result);
-		if(filteredResult.size() > 0){
-			return filteredResult;
-		}
-		return result;
-	}
-	
-	/**
-	 * filter out non-allowable export wizard categories
-	 * @param list
-	 * @return AdaptableList
-	 */
-	public AdaptableList doFilter(AdaptableList list){
-		List extensions = UIExportWizardExtensionPoint.getInstance().getPageProviders();
-		AdaptableList filteredResult = new AdaptableList();
-		Object[] objs = list.getChildren();
-		for (int i = 0; i < objs.length; i++) {
-			WorkbenchWizardElement obj = (WorkbenchWizardElement) objs[i];
-			String id = obj.getId();
-			if(!extensions.isEmpty() && extensions.contains(id)){
-				filteredResult.add(obj);
-			}
-		}
-		return filteredResult;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIExportWizardExtensionPoint.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIExportWizardExtensionPoint.java
deleted file mode 100644
index 36997d7..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIExportWizardExtensionPoint.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.rcp.ui.RCPUIPlugin;
-
-/**
- * Manages the 'org.eclipse.epf.ui.exportWizards" extension point.
- * <p>
- * This extension point allows a contributing plug-in to add its export wizards
- * to the standalone RCP-based EPF Composer Export wizard page.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class UIExportWizardExtensionPoint {
-
-	/**
-	 * The extension namespace.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAMESPACE = "org.eclipse.epf.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension name.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAME = "exportWizards"; //$NON-NLS-1$
-
-	/**
-	 * The extension Attributes
-	 */
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_ID = "id"; //$NON-NLS-1$
-
-	private ArrayList extensionsList = new ArrayList();
-
-	// The shared instance.
-	private static UIExportWizardExtensionPoint instance = null;
-
-	public static UIExportWizardExtensionPoint getInstance() {
-		if (instance == null) {
-			synchronized (UIImportWizardExtensionPoint.class) {
-				if (instance == null) {
-					instance = new UIExportWizardExtensionPoint();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private UIExportWizardExtensionPoint() {
-	}
-
-	/**
-	 * Returns all the page providers
-	 * 
-	 * @return all the page providers.
-	 */
-	public List getPageProviders() {
-		return extensionsList;
-	}
-
-	/**
-	 * Loads the configuration providers specified via the
-	 * "org.eclipse.epf.ui.exportWizards" extension point.
-	 */
-	public void loadExtension() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				PAGE_PROVIDERS_EXTENSION_NAMESPACE,
-				PAGE_PROVIDERS_EXTENSION_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String id = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_ID);
-						extensionsList.add(id);
-
-					} catch (Exception e) {
-						RCPUIPlugin
-								.getDefault()
-								.getLogger()
-								.logError(
-										"Failed to export import contribution extension points", e); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIImportWizard.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIImportWizard.java
deleted file mode 100644
index 753a0eb..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIImportWizard.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.rcp.ui.wizards;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.epf.ui.wizards.WizardCategories;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.ImportWizard;
-import org.eclipse.ui.internal.dialogs.WizardCollectionElement;
-import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement;
-import org.eclipse.ui.model.AdaptableList;
-import org.eclipse.ui.wizards.IWizardCategory;
-
-/**
- * UIImport class will filter out the wizard categories which are not related to
- * EPF. UIImport allows only UnCategorized
- * <link>WizardsRegistryReader.UNCATEGORIZED_WIZARD_CATEGORY</link> category (<link>org.eclipse.ui.Others</link>)
- * and filters as well in Others category wizards list.
- * 
- * @author Bingxue Xu
- * @author Shashidhar Kannoori
- * @autor Kelvin Low
- * @since 1.0
- */
-
-public class UIImportWizard extends ImportWizard {
-
-	/**
-	 * Returns the import wizards that are available for invocation. Also filter
-	 * import wizard list of uncategorized (org.eclipse.ui.Others)
-	 */
-	protected AdaptableList getAvailableImportWizards() {
-		// TODO: imports are still flat - we need to get at the flat list. All
-		// wizards will be in the "other" category.
-		IWizardCategory root = WorkbenchPlugin.getDefault()
-				.getImportWizardRegistry().getRootCategory();
-		WizardCollectionElement category = (WizardCollectionElement) root
-				.findCategory(new Path(WizardCategories.IMPORT_WIZARDS_CATEGORY));
-		AdaptableList result;
-		if (category == null)
-			result = new AdaptableList();
-		else
-			result = category.getWizardAdaptableList();
-
-		AdaptableList filteredResult = doFilter(result);
-		if (filteredResult.size() > 0) {
-			return filteredResult;
-		}
-		return result;
-	}
-
-	/**
-	 * Filter out non-allowable import wizard categories
-	 * 
-	 * @param list
-	 * @return AdaptableList
-	 */
-	public AdaptableList doFilter(AdaptableList list) {
-		List extensions = UIImportWizardExtensionPoint.getInstance()
-				.getPageProviders();
-		AdaptableList filteredResult = new AdaptableList();
-		Object[] objs = list.getChildren();
-		for (int i = 0; i < objs.length; i++) {
-			WorkbenchWizardElement obj = (WorkbenchWizardElement) objs[i];
-			String id = obj.getId();
-			if (!extensions.isEmpty() && extensions.contains(id)) {
-				filteredResult.add(obj);
-			}
-		}
-		return filteredResult;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIImportWizardExtensionPoint.java b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIImportWizardExtensionPoint.java
deleted file mode 100644
index 5155f50..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/UIImportWizardExtensionPoint.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * 
- */
-package org.eclipse.epf.rcp.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.rcp.ui.RCPUIPlugin;
-
-/**
- * Manages the 'org.eclipse.epf.ui.importWizards" extension point.
- * <p>
- * This extension point allows a contributing plug-in to add its import wizards
- * to the standalone RCP-based EPF Composer Import wizard page.
- * 
- * @author Shashidhar Kannoori
- * @author Kelvin Low
- * @since 1.0
- */
-public class UIImportWizardExtensionPoint {
-
-	/**
-	 * The extension namespace.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAMESPACE = "org.eclipse.epf.ui"; //$NON-NLS-1$
-
-	/**
-	 * The extension name.
-	 */
-	public static final String PAGE_PROVIDERS_EXTENSION_NAME = "importWizards"; //$NON-NLS-1$
-
-	/**
-	 * The extension Attributes
-	 */
-	public static final String PAGE_PROVIDER_EXTENSION_ATTR_ID = "id"; //$NON-NLS-1$
-
-	private ArrayList extensionsList = new ArrayList();
-
-	// The shared instance.
-	private static UIImportWizardExtensionPoint instance = null;
-
-	public static UIImportWizardExtensionPoint getInstance() {
-		if (instance == null) {
-			synchronized (UIImportWizardExtensionPoint.class) {
-				if (instance == null) {
-					instance = new UIImportWizardExtensionPoint();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	private UIImportWizardExtensionPoint() {
-	}
-
-	/**
-	 * Returns all the page providers
-	 * 
-	 * @return all the page providers.
-	 */
-	public List getPageProviders() {
-		return extensionsList;
-	}
-
-	/**
-	 * Loads the configuration providers specified via the
-	 * "com.ibm.process.pageProviders" extension point.
-	 */
-	public void loadExtension() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(
-				PAGE_PROVIDERS_EXTENSION_NAMESPACE,
-				PAGE_PROVIDERS_EXTENSION_NAME);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					try {
-						String id = configElement
-								.getAttribute(PAGE_PROVIDER_EXTENSION_ATTR_ID);
-						extensionsList.add(id);
-
-					} catch (Exception e) {
-						RCPUIPlugin
-								.getDefault()
-								.getLogger()
-								.logError(
-										"Failed to export import contribution extension points", e); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/package.html b/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/package.html
deleted file mode 100644
index edd0e7f..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp.ui/src/org/eclipse/epf/rcp/ui/wizards/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides export and import wizards UI management in the standalone RCP-based EPF Composer.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp/.classpath b/1.5/plugins/org.eclipse.epf.rcp/.classpath
deleted file mode 100644
index ddf0f40..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.rcp/.project b/1.5/plugins/org.eclipse.epf.rcp/.project
deleted file mode 100644
index 245183a..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.rcp</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.rcp/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.rcp/META-INF/MANIFEST.MF
deleted file mode 100644
index 1b0fa2d..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,9 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %featurePluginName
-Bundle-SymbolicName: org.eclipse.epf.rcp; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.rcp/about.html b/1.5/plugins/org.eclipse.epf.rcp/about.html
deleted file mode 100644
index 4c99086..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>February 24, 2005</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.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp/about.ini b/1.5/plugins/org.eclipse.epf.rcp/about.ini
deleted file mode 100644
index 604f4fa..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/about.ini
+++ /dev/null
@@ -1,21 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2004, 2005 IBM Corporation.  All Rights Reserved.
-#-------------------------------------------------------------------------------
-
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%featureText
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=application_32.gif
-
-# Property "appName" contains name of the application (translated)
-appName=%featureName
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-welcomePage=$nl$/welcome.xml
diff --git a/1.5/plugins/org.eclipse.epf.rcp/about.mappings b/1.5/plugins/org.eclipse.epf.rcp/about.mappings
deleted file mode 100644
index 0b80b3b..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/about.mappings
+++ /dev/null
@@ -1,8 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-# Usually generated at build time.
-
-0=@build-ID@
-1=1.2.0.2
diff --git a/1.5/plugins/org.eclipse.epf.rcp/about.properties b/1.5/plugins/org.eclipse.epf.rcp/about.properties
deleted file mode 100644
index 0454311..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/about.properties
+++ /dev/null
@@ -1,39 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-Version: {1} \n\
-Build Label: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n\
-
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/application_32.gif b/1.5/plugins/org.eclipse.epf.rcp/application_32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/application_32.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.rcp/build.properties b/1.5/plugins/org.eclipse.epf.rcp/build.properties
deleted file mode 100644
index de0529c..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-bin.includes = .,\
-               META-INF/,\
-               nl/,\
-               about.html,\
-               about.ini,\
-               about.properties,\
-               application_32.gif,\
-               welcome.xml,\
-               plugin.properties,\
-               about.mappings
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/da/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/da/about.properties
deleted file mode 100644
index 1ed751e..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/da/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-Version: {1} \n\
-Byggeetiket: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007. All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/de/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/de/about.properties
deleted file mode 100644
index 4752a23..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/de/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF - RCP
-
-featureText=EPF RCP\n\
-\n\
-Version: {1} \n\
-Build-Kennsatz: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/es/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/es/about.properties
deleted file mode 100644
index 2dab029..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/es/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=RCP de EPF
-
-featureText=EPF RCP\n\
-\n\
-Versi\u00f3n: {1} \n\
-Etiqueta de build: {0}\n\
-\n\
-(c) Copyright Colaboradores de Eclipse y otros 2000, 2007.  Reservados todos los derechos.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/fr/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/fr/about.properties
deleted file mode 100644
index 3b820ea..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/fr/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-Version : {1} \n\
-Libell\u00e9 de version : {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/it/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/it/about.properties
deleted file mode 100644
index a3fe1fe..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/it/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=RCP EPF
-
-featureText=EPF RCP\n\
-\n\
-Versione: {1} \n\
-Etichetta build: {0}\n\
-\n\
-(c) Copyright Eclipse contributors e altri 2000, 2007.  Tutti i diritti riservati.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/ja/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/ja/about.properties
deleted file mode 100644
index 11e8524..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/ja/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-\u30d0\u30fc\u30b8\u30e7\u30f3: {1} \n\
-\u30d3\u30eb\u30c9\u30fb\u30e9\u30d9\u30eb: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/ko/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/ko/about.properties
deleted file mode 100644
index effd55d..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/ko/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-\ubc84\uc804: {1} \n\
-\ube4c\ub4dc \ub808\uc774\ube14: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/pt/BR/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/pt/BR/about.properties
deleted file mode 100644
index b0006f2..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/pt/BR/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-Vers\u00e3o: {1} \n\
-Constru\u00e7\u00e3o: {0}\n\
-\n\
-(c) Copyright contribuidores Eclipse e outros 2000, 2007. Todos os Direitos Reservados.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/ru/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/ru/about.properties
deleted file mode 100644
index 90142a9..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/ru/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-\u0412\u0435\u0440\u0441\u0438\u044f: {1} \n\
-\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  \u0412\u0441\u0435 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/zh/CN/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/zh/CN/about.properties
deleted file mode 100644
index 170529a..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/zh/CN/about.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-\u7248\u672c\uff1a{1} \n\
-\u5de5\u4f5c\u7248\u672c\u6807\u7b7e\uff1a{0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n \n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/nl/zh/TW/about.properties b/1.5/plugins/org.eclipse.epf.rcp/nl/zh/TW/about.properties
deleted file mode 100644
index a6079e0..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/nl/zh/TW/about.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ==============================================================================
-# Do not change the properties between this line and the last line containing:
-# %%% END OF TRANSLATED PROPERTIES %%%
-# Instead, either redefine an existing property, or create a new property,
-# append it to the end of the file, and change the code to use the new name.
-# ==============================================================================
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-featureName=EPF RCP
-
-featureText=EPF RCP\n\
-\n\
-\u7248\u672c\uff1a{1}\n\
-\u5efa\u7f6e\u6a19\u7c64\uff1a{0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2000, 2007.  All Rights Reserved.\n\
-\n
-# ==============================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# The above properties have been shipped for translation.
-# ==============================================================================
diff --git a/1.5/plugins/org.eclipse.epf.rcp/plugin.properties b/1.5/plugins/org.eclipse.epf.rcp/plugin.properties
deleted file mode 100644
index eb9fe1d..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-featurePluginName=EPF RCP Feature
-featurePluginNameNL=EPF RCP Feature (NL1)
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.rcp/welcome.xml b/1.5/plugins/org.eclipse.epf.rcp/welcome.xml
deleted file mode 100644
index b640d04..0000000
--- a/1.5/plugins/org.eclipse.epf.rcp/welcome.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?> 
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<welcomePage 
-	title="Eclipse Process Framework">
-
-<intro>Welcome to Eclipse Process Framework
-</intro>
-
-<item><b>What is Eclipse Process Framework?</b>
-	
-</item>
-
-<item><b>Learn More</b>
-
-</item>
-
-</welcomePage>
diff --git a/1.5/plugins/org.eclipse.epf.richtext/.classpath b/1.5/plugins/org.eclipse.epf.richtext/.classpath
deleted file mode 100644
index 8c4f20f..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/.classpath
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
-		<attributes>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.richtext/.options b/1.5/plugins/org.eclipse.epf.richtext/.options
deleted file mode 100644
index 90dd897..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Rich Text plug-in
-org.eclipse.epf.richtext/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.richtext/.project b/1.5/plugins/org.eclipse.epf.richtext/.project
deleted file mode 100644
index 4b79a77..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.richtext</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.richtext/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.richtext/META-INF/MANIFEST.MF
deleted file mode 100644
index 5d19c4b..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.richtext
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: richtext.jar
-Bundle-Activator: org.eclipse.epf.richtext.RichTextPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.common,
- org.eclipse.core.runtime,
- org.eclipse.ui,
- org.eclipse.ui.forms,
- org.eclipse.jface.text,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.epf.ui,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.richtext,
- org.eclipse.epf.richtext.actions,
- org.eclipse.epf.richtext.dialogs,
- org.eclipse.epf.richtext.html,
- org.eclipse.epf.richtext.preferences
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.richtext/build.properties b/1.5/plugins/org.eclipse.epf.richtext/build.properties
deleted file mode 100644
index cffbf8f..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/build.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-source.richtext.jar = src/
-output.richtext.jar = bin/
-bin.includes = richtext.jar,\
-               icons/,\
-               META-INF/,\
-               rte/,\
-               plugin.xml,\
-               plugin.properties,\
-               .options
-
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddImage.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddImage.gif
deleted file mode 100644
index 4308a8a..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddImage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddLink.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddLink.gif
deleted file mode 100644
index 7b11196..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddLink.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddOrderedList.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddOrderedList.gif
deleted file mode 100644
index f9ae415..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddOrderedList.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddTable.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddTable.gif
deleted file mode 100644
index 2088462..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddTable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddUnorderedList.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddUnorderedList.gif
deleted file mode 100644
index 9c44ec6..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/AddUnorderedList.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Bold.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Bold.gif
deleted file mode 100644
index 2dc5987..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Bold.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/ClearContent.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/ClearContent.gif
deleted file mode 100644
index 9ff6416..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/ClearContent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Copy.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Copy.gif
deleted file mode 100644
index e9bc65e..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Copy.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Cut.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Cut.gif
deleted file mode 100644
index bd43144..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Cut.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/FindReplace.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/FindReplace.gif
deleted file mode 100644
index c8f8871..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/FindReplace.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Indent.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Indent.gif
deleted file mode 100644
index 436e153..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Indent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Italic.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Italic.gif
deleted file mode 100644
index c9b5a44..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Italic.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Outdent.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Outdent.gif
deleted file mode 100644
index edcda3e..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Outdent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Paste.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Paste.gif
deleted file mode 100644
index 1c7668d..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Paste.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/PastePlainText.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/PastePlainText.gif
deleted file mode 100644
index d01a229..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/PastePlainText.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Subscript.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Subscript.gif
deleted file mode 100644
index a7b31aa..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Subscript.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Superscript.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Superscript.gif
deleted file mode 100644
index e4b266c..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Superscript.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/TidyHTML.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/TidyHTML.gif
deleted file mode 100644
index 36bc9df..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/TidyHTML.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Underline.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Underline.gif
deleted file mode 100644
index e2a9646..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/dtool16/Underline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddImage.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddImage.gif
deleted file mode 100644
index 0545213..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddImage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddLine.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddLine.gif
deleted file mode 100644
index 7f08dcf..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddLine.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddLink.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddLink.gif
deleted file mode 100644
index e99194a..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddLink.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddOrderedList.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddOrderedList.gif
deleted file mode 100644
index b6814c1..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddOrderedList.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddTable.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddTable.gif
deleted file mode 100644
index d368859..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddTable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddUnorderedList.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddUnorderedList.gif
deleted file mode 100644
index a4fdfc9..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/AddUnorderedList.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Bold.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Bold.gif
deleted file mode 100644
index 00df9e5..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Bold.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/ClearContent.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/ClearContent.gif
deleted file mode 100644
index 2558326..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/ClearContent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Copy.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Copy.gif
deleted file mode 100644
index f32acee..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Copy.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Cut.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Cut.gif
deleted file mode 100644
index 7e8635c..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Cut.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/FindReplace.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/FindReplace.gif
deleted file mode 100644
index 11257ec..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/FindReplace.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Indent.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Indent.gif
deleted file mode 100644
index 78195d0..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Indent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Italic.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Italic.gif
deleted file mode 100644
index ad0cd11..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Italic.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyCenter.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyCenter.gif
deleted file mode 100644
index eeabf05..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyCenter.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyFull.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyFull.gif
deleted file mode 100644
index a90a3b8..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyFull.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyLeft.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyLeft.gif
deleted file mode 100644
index e85469b..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyLeft.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyRight.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyRight.gif
deleted file mode 100644
index 0005af1..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/JustifyRight.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Outdent.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Outdent.gif
deleted file mode 100644
index 406b94f..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Outdent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Paste.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Paste.gif
deleted file mode 100644
index 94d39a1..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Paste.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/PastePlainText.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/PastePlainText.gif
deleted file mode 100644
index d8f9895..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/PastePlainText.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/StrikeThrough.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/StrikeThrough.gif
deleted file mode 100644
index a103545..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/StrikeThrough.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Subscript.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Subscript.gif
deleted file mode 100644
index 1c0f713..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Subscript.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Superscript.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Superscript.gif
deleted file mode 100644
index 3286634..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Superscript.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/TidyHTML.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/TidyHTML.gif
deleted file mode 100644
index adf2410..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/TidyHTML.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Underline.gif b/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Underline.gif
deleted file mode 100644
index e6476d6..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/icons/full/etool16/Underline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.richtext/plugin.properties b/1.5/plugins/org.eclipse.epf.richtext/plugin.properties
deleted file mode 100644
index 937326c..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/plugin.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Rich Text
-providerName=Eclipse.org
-
-################################################################################
-# THE FOLLOWING PROPERTIES SHOULD NOT BE TRANSLATED!!!
-################################################################################
-
-# The HTML file used to render the Rich Text Editor.
-RichText.editorHTML=rte.htm
-
-
diff --git a/1.5/plugins/org.eclipse.epf.richtext/plugin.xml b/1.5/plugins/org.eclipse.epf.richtext/plugin.xml
deleted file mode 100644
index 8e49b52..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/plugin.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.richtext/rte/blank.htm b/1.5/plugins/org.eclipse.epf.richtext/rte/blank.htm
deleted file mode 100644
index 7d9727a..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/rte/blank.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-
-<html>
-<head>
-	<title></title>
-</head>
-<body>
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.css b/1.5/plugins/org.eclipse.epf.richtext/rte/rte.css
deleted file mode 100644
index 7dc6c9e..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.css
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-body {
-	background-image: none;
-	background-color: #ffffff;
- 	font-family: arial, helvetica, sans-serif;
- 	font-size: 10pt;
-	margin: 3px;
-	padding: 0px; 	
-}
-
-p {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-}
-
-h1 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: large;
-}
-
-h2 {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 150%;
-}
-
-h3 {
-	font-family: arial, helvetica, sans-serif;
-}
-
-h4, h5, h6 {
-	font-family: arial, helvetica, sans-serif;
-}
-
-a:link {
-	color: #003399;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-decoration: none;
-}
-
-a:active {
-	color: #003399;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-decoration: underline;
-}
-
-a:visited {
-	color: #003399;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-decoration: none;
-}
-
-a:hover {
-	color: #ff0000;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-decoration: underline;
-}
-
-ol {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	list-style-type: decimal;
-	margin-left: 30px;
-}
-
-ol li {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-align: left
-}
-
-ul {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	list-style-type: disc;
-	margin-left: 30px;
-	margin-top: 0px;
-}
-
-ul li {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-align: left;
-}
-
-table {
-	background-image: none;
-	background: #ffffff;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;	
-}
-
-tbody {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	valign: baseline;
-}
-
-th {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-align: left;
-}
-
-td {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-}
-
-td ul {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	margin-bottom: 0px;
-	margin-left: 30px;
-}
-
-.pageTitle {
-	background: #9999cc;
-	color: #ffffff;
-	font-size: 12pt;
-	font-weight: bold;
-	padding-bottom: 5px;
-	padding-left: 10px;
-	padding-right: 10px;
-	padding-top: 5px;
-	text-align: left;
-}
-
-.pageTitleSeparator {
-	background-color: #000000;
-	padding: 0px;
-}
-
-.tab {
-	background-color: #5c81a7;
-	color: #ffffff;
-	font-family: verdana, arial, sans-serif; 
-	font-size: 11px;
-	font-weight: bold;
-}
-
-.activeTab {
-	background-color: #c8d7e3;
-	color: #293d6b;	
-	font-family: verdana, arial, sans-serif; 
-	font-size: 11px;
-	font-weight: bold;
-}
-
-a.tab:link, a.tab:active, a.tab:visited {
-	color: #ffffff;
-	font-family: verdana, arial, sans-serif; 
-	font-size: 11px;
-	font-weight: bold;
-}
-
-a.tab:hover {
-	text-decoration: underline;	
-}
-
-.overview {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	font-weight: normal;
-	padding-bottom: 10px;
-	padding-left: 20px;
-	padding-right: 0px;
-	padding-top: 10px;
-}
-
-.overviewTable {
-	background: #ffffff;
-	width: 100%;	
-}
-
-.overviewTable td {
-	padding-bottom: 5px;
-	padding-left: 5px;
-	padding-right: 5px;
-	padding-top: 5px;
-}
-
-.overviewSeparator {
-	background-color: #000000;
-	padding: 0px;
-}
-
-.expandCollapseText {
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	padding-left: 5px;
-	padding-right: 5px;
-}
-
-.expandCollapseLink {
-	color: #333333;
-	padding-bottom: 5px;
-	text-decoration: none;
-}
-
-.expandCollapseLink:hover {
-	color: #0000ff;
-	text-decoration: underline;
-}
-
-.expandCollapseLink:visited {
-	color: #333333;
-}
-
-.sectionHeading {
-	background-color: #98b1c4;
-	color: #ffffff;
-	cursor: hand;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	font-weight: bold;
-	padding-bottom: 2px;
-	padding-left: 2px;
-	padding-top: 2px;
-	text-decoration: none;
-}
-
-.sectionContent {
-	padding-bottom: 0px;
-	padding-left: 0px;
-	padding-right: 0px;
-	padding-top: 0px;
-	text-align: right;
-}
-
-.sectionTable {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 1px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 1px;
-	padding-bottom: 10px;
-	padding-left: 10px;
-	padding-right: 10px;
-	padding-top: 10px;
-	width: 100%;
-}
-
-.sectionTableHeading {
-	background: #eee;
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-	color: #333333;
-	height: 20;
-	text-align: left;
-	width: 20%;
-}
-
-.sectionTableCell {
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-}
-
-.breakdownTable {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 1px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 1px;
-	padding-bottom: 0px;
-	padding-left: 0px;
-	padding-right: 0px;
-	padding-top: 0px;
-	width: 100%;
-}
-
-.breakdownTable th {
-	background: #eee;
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-	color: #333333;
-	height: 20;
-	text-align: left;
-}
-
-.breakdownTable td {
-	border-bottom: #ccc solid 1px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 1px;
-	border-top: #ccc solid 0px;
-}
-
-.defaultTable {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 0px;
-	padding-bottom: 0px;
-	padding-left: 0px;
-	padding-right: 0px;
-	padding-top: 0px;
-	width: 100%;
-}
-
-.defaultTable td {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 0px;
-	text-align: left;
-}
-
-.subSectionHeading {
-	color: #333333;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	font-weight: bold;
-	text-decoration: none;
-}
-
-.subSectionContent {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	text-decoration: none;	
-}
-
-.stepHeading {
-	background-color: #ffffff;
-	color: #293d6b;
-	cursor: hand;
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	font-weight: bold;
-	padding-bottom: 2px;
-	padding-left: 2px;
-	padding-top: 2px;
-	text-decoration: none;
-}
-
-.stepContent {
-	border-bottom: #ccc solid 0px;
-	border-left: #ccc solid 0px;
-	border-right: #ccc solid 0px;
-	border-top: #ccc solid 0px;
-	padding-bottom: 5px;
-	padding-left: 0px;
-	padding-right: 0px;
-	padding-top: 0px;
-	text-align: right;
-}
-
-.stepTable {
-	border-bottom: #999999 solid 1px;
-	border-left: #999999 solid 0px;
-	border-right: #999999 solid 0px;
-	border-top: #999999 solid 0px;
-	padding-bottom: 20px;
-	padding-left: 10px;
-	padding-right: 10px;
-	padding-top: 10px;
-	width: 100%;
-}
-
-.stepTable td {
-	border: #ccc solid 0px;
-}
-
-.stepSeparator {
-	background-color: #cccccc;
-	padding: 0px;
-}
-
-.backToTopLink {
-	color: #fffff;
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	font-weight: normal;	
-	margin: 0px;
-	padding-bottom: 10px;
-	text-align: middle;	
-	text-decoration: none;
-}
-
-.backToTopLink:hover {
-	color: #969;
-	text-decoration: underline;
-}
-
-.backToTopLink:visited {
-	color: #5c81a7;
-	text-decoration: none;	
-}
-
-.copyright {
-	color: #7080b0;
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	font-weight: normal;
-	padding-left: 0px;
-	padding-right: 10px;
-	padding-top: 25px;
-	text-align: left;
-	width: 100%;
-}
-
-.versionInfo {
-	color: #7080b0;
-	font-family: verdana, arial, sans-serif;
-	font-size: 8pt;
-	font-weight: normal;
-	padding-left: 10px;
-	padding-right: 0px;
-	padding-top: 25px;
-	text-align: right;
-}
-
-.quote {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	font-style: italic;
-}
-
-.codeSample {
-	font-family: courier;
-	font-size: 10pt;		
-}
-
-.elementLink {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;	
-	color: #0000ff;
-}
-
-.elementLinkWithType {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	color: #0000ff;
-}
-
-.elementLinkWithUserText {
-	font-family: arial, helvetica, sans-serif;
-	font-size: 10pt;
-	color: #0000ff;
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.html b/1.5/plugins/org.eclipse.epf.richtext/rte/rte.html
deleted file mode 100644
index 6451cb7..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<html>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-	<head>
-		<script language="JavaScript" type="text/javascript" src="rte.js"></script>		
-	</head>
-	<body leftMargin="0" topMargin="0" marginheight="0" marginwidth="0" scroll="no" style="overflow: hidden">
-		<iframe id="rte" name="rte" style="border: none;" frameborder="0" scrolling="auto" width="100%" height="100%"></iframe>
-		<script type="text/javascript">
-			initEditor('rte', 'rte.css', null);
-		</script>
-	</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.js b/1.5/plugins/org.eclipse.epf.richtext/rte/rte.js
deleted file mode 100644
index dd10da2..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.js
+++ /dev/null
@@ -1,1266 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//------------------------------------------------------------------------------
-// @author Kelvin Low
-// @since 1.0
-//------------------------------------------------------------------------------
-// Note: Mozilla/Firefox does not allow unprivileged scripts to invoke the cut,
-// copy and paste commands. The Javascript must either be signed
-// (see http://www.mozilla.org/projects/security/components/signed-scripts.html),
-// or the users must change their preferences
-// (see http://www.mozilla.org/editor/midasdemo/securityprefs.html).
-// Alternatively, the users can use the ctrl-x, ctrl-c and ctrl-v keys.
-//------------------------------------------------------------------------------
-
-var STATUS_NOP = 0;
-var STATUS_INITIALIZED = 1;
-var STATUS_MODIFIED = 2;
-var STATUS_GET_TEXT = 3;
-var STATUS_KEY_DOWN = 4;
-var STATUS_KEY_UP = 5;
-var STATUS_SELECT_TEXT = 6;
-var STATUS_SELECT_CONTROL = 7;
-var STATUS_SELECT_NONE = 8;
-var STATUS_EXEC_CMD = 9;
-var STATUS_REFORMAT_LINKS = 10;
-
-var KEY_ARROW_DOWN = 40;
-var KEY_ARROW_LEFT = 37;
-var KEY_ARROW_RIGHT = 39;
-var KEY_ARROW_UP = 38;
-var KEY_BACKSPACE = 8;
-var KEY_END = 35;
-var KEY_HOME = 36;
-var KEY_PAGE_DOWN = 34;
-var KEY_PAGE_UP = 33;
-var KEY_TAB = 9;
-var KEY_C = 67;
-var KEY_F = 70;
-var KEY_S = 83;
-var KEY_V = 86;
-var KEY_X = 88;
-var KEY_Z = 90;
-
-var CMD_COPY = "copy";
-var CMD_CUT = "cut";
-var CMD_FIND_TEXT = "findText";
-var CMD_PASTE = "paste";
-var CMD_SAVE = "save";
-var CMD_SAVE_ALL = "saveAll";
-
-var TABLE_HEADERS_NONE = 0;
-var TABLE_HEADERS_COLS = 1;
-var TABLE_HEADERS_ROWS = 2;
-var TABLE_HEADERS_BOTH = 3;
-
-var BOLD = 1;
-var ITALIC = BOLD << 1;
-var UNDERLINE = ITALIC << 1;
-var SUBSCRIPT = UNDERLINE << 1;
-var SUPERSCRIPT = SUBSCRIPT << 1;
-
-
-var editorId;
-var editorCSS;
-var baseHREF;
-var supportRichTextEditing = true;
-var editorDoc;
-var selection;
-var selectionRange;
-var readOnly = false;
-var initialized = false;
-var modified = false;
-var checkResizeElement;
-
-// Initializes the editor.
-function initEditor(id, css, baseURL) {
-	editorId = id;
-	editorCSS = css;
-	baseHREF = baseURL;
-	try {
-		enableRichTextEditing('');
-		initialized = true;
-		setStatus(STATUS_INITIALIZED, null);
-	}
-	catch (e) {
-		supportRichTextEditing = false;
-	}
-}
-
-// Handles the key events.
-function keyPressed(event) {
-	var keyCode = event.keyCode;
-	if (keyCode == 0 && !document.all) {
-		keyCode = event.charCode;
-		switch (keyCode) {
-			case 99:
-				keyCode = KEY_C;
-				break;
-			case 102:
-				keyCode = KEY_F;
-				break;
-			case 115:
-				keyCode = KEY_S;
-				break;
-			case 118:
-				keyCode = KEY_V;
-				break;
-			case 120:
-				keyCode = KEY_X;
-				break;
-			case 122:
-				keyCode = KEY_Z;
-				break;
-		}
-	}
-	var ctrlKey = event.ctrlKey;
-	var shiftKey = event.shiftKey;
-	
-	switch(keyCode) {
-		case KEY_ARROW_DOWN:
-		case KEY_ARROW_LEFT:
-		case KEY_ARROW_RIGHT:
-		case KEY_ARROW_UP:
-		case KEY_END:
-		case KEY_HOME:
-		case KEY_PAGE_DOWN:
-		case KEY_PAGE_UP:
-		case KEY_TAB:
-			break;
-		case KEY_BACKSPACE:
-			if (!readOnly) {
-				setTimeout("setStatus(STATUS_MODIFIED, null);", 10);
-			}
-			break;
-		case KEY_C:
-			if (ctrlKey) {
-				setStatus(STATUS_KEY_DOWN, CMD_COPY);
-			}
-			else if (!document.all && readOnly) {
-				event.preventDefault();
-			}
-			break;			
-		case KEY_F:
-			if (ctrlKey) {
-				if (document.all) {
-					event.keyCode = -1;
-					event.returnValue = false;
-				}
-				else {
-					event.preventDefault();
-				}
-				setStatus(STATUS_KEY_DOWN, CMD_FIND_TEXT);
-			}
-			else if (!document.all && readOnly) {
-				event.preventDefault();
-			}
-			break;
-		case KEY_S:
-			if (!readOnly && ctrlKey) {
-				if (document.all) {
-					event.keyCode = -1;
-					event.returnValue = false;
-				}
-				else {
-					event.preventDefault();
-				}
-				if (shiftKey) {
-					setStatus(STATUS_KEY_DOWN, CMD_SAVE_ALL);
-				}
-				else {
-					setStatus(STATUS_KEY_DOWN, CMD_SAVE);
-				}
-			}
-			else if (!document.all && readOnly) {
-				event.preventDefault();
-			}			
-			break;
-		case KEY_V:
-			if (ctrlKey) {		
-				if (document.all) {
-					event.keyCode = -1;
-					event.returnValue = false;
-					if (!readOnly) {
-						setStatus(STATUS_KEY_DOWN, CMD_PASTE);
-					}
-				}
-				else {
-					if (!readOnly) {
-						// Workaround Mozilla/Firefox paste issues.
-						setTimeout("setStatus(STATUS_KEY_DOWN, CMD_PASTE);", 10);
-					}
-					else {
-						event.preventDefault();
-					}
-				}
-			}
-			else if (!document.all && readOnly) {
-				event.preventDefault();
-			}
-			break;
-		case KEY_X:
-			if (ctrlKey) {
-				setStatus(STATUS_KEY_DOWN, CMD_CUT);
-			}
-			else if (!document.all && readOnly) {
-				event.preventDefault();
-			}
-			break;
-		case KEY_Z:
-			if (!readOnly && ctrlKey) {
-				setTimeout("setStatus(STATUS_MODIFIED, null);", 10);
-			}
-			else if (!document.all && readOnly) {
-				event.preventDefault();
-			}			
-			break;
-		default:
-			if (!document.all && readOnly) {
-				event.preventDefault();
-			}
-	}
-}
-
-function selChanged(event) {
-	updateSelection();
-}
-
-function enableRichTextEditing(html) {
-	var doc = document.getElementById(editorId).contentWindow.document;
-	doc.designMode = "on";
-	
-	var htmlSrc = '<html><head><title></title>';
-	
-	if (editorCSS != null && editorCSS != '') {
-		htmlSrc += '<link rel="StyleSheet" href="' + editorCSS + '" type="text/css"/>';
-	}
-	
-	if (baseHREF != null && baseHREF != '') {	
-		htmlSrc += '<base href="' + baseHREF + '"/>';
-	}
-	
-	if (!document.all && html == '') {
-		// Mozilla/Firefox will only display the caret if <br/> is added to the HTML body.
-		// Adding <br/> also enables the backspace and delete key by default. Otherwise, the
-		// user need to enter some text before these 2 keys start to function.
-		html = "<br />";
-	}
-	
-	htmlSrc += '</head><body>' + html + '</body></html>';
-	
-	doc.open();
-	doc.write(htmlSrc);
-	doc.close();
-	
-	modified = false;
-
-	if ("attachEvent" in doc) {
-		doc.attachEvent("onkeydown", keyPressed);
-		doc.attachEvent("onselectionchange", selChanged);
-		// for DnD (internal)
-		doc.body.attachEvent("ondrop", checkModified);
-		// for image/table resizing:
-		doc.body.attachEvent("onresizeend", checkModified);
-	}	
-	if ("addEventListener" in doc) {
-		doc.addEventListener("keypress", keyPressed, true);
-		doc.addEventListener("keypress", selChanged, false);
-		doc.addEventListener("mouseup", selChanged, false);
-		doc.addEventListener("dragdrop", checkModified, false);
-		
-		// check mouseup event for image/table resizing
-		doc.addEventListener("mouseup", checkModified, false);
-	}
-
-	setStatus(STATUS_EXEC_CMD, 1);
-}
-
-// this one is for modification check on drag n drop within the RTE
-// checkModified listener
-function checkModified(event) {
-	setTimeout("setStatus(STATUS_MODIFIED, null);", 10);
-}
-
-// Sets the height of the editor.
-function setHeight(height) {
-	if (initialized) {
-		document.getElementById(editorId).height = height + "px";
-	}
-}
-
-// Sets the status.
-// Note: By default, Firefox disables changes to the status bar. For this to work, the user
-// must set the global preference "dom.disable_window_status_change" to false.
-// For Firefox 1.0.x, this setting can be made in /usr/firefox-1.0.7/defaults/pref/firefox.js.
-function setStatus(type, value) {
-	var status = '$$$' + type;
-	if (value != null && value != '') {
-		status += ('$' + value);		
-	}
-	window.status = status;
-	window.status = '$$$' + STATUS_NOP;
-}
-
-// Returns the HTML source.
-function getHTML() {
-	var html = document.getElementById(editorId).contentWindow.document.body.innerHTML;
-	if (html == "<P>&nbsp;</P>") {
-		html = "";
-	}
-	if (html != null && html != '') {
-		var regEx = new RegExp("\"file\:([^=]*)(/resources/)([^\"]+)\"", "g");
-		html = html.replace(regEx, "\"./resources/$3\"");
-		regEx = new RegExp("\"file\:([^=]*)/#([^\"]+)\"", "g");
-		html = html.replace(regEx, "\"#$2\"");
-	}
-	return html;
-}
-
-//Returns the HTML source to the Java layer
-function getText() {
-	var html = getHTML();
-	setStatus(STATUS_GET_TEXT, html);
-	return html;
-}
-
-function setInnerHTML(html) {
-	if (document.all) {
-		// IE has problem setting complex HTML set via doc.body.innerHTML.
-		enableRichTextEditing(html);
-	}
-	else {
-		if (html == '') {
-			// Mozilla/Firefox will only display the caret if <br/> is added to the HTML body.
-			html = "<br/>";
-		}
-		var doc = document.getElementById(editorId).contentWindow.document;
-		if (doc.body != null) {
-			doc.body.innerHTML = html;
-		}
-		else {
-			// Mozilla/Firefox can take a while to initialize document.body
-			// after document.write().
-			try {
-				setTimeout("setInnerHTML('" + html + "');", 10);
-			}
-			catch (e) {
-			}
-		}
-	}
-}
-
-// Sets the HTML source.
-function setText(html) {
-	if (supportRichTextEditing) {
-		html = decodeString(html);
-		setInnerHTML(html);
-		modified = false;
-		setStatus(STATUS_EXEC_CMD, 1);
-	}
-}
-
-// Decodes the HTML passed from the Java layer.
-function decodeString(str) {
-	if (str != null && str != '') {
-		if (document.all) {
-			str = str.replace(/%sq%/g, "'");
-			str = str.replace(/%EOL%/g, "\n");
-		}
-		else {
-			str = str.replace(/%sq%/g, "&apos;");
-			str = str.replace(/%EOL%/g, "");
-			str = str.replace(/\n/g, "");
-		}
-	}
-	return str;
-}
-
-// updates selection without notifying the Java layer of the selection state
-function internalUpdateSelection() {
-	if (!supportRichTextEditing) {
-		return false;
-	}	
-	
-	contentWindow = document.getElementById(editorId).contentWindow;
-	editorDoc = contentWindow.document;
-	
-	if (document.all) {
-		selection = editorDoc.selection;
-		if (selection != null) {
-			selectionRange = selection.createRange();
-			reformatElementLinks();
-		}
-	}
-	else {
-		selection = contentWindow.getSelection();
-		if (selection != null) {
-			selectionRange = selection.getRangeAt(selection.rangeCount - 1).cloneRange();
-			if (selectionRange.startContainer.nodeName == "HTML" &&
-					selectionRange.endContainer.nodeName == "HTML") {
-				// Mozilla selects the whole document when there's no RTE content, so select just the body
-				selectionRange = editorDoc.createRange();
-				selectionRange.setStart(editorDoc.body, 0);
-				selectionRange.setEnd(editorDoc.body, 0);
-			}
-		}
-	}
-	return true;
-}
-
-// Updates the current selection and selection range.
-function updateSelection() {
-	if (!supportRichTextEditing) {
-		return false;
-	}	
-	
-	contentWindow = document.getElementById(editorId).contentWindow;
-	editorDoc = contentWindow.document;
-	
-	var tempSelRange;
-	var selOffsetStart = 0;
-	var selectedText = "";
-	var fontName = "";
-	var fontSize = "";
-	var blockStyle = "";
-	var textFlags = 0;
-	
-	
-	if (document.all) {
-		selection = editorDoc.selection;
-		if (selection != null) {
-			selectionRange = selection.createRange();
-			if (selectionRange != null && selection.type != "Control") {
-				tempSelRange = selectionRange.duplicate();
-			}
-			reformatElementLinks();
-		}
-	}
-	else {
-		selection = contentWindow.getSelection();
-		if (selection != null) {
-			selectionRange = selection.getRangeAt(selection.rangeCount - 1).cloneRange();
-			tempSelRange = selectionRange.cloneRange();
-		}
-	}
-	if (tempSelRange != null) {
-		try {
-			if (document.all) {
-				if (selectionRange.text) {
-					selectedText = selectionRange.text;
-				}
-				/* for getting selection offset - commented because we can't select the
-				 * proper location in the HTML source tab because JTidy's reformatting of the HTML
-				var html = getHTML();
-	            var tempSelLen = tempSelRange.htmlText.length;			
-	            tempSelRange.moveStart('character', -html.length);
-	            selOffsetStart = tempSelRange.htmlText.length - tempSelLen;
-	            */
-				var selParent = tempSelRange.parentElement();
-				fontName = tempSelRange.queryCommandValue('fontName');
-				fontSize = tempSelRange.queryCommandValue('fontSize');
-				blockStyle = tempSelRange.queryCommandValue('formatBlock');
-				if (blockStyle == "Normal") {
-					if (selParent.className == "quote") {
-						blockStyle = "<quote>";
-					} else if (selParent.className == "codeSample") {
-						blockStyle = "<code>";
-					} else {
-						blockStyle = "<p>";
-					}
-				} else if (blockStyle == "Heading 3") {
-					blockStyle = "<h3>";
-				} else if (blockStyle == "Heading 4") {
-					blockStyle = "<h4>";
-				} else if (blockStyle == "Heading 5") {
-					blockStyle = "<h5>";
-				} else if (blockStyle == "" || blockStyle == null) {
-					blockStyle = "<p>";
-				}
-				if (tempSelRange.queryCommandValue('bold') == true) {
-					textFlags |= BOLD;
-				}
-				if (tempSelRange.queryCommandValue('italic') == true) {
-					textFlags |= ITALIC;
-				}
-				if (tempSelRange.queryCommandValue('underline') == true) {
-					textFlags |= UNDERLINE;
-				}
-				if (tempSelRange.queryCommandValue('subscript') == true) {
-					textFlags |= SUBSCRIPT;
-				}
-				if (tempSelRange.queryCommandValue('superscript') == true) {
-					textFlags |= SUPERSCRIPT;
-				}
-				setStatus(STATUS_SELECT_TEXT, /* selOffsetStart + "$" + */
-						fontName + "$" + fontSize + "$" + blockStyle + "$" + textFlags + "$" + selectedText);
-			} else {
-				if (selectionRange != null) {
-					selectedText = selectionRange.toString();
-				}
-				var selParent = selection.focusNode;
-				fontName = editorDoc.queryCommandValue('fontName');
-				if (fontName == "") {
-					fontName = "default";
-				}
-				fontSize = editorDoc.queryCommandValue('fontSize');
-				if (fontSize == "") {
-					fontSize = "default";
-				}
-				blockStyle = editorDoc.queryCommandValue('formatBlock');
-				if (blockStyle == "p") {
-					if (selParent.parentNode.className == "quote") {
-						blockStyle = "<quote>";
-					} else if (selParent.parentNode.className == "codeSample") {
-						blockStyle = "<code>";
-					} else {
-						blockStyle = "<p>";
-					}
-				} else if (blockStyle == "h3") {
-					blockStyle = "<h3>";
-				} else if (blockStyle == "h4") {
-					blockStyle = "<h4>";
-				} else if (blockStyle == "h5") {
-					blockStyle = "<h5>";
-				} else if (blockStyle == "") {
-					blockStyle = "<p>";
-				}
-				if (editorDoc.queryCommandState('bold') == true) {
-					textFlags |= BOLD;
-				}
-				if (editorDoc.queryCommandState('italic') == true) {
-					textFlags |= ITALIC;
-				}
-				if (editorDoc.queryCommandState('underline') == true) {
-					textFlags |= UNDERLINE;
-				}
-				if (editorDoc.queryCommandState('subscript') == true) {
-					textFlags |= SUBSCRIPT;
-				}
-				if (editorDoc.queryCommandState('superscript') == true) {
-					textFlags |= SUPERSCRIPT;
-				}
-				setStatus(STATUS_SELECT_TEXT, /* selOffsetStart + "$" + */
-						fontName + "$" + fontSize + "$" + blockStyle + "$" + textFlags + "$" + selectedText);
-			}
-		} catch (e) { }
-	}	
-
-	return true;
-}
-
-// Sets focus to this editor.
-function setFocus() {
-	if (!supportRichTextEditing) {
-		return;
-	}	
-	contentWindow = document.getElementById(editorId).contentWindow;
-	contentWindow.focus();
-	setStatus(STATUS_EXEC_CMD, 1);	
-}
-
-// Reformats element links created via drag & drop.
-function reformatElementLinks() {
-	var linksReformatted = 0;
-	var elements = editorDoc.getElementsByTagName('A');
-	for (var i = 0; i < elements.length; i++) {
-		var element = elements[i];
-		if (element.className.toLowerCase() == 'elementlink' ||
-				element.className.toLowerCase() == 'elementlinkwithtype' ||
-				element.className.toLowerCase() == 'elementlinkwithusertext') {
- 			if (element.firstChild != null && element.firstChild.firstChild != null &&
- 				element.firstChild.firstChild.firstChild != null) {
- 				var linkText = element.firstChild.firstChild.firstChild.nodeValue;
- 				element.removeChild(element.firstChild);
- 				element.appendChild(editorDoc.createTextNode(linkText));
- 				linksReformatted++;
- 			}
-		}
-	}
-	if (linksReformatted > 0) {
-		setStatus(STATUS_REFORMAT_LINKS, null);
-	}
-}
-
-// Formats the selected text.
-function formatText(command, option) {
-	if (!readOnly && internalUpdateSelection()) {
-		if (editorDoc.execCommand(command, false, option)) {
-			setStatus(STATUS_EXEC_CMD, 1);		
-			setStatus(STATUS_MODIFIED, null);
-		}
-	}
-}
-
-// Adds HTML.
-function addHTML(html) {
-	if (!readOnly && html != "")  {
-		html = decodeString(html);
-		if (internalUpdateSelection()) {
-			if (document.all) {
-				if (selectionRange.text != null) {
-					selectionRange.pasteHTML(html);
-					setStatus(STATUS_EXEC_CMD, 1);
-					setStatus(STATUS_MODIFIED, null);
-				}
-			}
-			else {
-				selectionRange.deleteContents();
-				var documentFragment = selectionRange.createContextualFragment(html);
-				selectionRange.insertNode(documentFragment);
-				setStatus(STATUS_EXEC_CMD, 1);
-				setStatus(STATUS_MODIFIED, null);
-			}
-		}
-	}
-}
-
-// Adds an image.
-function addImage(url, height, width, alt) {
-	if (internalUpdateSelection()) {
-		if (document.all) {
-			if (url != null && url != '') {
-				formatText('insertimage', url);
-			}
-			if (selection != null && selection.type == 'Control' && selectionRange != null) {
-				if (height != null && height != '') selectionRange.item().height = height;
-				if (width != null && width != '') selectionRange.item().width = width;
-				if (alt != null) selectionRange.item().alt = alt;		
-			}
-		} else {
-			var START_MARKER = "A_-_-_";
-			var END_MARKER = ":.:.:";
-				// mark img links with START_MARKER + id + END_MARKER in the id, for later recovery
-			var elements = editorDoc.getElementsByTagName('img');
-			for (var i = 0; i < elements.length; i++) {
-				var element = elements[i];
-				element.id = START_MARKER + element.id + END_MARKER;
-			}
-			if (url != null && url != '') {
-				formatText('insertimage', url);
-			}
-			if (internalUpdateSelection()) {
-				var regExID = new RegExp(START_MARKER + "(.*?)" + END_MARKER);
-				var elements = editorDoc.getElementsByTagName('img');
-				for (var i = 0; i < elements.length; i++) {
-					var element = elements[i];
-					var id = element.id;
-					if (id != null && id != '') {
-						RegExp.lastIndex=0;
-						var matchArray = id.match(regExID);
-						if (matchArray != null && matchArray.length > 0) {
-							var newId = matchArray[1];
-							if (newId.length > 0) {
-								element.id = newId;
-							} else {
-								element.removeAttribute('id');
-							}
-						}
-					} else {
-						// no id, must be the new img
-						if (height != null && height != '') element.height = height;
-						if (width != null && width != '') element.width = width;
-						if (alt != null) element.alt = alt;		
-					}
-				}
-			}
-		}
-		setStatus(STATUS_MODIFIED, null);
-	}
-}
-
-// Adds a horizontal line.
-function addLine() {
-	formatText('inserthorizontalrule', null);
-}
-
-// Adds a link.
-function addLink(url) {
-	if (!readOnly && url != null && url != '' && internalUpdateSelection()) {
-		if (document.all) {
-			if (selectionRange.text == null || selectionRange.text == '') {
-				selectionRange.text = url;
-				setStatus(STATUS_EXEC_CMD, 1);
-				setStatus(STATUS_MODIFIED, null);
-			}
-			else if (selectionRange.execCommand('createlink', false, url)) {
-				setStatus(STATUS_EXEC_CMD, 1);
-				setStatus(STATUS_MODIFIED, null);
-			}
-		}
-		else {
-			if (selection == null || selection == "") {		
-				var urlTextNode = editorDoc.createTextNode(url);
-				insertNodeAtSelection(document.getElementById(editorFrameId).contentWindow, urlTextNode);
-			}			
-			if (editorDoc.execCommand('createlink', false, url)) {
-				setStatus(STATUS_EXEC_CMD, 1);
-				setStatus(STATUS_MODIFIED, null);
-			}
-		}
-	}
-}
-
-// Adds an ordered list.
-function addOrderedList() {
-	formatText('insertorderedlist', null);
-}
-
-// Adds a table.
-function addTable(rows, cols, width, summary, caption, tableheaders) {
-	if (readOnly) return;
-	if (rows == 0) rows = 2;
-	if (cols == 0) cols = 2;
-	if (width == 0) width = "85%";
-	if (internalUpdateSelection()) {
-		var table = editorDoc.createElement("table");
-		table.cellPadding = "2";
-		table.cellSpacing = "0";
-		table.border = "1";
-		table.width = width;
-		table.title = "";
-		if (summary != null && summary != '') {
-			table.summary = summary;
-		}
-		if (caption != null && caption != '') {
-			table.title = caption;
-			table.createCaption();
-			var captionNode = editorDoc.createTextNode(caption);
-			table.caption.appendChild(captionNode);
-		}
-		tbody = editorDoc.createElement("tbody");
-		for (var i = 0; i < rows; i++) {
-			tr = editorDoc.createElement("tr");
-			for (var j = 0; j < cols; j++) {
-				if (i == 0 && (tableheaders == TABLE_HEADERS_COLS || tableheaders == TABLE_HEADERS_BOTH)) {
-					th = editorDoc.createElement("th");
-					th.scope = "col";
-					th.id = "";
-					th.abbr = th.id;
-					var headerNode = editorDoc.createTextNode(th.id);
-					th.appendChild(headerNode);
-					if (!document.all) {
-						br = editorDoc.createElement("br");
-						th.appendChild(br);
-					}
-					tr.appendChild(th);
-				}
-				else if (j == 0 && (tableheaders == TABLE_HEADERS_ROWS || tableheaders == TABLE_HEADERS_BOTH)) {
-					th = editorDoc.createElement("th");
-					th.scope = "row";
-					th.id = "";
-					th.abbr = th.id;
-					var headerNode = editorDoc.createTextNode(th.id);
-					th.appendChild(headerNode);
-					if (!document.all) {
-						br = editorDoc.createElement("br");
-						th.appendChild(br);
-					}
-					tr.appendChild(th);
-				}
-				else {
-					td = editorDoc.createElement("td");
-					if (!document.all) {
-						br = editorDoc.createElement("br");
-						td.appendChild(br);
-					}
-					tr.appendChild(td);
-				}
-			}
-			tbody.appendChild(tr);
-    	}
-		table.appendChild(tbody);
-		if (document.all) {
-			selectionRange.parentElement().appendChild(table);
-		}
-		else {
-			selectionRange.insertNode(table);
-		}
-		setStatus(STATUS_EXEC_CMD, 1);
-		setStatus(STATUS_MODIFIED, null);			
-	}
-}
-
-// Adds an unordered list.
-function addUnorderedList() {
-	formatText('insertunorderedlist', null);
-}
-
-// Sets the background color of the selected text.
-function backColor(color) {
-	if (color != null && color != '') {
-		formatText('backcolor', color);
-	}
-}
-
-// Toggles the 'bold' attribute of the selected text.
-function bold() {
-	formatText('bold', null);
-}
-
-// Copies the selected text to the clipboard.
-function copy() {
-	if (internalUpdateSelection()) {
-		if (editorDoc.execCommand('copy', false, null)) {
-			setStatus(STATUS_EXEC_CMD, 1);
-		}
-	}
-}
-
-// Cuts the selected text to the clipboard.
-function cut() {
-	formatText('cut', null);
-}
-
-// Deletes the selected text.
-function deleteText() {
-	formatText('delete', null);
-}
-
-// Finds text.
-function findText(text, dir, options) {
-	if (text == null || text == "") {
-		return;
-	}
-	else {
-		text = decodeString(text);
-	}
-	
-	if (internalUpdateSelection()) {
-		if (document.all) {
-			selectionRange.collapse(dir < 0);
-			if (selectionRange.findText(text, dir, options)) {
-				selectionRange.scrollIntoView();
-				selectionRange.select();
-				selectionRange.collapse(dir < 0);
-				setStatus(STATUS_EXEC_CMD, 1);
-			}
-		}
-		else {	
-			// find(text, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
-			var caseSensitive = true;
-			var backwards = false;
-			var wholeWord = true;
-			if ((options & 4) == 0) caseSensitive = false;
-			if (dir == -1) backwards = true;
-			if ((options & 2) == 0) wholeWord = false;
-			if (contentWindow.find(text, caseSensitive, backwards, false, wholeWord, false, false)) {
-				setStatus(STATUS_EXEC_CMD, 1);
-			}
-		}
-	}
-}
-
-// Sets the foreground color of the selected text.
-function foreColor(color) {
-	if (color != null && color != '') {
-		formatText('forecolor', color);
-	}
-}
-
-// Formats the selected text using the given HTML heading tag.
-function formatBlock(tag) {
-	if (tag != null && tag != '') {
-		formatText('formatblock', tag);
-	}
-}
-
-
-var INDENTED_LIST_BAD_HTML_IE = "</li>.*<li style=\"list-style: none\">";
-var INDENTED_LIST_BAD_HTML_MOZ = "</li>.*<li style=\"list-style-type: none; list-style-image: none; list-style-position: outside;\">";
-
-// Indents the selected text.
-function indent() {
-	formatText('indent', null);
-	// fix for sub-lists
-	var html = document.getElementById(editorId).contentWindow.document.body.innerHTML;
-	if (document.all) {
-		html = html.replace(INDENTED_LIST_BAD_HTML_IE, "");
-	} else {
-		// firefox sometimes puts the same as IE, sometimes more junk
-		html = html.replace(INDENTED_LIST_BAD_HTML_IE, "");
-		html = html.replace(INDENTED_LIST_BAD_HTML_MOZ, "");
-	}
-	setText(html);
-}
-
-// Toggles the 'italic' attribute of the selected text.
-function italic() {
-	formatText('italic', null);
-}
-
-// Center justifies the selected text.
-function justifyCenter() {
-	formatText('justifycenter', null);
-}
-
-// Fully justifies the selected text.
-function justifyFull() {
-	formatText('justifyfull', null);
-}
-
-// Left justifies the selected text.
-function justifyLeft() {
-	formatText('justifyleft', null);
-}
-
-// Right justifies the selected text.
-function justifyRight() {
-	formatText('justifyright', null);
-}
-
-// Outdents the selected text.
-function outdent() {
-	formatText('outdent', null);
-}
-
-// Pastes text from the clipboard.
-function paste(sourceURL) {
-	if (sourceURL == null) {
-		sourceURL = "";
-	}
-	else {
-		sourceURL = decodeString(sourceURL);
-	}
-	if (document.all) {
-		var START_MARKER = "A_-_-_";
-		var END_MARKER = ":.:.:";
-		// mark img and <a /> links with START_MARKER + src/href + END_MARKER in the id, for later recovery
-		var elements = editorDoc.getElementsByTagName('img');
-		for (var i = 0; i < elements.length; i++) {
-			var element = elements[i];
-			var id = element.id;
-			element.id = START_MARKER + element.src + END_MARKER + id;
-		}
-		var elements = editorDoc.getElementsByTagName('a');
-		for (var i = 0; i < elements.length; i++) {
-			var element = elements[i];
-			var id = element.id;
-			element.id = START_MARKER + element.href + END_MARKER + id;
-		}
-
-		// change the <base> of the document
-		var oldBaseHREF = editorDoc.getElementsByTagName('base')[0].href;
-		editorDoc.getElementsByTagName('base')[0].href = sourceURL;
-
-		formatText('paste', null);
-		
-		// restore <base>
-		editorDoc.getElementsByTagName('base')[0].href = oldBaseHREF;
-	}
-	else {
-		setStatus(STATUS_EXEC_CMD, 1);
-		setStatus(STATUS_MODIFIED, null);
-	}
-	if (internalUpdateSelection()) {
-		try {
-			var regExRes = new RegExp("file\:([^=]+)(/resources/)(.+)", "g");
-			var regExRef = new RegExp("(.+)(#.+)");
-			var regEx = new RegExp("file\:([^=]+)/([^/]+)", "g");	
-			var regExID = new RegExp(START_MARKER + "(.*?)" + END_MARKER + "(.*?)");
-			var elements = editorDoc.getElementsByTagName('img');
-			for (var i = 0; i < elements.length; i++) {
-				var element = elements[i];
-				var id = element.id;
-				if (id != null && id != '') {
-					RegExp.lastIndex=0;
-					var matchArray = id.match(regExID);
-					if (matchArray != null && matchArray.length > 1) {
-						element.src = matchArray[1];
-						if (matchArray.length > 2 && matchArray[2].length > 0) {
-							element.id = matchArray[2];
-						}
-						else {
-							element.removeAttribute('id');
-						}
-						continue;
-					}
-				}
-				var src = element.src;
-				if (src != null && src != '') {
-					if (src.indexOf('about:./resources') != -1) {
-						// fix for IE 7 when pasting from another RTE
-						// IE7 resolves these as "about:./resources/<file>"
-						// so remove the "about:."
-						src = src.replace("about:", "");
-					}
-					if (src.indexOf('about:resources') != -1) {
-						// fix for IE 7 when pasting from another RTE
-						// IE7 sometimes resolves these as "about:resources/<file>"
-						// so remove the "about:" and put in "./"
-						src = src.replace("about:", "./");
-					}
-					if (src.indexOf('resources') != -1) {
-						element.src = src.replace(regExRes, "./resources/$3");
-					}
-					else {
-						element.src = src.replace(regEx, "./resources/$2");
-					}
-				}
-			}
-			var elements = editorDoc.getElementsByTagName('a');
-			for (var i = 0; i < elements.length; i++) {
-				var element = elements[i];
-				var id = element.id;
-				if (id != null && id != '') {
-					RegExp.lastIndex=0;
-					var matchArray = id.match(regExID);
-					if (matchArray != null && matchArray.length > 1) {
-						element.href = matchArray[1];
-						if (matchArray.length > 2 && matchArray[2].length > 0) {
-							element.id = matchArray[2];
-						}
-						else {
-							element.removeAttribute('id');
-						}
-						continue;
-					}
-				}
-				var href = element.href;
-				if (href != null && href != '') {
-					// fix self-referencing hrefs
-					if (href.indexOf('#') != -1) {
-						RegExp.lastIndex=0;
-						var matchArray = href.match(regExRef);
-						if (matchArray != null && matchArray.length > 2) {
-							var hrefFile = matchArray[1];
-							var ref = matchArray[2];
-							if (hrefFile == sourceURL) {
-								element.href = ref;
-								continue;
-							}
-						}
-					}
-					// fix hrefs already in resources
-					if (href.indexOf('resources') != -1) {
-						element.href = href.replace(regExRes, "./resources/$3");
-					}
-					// fix hrefs not in resources
-					else {
-						element.href = href.replace(regEx, "./resources/$2");
-					}
-				}
-			}
-		}
-		catch (e) {
-		}
-	}
-}
-
-// Redo the previous command.
-function redo() {
-	formatText('redo', null);
-}
-
-// Redo the previous command.
-function removeFormat() {
-	formatText('removeformat', null);
-}
-
-
-
-function _replaceAllText(findText, replaceText, options) {
-	// this is IE only
-	if (document.all) {
-		var tempRange =  document.getElementById(editorId).contentWindow.document.body.createTextRange();
-		tempRange.moveStart('character', -10000000000);
-		do {
-			tempRange.collapse();
-			if (tempRange.findText(findText, 10000000000, options)) {
-				tempRange.text = replaceText;
-				tempRange.select();
-			} else {		
-				break;
-			}
-		} while (true);
-	}
-}
-
-// Replaces all text.
-function replaceAllText(findText, replaceText, options) {
-	if (readOnly || findText == null || findText == "") {
-		return;
-	}
-	else {
-		findText = decodeString(findText);
-	}
-	if (replaceText == null) {
-		replaceText = "";
-	}
-	else {
-		replaceText = decodeString(replaceText);
-	}
-	
-	if (document.all) {
-		// TODO: Move the insertion point to the start of the HTML
-		// and perform a search and replace in the forward direction. 
-		_replaceAllText(findText, replaceText, options);
-	}
-	else {
-		// TODO: Emulate the IE implementation.
-		var html = document.getElementById(editorId).contentWindow.document.body.innerHTML;
-		var optionStr = "/g";
-		if ((options & 4) == 0) {
-			optionStr += "i";
-		}
-		var regExp = eval("/" + findText + optionStr);
-		html = html.replace(regExp, replaceText);
-		setText(html);
-	}
-	
-	setStatus(STATUS_EXEC_CMD, 1);
-	setStatus(STATUS_MODIFIED, null);
-}
-
-// Replaces text.
-function replaceText(replaceText, dir, options) {
-	if (readOnly || !internalUpdateSelection()) {
-		return;
-	}
-	if (replaceText == null) {
-		replaceText = "";
-	}
-	else {
-		replaceText = decodeString(replaceText);
-	}
-	if (document.all) {
-		selectionRange.text = replaceText;
-		if (replaceText != "") {
-			selectionRange.moveStart("word", -1);
-			selectionRange.select();
-			selectionRange.collapse(dir < 0);
-		}
-	}
-	else {
-		selectionRange.deleteContents();
-		selectionRange.insertNode(editorDoc.createTextNode(replaceText));
-	}
-	setStatus(STATUS_EXEC_CMD, 1);
-	setStatus(STATUS_MODIFIED, null);
-}
-
-// Selects all text.
-function selectAll() {
-	if (internalUpdateSelection()) {
-		if (editorDoc.execCommand('selectall', false, null)) {
-			setStatus(STATUS_EXEC_CMD, 1);
-		}
-	}
-}
-
-// Sets the font name for the selected text.
-function setFontName(name) {
-	if (internalUpdateSelection()) {
-		if (name != null) {
-			if (name == '') {
-				formatText('removeFormat');
-			} else {
-				formatText('fontname', name);
-			}
-		}
-	}
-}
-
-// Sets the font size for the selected text.
-function setFontSize(size) {
-	if (internalUpdateSelection()) {
-		if (size != null) {
-			if (size == '') {
-				formatText('removeFormat');
-			} else {
-				formatText('fontsize', size);
-			}
-		}
-	}
-}
-
-// Sets the font style for the selected text.
-function setFontStyle(style) { 
-	if (!readOnly && style != null && style != '' && internalUpdateSelection()) {
-		try {
-			if (document.all) {
-				selectionRange.execCommand("removeformat");
-				selectionRange.parentElement().removeAttribute("className");
-			}
-		}
-		catch (e) {
-		}
-		if (style == "<quote>") {
-			formatText('formatblock', '<p>');
-			if (document.all) {
-				selectionRange.parentElement().className = "quote";
-			}
-			else {
-				selection.focusNode.parentNode.className = "quote";
-			}
-		}
-		else if (style == "<code>") {
-			formatText('formatblock', '<p>');
-			if (document.all) {
-				selectionRange.parentElement().className = "codeSample";
-			}
-			else {
-				selection.focusNode.parentNode.className = "codeSample";
-			}
-		}
-		else {
-			if (!document.all && style == "<p>") {
-				// A hack to get rid of the "className" attribute in Mozilla/Firefox.
-				formatText('formatblock', '<h4>');
-			}
-			formatText('formatblock', style);
-		}
-	}
-}
-
-// Sets whether the content can be edited.
-function setEditable(editable) {
-	var doc = document.getElementById(editorId).contentWindow.document;
-    if (editable != null && editable == 'true') {
-		if (document.all) {
-			doc.body.contentEditable = "true";
-		}
-		else {
-			doc.designMode = "on";
-		}
-		readOnly = false;
-	}
-	else {
-		if (document.all) {		
-			doc.body.contentEditable = "false";
-		}
-		else {
-			doc.designMode = "off";
-		}
-		readOnly = true;
-	}
-	setStatus(STATUS_EXEC_CMD, 1);	
-}
-
-// Toggles the 'strike-through' attribute of the selected text.
-function strikeThrough() {
-	formatText('strikethrough', size);
-}
-
-// Toggles the 'subscript' attribute of the selected text.
-function subscript() {
-	formatText('subscript', null);
-}
-
-// Toggles the 'superscript' attribute of the selected text.
-function superscript() {
-	formatText('superscript', null);
-}
-
-// Toggles the 'underline' attribute of the selected text.
-function underline() {
-	formatText('underline', null);
-}
-
-// Converts a link to normal text.
-function unlink() {
-	formatText('unlink', null);
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.xsl b/1.5/plugins/org.eclipse.epf.richtext/rte/rte.xsl
deleted file mode 100644
index 48914fc..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/rte/rte.xsl
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<xsl:stylesheet version="1.0"
-	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-
-<xsl:template match="/rte">
-	<xsl:variable name="rte_id"><xsl:value-of select="@id"/></xsl:variable>
-	<xsl:variable name="rte_js"><xsl:value-of select="@js"/></xsl:variable>
-	<html>
-		<head>
-			<script language="JavaScript" type="text/javascript" src="{$rte_js}"></script>
-		</head>
-		<body leftMargin="0" topMargin="0" marginheight="0" marginwidth="0" scroll="no" style="overflow: hidden">
-			<iframe id="{$rte_id}" name="{$rte_id}" style="border: none;" frameborder="0" scrolling="auto" width="100%" height="100%"></iframe>
-			<script language="JavaScript" type="text/javascript">
-				initEditor('<xsl:value-of select="@id"/>', '<xsl:value-of select="@css"/>', '<xsl:value-of select="@baseURL"/>');
-			</script>
-		</body>
-	</html>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichText.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichText.java
deleted file mode 100644
index bbff644..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichText.java
+++ /dev/null
@@ -1,355 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import java.net.URL;
-import java.util.Iterator;
-
-import org.eclipse.epf.richtext.actions.FindReplaceAction;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * The interface for a rich text control.
- * <p>
- * A rich text control is an editable user interface object that displays rich
- * text and images.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public interface IRichText {
-
-	public static final String PROPERTY_NAME = "richText"; //$NON-NLS-1$
-
-	/**
-	 * Returns this rich text control.
-	 * 
-	 * @return this rich text control
-	 */
-	public Control getControl();
-
-	/**
-	 * Sets the layout data.
-	 * 
-	 * @param layoutData
-	 *            the layout data to set
-	 */
-	public void setLayoutData(Object layoutData);
-
-	/**
-	 * Returns the layout data.
-	 * 
-	 * @return this control's layout data
-	 */
-	public Object getLayoutData();
-
-	/**
-	 * Sets focus to this control.
-	 */
-	public void setFocus();
-
-	/**
-	 * Tells the control it does not have focus.
-	 */
-	public void setBlur();
-
-	/**
-	 * Checks whether this control has focus.
-	 * 
-	 * @return <code>true</code> if this control has the user-interface focus
-	 */
-	public boolean hasFocus();
-
-	/**
-	 * Returns the base path used for resolving text and image links.
-	 * 
-	 * @return the base path used for resolving links in this control
-	 */
-	public String getBasePath();
-
-	/**
-	 * Returns the editable state.
-	 * 
-	 * @return <code>true</code> if the content is ediatble
-	 */
-	public boolean getEditable();
-
-	/**
-	 * Sets the editable state.
-	 * 
-	 * @param editable
-	 *            the editable state
-	 */
-	public void setEditable(boolean editable);
-
-	/**
-	 * Checks whether the content has been modified.
-	 * 
-	 * @return <code>true</code> if the content has been modified
-	 */
-	public boolean getModified();
-
-	/**
-	 * Sets the modified state.
-	 * 
-	 * @param modified
-	 *            the modified state
-	 */
-	public void setModified(boolean modified);
-
-	/**
-	 * Returns the rich text content.
-	 * 
-	 * @return the rich text content formatted in a markup language
-	 */
-	public String getText();
-
-	/**
-	 * Sets the rich text content.
-	 * 
-	 * @param text
-	 *            the rich text content formatted in a markup language
-	 */
-	public void setText(String text);
-
-	/**
-	 * Restores the rich text content back to the initial value.
-	 */
-	public void restoreText();
-
-	/**
-	 * Checks whether the editor content has been modified. If it has been
-	 * modified, notify the modify listeners.
-	 */
-	public void checkModify();
-
-	/**
-	 * Returns an object that describes the current selection
-	 * 
-	 * @return a <code>RichTextSelection</code> object
-	 */
-	public RichTextSelection getSelected();
-
-	/**
-	 * Returns an application specific property value.
-	 * 
-	 * @param key
-	 *            the name of the property
-	 * @return the value of the property or <code>null</code> if it has not
-	 *         been set
-	 */
-	public Object getData(String key);
-
-	/**
-	 * Sets an application specific property name and value.
-	 * 
-	 * @param key
-	 *            the name of the property
-	 * @param value
-	 *            the property value
-	 */
-	public void setData(String key, Object value);
-
-	/**
-	 * Executes the given rich text command. The supported command strings are
-	 * defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command);
-
-	/**
-	 * Executes the given rich text command with a single parameter. The
-	 * supported command strings are defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @param	param		a parameter for the command or <code>null</code>
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command, String param);
-
-	/**
-	 * Executes the given rich text command with an array of parameters. The
-	 * supported command strings are defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @param	params		an array of parameters for the command or <code>null</code>
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command, String[] params);
-
-	/**
-	 * Returns the modify listeners attached to this control.
-	 * 
-	 * @return an iterator for retrieving the modify listeners
-	 */
-	public Iterator<ModifyListener> getModifyListeners();
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * keys are pressed and released within this control.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addKeyListener(KeyListener listener);
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when keys are pressed and released within this control.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeKeyListener(KeyListener listener);
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * the content of this control is modified.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addModifyListener(ModifyListener listener);
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when the content of this control is modified.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeModifyListener(ModifyListener listener);
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notifed when
-	 * this control is disposed.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addDisposeListener(DisposeListener listener);
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when this control is disposed.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeDisposeListener(DisposeListener listener);
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * help events are generated for this control.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addHelpListener(HelpListener listener);
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when help events are generated for this control.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeHelpListener(HelpListener listener);
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notifed when
-	 * an event of the given type occurs within this control.
-	 * 
-	 * @param eventType
-	 *            the type of event to listen for
-	 * @param listener
-	 *            the listener which should be notified when the event occurs
-	 */
-	public void addListener(int eventType, Listener listener);
-
-	/**
-	 * Removes the listener from the collection of listeners who will be notifed
-	 * when an event of the given type occurs within this econtrol.
-	 * 
-	 * @param eventType
-	 *            the type of event to listen to
-	 * @param listener
-	 *            the listener which should no longer be notified when the event
-	 *            occurs
-	 */
-	public void removeListener(int eventType, Listener listener);
-	
-	/**
-	 * Notifies the modify listeners
-	 *
-	 */
-	public void notifyModifyListeners();
-
-	/**
-	 * Returns the event listeners attached to this control.
-	 * 
-	 * @return an iterator for retrieving the event listeners attached to this
-	 *         control
-	 */
-	public Iterator<RichTextListener> getListeners();
-
-	/**
-	 * Returns the base URL of the rich text control whose content was last
-	 * copied to the clipboard.
-	 * 
-	 * @return the base URL of a rich text control
-	 */
-	public URL getCopyURL();
-
-	/**
-	 * Sets the base URL of the rich text control whose content was last copied
-	 * to the clipboard.
-	 */
-	public void setCopyURL();
-
-	/**
-	 * Disposes the operating system resources allocated by this control.
-	 */
-	public void dispose();
-
-	/**
-	 * Checks whether this control has been disposed.
-	 * 
-	 * @return <code>true</code> if this control is disposed successfully
-	 */
-	public boolean isDisposed();
-	
-	/**
-	 * 
-	 * @return the control's FindReplaceAction
-	 */
-	public FindReplaceAction getFindReplaceAction();
-	
-	/**
-	 * Sets the FindReplaceAction to use
-	 * @param findReplaceAction
-	 */
-	public void setFindReplaceAction(FindReplaceAction findReplaceAction);
-	
-	/**
-	 * Sets the initialText variable, which stores what is saved on disk
-	 * @param text
-	 */
-	public void setInitialText(String text);
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichTextEditor.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichTextEditor.java
deleted file mode 100644
index 055eaa6..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichTextEditor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import org.eclipse.epf.richtext.actions.FindReplaceAction;
-
-/**
- * The interface for a rich text editor.
- * <p>
- * A rich text editor is a composite user interface object that includes a tool
- * bar, a tab folder for entering the rich text content, and a tab folder for
- * viewing and modifying the rich text content in a markup language.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IRichTextEditor extends IRichText {
-
-	/**
-	 * Fills the tool bar with rich text action items.
-	 * 
-	 * @param toolBar
-	 *            a rich text editor tool bar
-	 */
-	public void fillToolBar(IRichTextToolBar toolBar);
-
-	/**
-	 * Selects the rich text or the markup language tab.
-	 * 
-	 * @param index
-	 *            <code>0</code> for the rich text tab, <code>1</code> for
-	 *            the markup language tab
-	 */
-	public void setSelection(int index);
-	
-	/**
-	 * Sets the FindReplaceAction to use
-	 * @param findReplaceAction
-	 */
-	public void setFindReplaceAction(FindReplaceAction findReplaceAction);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichTextToolBar.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichTextToolBar.java
deleted file mode 100644
index 9ca53d5..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/IRichTextToolBar.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import org.eclipse.epf.richtext.actions.RichTextComboAction;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.ToolBarManager;
-
-/**
- * The interface for a rich text editor toolbar.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IRichTextToolBar {
-
-	
-	/**
-	 * Adds a button action to the tool bar.
-	 * 
-	 * @param action
-	 *            the button action to add
-	 */
-	public void addAction(IAction action);
-
-	/**
-	 * Adds a combo action to the tool bar.
-	 * 
-	 * @param action
-	 *            the combo action to add
-	 */
-	public void addAction(RichTextComboAction item);
-
-	/**
-	 * Adds a separator to the tool bar.
-	 */
-	public void addSeparator();
-
-	/**
-	 * Updates the toolbar state.
-	 * <p>
-	 * Enables/disables actions depending on the currently selected
-	 * RichTextEditor tab (RichText vs. HTML)
-	 * 
-	 * @param editable specifies whether to enable non-ReadOnly commands
-	 */
-	public void updateToolBar(boolean enabled);
-	
-	/**
-	 * 
-	 * @return the toolbar manager
-	 */
-	public ToolBarManager getToolbarMgr();
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/Resources.properties b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/Resources.properties
deleted file mode 100644
index f1fabc3..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/Resources.properties
+++ /dev/null
@@ -1,148 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-################################################################################
-# BEGIN NO TRANSLATION
-###############################################################################
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-fontNameAction_CSS_Default=arial, helvetica, sans-serif
-# !! DO NOT TRANSLATE THE FOLLOWING LINE !!
-fontNameAction_CSS_Default_Mozilla=arial,helvetica,sans-serif
-################################################################################
-# END NO TRANSLATION
-################################################################################
-
-
-
-# Font Style Names
-fontStyle_normal=Normal
-fontStyle_sectionHeading=Section Heading
-fontStyle_subsectionHeading=Subsection Heading
-fontStyle_subSubsectionHeading=Sub Subsection Heading
-fontStyle_quote=Quote
-fontStyle_codeSample=Code Sample
-
-# HTML Block Tags
-blockTag_paragraph=Paragraph
-blockTag_heading1=Heading 1
-blockTag_heading2=Heading 2
-blockTag_heading3=Heading 3
-blockTag_heading4=Heading 4
-blockTag_heading5=Heading 5
-blockTag_heading6=Heading 6
-blockTag_address=Address
-blockTag_preformattedText=Preformatted Text
-
-# HTML Font Names
-fontName_default=Default
-fontName_arial=Arial
-fontName_courierNew=Courier New
-fontName_timesNewRoman=Times New Roman
-fontName_verdana=Verdana
-
-# Rich Text Editor Tool Buttons
-addHorizontalBarAction_toolTipText=Add Horizontal Bar
-addImageAction_toolTipText=Add Image
-addLineAction_toolTipText=Add Line
-addLinkAction_toolTipText=Add Link
-addOrderedListAction_toolTipText=Add Ordered List
-addTableAction_toolTipText=Add Table
-addUnorderedListAction_toolTipText=Add Unordered List
-boldAction_toolTipText=Bold
-clearContentAction_toolTipText=Clear Content
-copyAction_toolTipText=Copy
-cutAction_toolTipText=Cut
-findReplaceAction_toolTipText=Find/Replace
-indentAction_toolTipText=Indent
-italicAction_toolTipText=Italic
-justifyCenterAction_toolTipText=Justify Center
-justifyFullAction_toolTipText=Justify Full
-justifyLeftAction_toolTipText=Justify Left
-justifyRightAction_toolTipText=Justify Right
-outdentAction_toolTipText=Outdent
-pasteAction_toolTipText=Paste
-pastePlainTextAction_toolTipText=Paste as plain text
-subscriptAction_toolTipText=Subscript
-superscriptAction_toolTipText=Superscript
-underlineAction_toolTipText=Underline
-tidy_clean_text=Default Clean
-tidy_cleaner_text=Clean MS HTML
-tidy_cleanest_text=Clean Word 2000 HTML
-tidy_clean_toolTipText=Clean with JTidy using default options
-tidy_cleaner_toolTipText=Clean HTML of MS HTML
-tidy_cleanest_toolTipText=Clean Word 2000 HTML
-
-
-# Rich Text Editor Comboboxes
-fontStyleAction_toolTipText=Set Font Style
-blockTagAction_toolTipText=Set Block Tag
-fontNameAction_toolTipText=Set Font
-fontNameAction_DefaultFontName=Default font
-fontSizeAction_toolTipText=Set Font Size
-
-# Rich Text Editor Context Menu Items
-cutAction_text=&Cut
-copyAction_text=C&opy
-pasteAction_text=&Paste
-pastePlainTextAction_text=Paste &as plain text
-
-# Rich Text Editor Tabs
-richTextTab_text=Rich Text
-richTextTab_toolTipText=Edit content in rich text
-htmlTab_text=HTML
-htmlTab_toolTipText=Edit content in HTML
-
-# Add Dialogs
-addImageDialog_title=Add Image
-addLinkDialog_title=Add Link
-addTableDialog_title=Add Table
-findReplaceDialog_title=Find/Replace
-urlLabel_text=URL:
-summaryLabel_text=Summary:
-captionLabel_text=Caption:
-rowsLabel_text=Rows:
-columnsLabel_text=Columns:
-widthLabel_text=Width:
-tableStyleLabel_text=Style:
-tableHeaderNone_text=Table with no headers
-tableHeaderCols_text=Table with column headers
-tableHeaderRows_text=Table with row headers
-tableHeaderBoth_text=Table with column and row headers
-browseButton_text=Browse...
-
-# Clear Editor Content Dialog
-clearContentDialog_title=Clear Editor Content Confirmation
-clearContentDialog_text=Do you really want to clear the content of this rich text editor?
-
-# Find/Replace Dialog
-findLabel_text=Find:
-replaceLabel_text=Replace with:
-optionsGroup_text=Options
-caseSensitiveCheckbox_text=Case sensitive
-wholeWordCheckbox_text=Whole word
-directionGroup_text=Direction
-forwardRadioButton_text=Forward
-backwardRadioButton_text=Backward
-findButton_text=Find
-replaceButton_text=Replace
-replaceFindButton_text=Replace/Find
-replaceallButton_text=Replace All
-# taken from org.eclipse.ui.workbench.texteditor
-FindReplace_Status_noMatch_label=String Not Found
-
-# Preference Page
-maxCharsPerLineLabel_text=Maximum characters per line:
-indentHTMLCheckbox_text=Indent HTML tags
-indentSizeLabel_text=Indent Size:
-urlDisplayNameLabel_text=URL Display Name:
-
-
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichText.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichText.java
deleted file mode 100644
index c518130..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichText.java
+++ /dev/null
@@ -1,1568 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import java.io.File;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.common.html.HTMLFormatter;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.common.xml.XSLTProcessor;
-import org.eclipse.epf.richtext.actions.CopyAction;
-import org.eclipse.epf.richtext.actions.CutAction;
-import org.eclipse.epf.richtext.actions.FindReplaceAction;
-import org.eclipse.epf.richtext.actions.PasteAction;
-import org.eclipse.epf.richtext.actions.PastePlainTextAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.LocationAdapter;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.browser.StatusTextEvent;
-import org.eclipse.swt.browser.StatusTextListener;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.events.MenuListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The default rich text control implementation.
- * <p>
- * The default rich text editor uses XHTML as the underlying markup language for
- * the rich text content. It is implemented using a SWT <code>Browser</code>
- * control and DHTML (HTML, CSS and JavaScript).
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class RichText implements IRichText {
-
-	// Encoded single quote. All single quotes need to be specially encoded to
-	// avoid JavaScript error when calling Browse.executeCommand().
-	private static final String ENCODED_SINGLE_QUOTE = "%sq%"; //$NON-NLS-1$
-
-	private static final String ENCODED_NEWLINE = "%EOL%"; //$NON-NLS-1$
-
-	private static final String STATUS_PREFIX = "$$$"; //$NON-NLS-1$
-
-	private static final int STATUS_PREFIX_LENGTH = STATUS_PREFIX.length();
-
-	private static final int STATUS_NOP = 0;
-
-	private static final int STATUS_INITIALIZED = 1;
-
-	private static final int STATUS_MODIFIED = 2;
-
-	private static final int STATUS_GET_TEXT = 3;
-
-	private static final int STATUS_KEY_DOWN = 4;
-
-	private static final int STATUS_KEY_UP = 5;
-
-	private static final int STATUS_SELECT_TEXT = 6;
-
-	private static final int STATUS_SELECT_CONTROL = 7;
-
-	private static final int STATUS_SELECT_NONE = 8;
-
-	private static final int STATUS_EXEC_CMD = 9;
-
-	private static final int STATUS_REFORMAT_LINKS = 10;
-
-	// The default base path used for resolving links (<href>, <img>, etc.)
-	private static final String DEFAULT_BASE_PATH = System
-			.getProperty("user.home") //$NON-NLS-1$
-			+ System.getProperty("file.separator") + "rte"; //$NON-NLS-1$ //$NON-NLS-2$
-
-	// If true, log debugging info.
-	protected boolean debug;
-
-	// The plug-in logger.
-	protected Logger logger;
-
-	// The underlying SWT Browser used for loading the JavaScript/DHTML editor.
-	protected Browser editor;
-
-	// The underlying OleControlSite for the SWT Browser (Win32 only).
-	protected Control editorControl;
-
-	// The base URL of the rich text control whose content was last
-	// copied to the clipboard.
-	protected static URL copyURL;
-
-	// The context menu associated with this control.
-	protected Menu contextMenu;
-
-	// The folder that contains the supporting CSS and JavaScript files
-	protected String rteFolder;
-
-	// The URL that points to the supporting CSS and JavaScript files.
-	protected String rteURL;
-
-	// The base path used for resolving links (<href>, <img>, etc.)
-	protected String basePath;
-
-	// The DHTML initialization flag.
-	protected boolean initialized;
-
-	// The initial focus.
-	protected boolean initializedWithFocus;
-
-	// The control's initial text. This is used to cache the HTML source passed
-	// in via setText()while the DHTML initialization is happening.
-	protected String initialText;
-
-	// The control's current text.
-	protected String currentText = ""; //$NON-NLS-1$
-
-	// The control's editable flag.
-	protected boolean editable = true;
-
-	// The control's modification flag.
-	protected boolean modified;
-
-	// The control's text and object selection flag.
-	protected boolean hasSelection;
-
-	// The control's text selection
-	protected RichTextSelection richTextSelection = new RichTextSelection();
-
-	// JavaScript command execution status code.
-	protected int status = 0;
-
-	// The HTML source formatter.
-	protected HTMLFormatter htmlFormatter;
-
-	// The SWT event listeners.
-	protected Map<Listener, RichTextListener> listeners;
-
-	// The modify listeners.
-	protected List<ModifyListener> modifyListeners;
-
-	// The control's edit flag.
-	protected boolean notifyingModifyListeners = false;
-
-	// The controls's focus flag.
-	protected boolean hasFocus = false;
-
-	// The controls's processing JavaScript event flag.
-	protected boolean processingJSEvent = false;
-
-	// The controls's processing MODIFIED JavaScript event flag.
-	protected boolean checkingModifyEvent = false;
-
-	// The control's find/replace text action
-	protected FindReplaceAction findReplaceAction;
-	
-	// The control's IE flag
-	protected boolean isIE = false;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the style for this control
-	 * @param basePath
-	 *            the path used for resolving links
-	 */
-	public RichText(Composite parent, int style, String basePath) {
-		debug = RichTextPlugin.getDefault().isDebugging();
-		logger = RichTextPlugin.getDefault().getLogger();
-		findReplaceAction = new FindReplaceAction(this);
-		rteFolder = RichTextPlugin.getDefault().getInstallPath() + "rte/"; //$NON-NLS-1$		
-		rteURL = XMLUtil.escape("file://" + rteFolder); //$NON-NLS-1$
-		setBasePath(basePath);
-
-		try {
-			editor = new Browser(parent, SWT.NONE);
-			if (debug) {
-				printDebugMessage("RichText", "basePath=" + basePath); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			editor.setLayoutData(new GridData(GridData.FILL_BOTH));
-			editor.setData(PROPERTY_NAME, this);
-			init(parent, style);
-		} catch (Exception e) {
-			editor = null;
-			String msg = "Failed to create RichText with basePath=" + basePath; //$NON-NLS-1$
-			logger.logError(msg, e);
-			if (debug) {
-				System.out.println(msg);
-				e.printStackTrace();
-			}
-		}
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the style for this control
-	 */
-	public RichText(Composite parent, int style) {
-		this(parent, style, null);
-	}
-
-	/**
-	 * Sets the base path for resolving links.
-	 */
-	protected void setBasePath(String path) {
-		if (path != null && path.length() > 0) {
-			if (path.startsWith(FileUtil.UNC_PATH_PREFIX)) {
-				basePath = FileUtil.UNC_PATH_PREFIX
-						+ FileUtil.appendSeparator(path.substring(
-								FileUtil.UNC_PATH_PREFIX_LENGTH).replace('\\',
-								'/'), "/"); //$NON-NLS-1$
-			} else {
-				basePath = FileUtil.appendSeparator(path).replace('\\', '/');
-			}
-		} else {
-			basePath = FileUtil.appendSeparator(DEFAULT_BASE_PATH).replace(
-					'\\', '/');
-		}
-	}
-
-	/**
-	 * Initializes this control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the style for this control
-	 * @throws Exception
-	 *             when an error has occurred while initialzing this control
-	 */
-	protected void init(Composite parent, int style) throws Exception {
-		try {
-			addStatusTextListener();
-			if (debug) {
-				printDebugMessage("init", "added status text listener"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			String editorHTML = generateEditorHTML();
-			if (debug) {
-				printDebugMessage("init", "generated editor HTML"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			editor.setText(editorHTML);
-			if (debug) {
-				printDebugMessage("init", "loaded editor HTML"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			contextMenu = new Menu(parent.getShell(), SWT.POP_UP);
-			editor.setMenu(contextMenu);
-			fillContextMenu(contextMenu);
-			if (debug) {
-				printDebugMessage("init", "added context menu"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			addListeners();
-			if (debug) {
-				printDebugMessage("init", "added listeners"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			htmlFormatter = new HTMLFormatter();
-			if (debug) {
-				printDebugMessage("init", "instantiated HTMLFormatter"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} catch (Exception e) {
-			editor = null;
-			dispose();
-			throw e;
-		}
-	}
-
-	/**
-	 * Returns this rich text control.
-	 * 
-	 * @return this rich text control
-	 */
-	public Control getControl() {
-		return editor;
-	}
-
-	/**
-	 * Sets the layout data.
-	 * 
-	 * @param layoutData
-	 *            the layout data to set
-	 */
-	public void setLayoutData(Object layoutData) {
-		if (editor != null) {
-			editor.setLayoutData(layoutData);
-		}
-	}
-
-	/**
-	 * Returns the layout data.
-	 * 
-	 * @return this control's layout data
-	 */
-	public Object getLayoutData() {
-		if (editor != null) {
-			return editor.getLayoutData();
-		}
-		return null;
-	}
-
-	/**
-	 * Sets focus to this control.
-	 */
-	public void setFocus() {
-		if (debug) {
-			printDebugMessage("setFocus, editable=" + editable); //$NON-NLS-1$
-		}
-		if (editor != null) {
-			if (initialized) {
-				if (!Platform.getOS().equals("win32")) { //$NON-NLS-1$
-					// Workaround for Mozilla and Firefox rich text editor focus
-					// issue.
-					editor.setFocus();
-				}
-				executeCommand(RichTextCommand.SET_FOCUS);
-				hasFocus = true;
-			} else {
-				initializedWithFocus = true;
-			}
-		}
-	}
-
-	/**
-	 * Tells the control it does not have focus.
-	 */
-	public void setBlur() {
-		if (debug) {
-			printDebugMessage("setBlur, editable=" + editable); //$NON-NLS-1$
-		}
-		if (editor != null) {
-			if (initialized) {
-				hasFocus = false;
-			} else {
-				initializedWithFocus = false;
-			}
-		}
-	}
-
-	/**
-	 * Checks whether this control has focus.
-	 * 
-	 * @return <code>true</code> if this control has the user-interface focus
-	 */
-	public boolean hasFocus() {
-		if (editor != null) {
-			return hasFocus;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the base path used for resolving text and image links.
-	 * 
-	 * @return the base path used for resolving links in this control
-	 */
-	public String getBasePath() {
-		return basePath;
-	}
-
-	/**
-	 * Returns the base URL of the rich text control whose content was last
-	 * copied to the clipboard.
-	 * 
-	 * @return the base URL of a rich text control
-	 */
-	public URL getCopyURL() {
-		return copyURL;
-	}
-
-	/**
-	 * Sets the base URL of the rich text control whose content was last copied
-	 * to the clipboard.
-	 */
-	public void setCopyURL() {
-		try {
-			copyURL = new File(basePath).toURL();
-		} catch (Exception e) {
-			copyURL = null;
-		}
-	}
-
-	/**
-	 * Returns the editable state.
-	 * 
-	 * @return <code>true</code> if the content is editable
-	 */
-	public boolean getEditable() {
-		return editable;
-	}
-
-	/**
-	 * Sets the editable state.
-	 * 
-	 * @param editable
-	 *            the editable state
-	 */
-	public void setEditable(boolean editable) {
-		this.editable = editable;
-		if (initialized) {
-			executeCommand(RichTextCommand.SET_EDITABLE, "" + editable); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Checks whether the content has been modified.
-	 * 
-	 * @return <code>true</code> if the content has been modified
-	 */
-	public boolean getModified() {
-		return modified;
-	}
-
-	/**
-	 * Sets the modified state.
-	 * 
-	 * @param modified
-	 *            the modified state
-	 */
-	public void setModified(boolean modified) {
-		this.modified = modified;
-	}
-
-	/**
-	 * Returns the rich text content.
-	 * 
-	 * @return the rich text content formatted in a markup language
-	 */
-	public String getText() {
-		if (editor != null && initialized) {
-			try {
-				executeCommand(RichTextCommand.GET_TEXT);
-				if (currentText != null && currentText.length() > 0) {
-					currentText = currentText.replaceAll(
-							"<P>&nbsp;</P>", "<br/>"); //$NON-NLS-1$ //$NON-NLS-2$			
-					currentText = tidyText(currentText);
-					currentText = formatHTML(currentText);
-				} else {
-					currentText = ""; //$NON-NLS-1$
-				}
-				if (debug) {
-					printDebugMessage("getText", "text=", currentText); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				return currentText;
-			} catch (Exception e) {
-				logger.logError(e);
-			}
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	protected String formatHTML(String text) {
-		String formattedText;
-		try {
-			// Call JTidy to format the source to XHTML.
-			formattedText = htmlFormatter.formatHTML(text);
-			if (htmlFormatter.getLastErrorStr() != null) {
-				logger.logError(htmlFormatter.getLastErrorStr());
-			}
-			return formattedText;
-		} catch (UnsupportedEncodingException e) {
-			logger.logError(e);
-		}
-		return text;
-	}
-
-	/**
-	 * Sets the rich text content.
-	 * 
-	 * @param text
-	 *            the rich text content formatted in a markup language
-	 */
-	public void setText(String text) {
-		if (editor != null) {
-			if (debug) {
-				printDebugMessage("setText", "text=", text); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			String newText = text;
-			if (newText != null) {
-				newText = tidyText(newText);
-				// Call JTidy to format the source to XHTML.
-				newText = formatHTML(newText);
-			} else {
-				newText = ""; //$NON-NLS-1$
-			}
-
-			if (initialized) {
-				modified = !newText.equals(currentText);
-			}
-			initialText = newText;
-			if (initialText.equals("") && !isIE) { //$NON-NLS-1$
-				initialText = "<br />"; //$NON-NLS-1$
-			}
-
-			if (debug) {
-				printDebugMessage(
-						"setText", "modified=" + modified + ", newText=", newText); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-
-			if (initialized) {
-				try {
-					executeCommand(RichTextCommand.SET_TEXT, newText);
-					executeCommand(RichTextCommand.SET_EDITABLE, "" + editable); //$NON-NLS-1$				
-				} catch (Exception e) {
-					logger.logError(e);
-				}
-			}
-
-			currentText = newText;
-		}
-	}
-
-	/**
-	 * Restores the rich text content back to the initial value.
-	 */
-	public void restoreText() {
-		setText(initialText);
-		modified = false;
-	}
-
-	/**
-	 * Returns the currently selected text.
-	 * 
-	 * @return the selected text or <code>""</code> if there is no
-	 *         hasSelection
-	 */
-	public String getSelectedText() {
-		// executeCommand(RichTextCommand.GET_SELECTED_TEXT);
-		return richTextSelection.getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.richtext.IRichText#getSelected()
-	 */
-	public RichTextSelection getSelected() {
-		return richTextSelection;
-	}
-
-	/**
-	 * Returns an application specific property value.
-	 * 
-	 * @param key
-	 *            the name of the property
-	 * @return the value of the property or <code>null</code> if it has not
-	 *         been set
-	 */
-	public Object getData(String key) {
-		if (editor != null) {
-			editor.getData(key);
-		}
-		return null;
-	}
-
-	/**
-	 * Sets an application specific property name and value.
-	 * 
-	 * @param key
-	 *            the name of the property
-	 * @param value
-	 *            the property value
-	 */
-	public void setData(String key, Object value) {
-		if (editor != null) {
-			editor.setData(key, value);
-		}
-	}
-
-	/**
-	 * Executes the given JavaScript.
-	 * 
-	 * @param script
-	 *            the JavaScript to execute
-	 * @return a status code returned by the executed script
-	 */
-	protected int execute(final String script) {
-		status = 0;
-		if (editor != null && script != null && script.length() > 0) {
-			try {
-				if (!isIE && processingJSEvent) {
-					Display.getCurrent().asyncExec(new Runnable() {
-						public void run() {
-							editor.execute(script);
-						}
-					});
-				} else {
-					editor.execute(script);
-				}
-				if (debug) {
-					printDebugMessage("execute", script); //$NON-NLS-1$				
-				}
-			} catch (Exception e) {
-				String msg = "Failed to execute " + script; //$NON-NLS-1$
-				logger.logError(msg, e);
-				if (debug) {
-					printDebugMessage("execute", msg); //$NON-NLS-1$
-					e.printStackTrace();
-				}
-			}
-		}
-		return status;
-	}
-
-	/**
-	 * Executes the given rich text command. The supported command strings are
-	 * defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string.
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command) {
-		status = 0;
-		if (command != null && command.equals(RichTextCommand.CLEAR_CONTENT)) {
-			String oldInitialText = initialText;
-			setText(""); //$NON-NLS-1$
-			initialText = oldInitialText;
-			status = 1;
-			modified = true;
-			notifyModifyListeners();
-		} else {
-			status = execute(command + "();"); //$NON-NLS-1$
-		}
-		return status;
-	}
-
-	/**
-	 * Executes the given rich text command with a single parameter. The
-	 * supported command strings are defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @param	param		a parameter for the command or <code>null</code>
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command, String param) {
-		if (param == null) {
-			return executeCommand(command);
-		}
-		return execute(command + "('" + formatText(param) + "');"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Executes the given rich text command with an array of parameters. The
-	 * supported command strings are defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @param	params		an array of parameters for the command or <code>null</code>
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command, String[] params) {
-		if (params == null || params.length == 0) {
-			return executeCommand(command);
-		}
-		StringBuffer sb = new StringBuffer();
-		int paramsLength = params.length;
-		for (int i = 0; i < paramsLength; i++) {
-			sb.append('\'').append(formatText(params[i])).append('\'');
-			if (i < paramsLength - 1) {
-				sb.append(',');
-			}
-		}
-		String param = sb.toString();
-		return execute(command + "(" + param + ");"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Disposes the operating system resources allocated by the control.
-	 */
-	public void dispose() {
-		if (contextMenu != null && !contextMenu.isDisposed()) {
-			contextMenu.dispose();
-			contextMenu = null;
-		}
-		if (listeners != null) {
-			listeners.clear();
-			listeners = null;
-		}
-		if (modifyListeners != null) {
-			modifyListeners.clear();
-			modifyListeners = null;
-		}
-		if (htmlFormatter != null) {
-			htmlFormatter = null;
-		}
-		if (this.findReplaceAction != null) {
-			this.findReplaceAction.dispose();
-			this.findReplaceAction = null;
-		}
-	}
-
-	/**
-	 * Checks whether this control has been disposed.
-	 * 
-	 * @return <code>true</code> if this control is disposed successfully
-	 */
-	public boolean isDisposed() {
-		return editor.isDisposed();
-	}
-
-	/**
-	 * Returns the modify listeners attached to this control.
-	 * 
-	 * @return an iterator for retrieving the modify listeners
-	 */
-	public Iterator<ModifyListener> getModifyListeners() {
-		return modifyListeners.iterator();
-	}
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * keys are pressed and released within this control.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addKeyListener(KeyListener listener) {
-		if (editor != null) {
-			editor.addKeyListener(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when keys are pressed and released within this control.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeKeyListener(KeyListener listener) {
-		if (editor != null) {
-			editor.removeKeyListener(listener);
-		}
-	}
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * the content of this control is modified.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addModifyListener(ModifyListener listener) {
-		if (editor != null && listener != null
-				&& !modifyListeners.contains(listener)) {
-			modifyListeners.add(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when the content of this control is modified.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeModifyListener(ModifyListener listener) {
-		if (editor != null && listener != null
-				&& modifyListeners.contains(listener)) {
-			modifyListeners.remove(listener);
-		}
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notifed when
-	 * this control is disposed.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addDisposeListener(DisposeListener listener) {
-		if (editor != null) {
-			editor.addDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when this control is disposed.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeDisposeListener(DisposeListener listener) {
-		if (editor != null) {
-			editor.removeDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * help events are generated for this control.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addHelpListener(HelpListener listener) {
-		if (editor != null) {
-			editor.addHelpListener(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when help events are generated for this control.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeHelpListener(HelpListener listener) {
-		if (editor != null) {
-			editor.removeHelpListener(listener);
-		}
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notifed when
-	 * an event of the given type occurs within this control.
-	 * 
-	 * @param eventType
-	 *            the type of event to listen for
-	 * @param listener
-	 *            the listener which should be notified when the event occurs
-	 */
-	public void addListener(int eventType, Listener listener) {
-		if (editor != null && !listeners.containsKey(listener)) {
-			if (eventType != SWT.SELECTED) {
-				if (editorControl == null
-						|| (eventType != SWT.Activate
-								&& eventType != SWT.Deactivate
-								&& eventType != SWT.FocusIn && eventType != SWT.FocusOut)) {
-					editor.addListener(eventType, listener);
-				}
-			}
-			listeners.put(listener, new RichTextListener(eventType, listener));
-		}
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be notifed
-	 * when an event of the given type occurs within this control.
-	 * 
-	 * @param eventType
-	 *            the type of event to listen for
-	 * @param listener
-	 *            the listener which should no longer be notified when the event
-	 *            occurs
-	 */
-	public void removeListener(int eventType, Listener listener) {
-		if (editor != null && listeners.containsKey(listener)) {
-			if (editorControl == null
-					|| (eventType != SWT.Activate
-							&& eventType != SWT.Deactivate
-							&& eventType != SWT.FocusIn && eventType != SWT.FocusOut)) {
-				editor.removeListener(eventType, listener);
-			}
-			listeners.remove(listener);
-		}
-	}
-
-	/**
-	 * Returns the event listeners attached to this control.
-	 * 
-	 * @return an iterator for retrieving the event listeners attached to this
-	 *         control
-	 */
-	public Iterator<RichTextListener> getListeners() {
-		return listeners.values().iterator();
-	}
-
-	/**
-	 * Adds the listener to monitor events and status sent by the underlying
-	 * DHTML editor.
-	 */
-	protected void addStatusTextListener() {
-		editor.addStatusTextListener(new StatusTextListener() {
-			public void changed(StatusTextEvent event) {
-				String eventText = event.text;
-				int eventTextLength = eventText.length();
-				if (eventText.startsWith(STATUS_PREFIX)
-						&& eventTextLength > STATUS_PREFIX_LENGTH) {
-					try {
-						processingJSEvent = true;
-						int endStatusIndex = STATUS_PREFIX_LENGTH + 1;
-						if (eventText.length() > STATUS_PREFIX_LENGTH + 1
-								&& Character.isDigit(eventText
-										.charAt(endStatusIndex))) {
-							endStatusIndex++;
-						}
-						int statusType = Integer.parseInt(eventText.substring(
-								STATUS_PREFIX_LENGTH, endStatusIndex));
-						switch (statusType) {
-						case STATUS_NOP:
-							break;
-						case STATUS_INITIALIZED:
-							if (!initialized) {
-								initialized = true;
-								if (debug) {
-									printDebugMessage(
-											"statusTextListener", "STATUS_INITIALIZED"); //$NON-NLS-1$ //$NON-NLS-2$
-								}
-								if (!Platform.getOS().equals("win32")) { //$NON-NLS-1$
-									// Workaround Mozilla'a IFRAME
-									// height issue.
-									executeCommand(RichTextCommand.SET_HEIGHT,
-											"" + editor.getBounds().height); //$NON-NLS-1$
-								}
-								executeCommand(RichTextCommand.SET_TEXT,
-										currentText);
-								if (initializedWithFocus) {
-									setFocus();
-								}
-								if (!editable) {
-									executeCommand(
-											RichTextCommand.SET_EDITABLE,
-											"" + editable); //$NON-NLS-1$
-								}
-							}
-							break;
-						case STATUS_MODIFIED:
-							if (debug) {
-								printDebugMessage(
-										"statusTextListener", "STATUS_MODIFIED"); //$NON-NLS-1$ //$NON-NLS-2$
-							}
-							checkModify();
-							break;
-						case STATUS_GET_TEXT:
-							if (eventTextLength >= STATUS_PREFIX_LENGTH + 2) {
-								currentText = eventText
-										.substring(STATUS_PREFIX_LENGTH + 2);
-							} else {
-								currentText = ""; //$NON-NLS-1$
-							}
-							if (debug) {
-								printDebugMessage(
-										"statusTextListener", //$NON-NLS-1$
-										"STATUS_GET_TEXT, currentText=", currentText); //$NON-NLS-1$
-							}
-							break;
-						case STATUS_KEY_DOWN:
-							if (eventTextLength >= STATUS_PREFIX_LENGTH + 2) {
-								String cmd = eventText
-										.substring(STATUS_PREFIX_LENGTH + 2);
-								if (debug) {
-									printDebugMessage("statusTextListener", //$NON-NLS-1$
-											"STATUS_KEY_DOWN, cmd=" + cmd); //$NON-NLS-1$
-								}
-								if (cmd.equals(RichTextCommand.COPY)) {
-									setCopyURL();
-								} else if (cmd.equals(RichTextCommand.CUT)) {
-									setCopyURL();
-									CutAction action = new CutAction(
-											RichText.this);
-									action.execute(RichText.this);
-								} else if (cmd
-										.equals(RichTextCommand.FIND_TEXT)) {
-									getFindReplaceAction().execute(
-											RichText.this);
-								} else if (cmd.equals(RichTextCommand.PASTE)) {
-									PasteAction action = new PasteAction(
-											RichText.this);
-									action.execute(RichText.this);
-								} else if (cmd.equals(RichTextCommand.SAVE)) {
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getActivePage().getActiveEditor()
-											.doSave(null);
-								} else if (cmd.equals(RichTextCommand.SAVE_ALL)) {
-									PlatformUI.getWorkbench()
-											.getActiveWorkbenchWindow()
-											.getActivePage().saveAllEditors(
-													false);
-								}
-							}
-							break;
-						case STATUS_KEY_UP:
-							if (debug) {
-								printDebugMessage("statusTextListener", //$NON-NLS-1$
-										"STATUS_KEY_UP, modified=" + modified); //$NON-NLS-1$
-							}
-							checkModify();
-							break;
-						case STATUS_SELECT_TEXT:
-							if (eventTextLength >= STATUS_PREFIX_LENGTH + 2) {
-								String[] strings = eventText.substring(
-										STATUS_PREFIX_LENGTH + 2).split(
-										"\\$", 5); //$NON-NLS-1$
-								try {
-									richTextSelection.setFontName(strings[0]);
-									richTextSelection.setFontSize(strings[1]);
-									richTextSelection.setBlockStyle(strings[2]);
-									richTextSelection.setFlags(Integer
-											.parseInt(strings[3]));
-									richTextSelection.setText(strings[4]);
-								} catch (NumberFormatException e) {
-									logger.logError(e);
-								}
-								if (debug) {
-									printDebugMessage(
-											"selectionStatusListener", //$NON-NLS-1$
-											"current selection is=" + richTextSelection); //$NON-NLS-1$
-								}
-
-								hasSelection = true;
-								if (hasFocus())
-									notifyListeners(SWT.SELECTED, new Event());
-							} else {
-								richTextSelection.setText(""); //$NON-NLS-1$
-								hasSelection = false;
-							}
-							if (debug) {
-								printDebugMessage(
-										"statusTextListener", //$NON-NLS-1$
-										"STATUS_SELECT_TEXT, selectedText=", richTextSelection.getText()); //$NON-NLS-1$
-							}
-							break;
-						case STATUS_SELECT_CONTROL:
-							if (debug) {
-								printDebugMessage("statusTextListener", //$NON-NLS-1$
-										"STATUS_SELECT_CONTROL, control selected"); //$NON-NLS-1$
-							}
-							hasSelection = true;
-							break;
-						case STATUS_SELECT_NONE:
-							if (debug) {
-								printDebugMessage("statusTextListener", //$NON-NLS-1$
-										"STATUS_SELECT_NONE, no selection"); //$NON-NLS-1$
-							}
-							hasSelection = false;
-							break;
-						case STATUS_EXEC_CMD:
-							if (eventTextLength >= STATUS_PREFIX_LENGTH + 3) {
-								try {
-									status = Integer.parseInt(eventText
-											.substring(
-													STATUS_PREFIX_LENGTH + 2,
-													STATUS_PREFIX_LENGTH + 3));
-								} catch (Exception e) {
-									status = -1;
-								}
-							}
-							if (debug && status != 1) {
-								printDebugMessage("statusTextListener", //$NON-NLS-1$
-										"STATUS_EXEC_CMD, status=" + status); //$NON-NLS-1$
-							}
-							break;
-						case STATUS_REFORMAT_LINKS:
-							if (debug) {
-								printDebugMessage(
-										"statusTextListener", "STATUS_REFORMAT_LINKS"); //$NON-NLS-1$ //$NON-NLS-2$
-							}
-							if (Platform.getOS().equals("win32")) { //$NON-NLS-1$ 
-								// Workaround the drag and drop issue with DBCS
-								// characters.
-								if (modified) {
-									setText(getText());
-									modified = true;
-								}
-							}
-							checkModify();
-							break;
-						}
-					} catch (Exception e) {
-					} finally {
-						processingJSEvent = false;
-					}
-				}
-			}
-		});
-	}
-
-	/**
-	 * Generates the HTML source for the editor.
-	 * 
-	 * @return the HTML source for the editor
-	 */
-	protected String generateEditorHTML() throws Exception {
-		String escapedBasePath = basePath;
-		if (escapedBasePath.startsWith(FileUtil.UNC_PATH_PREFIX))
-			escapedBasePath = escapedBasePath.replaceFirst(
-					"^\\\\\\\\", "\\\\\\\\\\\\\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
-		escapedBasePath = XMLUtil
-				.escape("file://" + escapedBasePath.replaceAll("'", "\\\\'")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		String escapedRteUTL = rteURL.replaceAll("&apos;", "%27"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		StringBuffer rteXML = new StringBuffer();
-		rteXML.append("<rte id=\"").append("rte") //$NON-NLS-1$ //$NON-NLS-2$
-				.append("\" css=\"").append(escapedRteUTL + "rte.css") //$NON-NLS-1$ //$NON-NLS-2$
-				.append("\" js=\"").append(escapedRteUTL + "rte.js") //$NON-NLS-1$ //$NON-NLS-2$
-				.append("\" baseURL=\"").append(escapedBasePath) //$NON-NLS-1$
-				.append("\"/>"); //$NON-NLS-1$
-		StringWriter result = new StringWriter();
-		XSLTProcessor.transform(
-				rteFolder + "rte.xsl", rteXML.toString(), result); //$NON-NLS-1$
-		return result.toString();
-	}
-
-	/**
-	 * Fills the context menu with menu items.
-	 * 
-	 * @param contextMenu
-	 *            a context menu containing rich text actions
-	 */
-	protected void fillContextMenu(Menu contextMenu) {
-		final MenuItem cutItem = new MenuItem(contextMenu, SWT.PUSH);
-		cutItem.setText(RichTextResources.cutAction_text);
-		cutItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				CutAction action = new CutAction(RichText.this);
-				action.execute(RichText.this);
-			}
-		});
-		final MenuItem copyItem = new MenuItem(contextMenu, SWT.PUSH);
-		copyItem.setText(RichTextResources.copyAction_text);
-		copyItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				CopyAction action = new CopyAction(RichText.this);
-				action.execute(RichText.this);
-			}
-		});
-		final MenuItem pasteItem = new MenuItem(contextMenu, SWT.PUSH);
-		pasteItem.setText(RichTextResources.pasteAction_text);
-		pasteItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				PasteAction action = new PasteAction(RichText.this);
-				action.execute(RichText.this);
-			}
-		});
-
-		final MenuItem pastePlainTextItem = new MenuItem(contextMenu, SWT.PUSH);
-		pastePlainTextItem.setText(RichTextResources.pastePlainTextAction_text);
-		pastePlainTextItem.setImage(RichTextImages.IMG_PASTE_PLAIN_TEXT);
-		pastePlainTextItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				PastePlainTextAction action = new PastePlainTextAction(
-						RichText.this);
-				action.execute(RichText.this);
-			}
-		});
-
-		contextMenu.addMenuListener(new MenuListener() {
-			public void menuHidden(MenuEvent e) {
-			}
-
-			public void menuShown(MenuEvent e) {
-				getSelectedText();
-				cutItem.setEnabled(editable && hasSelection);
-				copyItem.setEnabled(hasSelection);
-				pasteItem.setEnabled(editable);
-				pastePlainTextItem.setEnabled(editable);
-			}
-		});
-	}
-
-	/**
-	 * Adds listeners to manage the activation and focus events.
-	 */
-	protected void addListeners() {
-		editorControl = getControlSite(editor);
-		if (editorControl != null) {
-			if (debug) {
-				printDebugMessage(
-						"init", "editorControl=" + editorControl.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			
-			// only IE (win32) has the editorControl != null
-			isIE = true;
-			
-			editorControl.addListener(SWT.Activate, new Listener() {
-				public void handleEvent(Event event) {
-					if (debug) {
-						printDebugMessage("activateListener"); //$NON-NLS-1$
-					}
-					setFocus();
-					notifyListeners(SWT.Activate, event);
-				}
-			});
-
-			editorControl.addListener(SWT.Deactivate, new Listener() {
-				public void handleEvent(Event event) {
-					if (debug) {
-						printDebugMessage("deactivateListener"); //$NON-NLS-1$
-					}
-					setBlur();
-					notifyListeners(SWT.Deactivate, event);
-				}
-			});
-
-			editorControl.addListener(SWT.FocusIn, new Listener() {
-				public void handleEvent(Event event) {
-					if (debug) {
-						printDebugMessage("focusInListener"); //$NON-NLS-1$
-					}
-					executeCommand("updateSelection"); //$NON-NLS-1$					
-					notifyListeners(SWT.FocusIn, event);
-				}
-			});
-
-			editorControl.addListener(SWT.KeyUp, new Listener() {
-				public void handleEvent(Event event) {
-					int keyCode = event.keyCode;
-					int stateMask = event.stateMask;
-					if (debug) {
-						printDebugMessage(
-								"keyUpListener", "keyCode=" + keyCode //$NON-NLS-1$ //$NON-NLS-2$
-										+ ", stateMask=" + stateMask + ", editable=" + editable); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					if ((stateMask & SWT.CTRL) > 0
-							|| (stateMask & SWT.ALT) > 0
-							|| ((stateMask & SWT.SHIFT) > 0 && keyCode == stateMask)) {
-						return;
-					}
-					if (editable) {
-						switch (event.keyCode) {
-						case SWT.ARROW_DOWN:
-						case SWT.ARROW_LEFT:
-						case SWT.ARROW_RIGHT:
-						case SWT.ARROW_UP:
-						case SWT.END:
-						case SWT.HOME:
-						case SWT.PAGE_DOWN:
-						case SWT.PAGE_UP:
-						case SWT.TAB:
-							return;
-						default:
-							checkModify();
-							break;
-						}
-					}
-				}
-			});
-
-			editor.addLocationListener(new LocationAdapter() {
-				public void changing(LocationEvent event) {
-					// Deactivate the links in the content page in readonly
-					// mode.
-					event.doit = editable;
-				}
-			});
-		} else {
-			editor.addListener(SWT.Activate, new Listener() {
-				public void handleEvent(Event event) {
-					if (debug) {
-						printDebugMessage("activateListener"); //$NON-NLS-1$
-					}
-					setFocus();
-				}
-			});
-
-			editor.addKeyListener(new KeyListener() {
-				public void keyPressed(KeyEvent e) {
-					if (e.keyCode == SWT.TAB) {
-						if ((e.stateMask & SWT.SHIFT) != 0) {
-							editor.traverse(SWT.TRAVERSE_TAB_PREVIOUS);
-						} else {
-							editor.traverse(SWT.TRAVERSE_TAB_NEXT);
-						}
-						return;
-					}
-					if (!editable) {
-						e.doit = false;
-					}
-				}
-
-				public void keyReleased(KeyEvent e) {
-					if ((e.stateMask & SWT.CTRL) > 0
-							|| (e.stateMask & SWT.ALT) > 0)
-						return;
-					if (editable) {
-						switch (e.keyCode) {
-						case SWT.ARROW_DOWN:
-						case SWT.ARROW_LEFT:
-						case SWT.ARROW_RIGHT:
-						case SWT.ARROW_UP:
-						case SWT.END:
-						case SWT.HOME:
-						case SWT.PAGE_DOWN:
-						case SWT.PAGE_UP:
-						case SWT.SHIFT:
-						case SWT.TAB:
-							break;
-						default:
-							checkModify();
-							break;
-						}
-					}
-				}
-			});
-		}
-
-		editor.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (debug) {
-					printDebugMessage("disposeListener"); //$NON-NLS-1$						
-				}
-				dispose();
-			}
-		});
-
-		listeners = new Hashtable<Listener, RichTextListener>();
-		modifyListeners = new ArrayList<ModifyListener>();
-	}
-
-	/**
-	 * Notifies the rich text event listeners.
-	 * 
-	 * @param eventType
-	 *            the event type
-	 * @param event
-	 *            the SWT event
-	 */
-	protected void notifyListeners(int eventType, Event event) {
-		if (notifyingModifyListeners) {
-			return;
-		}
-
-		if (listeners != null) {
-			event.display = Display.getCurrent();
-			event.widget = editor;
-
-			for (Iterator<RichTextListener> i = listeners.values().iterator(); i
-					.hasNext();) {
-				RichTextListener listener = i.next();
-				if (listener.getEventType() == eventType) {
-					if (debug) {
-						printDebugMessage(
-								"notifyListeners", "notifying listener, " + listener + ", eventType=" + eventType); //$NON-NLS-1$ //$NON-NLS-2$	//$NON-NLS-3$	
-					}
-					listener.getListener().handleEvent(event);
-					if (debug) {
-						printDebugMessage(
-								"notifyListeners", "notified listener, " + listener + ", eventType=" + eventType); //$NON-NLS-1$ //$NON-NLS-2$	//$NON-NLS-3$	
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Notifies the modify listeners that the rich text editor content has
-	 * changed.
-	 */
-	public void notifyModifyListeners() {
-		notifyingModifyListeners = true;
-
-		Event event = new Event();
-		event.display = Display.getCurrent();
-		event.widget = editor;
-
-		for (Iterator<ModifyListener> i = modifyListeners.iterator(); i
-				.hasNext();) {
-			ModifyListener listener = i.next();
-			if (debug) {
-				printDebugMessage(
-						"notifyModifyListeners", "notifying listener, " + listener); //$NON-NLS-1$ //$NON-NLS-2$	
-			}
-			listener.modifyText(new ModifyEvent(event));
-			if (debug) {
-				printDebugMessage(
-						"notifyModifyListeners", "notified listener, " + listener); //$NON-NLS-1$ //$NON-NLS-2$	
-			}
-		}
-
-		notifyingModifyListeners = false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.epf.richtext.IRichText#checkModify()
-	 */
-	public void checkModify() {
-		try {
-			if (!checkingModifyEvent) {
-				checkingModifyEvent = true;
-				if (modified) {
-					notifyModifyListeners();
-				} else {
-					if (!isIE && processingJSEvent) {
-						Display.getCurrent().asyncExec(new Runnable() {
-							public void run() {
-								if (!getText().equals(initialText)) {
-									modified = true;
-									notifyModifyListeners();
-								}
-							}
-						});
-					} else {
-						if (!getText().equals(initialText)) {
-							modified = true;
-							notifyModifyListeners();
-						}
-					}
-				}
-				if (debug) {
-					printDebugMessage("checkModify", "modified=" + modified); //$NON-NLS-1$ //$NON-NLS-2$	
-				}
-			}
-		} finally {
-			checkingModifyEvent = false;
-		}
-	}
-
-	/**
-	 * This provides an opportunity for a sub class to tidy up the rich text.
-	 * 
-	 * @param text
-	 *            rich text encoded in HTML format
-	 */
-	protected String tidyText(String text) {
-		return text;
-	}
-
-	/**
-	 * Formats the text for consumption by the JavaScript/DHTML editor.
-	 * 
-	 * @param text
-	 *            rich text encoded in HTML format
-	 */
-	protected String formatText(String text) {
-		if (text == null || text.length() == 0) {
-			return text;
-		}
-		StringBuffer result = new StringBuffer();
-		int textSize = text.length();
-		for (int i = 0; i < textSize; i++) {
-			char ch = text.charAt(i);
-			switch (ch) {
-			case '\r':
-				break;
-			case '\t':
-				result.append(' ');
-				break;
-			case '\n':
-				result.append(ENCODED_NEWLINE);
-				break;
-			case '\'':
-				result.append(ENCODED_SINGLE_QUOTE);
-				break;
-			case '\\':
-				result.append("\\\\"); //$NON-NLS-1$
-				break;
-			default:
-				result.append(ch);
-			}
-		}
-		return result.toString();
-	}
-
-	/**
-	 * Returns the child <code>OleControlSite</code> contained within the
-	 * given <code>Composite</code>.
-	 * 
-	 * @param composite
-	 *            a <code>Composite</code> object, presumably a
-	 *            <code>Browser</code>
-	 * @return an <code>OleControlSite</code> object
-	 */
-	protected Control getControlSite(Composite composite) {
-		if (Platform.getOS().equals("win32")) { //$NON-NLS-1$
-			Control[] controls = composite.getChildren();
-			for (int i = 0; i < controls.length; i++) {
-				String controlClass = controls[i].getClass().getName();
-				if (controlClass.equals("org.eclipse.swt.browser.WebSite")) { //$NON-NLS-1$
-					return controls[i];
-				} else if (controls[i] instanceof Composite) {
-					return getControlSite((Composite) controls[i]);
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Displays the given debug message to the console.
-	 */
-	protected void printDebugMessage(String method, String msg, String text) {
-		StringBuffer strBuf = new StringBuffer();
-		strBuf.append("RichText[").append(editor.handle).append(']') //$NON-NLS-1$
-				.append('.').append(method);
-		if (msg != null && msg.length() > 0) {
-			strBuf.append(": ").append(msg); //$NON-NLS-1$
-		}
-		if (text != null && text.length() > 0) {
-			strBuf.append('\n').append(text);
-		}
-		System.out.println(strBuf);
-	}
-
-	/**
-	 * Displays the given debug message to the console.
-	 */
-	protected void printDebugMessage(String method, String msg) {
-		printDebugMessage(method, msg, null);
-	}
-
-	/**
-	 * Displays the given debug message to the console.
-	 */
-	protected void printDebugMessage(String method) {
-		printDebugMessage(method, null);
-	}
-
-	public FindReplaceAction getFindReplaceAction() {
-		return findReplaceAction;
-	}
-
-	public void setFindReplaceAction(FindReplaceAction findReplaceAction) {
-		if (findReplaceAction != null) {
-			if (this.findReplaceAction != null
-					&& this.findReplaceAction != findReplaceAction) {
-				this.findReplaceAction.dispose();
-			}
-			this.findReplaceAction = findReplaceAction;
-			this.findReplaceAction.setRichText(this);
-		}
-	}
-
-	public void setInitialText(String text) {
-		setText(text);
-		initialText = text == null ? "" : text; //$NON-NLS-1$
-		modified = false;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextCommand.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextCommand.java
deleted file mode 100644
index 769f7fa..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextCommand.java
+++ /dev/null
@@ -1,257 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-/**
- * Defines the editing commands supported by the default rich text control and
- * editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextCommand {
-
-	/**
-	 * Adds a HTML fragment.
-	 */
-	public static final String ADD_HTML = "addHTML"; //$NON-NLS-1$	
-
-	/**
-	 * Adds an image.
-	 */
-	public static final String ADD_IMAGE = "addImage"; //$NON-NLS-1$
-
-	/**
-	 * Adds a horizontal line.
-	 */
-	public static final String ADD_LINE = "addLine"; //$NON-NLS-1$
-
-	/**
-	 * Adds a link.
-	 */
-	public static final String ADD_LINK = "addLink"; //$NON-NLS-1$
-
-	/**
-	 * Inserts text over the current selection.
-	 */
-	public static final String INSERT_TEXT = "insertText"; //$NON-NLS-1$
-
-	/**
-	 * Adds an ordered list.
-	 */
-	public static final String ADD_ORDERED_LIST = "addOrderedList"; //$NON-NLS-1$
-
-	/**
-	 * Adds a table.
-	 */
-	public static final String ADD_TABLE = "addTable"; //$NON-NLS-1$
-
-	/**
-	 * Adds an unordered list.
-	 */
-	public static final String ADD_UNORDERED_LIST = "addUnorderedList"; //$NON-NLS-1$
-
-	/**
-	 * Sets the background color of the selected text.
-	 */
-	public static final String BACKGROUND_COLOR = "backColor"; //$NON-NLS-1$
-
-	/**
-	 * Toggles the 'bold' attribute of the selected text.
-	 */
-	public static final String BOLD = "bold"; //$NON-NLS-1$
-
-	/**
-	 * Clears the rich text content.
-	 */
-	public static final String CLEAR_CONTENT = "clearContent"; //$NON-NLS-1$
-
-	/**
-	 * Copies the selected text to the clipboard.
-	 */
-	public static final String COPY = "copy"; //$NON-NLS-1$
-
-	/**
-	 * Cuts the selected text to the clipboard.
-	 */
-	public static final String CUT = "cut"; //$NON-NLS-1$
-
-	/**
-	 * Deletes the selected text.
-	 */
-	public static final String DELETE = "deleteText"; //$NON-NLS-1$
-
-	/**
-	 * Finds text.
-	 */
-	public static final String FIND_TEXT = "findText"; //$NON-NLS-1$
-
-	/**
-	 * Gets the HTML source.
-	 */
-	public static final String GET_TEXT = "getText"; //$NON-NLS-1$	
-
-	/**
-	 * Sets the foreground color of the selected text.
-	 */
-	public static final String FORGROUND_COLOR = "foreColor"; //$NON-NLS-1$
-
-	/**
-	 * Formats the selected text.
-	 */
-	public static final String FORMAT_BLOCK = "formatBlock"; //$NON-NLS-1$
-
-	/**
-	 * Returns the selected text.
-	 */
-	public static final String GET_SELECTED_TEXT = "getSelectedText"; //$NON-NLS-1$
-
-	/**
-	 * Indents the selected text.
-	 */
-	public static final String INDENT = "indent"; //$NON-NLS-1$
-
-	/**
-	 * Toggles the 'italic' attribute of the selected text.
-	 */
-	public static final String ITALIC = "italic"; //$NON-NLS-1$
-
-	/**
-	 * Center justifies the selected text.
-	 */
-	public static final String JUSTIFY_CENTER = "justifyCenter"; //$NON-NLS-1$
-
-	/**
-	 * Fully justifies the selected text.
-	 */
-	public static final String JUSTIFY_FULL = "justifyFull"; //$NON-NLS-1$
-
-	/**
-	 * Left justifies the selected text.
-	 */
-	public static final String JUSTIFY_LEFT = "justifyLeft"; //$NON-NLS-1$
-
-	/**
-	 * Right justifies the selected text.
-	 */
-	public static final String JUSTIFY_RIGHT = "justifyRight"; //$NON-NLS-1$
-
-	/**
-	 * Outdents the selected text.
-	 */
-	public static final String OUTDENT = "outdent"; //$NON-NLS-1$
-
-	/**
-	 * Pastes text from the clipboard.
-	 */
-	public static final String PASTE = "paste"; //$NON-NLS-1$
-
-	/**
-	 * Replaces all text.
-	 */
-	public static final String REPLACE_ALL_TEXT = "replaceAllText"; //$NON-NLS-1$		
-
-	/**
-	 * Replaces the selected text.
-	 */
-	public static final String REPLACE_TEXT = "replaceText"; //$NON-NLS-1$		
-
-	/**
-	 * Redoes the previous command.
-	 */
-	public static final String REDO = "redo"; //$NON-NLS-1$
-
-	/**
-	 * Removes the current formatting of the selected text.
-	 */
-	public static final String REMOVE_FORMAT = "removeFormat"; //$NON-NLS-1$
-
-	/**
-	 * Saves the editor
-	 */
-	public static final String SAVE = "save"; //$NON-NLS-1$
-
-	/**
-	 * Saves all editors
-	 */
-	public static final String SAVE_ALL = "saveAll"; //$NON-NLS-1$
-
-	/**
-	 * Selects all text.
-	 */
-	public static final String SELECT_ALL = "selectAll"; //$NON-NLS-1$
-
-	/**
-	 * Sets the font name for the selected text.
-	 */
-	public static final String SET_FONT_NAME = "setFontName"; //$NON-NLS-1$
-
-	/**
-	 * Sets the font size for the selected text.
-	 */
-	public static final String SET_FONT_SIZE = "setFontSize"; //$NON-NLS-1$
-
-	/**
-	 * Sets the font style for the selected text.
-	 */
-	public static final String SET_FONT_STYLE = "setFontStyle"; //$NON-NLS-1$
-
-	/**
-	 * Sets whether the content can be edited.
-	 */
-	public static final String SET_EDITABLE = "setEditable"; //$NON-NLS-1$
-
-	/**
-	 * Sets focus to this control.
-	 */
-	public static final String SET_FOCUS = "setFocus"; //$NON-NLS-1$
-
-	/**
-	 * Sets the height of this control.
-	 */
-	public static final String SET_HEIGHT = "setHeight"; //$NON-NLS-1$
-
-	/**
-	 * Sets the HTML source.
-	 */
-	public static final String SET_TEXT = "setText"; //$NON-NLS-1$
-
-	/**
-	 * Toggles the 'strike-through' attribute of the selected text.
-	 */
-	public static final String STRIKE_THROUGH = "strikeThrough"; //$NON-NLS-1$
-
-	/**
-	 * Toggles the subscript attribute of the selected text.
-	 */
-	public static final String SUBSCRIPT = "subscript"; //$NON-NLS-1$
-
-	/**
-	 * Toggles the superscript attribute of the selected text.
-	 */
-	public static final String SUPERSCRIPT = "superscript"; //$NON-NLS-1$
-
-	/**
-	 * Toggles the underline attribute of the selected text.
-	 */
-	public static final String UNDERLINE = "underline"; //$NON-NLS-1$
-
-	/**
-	 * Undoes the previous command.
-	 */
-	public static final String UNDO = "undo"; //$NON-NLS-1$
-
-	/**
-	 * Converts a link to normal text.
-	 */
-	public static final String UNLINK = "unlink"; //$NON-NLS-1$
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextEditor.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextEditor.java
deleted file mode 100644
index f2dae41..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextEditor.java
+++ /dev/null
@@ -1,1543 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.ParameterizedCommand;
-import org.eclipse.core.commands.operations.IUndoContext;
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.richtext.actions.CopyAction;
-import org.eclipse.epf.richtext.actions.CutAction;
-import org.eclipse.epf.richtext.actions.FindReplaceAction;
-import org.eclipse.epf.richtext.actions.PasteAction;
-import org.eclipse.epf.richtext.actions.PastePlainTextAction;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.bindings.keys.SWTKeySupport;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.ITextViewerExtension;
-import org.eclipse.jface.text.ITextViewerExtension6;
-import org.eclipse.jface.text.IUndoManager;
-import org.eclipse.jface.text.IUndoManagerExtension;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.text.TextViewerUndoManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.custom.VerifyKeyListener;
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.HTMLTransfer;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.HelpListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.events.MenuListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.keys.IBindingService;
-import org.eclipse.ui.operations.OperationHistoryActionHandler;
-import org.eclipse.ui.operations.RedoActionHandler;
-import org.eclipse.ui.operations.UndoActionHandler;
-import org.eclipse.ui.texteditor.IAbstractTextEditorHelpContextIds;
-import org.eclipse.ui.texteditor.IReadOnlyDependent;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.ui.texteditor.IUpdate;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * The default rich text editor implementation.
- * <p>
- * The default rich text editor uses XHTML as the underlying markup language for
- * the rich text content. It is implemented using a <code>ViewForm</code>
- * control with a tool bar at the top, a tab folder that contains a
- * <code>RichText</code> control for entering the rich text content, and a tab
- * foler that contains a <code>StyleText</code> control for viewing and
- * modifying the XHTML representation of the rich text content.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class RichTextEditor implements IRichTextEditor {
-
-	// The HTML tab name.
-	protected static final String HTML_TAB_NAME = RichTextResources.htmlTab_text;
-
-	// If true, log debugging info.
-	protected boolean debug;
-
-	// The plug-in logger.
-	protected Logger logger;
-
-	// The base path used for resolving links (<href>, <img>, etc.).
-	protected String basePath;
-
-	// The editor form.
-	protected ViewForm form;
-
-	// The editor tool bar.
-	protected IRichTextToolBar toolBar;
-
-	// The editor content.
-	protected Composite content;
-
-	// The editor tab folder.
-	protected CTabFolder tabFolder;
-
-	// The rich text tab
-	protected CTabItem richTextTab;
-
-	// The HTML source tab
-	protected CTabItem htmlTab;
-
-	// The embedded rich text control.
-	protected IRichText richText;
-
-	// The underlying HTML text editor.
-	protected TextViewer sourceViewer;
-	
-	protected IDocument currentDoc;
-	
-	// Drop support
-	protected DropTarget sourceEditDropTarget;
-
-	// HTML editor's context menu
-	protected Menu contextMenu;
-
-	// Has the HTML source been modified?
-	protected boolean sourceModified = false;
-
-	// The editor's editable flag.
-	protected boolean editable = true;
-	
-	private OperationHistoryActionHandler undoAction;
-	
-	private OperationHistoryActionHandler redoAction;
-	
-	private IEditorSite editorSite;
-
-	/** The actions registered with the editor. */
-	private Map<String, IAction> fActions= new HashMap<String, IAction>(10);
-	
-	/** The verify key listener for activation code triggering. */
-	private ActivationCodeTrigger fActivationCodeTrigger= new ActivationCodeTrigger();
-	
-	/** The editor's action activation codes. */
-	private List fActivationCodes= new ArrayList(2);
-	
-	final IUndoManager undoManager= new TextViewerUndoManager(10);
-	
-	/**
-	 * The key binding scopes of this editor.
-	 * @since 2.1
-	 */
-	private String[] fKeyBindingScopes;
-
-	
-	protected IDocumentListener sourceEditDocumentListener= new IDocumentListener() {
-		public void documentAboutToBeChanged(DocumentEvent event) {
-		}
-		public void documentChanged(DocumentEvent event) {
-			sourceModified = true;
-			if (richText != null && richText instanceof RichText) {
-				richText.notifyModifyListeners();
-			}
-		}
-	};
-
-
-	// The deactivate listener for the sourceEdit control.
-	protected Listener sourceEditDeactivateListener = new Listener() {
-		public void handleEvent(Event event) {
-			if (sourceModified) {
-				updateRichText(sourceViewer.getTextWidget().getText());
-				setModified(true);
-				sourceModified = false;
-			}
-		}
-	};
-
-	// The key listener for the sourceEdit control.
-	protected KeyListener sourceEditKeyListener = new KeyListener() {
-		public void keyPressed(KeyEvent e) {
-			Object adapter = PlatformUI.getWorkbench().getAdapter(
-					IBindingService.class);
-			if (adapter != null && adapter instanceof IBindingService) {
-				int accel = SWTKeySupport
-						.convertEventToUnmodifiedAccelerator(e);
-				KeyStroke stroke = SWTKeySupport
-						.convertAcceleratorToKeyStroke(accel);
-				KeySequence seq = KeySequence.getInstance(stroke);
-				Binding bind = ((IBindingService) adapter).getPerfectMatch(seq);
-				if (bind != null) {
-					ParameterizedCommand command = bind
-							.getParameterizedCommand();
-					if (command != null) {
-						String cmdId = command.getId();
-						if (cmdId != null
-								&& cmdId
-										.equals("org.eclipse.ui.edit.findReplace")) { //$NON-NLS-1$
-							richText.getFindReplaceAction().execute(RichTextEditor.this);
-						}
-					}
-				}
-			}
-		}
-
-		public void keyReleased(KeyEvent e) {
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the editor style
-	 */
-	public RichTextEditor(Composite parent, int style, IEditorSite editorSite) {
-		this(parent, style, editorSite, null);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the editor style
-	 * @param basePath
-	 *            the base path used for resolving links
-	 */
-	public RichTextEditor(Composite parent, int style, IEditorSite editorSite, String basePath) {
-		this.basePath = basePath;
-		this.editorSite = editorSite;
-		debug = RichTextPlugin.getDefault().isDebugging();
-		logger = RichTextPlugin.getDefault().getLogger();
-		init(parent, style);
-	}
-
-	/**
-	 * Initializes this editor.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the editor style
-	 */
-	protected void init(Composite parent, int style) {
-		try {
-			form = new ViewForm(parent, style);
-			form.marginHeight = 0;
-			form.marginWidth = 0;
-
-			toolBar = new RichTextToolBar(form, SWT.FLAT, this);
-
-			content = new Composite(form, SWT.FLAT);
-			GridLayout layout = new GridLayout();
-			layout.marginHeight = 0;
-			layout.marginWidth = 0;
-			content.setLayout(layout);
-
-			tabFolder = createEditorTabFolder(content, style);
-
-			form.setTopCenter(((RichTextToolBar)toolBar).getToolbarMgr().getControl());
-			form.setTopLeft(((RichTextToolBar)toolBar).getToolbarMgrCombo().getControl());
-			form.setContent(content);
-		} catch (Exception e) {
-			logger.logError(e);
-		}
-	}
-
-	/**
-	 * Returns the form control.
-	 * 
-	 * @return the form control
-	 */
-	public Control getControl() {
-		return form;
-	}
-
-	/**
-	 * Returns the rich text control embedded within this editor.
-	 */
-	public IRichText getRichTextControl() {
-		return richText;
-	}
-
-	/**
-	 * Sets the layout data.
-	 * 
-	 * @param layoutData
-	 *            the layout data to set
-	 */
-	public void setLayoutData(Object layoutData) {
-		if (form != null) {
-			form.setLayoutData(layoutData);
-		}
-	}
-
-	/**
-	 * Returns the layout data.
-	 * 
-	 * @return the editor's layout data
-	 */
-	public Object getLayoutData() {
-		if (form != null) {
-			return form.getLayoutData();
-		}
-		return null;
-	}
-
-	/**
-	 * Sets focus to this editor.
-	 */
-	public void setFocus() {
-		if (richText != null) {
-			richText.setFocus();
-		}
-		setSelection(0);
-		if (toolBar != null && tabFolder != null) {
-			toolBar.updateToolBar(editable);
-		}
-
-	}
-
-	/**
-	 * Tells the control it does not have focus.
-	 */
-	public void setBlur() {
-		if (richText != null) {
-			richText.setBlur();
-		}
-	}
-	
-	/**
-	 * Checks whether this editor has focus.
-	 * 
-	 * @return <code>true</code> if this editor has the user-interface focus
-	 */
-	public boolean hasFocus() {
-		if (richText != null) {
-			return richText.hasFocus();
-		}
-		return false;
-	}
-
-	/**
-	 * Selects the Rich Text or HTML tab.
-	 * 
-	 * @param index
-	 *            <code>0</code> for the Rich Text tab, <code>1</code> for
-	 *            the HTML tab.
-	 */
-	public void setSelection(int index) {
-		if (tabFolder != null) {
-			tabFolder.setSelection(index);
-		}
-	}
-
-	/**
-	 * Returns the base path used for resolving text and image links.
-	 * 
-	 * @return the base path used for resolving links specified with <href>,
-	 *         <img>, etc.
-	 */
-	public String getBasePath() {
-		return basePath;
-	}
-
-	/**
-	 * Returns the base URL of the rich text control whose content was last
-	 * copied to the clipboard.
-	 * 
-	 * @return the base URL of a rich text control
-	 */
-	public URL getCopyURL() {
-		if (richText != null) {
-			return richText.getCopyURL();
-		}
-		return null;
-	}
-
-	/**
-	 * Sets the base URL of the rich text control whose content was last copied
-	 * to the clipboard.
-	 */
-	public void setCopyURL() {
-		if (richText != null) {
-			richText.setCopyURL();
-		}
-	}
-
-	/**
-	 * Returns the editable state.
-	 * 
-	 * @return <code>true</code> if the content can be edited
-	 */
-	public boolean getEditable() {
-		return editable;
-	}
-
-	/**
-	 * Sets the editable state.
-	 * 
-	 * @param editable
-	 *            the editable state
-	 */
-	public void setEditable(boolean editable) {
-		this.editable = editable;
-		if (toolBar != null && tabFolder != null) {
-			toolBar.updateToolBar(editable);
-		}
-		if (richText != null) {
-			richText.setEditable(editable);
-		}
-		if (sourceViewer != null) {
-			sourceViewer.setEditable(editable);
-		}
-	}
-
-	/**
-	 * Checks whether the content has been modified.
-	 * 
-	 * @return <code>true</code> if the content has been modified
-	 */
-	public boolean getModified() {
-		if (richText != null) {
-			return richText.getModified();
-		}
-		return false;
-	}
-
-	/**
-	 * Sets the modified state.
-	 * 
-	 * @param modified
-	 *            the modified state
-	 */
-	public void setModified(boolean modified) {
-		if (richText != null) {
-			richText.setModified(modified);
-		}
-	}
-
-	/**
-	 * Returns the rich text content.
-	 * 
-	 * @return the rich text content formatted in XHTML
-	 */
-	public String getText() {
-		if (sourceModified) {
-			setText(getSourceEdit().getText());
-			setModified(true);
-			sourceModified = false;
-		}
-		if (richText != null) {
-			return richText.getText();
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Sets the rich text content.
-	 * 
-	 * @param text
-	 *            the rich text content in XHTML format
-	 */
-	public void setText(String text) {
-		if (richText != null) {
-			richText.setText(text);
-		}
-		sourceModified = false;
-		if (tabFolder != null) {
-			if (toolBar != null) {
-				toolBar.updateToolBar(editable);
-			}
-			if (getSourceEdit() != null) {
-				removeModifyListeners();
-				currentDoc.set(text);
-				addModifyListeners();
-			}
-		}
-	}
-	
-	protected void addModifyListeners() {
-		if (currentDoc != null) {
-			currentDoc.addDocumentListener(sourceEditDocumentListener);
-		}
-	}
-
-	protected void removeModifyListeners() {
-		if (currentDoc != null) {
-			currentDoc.removeDocumentListener(sourceEditDocumentListener);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.richtext.IRichText#checkModify()
-	 */
-	public void checkModify() {
-		richText.checkModify();
-		if (sourceModified) {
-			notifyModifyListeners();
-		}
-		if (debug) {
-			printDebugMessage("checkModify", "modified=" + sourceModified); //$NON-NLS-1$ //$NON-NLS-2$	
-		}
-	}
-
-	/**
-	 * Restores the rich text content back to the initial value.
-	 */
-	public void restoreText() {
-		if (richText != null) {
-			richText.restoreText();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.epf.richtext.IRichText#getSelected()
-	 */
-	public RichTextSelection getSelected() {
-		if (tabFolder.getSelection() == htmlTab) {
-			String HTMLsource = getSourceEdit().getText();
-			Point sel = sourceViewer.getSelectedRange();
-			int selStartIndex = sel.x;
-			int selEndIndex = sel.x + sel.y - 1;
-			richText.getSelected().clear();
-			richText.getSelected().setText(HTMLsource.substring(selStartIndex, selEndIndex + 1));
-		}
-		return richText.getSelected();
-	}
-
-	/**
-	 * Returns an application specific property value.
-	 * 
-	 * @param key
-	 *            the name of the property
-	 * @return the value of the property or <code>null</code> if it has not
-	 *         been set
-	 */
-	public Object getData(String key) {
-		if (richText != null) {
-			richText.getData(key);
-		}
-		return null;
-	}
-
-	/**
-	 * Sets an application specific property name and value.
-	 * 
-	 * @param key
-	 *            the name of the property
-	 * @param value
-	 *            the new value for the property
-	 */
-	public void setData(String key, Object value) {
-		if (richText != null) {
-			richText.setData(key, value);
-		}
-	}
-
-	/**
-	 * Executes the given rich text command. The supported command strings are
-	 * defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command) {
-		if (richText != null) {
-			return richText.executeCommand(command);
-		}
-		return 0;
-	}
-
-	/**
-	 * Executes the given rich text command with a single parameter. The
-	 * supported command strings are defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @param	param		a parameter for the command or <code>null</code>
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command, String param) {
-		if (richText != null) {
-			return richText.executeCommand(command, param);
-		}
-		return 0;
-	}
-
-	/**
-	 * Executes the given rich text command with an array of parameters. The
-	 * supported command strings are defined in <code>RichTextCommand<code>.
-	 * 
-	 * @param	command		a rich text command string
-	 * @param	params		an array of parameters for the command or <code>null</code>
-	 * @return	a status code returned by the executed command
-	 */
-	public int executeCommand(String command, String[] params) {
-		if (richText != null) {
-			return richText.executeCommand(command, params);
-		}
-		return 0;
-	}
-
-	/**
-	 * Disposes the operating system resources allocated by this editor.
-	 */
-	public void dispose() {
-		if (contextMenu != null && !contextMenu.isDisposed()) {
-			contextMenu.dispose();
-			contextMenu = null;
-		}
-		if (sourceEditDropTarget != null) {
-			sourceEditDropTarget.dispose();
-			sourceEditDropTarget = null;
-		}
-		if (fActivationCodeTrigger != null) {
-			fActivationCodeTrigger.uninstall();
-			fActivationCodeTrigger= null;
-		}
-		removeModifyListeners();
-		if (getSourceEdit() != null) {
-			getSourceEdit().removeListener(SWT.Deactivate,
-					sourceEditDeactivateListener);
-			getSourceEdit().removeKeyListener(sourceEditKeyListener);
-			sourceEditDeactivateListener = null;
-			sourceEditKeyListener = null;
-		}
-		
-		if (sourceViewer != null) {
-			sourceViewer= null;
-		}
-
-		if (fActions != null) {
-			fActions.clear();
-			fActions= null;
-		}
-		if (fActivationCodes != null) {
-			fActivationCodes.clear();
-			fActivationCodes= null;
-		}
-
-		if (richText != null) {
-			richText.dispose();
-			richText = null;
-		}
-	}
-
-	/**
-	 * Checks whether this control has been disposed.
-	 * 
-	 * @return <code>true</code> if this control is disposed successfully
-	 */
-	public boolean isDisposed() {
-		if (richText != null) {
-			return richText.isDisposed();
-		}
-		return true;
-	}
-
-	/**
-	 * Returns the modify listeners attached to this editor.
-	 * 
-	 * @return an iterator for retrieving the modify listeners
-	 */
-	public Iterator<ModifyListener> getModifyListeners() {
-		if (richText != null) {
-			richText.getModifyListeners();
-		}
-		return null;
-	}
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * keys are pressed and released within this editor.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addKeyListener(KeyListener listener) {
-		if (richText != null) {
-			richText.addKeyListener(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when keys are pressed and released within this editor.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeKeyListener(KeyListener listener) {
-		if (richText != null) {
-			richText.removeKeyListener(listener);
-		}
-	}
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * the content of this editor is modified.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addModifyListener(ModifyListener listener) {
-		if (richText != null) {
-			richText.addModifyListener(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when the content of this editor is modified.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeModifyListener(ModifyListener listener) {
-		if (richText != null) {
-			richText.removeModifyListener(listener);
-		}
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notifed when
-	 * this editor is disposed.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addDisposeListener(DisposeListener listener) {
-		if (richText != null) {
-			richText.addDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when this editor is disposed.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeDisposeListener(DisposeListener listener) {
-		if (richText != null) {
-			richText.removeDisposeListener(listener);
-		}
-	}
-
-	/**
-	 * Adds a listener to the collection of listeners who will be notified when
-	 * help events are generated for this editor.
-	 * 
-	 * @param listener
-	 *            the listener which should be notified
-	 */
-	public void addHelpListener(HelpListener listener) {
-		if (richText != null) {
-			richText.addHelpListener(listener);
-		}
-	}
-
-	/**
-	 * Removes a listener from the collection of listeners who will be notified
-	 * when help events are generated for this editor.
-	 * 
-	 * @param listener
-	 *            the listener which should no longer be notified
-	 */
-	public void removeHelpListener(HelpListener listener) {
-		if (richText != null) {
-			richText.removeHelpListener(listener);
-		}
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notifed when
-	 * an event of the given type occurs within this editor.
-	 * 
-	 * @param eventType
-	 *            the type of event to listen for
-	 * @param listener
-	 *            the listener which should be notified when the event occurs
-	 */
-	public void addListener(int eventType, Listener listener) {
-		if (richText != null) {
-			richText.addListener(eventType, listener);
-		}
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be notifed
-	 * when an event of the given type occurs within this editor.
-	 * 
-	 * @param eventType
-	 *            the type of event to listen for
-	 * @param listener
-	 *            the listener which should no longer be notified when the event
-	 *            occurs
-	 */
-	public void removeListener(int eventType, Listener listener) {
-		if (richText != null) {
-			richText.removeListener(eventType, listener);
-		}
-	}
-
-	/**
-	 * Returns the event listeners attached to this editor.
-	 * 
-	 * @return an iterator for retrieving the event listeners attached to this
-	 *         editor
-	 */
-	public Iterator<RichTextListener> getListeners() {
-		if (richText != null) {
-			return richText.getListeners();
-		}
-		return null;
-	}
-
-	/**
-	 * Notifies the modify listeners that the rich text editor content has
-	 * changed.
-	 */
-	public void notifyModifyListeners() {
-		if (richText != null) {
-			Event event = new Event();
-			event.display = Display.getCurrent();
-			event.widget = richText.getControl();
-
-			for (Iterator<ModifyListener> i = getModifyListeners(); i != null && i.hasNext();) {
-				ModifyListener listener = i.next();
-				listener.modifyText(new ModifyEvent(event));
-			}
-		}
-	}
-
-	/**
-	 * Fills the tool bar with action items.
-	 * 
-	 * @param toolBar
-	 *            a tool bar contain rich text actions
-	 */
-	public void fillToolBar(IRichTextToolBar toolBar) {
-	}
-
-	/**
-	 * Creates the underlying rich text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the style for the control
-	 * @param basePath
-	 *            the path used for resolving links
-	 */
-	protected IRichText createRichTextControl(Composite parent, int style,
-			String basePath) {
-		return new RichText(parent, style, basePath);
-	}
-
-	/**
-	 * Creates the editor tab folder.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the style for the control
-	 * @return a new editor toolbar
-	 */
-	protected CTabFolder createEditorTabFolder(Composite parent, int style) {
-		CTabFolder folder = new CTabFolder(parent, SWT.FLAT | SWT.BOTTOM);
-		folder.setLayout(new GridLayout(1, true));
-		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Composite richTextComposite = new Composite(folder, SWT.FLAT);
-		GridLayout richTextCompositeLayout = new GridLayout(1, false);
-		richTextCompositeLayout.marginHeight = 0;
-		richTextCompositeLayout.marginWidth = 0;
-		richTextComposite.setLayout(richTextCompositeLayout);
-		richTextComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		richText = createRichTextControl(richTextComposite, style, basePath);
-		richText.setData(PROPERTY_NAME, this);
-		richText.getFindReplaceAction().setRichText(this);
-
-		richTextTab = new CTabItem(folder, SWT.FLAT);
-		richTextTab.setText(RichTextResources.richTextTab_text);
-		richTextTab.setToolTipText(RichTextResources.richTextTab_toolTipText);
-		richTextTab.setControl(richTextComposite);
-
-		Composite htmlComposite = new Composite(folder, SWT.FLAT);
-		htmlComposite.setLayout(new FillLayout());
-
-		sourceViewer = new TextViewer(htmlComposite, SWT.FLAT | SWT.MULTI
-				| SWT.WRAP | SWT.V_SCROLL);
-		sourceViewer.setUndoManager(undoManager);
-		setDocument(null);
-		addModifyListeners();
-		getSourceEdit().addListener(SWT.Deactivate, sourceEditDeactivateListener);
-		getSourceEdit().addKeyListener(sourceEditKeyListener);
-		contextMenu = new Menu(parent.getShell(), SWT.POP_UP);
-		getSourceEdit().setMenu(contextMenu);
-		// FIXME! This opens up a can of worms, especially with DBCS characters.
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=179432. 
-		//addDropSupportToStyledText();
-		fillContextMenu(contextMenu);
-		
-		
-		htmlTab = new CTabItem(folder, SWT.NONE);
-		htmlTab.setText(HTML_TAB_NAME);
-		htmlTab.setToolTipText(RichTextResources.htmlTab_toolTipText); 
-		htmlTab.setControl(htmlComposite);
-
-		folder.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				CTabItem item = (CTabItem) event.item;
-				if (item.getText().equals(HTML_TAB_NAME)) {
-					removeModifyListeners();
-					currentDoc.set(getText());
-					sourceModified = false;
-					addModifyListeners();
-					if (toolBar != null) {
-						toolBar.updateToolBar(editable);
-					}
-				} else {
-					updateRichText(getSourceEdit().getText());
-					setModified(true);
-					if (toolBar != null) {
-						toolBar.updateToolBar(editable);
-					}
-				}
-			}
-		});
-		fillToolBar(toolBar);
-		
-		initializeActivationCodeTrigger();
-		createActions();
-		
-		folder.setSelection(0);
-
-		return folder;
-	}
-
-	
-	private void setDocument(IDocument doc) {
-		if (doc == null) {
-			doc = new Document();
-		}
-		// clean up old doc
-		undoManager.disconnect();
-		IDocument oldDoc = sourceViewer.getDocument();
-		if (oldDoc != null) {
-			oldDoc.removeDocumentListener(sourceEditDocumentListener);
-		}
-
-		// hook up new doc
-		currentDoc = doc;
-		sourceViewer.setDocument(currentDoc);
-		currentDoc.addDocumentListener(sourceEditDocumentListener);
-		undoManager.connect(sourceViewer);
-		if (undoAction != null) {
-			undoAction.setContext(getUndoContext());
-		}
-		if (redoAction != null) {
-			redoAction.setContext(getUndoContext());
-		}
-	}
-	
-	/**
-	 * Returns the HTML source edit control.
-	 * 
-	 * @return a <code>StyleText</code> object.
-	 */
-	public StyledText getSourceEdit() {
-		if (sourceViewer != null) {
-			return sourceViewer.getTextWidget();
-		}
-		return null;
-	}
-
-	/**
-	 * Inserts text at the selection (overwriting the selection).
-	 */
-	public void addHTML(String text) {
-		if (text == null || text.length() == 0) 
-			return;
-		if (tabFolder.getSelection() == richTextTab) {
-			executeCommand(RichTextCommand.ADD_HTML, text);
-		} else if (tabFolder.getSelection() == htmlTab) {
-			String oldHTML = getSourceEdit().getText();
-			Point sel = sourceViewer.getSelectedRange();
-			int selStartIndex = sel.x;
-			int selEndIndex = sel.x + sel.y - 1;
-			String newHTML = oldHTML.substring(0, selStartIndex) + text
-					+ oldHTML.substring(selEndIndex + 1);
-			removeModifyListeners();
-			currentDoc.set(newHTML);
-			addModifyListeners();
-			updateRichText(newHTML);
-		}
-	}
-
-	
-	/**
-	 * Inserts an image at the selection (overwriting the selection).
-	 */
-	public void addImage(String imageURL, String height, String width, String altTag) {
-		if (tabFolder.getSelection() == richTextTab) {
-			executeCommand(
-					RichTextCommand.ADD_IMAGE,
-					new String[] {
-							imageURL,
-							height, width, altTag });
-		} else if (tabFolder.getSelection() == htmlTab) {
-			StringBuffer imageLink = new StringBuffer();
-			// order of these attributes is the same as JTidy'ed HTML
-			imageLink.append("<img"); //$NON-NLS-1$
-			if (height.length() > 0) {
-				imageLink.append(" height=\"" + height + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (altTag.length() > 0) {
-				imageLink.append(" alt=\"" + altTag + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			imageLink.append(" src=\"" + imageURL + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-			if (width.length() > 0) {
-				imageLink.append(" width=\"" + width + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			imageLink.append(" />"); //$NON-NLS-1$
-			String oldHTML = getSourceEdit().getText();
-			Point sel = sourceViewer.getSelectedRange();
-			int selStartIndex = sel.x;
-			int selEndIndex = sel.x + sel.y - 1;
-			String newHTML = oldHTML.substring(0, selStartIndex) + imageLink.toString()
-					+ oldHTML.substring(selEndIndex + 1);
-			removeModifyListeners();
-			currentDoc.set(newHTML);
-			addModifyListeners();
-			updateRichText(newHTML);
-		}
-	}
-
-	/**
-	 * Checks whether the HTML tab is selected.
-	 * 
-	 * @return <code>true</code> if the HTML tab is selected.
-	 */
-	public boolean isHTMLTabSelected() {
-		return (tabFolder.getSelection() == htmlTab);
-	}
-
-	/**
-	 * Fills the context menu with menu items.
-	 * 
-	 * @param contextMenu
-	 *            a context menu containing rich text actions
-	 */
-	protected void fillContextMenu(Menu contextMenu) {
-		final MenuItem cutItem = new MenuItem(contextMenu, SWT.PUSH);
-		cutItem.setText(RichTextResources.cutAction_text);
-		cutItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				CutAction action = new CutAction(RichTextEditor.this);
-				action.execute(RichTextEditor.this);
-			}
-		});
-		final MenuItem copyItem = new MenuItem(contextMenu, SWT.PUSH);
-		copyItem.setText(RichTextResources.copyAction_text); 
-		copyItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				CopyAction action = new CopyAction(RichTextEditor.this);
-				action.execute(RichTextEditor.this);
-			}
-		});
-		final MenuItem pasteItem = new MenuItem(contextMenu, SWT.PUSH);
-		pasteItem.setText(RichTextResources.pasteAction_text); 
-		pasteItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				PasteAction action = new PasteAction(RichTextEditor.this);
-				action.execute(RichTextEditor.this);
-			}
-		});
-		
-		final MenuItem pastePlainTextItem = new MenuItem(contextMenu, SWT.PUSH);
-		pastePlainTextItem.setText(RichTextResources.pastePlainTextAction_text);
-		pastePlainTextItem.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				PastePlainTextAction action = new PastePlainTextAction(RichTextEditor.this);
-				action.execute(RichTextEditor.this);
-			}
-		});
-
-		contextMenu.addMenuListener(new MenuListener() {
-			public void menuHidden(MenuEvent e) {
-			}
-
-			public void menuShown(MenuEvent e) {
-				String selectedText = getSelected().getText();
-				boolean selection = selectedText.length() > 0;
-				cutItem.setEnabled(editable && selection);
-				copyItem.setEnabled(selection);
-				pasteItem.setEnabled(editable);
-				pastePlainTextItem.setEnabled(editable);
-			}
-		});
-	}
-
-	/**
-	 * Updates the content of the rich text control without updating the HTML
-	 * source editor.
-	 * <p>
-	 * This method should be called by the HTML source editor to sync up its
-	 * content with the rich text control.
-	 * 
-	 * @param text
-	 *            the rich text content in XHTML format
-	 */
-	private void updateRichText(String text) {
-		if (richText != null) {
-			richText.setText(text);
-			richText.checkModify();
-		}
-		sourceModified = false;
-		if (tabFolder != null) {
-			if (toolBar != null) {
-				toolBar.updateToolBar(editable);
-			}
-		}
-	}
-	
-	private void addDropSupportToStyledText() {
-		// this function based heavily on the example at:
-		// http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html
-		
-		 	// Allow data to be copied to the drop target
-			int operations = DND.DROP_MOVE |  DND.DROP_COPY | DND.DROP_DEFAULT;
-			sourceEditDropTarget = new DropTarget(getSourceEdit(), operations);
-		 
-			// Receive data in Text or HTML format
-			final TextTransfer textTransfer = TextTransfer.getInstance();
-			final HTMLTransfer htmlTransfer = HTMLTransfer.getInstance();
-			Transfer[] types = new Transfer[] {htmlTransfer, textTransfer};
-			sourceEditDropTarget.setTransfer(types);
-			 
-			sourceEditDropTarget.addDropListener(new DropTargetListener() {
-			  public void dragEnter(DropTargetEvent event) {
-			     if (event.detail == DND.DROP_DEFAULT) {
-			         if ((event.operations & DND.DROP_COPY) != 0) {
-			             event.detail = DND.DROP_COPY;
-			         } else {
-			             event.detail = DND.DROP_NONE;
-			         }
-			     }
-			     if (!getEditable()) {
-		             event.detail = DND.DROP_NONE;
-			     }
-			     // will accept text but prefer to have HTML dropped
-			     for (int i = 0; i < event.dataTypes.length; i++) {
-			         if (htmlTransfer.isSupportedType(event.dataTypes[i])){
-			             event.currentDataType = event.dataTypes[i];
-			             break;
-			         }
-			     }
-			   }
-			   public void dragOver(DropTargetEvent event) {
-			        event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_INSERT_AFTER | DND.FEEDBACK_SCROLL;
-			    }
-			    public void dragOperationChanged(DropTargetEvent event) {
-			        if (event.detail == DND.DROP_DEFAULT) {
-			            if ((event.operations & DND.DROP_COPY) != 0) {
-			                event.detail = DND.DROP_COPY;
-			            } else {
-			                event.detail = DND.DROP_NONE;
-			            }
-			        }
-			    }
-			    public void dragLeave(DropTargetEvent event) {
-			    }
-			    public void dropAccept(DropTargetEvent event) {
-			    }
-			    public void drop(DropTargetEvent event) {
-			        if (textTransfer.isSupportedType(event.currentDataType) || 
-			        		htmlTransfer.isSupportedType(event.currentDataType)) {
-			            String text = (String)event.data;
-			            addHTML(text);
-			        }
-			    }
-			});
-	}
-	
-	/**
-	 * Displays the given debug message to the console.
-	 */
-	private void printDebugMessage(String method, String msg, String text) {
-		StringBuffer strBuf = new StringBuffer();
-		strBuf.append("RichTextEditor[").append(richText.getControl().handle).append(']') //$NON-NLS-1$
-				.append('.').append(method);
-		if (msg != null && msg.length() > 0) {
-			strBuf.append(": ").append(msg); //$NON-NLS-1$
-		}
-		if (text != null && text.length() > 0) {
-			strBuf.append('\n').append(text);
-		}
-		System.out.println(strBuf);
-	}
-
-	/**
-	 * Displays the given debug message to the console.
-	 */
-	private void printDebugMessage(String method, String msg) {
-		printDebugMessage(method, msg, null);
-	}
-	
-	public FindReplaceAction getFindReplaceAction() {
-		return richText.getFindReplaceAction();
-	}
-
-	public void setFindReplaceAction(FindReplaceAction findReplaceAction) {
-		if (richText != null) {
-			richText.setFindReplaceAction(findReplaceAction);
-			richText.getFindReplaceAction().setRichText(this);
-
-		}
-	}
-	
-	public void setInitialText(String text) {
-		if (richText != null) {
-			richText.setInitialText(text);
-		}
-		if (getSourceEdit() != null) {
-			removeModifyListeners();
-			setDocument(new Document(text));
-			addModifyListeners();
-		}
-
-	}
-	
-	
-	/**
-	 * from org.eclipse.ui.texteditor.AbstractTextEditor#getUndoContext()
-	 * Returns this editor's viewer's undo manager undo context.
-	 *
-	 * @return the undo context or <code>null</code> if not available
-	 * @since 3.1
-	 */
-	private IUndoContext getUndoContext() {
-		if (sourceViewer instanceof ITextViewerExtension6) {
-			IUndoManager undoManager= ((ITextViewerExtension6)sourceViewer).getUndoManager();
-			if (undoManager instanceof IUndoManagerExtension)
-				return ((IUndoManagerExtension)undoManager).getUndoContext();
-		}
-		return null;
-	}
-	
-	protected void createActions() {
-		createUndoRedoActions();
-		// select all
-		Action selectAllAction = new Action() {
-			@Override
-			public void run() {
-				getSourceEdit().selectAll();
-			}
-		};
-		selectAllAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.SELECT_ALL);
-		registerAction(ActionFactory.SELECT_ALL.getId(), selectAllAction);
-	}
-
-	/*
-	 * from org.eclipse.ui.texteditor.AbstractTextEditor#createUndoRedoActions()
-	 */
-	protected void createUndoRedoActions() {
-		IUndoContext undoContext= getUndoContext();
-		if (undoContext != null) {
-			// Use actions provided by global undo/redo
-			
-			// Create the undo action
-			undoAction= new UndoActionHandler(getEditorSite(), undoContext);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(undoAction, IAbstractTextEditorHelpContextIds.UNDO_ACTION);
-			undoAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.UNDO);
-			registerAction(ITextEditorActionConstants.UNDO, undoAction);
-
-			// Create the redo action.
-			redoAction= new RedoActionHandler(getEditorSite(), undoContext);
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(redoAction, IAbstractTextEditorHelpContextIds.REDO_ACTION);
-			redoAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.REDO);
-			registerAction(ITextEditorActionConstants.REDO, redoAction);
-		}
-	}
-	
-	private IEditorSite getEditorSite() {
-		return editorSite;
-	}
-
-
-	/**
-	 * Registers the given undo/redo action under the given ID and
-	 * ensures that previously installed actions get disposed. It
-	 * also takes care of re-registering the new action with the
-	 * global action handler.
-	 * 
-	 * @param actionId	the action id under which to register the action
-	 * @param action	the action to register
-	 * @since 3.1
-	 */
-	private void registerAction(String actionId, IAction action) {
-		IAction oldAction= getAction(actionId);
-		if (oldAction instanceof OperationHistoryActionHandler)
-			((OperationHistoryActionHandler)oldAction).dispose();
-
-		setAction(actionId, action);
-		
-		IActionBars actionBars= getEditorSite().getActionBars();
-		if (actionBars != null)
-			actionBars.setGlobalActionHandler(actionId, action);
-	}
-
-	
-	/*
-	 * @see ITextEditor#getAction(String)
-	 */
-	public IAction getAction(String actionID) {
-		assert actionID != null;
-		IAction action= (IAction) fActions.get(actionID);
-
-//		if (action == null) {
-//			action= findContributedAction(actionID);
-//			if (action != null)
-//				setAction(actionID, action);
-//		}
-
-		return action;
-	}
-
-	/*
-	 * @see ITextEditor#setAction(String, IAction)
-	 */
-	public void setAction(String actionID, IAction action) {
-		assert actionID != null;
-		if (action == null) {
-			action= (IAction) fActions.remove(actionID);
-			if (action != null)
-				fActivationCodeTrigger.unregisterActionFromKeyActivation(action);
-		} else {
-			fActions.put(actionID, action);
-			fActivationCodeTrigger.registerActionForKeyActivation(action);
-		}
-	}
-	
-	/**
-	 * Initializes the activation code trigger.
-	 *
-	 * @since 2.1
-	 */
-	private void initializeActivationCodeTrigger() {
-		fActivationCodeTrigger.install();
-		fActivationCodeTrigger.setScopes(fKeyBindingScopes);
-	}
-
-	/**
-	 * Internal key verify listener for triggering action activation codes.
-	 */
-	class ActivationCodeTrigger implements VerifyKeyListener {
-
-		/** Indicates whether this trigger has been installed. */
-		private boolean fIsInstalled= false;
-		/**
-		 * The key binding service to use.
-		 * @since 2.0
-		 */
-		private IKeyBindingService fKeyBindingService;
-		
-		/*
-		 * @see VerifyKeyListener#verifyKey(org.eclipse.swt.events.VerifyEvent)
-		 */
-		public void verifyKey(VerifyEvent event) {
-
-			ActionActivationCode code= null;
-			int size= fActivationCodes.size();
-			for (int i= 0; i < size; i++) {
-				code= (ActionActivationCode) fActivationCodes.get(i);
-				if (code.matches(event)) {
-					IAction action= getAction(code.fActionId);
-					if (action != null) {
-
-						if (action instanceof IUpdate)
-							((IUpdate) action).update();
-
-						if (!action.isEnabled() && action instanceof IReadOnlyDependent) {
-							IReadOnlyDependent dependent= (IReadOnlyDependent) action;
-							boolean writable= dependent.isEnabled(true);
-							if (writable) {
-								event.doit= false;
-								return;
-							}
-						} else if (action.isEnabled()) {
-							event.doit= false;
-							action.run();
-							return;
-						}
-					}
-				}
-			}
-		}
-
-		/**
-		 * Installs this trigger on the editor's text widget.
-		 * @since 2.0
-		 */
-		public void install() {
-			if (!fIsInstalled) {
-
-				if (sourceViewer instanceof ITextViewerExtension) {
-					ITextViewerExtension e= (ITextViewerExtension) sourceViewer;
-					e.prependVerifyKeyListener(this);
-				} else {
-					StyledText text= sourceViewer.getTextWidget();
-					text.addVerifyKeyListener(this);
-				}
-
-				fKeyBindingService= getEditorSite().getKeyBindingService();
-				fIsInstalled= true;
-			}
-		}
-
-		/**
-		 * Uninstalls this trigger from the editor's text widget.
-		 * @since 2.0
-		 */
-		public void uninstall() {
-			if (fIsInstalled) {
-
-				if (sourceViewer instanceof ITextViewerExtension) {
-					ITextViewerExtension e= (ITextViewerExtension) sourceViewer;
-					e.removeVerifyKeyListener(this);
-				} else if (sourceViewer != null) {
-					StyledText text= sourceViewer.getTextWidget();
-					if (text != null && !text.isDisposed())
-						text.removeVerifyKeyListener(fActivationCodeTrigger);
-				}
-
-				fIsInstalled= false;
-				fKeyBindingService= null;
-			}
-		}
-
-		/**
-		 * Registers the given action for key activation.
-		 * @param action the action to be registered
-		 * @since 2.0
-		 */
-		public void registerActionForKeyActivation(IAction action) {
-			if (action.getActionDefinitionId() != null)
-				fKeyBindingService.registerAction(action);
-		}
-
-		/**
-		 * The given action is no longer available for key activation
-		 * @param action the action to be unregistered
-		 * @since 2.0
-		 */
-		public void unregisterActionFromKeyActivation(IAction action) {
-			if (action.getActionDefinitionId() != null)
-				fKeyBindingService.unregisterAction(action);
-		}
-
-		/**
-		 * Sets the key binding scopes for this editor.
-		 * @param keyBindingScopes the key binding scopes
-		 * @since 2.1
-		 */
-		public void setScopes(String[] keyBindingScopes) {
-			if (keyBindingScopes != null && keyBindingScopes.length > 0)
-				fKeyBindingService.setScopes(keyBindingScopes);
-		}
-	}
-	
-	/**
-	 * Representation of action activation codes.
-	 */
-	static class ActionActivationCode {
-
-		/** The action id. */
-		public String fActionId;
-		/** The character. */
-		public char fCharacter;
-		/** The key code. */
-		public int fKeyCode= -1;
-		/** The state mask. */
-		public int fStateMask= SWT.DEFAULT;
-
-		/**
-		 * Creates a new action activation code for the given action id.
-		 * @param actionId the action id
-		 */
-		public ActionActivationCode(String actionId) {
-			fActionId= actionId;
-		}
-
-		/**
-		 * Returns <code>true</code> if this activation code matches the given verify event.
-		 * @param event the event to test for matching
-		 * @return whether this activation code matches <code>event</code>
-		 */
-		public boolean matches(VerifyEvent event) {
-			return (event.character == fCharacter &&
-						(fKeyCode == -1 || event.keyCode == fKeyCode) &&
-						(fStateMask == SWT.DEFAULT || event.stateMask == fStateMask));
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextEditorForm.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextEditorForm.java
deleted file mode 100644
index 1851a38..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextEditorForm.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A composite for laying out the default rich text editor in an Eclipse form.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextEditorForm extends ViewForm {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the style for this control
-	 */
-	public RichTextEditorForm(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * @see org.eclipse.swt.widgets#getData(String key)
-	 */
-	public Object getData(String key) {
-		if (key != null && key.equals(FormToolkit.KEY_DRAW_BORDER)) {
-			// Return a text border to get the FormToolkit's BorderPainter to
-			// paint a border for the rich text editor.
-			return FormToolkit.TEXT_BORDER;
-		}
-		return super.getData();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextFormToolkit.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextFormToolkit.java
deleted file mode 100644
index bedf000..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextFormToolkit.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A helper toolkit for creating a rich text control and editor that can be
- * added to an Eclipse form.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextFormToolkit {
-
-	/**
-	 * Creates a rich text control and adapts it to be used in a form.
-	 * 
-	 * @param toolkit
-	 *            the form toolkit
-	 * @param parent
-	 *            the parent control
-	 * @param text
-	 *            the initial text for the viewer
-	 * @param style
-	 *            the initial style for the viewer
-	 * @param basePath
-	 *            the base path used for resolving hrefs
-	 * @return a new <code>IRichText</code> instance
-	 */
-	public static IRichText createRichText(FormToolkit toolkit,
-			Composite parent, String text, int style) {
-		IRichText richText = new RichText(parent, toolkit.getBorderStyle()
-				| style | toolkit.getOrientation());
-		richText.getControl().setData(FormToolkit.KEY_DRAW_BORDER,
-				FormToolkit.TEXT_BORDER);
-		if (text != null) {
-			richText.setText(text);
-		}
-		return richText;
-	}
-
-	/**
-	 * Creates a rich text editor and adapts it to be used in a form.
-	 * 
-	 * @param toolkit
-	 *            the form toolkit
-	 * @param parent
-	 *            the parent control
-	 * @param text
-	 *            the initial text for the viewer
-	 * @param style
-	 *            the initial style for the viewer
-	 * @param basePath
-	 *            the base path used for resolving hrefs
-	 * @return a new <code>IRichText</code> instance
-	 */
-	public static IRichTextEditor createRichTextEditor(FormToolkit toolkit,
-			Composite parent, String text, int style, IEditorSite editorSite) {
-		IRichTextEditor richTextEditor = new RichTextEditor(parent, toolkit
-				.getBorderStyle()
-				| style | toolkit.getOrientation(), editorSite);
-		richTextEditor.getControl().setData(FormToolkit.KEY_DRAW_BORDER,
-				FormToolkit.TEXT_BORDER);
-		if (text != null) {
-			richTextEditor.setInitialText(text);
-		}
-		return richTextEditor;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextImages.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextImages.java
deleted file mode 100644
index 6dfed56..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextImages.java
+++ /dev/null
@@ -1,453 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Shared images used by the default rich text editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextImages {
-
-	private static final String ETOOL16 = "full/etool16/"; //$NON-NLS-1$
-
-	private static final String DTOOL16 = "full/dtool16/"; //$NON-NLS-1$	
-
-	private static final RichTextPlugin richTextPlugin = RichTextPlugin
-			.getDefault();
-
-	public static final String IMG_PATH_ADD_IMAGE = ETOOL16 + "AddImage.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_ADD_LINE = ETOOL16 + "AddLine.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_ADD_LINK = ETOOL16 + "AddLink.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_ADD_ORDERED_LIST = ETOOL16
-			+ "AddOrderedList.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_ADD_TABLE = ETOOL16 + "AddTable.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_ADD_UNORDERED_LIST = ETOOL16
-			+ "AddUnorderedList.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_BOLD = ETOOL16 + "Bold.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_CLEAR_CONTENT = ETOOL16
-			+ "ClearContent.gif"; //$NON-NLS-1$	
-
-	public static final String IMG_PATH_COPY = ETOOL16 + "Copy.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_CUT = ETOOL16 + "Cut.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_FIND_REPLACE = ETOOL16
-			+ "FindReplace.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_INDENT = ETOOL16 + "Indent.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_ITALIC = ETOOL16 + "Italic.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_JUSTIFY_CENTER = ETOOL16
-			+ "JustifyCenter.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_JUSTIFY_FULL = ETOOL16
-			+ "JustifyFull.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_JUSTIFY_LEFT = ETOOL16
-			+ "JustifyLeft.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_JUSTIFY_RIGHT = ETOOL16
-			+ "JustifyRight.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_OUTDENT = ETOOL16 + "Outdent.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_PASTE = ETOOL16 + "Paste.gif"; //$NON-NLS-1$
-	
-	public static final String IMG_PATH_PASTE_PLAIN_TEXT = ETOOL16 + "PastePlainText.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_STRIKE_THROUGH = ETOOL16
-			+ "StrikeThrough.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_SUBSCRIPT = ETOOL16 + "Subscript.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_SUPERSCRIPT = ETOOL16
-			+ "Superscript.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_UNDERLINE = ETOOL16 + "Underline.gif"; //$NON-NLS-1$
-
-	public static final String IMG_PATH_TIDY = ETOOL16 + "TidyHTML.gif"; //$NON-NLS-1$
-
-	public static final Image IMG_ADD_IMAGE = richTextPlugin
-			.getSharedImage(IMG_PATH_ADD_IMAGE);
-
-	public static final Image IMG_ADD_LINE = richTextPlugin
-			.getSharedImage(IMG_PATH_ADD_LINE);
-
-	public static final Image IMG_ADD_LINK = richTextPlugin
-			.getSharedImage(IMG_PATH_ADD_LINK);
-
-	public static final Image IMG_ADD_ORDERED_LIST = richTextPlugin
-			.getSharedImage(IMG_PATH_ADD_ORDERED_LIST);
-
-	public static final Image IMG_ADD_TABLE = richTextPlugin
-			.getSharedImage(IMG_PATH_ADD_TABLE);
-
-	public static final Image IMG_ADD_UNORDERED_LIST = richTextPlugin
-			.getSharedImage(IMG_PATH_ADD_UNORDERED_LIST);
-
-	public static final Image IMG_BOLD = richTextPlugin
-			.getSharedImage(IMG_PATH_BOLD);
-
-	public static final Image IMG_CLEAR_CONTENT = richTextPlugin
-			.getSharedImage(IMG_PATH_CLEAR_CONTENT);
-
-	public static final Image IMG_COPY = richTextPlugin
-			.getSharedImage(IMG_PATH_COPY);
-
-	public static final Image IMG_CUT = richTextPlugin
-			.getSharedImage(IMG_PATH_CUT);
-
-	public static final Image IMG_FIND_REPLACE = richTextPlugin
-			.getSharedImage(IMG_PATH_FIND_REPLACE);
-
-	public static final Image IMG_INDENT = richTextPlugin
-			.getSharedImage(IMG_PATH_INDENT);
-
-	public static final Image IMG_ITALIC = richTextPlugin
-			.getSharedImage(IMG_PATH_ITALIC);
-
-	public static final Image IMG_JUSTIFY_CENTER = richTextPlugin
-			.getSharedImage(IMG_PATH_JUSTIFY_CENTER);
-
-	public static final Image IMG_JUSTIFY_FULL = richTextPlugin
-			.getSharedImage(IMG_PATH_JUSTIFY_FULL);
-
-	public static final Image IMG_JUSTIFY_LEFT = richTextPlugin
-			.getSharedImage(IMG_PATH_JUSTIFY_LEFT);
-
-	public static final Image IMG_JUSTIFY_RIGHT = richTextPlugin
-			.getSharedImage(IMG_PATH_JUSTIFY_RIGHT);
-
-	public static final Image IMG_OUTDENT = richTextPlugin
-			.getSharedImage(IMG_PATH_OUTDENT);
-
-	public static final Image IMG_PASTE = richTextPlugin
-			.getSharedImage(IMG_PATH_PASTE);
-	
-	public static final Image IMG_PASTE_PLAIN_TEXT = richTextPlugin
-			.getSharedImage(IMG_PATH_PASTE_PLAIN_TEXT);	
-
-	public static final Image IMG_STRIKE_THROUGH = richTextPlugin
-			.getSharedImage(IMG_PATH_STRIKE_THROUGH);
-
-	public static final Image IMG_SUBSCRIPT = richTextPlugin
-			.getSharedImage(IMG_PATH_SUBSCRIPT);
-
-	public static final Image IMG_SUPERSCRIPT = richTextPlugin
-			.getSharedImage(IMG_PATH_SUPERSCRIPT);
-
-	public static final Image IMG_UNDERLINE = richTextPlugin
-			.getSharedImage(IMG_PATH_UNDERLINE);
-	public static final Image IMG_TIDY = richTextPlugin
-			.getSharedImage(IMG_PATH_TIDY);
-	
-	public static final ImageDescriptor IMG_DESC_ADD_IMAGE = richTextPlugin
-			.getImageDescriptor(IMG_PATH_ADD_IMAGE);
-
-	public static final ImageDescriptor IMG_DESC_ADD_LINE = richTextPlugin
-			.getImageDescriptor(IMG_PATH_ADD_LINE);
-
-	public static final ImageDescriptor IMG_DESC_ADD_LINK = richTextPlugin
-			.getImageDescriptor(IMG_PATH_ADD_LINK);
-
-	public static final ImageDescriptor IMG_DESC_ADD_ORDERED_LIST = richTextPlugin
-			.getImageDescriptor(IMG_PATH_ADD_ORDERED_LIST);
-
-	public static final ImageDescriptor IMG_DESC_ADD_TABLE = richTextPlugin
-			.getImageDescriptor(IMG_PATH_ADD_TABLE);
-
-	public static final ImageDescriptor IMG_DESC_ADD_UNORDERED_LIST = richTextPlugin
-			.getImageDescriptor(IMG_PATH_ADD_UNORDERED_LIST);
-
-	public static final ImageDescriptor IMG_DESC_BOLD = richTextPlugin
-			.getImageDescriptor(IMG_PATH_BOLD);
-
-	public static final ImageDescriptor IMG_DESC_CLEAR_CONTENT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_CLEAR_CONTENT);
-
-	public static final ImageDescriptor IMG_DESC_COPY = richTextPlugin
-			.getImageDescriptor(IMG_PATH_COPY);
-
-	public static final ImageDescriptor IMG_DESC_CUT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_CUT);
-
-	public static final ImageDescriptor IMG_DESC_FIND_REPLACE = richTextPlugin
-			.getImageDescriptor(IMG_PATH_FIND_REPLACE);
-
-	public static final ImageDescriptor IMG_DESC_INDENT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_INDENT);
-
-	public static final ImageDescriptor IMG_DESC_ITALIC = richTextPlugin
-			.getImageDescriptor(IMG_PATH_ITALIC);
-
-	public static final ImageDescriptor IMG_DESC_JUSTIFY_CENTER = richTextPlugin
-			.getImageDescriptor(IMG_PATH_JUSTIFY_CENTER);
-
-	public static final ImageDescriptor IMG_DESC_JUSTIFY_FULL = richTextPlugin
-			.getImageDescriptor(IMG_PATH_JUSTIFY_FULL);
-
-	public static final ImageDescriptor IMG_DESC_JUSTIFY_LEFT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_JUSTIFY_LEFT);
-
-	public static final ImageDescriptor IMG_DESC_JUSTIFY_RIGHT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_JUSTIFY_RIGHT);
-
-	public static final ImageDescriptor IMG_DESC_OUTDENT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_OUTDENT);
-
-	public static final ImageDescriptor IMG_DESC_PASTE = richTextPlugin
-			.getImageDescriptor(IMG_PATH_PASTE);
-
-	public static final ImageDescriptor IMG_DESC_PASTE_PLAIN_TEXT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_PASTE_PLAIN_TEXT);
-
-	public static final ImageDescriptor IMG_DESC_STRIKE_THROUGH = richTextPlugin
-			.getImageDescriptor(IMG_PATH_STRIKE_THROUGH);
-
-	public static final ImageDescriptor IMG_DESC_SUBSCRIPT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_SUBSCRIPT);
-
-	public static final ImageDescriptor IMG_DESC_SUPERSCRIPT = richTextPlugin
-			.getImageDescriptor(IMG_PATH_SUPERSCRIPT);
-
-	public static final ImageDescriptor IMG_DESC_UNDERLINE = richTextPlugin
-			.getImageDescriptor(IMG_PATH_UNDERLINE);
-
-	public static final ImageDescriptor IMG_DESC_TIDY = richTextPlugin
-			.getImageDescriptor(IMG_PATH_TIDY);
-
-	public static final String DISABLED_IMG_PATH_ADD_IMAGE = DTOOL16
-			+ "AddImage.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_ADD_LINE = DTOOL16
-			+ "AddLine.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_ADD_LINK = DTOOL16
-			+ "AddLink.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_ADD_ORDERED_LIST = DTOOL16
-			+ "AddOrderedList.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_ADD_TABLE = DTOOL16
-			+ "AddTable.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_ADD_UNORDERED_LIST = DTOOL16
-			+ "AddUnorderedList.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_BOLD = DTOOL16 + "Bold.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_CLEAR_CONTENT = DTOOL16
-			+ "ClearContent.gif"; //$NON-NLS-1$	
-
-	public static final String DISABLED_IMG_PATH_COPY = DTOOL16 + "Copy.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_CUT = DTOOL16 + "Cut.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_FIND_REPLACE = DTOOL16
-			+ "FindReplace.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_INDENT = DTOOL16
-			+ "Indent.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_ITALIC = DTOOL16
-			+ "Italic.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_JUSTIFY_CENTER = DTOOL16
-			+ "JustifyCenter.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_JUSTIFY_FULL = DTOOL16
-			+ "JustifyFull.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_JUSTIFY_LEFT = DTOOL16
-			+ "JustifyLeft.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_JUSTIFY_RIGHT = DTOOL16
-			+ "JustifyRight.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_OUTDENT = DTOOL16
-			+ "Outdent.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_PASTE = DTOOL16 + "Paste.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_PASTE_PLAIN_TEXT = DTOOL16 + "PastePlainText.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_STRIKE_THROUGH = DTOOL16
-			+ "StrikeThrough.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_SUBSCRIPT = DTOOL16
-			+ "Subscript.gif"; //$NON-NLS-1$
-
-	public static final String DISABLED_IMG_PATH_SUPERSCRIPT = DTOOL16
-			+ "Superscript.gif"; //$NON-NLS-1$
-
-	private static String DISABLED_IMG_PATH_TIDY = DTOOL16 + "TidyHTML.gif"; //$NON-NLS-1$
-		
-	public static final String DISABLED_IMG_PATH_UNDERLINE = DTOOL16
-			+ "Underline.gif"; //$NON-NLS-1$
-
-	public static final Image DISABLED_IMG_ADD_IMAGE = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_ADD_IMAGE);
-
-	public static final Image DISABLED_IMG_ADD_LINE = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_ADD_LINE);
-
-	public static final Image DISABLED_IMG_ADD_LINK = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_ADD_LINK);
-
-	public static final Image DISABLED_IMG_ADD_ORDERED_LIST = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_ADD_ORDERED_LIST);
-
-	public static final Image DISABLED_IMG_ADD_TABLE = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_ADD_TABLE);
-
-	public static final Image DISABLED_IMG_ADD_UNORDERED_LIST = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_ADD_UNORDERED_LIST);
-
-	public static final Image DISABLED_IMG_BOLD = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_BOLD);
-
-	public static final Image DISABLED_IMG_CLEAR_CONTENT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_CLEAR_CONTENT);
-
-	public static final Image DISABLED_IMG_COPY = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_COPY);
-
-	public static final Image DISABLED_IMG_CUT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_CUT);
-
-	public static final Image DISABLED_IMG_FIND_REPLACE = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_FIND_REPLACE);
-
-	public static final Image DISABLED_IMG_INDENT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_INDENT);
-
-	public static final Image DISABLED_IMG_ITALIC = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_ITALIC);
-
-	public static final Image DISABLED_IMG_JUSTIFY_CENTER = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_JUSTIFY_CENTER);
-
-	public static final Image DISABLED_IMG_JUSTIFY_FULL = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_JUSTIFY_FULL);
-
-	public static final Image DISABLED_IMG_JUSTIFY_LEFT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_JUSTIFY_LEFT);
-
-	public static final Image DISABLED_IMG_JUSTIFY_RIGHT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_JUSTIFY_RIGHT);
-
-	public static final Image DISABLED_IMG_OUTDENT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_OUTDENT);
-
-	public static final Image DISABLED_IMG_PASTE = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_PASTE);
-
-	public static final Image DISABLED_IMG_STRIKE_THROUGH = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_STRIKE_THROUGH);
-
-	public static final Image DISABLED_IMG_SUBSCRIPT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_SUBSCRIPT);
-
-	public static final Image DISABLED_IMG_SUPERSCRIPT = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_SUPERSCRIPT);
-
-	public static final Image DISABLED_IMG_UNDERLINE = richTextPlugin
-			.getSharedImage(DISABLED_IMG_PATH_UNDERLINE);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_ADD_IMAGE = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_ADD_IMAGE);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_ADD_LINE = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_ADD_LINE);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_ADD_LINK = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_ADD_LINK);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_ADD_ORDERED_LIST = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_ADD_ORDERED_LIST);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_ADD_TABLE = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_ADD_TABLE);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_ADD_UNORDERED_LIST = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_ADD_UNORDERED_LIST);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_BOLD = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_BOLD);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_CLEAR_CONTENT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_CLEAR_CONTENT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_COPY = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_COPY);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_CUT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_CUT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_FIND_REPLACE = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_FIND_REPLACE);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_INDENT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_INDENT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_ITALIC = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_ITALIC);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_JUSTIFY_CENTER = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_JUSTIFY_CENTER);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_JUSTIFY_FULL = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_JUSTIFY_FULL);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_JUSTIFY_LEFT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_JUSTIFY_LEFT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_JUSTIFY_RIGHT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_JUSTIFY_RIGHT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_OUTDENT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_OUTDENT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_PASTE = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_PASTE);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_PASTE_PLAIN_TEXT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_PASTE_PLAIN_TEXT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_STRIKE_THROUGH = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_STRIKE_THROUGH);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_SUBSCRIPT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_SUBSCRIPT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_SUPERSCRIPT = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_SUPERSCRIPT);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_UNDERLINE = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_UNDERLINE);
-
-	public static final ImageDescriptor DISABLED_IMG_DESC_TIDY = richTextPlugin
-			.getImageDescriptor(DISABLED_IMG_PATH_TIDY);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextListener.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextListener.java
deleted file mode 100644
index 1f22046..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextListener.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Listens to a rich text editing event.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextListener {
-
-	private int eventType;
-
-	private Listener listener;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param eventType
-	 *            the event type
-	 * @param listener
-	 *            the event listener
-	 */
-	public RichTextListener(int eventType, Listener listener) {
-		this.eventType = eventType;
-		this.listener = listener;
-	}
-
-	/**
-	 * Returns the event type.
-	 * 
-	 * @return the event type
-	 */
-	public int getEventType() {
-		return eventType;
-	}
-
-	/**
-	 * Returns the event listener.
-	 */
-	public Listener getListener() {
-		return listener;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextPlugin.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextPlugin.java
deleted file mode 100644
index 46a3cad..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextPlugin.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import java.util.Date;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Rich Text plug-in class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static RichTextPlugin plugin;
-
-	// The date and time when this plug-in was started.
-	private Date startTime;
-
-	/**
-	 * Default constructor.
-	 */
-	public RichTextPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		startTime = new Date();
-	}
-
-	/**
-	 * @see AbstractPlugin#stop(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static RichTextPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the date and time when this plug-in was started.
-	 */
-	public Date getStartTime() {
-		return startTime;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextResources.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextResources.java
deleted file mode 100644
index 2ef3e50..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextResources.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The RichText resources.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public final class RichTextResources extends NLS {
-
-	private static String BUNDLE_NAME = RichTextResources.class
-		.getPackage().getName() + ".Resources"; //$NON-NLS-1$	
-
-	private RichTextResources() {
-		// Do not instantiate.
-	}
-
-	public static String fontNameAction_CSS_Default;
-	public static String fontNameAction_CSS_Default_Mozilla;
-	public static String fontNameAction_DefaultFontName;
-	public static String fontStyle_normal;
-	public static String fontStyle_sectionHeading;
-	public static String fontStyle_subsectionHeading;
-	public static String fontStyle_subSubsectionHeading;
-	public static String fontStyle_quote;
-	public static String fontStyle_codeSample;
-	public static String blockTag_paragraph;
-	public static String blockTag_heading1;
-	public static String blockTag_heading2;
-	public static String blockTag_heading3;
-	public static String blockTag_heading4;
-	public static String blockTag_heading5;
-	public static String blockTag_heading6;
-	public static String blockTag_address;
-	public static String blockTag_preformattedText;
-	public static String fontName_default;
-	public static String fontName_arial;
-	public static String fontName_courierNew;
-	public static String fontName_timesNewRoman;
-	public static String fontName_verdana;
-	public static String addHorizontalBarAction_toolTipText;
-	public static String addImageAction_toolTipText;
-	public static String addLineAction_toolTipText;
-	public static String addLinkAction_toolTipText;
-	public static String addOrderedListAction_toolTipText;
-	public static String addTableAction_toolTipText;
-	public static String addUnorderedListAction_toolTipText;
-	public static String boldAction_toolTipText;
-	public static String clearContentAction_toolTipText;
-	public static String copyAction_toolTipText;
-	public static String cutAction_toolTipText;
-	public static String findReplaceAction_toolTipText;
-	public static String indentAction_toolTipText;
-	public static String italicAction_toolTipText;
-	public static String justifyCenterAction_toolTipText;
-	public static String justifyFullAction_toolTipText;
-	public static String justifyLeftAction_toolTipText;
-	public static String justifyRightAction_toolTipText;
-	public static String outdentAction_toolTipText;
-	public static String pasteAction_toolTipText;
-	public static String pastePlainTextAction_toolTipText;
-	public static String subscriptAction_toolTipText;
-	public static String superscriptAction_toolTipText;
-	public static String underlineAction_toolTipText;
-	public static String fontStyleAction_toolTipText;
-	public static String blockTagAction_toolTipText;
-	public static String fontNameAction_toolTipText;
-	public static String fontSizeAction_toolTipText;
-	public static String cutAction_text;
-	public static String copyAction_text;
-	public static String pasteAction_text;
-	public static String pastePlainTextAction_text;
-	public static String richTextTab_text;
-	public static String richTextTab_toolTipText;
-	public static String htmlTab_text;
-	public static String htmlTab_toolTipText;
-	public static String addImageDialog_title;
-	public static String addLinkDialog_title;
-	public static String addTableDialog_title;
-	public static String findReplaceDialog_title;
-	public static String urlDisplayNameLabel_text;
-	public static String urlLabel_text;
-	public static String summaryLabel_text;
-	public static String captionLabel_text;
-	public static String rowsLabel_text;
-	public static String columnsLabel_text;
-	public static String widthLabel_text;
-	public static String tableStyleLabel_text;
-	public static String tableHeaderNone_text;
-	public static String tableHeaderCols_text;
-	public static String tableHeaderRows_text;
-	public static String tableHeaderBoth_text;
-	public static String browseButton_text;
-	public static String clearContentDialog_title;
-	public static String clearContentDialog_text;
-	public static String findLabel_text;
-	public static String replaceLabel_text;
-	public static String optionsGroup_text;
-	public static String caseSensitiveCheckbox_text;
-	public static String wholeWordCheckbox_text;
-	public static String directionGroup_text;
-	public static String forwardRadioButton_text;
-	public static String backwardRadioButton_text;
-	public static String findButton_text;
-	public static String replaceButton_text;
-	public static String replaceFindButton_text;
-	public static String replaceallButton_text;
-	public static String FindReplace_Status_noMatch_label;
-	public static String maxCharsPerLineLabel_text;
-	public static String indentHTMLCheckbox_text;
-	public static String indentSizeLabel_text;
-	public static String tidy_clean_text;
-	public static String tidy_cleaner_text;
-	public static String tidy_cleanest_text;
-	public static String tidy_clean_toolTipText;
-	public static String tidy_cleaner_toolTipText;
-	public static String tidy_cleanest_toolTipText;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, RichTextResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextSelection.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextSelection.java
deleted file mode 100644
index 74b7f4c..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextSelection.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-/**
- * Models a text selection in a rich text control and editor.
- * 
- * @author Jeff Hardy
- * @since 1.2
- */
-public class RichTextSelection {
-
-	// The control's text selection.
-	protected String text = ""; //$NON-NLS-1$
-
-	// The control's text selection offset
-	protected int offsetStart = 0;
-
-	// The control's text selection font
-	protected String fontName = ""; //$NON-NLS-1$
-
-	// The control's text selection font size
-	// could be in point size (12pt), or HTML size (1-7)
-	protected String fontSize = ""; //$NON-NLS-1$
-
-	// The control's text current style
-	protected String blockStyle = ""; //$NON-NLS-1$
-
-	// The control's text current flags
-	protected int flags = 0;
-
-	// Text status flags
-	public static final int BOLD = 1;
-
-	public static final int ITALIC = BOLD << 1;
-
-	public static final int UNDERLINE = ITALIC << 1;
-
-	public static final int SUBSCRIPT = UNDERLINE << 1;
-
-	public static final int SUPERSCRIPT = SUBSCRIPT << 1;
-
-	public String getBlockStyle() {
-		return blockStyle;
-	}
-
-	public void setBlockStyle(String blockStyle) {
-		this.blockStyle = blockStyle;
-	}
-
-	public int getFlags() {
-		return flags;
-	}
-
-	public void setFlags(int flags) {
-		this.flags = flags;
-	}
-
-	public String getFontName() {
-		return fontName;
-	}
-
-	public void setFontName(String fontName) {
-		this.fontName = fontName;
-	}
-
-	public String getFontSize() {
-		return fontSize;
-	}
-
-	public void setFontSize(String fontSize) {
-		this.fontSize = fontSize;
-	}
-
-	public int getOffsetStart() {
-		return offsetStart;
-	}
-
-	public void setOffsetStart(int offsetStart) {
-		this.offsetStart = offsetStart;
-	}
-
-	public String getText() {
-		return text;
-	}
-
-	public void setText(String text) {
-		this.text = text;
-	}
-
-	public boolean isBold() {
-		return (flags & BOLD) != 0;
-	}
-
-	public boolean isItalic() {
-		return (flags & ITALIC) != 0;
-	}
-
-	public boolean isUnderLine() {
-		return (flags & UNDERLINE) != 0;
-	}
-
-	public boolean isSubscript() {
-		return (flags & SUBSCRIPT) != 0;
-	}
-
-	public boolean isSuperscript() {
-		return (flags & SUPERSCRIPT) != 0;
-	}
-
-	/**
-	 * Clears the selection info
-	 */
-	public void clear() {
-		text = ""; //$NON-NLS-1$
-		offsetStart = 0;
-		fontName = ""; //$NON-NLS-1$
-		fontSize = ""; //$NON-NLS-1$
-		blockStyle = ""; //$NON-NLS-1$
-		flags = 0;
-	}
-
-	public String toString() {
-		String str = "Text: " + text + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-		str += "fontName: " + fontName + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-		str += "fontSize: " + fontSize + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-		str += "blockStyle: " + blockStyle + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-		str += "flags: " + flags + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-		return str;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextToolBar.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextToolBar.java
deleted file mode 100644
index 1a162d2..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/RichTextToolBar.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.richtext.actions.IRichTextAction;
-import org.eclipse.epf.richtext.actions.RichTextAction;
-import org.eclipse.epf.richtext.actions.RichTextComboAction;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * The default rich text tool bar implementation.
- * 
- * Split into 2 toolbars (one for CCombos, one for buttons) for tabbing purposes.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class RichTextToolBar implements IRichTextToolBar {
-
-	// The parent rich text control.
-	private IRichText richText;
-
-	// If true, add a new tool bar.
-	private boolean addToolBar = true;
-
-	// The current tool bar manager used to populate the tool actions.
-	private ToolBarManager toolbarMgr;
-	
-	// The current tool bar manager used to populate the tool actions.
-	private ToolBarManager toolbarMgrCombo;
-
-	// The action items in the tool bar(s).
-	private List<Object> actionItems = new ArrayList<Object>();
-
-	private static int lastWidth = -1;
-	
-	protected Composite parent;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param style
-	 *            the tool bar style
-	 * @param richText
-	 *            the parent rich text control
-	 */
-	public RichTextToolBar(Composite parent, int style, IRichText richText) {
-		this.parent = parent;
-		this.richText = richText;
-
-		addToolBar();
-	}
-
-	public void addAction(final IAction action) {
-		if (action != null) {
-			ActionContributionItem item = new ActionContributionItem(action);
-			toolbarMgr.add(item);
-			toolbarMgr.update(true);
-			actionItems.add(item);
-		}
-	}
-
-	/**
-	 * Adds a combo action to the tool bar.
-	 * 
-	 * @param action
-	 *            the action to add
-	 */
-	public void addAction(final RichTextComboAction item) {
-		if (item != null) {
-			item.init();
-			toolbarMgrCombo.add(item);            
-			toolbarMgrCombo.update(true);
-			actionItems.add(item);           
-		}
-	}
-
-	/**
-	 * Adds a separator to the tool bar.
-	 */
-	public void addSeparator() {
-		toolbarMgr.add(new Separator());
-	}
-
-	/**
-	 * Updates the toolbar state.
-	 * <p>
-	 * Enables/disables actions depending on the currently selected
-	 * RichTextEditor tab (RichText vs. HTML)
-	 * 
-	 * @param editable
-	 *            specifies whether to enable non-ReadOnly commands
-	 */
-	public void updateToolBar(boolean editable) {
-		boolean richTextMode = true;
-		if (richText instanceof RichTextEditor
-				&& ((RichTextEditor) richText).isHTMLTabSelected()) {
-			richTextMode = false;
-		}
-		for (Iterator i = actionItems.iterator(); i.hasNext();) {
-			Object item = i.next();
-			if (item instanceof ToolItem) {
-				boolean enabledToolItem = true;
-				ToolItem toolItem = (ToolItem) item;
-				IRichTextAction action = (IRichTextAction) toolItem.getData();
-				if (action != null && !editable
-						&& action.disableInReadOnlyMode()) {
-					enabledToolItem = false;
-				}
-				if (action != null && !richTextMode
-						&& action.disableInSourceMode()) {
-					enabledToolItem = false;
-				}
-				toolItem.setEnabled(enabledToolItem);
-			} else if (item instanceof Combo) {
-				if (richTextMode && editable) {
-					((Combo) item).setEnabled(true);
-				} else {
-					((Combo) item).setEnabled(false);
-				}
-			} else if (item instanceof ActionContributionItem) {
-				boolean enabledToolItem = true;
-				RichTextAction action = (RichTextAction) ((ActionContributionItem) item)
-						.getAction();
-				if (action != null && !editable
-						&& action.disableInReadOnlyMode()) {
-					enabledToolItem = false;
-				}
-				if (action != null && !richTextMode
-						&& action.disableInSourceMode()) {
-					enabledToolItem = false;
-				}
-				action.setEnabled(enabledToolItem);
-			}
-		}
-	}
-
-	/**
-	 * Adds a tool bar, if necessary, to contain a button action or separator.
-	 */
-	protected void addToolBar() {
-		if (addToolBar) {
-			toolbarMgrCombo = new ToolBarManager(SWT.WRAP | SWT.FLAT | parent.getStyle());
-			toolbarMgrCombo.createControl(parent);
-			toolbarMgr = new ToolBarManager(SWT.WRAP | SWT.FLAT | parent.getStyle());
-			toolbarMgr.createControl(parent);
-			addToolBar = false;
-		}
-	}
-
-	public ToolBarManager getToolbarMgr() {
-		return toolbarMgr;
-	}
-
-	public ToolBarManager getToolbarMgrCombo() {
-		return toolbarMgrCombo;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddImageAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddImageAction.java
deleted file mode 100644
index f102923..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddImageAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.dialogs.AddImageDialog;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Adds an image to a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddImageAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AddImageAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_ADD_IMAGE);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_ADD_IMAGE);
-		setToolTipText(RichTextResources.addImageAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			AddImageDialog dialog = new AddImageDialog(Display.getCurrent()
-					.getActiveShell());
-			dialog.open();
-			if (dialog.getReturnCode() == Window.OK) {
-				String imageURL = dialog.getImage().getURL();
-				if (imageURL.length() > 0) {
-					richText
-							.executeCommand(RichTextCommand.ADD_IMAGE, imageURL);
-				}
-			}
-		}
-	}
-	
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddLineAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddLineAction.java
deleted file mode 100644
index 57cada5..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddLineAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Adds a horizontal bar to a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddLineAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AddLineAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_ADD_LINE);
-		setToolTipText(RichTextResources.addLineAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.ADD_LINE);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddLinkAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddLinkAction.java
deleted file mode 100644
index cc68eb7..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddLinkAction.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.dialogs.AddLinkDialog;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Adds a link to a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddLinkAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AddLinkAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_ADD_LINK);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_ADD_LINK);
-		setToolTipText(RichTextResources.addLinkAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			AddLinkDialog dialog = new AddLinkDialog(Display.getCurrent()
-					.getActiveShell(), richText.getBasePath());
-			dialog.open();
-			if (dialog.getReturnCode() == Window.OK) {
-				String linkURL = dialog.getLink().getURL();
-				if (linkURL.length() > 0) {
-					richText.executeCommand(RichTextCommand.ADD_LINK, linkURL);
-				}
-			}
-		}
-	}
-	
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddOrderedListAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddOrderedListAction.java
deleted file mode 100644
index fe42a03..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddOrderedListAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Adds an ordered list to a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddOrderedListAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AddOrderedListAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_ADD_ORDERED_LIST);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_ADD_ORDERED_LIST);
-		setToolTipText(RichTextResources.addOrderedListAction_toolTipText);
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.ADD_ORDERED_LIST);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddTableAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddTableAction.java
deleted file mode 100644
index 9967166..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddTableAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.dialogs.AddTableDialog;
-import org.eclipse.epf.richtext.html.Table;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Adds a table to a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddTableAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AddTableAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_ADD_TABLE);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_ADD_TABLE);
-		setToolTipText(RichTextResources.addTableAction_toolTipText);
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			AddTableDialog dialog = new AddTableDialog(Display.getCurrent()
-					.getActiveShell());
-			dialog.open();
-			if (dialog.getReturnCode() == Window.OK) {
-				Table table = dialog.getTable();
-				int rows = table.getRows();
-				int cols = table.getColumns();
-				String width = table.getWidth();
-				int tableheaders = table.getTableHeaders();
-				String summary = table.getSummary();
-				String caption = table.getCaption();
-				if (rows > 0 && cols > 0) {
-					richText
-							.executeCommand(
-									RichTextCommand.ADD_TABLE,
-									new String[] {
-											"" + rows, "" + cols, "" + width, summary, caption, "" + tableheaders }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				}
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddUnorderedListAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddUnorderedListAction.java
deleted file mode 100644
index 92b0557..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/AddUnorderedListAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Adds an unordered list to a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddUnorderedListAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public AddUnorderedListAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_ADD_UNORDERED_LIST);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_ADD_UNORDERED_LIST);
-		setToolTipText(RichTextResources.addUnorderedListAction_toolTipText);
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.ADD_UNORDERED_LIST);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BaseRichTextAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BaseRichTextAction.java
deleted file mode 100644
index 4ed5734..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BaseRichTextAction.java
+++ /dev/null
@@ -1,73 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-/**
- * The abstract base class for all rich text action.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public abstract class BaseRichTextAction implements IBaseRichTextAction {
-
-	protected String toolTipText;
-
-	protected boolean enabled = true;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public BaseRichTextAction() {
-	}
-
-	/**
-	 * Returns the tool tip for the action.
-	 * 
-	 * @return the tool tip text
-	 */
-	public String getToolTipText() {
-		return toolTipText;
-	}
-
-	/**
-	 * Sets the tool tip for the action.
-	 * 
-	 * @param toolTipText
-	 *            the tool tip text
-	 */
-	public void setToolTipText(String toolTipText) {
-		this.toolTipText = toolTipText;
-	}
-
-	/**
-	 * Returns the enabled status of the action.
-	 * 
-	 * @return <code>true</code> if enabled, <code>false</code> if not
-	 */
-	public boolean getEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * Enables or disables the action.
-	 * 
-	 * @param enabled
-	 *            if <code>true</code>, enable the action. if
-	 *            <code>false</code>, disable it.
-	 */
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BlockTagAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BlockTagAction.java
deleted file mode 100644
index 5eb8fa6..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BlockTagAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.html.BlockTag;
-
-/**
- * Sets the font name for the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class BlockTagAction extends RichTextComboAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public BlockTagAction(final IRichText richText) {
-		super(richText);
-		setToolTipText(RichTextResources.blockTagAction_toolTipText); 
-	}
-		
-	@Override
-	public Collection<String> getInput() {
-		Collection<String> returnList = new ArrayList<String>();
-		
-		returnList.add(BlockTag.PARAGRAPH.getName());
-		returnList.add(BlockTag.HEADING_1.getName());
-		returnList.add(BlockTag.HEADING_2.getName());
-		returnList.add(BlockTag.HEADING_3.getName());
-		returnList.add(BlockTag.HEADING_4.getName());
-		returnList.add(BlockTag.HEADING_5.getName());
-		returnList.add(BlockTag.HEADING_6.getName());
-		returnList.add(BlockTag.ADDRESS.getName());
-		returnList.add(BlockTag.PREFORMATTED_TEXT.getName());
-
-		return returnList;
-	}
-	
-	
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 * @param index
-	 *            the index of the selected item
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			String selected = getCComboSelection();
-			richText.executeCommand(RichTextCommand.FORMAT_BLOCK, selected);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BoldAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BoldAction.java
deleted file mode 100644
index b7bc643..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/BoldAction.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Toggles the 'bold' attribute of the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class BoldAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public BoldAction(final IRichText richText) {
-		super(richText, IAction.AS_CHECK_BOX);
-		setImageDescriptor(RichTextImages.IMG_DESC_BOLD);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_BOLD);
-		setToolTipText(RichTextResources.boldAction_toolTipText); 
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				setChecked(richText.getSelected().isBold());
-			}
-		});
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.BOLD);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/ClearContentAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/ClearContentAction.java
deleted file mode 100644
index 8e83509..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/ClearContentAction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextPlugin;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Clears the content of a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ClearContentAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ClearContentAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_CLEAR_CONTENT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_CLEAR_CONTENT);
-		setToolTipText(RichTextResources.clearContentAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            s rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			if (RichTextPlugin.getDefault().getMsgDialog().displayPrompt(
-					RichTextResources.clearContentDialog_title,
-					RichTextResources.clearContentDialog_text)) {
-				richText.executeCommand(RichTextCommand.CLEAR_CONTENT);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/CopyAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/CopyAction.java
deleted file mode 100644
index 9ff2f6c..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/CopyAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.StyledText;
-
-/**
- * Copies the selected text in a rich text control to the clipboard.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class CopyAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CopyAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_COPY);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_COPY);
-		setToolTipText(RichTextResources.copyAction_toolTipText);
-	}
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in readonly mode.
-	 */
-	public boolean disableInReadOnlyMode() {
-		return false;
-	}
-	
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in source edit mode.
-	 */
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			if (richText instanceof RichTextEditor
-					&& ((RichTextEditor) richText).isHTMLTabSelected()) {
-				StyledText styledText = ((RichTextEditor) richText).getSourceEdit();
-				styledText.copy();
-			} else {
-				richText.setCopyURL();
-				richText.executeCommand(RichTextCommand.COPY);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/CutAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/CutAction.java
deleted file mode 100644
index c828883..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/CutAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.StyledText;
-
-/**
- * Cuts the selected text in the rich text control to the clipboard.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class CutAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CutAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_CUT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_CUT);
-		setToolTipText(RichTextResources.cutAction_toolTipText); 
-	}
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in source edit mode.
-	 */
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			if (richText instanceof RichTextEditor
-					&& ((RichTextEditor) richText).isHTMLTabSelected()) {
-				StyledText styledText = ((RichTextEditor) richText)
-						.getSourceEdit();
-				styledText.cut();
-			} else {
-				richText.setCopyURL();
-				richText.executeCommand(RichTextCommand.CUT);
-			}
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FindReplaceAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FindReplaceAction.java
deleted file mode 100644
index 2ae35f2..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FindReplaceAction.java
+++ /dev/null
@@ -1,378 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.common.utils.XMLUtil;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextPlugin;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.dialogs.FindReplaceDialog;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Finds and replaces text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class FindReplaceAction extends RichTextAction {
-
-	/**
-	 * Finds text sub action.
-	 */
-	public static final int FIND_TEXT = 1;
-
-	/**
-	 * Replaces text sub action.
-	 */
-	public static final int REPLACE_TEXT = 2;
-
-	/**
-	 * Replaces and finds text sub action.
-	 */
-	public static final int REPLACE_FIND_TEXT = 3;
-
-	/**
-	 * Replaces all sub action.
-	 */
-	public static final int REPLACE_ALL_TEXT = 4;
-
-	/**
-	 * Find match in a forward direction.
-	 */
-	public static final int FORWARD_MATCH = 1;
-
-	/**
-	 * Find match in a backward direction.
-	 */
-	public static final int BACKWARD_MATCH = -1;
-
-	/**
-	 * Whole word match.
-	 */
-	public static final int WHOLE_WORD_MATCH = 2;
-
-	/**
-	 * Case sensitive match.
-	 */
-	public static final int CASE_SENSITIVE_MATCH = 4;
-
-	// Encoded single quote.
-	private static final String ENCODED_SINGLE_QUOTE = "%sq%"; //$NON-NLS-1$
-
-	private IRichText richText;
-
-	private StyledText styledText;
-
-	protected boolean foundMatch = false;
-	
-	// the dialog instance
-	protected FindReplaceDialog dialog;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public FindReplaceAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_FIND_REPLACE);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_FIND_REPLACE);
-		setToolTipText(RichTextResources.findReplaceAction_toolTipText);
-	}
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in readonly mode.
-	 */
-	public boolean disableInReadOnlyMode() {
-		return false;
-	}
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in source edit mode.
-	 */
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (this.richText == null)
-			this.richText = richText;
-		if (this.richText != null) {
-			try {
-				if (dialog != null) {
-					dialog.setFindOnly(!this.richText.getEditable());
-					dialog.open();
-				} else {
-					dialog = new FindReplaceDialog(Display
-							.getCurrent().getActiveShell(), this, !this.richText
-							.getEditable());
-					dialog.open();
-				}
-			} catch (Exception e) {
-				RichTextPlugin.getDefault().getLogger().logError(e);
-			}
-		}
-	}
-
-	/**
-	 * Returns <code>true</code> if a match is found.
-	 * 
-	 * @return <code>true</code> if a match is found.
-	 */
-	public boolean getFoundMatch() {
-		return foundMatch;
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param subAction
-	 *            the sub action to execute
-	 * @param findText
-	 *            the find text
-	 * @param replaceText
-	 *            the replace text
-	 * @param matchDir
-	 *            the match direction; the value can either be
-	 *            <code>FIND_FORWARD</code> or <code>FIND_BACKWARD</code>.
-	 * @param matchOptions
-	 *            the match options
-	 */
-	public void run(int subAction, String findText, String replaceText,
-			int matchDir, int matchOptions) {
-		styledText = null;
-		if (richText instanceof RichTextEditor
-				&& ((RichTextEditor) richText).isHTMLTabSelected()) {
-			styledText = ((RichTextEditor) richText).getSourceEdit();
-		}
-		if (styledText == null) {
-			if (findText.indexOf("'") != -1) { //$NON-NLS-1$
-				findText = findText.replaceAll("'", ENCODED_SINGLE_QUOTE); //$NON-NLS-1$
-			}
-			if (replaceText.indexOf("'") != -1) { //$NON-NLS-1$
-				replaceText = replaceText.replaceAll("'", ENCODED_SINGLE_QUOTE); //$NON-NLS-1$
-			}
-		}
-		try {
-			foundMatch = false;
-			int status = 0;
-			switch (subAction) {
-			case FIND_TEXT:
-				status = findText(findText, matchDir, matchOptions);
-				break;
-			case REPLACE_TEXT:
-				status = replaceText(replaceText, matchDir, matchOptions);
-				break;
-			case REPLACE_FIND_TEXT:
-				status = replaceFindText(findText, replaceText, matchDir,
-						matchOptions);
-				break;
-			case REPLACE_ALL_TEXT:
-				replaceAll(findText, replaceText, matchOptions);
-				break;
-			}
-			if (status > 0)
-				foundMatch = true;
-		} catch (Exception e) {
-			RichTextPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/**
-	 * Escapes the given text.
-	 * 
-	 * @param text
-	 *            text to be escaped
-	 */
-	private static String escape(String text) {
-		if (text == null || text.length() == 0)
-			return ""; //$NON-NLS-1$
-		StringBuffer sb = new StringBuffer();
-		int textSize = text.length();
-		for (int i = 0; i < textSize; i++) {
-			char ch = text.charAt(i);
-			switch (ch) {
-			case '<':
-				sb.append(XMLUtil.XML_LT);
-				break;
-			case '>':
-				sb.append(XMLUtil.XML_GT);
-				break;
-			case '&':
-				sb.append(XMLUtil.XML_AMP);
-				break;
-			default:
-				sb.append(ch);
-				break;
-			}
-		}
-		return sb.toString();
-	}
-
-	private int findText(String findText, int matchDir, int matchOptions) {
-		int status = 0;
-		if (styledText != null) {
-			status = styledTextFindTextAndSelect(findText, matchDir,
-					matchOptions);
-		} else {
-			status = richText
-					.executeCommand(RichTextCommand.FIND_TEXT, new String[] {
-							findText, "" + matchDir, "" + matchOptions }); //$NON-NLS-1$ //$NON-NLS-2$				
-		}
-		return status;
-	}
-
-	private int replaceText(String replaceText, int matchDir, int matchOptions) {
-		int status = 0;
-		if (styledText != null) {
-			status = styledTextReplaceTextAndSelect(replaceText);
-		} else {
-			status = richText.executeCommand(RichTextCommand.REPLACE_TEXT,
-					new String[] { replaceText,
-							"" + matchDir, "" + matchOptions }); //$NON-NLS-1$ //$NON-NLS-2$					
-		}
-		return status;
-	}
-
-	private int replaceFindText(String findText, String replaceText,
-			int matchDir, int matchOptions) {
-		int status = 0;
-		if (styledText != null) {
-			styledTextReplaceTextAndSelect(replaceText);
-			status = styledTextFindTextAndSelect(findText, matchDir,
-					matchOptions);
-		} else {
-			richText.executeCommand(RichTextCommand.REPLACE_TEXT, new String[] {
-					replaceText, "" + matchDir, "" + matchOptions }); //$NON-NLS-1$ //$NON-NLS-2$
-			status = richText
-					.executeCommand(RichTextCommand.FIND_TEXT, new String[] {
-							findText, "" + matchDir, "" + matchOptions }); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return status;
-	}
-
-	private void replaceAll(String findText, String replaceText,
-			int matchOptions) {
-		if (styledText != null) {
-			styledTextReplaceAll(findText, replaceText, matchOptions);
-		} else {
-			richText.executeCommand(RichTextCommand.REPLACE_ALL_TEXT,
-					new String[] { escape(findText), escape(replaceText),
-							"" + matchOptions }); //$NON-NLS-1$
-		}
-	}
-
-	private int styledTextFindTextAndSelect(String findText, int matchDir,
-			int matchOptions) {
-		Point selectionOffset = styledText.getSelectionRange();
-		int firstSelectedOffset = selectionOffset.x;
-		int lastSelectedOffset = selectionOffset.x + selectionOffset.y - 1;
-		String htmlText = styledText.getText();
-		int indexOfMatch = -1;
-		if ((matchOptions & CASE_SENSITIVE_MATCH) == 0) {
-			// TODO: use toUpperCase(Locale) once library has locale attribute
-			htmlText = htmlText.toUpperCase();
-			findText = findText.toUpperCase();
-		}
-		do {
-			if (indexOfMatch != -1) {
-				lastSelectedOffset = indexOfMatch + 1;
-				firstSelectedOffset = indexOfMatch - 1;
-			}
-			if (matchDir == FORWARD_MATCH) {
-				indexOfMatch = htmlText.indexOf(findText,
-						lastSelectedOffset + 1);
-			} else {
-				indexOfMatch = htmlText.lastIndexOf(findText,
-						firstSelectedOffset - 1);
-			}
-		} while (indexOfMatch != -1
-				&& ((matchOptions & WHOLE_WORD_MATCH) == WHOLE_WORD_MATCH)
-				&& isPartOfWord(htmlText, indexOfMatch, findText.length()));
-		if (indexOfMatch != -1) {
-			styledText.setSelectionRange(indexOfMatch, findText.length());
-			styledText.showSelection();
-		} else {
-			String selectedText = styledText.getSelectionText();
-			if ((matchOptions & CASE_SENSITIVE_MATCH) == 0) {
-				selectedText = selectedText.toUpperCase();
-			}
-			if (selectedText.equals(findText)) {
-				indexOfMatch = styledText.getSelectionRange().x;
-			}
-		}
-		return indexOfMatch;
-
-	}
-
-	private int styledTextReplaceTextAndSelect(String replaceText) {
-		Point selectionOffset = styledText.getSelectionRange();
-		styledText.replaceTextRange(selectionOffset.x, selectionOffset.y,
-				replaceText);
-		styledText.setSelectionRange(selectionOffset.x, replaceText.length());
-
-		return 1;
-	}
-
-	private void styledTextReplaceAll(String findText, String replaceText,
-			int matchOptions) {
-		styledText.setSelectionRange(0, 0);
-		while (styledTextFindTextAndSelect(findText, FORWARD_MATCH,
-				matchOptions) != -1) {
-			styledTextReplaceTextAndSelect(replaceText);
-		}
-	}
-
-	private boolean isWordChar(char c) {
-		if (Character.isLetterOrDigit(c))
-			return true;
-		return false;
-	}
-
-	private boolean isPartOfWord(String text, int index, int length) {
-		if (index > 0)
-			if (isWordChar(text.charAt(index - 1)))
-				return true;
-		if (text.length() >= index + length)
-			if (isWordChar(text.charAt(index + length)))
-				return true;
-		return false;
-	}
-
-	public IRichText getRichText() {
-		return richText;
-	}
-
-	public void setRichText(IRichText richText) {
-		this.richText = richText;
-	}
-	
-	public void dispose() {
-		if (dialog != null) {
-			dialog.close();
-			dialog = null;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontNameAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontNameAction.java
deleted file mode 100644
index d31c5af..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontNameAction.java
+++ /dev/null
@@ -1,111 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Sets the font name for the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class FontNameAction extends RichTextComboAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public FontNameAction(final IRichText richText) {
-		super(richText);
-		setToolTipText(RichTextResources.fontNameAction_toolTipText);
-		// get system fonts
-		SortedSet<String> fontSet = new TreeSet<String>();
-		FontData[] fonts = Display.getCurrent().getFontList(null, true);
-		for (int i = 0; i < fonts.length; i++) {
-			fontSet.add(((FontData) fonts[i]).getName());
-		}
-		input = new ArrayList<String>();
-		input.add(RichTextResources.fontNameAction_DefaultFontName);
-		for (Iterator<String> iter = fontSet.iterator(); iter.hasNext();) {
-			String fontName = iter.next();
-			input.add(fontName);
-		}
-		
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				String fontName = richText.getSelected().getFontName();
-				if (fontName
-						.equals(RichTextResources.fontNameAction_CSS_Default)
-						|| fontName
-								.equals(RichTextResources.fontNameAction_CSS_Default_Mozilla)
-						|| fontName.equals("default")) { //$NON-NLS-1$
-					fontName = RichTextResources.fontNameAction_DefaultFontName;
-				}
-				int index = findFontNameInItems(fontName);
-				setNotifyListeners(false);
-				getCCombo().select(index);
-				setNotifyListeners(true);
-			}
-		});
-	}
-
-	private int findFontNameInItems(String fontName) {
-		int index = -1;
-		for (Iterator<String> iter = input.iterator(); iter.hasNext();) {
-			String font = iter.next();
-			index++;
-			if (font.equalsIgnoreCase(fontName)) {
-				return index;
-			}
-		}
-		return -1;
-	}
-	
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 * @param index
-	 *            the index of the selected item
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			String selected = getCComboSelection();
-			if (selected.equals(RichTextResources.fontNameAction_DefaultFontName)) {
-				richText.executeCommand(RichTextCommand.SET_FONT_NAME, ""); //$NON-NLS-1$
-			} else {
-				richText.executeCommand(RichTextCommand.SET_FONT_NAME, selected);
-			}
-		}
-	}
-
-	@Override
-	public Collection<String> getInput() {
-		return input;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontSizeAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontSizeAction.java
deleted file mode 100644
index aa8fcb1..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontSizeAction.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Sets the font size for the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class FontSizeAction extends RichTextComboAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public FontSizeAction(final IRichText richText) {
-		super(richText);
-		setToolTipText(RichTextResources.fontSizeAction_toolTipText);
-		input = new ArrayList<String>();
-
-		input.add("Default"); //$NON-NLS-1$
-		input.add("1"); //$NON-NLS-1$
-		input.add("2"); //$NON-NLS-1$
-		input.add("3"); //$NON-NLS-1$
-		input.add("4"); //$NON-NLS-1$
-		input.add("5"); //$NON-NLS-1$
-		input.add("6"); //$NON-NLS-1$
-		input.add("7"); //$NON-NLS-1$		
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				// mozilla returns "default" if no size is applied
-				// IE returns 2 if no size is applied
-				String fontSize = richText.getSelected().getFontSize();
-				int index = -1;
-				if (fontSize.equals("default")) { //$NON-NLS-1$
-					index = 0;
-				} else {
-					try {
-						index = Integer.parseInt(fontSize);
-					} catch (NumberFormatException e) {
-						// leave index at -1 so nothing is selected
-					}
-				}
-				setNotifyListeners(false);
-				getCCombo().select(index);
-				setNotifyListeners(true);
-			}
-		});
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 * @param index
-	 *            the index of the selected item
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			String selected = getCComboSelection();
-			if ("Default".equals(selected)) { //$NON-NLS-1$
-				richText.executeCommand(RichTextCommand.SET_FONT_SIZE, ""); //$NON-NLS-1$
-			} else {
-				richText.executeCommand(RichTextCommand.SET_FONT_SIZE,
-						selected);
-			}
-		}
-	}
-
-	@Override
-	public Collection<String> getInput() {
-		return input;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontStyleAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontStyleAction.java
deleted file mode 100644
index 15b5ad5..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/FontStyleAction.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.html.FontStyle;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Sets the font style for the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class FontStyleAction extends RichTextComboAction {
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public FontStyleAction(final IRichText richText) {
-		super(richText);
-		setToolTipText(RichTextResources.fontStyleAction_toolTipText);
-		
-		input = new ArrayList<String>();
-		input.add(FontStyle.NORMAL.getName());
-		input.add(FontStyle.SECTION_HEADING.getName());
-		input.add(FontStyle.SUBSECTION_HEADING.getName());
-		input.add(FontStyle.SUB_SUBSECTION_HEADING.getName());
-		input.add(FontStyle.QUOTE.getName());
-		input.add(FontStyle.CODE_SAMPLE.getName());
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				String blockStyle = richText.getSelected().getBlockStyle();
-				String name = FontStyle.getFontStyleName(blockStyle);
-				
-				int index = ((List<String>)input).indexOf(name);
-				setNotifyListeners(false);
-				getCCombo().select(index);
-				setNotifyListeners(true);
-			}
-		});
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 * @param index
-	 *            the index of the selected item
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			String selected = getCComboSelection();
-			String value = FontStyle.getFontStyleValue(selected);
-			richText.executeCommand(RichTextCommand.SET_FONT_STYLE, value);
-		}
-	}
-
-	@Override
-	public Collection<String> getInput() {
-		return input;
-	}
-
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IBaseRichTextAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IBaseRichTextAction.java
deleted file mode 100644
index e9bb042..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IBaseRichTextAction.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-/**
- * The base interface for a rich text action.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface IBaseRichTextAction {
-
-	/**
-	 * Returns the tool tip for the action.
-	 * 
-	 * @return the tool tip text
-	 */
-	public String getToolTipText();
-
-	/**
-	 * Sets the tool tip for the action.
-	 * 
-	 * @param toolTipText
-	 *            the tool tip text
-	 */
-	public void setToolTipText(String toolTipText);
-
-	/**
-	 * Returns the enabled status of the action.
-	 * 
-	 * @return <code>true</code> if enabled, <code>false</code> if not
-	 */
-	public boolean getEnabled();
-
-	/**
-	 * Enables or disables the action.
-	 * 
-	 * @param enabled
-	 *            If <code>true</code>, enable the action. if
-	 *            <code>false</code>, disable it
-	 */
-	public void setEnabled(boolean enabled);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IRichTextAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IRichTextAction.java
deleted file mode 100644
index dc0a51e..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IRichTextAction.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * The interface for a rich text button action.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public interface IRichTextAction extends IBaseRichTextAction {
-
-	/**
-	 * Returns the image for the action.
-	 * 
-	 * @return the image for the action
-	 */
-	public Image getImage();
-
-	/**
-	 * Sets the image for the action.
-	 * 
-	 * @param image
-	 *            the image for the action
-	 */
-	public void setImage(Image image);
-
-	/**
-	 * Returns the disabled image for the action.
-	 * 
-	 * @return the disabled image for the action
-	 */
-	public Image getDisabledImage();
-
-	/**
-	 * Sets the disabled image for the action.
-	 * 
-	 * @param image
-	 *            the disabled image for the action
-	 */
-	public void setDisabledImage(Image image);
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in readonly mode.
-	 */
-	public boolean disableInReadOnlyMode();
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in source edit mode.
-	 */
-	public boolean disableInSourceMode();
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText);
-	
-	/**
-	 * Sets the action's ToolItem
-	 * @param toolItem
-	 */
-	public void setToolItem(ToolItem toolItem);
-	
-	/**
-	 * Gets the SWT ToolItem Style to be used for this action
-	 */
-	public int getStyle();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IRichTextComboAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IRichTextComboAction.java
deleted file mode 100644
index 5cfe5c8..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IRichTextComboAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.ui.actions.CComboContributionItem;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-
-/**
- * The interface for a rich text combo action.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- * 
- * @deprecated unused
- */
-public interface IRichTextComboAction extends IBaseRichTextAction {
-
-//	/**
-//	 * Adds an item.
-//	 * 
-//	 * @param item
-//	 *            the item to be added
-//	 */
-//	public void addItem(String item);
-//
-//	/**
-//	 * Returns all items.
-//	 * 
-//	 * @return an array of items
-//	 */
-//	public String[] getItems();
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 * @param index
-	 *            the index of the selected item
-	 */
-	public void execute(IRichText richText, int index);
-
-	public IStructuredContentProvider getContentProvider();
-	
-	public ILabelProvider getLabelProvider();
-	
-	public Object getInput();
-	
-	/**
-	 * Sets the action's ContributionItem
-	 * 
-	 */
-	public void setContributionItem(CComboContributionItem item);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IndentAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IndentAction.java
deleted file mode 100644
index 10d64e7..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/IndentAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Indents the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class IndentAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public IndentAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_INDENT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_INDENT);
-		setToolTipText(RichTextResources.indentAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.INDENT);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/ItalicAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/ItalicAction.java
deleted file mode 100644
index 6587c47..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/ItalicAction.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Toggles the 'italic' attribute of the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class ItalicAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ItalicAction(final IRichText richText) {
-		super(richText, IAction.AS_CHECK_BOX);
-		setImageDescriptor(RichTextImages.IMG_DESC_ITALIC);
-		setToolTipText(RichTextResources.italicAction_toolTipText);
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				setChecked(richText.getSelected().isItalic());
-			}
-		});
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.ITALIC);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyCenterAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyCenterAction.java
deleted file mode 100644
index e61b974..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyCenterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Center justifies the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class JustifyCenterAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public JustifyCenterAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_JUSTIFY_CENTER);
-		setToolTipText(RichTextResources.justifyCenterAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.JUSTIFY_CENTER);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyFullAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyFullAction.java
deleted file mode 100644
index 4e2b117..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyFullAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Fully justifies the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class JustifyFullAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public JustifyFullAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_JUSTIFY_FULL);
-		setToolTipText(RichTextResources.justifyFullAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.JUSTIFY_FULL);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyLeftAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyLeftAction.java
deleted file mode 100644
index 0d9159e..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyLeftAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Left justifies the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class JustifyLeftAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public JustifyLeftAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_JUSTIFY_LEFT);
-		setToolTipText(RichTextResources.justifyLeftAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.JUSTIFY_LEFT);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyRightAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyRightAction.java
deleted file mode 100644
index 73e08562..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/JustifyRightAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Right justifies the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class JustifyRightAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public JustifyRightAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_JUSTIFY_RIGHT);
-		setToolTipText(RichTextResources.justifyRightAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.JUSTIFY_RIGHT);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/OutdentAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/OutdentAction.java
deleted file mode 100644
index b5a9573..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/OutdentAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Indents the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class OutdentAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public OutdentAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_OUTDENT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_OUTDENT);
-		setToolTipText(RichTextResources.outdentAction_toolTipText); 
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.OUTDENT);
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/PasteAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/PasteAction.java
deleted file mode 100644
index 5918dfd..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/PasteAction.java
+++ /dev/null
@@ -1,237 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.io.File;
-import java.net.URL;
-import java.util.Stack;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.common.ui.util.ClipboardUtil;
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.NetUtil;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextPlugin;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.HTMLTransfer;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * Pastes text from the clipboard onto a rich text control.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class PasteAction extends RichTextAction {
-
-	private static final String SOURCE_URL = "SourceURL:"; //$NON-NLS-1$
-
-	private static final String HTM_EXT = ".htm"; //$NON-NLS-1$
-
-	private static final String HTML_EXT = ".html"; //$NON-NLS-1$
-
-	private static final Pattern HREF_REFERENCES = Pattern
-			.compile(
-					"href\\s*=\\s*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	protected static final Pattern p_image_ref = Pattern
-			.compile(
-					"(<(img|iframe).*?src\\s*=\\s*\")(.*?)(\")", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); //$NON-NLS-1$
-
-	protected static String sourceURLStr = ""; //$NON-NLS-1$
-
-	private Logger logger;
-	
-	private static String RESOURCES = "resources"; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public PasteAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_PASTE);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_PASTE);
-		setToolTipText(RichTextResources.pasteAction_toolTipText);
-		logger = RichTextPlugin.getDefault().getLogger();
-	}
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in source edit mode.
-	 */
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			copyLinkResources(richText);
-			if (richText instanceof RichTextEditor
-					&& ((RichTextEditor) richText).isHTMLTabSelected()) {
-				StyledText styledText = ((RichTextEditor) richText)
-						.getSourceEdit();
-				styledText.paste();
-			} else {
-				richText.executeCommand(RichTextCommand.PASTE, sourceURLStr);
-			}
-		}
-	}
-
-	/**
-	 * Copies the link resources.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	protected void copyLinkResources(IRichText richText) {
-		try {
-			sourceURLStr = ClipboardUtil.getHTMLSourceURL();
-			Clipboard clipboard = new Clipboard(Display.getCurrent());
-			String html = (String) clipboard.getContents(HTMLTransfer
-					.getInstance());
-			if (html != null && html.length() > 0) {
-				String basePath = richText.getBasePath();
-				URL sourceURL = null;
-				if (sourceURLStr == null || sourceURLStr.length() == 0
-						|| sourceURLStr.equals("about:blank")) { //$NON-NLS-1$
-					sourceURL = richText.getCopyURL();
-				} else {
-					sourceURL = new URL(sourceURLStr);
-				}
-
-				Matcher matcher = HREF_REFERENCES.matcher(html);
-				while (matcher.find()) {
-					String href = NetUtil.decodeURL(matcher.group(1));
-					try {
-						URL hrefURL = new URL(sourceURL, href);
-						String scheme = hrefURL.getProtocol();
-						if (scheme != null
-								&& scheme
-										.equalsIgnoreCase(NetUtil.FILE_SCHEME)) {
-							String url = hrefURL.getPath();
-							File srcFile = new File(NetUtil.decodeURL(url));
-							File tgtFile = null;
-							File tgtDir = null;
-							if (href.startsWith("#") || sourceURL.sameFile(hrefURL)) { //$NON-NLS-1$
-								continue;
-							} else if (href.startsWith(RESOURCES) || href.startsWith("./" + RESOURCES)) { //$NON-NLS-1$
-								tgtFile = new File(basePath, href);
-								tgtDir = tgtFile.getParentFile();
-							} else {
-								String resPath = getSubdirectoryOfResources(href);
-								tgtFile = new File(basePath + RESOURCES, resPath);
-								tgtDir = tgtFile;
-							}
-							tgtDir.mkdirs();
-							FileUtil.copyFile(srcFile, tgtDir);
-						}
-					} catch (Exception e) {
-						logger.logError(e);
-					}
-				}
-
-				matcher = p_image_ref.matcher(html);
-				while (matcher.find()) {
-					String src = NetUtil.decodeURL(matcher.group(3));
-					try {
-						URL srcURL = new URL(sourceURL, src);
-						String scheme = srcURL.getProtocol();
-						if (scheme != null
-								&& scheme.equalsIgnoreCase(NetUtil.FILE_SCHEME)) {
-							File srcFile = null;
-							String authority = srcURL.getAuthority();
-							if (authority != null) {
-								srcFile = new File(NetUtil.decodeURL(authority + srcURL.getPath()));
-							} else {
-								srcFile = new File(NetUtil.decodeURL(srcURL.getPath()));
-							}
-							File tgtFile = null;
-							File tgtDir = null;
-							if (src.startsWith(RESOURCES) || src.startsWith("./" + RESOURCES)) { //$NON-NLS-1$
-								tgtFile = new File(basePath, src);
-								tgtDir = tgtFile.getParentFile();
-							} else {
-								String resPath = getSubdirectoryOfResources(src);
-								tgtFile = new File(basePath + RESOURCES, resPath);
-								tgtDir = tgtFile;
-							}
-							tgtDir.mkdirs();
-							FileUtil.copyFile(srcFile, tgtDir);
-						}
-					} catch (Exception e) {
-						logger.logError(e);
-					}
-				}
-			}
-		} catch (Exception e) {
-			logger.logError(e);
-		}
-	}
-
-	/**
-	 * Parses the given HTML content from the clipboard and returns the source
-	 * URL.
-	 * 
-	 * @param htmlContent
-	 *            the HTML content from the clipboard
-	 * @return the source URL or <code>null</code>
-	 */
-	protected String getSourceURL(String htmlContent) {
-		String sourceURL = null;
-		int sourceURLIndex = htmlContent.indexOf(SOURCE_URL);
-		if (sourceURLIndex > 0) {
-			sourceURL = htmlContent.substring(sourceURLIndex
-					+ SOURCE_URL.length());
-			sourceURL = sourceURL.substring(0, sourceURL
-					.indexOf(FileUtil.LINE_SEP));
-			if (sourceURL.toLowerCase().endsWith(HTM_EXT)
-					|| sourceURL.toLowerCase().endsWith(HTML_EXT)) {
-				sourceURL = sourceURL.substring(0, sourceURL.indexOf(FileUtil
-						.getFileName(sourceURL)) - 1);
-				sourceURL = sourceURL.replace('\\', '/');
-			}
-			sourceURL = FileUtil.appendSeparator(sourceURL, "/"); //$NON-NLS-1$
-		}
-		return sourceURL;
-	}
-
-	protected String getSubdirectoryOfResources(String path) {
-		String result = ""; //$NON-NLS-1$
-		int res_idx = path.indexOf(RESOURCES);
-		if (res_idx != -1) {
-			Stack<String> stack = new Stack<String>();
-			File relative = new File(path).getParentFile();
-			while (!relative.getName().equals(RESOURCES)) {
-				stack.push(relative.getName());
-				relative = relative.getParentFile();
-			}
-			while (!stack.isEmpty()) {
-				result = result + (String)stack.pop() + File.separator;
-			}
-		} 
-		return result;
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/PastePlainTextAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/PastePlainTextAction.java
deleted file mode 100644
index 8dc71cf..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/PastePlainTextAction.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.widgets.Display;
-
-public class PastePlainTextAction extends RichTextAction {
-	
-	/**
-	 * Creates a new instance.
-	 */
-	public PastePlainTextAction(IRichText richText) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		setImageDescriptor(RichTextImages.IMG_DESC_PASTE_PLAIN_TEXT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_PASTE_PLAIN_TEXT);
-		setToolTipText(RichTextResources.pastePlainTextAction_toolTipText);
-		setEnabled(true);
-	}
-	
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in source edit mode.
-	 */
-	public boolean disableInSourceMode() {
-		return false;
-	}
-	
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			// get text from clipboard
-			Clipboard clipboard = new Clipboard(Display.getCurrent());
-			String text = (String) clipboard.getContents(TextTransfer
-					.getInstance());
-			if (text != null && text.length() > 0) {
-				text = StrUtil.convertNewlinesToHTML(text);
-				if (richText instanceof RichTextEditor) {
-					((RichTextEditor)richText).addHTML(text);
-				} else {
-					richText.executeCommand(RichTextCommand.ADD_HTML, text);
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/RichTextAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/RichTextAction.java
deleted file mode 100644
index 215fbc2..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/RichTextAction.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * The abstract implementation of a rich text action.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public abstract class RichTextAction extends Action {
-
-	protected IRichText richText;
-	
-	protected ToolItem toolItem;
-	
-	protected Collection<IAction> fMenuActions = new LinkedHashSet<IAction>();
-	
-    protected IMenuCreator menuCreator = new IMenuCreator() {
-
-    	private MenuManager dropDownMenuMgr;
-
-        /**
-         * Creates the menu manager for the drop-down.
-         */
-        private void createDropDownMenuMgr() {
-            if (dropDownMenuMgr == null) {
-                dropDownMenuMgr = new MenuManager();
-                for (Iterator<IAction> iter = getMenuActions().iterator();iter.hasNext();) {
-                	IAction item = iter.next();
-                    dropDownMenuMgr.add(item);
-                }
-            }
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-         */
-        public Menu getMenu(Control parent) {
-            createDropDownMenuMgr();
-            return dropDownMenuMgr.createContextMenu(parent);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-         */
-        public Menu getMenu(Menu parent) {
-            createDropDownMenuMgr();
-            Menu menu = new Menu(parent);
-            IContributionItem[] items = dropDownMenuMgr.getItems();
-            for (int i = 0; i < items.length; i++) {
-                IContributionItem item = items[i];
-                IContributionItem newItem = item;
-                if (item instanceof ActionContributionItem) {
-                    newItem = new ActionContributionItem(
-                            ((ActionContributionItem) item).getAction());
-                }
-                newItem.fill(menu, -1);
-            }
-            return menu;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.action.IMenuCreator#dispose()
-         */
-        public void dispose() {
-            if (dropDownMenuMgr != null) {
-                dropDownMenuMgr.dispose();
-                dropDownMenuMgr = null;
-            }
-        }
-    };
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public RichTextAction(IRichText richText, int style) {
-		super(null, style);
-		this.richText = richText;
-	}
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in readonly mode.
-	 */
-	public boolean disableInReadOnlyMode() {
-		return true;
-	}
-
-	/**
-	 * Returns <code>true</code> if this action should be disabled when the
-	 * rich text editor is in source edit mode.
-	 */
-	public boolean disableInSourceMode() {
-		return true;
-	}
-
-	public void setToolItem(ToolItem toolItem) {
-		this.toolItem = toolItem;
-	}
-	
-	@Override
-	public void run() {
-		execute(richText);
-	}
-	
-	@Override
-	public String getId() {
-		return getClass().getCanonicalName();
-	}
-	
-	public Collection<IAction> getMenuActions() {
-		return fMenuActions;
-	}
-	
-	public void addActionToMenu(IAction action) {
-		fMenuActions.add(action);
-	}
-	
-	public abstract void execute(IRichText richText);
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/RichTextComboAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/RichTextComboAction.java
deleted file mode 100644
index 046d177..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/RichTextComboAction.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.util.Collection;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.ui.actions.CComboContributionItem;
-import org.eclipse.swt.SWT;
-
-/**
- * The abstract implementation of a rich text combo action.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public abstract class RichTextComboAction extends CComboContributionItem {
-	
-	protected IRichText richText;
-	
-	protected String toolTipText;
-
-	protected boolean enabled = true;
-	
-	protected boolean notifyListeners = false;
-
-	
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public RichTextComboAction(IRichText richText) {
-		super(SWT.READ_ONLY | SWT.FLAT | SWT.BORDER);
-		this.richText = richText;
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public RichTextComboAction(IRichText richText, int style) {
-		super(SWT.READ_ONLY | SWT.FLAT | SWT.BORDER | style);
-		this.richText = richText;
-	}
-
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 * @param index
-	 *            the index of the selected item
-	 */
-	public abstract void execute(IRichText richText);
-	
-	public abstract Collection<String> getInput();
-	
-	public void init() {
-		setInput(getInput());
-		setNotifyListeners(true);
-	}
-	
-	protected String getCComboSelection() {
-		if (getCCombo() != null) {
-			int index = getSelectionIndex();
-			return getCCombo().getItem(index);
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the tool tip for the action.
-	 * 
-	 * @return the tool tip text
-	 */
-	public String getToolTipText() {
-		return toolTipText;
-	}
-
-	/**
-	 * Sets the tool tip for the action.
-	 * 
-	 * @param toolTipText
-	 *            the tool tip text
-	 */
-	public void setToolTipText(String toolTipText) {
-		this.toolTipText = toolTipText;
-	}
-
-	/**
-	 * Returns the enabled status of the action.
-	 * 
-	 * @return <code>true</code> if enabled, <code>false</code> if not
-	 */
-	public boolean getEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * Enables or disables the action.
-	 * 
-	 * @param enabled
-	 *            if <code>true</code>, enable the action. if
-	 *            <code>false</code>, disable it.
-	 */
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-	
-	@Override
-	protected void performSelectionChanged() {
-		if (notifyListeners) {
-			execute(richText);
-		}
-	}
-
-	public boolean isNotifyListeners() {
-		return notifyListeners;
-	}
-
-	public void setNotifyListeners(boolean notifyListeners) {
-		this.notifyListeners = notifyListeners;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/SubscriptAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/SubscriptAction.java
deleted file mode 100644
index 725c0da..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/SubscriptAction.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Toggles the subscript attribute of the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class SubscriptAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SubscriptAction(final IRichText richText) {
-		super(richText, IAction.AS_CHECK_BOX);
-		setImageDescriptor(RichTextImages.IMG_DESC_SUBSCRIPT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_SUBSCRIPT);
-		setToolTipText(RichTextResources.subscriptAction_toolTipText);
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				setChecked(richText.getSelected().isSubscript());
-			}
-		});
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.SUBSCRIPT);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/SuperscriptAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/SuperscriptAction.java
deleted file mode 100644
index 47f44e6..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/SuperscriptAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Toggles the superscript attribute of the selected text in a rich text
- * control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class SuperscriptAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SuperscriptAction(final IRichText richText) {
-		super(richText, IAction.AS_CHECK_BOX);
-		setImageDescriptor(RichTextImages.IMG_DESC_SUPERSCRIPT);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_SUPERSCRIPT);
-		setToolTipText(RichTextResources.superscriptAction_toolTipText);
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				setChecked(richText.getSelected().isSuperscript());
-			}
-		});
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.SUPERSCRIPT);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/TidyAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/TidyAction.java
deleted file mode 100644
index 77ece16..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/TidyAction.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.epf.common.html.HTMLFormatter;
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextEditor;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextPlugin;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Runs JTidy on the HTML
- * 
- * @author Jeff Hardy
- * @since 1.2
- */
-public class TidyAction extends RichTextAction {
-	
-	boolean forceOutput = false;
-	boolean makeBare = false;
-	boolean word2000 = false;
-	
-	// The HTML source formatter.
-	protected HTMLFormatter htmlFormatter;
-
-	
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TidyAction(IRichText richText, boolean forceOutput, boolean makeBare, boolean word2000) {
-		super(richText, IAction.AS_PUSH_BUTTON);
-		this.forceOutput = forceOutput;
-		this.makeBare = makeBare;
-		this.word2000 = word2000;
-		setImageDescriptor(RichTextImages.IMG_DESC_TIDY);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_TIDY);
-		htmlFormatter = new HTMLFormatter();
-	}
-	
-	@Override
-	public void execute(IRichText richText) {
-		// get current text
-		String html;
-		if (richText instanceof RichTextEditor) {
-			html = ((RichTextEditor)richText).getText();
-		} else {
-			html = richText.getText();
-		}
-		// call JTidy with the options
-		try {
-			html = htmlFormatter.formatHTML(html, false, forceOutput, makeBare, word2000);
-		} catch (UnsupportedEncodingException e) {
-			RichTextPlugin.getDefault().getLogger().logError(e);
-		}
-		// set text
-		if (richText instanceof RichTextEditor) {
-			((RichTextEditor)richText).setText(html);
-		} else {
-			richText.setText(html);
-		}
-		richText.checkModify();
-		
-	}
-	
-	@Override
-	public boolean disableInSourceMode() {
-		return false;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/TidyActionGroup.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/TidyActionGroup.java
deleted file mode 100644
index 668cab3..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/TidyActionGroup.java
+++ /dev/null
@@ -1,72 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-
-/**
- * Runs JTidy on the HTML
- * 
- * @author Jeff Hardy
- * @since 1.2
- */
-public class TidyActionGroup extends RichTextAction {
-	
-	TidyAction tidyActionDefault;
-	TidyAction tidyActionCleanMS;
-	TidyAction tidyActionCleanWord2000;
-
-	public TidyActionGroup(IRichText richText) {
-		super(richText, IAction.AS_DROP_DOWN_MENU);
-		// TODO need image
-		setImageDescriptor(RichTextImages.IMG_DESC_TIDY);
-		// TODO need image
-//		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_PASTE);
-		setToolTipText(RichTextResources.tidy_clean_text);
-		
-		createActions();
-		setMenuCreator(menuCreator);
-	}
-	
-	private void createActions() {
-		tidyActionDefault = new TidyAction(richText, true, false, false);
-		tidyActionDefault.setText(RichTextResources.tidy_clean_text);
-		tidyActionDefault.setToolTipText(RichTextResources.tidy_clean_toolTipText);
-		tidyActionCleanMS = new TidyAction(richText, true, true, false);
-		tidyActionCleanMS.setText(RichTextResources.tidy_cleaner_text);
-		tidyActionCleanMS.setToolTipText(RichTextResources.tidy_cleaner_toolTipText);
-		tidyActionCleanWord2000 = new TidyAction(richText, true, true, true);
-		tidyActionCleanWord2000.setText(RichTextResources.tidy_cleanest_text);
-		tidyActionCleanWord2000.setToolTipText(RichTextResources.tidy_cleanest_toolTipText);
-		addActionToMenu(tidyActionDefault);
-		addActionToMenu(tidyActionCleanMS);
-		addActionToMenu(tidyActionCleanWord2000);
-	}
-	
-	@Override
-	public void execute(IRichText richText) {
-		// TODO Auto-generated method stub
-		
-		// call normal clean
-		tidyActionDefault.execute(richText);
-
-	}
-	
-	@Override
-	public boolean disableInSourceMode() {
-		return false;
-	}
-
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/UnderlineAction.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/UnderlineAction.java
deleted file mode 100644
index 7e7db09..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/UnderlineAction.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.actions;
-
-import org.eclipse.epf.richtext.IRichText;
-import org.eclipse.epf.richtext.RichTextCommand;
-import org.eclipse.epf.richtext.RichTextImages;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * Toggles the underline attribute of the selected text in a rich text control.
- * 
- * @author Kelvin Low
- * @author Jeff Hardy
- * @since 1.0
- */
-public class UnderlineAction extends RichTextAction {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public UnderlineAction(final IRichText richText) {
-		super(richText, IAction.AS_CHECK_BOX);
-		setImageDescriptor(RichTextImages.IMG_DESC_UNDERLINE);
-		setDisabledImageDescriptor(RichTextImages.DISABLED_IMG_DESC_UNDERLINE);
-		setToolTipText(RichTextResources.underlineAction_toolTipText);
-		// add listener
-		richText.addListener(SWT.SELECTED, new Listener() {
-			public void handleEvent(Event event) {
-				setChecked(richText.getSelected().isUnderLine());
-			}
-		});
-	}
-
-	/**
-	 * Executes the action.
-	 * 
-	 * @param richText
-	 *            a rich text control
-	 */
-	public void execute(IRichText richText) {
-		if (richText != null) {
-			richText.executeCommand(RichTextCommand.UNDERLINE);
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/package.html b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/package.html
deleted file mode 100644
index 23d9e6e..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/actions/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides editing actions for the rich text control and editor.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddImageDialog.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddImageDialog.java
deleted file mode 100644
index 0c6a636..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddImageDialog.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.dialogs;
-
-import java.io.File;
-
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.html.Image;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Prompts the user to specify the image that will be used to create a HTML
- * &lt;image&gt; tag in the rich text editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddImageDialog extends BaseDialog {
-
-	protected Image image = new Image();
-
-	protected Text urlText;
-
-	protected Button browseButton;
-
-	protected SelectionAdapter browseSelectionAdapter = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent event) {
-			FileDialog dialog = new FileDialog(Display.getCurrent()
-					.getActiveShell(), SWT.OPEN);
-			dialog
-					.setFilterExtensions(new String[] {
-							"*.gif", "*.jpg", "*.bmp" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			String imageFile = dialog.open();
-			if (imageFile != null && imageFile.length() > 0) {
-				File file = new File(imageFile);
-				try {
-					String url = file.toURL().toExternalForm();
-					urlText.setText(url);
-				} catch (Exception e) {
-					logger.logError(e);
-				}
-			}
-		}
-	};
-
-	protected ModifyListener urlTextListener = new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			if (okButton != null) {
-				okButton.setEnabled(urlText.getText().trim().length() > 0);
-			}
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent shell
-	 */
-	public AddImageDialog(Shell parent) {
-		super(parent);
-	}
-
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.numColumns = 3;
-
-		Label urlLabel = new Label(composite, SWT.NONE);
-		urlLabel.setText(RichTextResources.urlLabel_text);
-		urlText = new Text(composite, SWT.BORDER);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.widthHint = 300;
-		urlText.setLayoutData(gridData);
-		urlText.addModifyListener(urlTextListener);
-
-		browseButton = new Button(composite, SWT.NONE);
-		browseButton.setText(RichTextResources.browseButton_text);
-		browseButton.addSelectionListener(browseSelectionAdapter);
-
-		super.getShell().setText(RichTextResources.addImageDialog_title);
-
-		return composite;
-	}
-
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		okButton.setEnabled(false);
-	}
-
-	@Override
-	protected void okPressed() {
-		String url = urlText.getText();
-		if (url != null && url.length() > 0) {
-			image.setURL(url);
-		}
-		super.okPressed();
-	}
-
-	/**
-	 * Gets the user specified image.
-	 * 
-	 * @return an <code>Image</code> object
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddLinkDialog.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddLinkDialog.java
deleted file mode 100644
index 8b76f0c..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddLinkDialog.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.dialogs;
-
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.html.Link;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Prompts the user to specify the file that will be used to create a HTML
- * &lt;a&gt; tag in the rich text editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddLinkDialog extends BaseDialog {
-
-	protected Link link = new Link();
-
-	protected Text urlText;
-
-	protected String basePath;
-
-	protected Composite composite;
-
-	protected Label urlLabel;
-
-	protected Text urlDisplayNameText;
-
-	protected Label urlDisplayNameLabel;
-
-	protected ModifyListener urlTextModifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent e) {
-			if (okButton != null) {
-				okButton.setEnabled(urlText.getText().trim().length() > 0);
-			}
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent shell
-	 */
-	public AddLinkDialog(Shell parent, String basePath) {
-		super(parent);
-		this.basePath = basePath;
-	}
-
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		composite = (Composite) super.createDialogArea(parent);
-
-		urlLabel = new Label(composite, SWT.NONE);
-		urlLabel.setText(RichTextResources.urlLabel_text);
-		urlText = new Text(composite, SWT.BORDER);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.widthHint = 300;
-		urlText.setLayoutData(gridData);
-		urlText.addModifyListener(urlTextModifyListener);
-
-		urlDisplayNameLabel = new Label(composite, SWT.NONE);
-		urlDisplayNameLabel.setText(RichTextResources.urlDisplayNameLabel_text);
-		urlDisplayNameText = new Text(composite, SWT.BORDER);
-		GridData gridData2 = new GridData(GridData.FILL_HORIZONTAL);
-		gridData2.widthHint = 300;
-		urlDisplayNameText.setLayoutData(gridData2);
-
-		super.getShell().setText(RichTextResources.addLinkDialog_title);
-
-		return composite;
-	}
-
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		okButton.setEnabled(false);
-	}
-
-	@Override
-	protected void okPressed() {
-		String url = urlText.getText();
-		if (url != null && url.length() > 0) {
-			link.setURL(url);
-			link.setName(urlDisplayNameText.getText());
-		}
-		super.okPressed();
-	}
-
-	/**
-	 * Gets the user specified link.
-	 * 
-	 * @return an <code>Link</code> object
-	 */
-	public Link getLink() {
-		return link;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddTableDialog.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddTableDialog.java
deleted file mode 100644
index d883d3c..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/AddTableDialog.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.dialogs;
-
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.html.Table;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Prompts the user to specify the attributes that will be used to create a HTML
- * &lt;table&gt; tag in the rich text editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class AddTableDialog extends BaseDialog {
-
-	private static final int DEFAULT_ROWS = 2;
-
-	private static final int DEFAULT_COLUMNS = 2;
-
-	private static final String DEFAULT_WIDTH = "85%"; //$NON-NLS-1$
-
-	private static final String[] TABLE_STYLE_LABELS = {
-			RichTextResources.tableHeaderNone_text,
-			RichTextResources.tableHeaderCols_text,
-			RichTextResources.tableHeaderRows_text,
-			RichTextResources.tableHeaderBoth_text, };
-
-	private Table table = new Table();
-
-	private Text rowsText;
-
-	private Text colsText;
-
-	private Text widthText;
-
-	private Combo tableTypeCombo;
-
-	private Text summaryText;
-
-	private Text captionText;
-
-	private ModifyListener modifyListener = new ModifyListener() {
-		public void modifyText(ModifyEvent event) {
-			if (okButton != null) {
-				try {
-					int rows = Integer.parseInt(rowsText.getText().trim());
-					int cols = Integer.parseInt(colsText.getText().trim());
-					String width = widthText.getText().trim();
-					okButton.setEnabled(rows > 0 && cols > 0
-							&& width.length() > 0);
-				} catch (Exception e) {
-					okButton.setEnabled(false);
-				}
-			}
-		}
-	};
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent shell
-	 */
-	public AddTableDialog(Shell parent) {
-		super(parent);
-	}
-
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-
-		Label rowsLabel = new Label(composite, SWT.NONE);
-		rowsLabel.setText(RichTextResources.rowsLabel_text);
-
-		rowsText = new Text(composite, SWT.BORDER);
-		rowsText.setTextLimit(2);
-		rowsText.setText("" + DEFAULT_ROWS); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			rowsText.setLayoutData(gridData);
-		}
-		rowsText.addModifyListener(modifyListener);
-
-		Label colsLabel = new Label(composite, SWT.NONE);
-		colsLabel.setText(RichTextResources.columnsLabel_text);
-
-		colsText = new Text(composite, SWT.BORDER);
-		colsText.setTextLimit(2);
-		colsText.setText("" + DEFAULT_COLUMNS); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			colsText.setLayoutData(gridData);
-		}
-		colsText.addModifyListener(modifyListener);
-
-		Label widthLabel = new Label(composite, SWT.NONE);
-		widthLabel.setText(RichTextResources.widthLabel_text);
-
-		widthText = new Text(composite, SWT.BORDER);
-		widthText.setText("" + DEFAULT_WIDTH); //$NON-NLS-1$
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			widthText.setLayoutData(gridData);
-		}
-		widthText.addModifyListener(modifyListener);
-
-		Label headerTypeLabel = new Label(composite, SWT.NONE);
-		headerTypeLabel.setText(RichTextResources.tableStyleLabel_text);
-
-		tableTypeCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
-		tableTypeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		tableTypeCombo.setItems(TABLE_STYLE_LABELS);
-		tableTypeCombo.setText(TABLE_STYLE_LABELS[0]);
-
-		Label summaryLabel = new Label(composite, SWT.NONE);
-		summaryLabel.setText(RichTextResources.summaryLabel_text);
-		summaryText = new Text(composite, SWT.BORDER);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			summaryText.setLayoutData(gridData);
-		}
-
-		Label captionLabel = new Label(composite, SWT.NONE);
-		captionLabel.setText(RichTextResources.captionLabel_text);
-		captionText = new Text(composite, SWT.BORDER);
-		{
-			GridData gridData = new GridData(GridData.FILL_HORIZONTAL
-					| GridData.GRAB_HORIZONTAL);
-			captionText.setLayoutData(gridData);
-		}
-
-		super.getShell().setText(RichTextResources.addTableDialog_title);
-
-		return composite;
-	}
-
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-	}
-
-	@Override
-	protected void okPressed() {
-		String rowsValue = rowsText.getText();
-		if (rowsValue != null && rowsValue.length() > 0) {
-			try {
-				int rows = Integer.parseInt(rowsValue);
-				table.setRows(rows);
-			} catch (Exception e) {
-				table.setRows(DEFAULT_ROWS);
-			}
-		}
-
-		String colsValue = colsText.getText();
-		if (colsValue != null && colsValue.length() > 0) {
-			try {
-				int cols = Integer.parseInt(colsValue);
-				table.setColumns(cols);
-			} catch (Exception e) {
-				table.setColumns(DEFAULT_COLUMNS);
-			}
-		}
-
-		String widthValue = widthText.getText();
-		if (widthValue != null && widthValue.length() > 0) {
-			table.setWidth(widthValue);
-		} else {
-			table.setWidth(DEFAULT_WIDTH);
-		}
-
-		table.setSummary(summaryText.getText().trim());
-		table.setCaption(captionText.getText().trim());
-		table.setTableHeaders(tableTypeCombo.getSelectionIndex());
-
-		super.okPressed();
-	}
-
-	/**
-	 * Gets the user specified table.
-	 * 
-	 * @return an <code>Table</code> object
-	 */
-	public Table getTable() {
-		return table;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/BaseDialog.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/BaseDialog.java
deleted file mode 100644
index 6cc39c8..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/BaseDialog.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.dialogs;
-
-import org.eclipse.epf.common.serviceability.Logger;
-import org.eclipse.epf.richtext.RichTextPlugin;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.Shell;
-
-/**
- * The base class for all dialogs used by the rich text editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class BaseDialog extends Dialog {
-
-	// A logger for logging runtime warnings and errors.
-	protected Logger logger;
-
-	// The OK button.
-	protected Button okButton;
-
-	// The Cancel button.
-	protected Button cancelButton;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent shell
-	 */
-	public BaseDialog(Shell parent) {
-		super(parent);
-		logger = RichTextPlugin.getDefault().getLogger();
-	}
-
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-		layout.numColumns = 2;
-		GridData gridData = (GridData) composite.getLayoutData();
-		gridData.verticalIndent = 10;
-		return composite;
-	}
-
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		// Create the OK button.
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		// Create the Cancel button.
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		// Set help context for the OK button.
-		okButton = super.getButton(IDialogConstants.OK_ID);
-
-		// Set help context for the Cancel button.
-		cancelButton = super.getButton(IDialogConstants.CANCEL_ID);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/FindReplaceDialog.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/FindReplaceDialog.java
deleted file mode 100644
index 8964006..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/FindReplaceDialog.java
+++ /dev/null
@@ -1,327 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.dialogs;
-
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.epf.richtext.actions.FindReplaceAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Prompts the user to specify the search and replace strings and options.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class FindReplaceDialog extends BaseDialog {
-
-	private FindReplaceAction findReplaceAction;
-
-	private boolean findOnly;
-
-	private Text findText;
-
-	private Text replaceText;
-
-	private Button searchForwardRadioButton;
-
-	private Button searchBackwardRadioButton;
-
-	private Button caseSensitiveCheckbox;
-
-	private Button wholeWordCheckbox;
-
-	private Button findButton;
-
-	private Button replaceButton;
-
-	private Button replaceFindButton;
-
-	private Button replaceAllButton;
-
-	private Label statusLabel;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param parent
-	 *            the parent shell
-	 * @param findReplaceAction
-	 *            the Find and Replace action
-	 * @param findOnly
-	 *            if <code>true</code>, disable the replace and replace all
-	 *            functionalities
-	 */
-	public FindReplaceDialog(Shell parent, FindReplaceAction findReplaceAction,
-			boolean findOnly) {
-		super(parent);
-		setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | getDefaultOrientation());
-		setBlockOnOpen(false);
-		this.findReplaceAction = findReplaceAction;
-		this.findOnly = findOnly;
-	}
-
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		GridLayout layout = (GridLayout) composite.getLayout();
-		layout.numColumns = 1;
-
-		Composite textComposite = new Composite(composite, SWT.NONE);
-		textComposite.setLayout(new GridLayout(2, false));
-		textComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label findLabel = new Label(textComposite, SWT.NONE);
-		findLabel.setText(RichTextResources.findLabel_text);
-		findText = new Text(textComposite, SWT.BORDER);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.widthHint = 200;
-		findText.setLayoutData(gridData);
-		findText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (findButton != null) {
-					findButton
-							.setEnabled(findText.getText().trim().length() > 0);
-				}
-				if (replaceAllButton != null && !findOnly) {
-					replaceAllButton.setEnabled(findText.getText().trim()
-							.length() > 0);
-				}
-			}
-		});
-
-		Label replaceLabel = new Label(textComposite, SWT.NONE);
-		replaceLabel.setText(RichTextResources.replaceLabel_text);
-		replaceText = new Text(textComposite, SWT.BORDER);
-		replaceText.setLayoutData(gridData);
-		if (findOnly) {
-			replaceText.setEnabled(false);
-		} else {
-			replaceText.addModifyListener(new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					if (replaceButton != null) {
-						replaceButton.setEnabled(findReplaceAction
-								.getFoundMatch());
-					}
-					if (replaceFindButton != null) {
-						replaceFindButton.setEnabled(findReplaceAction
-								.getFoundMatch());
-					}
-				}
-			});
-		}
-
-		Composite optionsComposite = new Composite(composite, SWT.NONE);
-		optionsComposite.setLayout(new GridLayout(2, true));
-		optionsComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Group directionGroup = new Group(optionsComposite, SWT.NONE);
-		directionGroup.setText(RichTextResources.directionGroup_text);
-		directionGroup.setLayout(new GridLayout(1, false));
-		directionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		searchForwardRadioButton = new Button(directionGroup, SWT.RADIO);
-		searchForwardRadioButton
-				.setText(RichTextResources.forwardRadioButton_text);
-		searchForwardRadioButton.setSelection(true);
-		searchBackwardRadioButton = new Button(directionGroup, SWT.RADIO);
-		searchBackwardRadioButton
-				.setText(RichTextResources.backwardRadioButton_text);
-
-		Group optionsGroup = new Group(optionsComposite, SWT.NONE);
-		optionsGroup.setText(RichTextResources.optionsGroup_text);
-		optionsGroup.setLayout(new GridLayout(1, false));
-		optionsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		caseSensitiveCheckbox = new Button(optionsGroup, SWT.CHECK);
-		caseSensitiveCheckbox
-				.setText(RichTextResources.caseSensitiveCheckbox_text);
-		wholeWordCheckbox = new Button(optionsGroup, SWT.CHECK);
-		wholeWordCheckbox.setText(RichTextResources.wholeWordCheckbox_text);
-
-		statusLabel = new Label(composite, SWT.NONE);
-		statusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		super.getShell().setText(RichTextResources.findReplaceDialog_title);
-
-		return composite;
-	}
-
-	@Override
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.CLIENT_ID + 1,
-				RichTextResources.findButton_text, true);
-		findButton = super.getButton(IDialogConstants.CLIENT_ID + 1);
-		findButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				findReplaceAction.run(FindReplaceAction.FIND_TEXT,
-						getFindText(), getReplaceText(), getMatchDirection(),
-						getMatchOptions());
-				if (!findOnly) {
-					replaceButton.setEnabled(findReplaceAction.getFoundMatch());
-					replaceFindButton.setEnabled(findReplaceAction
-							.getFoundMatch());
-				}
-				if (findReplaceAction.getFoundMatch()) {
-					statusLabel.setText(""); //$NON-NLS-1$
-				} else {
-					statusLabel
-							.setText(RichTextResources.FindReplace_Status_noMatch_label);
-				}
-				findButton.setFocus();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		createButton(parent, IDialogConstants.CLIENT_ID + 2,
-				RichTextResources.replaceButton_text, false);
-		replaceButton = super.getButton(IDialogConstants.CLIENT_ID + 2);
-		if (!findOnly) {
-			replaceButton.addSelectionListener(new SelectionListener() {
-				public void widgetSelected(SelectionEvent event) {
-					findReplaceAction.run(FindReplaceAction.REPLACE_TEXT,
-							getFindText(), getReplaceText(),
-							getMatchDirection(), getMatchOptions());
-					replaceButton.setFocus();
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-				}
-			});
-		}
-
-		createButton(parent, IDialogConstants.CLIENT_ID + 3,
-				RichTextResources.replaceFindButton_text, false);
-		replaceFindButton = super.getButton(IDialogConstants.CLIENT_ID + 3);
-		if (!findOnly) {
-			replaceFindButton.addSelectionListener(new SelectionListener() {
-				public void widgetSelected(SelectionEvent event) {
-					findReplaceAction.run(FindReplaceAction.REPLACE_FIND_TEXT,
-							getFindText(), getReplaceText(),
-							getMatchDirection(), getMatchOptions());
-					replaceButton.setEnabled(findReplaceAction.getFoundMatch());
-					replaceFindButton.setEnabled(findReplaceAction
-							.getFoundMatch());
-					replaceFindButton.setFocus();
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-				}
-			});
-		}
-
-		createButton(parent, IDialogConstants.CLIENT_ID + 4,
-				RichTextResources.replaceallButton_text, false);
-		replaceAllButton = super.getButton(IDialogConstants.CLIENT_ID + 4);
-		if (!findOnly) {
-			replaceAllButton.addSelectionListener(new SelectionListener() {
-				public void widgetSelected(SelectionEvent event) {
-					findReplaceAction.run(FindReplaceAction.REPLACE_ALL_TEXT,
-							getFindText(), getReplaceText(),
-							getMatchDirection(), getMatchOptions());
-					replaceButton.setEnabled(false);
-					replaceFindButton.setEnabled(false);
-					replaceAllButton.setFocus();
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-				}
-			});
-		}
-
-		// Create the Cancel button.
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-		cancelButton = super.getButton(IDialogConstants.CANCEL_ID);
-
-		findButton.setEnabled(false);
-		replaceButton.setEnabled(false);
-		replaceFindButton.setEnabled(false);
-		replaceAllButton.setEnabled(false);
-	}
-
-	/**
-	 * Gets the user specified find text.
-	 * 
-	 * @return the find text
-	 */
-	public String getFindText() {
-		return findText.getText();
-	}
-
-	/**
-	 * Gets the user specified replace text.
-	 * 
-	 * @return the replace text
-	 */
-	public String getReplaceText() {
-		return replaceText.getText();
-	}
-
-	/**
-	 * Gets the text match direction.
-	 * 
-	 * @return <code>FIND_FORWARD</code> or <code>FIND_BACKWARD</code>
-	 */
-	public int getMatchDirection() {
-		return searchForwardRadioButton.getSelection() ? FindReplaceAction.FORWARD_MATCH
-				: FindReplaceAction.BACKWARD_MATCH;
-	}
-
-	/**
-	 * Gets the text match options.
-	 * 
-	 * @return the text match options
-	 */
-	public int getMatchOptions() {
-		int options = 0;
-		if (wholeWordCheckbox.getSelection() == true) {
-			options |= FindReplaceAction.WHOLE_WORD_MATCH;
-		}
-		if (caseSensitiveCheckbox.getSelection() == true) {
-			options |= FindReplaceAction.CASE_SENSITIVE_MATCH;
-		}
-		return options;
-	}
-
-	/**
-	 * Checks the find only option.
-	 * 
-	 * @return <code>true</code> if find only option is enabled
-	 */
-	public boolean isFindOnly() {
-		return findOnly;
-	}
-
-	/**
-	 * Sets the find only option.
-	 * 
-	 * @param findOnly,
-	 *            if <code>true</code>, enable the find only option
-	 */
-	public void setFindOnly(boolean findOnly) {
-		this.findOnly = findOnly;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/package.html b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/package.html
deleted file mode 100644
index 2f5dd13..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/dialogs/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides editing dialogs for the rich text control and editor.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/BlockTag.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/BlockTag.java
deleted file mode 100644
index 1ec790b..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/BlockTag.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.richtext.RichTextResources;
-
-/**
- * Models a HTML block tag.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class BlockTag {
-
-	// The user friendly names.
-	private static final String NAME_PARAGRAPH = RichTextResources.blockTag_paragraph;
-
-	private static final String NAME_HEADING_1 = RichTextResources.blockTag_heading1;
-
-	private static final String NAME_HEADING_2 = RichTextResources.blockTag_heading2;
-
-	private static final String NAME_HEADING_3 = RichTextResources.blockTag_heading3;
-
-	private static final String NAME_HEADING_4 = RichTextResources.blockTag_heading4;
-
-	private static final String NAME_HEADING_5 = RichTextResources.blockTag_heading5;
-
-	private static final String NAME_HEADING_6 = RichTextResources.blockTag_heading6;
-
-	private static final String NAME_ADDRESS = RichTextResources.blockTag_address;
-
-	private static final String NAME_PREFORMATTED_TEXT = RichTextResources.blockTag_preformattedText;
-
-	// The internal values.
-	private static final String VALUE_PARAGRAPH = "<p>"; //$NON-NLS-1$
-
-	private static final String VALUE_HEADING_1 = "<h1>"; //$NON-NLS-1$
-
-	private static final String VALUE_HEADING_2 = "<h2>"; //$NON-NLS-1$
-
-	private static final String VALUE_HEADING_3 = "<h3>"; //$NON-NLS-1$
-
-	private static final String VALUE_HEADING_4 = "<h4>"; //$NON-NLS-1$
-
-	private static final String VALUE_HEADING_5 = "<h5>"; //$NON-NLS-1$
-
-	private static final String VALUE_HEADING_6 = "<h6>"; //$NON-NLS-1$
-
-	private static final String VALUE_ADDRESS = "<address>"; //$NON-NLS-1$
-
-	private static final String VALUE_PREFORMATTED_TEXT = "<pre>"; //$NON-NLS-1$
-
-	/**
-	 * The &lt;p&gt; tag.
-	 */
-	static public final BlockTag PARAGRAPH = new BlockTag(NAME_PARAGRAPH,
-			VALUE_PARAGRAPH);
-
-	/**
-	 * &lt;h1&gt; tag.
-	 */
-	static public final BlockTag HEADING_1 = new BlockTag(NAME_HEADING_1,
-			VALUE_HEADING_1);
-
-	/**
-	 * &lt;h2&gt; tag.
-	 */
-	static public final BlockTag HEADING_2 = new BlockTag(NAME_HEADING_2,
-			VALUE_HEADING_2);
-
-	/**
-	 * &lt;h3&gt; tag.
-	 */
-	static public final BlockTag HEADING_3 = new BlockTag(NAME_HEADING_3,
-			VALUE_HEADING_3);
-
-	/**
-	 * &lt;h4&gt; tag.
-	 */
-	static public final BlockTag HEADING_4 = new BlockTag(NAME_HEADING_4,
-			VALUE_HEADING_4);
-
-	/**
-	 * &lt;h5&gt; tag.
-	 */
-	static public final BlockTag HEADING_5 = new BlockTag(NAME_HEADING_5,
-			VALUE_HEADING_5);
-
-	/**
-	 * &lt;h6&gt; tag.
-	 */
-	static public final BlockTag HEADING_6 = new BlockTag(NAME_HEADING_6,
-			VALUE_HEADING_6);
-
-	/**
-	 * &lt;address&gt; tag.
-	 */
-	static public final BlockTag ADDRESS = new BlockTag(NAME_ADDRESS,
-			VALUE_ADDRESS);
-
-	/**
-	 * &lt;pre&gt; tag.
-	 */
-	static public final BlockTag PREFORMATTED_TEXT = new BlockTag(
-			NAME_PREFORMATTED_TEXT, VALUE_PREFORMATTED_TEXT);
-
-	// A list of <code>BlockTag</code> objects.
-	static private final List<BlockTag> BLOCK_TAGS = new ArrayList<BlockTag>();
-	static {
-		BLOCK_TAGS.add(PARAGRAPH);
-		BLOCK_TAGS.add(HEADING_1);
-		BLOCK_TAGS.add(HEADING_2);
-		BLOCK_TAGS.add(HEADING_3);
-		BLOCK_TAGS.add(HEADING_4);
-		BLOCK_TAGS.add(HEADING_5);
-		BLOCK_TAGS.add(HEADING_6);
-		BLOCK_TAGS.add(ADDRESS);
-		BLOCK_TAGS.add(PREFORMATTED_TEXT);
-	}
-
-	// The block tag name.
-	private String name;
-
-	// The block tag value.
-	private String value;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            the block tag name
-	 * @param value
-	 *            the block tag value
-	 */
-	public BlockTag(String name, String value) {
-		this.name = name;
-		this.value = value;
-	}
-
-	/**
-	 * Gets the block tag name.
-	 * 
-	 * @return the block tag name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the block tag value.
-	 * 
-	 * @return the block tag value
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Gets the <code>BlockTag</code> object that is mapped to the given
-	 * index.
-	 * 
-	 * @param index
-	 *            an index into the <code>BlockTag</code> list
-	 * @return a <code>BlockTag</code> object
-	 */
-	public static BlockTag getBlockTag(int index) {
-		BlockTag result = (BlockTag) BLOCK_TAGS.get(index);
-		if (result != null) {
-			return result;
-		}
-		return PARAGRAPH;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/FontName.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/FontName.java
deleted file mode 100644
index a47a3d6..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/FontName.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.richtext.RichTextResources;
-
-/**
- * Models a HTML font name.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class FontName {
-
-	// The user friendly names.
-	private static final String NAME_DEFAULT = RichTextResources.fontName_default;
-
-	private static final String NAME_ARIAL = RichTextResources.fontName_arial;
-
-	private static final String NAME_COURIER_NEW = RichTextResources.fontName_courierNew;
-
-	private static final String NAME_TIMES_NEW_ROMAN = RichTextResources.fontName_timesNewRoman;
-
-	private static final String NAME_VERDANA = RichTextResources.fontName_verdana;
-
-	// The internal values.
-	private static final String VALUE_DEFAULT = ""; //$NON-NLS-1$
-
-	private static final String VALUE_ARIAL = "Arial, Helvetica, sans-serif"; //$NON-NLS-1$
-
-	private static final String VALUE_COURIER_NEW = "Courier New, Courier, mono"; //$NON-NLS-1$
-
-	private static final String VALUE_TIMES_NEW_ROMAN = "Times New Roman, Times, serif"; //$NON-NLS-1$
-
-	private static final String VALUE_VERDANA = "Verdana, Arial, Helvetica, sans-serif"; //$NON-NLS-1$
-
-	/**
-	 * Default font.
-	 */
-	static public final FontName DEFAULT = new FontName(NAME_DEFAULT,
-			VALUE_DEFAULT);
-
-	/**
-	 * Arial font.
-	 */
-	static public final FontName ARIAL = new FontName(NAME_ARIAL, VALUE_ARIAL);
-
-	/**
-	 * Courier New font.
-	 */
-	static public final FontName COURIER_NEW = new FontName(NAME_COURIER_NEW,
-			VALUE_COURIER_NEW);
-
-	/**
-	 * Times New Roman font.
-	 */
-	static public final FontName TIMES_NEW_ROMAN = new FontName(
-			NAME_TIMES_NEW_ROMAN, VALUE_TIMES_NEW_ROMAN);
-
-	/**
-	 * Verdana font.
-	 */
-	static public final FontName VERDANA = new FontName(NAME_VERDANA,
-			VALUE_VERDANA);
-
-	// A list of <code>FontName</code> objects.
-	static private final List<FontName> FONT_NAMES = new ArrayList<FontName>();
-	static {
-		FONT_NAMES.add(DEFAULT);
-		FONT_NAMES.add(ARIAL);
-		FONT_NAMES.add(COURIER_NEW);
-		FONT_NAMES.add(TIMES_NEW_ROMAN);
-		FONT_NAMES.add(VERDANA);
-	}
-
-	// The font name.
-	private String name;
-
-	// The font value.
-	private String value;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            the font name
-	 * @param value
-	 *            the font value
-	 */
-	public FontName(String name, String value) {
-		this.name = name;
-		this.value = value;
-	}
-
-	/**
-	 * Gets the font name.
-	 * 
-	 * @return the font name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the font value.
-	 * 
-	 * @return the font value
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Gets the <code>FontName</code> object that is mapped to the given
-	 * index.
-	 * 
-	 * @param index
-	 *            an index into the <code>FontName</code> list
-	 * @return a <code>FontName</code> object
-	 */
-	public static FontName getFontName(int index) {
-		FontName result = (FontName) FONT_NAMES.get(index);
-		if (result != null) {
-			return result;
-		}
-		return DEFAULT;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/FontStyle.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/FontStyle.java
deleted file mode 100644
index c33a8d8..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/FontStyle.java
+++ /dev/null
@@ -1,187 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.html;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.epf.richtext.RichTextResources;
-
-/**
- * Models a HTML font style.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class FontStyle {
-
-	// The user friendly names.
-	private static final String NAME_NORMAL = RichTextResources.fontStyle_normal;
-
-	private static final String NAME_SECTION_HEADING = RichTextResources.fontStyle_sectionHeading;
-
-	private static final String NAME_SUBSECTION_HEADING = RichTextResources.fontStyle_subsectionHeading;
-
-	private static final String NAME_SUB_SUBSECTION_HEADING = RichTextResources.fontStyle_subSubsectionHeading;
-
-	private static final String NAME_QUOTE = RichTextResources.fontStyle_quote;
-
-	private static final String NAME_CODE_SAMPLE = RichTextResources.fontStyle_codeSample;
-
-	// The internal values.
-	private static final String VALUE_NORMAL = "<p>"; //$NON-NLS-1$
-
-	private static final String VALUE_SECTION_HEADING = "<h3>"; //$NON-NLS-1$
-
-	private static final String VALUE_SUBSECTION_HEADING = "<h4>"; //$NON-NLS-1$
-
-	private static final String VALUE_SUB_SUBSECTION_HEADING = "<h5>"; //$NON-NLS-1$
-
-	private static final String VALUE_QUOTE = "<quote>"; //$NON-NLS-1$
-
-	private static final String VALUE_CODE_SAMPLE = "<code>"; //$NON-NLS-1$
-
-	/**
-	 * Font style for normal text.
-	 */
-	static public final FontStyle NORMAL = new FontStyle(NAME_NORMAL,
-			VALUE_NORMAL);
-
-	/**
-	 * Font style for section heading.
-	 */
-	static public final FontStyle SECTION_HEADING = new FontStyle(
-			NAME_SECTION_HEADING, VALUE_SECTION_HEADING);
-
-	/**
-	 * Font style for sub section heading.
-	 */
-	static public final FontStyle SUBSECTION_HEADING = new FontStyle(
-			NAME_SUBSECTION_HEADING, VALUE_SUBSECTION_HEADING);
-	/**
-	 * Font style for sub sub section heading.
-	 */
-	static public final FontStyle SUB_SUBSECTION_HEADING = new FontStyle(
-			NAME_SUB_SUBSECTION_HEADING, VALUE_SUB_SUBSECTION_HEADING);
-
-	/**
-	 * Font style for quotations.
-	 */
-	static public final FontStyle QUOTE = new FontStyle(NAME_QUOTE, VALUE_QUOTE);
-
-	/**
-	 * Font style for displaying program codes.
-	 */
-	static public final FontStyle CODE_SAMPLE = new FontStyle(NAME_CODE_SAMPLE,
-			VALUE_CODE_SAMPLE);
-
-	// A list of <code>FontStyle</code> objects.
-	static private final List<FontStyle> FONT_STYLES = new ArrayList<FontStyle>();
-	static {
-		FONT_STYLES.add(NORMAL);
-		FONT_STYLES.add(SECTION_HEADING);
-		FONT_STYLES.add(SUBSECTION_HEADING);
-		FONT_STYLES.add(SUB_SUBSECTION_HEADING);
-		FONT_STYLES.add(QUOTE);
-		FONT_STYLES.add(CODE_SAMPLE);
-	}
-
-	// The font style name.
-	private String name;
-
-	// The font style value.
-	private String value;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            the font style name
-	 * @param value
-	 *            the font style value
-	 */
-	public FontStyle(String name, String value) {
-		this.name = name;
-		this.value = value;
-	}
-
-	/**
-	 * Gets the font style name.
-	 * 
-	 * @return the font style name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the font style value.
-	 * 
-	 * @return the font style value
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * Gets the <code>FontStyle</code> object that is mapped to the given
-	 * index.
-	 * 
-	 * @param index
-	 *            an index into the <code>FontStyle</code> list
-	 * @return a <code>FontStyle</code> object
-	 */
-	public static FontStyle getFontStyle(int index) {
-		FontStyle result = (FontStyle) FONT_STYLES.get(index);
-		if (result != null) {
-			return result;
-		}
-		return NORMAL;
-	}
-
-	/**
-	 * Gets the display name of the <code>FontStyle</code> object with the
-	 * given value.
-	 * 
-	 * @param value
-	 *            one of the FontStyles
-	 * @return a display name of a FontStyle, or null if none found
-	 */
-	public static String getFontStyleName(String value) {
-		for (Iterator<FontStyle> iter = FONT_STYLES.iterator(); iter.hasNext();) {
-			FontStyle style = iter.next();
-			if (style.getValue().equals(value)) {
-				return style.getName();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the value of the <code>FontStyle</code> object with the
-	 * given display name.
-	 * 
-	 * @param name
-	 *            one of the FontStyles
-	 * @return a value of a FontStyle, or null if none found
-	 */
-	public static String getFontStyleValue(String name) {
-		for (Iterator<FontStyle> iter = FONT_STYLES.iterator(); iter.hasNext();) {
-			FontStyle style = iter.next();
-			if (style.getName().equals(name)) {
-				return style.getValue();
-			}
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Image.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Image.java
deleted file mode 100644
index efab2a0..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Image.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.html;
-
-/**
- * Models a simplified HTML &lt;image&gt; tag.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class Image {
-
-	// The image URL.
-	private String url = ""; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public Image() {
-	}
-
-	/**
-	 * Gets the image URL.
-	 * 
-	 * @return the image URL
-	 */
-	public String getURL() {
-		return url;
-	}
-
-	/**
-	 * Sets the image URL.
-	 * 
-	 * @param url
-	 *            the image URL
-	 */
-	public void setURL(String url) {
-		this.url = url;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Link.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Link.java
deleted file mode 100644
index 49c210e..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Link.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.html;
-
-/**
- * Models a simplified HTML &lt;link&gt; tag.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class Link {
-
-	// The link name.
-	private String name = ""; //$NON-NLS-1$
-
-	// The link URL.
-	private String url = ""; //$NON-NLS-1$
-
-	/**
-	 * Creates a new instance.
-	 */
-	public Link() {
-	}
-
-	/**
-	 * Gets the link name.
-	 * 
-	 * @return the link name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Sets the link name.
-	 * 
-	 * @param name
-	 *            the link name
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * Gets the link URL.
-	 * 
-	 * @return the link URL
-	 */
-	public String getURL() {
-		return url;
-	}
-
-	/**
-	 * Sets the link URL.
-	 * 
-	 * @param url
-	 *            the link URL
-	 */
-	public void setURL(String url) {
-		this.url = url;
-	}
-
-	/**
-	 * @Gets the HTML representation of this link.
-	 * 
-	 * @return the HTML representation of this link
-	 */
-	public String toHTML() {
-		return null;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Table.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Table.java
deleted file mode 100644
index adf0d45..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/Table.java
+++ /dev/null
@@ -1,186 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.html;
-
-/**
- * Models a simplified HTML &lt;table&gt; tag.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class Table {
-
-	/**
-	 * A table with no headers.
-	 */
-	public static final int TABLE_HEADERS_NONE = 0;
-
-	/**
-	 * A table with column headers.
-	 */
-	public static final int TABLE_HEADERS_COLS = 1;
-
-	/**
-	 * A table with row headers.
-	 */
-	public static final int TABLE_HEADERS_ROWS = 2;
-
-	/**
-	 * A table with both column and row headers.
-	 */
-	public static final int TABLE_HEADERS_BOTH = 3;
-
-	// The number of rows.
-	private int rows = 2;
-
-	// The number of columns.
-	private int cols = 2;
-
-	// The table width.
-	private String width = "85%"; //$NON-NLS-1$
-
-	// The type of tableheaders for this table.
-	private int tableHeaders = 0;
-
-	// The table summary.
-	private String summary;
-
-	// The table caption.
-	private String caption;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public Table() {
-	}
-
-	/**
-	 * Gets the number of rows in the table.
-	 * 
-	 * @return the number of rows
-	 */
-	public int getRows() {
-		return rows;
-	}
-
-	/**
-	 * Sets the number of rows in the table.
-	 * 
-	 * @param rows
-	 *            the number of rows
-	 */
-	public void setRows(int rows) {
-		this.rows = rows;
-	}
-
-	/**
-	 * Gets the number of columns in the table.
-	 * 
-	 * @return the number of columns
-	 */
-	public int getColumns() {
-		return cols;
-	}
-
-	/**
-	 * Sets the number of columns in the table.
-	 * 
-	 * @param cols
-	 *            the number of columns
-	 */
-	public void setColumns(int cols) {
-		this.cols = cols;
-	}
-
-	/**
-	 * Gets the table width.
-	 * 
-	 * @return the width of the table
-	 */
-	public String getWidth() {
-		return width;
-	}
-
-	/**
-	 * Sets the table width.
-	 * 
-	 * @param width
-	 *            the width of the table
-	 */
-	public void setWidth(String width) {
-		this.width = width;
-	}
-
-	/**
-	 * Gets the table caption.
-	 * 
-	 * @return the table caption
-	 */
-	public String getCaption() {
-		return caption;
-	}
-
-	/**
-	 * Sets the table caption.
-	 * 
-	 * @para caption the table caption
-	 */
-	public void setCaption(String caption) {
-		this.caption = caption;
-	}
-
-	/**
-	 * Gets the table summary.
-	 * 
-	 * @return the table summary
-	 */
-	public String getSummary() {
-		return summary;
-	}
-
-	/**
-	 * Sets the table summary.
-	 * 
-	 * @param summary
-	 *            the table summary
-	 */
-	public void setSummary(String summary) {
-		this.summary = summary;
-	}
-
-	/**
-	 * Gets the table headers style.
-	 * 
-	 * @return the integer with value representing
-	 *         <code>TABLE_HEADERS_NONE</code>,
-	 *         <code>TABLE_HEADERS_COLS</code>,
-	 *         <code>TABLE_HEADERS_ROWS</code> or
-	 *         <code>TABLE_HEADERS_BOTH</code>
-	 */
-	public int getTableHeaders() {
-		return tableHeaders;
-	}
-
-	/**
-	 * Sets the table headers style.
-	 * 
-	 * @param tableHeaders
-	 *            an integer with value representing
-	 *            <code>TABLE_HEADERS_NONE</code>,
-	 *            <code>TABLE_HEADERS_COLS</code>,
-	 *            <code>TABLE_HEADERS_ROWS</code> or
-	 *            <code>TABLE_HEADERS_BOTH</code>
-	 */
-	public void setTableHeaders(int tableHeaders) {
-		this.tableHeaders = tableHeaders;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/package.html b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/package.html
deleted file mode 100644
index 9bd707a..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/html/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for the rich text control and editor.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/package.html b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/package.html
deleted file mode 100644
index 604ddc5..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces and implementation for the rich text control and editor.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferencePage.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferencePage.java
deleted file mode 100644
index ef91b05..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferencePage.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.preferences;
-
-import org.eclipse.epf.richtext.RichTextPlugin;
-import org.eclipse.epf.richtext.RichTextResources;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * The Preference page for the rich text editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextPreferencePage extends PreferencePage implements
-		IWorkbenchPreferencePage, SelectionListener, ModifyListener {
-
-	private IPreferenceStore store;
-
-	private Text lineWidthText;
-
-	private Button indentCheckbox;
-
-	private Text indentSizeText;
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		store = RichTextPlugin.getDefault().getPreferenceStore();
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(1, false));
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Composite widthComposite = new Composite(composite, SWT.NONE);
-		widthComposite.setLayout(new GridLayout(2, false));
-		widthComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label lineWidthLabel = new Label(widthComposite, SWT.NONE);
-		lineWidthLabel.setText(RichTextResources.maxCharsPerLineLabel_text); 
-
-		lineWidthText = new Text(widthComposite, SWT.BORDER);
-		lineWidthText.setText(store.getString(RichTextPreferences.LINE_WIDTH));
-		lineWidthText.setTextLimit(3);
-		GridData gridData = new GridData();
-		gridData.widthHint = 25;
-		lineWidthText.setLayoutData(gridData);
-		lineWidthText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-			}
-		});
-
-		Composite indentComposite = new Composite(composite, SWT.NONE);
-		indentComposite.setLayout(new GridLayout(2, false));
-		indentComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		indentCheckbox = new Button(indentComposite, SWT.CHECK);
-		indentCheckbox.setText(RichTextResources.indentHTMLCheckbox_text); 
-		indentCheckbox.setSelection(store
-				.getBoolean(RichTextPreferences.INDENT));
-
-		new Label(indentComposite, SWT.NONE);
-
-		Label indentSizeLabel = new Label(indentComposite, SWT.NONE);
-		gridData = new GridData();
-		gridData.horizontalIndent = 20;
-		indentSizeLabel.setLayoutData(gridData);
-		indentSizeLabel.setText(RichTextResources.indentSizeLabel_text); 
-
-		indentSizeText = new Text(indentComposite, SWT.BORDER);
-		indentSizeText
-				.setText(store.getString(RichTextPreferences.INDENT_SIZE));
-		indentSizeText.setTextLimit(1);
-		gridData = new GridData();
-		gridData.widthHint = 10;
-		indentSizeText.setLayoutData(gridData);
-		indentSizeText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-			}
-		});
-
-		return composite;
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage.performDefaults
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		lineWidthText.setText(store
-				.getDefaultString(RichTextPreferences.LINE_WIDTH));
-		indentCheckbox.setSelection(store
-				.getDefaultBoolean(RichTextPreferences.INDENT));
-		indentSizeText.setText(store
-				.getDefaultString(RichTextPreferences.INDENT_SIZE));
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage.performOk
-	 */
-	public boolean performOk() {
-		String lineWidthValue = lineWidthText.getText();
-		if (lineWidthValue != null && lineWidthValue.length() > 0) {
-			try {
-				int lineWidth = Integer.parseInt(lineWidthValue);
-				store.setValue(RichTextPreferences.LINE_WIDTH, lineWidth);
-			} catch (Exception e) {
-			}
-		}
-
-		boolean indentValue = indentCheckbox.getSelection();
-		store.setValue(RichTextPreferences.INDENT, indentValue);
-
-		String indentSizeValue = indentSizeText.getText();
-		if (indentSizeValue != null && indentSizeValue.length() > 0) {
-			try {
-				int indentSize = Integer.parseInt(indentSizeValue);
-				store.setValue(RichTextPreferences.INDENT_SIZE, indentSize);
-			} catch (Exception e) {
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-	}
-
-	/**
-	 * @see org.eclipse.swt.events.ModifyListener#modifyText(ModifyEvent)
-	 */
-	public void modifyText(ModifyEvent e) {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferences.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferences.java
deleted file mode 100644
index 042eae7..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferences.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.preferences;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Preferences for the rich text editor.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextPreferences {
-
-	/**
-	 * rich text Editor preference keys.
-	 */
-	public static final String LINE_WIDTH = "htmlEditor.lineWidth"; //$NON-NLS-1$
-
-	public static final String INDENT = "htmlEditor.indent"; //$NON-NLS-1$
-
-	public static final String INDENT_SIZE = "htmlEditor.indentSize"; //$NON-NLS-1$
-
-	/**
-	 * Initializes the default preferences.
-	 */
-	public static void initializeDefaultPreferences(IPreferenceStore store) {
-		store.setDefault(LINE_WIDTH, 120);
-		store.setDefault(INDENT, true);
-		store.setDefault(INDENT_SIZE, 4);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferencesInitializer.java b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferencesInitializer.java
deleted file mode 100644
index 15956db..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/RichTextPreferencesInitializer.java
+++ /dev/null
@@ -1,35 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.richtext.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.epf.richtext.RichTextPlugin;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * The rich text preferences initializer.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class RichTextPreferencesInitializer extends
-		AbstractPreferenceInitializer {
-
-	/**
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = RichTextPlugin.getDefault()
-				.getPreferenceStore();
-		RichTextPreferences.initializeDefaultPreferences(store);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/package.html b/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/package.html
deleted file mode 100644
index 45a75f1..0000000
--- a/1.5/plugins/org.eclipse.epf.richtext/src/org/eclipse/epf/richtext/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for the rich text control and editor.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/.classpath b/1.5/plugins/org.eclipse.epf.search.ui/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/.options b/1.5/plugins/org.eclipse.epf.search.ui/.options
deleted file mode 100644
index cac96c5..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Search UI plug-in
-org.eclipse.epf.search.ui/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/.project b/1.5/plugins/org.eclipse.epf.search.ui/.project
deleted file mode 100644
index 5fa5524..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.search.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.search.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 4715ccf..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.search.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.search.ui.SearchUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.epf.authoring.ui,
- org.eclipse.core.runtime,
- org.eclipse.jface.text,
- org.eclipse.search,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.search.ui
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/build.properties b/1.5/plugins/org.eclipse.epf.search.ui/build.properties
deleted file mode 100644
index 321dc6b..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml
-
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/icons/full/obj16/MethodSearch.gif b/1.5/plugins/org.eclipse.epf.search.ui/icons/full/obj16/MethodSearch.gif
deleted file mode 100644
index 83c0f44..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/icons/full/obj16/MethodSearch.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.search.ui/plugin.properties
deleted file mode 100644
index 8ef1933..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Search UI
-providerName=Eclipse.org
-
-# Method Search Dialog
-methodSearchDialogLabel=Method Search
-
-               
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.search.ui/plugin.xml
deleted file mode 100644
index f4dee4b..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/plugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   
-   <extension point="org.eclipse.search.searchPages">
-      <page id="org.eclipse.epf.search.ui.MethodSearchPage"
-            class="org.eclipse.epf.search.ui.MethodSearchPage"      
-            label="%methodSearchDialogLabel"
-            icon="icons/full/obj16/MethodSearch.gif"
-            sizeHint="250,160"
-            tabPosition="0"
-            extensions="*:1"
-            showScopeSection="false"		
-            canSearchEnclosingProjects="false">
-      </page>    
-   </extension>
-   
-   <extension
-         id="MethodSearchPage"
-         point="org.eclipse.search.searchResultViewPages">
-      <viewPage
-            id="org.eclipse.epf.search.ui.MethodSearchResultPage"
-			searchResultClass="org.eclipse.epf.search.ui.internal.MethodSearchResult"
-			class="org.eclipse.epf.search.ui.MethodSearchResultPage">
-      </viewPage>
-   </extension>   
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/MethodSearchPage.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/MethodSearchPage.java
deleted file mode 100644
index 0b7ed14..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/MethodSearchPage.java
+++ /dev/null
@@ -1,196 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui;
-
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.search.ui.internal.MethodSearchInput;
-import org.eclipse.epf.search.ui.internal.MethodSearchQuery;
-import org.eclipse.epf.search.ui.internal.MethodSearchScope;
-import org.eclipse.epf.search.ui.internal.MethodSearchScopeViewer;
-import org.eclipse.epf.search.ui.preferences.SearchUIPreferences;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.search.ui.ISearchPage;
-import org.eclipse.search.ui.ISearchPageContainer;
-import org.eclipse.search.ui.NewSearchUI;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * Displays the Method Search page in the Search dialog.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchPage extends DialogPage implements ISearchPage {
-
-	public static final String SEARCH_PAGE_ID = MethodSearchPage.class
-			.getName();
-
-	private Combo searchStringCombo;
-
-	private Combo namePatternCombo;
-
-	private Button caseSensitiveCheckbox;
-
-	private MethodSearchScopeViewer searchScopeViewer;
-
-	private ISearchPageContainer container;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodSearchPage() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout(2, false);
-		layout.horizontalSpacing = 10;
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label searchStringLabel = new Label(composite, SWT.NONE);
-		searchStringLabel.setText(SearchUIResources.searchStringLabel_text); 
-
-		new Label(composite, SWT.NONE);
-
-		searchStringCombo = new Combo(composite, SWT.NONE);
-		searchStringCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		String savedSearchString = SearchUIPreferences.getSearchString();
-		if (savedSearchString != null && savedSearchString.length() > 0) {
-			searchStringCombo.setText(savedSearchString);
-		}
-
-		caseSensitiveCheckbox = new Button(composite, SWT.CHECK);
-		caseSensitiveCheckbox.setText(SearchUIResources.caseSensitiveCheckbox_text); 
-		caseSensitiveCheckbox.setSelection(SearchUIPreferences
-				.getCaseSensitive());
-
-		Label elementNameLabel = new Label(composite, SWT.NONE);
-		elementNameLabel.setText(SearchUIResources.elementNameLabel_text); 
-
-		new Label(composite, SWT.NONE);
-
-		namePatternCombo = new Combo(composite, SWT.NONE);
-		namePatternCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		String savedNamePattern = SearchUIPreferences.getNamePattern();
-		if (savedNamePattern != null && savedNamePattern.length() > 0) {
-			namePatternCombo.setText(savedNamePattern);
-		} else {
-			namePatternCombo.setText("*"); //$NON-NLS-1$
-		}
-
-		namePatternCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				container.setPerformActionEnabled(getSearchButtonEnabled());
-			}
-		});
-		namePatternCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent event) {
-				container.setPerformActionEnabled(getSearchButtonEnabled());
-			}
-		});
-
-		new Label(composite, SWT.NONE);
-
-		Group searchScopeGroup = new Group(composite, SWT.NONE);
-		searchScopeGroup.setLayout(new GridLayout(1, false));
-		GridData searchScopeGroupGridData = new GridData(GridData.FILL_BOTH);
-		searchScopeGroupGridData.heightHint = 200;
-		searchScopeGroup.setLayoutData(searchScopeGroupGridData);
-		searchScopeGroup.setText(SearchUIResources.scopeGroup_text); 
-
-		searchScopeViewer = new MethodSearchScopeViewer(searchScopeGroup,
-				SWT.NONE);
-
-		container.setPerformActionEnabled(getSearchButtonEnabled());
-
-		setControl(composite);
-		Dialog.applyDialogFont(composite);
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchPage#performAction()
-	 */
-	public boolean performAction() {
-		MethodLibrary library = LibraryService.getInstance().getCurrentMethodLibrary();
-		if (library == null) {
-			SearchUIPlugin.getDefault().getMsgDialog().displayError(
-					SearchUIResources.searchError_title, 
-					SearchUIResources.searchError_msg, 
-					SearchUIResources.searchError_reason); 
-			return false;
-		}
-		String searchString = searchStringCombo.getText();
-		String namePattern = namePatternCombo.getText();
-		MethodSearchScope searchScope = searchScopeViewer.getSearchScope();
-		MethodSearchInput searchInput = new MethodSearchInput(searchString,
-				namePattern, caseSensitiveCheckbox.getSelection(), false,
-				false, searchScope);
-		MethodSearchQuery searchQuery = new MethodSearchQuery(searchInput);
-		NewSearchUI.activateSearchResultView();
-		NewSearchUI.runQueryInBackground(searchQuery);
-		SearchUIPreferences.setSearchString(searchStringCombo.getText());
-		SearchUIPreferences.setNamePattern(namePatternCombo.getText());
-		SearchUIPreferences.setCaseSensitive(caseSensitiveCheckbox
-				.getSelection());
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchPage#setContainer(ISearchPageContainer)
-	 */
-	public void setContainer(ISearchPageContainer container) {
-		this.container = container;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.IReplacePage#performReplace()
-	 */
-	public boolean performReplace() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-	/**
-	 * Gets the enabled status of the Search button.
-	 * 
-	 * @return <code>true<code> if the Search button should be enabled
-	 */
-	private boolean getSearchButtonEnabled() {
-		return namePatternCombo.getText().trim().length() > 0;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/MethodSearchResultPage.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/MethodSearchResultPage.java
deleted file mode 100644
index 63ab51ef..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/MethodSearchResultPage.java
+++ /dev/null
@@ -1,217 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui;
-
-import org.eclipse.epf.authoring.ui.AuthoringPerspective;
-import org.eclipse.epf.authoring.ui.BrowsingPerspective;
-import org.eclipse.epf.authoring.ui.editors.EditorChooser;
-import org.eclipse.epf.authoring.ui.views.ContentView;
-import org.eclipse.epf.common.ui.util.PerspectiveUtil;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.LibraryServiceListener;
-import org.eclipse.epf.search.ui.internal.MethodElementViewSorter;
-import org.eclipse.epf.search.ui.internal.SearchResultLabelProvider;
-import org.eclipse.epf.search.ui.internal.SearchResultTableContentProvider;
-import org.eclipse.epf.search.ui.internal.SearchResultTreeContentProvider;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.search.ui.NewSearchUI;
-import org.eclipse.search.ui.text.AbstractTextSearchViewPage;
-import org.eclipse.search.ui.text.Match;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Displays the Method Search result in the Search view. The search result
- * can be displayed in a hierarchical or flat view.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchResultPage extends AbstractTextSearchViewPage
-		implements ISelectionChangedListener {
-
-	private IStructuredContentProvider contentProvider;
-
-	private SearchResultLabelProvider labelProvider;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodSearchResultPage() {
-		super();
-		labelProvider = new SearchResultLabelProvider();
-		
-		// Clear the search result when the current method library is closed by the user.
-		LibraryService.getInstance().addListener(new LibraryServiceListener() {
-			public void libraryClosed(MethodLibrary library) {
-				MethodSearchResultPage.this.getInput().removeAll();
-			}			
-		});
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#isLayoutSupported(int)
-	 */
-	public boolean isLayoutSupported(int layout) {
-		return ((layout & FLAG_LAYOUT_FLAT) != 0 || (layout & FLAG_LAYOUT_TREE) != 0);
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTreeViewer(TreeViewer)
-	 */
-	protected void configureTreeViewer(TreeViewer viewer) {
-		contentProvider = new SearchResultTreeContentProvider();
-		viewer.setContentProvider(contentProvider);
-		viewer.setLabelProvider(labelProvider);
-		viewer.setSorter(new MethodElementViewSorter());
-		viewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTableViewer(TableViewer)
-	 */
-	protected void configureTableViewer(TableViewer viewer) {
-		contentProvider = new SearchResultTableContentProvider();
-		viewer.setContentProvider(contentProvider);
-		viewer.setLabelProvider(labelProvider);
-		viewer.setSorter(new MethodElementViewSorter());
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(Object[])
-	 */
-	protected void elementsChanged(Object[] objects) {
-		if (contentProvider != null) {
-			if (contentProvider instanceof SearchResultTreeContentProvider) {
-				((SearchResultTreeContentProvider) contentProvider)
-						.elementsChanged(objects);
-			} else if (contentProvider instanceof SearchResultTableContentProvider) {
-				((SearchResultTableContentProvider) contentProvider)
-						.elementsChanged(objects);
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#clear()
-	 */
-	protected void clear() {
-		if (contentProvider != null) {
-			if (contentProvider instanceof SearchResultTreeContentProvider) {
-				((SearchResultTreeContentProvider) contentProvider).clear();
-			} else if (contentProvider instanceof SearchResultTableContentProvider) {
-				((SearchResultTableContentProvider) contentProvider).clear();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#showMatch(Match,
-	 *      int, int, boolean)
-	 */
-	protected void showMatch(Match match, int currentOffset, int currentLength,
-			boolean activate) throws PartInitException {
-		if (match.getElement() instanceof MethodElement && activate) {
-			MethodElement element = (MethodElement) match.getElement();
-			if (PerspectiveUtil
-					.isActivePerspective(BrowsingPerspective.PERSPECTIVE_ID)) {
-				PerspectiveUtil
-						.openPerspective(AuthoringPerspective.PERSPECTIVE_ID);
-				IWorkbenchPage activePage = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow().getActivePage();
-				if (activePage != null) {
-					IViewPart view = activePage
-							.findView(NewSearchUI.SEARCH_VIEW_ID);
-					if (view != null) {
-						activePage.showView(NewSearchUI.SEARCH_VIEW_ID);
-					}
-				}
-			}
-			displayEditor(element);
-		}
-	}
-
-	/**
-	 * Displays the Method editor for the selected Method element.
-	 */
-	protected void displayEditor(MethodElement element) {
-		if (element instanceof ProcessElement) {
-			EditorChooser.getInstance().openEditor(
-					UmaUtil.getProcessComponent(element));
-		} else {
-			EditorChooser.getInstance().openEditor(element);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		if (PerspectiveUtil
-				.isActivePerspective(BrowsingPerspective.PERSPECTIVE_ID)) {
-			ISelection selection = event.getSelection();
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection sel = (IStructuredSelection) selection;
-				Object[] selectedElements = sel.toArray();
-				if (selectedElements != null && selectedElements.length > 0) {
-					if (selectedElements[0] instanceof MethodElement) {
-						try {
-							displayHTMLPage((MethodElement) selectedElements[0]);
-						} catch (PartInitException e) {
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Displays the HTML content page for the selected method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @throws PartInitException
-	 *             if the Content view cannot be displayed
-	 */
-	protected void displayHTMLPage(MethodElement element)
-			throws PartInitException {
-		if (element instanceof MethodPlugin
-				|| element instanceof ContentPackage) {
-			return;
-		}
-		IWorkbenchPage activePage = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-		if (activePage != null) {
-			IViewPart view = activePage.findView(ContentView.VIEW_ID);
-			if (view == null) {
-				view = activePage.showView(ContentView.VIEW_ID);
-			}
-			if (view != null) {
-				((ContentView) view).displayHTMLContentPage(element);
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/Resources.properties b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/Resources.properties
deleted file mode 100644
index f16f440..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/Resources.properties
+++ /dev/null
@@ -1,48 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Method Search Page
-searchStringLabel_text=Text (* = any string, ? = any character):
-caseSensitiveCheckbox_text=Case sensitive
-elementNameLabel_text=Method element name or presentation name pattern:
-scopeGroup_text=Scope
-roleCheckbox_text=Role
-taskCheckbox_text=Task
-workProductCheckbox_text=Work Product
-
-# Method Search Query
-searchQuery_text=Method Search
-
-# Method Search Progress Dialog
-scanLibraryTask_name=Scanning method library...
-scanElementTask_name=Scanning method element ''{0}''...
-
-# Method Search Error Dialog
-searchError_title=Method Search
-searchError_msg=IUPS0100E: Search operation cannot proceed.
-searchError_reason=No method library is currently opened.\n\nOpen a method library and try again.
-
-# Method Search Result
-searchResult_methodContent=Method Content
-searchResult_contentPackages=Content Packages
-searchResult_standardCategories=Standard Categories
-searchResult_disciplines=Disciplines
-searchResult_domains=Domains
-searchResult_workProductTypes=Work Product Types
-searchResult_roleSets=Role Sets
-searchResult_tools=Tools
-searchResult_customCategories=Custom Categories
-searchResult_processes=Processes
-searchResult_capabilityPatterns=Capability Patterns
-searchResult_deliveryProcesses=Delivery Processes
-searchResult_match=''{0}'' - 1 match
-searchResult_matches=''{0}'' - {1} matches
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/SearchUIPlugin.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/SearchUIPlugin.java
deleted file mode 100644
index 4c337fb..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/SearchUIPlugin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Search UI plug-in activator.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchUIPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static SearchUIPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SearchUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static SearchUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/SearchUIResources.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/SearchUIResources.java
deleted file mode 100644
index 430d32a..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/SearchUIResources.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Search UI resource bundle.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class SearchUIResources extends NLS {
-
-	private static String BUNDLE_NAME = SearchUIResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	public static String searchStringLabel_text;
-
-	public static String caseSensitiveCheckbox_text;
-
-	public static String elementNameLabel_text;
-
-	public static String scopeGroup_text;
-
-	public static String roleCheckbox_text;
-
-	public static String taskCheckbox_text;
-
-	public static String workProductCheckbox_text;
-
-	public static String searchQuery_text;
-
-	public static String scanLibraryTask_name;
-
-	public static String scanElementTask_name;
-
-	public static String searchError_title;
-
-	public static String searchError_msg;
-
-	public static String searchError_reason;
-
-	public static String searchResult_methodContent;
-
-	public static String searchResult_contentPackages;
-
-	public static String searchResult_standardCategories;
-
-	public static String searchResult_disciplines;
-
-	public static String searchResult_domains;
-
-	public static String searchResult_workProductTypes;
-
-	public static String searchResult_roleSets;
-
-	public static String searchResult_tools;
-
-	public static String searchResult_customCategories;
-
-	public static String searchResult_processes;
-
-	public static String searchResult_capabilityPatterns;
-
-	public static String searchResult_deliveryProcesses;
-
-	public static String searchResult_match;
-
-	public static String searchResult_matches;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, SearchUIResources.class);
-	}
-
-	private SearchUIResources() {
-		// Do not instantiate.
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/IMethodSearchQuery.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/IMethodSearchQuery.java
deleted file mode 100644
index 3c8edac..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/IMethodSearchQuery.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import org.eclipse.search.ui.ISearchQuery;
-
-/**
- * The interface for a method search query.
- * 
- * @author Kelvin Low
- * @since  1.0
- */
-public interface IMethodSearchQuery extends ISearchQuery {
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/ISearchResultCollector.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/ISearchResultCollector.java
deleted file mode 100644
index 000b501..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/ISearchResultCollector.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-/**
- * The interface for a method search result collector.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface ISearchResultCollector {
-
-	/**
-	 * Evaluates the given object to see if there is a match in the search
-	 * criteria.
-	 * 
-	 * @param match
-	 *            an object containing the method element to match
-	 */
-	void accept(Object match);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodElementViewSorter.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodElementViewSorter.java
deleted file mode 100644
index 5bc41cf..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodElementViewSorter.java
+++ /dev/null
@@ -1,199 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-
-/**
- * Sorts the method elements in a specific order for display in the Search
- * view.
- * <p>
- * The method elements are sorted by types. Within each type, the elements are
- * sorted alphabetically by names.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodElementViewSorter extends ViewerSorter {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodElementViewSorter() {
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ViewerSorter#compare(Viewer, Object,
-	 *      Object)
-	 */
-	public int compare(Viewer viewer, Object e1, Object e2) {
-		if (e1 instanceof MethodPlugin) {
-			if (!(e2 instanceof MethodPlugin)) {
-				return -1;
-			}
-		} else if (e1 instanceof ContentPackage) {
-			if (e2 instanceof MethodPlugin) {
-				return 1;
-			} else if (!(e2 instanceof ContentPackage)) {
-				return -1;
-			}
-		} else if (e1 instanceof Role) {
-			if (e2 instanceof MethodPlugin || e2 instanceof ContentPackage) {
-				return 1;
-			} else if (!(e2 instanceof Role)) {
-				return -1;
-			}
-		} else if (e1 instanceof Task) {
-			if (e2 instanceof MethodPlugin || e2 instanceof ContentPackage
-					|| e2 instanceof Role) {
-				return 1;
-			} else if (!(e2 instanceof Task)) {
-				return -1;
-			}
-		} else if (e1 instanceof WorkProduct) {
-			if (e2 instanceof MethodPlugin || e2 instanceof ContentPackage
-					|| e2 instanceof Role || e2 instanceof Task) {
-				return 1;
-			} else if (!(e2 instanceof WorkProduct)) {
-				return -1;
-			}
-		} else if (e1 instanceof Guidance) {
-			if (e2 instanceof MethodPlugin || e2 instanceof ContentPackage
-					|| e2 instanceof Role || e2 instanceof Task
-					|| e2 instanceof WorkProduct) {
-				return 1;
-			} else if (e2 instanceof Guidance) {
-				String name1 = e1.getClass().getName();
-				String name2 = e2.getClass().getName();
-				if (!name1.equals(name2)) {
-					return collator.compare(name1, name2);
-				}
-			} else {
-				return -1;
-			}
-		} else if (e1 instanceof ContentCategory) {
-			if (e2 instanceof MethodPlugin || e2 instanceof ContentPackage
-					|| e2 instanceof Role || e2 instanceof Task
-					|| e2 instanceof WorkProduct || e2 instanceof Guidance) {
-				return 1;
-			} else if (e1 instanceof CustomCategory
-					&& !(e2 instanceof CustomCategory)) {
-				return 1;
-			} else if (!(e1 instanceof CustomCategory)
-					&& e2 instanceof CustomCategory) {
-				return -1;
-			} else if (e2 instanceof ContentCategory) {
-				String name1 = e1.getClass().getName();
-				String name2 = e2.getClass().getName();
-				if (!name1.equals(name2)) {
-					return collator.compare(name1, name2);
-				}
-			} else {
-				return -1;
-			}
-		} else if (e1 instanceof Process) {
-			if (e2 instanceof MethodPlugin || e2 instanceof ContentPackage
-					|| e2 instanceof ContentElement) {
-				return 1;
-			} else if (e2 instanceof ProcessPackage && !(e2 instanceof Process)) {
-				return 1;
-			} else if (!(e2 instanceof Process)) {
-				return -1;
-			}
-		} else if (e1 instanceof ProcessPackage) {
-			if (e2 instanceof MethodPlugin || e2 instanceof ContentPackage
-					|| e2 instanceof ContentElement) {
-				return 1;
-			} else if (e2 instanceof Process && !(e1 instanceof Process)) {
-				return -1;
-			} else if (!(e2 instanceof ProcessPackage)) {
-				return -1;
-			}
-		} else if (e1 instanceof ProcessElement) {
-			if (e2 instanceof MethodPlugin || e2 instanceof MethodPackage
-					|| e2 instanceof ContentElement || e2 instanceof Process) {
-				return 1;
-			} else if (e1 instanceof Phase) {
-				if (!(e2 instanceof Phase)) {
-					return -1;
-				}
-			} else if (e1 instanceof Iteration) {
-				if (e2 instanceof Phase) {
-					return 1;
-				}
-				if (!(e2 instanceof Iteration)) {
-					return -1;
-				}
-			} else if (e1 instanceof Activity) {
-				if (e2 instanceof Phase || e2 instanceof Iteration) {
-					return 1;
-				}
-				if (!(e2 instanceof Activity)) {
-					return -1;
-				}
-			} else if (e1 instanceof Milestone) {
-				if (e2 instanceof Activity) {
-					return 1;
-				}
-				if (!(e2 instanceof Milestone)) {
-					return -1;
-				}
-			} else if (e1 instanceof RoleDescriptor) {
-				if (e2 instanceof Activity || e2 instanceof Milestone) {
-					return 1;
-				}
-				if (!(e2 instanceof RoleDescriptor)) {
-					return -1;
-				}
-			} else if (e1 instanceof TaskDescriptor) {
-				if (e2 instanceof Activity || e2 instanceof Milestone
-						|| e2 instanceof RoleDescriptor) {
-					return 1;
-				}
-				if (!(e2 instanceof TaskDescriptor)) {
-					return -1;
-				}
-			} else if (e1 instanceof WorkProductDescriptor) {
-				if (e2 instanceof Activity || e2 instanceof Milestone
-						|| e2 instanceof RoleDescriptor
-						|| e2 instanceof TaskDescriptor) {
-					return 1;
-				}
-				if (!(e2 instanceof WorkProductDescriptor)) {
-					return -1;
-				}
-			}
-		}
-		return super.compare(viewer, e1, e2);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchInput.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchInput.java
deleted file mode 100644
index 914d076..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchInput.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-/**
- * Encapsulates the search strings and options that are used as inputs to a
- * method search.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchInput {
-
-	private String searchString;
-
-	private String namePattern;
-
-	private boolean caseSensitive;
-
-	private boolean wholeWord;
-
-	private boolean regExp;
-
-	private MethodSearchScope searchScope;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param searchString
-	 *            a search string
-	 * @param namePattern
-	 *            a method element name pattern
-	 * @param caseSensitive
-	 *            if <code>true</code>, make the search case sensitive
-	 * @param wholeWord
-	 *            if <code>true</code>, search for whole word only
-	 * @param regExp
-	 *            if <code>true</code>, search using regular expression
-	 * @param searchScope
-	 *            a search scope
-	 */
-	public MethodSearchInput(String searchString, String namePattern,
-			boolean caseSensitive, boolean wholeWord, boolean regExp,
-			MethodSearchScope searchScope) {
-		this.searchString = searchString;
-		this.namePattern = namePattern;
-		this.caseSensitive = caseSensitive;
-		this.wholeWord = wholeWord;
-		this.regExp = regExp;
-		this.searchScope = searchScope;
-	}
-
-	/**
-	 * Returns the search string.
-	 * 
-	 * @return the search string to look for the Method element content
-	 */
-	public String getSearchString() {
-		return searchString;
-	}
-
-	/**
-	 * Returns the name pattern.
-	 * 
-	 * @return the name pattern used to match the Method element names
-	 */
-	public String getNamePattern() {
-		return namePattern;
-	}
-
-	/**
-	 * Returns the case sensitivity of the search.
-	 * 
-	 * @return <code>true</code> if the search is case sensitive
-	 */
-	public boolean getCaseSensitive() {
-		return caseSensitive;
-	}
-
-	/**
-	 * Returns the whole word option of the search.
-	 * 
-	 * @return <code>true</code> if the search is based on whole word
-	 */
-	public boolean getWholeWord() {
-		return wholeWord;
-	}
-
-	/**
-	 * Returns the regular expression option of the search.
-	 * 
-	 * @return <code>true</code> if the search is based on regular expression
-	 */
-	public boolean getRegularExpression() {
-		return regExp;
-	}
-
-	/**
-	 * Returns the search scope.
-	 * 
-	 * @return the search scope
-	 */
-	public MethodSearchScope getSearchScope() {
-		return searchScope;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchOperation.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchOperation.java
deleted file mode 100644
index 248517b..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchOperation.java
+++ /dev/null
@@ -1,471 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.common.xml.AbstractSAXParser;
-import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.util.LibraryUtil;
-import org.eclipse.epf.search.ui.SearchUIPlugin;
-import org.eclipse.epf.search.ui.SearchUIResources;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.xml.sax.Attributes;
-
-/**
- * Performs a method search by iterating the current method library and parsing
- * the content element XMI files where necessary.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchOperation {
-
-	private static final String SCAN_LIBRARY_TEXT = SearchUIResources.scanLibraryTask_name; 
-
-	private static final String SCAN_ELEMENT_TEXT = SearchUIResources.scanElementTask_name; 
-
-	private boolean debug;
-
-	private MethodSearchInput searchInput;
-
-	private ISearchResultCollector result;
-
-	private String searchString;
-
-	private boolean caseSensitive;
-
-	private boolean regExp;
-
-	private Pattern searchStringPattern;
-
-	private Pattern elementNamePattern;
-
-	private MethodElementScanner elementScanner;
-
-	private List<String> parsedFiles = new ArrayList<String>();
-
-	private IProgressMonitor progressMonitor;
-
-	// Scans the content element XMI file associated with a Method element to
-	// look for the search string.
-	private class MethodElementScanner extends AbstractSAXParser {
-
-		private MethodElement element;
-
-		/**
-		 * Creates a new instance.
-		 */
-		public MethodElementScanner() {
-			super(null, false);
-		}
-
-		/**
-		 * Parses the content XMI file associated with the given Method element.
-		 * 
-		 * @param element
-		 *            a method element
-		 */
-		public void parse(MethodElement element) {
-			this.element = element;
-			String elementContentPath = getElementPath(element);
-			String briefDescription = element.getBriefDescription();
-			if (searchStringPattern.matcher(briefDescription).find()) {
-				result.accept(element);
-			}
-			if (elementContentPath != null
-					&& !parsedFiles.contains(elementContentPath)) {
-				super.parse(elementContentPath);
-				parsedFiles.add(elementContentPath);
-			}
-		}
-
-		/**
-		 * @see AbstractSAXParser#startElement(String, String, String,
-		 *      Attributes)
-		 */
-		public void startElement(String namespaceURL, String localName,
-				String qname, Attributes attributes) {
-			for (int i = 0; i < attributes.getLength(); i++) {
-				String name = attributes.getQName(i);
-				if (!name.equals("briefDescription")) { //$NON-NLS-1$
-					String value = attributes.getValue(i);
-					if (searchStringPattern.matcher(value).find()) {
-						result.accept(element);
-					}
-				}
-			}
-		}
-
-		/**
-		 * @see AbstractSAXParser#endElement(String, String, String)
-		 */
-		public void endElement(String namespaceURL, String localName,
-				String qname) {
-			String value = strBuf.toString();
-			if (searchStringPattern.matcher(value).find()) {
-				result.accept(element);
-			}
-			strBuf.setLength(0);
-		}
-
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param searchString
-	 *            a search string
-	 * @param namePattern
-	 *            a name pattern
-	 * @param result
-	 *            a search result collector
-	 */
-	public MethodSearchOperation(MethodSearchInput searchInput,
-			ISearchResultCollector result) {
-		this.searchInput = searchInput;
-		this.result = result;
-
-		caseSensitive = searchInput.getCaseSensitive();
-		regExp = searchInput.getRegularExpression();
-		elementNamePattern = MethodSearchPattern.createPattern(searchInput
-				.getNamePattern(), false, false);
-
-		debug = SearchUIPlugin.getDefault().isDebugging();
-
-		searchString = searchInput.getSearchString();
-		if (searchString == null)
-			searchString = ""; //$NON-NLS-1$
-		if (searchString.length() > 0) {
-			elementScanner = new MethodElementScanner();
-			searchStringPattern = MethodSearchPattern.createPattern(
-					searchString, caseSensitive, regExp);
-		}
-
-		if (debug) {
-			System.out
-					.println("MethodSearchOperation constructor: searchString=" //$NON-NLS-1$
-							+ searchString
-							+ ", elementNamePattern=" //$NON-NLS-1$
-							+ searchInput.getNamePattern()
-							+ ", caseSensitive=" + caseSensitive); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Executes the search operation.
-	 * 
-	 * @param progressMonitor
-	 *            a progress monitor
-	 */
-	public void execute(IProgressMonitor progressMonitor) {
-		this.progressMonitor = progressMonitor;
-		this.progressMonitor.beginTask(SCAN_LIBRARY_TEXT, 7500);
-
-		// Iterate the Method Library to look for elements that match the name
-		// pattern.
-		MethodLibrary library = LibraryService.getInstance()
-				.getCurrentMethodLibrary();
-		List methodPlugins = LibraryUtil.getMethodPlugins(library);
-		for (Iterator i = methodPlugins.iterator(); i.hasNext()
-				&& !progressMonitor.isCanceled();) {
-			MethodPlugin methodPlugin = (MethodPlugin) i.next();
-			matchPattern(methodPlugin);
-
-			MethodPackage methodPackage;
-			if (searchInput.getSearchScope().includeCoreContent()) {
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.coreContentPath);
-				searchMethodPackages(methodPackage);
-			}
-
-			if (searchInput.getSearchScope().include(
-					MethodSearchScope.STANDARD_CATEGORY)) {
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.disciplineDefinitionPath);
-				searchMethodPackages(methodPackage);
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.domainPath);
-				searchMethodPackages(methodPackage);
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.workProductTypePath);
-				searchMethodPackages(methodPackage);
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.roleSetPath);
-				searchMethodPackages(methodPackage);
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.toolPath);
-				searchMethodPackages(methodPackage);
-			}
-
-			if (searchInput.getSearchScope().include(
-					MethodSearchScope.CUSTOM_CATEGORY)) {
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.customCategoryPath);
-				searchMethodPackages(methodPackage);
-			}
-
-			if (searchInput.getSearchScope().include(
-					MethodSearchScope.CAPABILITY_PATTERN)) {
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.capabilityPatternPath);
-				searchMethodPackages(methodPackage);
-			}
-
-			if (searchInput.getSearchScope().include(
-					MethodSearchScope.DELIVERY_PROCESS)) {
-				methodPackage = UmaUtil.findMethodPackage(methodPlugin,
-						ModelStructure.DEFAULT.deliveryProcessPath);
-				searchMethodPackages(methodPackage);
-			}
-		}
-	}
-
-	/**
-	 * Searches a Method Package.
-	 * 
-	 * @param methodPackage
-	 *            a method package
-	 */
-	protected void searchMethodPackages(MethodPackage methodPackage) {
-		if (methodPackage == null
-				|| methodPackage.getName().equals(
-						ModelStructure.HIDDEN_PACKAGE_NAME)) {
-			return;
-		}
-		if (methodPackage instanceof ProcessComponent) {
-			// Add the associated CapabilityPattern or DeliveryProcess to the
-			// search result.
-			ProcessComponent processComponent = (ProcessComponent) methodPackage;
-			matchPattern(processComponent.getProcess());
-		} else if (!isInternalProcessPackage(methodPackage)) {
-			matchPattern(methodPackage);
-		}
-
-		List childPackages = methodPackage.getChildPackages();
-		for (Iterator i = childPackages.iterator(); i.hasNext()
-				&& !progressMonitor.isCanceled();) {
-			searchMethodPackages((MethodPackage) i.next());
-		}
-		if (methodPackage instanceof ContentPackage) {
-			ContentPackage contentPackage = (ContentPackage) methodPackage;
-			List contentElements = contentPackage.getContentElements();
-			for (Iterator j = contentElements.iterator(); j.hasNext()
-					&& !progressMonitor.isCanceled();) {
-				ContentElement contentElement = (ContentElement) j.next();
-				matchPattern(contentElement);
-				if (contentElement instanceof Artifact) {
-					searchContainedArtifacts((Artifact) contentElement);
-				} else if (contentElement instanceof Discipline) {
-					searchSubDisciplines((Discipline) contentElement);
-				} else if (contentElement instanceof Practice) {
-					searchSubPractices((Practice) contentElement);
-				} else if (contentElement instanceof Domain) {
-					searchSubDomains((Domain) contentElement);
-				}
-			}
-		} else if (methodPackage instanceof ProcessPackage) {
-			ProcessPackage processPackage = (ProcessPackage) methodPackage;
-			List processElements = processPackage.getProcessElements();
-			for (Iterator j = processElements.iterator(); j.hasNext()
-					&& !progressMonitor.isCanceled();) {
-				ProcessElement processElement = (ProcessElement) j.next();
-				if (!(processElement instanceof Activity)) {
-					matchPattern(processElement);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns <code>true</code> if the given package is an internal Process
-	 * Package.
-	 * 
-	 * @param methodPackage
-	 *            a method or process package
-	 * @return <code>true</code> if the given package is an internal process
-	 *         package
-	 */
-	protected boolean isInternalProcessPackage(MethodPackage methodPackage) {
-		if (methodPackage instanceof ProcessPackage) {
-			if (UmaUtil.getProcessComponent(methodPackage) != null) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Searches the contained artifacts of an artifact.
-	 * 
-	 * @param artifact
-	 *            an artifact
-	 */
-	protected void searchContainedArtifacts(Artifact artifact) {
-		if (artifact != null) {
-			for (Iterator i = artifact.getContainedArtifacts().iterator(); i
-					.hasNext()
-					&& !progressMonitor.isCanceled();) {
-				Artifact containedArtifact = (Artifact) i.next();
-				matchPattern(containedArtifact);
-				searchContainedArtifacts(containedArtifact);
-			}
-		}
-	}
-
-	/**
-	 * Searches the sub disciplines of a discipline.
-	 * 
-	 * @param discipline
-	 *            a discipline
-	 */
-	protected void searchSubDisciplines(Discipline discipline) {
-		if (discipline != null) {
-			for (Iterator i = discipline.getSubdiscipline().iterator(); i
-					.hasNext()
-					&& !progressMonitor.isCanceled();) {
-				Discipline subDiscipline = (Discipline) i.next();
-				matchPattern(subDiscipline);
-				searchSubDisciplines(subDiscipline);
-			}
-		}
-	}
-
-	/**
-	 * Searches the sub practices of a practice.
-	 * 
-	 * @param practice
-	 *            a practice
-	 */
-	protected void searchSubPractices(Practice practice) {
-		if (practice != null) {
-			for (Iterator i = practice.getSubPractices().iterator(); i
-					.hasNext()
-					&& !progressMonitor.isCanceled();) {
-				Practice subPractice = (Practice) i.next();
-				matchPattern(subPractice);
-				searchSubPractices(subPractice);
-			}
-		}
-	}
-
-	/**
-	 * Searches the sub domains of a domain.
-	 * 
-	 * @param domain
-	 *            a domain
-	 */
-	protected void searchSubDomains(Domain domain) {
-		if (domain != null) {
-			for (Iterator i = domain.getSubdomains().iterator(); i.hasNext()
-					&& !progressMonitor.isCanceled();) {
-				Domain subDomain = (Domain) i.next();
-				matchPattern(subDomain);
-				searchSubDomains(subDomain);
-			}
-		}
-	}
-
-	/**
-	 * Adds the given method element to the search result collection if its name
-	 * or presentation name matches the name pattern.
-	 * 
-	 * @param element
-	 *            a method element
-	 */
-	protected void matchPattern(MethodElement element) {
-		try {
-			if (searchInput.getSearchScope().include(element)) {
-				String name = element.getName();
-				String taskName = MessageFormat.format(SCAN_ELEMENT_TEXT,
-						new Object[] { name });
-				progressMonitor.setTaskName(taskName);
-				boolean foundMatch = false;
-				if (element instanceof DescribableElement) {
-					String presentationName = ((DescribableElement) element)
-							.getPresentationName();
-					foundMatch = (name != null && elementNamePattern.matcher(
-							name).matches())
-							|| (presentationName != null && elementNamePattern
-									.matcher(presentationName).matches());
-				} else {
-					foundMatch = (name != null && elementNamePattern.matcher(
-							name).matches());
-				}
-				if (foundMatch) {
-					if (searchString.length() == 0) {
-						result.accept(element);
-					} else {
-						try {
-							elementScanner.parse(element);
-						} catch (Exception e) {
-							e.printStackTrace();
-						}
-					}
-				}
-				progressMonitor.worked(1);
-			}
-		} catch (Exception e) {
-			SearchUIPlugin.getDefault().getLogger().logError(e);
-		}
-	}
-
-	/**
-	 * Returns the path of the content XML file associated with a method
-	 * element.
-	 */
-	protected String getElementPath(MethodElement element) {
-		Resource resource = null;
-		if (element instanceof DescribableElement) {
-			DescribableElement describableElement = (DescribableElement) element;
-			ContentDescription contentDescription = describableElement
-					.getPresentation();
-			if (contentDescription == null) {
-				return null;
-			}
-			resource = contentDescription.eResource();
-		} else {
-			resource = element.eResource();
-		}
-		if (resource != null) {
-			URI resourceURI = resource.getURI();
-			if (resourceURI != null) {
-				return resourceURI.toFileString();
-			}
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchPattern.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchPattern.java
deleted file mode 100644
index 0976111..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchPattern.java
+++ /dev/null
@@ -1,129 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-/**
- * Pattern contructor for a method search.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchPattern {
-
-	/**
-	 * Private constructor to prevent this class from being instantiated. All
-	 * methods in this class should be static.
-	 */
-	private MethodSearchPattern() {
-	}
-
-	/**
-	 * Creates a
-	 * <code>Pattern<code> object from the pattern string used in Method Search.
-	 * 
-	 * @param pattern
-	 *            a search pattern string
-	 * @param isCaseSensitive
-	 *            if <code>true</code>, create a case insensitve pattern
-	 * @param isRegexSearch
-	 *            if <code>true</code>, treat the pattern as a regular expression pattern
-	 * @return a new <code>Pattern<code> object
-	 * @throws <code>PatternSyntaxException</code> if the specified pattern has a syntax error
-	 */
-	public static Pattern createPattern(String pattern,
-			boolean isCaseSensitive, boolean isRegexSearch)
-			throws PatternSyntaxException {
-		if (!isRegexSearch) {
-			pattern = toRegexPattern(pattern);
-		}
-
-		if (!isCaseSensitive) {
-			return Pattern.compile(pattern, Pattern.CASE_INSENSITIVE
-					| Pattern.UNICODE_CASE | Pattern.MULTILINE);
-		}
-
-		return Pattern.compile(pattern, Pattern.MULTILINE);
-	}
-
-	/**
-	 * Converts a pattern string with '*' and '?' into a regular expression
-	 * pattern string.
-	 * 
-	 * @param pattern
-	 *            a pattern string
-	 * @return a regular expression pattern string
-	 */
-	private static String toRegexPattern(String pattern) {
-		int patternLength = pattern.length();
-		StringBuffer result = new StringBuffer(patternLength);
-
-		boolean escaped = false;
-		boolean quoting = false;
-
-		for (int i = 0; i < patternLength; i++) {
-			char ch = pattern.charAt(i);
-			switch (ch) {
-			case '*':
-				if (!escaped) {
-					if (quoting) {
-						result.append("\\E"); //$NON-NLS-1$
-						quoting = false;
-					}
-				}
-				result.append(".*"); //$NON-NLS-1$
-				escaped = false;
-				break;
-			case '?':
-				if (!escaped) {
-					if (quoting) {
-						result.append("\\E"); //$NON-NLS-1$
-						quoting = false;
-					}
-				}
-				result.append("."); //$NON-NLS-1$
-				escaped = false;
-				break;
-			case '\\':
-				if (!escaped) {
-					escaped = true;
-				} else {
-					escaped = false;
-					if (quoting) {
-						result.append("\\E"); //$NON-NLS-1$
-						quoting = false;
-					}
-					result.append("\\\\"); //$NON-NLS-1$
-				}
-				break;
-			default:
-				if (!quoting) {
-					result.append("\\Q"); //$NON-NLS-1$
-					quoting = true;
-				}
-				if (escaped && ch != '*' && ch != '?' && ch != '\\') {
-					result.append('\\');
-				}
-				result.append(ch);
-				escaped = (ch == '\\');
-			}
-		}
-
-		if (quoting) {
-			result.append("\\E"); //$NON-NLS-1$
-		}
-
-		return result.toString();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchQuery.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchQuery.java
deleted file mode 100644
index 2410049..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchQuery.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.search.ui.SearchUIResources;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.search.ui.ISearchQuery;
-import org.eclipse.search.ui.ISearchResult;
-import org.eclipse.search.ui.text.Match;
-
-/**
- * Encapsulates the search strings and options for a method search.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchQuery implements ISearchQuery {
-
-	private MethodSearchInput searchInput;
-
-	private MethodSearchResult searchResult;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param searchString
-	 *            a search string
-	 * @param namePattern
-	 *            a method element name pattern
-	 */
-	public MethodSearchQuery(MethodSearchInput searchInput) {
-		this.searchInput = searchInput;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchQuery#run(IProgressMonitor)
-	 */
-	public IStatus run(IProgressMonitor processMonitor) {
-		final MethodSearchResult searchResult = (MethodSearchResult) getSearchResult();
-		searchResult.removeAll();
-		ISearchResultCollector result = new ISearchResultCollector() {
-			public void accept(Object match) {
-				if (match instanceof MethodElement
-						&& !TngUtil.isPredefined((MethodElement) match)) {
-					searchResult.addMatch(new Match(match, Match.UNIT_LINE, 1,
-							1));
-				}
-			}
-		};
-		MethodSearchOperation operation = new MethodSearchOperation(
-				searchInput, result);
-		operation.execute(processMonitor);
-		processMonitor.done();
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchQuery#getLabel()
-	 */
-	public String getLabel() {
-		return SearchUIResources.searchQuery_text; 
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchQuery#canRerun()
-	 */
-	public boolean canRerun() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchQuery#canRunInBackground()
-	 */
-	public boolean canRunInBackground() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchQuery#getSearchResult()
-	 */
-	public ISearchResult getSearchResult() {
-		if (searchResult == null) {
-			searchResult = new MethodSearchResult(this);
-		}
-		return searchResult;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchQuery#getSearchResult()
-	 */
-	public MethodSearchInput getSearchInput() {
-		return searchInput;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchResult.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchResult.java
deleted file mode 100644
index 3b16311..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchResult.java
+++ /dev/null
@@ -1,121 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import java.text.MessageFormat;
-
-import org.eclipse.epf.search.ui.SearchUIPlugin;
-import org.eclipse.epf.search.ui.SearchUIResources;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.search.ui.ISearchQuery;
-import org.eclipse.search.ui.text.AbstractTextSearchResult;
-import org.eclipse.search.ui.text.IEditorMatchAdapter;
-import org.eclipse.search.ui.text.IFileMatchAdapter;
-import org.eclipse.search.ui.text.Match;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * The method search result.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchResult extends AbstractTextSearchResult implements
-		IEditorMatchAdapter {
-
-	private static final String MATCH_LABEL = SearchUIResources.searchResult_match; 
-
-	private static final String MATCHES_LABEL = SearchUIResources.searchResult_matches; 
-
-	// The search query.
-	private MethodSearchQuery searchQuery;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param searchQuery
-	 *            a method search query
-	 */
-	public MethodSearchResult(MethodSearchQuery searchQuery) {
-		this.searchQuery = searchQuery;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchResult#getQuery()
-	 */
-	public ISearchQuery getQuery() {
-		return searchQuery;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchResult#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return SearchUIPlugin.getDefault().getImageDescriptor(
-				"full/obj16/MethodSearch.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchResult#getLabel()
-	 */
-	public String getLabel() {
-		// TODO: Display search result in the form:
-		//    'candidate' - 6 matches in 4 elements.
-		String searchString = searchQuery.getSearchInput().getSearchString();
-		int matchCount = getMatchCount();
-		if (matchCount == 1) {
-			return MessageFormat.format(MATCH_LABEL,
-					new Object[] { searchString });		
-		} else {
-			return MessageFormat.format(MATCHES_LABEL, new Object[] {
-					searchString, "" + matchCount }); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.ISearchResult#getTooltip()
-	 */
-	public String getTooltip() {
-		return getLabel();
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchResult#getEditorMatchAdapter()
-	 */
-	public IEditorMatchAdapter getEditorMatchAdapter() {
-		return this;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.AbstractTextSearchResult#getFileMatchAdapter()
-	 */
-	public IFileMatchAdapter getFileMatchAdapter() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.IEditorMatchAdapter#isShownInEditor(Match,
-	 *      IEditorPart)
-	 */
-	public boolean isShownInEditor(Match match, IEditorPart editor) {
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.search.ui.text.IEditorMatchAdapter#computeContainedMatches(AbstractTextSearchResult,
-	 *      IEditorPart)
-	 */
-	public Match[] computeContainedMatches(AbstractTextSearchResult result,
-			IEditorPart editor) {
-		return null;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchScope.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchScope.java
deleted file mode 100644
index 86eadcf..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchScope.java
+++ /dev/null
@@ -1,236 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.epf.library.ui.LibraryUIText;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.impl.ActivityImpl;
-import org.eclipse.epf.uma.impl.ArtifactImpl;
-import org.eclipse.epf.uma.impl.CapabilityPatternImpl;
-import org.eclipse.epf.uma.impl.ChecklistImpl;
-import org.eclipse.epf.uma.impl.ConceptImpl;
-import org.eclipse.epf.uma.impl.ContentCategoryImpl;
-import org.eclipse.epf.uma.impl.ContentPackageImpl;
-import org.eclipse.epf.uma.impl.CustomCategoryImpl;
-import org.eclipse.epf.uma.impl.DeliverableImpl;
-import org.eclipse.epf.uma.impl.DeliveryProcessImpl;
-import org.eclipse.epf.uma.impl.DisciplineGroupingImpl;
-import org.eclipse.epf.uma.impl.DisciplineImpl;
-import org.eclipse.epf.uma.impl.DomainImpl;
-import org.eclipse.epf.uma.impl.EstimationConsiderationsImpl;
-import org.eclipse.epf.uma.impl.ExampleImpl;
-import org.eclipse.epf.uma.impl.GuidanceImpl;
-import org.eclipse.epf.uma.impl.GuidelineImpl;
-import org.eclipse.epf.uma.impl.IterationImpl;
-import org.eclipse.epf.uma.impl.MethodPluginImpl;
-import org.eclipse.epf.uma.impl.MilestoneImpl;
-import org.eclipse.epf.uma.impl.OutcomeImpl;
-import org.eclipse.epf.uma.impl.PhaseImpl;
-import org.eclipse.epf.uma.impl.PracticeImpl;
-import org.eclipse.epf.uma.impl.ProcessComponentImpl;
-import org.eclipse.epf.uma.impl.ProcessPackageImpl;
-import org.eclipse.epf.uma.impl.ReportImpl;
-import org.eclipse.epf.uma.impl.ReusableAssetImpl;
-import org.eclipse.epf.uma.impl.RoadmapImpl;
-import org.eclipse.epf.uma.impl.RoleDescriptorImpl;
-import org.eclipse.epf.uma.impl.RoleImpl;
-import org.eclipse.epf.uma.impl.RoleSetGroupingImpl;
-import org.eclipse.epf.uma.impl.RoleSetImpl;
-import org.eclipse.epf.uma.impl.SupportingMaterialImpl;
-import org.eclipse.epf.uma.impl.TaskDescriptorImpl;
-import org.eclipse.epf.uma.impl.TaskImpl;
-import org.eclipse.epf.uma.impl.TemplateImpl;
-import org.eclipse.epf.uma.impl.TermDefinitionImpl;
-import org.eclipse.epf.uma.impl.ToolImpl;
-import org.eclipse.epf.uma.impl.ToolMentorImpl;
-import org.eclipse.epf.uma.impl.WhitepaperImpl;
-import org.eclipse.epf.uma.impl.WorkProductDescriptorImpl;
-import org.eclipse.epf.uma.impl.WorkProductTypeImpl;
-
-/**
- * The method search scope.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchScope {
-
-	public static final String ROOT = "Root"; //$NON-NLS-1$
-
-	public static final String METHOD_CONTENT = LibraryUIText.TEXT_METHOD_CONTENT;
-
-	public static final String ROLE = LibraryUIText.TEXT_ROLE;
-
-	public static final String TASK = LibraryUIText.TEXT_TASK;
-
-	public static final String WORK_PRODUCT = LibraryUIText.TEXT_WORK_PRODUCT;
-
-	public static final String GUIDANCE = LibraryUIText.TEXT_GUIDANCE;
-
-	public static final String CHECKLIST = LibraryUIText.TEXT_CHECKLIST;
-
-	public static final String CONCEPT = LibraryUIText.TEXT_CONCEPT;
-
-	public static final String ESTIMATION_CONSIDERATIONS = LibraryUIText.TEXT_ESTIMATION_CONSIDERATIONS;
-
-	public static final String EXAMPLE = LibraryUIText.TEXT_EXAMPLE;
-
-	public static final String GUIDELINE = LibraryUIText.TEXT_GUIDELINE;
-
-	public static final String PRACTICE = LibraryUIText.TEXT_PRACTICE;
-
-	public static final String REPORT = LibraryUIText.TEXT_REPORT;
-
-	public static final String REUSABLE_ASSET = LibraryUIText.TEXT_REUSABLE_ASSET;
-
-	public static final String ROADMAP = LibraryUIText.TEXT_ROADMAP;
-
-	public static final String SUPPORTING_MATERIAL = LibraryUIText.TEXT_SUPPORTING_MATERIAL;
-
-	public static final String TEMPLATE = LibraryUIText.TEXT_TEMPLATE;
-
-	public static final String TERM_DEFINITION = LibraryUIText.TEXT_TERM_DEFINITION;
-
-	public static final String TOOL_MENTOR = LibraryUIText.TEXT_TOOL_MENTOR;
-
-	public static final String WHITEPAPER = LibraryUIText.TEXT_WHITEPAPER;
-
-	public static final String STANDARD_CATEGORY = LibraryUIText.TEXT_STANDARD_CATEGORY;
-
-	public static final String CUSTOM_CATEGORY = LibraryUIText.TEXT_CUSTOM_CATEGORY;
-
-	public static final String PROCESS = LibraryUIText.TEXT_PROCESS;
-
-	public static final String CAPABILITY_PATTERN = LibraryUIText.TEXT_CAPABILITY_PATTERN;
-
-	public static final String DELIVERY_PROCESS = LibraryUIText.TEXT_DELIVERY_PROCESS;
-
-	private static Map<Class, String> elementSearchScope = new HashMap<Class, String>();
-
-	static {
-		elementSearchScope.put(MethodPluginImpl.class, ROOT);
-		elementSearchScope.put(ContentPackageImpl.class, METHOD_CONTENT);
-		elementSearchScope.put(RoleImpl.class, ROLE);
-		elementSearchScope.put(TaskImpl.class, TASK);
-		elementSearchScope.put(ArtifactImpl.class, WORK_PRODUCT);
-		elementSearchScope.put(DeliverableImpl.class, WORK_PRODUCT);
-		elementSearchScope.put(OutcomeImpl.class, WORK_PRODUCT);
-		elementSearchScope.put(GuidanceImpl.class, GUIDANCE);
-		elementSearchScope.put(ChecklistImpl.class, CHECKLIST);
-		elementSearchScope.put(ConceptImpl.class, CONCEPT);
-		elementSearchScope.put(EstimationConsiderationsImpl.class,
-				ESTIMATION_CONSIDERATIONS);
-		elementSearchScope.put(ExampleImpl.class, EXAMPLE);
-		elementSearchScope.put(GuidelineImpl.class, GUIDELINE);
-		elementSearchScope.put(PracticeImpl.class, PRACTICE);
-		elementSearchScope.put(ReportImpl.class, REPORT);
-		elementSearchScope.put(ReusableAssetImpl.class, REUSABLE_ASSET);
-		elementSearchScope.put(RoadmapImpl.class, ROADMAP);
-		elementSearchScope.put(SupportingMaterialImpl.class,
-				SUPPORTING_MATERIAL);
-		elementSearchScope.put(TemplateImpl.class, TEMPLATE);
-		elementSearchScope.put(TermDefinitionImpl.class, TERM_DEFINITION);
-		elementSearchScope.put(ToolMentorImpl.class, TOOL_MENTOR);
-		elementSearchScope.put(WhitepaperImpl.class, WHITEPAPER);
-		elementSearchScope.put(ContentCategoryImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(DisciplineImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(DisciplineGroupingImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(DomainImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(WorkProductTypeImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(RoleSetImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(RoleSetGroupingImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(ToolImpl.class, STANDARD_CATEGORY);
-		elementSearchScope.put(CustomCategoryImpl.class, CUSTOM_CATEGORY);
-		elementSearchScope.put(ProcessPackageImpl.class, PROCESS);
-		elementSearchScope.put(ProcessComponentImpl.class, PROCESS);
-		elementSearchScope.put(PhaseImpl.class, PROCESS);
-		elementSearchScope.put(IterationImpl.class, PROCESS);
-		elementSearchScope.put(MilestoneImpl.class, PROCESS);
-		elementSearchScope.put(ActivityImpl.class, PROCESS);
-		elementSearchScope.put(RoleDescriptorImpl.class, PROCESS);
-		elementSearchScope.put(TaskDescriptorImpl.class, PROCESS);
-		elementSearchScope.put(WorkProductDescriptorImpl.class, PROCESS);
-		elementSearchScope.put(CapabilityPatternImpl.class, CAPABILITY_PATTERN);
-		elementSearchScope.put(DeliveryProcessImpl.class, DELIVERY_PROCESS);
-	}
-
-	private List<Object> searchScope = new ArrayList<Object>();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodSearchScope(Object[] elementTypes) {
-		searchScope.add(ROOT);
-		for (int i = 0; i < elementTypes.length; i++) {
-			Object elementType = elementTypes[i];
-			searchScope.add(elementType);
-		}
-	}
-
-	/**
-	 * Checks whether a core method element is included in the search scope.
-	 * 
-	 * @return <code>true</code> if a core method element is included in the
-	 *         search scope, <code>false</code> otherwise
-	 */
-	public boolean includeCoreContent() {
-		return searchScope.contains(ROLE) || searchScope.contains(TASK)
-				|| searchScope.contains(WORK_PRODUCT)
-				|| searchScope.contains(GUIDANCE)
-				|| searchScope.contains(CHECKLIST)
-				|| searchScope.contains(CONCEPT)
-				|| searchScope.contains(ESTIMATION_CONSIDERATIONS)
-				|| searchScope.contains(EXAMPLE)
-				|| searchScope.contains(GUIDELINE)
-				|| searchScope.contains(PRACTICE)
-				|| searchScope.contains(REPORT)
-				|| searchScope.contains(REUSABLE_ASSET)
-				|| searchScope.contains(ROADMAP)
-				|| searchScope.contains(SUPPORTING_MATERIAL)
-				|| searchScope.contains(TEMPLATE)
-				|| searchScope.contains(TERM_DEFINITION)
-				|| searchScope.contains(TOOL_MENTOR)
-				|| searchScope.contains(WHITEPAPER);
-	}
-
-	/**
-	 * Checks whether the given Method element is included in the search scope.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return <code>true</code> if the method element is included in the
-	 *         search scope, <code>false</code> otherwise
-	 */
-	public boolean include(MethodElement element) {
-		if (element == null)
-			return false;
-		String searchScopeName = (String) elementSearchScope.get(element
-				.getClass());
-		return searchScope.contains(searchScopeName);
-	}
-
-	/**
-	 * Checks whether the given method element type is included in the search
-	 * scope.
-	 * 
-	 * @return <code>true</code> if the given method element type is included
-	 *         in the search scope, <code>false</code> otherwise
-	 */
-	public boolean include(String searchScopeName) {
-		return searchScope.contains(searchScopeName);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchScopeViewer.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchScopeViewer.java
deleted file mode 100644
index 1578659..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/MethodSearchScopeViewer.java
+++ /dev/null
@@ -1,238 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Displays the searchable method elements, organized by types, in a tree view.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class MethodSearchScopeViewer {
-
-	private static final String ROOT = MethodSearchScope.ROOT;
-
-	private static final String METHOD_CONTENT = MethodSearchScope.METHOD_CONTENT;
-
-	private static final String ROLE = MethodSearchScope.ROLE;
-
-	private static final String TASK = MethodSearchScope.TASK;
-
-	private static final String WORK_PRODUCT = MethodSearchScope.WORK_PRODUCT;
-
-	private static final String GUIDANCE = MethodSearchScope.GUIDANCE;
-
-	private static final String CHECKLIST = MethodSearchScope.CHECKLIST;
-
-	private static final String CONCEPT = MethodSearchScope.CONCEPT;
-
-	private static final String ESTIMATION_CONSIDERATIONS = MethodSearchScope.ESTIMATION_CONSIDERATIONS;
-
-	private static final String EXAMPLE = MethodSearchScope.EXAMPLE;
-
-	private static final String GUIDELINE = MethodSearchScope.GUIDELINE;
-
-	private static final String PRACTICE = MethodSearchScope.PRACTICE;
-
-	private static final String REPORT = MethodSearchScope.REPORT;
-
-	private static final String REUSABLE_ASSET = MethodSearchScope.REUSABLE_ASSET;
-
-	private static final String ROADMAP = MethodSearchScope.ROADMAP;
-
-	private static final String SUPPORTING_MATERIAL = MethodSearchScope.SUPPORTING_MATERIAL;
-
-	private static final String TEMPLATE = MethodSearchScope.TEMPLATE;
-
-	private static final String TERM_DEFINITION = MethodSearchScope.TERM_DEFINITION;
-
-	private static final String TOOL_MENTOR = MethodSearchScope.TOOL_MENTOR;
-
-	private static final String WHITEPAPER = MethodSearchScope.WHITEPAPER;
-
-	private static final String STANDARD_CATEGORY = MethodSearchScope.STANDARD_CATEGORY;
-
-	private static final String CUSTOM_CATEGORY = MethodSearchScope.CUSTOM_CATEGORY;
-
-	private static final String PROCESS = MethodSearchScope.PROCESS;
-
-	private static final String CAPABILITY_PATTERN = MethodSearchScope.CAPABILITY_PATTERN;
-
-	private static final String DELIVERY_PROCESS = MethodSearchScope.DELIVERY_PROCESS;
-
-	private static List<String> rootList = new ArrayList<String>();
-	static {
-		rootList.add(METHOD_CONTENT);
-		rootList.add(PROCESS);
-	}
-
-	private static List<String> methodContentList = new ArrayList<String>();
-	static {
-		methodContentList.add(ROLE);
-		methodContentList.add(TASK);
-		methodContentList.add(WORK_PRODUCT);
-		methodContentList.add(GUIDANCE);
-		methodContentList.add(STANDARD_CATEGORY);
-		methodContentList.add(CUSTOM_CATEGORY);
-	}
-
-	private static List<String> guidanceList = new ArrayList<String>();
-	static {
-		guidanceList.add(CHECKLIST);
-		guidanceList.add(CONCEPT);
-		guidanceList.add(ESTIMATION_CONSIDERATIONS);
-		guidanceList.add(EXAMPLE);
-		guidanceList.add(GUIDELINE);
-		guidanceList.add(PRACTICE);
-		guidanceList.add(REPORT);
-		guidanceList.add(REUSABLE_ASSET);
-		guidanceList.add(ROADMAP);
-		guidanceList.add(SUPPORTING_MATERIAL);
-		guidanceList.add(TEMPLATE);
-		guidanceList.add(TERM_DEFINITION);
-		guidanceList.add(TOOL_MENTOR);
-		guidanceList.add(WHITEPAPER);
-	}
-
-	private static List<String> processList = new ArrayList<String>();
-	static {
-		processList.add(CAPABILITY_PATTERN);
-		processList.add(DELIVERY_PROCESS);
-	}
-
-	private static List<String> hasChildrenList = new ArrayList<String>();
-	static {
-		hasChildrenList.add(ROOT);
-		hasChildrenList.add(METHOD_CONTENT);
-		hasChildrenList.add(GUIDANCE);
-		hasChildrenList.add(PROCESS);
-	}
-
-	private CheckboxTreeViewer viewer;
-
-	/**
-	 * The content provider for the viewer.
-	 */
-	private static class ViewerContentProvider implements ITreeContentProvider {
-
-		private final Object[] EMPTY_LIST = new Object[0];
-
-		public Object[] getElements(Object parent) {
-			if (parent == ROOT) {
-				return getChildren(ROOT);
-			}
-			return getChildren(parent);
-		}
-
-		public Object[] getChildren(Object parent) {
-			if (parent == ROOT) {
-				return rootList.toArray();
-			} else if (parent == METHOD_CONTENT) {
-				return methodContentList.toArray();
-			} else if (parent == GUIDANCE) {
-				return guidanceList.toArray();
-			} else if (parent == PROCESS) {
-				return processList.toArray();
-			}
-			return EMPTY_LIST;
-		}
-
-		public Object getParent(Object child) {
-			if (rootList.contains(child)) {
-				return ROOT;
-			}
-			if (methodContentList.contains(child)) {
-				return METHOD_CONTENT;
-			} else if (guidanceList.contains(child)) {
-				return GUIDANCE;
-			} else if (processList.contains(child)) {
-				return PROCESS;
-			}
-			return EMPTY_LIST;
-		}
-
-		public boolean hasChildren(Object parent) {
-			return hasChildrenList.contains(parent);
-		}
-
-		public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
-		}
-
-		public void dispose() {
-		}
-
-	}
-
-	/**
-	 * The label provider for the viewer.
-	 */
-	private static class ViewerLabelProvider extends LabelProvider {
-
-		public String getText(Object obj) {
-			return obj.toString();
-		}
-
-		public Image getImage(Object obj) {
-			return null;
-		}
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public MethodSearchScopeViewer(Composite parent, int style) {
-		viewer = new CheckboxTreeViewer(parent, style);
-		viewer.getTree().setLayout(new GridLayout(1, false));
-		viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		viewer.setContentProvider(new ViewerContentProvider());
-		viewer.setLabelProvider(new ViewerLabelProvider());
-		viewer.setInput(ROOT);
-		viewer.expandToLevel(2);
-		viewer.setSubtreeChecked(METHOD_CONTENT, true);
-		viewer.setSubtreeChecked(PROCESS, true);
-		viewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				Object selectedElement = event.getElement();
-				viewer.setSubtreeChecked(selectedElement, event.getChecked());
-				if (!event.getChecked()) {
-					viewer.setParentsGrayed(selectedElement, true);
-					viewer.setGrayChecked(selectedElement, false);
-				} else {
-					viewer.setParentsGrayed(selectedElement, false);
-				}
-			}
-		});
-	}
-
-	/**
-	 * Returns the selected method element types.
-	 * 
-	 * @return an array of selected method element types
-	 */
-	public MethodSearchScope getSearchScope() {
-		return new MethodSearchScope(viewer.getCheckedElements());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultLabelProvider.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultLabelProvider.java
deleted file mode 100644
index 84fb2cf..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultLabelProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The label provider for the method search result tree and table viewers.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchResultLabelProvider extends LabelProvider {
-
-	private static ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
-			new UmaItemProviderAdapterFactory());
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SearchResultLabelProvider() {
-		super();
-	}
-
-	/**
-	 * @see LabelProvider#getText(Object)
-	 */
-	public String getText(Object obj) {
-		if (obj instanceof SearchResultUIFolder) {
-			return ((SearchResultUIFolder) obj).getName();
-		} else if (obj instanceof MethodElement) {
-			return ((MethodElement) obj).getName();
-		}
-		return labelProvider.getText(obj);
-	}
-
-	/**
-	 * @see LabelProvider#getImage(Object)
-	 */
-	public Image getImage(Object obj) {
-		if (obj instanceof SearchResultUIFolder) {
-			return ((SearchResultUIFolder) obj).getImage();
-		}
-		return labelProvider.getImage(obj);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultTableContentProvider.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultTableContentProvider.java
deleted file mode 100644
index ec10342..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultTableContentProvider.java
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The content provider for the method search result table viewer.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchResultTableContentProvider implements
-		IStructuredContentProvider {
-
-	private static final Object[] EMPTY_LIST = new Object[0];
-
-	private TableViewer tableViewer;
-
-	private MethodSearchResult searchResult;
-
-	/**
-	 * @see IStructuredContentProvider#getElements(Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		if (inputElement instanceof MethodSearchResult) {
-			return ((MethodSearchResult) inputElement).getElements();
-		}
-		return EMPTY_LIST;
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput != null && newInput instanceof MethodSearchResult) {
-			tableViewer = (TableViewer) viewer;
-			searchResult = (MethodSearchResult) newInput;
-		}
-	}
-
-	public void elementsChanged(Object[] updatedElements) {
-		for (int i = 0; i < updatedElements.length; i++) {
-			if (searchResult.getMatchCount(updatedElements[i]) > 0) {
-				if (tableViewer.testFindItem(updatedElements[i]) != null) {
-					tableViewer.refresh(updatedElements[i]);
-				} else {
-					tableViewer.add(updatedElements[i]);
-				}
-			} else {
-				tableViewer.remove(updatedElements[i]);
-			}
-		}
-		tableViewer.refresh();
-	}
-
-	public void clear() {
-		tableViewer.refresh();
-	}
-
-	public void dispose() {
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultTreeContentProvider.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultTreeContentProvider.java
deleted file mode 100644
index 4b110e7..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultTreeContentProvider.java
+++ /dev/null
@@ -1,495 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.epf.search.ui.SearchUIResources;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-/**
- * The content provider for the method search result tree viewer.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchResultTreeContentProvider implements ITreeContentProvider {
-
-	private static final String PKG_NAME_CONTENT = "Content"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_CORE_CONTENT = "CoreContent"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_CATEGORIES = "Categories"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_DISCIPLINES = "Disciplines"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_DOMAINS = "Domains"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_WORK_PRODUCT_TYPES = "WP Types"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_ROLESETS = "RoleSets"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_TOOLS = "Tools"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_CUSTOM_CATEGORIES = "CustomCategories"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_CAPABILITY_PATTERNS = "CapabilityPatterns"; //$NON-NLS-1$
-
-	private static final String PKG_NAME_DELIVERY_PROCESSES = "DeliveryProcesses"; //$NON-NLS-1$
-
-	private static final String METHOD_CONTENT = SearchUIResources.searchResult_methodContent; 
-
-	private static final String CONTENT_PACKAGES = SearchUIResources.searchResult_contentPackages; 
-
-	private static final String STANDARD_CATEGORIES = SearchUIResources.searchResult_standardCategories; 
-
-	private static final String DISCIPLINES = SearchUIResources.searchResult_disciplines; 
-
-	private static final String DOMAINS = SearchUIResources.searchResult_domains; 
-
-	private static final String WORK_PRODUCT_TYPES = SearchUIResources.searchResult_workProductTypes; 
-
-	private static final String ROLESETS = SearchUIResources.searchResult_roleSets; 
-
-	private static final String TOOLS = SearchUIResources.searchResult_tools; 
-
-	private static final String CUSTOM_CATEGORIES = SearchUIResources.searchResult_customCategories; 
-
-	private static final String PROCESSES = SearchUIResources.searchResult_processes; 
-
-	private static final String CAPABILITY_PATTERNS = SearchUIResources.searchResult_capabilityPatterns; 
-
-	private static final String DELIVERY_PROCESSES = SearchUIResources.searchResult_deliveryProcesses; 
-
-	private static final Object[] EMPTY_LIST = new Object[0];
-
-	private TreeViewer treeViewer;
-
-	private MethodSearchResult searchResult;
-
-	private Map<Object, Object> elementMap;
-
-	/**
-	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
-	 */
-	public Object[] getElements(Object inputElement) {
-		if (inputElement instanceof MethodSearchResult) {
-			Object[] elements = ((MethodSearchResult) inputElement)
-					.getElements();
-			if (elements.length == 0) {
-				return EMPTY_LIST;
-			}
-			elementMap = new HashMap<Object, Object>();
-			for (int i = 0; i < elements.length; i++) {
-				insert(elements[i], false);
-			}
-
-			insertUIFolders(inputElement);
-		}
-		return getChildren(inputElement);
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput != null && newInput instanceof MethodSearchResult) {
-			treeViewer = (TreeViewer) viewer;
-			searchResult = (MethodSearchResult) newInput;
-		}
-	}
-
-	public void elementsChanged(Object[] updatedElements) {
-		for (int i = 0; i < updatedElements.length; i++) {
-			if (searchResult.getMatchCount(updatedElements[i]) > 0) {
-				if (treeViewer.testFindItem(updatedElements[i]) != null) {
-					insert(updatedElements[i], true);
-				} else {
-					remove(updatedElements[i], true);
-				}
-			} else {
-				treeViewer.remove(updatedElements[i]);
-			}
-		}
-		treeViewer.refresh();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
-	 */
-	public Object[] getChildren(Object parentElement) {
-		if (elementMap == null) {
-			return EMPTY_LIST;
-		}
-		Set children = (Set) elementMap.get(parentElement);
-		if (children == null) {
-			return EMPTY_LIST;
-		}
-		return children.toArray();
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof MethodPlugin) {
-			return null;
-		} else if (element instanceof SearchResultUIFolder) {
-			return ((SearchResultUIFolder) element).getParent();
-		} else if (element instanceof ProcessPackage) {
-			ProcessPackage processPackage = (ProcessPackage) element;
-			Object parent = processPackage.eContainer();
-			if (parent instanceof ProcessComponent) {
-				ProcessComponent processComponent = (ProcessComponent) parent;
-				return processComponent.getProcess();
-			} else {
-				return parent;
-			}
-		} else if (element instanceof MethodPackage) {
-			MethodPackage methodPackage = (MethodPackage) element;
-			Object parent = methodPackage.eContainer();
-			if (parent instanceof MethodPlugin) {
-				return parent;
-			}
-			MethodPackage parentPackage = methodPackage.getParentPackage();
-			return parentPackage;
-		} else if (element instanceof Artifact) {
-			Artifact artifact = (Artifact) element;
-			Artifact containerArtifact = artifact.getContainerArtifact();
-			if (containerArtifact != null) {
-				return containerArtifact;
-			} else {
-				return UmaUtil.getContentPackage(artifact);
-			}
-		} else if (element instanceof Practice) {
-			Practice practice = (Practice) element;
-			return practice.getContainer();
-		} else if (element instanceof Discipline) {
-			Discipline discipline = (Discipline) element;
-			return discipline.getContainer();			
-		} else if (element instanceof Domain) {
-			Domain domain = (Domain) element;
-			return domain.getContainer();
-		} else if (element instanceof ContentElement) {
-			return UmaUtil.getContentPackage((ContentElement) element);
-		} else if (element instanceof Process) {
-			Process process = (Process) element;
-			ProcessPackage parent = (ProcessPackage) process.eContainer();
-			if (parent != null) {
-				return parent.eContainer();
-			}
-		} else if (element instanceof Activity) {
-			ProcessPackage processPackage = UmaUtil
-					.getProcessPackage((ProcessElement) element);
-			if (processPackage != null) {
-				ProcessPackage parentPackage = (ProcessPackage) processPackage
-						.getParentPackage();
-				if (parentPackage != null) {
-					if (parentPackage instanceof ProcessComponent) {
-						ProcessComponent processComponent = (ProcessComponent) parentPackage;
-						return processComponent.getProcess();
-					}
-					List processElements = parentPackage.getProcessElements();
-					for (Iterator i = processElements.iterator(); i.hasNext();) {
-						ProcessElement processElement = (ProcessElement) i
-								.next();
-						if (processElement instanceof Activity
-								&& processElement.getName().equals(
-										parentPackage.getName())) {
-							return processElement;
-						}
-					}
-				}
-			}
-		} else if (element instanceof ProcessElement) {
-			ProcessPackage processPackage = UmaUtil
-					.getProcessPackage((ProcessElement) element);
-			if (processPackage != null) {
-				if (processPackage instanceof ProcessComponent) {
-					ProcessComponent processComponent = (ProcessComponent) processPackage;
-					return processComponent.getProcess();
-				}
-				List processElements = processPackage.getProcessElements();
-				for (Iterator i = processElements.iterator(); i.hasNext();) {
-					ProcessElement processElement = (ProcessElement) i.next();
-					if (processElement instanceof Activity
-							&& processElement.getName().equals(
-									processPackage.getName())) {
-						return processElement;
-					}
-				}
-				return processPackage;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object)
-	 */
-	public boolean hasChildren(Object element) {
-		return getChildren(element).length > 0;
-	}
-
-	public void clear() {
-		treeViewer.refresh();
-	}
-
-	public void dispose() {
-	}
-
-	protected void insert(Object child, boolean refreshViewer) {
-		Object parent = getParent(child);
-		while (parent != null) {
-			if (insertChild(parent, child)) {
-				if (refreshViewer) {
-					treeViewer.add(parent, child);
-				}
-			} else {
-				if (refreshViewer) {
-					treeViewer.refresh(parent);
-				}
-				return;
-			}
-			child = parent;
-			parent = getParent(child);
-		}
-		if (insertChild(searchResult, child)) {
-			if (refreshViewer) {
-				treeViewer.add(searchResult, child);
-			}
-		}
-	}
-
-	protected boolean insertChild(Object parent, Object child) {
-		Set children = (Set) elementMap.get(parent);
-		if (children == null) {
-			children = new HashSet();
-			elementMap.put(parent, children);
-		}
-		return children.add(child);
-	}
-
-	protected void replace(Object parent, Object child, Object newChild) {
-		insert(newChild, false);
-		elementMap.put(newChild, (Set) elementMap.get(child));
-		elementMap.remove(child);
-		Set children = (Set) elementMap.get(parent);
-		children.remove(child);
-	}
-
-	protected void remove(Object element, boolean refreshViewer) {
-		if (hasChildren(element)) {
-			if (refreshViewer) {
-				treeViewer.refresh(element);
-			}
-		} else {
-			if (searchResult.getMatchCount(element) == 0) {
-				elementMap.remove(element);
-				Object parent = getParent(element);
-				if (parent != null) {
-					removeFromSiblings(element, parent);
-					remove(parent, refreshViewer);
-				} else {
-					removeFromSiblings(element, searchResult);
-					if (refreshViewer) {
-						treeViewer.refresh();
-					}
-				}
-			} else {
-				if (refreshViewer) {
-					treeViewer.refresh(element);
-				}
-			}
-		}
-	}
-
-	protected void removeFromSiblings(Object element, Object parent) {
-		Set siblings = (Set) elementMap.get(parent);
-		if (siblings != null) {
-			siblings.remove(element);
-		}
-	}
-
-	/**
-	 * Inserts the UI folders into the search result tree.
-	 */
-	protected void insertUIFolders(Object inputElement) {
-		Object[] elements = getChildren(inputElement);
-		for (int i = 0; i < elements.length; i++) {
-			Object element = elements[i];
-			if (element instanceof MethodPlugin) {
-				SearchResultUIFolder methodContentFolder = new SearchResultUIFolder(
-						METHOD_CONTENT, ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-								.getImage("full/obj16/Content")), element); //$NON-NLS-1$
-				SearchResultUIFolder processesFolder = new SearchResultUIFolder(
-						PROCESSES, ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-								.getImage("full/obj16/Processes")), element); //$NON-NLS-1$
-				Object[] methodPackages = getChildren(element);
-				for (int j = 0; j < methodPackages.length; j++) {
-					Object methodPackage = methodPackages[j];
-					if (methodPackage instanceof ContentPackage
-							&& ((ContentPackage) methodPackage).getName()
-									.equals(PKG_NAME_CONTENT)) {
-						Object[] packages = getChildren(methodPackage);
-						for (int k = 0; k < packages.length; k++) {
-							Object pkg = packages[k];
-							if (pkg instanceof ContentPackage) {
-								if (((ContentPackage) pkg).getName().equals(
-										PKG_NAME_CORE_CONTENT)) {
-									replace(
-											element,
-											pkg,
-											new SearchResultUIFolder(
-													CONTENT_PACKAGES,
-													ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-															.getImage("full/obj16/MethodPackages")), methodContentFolder)); //$NON-NLS-1$
-								} else if (((ContentPackage) pkg).getName()
-										.equals(PKG_NAME_CATEGORIES)) {
-									SearchResultUIFolder standardCategoriesFolder = new SearchResultUIFolder(
-											STANDARD_CATEGORIES,
-											ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-													.getImage("full/obj16/StandardCategories")), methodContentFolder); //$NON-NLS-1$
-									SearchResultUIFolder customCategoriesFolder = new SearchResultUIFolder(
-											CUSTOM_CATEGORIES,
-											ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-													.getImage("full/obj16/CustomCategories")), methodContentFolder); //$NON-NLS-1$
-									Object[] contentPackages = getChildren(pkg);
-									for (int l = 0; l < contentPackages.length; l++) {
-										Object contentPackage = contentPackages[l];
-										if (contentPackage instanceof ContentPackage) {
-											String pkgName = ((ContentPackage) contentPackage)
-													.getName();
-											if (pkgName
-													.equals(PKG_NAME_CUSTOM_CATEGORIES)) {
-												insert(customCategoriesFolder,
-														false);
-												elementMap
-														.put(
-																customCategoriesFolder,
-																(Set) elementMap
-																		.get(contentPackage));
-											} else if (pkgName
-													.equals(PKG_NAME_DISCIPLINES)) {
-												insert(
-														standardCategoriesFolder,
-														false);
-												replace(
-														element,
-														contentPackage,
-														new SearchResultUIFolder(
-																DISCIPLINES,
-																ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-																		.getImage("full/obj16/Disciplines")), standardCategoriesFolder)); //$NON-NLS-1$
-											} else if (pkgName
-													.equals(PKG_NAME_DOMAINS)) {
-												insert(
-														standardCategoriesFolder,
-														false);
-												replace(
-														element,
-														contentPackage,
-														new SearchResultUIFolder(
-																DOMAINS,
-																ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-																		.getImage("full/obj16/Domains")), standardCategoriesFolder)); //$NON-NLS-1$
-											} else if (pkgName
-													.equals(PKG_NAME_WORK_PRODUCT_TYPES)) {
-												insert(
-														standardCategoriesFolder,
-														false);
-												replace(
-														element,
-														contentPackage,
-														new SearchResultUIFolder(
-																WORK_PRODUCT_TYPES,
-																ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-																		.getImage("full/obj16/WorkProductTypes")), standardCategoriesFolder)); //$NON-NLS-1$
-											} else if (pkgName
-													.equals(PKG_NAME_ROLESETS)) {
-												insert(
-														standardCategoriesFolder,
-														false);
-												replace(
-														element,
-														contentPackage,
-														new SearchResultUIFolder(
-																ROLESETS,
-																ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-																		.getImage("full/obj16/Roles")), standardCategoriesFolder)); //$NON-NLS-1$
-											} else if (pkgName
-													.equals(PKG_NAME_TOOLS)) {
-												insert(
-														standardCategoriesFolder,
-														false);
-												replace(
-														element,
-														contentPackage,
-														new SearchResultUIFolder(
-																TOOLS,
-																ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-																		.getImage("full/obj16/Tools")), standardCategoriesFolder)); //$NON-NLS-1$
-											}
-										}
-									}
-									elementMap.remove(pkg);
-								}
-							} else if (pkg instanceof ProcessPackage
-									&& ((ProcessPackage) pkg).getName().equals(
-											PKG_NAME_CAPABILITY_PATTERNS)) {
-								replace(
-										element,
-										pkg,
-										new SearchResultUIFolder(
-												CAPABILITY_PATTERNS,
-												ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-														.getImage("full/obj16/CapabilityPatterns")), processesFolder)); //$NON-NLS-1$
-							}
-						}
-						Set children = (Set) elementMap.get(element);
-						children.remove(methodPackage);
-					} else if (methodPackage instanceof ProcessPackage
-							&& ((ProcessPackage) methodPackage).getName()
-									.equals(PKG_NAME_DELIVERY_PROCESSES)) {
-						replace(
-								element,
-								methodPackage,
-								new SearchResultUIFolder(
-										DELIVERY_PROCESSES,
-										ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-												.getImage("full/obj16/DeliveryProcesses")), processesFolder)); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultUIFolder.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultUIFolder.java
deleted file mode 100644
index 551b7d6..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/SearchResultUIFolder.java
+++ /dev/null
@@ -1,119 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.internal;
-
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-import org.eclipse.epf.library.edit.LibraryEditPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Models a UI folder in the method search result tree view.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchResultUIFolder {
-
-	private static final Image DEFAULT_IMAGE = ExtendedImageRegistry.getInstance().getImage(LibraryEditPlugin.INSTANCE
-			.getImage("full/obj16/Folder")); //$NON-NLS-1$
-
-	private String name;
-
-	private Image image;
-
-	private Object parent;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            The name for the folder.
-	 */
-	public SearchResultUIFolder(String name) {
-		this(name, DEFAULT_IMAGE, null);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            a name for the folder
-	 * @param parent
-	 *            the parent object
-	 */
-	public SearchResultUIFolder(String name, Object parent) {
-		this(name, DEFAULT_IMAGE, parent);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            a name for the folder
-	 * @param image
-	 *            an image for the folder
-	 * @param parent
-	 *            the parent object
-	 */
-	public SearchResultUIFolder(String name, Image image, Object parent) {
-		this.name = name;
-		this.image = image;
-		this.parent = parent;
-	}
-
-	/**
-	 * Returns the name.
-	 * 
-	 * @return the folder name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Returns the image.
-	 * 
-	 * @return the image for a UI folder
-	 */
-	public Image getImage() {
-		return image;
-	}
-
-	/**
-	 * Returns the parent object.
-	 * 
-	 * @return the parent object for the folder
-	 */
-	public Object getParent() {
-		return parent;
-	}
-
-	/**
-	 * Sets the parent object.
-	 * 
-	 * @param parent
-	 *            the parent object
-	 * @return the given parent object
-	 */
-	public Object setParent(Object parent) {
-		return this.parent = parent;
-	}
-
-	/**
-	 * Returns the string representation of this object.
-	 * 
-	 * @return the folder name
-	 */
-	public String toString() {
-		return name;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/package.html b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/package.html
deleted file mode 100644
index 3fcbc2e..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for searching a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/package.html b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/package.html
deleted file mode 100644
index 4d56121..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for searching a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/preferences/SearchUIPreferences.java b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/preferences/SearchUIPreferences.java
deleted file mode 100644
index 9556145..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/preferences/SearchUIPreferences.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.ui.preferences;
-
-import org.eclipse.epf.search.ui.SearchUIPlugin;
-
-/**
- * Manages the Search UI preferences.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchUIPreferences {
-
-	/**
-	 * The Search UI preference keys.
-	 */
-	public static final String SEARCH_STRING = "searchString"; //$NON-NLS-1$
-
-	public static final String NAME_PATTERN = "namePattern"; //$NON-NLS-1$
-
-	public static final String CASE_SENSITIVE = "caseSensitive"; //$NON-NLS-1$	
-
-	/**
-	 * Returns the saved search string.
-	 */
-	public static String getSearchString() {
-		return SearchUIPlugin.getDefault().getPreferenceStore().getString(
-				SEARCH_STRING);
-	}
-
-	/**
-	 * Saves the current search string.
-	 */
-	public static void setSearchString(String searchString) {
-		SearchUIPlugin.getDefault().getPreferenceStore().setValue(
-				SEARCH_STRING, searchString);
-	}
-
-	/**
-	 * Returns the saved name pattern string.
-	 */
-	public static String getNamePattern() {
-		return SearchUIPlugin.getDefault().getPreferenceStore().getString(
-				NAME_PATTERN);
-	}
-
-	/**
-	 * Saves the current name pattern string.
-	 */
-	public static void setNamePattern(String namePattern) {
-		SearchUIPlugin.getDefault().getPreferenceStore().setValue(NAME_PATTERN,
-				namePattern);
-	}
-
-	/**
-	 * Returns the saved ase sensitive option.
-	 */
-	public static boolean getCaseSensitive() {
-		return SearchUIPlugin.getDefault().getPreferenceStore().getBoolean(
-				CASE_SENSITIVE);
-	}
-
-	/**
-	 * Saves the current case sensitive option.
-	 */
-	public static void setCaseSensitive(boolean caseSensitive) {
-		SearchUIPlugin.getDefault().getPreferenceStore().setValue(
-				CASE_SENSITIVE, caseSensitive);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/preferences/package.html b/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/preferences/package.html
deleted file mode 100644
index 51039ed..0000000
--- a/1.5/plugins/org.eclipse.epf.search.ui/src/org/eclipse/epf/search/ui/preferences/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides preference support for searching a method library.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/.classpath b/1.5/plugins/org.eclipse.epf.search/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.search/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.search/.project b/1.5/plugins/org.eclipse.epf.search/.project
deleted file mode 100644
index bda53ad..0000000
--- a/1.5/plugins/org.eclipse.epf.search/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.search</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.search/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.search/META-INF/MANIFEST.MF
deleted file mode 100644
index 1e1c8b4..0000000
--- a/1.5/plugins/org.eclipse.epf.search/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.search
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.search.SearchPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: com.ibm.icu,
- org.eclipse.core.runtime,
- org.eclipse.epf.library;visibility:=reexport,
- org.apache.lucene;visibility:=reexport,
- org.eclipse.search,
- org.eclipse.help.base
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.search,
- org.eclipse.epf.search.analysis,
- org.eclipse.epf.search.configuration
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.search/build.properties b/1.5/plugins/org.eclipse.epf.search/build.properties
deleted file mode 100644
index 97d6f55..0000000
--- a/1.5/plugins/org.eclipse.epf.search/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties
-
diff --git a/1.5/plugins/org.eclipse.epf.search/plugin.properties b/1.5/plugins/org.eclipse.epf.search/plugin.properties
deleted file mode 100644
index 6fc7031..0000000
--- a/1.5/plugins/org.eclipse.epf.search/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Search
-providerName=Eclipse.org
-               
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/GenerateSearchIndexException.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/GenerateSearchIndexException.java
deleted file mode 100644
index cf6e7c1..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/GenerateSearchIndexException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-/**
- * Signals that a search index generation operation has failed.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class GenerateSearchIndexException extends SearchServiceException {
-
-	private static final long serialVersionUID = 6537405211451177110L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public GenerateSearchIndexException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public GenerateSearchIndexException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public GenerateSearchIndexException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception and the
-	 * error message.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public GenerateSearchIndexException(Throwable rootCause, String errorMsg) {
-		super(rootCause, errorMsg);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/ISearchService.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/ISearchService.java
deleted file mode 100644
index b09a215..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/ISearchService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-import org.eclipse.epf.search.configuration.ConfigurationHitEntry;
-import org.eclipse.epf.search.configuration.ConfigurationSearchQuery;
-
-/**
- * The Search Service API.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public interface ISearchService {
-
-	/**
-	 * Searches a published configuration.
-	 * 
-	 * @param path
-	 *            an absolute path to a published configuration
-	 * @param searchQuery
-	 *            a configuration search query
-	 * @return an array of <code>ConfigurationHitEntry</code> objects
-	 * @throws SearchServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public ConfigurationHitEntry[] searchConfiguration(String path,
-			ConfigurationSearchQuery searchQuery) throws SearchServiceException;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/IndexBuilder.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/IndexBuilder.java
deleted file mode 100644
index 3b79051..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/IndexBuilder.java
+++ /dev/null
@@ -1,418 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.analysis.cjk.CJKAnalyzer;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.store.FSDirectory;
-import org.eclipse.epf.search.analysis.TextAnalyzer;
-import org.eclipse.epf.search.utils.JarCreator;
-import org.eclipse.epf.search.utils.LHTMLParser;
-import org.eclipse.epf.search.utils.UNCUtil;
-
-/**
- * This class is the main class that creates the Index from the file
- * associations in the process layout.
- */
-public class IndexBuilder {
-
-	static final String VERSION_FILE_NAME = "version.txt"; //$NON-NLS-1$
-	static final String VERSION_DELIMITER = "*"; //$NON-NLS-1$
-
-	/**
-	 * Document fields.
-	 */
-	public static final String BRIEF_DESCRIPTION_FIELD = "briefDescription"; //$NON-NLS-1$
-	public static final String CONTENT_FIELD = "contents"; //$NON-NLS-1$
-	public static final String ID_FIELD = "id"; //$NON-NLS-1$
-	public static final String MODIFIED_FIELD = "modified"; //$NON-NLS-1$
-	public static final String NAME_FIELD = "name"; //$NON-NLS-1$
-	public static final String ROLE_FIELD = "role"; //$NON-NLS-1$
-	public static final String SUMMARY_FIELD = "summary"; //$NON-NLS-1$
-	public static final String TYPE_FIELD = "type"; //$NON-NLS-1$
-	public static final String URL_FIELD = "url"; //$NON-NLS-1$
-	public static final String TITLE_FIELD = "title"; //$NON-NLS-1$
-	public static final String UMA_ELEMENT_TYPE_FIELD = "uma.type"; //$NON-NLS-1$
-	public static final String GENERAL_CONTENT = "general_content"; //$NON-NLS-1$
-
-	// List of UMA elements that should be included in the search index.
-	private static List NO_SEARCHEABLE_UMA_ELEMENTS = new ArrayList();
-	static {
-		NO_SEARCHEABLE_UMA_ELEMENTS.add("summary"); //$NON-NLS-1$
-		NO_SEARCHEABLE_UMA_ELEMENTS.add("workproductdescriptor"); //$NON-NLS-1$
-		NO_SEARCHEABLE_UMA_ELEMENTS.add("taskdescriptor"); //$NON-NLS-1$
-		NO_SEARCHEABLE_UMA_ELEMENTS.add("roledescriptor"); //$NON-NLS-1$
-	}
-
-	// A list of top level directories that should be excluded from the search
-	// index.
-	public static List dirsToSkip = new ArrayList();
-	public static String pDirectory = null;
-	private StringBuffer indexFolder = null;
-	private String productName = null;
-	private List filesToSkip = new ArrayList();
-
-	public IndexBuilder(String publishDir) {
-		int appletIndex = -1;
-		if (publishDir == null)
-			return;
-
-		appletIndex = publishDir.indexOf(File.separator + "applet"); //$NON-NLS-1$
-
-		pDirectory = UNCUtil.convertFilename((appletIndex > -1) ? publishDir
-				.substring(0, appletIndex + 1) : publishDir);
-		String siteName = pDirectory.replace(File.separatorChar, '/');
-		int index = siteName.length();
-		if (siteName.endsWith("/")) { //$NON-NLS-1$
-			index = index - 1;
-		}
-
-		int index2 = siteName.lastIndexOf("/", index - 1); //$NON-NLS-1$
-
-		productName = siteName.substring(index2 + 1, index);
-
-		// create the index
-		StringBuffer searchFolder = new StringBuffer(pDirectory);
-		if (!searchFolder.toString().endsWith(File.separator)) {
-			searchFolder.append(File.separator);
-		}
-		searchFolder.append("search"); //$NON-NLS-1$
-
-		indexFolder = new StringBuffer(searchFolder.toString());
-		indexFolder.append(File.separator).append("index"); //$NON-NLS-1$
-
-		dirsToSkip.add(pDirectory + "applet"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "css"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "ext_help"); //$NON-NLS-1$		
-		dirsToSkip.add(pDirectory + "icons"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "images"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "index"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "logs"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "manuals"); //$NON-NLS-1$		
-		dirsToSkip.add(pDirectory + "noapplet"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "pages_not_installed"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "process"); //$NON-NLS-1$		
-		dirsToSkip.add(pDirectory + "scripts"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "stylesheets"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "xml"); //$NON-NLS-1$
-		dirsToSkip.add(pDirectory + "search"); //$NON-NLS-1$
-
-		filesToSkip.add("_desc.htm");  //$NON-NLS-1$
-		filesToSkip.add("_wbs.htm"); //$NON-NLS-1$
-		filesToSkip.add("_tbs.htm"); //$NON-NLS-1$
-		filesToSkip.add("_wpbs.htm"); //$NON-NLS-1$
-	}
-	
-	public boolean createIndex(boolean jarIt) throws SearchServiceException {
-		synchronized (IndexBuilder.class) {
-			
-			if (indexFolder == null || pDirectory == null) {
-				throw new IllegalStateException(
-						"Invalid indexFolder or pDirectory"); //$NON-NLS-1$
-			}
-
-			
-			boolean jako = false;
-			Locale locale = Locale.getDefault();
-			String lang = locale.getLanguage();
-			if (lang.equals(Locale.JAPANESE.getLanguage()) ||
-				lang.equals(Locale.KOREA.getLanguage())) {
-				jako = true;
-			}
-			Analyzer analyzer = jako ? new CJKAnalyzer() : new TextAnalyzer();
-			
-			try {
-				// RAMDirectory ramDir = new RAMDirectory();
-				IndexWriter fsWriter = new IndexWriter(FSDirectory
-						.getDirectory(indexFolder.toString(), true),
-						analyzer, true);
-
-				// IndexWriter ramWriter = new IndexWriter(ramDir,
-				// new TextAnalyzer(), true);
-
-				if ((fsWriter != null)) {
-					// fsWriter.mergeFactor = 1000;
-					// fsWriter.maxMergeDocs = 10000;
-					fsWriter.setMaxFieldLength(1000000);
-
-					indexDocs(new File(pDirectory), fsWriter);
-
-					// fsWriter.addIndexes(new Directory[] { ramDir });
-					fsWriter.optimize();
-					// ramWriter.close();
-					fsWriter.close();
-				}
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-
-			// create the version file.
-			Date today = new Date();
-			long milliseconds = today.getTime();
-
-			if (!jarIt) {
-				try {
-					FileWriter fw = new FileWriter(indexFolder + File.separator
-							+ VERSION_FILE_NAME);
-					BufferedWriter bw = new BufferedWriter(fw);
-					bw.write(productName + VERSION_DELIMITER + milliseconds
-							+ "\n"); //$NON-NLS-1$
-					if (analyzer instanceof CJKAnalyzer) {
-						bw.write("CJKAnalyzer" + "\n"); //$NON-NLS-1$	//$NON-NLS-2$
-					}
-					bw.close();
-					fw.close();
-				} catch (IOException ioe) {
-					throw new SearchServiceException(
-							SearchResources.createSearchIndexError);
-				}
-
-				return true;
-			}
-
-			// jar up the created index.
-			JarCreator.jarFolder(indexFolder.toString());
-
-			System.out.println("index Jarred successfully"); //$NON-NLS-1$
-
-			try {
-				// delete the files now that they've been jarred.
-				File indexDir = new File(indexFolder.toString());
-				File[] files = indexDir.listFiles();
-				for (int i = 0; i < files.length; i++) {
-					File tempFile = files[i];
-					if (!tempFile.getName().equals(JarCreator.INDEX_JAR)) {
-						tempFile.delete();
-					}
-				}
-
-				// String rupName = publishDir.substring(index);
-				File newIndexJar = new File(indexFolder + File.separator
-						+ JarCreator.INDEX_JAR);
-				if (newIndexJar.exists()) {
-					String fileSize = "" + newIndexJar.length(); //$NON-NLS-1$
-					FileWriter fw = new FileWriter(indexFolder + File.separator
-							+ VERSION_FILE_NAME);
-					BufferedWriter bw = new BufferedWriter(fw);
-					bw.write(productName + VERSION_DELIMITER + milliseconds
-							+ VERSION_DELIMITER + fileSize + "\n"); //$NON-NLS-1$
-					if (analyzer instanceof CJKAnalyzer) {
-						bw.write("CJKAnalyzer" + "\n"); //$NON-NLS-1$	//$NON-NLS-2$
-					}
-					bw.close();
-					fw.close();
-				} else {
-					throw new SearchServiceException(
-							SearchResources.createSearchIndexError);
-				}
-			} catch (IOException ioe) {
-				throw new SearchServiceException(
-						SearchResources.createSearchIndexError);
-			}
-
-			return true;
-		}
-	}
-
-	/**
-	 * Index the actual documents specified by the files and recursively get all
-	 * file in the specified folder file
-	 * 
-	 */
-	private void indexDocs(File file, IndexWriter writer) throws Exception {
-		if (dirsToSkip.contains(file.getAbsolutePath())) {
-			return;
-		}
-		if (file.isFile()) {
-			for (Iterator iter = filesToSkip.iterator(); iter.hasNext();) {
-				String fileToSkip = (String) iter.next();
-				if (file.getName().indexOf(fileToSkip) > -1) {
-					return;
-				}
-			}
-		}
-
-		if (file.isDirectory()) {
-			String[] files = file.list();
-			for (int i = 0; i < files.length; i++) {
-				indexDocs(new File(file, files[i]), writer);
-			}
-		} else if (isHtmlDoc(file)) {
-			if (shouldBeExcluded(file)) {
-				return;
-			}
-			try {
-				
-				Document doc = getHTMLDocument(file);		
-				
-				if (doc != null) {
-					writer.addDocument(doc);				
-				}
-				
-			} catch (Exception e1) {
-				System.out.println(file.getName());
-				System.out.println("indexDocs"); //$NON-NLS-1$
-				e1.printStackTrace();
-			}
-		}
-	}
-
-	/**
-	 * Checks whether the given file should be excluded from the search index.
-	 * 
-	 * @param file
-	 *            The file to be verified.
-	 * @return <code>true</code> if the given file should be excluded from the
-	 *         search index.
-	 */
-	private boolean shouldBeExcluded(File file) {
-		String path = file.getParentFile().getAbsolutePath();
-		if (pDirectory.startsWith(path)) {
-			return true;
-		}
-
-		return false;
-	}
-
-	private static boolean isHtmlDoc(File file) {
-		String path = file.getPath();
-		return path.endsWith(".html") || path.endsWith(".htm"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private boolean isNoSearchableDocument(Properties metaTags) {
-		String value = metaTags.getProperty(UMA_ELEMENT_TYPE_FIELD);
-		
-		// value == null is treated as general document
-		return (value != null) && NO_SEARCHEABLE_UMA_ELEMENTS.contains(value);
-	}
-	
-	char[] cbuf = new char[1024];
-	int skipCount = 0;
-	
-	private Document getHTMLDocument(File file) {
-		Document luceneDocument = null;
-		InputStreamReader input = null;
-		Reader reader = null;
-		try {
-			
-			input = new InputStreamReader(new FileInputStream(file), "UTF-8"); //$NON-NLS-1$
-
-			LHTMLParser parser = new LHTMLParser(input);
-
-			reader = parser.getReader();
-			if ( reader == null ) {
-				return null;
-			}
-
-			Properties metaTags = parser.getMetaTags();
-			if ( isNoSearchableDocument(metaTags) ) {
-				
-				// the LHTMLParser thread will not end if the reader is not processed
-				// causing major resource leak
-				while ( reader.read(cbuf) > 0 ) {
-					;
-				}			
-				//System.out.println( ++skipCount + " file skipped: " + file.getAbsolutePath());
-				parser = null;
-				return null;
-			}
-			
-			luceneDocument = new Document();
-
-			String url = file.getPath().replace(File.pathSeparatorChar, '/');
-			luceneDocument.add(Field.UnIndexed(URL_FIELD, url));
-			
-			luceneDocument.add(Field.Text(CONTENT_FIELD, reader));
-			
-			String title = parser.getTitle();
-			if (title != null && title.length() > 0) {
-				// Workaround a Linux specific issue.
-				title = title.replaceAll("\\xa0", " "); //$NON-NLS-1$ //$NON-NLS-2$
-				luceneDocument.add(Field.Keyword(TITLE_FIELD, title));
-			} else {
-				return null;
-			}
-
-			String summary = parser.getSummary();
-			if (summary.startsWith(title) && summary.length() > title.length()) {
-				luceneDocument.add(Field.Keyword(SUMMARY_FIELD, summary
-						.substring(title.length() + 1)));
-			} else
-				luceneDocument.add(Field.Keyword(SUMMARY_FIELD, parser
-						.getSummary()));
-
-			for (Enumeration names = metaTags.propertyNames(); names
-					.hasMoreElements();) {
-				String tagName = (String) names.nextElement();
-				if (tagName != null) {
-					if (tagName.equals(ROLE_FIELD)) {
-						String roleName = metaTags.getProperty(tagName);
-						if (roleName != null) {
-							luceneDocument.add(Field.Text(tagName, roleName));
-						}
-					} else {
-						String tagValue = metaTags.getProperty(tagName);
-						if (tagValue != null) {
-							luceneDocument.add(Field.Text(tagName, tagValue));
-						}
-					}
-				}
-			}
-
-			if (luceneDocument.getField(ROLE_FIELD) == null) {
-				// Default to "na" to support searching for files without
-				// role meta tags.
-				luceneDocument.add(Field.Text(ROLE_FIELD, "NORUPROLE")); //$NON-NLS-1$
-			}
-
-			Field umaTypeField = luceneDocument
-					.getField(UMA_ELEMENT_TYPE_FIELD);
-			if (umaTypeField == null) {
-				// Default to general content.
-				luceneDocument.add(Field.Text(UMA_ELEMENT_TYPE_FIELD,
-						GENERAL_CONTENT));
-			} 
-
-			parser = null;
-		} catch (Exception e) {
-			luceneDocument = null;
-			SearchPlugin.getDefault().getLogger().logError(e);
-		} finally {
-			if (input != null) {
-				try {
-					input.close();
-				} catch (Exception e) {
-				}
-			}
-		}
-
-		return luceneDocument;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/Resources.properties b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/Resources.properties
deleted file mode 100644
index f42880f..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/Resources.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation. All Rights Reserved.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Indexing progress monitor
-indexConfigFilesTask_name=Indexing configuration files...
-
-# Error Details
-createSearchIndexError=The search index file was not created.
-
-
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchConfigurationException.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchConfigurationException.java
deleted file mode 100644
index 692a91d..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchConfigurationException.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-/**
- * Signals that a search configuration operation has failed.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchConfigurationException extends SearchServiceException {
-
-	private static final long serialVersionUID = 6537405211451177110L;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SearchConfigurationException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public SearchConfigurationException(Throwable rootCause) {
-		super(rootCause);
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public SearchConfigurationException(String errorMsg) {
-		super(errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception and the
-	 * error message.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public SearchConfigurationException(Throwable rootCause, String errorMsg) {
-		super(rootCause, errorMsg);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchPlugin.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchPlugin.java
deleted file mode 100644
index 131d9cb..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchPlugin.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-import org.eclipse.epf.common.AbstractActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- * The Search plug-in activator.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class SearchPlugin extends AbstractActivator {
-
-	// The shared plug-in instance.
-	private static SearchPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SearchPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see AbstractPlugin#start(BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared plug-in instance.
-	 */
-	public static SearchPlugin getDefault() {	
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchResources.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchResources.java
deleted file mode 100644
index e1b7b79..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchResources.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The Search resource bundle.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class SearchResources extends NLS {
-
-	private static String BUNDLE_NAME = SearchResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	public static String indexConfigFilesTask_name;
-	public static String createSearchIndexError;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, SearchResources.class);
-	}
-
-	private SearchResources() {
-		// Do not instantiate
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchService.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchService.java
deleted file mode 100644
index fd6fcb2..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchService.java
+++ /dev/null
@@ -1,109 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epf.common.utils.FileUtil;
-import org.eclipse.epf.common.utils.WarUtil;
-import org.eclipse.epf.search.configuration.ConfigurationHitEntry;
-import org.eclipse.epf.search.configuration.ConfigurationSearchQuery;
-import org.eclipse.epf.search.configuration.internal.ConfigurationSearchService;
-
-/**
- * The Search Service implementation.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchService implements ISearchService {
-
-	// The shared instance.
-	private static SearchService instance = null;
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static SearchService getInstance() {
-		if (instance == null) {
-			synchronized (SearchService.class) {
-				if (instance == null) {
-					instance = new SearchService();
-				}
-			}
-		}
-		return instance;
-	}
-
-	/**
-	 * Private constructor to prevent this class from being instantiated.
-	 */
-	private SearchService() {
-	}
-
-	/**
-	 * Searches a published Configuration.
-	 * 
-	 * @param path
-	 *            the absolute path to the published configuration
-	 * @param searchQuery
-	 *            the configuration search query
-	 * @return an array of <code>ConfigurationHitEntry</code> objects
-	 * @throws SearchServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public ConfigurationHitEntry[] searchConfiguration(String path,
-			ConfigurationSearchQuery searchQuery) throws SearchServiceException {
-		ConfigurationSearchService service = new ConfigurationSearchService(
-				path);
-		service.index();
-		return service.search(searchQuery);
-	}
-
-	public boolean createIndex(String publishDir) throws SearchServiceException {
-		IndexBuilder service = new IndexBuilder(publishDir);
-		return service.createIndex(true);
-	}
-
-	public boolean createIndex(String publishDir, boolean jarIt)
-			throws SearchServiceException {
-		IndexBuilder service = new IndexBuilder(publishDir);
-		return service.createIndex(jarIt);
-	}
-
-	public void createWAR(String publishDir, String webAppName) {
-		try {
-			File warFile = null;
-			if (webAppName.endsWith(".war")) { //$NON-NLS-1$
-				warFile = new File(publishDir, webAppName);
-			} else {
-				warFile = new File(publishDir, webAppName + ".war"); //$NON-NLS-1$
-			}
-			WarUtil.buildWarFile(warFile.getAbsolutePath(), publishDir, null);
-			File logsDir = new File(publishDir, "logs"); //$NON-NLS-1$
-			File cssDir = new File(publishDir, "css"); //$NON-NLS-1$
-			File scriptsDir = new File(publishDir, "scripts"); //$NON-NLS-1$
-			File imagesDir = new File(publishDir, "images"); //$NON-NLS-1$
-			List<File> filesNotToDelete = new ArrayList<File>();
-			filesNotToDelete.add(logsDir);
-			filesNotToDelete.add(cssDir);
-			filesNotToDelete.add(scriptsDir);
-			filesNotToDelete.add(imagesDir);
-			filesNotToDelete.add(warFile);
-			FileUtil.deleteAllFiles(publishDir, filesNotToDelete);
-			filesNotToDelete.clear();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchServiceException.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchServiceException.java
deleted file mode 100644
index 125a2c2..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/SearchServiceException.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search;
-
-/**
- * Signals that a Search Service operation has failed.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class SearchServiceException extends Exception {
-
-	private static final long serialVersionUID = -9063302180869157316L;
-
-	/**
-	 * The root cause of the exception.
-	 */
-	protected Throwable rootCause;
-
-	/**
-	 * The error message associated with the exception.
-	 */
-	protected String errorMsg;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public SearchServiceException() {
-		super();
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 */
-	public SearchServiceException(Throwable rootCause) {
-		this(rootCause, rootCause.getMessage());
-	}
-
-	/**
-	 * Creates a new instance given the error message.
-	 * 
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public SearchServiceException(String errorMsg) {
-		this(null, errorMsg);
-	}
-
-	/**
-	 * Creates a new instance given the root cause of the exception and the
-	 * error message.
-	 * 
-	 * @param rootCause
-	 *            the root cause of the exception
-	 * @param errorMsg
-	 *            the error message
-	 */
-	public SearchServiceException(Throwable rootCause, String errorMsg) {
-		super();
-		this.rootCause = rootCause;
-		this.errorMsg = errorMsg;
-	}
-
-	/**
-	 * Returns the root cause of the exception.
-	 * 
-	 * @return the root cause of the exception
-	 */
-	public Throwable getRootCause() {
-		return rootCause;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/StopWords.properties b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/StopWords.properties
deleted file mode 100644
index f033529..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/StopWords.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation. All Rights Reserved.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Search Stop Words
-Search.stopWords=\
-a, about, an, and, are, as, at, be, but, by, for, from, how, \
-i, if, in, into, is, it, no, not, of, on, or, s, such, \
-t, that, the, their, then, there, these, they, this, to, \
-was, what, when, where, who, will, with
-
-
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextAnalyzer.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextAnalyzer.java
deleted file mode 100644
index ee803e1..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextAnalyzer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.analysis;
-
-import java.io.Reader;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.analysis.TokenStream;
-
-/**
- * A text analyzer that handles Unicode 4.1 characters.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class TextAnalyzer extends Analyzer {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TextAnalyzer() {
-		super();
-	}
-
-	/**
-	 * @see org.apache.lucene.analysis.Analyzer#tokenStream(String, Reader)
-	 */
-	public final TokenStream tokenStream(String fieldName, Reader reader) {
-		TokenStream result = new TextTokenizer(reader);
-		return new TextFilter(result);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextFilter.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextFilter.java
deleted file mode 100644
index e19dddd..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextFilter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.analysis;
-
-import java.io.IOException;
-import java.util.ResourceBundle;
-import java.util.Set;
-
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.analysis.StopFilter;
-import org.apache.lucene.analysis.Token;
-import org.apache.lucene.analysis.TokenFilter;
-import org.apache.lucene.analysis.TokenStream;
-import org.eclipse.epf.common.utils.StrUtil;
-
-/**
- * A text filter that handles Unicode 4.1 characters.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class TextFilter extends TokenFilter {
-
-	private static Set stopWords = null;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public TextFilter(TokenStream in) {
-		super(in);
-		if (stopWords == null) {
-			loadStopWords();
-		}
-	}
-
-	/**
-	 * @see org.apache.lucene.analysis.TokenStream#next()
-	 */
-	public final Token next() throws IOException {
-		for (Token token = input.next(); token != null; token = input.next()) {
-			String tokenText = token.termText();
-			if (!stopWords.contains(tokenText)) {
-				return token;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Loads the stop words defined in the StopWords.properties file.
-	 */
-	private void loadStopWords() {
-		String[] words = null;
-		try {
-			ResourceBundle bundle = ResourceBundle.getBundle(TextFilter.class
-					.getPackage().getName()
-					+ ".StopWords"); //$NON-NLS-1$				
-			String property = bundle.getString("Search.stopWords"); //$NON-NLS-1$
-			words = StrUtil.split(property, " ,"); //$NON-NLS-1$		
-		} catch (Exception e) {
-			words = StopAnalyzer.ENGLISH_STOP_WORDS;
-		}
-		stopWords = StopFilter.makeStopSet(words);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextTokenizer.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextTokenizer.java
deleted file mode 100644
index a5f335b..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/TextTokenizer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.analysis;
-
-import java.io.IOException;
-import java.io.Reader;
-
-import org.apache.lucene.analysis.Token;
-import org.apache.lucene.analysis.Tokenizer;
-
-import com.ibm.icu.text.BreakIterator;
-
-/**
- * A text tokenizer that uses ICU4J to segment text into words.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class TextTokenizer extends Tokenizer {
-
-	private final static int BUFFER_SIZE = 4096;
-
-	private String text;
-
-	private BreakIterator iterator;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param reader
-	 *            the text source
-	 */
-	public TextTokenizer(Reader reader) {
-		super(reader);
-		StringBuffer textBuffer = new StringBuffer(BUFFER_SIZE);
-		char[] buffer = new char[BUFFER_SIZE];
-		int charsRead;
-		try {
-			while ((charsRead = reader.read(buffer, 0, BUFFER_SIZE)) > 0) {
-				textBuffer.append(buffer, 0, charsRead);
-			}
-			text = textBuffer.toString();
-			iterator = BreakIterator.getWordInstance();
-			iterator.setText(text);
-		} catch (IOException e) {
-			iterator = null;
-		}
-	}
-
-	/**
-	 * @see org.apache.lucene.analysis.TokenStream#next()
-	 */
-	public final Token next() throws IOException {
-		if (iterator != null) {
-			while (true) {
-				int start = iterator.current();
-				int end = iterator.next();
-				if (end != BreakIterator.DONE) {
-					String tokenText = text.substring(start, end).toLowerCase();
-					if (!tokenText.equals(" ")) { //$NON-NLS-1$
-						if (tokenText.endsWith("'s")) { //$NON-NLS-1$
-							tokenText = tokenText.substring(0, tokenText
-									.length() - 2);
-						}
-						return new Token(tokenText, 0, tokenText.length());
-					}
-				} else {
-					return null;
-				}
-			}
-		}
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/package.html b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/package.html
deleted file mode 100644
index d4f42f9..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/analysis/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the text analyser, tokenizer and filter for indexing a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/ConfigurationHitEntry.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/ConfigurationHitEntry.java
deleted file mode 100644
index 1748152..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/ConfigurationHitEntry.java
+++ /dev/null
@@ -1,126 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.configuration;
-
-/**
- * A published configuration search hit entry.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationHitEntry {
-
-	private String id;
-
-	private String name;
-
-	private String type;
-
-	private String briefDesc;
-
-	private String url;
-
-	/**
-	 * Returns the ID.
-	 * 
-	 * @return the id
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Sets the ID.
-	 * 
-	 * @param id
-	 *            the id to set
-	 */
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	/**
-	 * Returns the type.
-	 * 
-	 * @return the type.
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Sets the type.
-	 * 
-	 * @param type
-	 *            the type to set
-	 */
-	public void setType(String type) {
-		this.type = type;
-	}
-
-	/**
-	 * Returns the breif description.
-	 * 
-	 * @return the brief description
-	 */
-	public String getBriefDesc() {
-		return briefDesc;
-	}
-
-	/**
-	 * Sets the brief description.
-	 * 
-	 * @param briefDesc
-	 *            the brief description to set
-	 */
-	public void setBriefDesc(String briefDesc) {
-		this.briefDesc = briefDesc;
-	}
-
-	/**
-	 * Returns the name.
-	 * 
-	 * @return the name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Sets the name.
-	 * 
-	 * @param name
-	 *            the name to set
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * Returns the URL.
-	 * 
-	 * @return the URL
-	 */
-	public String getUrl() {
-		return url;
-	}
-
-	/**
-	 * Sets the URL.
-	 * 
-	 * @param url
-	 *            the URL to set
-	 */
-	public void setUrl(String url) {
-		this.url = url;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/ConfigurationSearchQuery.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/ConfigurationSearchQuery.java
deleted file mode 100644
index cfff4d2..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/ConfigurationSearchQuery.java
+++ /dev/null
@@ -1,82 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.configuration;
-
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-/**
- * The published configuration search query.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationSearchQuery {
-
-	private final static String CATEGORY_NAME = "name"; //$NON-NLS-1$
-
-	private final static String CATEGORY_BRIEF_DESC = "briefDescription"; //$NON-NLS-1$
-
-	private final static String CATEGORY_FULL_DESC = "fullDescription"; //$NON-NLS-1$
-
-	private final static String CATEGORY_TYPE = "type"; //$NON-NLS-1$
-
-	private Hashtable query;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public ConfigurationSearchQuery() {
-		query = new Hashtable();
-		query.clear();
-	}
-
-	/**
-	 * Returns the search query string.
-	 * 
-	 * @return the search query string
-	 */
-	public String getQueryString() {
-		StringBuffer sb = new StringBuffer();
-		Enumeration keys = query.keys();
-
-		while (keys.hasMoreElements()) {
-			String key = (String) keys.nextElement();
-			sb.append(key + ":(" + query.get(key) + ") "); //$NON-NLS-1$ //$NON-NLS-2$
-			if (keys.hasMoreElements()) {
-				sb.append("AND "); //$NON-NLS-1$
-			}
-		}
-
-		return sb.toString();
-	}
-
-	private void setTerm(String term, String crit) {
-		query.put(crit, term);
-	}
-
-	public void setType(String type) {
-		setTerm(type, CATEGORY_TYPE);
-	}
-
-	public void setName(String name) {
-		setTerm(name, CATEGORY_NAME);
-	}
-
-	public void setBriefDesc(String desc) {
-		setTerm(desc, CATEGORY_BRIEF_DESC);
-	}
-
-	public void setFullDesc(String desc) {
-		setTerm(desc, CATEGORY_FULL_DESC);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/internal/ConfigurationSearchService.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/internal/ConfigurationSearchService.java
deleted file mode 100644
index 71d11fb..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/internal/ConfigurationSearchService.java
+++ /dev/null
@@ -1,402 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.configuration.internal;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Properties;
-
-import org.apache.lucene.document.DateField;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.search.Hits;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.Searcher;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.epf.common.html.HTMLParser;
-import org.eclipse.epf.search.GenerateSearchIndexException;
-import org.eclipse.epf.search.SearchConfigurationException;
-import org.eclipse.epf.search.SearchResources;
-import org.eclipse.epf.search.SearchServiceException;
-import org.eclipse.epf.search.analysis.TextAnalyzer;
-import org.eclipse.epf.search.configuration.ConfigurationHitEntry;
-import org.eclipse.epf.search.configuration.ConfigurationSearchQuery;
-
-/**
- * The default implementation for searching a published configuration.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class ConfigurationSearchService {
-
-	/**
-	 * Document fields.
-	 */
-	public static final String BRIEF_DESCRIPTION_FIELD = "briefDescription"; //$NON-NLS-1$
-
-	public static final String CONTENT_FIELD = "content"; //$NON-NLS-1$
-
-	public static final String ID_FIELD = "id"; //$NON-NLS-1$
-
-	public static final String MODIFIED_FIELD = "modified"; //$NON-NLS-1$
-
-	public static final String NAME_FIELD = "name"; //$NON-NLS-1$
-
-	public static final String ROLE_FIELD = "role"; //$NON-NLS-1$
-
-	public static final String SUMMARY_FIELD = "summary"; //$NON-NLS-1$
-
-	public static final String TYPE_FIELD = "type"; //$NON-NLS-1$
-
-	public static final String URL_FIELD = "url"; //$NON-NLS-1$
-
-	// The HTML parser.
-	private HTMLParser parser;
-
-	// The directory containing the documents to be indexed.
-	private String docDir = null;
-
-	// The directory where the index files will be generated.
-	private String indexDir = null;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param docDir
-	 *            the absolute path to a published configuration
-	 */
-	public ConfigurationSearchService(String docDir) {
-		String userHome = System.getProperty("user.home"); //$NON-NLS-1$
-		int hashCode = Math.abs(docDir.hashCode());
-		String indexPath = userHome + File.separator
-				+ "rup" + File.separator + hashCode + File.separator + "index"; //$NON-NLS-1$ //$NON-NLS-2$
-		setDirs(docDir, indexPath);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param docDir
-	 *            the absolute path to a published configuration
-	 * @param indexDir
-	 *            the absolute path to the indexes
-	 */
-	public ConfigurationSearchService(String docDir, String indexDir) {
-		setDirs(docDir, indexDir);
-	}
-
-	/**
-	 * Sets up the configuration and index directory.
-	 * 
-	 * @param docDir
-	 *            the absolute path to a published configuration
-	 * @param indexDir
-	 *            the absolute path to the indexes
-	 */
-	public void setDirs(String docDir, String indexDir) {
-		this.docDir = docDir;
-		this.indexDir = indexDir;
-	}
-
-	/**
-	 * Performs a search based on the given search query.
-	 * 
-	 * @param query
-	 *            the search query string
-	 * @return an array of <code>ConfigurationHitEntry</code> objects
-	 * @throws SearchServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public ConfigurationHitEntry[] search(ConfigurationSearchQuery query)
-			throws SearchServiceException {
-		return search(query.getQueryString());
-	}
-
-	/**
-	 * Performs a search on the given query string.
-	 * 
-	 * @param qstr
-	 *            a Lucene compatible query string
-	 * @return an array of <code>ConfigurationHitEntry</code> objects
-	 * @throws SearchServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public ConfigurationHitEntry[] search(String qstr)
-			throws SearchServiceException {
-		Searcher searcher = null;
-		try {
-			searcher = new IndexSearcher(indexDir);
-			Query query = QueryParser.parse(qstr, CONTENT_FIELD,
-					new TextAnalyzer());
-
-			Hits lhits = searcher.search(query);
-			ConfigurationHitEntry[] hits = new ConfigurationHitEntry[lhits
-					.length()];
-
-			for (int i = 0; i < hits.length; i++) {
-				Document doc = lhits.doc(i);
-				hits[i] = new ConfigurationHitEntry();
-				hits[i].setName(doc.get(NAME_FIELD));
-				hits[i].setUrl(doc.get(URL_FIELD));
-				hits[i].setBriefDesc(doc.get(BRIEF_DESCRIPTION_FIELD));
-				hits[i].setId(doc.get(ID_FIELD));
-				hits[i].setType(doc.get(TYPE_FIELD));
-			}
-			return hits;
-		} catch (Exception e) {
-			throw new SearchConfigurationException(e);
-		} finally {
-			if (searcher != null) {
-				try {
-					searcher.close();
-				} catch (IOException e) {
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns true of the index database already exists.
-	 * 
-	 * @return <code>true</code> if the index database already exists
-	 */
-	public boolean indexExists() {
-		File[] files = new File(indexDir).listFiles();
-		return (files != null && files.length != 0);
-	}
-
-	/**
-	 * Creates the search index.
-	 * 
-	 * @throws SearchServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public void index() throws SearchServiceException {
-		index(null, false);
-	}
-
-	/**
-	 * Creates the search index.
-	 * 
-	 * @param reindex
-	 *            if <code>true</code>, performs a reindex
-	 * @throws SearchServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public void index(boolean reindex) throws SearchServiceException {
-		index(null, reindex);
-	}
-
-	/**
-	 * Creates the index database.
-	 * 
-	 * @param pm
-	 *            a progress monitor
-	 * @param reindex
-	 *            if <code>true</code>, performs a reindex
-	 * @throws SearchServiceException
-	 *             if an error occurs while executing the operation
-	 */
-	public void index(IProgressMonitor pm, boolean reindex)
-			throws SearchServiceException {
-		synchronized (ConfigurationSearchService.class) {
-			if (indexDir == null || docDir == null) {
-				throw new IllegalStateException("Invalid indexDir or docDir"); //$NON-NLS-1$
-			}
-
-			if (!reindex && indexExists()) {
-				return;
-			}
-
-			if (pm != null) {
-				pm.beginTask(SearchResources.indexConfigFilesTask_name,
-						getTotalDocsToIndex(docDir)); 
-			}
-
-			try {
-				deleteAllIndexDirs();
-				new File(indexDir).mkdirs();
-				IndexWriter writer = new IndexWriter(indexDir,
-						new TextAnalyzer(), true);
-				writer.maxFieldLength = 1000000;
-				parser = new HTMLParser();
-				indexDocs(new File(docDir), writer, pm);
-				writer.optimize();
-				writer.close();
-			} catch (Exception e) {
-				throw new GenerateSearchIndexException(e);
-			} finally {
-				if (pm != null) {
-					pm.done();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Deletes all existing index databases.
-	 */
-	public void deleteAllIndexDirs() {
-		File parent = new File(indexDir).getParentFile();
-		File[] files = parent.listFiles();
-		if (files != null) {
-			for (int i = 0; i < files.length; i++) {
-				if (files[i].getName().startsWith("index")) { //$NON-NLS-1$
-					File[] file = files[i].listFiles();
-					for (int j = 0; j < file.length; j++) {
-						file[j].delete();
-					}
-					files[i].delete();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns the total number of files that will be added to the search index.
-	 * 
-	 * @param dir
-	 *            the directory name
-	 * @return the number of files that will be added to the search index,
-	 *         including all sub-directories
-	 */
-	public static int getTotalDocsToIndex(String dir) {
-		int total = 0;
-		File dirFile = new File(dir);
-		File files[] = dirFile.listFiles();
-		if (files == null) {
-			return total;
-		}
-		for (int i = 0; i < files.length; i++) {
-			if (isXMIDoc(files[i])) {
-				total++;
-			} else if (files[i].isDirectory()) {
-				total += getTotalDocsToIndex(files[i].getAbsolutePath());
-			}
-		}
-		return total;
-	}
-
-	/**
-	 * Returns true if the file needs to be indexed.
-	 * 
-	 * @param file
-	 *            the file to be verified
-	 * @return <code>true</code> if the file needs to be indexed
-	 */
-	private static boolean isXMIDoc(File file) {
-		return file.getPath().endsWith(".xmi"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns true if the file needs to be indexed.
-	 * 
-	 * @param file
-	 *            the file to be verified
-	 * @return <code>true</code> if the file needs to be indexed
-	 */
-	private static boolean isHtmlOrTextDoc(File file) {
-		String path = file.getPath();
-		return path.endsWith(".html") || path.endsWith(".htm") || path.endsWith(".txt"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/**
-	 * A recursive function to index files.
-	 * 
-	 * @param file
-	 *            a directory or file to be indexed
-	 * @param writer
-	 *            the index writer
-	 * @param pm
-	 *            a progress monitor
-	 * @throws Exception
-	 */
-	private void indexDocs(File file, IndexWriter writer, IProgressMonitor pm)
-			throws Exception {
-		if (file.isDirectory()) {
-			if (file.getName().equalsIgnoreCase("applet")) { //$NON-NLS-1$
-				return;
-			}
-			String[] files = file.list();
-			for (int i = 0; i < files.length; i++) {
-				indexDocs(new File(file, files[i]), writer, pm);
-			}
-		} else if (isHtmlOrTextDoc(file)) {
-			if (pm != null) {
-				pm.subTask(file.getName());
-				pm.worked(1);
-			}
-			if (shouldBeExcluded(file)) {
-				return;
-			}
-			Document doc = getHTMLDocument(file);
-			writer.addDocument(doc);
-		}
-	}
-
-	/**
-	 * Returns <ocde>true</code> if the file should be excluded from indexing.
-	 * 
-	 * @param file
-	 *            a file
-	 * @return <code>true</code> if the file should be excluded from indexing
-	 */
-	public boolean shouldBeExcluded(File file) {
-		String p = file.getParentFile().getAbsolutePath();
-		return docDir.startsWith(p);
-	}
-
-	/**
-	 * Gets the document object of a HTML file.
-	 * 
-	 * @param file
-	 *            the HTML file to be indexed
-	 * @return a document object
-	 * @throws IOException
-	 *             if an I/O error occurs while parsing the HTML file
-	 * @throws InterruptedException
-	 *             if the operation is interrupted by a user
-	 */
-	public Document getHTMLDocument(File file) throws IOException,
-			InterruptedException {
-		Document doc = new Document();
-		doc.add(Field.UnIndexed(URL_FIELD, file.getPath().replace(
-				File.pathSeparatorChar, '/')));
-		doc.add(Field.Keyword(MODIFIED_FIELD, DateField.timeToString(file
-				.lastModified())));
-
-		try {
-			parser.parse(file);
-		} catch (Exception e) {
-		}
-
-		doc.add(Field.Text(CONTENT_FIELD, parser.getText()));
-		doc.add(Field.UnIndexed(SUMMARY_FIELD, parser.getSummary()));
-
-		Properties metaTags = parser.getMetaTags();
-		for (Enumeration e = metaTags.propertyNames(); e.hasMoreElements();) {
-			String tagName = (String) e.nextElement();
-			doc.add(Field.Text(tagName, metaTags.getProperty(tagName)));
-		}
-
-		if (doc.getField(ROLE_FIELD) == null) {
-			doc.add(Field.Text(ROLE_FIELD, "NORUPROLE")); //$NON-NLS-1$
-		}
-
-		return doc;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/internal/package.html b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/internal/package.html
deleted file mode 100644
index be07ac5..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/internal/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for searching a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/package.html b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/package.html
deleted file mode 100644
index 1d7c4b0..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/configuration/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for searching a published configuration.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/package.html b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/package.html
deleted file mode 100644
index c0fca96..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the search service.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/JarCreator.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/JarCreator.java
deleted file mode 100644
index cb157d9..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/JarCreator.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.utils;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-public class JarCreator {
-
-	public static final String INDEX_JAR = "index.jar"; //$NON-NLS-1$
-
-	public static void main(String[] args) {
-		jarFolder(args[0]);
-	}
-
-	public static void jarFolder(String foldername) {
-		try {
-			System.out.println("attempting to jar stuff"); //$NON-NLS-1$
-			File jarDir = new File(foldername);
-			File jarFile = new File(foldername + File.separator + INDEX_JAR);
-
-			jarFiles(jarDir, jarFile);
-		} catch (Exception e1) {
-			System.out.println("Exception in the jar thingy"); //$NON-NLS-1$
-			e1.printStackTrace();
-		}
-	}
-
-	/**
-	 * method to jar the specified dir into a jar file. non-sub-folders will be
-	 * jared.
-	 * 
-	 * @param jarDir
-	 * @param jarFile
-	 * @throws IOException
-	 */
-	public static void jarFiles(File jarDir, File jarFile) throws IOException {
-		File[] files = jarDir.listFiles();
-		if (jarFile.exists()) {
-			jarFile.delete();
-		}
-		BufferedOutputStream bStream = new BufferedOutputStream(new FileOutputStream(
-				jarFile));
-		ZipOutputStream zipperStream = new ZipOutputStream(bStream);
-
-		byte[] bytes = new byte[4096];
-		for (int i = 0; i < files.length; i++) {
-			File currentFile = files[i];
-			if (currentFile.isDirectory()) {
-				continue;
-			}
-			ZipEntry currEntry = new ZipEntry(currentFile.getName());
-			zipperStream.putNextEntry(currEntry);
-			BufferedInputStream biStream = new BufferedInputStream(new FileInputStream(
-					currentFile));
-			while (biStream.available() > 0) {
-				int num = biStream.read(bytes);
-				zipperStream.write(bytes, 0, num);
-			}
-			biStream.close();
-			zipperStream.closeEntry();
-		}
-		zipperStream.close();
-		bStream.close();
-	}	
-}
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/LHTMLParser.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/LHTMLParser.java
deleted file mode 100644
index 7669b19..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/LHTMLParser.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.utils;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.util.Properties;
-
-/**
- * A HTML parser used for extracting the meta tags and text from a HTML
- * document.
- * 
- * TODO: Implement our own HTML parser.
- */
-public class LHTMLParser extends org.apache.lucene.demo.html.HTMLParser {
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LHTMLParser(File file) throws FileNotFoundException {
-		super(file);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LHTMLParser(InputStream stream) throws FileNotFoundException {
-		super(stream);
-	}
-
-	/**
-	 * Creates a new instance.
-	 */
-	public LHTMLParser(Reader stream) throws FileNotFoundException {
-		super(stream);
-	}
-
-	/**
-	 * Gets the HTML meta tags.
-	 */
-	public Properties getMetaTags() throws IOException, InterruptedException {
-		return super.getMetaTags();
-	}
-
-	/**
-	 * Gets the reader for the HTML content.
-	 */
-	public Reader getReader() throws IOException {
-		return super.getReader();
-	}
-
-	/**
-	 * Gets the HTML title.
-	 */
-	public String getTitle() throws IOException, InterruptedException {
-		return super.getTitle();
-	}
-	
-	/**
-	 * Gets a summary of the HTL document.
-	 */
-	public String getSummary() throws IOException, InterruptedException {
-		return super.getSummary();
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/UNCUtil.java b/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/UNCUtil.java
deleted file mode 100644
index fb05c7f..0000000
--- a/1.5/plugins/org.eclipse.epf.search/src/org/eclipse/epf/search/utils/UNCUtil.java
+++ /dev/null
@@ -1,315 +0,0 @@
-//------------------------------------------------------------------------------
-//Copyright (c) 2005, 2007 IBM Corporation and others.
-//All rights reserved. This program and the accompanying materials
-//are made available under the terms of the Eclipse Public License v1.0
-//which accompanies this distribution, and is available at
-//http://www.eclipse.org/legal/epl-v10.html
-//
-//Contributors:
-//IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.search.utils;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-
-public class UNCUtil {
-	public static final String UNC_FILE_PREFIX = "file:/"; //$NON-NLS-1$
-	public static final String ALTERNATE_UNC_FILE_PREFIX = "file://"; //$NON-NLS-1$
-	public static final String NETSCAPE_UNC_FILE_PREFIX = "file:///"; //$NON-NLS-1$
-	public static final String UNC_FILE_ONLY = "file:"; //$NON-NLS-1$
-	public static final String UNC_SEPARATOR = "/"; //$NON-NLS-1$
-
-
-	/**
-	 * Accounts for netscape unc file prefix. Converts to standard one.
-	 * If not Netscape, nothing changes.
-	 */
-	public static String handleNetscapeFilePrefix(String filename)
-	{
-		String convertedName = null;
-
-		if (filename.startsWith(NETSCAPE_UNC_FILE_PREFIX))
-		{
-			convertedName =
-				ALTERNATE_UNC_FILE_PREFIX
-					+ filename.substring(
-						NETSCAPE_UNC_FILE_PREFIX.length(),
-						filename.length());
-		}
-		else
-		{
-			convertedName = filename;
-		}
-
-		return (convertedName);
-	}
-
-	/**
-	 * Handles URL paths for Mozilla (and other browsers) over UNC.
-	 */
-	public static URL handleURLForUNC(URL originalUrl)
-	{
-		// handle special case for Mozilla over UNC
-		URL newUrl = null;
-		try
-		{
-			if (originalUrl.toString().startsWith("file://")) //$NON-NLS-1$
-			{
-				// change "file://" to "file://///"
-				String extractedString = originalUrl.toString().substring(5);
-				newUrl = new URL("file", "", "///" + extractedString); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			else
-			{
-				newUrl = originalUrl;
-			}
-		}
-		catch (java.net.MalformedURLException mue)
-		{
-			newUrl = originalUrl;
-		}
-
-		return (newUrl);
-	}
-
-	/**
-	 * Converts the UNC file to a regular, platform-dependent one.
-	 */
-	public static String convertFilename(String filename)
-	{
-		String convertedName = null;
-
-		// remove any URL prefixes
-		String tempName = null;
-		if (filename.startsWith(UNC_FILE_PREFIX))
-		{
-			tempName = filename.substring(UNC_FILE_PREFIX.length(), filename.length());
-			int index = tempName.indexOf(":"); //$NON-NLS-1$
-			if (index == -1)
-			{
-				// on Unix, add separator back to first character
-				tempName = UNC_SEPARATOR + tempName;
-			}
-		}
-		else
-		{
-			tempName = filename;
-		}
-
-		// convert any UNC separators to the system default one
-		convertedName =
-			tempName.replace(UNC_SEPARATOR.charAt(0), File.separator.charAt(0));
-
-		return (convertedName);
-	}
-
-	/**
-	 * Converts the filename to a UNC filename.
-	 */
-	public static String convertFilenameToUNC(String filename)
-	{
-		// convert any UNC separators to the system default one
-		String convertedName =
-			filename.replace(File.separator.charAt(0), UNC_SEPARATOR.charAt(0));
-		String finalName = convertFileSeparator(convertedName);
-		return (finalName);
-	}
-
-	/**
-	 * Converts the URL to one which can that matches a UNC convention.
-	 */
-	public static String convertToUNC(String url)
-	{
-		String convertedUrl = null;
-		if (url.startsWith(ALTERNATE_UNC_FILE_PREFIX))
-		{
-			convertedUrl =
-				UNC_FILE_PREFIX
-					+ url.substring(ALTERNATE_UNC_FILE_PREFIX.length(), url.length());
-		}
-		else
-		{
-			convertedUrl = url;
-		}
-		return (convertedUrl);
-
-	}
-
-	/**
-	 * Removes the "%20" that is used by some browsers for spaces
-	 */
-	public static String convertFileSpacing(String filename)
-	{
-		// now remove any "%20"
-		int start = 0;
-		String newFilename = ""; //$NON-NLS-1$
-		while (start < filename.length())
-		{
-			int index = filename.indexOf("%20", start); //$NON-NLS-1$
-			if (index == -1)
-			{
-				index = filename.length();
-			}
-			newFilename += filename.substring(start, index);
-			newFilename += " "; //$NON-NLS-1$
-			start = index + 3;
-		}
-
-		newFilename = newFilename.trim();
-
-		return (newFilename);
-	}
-
-	/**
-	 * Removes the "%5C" that is used by some browsers for file separator.
-	 */
-	public static String convertFileSeparator(String filename)
-	{
-		// remove any "%5C"
-		int start = 0;
-		String newFilename = ""; //$NON-NLS-1$
-		while (start < filename.length())
-		{
-			int index = filename.indexOf("%5C", start); //$NON-NLS-1$
-			if (index == -1)
-			{
-				//index = filename.length();
-				newFilename = filename.trim();
-				break;
-			}
-			newFilename += filename.substring(start, index);
-			newFilename += UNC_SEPARATOR;
-			start = index + 3;
-		}
-
-		newFilename = newFilename.trim();
-
-		// also if file separator equals unc separator, remove any Windows
-		// specific "\"
-		String windowsFileSeparator = "\\"; //$NON-NLS-1$
-		if (!File.separator.equals(windowsFileSeparator)
-			&& File.separator.equals(UNC_SEPARATOR))
-		{
-			// on Unix
-			newFilename =
-				newFilename.replace(
-					windowsFileSeparator.charAt(0),
-					UNC_SEPARATOR.charAt(0));
-		}
-		return (newFilename);
-	}
-
-	/**
-	 * Retrieves the file names from the specified directory
-	 * that matches the given suffix.  An example of a 
-	 * suffix is ".dat".
-	 */
-	public static Vector getFileList(String directory, String suffix)
-	{
-		if (directory.startsWith("http")) //$NON-NLS-1$
-		{
-			// remote directory, use this instead
-			return (getFileListFromRemote(directory, suffix));
-		}
-
-		String tempDir = UNCUtil.convertFilename(directory);
-		File documentDirectory = new File(UNCUtil.convertFileSpacing(tempDir));
-		String[] fileNameList = documentDirectory.list();
-
-		// now parse and only take those that end with the proper suffix
-		Vector finalList = new Vector();
-		for (int i = 0; i < fileNameList.length; i++)
-		{
-			if (fileNameList[i].endsWith(suffix))
-			{
-				finalList.addElement(fileNameList[i]);
-			}
-		}
-
-		return (finalList);
-	}
-
-	/**
-	 * Retrieves the applicable default rup files from remote directory.
-	 */
-	private static Vector getFileListFromRemote(String directory, String suffix)
-	{
-		Vector filenames = new Vector();
-		try
-		{
-			// get the listing using a URL
-			URL remoteUrl = new URL(directory);
-			InputStream inStream = remoteUrl.openStream();
-			StringBuffer result = new StringBuffer();
-			int c;
-			while ((c = inStream.read()) != -1)
-			{
-				result.append((char) c);
-			}
-			inStream.close();
-
-			// convert string to upper case to handle multiple server types such as Apache
-			String directoryResult = result.toString();
-			directoryResult = directoryResult.replaceAll("href", "HREF"); //$NON-NLS-1$ //$NON-NLS-2$
-			directoryResult = directoryResult.replaceAll("</a", "</A"); //$NON-NLS-1$ //$NON-NLS-2$
-			directoryResult = directoryResult.replaceAll("<tt>", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			directoryResult = directoryResult.replaceAll("</tt>", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			directoryResult = directoryResult.replaceAll("<TT>", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			directoryResult = directoryResult.replaceAll("</TT>", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
-			// parse the content
-			//StringTokenizer lineTokenizer = new StringTokenizer( result.toString() );
-			StringTokenizer lineTokenizer = new StringTokenizer(directoryResult);
-			Vector lines = new Vector();
-			try
-			{
-				while (true)
-				{
-					lineTokenizer.nextToken("REF"); //$NON-NLS-1$
-					lineTokenizer.nextToken("\""); //$NON-NLS-1$
-					String line = lineTokenizer.nextToken("\""); //$NON-NLS-1$
-
-					// strip out "</A"; needed this because StringTokenizer
-					// has problems parsing filenames that being with "A"
-					int index = line.indexOf("</A"); //$NON-NLS-1$
-					if (index != -1 && index != 0)
-					{
-						String filename = line.substring(0, index);
-						lines.addElement(filename);
-					}
-					else
-					{
-						lines.addElement(line);
-					}
-				}
-			}
-			catch (NoSuchElementException ne)
-			{
-				// do nothing, end of content
-			}
-
-			// parse each line
-			for (int i = 0; i < lines.size(); i++)
-			{
-				String line = (String) lines.elementAt(i);
-
-				if (line.endsWith(suffix))
-				{
-					// we want this
-					filenames.addElement(line);
-				}
-			}
-		}
-		catch (Exception e)
-		{
-			e.printStackTrace();
-		}
-		return (filenames);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.services/.classpath b/1.5/plugins/org.eclipse.epf.services/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.services/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.services/.project b/1.5/plugins/org.eclipse.epf.services/.project
deleted file mode 100644
index 005b413..0000000
--- a/1.5/plugins/org.eclipse.epf.services/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.services</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.ibm.sse.model.structuredbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.services/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.services/META-INF/MANIFEST.MF
deleted file mode 100644
index 6b0d88c..0000000
--- a/1.5/plugins/org.eclipse.epf.services/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: EPF Services Plug-in
-Bundle-SymbolicName: org.eclipse.epf.services;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.services.Activator
-Bundle-Vendor: Eclipse.org
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.ecore,
- org.eclipse.epf.uma
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.services
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.services/build.properties b/1.5/plugins/org.eclipse.epf.services/build.properties
deleted file mode 100644
index 3595411..0000000
--- a/1.5/plugins/org.eclipse.epf.services/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               schema/
diff --git a/1.5/plugins/org.eclipse.epf.services/plugin.xml b/1.5/plugins/org.eclipse.epf.services/plugin.xml
deleted file mode 100644
index f68bc5e..0000000
--- a/1.5/plugins/org.eclipse.epf.services/plugin.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension-point
-         id="serviceProviders"
-         name="EPF Services"
-         schema="schema/serviceProviders.exsd"/>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.services/schema/serviceProviders.exsd b/1.5/plugins/org.eclipse.epf.services/schema/serviceProviders.exsd
deleted file mode 100644
index 028b698..0000000
--- a/1.5/plugins/org.eclipse.epf.services/schema/serviceProviders.exsd
+++ /dev/null
@@ -1,186 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.services">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.services" id="serviceProviders" name="EPF Service Providers"/>
-      </appInfo>
-      <documentation>
-         Extension point for contributing services like access controller, file manager, library persister...
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence minOccurs="0" maxOccurs="unbounded">
-            <element ref="accessController" minOccurs="0" maxOccurs="1"/>
-            <element ref="libraryPersister" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="fileManager" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="accessController">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="class"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.services.IAccessController"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="version" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="libraryPersister">
-      <annotation>
-         <appInfo>
-            <meta.element labelAttribute="type"/>
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="type" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.services.ILibraryPersister"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="default" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="version" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="fileManager">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.epf.services.IFileManager"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="version" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         org.eclipse.epf.services.IAccessController
-org.eclipse.epf.services.IFileManager
-org.eclipse.epf.services.ILibraryPersister
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/Activator.java b/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/Activator.java
deleted file mode 100644
index f03929b..0000000
--- a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/Activator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.epf.services;
-
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends Plugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.services"; //$NON-NLS-1$
-
-	// The shared instance
-	private static Activator plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IAccessController.java b/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IAccessController.java
deleted file mode 100644
index a355816..0000000
--- a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IAccessController.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.services;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-
-/**
- * Controls access to library objects.
- * 
- * @author Phong Nguyen Le - Oct 9, 2006
- * @since 1.0
- */
-public interface IAccessController {
-	/**
-	 * Checks if the caller can modify the given EObjects in the specified
-	 * collection.
-	 * 
-	 * @param eObjects collection of the EObjects to check
-	 * @param context the context of the caller 
-	 * @return
-	 */
-	IStatus checkModify(Collection<EObject> eObjects, Object context);
-	
-	IStatus checkModify(Resource[] resources, Object context);
-}
diff --git a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IFileBasedLibraryPersister.java b/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IFileBasedLibraryPersister.java
deleted file mode 100644
index 08519b5..0000000
--- a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IFileBasedLibraryPersister.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.services;
-
-import java.io.File;
-
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-
-/**
- * The interface for a file-based Method Library Persister.
- * <p>
- * A Method Library Persister is responsible for persisting the method library
- * content.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IFileBasedLibraryPersister extends ILibraryPersister {
-
-	/**
-	 * Gets the path of a method element's folder relative to its plug-in or
-	 * library folder.
-	 * 
-	 * @param e
-	 *            a method element
-	 * @return a relative path name
-	 */
-	public String getFolderRelativePath(MethodElement e);
-
-	/**
-	 * Gets the absolute path of a method element's folder.
-	 * 
-	 * @param e a method element
-	 * @return the absolute path
-	 */
-	public String getFolderAbsolutePath(MethodElement e);
-	
-	/**
-	 * Gets the file extension of a method element's resource file.
-	 * 
-	 * @param e
-	 *            a method element
-	 * @return a file extension name
-	 */
-	public String getFileExtension(Object e);
-
-	/**
-	 * Checks whether a method element stores its content in a folder named
-	 * after it.
-	 * 
-	 * @param e
-	 *            a method element
-	 * @return <code>true</code> if the method element stores its content in a
-	 *         folder named after it
-	 */
-	public boolean hasOwnFolder(Object e);
-	
-	/**
-	 * Creates folder for the method plugin with the specified name in the given method library.
-	 *  
-	 * @param pluginName the name of method plugin
-	 * @param library the library where the method plugin folder will be created
-	 * @return the method plugin folder
-	 * @exception RuntimeException if folder creation failed
-	 */
-	public File createMethodPluginFolder(String pluginName, MethodLibrary library);
-	
-	/**
-	 * Gets the default folder to store method configuration in the specified method library.
-	 * 
-	 * @param library the method library
-	 * @return the default folder to store method configuration or null
-	 * @exception RuntimeException if failed
-	 */
-	public File getDefaultMethodConfigurationFolder(MethodLibrary library);
-	
-	/**
-	 * Sets the default folder to store method configuration in the specified method library.
-	 * 
-	 * @param library the method library
-	 * @param file the default folder to store method configuration
-	 */
-	public void setDefaultMethodConfigurationFolder(MethodLibrary library, File file);
-	
-	/**
-	 * Gets the absolute path of the resource folder of the element in the library.
-	 * 
-	 * @param e
-	 * @return absolute path of the element's resource folder
-	 */
-	public String getResourceFolderPath(MethodElement e);
-	
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IFileManager.java b/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IFileManager.java
deleted file mode 100644
index b32573c..0000000
--- a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/IFileManager.java
+++ /dev/null
@@ -1,89 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.services;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * The interface for a File Manager.
- * <p>
- * A File Manager is responsible for managing the XMI files associated with the
- * method elements.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IFileManager {
-
-	/**
-	 * Checks whether the given method element path can be modified.
-	 * 
-	 * @param path
-	 *            an absolute path to a method element
-	 * @param context
-	 *            the <code>org.eclipse.swt.widgets.Shell</code> that is to be
-	 *            used to parent any dialogs with the user, or <code>null</code>
-	 *            if there is no UI context (declared as an <code>Object</code>
-	 *            to avoid any direct references on the SWT component)
-	 * @return a status object
-	 */
-	public IStatus checkModify(String path, Object context);
-
-	/**
-	 * Checks whether the given method element path can be modified.
-	 * 
-	 * @param paths
-	 *            an array of path fragments that point to a method element
-	 * @param context
-	 *            the <code>org.eclipse.swt.widgets.Shell</code> that is to be
-	 *            used to parent any dialogs with the user, or <code>null</code>
-	 *            if there is no UI context (declared as an <code>Object</code>
-	 *            to avoid any direct references on the SWT component)
-	 * @return a status object
-	 */
-	public IStatus checkModify(String[] paths, Object context);
-
-	/**
-	 * Deletes the given method element path.
-	 * 
-	 * @param path
-	 *            an absolute path to a method element
-	 * @return <code>true</code> if the deletion is successful
-	 */
-	public boolean delete(String path);
-
-	/**
-	 * Renames the path of a method element.
-	 * 
-	 * @param oldFile
-	 *            a <code>File</code> object that contains a method element's
-	 *            old path
-	 * @param newFile
-	 *            a <code>File</code> object that contains a method element's
-	 *            new path
-	 * @return <code>true</code> if the renaming is successful
-	 */
-	public boolean rename(File oldFile, File newFile);
-
-	/**
-	 * Moves a method element to a new location.
-	 * 
-	 * @param oldPath
-	 *            a method element's old path
-	 * @param newName
-	 *            a method element's new path
-	 * @return <code>true</code> if the move is successful
-	 */
-	public boolean move(String oldPath, String newPath);
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/ILibraryPersister.java b/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/ILibraryPersister.java
deleted file mode 100644
index 5ff2e3a..0000000
--- a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/ILibraryPersister.java
+++ /dev/null
@@ -1,157 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.services;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * The interface for a Method Library Persister.
- * <p>
- * A Method Library Persister is responsible for persisting the method library
- * content.
- * 
- * @author Phong Nguyen Le - Oct 9, 2006
- * @since 1.0
- */
-public interface ILibraryPersister {
-	/**
-	 * Saves an existing resource.
-	 * 
-	 * @param resource
-	 *            a resource
-	 */
-	public void save(Resource resource) throws Exception;
-	
-	/**
-	 * Saves the given MethodElement in its own resource. The specified MethodElement must be part of a library
-	 * and it is allowed to have its own resource, to which no other resource refers. In other words, calling 
-	 * {@link #hasOwnResourceWithoutReferrer(Object)} on the given MethodElement must return <code>true</code>.
-	 * 
-	 * @param element
-	 * @throws Exception
-	 */
-	public void save(MethodElement element) throws Exception;
-
-	/**
-	 * Deletes the resources associated with a method element.
-	 * 
-	 * @param e
-	 *            a method element
-	 */
-	public void delete(MethodElement e);
-	
-	/**
-	 * Deletes the resources associated with a method element.
-	 * 
-	 * @param e
-	 *            a method element
-	 */
-	public void delete(Collection<MethodElement> elems);
-
-	/**
-	 * Adjusts the location of a resource and saves all the resources that have
-	 * been changed as the result of this adjustment.
-	 * 
-	 * @param resource
-	 *            a resource
-	 */
-	public void adjustLocation(Resource resource);
-
-	/**
-	 * Gets a list of warnings associated with a resource.
-	 * 
-	 * @return a list of <code>Exception</code> objects
-	 */
-	public List getWarnings();
-
-	/**
-	 * Checks whether a method element can have its own resource.
-	 * 
-	 * @param e
-	 *            a method element
-	 * @return <code>true</code> if the method element is owned by a resource
-	 */
-	public boolean hasOwnResource(Object e);
-
-	/**
-	 * Checks whether a method element can have its own resource, which no other resource refers to.
-	 * 
-	 * @param e
-	 * @return
-	 */
-	public boolean hasOwnResourceWithoutReferrer(Object e);
-	
-	/**
-	 * Checks if <code>containerResource</code> contains <code>resource</code>.
-	 * 
-	 * @param resource
-	 * @param containerResource
-	 * @return <code>true</code> if the specified resource is contained by <code>containerResource</code>
-	 */
-	public boolean isContainedBy(Resource resource, Resource containerResource);
-
-	/**
-	 * Gets the fail safe method library persister associated with this library
-	 * persister.
-	 * 
-	 * @return a fail safe method library persister
-	 */
-	public FailSafeMethodLibraryPersister getFailSafePersister();
-
-	public static interface FailSafeMethodLibraryPersister extends
-			ILibraryPersister {
-		/**
-		 * Direct persister to overwrite during save without checking on change conflicts.
-		 */
-		public static final String OPTIONS_OVERWRITABLE_RESOURCES = "OVERWRITABLE_RESOURCES"; //$NON-NLS-1$
-
-		/**
-		 * Gets the current transaction ID.
-		 * 
-		 * @return the current transaction ID
-		 */
-		String getCurrentTxID();
-
-		/**
-		 * Adjusts the location of the given resource and save all the resources
-		 * that have been changed as the result of this adjustment. This call
-		 * needs a new transaction and the transaction will be committed in this
-		 * method.
-		 * 
-		 * @param resources
-		 *            the resources whose locations need to be adjusted
-		 */
-		void adjustLocation(Collection resources);
-
-		/**
-		 * Commits the transaction.
-		 */
-		void commit();
-
-		/**
-		 * Roll backs the transaction.
-		 */
-		void rollback();
-		
-		/**
-		 * Gets save options.
-		 * 
-		 * @return
-		 */
-		Map getSaveOptions();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/Services.java b/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/Services.java
deleted file mode 100644
index 168443b..0000000
--- a/1.5/plugins/org.eclipse.epf.services/src/org/eclipse/epf/services/Services.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.services;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.emf.common.CommonPlugin;
-import org.osgi.framework.Bundle;
-
-/**
- * Helper class to access the extensions contributed to extenstion point
- * "org.eclipse.epf.uma.services".
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class Services {
-	private static class PersisterDescriptor {
-		String pluginId;
-		String type;
-		String className;
-		boolean isDefault;
-		int version;
-		ILibraryPersister persister;
-	}
-	
-	/**
-	 * Persistence type for XMI-file-based library
-	 */
-	public static final String XMI_PERSISTENCE_TYPE = "xmi"; //$NON-NLS-1$
-		
-	private static final String namespace = Activator.PLUGIN_ID; 
-	private static final String extensionPointName = "serviceProviders"; //$NON-NLS-1$
-
-	private static IAccessController accessController;
-	private static IFileManager fileManager;
-	private static List<PersisterDescriptor> persisterDescriptors = new ArrayList<PersisterDescriptor>();	
-	private static Map<String, PersisterDescriptor> typeToLibraryPersisterDescriptorMap;
-
-	private static String defaultPersistenceType;
-
-	private static Object getService(String serviceName) {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(namespace, extensionPointName);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			Bundle bundle = null;
-			String className = null;
-			int version = -1;
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					if(serviceName.equals(configElement.getName())) {
-						int otherVersion = parseVersion(configElement.getAttribute("version")); //$NON-NLS-1$
-						if(otherVersion > version) {
-							className = configElement.getAttribute("class"); //$NON-NLS-1$
-							bundle = Platform.getBundle(pluginId);
-							version = otherVersion;
-						}
-					}
-				}
-			}
-			if(className != null) {
-				try {
-					return bundle.loadClass(className).newInstance();
-				} catch (Exception e) {
-					CommonPlugin.INSTANCE.log(e);
-				}
-			}
-		}
-		return null;
-	}
-	
-	public static int parseVersion(String str) {
-		try {
-			return Integer.parseInt(str);
-		}
-		catch(NumberFormatException e) {
-			return 0;
-		}		
-	}
-	
-	private static Map<String, PersisterDescriptor> getTypeToLibraryPersisterDescriptorMap() {
-		Map<String, PersisterDescriptor> typeToPersisterDescriptorMap = new HashMap<String, PersisterDescriptor>();
-		String serviceName = "libraryPersister"; //$NON-NLS-1$
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(namespace, extensionPointName);
-		if (extensionPoint != null) {
-			IExtension[] extensions = extensionPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				IExtension extension = extensions[i];
-				String pluginId = extension.getNamespaceIdentifier();
-				IConfigurationElement[] configElements = extension
-						.getConfigurationElements();
-				for (int j = 0; j < configElements.length; j++) {
-					IConfigurationElement configElement = configElements[j];
-					if(serviceName.equals(configElement.getName())) {
-						try {
-							PersisterDescriptor descriptor = new PersisterDescriptor();
-							descriptor.pluginId = pluginId;
-							descriptor.type = configElement.getAttribute("type"); //$NON-NLS-1$							
-							descriptor.className = configElement.getAttribute("class"); //$NON-NLS-1$
-							descriptor.isDefault = Boolean.parseBoolean(configElement.getAttribute("default")); //$NON-NLS-1$							
-							descriptor.version = parseVersion(configElement.getAttribute("version")); //$NON-NLS-1$							
-							persisterDescriptors.add(descriptor);
-							if(descriptor.type != null) {
-								PersisterDescriptor desc = typeToPersisterDescriptorMap.get(descriptor.type);
-								if(desc != null) {
-									if(desc.version < descriptor.version) {
-										typeToPersisterDescriptorMap.put(descriptor.type, descriptor);
-										if(descriptor.isDefault) {
-											defaultPersistenceType = descriptor.type;
-										}
-										else if(desc.isDefault) {
-											defaultPersistenceType = null;
-										}
-									}
-								}
-								else {
-									typeToPersisterDescriptorMap.put(descriptor.type, descriptor);
-									if(descriptor.isDefault) {
-										defaultPersistenceType = descriptor.type;
-									}
-								}
-							}
-						} catch (Exception e) {
-							CommonPlugin.INSTANCE.log(e);
-						}
-					}
-				}
-			}
-		}
-		return typeToPersisterDescriptorMap;
-	}
-	
-	public static final IAccessController getAccessController() {
-		if(accessController == null) {
-			accessController = (IAccessController) getService("accessController"); //$NON-NLS-1$
-		}
-		return accessController;
-	}
-	
-	/**
-	 * Gets the library persister of the given type
-	 * 
-	 * @param type
-	 * @return
-	 */
-	public static final ILibraryPersister getLibraryPersister(String type) {
-		if(typeToLibraryPersisterDescriptorMap == null) {
-			typeToLibraryPersisterDescriptorMap = getTypeToLibraryPersisterDescriptorMap();
-		}
-		PersisterDescriptor descriptor = typeToLibraryPersisterDescriptorMap.get(type);
-		if(descriptor != null) {
-			if(descriptor.persister == null) {
-				Bundle bundle = Platform.getBundle(descriptor.pluginId);
-				try {
-					descriptor.persister = (ILibraryPersister) bundle.loadClass(descriptor.className).newInstance();
-				} catch (Exception e) {
-					CommonPlugin.INSTANCE.log(e);
-				}
-			}
-			return descriptor.persister;
-		}
-		return null;
-	}
-	
-	public static final ILibraryPersister getDefaultLibraryPersister() {
-		return getLibraryPersister(getDefaultLibraryPersistenceType());
-	}
-	
-	public static final String getDefaultLibraryPersistenceType() {
-		if(defaultPersistenceType == null) {
-			getTypeToLibraryPersisterDescriptorMap();
-			if(defaultPersistenceType == null && getLibraryPersister(XMI_PERSISTENCE_TYPE) != null) {
-				// no persister is set as default, choose XMI as default persistence type
-				//
-				defaultPersistenceType = XMI_PERSISTENCE_TYPE;
-			}
-		}
-		return defaultPersistenceType;
-	}
-
-	public static final IFileManager getFileManager() {
-		if(fileManager == null) {
-			fileManager = (IFileManager) getService("fileManager"); //$NON-NLS-1$
-		}
-		return fileManager;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/.project b/1.5/plugins/org.eclipse.epf.ui.intro/.project
deleted file mode 100644
index 0111e45..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/.project
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.ui.intro</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/.settings/org.eclipse.ltk.core.refactoring.prefs b/1.5/plugins/org.eclipse.epf.ui.intro/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 4c66876..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Dec 01 16:02:41 PST 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.ui.intro/META-INF/MANIFEST.MF
deleted file mode 100644
index add3b8b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,13 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.ui.intro; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.ui,
- org.eclipse.ui.intro
-Eclipse-LazyStart: true
-Bundle-Vendor: %providerName
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/build.properties b/1.5/plugins/org.eclipse.epf.ui.intro/build.properties
deleted file mode 100644
index 3ceb854..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-bin.includes = META-INF/,\
-               css/,\
-               help/,\
-               icons/,\
-               introContent.xml,\
-               plugin.xml,\
-               plugin.properties,\
-               welcome.xml
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/conf.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/conf.gif
deleted file mode 100644
index d6925cb..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/conf.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/firststeps/firststeps.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/firststeps/firststeps.css
deleted file mode 100644
index ba5b5b9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/firststeps/firststeps.css
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*
- * firststeps.css is a template for the group specific css settings
- */
- 
-/*
- * background watermark - group specific
- */
-
-body {
-	background-image : url(graphics/contentpage/firsteps_wtr.jpg);
-}
-
-/*
- * show the "selected" image for this page - This is group specific
- */
-
-#navigation-links a#steps img, #navigation-links a#steps:hover img { background-image : url(../graphics/icons/ctool/firsteps48sel.gif); }
-
-/* 
- * Set up the Overview links to be displayed in two columns
- * that are centered in the middle of the page.
- */
-
-#steps-links {	text-align : left;	width : 760px;	/* To center in Moz (have to use text-align for IE) */	margin : 0px auto;}
-#steps-links a { 	width : 370px;	text-align : left; 	margin-left : 5px;	margin-right : 5px;	margin-top : 5px;	margin-bottom : -20px;	vertical-align : top;}
-#steps-links > a { vertical-align : middle; }
-#steps-links a img {	height : 57px;	width : 57px;	vertical-align : middle;}	
-#steps-links a .link-label {	display : block;	width : 300px;	position : relative;	top : -50px;	left : 60px;}
-#steps-links a p .text {	display : block;	width : 300px;	position : relative;	top : -45px;	left : 53px;}
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#steps-links > a { 	width : 700px; }
-#steps-links a > .link-label { width : 700px; }
-#steps-links a p > .text { width : 700px; }
-
-#steps-links a:hover { border-right : 5px; }
-
-a#basics img { background-image : url(../graphics/icons/obj48/wbbasics_obj.gif); }
-a#basics:hover img { background-image : url(../graphics/icons/obj48/wbbasicshov_obj.gif); }
-
-a#team img { background-image : url(../graphics/icons/obj48/teamsup_obj.gif); }
-a#team:hover img { background-image : url(../graphics/icons/obj48/teamsuphov_obj.gif); }
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/firststeps/firststeps.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/firststeps/firststeps.properties
deleted file mode 100644
index e97ff32..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/firststeps/firststeps.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-steps.layout.ncolumns = 2
-steps.page-content.layout.vspacing = 40
-
-steps.page-content.steps-links.layout.ncolumns = 2
-steps.page-content.steps-links.layout.vspacing = 35
-
-steps.subtitle-id = steps/page-content/page-title
-steps.description-id = steps/page-content/page-description
-
-steps.page-content.steps-links.epf-steps-two.link-icon = css/graphics/icons/obj48/page_firststeps.gif
-steps.page-content.steps-links.epf-steps-four.link-icon = css/graphics/icons/obj48/page_firststeps.gif
-steps.page-content.steps-links.epf-steps-one.link-icon = css/graphics/icons/obj48/page_firststeps.gif
-steps.page-content.steps-links.epf-steps-three.link-icon = css/graphics/icons/obj48/page_firststeps.gif
-#news.new-and-noteworthy.link-icon = css/graphics/icons/obj48/new_obj.gif
-#news.migration.link-icon = css/graphics/icons/obj48/migrate_obj.gif
-#news.updates.link-icon = css/graphics/icons/obj48/updates_obj.gif
-#news.eclipse.link-icon = css/graphics/icons/obj48/community_obj.gif
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/1x1trans.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/1x1trans.gif
deleted file mode 100644
index 5caf438..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/1x1trans.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/background.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/background.jpg
deleted file mode 100644
index ce1cada..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/background.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/backgroundcurve.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/backgroundcurve.gif
deleted file mode 100644
index 17657d4..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/backgroundcurve.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/backgroundcurve2.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/backgroundcurve2.gif
deleted file mode 100644
index f18b0ce..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/backgroundcurve2.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/brandmark.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/brandmark.gif
deleted file mode 100644
index 97bd9d4..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/brandmark.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/content_background.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/content_background.jpg
deleted file mode 100644
index f03c6d4..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/content_background.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/firsteps_wtr.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/firsteps_wtr.jpg
deleted file mode 100644
index c8d3d20..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/firsteps_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/handle.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/handle.gif
deleted file mode 100644
index 66a8893..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/handle.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/new_backgroundcurve.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/new_backgroundcurve.gif
deleted file mode 100644
index 67440af..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/new_backgroundcurve.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/new_content_background.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/new_content_background.jpg
deleted file mode 100644
index 913e571..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/new_content_background.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/overview_wtr.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/overview_wtr.jpg
deleted file mode 100644
index 733e48c..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/overview_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/page_wordmark.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/page_wordmark.gif
deleted file mode 100644
index 568e547..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/page_wordmark.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/rationaladvantage.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/rationaladvantage.jpg
deleted file mode 100644
index 10325da..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/rationaladvantage.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/retuser_wtr.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/retuser_wtr.jpg
deleted file mode 100644
index c2a42da..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/retuser_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/samples_wtr.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/samples_wtr.jpg
deleted file mode 100644
index 78e703a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/samples_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section1.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section1.gif
deleted file mode 100644
index 6147513..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section1.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section2.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section2.gif
deleted file mode 100644
index 0ee148b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section2.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section3.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section3.gif
deleted file mode 100644
index b5d24e6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section3.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section4.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section4.gif
deleted file mode 100644
index 258d4a8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/section4.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/tutorials_wtr.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/tutorials_wtr.jpg
deleted file mode 100644
index e74c7c0..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/tutorials_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/webrsrc_wtr.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/webrsrc_wtr.jpg
deleted file mode 100644
index c002f2d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/webrsrc_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/whatsnew_wtr.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/whatsnew_wtr.jpg
deleted file mode 100644
index c2a42da..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/whatsnew_wtr.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/wordmark.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/wordmark.gif
deleted file mode 100644
index 568e547..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/contentpage/wordmark.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/back.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/back.gif
deleted file mode 100644
index 1c81cb6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/back.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps48.gif
deleted file mode 100644
index c3db63d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps48sel.gif
deleted file mode 100644
index 45e58b1..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps72.gif
deleted file mode 100644
index df4529e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/firsteps72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/forward.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/forward.gif
deleted file mode 100644
index 3e4a4f4..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/forward.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/home.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/home.gif
deleted file mode 100644
index 0160f8f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/home.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview48.gif
deleted file mode 100644
index 4ae5c0f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview48sel.gif
deleted file mode 100644
index e459ce8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview72.gif
deleted file mode 100644
index 6d39df7..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/overview72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/pspbrwse.jbf b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/pspbrwse.jbf
deleted file mode 100644
index 2f15a84..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/pspbrwse.jbf
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser48.gif
deleted file mode 100644
index e143800..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser48sel.gif
deleted file mode 100644
index 8b12e7a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser72.gif
deleted file mode 100644
index 75cb31f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/retuser72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples48.gif
deleted file mode 100644
index 98ed1d0..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples48sel.gif
deleted file mode 100644
index e719120..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples72.gif
deleted file mode 100644
index c096bb0..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/samples72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials48.gif
deleted file mode 100644
index 918d619..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials48sel.gif
deleted file mode 100644
index ff1ad76..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials72.gif
deleted file mode 100644
index f81c2d4..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/tutorials72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/wb48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/wb48.gif
deleted file mode 100644
index 8d2c6cd..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/wb48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc48.gif
deleted file mode 100644
index 09c94c8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc48sel.gif
deleted file mode 100644
index a786efb..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc72.gif
deleted file mode 100644
index fbcfc20..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/webrsrc72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew48.gif
deleted file mode 100644
index 2bfb9be..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew48sel.gif
deleted file mode 100644
index 0da843f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew72.gif
deleted file mode 100644
index 74bf6ff..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/ctool/whatsnew72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/back.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/back.gif
deleted file mode 100644
index f0d0929..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/back.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/forward.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/forward.gif
deleted file mode 100644
index dbe58b2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/forward.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/overview.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/overview.gif
deleted file mode 100644
index 2bc7b0d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/overview.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/restore_welcome.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/restore_welcome.gif
deleted file mode 100644
index 4997b20..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/restore_welcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/samples.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/samples.gif
deleted file mode 100644
index 5cf3cae..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/samples.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/tutorials.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/tutorials.gif
deleted file mode 100644
index 63826a5..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/tutorials.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/whatsnew.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/whatsnew.gif
deleted file mode 100644
index 8056c99..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/dtool/whatsnew.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/back.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/back.gif
deleted file mode 100644
index f0d0929..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/back.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps48.gif
deleted file mode 100644
index e5a1ad9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps48sel.gif
deleted file mode 100644
index 7c2b4e8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps72.gif
deleted file mode 100644
index 619a81a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/firsteps72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/forward.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/forward.gif
deleted file mode 100644
index dbe58b2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/forward.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/home.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/home.gif
deleted file mode 100644
index b101d12..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/home.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview.gif
deleted file mode 100644
index 3fe629a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview48.gif
deleted file mode 100644
index 89be766..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview48sel.gif
deleted file mode 100644
index e7d21e1..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview72.gif
deleted file mode 100644
index 58d9b46..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/overview72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/restore_welcome.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/restore_welcome.gif
deleted file mode 100644
index 7736bce..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/restore_welcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser48.gif
deleted file mode 100644
index bcee36c..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser48sel.gif
deleted file mode 100644
index 8485156..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser72.gif
deleted file mode 100644
index 348abac..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/retuser72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples.gif
deleted file mode 100644
index c695884..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples48.gif
deleted file mode 100644
index d9b5927..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples48sel.gif
deleted file mode 100644
index 5d75d91..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples72.gif
deleted file mode 100644
index dfff356..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/samples72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials.gif
deleted file mode 100644
index a18d7dd..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials48.gif
deleted file mode 100644
index bde6c1e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials48sel.gif
deleted file mode 100644
index 6353e07..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials72.gif
deleted file mode 100644
index 729db88..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/tutorials72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/wb48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/wb48.gif
deleted file mode 100644
index 892c444..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/wb48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc16.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc16.gif
deleted file mode 100644
index 8f85007..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc16.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc48.gif
deleted file mode 100644
index b672a54..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc48sel.gif
deleted file mode 100644
index 903cc98..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc72.gif
deleted file mode 100644
index f6997df..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/webrsrc72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew.gif
deleted file mode 100644
index f022324..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew48.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew48.gif
deleted file mode 100644
index 6e00d7a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew48.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew48sel.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew48sel.gif
deleted file mode 100644
index be9fa0c..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew48sel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew72.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew72.gif
deleted file mode 100644
index 410093b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/etool/whatsnew72.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/ad-t-portalapplication.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/ad-t-portalapplication.gif
deleted file mode 100644
index 00c94aa..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/ad-t-portalapplication.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/ad-t-portalapplicationhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/ad-t-portalapplicationhov.gif
deleted file mode 100644
index 1302d22..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/ad-t-portalapplicationhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/community_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/community_obj.gif
deleted file mode 100644
index 5d132a8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/community_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/communityhov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/communityhov_obj.gif
deleted file mode 100644
index acb2a58..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/communityhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-configpublish.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-configpublish.gif
deleted file mode 100644
index 17a56c3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-configpublish.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-configpublishhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-configpublishhov.gif
deleted file mode 100644
index 9e28415..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-configpublishhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-method.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-method.gif
deleted file mode 100644
index 0a3da45..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-method.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-methodhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-methodhov.gif
deleted file mode 100644
index 8fd691b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-methodhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-process.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-process.gif
deleted file mode 100644
index 31b6992..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-process.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-processhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-processhov.gif
deleted file mode 100644
index 694c9cc..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-processhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-rupov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-rupov.gif
deleted file mode 100644
index ef851d0..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-rupov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-rupovhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-rupovhov.gif
deleted file mode 100644
index c0081b5..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-rupovhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-tour.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-tour.gif
deleted file mode 100644
index f195c7f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-tour.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-tourhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-tourhov.gif
deleted file mode 100644
index c719708..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-ov-tourhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-steps-one.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-steps-one.gif
deleted file mode 100644
index 4ffe824..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-steps-one.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-steps-onehov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-steps-onehov.gif
deleted file mode 100644
index 9834f72..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf-steps-onehov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf_resource.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf_resource.gif
deleted file mode 100644
index 710a8d4..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf_resource.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf_resourcehov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf_resourcehov.gif
deleted file mode 100644
index c398b35..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/epf_resourcehov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/features_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/features_obj.gif
deleted file mode 100644
index 364fd48..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/features_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/featureshov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/featureshov_obj.gif
deleted file mode 100644
index fbfdf03..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/featureshov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_advapps.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_advapps.gif
deleted file mode 100644
index 3dc3296..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_advapps.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_advappshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_advappshov.gif
deleted file mode 100644
index d69deb8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_advappshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_devweb.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_devweb.gif
deleted file mode 100644
index 17a56c3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_devweb.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_devwebhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_devwebhov.gif
deleted file mode 100644
index 9e28415..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_devwebhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_firststeps.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_firststeps.gif
deleted file mode 100644
index 17a56c3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_firststeps.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_firststepshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_firststepshov.gif
deleted file mode 100644
index 9e28415..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_firststepshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_help.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_help.gif
deleted file mode 100644
index a21b850..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_help.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_helphov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_helphov.gif
deleted file mode 100644
index 56ba28d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_helphov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_importweb.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_importweb.gif
deleted file mode 100644
index 792543a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_importweb.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_importwebhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_importwebhov.gif
deleted file mode 100644
index fcddcaf..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_importwebhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_newweb.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_newweb.gif
deleted file mode 100644
index 17a56c3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_newweb.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_newwebhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_newwebhov.gif
deleted file mode 100644
index 9e28415..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_newwebhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_overview.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_overview.gif
deleted file mode 100644
index 5d92f8e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_overview.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_overviewhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_overviewhov.gif
deleted file mode 100644
index 4e06bd1..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_overviewhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_richreports.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_richreports.gif
deleted file mode 100644
index 7d6a54b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_richreports.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_richreportshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_richreportshov.gif
deleted file mode 100644
index 2fa5aec..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_richreportshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_samples.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_samples.gif
deleted file mode 100644
index ca603cd..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_samples.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_sampleshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_sampleshov.gif
deleted file mode 100644
index 4a030bd..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_sampleshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_tutorials.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_tutorials.gif
deleted file mode 100644
index 6727d5f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_tutorials.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_tutorialshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_tutorialshov.gif
deleted file mode 100644
index 5c571f8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_tutorialshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_web.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_web.gif
deleted file mode 100644
index c77eb93..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_web.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_webhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_webhov.gif
deleted file mode 100644
index 5286dd3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_webhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_whatsnew.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_whatsnew.gif
deleted file mode 100644
index 027a8e5..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_whatsnew.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_whatsnewhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_whatsnewhov.gif
deleted file mode 100644
index 92d7315..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/folder_whatsnewhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_samples.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_samples.gif
deleted file mode 100644
index 57f762f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_samples.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_sampleshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_sampleshov.gif
deleted file mode 100644
index 95097a6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_sampleshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_tutorials.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_tutorials.gif
deleted file mode 100644
index 8ef0451..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_tutorials.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_tutorialshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_tutorialshov.gif
deleted file mode 100644
index aa2a1e9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/gallery_tutorialshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapp_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapp_obj.gif
deleted file mode 100644
index ce00d50..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapphov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapphov_obj.gif
deleted file mode 100644
index 35e9f58..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapplet_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapplet_obj.gif
deleted file mode 100644
index b19a952..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapplet_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapplethov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapplethov_obj.gif
deleted file mode 100644
index 5da3db9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javaapplethov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javadev_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javadev_obj.gif
deleted file mode 100644
index f6526a2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javadev_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javadevhov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javadevhov_obj.gif
deleted file mode 100644
index 36b47d3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/javadevhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/migrate_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/migrate_obj.gif
deleted file mode 100644
index 0c2fe88..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/migrate_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/migratehov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/migratehov_obj.gif
deleted file mode 100644
index ee34e2a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/migratehov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/new_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/new_obj.gif
deleted file mode 100644
index f46b81b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/new_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/newhov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/newhov_obj.gif
deleted file mode 100644
index 593e63b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/newhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_firststeps.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_firststeps.gif
deleted file mode 100644
index f9c0b26..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_firststeps.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_firststepshov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_firststepshov.gif
deleted file mode 100644
index a8c055a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_firststepshov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_help.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_help.gif
deleted file mode 100644
index 17fb463..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_help.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_helphov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_helphov.gif
deleted file mode 100644
index 1c24f4e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_helphov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_movie.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_movie.gif
deleted file mode 100644
index 23f999e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_movie.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_moviehov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_moviehov.gif
deleted file mode 100644
index d1e57ec..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_moviehov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_overview.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_overview.gif
deleted file mode 100644
index ce1bb15..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_overview.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_overviewhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_overviewhov.gif
deleted file mode 100644
index 1227896..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_overviewhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_web.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_web.gif
deleted file mode 100644
index c75987a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_web.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_webhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_webhov.gif
deleted file mode 100644
index a9197db..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_webhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_whatsnew.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_whatsnew.gif
deleted file mode 100644
index cabafb9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_whatsnew.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_whatsnewhov.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_whatsnewhov.gif
deleted file mode 100644
index 3b0e51d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/page_whatsnewhov.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/plugin_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/plugin_obj.gif
deleted file mode 100644
index d92d2c5..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/plugin_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/pluginhov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/pluginhov_obj.gif
deleted file mode 100644
index 1de8ccc..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/pluginhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/rcpapp_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/rcpapp_obj.gif
deleted file mode 100644
index 830ab56..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/rcpapp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/rcpapphov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/rcpapphov_obj.gif
deleted file mode 100644
index 5bd80a9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/rcpapphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplepurp_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplepurp_obj.gif
deleted file mode 100644
index c4e56fc..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplepurp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplepurphov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplepurphov_obj.gif
deleted file mode 100644
index 60481e2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplepurphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplered_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplered_obj.gif
deleted file mode 100644
index f6d104e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/samplered_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/sampleredhov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/sampleredhov_obj.gif
deleted file mode 100644
index 687d6b2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/sampleredhov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/script_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/script_obj.gif
deleted file mode 100644
index b48b7cd..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/script_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/scripthov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/scripthov_obj.gif
deleted file mode 100644
index d67203e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/scripthov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/swtapp_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/swtapp_obj.gif
deleted file mode 100644
index 9ba9a33..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/swtapp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/swtapphov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/swtapphov_obj.gif
deleted file mode 100644
index c4fbb5d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/swtapphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_methcont_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_methcont_obj.gif
deleted file mode 100644
index 4e9a901..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_methcont_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_methconthov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_methconthov_obj.gif
deleted file mode 100644
index 8dd1217..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_methconthov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_navui_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_navui_obj.gif
deleted file mode 100644
index 2e39ab2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_navui_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_navuihov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_navuihov_obj.gif
deleted file mode 100644
index 1f101a6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_navuihov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_pubexp_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_pubexp_obj.gif
deleted file mode 100644
index d22ffc6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_pubexp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_pubexphov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_pubexphov_obj.gif
deleted file mode 100644
index 061b1a3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_pubexphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_remethcont_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_remethcont_obj.gif
deleted file mode 100644
index bf7d28e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_remethcont_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_remethconthov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_remethconthov_obj.gif
deleted file mode 100644
index 8fd57d6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_remethconthov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_workproc_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_workproc_obj.gif
deleted file mode 100644
index 5426741..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_workproc_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_workprochov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_workprochov_obj.gif
deleted file mode 100644
index 591078c..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/t_workprochov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/teamsup_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/teamsup_obj.gif
deleted file mode 100644
index 86bd7d6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/teamsup_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/teamsuphov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/teamsuphov_obj.gif
deleted file mode 100644
index 4bdf819..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/teamsuphov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/updates_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/updates_obj.gif
deleted file mode 100644
index 1608b30..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/updates_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/updateshov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/updateshov_obj.gif
deleted file mode 100644
index 22a0ace..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/updateshov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/wbbasics_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/wbbasics_obj.gif
deleted file mode 100644
index 8b82563..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/wbbasics_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/wbbasicshov_obj.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/wbbasicshov_obj.gif
deleted file mode 100644
index 230be9c..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/icons/obj48/wbbasicshov_obj.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background.jpg
deleted file mode 100644
index 969fcf3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background_eclipse.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background_eclipse.jpg
deleted file mode 100644
index 969fcf3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background_eclipse.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background_old.jpg b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background_old.jpg
deleted file mode 100644
index df0acec..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/background_old.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/brandmark.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/brandmark.gif
deleted file mode 100644
index 93f25f7..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/brandmark.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/brandmark_eclipse.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/brandmark_eclipse.gif
deleted file mode 100644
index 93f25f7..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/brandmark_eclipse.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/dots.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/dots.gif
deleted file mode 100644
index 09b93ee..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/dots.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/standby_wordmark.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/standby_wordmark.gif
deleted file mode 100644
index 087b151..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/rootpage/standby_wordmark.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/swt/form_banner.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/swt/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/graphics/swt/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/mc.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/mc.gif
deleted file mode 100644
index 89f045f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/mc.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/mc_vs_p.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/mc_vs_p.gif
deleted file mode 100644
index 28cf1c3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/mc_vs_p.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/methodauthoring.html b/1.5/plugins/org.eclipse.epf.ui.intro/css/methodauthoring.html
deleted file mode 100644
index ad060dd..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/methodauthoring.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<html>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<head>
-<title>Method Content Authoring Overview</title>
-</head>
-<body>
-<h3>Method Content Authoring Overview</h3>
-<p>Method content describes roles, the tasks that they perform, the work products
-  that are used and produced by those tasks, and supporting guidance.</p>
-<p><img src="mc.gif"></p>
-<p>The figure above depicts typical sources for method content, as well as how
-  the method content is represented in RMC. Many development methods are described
-  in publications such as books, articles, training material, standards and regulations,
-  and other forms of documentation. These sources usually document methods by
-  providing step-by-step explanations for a particular way of achieving a specific
-  development goal under general circumstances. Some examples are: transforming
-  a requirements document into an analysis model; defining an architectural mechanism
-  based on functional and non-functional requirements; creating a project plan
-  for a development iteration; defining a quality assurance plan for functional
-  requirements; redesigning a business organization based on a new strategic direction,
-  and so on.</p>
-<p>RMC takes content such as that described above, and structures it in a specific
-  schema of roles, work products, tasks, and guidance. This schema supports the
-  organization of large amounts of descriptions for development methods and processes.
-  Such method content and processes do not have to be limited to software engineering,
-  but can also cover other design and engineering disciplines such as mechanical
-  engineering, business transformation, sales cycles, and so on.</p>
-<p> The RMC screen capture in the figure above shows how such method content elements
-  are organized in tree browsers on the left. These tree browsers, similar to
-  a library, provide different indexes of the available elements for rapid access.
-  The screen capture shows on the right an example of a task presentation. This
-  task presentation defines the task in terms of steps that need to be performed
-  to achieve the task's purpose. You can see that the task has various relationships,
-  such as relationships to performing roles as well as work products that serve
-  as inputs and outputs to the task. Find out more details on tasks, role, and
-  work products in the online help <a href="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/methodauthoringoverview.html">here</a>.
-  In addition to roles, tasks, and work products, RMC supports the addition of
-  guidance elements. Guidance are supplementary free-form documentation such as
-  whitepapers, concept descriptions, guidelines, templates, examples, and so on.</p>
-<p>RMC provides various form-based editors to create new method content elements.
-  Document your task, roles, work products, and guidance elements using intuitive
-  rich-text editors that allow you to copy and paste text from other sources such
-  as web pages or documents. Use simple dialogs to establish relationships between
-  content elements.</p>
-<p>RMC organizes content in physical content packages that allow you to manage
-  your content in configurable units. RMC also allows you to categorize your content
-  based on a set of predefined categories (for example, categorize your tasks
-  into development disciplines, or your work products into domains) or create
-  your own categorization schemes for your content with your own user-defined
-  categories that allow you to index content in any way you want.</p>
-<p>For more details on method content authoring see the online help:</p>
-<div align="left">
-<ul>
-  <li><a href="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/methodauthoringoverview.html">Method
-      Authoring Overview</a></li>
-</ul>
-</div>
-<p>&nbsp;</p>
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/overview.html b/1.5/plugins/org.eclipse.epf.ui.intro/css/overview.html
deleted file mode 100644
index 8cfdc9e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/overview.html
+++ /dev/null
@@ -1,168 +0,0 @@
-<html>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<head>
-<title>Eclipse Process Framework Composer Overview</title>
-</head>
-<body>
-<h3>Introduction to Eclipse Process Framework (EPF) Composer</h3>
-<p>Welcome to Eclipse Process Framework (EPF) Composer. EPF Composer is a tool platform that enables
-  process engineers and managers to implement, deploy, and maintain processes
-  for organizations or individual projects. Typically, two key problems need to
-  be addressed to successfully deploy new processes.</p>
-<p> First, development teams need to be educated on the methods applicable to
-  the roles that they are responsible for. Software developers typically need
-  to
-  learn
-  how
-  to
-  do analysis and design, testers need to learn how to test implementations against
-   requirements, managers need to learn how to manage the project scope and change,
-
-  and so on. Some organizations assume that developers implicitly know how to
-   do such work without documenting their methods, but many organizations want
-
-  to establish common and regulated practices, to drive specific improvement
-  objectives,  and to meet compliance standards.</p>
-<p> Second, development teams need to understand how to apply these methods throughout
-  a development lifecycle. That is, they need to define or select a development
-  process. For
-
-  example, requirements management methods have to be applied differently in
-  early  phases of a project where the focus is on elicitation of stakeholder
-  needs and
-  requirements and scoping a vision, than in later phases where the focus is
-  on  managing requirements updates and changes and performing impact analysis
-  of
-  these requirements changes. Teams also need clear understanding of how the
-  different  tasks of the methods relate to each other, for example, how the
-  change management
-  method impacts the requirements management method as well as regression testing
-   method throughout the lifecycle. Even self-organizing teams need to define
-  a
-  process that gives at minimum some guidance on how the development will be
-  scoped  throughout the lifecycle, when milestones will be achieved and verified,
-  and
-  so on. </p>
-<p>To that end, EPF Composer has two main purposes: </p>
-<div align="left"><ul>
-  <li>To provide a knowledge base of intellectual capital which you can browse,
-    manage and deploy. This content can include externally developed content,
-    and, more importantly, can include your own content including of whitepapers,
-    guidelines, templates, principles, best practices, internal procedures and
-    regulations, training material, and any other general descriptions of your
-    methods. This knowledge base can used for reference and education. It also
-    forms the basis for developing processes (the second purpose). EPF Composer is designed
-    to be a content management system that provides a common management structure
-    and look and feel for all of your content, rather than being a document management
-    system in which you would store and access hard to maintain legacy documents
-    all in their own shapes and formats. All content managed in EPF Composer can be published
-    to html and deployed to Web servers for distributed usage.<br>
-  </li>
-  <li>To provide process engineering capabilities by supporting process engineers
-    and project managers in selecting, tailoring, and rapidly assembling processes
-    for their concrete development projects. EPF Composer provides catalogs of pre-defined
-    processes for typical project situations that can be adapted to individual
-    needs. It also provides process building blocks, called capability patterns,
-    that represent best development practices for specific disciplines, technologies,
-    or management styles. These building blocks form a toolkit for quick assembly
-    of processes based on project-specific needs. EPF Composer also allows you to set up
-    your own organization-specific capability pattern libraries. Finally, the
-    processes created with EPF Composer can be published and deployed as Web sites.</li>
-</ul>
-</div>
-<h3>Eclipse Process Framework Composer's Key Capabilities</h3>
-<p>IBM Eclipse Process Framework Composer provides the following new key capabilities:</p>
-  <div align="left">
-<ul>
-  <li> Provides completely redesigned tools for authoring, configuring, viewing,
-    and publishing development processes.</li>
-  <li> Provides just-in-time generation of publication previews in dedicated browsing
-    perspective that allows rapid configuration switching.</li>
-  <li> Manages method content using simple form-based user interfaces. Therefore,
-    UML modeling skills are no longer required.</li>
-  <li> Provides intuitive rich text editors for creating illustrative content
-    descriptions. Editors allow use of styles, images, tables, hyperlinks, and
-    direct html editing.</li>
-  <li>Allows creating processes with breakdown structure editors and workflow
-    diagrams through use of multi-presentation process editors. Breakdown structure
-    editor supports different process views: work-breakdown view, work product
-    usage view, and team allocation view. EPF Composer automatically synchronizes all presentations
-    with process changes. </li>
-  <li>Provides support for many alternative lifecycle
-    models. For example, waterfall, incremental, or iterative models can be created
-    with the same overlapping method content.</li>
-  <li>Improved reuse and extensibility capabilities. The plug-in mechanisms from
-    past versions have been extended to support extensions for breakdown structures.</li>
-  <li>Supports reusable dynamically-linked process patterns of best practices
-    for rapid process assembly via drag-and-drop.</li>
-</ul>
-</div>
-<h3>Key Terminology and Concepts</h3>
-<p>To effectively work with EPF Composer, you need to understand a few concepts
-  that are used to organize the content. The pages <a href="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/methodauthoringoverview.html">Method
-  Content Authoring Overview</a> and <a href="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/processauthoringoverview.html">Process
-  Authoring Overview</a> contain more detail and concrete examples of how to work
-  in the tool. This page provides you with a general overview of these concepts.</p>
-<p>The most fundamental principle in EPF Composer is the separation of reusable core method
-  content from its application in processes. This directly relates back to the
-  two purposes of EPF Composer described in the first section. Almost all of EPF Composer's concepts
-  are categorized along this separation. Method content describes what is to be
-  produced, the necessary skills required and the step-by-step explanations describing
-  how specific development goals are achieved. These method content descriptions
-  are independent of a development lifecycle. Processes describe the development
-  lifecycle. Processes take the method content elements and relate them into semi-ordered
-  sequences that are customized to specific types of projects.</p>
-<p><img src="uma_hump.gif"></p>
-<p>The figure above shows how this separation is depicted in Basic Unified
-  Process. Method content, describing how development work is being performed,
-  is categorized by disciplines along the y-axis of the diagram. The work described
-  in a process is seen along the x-axis representing the timeline. This is the
-  lifecycle of a development project. It expresses when what work will be performed.
-  The graph in the illustration represents an estimated workload for each discipline.
-  As you see, for example, one never stops working on requirements in RUP, but
-  there are certainly peak times in which most of the requirements elicitation
-  and description work is performed. There are also times at which a downward
-  trend needs to be observed where fewer and fewer requirements changes have to
-  be processed to bring the project to a close. This avoids what is referred to
-  as feature creep in which requirements work remains constant or even increases.
-  Hence, a lifecycle (process) expresses the variances of work performed in the
-  various disciplines (method content).</p>
-<p><img src="mc_vs_p.gif"></p>
-<p>The picture above provides a summary of the key elements used in EPF Composer and how
-  they relate to method content or process. As you see, method content is primarily
-  expressed using work products, roles, tasks, and guidance. Guidance, such as
-  checklists, examples, or roadmaps, can also be defined to provide exemplary
-  walkthroughs of a process. On the right-hand side of the diagram, you see the
-  elements used to represent processes in EPF Composer. The main element is the activity
-  that can be nested to define breakdown structures as well as related to each
-  other to define a flow of work. Activities also contain descriptors that reference
-  method content. Activities are used to define processes of which EPF Composer support
-  two main kinds: delivery processes and capability patterns. Delivery processes
-  represent a complete and integrated process template for performing one specific
-  type of project. They describe a complete end-to-end project lifecycle and are
-  used as a reference for running projects with similar characteristics. Capability
-  patterns are processes that express and communicate process knowledge for a
-  key area of interest such as a discipline or a best practice. They are also
-  used as building blocks to assemble delivery processes or larger capability
-  patterns. This ensures optimal reuse and application of their key best practices
-  in process authoring activities in EPF Composer. </p>
-
-<p>For more details on Eclipse Process Framework Composer, see the online help:</p>
-<div align="left">
-<ul>
-  <li><a href="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/aboutepfcomposer.html">Overview</a></li>
-  <li><a href="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/standardmethodlibraryoverview.html">Getting
-      Started</a></li>
-</ul>
-</div>
-<p></p>
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/overview/overview.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/overview/overview.css
deleted file mode 100644
index fa15548..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/overview/overview.css
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-body {
-	background-image : url(../graphics/contentpage/overview_wtr.jpg);
-}
-
-/* show the "selected" image for this page */
-#navigation-links a#overview img, #navigation-links a#overview:hover img { 
-	background-image : url(../graphics/icons/ctool/overview48sel.gif); 
-	}
-
-
-iframe {
-	position:relative;
-	top:16px;
-	width:100%;
-	height:100%;
-	padding-left:10px;
-	}
-	
-/* mozilla scrollbar appearing off page fix */
-#page-content > iframe {
-	width: 98%;
-	padding-left: 2%;
-}	
-
-
-/* 
- * Set up the Overview links to be displayed in two columns
- * that are centered in the middle of the page.
- */
-
-#overview-links {
-	text-align : left;
-	width : 760px;
-	/* To center in Moz (have to use text-align for IE) */
-	margin : 0px auto;
-
-}
-
-#overview-links a { 
-	width : 370px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 5px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-#overview-links > a { vertical-align : middle; }
-
-#overview-links a img {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-		
-}	
-
-#overview-links a .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#overview-links a > .link-label { left: 65px; }
-
-#overview-links a p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-#overview-links a p > .text { left: 58px; }
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#overview-links > a { 	width : 700px; }
-#overview-links a > .link-label { width : 700px; }
-#overview-links a p > .text { width : 700px; }
-
-#overview-links a:hover { border-right : 5px; }
-
-a#basics img { background-image : url(../graphics/icons/obj48/wbbasics_obj.gif); }
-a#basics:hover img { background-image : url(../graphics/icons/obj48/wbbasicshov_obj.gif); }
-
-a#team img { background-image : url(../graphics/icons/obj48/teamsup_obj.gif); }
-a#team:hover img { background-image : url(../graphics/icons/obj48/teamsuphov_obj.gif); }
-
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/overview/swt.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/overview/swt.properties
deleted file mode 100644
index 4513ceb..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/overview/swt.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-overview.layout.ncolumns = 2
-overview.page-content.overview-links.layout.vspacing = 35
-overview.page-content.overview-links.layout.ncolumns = 2
-
-overview.subtitle-id = overview/page-content/page-title
-overview.description-id = overview/page-content/page-description
-
-overview.page-content.overview-links.epf-ov-rupov.link-icon = css/graphics/icons/obj48/epf-ov-rupov.gif
-overview.page-content.overview-links.epf-ov-method.link-icon = css/graphics/icons/obj48/epf-ov-method.gif
-overview.page-content.overview-links.epf-ov-process.link-icon = css/graphics/icons/obj48/epf-ov-process.gif
-overview.page-content.overview-links.epf-ov-configpublish.link-icon = css/graphics/icons/obj48/epf-ov-configpublish.gif
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/p.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/p.gif
deleted file mode 100644
index cbf2b7c..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/p.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/processauthoring.html b/1.5/plugins/org.eclipse.epf.ui.intro/css/processauthoring.html
deleted file mode 100644
index 22242df..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/processauthoring.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<html>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<head>
-<title>Process Authoring Overview</title>
-</head>
-<body>
-<h3>Process Authoring Overview</h3>
-<p>A development process defines sequences of tasks performed by roles and work
-  products produced over time.</p>
-<p><img src="p.gif"></p>
-<p>The figure above shows that processes are typically expressed as workflows
-  or breakdown structures. Defining a strict sequence as in a waterfall model
-  is as much a process as defining semi-ordered sequences in iterations of parallel
-  work. They just represent different development approaches. Hence, for defining
-  a process, one can take method content and combine it into structures that specify
-  how the work shall be organized over time, to meet the needs of a particular
-  type of development project (such as software for a online system versus software
-  and hardware for an embedded system). RMC supports processes based on different
-  development approaches across many different lifecycle models, including waterfall,
-  incremental, and iterative lifecycles. RMC also supports different presentations
-  for process, such as work-breakdown structure or workflow presentations. You
-  can also define processes in RMC that use a minimal set of method content to
-  define processes for agile, self-organizing teams.</p>
-<p> The RMC screen capture above shows an example of a process presented as a
-  breakdown structure of nested activities as well as a workflow or activity diagram
-  for one particular activity, the inception phase. It also indicates with the
-  two blue arrows that the particular method content task &quot;Detail a Use Case&quot;
-  has been applied in the process twice; firstly in the inception phase under
-  the activity &quot;Define the System,&quot; and secondly, in the elaboration
-  phase in the activity &quot;Refine the system definition&quot;. You see below
-  each of these task applications, referred to as a task descriptors in RMC, lists
-  of the performing roles as well as the input and output work products. If you
-  look closely, you see that these lists are different for each of these two task
-  descriptors, expressing differences in performing the &quot;Detail a Use Case&quot;
-  method throughout the lifecycle. You see different roles involved and changes
-  in the list of inputs to be considered and outputs to be produced or updated.
-  These changes were defined by the author that created this process to express
-  the exact focus of the task performance for each occurrence. In addition to
-  updating the roles, input and output work products for a task descriptor, you
-  can also provide additional textual descriptions as well as define the exact
-  steps of the task that should and should not be performed for this particular
-  occurrence of the task.</p>
-<p>RMC provides you with a process editor that supports different breakdown structure
-  views as well as graphical process presentations. As a process author, you typically
-  start by creating an activity breakdown, dividing and breaking your process
-  down into phases, iterations, and high-level activities. Instead of creating
-  your activities in the breakdown structure editor, you can alternatively work
-  in a graphical activity diagram editor that allows you to graphically create
-  a workflow for your activities. To assign method content to your process, you
-  then have the choice of working in different process views (work breakdown structure,
-  work product usage, or team allocation view). Each view supports a different
-  approach for creating a process. You can define the work to be done, define
-  the results to be produced, or define responsibilities for your roles. If requested,
-  the editor updates the other process views semi-automatically using wizards
-  that prompt you for decisions on selecting method content elements.</p>
-<p>For more details on process authoring see the online help:</p>
-<div align="left">
-<ul>
-  <li><a href="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/processauthoringoverview.html">Process
-  Authoring Overview</a></li>
-</ul>
-</div>
-<p>&nbsp;</p>
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/pub.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/pub.gif
deleted file mode 100644
index 013e8d3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/pub.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/publishing.html b/1.5/plugins/org.eclipse.epf.ui.intro/css/publishing.html
deleted file mode 100644
index 1ec082b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/publishing.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<html>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<head>
-<title>Configuration and Publishing</title>
-</head>
-<body>
-<h3>Method Configurations Overview</h3>
-<p>Eclipse Process Framework Composer ships with a lot of content out of the box. It includes
-  the Open Unified Process (OpenUP) framework and various plug-ins extending
-  OpenUP/Basic. No organization or project requires all of this
-  documentation all at once, but would work with a selection of specific subsets.</p>
-<p> Eclipse Process Framework (EPF) Composer manages for that purpose so-called method
-  configurations, which allow you to specify working sets of content and processes
-  for a specific context, such as a specific variant of the RUP framework that
-  you want to publish and deploy for a given software project or as a foundation
-  for a development organization. All content and processes in EPF Composer are organized
-  in method plug-ins, which are organized into method packages. A method configuration
-  is simply a selection of the method plug-ins and packages.</p>
-<p><img src="css/conf.gif"></p>
-<p>You create and specify a configuration using the configuration editor depicted
-  in the figure above. You could start creating your own method configuration
-  by copying one of the configurations that ship with EPF Composer and modify it to fit
-  your specific needs. You can add or remove whole method plug-ins as well as
-  make selection with each plug-in by checking or un-checking packages. </p>
-<p> You can use the resulting configuration as your working set for your EPF Composer
-  work. The actual content of the configuration, i.e. the included method content
-  and process elements are always accessible in the Configuration view. Use the
-  combo box in the toolbar to select the currently used method configuration.</p>
-<h3>Publishing Overview</h3>
-<p>Method configurations are the basis for publishing method content and processes.
-  A published configuration is an html Web site that presents all the method
-  content and processes of the method configuration in a navigable and searchable
-  way. It uses the relationships established during method content and process
-  authoring to generate hyperlinks between elements as well as provides tree
-  browsers based on the configuration view and user-defined categorizations of
-  the content. The figure below shows an example of the published 'Classic RUP'
-  method configuration.</p>
-<p><img src="css/pub.gif"></p>
-<p>For publishing simply create and select a configuration. The publication wizard
-  will do the rest for you and only publish content that is part of the method
-  configuration. It will also automatically adopt content to the configuration
-  such as removing
-  references of method content elements to elements outside of the configuration
-  or removing activities from your processes that only contain work defined outside
-  of the configuration set. Hence, publishing will only include the content that
-  you really need. You can always preview a published configuration using EPF Composer's
-browsing perspective.</p>
-<p>&nbsp;</p>
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/root.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/root.css
deleted file mode 100644
index 3e1d48f..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/root.css
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/root_swt.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/root_swt.properties
deleted file mode 100644
index 94ed699..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/root_swt.properties
+++ /dev/null
@@ -1,47 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-root.links-background.page-links.overview.link-icon = css/graphics/icons/etool/overview72.gif
-root.links-background.page-links.steps.link-icon = css/graphics/icons/etool/firsteps72.gif
-root.links-background.page-links.tutorials.link-icon = css/graphics/icons/etool/tutorials72.gif
-root.links-background.page-links.web.link-icon = css/graphics/icons/etool/webrsrc72.gif
-root.links-background.page-links.samples.link-icon= css/graphics/icons/etool/samples72.gif
-root.links-background.page-links.news.link-icon = css/graphics/icons/etool/whatsnew72.gif
-root.action-links.workbench.link-icon = css/graphics/icons/etool/wb48.gif
-
-root.links-background.page-links.overview.hover-icon = css/graphics/icons/ctool/overview72.gif
-root.links-background.page-links.steps.hover-icon = css/graphics/icons/ctool/firsteps72.gif
-root.links-background.page-links.tutorials.hover-icon = css/graphics/icons/ctool/tutorials72.gif
-root.links-background.page-links.web.hover-icon = css/graphics/icons/ctool/webrsrc72.gif
-root.links-background.page-links.samples.hover-icon = css/graphics/icons/ctool/samples72.gif
-root.links-background.page-links.news.hover-icon = css/graphics/icons/ctool/whatsnew72.gif
-root.action-links.workbench.hover-icon = css/graphics/icons/ctool/wb48.gif
-
-
-root.links-background.page-links.overview.small-link-icon = css/graphics/icons/etool/overview48.gif
-root.links-background.page-links.steps.small-link-icon = css/graphics/icons/etool/firsteps48.gif
-root.links-background.page-links.tutorials.small-link-icon = css/graphics/icons/etool/tutorials48.gif
-root.links-background.page-links.web.small-link-icon = css/graphics/icons/etool/webrsrc48.gif
-root.links-background.page-links.samples.small-link-icon = css/graphics/icons/etool/samples48.gif
-root.links-background.page-links.news.small-link-icon = css/graphics/icons/etool/whatsnew48.gif
-root.action-links.workbench.small-link-icon = css/graphics/icons/etool/wb48.gif
-
-root.links-background.page-links.overview.small-hover-icon = css/graphics/icons/ctool/overview48.gif
-root.links-background.page-links.steps.small-hover-icon = css/graphics/icons/ctool/firsteps48.gif
-root.links-background.page-links.tutorials.small-hover-icon = css/graphics/icons/ctool/tutorials48.gif
-root.links-background.page-links.web.small-hover-icon = css/graphics/icons/ctool/webrsrc48.gif
-root.links-background.page-links.samples.small-hover-icon = css/graphics/icons/ctool/samples48.gif
-root.links-background.page-links.news.small-hover-icon = css/graphics/icons/ctool/whatsnew48.gif
-root.action-links.workbench.small-hover-icon = css/graphics/icons/ctool/wb48.gif
-
-root.layout.ncolumns = 1
-root.links-background.page-links.layout.hspacing = 40
-root.layout.vspacing = 35
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/samples/samples.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/samples/samples.css
deleted file mode 100644
index a112673..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/samples/samples.css
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-body {
-	background-image : url(../graphics/contentpage/samples_wtr.jpg);
-}
-
-.page { min-height : 700px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#samples img, #navigation-links a#samples:hover img { background-image : url(../graphics/icons/ctool/samples48sel.gif); }
-
-/* Lay out the real content of the samples page: */
-
-.samples-group {
-	width : 750px;
-	/* To center in Moz (have to use text-align for IE) */	
-	margin : 0px auto;
-	margin-bottom : 10px;
-	text-align : left;
-	float : none;
-	clear : both;
-}
-
-.samples-group H4 { margin-top : 10px; }
-
-.sample-link { 
-	width : 360px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 10px;
-	margin-bottom : -30px;
-	vertical-align : top;
-}
-
-/* specialize the swt samples group to be spread over only 1 column */
-#swt .sample-link { 
-	width : 720px;
-}
-
-.samples-group > .sample-link {
-	float : left;
-	height : 150px;
-	vertical-align : middle;
-}
-
-
-.sample-link .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#swt .sample-link .link-label {
-	width : 600px;	
-} 
-
-.sample-link p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-#swt .sample-link .text {
-	width : 620px;	
-} 
-
-.sample-link img {
-	height : 56px;
-	width : 56px;
-	vertical-align : middle;
-}
-
-.sample-link:hover { border-right : 0px; }
-
-
-#swt .sample-link img {
-	background-image : url(../graphics/icons/obj48/samplered_obj.gif);
-}
-
-#swt .sample-link:hover img {
-	background-image : url(../graphics/icons/obj48/sampleredhov_obj.gif);
-}
-
-#workbench .sample-link img {
-	background-image : url(../graphics/icons/obj48/samplepurp_obj.gif);
-}
-
-#workbench .sample-link:hover img {
-	background-image : url(../graphics/icons/obj48/samplepurphov_obj.gif);
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/samples/swt.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/samples/swt.properties
deleted file mode 100644
index ed40020..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/samples/swt.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-
-samples.link-icon = css/graphics/icons/obj48/samplepurp_obj.gif
-samples.page-content.swt.swt-examples.link-icon = css/graphics/icons/obj48/samplered_obj.gif
-
-samples.page-content.layout.vspacing = 40
-samples.page-content.swt.layout.ncolumns = 2
-samples.page-content.swt.layout.vspacing = 30
-samples.page-content.swt.layout.hspacing = 30
-samples.page-content.workbench.layout.ncolumns = 2
-samples.page-content.workbench.layout.vspacing = 30
-samples.page-content.workbench.layout.hspacing = 30
-
-description-style-id = group-description
-samples.subtitle-id = samples/page-content/page-title
-samples.description-id = samples/page-content/page-description
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/shared.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/shared.css
deleted file mode 100644
index 0e3c6a6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/shared.css
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/* 
- * Set up general fonts, sizes and colors 
- */
-body { font-family : Arial, sans-serif; }
-
-H1, H2, H3, H4, p, a { color : #4D4D4D; }
-
-.intro-header H1 {
-	font-size : 16pt;
-	font-weight : normal;
-	color : #E5E5E5;
-}
-
-h2 {
-	font-size : 13pt;
-	font-weight : normal;
-	color : #7B8694;
-}
-
-.page-title {
-	font-size : 14pt;
-	font-weight : normal;
-	color : #8C96A2;
-	float : none;
-	clear : both;
-}
-
-.page-description { 
-	font-size : 10pt;
-	float : none;
-	clear : both;
-}
-
-H4 .div-label {
-	font-size : 10pt;
-	font-weight : bold;
-}
-
-a {
-	font-weight : bold;
-	text-decoration : none;
-	color : #4D4D4D;
-}
-
-a .link-label {
-	font-size : 10pt;
-	font-weight : normal;
-}
-
-#navigation-links a .link-label {
-	font-size : 9pt;
-	font-weight : normal;
-	color : #E5E5E5;
-}
-
-a .text {
-	font-size : 8pt;
-	font-weight : normal;
-}
-
-p .group-description {
-	font-size : 10pt;
-	font-weight : normal;
-}
-
-
-/* 
- * Set up other general properties like padding/margins
- */
-html, body { width : 100%; height : 100%; }
-
-html, body, div, h1, h4, p, a { margin : 0px; padding : 0px; }
-
-.intro-header H1 { padding-top : 10px; margin-left : 10px; }
-
-/* For regular div labels */
-#page-content div H4 {
-	padding : 10px;
-	margin-bottom : 5px;
-}
-
-/* For the main page content's div label */
-#page-content #content-header H4 {
-	padding-bottom : 10px;
-	padding-top : 0px;
-}
-
-/* special case for Mozilla's main content-header label.
-   Mozilla 1.4 needs more room at the top */
-#page-content > #content-header H4 { padding-top : 10px; }
-
-/* Needed in IE to get shift+tab to show the active image properly */
-a:active {
-	border : solid 0px;
-}
-
-a img {
-	border-width : 0;
-	background-repeat : no-repeat;
-}
-
-/*
- * to get scrollbars working in both IE and Mozilla
- */
-html,body { overflow: auto; }
-html>body { overflow: visible; }
-
-/*
- * Set up the body, decorative background, and navigation for the content 
- * pages. 
- * Note: the root page handles its own background and navigation; these
- * settings primarily apply to the content pages
- */
-body {
-	background-color : #FFFFFF;
-	background-repeat : no-repeat;
-	background-position : bottom right;
-	background-attachment : fixed;
-}
-
-#background-image {
-	width : 100%;
-	height : 164px;
-	background-image : url(graphics/contentpage/background.jpg);
-	background-repeat : no-repeat;
-	background-position : top left;	
-	position : absolute;
-	top : 0px;
-	z-index : -100;
-}
-
-#curve-image { 
-	width : 100%;
-	height : 164px;
-	position : absolute;
-	top : 0px;
-	background-image : url(graphics/contentpage/background.gif);
-	background-repeat : no-repeat;
-	background-position : top center;
-	margin : 0;
-	padding : 0;
-}
-
-.intro-header {	background-color : transparent; z-index : 100;}
-
-body, .page{
-	min-width : 770px;
-	/* since IE doesn't support min-width, try expression */
-	width:expression(document.body.clientWidth < 770? "770px": "auto" );
-	min-height : 425px;
-	height : 100%;
-	height : expression(document.body.clientHeight < 425? "425px": "100%" );
-}
-
-.page { 
-	min-height : 475px;
-	background-image : url(graphics/contentpage/background.jpg);
-	background-repeat : repeat-x;
-	background-position : top left;
-}
-
-#page-content {
-	background-repeat : no-repeat;
-	background-position : bottom right;
-	height : 70%;
-}
-
-/* 
- * Lay out the navigation links 
- * (Root page does something similar for its navigation)
- */
-#navigation-links {
-	position : relative;
-	left : 10px;
-	top : 5px;
-	height : 60;
-	width : 98%;
-}
-
-
-#navigation-links a {
-	padding-left : 5px;
-	padding-right : 5px;
-	float : left;
-	text-align : center;
-}
-
-#navigation-links a img {
-	height : 52px;
-	width : 52px;
-	vertical-align : middle;
-}
-
-#navigation-links a .link-label { display : block; margin-top : 5px;}
-
-#navigation-links a .text { display : none; }
-
-#navigation-links a:hover, 
-#navigation-links a:focus 
-#navigation-links a:active { border-right : 0px;}
-
-/* properties for each of the navigation-links  */
-#navigation-links a#overview img { background-image : url(graphics/icons/etool/overview48.gif); }
-#navigation-links a#overview:hover img,
-#navigation-links a#overview:focus img,
-#navigation-links a#overview:active img { background-image : url(graphics/icons/ctool/overview48.gif); }
-/*#navigation-links a#overview:active img { background-image : url(graphics/icons/ctool/overview48sel.gif); }*/
-
-#navigation-links a#tutorials img { background-image : url(graphics/icons/etool/tutorials48.gif); }
-#navigation-links a#tutorials:hover img,
-#navigation-links a#tutorials:active img,
-#navigation-links a#tutorials:focus img { background-image : url(graphics/icons/ctool/tutorials48.gif); }
-/*#navigation-links a#tutorials:active img { background-image : url(graphics/icons/ctool/tutorials48sel.gif); }*/
-
-#navigation-links a#samples img { background-image : url(graphics/icons/etool/samples48.gif); }
-#navigation-links a#samples:hover img,
-#navigation-links a#samples:active img,
-#navigation-links a#samples:focus img { background-image : url(graphics/icons/ctool/samples48.gif); }
-/*#navigation-links a#samples:active img { background-image : url(graphics/icons/ctool/samples48sel.gif); }*/
-
-#navigation-links a#news img { background-image : url(graphics/icons/etool/retuser48.gif); }
-#navigation-links a#news:hover img { background-image : url(graphics/icons/ctool/retuser48.gif); }
-#navigation-links a#news:active img { background-image : url(graphics/icons/ctool/retuser48sel.gif); }
-
-#navigation-links a#web img { background-image : url(graphics/icons/etool/webrsrc48.gif); }
-#navigation-links a#web:hover img { background-image : url(graphics/icons/ctool/webrsrc48.gif); }
-#navigation-links a#web:active img { background-image : url(graphics/icons/ctool/webrsrc48sel.gif); }
-
-#navigation-links a#steps img { background-image : url(graphics/icons/etool/firsteps48.gif); }
-#navigation-links a#steps:hover img { background-image : url(graphics/icons/ctool/firsteps48.gif); }
-#navigation-links a#steps:active img { background-image : url(graphics/icons/ctool/firsteps48sel.gif); }
-
-#navigation-links a#workbench { position : absolute;  right : 0px; top : -35px; text-align : right;}
-#navigation-links a#workbench .link-label { visibility : hidden; }
-#navigation-links a#workbench:hover .link-label { visibility : visible; }
-#navigation-links a#workbench .text { display : none; }
-#navigation-links a#workbench img { background-image : url(graphics/icons/etool/wb48.gif); width : 53px; height : 53px;}
-#navigation-links a#workbench:hover img,
-#navigation-links a#workbench:focus img,
-#navigation-links a#workbench:active img { background-image : url(graphics/icons/ctool/wb48.gif); }
-
-/* 
- * Lay out the page title and description 
- */
-h1, p { margin-left : 10px; } /* required in mozilla so the page description is properly indented */
-
-/* position the page content so that the page title overlays the bottom
- * of the background image, but make sure the content is always on top 
- * (using z-index) */
-#page-content {
-	float : none;
-	clear : both;
-	text-align : center;
-	margin-top : 35px;
-}
-
-.page > #page-content { margin-top : 50px; }
-
-#page-content p { 
-	padding-bottom : 15px; 
-	text-align : left; 
-	float : none;
-	clear : both;
-}
-
-#page-content #content-header H4, .page-description {
-	text-align : left;
-	margin-right : 10px;
-	float : none;
-	clear : both;
-}
-
-.page-description {
-	text-align : left;
-	margin-right : 10px;
-	float : none;
-	clear : both;
-}
-
-/*
- * Navigation Links (back, forward and home)
- */
-
-#nav-links {
-	width : 98%;
-	position : absolute;
-	left : 0px;
-	top : 65px;
-}
-
-a#back { 
-	position : absolute; 
-	top : 65px;
-	right : 20px;
-	text-align : right;  
-}
-
-a#back img {
-	background-image : url(graphics/icons/etool/back.gif); 
-	height : 56px;
-	width : 56px;
-	text-align : center;
-}
-
-a#back:hover img,
-a#back:focus img,
-a#back:active img {
-	background-image : url(graphics/icons/ctool/back.gif); 
-	height : 56px;
-	width : 56px;
-}
-
-a#forward { 
-	position : absolute; 
-	top : 65px;
-	right : -8px;
-	text-align : right;  
-}
-
-a#forward img {
-	background-image : url(graphics/icons/etool/forward.gif); 
-	height : 56px;
-	width : 56px;
-	text-align : center;
-}
-
-a#forward:hover img,
-a#forward:focus img,
-a#forward:active img {
-	background-image : url(graphics/icons/ctool/forward.gif); 
-	height : 56px;
-	width : 56px;
-}
-
-a#home { 
-	position : absolute; 
-	top : 65px;
-	right : 60px;
-	text-align : right;  
-}
-
-a#home img {
-	background-image : url(graphics/icons/etool/home.gif); 
-	height : 56px;
-	width : 56px;
-	text-align : center;
-}
-
-a#home:hover img,
-a#home:focus img,
-a#home:active img {
-	background-image : url(graphics/icons/ctool/home.gif); 
-	height : 56px;
-	width : 56px;
-}
-
-
-/* hide the link and description until users hover over the link */
-#nav-links a p .text, #nav-links a .link-label { display : none; }
-
-#nav-links a:hover .link-label,
-#nav-links a:focus .link-label,
-#nav-links a:active .link-label { display : block; width : 16em; }
-
-#nav-links a:hover p .text,
-#nav-links a:focus p .text,
-#nav-links a:active p .text {	display : block; width : 16em; }
-
-#nav-links a:hover,
-#nav-links a:focus,
-#nav-links a:active { border-right : 0px; }
-
-/*
- * Transition page css settings
- */
-
-#t-links {
-	text-align : left;
-	width : 760px;
-	/* To center in Moz (have to use text-align for IE) */	
-	margin: 0px auto;
-}
-
-#t-links a { 
-	width : 370px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 5px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-#t-links > a { vertical-align : middle; }
-
-#t-links a img {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-}
-
-#t-links a .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#t-links a p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-/* 
- * Special case for Mozilla, because the links are displayed
- * in 1 vertical column instead of 2 centered columns 
- */
-
-#t-links > a { 	width : 700px; }
-#t-links a > .link-label { width : 700px; }
-#t-links a p > .text { width : 700px; }
-
-#t-links a:hover { border-right : 5px; }
-
-
-/*** Backup Link Image ***/
-
-a#t-links img { background-image : url(graphics/icons/obj48/new_obj.gif); }
-a#t-links:hover img { background-image : url(graphics/icons/obj48/newhov_obj.gif); }
-
-a#folder_steps img { background-image : url(graphics/icons/obj48/folder_firststeps.gif); }
-a#folder_steps:hover img { background-image : url(graphics/icons/obj48/folder_firststepshov.gif); }
-
-a#folder_newweb img { background-image : url(graphics/icons/obj48/folder_newweb.gif); }
-a#folder_newweb:hover img { background-image : url(graphics/icons/obj48/folder_newwebhov.gif); }
-
-a#folder_importweb img { background-image : url(graphics/icons/obj48/folder_importweb.gif); }
-a#folder_importweb:hover img { background-image : url(graphics/icons/obj48/folder_importwebhov.gif); }
-
-a#folder_help img { background-image : url(graphics/icons/obj48/folder_help.gif); }
-a#folder_help:hover img { background-image : url(graphics/icons/obj48/folder_helphov.gif); }
-
-a#folder_overview img { background-image : url(graphics/icons/obj48/folder_overview.gif); }
-a#folder_overview:hover img { background-image : url(graphics/icons/obj48/folder_overviewhov.gif); }
-
-a#folder_advapps img { background-image : url(graphics/icons/obj48/folder_advapps.gif); }
-a#folder_advapps:hover img { background-image : url(graphics/icons/obj48/folder_advappshov.gif); }
-
-a#folder_devweb img { background-image : url(graphics/icons/obj48/folder_devweb.gif); }
-a#folder_devweb:hover img { background-image : url(graphics/icons/obj48/folder_devwebhov.gif); }
-
-a#folder_samples img { background-image : url(graphics/icons/obj48/folder_samples.gif); }
-a#folder_samples:hover img { background-image : url(graphics/icons/obj48/folder_sampleshov.gif); }
-
-a#folder_tutorials img { background-image : url(graphics/icons/obj48/folder_tutorials.gif); }
-a#folder_tutorials:hover img { background-image : url(graphics/icons/obj48/folder_tutorialshov.gif); }
-
-a#folder_web img { background-image : url(graphics/icons/obj48/folder_web.gif); }
-a#folder_web:hover img { background-image : url(graphics/icons/obj48/folder_webhov.gif); }
-
-a#folder_richreports img { background-image : url(graphics/icons/obj48/folder_richreports.gif); }
-a#folder_richreports:hover img { background-image : url(graphics/icons/obj48/folder_richreportshov.gif); }
-
-a#folder_whatsnew img { background-image : url(graphics/icons/obj48/folder_whatsnew.gif); }
-a#folder_whatsnew:hover img { background-image : url(graphics/icons/obj48/folder_whatsnewhov.gif); }
-
-a#gallery_samples img { background-image : url(graphics/icons/obj48/gallery_samples.gif); }
-a#gallery_samples:hover img { background-image : url(graphics/icons/obj48/gallery_sampleshov.gif); }
-
-a#gallery_tutorials img { background-image : url(graphics/icons/obj48/gallery_tutorials.gif); }
-a#gallery_tutorials:hover img { background-image : url(graphics/icons/obj48/gallery_tutorialshov.gif); }
-
-a#page_steps img { background-image : url(graphics/icons/obj48/page_firststeps.gif); }
-a#page_steps:hover img { background-image : url(graphics/icons/obj48/page_firststepshov.gif); }
-
-a#page_help img { background-image : url(graphics/icons/obj48/page_help.gif); }
-a#page_help:hover img { background-image : url(graphics/icons/obj48/page_helphov.gif); }
-
-a#page_overview img { background-image : url(graphics/icons/obj48/page_overview.gif); }
-a#page_overview:hover img { background-image : url(graphics/icons/obj48/page_overviewhov.gif); }
-
-a#page_web img { background-image : url(graphics/icons/obj48/page_web.gif); }
-a#page_web:hover img { background-image : url(graphics/icons/obj48/page_webhov.gif); }
-
-a#page_whatsnew img { background-image : url(graphics/icons/obj48/page_whatsnew.gif); }
-a#page_whatsnew:hover img { background-image : url(graphics/icons/obj48/page_whatsnewhov.gif); }
-
-a#epf_resource img { background-image : url(graphics/icons/obj48/epf_resource.gif); }
-a#epf_resource:hover img { background-image : url(graphics/icons/obj48/epf_resourcehov.gif); }
-
-a#epf-ov-tour img { background-image : url(graphics/icons/obj48/epf-ov-tour.gif); }
-a#epf-ov-tour:hover img { background-image : url(graphics/icons/obj48/epf-ov-tourhov.gif); }
-
-a#epf-ov-rupov img { background-image : url(graphics/icons/obj48/epf-ov-rupov.gif); }
-a#epf-ov-rupov:hover img { background-image : url(graphics/icons/obj48/epf-ov-rupovhov.gif); }
-
-a#epf-ov-method img { background-image : url(graphics/icons/obj48/epf-ov-method.gif); }
-a#epf-ov-method:hover img { background-image : url(graphics/icons/obj48/epf-ov-methodhov.gif); }
-
-a#epf-ov-process img { background-image : url(graphics/icons/obj48/epf-ov-process.gif); }
-a#epf-ov-process:hover img { background-image : url(graphics/icons/obj48/epf-ov-processhov.gif); }
-
-a#epf-ov-configpublish img { background-image : url(graphics/icons/obj48/epf-ov-configpublish.gif); }
-a#epf-ov-configpublish:hover img { background-image : url(graphics/icons/obj48/epf-ov-configpublishhov.gif); }
-
-a#epf-steps-one img { background-image : url(graphics/icons/obj48/page_firststeps.gif); }
-a#epf-steps-one:hover img { background-image : url(graphics/icons/obj48/page_firststepshov.gif); }
-
-a#epf-steps-two img { background-image : url(graphics/icons/obj48/page_firststeps.gif); }
-a#epf-steps-two:hover img { background-image : url(graphics/icons/obj48/page_firststepshov.gif); }
-
-a#epf-steps-three img { background-image : url(graphics/icons/obj48/page_firststeps.gif); }
-a#epf-steps-three:hover img { background-image : url(graphics/icons/obj48/page_firststepshov.gif); }
-
-a#epf-steps-four img { background-image : url(graphics/icons/obj48/page_firststeps.gif); }
-a#epf-steps-four:hover img { background-image : url(graphics/icons/obj48/page_firststepshov.gif); }
-
-a#epf-tut-gallery img { background-image : url(graphics/icons/obj48/gallery_tutorials.gif); }
-a#epf-tut-gallery:hover img { background-image : url(graphics/icons/obj48/gallery_tutorialshov.gif); }
-
-a#epf-tut-element img { background-image : url(graphics/icons/obj48/t_methcont_obj.gif); }
-a#epf-tut-element:hover img { background-image : url(graphics/icons/obj48/t_methconthov_obj.gif); }
-
-a#epf-tut-navigate img { background-image : url(graphics/icons/obj48/t_navui_obj.gif); }
-a#epf-tut-navigate:hover img { background-image : url(graphics/icons/obj48/t_navuihov_obj.gif); }
-
-a#epf-tut-content img { background-image : url(graphics/icons/obj48/t_remethcont_obj.gif); }
-a#epf-tut-content:hover img { background-image : url(graphics/icons/obj48/t_remethconthov_obj.gif); }
-
-a#epf-tut-process img { background-image : url(graphics/icons/obj48/t_workproc_obj.gif); }
-a#epf-tut-process:hover img { background-image : url(graphics/icons/obj48/t_workprochov_obj.gif); }
-
-a#epf-tut-pubexp img { background-image : url(graphics/icons/obj48/t_pubexp_obj.gif); }
-a#epf-tut-pubexp:hover img { background-image : url(graphics/icons/obj48/t_pubexphov_obj.gif); }
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/shared_eclipse.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/shared_eclipse.css
deleted file mode 100644
index 1a444d6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/shared_eclipse.css
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/* 
- * Set up general fonts, sizes and colors 
- */
-body { font-family : Arial, sans-serif; }
-
-H1, H2, H3, H4, p, a { color : #4D4D4D; }
-
-.intro-header H1 {
-	font-size : 16pt;
-	font-weight : normal;
-	color : #E5E5E5;
-}
-
-h2 {
-	font-size : 13pt;
-	font-weight : normal;
-	color : #7B8694;
-}
-/* For regular div labels */
-H4 .div-label {
-	font-size : 10pt;
-	font-weight : bold;
-}
-
-/* For the main page content's title */
-#content-header H4 .div-label {
-	font-size : 14pt;
-	font-weight : normal;
-	color : #8C96A2;
-	float : none;
-	clear : both;
-}
-
-.page-description { 
-	font-size : 10pt;
-	float : none;
-	clear : both;
-}
-
-a {
-	font-weight : bold;
-	text-decoration : none;
-	color : #4D4D4D;
-}
-
-a .link-label {
-	font-size : 10pt;
-	font-weight : normal;
-}
-
-#navigation-links a .link-label {
-	font-size : 9pt;
-	font-weight : normal;
-	color : #E5E5E5;
-}
-
-a .text {
-	font-size : 8pt;
-	font-weight : normal;
-}
-
-p .group-description {
-	font-size : 10pt;
-	font-weight : normal;
-}
-
-
-/* 
- * Set up other general properties like padding/margins
- */
-html, body { width : 100%; height : 100%; }
-
-html, body, div, h1, h4, p, a { margin : 0px; padding : 0px; }
-
-.intro-header H1 { padding-top : 10px; margin-left : 10px; }
-
-/* For regular div labels */
-#page-content div H4 {
-	padding : 10px;
-	padding-bottom : 0px;
-}
-
-/* For the main page content's div label */
-#page-content #content-header H4 {
-	padding-bottom : 10px;
-	padding-top : 0px;
-}
-
-/* special case for Mozilla's main content-header label.
-   Mozilla 1.4 needs more room at the top */
-#page-content > #content-header H4 { padding-top : 10px; }
-
-/* Needed in IE to get shift+tab to show the active image properly */
-a:active {
-	border : solid 0px;
-}
-
-a img {
-	border-width : 0;
-	background-repeat : no-repeat;
-}
-
-/*
- * to get scrollbars working in both IE and Mozilla
- */
-html,body { overflow: auto; }
-html>body { overflow: visible; }
-
-/*
- * Set up the body, decorative background, and navigation for the content 
- * pages. 
- * Note: the root page handles its own background and navigation; these
- * settings primarily apply to the content pages
- */
-body {
-	background-color : #FFFFFF;
-	background-repeat : no-repeat;
-	background-position : bottom right;
-}
-
-#background-image {
-	width : 100%;
-	min-width : 770px;
-	height : 164px;
-	background-image : url(graphics/contentpage/background.jpg);
-	background-repeat : no-repeat;
-	background-position : top left;	
-	position : absolute;
-	top : 0px;
-	z-index : -100;
-}
-
-#curve-image { 
-	width : 100%;
-	height : 164px;
-	position : absolute;
-	top : 0px;
-	background-image : url(graphics/contentpage/background.gif);
-	background-repeat : no-repeat;
-	background-position : top center;
-	margin : 0;
-	padding : 0;
-}
-
-.intro-header {	background-color : transparent; z-index : 100;}
-
-body, .page{
-	min-width : 770px;
-	/* since IE doesn't support min-width, try expression */
-	width:expression(document.body.clientWidth < 770? "770px": "auto" );
-	min-height : 425px;
-	height : 100%;
-	height : expression(document.body.clientHeight < 425? "425px": "100%" );
-}
-
-.page { 
-	background-image : url(graphics/contentpage/wordmark.gif);
-	background-repeat : no-repeat;
-	background-position : bottom left;
-	min-height : 475px;
-}
-
-#page-content {
-	background-repeat : no-repeat;
-	background-position : bottom right;
-	height : 70%;
-}
-
-/* 
- * Lay out the navigation links 
- * (Root page does something similar for its navigation)
- */
-#navigation-links {
-	position : relative;
-	left : 10px;
-	top : 5px;
-	height : 60;
-	width : 98%;
-}
-
-#navigation-links a {
-	padding-left : 5px;
-	padding-right : 5px;
-	float : left;
-	text-align : center;
-}
-
-#navigation-links a img {
-	height : 52px;
-	width : 52px;
-	vertical-align : middle;
-}
-
-#navigation-links a .link-label { display : block; margin-top : 5px;}
-
-#navigation-links a .text { display : none; }
-
-#navigation-links a:hover, 
-#navigation-links a:focus 
-#navigation-links a:active { border-right : 0px;}
-
-/* properties for each of the navigation-links  */
-#navigation-links a#overview img { background-image : url(graphics/icons/etool/overview48.gif); }
-#navigation-links a#overview:hover img,
-#navigation-links a#overview:focus img,
-#navigation-links a#overview:active img { background-image : url(graphics/icons/ctool/overview48.gif); }
-/*#navigation-links a#overview:active img { background-image : url(graphics/icons/ctool/overview48sel.gif); }*/
-
-#navigation-links a#tutorials img { background-image : url(graphics/icons/etool/tutorials48.gif); }
-#navigation-links a#tutorials:hover img,
-#navigation-links a#tutorials:active img,
-#navigation-links a#tutorials:focus img { background-image : url(graphics/icons/ctool/tutorials48.gif); }
-/*#navigation-links a#tutorials:active img { background-image : url(graphics/icons/ctool/tutorials48sel.gif); }*/
-
-#navigation-links a#samples img { background-image : url(graphics/icons/etool/samples48.gif); }
-#navigation-links a#samples:hover img,
-#navigation-links a#samples:active img,
-#navigation-links a#samples:focus img { background-image : url(graphics/icons/ctool/samples48.gif); }
-/*#navigation-links a#samples:active img { background-image : url(graphics/icons/ctool/samples48sel.gif); }*/
-
-#navigation-links a#news img { background-image : url(graphics/icons/etool/whatsnew48.gif); }
-#navigation-links a#news:hover img,
-#navigation-links a#news:focus img,
-#navigation-links a#news:active img { background-image : url(graphics/icons/ctool/whatsnew48.gif); }
-/*#navigation-links a#news:active img { background-image : url(graphics/icons/ctool/whatsnew48sel.gif); }*/
-
-#navigation-links a#workbench { position : absolute;  right : 0px; top : -35px; text-align : right;}
-#navigation-links a#workbench .text { display : none; }
-#navigation-links a#workbench img { background-image : url(graphics/icons/etool/wb48.gif); width : 53px; height : 53px;}
-#navigation-links a#workbench:hover img,
-#navigation-links a#workbench:focus img,
-#navigation-links a#workbench:active img { background-image : url(graphics/icons/ctool/wb48.gif); }
-
-/* 
- * Lay out the page title and description 
- */
-h1, p { margin-left : 10px; } /* required in mozilla so the page description is properly indented */
-
-/* position the page content so that the page title overlays the bottom
- * of the background image, but make sure the content is always on top 
- * (using z-index) */
-#page-content {
-	float : none;
-	clear : both;
-	text-align : center;
-	margin-top : 35px;
-}
-
-.page > #page-content { margin-top : 50px; }
-
-#page-content p { 
-	padding-bottom : 15px; 
-	text-align : left; 
-	float : none;
-	clear : both;
-}
-
-#page-content #content-header H4, .page-description {
-	text-align : left;
-	margin-right : 10px;
-	float : none;
-	clear : both;
-}
-
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/standby_root.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/standby_root.css
deleted file mode 100644
index 6bd5218..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/standby_root.css
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/* 
- * Set up general font colours, sizes, etc.  Some of these will override
- * settings from the shared CSS 
- */
-.intro-header H1 {
-	font-size : 15pt;
-}
-
-#page-links a .link-label, #action-links a .link-label {
-	font-size : 10pt;
-	font-weight : 600;
-	color : #E5E5E5;
-}
-
-#page-links a p .text, #action-links a p .text {
-	font-size : 10pt;
-	font-weight : 500;
-	color : #E5E5E5;
-}
-
-/*
- * Set up the content for the standby page.
- */
-body {
-	min-width : 230px;
-	/* since IE doesn't support min-width, use expression */
-	width:expression(document.body.clientWidth < 230? "230px": "auto" );
-	background-image : url(graphics/rootpage/background.jpg);
-	background-repeat : no-repeat;
-	background-position : top left;
-	background-color : #7169D1;
-}
-
-.page { 
-	background-image : url(graphics/rootpage/brandmark.gif);
-	background-repeat : no-repeat;
-	background-position : bottom left;
-	min-width : 230px;
-	/* since IE doesn't support min-width, use expression */
-	width:expression(document.body.clientWidth < 230? "230px": "auto" );
- 	min-height : 610px;
-	height : 100%;
-	height : expression(document.body.clientHeight < 450? "450px": "100%" );
-}
-
-/* 
- * Set up the navigation bar.  It should be centered in the middle
- * of the page
- */
-
-#links-background { 
-	width : 100%; 
- 	margin-top : 10%; 
-	margin-bottom : auto;
-	text-align : center;
-}
-
-#page-links a {
-	display : block;
-	width : 220px;
-	text-align : left; 
-	margin-left : auto;
-	margin-right : auto;
-	margin-top : 0px;
-	vertical-align : top;
-}
-#page-links a span, #page-links a p {
-	display : block;
-	width : 160px;
-	margin : 0px;
-	padding : 0px;
-}
-
-#page-links a .link-label {
-	position : relative;
-	left : 60px;
-	top : -50px;
-}
-
-#page-links a p .text {
-	position : relative;
-	left : 60px;
-	top : -50px;
-
-}
-
-#page-links a img {
-	height : 52px;
-	width : 52px;
-	vertical-align : middle;
-}
-
-#page-links a:hover,
-#page-links a:focus,
-#page-links a:active  { border : 0px; }
-
-#page-links a:hover p,
-#page-links a:focus p,
-#page-links a:active p  { margin : 0px; padding : 0px; }
-
-/* properties for each of the page-links  */
-a#overview img { background-image : url(graphics/icons/etool/overview48.gif); }
-a#overview:hover img,
-a#overview:focus img,
-a#overview:active img { background-image : url(graphics/icons/ctool/overview48.gif); }
-a#steps img { background-image : url(graphics/icons/etool/firsteps48.gif); }a#steps:hover img,a#steps:focus img,a#steps:active img { background-image : url(graphics/icons/ctool/firsteps48.gif); }
-a#tutorials img { background-image : url(graphics/icons/etool/tutorials48.gif); }
-a#tutorials:hover img,
-a#tutorials:focus img,
-a#tutorials:active img { background-image : url(graphics/icons/ctool/tutorials48.gif); }
-a#web img { background-image : url(graphics/icons/etool/webrsrc48.gif); }a#web:hover img,a#web:focus img,a#web:active img { background-image : url(graphics/icons/ctool/webrsrc48.gif); }
-a#samples img { background-image : url(graphics/icons/etool/samples48.gif); }
-a#samples:hover img,
-a#samples:focus img,
-a#samples:active img { background-image : url(graphics/icons/ctool/samples48.gif); }
-
-a#news img { background-image : url(graphics/icons/etool/whatsnew48.gif); }
-a#news:hover img,
-a#news:focus img,
-a#news:active img { background-image : url(graphics/icons/ctool/whatsnew48.gif); }
-
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/standby_swt.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/standby_swt.properties
deleted file mode 100644
index ac7231a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/standby_swt.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-standby.links-background.page-links.overview.link-icon = css/graphics/icons/etool/overview72.gif
-standby.links-background.page-links.steps.link-icon= css/graphics/icons/etool/firsteps72.gif
-standby.links-background.page-links.tutorials.link-icon = css/graphics/icons/etool/tutorials72.gif
-standby.links-background.page-links.web.link-icon = css/graphics/icons/etool/webrsrc72.gif
-
-
-standby.links-background.page-links.overview.hover-icon = css/graphics/icons/ctool/overview72.gif
-standby.links-background.page-links.steps.hover-icon = css/graphics/icons/ctool/firsteps72.gif
-standby.links-background.page-links.tutorials.hover-icon = css/graphics/icons/ctool/tutorials72.gif
-standby.links-background.page-links.web.hover-icon = css/graphics/icons/ctool/webrsrc72.gif
-
-
-standby.links-background.page-links.layout.vspacing = 30
-standby.layout.vspacing = 35
-standby.show-link-description = false
-standby.show-home-page-navigation = false
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour-placeholder.html b/1.5/plugins/org.eclipse.epf.ui.intro/css/tour-placeholder.html
deleted file mode 100644
index 2244bf4..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour-placeholder.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<html>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<head>
-<title>Eclipse Process Framework Composer Tour</title>
-</head>
-<body>
-<h3>Eclipse Process Framework Composer Tour</h3>
-<br/>
-<h5> Flash based multimedia content, to be produced</h5>
-</body>
-</html>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour-swt.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/tour-swt.properties
deleted file mode 100644
index 5acfe3a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour-swt.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-overview.page-content.overview-links.pde.link-icon = css/new_graphics/obj_48/plugin_obj.gif
-
-tutorials.page-content.pde.layout.ncolumns = 2
-tutorials.page-content.pde.rcp.link-icon = css/new_graphics/obj_48/rcpapp_obj.gif
-tutorials.page-content.pde.pde-hello-world.link-icon = css/new_graphics/obj_48/plugin_obj.gif
-tutorials.page-content.pde.features.link-icon = css/new_graphics/obj_48/features_obj.gif
-
-news.layout.ncolumns = 2
-overview.layout.ncolumns = 2
-overview.layout.link-vspacing = 40
-firststeps.layout.ncolumns = 1
-tutorials.page-content.layout.ncolumns = 2
-samples.page-content.layout.ncolumns = 2
-webres.page-content.layout.ncolumns = 1
-
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/tour.css
deleted file mode 100644
index e1ea65d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-body {
-	background-image : url(graphics/contentpage/overview_wtr.jpg);
-}
-
-.page { min-height : 700px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#overview img, #navigation-links a#overview:hover img { background-image : url(graphics/icons/ctool/overview48sel.gif); }
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour.html b/1.5/plugins/org.eclipse.epf.ui.intro/css/tour.html
deleted file mode 100644
index d8cadc9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/tour.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<div id="welcome-banner">
- 	<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" WIDTH="780" HEIGHT="425" id="tour" ALIGN="">
-	<PARAM NAME=movie VALUE="css/tour/tour.swf">
- 	<PARAM NAME=quality VALUE=high>
- 	<PARAM NAME=bgcolor VALUE=#FFFFFF>
- 	<PARAM NAME=FlashVars VALUE="tourpath=css/tour">
- 	<EMBED src="css/tour/tour.swf" flashvars="tourpath=css/tour" quality=high bgcolor=#FFFFFF  WIDTH="780" HEIGHT="425" NAME="tour" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>
-	</OBJECT>
-</div>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/tutorials/swt.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/tutorials/swt.properties
deleted file mode 100644
index 72b7879..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/tutorials/swt.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-tutorials.layout.ncolumns = 2
-tutorials.page-content.layout.vspacing = 40
-
-tutorials.page-content.tutorials-links.layout.ncolumns = 2
-tutorials.page-content.tutorials-links.layout.vspacing = 35
-
-tutorials.subtitle-id = tutorials/page-content/page-title
-tutorials.description-id = tutorials/page-content/page-description
-
-tutorials.page-content.tutorials-links.epf-tut-navigate.link-icon = css/graphics/icons/obj48/t_navui_obj.gif
-tutorials.page-content.tutorials-links.epf-tut-process.link-icon = css/graphics/icons/obj48/t_workproc_obj.gif
-tutorials.page-content.tutorials-links.epf-tut-element.link-icon = css/graphics/icons/obj48/t_methcont_obj.gif
-tutorials.page-content.tutorials-links.epf-tut-pubexp.link-icon = css/graphics/icons/obj48/t_pubexp_obj.gif
-tutorials.page-content.tutorials-links.epf-tut-content.link-icon = css/graphics/icons/obj48/t_remethcont_obj.gif
-#overview.page-content.overview-links.basics.link-icon = css/graphics/icons/obj48/wbbasics_obj.gif
-#overview.page-content.overview-links.team.link-icon = css/graphics/icons/obj48/teamsup_obj.gif
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/tutorials/tutorials.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/tutorials/tutorials.css
deleted file mode 100644
index 04a94b1..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/tutorials/tutorials.css
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-body {
-	background-image : url(../graphics/contentpage/tutorials_wtr.jpg);
-}
-
-.page { min-height : 700px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#tutorials img, #navigation-links a#tutorials:hover img { background-image : url(../graphics/icons/ctool/tutorials48sel.gif); }
-
-/* 
- * Set up the content of the tutorials page into two
- * columns that are centered in the page
- */
-
-
-#tutorials-links {	text-align : left;	width : 760px;	/* To center in Moz (have to use text-align for IE) */	margin : 0px auto;}#tutorials-links a { 	width : 370px;	text-align : left; 	margin-left : 5px;	margin-right : 5px;	margin-top : 5px;	margin-bottom : -20px;	vertical-align : top;}#tutorials-links > a { vertical-align : middle; }#tutorials-links a img {	height : 57px;	width : 57px;	vertical-align : middle;}	#tutorials-links a .link-label {	display : block;	width : 300px;	position : relative;	top : -50px;	left : 60px;}#tutorials-links a p .text {	display : block;	width : 300px;	position : relative;	top : -45px;	left : 53px;}/* Special case for Mozilla, because the links are displayed   in 1 vertical column instead of 2 centered columns */#tutorials-links > a { 	width : 700px; }#tutorials-links a > .link-label { width : 700px; }#tutorials-links a p > .text { width : 700px; }#tutorials-links a:hover { border-right : 5px; }a#basics img { background-image : url(../graphics/icons/obj48/wbbasics_obj.gif); }a#basics:hover img { background-image : url(../graphics/icons/obj48/wbbasicshov_obj.gif); }a#team img { background-image : url(../graphics/icons/obj48/teamsup_obj.gif); }a#team:hover img { background-image : url(../graphics/icons/obj48/teamsuphov_obj.gif); }
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/uma_hump.gif b/1.5/plugins/org.eclipse.epf.ui.intro/css/uma_hump.gif
deleted file mode 100644
index 2a30fb0..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/uma_hump.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/webresources/webresources.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/webresources/webresources.css
deleted file mode 100644
index 523a795..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/webresources/webresources.css
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-/*
- * webresources.css is a template for the group specific css settings
- */
- 
-/*
- * background watermark - group specific
- */
-
-body {
-	background-image : url(graphics/contentpage/webrsrc_wtr.jpg);
-}
-
-.page { min-height : 700px; }
-
-/*
- * show the "selected" image for this page - This is group specific
- */
-
-#navigation-links a#web img, #navigation-links a#web:hover img { background-image : url(../graphics/icons/ctool/webrsrc48sel.gif); }
-
-/* 
- * Set up the Overview links to be displayed in two columns
- * that are centered in the middle of the page.
- */
-
-#web-links {	text-align : left;	width : 760px;	/* To center in Moz (have to use text-align for IE) */	margin : 0px auto;}
-#web-links a { 	width : 370px;	text-align : left; 	margin-left : 5px;	margin-right : 5px;	margin-top : 5px;	margin-bottom : -20px;	vertical-align : top;}
-#web-links > a { vertical-align : middle; }
-#web-links a img {	height : 57px;	width : 57px;	vertical-align : middle;}	
-#web-links a .link-label {	display : block;	width : 300px;	position : relative;	top : -50px;	left : 60px;}
-#web-links a p .text {	display : block;	width : 300px;	position : relative;	top : -45px;	left : 53px;}
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#web-links > a { 	width : 700px; }
-#web-links a > .link-label { width : 700px; }
-#web-links a p > .text { width : 700px; }
-
-#web-links a:hover { border-right : 5px; }
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/webresources/webresources.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/webresources/webresources.properties
deleted file mode 100644
index 54abb9b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/webresources/webresources.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-web.layout.ncolumns = 2
-web.page-content.layout.vspacing = 40
-
-web.page-content.web-links.layout.ncolumns = 2
-web.page-content.web-links.layout.vspacing = 35
-
-web.subtitle-id = web/page-content/page-title
-web.description-id = web/page-content/page-description
-
-web.page-content.web-links.epf_resource.link-icon = css/graphics/icons/obj48/epf_resource.gif
-
-#news.new-and-noteworthy.link-icon = css/graphics/icons/obj48/new_obj.gif
-#news.migration.link-icon = css/graphics/icons/obj48/migrate_obj.gif
-#news.updates.link-icon = css/graphics/icons/obj48/updates_obj.gif
-#news.eclipse.link-icon = css/graphics/icons/obj48/community_obj.gif
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/whatsnew/swt.properties b/1.5/plugins/org.eclipse.epf.ui.intro/css/whatsnew/swt.properties
deleted file mode 100644
index 306ddb7..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/whatsnew/swt.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-
-news.page-content.news-links.layout.ncolumns = 2
-news.page-content.news-links.layout.vspacing = 30
-
-news.page-content.news-links.new-and-noteworthy.link-icon = css/graphics/icons/obj48/new_obj.gif
-news.page-content.news-links.migration.link-icon = css/graphics/icons/obj48/migrate_obj.gif
-news.page-content.news-links.updates.link-icon = css/graphics/icons/obj48/updates_obj.gif
-news.page-content.news-links.eclipse.link-icon = css/graphics/icons/obj48/community_obj.gif
-
-news.page-content.noteworthy-links.layout.ncolumns = 2
-news.page-content.noteworthy-links.layout.vspacing = 15 
-news.page-content.news-links.layout.vspacing = 15 
-news.page-content.layout.vspacing = 40 
-
-news.link-icon = css/graphics/icons/obj48/new_obj.gif
-
-news.subtitle-id = news/page-content/page-title
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/css/whatsnew/whatsnew.css b/1.5/plugins/org.eclipse.epf.ui.intro/css/whatsnew/whatsnew.css
deleted file mode 100644
index 605360a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/css/whatsnew/whatsnew.css
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial implementation
- */
-
-body {
-	background-image : url(../graphics/contentpage/whatsnew_wtr.jpg);
-}
-
-.page { min-height : 500px; }
-
-/* show the "selected" image for this page */
-#navigation-links a#news img, #navigation-links a#news:hover img { background-image : url(../graphics/icons/ctool/whatsnew48sel.gif); }
-
-/* 
- * Set up the content of the Whats New page to be displayed in 
- * two columns that are centered in the middle of the page.
- */
-
-#noteworthy-links {
-	text-align : left;
-	width : 760px;
-	/* To center in Moz (have to use text-align for IE) */	
-	margin: 0px auto;
-}
-
-#noteworthy-links a { 
-	width : 370px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 5px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-#noteworthy-links > a { vertical-align : middle; }
-
-#noteworthy-links a img {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-}
-
-#noteworthy-links a .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#noteworthy-links a p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#noteworthy-links > a { width : 700px; }
-#noteworthy-links a > .link-label { width : 700px; }
-#noteworthy-links a p > .text { width : 700px; }
-
-#noteworthy-links a:hover { border-right : 5px; }
-
-#noteworthy-links a img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
-#noteworthy-links a:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
-
-
-#news-links {
-	text-align : left;
-	width : 760px;
-	/* To center in Moz (have to use text-align for IE) */	
-	margin: 0px auto;
-}
-
-#news-links a { 
-	width : 370px;
-	text-align : left; 
-	margin-left : 5px;
-	margin-right : 5px;
-	margin-top : 5px;
-	margin-bottom : -20px;
-	vertical-align : top;
-}
-
-#news-links > a { vertical-align : middle; }
-
-#news-links a img {
-	height : 57px;
-	width : 57px;
-	vertical-align : middle;
-}
-
-#news-links a .link-label {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -50px;
-	left : 60px;
-}
-
-#news-links a p .text {
-	display : block;
-	width : 300px;
-	position : relative;
-	top : -45px;
-	left : 53px;
-}
-
-/* Special case for Mozilla, because the links are displayed
-   in 1 vertical column instead of 2 centered columns */
-#news-links > a { 	width : 700px; }
-#news-links a > .link-label { width : 700px; }
-#news-links a p > .text { width : 700px; }
-
-#news-links a:hover { border-right : 5px; }
-
-a#new-and-noteworthy img { background-image : url(../graphics/icons/obj48/new_obj.gif); }
-a#new-and-noteworthy:hover img { background-image : url(../graphics/icons/obj48/newhov_obj.gif); }
-
-a#migration img { background-image : url(../graphics/icons/obj48/migrate_obj.gif); }
-a#migration:hover img { background-image : url(../graphics/icons/obj48/migratehov_obj.gif); }
-
-a#updates img { background-image : url(../graphics/icons/obj48/updates_obj.gif); }
-a#updates:hover img { background-image : url(../graphics/icons/obj48/updateshov_obj.gif); }
-
-a#eclipse img { background-image : url(../graphics/icons/obj48/community_obj.gif); }
-a#eclipse:hover img { background-image : url(../graphics/icons/obj48/communityhov_obj.gif); }
-
-
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/help/book.xml b/1.5/plugins/org.eclipse.epf.ui.intro/help/book.xml
deleted file mode 100644
index acaa0a6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/help/book.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<toc label="EPF Composer Help Page"  topic="html/book.html">
-	<topic label="EPF Overview" href="html/overview.html"/>
-	<topic label="EPF Tutorial" href="html/tutorial3.html"/>
-</toc>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/icons/full/obj16/product.gif b/1.5/plugins/org.eclipse.epf.ui.intro/icons/full/obj16/product.gif
deleted file mode 100644
index bdc2912..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/icons/full/obj16/product.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/introContent.xml b/1.5/plugins/org.eclipse.epf.ui.intro/introContent.xml
deleted file mode 100644
index ce6291d..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/introContent.xml
+++ /dev/null
@@ -1,358 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-<introContent>
-
-    <page alt-style="css/root_swt.properties" style="css/root.css" id="root" style-id="page">
-        <title style-id="intro-header">Eclipse Process Framework Composer</title>
-        <group id="links-background">
-            <group id="page-links">
-                <link label="Overview" url="http://org.eclipse.ui.intro/showPage?id=overview" id="overview" style-id="left">
-                    <text>Find out what Eclipse Process Framework Composer is all about</text>
-                </link>
-                <link label="Tutorials" url="http://org.eclipse.ui.intro/showPage?id=tutorials" id="tutorials" style-id="left">
-                    <text>Let us guide you through Eclipse Process Framework Composer tutorials</text>
-                </link>
-                <!-- First Steps -->
-				<link label="First Steps" url="http://org.eclipse.ui.intro/showPage?id=steps" id="steps" style-id="left">
-					<text>Start working on your own method plug-in.</text>
-				</link>
-                <!-- Web Resources -->
-				<link label="Web Resources" url="http://org.eclipse.ui.intro/showPage?id=web" id="web" style-id="right">
-					<text>Find information on the web</text>
-				</link>              
-            </group>
-        </group>
-        <group id="action-links">
-            <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
-                <text>Go to the workbench</text>
-            </link>
-        </group>
-    </page>
-
-    <page alt-style="css/standby_swt.properties" style="css/standby_root.css" id="standby" style-id="page">
-        <title style-id="intro-header">Eclipse Process Framework Composer</title>
-        <group id="links-background">
-            <group id="page-links">
-                <link label="Overview" url="http://org.eclipse.ui.intro/showPage?id=overview&amp;standby=false" id="overview" style-id="left">
-                    <text>Find out what Eclipse Process Framework Composer is all about</text>
-                </link>
-                <link label="Tutorials" url="http://org.eclipse.ui.intro/showPage?id=tutorials&amp;standby=false" id="tutorials" style-id="left">
-                    <text>Let us guide you through Eclipse Process Framework Composer tutorials</text>
-                </link>
-				<link label="First Steps" url="http://org.eclipse.ui.intro/showPage?id=steps&amp;standby=false" id="steps" style-id="left">
-					<text>Start working on your own method plug-in</text>
-				</link>
-				<link label="Web Resources" url="http://org.eclipse.ui.intro/showPage?id=web&amp;standby=false" id="web" style-id="right">
-					<text>Find information on the web</text>
-				</link>
-            </group>
-        </group>
-    </page>
-
-    <page style="css/overview/overview.css" alt-style="css/overview/swt.properties" id="overview" style-id="page">
-        <title style-id="intro-header">Eclipse Process Framework Composer</title>
-        <group id="background-image" filteredFrom="swt"/>
-        <group id="curve-image" filteredFrom="swt"/>
-        <group id="navigation-links" filteredFrom="swt">
-            <group id="page-links">
-                <link label="Overview" url="http://org.eclipse.ui.intro/showPage?id=overview" id="overview" style-id="left">
-                    <text>Find out what Eclipse Process Framework Composer is all about</text>
-                </link>
-                <link label="Tutorials" url="http://org.eclipse.ui.intro/showPage?id=tutorials" id="tutorials" style-id="left">
-                    <text>Let us guide you through Eclipse Process Framework Composer end-to-end tutorials</text>
-                </link>
-                <link label="First Steps" url="http://org.eclipse.ui.intro/showPage?id=steps" id="steps" style-id="left">
-                    <text>Start working on your own method plug-in</text>
-                </link>
-                <link label="Web Resources" url="http://org.eclipse.ui.intro/showPage?id=web" id="web" style-id="left">
-                    <text>Find out more information on the web</text>
-                </link>
-            </group>
-            <group id="action-links">
-                <link url="http://org.eclipse.ui.intro/switchToLaunchBar" label="Workbench" id="workbench">
-                    <text>Go to the workbench</text>
-                </link>
-            </group>
-        </group>
-        
-        <group id="page-content">
-            <text style-id="page-title" id="page-title" filteredFrom="swt">OVERVIEW</text>
-            <text style-id="page-title" id="page-title" filteredFrom="html">OVERVIEW</text>
-            <text style-id="page-description" id="page-description">Welcome! Take a few minutes to become familiar with EPF Composer.</text>
-            <group id="overview-links">
-                <anchor id="beginAnchor"/>       
-				<link 
-					label="Eclipse Process Framework Composer Overview" 
-					url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/overview/a_product_overview.html&amp;embedTarget=page-content"   
-					id="epf-ov-rupov">
-                    <text>Read about Eclipse Process Framework Composer's purpose and its key concepts.</text>
-                </link>
-                <link 
-                	label="Methods: The reusable building blocks" 
-                	url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/overview/a_method_content_authoring_overview.html&amp;embedTarget=page-content"   
-                	id="epf-ov-method">
-                    <text>Read about the role and representation of method content elements in EPF Composer.</text>
-                </link>            
-                <link 
-                	label="Authoring Processes"
-                	url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/overview/a_process_authoring_overview.html&amp;embedTarget=page-content" 
-                	id="epf-ov-process">
-                    <text>Read about the role and representation of processes in EPF Composer.</text>
-                </link>
-                <link 
-                	label="Configuration and Publishing" 
-              		url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/overview/a_method_configurations_overview.html&amp;embedTarget=page-content"  
-                	id="epf-ov-configpublish">
-                    <text>Read about configuring and publishing method content and processes in EPF Composer.</text>
-                </link>
-                <group id="step-links">
-            		<anchor id="beginAnchor"/>
-            		<anchor id="endAnchor"/>
-            	</group>
-            </group>
-        </group>
-    </page>
-    
-    <page style="css/tour.css" alt-style="css/tour-swt.properties" id="epf-tour" style-id="page">
-		<title style-id="intro-header">Eclipse Process Framework Composer</title>
-		<group id="background-image" filteredFrom="swt"/>
-		<include path="overview/navigation-links"/>
-		<group id="page-content">
-			<text style-id="page-title" id="page-title">Eclipse Process Framework Composer TOUR</text>
-			<html id="epf-tour" src="css/tour-placeholder.html" type="inline">
-			</html>	
-		</group>
-	</page>
-	
-	<page style="css/tour.css" alt-style="css/tour-swt.properties" id="epf-overview" style-id="page">
-		<title style-id="intro-header">Eclipse Process Framework Composer</title>
-		<group id="background-image" filteredFrom="swt"/>
-		<include path="overview/navigation-links"/>
-		<group id="page-content">
-			<text style-id="page-title" id="page-title">Eclipse Process Framework Composer Overview</text>
-			<html id="epf-overview" src="css/product_overview.html" type="inline">
-			</html>	
-		</group>
-	</page>
-	
-	<page style="css/tour.css" alt-style="css/tour-swt.properties" id="epf-methods" style-id="page">
-		<title style-id="intro-header">Eclipse Process Framework Composer</title>
-		<group id="background-image" filteredFrom="swt"/>
-		<include path="overview/navigation-links"/>
-		<group id="page-content">
-			<text style-id="page-title" id="page-title">Methods: The reusable building blocks</text>
-			<html id="epf-methods" src="css/method_authoring_overview.html" type="inline">
-			</html>	
-		</group>
-	</page>
-	
-	<page style="css/tour.css" alt-style="css/tour-swt.properties" id="epf-processes" style-id="page">
-		<title style-id="intro-header">Eclipse Process Framework Composer</title>
-		<group id="background-image" filteredFrom="swt"/>
-		<include path="overview/navigation-links"/>
-		<group id="page-content">
-			<text style-id="page-title" id="page-title">Authoring Processes</text>
-			<html id="epf-processes" src="css/process_authoring_overivew.html" type="inline">
-			</html>	
-		</group>
-	</page>
-	
-	<page style="css/tour.css" alt-style="css/tour-swt.properties" id="epf-configpublish" style-id="page">
-		<title style-id="intro-header">Eclipse Process Framework Composer</title>
-		<group id="background-image" filteredFrom="swt"/>
-		<include path="overview/navigation-links"/>
-		<group id="page-content">
-			<text style-id="page-title" id="page-title">Configuration and Publishing</text>
-			<html id="epf-processes" src="css/publishing.html" type="inline">
-			</html>	
-		</group>
-	</page>
-	
-	<!-- FIRST STEPS SCAFFOLDING -->
-	<page 
-		style="css/firststeps/firststeps.css" 
-		alt-style="css/firststeps/firststeps.properties" 
-		id="steps" 
-		style-id="page">
-		<title style-id="intro-header">Eclipse Process Framework Composer</title>
-		<group id="background-image" filteredFrom="swt"/>
-		<group id="curve-image" filteredFrom="swt"/>
-		<include path="overview/navigation-links"/>
-		<group id="page-content">
-			<text style-id="page-title" id="page-title">FIRST STEPS</text>
-			<text style-id="page-description" id="page-description">Start working on your own method plug-in.</text>
-			<group id="steps-links">               
-			    <anchor id="beginAnchor"/>
-			    <link label="Create your own Method Plug-in" url="http://org.eclipse.ui.intro/openCheatsheetView?input=org.eclipse.epf.authoring.ui.cheatsheets.createmethodplugin&amp;toggle=true" id="epf-steps-two">
-                    <text>Start building a method plug-in using a wizard.</text>
-                </link>
-                <link label="Create your own Method Configuration" url="http://org.eclipse.ui.intro/openCheatsheetView?input=org.eclipse.epf.authoring.ui.cheatsheets.createmethodconfiguration&amp;toggle=true" id="epf-steps-four">
-                    <text>This cheatsheet guides you though the steps of creating your own method configuration.</text>
-                </link>
-                <link label="Add new Method Content such as Roles, Task" url="http://org.eclipse.ui.intro/openCheatsheetView?input=org.eclipse.epf.authoring.ui.cheatsheets.addnewmethodcontent&amp;toggle=true" id="epf-steps-one">
-                    <text>This cheatsheet guides you though the steps of creating your own method content.</text>
-                </link>
-                <link label="Create a Process" url="http://org.eclipse.ui.intro/openCheatsheetView?input=org.eclipse.epf.authoring.ui.cheatsheets.createaprocess&amp;toggle=true" id="epf-steps-three">
-                    <text>This cheatsheet takes you through the steps necessary to create a process.</text>
-                </link>  
-				<group id="step-links">
-					<anchor id="beginAnchor"/>
-            		<anchor id="endAnchor"/>
-				</group>
-		   	</group>
-		</group>
-	</page>
-	
-    <page style="css/tutorials/tutorials.css" alt-style="css/tutorials/swt.properties" id="tutorials" style-id="page">
-        <title style-id="intro-header">Eclipse Process Framework Composer</title>
-        <group id="background-image" filteredFrom="swt"/>
-        <group id="curve-image" filteredFrom="swt"/>
-        <include path="overview/navigation-links"/>
-        <group id="page-content">
-            <text style-id="page-title" id="page-title">TUTORIALS</text>
-            <text style-id="page-description" id="page-description">Learn how you can use Eclipse Process Framework Composer to deliver practical, customized, and consistent process guidance to your project team.</text>
-			<group id="tutorials-links">               
-			    <anchor id="beginAnchor"/>
-				<link 
-					label="Explore the user interface" 
-					url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/tutorials/tut1_intro.htm&amp;" 
-					id="epf-tut-navigate"
-					class-id="left">
-                    <text>Learn to navigate through the user interface: perspectives, views, and search.</text>
-                </link>
-                <link 
-                	label="Working with processes" 
-                	url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/tutorials/tut5_intro.htm&amp;" 
-                	id="epf-tut-process">
-                    <text>Learn how to create and reuse capability patterns and delivery processes.</text>
-                </link>
-                <link 
-                	label="Create method content " 
-                	url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/tutorials/tut2_intro.htm&amp;" 
-                	id="epf-tut-element"
-                	class-id="left">
-                    <text>Learn how to use the editors to create roles, tasks, work products and guidance.</text>
-                </link>
-                <link 
-                	label="Publishing and Exporting" 
-                	url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/tutorials/tut4_intro.htm&amp;" 
-                	id="epf-tut-pubexp">
-                    <text>Learn how to publish configurations to a web site and how to export processes to a planning tool.</text>
-                </link>
-                
-                <link 
-                	label="Reuse method content" 
-                	url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.epf.help.doc/html/tutorials/tut3_intro.htm&amp;" 
-                	id="epf-tut-content"
-                	class-id="left">
-                    <text>Learn how to extend, replace, and contribute to base content elements.</text>
-                </link>
-				<group id="step-links">
-					<anchor id="beginAnchor"/>
-            		<anchor id="endAnchor"/>
-				</group>
-		   	</group>   	
-        </group>
-        
-    </page>
-
-    <!-- WEB RESOURCES SCAFFOLDING -->
-	<page 
-		style="css/webresources/webresources.css" alt-style="css/webresources/webresources.properties" id="web" style-id="page">
-		<title style-id="intro-header">Eclipse Process Framework Composer</title>
-		<group id="background-image" filteredFrom="swt"/>
-		<group id="curve-image" filteredFrom="swt"/>
-		<include path="overview/navigation-links"/>
-		<group id="page-content">
-			<text style-id="page-title" id="page-title">WEB RESOURCES</text>
-			<text style-id="page-description" id="page-description">In addition to information in the Welcome and the Help, the Web provides you with tips, articles, updates, and references to industry standards. </text>
-			<group id="web-links">
-				   <link
-	                     label="Eclipse Process Framework"
-	                     url="http://org.eclipse.ui.intro/openBrowser?url=http://www.eclipse.org/epf"
-	                     id="epf_resource">
-	                  <text>Central location for information related to the Eclipse Process Framework</text>
-	               </link>
-			</group>
-		</group>
-	</page>
-	
-    <page style="css/samples/samples.css" alt-style="css/samples/swt.properties" id="samples" style-id="page">
-        <title style-id="intro-header">Eclipse Process Framework Composer</title>
-        <group id="background-image" filteredFrom="swt"/>
-        <group id="curve-image" filteredFrom="swt"/>
-        <include path="overview/navigation-links"/>
-        <group id="page-content">
-            <group id="content-header" label="SAMPLES" filteredFrom="swt">
-            </group>
-            <text style-id="page-title" id="page-title" filteredFrom="html">SAMPLES</text>
-            <text style-id="page-description" id="page-description">Explore Eclipse by installing prefabricated samples (may require Internet connection).</text>
-            <anchor id="beginAnchor"/>
-            <group label="SWT" id="swt" style-id="samples-group">
-                <text style-id="group-description">Run SWT samples using either the standalone SWT launcher or as an integrated workbench view.</text>
-                <link label="Workbench views and standalone applications" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.swt.examples" id="swt-examples" style-id="sample-link">
-                    <text>The SWT Example launcher will allow you to launch a collection of SWT examples.  Some of the examples can be run independent of the eclipse platform and others will be available as views inside the workbench.</text>
-                </link>
-                <anchor id="swtGroupAnchor"/>
-            </group>
-            <group label="Workbench" id="workbench" style-id="samples-group">
-                <text style-id="group-description">The following samples demonstrate how to tightly integrate into the Eclipse workbench.</text>
-                <link label="Multi-page editor" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.multipageeditor" id="multi-page-editor" style-id="sample-link">
-                    <text>Shows how to create an editor with multiple pages</text>
-                </link>
-                <link label="Property sheet and outline" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.propertysheet" id="property-sheet" style-id="sample-link">
-                    <text>Demonstrates how to use property sheet and outline views</text>
-                </link>
-                <link label="Readme tool" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.pde.ui&amp;class=org.eclipse.pde.ui.internal.samples.ShowSampleAction&amp;id=org.eclipse.sdk.samples.readmetool" id="readmetool" style-id="sample-link">
-                    <text>Shows how to create your own extension points</text>
-                </link>
-                <anchor id="jdtAnchor"/>
-                <anchor id="workbenchGroupAnchor"/>
-            </group>
-            <anchor id="endAnchor"/>
-        </group>
-    </page>
-
-    <page style="css/whatsnew/whatsnew.css" alt-style="css/whatsnew/swt.properties" id="news" style-id="page">
-        <title style-id="intro-header">Eclipse Process Framework Composer</title>
-        <group id="background-image" filteredFrom="swt"/>
-        <group id="curve-image" filteredFrom="swt"/>
-        <include path="overview/navigation-links"/>
-        <group id="page-content">
-            <group id="content-header" label="WHAT'S NEW" filteredFrom="swt">
-            </group>
-            <text style-id="page-title" id="page-title" filteredFrom="html">WHAT'S NEW</text>
-            <anchor id="beginAnchor"/>
-            <group id="noteworthy-links" label="New and Noteworthy">
-                <link label="Eclipse Platform" url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.platform.doc.user/whatsNew/platform_whatsnew.html" id="platform-noteworthy" style-id="noteworthy-link">
-                    <text>Find out about the major new features in this release</text>
-                </link>
-                <anchor id="jdtAnchor"/>
-                <anchor id="pdeAnchor"/>
-                <anchor id="generalAnchor"/>
-            </group>
-            <group id="news-links" label="General">
-                <link label="Migration from the previous release" url="http://org.eclipse.ui.intro/showHelpTopic?id=/org.eclipse.platform.doc.isv/porting/eclipse_3_0_porting_guide.html" id="migration">
-                    <text>Learn what you need to do to make your old code work in Eclipse 3.1</text>
-                </link>
-                <link label="New Updates" url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.ui.ide&amp;class=org.eclipse.ui.internal.ide.update.InstallWizardAction" id="updates">
-                    <text>Get the latest updates from Eclipse.org</text>
-                </link>
-                <link label="Eclipse community" url="http://www.eclipse.org" id="eclipse">
-                    <text>Join the community, read articles and news on Eclipse.org</text>
-                </link>
-                <anchor id="linksAnchor"/>
-            </group>
-            <anchor id="endAnchor"/>
-        </group>
-    </page>
-    
-</introContent>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/plugin.properties b/1.5/plugins/org.eclipse.epf.ui.intro/plugin.properties
deleted file mode 100644
index bb45fc0..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Introduction
-providerName=Eclipse.org
-
-
-
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/plugin.xml b/1.5/plugins/org.eclipse.epf.ui.intro/plugin.xml
deleted file mode 100644
index 7d32fd9..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/plugin.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.intro">
-      <intro
-            class="org.eclipse.ui.intro.config.CustomizableIntroPart"
-            icon="icons/full/obj16/product.gif"
-            id="org.eclipse.epf.ui.intro"/>
-         <introProductBinding
-               introId="org.eclipse.epf.ui.intro"
-               productId="org.eclipse.epf.rcp.ui.composer"/>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.intro.config">
-      <config
-            content="$nl$/introContent.xml"
-            id="org.eclipse.ui.intro.config"
-            introId="org.eclipse.epf.ui.intro">
-         <presentation home-page-id="root" standby-page-id="standby">
-           	<implementation
-           	  	   ws="win32,gtk"
-           	  	   style="css/shared.css"
-           	  	   kind="html"
-           	  	   os="win32,linux">
-           	</implementation>
-            <implementation kind="swt"/>
-               <launchBar
-                     location="right"
-                     bg="#dedcf5">
-               <handle
-                     close="true"
-                     image="css/graphics/contentpage/handle.gif"/>
-               <shortcut
-                     icon="css/graphics/icons/etool/overview.gif"
-                     tooltip="%shortcut.overview.tooltip"
-                     url="http://org.eclipse.ui.intro/showPage?id=overview"/>
-               <shortcut
-                     tooltip="%shortcut.tutorials.tooltip"
-                     icon="css/graphics/icons/etool/tutorials.gif"
-                     url="http://org.eclipse.ui.intro/showPage?id=tutorials"/>
-               <shortcut
-                     tooltip="%shortcut.firststeps.tooltip"
-                     icon="css/graphics/icons/etool/firsteps48.gif"
-                     url="http://org.eclipse.ui.intro/showPage?id=steps"/>
-               <shortcut
-                     tooltip="%shortcut.webresources.tooltip"
-                     icon="css/graphics/icons/etool/webrsrc16.gif"
-                     url="http://org.eclipse.ui.intro/showPage?id=web"/>
-            </launchBar>
-         </presentation>
-      </config>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.intro.configExtension">
-      <action
-            name="openCheatsheetView"
-            replaces="runAction?class=org.eclipse.epf.authoring.ui.actions.OpenCheatsheetView&amp;pluginId=org.eclipse.epf.authoring.ui">
-      </action>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.ui.intro/welcome.xml b/1.5/plugins/org.eclipse.epf.ui.intro/welcome.xml
deleted file mode 100644
index 6e3628e..0000000
--- a/1.5/plugins/org.eclipse.epf.ui.intro/welcome.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?> 
-<!-- 
-    Copyright (c) 2005, 2006 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-    Contributors:
-    IBM Corporation - initial implementation
--->
-
-<welcomePage 
-	title="Eclipse Platform"
-	format="nowrap">
-	<intro>This page will help familiarize you with the Eclipse Workbench.
-To get started, read the sections below and click on the related links. </intro>
-
-<item><b>Installed Features </b>
-To find out more about the features installed in your workbench, choose <action pluginId="org.eclipse.ui.ide"  class="org.eclipse.ui.actions.QuickStartAction">Help > Welcome...</action>
-and select the feature you are interested in.</item>
-
-<item><b>Perspectives, views and editors </b>
-A window contains one or more perspectives. A perspective consists of views (e.g. Navigator) 
-and editors for working with your resources.
-
-The shortcut bar at the far left of the window allows you to open new perspectives and move
-between perspectives that are already open. The perspective you are currently working with 
-is shown in the title of the window and in the shortcut bar as a pushed-in icon.</item>
-
-<item><b>Configuring your perspectives</b>
-You can move views and editors around the workbench by dragging their titlebars. You can
-also add more views to your current perspective by using Window > Show View. 
-To reset the perspective to its original state, choose <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.ResetPerspectiveAction">Window > Reset Perspective</action>. 
-
-Once you have arranged your perspective, you can save it using Window > Save Perspective As.... 
-You can customize the views, perspectives and New menu operations that show up for 
-your perspective. To do this choose <action pluginId="org.eclipse.ui"  class="org.eclipse.ui.internal.EditActionSetsAction">Window > Customize Perspective...</action> .  A view can
-additionally be converted into a Fast View by dragging it to the shortcut bar (at the 
-far left of the window). </item> 
-
-<item><b>Join a CVS team</b>
-To join a CVS development team, open the <action pluginId="org.eclipse.team.cvs.ui" class="org.eclipse.team.internal.ccvs.ui.actions.ShowCVSPerspectiveAction">CVS Repository Exploring perspective</action>. Next, specify
-the location of your CVS repository. To do this, choose <action pluginId="org.eclipse.team.cvs.ui" class="org.eclipse.team.internal.ccvs.ui.repo.NewCVSRepositoryAction">New > Repository Location...</action> from the
-CVS Repositories view popup menu. When the location wizard opens, fill in the details of your
-CVS repository and click Finish. 
-
-A repository location will appear in the CVS Repositories view. Expand the location, then expand
-the HEAD branch. You will see a list of the modules in that repository. Select a module and choose 
-<b>Checkout as Project</b> from the context menu. This will checkout the module from the CVS 
-repository and create a project by that name in your workspace.</item>
-
-<item><b>Running an Ant Buildfile</b>
-To run an Ant buildfile, click on Run > External Tools > External Tools.... Select Ant Build as the launch
-configuration type and click New. Identify the buildfile in the Location field and then click Run.</item>
-
-<item><b>Learn more </b>
-To learn more you can browse the <topic id="/org.eclipse.platform.doc.user/toc.xml">Workbench User Guide</topic>. Browse the <topic href="/org.eclipse.platform.doc.user/reference/ref-anticons.htm">External Tools and Ant Icons</topic>
-section to recognize the various External Tools and Ant elements. </item>
-
-</welcomePage>
diff --git a/1.5/plugins/org.eclipse.epf.ui/.classpath b/1.5/plugins/org.eclipse.epf.ui/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.ui/.project b/1.5/plugins/org.eclipse.epf.ui/.project
deleted file mode 100644
index fba1104..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.ui/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 657555a..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,21 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.ui.EPFUIPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.common,
- org.eclipse.jface.text,
- org.eclipse.ui,
- org.eclipse.epf.common.ui
-Eclipse-LazyStart: true
-Bundle-Vendor: %providerName
-Export-Package: org.eclipse.epf.ui,
- org.eclipse.epf.ui.actions,
- org.eclipse.epf.ui.dialogs,
- org.eclipse.epf.ui.editors,
- org.eclipse.epf.ui.preferences,
- org.eclipse.epf.ui.wizards
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.ui/build.properties b/1.5/plugins/org.eclipse.epf.ui/build.properties
deleted file mode 100644
index 78ffe10..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/
diff --git a/1.5/plugins/org.eclipse.epf.ui/plugin.properties b/1.5/plugins/org.eclipse.epf.ui/plugin.properties
deleted file mode 100644
index 7180ea7..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/plugin.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF UI
-providerName=Eclipse.org
-
-# Views
-viewCategoryName=Method Authoring
-
-# Wizards
-wizardCategoryName=Method Authoring
-
-# Action Set
-actionSetLabel=Method Authoring
-
-# Preference Pages
-rootPreferencePageName=Method
-
diff --git a/1.5/plugins/org.eclipse.epf.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.ui/plugin.xml
deleted file mode 100644
index f380ba8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/plugin.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.views">
-      <category
-            id="org.eclipse.epf.ui.views.category"
-            name="%viewCategoryName">
-      </category>
-   </extension>
-
-   <extension point="org.eclipse.ui.newWizards">
-      <category
-            id = "org.eclipse.epf.ui.newWizards.category"
-            name="%wizardCategoryName">
-      </category>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.exportWizards">
-      <category
-            id = "org.eclipse.epf.ui.exportWizards.category"
-            name="%wizardCategoryName">
-      </category>
-   </extension>
-
-   <extension
-         point="org.eclipse.ui.importWizards">
-      <category
-            id = "org.eclipse.epf.ui.importWizards.category"
-            name="%wizardCategoryName">
-      </category>
-   </extension>
-
-   <extension-point
-         id="exportWizards"
-         name="EPF Export Wizards"
-         schema="schema/ExportWizards.exsd"/>
-
-   <extension-point
-         id="importWizards"
-         name="EPF Import Wizards"
-         schema="schema/ImportWizards.exsd"/>
-
-   <extension point="org.eclipse.ui.preferencePages">
-      <page
-            id="org.eclipse.epf.ui.preferences.RootPreferencePage"
-            class="org.eclipse.epf.ui.preferences.RootPreferencePage"
-            name="%rootPreferencePageName"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.ui/schema/ExportWizards.exsd b/1.5/plugins/org.eclipse.epf.ui/schema/ExportWizards.exsd
deleted file mode 100644
index 18938f2..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/schema/ExportWizards.exsd
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.ui" id="exportWizards" name="EPF Export Wizards"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to contribute an export wizard to the standalone RCP-based EPF Composer UI.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizard" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizard">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of how the extension point can be used: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.ui.exportWizards&quot;&gt;
-      &lt;wizard id=&quot;org.eclipse.epf.export.msp.ui.wizards.ExportMSPWizard&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.ui/schema/ImportWizards.exsd b/1.5/plugins/org.eclipse.epf.ui/schema/ImportWizards.exsd
deleted file mode 100644
index 9d07834..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/schema/ImportWizards.exsd
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.epf.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.epf.ui" id="importWizards" name="EPF Import Wizards"/>
-      </appInfo>
-      <documentation>
-         Enables a plug-in to contribute an import wizard to the standalone RCP-based EPF Composer UI.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="wizard" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="wizard">
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of how the extension point can be used: 
-&lt;p&gt;
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.epf.ui.importWizards&quot;&gt;
-      &lt;wizard id=&quot;org.eclipse.epf.importing.xml.wizards.ImportXMLWizard&quot;/&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2005, 2006 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at &lt;a 
-href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/EPFUIPlugin.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/EPFUIPlugin.java
deleted file mode 100644
index d7e1804..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/EPFUIPlugin.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui;
-
-import org.eclipse.epf.common.ui.AbstractPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The EPF UI plug-in class.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class EPFUIPlugin extends AbstractPlugin {
-
-	// The shared plug-in instance.
-	private static EPFUIPlugin plugin;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public EPFUIPlugin() {
-		super();
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * @see org.eclipse.epf.common.ui.AbstractPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Gets the shared instance.
-	 * 
-	 * @return the shared plug-in instance
-	 */
-	public static EPFUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/EPFUIResources.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/EPFUIResources.java
deleted file mode 100644
index 16d831b..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/EPFUIResources.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The EPF UI resource bundle.
- * 
- * @author Jinhua Xi
- * @author Kelvin Low
- * @since 1.2
- */
-public final class EPFUIResources extends NLS {
-
-	private static String BUNDLE_NAME = EPFUIResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private EPFUIResources() {
-	}
-
-	public static String Dialog_fileNameConflict_title;
-
-	public static String Dialog_fileNameConflict_msg;
-
-	public static String Dialog_fileName_selectAction_label;
-
-	public static String Dialog_fileName_destination;
-
-	public static String Dialog_fileNameConflict_note;
-
-	public static String Dialog_fileName_replace_msg;
-
-	public static String Dialog_fileName_unique_msg;
-
-	public static String internalError_reason;
-
-	public static String initializeWizardError_reason;
-
-	public static String initializeWizardPagesError_reason;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, EPFUIResources.class);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/Resources.properties b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/Resources.properties
deleted file mode 100644
index df90313..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/Resources.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementationCorporation. All Rights Reserved.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# File Name Conflict Dialog
-Dialog_fileNameConflict_title=File Name Conflict
-Dialog_fileNameConflict_msg=IUPU0200W: The file ''{0}'' already exists in the method library resource folder ''{1}''.
-Dialog_fileNameConflict_note=Note: Another method element might reference this file.
-Dialog_fileName_replace_msg=Replace existing file with new file
-Dialog_fileName_unique_msg=Specify unique name for this new file
-Dialog_fileName_selectAction_label=Select action:
-
-# Error Messages
-internalError_reason=An internal error has occurred.\n\nClick Details for more information.
-initializeWizardError_reason=The wizard has not been initialized correctly.
-initializeWizardPagesError_reason=One or more wizard pages have not been initialized correctly.
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/actions/CComboContributionItem.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/actions/CComboContributionItem.java
deleted file mode 100644
index 8281f07..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/actions/CComboContributionItem.java
+++ /dev/null
@@ -1,164 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.actions;
-
-import java.util.Collection;
-
-import org.eclipse.jface.action.ContributionItem;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolBar;
-import org.eclipse.swt.widgets.CoolItem;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * Wraps a CCombo in a ContributionItem for use in a toolbar
- * 
- * Does not use a ComboViewer because of tabbing issues - see bug 78885
- * @author Jeff Hardy
- *
- */
-public class CComboContributionItem extends ContributionItem {
-
-	protected CCombo CCombo;
-
-	protected ToolItem toolItem;
-
-	protected CoolItem coolItem;
-	
-	protected int style;
-	
-	protected Collection<String> input;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public CComboContributionItem(int style) {
-		super();
-		this.style = style;
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.ToolBar,
-	 *      int)
-	 */
-	public void fill(ToolBar parent, int index) {
-		toolItem = new ToolItem(parent, SWT.SEPARATOR);
-		Control box = createControl(parent);
-		toolItem.setControl(box);
-		Point preferredSize = CCombo.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-		toolItem.setWidth(preferredSize.x);
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.CoolBar,
-	 *      int)
-	 */
-	public void fill(CoolBar coolBar, int index) {
-		Control box = createControl(coolBar);
-
-		if (index >= 0) {
-			coolItem = new CoolItem(coolBar, SWT.DROP_DOWN, index);
-		} else {
-			coolItem = new CoolItem(coolBar, SWT.DROP_DOWN);
-		}
-
-		// Set the back reference.
-		coolItem.setData(this);
-
-		// Add the toolbar to the CoolItem widget.
-		coolItem.setControl(box);
-
-		// If the toolbar item exists then adjust the size of the cool item.
-		Point toolBarSize = box.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-
-		// Set the preferred size to the size of the toolbar plus trim.
-		coolItem.setMinimumSize(toolBarSize);
-		coolItem.setPreferredSize(toolBarSize);
-		coolItem.setSize(toolBarSize);
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets.Composite)
-	 */
-	public void fill(Composite parent) {
-		createControl(parent);
-	}
-
-	/**
-	 * Creates the control.
-	 */
-	protected Control createControl(final Composite parent) {
-		CCombo = new CCombo(parent, style);
-		CCombo.setVisibleItemCount(10);
-		CCombo.setEnabled(true);
-		CCombo.setItems(input.toArray(new String[0]));
-		CCombo.addDisposeListener(
-				new DisposeListener() {
-					public void widgetDisposed(DisposeEvent event) {
-						dispose();
-					}
-				});
-
-		CCombo.addSelectionListener(new SelectionListener() {
-					public void widgetDefaultSelected(SelectionEvent e) {
-					}
-
-					public void widgetSelected(SelectionEvent e) {
-						performSelectionChanged();
-					}
-				});
-
-		return CCombo;
-	}
-
-	/**
-	 * Returns the currently selected method configuration
-	 */
-	protected int getSelectionIndex() {
-		return CCombo.getSelectionIndex();
-	}
-	
-	protected void setInput(Collection<String> input) {
-		this.input = input;
-	}
-
-
-	protected void performSelectionChanged() {
-	}
-
-	/*
-	 * @see org.eclipse.jface.action.ContributionItem#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-
-	public CCombo getCCombo() {
-		return CCombo;
-	}
-
-	public ToolItem getToolItem() {
-		return toolItem;
-	}
-
-	public CoolItem getCoolItem() {
-		return coolItem;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/dialogs/RenameFileConflictDialog.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/dialogs/RenameFileConflictDialog.java
deleted file mode 100644
index dc13652..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/dialogs/RenameFileConflictDialog.java
+++ /dev/null
@@ -1,296 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.dialogs;
-
-import java.io.File;
-
-import org.eclipse.epf.ui.EPFUIResources;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Displays a dialog that prompts the user to rename a file path.
- * 
- * @author Shashidhar Kannoori
- * @since 1.2
- */
-public class RenameFileConflictDialog extends Dialog {
-
-	/**
-	 * The OK button.
-	 */
-	protected Button okButton;
-
-	/**
-	 * The Cancel button.
-	 */
-	protected Button cancelButton;
-
-	/**
-	 * The overwrite button
-	 */
-	protected Button overWriteButton;
-
-	private Text ctrl_fileName;
-	private int OVER_WRITE_ID = 22;
-	private String messageStr;
-	private String fileName;
-	private Button button_replace;
-	private Button button_unique;
-
-	private String destination;
-
-	/**
-	 * Creates an instance
-	 * 
-	 * @param parent
-	 */
-	public RenameFileConflictDialog(Shell parent) {
-		super(parent);
-	}
-
-	/**
-	 * @see Dialog#createDialogArea(Composite parent)
-	 */
-	protected Control createDialogArea(Composite parent) {
-
-		Composite dialogArea = (Composite) super.createDialogArea(parent);
-		GridLayout layout = (GridLayout) dialogArea.getLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 10;
-		GridData gridData = (GridData) dialogArea.getLayoutData();
-		gridData.verticalIndent = 10;
-		gridData.widthHint = 450;
-		layout.numColumns = 3;
-
-		// Create message area.
-
-		Image image = Display.getCurrent().getSystemImage(SWT.ICON_WARNING);
-		if (image != null) {
-			Label imageLabel = new Label(dialogArea, SWT.NULL);
-			image.setBackground(imageLabel.getBackground());
-			imageLabel.setImage(image);
-			imageLabel.setLayoutData(new GridData(
-					GridData.HORIZONTAL_ALIGN_CENTER
-							| GridData.VERTICAL_ALIGN_BEGINNING));
-		}
-
-		Label message = new Label(dialogArea, SWT.WRAP);
-		if (messageStr != null) {
-			message.setText(messageStr);
-		}
-		GridData data1 = new GridData(GridData.FILL_HORIZONTAL);
-		data1.horizontalSpan = 2;
-		message.setLayoutData(data1);
-
-		Label empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		Label note = new Label(dialogArea, SWT.NONE);
-		note.setText(EPFUIResources.Dialog_fileNameConflict_note);
-		GridData data2 = new GridData(GridData.FILL_HORIZONTAL);
-		data2.horizontalSpan = 2;
-		note.setLayoutData(data2);
-
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		GridData data3 = new GridData(GridData.FILL_HORIZONTAL);
-		data3.horizontalSpan = 3;
-		data3.heightHint = 10;
-		empty.setLayoutData(data3);
-
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		Label selectAction = new Label(dialogArea, SWT.NONE);
-		selectAction.setText(EPFUIResources.Dialog_fileName_selectAction_label);
-		GridData data4 = new GridData(GridData.FILL_HORIZONTAL);
-		data4.horizontalSpan = 2;
-		selectAction.setLayoutData(data4);
-
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		button_replace = new Button(dialogArea, SWT.RADIO);
-		// Label replace_label = new Label(dialogArea, SWT.NONE);
-		// replace_label.setText(EPFUIResources.Dialog_fileName_replace_msg);
-		button_replace.setText(EPFUIResources.Dialog_fileName_replace_msg);
-		button_replace.setSelection(true);
-
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		button_unique = new Button(dialogArea, SWT.RADIO);
-		// Label uniqueLabel = new Label(dialogArea, SWT.NONE);
-		// uniqueLabel.setText(EPFUIResources.Dialog_fileName_unique_msg);
-		button_unique.setText(EPFUIResources.Dialog_fileName_unique_msg);
-		button_unique.setSelection(false);
-
-		// Create label area. -- TODO: find different way instead of empty
-		// labels.
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		empty = new Label(dialogArea, SWT.NONE);
-		empty.setText(""); //$NON-NLS-1$
-		ctrl_fileName = new Text(dialogArea, SWT.BORDER);
-		GridData gridData1 = new GridData(GridData.BEGINNING);
-		gridData1.widthHint = 200;
-		gridData1.verticalAlignment = GridData.VERTICAL_ALIGN_CENTER;
-		ctrl_fileName.setLayoutData(gridData1);
-		if (fileName != null) {
-			ctrl_fileName.setText(fileName);
-			ctrl_fileName.setEnabled(false);
-		}
-		ctrl_fileName.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (okButton != null) {
-					okButton
-							.setEnabled(ctrl_fileName.getText().trim().length() > 0);
-				}
-				fileName = ctrl_fileName.getText();
-				File file = new File(destination + File.separator + fileName);
-				if (file.exists()) {
-					okButton.setEnabled(false);
-				} else {
-					okButton.setEnabled(true);
-				}
-			}
-		});
-
-		button_replace.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				ctrl_fileName.setEnabled(false);
-				okButton.setEnabled(true);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		button_unique.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent event) {
-				ctrl_fileName.setEnabled(true);
-				fileName = ctrl_fileName.getText();
-				File file = new File(destination + File.separator + fileName);
-				if (file.exists()) {
-					okButton.setEnabled(false);
-				} else {
-					okButton.setEnabled(true);
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		super.getShell().setText(EPFUIResources.Dialog_fileNameConflict_title); 
-
-		return dialogArea;
-
-	}
-
-	/**
-	 * Creates the dialog buttons.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		// Create the OK button.
-		// createButton(parent, OVER_WRITE_ID,
-		// EPFUIResources.Dialog_fileName_overWrite, true);
-
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-
-		// Create the Cancel button.
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		// Set help context for the OK button.
-		okButton = super.getButton(IDialogConstants.OK_ID);
-
-		// Set help context for the Cancel button.
-		cancelButton = super.getButton(IDialogConstants.CANCEL_ID);
-
-		// Set help context for the overwrite button
-		// overWriteButton = super.getButton(OVER_WRITE_ID);
-
-		// okButton.setEnabled(false);
-	}
-
-	/**
-	 * Called when the OK button is selected.
-	 */
-	protected void okPressed() {
-		super.okPressed();
-	}
-
-	/**
-	 * Returns the File Name
-	 */
-	public String getFilePath() {
-		return fileName;
-	}
-
-	public void setFilePath(String fileName) {
-		this.fileName = fileName;
-	}
-
-	@Override
-	protected Control createButtonBar(Composite parent) {
-		return super.createButtonBar(parent);
-	}
-
-	@Override
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == OVER_WRITE_ID) {
-			overWritePressed();
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	private void overWritePressed() {
-		setReturnCode(OVER_WRITE_ID);
-		close();
-	}
-
-	@Override
-	protected void cancelPressed() {
-		fileName = null;
-		super.cancelPressed();
-	}
-
-	public String getMessageStr() {
-		return messageStr;
-	}
-
-	public void setMessageStr(String messageStr) {
-		this.messageStr = messageStr;
-	}
-
-	public void setDestination(String destination) {
-		this.destination = destination;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/editors/IMethodEditor.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/editors/IMethodEditor.java
deleted file mode 100644
index ed2fe25..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/editors/IMethodEditor.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.eclipse.epf.ui.editors;
-
-public interface IMethodEditor {
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/preferences/BasePreferencePage.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/preferences/BasePreferencePage.java
deleted file mode 100644
index ca540ce..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/preferences/BasePreferencePage.java
+++ /dev/null
@@ -1,489 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.preferences;
-
-import org.eclipse.epf.ui.util.SWTUtil;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * The abstract base class for all EPF preference pages.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-abstract public class BasePreferencePage extends PreferencePage implements
-		IWorkbenchPreferencePage {
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-	}
-
-	/**
-	 * Creates a composite with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the composite will take up
-	 * @return a <code>Composite</code> object
-	 */
-	protected static Composite createGridLayoutComposite(Composite parent,
-			int column) {
-		return SWTUtil.createGridLayoutComposite(parent, column);
-	}
-
-	/**
-	 * Creates a child composite with a grid layout.
-	 * <p>
-	 * The child composite will be indented from the parent composite.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the composite will take up
-	 * @return a <code>Composite</code> object
-	 */
-	protected static Composite createChildGridLayoutComposite(Composite parent,
-			int column) {
-		return SWTUtil.createChildGridLayoutComposite(parent, column);
-	}
-
-	/**
-	 * Creates a group with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the group
-	 * @param column
-	 *            the number of column cells that the group will take up
-	 * @return a <code>Group</code> object
-	 */
-	protected static Group createGridLayoutGroup(Composite parent, String text,
-			int column) {
-		return SWTUtil.createGridLayoutGroup(parent, text, column);
-	}
-
-	/**
-	 * Creates a group with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the group
-	 * @param column
-	 *            the number of column cells that the group will take up
-	 * @param equalColumnWidth
-	 *            flag to indicate whether column cells should be same width or
-	 *            not
-	 * @return a <code>Group</code> object
-	 */
-	protected static Group createGridLayoutGroup(Composite parent, String text,
-			int column, boolean equalColumnWidth) {
-		return SWTUtil.createGridLayoutGroup(parent, text, column,
-				equalColumnWidth);
-	}
-
-	/**
-	 * Creates a label.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @param column
-	 *            the number of column cells that the label will take up
-	 * @return a <code>Label</code> object
-	 */
-	protected static Label createLabel(Composite parent, String text, int column) {
-		return SWTUtil.createLabel(parent, text, column);
-	}
-
-	/**
-	 * Creates a label that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @return a <code>Label</code> object
-	 */
-	protected static Label createLabel(Composite parent, String text) {
-		return SWTUtil.createLabel(parent, text);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText, int widthHint, int heightHint, int column) {
-		return SWTUtil.createEditableText(parent, defaultText, widthHint,
-				heightHint, column);
-	}
-
-	/**
-	 * Creates a readonly text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createText(Composite parent, String defaultText,
-			int widthHint, int column) {
-		return SWTUtil.createText(parent, defaultText, widthHint, column);
-	}
-
-	/**
-	 * Creates an readonly text control that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createText(Composite parent, String defaultText) {
-		return SWTUtil.createText(parent, defaultText);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText, int widthHint, int column) {
-		return SWTUtil.createEditableText(parent, defaultText, widthHint,
-				column);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText, int widthHint) {
-		return SWTUtil.createEditableText(parent, defaultText, widthHint);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent, int column) {
-		return SWTUtil.createEditableText(parent, column);
-	}
-
-	/**
-	 * Creates an editable text control that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText) {
-		return SWTUtil.createEditableText(parent, defaultText);
-	}
-
-	/**
-	 * Creates an empty editable text control that only takes up one column
-	 * cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent) {
-		return SWTUtil.createEditableText(parent);
-	}
-
-	/**
-	 * Creates a readonly multi-line text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createMultiLineText(Composite parent,
-			String defaultText, int widthHint, int heightHint, int column) {
-		return SWTUtil.createMultiLineText(parent, defaultText, widthHint,
-				heightHint, column);
-	}
-
-	/**
-	 * Creates an combobox.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Combo</code> object
-	 */
-	protected static Combo createCombobox(Composite parent, int column) {
-		return SWTUtil.createCombobox(parent, column);
-	}
-
-	/**
-	 * Creates an combobox that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return a <code>Combo</code> object
-	 */
-	protected static Combo createCombobox(Composite parent) {
-		return SWTUtil.createCombobox(parent);
-	}
-
-	/**
-	 * Creates a button.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createButton(Composite parent, String text) {
-		return SWTUtil.createButton(parent, text);
-	}
-
-	/**
-	 * Creates a checkbox.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createCheckbox(Composite parent, String text,
-			int column) {
-		return SWTUtil.createCheckbox(parent, text, column);
-	}
-
-	/**
-	 * Creates a checkbox that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createCheckbox(Composite parent, String text) {
-		return SWTUtil.createCheckbox(parent, text);
-	}
-
-	/**
-	 * Creates an radio button.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @param selected
-	 *            if <code>true</code>, select the radio button by default
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createRadioButton(Composite parent, String text,
-			int column, boolean selected) {
-		return SWTUtil.createRadioButton(parent, text, column, selected);
-	}
-
-	/**
-	 * Creates an radio button that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createRadioButton(Composite parent, String text) {
-		return SWTUtil.createRadioButton(parent, text);
-	}
-
-	/**
-	 * Creates a readonly text viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>TextViewer</code> object
-	 */
-	protected static TextViewer createTextViewer(Composite parent,
-			int widthHint, int heightHint, int column) {
-		return SWTUtil.createTextViewer(parent, widthHint, heightHint, column);
-	}
-
-	/**
-	 * Creates a readonly text viewer that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return a <code>TextViewer</code> object
-	 */
-	protected static TextViewer createTextViewer(Composite parent) {
-		return SWTUtil.createTextViewer(parent);
-	}
-
-	/**
-	 * Creates a table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>TableViewer</code> object
-	 */
-	protected static TableViewer createTableViewer(Composite parent,
-			int widthHint, int heightHint, int column) {
-		return SWTUtil.createTableViewer(parent, widthHint, heightHint, column);
-	}
-
-	/**
-	 * Creates a checkbox table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>CheckboxTableViewer</code> object
-	 */
-	protected static CheckboxTableViewer createCheckboxTableViewer(
-			Composite parent, int widthHint, int heightHint, int column) {
-		return SWTUtil.createCheckboxTableViewer(parent, widthHint, heightHint,
-				column);
-	}
-
-	/**
-	 * Creates a checkbox table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>CheckboxTableViewer</code> object
-	 */
-	protected static CheckboxTableViewer createCheckboxTableViewer(
-			Composite parent, int column) {
-		return SWTUtil.createCheckboxTableViewer(parent, 360, 175, column);
-	}
-
-	/**
-	 * Creates a line.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the line will take up
-	 * @return a <code>Label</code> object
-	 */
-	protected static Label createLine(Composite parent, int column) {
-		return SWTUtil.createLine(parent, column);
-	}
-
-	/**
-	 * Checks whether a text control has some text.
-	 * 
-	 * @param control
-	 *            the text control
-	 * @return <code>true</code> if the text control has some text,
-	 *         <code>false</code> otherwise
-	 */
-	protected static boolean isNonEmptyText(Text control) {
-		return SWTUtil.isNonEmptyText(control);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/preferences/RootPreferencePage.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/preferences/RootPreferencePage.java
deleted file mode 100644
index 9595b3c..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/preferences/RootPreferencePage.java
+++ /dev/null
@@ -1,45 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.preferences;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * The root preference page.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class RootPreferencePage extends BasePreferencePage {
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		return createGridLayoutComposite(parent, 3);
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/util/SWTUtil.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/util/SWTUtil.java
deleted file mode 100644
index 3102bd7..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/util/SWTUtil.java
+++ /dev/null
@@ -1,608 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.util;
-
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Helper class to create SWT widgets for the EPF UI.
- * <p>
- * This class helps to provide a common look and feel for all EPF forms,
- * dialogs, wizards and preference pages.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class SWTUtil {
-
-	/**
-	 * Prevents external instantiation of this class. All methods in this class
-	 * should be declared static.
-	 */
-	private SWTUtil() {
-	}
-
-	/**
-	 * Creates a composite with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the composite will take up
-	 * @return a <code>Composite</code> object
-	 */
-	public static Composite createGridLayoutComposite(Composite parent,
-			int column) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(column, false));
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		return composite;
-	}
-
-	/**
-	 * Creates a child composite with a grid layout.
-	 * <p>
-	 * The child composite will be indented from the parent composite.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the composite will take up
-	 * @return a <code>Composite</code> object
-	 */
-	public static Composite createChildGridLayoutComposite(Composite parent,
-			int column) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		composite.setLayout(new GridLayout(column, false));
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		((GridLayout) composite.getLayout()).marginTop = -3;
-		((GridLayout) composite.getLayout()).marginLeft = 13;
-		return composite;
-	}
-
-	/**
-	 * Creates a group with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the group
-	 * @param column
-	 *            the number of column cells that the group will take up
-	 * @return a <code>Group</code> object
-	 */
-	public static Group createGridLayoutGroup(Composite parent, String text,
-			int column) {
-		Group group = new Group(parent, SWT.NONE);
-		group.setLayout(new GridLayout(column, false));
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		group.setText(text);
-		return group;
-	}
-
-	/**
-	 * Creates a group with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the group
-	 * @param column
-	 *            the number of column cells that the group will take up
-	 * @param equalColumnWidth
-	 *            flag to indicate whether column cells should be same width or
-	 *            not
-	 * @return a <code>Group</code> object
-	 */
-	public static Group createGridLayoutGroup(Composite parent, String text,
-			int column, boolean equalColumnWidth) {
-		Group group = new Group(parent, SWT.NONE);
-		group.setLayout(new GridLayout(column, equalColumnWidth));
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		group.setText(text);
-		return group;
-	}
-
-	/**
-	 * Creates a label.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @param column
-	 *            the number of column cells that the label will take up
-	 * @return a <code>Label</code> object
-	 */
-	public static Label createLabel(Composite parent, String text, int column) {
-		Label label = new Label(parent, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		label.setLayoutData(gd);
-		label.setText(text);
-		return label;
-	}
-
-	/**
-	 * Creates a label that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @return a <code>Label</code> object
-	 */
-	public static Label createLabel(Composite parent, String text) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setLayoutData(new GridData());
-		label.setText(text);
-		return label;
-	}
-
-	/**
-	 * Creates a vertically aligned label that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @return a <code>Label</code> object
-	 */
-	public static Label createVerticallyAlignedLabel(Composite parent,
-			String text) {
-		Label label = new Label(parent, SWT.NONE);
-		label.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
-		label.setText(text);
-		return label;
-	}
-
-	/**
-	 * Creates a readonly text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createText(Composite parent, String defaultText,
-			int widthHint, int column) {
-		Text text = new Text(parent, SWT.BORDER | SWT.READ_ONLY);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		gd.widthHint = widthHint;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	/**
-	 * Creates an readonly text control that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createText(Composite parent, String defaultText) {
-		Text text = new Text(parent, SWT.BORDER | SWT.READ_ONLY);
-		text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		text.setText(defaultText);
-		return text;
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent, String defaultText,
-			int widthHint, int heightHint, int column) {
-		Text text = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		gd.widthHint = widthHint;
-		gd.heightHint = heightHint;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent, int widthHint,
-			int heightHint, int column) {
-		return createEditableText(parent, "", widthHint, heightHint, column); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent, String defaultText,
-			int widthHint, int column) {
-		Text text = new Text(parent, SWT.BORDER);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		gd.widthHint = widthHint;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	/**
-	 * Creates an editable text control that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent, String defaultText,
-			int widthHint) {
-		Text text = new Text(parent, SWT.BORDER);
-		GridData gd = new GridData();
-		gd.widthHint = widthHint;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	/**
-	 * Creates an editable text control that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent, String defaultText) {
-		Text text = new Text(parent, SWT.BORDER);
-		text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		text.setText(defaultText);
-		return text;
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent, int column) {
-		return createEditableText(parent, "", SWT.DEFAULT, column); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates an empty editable text control that only takes up one column
-	 * cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent) {
-		return createEditableText(parent, ""); //$NON-NLS-1$
-	}
-
-	/**
-	 * Creates a readonly multi-line text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createMultiLineText(Composite parent,
-			String defaultText, int widthHint, int heightHint, int column) {
-		Text text = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.WRAP
-				| SWT.V_SCROLL | SWT.READ_ONLY);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		gd.widthHint = widthHint;
-		gd.heightHint = heightHint;
-		text.setLayoutData(gd);
-		return text;
-	}
-
-	/**
-	 * Creates an combobox.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Combo</code> object
-	 */
-	public static Combo createCombobox(Composite parent, int column) {
-		Combo combo = new Combo(parent, SWT.BORDER);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		combo.setLayoutData(gd);
-		return combo;
-	}
-
-	/**
-	 * Creates an combobox that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return a <code>Combo</code> object
-	 */
-	public static Combo createCombobox(Composite parent) {
-		return createCombobox(parent, 1);
-	}
-
-	/**
-	 * Creates a button.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	public static Button createButton(Composite parent, String text) {
-		Button button = new Button(parent, SWT.NONE);
-		button.setText(text);
-		return button;
-	}
-
-	/**
-	 * Creates a checkbox.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Button</code> object
-	 */
-	public static Button createCheckbox(Composite parent, String text,
-			int column) {
-		Button button = new Button(parent, SWT.CHECK);
-		button.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		button.setLayoutData(gd);
-		return button;
-	}
-
-	/**
-	 * Creates a checkbox that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	public static Button createCheckbox(Composite parent, String text) {
-		return createCheckbox(parent, text, 1);
-	}
-
-	/**
-	 * Creates an radio button.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @param selected
-	 *            if <code>true</code>, select the radio button by default
-	 * @return a <code>Button</code> object
-	 */
-	public static Button createRadioButton(Composite parent, String text,
-			int column, boolean selected) {
-		Button radioButton = new Button(parent, SWT.RADIO);
-		radioButton.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		radioButton.setLayoutData(gd);
-		radioButton.setSelection(selected);
-		return radioButton;
-	}
-
-	/**
-	 * Creates an radio button that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	public static Button createRadioButton(Composite parent, String text) {
-		return createRadioButton(parent, text, 1, false);
-	}
-
-	/**
-	 * Creates a readonly text viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>TextViewer</code> object
-	 */
-	public static TextViewer createTextViewer(Composite parent, int widthHint,
-			int heightHint, int column) {
-		TextViewer textViewer = new TextViewer(parent, SWT.BORDER | SWT.MULTI
-				| SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY);
-		StyledText textWidget = textViewer.getTextWidget();
-		GridData gd = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
-		gd.horizontalSpan = column;
-		gd.heightHint = heightHint;
-		gd.widthHint = widthHint;
-		textWidget.setLayoutData(gd);
-		return textViewer;
-	}
-
-	/**
-	 * Creates a readonly text viewer that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return a <code>TextViewer</code> object
-	 */
-	public static TextViewer createTextViewer(Composite parent) {
-		return createTextViewer(parent, SWT.DEFAULT, SWT.DEFAULT, SWT.DEFAULT);
-	}
-
-	/**
-	 * Creates a table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>TableViewer</code> object
-	 */
-	public static TableViewer createTableViewer(Composite parent,
-			int widthHint, int heightHint, int column) {
-		Table table = new Table(parent, SWT.V_SCROLL | SWT.BORDER);
-		GridData gd = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
-		gd.horizontalSpan = column;
-		gd.widthHint = widthHint;
-		gd.heightHint = heightHint;
-		table.setLayoutData(gd);
-		TableViewer tableViewer = new TableViewer(table);
-		return tableViewer;
-	}
-
-	/**
-	 * Creates a checkbox table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>CheckboxTableViewer</code> object
-	 */
-	public static CheckboxTableViewer createCheckboxTableViewer(
-			Composite parent, int widthHint, int heightHint, int column) {
-		CheckboxTableViewer checkboxTableViewer = CheckboxTableViewer
-				.newCheckList(parent, SWT.BORDER | SWT.FILL | SWT.HORIZONTAL);
-		Table table = checkboxTableViewer.getTable();
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		gd.widthHint = widthHint;
-		gd.heightHint = heightHint;
-		table.setLayoutData(gd);
-		return checkboxTableViewer;
-	}
-
-	/**
-	 * Creates a line.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the line will take up
-	 * @return a <code>Label</code> object
-	 */
-	public static Label createLine(Composite parent, int column) {
-		Label line = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL
-				| SWT.BOLD);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = column;
-		line.setLayoutData(gd);
-		return line;
-	}
-
-	/**
-	 * Checks whether a text control has some text.
-	 * 
-	 * @param control
-	 *            the text control
-	 * @return <code>true</code> if the text control has some text,
-	 *         <code>false</code> otherwise
-	 */
-	public static boolean isNonEmptyText(Text control) {
-		String text = control.getText();
-		return text != null && text.trim().length() > 0;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/BaseWizard.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/BaseWizard.java
deleted file mode 100644
index 204e3c3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/BaseWizard.java
+++ /dev/null
@@ -1,255 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.epf.ui.EPFUIPlugin;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * The abstract base class for all extensible EPF wizards.
- * 
- * @author Kelvin Low
- * @author Jinhua Xi
- * 
- * @since 1.2
- */
-public abstract class BaseWizard extends Wizard {
-
-	// The current workbench.
-	protected IWorkbench workbench;
-
-	// The current object selection.
-	protected IStructuredSelection selection;
-
-	// An extender of this wizard.
-	protected IWizardExtender wizardExtender;
-
-	/**
-	 * Creates a new instance.
-	 */
-	public BaseWizard() {
-		super();
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
-	 *      IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		this.workbench = workbench;
-		this.selection = selection;
-
-		processWizardExtenderExtensionPoint();
-
-		initializeExtender();
-	}
-
-	protected void initializeExtender() {
-		if (wizardExtender != null) {
-			wizardExtender.init(this);
-		}
-	}
-
-	/**
-	 * Gets the wizard extender specific extension point ID.
-	 * 
-	 * @return the wizard extender specific extension point ID
-	 */
-	public abstract String getWizardExtenderExtensionPointId();
-
-	/**
-	 * Gets the extender of this wizard.
-	 * 
-	 * @return a <code>IWizardExtender</code> object or <code>null</code> if
-	 *         there is no extender
-	 */
-	public IWizardExtender getWizardExtender() {
-		return wizardExtender;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#getNextPage(IWizardPage)
-	 */
-	public IWizardPage getNextPage(IWizardPage page) {
-		IWizardPage nextPage = null;
-		if (wizardExtender != null) {
-			nextPage = wizardExtender.getNextPage(page);
-		}
-		if (nextPage == null) {
-			nextPage = super.getNextPage(page);
-		}
-		return nextPage;
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean canFinish() {
-		if (wizardExtender != null) {
-			return wizardExtender.canFinish();
-		}
-		return super.canFinish();
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (wizardExtender != null) {
-			return wizardExtender.doFinish();
-		}
-		return doFinish();
-	}
-
-	/**
-	 * Executes the finish operation.
-	 * 
-	 * @return <code>true</code> if the finish operation is executed
-	 *         successfully
-	 */
-	public boolean doFinish() {
-		return true;
-	}
-
-	/**
-	 * allow override the extender. the default implementation is to return the
-	 * defaultExtender
-	 * 
-	 * @param defaultExtender
-	 * @return IWizardExtender
-	 */
-	protected IWizardExtender createWizardExtender(
-			IWizardExtender defaultExtender) {
-		return defaultExtender;
-	}
-
-	/**
-	 * Processes the wizard extender spcific extension point.
-	 */
-	protected void processWizardExtenderExtensionPoint() {
-		IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
-
-		String extensionPointId = getWizardExtenderExtensionPointId();
-		if (extensionPointId == null) {
-			return;
-		}
-
-		IExtensionPoint extensionPoint = extensionRegistry
-				.getExtensionPoint(extensionPointId);
-		if (extensionPoint == null) {
-			return;
-		}
-
-		IExtension[] extensions = extensionPoint.getExtensions();
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension extension = extensions[i];
-			IConfigurationElement[] configElements = extension
-					.getConfigurationElements();
-			for (int j = 0; j < configElements.length; j++) {
-				IConfigurationElement configElement = configElements[j];
-				try {
-					IWizardExtender extender = (IWizardExtender) configElement
-							.createExecutableExtension("class"); //$NON-NLS-1$
-					if (wizardExtender == null) {
-						wizardExtender = createWizardExtender(extender);
-
-						IConfigurationElement[] childConfigElements = configElement
-								.getChildren("wizardPage"); //$NON-NLS-1$
-						for (int k = 0; k < childConfigElements.length; k++) {
-							IConfigurationElement childConfigElement = childConfigElements[k];
-							IWizardPage wizardPage = (IWizardPage) childConfigElement
-									.createExecutableExtension("class"); //$NON-NLS-1$
-							String type = childConfigElement
-									.getAttribute("type"); //$NON-NLS-1$
-							String target = childConfigElement
-									.getAttribute("target"); //$NON-NLS-1$
-							String insert = childConfigElement
-									.getAttribute("insert"); //$NON-NLS-1$
-							if (wizardPage != null && type != null
-									&& type.length() > 0) {
-								if (type.equals("replace")) { //$NON-NLS-1$
-									wizardExtender
-											.addReplaceWizardPageContribution(new ReplaceWizardPageContribution(
-													wizardPage, target));
-								} else if (type.equals("new")) { //$NON-NLS-1$
-									boolean insertAfter = true;
-									if (insert != null
-											&& insert.equals("before")) { //$NON-NLS-1$
-										insertAfter = false;
-									}
-									wizardExtender
-											.addNewWizardPageContribution(new NewWizardPageContribution(
-													wizardPage, target,
-													insertAfter));
-								}
-							}
-						}
-
-						return;
-					}
-				} catch (Exception e) {
-					EPFUIPlugin.getDefault().getLogger().logError(e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Gets all the new wizard pages.
-	 */
-	protected void getNewWizardPages(List<IWizardPage> wizardPages) {
-		List<INewWizardPageContribution> contributions = wizardExtender
-				.getNewWizardPageContributions();
-		if (contributions != null) {
-			for (Iterator<INewWizardPageContribution> it = contributions
-					.iterator(); it.hasNext();) {
-				NewWizardPageContribution contribution = (NewWizardPageContribution) it
-						.next();
-				IWizardPage newWizardPage = (IWizardPage) contribution
-						.getWizardPage();
-				String targetWizardPageName = contribution
-						.getTargetWizardPage();
-				if (targetWizardPageName != null) {
-					int totalPages = wizardPages.size();
-					int index = 0;
-					for (Iterator<IWizardPage> iter = wizardPages.iterator(); wizardPages
-							.size() == totalPages
-							&& iter.hasNext();) {
-						IWizardPage page = iter.next();
-						if (page.getName().equals(targetWizardPageName)) {
-							if (contribution.getInsertAfter()) {
-								wizardPages.add(index + 1, newWizardPage);
-							} else {
-								wizardPages.add(index, newWizardPage);
-							}
-						}
-						index++;
-					}
-					if (wizardPages.size() == totalPages) {
-						wizardPages.add(newWizardPage);
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/BaseWizardPage.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/BaseWizardPage.java
deleted file mode 100644
index 3aecedb..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/BaseWizardPage.java
+++ /dev/null
@@ -1,581 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import org.eclipse.epf.ui.util.SWTUtil;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * The abstract base class for all EPF wizard pages.
- * 
- * @author Kelvin Low
- * @author Bingxue Xu
- * @since 1.0
- */
-public abstract class BaseWizardPage extends WizardPage {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param pageName
-	 *            the wizard page name
-	 */
-	protected BaseWizardPage(String pageName) {
-		super(pageName);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param name
-	 *            the wizard page name
-	 * @param title
-	 *            the wizard page title
-	 * @param description
-	 *            the wizard page description
-	 * @param titleImage
-	 *            the wizard page title image
-	 */
-	public BaseWizardPage(String pageName, String title, String description,
-			ImageDescriptor titleImage) {
-		super(pageName, title, titleImage);
-		setDescription(description);
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		onEnterPage(null);
-	}
-	
-	/**
-	 * Called when entering this wizard page.
-	 * 
-	 * @param obj
-	 *            a data initialization object
-	 */
-	public void onEnterPage(Object obj) {
-	}
-
-	/**
-	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
-	 */
-	public IWizardPage getNextPage() {
-		IWizardPage nextPage = super.getNextPage();
-		if (nextPage != null && nextPage instanceof BaseWizardPage) {
-			try {
-				((BaseWizardPage) nextPage).onEnterPage(getNextPageData());
-			} catch (Exception e) {
-			}
-		}
-		return nextPage;
-	}
-
-	/**
-	 * Gets the data initialization object for the next wizard page.
-	 * 
-	 * @return an <code>Object</code>
-	 */
-	public Object getNextPageData() {
-		return null;
-	}
-
-	/**
-	 * Creates a composite with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the composite will take up
-	 * @return a <code>Composite</code> object
-	 */
-	protected static Composite createGridLayoutComposite(Composite parent,
-			int column) {
-		return SWTUtil.createGridLayoutComposite(parent, column);
-	}
-
-	/**
-	 * Creates a child composite with a grid layout.
-	 * <p>
-	 * The child composite will be indented from the parent composite.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the composite will take up
-	 * @return a <code>Composite</code> object
-	 */
-	protected static Composite createChildGridLayoutComposite(Composite parent,
-			int column) {
-		return SWTUtil.createChildGridLayoutComposite(parent, column);
-	}
-
-	/**
-	 * Creates a group with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the group
-	 * @param column
-	 *            the number of column cells that the group will take up
-	 * @return a <code>Group</code> object
-	 */
-	protected static Group createGridLayoutGroup(Composite parent, String text,
-			int column) {
-		return SWTUtil.createGridLayoutGroup(parent, text, column);
-	}
-
-	/**
-	 * Creates a group with a grid layout.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the group
-	 * @param column
-	 *            the number of column cells that the group will take up
-	 * @param equalColumnWidth
-	 *            flag to indicate whether column cells should be same width or
-	 *            not
-	 * @return a <code>Group</code> object
-	 */
-	protected static Group createGridLayoutGroup(Composite parent, String text,
-			int column, boolean equalColumnWidth) {
-		return SWTUtil.createGridLayoutGroup(parent, text, column,
-				equalColumnWidth);
-	}
-
-	/**
-	 * Creates a label.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @param column
-	 *            the number of column cells that the label will take up
-	 * @return a <code>Label</code> object
-	 */
-	protected static Label createLabel(Composite parent, String text, int column) {
-		return SWTUtil.createLabel(parent, text, column);
-	}
-
-	/**
-	 * Creates a label that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @return a <code>Label</code> object
-	 */
-	protected static Label createLabel(Composite parent, String text) {
-		return SWTUtil.createLabel(parent, text);
-	}
-
-	/**
-	 * Creates a vertically aligned label that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the label
-	 * @return a <code>Label</code> object
-	 */
-	protected static Label createVerticallyAlignedLabel(Composite parent,
-			String text) {
-		return SWTUtil.createVerticallyAlignedLabel(parent, text);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText, int widthHint, int heightHint, int column) {
-		return SWTUtil.createEditableText(parent, defaultText, widthHint,
-				heightHint, column);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	public static Text createEditableText(Composite parent, int widthHint,
-			int heightHint, int column) {
-		return SWTUtil
-				.createEditableText(parent, widthHint, heightHint, column);
-	}
-
-	/**
-	 * Creates a readonly text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createText(Composite parent, String defaultText,
-			int widthHint, int column) {
-		return SWTUtil.createText(parent, defaultText, widthHint, column);
-	}
-
-	/**
-	 * Creates an readonly text control that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createText(Composite parent, String defaultText) {
-		return SWTUtil.createText(parent, defaultText);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText, int widthHint, int column) {
-		return SWTUtil.createEditableText(parent, defaultText, widthHint,
-				column);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText, int widthHint) {
-		return SWTUtil.createEditableText(parent, defaultText, widthHint);
-	}
-
-	/**
-	 * Creates an editable text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent, int column) {
-		return SWTUtil.createEditableText(parent, column);
-	}
-
-	/**
-	 * Creates an editable text control that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent,
-			String defaultText) {
-		return SWTUtil.createEditableText(parent, defaultText);
-	}
-
-	/**
-	 * Creates an empty editable text control that only takes up one column
-	 * cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createEditableText(Composite parent) {
-		return SWTUtil.createEditableText(parent);
-	}
-
-	/**
-	 * Creates a readonly multi-line text control.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param defaultText
-	 *            the default text for the control
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Text</code> object
-	 */
-	protected static Text createMultiLineText(Composite parent,
-			String defaultText, int widthHint, int heightHint, int column) {
-		return SWTUtil.createMultiLineText(parent, defaultText, widthHint,
-				heightHint, column);
-	}
-
-	/**
-	 * Creates an combobox.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Combo</code> object
-	 */
-	protected static Combo createCombobox(Composite parent, int column) {
-		return SWTUtil.createCombobox(parent, column);
-	}
-
-	/**
-	 * Creates an combobox that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return a <code>Combo</code> object
-	 */
-	protected static Combo createCombobox(Composite parent) {
-		return SWTUtil.createCombobox(parent);
-	}
-
-	/**
-	 * Creates a button.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createButton(Composite parent, String text) {
-		return SWTUtil.createButton(parent, text);
-	}
-
-	/**
-	 * Creates a checkbox.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createCheckbox(Composite parent, String text,
-			int column) {
-		return SWTUtil.createCheckbox(parent, text, column);
-	}
-
-	/**
-	 * Creates a checkbox that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createCheckbox(Composite parent, String text) {
-		return SWTUtil.createCheckbox(parent, text);
-	}
-
-	/**
-	 * Creates an radio button.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @param selected
-	 *            if <code>true</code>, select the radio button by default
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createRadioButton(Composite parent, String text,
-			int column, boolean selected) {
-		return SWTUtil.createRadioButton(parent, text, column, selected);
-	}
-
-	/**
-	 * Creates an radio button that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param text
-	 *            the text for the control
-	 * @return a <code>Button</code> object
-	 */
-	protected static Button createRadioButton(Composite parent, String text) {
-		return SWTUtil.createRadioButton(parent, text);
-	}
-
-	/**
-	 * Creates a readonly text viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>TextViewer</code> object
-	 */
-	protected static TextViewer createTextViewer(Composite parent,
-			int widthHint, int heightHint, int column) {
-		return SWTUtil.createTextViewer(parent, widthHint, heightHint, column);
-	}
-
-	/**
-	 * Creates a readonly text viewer that only takes up one column cell.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @return a <code>TextViewer</code> object
-	 */
-	protected static TextViewer createTextViewer(Composite parent) {
-		return SWTUtil.createTextViewer(parent);
-	}
-
-	/**
-	 * Creates a table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>TableViewer</code> object
-	 */
-	protected static TableViewer createTableViewer(Composite parent,
-			int widthHint, int heightHint, int column) {
-		return SWTUtil.createTableViewer(parent, widthHint, heightHint, column);
-	}
-
-	/**
-	 * Creates a checkbox table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param widthHint
-	 *            the preferred width (in pixels) for the control
-	 * @param heightHint
-	 *            the preferred height (in pixels) for the control
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>CheckboxTableViewer</code> object
-	 */
-	protected static CheckboxTableViewer createCheckboxTableViewer(
-			Composite parent, int widthHint, int heightHint, int column) {
-		return SWTUtil.createCheckboxTableViewer(parent, widthHint, heightHint,
-				column);
-	}
-
-	/**
-	 * Creates a checkbox table viewer.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the control will take up
-	 * @return a <code>CheckboxTableViewer</code> object
-	 */
-	protected static CheckboxTableViewer createCheckboxTableViewer(
-			Composite parent, int column) {
-		return SWTUtil.createCheckboxTableViewer(parent, 360, 175, column);
-	}
-
-	/**
-	 * Creates a line.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 * @param column
-	 *            the number of column cells that the line will take up
-	 * @return a <code>Label</code> object
-	 */
-	protected static Label createLine(Composite parent, int column) {
-		return SWTUtil.createLine(parent, column);
-	}
-
-	/**
-	 * Checks whether a text control has some text.
-	 * 
-	 * @param control
-	 *            the text control
-	 * @return <code>true</code> if the text control has some text,
-	 *         <code>false</code> otherwise
-	 */
-	protected static boolean isNonEmptyText(Text control) {
-		return SWTUtil.isNonEmptyText(control);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/INewWizardPageContribution.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/INewWizardPageContribution.java
deleted file mode 100644
index 31df6d6..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/INewWizardPageContribution.java
+++ /dev/null
@@ -1,47 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * The interface for a new wizard page contribution.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public interface INewWizardPageContribution {
-
-	/**
-	 * Gets the new wizard page that is being added to a wizard.
-	 * 
-	 * @return a <code>IWizardPage</code> object
-	 */
-	public IWizardPage getWizardPage();
-
-	/**
-	 * Gets the name of the base wizard page that is used as a reference for
-	 * inserting the new wizard page.
-	 * 
-	 * @return the name of the referenced base wizard page
-	 */
-	public String getTargetWizardPage();
-
-	/**
-	 * Gets the insertion option for the new wizard page.
-	 * 
-	 * @return <code>true</code> if the new wizard page should be inserted
-	 *         after the target wizard page; <code>false</code> if it should
-	 *         be inserted before the target wizard page
-	 */
-	public boolean getInsertAfter();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/IReplaceWizardPageContribution.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/IReplaceWizardPageContribution.java
deleted file mode 100644
index 587bd13..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/IReplaceWizardPageContribution.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * The interface for a replace wizard page contribution.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public interface IReplaceWizardPageContribution {
-
-	/**
-	 * Gets the wizard page that replaces a specific wizard page in a wizard.
-	 * 
-	 * @return a <code>IWizardPage</code> object
-	 */
-	public IWizardPage getWizardPage();
-
-	/**
-	 * Gets the name of the base wizard page that is should be replaced.
-	 * 
-	 * @return the name of the referenced base wizard page
-	 */
-	public String getTargetWizardPage();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/IWizardExtender.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/IWizardExtender.java
deleted file mode 100644
index 1dfe795..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/IWizardExtender.java
+++ /dev/null
@@ -1,100 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import java.util.List;
-
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-
-/**
- * The interface for a generic wizard extender.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public interface IWizardExtender {
-
-	/**
-	 * Gives the wizard extender a chance to perform some initialization.
-	 */
-	public void init(Wizard wizard);
-
-	/**
-	 * Gives the wizard extender a chance to save references to wizard pages.
-	 * 
-	 * @param wizardPages
-	 *            a collection of <code>IWizardPage</code> owned by the wizard
-	 */
-	public void initWizardPages(List<IWizardPage> wizardPages);
-
-	/**
-	 * Adds a replace wizard page contribition.
-	 * 
-	 * @param contribution
-	 *            the replace wizard page contribution
-	 */
-	public void addReplaceWizardPageContribution(
-			IReplaceWizardPageContribution contribution);
-
-	/**
-	 * Gets the wizard page that replaces a base wizard page.
-	 * 
-	 * @param target
-	 *            the name of the base wizard to be replaced
-	 * @return a <code>IWizardPage</code> object or <code>null</code> if no
-	 *         replacement page is available
-	 */
-	public IWizardPage getReplaceWizardPage(String target);
-
-	/**
-	 * Adds a new wizard page contribution.
-	 * 
-	 * @param contribution
-	 *            the new wizard page contribution
-	 */
-	public void addNewWizardPageContribution(
-			INewWizardPageContribution contribution);
-
-	/**
-	 * Gets an array of new wizard pages to be added to a base wizard.
-	 * 
-	 * @return an collection of <code>NewWizardPageExetnsion</code> objects or
-	 *         <code>null</code>
-	 */
-	public List<INewWizardPageContribution> getNewWizardPageContributions();
-
-	/**
-	 * Allows a wizard extender to control the flow of the wizard pages.
-	 * 
-	 * @param page
-	 *            the current wizard page
-	 * @return the next wizard page
-	 */
-	public IWizardPage getNextPage(IWizardPage page);
-
-	/**
-	 * Allows a wizard extender to decide whether the wizard could be finished
-	 * without further user interaction.
-	 * 
-	 * @return <code>true</code> if the wizard could be finished
-	 */
-	public boolean canFinish();
-
-	/**
-	 * Allows a wizard extender to perform the finish operation.
-	 * 
-	 * @return <code>true</code> if the finish operation is executed
-	 *         successfully
-	 */
-	public boolean doFinish();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/NewWizardPageContribution.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/NewWizardPageContribution.java
deleted file mode 100644
index f07b593..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/NewWizardPageContribution.java
+++ /dev/null
@@ -1,75 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * The default new wizard page contribution implementation.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class NewWizardPageContribution implements INewWizardPageContribution {
-
-	private IWizardPage page;
-
-	private String target;
-
-	private boolean insertAfter = true;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param page
-	 *            the new wizard page
-	 * @param target
-	 *            the name of the base wizard page that is used as a reference
-	 *            for insering the new wizard page
-	 * @param insertAfter
-	 *            if <code>true</code>, insert the new wizard page after the
-	 *            target wizard page; if <code>false</code>, insert the new
-	 *            wizard page before the target wizard page
-	 */
-	public NewWizardPageContribution(IWizardPage page, String target,
-			boolean insertAfter) {
-		this.page = page;
-		this.target = target;
-		this.insertAfter = insertAfter;
-	}
-
-	/**
-	 * Gets the wizard page.
-	 */
-	public IWizardPage getWizardPage() {
-		return page;
-	}
-
-	/**
-	 * Gets the name of the base wizard page that is used as a reference for
-	 * inserting the new wizard page
-	 */
-	public String getTargetWizardPage() {
-		return target;
-	}
-
-	/**
-	 * Gets the insertion option for the new wizard page.
-	 * 
-	 * @return <code>true</code> if the new wizard page should be inserted
-	 *         after the target wizard page; <code>false</code> if it should
-	 *         be inserted before the target wizard page
-	 */
-	public boolean getInsertAfter() {
-		return insertAfter;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/ReplaceWizardPageContribution.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/ReplaceWizardPageContribution.java
deleted file mode 100644
index 259b1d3..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/ReplaceWizardPageContribution.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * The default replacement wizard page contribution implementation.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class ReplaceWizardPageContribution implements
-		IReplaceWizardPageContribution {
-
-	private IWizardPage page;
-
-	private String target;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param page
-	 *            the wizard page that replaces a specific wizard page in a
-	 *            wizard
-	 * @param target
-	 *            the name of the base wizard page that is should be replaced
-	 */
-	public ReplaceWizardPageContribution(IWizardPage page, String target) {
-		this.page = page;
-		this.target = target;
-	}
-
-	/**
-	 * Gets the wizard page that replaces a specific wizard page in a wizard.
-	 * 
-	 * @return a <code>IWizardPage</code> object
-	 */
-	public IWizardPage getWizardPage() {
-		return page;
-	}
-
-	/**
-	 * Gets the name of the base wizard page that is should be replaced.
-	 * 
-	 * @return the name of the referenced base wizard page
-	 */
-	public String getTargetWizardPage() {
-		return target;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/WizardCategories.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/WizardCategories.java
deleted file mode 100644
index fd60af8..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/WizardCategories.java
+++ /dev/null
@@ -1,36 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-/**
- * The EPF wizard categories.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class WizardCategories {
-
-	/**
-	 * The New Wizards Category.
-	 */
-	public static final String NEW_WIZARDS_CATEGORY = "org.eclipse.epf.ui.newWizards.category"; //$NON-NLS-1$
-
-	/**
-	 * The Export Wizards Category.
-	 */
-	public static final String EXPORT_WIZARDS_CATEGORY = "org.eclipse.epf.ui.exportWizards.category"; //$NON-NLS-1$
-
-	/**
-	 * The Import Wizards Category.
-	 */
-	public static final String IMPORT_WIZARDS_CATEGORY = "org.eclipse.epf.ui.importWizards.category"; //$NON-NLS-1$
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/WizardExtender.java b/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/WizardExtender.java
deleted file mode 100644
index c9c5084..0000000
--- a/1.5/plugins/org.eclipse.epf.ui/src/org/eclipse/epf/ui/wizards/WizardExtender.java
+++ /dev/null
@@ -1,107 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.ui.wizards;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-
-/**
- * The default wizard extender implementation.
- * 
- * @author Kelvin Low
- * @since 1.2
- */
-public class WizardExtender implements IWizardExtender {
-
-	protected Wizard wizard;
-
-	protected Map<String, IWizardPage> replaceWizardPages = new HashMap<String, IWizardPage>();
-
-	protected List<INewWizardPageContribution> newWizardPageContribitions = new ArrayList<INewWizardPageContribution>();
-
-	/**
-	 * Creates a new instance.
-	 */
-	public WizardExtender() {
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#init(Wizard)
-	 */
-	public void init(Wizard wizard) {
-		this.wizard = wizard;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#init(Wizard)
-	 */
-	public void initWizardPages(List<IWizardPage> wizardPages) {
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#addReplaceWizardPageContribution(IReplaceWizardPageContribution)
-	 */
-	public void addReplaceWizardPageContribution(
-			IReplaceWizardPageContribution contribution) {
-		replaceWizardPages.put(contribution.getTargetWizardPage(), contribution
-				.getWizardPage());
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#getReplaceWizardPage(String)
-	 */
-	public IWizardPage getReplaceWizardPage(String target) {
-		return (IWizardPage) replaceWizardPages.get(target);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#addNewWizardPageContribution(INewWizardPageContribution)
-	 */
-	public void addNewWizardPageContribution(
-			INewWizardPageContribution contribution) {
-		newWizardPageContribitions.add(contribution);
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#getNewWizardPageContributions()
-	 */
-	public List<INewWizardPageContribution> getNewWizardPageContributions() {
-		return newWizardPageContribitions;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#getNextPage(IWizardPage)
-	 */
-	public IWizardPage getNextPage(IWizardPage page) {
-		// Let the base wizard drives the page flow.
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#canFinish()
-	 */
-	public boolean canFinish() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.epf.ui.wizards.IWizardExtender#doFinish()
-	 */
-	public boolean doFinish() {
-		return true;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/.classpath b/1.5/plugins/org.eclipse.epf.uma.ecore/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/.project b/1.5/plugins/org.eclipse.epf.uma.ecore/.project
deleted file mode 100644
index 5859a7c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.uma.ecore</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.uma.ecore/META-INF/MANIFEST.MF
deleted file mode 100644
index 91c1d99..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.uma.ecore
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources,
- org.eclipse.core.runtime,
- org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.emf.ecore.sdo;visibility:=reexport
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.uma.ecore,
- org.eclipse.epf.uma.ecore.impl,
- org.eclipse.epf.uma.ecore.util
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/build.properties b/1.5/plugins/org.eclipse.epf.uma.ecore/build.properties
deleted file mode 100644
index 37d9849..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/plugin.properties b/1.5/plugins/org.eclipse.epf.uma.ecore/plugin.properties
deleted file mode 100644
index 9d4f4c1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF UMA Ecore Extension
-providerName=Eclipse.org
-
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IModelObject.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IModelObject.java
deleted file mode 100644
index f0c82e5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IModelObject.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore;
-
-import java.util.Collection;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * An interface supported by all UMA model objects.
- * <p>
- * This interface provides dynamic bidirectional relationships support between
- * model objects through the use of opposite features. It also allows the
- * default value of a feature, as defined in a metal model, to be overwritten.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IModelObject extends EDataObject {
-
-	/**
-	 * Gets the default value of a feature.
-	 * <p>
-	 * This method provides a way to query the overriden default value defined in the
-	 * meta-model for a UMA class.
-	 * 
-	 * @param feature
-	 *            a feature
-	 * @return the default value for the specified feature
-	 */
-	public Object getDefaultValue(EStructuralFeature feature);
-
-	/**
-	 * Gets the value of an opposite feature.
-	 * 
-	 * @param feature
-	 *            an opposite feature
-	 * @return the value for the specified opposite feature
-	 */
-	public Object getOppositeFeatureValue(OppositeFeature feature);
-
-	/**
-	 * Gets all the opposite features associated with this model object.
-	 * 
-	 * @return a collection of opposite features
-	 */
-	public Collection getOppositeFeatures();
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IProxyResolutionListener.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IProxyResolutionListener.java
deleted file mode 100644
index 20b07f8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IProxyResolutionListener.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore;
-
-/**
- * The interface for a proxy resolution listener attached to a UMA resource set.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IProxyResolutionListener {
-
-	/**
-	 * Receives notification of an exception that has occurred while resolving a
-	 * proxy object.
-	 * 
-	 * @param e
-	 *            the exception that has occurred
-	 */
-	void notifyException(Exception e);
-
-	/**
-	 * Receives notification that a proxy has been resolved successfully.
-	 * 
-	 * @param proxy
-	 *            a proxy object
-	 * @param resolved
-	 *            the resolved object
-	 */
-	void proxyResolved(Object proxy, Object resolved);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IUmaResourceSet.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IUmaResourceSet.java
deleted file mode 100644
index 57075a3..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/IUmaResourceSet.java
+++ /dev/null
@@ -1,40 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-/**
- * The interface for a UMA resource set.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public interface IUmaResourceSet extends ResourceSet {
-
-	/**
-	 * Gets the model object resolved by a URI.
-	 * 
-	 * @param resolver
-	 *            the proxy resolver
-	 * @param uri
-	 *            the URI used to resolve the proxy
-	 * @param loadOnDemand
-	 *            if <code>true</code>, create and load the resource if it
-	 *            does not exists
-	 * @return the model object resolved by the URI
-	 * @see org.eclipse.emf.ecore.resource.ResourceSet#getEObject(EObject, URI, boolean)
-	 */
-	EObject getEObject(EObject resolver, URI uri, boolean loadOnDemand);
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/ResolveException.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/ResolveException.java
deleted file mode 100644
index 7e09be0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/ResolveException.java
+++ /dev/null
@@ -1,118 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-
-/**
- * Signals that an error has occurred while resolving a proxy object.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class ResolveException extends WrappedException {
-
-	private static final long serialVersionUID = 3258412815814636081L;
-
-	private EObject proxy;
-
-	private EObject resolver;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param proxy
-	 *            a proxy object
-	 * @param msg
-	 *            an error message
-	 * @param resolver
-	 *            the proxy resolver
-	 */
-	public ResolveException(EObject proxy, String msg, EObject resolver) {
-		super(msg, null);
-		this.proxy = proxy;
-		this.resolver = resolver;
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param proxy
-	 *            a proxy object
-	 * @param exception
-	 *            the exception that was thrown
-	 */
-	public ResolveException(EObject proxy, Exception exception, EObject resolver) {
-		super(exception);
-		this.proxy = proxy;
-		this.resolver = resolver;
-	}
-
-	/**
-	 * Returns the proxy object.
-	 * 
-	 * @return the proxy object
-	 */
-	public EObject getProxy() {
-		return proxy;
-	}
-
-	/**
-	 * Returns the proxy resolver.
-	 * 
-	 * @return the proxy resolver
-	 */
-	public EObject getResolver() {
-		return resolver;
-	}
-
-	/**
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof ResolveException) {
-			ResolveException re = (ResolveException) obj;
-			if ((resolver == re.resolver) || (resolver == null && re.resolver == null)) {
-				if (proxy == re.proxy) {
-					return true;
-				}
-				if (proxy instanceof InternalEObject) {
-					URI uri = ((InternalEObject) proxy).eProxyURI();
-					if (uri != null && re.proxy instanceof InternalEObject) {
-						return uri.equals(((InternalEObject) re.proxy)
-								.eProxyURI());
-					}
-				}
-			}
-		}
-		return super.equals(obj);
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		if (proxy instanceof InternalEObject) {
-			int hc = resolver == null ? 0 : resolver.hashCode();
-			URI uri = ((InternalEObject) proxy).eProxyURI();
-			if (uri != null) {
-				return (Integer.toString(hc) + uri).hashCode();
-			}
-			return hc;
-		}
-		return super.hashCode();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/MultiResourceEObject.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/MultiResourceEObject.java
deleted file mode 100644
index 167f83e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/MultiResourceEObject.java
+++ /dev/null
@@ -1,910 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.impl;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.CommonPlugin;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-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.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.Resource.Internal;
-import org.eclipse.emf.ecore.sdo.impl.EDataObjectImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.ecore.IModelObject;
-import org.eclipse.epf.uma.ecore.IProxyResolutionListener;
-import org.eclipse.epf.uma.ecore.IUmaResourceSet;
-import org.eclipse.epf.uma.ecore.ResolveException;
-import org.eclipse.epf.uma.ecore.util.DefaultValueManager;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.ecore.util.OppositeFeatureResolvingEList;
-
-/**
- * The base class for all UMA model objects.
- * <p>
- * By default, EMF stores model objects related via a containment relationship
- * in a single XMI file. This class extends the default EMF persistence behavior
- * by providing a mechanism for the containing and contained objects to be
- * stored in separate XMI files. Contained objects are lazy loaded, when
- * required, similar to the proxy object behavior of EMF's standard resource
- * implementation.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MultiResourceEObject extends EDataObjectImpl implements
-		IModelObject {
-
-	private static final long serialVersionUID = 3258126947153097273L;
-	
-	private static final DefaultValueManager defaultValueManager = DefaultValueManager.INSTANCE;
-	
-	/**
-	 * Sets the default value for a feature.
-	 * <p>
-	 * Note: This method is designed for migration use only. Do not call this
-	 * method to override the default value of a feature since it will slow down
-	 * the loading of a method library.
-	 * 
-	 * @param feature
-	 *            a feature
-	 * @param defaultValue
-	 *            the default value for the feature
-	 */
-	public static final void setDefaultValue(EStructuralFeature feature,
-			Object defaultValue) {		
-		setDefaultValue(feature.getEContainingClass(), feature, defaultValue);
-	}
-	
-	public static final synchronized void setDefaultValue(EClass type, EStructuralFeature feature, Object defaultValue) {
-		defaultValueManager.setDefaultValue(type, feature, defaultValue);
-	}
-	
-	/**
-	 * Removes the default value for a feature.
-	 * <p>
-	 * Note: This method is designed for migration use only. Do not call this
-	 * method to override the default value of a feature since it will slow down
-	 * the loading of a method library.
-	 * 
-	 * @param feature
-	 *            a feature
-	 */
-	public static final void removeDefaultValue(EStructuralFeature feature) {
-		defaultValueManager.removeDefaultValue(feature);
-	}
-	
-	public static final void removeDefaultValue(EStructuralFeature feature, EClass type) {
-		defaultValueManager.removeDefaultValue(feature, type);
-	}
-	
-	/**
-	 * A map of entries of OppositeFeature / OppositeFeature's value
-	 */
-	private Map oppositeFeatureMap;
-
-	private boolean hasOppositeFeature = true;
-
-	private Boolean notifyOpposite = null;
-
-	private boolean valid = true;
-
-	/**
-	 * Checks the validity of this object.
-	 * 
-	 * @return <code>true</code> if this object is valid
-	 */
-	public boolean isValid() {
-		return valid;
-	}
-
-	public void oppositeAdd(OppositeFeature oppositeFeature, Object object) {
-		List list = (List) getOppositeFeatureMap().get(oppositeFeature);
-		if (list == null) {
-			list = new OppositeFeatureResolvingEList(this, oppositeFeature);
-			getOppositeFeatureMap().put(oppositeFeature, list);
-		}
-		if (!list.contains(object)) {
-			list.add(object);
-		}
-	}
-
-	public void oppositeRemove(OppositeFeature oppositeFeature, Object object) {
-		List list = (List) getOppositeFeatureMap().get(oppositeFeature);
-		if (list == null) {
-			list = new OppositeFeatureResolvingEList(this, oppositeFeature);
-			getOppositeFeatureMap().put(oppositeFeature, list);
-		}
-		list.remove(object);
-	}
-
-	/**
-	 * Resolves the given proxy object.
-	 * 
-	 * @param object
-	 *            a proxy object to resolve
-	 * @return the resolved object
-	 */
-	public Object resolve(Object object) {
-		if (object instanceof InternalEObject
-				&& ((InternalEObject) object).eIsProxy()) {
-			return eResolveProxy((InternalEObject) object);
-		}
-		return object;
-	}
-
-	private void replace(EStructuralFeature feature, Object oldValue,
-			InternalEObject newValue) {
-		if (newValue != null && !newValue.eIsProxy() && newValue != oldValue) {
-			boolean notify = eDeliver();
-			try {
-				eSetDeliver(false);
-				EcoreUtil.replace(this, feature, oldValue, newValue);
-			} catch (Exception e) {
-				CommonPlugin.INSTANCE.log(e);
-				e.printStackTrace();
-				System.out.println("MultiResourceEObject.replace():");
-				System.out.println("  object: " + this);
-				System.out.println("  feature: " + feature);
-				System.out.println("  proxy: " + oldValue);
-				System.out.println("  resolved: " + newValue);
-			} finally {
-				eSetDeliver(notify);
-			}
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.notify.impl.BasicNotifierImpl#eNotify(org.eclipse.emf.common.notify.Notification)
-	 */
-	public void eNotify(Notification msg) {
-		/*
-		 * if(!OppositeFeature.isDeliverOnResolve() && msg.getEventType() ==
-		 * Notification.RESOLVE) { return; }
-		 */
-
-		if (msg.getEventType() == Notification.RESOLVE) {
-			return;
-		}
-		
-		Object f = msg.getFeature();
-		if (f instanceof EStructuralFeature) {
-			EStructuralFeature feature = (EStructuralFeature) f;
-			OppositeFeature oppositeFeature = OppositeFeature
-					.getOppositeFeature(feature);
-			if (oppositeFeature != null) {
-				MultiResourceEObject oldOtherEnd;
-				MultiResourceEObject otherEnd;
-				if (oppositeFeature.isMany()) {
-					switch (msg.getEventType()) {
-					case Notification.SET:
-						oldOtherEnd = (MultiResourceEObject) msg.getOldValue();
-						if (oppositeFeature.resolveOwner()) {
-							oldOtherEnd = (MultiResourceEObject) resolve(oldOtherEnd);
-						}
-						if (oldOtherEnd != null) {
-							oldOtherEnd.oppositeRemove(oppositeFeature, msg
-									.getNotifier());
-						}
-					case Notification.ADD:
-						otherEnd = (MultiResourceEObject) msg.getNewValue();
-						if (oppositeFeature.resolveOwner()) {
-							otherEnd = (MultiResourceEObject) resolve(otherEnd);
-							replace(feature, msg.getNewValue(), otherEnd);
-						}
-						if (otherEnd != null) {
-							otherEnd.oppositeAdd(oppositeFeature, msg
-									.getNotifier());
-						}
-						break;
-					case Notification.ADD_MANY:
-						for (Iterator iter = ((Collection) msg.getNewValue())
-								.iterator(); iter.hasNext();) {
-							Object obj = iter.next();
-							otherEnd = (MultiResourceEObject) obj;
-							if (oppositeFeature.resolveOwner()) {
-								otherEnd = (MultiResourceEObject) resolve(otherEnd);
-								replace(feature, obj, otherEnd);
-							}
-							otherEnd.oppositeAdd(oppositeFeature, msg
-									.getNotifier());
-						}
-						break;
-					case Notification.REMOVE:
-						otherEnd = (MultiResourceEObject) msg.getOldValue();
-						if (oppositeFeature.resolveOwner()) {
-							otherEnd = (MultiResourceEObject) resolve(otherEnd);
-						}
-						if (otherEnd != null)
-							otherEnd.oppositeRemove(oppositeFeature, msg
-									.getNotifier());
-						break;
-					case Notification.REMOVE_MANY:
-						for (Iterator iter = ((Collection) msg.getOldValue())
-								.iterator(); iter.hasNext();) {
-							otherEnd = (MultiResourceEObject) iter.next();
-							if (oppositeFeature.resolveOwner()) {
-								otherEnd = (MultiResourceEObject) resolve(otherEnd);
-							}
-							otherEnd.oppositeRemove(oppositeFeature, msg
-									.getNotifier());
-						}
-						break;
-					}
-				} else {
-					switch (msg.getEventType()) {
-					case Notification.ADD_MANY:
-						for (Iterator iter = ((Collection) msg.getNewValue())
-								.iterator(); iter.hasNext();) {
-							Object obj = iter.next();
-							otherEnd = (MultiResourceEObject) obj;
-							if (oppositeFeature.resolveOwner()) {
-								otherEnd = (MultiResourceEObject) resolve(otherEnd);
-								replace(feature, obj, otherEnd);
-							}
-							if (otherEnd != null) {
-								EObject oldValue = (EObject) otherEnd
-										.getOppositeFeatureMap().get(
-												oppositeFeature);
-								if (oldValue != null) {
-									// remove otherEnd from target feature of
-									// oldValue
-									((Collection) oldValue
-											.eGet((EStructuralFeature) f))
-											.remove(otherEnd);
-								}
-								otherEnd.getOppositeFeatureMap().put(
-										oppositeFeature, msg.getNotifier());
-							}
-						}
-						break;
-					case Notification.REMOVE_MANY:
-						for (Iterator iter = ((Collection) msg.getOldValue())
-								.iterator(); iter.hasNext();) {
-							otherEnd = (MultiResourceEObject) iter.next();
-							if (oppositeFeature.resolveOwner()) {
-								otherEnd = (MultiResourceEObject) resolve(otherEnd);
-							}
-							otherEnd.getOppositeFeatureMap().put(
-									oppositeFeature, null);
-						}
-						break;
-					case Notification.ADD:
-						otherEnd = (MultiResourceEObject) msg.getNewValue();
-						if (oppositeFeature.resolveOwner()) {
-							otherEnd = (MultiResourceEObject) resolve(otherEnd);
-							replace(feature, msg.getNewValue(), otherEnd);
-						}
-						if (otherEnd != null) {
-							EObject oldValue = (EObject) otherEnd
-									.getOppositeFeatureMap().get(
-											oppositeFeature);
-							if (oldValue != null) {
-								// remove otherEnd from target feature of
-								// oldValue
-								((Collection) oldValue
-										.eGet((EStructuralFeature) f))
-										.remove(otherEnd);
-							}
-							otherEnd.getOppositeFeatureMap().put(
-									oppositeFeature, msg.getNotifier());
-						}
-						break;
-					case Notification.SET:
-						otherEnd = (MultiResourceEObject) msg.getNewValue();
-						if (oppositeFeature.resolveOwner()) {
-							otherEnd = (MultiResourceEObject) resolve(otherEnd);
-							replace(feature, msg.getNewValue(), otherEnd);
-						}
-						if (otherEnd != null) {
-							EObject oldValue = (EObject) otherEnd
-									.getOppositeFeatureMap().get(
-											oppositeFeature);
-							if (oldValue != null) {
-								// set the target feature of oldValue to null
-								oldValue.eSet((EStructuralFeature) f, null);
-							}
-							otherEnd.getOppositeFeatureMap().put(
-									oppositeFeature, msg.getNotifier());
-						}
-						else {
-							EStructuralFeature targetFeature = (EStructuralFeature) f;
-							if(!targetFeature.isMany()) {
-								oldOtherEnd = (MultiResourceEObject) msg.getOldValue();
-								if(oldOtherEnd != null) {
-									oldOtherEnd.getOppositeFeatureMap().put(oppositeFeature, null);
-								}
-							}
-						}
-						break;
-					case Notification.REMOVE:
-						// case Notification.UNSET:
-						otherEnd = (MultiResourceEObject) msg.getOldValue();
-						if (oppositeFeature.resolveOwner()) {
-							otherEnd = (MultiResourceEObject) resolve(otherEnd);
-						}
-						if (otherEnd != null)
-							otherEnd.getOppositeFeatureMap().put(
-									oppositeFeature, null);
-						break;
-
-					}
-				}
-			}
-		}
-
-		super.eNotify(msg);
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.notify.impl.BasicNotifierImpl#eNotificationRequired()
-	 */
-	public boolean eNotificationRequired() {
-		if (!eDeliver())
-			return false;
-
-		Resource resource = eResource();
-		if (resource != null && !resource.eDeliver())
-			return false;
-
-		if (notifyOpposite == null) {
-			if (OppositeFeature.featureOppositeFeatureMap.isEmpty()) {
-				notifyOpposite = Boolean.FALSE;
-			} else {
-				Collection features = OppositeFeature.featureOppositeFeatureMap
-						.keySet();
-				for (Iterator iter = eClass().getEAllReferences().iterator(); iter
-						.hasNext();) {
-					if (features.contains(iter.next())) {
-						notifyOpposite = Boolean.TRUE;
-						break;
-					}
-				}
-				if (notifyOpposite == null) {
-					notifyOpposite = Boolean.FALSE;
-				}
-			}
-		}
-		if (notifyOpposite.booleanValue())
-			return true;
-		return super.eNotificationRequired();
-	}
-
-	/*
-	 * private void removeChildResources() { List children = eContents(); int
-	 * size = children.size(); for (int i = 0; i < size; i++) {
-	 * MultiResourceEObject child = (MultiResourceEObject) children.get(i);
-	 * Resource resource = child.eResource(); if (resource != null && resource !=
-	 * eResource()) { child.removeChildResources(); } ((InternalEList)
-	 * resource.getContents()).basicRemove(this, null);
-	 * child.eProperties().setEResource(null); } }
-	*/
-
-	/**
-	 * @see org.eclipse.emf.ecore.InternalEObject#eBasicSetContainer(org.eclipse.emf.ecore.InternalEObject,
-	 *      int, org.eclipse.emf.common.notify.NotificationChain)
-	 */
-	public NotificationChain eBasicSetContainer(InternalEObject newContainer,
-			int newContainerFeatureID, NotificationChain msgs) {
-		Resource.Internal oldResource = this.eDirectResource();
-		Resource.Internal newResource = newContainer == null ? null
-				: newContainer.eInternalResource();
-		// if (oldResource != newResource && oldResource != null) {
-		// removeChildResources();
-		// }
-
-		int oldIndex = -1;
-		int oldSize = -1;
-		if (oldResource != null) {
-			oldIndex = oldResource.getContents().indexOf(this);
-			oldSize = oldResource.getContents().size();
-		}
-
-		NotificationChain messages = super.eBasicSetContainer(newContainer,
-				newContainerFeatureID, msgs);
-		if (oldResource != newResource && oldResource != null) {
-			// remove any newly added ModificationTrackingAdapters from this
-			// object's adapter list
-			//
-			if (newResource != null)
-				newResource.detached(this);
-
-			// Override the default semantic: MultiResourceEObject is allowed to
-			// be owned by both container and resource.
-			// Add this object back to the old resource.
-			//
-			BasicEList contents = ((BasicEList) oldResource.getContents());
-			if (oldSize != contents.size()) {
-				// this object has been removed from the resource's contents
-				// add it back
-				//
-				if (contents.isEmpty()) {
-					// this will flag resource as loaded
-					//
-					contents.clear();
-					contents.setData(1, new Object[] { this });
-				} else {
-					Object[] data = contents.toArray();
-					Object[] newData = new Object[data.length + 1];
-					if (oldIndex > 0) {
-						System.arraycopy(data, 0, newData, 0, oldIndex);
-					}
-					newData[oldIndex] = this;
-					if (oldIndex < data.length) {
-						System.arraycopy(data, oldIndex, newData, oldIndex + 1,
-								data.length - oldIndex);
-					}
-					contents.setData(newData.length, newData);
-				}
-			}
-			eSetResource(oldResource);
-			// don't have to re-attach this object to oldResource since it was
-			// not dettached in super method
-			//
-			// oldResource.attached(this);
-
-			// if(newResource != null) newResource.attached(this);
-		}
-		return messages;
-	}
-
-	/**
-	 * Sets the container and container feature ID for this object only if it is
-	 * not contained by any container.
-	 * 
-	 * @see org.eclipse.emf.ecore.impl.BasicEObjectImpl#eBasicSetContainer(org.eclipse.emf.ecore.InternalEObject,
-	 *      int)
-	 */
-	public void eSetContainer(InternalEObject newContainer,
-			int newContainerFeatureID) {
-		EObject container = eInternalContainer();
-		if (container != null && !container.eIsProxy())
-			return;
-		super.eBasicSetContainer(newContainer, newContainerFeatureID);
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.impl.BasicEObjectImpl#eBasicSetContainer(org.eclipse.emf.ecore.InternalEObject,
-	 *      int)
-	 */
-	public void eBasicSetContainer(InternalEObject newContainer,
-			int newContainerFeatureID) {
-		super.eBasicSetContainer(newContainer, newContainerFeatureID);
-	}
-
-	/**
-	 * Sets the containing resource for this object.
-	 * 
-	 * @param res
-	 *            a resource
-	 */
-	public void eSetResource(Resource.Internal res) {
-		eProperties().setEResource(res);
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.impl.BasicEObjectImpl#eDirectResource()
-	 */
-	public Internal eDirectResource() {
-		return super.eDirectResource();
-	}
-
-	/**
-	 * Returns the resolved object represented by proxy. Proxy chains are
-	 * followed. If resourceSet is null, the global package registry is
-	 * consulted to obtain a package registered against the proxy URI, less its
-	 * fragment, in the same manner as the default resource set implementation's
-	 * fallback behaviour.
-	 * 
-	 * @param proxy
-	 *            the proxy to be resolved.
-	 * @param resourceSet
-	 *            the resource set in which to resolve.
-	 * @return the resolved object, or the proxy if unable to resolve.
-	 * @see org.eclipse.emf.ecore.util.EcoreUtil#resolve(org.eclipse.emf.ecore.EObject,
-	 *      org.eclipse.emf.ecore.resource.ResourceSet)
-	 */
-	private EObject resolveProxy(EObject proxy) {
-		ResourceSet resourceSet = eResource() != null ? eResource()
-				.getResourceSet() : null;
-
-		URI proxyURI = ((InternalEObject) proxy).eProxyURI();
-		if (proxyURI != null) {
-			try {
-				EObject resolvedObject = null;
-
-				if (resourceSet != null) {
-					if (resourceSet instanceof IUmaResourceSet) {
-						resolvedObject = ((IUmaResourceSet) resourceSet)
-								.getEObject(this, proxyURI, true);
-					} else {
-						resolvedObject = resourceSet.getEObject(proxyURI, true);
-					}
-				} else {
-					EPackage ePackage = EPackage.Registry.INSTANCE
-							.getEPackage(proxyURI.trimFragment().toString());
-					if (ePackage != null) {
-						Resource resource = ePackage.eResource();
-						if (resource != null) {
-							resolvedObject = resource.getEObject(proxyURI
-									.fragment().toString());
-						}
-					}
-				}
-
-				if (resolvedObject != null) {
-					if(resolvedObject != proxy) {
-//						return resolveProxy(resolvedObject);
-						return resolvedObject;
-					}
-				} else {
-					if (resourceSet instanceof IProxyResolutionListener) {
-						((IProxyResolutionListener) resourceSet)
-								.notifyException(new ResolveException(proxy,
-										(String) null, this));
-					}
-				}
-			} catch (RuntimeException exception) {
-				if (resourceSet instanceof IProxyResolutionListener) {
-					((IProxyResolutionListener) resourceSet)
-							.notifyException(new ResolveException(proxy,
-									exception, this));
-				}
-			}
-		}
-		return proxy;
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.InternalEObject#eResolveProxy(org.eclipse.emf.ecore.InternalEObject)
-	 */
-	public EObject eResolveProxy(InternalEObject proxy) {
-		EObject container = proxy.eContainer();
-		int featureID = proxy.eContainerFeatureID();
-		EObject result = null;
-
-		result = resolveProxy(proxy);
-
-		if (result != null && result instanceof MultiResourceEObject) {
-			if (proxy.eIsProxy() && result == proxy) {
-				// proxy could not be resolved
-				//
-				((MultiResourceEObject) result).valid = false;
-			} else {
-				((MultiResourceEObject) result).valid = true;
-
-				if (container != null) {
-					((MultiResourceEObject) result).eSetContainer(
-							(InternalEObject) container, featureID);
-				}
-
-				// merge the opposite feature map
-				//
-				if (result != proxy) {
-					if(proxy instanceof MultiResourceEObject) {
-						MultiResourceEObject myObj = (MultiResourceEObject) proxy;
-
-						if (myObj.oppositeFeatureMap != null
-								&& !myObj.oppositeFeatureMap.isEmpty()) {
-							Map newMap = ((MultiResourceEObject) result)
-							.getOppositeFeatureMap();
-							for (Iterator iter = myObj.getOppositeFeatureMap()
-									.entrySet().iterator(); iter.hasNext();) {
-								Map.Entry entry = (Map.Entry) iter.next();
-								if (entry.getValue() != null) {
-									OppositeFeature oppositeFeature = (OppositeFeature) entry
-									.getKey();
-									if (oppositeFeature.isMany()) {
-										List values = (List) newMap
-										.get(oppositeFeature);
-										if (values == null) {
-											newMap.put(oppositeFeature, entry
-													.getValue());
-										} else {
-											values.addAll((Collection) entry
-													.getValue());
-										}
-									} else {
-										newMap.put(oppositeFeature, entry
-												.getValue());
-									}
-								}
-							}
-							myObj.getOppositeFeatureMap().clear();
-						}
-					}
-					
-					ResourceSet resourceSet = eResource() != null ? eResource()
-							.getResourceSet() : null;
-					if (resourceSet instanceof IProxyResolutionListener) {
-						((IProxyResolutionListener) resourceSet).proxyResolved(
-								proxy, result);
-					}
-				}
-			}
-
-		}
-
-		return result;
-	}
-
-	private Map createOppositeFeatureMap() {
-		Map map = new HashMap();
-		for (Iterator iter = OppositeFeature.classOppositeFeaturesMap
-				.entrySet().iterator(); iter.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			Class cls = (Class) entry.getKey();
-			if (cls.isInstance(this)) {
-				for (Iterator iterator = ((Collection) entry.getValue())
-						.iterator(); iterator.hasNext();) {
-					map.put(iterator.next(), null);
-				}
-			}
-		}
-		if (map.isEmpty()) {
-			hasOppositeFeature = false;
-			return Collections.EMPTY_MAP;
-		}
-		return map;
-	}
-
-	/**
-	 * Gets the opposite feature map.
-	 * 
-	 * @return a map containing the opposite features mapped to their values
-	 */
-	public Map getOppositeFeatureMap() {
-		if (oppositeFeatureMap == null && hasOppositeFeature) {
-			oppositeFeatureMap = createOppositeFeatureMap();
-		}
-		if(oppositeFeatureMap == null) {
-			return Collections.EMPTY_MAP;
-		}
-		return oppositeFeatureMap;
-	}
-
-	/**
-	 * Gets the opposite feature map.
-	 * 
-	 * @return a map containing the opposite features mapped to their values or
-	 *         <code>null</code> if this object does not have any opposite
-	 *         feature or the map has not been created
-	 */
-	public Map basicGetOppositeFeatureMap() {
-		return oppositeFeatureMap;
-	}
-
-	/**
-	 * Gets the value of an opposite feature.
-	 * 
-	 * @param feature
-	 *            an opposite feature
-	 * @return the value for the opposite feature
-	 */
-	public Object getOppositeFeatureValue(OppositeFeature feature) {
-		Object value = getOppositeFeatureMap().get(feature);
-
-		// System.out.println("MultiResourceEObject.getOppositeFeatureValue():");
-		// System.out.println(" feature: " + feature);
-		// System.out.println(" value: " + value);
-		// System.out.println(" this: " + this);
-
-		if (feature.isMany()) {
-			if (value == null) {
-				return Collections.EMPTY_LIST;
-			}
-
-			return ((OppositeFeatureResolvingEList) value)
-					.getUnmodifiableList();
-		} else if (value instanceof EObject
-				&& ((EObject) value).eResource() == null) {
-			getOppositeFeatureMap().put(feature, null);
-			return null;
-		}
-
-		if (value instanceof InternalEObject
-				&& ((InternalEObject) value).eIsProxy()) {
-			EObject resolved = eResolveProxy((InternalEObject) value);
-			if (resolved != value) {
-				getOppositeFeatureMap().put(feature, resolved);
-				value = resolved;
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * Gets the resource at a given location.
-	 * 
-	 * @param location
-	 *            the resource location
-	 * @return a resource in the workspace
-	 */
-	public static IResource getResourceForLocation(String location) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IPath path = new Path(location);
-		IResource resource;
-		File file =  new File(location);
-		if (file.isFile()) {
-			resource = workspaceRoot.getFileForLocation(path);
-			if(resource == null) {
-				IResource parentResource = getResourceForLocation(file
-						.getParent());
-				if(parentResource != null) {
-					try {
-						parentResource.refreshLocal(IResource.DEPTH_ONE, null);
-					} catch (CoreException e) {
-						CommonPlugin.INSTANCE.log(e);
-					}
-					resource = workspaceRoot.getFileForLocation(path);
-				}
-			}
-		} else {
-			resource = workspaceRoot.getContainerForLocation(path);
-		}
-		return resource;
-	}
-
-//	/* (non-Javadoc)
-//	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-//	 */
-//	public Object getAdapter(Class adapter) {
-//		if(adapter == IResource.class) {
-//			Resource resource = eResource();
-//			if(resource != null) {
-//				return getResourceForLocation(resource.getURI().toFileString());
-//			}
-//		}
-//		return null;
-//	}
-	
-	/**
-	 * Removes all opposite features registered with the system.
-	 */
-	public void removeFromAllOppositeFeatures() {
-		// find all features that have opposite features and clear those
-		// features. This will remove the references to
-		// unloaded object by those opposite features
-		//
-		for (Iterator iter = eClass().getEAllReferences().iterator(); iter
-				.hasNext();) {
-			EReference ref = (EReference) iter.next();
-			OppositeFeature oppositeFeature = OppositeFeature.getOppositeFeature(ref);
-			if(oppositeFeature != null) {
-				if(ref.isMany()) {
-					List list = (List) eGet(ref, false);					
-					if(!list.isEmpty()) {
-						if(!oppositeFeature.resolveOwner()) {
-							list.clear();
-						}
-						else if(list instanceof InternalEList) {
-							List basicList = ((InternalEList)list).basicList();
-							for(int i = basicList.size() - 1; i > -1; i--) {
-								EObject e = (EObject) basicList.get(i);
-								if(!e.eIsProxy()) {
-									list.remove(e);
-								}
-							}
-						}
-					}
-				}
-				else {
-					EObject e = (EObject) eGet(ref, false);
-					if(e != null && !e.eIsProxy()) {
-						eSet(ref, null);
-					}
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.ecore.IModelObject#getOppositeFeatures()
-	 */
-	public Collection getOppositeFeatures() {
-		return getOppositeFeatureMap().keySet();
-	}
-
-	/**
-	 * @see org.eclipse.epf.uma.ecore.IModelObject#getDefaultValue(org.eclipse.emf.ecore.EStructuralFeature)
-	 */
-	public Object getDefaultValue(EStructuralFeature feature) {
-		Object value = getFeatureToDefaultValueMap().get(feature);
-		if(value == null) {
-			value = feature.getDefaultValue();
-		}
-		return value;
-	}
-	
-	private Map<EStructuralFeature, Object> getFeatureToDefaultValueMap() {
-		return defaultValueManager.getFeatureToDefaultValueMap(eClass());
-	}
-	
-	/**
-	 * Unregisters a feature whose default value has been overriden.
-	 * 
-	 * @param feature
-	 *            a feature
-	 */
-	public void removeFeatureWithOverridenDefaultValue(
-			EStructuralFeature feature) {
-		Map featureToDefaultValueMap = getFeatureToDefaultValueMap();
-		if(featureToDefaultValueMap != null) {
-			try {
-				featureToDefaultValueMap.remove(feature);
-			} catch (Exception e) {
-				//
-			}
-		}
-	}
-
-	/**
-	 * Reassign default values that are defined statically or dynamically for this class
-	 */
-	protected void reassignDefaultValues() {
-		defaultValueManager.assignDefaultValues(this);
-	}
-	
-	protected EStructuralFeature getFeatureWithOverridenDefaultValue(
-			int featureID) {
-		Map featureToDefaultValueMap = getFeatureToDefaultValueMap();
-		if(!featureToDefaultValueMap.isEmpty()) {
-			EStructuralFeature feature = eClass().getEStructuralFeature(
-					featureID);
-			if(feature != null && featureToDefaultValueMap.containsKey(feature)) {
-				return feature;
-			}
-		}
-		return null;
-	}
-	
-	protected boolean isFeatureWithOverridenDefaultValueSet(
-			EStructuralFeature feature) {
-		Object defaultValue = getDefaultValue(feature);
-		Object value = eGet(feature, false);
-		if(feature.isMany()) {
-			return value != null && !((Collection) value).isEmpty()
-			&& value != defaultValue;
-		} else {
-			return defaultValue == null ? value != null : !defaultValue
-					.equals(value);
-		}
-		
-//		// Always return true so the feature (with default value overriden)
-//		// will be saved regardless that its value is the default value or not.
-//		//
-//		return true;
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/package.html b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/package.html
deleted file mode 100644
index 02e6225..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for the UMA Ecore extension.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/package.html b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/package.html
deleted file mode 100644
index c5ca906..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the UMA Ecore extension.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/DefaultValueManager.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/DefaultValueManager.java
deleted file mode 100644
index e2ff67f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/DefaultValueManager.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2007 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.util;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author Phong Nguyen Le
- * @sine 1.2
- */
-public class DefaultValueManager {
-	public static final DefaultValueManager INSTANCE = new DefaultValueManager();
-	
-	private final Map<EStructuralFeature, Map<EClass, Object>> featureToTypedDefaultValuesMap = 
-		new HashMap<EStructuralFeature, Map<EClass, Object>>();
-	
-	private final Map<EClass, Map<EStructuralFeature, Object>> typeToFeatureDefaultValueMap =
-		new HashMap<EClass, Map<EStructuralFeature,Object>>();
-
-	private final Map<EStructuralFeature, Map<EClass, Object>> featureToTypedStaticDefaultValuesMap = 
-		new HashMap<EStructuralFeature, Map<EClass, Object>>();
-	
-	private final Map<EClass, Map<EStructuralFeature, Object>> typeToFeatureStaticDefaultValueMap =
-		new HashMap<EClass, Map<EStructuralFeature,Object>>();
-
-	private volatile boolean useStatic;
-	
-	protected DefaultValueManager() {
-		
-	}
-	
-	public void setUseStatic(boolean useStatic) {
-		this.useStatic = useStatic;
-	}
-	
-	public boolean isUseStatic() {
-		return useStatic;
-	}
-	
-	private static Map<EStructuralFeature, Object> getFeatureToDefaultValueMap(EClass type, 
-			Map<EStructuralFeature, Map<EClass, Object>> featureToTypedDefaultValuesMap,
-			Map<EStructuralFeature, Object> featureToStaticDefaultValueMap) {
-		Map<EStructuralFeature, Object> featureToDefaultValueMap;
-		if(featureToTypedDefaultValuesMap.isEmpty()) {
-			featureToDefaultValueMap = Collections.EMPTY_MAP;
-		}
-		else {
-			featureToDefaultValueMap = new HashMap<EStructuralFeature, Object>();
-			for (Iterator<Map.Entry<EStructuralFeature, Map<EClass, Object>>> iter = 
-				featureToTypedDefaultValuesMap.entrySet().iterator(); iter.hasNext();) {
-				Map.Entry<EStructuralFeature, Map<EClass, Object>> entry = iter.next();
-				EStructuralFeature feature = entry.getKey();
-				if(type.getFeatureID(feature) != -1) {
-					Object defaultValue = null;
-					EClass selectedType = type;
-					boolean found = false;
-					for (Iterator<Map.Entry<EClass, Object>> iterator = entry.getValue().entrySet().iterator(); iterator
-							.hasNext();) {
-						Map.Entry<EClass, Object> ent = iterator.next();
-						EClass currentType = ent.getKey();
-						if(currentType.isSuperTypeOf(type) && 
-								(selectedType == null || selectedType.isSuperTypeOf(currentType))) {
-							selectedType = currentType;
-							defaultValue = ent.getValue();
-							found = true;
-						}
-					}
-					if(found) {
-						Object staticDefaultValue = featureToStaticDefaultValueMap.get(feature);
-						if(staticDefaultValue == null) {
-							staticDefaultValue = feature.getDefaultValue();
-						}
-						if((defaultValue == null &&  staticDefaultValue != null)
-								|| (defaultValue != null && !defaultValue.equals(staticDefaultValue))) {
-							featureToDefaultValueMap.put(feature, defaultValue);
-						}
-					}
-				}
-			}
-			if(featureToDefaultValueMap.isEmpty()) {
-				featureToDefaultValueMap = Collections.EMPTY_MAP;
-			}
-		}
-		return featureToDefaultValueMap;
-	}
-	
-	public synchronized Map<EStructuralFeature, Object> getFeatureToDefaultValueMap(EClass type) {
-		if(useStatic) {
-			return getFeatureToStaticDefaultValueMap(type);
-		}
-		else {
-			return getFeatureToDynamicDefaultValueMap(type);
-		}		
-	}
-	
-	private synchronized Map<EStructuralFeature, Object> getFeatureToDynamicDefaultValueMap(EClass type) {
-		Map<EStructuralFeature, Object> featureToDefaultValueMap = typeToFeatureDefaultValueMap.get(type);
-		if(featureToDefaultValueMap == null) {
-			featureToDefaultValueMap = getFeatureToDefaultValueMap(type, featureToTypedDefaultValuesMap,
-					getFeatureToStaticDefaultValueMap(type));
-			typeToFeatureDefaultValueMap.put(type, featureToDefaultValueMap);
-		}
-		return featureToDefaultValueMap;
-	}	
-	
-	private synchronized Map<EStructuralFeature, Object> getFeatureToStaticDefaultValueMap(EClass type) {
-		Map<EStructuralFeature, Object> featureToDefaultValueMap = typeToFeatureStaticDefaultValueMap.get(type);
-		if(featureToDefaultValueMap == null) {
-			featureToDefaultValueMap = getFeatureToDefaultValueMap(type, featureToTypedStaticDefaultValuesMap,
-					Collections.EMPTY_MAP);
-			typeToFeatureStaticDefaultValueMap.put(type, featureToDefaultValueMap);
-		}
-		return featureToDefaultValueMap;
-	}
-
-	
-	private static final synchronized void setDefaultValue(EClass type, EStructuralFeature feature, Object defaultValue,
-			Map<EStructuralFeature, Map<EClass, Object>> featureToTypedDefaultValuesMap ) 
-	{
-		if(!feature.getEContainingClass().isSuperTypeOf(type)) {
-			return;
-		}
-		Map<EClass, Object> typeToDefaultValueMap = featureToTypedDefaultValuesMap.get(feature);
-		if(typeToDefaultValueMap == null) {
-			// this map must be sorted from sub type to super type
-			//
-			typeToDefaultValueMap = new HashMap<EClass, Object>();
-			featureToTypedDefaultValuesMap.put(feature, typeToDefaultValueMap);
-		}
-		typeToDefaultValueMap.put(type, defaultValue);
-	}
-	
-	public final synchronized void setDefaultValue(EClass type, EStructuralFeature feature, Object defaultValue) {
-		setDefaultValue(type, feature, defaultValue, featureToTypedDefaultValuesMap);
-		
-		// clear typeToFeatureDefaultValueMap so the default value will be recalculated for each class
-		//
-		typeToFeatureDefaultValueMap.clear();
-	}
-	
-	public final synchronized void setStaticDefaultValue(EClass type, EStructuralFeature feature, Object defaultValue) {
-		setDefaultValue(type, feature, defaultValue);
-		setDefaultValue(type, feature, defaultValue, featureToTypedStaticDefaultValuesMap);
-	}
-	
-	public final void removeDefaultValue(EStructuralFeature feature) {
-		featureToTypedDefaultValuesMap.remove(feature);
-	}
-
-	public final void removeDefaultValue(EStructuralFeature feature, EClass type) {
-		assert feature.getEContainingClass().isSuperTypeOf(type);
-		Map<EClass, Object> typeToDefaultValueMap = featureToTypedDefaultValuesMap.get(feature);
-		if(typeToDefaultValueMap != null) {
-			typeToDefaultValueMap.remove(type);
-		}
-		
-		// clear typeToFeatureDefaultValueMap so the default value will be recalculated for each class
-		//
-		typeToFeatureDefaultValueMap.clear();
-	}
-	
-	private static void assignDefaultValues(EObject eObject, Map<EStructuralFeature, Object> featureToDefaultValueMap) {
-		if(featureToDefaultValueMap.isEmpty()) {
-			return;
-		}
-		
-		for (Iterator<Map.Entry<EStructuralFeature, Object>> iter = featureToDefaultValueMap
-				.entrySet().iterator(); iter.hasNext();) {
-			Map.Entry<EStructuralFeature, Object> entry = iter.next();
-			eObject.eSet(entry.getKey(), entry.getValue());
-		}
-
-	}
-
-	public void assignDefaultValues(EObject eObject) {
-		EClass type = eObject.eClass();
-		Map<EStructuralFeature, Object> featureToStaticDefaultValueMap = getFeatureToStaticDefaultValueMap(type);
-		assignDefaultValues(eObject, featureToStaticDefaultValueMap);
-		Map<EStructuralFeature, Object> featureToDefaultValueMap = getFeatureToDefaultValueMap(eObject.eClass());
-		if(featureToDefaultValueMap != featureToStaticDefaultValueMap) {
-			assignDefaultValues(eObject, featureToDefaultValueMap);
-		}
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EObjectContainmentResolvingEList.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EObjectContainmentResolvingEList.java
deleted file mode 100644
index fcbe6dc..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EObjectContainmentResolvingEList.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.util;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- * @deprecated
- */
-public class EObjectContainmentResolvingEList extends EObjectContainmentEList {
-
-	private static final long serialVersionUID = 5349833630551976488L;
-
-	public static class Unsettable extends EObjectContainmentResolvingEList {
-
-		private static final long serialVersionUID = -5117004151476522719L;
-
-		protected boolean isSet;
-
-		public Unsettable(Class dataClass, InternalEObject owner, int featureID) {
-			super(dataClass, owner, featureID);
-		}
-
-		protected void didChange() {
-			isSet = true;
-		}
-
-		public boolean isSet() {
-			return isSet;
-		}
-
-		public void unset() {
-			super.unset();
-			if (isNotificationRequired()) {
-				boolean oldIsSet = isSet;
-				isSet = false;
-				owner.eNotify(createNotification(Notification.UNSET, oldIsSet,
-						false));
-			} else {
-				isSet = false;
-			}
-		}
-	}
-
-	public EObjectContainmentResolvingEList(Class dataClass,
-			InternalEObject owner, int featureID) {
-		super(dataClass, owner, featureID);
-	}
-
-	protected boolean hasProxies() {
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.util.BasicEList#resolve(int,
-	 *      java.lang.Object)
-	 */
-	protected Object resolve(int index, Object object) {
-		MultiResourceEObject eObj = (MultiResourceEObject) resolve(index,
-				(EObject) object);
-		eObj.eSetContainer(owner, InternalEObject.EOPPOSITE_FEATURE_BASE
-				- getFeatureID());
-		return eObj;
-	}
-
-	/**
-	 * @see org.eclipse.emf.ecore.util.EcoreEList#contains(java.lang.Object)
-	 */
-	public boolean contains(Object object) {
-		if (isEObject()) {
-			boolean result = super.contains(object);
-			if (hasProxies() && !result) {
-				for (int i = 0; i < size; ++i) {
-					EObject eObject = resolveProxy((EObject) data[i]);
-					if (eObject == object) {
-						return true;
-					}
-				}
-			}
-			return result;
-		}
-		return super.contains(object);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EObjectContainmentResolvingWithInverseEList.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EObjectContainmentResolvingWithInverseEList.java
deleted file mode 100644
index bb03d13..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EObjectContainmentResolvingWithInverseEList.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.util;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.InternalEObject;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.0
- * @deprecated
- */
-public class EObjectContainmentResolvingWithInverseEList extends
-		EObjectContainmentResolvingEList {
-
-	private static final long serialVersionUID = -122177081657171857L;
-
-	public static class Unsettable extends
-			EObjectContainmentResolvingWithInverseEList {
-
-		private static final long serialVersionUID = -8239294568676270078L;
-
-		protected boolean isSet;
-
-		public Unsettable(Class dataClass, InternalEObject owner,
-				int featureID, int inverseFeatureID) {
-			super(dataClass, owner, featureID, inverseFeatureID);
-		}
-
-		protected void didChange() {
-			isSet = true;
-		}
-
-		public boolean isSet() {
-			return isSet;
-		}
-
-		public void unset() {
-			super.unset();
-			if (isNotificationRequired()) {
-				boolean oldIsSet = isSet;
-				isSet = false;
-				owner.eNotify(createNotification(Notification.UNSET, oldIsSet,
-						false));
-			} else {
-				isSet = false;
-			}
-		}
-	}
-
-	protected final int inverseFeatureID;
-
-	public EObjectContainmentResolvingWithInverseEList(Class dataClass,
-			InternalEObject owner, int featureID, int inverseFeatureID) {
-		super(dataClass, owner, featureID);
-		this.inverseFeatureID = inverseFeatureID;
-	}
-
-	protected boolean hasNavigableInverse() {
-		return true;
-	}
-
-	public int getInverseFeatureID() {
-		return inverseFeatureID;
-	}
-
-	public Class getInverseFeatureClass() {
-		return dataClass;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EventTypes.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EventTypes.java
deleted file mode 100644
index 2621536..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/EventTypes.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.util;
-
-import org.eclipse.emf.common.notify.Notification;
-
-/**
- * Defines additional notification event types.
- * <p>
- * This class is reserved for future use.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- * @see org.eclipse.emf.common.notify.Notification
- */
-public final class EventTypes {
-
-	public static final int MAKE_PROXY = Notification.EVENT_TYPE_COUNT + 1;
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeature.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeature.java
deleted file mode 100644
index e1462a5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeature.java
+++ /dev/null
@@ -1,215 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.util;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Supports the reverse traversal of an association between two model objects.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class OppositeFeature {
-
-	private String name;
-
-	private EStructuralFeature targetFeature;
-
-	private boolean isMany;
-
-	private boolean resolveOwner = true;
-
-	private Class ownerClass;
-
-	//private static boolean deliverOnResolve;
-
-	/**
-	 * Maps source model objects to OppositeFeature objects.
-	 */
-	public static final Map classOppositeFeaturesMap = new HashMap();
-
-	/**
-	 * Maps EStructuralFeature objects to OppositeFeature objects.
-	 */
-	public static final Map featureOppositeFeatureMap = new HashMap();
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param ownerClass
-	 *            the model class that owns this opposite feature
-	 * @param name
-	 *            the name of this opposite feature
-	 * @param targetFeature
-	 *            the feature which this opposite feature is based on
-	 * @param isMany
-	 *            if <true>, the multiplicity of the association is unbounded
-	 * @param resolveOwner
-	 *            if <true>, resolve the owner class if it is a proxy
-	 */
-	public OppositeFeature(Class ownerClass, String name,
-			EStructuralFeature targetFeature, boolean isMany,
-			boolean resolveOwner) {
-		this.ownerClass = ownerClass;
-		this.name = name;
-		this.targetFeature = targetFeature;
-		this.isMany = isMany;
-		this.resolveOwner = resolveOwner;
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param ownerClass
-	 *            the model class that owns this opposite feature
-	 * @param name
-	 *            the name of this opposite feature
-	 * @param targetFeature
-	 *            the feature which this opposite feature is based on
-	 * @param isMany
-	 *            if <true>, the multiplicity of the association is unbounded
-	 */
-	public OppositeFeature(Class ownerClass, String name,
-			EStructuralFeature targetFeature, boolean isMany) {
-		this(ownerClass, name, targetFeature, isMany, true);
-	}
-
-	/**
-	 * Gets the modal class that owns this opposite feature.
-	 * 
-	 * @return the modal class that owns this opposite feature
-	 */
-	public Class getOwnerClass() {
-		return ownerClass;
-	}
-
-	/**
-	 * Checks whether the association is unbounded.
-	 * 
-	 * @return <code>true</code> if the association is unbounded
-	 */
-	public boolean isMany() {
-		return isMany;
-	}
-
-	/**
-	 * Gets the name of this opposite feature.
-	 * 
-	 * @return the opposite feature name
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Gets the feature which this opposite feature is based on.
-	 * 
-	 * @return the original feature generated by EMF
-	 */
-	public EStructuralFeature getTargetFeature() {
-		return targetFeature;
-	}
-
-	/**
-	 * Gets the ID of this opposite feature.
-	 * 
-	 * @return the opposite feature ID
-	 */
-	public int getFeatureID() {
-		return -1 - targetFeature.getFeatureID();
-	}
-
-	/**
-	 * Checks whether the owner class of this opposite feature, if proxied,
-	 * should be resolved when the target feature is set.
-	 * 
-	 * @return <true> if the owner class, if proxied, should be resolved
-	 */
-	public boolean resolveOwner() {
-		return resolveOwner;
-	}
-
-	/**
-	 * Gets a string representation of this opposite feature.
-	 * 
-	 * @return A <code>String</code> containing the key attributes of this
-	 *         opposite feature.
-	 */
-	public String toString() {
-		return name + "[targetFeature=" + targetFeature //$NON-NLS-1$
-				+ ", isMany=" + isMany + "]"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * Registers the given opposite feature.
-	 * 
-	 * @param oppositeFeature
-	 *            the opposite feature to register
-	 */
-	public static final void registerOppositeFeature(
-			OppositeFeature oppositeFeature) {
-		Class cls = oppositeFeature.getOwnerClass();
-		Set features = (Set) classOppositeFeaturesMap.get(cls);
-		if (features == null) {
-			features = new HashSet();
-			classOppositeFeaturesMap.put(cls, features);
-		}
-		features.add(oppositeFeature);
-
-		featureOppositeFeatureMap.put(oppositeFeature.getTargetFeature(),
-				oppositeFeature);
-	}
-
-	/**
-	 * Checks whether notification is sent when a proxy owner class is resolved.
-	 * 
-	 * @return <code>true</code> if notification is being sent when a proxy
-	 *         owner class is resolved
-	 */
-	/*
-	public static final boolean isDeliverOnResolve() {
-		return deliverOnResolve;
-	}
-	*/
-
-	/**
-	 * Enables notification when a proxy owner class is resolved.
-	 * 
-	 * @param enableNotification
-	 *            if <code>true</code>, send notification when a proxy owner
-	 *            class is resolved
-	 */
-	/*
-	public static final void setDeliverOnResolve(boolean enableNotification) {
-		deliverOnResolve = enableNotification;
-	}
-	*/
-
-	/**
-	 * Gets the opposite feature for the given feature.
-	 * 
-	 * @param feature
-	 *            an EMF <code>EStructuralFeature</code> feature
-	 * @return an opposite feature that is based on the given feature
-	 */
-	public static final OppositeFeature getOppositeFeature(
-			EStructuralFeature feature) {
-		return (OppositeFeature) featureOppositeFeatureMap.get(feature);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeatureNotification.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeatureNotification.java
deleted file mode 100644
index f221be5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeatureNotification.java
+++ /dev/null
@@ -1,64 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.util;
-
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-
-/**
- * Notification associated with an opposite feature.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class OppositeFeatureNotification extends NotificationImpl {
-
-	private OppositeFeature oppositeFeature;
-
-	private Object notifier;
-
-	/**
-	 * @param eventType
-	 *            the type of event
-	 * @param oppositeFeature
-	 *            the opposite feature associated with this notification
-	 * @param oldValue
-	 *            the old value
-	 * @param newValue
-	 *            the new value
-	 * @param position
-	 *            the positition at which the change occurred
-	 * @param wasSet
-	 */
-	public OppositeFeatureNotification(Object notifier, int eventType,
-			OppositeFeature oppositeFeature, Object oldValue, Object newValue,
-			int position, boolean wasSet) {
-		super(eventType, oldValue, newValue, position, wasSet);
-		this.notifier = notifier;
-		this.oppositeFeature = oppositeFeature;
-	}
-
-	/**
-	 * Gets the opposite feature that is associated with this notification.
-	 * 
-	 * @return the opposite feature associated with this notification
-	 */
-	public OppositeFeature getOppsiteFeature() {
-		return oppositeFeature;
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.notify.impl.NotificationImpl#getNotifier()
-	 */
-	public Object getNotifier() {
-		return notifier;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeatureResolvingEList.java b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeatureResolvingEList.java
deleted file mode 100644
index db534fe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/OppositeFeatureResolvingEList.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.ecore.util;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.impl.NotificationImpl;
-import org.eclipse.emf.common.notify.impl.NotifyingListImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * A list for resolving multi-valued opposite features.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class OppositeFeatureResolvingEList extends NotifyingListImpl {
-
-	private static final long serialVersionUID = 3690198763000051768L;
-
-	private MultiResourceEObject owner;
-
-	private OppositeFeature oppositeFeature;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param owner
-	 *            the owner of an opposite feature
-	 * @param oppositeFeature
-	 *            an opposite feature
-	 */
-	public OppositeFeatureResolvingEList(MultiResourceEObject owner,
-			OppositeFeature oppositeFeature) {
-		super();
-		this.owner = owner;
-		this.oppositeFeature = oppositeFeature;
-	}
-
-	/**
-	 * @see org.eclipse.emf.common.notify.impl.NotifyingListImpl#getNotifier()
-	 */
-	public Object getNotifier() {
-		return owner;
-	}
-
-	protected EObject resolveProxy(EObject eObject) {
-		return eObject.eIsProxy() ? owner
-				.eResolveProxy((InternalEObject) eObject) : eObject;
-	}
-
-	protected NotificationImpl createNotification(int eventType,
-			Object oldObject, Object newObject, int index, boolean wasSet) {
-		return new OppositeFeatureNotification(owner, eventType,
-				oppositeFeature, oldObject, newObject, index, wasSet);
-	}
-
-	protected boolean isNotificationRequired() {
-		return owner.eNotificationRequired();
-	}
-
-	protected Object resolve(int index, Object object) {
-		if (!(object instanceof EObject))
-			return object;
-		EObject eObject = (EObject) object;
-		EObject resolved = resolveProxy(eObject);
-		if (resolved != eObject) {
-			Object oldObject = data[index];
-			assign(index, validate(index, resolved));
-
-			didSet(index, resolved, oldObject);
-
-			// if (isNotificationRequired())
-			// {
-			// owner.eNotify(createNotification(Notification.RESOLVE, eObject,
-			// resolved, index, false));
-			// }
-
-			return resolved;
-		} else {
-			return eObject;
-		}
-
-	}
-
-	private void removeDanglingObjects() {
-		for (Iterator iter = iterator(); iter.hasNext();) {
-			EObject obj = (EObject) iter.next();
-			if (obj.eResource() == null) {
-				iter.remove();
-			}
-		}
-	}
-
-	/**
-	 * Returns an unmodifiable list that stores the opposite feature values.
-	 * 
-	 * @return an unmodifiable list
-	 */
-	public List getUnmodifiableList() {
-		removeDanglingObjects();
-		return new UnmodifiableEList(size, data);
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/package.html b/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/package.html
deleted file mode 100644
index 0aefe51..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for the UMA Ecore extension.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/templates/Header.javajetinc b/1.5/plugins/org.eclipse.epf.uma.ecore/templates/Header.javajetinc
deleted file mode 100644
index 410569b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/templates/Header.javajetinc
+++ /dev/null
@@ -1,10 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/templates/model/Class.javajet b/1.5/plugins/org.eclipse.epf.uma.ecore/templates/model/Class.javajet
deleted file mode 100644
index 1fb60be..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/templates/model/Class.javajet
+++ /dev/null
@@ -1,1821 +0,0 @@
-<%@ jet package="org.eclipse.emf.codegen.ecore.templates.model" imports="java.util.* org.eclipse.emf.codegen.ecore.genmodel.*" class="Class" version="$Id: Class.javajet,v 1.1 2008/01/15 08:53:19 jtham Exp $" %>
-<%
-/**
- * <copyright>
- *
- * Copyright (c) 2002-2005 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *
- * </copyright>
- */
-%>
-<%final GenClass genClass = (GenClass)((Object[])argument)[0]; final GenPackage genPackage = genClass.getGenPackage(); final GenModel genModel=genPackage.getGenModel();%>
-<%final boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); final boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]);%>
-<%final String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
-<%@ include file="../Header.javajetinc"%>
-<%if (isInterface) {%>
-package <%=genPackage.getInterfacePackageName()%>;
-<%} else {%>
-package <%=genPackage.getClassPackageName()%>;
-<%}%>
-
-<%genModel.markImportLocation(stringBuffer, genPackage);%>
-
-<%if (isInterface) {%>
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
- * <!-- end-user-doc -->
-<%if (genClass.hasDocumentation()) {%>
- *
- * <!-- begin-model-doc -->
- * <%=genClass.getDocumentation(genModel.getIndentation(stringBuffer))%>
- * <!-- end-model-doc -->
-<%}%>
- *
-<%if (!genClass.getGenFeatures().isEmpty()) {%>
- * <p>
- * The following features are supported:
- * <ul>
-<%for (Iterator i=genClass.getGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genFeature.isSuppressedGetVisibility()) {%>
- *   <li>{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
-  <%}%>
-<%}%>
- * </ul>
- * </p>
-<%}%>
- *
-<%if (!genModel.isSuppressEMFMetaData()) {%>
- * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genClass.getClassifierAccessorName()%>()
-<%}%>
-<%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
- * @model <%=modelInfo%>
-<%} else {%>
- *        <%=modelInfo%>
-<%}} if (first) {%>
- * @model
-<%}}%>
-<%if (genClass.needsRootExtendsInterfaceExtendsTag()) {%>
- * @extends <%=genModel.getImportedName(genModel.getRootExtendsInterface())%>
-<%}%>
- * @generated
- */
-<%} else {%>
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
- * <!-- end-user-doc -->
- * <p>
-<%if (!genClass.getImplementedGenFeatures().isEmpty()) {%>
- * The following features are implemented:
- * <ul>
-<%for (Iterator i=genClass.getImplementedGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
- *   <li>{@link <%=genClass.getQualifiedClassName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
-<%}%>
- * </ul>
-<%}%>
- * </p>
- *
- * @generated
- */
-<%}%>
-<%if (isImplementation) {%>
-public<%if (genClass.isAbstract()) {%> abstract<%}%> class <%=genClass.getClassName()%><%=genClass.getClassExtends()%><%=genClass.getClassImplements()%>
-<%} else {%>
-public interface <%=genClass.getInterfaceName()%><%=genClass.getInterfaceExtends()%>
-<%}%>
-{
-<%if (genModel.getCopyrightText() != null) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = "<%=genModel.getCopyrightText()%>";<%=genModel.getNonNLS()%>
-
-<%}%>
-<%if (isImplementation && genModel.getDriverNumber() != null) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final <%=genModel.getImportedName("java.lang.String")%> mofDriverNumber = "<%=genModel.getDriverNumber()%>";<%=genModel.getNonNLS()%>
-
-<%}%>
-<%if (isImplementation && genClass.isJavaIOSerializable()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-<%}%>
-<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
-  <%if (eVirtualValuesField != null) {%>
-	/**
-	 * An array of objects representing the values of non-primitive features.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object[] <%=eVirtualValuesField%> = null;
-
-  <%}%>
-  <%{ List eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList());%>
-    <%if (!eVirtualIndexBitFields.isEmpty()) {%>
-      <%for (Iterator i = eVirtualIndexBitFields.iterator(); i.hasNext();) { String eVirtualIndexBitField = (String)i.next();%>
-	/**
-	 * A bit field representing the indices of non-primitive feature values.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected int <%=eVirtualIndexBitField%> = 0;
-
-      <%}%>
-    <%}%>
-  <%}%>
-<%}%>
-<%if (isImplementation && genClass.isModelRoot() && genModel.isBooleanFlagsEnabled() && genModel.getBooleanFlagsReservedBits() == -1) {%>
-	/**
-	 * A set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected int <%=genModel.getBooleanFlagsField()%> = 0;
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation()) {%>
-  <%for (Iterator i=genClass.getDeclaredFieldGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-<%@ include file="Class/declaredFieldGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-    <%if (genFeature.isListType() || genFeature.isReferenceType()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-	/**
-	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected <%=genFeature.getImportedInternalType()%> <%=genFeature.getSafeName()%> = null;
-
-      <%}%>
-      <%if (genModel.isArrayAccessors() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) {%>
-	/**
-	 * The empty value for the '{@link #<%=genFeature.getGetArrayAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' array accessor.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetArrayAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final <%=genFeature.getListItemType()%>[] <%=genFeature.getUpperName()%>_EEMPTY_ARRAY = new <%=genFeature.getListItemType()%> [0];
-
-      <%}%>
-    <%} else {%>
-      <%if (!genFeature.isVolatile() || !genModel.isReflectiveDelegation() && (!genFeature.hasDelegateFeature() || !genFeature.isUnsettable())) {%>
-	/**
-	 * The default value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final <%=genFeature.getImportedType()%> <%=genFeature.getUpperName()%>_EDEFAULT = <%=genFeature.getStaticDefaultValue()%>;<%=genModel.getNonNLS(genFeature.getStaticDefaultValue())%>
-
-      <%}%>
-      <%if (genClass.isField(genFeature)) {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-          <%if (genClass.getFlagIndex(genFeature) > 31 && genClass.getFlagIndex(genFeature) % 32 == 0) {%>
-	/**
-	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected int <%=genClass.getFlagsField(genFeature)%> = 0;
-
-          <%}%>
-	/**
-	 * The flag representing the value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int <%=genFeature.getUpperName()%>_EFLAG = 1 <%="<< " + genClass.getFlagIndex(genFeature) % 32 %>;
-
-        <%} else {%>
-	/**
-	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected <%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = <%=genFeature.getUpperName()%>_EDEFAULT;
-
-        <%}%>
-      <%}%>
-    <%}%>
-    <%if (genClass.isESetField(genFeature)) {%>
-      <%if (genClass.isESetFlag(genFeature)) {%>
-        <%if (genClass.getESetFlagIndex(genFeature) > 31 && genClass.getESetFlagIndex(genFeature) % 32 == 0) {%>
-	/**
-	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected int <%=genClass.getESetFlagsField(genFeature)%> = 0;
-
-        <%}%>
-	/**
-	 * The flag representing whether the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int <%=genFeature.getUpperName()%>_ESETFLAG = 1 <%="<< " + genClass.getESetFlagIndex(genFeature) % 32 %>;
-
-      <%} else {%>
-	/**
-	 * This is true if the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean <%=genFeature.getUncapName()%>ESet = false;
-
-      <%}%>
-    <%}%>
-  <%}%>
-<%@ include file="Class/declaredFieldGenFeature.insert.javajetinc" fail="silent" %>
-<%@ end %><%//Class/declaredFieldGenFeature.override.javajetinc%>
-<%}%>
-<%if (isImplementation) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected <%=genClass.getClassName()%>()
-	{
-		super();
-  <%for (Iterator i=genClass.getFlagGenFeatures("true").iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-		<%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG;
-  <%}%>
-  
- //UMA-->
- 		reassignDefaultValues();
- //UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%> eStaticClass()
-	{
-		return <%=genClass.getQualifiedClassifierAccessor()%>;
-	}
-
-<%}%>
-<%new Runnable() { public void run() {%>
-<%for (Iterator i=(isImplementation ? genClass.getImplementedGenFeatures() : genClass.getDeclaredGenFeatures()).iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-<%@ include file="Class/genFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-  <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	<%=genFeature.getListItemType()%>[] <%=genFeature.getGetArrayAccessor()%>();
-
-    <%} else {%>
-	public <%=genFeature.getListItemType()%>[] <%=genFeature.getGetArrayAccessor()%>()
-	{
-      <%if (genFeature.isVolatile()) {%>
-		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>)<%=genFeature.getGetAccessor()%>();
-		if (list.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
-      <%} else {%>
-		if (<%=genFeature.getSafeName()%> == null || <%=genFeature.getSafeName()%>.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
-		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>)<%=genFeature.getSafeName()%>;
-      <%}%>
-		list.shrink();
-		return (<%=genFeature.getListItemType()%>[])list.data();
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	<%=genFeature.getListItemType()%> get<%=genFeature.getAccessorName()%>(int index);
-
-    <%} else {%>
-	public <%=genFeature.getListItemType()%> get<%=genFeature.getAccessorName()%>(int index)
-	{
-		return (<%=genFeature.getListItemType()%>)<%=genFeature.getGetAccessor()%>().get(index);
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	int get<%=genFeature.getAccessorName()%>Length();
-
-    <%} else {%>
-	public int get<%=genFeature.getAccessorName()%>Length()
-	{
-      <%if (genFeature.isVolatile()) {%>
-		return <%=genFeature.getGetAccessor()%>().size();
-      <%} else {%>
-		return <%=genFeature.getSafeName()%> == null ? 0 : <%=genFeature.getSafeName()%>.size();
-      <%}%>
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType()%>[] new<%=genFeature.getCapName()%>);
-
-    <%} else {%>
-	public void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType()%>[] new<%=genFeature.getCapName()%>)
-	{
-		((<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>)<%=genFeature.getGetAccessor()%>()).setData(new<%=genFeature.getCapName()%>.length, new<%=genFeature.getCapName()%>);
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType()%> element);
-
-    <%} else {%>
-	public void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType()%> element)
-	{
-		<%=genFeature.getGetAccessor()%>().set(index, element);
-	}
-
-    <%}%>
-  <%}%>
-  <%if (genFeature.isGet() && (isImplementation || !genFeature.isSuppressedGetVisibility())) {%>
-<%@ include file="Class/getGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * Returns the value of the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%>.
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isMapType()) { GenFeature keyFeature = genFeature.getMapEntryTypeGenClass().getMapEntryKeyFeature(); GenFeature valueFeature = genFeature.getMapEntryTypeGenClass().getMapEntryValueFeature(); %>
-	 * The key is of type <%if (keyFeature.isListType()) {%>list of {@link <%=keyFeature.getQualifiedListItemType()%>}<%} else {%>{@link <%=keyFeature.getType()%>}<%}%>,
-	 * and the value is of type <%if (valueFeature.isListType()) {%>list of {@link <%=valueFeature.getQualifiedListItemType()%>}<%} else {%>{@link <%=valueFeature.getType()%>}<%}%>,
-      <%} else if (!genFeature.isWrappedFeatureMapType() && !(genModel.isSuppressEMFMetaData() && "org.eclipse.emf.ecore.EObject".equals(genFeature.getQualifiedListItemType()))) {%>
-	 * The list contents are of type {@link <%=genFeature.getQualifiedListItemType()%>}.
-      <%}%>
-    <%} else if (genFeature.isSetDefaultValue()) {%>
-	 * The default value is <code><%=genFeature.getDefaultValue()%></code>.
-    <%}%>
-    <%if (genFeature.getTypeGenEnum() != null) {%>
-	 * The literals are from the enumeration {@link <%=genFeature.getTypeGenEnum().getQualifiedName()%>}.
-    <%}%>
-    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
-      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
-	 * It is bidirectional and its opposite is '{@link <%=reverseGenFeature.getGenClass().getQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%> <em><%=reverseGenFeature.getFormattedName()%></em>}'.
-      <%}%>
-    <%}%>
-	 * <!-- begin-user-doc -->
-    <%if (!genFeature.hasDocumentation()) {%>
-	 * <p>
-	 * If the meaning of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%> isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-    <%}%>
-	 * <!-- end-user-doc -->
-    <%if (genFeature.hasDocumentation()) {%>
-	 * <!-- begin-model-doc -->
-	 * <%=genFeature.getDocumentation(genModel.getIndentation(stringBuffer))%>
-	 * <!-- end-model-doc -->
-    <%}%>
-	 * @return the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
-    <%if (genFeature.getTypeGenEnum() != null) {%>
-	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
-    <%}%>
-    <%if (genFeature.isUnsettable()) {%>
-      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
-	 * @see #isSet<%=genFeature.getAccessorName()%>()
-      <%}%>
-      <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
-	 * @see #unset<%=genFeature.getAccessorName()%>()
-      <%}%>
-    <%}%>
-    <%if (genFeature.isChangeable() && !genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
-	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%>)
-    <%}%>
-    <%if (!genModel.isSuppressEMFMetaData()) {%>
-	 * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genFeature.getFeatureAccessorName()%>()
-    <%}%>
-    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
-      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
-	 * @see <%=reverseGenFeature.getGenClass().getQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%>
-      <%}%>
-    <%}%>
-    <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genFeature.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
-	 * @model <%=modelInfo%>
-    <%} else {%>
-	 *        <%=modelInfo%>
-    <%}} if (first) {%>
-	 * @model
-    <%}}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	<%=genFeature.getImportedType()%> <%=genFeature.getGetAccessor()%>();
-
-<%} else {%>
-	public <%=genFeature.getImportedType()%> <%=genFeature.getGetAccessor()%>()
-	{
-<%@ include file="Class/getGenFeature.pre.insert.javajetinc" fail="silent" %>
-    <%if (genModel.isReflectiveDelegation()) {%>
-		return <%if (genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType()%>)eGet(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (<%=genFeature.getSafeName()%> == null)
-		{
-        <%if (genModel.isVirtualDelegation()) {%>
-			eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>);
-        <%} else {%>
-			<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
-        <%}%>
-		}
-		return <%=genFeature.getSafeName()%><%=genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : ""%>;
-      <%} else if (genFeature.isContainer()) {%>
-		if (eContainerFeatureID != <%=genClass.getQualifiedFeatureID(genFeature)%>) return null;
-		return (<%=genFeature.getImportedType()%>)eContainer();
-      <%} else {%>
-        <%if (genFeature.isResolveProxies()) {%>
-          <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (!genFeature.isReferenceType()) {%>, <%=genFeature.getUpperName()%>_EDEFAULT<%}%>);
-          <%}%>
-		if (<%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeNameAsEObject()%>.eIsProxy())
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> old<%=genFeature.getCapName()%> = (<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>;
-			<%=genFeature.getSafeName()%> = <%=genFeature.getNonEObjectInternalTypeCast()%>eResolveProxy(old<%=genFeature.getCapName()%>);
-			if (<%=genFeature.getSafeName()%> != old<%=genFeature.getCapName()%>)
-			{
-          <%if (genFeature.isEffectiveContains()) {%>
-				<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> new<%=genFeature.getCapName()%> = (<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>;
-          <%if (!genFeature.isBidirectional()) {%>
-				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = old<%=genFeature.getCapName()%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, null);
-          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs =  old<%=genFeature.getCapName()%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, null);
-          <%}%>
-				if (new<%=genFeature.getCapName()%>.eInternalContainer() == null)
-				{
-          <%if (!genFeature.isBidirectional()) {%>
-					msgs = new<%=genFeature.getCapName()%>.eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-					msgs =  new<%=genFeature.getCapName()%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-          <%}%>
-				}
-				if (msgs != null) msgs.dispatch();
-          <%} else if (genModel.isVirtualDelegation()) {%>
-				eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getSafeName()%>);
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-				if (eNotificationRequired())
-					eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.RESOLVE, <%=genClass.getQualifiedFeatureID(genFeature)%>, old<%=genFeature.getCapName()%>, <%=genFeature.getSafeName()%>));
-          <%}%>
-			}
-		}
-        <%}%>
-        <%if (!genFeature.isResolveProxies() && genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		return (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (!genFeature.isReferenceType()) {%>, <%=genFeature.getUpperName()%>_EDEFAULT<%}%>);
-        <%} else if (genClass.isFlag(genFeature)) {%>
-		return (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
-        <%} else {%>
-		return <%=genFeature.getSafeName()%>;
-        <%}%>
-      <%}%>
-    <%} else {//volatile%>
-      <%if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = basicGet<%=genFeature.getAccessorName()%>();
-		return <%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeName()%>.eIsProxy() ? <%=genFeature.getNonEObjectInternalTypeCast()%>eResolveProxy((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>) : <%=genFeature.getSafeName()%>;
-      <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-        <%if (genFeature.isFeatureMapType()) {%>
-          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return new <%=genFeature.getImportedEffectiveFeatureMapWrapperClass()%>((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().list(<%=genFeature.getQualifiedFeatureAccessor()%>));
-          <%} else {%>
-		return (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)get<%=delegateFeature.getAccessorName()%>()).list(<%=genFeature.getQualifiedFeatureAccessor()%>);
-          <%}%>
-        <%} else if (genFeature.isListType()) {%>
-          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().list(<%=genFeature.getQualifiedFeatureAccessor()%>);
-          <%} else {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)get<%=delegateFeature.getAccessorName()%>()).list(<%=genFeature.getQualifiedFeatureAccessor()%>);
-          <%}%>
-        <%} else {%>
-          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return <%if (genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType()%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
-          <%} else {%>
-		return <%if (genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType()%>)get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
-          <%}%>
-        <%}%>
-      <%} else {%>
-<%@ include file="Class/getGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// Ensure that you remove @generated or mark it @generated NOT
-        <%if (genFeature.isListType()) {%>
-		// The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
-		// so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.<%if (genFeature.isMapType()) {%>EcoreEMap<%} else if (genFeature.isFeatureMapType()) {%>BasicFeatureMap<%} else {%>EcoreEList<%}%> should be used.
-        <%}%>
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/getGenFeature.todo.override.javajetinc%>
-      <%}%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/getGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicGet()) {%>
-<%@ include file="Class/basicGetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genFeature.getImportedType()%> basicGet<%=genFeature.getAccessorName()%>()
-	{
-<%@ include file="Class/basicGetGenFeature.pre.insert.javajetinc" fail="silent" %>
-    <%if (genFeature.isContainer()) {%>
-		if (eContainerFeatureID != <%=genClass.getQualifiedFeatureID(genFeature)%>) return null;
-		return (<%=genFeature.getImportedType()%>)eInternalContainer();
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genModel.isVirtualDelegation()) {%>
-		return (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-      <%} else {%>
-		return <%=genFeature.getSafeName()%>;
-      <%}%>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return (<%=genFeature.getImportedType()%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
-      <%} else {%>
-		return (<%=genFeature.getImportedType()%>)get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/basicGetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// -> do not perform proxy resolution
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/basicGetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%@ end %><%//Class/basicGetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {%>
-<%@ include file="Class/basicSetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedInternalType()%> new<%=genFeature.getCapName()%>, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-    <%if (genFeature.isContainer()) {%>
-<%@ include file="Class/basicSetGenFeature.pre.insert.javajetinc" fail="silent" %>
-		msgs = eBasicSetContainer((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>, <%=genClass.getQualifiedFeatureID(genFeature)%>, msgs);
-<%@ include file="Class/basicSetGenFeature.post.insert.javajetinc" fail="silent" %>
-		return msgs;
-    <%} else if (!genFeature.isVolatile()) {%>
-<%@ include file="Class/basicSetGenFeature.pre.insert.javajetinc" fail="silent" %>
-      <%if (genModel.isVirtualDelegation()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>);
-      <%} else {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%>;
-      <%}%>
-      <%if (genFeature.isUnsettable()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
-        <%} else {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-		<%=genFeature.getUncapName()%>ESet = true;
-        <%}%>
-      <%}%>
-      <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-		{
-        <%if (genFeature.isUnsettable()) {%>
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>);
-        <%} else {%>
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>);
-        <%}%>
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-      <%}%>
-<%@ include file="Class/basicSetGenFeature.post.insert.javajetinc" fail="silent" %>
-		return msgs;
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
-      <%} else {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/basicSetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to set the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// -> this method is automatically invoked to keep the containment relationship in synch
-		// -> do not modify other features
-		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/basicSetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%@ end %><%//Class/basicSetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (genFeature.isSet() && (isImplementation || !genFeature.isSuppressedSetVisibility())) {%>
-<%@ include file="Class/setGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) { %>
-	/**
-	 * Sets the value of the '{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
-    <%if (genFeature.isEnumType()) {%>
-	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
-    <%}%>
-    <%if (genFeature.isUnsettable()) {%>
-      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
-	 * @see #isSet<%=genFeature.getAccessorName()%>()
-      <%}%>
-      <%if (!genFeature.isSuppressedUnsetVisibility()) {%>
-	 * @see #unset<%=genFeature.getAccessorName()%>()
-      <%}%>
-    <%}%>
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) { %>
-	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%> value);
-
-<%} else {%>
-	public void set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%> new<%=genFeature.getCapName()%>)
-	{
-<%@ include file="Class/setGenFeature.pre.insert.javajetinc" fail="silent" %>
-    <%if (genModel.isReflectiveDelegation()) {%>
-		eSet(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType()%>(<%}%>new<%=genFeature.getCapName()%><%if (genFeature.isPrimitiveType()) {%>)<%}%>);
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isContainer()) { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-		if (new<%=genFeature.getCapName()%> != eInternalContainer() || (eContainerFeatureID != <%=genClass.getQualifiedFeatureID(genFeature)%> && new<%=genFeature.getCapName()%> != null))
-		{
-			if (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil")%>.isAncestor(this, <%=genFeature.getEObjectCast()%>new<%=genFeature.getCapName()%>))
-				throw new <%=genModel.getImportedName("java.lang.IllegalArgumentException")%>("Recursive containment not allowed for " + toString());<%=genModel.getNonNLS()%>
-			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (new<%=genFeature.getCapName()%> != null)
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>).eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-        <%if (!genModel.isSuppressNotification()) {%>
-		else if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
-        <%}%>
-      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (new<%=genFeature.getCapName()%> != <%=genFeature.getSafeName()%>)
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
-			if (<%=genFeature.getSafeName()%> != null)
-        <%if (!genFeature.isBidirectional()) {%>
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-			if (new<%=genFeature.getCapName()%> != null)
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-			if (new<%=genFeature.getCapName()%> != null)
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>).eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-        <%}%>
-			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-        <%if (genFeature.isUnsettable()) {%>
-		else
-    	{
-          <%if (genModel.isVirtualDelegation()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-          <%} else if (genClass.isESetFlag(genFeature)) {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-            <%}%>
-			<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
-          <%} else {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-            <%}%>
-			<%=genFeature.getUncapName()%>ESet = true;
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-			if (eNotificationRequired())
-				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>, !old<%=genFeature.getCapName()%>ESet));
-          <%}%>
-    	}
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		else if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
-          <%}%>
-        <%}%>
-      <%} else {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
-          <%}%>
-		if (new<%=genFeature.getCapName()%>) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
-        <%} else {%>
-          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-            <%}%>
-          <%}%>
-          <%if (genFeature.isEnumType()) {%>
-            <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getUpperName()%>_EDEFAULT : new<%=genFeature.getCapName()%>;
-            <%} else {%>
-		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getUpperName()%>_EDEFAULT : new<%=genFeature.getCapName()%>;
-            <%}%>
-          <%} else {%>
-            <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
-            <%} else {%>
-		<%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
-            <%}%>
-          <%}%>
-          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getSafeName()%>);
-          <%}%>
-        <%}%>
-        <%if (genFeature.isUnsettable()) {%>
-          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
-          <%} else if (genClass.isESetFlag(genFeature)) {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-            <%}%>
-		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
-          <%} else {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-            <%}%>
-		<%=genFeature.getUncapName()%>ESet = true;
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? <%if (genFeature.isReferenceType()) {%>null<%} else {%><%=genFeature.getUpperName()%>_EDEFAULT<%}%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>));
-          <%}%>
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? <%if (genFeature.isReferenceType()) {%>null<%} else {%><%=genFeature.getUpperName()%>_EDEFAULT<%}%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>));
-          <%}%>
-        <%}%>
-      <%}%>
-<%@ include file="Class/setGenFeature.post.insert.javajetinc" fail="silent" %>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType()%>(<%}%>new<%=genFeature.getCapName()%><%if (genFeature.isPrimitiveType()) {%>)<%}%>);
-      <%} else {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType()%>(<%}%>new<%=genFeature.getCapName()%><%if (genFeature.isPrimitiveType()) {%>)<%}%>);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/setGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to set the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/setGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/setGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicUnset()) {%>
-<%@ include file="Class/basicUnsetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicUnset<%=genFeature.getAccessorName()%>(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-    <%if (!genFeature.isVolatile()) {%>
-      <%if (genModel.isVirtualDelegation()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-      <%} else {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-		<%=genFeature.getSafeName()%> = null;
-      <%}%>
-      <%if (genModel.isVirtualDelegation()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
-      <%} else if (genClass.isESetFlag(genFeature)) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-      <%} else {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-		<%=genFeature.getUncapName()%>ESet = false;
-      <%}%>
-        <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-        <%}%>
-    <%} else {%>
-<%@ include file="Class/basicUnsetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to unset the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// -> this method is automatically invoked to keep the containment relationship in synch
-		// -> do not modify other features
-		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/basicUnsetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%@ end %><%//Class.basicUnsetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (genFeature.isUnset() && (isImplementation || !genFeature.isSuppressedUnsetVisibility())) {%>
-<%@ include file="Class/unsetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * Unsets the value of the '{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-  <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
-	 * @see #isSet<%=genFeature.getAccessorName()%>()
-  <%}%>
-	 * @see #<%=genFeature.getGetAccessor()%>()
-  <%if (!genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
-	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%>)
-  <%}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	void unset<%=genFeature.getAccessorName()%>();
-
-<%} else {%>
-	public void unset<%=genFeature.getAccessorName()%>()
-	{
-    <%if (genModel.isReflectiveDelegation()) {%>
-		eUnset(<%=genFeature.getQualifiedFeatureAccessor()%>);
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (<%=genFeature.getSafeName()%> != null) ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable)<%=genFeature.getSafeName()%>).unset();
-      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (<%=genFeature.getSafeName()%> != null)
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
-        <%if (!genFeature.isBidirectional()) {%>
-			msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-			msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-        <%}%>
-			msgs = basicUnset<%=genFeature.getAccessorName()%>(msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else
-    	{
-        <%if (genModel.isVirtualDelegation()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-          <%}%>
-			<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-          <%}%>
-			<%=genFeature.getUncapName()%>ESet = false;
-        <%}%>
-        <%if (!genModel.isSuppressNotification()) {%>
-			if (eNotificationRequired())
-				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, null, null, old<%=genFeature.getCapName()%>ESet));
-        <%}%>
-    	}
-      <%} else {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
-          <%}%>
-        <%} else if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-          <%}%>
-        <%}%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-          <%}%>
-        <%}%>
-        <%if (genFeature.isReferenceType()) {%>
-		<%=genFeature.getSafeName()%> = null;
-          <%if (!genModel.isVirtualDelegation()) {%>
-            <%if (genClass.isESetFlag(genFeature)) {%>
-		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-            <%} else {%>
-		<%=genFeature.getUncapName()%>ESet = false;
-            <%}%>
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
-          <%}%>
-        <%} else {%>
-          <%if (genClass.isFlag(genFeature)) {%>
-		if (<%=genFeature.getUpperName()%>_EDEFAULT) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
-          <%} else if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
-		<%=genFeature.getSafeName()%> = <%=genFeature.getUpperName()%>_EDEFAULT;
-          <%}%>
-          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
-            <%if (genClass.isESetFlag(genFeature)) {%>
-		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-            <%} else {%>
-		<%=genFeature.getUncapName()%>ESet = false;
-            <%}%>
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? old<%=genFeature.getCapName()%> : <%=genFeature.getUpperName()%>_EDEFAULT<%} else {%>old<%=genFeature.getCapName()%><%}%>, <%=genFeature.getUpperName()%>_EDEFAULT, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
-          <%}%>
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%} else {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/unsetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to unset the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/unsetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/unsetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (genFeature.isIsSet() && (isImplementation || !genFeature.isSuppressedIsSetVisibility())) {%>
-<%@ include file="Class/isSetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * Returns whether the value of the '{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%> is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%> is set.
-    <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
-	 * @see #unset<%=genFeature.getAccessorName()%>()
-    <%}%>
-	 * @see #<%=genFeature.getGetAccessor()%>()
-    <%if (!genFeature.isListType() && genFeature.isChangeable() && !genFeature.isSuppressedSetVisibility()) {%>
-	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%>)
-    <%}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	boolean isSet<%=genFeature.getAccessorName()%>();
-
-<%} else {%>
-	public boolean isSet<%=genFeature.getAccessorName()%>()
-	{
-    <%if (genModel.isReflectiveDelegation()) {%>
-		return eIsSet(<%=genFeature.getQualifiedFeatureAccessor()%>);
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		return <%=genFeature.getSafeName()%> != null && ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable)<%=genFeature.getSafeName()%>).isSet();
-      <%} else {%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		return eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-		return (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-        <%} else {%>
-		return <%=genFeature.getUncapName()%>ESet;
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%} else {%>
-		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/isSetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to return whether the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%> is set
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/isSetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/isSetGenFeature.override.javajetinc%>
-  <%}%>
-<%@ include file="Class/genFeature.insert.javajetinc" fail="silent" %>
-<%@ end %><%//Class/genFeature.override.javajetinc%>
-<%}//for%>
-<%}}.run();%>
-<%for (Iterator i= (isImplementation ? genClass.getImplementedGenOperations() : genClass.getDeclaredGenOperations()).iterator(); i.hasNext();) { GenOperation genOperation = (GenOperation)i.next();%>
-<%@ include file="Class/genOperation.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-  <%if (genOperation.hasDocumentation()) {%>
-	 * <!-- begin-model-doc -->
-	 * <%=genOperation.getDocumentation(genModel.getIndentation(stringBuffer))%>
-	 * <!-- end-model-doc -->
-  <%}%>
-  <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genOperation.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
-	 * @model <%=modelInfo%>
-  <%} else {%>
-	 *        <%=modelInfo%>
-  <%}} if (first) {%>
-	 * @model
-  <%}}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	<%=genOperation.getImportedType()%> <%=genOperation.getName()%>(<%=genOperation.getParameters()%>)<%=genOperation.getThrows()%>;
-
-<%} else {%>
-	public <%=genOperation.getImportedType()%> <%=genOperation.getName()%>(<%=genOperation.getParameters()%>)<%=genOperation.getThrows()%>
-	{
-  <%if (genOperation.hasBody()) {%>
-		<%=genOperation.getBody(genModel.getIndentation(stringBuffer))%>
-  <%} else if (genOperation.isInvariant()) {GenClass opClass = genOperation.getGenClass(); String diagnostics = ((GenParameter)genOperation.getGenParameters().get(0)).getName(); String context = ((GenParameter)genOperation.getGenParameters().get(1)).getName();%>
-		// TODO: implement this method
-		// -> specify the condition that violates the invariant
-		// -> verify the details of the diagnostic, including severity and message
-		// Ensure that you remove @generated or mark it @generated NOT
-		if (false)
-		{
-			if (<%=diagnostics%> != null)
-			{
-				<%=diagnostics%>.add
-					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
-						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
-						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.DIAGNOSTIC_SOURCE,
-						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.<%=opClass.getOperationID(genOperation)%>,
-						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericInvariant_diagnostic", new Object[] { "<%=genOperation.getName()%>", <%=genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator")%>.getObjectLabel(this, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
-						 new Object [] { this }));
-			}
-			return false;
-		}
-		return true;
-  <%} else {%>
-<%@ include file="Class/implementedGenOperation.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/implementedGenOperation.todo.override.javajetinc%>
-  <%}%>
-	}
-
-<%}%>
-<%@ include file="Class/genOperation.insert.javajetinc" fail="silent" %>
-<%@ end %><%//Class/implementedGenOperation.override.javajetinc%>
-<%}//for%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseAddGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseAdd(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getEInverseAddGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap()).basicAdd(otherEnd, msgs);
-      <%} else {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)<%=genFeature.getGetAccessor()%>()).basicAdd(otherEnd, msgs);
-      <%}%>
-    <%} else if (genFeature.isContainer()) {%>
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-      <%if (genFeature.isBasicSet()) {%>
-				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)otherEnd, msgs);
-      <%} else {%>
-				return eBasicSetContainer(otherEnd, <%=genClass.getQualifiedFeatureID(genFeature)%>, msgs);
-      <%}%>
-    <%} else {%>
-      <%if (genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-      <%}%>
-				if (<%=genFeature.getSafeName()%> != null)
-      <%if (genFeature.isEffectiveContains()) {%>
-					msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-      <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-					msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-      <%}%>
-				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)otherEnd, msgs);
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-<%} else {%>
-		return eDynamicInverseAdd(otherEnd, featureID, msgs);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseRemoveGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseRemove(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getEInverseRemoveGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap()).basicRemove(otherEnd, msgs);
-      <%} else if (genFeature.isWrappedFeatureMapType()) {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).basicRemove(otherEnd, msgs);
-      <%} else {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)<%=genFeature.getGetAccessor()%>()).basicRemove(otherEnd, msgs);
-      <%}%>
-    <%} else if (genFeature.isContainer() && !genFeature.isBasicSet()) {%>
-				return eBasicSetContainer(null, <%=genClass.getQualifiedFeatureID(genFeature)%>, msgs);
-    <%} else if (genFeature.isUnsettable()) {%>
-				return basicUnset<%=genFeature.getAccessorName()%>(msgs);
-    <%} else {%>
-				return basicSet<%=genFeature.getAccessorName()%>(null, msgs);
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-<%} else {%>
-		return eDynamicInverseRemove(otherEnd, featureID, msgs);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEBasicRemoveFromContainerGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eBasicRemoveFromContainerFeature(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-		switch (eContainerFeatureID)
-		{
-<%for (Iterator i=genClass.getEBasicRemoveFromContainerGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-				return eInternalContainer().eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eBasicRemoveFromContainerFeature(msgs);
-<%} else {%>
-		return eDynamicBasicRemoveFromContainer(msgs);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && !genClass.getImplementedGenFeatures().isEmpty()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getAllGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isPrimitiveType()) {%>
-      <%if (genFeature.isBooleanType()) {%>
-				return <%=genFeature.getGetAccessor()%>() ? Boolean.TRUE : Boolean.FALSE;
-      <%} else {%>
-				return new <%=genFeature.getObjectType()%>(<%=genFeature.getGetAccessor()%>());
-      <%}%>
-    <%} else if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
-				if (resolve) return <%=genFeature.getGetAccessor()%>();
-				return basicGet<%=genFeature.getAccessorName()%>();
-    <%} else if (genFeature.isMapType()) {%>
-      <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
-				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap();
-				else return <%=genFeature.getGetAccessor()%>();
-      <%} else {%>
-				if (coreType) return <%=genFeature.getGetAccessor()%>();
-				else return <%=genFeature.getGetAccessor()%>().map();
-      <%}%>
-    <%} else if (genFeature.isWrappedFeatureMapType()) {%>
-				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap();
-				return <%=genFeature.getGetAccessor()%>();
-    <%} else if (genFeature.isFeatureMapType()) {%>
-				if (coreType) return <%=genFeature.getGetAccessor()%>();
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).getWrapper();
-    <%} else {%>
-				return <%=genFeature.getGetAccessor()%>();
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eGet(featureID, resolve, coreType);
-<%} else {%>
-		return eDynamicGet(featureID, resolve, coreType);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getESetGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getESetGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isWrappedFeatureMapType()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).set(newValue);
-      <%} else if (genFeature.isFeatureMapType()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).set(newValue);
-      <%} else if (genFeature.isMapType()) {%>
-        <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap()).set(newValue);
-        <%} else {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)<%=genFeature.getGetAccessor()%>()).set(newValue);
-        <%}%>
-      <%} else {%>
-				<%=genFeature.getGetAccessor()%>().clear();
-				<%=genFeature.getGetAccessor()%>().addAll((<%=genModel.getImportedName("java.util.Collection")%>)newValue);
-      <%}%>
-    <%} else if (genFeature.isPrimitiveType()) {%>
-				set<%=genFeature.getAccessorName()%>(((<%=genFeature.getObjectType()%>)newValue).<%=genFeature.getPrimitiveValueFunction()%>());
-    <%} else {%>
-				set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)newValue);
-    <%}%>
-				return;
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		super.eSet(featureID, newValue);
-<%} else {%>
-		eDynamicSet(featureID, newValue);
-<%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getESetGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
-      <%if (genFeature.isWrappedFeatureMapType()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().clear();
-      <%} else {%>
-				<%=genFeature.getGetAccessor()%>().clear();
-      <%}%>
-    <%} else if (genFeature.isUnsettable()) {%>
-				unset<%=genFeature.getAccessorName()%>();
-    <%} else if (genFeature.isReferenceType()) {%>
-				set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)null);
-    <%} else {%>
-				set<%=genFeature.getAccessorName()%>(<%=genFeature.getUpperName()%>_EDEFAULT);
-    <%}%>
-				return;
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		super.eUnset(featureID);
-<%} else {%>
-		eDynamicUnset(featureID);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && !genClass.getImplementedGenFeatures().isEmpty()) {%>
-<%@ include file="Class/eIsSet.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID)
-	{	
-//UMA-->
-		<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%> feature = getFeatureWithOverridenDefaultValue(featureID);
-		if(feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-//UMA<--		
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getAllGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
-      <%if (genFeature.isWrappedFeatureMapType()) {%>
-        <%if (genFeature.isVolatile()) {%>
-				return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().isEmpty();
-        <%} else {%>
-				return <%=genFeature.getSafeName()%> != null && !<%=genFeature.getSafeName()%>.featureMap().isEmpty();
-        <%}%>
-      <%} else {%>
-        <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getSafeName()%> != null && !<%=genFeature.getSafeName()%>.isEmpty();
-        <%} else {%>
-          <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-				return <%=genFeature.getSafeName()%> != null && !<%=genFeature.getSafeName()%>.isEmpty();
-          <%} else {%>
-				return !<%=genFeature.getGetAccessor()%>().isEmpty();
-          <%}%>
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.isUnsettable()) {%>
-				return isSet<%=genFeature.getAccessorName()%>();
-    <%} else if (genFeature.isResolveProxies()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getSafeName()%> != null;
-      <%} else {%>
-        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>) != null;
-        <%} else {%>
-				return basicGet<%=genFeature.getAccessorName()%>() != null;
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.isReferenceType()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getSafeName()%> != null;
-      <%} else {%>
-        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>) != null;
-        <%} else {%>
-				return <%=genFeature.getGetAccessor()%>() != null;
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.isPrimitiveType() || genFeature.isEnumType()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-				return ((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0) != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%} else {%>
-				return <%=genFeature.getSafeName()%> != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%}%>
-      <%} else {%>
-        <%if (genFeature.isEnumType() && genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getUpperName()%>_EDEFAULT) != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%} else {%>
-				return <%=genFeature.getGetAccessor()%>() != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%}%>
-      <%}%>
-    <%} else {//datatype%>
-      <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getUpperName()%>_EDEFAULT == null ? <%=genFeature.getSafeName()%> != null : !<%=genFeature.getUpperName()%>_EDEFAULT.equals(<%=genFeature.getSafeName()%>);
-      <%} else {%>
-        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getUpperName()%>_EDEFAULT);
-				return <%=genFeature.getUpperName()%>_EDEFAULT == null ? <%=genFeature.getSafeName()%> != null : !<%=genFeature.getUpperName()%>_EDEFAULT.equals(<%=genFeature.getSafeName()%>);
-        <%} else {%>
-				return <%=genFeature.getUpperName()%>_EDEFAULT == null ? <%=genFeature.getGetAccessor()%>() != null : !<%=genFeature.getUpperName()%>_EDEFAULT.equals(<%=genFeature.getGetAccessor()%>());
-        <%}%>
-      <%}%>
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eIsSet(featureID);
-<%} else {%>
-		return eDynamicIsSet(featureID);
-<%}%>
-	}
-
-<%@ end %><%//Class/eIsSet.override.javajetinc%>
-<%}%>
-<%if (isImplementation && !genClass.getMixinGenFeatures().isEmpty()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass)
-	{
-  <%for (Iterator m=genClass.getMixinGenClasses().iterator(); m.hasNext();) { GenClass mixinGenClass = (GenClass)m.next(); %>
-		if (baseClass == <%=mixinGenClass.getImportedInterfaceName()%>.class)
-		{
-			switch (derivedFeatureID)
-			{
-    <%for (Iterator f=mixinGenClass.getGenFeatures().iterator(); f.hasNext();) { GenFeature genFeature = (GenFeature)f.next(); %>
-				case <%=genClass.getQualifiedFeatureID(genFeature)%>: return <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>;
-    <%}%>
-				default: return -1;
-			}
-		}
-  <%}%>
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass)
-	{
-  <%for (Iterator m=genClass.getMixinGenClasses().iterator(); m.hasNext();) { GenClass mixinGenClass = (GenClass)m.next(); %>
-		if (baseClass == <%=mixinGenClass.getImportedInterfaceName()%>.class)
-		{
-			switch (baseFeatureID)
-			{
-    <%for (Iterator f=mixinGenClass.getGenFeatures().iterator(); f.hasNext();) { GenFeature genFeature = (GenFeature)f.next(); %>
-				case <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>: return <%=genClass.getQualifiedFeatureID(genFeature)%>;
-    <%}%>
-				default: return -1;
-			}
-		}
-  <%}%>
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-<%}%>
-<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
-  <%if (eVirtualValuesField != null) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object[] eVirtualValues()
-	{
-		return <%=eVirtualValuesField%>;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void eSetVirtualValues(Object[] newValues)
-	{
-		<%=eVirtualValuesField%> = newValues;
-	}
-
-  <%}%>
-  <%{ List eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList());%>
-    <%if (!eVirtualIndexBitFields.isEmpty()) { List allEVirtualIndexBitFields = genClass.getAllEVirtualIndexBitFields(new ArrayList());%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected int eVirtualIndexBits(int offset)
-	{
-		switch (offset)
-		{
-      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
-			case <%=i%> :
-				return <%=allEVirtualIndexBitFields.get(i)%>;
-      <%}%>
-			default :
-				throw new IndexOutOfBoundsException();
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void eSetVirtualIndexBits(int offset, int newIndexBits)
-	{
-		switch (offset)
-		{
-      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
-			case <%=i%> :
-				<%=allEVirtualIndexBitFields.get(i)%> = newIndexBits;
-				break;
-      <%}%>
-			default :
-				throw new IndexOutOfBoundsException();
-		}
-	}
-
-    <%}%>
-  <%}%>
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && !genClass.getToStringGenFeatures().isEmpty()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString()
-	{
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-  <%{ boolean first = true;%>
-    <%for (Iterator i=genClass.getToStringGenFeatures().iterator(); i.hasNext(); ) { GenFeature genFeature = (GenFeature)i.next();%>
-      <%if (first) { first = false;%>
-		result.append(" (<%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
-      <%} else {%>
-		result.append(", <%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
-      <%}%>
-      <%if (genFeature.isUnsettable() && !genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		if (eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>)) result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>)); else result.append("<unset>");<%=genModel.getNonNLS()%>
-        <%} else {%>
-          <%if (genClass.isFlag(genFeature)) {%>
-		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0); else result.append("<unset>");<%=genModel.getNonNLS()%>
-          <%} else {%>
-		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append(<%=genFeature.getSafeName()%>); else result.append("<unset>");<%=genModel.getNonNLS()%>
-          <%}%>
-        <%}%>
-      <%} else {%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (!genFeature.isListType() && !genFeature.isReferenceType()){%>, <%=genFeature.getUpperName()%>_EDEFAULT<%}%>));
-        <%} else {%>
-          <%if (genClass.isFlag(genFeature)) {%>
-		result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0);
-          <%} else {%>
-		result.append(<%=genFeature.getSafeName()%>);
-          <%}%>
-        <%}%>
-      <%}%>
-    <%}%>
-  <%}%>
-		result.append(')');
-		return result.toString();
-	}
-
-<%}%>
-<%if (isImplementation && genClass.isMapEntry()) { GenFeature keyFeature = genClass.getMapEntryKeyFeature(); GenFeature valueFeature = genClass.getMapEntryValueFeature();%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected int hash = -1;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getHash()
-	{
-		if (hash == -1)
-		{
-			Object theKey = getKey();
-			hash = (theKey == null ? 0 : theKey.hashCode());
-		}
-		return hash;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHash(int hash)
-	{
-		this.hash = hash;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getKey()
-	{
-  <%if (keyFeature.isPrimitiveType()) {%>
-		return new <%=keyFeature.getObjectType()%>(getTypedKey());
-  <%} else {%>
-		return getTypedKey();
-  <%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKey(Object key)
-	{
-  <%if (keyFeature.isListType()) {%>
-		getTypedKey().addAll((<%=genModel.getImportedName("java.util.Collection")%>)key);
-  <%} else if (keyFeature.isPrimitiveType()) {%>
-		setTypedKey(((<%=keyFeature.getObjectType()%>)key).<%=keyFeature.getPrimitiveValueFunction()%>());
-  <%} else {%>
-		setTypedKey((<%=keyFeature.getImportedType()%>)key);
-  <%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getValue()
-	{
-  <%if (valueFeature.isPrimitiveType()) {%>
-		return new <%=valueFeature.getObjectType()%>(getTypedValue());
-  <%} else {%>
-		return getTypedValue();
-  <%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object setValue(Object value)
-	{
-		Object oldValue = getValue();
-  <%if (valueFeature.isListType()) {%>
-		getTypedValue().clear();
-		getTypedValue().addAll((<%=genModel.getImportedName("java.util.Collection")%>)value);
-  <%} else if (valueFeature.isPrimitiveType()) {%>
-		setTypedValue(((<%=valueFeature.getObjectType()%>)value).<%=valueFeature.getPrimitiveValueFunction()%>());
-  <%} else {%>
-		setTypedValue((<%=valueFeature.getImportedType()%>)value);
-  <%}%>
-		return oldValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%> getEMap()
-	{
-		<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%> container = eContainer();
-		return container == null ? null : (<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>)container.eGet(eContainmentFeature());
-	}
-
-<%}%>
-<%@ include file="Class/insert.javajetinc" fail="silent" %>
-} //<%=isInterface ? " " + genClass.getInterfaceName() : genClass.getClassName()%>
-<%// TODO fix the space above%>
-<%genModel.emitSortedImports();%>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.ecore/templates/model/Class.javajet.org b/1.5/plugins/org.eclipse.epf.uma.ecore/templates/model/Class.javajet.org
deleted file mode 100644
index fc527b5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.ecore/templates/model/Class.javajet.org
+++ /dev/null
@@ -1,1811 +0,0 @@
-<%@ jet package="org.eclipse.emf.codegen.ecore.templates.model" imports="java.util.* org.eclipse.emf.codegen.ecore.genmodel.*" class="Class" version="$Id$" %>
-<%
-/**
- * <copyright>
- *
- * Copyright (c) 2002-2005 IBM Corporation and others.
- * All rights reserved.   This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *   IBM - Initial API and implementation
- *
- * </copyright>
- */
-%>
-<%final GenClass genClass = (GenClass)((Object[])argument)[0]; final GenPackage genPackage = genClass.getGenPackage(); final GenModel genModel=genPackage.getGenModel();%>
-<%final boolean isInterface = Boolean.TRUE.equals(((Object[])argument)[1]); final boolean isImplementation = Boolean.TRUE.equals(((Object[])argument)[2]);%>
-<%final String publicStaticFinalFlag = isImplementation ? "public static final " : "";%>
-<%@ include file="../Header.javajetinc"%>
-<%if (isInterface) {%>
-package <%=genPackage.getInterfacePackageName()%>;
-<%} else {%>
-package <%=genPackage.getClassPackageName()%>;
-<%}%>
-
-<%genModel.markImportLocation(stringBuffer, genPackage);%>
-
-<%if (isInterface) {%>
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
- * <!-- end-user-doc -->
-<%if (genClass.hasDocumentation()) {%>
- *
- * <!-- begin-model-doc -->
- * <%=genClass.getDocumentation(genModel.getIndentation(stringBuffer))%>
- * <!-- end-model-doc -->
-<%}%>
- *
-<%if (!genClass.getGenFeatures().isEmpty()) {%>
- * <p>
- * The following features are supported:
- * <ul>
-<%for (Iterator i=genClass.getGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genFeature.isSuppressedGetVisibility()) {%>
- *   <li>{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
-  <%}%>
-<%}%>
- * </ul>
- * </p>
-<%}%>
- *
-<%if (!genModel.isSuppressEMFMetaData()) {%>
- * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genClass.getClassifierAccessorName()%>()
-<%}%>
-<%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
- * @model <%=modelInfo%>
-<%} else {%>
- *        <%=modelInfo%>
-<%}} if (first) {%>
- * @model
-<%}}%>
-<%if (genClass.needsRootExtendsInterfaceExtendsTag()) {%>
- * @extends <%=genModel.getImportedName(genModel.getRootExtendsInterface())%>
-<%}%>
- * @generated
- */
-<%} else {%>
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b><%=genClass.getFormattedName()%></b></em>'.
- * <!-- end-user-doc -->
- * <p>
-<%if (!genClass.getImplementedGenFeatures().isEmpty()) {%>
- * The following features are implemented:
- * <ul>
-<%for (Iterator i=genClass.getImplementedGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
- *   <li>{@link <%=genClass.getQualifiedClassName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}</li>
-<%}%>
- * </ul>
-<%}%>
- * </p>
- *
- * @generated
- */
-<%}%>
-<%if (isImplementation) {%>
-public<%if (genClass.isAbstract()) {%> abstract<%}%> class <%=genClass.getClassName()%><%=genClass.getClassExtends()%><%=genClass.getClassImplements()%>
-<%} else {%>
-public interface <%=genClass.getInterfaceName()%><%=genClass.getInterfaceExtends()%>
-<%}%>
-{
-<%if (genModel.getCopyrightText() != null) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	<%=publicStaticFinalFlag%><%=genModel.getImportedName("java.lang.String")%> copyright = "<%=genModel.getCopyrightText()%>";<%=genModel.getNonNLS()%>
-
-<%}%>
-<%if (isImplementation && genModel.getDriverNumber() != null) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final <%=genModel.getImportedName("java.lang.String")%> mofDriverNumber = "<%=genModel.getDriverNumber()%>";<%=genModel.getNonNLS()%>
-
-<%}%>
-<%if (isImplementation && genClass.isJavaIOSerializable()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-<%}%>
-<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
-  <%if (eVirtualValuesField != null) {%>
-	/**
-	 * An array of objects representing the values of non-primitive features.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object[] <%=eVirtualValuesField%> = null;
-
-  <%}%>
-  <%{ List eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList());%>
-    <%if (!eVirtualIndexBitFields.isEmpty()) {%>
-      <%for (Iterator i = eVirtualIndexBitFields.iterator(); i.hasNext();) { String eVirtualIndexBitField = (String)i.next();%>
-	/**
-	 * A bit field representing the indices of non-primitive feature values.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected int <%=eVirtualIndexBitField%> = 0;
-
-      <%}%>
-    <%}%>
-  <%}%>
-<%}%>
-<%if (isImplementation && genClass.isModelRoot() && genModel.isBooleanFlagsEnabled() && genModel.getBooleanFlagsReservedBits() == -1) {%>
-	/**
-	 * A set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected int <%=genModel.getBooleanFlagsField()%> = 0;
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation()) {%>
-  <%for (Iterator i=genClass.getDeclaredFieldGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-<%@ include file="Class/declaredFieldGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-    <%if (genFeature.isListType() || genFeature.isReferenceType()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-	/**
-	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected <%=genFeature.getImportedInternalType()%> <%=genFeature.getSafeName()%> = null;
-
-      <%}%>
-      <%if (genModel.isArrayAccessors() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) {%>
-	/**
-	 * The empty value for the '{@link #<%=genFeature.getGetArrayAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' array accessor.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetArrayAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final <%=genFeature.getListItemType()%>[] <%=genFeature.getUpperName()%>_EEMPTY_ARRAY = new <%=genFeature.getListItemType()%> [0];
-
-      <%}%>
-    <%} else {%>
-      <%if (!genFeature.isVolatile() || !genModel.isReflectiveDelegation() && (!genFeature.hasDelegateFeature() || !genFeature.isUnsettable())) {%>
-	/**
-	 * The default value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final <%=genFeature.getImportedType()%> <%=genFeature.getUpperName()%>_EDEFAULT = <%=genFeature.getStaticDefaultValue()%>;<%=genModel.getNonNLS(genFeature.getStaticDefaultValue())%>
-
-      <%}%>
-      <%if (genClass.isField(genFeature)) {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-          <%if (genClass.getFlagIndex(genFeature) > 31 && genClass.getFlagIndex(genFeature) % 32 == 0) {%>
-	/**
-	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected int <%=genClass.getFlagsField(genFeature)%> = 0;
-
-          <%}%>
-	/**
-	 * The flag representing the value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int <%=genFeature.getUpperName()%>_EFLAG = 1 <%="<< " + genClass.getFlagIndex(genFeature) % 32 %>;
-
-        <%} else {%>
-	/**
-	 * The cached value of the '{@link #<%=genFeature.getGetAccessor()%>() <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 * @ordered
-	 */
-	protected <%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = <%=genFeature.getUpperName()%>_EDEFAULT;
-
-        <%}%>
-      <%}%>
-    <%}%>
-    <%if (genClass.isESetField(genFeature)) {%>
-      <%if (genClass.isESetFlag(genFeature)) {%>
-        <%if (genClass.getESetFlagIndex(genFeature) > 31 && genClass.getESetFlagIndex(genFeature) % 32 == 0) {%>
-	/**
-	 * An additional set of bit flags representing the values of boolean attributes and whether unsettable features have been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected int <%=genClass.getESetFlagsField(genFeature)%> = 0;
-
-        <%}%>
-	/**
-	 * The flag representing whether the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int <%=genFeature.getUpperName()%>_ESETFLAG = 1 <%="<< " + genClass.getESetFlagIndex(genFeature) % 32 %>;
-
-      <%} else {%>
-	/**
-	 * This is true if the <%=genFeature.getFormattedName()%> <%=genFeature.getFeatureKind()%> has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean <%=genFeature.getUncapName()%>ESet = false;
-
-      <%}%>
-    <%}%>
-  <%}%>
-<%@ include file="Class/declaredFieldGenFeature.insert.javajetinc" fail="silent" %>
-<%@ end %><%//Class/declaredFieldGenFeature.override.javajetinc%>
-<%}%>
-<%if (isImplementation) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected <%=genClass.getClassName()%>()
-	{
-		super();
-  <%for (Iterator i=genClass.getFlagGenFeatures("true").iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-		<%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG;
-  <%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected <%=genModel.getImportedName("org.eclipse.emf.ecore.EClass")%> eStaticClass()
-	{
-		return <%=genClass.getQualifiedClassifierAccessor()%>;
-	}
-
-<%}%>
-<%new Runnable() { public void run() {%>
-<%for (Iterator i=(isImplementation ? genClass.getImplementedGenFeatures() : genClass.getDeclaredGenFeatures()).iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-<%@ include file="Class/genFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-  <%if (genModel.isArrayAccessors() && genFeature.isListType() && !genFeature.isFeatureMapType() && !genFeature.isMapType()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	<%=genFeature.getListItemType()%>[] <%=genFeature.getGetArrayAccessor()%>();
-
-    <%} else {%>
-	public <%=genFeature.getListItemType()%>[] <%=genFeature.getGetArrayAccessor()%>()
-	{
-      <%if (genFeature.isVolatile()) {%>
-		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>)<%=genFeature.getGetAccessor()%>();
-		if (list.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
-      <%} else {%>
-		if (<%=genFeature.getSafeName()%> == null || <%=genFeature.getSafeName()%>.isEmpty()) return <%=genFeature.getUpperName()%>_EEMPTY_ARRAY;
-		<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%> list = (<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>)<%=genFeature.getSafeName()%>;
-      <%}%>
-		list.shrink();
-		return (<%=genFeature.getListItemType()%>[])list.data();
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	<%=genFeature.getListItemType()%> get<%=genFeature.getAccessorName()%>(int index);
-
-    <%} else {%>
-	public <%=genFeature.getListItemType()%> get<%=genFeature.getAccessorName()%>(int index)
-	{
-		return (<%=genFeature.getListItemType()%>)<%=genFeature.getGetAccessor()%>().get(index);
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	int get<%=genFeature.getAccessorName()%>Length();
-
-    <%} else {%>
-	public int get<%=genFeature.getAccessorName()%>Length()
-	{
-      <%if (genFeature.isVolatile()) {%>
-		return <%=genFeature.getGetAccessor()%>().size();
-      <%} else {%>
-		return <%=genFeature.getSafeName()%> == null ? 0 : <%=genFeature.getSafeName()%>.size();
-      <%}%>
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType()%>[] new<%=genFeature.getCapName()%>);
-
-    <%} else {%>
-	public void set<%=genFeature.getAccessorName()%>(<%=genFeature.getListItemType()%>[] new<%=genFeature.getCapName()%>)
-	{
-		((<%=genModel.getImportedName("org.eclipse.emf.common.util.BasicEList")%>)<%=genFeature.getGetAccessor()%>()).setData(new<%=genFeature.getCapName()%>.length, new<%=genFeature.getCapName()%>);
-	}
-
-    <%}%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    <%if (!isImplementation) {%>
-	void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType()%> element);
-
-    <%} else {%>
-	public void set<%=genFeature.getAccessorName()%>(int index, <%=genFeature.getListItemType()%> element)
-	{
-		<%=genFeature.getGetAccessor()%>().set(index, element);
-	}
-
-    <%}%>
-  <%}%>
-  <%if (genFeature.isGet() && (isImplementation || !genFeature.isSuppressedGetVisibility())) {%>
-<%@ include file="Class/getGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * Returns the value of the '<em><b><%=genFeature.getFormattedName()%></b></em>' <%=genFeature.getFeatureKind()%>.
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isMapType()) { GenFeature keyFeature = genFeature.getMapEntryTypeGenClass().getMapEntryKeyFeature(); GenFeature valueFeature = genFeature.getMapEntryTypeGenClass().getMapEntryValueFeature(); %>
-	 * The key is of type <%if (keyFeature.isListType()) {%>list of {@link <%=keyFeature.getQualifiedListItemType()%>}<%} else {%>{@link <%=keyFeature.getType()%>}<%}%>,
-	 * and the value is of type <%if (valueFeature.isListType()) {%>list of {@link <%=valueFeature.getQualifiedListItemType()%>}<%} else {%>{@link <%=valueFeature.getType()%>}<%}%>,
-      <%} else if (!genFeature.isWrappedFeatureMapType() && !(genModel.isSuppressEMFMetaData() && "org.eclipse.emf.ecore.EObject".equals(genFeature.getQualifiedListItemType()))) {%>
-	 * The list contents are of type {@link <%=genFeature.getQualifiedListItemType()%>}.
-      <%}%>
-    <%} else if (genFeature.isSetDefaultValue()) {%>
-	 * The default value is <code><%=genFeature.getDefaultValue()%></code>.
-    <%}%>
-    <%if (genFeature.getTypeGenEnum() != null) {%>
-	 * The literals are from the enumeration {@link <%=genFeature.getTypeGenEnum().getQualifiedName()%>}.
-    <%}%>
-    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
-      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
-	 * It is bidirectional and its opposite is '{@link <%=reverseGenFeature.getGenClass().getQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%> <em><%=reverseGenFeature.getFormattedName()%></em>}'.
-      <%}%>
-    <%}%>
-	 * <!-- begin-user-doc -->
-    <%if (!genFeature.hasDocumentation()) {%>
-	 * <p>
-	 * If the meaning of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%> isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-    <%}%>
-	 * <!-- end-user-doc -->
-    <%if (genFeature.hasDocumentation()) {%>
-	 * <!-- begin-model-doc -->
-	 * <%=genFeature.getDocumentation(genModel.getIndentation(stringBuffer))%>
-	 * <!-- end-model-doc -->
-    <%}%>
-	 * @return the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
-    <%if (genFeature.getTypeGenEnum() != null) {%>
-	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
-    <%}%>
-    <%if (genFeature.isUnsettable()) {%>
-      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
-	 * @see #isSet<%=genFeature.getAccessorName()%>()
-      <%}%>
-      <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
-	 * @see #unset<%=genFeature.getAccessorName()%>()
-      <%}%>
-    <%}%>
-    <%if (genFeature.isChangeable() && !genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
-	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%>)
-    <%}%>
-    <%if (!genModel.isSuppressEMFMetaData()) {%>
-	 * @see <%=genPackage.getQualifiedPackageInterfaceName()%>#get<%=genFeature.getFeatureAccessorName()%>()
-    <%}%>
-    <%if (genFeature.isBidirectional() && !genFeature.getReverse().getGenClass().isMapEntry()) { GenFeature reverseGenFeature = genFeature.getReverse(); %>
-      <%if (!reverseGenFeature.isSuppressedGetVisibility()) {%>
-	 * @see <%=reverseGenFeature.getGenClass().getQualifiedInterfaceName()%>#<%=reverseGenFeature.getGetAccessor()%>
-      <%}%>
-    <%}%>
-    <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genFeature.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
-	 * @model <%=modelInfo%>
-    <%} else {%>
-	 *        <%=modelInfo%>
-    <%}} if (first) {%>
-	 * @model
-    <%}}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	<%=genFeature.getImportedType()%> <%=genFeature.getGetAccessor()%>();
-
-<%} else {%>
-	public <%=genFeature.getImportedType()%> <%=genFeature.getGetAccessor()%>()
-	{
-<%@ include file="Class/getGenFeature.pre.insert.javajetinc" fail="silent" %>
-    <%if (genModel.isReflectiveDelegation()) {%>
-		return <%if (genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType()%>)eGet(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (<%=genFeature.getSafeName()%> == null)
-		{
-        <%if (genModel.isVirtualDelegation()) {%>
-			eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>);
-        <%} else {%>
-			<%=genFeature.getSafeName()%> = new <%=genClass.getListConstructor(genFeature)%>;
-        <%}%>
-		}
-		return <%=genFeature.getSafeName()%><%=genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes() ? ".map()" : ""%>;
-      <%} else if (genFeature.isContainer()) {%>
-		if (eContainerFeatureID != <%=genClass.getQualifiedFeatureID(genFeature)%>) return null;
-		return (<%=genFeature.getImportedType()%>)eContainer();
-      <%} else {%>
-        <%if (genFeature.isResolveProxies()) {%>
-          <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (!genFeature.isReferenceType()) {%>, <%=genFeature.getUpperName()%>_EDEFAULT<%}%>);
-          <%}%>
-		if (<%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeNameAsEObject()%>.eIsProxy())
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> old<%=genFeature.getCapName()%> = (<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>;
-			<%=genFeature.getSafeName()%> = <%=genFeature.getNonEObjectInternalTypeCast()%>eResolveProxy(old<%=genFeature.getCapName()%>);
-			if (<%=genFeature.getSafeName()%> != old<%=genFeature.getCapName()%>)
-			{
-          <%if (genFeature.isEffectiveContains()) {%>
-				<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> new<%=genFeature.getCapName()%> = (<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>;
-          <%if (!genFeature.isBidirectional()) {%>
-				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = old<%=genFeature.getCapName()%>.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, null);
-          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-				<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs =  old<%=genFeature.getCapName()%>.eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, null);
-          <%}%>
-				if (new<%=genFeature.getCapName()%>.eInternalContainer() == null)
-				{
-          <%if (!genFeature.isBidirectional()) {%>
-					msgs = new<%=genFeature.getCapName()%>.eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-          <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-					msgs =  new<%=genFeature.getCapName()%>.eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-          <%}%>
-				}
-				if (msgs != null) msgs.dispatch();
-          <%} else if (genModel.isVirtualDelegation()) {%>
-				eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getSafeName()%>);
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-				if (eNotificationRequired())
-					eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.RESOLVE, <%=genClass.getQualifiedFeatureID(genFeature)%>, old<%=genFeature.getCapName()%>, <%=genFeature.getSafeName()%>));
-          <%}%>
-			}
-		}
-        <%}%>
-        <%if (!genFeature.isResolveProxies() && genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		return (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (!genFeature.isReferenceType()) {%>, <%=genFeature.getUpperName()%>_EDEFAULT<%}%>);
-        <%} else if (genClass.isFlag(genFeature)) {%>
-		return (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
-        <%} else {%>
-		return <%=genFeature.getSafeName()%>;
-        <%}%>
-      <%}%>
-    <%} else {//volatile%>
-      <%if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = basicGet<%=genFeature.getAccessorName()%>();
-		return <%=genFeature.getSafeName()%> != null && <%=genFeature.getSafeName()%>.eIsProxy() ? <%=genFeature.getNonEObjectInternalTypeCast()%>eResolveProxy((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>) : <%=genFeature.getSafeName()%>;
-      <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-        <%if (genFeature.isFeatureMapType()) {%>
-          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return new <%=genFeature.getImportedEffectiveFeatureMapWrapperClass()%>((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().list(<%=genFeature.getQualifiedFeatureAccessor()%>));
-          <%} else {%>
-		return (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)get<%=delegateFeature.getAccessorName()%>()).list(<%=genFeature.getQualifiedFeatureAccessor()%>);
-          <%}%>
-        <%} else if (genFeature.isListType()) {%>
-          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().list(<%=genFeature.getQualifiedFeatureAccessor()%>);
-          <%} else {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>)get<%=delegateFeature.getAccessorName()%>()).list(<%=genFeature.getQualifiedFeatureAccessor()%>);
-          <%}%>
-        <%} else {%>
-          <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return <%if (genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType()%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
-          <%} else {%>
-		return <%if (genFeature.isPrimitiveType()) {%>(<%}%>(<%=genFeature.getObjectType()%>)get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, true)<%if (genFeature.isPrimitiveType()) {%>).<%=genFeature.getPrimitiveValueFunction()%>()<%}%>;
-          <%}%>
-        <%}%>
-      <%} else {%>
-<%@ include file="Class/getGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// Ensure that you remove @generated or mark it @generated NOT
-        <%if (genFeature.isListType()) {%>
-		// The list is expected to implement org.eclipse.emf.ecore.util.InternalEList and org.eclipse.emf.ecore.EStructuralFeature.Setting
-		// so it's likely that an appropriate subclass of org.eclipse.emf.ecore.util.<%if (genFeature.isMapType()) {%>EcoreEMap<%} else if (genFeature.isFeatureMapType()) {%>BasicFeatureMap<%} else {%>EcoreEList<%}%> should be used.
-        <%}%>
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/getGenFeature.todo.override.javajetinc%>
-      <%}%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/getGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicGet()) {%>
-<%@ include file="Class/basicGetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genFeature.getImportedType()%> basicGet<%=genFeature.getAccessorName()%>()
-	{
-<%@ include file="Class/basicGetGenFeature.pre.insert.javajetinc" fail="silent" %>
-    <%if (genFeature.isContainer()) {%>
-		if (eContainerFeatureID != <%=genClass.getQualifiedFeatureID(genFeature)%>) return null;
-		return (<%=genFeature.getImportedType()%>)eInternalContainer();
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genModel.isVirtualDelegation()) {%>
-		return (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-      <%} else {%>
-		return <%=genFeature.getSafeName()%>;
-      <%}%>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return (<%=genFeature.getImportedType()%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
-      <%} else {%>
-		return (<%=genFeature.getImportedType()%>)get<%=delegateFeature.getAccessorName()%>().get(<%=genFeature.getQualifiedFeatureAccessor()%>, false);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/basicGetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to return the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// -> do not perform proxy resolution
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/basicGetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%@ end %><%//Class/basicGetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicSet()) {%>
-<%@ include file="Class/basicSetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedInternalType()%> new<%=genFeature.getCapName()%>, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-    <%if (genFeature.isContainer()) {%>
-<%@ include file="Class/basicSetGenFeature.pre.insert.javajetinc" fail="silent" %>
-		msgs = eBasicSetContainer((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>, <%=genClass.getQualifiedFeatureID(genFeature)%>, msgs);
-<%@ include file="Class/basicSetGenFeature.post.insert.javajetinc" fail="silent" %>
-		return msgs;
-    <%} else if (!genFeature.isVolatile()) {%>
-<%@ include file="Class/basicSetGenFeature.pre.insert.javajetinc" fail="silent" %>
-      <%if (genModel.isVirtualDelegation()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>);
-      <%} else {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%>;
-      <%}%>
-      <%if (genFeature.isUnsettable()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
-        <%} else {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-		<%=genFeature.getUncapName()%>ESet = true;
-        <%}%>
-      <%}%>
-      <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-		{
-        <%if (genFeature.isUnsettable()) {%>
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>);
-        <%} else {%>
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? null : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, new<%=genFeature.getCapName()%>);
-        <%}%>
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-      <%}%>
-<%@ include file="Class/basicSetGenFeature.post.insert.javajetinc" fail="silent" %>
-		return msgs;
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
-      <%} else {%>
-		return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).basicAdd(<%=genFeature.getQualifiedFeatureAccessor()%>, new<%=genFeature.getCapName()%>, msgs);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/basicSetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to set the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// -> this method is automatically invoked to keep the containment relationship in synch
-		// -> do not modify other features
-		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/basicSetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%@ end %><%//Class/basicSetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (genFeature.isSet() && (isImplementation || !genFeature.isSuppressedSetVisibility())) {%>
-<%@ include file="Class/setGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) { %>
-	/**
-	 * Sets the value of the '{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%>.
-    <%if (genFeature.isEnumType()) {%>
-	 * @see <%=genFeature.getTypeGenEnum().getQualifiedName()%>
-    <%}%>
-    <%if (genFeature.isUnsettable()) {%>
-      <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
-	 * @see #isSet<%=genFeature.getAccessorName()%>()
-      <%}%>
-      <%if (!genFeature.isSuppressedUnsetVisibility()) {%>
-	 * @see #unset<%=genFeature.getAccessorName()%>()
-      <%}%>
-    <%}%>
-	 * @see #<%=genFeature.getGetAccessor()%>()
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) { %>
-	void set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%> value);
-
-<%} else {%>
-	public void set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%> new<%=genFeature.getCapName()%>)
-	{
-<%@ include file="Class/setGenFeature.pre.insert.javajetinc" fail="silent" %>
-    <%if (genModel.isReflectiveDelegation()) {%>
-		eSet(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType()%>(<%}%>new<%=genFeature.getCapName()%><%if (genFeature.isPrimitiveType()) {%>)<%}%>);
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isContainer()) { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-		if (new<%=genFeature.getCapName()%> != eInternalContainer() || (eContainerFeatureID != <%=genClass.getQualifiedFeatureID(genFeature)%> && new<%=genFeature.getCapName()%> != null))
-		{
-			if (<%=genModel.getImportedName("org.eclipse.emf.ecore.util.EcoreUtil")%>.isAncestor(this, <%=genFeature.getEObjectCast()%>new<%=genFeature.getCapName()%>))
-				throw new <%=genModel.getImportedName("java.lang.IllegalArgumentException")%>("Recursive containment not allowed for " + toString());<%=genModel.getNonNLS()%>
-			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (new<%=genFeature.getCapName()%> != null)
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>).eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-        <%if (!genModel.isSuppressNotification()) {%>
-		else if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
-        <%}%>
-      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (new<%=genFeature.getCapName()%> != <%=genFeature.getSafeName()%>)
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
-			if (<%=genFeature.getSafeName()%> != null)
-        <%if (!genFeature.isBidirectional()) {%>
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-			if (new<%=genFeature.getCapName()%> != null)
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-			if (new<%=genFeature.getCapName()%> != null)
-				msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)new<%=genFeature.getCapName()%>).eInverseAdd(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-        <%}%>
-			msgs = basicSet<%=genFeature.getAccessorName()%>(<%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-        <%if (genFeature.isUnsettable()) {%>
-		else
-    	{
-          <%if (genModel.isVirtualDelegation()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-          <%} else if (genClass.isESetFlag(genFeature)) {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-            <%}%>
-			<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
-          <%} else {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-            <%}%>
-			<%=genFeature.getUncapName()%>ESet = true;
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-			if (eNotificationRequired())
-				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>, !old<%=genFeature.getCapName()%>ESet));
-          <%}%>
-    	}
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		else if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, new<%=genFeature.getCapName()%>, new<%=genFeature.getCapName()%>));
-          <%}%>
-        <%}%>
-      <%} else {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
-          <%}%>
-		if (new<%=genFeature.getCapName()%>) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
-        <%} else {%>
-          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-            <%}%>
-          <%}%>
-          <%if (genFeature.isEnumType()) {%>
-            <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getUpperName()%>_EDEFAULT : new<%=genFeature.getCapName()%>;
-            <%} else {%>
-		<%=genFeature.getSafeName()%> = new<%=genFeature.getCapName()%> == null ? <%=genFeature.getUpperName()%>_EDEFAULT : new<%=genFeature.getCapName()%>;
-            <%}%>
-          <%} else {%>
-            <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
-            <%} else {%>
-		<%=genFeature.getSafeName()%> = <%=genFeature.getInternalTypeCast()%>new<%=genFeature.getCapName()%>;
-            <%}%>
-          <%}%>
-          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualSet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getSafeName()%>);
-          <%}%>
-        <%}%>
-        <%if (genFeature.isUnsettable()) {%>
-          <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE;
-          <%} else if (genClass.isESetFlag(genFeature)) {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-            <%}%>
-		<%=genClass.getESetFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_ESETFLAG;
-          <%} else {%>
-            <%if (!genModel.isSuppressNotification()) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-            <%}%>
-		<%=genFeature.getUncapName()%>ESet = true;
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? <%if (genFeature.isReferenceType()) {%>null<%} else {%><%=genFeature.getUpperName()%>_EDEFAULT<%}%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>!old<%=genFeature.getCapName()%>ESet<%}%>));
-          <%}%>
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.SET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>old<%=genFeature.getCapName()%> == EVIRTUAL_NO_VALUE ? <%if (genFeature.isReferenceType()) {%>null<%} else {%><%=genFeature.getUpperName()%>_EDEFAULT<%}%> : old<%=genFeature.getCapName()%><%} else {%>old<%=genFeature.getCapName()%><%}%>, <%if (genClass.isFlag(genFeature)) {%>new<%=genFeature.getCapName()%><%} else {%><%=genFeature.getSafeName()%><%}%>));
-          <%}%>
-        <%}%>
-      <%}%>
-<%@ include file="Class/setGenFeature.post.insert.javajetinc" fail="silent" %>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType()%>(<%}%>new<%=genFeature.getCapName()%><%if (genFeature.isPrimitiveType()) {%>)<%}%>);
-      <%} else {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).set(<%=genFeature.getQualifiedFeatureAccessor()%>, <%if (genFeature.isPrimitiveType()) {%>new <%=genFeature.getObjectType()%>(<%}%>new<%=genFeature.getCapName()%><%if (genFeature.isPrimitiveType()) {%>)<%}%>);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/setGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to set the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/setGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/setGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (isImplementation && !genModel.isReflectiveDelegation() && genFeature.isBasicUnset()) {%>
-<%@ include file="Class/basicUnsetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> basicUnset<%=genFeature.getAccessorName()%>(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-    <%if (!genFeature.isVolatile()) {%>
-      <%if (genModel.isVirtualDelegation()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-      <%} else {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-		<%=genFeature.getSafeName()%> = null;
-      <%}%>
-      <%if (genModel.isVirtualDelegation()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
-      <%} else if (genClass.isESetFlag(genFeature)) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-      <%} else {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-		<%=genFeature.getUncapName()%>ESet = false;
-      <%}%>
-        <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%> notification = new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-        <%}%>
-    <%} else {%>
-<%@ include file="Class/basicUnsetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to unset the contained '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// -> this method is automatically invoked to keep the containment relationship in synch
-		// -> do not modify other features
-		// -> return msgs, after adding any generated Notification to it (if it is null, a NotificationChain object must be created first)
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/basicUnsetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%@ end %><%//Class.basicUnsetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (genFeature.isUnset() && (isImplementation || !genFeature.isSuppressedUnsetVisibility())) {%>
-<%@ include file="Class/unsetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * Unsets the value of the '{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-  <%if (!genFeature.isSuppressedIsSetVisibility()) {%>
-	 * @see #isSet<%=genFeature.getAccessorName()%>()
-  <%}%>
-	 * @see #<%=genFeature.getGetAccessor()%>()
-  <%if (!genFeature.isListType() && !genFeature.isSuppressedSetVisibility()) {%>
-	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%>)
-  <%}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	void unset<%=genFeature.getAccessorName()%>();
-
-<%} else {%>
-	public void unset<%=genFeature.getAccessorName()%>()
-	{
-    <%if (genModel.isReflectiveDelegation()) {%>
-		eUnset(<%=genFeature.getQualifiedFeatureAccessor()%>);
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (<%=genFeature.getSafeName()%> != null) ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable)<%=genFeature.getSafeName()%>).unset();
-      <%} else if (genFeature.isBidirectional() || genFeature.isEffectiveContains()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		if (<%=genFeature.getSafeName()%> != null)
-		{
-			<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs = null;
-        <%if (!genFeature.isBidirectional()) {%>
-			msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-        <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-			msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-        <%}%>
-			msgs = basicUnset<%=genFeature.getAccessorName()%>(msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else
-    	{
-        <%if (genModel.isVirtualDelegation()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-          <%}%>
-			<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-			boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-          <%}%>
-			<%=genFeature.getUncapName()%>ESet = false;
-        <%}%>
-        <%if (!genModel.isSuppressNotification()) {%>
-			if (eNotificationRequired())
-				eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, null, null, old<%=genFeature.getCapName()%>ESet));
-        <%}%>
-    	}
-      <%} else {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = (<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0;
-          <%}%>
-        <%} else if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		Object old<%=genFeature.getCapName()%> = eVirtualUnset(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		<%=genFeature.getImportedType()%> old<%=genFeature.getCapName()%> = <%=genFeature.getSafeName()%>;
-          <%}%>
-        <%}%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		boolean isSetChange = old<%=genFeature.getCapName()%> != EVIRTUAL_NO_VALUE;
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-        <%} else {%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		boolean old<%=genFeature.getCapName()%>ESet = <%=genFeature.getUncapName()%>ESet;
-          <%}%>
-        <%}%>
-        <%if (genFeature.isReferenceType()) {%>
-		<%=genFeature.getSafeName()%> = null;
-          <%if (!genModel.isVirtualDelegation()) {%>
-            <%if (genClass.isESetFlag(genFeature)) {%>
-		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-            <%} else {%>
-		<%=genFeature.getUncapName()%>ESet = false;
-            <%}%>
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation()) {%>isSetChange ? old<%=genFeature.getCapName()%> : null<%} else {%>old<%=genFeature.getCapName()%><%}%>, null, <%if (genModel.isVirtualDelegation()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
-          <%}%>
-        <%} else {%>
-          <%if (genClass.isFlag(genFeature)) {%>
-		if (<%=genFeature.getUpperName()%>_EDEFAULT) <%=genClass.getFlagsField(genFeature)%> |= <%=genFeature.getUpperName()%>_EFLAG; else <%=genClass.getFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_EFLAG;
-          <%} else if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
-		<%=genFeature.getSafeName()%> = <%=genFeature.getUpperName()%>_EDEFAULT;
-          <%}%>
-          <%if (!genModel.isVirtualDelegation() || genFeature.isPrimitiveType()) {%>
-            <%if (genClass.isESetFlag(genFeature)) {%>
-		<%=genClass.getESetFlagsField(genFeature)%> &= ~<%=genFeature.getUpperName()%>_ESETFLAG;
-            <%} else {%>
-		<%=genFeature.getUncapName()%>ESet = false;
-            <%}%>
-          <%}%>
-          <%if (!genModel.isSuppressNotification()) {%>
-		if (eNotificationRequired())
-			eNotify(new <%=genModel.getImportedName("org.eclipse.emf.ecore.impl.ENotificationImpl")%>(this, <%=genModel.getImportedName("org.eclipse.emf.common.notify.Notification")%>.UNSET, <%=genClass.getQualifiedFeatureID(genFeature)%>, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange ? old<%=genFeature.getCapName()%> : <%=genFeature.getUpperName()%>_EDEFAULT<%} else {%>old<%=genFeature.getCapName()%><%}%>, <%=genFeature.getUpperName()%>_EDEFAULT, <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>isSetChange<%} else {%>old<%=genFeature.getCapName()%>ESet<%}%>));
-          <%}%>
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%} else {%>
-		((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).clear(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/unsetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to unset the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%>
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/unsetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/unsetGenFeature.override.javajetinc%>
-  <%}%>
-  <%if (genFeature.isIsSet() && (isImplementation || !genFeature.isSuppressedIsSetVisibility())) {%>
-<%@ include file="Class/isSetGenFeature.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * Returns whether the value of the '{@link <%=genClass.getQualifiedInterfaceName()%>#<%=genFeature.getGetAccessor()%> <em><%=genFeature.getFormattedName()%></em>}' <%=genFeature.getFeatureKind()%> is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em><%=genFeature.getFormattedName()%></em>' <%=genFeature.getFeatureKind()%> is set.
-    <%if (genFeature.isChangeable() && !genFeature.isSuppressedUnsetVisibility()) {%>
-	 * @see #unset<%=genFeature.getAccessorName()%>()
-    <%}%>
-	 * @see #<%=genFeature.getGetAccessor()%>()
-    <%if (!genFeature.isListType() && genFeature.isChangeable() && !genFeature.isSuppressedSetVisibility()) {%>
-	 * @see #set<%=genFeature.getAccessorName()%>(<%=genFeature.getImportedType()%>)
-    <%}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	boolean isSet<%=genFeature.getAccessorName()%>();
-
-<%} else {%>
-	public boolean isSet<%=genFeature.getAccessorName()%>()
-	{
-    <%if (genModel.isReflectiveDelegation()) {%>
-		return eIsSet(<%=genFeature.getQualifiedFeatureAccessor()%>);
-    <%} else if (!genFeature.isVolatile()) {%>
-      <%if (genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation()) {%>
-		<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%}%>
-		return <%=genFeature.getSafeName()%> != null && ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>.Unsettable)<%=genFeature.getSafeName()%>).isSet();
-      <%} else {%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		return eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-        <%} else if (genClass.isESetFlag(genFeature)) {%>
-		return (<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0;
-        <%} else {%>
-		return <%=genFeature.getUncapName()%>ESet;
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.hasDelegateFeature()) { GenFeature delegateFeature = genFeature.getDelegateFeature();%>
-      <%if (delegateFeature.isWrappedFeatureMapType()) {%>
-		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)get<%=delegateFeature.getAccessorName()%>()).featureMap()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%} else {%>
-		return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)get<%=delegateFeature.getAccessorName()%>()).isEmpty(<%=genFeature.getQualifiedFeatureAccessor()%>);
-      <%}%>
-    <%} else {%>
-<%@ include file="Class/isSetGenFeature.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method to return whether the '<%=genFeature.getFormattedName()%>' <%=genFeature.getFeatureKind()%> is set
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/isSetGenFeature.todo.override.javajetinc%>
-    <%}%>
-	}
-
-<%}%>
-<%@ end %><%//Class/isSetGenFeature.override.javajetinc%>
-  <%}%>
-<%@ include file="Class/genFeature.insert.javajetinc" fail="silent" %>
-<%@ end %><%//Class/genFeature.override.javajetinc%>
-<%}//for%>
-<%}}.run();%>
-<%for (Iterator i= (isImplementation ? genClass.getImplementedGenOperations() : genClass.getDeclaredGenOperations()).iterator(); i.hasNext();) { GenOperation genOperation = (GenOperation)i.next();%>
-<%@ include file="Class/genOperation.override.javajetinc" fail="alternative" %>
-<%@ start %>
-<%if (isInterface) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-  <%if (genOperation.hasDocumentation()) {%>
-	 * <!-- begin-model-doc -->
-	 * <%=genOperation.getDocumentation(genModel.getIndentation(stringBuffer))%>
-	 * <!-- end-model-doc -->
-  <%}%>
-  <%if (!genModel.isSuppressEMFModelTags()) { boolean first = true; for (StringTokenizer stringTokenizer = new StringTokenizer(genOperation.getModelInfo(), "\n\r"); stringTokenizer.hasMoreTokens(); ) { String modelInfo = stringTokenizer.nextToken(); if (first) { first = false;%>
-	 * @model <%=modelInfo%>
-  <%} else {%>
-	 *        <%=modelInfo%>
-  <%}} if (first) {%>
-	 * @model
-  <%}}%>
-	 * @generated
-	 */
-<%} else {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-<%}%>
-<%if (!isImplementation) {%>
-	<%=genOperation.getImportedType()%> <%=genOperation.getName()%>(<%=genOperation.getParameters()%>)<%=genOperation.getThrows()%>;
-
-<%} else {%>
-	public <%=genOperation.getImportedType()%> <%=genOperation.getName()%>(<%=genOperation.getParameters()%>)<%=genOperation.getThrows()%>
-	{
-  <%if (genOperation.hasBody()) {%>
-		<%=genOperation.getBody(genModel.getIndentation(stringBuffer))%>
-  <%} else if (genOperation.isInvariant()) {GenClass opClass = genOperation.getGenClass(); String diagnostics = ((GenParameter)genOperation.getGenParameters().get(0)).getName(); String context = ((GenParameter)genOperation.getGenParameters().get(1)).getName();%>
-		// TODO: implement this method
-		// -> specify the condition that violates the invariant
-		// -> verify the details of the diagnostic, including severity and message
-		// Ensure that you remove @generated or mark it @generated NOT
-		if (false)
-		{
-			if (<%=diagnostics%> != null)
-			{
-				<%=diagnostics%>.add
-					(new <%=genModel.getImportedName("org.eclipse.emf.common.util.BasicDiagnostic")%>
-						(<%=genModel.getImportedName("org.eclipse.emf.common.util.Diagnostic")%>.ERROR,
-						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.DIAGNOSTIC_SOURCE,
-						 <%=opClass.getGenPackage().getImportedValidatorClassName()%>.<%=opClass.getOperationID(genOperation)%>,
-						 <%=genModel.getImportedName("org.eclipse.emf.ecore.plugin.EcorePlugin")%>.INSTANCE.getString("_UI_GenericInvariant_diagnostic", new Object[] { "<%=genOperation.getName()%>", <%=genModel.getImportedName("org.eclipse.emf.ecore.util.EObjectValidator")%>.getObjectLabel(this, <%=context%>) }),<%=genModel.getNonNLS()%><%=genModel.getNonNLS(2)%>
-						 new Object [] { this }));
-			}
-			return false;
-		}
-		return true;
-  <%} else {%>
-<%@ include file="Class/implementedGenOperation.TODO.override.javajetinc" fail="alternative" %>
-<%@ start %>
-		// TODO: implement this method
-		// Ensure that you remove @generated or mark it @generated NOT
-		throw new UnsupportedOperationException();
-<%@ end %><%//Class/implementedGenOperation.todo.override.javajetinc%>
-  <%}%>
-	}
-
-<%}%>
-<%@ include file="Class/genOperation.insert.javajetinc" fail="silent" %>
-<%@ end %><%//Class/implementedGenOperation.override.javajetinc%>
-<%}//for%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseAddGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseAdd(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getEInverseAddGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap()).basicAdd(otherEnd, msgs);
-      <%} else {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)<%=genFeature.getGetAccessor()%>()).basicAdd(otherEnd, msgs);
-      <%}%>
-    <%} else if (genFeature.isContainer()) {%>
-				if (eInternalContainer() != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-      <%if (genFeature.isBasicSet()) {%>
-				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)otherEnd, msgs);
-      <%} else {%>
-				return eBasicSetContainer(otherEnd, <%=genClass.getQualifiedFeatureID(genFeature)%>, msgs);
-      <%}%>
-    <%} else {%>
-      <%if (genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-      <%}%>
-				if (<%=genFeature.getSafeName()%> != null)
-      <%if (genFeature.isEffectiveContains()) {%>
-					msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - <%=genClass.getQualifiedFeatureID(genFeature)%>, null, msgs);
-      <%} else { GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-					msgs = ((<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%>)<%=genFeature.getSafeName()%>).eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-      <%}%>
-				return basicSet<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)otherEnd, msgs);
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-<%} else {%>
-		return eDynamicInverseAdd(otherEnd, featureID, msgs);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEInverseRemoveGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eInverseRemove(<%=genModel.getImportedName("org.eclipse.emf.ecore.InternalEObject")%> otherEnd, int featureID, <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getEInverseRemoveGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isMapType() && genFeature.isEffectiveSuppressEMFTypes()) {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap()).basicRemove(otherEnd, msgs);
-      <%} else if (genFeature.isWrappedFeatureMapType()) {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).basicRemove(otherEnd, msgs);
-      <%} else {%>
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.InternalEList")%>)<%=genFeature.getGetAccessor()%>()).basicRemove(otherEnd, msgs);
-      <%}%>
-    <%} else if (genFeature.isContainer() && !genFeature.isBasicSet()) {%>
-				return eBasicSetContainer(null, <%=genClass.getQualifiedFeatureID(genFeature)%>, msgs);
-    <%} else if (genFeature.isUnsettable()) {%>
-				return basicUnset<%=genFeature.getAccessorName()%>(msgs);
-    <%} else {%>
-				return basicSet<%=genFeature.getAccessorName()%>(null, msgs);
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-<%} else {%>
-		return eDynamicInverseRemove(otherEnd, featureID, msgs);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getEBasicRemoveFromContainerGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> eBasicRemoveFromContainerFeature(<%=genModel.getImportedName("org.eclipse.emf.common.notify.NotificationChain")%> msgs)
-	{
-		switch (eContainerFeatureID)
-		{
-<%for (Iterator i=genClass.getEBasicRemoveFromContainerGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%GenFeature reverseFeature = genFeature.getReverse(); GenClass targetClass = reverseFeature.getGenClass();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-				return eInternalContainer().eInverseRemove(this, <%=targetClass.getQualifiedFeatureID(reverseFeature)%>, <%=targetClass.getImportedInterfaceName()%>.class, msgs);
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eBasicRemoveFromContainerFeature(msgs);
-<%} else {%>
-		return eDynamicBasicRemoveFromContainer(msgs);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && !genClass.getImplementedGenFeatures().isEmpty()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getAllGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isPrimitiveType()) {%>
-      <%if (genFeature.isBooleanType()) {%>
-				return <%=genFeature.getGetAccessor()%>() ? Boolean.TRUE : Boolean.FALSE;
-      <%} else {%>
-				return new <%=genFeature.getObjectType()%>(<%=genFeature.getGetAccessor()%>());
-      <%}%>
-    <%} else if (genFeature.isResolveProxies() && !genFeature.isListType()) {%>
-				if (resolve) return <%=genFeature.getGetAccessor()%>();
-				return basicGet<%=genFeature.getAccessorName()%>();
-    <%} else if (genFeature.isMapType()) {%>
-      <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
-				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap();
-				else return <%=genFeature.getGetAccessor()%>();
-      <%} else {%>
-				if (coreType) return <%=genFeature.getGetAccessor()%>();
-				else return <%=genFeature.getGetAccessor()%>().map();
-      <%}%>
-    <%} else if (genFeature.isWrappedFeatureMapType()) {%>
-				if (coreType) return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap();
-				return <%=genFeature.getGetAccessor()%>();
-    <%} else if (genFeature.isFeatureMapType()) {%>
-				if (coreType) return <%=genFeature.getGetAccessor()%>();
-				return ((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).getWrapper();
-    <%} else {%>
-				return <%=genFeature.getGetAccessor()%>();
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eGet(featureID, resolve, coreType);
-<%} else {%>
-		return eDynamicGet(featureID, resolve, coreType);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && genClass.implementsAny(genClass.getESetGenFeatures())) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getESetGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType()) {%>
-      <%if (genFeature.isWrappedFeatureMapType()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap()).set(newValue);
-      <%} else if (genFeature.isFeatureMapType()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal)<%=genFeature.getGetAccessor()%>()).set(newValue);
-      <%} else if (genFeature.isMapType()) {%>
-        <%if (genFeature.isEffectiveSuppressEMFTypes()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)((<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>.InternalMapView)<%=genFeature.getGetAccessor()%>()).eMap()).set(newValue);
-        <%} else {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.EStructuralFeature")%>.Setting)<%=genFeature.getGetAccessor()%>()).set(newValue);
-        <%}%>
-      <%} else {%>
-				<%=genFeature.getGetAccessor()%>().clear();
-				<%=genFeature.getGetAccessor()%>().addAll((<%=genModel.getImportedName("java.util.Collection")%>)newValue);
-      <%}%>
-    <%} else if (genFeature.isPrimitiveType()) {%>
-				set<%=genFeature.getAccessorName()%>(((<%=genFeature.getObjectType()%>)newValue).<%=genFeature.getPrimitiveValueFunction()%>());
-    <%} else {%>
-				set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)newValue);
-    <%}%>
-				return;
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		super.eSet(featureID, newValue);
-<%} else {%>
-		eDynamicSet(featureID, newValue);
-<%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getESetGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
-      <%if (genFeature.isWrappedFeatureMapType()) {%>
-				((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().clear();
-      <%} else {%>
-				<%=genFeature.getGetAccessor()%>().clear();
-      <%}%>
-    <%} else if (genFeature.isUnsettable()) {%>
-				unset<%=genFeature.getAccessorName()%>();
-    <%} else if (genFeature.isReferenceType()) {%>
-				set<%=genFeature.getAccessorName()%>((<%=genFeature.getImportedType()%>)null);
-    <%} else {%>
-				set<%=genFeature.getAccessorName()%>(<%=genFeature.getUpperName()%>_EDEFAULT);
-    <%}%>
-				return;
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		super.eUnset(featureID);
-<%} else {%>
-		eDynamicUnset(featureID);
-<%}%>
-	}
-
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && !genClass.getImplementedGenFeatures().isEmpty()) {%>
-<%@ include file="Class/eIsSet.override.javajetinc" fail="alternative" %>
-<%@ start %>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID)
-	{
-		switch (featureID)
-		{
-<%for (Iterator i=genClass.getAllGenFeatures().iterator(); i.hasNext();) { GenFeature genFeature = (GenFeature)i.next();%>
-  <%if (!genModel.isMinimalReflectiveMethods() || genClass.getImplementedGenFeatures().contains(genFeature)) {%>
-			case <%=genClass.getQualifiedFeatureID(genFeature)%>:
-    <%if (genFeature.isListType() && !genFeature.isUnsettable()) {%>
-      <%if (genFeature.isWrappedFeatureMapType()) {%>
-        <%if (genFeature.isVolatile()) {%>
-				return !((<%=genModel.getImportedName("org.eclipse.emf.ecore.util.FeatureMap")%>.Internal.Wrapper)<%=genFeature.getGetAccessor()%>()).featureMap().isEmpty();
-        <%} else {%>
-				return <%=genFeature.getSafeName()%> != null && !<%=genFeature.getSafeName()%>.featureMap().isEmpty();
-        <%}%>
-      <%} else {%>
-        <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getSafeName()%> != null && !<%=genFeature.getSafeName()%>.isEmpty();
-        <%} else {%>
-          <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>);
-				return <%=genFeature.getSafeName()%> != null && !<%=genFeature.getSafeName()%>.isEmpty();
-          <%} else {%>
-				return !<%=genFeature.getGetAccessor()%>().isEmpty();
-          <%}%>
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.isUnsettable()) {%>
-				return isSet<%=genFeature.getAccessorName()%>();
-    <%} else if (genFeature.isResolveProxies()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getSafeName()%> != null;
-      <%} else {%>
-        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>) != null;
-        <%} else {%>
-				return basicGet<%=genFeature.getAccessorName()%>() != null;
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.isReferenceType()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getSafeName()%> != null;
-      <%} else {%>
-        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>) != null;
-        <%} else {%>
-				return <%=genFeature.getGetAccessor()%>() != null;
-        <%}%>
-      <%}%>
-    <%} else if (genFeature.isPrimitiveType() || genFeature.isEnumType()) {%>
-      <%if (genClass.isField(genFeature)) {%>
-        <%if (genClass.isFlag(genFeature)) {%>
-				return ((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0) != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%} else {%>
-				return <%=genFeature.getSafeName()%> != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%}%>
-      <%} else {%>
-        <%if (genFeature.isEnumType() && genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				return eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getUpperName()%>_EDEFAULT) != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%} else {%>
-				return <%=genFeature.getGetAccessor()%>() != <%=genFeature.getUpperName()%>_EDEFAULT;
-        <%}%>
-      <%}%>
-    <%} else {//datatype%>
-      <%if (genClass.isField(genFeature)) {%>
-				return <%=genFeature.getUpperName()%>_EDEFAULT == null ? <%=genFeature.getSafeName()%> != null : !<%=genFeature.getUpperName()%>_EDEFAULT.equals(<%=genFeature.getSafeName()%>);
-      <%} else {%>
-        <%if (genFeature.isField() && genClass.getImplementingGenModel(genFeature).isVirtualDelegation()) {%>
-				<%=genFeature.getImportedType()%> <%=genFeature.getSafeName()%> = (<%=genFeature.getImportedType()%>)eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>, <%=genFeature.getUpperName()%>_EDEFAULT);
-				return <%=genFeature.getUpperName()%>_EDEFAULT == null ? <%=genFeature.getSafeName()%> != null : !<%=genFeature.getUpperName()%>_EDEFAULT.equals(<%=genFeature.getSafeName()%>);
-        <%} else {%>
-				return <%=genFeature.getUpperName()%>_EDEFAULT == null ? <%=genFeature.getGetAccessor()%>() != null : !<%=genFeature.getUpperName()%>_EDEFAULT.equals(<%=genFeature.getGetAccessor()%>());
-        <%}%>
-      <%}%>
-    <%}%>
-  <%}%>
-<%}%>
-		}
-<%if (genModel.isMinimalReflectiveMethods()) {%>
-		return super.eIsSet(featureID);
-<%} else {%>
-		return eDynamicIsSet(featureID);
-<%}%>
-	}
-
-<%@ end %><%//Class/eIsSet.override.javajetinc%>
-<%}%>
-<%if (isImplementation && !genClass.getMixinGenFeatures().isEmpty()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass)
-	{
-  <%for (Iterator m=genClass.getMixinGenClasses().iterator(); m.hasNext();) { GenClass mixinGenClass = (GenClass)m.next(); %>
-		if (baseClass == <%=mixinGenClass.getImportedInterfaceName()%>.class)
-		{
-			switch (derivedFeatureID)
-			{
-    <%for (Iterator f=mixinGenClass.getGenFeatures().iterator(); f.hasNext();) { GenFeature genFeature = (GenFeature)f.next(); %>
-				case <%=genClass.getQualifiedFeatureID(genFeature)%>: return <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>;
-    <%}%>
-				default: return -1;
-			}
-		}
-  <%}%>
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass)
-	{
-  <%for (Iterator m=genClass.getMixinGenClasses().iterator(); m.hasNext();) { GenClass mixinGenClass = (GenClass)m.next(); %>
-		if (baseClass == <%=mixinGenClass.getImportedInterfaceName()%>.class)
-		{
-			switch (baseFeatureID)
-			{
-    <%for (Iterator f=mixinGenClass.getGenFeatures().iterator(); f.hasNext();) { GenFeature genFeature = (GenFeature)f.next(); %>
-				case <%=mixinGenClass.getQualifiedFeatureID(genFeature)%>: return <%=genClass.getQualifiedFeatureID(genFeature)%>;
-    <%}%>
-				default: return -1;
-			}
-		}
-  <%}%>
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-<%}%>
-<%if (isImplementation && genModel.isVirtualDelegation()) { String eVirtualValuesField = genClass.getEVirtualValuesField();%>
-  <%if (eVirtualValuesField != null) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object[] eVirtualValues()
-	{
-		return <%=eVirtualValuesField%>;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void eSetVirtualValues(Object[] newValues)
-	{
-		<%=eVirtualValuesField%> = newValues;
-	}
-
-  <%}%>
-  <%{ List eVirtualIndexBitFields = genClass.getEVirtualIndexBitFields(new ArrayList());%>
-    <%if (!eVirtualIndexBitFields.isEmpty()) { List allEVirtualIndexBitFields = genClass.getAllEVirtualIndexBitFields(new ArrayList());%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected int eVirtualIndexBits(int offset)
-	{
-		switch (offset)
-		{
-      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
-			case <%=i%> :
-				return <%=allEVirtualIndexBitFields.get(i)%>;
-      <%}%>
-			default :
-				throw new IndexOutOfBoundsException();
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void eSetVirtualIndexBits(int offset, int newIndexBits)
-	{
-		switch (offset)
-		{
-      <%for (int i = 0; i < allEVirtualIndexBitFields.size(); i++) {%>
-			case <%=i%> :
-				<%=allEVirtualIndexBitFields.get(i)%> = newIndexBits;
-				break;
-      <%}%>
-			default :
-				throw new IndexOutOfBoundsException();
-		}
-	}
-
-    <%}%>
-  <%}%>
-<%}%>
-<%if (isImplementation && !genModel.isReflectiveDelegation() && !genClass.getToStringGenFeatures().isEmpty()) {%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString()
-	{
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-  <%{ boolean first = true;%>
-    <%for (Iterator i=genClass.getToStringGenFeatures().iterator(); i.hasNext(); ) { GenFeature genFeature = (GenFeature)i.next();%>
-      <%if (first) { first = false;%>
-		result.append(" (<%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
-      <%} else {%>
-		result.append(", <%=genFeature.getName()%>: ");<%=genModel.getNonNLS()%>
-      <%}%>
-      <%if (genFeature.isUnsettable() && !genFeature.isListType()) {%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		if (eVirtualIsSet(<%=genClass.getQualifiedFeatureID(genFeature)%>)) result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%>)); else result.append("<unset>");<%=genModel.getNonNLS()%>
-        <%} else {%>
-          <%if (genClass.isFlag(genFeature)) {%>
-		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0); else result.append("<unset>");<%=genModel.getNonNLS()%>
-          <%} else {%>
-		if (<%if (genClass.isESetFlag(genFeature)) {%>(<%=genClass.getESetFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_ESETFLAG) != 0<%} else {%><%=genFeature.getUncapName()%>ESet<%}%>) result.append(<%=genFeature.getSafeName()%>); else result.append("<unset>");<%=genModel.getNonNLS()%>
-          <%}%>
-        <%}%>
-      <%} else {%>
-        <%if (genModel.isVirtualDelegation() && !genFeature.isPrimitiveType()) {%>
-		result.append(eVirtualGet(<%=genClass.getQualifiedFeatureID(genFeature)%><%if (!genFeature.isListType() && !genFeature.isReferenceType()){%>, <%=genFeature.getUpperName()%>_EDEFAULT<%}%>));
-        <%} else {%>
-          <%if (genClass.isFlag(genFeature)) {%>
-		result.append((<%=genClass.getFlagsField(genFeature)%> & <%=genFeature.getUpperName()%>_EFLAG) != 0);
-          <%} else {%>
-		result.append(<%=genFeature.getSafeName()%>);
-          <%}%>
-        <%}%>
-      <%}%>
-    <%}%>
-  <%}%>
-		result.append(')');
-		return result.toString();
-	}
-
-<%}%>
-<%if (isImplementation && genClass.isMapEntry()) { GenFeature keyFeature = genClass.getMapEntryKeyFeature(); GenFeature valueFeature = genClass.getMapEntryValueFeature();%>
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected int hash = -1;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getHash()
-	{
-		if (hash == -1)
-		{
-			Object theKey = getKey();
-			hash = (theKey == null ? 0 : theKey.hashCode());
-		}
-		return hash;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHash(int hash)
-	{
-		this.hash = hash;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getKey()
-	{
-  <%if (keyFeature.isPrimitiveType()) {%>
-		return new <%=keyFeature.getObjectType()%>(getTypedKey());
-  <%} else {%>
-		return getTypedKey();
-  <%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKey(Object key)
-	{
-  <%if (keyFeature.isListType()) {%>
-		getTypedKey().addAll((<%=genModel.getImportedName("java.util.Collection")%>)key);
-  <%} else if (keyFeature.isPrimitiveType()) {%>
-		setTypedKey(((<%=keyFeature.getObjectType()%>)key).<%=keyFeature.getPrimitiveValueFunction()%>());
-  <%} else {%>
-		setTypedKey((<%=keyFeature.getImportedType()%>)key);
-  <%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getValue()
-	{
-  <%if (valueFeature.isPrimitiveType()) {%>
-		return new <%=valueFeature.getObjectType()%>(getTypedValue());
-  <%} else {%>
-		return getTypedValue();
-  <%}%>
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object setValue(Object value)
-	{
-		Object oldValue = getValue();
-  <%if (valueFeature.isListType()) {%>
-		getTypedValue().clear();
-		getTypedValue().addAll((<%=genModel.getImportedName("java.util.Collection")%>)value);
-  <%} else if (valueFeature.isPrimitiveType()) {%>
-		setTypedValue(((<%=valueFeature.getObjectType()%>)value).<%=valueFeature.getPrimitiveValueFunction()%>());
-  <%} else {%>
-		setTypedValue((<%=valueFeature.getImportedType()%>)value);
-  <%}%>
-		return oldValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public <%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%> getEMap()
-	{
-		<%=genModel.getImportedName("org.eclipse.emf.ecore.EObject")%> container = eContainer();
-		return container == null ? null : (<%=genModel.getImportedName("org.eclipse.emf.common.util.EMap")%>)container.eGet(eContainmentFeature());
-	}
-
-<%}%>
-<%@ include file="Class/insert.javajetinc" fail="silent" %>
-} //<%=isInterface ? " " + genClass.getInterfaceName() : genClass.getClassName()%>
-<%// TODO fix the space above%>
-<%genModel.emitSortedImports();%>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/.classpath b/1.5/plugins/org.eclipse.epf.uma.edit/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/.project b/1.5/plugins/org.eclipse.epf.uma.edit/.project
deleted file mode 100644
index 5259efc..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.uma.edit</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.uma.edit/META-INF/MANIFEST.MF
deleted file mode 100644
index 6968504..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.uma.edit;singleton:=true
-Bundle-ClassPath: umaedit.jar
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.edit;visibility:=reexport,
- org.eclipse.epf.uma;visibility:=reexport
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.uma.edit.command,
- org.eclipse.epf.uma.edit.domain,
- org.eclipse.epf.uma.provider
-Bundle-Activator: org.eclipse.epf.uma.provider.UmaEditPlugin$Implementation
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/build.properties b/1.5/plugins/org.eclipse.epf.uma.edit/build.properties
deleted file mode 100644
index 8282e0a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.umaedit.jar = src/
-output.umaedit.jar = bin/
-bin.includes = umaedit.jar,\
-               META-INF/,\
-               plugin.xml,\
-               icons/,\
-               plugin.properties
-
-
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateArtifact_containedArtifacts_Artifact.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateArtifact_containedArtifacts_Artifact.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateArtifact_containedArtifacts_Artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateBreakdownElement_planningData_PlanningData.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateBreakdownElement_planningData_PlanningData.gif
deleted file mode 100644
index 9029e24..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateBreakdownElement_planningData_PlanningData.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentDescription_sections_Section.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentDescription_sections_Section.gif
deleted file mode 100644
index 5206c2e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentDescription_sections_Section.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentDescription_sections_Step.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentDescription_sections_Step.gif
deleted file mode 100644
index 278cd8a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentDescription_sections_Step.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ActivityDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ActivityDescription.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ActivityDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ArtifactDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ArtifactDescription.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ArtifactDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ContentDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ContentDescription.gif
deleted file mode 100644
index a06b0ff..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_ContentDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_DeliverableDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_DeliverableDescription.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_DeliverableDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_DeliveryProcessDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_DeliveryProcessDescription.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_DeliveryProcessDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_GuidanceDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_GuidanceDescription.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_GuidanceDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_PracticeDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_PracticeDescription.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_PracticeDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_RoleDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_RoleDescription.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_RoleDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_TaskDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_TaskDescription.gif
deleted file mode 100644
index 5c3b2b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_TaskDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_WorkProductDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_WorkProductDescription.gif
deleted file mode 100644
index 1540f3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentElement_presentation_WorkProductDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Discipline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Discipline.gif
deleted file mode 100644
index 35bd476..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Discipline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_DisciplineCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_DisciplineCategory.gif
deleted file mode 100644
index 5553c1d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_DisciplineCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_DisciplineGrouping.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_DisciplineGrouping.gif
deleted file mode 100644
index 5553c1d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_DisciplineGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Domain.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Domain.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Domain.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSet.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSet.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSet.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSetCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSetCategory.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSetCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSetGrouping.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSetGrouping.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_RoleSetGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Tool.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Tool.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_Tool.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_UserDefinedCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_UserDefinedCategory.gif
deleted file mode 100644
index d39e9f1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_UserDefinedCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_WorkProductType.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_WorkProductType.gif
deleted file mode 100644
index a7ecac0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentCategories_WorkProductType.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Activity.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Artifact.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Artifact.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Attachment.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Attachment.gif
deleted file mode 100644
index e75685c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Attachment.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_CapabilityPattern.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_CapabilityPattern.gif
deleted file mode 100644
index 15ffbb0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_CapabilityPattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Checklist.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Checklist.gif
deleted file mode 100644
index 0a65f23..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Checklist.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Concept.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Concept.gif
deleted file mode 100644
index 1df84da..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Concept.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_CustomCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_CustomCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_CustomCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Deliverable.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Deliverable.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Deliverable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_DeliveryProcess.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_DeliveryProcess.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_DeliveryProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Discipline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Discipline.gif
deleted file mode 100644
index 35bd476..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Discipline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_DisciplineGrouping.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_DisciplineGrouping.gif
deleted file mode 100644
index 5553c1d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_DisciplineGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Domain.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Domain.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Domain.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Estimate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Estimate.gif
deleted file mode 100644
index c2554c2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Estimate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingConsiderations.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingConsiderations.gif
deleted file mode 100644
index 8ab34c6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingMetric.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingMetric.gif
deleted file mode 100644
index 731f83d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingMetric.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingModel.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingModel.gif
deleted file mode 100644
index 758dafb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimatingModel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimationConsiderations.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimationConsiderations.gif
deleted file mode 100644
index 4fc84e4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_EstimationConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Example.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Example.gif
deleted file mode 100644
index 1b944fd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Example.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Guideline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Guideline.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Guideline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Iteration.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Iteration.gif
deleted file mode 100644
index 4311e46..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Outcome.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Outcome.gif
deleted file mode 100644
index e703518..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Outcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Phase.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Phase.gif
deleted file mode 100644
index ad60bd9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Practice.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Practice.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Practice.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ProcessContribution.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ProcessContribution.gif
deleted file mode 100644
index 2b095d8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ProcessContribution.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ProcessPlanningTemplate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ProcessPlanningTemplate.gif
deleted file mode 100644
index c763251..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ProcessPlanningTemplate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Report.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Report.gif
deleted file mode 100644
index 95f3e0c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Report.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ReusableAsset.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ReusableAsset.gif
deleted file mode 100644
index b52cffe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ReusableAsset.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Roadmap.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Roadmap.gif
deleted file mode 100644
index f11bc5d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Roadmap.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Role.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Role.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Role.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_RoleSet.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_RoleSet.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_RoleSet.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_RoleSetGrouping.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_RoleSetGrouping.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_RoleSetGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Step.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Step.gif
deleted file mode 100644
index 4e47629..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Step.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_SupportingMaterial.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_SupportingMaterial.gif
deleted file mode 100644
index 05a21ec..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_SupportingMaterial.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Task.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Task.gif
deleted file mode 100644
index 5c3b2b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Task.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Technique.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Technique.gif
deleted file mode 100644
index 1edc5b9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Technique.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Template.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Template.gif
deleted file mode 100644
index c763251..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Template.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TermDefinition.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TermDefinition.gif
deleted file mode 100644
index e21bfe0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TermDefinition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Tool.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Tool.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Tool.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ToolMentor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ToolMentor.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_ToolMentor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TrainingClass.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TrainingClass.gif
deleted file mode 100644
index 0132953..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TrainingClass.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TrainingModule.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TrainingModule.gif
deleted file mode 100644
index f4f7152..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_TrainingModule.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_UserDefinedCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_UserDefinedCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_UserDefinedCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Whitepaper.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Whitepaper.gif
deleted file mode 100644
index e5b4800..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_Whitepaper.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_WorkProductGuideline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_WorkProductGuideline.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_WorkProductGuideline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_WorkProductType.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_WorkProductType.gif
deleted file mode 100644
index a7ecac0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateContentPackage_contentElements_WorkProductType.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateCustomCategory_subCategories_CustomCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateCustomCategory_subCategories_CustomCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateCustomCategory_subCategories_CustomCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ActivityDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ActivityDescription.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ActivityDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ArtifactDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ArtifactDescription.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ArtifactDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_BreakdownElementDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_BreakdownElementDescription.gif
deleted file mode 100644
index 8d18ec2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_BreakdownElementDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ContentDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ContentDescription.gif
deleted file mode 100644
index a06b0ff..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ContentDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DeliverableDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DeliverableDescription.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DeliverableDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DeliveryProcessDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DeliveryProcessDescription.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DeliveryProcessDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DescriptorDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DescriptorDescription.gif
deleted file mode 100644
index 89ed2c9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_DescriptorDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_GuidanceDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_GuidanceDescription.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_GuidanceDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_PracticeDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_PracticeDescription.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_PracticeDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ProcessDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ProcessDescription.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_ProcessDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_RoleDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_RoleDescription.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_RoleDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_TaskDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_TaskDescription.gif
deleted file mode 100644
index 5c3b2b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_TaskDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_WorkProductDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_WorkProductDescription.gif
deleted file mode 100644
index 1540f3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDescribableElement_presentation_WorkProductDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagramElement_property_Property.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagramElement_property_Property.gif
deleted file mode 100644
index a32a7b5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagramElement_property_Property.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagramLink_viewport_Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagramLink_viewport_Point.gif
deleted file mode 100644
index fe734c7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagramLink_viewport_Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_CoreSemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_CoreSemanticModelBridge.gif
deleted file mode 100644
index 845e9f4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_CoreSemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_SimpleSemanticModelElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_SimpleSemanticModelElement.gif
deleted file mode 100644
index d82f226..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_SimpleSemanticModelElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_UMASemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_UMASemanticModelBridge.gif
deleted file mode 100644
index 889f3af..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_namespace_UMASemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_viewpoint_Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_viewpoint_Point.gif
deleted file mode 100644
index 1dd58e1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiagram_viewpoint_Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiscipline_subdiscipline_Discipline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiscipline_subdiscipline_Discipline.gif
deleted file mode 100644
index e29b313..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDiscipline_subdiscipline_Discipline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDomain_subdomain_Domain.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDomain_subdomain_Domain.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDomain_subdomain_Domain.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDomain_subdomains_Domain.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDomain_subdomains_Domain.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateDomain_subdomains_Domain.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEllipse_center_Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEllipse_center_Point.gif
deleted file mode 100644
index 3a4e9ad..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEllipse_center_Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationConderations_EstimatingConsiderations.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationConderations_EstimatingConsiderations.gif
deleted file mode 100644
index e951689..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationConderations_EstimatingConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationConderations_EstimationConsiderations.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationConderations_EstimationConsiderations.gif
deleted file mode 100644
index 4fc84e4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationConderations_EstimationConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationMetric_EstimatingMetric.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationMetric_EstimatingMetric.gif
deleted file mode 100644
index bad30bb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_estimationMetric_EstimatingMetric.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_usedEstimatingParameter_SummitEstimatingParameter.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_usedEstimatingParameter_SummitEstimatingParameter.gif
deleted file mode 100644
index 391d0b3..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimate_usedEstimatingParameter_SummitEstimatingParameter.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatedMethodElement_estimate_Estimate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatedMethodElement_estimate_Estimate.gif
deleted file mode 100644
index 6844bf8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatedMethodElement_estimate_Estimate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatingModel_ownedEstimatingParameter_SummitEstimatingParameter.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatingModel_ownedEstimatingParameter_SummitEstimatingParameter.gif
deleted file mode 100644
index ce3b99f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatingModel_ownedEstimatingParameter_SummitEstimatingParameter.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatingParameterOwner_ownedEstimatingParameter_EstimatingParameter.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatingParameterOwner_ownedEstimatingParameter_EstimatingParameter.gif
deleted file mode 100644
index 407220b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateEstimatingParameterOwner_ownedEstimatingParameter_EstimatingParameter.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphConnector_position_Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphConnector_position_Point.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphConnector_position_Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphEdge_waypoints_Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphEdge_waypoints_Point.gif
deleted file mode 100644
index 4154e57..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphEdge_waypoints_Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_anchorage_GraphConnector.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_anchorage_GraphConnector.gif
deleted file mode 100644
index a303761..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_anchorage_GraphConnector.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_CoreSemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_CoreSemanticModelBridge.gif
deleted file mode 100644
index 5fe40c4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_CoreSemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Diagram.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Diagram.gif
deleted file mode 100644
index b9cd878..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_DiagramLink.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_DiagramLink.gif
deleted file mode 100644
index 4f7ee52..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_DiagramLink.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Ellipse.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Ellipse.gif
deleted file mode 100644
index de6e628..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Ellipse.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphConnector.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphConnector.gif
deleted file mode 100644
index a303761..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphConnector.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphEdge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphEdge.gif
deleted file mode 100644
index 3891882..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphEdge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphNode.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphNode.gif
deleted file mode 100644
index d065203..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_GraphNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Image.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Image.gif
deleted file mode 100644
index 84f99e6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Image.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Polyline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Polyline.gif
deleted file mode 100644
index 08f15c5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Polyline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Property.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Property.gif
deleted file mode 100644
index a32a7b5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Property.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Reference.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Reference.gif
deleted file mode 100644
index a303761..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_Reference.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_SimpleSemanticModelElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_SimpleSemanticModelElement.gif
deleted file mode 100644
index f420604..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_SimpleSemanticModelElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_TextElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_TextElement.gif
deleted file mode 100644
index d065203..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_TextElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_UMASemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_UMASemanticModelBridge.gif
deleted file mode 100644
index 0cf27b2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_contained_UMASemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_link_DiagramLink.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_link_DiagramLink.gif
deleted file mode 100644
index 4f7ee52..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_link_DiagramLink.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_position_Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_position_Point.gif
deleted file mode 100644
index 92d407e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_position_Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_CoreSemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_CoreSemanticModelBridge.gif
deleted file mode 100644
index 5fe40c4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_CoreSemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_SimpleSemanticModelElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_SimpleSemanticModelElement.gif
deleted file mode 100644
index f420604..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_SimpleSemanticModelElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_UMASemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_UMASemanticModelBridge.gif
deleted file mode 100644
index 0cf27b2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphElement_semanticModel_UMASemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphNode_size_Dimension.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphNode_size_Dimension.gif
deleted file mode 100644
index ccd9289..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateGraphNode_size_Dimension.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodElement_methodElementProperty_MethodElementProperty.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodElement_methodElementProperty_MethodElementProperty.gif
deleted file mode 100644
index 6b2c3eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodElement_methodElementProperty_MethodElementProperty.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodElement_ownedRules_Constraint.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodElement_ownedRules_Constraint.gif
deleted file mode 100644
index bcd32f7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodElement_ownedRules_Constraint.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_methodModels_MethodModel.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_methodModels_MethodModel.gif
deleted file mode 100644
index bb82c39..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_methodModels_MethodModel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_methodPlugins_MethodPlugin.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_methodPlugins_MethodPlugin.gif
deleted file mode 100644
index bb82c39..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_methodPlugins_MethodPlugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_predefinedConfigurations_MethodConfiguration.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_predefinedConfigurations_MethodConfiguration.gif
deleted file mode 100644
index de89602..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_predefinedConfigurations_MethodConfiguration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_predefinedConfigurations_ProcessFamily.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_predefinedConfigurations_ProcessFamily.gif
deleted file mode 100644
index 6467d42..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodLibrary_predefinedConfigurations_ProcessFamily.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ContentPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ContentPackage.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ContentPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ProcessComponent.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ProcessComponent.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ProcessComponent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ProcessPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ProcessPackage.gif
deleted file mode 100644
index 08d8c2d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodModel_methodPackages_ProcessPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ContentPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ContentPackage.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ContentPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ProcessComponent.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ProcessComponent.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ProcessComponent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ProcessPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ProcessPackage.gif
deleted file mode 100644
index 08d8c2d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPackage_childPackages_ProcessPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ContentPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ContentPackage.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ContentPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ProcessComponent.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ProcessComponent.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ProcessComponent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ProcessPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ProcessPackage.gif
deleted file mode 100644
index 08d8c2d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateMethodPlugin_methodPackages_ProcessPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePolyline_waypoints_Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePolyline_waypoints_Point.gif
deleted file mode 100644
index 43703db..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePolyline_waypoints_Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePractice_subPractice_Practice.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePractice_subPractice_Practice.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePractice_subPractice_Practice.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePractice_subPractices_Practice.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePractice_subPractices_Practice.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreatePractice_subPractices_Practice.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponentInterface_interfaceIO_WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponentInterface_interfaceIO_WorkProductDescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponentInterface_interfaceIO_WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponentInterface_interfaceSpecifications_TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponentInterface_interfaceSpecifications_TaskDescriptor.gif
deleted file mode 100644
index 554e26e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponentInterface_interfaceSpecifications_TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_CapabilityPattern.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_CapabilityPattern.gif
deleted file mode 100644
index 15ffbb0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_CapabilityPattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_DeliveryProcess.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_DeliveryProcess.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_DeliveryProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_ProcessContribution.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_ProcessContribution.gif
deleted file mode 100644
index 2b095d8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_ProcessContribution.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_ProcessPlanningTemplate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_ProcessPlanningTemplate.gif
deleted file mode 100644
index e9c1a08..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessComponent_process_ProcessPlanningTemplate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ActivityDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ActivityDescription.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ActivityDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ArtifactDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ArtifactDescription.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ArtifactDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ContentDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ContentDescription.gif
deleted file mode 100644
index 9ff2342..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_ContentDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_DeliverableDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_DeliverableDescription.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_DeliverableDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_DeliveryProcessDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_DeliveryProcessDescription.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_DeliveryProcessDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_GuidanceDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_GuidanceDescription.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_GuidanceDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_PracticeDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_PracticeDescription.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_PracticeDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_RoleDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_RoleDescription.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_RoleDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_TaskDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_TaskDescription.gif
deleted file mode 100644
index 5c3b2b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_TaskDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_WorkProductDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_WorkProductDescription.gif
deleted file mode 100644
index 1540f3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessElement_presentation_WorkProductDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_OBS_OBS.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_OBS_OBS.gif
deleted file mode 100644
index 33e8a61..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_OBS_OBS.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_PBS_PBS.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_PBS_PBS.gif
deleted file mode 100644
index 5a3ab4a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_PBS_PBS.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_WBS_WBS.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_WBS_WBS.gif
deleted file mode 100644
index 0a2cc52..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_WBS_WBS.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_WorkOrder_WorkOrder.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_WorkOrder_WorkOrder.gif
deleted file mode 100644
index 3cfac31..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_WorkOrder_WorkOrder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Activity.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_CapabilityPattern.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_CapabilityPattern.gif
deleted file mode 100644
index 15ffbb0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_CapabilityPattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_DeliveryProcess.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_DeliveryProcess.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_DeliveryProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Iteration.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Iteration.gif
deleted file mode 100644
index 4311e46..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Milestone.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Milestone.gif
deleted file mode 100644
index d9615eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Milestones.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Milestones.gif
deleted file mode 100644
index d9615eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Milestones.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Phase.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Phase.gif
deleted file mode 100644
index ad60bd9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessComponentDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessComponentDescriptor.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessComponentDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessComponentInterface.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessComponentInterface.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessComponentInterface.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessContribution.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessContribution.gif
deleted file mode 100644
index 2b095d8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessContribution.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessPlanningTemplate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessPlanningTemplate.gif
deleted file mode 100644
index 2f9b78f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ProcessPlanningTemplate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ResourceDefinition.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ResourceDefinition.gif
deleted file mode 100644
index 37a86d1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_ResourceDefinition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_RoleDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_RoleDescriptor.gif
deleted file mode 100644
index 368c7b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_RoleDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_TaskDescriptor.gif
deleted file mode 100644
index 554e26e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Team.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Team.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_Team.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_TeamProfile.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_TeamProfile.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_TeamProfile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_WorkProductDescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_breakdownElements_WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_diagrams_Diagram.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_diagrams_Diagram.gif
deleted file mode 100644
index a6d8558..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_diagrams_Diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Activity.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_CapabilityPattern.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_CapabilityPattern.gif
deleted file mode 100644
index 15ffbb0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_CapabilityPattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_CompositeRole.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_CompositeRole.gif
deleted file mode 100644
index 3f02915..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_CompositeRole.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_DeliveryProcess.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_DeliveryProcess.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_DeliveryProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Iteration.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Iteration.gif
deleted file mode 100644
index 4311e46..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Milestone.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Milestone.gif
deleted file mode 100644
index d9615eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Phase.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Phase.gif
deleted file mode 100644
index ad60bd9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_Phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_PlanningData.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_PlanningData.gif
deleted file mode 100644
index 72ce260..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_PlanningData.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessComponentDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessComponentDescriptor.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessComponentDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessComponentInterface.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessComponentInterface.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessComponentInterface.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessContribution.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessContribution.gif
deleted file mode 100644
index 2b095d8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessContribution.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessPlanningTemplate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessPlanningTemplate.gif
deleted file mode 100644
index e9c1a08..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_ProcessPlanningTemplate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_RoleDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_RoleDescriptor.gif
deleted file mode 100644
index 368c7b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_RoleDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_TaskDescriptor.gif
deleted file mode 100644
index 554e26e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_TeamProfile.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_TeamProfile.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_TeamProfile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_WorkOrder.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_WorkOrder.gif
deleted file mode 100644
index db41f3b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_WorkOrder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_WorkProductDescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_processElements_WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_CapabilityPattern.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_CapabilityPattern.gif
deleted file mode 100644
index 15ffbb0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_CapabilityPattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_DeliveryProcess.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_DeliveryProcess.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_DeliveryProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessContribution.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessContribution.gif
deleted file mode 100644
index 2b095d8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessContribution.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessPlan.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessPlan.gif
deleted file mode 100644
index afda55d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessPlan.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessPlanningTemplate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessPlanningTemplate.gif
deleted file mode 100644
index 2f9b78f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateProcessPackage_process_ProcessPlanningTemplate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Transition_Transition.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Transition_Transition.gif
deleted file mode 100644
index c431c59..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Transition_Transition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_PseudoState.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_PseudoState.gif
deleted file mode 100644
index 4368e6a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_PseudoState.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_State.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_State.gif
deleted file mode 100644
index 1cf5062..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_State.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_Vertex.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_Vertex.gif
deleted file mode 100644
index bca376f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateRegion_Vertex_Vertex.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateSection_subSections_Section.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateSection_subSections_Section.gif
deleted file mode 100644
index 883ce93..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateSection_subSections_Section.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateSection_subSections_Step.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateSection_subSections_Step.gif
deleted file mode 100644
index 9c7efc4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateSection_subSections_Step.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateStateMachine_Region_Region.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateStateMachine_Region_Region.gif
deleted file mode 100644
index b6ab7ef..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateStateMachine_Region_Region.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateState_Region_Region.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateState_Region_Region.gif
deleted file mode 100644
index f676db8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateState_Region_Region.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTask_estimate_Estimate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTask_estimate_Estimate.gif
deleted file mode 100644
index 6844bf8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTask_estimate_Estimate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTask_steps_Step.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTask_steps_Step.gif
deleted file mode 100644
index bda49d2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTask_steps_Step.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTeamProfile_subTeam_TeamProfile.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTeamProfile_subTeam_TeamProfile.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTeamProfile_subTeam_TeamProfile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTrainingClass_trainingModules_TrainingModule.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTrainingClass_trainingModules_TrainingModule.gif
deleted file mode 100644
index 0ef5eff..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateTrainingClass_trainingModules_TrainingModule.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkDefinition_postcondition_Constraint.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkDefinition_postcondition_Constraint.gif
deleted file mode 100644
index 6d944d7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkDefinition_postcondition_Constraint.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkDefinition_precondition_Constraint.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkDefinition_precondition_Constraint.gif
deleted file mode 100644
index 6d944d7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkDefinition_precondition_Constraint.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkProduct_estimate_Estimate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkProduct_estimate_Estimate.gif
deleted file mode 100644
index 676eb1d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/ctool16/CreateWorkProduct_estimate_Estimate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Activity.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Activity.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Activity.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ActivityDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ActivityDescription.gif
deleted file mode 100644
index cf20deb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ActivityDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Aggregate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Aggregate.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Aggregate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Artifact.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Artifact.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Artifact.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ArtifactDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ArtifactDescription.gif
deleted file mode 100644
index 501d219..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ArtifactDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Attachment.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Attachment.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Attachment.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/BreakdownElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/BreakdownElement.gif
deleted file mode 100644
index badaab0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/BreakdownElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/BreakdownElementDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/BreakdownElementDescription.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/BreakdownElementDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CapabilityPattern.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CapabilityPattern.gif
deleted file mode 100644
index 15ffbb0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CapabilityPattern.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Checklist.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Checklist.gif
deleted file mode 100644
index 88f6d8b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Checklist.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Classifier.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Classifier.gif
deleted file mode 100644
index a17dc7d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Classifier.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CompositeRole.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CompositeRole.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CompositeRole.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Concept.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Concept.gif
deleted file mode 100644
index 1df84da..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Concept.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Constraint.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Constraint.gif
deleted file mode 100644
index db7414e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Constraint.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentCategory.gif
deleted file mode 100644
index 45731fe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentDescription.gif
deleted file mode 100644
index be22463..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentElement.gif
deleted file mode 100644
index 5915591..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentPackage.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ContentPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CoreElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CoreElement.gif
deleted file mode 100644
index c3370c7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CoreElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CoreSemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CoreSemanticModelBridge.gif
deleted file mode 100644
index a17dc7d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CoreSemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CustomCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CustomCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/CustomCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Deliverable.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Deliverable.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Deliverable.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliverableDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliverableDescription.gif
deleted file mode 100644
index ca10563..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliverableDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliveryProcess.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliveryProcess.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliveryProcess.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliveryProcessDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliveryProcessDescription.gif
deleted file mode 100644
index 7b40362..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DeliveryProcessDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DescribableElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DescribableElement.gif
deleted file mode 100644
index 14af8aa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DescribableElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Descriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Descriptor.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Descriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DescriptorDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DescriptorDescription.gif
deleted file mode 100644
index 2b69256..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DescriptorDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Diagram.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Diagram.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Diagram.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DiagramElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DiagramElement.gif
deleted file mode 100644
index 45731fe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DiagramElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DiagramLink.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DiagramLink.gif
deleted file mode 100644
index c673a52..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DiagramLink.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Dimension.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Dimension.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Dimension.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Discipline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Discipline.gif
deleted file mode 100644
index 35bd476..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Discipline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DisciplineGrouping.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DisciplineGrouping.gif
deleted file mode 100644
index 5553c1d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/DisciplineGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Domain.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Domain.gif
deleted file mode 100644
index cf28926..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Domain.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Element.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Element.gif
deleted file mode 100644
index f8041d2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Element.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Ellipse.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Ellipse.gif
deleted file mode 100644
index 106881e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Ellipse.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Estimate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Estimate.gif
deleted file mode 100644
index 982d21c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Estimate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatedMethodElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatedMethodElement.gif
deleted file mode 100644
index 14af8aa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatedMethodElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingConsiderations.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingConsiderations.gif
deleted file mode 100644
index 4fc84e4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingMetric.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingMetric.gif
deleted file mode 100644
index e940975..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingMetric.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingModel.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingModel.gif
deleted file mode 100644
index caf2804..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingModel.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingParameter.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingParameter.gif
deleted file mode 100644
index 94c953e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingParameter.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingParameterOwner.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingParameterOwner.gif
deleted file mode 100644
index 5915591..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimatingParameterOwner.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimationConsiderations.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimationConsiderations.gif
deleted file mode 100644
index 4fc84e4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/EstimationConsiderations.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Example.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Example.gif
deleted file mode 100644
index 1b944fd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Example.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphConnector.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphConnector.gif
deleted file mode 100644
index 739ebbf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphConnector.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphEdge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphEdge.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphEdge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphElement.gif
deleted file mode 100644
index 338fb8d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphNode.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphNode.gif
deleted file mode 100644
index 134551b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphNode.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphicPrimitive.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphicPrimitive.gif
deleted file mode 100644
index 10d2229..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GraphicPrimitive.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Guidance.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Guidance.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Guidance.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GuidanceDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GuidanceDescription.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/GuidanceDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Guideline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Guideline.gif
deleted file mode 100644
index 66f44f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Guideline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Image.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Image.gif
deleted file mode 100644
index ef56c14..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Image.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Iteration.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Iteration.gif
deleted file mode 100644
index 4311e46..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Iteration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/LeafElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/LeafElement.gif
deleted file mode 100644
index 106881e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/LeafElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodConfiguration.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodConfiguration.gif
deleted file mode 100644
index de89602..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodConfiguration.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodElement.gif
deleted file mode 100644
index c4fb30e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodElementProperty.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodElementProperty.gif
deleted file mode 100644
index c414fe9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodElementProperty.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodLibrary.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodLibrary.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodLibrary.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPackage.gif
deleted file mode 100644
index 00a311e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPlugin.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPlugin.gif
deleted file mode 100644
index bb82c39..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPlugin.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPlugin_grey.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPlugin_grey.gif
deleted file mode 100644
index de63ade..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodPlugin_grey.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodUnit.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodUnit.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/MethodUnit.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Milestone.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Milestone.gif
deleted file mode 100644
index d9615eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Milestone.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Milestones.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Milestones.gif
deleted file mode 100644
index d9615eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Milestones.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/NamedElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/NamedElement.gif
deleted file mode 100644
index 14af8aa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/NamedElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Namespace.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Namespace.gif
deleted file mode 100644
index 498364f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Namespace.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/OBS.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/OBS.gif
deleted file mode 100644
index afb82ea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/OBS.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Outcome.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Outcome.gif
deleted file mode 100644
index e703518..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Outcome.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PBS.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PBS.gif
deleted file mode 100644
index 498364f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PBS.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Package.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Package.gif
deleted file mode 100644
index c00aedf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Package.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PackageableElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PackageableElement.gif
deleted file mode 100644
index 106881e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PackageableElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Phase.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Phase.gif
deleted file mode 100644
index ad60bd9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Phase.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PlanningData.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PlanningData.gif
deleted file mode 100644
index 94c953e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PlanningData.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Point.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Point.gif
deleted file mode 100644
index 53500da..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Point.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Polyline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Polyline.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Polyline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Practice.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Practice.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Practice.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PracticeDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PracticeDescription.gif
deleted file mode 100644
index 67209cb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PracticeDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Process.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Process.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Process.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponent.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponent.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponent.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponentDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponentDescriptor.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponentDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponentInterface.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponentInterface.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessComponentInterface.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessContext.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessContext.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessContext.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessContribution.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessContribution.gif
deleted file mode 100644
index 2b095d8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessContribution.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessDescription.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessElement.gif
deleted file mode 100644
index 0eac59f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessFamily.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessFamily.gif
deleted file mode 100644
index 2b69256..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessFamily.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPackage.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPackage.gif
deleted file mode 100644
index 08d8c2d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPackage.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPlan.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPlan.gif
deleted file mode 100644
index b1f8afa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPlan.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPlanningTemplate.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPlanningTemplate.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ProcessPlanningTemplate.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Property.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Property.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Property.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PseudoState.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PseudoState.gif
deleted file mode 100644
index c4fb30e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/PseudoState.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Reference.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Reference.gif
deleted file mode 100644
index 739ebbf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Reference.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Region.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Region.gif
deleted file mode 100644
index 4365960..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Region.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Report.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Report.gif
deleted file mode 100644
index c22c85e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Report.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ResourceDefinition.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ResourceDefinition.gif
deleted file mode 100644
index 98b351f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ResourceDefinition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ReusableAsset.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ReusableAsset.gif
deleted file mode 100644
index b52cffe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ReusableAsset.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Roadmap.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Roadmap.gif
deleted file mode 100644
index f11bc5d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Roadmap.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Role.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Role.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Role.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleDescription.gif
deleted file mode 100644
index 76e8896..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleDescriptor.gif
deleted file mode 100644
index 368c7b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSet.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSet.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSet.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSetCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSetCategory.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSetCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSetGrouping.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSetGrouping.gif
deleted file mode 100644
index 54a3f67..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/RoleSetGrouping.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Section.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Section.gif
deleted file mode 100644
index 739ebbf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Section.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SemanticModelBridge.gif
deleted file mode 100644
index 33854e9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SimpleSemanticModelElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SimpleSemanticModelElement.gif
deleted file mode 100644
index cb1755a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SimpleSemanticModelElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/State.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/State.gif
deleted file mode 100644
index cb1755a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/State.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/StateMachine.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/StateMachine.gif
deleted file mode 100644
index badaab0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/StateMachine.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Step.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Step.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Step.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SummitEstimatingParameter.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SummitEstimatingParameter.gif
deleted file mode 100644
index 45731fe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SummitEstimatingParameter.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SupportingMaterial.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SupportingMaterial.gif
deleted file mode 100644
index 05a21ec..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/SupportingMaterial.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Task.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Task.gif
deleted file mode 100644
index 5c3b2b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Task.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TaskDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TaskDescription.gif
deleted file mode 100644
index 5c3b2b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TaskDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TaskDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TaskDescriptor.gif
deleted file mode 100644
index 554e26e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TaskDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Team.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Team.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Team.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TeamProfile.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TeamProfile.gif
deleted file mode 100644
index 5099fea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TeamProfile.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Technique.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Technique.gif
deleted file mode 100644
index 36866d9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Technique.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Template.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Template.gif
deleted file mode 100644
index c763251..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Template.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TemplateDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TemplateDescription.gif
deleted file mode 100644
index c763251..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TemplateDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TermDefinition.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TermDefinition.gif
deleted file mode 100644
index e21bfe0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TermDefinition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TextElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TextElement.gif
deleted file mode 100644
index 134551b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TextElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Tool.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Tool.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Tool.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ToolMentor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ToolMentor.gif
deleted file mode 100644
index 4f1b85a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/ToolMentor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TrainingClass.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TrainingClass.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TrainingClass.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TrainingModule.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TrainingModule.gif
deleted file mode 100644
index ef56c14..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/TrainingModule.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Transition.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Transition.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Transition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Type.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Type.gif
deleted file mode 100644
index b1f8afa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Type.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/UMASemanticModelBridge.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/UMASemanticModelBridge.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/UMASemanticModelBridge.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/UserDefinedCategory.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/UserDefinedCategory.gif
deleted file mode 100644
index df47980..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/UserDefinedCategory.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/VariabilityElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/VariabilityElement.gif
deleted file mode 100644
index db7414e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/VariabilityElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Vertex.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Vertex.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Vertex.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WBS.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WBS.gif
deleted file mode 100644
index ef56c14..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WBS.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Whitepaper.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Whitepaper.gif
deleted file mode 100644
index e5b4800..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/Whitepaper.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkBreakdownElement.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkBreakdownElement.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkBreakdownElement.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkDefinition.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkDefinition.gif
deleted file mode 100644
index 2124f3e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkDefinition.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkOrder.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkOrder.gif
deleted file mode 100644
index badaab0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkOrder.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProduct.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProduct.gif
deleted file mode 100644
index 1540f3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProduct.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductDescription.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductDescription.gif
deleted file mode 100644
index 1540f3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductDescription.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductDescriptor.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductDescriptor.gif
deleted file mode 100644
index 6218229..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductGuideline.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductGuideline.gif
deleted file mode 100644
index 957fa65..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductGuideline.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductShape.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductShape.gif
deleted file mode 100644
index 1540f3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductShape.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductType.gif b/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductType.gif
deleted file mode 100644
index a7ecac0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/icons/full/obj16/WorkProductType.gif
+++ /dev/null
Binary files differ
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/plugin.properties b/1.5/plugins/org.eclipse.epf.uma.edit/plugin.properties
deleted file mode 100644
index 94181c1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/plugin.properties
+++ /dev/null
@@ -1,427 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-
-pluginName = EMF UMA Edit Support
-providerName = Eclipse.org
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_text3 = {1}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_Classifier_type = Classifier
-_UI_Type_type = Type
-_UI_Element_type = Element
-_UI_NamedElement_type = Named Element
-_UI_PackageableElement_type = Packageable Element
-_UI_Package_type = Package
-_UI_Namespace_type = Namespace
-_UI_MethodElement_type = Method Element
-_UI_Constraint_type = Constraint
-_UI_ContentElement_type = Content Element
-_UI_DescribableElement_type = Describable Element
-_UI_ContentDescription_type = Content Description
-_UI_Section_type = Section
-_UI_Role_type = Role
-_UI_WorkProduct_type = Work Product
-_UI_Task_type = Task
-_UI_WorkDefinition_type = Work Definition
-_UI_Step_type = Step
-_UI_Guidance_type = Guidance
-_UI_Artifact_type = Artifact
-_UI_Deliverable_type = Deliverable
-_UI_Outcome_type = Outcome
-_UI_MethodPackage_type = Method Package
-_UI_ContentPackage_type = Content Package
-_UI_ArtifactDescription_type = Artifact Description
-_UI_WorkProductDescription_type = Work Product Description
-_UI_DeliverableDescription_type = Deliverable Description
-_UI_RoleDescription_type = Role Description
-_UI_TaskDescription_type = Task Description
-_UI_GuidanceDescription_type = Guidance Description
-_UI_PracticeDescription_type = Practice Description
-_UI_Point_type = Point
-_UI_GraphElement_type = Graph Element
-_UI_DiagramElement_type = Diagram Element
-_UI_DiagramLink_type = Diagram Link
-_UI_GraphConnector_type = Graph Connector
-_UI_SemanticModelBridge_type = Semantic Model Bridge
-_UI_Dimension_type = Dimension
-_UI_Reference_type = Reference
-_UI_Property_type = Property
-_UI_GraphEdge_type = Graph Edge
-_UI_Diagram_type = Diagram
-_UI_GraphNode_type = Graph Node
-_UI_SimpleSemanticModelElement_type = Simple Semantic Model Element
-_UI_UMASemanticModelBridge_type = UMA Semantic Model Bridge
-_UI_CoreSemanticModelBridge_type = Core Semantic Model Bridge
-_UI_LeafElement_type = Leaf Element
-_UI_TextElement_type = Text Element
-_UI_Image_type = Image
-_UI_GraphicPrimitive_type = Graphic Primitive
-_UI_Polyline_type = Polyline
-_UI_Ellipse_type = Ellipse
-_UI_Activity_type = Activity
-_UI_WorkBreakdownElement_type = Work Breakdown Element
-_UI_BreakdownElement_type = Breakdown Element
-_UI_Milestone_type = Milestone
-_UI_Iteration_type = Iteration
-_UI_Phase_type = Phase
-_UI_TeamProfile_type = Team Profile
-_UI_RoleDescriptor_type = Role Descriptor
-_UI_WorkOrder_type = Work Order
-_UI_ProcessElement_type = Process Element
-_UI_PlanningData_type = Planning Data
-_UI_Descriptor_type = Descriptor
-_UI_WorkProductDescriptor_type = Work Product Descriptor
-_UI_TaskDescriptor_type = Task Descriptor
-_UI_CompositeRole_type = Composite Role
-_UI_BreakdownElementDescription_type = Breakdown Element Description
-_UI_ActivityDescription_type = Activity Description
-_UI_DeliveryProcessDescription_type = Delivery Process Description
-_UI_ProcessDescription_type = Process Description
-_UI_DescriptorDescription_type = Descriptor Description
-_UI_Concept_type = Concept
-_UI_Checklist_type = Checklist
-_UI_Example_type = Example
-_UI_Guideline_type = Guideline
-_UI_Report_type = Report
-_UI_Template_type = Template
-_UI_SupportingMaterial_type = Supporting Material
-_UI_ToolMentor_type = Tool Mentor
-_UI_Whitepaper_type = Whitepaper
-_UI_TermDefinition_type = Term Definition
-_UI_Practice_type = Practice
-_UI_EstimationConsiderations_type = Estimation Considerations
-_UI_ReusableAsset_type = Reusable Asset
-_UI_State_type = State
-_UI_Vertex_type = Vertex
-_UI_Region_type = Region
-_UI_StateMachine_type = State Machine
-_UI_Transition_type = Transition
-_UI_PseudoState_type = Pseudo State
-_UI_Discipline_type = Discipline
-_UI_ContentCategory_type = Content Category
-_UI_RoleSet_type = Role Set
-_UI_Domain_type = Domain
-_UI_WorkProductType_type = Work Product Kind
-_UI_DisciplineGrouping_type = Discipline Grouping
-_UI_Tool_type = Tool
-_UI_RoleSetGrouping_type = Role Set Grouping
-_UI_CustomCategory_type = Custom Category
-_UI_DeliveryProcess_type = Delivery Process
-_UI_Process_type = Process
-_UI_CapabilityPattern_type = Capability Pattern
-_UI_ProcessPlanningTemplate_type = Process Planning Template
-_UI_Roadmap_type = Roadmap
-_UI_ProcessComponent_type = Process Component
-_UI_ProcessPackage_type = Process Package
-_UI_ProcessComponentInterface_type = Process Component Interface
-_UI_ProcessComponentDescriptor_type = Process Component Descriptor
-_UI_MethodPlugin_type = Method Plug-in
-_UI_VariabilityElement_type = Variability Element
-_UI_MethodUnit_type = Method Unit
-_UI_MethodConfiguration_type = Method Configuration
-_UI_ProcessFamily_type = Process Family
-_UI_MethodLibrary_type = Method Library
-_UI_Unknown_type = Object
-
-_UI_Unknown_datatype= Value
-
-_UI_NamedElement_name_feature = Name
-_UI_MethodElement_guid_feature = GUID
-_UI_MethodElement_briefDescription_feature = Brief Description
-_UI_MethodElement_ownedRules_feature = Owned Rules
-_UI_MethodElement_suppressed_feature = Suppressed
-_UI_MethodElement_orderingGuide_feature = Ordering Guide
-_UI_Constraint_body_feature = Body
-_UI_ContentElement_supportingMaterials_feature = Supporting Materials
-_UI_ContentElement_conceptsAndPapers_feature = Concepts And Papers
-_UI_ContentElement_checklists_feature = Checklists
-_UI_ContentElement_guidelines_feature = Guidelines
-_UI_ContentElement_examples_feature = Examples
-_UI_ContentElement_assets_feature = Assets
-_UI_DescribableElement_presentationName_feature = Presentation Name
-_UI_DescribableElement_presentation_feature = Presentation
-_UI_DescribableElement_shapeicon_feature = Shapeicon
-_UI_DescribableElement_nodeicon_feature = Nodeicon
-_UI_ContentDescription_mainDescription_feature = Main Description
-_UI_ContentDescription_sections_feature = Sections
-_UI_ContentDescription_keyConsiderations_feature = Key Considerations
-_UI_Section_sectionName_feature = Section Name
-_UI_Section_sectionDescription_feature = Section Description
-_UI_Section_subSections_feature = Sub Sections
-_UI_Section_predecessor_feature = Predecessor
-_UI_Role_modifies_feature = Modifies
-_UI_Role_responsibleFor_feature = Responsible For
-_UI_WorkProduct_reports_feature = Reports
-_UI_WorkProduct_templates_feature = Templates
-_UI_WorkProduct_toolMentors_feature = Tool Mentors
-_UI_WorkProduct_estimationConsiderations_feature = Estimation Considerations
-_UI_Task_performedBy_feature = Performed By
-_UI_Task_mandatoryInput_feature = Mandatory Input
-_UI_Task_output_feature = Output
-_UI_Task_additionallyPerformedBy_feature = Additionally Performed By
-_UI_Task_optionalInput_feature = Optional Input
-_UI_Task_steps_feature = Steps
-_UI_Task_toolMentors_feature = Tool Mentors
-_UI_Task_estimationConsiderations_feature = Estimation Considerations
-_UI_WorkDefinition_precondition_feature = Precondition
-_UI_WorkDefinition_postcondition_feature = Postcondition
-_UI_Artifact_containerArtifact_feature = Container Artifact
-_UI_Artifact_containedArtifacts_feature = Contained Artifacts
-_UI_Deliverable_deliveredWorkProducts_feature = Delivered Work Products
-_UI_MethodPackage_global_feature = Global
-_UI_MethodPackage_reusedPackages_feature = Reused Packages
-_UI_MethodPackage_parentPackage_feature = Parent Package
-_UI_MethodPackage_childPackages_feature = Child Packages
-_UI_ContentPackage_contentElements_feature = Content Elements
-_UI_ArtifactDescription_briefOutline_feature = Brief Outline
-_UI_ArtifactDescription_representationOptions_feature = Representation Options
-_UI_WorkProductDescription_externalId_feature = External Id
-_UI_WorkProductDescription_purpose_feature = Purpose
-_UI_WorkProductDescription_impactOfNotHaving_feature = Impact Of Not Having
-_UI_WorkProductDescription_reasonsForNotNeeding_feature = Reasons For Not Needing
-_UI_DeliverableDescription_externalDescription_feature = External Description
-_UI_DeliverableDescription_packagingGuidance_feature = Packaging Guidance
-_UI_RoleDescription_skills_feature = Skills
-_UI_RoleDescription_assignmentApproaches_feature = Assignment Approaches
-_UI_RoleDescription_synonyms_feature = Synonyms
-_UI_TaskDescription_purpose_feature = Purpose
-_UI_TaskDescription_alternatives_feature = Alternatives
-_UI_GuidanceDescription_attachments_feature = Attachments
-_UI_PracticeDescription_additionalInfo_feature = Additional Info
-_UI_PracticeDescription_problem_feature = Problem
-_UI_PracticeDescription_background_feature = Background
-_UI_PracticeDescription_goals_feature = Goals
-_UI_PracticeDescription_application_feature = Application
-_UI_PracticeDescription_levelsOfAdoption_feature = Levels Of Adoption
-_UI_Point_x_feature = X
-_UI_Point_y_feature = Y
-_UI_GraphElement_position_feature = Position
-_UI_GraphElement_contained_feature = Contained
-_UI_GraphElement_link_feature = Link
-_UI_GraphElement_anchorage_feature = Anchorage
-_UI_GraphElement_semanticModel_feature = Semantic Model
-_UI_DiagramElement_isVisible_feature = Is Visible
-_UI_DiagramElement_container_feature = Container
-_UI_DiagramElement_reference_feature = Reference
-_UI_DiagramElement_property_feature = Property
-_UI_DiagramLink_zoom_feature = Zoom
-_UI_DiagramLink_viewport_feature = Viewport
-_UI_DiagramLink_graphElement_feature = Graph Element
-_UI_DiagramLink_diagram_feature = Diagram
-_UI_GraphConnector_graphElement_feature = Graph Element
-_UI_GraphConnector_graphEdge_feature = Graph Edge
-_UI_SemanticModelBridge_presentation_feature = Presentation
-_UI_SemanticModelBridge_graphElement_feature = Graph Element
-_UI_SemanticModelBridge_diagram_feature = Diagram
-_UI_Dimension_width_feature = Width
-_UI_Dimension_height_feature = Height
-_UI_Reference_isIndividualRepresentation_feature = Is Individual Representation
-_UI_Reference_referenced_feature = Referenced
-_UI_Property_key_feature = Key
-_UI_Property_value_feature = Value
-_UI_GraphEdge_anchor_feature = Anchor
-_UI_GraphEdge_waypoints_feature = Waypoints
-_UI_Diagram_zoom_feature = Zoom
-_UI_Diagram_viewpoint_feature = Viewpoint
-_UI_Diagram_diagramLink_feature = Diagram Link
-_UI_Diagram_namespace_feature = Namespace
-_UI_GraphNode_size_feature = Size
-_UI_SimpleSemanticModelElement_typeInfo_feature = Type Info
-_UI_UMASemanticModelBridge_element_feature = Element
-_UI_CoreSemanticModelBridge_element_feature = Element
-_UI_TextElement_text_feature = Text
-_UI_Image_uri_feature = Uri
-_UI_Image_mimeType_feature = Mime Type
-_UI_Polyline_closed_feature = Closed
-_UI_Polyline_waypoints_feature = Waypoints
-_UI_Ellipse_radiusX_feature = Radius X
-_UI_Ellipse_radiusY_feature = Radius Y
-_UI_Ellipse_rotation_feature = Rotation
-_UI_Ellipse_startAngle_feature = Start Angle
-_UI_Ellipse_endAngle_feature = End Angle
-_UI_Ellipse_center_feature = Center
-_UI_Activity_breakdownElements_feature = Breakdown Elements
-_UI_Activity_roadmaps_feature = Roadmaps
-_UI_Activity_supportingMaterials_feature = Supporting Materials
-_UI_Activity_checklists_feature = Checklists
-_UI_Activity_concepts_feature = Concepts
-_UI_Activity_examples_feature = Examples
-_UI_Activity_guidelines_feature = Guidelines
-_UI_Activity_reusableAssets_feature = Reusable Assets
-_UI_Activity_isEnactable_feature = Is Enactable
-_UI_WorkBreakdownElement_isRepeatable_feature = Is Repeatable
-_UI_WorkBreakdownElement_isOngoing_feature = Is Ongoing
-_UI_WorkBreakdownElement_isEventDriven_feature = Is Event Driven
-_UI_WorkBreakdownElement_linkToPredecessor_feature = Link To Predecessor
-_UI_BreakdownElement_prefix_feature = Prefix
-_UI_BreakdownElement_isPlanned_feature = Is Planned
-_UI_BreakdownElement_hasMultipleOccurrences_feature = Has Multiple Occurrences
-_UI_BreakdownElement_isOptional_feature = Is Optional
-_UI_BreakdownElement_presentedAfter_feature = Presented After
-_UI_BreakdownElement_presentedBefore_feature = Presented Before
-_UI_BreakdownElement_planningData_feature = Planning Data
-_UI_BreakdownElement_superActivities_feature = Super Activity
-_UI_TeamProfile_teamRoles_feature = Team Roles
-_UI_TeamProfile_superTeam_feature = Super Team
-_UI_TeamProfile_subTeam_feature = Sub Team
-_UI_RoleDescriptor_Role_feature = Role
-_UI_RoleDescriptor_modifies_feature = Modifies
-_UI_RoleDescriptor_responsibleFor_feature = Responsible For
-_UI_WorkOrder_linkType_feature = Link Type
-_UI_WorkOrder_pred_feature = Pred
-_UI_PlanningData_startDate_feature = Start Date
-_UI_PlanningData_finishDate_feature = Finish Date
-_UI_PlanningData_rank_feature = Rank
-_UI_Descriptor_isSynchronizedWithSource_feature = Is Synchronized With Source
-_UI_WorkProductDescriptor_activityEntryState_feature = Activity Entry State
-_UI_WorkProductDescriptor_activityExitState_feature = Activity Exit State
-_UI_WorkProductDescriptor_WorkProduct_feature = Work Product
-_UI_WorkProductDescriptor_impactedBy_feature = Impacted By
-_UI_WorkProductDescriptor_impacts_feature = Impacts
-_UI_WorkProductDescriptor_deliverableParts_feature = Deliverable Parts
-_UI_TaskDescriptor_Task_feature = Task
-_UI_TaskDescriptor_additionallyPerformedBy_feature = Secondary Performer
-_UI_TaskDescriptor_assistedBy_feature = Assisted By
-_UI_TaskDescriptor_externalInput_feature = External Input
-_UI_TaskDescriptor_mandatoryInput_feature = Mandatory Input
-_UI_TaskDescriptor_optionalInput_feature = Optional Input
-_UI_TaskDescriptor_output_feature = Output
-_UI_TaskDescriptor_performedPrimarilyBy_feature = Primary Performer
-_UI_TaskDescriptor_selectedSteps_feature = Selected Steps
-_UI_CompositeRole_aggregatedRoles_feature = Aggregated Roles
-_UI_BreakdownElementDescription_usageGuidance_feature = Usage Guidance
-_UI_ActivityDescription_purpose_feature = Purpose
-_UI_ActivityDescription_alternatives_feature = Alternatives
-_UI_ActivityDescription_howtoStaff_feature = Howto Staff
-_UI_DeliveryProcessDescription_scale_feature = Scale
-_UI_DeliveryProcessDescription_projectCharacteristics_feature = Project Characteristics
-_UI_DeliveryProcessDescription_riskLevel_feature = Risk Level
-_UI_DeliveryProcessDescription_estimatingTechnique_feature = Estimating Technique
-_UI_DeliveryProcessDescription_projectMemberExpertise_feature = Project Member Expertise
-_UI_DeliveryProcessDescription_typeOfContract_feature = Type Of Contract
-_UI_ProcessDescription_externalId_feature = External Id
-_UI_ProcessDescription_scope_feature = Scope
-_UI_ProcessDescription_usageNotes_feature = Usage Notes
-_UI_DescriptorDescription_refinedDescription_feature = Refined Description
-_UI_Practice_subPractices_feature = Sub Practices
-_UI_Practice_contentReferences_feature = Content References
-_UI_Practice_activityReferences_feature = Activity References
-_UI_State_WorkProduct_feature = Work Product
-_UI_State_Region_feature = Region
-_UI_State_submachine_feature = Submachine
-_UI_Vertex_container_feature = Container
-_UI_Vertex_outgoing_feature = Outgoing
-_UI_Vertex_incoming_feature = Incoming
-_UI_Region_Vertex_feature = Vertex
-_UI_Region_Transition_feature = Transition
-_UI_Region_State_feature = State
-_UI_Region_StateMachine_feature = State Machine
-_UI_StateMachine_Region_feature = Region
-_UI_Transition_WorkDefinition_feature = Work Definition
-_UI_Transition_container_feature = Container
-_UI_Transition_source_feature = Source
-_UI_Transition_target_feature = Target
-_UI_Discipline_tasks_feature = Tasks
-_UI_Discipline_subdiscipline_feature = Subdiscipline
-_UI_Discipline_referenceWorkflows_feature = Reference Workflows
-_UI_RoleSet_roles_feature = Roles
-_UI_Domain_workProducts_feature = Work Products
-_UI_Domain_subdomains_feature = Subdomains
-_UI_WorkProductType_workProducts_feature = Work Products
-_UI_DisciplineGrouping_disciplines_feature = Disciplines
-_UI_Tool_toolMentors_feature = Tool Mentors
-_UI_RoleSetGrouping_roleSets_feature = Role Sets
-_UI_CustomCategory_categorizedElements_feature = Categorized Elements
-_UI_CustomCategory_subCategories_feature = Sub Categories
-_UI_DeliveryProcess_educationMaterials_feature = Education Materials
-_UI_DeliveryProcess_communicationsMaterials_feature = Communications Materials
-_UI_Process_includesPatterns_feature = Includes Patterns
-_UI_Process_defaultContext_feature = Default Context
-_UI_Process_validContext_feature = Valid Context
-_UI_ProcessPlanningTemplate_basedOnProcesses_feature = Based On Processes
-_UI_ProcessComponent_interfaces_feature = Interfaces
-_UI_ProcessComponent_process_feature = Process
-_UI_ProcessPackage_processElements_feature = Process Elements
-_UI_ProcessPackage_diagrams_feature = Diagrams
-_UI_ProcessComponentInterface_interfaceSpecifications_feature = Interface Specifications
-_UI_ProcessComponentInterface_interfaceIO_feature = Interface IO
-_UI_ProcessComponentDescriptor_ProcessComponent_feature = Process Component
-_UI_MethodPlugin_userChangeable_feature = User Changeable
-_UI_MethodPlugin_methodPackages_feature = Method Packages
-_UI_MethodPlugin_bases_feature = Bases
-_UI_VariabilityElement_variabilityType_feature = Variability Type
-_UI_VariabilityElement_variabilityBasedOnElement_feature = Variability Based On Element
-_UI_MethodUnit_authors_feature = Authors
-_UI_MethodUnit_changeDate_feature = Change Date
-_UI_MethodUnit_changeDescription_feature = Change Description
-_UI_MethodUnit_version_feature = Version
-_UI_MethodUnit_copyrightStatement_feature = Copyright Statement
-_UI_MethodConfiguration_methodPluginSelection_feature = Method Plug-in Selection
-_UI_MethodConfiguration_methodPackageSelection_feature = Method Package Selection
-_UI_MethodConfiguration_processViews_feature = Process Views
-_UI_MethodConfiguration_defaultView_feature = Default View
-_UI_MethodConfiguration_baseConfigurations_feature = Base Configurations
-_UI_ProcessFamily_deliveryProcesses_feature = Delivery Processes
-_UI_MethodLibrary_methodPlugins_feature = Method Plug-ins
-_UI_MethodLibrary_predefinedConfigurations_feature = Predefined Configurations
-_UI_Unknown_feature = Unspecified
-
-_UI_WorkOrderType_finishToStart_literal = finishToStart
-_UI_WorkOrderType_finishToFinish_literal = finishToFinish
-_UI_WorkOrderType_startToStart_literal = startToStart
-_UI_WorkOrderType_startToFinish_literal = startToFinish
-_UI_PseudoStateKind_initial_literal = initial
-_UI_PseudoStateKind_join_literal = join
-_UI_PseudoStateKind_fork_literal = fork
-_UI_PseudoStateKind_junction_literal = junction
-_UI_PseudoStateKind_choice_literal = choice
-_UI_PseudoStateKind_entryPoint_literal = entryPoint
-_UI_PseudoStateKind_exitPoint_literal = exitPoint
-_UI_PseudoStateKind_terminate_literal = terminate
-_UI_VariabilityType_na_literal = na
-_UI_VariabilityType_contributes_literal = contributes
-_UI_VariabilityType_extends_literal = extends
-_UI_VariabilityType_replaces_literal = replaces
-_UI_VariabilityType_localContribution_literal = localContribution
-_UI_VariabilityType_localReplacement_literal = localReplacement
-_UI_ArtifactDescriptor_type = Artifact Descriptor
-_UI_DeliverableDescriptor_type = Deliverable Descriptor
-_UI_OutcomeDescriptor_type = Outcome Descriptor
-_UI_MethodElementProperty_type = Method Element Property
-_UI_MethodElement_methodElementProperty_feature = Method Element Property
-_UI_MethodElementProperty_value_feature = Value
-_UI_MethodConfiguration_subtractedCategory_feature = Subtracted Category
-_UI_MethodConfiguration_addedCategory_feature = Added Category
-_UI_VariabilityType_extendsReplaces_literal = extendsReplaces
-_UI_ArtifactDescription_representation_feature = Representation
-_UI_ArtifactDescription_notation_feature = Notation
-_UI_ContentElement_termDefinition_feature = Term Definition
-_UI_ContentDescription_externalId_feature = External Id
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/plugin.xml b/1.5/plugins/org.eclipse.epf.uma.edit/plugin.xml
deleted file mode 100644
index 2d62f09..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/plugin.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- <copyright>
- </copyright>
-
- $Id: plugin.xml,v 1.1 2008/01/15 08:52:54 jtham Exp $
--->
-
-<plugin>
-    
-  <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-    <factory 
-       uri = "http://www.eclipse.org/epf/uma/1.0.3/uma.ecore" 
-       class = "org.eclipse.epf.uma.provider.UmaItemProviderAdapterFactory" 
-       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/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementCreateCopyCommand.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementCreateCopyCommand.java
deleted file mode 100644
index 0d79ee3..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementCreateCopyCommand.java
+++ /dev/null
@@ -1,63 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.edit.command;
-
-import java.util.Collection;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CreateCopyCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.uma.edit.domain.TraceableAdapterFactoryEditingDomain;
-
-/**
- * A command that creates an uninitialized copy of a method element. The
- * necessary initialization will be executed using
- * {@link MethodElementInitializeCopyCommand}.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodElementCreateCopyCommand extends CreateCopyCommand {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param domain
-	 *            the editing domain
-	 * @param owner
-	 *            the object being copied
-	 * @param copyHelper
-	 *            a helper class that is used to keep track of copied objects
-	 *            and their associated copies
-	 */
-	public MethodElementCreateCopyCommand(EditingDomain domain, EObject owner,
-			Helper copyHelper) {
-		super(domain, owner, copyHelper);
-	}
-
-	/**
-	 * Gets the result of the copy operation.
-	 * 
-	 * @return a collection containing the copied method element.
-	 */
-	public Collection doGetResult() {
-		Collection collection = super.doGetResult();
-
-		if (domain instanceof TraceableAdapterFactoryEditingDomain) {
-			((TraceableAdapterFactoryEditingDomain) domain).addCopyInfo(
-					collection, copyHelper);
-		}
-
-		return collection;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementInitializeCopyCommand.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementInitializeCopyCommand.java
deleted file mode 100644
index 91a3217..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementInitializeCopyCommand.java
+++ /dev/null
@@ -1,156 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.edit.command;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.edit.command.InitializeCopyCommand;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-import org.eclipse.epf.uma.provider.UmaEditPlugin;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * A command that takes an uninitialized copy of a method element and sets a new
- * GUID. If the original element is a <code>ContentElement</code> with a valid
- * <code>ContentDescription</code>, a copy of the
- * <code>ContentDescription</code> is also created.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MethodElementInitializeCopyCommand extends InitializeCopyCommand {
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param domain
-	 *            the editing domain
-	 * @param owner
-	 *            the object being copied
-	 * @param copyHelper
-	 *            a helper class that is used to keep track of copied objects
-	 *            and their associated copies
-	 */
-	public MethodElementInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper copyHelper) {
-		super(domain, owner, copyHelper);
-	}
-
-	/**
-	 * @see org.eclipse.emf.edit.command.InitializeCopyCommand#doExecute()
-	 */
-	public void doExecute() {
-		super.doExecute();
-
-		// generate new GUID for the copy
-		//
-		if (copy instanceof MethodElement) {
-			MethodElement e = ((MethodElement) copy);
-			if (e instanceof ContentDescription) {
-				EObject eContainer = e.eContainer();
-				if (eContainer instanceof MethodElement) {
-					e.setGuid(UmaUtil.generateGUID(((MethodElement) eContainer)
-							.getGuid()));
-				} else {
-					e.setGuid(UmaUtil.generateGUID());
-					UmaEditPlugin.INSTANCE
-							.log("MethodElementInitializeCopyCommand: eContainer not initialized for " + e); //$NON-NLS-1$
-				}
-			} else {
-				e.setGuid(UmaUtil.generateGUID());
-			}
-		}
-	}
-
-	/**
-	 * Iterates over the references of the owner object and sets them
-	 * accordingly in the copy. Includes coping of opposite features.
-	 */
-	private void doCopyReferences() {
-		if (owner instanceof ContentDescription) {
-			super.copyReferences();
-			return;
-		}
-		for (Iterator references = getReferencesToCopy().iterator(); references
-				.hasNext();) {
-			EReference reference = (EReference) references.next();
-			if (!reference.isChangeable() || reference.isDerived()) {
-				continue;
-			}
-
-			EReference reverseReference = reference.getEOpposite();
-
-			Object value = owner.eGet(reference);
-			if (value == null) {
-				continue;
-			}
-
-			OppositeFeature oppositeFeature = OppositeFeature
-					.getOppositeFeature(reference);
-			boolean copiedTargetRequired = reverseReference != null
-					|| reference.isContainment()
-					|| (oppositeFeature != null && !oppositeFeature.isMany());
-			// "many" opposite feature does not require copied target, it is
-			// treated as a regular non-containment reference
-			// TODO: bidirectional relationships are not automatically copied in
-			// EMF implementation
-			if (reference.isMany()) {
-				List valueList = (List) value;
-				if (!valueList.isEmpty()) {
-					EList copyList = (EList) copy.eGet(reference);
-					int index = 0;
-					for (Iterator valueIter = valueList.iterator(); valueIter
-							.hasNext(); ++index) {
-						EObject object = null;
-						try {
-							object = (EObject) valueIter.next();
-						} catch (Exception e) {
-							UmaEditPlugin.INSTANCE.log(e);
-						}
-						EObject target = copyHelper.getCopyTarget(object,
-								copiedTargetRequired);
-						if (target == null)
-							break; // if one is null, they'll all be null
-						if (reverseReference != null) {
-							int position = copyList.indexOf(target);
-							if (position == -1) {
-								copyList.add(index, target);
-							} else {
-								copyList.move(index, target);
-							}
-						} else {
-							copyList.add(target);
-						}
-					}
-				}
-			} else {
-				EObject target = copyHelper.getCopyTarget((EObject) value,
-						copiedTargetRequired);
-				if (target != null) {
-					copy.eSet(reference, target);
-				}
-			}
-		}
-	}
-
-	protected void copyReferences() {
-		doCopyReferences();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/package.html b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/package.html
deleted file mode 100644
index 701eb8a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides commands for copying the UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/domain/TraceableAdapterFactoryEditingDomain.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/domain/TraceableAdapterFactoryEditingDomain.java
deleted file mode 100644
index 8c3ec60..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/domain/TraceableAdapterFactoryEditingDomain.java
+++ /dev/null
@@ -1,219 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.edit.domain;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.epf.uma.MethodElement;
-
-/**
- * A traceable adapter factory editing domain used for copying method elements.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class TraceableAdapterFactoryEditingDomain extends
-		AdapterFactoryEditingDomain {
-
-	// Maps copied method elements to their original counterparts.
-	// Note: Copied elements are copies of the clipboard copies.
-	private HashMap copyToOriginalMap = null;
-
-	// Maps original elements to their clipboard copies.
-	private Map originalToClipboardMap = null;
-	
-	private Map<EObject, EObject> clipboardToOriginalMap;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 *            an adapter factory used to create the adapter to which calls
-	 *            are delegated
-	 * @param commandStack
-	 *            a command stack
-	 */
-	public TraceableAdapterFactoryEditingDomain(AdapterFactory adapterFactory,
-			CommandStack commandStack) {
-		super(adapterFactory, commandStack);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 *            an adapter factory used to create the adapter to which calls
-	 *            are delegated
-	 * @param commandStack
-	 *            a command stack
-	 * @param resourceToReadOnlyMap
-	 *            controls whether the domain is read only
-	 */
-	public TraceableAdapterFactoryEditingDomain(AdapterFactory adapterFactory,
-			CommandStack commandStack, Map resourceToReadOnlyMap) {
-		super(adapterFactory, commandStack, resourceToReadOnlyMap);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param adapterFactory
-	 *            an adapter factory used to create the adapter to which calls
-	 *            are delegated
-	 * @param commandStack
-	 *            a command stack
-	 * @param resourceSet
-	 *            a resource set
-	 */
-	public TraceableAdapterFactoryEditingDomain(AdapterFactory adapterFactory,
-			CommandStack commandStack, ResourceSet resourceSet) {
-		super(adapterFactory, commandStack, resourceSet);
-	}
-
-	/**
-	 * Returns a map containing the copied elements mapped to their original
-	 * counterparts.
-	 * 
-	 * @return a map containing the copied elements mapped to their original
-	 *         counterparts
-	 */
-	public Map getCopyToOriginalMap() {
-		if (copyToOriginalMap == null) {
-			copyToOriginalMap = new HashMap();
-		}
-		return copyToOriginalMap;
-	}
-	
-	
-	/**
-	 * Returns a map containing the original elements mapped to their copied 
-	 * counterparts on clipboard
-	 * 
-	 * @return a map containing the original elements mapped to their copied 
-	 *         counterparts
-	 */
-	public Map getOriginalToClipboardMap() {
-		if (originalToClipboardMap == null) {
-			originalToClipboardMap = new HashMap();
-		}
-		return originalToClipboardMap;
-	}
-
-	/**
-	 * Used by the CreateCopyCommand. Adds infomation to construct maps that
-	 * keep track of the original method elements and their copies.
-	 * 
-	 * @param c
-	 *            a collection to store the mapping info
-	 * @param copyHelper
-	 *            a helper class that is used to keep track of copied objects
-	 *            and their associated copies
-	 */
-	public void addCopyInfo(Collection c, Helper copyHelper) {
-		if (isNewCopy(c, copyHelper)) {
-			addNewCopy(c, copyHelper);
-			return;
-		} else {
-			chainCopy(c, copyHelper);
-			return;
-		}
-	}
-
-	/**
-	 * Adds a new element that is being copied to the clipboard.
-	 */
-	private void addNewCopy(Collection c, Helper copyHelper) {
-		// this means we are copying the Collection c to the clipboard
-		if (originalToClipboardMap == null)
-			originalToClipboardMap = new HashMap();
-		if(clipboardToOriginalMap == null) {
-			clipboardToOriginalMap = new HashMap<EObject, EObject>();
-		}
-		Iterator iter = copyHelper.keySet().iterator();
-		while (iter.hasNext()) {
-			EObject key = (EObject) iter.next();
-			EObject value = (EObject) copyHelper.get(key);
-			originalToClipboardMap.put(key, value);
-			clipboardToOriginalMap.put(value, key);
-		}
-	}
-
-	/**
-	 * Creates a map from the copied elements to their original counterparts.
-	 */
-	private void chainCopy(Collection c, Helper copyHelper) {
-		// chain the maps - change the copyToOriginalMap
-		if (originalToClipboardMap != null) {
-			if (copyToOriginalMap == null)
-				copyToOriginalMap = new HashMap();
-			Iterator iter = originalToClipboardMap.keySet().iterator();
-			while (iter.hasNext()) {
-				Object o2CKey = iter.next();
-				Object o2CValue = originalToClipboardMap.get(o2CKey);
-				Object copyValue = copyHelper.get(o2CValue);
-				if (copyValue == null) {
-					// error
-					continue;
-				}
-				if (o2CKey instanceof MethodElement)
-					copyToOriginalMap.put(copyValue, o2CKey);
-			}
-		}
-	}
-
-	private boolean isNewCopy(Collection c, Helper copyHelper) {
-		// originalToClipboardMap was set to null at start of copy command
-		if (originalToClipboardMap == null)
-			return true;
-
-		// iterate through copyHelper map, see if any copyHelper keys are o2C
-		// values, which means we are copying clipboard
-		Iterator iter = copyHelper.keySet().iterator();
-		while (iter.hasNext()) {
-			Object clipKey = iter.next();
-			if (!originalToClipboardMap.containsValue(clipKey))
-				return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * Initializes the copy maps. It should be called within the copy action.
-	 */
-	public void resetCopyMaps() {
-		if (originalToClipboardMap != null) {
-			originalToClipboardMap.clear();
-			originalToClipboardMap = null;
-		}
-		if(clipboardToOriginalMap != null) {
-			clipboardToOriginalMap.clear();
-			clipboardToOriginalMap = null;
-		}
-		if (copyToOriginalMap != null) {
-			copyToOriginalMap.clear();
-			copyToOriginalMap = null;
-		}
-	}
-
-	public Map<EObject, EObject> getClipboardToOriginalMap() {
-		return clipboardToOriginalMap;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/domain/package.html b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/domain/package.html
deleted file mode 100644
index e29ea73..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/domain/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the default editing domain for the UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ActivityDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ActivityDescriptionItemProvider.java
deleted file mode 100644
index e2937a7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ActivityDescriptionItemProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ActivityDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ActivityDescriptionItemProvider extends
-		BreakdownElementDescriptionItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPurposePropertyDescriptor(object);
-			addAlternativesPropertyDescriptor(object);
-			addHowtoStaffPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Purpose feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPurposePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ActivityDescription_purpose_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ActivityDescription_purpose_feature", "_UI_ActivityDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY_DESCRIPTION__PURPOSE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Alternatives feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAlternativesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ActivityDescription_alternatives_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ActivityDescription_alternatives_feature", "_UI_ActivityDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY_DESCRIPTION__ALTERNATIVES,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Howto Staff feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addHowtoStaffPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ActivityDescription_howtoStaff_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ActivityDescription_howtoStaff_feature", "_UI_ActivityDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY_DESCRIPTION__HOWTO_STAFF,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns ActivityDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ActivityDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ActivityDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ActivityDescription_type") : //$NON-NLS-1$
-				getString("_UI_ActivityDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ActivityDescription.class)) {
-		case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-		case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-		case UmaPackage.ACTIVITY_DESCRIPTION__HOWTO_STAFF:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ActivityItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ActivityItemProvider.java
deleted file mode 100644
index 94698ec..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ActivityItemProvider.java
+++ /dev/null
@@ -1,419 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Activity;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Activity} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ActivityItemProvider extends WorkBreakdownElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addVariabilityTypePropertyDescriptor(object);
-			addVariabilityBasedOnElementPropertyDescriptor(object);
-			addBreakdownElementsPropertyDescriptor(object);
-			addRoadmapsPropertyDescriptor(object);
-			addSupportingMaterialsPropertyDescriptor(object);
-			addChecklistsPropertyDescriptor(object);
-			addConceptsPropertyDescriptor(object);
-			addExamplesPropertyDescriptor(object);
-			addGuidelinesPropertyDescriptor(object);
-			addReusableAssetsPropertyDescriptor(object);
-			addIsEnactablePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Variability Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVariabilityTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_VariabilityElement_variabilityType_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_VariabilityElement_variabilityType_feature", "_UI_VariabilityElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Variability Based On Element feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVariabilityBasedOnElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_VariabilityElement_variabilityBasedOnElement_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_VariabilityElement_variabilityBasedOnElement_feature", "_UI_VariabilityElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Checklists feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addChecklistsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_checklists_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_checklists_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__CHECKLISTS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Concepts feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addConceptsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_concepts_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_concepts_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__CONCEPTS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Examples feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addExamplesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_examples_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_examples_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__EXAMPLES, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Guidelines feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGuidelinesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_guidelines_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_guidelines_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__GUIDELINES, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Reusable Assets feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReusableAssetsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_reusableAssets_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_reusableAssets_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__REUSABLE_ASSETS, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Enactable feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsEnactablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_isEnactable_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_isEnactable_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__IS_ENACTABLE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__PRECONDITION);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This adds a property descriptor for the Breakdown Elements feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBreakdownElementsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_breakdownElements_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_breakdownElements_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Roadmaps feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRoadmapsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_roadmaps_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_roadmaps_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__ROADMAPS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Supporting Materials feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSupportingMaterialsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Activity_supportingMaterials_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Activity_supportingMaterials_feature", "_UI_Activity_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ACTIVITY__SUPPORTING_MATERIALS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns Activity.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Activity")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Activity) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Activity_type") : //$NON-NLS-1$
-				getString("_UI_Activity_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Activity.class)) {
-		case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-		case UmaPackage.ACTIVITY__IS_ENACTABLE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.ACTIVITY__PRECONDITION:
-		case UmaPackage.ACTIVITY__POSTCONDITION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__PRECONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ArtifactDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ArtifactDescriptionItemProvider.java
deleted file mode 100644
index bf064f8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ArtifactDescriptionItemProvider.java
+++ /dev/null
@@ -1,215 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ArtifactDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ArtifactDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ArtifactDescriptionItemProvider extends
-		WorkProductDescriptionItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArtifactDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addBriefOutlinePropertyDescriptor(object);
-			addRepresentationOptionsPropertyDescriptor(object);
-			addRepresentationPropertyDescriptor(object);
-			addNotationPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Brief Outline feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBriefOutlinePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ArtifactDescription_briefOutline_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ArtifactDescription_briefOutline_feature", "_UI_ArtifactDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Representation Options feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRepresentationOptionsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ArtifactDescription_representationOptions_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ArtifactDescription_representationOptions_feature", "_UI_ArtifactDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Representation feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRepresentationPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ArtifactDescription_representation_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ArtifactDescription_representation_feature", "_UI_ArtifactDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ARTIFACT_DESCRIPTION__REPRESENTATION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Notation feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNotationPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ArtifactDescription_notation_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ArtifactDescription_notation_feature", "_UI_ArtifactDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ARTIFACT_DESCRIPTION__NOTATION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns ArtifactDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ArtifactDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ArtifactDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ArtifactDescription_type") : //$NON-NLS-1$
-				getString("_UI_ArtifactDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ArtifactDescription.class)) {
-		case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-		case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ArtifactItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ArtifactItemProvider.java
deleted file mode 100644
index 0391b31..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ArtifactItemProvider.java
+++ /dev/null
@@ -1,160 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Artifact;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Artifact} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ArtifactItemProvider extends WorkProductItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArtifactItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.ARTIFACT__CONTAINED_ARTIFACTS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Artifact.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Artifact")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Artifact) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Artifact_type") : //$NON-NLS-1$
-				getString("_UI_Artifact_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Artifact.class)) {
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.ARTIFACT__CONTAINED_ARTIFACTS,
-				UmaFactory.eINSTANCE.createArtifact()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/BreakdownElementDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/BreakdownElementDescriptionItemProvider.java
deleted file mode 100644
index afd35f0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/BreakdownElementDescriptionItemProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.BreakdownElementDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class BreakdownElementDescriptionItemProvider extends
-		ContentDescriptionItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElementDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addUsageGuidancePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Usage Guidance feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addUsageGuidancePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElementDescription_usageGuidance_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElementDescription_usageGuidance_feature", "_UI_BreakdownElementDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns BreakdownElementDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/BreakdownElementDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((BreakdownElementDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_BreakdownElementDescription_type") : //$NON-NLS-1$
-				getString("_UI_BreakdownElementDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BreakdownElementDescription.class)) {
-		case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/BreakdownElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/BreakdownElementItemProvider.java
deleted file mode 100644
index 4a2dbac..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/BreakdownElementItemProvider.java
+++ /dev/null
@@ -1,313 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.BreakdownElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class BreakdownElementItemProvider extends ProcessElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPrefixPropertyDescriptor(object);
-			addIsPlannedPropertyDescriptor(object);
-			addHasMultipleOccurrencesPropertyDescriptor(object);
-			addIsOptionalPropertyDescriptor(object);
-			addPresentedAfterPropertyDescriptor(object);
-			addPresentedBeforePropertyDescriptor(object);
-			addSuperActivitiesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Prefix feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPrefixPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElement_prefix_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElement_prefix_feature", "_UI_BreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT__PREFIX, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Planned feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsPlannedPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElement_isPlanned_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElement_isPlanned_feature", "_UI_BreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT__IS_PLANNED,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Has Multiple Occurrences feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addHasMultipleOccurrencesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElement_hasMultipleOccurrences_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElement_hasMultipleOccurrences_feature", "_UI_BreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Optional feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsOptionalPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElement_isOptional_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElement_isOptional_feature", "_UI_BreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT__IS_OPTIONAL,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Presented After feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPresentedAfterPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElement_presentedAfter_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElement_presentedAfter_feature", "_UI_BreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT__PRESENTED_AFTER,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Presented Before feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPresentedBeforePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElement_presentedBefore_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElement_presentedBefore_feature", "_UI_BreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT__PRESENTED_BEFORE,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Super Activities feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSuperActivitiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_BreakdownElement_superActivities_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_BreakdownElement_superActivities_feature", "_UI_BreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.BREAKDOWN_ELEMENT__PLANNING_DATA);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns BreakdownElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/BreakdownElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((BreakdownElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_BreakdownElement_type") : //$NON-NLS-1$
-				getString("_UI_BreakdownElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BreakdownElement.class)) {
-		case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-		case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.BREAKDOWN_ELEMENT__PLANNING_DATA,
-				UmaFactory.eINSTANCE.createPlanningData()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CapabilityPatternItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CapabilityPatternItemProvider.java
deleted file mode 100644
index 4977118..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CapabilityPatternItemProvider.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.CapabilityPattern} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class CapabilityPatternItemProvider extends ProcessItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CapabilityPatternItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns CapabilityPattern.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/CapabilityPattern")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((CapabilityPattern) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_CapabilityPattern_type") : //$NON-NLS-1$
-				getString("_UI_CapabilityPattern_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ChecklistItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ChecklistItemProvider.java
deleted file mode 100644
index 353d283..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ChecklistItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Checklist;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Checklist} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ChecklistItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ChecklistItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Checklist.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Checklist")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Checklist) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Checklist_type") : //$NON-NLS-1$
-				getString("_UI_Checklist_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ClassifierItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ClassifierItemProvider.java
deleted file mode 100644
index 828918f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ClassifierItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Classifier;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Classifier} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ClassifierItemProvider extends TypeItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClassifierItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Classifier.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Classifier")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Classifier) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Classifier_type") : //$NON-NLS-1$
-				getString("_UI_Classifier_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CompositeRoleItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CompositeRoleItemProvider.java
deleted file mode 100644
index 6ebc77a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CompositeRoleItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.CompositeRole} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class CompositeRoleItemProvider extends RoleDescriptorItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CompositeRoleItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addAggregatedRolesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Aggregated Roles feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAggregatedRolesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_CompositeRole_aggregatedRoles_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_CompositeRole_aggregatedRoles_feature", "_UI_CompositeRole_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.COMPOSITE_ROLE__AGGREGATED_ROLES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns CompositeRole.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/CompositeRole")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((CompositeRole) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_CompositeRole_type") : //$NON-NLS-1$
-				getString("_UI_CompositeRole_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ConceptItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ConceptItemProvider.java
deleted file mode 100644
index e2294f4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ConceptItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Concept;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Concept} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConceptItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConceptItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Concept.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Concept")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Concept) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Concept_type") : //$NON-NLS-1$
-				getString("_UI_Concept_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ConstraintItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ConstraintItemProvider.java
deleted file mode 100644
index 9e84d3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ConstraintItemProvider.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Constraint;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Constraint} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConstraintItemProvider extends MethodElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConstraintItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addBodyPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Body feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBodyPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Constraint_body_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Constraint_body_feature", "_UI_Constraint_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONSTRAINT__BODY, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This returns Constraint.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Constraint")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Constraint) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Constraint_type") : //$NON-NLS-1$
-				getString("_UI_Constraint_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Constraint.class)) {
-		case UmaPackage.CONSTRAINT__BODY:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentCategoryItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentCategoryItemProvider.java
deleted file mode 100644
index 79b8a4c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentCategoryItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.ContentCategory;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ContentCategory} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ContentCategoryItemProvider extends ContentElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentCategoryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns ContentCategory.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ContentCategory")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ContentCategory) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ContentCategory_type") : //$NON-NLS-1$
-				getString("_UI_ContentCategory_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentDescriptionItemProvider.java
deleted file mode 100644
index 81a7c8f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentDescriptionItemProvider.java
+++ /dev/null
@@ -1,235 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ContentDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ContentDescriptionItemProvider extends MethodUnitItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addMainDescriptionPropertyDescriptor(object);
-			addExternalIdPropertyDescriptor(object);
-			addKeyConsiderationsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Main Description feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMainDescriptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentDescription_mainDescription_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentDescription_mainDescription_feature", "_UI_ContentDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_DESCRIPTION__MAIN_DESCRIPTION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the External Id feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addExternalIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentDescription_externalId_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentDescription_externalId_feature", "_UI_ContentDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_DESCRIPTION__EXTERNAL_ID,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Key Considerations feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addKeyConsiderationsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentDescription_keyConsiderations_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentDescription_keyConsiderations_feature", "_UI_ContentDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.CONTENT_DESCRIPTION__SECTIONS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ContentDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ContentDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ContentDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ContentDescription_type") : //$NON-NLS-1$
-				getString("_UI_ContentDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ContentDescription.class)) {
-		case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-		case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-		case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.CONTENT_DESCRIPTION__SECTIONS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_DESCRIPTION__SECTIONS,
-				UmaFactory.eINSTANCE.createSection()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_DESCRIPTION__SECTIONS,
-				UmaFactory.eINSTANCE.createStep()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentElementItemProvider.java
deleted file mode 100644
index d6e14d8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentElementItemProvider.java
+++ /dev/null
@@ -1,308 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ContentElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ContentElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ContentElementItemProvider extends DescribableElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addVariabilityTypePropertyDescriptor(object);
-			addVariabilityBasedOnElementPropertyDescriptor(object);
-			addSupportingMaterialsPropertyDescriptor(object);
-			addConceptsAndPapersPropertyDescriptor(object);
-			addChecklistsPropertyDescriptor(object);
-			addGuidelinesPropertyDescriptor(object);
-			addExamplesPropertyDescriptor(object);
-			addAssetsPropertyDescriptor(object);
-			addTermDefinitionPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Variability Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVariabilityTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_VariabilityElement_variabilityType_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_VariabilityElement_variabilityType_feature", "_UI_VariabilityElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Variability Based On Element feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVariabilityBasedOnElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_VariabilityElement_variabilityBasedOnElement_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_VariabilityElement_variabilityBasedOnElement_feature", "_UI_VariabilityElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Concepts And Papers feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addConceptsAndPapersPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentElement_conceptsAndPapers_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentElement_conceptsAndPapers_feature", "_UI_ContentElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_ELEMENT__CONCEPTS_AND_PAPERS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Checklists feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addChecklistsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentElement_checklists_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentElement_checklists_feature", "_UI_ContentElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_ELEMENT__CHECKLISTS, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Guidelines feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGuidelinesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentElement_guidelines_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentElement_guidelines_feature", "_UI_ContentElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_ELEMENT__GUIDELINES, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Examples feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addExamplesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentElement_examples_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentElement_examples_feature", "_UI_ContentElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_ELEMENT__EXAMPLES, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Assets feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAssetsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentElement_assets_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentElement_assets_feature", "_UI_ContentElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_ELEMENT__ASSETS, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Term Definition feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTermDefinitionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentElement_termDefinition_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentElement_termDefinition_feature", "_UI_ContentElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_ELEMENT__TERM_DEFINITION,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Supporting Materials feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSupportingMaterialsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ContentElement_supportingMaterials_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ContentElement_supportingMaterials_feature", "_UI_ContentElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CONTENT_ELEMENT__SUPPORTING_MATERIALS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns ContentElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ContentElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ContentElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ContentElement_type") : //$NON-NLS-1$
-				getString("_UI_ContentElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ContentElement.class)) {
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentPackageItemProvider.java
deleted file mode 100644
index 5dcb83b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ContentPackageItemProvider.java
+++ /dev/null
@@ -1,264 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ContentPackage} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ContentPackageItemProvider extends MethodPackageItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ContentPackage.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ContentPackage")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ContentPackage) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ContentPackage_type") : //$NON-NLS-1$
-				getString("_UI_ContentPackage_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ContentPackage.class)) {
-		case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createRole()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createTask()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createArtifact()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createDeliverable()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createOutcome()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createConcept()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createChecklist()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createExample()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createGuideline()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createReport()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createTemplate()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createSupportingMaterial()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createToolMentor()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createWhitepaper()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createTermDefinition()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createPractice()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createEstimationConsiderations()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createReusableAsset()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createDiscipline()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createRoleSet()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createDomain()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createWorkProductType()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createDisciplineGrouping()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createTool()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createRoleSetGrouping()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createCustomCategory()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS,
-				UmaFactory.eINSTANCE.createRoadmap()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CoreSemanticModelBridgeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CoreSemanticModelBridgeItemProvider.java
deleted file mode 100644
index bfaf672..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CoreSemanticModelBridgeItemProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.CoreSemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.CoreSemanticModelBridge} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class CoreSemanticModelBridgeItemProvider extends
-		SemanticModelBridgeItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CoreSemanticModelBridgeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addElementPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Element feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_CoreSemanticModelBridge_element_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_CoreSemanticModelBridge_element_feature", "_UI_CoreSemanticModelBridge_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns CoreSemanticModelBridge.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/CoreSemanticModelBridge")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((CoreSemanticModelBridge) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_CoreSemanticModelBridge_type") : //$NON-NLS-1$
-				getString("_UI_CoreSemanticModelBridge_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CustomCategoryItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CustomCategoryItemProvider.java
deleted file mode 100644
index c2d9487..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/CustomCategoryItemProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.CustomCategory} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class CustomCategoryItemProvider extends ContentCategoryItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CustomCategoryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addCategorizedElementsPropertyDescriptor(object);
-			addSubCategoriesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Categorized Elements feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addCategorizedElementsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_CustomCategory_categorizedElements_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_CustomCategory_categorizedElements_feature", "_UI_CustomCategory_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Sub Categories feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSubCategoriesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_CustomCategory_subCategories_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_CustomCategory_subCategories_feature", "_UI_CustomCategory_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.CUSTOM_CATEGORY__SUB_CATEGORIES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns CustomCategory.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/CustomCategory")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((CustomCategory) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_CustomCategory_type") : //$NON-NLS-1$
-				getString("_UI_CustomCategory_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliverableDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliverableDescriptionItemProvider.java
deleted file mode 100644
index fde382e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliverableDescriptionItemProvider.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.DeliverableDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DeliverableDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DeliverableDescriptionItemProvider extends
-		WorkProductDescriptionItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliverableDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addExternalDescriptionPropertyDescriptor(object);
-			addPackagingGuidancePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the External Description feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addExternalDescriptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliverableDescription_externalDescription_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliverableDescription_externalDescription_feature", "_UI_DeliverableDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Packaging Guidance feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPackagingGuidancePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliverableDescription_packagingGuidance_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliverableDescription_packagingGuidance_feature", "_UI_DeliverableDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns DeliverableDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DeliverableDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DeliverableDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DeliverableDescription_type") : //$NON-NLS-1$
-				getString("_UI_DeliverableDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DeliverableDescription.class)) {
-		case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-		case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliverableItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliverableItemProvider.java
deleted file mode 100644
index 355e6e5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliverableItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Deliverable} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DeliverableItemProvider extends WorkProductItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliverableItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addDeliveredWorkProductsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Delivered Work Products feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDeliveredWorkProductsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Deliverable_deliveredWorkProducts_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Deliverable_deliveredWorkProducts_feature", "_UI_Deliverable_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERABLE__DELIVERED_WORK_PRODUCTS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns Deliverable.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Deliverable")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Deliverable) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Deliverable_type") : //$NON-NLS-1$
-				getString("_UI_Deliverable_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliveryProcessDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliveryProcessDescriptionItemProvider.java
deleted file mode 100644
index b5b7dc0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliveryProcessDescriptionItemProvider.java
+++ /dev/null
@@ -1,259 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.DeliveryProcessDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DeliveryProcessDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DeliveryProcessDescriptionItemProvider extends
-		ProcessDescriptionItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliveryProcessDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addScalePropertyDescriptor(object);
-			addProjectCharacteristicsPropertyDescriptor(object);
-			addRiskLevelPropertyDescriptor(object);
-			addEstimatingTechniquePropertyDescriptor(object);
-			addProjectMemberExpertisePropertyDescriptor(object);
-			addTypeOfContractPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Scale feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addScalePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcessDescription_scale_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcessDescription_scale_feature", "_UI_DeliveryProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION__SCALE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Project Characteristics feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addProjectCharacteristicsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcessDescription_projectCharacteristics_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcessDescription_projectCharacteristics_feature", "_UI_DeliveryProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Risk Level feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRiskLevelPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcessDescription_riskLevel_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcessDescription_riskLevel_feature", "_UI_DeliveryProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Estimating Technique feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addEstimatingTechniquePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcessDescription_estimatingTechnique_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcessDescription_estimatingTechnique_feature", "_UI_DeliveryProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Project Member Expertise feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addProjectMemberExpertisePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcessDescription_projectMemberExpertise_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcessDescription_projectMemberExpertise_feature", "_UI_DeliveryProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Of Contract feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypeOfContractPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcessDescription_typeOfContract_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcessDescription_typeOfContract_feature", "_UI_DeliveryProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns DeliveryProcessDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DeliveryProcessDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DeliveryProcessDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DeliveryProcessDescription_type") : //$NON-NLS-1$
-				getString("_UI_DeliveryProcessDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DeliveryProcessDescription.class)) {
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliveryProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliveryProcessItemProvider.java
deleted file mode 100644
index 0313ac2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DeliveryProcessItemProvider.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DeliveryProcess} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DeliveryProcessItemProvider extends ProcessItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliveryProcessItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addEducationMaterialsPropertyDescriptor(object);
-			addCommunicationsMaterialsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Education Materials feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addEducationMaterialsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcess_educationMaterials_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcess_educationMaterials_feature", "_UI_DeliveryProcess_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS__EDUCATION_MATERIALS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Communications Materials feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addCommunicationsMaterialsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DeliveryProcess_communicationsMaterials_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DeliveryProcess_communicationsMaterials_feature", "_UI_DeliveryProcess_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns DeliveryProcess.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DeliveryProcess")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DeliveryProcess) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DeliveryProcess_type") : //$NON-NLS-1$
-				getString("_UI_DeliveryProcess_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescribableElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescribableElementItemProvider.java
deleted file mode 100644
index 2af49e7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescribableElementItemProvider.java
+++ /dev/null
@@ -1,279 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DescribableElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DescribableElementItemProvider extends MethodElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescribableElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPresentationNamePropertyDescriptor(object);
-			addShapeiconPropertyDescriptor(object);
-			addNodeiconPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Presentation Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPresentationNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DescribableElement_presentationName_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DescribableElement_presentationName_feature", "_UI_DescribableElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Shapeicon feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addShapeiconPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DescribableElement_shapeicon_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DescribableElement_shapeicon_feature", "_UI_DescribableElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DESCRIBABLE_ELEMENT__SHAPEICON,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Nodeicon feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNodeiconPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DescribableElement_nodeicon_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DescribableElement_nodeicon_feature", "_UI_DescribableElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DESCRIBABLE_ELEMENT__NODEICON,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns DescribableElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DescribableElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DescribableElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DescribableElement_type") : //$NON-NLS-1$
-				getString("_UI_DescribableElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DescribableElement.class)) {
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-		case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-		case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createContentDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createWorkProductDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createArtifactDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createDeliverableDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createRoleDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createTaskDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createGuidanceDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createPracticeDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createBreakdownElementDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createActivityDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createProcessDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createDeliveryProcessDescription()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION,
-				UmaFactory.eINSTANCE.createDescriptorDescription()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescriptorDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescriptorDescriptionItemProvider.java
deleted file mode 100644
index 2ab2244..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescriptorDescriptionItemProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DescriptorDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DescriptorDescriptionItemProvider extends
-		BreakdownElementDescriptionItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptorDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addRefinedDescriptionPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Refined Description feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRefinedDescriptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DescriptorDescription_refinedDescription_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DescriptorDescription_refinedDescription_feature", "_UI_DescriptorDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns DescriptorDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DescriptorDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DescriptorDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DescriptorDescription_type") : //$NON-NLS-1$
-				getString("_UI_DescriptorDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DescriptorDescription.class)) {
-		case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescriptorItemProvider.java
deleted file mode 100644
index 4002e5e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DescriptorItemProvider.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Descriptor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Descriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DescriptorItemProvider extends BreakdownElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIsSynchronizedWithSourcePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Synchronized With Source feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsSynchronizedWithSourcePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Descriptor_isSynchronizedWithSource_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Descriptor_isSynchronizedWithSource_feature", "_UI_Descriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns Descriptor.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Descriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Descriptor) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Descriptor_type") : //$NON-NLS-1$
-				getString("_UI_Descriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Descriptor.class)) {
-		case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramElementItemProvider.java
deleted file mode 100644
index 5e68123..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramElementItemProvider.java
+++ /dev/null
@@ -1,206 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DiagramElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DiagramElementItemProvider extends MethodElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIsVisiblePropertyDescriptor(object);
-			addReferencePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Visible feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsVisiblePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DiagramElement_isVisible_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DiagramElement_isVisible_feature", "_UI_DiagramElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIAGRAM_ELEMENT__IS_VISIBLE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReferencePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DiagramElement_reference_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DiagramElement_reference_feature", "_UI_DiagramElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIAGRAM_ELEMENT__REFERENCE, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.DIAGRAM_ELEMENT__PROPERTY);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns DiagramElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DiagramElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DiagramElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DiagramElement_type") : //$NON-NLS-1$
-				getString("_UI_DiagramElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DiagramElement.class)) {
-		case UmaPackage.DIAGRAM_ELEMENT__IS_VISIBLE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.DIAGRAM_ELEMENT__PROPERTY:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DIAGRAM_ELEMENT__PROPERTY,
-				UmaFactory.eINSTANCE.createProperty()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramItemProvider.java
deleted file mode 100644
index f05a238..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramItemProvider.java
+++ /dev/null
@@ -1,247 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Diagram;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Diagram} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DiagramItemProvider extends GraphNodeItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addZoomPropertyDescriptor(object);
-			addDiagramLinkPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Zoom feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addZoomPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Diagram_zoom_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Diagram_zoom_feature", "_UI_Diagram_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIAGRAM__ZOOM, true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Diagram Link feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDiagramLinkPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Diagram_diagramLink_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Diagram_diagramLink_feature", "_UI_Diagram_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIAGRAM__DIAGRAM_LINK, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.DIAGRAM__VIEWPOINT);
-			childrenFeatures.add(UmaPackage.Literals.DIAGRAM__NAMESPACE);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Diagram.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Diagram")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Diagram) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Diagram_type") : //$NON-NLS-1$
-				getString("_UI_Diagram_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Diagram.class)) {
-		case UmaPackage.DIAGRAM__ZOOM:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.DIAGRAM__VIEWPOINT:
-		case UmaPackage.DIAGRAM__NAMESPACE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DIAGRAM__VIEWPOINT, UmaFactory.eINSTANCE
-						.createPoint()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DIAGRAM__NAMESPACE, UmaFactory.eINSTANCE
-						.createSimpleSemanticModelElement()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DIAGRAM__NAMESPACE, UmaFactory.eINSTANCE
-						.createUMASemanticModelBridge()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DIAGRAM__NAMESPACE, UmaFactory.eINSTANCE
-						.createCoreSemanticModelBridge()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.DIAGRAM_ELEMENT__PROPERTY
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__POSITION
-				|| childFeature == UmaPackage.Literals.DIAGRAM__VIEWPOINT
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__LINK
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__ANCHORAGE
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL
-				|| childFeature == UmaPackage.Literals.DIAGRAM__NAMESPACE;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramLinkItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramLinkItemProvider.java
deleted file mode 100644
index f43190d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DiagramLinkItemProvider.java
+++ /dev/null
@@ -1,206 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DiagramLink} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DiagramLinkItemProvider extends DiagramElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramLinkItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addZoomPropertyDescriptor(object);
-			addDiagramPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Zoom feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addZoomPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DiagramLink_zoom_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DiagramLink_zoom_feature", "_UI_DiagramLink_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIAGRAM_LINK__ZOOM, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Diagram feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDiagramPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DiagramLink_diagram_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DiagramLink_diagram_feature", "_UI_DiagramLink_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIAGRAM_LINK__DIAGRAM, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.DIAGRAM_LINK__VIEWPORT);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns DiagramLink.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DiagramLink")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DiagramLink) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DiagramLink_type") : //$NON-NLS-1$
-				getString("_UI_DiagramLink_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DiagramLink.class)) {
-		case UmaPackage.DIAGRAM_LINK__ZOOM:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.DIAGRAM_LINK__VIEWPORT:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DIAGRAM_LINK__VIEWPORT,
-				UmaFactory.eINSTANCE.createPoint()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DimensionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DimensionItemProvider.java
deleted file mode 100644
index 2cd7350..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DimensionItemProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Dimension} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DimensionItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DimensionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addWidthPropertyDescriptor(object);
-			addHeightPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Width feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWidthPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Dimension_width_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Dimension_width_feature", "_UI_Dimension_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIMENSION__WIDTH, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Height feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addHeightPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Dimension_height_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Dimension_height_feature", "_UI_Dimension_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DIMENSION__HEIGHT, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This returns Dimension.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Dimension")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		Double labelValue = ((Dimension) object).getWidth();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ? getString("_UI_Dimension_type") : //$NON-NLS-1$
-				getString("_UI_Dimension_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Dimension.class)) {
-		case UmaPackage.DIMENSION__WIDTH:
-		case UmaPackage.DIMENSION__HEIGHT:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DisciplineGroupingItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DisciplineGroupingItemProvider.java
deleted file mode 100644
index 0ddf7a0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DisciplineGroupingItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.DisciplineGrouping} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DisciplineGroupingItemProvider extends ContentCategoryItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisciplineGroupingItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addDisciplinesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Disciplines feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDisciplinesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_DisciplineGrouping_disciplines_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_DisciplineGrouping_disciplines_feature", "_UI_DisciplineGrouping_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DISCIPLINE_GROUPING__DISCIPLINES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns DisciplineGrouping.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/DisciplineGrouping")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DisciplineGrouping) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_DisciplineGrouping_type") : //$NON-NLS-1$
-				getString("_UI_DisciplineGrouping_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DisciplineItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DisciplineItemProvider.java
deleted file mode 100644
index 83bd74b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DisciplineItemProvider.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Discipline;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Discipline} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DisciplineItemProvider extends ContentCategoryItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisciplineItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTasksPropertyDescriptor(object);
-			addReferenceWorkflowsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Tasks feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTasksPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Discipline_tasks_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Discipline_tasks_feature", "_UI_Discipline_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DISCIPLINE__TASKS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Reference Workflows feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReferenceWorkflowsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Discipline_referenceWorkflows_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Discipline_referenceWorkflows_feature", "_UI_Discipline_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DISCIPLINE__REFERENCE_WORKFLOWS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.DISCIPLINE__SUBDISCIPLINE);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Discipline.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Discipline")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Discipline) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Discipline_type") : //$NON-NLS-1$
-				getString("_UI_Discipline_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Discipline.class)) {
-		case UmaPackage.DISCIPLINE__SUBDISCIPLINE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DISCIPLINE__SUBDISCIPLINE,
-				UmaFactory.eINSTANCE.createDiscipline()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DomainItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DomainItemProvider.java
deleted file mode 100644
index 7e41eaa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/DomainItemProvider.java
+++ /dev/null
@@ -1,180 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Domain;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Domain} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DomainItemProvider extends ContentCategoryItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DomainItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addWorkProductsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Work Products feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWorkProductsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Domain_workProducts_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Domain_workProducts_feature", "_UI_Domain_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DOMAIN__WORK_PRODUCTS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.DOMAIN__SUBDOMAINS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Domain.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Domain")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Domain) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Domain_type") : //$NON-NLS-1$
-				getString("_UI_Domain_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Domain.class)) {
-		case UmaPackage.DOMAIN__SUBDOMAINS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.DOMAIN__SUBDOMAINS, UmaFactory.eINSTANCE
-						.createDomain()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ElementItemProvider.java
deleted file mode 100644
index 58d0c09..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ElementItemProvider.java
+++ /dev/null
@@ -1,114 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-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.ItemProviderAdapter;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Element} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ElementItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Element.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Element")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		return getString("_UI_Element_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/EllipseItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/EllipseItemProvider.java
deleted file mode 100644
index a785799..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/EllipseItemProvider.java
+++ /dev/null
@@ -1,274 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Ellipse;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Ellipse} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class EllipseItemProvider extends GraphicPrimitiveItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EllipseItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addRadiusXPropertyDescriptor(object);
-			addRadiusYPropertyDescriptor(object);
-			addRotationPropertyDescriptor(object);
-			addStartAnglePropertyDescriptor(object);
-			addEndAnglePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Radius X feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRadiusXPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Ellipse_radiusX_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Ellipse_radiusX_feature", "_UI_Ellipse_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ELLIPSE__RADIUS_X, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Radius Y feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRadiusYPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Ellipse_radiusY_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Ellipse_radiusY_feature", "_UI_Ellipse_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ELLIPSE__RADIUS_Y, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Rotation feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRotationPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Ellipse_rotation_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Ellipse_rotation_feature", "_UI_Ellipse_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ELLIPSE__ROTATION, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Start Angle feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addStartAnglePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Ellipse_startAngle_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Ellipse_startAngle_feature", "_UI_Ellipse_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ELLIPSE__START_ANGLE, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the End Angle feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addEndAnglePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Ellipse_endAngle_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Ellipse_endAngle_feature", "_UI_Ellipse_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ELLIPSE__END_ANGLE, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.ELLIPSE__CENTER);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Ellipse.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Ellipse")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Ellipse) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Ellipse_type") : //$NON-NLS-1$
-				getString("_UI_Ellipse_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Ellipse.class)) {
-		case UmaPackage.ELLIPSE__RADIUS_X:
-		case UmaPackage.ELLIPSE__RADIUS_Y:
-		case UmaPackage.ELLIPSE__ROTATION:
-		case UmaPackage.ELLIPSE__START_ANGLE:
-		case UmaPackage.ELLIPSE__END_ANGLE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.ELLIPSE__CENTER:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.ELLIPSE__CENTER, UmaFactory.eINSTANCE
-						.createPoint()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/EstimationConsiderationsItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/EstimationConsiderationsItemProvider.java
deleted file mode 100644
index 9aaa8ed..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/EstimationConsiderationsItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.EstimationConsiderations;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.EstimationConsiderations} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class EstimationConsiderationsItemProvider extends GuidanceItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EstimationConsiderationsItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns EstimationConsiderations.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/EstimationConsiderations")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((EstimationConsiderations) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_EstimationConsiderations_type") : //$NON-NLS-1$
-				getString("_UI_EstimationConsiderations_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ExampleItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ExampleItemProvider.java
deleted file mode 100644
index 7e6291d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ExampleItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Example;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Example} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ExampleItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExampleItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Example.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Example")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Example) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Example_type") : //$NON-NLS-1$
-				getString("_UI_Example_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphConnectorItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphConnectorItemProvider.java
deleted file mode 100644
index fc9e10f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphConnectorItemProvider.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.GraphConnector} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GraphConnectorItemProvider extends GraphElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphConnectorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addGraphEdgePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Graph Edge feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGraphEdgePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_GraphConnector_graphEdge_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_GraphConnector_graphEdge_feature", "_UI_GraphConnector_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.GRAPH_CONNECTOR__GRAPH_EDGE, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This returns GraphConnector.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/GraphConnector")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((GraphConnector) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_GraphConnector_type") : //$NON-NLS-1$
-				getString("_UI_GraphConnector_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.DIAGRAM_ELEMENT__PROPERTY
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__LINK
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__ANCHORAGE
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphEdgeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphEdgeItemProvider.java
deleted file mode 100644
index c7a9fd1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphEdgeItemProvider.java
+++ /dev/null
@@ -1,207 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.GraphEdge} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GraphEdgeItemProvider extends GraphElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphEdgeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addAnchorPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Anchor feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAnchorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_GraphEdge_anchor_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_GraphEdge_anchor_feature", "_UI_GraphEdge_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.GRAPH_EDGE__ANCHOR, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.GRAPH_EDGE__WAYPOINTS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns GraphEdge.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/GraphEdge")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((GraphEdge) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_GraphEdge_type") : //$NON-NLS-1$
-				getString("_UI_GraphEdge_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(GraphEdge.class)) {
-		case UmaPackage.GRAPH_EDGE__WAYPOINTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_EDGE__WAYPOINTS, UmaFactory.eINSTANCE
-						.createPoint()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.DIAGRAM_ELEMENT__PROPERTY
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__POSITION
-				|| childFeature == UmaPackage.Literals.GRAPH_EDGE__WAYPOINTS
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__LINK
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__ANCHORAGE
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphElementItemProvider.java
deleted file mode 100644
index 6537098..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphElementItemProvider.java
+++ /dev/null
@@ -1,269 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.GraphElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.GraphElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GraphElementItemProvider extends DiagramElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.GRAPH_ELEMENT__POSITION);
-			childrenFeatures.add(UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED);
-			childrenFeatures.add(UmaPackage.Literals.GRAPH_ELEMENT__LINK);
-			childrenFeatures.add(UmaPackage.Literals.GRAPH_ELEMENT__ANCHORAGE);
-			childrenFeatures
-					.add(UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns GraphElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/GraphElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((GraphElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_GraphElement_type") : //$NON-NLS-1$
-				getString("_UI_GraphElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(GraphElement.class)) {
-		case UmaPackage.GRAPH_ELEMENT__POSITION:
-		case UmaPackage.GRAPH_ELEMENT__CONTAINED:
-		case UmaPackage.GRAPH_ELEMENT__LINK:
-		case UmaPackage.GRAPH_ELEMENT__ANCHORAGE:
-		case UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__POSITION,
-				UmaFactory.eINSTANCE.createPoint()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createDiagramLink()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createGraphConnector()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createReference()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createProperty()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createGraphEdge()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createGraphNode()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createDiagram()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createSimpleSemanticModelElement()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createUMASemanticModelBridge()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createCoreSemanticModelBridge()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createTextElement()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createImage()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createPolyline()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED,
-				UmaFactory.eINSTANCE.createEllipse()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__LINK, UmaFactory.eINSTANCE
-						.createDiagramLink()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__ANCHORAGE,
-				UmaFactory.eINSTANCE.createGraphConnector()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL,
-				UmaFactory.eINSTANCE.createSimpleSemanticModelElement()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL,
-				UmaFactory.eINSTANCE.createUMASemanticModelBridge()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL,
-				UmaFactory.eINSTANCE.createCoreSemanticModelBridge()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.DIAGRAM_ELEMENT__PROPERTY
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__LINK
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__ANCHORAGE
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphNodeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphNodeItemProvider.java
deleted file mode 100644
index b8a93a2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphNodeItemProvider.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.GraphNode;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.GraphNode} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GraphNodeItemProvider extends GraphElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphNodeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.GRAPH_NODE__SIZE);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns GraphNode.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/GraphNode")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((GraphNode) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_GraphNode_type") : //$NON-NLS-1$
-				getString("_UI_GraphNode_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(GraphNode.class)) {
-		case UmaPackage.GRAPH_NODE__SIZE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.GRAPH_NODE__SIZE, UmaFactory.eINSTANCE
-						.createDimension()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.DIAGRAM_ELEMENT__PROPERTY
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__CONTAINED
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__LINK
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__ANCHORAGE
-				|| childFeature == UmaPackage.Literals.GRAPH_ELEMENT__SEMANTIC_MODEL;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphicPrimitiveItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphicPrimitiveItemProvider.java
deleted file mode 100644
index 6111386..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GraphicPrimitiveItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.GraphicPrimitive;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.GraphicPrimitive} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GraphicPrimitiveItemProvider extends LeafElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphicPrimitiveItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns GraphicPrimitive.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/GraphicPrimitive")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((GraphicPrimitive) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_GraphicPrimitive_type") : //$NON-NLS-1$
-				getString("_UI_GraphicPrimitive_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidanceDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidanceDescriptionItemProvider.java
deleted file mode 100644
index 47fac67..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidanceDescriptionItemProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.GuidanceDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GuidanceDescriptionItemProvider extends
-		ContentDescriptionItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GuidanceDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addAttachmentsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Attachments feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAttachmentsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_GuidanceDescription_attachments_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_GuidanceDescription_attachments_feature", "_UI_GuidanceDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.GUIDANCE_DESCRIPTION__ATTACHMENTS,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns GuidanceDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/GuidanceDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((GuidanceDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_GuidanceDescription_type") : //$NON-NLS-1$
-				getString("_UI_GuidanceDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(GuidanceDescription.class)) {
-		case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidanceItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidanceItemProvider.java
deleted file mode 100644
index 81ab75f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidanceItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Guidance;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Guidance} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GuidanceItemProvider extends ContentElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GuidanceItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Guidance.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Guidance")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Guidance) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Guidance_type") : //$NON-NLS-1$
-				getString("_UI_Guidance_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidelineItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidelineItemProvider.java
deleted file mode 100644
index a4df982..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/GuidelineItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Guideline;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Guideline} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class GuidelineItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GuidelineItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Guideline.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Guideline")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Guideline) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Guideline_type") : //$NON-NLS-1$
-				getString("_UI_Guideline_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ImageItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ImageItemProvider.java
deleted file mode 100644
index 45f333a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ImageItemProvider.java
+++ /dev/null
@@ -1,169 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Image;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Image} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ImageItemProvider extends LeafElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ImageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addUriPropertyDescriptor(object);
-			addMimeTypePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Uri feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addUriPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Image_uri_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Image_uri_feature", "_UI_Image_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.IMAGE__URI, true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Mime Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMimeTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Image_mimeType_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Image_mimeType_feature", "_UI_Image_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.IMAGE__MIME_TYPE, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This returns Image.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Image")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Image) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Image_type") : //$NON-NLS-1$
-				getString("_UI_Image_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Image.class)) {
-		case UmaPackage.IMAGE__URI:
-		case UmaPackage.IMAGE__MIME_TYPE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/IterationItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/IterationItemProvider.java
deleted file mode 100644
index 718c9b8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/IterationItemProvider.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Iteration} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class IterationItemProvider extends ActivityItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IterationItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Iteration.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Iteration")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Iteration) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Iteration_type") : //$NON-NLS-1$
-				getString("_UI_Iteration_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/LeafElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/LeafElementItemProvider.java
deleted file mode 100644
index a75998a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/LeafElementItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.LeafElement;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.LeafElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class LeafElementItemProvider extends DiagramElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LeafElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns LeafElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/LeafElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((LeafElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_LeafElement_type") : //$NON-NLS-1$
-				getString("_UI_LeafElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodConfigurationItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodConfigurationItemProvider.java
deleted file mode 100644
index eebac04..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodConfigurationItemProvider.java
+++ /dev/null
@@ -1,258 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.MethodConfiguration} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MethodConfigurationItemProvider extends MethodUnitItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodConfigurationItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addMethodPluginSelectionPropertyDescriptor(object);
-			addMethodPackageSelectionPropertyDescriptor(object);
-			addProcessViewsPropertyDescriptor(object);
-			addDefaultViewPropertyDescriptor(object);
-			addBaseConfigurationsPropertyDescriptor(object);
-			addSubtractedCategoryPropertyDescriptor(object);
-			addAddedCategoryPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Method Plugin Selection feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMethodPluginSelectionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodConfiguration_methodPluginSelection_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodConfiguration_methodPluginSelection_feature", "_UI_MethodConfiguration_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Method Package Selection feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMethodPackageSelectionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodConfiguration_methodPackageSelection_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodConfiguration_methodPackageSelection_feature", "_UI_MethodConfiguration_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Process Views feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addProcessViewsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodConfiguration_processViews_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodConfiguration_processViews_feature", "_UI_MethodConfiguration_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_CONFIGURATION__PROCESS_VIEWS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Default View feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDefaultViewPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodConfiguration_defaultView_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodConfiguration_defaultView_feature", "_UI_MethodConfiguration_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_CONFIGURATION__DEFAULT_VIEW,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Base Configurations feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBaseConfigurationsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodConfiguration_baseConfigurations_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodConfiguration_baseConfigurations_feature", "_UI_MethodConfiguration_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_CONFIGURATION__BASE_CONFIGURATIONS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Subtracted Category feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSubtractedCategoryPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodConfiguration_subtractedCategory_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodConfiguration_subtractedCategory_feature", "_UI_MethodConfiguration_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Added Category feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAddedCategoryPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodConfiguration_addedCategory_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodConfiguration_addedCategory_feature", "_UI_MethodConfiguration_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_CONFIGURATION__ADDED_CATEGORY,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns MethodConfiguration.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/MethodConfiguration")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MethodConfiguration) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_MethodConfiguration_type") : //$NON-NLS-1$
-				getString("_UI_MethodConfiguration_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodElementItemProvider.java
deleted file mode 100644
index 4da8fb4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodElementItemProvider.java
+++ /dev/null
@@ -1,280 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.provider;
-
-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;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.CopyCommand.Helper;
-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.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.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.edit.command.MethodElementCreateCopyCommand;
-import org.eclipse.epf.uma.edit.command.MethodElementInitializeCopyCommand;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.MethodElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MethodElementItemProvider extends PackageableElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addGuidPropertyDescriptor(object);
-			addBriefDescriptionPropertyDescriptor(object);
-			addSuppressedPropertyDescriptor(object);
-			addOrderingGuidePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Guid feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGuidPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodElement_guid_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodElement_guid_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_ELEMENT__GUID, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Brief Description feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBriefDescriptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodElement_briefDescription_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodElement_briefDescription_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_ELEMENT__BRIEF_DESCRIPTION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Suppressed feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSuppressedPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodElement_suppressed_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodElement_suppressed_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_ELEMENT__SUPPRESSED, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Ordering Guide feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOrderingGuidePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodElement_orderingGuide_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodElement_orderingGuide_feature", "_UI_MethodElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_ELEMENT__ORDERING_GUIDE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES);
-			childrenFeatures
-					.add(UmaPackage.Literals.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns MethodElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/MethodElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MethodElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_MethodElement_type") : //$NON-NLS-1$
-				getString("_UI_MethodElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodElement.class)) {
-		case UmaPackage.METHOD_ELEMENT__GUID:
-		case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-		case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-		case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.METHOD_ELEMENT__OWNED_RULES:
-		case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES,
-				UmaFactory.eINSTANCE.createConstraint()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY,
-				UmaFactory.eINSTANCE.createMethodElementProperty()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-	//-------------------//
-	// Start custom code //
-	//-------------------//
-
-	protected Command createInitializeCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementInitializeCopyCommand(domain, owner, helper);
-	}
-
-	protected Command createCreateCopyCommand(EditingDomain domain,
-			EObject owner, Helper helper) {
-		return new MethodElementCreateCopyCommand(domain, owner, helper);
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodElementPropertyItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodElementPropertyItemProvider.java
deleted file mode 100644
index 5a77323..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodElementPropertyItemProvider.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-
-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.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.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.MethodElementProperty} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MethodElementPropertyItemProvider extends
-		PackageableElementItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElementPropertyItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addValuePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Value feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addValuePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodElementProperty_value_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodElementProperty_value_feature", "_UI_MethodElementProperty_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_ELEMENT_PROPERTY__VALUE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns MethodElementProperty.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/MethodElementProperty")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MethodElementProperty) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_MethodElementProperty_type") : //$NON-NLS-1$
-				getString("_UI_MethodElementProperty_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodElementProperty.class)) {
-		case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodLibraryItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodLibraryItemProvider.java
deleted file mode 100644
index abb8c75..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodLibraryItemProvider.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.MethodLibrary} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MethodLibraryItemProvider extends MethodUnitItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodLibraryItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS);
-			childrenFeatures
-					.add(UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns MethodLibrary.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/MethodLibrary")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MethodLibrary) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_MethodLibrary_type") : //$NON-NLS-1$
-				getString("_UI_MethodLibrary_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodLibrary.class)) {
-		case UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS:
-		case UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS,
-				UmaFactory.eINSTANCE.createMethodPlugin()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS,
-				UmaFactory.eINSTANCE.createMethodConfiguration()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS,
-				UmaFactory.eINSTANCE.createProcessFamily()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodPackageItemProvider.java
deleted file mode 100644
index a16dc3d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodPackageItemProvider.java
+++ /dev/null
@@ -1,215 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.MethodPackage} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MethodPackageItemProvider extends MethodElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addGlobalPropertyDescriptor(object);
-			addReusedPackagesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Global feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGlobalPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodPackage_global_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodPackage_global_feature", "_UI_MethodPackage_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_PACKAGE__GLOBAL, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Reused Packages feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReusedPackagesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodPackage_reusedPackages_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodPackage_reusedPackages_feature", "_UI_MethodPackage_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_PACKAGE__REUSED_PACKAGES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns MethodPackage.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/MethodPackage")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MethodPackage) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_MethodPackage_type") : //$NON-NLS-1$
-				getString("_UI_MethodPackage_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodPackage.class)) {
-		case UmaPackage.METHOD_PACKAGE__GLOBAL:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.METHOD_PACKAGE__CHILD_PACKAGES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES,
-				UmaFactory.eINSTANCE.createContentPackage()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES,
-				UmaFactory.eINSTANCE.createProcessPackage()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES,
-				UmaFactory.eINSTANCE.createProcessComponent()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodPluginItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodPluginItemProvider.java
deleted file mode 100644
index 101fdce..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodPluginItemProvider.java
+++ /dev/null
@@ -1,215 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.MethodPlugin} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MethodPluginItemProvider extends MethodUnitItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodPluginItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addUserChangeablePropertyDescriptor(object);
-			addBasesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the User Changeable feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addUserChangeablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodPlugin_userChangeable_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodPlugin_userChangeable_feature", "_UI_MethodPlugin_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_PLUGIN__USER_CHANGEABLE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Bases feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBasesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodPlugin_bases_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodPlugin_bases_feature", "_UI_MethodPlugin_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_PLUGIN__BASES, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.METHOD_PLUGIN__METHOD_PACKAGES);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns MethodPlugin.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/MethodPlugin")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MethodPlugin) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_MethodPlugin_type") : //$NON-NLS-1$
-				getString("_UI_MethodPlugin_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodPlugin.class)) {
-		case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_PLUGIN__METHOD_PACKAGES,
-				UmaFactory.eINSTANCE.createContentPackage()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_PLUGIN__METHOD_PACKAGES,
-				UmaFactory.eINSTANCE.createProcessPackage()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.METHOD_PLUGIN__METHOD_PACKAGES,
-				UmaFactory.eINSTANCE.createProcessComponent()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodUnitItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodUnitItemProvider.java
deleted file mode 100644
index 19057f4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MethodUnitItemProvider.java
+++ /dev/null
@@ -1,234 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.MethodUnit} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MethodUnitItemProvider extends MethodElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodUnitItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addAuthorsPropertyDescriptor(object);
-			addChangeDatePropertyDescriptor(object);
-			addChangeDescriptionPropertyDescriptor(object);
-			addVersionPropertyDescriptor(object);
-			addCopyrightStatementPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Authors feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAuthorsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_authors_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_authors_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__AUTHORS, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Change Date feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addChangeDatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_changeDate_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_changeDate_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__CHANGE_DATE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Change Description feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addChangeDescriptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_changeDescription_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_changeDescription_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__CHANGE_DESCRIPTION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Version feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVersionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_version_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_version_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__VERSION, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Copyright Statement feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addCopyrightStatementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_copyrightStatement_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_copyrightStatement_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__COPYRIGHT_STATEMENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns MethodUnit.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/MethodUnit")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MethodUnit) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_MethodUnit_type") : //$NON-NLS-1$
-				getString("_UI_MethodUnit_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MethodUnit.class)) {
-		case UmaPackage.METHOD_UNIT__AUTHORS:
-		case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-		case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-		case UmaPackage.METHOD_UNIT__VERSION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MilestoneItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MilestoneItemProvider.java
deleted file mode 100644
index 67282e7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/MilestoneItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Milestone;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Milestone} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class MilestoneItemProvider extends WorkBreakdownElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MilestoneItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Milestone.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Milestone")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Milestone) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Milestone_type") : //$NON-NLS-1$
-				getString("_UI_Milestone_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/NamedElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/NamedElementItemProvider.java
deleted file mode 100644
index ed5c08d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/NamedElementItemProvider.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.NamedElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.NamedElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NamedElementItemProvider extends ElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NamedElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_NamedElement_name_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_NamedElement_name_feature", "_UI_NamedElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.NAMED_ELEMENT__NAME, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This returns NamedElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/NamedElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NamedElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_NamedElement_type") : //$NON-NLS-1$
-				getString("_UI_NamedElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NamedElement.class)) {
-		case UmaPackage.NAMED_ELEMENT__NAME:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/NamespaceItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/NamespaceItemProvider.java
deleted file mode 100644
index 735e889..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/NamespaceItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Namespace;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Namespace} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NamespaceItemProvider extends NamedElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NamespaceItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Namespace.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Namespace")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Namespace) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Namespace_type") : //$NON-NLS-1$
-				getString("_UI_Namespace_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/OutcomeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/OutcomeItemProvider.java
deleted file mode 100644
index 7074162..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/OutcomeItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Outcome;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Outcome} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class OutcomeItemProvider extends WorkProductItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OutcomeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Outcome.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Outcome")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Outcome) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Outcome_type") : //$NON-NLS-1$
-				getString("_UI_Outcome_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PackageItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PackageItemProvider.java
deleted file mode 100644
index 2bd9bdf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PackageItemProvider.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-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.epf.uma.Package} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PackageItemProvider extends NamespaceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Package.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Package")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((org.eclipse.epf.uma.Package) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Package_type") : //$NON-NLS-1$
-				getString("_UI_Package_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PackageableElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PackageableElementItemProvider.java
deleted file mode 100644
index ba7573e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PackageableElementItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.PackageableElement;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.PackageableElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PackageableElementItemProvider extends NamedElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PackageableElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns PackageableElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/PackageableElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PackageableElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_PackageableElement_type") : //$NON-NLS-1$
-				getString("_UI_PackageableElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PhaseItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PhaseItemProvider.java
deleted file mode 100644
index 4469752..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PhaseItemProvider.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Phase} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PhaseItemProvider extends ActivityItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PhaseItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Phase.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Phase")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Phase) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Phase_type") : //$NON-NLS-1$
-				getString("_UI_Phase_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PlanningDataItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PlanningDataItemProvider.java
deleted file mode 100644
index 946c590..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PlanningDataItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.PlanningData;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.PlanningData} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PlanningDataItemProvider extends ProcessElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlanningDataItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addStartDatePropertyDescriptor(object);
-			addFinishDatePropertyDescriptor(object);
-			addRankPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Start Date feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addStartDatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PlanningData_startDate_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PlanningData_startDate_feature", "_UI_PlanningData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PLANNING_DATA__START_DATE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Finish Date feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addFinishDatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PlanningData_finishDate_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PlanningData_finishDate_feature", "_UI_PlanningData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PLANNING_DATA__FINISH_DATE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Rank feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRankPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PlanningData_rank_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PlanningData_rank_feature", "_UI_PlanningData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PLANNING_DATA__RANK, true, false,
-						false, ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This returns PlanningData.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/PlanningData")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PlanningData) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_PlanningData_type") : //$NON-NLS-1$
-				getString("_UI_PlanningData_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PlanningData.class)) {
-		case UmaPackage.PLANNING_DATA__START_DATE:
-		case UmaPackage.PLANNING_DATA__FINISH_DATE:
-		case UmaPackage.PLANNING_DATA__RANK:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PointItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PointItemProvider.java
deleted file mode 100644
index 06d5372..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PointItemProvider.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Point} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PointItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PointItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addXPropertyDescriptor(object);
-			addYPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the X feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addXPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Point_x_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Point_x_feature", "_UI_Point_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.POINT__X, true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Y feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addYPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Point_y_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Point_y_feature", "_UI_Point_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.POINT__Y, true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns Point.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Point")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		Double labelValue = ((Point) object).getX();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ? getString("_UI_Point_type") : //$NON-NLS-1$
-				getString("_UI_Point_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Point.class)) {
-		case UmaPackage.POINT__X:
-		case UmaPackage.POINT__Y:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PolylineItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PolylineItemProvider.java
deleted file mode 100644
index 4cb1a77..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PolylineItemProvider.java
+++ /dev/null
@@ -1,186 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Polyline;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Polyline} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PolylineItemProvider extends GraphicPrimitiveItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PolylineItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addClosedPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Closed feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addClosedPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Polyline_closed_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Polyline_closed_feature", "_UI_Polyline_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.POLYLINE__CLOSED, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.POLYLINE__WAYPOINTS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Polyline.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Polyline")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Polyline) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Polyline_type") : //$NON-NLS-1$
-				getString("_UI_Polyline_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Polyline.class)) {
-		case UmaPackage.POLYLINE__CLOSED:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.POLYLINE__WAYPOINTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.POLYLINE__WAYPOINTS, UmaFactory.eINSTANCE
-						.createPoint()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PracticeDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PracticeDescriptionItemProvider.java
deleted file mode 100644
index e667dc0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PracticeDescriptionItemProvider.java
+++ /dev/null
@@ -1,259 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.PracticeDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.PracticeDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PracticeDescriptionItemProvider extends
-		ContentDescriptionItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PracticeDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addAdditionalInfoPropertyDescriptor(object);
-			addProblemPropertyDescriptor(object);
-			addBackgroundPropertyDescriptor(object);
-			addGoalsPropertyDescriptor(object);
-			addApplicationPropertyDescriptor(object);
-			addLevelsOfAdoptionPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Additional Info feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAdditionalInfoPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PracticeDescription_additionalInfo_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PracticeDescription_additionalInfo_feature", "_UI_PracticeDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE_DESCRIPTION__ADDITIONAL_INFO,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Problem feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addProblemPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PracticeDescription_problem_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PracticeDescription_problem_feature", "_UI_PracticeDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE_DESCRIPTION__PROBLEM,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Background feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBackgroundPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PracticeDescription_background_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PracticeDescription_background_feature", "_UI_PracticeDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE_DESCRIPTION__BACKGROUND,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Goals feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addGoalsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PracticeDescription_goals_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PracticeDescription_goals_feature", "_UI_PracticeDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE_DESCRIPTION__GOALS, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Application feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addApplicationPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PracticeDescription_application_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PracticeDescription_application_feature", "_UI_PracticeDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE_DESCRIPTION__APPLICATION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Levels Of Adoption feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLevelsOfAdoptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_PracticeDescription_levelsOfAdoption_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_PracticeDescription_levelsOfAdoption_feature", "_UI_PracticeDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns PracticeDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/PracticeDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PracticeDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_PracticeDescription_type") : //$NON-NLS-1$
-				getString("_UI_PracticeDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PracticeDescription.class)) {
-		case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-		case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-		case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-		case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-		case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-		case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PracticeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PracticeItemProvider.java
deleted file mode 100644
index 9e91d2f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PracticeItemProvider.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Practice;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Practice} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PracticeItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PracticeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addContentReferencesPropertyDescriptor(object);
-			addActivityReferencesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Content References feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addContentReferencesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Practice_contentReferences_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Practice_contentReferences_feature", "_UI_Practice_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE__CONTENT_REFERENCES, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Activity References feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addActivityReferencesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Practice_activityReferences_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Practice_activityReferences_feature", "_UI_Practice_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PRACTICE__ACTIVITY_REFERENCES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.PRACTICE__SUB_PRACTICES);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Practice.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Practice")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Practice) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Practice_type") : //$NON-NLS-1$
-				getString("_UI_Practice_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Practice.class)) {
-		case UmaPackage.PRACTICE__SUB_PRACTICES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PRACTICE__SUB_PRACTICES,
-				UmaFactory.eINSTANCE.createPractice()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentDescriptorItemProvider.java
deleted file mode 100644
index 4b87dc0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentDescriptorItemProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.ProcessComponentDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessComponentDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessComponentDescriptorItemProvider extends
-		DescriptorItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponentDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addProcessComponentPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Process Component feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addProcessComponentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ProcessComponentDescriptor_ProcessComponent_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ProcessComponentDescriptor_ProcessComponent_feature", "_UI_ProcessComponentDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns ProcessComponentDescriptor.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessComponentDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessComponentDescriptor) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessComponentDescriptor_type") : //$NON-NLS-1$
-				getString("_UI_ProcessComponentDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentInterfaceItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentInterfaceItemProvider.java
deleted file mode 100644
index 3d2e740..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentInterfaceItemProvider.java
+++ /dev/null
@@ -1,169 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ProcessComponentInterface;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessComponentInterface} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessComponentInterfaceItemProvider extends
-		BreakdownElementItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponentInterfaceItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS);
-			childrenFeatures
-					.add(UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ProcessComponentInterface.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessComponentInterface")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessComponentInterface) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessComponentInterface_type") : //$NON-NLS-1$
-				getString("_UI_ProcessComponentInterface_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ProcessComponentInterface.class)) {
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS:
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors
-				.add(createChildParameter(
-						UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS,
-						UmaFactory.eINSTANCE.createTaskDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO,
-				UmaFactory.eINSTANCE.createWorkProductDescriptor()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentItemProvider.java
deleted file mode 100644
index dc8155b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessComponentItemProvider.java
+++ /dev/null
@@ -1,323 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessComponent} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessComponentItemProvider extends ProcessPackageItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponentItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addAuthorsPropertyDescriptor(object);
-			addChangeDatePropertyDescriptor(object);
-			addChangeDescriptionPropertyDescriptor(object);
-			addVersionPropertyDescriptor(object);
-			addCopyrightStatementPropertyDescriptor(object);
-			addInterfacesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Authors feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAuthorsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_authors_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_authors_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__AUTHORS, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Change Date feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addChangeDatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_changeDate_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_changeDate_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__CHANGE_DATE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Change Description feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addChangeDescriptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_changeDescription_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_changeDescription_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__CHANGE_DESCRIPTION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Version feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVersionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_version_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_version_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__VERSION, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Copyright Statement feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addCopyrightStatementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_MethodUnit_copyrightStatement_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_MethodUnit_copyrightStatement_feature", "_UI_MethodUnit_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.METHOD_UNIT__COPYRIGHT_STATEMENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Interfaces feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addInterfacesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ProcessComponent_interfaces_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ProcessComponent_interfaces_feature", "_UI_ProcessComponent_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS_COMPONENT__INTERFACES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.PROCESS_COMPONENT__PROCESS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ProcessComponent.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessComponent")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessComponent) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessComponent_type") : //$NON-NLS-1$
-				getString("_UI_ProcessComponent_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ProcessComponent.class)) {
-		case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-		case UmaPackage.PROCESS_COMPONENT__VERSION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.PROCESS_COMPONENT__PROCESS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_COMPONENT__PROCESS,
-				UmaFactory.eINSTANCE.createDeliveryProcess()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_COMPONENT__PROCESS,
-				UmaFactory.eINSTANCE.createCapabilityPattern()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_COMPONENT__PROCESS,
-				UmaFactory.eINSTANCE.createProcessPlanningTemplate()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS
-				|| childFeature == UmaPackage.Literals.PROCESS_COMPONENT__PROCESS;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessDescriptionItemProvider.java
deleted file mode 100644
index 14c614d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessDescriptionItemProvider.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ProcessDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessDescriptionItemProvider extends
-		ActivityDescriptionItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addScopePropertyDescriptor(object);
-			addUsageNotesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Scope feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addScopePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ProcessDescription_scope_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ProcessDescription_scope_feature", "_UI_ProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS_DESCRIPTION__SCOPE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Usage Notes feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addUsageNotesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ProcessDescription_usageNotes_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ProcessDescription_usageNotes_feature", "_UI_ProcessDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS_DESCRIPTION__USAGE_NOTES,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns ProcessDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessDescription_type") : //$NON-NLS-1$
-				getString("_UI_ProcessDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ProcessDescription.class)) {
-		case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-		case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessElementItemProvider.java
deleted file mode 100644
index f28ff8d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessElementItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.ProcessElement;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessElementItemProvider extends DescribableElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns ProcessElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessElement_type") : //$NON-NLS-1$
-				getString("_UI_ProcessElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessFamilyItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessFamilyItemProvider.java
deleted file mode 100644
index 0a038d3..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessFamilyItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessFamily} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessFamilyItemProvider extends MethodConfigurationItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessFamilyItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addDeliveryProcessesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Delivery Processes feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDeliveryProcessesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ProcessFamily_deliveryProcesses_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ProcessFamily_deliveryProcesses_feature", "_UI_ProcessFamily_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS_FAMILY__DELIVERY_PROCESSES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns ProcessFamily.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessFamily")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessFamily) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessFamily_type") : //$NON-NLS-1$
-				getString("_UI_ProcessFamily_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessItemProvider.java
deleted file mode 100644
index c956fe6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessItemProvider.java
+++ /dev/null
@@ -1,200 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Process} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessItemProvider extends ActivityItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIncludesPatternsPropertyDescriptor(object);
-			addDefaultContextPropertyDescriptor(object);
-			addValidContextPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Includes Patterns feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIncludesPatternsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Process_includesPatterns_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Process_includesPatterns_feature", "_UI_Process_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS__INCLUDES_PATTERNS, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Default Context feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDefaultContextPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Process_defaultContext_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Process_defaultContext_feature", "_UI_Process_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS__DEFAULT_CONTEXT, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Valid Context feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addValidContextPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Process_validContext_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Process_validContext_feature", "_UI_Process_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS__VALID_CONTEXT, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This returns Process.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Process")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((org.eclipse.epf.uma.Process) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Process_type") : //$NON-NLS-1$
-				getString("_UI_Process_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessPackageItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessPackageItemProvider.java
deleted file mode 100644
index dc307ff..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessPackageItemProvider.java
+++ /dev/null
@@ -1,226 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessPackage} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessPackageItemProvider extends MethodPackageItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessPackageItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS);
-			childrenFeatures.add(UmaPackage.Literals.PROCESS_PACKAGE__DIAGRAMS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ProcessPackage.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessPackage")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessPackage) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessPackage_type") : //$NON-NLS-1$
-				getString("_UI_ProcessPackage_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ProcessPackage.class)) {
-		case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENTS:
-		case UmaPackage.PROCESS_PACKAGE__DIAGRAMS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createActivity()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createMilestone()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createIteration()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createPhase()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createTeamProfile()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createRoleDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createWorkOrder()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createPlanningData()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createWorkProductDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createTaskDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createCompositeRole()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createDeliveryProcess()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createCapabilityPattern()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createProcessPlanningTemplate()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createProcessComponentInterface()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENTS,
-				UmaFactory.eINSTANCE.createProcessComponentDescriptor()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.PROCESS_PACKAGE__DIAGRAMS,
-				UmaFactory.eINSTANCE.createDiagram()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessPlanningTemplateItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessPlanningTemplateItemProvider.java
deleted file mode 100644
index 0b0145c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ProcessPlanningTemplateItemProvider.java
+++ /dev/null
@@ -1,161 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ProcessPlanningTemplate} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ProcessPlanningTemplateItemProvider extends ProcessItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessPlanningTemplateItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addBasedOnProcessesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Based On Processes feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addBasedOnProcessesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_ProcessPlanningTemplate_basedOnProcesses_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_ProcessPlanningTemplate_basedOnProcesses_feature", "_UI_ProcessPlanningTemplate_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns ProcessPlanningTemplate.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ProcessPlanningTemplate")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ProcessPlanningTemplate) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ProcessPlanningTemplate_type") : //$NON-NLS-1$
-				getString("_UI_ProcessPlanningTemplate_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PropertyItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PropertyItemProvider.java
deleted file mode 100644
index fa0aa43..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PropertyItemProvider.java
+++ /dev/null
@@ -1,169 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Property;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Property} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PropertyItemProvider extends DiagramElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addKeyPropertyDescriptor(object);
-			addValuePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Key feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addKeyPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Property_key_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Property_key_feature", "_UI_Property_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROPERTY__KEY, true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Value feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addValuePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Property_value_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Property_value_feature", "_UI_Property_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.PROPERTY__VALUE, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This returns Property.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Property")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Property) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Property_type") : //$NON-NLS-1$
-				getString("_UI_Property_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Property.class)) {
-		case UmaPackage.PROPERTY__KEY:
-		case UmaPackage.PROPERTY__VALUE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PseudoStateItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PseudoStateItemProvider.java
deleted file mode 100644
index 7e04efc..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/PseudoStateItemProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PseudoStateItemProvider.java,v 1.1 2008/01/15 08:51:54 jtham Exp $
- */
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-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.epf.uma.PseudoState} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PseudoStateItemProvider extends VertexItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PseudoStateItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns PseudoState.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/PseudoState")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		return getString("_UI_PseudoState_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReferenceItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReferenceItemProvider.java
deleted file mode 100644
index 290681b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReferenceItemProvider.java
+++ /dev/null
@@ -1,168 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Reference;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Reference} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ReferenceItemProvider extends DiagramElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferenceItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIsIndividualRepresentationPropertyDescriptor(object);
-			addReferencedPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Individual Representation feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsIndividualRepresentationPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Reference_isIndividualRepresentation_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Reference_isIndividualRepresentation_feature", "_UI_Reference_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.REFERENCE__IS_INDIVIDUAL_REPRESENTATION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Referenced feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReferencedPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Reference_referenced_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Reference_referenced_feature", "_UI_Reference_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.REFERENCE__REFERENCED, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This returns Reference.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Reference")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Reference) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Reference_type") : //$NON-NLS-1$
-				getString("_UI_Reference_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Reference.class)) {
-		case UmaPackage.REFERENCE__IS_INDIVIDUAL_REPRESENTATION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RegionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RegionItemProvider.java
deleted file mode 100644
index 3a151ee..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RegionItemProvider.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RegionItemProvider.java,v 1.1 2008/01/15 08:51:54 jtham Exp $
- */
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Region} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RegionItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RegionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.REGION__VERTEX);
-			childrenFeatures.add(UmaPackage.Literals.REGION__TRANSITION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Region.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Region")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		return getString("_UI_Region_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Region.class)) {
-		case UmaPackage.REGION__VERTEX:
-		case UmaPackage.REGION__TRANSITION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.REGION__VERTEX, UmaFactory.eINSTANCE
-						.createVertex()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.REGION__VERTEX, UmaFactory.eINSTANCE
-						.createState()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.REGION__VERTEX, UmaFactory.eINSTANCE
-						.createPseudoState()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.REGION__TRANSITION, UmaFactory.eINSTANCE
-						.createTransition()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReportItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReportItemProvider.java
deleted file mode 100644
index 2f3446c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReportItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Report;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Report} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ReportItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReportItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Report.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Report")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Report) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Report_type") : //$NON-NLS-1$
-				getString("_UI_Report_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReusableAssetItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReusableAssetItemProvider.java
deleted file mode 100644
index d926b68..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ReusableAssetItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.ReusableAsset;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ReusableAsset} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ReusableAssetItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReusableAssetItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns ReusableAsset.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ReusableAsset")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ReusableAsset) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ReusableAsset_type") : //$NON-NLS-1$
-				getString("_UI_ReusableAsset_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoadmapItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoadmapItemProvider.java
deleted file mode 100644
index 1cea693..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoadmapItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Roadmap;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Roadmap} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoadmapItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoadmapItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Roadmap.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Roadmap")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Roadmap) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Roadmap_type") : //$NON-NLS-1$
-				getString("_UI_Roadmap_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleDescriptionItemProvider.java
deleted file mode 100644
index 5e474aa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleDescriptionItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.RoleDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.RoleDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoleDescriptionItemProvider extends ContentDescriptionItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addSkillsPropertyDescriptor(object);
-			addAssignmentApproachesPropertyDescriptor(object);
-			addSynonymsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Skills feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSkillsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleDescription_skills_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleDescription_skills_feature", "_UI_RoleDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_DESCRIPTION__SKILLS, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Assignment Approaches feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAssignmentApproachesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleDescription_assignmentApproaches_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleDescription_assignmentApproaches_feature", "_UI_RoleDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Synonyms feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSynonymsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleDescription_synonyms_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleDescription_synonyms_feature", "_UI_RoleDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_DESCRIPTION__SYNONYMS, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns RoleDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/RoleDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RoleDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_RoleDescription_type") : //$NON-NLS-1$
-				getString("_UI_RoleDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RoleDescription.class)) {
-		case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-		case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-		case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleDescriptorItemProvider.java
deleted file mode 100644
index 3196c87..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleDescriptorItemProvider.java
+++ /dev/null
@@ -1,178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.RoleDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoleDescriptorItemProvider extends DescriptorItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addRolePropertyDescriptor(object);
-			addModifiesPropertyDescriptor(object);
-			addResponsibleForPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Role feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRolePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleDescriptor_Role_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleDescriptor_Role_feature", "_UI_RoleDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_DESCRIPTOR__ROLE, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Modifies feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addModifiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleDescriptor_modifies_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleDescriptor_modifies_feature", "_UI_RoleDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_DESCRIPTOR__MODIFIES, false,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Responsible For feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addResponsibleForPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleDescriptor_responsibleFor_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleDescriptor_responsibleFor_feature", "_UI_RoleDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_DESCRIPTOR__RESPONSIBLE_FOR,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns RoleDescriptor.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/RoleDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RoleDescriptor) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_RoleDescriptor_type") : //$NON-NLS-1$
-				getString("_UI_RoleDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleItemProvider.java
deleted file mode 100644
index 5d2e4df..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleItemProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Role} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoleItemProvider extends ContentElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addModifiesPropertyDescriptor(object);
-			addResponsibleForPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Modifies feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addModifiesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Role_modifies_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Role_modifies_feature", "_UI_Role_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE__MODIFIES, false, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Responsible For feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addResponsibleForPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Role_responsibleFor_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Role_responsibleFor_feature", "_UI_Role_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE__RESPONSIBLE_FOR, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This returns Role.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Role")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Role) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Role_type") : //$NON-NLS-1$
-				getString("_UI_Role_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleSetGroupingItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleSetGroupingItemProvider.java
deleted file mode 100644
index 50b29aa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleSetGroupingItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.RoleSetGrouping} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoleSetGroupingItemProvider extends ContentCategoryItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleSetGroupingItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addRoleSetsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Role Sets feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRoleSetsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleSetGrouping_roleSets_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleSetGrouping_roleSets_feature", "_UI_RoleSetGrouping_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_SET_GROUPING__ROLE_SETS, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This returns RoleSetGrouping.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/RoleSetGrouping")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RoleSetGrouping) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_RoleSetGrouping_type") : //$NON-NLS-1$
-				getString("_UI_RoleSetGrouping_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleSetItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleSetItemProvider.java
deleted file mode 100644
index d16c9f2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/RoleSetItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.RoleSet} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RoleSetItemProvider extends ContentCategoryItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleSetItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addRolesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Roles feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addRolesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_RoleSet_roles_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_RoleSet_roles_feature", "_UI_RoleSet_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.ROLE_SET__ROLES, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This returns RoleSet.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/RoleSet")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RoleSet) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_RoleSet_type") : //$NON-NLS-1$
-				getString("_UI_RoleSet_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SectionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SectionItemProvider.java
deleted file mode 100644
index 44db3f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SectionItemProvider.java
+++ /dev/null
@@ -1,232 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Section;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Section} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SectionItemProvider extends VariabilityElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SectionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addSectionNamePropertyDescriptor(object);
-			addSectionDescriptionPropertyDescriptor(object);
-			addPredecessorPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Section Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSectionNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Section_sectionName_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Section_sectionName_feature", "_UI_Section_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.SECTION__SECTION_NAME, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Section Description feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSectionDescriptionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Section_sectionDescription_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Section_sectionDescription_feature", "_UI_Section_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.SECTION__SECTION_DESCRIPTION, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Predecessor feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPredecessorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Section_predecessor_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Section_predecessor_feature", "_UI_Section_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.SECTION__PREDECESSOR, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.SECTION__SUB_SECTIONS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Section.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Section")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Section) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Section_type") : //$NON-NLS-1$
-				getString("_UI_Section_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Section.class)) {
-		case UmaPackage.SECTION__SECTION_NAME:
-		case UmaPackage.SECTION__SECTION_DESCRIPTION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		case UmaPackage.SECTION__SUB_SECTIONS:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.SECTION__SUB_SECTIONS, UmaFactory.eINSTANCE
-						.createSection()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.SECTION__SUB_SECTIONS, UmaFactory.eINSTANCE
-						.createStep()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SemanticModelBridgeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SemanticModelBridgeItemProvider.java
deleted file mode 100644
index 1f1bd2c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SemanticModelBridgeItemProvider.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.SemanticModelBridge} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SemanticModelBridgeItemProvider extends DiagramElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SemanticModelBridgeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPresentationPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Presentation feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPresentationPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_SemanticModelBridge_presentation_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_SemanticModelBridge_presentation_feature", "_UI_SemanticModelBridge_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.SEMANTIC_MODEL_BRIDGE__PRESENTATION,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns SemanticModelBridge.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/SemanticModelBridge")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SemanticModelBridge) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_SemanticModelBridge_type") : //$NON-NLS-1$
-				getString("_UI_SemanticModelBridge_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SemanticModelBridge.class)) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__PRESENTATION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SimpleSemanticModelElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SimpleSemanticModelElementItemProvider.java
deleted file mode 100644
index 68e06a2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SimpleSemanticModelElementItemProvider.java
+++ /dev/null
@@ -1,149 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.SimpleSemanticModelElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SimpleSemanticModelElementItemProvider extends
-		SemanticModelBridgeItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SimpleSemanticModelElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTypeInfoPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Type Info feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTypeInfoPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_SimpleSemanticModelElement_typeInfo_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_SimpleSemanticModelElement_typeInfo_feature", "_UI_SimpleSemanticModelElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns SimpleSemanticModelElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/SimpleSemanticModelElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SimpleSemanticModelElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_SimpleSemanticModelElement_type") : //$NON-NLS-1$
-				getString("_UI_SimpleSemanticModelElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SimpleSemanticModelElement.class)) {
-		case UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StateItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StateItemProvider.java
deleted file mode 100644
index dc8f4fe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StateItemProvider.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: StateItemProvider.java,v 1.1 2008/01/15 08:51:54 jtham Exp $
- */
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.State;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.State} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class StateItemProvider extends VertexItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addWorkProductPropertyDescriptor(object);
-			addSubmachinePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Work Product feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWorkProductPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_State_WorkProduct_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_State_WorkProduct_feature", "_UI_State_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.STATE__WORK_PRODUCT, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Submachine feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSubmachinePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_State_submachine_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_State_submachine_feature", "_UI_State_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.STATE__SUBMACHINE, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.STATE__REGION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns State.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/State")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		return getString("_UI_State_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(State.class)) {
-		case UmaPackage.STATE__REGION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.STATE__REGION, UmaFactory.eINSTANCE
-						.createRegion()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StateMachineItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StateMachineItemProvider.java
deleted file mode 100644
index 1dda55b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StateMachineItemProvider.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: StateMachineItemProvider.java,v 1.1 2008/01/15 08:51:55 jtham Exp $
- */
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.StateMachine;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.StateMachine} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class StateMachineItemProvider extends WorkDefinitionItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateMachineItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(UmaPackage.Literals.STATE_MACHINE__REGION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns StateMachine.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/StateMachine")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((StateMachine) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_StateMachine_type") : //$NON-NLS-1$
-				getString("_UI_StateMachine_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(StateMachine.class)) {
-		case UmaPackage.STATE_MACHINE__REGION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.STATE_MACHINE__REGION, UmaFactory.eINSTANCE
-						.createRegion()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StepItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StepItemProvider.java
deleted file mode 100644
index 7081829..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/StepItemProvider.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Step;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Step} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class StepItemProvider extends SectionItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StepItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__PRECONDITION);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Step.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Step")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Step) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Step_type") : //$NON-NLS-1$
-				getString("_UI_Step_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Step.class)) {
-		case UmaPackage.STEP__PRECONDITION:
-		case UmaPackage.STEP__POSTCONDITION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__PRECONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SupportingMaterialItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SupportingMaterialItemProvider.java
deleted file mode 100644
index e7e25c3..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/SupportingMaterialItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.SupportingMaterial;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.SupportingMaterial} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class SupportingMaterialItemProvider extends GuidanceItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportingMaterialItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns SupportingMaterial.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/SupportingMaterial")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SupportingMaterial) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_SupportingMaterial_type") : //$NON-NLS-1$
-				getString("_UI_SupportingMaterial_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskDescriptionItemProvider.java
deleted file mode 100644
index 1a3e1c7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskDescriptionItemProvider.java
+++ /dev/null
@@ -1,170 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.TaskDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.TaskDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TaskDescriptionItemProvider extends ContentDescriptionItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPurposePropertyDescriptor(object);
-			addAlternativesPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Purpose feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPurposePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescription_purpose_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescription_purpose_feature", "_UI_TaskDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTION__PURPOSE, true,
-						false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Alternatives feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAlternativesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescription_alternatives_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescription_alternatives_feature", "_UI_TaskDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTION__ALTERNATIVES,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns TaskDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/TaskDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((TaskDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_TaskDescription_type") : //$NON-NLS-1$
-				getString("_UI_TaskDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TaskDescription.class)) {
-		case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-		case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskDescriptorItemProvider.java
deleted file mode 100644
index 7fae849..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskDescriptorItemProvider.java
+++ /dev/null
@@ -1,329 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.TaskDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TaskDescriptorItemProvider extends
-		WorkBreakdownElementItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIsSynchronizedWithSourcePropertyDescriptor(object);
-			addTaskPropertyDescriptor(object);
-			addAdditionallyPerformedByPropertyDescriptor(object);
-			addAssistedByPropertyDescriptor(object);
-			addExternalInputPropertyDescriptor(object);
-			addMandatoryInputPropertyDescriptor(object);
-			addOptionalInputPropertyDescriptor(object);
-			addOutputPropertyDescriptor(object);
-			addPerformedPrimarilyByPropertyDescriptor(object);
-			addSelectedStepsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Synchronized With Source feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsSynchronizedWithSourcePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Descriptor_isSynchronizedWithSource_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Descriptor_isSynchronizedWithSource_feature", "_UI_Descriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Task feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTaskPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_Task_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_Task_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__TASK, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Additionally Performed By feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAdditionallyPerformedByPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_additionallyPerformedBy_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_additionallyPerformedBy_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Assisted By feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAssistedByPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_assistedBy_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_assistedBy_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__ASSISTED_BY, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the External Input feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addExternalInputPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_externalInput_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_externalInput_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__EXTERNAL_INPUT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Mandatory Input feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMandatoryInputPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_mandatoryInput_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_mandatoryInput_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__MANDATORY_INPUT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Optional Input feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOptionalInputPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_optionalInput_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_optionalInput_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__OPTIONAL_INPUT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Output feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOutputPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_output_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_output_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__OUTPUT, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Performed Primarily By feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPerformedPrimarilyByPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_performedPrimarilyBy_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_performedPrimarilyBy_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Selected Steps feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSelectedStepsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TaskDescriptor_selectedSteps_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TaskDescriptor_selectedSteps_feature", "_UI_TaskDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK_DESCRIPTOR__SELECTED_STEPS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns TaskDescriptor.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/TaskDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((TaskDescriptor) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_TaskDescriptor_type") : //$NON-NLS-1$
-				getString("_UI_TaskDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TaskDescriptor.class)) {
-		case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskItemProvider.java
deleted file mode 100644
index 4fff722..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TaskItemProvider.java
+++ /dev/null
@@ -1,351 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.Task;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Task} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TaskItemProvider extends ContentElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPerformedByPropertyDescriptor(object);
-			addMandatoryInputPropertyDescriptor(object);
-			addOutputPropertyDescriptor(object);
-			addAdditionallyPerformedByPropertyDescriptor(object);
-			addOptionalInputPropertyDescriptor(object);
-			addStepsPropertyDescriptor(object);
-			addToolMentorsPropertyDescriptor(object);
-			addEstimationConsiderationsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Performed By feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPerformedByPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_performedBy_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_performedBy_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__PERFORMED_BY, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Mandatory Input feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMandatoryInputPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_mandatoryInput_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_mandatoryInput_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__MANDATORY_INPUT, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Output feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOutputPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_output_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_output_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__OUTPUT, true, false, false,
-						null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Additionally Performed By feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addAdditionallyPerformedByPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_additionallyPerformedBy_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_additionallyPerformedBy_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__ADDITIONALLY_PERFORMED_BY,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Optional Input feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOptionalInputPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_optionalInput_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_optionalInput_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__OPTIONAL_INPUT, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Steps feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addStepsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_steps_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_steps_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__STEPS, false, false, false,
-						null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Tool Mentors feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addToolMentorsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_toolMentors_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_toolMentors_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__TOOL_MENTORS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Estimation Considerations feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addEstimationConsiderationsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Task_estimationConsiderations_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Task_estimationConsiderations_feature", "_UI_Task_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TASK__ESTIMATION_CONSIDERATIONS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__PRECONDITION);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Task.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Task")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Task) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Task_type") : //$NON-NLS-1$
-				getString("_UI_Task_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Task.class)) {
-		case UmaPackage.TASK__PRECONDITION:
-		case UmaPackage.TASK__POSTCONDITION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__PRECONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TeamProfileItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TeamProfileItemProvider.java
deleted file mode 100644
index 75a33f9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TeamProfileItemProvider.java
+++ /dev/null
@@ -1,178 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.TeamProfile} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TeamProfileItemProvider extends BreakdownElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TeamProfileItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTeamRolesPropertyDescriptor(object);
-			addSuperTeamPropertyDescriptor(object);
-			addSubTeamPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Team Roles feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTeamRolesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TeamProfile_teamRoles_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TeamProfile_teamRoles_feature", "_UI_TeamProfile_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TEAM_PROFILE__TEAM_ROLES, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Super Team feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSuperTeamPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TeamProfile_superTeam_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TeamProfile_superTeam_feature", "_UI_TeamProfile_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TEAM_PROFILE__SUPER_TEAM, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Sub Team feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSubTeamPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TeamProfile_subTeam_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TeamProfile_subTeam_feature", "_UI_TeamProfile_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TEAM_PROFILE__SUB_TEAM, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This returns TeamProfile.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/TeamProfile")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((TeamProfile) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_TeamProfile_type") : //$NON-NLS-1$
-				getString("_UI_TeamProfile_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TemplateItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TemplateItemProvider.java
deleted file mode 100644
index 41608a0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TemplateItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Template;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Template} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TemplateItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TemplateItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Template.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Template")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Template) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Template_type") : //$NON-NLS-1$
-				getString("_UI_Template_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TermDefinitionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TermDefinitionItemProvider.java
deleted file mode 100644
index eff26f5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TermDefinitionItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.TermDefinition;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.TermDefinition} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TermDefinitionItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TermDefinitionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns TermDefinition.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/TermDefinition")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((TermDefinition) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_TermDefinition_type") : //$NON-NLS-1$
-				getString("_UI_TermDefinition_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TextElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TextElementItemProvider.java
deleted file mode 100644
index 539156c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TextElementItemProvider.java
+++ /dev/null
@@ -1,148 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.TextElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.TextElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TextElementItemProvider extends LeafElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TextElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_TextElement_text_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_TextElement_text_feature", "_UI_TextElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TEXT_ELEMENT__TEXT, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This returns TextElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/TextElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((TextElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_TextElement_type") : //$NON-NLS-1$
-				getString("_UI_TextElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TextElement.class)) {
-		case UmaPackage.TEXT_ELEMENT__TEXT:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ToolItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ToolItemProvider.java
deleted file mode 100644
index ab62ca2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ToolItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Tool} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ToolItemProvider extends ContentCategoryItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToolItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addToolMentorsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Tool Mentors feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addToolMentorsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Tool_toolMentors_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Tool_toolMentors_feature", "_UI_Tool_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TOOL__TOOL_MENTORS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This returns Tool.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Tool")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Tool) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Tool_type") : //$NON-NLS-1$
-				getString("_UI_Tool_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ToolMentorItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ToolMentorItemProvider.java
deleted file mode 100644
index 0494270..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/ToolMentorItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.ToolMentor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.ToolMentor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ToolMentorItemProvider extends GuidanceItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToolMentorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns ToolMentor.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/ToolMentor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ToolMentor) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_ToolMentor_type") : //$NON-NLS-1$
-				getString("_UI_ToolMentor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TransitionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TransitionItemProvider.java
deleted file mode 100644
index 3b07bde..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TransitionItemProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TransitionItemProvider.java,v 1.1 2008/01/15 08:51:54 jtham Exp $
- */
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Transition} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TransitionItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TransitionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addWorkDefinitionPropertyDescriptor(object);
-			addSourcePropertyDescriptor(object);
-			addTargetPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Work Definition feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWorkDefinitionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Transition_WorkDefinition_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Transition_WorkDefinition_feature", "_UI_Transition_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TRANSITION__WORK_DEFINITION, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Source feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSourcePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Transition_source_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Transition_source_feature", "_UI_Transition_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TRANSITION__SOURCE, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Target feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTargetPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Transition_target_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Transition_target_feature", "_UI_Transition_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.TRANSITION__TARGET, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This returns Transition.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Transition")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		return getString("_UI_Transition_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TypeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TypeItemProvider.java
deleted file mode 100644
index 72ea64c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/TypeItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Type;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Type} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class TypeItemProvider extends PackageableElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Type.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Type")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Type) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Type_type") : //$NON-NLS-1$
-				getString("_UI_Type_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UMASemanticModelBridgeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UMASemanticModelBridgeItemProvider.java
deleted file mode 100644
index 213738a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UMASemanticModelBridgeItemProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.UMASemanticModelBridge} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class UMASemanticModelBridgeItemProvider extends
-		SemanticModelBridgeItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UMASemanticModelBridgeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addElementPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Element feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_UMASemanticModelBridge_element_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_UMASemanticModelBridge_element_feature", "_UI_UMASemanticModelBridge_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns UMASemanticModelBridge.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/UMASemanticModelBridge")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((UMASemanticModelBridge) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_UMASemanticModelBridge_type") : //$NON-NLS-1$
-				getString("_UI_UMASemanticModelBridge_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UmaEditPlugin.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UmaEditPlugin.java
deleted file mode 100644
index 7f259be..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UmaEditPlugin.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.provider;
-
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-
-/**
- * This is the central singleton for the Uma edit plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public final class UmaEditPlugin extends EMFPlugin {
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final UmaEditPlugin INSTANCE = new UmaEditPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaEditPlugin() {
-		super(new ResourceLocator[] {});
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static class Implementation extends EclipsePlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UmaItemProviderAdapterFactory.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UmaItemProviderAdapterFactory.java
deleted file mode 100644
index eb34fac..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/UmaItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,2367 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.provider;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.util.UmaAdapterFactory;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class UmaItemProviderAdapterFactory extends UmaAdapterFactory implements
-		ComposeableAdapterFactory, IChangeNotifier, IDisposable {
-	/**
-	 * This keeps track of the root adapter factory that delegates to this adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-	/**
-	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-	/**
-	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Collection supportedTypes = new ArrayList();
-
-	/**
-	 * This constructs an instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaItemProviderAdapterFactory() {
-		supportedTypes.add(IEditingDomainItemProvider.class);
-		supportedTypes.add(IStructuredItemContentProvider.class);
-		supportedTypes.add(ITreeItemContentProvider.class);
-		supportedTypes.add(IItemLabelProvider.class);
-		supportedTypes.add(IItemPropertySource.class);
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Package} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PackageItemProvider packageItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Package}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPackageAdapter() {
-		if (packageItemProvider == null) {
-			packageItemProvider = new PackageItemProvider(this);
-		}
-
-		return packageItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Constraint} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConstraintItemProvider constraintItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Constraint}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConstraintAdapter() {
-		if (constraintItemProvider == null) {
-			constraintItemProvider = new ConstraintItemProvider(this);
-		}
-
-		return constraintItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.MethodElementProperty} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodElementPropertyItemProvider methodElementPropertyItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.MethodElementProperty}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMethodElementPropertyAdapter() {
-		if (methodElementPropertyItemProvider == null) {
-			methodElementPropertyItemProvider = new MethodElementPropertyItemProvider(
-					this);
-		}
-
-		return methodElementPropertyItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Role} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleItemProvider roleItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Role}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRoleAdapter() {
-		if (roleItemProvider == null) {
-			roleItemProvider = new RoleItemProvider(this);
-		}
-
-		return roleItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Task} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskItemProvider taskItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Task}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTaskAdapter() {
-		if (taskItemProvider == null) {
-			taskItemProvider = new TaskItemProvider(this);
-		}
-
-		return taskItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Step} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StepItemProvider stepItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Step}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createStepAdapter() {
-		if (stepItemProvider == null) {
-			stepItemProvider = new StepItemProvider(this);
-		}
-
-		return stepItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Artifact} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArtifactItemProvider artifactItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Artifact}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createArtifactAdapter() {
-		if (artifactItemProvider == null) {
-			artifactItemProvider = new ArtifactItemProvider(this);
-		}
-
-		return artifactItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Deliverable} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliverableItemProvider deliverableItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Deliverable}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDeliverableAdapter() {
-		if (deliverableItemProvider == null) {
-			deliverableItemProvider = new DeliverableItemProvider(this);
-		}
-
-		return deliverableItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Outcome} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OutcomeItemProvider outcomeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Outcome}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createOutcomeAdapter() {
-		if (outcomeItemProvider == null) {
-			outcomeItemProvider = new OutcomeItemProvider(this);
-		}
-
-		return outcomeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Point} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PointItemProvider pointItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Point}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPointAdapter() {
-		if (pointItemProvider == null) {
-			pointItemProvider = new PointItemProvider(this);
-		}
-
-		return pointItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.DiagramLink} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DiagramLinkItemProvider diagramLinkItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.DiagramLink}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDiagramLinkAdapter() {
-		if (diagramLinkItemProvider == null) {
-			diagramLinkItemProvider = new DiagramLinkItemProvider(this);
-		}
-
-		return diagramLinkItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.GraphConnector} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphConnectorItemProvider graphConnectorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.GraphConnector}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createGraphConnectorAdapter() {
-		if (graphConnectorItemProvider == null) {
-			graphConnectorItemProvider = new GraphConnectorItemProvider(this);
-		}
-
-		return graphConnectorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Dimension} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DimensionItemProvider dimensionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Dimension}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDimensionAdapter() {
-		if (dimensionItemProvider == null) {
-			dimensionItemProvider = new DimensionItemProvider(this);
-		}
-
-		return dimensionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Reference} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferenceItemProvider referenceItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Reference}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReferenceAdapter() {
-		if (referenceItemProvider == null) {
-			referenceItemProvider = new ReferenceItemProvider(this);
-		}
-
-		return referenceItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Property} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyItemProvider propertyItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Property}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyAdapter() {
-		if (propertyItemProvider == null) {
-			propertyItemProvider = new PropertyItemProvider(this);
-		}
-
-		return propertyItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.GraphEdge} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphEdgeItemProvider graphEdgeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.GraphEdge}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createGraphEdgeAdapter() {
-		if (graphEdgeItemProvider == null) {
-			graphEdgeItemProvider = new GraphEdgeItemProvider(this);
-		}
-
-		return graphEdgeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Diagram} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DiagramItemProvider diagramItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Diagram}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDiagramAdapter() {
-		if (diagramItemProvider == null) {
-			diagramItemProvider = new DiagramItemProvider(this);
-		}
-
-		return diagramItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.GraphNode} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphNodeItemProvider graphNodeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.GraphNode}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createGraphNodeAdapter() {
-		if (graphNodeItemProvider == null) {
-			graphNodeItemProvider = new GraphNodeItemProvider(this);
-		}
-
-		return graphNodeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.SimpleSemanticModelElement} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SimpleSemanticModelElementItemProvider simpleSemanticModelElementItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.SimpleSemanticModelElement}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSimpleSemanticModelElementAdapter() {
-		if (simpleSemanticModelElementItemProvider == null) {
-			simpleSemanticModelElementItemProvider = new SimpleSemanticModelElementItemProvider(
-					this);
-		}
-
-		return simpleSemanticModelElementItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.UMASemanticModelBridge} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected UMASemanticModelBridgeItemProvider umaSemanticModelBridgeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.UMASemanticModelBridge}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createUMASemanticModelBridgeAdapter() {
-		if (umaSemanticModelBridgeItemProvider == null) {
-			umaSemanticModelBridgeItemProvider = new UMASemanticModelBridgeItemProvider(
-					this);
-		}
-
-		return umaSemanticModelBridgeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.CoreSemanticModelBridge} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CoreSemanticModelBridgeItemProvider coreSemanticModelBridgeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.CoreSemanticModelBridge}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createCoreSemanticModelBridgeAdapter() {
-		if (coreSemanticModelBridgeItemProvider == null) {
-			coreSemanticModelBridgeItemProvider = new CoreSemanticModelBridgeItemProvider(
-					this);
-		}
-
-		return coreSemanticModelBridgeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.TextElement} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TextElementItemProvider textElementItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.TextElement}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTextElementAdapter() {
-		if (textElementItemProvider == null) {
-			textElementItemProvider = new TextElementItemProvider(this);
-		}
-
-		return textElementItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Image} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ImageItemProvider imageItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Image}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createImageAdapter() {
-		if (imageItemProvider == null) {
-			imageItemProvider = new ImageItemProvider(this);
-		}
-
-		return imageItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Polyline} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PolylineItemProvider polylineItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Polyline}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPolylineAdapter() {
-		if (polylineItemProvider == null) {
-			polylineItemProvider = new PolylineItemProvider(this);
-		}
-
-		return polylineItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Ellipse} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EllipseItemProvider ellipseItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Ellipse}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createEllipseAdapter() {
-		if (ellipseItemProvider == null) {
-			ellipseItemProvider = new EllipseItemProvider(this);
-		}
-
-		return ellipseItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Activity} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityItemProvider activityItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Activity}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createActivityAdapter() {
-		if (activityItemProvider == null) {
-			activityItemProvider = new ActivityItemProvider(this);
-		}
-
-		return activityItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Milestone} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MilestoneItemProvider milestoneItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Milestone}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMilestoneAdapter() {
-		if (milestoneItemProvider == null) {
-			milestoneItemProvider = new MilestoneItemProvider(this);
-		}
-
-		return milestoneItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Iteration} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IterationItemProvider iterationItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Iteration}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIterationAdapter() {
-		if (iterationItemProvider == null) {
-			iterationItemProvider = new IterationItemProvider(this);
-		}
-
-		return iterationItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Phase} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PhaseItemProvider phaseItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Phase}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPhaseAdapter() {
-		if (phaseItemProvider == null) {
-			phaseItemProvider = new PhaseItemProvider(this);
-		}
-
-		return phaseItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.TeamProfile} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TeamProfileItemProvider teamProfileItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.TeamProfile}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTeamProfileAdapter() {
-		if (teamProfileItemProvider == null) {
-			teamProfileItemProvider = new TeamProfileItemProvider(this);
-		}
-
-		return teamProfileItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.RoleDescriptor} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleDescriptorItemProvider roleDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.RoleDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRoleDescriptorAdapter() {
-		if (roleDescriptorItemProvider == null) {
-			roleDescriptorItemProvider = new RoleDescriptorItemProvider(this);
-		}
-
-		return roleDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.WorkOrder} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkOrderItemProvider workOrderItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.WorkOrder}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createWorkOrderAdapter() {
-		if (workOrderItemProvider == null) {
-			workOrderItemProvider = new WorkOrderItemProvider(this);
-		}
-
-		return workOrderItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.PlanningData} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PlanningDataItemProvider planningDataItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.PlanningData}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPlanningDataAdapter() {
-		if (planningDataItemProvider == null) {
-			planningDataItemProvider = new PlanningDataItemProvider(this);
-		}
-
-		return planningDataItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.TaskDescriptor} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskDescriptorItemProvider taskDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.TaskDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTaskDescriptorAdapter() {
-		if (taskDescriptorItemProvider == null) {
-			taskDescriptorItemProvider = new TaskDescriptorItemProvider(this);
-		}
-
-		return taskDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.WorkProductDescriptor} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDescriptorItemProvider workProductDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createWorkProductDescriptorAdapter() {
-		if (workProductDescriptorItemProvider == null) {
-			workProductDescriptorItemProvider = new WorkProductDescriptorItemProvider(
-					this);
-		}
-
-		return workProductDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.CompositeRole} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CompositeRoleItemProvider compositeRoleItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.CompositeRole}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createCompositeRoleAdapter() {
-		if (compositeRoleItemProvider == null) {
-			compositeRoleItemProvider = new CompositeRoleItemProvider(this);
-		}
-
-		return compositeRoleItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.BreakdownElementDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BreakdownElementDescriptionItemProvider breakdownElementDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.BreakdownElementDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBreakdownElementDescriptionAdapter() {
-		if (breakdownElementDescriptionItemProvider == null) {
-			breakdownElementDescriptionItemProvider = new BreakdownElementDescriptionItemProvider(
-					this);
-		}
-
-		return breakdownElementDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ActivityDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityDescriptionItemProvider activityDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ActivityDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createActivityDescriptionAdapter() {
-		if (activityDescriptionItemProvider == null) {
-			activityDescriptionItemProvider = new ActivityDescriptionItemProvider(
-					this);
-		}
-
-		return activityDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.DeliveryProcessDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliveryProcessDescriptionItemProvider deliveryProcessDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.DeliveryProcessDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDeliveryProcessDescriptionAdapter() {
-		if (deliveryProcessDescriptionItemProvider == null) {
-			deliveryProcessDescriptionItemProvider = new DeliveryProcessDescriptionItemProvider(
-					this);
-		}
-
-		return deliveryProcessDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ProcessDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessDescriptionItemProvider processDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ProcessDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createProcessDescriptionAdapter() {
-		if (processDescriptionItemProvider == null) {
-			processDescriptionItemProvider = new ProcessDescriptionItemProvider(
-					this);
-		}
-
-		return processDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.DescriptorDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptorDescriptionItemProvider descriptorDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.DescriptorDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDescriptorDescriptionAdapter() {
-		if (descriptorDescriptionItemProvider == null) {
-			descriptorDescriptionItemProvider = new DescriptorDescriptionItemProvider(
-					this);
-		}
-
-		return descriptorDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Concept} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConceptItemProvider conceptItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Concept}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConceptAdapter() {
-		if (conceptItemProvider == null) {
-			conceptItemProvider = new ConceptItemProvider(this);
-		}
-
-		return conceptItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Checklist} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ChecklistItemProvider checklistItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Checklist}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createChecklistAdapter() {
-		if (checklistItemProvider == null) {
-			checklistItemProvider = new ChecklistItemProvider(this);
-		}
-
-		return checklistItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Example} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExampleItemProvider exampleItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Example}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createExampleAdapter() {
-		if (exampleItemProvider == null) {
-			exampleItemProvider = new ExampleItemProvider(this);
-		}
-
-		return exampleItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Guideline} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidelineItemProvider guidelineItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Guideline}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createGuidelineAdapter() {
-		if (guidelineItemProvider == null) {
-			guidelineItemProvider = new GuidelineItemProvider(this);
-		}
-
-		return guidelineItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.EstimationConsiderations} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EstimationConsiderationsItemProvider estimationConsiderationsItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.EstimationConsiderations}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createEstimationConsiderationsAdapter() {
-		if (estimationConsiderationsItemProvider == null) {
-			estimationConsiderationsItemProvider = new EstimationConsiderationsItemProvider(
-					this);
-		}
-
-		return estimationConsiderationsItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Report} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReportItemProvider reportItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Report}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReportAdapter() {
-		if (reportItemProvider == null) {
-			reportItemProvider = new ReportItemProvider(this);
-		}
-
-		return reportItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Template} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TemplateItemProvider templateItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Template}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTemplateAdapter() {
-		if (templateItemProvider == null) {
-			templateItemProvider = new TemplateItemProvider(this);
-		}
-
-		return templateItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.SupportingMaterial} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SupportingMaterialItemProvider supportingMaterialItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.SupportingMaterial}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSupportingMaterialAdapter() {
-		if (supportingMaterialItemProvider == null) {
-			supportingMaterialItemProvider = new SupportingMaterialItemProvider(
-					this);
-		}
-
-		return supportingMaterialItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ToolMentor} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToolMentorItemProvider toolMentorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ToolMentor}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createToolMentorAdapter() {
-		if (toolMentorItemProvider == null) {
-			toolMentorItemProvider = new ToolMentorItemProvider(this);
-		}
-
-		return toolMentorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Whitepaper} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WhitepaperItemProvider whitepaperItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Whitepaper}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createWhitepaperAdapter() {
-		if (whitepaperItemProvider == null) {
-			whitepaperItemProvider = new WhitepaperItemProvider(this);
-		}
-
-		return whitepaperItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.TermDefinition} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TermDefinitionItemProvider termDefinitionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.TermDefinition}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTermDefinitionAdapter() {
-		if (termDefinitionItemProvider == null) {
-			termDefinitionItemProvider = new TermDefinitionItemProvider(this);
-		}
-
-		return termDefinitionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Practice} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PracticeItemProvider practiceItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Practice}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPracticeAdapter() {
-		if (practiceItemProvider == null) {
-			practiceItemProvider = new PracticeItemProvider(this);
-		}
-
-		return practiceItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ReusableAsset} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReusableAssetItemProvider reusableAssetItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ReusableAsset}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReusableAssetAdapter() {
-		if (reusableAssetItemProvider == null) {
-			reusableAssetItemProvider = new ReusableAssetItemProvider(this);
-		}
-
-		return reusableAssetItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.State} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateItemProvider stateItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.State}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createStateAdapter() {
-		if (stateItemProvider == null) {
-			stateItemProvider = new StateItemProvider(this);
-		}
-
-		return stateItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Vertex} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VertexItemProvider vertexItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Vertex}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createVertexAdapter() {
-		if (vertexItemProvider == null) {
-			vertexItemProvider = new VertexItemProvider(this);
-		}
-
-		return vertexItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Region} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RegionItemProvider regionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Region}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRegionAdapter() {
-		if (regionItemProvider == null) {
-			regionItemProvider = new RegionItemProvider(this);
-		}
-
-		return regionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.StateMachine} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateMachineItemProvider stateMachineItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.StateMachine}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createStateMachineAdapter() {
-		if (stateMachineItemProvider == null) {
-			stateMachineItemProvider = new StateMachineItemProvider(this);
-		}
-
-		return stateMachineItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Transition} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TransitionItemProvider transitionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Transition}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTransitionAdapter() {
-		if (transitionItemProvider == null) {
-			transitionItemProvider = new TransitionItemProvider(this);
-		}
-
-		return transitionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.PseudoState} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PseudoStateItemProvider pseudoStateItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.PseudoState}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPseudoStateAdapter() {
-		if (pseudoStateItemProvider == null) {
-			pseudoStateItemProvider = new PseudoStateItemProvider(this);
-		}
-
-		return pseudoStateItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Discipline} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisciplineItemProvider disciplineItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Discipline}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDisciplineAdapter() {
-		if (disciplineItemProvider == null) {
-			disciplineItemProvider = new DisciplineItemProvider(this);
-		}
-
-		return disciplineItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.RoleSet} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleSetItemProvider roleSetItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.RoleSet}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRoleSetAdapter() {
-		if (roleSetItemProvider == null) {
-			roleSetItemProvider = new RoleSetItemProvider(this);
-		}
-
-		return roleSetItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Domain} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DomainItemProvider domainItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Domain}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDomainAdapter() {
-		if (domainItemProvider == null) {
-			domainItemProvider = new DomainItemProvider(this);
-		}
-
-		return domainItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.WorkProductType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductTypeItemProvider workProductTypeItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.WorkProductType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createWorkProductTypeAdapter() {
-		if (workProductTypeItemProvider == null) {
-			workProductTypeItemProvider = new WorkProductTypeItemProvider(this);
-		}
-
-		return workProductTypeItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.DisciplineGrouping} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisciplineGroupingItemProvider disciplineGroupingItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.DisciplineGrouping}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDisciplineGroupingAdapter() {
-		if (disciplineGroupingItemProvider == null) {
-			disciplineGroupingItemProvider = new DisciplineGroupingItemProvider(
-					this);
-		}
-
-		return disciplineGroupingItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Tool} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToolItemProvider toolItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Tool}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createToolAdapter() {
-		if (toolItemProvider == null) {
-			toolItemProvider = new ToolItemProvider(this);
-		}
-
-		return toolItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.RoleSetGrouping} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleSetGroupingItemProvider roleSetGroupingItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.RoleSetGrouping}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRoleSetGroupingAdapter() {
-		if (roleSetGroupingItemProvider == null) {
-			roleSetGroupingItemProvider = new RoleSetGroupingItemProvider(this);
-		}
-
-		return roleSetGroupingItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.CustomCategory} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CustomCategoryItemProvider customCategoryItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.CustomCategory}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createCustomCategoryAdapter() {
-		if (customCategoryItemProvider == null) {
-			customCategoryItemProvider = new CustomCategoryItemProvider(this);
-		}
-
-		return customCategoryItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.CapabilityPattern} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CapabilityPatternItemProvider capabilityPatternItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.CapabilityPattern}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createCapabilityPatternAdapter() {
-		if (capabilityPatternItemProvider == null) {
-			capabilityPatternItemProvider = new CapabilityPatternItemProvider(
-					this);
-		}
-
-		return capabilityPatternItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.DeliveryProcess} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliveryProcessItemProvider deliveryProcessItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.DeliveryProcess}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDeliveryProcessAdapter() {
-		if (deliveryProcessItemProvider == null) {
-			deliveryProcessItemProvider = new DeliveryProcessItemProvider(this);
-		}
-
-		return deliveryProcessItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ProcessPlanningTemplate} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessPlanningTemplateItemProvider processPlanningTemplateItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ProcessPlanningTemplate}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createProcessPlanningTemplateAdapter() {
-		if (processPlanningTemplateItemProvider == null) {
-			processPlanningTemplateItemProvider = new ProcessPlanningTemplateItemProvider(
-					this);
-		}
-
-		return processPlanningTemplateItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Roadmap} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoadmapItemProvider roadmapItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Roadmap}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRoadmapAdapter() {
-		if (roadmapItemProvider == null) {
-			roadmapItemProvider = new RoadmapItemProvider(this);
-		}
-
-		return roadmapItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ContentPackage} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentPackageItemProvider contentPackageItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ContentPackage}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createContentPackageAdapter() {
-		if (contentPackageItemProvider == null) {
-			contentPackageItemProvider = new ContentPackageItemProvider(this);
-		}
-
-		return contentPackageItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ProcessComponent} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentItemProvider processComponentItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ProcessComponent}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createProcessComponentAdapter() {
-		if (processComponentItemProvider == null) {
-			processComponentItemProvider = new ProcessComponentItemProvider(
-					this);
-		}
-
-		return processComponentItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ProcessPackage} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessPackageItemProvider processPackageItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ProcessPackage}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createProcessPackageAdapter() {
-		if (processPackageItemProvider == null) {
-			processPackageItemProvider = new ProcessPackageItemProvider(this);
-		}
-
-		return processPackageItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ProcessComponentInterface} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentInterfaceItemProvider processComponentInterfaceItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ProcessComponentInterface}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createProcessComponentInterfaceAdapter() {
-		if (processComponentInterfaceItemProvider == null) {
-			processComponentInterfaceItemProvider = new ProcessComponentInterfaceItemProvider(
-					this);
-		}
-
-		return processComponentInterfaceItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ProcessComponentDescriptor} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentDescriptorItemProvider processComponentDescriptorItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ProcessComponentDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createProcessComponentDescriptorAdapter() {
-		if (processComponentDescriptorItemProvider == null) {
-			processComponentDescriptorItemProvider = new ProcessComponentDescriptorItemProvider(
-					this);
-		}
-
-		return processComponentDescriptorItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.MethodPlugin} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodPluginItemProvider methodPluginItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.MethodPlugin}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMethodPluginAdapter() {
-		if (methodPluginItemProvider == null) {
-			methodPluginItemProvider = new MethodPluginItemProvider(this);
-		}
-
-		return methodPluginItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ContentDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentDescriptionItemProvider contentDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ContentDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createContentDescriptionAdapter() {
-		if (contentDescriptionItemProvider == null) {
-			contentDescriptionItemProvider = new ContentDescriptionItemProvider(
-					this);
-		}
-
-		return contentDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.Section} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SectionItemProvider sectionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.Section}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSectionAdapter() {
-		if (sectionItemProvider == null) {
-			sectionItemProvider = new SectionItemProvider(this);
-		}
-
-		return sectionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ArtifactDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArtifactDescriptionItemProvider artifactDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ArtifactDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createArtifactDescriptionAdapter() {
-		if (artifactDescriptionItemProvider == null) {
-			artifactDescriptionItemProvider = new ArtifactDescriptionItemProvider(
-					this);
-		}
-
-		return artifactDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.WorkProductDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDescriptionItemProvider workProductDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.WorkProductDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createWorkProductDescriptionAdapter() {
-		if (workProductDescriptionItemProvider == null) {
-			workProductDescriptionItemProvider = new WorkProductDescriptionItemProvider(
-					this);
-		}
-
-		return workProductDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.DeliverableDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliverableDescriptionItemProvider deliverableDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.DeliverableDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDeliverableDescriptionAdapter() {
-		if (deliverableDescriptionItemProvider == null) {
-			deliverableDescriptionItemProvider = new DeliverableDescriptionItemProvider(
-					this);
-		}
-
-		return deliverableDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.RoleDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleDescriptionItemProvider roleDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.RoleDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRoleDescriptionAdapter() {
-		if (roleDescriptionItemProvider == null) {
-			roleDescriptionItemProvider = new RoleDescriptionItemProvider(this);
-		}
-
-		return roleDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.TaskDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskDescriptionItemProvider taskDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.TaskDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTaskDescriptionAdapter() {
-		if (taskDescriptionItemProvider == null) {
-			taskDescriptionItemProvider = new TaskDescriptionItemProvider(this);
-		}
-
-		return taskDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.GuidanceDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidanceDescriptionItemProvider guidanceDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.GuidanceDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createGuidanceDescriptionAdapter() {
-		if (guidanceDescriptionItemProvider == null) {
-			guidanceDescriptionItemProvider = new GuidanceDescriptionItemProvider(
-					this);
-		}
-
-		return guidanceDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.PracticeDescription} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PracticeDescriptionItemProvider practiceDescriptionItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.PracticeDescription}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPracticeDescriptionAdapter() {
-		if (practiceDescriptionItemProvider == null) {
-			practiceDescriptionItemProvider = new PracticeDescriptionItemProvider(
-					this);
-		}
-
-		return practiceDescriptionItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.MethodConfiguration} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodConfigurationItemProvider methodConfigurationItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.MethodConfiguration}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMethodConfigurationAdapter() {
-		if (methodConfigurationItemProvider == null) {
-			methodConfigurationItemProvider = new MethodConfigurationItemProvider(
-					this);
-		}
-
-		return methodConfigurationItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.ProcessFamily} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessFamilyItemProvider processFamilyItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.ProcessFamily}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createProcessFamilyAdapter() {
-		if (processFamilyItemProvider == null) {
-			processFamilyItemProvider = new ProcessFamilyItemProvider(this);
-		}
-
-		return processFamilyItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.epf.uma.MethodLibrary} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodLibraryItemProvider methodLibraryItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.epf.uma.MethodLibrary}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMethodLibraryAdapter() {
-		if (methodLibraryItemProvider == null) {
-			methodLibraryItemProvider = new MethodLibraryItemProvider(this);
-		}
-
-		return methodLibraryItemProvider;
-	}
-
-	/**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-		return parentAdapterFactory == null ? this : parentAdapterFactory
-				.getRootAdapterFactory();
-	}
-
-	/**
-	 * This sets the composed adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentAdapterFactory(
-			ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object type) {
-		return supportedTypes.contains(type) || super.isFactoryForType(type);
-	}
-
-	/**
-	 * This implementation substitutes the factory itself as the key for the adapter.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object adapt(Object object, Object type) {
-		if (isFactoryForType(type)) {
-			Object adapter = super.adapt(object, type);
-			if (!(type instanceof Class)
-					|| (((Class) type).isInstance(adapter))) {
-				return adapter;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * This adds a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-	/**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-	/**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		changeNotifier.fireNotifyChanged(notification);
-
-		if (parentAdapterFactory != null) {
-			parentAdapterFactory.fireNotifyChanged(notification);
-		}
-	}
-
-	/**
-	 * This disposes all of the item providers created by this factory. 
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void dispose() {
-		if (packageItemProvider != null)
-			packageItemProvider.dispose();
-		if (constraintItemProvider != null)
-			constraintItemProvider.dispose();
-		if (methodElementPropertyItemProvider != null)
-			methodElementPropertyItemProvider.dispose();
-		if (contentDescriptionItemProvider != null)
-			contentDescriptionItemProvider.dispose();
-		if (sectionItemProvider != null)
-			sectionItemProvider.dispose();
-		if (roleItemProvider != null)
-			roleItemProvider.dispose();
-		if (taskItemProvider != null)
-			taskItemProvider.dispose();
-		if (stepItemProvider != null)
-			stepItemProvider.dispose();
-		if (artifactItemProvider != null)
-			artifactItemProvider.dispose();
-		if (deliverableItemProvider != null)
-			deliverableItemProvider.dispose();
-		if (outcomeItemProvider != null)
-			outcomeItemProvider.dispose();
-		if (contentPackageItemProvider != null)
-			contentPackageItemProvider.dispose();
-		if (artifactDescriptionItemProvider != null)
-			artifactDescriptionItemProvider.dispose();
-		if (workProductDescriptionItemProvider != null)
-			workProductDescriptionItemProvider.dispose();
-		if (deliverableDescriptionItemProvider != null)
-			deliverableDescriptionItemProvider.dispose();
-		if (roleDescriptionItemProvider != null)
-			roleDescriptionItemProvider.dispose();
-		if (taskDescriptionItemProvider != null)
-			taskDescriptionItemProvider.dispose();
-		if (guidanceDescriptionItemProvider != null)
-			guidanceDescriptionItemProvider.dispose();
-		if (practiceDescriptionItemProvider != null)
-			practiceDescriptionItemProvider.dispose();
-		if (pointItemProvider != null)
-			pointItemProvider.dispose();
-		if (diagramLinkItemProvider != null)
-			diagramLinkItemProvider.dispose();
-		if (graphConnectorItemProvider != null)
-			graphConnectorItemProvider.dispose();
-		if (dimensionItemProvider != null)
-			dimensionItemProvider.dispose();
-		if (referenceItemProvider != null)
-			referenceItemProvider.dispose();
-		if (propertyItemProvider != null)
-			propertyItemProvider.dispose();
-		if (graphEdgeItemProvider != null)
-			graphEdgeItemProvider.dispose();
-		if (diagramItemProvider != null)
-			diagramItemProvider.dispose();
-		if (graphNodeItemProvider != null)
-			graphNodeItemProvider.dispose();
-		if (simpleSemanticModelElementItemProvider != null)
-			simpleSemanticModelElementItemProvider.dispose();
-		if (umaSemanticModelBridgeItemProvider != null)
-			umaSemanticModelBridgeItemProvider.dispose();
-		if (coreSemanticModelBridgeItemProvider != null)
-			coreSemanticModelBridgeItemProvider.dispose();
-		if (textElementItemProvider != null)
-			textElementItemProvider.dispose();
-		if (imageItemProvider != null)
-			imageItemProvider.dispose();
-		if (polylineItemProvider != null)
-			polylineItemProvider.dispose();
-		if (ellipseItemProvider != null)
-			ellipseItemProvider.dispose();
-		if (activityItemProvider != null)
-			activityItemProvider.dispose();
-		if (milestoneItemProvider != null)
-			milestoneItemProvider.dispose();
-		if (iterationItemProvider != null)
-			iterationItemProvider.dispose();
-		if (phaseItemProvider != null)
-			phaseItemProvider.dispose();
-		if (teamProfileItemProvider != null)
-			teamProfileItemProvider.dispose();
-		if (roleDescriptorItemProvider != null)
-			roleDescriptorItemProvider.dispose();
-		if (workOrderItemProvider != null)
-			workOrderItemProvider.dispose();
-		if (planningDataItemProvider != null)
-			planningDataItemProvider.dispose();
-		if (workProductDescriptorItemProvider != null)
-			workProductDescriptorItemProvider.dispose();
-		if (taskDescriptorItemProvider != null)
-			taskDescriptorItemProvider.dispose();
-		if (compositeRoleItemProvider != null)
-			compositeRoleItemProvider.dispose();
-		if (breakdownElementDescriptionItemProvider != null)
-			breakdownElementDescriptionItemProvider.dispose();
-		if (activityDescriptionItemProvider != null)
-			activityDescriptionItemProvider.dispose();
-		if (deliveryProcessDescriptionItemProvider != null)
-			deliveryProcessDescriptionItemProvider.dispose();
-		if (processDescriptionItemProvider != null)
-			processDescriptionItemProvider.dispose();
-		if (descriptorDescriptionItemProvider != null)
-			descriptorDescriptionItemProvider.dispose();
-		if (conceptItemProvider != null)
-			conceptItemProvider.dispose();
-		if (checklistItemProvider != null)
-			checklistItemProvider.dispose();
-		if (exampleItemProvider != null)
-			exampleItemProvider.dispose();
-		if (guidelineItemProvider != null)
-			guidelineItemProvider.dispose();
-		if (reportItemProvider != null)
-			reportItemProvider.dispose();
-		if (templateItemProvider != null)
-			templateItemProvider.dispose();
-		if (supportingMaterialItemProvider != null)
-			supportingMaterialItemProvider.dispose();
-		if (toolMentorItemProvider != null)
-			toolMentorItemProvider.dispose();
-		if (whitepaperItemProvider != null)
-			whitepaperItemProvider.dispose();
-		if (termDefinitionItemProvider != null)
-			termDefinitionItemProvider.dispose();
-		if (practiceItemProvider != null)
-			practiceItemProvider.dispose();
-		if (estimationConsiderationsItemProvider != null)
-			estimationConsiderationsItemProvider.dispose();
-		if (reusableAssetItemProvider != null)
-			reusableAssetItemProvider.dispose();
-		if (stateItemProvider != null)
-			stateItemProvider.dispose();
-		if (vertexItemProvider != null)
-			vertexItemProvider.dispose();
-		if (regionItemProvider != null)
-			regionItemProvider.dispose();
-		if (stateMachineItemProvider != null)
-			stateMachineItemProvider.dispose();
-		if (transitionItemProvider != null)
-			transitionItemProvider.dispose();
-		if (pseudoStateItemProvider != null)
-			pseudoStateItemProvider.dispose();
-		if (disciplineItemProvider != null)
-			disciplineItemProvider.dispose();
-		if (roleSetItemProvider != null)
-			roleSetItemProvider.dispose();
-		if (domainItemProvider != null)
-			domainItemProvider.dispose();
-		if (workProductTypeItemProvider != null)
-			workProductTypeItemProvider.dispose();
-		if (disciplineGroupingItemProvider != null)
-			disciplineGroupingItemProvider.dispose();
-		if (toolItemProvider != null)
-			toolItemProvider.dispose();
-		if (roleSetGroupingItemProvider != null)
-			roleSetGroupingItemProvider.dispose();
-		if (customCategoryItemProvider != null)
-			customCategoryItemProvider.dispose();
-		if (deliveryProcessItemProvider != null)
-			deliveryProcessItemProvider.dispose();
-		if (capabilityPatternItemProvider != null)
-			capabilityPatternItemProvider.dispose();
-		if (processPlanningTemplateItemProvider != null)
-			processPlanningTemplateItemProvider.dispose();
-		if (roadmapItemProvider != null)
-			roadmapItemProvider.dispose();
-		if (processComponentItemProvider != null)
-			processComponentItemProvider.dispose();
-		if (processPackageItemProvider != null)
-			processPackageItemProvider.dispose();
-		if (processComponentInterfaceItemProvider != null)
-			processComponentInterfaceItemProvider.dispose();
-		if (processComponentDescriptorItemProvider != null)
-			processComponentDescriptorItemProvider.dispose();
-		if (methodPluginItemProvider != null)
-			methodPluginItemProvider.dispose();
-		if (methodConfigurationItemProvider != null)
-			methodConfigurationItemProvider.dispose();
-		if (processFamilyItemProvider != null)
-			processFamilyItemProvider.dispose();
-		if (methodLibraryItemProvider != null)
-			methodLibraryItemProvider.dispose();
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/VariabilityElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/VariabilityElementItemProvider.java
deleted file mode 100644
index 1cef056..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/VariabilityElementItemProvider.java
+++ /dev/null
@@ -1,168 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.VariabilityElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class VariabilityElementItemProvider extends MethodElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addVariabilityTypePropertyDescriptor(object);
-			addVariabilityBasedOnElementPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Variability Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVariabilityTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_VariabilityElement_variabilityType_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_VariabilityElement_variabilityType_feature", "_UI_VariabilityElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_TYPE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Variability Based On Element feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addVariabilityBasedOnElementPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_VariabilityElement_variabilityBasedOnElement_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_VariabilityElement_variabilityBasedOnElement_feature", "_UI_VariabilityElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns VariabilityElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/VariabilityElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((VariabilityElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_VariabilityElement_type") : //$NON-NLS-1$
-				getString("_UI_VariabilityElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(VariabilityElement.class)) {
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/VertexItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/VertexItemProvider.java
deleted file mode 100644
index 4f8b6cf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/VertexItemProvider.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: VertexItemProvider.java,v 1.1 2008/01/15 08:51:54 jtham Exp $
- */
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Vertex} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class VertexItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VertexItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addOutgoingPropertyDescriptor(object);
-			addIncomingPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Outgoing feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addOutgoingPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Vertex_outgoing_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Vertex_outgoing_feature", "_UI_Vertex_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VERTEX__OUTGOING, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Incoming feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIncomingPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_Vertex_incoming_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_Vertex_incoming_feature", "_UI_Vertex_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.VERTEX__INCOMING, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This returns Vertex.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Vertex")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		return getString("_UI_Vertex_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WhitepaperItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WhitepaperItemProvider.java
deleted file mode 100644
index 7139f86..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WhitepaperItemProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.Whitepaper;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.Whitepaper} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WhitepaperItemProvider extends ConceptItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WhitepaperItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns Whitepaper.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/Whitepaper")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((Whitepaper) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_Whitepaper_type") : //$NON-NLS-1$
-				getString("_UI_Whitepaper_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkBreakdownElementItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkBreakdownElementItemProvider.java
deleted file mode 100644
index 4123906..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkBreakdownElementItemProvider.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.WorkBreakdownElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkBreakdownElementItemProvider extends
-		BreakdownElementItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkBreakdownElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIsRepeatablePropertyDescriptor(object);
-			addIsOngoingPropertyDescriptor(object);
-			addIsEventDrivenPropertyDescriptor(object);
-			addLinkToPredecessorPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Repeatable feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsRepeatablePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkBreakdownElement_isRepeatable_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkBreakdownElement_isRepeatable_feature", "_UI_WorkBreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Ongoing feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsOngoingPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkBreakdownElement_isOngoing_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkBreakdownElement_isOngoing_feature", "_UI_WorkBreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__IS_ONGOING,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Is Event Driven feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIsEventDrivenPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkBreakdownElement_isEventDriven_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkBreakdownElement_isEventDriven_feature", "_UI_WorkBreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Link To Predecessor feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLinkToPredecessorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkBreakdownElement_linkToPredecessor_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkBreakdownElement_linkToPredecessor_feature", "_UI_WorkBreakdownElement_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns WorkBreakdownElement.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/WorkBreakdownElement")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((WorkBreakdownElement) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_WorkBreakdownElement_type") : //$NON-NLS-1$
-				getString("_UI_WorkBreakdownElement_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(WorkBreakdownElement.class)) {
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkDefinitionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkDefinitionItemProvider.java
deleted file mode 100644
index 03e8177..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkDefinitionItemProvider.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkDefinition;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.WorkDefinition} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkDefinitionItemProvider extends MethodElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkDefinitionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__PRECONDITION);
-			childrenFeatures
-					.add(UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns WorkDefinition.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/WorkDefinition")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((WorkDefinition) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_WorkDefinition_type") : //$NON-NLS-1$
-				getString("_UI_WorkDefinition_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(WorkDefinition.class)) {
-		case UmaPackage.WORK_DEFINITION__PRECONDITION:
-		case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), true, false));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__PRECONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-
-		newChildDescriptors.add(createChildParameter(
-				UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION,
-				UmaFactory.eINSTANCE.createConstraint()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCreateChildText(Object owner, Object feature,
-			Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULES
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__PRECONDITION
-				|| childFeature == UmaPackage.Literals.WORK_DEFINITION__POSTCONDITION;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", //$NON-NLS-1$
-					new Object[] { getTypeText(childObject),
-							getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkOrderItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkOrderItemProvider.java
deleted file mode 100644
index 0decc8b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkOrderItemProvider.java
+++ /dev/null
@@ -1,168 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkOrder;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.WorkOrder} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkOrderItemProvider extends ProcessElementItemProvider implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrderItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addLinkTypePropertyDescriptor(object);
-			addPredPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Link Type feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLinkTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkOrder_linkType_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkOrder_linkType_feature", "_UI_WorkOrder_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_ORDER__LINK_TYPE, true, false,
-						false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-						null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Pred feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPredPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkOrder_pred_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkOrder_pred_feature", "_UI_WorkOrder_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_ORDER__PRED, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This returns WorkOrder.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/WorkOrder")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((WorkOrder) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_WorkOrder_type") : //$NON-NLS-1$
-				getString("_UI_WorkOrder_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(WorkOrder.class)) {
-		case UmaPackage.WORK_ORDER__LINK_TYPE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductDescriptionItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductDescriptionItemProvider.java
deleted file mode 100644
index 3c60d3a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductDescriptionItemProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescription;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.WorkProductDescription} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductDescriptionItemProvider extends
-		ContentDescriptionItemProvider implements IEditingDomainItemProvider,
-		IStructuredItemContentProvider, ITreeItemContentProvider,
-		IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescriptionItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addPurposePropertyDescriptor(object);
-			addImpactOfNotHavingPropertyDescriptor(object);
-			addReasonsForNotNeedingPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Purpose feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addPurposePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescription_purpose_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescription_purpose_feature", "_UI_WorkProductDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTION__PURPOSE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Impact Of Not Having feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addImpactOfNotHavingPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescription_impactOfNotHaving_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescription_impactOfNotHaving_feature", "_UI_WorkProductDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Reasons For Not Needing feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReasonsForNotNeedingPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescription_reasonsForNotNeeding_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescription_reasonsForNotNeeding_feature", "_UI_WorkProductDescription_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns WorkProductDescription.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/WorkProductDescription")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((WorkProductDescription) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_WorkProductDescription_type") : //$NON-NLS-1$
-				getString("_UI_WorkProductDescription_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(WorkProductDescription.class)) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductDescriptorItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductDescriptorItemProvider.java
deleted file mode 100644
index b65f1fd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductDescriptorItemProvider.java
+++ /dev/null
@@ -1,250 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.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.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.WorkProductDescriptor} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductDescriptorItemProvider extends DescriptorItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescriptorItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addActivityEntryStatePropertyDescriptor(object);
-			addActivityExitStatePropertyDescriptor(object);
-			addWorkProductPropertyDescriptor(object);
-			addImpactedByPropertyDescriptor(object);
-			addImpactsPropertyDescriptor(object);
-			addDeliverablePartsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Activity Entry State feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addActivityEntryStatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescriptor_activityEntryState_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescriptor_activityEntryState_feature", "_UI_WorkProductDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Activity Exit State feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addActivityExitStatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescriptor_activityExitState_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescriptor_activityExitState_feature", "_UI_WorkProductDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE,
-						true, false, false,
-						ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Work Product feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWorkProductPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescriptor_WorkProduct_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescriptor_WorkProduct_feature", "_UI_WorkProductDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Impacted By feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addImpactedByPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescriptor_impactedBy_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescriptor_impactedBy_feature", "_UI_WorkProductDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Impacts feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addImpactsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescriptor_impacts_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescriptor_impacts_feature", "_UI_WorkProductDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__IMPACTS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Deliverable Parts feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDeliverablePartsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductDescriptor_deliverableParts_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductDescriptor_deliverableParts_feature", "_UI_WorkProductDescriptor_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns WorkProductDescriptor.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/WorkProductDescriptor")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((WorkProductDescriptor) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_WorkProductDescriptor_type") : //$NON-NLS-1$
-				getString("_UI_WorkProductDescriptor_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(WorkProductDescriptor.class)) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-			fireNotifyChanged(new ViewerNotification(notification, notification
-					.getNotifier(), false, true));
-			return;
-		}
-		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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductItemProvider.java
deleted file mode 100644
index a2df35e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductItemProvider.java
+++ /dev/null
@@ -1,198 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.WorkProduct} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductItemProvider extends ContentElementItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addReportsPropertyDescriptor(object);
-			addTemplatesPropertyDescriptor(object);
-			addToolMentorsPropertyDescriptor(object);
-			addEstimationConsiderationsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Reports feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addReportsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProduct_reports_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProduct_reports_feature", "_UI_WorkProduct_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT__REPORTS, true, false,
-						false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Templates feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTemplatesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProduct_templates_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProduct_templates_feature", "_UI_WorkProduct_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT__TEMPLATES, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Tool Mentors feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addToolMentorsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProduct_toolMentors_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProduct_toolMentors_feature", "_UI_WorkProduct_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT__TOOL_MENTORS, true,
-						false, false, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Estimation Considerations feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addEstimationConsiderationsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProduct_estimationConsiderations_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProduct_estimationConsiderations_feature", "_UI_WorkProduct_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns WorkProduct.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/WorkProduct")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((WorkProduct) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_WorkProduct_type") : //$NON-NLS-1$
-				getString("_UI_WorkProduct_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductTypeItemProvider.java b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductTypeItemProvider.java
deleted file mode 100644
index 67ac66a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/WorkProductTypeItemProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.common.util.ResourceLocator;
-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.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.epf.uma.WorkProductType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class WorkProductTypeItemProvider extends ContentCategoryItemProvider
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addWorkProductsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Work Products feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addWorkProductsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors
-				.add(createItemPropertyDescriptor(
-						((ComposeableAdapterFactory) adapterFactory)
-								.getRootAdapterFactory(),
-						getResourceLocator(),
-						getString("_UI_WorkProductType_workProducts_feature"), //$NON-NLS-1$
-						getString(
-								"_UI_PropertyDescriptor_description", "_UI_WorkProductType_workProducts_feature", "_UI_WorkProductType_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						UmaPackage.Literals.WORK_PRODUCT_TYPE__WORK_PRODUCTS,
-						true, false, false, null, null, null));
-	}
-
-	/**
-	 * This returns WorkProductType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage(
-				"full/obj16/WorkProductType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((WorkProductType) object).getName();
-		return label == null || label.length() == 0 ? getString("_UI_WorkProductType_type") : //$NON-NLS-1$
-				getString("_UI_WorkProductType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * 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
-	 */
-	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
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors,
-			Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return UmaEditPlugin.INSTANCE;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/package.html b/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/package.html
deleted file mode 100644
index d3f8ebc..0000000
--- a/1.5/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/provider/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides item providers for displaying and editing the UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/.classpath b/1.5/plugins/org.eclipse.epf.uma/.classpath
deleted file mode 100644
index 065ac06..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.uma/.project b/1.5/plugins/org.eclipse.epf.uma/.project
deleted file mode 100644
index 66e27fb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.uma</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.uma/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.uma/META-INF/MANIFEST.MF
deleted file mode 100644
index 627934d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.uma;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.epf.uma.ecore;visibility:=reexport
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.uma,
- org.eclipse.epf.uma.impl,
- org.eclipse.epf.uma.util
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.uma/build.properties b/1.5/plugins/org.eclipse.epf.uma/build.properties
deleted file mode 100644
index c2bafd5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               plugin.xml
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.2/uma.ecore b/1.5/plugins/org.eclipse.epf.uma/model/1.0.2/uma.ecore
deleted file mode 100644
index 4a58099..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.2/uma.ecore
+++ /dev/null
@@ -1,1214 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="uma"
-    nsURI="http://www.ibm.com/uma/1.0.2/uma.ecore" nsPrefix="com.ibm.uma">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="03"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EDataType" name="Date" instanceClassName="java.util.Date">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Data type used for attributes of meta-model classes of the type Date."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="Uri" instanceClassName="java.net.URI">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Data type used for attributes of meta-model classes that point to resources such as files."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="UnlimitedNatural" instanceClassName="int"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="String" instanceClassName="java.lang.String"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Set" instanceClassName="java.util.Set"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Sequence" instanceClassName="java.util.List"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Integer" instanceClassName="int"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Classifier" abstract="true" eSuperTypes="#//Type">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Classifier."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Type" abstract="true" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Type."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true" eSuperTypes="#//Element">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Named Element.  Defined that every element has a name."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PackageableElement" abstract="true"
-      eSuperTypes="#//NamedElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Packagable Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Package" eSuperTypes="#//Namespace #//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Package."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Namespace" abstract="true" eSuperTypes="#//NamedElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Namespace."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodElement" abstract="true" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Every class defined in this specification is derived from Method Element.  In other words Method Element is the root generalization for all UMA classes and defines a common set of attributes inherited by every other element type of this model.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.  Method Element inherits the Name attribute from Packageable Element's super class.  Every element defined as a UMA instance is derived from Model Element.  Every Method Element in-stance is at least defined by a unique id, a name, as well as brief description."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="guid" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element has a global unique id."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element shall be briefly described with one or two sentences summarizing the element."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ownedRules" ordered="false"
-        upperBound="-1" eType="#//Constraint" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="suppressed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If a Variability Element is derived from another Variability Element using the Extends Variability Specialization then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="orderingGuide" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute is used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Constraint" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Constraint is a Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="body" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute stores the definition of the constraint."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentElement" abstract="true" eSuperTypes="#//DescribableElement #//VariabilityElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Element is a Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.&#xD;&#xA;Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportingMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="conceptsAndPapers" ordered="false"
-        upperBound="-1" eType="#//Concept"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="checklists" ordered="false"
-        upperBound="-1" eType="#//Checklist"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="guidelines" ordered="false"
-        upperBound="-1" eType="#//Guideline"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="examples" ordered="false"
-        upperBound="-1" eType="#//Example"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assets" ordered="false"
-        upperBound="-1" eType="#//ReusableAsset"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescribableElement" abstract="true"
-      eSuperTypes="#//MethodElement #//Classifier">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Describable Element is an abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.&#xD;&#xA;This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance (see Section 4.1.4).  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentationName" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to &quot;rup_architecture_document&quot; to differentiate from a &quot;j2ee_architcture_document&quot; whereas the external presentation would always be &quot;Architecture Document&quot;."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentation" eType="#//ContentDescription"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shapeicon" eType="#//Uri">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nodeicon" eType="#//Uri">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used in tree browser presentations and breakdown structures."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentDescription" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Description is a Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mainDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute store the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sections" ordered="false"
-        upperBound="-1" eType="#//Section" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="keyConsiderations" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Key Considerations provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Section" eSuperTypes="#//VariabilityElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Section is a special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionName" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attributes store the description text for a Content Description's Section."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subSections" ordered="false"
-        upperBound="-1" eType="#//Section" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predecessor" eType="#//Section"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Role" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role is a content element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  &#xD;&#xA;A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="modifies" ordered="false"
-        upperBound="-1" eType="#//WorkProduct" changeable="false" volatile="true"
-        transient="true" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="responsibleFor" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProduct" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Product is an abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.&#xD;&#xA;A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimate" eType="#//Estimate"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reports" ordered="false"
-        upperBound="-1" eType="#//Report"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="templates" ordered="false"
-        upperBound="-1" eType="#//Template"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Task" eSuperTypes="#//ContentElement #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Task is a content element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.&#xD;&#xA;A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). &#xD;&#xA;A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. &#xD;&#xA;For example, a Task such as &quot;Develop Use Case Model&quot; describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the &quot;method&quot; of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performedBy" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mandatoryInput" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="output" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="additionallyPerformedBy"
-        ordered="false" upperBound="-1" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="optionalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="steps" ordered="false"
-        upperBound="-1" eType="#//Step" changeable="false" volatile="true" transient="true"
-        derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimate" eType="#//Estimate"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkDefinition" abstract="true" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Definition is an abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.&#xD;&#xA;Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="precondition" eType="#//Constraint"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="postcondition" eType="#//Constraint"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Step" eSuperTypes="#//Section #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Step is a Section and Work Definition that is used to organize Tasks into parts or subunits of work.  Steps inherit the subSections decomposition from Section and can therefore describe Sub-Steps nested into Steps.&#xD;&#xA;A Step describes a meaningful and consist part of the overall work described for a Task.  The collection of Steps defined for a Task represents all the work that should be done to achieve the overall development goal of the Task.  Not all steps are necessarily performed each time a Task is invoked in a Process (see Task Descriptor), so they can also be expressed in the form of alternate 'flows' of work.  Different ways of achieving the same development goal can then be 'assembled' by selecting different combinations of steps when applying the Task in a Process.  Typical kinds of steps a Task author should consider are: Thinking steps: where the individual roles understand the nature of the task, gathers and examines the input artifacts, and formulates the outcome. Performing steps: where the individual roles create or update some artifacts. Reviewing steps: where the individual roles inspects the results against some criteria."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guidance" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Artifact" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Artifact is a Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.&#xD;&#xA;Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might &quot;own&quot; a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="containerArtifact" eType="#//Artifact"
-        transient="true" eOpposite="#//Artifact/containedArtifacts"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="containedArtifacts" ordered="false"
-        upperBound="-1" eType="#//Artifact" containment="true" eOpposite="#//Artifact/containerArtifact"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Deliverable" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A deliverable is a Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliveredWorkProducts"
-        ordered="false" upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Outcome" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An outcome describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPackage" abstract="true" eSuperTypes="#//MethodElement #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Package is an abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="global" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reusedPackages" ordered="false"
-        upperBound="-1" eType="#//MethodPackage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="parentPackage" eType="#//MethodPackage"
-        transient="true" eOpposite="#//MethodPackage/childPackages"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childPackages" ordered="false"
-        upperBound="-1" eType="#//MethodPackage" containment="true" eOpposite="#//MethodPackage/parentPackage"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Content Package is special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentElements" ordered="false"
-        upperBound="-1" eType="#//ContentElement" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ArtifactDescription" eSuperTypes="#//WorkProductDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefOutline" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="representationOptions"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalId" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="An external visible number that is used to reference this artifact. Used like a synonym."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes why the work product is produced and to what use it will be put."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="impactOfNotHaving" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reasonsForNotNeeding" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliverableDescription" eSuperTypes="#//WorkProductDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="packagingGuidance" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="skills" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists of set of required skills a person needs to possess to fulfill that Role."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="assignmentApproaches" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="synonyms" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Task and what is intended to be achieved."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GuidanceDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="attachments" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PracticeDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="additionalInfo" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional Information not covered by the other attributes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="problem" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A description of the problem the Practice addresses."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="background" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goals" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A summary of the overall goals to be addressed by the Practice."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="application" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes how the Practice is being applied or introduced into the context described in background."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelsOfAdoption" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Point">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="x" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="y" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphElement" abstract="true" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="position" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contained" ordered="false"
-        upperBound="-1" eType="#//DiagramElement" containment="true" eOpposite="#//DiagramElement/container"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="link" ordered="false" upperBound="-1"
-        eType="#//DiagramLink" containment="true" eOpposite="#//DiagramLink/graphElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="anchorage" ordered="false"
-        upperBound="-1" eType="#//GraphConnector" containment="true" eOpposite="#//GraphConnector/graphElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="semanticModel" lowerBound="1"
-        eType="#//SemanticModelBridge" containment="true" eOpposite="#//SemanticModelBridge/graphElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DiagramElement" abstract="true" eSuperTypes="#//MethodElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isVisible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="container" eType="#//GraphElement"
-        transient="true" eOpposite="#//GraphElement/contained"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reference" ordered="false"
-        upperBound="-1" eType="#//Reference" eOpposite="#//Reference/referenced"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" ordered="false"
-        upperBound="-1" eType="#//Property" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DiagramLink" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="zoom" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewport" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" lowerBound="1"
-        eType="#//GraphElement" transient="true" eOpposite="#//GraphElement/link"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagram" lowerBound="1"
-        eType="#//Diagram" eOpposite="#//Diagram/diagramLink"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphConnector" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" lowerBound="1"
-        eType="#//GraphElement" transient="true" eOpposite="#//GraphElement/anchorage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphEdge" ordered="false"
-        upperBound="-1" eType="#//GraphEdge" eOpposite="#//GraphEdge/anchor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SemanticModelBridge" abstract="true"
-      eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentation" eType="#//String"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" eType="#//GraphElement"
-        transient="true" eOpposite="#//GraphElement/semanticModel"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagram" eType="#//Diagram"
-        transient="true" eOpposite="#//Diagram/namespace"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Dimension">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="width" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="height" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Reference" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isIndividualRepresentation"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referenced" lowerBound="1"
-        eType="#//DiagramElement" eOpposite="#//DiagramElement/reference"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Property" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="#//String"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphEdge" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="anchor" ordered="false"
-        lowerBound="2" upperBound="2" eType="#//GraphConnector" eOpposite="#//GraphConnector/graphEdge"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="waypoints" ordered="false"
-        lowerBound="2" upperBound="-1" eType="#//Point" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Diagram" eSuperTypes="#//GraphNode">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="zoom" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewpoint" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagramLink" ordered="false"
-        upperBound="-1" eType="#//DiagramLink" eOpposite="#//DiagramLink/diagram"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="namespace" lowerBound="1"
-        eType="#//SemanticModelBridge" containment="true" eOpposite="#//SemanticModelBridge/diagram"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphNode" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="size" eType="#//Dimension"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SimpleSemanticModelElement" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeInfo" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="UMASemanticModelBridge" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="element" lowerBound="1"
-        eType="#//MethodElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CoreSemanticModelBridge" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="element" lowerBound="1"
-        eType="#//Element"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LeafElement" abstract="true" eSuperTypes="#//DiagramElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="TextElement" eSuperTypes="#//LeafElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="text" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Image" eSuperTypes="#//LeafElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="#//Uri"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mimeType" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphicPrimitive" abstract="true" eSuperTypes="#//LeafElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Polyline" eSuperTypes="#//GraphicPrimitive">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="closed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="waypoints" ordered="false"
-        lowerBound="2" upperBound="-1" eType="#//Point" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Ellipse" eSuperTypes="#//GraphicPrimitive">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="radiusX" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="radiusY" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rotation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startAngle" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="endAngle" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="center" eType="#//Point"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Activity" eSuperTypes="#//WorkBreakdownElement #//VariabilityElement #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Activity is a Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.&#xD;&#xA;Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="breakdownElements" ordered="false"
-        upperBound="-1" eType="#//BreakdownElement" eOpposite="#//BreakdownElement/superActivities"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roadmaps" ordered="false"
-        upperBound="-1" eType="#//Roadmap"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportingMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="checklists" ordered="false"
-        upperBound="-1" eType="#//Checklist"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="concepts" ordered="false"
-        upperBound="-1" eType="#//Concept"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="examples" ordered="false"
-        upperBound="-1" eType="#//Example"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="guidelines" ordered="false"
-        upperBound="-1" eType="#//Guideline"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reusableAssets" ordered="false"
-        upperBound="-1" eType="#//ReusableAsset"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkBreakdownElement" abstract="true"
-      eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Breakdown Element is a special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRepeatable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOngoing" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEventDriven" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.&#xD;&#xA;&#xD;&#xA;"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="linkToPredecessor" ordered="false"
-        upperBound="-1" eType="#//WorkOrder"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElement" abstract="true" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Breakdown Element is an abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="prefix" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. &quot;SRA.Establish Requirements&quot; with SRA indicating that this Activity belongs to the &quot;Software Requirements Analysis&quot; module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, &quot;Customer.Architect&quot; would define a &quot;Customer&quot; prefix for the Role Descriptor &quot;Architect&quot; expressing that this is an architect on the customer side and not the development team side."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isPlanned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.&#xD;&#xA;&#xD;&#xA;"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hasMultipleOccurrences"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as &quot;Detail Use Case&quot; would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOptional" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The isOptional attribute indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentedAfter" eType="#//BreakdownElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentedBefore" eType="#//BreakdownElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="planningData" eType="#//PlanningData"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="superActivities" ordered="false"
-        upperBound="-1" eType="#//Activity" eOpposite="#//Activity/breakdownElements"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Milestone" eSuperTypes="#//WorkBreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Milestone describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure)."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Iteration" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Iteration is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Phase" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Phase is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TeamProfile" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Team Profile is a Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.&#xD;&#xA;Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).&#xD;&#xA;Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="teamRoles" ordered="false"
-        upperBound="-1" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="superTeam" lowerBound="1"
-        eType="#//TeamProfile" eOpposite="#//TeamProfile/subTeam"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subTeam" ordered="false"
-        upperBound="-1" eType="#//TeamProfile" eOpposite="#//TeamProfile/superTeam"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role Descriptor represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Role" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performsAdditionally" ordered="false"
-        upperBound="-1" eType="#//TaskDescriptor" eOpposite="#//TaskDescriptor/additionallyPerformedBy"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assistsIn" ordered="false"
-        upperBound="-1" eType="#//TaskDescriptor" eOpposite="#//TaskDescriptor/assistedBy"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="modifies" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" changeable="false" volatile="true"
-        transient="true" derived="true" eOpposite="#//WorkProductDescriptor/workedOnBy"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performsAsOwner" ordered="false"
-        upperBound="-1" eType="#//TaskDescriptor" eOpposite="#//TaskDescriptor/performedPrimarilyBy"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="responsibleFor" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/responsibleRole"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="WorkOrderType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Order represents a relationship between two Breakdown Element in which one Breakdown Element (referred to as (B) below) depends on the start or finish of another Breakdown Element (referred to as (A) below) in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute."/>
-    </eAnnotations>
-    <eLiterals name="finishToStart"/>
-    <eLiterals name="finishToFinish" value="1"/>
-    <eLiterals name="startToStart" value="2"/>
-    <eLiterals name="startToFinish" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkOrder" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Order is a Method Element that represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  &#xD;&#xA;(Note, Work Order is not modeled as an Association Class to provide a straightforward mapping  to XMI and EMF.)&#xD;&#xA;The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkType" eType="#//WorkOrderType"
-        defaultValueLiteral="finishToStart">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="pred" lowerBound="1" eType="#//WorkBreakdownElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessElement" abstract="true" eSuperTypes="#//DescribableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Process Element is a Describable Element that represents an abstract generalization for all elements defined in the Process package.&#xD;&#xA;Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. "/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PlanningData" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Planning Data is a Method Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.&#xD;&#xA;Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.&#xD;&#xA;(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default start date for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishDate" eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default finish date for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rank" eType="#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default rank for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Descriptor" abstract="true" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Descriptor is an abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.&#xD;&#xA;Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSynchronizedWithSource"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescriptor" eSuperTypes="#//WorkBreakdownElement #//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Task Descriptor is a Descriptor and Work Breakdown Element that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.&#xD;&#xA;A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.&#xD;&#xA;"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Task" eType="#//Task"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="additionallyPerformedBy"
-        ordered="false" upperBound="-1" eType="#//RoleDescriptor" eOpposite="#//RoleDescriptor/performsAdditionally"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assistedBy" ordered="false"
-        upperBound="-1" eType="#//RoleDescriptor" eOpposite="#//RoleDescriptor/assistsIn"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/externalInputTo"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mandatoryInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/mandatoryInputTo"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="optionalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/OptionalInputTo"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="output" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/outputFrom"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performedPrimarilyBy" eType="#//RoleDescriptor"
-        eOpposite="#//RoleDescriptor/performsAsOwner"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="selectedSteps" ordered="false"
-        upperBound="-1" eType="#//Section"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Product Descriptor represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityEntryState" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  &#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityExitState" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).&#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="WorkProduct" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalInputTo" ordered="false"
-        upperBound="-1" eType="#//TaskDescriptor" eOpposite="#//TaskDescriptor/externalInput"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="impactedBy" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/impacts"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="impacts" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/impactedBy"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mandatoryInputTo" ordered="false"
-        upperBound="-1" eType="#//TaskDescriptor" eOpposite="#//TaskDescriptor/mandatoryInput"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workedOnBy" ordered="false"
-        upperBound="-1" eType="#//RoleDescriptor" changeable="false" volatile="true"
-        transient="true" derived="true" eOpposite="#//RoleDescriptor/modifies"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="OptionalInputTo" ordered="false"
-        upperBound="-1" eType="#//TaskDescriptor" eOpposite="#//TaskDescriptor/optionalInput"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outputFrom" ordered="false"
-        upperBound="-1" eType="#//TaskDescriptor" eOpposite="#//TaskDescriptor/output"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliverableParts" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="responsibleRole" eType="#//RoleDescriptor"
-        eOpposite="#//RoleDescriptor/responsibleFor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CompositeRole" eSuperTypes="#//RoleDescriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Composite Role is a special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.&#xD;&#xA;A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="aggregatedRoles" ordered="false"
-        upperBound="-1" eType="#//Role"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElementDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageGuidance" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="howtoStaff" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcessDescription" eSuperTypes="#//ProcessDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scale" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectCharacteristics"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Characterizes the project that would typically perform this Process"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="riskLevel" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines typical project risks that are addressed with this process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimatingTechnique" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the Estimation Techniques provided for this Process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectMemberExpertise"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeOfContract" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background information about the contracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessDescription" eSuperTypes="#//ActivityDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalId" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="An external visible number that is used to reference this delivery patterns and models. It is used like a synonym."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scope" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the scope of the Process, i.e. which types of projects does it address and which not."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageNotes" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional notes on how to apply and instantiate this process for a project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescriptorDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="refinedDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. "/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Concept" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Concept is a specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Checklist" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Checklist is a specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. "/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Example" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Example is a specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guideline" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Guideline is a specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Estimate" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Estimate is a specific type of Guidance that provides sizing measures, or standards for sizing the work effort associated with performing a particular piece of work and instructions for their successful use. It may be comprised of estimation considerations and estimation metrics."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimationMetric" eType="#//EstimatingMetric"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimationConderations"
-        eType="#//EstimationConsiderations" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EstimatingMetric" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Estimation Metric describes a metric or measure that is associated with an element and which is used to calculate the size of the work effort as well as a range of potential labor."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EstimationConsiderations" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Estimation Considerations qualify the usage and application of estimation metrics in the development of an actual estimate."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Report" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Report is a predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Template" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Template is a specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SupportingMaterial" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Supporting Materials is catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ToolMentor" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Tool Mentor is a specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Whitepaper" eSuperTypes="#//Concept">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Whitepapers are a special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TermDefinition" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="TermDefinitions define concepts and are used to build up the Glossary. They are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Practice" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Practice represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be &quot;Manage Risks&quot;, &quot;Continuously verify quality&quot;, &quot;Architecture-centric and component-based development&quot;, etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subPractices" ordered="false"
-        upperBound="-1" eType="#//Practice" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentReferences" ordered="false"
-        upperBound="-1" eType="#//ContentElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="activityReferences" ordered="false"
-        upperBound="-1" eType="#//Activity"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReusableAsset" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Reusable Asset provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing&#xD;&#xA;how the asset should be used."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Discipline" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Discipline is a categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.&#xD;&#xA;A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tasks" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//Task"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referenceWorkflows" ordered="false"
-        upperBound="-1" eType="#//Activity"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentCategory" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Category is an abstract class generalizing content category types."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSet" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role Set organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the &quot;Analysts&quot; Role Set could group the &quot;Business Process Analyst&quot;, &quot;System Analyst&quot;, as well as &quot;Requirements Specifier&quot; roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roles" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//Role"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Domain" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Domain is a refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.&#xD;&#xA;Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workProducts" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subdomains" ordered="false"
-        upperBound="-1" eType="#//Domain" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductType" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Product Type is a second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is &quot;Class Diagram&quot;, which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or &quot;Specification&quot;, which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workProducts" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisciplineGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Discipline Groupings are used to group Disciplines.  For example, the Discipline Grouping &quot;Software Disciplines&quot; would be the group of all disciplines related to developing software such as &quot;Requirements Management&quot; or &quot;Testing&quot;; &quot;IT Infrastructure Management&quot; would be a Disciplines Grouping for disciplines such as &quot;IT Operational Services&quot;, &quot;IT Customer Relationships&quot;, or &quot;IT Enabling Services&quot;.  Disciplines can be associated to more than one Discipline Grouping."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="disciplines" ordered="false"
-        upperBound="-1" eType="#//Discipline"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Tool" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Tool is a container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//ToolMentor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSetGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roleSets" ordered="false"
-        upperBound="-1" eType="#//RoleSet"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CustomCategory" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Custom Category is a category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a &quot;Testing&quot; category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="categorizedElements" ordered="false"
-        upperBound="-1" eType="#//DescribableElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subCategories" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcess" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Delivery Processes is a special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.&#xD;&#xA;A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="educationMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="communicationsMaterials"
-        ordered="false" upperBound="-1" eType="#//SupportingMaterial"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Process" abstract="true" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process is a special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.&#xD;&#xA;Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="includesPatterns" ordered="false"
-        upperBound="-1" eType="#//CapabilityPattern"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultContext" lowerBound="1"
-        eType="#//MethodConfiguration"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validContext" ordered="false"
-        upperBound="-1" eType="#//MethodConfiguration"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CapabilityPattern" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Capability Pattern is a special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.&#xD;&#xA;A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:&#xD;&#xA;- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.&#xD;&#xA;- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).&#xD;&#xA;- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPlanningTemplate" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Planning Template is a special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).&#xD;&#xA;A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="basedOnProcesses" ordered="false"
-        upperBound="-1" eType="#//Process"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Roadmap" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Roadmap is a special Guidance Type which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.&#xD;&#xA;An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponent" eSuperTypes="#//ProcessPackage #//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component is a special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).&#xD;&#xA;UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a &quot;black box&quot;.  At any point during a project the component &quot;realization&quot; detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaces" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//ProcessComponentInterface"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="process" lowerBound="1"
-        eType="#//Process" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Process Package is a special Method Package that contains Process Elements, only.&#xD;&#xA;A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="processElements" ordered="false"
-        upperBound="-1" eType="#//ProcessElement" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagrams" ordered="false"
-        upperBound="-1" eType="#//Diagram" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponentInterface" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component Interface comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceSpecifications"
-        ordered="false" upperBound="-1" eType="#//TaskDescriptor" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceIO" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponentDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component Descriptor represents a Process Component application in a Process, i.e. the breakdown structure defining the Process.  The Process Component Descriptor is used to encapsulate the details of the component in a breakdown structure and to provide its own set of relationships such as it own predecessors and successors."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ProcessComponent" lowerBound="1"
-        eType="#//ProcessComponent"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPlugin" eSuperTypes="#//MethodUnit #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Plugin is a Method Element that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.&#xD;&#xA;Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.&#xD;&#xA;Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="userChangeable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackages" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//MethodPackage" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="bases" ordered="false"
-        upperBound="-1" eType="#//MethodPlugin"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VariabilityElement" abstract="true"
-      eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Variability Element is an abstract class derived from Method Element that provides new capabilities for content variation and extension to Content Elements or any other Method Element that derives from it.  It has been placed in-between the classes Method Element and Content Element in the overall UMA taxonomy of classes using the UML 2.0 package merge mechanism.  The association Variability Specialization shall only be instantiated between two subclasses of Variability Element of the same type.  The element on varaibilitySpecialElement side of the relationship defines a value for the attribute variabilityType defining the nature of the relationship using a literal from the enumeration Variability Type.&#xD;&#xA;Variability Element of the meta-model package Method Plugins adds the capabilities of variation and extension to Method Elements that derive from it.  By default all Content Elements such as Role, Task, Guidance Types, or Activities are defined to be Variability Elements.&#xD;&#xA;Variability and extension provides unique mechanisms for customizing method content without actually directly modifying the original content, but by just be able to describe with separate objects the differences (additions, changes, omissions) relative to the original.  This plug-in concept allows users to factor their method content and processes in interrelated units and even to architect method content and processes in layers that extend each other with new capabilities.  The resulting method and process design can be dynamically combined and applied on demand using the interpretation rules defined for Variability Element Specializations assembling to process practitioners the most accurate method and process descriptions possible.  It also allows process practitioners to extends and tailor method content and processes they do not own and to easily upgrade to newer versions by simply reapply their personal changes to these upgrades.&#xD;&#xA;Variability Element defines two types of variability and one type of extension which are formally defined for the enumeration Variability Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityType" eType="#//VariabilityType"
-        defaultValueLiteral="na">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If in instance of the variabilitySpecialization association between two Variability Elements of the same type exists, then the variabilityType attribute specifies how the element at the variabilitySpecialElement end of the association changes the Content Element at the variabilityBasedOnElement end. See the Variability Type enumeration class for definitions for the different types of variability."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variabilityBasedOnElement"
-        lowerBound="1" eType="#//VariabilityElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="VariabilityType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Variability Type is an Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type."/>
-    </eAnnotations>
-    <eLiterals name="na"/>
-    <eLiterals name="contributes" value="1"/>
-    <eLiterals name="extends" value="2"/>
-    <eLiterals name="replaces" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessContribution" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Contribution is a special Process that externally defines additions and changes to an existing Process without directly modifying the existing Process.  It achieves this by describing these additions and changes in a separate Process structure.  This structure's elements relate to the other Process' elements using Contributes and Replace Variability Specializations.  Process Contributions are normally packaged with Method Plugins that extend existing Method Plugin with new capabilities.&#xD;&#xA;A Process Contribution is a special Process that applies the semantics of the Contributes and Replaces Variability Specialization on Processes.  A Process Contribution is a kind of 'process plug-in' that 'plugs' additional breakdown structures into an exiting process and therefore updates it a-posteriori with new or changed capabilities.  Typical applications of Process Contributions are Method Plugins that add content from specific areas to an existing domain.  In addition to just contributing new method content to content elements such as Task and Work Products, Process Contributions can also define where in the Processes that have been defined with this method content those new additions should be applied.  Moreover, it allows defining whole new or changed Activities within these processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseProcess" lowerBound="1"
-        eType="#//Process"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodUnit" abstract="true" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Unit is a special Method Element that shall be maintained in a Method Library as a separate unit of control."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="authors" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Method Unit is being created and owned by an author or authoring team."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDate" eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date the last change that resulted into this version has been made."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the last change that resulted into this version."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Package has a version number used to track changes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="copyrightStatement" lowerBound="1"
-        eType="#//SupportingMaterial"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodConfiguration" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Configuration is a collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPluginSelection"
-        ordered="false" lowerBound="1" upperBound="-1" eType="#//MethodPlugin"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackageSelection"
-        ordered="false" lowerBound="1" upperBound="-1" eType="#//MethodPackage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="processViews" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultView" lowerBound="1"
-        eType="#//ContentCategory"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseConfigurations" ordered="false"
-        upperBound="-1" eType="#//MethodConfiguration"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessFamily" eSuperTypes="#//MethodConfiguration">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Delivery Model Family is a convenient grouping of Delivery Processes and Capability Patterns of interest to some specific user community."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliveryProcesses" ordered="false"
-        upperBound="-1" eType="#//DeliveryProcess"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodLibrary" eSuperTypes="#//MethodUnit #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPlugins" ordered="false"
-        upperBound="-1" eType="#//MethodPlugin" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predefinedConfigurations"
-        ordered="false" upperBound="-1" eType="#//MethodConfiguration" containment="true"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.2/uma.genmodel b/1.5/plugins/org.eclipse.epf.uma/model/1.0.2/uma.genmodel
deleted file mode 100644
index ca69058..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.2/uma.genmodel
+++ /dev/null
@@ -1,466 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="IBM Rational Software"
-    modelDirectory="/com.ibm.uma/src" editDirectory="/com.ibm.uma.edit/src" editorDirectory="/com.ibm.uma.editor/src"
-    modelPluginID="com.ibm.uma" templateDirectory="/com.ibm.uma.ecore/templates" runtimeJar="true"
-    dynamicTemplates="true" modelName="Uma" editPluginClass="com.ibm.uma.provider.UmaEditPlugin"
-    editorPluginClass="com.ibm.uma.presentation.UmaEditorPlugin" nonNLSMarkers="true"
-    rootExtendsInterface="org.eclipse.emf.ecore.sdo.EDataObject" rootExtendsClass="com.ibm.umaf.ecore.impl.MultiResourceEObject"
-    rootImplementsInterface="org.eclipse.emf.ecore.sdo.InternalEDataObject" suppressEMFTypes="true"
-    featureMapWrapperInterface="commonj.sdo.Sequence" featureMapWrapperInternalInterface="org.eclipse.emf.ecore.sdo.util.ESequence"
-    featureMapWrapperClass="org.eclipse.emf.ecore.sdo.util.BasicESequence">
-  <foreignModel>C:\Home\phTNG\TNG_docs\OOAD\ContentArchitecture\Models\UMA02\UnifiedMethodArchitecture.mdl</foreignModel>
-  <staticPackages>http://www.eclipse.org/emf/2003/SDO</staticPackages>
-  <modelPluginVariables>EMF_COMMONJ_SDO=org.eclipse.emf.commonj.sdo</modelPluginVariables>
-  <modelPluginVariables>EMF_ECORE_SDO=org.eclipse.emf.ecore.sdo</modelPluginVariables>
-  <genPackages prefix="Uma" basePackage="com.ibm" disposableProviderFactory="true"
-      ecorePackage="uma.ecore#/">
-    <genEnums ecoreEnum="uma.ecore#//WorkOrderType">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/finishToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/finishToFinish"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/startToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/startToFinish"/>
-    </genEnums>
-    <genEnums ecoreEnum="uma.ecore#//VariabilityType">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/na"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/contributes"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/extends"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/replaces"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="uma.ecore#//Date"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Uri"/>
-    <genDataTypes ecoreDataType="uma.ecore#//UnlimitedNatural"/>
-    <genDataTypes ecoreDataType="uma.ecore#//String"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Set"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Sequence"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Integer"/>
-    <genClasses ecoreClass="uma.ecore#//Classifier"/>
-    <genClasses ecoreClass="uma.ecore#//Type"/>
-    <genClasses ecoreClass="uma.ecore#//Element"/>
-    <genClasses ecoreClass="uma.ecore#//NamedElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//NamedElement/name"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PackageableElement"/>
-    <genClasses ecoreClass="uma.ecore#//Package"/>
-    <genClasses ecoreClass="uma.ecore#//Namespace"/>
-    <genClasses ecoreClass="uma.ecore#//MethodElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/guid"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/briefDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodElement/ownedRules"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/suppressed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/orderingGuide"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Constraint">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Constraint/body"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentElement">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/supportingMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/conceptsAndPapers"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/checklists"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/guidelines"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/examples"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/assets"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DescribableElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/presentationName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DescribableElement/presentation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/shapeicon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/nodeicon"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ContentDescription/mainDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ContentDescription/sections"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ContentDescription/keyConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Section">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Section/sectionName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Section/sectionDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Section/subSections"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Section/predecessor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Role">
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Role/modifies"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Role/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProduct">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/estimate"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/reports"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/templates"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/toolMentors"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Task">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/performedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/mandatoryInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/output"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/additionallyPerformedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/optionalInput"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/steps"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/toolMentors"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Task/estimate"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkDefinition">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//WorkDefinition/precondition"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//WorkDefinition/postcondition"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Step"/>
-    <genClasses ecoreClass="uma.ecore#//Guidance"/>
-    <genClasses ecoreClass="uma.ecore#//Artifact">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Artifact/containerArtifact"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Artifact/containedArtifacts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Deliverable">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Deliverable/deliveredWorkProducts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Outcome"/>
-    <genClasses ecoreClass="uma.ecore#//MethodPackage">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodPackage/global"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/reusedPackages"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/parentPackage"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/childPackages"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ContentPackage/contentElements"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ArtifactDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/briefOutline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/representationOptions"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/externalId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/impactOfNotHaving"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/reasonsForNotNeeding"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliverableDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliverableDescription/externalDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliverableDescription/packagingGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/skills"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/assignmentApproaches"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/synonyms"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//TaskDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TaskDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TaskDescription/alternatives"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GuidanceDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//GuidanceDescription/attachments"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PracticeDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/additionalInfo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/problem"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/background"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/goals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/application"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/levelsOfAdoption"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Point">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Point/x"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Point/y"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/position"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/contained"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/link"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/anchorage"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/semanticModel"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DiagramElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DiagramElement/isVisible"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/container"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/reference"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/property"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DiagramLink">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DiagramLink/zoom"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/viewport"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/graphElement"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/diagram"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphConnector">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphConnector/graphElement"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphConnector/graphEdge"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//SemanticModelBridge">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//SemanticModelBridge/presentation"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//SemanticModelBridge/graphElement"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//SemanticModelBridge/diagram"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Dimension">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Dimension/width"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Dimension/height"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Reference">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Reference/isIndividualRepresentation"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Reference/referenced"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Property">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Property/key"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Property/value"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphEdge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphEdge/anchor"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphEdge/waypoints"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Diagram">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Diagram/zoom"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Diagram/viewpoint"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Diagram/diagramLink"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Diagram/namespace"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphNode">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphNode/size"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//SimpleSemanticModelElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//SimpleSemanticModelElement/typeInfo"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//UMASemanticModelBridge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//UMASemanticModelBridge/element"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CoreSemanticModelBridge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CoreSemanticModelBridge/element"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//LeafElement"/>
-    <genClasses ecoreClass="uma.ecore#//TextElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TextElement/text"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Image">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Image/uri"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Image/mimeType"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphicPrimitive"/>
-    <genClasses ecoreClass="uma.ecore#//Polyline">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Polyline/closed"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Polyline/waypoints"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Ellipse">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/radiusX"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/radiusY"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/rotation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/startAngle"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/endAngle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Ellipse/center"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Activity">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/breakdownElements"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/roadmaps"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/supportingMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/checklists"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/concepts"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/examples"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/guidelines"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/reusableAssets"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkBreakdownElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isRepeatable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isOngoing"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isEventDriven"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkBreakdownElement/linkToPredecessor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//BreakdownElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/prefix"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/isPlanned"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/hasMultipleOccurrences"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/isOptional"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/presentedAfter"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/presentedBefore"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/planningData"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/superActivities"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Milestone"/>
-    <genClasses ecoreClass="uma.ecore#//Iteration"/>
-    <genClasses ecoreClass="uma.ecore#//Phase"/>
-    <genClasses ecoreClass="uma.ecore#//TeamProfile">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/teamRoles"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/superTeam"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/subTeam"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/Role"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/performsAdditionally"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/assistsIn"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/modifies"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/performsAsOwner"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkOrder">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkOrder/linkType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkOrder/pred"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessElement"/>
-    <genClasses ecoreClass="uma.ecore#//PlanningData">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/startDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/finishDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/rank"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Descriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Descriptor/isSynchronizedWithSource"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//TaskDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/Task"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/additionallyPerformedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/assistedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/externalInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/mandatoryInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/optionalInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/output"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/performedPrimarilyBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/selectedSteps"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescriptor/activityEntryState"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescriptor/activityExitState"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/WorkProduct"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/externalInputTo"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/impactedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/impacts"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/mandatoryInputTo"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/workedOnBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/OptionalInputTo"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/outputFrom"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/deliverableParts"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/responsibleRole"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CompositeRole">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CompositeRole/aggregatedRoles"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//BreakdownElementDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElementDescription/usageGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ActivityDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/alternatives"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/howtoStaff"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliveryProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/scale"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/projectCharacteristics"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/riskLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/estimatingTechnique"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/projectMemberExpertise"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/typeOfContract"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/externalId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/scope"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/usageNotes"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DescriptorDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescriptorDescription/refinedDescription"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Concept"/>
-    <genClasses ecoreClass="uma.ecore#//Checklist"/>
-    <genClasses ecoreClass="uma.ecore#//Example"/>
-    <genClasses ecoreClass="uma.ecore#//Guideline"/>
-    <genClasses ecoreClass="uma.ecore#//Estimate">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Estimate/estimationMetric"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Estimate/estimationConderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//EstimatingMetric"/>
-    <genClasses ecoreClass="uma.ecore#//EstimationConsiderations"/>
-    <genClasses ecoreClass="uma.ecore#//Report"/>
-    <genClasses ecoreClass="uma.ecore#//Template"/>
-    <genClasses ecoreClass="uma.ecore#//SupportingMaterial"/>
-    <genClasses ecoreClass="uma.ecore#//ToolMentor"/>
-    <genClasses ecoreClass="uma.ecore#//Whitepaper"/>
-    <genClasses ecoreClass="uma.ecore#//TermDefinition"/>
-    <genClasses ecoreClass="uma.ecore#//Practice">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Practice/subPractices"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Practice/contentReferences"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Practice/activityReferences"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ReusableAsset"/>
-    <genClasses ecoreClass="uma.ecore#//Discipline">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Discipline/tasks"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Discipline/referenceWorkflows"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentCategory"/>
-    <genClasses ecoreClass="uma.ecore#//RoleSet">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleSet/roles"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Domain">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Domain/workProducts"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Domain/subdomains"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductType">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductType/workProducts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DisciplineGrouping">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DisciplineGrouping/disciplines"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Tool">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Tool/toolMentors"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleSetGrouping">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleSetGrouping/roleSets"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CustomCategory">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CustomCategory/categorizedElements"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CustomCategory/subCategories"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliveryProcess">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DeliveryProcess/educationMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DeliveryProcess/communicationsMaterials"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Process">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/includesPatterns"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/defaultContext"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/validContext"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CapabilityPattern"/>
-    <genClasses ecoreClass="uma.ecore#//ProcessPlanningTemplate">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessPlanningTemplate/basedOnProcesses"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Roadmap"/>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponent">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponent/interfaces"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponent/process"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessPackage/processElements"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessPackage/diagrams"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponentInterface">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentInterface/interfaceSpecifications"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentInterface/interfaceIO"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponentDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentDescriptor/ProcessComponent"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodPlugin">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodPlugin/userChangeable"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodPlugin/methodPackages"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPlugin/bases"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//VariabilityElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//VariabilityElement/variabilityType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//VariabilityElement/variabilityBasedOnElement"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessContribution">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessContribution/baseProcess"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodUnit">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/authors"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/changeDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/changeDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/version"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodUnit/copyrightStatement"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodConfiguration">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/methodPluginSelection"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/methodPackageSelection"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/processViews"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/defaultView"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/baseConfigurations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessFamily">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessFamily/deliveryProcesses"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodLibrary">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodLibrary/methodPlugins"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodLibrary/predefinedConfigurations"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/properties.txt b/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/properties.txt
deleted file mode 100644
index 6fb3f9c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/properties.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Non-NLS Markers:	true
-Containment Proxies:	true
-Suppress EMF Metadata:	false
-Root Extends Class:	org.eclipse.epf.uma.ecore.impl.MultiResourceEObject
-Root Extends Interface:	org.eclipse.epf.uma.ecore.IModelObject
-Code Formatting:	true
-Dynamic Templates:	true
-Template Directory:	/org.eclipse.epf.uma.ecore/templates
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/uma.ecore b/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/uma.ecore
deleted file mode 100644
index 9dc5770..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/uma.ecore
+++ /dev/null
@@ -1,1229 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="uma"
-    nsURI="http://www.eclipse.org/epf/uma/1.0.3/uma.ecore" nsPrefix="org.eclipse.epf.uma">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="03"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EDataType" name="Date" instanceClassName="java.util.Date">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Data type used for attributes of meta-model classes of the type Date."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="Uri" instanceClassName="java.net.URI">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Data type used for attributes of meta-model classes that point to resources such as files."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="UnlimitedNatural" instanceClassName="int"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="String" instanceClassName="java.lang.String"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Set" instanceClassName="java.util.Set"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Sequence" instanceClassName="java.util.List"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Integer" instanceClassName="int"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Float" instanceClassName="java.lang.Float"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Classifier" abstract="true" eSuperTypes="#//Type">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Classifier."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Type" abstract="true" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Type."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true" eSuperTypes="#//Element">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Named Element.  Defined that every element has a name."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PackageableElement" abstract="true"
-      eSuperTypes="#//NamedElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Packagable Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Package" eSuperTypes="#//Namespace #//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Package."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Namespace" abstract="true" eSuperTypes="#//NamedElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Namespace."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodElement" abstract="true" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Every class defined in this specification is derived from Method Element.  In other words Method Element is the root generalization for all UMA classes and defines a common set of attributes inherited by every other element type of this model.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.  Method Element inherits the Name attribute from Packageable Element's super class.  Every element defined as a UMA instance is derived from Model Element.  Every Method Element in-stance is at least defined by a unique id, a name, as well as brief description."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="guid" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element has a global unique id."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefDescription" unique="false"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element shall be briefly described with one or two sentences summarizing the element."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ownedRules" ordered="false"
-        upperBound="-1" eType="#//Constraint" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="suppressed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If a Variability Element is derived from another Variability Element using the Extends Variability Specialization then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="orderingGuide" unique="false"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute is used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Constraint" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Constraint is a Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="body" unique="false" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute stores the definition of the constraint."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentElement" abstract="true" eSuperTypes="#//DescribableElement #//VariabilityElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Element is a Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.&#xD;&#xA;Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportingMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="conceptsAndPapers" ordered="false"
-        upperBound="-1" eType="#//Concept"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="checklists" ordered="false"
-        upperBound="-1" eType="#//Checklist"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="guidelines" ordered="false"
-        upperBound="-1" eType="#//Guideline"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="examples" ordered="false"
-        upperBound="-1" eType="#//Example"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assets" ordered="false"
-        upperBound="-1" eType="#//ReusableAsset"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescribableElement" abstract="true"
-      eSuperTypes="#//MethodElement #//Classifier">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Describable Element is an abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.&#xD;&#xA;This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance (see Section 4.1.4).  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentationName" unique="false"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to &quot;rup_architecture_document&quot; to differentiate from a &quot;j2ee_architcture_document&quot; whereas the external presentation would always be &quot;Architecture Document&quot;."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentation" eType="#//ContentDescription"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shapeicon" unique="false"
-        eType="#//Uri">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nodeicon" eType="#//Uri">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used in tree browser presentations and breakdown structures."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentDescription" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Description is a Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mainDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute store the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sections" ordered="false"
-        upperBound="-1" eType="#//Section" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="keyConsiderations" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Key Considerations provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Section" eSuperTypes="#//VariabilityElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Section is a special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionName" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attributes store the description text for a Content Description's Section."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subSections" ordered="false"
-        upperBound="-1" eType="#//Section" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predecessor" eType="#//Section"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Role" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role is a content element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  &#xD;&#xA;A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="modifies" ordered="false"
-        upperBound="-1" eType="#//WorkProduct" changeable="false" volatile="true"
-        transient="true" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="responsibleFor" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProduct" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Product is an abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.&#xD;&#xA;A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reports" ordered="false"
-        upperBound="-1" eType="#//Report"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="templates" ordered="false"
-        upperBound="-1" eType="#//Template"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimationConsiderations"
-        ordered="false" upperBound="-1" eType="#//EstimationConsiderations"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Task" eSuperTypes="#//ContentElement #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Task is a content element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.&#xD;&#xA;A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). &#xD;&#xA;A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. &#xD;&#xA;For example, a Task such as &quot;Develop Use Case Model&quot; describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the &quot;method&quot; of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performedBy" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mandatoryInput" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="output" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="additionallyPerformedBy"
-        ordered="false" upperBound="-1" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="optionalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="steps" ordered="false"
-        upperBound="-1" eType="#//Step" changeable="false" volatile="true" transient="true"
-        derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimationConsiderations"
-        ordered="false" upperBound="-1" eType="#//EstimationConsiderations"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkDefinition" abstract="true" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Definition is an abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.&#xD;&#xA;Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="precondition" eType="#//Constraint"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="postcondition" eType="#//Constraint"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Step" eSuperTypes="#//Section #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Step is a Section and Work Definition that is used to organize Tasks into parts or subunits of work.  Steps inherit the subSections decomposition from Section and can therefore describe Sub-Steps nested into Steps.&#xD;&#xA;A Step describes a meaningful and consist part of the overall work described for a Task.  The collection of Steps defined for a Task represents all the work that should be done to achieve the overall development goal of the Task.  Not all steps are necessarily performed each time a Task is invoked in a Process (see Task Descriptor), so they can also be expressed in the form of alternate 'flows' of work.  Different ways of achieving the same development goal can then be 'assembled' by selecting different combinations of steps when applying the Task in a Process.  Typical kinds of steps a Task author should consider are: Thinking steps: where the individual roles understand the nature of the task, gathers and examines the input artifacts, and formulates the outcome. Performing steps: where the individual roles create or update some artifacts. Reviewing steps: where the individual roles inspects the results against some criteria."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guidance" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Artifact" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Artifact is a Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.&#xD;&#xA;Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might &quot;own&quot; a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="containerArtifact" eType="#//Artifact"
-        transient="true" eOpposite="#//Artifact/containedArtifacts"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="containedArtifacts" ordered="false"
-        upperBound="-1" eType="#//Artifact" containment="true" eOpposite="#//Artifact/containerArtifact"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Deliverable" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A deliverable is a Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliveredWorkProducts"
-        ordered="false" upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Outcome" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An outcome describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPackage" abstract="true" eSuperTypes="#//MethodElement #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Package is an abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="global" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reusedPackages" ordered="false"
-        upperBound="-1" eType="#//MethodPackage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childPackages" ordered="false"
-        upperBound="-1" eType="#//MethodPackage" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Content Package is special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentElements" ordered="false"
-        upperBound="-1" eType="#//ContentElement" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ArtifactDescription" eSuperTypes="#//WorkProductDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefOutline" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="representationOptions"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalId" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="An external visible number that is used to reference this artifact. Used like a synonym."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes why the work product is produced and to what use it will be put."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="impactOfNotHaving" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reasonsForNotNeeding" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliverableDescription" eSuperTypes="#//WorkProductDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="packagingGuidance" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="skills" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists of set of required skills a person needs to possess to fulfill that Role."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="assignmentApproaches" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="synonyms" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Task and what is intended to be achieved."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GuidanceDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="attachments" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PracticeDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="additionalInfo" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional Information not covered by the other attributes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="problem" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A description of the problem the Practice addresses."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="background" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goals" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A summary of the overall goals to be addressed by the Practice."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="application" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes how the Practice is being applied or introduced into the context described in background."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelsOfAdoption" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Point">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="x" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="y" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphElement" abstract="true" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="position" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contained" ordered="false"
-        upperBound="-1" eType="#//DiagramElement" containment="true" eOpposite="#//DiagramElement/container"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="link" ordered="false" upperBound="-1"
-        eType="#//DiagramLink" containment="true" eOpposite="#//DiagramLink/graphElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="anchorage" ordered="false"
-        upperBound="-1" eType="#//GraphConnector" containment="true" eOpposite="#//GraphConnector/graphElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="semanticModel" unique="false"
-        eType="#//SemanticModelBridge" containment="true" eOpposite="#//SemanticModelBridge/graphElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DiagramElement" abstract="true" eSuperTypes="#//MethodElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isVisible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="container" eType="#//GraphElement"
-        transient="true" eOpposite="#//GraphElement/contained"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reference" ordered="false"
-        upperBound="-1" eType="#//Reference" eOpposite="#//Reference/referenced"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" ordered="false"
-        upperBound="-1" eType="#//Property" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DiagramLink" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="zoom" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewport" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" lowerBound="1"
-        eType="#//GraphElement" transient="true" eOpposite="#//GraphElement/link"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagram" lowerBound="1"
-        eType="#//Diagram" eOpposite="#//Diagram/diagramLink"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphConnector" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" lowerBound="1"
-        eType="#//GraphElement" transient="true" eOpposite="#//GraphElement/anchorage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphEdge" ordered="false"
-        upperBound="-1" eType="#//GraphEdge" eOpposite="#//GraphEdge/anchor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SemanticModelBridge" abstract="true"
-      eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentation" eType="#//String"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" eType="#//GraphElement"
-        transient="true" eOpposite="#//GraphElement/semanticModel"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagram" eType="#//Diagram"
-        transient="true" eOpposite="#//Diagram/namespace"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Dimension">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="width" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="height" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Reference" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isIndividualRepresentation"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referenced" lowerBound="1"
-        eType="#//DiagramElement" eOpposite="#//DiagramElement/reference"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Property" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="#//String"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphEdge" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="anchor" ordered="false"
-        upperBound="2" eType="#//GraphConnector" eOpposite="#//GraphConnector/graphEdge"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="waypoints" ordered="false"
-        upperBound="-1" eType="#//Point" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Diagram" eSuperTypes="#//GraphNode">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="zoom" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewpoint" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagramLink" ordered="false"
-        upperBound="-1" eType="#//DiagramLink" eOpposite="#//DiagramLink/diagram"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="namespace" unique="false"
-        eType="#//SemanticModelBridge" containment="true" eOpposite="#//SemanticModelBridge/diagram"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphNode" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="size" eType="#//Dimension"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SimpleSemanticModelElement" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeInfo" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="UMASemanticModelBridge" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="element" eType="#//MethodElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CoreSemanticModelBridge" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="element" lowerBound="1"
-        eType="#//Element"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LeafElement" abstract="true" eSuperTypes="#//DiagramElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="TextElement" eSuperTypes="#//LeafElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="text" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Image" eSuperTypes="#//LeafElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="#//Uri"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mimeType" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphicPrimitive" abstract="true" eSuperTypes="#//LeafElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Polyline" eSuperTypes="#//GraphicPrimitive">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="closed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="waypoints" ordered="false"
-        lowerBound="2" upperBound="-1" eType="#//Point" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Ellipse" eSuperTypes="#//GraphicPrimitive">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="radiusX" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="radiusY" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rotation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startAngle" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="endAngle" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="center" eType="#//Point"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Activity" eSuperTypes="#//WorkBreakdownElement #//VariabilityElement #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Activity is a Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.&#xD;&#xA;Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="breakdownElements" ordered="false"
-        upperBound="-1" eType="#//BreakdownElement" eOpposite="#//BreakdownElement/superActivities"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roadmaps" ordered="false"
-        upperBound="-1" eType="#//Roadmap"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportingMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="checklists" ordered="false"
-        upperBound="-1" eType="#//Checklist"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="concepts" ordered="false"
-        upperBound="-1" eType="#//Concept"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="examples" ordered="false"
-        upperBound="-1" eType="#//Example"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="guidelines" ordered="false"
-        upperBound="-1" eType="#//Guideline"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reusableAssets" ordered="false"
-        upperBound="-1" eType="#//ReusableAsset"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEnactable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkBreakdownElement" abstract="true"
-      eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Breakdown Element is a special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRepeatable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOngoing" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEventDriven" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.&#xD;&#xA;&#xD;&#xA;"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="linkToPredecessor" ordered="false"
-        upperBound="-1" eType="#//WorkOrder"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElement" abstract="true" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Breakdown Element is an abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="prefix" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. &quot;SRA.Establish Requirements&quot; with SRA indicating that this Activity belongs to the &quot;Software Requirements Analysis&quot; module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, &quot;Customer.Architect&quot; would define a &quot;Customer&quot; prefix for the Role Descriptor &quot;Architect&quot; expressing that this is an architect on the customer side and not the development team side."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isPlanned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.&#xD;&#xA;&#xD;&#xA;"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hasMultipleOccurrences"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as &quot;Detail Use Case&quot; would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOptional" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The isOptional attribute indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentedAfter" eType="#//BreakdownElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentedBefore" eType="#//BreakdownElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="planningData" eType="#//PlanningData"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="superActivities" eType="#//Activity"
-        eOpposite="#//Activity/breakdownElements"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Milestone" eSuperTypes="#//WorkBreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Milestone describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure)."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Iteration" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Iteration is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Phase" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Phase is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TeamProfile" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Team Profile is a Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.&#xD;&#xA;Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).&#xD;&#xA;Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="teamRoles" ordered="false"
-        upperBound="-1" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="superTeam" lowerBound="1"
-        eType="#//TeamProfile" eOpposite="#//TeamProfile/subTeam"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subTeam" ordered="false"
-        upperBound="-1" eType="#//TeamProfile" eOpposite="#//TeamProfile/superTeam"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role Descriptor represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Role" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="modifies" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" changeable="false" volatile="true"
-        transient="true" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="responsibleFor" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="WorkOrderType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Order represents a relationship between two Breakdown Element in which one Breakdown Element (referred to as (B) below) depends on the start or finish of another Breakdown Element (referred to as (A) below) in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute."/>
-    </eAnnotations>
-    <eLiterals name="finishToStart"/>
-    <eLiterals name="finishToFinish" value="1"/>
-    <eLiterals name="startToStart" value="2"/>
-    <eLiterals name="startToFinish" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkOrder" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Order is a Method Element that represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  &#xD;&#xA;(Note, Work Order is not modeled as an Association Class to provide a straightforward mapping  to XMI and EMF.)&#xD;&#xA;The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkType" unique="false"
-        eType="#//WorkOrderType" defaultValueLiteral="finishToStart">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="pred" lowerBound="1" eType="#//WorkBreakdownElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessElement" abstract="true" eSuperTypes="#//DescribableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Process Element is a Describable Element that represents an abstract generalization for all elements defined in the Process package.&#xD;&#xA;Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. "/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PlanningData" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Planning Data is a Method Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.&#xD;&#xA;Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.&#xD;&#xA;(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" unique="false"
-        eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default start date for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishDate" unique="false"
-        eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default finish date for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rank" unique="false" eType="#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default rank for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Descriptor" abstract="true" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Descriptor is an abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.&#xD;&#xA;Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSynchronizedWithSource"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Product Descriptor represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityEntryState" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  &#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityExitState" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).&#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="WorkProduct" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="impactedBy" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/impacts"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="impacts" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/impactedBy"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliverableParts" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescriptor" eSuperTypes="#//WorkBreakdownElement #//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Task Descriptor is a Descriptor and Work Breakdown Element that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.&#xD;&#xA;A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.&#xD;&#xA;"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Task" eType="#//Task"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="additionallyPerformedBy"
-        ordered="false" upperBound="-1" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assistedBy" ordered="false"
-        upperBound="-1" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mandatoryInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="optionalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="output" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performedPrimarilyBy" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="selectedSteps" ordered="false"
-        upperBound="-1" eType="#//Section"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CompositeRole" eSuperTypes="#//RoleDescriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Composite Role is a special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.&#xD;&#xA;A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="aggregatedRoles" ordered="false"
-        upperBound="-1" eType="#//Role"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElementDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageGuidance" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="howtoStaff" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcessDescription" eSuperTypes="#//ProcessDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scale" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectCharacteristics"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Characterizes the project that would typically perform this Process"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="riskLevel" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines typical project risks that are addressed with this process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimatingTechnique" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the Estimation Techniques provided for this Process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectMemberExpertise"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeOfContract" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background information about the contracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessDescription" eSuperTypes="#//ActivityDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalId" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="An external visible number that is used to reference this delivery patterns and models. It is used like a synonym."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scope" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the scope of the Process, i.e. which types of projects does it address and which not."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageNotes" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional notes on how to apply and instantiate this process for a project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescriptorDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="refinedDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. "/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Concept" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Concept is a specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Checklist" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Checklist is a specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. "/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Example" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Example is a specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guideline" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Guideline is a specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Report" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Report is a predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Template" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Template is a specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SupportingMaterial" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Supporting Materials is catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ToolMentor" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Tool Mentor is a specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Whitepaper" eSuperTypes="#//Concept">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Whitepapers are a special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TermDefinition" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="TermDefinitions define concepts and are used to build up the Glossary. They are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Practice" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Practice represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be &quot;Manage Risks&quot;, &quot;Continuously verify quality&quot;, &quot;Architecture-centric and component-based development&quot;, etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subPractices" ordered="false"
-        upperBound="-1" eType="#//Practice" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentReferences" ordered="false"
-        upperBound="-1" eType="#//ContentElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="activityReferences" ordered="false"
-        upperBound="-1" eType="#//Activity"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EstimationConsiderations" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Estimation Considerations qualify the usage and application of estimation metrics in the development of an actual estimate."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReusableAsset" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Reusable Asset provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing&#xD;&#xA;how the asset should be used."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="State" eSuperTypes="#//Vertex">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="WorkProduct" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Region" ordered="false"
-        upperBound="-1" eType="#//Region" containment="true" eOpposite="#//Region/State"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="submachine" eType="#//StateMachine"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Vertex">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="container" eType="#//Region"
-        transient="true" eOpposite="#//Region/Vertex"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outgoing" ordered="false"
-        upperBound="-1" eType="#//Transition" eOpposite="#//Transition/source"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="incoming" ordered="false"
-        upperBound="-1" eType="#//Transition" eOpposite="#//Transition/target"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Region">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Vertex" ordered="false"
-        upperBound="-1" eType="#//Vertex" containment="true" eOpposite="#//Vertex/container"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Transition" ordered="false"
-        upperBound="-1" eType="#//Transition" containment="true" eOpposite="#//Transition/container"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="State" eType="#//State"
-        transient="true" eOpposite="#//State/Region"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="StateMachine" eType="#//StateMachine"
-        transient="true" eOpposite="#//StateMachine/Region"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="StateMachine" eSuperTypes="#//WorkDefinition">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Region" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//Region" containment="true" eOpposite="#//Region/StateMachine"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Transition">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="WorkDefinition" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//WorkDefinition"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="container" lowerBound="1"
-        eType="#//Region" transient="true" eOpposite="#//Region/Transition"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1"
-        eType="#//Vertex" eOpposite="#//Vertex/outgoing"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="target" lowerBound="1"
-        eType="#//Vertex" eOpposite="#//Vertex/incoming"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PseudoState" eSuperTypes="#//Vertex"/>
-  <eClassifiers xsi:type="ecore:EEnum" name="PseudoStateKind">
-    <eLiterals name="initial"/>
-    <eLiterals name="join" value="1"/>
-    <eLiterals name="fork" value="2"/>
-    <eLiterals name="junction" value="3"/>
-    <eLiterals name="choice" value="4"/>
-    <eLiterals name="entryPoint" value="5"/>
-    <eLiterals name="exitPoint" value="6"/>
-    <eLiterals name="terminate" value="7"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Discipline" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Discipline is a categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.&#xD;&#xA;A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tasks" ordered="false"
-        upperBound="-1" eType="#//Task"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subdiscipline" ordered="false"
-        upperBound="-1" eType="#//Discipline" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referenceWorkflows" ordered="false"
-        upperBound="-1" eType="#//Activity"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentCategory" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Category is an abstract class generalizing content category types."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSet" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role Set organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the &quot;Analysts&quot; Role Set could group the &quot;Business Process Analyst&quot;, &quot;System Analyst&quot;, as well as &quot;Requirements Specifier&quot; roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roles" ordered="false"
-        upperBound="-1" eType="#//Role"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Domain" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Domain is a refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.&#xD;&#xA;Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workProducts" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subdomains" ordered="false"
-        upperBound="-1" eType="#//Domain" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductType" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Product Type is a second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is &quot;Class Diagram&quot;, which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or &quot;Specification&quot;, which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workProducts" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisciplineGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Discipline Groupings are used to group Disciplines.  For example, the Discipline Grouping &quot;Software Disciplines&quot; would be the group of all disciplines related to developing software such as &quot;Requirements Management&quot; or &quot;Testing&quot;; &quot;IT Infrastructure Management&quot; would be a Disciplines Grouping for disciplines such as &quot;IT Operational Services&quot;, &quot;IT Customer Relationships&quot;, or &quot;IT Enabling Services&quot;.  Disciplines can be associated to more than one Discipline Grouping."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="disciplines" ordered="false"
-        upperBound="-1" eType="#//Discipline"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Tool" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Tool is a container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSetGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roleSets" ordered="false"
-        upperBound="-1" eType="#//RoleSet"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CustomCategory" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Custom Category is a category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a &quot;Testing&quot; category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="categorizedElements" ordered="false"
-        upperBound="-1" eType="#//DescribableElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subCategories" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcess" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Delivery Processes is a special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.&#xD;&#xA;A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="educationMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="communicationsMaterials"
-        ordered="false" upperBound="-1" eType="#//SupportingMaterial"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Process" abstract="true" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process is a special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.&#xD;&#xA;Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="includesPatterns" ordered="false"
-        upperBound="-1" eType="#//CapabilityPattern"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultContext" lowerBound="1"
-        eType="#//MethodConfiguration"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validContext" ordered="false"
-        upperBound="-1" eType="#//MethodConfiguration"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CapabilityPattern" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Capability Pattern is a special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.&#xD;&#xA;A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:&#xD;&#xA;- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.&#xD;&#xA;- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).&#xD;&#xA;- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPlanningTemplate" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Planning Template is a special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).&#xD;&#xA;A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="basedOnProcesses" ordered="false"
-        upperBound="-1" eType="#//Process"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Roadmap" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Roadmap is a special Guidance Type which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.&#xD;&#xA;An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponent" eSuperTypes="#//ProcessPackage #//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component is a special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).&#xD;&#xA;UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a &quot;black box&quot;.  At any point during a project the component &quot;realization&quot; detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaces" ordered="false"
-        upperBound="-1" eType="#//ProcessComponentInterface"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="process" lowerBound="1"
-        eType="#//Process" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Process Package is a special Method Package that contains Process Elements, only.&#xD;&#xA;A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="processElements" ordered="false"
-        upperBound="-1" eType="#//ProcessElement" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagrams" ordered="false"
-        upperBound="-1" eType="#//Diagram" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponentInterface" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component Interface comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceSpecifications"
-        ordered="false" upperBound="-1" eType="#//TaskDescriptor" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceIO" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponentDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component Descriptor represents a Process Component application in a Process, i.e. the breakdown structure defining the Process.  The Process Component Descriptor is used to encapsulate the details of the component in a breakdown structure and to provide its own set of relationships such as it own predecessors and successors."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ProcessComponent" lowerBound="1"
-        eType="#//ProcessComponent"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPlugin" eSuperTypes="#//MethodUnit #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Plugin is a Method Element that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.&#xD;&#xA;Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.&#xD;&#xA;Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="userChangeable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackages" ordered="false"
-        upperBound="-1" eType="#//MethodPackage" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="bases" ordered="false"
-        upperBound="-1" eType="#//MethodPlugin"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VariabilityElement" abstract="true"
-      eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Variability Element is an abstract class derived from Method Element that provides new capabilities for content variation and extension to Content Elements or any other Method Element that derives from it.  It has been placed in-between the classes Method Element and Content Element in the overall UMA taxonomy of classes using the UML 2.0 package merge mechanism.  The association Variability Specialization shall only be instantiated between two subclasses of Variability Element of the same type.  The element on varaibilitySpecialElement side of the relationship defines a value for the attribute variabilityType defining the nature of the relationship using a literal from the enumeration Variability Type.&#xD;&#xA;Variability Element of the meta-model package Method Plugins adds the capabilities of variation and extension to Method Elements that derive from it.  By default all Content Elements such as Role, Task, Guidance Types, or Activities are defined to be Variability Elements.&#xD;&#xA;Variability and extension provides unique mechanisms for customizing method content without actually directly modifying the original content, but by just be able to describe with separate objects the differences (additions, changes, omissions) relative to the original.  This plug-in concept allows users to factor their method content and processes in interrelated units and even to architect method content and processes in layers that extend each other with new capabilities.  The resulting method and process design can be dynamically combined and applied on demand using the interpretation rules defined for Variability Element Specializations assembling to process practitioners the most accurate method and process descriptions possible.  It also allows process practitioners to extends and tailor method content and processes they do not own and to easily upgrade to newer versions by simply reapply their personal changes to these upgrades.&#xD;&#xA;Variability Element defines two types of variability and one type of extension which are formally defined for the enumeration Variability Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityType" unique="false"
-        eType="#//VariabilityType" defaultValueLiteral="na">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If in instance of the variabilitySpecialization association between two Variability Elements of the same type exists, then the variabilityType attribute specifies how the element at the variabilitySpecialElement end of the association changes the Content Element at the variabilityBasedOnElement end. See the Variability Type enumeration class for definitions for the different types of variability."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variabilityBasedOnElement"
-        unique="false" eType="#//VariabilityElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="VariabilityType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Variability Type is an Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type."/>
-    </eAnnotations>
-    <eLiterals name="na"/>
-    <eLiterals name="contributes" value="1"/>
-    <eLiterals name="extends" value="2"/>
-    <eLiterals name="replaces" value="3"/>
-    <eLiterals name="localContribution" value="4"/>
-    <eLiterals name="localReplacement" value="5"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodUnit" abstract="true" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Unit is a special Method Element that shall be maintained in a Method Library as a separate unit of control."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="authors" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Method Unit is being created and owned by an author or authoring team."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDate" unique="false"
-        eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date the last change that resulted into this version has been made."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDescription" unique="false"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the last change that resulted into this version."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Package has a version number used to track changes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="copyrightStatement" eType="#//SupportingMaterial"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodConfiguration" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Configuration is a collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPluginSelection"
-        ordered="false" upperBound="-1" eType="#//MethodPlugin"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackageSelection"
-        ordered="false" upperBound="-1" eType="#//MethodPackage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="processViews" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultView" eType="#//ContentCategory"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseConfigurations" ordered="false"
-        upperBound="-1" eType="#//MethodConfiguration"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessFamily" eSuperTypes="#//MethodConfiguration">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Delivery Model Family is a convenient grouping of Delivery Processes and Capability Patterns of interest to some specific user community."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliveryProcesses" ordered="false"
-        upperBound="-1" eType="#//DeliveryProcess"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodLibrary" eSuperTypes="#//MethodUnit #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPlugins" ordered="false"
-        upperBound="-1" eType="#//MethodPlugin" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predefinedConfigurations"
-        ordered="false" upperBound="-1" eType="#//MethodConfiguration" containment="true"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/uma.genmodel b/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/uma.genmodel
deleted file mode 100644
index 2970e57..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.3/uma.genmodel
+++ /dev/null
@@ -1,491 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.epf.uma/src"
-    editDirectory="/org.eclipse.epf.uma.edit/src" editorDirectory="/org.eclipse.epf.uma.editor/src"
-    modelPluginID="org.eclipse.epf.uma" templateDirectory="/org.eclipse.epf.uma.ecore/templates"
-    runtimeJar="true" dynamicTemplates="true" modelName="Uma" editPluginClass="org.eclipse.epf.uma.provider.UmaEditPlugin"
-    editorPluginClass="org.eclipse.epf.uma.presentation.UmaEditorPlugin" nonNLSMarkers="true"
-    rootExtendsInterface="org.eclipse.epf.uma.ecore.IModelObject" rootExtendsClass="org.eclipse.epf.uma.ecore.impl.MultiResourceEObject"
-    rootImplementsInterface="org.eclipse.emf.ecore.sdo.InternalEDataObject" suppressEMFTypes="true"
-    featureMapWrapperInterface="commonj.sdo.Sequence" featureMapWrapperInternalInterface="org.eclipse.emf.ecore.sdo.util.ESequence"
-    featureMapWrapperClass="org.eclipse.emf.ecore.sdo.util.BasicESequence" codeFormatting="true"
-    containmentProxies="true">
-  <foreignModel>C:\Home\phTNG\TNG_docs\OOAD\ContentArchitecture\Models\UMA03\UnifiedMethodArchitecture.mdl</foreignModel>
-  <staticPackages>http://www.eclipse.org/emf/2003/SDO</staticPackages>
-  <modelPluginVariables>EMF_COMMONJ_SDO=org.eclipse.emf.commonj.sdo</modelPluginVariables>
-  <modelPluginVariables>EMF_ECORE_SDO=org.eclipse.emf.ecore.sdo</modelPluginVariables>
-  <genPackages prefix="Uma" basePackage="org.eclipse.epf" disposableProviderFactory="true"
-      ecorePackage="uma.ecore#/">
-    <genEnums ecoreEnum="uma.ecore#//WorkOrderType">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/finishToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/finishToFinish"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/startToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/startToFinish"/>
-    </genEnums>
-    <genEnums ecoreEnum="uma.ecore#//PseudoStateKind">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/initial"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/join"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/fork"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/junction"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/choice"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/entryPoint"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/exitPoint"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/terminate"/>
-    </genEnums>
-    <genEnums ecoreEnum="uma.ecore#//VariabilityType">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/na"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/contributes"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/extends"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/replaces"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/localContribution"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/localReplacement"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="uma.ecore#//Date"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Uri"/>
-    <genDataTypes ecoreDataType="uma.ecore#//UnlimitedNatural"/>
-    <genDataTypes ecoreDataType="uma.ecore#//String"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Set"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Sequence"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Integer"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Float"/>
-    <genClasses ecoreClass="uma.ecore#//Classifier"/>
-    <genClasses ecoreClass="uma.ecore#//Type"/>
-    <genClasses ecoreClass="uma.ecore#//Element"/>
-    <genClasses ecoreClass="uma.ecore#//NamedElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//NamedElement/name"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PackageableElement"/>
-    <genClasses ecoreClass="uma.ecore#//Package"/>
-    <genClasses ecoreClass="uma.ecore#//Namespace"/>
-    <genClasses ecoreClass="uma.ecore#//MethodElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/guid"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/briefDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodElement/ownedRules"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/suppressed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/orderingGuide"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Constraint">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Constraint/body"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentElement">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/supportingMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/conceptsAndPapers"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/checklists"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/guidelines"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/examples"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/assets"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DescribableElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/presentationName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DescribableElement/presentation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/shapeicon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/nodeicon"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ContentDescription/mainDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ContentDescription/sections"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ContentDescription/keyConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Section">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Section/sectionName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Section/sectionDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Section/subSections"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Section/predecessor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Role">
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Role/modifies"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Role/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProduct">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/reports"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/templates"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/toolMentors"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/estimationConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Task">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/performedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/mandatoryInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/output"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/additionallyPerformedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/optionalInput"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/steps"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/toolMentors"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/estimationConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkDefinition">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//WorkDefinition/precondition"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//WorkDefinition/postcondition"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Step"/>
-    <genClasses ecoreClass="uma.ecore#//Guidance"/>
-    <genClasses ecoreClass="uma.ecore#//Artifact">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Artifact/containerArtifact"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Artifact/containedArtifacts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Deliverable">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Deliverable/deliveredWorkProducts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Outcome"/>
-    <genClasses ecoreClass="uma.ecore#//MethodPackage">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodPackage/global"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/reusedPackages"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/parentPackage"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/childPackages"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ContentPackage/contentElements"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ArtifactDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/briefOutline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/representationOptions"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/externalId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/impactOfNotHaving"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/reasonsForNotNeeding"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliverableDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliverableDescription/externalDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliverableDescription/packagingGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/skills"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/assignmentApproaches"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/synonyms"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//TaskDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TaskDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TaskDescription/alternatives"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GuidanceDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//GuidanceDescription/attachments"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PracticeDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/additionalInfo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/problem"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/background"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/goals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/application"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/levelsOfAdoption"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Point">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Point/x"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Point/y"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/position"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/contained"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/link"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/anchorage"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/semanticModel"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DiagramElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DiagramElement/isVisible"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/container"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/reference"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/property"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DiagramLink">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DiagramLink/zoom"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/viewport"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/graphElement"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/diagram"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphConnector">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphConnector/graphElement"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphConnector/graphEdge"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//SemanticModelBridge">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//SemanticModelBridge/presentation"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//SemanticModelBridge/graphElement"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//SemanticModelBridge/diagram"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Dimension">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Dimension/width"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Dimension/height"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Reference">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Reference/isIndividualRepresentation"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Reference/referenced"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Property">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Property/key"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Property/value"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphEdge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphEdge/anchor"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphEdge/waypoints"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Diagram">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Diagram/zoom"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Diagram/viewpoint"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Diagram/diagramLink"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Diagram/namespace"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphNode">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphNode/size"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//SimpleSemanticModelElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//SimpleSemanticModelElement/typeInfo"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//UMASemanticModelBridge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//UMASemanticModelBridge/element"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CoreSemanticModelBridge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CoreSemanticModelBridge/element"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//LeafElement"/>
-    <genClasses ecoreClass="uma.ecore#//TextElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TextElement/text"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Image">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Image/uri"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Image/mimeType"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphicPrimitive"/>
-    <genClasses ecoreClass="uma.ecore#//Polyline">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Polyline/closed"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Polyline/waypoints"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Ellipse">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/radiusX"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/radiusY"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/rotation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/startAngle"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/endAngle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Ellipse/center"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Activity">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/breakdownElements"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/roadmaps"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/supportingMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/checklists"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/concepts"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/examples"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/guidelines"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/reusableAssets"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Activity/isEnactable"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkBreakdownElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isRepeatable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isOngoing"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isEventDriven"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkBreakdownElement/linkToPredecessor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//BreakdownElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/prefix"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/isPlanned"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/hasMultipleOccurrences"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/isOptional"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/presentedAfter"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/presentedBefore"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/planningData"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/superActivities"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Milestone"/>
-    <genClasses ecoreClass="uma.ecore#//Iteration"/>
-    <genClasses ecoreClass="uma.ecore#//Phase"/>
-    <genClasses ecoreClass="uma.ecore#//TeamProfile">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/teamRoles"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/superTeam"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/subTeam"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/Role"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/modifies"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkOrder">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkOrder/linkType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkOrder/pred"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessElement"/>
-    <genClasses ecoreClass="uma.ecore#//PlanningData">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/startDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/finishDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/rank"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Descriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Descriptor/isSynchronizedWithSource"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescriptor/activityEntryState"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescriptor/activityExitState"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/WorkProduct"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/impactedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/impacts"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/deliverableParts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//TaskDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/Task"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/additionallyPerformedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/assistedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/externalInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/mandatoryInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/optionalInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/output"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/performedPrimarilyBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/selectedSteps"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CompositeRole">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CompositeRole/aggregatedRoles"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//BreakdownElementDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElementDescription/usageGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ActivityDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/alternatives"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/howtoStaff"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliveryProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/scale"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/projectCharacteristics"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/riskLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/estimatingTechnique"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/projectMemberExpertise"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/typeOfContract"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/externalId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/scope"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/usageNotes"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DescriptorDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescriptorDescription/refinedDescription"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Concept"/>
-    <genClasses ecoreClass="uma.ecore#//Checklist"/>
-    <genClasses ecoreClass="uma.ecore#//Example"/>
-    <genClasses ecoreClass="uma.ecore#//Guideline"/>
-    <genClasses ecoreClass="uma.ecore#//Report"/>
-    <genClasses ecoreClass="uma.ecore#//Template"/>
-    <genClasses ecoreClass="uma.ecore#//SupportingMaterial"/>
-    <genClasses ecoreClass="uma.ecore#//ToolMentor"/>
-    <genClasses ecoreClass="uma.ecore#//Whitepaper"/>
-    <genClasses ecoreClass="uma.ecore#//TermDefinition"/>
-    <genClasses ecoreClass="uma.ecore#//Practice">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Practice/subPractices"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Practice/contentReferences"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Practice/activityReferences"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//EstimationConsiderations"/>
-    <genClasses ecoreClass="uma.ecore#//ReusableAsset"/>
-    <genClasses ecoreClass="uma.ecore#//State">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//State/WorkProduct"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//State/Region"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//State/submachine"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Vertex">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Vertex/container"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Vertex/outgoing"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Vertex/incoming"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Region">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Region/Vertex"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Region/Transition"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Region/State"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Region/StateMachine"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//StateMachine">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//StateMachine/Region"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Transition">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/WorkDefinition"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/container"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/source"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/target"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PseudoState"/>
-    <genClasses ecoreClass="uma.ecore#//Discipline">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Discipline/tasks"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Discipline/subdiscipline"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Discipline/referenceWorkflows"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentCategory"/>
-    <genClasses ecoreClass="uma.ecore#//RoleSet">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleSet/roles"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Domain">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Domain/workProducts"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Domain/subdomains"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductType">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductType/workProducts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DisciplineGrouping">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DisciplineGrouping/disciplines"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Tool">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Tool/toolMentors"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleSetGrouping">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleSetGrouping/roleSets"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CustomCategory">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CustomCategory/categorizedElements"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CustomCategory/subCategories"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliveryProcess">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DeliveryProcess/educationMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DeliveryProcess/communicationsMaterials"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Process">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/includesPatterns"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/defaultContext"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/validContext"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CapabilityPattern"/>
-    <genClasses ecoreClass="uma.ecore#//ProcessPlanningTemplate">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessPlanningTemplate/basedOnProcesses"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Roadmap"/>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponent">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponent/interfaces"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponent/process"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessPackage/processElements"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessPackage/diagrams"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponentInterface">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentInterface/interfaceSpecifications"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentInterface/interfaceIO"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponentDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentDescriptor/ProcessComponent"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodPlugin">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodPlugin/userChangeable"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodPlugin/methodPackages"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPlugin/bases"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//VariabilityElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//VariabilityElement/variabilityType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//VariabilityElement/variabilityBasedOnElement"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodUnit">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/authors"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/changeDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/changeDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/version"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodUnit/copyrightStatement"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodConfiguration">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/methodPluginSelection"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/methodPackageSelection"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/processViews"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/defaultView"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/baseConfigurations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessFamily">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessFamily/deliveryProcesses"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodLibrary">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodLibrary/methodPlugins"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodLibrary/predefinedConfigurations"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/UnifiedMethodArchitecture.emx b/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/UnifiedMethodArchitecture.emx
deleted file mode 100644
index 886e4d0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/UnifiedMethodArchitecture.emx
+++ /dev/null
@@ -1,27216 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--xtools2_universal_type_manager-->
-<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.mmi.ui.signatures.diagram" version="7.0.0"><feature description="" name="Rational Modeling Platform (com.ibm.xtools.rmp)" url="" version="7.0.0"/></signature>?>
-<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.uml.msl.model" version="7.0.0"><feature description="" name="com.ibm.xtools.ruml.feature" url="" version="7.0.0"/></signature>?>
-<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Default="http:///schemas/Default/1" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/3" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.0/notation" xmlns:uml="http://www.eclipse.org/uml2/2.0.0/UML" xmlns:umlnotation="http://www.ibm.com/xtools/1.5.2/Umlnotation" xsi:schemaLocation="http:///schemas/Default/1 pathmap://UML2_MSL_PROFILES/Default.epx#_IN8k8MmBEdqBcN1R6EvWUw?Default/Default? http://www.eclipse.org/uml2/schemas/Ecore/3 pathmap://UML_PROFILES/Ecore.profile.uml#_vy-HUYinEdqtvbnfB2L_5w">
-  <uml:Model xmi:id="3ADC7B74022D" name="UnifiedMethodArchitecture">
-    <eAnnotations xmi:id="_BTNqAOxhEduHje3pPahN4A" source="uml2.diagrams"/>
-    <ownedComment xmi:id="_P4osYOoeEduVA7vt5qbIJQ" annotatedElement="3ADC7B74022D">
-      <body>Open Issue and ToDos:&#xD;
-----------------------------&#xD;
-- Issue: UML 2.0 naming conventions does not allow plural role names&#xD;
-- sync up names to UI names; e.g. Packaging Instructions&#xD;
-- make Activity to Breakdown Element aggregation a composition&#xD;
-- Add Index, Literature References to meta-model&#xD;
-&#xD;
-Version 2.0 changes:&#xD;
---------------------------&#xD;
-- not started, yet&#xD;
-&#xD;
-Version 1.0.4 changes:&#xD;
-----------------------------&#xD;
-- Moved externalId up from Work Product and Process description &#xD;
-  to the general content description&#xD;
-- Added association between content element and term definition to allow assigning&#xD;
-  glossay terms as guidance&#xD;
-- Added two new attributes for Artifact Description: &#xD;
-  representation and notation&#xD;
-- Added additional relationships between Configuration and Categories to &#xD;
-  model configuration specifications with categories and negative sets&#xD;
-- Made Domain to Work Product association many-to-many&#xD;
-- Made Method Package nesting association unidirectional&#xD;
-- Added MethodElementProperty for defining application specific attributes &#xD;
-  such as publication flags and flagging user plug-ins&#xD;
-- Changed 1..* multiplicities for standard categories to *&#xD;
-&#xD;
-Version 1.0.3 changes:&#xD;
-----------------------------&#xD;
-07/26/06&#xD;
-- Corrected default value of MethodPlugin::UserChangeable to true&#xD;
-07/06/06&#xD;
-- Removed Estimate   and Estimation Metric Guidance elements; &#xD;
-  only kept Estimation Consideration&#xD;
-06/20/06&#xD;
-- Changed multiplicity from discipline to activity to many to many&#xD;
-06/15/06&#xD;
-- Changed multiplicity of role descriptor to work products descriptor to &#xD;
-  many to many&#xD;
-06/13/06&#xD;
-- Added directions to descriptor associations to avoid that descriptors&#xD;
-  added to an activity via local contribution modify inherited descriptors&#xD;
-05/01/2006&#xD;
-- Moved UML2 Diagram Interchange to top-level package&#xD;
-- Changed multiplicity of breakdown elements to activities to 1&#xD;
-- Made Method Configuration a Method Unit&#xD;
-- Changed multiplicity for Task to Discipline: a Task can now be categorized&#xD;
-  by more than one Discipline to allow modeling replacing disciplines&#xD;
-- Changed multiplicity for Role to WP: a WP can have more than one &#xD;
-  responsible Role to allow modeling replacing roles&#xD;
-- Nesting of disciplines&#xD;
-- Removed &quot;workedOnBy&quot; derrived property for RoleDescriptor to WP;&#xD;
-  modifies property is sufficient&#xD;
-- added two more variability types used by activities: localContribution&#xD;
-  and localReplacement; this change is only temporarily to minimize migrations&#xD;
-  issues: in the future these need to be modeled as in SPEM2 as a seperate &#xD;
-  ActivityUse class and ActivityUseType enumeration&#xD;
-- Created Activity specialization that adds isEnactable=false attribute in&#xD;
-  the package Process --> Workflow package&#xD;
-- Added direct associations from WP and Task to EstimationConsiderations&#xD;
-  until Estimate is used; allows linking of consideratons to these elements&#xD;
-- Removed Process Contribution as it is redundant with creating extends &#xD;
-  between Processes directly</body>
-    </ownedComment>
-    <packageImport xmi:id="_Gi3dxefXEduqHoOJbURZRw">
-      <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
-    </packageImport>
-    <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D4151F66B0155" name="UML2DiagramInterchange">
-      <eAnnotations xmi:id="_Gz2gHufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D4151F71E03E7">
-        <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D4151F71E03E7" type="Class" name="Diagrams">
-          <children xmi:id="_HNVXEOfXEduqHoOJbURZRw" element="_3ADC7B74022D41530A37011B">
-            <children xmi:id="_HNVXE-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNVXFOfXEduqHoOJbURZRw" width="3014" height="1151"/>
-            </children>
-            <children xmi:id="_HNVXFefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNVXFufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNVXF-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNVXGOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXGefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXGufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXG-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXHOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXHefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXHufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNVXH-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNVXEefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNVXEufXEduqHoOJbURZRw" x="17796" y="9838"/>
-          </children>
-          <children xmi:id="_HNVXIOfXEduqHoOJbURZRw" element="_3ADC7B74022D4151F74D0091">
-            <children xmi:id="_HNVXI-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNVXJOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HNVXJefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNVXJufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNVXJ-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNVXKOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXKefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXKufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXK-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXLOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXLefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXLufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNVXL-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNVXIefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNVXIufXEduqHoOJbURZRw" x="13665" y="12869"/>
-          </children>
-          <children xmi:id="_HNVXMOfXEduqHoOJbURZRw" element="_3ADC7B74022D4153090E00B0">
-            <children xmi:id="_HNVXM-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNVXNOfXEduqHoOJbURZRw" width="6231" height="1151"/>
-            </children>
-            <children xmi:id="_HNVXNefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNVXNufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNVXN-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNVXOOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXOefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXOufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXO-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXPOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXPefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXPufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNVXP-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNVXMefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNVXMufXEduqHoOJbURZRw" x="22335" y="3132"/>
-          </children>
-          <children xmi:id="_HNVXQOfXEduqHoOJbURZRw" element="_3ADC7B74022D4153098203BA">
-            <children xmi:id="_HNVXQ-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNVXROfXEduqHoOJbURZRw" width="2556" height="1574"/>
-            </children>
-            <children xmi:id="_HNVXRefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNVXRufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNVXR-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNVXSOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXSefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXSufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXS-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXTOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXTefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXTufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNVXT-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNVXQefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNVXQufXEduqHoOJbURZRw" x="6747" y="4648"/>
-          </children>
-          <children xmi:id="_HNVXUOfXEduqHoOJbURZRw" element="_3ADC7B74022D41530A120245">
-            <children xmi:id="_HNVXU-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNVXVOfXEduqHoOJbURZRw" width="2201" height="1066"/>
-            </children>
-            <children xmi:id="_HNVXVefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNVXVufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNVXV-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNVXWOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXWefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXWufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXW-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXXOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXXefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNVXXufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNVXX-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNVXUefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNVXUufXEduqHoOJbURZRw" x="12666" y="10287"/>
-          </children>
-          <children xmi:id="_HNVXg-fXEduqHoOJbURZRw" element="_3ADC7B74022D415217C103BE">
-            <children xmi:id="_HNVXhufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNVXh-fXEduqHoOJbURZRw" width="4368" height="1168"/>
-            </children>
-            <children xmi:id="_HNVXiOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNfIEOfXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNfIEefXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNfIEufXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIE-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIFOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIFefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIFufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIF-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIGOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNfIGefXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNVXhOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNVXhefXEduqHoOJbURZRw" x="12141" y="2971"/>
-          </children>
-          <children xmi:id="_HNfIYOfXEduqHoOJbURZRw" element="_3ADC7B74022D415309FD017C">
-            <children xmi:id="_HNfIY-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNfIZOfXEduqHoOJbURZRw" width="2912" height="1066"/>
-            </children>
-            <children xmi:id="_HNfIZefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNfIZufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNfIZ-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNfIaOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIaefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIaufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIa-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIbOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIbefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIbufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNfIb-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNfIYefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNfIYufXEduqHoOJbURZRw" x="4385" y="10236"/>
-          </children>
-          <children xmi:id="_HNfIk-fXEduqHoOJbURZRw" element="_3ADC7B74022D4151F7FA0295">
-            <children xmi:id="_HNfIlufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNfIl-fXEduqHoOJbURZRw" width="2760" height="1151"/>
-            </children>
-            <children xmi:id="_HNfImOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNfImefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNfImufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNfIm-fXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfInOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfInefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfInufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIn-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIoOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNfIoefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNfIoufXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNfIlOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNfIlefXEduqHoOJbURZRw" x="13148" y="6942"/>
-          </children>
-          <children xmi:id="_HNoSL-fXEduqHoOJbURZRw" element="_3ADC7B74022D41530A2602F8">
-            <children xmi:id="_HNoSMufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNoSM-fXEduqHoOJbURZRw" width="2878" height="1574"/>
-            </children>
-            <children xmi:id="_HNoSNOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNoSNefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNoSNufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNoSN-fXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSOOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSOefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSOufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSO-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSPOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSPefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNoSPufXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNoSMOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSMefXEduqHoOJbURZRw" x="22233" y="6680"/>
-          </children>
-          <children xmi:id="_HNoSYufXEduqHoOJbURZRw" element="_3ADC7B74022D4153166A0202">
-            <children xmi:id="_HNoSZefXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNoSZufXEduqHoOJbURZRw" width="3843" height="1151"/>
-            </children>
-            <children xmi:id="_HNoSZ-fXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNoSaOfXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNoSaefXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNoSaufXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSa-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSbOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSbefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSbufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSb-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoScOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNoScefXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNoSY-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSZOfXEduqHoOJbURZRw" x="11133" y="15426"/>
-          </children>
-          <children xmi:id="_HNoSlefXEduqHoOJbURZRw" element="_3ADC7B74022D41530E340156">
-            <children xmi:id="_HNoSmOfXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNoSmefXEduqHoOJbURZRw" width="3081" height="1574"/>
-            </children>
-            <children xmi:id="_HNoSmufXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNoSm-fXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNoSnOfXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNoSnefXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSnufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSn-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSoOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSoefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSoufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNoSo-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNoSpOfXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNoSlufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSl-fXEduqHoOJbURZRw" x="17763" y="12420"/>
-          </children>
-          <children xmi:id="_HNyDM-fXEduqHoOJbURZRw" element="_3ADC7B74022D41531D640341">
-            <children xmi:id="_HNyDNufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNyDN-fXEduqHoOJbURZRw" width="5215" height="1151"/>
-            </children>
-            <children xmi:id="_HNyDOOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNyDOefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNyDOufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNyDO-fXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDPOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDPefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDPufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDP-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDQOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDQefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNyDQufXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNyDNOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDNefXEduqHoOJbURZRw" x="3539" y="17864"/>
-          </children>
-          <children xmi:id="_HNyDTOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-            <children xmi:id="_HNyDT-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNyDUOfXEduqHoOJbURZRw" width="2844" height="1066"/>
-            </children>
-            <children xmi:id="_HNyDUefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNyDUufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNyDU-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNyDVOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDVefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDVufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDV-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDWOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDWefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDWufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNyDW-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNyDTefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDTufXEduqHoOJbURZRw" x="17627" y="20802"/>
-          </children>
-          <children xmi:id="_HNyDXOfXEduqHoOJbURZRw" element="_3ADC7B74022D41531D71000B">
-            <children xmi:id="_HNyDX-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNyDYOfXEduqHoOJbURZRw" width="4521" height="1066"/>
-            </children>
-            <children xmi:id="_HNyDYefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNyDYufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNyDY-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNyDZOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDZefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDZufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDZ-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDaOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDaefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDaufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNyDa-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNyDXefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDXufXEduqHoOJbURZRw" x="16789" y="18110"/>
-          </children>
-          <children xmi:id="_HNyDmOfXEduqHoOJbURZRw" element="_3ADC7B74022D4153342A01FA">
-            <children xmi:id="_HNyDm-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNyDnOfXEduqHoOJbURZRw" width="2387" height="1151"/>
-            </children>
-            <children xmi:id="_HNyDnefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNyDnufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNyDn-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNyDoOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDoefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDoufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDo-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDpOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDpefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDpufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNyDp-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNyDmefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDmufXEduqHoOJbURZRw" x="26441" y="10701"/>
-          </children>
-          <children xmi:id="_HNyDqOfXEduqHoOJbURZRw" element="_3ADC7B74022D41533436023D">
-            <children xmi:id="_HNyDq-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNyDrOfXEduqHoOJbURZRw" width="2336" height="1151"/>
-            </children>
-            <children xmi:id="_HNyDrefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNyDrufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNyDr-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNyDsOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDsefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HNyDsufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDs-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7M8OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7M8efXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7M8ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HN7M8-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNyDqefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDqufXEduqHoOJbURZRw" x="22507" y="13948"/>
-          </children>
-          <children xmi:id="_HN7M9OfXEduqHoOJbURZRw" element="_3ADC7B74022D4153343F0019">
-            <children xmi:id="_HN7M9-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HN7M-OfXEduqHoOJbURZRw" width="3386" height="1574"/>
-            </children>
-            <children xmi:id="_HN7M-efXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HN7M-ufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HN7M--fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HN7M_OfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7M_efXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7M_ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7M_-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NAOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NAefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NAufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HN7NA-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HN7M9efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7M9ufXEduqHoOJbURZRw" x="25383" y="13843"/>
-          </children>
-          <children xmi:id="_HN7NBOfXEduqHoOJbURZRw" element="_3ADC7B74022D415334460037">
-            <children xmi:id="_HN7NB-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HN7NCOfXEduqHoOJbURZRw" width="2997" height="1151"/>
-            </children>
-            <children xmi:id="_HN7NCefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HN7NCufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HN7NC-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HN7NDOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NDefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NDufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7ND-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NEOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NEefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NEufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HN7NE-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HN7NBefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NBufXEduqHoOJbURZRw" x="28879" y="13851"/>
-          </children>
-          <children xmi:id="_HN7NFOfXEduqHoOJbURZRw" element="_3ADC7B74022D415335090038">
-            <children xmi:id="_HN7NF-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HN7NGOfXEduqHoOJbURZRw" width="3454" height="3302"/>
-            </children>
-            <children xmi:id="_HN7NGefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HN7NGufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HN7NG-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HN7NHOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NHefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NHufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NH-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NIOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NIefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NIufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HN7NI-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HN7NFefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NFufXEduqHoOJbURZRw" x="31394" y="17449"/>
-          </children>
-          <children xmi:id="_HN7NJOfXEduqHoOJbURZRw" element="_3ADC7B74022D4151F74D0091">
-            <children xmi:id="_HN7NJ-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HN7NKOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HN7NKefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HN7NKufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HN7NK-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HN7NLOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NLefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NLufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NL-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NMOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NMefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NMufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HN7NM-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HN7NJefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NJufXEduqHoOJbURZRw" x="27520" y="20118"/>
-          </children>
-          <children xmi:id="_HN7NNOfXEduqHoOJbURZRw" element="_3ADC7B74022D415335010181">
-            <children xmi:id="_HN7NN-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HN7NOOfXEduqHoOJbURZRw" width="4080" height="1151"/>
-            </children>
-            <children xmi:id="_HN7NOefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HN7NOufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HN7NO-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HN7NPOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NPefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NPufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NP-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NQOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NQefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NQufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HN7NQ-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HN7NNefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NNufXEduqHoOJbURZRw" x="27067" y="17458"/>
-          </children>
-          <children xmi:id="_HN7NlOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-            <children xmi:id="_HN7Nl-fXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HN7NmOfXEduqHoOJbURZRw" width="5096" height="1981"/>
-            </children>
-            <children xmi:id="_HN7NmefXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HN7NmufXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HN7Nm-fXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HN7NnOfXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NnefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NnufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7Nn-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NoOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NoefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HN7NoufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HN7No-fXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HN7NlefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="12632256" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NlufXEduqHoOJbURZRw" x="11853" y="660"/>
-          </children>
-          <children xmi:id="_HN7NrefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE66800CE">
-            <children xmi:id="_HN7NsOfXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HN7NsefXEduqHoOJbURZRw" width="2150" height="1032"/>
-            </children>
-            <children xmi:id="_HN7NsufXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HOE98OfXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HOE98efXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HOE98ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE98-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE99OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE99efXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE99ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE99-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE9-OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HOE9-efXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HN7NrufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7Nr-fXEduqHoOJbURZRw" x="11827" y="20870"/>
-          </children>
-          <children xmi:id="_HOE9-ufXEduqHoOJbURZRw" element="_3ADC7B74022D41531D82029A">
-            <children xmi:id="_HOE9_efXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HOE9_ufXEduqHoOJbURZRw" width="4521" height="1066"/>
-            </children>
-            <children xmi:id="_HOE9_-fXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HOE-AOfXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HOE-AefXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HOE-AufXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-A-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-BOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-BefXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-BufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-B-fXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-COfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HOE-CefXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HOE9--fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE9_OfXEduqHoOJbURZRw" x="10642" y="18211"/>
-          </children>
-          <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gz2gIOfXEduqHoOJbURZRw" description="This diagram shows the almost exact implementation of the UML 2.0 Diagram Interchange Meta-Model.  Some extensions had been added, e.g. derriving all non-value classes from MethodElement. Another minor difference to the standard is that Rose/EMF do not support attribute arrays, which has been modeled here with associations.  For documentation of the individual classes see the standard document at www.uml.org."/>
-          <element xsi:nil="true"/>
-          <edges xmi:id="_HNVXYOfXEduqHoOJbURZRw" element="_3ADC7B74022D415314850396" source="_HNVXUOfXEduqHoOJbURZRw" target="_HNVXIOfXEduqHoOJbURZRw">
-            <children xmi:id="_HNVXY-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNVXZefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNVXZufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNVXZOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNVXZ-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41531486026D">
-              <children xmi:id="_HNVXaefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXaOfXEduqHoOJbURZRw" x="27" y="-229"/>
-            </children>
-            <children xmi:id="_HNVXaufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41531486026D">
-              <children xmi:id="_HNVXbOfXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXa-fXEduqHoOJbURZRw" y="-397"/>
-            </children>
-            <children xmi:id="_HNVXbefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41531486026B">
-              <children xmi:id="_HNVXb-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXbufXEduqHoOJbURZRw" x="-150" y="-449"/>
-            </children>
-            <children xmi:id="_HNVXcOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41531486026B">
-              <children xmi:id="_HNVXcufXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXcefXEduqHoOJbURZRw" x="-378" y="1337"/>
-            </children>
-            <children xmi:id="_HNVXc-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41531486026D">
-              <children xmi:id="_HNVXdefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXdufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXdOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNVXd-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41531486026B">
-              <children xmi:id="_HNVXeefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXeufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXeOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNVXe-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41531486026D">
-              <children xmi:id="_HNVXfefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXfufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXfOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNVXf-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41531486026B">
-              <children xmi:id="_HNVXgefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNVXgufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNVXgOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNVXYefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNVXYufXEduqHoOJbURZRw" points="[-110, 524, -8, -1964]$[-110, 2048, -8, -440]"/>
-          </edges>
-          <edges xmi:id="_HNfIGufXEduqHoOJbURZRw" element="_3ADC7B74022D415309380346" source="_HNVXMOfXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HNfIHefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNfIH-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNfIIOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNfIHufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIIefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D415309390213">
-              <children xmi:id="_HNfII-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIIufXEduqHoOJbURZRw" x="-349" y="186"/>
-            </children>
-            <children xmi:id="_HNfIJOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D415309390213">
-              <children xmi:id="_HNfIJufXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIJefXEduqHoOJbURZRw" x="278" y="-280"/>
-            </children>
-            <children xmi:id="_HNfIJ-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D415309390211">
-              <children xmi:id="_HNfIKefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIKOfXEduqHoOJbURZRw" x="450" y="186"/>
-            </children>
-            <children xmi:id="_HNfIKufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D415309390211">
-              <children xmi:id="_HNfILOfXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIK-fXEduqHoOJbURZRw" x="-473" y="-246"/>
-            </children>
-            <children xmi:id="_HNfILefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D415309390213">
-              <children xmi:id="_HNfIL-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIMOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfILufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIMefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D415309390211">
-              <children xmi:id="_HNfIM-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfINOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIMufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfINefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D415309390213">
-              <children xmi:id="_HNfIN-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIOOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfINufXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNfIOefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D415309390211">
-              <children xmi:id="_HNfIO-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIPOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIOufXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNfIG-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNfIHOfXEduqHoOJbURZRw" points="[-3115, 262, 8009, 414]$[-8940, 262, 2184, 414]"/>
-          </edges>
-          <edges xmi:id="_HNfIPefXEduqHoOJbURZRw" element="_3ADC7B74022D415309BC0241" source="_HNVXg-fXEduqHoOJbURZRw" target="_HNVXQOfXEduqHoOJbURZRw">
-            <children xmi:id="_HNfIQOfXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNfIQufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNfIQ-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNfIQefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIROfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D415309BD015E">
-              <children xmi:id="_HNfIRufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIRefXEduqHoOJbURZRw" x="-82" y="-288"/>
-            </children>
-            <children xmi:id="_HNfIR-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D415309BD015E">
-              <children xmi:id="_HNfISefXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfISOfXEduqHoOJbURZRw" y="-397"/>
-            </children>
-            <children xmi:id="_HNfISufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D415309BD015C">
-              <children xmi:id="_HNfITOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIS-fXEduqHoOJbURZRw" x="-470" y="221"/>
-            </children>
-            <children xmi:id="_HNfITefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D415309BD015C">
-              <children xmi:id="_HNfIT-fXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfITufXEduqHoOJbURZRw" x="-377" y="-203"/>
-            </children>
-            <children xmi:id="_HNfIUOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D415309BD015E">
-              <children xmi:id="_HNfIUufXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIU-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIUefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIVOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D415309BD015C">
-              <children xmi:id="_HNfIVufXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIV-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIVefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIWOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D415309BD015E">
-              <children xmi:id="_HNfIWufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIW-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIWefXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNfIXOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D415309BD015C">
-              <children xmi:id="_HNfIXufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIX-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIXefXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNfIPufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNfIP-fXEduqHoOJbURZRw" points="[-2184, 431, 4114, -1447]$[-3115, 431, 3183, -1447]$[-3115, 2032, 3183, 152]$[-5020, 2032, 1278, 152]"/>
-          </edges>
-          <edges xmi:id="_HNfIcOfXEduqHoOJbURZRw" element="_3ADC7B74022D41530FF20360" source="_HNfIYOfXEduqHoOJbURZRw" target="_HNVXUOfXEduqHoOJbURZRw">
-            <children xmi:id="_HNfIc-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNfIdefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNfIdufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNfIdOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfId-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41530FF30164">
-              <children xmi:id="_HNfIeefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIeOfXEduqHoOJbURZRw" x="-423" y="-219"/>
-            </children>
-            <children xmi:id="_HNfIeufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41530FF30164">
-              <children xmi:id="_HNfIfOfXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIe-fXEduqHoOJbURZRw" x="110" y="331"/>
-            </children>
-            <children xmi:id="_HNfIfefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41530FF30162">
-              <children xmi:id="_HNfIf-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIfufXEduqHoOJbURZRw" x="51" y="-236"/>
-            </children>
-            <children xmi:id="_HNfIgOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41530FF30162">
-              <children xmi:id="_HNfIgufXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIgefXEduqHoOJbURZRw" x="-499" y="297"/>
-            </children>
-            <children xmi:id="_HNfIg-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41530FF30164">
-              <children xmi:id="_HNfIhefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIhufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIhOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIh-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41530FF30162">
-              <children xmi:id="_HNfIiefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIiufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIiOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIi-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41530FF30164">
-              <children xmi:id="_HNfIjefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIjufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIjOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNfIj-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41530FF30162">
-              <children xmi:id="_HNfIkefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIkufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIkOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNfIcefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNfIcufXEduqHoOJbURZRw" points="[1456, 33, -6468, -16]$[6824, 33, -1100, -16]"/>
-          </edges>
-          <edges xmi:id="_HNfIo-fXEduqHoOJbURZRw" element="_3ADC7B74022D41530758011F" source="_HNfIk-fXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HNfIpufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNfIqOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNfIqefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNfIp-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIqufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D415307590044">
-              <children xmi:id="_HNfIrOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIq-fXEduqHoOJbURZRw" x="292" y="390"/>
-            </children>
-            <children xmi:id="_HNfIrefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D415307590044">
-              <children xmi:id="_HNfIr-fXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIrufXEduqHoOJbURZRw" x="343" y="-957"/>
-            </children>
-            <children xmi:id="_HNfIsOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41530759003A">
-              <children xmi:id="_HNfIsufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIsefXEduqHoOJbURZRw" x="90" y="-389"/>
-            </children>
-            <children xmi:id="_HNfIs-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41530759003A">
-              <children xmi:id="_HNfItefXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfItOfXEduqHoOJbURZRw" x="-303" y="-1165"/>
-            </children>
-            <children xmi:id="_HNfItufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D415307590044">
-              <children xmi:id="_HNfIuOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIuefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIt-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIuufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41530759003A">
-              <children xmi:id="_HNfIvOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIvefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIu-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNfIvufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D415307590044">
-              <children xmi:id="_HNfIwOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIwefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIv-fXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNfIwufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41530759003A">
-              <children xmi:id="_HNfIxOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNfIxefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNfIw-fXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNfIpOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNfIpefXEduqHoOJbURZRw" points="[-474, -584, -270, 3378]$[-474, -3378, -270, 584]"/>
-          </edges>
-          <edges xmi:id="_HNfIxufXEduqHoOJbURZRw" element="_3ADC7B74022D41530E290150" source="_HNVXUOfXEduqHoOJbURZRw" target="_HNfIk-fXEduqHoOJbURZRw">
-            <children xmi:id="_HNfIyefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNfIy-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNoSAOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNfIyufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNfIx-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNfIyOfXEduqHoOJbURZRw" points="[110, -541, -651, 2760]$[609, -2726, -152, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNoSAefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNoSAufXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HNoSA-fXEduqHoOJbURZRw" element="_3ADC7B74022D41530E2B021B" source="_HNVXEOfXEduqHoOJbURZRw" target="_HNfIk-fXEduqHoOJbURZRw">
-            <children xmi:id="_HNoSBufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNoSCOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNoSCefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSB-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNoSBOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNoSBefXEduqHoOJbURZRw" points="[-948, -584, 3826, 2311]$[-3810, -2319, 965, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNoSCufXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNoSC-fXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HNoSDOfXEduqHoOJbURZRw" element="_3ADC7B74022D41530E7C00D7" source="_HNfIk-fXEduqHoOJbURZRw" target="_HNfIYOfXEduqHoOJbURZRw">
-            <children xmi:id="_HNoSD-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNoSEefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNoSEufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSEOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSE-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41530E7E017A">
-              <children xmi:id="_HNoSFefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSFOfXEduqHoOJbURZRw" x="-779" y="-271"/>
-            </children>
-            <children xmi:id="_HNoSFufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41530E7E017A">
-              <children xmi:id="_HNoSGOfXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSF-fXEduqHoOJbURZRw" x="949" y="-339"/>
-            </children>
-            <children xmi:id="_HNoSGefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41530E7E0170">
-              <children xmi:id="_HNoSG-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSGufXEduqHoOJbURZRw" x="914" y="-457"/>
-            </children>
-            <children xmi:id="_HNoSHOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41530E7E0170">
-              <children xmi:id="_HNoSHufXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSHefXEduqHoOJbURZRw" x="888" y="1194"/>
-            </children>
-            <children xmi:id="_HNoSH-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41530E7E017A">
-              <children xmi:id="_HNoSIefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSIufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSIOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSI-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41530E7E0170">
-              <children xmi:id="_HNoSJefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSJufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSJOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSJ-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41530E7E017A">
-              <children xmi:id="_HNoSKefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSKufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSKOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNoSK-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41530E7E0170">
-              <children xmi:id="_HNoSLefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSLufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSLOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNoSDefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNoSDufXEduqHoOJbURZRw" points="[-1380, 313, 7306, -2937]$[-8229, 313, 457, -2937]$[-8229, 2717, 457, -533]"/>
-          </edges>
-          <edges xmi:id="_HNoSP-fXEduqHoOJbURZRw" element="_3ADC7B74022D41530E45039F" source="_HNfIk-fXEduqHoOJbURZRw" target="_HNoSL-fXEduqHoOJbURZRw">
-            <children xmi:id="_HNoSQufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNoSROfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNoSRefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSQ-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSRufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41530E46029E">
-              <children xmi:id="_HNoSSOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSR-fXEduqHoOJbURZRw" x="-322" y="220"/>
-            </children>
-            <children xmi:id="_HNoSSefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41530E46029E">
-              <children xmi:id="_HNoSS-fXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSSufXEduqHoOJbURZRw" x="999" y="-254"/>
-            </children>
-            <children xmi:id="_HNoSTOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41530E46029C">
-              <children xmi:id="_HNoSTufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSTefXEduqHoOJbURZRw" x="475" y="313"/>
-            </children>
-            <children xmi:id="_HNoST-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41530E46029C">
-              <children xmi:id="_HNoSUefXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSUOfXEduqHoOJbURZRw" x="297" y="-339"/>
-            </children>
-            <children xmi:id="_HNoSUufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41530E46029E">
-              <children xmi:id="_HNoSVOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSVefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSU-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSVufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41530E46029C">
-              <children xmi:id="_HNoSWOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSWefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSV-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSWufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41530E46029E">
-              <children xmi:id="_HNoSXOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSXefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSW-fXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNoSXufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41530E46029C">
-              <children xmi:id="_HNoSYOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSYefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSX-fXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNoSQOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNoSQefXEduqHoOJbURZRw" points="[1380, -110, -7763, -59]$[7704, -110, -1439, -59]"/>
-          </edges>
-          <edges xmi:id="_HNoScufXEduqHoOJbURZRw" element="_3ADC7B74022D415316970302" source="_HNfIk-fXEduqHoOJbURZRw" target="_HNoSYufXEduqHoOJbURZRw">
-            <children xmi:id="_HNoSdefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNoSd-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNoSeOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSdufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSeefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D415316990003">
-              <children xmi:id="_HNoSe-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSeufXEduqHoOJbURZRw" x="-3103" y="-262"/>
-            </children>
-            <children xmi:id="_HNoSfOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D415316990003">
-              <children xmi:id="_HNoSfufXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSfefXEduqHoOJbURZRw" x="-2180" y="238"/>
-            </children>
-            <children xmi:id="_HNoSf-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D415316990001">
-              <children xmi:id="_HNoSgefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSgOfXEduqHoOJbURZRw" x="3518" y="246"/>
-            </children>
-            <children xmi:id="_HNoSgufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D415316990001">
-              <children xmi:id="_HNoShOfXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSg-fXEduqHoOJbURZRw" x="2062" y="-355"/>
-            </children>
-            <children xmi:id="_HNoShefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D415316990003">
-              <children xmi:id="_HNoSh-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSiOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoShufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSiefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D415316990001">
-              <children xmi:id="_HNoSi-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSjOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSiufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoSjefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D415316990003">
-              <children xmi:id="_HNoSj-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSkOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSjufXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNoSkefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D415316990001">
-              <children xmi:id="_HNoSk-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNoSlOfXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSkufXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNoSc-fXEduqHoOJbURZRw" routing="Rectilinear" showListVisibility="None" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNoSdOfXEduqHoOJbURZRw" points="[-1380, -406, 93, -8890]$[-10854, -406, -9381, -8890]$[-10854, 8085, -9381, -397]$[-3395, 8085, -1921, -397]"/>
-          </edges>
-          <edges xmi:id="_HNoSpefXEduqHoOJbURZRw" element="_3ADC7B74022D41530E3A03CB" source="_HNoSlefXEduqHoOJbURZRw" target="_HNVXEOfXEduqHoOJbURZRw">
-            <children xmi:id="_HNoSqOfXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNoSqufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNoSq-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSqefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNoSpufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNoSp-fXEduqHoOJbURZRw" points="[0, -795, 0, 1998]$[0, -2218, 0, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNoSrOfXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNoSrefXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HNoSrufXEduqHoOJbURZRw" element="_3ADC7B74022D415315DB0301" source="_HNoSlefXEduqHoOJbURZRw" target="_HNoSL-fXEduqHoOJbURZRw">
-            <children xmi:id="_HNoSsefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNoSs-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNoStOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNoSsufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNoStefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D415315DD0047">
-              <children xmi:id="_HNoSt-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoStufXEduqHoOJbURZRw" x="-833" y="338"/>
-            </children>
-            <children xmi:id="_HNoSuOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D415315DD0047">
-              <children xmi:id="_HNoSuufXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSuefXEduqHoOJbURZRw" x="-291" y="-297"/>
-            </children>
-            <children xmi:id="_HNoSu-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D415315DD003D">
-              <children xmi:id="_HNoSvefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSvOfXEduqHoOJbURZRw" x="765" y="457"/>
-            </children>
-            <children xmi:id="_HNoSvufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D415315DD003D">
-              <children xmi:id="_HNoSwOfXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNoSv-fXEduqHoOJbURZRw" x="765" y="-1313"/>
-            </children>
-            <children xmi:id="_HNyDAOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D415315DD0047">
-              <children xmi:id="_HNyDAufXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDA-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDAefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDBOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D415315DD003D">
-              <children xmi:id="_HNyDBufXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDB-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDBefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDCOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D415315DD0047">
-              <children xmi:id="_HNyDCufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDC-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDCefXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNyDDOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D415315DD003D">
-              <children xmi:id="_HNyDDufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDD-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDDefXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNoSr-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNoSsOfXEduqHoOJbURZRw" points="[1540, 0, -2827, 5740]$[4284, 0, -84, 5740]$[4284, -4953, -84, 787]"/>
-          </edges>
-          <edges xmi:id="_HNyDEOfXEduqHoOJbURZRw" element="_3ADC7B74022D41531C17014D" source="_HNoSlefXEduqHoOJbURZRw" target="_HNoSYufXEduqHoOJbURZRw">
-            <children xmi:id="_HNyDE-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNyDFefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNyDFufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDFOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDF-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41531C180101">
-              <children xmi:id="_HNyDGefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDGOfXEduqHoOJbURZRw" x="-129" y="-448"/>
-            </children>
-            <children xmi:id="_HNyDGufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41531C180101">
-              <children xmi:id="_HNyDHOfXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDG-fXEduqHoOJbURZRw" x="-112" y="916"/>
-            </children>
-            <children xmi:id="_HNyDHefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41531C1800FF">
-              <children xmi:id="_HNyDH-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDHufXEduqHoOJbURZRw" x="569" y="-288"/>
-            </children>
-            <children xmi:id="_HNyDIOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41531C1800FF">
-              <children xmi:id="_HNyDIufXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDIefXEduqHoOJbURZRw" x="-549" y="279"/>
-            </children>
-            <children xmi:id="_HNyDI-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41531C180101">
-              <children xmi:id="_HNyDJefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDJufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDJOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDJ-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41531C1800FF">
-              <children xmi:id="_HNyDKefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDKufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDKOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDK-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41531C180101">
-              <children xmi:id="_HNyDLefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDLufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDLOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNyDL-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41531C1800FF">
-              <children xmi:id="_HNyDMefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDMufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDMOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNyDEefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNyDEufXEduqHoOJbURZRw" points="[-84, 787, 6163, -2006]$[-84, 2429, 6163, -364]$[-4326, 2429, 1921, -364]"/>
-          </edges>
-          <edges xmi:id="_HNyDQ-fXEduqHoOJbURZRw" element="_3ADC7B74022D41531DA001B7" source="_HNyDM-fXEduqHoOJbURZRw" target="_HNoSYufXEduqHoOJbURZRw">
-            <children xmi:id="_HNyDRufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNyDSOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNyDSefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDR-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNyDROfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNyDRefXEduqHoOJbURZRw" points="[1625, -584, -5283, 1854]$[5257, -1862, -1651, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNyDSufXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNyDS-fXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HNyDbOfXEduqHoOJbURZRw" element="_3ADC7B74022D41531DA30189" source="_HNyDXOfXEduqHoOJbURZRw" target="_HNoSYufXEduqHoOJbURZRw">
-            <children xmi:id="_HNyDb-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNyDcefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNyDcufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDcOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNyDbefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNyDbufXEduqHoOJbURZRw" points="[-1210, -541, 4783, 2099]$[-4690, -2065, 1303, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNyDc-fXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNyDdOfXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HNyDdefXEduqHoOJbURZRw" element="_3ADC7B74022D41532FE30123" source="_HNyDXOfXEduqHoOJbURZRw" target="_HNyDTOfXEduqHoOJbURZRw">
-            <children xmi:id="_HNyDeOfXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HNyDeufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNyDe-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNyDeefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDfOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41532FE30340">
-              <children xmi:id="_HNyDfufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDfefXEduqHoOJbURZRw" x="61" y="314"/>
-            </children>
-            <children xmi:id="_HNyDf-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41532FE30340">
-              <children xmi:id="_HNyDgefXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDgOfXEduqHoOJbURZRw" y="-397"/>
-            </children>
-            <children xmi:id="_HNyDgufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41532FE3032C">
-              <children xmi:id="_HNyDhOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDg-fXEduqHoOJbURZRw" x="-298" y="288"/>
-            </children>
-            <children xmi:id="_HNyDhefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41532FE3032C">
-              <children xmi:id="_HNyDh-fXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDhufXEduqHoOJbURZRw" x="-298" y="-1100"/>
-            </children>
-            <children xmi:id="_HNyDiOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41532FE30340">
-              <children xmi:id="_HNyDiufXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDi-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDiefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDjOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41532FE3032C">
-              <children xmi:id="_HNyDjufXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDj-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDjefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HNyDkOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41532FE30340">
-              <children xmi:id="_HNyDkufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDk-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDkefXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HNyDlOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41532FE3032C">
-              <children xmi:id="_HNyDlufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNyDl-fXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HNyDlefXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNyDdufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNyDd-fXEduqHoOJbURZRw" points="[0, 533, 0, -2159]$[0, 2150, 0, -541]"/>
-          </edges>
-          <edges xmi:id="_HN7NROfXEduqHoOJbURZRw" element="_3ADC7B74022D4153358B0161" source="_HN7NNOfXEduqHoOJbURZRw" target="_HN7NJOfXEduqHoOJbURZRw">
-            <children xmi:id="_HN7NR-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HN7NSefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HN7NSufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NSOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HN7NS-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4153358B0374">
-              <children xmi:id="_HN7NTefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NTOfXEduqHoOJbURZRw" x="65" y="-262"/>
-            </children>
-            <children xmi:id="_HN7NTufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4153358B0374">
-              <children xmi:id="_HN7NUOfXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NT-fXEduqHoOJbURZRw" y="-397"/>
-            </children>
-            <children xmi:id="_HN7NUefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4153358B036A">
-              <children xmi:id="_HN7NU-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NUufXEduqHoOJbURZRw" x="-175" y="-415"/>
-            </children>
-            <children xmi:id="_HN7NVOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4153358B036A">
-              <children xmi:id="_HN7NVufXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NVefXEduqHoOJbURZRw" x="-370" y="1152"/>
-            </children>
-            <children xmi:id="_HN7NV-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4153358B0374">
-              <children xmi:id="_HN7NWefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NWufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NWOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HN7NW-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4153358B036A">
-              <children xmi:id="_HN7NXefXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NXufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NXOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HN7NX-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4153358B0374">
-              <children xmi:id="_HN7NYefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NYufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NYOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HN7NY-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4153358B036A">
-              <children xmi:id="_HN7NZefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HN7NZufXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HN7NZOfXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HN7NRefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HN7NRufXEduqHoOJbURZRw" points="[0, 575, 0, -2370]$[0, 2446, 0, -499]"/>
-          </edges>
-          <edges xmi:id="_HN7NZ-fXEduqHoOJbURZRw" element="_3ADC7B74022D4153351B03E1" source="_HN7NFOfXEduqHoOJbURZRw" target="_HN7NBOfXEduqHoOJbURZRw">
-            <children xmi:id="_HN7NaufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HN7NbOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HN7NbefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7Na-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HN7NaOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HN7NaefXEduqHoOJbURZRw" points="[-982, -1659, 1761, 3014]$[-2413, -4097, 330, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NbufXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7Nb-fXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HN7NcOfXEduqHoOJbURZRw" element="_3ADC7B74022D415335180328" source="_HN7NNOfXEduqHoOJbURZRw" target="_HN7NBOfXEduqHoOJbURZRw">
-            <children xmi:id="_HN7Nc-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HN7NdefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HN7NdufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NdOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HN7NcefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HN7NcufXEduqHoOJbURZRw" points="[186, -584, -1083, 3022]$[1049, -3031, -220, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7Nd-fXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NeOfXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HN7NeefXEduqHoOJbURZRw" element="_3ADC7B74022D4153369F008C" source="_HNyDqOfXEduqHoOJbURZRw" target="_HNyDmOfXEduqHoOJbURZRw">
-            <children xmi:id="_HN7NfOfXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HN7NfufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HN7Nf-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NfefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HN7NeufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HN7Ne-fXEduqHoOJbURZRw" points="[626, -584, -2878, 2565]$[2844, -2573, -660, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NgOfXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NgefXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HN7NgufXEduqHoOJbURZRw" element="_3ADC7B74022D415336A102D3" source="_HN7M9OfXEduqHoOJbURZRw" target="_HNyDmOfXEduqHoOJbURZRw">
-            <children xmi:id="_HN7NhefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HN7Nh-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HN7NiOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NhufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HN7Ng-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HN7NhOfXEduqHoOJbURZRw" points="[127, -795, -431, 2556]$[448, -2777, -110, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NiefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NiufXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HN7Ni-fXEduqHoOJbURZRw" element="_3ADC7B74022D415336A40292" source="_HN7NBOfXEduqHoOJbURZRw" target="_HNyDmOfXEduqHoOJbURZRw">
-            <children xmi:id="_HN7NjufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HN7NkOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HN7NkefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7Nj-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HN7NjOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HN7NjefXEduqHoOJbURZRw" points="[-508, -584, 2235, 2565]$[-2243, -2573, 499, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NkufXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7Nk-fXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HN7NpOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E2127A018D" source="_HNfIYOfXEduqHoOJbURZRw" target="_HNfIk-fXEduqHoOJbURZRw">
-            <children xmi:id="_HN7Np-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HN7NqefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HN7NqufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HN7NqOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HN7NpefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HN7NpufXEduqHoOJbURZRw" points="[1456, -372, -7230, 2878]$[5706, -1405, -2980, 1845]$[7730, -2675, -956, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7Nq-fXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HN7NrOfXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-CufXEduqHoOJbURZRw" element="_3ADC7B74022D41531DA50268" source="_HOE9-ufXEduqHoOJbURZRw" target="_HNoSYufXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-DefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-D-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-EOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-DufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-C-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-DOfXEduqHoOJbURZRw" points="[169, -541, 16, 2201]$[169, -2167, 16, 575]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-EefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-EufXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-E-fXEduqHoOJbURZRw" element="_3ADC7B74022D41532FC40327" source="_HOE9-ufXEduqHoOJbURZRw" target="_HN7NrefXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-FufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-GOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-GefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-F-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HOE-GufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41532FC501A3">
-              <children xmi:id="_HOE-HOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-G-fXEduqHoOJbURZRw" x="143" y="-381"/>
-            </children>
-            <children xmi:id="_HOE-HefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41532FC501A3">
-              <children xmi:id="_HOE-H-fXEduqHoOJbURZRw" type="ToRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-HufXEduqHoOJbURZRw" y="-397"/>
-            </children>
-            <children xmi:id="_HOE-IOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41532FC50198">
-              <children xmi:id="_HOE-IufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-IefXEduqHoOJbURZRw" x="-66" y="-355"/>
-            </children>
-            <children xmi:id="_HOE-I-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41532FC50198">
-              <children xmi:id="_HOE-JefXEduqHoOJbURZRw" type="FromRole"/>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-JOfXEduqHoOJbURZRw" x="-354" y="982"/>
-            </children>
-            <children xmi:id="_HOE-JufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41532FC501A3">
-              <children xmi:id="_HOE-KOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-KefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-J-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HOE-KufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41532FC50198">
-              <children xmi:id="_HOE-LOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-LefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-K-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <children xmi:id="_HOE-LufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41532FC501A3">
-              <children xmi:id="_HOE-MOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-MefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-L-fXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <children xmi:id="_HOE-MufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41532FC50198">
-              <children xmi:id="_HOE-NOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-NefXEduqHoOJbURZRw"/>
-              </children>
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_HOE-M-fXEduqHoOJbURZRw" y="1058"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-FOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-FefXEduqHoOJbURZRw" points="[0, 533, 0, -2108]$[0, 2116, 0, -524]"/>
-          </edges>
-          <edges xmi:id="_HOE-NufXEduqHoOJbURZRw" element="_3ADC7B74022D41E494DD02C9" source="_HNoSYufXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-OefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-O-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-POfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-OufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-N-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-OOfXEduqHoOJbURZRw" points="[-1921, 194, -3191, 12640]$[-10041, 194, -11311, 12640]$[-10041, -12886, -11311, -440]$[-914, -12886, -2184, -440]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-PefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-PufXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-P-fXEduqHoOJbURZRw" element="_3ADC7B74022D41E21248001F" source="_HNVXQOfXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-QufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-ROfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-RefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-Q-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-QOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-QefXEduqHoOJbURZRw" points="[575, -787, -5723, 1092]$[575, -2032, -5723, -152]$[4114, -2032, -2184, -152]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-RufXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-R-fXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-SOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E21237018E" source="_HNVXg-fXEduqHoOJbURZRw" target="_HN7NlOfXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-S-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-TefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-TufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-TOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-SefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-SufXEduqHoOJbURZRw" points="[-101, -584, -152, 1955]$[-101, -1549, -152, 990]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-T-fXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-UOfXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-UefXEduqHoOJbURZRw" element="_3ADC7B74022D415309350048" source="_HNVXMOfXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-VOfXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-VufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-V-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-VefXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-UufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-U-fXEduqHoOJbURZRw" points="[-3115, -465, 8009, -313]$[-8940, -465, 2184, -313]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-WOfXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-WefXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-WufXEduqHoOJbURZRw" element="_3ADC7B74022D415368DB03E4" source="_HNfIk-fXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-XefXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-X-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-YOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-XufXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-W-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-XOfXEduqHoOJbURZRw" points="[321, -575, 524, 3386]$[321, -3378, 524, 584]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-YefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-YufXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-Y-fXEduqHoOJbURZRw" element="_3ADC7B74022D41E22FE60111" source="_HNoSL-fXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-ZufXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-aOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-aefXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-Z-fXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-ZOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-ZefXEduqHoOJbURZRw" points="[-93, -787, 9254, 3124]$[-93, -1413, 9254, 2497]$[-8356, -1413, 990, 2497]$[-8356, -3327, 990, 584]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-aufXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-a-fXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HOE-bOfXEduqHoOJbURZRw" element="_3ADC7B74022D4153349C0171" source="_HNyDmOfXEduqHoOJbURZRw" target="_HNVXg-fXEduqHoOJbURZRw">
-            <children xmi:id="_HOE-b-fXEduqHoOJbURZRw" type="NameLabel">
-              <children xmi:id="_HOE-cefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HOE-cufXEduqHoOJbURZRw" visible="false" type="Name"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-cOfXEduqHoOJbURZRw" y="-186"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HOE-befXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HOE-bufXEduqHoOJbURZRw" points="[-397, -476, 13599, 7223]$[-397, -5715, 13599, 1984]$[-13520, -5715, 476, 1984]$[-13520, -7197, 476, 502]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-c-fXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HOE-dOfXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-        </contents>
-        <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D415216E401E3" type="Class" name="Types">
-          <children xmi:id="_HOE-defXEduqHoOJbURZRw" element="_3ADC7B74022D4151F74D0091">
-            <children xmi:id="_HOE-eOfXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HOE-eefXEduqHoOJbURZRw" width="1964" height="1964"/>
-            </children>
-            <children xmi:id="_HOE-eufXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HOE-e-fXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HOE-fOfXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HOE-fefXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-fufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-f-fXEduqHoOJbURZRw" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-gOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-gefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-gufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-g-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HOE-hOfXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HOE-dufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-d-fXEduqHoOJbURZRw" x="745" y="643"/>
-          </children>
-          <children xmi:id="_HOE-hefXEduqHoOJbURZRw" element="_3ADC7B74022D41520B1C02E1">
-            <children xmi:id="_HOE-iOfXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HOE-iefXEduqHoOJbURZRw" width="2760" height="1964"/>
-            </children>
-            <children xmi:id="_HOE-iufXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HOE-i-fXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HOE-jOfXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HOE-jefXEduqHoOJbURZRw" type="AttributeCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-jufXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-j-fXEduqHoOJbURZRw" type="OperationCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOE-kOfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOE-kefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-              <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HOOu8OfXEduqHoOJbURZRw"/>
-            </children>
-            <children xmi:id="_HOOu8efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HOOu8ufXEduqHoOJbURZRw" canonical="false"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HOE-hufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HOE-h-fXEduqHoOJbURZRw" x="3293" y="592"/>
-          </children>
-          <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gz2gIufXEduqHoOJbURZRw" description="These twp data type are being used by the diamgram interchange.  They might be replaced with types of the implementation platform as long as the allow the same type of serialization for persistency."/>
-          <element xsi:nil="true"/>
-        </contents>
-      </eAnnotations>
-      <ownedComment xmi:id="_Gx6mYOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4151F66B0155">
-        <body>01</body>
-      </ownedComment>
-      <packageImport xmi:id="_3ADC7B74022D41E57740023D" importedPackage="_3ADC7B74022D41DDF869012E">
-        <eAnnotations xmi:id="_Gx6mZufXEduqHoOJbURZRw" source="http://www.eclipse.org/uml2/2.0.0/UML"/>
-      </packageImport>
-      <packageImport xmi:id="_ykw8wOxZEduONrMRgmz48A" importedPackage="_3ADC7B74022D40F36C5E0262"/>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4151F74D0091" name="Point">
-        <ownedAttribute xmi:id="_3ADC7B74022D415375F3025E" name="x" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415375FC02D9" name="y" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4151F7FA0295" name="GraphElement" isAbstract="true">
-        <generalization xmi:id="_3ADC7B74022D415368DB03E4" general="_3ADC7B74022D415217C103BE"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41520B6A03A3" name="position" visibility="public" type="_3ADC7B74022D4151F74D0091"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41530759003A" name="contained" visibility="public" type="_3ADC7B74022D415217C103BE" aggregation="composite" association="_3ADC7B74022D41530758011F">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzjlSufXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzjlSefXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D41530E46029C" name="link" visibility="public" type="_3ADC7B74022D41530A2602F8" aggregation="composite" association="_3ADC7B74022D41530E45039F">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvE-fXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvEufXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D41530E7E0170" name="anchorage" visibility="public" type="_3ADC7B74022D415309FD017C" aggregation="composite" association="_3ADC7B74022D41530E7C00D7">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvGufXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvGefXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415316990001" name="semanticModel" visibility="public" type="_3ADC7B74022D4153166A0202" aggregation="composite" association="_3ADC7B74022D415316970302">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvNufXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvNefXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41520B1C02E1" name="Dimension">
-        <ownedAttribute xmi:id="_3ADC7B74022D415376050155" name="width" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D4153760E016C" name="height" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D415217C103BE" name="DiagramElement" isAbstract="true">
-        <generalization xmi:id="_3ADC7B74022D41E21237018E" general="_3ADC7B74022D40F36C5E0280"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415306980187" name="isVisible" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-          <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GzZ0L-fXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-            <body>true</body>
-          </defaultValue>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415307590044" name="container" visibility="public" type="_3ADC7B74022D4151F7FA0295" association="_3ADC7B74022D41530758011F">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzjlTefXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzjlTOfXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415309390213" name="reference" visibility="public" type="_3ADC7B74022D4153090E00B0" association="_3ADC7B74022D415309380346">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzjlVOfXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzjlU-fXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415309BD015C" name="property" visibility="public" type="_3ADC7B74022D4153098203BA" aggregation="composite" association="_3ADC7B74022D415309BC0241">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzjlWOfXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzjlV-fXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4153090E00B0" name="Reference">
-        <generalization xmi:id="_3ADC7B74022D415309350048" general="_3ADC7B74022D415217C103BE"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415309160026" name="isIndividualRepresentation" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-          <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_tKUFcOyJEdu5-vVjlfVsfQ" type="_5GcYAOieEduQbuY6UwMSQg"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415309390211" name="referenced" visibility="public" type="_3ADC7B74022D415217C103BE" association="_3ADC7B74022D415309380346">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzjlUefXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzjlUOfXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4153098203BA" name="Property">
-        <generalization xmi:id="_3ADC7B74022D41E21248001F" general="_3ADC7B74022D415217C103BE"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415309A90081" name="key" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vslVQeyGEdu5-vVjlfVsfQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vslVQOyGEdu5-vVjlfVsfQ"/>
-          <defaultValue xmi:type="uml:LiteralString" xmi:id="_vkPRkOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415309AD0235" name="value" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_DflTweyJEdu5-vVjlfVsfQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_DflTwOyJEdu5-vVjlfVsfQ"/>
-          <defaultValue xmi:type="uml:LiteralString" xmi:id="_DWC9QOyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D415309FD017C" name="GraphConnector">
-        <generalization xmi:id="_3ADC7B74022D41E2127A018D" general="_3ADC7B74022D4151F7FA0295"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41530E7E017A" name="graphElement" visibility="public" type="_3ADC7B74022D4151F7FA0295" association="_3ADC7B74022D41530E7C00D7">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvHefXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvHOfXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D41530FF30162" name="graphEdge" visibility="public" type="_3ADC7B74022D41530A120245" association="_3ADC7B74022D41530FF20360">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvIefXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvIOfXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41530A120245" name="GraphEdge">
-        <generalization xmi:id="_3ADC7B74022D41530E290150" general="_3ADC7B74022D4151F7FA0295"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41530FF30164" name="anchor" visibility="public" type="_3ADC7B74022D415309FD017C" association="_3ADC7B74022D41530FF20360">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvJOfXEduqHoOJbURZRw" value="2"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvI-fXEduqHoOJbURZRw" value="2"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D41531486026B" name="waypoints" visibility="public" type="_3ADC7B74022D4151F74D0091" aggregation="composite" association="_3ADC7B74022D415314850396">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvKOfXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvJ-fXEduqHoOJbURZRw" value="2"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41530A2602F8" name="DiagramLink">
-        <generalization xmi:id="_3ADC7B74022D41E22FE60111" general="_3ADC7B74022D415217C103BE"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41531CDB01F0" name="zoom" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41531CE402D9" name="viewport" visibility="public" type="_3ADC7B74022D4151F74D0091"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41530E46029E" name="graphElement" visibility="public" type="_3ADC7B74022D4151F7FA0295" association="_3ADC7B74022D41530E45039F">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvFufXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvFefXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415315DD0047" name="diagram" visibility="public" type="_3ADC7B74022D41530E340156" association="_3ADC7B74022D415315DB0301">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvMufXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvMefXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41530A37011B" name="GraphNode">
-        <generalization xmi:id="_3ADC7B74022D41530E2B021B" general="_3ADC7B74022D4151F7FA0295"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415315AB00A9" name="size" visibility="public" type="_3ADC7B74022D41520B1C02E1"/>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41530E340156" name="Diagram">
-        <generalization xmi:id="_3ADC7B74022D41530E3A03CB" general="_3ADC7B74022D41530A37011B"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415315C50010" name="zoom" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_d4UIweyOEduFKJovBL64XQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_d4UIwOyOEduFKJovBL64XQ"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415315CC0269" name="viewpoint" visibility="public" type="_3ADC7B74022D4151F74D0091"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415315DD003D" name="diagramLink" visibility="public" type="_3ADC7B74022D41530A2602F8" association="_3ADC7B74022D415315DB0301">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvL-fXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvLufXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D41531C1800FF" name="namespace" visibility="public" type="_3ADC7B74022D4153166A0202" aggregation="composite" association="_3ADC7B74022D41531C17014D">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvPefXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvPOfXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4153166A0202" name="SemanticModelBridge" isAbstract="true">
-        <generalization xmi:id="_3ADC7B74022D41E494DD02C9" general="_3ADC7B74022D415217C103BE"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41531D3A00CA" name="presentation" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_P_0zIeyHEdu5-vVjlfVsfQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_P_0zIOyHEdu5-vVjlfVsfQ"/>
-          <defaultValue xmi:type="uml:LiteralString" xmi:id="_RQvBYOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D415316990003" name="graphElement" visibility="public" type="_3ADC7B74022D4151F7FA0295" association="_3ADC7B74022D415316970302">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvOefXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvOOfXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D41531C180101" name="diagram" visibility="public" type="_3ADC7B74022D41530E340156" association="_3ADC7B74022D41531C17014D">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvQOfXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvP-fXEduqHoOJbURZRw"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41531D640341" name="SimpleSemanticModelElement">
-        <generalization xmi:id="_3ADC7B74022D41531DA001B7" general="_3ADC7B74022D4153166A0202"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41531D930353" name="typeInfo" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_bhb1IeyHEdu5-vVjlfVsfQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_bhb1IOyHEdu5-vVjlfVsfQ"/>
-          <defaultValue xmi:type="uml:LiteralString" xmi:id="_bRfUoOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41531D71000B" name="UMASemanticModelBridge">
-        <generalization xmi:id="_3ADC7B74022D41531DA30189" general="_3ADC7B74022D4153166A0202"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41532FE3032C" name="element" visibility="public" type="_3ADC7B74022D40F36C5E0280" association="_3ADC7B74022D41532FE30123">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gz2gE-fXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gz2gEufXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41531D82029A" name="CoreSemanticModelBridge">
-        <generalization xmi:id="_3ADC7B74022D41531DA50268" general="_3ADC7B74022D4153166A0202"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41532FC50198" name="element" visibility="public" type="_3ADC7B74022D41DDE66800CE" association="_3ADC7B74022D41532FC40327">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvROfXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvQ-fXEduqHoOJbURZRw" value="1"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4153342A01FA" name="LeafElement" isAbstract="true">
-        <generalization xmi:id="_3ADC7B74022D4153349C0171" general="_3ADC7B74022D415217C103BE"/>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41533436023D" name="TextElement">
-        <generalization xmi:id="_3ADC7B74022D4153369F008C" general="_3ADC7B74022D4153342A01FA"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415335CC0345" name="text" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_HllxweyHEdu5-vVjlfVsfQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_HllxwOyHEdu5-vVjlfVsfQ"/>
-          <defaultValue xmi:type="uml:LiteralString" xmi:id="_HWsaIOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4153343F0019" name="Image">
-        <generalization xmi:id="_3ADC7B74022D415336A102D3" general="_3ADC7B74022D4153342A01FA"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415335D301E7" name="uri" visibility="public" type="_3ADC7B74022D4113EA2902FE">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yqR70eyOEduFKJovBL64XQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yqR70OyOEduFKJovBL64XQ"/>
-          <defaultValue xmi:type="uml:LiteralString" xmi:id="_ygS5YOyOEduFKJovBL64XQ" type="_3ADC7B74022D4113EA2902FE" value=""/>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D4153368A0186" name="mimeType" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ZmUBseyGEdu5-vVjlfVsfQ" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ZmUBsOyGEdu5-vVjlfVsfQ"/>
-          <defaultValue xmi:type="uml:LiteralString" xmi:id="_Zeap8OyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D415334460037" name="GraphicPrimitive" isAbstract="true">
-        <generalization xmi:id="_3ADC7B74022D415336A40292" general="_3ADC7B74022D4153342A01FA"/>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D415335010181" name="Polyline">
-        <generalization xmi:id="_3ADC7B74022D415335180328" general="_3ADC7B74022D415334460037"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415336E903DB" name="closed" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-          <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GzjlPufXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-            <body>true</body>
-          </defaultValue>
-        </ownedAttribute>
-        <ownedAttribute xmi:id="_3ADC7B74022D4153358B036A" name="waypoints" visibility="public" type="_3ADC7B74022D4151F74D0091" aggregation="composite" association="_3ADC7B74022D4153358B0161">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gz2gGufXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gz2gGefXEduqHoOJbURZRw" value="2"/>
-        </ownedAttribute>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D415335090038" name="Ellipse">
-        <generalization xmi:id="_3ADC7B74022D4153351B03E1" general="_3ADC7B74022D415334460037"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415335230021" name="center" visibility="public" type="_3ADC7B74022D4151F74D0091"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415335290084" name="radiusX" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D415335310356" name="radiusY" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D4153353D0372" name="rotation" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D41533547034E" name="startAngle" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-        <ownedAttribute xmi:id="_3ADC7B74022D4153355602F5" name="endAngle" visibility="public" type="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41530758011F" memberEnd="_3ADC7B74022D41530759003A _3ADC7B74022D415307590044"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D415309380346" memberEnd="_3ADC7B74022D415309390211 _3ADC7B74022D415309390213"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D415309BC0241" memberEnd="_3ADC7B74022D415309BD015C _3ADC7B74022D415309BD015E">
-        <ownedEnd xmi:id="_3ADC7B74022D415309BD015E" name="_diagramElement" visibility="public" type="_3ADC7B74022D415217C103BE" isUnique="false" association="_3ADC7B74022D415309BC0241">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzjlW-fXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzjlWufXEduqHoOJbURZRw" value="1"/>
-        </ownedEnd>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41530E45039F" memberEnd="_3ADC7B74022D41530E46029C _3ADC7B74022D41530E46029E"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41530E7C00D7" memberEnd="_3ADC7B74022D41530E7E0170 _3ADC7B74022D41530E7E017A"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41530FF20360" memberEnd="_3ADC7B74022D41530FF30162 _3ADC7B74022D41530FF30164"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D415314850396" memberEnd="_3ADC7B74022D41531486026B _3ADC7B74022D41531486026D">
-        <ownedEnd xmi:id="_3ADC7B74022D41531486026D" name="_graphEdge" visibility="public" type="_3ADC7B74022D41530A120245" isUnique="false" association="_3ADC7B74022D415314850396">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvK-fXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvKufXEduqHoOJbURZRw" value="1"/>
-        </ownedEnd>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D415315DB0301" memberEnd="_3ADC7B74022D415315DD003D _3ADC7B74022D415315DD0047"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D415316970302" memberEnd="_3ADC7B74022D415316990001 _3ADC7B74022D415316990003"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41531C17014D" memberEnd="_3ADC7B74022D41531C1800FF _3ADC7B74022D41531C180101"/>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41532FC40327" memberEnd="_3ADC7B74022D41532FC50198 _3ADC7B74022D41532FC501A3">
-        <ownedEnd xmi:id="_3ADC7B74022D41532FC501A3" name="_coreSemanticModelBridge" visibility="public" type="_3ADC7B74022D41531D82029A" isUnique="false" association="_3ADC7B74022D41532FC40327">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GzsvR-fXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GzsvRufXEduqHoOJbURZRw"/>
-        </ownedEnd>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41532FE30123" memberEnd="_3ADC7B74022D41532FE3032C _3ADC7B74022D41532FE30340">
-        <ownedEnd xmi:id="_3ADC7B74022D41532FE30340" name="_uMASemanticModelBridge" visibility="public" type="_3ADC7B74022D41531D71000B" isUnique="false" association="_3ADC7B74022D41532FE30123">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gz2gFufXEduqHoOJbURZRw" value="*"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gz2gFefXEduqHoOJbURZRw"/>
-        </ownedEnd>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4153358B0161" memberEnd="_3ADC7B74022D4153358B036A _3ADC7B74022D4153358B0374">
-        <ownedEnd xmi:id="_3ADC7B74022D4153358B0374" name="_polyline" visibility="public" type="_3ADC7B74022D415335010181" isUnique="false" association="_3ADC7B74022D4153358B0161">
-          <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gz2gHefXEduqHoOJbURZRw" value="1"/>
-          <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gz2gHOfXEduqHoOJbURZRw" value="1"/>
-        </ownedEnd>
-      </packagedElement>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41DDE62001CF" name="UML2InfrastructureMini">
-      <eAnnotations xmi:id="_Gxw1aufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41DF2C430151">
-        <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41DF2C430151" type="Class" name="Main">
-          <children xmi:id="_HNCcs-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF869012E">
-            <children xmi:id="_HNCctufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNCct-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HNLmEOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNLmEefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNLmEufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNLmE-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNLmFOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNCctOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCctefXEduqHoOJbURZRw" x="355" y="863" width="2540" height="1676"/>
-          </children>
-          <children xmi:id="_HNLmFefXEduqHoOJbURZRw" element="_3ADC7B74022D4119A62B036F">
-            <children xmi:id="_HNLmGOfXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HNLmGefXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HNLmGufXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HNLmG-fXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HNLmHOfXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HNLmHefXEduqHoOJbURZRw" visible="false" type="PackageContents">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNLmHufXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNLmFufXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNLmF-fXEduqHoOJbURZRw" x="3098" y="863" width="3227" height="1676"/>
-          </children>
-          <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gxw1bOfXEduqHoOJbURZRw"/>
-          <element xsi:nil="true"/>
-        </contents>
-      </eAnnotations>
-      <ownedComment xmi:id="_GwuToOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDE62001CF">
-        <body>02</body>
-      </ownedComment>
-      <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D4119A62B036F" name="PrimitiveTypes">
-        <eAnnotations xmi:id="_Gxd6cOfXEduqHoOJbURZRw" source="uml2.diagrams"/>
-        <ownedComment xmi:id="_Gw4EkufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A62B036F">
-          <body>00</body>
-        </ownedComment>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_3ADC7B74022D40F4498D0185" name="Date">
-          <ownedComment xmi:id="_Gw4ElefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F4498D0185">
-            <body>Data type used for attributes of meta-model classes of the type Date.</body>
-          </ownedComment>
-        </packagedElement>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_3ADC7B74022D4113EA2902FE" name="Uri">
-          <ownedComment xmi:id="_GxBOgefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4113EA2902FE">
-            <body>Data type used for attributes of meta-model classes that point to resources such as files.</body>
-          </ownedComment>
-        </packagedElement>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_3ADC7B74022D3CA010B103C3" name="String">
-          <ownedComment xmi:id="_i7FToOifEduQbuY6UwMSQg" annotatedElement="_3ADC7B74022D3CA010B103C3">
-            <body>A string is a sequence of characters in some suitable character set used to display information about the model. Character sets may include non-Roman alphabets and characters.</body>
-          </ownedComment>
-        </packagedElement>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_3ADC7B74022D3F0989B90290" name="Set"/>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_3ADC7B74022D3F09899C00EA" name="Sequence"/>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_3ADC7B74022D3CA010A4007B" name="Integer">
-          <ownedComment xmi:id="_dUc6oOoFEduOBPQA2hKqUQ" annotatedElement="_3ADC7B74022D3CA010A4007B">
-            <body>An integer is a primitive type representing integer values.</body>
-          </ownedComment>
-        </packagedElement>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_5GcYAOieEduQbuY6UwMSQg" name="Boolean">
-          <ownedComment xmi:id="_5GcYAeieEduQbuY6UwMSQg" annotatedElement="_5GcYAOieEduQbuY6UwMSQg">
-            <body>A Boolean type is used for logical expression, consisting of the predefined values true and false.</body>
-          </ownedComment>
-        </packagedElement>
-        <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_AUq8IOx3Edu5-vVjlfVsfQ" name="Double"/>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41DDF869012E" name="Constructs">
-        <eAnnotations xmi:id="_Gxw1Z-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41DDE6360004">
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41DDE6360004" type="Class" name="Main">
-            <children xmi:id="_HM4rcufXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE66800CE">
-              <children xmi:id="_HM4rdefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HM4rdufXEduqHoOJbURZRw" width="1693" height="1083"/>
-              </children>
-              <children xmi:id="_HM4rd-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HM4reOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HM4reefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HM4reufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HM4re-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HM4rfOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HM4rfefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HM4rfufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HM4rf-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HM4rgOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HM4rgefXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HM4rc-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HM4rdOfXEduqHoOJbURZRw" x="5937" y="996"/>
-            </children>
-            <children xmi:id="_HM4rgufXEduqHoOJbURZRw" element="_3ADC7B74022D41DDECB50098">
-              <children xmi:id="_HM4rhefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HM4rhufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HM4rh-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HM4riOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HM4riefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HM4riufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HM4ri-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HM4rjOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HM4rjefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HM4rjufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HM4rj-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HM4rkOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HM4rkefXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HM4rg-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HM4rhOfXEduqHoOJbURZRw" x="965" y="6824" width="1524" height="765"/>
-            </children>
-            <children xmi:id="_HM4rkufXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE6580157">
-              <children xmi:id="_HM4rlefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HM4rlufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HNCcIOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNCcIefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HNCcIufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HNCcI-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcJOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcJefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcJufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcJ-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcKOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcKefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNCcKufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HM4rk-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HM4rlOfXEduqHoOJbURZRw" x="795" y="9220" width="2364" height="907"/>
-            </children>
-            <children xmi:id="_HNCcNOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFA4403A8">
-              <children xmi:id="_HNCcN-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HNCcOOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HNCcOefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNCcOufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HNCcO-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HNCcPOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcPefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcPufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcP-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcQOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcQefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcQufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNCcQ-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNCcNefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcNufXEduqHoOJbURZRw" x="9220" y="5300" width="3132" height="712"/>
-            </children>
-            <children xmi:id="_HNCcROfXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE06202D5">
-              <children xmi:id="_HNCcR-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HNCcSOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HNCcSefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNCcSufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HNCcS-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HNCcTOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcTefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcTufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcT-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcUOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcUefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcUufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNCcU-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNCcRefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcRufXEduqHoOJbURZRw" x="5249" y="2667" width="3286" height="1124"/>
-            </children>
-            <children xmi:id="_HNCcb-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE83301A5">
-              <children xmi:id="_HNCccufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HNCcc-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HNCcdOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNCcdefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HNCcdufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HNCcd-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCceOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCceefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCceufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCce-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcfOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcfefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNCcfufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNCccOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCccefXEduqHoOJbURZRw" x="4715" y="5350" width="4141" height="659"/>
-            </children>
-            <children xmi:id="_HNCckefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFA3602C1">
-              <children xmi:id="_HNCclOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HNCclefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HNCclufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HNCcl-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HNCcmOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HNCcmefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcmufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcm-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcnOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcnefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HNCcnufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HNCcn-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HNCcoOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HNCckufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCck-fXEduqHoOJbURZRw" x="9491" y="8661" width="2220" height="827"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gxw1aefXEduqHoOJbURZRw"/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_HNCcK-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF8BD028F" source="_HM4rkufXEduqHoOJbURZRw" target="_HM4rgufXEduqHoOJbURZRw">
-              <children xmi:id="_HNCcLufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCcMOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCcMefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcL-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCcLOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCcLefXEduqHoOJbURZRw" points="[0, -541, 0, 1845]$[0, -1845, 0, 541]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcMufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcM-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HNCcVOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DDECAF0202" source="_HNCcROfXEduqHoOJbURZRw" target="_HM4rcufXEduqHoOJbURZRw">
-              <children xmi:id="_HNCcV-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCcWefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCcWufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcWOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCcVefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCcVufXEduqHoOJbURZRw" points="[8, -795, -42, 1490]$[33, -1744, -16, 541]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcW-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcXOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HNCcXefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF91203C0" source="_HM4rgufXEduqHoOJbURZRw" target="_HNCcROfXEduqHoOJbURZRw">
-              <children xmi:id="_HNCcYOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCcYufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCcY-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcYefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCcXufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCcX-fXEduqHoOJbURZRw" points="[668, -550, -4258, 3361]$[3920, -3124, -1007, 787]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcZOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcZefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HNCcZufXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFB4503D5" source="_HNCcNOfXEduqHoOJbURZRw" target="_HNCcROfXEduqHoOJbURZRw">
-              <children xmi:id="_HNCcaefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCca-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCcbOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcaufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCcZ-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCcaOfXEduqHoOJbURZRw" points="[-846, -550, 2861, 1837]$[-2472, -1600, 1236, 787]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcbefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcbufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HNCcf-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF8D40211" source="_HNCcb-fXEduqHoOJbURZRw" target="_HNCcROfXEduqHoOJbURZRw">
-              <children xmi:id="_HNCcgufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCchOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCchefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcg-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCcgOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCcgefXEduqHoOJbURZRw" points="[0, -550, 0, 1888]$[0, -1651, 0, 787]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCchufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCch-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HNCciOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF71B03A8" source="_HM4rgufXEduqHoOJbURZRw" target="_HNCcb-fXEduqHoOJbURZRw">
-              <children xmi:id="_HNCci-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCcjefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCcjufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcjOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCciefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCciufXEduqHoOJbURZRw" points="[762, -237, -4165, 1236]$[3090, -931, -1837, 541]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcj-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCckOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HNCcoefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFBCA00E9" source="_HNCckefXEduqHoOJbURZRw" target="_HNCcNOfXEduqHoOJbURZRw">
-              <children xmi:id="_HNCcpOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCcpufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCcp-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcpefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCcoufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCco-fXEduqHoOJbURZRw" points="[0, -541, 0, 2810]$[0, -2810, 0, 541]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcqOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcqefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HNCcqufXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFBCF02A9" source="_HNCckefXEduqHoOJbURZRw" target="_HNCcb-fXEduqHoOJbURZRw">
-              <children xmi:id="_HNCcrefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HNCcr-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HNCcsOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HNCcrufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HNCcq-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HNCcrOfXEduqHoOJbURZRw" points="[-601, -541, 3107, 2760]$[-3098, -2760, 609, 541]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcsefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HNCcsufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-          </contents>
-        </eAnnotations>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DDE6580157" name="Classifier" isAbstract="true">
-          <ownedComment xmi:id="_Gxd6dufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDE6580157">
-            <body>UML 2.0 meta-class Classifier.</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41DDF8BD028F" general="_3ADC7B74022D41DDECB50098"/>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DDE66800CE" name="Element" isAbstract="true">
-          <ownedComment xmi:id="_Gxnrc-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDE66800CE">
-            <body>UML 2.0 meta-class Element.</body>
-          </ownedComment>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DDE06202D5" name="NamedElement" isAbstract="true">
-          <ownedComment xmi:id="_GxnrdufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDE06202D5">
-            <body>UML 2.0 meta-class Named Element.  Defined that every element has a name.</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41DDECAF0202" general="_3ADC7B74022D41DDE66800CE"/>
-          <ownedAttribute xmi:id="_3ADC7B74022D41DDFC8E00B6" name="name" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_EgsygeyJEdu5-vVjlfVsfQ" value="1"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_EgsygOyJEdu5-vVjlfVsfQ"/>
-            <defaultValue xmi:type="uml:LiteralString" xmi:id="_EYppwOyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-          </ownedAttribute>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DDE83301A5" name="PackageableElement" isAbstract="true">
-          <ownedComment xmi:id="_Gxnre-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDE83301A5">
-            <body>UML 2.0 meta-class Packagable Element.</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41DDF8D40211" general="_3ADC7B74022D41DDE06202D5"/>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DDECB50098" name="Type" isAbstract="true">
-          <ownedComment xmi:id="_Gxnrf-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDECB50098">
-            <body>UML 2.0 meta-class Type.</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41DDF71B03A8" general="_3ADC7B74022D41DDE83301A5"/>
-          <generalization xmi:id="_3ADC7B74022D41DDF91203C0" general="_3ADC7B74022D41DDE06202D5"/>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DDFA3602C1" name="Package">
-          <ownedComment xmi:id="_GxnrhOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDFA3602C1">
-            <body>UML 2.0 meta-class Package.</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41DDFBCA00E9" general="_3ADC7B74022D41DDFA4403A8"/>
-          <generalization xmi:id="_3ADC7B74022D41DDFBCF02A9" general="_3ADC7B74022D41DDE83301A5"/>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DDFA4403A8" name="Namespace" isAbstract="true">
-          <ownedComment xmi:id="_Gxw1ZOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DDFA4403A8">
-            <body>UML 2.0 meta-class Namespace.</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41DDFB4503D5" general="_3ADC7B74022D41DDE06202D5"/>
-        </packagedElement>
-      </packagedElement>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36D0400F1" name="UnifiedMethodArchitecture">
-      <eAnnotations xmi:id="_GwuTmufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F564FA0095">
-        <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F564FA0095" type="Class" name="Main">
-          <children xmi:id="_HLGitufXEduqHoOJbURZRw" type="Note">
-            <children xmi:id="_HLGiuefXEduqHoOJbURZRw" type="DiagramName">
-              <element xsi:nil="true"/>
-            </children>
-            <children xmi:id="_HLGiuufXEduqHoOJbURZRw" type="Description">
-              <element xsi:nil="true"/>
-            </children>
-            <styles xmi:type="notation:ShapeStyle" xmi:id="_HLGit-fXEduqHoOJbURZRw" fontName="Arial" description="Defines diagrams for process visualization based on the UML2 diagram interchange standard.  Contains diagrams for workflows, work product dependencies, and team breakdowns." lineColor="0"/>
-            <element xsi:nil="true"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLGiuOfXEduqHoOJbURZRw" x="22707" y="4461" width="7526" height="2048"/>
-          </children>
-          <children xmi:id="_HLGiu-fXEduqHoOJbURZRw" type="Note">
-            <children xmi:id="_HLGivufXEduqHoOJbURZRw" type="DiagramName">
-              <element xsi:nil="true"/>
-            </children>
-            <children xmi:id="_HLGiv-fXEduqHoOJbURZRw" type="Description">
-              <element xsi:nil="true"/>
-            </children>
-            <styles xmi:type="notation:ShapeStyle" xmi:id="_HLGivOfXEduqHoOJbURZRw" fontName="Arial" description="Defines how core content elements can be organized for instantiation in processes.  Processes have local schemes facilitating redefinition of relationships between Roles, Tasks, and WorkProducts. There are two main variations of process defined: Delivery Processes, which describes end-to-end ways of doing a &quot;project&quot; as well as Capability Patterns, which provide reusuable parts that can be used to compose Delivery Processes.&#xA;" lineColor="0"/>
-            <element xsi:nil="true"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLGivefXEduqHoOJbURZRw" x="22749" y="7687" width="7035" height="4546"/>
-          </children>
-          <children xmi:id="_HLGiwOfXEduqHoOJbURZRw" type="Note">
-            <children xmi:id="_HLGiw-fXEduqHoOJbURZRw" type="DiagramName">
-              <element xsi:nil="true"/>
-            </children>
-            <children xmi:id="_HLGixOfXEduqHoOJbURZRw" type="Description">
-              <element xsi:nil="true"/>
-            </children>
-            <styles xmi:type="notation:ShapeStyle" xmi:id="_HLGiwefXEduqHoOJbURZRw" fontName="Arial" description="Defines a plugin mechanism which relies on packaging as well as new relationship types for content and process elements that allow declaring change deltas without directly modifying the source." lineColor="0"/>
-            <element xsi:nil="true"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLGiwufXEduqHoOJbURZRw" x="317" y="2853" width="6544" height="2311"/>
-          </children>
-          <children xmi:id="_HLGixefXEduqHoOJbURZRw" type="Note">
-            <children xmi:id="_HLGiyOfXEduqHoOJbURZRw" type="DiagramName">
-              <element xsi:nil="true"/>
-            </children>
-            <children xmi:id="_HLGiyefXEduqHoOJbURZRw" type="Description">
-              <element xsi:nil="true"/>
-            </children>
-            <styles xmi:type="notation:ShapeStyle" xmi:id="_HLGixufXEduqHoOJbURZRw" fontName="Arial" description="Defines key content elements such as Roles, WorkProducts, Tasks, their attributes, and their default relationships. Also defines a basic mechanisms to organize core content in packages." lineColor="0"/>
-            <element xsi:nil="true"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLGix-fXEduqHoOJbURZRw" x="634" y="9827" width="6282" height="2802"/>
-          </children>
-          <children xmi:id="_HLGiyufXEduqHoOJbURZRw" type="Note">
-            <children xmi:id="_HLGizefXEduqHoOJbURZRw" type="DiagramName">
-              <element xsi:nil="true"/>
-            </children>
-            <children xmi:id="_HLPsYOfXEduqHoOJbURZRw" type="Description">
-              <element xsi:nil="true"/>
-            </children>
-            <styles xmi:type="notation:ShapeStyle" xmi:id="_HLGiy-fXEduqHoOJbURZRw" fontName="Arial" description="Defines how plugins are further packaged in libraries as well as defines the concept of configurations extending the plugin mechamism." lineColor="0"/>
-            <element xsi:nil="true"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLGizOfXEduqHoOJbURZRw" x="22707" y="1490" width="6299" height="1693"/>
-          </children>
-          <children xmi:id="_HLPsYefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03BF">
-            <children xmi:id="_HLPsZOfXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HLPsZefXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HLPsZufXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HLPsZ-fXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HLPsaOfXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HLPsaefXEduqHoOJbURZRw" visible="false" type="PackageContents">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLPsaufXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HLPsYufXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLPsY-fXEduqHoOJbURZRw" x="14935" y="8737" width="3860" height="1676"/>
-          </children>
-          <children xmi:id="_HLPsa-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00FB">
-            <children xmi:id="_HLPsbufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HLPsb-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HLPscOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HLPscefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HLPscufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HLPsc-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLPsdOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HLPsbOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLPsbefXEduqHoOJbURZRw" x="8483" y="2794" width="3860" height="1676"/>
-          </children>
-          <children xmi:id="_HLPsdefXEduqHoOJbURZRw" type="Text">
-            <children xmi:id="_HLPseOfXEduqHoOJbURZRw" type="DiagramName">
-              <element xsi:nil="true"/>
-            </children>
-            <children xmi:id="_HLPseefXEduqHoOJbURZRw" type="Description">
-              <element xsi:nil="true"/>
-            </children>
-            <styles xmi:type="notation:ShapeStyle" xmi:id="_HLPsdufXEduqHoOJbURZRw" fontName="Arial" fontHeight="12" bold="true" description="IBM Unified Methods Architecture v1.0.4: Conceptual Meta-Model" lineColor="0"/>
-            <element xsi:nil="true"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLPsd-fXEduqHoOJbURZRw" x="355" y="457" width="13919" height="524"/>
-          </children>
-          <children xmi:id="_HLPsf-fXEduqHoOJbURZRw" element="_3ADC7B74022D411994BF0282">
-            <children xmi:id="_HLPsgufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HLPsg-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HLPshOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HLPshefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HLPshufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HLPsh-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLPsiOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HLPsgOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLPsgefXEduqHoOJbURZRw" x="18101" y="4572" width="3725" height="1676"/>
-          </children>
-          <children xmi:id="_HLPsk-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E017B">
-            <children xmi:id="_HLPslufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HLPsl-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HLPsmOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HLPsmefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HLPsmufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HLPsm-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLPsnOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HLPslOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLPslefXEduqHoOJbURZRw" x="8102" y="10346" width="3615" height="1710"/>
-          </children>
-          <children xmi:id="_HLPsq-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C57003B">
-            <children xmi:id="_HLPsrufXEduqHoOJbURZRw" type="ImageCompartment">
-              <layoutConstraint xmi:type="notation:Size" xmi:id="_HLPsr-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-            </children>
-            <children xmi:id="_HLPssOfXEduqHoOJbURZRw" type="Stereotype"/>
-            <children xmi:id="_HLPssefXEduqHoOJbURZRw" type="Name"/>
-            <children xmi:id="_HLPssufXEduqHoOJbURZRw" type="Parent"/>
-            <children xmi:id="_HLPss-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-              <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLPstOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HLPsrOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLPsrefXEduqHoOJbURZRw" x="15282" y="1413" width="3479" height="1701"/>
-          </children>
-          <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GwuTnOfXEduqHoOJbURZRw" description="The UMA Meta-Model is structured as depicted in the diagram.  The structure divides the model in logical units.  Each unit extends the units it depends upon providing additional structures and capabilities.  Overall the UML 2.0 package merge mechanism applied to the packages realizes a gradual extension of the capabilities modeled unit by unit.  As a result, units defined on a lower layer can be realized by a UMA subset-implementation without the higher level units.  For example, an implementation of the model could be based just on the Method Core and Method Plugin packages without using the elements defined in the Process package.  However, if the Process package would be included as well for the implementation then additional capabilities from the Process package would be merged into the Method Plugin package."/>
-          <element xsi:nil="true"/>
-          <edges xmi:id="_HLPseufXEduqHoOJbURZRw" type="NoteAttachment" source="_HLGiu-fXEduqHoOJbURZRw" target="_HLPsYefXEduqHoOJbURZRw">
-            <styles xmi:type="notation:ConnectorStyle" xmi:id="_HLPse-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0"/>
-            <element xsi:nil="true"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HLPsfOfXEduqHoOJbURZRw" points="[-3522, -321, 5875, 59]$[-7467, -321, 1930, 59]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsfefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsfufXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HLPsiefXEduqHoOJbURZRw" type="NoteAttachment" source="_HLGitufXEduqHoOJbURZRw" target="_HLPsf-fXEduqHoOJbURZRw">
-            <styles xmi:type="notation:ConnectorStyle" xmi:id="_HLPsiufXEduqHoOJbURZRw" lineColor="0"/>
-            <element xsi:nil="true"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HLPsi-fXEduqHoOJbURZRw" points="[-3767, 0, 2734, 76]$[-4639, 0, 1862, 76]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsjOfXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsjefXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HLPsjufXEduqHoOJbURZRw" type="NoteAttachment" source="_HLGiwOfXEduqHoOJbURZRw" target="_HLPsa-fXEduqHoOJbURZRw">
-            <styles xmi:type="notation:ConnectorStyle" xmi:id="_HLPsj-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0"/>
-            <element xsi:nil="true"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HLPskOfXEduqHoOJbURZRw" points="[3268, -635, -3437, -457]$[4766, -635, -1938, -457]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPskefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPskufXEduqHoOJbURZRw" id="(0.08471502,0.8108592)"/>
-          </edges>
-          <edges xmi:id="_HLPspufXEduqHoOJbURZRw" type="NoteAttachment" source="_HLGixefXEduqHoOJbURZRw" target="_HLPsk-fXEduqHoOJbURZRw">
-            <styles xmi:type="notation:ConnectorStyle" xmi:id="_HLPsp-fXEduqHoOJbURZRw" lineColor="4194368"/>
-            <element xsi:nil="true"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HLPsqOfXEduqHoOJbURZRw" points="[4385, 635, -1811, -203]$[3141, 457, -3056, -381]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsqefXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsqufXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-          <edges xmi:id="_HLPsx-fXEduqHoOJbURZRw" type="NoteAttachment" source="_HLGiyufXEduqHoOJbURZRw" target="_HLPsq-fXEduqHoOJbURZRw">
-            <styles xmi:type="notation:ConnectorStyle" xmi:id="_HLPsyOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368"/>
-            <element xsi:nil="true"/>
-            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HLPsyefXEduqHoOJbURZRw" points="[-7103, -93, 1735, -16]$[-3158, -93, 5681, -16]"/>
-            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsyufXEduqHoOJbURZRw" id="anchor50"/>
-            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLPsy-fXEduqHoOJbURZRw" id="anchor50"/>
-          </edges>
-        </contents>
-      </eAnnotations>
-      <ownedComment xmi:id="_GhEuAufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36D0400F1">
-        <body>01</body>
-      </ownedComment>
-      <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C5D03BF" name="Process">
-        <eAnnotations xmi:id="_GoOe6ufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40FD856B0276">
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40FD856B0276" type="Class" name="Main">
-            <children xmi:id="_G_UwpufXEduqHoOJbURZRw" element="_3ADC7B74022D41DE478E000D">
-              <children xmi:id="_G_UwqefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_UwqufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_Uwq-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_UwrOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_UwrefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_UwrufXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_Uwr-fXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_Uwp-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwqOfXEduqHoOJbURZRw" x="3360" y="11456" width="3398" height="1676"/>
-            </children>
-            <children xmi:id="_G_UwsOfXEduqHoOJbURZRw" element="_3ADC7B74022D40FD854600D8">
-              <children xmi:id="_G_ehQOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_ehQefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_ehQufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_ehQ-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_ehROfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_ehRefXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_ehRufXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_UwsefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwsufXEduqHoOJbURZRw" x="3789" y="8334" width="2540" height="1676"/>
-            </children>
-            <children xmi:id="_G_ehR-fXEduqHoOJbURZRw" element="_3ADC7B74022D40FD891F02CD">
-              <children xmi:id="_G_ehSufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_ehS-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_ehTOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_ehTefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_ehTufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_ehT-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_ehUOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_ehSOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_ehSefXEduqHoOJbURZRw" x="3511" y="5505" width="3096" height="1676"/>
-            </children>
-            <children xmi:id="_G_nrQufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0D0ED0104">
-              <children xmi:id="_G_xcMOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_xcMefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_xcMufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_xcM-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_xcNOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_xcNefXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_xcNufXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_nrQ-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_nrROfXEduqHoOJbURZRw" x="3299" y="-311" width="3520" height="1684"/>
-            </children>
-            <children xmi:id="_G_xcSefXEduqHoOJbURZRw" element="_3ADC7B74022D41DF2A1B02E7">
-              <children xmi:id="_G_xcTOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_xcTefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_xcTufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_xcT-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_xcUOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_xcUefXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_xcUufXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_xcSufXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_xcS-fXEduqHoOJbURZRw" x="2954" y="2470" width="4209" height="1684"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GoOe7OfXEduqHoOJbURZRw" description="|UMA separates reusable core method content from its application in processes.  A Development Process defines the structured work definitions that need to be performed to develop a system, e.g. by performing a project that follows the process.  Such structured work definitions delineate the work to be performed along a timeline or lifecycle and organize it in so called breakdown structures.  Tasks (as they have been introduced as part of the core method content) provide complete step-by-step explanations for work that needs to be performed to achieve a particular development goal.  A Task does not look at the 'big picture' of how the work described relates to other Task's work.  They have been defined as reusable core method content independent of their placement within a development lifecycle.  All that is defined for a Task are the types of the input and output work products, the concrete steps to perform, as well as what skills are required to perform the work (roles).  Which Tasks have to precede and succeed a Task as well as what steps to focus on at what point of time in the lifecycle are intentionally not defined for core method content.  The goal is provide Tasks that can be reused for many different development situations.&#xA;|The scope of a process is to provide extended as well as concrete work structures for a specific development situation.  Therefore, a process takes reusable core method elements such as Tasks and Work Products and relates them into semi-ordered sequences that are customized to specific types of projects.  To do so, UMA's Process Package provides data structures that reflect the industries best practices.  This section defines Breakdown structure meta-models that comprise of different types of breakdown elements such as Activities, which are higher level groupings of work comprising of Tasks or other Activities defining sequences and conditions on Tasks.  In fact, a process is defined as a special kind of Activity itself.  This breakdown structures meta-model has been defined independent of the concrete lifecycle models the process engineer wants to express with them.  In other words the meta-model is able to represent 'different types of' waterfall processes as well as iterative or incremental process models.  Finally, UMA enables different type of presentations for breakdown structures, as illustrated with example in the sections below, such as project plan-like structured list, workflow or activity diagrams, and static structure diagrams show inputs/outputs to work as well as performing roles.  UMA's Process package extends the concepts defined in Method Core through package merge as depicted in the diagram.  Breakdown merges the whole of Method Core by merging the Method Package package.  Process is specified in UMA with the following five packages.  The Breakdown package contains the definition of breakdown elements that form breakdown structures.  Process Types define Processes as special Activities (defined in breakdown elements) and introduce different types of Processes such as Delivery Process or Capability Patterns.  Process Package refines the Method Package concepts defined in Method Core with new packages that organize processes and breakdown structures.  Process Descriptions provides process specific content descriptions extending the taxonomy based on the Content Description class defined in Method Core.  Finally, Workflow defines how process can be enacted by providing extended data structures that allow creating models fit for instantiation on the M0 level.  In other words, it provides a meta-schema for workflow models that can run in a workflow simulator such as IBM Websphere Business Integration Modeler.&#xA;"/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_DxnysOxMEduONrMRgmz48A" element="_DxLGwOxMEduONrMRgmz48A" source="_G_UwsOfXEduqHoOJbURZRw" target="_G_UwpufXEduqHoOJbURZRw">
-              <children xmi:id="_Dxnys-xMEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_DxnytexMEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_Dxnyt-xMEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_DxnytuxMEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_DxnytOxMEduONrMRgmz48A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_DxnysexMEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_DxnysuxMEduONrMRgmz48A" points="[3, 32, -6, -85]$[11, 150, 2, 33]"/>
-            </edges>
-            <edges xmi:id="_FoPWEexMEduONrMRgmz48A" element="_FoPWEOxMEduONrMRgmz48A" source="_G_ehR-fXEduqHoOJbURZRw" target="_G_UwsOfXEduqHoOJbURZRw">
-              <children xmi:id="_FoPWFOxMEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_FoPWFuxMEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_FoPWGOxMEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_FoPWF-xMEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FoPWFexMEduONrMRgmz48A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_FoPWEuxMEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FoPWE-xMEduONrMRgmz48A" points="[2, 32, -8, -91]$[11, 155, 1, 32]"/>
-            </edges>
-            <edges xmi:id="_IZt_MexMEduONrMRgmz48A" element="_IZt_MOxMEduONrMRgmz48A" source="_G_xcSefXEduqHoOJbURZRw" target="_G_ehR-fXEduqHoOJbURZRw">
-              <children xmi:id="_IZt_NOxMEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_IZt_NuxMEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_IZt_OOxMEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_IZt_N-xMEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IZt_NexMEduONrMRgmz48A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_IZt_MuxMEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_IZt_M-xMEduONrMRgmz48A" points="[81, 17, -127, -14]$[157, 63, -51, 32]"/>
-            </edges>
-            <edges xmi:id="_r0VRIexhEduHje3pPahN4A" element="_r0VRIOxhEduHje3pPahN4A" source="_G_nrQufXEduqHoOJbURZRw" target="_G_xcSefXEduqHoOJbURZRw">
-              <children xmi:id="_r0VRJOxhEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_r0VRJuxhEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_r0VRKOxhEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_r0VRJ-xhEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_r0VRJexhEduHje3pPahN4A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_r0VRIuxhEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_r0VRI-xhEduHje3pPahN4A" points="[-68, 3, 340, -20]$[-328, 18, 80, -5]"/>
-            </edges>
-          </contents>
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F5F5090206" type="Class" name="Taxonomy">
-            <children xmi:id="_G_xcZefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-              <children xmi:id="_G_xcaOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_xcaefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_xcaufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_xca-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_xcbOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_xcbefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_xcbufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_xcb-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_xccOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_xccefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_xccufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_xcc-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_xcdOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_xcZufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_xcZ-fXEduqHoOJbURZRw" x="15216" y="317"/>
-            </children>
-            <children xmi:id="_G_7NMOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0077">
-              <children xmi:id="_G_7NM-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NNOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7NNefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NNufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7NN-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NOOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NOefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NOufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NO-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NPOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NPefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NPufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7NP-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7NMefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NMufXEduqHoOJbURZRw" x="8876" y="18095"/>
-            </children>
-            <children xmi:id="_G_7NQOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00DC">
-              <children xmi:id="_G_7NQ-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NROfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7NRefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NRufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7NR-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NSOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NSefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NSufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NS-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NTOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NTefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NTufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7NT-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7NQefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NQufXEduqHoOJbURZRw" x="12107" y="18025"/>
-            </children>
-            <children xmi:id="_G_7NUOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E5">
-              <children xmi:id="_G_7NU-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NVOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7NVefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NVufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7NV-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NWOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NWefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NWufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NW-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NXOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NXefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NXufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7NX-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7NUefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NUufXEduqHoOJbURZRw" x="15850" y="18069"/>
-            </children>
-            <children xmi:id="_G_7NYOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-              <children xmi:id="_G_7NY-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NZOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7NZefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NZufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7NZ-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NaOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NaefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NaufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7Na-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NbOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NbefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NbufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7Nb-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7NYefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NYufXEduqHoOJbURZRw" x="3361" y="8771"/>
-            </children>
-            <children xmi:id="_G_7NcOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0063">
-              <children xmi:id="_G_7Nc-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NdOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7NdefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NdufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7Nd-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NeOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NeefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NeufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7Ne-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NfOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NfefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NfufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7Nf-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7NcefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NcufXEduqHoOJbURZRw" x="5901" y="8779"/>
-            </children>
-            <children xmi:id="_G_7NgOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-              <children xmi:id="_G_7Ng-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NhOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7NhefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NhufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7Nh-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NiOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NiefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NiufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7Ni-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NjOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NjefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NjufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7Nj-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7NgefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NgufXEduqHoOJbURZRw" x="237" y="11065"/>
-            </children>
-            <children xmi:id="_G_7NmefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-              <children xmi:id="_G_7NnOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NnefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7NnufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7Nn-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7NoOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NoefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NoufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7No-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NpOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NpefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NpufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7Np-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7NqOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7NmufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7Nm-fXEduqHoOJbURZRw" x="3132" y="11057"/>
-            </children>
-            <children xmi:id="_G_7NsufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CB">
-              <children xmi:id="_G_7NtefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NtufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7Nt-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NuOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7NuefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NuufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7Nu-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NvOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NvefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NvufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7Nv-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NwOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7NwefXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7Ns-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NtOfXEduqHoOJbURZRw" x="9304" y="13402"/>
-            </children>
-            <children xmi:id="_G_7NwufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0031">
-              <children xmi:id="_G_7NxefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_G_7NxufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_G_7Nx-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_G_7NyOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_G_7NyefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_G_7NyufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7Ny-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NzOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7NzefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7NzufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_7Nz-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_G_7N0OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_7N0efXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_7Nw-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NxOfXEduqHoOJbURZRw" x="10320" y="11065"/>
-            </children>
-            <children xmi:id="_HAEXIOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CA">
-              <children xmi:id="_HAEXI-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAEXJOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HAEXJefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAEXJufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAEXJ-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAEXKOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXKefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXKufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXK-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXLOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXLefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXLufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAEXL-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAEXIefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXIufXEduqHoOJbURZRw" x="11844" y="13402"/>
-            </children>
-            <children xmi:id="_HAEXMOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-              <children xmi:id="_HAEXM-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAEXNOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HAEXNefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAEXNufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAEXN-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAEXOOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXOefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXOufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXO-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXPOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXPefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXPufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAEXP-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAEXMefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXMufXEduqHoOJbURZRw" x="7315" y="11065"/>
-            </children>
-            <children xmi:id="_HAEXQOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-              <children xmi:id="_HAEXQ-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAEXROfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HAEXRefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAEXRufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAEXR-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAEXSOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXSefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXSufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXS-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXTOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXTefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXTufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAEXT-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAEXQefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXQufXEduqHoOJbURZRw" x="14376" y="15680"/>
-            </children>
-            <children xmi:id="_HAEXa-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-              <children xmi:id="_HAEXbufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAEXb-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HAEXcOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAEXcefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAEXcufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAEXc-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXdOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXdefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXdufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXd-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXeOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXeefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAEXeufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAEXbOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXbefXEduqHoOJbURZRw" x="13013" y="11065"/>
-            </children>
-            <children xmi:id="_HAEXjefXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FE930077">
-              <children xmi:id="_HAEXkOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAEXkefXEduqHoOJbURZRw" width="2641" height="1032"/>
-              </children>
-              <children xmi:id="_HAEXkufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAEXk-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAEXlOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAEXlefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXlufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXl-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXmOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXmefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXmufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXm-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAEXnOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAEXjufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXj-fXEduqHoOJbURZRw" x="14376" y="13402"/>
-            </children>
-            <children xmi:id="_HAEXr-fXEduqHoOJbURZRw" element="_3ADC7B74022D4119A4E602C1">
-              <children xmi:id="_HAEXsufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAEXs-fXEduqHoOJbURZRw" width="2455" height="1049"/>
-              </children>
-              <children xmi:id="_HAEXtOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAEXtefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAEXtufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAEXt-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXuOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXuefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXuufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXu-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXvOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAEXvefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAEXvufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAEXsOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXsefXEduqHoOJbURZRw" x="12589" y="6434"/>
-            </children>
-            <children xmi:id="_HAEXv-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-              <children xmi:id="_HAEXwufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAEXw-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HAEXxOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAEXxefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAEXxufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAEXx-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAEXyOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIIOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIIefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIIufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOII-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIJOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAOIJefXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAEXwOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXwefXEduqHoOJbURZRw" x="8923" y="6434"/>
-            </children>
-            <children xmi:id="_HAOIOOfXEduqHoOJbURZRw" element="_3ADC7B74022D4283E8A10341">
-              <children xmi:id="_HAOIO-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAOIPOfXEduqHoOJbURZRw" width="2946" height="1032"/>
-              </children>
-              <children xmi:id="_HAOIPefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAOIPufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAOIP-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAOIQOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIQefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIQufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIQ-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIROfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIRefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIRufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAOIR-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAOIOefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIOufXEduqHoOJbURZRw" x="12344" y="4157"/>
-            </children>
-            <children xmi:id="_HAOIY-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-              <children xmi:id="_HAOIZufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAOIZ-fXEduqHoOJbURZRw" width="3691" height="1032"/>
-              </children>
-              <children xmi:id="_HAOIaOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAOIaefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAOIaufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAOIa-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIbOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIbefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIbufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIb-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIcOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIcefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAOIcufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAOIZOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIZefXEduqHoOJbURZRw" x="16035" y="8779"/>
-            </children>
-            <children xmi:id="_HAOIfOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-              <children xmi:id="_HAOIf-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAOIgOfXEduqHoOJbURZRw" width="4267" height="1032"/>
-              </children>
-              <children xmi:id="_HAOIgefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAOIgufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAOIg-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAOIhOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIhefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIhufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIh-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIiOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIiefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIiufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAOIi-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAOIfefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIfufXEduqHoOJbURZRw" x="8483" y="8779"/>
-            </children>
-            <children xmi:id="_HAOIjOfXEduqHoOJbURZRw" element="_3ADC7B74022D410818790288">
-              <children xmi:id="_HAOIj-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAOIkOfXEduqHoOJbURZRw" width="2319" height="1049"/>
-              </children>
-              <children xmi:id="_HAOIkefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAOIkufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAOIk-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAOIlOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIlefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOIlufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOIl-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOImOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOImefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOImufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAOIm-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAOIjefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIjufXEduqHoOJbURZRw" x="15400" y="6434"/>
-            </children>
-            <children xmi:id="_HAOIyefXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-              <children xmi:id="_HAOIzOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAOIzefXEduqHoOJbURZRw" width="3589" height="1032"/>
-              </children>
-              <children xmi:id="_HAOIzufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAOIz-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAOI0OfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAOI0efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOI0ufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOI0-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOI1OfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOI1efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAOI1ufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAOI1-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAOI2OfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAOIyufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIy-fXEduqHoOJbURZRw" x="12022" y="2175"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GoOe7ufXEduqHoOJbURZRw" description="This diagram provides the taxonomy of all the main classes of the Process package."/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_G_7NkOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600160" source="_G_7NgOfXEduqHoOJbURZRw" target="_G_7NYOfXEduqHoOJbURZRw">
-              <children xmi:id="_G_7Nk-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_G_7NlefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_7NlufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NlOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_7NkefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_7NkufXEduqHoOJbURZRw" points="[660, -524, -2286, 1761]$[2252, -1761, -694, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_7Nl-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_7NmOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_G_7NqefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G_7NmefXEduqHoOJbURZRw" target="_G_7NYOfXEduqHoOJbURZRw">
-              <children xmi:id="_G_7NrOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_G_7NrufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_7Nr-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_7NrefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_7NqufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_7Nq-fXEduqHoOJbURZRw" points="[-143, -533, 465, 1752]$[-474, -1761, 135, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_7NsOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_7NsefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAEXUOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600110" source="_G_7NMOfXEduqHoOJbURZRw" target="_HAEXQOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAEXU-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAEXVefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAEXVufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXVOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAEXUefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAEXUufXEduqHoOJbURZRw" points="[1143, -524, -4089, 1811]$[4038, -1811, -1193, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXV-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXWOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAEXWefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028D" source="_G_7NQOfXEduqHoOJbURZRw" target="_HAEXQOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAEXXOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAEXXufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAEXX-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXXefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAEXWufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAEXW-fXEduqHoOJbURZRw" points="[448, -524, -1583, 1811]$[1566, -1811, -465, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXYOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXYefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAEXYufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028E" source="_G_7NUOfXEduqHoOJbURZRw" target="_HAEXQOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAEXZefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAEXZ-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAEXaOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXZufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAEXY-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAEXZOfXEduqHoOJbURZRw" points="[-457, -524, 1574, 1811]$[-1574, -1811, 457, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXaefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXaufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAEXe-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F02A0" source="_G_7NsufXEduqHoOJbURZRw" target="_HAEXa-fXEduqHoOJbURZRw">
-              <children xmi:id="_HAEXfufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAEXgOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAEXgefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXf-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAEXfOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAEXfefXEduqHoOJbURZRw" points="[812, -524, -2895, 1811]$[2870, -1820, -838, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXgufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXg-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAEXhOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F029F" source="_HAEXIOfXEduqHoOJbURZRw" target="_HAEXa-fXEduqHoOJbURZRw">
-              <children xmi:id="_HAEXh-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAEXiefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAEXiufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXiOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAEXhefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAEXhufXEduqHoOJbURZRw" points="[245, -524, -922, 1811]$[897, -1820, -270, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXi-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXjOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAEXnefXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FED602AE" source="_HAEXQOfXEduqHoOJbURZRw" target="_HAEXjefXEduqHoOJbURZRw">
-              <children xmi:id="_HAEXoOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAEXoufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAEXo-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAEXoefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAEXnufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAEXn-fXEduqHoOJbURZRw" points="[0, -533, 0, 1752]$[0, -1769, 0, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXpOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAEXpefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIJufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G_7NYOfXEduqHoOJbURZRw" target="_HAEXv-fXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIKefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIK-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOILOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIKufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIJ-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIKOfXEduqHoOJbURZRw" points="[1159, -457, -4936, 1879]$[4707, -1811, -1388, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOILefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOILufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIL-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003E" source="_G_7NcOfXEduqHoOJbURZRw" target="_HAEXv-fXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIMufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOINOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOINefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIM-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIMOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIMefXEduqHoOJbURZRw" points="[778, -524, -2777, 1811]$[2743, -1811, -812, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOINufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIN-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOISOfXEduqHoOJbURZRw" element="_3ADC7B74022D4283E91F0061" source="_HAEXv-fXEduqHoOJbURZRw" target="_HAOIOOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIS-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOITefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOITufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOITOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOISefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOISufXEduqHoOJbURZRw" points="[728, -533, -2472, 1752]$[2446, -1769, -753, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIT-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIUOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIUefXEduqHoOJbURZRw" element="_3ADC7B74022D4283EEF900E2" source="_HAEXr-fXEduqHoOJbURZRw" target="_HAOIOOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIVOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIVufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOIV-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIVefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIUufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIU-fXEduqHoOJbURZRw" points="[0, -533, 0, 1752]$[0, -1769, 0, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIWOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIWefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIWufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_HAEXMOfXEduqHoOJbURZRw" target="_G_7NYOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIXefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIX-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOIYOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIXufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIW-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIXOfXEduqHoOJbURZRw" points="[-939, -524, 3225, 1761]$[-3191, -1761, 973, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIYefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIYufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIc-fXEduqHoOJbURZRw" element="_3ADC7B74022D428CD32901FD" source="_HAEXa-fXEduqHoOJbURZRw" target="_HAOIY-fXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIdufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIeOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOIeefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOId-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIdOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIdefXEduqHoOJbURZRw" points="[821, -524, -2887, 1761]$[2836, -1769, -872, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIeufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIe-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOInOfXEduqHoOJbURZRw" element="_3ADC7B74022D4283ED6D0088" source="_HAOIjOfXEduqHoOJbURZRw" target="_HAOIOOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIn-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIoefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOIoufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIoOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOInefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOInufXEduqHoOJbURZRw" points="[-635, -533, 2108, 1752]$[-2125, -1769, 618, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIo-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIpOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIpefXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_HAEXa-fXEduqHoOJbURZRw" target="_HAOIfOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIqOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIqufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOIq-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIqefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIpufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIp-fXEduqHoOJbURZRw" points="[-804, -524, 2751, 1761]$[-2743, -1769, 812, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIrOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIrefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIrufXEduqHoOJbURZRw" element="_3ADC7B74022D427A923B0002" source="_HAEXMOfXEduqHoOJbURZRw" target="_HAOIfOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIsefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIs-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOItOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIsufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIr-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIsOfXEduqHoOJbURZRw" points="[431, -524, -1498, 1761]$[1481, -1769, -448, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOItefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOItufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIt-fXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_HAOIfOfXEduqHoOJbURZRw" target="_HAEXv-fXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIuufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIvOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOIvefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIu-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIuOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIuefXEduqHoOJbURZRw" points="[0, -524, 0, 1811]$[0, -1811, 0, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIvufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIv-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAOIwOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A82F3026E" source="_HAOIY-fXEduqHoOJbURZRw" target="_G_xcZefXEduqHoOJbURZRw">
-              <children xmi:id="_HAOIw-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAOIxefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAOIxufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAOIxOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAOIwefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAOIwufXEduqHoOJbURZRw" points="[212, -318, 1853, 8175]$[212, -3837, 1853, 4656]$[-1508, -8176, 133, 317]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIx-fXEduqHoOJbURZRw" id="(0.87003255,0.4654088)"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAOIyOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAX5IOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294ECC1031E" source="_HAOIOOfXEduqHoOJbURZRw" target="_HAOIyefXEduqHoOJbURZRw">
-              <children xmi:id="_HAX5I-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAX5JefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAX5JufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAX5JOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAX5IefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAX5IufXEduqHoOJbURZRw" points="[0, -524, 0, 1456]$[0, -1464, 0, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAX5J-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAX5KOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAX5KefXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_HAOIyefXEduqHoOJbURZRw" target="_G_xcZefXEduqHoOJbURZRw">
-              <children xmi:id="_HAX5LOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAX5LufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAX5L-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAX5LefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAX5KufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAX5K-fXEduqHoOJbURZRw" points="[524, -524, -1405, 1354]$[1380, -1354, -550, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAX5MOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAX5MefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HAX5MufXEduqHoOJbURZRw" element="_3ADC7B74022D42B1EC1B0349" source="_G_7NwufXEduqHoOJbURZRw" target="_HAOIfOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAX5NefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAX5N-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAX5OOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAX5NufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAX5M-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAX5NOfXEduqHoOJbURZRw" points="[-203, -524, 660, 1761]$[-677, -1769, 186, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAX5OefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HAX5OufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-          </contents>
-        </eAnnotations>
-        <ownedComment xmi:id="_GhOfAufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5D03BF">
-          <body>02</body>
-        </ownedComment>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40FD854600D8" name="Breakdown">
-          <eAnnotations xmi:id="_Gk9IgOfXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41F05ECD0390">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41F05ECD0390" type="Class" name="BreakdownElement">
-              <children xmi:id="_G1Mj4OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G1Mj4-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G1Mj5OfXEduqHoOJbURZRw" width="2082" height="905"/>
-                </children>
-                <children xmi:id="_G1Mj5efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G1Mj5ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G1Mj5-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G1Mj6OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Mj6efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Mj6ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Mj6-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Mj7OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Mj7efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Mj7ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G1Mj7-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G1Mj4efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G1Mj4ufXEduqHoOJbURZRw" x="9220" y="10879"/>
-              </children>
-              <children xmi:id="_G1Mj8OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_G1Mj8-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G1Mj9OfXEduqHoOJbURZRw" width="4470" height="1117"/>
-                </children>
-                <children xmi:id="_G1Vt0OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G1Vt0efXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G1Vt0ufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G1Vt0-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Vt1OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Vt1efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Vt1ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Vt1-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Vt2OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Vt2efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G1Vt2ufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G1Mj8efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G1Mj8ufXEduqHoOJbURZRw" x="7823" y="15798"/>
-              </children>
-              <children xmi:id="_G1Vt2-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G1Vt3ufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G1Vt3-fXEduqHoOJbURZRw" width="4013" height="905"/>
-                </children>
-                <children xmi:id="_G1Vt4OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G1Vt4efXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G1Vt4ufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G1Vt4-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Vt5OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Vt5efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Vt5ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Vt5-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G1Vt6OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G1Vt6efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G1Vt6ufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G1Vt3OfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G1Vt3efXEduqHoOJbURZRw" x="7291" y="13314"/>
-              </children>
-              <children xmi:id="_G18K0efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_G18K1OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G18K1efXEduqHoOJbURZRw" width="4182" height="1117"/>
-                </children>
-                <children xmi:id="_G18K1ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G18K1-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G18K2OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G18K2efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18K2ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G18K2-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18K3OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G18K3efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18K3ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G18K3-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G18K4OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G18K0ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G18K0-fXEduqHoOJbURZRw" x="3547" y="15798"/>
-              </children>
-              <children xmi:id="_G18K4efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G18K5OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G18K5efXEduqHoOJbURZRw" width="2726" height="905"/>
-                </children>
-                <children xmi:id="_G18K5ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G18K5-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G18K6OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G18K6efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18K6ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G18K6-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18K7OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G18K7efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18K7ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G18K7-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G18K8OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G18K4ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G18K4-fXEduqHoOJbURZRw" x="3804" y="13314"/>
-              </children>
-              <children xmi:id="_G2FUsOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0063">
-                <children xmi:id="_G2FUs-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2FUtOfXEduqHoOJbURZRw" width="2269" height="905"/>
-                </children>
-                <children xmi:id="_G2FUtefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2FUtufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2FUt-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2FUuOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FUuefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FUuufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FUu-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FUvOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FUvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FUvufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2FUv-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2FUsefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2FUsufXEduqHoOJbURZRw" x="13699" y="10879"/>
-              </children>
-              <children xmi:id="_G2FUwOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G2FUw-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2FUxOfXEduqHoOJbURZRw" width="2675" height="905"/>
-                </children>
-                <children xmi:id="_G2FUxefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2FUxufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2FUx-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2FUyOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FUyefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FUyufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FUy-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FUzOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FUzefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FUzufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2FUz-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2FUwefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2FUwufXEduqHoOJbURZRw" x="12680" y="13314"/>
-              </children>
-              <children xmi:id="_G2FU_OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_G2FU_-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2FVAOfXEduqHoOJbURZRw" width="4013" height="1117"/>
-                </children>
-                <children xmi:id="_G2FVAefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2FVAufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2FVA-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2FVBOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FVBefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FVBufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FVB-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FVCOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FVCefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2FVCufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2FVC-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2FU_efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2FU_ufXEduqHoOJbURZRw" x="12420" y="15798"/>
-              </children>
-              <children xmi:id="_G2PFtOfXEduqHoOJbURZRw" element="_3ADC7B74022D41F06B6500E6">
-                <children xmi:id="_G2PFt-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2PFuOfXEduqHoOJbURZRw" width="2743" height="990"/>
-                </children>
-                <children xmi:id="_G2PFuefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2PFuufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2PFu-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2PFvOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PFvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PFvufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PFv-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PFwOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PFwefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PFwufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2PFw-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2PFtefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2PFtufXEduqHoOJbURZRw" x="16764" y="14291"/>
-              </children>
-              <children xmi:id="_G2PF8OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G2PF8-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2PF9OfXEduqHoOJbURZRw" width="1574" height="905"/>
-                </children>
-                <children xmi:id="_G2PF9efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2PF9ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2PF9-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2PF-OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PF-efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PF-ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PF--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PF_OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PF_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PF_ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2PF_-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2PF8efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2PF8ufXEduqHoOJbURZRw" x="6055" y="10984"/>
-              </children>
-              <children xmi:id="_G2PGAOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G2PGA-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2PGBOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G2PGBefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2PGBufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2PGB-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2PGCOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PGCefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PGCufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PGC-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PGDOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PGDefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2PGDufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2PGD-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2PGAefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2PGAufXEduqHoOJbURZRw" x="9762" y="7213" width="3859" height="1219"/>
-              </children>
-              <children xmi:id="_G2Y21efXEduqHoOJbURZRw" element="_3ADC7B74022D4119A4E602C1">
-                <children xmi:id="_G2Y22OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2Y22efXEduqHoOJbURZRw" width="2438" height="905"/>
-                </children>
-                <children xmi:id="_G2Y22ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2Y22-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2Y23OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2Y23efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y23ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2Y23-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y24OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2Y24efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y24ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2Y24-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2Y25OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2Y21ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2Y21-fXEduqHoOJbURZRw" x="16256" y="7526"/>
-              </children>
-              <children xmi:id="_G2Y3EefXEduqHoOJbURZRw" element="_3ADC7B74022D4283E8A10341">
-                <children xmi:id="_G2Y3FOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2Y3FefXEduqHoOJbURZRw" width="2946" height="905"/>
-                </children>
-                <children xmi:id="_G2Y3FufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2Y3F-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2Y3GOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2iAoOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iAoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iAoufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iAo-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iApOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iApefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iApufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2iAp-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2Y3EufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2Y3E-fXEduqHoOJbURZRw" x="10007" y="5545"/>
-              </children>
-              <children xmi:id="_G2iAuufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_G2iAvefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2iAvufXEduqHoOJbURZRw" width="2827" height="1032"/>
-                </children>
-                <children xmi:id="_G2iAv-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2iAwOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2iAwefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2iAwufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iAw-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iAxOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iAxefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iAxufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iAx-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iAyOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2iAyefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2iAu-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2iAvOfXEduqHoOJbURZRw" x="6256" y="1159"/>
-              </children>
-              <children xmi:id="_G2iAyufXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G2iAzefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2iAzufXEduqHoOJbURZRw" width="4267" height="905"/>
-                </children>
-                <children xmi:id="_G2iAz-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2iA0OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2iA0efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2iA0ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iA0-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iA1OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iA1efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iA1ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2iA1-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2iA2OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2iA2efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2iAy-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2iAzOfXEduqHoOJbURZRw" x="1981" y="8288"/>
-              </children>
-              <children xmi:id="_G2iA2ufXEduqHoOJbURZRw" element="_3ADC7B74022D410818790288">
-                <children xmi:id="_G2iA3efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2iA3ufXEduqHoOJbURZRw" width="2150" height="905"/>
-                </children>
-                <children xmi:id="_G2rxoOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2rxoefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2rxoufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2rxo-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2rxpOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2rxpefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2rxpufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2rxp-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2rxqOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2rxqefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2rxqufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2iA2-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2iA3OfXEduqHoOJbURZRw" x="15533" y="5706"/>
-              </children>
-              <children xmi:id="_G2rxxufXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_G2rxyefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2rxyufXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G2rxy-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2rxzOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2rxzefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2rxzufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2rxz-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2rx0OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2rx0efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2rx0ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2rx0-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2rx1OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2rx1efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2rxx-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rxyOfXEduqHoOJbURZRw" x="1100" y="2836"/>
-              </children>
-              <children xmi:id="_G2rx-ufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_G2rx_efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2rx_ufXEduqHoOJbURZRw" width="3589" height="1032"/>
-                </children>
-                <children xmi:id="_G2rx_-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2ryAOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2ryAefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2ryAufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2ryA-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2ryBOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2ryBefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2ryBufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2ryB-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2ryCOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2ryCefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2rx--fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rx_OfXEduqHoOJbURZRw" x="9787" y="3039"/>
-              </children>
-              <children xmi:id="_G2ryHOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0031">
-                <children xmi:id="_G2ryH-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2ryIOfXEduqHoOJbURZRw" width="1862" height="905"/>
-                </children>
-                <children xmi:id="_G2ryIefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2ryIufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2ryI-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2ryJOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2ryJefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2ryJufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2ryJ-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2ryKOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2ryKefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2ryKufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2ryK-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2ryHefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2ryHufXEduqHoOJbURZRw" x="2218" y="10219"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gk9IgufXEduqHoOJbURZRw" description="The Breakdown package contains the definition of breakdown elements that form breakdown structures.  The diagram shows the taxonomy of the main classes.  It present the different types of Breakdown Elements such as Activity and Descriptor as well as their key relationships defined in the following sections."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G1Vt6-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G1Vt2-fXEduqHoOJbURZRw" target="_G1Mj4OfXEduqHoOJbURZRw">
-                <children xmi:id="_G1Vt7ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G1Vt8OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G1Vt8efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G1Vt7-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G1Vt7OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G1Vt7efXEduqHoOJbURZRw" points="[152, -457, 0, 2082]$[152, -2091, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G1Vt8ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G1Vt8-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G1yZwOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D7" source="_G1Mj8OfXEduqHoOJbURZRw" target="_G1Vt2-fXEduqHoOJbURZRw">
-                <children xmi:id="_G1yZw-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G1yZxefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G1yZxufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G1yZxOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G1yZx-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G1yZyefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G1yZyOfXEduqHoOJbURZRw" x="150" y="457"/>
-                </children>
-                <children xmi:id="_G1yZyufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G1yZzOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G1yZy-fXEduqHoOJbURZRw" x="-70" y="-347"/>
-                </children>
-                <children xmi:id="_G1yZzefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G1yZz-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G1yZzufXEduqHoOJbURZRw" x="-46" y="212"/>
-                </children>
-                <children xmi:id="_G1yZ0OfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G18KwOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G1yZ0efXEduqHoOJbURZRw" x="64" y="-347"/>
-                </children>
-                <children xmi:id="_G18KwefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G18Kw-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18KxOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18KwufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G18KxefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G18Kx-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18KyOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18KxufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G18KyefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G18Ky-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18KzOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18KyufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G18KzefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G18Kz-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18K0OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18KzufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G1yZwefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G1yZwufXEduqHoOJbURZRw" points="[0, -558, -50, 1930]$[0, -2040, -50, 448]"/>
-              </edges>
-              <edges xmi:id="_G18K8efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F030D" source="_G18K0efXEduqHoOJbURZRw" target="_G18K4efXEduqHoOJbURZRw">
-                <children xmi:id="_G18K9OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G18K9ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G18K9-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G18K9efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G18K-OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G18K-ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18K-efXEduqHoOJbURZRw" x="148" y="450"/>
-                </children>
-                <children xmi:id="_G18K--fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G18K_efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18K_OfXEduqHoOJbURZRw" x="-72" y="-346"/>
-                </children>
-                <children xmi:id="_G18K_ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G18LAOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18K_-fXEduqHoOJbURZRw" x="-76" y="204"/>
-                </children>
-                <children xmi:id="_G18LAefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G18LA-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18LAufXEduqHoOJbURZRw" x="59" y="-346"/>
-                </children>
-                <children xmi:id="_G18LBOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G18LBufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18LB-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18LBefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G18LCOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G18LCufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18LC-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18LCefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G18LDOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G18LDufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18LD-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18LDefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G18LEOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G18LEufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G18LE-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G18LEefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G18K8ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G18K8-fXEduqHoOJbURZRw" points="[372, -558, -643, 1930]$[372, -2048, -643, 440]"/>
-              </edges>
-              <edges xmi:id="_G2FU0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600160" source="_G2FUwOfXEduqHoOJbURZRw" target="_G1Mj4OfXEduqHoOJbURZRw">
-                <children xmi:id="_G2FU0-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2FU1efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2FU1ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2FU1OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2FU0efXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2FU0ufXEduqHoOJbURZRw" points="[-584, -457, 2717, 2082]$[-2717, -2091, 584, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2FU1-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2FU2OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2FU2efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003F" source="_G2FUwOfXEduqHoOJbURZRw" target="_G2FUsOfXEduqHoOJbURZRw">
-                <children xmi:id="_G2FU3OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2FU3ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2FU3-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2FU3efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2FU4OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G2FU4ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU4efXEduqHoOJbURZRw" x="84" y="-135"/>
-                </children>
-                <children xmi:id="_G2FU4-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G2FU5efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU5OfXEduqHoOJbURZRw" x="183" y="1106"/>
-                </children>
-                <children xmi:id="_G2FU5ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G2FU6OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU5-fXEduqHoOJbURZRw" x="-368" y="-135"/>
-                </children>
-                <children xmi:id="_G2FU6efXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G2FU6-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU6ufXEduqHoOJbURZRw" x="72" y="-346"/>
-                </children>
-                <children xmi:id="_G2FU7OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G2FU7ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FU7-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU7efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2FU8OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G2FU8ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FU8-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU8efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2FU9OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G2FU9ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FU9-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU9efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G2FU-OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G2FU-ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FU--fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FU-efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2FU2ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2FU2-fXEduqHoOJbURZRw" points="[736, -448, -533, 2091]$[736, -2091, -533, 448]"/>
-              </edges>
-              <edges xmi:id="_G2FVDOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60016A" source="_G2FU_OfXEduqHoOJbURZRw" target="_G2FUwOfXEduqHoOJbURZRw">
-                <children xmi:id="_G2FVD-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2FVEefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2FVEufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2FVEOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2FVE-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G2FVFefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FVFOfXEduqHoOJbURZRw" x="164" y="406"/>
-                </children>
-                <children xmi:id="_G2FVFufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G2FVGOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FVF-fXEduqHoOJbURZRw" x="-64" y="-348"/>
-                </children>
-                <children xmi:id="_G2FVGefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G2FVG-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FVGufXEduqHoOJbURZRw" x="-17" y="194"/>
-                </children>
-                <children xmi:id="_G2FVHOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G2FVHufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FVHefXEduqHoOJbURZRw" x="59" y="-348"/>
-                </children>
-                <children xmi:id="_G2FVH-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G2FVIefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FVIufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FVIOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2FVI-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G2FVJefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FVJufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FVJOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2FVJ-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G2FVKefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2FVKufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2FVKOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G2PFsOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G2PFsufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PFs-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PFsefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2FVDefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2FVDufXEduqHoOJbURZRw" points="[-245, -567, 618, 1921]$[-245, -2048, 618, 440]"/>
-              </edges>
-              <edges xmi:id="_G2PFxOfXEduqHoOJbURZRw" element="_3ADC7B74022D41F06BBC030D" source="_G2PFtOfXEduqHoOJbURZRw" target="_G2FU_OfXEduqHoOJbURZRw">
-                <children xmi:id="_G2PFx-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2PFyefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2PFyufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2PFyOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2PFy-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G2PFzefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PFzOfXEduqHoOJbURZRw" x="-179" y="-230"/>
-                </children>
-                <children xmi:id="_G2PFzufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G2PF0OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PFz-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G2PF0efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G2PF0-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PF0ufXEduqHoOJbURZRw" x="-109" y="67"/>
-                </children>
-                <children xmi:id="_G2PF1OfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G2PF1ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PF1efXEduqHoOJbURZRw" x="-1587" y="-358"/>
-                </children>
-                <children xmi:id="_G2PF1-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G2PF2efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PF2ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PF2OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2PF2-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G2PF3efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PF3ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PF3OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2PF3-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G2PF4efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PF4ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PF4OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G2PF4-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G2PF5efXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2PF5ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PF5OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2PFxefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2PFxufXEduqHoOJbURZRw" points="[143, 491, 3852, -1083]$[143, 1295, 3852, -279]$[-1701, 1295, 2006, -279]"/>
-              </edges>
-              <edges xmi:id="_G2PF5-fXEduqHoOJbURZRw" element="_3ADC7B74022D41F94AB90015" source="_G2PFtOfXEduqHoOJbURZRw" target="_G2FUwOfXEduqHoOJbURZRw">
-                <children xmi:id="_G2PF6ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2PF7OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2PF7efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2PF6-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2PF6OfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2PF6efXEduqHoOJbURZRw" points="[-1380, -287, 3191, 626]$[-3234, -660, 1337, 254]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2PF7ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2PF7-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2PGEOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FFD300EF" source="_G2PGAOfXEduqHoOJbURZRw" target="_G2PF8OfXEduqHoOJbURZRw">
-                <children xmi:id="_G2PGE-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2PGFefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2PGFufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2PGFOfXEduqHoOJbURZRw" x="338" y="-770"/>
-                </children>
-                <children xmi:id="_G2PGF-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G2PGGefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PGGOfXEduqHoOJbURZRw" x="-538" y="-245"/>
-                </children>
-                <children xmi:id="_G2PGGufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G2PGHOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PGG-fXEduqHoOJbURZRw" x="943" y="237"/>
-                </children>
-                <children xmi:id="_G2PGHefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G2PGH-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2PGHufXEduqHoOJbURZRw" x="539" y="-457"/>
-                </children>
-                <children xmi:id="_G2Y2sOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G2Y2sufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y2sefXEduqHoOJbURZRw" x="65" y="-1253"/>
-                </children>
-                <children xmi:id="_G2Y2s-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G2Y2tefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y2tufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y2tOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2Y2t-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G2Y2uefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y2uufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y2uOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2Y2u-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G2Y2vefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y2vufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y2vOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G2Y2v-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G2Y2wefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y2wufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y2wOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2PGEefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2PGEufXEduqHoOJbURZRw" points="[-1718, 381, 1938, -3124]$[-4106, 381, -448, -3124]$[-4106, 3056, -448, -448]"/>
-              </edges>
-              <edges xmi:id="_G2Y2w-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G1Mj4OfXEduqHoOJbURZRw" target="_G2PGAOfXEduqHoOJbURZRw">
-                <children xmi:id="_G2Y2xufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2Y2yOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2Y2yefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2Y2x-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2Y2xOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2Y2xefXEduqHoOJbURZRw" points="[152, -457, -1066, 3048]$[999, -2895, -220, 609]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2Y2yufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2Y2y-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2Y2zOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003E" source="_G2FUsOfXEduqHoOJbURZRw" target="_G2PGAOfXEduqHoOJbURZRw">
-                <children xmi:id="_G2Y2z-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2Y20efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2Y20ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2Y20OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2Y2zefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2Y2zufXEduqHoOJbURZRw" points="[-440, -457, 2912, 3048]$[-2768, -2895, 584, 609]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2Y20-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2Y21OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2Y25efXEduqHoOJbURZRw" element="_3ADC7B74022D4119A4F8020A" source="_G2PGAOfXEduqHoOJbURZRw" target="_G2Y21efXEduqHoOJbURZRw">
-                <children xmi:id="_G2Y26OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2Y26ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2Y26-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2Y26efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2Y27OfXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D4119A4F90073">
-                  <children xmi:id="_G2Y27ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y27efXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_G2Y27-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4119A4F90073">
-                  <children xmi:id="_G2Y28efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y28OfXEduqHoOJbURZRw" x="-151" y="-347"/>
-                </children>
-                <children xmi:id="_G2Y28ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4119A4F90069">
-                  <children xmi:id="_G2Y29OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y28-fXEduqHoOJbURZRw" x="-287" y="-245"/>
-                </children>
-                <children xmi:id="_G2Y29efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4119A4F90069">
-                  <children xmi:id="_G2Y29-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y29ufXEduqHoOJbURZRw" x="-930" y="313"/>
-                </children>
-                <children xmi:id="_G2Y2-OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4119A4F90073">
-                  <children xmi:id="_G2Y2-ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y2--fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y2-efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2Y2_OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4119A4F90069">
-                  <children xmi:id="_G2Y2_ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y2_-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y2_efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2Y3AOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4119A4F90073">
-                  <children xmi:id="_G2Y3AufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y3A-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y3AefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G2Y3BOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4119A4F90069">
-                  <children xmi:id="_G2Y3BufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2Y3B-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2Y3BefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2Y25ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2Y25-fXEduqHoOJbURZRw" points="[1718, 152, -4275, 0]$[4775, 152, -1219, 0]"/>
-              </edges>
-              <edges xmi:id="_G2Y3COfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G18K4efXEduqHoOJbURZRw" target="_G1Mj4OfXEduqHoOJbURZRw">
-                <children xmi:id="_G2Y3C-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2Y3DefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2Y3DufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2Y3DOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2Y3CefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2Y3CufXEduqHoOJbURZRw" points="[618, -457, -2988, 2082]$[2946, -2091, -660, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2Y3D-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2Y3EOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2iAqOfXEduqHoOJbURZRw" element="_3ADC7B74022D4283E91F0061" source="_G2PGAOfXEduqHoOJbURZRw" target="_G2Y3EefXEduqHoOJbURZRw">
-                <children xmi:id="_G2iAq-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2iArefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2iArufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2iArOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2iAqefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2iAqufXEduqHoOJbURZRw" points="[0, -618, 0, 1210]$[0, -1380, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2iAr-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2iAsOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2iAsefXEduqHoOJbURZRw" element="_3ADC7B74022D4283EEF900E2" source="_G2Y21efXEduqHoOJbURZRw" target="_G2Y3EefXEduqHoOJbURZRw">
-                <children xmi:id="_G2iAtOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2iAtufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2iAt-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2iAtefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2iAsufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2iAs-fXEduqHoOJbURZRw" points="[-1227, -423, 4766, 1557]$[-4622, -1532, 1371, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2iAuOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2iAuefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2rxq-fXEduqHoOJbURZRw" element="_3ADC7B74022D4283ED6D0088" source="_G2iA2ufXEduqHoOJbURZRw" target="_G2Y3EefXEduqHoOJbURZRw">
-                <children xmi:id="_G2rxrufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2rxsOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2rxsefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rxr-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2rxrOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2rxrefXEduqHoOJbURZRw" points="[-1083, -152, 4758, 609]$[-4368, -575, 1473, 186]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rxsufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rxs-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2rxtOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A923B0002" source="_G18K4efXEduqHoOJbURZRw" target="_G2iAyufXEduqHoOJbURZRw">
-                <children xmi:id="_G2rxt-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2rxuefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2rxuufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rxuOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2rxtefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2rxtufXEduqHoOJbURZRw" points="[-237, -457, 2302, 4673]$[-2328, -4682, 211, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rxu-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rxvOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2rxvefXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G2iAyufXEduqHoOJbURZRw" target="_G2PGAOfXEduqHoOJbURZRw">
-                <children xmi:id="_G2rxwOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2rxwufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2rxw-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rxwefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2rxvufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2rxv-fXEduqHoOJbURZRw" points="[914, -448, -6451, 465]$[914, -1278, -6451, -364]$[5647, -1278, -1718, -364]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rxxOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rxxefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2rx1ufXEduqHoOJbURZRw" element="_3ADC7B74022D427A82F3026E" source="_G2rxxufXEduqHoOJbURZRw" target="_G2iAuufXEduqHoOJbURZRw">
-                <children xmi:id="_G2rx2efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2rx2-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2rx3OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rx2ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2rx1-fXEduqHoOJbURZRw" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2rx2OfXEduqHoOJbURZRw" points="[1422, -524, -3302, 1151]$[3302, -1185, -1422, 491]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx3efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx3ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2rx3-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G2PF8OfXEduqHoOJbURZRw" target="_G2iAyufXEduqHoOJbURZRw">
-                <children xmi:id="_G2rx4ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2rx5OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2rx5efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rx4-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2rx4OfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2rx4efXEduqHoOJbURZRw" points="[-643, -457, 3064, 2133]$[-3073, -2142, 635, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx5ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx5-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2rx6OfXEduqHoOJbURZRw" element="_3ADC7B74022D428CD32901FD" source="_G2PF8OfXEduqHoOJbURZRw" target="_G2rxxufXEduqHoOJbURZRw">
-                <children xmi:id="_G2rx6-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2rx7efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2rx7ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rx7OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2rx6efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2rx6ufXEduqHoOJbURZRw" points="[-952, -132, 4392, 7911]$[-6535, -132, -1191, 7911]$[-6535, -7725, -1191, 318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx7-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx8OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2rx8efXEduqHoOJbURZRw" element="_3ADC7B74022D427A831800B8" source="_G18K0efXEduqHoOJbURZRw" target="_G2rxxufXEduqHoOJbURZRw">
-                <children xmi:id="_G2rx9OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2rx9ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2rx9-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2rx9efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2rx8ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2rx8-fXEduqHoOJbURZRw" points="[-2117, -212, 926, 12938]$[-5213, -212, -2170, 12938]$[-5213, -13256, -2170, -106]$[-4578, -13256, -1535, -106]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx-OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2rx-efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2ryCufXEduqHoOJbURZRw" element="_3ADC7B74022D4294ECC1031E" source="_G2Y3EefXEduqHoOJbURZRw" target="_G2rx-ufXEduqHoOJbURZRw">
-                <children xmi:id="_G2ryDefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2ryD-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2ryEOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2ryDufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2ryC-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2ryDOfXEduqHoOJbURZRw" points="[0, -448, -101, 1989]$[0, -1930, -101, 508]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2ryEefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2ryEufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2ryE-fXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_G2rx-ufXEduqHoOJbURZRw" target="_G2iAuufXEduqHoOJbURZRw">
-                <children xmi:id="_G2ryFufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2ryGOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2ryGefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2ryF-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2ryFOfXEduqHoOJbURZRw" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2ryFefXEduqHoOJbURZRw" points="[-1075, -524, 2836, 1354]$[-2836, -1363, 1075, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2ryGufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G2ryG-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G2ryLOfXEduqHoOJbURZRw" element="_3ADC7B74022D42B1EC1B0349" source="_G2ryHOfXEduqHoOJbURZRw" target="_G2iAyufXEduqHoOJbURZRw">
-                <children xmi:id="_G21ioOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G21ioufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G21io-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G21ioefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2ryLefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2ryLufXEduqHoOJbURZRw" points="[220, -457, -745, 1473]$[728, -1481, -237, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G21ipOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G21ipefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F5C5130203" type="Class" name="WorkBreakdownStructure">
-              <children xmi:id="_G21ipufXEduqHoOJbURZRw" type="Note">
-                <children xmi:id="_G21iqefXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_G21iqufXEduqHoOJbURZRw" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_G21ip-fXEduqHoOJbURZRw" description="{Iteration.prefix = &quot;Iteration&quot;}&#xA;" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G21iqOfXEduqHoOJbURZRw" x="20921" y="13859" width="3175" height="1244"/>
-              </children>
-              <children xmi:id="_G21iq-fXEduqHoOJbURZRw" type="Note">
-                <children xmi:id="_G21irufXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_G21ir-fXEduqHoOJbURZRw" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_G21irOfXEduqHoOJbURZRw" description="{Phase.prefix = &quot;Phase&quot;}&#xA;" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G21irefXEduqHoOJbURZRw" x="17754" y="13859" width="2802" height="1244"/>
-              </children>
-              <children xmi:id="_G21isOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CB">
-                <children xmi:id="_G21is-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G21itOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G21itefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G21itufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G21it-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G21iuOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G21iuefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G21iuufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G21iu-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G21ivOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G21ivefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G21ivufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G21iv-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G21isefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G21isufXEduqHoOJbURZRw" x="21581" y="12056"/>
-              </children>
-              <children xmi:id="_G21iwOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CA">
-                <children xmi:id="_G21iw-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G21ixOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G21ixefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2-skOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2-skefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2-skufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-sk-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-slOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-slefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-slufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-sl-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-smOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2-smefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G21iwefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G21iwufXEduqHoOJbURZRw" x="19151" y="12107"/>
-              </children>
-              <children xmi:id="_G2-smufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G2-snefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2-snufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G2-sn-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2-soOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2-soefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2-soufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-so-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-spOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-spefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-spufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-sp-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-sqOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2-sqefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2-sm-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2-snOfXEduqHoOJbURZRw" x="13775" y="8144"/>
-              </children>
-              <children xmi:id="_G2-squfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_G2-srefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2-srufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G2-sr-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2-ssOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2-ssefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2-ssufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-ss-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-stOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-stefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-stufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-st-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-suOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2-suefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2-sq-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2-srOfXEduqHoOJbURZRw" x="14190" y="13934"/>
-              </children>
-              <children xmi:id="_G2-suufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G2-svefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2-svufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G2-sv-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2-swOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2-swefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2-swufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-sw-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-sxOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-sxefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-sxufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-sx-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-syOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2-syefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2-su-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2-svOfXEduqHoOJbURZRw" x="13351" y="11700"/>
-              </children>
-              <children xmi:id="_G2-s7efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0031">
-                <children xmi:id="_G2-s8OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G2-s8efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G2-s8ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G2-s8-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G2-s9OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G2-s9efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-s9ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-s9-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-s-OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-s-efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-s-ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G2-s--fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G2-s_OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2-s7ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2-s7-fXEduqHoOJbURZRw" x="11658" y="7027"/>
-              </children>
-              <children xmi:id="_G2-s_efXEduqHoOJbURZRw" element="_3ADC7B74022D410800570276">
-                <children xmi:id="_G3IdkOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G3IdkefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G3IdkufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G3Idk-fXEduqHoOJbURZRw" type="Kind"/>
-                <children xmi:id="_G3IdlOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G3IdlefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G3IdlufXEduqHoOJbURZRw" type="EnumerationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3Idl-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3IdmOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3IdmefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3IdmufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3Idm-fXEduqHoOJbURZRw"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G2-s_ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2-s_-fXEduqHoOJbURZRw" x="5459" y="12347" width="3234" height="2716"/>
-              </children>
-              <children xmi:id="_G3Rnh-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G3RniufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G3Rni-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G3RnjOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G3RnjefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G3RnjufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G3Rnj-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3RnkOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3RnkefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3RnkufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3Rnk-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3RnlOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3RnlefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G3RnlufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G3RniOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3RniefXEduqHoOJbURZRw" x="19126" y="8136" width="2794" height="2116"/>
-              </children>
-              <children xmi:id="_G3RnqefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G3RnrOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G3RnrefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G3RnrufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G3Rnr-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G3RnsOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G3RnsefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3RnsufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3Rns-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3RntOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3RntefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3RntufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3Rnt-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G3RnuOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G3RnqufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" showListSignature="true" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3Rnq-fXEduqHoOJbURZRw" x="16814" y="1888" width="7526" height="2827"/>
-              </children>
-              <children xmi:id="_G3bYvefXEduqHoOJbURZRw" element="_3ADC7B74022D410818790288">
-                <children xmi:id="_G3bYwOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G3bYwefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G3bYwufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G3bYw-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G3bYxOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G3bYxefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYxufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3bYx-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYyOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3bYyefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYyufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3bYy-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G3bYzOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G3bYvufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3bYv-fXEduqHoOJbURZRw" x="4360" y="10363" width="7230" height="1524"/>
-              </children>
-              <children xmi:id="_G3bYzefXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G3bY0OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G3bY0efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G3bY0ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G3bY0-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G3bY1OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G3bY1efXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bY1ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3bY1-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bY2OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3bY2efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bY2ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3bY2-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G3bY3OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G3bYzufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" showListSignature="true" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3bYz-fXEduqHoOJbURZRw" x="5664" y="3750" width="5943" height="2353"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlGSYefXEduqHoOJbURZRw" description="This diagram shows the view on Breakdown Elements from a work breakdown perspective called WBS (Work Breakdown Structure) that includes Tasks and Activities (but also the notion of Milestones that do not represent work).  UMA also defines two more views that have been defined as Work Product Breakdown Structure and Team Profile Breakdown Structure."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G2-syufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F030D" source="_G2-squfXEduqHoOJbURZRw" target="_G2-suufXEduqHoOJbURZRw">
-                <children xmi:id="_G2-szefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G2-sz-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G2-s0OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G2-szufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2-s0efXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G2-s0-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s0ufXEduqHoOJbURZRw" x="244" y="406"/>
-                </children>
-                <children xmi:id="_G2-s1OfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G2-s1ufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s1efXEduqHoOJbURZRw" x="-103" y="-348"/>
-                </children>
-                <children xmi:id="_G2-s1-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G2-s2efXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s2OfXEduqHoOJbURZRw" x="5" y="211"/>
-                </children>
-                <children xmi:id="_G2-s2ufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G2-s3OfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s2-fXEduqHoOJbURZRw" x="98" y="-348"/>
-                </children>
-                <children xmi:id="_G2-s3efXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G2-s3-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-s4OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s3ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2-s4efXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G2-s4-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-s5OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s4ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G2-s5efXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G2-s5-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-s6OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s5ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G2-s6efXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G2-s6-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G2-s7OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G2-s6ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G2-sy-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G2-szOfXEduqHoOJbURZRw" points="[-33, -558, 16, 2590]$[-33, -2658, 16, 491]"/>
-              </edges>
-              <edges xmi:id="_G3IdnOfXEduqHoOJbURZRw" type="NoteAttachment" source="_G21iq-fXEduqHoOJbURZRw" target="_G21iwOfXEduqHoOJbURZRw">
-                <styles xmi:type="notation:ConnectorStyle" xmi:id="_G3IdnefXEduqHoOJbURZRw" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3IdnufXEduqHoOJbURZRw" points="[0, -626, 0, 1253]$[0, -1388, 0, 491]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3RngOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3RngefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3RngufXEduqHoOJbURZRw" type="NoteAttachment" source="_G21ipufXEduqHoOJbURZRw" target="_G21isOfXEduqHoOJbURZRw">
-                <styles xmi:type="notation:ConnectorStyle" xmi:id="_G3Rng-fXEduqHoOJbURZRw" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3RnhOfXEduqHoOJbURZRw" points="[-25, -626, 25, 1303]$[-42, -1439, 8, 491]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3RnhefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3RnhufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3Rnl-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F02A0" source="_G21isOfXEduqHoOJbURZRw" target="_G3Rnh-fXEduqHoOJbURZRw">
-                <children xmi:id="_G3RnmufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3RnnOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3RnnefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3Rnm-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3RnmOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3RnmefXEduqHoOJbURZRw" points="[-287, -499, 1642, 2853]$[-1329, -2294, 601, 1058]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3RnnufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3Rnn-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3RnoOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F029F" source="_G21iwOfXEduqHoOJbURZRw" target="_G3Rnh-fXEduqHoOJbURZRw">
-                <children xmi:id="_G3Rno-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3RnpefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3RnpufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3RnpOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3RnoefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3RnoufXEduqHoOJbURZRw" points="[186, -499, -1185, 2904]$[939, -2345, -431, 1058]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3Rnp-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3RnqOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3RnuefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6002B5" source="_G3RnqefXEduqHoOJbURZRw" target="_G3RnqefXEduqHoOJbURZRw">
-                <children xmi:id="_G3RnvOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3RnvufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3Rnv-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3RnvefXEduqHoOJbURZRw" x="948" y="-2786"/>
-                </children>
-                <children xmi:id="_G3RnwOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3RnwufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3RnwefXEduqHoOJbURZRw" x="224" y="-579"/>
-                </children>
-                <children xmi:id="_G3Rnw-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3RnxefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3RnxOfXEduqHoOJbURZRw" x="1449" y="-504"/>
-                </children>
-                <children xmi:id="_G3RnxufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3RnyOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3Rnx-fXEduqHoOJbURZRw" x="-556" y="-241"/>
-                </children>
-                <children xmi:id="_G3RnyefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3Rny-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3RnyufXEduqHoOJbURZRw" x="-145" y="334"/>
-                </children>
-                <children xmi:id="_G3RnzOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3RnzufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3Rnz-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3RnzefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3Rn0OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3Rn0ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3Rn0-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3Rn0efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3Rn1OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3Rn1ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3Rn1-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3Rn1efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G3Rn2OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3Rn2ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3Rn2-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3Rn2efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3RnuufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3Rnu-fXEduqHoOJbURZRw" points="[3757, -662, 3757, -662]$[6138, -662, 6138, -662]$[6138, -2329, 6138, -2329]$[502, -2329, 502, -2329]$[502, -1429, 502, -1429]"/>
-              </edges>
-              <edges xmi:id="_G3Rn3OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G2-smufXEduqHoOJbURZRw" target="_G3RnqefXEduqHoOJbURZRw">
-                <children xmi:id="_G3Rn3-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3Rn4efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3Rn4ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3Rn4OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3Rn3efXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3Rn3ufXEduqHoOJbURZRw" points="[516, -499, -5274, 4834]$[4233, -3920, -1557, 1413]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3Rn4-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3Rn5OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3Rn5efXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FFD300EF" source="_G3RnqefXEduqHoOJbURZRw" target="_G3Rnh-fXEduqHoOJbURZRw">
-                <children xmi:id="_G3Rn6OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3Rn6ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3Rn6-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3Rn6efXEduqHoOJbURZRw" x="-763" y="923"/>
-                </children>
-                <children xmi:id="_G3Rn7OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G3bYgOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3Rn7efXEduqHoOJbURZRw" x="-1684" y="335"/>
-                </children>
-                <children xmi:id="_G3bYgefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G3bYg-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYgufXEduqHoOJbURZRw" x="-229" y="-270"/>
-                </children>
-                <children xmi:id="_G3bYhOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G3bYhufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYhefXEduqHoOJbURZRw" x="1410" y="-254"/>
-                </children>
-                <children xmi:id="_G3bYh-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G3bYiefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYiOfXEduqHoOJbURZRw" x="123" y="262"/>
-                </children>
-                <children xmi:id="_G3bYiufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G3bYjOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYjefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYi-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bYjufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G3bYkOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYkefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYj-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bYkufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G3bYlOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYlefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYk-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G3bYlufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G3bYmOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYmefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYl-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3Rn5ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3Rn5-fXEduqHoOJbURZRw" points="[3757, 820, 3810, -5054]$[6826, 820, 6879, -5054]$[6826, 5794, 6879, -80]$[1349, 5794, 1402, -80]"/>
-              </edges>
-              <edges xmi:id="_G3bYmufXEduqHoOJbURZRw" element="_3ADC7B74022D421E8F0C0281" source="_G3RnqefXEduqHoOJbURZRw" target="_G3RnqefXEduqHoOJbURZRw">
-                <children xmi:id="_G3bYnefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3bYn-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3bYoOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3bYnufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bYoefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G3bYo-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYoufXEduqHoOJbURZRw" x="-149" y="548"/>
-                </children>
-                <children xmi:id="_G3bYpOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G3bYpufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYpefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G3bYp-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G3bYqefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYqOfXEduqHoOJbURZRw" x="1153" y="532"/>
-                </children>
-                <children xmi:id="_G3bYqufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G3bYrOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYq-fXEduqHoOJbURZRw" x="428" y="-326"/>
-                </children>
-                <children xmi:id="_G3bYrefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G3bYr-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYsOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYrufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bYsefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G3bYs-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYtOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYsufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bYtefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G3bYt-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYuOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYtufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G3bYuefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G3bYu-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bYvOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bYuufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3bYm-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3bYnOfXEduqHoOJbURZRw" points="[-3757, -767, -3757, -767]$[-5107, -767, -5107, -767]$[-5107, -2329, -5107, -2329]$[-847, -2329, -847, -2329]$[-847, -1429, -847, -1429]"/>
-              </edges>
-              <edges xmi:id="_G3bY3efXEduqHoOJbURZRw" element="_3ADC7B74022D4280ED3800A0" source="_G3bYvefXEduqHoOJbURZRw" target="_G3bYzefXEduqHoOJbURZRw">
-                <children xmi:id="_G3bY4OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3bY4ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3bY4-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3bY4efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bY5OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4280ED3800A2">
-                  <children xmi:id="_G3bY5ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY5efXEduqHoOJbURZRw" x="-266" y="144"/>
-                </children>
-                <children xmi:id="_G3bY5-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4280ED3800A2">
-                  <children xmi:id="_G3bY6efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY6OfXEduqHoOJbURZRw" x="-258" y="-1626"/>
-                </children>
-                <children xmi:id="_G3bY6ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4280ED3800A1">
-                  <children xmi:id="_G3bY7OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY6-fXEduqHoOJbURZRw" x="170" y="245"/>
-                </children>
-                <children xmi:id="_G3bY7efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4280ED3800A1">
-                  <children xmi:id="_G3bY7-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY7ufXEduqHoOJbURZRw" x="153" y="-508"/>
-                </children>
-                <children xmi:id="_G3bY8OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4280ED3800A2">
-                  <children xmi:id="_G3bY8ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bY8-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY8efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bY9OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4280ED3800A1">
-                  <children xmi:id="_G3bY9ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bY9-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY9efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3bY-OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4280ED3800A2">
-                  <children xmi:id="_G3bY-ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bY--fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY-efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G3bY_OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4280ED3800A1">
-                  <children xmi:id="_G3bY_ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3bY_-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3bY_efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3bY3ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3bY3-fXEduqHoOJbURZRw" points="[-1185, -762, -1845, 5435]$[-1185, -5020, -1845, 1176]"/>
-              </edges>
-              <edges xmi:id="_G3lJgOfXEduqHoOJbURZRw" element="_3ADC7B74022D4280ED4000CD" source="_G3bYvefXEduqHoOJbURZRw" target="_G3bYzefXEduqHoOJbURZRw">
-                <children xmi:id="_G3lJg-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3lJhefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3lJhufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3lJhOfXEduqHoOJbURZRw" x="750" y="1026"/>
-                </children>
-                <children xmi:id="_G3lJh-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4280ED4000CF">
-                  <children xmi:id="_G3lJiefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJiOfXEduqHoOJbURZRw" x="-268" y="-177"/>
-                </children>
-                <children xmi:id="_G3lJiufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4280ED4000CF">
-                  <children xmi:id="_G3lJjOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJi-fXEduqHoOJbURZRw" x="-234" y="1771"/>
-                </children>
-                <children xmi:id="_G3lJjefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4280ED4000CE">
-                  <children xmi:id="_G3lJj-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJjufXEduqHoOJbURZRw" x="194" y="-157"/>
-                </children>
-                <children xmi:id="_G3lJkOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4280ED4000CE">
-                  <children xmi:id="_G3lJkufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJkefXEduqHoOJbURZRw" x="169" y="631"/>
-                </children>
-                <children xmi:id="_G3lJk-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4280ED4000CF">
-                  <children xmi:id="_G3lJlefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3lJlufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJlOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3lJl-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4280ED4000CE">
-                  <children xmi:id="_G3lJmefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3lJmufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJmOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3lJm-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4280ED4000CF">
-                  <children xmi:id="_G3lJnefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3lJnufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJnOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G3lJn-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4280ED4000CE">
-                  <children xmi:id="_G3lJoefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3lJoufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3lJoOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3lJgefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3lJgufXEduqHoOJbURZRw" points="[397, -762, -262, 5435]$[397, -5029, -262, 1168]"/>
-              </edges>
-              <edges xmi:id="_G3lJo-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G2-suufXEduqHoOJbURZRw" target="_G2-smufXEduqHoOJbURZRw">
-                <children xmi:id="_G3lJpufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3lJqOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3lJqefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3lJp-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3lJpOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3lJpefXEduqHoOJbURZRw" points="[25, -499, -25, 3056]$[25, -3073, -25, 482]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJqufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJq-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3lJrOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A923B0002" source="_G2-suufXEduqHoOJbURZRw" target="_G3bYzefXEduqHoOJbURZRw">
-                <children xmi:id="_G3lJr-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3lJsefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3lJsufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3lJsOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3lJrefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3lJrufXEduqHoOJbURZRw" points="[-414, -499, 5681, 6764]$[-5105, -6087, 990, 1176]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJs-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJtOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3lJtefXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G3Rnh-fXEduqHoOJbURZRw" target="_G3bYzefXEduqHoOJbURZRw">
-                <children xmi:id="_G3lJuOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3lJuufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3lJu-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3lJuefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3lJtufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3lJt-fXEduqHoOJbURZRw" points="[-1405, -516, 10481, 3750]$[-8915, -3200, 2971, 1066]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJvOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJvefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3lJvufXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G3bYzefXEduqHoOJbURZRw" target="_G3RnqefXEduqHoOJbURZRw">
-                <children xmi:id="_G3lJwefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3lJw-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3lJxOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3lJwufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3lJv-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3lJwOfXEduqHoOJbURZRw" points="[2971, -406, -8966, 1219]$[8170, -1117, -3767, 508]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJxefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJxufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3lJx-fXEduqHoOJbURZRw" element="_3ADC7B74022D42B1EC1B0349" source="_G2-s7efXEduqHoOJbURZRw" target="_G3bYzefXEduqHoOJbURZRw">
-                <children xmi:id="_G3lJyufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3lJzOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3lJzefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3lJy-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3lJyOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3lJyefXEduqHoOJbURZRw" points="[-753, -499, 3208, 2091]$[-2159, -1413, 1803, 1176]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJzufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3lJz-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F5F1E80283" type="Class" name="TeamBreakdownStructure">
-              <children xmi:id="_G3uTcOfXEduqHoOJbURZRw" type="Note">
-                <children xmi:id="_G3uTc-fXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_G3uTdOfXEduqHoOJbURZRw" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_G3uTcefXEduqHoOJbURZRw" description="{RoleDescriptor.modifies = Role.performsAsOwner.output union Role.performsAdditionally.output union Role.assistsIn.output}" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3uTcufXEduqHoOJbURZRw" x="10726" y="17370" width="6147" height="1852"/>
-              </children>
-              <children xmi:id="_G3uTdefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G3uTeOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G3uTeefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G3uTeufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G3uTe-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G3uTfOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G3uTfefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTfufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3uTf-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTgOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3uTgefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTgufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3uTg-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G3uThOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G3uTdufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3uTd-fXEduqHoOJbURZRw" x="14977" y="8890" width="2861" height="1735"/>
-              </children>
-              <children xmi:id="_G3uThefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G3uTiOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G3uTiefXEduqHoOJbURZRw" width="7586" height="2641"/>
-                </children>
-                <children xmi:id="_G3uTiufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G3uTi-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G3uTjOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G3uTjefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTjufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3uTj-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTkOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3uTkefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTkufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G3uTk-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G3uTlOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G3uThufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3uTh-fXEduqHoOJbURZRw" x="7992" y="4064"/>
-              </children>
-              <children xmi:id="_G34EiefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G34EjOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G34EjefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G34EjufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G34Ej-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G34EkOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G34EkefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34EkufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G34Ek-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34ElOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G34ElefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34ElufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G34El-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G34EmOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G34EiufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G34Ei-fXEduqHoOJbURZRw" x="15705" y="12954"/>
-              </children>
-              <children xmi:id="_G34EoufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0063">
-                <children xmi:id="_G34EpefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G34EpufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G34Ep-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G34EqOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G34EqefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G34EqufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34Eq-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G34ErOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34ErefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G34ErufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34Er-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G34EsOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G34EsefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G34Eo-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G34EpOfXEduqHoOJbURZRw" x="6697" y="8559" width="2732" height="2184"/>
-              </children>
-              <children xmi:id="_G4B1eefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G4B1fOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4B1fefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4B1fufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4B1f-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4B1gOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4B1gefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1gufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4B1g-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1hOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4B1hefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1hufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4B1h-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4B1iOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4B1eufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4B1e-fXEduqHoOJbURZRw" x="5726" y="13216" width="3146" height="2429"/>
-              </children>
-              <children xmi:id="_G4B2AOfXEduqHoOJbURZRw" element="_3ADC7B74022D41F06B6500E6">
-                <children xmi:id="_G4B2A-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4B2BOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4B2BefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4B2BufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4B2B-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4B2COfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B2CefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4B2CufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B2C-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4K_YOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_YefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4K_YufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4K_Y-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4B2AefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4B2AufXEduqHoOJbURZRw" x="1100" y="15629" width="3793" height="1058"/>
-              </children>
-              <children xmi:id="_G4K_ZOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_G4K_Z-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4K_aOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4K_aefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4K_aufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4K_a-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4K_bOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_befXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4K_bufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_b-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4K_cOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_cefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4K_cufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4K_c-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4K_ZefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4K_ZufXEduqHoOJbURZRw" x="4131" y="17331" width="4233" height="1303"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlGSY-fXEduqHoOJbURZRw" description="This diagram shows the view on a process from a Team and Role perspective called TBS (Team Breakdown Structure)."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G3uTlefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6002B5" source="_G3uThefXEduqHoOJbURZRw" target="_G3uThefXEduqHoOJbURZRw">
-                <children xmi:id="_G3uTmOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3uTmufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3uTm-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3uTmefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3uTnOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3uTnufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTnefXEduqHoOJbURZRw" x="1378" y="380"/>
-                </children>
-                <children xmi:id="_G3uTn-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3uToefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uToOfXEduqHoOJbURZRw" x="1495" y="399"/>
-                </children>
-                <children xmi:id="_G3uToufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3uTpOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTo-fXEduqHoOJbURZRw" x="-1053" y="192"/>
-                </children>
-                <children xmi:id="_G3uTpefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3uTp-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTpufXEduqHoOJbURZRw" x="-275" y="-274"/>
-                </children>
-                <children xmi:id="_G3uTqOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3uTqufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTq-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTqefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3uTrOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3uTrufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTr-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTrefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3uTsOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G3uTsufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTs-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTsefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G3uTtOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G3uTtufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G3uTt-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTtefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3uTlufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3uTl-fXEduqHoOJbURZRw" points="[-2725, -26, -2725, -26]$[-5688, -26, -5688, -26]$[-5688, -2937, -5688, -2937]$[-1587, -2937, -1587, -2937]$[-1587, -1058, -1587, -1058]"/>
-              </edges>
-              <edges xmi:id="_G3uTuOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G3uTdefXEduqHoOJbURZRw" target="_G3uThefXEduqHoOJbURZRw">
-                <children xmi:id="_G3uTu-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3uTvefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3uTvufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3uTvOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3uTuefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3uTuufXEduqHoOJbURZRw" points="[-931, -872, 3691, 3496]$[-3234, -3048, 1388, 1320]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3uTv-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G3uTwOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G3uTwefXEduqHoOJbURZRw" element="_3ADC7B74022D421E8F0C0281" source="_G3uThefXEduqHoOJbURZRw" target="_G3uThefXEduqHoOJbURZRw">
-                <children xmi:id="_G3uTxOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G3uTxufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G3uTx-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G3uTxefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G3uTyOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G3uTyufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G3uTyefXEduqHoOJbURZRw" x="1445" y="-427"/>
-                </children>
-                <children xmi:id="_G34EcOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G34EcufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EcefXEduqHoOJbURZRw" x="1190" y="287"/>
-                </children>
-                <children xmi:id="_G34Ec-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G34EdefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EdOfXEduqHoOJbURZRw" x="-1059" y="-207"/>
-                </children>
-                <children xmi:id="_G34EdufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G34EeOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34Ed-fXEduqHoOJbURZRw" x="-75" y="221"/>
-                </children>
-                <children xmi:id="_G34EeefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G34Ee-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34EfOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EeufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G34EfefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G34Ef-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34EgOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EfufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G34EgefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G34Eg-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34EhOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EgufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G34EhefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G34Eh-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34EiOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EhufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G3uTwufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G3uTw-fXEduqHoOJbURZRw" points="[2699, -26, 2699, -26]$[5874, -26, 5874, -26]$[5874, -2963, 5874, -2963]$[1402, -2963, 1402, -2963]$[1402, -1058, 1402, -1058]"/>
-              </edges>
-              <edges xmi:id="_G34EmefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G34EiefXEduqHoOJbURZRw" target="_G3uTdefXEduqHoOJbURZRw">
-                <children xmi:id="_G34EnOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G34EnufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G34En-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G34EnefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G34EmufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G34Em-fXEduqHoOJbURZRw" points="[-313, -872, 1109, 3191]$[-1134, -3200, 287, 863]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G34EoOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G34EoefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G34EsufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600052" source="_G34EoufXEduqHoOJbURZRw" target="_G34EoufXEduqHoOJbURZRw">
-                <children xmi:id="_G34EtefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G34Et-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G34EuOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G34EtufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G34EuefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G34Eu-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EuufXEduqHoOJbURZRw" x="436" y="238"/>
-                </children>
-                <children xmi:id="_G34EvOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G34EvufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EvefXEduqHoOJbURZRw" x="-714" y="-333"/>
-                </children>
-                <children xmi:id="_G34Ev-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G34EwefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EwOfXEduqHoOJbURZRw" x="-360" y="242"/>
-                </children>
-                <children xmi:id="_G34EwufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G34ExOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34Ew-fXEduqHoOJbURZRw" x="72" y="-288"/>
-                </children>
-                <children xmi:id="_G34ExefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G34Ex-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34EyOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34ExufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G34EyefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G34Ey-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34EzOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EyufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G34EzefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G34Ez-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34E0OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34EzufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G34E0efXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G34E0-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G34E1OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G34E0ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G34Es-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G34EtOfXEduqHoOJbURZRw" points="[-1176, 42, -1176, 42]$[-2573, 42, -2573, 42]$[-2573, -1761, -2573, -1761]$[-50, -1761, -50, -1761]$[-50, -1092, -50, -1092]"/>
-              </edges>
-              <edges xmi:id="_G4B1cOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003E" source="_G34EoufXEduqHoOJbURZRw" target="_G3uThefXEduqHoOJbURZRw">
-                <children xmi:id="_G4B1c-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4B1defXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4B1dufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4B1dOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4B1cefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4B1cufXEduqHoOJbURZRw" points="[999, -1100, -2912, 3166]$[2683, -2946, -1227, 1320]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4B1d-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4B1eOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4B1iefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60017E" source="_G4B1eefXEduqHoOJbURZRw" target="_G34EiefXEduqHoOJbURZRw">
-                <children xmi:id="_G4B1jOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4B1jufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4B1j-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4B1jefXEduqHoOJbURZRw" x="97" y="-323"/>
-                </children>
-                <children xmi:id="_G4B1kOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G4B1kufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1kefXEduqHoOJbURZRw" x="-672" y="-196"/>
-                </children>
-                <children xmi:id="_G4B1k-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G4B1lefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1lOfXEduqHoOJbURZRw" x="477" y="293"/>
-                </children>
-                <children xmi:id="_G4B1lufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G4B1mOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1l-fXEduqHoOJbURZRw" x="824" y="-187"/>
-                </children>
-                <children xmi:id="_G4B1mefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G4B1m-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1mufXEduqHoOJbURZRw" x="-446" y="338"/>
-                </children>
-                <children xmi:id="_G4B1nOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G4B1nufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1n-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1nefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4B1oOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G4B1oufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1o-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1oefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4B1pOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G4B1pufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1p-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1pefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4B1qOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G4B1qufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1q-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1qefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4B1iufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4B1i-fXEduqHoOJbURZRw" points="[1397, -956, -8966, -347]$[8238, -956, -2125, -347]"/>
-              </edges>
-              <edges xmi:id="_G4B1rOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60019C" source="_G4B1eefXEduqHoOJbURZRw" target="_G34EiefXEduqHoOJbURZRw">
-                <children xmi:id="_G4B1r-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4B1sefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4B1sufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4B1sOfXEduqHoOJbURZRw" x="-537" y="-195"/>
-                </children>
-                <children xmi:id="_G4B1s-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G4B1tefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1tOfXEduqHoOJbURZRw" x="-868" y="-376"/>
-                </children>
-                <children xmi:id="_G4B1tufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G4B1uOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1t-fXEduqHoOJbURZRw" x="450" y="-381"/>
-                </children>
-                <children xmi:id="_G4B1uefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G4B1u-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1uufXEduqHoOJbURZRw" x="1238" y="159"/>
-                </children>
-                <children xmi:id="_G4B1vOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G4B1vufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1vefXEduqHoOJbURZRw" x="1337" y="-973"/>
-                </children>
-                <children xmi:id="_G4B1v-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G4B1wefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1wufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1wOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4B1w-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G4B1xefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1xufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1xOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4B1x-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G4B1yefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1yufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1yOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4B1y-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G4B1zefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1zufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1zOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4B1refXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4B1rufXEduqHoOJbURZRw" points="[93, 1210, -10270, 1820]$[93, 2057, -10270, 2667]$[9279, 2057, -1083, 2667]$[9279, 254, -1083, 863]"/>
-              </edges>
-              <edges xmi:id="_G4B1z-fXEduqHoOJbURZRw" type="NoteAttachment" source="_G3uTcOfXEduqHoOJbURZRw" target="_G4B1rOfXEduqHoOJbURZRw">
-                <styles xmi:type="notation:ConnectorStyle" xmi:id="_G4B10OfXEduqHoOJbURZRw" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4B10efXEduqHoOJbURZRw" points="[-872, -1159, 1024, 1354]$[-1896, -2514, 0, 0]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4B10ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4B10-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4B11OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600160" source="_G4B1eefXEduqHoOJbURZRw" target="_G3uTdefXEduqHoOJbURZRw">
-                <children xmi:id="_G4B11-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4B12efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4B12ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4B12OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4B11efXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4B11ufXEduqHoOJbURZRw" points="[1032, -1219, -7907, 3454]$[4021, -4656, -4919, 16]$[7501, -4673, -1439, 0]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4B12-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4B13OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4B13efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003F" source="_G4B1eefXEduqHoOJbURZRw" target="_G34EoufXEduqHoOJbURZRw">
-                <children xmi:id="_G4B14OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4B14ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4B14-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4B14efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4B15OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4B15ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B15efXEduqHoOJbURZRw" x="266" y="271"/>
-                </children>
-                <children xmi:id="_G4B15-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4B16efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B16OfXEduqHoOJbURZRw" x="283" y="-1109"/>
-                </children>
-                <children xmi:id="_G4B16ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4B17OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B16-fXEduqHoOJbURZRw" x="-290" y="271"/>
-                </children>
-                <children xmi:id="_G4B17efXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4B17-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B17ufXEduqHoOJbURZRw" x="116" y="-347"/>
-                </children>
-                <children xmi:id="_G4B18OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4B18ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B18-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B18efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4B19OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4B19ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B19-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B19efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4B1-OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4B1-ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1--fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1-efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4B1_OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4B1_ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4B1_-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4B1_efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4B13ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4B13-fXEduqHoOJbURZRw" points="[93, -1210, -313, 3564]$[93, -3683, -313, 1092]"/>
-              </edges>
-              <edges xmi:id="_G4K_dOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60016A" source="_G4K_ZOfXEduqHoOJbURZRw" target="_G4B1eefXEduqHoOJbURZRw">
-                <children xmi:id="_G4K_d-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4K_eefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4K_eufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4K_eOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4K_e-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G4K_fefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_fOfXEduqHoOJbURZRw" x="210" y="-374"/>
-                </children>
-                <children xmi:id="_G4K_fufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G4K_gOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_f-fXEduqHoOJbURZRw" x="-80" y="-345"/>
-                </children>
-                <children xmi:id="_G4K_gefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G4K_g-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_gufXEduqHoOJbURZRw" x="-153" y="-361"/>
-                </children>
-                <children xmi:id="_G4K_hOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G4K_hufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_hefXEduqHoOJbURZRw" x="84" y="-339"/>
-                </children>
-                <children xmi:id="_G4K_h-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G4K_iefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_iufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_iOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4K_i-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G4K_jefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_jufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_jOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4K_j-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G4K_kefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_kufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_kOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4K_k-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G4K_lefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_lufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_lOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4K_defXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4K_dufXEduqHoOJbURZRw" points="[220, -660, -999, 2895]$[787, -2345, -431, 1210]"/>
-              </edges>
-              <edges xmi:id="_G4K_l-fXEduqHoOJbURZRw" element="_3ADC7B74022D41F06BBC030D" source="_G4B2AOfXEduqHoOJbURZRw" target="_G4K_ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4K_mufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4K_nOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4K_nefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4K_m-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4K_nufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G4K_oOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_n-fXEduqHoOJbURZRw" x="-124" y="-279"/>
-                </children>
-                <children xmi:id="_G4K_oefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G4K_o-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_oufXEduqHoOJbURZRw" x="-65" y="347"/>
-                </children>
-                <children xmi:id="_G4K_pOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G4K_pufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_pefXEduqHoOJbURZRw" x="236" y="-287"/>
-                </children>
-                <children xmi:id="_G4K_p-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G4K_qefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_qOfXEduqHoOJbURZRw" x="-1093" y="381"/>
-                </children>
-                <children xmi:id="_G4K_qufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G4K_rOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_refXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_q-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4K_rufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G4K_sOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_sefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_r-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4K_sufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G4K_tOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_tefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_s-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4K_tufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G4K_uOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4K_uefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4K_t-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4K_mOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4K_mefXEduqHoOJbURZRw" points="[-508, 524, -3759, -1303]$[-508, 1913, -3759, 84]$[1134, 1913, -2116, 84]"/>
-              </edges>
-              <edges xmi:id="_G4K_uufXEduqHoOJbURZRw" element="_3ADC7B74022D41F94AB90015" source="_G4B2AOfXEduqHoOJbURZRw" target="_G4B1eefXEduqHoOJbURZRw">
-                <children xmi:id="_G4K_vefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4K_v-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4K_wOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4K_vufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4K_u-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4K_vOfXEduqHoOJbURZRw" points="[1346, -533, -3124, 1193]$[3064, -1193, -1405, 533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4K_wefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4K_wufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F5C30F0026" type="Class" name="WorkProductBreakdownStructure">
-              <children xmi:id="_G4UwYOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G4UwY-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4UwZOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4UwZefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4UwZufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4UwZ-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4UwaOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwaefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwaufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4Uwa-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwbOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwbefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwbufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4Uwb-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4UwYefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4UwYufXEduqHoOJbURZRw" x="6366" y="5923" height="954"/>
-              </children>
-              <children xmi:id="_G4UwcOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_G4Uwc-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4UwdOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4UwdefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4UwdufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4Uwd-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4UweOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UweefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UweufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4Uwe-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwfOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwfefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwfufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4Uwf-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4UwcefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4UwcufXEduqHoOJbURZRw" x="6189" y="13698"/>
-              </children>
-              <children xmi:id="_G4UwgOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G4Uwg-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4UwhOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4UwhefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4UwhufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4Uwh-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4UwiOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwiefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwiufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4Uwi-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwjOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwjefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4UwjufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4Uwj-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4UwgefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4UwgufXEduqHoOJbURZRw" x="5143" y="10329"/>
-              </children>
-              <children xmi:id="_G4d6eefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G4d6fOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4d6fefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4d6fufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4d6f-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4d6gOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4d6gefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6gufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4d6g-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6hOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4d6hefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6hufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4d6h-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4d6iOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4d6eufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4d6e-fXEduqHoOJbURZRw" x="15087" y="13182"/>
-              </children>
-              <children xmi:id="_G4d6tefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G4d6uOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4d6uefXEduqHoOJbURZRw" width="7366" height="2438"/>
-                </children>
-                <children xmi:id="_G4d6uufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4d6u-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4d6vOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4d6vefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6vufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4d6v-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6wOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4d6wefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6wufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4d6w-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4d6xOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4d6tufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4d6t-fXEduqHoOJbURZRw" x="3733" y="2387"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlQDYefXEduqHoOJbURZRw" description="This diagram shows the view on a process from a Work Product perspective called WPBS (Work Product Breakdown Structure)."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G4UwkOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60000C" source="_G4UwgOfXEduqHoOJbURZRw" target="_G4UwgOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4Uwk-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4UwlefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4UwlufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4UwlOfXEduqHoOJbURZRw" x="-1082" y="242"/>
-                </children>
-                <children xmi:id="_G4Uwl-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G4UwmefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwmOfXEduqHoOJbURZRw" x="1198" y="-294"/>
-                </children>
-                <children xmi:id="_G4UwmufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G4UwnOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4Uwm-fXEduqHoOJbURZRw" x="31" y="281"/>
-                </children>
-                <children xmi:id="_G4UwnefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G4Uwn-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwnufXEduqHoOJbURZRw" x="-561" y="-998"/>
-                </children>
-                <children xmi:id="_G4UwoOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G4UwoufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwoefXEduqHoOJbURZRw" x="597" y="-761"/>
-                </children>
-                <children xmi:id="_G4Uwo-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G4UwpefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwpufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwpOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4Uwp-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G4UwqefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwqufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwqOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4Uwq-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G4UwrefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwrufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwrOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4Uwr-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G4UwsefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwsufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwsOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4UwkefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4UwkufXEduqHoOJbURZRw" points="[-1820, -846, -1820, -846]$[-1820, -1972, -1820, -1972]$[-6189, -1972, -6189, -1972]$[-6189, 0, -6189, 0]$[-2192, 0, -2192, 0]"/>
-              </edges>
-              <edges xmi:id="_G4Uws-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600020" source="_G4UwgOfXEduqHoOJbURZRw" target="_G4UwgOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4UwtufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4UwuOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4UwuefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4Uwt-fXEduqHoOJbURZRw" x="-298" y="302"/>
-                </children>
-                <children xmi:id="_G4UwuufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G4UwvOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4Uwu-fXEduqHoOJbURZRw" x="-291" y="-306"/>
-                </children>
-                <children xmi:id="_G4UwvefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G4Uwv-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwvufXEduqHoOJbURZRw" x="-505" y="295"/>
-                </children>
-                <children xmi:id="_G4UwwOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G4UwwufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwwefXEduqHoOJbURZRw" x="-1528" y="291"/>
-                </children>
-                <children xmi:id="_G4Uww-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G4UwxefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4UwxOfXEduqHoOJbURZRw" x="-760" y="-252"/>
-                </children>
-                <children xmi:id="_G4UwxufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G4UwyOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwyefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4Uwx-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4UwyufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G4UwzOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4UwzefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4Uwy-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4UwzufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G4Uw0OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4Uw0efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4Uwz-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4Uw0ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G4Uw1OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4Uw1efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4Uw0-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4UwtOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4UwtefXEduqHoOJbURZRw" points="[2222, -211, 2222, -211]$[5980, -211, 5980, -211]$[5980, -2087, 5980, -2087]$[952, -2087, 952, -2087]$[952, -688, 952, -688]"/>
-              </edges>
-              <edges xmi:id="_G4Uw1ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G4UwgOfXEduqHoOJbURZRw" target="_G4UwYOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4d6UOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4d6UufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4d6U-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4d6UefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4Uw1-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4Uw2OfXEduqHoOJbURZRw" points="[-609, -688, -768, 3942]$[-609, -4154, -768, 476]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4d6VOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4d6VefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4d6VufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D7" source="_G4UwcOfXEduqHoOJbURZRw" target="_G4UwgOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4d6WefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4d6W-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4d6XOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4d6WufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d6XefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G4d6X-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6XufXEduqHoOJbURZRw" x="169" y="-482"/>
-                </children>
-                <children xmi:id="_G4d6YOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G4d6YufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6YefXEduqHoOJbURZRw" x="-153" y="-347"/>
-                </children>
-                <children xmi:id="_G4d6Y-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G4d6ZefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6ZOfXEduqHoOJbURZRw" x="-104" y="-283"/>
-                </children>
-                <children xmi:id="_G4d6ZufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G4d6aOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6Z-fXEduqHoOJbURZRw" x="161" y="-347"/>
-                </children>
-                <children xmi:id="_G4d6aefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G4d6a-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6bOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6aufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d6befXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G4d6b-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6cOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6bufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d6cefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G4d6c-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6dOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6cufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4d6defXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G4d6d-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6eOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6dufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4d6V-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4d6WOfXEduqHoOJbURZRw" points="[0, -575, 0, 3996]$[0, -3725, 0, 846]"/>
-              </edges>
-              <edges xmi:id="_G4d6iefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60023D" source="_G4UwgOfXEduqHoOJbURZRw" target="_G4d6eefXEduqHoOJbURZRw">
-                <children xmi:id="_G4d6jOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4d6jufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4d6j-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4d6jefXEduqHoOJbURZRw" x="-748" y="-446"/>
-                </children>
-                <children xmi:id="_G4d6kOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G4d6kufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6kefXEduqHoOJbURZRw" x="-43" y="-273"/>
-                </children>
-                <children xmi:id="_G4d6k-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G4d6lefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6lOfXEduqHoOJbURZRw" x="-771" y="552"/>
-                </children>
-                <children xmi:id="_G4d6lufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G4d6mOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6l-fXEduqHoOJbURZRw" x="555" y="297"/>
-                </children>
-                <children xmi:id="_G4d6mefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G4d6m-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6mufXEduqHoOJbURZRw" x="-427" y="-296"/>
-                </children>
-                <children xmi:id="_G4d6nOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G4d6nufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6n-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6nefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d6oOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G4d6oufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6o-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6oefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d6pOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G4d6pufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6p-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6pefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4d6qOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G4d6qufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d6q-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6qefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4d6iufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4d6i-fXEduqHoOJbURZRw" points="[1794, 846, -7247, -1642]$[5283, 2480, -3759, -8]$[7662, 2480, -1380, -8]"/>
-              </edges>
-              <edges xmi:id="_G4d6rOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G4d6eefXEduqHoOJbURZRw" target="_G4UwYOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4d6r-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4d6sefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4d6sufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4d6sOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4d6refXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4d6rufXEduqHoOJbURZRw" points="[-79, -317, 8996, 6430]$[-79, -6773, 8996, -26]$[-7938, -6773, 1137, -26]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4d6s-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4d6tOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4d6xefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6002B5" source="_G4d6tefXEduqHoOJbURZRw" target="_G4d6tefXEduqHoOJbURZRw">
-                <children xmi:id="_G4d6yOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4d6yufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4d6y-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4d6yefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d6zOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G4d6zufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d6zefXEduqHoOJbURZRw" x="-281" y="761"/>
-                </children>
-                <children xmi:id="_G4d6z-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G4d60efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d60OfXEduqHoOJbURZRw" x="1250" y="504"/>
-                </children>
-                <children xmi:id="_G4d60ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G4d61OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d60-fXEduqHoOJbURZRw" x="-458" y="287"/>
-                </children>
-                <children xmi:id="_G4d61efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G4d61-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d61ufXEduqHoOJbURZRw" x="284" y="-331"/>
-                </children>
-                <children xmi:id="_G4d62OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G4d62ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d62-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d62efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d63OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G4d63ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d63-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d63efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4d64OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C6002B8">
-                  <children xmi:id="_G4d64ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d64-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d64efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4d65OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C6002B6">
-                  <children xmi:id="_G4d65ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4d65-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4d65efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4d6xufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4d6x-fXEduqHoOJbURZRw" points="[-3683, -474, -3683, -474]$[-5113, -474, -5113, -474]$[-5113, -2142, -5113, -2142]$[-1761, -2142, -1761, -2142]$[-1761, -1219, -1761, -1219]"/>
-              </edges>
-              <edges xmi:id="_G4nrUOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G4UwYOfXEduqHoOJbURZRw" target="_G4d6tefXEduqHoOJbURZRw">
-                <children xmi:id="_G4nrU-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4nrVefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4nrVufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4nrVOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4nrUefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4nrUufXEduqHoOJbURZRw" points="[0, -499, -50, 3005]$[0, -2286, -50, 1219]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4nrV-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4nrWOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4nrWefXEduqHoOJbURZRw" element="_3ADC7B74022D421E8F0C0281" source="_G4d6tefXEduqHoOJbURZRw" target="_G4d6tefXEduqHoOJbURZRw">
-                <children xmi:id="_G4nrXOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4nrXufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4nrX-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4nrXefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4nrYOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G4nrYufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nrYefXEduqHoOJbURZRw" x="-99" y="-735"/>
-                </children>
-                <children xmi:id="_G4nrY-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G4nrZefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nrZOfXEduqHoOJbURZRw" x="1919" y="73"/>
-                </children>
-                <children xmi:id="_G4nrZufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G4nraOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nrZ-fXEduqHoOJbURZRw" x="-535" y="-234"/>
-                </children>
-                <children xmi:id="_G4nraefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G4nra-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nraufXEduqHoOJbURZRw" x="340" y="289"/>
-                </children>
-                <children xmi:id="_G4nrbOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G4nrbufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrb-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nrbefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4nrcOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G4nrcufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrc-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nrcefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4nrdOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E8F0E0266">
-                  <children xmi:id="_G4nrdufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrd-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nrdefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4nreOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E8F0E0234">
-                  <children xmi:id="_G4nreufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nre-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4nreefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4nrWufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4nrW-fXEduqHoOJbURZRw" points="[3683, -304, 3683, -304]$[4732, -304, 4732, -304]$[4732, -2108, 4732, -2108]$[1270, -2108, 1270, -2108]$[1270, -1219, 1270, -1219]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D411C1CE303D3" type="Class" name="TeamBreakdownStructure (simplified)">
-              <children xmi:id="_G4nrfOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G4nrf-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4nrgOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4nrgefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4nrgufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4nrg-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4nrhOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrhefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4nrhufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrh-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4nriOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nriefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4nriufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4nri-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4nrfefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4nrfufXEduqHoOJbURZRw" x="11709" y="677"/>
-              </children>
-              <children xmi:id="_G4nrjOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G4nrj-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4nrkOfXEduqHoOJbURZRw" width="2082" height="905"/>
-                </children>
-                <children xmi:id="_G4nrkefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4nrkufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4nrk-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4nrlOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrlefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4nrlufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrl-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4nrmOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4nrmefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4nrmufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4nrm-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4nrjefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4nrjufXEduqHoOJbURZRw" x="6172" y="1786"/>
-              </children>
-              <children xmi:id="_G4nrpefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0063">
-                <children xmi:id="_G4nrqOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4nrqefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4nrqufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4nrq-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4xcUOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4xcUefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcUufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xcU-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcVOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xcVefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcVufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xcV-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4xcWOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4nrpufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4nrp-fXEduqHoOJbURZRw" x="12268" y="3666"/>
-              </children>
-              <children xmi:id="_G4xchefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G4xciOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4xciefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G4xciufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4xci-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4xcjOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4xcjefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcjufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xcj-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xckOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xckefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xckufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xck-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4xclOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4xchufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xch-fXEduqHoOJbURZRw" x="5926" y="3666"/>
-              </children>
-              <children xmi:id="_G4xcwefXEduqHoOJbURZRw" element="_3ADC7B74022D41F06B6500E6">
-                <children xmi:id="_G4xcxOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4xcxefXEduqHoOJbURZRw" width="2743" height="990"/>
-                </children>
-                <children xmi:id="_G4xcxufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4xcx-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4xcyOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4xcyefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcyufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xcy-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xczOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xczefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xczufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xcz-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4xc0OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4xcwufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xcw-fXEduqHoOJbURZRw" x="5943" y="6722"/>
-              </children>
-              <children xmi:id="_G4xc2ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_G4xc3efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G4xc3ufXEduqHoOJbURZRw" width="4013" height="1117"/>
-                </children>
-                <children xmi:id="_G4xc3-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G4xc4OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G4xc4efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G4xc4ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xc4-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xc5OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xc5efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xc5ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xc5-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G4xc6OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G4xc6efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G4xc2-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xc3OfXEduqHoOJbURZRw" x="1092" y="5130"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlQDY-fXEduqHoOJbURZRw" description="This diagram provides a simplified view on the Team Breakdown Structure only the key classes and relationships."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G4nrnOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G4nrjOfXEduqHoOJbURZRw" target="_G4nrfOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4nrn-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4nroefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4nroufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4nroOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4nrnefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4nrnufXEduqHoOJbURZRw" points="[1041, -186, -5156, 880]$[4487, -778, -1710, 287]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4nro-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4nrpOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4xcWefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600052" source="_G4nrpefXEduqHoOJbURZRw" target="_G4nrpefXEduqHoOJbURZRw">
-                <children xmi:id="_G4xcXOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4xcXufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4xcX-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xcXefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4xcYOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G4xcYufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcYefXEduqHoOJbURZRw" x="806" y="283"/>
-                </children>
-                <children xmi:id="_G4xcY-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G4xcZefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcZOfXEduqHoOJbURZRw" x="714" y="-930"/>
-                </children>
-                <children xmi:id="_G4xcZufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G4xcaOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcZ-fXEduqHoOJbURZRw" x="-784" y="311"/>
-                </children>
-                <children xmi:id="_G4xcaefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G4xca-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcaufXEduqHoOJbURZRw" x="-55" y="-309"/>
-                </children>
-                <children xmi:id="_G4xcbOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G4xcbufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcb-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcbefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4xccOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G4xccufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcc-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xccefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4xcdOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G4xcdufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcd-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcdefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4xceOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G4xceufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xce-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xceefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4xcWufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4xcW-fXEduqHoOJbURZRw" points="[1143, 0, 1143, 0]$[2641, 0, 2641, 0]$[2641, 1913, 2641, 1913]$[0, 1913, 0, 1913]$[0, 448, 0, 448]"/>
-              </edges>
-              <edges xmi:id="_G4xcfOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003E" source="_G4nrpefXEduqHoOJbURZRw" target="_G4nrfOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4xcf-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4xcgefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4xcgufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xcgOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4xcfefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4xcfufXEduqHoOJbURZRw" points="[0, -457, 0, 2489]$[0, -2455, 0, 491]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4xcg-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4xchOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4xclefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600160" source="_G4xchefXEduqHoOJbURZRw" target="_G4nrjOfXEduqHoOJbURZRw">
-                <children xmi:id="_G4xcmOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4xcmufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4xcm-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xcmefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4xclufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4xcl-fXEduqHoOJbURZRw" points="[-50, -448, 0, 1430]$[-50, -1430, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4xcnOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4xcnefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4xcnufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003F" source="_G4xchefXEduqHoOJbURZRw" target="_G4nrpefXEduqHoOJbURZRw">
-                <children xmi:id="_G4xcoefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4xco-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4xcpOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xcoufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4xcpefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4xcp-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcpufXEduqHoOJbURZRw" x="129" y="235"/>
-                </children>
-                <children xmi:id="_G4xcqOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4xcqufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcqefXEduqHoOJbURZRw" x="822" y="-296"/>
-                </children>
-                <children xmi:id="_G4xcq-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4xcrefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcrOfXEduqHoOJbURZRw" x="204" y="-189"/>
-                </children>
-                <children xmi:id="_G4xcrufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4xcsOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcr-fXEduqHoOJbURZRw" x="169" y="-347"/>
-                </children>
-                <children xmi:id="_G4xcsefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4xcs-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xctOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcsufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4xctefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4xct-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcuOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xctufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G4xcuefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G4xcu-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcvOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcuufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G4xcvefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G4xcv-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G4xcwOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G4xcvufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4xcn-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4xcoOfXEduqHoOJbURZRw" points="[1337, 0, -4809, 0]$[4995, 0, -1151, 0]"/>
-              </edges>
-              <edges xmi:id="_G4xc0efXEduqHoOJbURZRw" element="_3ADC7B74022D41F94AB90015" source="_G4xcwefXEduqHoOJbURZRw" target="_G4xchefXEduqHoOJbURZRw">
-                <children xmi:id="_G4xc1OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G4xc1ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G4xc1-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G4xc1efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4xc0ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4xc0-fXEduqHoOJbURZRw" points="[-50, -499, 0, 2599]$[-50, -2650, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4xc2OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G4xc2efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G4xc6ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60016A" source="_G4xc2ufXEduqHoOJbURZRw" target="_G4xchefXEduqHoOJbURZRw">
-                <children xmi:id="_G46mQOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G46mQufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G46mQ-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G46mQefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G46mROfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G46mRufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mRefXEduqHoOJbURZRw" x="-135" y="406"/>
-                </children>
-                <children xmi:id="_G46mR-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G46mSefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mSOfXEduqHoOJbURZRw" x="-202" y="-347"/>
-                </children>
-                <children xmi:id="_G46mSufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G46mTOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mS-fXEduqHoOJbURZRw" x="391" y="296"/>
-                </children>
-                <children xmi:id="_G46mTefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G46mT-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mTufXEduqHoOJbURZRw" x="204" y="-348"/>
-                </children>
-                <children xmi:id="_G46mUOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G46mUufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mU-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mUefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G46mVOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G46mVufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mV-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mVefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G46mWOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G46mWufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mW-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mWefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G46mXOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G46mXufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mX-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mXefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G4xc6-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G4xc7OfXEduqHoOJbURZRw" points="[133, -317, -5529, 1138]$[133, -1613, -5529, -158]$[4128, -1613, -1534, -158]"/>
-              </edges>
-              <edges xmi:id="_G46mYOfXEduqHoOJbURZRw" element="_3ADC7B74022D41F06BBC030D" source="_G4xcwefXEduqHoOJbURZRw" target="_G4xc2ufXEduqHoOJbURZRw">
-                <children xmi:id="_G46mY-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G46mZefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G46mZufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G46mZOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G46mZ-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G46maefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46maOfXEduqHoOJbURZRw" x="-468" y="-245"/>
-                </children>
-                <children xmi:id="_G46maufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G46mbOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46ma-fXEduqHoOJbURZRw" x="-206" y="348"/>
-                </children>
-                <children xmi:id="_G46mbefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G46mb-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mbufXEduqHoOJbURZRw" x="3" y="-153"/>
-                </children>
-                <children xmi:id="_G46mcOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G46mcufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mcefXEduqHoOJbURZRw" x="80" y="1472"/>
-                </children>
-                <children xmi:id="_G46mc-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G46mdefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mdufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mdOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G46md-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G46meefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46meufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46meOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G46me-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41F06BBE00E9">
-                  <children xmi:id="_G46mfefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mfufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mfOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G46mf-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41F06BBE00DF">
-                  <children xmi:id="_G46mgefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mgufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G46mgOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G46mYefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G46mYufXEduqHoOJbURZRw" points="[-1535, 0, 4154, 1614]$[-5556, 0, 133, 1614]$[-5556, -1296, 133, 318]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D411C461C02F7" type="Class" name="WorkProductBreakdownStructure (simplified)">
-              <children xmi:id="_G46mg-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G46mhufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G46mh-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G46miOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G46miefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G46miufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G46mi-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mjOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G46mjefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mjufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G46mj-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G46mkOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G46mkefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G46mkufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G46mhOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G46mhefXEduqHoOJbURZRw" x="4707" y="973"/>
-              </children>
-              <children xmi:id="_G46mk-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G46mlufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G46ml-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G46mmOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5EXQOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5EXQefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5EXQufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXQ-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXROfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXRefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXRufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXR-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXSOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5EXSefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G46mlOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G46mlefXEduqHoOJbURZRw" x="5596" y="3115"/>
-              </children>
-              <children xmi:id="_G5EXU-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G5EXVufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5EXV-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5EXWOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5EXWefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5EXWufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5EXW-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXXOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXXefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXXufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXX-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXYOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXYefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5EXYufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5EXVOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5EXVefXEduqHoOJbURZRw" x="4097" y="5469" width="4919" height="2175"/>
-              </children>
-              <children xmi:id="_G5EXqefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G5EXrOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5EXrefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5EXrufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5EXr-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5EXsOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5EXsefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXsufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXs-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXtOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXtefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXtufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5EXt-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5EXuOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5EXqufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5EXq-fXEduqHoOJbURZRw" x="5071" y="11142"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlQDZefXEduqHoOJbURZRw" description="This diagram provides a simplified view on the Work Product Breakdown Structure only the key classes and relationships."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G5EXSufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G46mk-fXEduqHoOJbURZRw" target="_G46mg-fXEduqHoOJbURZRw">
-                <children xmi:id="_G5EXTefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5EXT-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5EXUOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5EXTufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5EXS-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5EXTOfXEduqHoOJbURZRw" points="[0, -499, 0, 1634]$[0, -1634, 0, 499]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5EXUefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5EXUufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5EXY-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60000C" source="_G5EXU-fXEduqHoOJbURZRw" target="_G5EXU-fXEduqHoOJbURZRw">
-                <children xmi:id="_G5EXZufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5EXaOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5EXaefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5EXZ-fXEduqHoOJbURZRw" x="417" y="1063"/>
-                </children>
-                <children xmi:id="_G5EXaufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5EXbOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXa-fXEduqHoOJbURZRw" x="307" y="683"/>
-                </children>
-                <children xmi:id="_G5EXbefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5EXb-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXbufXEduqHoOJbURZRw" x="-1261" y="799"/>
-                </children>
-                <children xmi:id="_G5EXcOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G5EXcufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXcefXEduqHoOJbURZRw" x="-927" y="292"/>
-                </children>
-                <children xmi:id="_G5EXc-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G5EXdefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXdOfXEduqHoOJbURZRw" x="-138" y="-282"/>
-                </children>
-                <children xmi:id="_G5EXdufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5EXeOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXeefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXd-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5EXeufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G5EXfOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXfefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXe-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5EXfufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5EXgOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXgefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXf-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5EXgufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G5EXhOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXhefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXg-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5EXZOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5EXZefXEduqHoOJbURZRw" points="[2460, -80, 2460, -80]$[4974, -80, 4974, -80]$[4974, 2407, 4974, 2407]$[1587, 2407, 1587, 2407]$[1587, 1085, 1587, 1085]"/>
-              </edges>
-              <edges xmi:id="_G5EXhufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600020" source="_G5EXU-fXEduqHoOJbURZRw" target="_G5EXU-fXEduqHoOJbURZRw">
-                <children xmi:id="_G5EXiefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5EXi-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5EXjOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5EXiufXEduqHoOJbURZRw" x="-1338" y="-313"/>
-                </children>
-                <children xmi:id="_G5EXjefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5EXj-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXjufXEduqHoOJbURZRw" x="769" y="259"/>
-                </children>
-                <children xmi:id="_G5EXkOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5EXkufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXkefXEduqHoOJbURZRw" x="229" y="-312"/>
-                </children>
-                <children xmi:id="_G5EXk-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5EXlefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXlOfXEduqHoOJbURZRw" x="-813" y="166"/>
-                </children>
-                <children xmi:id="_G5EXlufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5EXmOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXl-fXEduqHoOJbURZRw" x="343" y="737"/>
-                </children>
-                <children xmi:id="_G5EXmefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5EXm-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXnOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXmufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5EXnefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5EXn-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXoOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXnufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5EXoefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5EXo-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXpOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXoufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5EXpefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5EXp-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXqOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXpufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5EXh-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5EXiOfXEduqHoOJbURZRw" points="[-1837, 1083, -1837, 1083]$[-1837, 2362, -1837, 2362]$[-4021, 2362, -4021, 2362]$[-4021, -237, -4021, -237]$[-2455, -237, -2455, -237]"/>
-              </edges>
-              <edges xmi:id="_G5EXuefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60023D" source="_G5EXU-fXEduqHoOJbURZRw" target="_G5EXqefXEduqHoOJbURZRw">
-                <children xmi:id="_G5EXvOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5EXvufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5EXv-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5EXvefXEduqHoOJbURZRw" x="21" y="-643"/>
-                </children>
-                <children xmi:id="_G5EXwOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G5EXwufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXwefXEduqHoOJbURZRw" x="72" y="199"/>
-                </children>
-                <children xmi:id="_G5EXw-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G5EXxefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXxOfXEduqHoOJbURZRw" x="-33" y="-745"/>
-                </children>
-                <children xmi:id="_G5EXxufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G5EXyOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXx-fXEduqHoOJbURZRw" x="207" y="-202"/>
-                </children>
-                <children xmi:id="_G5EXyefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G5EXy-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXyufXEduqHoOJbURZRw" x="198" y="1203"/>
-                </children>
-                <children xmi:id="_G5EXzOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G5EXzufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EXz-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EXzefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5EX0OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G5EX0ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5EX0-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EX0efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5EX1OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G5OIQOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIQefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5EX1efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5OIQufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G5OIROfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIRefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5OIQ-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5EXuufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5EXu-fXEduqHoOJbURZRw" points="[-262, 1075, -160, -4004]$[-262, 4588, -160, -491]"/>
-              </edges>
-              <edges xmi:id="_G5OIRufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G5EXU-fXEduqHoOJbURZRw" target="_G46mk-fXEduqHoOJbURZRw">
-                <children xmi:id="_G5OISefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5OIS-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5OITOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5OISufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5OIR-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5OISOfXEduqHoOJbURZRw" points="[-42, -1092, -93, 1854]$[-42, -2455, -93, 491]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5OITefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5OITufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5OIT-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G5EXqefXEduqHoOJbURZRw" target="_G46mk-fXEduqHoOJbURZRw">
-                <children xmi:id="_G5OIUufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5OIVOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5OIVefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5OIU-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5OIUOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5OIUefXEduqHoOJbURZRw" points="[1380, -16, 1227, 8009]$[7128, -16, 6976, 8009]$[7128, -8085, 6976, -59]$[1159, -8085, 1007, -59]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5OIVufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5OIV-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D411C4946031E" type="Class" name="WorkBreakdownStructure (simplified)">
-              <children xmi:id="_G5OIWOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G5OIW-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5OIXOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5OIXefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5OIXufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5OIX-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5OIYOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIYefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIYufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIY-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIZOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIZefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIZufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5OIZ-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5OIWefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5OIWufXEduqHoOJbURZRw" x="5994" y="6561"/>
-              </children>
-              <children xmi:id="_G5OIaOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G5OIa-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5OIbOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5OIbefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5OIbufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5OIb-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5OIcOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIcefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIcufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIc-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIdOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIdefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIdufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5OId-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5OIaefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5OIaufXEduqHoOJbURZRw" x="5562" y="4326"/>
-              </children>
-              <children xmi:id="_G5OIeOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CA">
-                <children xmi:id="_G5OIe-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5OIfOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5OIfefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5OIfufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5OIf-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5OIgOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIgefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIgufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIg-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIhOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIhefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIhufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5OIh-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5OIeefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5OIeufXEduqHoOJbURZRw" x="1430" y="6638"/>
-              </children>
-              <children xmi:id="_G5OIiOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CB">
-                <children xmi:id="_G5OIi-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5OIjOfXEduqHoOJbURZRw" width="1659" height="905"/>
-                </children>
-                <children xmi:id="_G5OIjefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5OIjufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5OIj-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5OIkOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIkefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIkufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIk-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIlOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIlefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIlufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5OIl-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5OIiefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5OIiufXEduqHoOJbURZRw" x="3200" y="6691"/>
-              </children>
-              <children xmi:id="_G5OImOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G5OIm-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5OInOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5OInefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5OInufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5OIn-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5OIoOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIoufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIo-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIpOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5OIpefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5OIpufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5OIp-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5OImefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5OImufXEduqHoOJbURZRw" x="3386" y="1532" width="5926" height="1007"/>
-              </children>
-              <children xmi:id="_G5XSOefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G5XSPOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5XSPefXEduqHoOJbURZRw" width="2218" height="846"/>
-                </children>
-                <children xmi:id="_G5XSPufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5XSP-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5XSQOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5XSQefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSQufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSQ-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSROfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSRefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSRufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSR-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5XSSOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5XSOufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSO-fXEduqHoOJbURZRw" x="2497" y="4351"/>
-              </children>
-              <children xmi:id="_G5XSbOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G5XSb-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5XScOfXEduqHoOJbURZRw" width="4267" height="990"/>
-                </children>
-                <children xmi:id="_G5XScefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5XScufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5XSc-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5XSdOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSdefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSdufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSd-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSeOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSeefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSeufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5XSe-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5XSbefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSbufXEduqHoOJbURZRw" x="5283" y="8652"/>
-              </children>
-              <children xmi:id="_G5XSjufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0031">
-                <children xmi:id="_G5XSkefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5XSkufXEduqHoOJbURZRw" width="1862" height="905"/>
-                </children>
-                <children xmi:id="_G5XSk-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5XSlOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5XSlefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5XSlufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSl-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSmOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSmefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSmufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSm-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5XSnOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5XSnefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5XSj-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSkOfXEduqHoOJbURZRw" x="9165" y="6561"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlQDZ-fXEduqHoOJbURZRw" description="This is a simplified representation of a WBS only showing key elements and their relationships."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G5XSMOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G5OIaOfXEduqHoOJbURZRw" target="_G5OImOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSM-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSNefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XSNufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSNOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSMefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSMufXEduqHoOJbURZRw" points="[0, -448, 254, 2294]$[0, -2243, 254, 499]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSN-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSOOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5XSSefXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FFD300EF" source="_G5OImOfXEduqHoOJbURZRw" target="_G5XSOefXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSTOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSTufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XST-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSTefXEduqHoOJbURZRw" x="230" y="796"/>
-                </children>
-                <children xmi:id="_G5XSUOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G5XSUufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSUefXEduqHoOJbURZRw" x="-287" y="-261"/>
-                </children>
-                <children xmi:id="_G5XSU-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G5XSVefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSVOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G5XSVufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G5XSWOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSV-fXEduqHoOJbURZRw" x="-75" y="-194"/>
-                </children>
-                <children xmi:id="_G5XSWefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G5XSW-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSWufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G5XSXOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G5XSXufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSX-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSXefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5XSYOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G5XSYufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSY-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSYefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5XSZOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G5XSZufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSZ-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSZefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5XSaOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G5XSaufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5XSa-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5XSaefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSSufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSS-fXEduqHoOJbURZRw" points="[-2963, -101, -220, -2844]$[-3598, -101, -855, -2844]$[-3598, 2319, -855, -423]"/>
-              </edges>
-              <edges xmi:id="_G5XSfOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F02A0" source="_G5OIiOfXEduqHoOJbURZRw" target="_G5XSOefXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSf-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSgefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XSgufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSgOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSfefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSfufXEduqHoOJbURZRw" points="[-381, -448, 228, 1837]$[-381, -1862, 228, 423]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSg-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XShOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5XShefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F029F" source="_G5OIeOfXEduqHoOJbURZRw" target="_G5XSOefXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSiOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSiufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XSi-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSiefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XShufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSh-fXEduqHoOJbURZRw" points="[556, -318, -661, 1958]$[556, -1958, -661, 318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSjOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSjefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5XSnufXEduqHoOJbURZRw" element="_3ADC7B74022D42B1EC1B0349" source="_G5XSjufXEduqHoOJbURZRw" target="_G5XSbOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSoefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSo-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XSpOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSoufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSn-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSoOfXEduqHoOJbURZRw" points="[-364, 448, 1972, -1684]$[-364, 1634, 1972, -499]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSpefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSpufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5XSp-fXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G5XSbOfXEduqHoOJbURZRw" target="_G5OImOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSqufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSrOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XSrefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSq-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSqOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSqefXEduqHoOJbURZRw" points="[1534, -318, 2778, 6641]$[1534, -6482, 2778, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSrufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSr-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5XSsOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G5XSOefXEduqHoOJbURZRw" target="_G5XSbOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSs-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XStefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XStufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XStOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSsefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSsufXEduqHoOJbURZRw" points="[926, 318, -3202, -3995]$[926, 1323, -3202, -2990]$[2328, 1323, -1800, -2990]$[2328, 3995, -1800, -318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSt-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSuOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5XSuefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G5OIWOfXEduqHoOJbURZRw" target="_G5OIaOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSvOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSvufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XSv-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSvefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSuufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSu-fXEduqHoOJbURZRw" points="[-406, -457, 355, 1778]$[-406, -1786, 355, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSwOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSwefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G5XSwufXEduqHoOJbURZRw" element="_3ADC7B74022D427A923B0002" source="_G5OIWOfXEduqHoOJbURZRw" target="_G5XSbOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5XSxefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5XSx-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5XSyOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5XSxufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5XSw-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5XSxOfXEduqHoOJbURZRw" points="[-317, 317, -397, -1773]$[-317, 1772, -397, -318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSyefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G5XSyufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D4101580F00C4" type="Class" name="DescriptorRelationships">
-              <children xmi:id="_G5hDMOfXEduqHoOJbURZRw" type="Note">
-                <children xmi:id="_G5hDM-fXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_G5hDNOfXEduqHoOJbURZRw" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_G5hDMefXEduqHoOJbURZRw" fontName="Arial" fontHeight="8" description="{RoleDescriptor.modifies = Role.performsAsOwner.output union Role.performsAdditionally.output union Role.assistsIn.output}" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5hDMufXEduqHoOJbURZRw" x="17771" y="2379" width="5503" height="1752"/>
-              </children>
-              <children xmi:id="_G5hDNefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_G5hDOOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5hDOefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5hDOufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5hDO-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5hDPOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5hDPefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5hDPufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5hDP-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5hDQOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5hDQefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5hDQufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5hDQ-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5hDROfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5hDNufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5hDN-fXEduqHoOJbURZRw" x="33324" y="5740"/>
-              </children>
-              <children xmi:id="_G5hDRefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_G5hDSOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5hDSefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5hDSufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5hDS-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5hDTOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5hDTefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5hDTufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5hDT-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5hDUOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5hDUefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5hDUufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5qNIOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5qNIefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5hDRufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5hDR-fXEduqHoOJbURZRw" x="17170" y="15138"/>
-              </children>
-              <children xmi:id="_G5qNIufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G5qNJefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5qNJufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5qNJ-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5qNKOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5qNKefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5qNKufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNK-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5qNLOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNLefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5qNLufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNL-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5qNMOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5qNMefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5qNI-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5qNJOfXEduqHoOJbURZRw" x="26991" y="4622" width="4445" height="3860"/>
-              </children>
-              <children xmi:id="_G5qNVefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G5qNWOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5qNWefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5qNWufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5qNW-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5qNXOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5qNXefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNXufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5qNX-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNYOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5qNYefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNYufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5qNY-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5qNZOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5qNVufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5qNV-fXEduqHoOJbURZRw" x="16882" y="8720" width="4445" height="4817"/>
-              </children>
-              <children xmi:id="_G5z-VOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_G5z-V-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5z-WOfXEduqHoOJbURZRw" width="3759" height="1117"/>
-                </children>
-                <children xmi:id="_G5z-WefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5z-WufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5z-W-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5z-XOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-XefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5z-XufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-X-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5z-YOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-YefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5z-YufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5z-Y-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5z-VefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5z-VufXEduqHoOJbURZRw" x="2692" y="10261"/>
-              </children>
-              <children xmi:id="_G5z-ZOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G5z-Z-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G5z-aOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G5z-aefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G5z-aufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G5z-a-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G5z-bOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-befXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5z-bufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-b-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5z-cOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-cefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G5z-cufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G5z-c-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G5z-ZefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5z-ZufXEduqHoOJbURZRw" x="8178" y="4292" width="6510" height="3920"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlQDaefXEduqHoOJbURZRw" description="This diagram provides an overview to all Descriptor types defined in the Process package, their attributes and associations.  We see that each Descriptor traces back to the core content element they refer to.  Descriptors also define additional associations than the associations defined amongst the core content elements.  For example, External Inputs between Tasks Descriptors and Work Product Descriptors are not defined in Core Method Content, because it expresses information that is specific to a process and not available/known for method content."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G5qNMufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60016A" source="_G5hDNefXEduqHoOJbURZRw" target="_G5qNIufXEduqHoOJbURZRw">
-                <children xmi:id="_G5qNNefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5qNN-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5qNOOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5qNNufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5qNOefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G5qNO-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNOufXEduqHoOJbURZRw" x="4" y="280"/>
-                </children>
-                <children xmi:id="_G5qNPOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G5qNPufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNPefXEduqHoOJbURZRw" x="466" y="-287"/>
-                </children>
-                <children xmi:id="_G5qNP-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G5qNQefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNQOfXEduqHoOJbURZRw" x="100" y="128"/>
-                </children>
-                <children xmi:id="_G5qNQufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G5qNROfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNQ-fXEduqHoOJbURZRw" x="83" y="348"/>
-                </children>
-                <children xmi:id="_G5qNRefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G5qNR-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNSOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNRufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5qNSefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G5qNS-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNTOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNSufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5qNTefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60016D">
-                  <children xmi:id="_G5qNT-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNUOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNTufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5qNUefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60016B">
-                  <children xmi:id="_G5qNU-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNVOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNUufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5qNM-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5qNNOfXEduqHoOJbURZRw" points="[-1879, -25, 4114, -279]$[-3776, -25, 2218, -279]"/>
-              </edges>
-              <edges xmi:id="_G5qNZefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0321" source="_G5qNVefXEduqHoOJbURZRw" target="_G5qNIufXEduqHoOJbURZRw">
-                <children xmi:id="_G5qNaOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5qNaufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5qNa-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5qNaefXEduqHoOJbURZRw" x="-157" y="-263"/>
-                </children>
-                <children xmi:id="_G5qNbOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G5qNbufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNbefXEduqHoOJbURZRw" x="-895" y="-187"/>
-                </children>
-                <children xmi:id="_G5qNb-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G5qNcefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNcOfXEduqHoOJbURZRw" x="722" y="287"/>
-                </children>
-                <children xmi:id="_G5qNcufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G5qNdOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNc-fXEduqHoOJbURZRw" x="835" y="196"/>
-                </children>
-                <children xmi:id="_G5qNdefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G5qNd-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNdufXEduqHoOJbURZRw" x="835" y="-2310"/>
-                </children>
-                <children xmi:id="_G5qNeOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G5qNeufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNe-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNeefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5qNfOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G5qNfufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNf-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNfefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5qNgOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G5qNgufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNg-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNgefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5qNhOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G5qNhufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNh-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNhefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5qNZufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5qNZ-fXEduqHoOJbURZRw" points="[2218, -1422, -7890, 3149]$[8652, -1422, -1456, 3149]$[8652, -2641, -1456, 1930]"/>
-              </edges>
-              <edges xmi:id="_G5qNiOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F033F" source="_G5qNVefXEduqHoOJbURZRw" target="_G5qNIufXEduqHoOJbURZRw">
-                <children xmi:id="_G5qNi-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5qNjefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5qNjufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5qNjOfXEduqHoOJbURZRw" x="-1215" y="-321"/>
-                </children>
-                <children xmi:id="_G5qNj-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G5qNkefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNkOfXEduqHoOJbURZRw" x="-1920" y="-254"/>
-                </children>
-                <children xmi:id="_G5qNkufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G5qNlOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNk-fXEduqHoOJbURZRw" x="-1158" y="237"/>
-                </children>
-                <children xmi:id="_G5qNlefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G5qNl-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNlufXEduqHoOJbURZRw" x="1783" y="-134"/>
-                </children>
-                <children xmi:id="_G5qNmOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G5qNmufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNmefXEduqHoOJbURZRw" x="1817" y="1203"/>
-                </children>
-                <children xmi:id="_G5qNm-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G5qNnefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNnufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNnOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5qNn-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G5qNoefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNoufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNoOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5qNo-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G5qNpefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNpufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNpOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5qNp-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G5qNqefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5qNqufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNqOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5qNiefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5qNiufXEduqHoOJbURZRw" points="[2218, 1896, -7890, 6468]$[11717, 1896, 1608, 6468]$[11717, -2641, 1608, 1930]"/>
-              </edges>
-              <edges xmi:id="_G5qNq-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0353" source="_G5qNVefXEduqHoOJbURZRw" target="_G5qNIufXEduqHoOJbURZRw">
-                <children xmi:id="_G5qNrufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5qNsOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5qNsefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5qNr-fXEduqHoOJbURZRw" y="-262"/>
-                </children>
-                <children xmi:id="_G5qNsufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G5qNtOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNs-fXEduqHoOJbURZRw" x="-1363" y="-288"/>
-                </children>
-                <children xmi:id="_G5qNtefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G5qNt-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNtufXEduqHoOJbURZRw" x="212" y="246"/>
-                </children>
-                <children xmi:id="_G5qNuOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G5qNuufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNuefXEduqHoOJbURZRw" x="1236" y="433"/>
-                </children>
-                <children xmi:id="_G5qNu-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G5z-IOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5qNvOfXEduqHoOJbURZRw" x="626" y="1110"/>
-                </children>
-                <children xmi:id="_G5z-IefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G5z-I-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-JOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-IufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-JefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G5z-J-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-KOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-JufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-KefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G5z-K-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-LOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-KufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5z-LefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G5z-L-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-MOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-LufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5qNrOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5qNrefXEduqHoOJbURZRw" points="[2218, 59, -7890, 4631]$[9787, 59, -321, 4631]$[9787, -2641, -321, 1930]"/>
-              </edges>
-              <edges xmi:id="_G5z-MefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F030D" source="_G5hDRefXEduqHoOJbURZRw" target="_G5qNVefXEduqHoOJbURZRw">
-                <children xmi:id="_G5z-NOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5z-NufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5z-N-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5z-NefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-OOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G5z-OufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-OefXEduqHoOJbURZRw" x="82" y="-406"/>
-                </children>
-                <children xmi:id="_G5z-O-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G5z-PefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-POfXEduqHoOJbURZRw" x="160" y="579"/>
-                </children>
-                <children xmi:id="_G5z-PufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G5z-QOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-P-fXEduqHoOJbURZRw" x="-127" y="-239"/>
-                </children>
-                <children xmi:id="_G5z-QefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G5z-Q-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-QufXEduqHoOJbURZRw" x="76" y="-347"/>
-                </children>
-                <children xmi:id="_G5z-ROfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G5z-RufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-R-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-RefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-SOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G5z-SufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-S-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-SefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-TOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G5z-TufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-T-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-TefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5z-UOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G5z-UufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-U-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-UefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5z-MufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5z-M-fXEduqHoOJbURZRw" points="[135, -558, 84, 4013]$[135, -2167, 84, 2404]"/>
-              </edges>
-              <edges xmi:id="_G5z-dOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600020" source="_G5z-ZOfXEduqHoOJbURZRw" target="_G5z-ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5z-d-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5z-eefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5z-eufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5z-eOfXEduqHoOJbURZRw" x="-2073" y="254"/>
-                </children>
-                <children xmi:id="_G5z-e-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5z-fefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-fOfXEduqHoOJbURZRw" x="215" y="275"/>
-                </children>
-                <children xmi:id="_G5z-fufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5z-gOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-f-fXEduqHoOJbURZRw" x="150" y="-865"/>
-                </children>
-                <children xmi:id="_G5z-gefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5z-g-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-gufXEduqHoOJbURZRw" x="-2156" y="-359"/>
-                </children>
-                <children xmi:id="_G5z-hOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5z-hufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-hefXEduqHoOJbURZRw" x="-671" y="-1157"/>
-                </children>
-                <children xmi:id="_G5z-h-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5z-iefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-iufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-iOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-i-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5z-jefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-jufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-jOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-j-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600023">
-                  <children xmi:id="_G5z-kefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-kufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-kOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G5z-k-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600021">
-                  <children xmi:id="_G5z-lefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-lufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-lOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5z-defXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5z-dufXEduqHoOJbURZRw" points="[2514, -1955, 2514, -1955]$[2514, -3522, 2514, -3522]$[-922, -3522, -922, -3522]$[-922, -1955, -922, -1955]"/>
-              </edges>
-              <edges xmi:id="_G5z-l-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60000C" source="_G5z-ZOfXEduqHoOJbURZRw" target="_G5z-ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G5z-mufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G5z-nOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G5z-nefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G5z-m-fXEduqHoOJbURZRw" x="-749" y="-831"/>
-                </children>
-                <children xmi:id="_G5z-nufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5z-oOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-n-fXEduqHoOJbURZRw" x="-819" y="-448"/>
-                </children>
-                <children xmi:id="_G5z-oefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5z-o-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-oufXEduqHoOJbURZRw" x="83" y="306"/>
-                </children>
-                <children xmi:id="_G5z-pOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G5z-pufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-pefXEduqHoOJbURZRw" x="199" y="-237"/>
-                </children>
-                <children xmi:id="_G5z-p-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G5z-qefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-qOfXEduqHoOJbURZRw" x="191" y="344"/>
-                </children>
-                <children xmi:id="_G5z-qufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5z-rOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-refXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-q-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-rufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G5z-sOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-sefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-r-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G5z-sufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G5z-tOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G5z-tefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G5z-s-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G59vIOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G59vIufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vI-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vIefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G5z-mOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G5z-mefXEduqHoOJbURZRw" points="[-2700, -1955, -2700, -1955]$[-2700, -2675, -2700, -2675]$[-7382, -2675, -7382, -2675]$[-7382, -855, -7382, -855]$[-3251, -855, -3251, -855]"/>
-              </edges>
-              <edges xmi:id="_G59vJOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60017E" source="_G5qNIufXEduqHoOJbURZRw" target="_G5z-ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G59vJ-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G59vKefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G59vKufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G59vKOfXEduqHoOJbURZRw" x="362" y="-288"/>
-                </children>
-                <children xmi:id="_G59vK-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G59vLefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vLOfXEduqHoOJbURZRw" x="-1482" y="-356"/>
-                </children>
-                <children xmi:id="_G59vLufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G59vMOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vL-fXEduqHoOJbURZRw" x="440" y="246"/>
-                </children>
-                <children xmi:id="_G59vMefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G59vM-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vMufXEduqHoOJbURZRw" x="1640" y="-347"/>
-                </children>
-                <children xmi:id="_G59vNOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G59vNufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vNefXEduqHoOJbURZRw" x="455" y="237"/>
-                </children>
-                <children xmi:id="_G59vN-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G59vOefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vOufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vOOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59vO-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G59vPefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vPufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vPOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59vP-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G59vQefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vQufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vQOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G59vQ-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G59vRefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vRufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vROfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G59vJefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G59vJufXEduqHoOJbURZRw" points="[-2218, 457, 15561, 762]$[-14528, 457, 3251, 762]"/>
-              </edges>
-              <edges xmi:id="_G59vR-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60019C" source="_G5qNIufXEduqHoOJbURZRw" target="_G5z-ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G59vSufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G59vTOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G59vTefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G59vS-fXEduqHoOJbURZRw" x="870" y="-278"/>
-                </children>
-                <children xmi:id="_G59vTufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G59vUOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vT-fXEduqHoOJbURZRw" x="-1482" y="-329"/>
-                </children>
-                <children xmi:id="_G59vUefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G59vU-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vUufXEduqHoOJbURZRw" x="-382" y="263"/>
-                </children>
-                <children xmi:id="_G59vVOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G59vVufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vVefXEduqHoOJbURZRw" x="1632" y="-245"/>
-                </children>
-                <children xmi:id="_G59vV-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G59vWefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vWOfXEduqHoOJbURZRw" x="776" y="280"/>
-                </children>
-                <children xmi:id="_G59vWufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G59vXOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vXefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vW-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59vXufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G59vYOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vYefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vX-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59vYufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G59vZOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vZefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vY-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G59vZufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G59vaOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vaefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vZ-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G59vSOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G59vSefXEduqHoOJbURZRw" points="[-2218, -1100, 15561, -795]$[-14528, -1100, 3251, -795]"/>
-              </edges>
-              <edges xmi:id="_G59vaufXEduqHoOJbURZRw" type="NoteAttachment" source="_G5hDMOfXEduqHoOJbURZRw" target="_G59vR-fXEduqHoOJbURZRw">
-                <styles xmi:type="notation:ConnectorStyle" xmi:id="_G59va-fXEduqHoOJbURZRw" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G59vbOfXEduqHoOJbURZRw" points="[110, 872, -203, -1329]$[313, 2201, 0, 0]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G59vbefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G59vbufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G59vb-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600229" source="_G5z-ZOfXEduqHoOJbURZRw" target="_G5qNVefXEduqHoOJbURZRw">
-                <children xmi:id="_G59vcufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G59vdOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G59vdefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G59vc-fXEduqHoOJbURZRw" x="529" y="-304"/>
-                </children>
-                <children xmi:id="_G59vdufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G59veOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vd-fXEduqHoOJbURZRw" x="-476" y="195"/>
-                </children>
-                <children xmi:id="_G59veefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G59ve-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59veufXEduqHoOJbURZRw" x="-459" y="-1194"/>
-                </children>
-                <children xmi:id="_G59vfOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G59vfufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vfefXEduqHoOJbURZRw" x="418" y="-295"/>
-                </children>
-                <children xmi:id="_G59vf-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G59vgefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vgOfXEduqHoOJbURZRw" x="-607" y="263"/>
-                </children>
-                <children xmi:id="_G59vgufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G59vhOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vhefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vg-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59vhufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G59viOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59viefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vh-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59viufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G59vjOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vjefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vi-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G59vjufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G59vkOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vkefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vj-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G59vcOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G59vcefXEduqHoOJbURZRw" points="[2218, 1955, -5452, -2921]$[2218, 3699, -5452, -1176]$[5452, 3699, -2218, -1176]"/>
-              </edges>
-              <edges xmi:id="_G59vkufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60023D" source="_G5z-ZOfXEduqHoOJbURZRw" target="_G5qNVefXEduqHoOJbURZRw">
-                <children xmi:id="_G59vlefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G59vl-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G59vmOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G59vlufXEduqHoOJbURZRw" x="627" y="-271"/>
-                </children>
-                <children xmi:id="_G59vmefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G59vm-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vmufXEduqHoOJbURZRw" x="-1299" y="-245"/>
-                </children>
-                <children xmi:id="_G59vnOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G59vnufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vnefXEduqHoOJbURZRw" x="-1019" y="1"/>
-                </children>
-                <children xmi:id="_G59vn-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G59voefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59voOfXEduqHoOJbURZRw" x="1393" y="-195"/>
-                </children>
-                <children xmi:id="_G59voufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G59vpOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vo-fXEduqHoOJbURZRw" x="504" y="271"/>
-                </children>
-                <children xmi:id="_G59vpefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G59vp-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vqOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vpufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59vqefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G59vq-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vrOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vqufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G59vrefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G59vr-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vsOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vrufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G59vsefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G59vs-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G59vtOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G59vsufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G59vk-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G59vlOfXEduqHoOJbURZRw" points="[-2646, 1958, -10318, -2910]$[-2646, 5821, -10318, 953]$[5450, 5821, -2222, 953]"/>
-              </edges>
-              <edges xmi:id="_G6G5EOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60025B" source="_G5qNVefXEduqHoOJbURZRw" target="_G5z-ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6G5E-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6G5FefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6G5FufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6G5FOfXEduqHoOJbURZRw" x="-910" y="254"/>
-                </children>
-                <children xmi:id="_G6G5F-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6G5GefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5GOfXEduqHoOJbURZRw" x="-1823" y="279"/>
-                </children>
-                <children xmi:id="_G6G5GufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6G5HOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5G-fXEduqHoOJbURZRw" x="-536" y="-314"/>
-                </children>
-                <children xmi:id="_G6G5HefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6G5H-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5HufXEduqHoOJbURZRw" x="1637" y="203"/>
-                </children>
-                <children xmi:id="_G6G5IOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6G5IufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5IefXEduqHoOJbURZRw" x="93" y="974"/>
-                </children>
-                <children xmi:id="_G6G5I-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6G5JefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5JufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5JOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6G5J-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6G5KefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5KufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5KOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6G5K-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6G5LefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5LufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5LOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6G5L-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6G5MefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5MufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5MOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6G5EefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6G5EufXEduqHoOJbURZRw" points="[-2222, 318, 5450, 5186]$[-9048, 318, -1376, 5186]$[-9048, -2910, -1376, 1958]"/>
-              </edges>
-              <edges xmi:id="_G6G5M-fXEduqHoOJbURZRw" element="_3ADC7B74022D416D75AA004B" source="_G5qNVefXEduqHoOJbURZRw" target="_G5z-ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6G5NufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6G5OOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6G5OefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6G5N-fXEduqHoOJbURZRw" x="-343" y="271"/>
-                </children>
-                <children xmi:id="_G6G5OufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6G5POfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5O-fXEduqHoOJbURZRw" x="-1062" y="245"/>
-                </children>
-                <children xmi:id="_G6G5PefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6G5P-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5PufXEduqHoOJbURZRw" x="327" y="-220"/>
-                </children>
-                <children xmi:id="_G6G5QOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6G5QufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5QefXEduqHoOJbURZRw" x="1003" y="186"/>
-                </children>
-                <children xmi:id="_G6G5Q-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6G5RefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5ROfXEduqHoOJbURZRw" x="656" y="1024"/>
-                </children>
-                <children xmi:id="_G6G5RufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6G5SOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5SefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5R-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6G5SufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6G5TOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5TefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5S-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6G5TufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6G5UOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5UefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5T-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6G5UufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6G5VOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5VefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5U-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6G5NOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6G5NefXEduqHoOJbURZRw" points="[-2218, 8, 5452, 4885]$[-7992, 8, -321, 4885]$[-7992, -2921, -321, 1955]"/>
-              </edges>
-              <edges xmi:id="_G6G5VufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D7" source="_G5z-VOfXEduqHoOJbURZRw" target="_G5z-ZOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6G5WefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6G5W-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6G5XOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6G5WufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6G5XefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G6G5X-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5XufXEduqHoOJbURZRw" x="-217" y="429"/>
-                </children>
-                <children xmi:id="_G6G5YOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G6G5YufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5YefXEduqHoOJbURZRw" x="-266" y="-1170"/>
-                </children>
-                <children xmi:id="_G6G5Y-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G6G5ZefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5ZOfXEduqHoOJbURZRw" x="536" y="457"/>
-                </children>
-                <children xmi:id="_G6G5ZufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G6G5aOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5Z-fXEduqHoOJbURZRw" x="264" y="-347"/>
-                </children>
-                <children xmi:id="_G6G5aefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G6G5a-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5bOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5aufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6G5befXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G6G5b-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5cOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5bufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6G5cefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F03DA">
-                  <children xmi:id="_G6G5c-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5dOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5cufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6G5defXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F03D8">
-                  <children xmi:id="_G6G5d-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6G5eOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6G5dufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6G5V-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6G5WOfXEduqHoOJbURZRw" points="[0, -567, -6858, 4004]$[33, -2294, -6824, 2277]$[3598, -3496, -3259, 1075]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D411C4CC50260" type="Class" name="DescriptorRelationships (simplified)">
-              <children xmi:id="_G6QqEOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G6QqE-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6QqFOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G6QqFefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6QqFufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6QqF-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6QqGOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqGefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6QqGufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqG-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6QqHOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqHefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6QqHufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6QqH-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6QqEefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6QqEufXEduqHoOJbURZRw" x="15705" y="2497" width="3234" height="1202"/>
-              </children>
-              <children xmi:id="_G6QqIOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G6QqI-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6QqJOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G6QqJefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6QqJufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6QqJ-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6QqKOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqKefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6QqKufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqK-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6QqLOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqLefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6QqLufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6QqL-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6QqIefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6QqIufXEduqHoOJbURZRw" x="601" y="2370" width="4792" height="1761"/>
-              </children>
-              <children xmi:id="_G6QqdufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G6QqeefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6QqeufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G6Qqe-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6QqfOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6QqfefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6QqfufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6Qqf-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6abEOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abEefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6abEufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abE-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6abFOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6abFefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6Qqd-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6QqeOfXEduqHoOJbURZRw" x="8779" y="6324" width="3369" height="1778"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlZNUefXEduqHoOJbURZRw" description="This diagram provides a simplified overview of the different Descriptor types defined in this Process package and their relationships not showing class attributes or association roles."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G6QqMOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60017E" source="_G6QqEOfXEduqHoOJbURZRw" target="_G6QqIOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6QqM-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6QqNefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6QqNufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6QqNOfXEduqHoOJbURZRw" x="127" y="254"/>
-                </children>
-                <children xmi:id="_G6QqN-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G6QqOefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqOOfXEduqHoOJbURZRw" x="-1124" y="-288"/>
-                </children>
-                <children xmi:id="_G6QqOufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G6QqPOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqO-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6QqPefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G6QqP-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqPufXEduqHoOJbURZRw" x="1209" y="-449"/>
-                </children>
-                <children xmi:id="_G6QqQOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G6QqQufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqQefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6QqQ-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G6QqRefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqRufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqROfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6QqR-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G6QqSefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqSufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqSOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6QqS-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600188">
-                  <children xmi:id="_G6QqTefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqTufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqTOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6QqT-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60017F">
-                  <children xmi:id="_G6QqUefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqUufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqUOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6QqMefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6QqMufXEduqHoOJbURZRw" points="[-1617, 93, 12708, -59]$[-11929, 93, 2396, -59]"/>
-              </edges>
-              <edges xmi:id="_G6QqU-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60019C" source="_G6QqEOfXEduqHoOJbURZRw" target="_G6QqIOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6QqVufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6QqWOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6QqWefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6QqV-fXEduqHoOJbURZRw" x="182" y="279"/>
-                </children>
-                <children xmi:id="_G6QqWufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G6QqXOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqW-fXEduqHoOJbURZRw" x="-626" y="-525"/>
-                </children>
-                <children xmi:id="_G6QqXefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G6QqX-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqXufXEduqHoOJbURZRw" x="-795" y="347"/>
-                </children>
-                <children xmi:id="_G6QqYOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G6QqYufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqYefXEduqHoOJbURZRw" x="1050" y="-1007"/>
-                </children>
-                <children xmi:id="_G6QqY-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G6QqZefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqZOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6QqZufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G6QqaOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqaefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6QqZ-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6QqaufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G6QqbOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqbefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6Qqa-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6QqbufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60019F">
-                  <children xmi:id="_G6QqcOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqcefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6Qqb-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6QqcufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60019D">
-                  <children xmi:id="_G6QqdOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6QqdefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6Qqc-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6QqVOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6QqVefXEduqHoOJbURZRw" points="[-465, -601, 13859, -753]$[-465, -1930, 13859, -2082]$[-13961, -1930, 364, -2082]$[-13961, -728, 364, -880]"/>
-              </edges>
-              <edges xmi:id="_G6abFufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0321" source="_G6QqdufXEduqHoOJbURZRw" target="_G6QqEOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6abGefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6abG-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6abHOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6abGufXEduqHoOJbURZRw" x="-1122" y="262"/>
-                </children>
-                <children xmi:id="_G6abHefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G6abH-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abHufXEduqHoOJbURZRw" x="-827" y="906"/>
-                </children>
-                <children xmi:id="_G6abIOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G6abIufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abIefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abI-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G6abJefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abJOfXEduqHoOJbURZRw" x="709" y="212"/>
-                </children>
-                <children xmi:id="_G6abJufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G6abKOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abJ-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abKefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G6abK-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abLOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abKufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6abLefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G6abL-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abMOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abLufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6abMefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F032B">
-                  <children xmi:id="_G6abM-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abNOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abMufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6abNefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0322">
-                  <children xmi:id="_G6abN-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abOOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abNufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6abF-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6abGOfXEduqHoOJbURZRw" points="[1684, -821, -5173, 3293]$[5469, -821, -1388, 3293]$[5469, -3513, -1388, 601]"/>
-              </edges>
-              <edges xmi:id="_G6abOefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F033F" source="_G6QqdufXEduqHoOJbURZRw" target="_G6QqEOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6abPOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6abPufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6abP-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6abPefXEduqHoOJbURZRw" x="400" y="295"/>
-                </children>
-                <children xmi:id="_G6abQOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G6abQufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abQefXEduqHoOJbURZRw" x="-1424" y="356"/>
-                </children>
-                <children xmi:id="_G6abQ-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G6abRefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abROfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abRufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G6abSOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abR-fXEduqHoOJbURZRw" x="1314" y="-168"/>
-                </children>
-                <children xmi:id="_G6abSefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G6abS-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abSufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abTOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G6abTufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abT-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abTefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6abUOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G6abUufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abU-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abUefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6abVOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0342">
-                  <children xmi:id="_G6abVufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abV-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abVefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6abWOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0340">
-                  <children xmi:id="_G6abWufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abW-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abWefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6abOufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6abO-fXEduqHoOJbURZRw" points="[1684, 660, -5173, 4775]$[8085, 660, 1227, 4775]$[8085, -3513, 1227, 601]"/>
-              </edges>
-              <edges xmi:id="_G6abXOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0353" source="_G6QqdufXEduqHoOJbURZRw" target="_G6QqEOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6abX-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6abYefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6abYufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6abYOfXEduqHoOJbURZRw" x="-895" y="387"/>
-                </children>
-                <children xmi:id="_G6abY-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G6abZefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abZOfXEduqHoOJbURZRw" x="-1137" y="-940"/>
-                </children>
-                <children xmi:id="_G6abZufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G6abaOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abZ-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abaefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G6aba-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abaufXEduqHoOJbURZRw" x="985" y="391"/>
-                </children>
-                <children xmi:id="_G6abbOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G6abbufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abbefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abb-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G6abcefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abcufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abcOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6abc-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G6abdefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abdufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abdOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6abd-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0356">
-                  <children xmi:id="_G6abeefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abeufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abeOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6abe-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0354">
-                  <children xmi:id="_G6abfefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abfufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abfOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6abXefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6abXufXEduqHoOJbURZRw" points="[1684, -118, -5173, 3996]$[5833, -118, -1024, 3996]$[6544, -59, -313, 4055]$[6544, -3513, -313, 601]"/>
-              </edges>
-              <edges xmi:id="_G6abf-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600229" source="_G6QqIOfXEduqHoOJbURZRw" target="_G6QqdufXEduqHoOJbURZRw">
-                <children xmi:id="_G6abgufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6abhOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6abhefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6abg-fXEduqHoOJbURZRw" x="-398" y="-246"/>
-                </children>
-                <children xmi:id="_G6abhufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G6abiOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abh-fXEduqHoOJbURZRw" x="-296" y="-677"/>
-                </children>
-                <children xmi:id="_G6abiefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G6abi-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abiufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abjOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G6abjufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abjefXEduqHoOJbURZRw" x="813" y="-212"/>
-                </children>
-                <children xmi:id="_G6abj-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G6abkefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abkOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6abkufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G6ablOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6ablefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abk-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6ablufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G6abmOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abmefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abl-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6abmufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60022C">
-                  <children xmi:id="_G6abnOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6abnefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abm-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6abnufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60022A">
-                  <children xmi:id="_G6aboOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6aboefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abn-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6abgOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6abgefXEduqHoOJbURZRw" points="[1634, 880, -5833, -3081]$[1634, 1871, -5833, -2091]$[6722, 1871, -745, -2091]$[6722, 3073, -745, -889]"/>
-              </edges>
-              <edges xmi:id="_G6aboufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60023D" source="_G6QqIOfXEduqHoOJbURZRw" target="_G6QqdufXEduqHoOJbURZRw">
-                <children xmi:id="_G6abpefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6abp-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6abqOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6abpufXEduqHoOJbURZRw" x="-116" y="-262"/>
-                </children>
-                <children xmi:id="_G6abqefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G6jlAOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6abqufXEduqHoOJbURZRw" x="-1316" y="-135"/>
-                </children>
-                <children xmi:id="_G6jlAefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G6jlA-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlAufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6jlBOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G6jlBufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlBefXEduqHoOJbURZRw" x="1519" y="-313"/>
-                </children>
-                <children xmi:id="_G6jlB-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G6jlCefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlCOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6jlCufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G6jlDOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlDefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlC-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6jlDufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G6jlEOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlEefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlD-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6jlEufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600248">
-                  <children xmi:id="_G6jlFOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlFefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlE-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6jlFufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600246">
-                  <children xmi:id="_G6jlGOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlGefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlF-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6abo-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6abpOfXEduqHoOJbURZRw" points="[-1947, 880, -9414, -3081]$[-1947, 4461, -9414, 499]$[135, 4436, -7332, 474]$[5782, 4436, -1684, 474]"/>
-              </edges>
-              <edges xmi:id="_G6jlGufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60025B" source="_G6QqdufXEduqHoOJbURZRw" target="_G6QqIOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6jlHefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6jlH-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6jlIOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6jlHufXEduqHoOJbURZRw" x="-673" y="305"/>
-                </children>
-                <children xmi:id="_G6jlIefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6jlI-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlIufXEduqHoOJbURZRw" x="-1203" y="271"/>
-                </children>
-                <children xmi:id="_G6jlJOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6jlJufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlJefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6jlJ-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6jlKefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlKOfXEduqHoOJbURZRw" x="1153" y="187"/>
-                </children>
-                <children xmi:id="_G6jlKufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6jlLOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlK-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6jlLefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6jlL-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlMOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlLufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6jlMefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6jlM-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlNOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlMufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6jlNefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60025E">
-                  <children xmi:id="_G6jlN-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlOOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlNufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6jlOefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60025C">
-                  <children xmi:id="_G6jlO-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlPOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlOufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6jlG-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6jlHOfXEduqHoOJbURZRw" points="[-1684, -338, 5782, 3623]$[-8382, -338, -914, 3623]$[-8382, -3081, -914, 880]"/>
-              </edges>
-              <edges xmi:id="_G6jlPefXEduqHoOJbURZRw" element="_3ADC7B74022D416D75AA004B" source="_G6QqdufXEduqHoOJbURZRw" target="_G6QqIOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6jlQOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6jlQufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6jlQ-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6jlQefXEduqHoOJbURZRw" x="-403" y="305"/>
-                </children>
-                <children xmi:id="_G6jlROfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6jlRufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlRefXEduqHoOJbURZRw" x="-975" y="-211"/>
-                </children>
-                <children xmi:id="_G6jlR-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6jlSefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlSOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6jlSufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6jlTOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlS-fXEduqHoOJbURZRw" x="830" y="211"/>
-                </children>
-                <children xmi:id="_G6jlTefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6jlT-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlTufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G6jlUOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6jlUufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlU-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlUefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6jlVOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6jlVufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlV-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlVefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6jlWOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D416D75AB0295">
-                  <children xmi:id="_G6jlWufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlW-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlWefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6jlXOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D416D75AB0281">
-                  <children xmi:id="_G6jlXufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlX-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6jlXefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6jlPufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6jlP-fXEduqHoOJbURZRw" points="[-1473, -889, 5994, 3073]$[-1473, -1261, 5994, 2700]$[-6959, -1261, 508, 2700]$[-6959, -3081, 508, 880]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41E790540225" type="Class" name="Activity">
-              <children xmi:id="_G6jlYOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G6jlY-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6jlZOfXEduqHoOJbURZRw" width="6891" height="2421"/>
-                </children>
-                <children xmi:id="_G6jlZefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6jlZufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6jlZ-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6jlaOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlaefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6jlaufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jla-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6jlbOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6jlbefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWAOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6tWAefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6jlYefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6jlYufXEduqHoOJbURZRw" x="6714" y="1583"/>
-              </children>
-              <children xmi:id="_G6tWAufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G6tWBefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6tWBufXEduqHoOJbURZRw" width="1574" height="905"/>
-                </children>
-                <children xmi:id="_G6tWB-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6tWCOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6tWCefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6tWCufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWC-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWDOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWDefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWDufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWD-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWEOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6tWEefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6tWA-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWBOfXEduqHoOJbURZRw" x="6629" y="7272"/>
-              </children>
-              <children xmi:id="_G6tWNefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CB">
-                <children xmi:id="_G6tWOOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6tWOefXEduqHoOJbURZRw" width="1659" height="905"/>
-                </children>
-                <children xmi:id="_G6tWOufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6tWO-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6tWPOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6tWPefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWPufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWP-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWQOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWQefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWQufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWQ-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6tWROfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6tWNufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWN-fXEduqHoOJbURZRw" x="7806" y="9101"/>
-              </children>
-              <children xmi:id="_G6tWTufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CA">
-                <children xmi:id="_G6tWUefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6tWUufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G6tWU-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6tWVOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6tWVefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6tWVufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWV-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWWOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWWefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWWufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWW-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWXOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6tWXefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6tWT-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWUOfXEduqHoOJbURZRw" x="6146" y="9101"/>
-              </children>
-              <children xmi:id="_G6tWZ-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G6tWaufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6tWa-fXEduqHoOJbURZRw" width="4250" height="905"/>
-                </children>
-                <children xmi:id="_G6tWbOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6tWbefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6tWbufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6tWb-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWcOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWcefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWcufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWc-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWdOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWdefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6tWdufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6tWaOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWaefXEduqHoOJbURZRw" x="1819" y="5035"/>
-              </children>
-              <children xmi:id="_G6tWiefXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_G6tWjOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G6tWjefXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G6tWjufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G6tWj-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G6tWkOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G6tWkefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWkufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWk-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWlOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWlefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWlufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G6tWl-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G6tWmOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G6tWiufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWi-fXEduqHoOJbURZRw" x="6688" y="5072"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GlZNU-fXEduqHoOJbURZRw" description="This diagram shows key attributes and relationships defined for Activity in the Process Breakdown package.  One can see that the concepts of Phase and Iteration have been defined as special Activities. "/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G6tWEufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FFD300EF" source="_G6jlYOfXEduqHoOJbURZRw" target="_G6tWAufXEduqHoOJbURZRw">
-                <children xmi:id="_G6tWFefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6tWF-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6tWGOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWFufXEduqHoOJbURZRw" x="-749" y="1592"/>
-                </children>
-                <children xmi:id="_G6tWGefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G6tWG-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWGufXEduqHoOJbURZRw" x="-479" y="-248"/>
-                </children>
-                <children xmi:id="_G6tWHOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G6tWHufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWHefXEduqHoOJbURZRw" x="-539" y="1692"/>
-                </children>
-                <children xmi:id="_G6tWH-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G6tWIefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWIOfXEduqHoOJbURZRw" x="536" y="186"/>
-                </children>
-                <children xmi:id="_G6tWIufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G6tWJOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWI-fXEduqHoOJbURZRw" x="-414" y="-340"/>
-                </children>
-                <children xmi:id="_G6tWJefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G6tWJ-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWKOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWJufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6tWKefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G6tWK-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWLOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWKufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G6tWLefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G6tWL-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWMOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWLufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G6tWMefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G6tWM-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G6tWNOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G6tWMufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6tWE-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6tWFOfXEduqHoOJbURZRw" points="[1852, 1058, 3704, -3890]$[1852, 5001, 3704, 53]$[-926, 5001, 926, 53]"/>
-              </edges>
-              <edges xmi:id="_G6tWRefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F02A0" source="_G6tWNefXEduqHoOJbURZRw" target="_G6tWAufXEduqHoOJbURZRw">
-                <children xmi:id="_G6tWSOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6tWSufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6tWS-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWSefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6tWRufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6tWR-fXEduqHoOJbURZRw" points="[-304, -457, 914, 1371]$[-922, -1380, 296, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWTOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWTefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G6tWXufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F029F" source="_G6tWTufXEduqHoOJbURZRw" target="_G6tWAufXEduqHoOJbURZRw">
-                <children xmi:id="_G6tWYefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6tWY-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6tWZOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWYufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6tWX-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6tWYOfXEduqHoOJbURZRw" points="[304, -457, -965, 1371]$[948, -1380, -321, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWZefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWZufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G6tWd-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G6tWAufXEduqHoOJbURZRw" target="_G6tWZ-fXEduqHoOJbURZRw">
-                <children xmi:id="_G6tWeufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6tWfOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6tWfefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWe-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6tWeOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6tWeefXEduqHoOJbURZRw" points="[-953, 53, 2513, 2276]$[-4445, 53, -979, 2276]$[-4445, -1905, -979, 318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWfufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWf-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G6tWgOfXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G6tWZ-fXEduqHoOJbURZRw" target="_G6jlYOfXEduqHoOJbURZRw">
-                <children xmi:id="_G6tWg-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6tWhefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6tWhufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWhOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6tWgefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6tWgufXEduqHoOJbURZRw" points="[127, -448, -5664, 2294]$[127, -2624, -5664, 118]$[2345, -2624, -3445, 118]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWh-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G6tWiOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G6tWmefXEduqHoOJbURZRw" element="_3ADC7B74022D428CD32901FD" source="_G6tWAufXEduqHoOJbURZRw" target="_G6tWiefXEduqHoOJbURZRw">
-                <children xmi:id="_G6tWnOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G6tWnufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G6tWn-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G6tWnefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G6tWmufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G6tWm-fXEduqHoOJbURZRw" points="[25, -457, -1092, 1727]$[25, -1667, -1092, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G62f8OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G62f8efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D427A92D4007E" type="Class" name="WorkDefinitionAndBreakdown">
-              <children xmi:id="_G62f8ufXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G62f9efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G62f9ufXEduqHoOJbURZRw" width="5164" height="2065"/>
-                </children>
-                <children xmi:id="_G62f9-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G62f-OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G62f-efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G62f-ufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62f--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62f_OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62f_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62f_ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62f_-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gAOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G62gAefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G62f8-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G62f9OfXEduqHoOJbURZRw" x="15807" y="11870"/>
-              </children>
-              <children xmi:id="_G62gAufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G62gBefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G62gBufXEduqHoOJbURZRw" width="7382" height="1185"/>
-                </children>
-                <children xmi:id="_G62gB-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G62gCOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G62gCefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G62gCufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gC-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gDOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gDefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gDufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gD-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gEOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G62gEefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G62gA-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G62gBOfXEduqHoOJbURZRw" x="5198" y="11853"/>
-              </children>
-              <children xmi:id="_G62gEufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G62gFefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G62gFufXEduqHoOJbURZRw" width="2726" height="1100"/>
-                </children>
-                <children xmi:id="_G62gF-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G62gGOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G62gGefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G62gGufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gG-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gHOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gHefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gHufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gH-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gIOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G62gIefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G62gE-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G62gFOfXEduqHoOJbURZRw" x="12630" y="15324"/>
-              </children>
-              <children xmi:id="_G62gIufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G62gJefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G62gJufXEduqHoOJbURZRw" width="4318" height="1625"/>
-                </children>
-                <children xmi:id="_G62gJ-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G62gKOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G62gKefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G62gKufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gK-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gLOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gLefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gLufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gL-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gMOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G62gMefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G62gI-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G62gJOfXEduqHoOJbURZRw" x="4699" y="15290"/>
-              </children>
-              <children xmi:id="_G62gMufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G62gNefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G62gNufXEduqHoOJbURZRw" width="2675" height="1100"/>
-                </children>
-                <children xmi:id="_G62gN-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G62gOOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G62gOefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G62gOufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gO-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gPOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gPefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gPufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gP-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gQOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G62gQefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G62gM-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G62gNOfXEduqHoOJbURZRw" x="9362" y="15299"/>
-              </children>
-              <children xmi:id="_G62gQufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0063">
-                <children xmi:id="_G62gRefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G62gRufXEduqHoOJbURZRw" width="2235" height="1100"/>
-                </children>
-                <children xmi:id="_G62gR-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G62gSOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G62gSefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G62gSufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gS-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gTOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gTefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gTufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G62gT-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G62gUOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G62gUefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G62gQ-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G62gROfXEduqHoOJbURZRw" x="1968" y="15299"/>
-              </children>
-              <children xmi:id="_G7AQ8OfXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_G7AQ8-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7AQ9OfXEduqHoOJbURZRw" width="3522" height="1524"/>
-                </children>
-                <children xmi:id="_G7AQ9efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7AQ9ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7AQ9-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7AQ-OfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7AQ-efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7AQ-ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7AQ--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7AQ_OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7AQ_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7AQ_ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7AQ_-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7AQ8efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7AQ8ufXEduqHoOJbURZRw" x="17339" y="5080"/>
-              </children>
-              <children xmi:id="_G7ARAOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_G7ARA-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7ARBOfXEduqHoOJbURZRw" width="2844" height="1066"/>
-                </children>
-                <children xmi:id="_G7ARBefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7ARBufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7ARB-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7ARCOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARCefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARCufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARC-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARDOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARDefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARDufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7ARD-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7ARAefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARAufXEduqHoOJbURZRw" x="13360" y="939"/>
-              </children>
-              <children xmi:id="_G7ARGefXEduqHoOJbURZRw" element="_3ADC7B74022D4283E8A10341">
-                <children xmi:id="_G7ARHOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7ARHefXEduqHoOJbURZRw" width="2997" height="1117"/>
-                </children>
-                <children xmi:id="_G7ARHufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7ARH-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7ARIOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7ARIefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARIufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARI-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARJOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARJefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARJufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARJ-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7ARKOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7ARGufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARG-fXEduqHoOJbURZRw" x="7747" y="5384"/>
-              </children>
-              <children xmi:id="_G7ARKefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G7ARLOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7ARLefXEduqHoOJbURZRw" width="6874" height="2506"/>
-                </children>
-                <children xmi:id="_G7ARLufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7ARL-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7ARMOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7ARMefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARMufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARM-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARNOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARNefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARNufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARN-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7AROOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7ARKufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARK-fXEduqHoOJbURZRw" x="5757" y="7840"/>
-              </children>
-              <children xmi:id="_G7AROefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G7ARPOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7ARPefXEduqHoOJbURZRw" width="1557" height="1117"/>
-                </children>
-                <children xmi:id="_G7ARPufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7ARP-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7ARQOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7ARQefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARQufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARQ-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARROfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARRefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARRufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7ARR-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7ARSOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7AROufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARO-fXEduqHoOJbURZRw" x="18931" y="8534"/>
-              </children>
-              <children xmi:id="_G7KB8ufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_G7KB9efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7KB9ufXEduqHoOJbURZRw" width="4707" height="1557"/>
-                </children>
-                <children xmi:id="_G7KB9-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7KB-OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7KB-efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7KB-ufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KB--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KB_OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KB_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KB_ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KB_-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KCAOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7KCAefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7KB8-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KB9OfXEduqHoOJbURZRw" x="9685" y="2929"/>
-              </children>
-              <children xmi:id="_G7KCFOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0031">
-                <children xmi:id="_G7KCF-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7KCGOfXEduqHoOJbURZRw" width="1930" height="1117"/>
-                </children>
-                <children xmi:id="_G7KCGefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7KCGufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7KCG-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7KCHOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KCHefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KCHufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KCH-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KCIOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KCIefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KCIufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7KCI-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7KCFefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCFufXEduqHoOJbURZRw" x="17027" y="15342"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gli-UefXEduqHoOJbURZRw" description="This diagram provide a general overview to the taxonomy defined in Process Breakdown presenting the two key abstractions Process Work Definition and Breakdown Element with their most important sub-classes."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G7AREOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A82F3026E" source="_G7AQ8OfXEduqHoOJbURZRw" target="_G7ARAOfXEduqHoOJbURZRw">
-                <children xmi:id="_G7ARE-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7ARFefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7ARFufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARFOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7AREefXEduqHoOJbURZRw" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7AREufXEduqHoOJbURZRw" points="[-762, -770, 3556, 3598]$[-3793, -3835, 524, 533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARF-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARGOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7ARSefXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FFD300EF" source="_G7ARKefXEduqHoOJbURZRw" target="_G7AROefXEduqHoOJbURZRw">
-                <children xmi:id="_G7ARTOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7ARTufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7ART-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARTefXEduqHoOJbURZRw" x="-65" y="347"/>
-                </children>
-                <children xmi:id="_G7ARUOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G7ARUufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARUefXEduqHoOJbURZRw" x="-758" y="305"/>
-                </children>
-                <children xmi:id="_G7ARU-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G7ARVefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARVOfXEduqHoOJbURZRw" x="876" y="-246"/>
-                </children>
-                <children xmi:id="_G7ARVufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G7ARWOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARV-fXEduqHoOJbURZRw" x="829" y="-260"/>
-                </children>
-                <children xmi:id="_G7ARWefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G7ARW-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARWufXEduqHoOJbURZRw" x="-88" y="357"/>
-                </children>
-                <children xmi:id="_G7ARXOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G7ARXufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARX-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARXefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7ARYOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G7ARYufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARY-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARYefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7ARZOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G7ARZufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARZ-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARZefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G7ARaOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G7ARaufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7ARa-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7ARaefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7ARSufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7ARS-fXEduqHoOJbURZRw" points="[3437, 0, -7078, 0]$[9728, 0, -787, 0]"/>
-              </edges>
-              <edges xmi:id="_G7ARbOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G7AROefXEduqHoOJbURZRw" target="_G62f8ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7ARb-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7ARcefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7ARcufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARcOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7ARbefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7ARbufXEduqHoOJbURZRw" points="[-118, 550, 1202, -3259]$[-118, 2768, 1202, -1041]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARc-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARdOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7ARdefXEduqHoOJbURZRw" element="_3ADC7B74022D428CD32901FD" source="_G7AROefXEduqHoOJbURZRw" target="_G7AQ8OfXEduqHoOJbURZRw">
-                <children xmi:id="_G7AReOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7AReufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7ARe-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7AReefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7ARdufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7ARd-fXEduqHoOJbURZRw" points="[8, -558, 618, 2692]$[8, -2489, 618, 762]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARfOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARfefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7ARfufXEduqHoOJbURZRw" element="_3ADC7B74022D4283E91F0061" source="_G7ARKefXEduqHoOJbURZRw" target="_G7ARGefXEduqHoOJbURZRw">
-                <children xmi:id="_G7ARgefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7ARg-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7ARhOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARgufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7ARf-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7ARgOfXEduqHoOJbURZRw" points="[50, -1253, 0, 1896]$[50, -2590, 0, 558]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARhefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARhufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7ARh-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A923B0002" source="_G62gEufXEduqHoOJbURZRw" target="_G62f8ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7ARiufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7ARjOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7ARjefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARi-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7ARiOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7ARiefXEduqHoOJbURZRw" points="[914, -558, -4064, 2387]$[3200, -1913, -1778, 1032]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARjufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7ARj-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7ARkOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G62gEufXEduqHoOJbURZRw" target="_G62gAufXEduqHoOJbURZRw">
-                <children xmi:id="_G7ARk-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7ARlefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7ARlufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7ARlOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7ARkefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7ARkufXEduqHoOJbURZRw" points="[-1100, -550, 3420, 2853]$[-1100, -2819, 3420, 584]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KB8OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KB8efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCAufXEduqHoOJbURZRw" element="_3ADC7B74022D4294ECC1031E" source="_G7ARGefXEduqHoOJbURZRw" target="_G7KB8ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCBefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCB-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCCOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCBufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCA-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCBOfXEduqHoOJbURZRw" points="[694, -567, -2099, 1667]$[1803, -1456, -990, 778]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCCefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCCufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCC-fXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_G7KB8ufXEduqHoOJbURZRw" target="_G7ARAOfXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCDufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCEOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCEefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCD-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCDOfXEduqHoOJbURZRw" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCDefXEduqHoOJbURZRw" points="[956, -787, -1786, 1447]$[2074, -1701, -668, 533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCEufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCE-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCJOfXEduqHoOJbURZRw" element="_3ADC7B74022D42B1EC1B0349" source="_G7KCFOfXEduqHoOJbURZRw" target="_G62f8ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCJ-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCKefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCKufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCKOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCJefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCJufXEduqHoOJbURZRw" points="[0, -567, 0, 2379]$[0, -1913, 0, 1032]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCK-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCLOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCLefXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G62f8ufXEduqHoOJbURZRw" target="_G7ARKefXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCMOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCMufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCM-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCMefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCLufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCL-fXEduqHoOJbURZRw" points="[-2497, -1041, 6697, 2768]$[-6146, -2556, 3048, 1253]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCNOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCNefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCNufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G62gAufXEduqHoOJbURZRw" target="_G7ARKefXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCOefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCO-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCPOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCOufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCN-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCOOfXEduqHoOJbURZRw" points="[-127, -592, -431, 2760]$[-127, -2099, -431, 1253]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCPefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCPufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCP-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G62gIufXEduqHoOJbURZRw" target="_G62gAufXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCQufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCROfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCRefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCQ-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCQOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCQefXEduqHoOJbURZRw" points="[135, -812, -1896, 2844]$[135, -3064, -1896, 592]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCRufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCR-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCSOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003E" source="_G62gQufXEduqHoOJbURZRw" target="_G7ARKefXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCS-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCTefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCTufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCTOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCSefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCSufXEduqHoOJbURZRw" points="[-26, -477, -5106, 6402]$[-26, -3361, -5106, 3518]$[3546, -5821, -1534, 1058]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCT-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCUOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7KCUefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600160" source="_G62gMufXEduqHoOJbURZRw" target="_G62gAufXEduqHoOJbURZRw">
-                <children xmi:id="_G7KCVOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7KCVufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7KCV-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCVefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7KCUufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7KCU-fXEduqHoOJbURZRw" points="[67, -550, 1693, 2853]$[67, -2819, 1693, 584]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCWOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7KCWefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D4283E8C80056" type="Class" name="ProcessElement">
-              <children xmi:id="_G7KCWufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G7KCXefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7KCXufXEduqHoOJbURZRw" width="3403" height="905"/>
-                </children>
-                <children xmi:id="_G7KCX-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7KCYOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7KCYefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7KCYufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KCY-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KCZOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KCZefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7KCZufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7KCZ-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TL4OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7TL4efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7KCW-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7KCXOfXEduqHoOJbURZRw" x="8661" y="7171"/>
-              </children>
-              <children xmi:id="_G7TL4ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_G7TL5efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7TL5ufXEduqHoOJbURZRw" width="2827" height="1032"/>
-                </children>
-                <children xmi:id="_G7TL5-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7TL6OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7TL6efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7TL6ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TL6-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TL7OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TL7efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TL7ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TL7-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TL8OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7TL8efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7TL4-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TL5OfXEduqHoOJbURZRw" x="8898" y="448"/>
-              </children>
-              <children xmi:id="_G7TL8ufXEduqHoOJbURZRw" element="_3ADC7B74022D4283E8A10341">
-                <children xmi:id="_G7TL9efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7TL9ufXEduqHoOJbURZRw" width="3014" height="905"/>
-                </children>
-                <children xmi:id="_G7TL9-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7TL-OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7TL-efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7TL-ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TL--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TL_OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TL_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TL_ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TL_-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TMAOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7TMAefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7TL8-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TL9OfXEduqHoOJbURZRw" x="8805" y="5240"/>
-              </children>
-              <children xmi:id="_G7TMC-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4A970123">
-                <children xmi:id="_G7TMDufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7TMD-fXEduqHoOJbURZRw" width="3386" height="1032"/>
-                </children>
-                <children xmi:id="_G7TMEOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7TMEefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7TMEufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7TME-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMFOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TMFefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMFufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TMF-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMGOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TMGefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7TMGufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7TMDOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TMDefXEduqHoOJbURZRw" x="795" y="2988"/>
-              </children>
-              <children xmi:id="_G7TMJOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_G7TMJ-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7TMKOfXEduqHoOJbURZRw" width="3589" height="990"/>
-                </children>
-                <children xmi:id="_G7TMKefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7TMKufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7TMK-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7TMLOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMLefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TMLufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TML-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TMMOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMMefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7TMMufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7TMM-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7TMJefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TMJufXEduqHoOJbURZRw" x="8568" y="2963"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gli-U-fXEduqHoOJbURZRw" description="This diagram shows the general definition of Process Element.  Process Element is derrived from Method Element define in Core Method Content.  Just like the Content Description for method content Process Element contains a Content Description that can comprose of a number of attributes containing textual descrptions for the Process Element."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G7TMAufXEduqHoOJbURZRw" element="_3ADC7B74022D4283E91F0061" source="_G7KCWufXEduqHoOJbURZRw" target="_G7TL8ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7TMBefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7TMB-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7TMCOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TMBufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7TMA-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7TMBOfXEduqHoOJbURZRw" points="[-50, -457, 0, 1473]$[-50, -1481, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMCefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMCufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7TMG-fXEduqHoOJbURZRw" element="_3ADC7B74022D4200583B01E6" source="_G7TMC-fXEduqHoOJbURZRw" target="_G7TL4ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7TMHufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7TMIOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7TMIefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TMH-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7TMHOfXEduqHoOJbURZRw" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7TMHefXEduqHoOJbURZRw" points="[0, -524, -7823, 2015]$[0, -1439, -7823, 1100]$[6400, -2345, -1422, 194]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMIufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMI-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7TMNOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC6002BD" source="_G7TMC-fXEduqHoOJbURZRw" target="_G7TMJOfXEduqHoOJbURZRw">
-                <children xmi:id="_G7TMN-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7TMOefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7TMOufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TMOOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7TMO-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7TMPefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMPOfXEduqHoOJbURZRw" x="-13" y="262"/>
-                </children>
-                <children xmi:id="_G7TMPufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7TMQOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMP-fXEduqHoOJbURZRw" x="706" y="-289"/>
-                </children>
-                <children xmi:id="_G7TMQefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7TMQ-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMQufXEduqHoOJbURZRw" x="40" y="287"/>
-                </children>
-                <children xmi:id="_G7TMROfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7TMRufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMRefXEduqHoOJbURZRw" x="209" y="-348"/>
-                </children>
-                <children xmi:id="_G7TMR-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7TMSefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMSufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMSOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7TMS-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7TMTefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMTufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMTOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7TMT-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7TMUefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMUufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMUOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G7TMU-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7TMVefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7TMVufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7TMVOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7TMNefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7TMNufXEduqHoOJbURZRw" points="[1693, -25, -6180, 25]$[6079, -25, -1794, 25]"/>
-              </edges>
-              <edges xmi:id="_G7TMV-fXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_G7TMJOfXEduqHoOJbURZRw" target="_G7TL4ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7TMWufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7TMXOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7TMXefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TMW-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7TMWOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7TMWefXEduqHoOJbURZRw" points="[-50, -491, 0, 1998]$[-50, -1972, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMXufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMX-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7TMYOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294ECC1031E" source="_G7TL8ufXEduqHoOJbURZRw" target="_G7TMJOfXEduqHoOJbURZRw">
-                <children xmi:id="_G7TMY-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7TMZefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7TMZufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7TMZOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7TMYefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7TMYufXEduqHoOJbURZRw" points="[8, -448, -42, 1786]$[8, -1752, -42, 482]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMZ-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7TMaOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D42375EA10285" type="Class" name="SelectedTaskSteps">
-              <children xmi:id="_G7c84OfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE53510013">
-                <children xmi:id="_G7c84-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7c85OfXEduqHoOJbURZRw" width="3979" height="1049"/>
-                </children>
-                <children xmi:id="_G7c85efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7c85ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7c85-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7c86OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c86efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c86ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c86-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c87OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c87efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c87ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7c87-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7c84efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7c84ufXEduqHoOJbURZRw" x="7608" y="5389"/>
-              </children>
-              <children xmi:id="_G7c88OfXEduqHoOJbURZRw" element="_3ADC7B74022D42797F740392">
-                <children xmi:id="_G7c88-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7c89OfXEduqHoOJbURZRw" width="3979" height="1032"/>
-                </children>
-                <children xmi:id="_G7c89efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7c89ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7c89-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7c8-OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c8-efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c8-ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c8--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c8_OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c8_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c8_ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7c8_-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7c88efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7c88ufXEduqHoOJbURZRw" x="7509" y="3649"/>
-              </children>
-              <children xmi:id="_G7c9CefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_G7c9DOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7c9DefXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G7c9DufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7c9D-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7c9EOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7c9EefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c9EufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c9E-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c9FOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c9FefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c9FufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c9F-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7c9GOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7c9CufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7c9C-fXEduqHoOJbURZRw" x="2536" y="7608"/>
-              </children>
-              <children xmi:id="_G7c9GefXEduqHoOJbURZRw" element="_3ADC7B74022D42794A660368">
-                <children xmi:id="_G7c9HOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7c9HefXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G7c9HufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7c9H-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7c9IOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7c9IefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c9IufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c9I-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c9JOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c9JefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7c9JufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7c9J-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7c9KOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7c9GufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7c9G-fXEduqHoOJbURZRw" x="13546" y="7560"/>
-              </children>
-              <children xmi:id="_G7mt-ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E026C">
-                <children xmi:id="_G7mt_efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7mt_ufXEduqHoOJbURZRw" width="2878" height="1032"/>
-                </children>
-                <children xmi:id="_G7mt_-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7muAOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7muAefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7muAufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muA-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muBOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muBefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muBufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muB-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muCOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7muCefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7mt--fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7mt_OfXEduqHoOJbURZRw" x="1405" y="3953"/>
-              </children>
-              <children xmi:id="_G7muE-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G7muFufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7muF-fXEduqHoOJbURZRw" width="2726" height="1032"/>
-                </children>
-                <children xmi:id="_G7muGOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7muGefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7muGufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7muG-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muHOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muHefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muHufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muH-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muIOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muIefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7muIufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7muFOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7muFefXEduqHoOJbURZRw" x="20288" y="1268"/>
-              </children>
-              <children xmi:id="_G7muI-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E4CF301AE">
-                <children xmi:id="_G7muJufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7muJ-fXEduqHoOJbURZRw" width="2794" height="1049"/>
-                </children>
-                <children xmi:id="_G7muKOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7muKefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7muKufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7muK-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muLOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muLefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muLufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muL-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muMOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muMefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7muMufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7muJOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7muJefXEduqHoOJbURZRw" x="13944" y="1354"/>
-              </children>
-              <children xmi:id="_G7muX-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4A970123">
-                <children xmi:id="_G7muYufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7muY-fXEduqHoOJbURZRw" width="3403" height="1049"/>
-                </children>
-                <children xmi:id="_G7muZOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7muZefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7muZufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7muZ-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muaOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7muaefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muaufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7mua-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7mubOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7mubefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7mubufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7muYOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7muYefXEduqHoOJbURZRw" x="7797" y="1354"/>
-              </children>
-              <children xmi:id="_G7v32OfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_G7v32-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7v33OfXEduqHoOJbURZRw" width="3589" height="990"/>
-                </children>
-                <children xmi:id="_G7v33efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7v33ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7v33-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7v34OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v34efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v34ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v34-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v35OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v35efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v35ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7v35-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7v32efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7v32ufXEduqHoOJbURZRw" x="1100" y="1388"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gli-VefXEduqHoOJbURZRw" description="A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association depicted in the diagram.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to (see Contribution in package Plugin for details)."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G7c9AOfXEduqHoOJbURZRw" element="_3ADC7B74022D4279849E0001" source="_G7c84OfXEduqHoOJbURZRw" target="_G7c88OfXEduqHoOJbURZRw">
-                <children xmi:id="_G7c9A-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7c9BefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7c9BufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7c9BOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7c9AefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7c9AufXEduqHoOJbURZRw" points="[0, -533, 0, 1701]$[0, -1718, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7c9B-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7c9COfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7c9KefXEduqHoOJbURZRw" element="_3ADC7B74022D427962D3003F" source="_G7c9CefXEduqHoOJbURZRw" target="_G7c9GefXEduqHoOJbURZRw">
-                <children xmi:id="_G7c9LOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7c9LufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7c9L-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7c9LefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7c9MOfXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G7mt4OfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7c9MefXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_G7mt4efXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G7mt4-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mt4ufXEduqHoOJbURZRw" x="-446" y="-347"/>
-                </children>
-                <children xmi:id="_G7mt5OfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G7mt5ufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mt5efXEduqHoOJbURZRw" x="813" y="296"/>
-                </children>
-                <children xmi:id="_G7mt5-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G7mt6efXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mt6OfXEduqHoOJbURZRw" x="423" y="-347"/>
-                </children>
-                <children xmi:id="_G7mt6ufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G7mt7OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7mt7efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mt6-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7mt7ufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G7mt8OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7mt8efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mt7-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7mt8ufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G7mt9OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7mt9efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mt8-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G7mt9ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G7mt-OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7mt-efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mt9-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7c9KufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7c9K-fXEduqHoOJbURZRw" points="[1845, 0, -10701, 0]$[10693, 0, -1854, 0]"/>
-              </edges>
-              <edges xmi:id="_G7muCufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92032F" source="_G7c9CefXEduqHoOJbURZRw" target="_G7mt-ufXEduqHoOJbURZRw">
-                <children xmi:id="_G7muDefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7muD-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7muEOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7muDufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7muC-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7muDOfXEduqHoOJbURZRw" points="[0, -524, 0, 3081]$[0, -3090, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7muEefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7muEufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7muM-fXEduqHoOJbURZRw" element="_3ADC7B74022D4279830E0150" source="_G7c9GefXEduqHoOJbURZRw" target="_G7muI-fXEduqHoOJbURZRw">
-                <children xmi:id="_G7muNufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7muOOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7muOefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7muN-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7muNOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7muNefXEduqHoOJbURZRw" points="[-50, -516, 0, 5681]$[-50, -5672, 0, 524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7muOufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7muO-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7muPOfXEduqHoOJbURZRw" element="_3ADC7B74022D42375E040390" source="_G7muE-fXEduqHoOJbURZRw" target="_G7muI-fXEduqHoOJbURZRw">
-                <children xmi:id="_G7muP-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7muQefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7muQufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7muQOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7muQ-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42375E050175">
-                  <children xmi:id="_G7muRefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muROfXEduqHoOJbURZRw" x="163" y="94"/>
-                </children>
-                <children xmi:id="_G7muRufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D42375E050175">
-                  <children xmi:id="_G7muSOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muR-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G7muSefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42375E050173">
-                  <children xmi:id="_G7muS-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muSufXEduqHoOJbURZRw" x="-2" y="136"/>
-                </children>
-                <children xmi:id="_G7muTOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42375E050173">
-                  <children xmi:id="_G7muTufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muTefXEduqHoOJbURZRw" x="-732" y="-302"/>
-                </children>
-                <children xmi:id="_G7muT-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42375E050175">
-                  <children xmi:id="_G7muUefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muUufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muUOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7muU-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42375E050173">
-                  <children xmi:id="_G7muVefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muVufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muVOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7muV-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42375E050175">
-                  <children xmi:id="_G7muWefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muWufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muWOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G7muW-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42375E050173">
-                  <children xmi:id="_G7muXefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7muXufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muXOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7muPefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7muPufXEduqHoOJbURZRw" points="[-1363, -76, 4885, 25]$[-4851, -76, 1397, 25]"/>
-              </edges>
-              <edges xmi:id="_G7mueOfXEduqHoOJbURZRw" element="_3ADC7B74022D421E4DAC01A0" source="_G7muX-fXEduqHoOJbURZRw" target="_G7muI-fXEduqHoOJbURZRw">
-                <children xmi:id="_G7mue-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7mufefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7mufufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7mufOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7muf-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_G7mugefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mugOfXEduqHoOJbURZRw" x="479" y="-177"/>
-                </children>
-                <children xmi:id="_G7mugufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_G7muhOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mug-fXEduqHoOJbURZRw" x="-131" y="356"/>
-                </children>
-                <children xmi:id="_G7muhefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_G7muh-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muhufXEduqHoOJbURZRw" x="-79" y="-186"/>
-                </children>
-                <children xmi:id="_G7muiOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_G7muiufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7muiefXEduqHoOJbURZRw" x="-621" y="246"/>
-                </children>
-                <children xmi:id="_G7mui-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_G7mujefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7mujufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mujOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7muj-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_G7mukefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7mukufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7mukOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7v30OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_G7v30ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v30-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v30efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G7v31OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_G7v31ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v31-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v31efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7mueefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7mueufXEduqHoOJbURZRw" points="[1701, 25, -4140, 25]$[4445, 25, -1397, 25]"/>
-              </edges>
-              <edges xmi:id="_G7v36OfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC4A0306" source="_G7mt-ufXEduqHoOJbURZRw" target="_G7v32OfXEduqHoOJbURZRw">
-                <children xmi:id="_G7v36-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7v37efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7v37ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7v37OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7v36efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7v36ufXEduqHoOJbURZRw" points="[0, -516, -50, 2074]$[0, -2108, -50, 482]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7v37-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7v38OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G7v38efXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC6002BD" source="_G7muX-fXEduqHoOJbURZRw" target="_G7v32OfXEduqHoOJbURZRw">
-                <children xmi:id="_G7v39OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7v39ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7v39-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7v39efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7v3-OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7v3-ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v3-efXEduqHoOJbURZRw" x="152" y="152"/>
-                </children>
-                <children xmi:id="_G7v3--fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7v3_efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v3_OfXEduqHoOJbURZRw" x="787" y="-212"/>
-                </children>
-                <children xmi:id="_G7v3_ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7v4AOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v3_-fXEduqHoOJbURZRw" x="-199" y="240"/>
-                </children>
-                <children xmi:id="_G7v4AefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7v4A-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v4AufXEduqHoOJbURZRw" x="143" y="347"/>
-                </children>
-                <children xmi:id="_G7v4BOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7v4BufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4B-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v4BefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7v4COfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7v4CufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4C-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v4CefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G7v4DOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_G7v4DufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4D-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v4DefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G7v4EOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_G7v4EufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4E-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G7v4EefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7v38ufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7v38-fXEduqHoOJbURZRw" points="[-1710, 0, 4893, 0]$[-4809, 0, 1794, 0]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D42D312F20358" type="Class" name="Descriptor">
-              <children xmi:id="_G7v4FOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G7v4F-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7v4GOfXEduqHoOJbURZRw" width="2065" height="905"/>
-                </children>
-                <children xmi:id="_G7v4GefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7v4GufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7v4G-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7v4HOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4HefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v4HufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4H-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v4IOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4IefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v4IufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7v4I-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7v4FefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7v4FufXEduqHoOJbURZRw" x="9025" y="4885"/>
-              </children>
-              <children xmi:id="_G7v4JOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G7v4J-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7v4KOfXEduqHoOJbURZRw" width="2726" height="905"/>
-                </children>
-                <children xmi:id="_G7v4KefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7v4KufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7v4K-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7v4LOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4LefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v4LufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4L-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v4MOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4MefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G7v4MufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G7v4M-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7v4JefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7v4JufXEduqHoOJbURZRw" x="5397" y="7399"/>
-              </children>
-              <children xmi:id="_G7v4PefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G7v4QOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G7v4QefXEduqHoOJbURZRw" width="4013" height="905"/>
-                </children>
-                <children xmi:id="_G7v4QufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G7v4Q-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G7v4ROfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G7v4RefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G7v4RufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G75o0OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G75o0efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G75o0ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G75o0-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G75o1OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G75o1efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G7v4PufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7v4P-fXEduqHoOJbURZRw" x="12035" y="7347"/>
-              </children>
-              <children xmi:id="_G75o1ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G75o2efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G75o2ufXEduqHoOJbURZRw" width="2675" height="905"/>
-                </children>
-                <children xmi:id="_G75o2-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G75o3OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G75o3efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G75o3ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G75o3-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G75o4OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G75o4efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G75o4ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G75o4-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G75o5OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G75o5efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G75o1-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G75o2OfXEduqHoOJbURZRw" x="8720" y="7374"/>
-              </children>
-              <children xmi:id="_G8CyyefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G8CyzOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8CyzefXEduqHoOJbURZRw" width="3403" height="905"/>
-                </children>
-                <children xmi:id="_G8CyzufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8Cyz-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8Cy0OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8Cy0efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Cy0ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Cy0-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Cy1OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Cy1efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Cy1ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Cy1-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8Cy2OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8CyyufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Cyy-fXEduqHoOJbURZRw" x="8356" y="1481"/>
-              </children>
-              <children xmi:id="_G8Cy4ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G8Cy5efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8Cy5ufXEduqHoOJbURZRw" width="1574" height="905"/>
-                </children>
-                <children xmi:id="_G8Cy5-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8Cy6OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8Cy6efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8Cy6ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Cy6-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Cy7OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Cy7efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Cy7ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Cy7-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Cy8OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8Cy8efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8Cy4-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Cy5OfXEduqHoOJbURZRw" x="6121" y="4580"/>
-              </children>
-              <children xmi:id="_G8Mj0OfXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G8Mj0-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8Mj1OfXEduqHoOJbURZRw" width="4267" height="905"/>
-                </children>
-                <children xmi:id="_G8Mj1efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8Mj1ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8Mj1-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8Mj2OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Mj2efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Mj2ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Mj2-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Mj3OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Mj3efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8Mj3ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8Mj3-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8Mj0efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Mj0ufXEduqHoOJbURZRw" x="1473" y="2446"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gli-V-fXEduqHoOJbURZRw"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G7v4NOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G7v4JOfXEduqHoOJbURZRw" target="_G7v4FOfXEduqHoOJbURZRw">
-                <children xmi:id="_G7v4N-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G7v4OefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G7v4OufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G7v4OOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G7v4NefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G7v4NufXEduqHoOJbURZRw" points="[491, -457, -2302, 2032]$[2260, -2040, -533, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7v4O-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G7v4POfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G75o5ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600160" source="_G75o1ufXEduqHoOJbURZRw" target="_G7v4FOfXEduqHoOJbURZRw">
-                <children xmi:id="_G75o6efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G75o6-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G75o7OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G75o6ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G75o5-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G75o6OfXEduqHoOJbURZRw" points="[0, -457, 0, 2032]$[0, -2040, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G75o7efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G75o7ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8CywOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G7v4PefXEduqHoOJbURZRw" target="_G7v4FOfXEduqHoOJbURZRw">
-                <children xmi:id="_G8Cyw-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8CyxefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8CyxufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8CyxOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8CywefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8CywufXEduqHoOJbURZRw" points="[-626, -457, 2827, 2032]$[-2819, -2040, 635, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Cyx-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8CyyOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8Cy2efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G7v4FOfXEduqHoOJbURZRw" target="_G8CyyefXEduqHoOJbURZRw">
-                <children xmi:id="_G8Cy3OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8Cy3ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8Cy3-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Cy3efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8Cy2ufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8Cy2-fXEduqHoOJbURZRw" points="[0, -457, 0, 2946]$[0, -2954, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Cy4OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Cy4efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8Cy8ufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FFD300EF" source="_G8CyyefXEduqHoOJbURZRw" target="_G8Cy4ufXEduqHoOJbURZRw">
-                <children xmi:id="_G8Cy9efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8Cy9-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8Cy-OfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Cy9ufXEduqHoOJbURZRw" x="-677" y="703"/>
-                </children>
-                <children xmi:id="_G8Cy-efXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8Cy--fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8Cy-ufXEduqHoOJbURZRw" x="-253" y="-169"/>
-                </children>
-                <children xmi:id="_G8Cy_OfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8Cy_ufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8Cy_efXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G8Cy_-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8CzAefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8CzAOfXEduqHoOJbURZRw" x="316" y="306"/>
-                </children>
-                <children xmi:id="_G8CzAufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8CzBOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8CzA-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G8MjwOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8MjwufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Mjw-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8MjwefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8MjxOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8MjxufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Mjx-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8MjxefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8MjyOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8MjyufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Mjy-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8MjyefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G8MjzOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8MjzufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8Mjz-fXEduqHoOJbURZRw" collapsed="true"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8MjzefXEduqHoOJbURZRw" x="477" y="-1243"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8Cy8-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8Cy9OfXEduqHoOJbURZRw" points="[-1164, 317, 1984, -2778]$[-1164, 3175, 1984, 80]$[-2222, 3175, 926, 80]"/>
-              </edges>
-              <edges xmi:id="_G8Mj4OfXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G8Cy4ufXEduqHoOJbURZRw" target="_G8Mj0OfXEduqHoOJbURZRw">
-                <children xmi:id="_G8Mj4-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8Mj5efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8Mj5ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Mj5OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8Mj4efXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8Mj4ufXEduqHoOJbURZRw" points="[-702, -457, 2599, 1676]$[-2616, -1684, 685, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Mj5-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Mj6OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8Mj6efXEduqHoOJbURZRw" element="_3ADC7B74022D427A923B0002" source="_G7v4JOfXEduqHoOJbURZRw" target="_G8Mj0OfXEduqHoOJbURZRw">
-                <children xmi:id="_G8Mj7OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8Mj7ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8Mj7-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Mj7efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8Mj6ufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8Mj6-fXEduqHoOJbURZRw" points="[-347, -457, 3310, 4470]$[-3327, -4478, 330, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Mj8OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Mj8efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8Mj8ufXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G8Mj0OfXEduqHoOJbURZRw" target="_G8CyyefXEduqHoOJbURZRw">
-                <children xmi:id="_G8Mj9efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8Mj9-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8Mj-OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Mj9ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8Mj8-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8Mj9OfXEduqHoOJbURZRw" points="[2133, -330, -4318, 635]$[4741, -728, -1710, 237]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Mj-efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8Mj-ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GhhZ9OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD854600D8">
-            <body>01</body>
-          </ownedComment>
-          <packageMerge xmi:id="_DxLGwOxMEduONrMRgmz48A" mergedPackage="_3ADC7B74022D41DE478E000D"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5D03D3" name="Activity">
-            <ownedComment xmi:id="_GhrK-ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5D03D3">
-              <body>An Activity is a Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
-Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D427A92820392" general="_3ADC7B74022D427A92540227"/>
-            <generalization xmi:id="_3ADC7B74022D428CD32901FD" general="_3ADC7B74022D427A82D3017F"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D41E0FFD300F1" name="breakdownElements" visibility="public" type="_3ADC7B74022D40F36C5E00EF" association="_3ADC7B74022D41E0FFD300EF">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlP-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlPufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0031" name="Milestone">
-            <ownedComment xmi:id="_Gh0U5OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0031">
-              <body>A Milestone describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D42B1EC1B0349" general="_3ADC7B74022D427A92540227"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5D03CB" name="Iteration">
-            <ownedComment xmi:id="_Gh0U6OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5D03CB">
-              <body>Iteration is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C5F02A0" general="_3ADC7B74022D40F36C5D03D3"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5D03CA" name="Phase">
-            <ownedComment xmi:id="_Gh-F4-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5D03CA">
-              <body>Phase is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C5F029F" general="_3ADC7B74022D40F36C5D03D3"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0063" name="TeamProfile">
-            <ownedComment xmi:id="_Gh-F5-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0063">
-              <body>A Team Profile is a Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
-Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
-Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C60003E" general="_3ADC7B74022D40F36C5E00EF"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C600042" name="teamRoles" visibility="public" type="_3ADC7B74022D40F36C5E008B" association="_3ADC7B74022D40F36C60003F">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gj5_kufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gj5_kefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C600053" name="superTeam" visibility="public" type="_3ADC7B74022D40F36C5E0063" association="_3ADC7B74022D40F36C600052">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkDwk-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkDwkufXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C600055" name="subTeam" visibility="public" type="_3ADC7B74022D40F36C5E0063" association="_3ADC7B74022D40F36C600052">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkDwlufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkDwlefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Enumeration" xmi:id="_3ADC7B74022D410800570276" name="WorkOrderType">
-            <ownedComment xmi:id="_GiH24-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D410800570276">
-              <body>Work Order represents a relationship between two Breakdown Element in which one Breakdown Element (referred to as (B) below) depends on the start or finish of another Breakdown Element (referred to as (A) below) in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.</body>
-            </ownedComment>
-            <ownedLiteral xmi:id="_3ADC7B74022D410819ED01ED" name="finishToStart">
-              <ownedComment xmi:id="_GiH25ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D410819ED01ED">
-                <body>Breakdown Element (B) cannot start until Breakdown Element (A) finishes. For example, if you have two Breakdown Elements, &quot;Construct fence&quot; and &quot;Paint fence,&quot; &quot;Paint fence&quot; can't start until &quot;Construct fence&quot; finishes. This is the most common type of dependency and the default for a new Work Order instance.
-</body>
-              </ownedComment>
-            </ownedLiteral>
-            <ownedLiteral xmi:id="_3ADC7B74022D41081C7203C7" name="finishToFinish">
-              <ownedComment xmi:id="_GiRA0efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41081C7203C7">
-                <body>Breakdown Element (B) cannot finish until Breakdown Element (A) finishes. For example, if you have two Breakdown Elements, &quot;Add wiring&quot; and &quot;Inspect electrical,&quot; &quot;Inspect electrical&quot; can't finish until &quot;Add wiring&quot; finishes.
-</body>
-              </ownedComment>
-            </ownedLiteral>
-            <ownedLiteral xmi:id="_3ADC7B74022D41081BE80296" name="startToStart">
-              <ownedComment xmi:id="_GiRA1OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41081BE80296">
-                <body>Breakdown Element (B) cannot start until Breakdown Element (A) starts. For example, if you have two Breakdown Elements, &quot;Pour foundation&quot; and &quot;Level concrete,&quot; &quot;Level concrete&quot; can't begin until &quot;Pour foundation&quot; begins.
-</body>
-              </ownedComment>
-            </ownedLiteral>
-            <ownedLiteral xmi:id="_3ADC7B74022D41081C51013C" name="startToFinish">
-              <ownedComment xmi:id="_GiRA1-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41081C51013C">
-                <body>Breakdown Element (B) cannot finish until Breakdown Element (A) starts. This dependency type can be used for just-in-time scheduling up to a milestone or the project finish date to minimize the risk of a Breakdown Element finishing late if its dependent Breakdown Elements slip. If a related Breakdown Element needs to finish before the milestone or project finish date, but it doesn't matter exactly when and you don't want a late finish to affect the just-in-time Breakdown Element, you can create an SF dependency between the Breakdown Element you want scheduled just in time (the predecessor) and its related Breakdown Element (the successor). Then if you update progress on the successor Breakdown Element, it won't affect the scheduled dates of the predecessor Breakdown Element.</body>
-              </ownedComment>
-            </ownedLiteral>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D410818790288" name="WorkOrder">
-            <ownedComment xmi:id="_Giax0ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D410818790288">
-              <body>Work Order is a Method Element that represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
-(Note, Work Order is not modeled as an Association Class to provide a straightforward mapping  to XMI and EMF.)
-The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4283ED6D0088" general="_3ADC7B74022D4283E8A10341"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D410818EE009F" name="linkType" visibility="public" type="_3ADC7B74022D410800570276">
-              <ownedComment xmi:id="_Giax1ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D410818EE009F">
-                <body>This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_Giax2OfXEduqHoOJbURZRw">
-                <body>finishToStart</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4280ED3800A1" name="pred" visibility="public" type="_3ADC7B74022D427A92540227" association="_3ADC7B74022D4280ED3800A0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gk9Ic-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gk9IcufXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4119A4E602C1" name="PlanningData">
-            <ownedComment xmi:id="_Giax2ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A4E602C1">
-              <body>Planning Data is a Method Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
-Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
-(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4283EEF900E2" general="_3ADC7B74022D4283E8A10341"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D4119A58D00D9" name="startDate" visibility="public" type="_3ADC7B74022D40F4498D0185">
-              <ownedComment xmi:id="_Giki0-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A58D00D9">
-                <body>The default start date for a planed Task.</body>
-              </ownedComment>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4119A59A0129" name="finishDate" visibility="public" type="_3ADC7B74022D40F4498D0185">
-              <ownedComment xmi:id="_Giki1ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A59A0129">
-                <body>The default finish date for a planed Task.</body>
-              </ownedComment>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4119A75C03DB" name="rank" visibility="public" type="_3ADC7B74022D3CA010A4007B">
-              <ownedComment xmi:id="_Giki2efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A75C03DB">
-                <body>The default rank for a planed Task.</body>
-              </ownedComment>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E00EF" name="BreakdownElement" isAbstract="true">
-            <ownedComment xmi:id="_GitswufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E00EF">
-              <body>Breakdown Element is an abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41EC39800324" general="_3ADC7B74022D41DDE6580157"/>
-            <generalization xmi:id="_3ADC7B74022D4283E91F0061" general="_3ADC7B74022D4283E8A10341"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03B6" name="prefix" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gitsx-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03B6">
-                <body>Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. &quot;SRA.Establish Requirements&quot; with SRA indicating that this Activity belongs to the &quot;Software Requirements Analysis&quot; module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, &quot;Customer.Architect&quot; would define a &quot;Customer&quot; prefix for the Role Descriptor &quot;Architect&quot; expressing that this is an architect on the customer side and not the development team side.
-</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_qWe90eyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_qWe90OyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_rHEGMOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03CA" name="isPlanned" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <ownedComment xmi:id="_Gi3dwufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03CA">
-                <body>A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-
-
-</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_Gi3dxOfXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>true</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03D4" name="hasMultipleOccurrences" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <ownedComment xmi:id="_Gi3dx-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03D4">
-                <body>Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as &quot;Detail Use Case&quot; would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.
-</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_Gi3dyefXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>false</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41006A6B01FB" name="isOptional" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <ownedComment xmi:id="_Gi3dy-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41006A6B01FB">
-                <body>The isOptional attribute indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_Gi3dzefXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>false</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C6002B6" name="presentedAfter" visibility="public" type="_3ADC7B74022D40F36C5E00EF" association="_3ADC7B74022D40F36C6002B5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkDwnOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkDwm-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D421E8F0E0234" name="presentedBefore" visibility="public" type="_3ADC7B74022D40F36C5E00EF" association="_3ADC7B74022D421E8F0C0281">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkzXg-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkzXgufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4119A4F90069" name="planningData" visibility="public" type="_3ADC7B74022D4119A4E602C1" aggregation="composite" association="_3ADC7B74022D4119A4F8020A">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmJbQ-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmJbQufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41E0FFD300F0" name="superActivities" visibility="public" type="_3ADC7B74022D40F36C5D03D3" association="_3ADC7B74022D41E0FFD300EF">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlPOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlO-fXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E00E6" name="Descriptor" isAbstract="true">
-            <ownedComment xmi:id="_GjAnsefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E00E6">
-              <body>A Descriptor is an abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
-Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. 
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C60028F" general="_3ADC7B74022D40F36C5E00EF"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D428142BB03B5" name="isSynchronizedWithSource" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GjAntefXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>true</body>
-              </defaultValue>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E008B" name="RoleDescriptor">
-            <ownedComment xmi:id="_GjAnt-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E008B">
-              <body>A Role Descriptor represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C600160" general="_3ADC7B74022D40F36C5E00E6"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C60016D" name="role" visibility="public" type="_3ADC7B74022D40F36C5E0296" association="_3ADC7B74022D40F36C60016A">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkM6j-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkM6jufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C60019D" name="modifies" visibility="public" type="_3ADC7B74022D40F36C5E0045" isDerived="true" association="_3ADC7B74022D40F36C60019C">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkgcjOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gkgci-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C60017F" name="responsibleFor" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C60017E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkzXc-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkzXcufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0009" name="TaskDescriptor">
-            <ownedComment xmi:id="_GjAnu-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0009">
-              <body>A Task Descriptor is a Descriptor and Work Breakdown Element that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
-A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
-
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C5F0303" general="_3ADC7B74022D40F36C5E00E6"/>
-            <generalization xmi:id="_3ADC7B74022D427A923B0002" general="_3ADC7B74022D427A92540227"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0310" name="task" visibility="public" type="_3ADC7B74022D40F36C5E029E" association="_3ADC7B74022D40F36C5F030D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkDwqOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkDwp-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0322" name="additionallyPerformedBy" visibility="public" type="_3ADC7B74022D40F36C5E008B" association="_3ADC7B74022D40F36C5F0321">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkM6lefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkM6lOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0340" name="assistedBy" visibility="public" type="_3ADC7B74022D40F36C5E008B" association="_3ADC7B74022D40F36C5F033F">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkWrg-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkWrgufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C60025C" name="externalInput" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C60025B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkWrjOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkWri-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D416D75AB0281" name="mandatoryInput" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D416D75AA004B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gkgcg-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkgcgufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C60022C" name="optionalInput" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C600229">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkgcmOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gkgcl-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C600248" name="output" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C60023D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkpmdufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkpmdefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0354" name="performedPrimarilyBy" visibility="public" type="_3ADC7B74022D40F36C5E008B" association="_3ADC7B74022D40F36C5F0353">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkpmhefXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkpmhOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42375E050173" name="selectedSteps" visibility="public" type="_3ADC7B74022D421E4CF301AE" association="_3ADC7B74022D42375E040390">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GoOe4-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GoOe4ufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0045" name="WorkProductDescriptor">
-            <ownedComment xmi:id="_GjAnwOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0045">
-              <body>A Work Product Descriptor represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C5F03D6" general="_3ADC7B74022D40F36C5E00E6"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D412A5F8602F6" name="activityEntryState" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GjKYs-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D412A5F8602F6">
-                <body>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Kc1ZwOyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_KcrowOyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_KVYG4OyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D413EC0180340" name="activityExitState" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GjKYtufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D413EC0180340">
-                <body>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_YtsXoeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_YtsXoOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_YhB0oOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F03DA" name="workProduct" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D40F36C5F03D7">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkM6hufXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkM6hefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C600021" name="impactedBy" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C600020">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkWrlefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkWrlOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C600023" name="impacts" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C600020">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkWrmOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkWrl-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C60000F" name="deliverableParts" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C60000C">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gkpmf-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkpmfufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41F06B6500E6" name="CompositeRole">
-            <ownedComment xmi:id="_GjKYuefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41F06B6500E6">
-              <body>A Composite Role is a special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
-A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41F94AB90015" general="_3ADC7B74022D40F36C5E008B"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D41F06BBE00DF" name="aggregatedRoles" visibility="public" type="_3ADC7B74022D40F36C5E0296" association="_3ADC7B74022D41F06BBC030D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkzXeufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkzXeefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D427A92540227" name="WorkBreakdownElement" isAbstract="true">
-            <ownedComment xmi:id="_GjUJs-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A92540227">
-              <body>A Work Breakdown Element is a special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D428CD323019A" general="_3ADC7B74022D40F36C5E00EF"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03C0" name="isRepeatable" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <ownedComment xmi:id="_GjdTo-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03C0">
-                <body>This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GjdTpefXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>false</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03D5" name="isOngoing" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <ownedComment xmi:id="_GjdTp-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03D5">
-                <body>If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GjdTqefXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>false</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03DE" name="isEventDriven" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <ownedComment xmi:id="_GjdTq-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03DE">
-                <body>The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-
-
-</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GjdTrefXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>false</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4280ED4000CF" name="linkToPredecessor" visibility="public" type="_3ADC7B74022D410818790288" association="_3ADC7B74022D4280ED4000CD">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gk9If-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gk9IfufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4283E8A10341" name="ProcessElement" isAbstract="true">
-            <ownedComment xmi:id="_GjdTr-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4283E8A10341">
-              <body>Process Element is a Describable Element that represents an abstract generalization for all elements defined in the Process package.
-Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. 
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4294ECC1031E" general="_3ADC7B74022D4294EB9000FC"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60003F" memberEnd="_3ADC7B74022D40F36C600040 _3ADC7B74022D40F36C600042">
-            <ownedComment xmi:id="_GjnEo-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60003F">
-              <body>This aggregation association specifies the roles of team members with Role Descriptors.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C600040" name="_teamProfile" visibility="public" type="_3ADC7B74022D40F36C5E0063" isUnique="false" association="_3ADC7B74022D40F36C60003F">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GjnEp-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GjnEpufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C600052" memberEnd="_3ADC7B74022D40F36C600053 _3ADC7B74022D40F36C600055">
-            <ownedComment xmi:id="_Gj5_lOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C600052">
-              <body>This association relates a Sub-Team to its Super-Team, i.e. the Team that it is part of.</body>
-            </ownedComment>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C6002B5" memberEnd="_3ADC7B74022D40F36C6002B6 _3ADC7B74022D40F36C6002B8">
-            <ownedComment xmi:id="_GkDwmOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C6002B5">
-              <body>Breakdown structures are nested structures (see superActivities association) presented normally as indented lists.  Within this nesting children on the same level are not specifically ordered.  However, a user of these data structures would expect to order elements within a list.  This association is used to store the presentation sequence amongst Breakdown Elements.  The association presentedAfter is redundant to the association presentedBefore.  This redundancy is required to support Process Contributions (see plugins).</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C6002B8" name="_breakdownElement" visibility="public" type="_3ADC7B74022D40F36C5E00EF" isUnique="false" association="_3ADC7B74022D40F36C6002B5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkDwn-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkDwnufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F030D" memberEnd="_3ADC7B74022D40F36C5F030E _3ADC7B74022D40F36C5F0310">
-            <ownedComment xmi:id="_GkDwoefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F030D">
-              <body>This association represents the reference from the descriptor to the core content element it refers to.  Every Task Descriptor can reference only on Task.  However, a Task can be represented by many Task Descriptors.  In the UMA Profile this association is instantiated by a dependency relationship with a trace stereotype.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F030E" name="taskDescriptor" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D40F36C5F030D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkDwpefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkDwpOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F03D7" memberEnd="_3ADC7B74022D40F36C5F03D8 _3ADC7B74022D40F36C5F03DA">
-            <ownedComment xmi:id="_GkDwqufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F03D7">
-              <body>This association represents the reference from the descriptor to the core content element it refers to.  Every Work Product Descriptor can reference only one Work Product.  However, a Work Product can be represented by many Work Product Descriptors.  In the UMA Profile this association is instantiated by a dependency relationship with a trace stereotype.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F03D8" name="workProductDescriptor" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C5F03D7">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkM6g-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkM6gufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60016A" memberEnd="_3ADC7B74022D40F36C60016B _3ADC7B74022D40F36C60016D">
-            <ownedComment xmi:id="_GkM6iOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60016A">
-              <body>This association represents the reference from the descriptor to the core content element it refers to.  Every Role Descriptor can reference only one Role.  However, a Role can be represented by many Role Descriptors.  In the UMA Profile this association is instantiated by a dependency relationship with a trace stereotype.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C60016B" name="roleDescriptor" visibility="public" type="_3ADC7B74022D40F36C5E008B" association="_3ADC7B74022D40F36C60016A">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkM6jOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkM6i-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F0321" name="AdditionallyPerforms" memberEnd="_3ADC7B74022D40F36C5F0322 _3ADC7B74022D40F36C5F032B">
-            <ownedComment xmi:id="_GkM6kefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0321">
-              <body>This association maps to the respective association in Core Content Elements.  It specifies descriptors for additional roles necessary to complete the referred Task.  Instances of these roles would show up as scheduled resources on a corresponding project plan generated from this structure.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F032B" name="performsAdditionally" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D40F36C5F0321">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkM6mOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkM6l-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F033F" name="Assists" memberEnd="_3ADC7B74022D40F36C5F0340 _3ADC7B74022D40F36C5F0342">
-            <ownedComment xmi:id="_GkM6mufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F033F">
-              <body>This association is specific to a process, i.e. no defaults have been defined in Core Content Elements.  It specifies descriptors for additional roles that may provide information or assistance helpful, but not mandatory to the completion of the Task.  Instances of these roles would not show up as scheduled resources on the corresponding project plan generated from this structure.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F0342" name="assistsIn" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D40F36C5F033F">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkWrhufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkWrhefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60025B" name="ExternalInput" memberEnd="_3ADC7B74022D40F36C60025C _3ADC7B74022D40F36C60025E">
-            <ownedComment xmi:id="_GkWriOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60025B">
-              <body>This association is specific to a process, i.e. no defaults will be defined in Core Content Elements.  It specifies descriptors for Work Products used as inputs that are not produced by Tasks within the same Process, but by another external process or an unknown source.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C60025E" name="externalInputTo" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D40F36C60025B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkWrj-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkWrjufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C600020" name="ImpactsDependency" memberEnd="_3ADC7B74022D40F36C600021 _3ADC7B74022D40F36C600023">
-            <ownedComment xmi:id="_GkWrkefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C600020">
-              <body>This association is used to semi-formally specify traceability relationships between Work Products within the scope of an Activity.  A link from one Work Product Descriptor to another indicates that one Work Product is required as input to a Task that produces the related Work Product ('impacts' role end).  It would also mean that a change on one Work Product instance may affect a change on the related product.</body>
-            </ownedComment>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D416D75AA004B" name="MandatoryInput" memberEnd="_3ADC7B74022D416D75AB0281 _3ADC7B74022D416D75AB0295">
-            <ownedComment xmi:id="_GkWrmufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D416D75AA004B">
-              <body>This association maps to the respective association in Core Content Elements.  It points to descriptors for Work Products that are mandatory for the Task to be performed.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D416D75AB0295" name="mandatoryInputTo" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D416D75AA004B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkgchufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkgchefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60019C" name="Modifies" memberEnd="_3ADC7B74022D40F36C60019D _3ADC7B74022D40F36C60019F" isDerived="true">
-            <ownedComment xmi:id="_GkgciOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60019C">
-              <body>This derived association maps to the Modifies association defined between Work Products and Tasks in Core Method Content.  The same derivation rule as for the core content elements applies.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C60019F" name="_roleDescriptor" visibility="public" type="_3ADC7B74022D40F36C5E008B" isUnique="false" association="_3ADC7B74022D40F36C60019C">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gkgcj-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkgcjufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C600229" name="OptionalInput" memberEnd="_3ADC7B74022D40F36C60022A _3ADC7B74022D40F36C60022C">
-            <ownedComment xmi:id="_GkgckefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C600229">
-              <body>This association maps to the respective association in Core Content Elements.  It points to descriptors for Work Products that are optional for the Task to be performed.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C60022A" name="OptionalInputTo" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D40F36C600229">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkgclefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkgclOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60023D" name="Output" memberEnd="_3ADC7B74022D40F36C600246 _3ADC7B74022D40F36C600248">
-            <ownedComment xmi:id="_GkgcmufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60023D">
-              <body>This association maps to the respective association in Core Content Elements.  It points to descriptors for Work Products that are outputs for performing the referred Task.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C600246" name="outputFrom" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D40F36C60023D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gkpmc-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkpmcufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60000C" name="PackagedWP" memberEnd="_3ADC7B74022D40F36C60000D _3ADC7B74022D40F36C60000F">
-            <ownedComment xmi:id="_GkpmeOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60000C">
-              <body>If a Work Product Descriptor refers at the 'deliverable' role end to a Deliverable Work Product then this association is used to specify the Deliverable's Work Product parts.  As indicated for Deliverable in the Core Method Content package, this association overrides the 'deliveredWorkProducts' association of the Work Product, which stores the recommended deliverable parts, but can be customized for every Work Product Descriptor. </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C60000D" name="deliverable" visibility="public" type="_3ADC7B74022D40F36C5E0045" association="_3ADC7B74022D40F36C60000C">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkpmfOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gkpme-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F0353" name="PrimaryPerforms" memberEnd="_3ADC7B74022D40F36C5F0354 _3ADC7B74022D40F36C5F0356">
-            <ownedComment xmi:id="_GkpmgefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0353">
-              <body>This association maps to the respective association in Core Content Elements.  It points to a descriptor for the one role responsible for the completion of the task.  An instance of this role would show up as a scheduled resource on a corresponding project plan generated from this structure.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F0356" name="performsAsOwner" visibility="public" type="_3ADC7B74022D40F36C5E0009" association="_3ADC7B74022D40F36C5F0353">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkpmiOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gkpmh-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60017E" name="Responsible" memberEnd="_3ADC7B74022D40F36C60017F _3ADC7B74022D40F36C600188">
-            <ownedComment xmi:id="_GkpmiufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60017E">
-              <body>This association represents responsibility for Work Product instances.  It indicates ownership and for example would define the Role that answers to management questions about the quality work product.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C600188" name="responsibleRole" visibility="public" type="_3ADC7B74022D40F36C5E008B" association="_3ADC7B74022D40F36C60017E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkzXdufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkzXdefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41F06BBC030D" memberEnd="_3ADC7B74022D41F06BBE00DF _3ADC7B74022D41F06BBE00E9">
-            <ownedEnd xmi:id="_3ADC7B74022D41F06BBE00E9" name="_compositeRole" visibility="public" type="_3ADC7B74022D41F06B6500E6" isUnique="false" association="_3ADC7B74022D41F06BBC030D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkzXfefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkzXfOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D421E8F0C0281" memberEnd="_3ADC7B74022D421E8F0E0234 _3ADC7B74022D421E8F0E0266">
-            <ownedComment xmi:id="_GkzXf-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D421E8F0C0281">
-              <body>Breakdown structures are nested structures (see superActivities association) presented normally as indented lists.  Within this nesting children on the same level are not specifically ordered.  However, a user of these data structures would expect to order elements within a list.  This association is used to store the presentation sequence amongst Breakdown Elements.  The association presentedBefore is redundant to the association presentedAfter.  This redundancy is required to support Process Contributions (see plugins).</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D421E8F0E0266" name="_breakdownElement" visibility="public" type="_3ADC7B74022D40F36C5E00EF" isUnique="false" association="_3ADC7B74022D421E8F0C0281">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GkzXhufXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GkzXhefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4280ED3800A0" memberEnd="_3ADC7B74022D4280ED3800A1 _3ADC7B74022D4280ED3800A2">
-            <ownedComment xmi:id="_GkzXiOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4280ED3800A0">
-              <body>The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This association links a Work Breakdown Element to its successor Work Breakdown Element.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4280ED3800A2" name="linkToSuccessor" visibility="public" type="_3ADC7B74022D410818790288" association="_3ADC7B74022D4280ED3800A0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gk9IdufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gk9IdefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4280ED4000CD" memberEnd="_3ADC7B74022D4280ED4000CE _3ADC7B74022D4280ED4000CF">
-            <ownedComment xmi:id="_Gk9IeOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4280ED4000CD">
-              <body>This association links a Work Breakdown Element to its predecessor.  Every Work Breakdown Element can have predecessor information associated to it.  Specific predecessor information is stored in instances of the class Work Order, which defines the kind of predecessor another Work Breakdown Element represents for another.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4280ED4000CE" name="succ" visibility="public" type="_3ADC7B74022D427A92540227" association="_3ADC7B74022D4280ED4000CD">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gk9IfOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gk9Ie-fXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40FD891F02CD" name="ProcessTypes">
-          <eAnnotations xmi:id="_GmlgN-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41E1007C031F">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41E1007C031F" type="Class" name="Process">
-              <children xmi:id="_G8Mj--fXEduqHoOJbURZRw" type="Note" element="_3ADC7B74022D41929E99029C">
-                <children xmi:id="_G8Mj_ufXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_G8Mj_-fXEduqHoOJbURZRw" visible="false" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_G8Mj_OfXEduqHoOJbURZRw" fontName="Arial" fontHeight="8" underline="true" description="Class Diagram: ProcessTypes / ProcessBreakdown" lineColor="4194368"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8Mj_efXEduqHoOJbURZRw" x="1179" y="9626" width="4445" height="1109"/>
-              </children>
-              <children xmi:id="_G8WUwOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FE930077">
-                <children xmi:id="_G8WUw-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8WUxOfXEduqHoOJbURZRw" width="1574" height="905"/>
-                </children>
-                <children xmi:id="_G8WUxefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8WUxufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8WUx-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8WUyOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WUyefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WUyufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WUy-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WUzOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WUzefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WUzufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8WUz-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8WUwefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WUwufXEduqHoOJbURZRw" x="6690" y="1027"/>
-              </children>
-              <children xmi:id="_G8WU0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0077">
-                <children xmi:id="_G8WU0-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8WU1OfXEduqHoOJbURZRw" width="2997" height="905"/>
-                </children>
-                <children xmi:id="_G8WU1efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8WU1ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8WU1-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8WU2OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WU2efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WU2ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WU2-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WU3OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WU3efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WU3ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8WU3-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8WU0efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WU0ufXEduqHoOJbURZRw" x="6420" y="7747"/>
-              </children>
-              <children xmi:id="_G8WU-efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E5">
-                <children xmi:id="_G8WU_OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8WU_efXEduqHoOJbURZRw" width="4521" height="905"/>
-                </children>
-                <children xmi:id="_G8WU_ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8WU_-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8WVAOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8WVAefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVAufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVA-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVBOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVBefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVBufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVB-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8WVCOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8WU-ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WU--fXEduqHoOJbURZRw" x="1289" y="7747"/>
-              </children>
-              <children xmi:id="_G8WVCefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-                <children xmi:id="_G8WVDOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8WVDefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8WVDufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8WVD-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8WVEOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8WVEefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVEufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVE-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVFOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVFefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVFufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVF-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8WVGOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8WVCufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WVC-fXEduqHoOJbURZRw" x="6657" y="2853" width="2116" height="3276"/>
-              </children>
-              <children xmi:id="_G8WVV-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00DC">
-                <children xmi:id="_G8WVWufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8WVW-fXEduqHoOJbURZRw" width="3115" height="905"/>
-                </children>
-                <children xmi:id="_G8WVXOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8WVXefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8WVXufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8WVX-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVYOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVYefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVYufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVY-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVZOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8WVZefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8WVZufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8WVWOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WVWefXEduqHoOJbURZRw" x="12914" y="7797"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GmlgOefXEduqHoOJbURZRw" description="The Process Types package contains the definition of Process.  As depicted in this diagram, it distinguishes different types of processes needed to represent building blocks for other processes (Capability Pattern), complete end-to-end processes (Delivery Process), or processes that have been reduced to the essential information necessary for exporting and planning a project with a third-party planning tool (Process Planning Template).  (Note, the package Method Plug-in will provide another type of Process called Process Contribution.)  The Process Types package also defines process-specific extension to Guidance Types as well Categories.  Whereas the Breakdown package defined the basic pieces for describing breakdown structures, this package takes these pieces and places them into higher organization structures for breakdown: Processes.  A process is defined as a special Activity and therefore constitutes the top-level element of a breakdown.  However, Process contains special properties and extended semantics than Activity."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G8WVGefXEduqHoOJbURZRw" element="_3ADC7B74022D4119A40000E6" source="_G8WU-efXEduqHoOJbURZRw" target="_G8WVCefXEduqHoOJbURZRw">
-                <children xmi:id="_G8WVHOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8WVHufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8WVH-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WVHefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8WVIOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4119A401002B">
-                  <children xmi:id="_G8WVIufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVIefXEduqHoOJbURZRw" x="-623" y="228"/>
-                </children>
-                <children xmi:id="_G8WVI-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4119A401002B">
-                  <children xmi:id="_G8WVJefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVJOfXEduqHoOJbURZRw" x="-487" y="-347"/>
-                </children>
-                <children xmi:id="_G8WVJufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4119A4010017">
-                  <children xmi:id="_G8WVKOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVJ-fXEduqHoOJbURZRw" x="811" y="271"/>
-                </children>
-                <children xmi:id="_G8WVKefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4119A4010017">
-                  <children xmi:id="_G8WVK-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVKufXEduqHoOJbURZRw" x="-1712" y="-254"/>
-                </children>
-                <children xmi:id="_G8WVLOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4119A401002B">
-                  <children xmi:id="_G8WVLufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVL-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVLefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8WVMOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4119A4010017">
-                  <children xmi:id="_G8WVMufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVM-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVMefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8WVNOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4119A401002B">
-                  <children xmi:id="_G8WVNufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVN-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVNefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G8WVOOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4119A4010017">
-                  <children xmi:id="_G8WVOufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8WVO-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8WVOefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8WVGufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8WVG-fXEduqHoOJbURZRw" points="[-872, -457, -5037, 3251]$[-872, -4521, -5037, -812]$[3107, -4521, -1058, -812]"/>
-              </edges>
-              <edges xmi:id="_G8WVPOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028E" source="_G8WU-efXEduqHoOJbURZRw" target="_G8WVCefXEduqHoOJbURZRw">
-                <children xmi:id="_G8WVP-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8WVQefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8WVQufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WVQOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8WVPefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8WVPufXEduqHoOJbURZRw" points="[931, -448, -3234, 3259]$[931, -2650, -3234, 1058]$[3107, -2650, -1058, 1058]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8WVQ-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8WVROfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8WVRefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600110" source="_G8WU0OfXEduqHoOJbURZRw" target="_G8WVCefXEduqHoOJbURZRw">
-                <children xmi:id="_G8WVSOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8WVSufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8WVS-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WVSefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8WVRufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8WVR-fXEduqHoOJbURZRw" points="[-194, -457, 8, 3251]$[-194, -2074, 8, 1634]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8WVTOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8WVTefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8WVTufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FED602AE" source="_G8WVCefXEduqHoOJbURZRw" target="_G8WUwOfXEduqHoOJbURZRw">
-                <children xmi:id="_G8WVUefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8WVU-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8WVVOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WVUufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8WVT-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8WVUOfXEduqHoOJbURZRw" points="[118, -1642, -33, 2421]$[118, -3615, -33, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8WVVefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8WVVufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8WVZ-fXEduqHoOJbURZRw" element="_3ADC7B74022D4119A3F20238" source="_G8WVCefXEduqHoOJbURZRw" target="_G8WVV-fXEduqHoOJbURZRw">
-                <children xmi:id="_G8WVaufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8WVbOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8WVbefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8WVa-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8fesOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4119A3F301EC">
-                  <children xmi:id="_G8fesufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8fesefXEduqHoOJbURZRw" x="-399" y="322"/>
-                </children>
-                <children xmi:id="_G8fes-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4119A3F301EC">
-                  <children xmi:id="_G8fetefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8fetOfXEduqHoOJbURZRw" x="-331" y="364"/>
-                </children>
-                <children xmi:id="_G8fetufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4119A3F301E2">
-                  <children xmi:id="_G8feuOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8fet-fXEduqHoOJbURZRw" x="493" y="-177"/>
-                </children>
-                <children xmi:id="_G8feuefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4119A3F301E2">
-                  <children xmi:id="_G8feu-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8feuufXEduqHoOJbURZRw" x="-625" y="314"/>
-                </children>
-                <children xmi:id="_G8fevOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4119A3F301EC">
-                  <children xmi:id="_G8fevufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8fev-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8fevefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8fewOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4119A3F301E2">
-                  <children xmi:id="_G8fewufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8few-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8fewefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8fexOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4119A3F301EC">
-                  <children xmi:id="_G8fexufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8fex-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8fexefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G8feyOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4119A3F301E2">
-                  <children xmi:id="_G8feyufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8fey-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8feyefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8WVaOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8WVaefXEduqHoOJbURZRw" points="[1058, 1185, -5698, -2573]$[2768, 1185, -3987, -2573]$[2768, 3716, -3987, -42]$[5198, 3716, -1557, -42]"/>
-              </edges>
-              <edges xmi:id="_G8fezOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028D" source="_G8WVV-fXEduqHoOJbURZRw" target="_G8WVCefXEduqHoOJbURZRw">
-                <children xmi:id="_G8fez-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8fe0efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8fe0ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8fe0OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8fezefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8fezufXEduqHoOJbURZRw" points="[-203, -448, 6553, 3310]$[-203, -3242, 6553, 516]$[-5698, -3242, 1058, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8fe0-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8fe1OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41929E99029C" type="Class" name="ProcessBreakdown">
-              <children xmi:id="_G8pPsOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G8pPs-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8pPtOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8pPtefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8pPtufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8pPt-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8pPuOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pPuefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pPuufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pPu-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pPvOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pPvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pPvufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8pPv-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8pPsefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8pPsufXEduqHoOJbURZRw" x="9220" y="11963"/>
-              </children>
-              <children xmi:id="_G8pPwOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0031">
-                <children xmi:id="_G8pPw-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8pPxOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8pPxefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8pPxufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8pPx-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8pPyOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pPyefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pPyufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pPy-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pPzOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pPzefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pPzufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8pPz-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8pPwefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8pPwufXEduqHoOJbURZRw" x="16459" y="4969"/>
-              </children>
-              <children xmi:id="_G8pP0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-                <children xmi:id="_G8pP0-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8pP1OfXEduqHoOJbURZRw" width="1676" height="931"/>
-                </children>
-                <children xmi:id="_G8pP1efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8pP1ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8pP1-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8pP2OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pP2efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pP2ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pP2-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pP3OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pP3efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pP3ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8pP3-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8pP0efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8pP0ufXEduqHoOJbURZRw" x="13131" y="601"/>
-              </children>
-              <children xmi:id="_G8pP4OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G8pP4-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8pP5OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8pP5efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8pP5ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8pP5-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8pP6OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pP6efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pP6ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pP6-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pP7OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pP7efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pP7ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8pP7-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8pP4efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8pP4ufXEduqHoOJbURZRw" x="12344" y="8822"/>
-              </children>
-              <children xmi:id="_G8pP-efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G8pP_OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8pP_efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8pP_ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8pP_-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8pQAOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8pQAefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pQAufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pQA-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pQBOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pQBefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pQBufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8pQB-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8pQCOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8pP-ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8pP--fXEduqHoOJbURZRw" x="12903" y="5071"/>
-              </children>
-              <children xmi:id="_G8zAtOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FE930077">
-                <children xmi:id="_G8zAt-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8zAuOfXEduqHoOJbURZRw" width="1625" height="897"/>
-                </children>
-                <children xmi:id="_G8zAuefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8zAuufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8zAu-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8zAvOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zAvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zAvufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zAv-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zAwOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zAwefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zAwufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8zAw-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8zAtefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zAtufXEduqHoOJbURZRw" x="12389" y="2136"/>
-              </children>
-              <children xmi:id="_G8zA1ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G8zA2efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8zA2ufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8zA2-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8zA3OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8zA3efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8zA3ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zA3-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zA4OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zA4efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zA4ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zA4-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zA5OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8zA5efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8zA1-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zA2OfXEduqHoOJbURZRw" x="8652" y="15231"/>
-              </children>
-              <children xmi:id="_G8zA7-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G8zA8ufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8zA8-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8zA9OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8zA9efXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8zA9ufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8zA9-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zA-OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zA-efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zA-ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zA--fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zA_OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zA_efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8zA_ufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8zA8OfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zA8efXEduqHoOJbURZRw" x="3564" y="15214" width="4631" height="1176"/>
-              </children>
-              <children xmi:id="_G8zBIufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E008B">
-                <children xmi:id="_G8zBJefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8zBJufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8zBJ-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8zBKOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8zBKefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8zBKufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBK-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zBLOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBLefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zBLufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBL-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zBMOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8zBMefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8zBI-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zBJOfXEduqHoOJbURZRw" x="12488" y="15129"/>
-              </children>
-              <children xmi:id="_G8zBMufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0063">
-                <children xmi:id="_G8zBNefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G8zBNufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G8zBN-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G8zBOOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G8zBOefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G8zBOufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBO-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zBPOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBPefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zBPufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBP-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G8zBQOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G8zBQefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G8zBM-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zBNOfXEduqHoOJbURZRw" x="16354" y="11996" width="2709" height="2235"/>
-              </children>
-              <children xmi:id="_G88K6ufXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G88K7efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G88K7ufXEduqHoOJbURZRw" width="4250" height="1049"/>
-                </children>
-                <children xmi:id="_G88K7-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G88K8OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G88K8efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G88K8ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88K8-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88K9OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88K9efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88K9ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88K9-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88K-OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G88K-efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G88K6-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88K7OfXEduqHoOJbURZRw" x="11946" y="6841"/>
-              </children>
-              <children xmi:id="_G88LDOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CB">
-                <children xmi:id="_G88LD-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G88LEOfXEduqHoOJbURZRw" width="2353" height="1049"/>
-                </children>
-                <children xmi:id="_G88LEefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G88LEufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G88LE-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G88LFOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88LFefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88LFufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88LF-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88LGOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88LGefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88LGufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G88LG-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G88LDefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88LDufXEduqHoOJbURZRw" x="9795" y="2929"/>
-              </children>
-              <children xmi:id="_G88LJefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CA">
-                <children xmi:id="_G88LKOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G88LKefXEduqHoOJbURZRw" width="2353" height="1049"/>
-                </children>
-                <children xmi:id="_G88LKufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G88LK-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G88LLOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G88LLefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88LLufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88LL-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88LMOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88LMefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88LMufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G88LM-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G88LNOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G88LJufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88LJ-fXEduqHoOJbURZRw" x="15891" y="2827"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GmvRIefXEduqHoOJbURZRw" description="This diagram shows the main structure used to represent a process.  A process is represented by a breakdown of Activities, which has "/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G8pP8OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G8pPsOfXEduqHoOJbURZRw" target="_G8pP4OfXEduqHoOJbURZRw">
-                <children xmi:id="_G8pP8-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8pP9efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8pP9ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8pP9OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8pP8efXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8pP8ufXEduqHoOJbURZRw" points="[609, -541, -3048, 2607]$[3022, -2624, -635, 524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8pP9-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8pP-OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8pQCefXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FFD300EF" source="_G8pP4OfXEduqHoOJbURZRw" target="_G8pP-efXEduqHoOJbURZRw">
-                <children xmi:id="_G8pQDOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8pQDufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8pQD-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8pQDefXEduqHoOJbURZRw" x="64" y="668"/>
-                </children>
-                <children xmi:id="_G8pQEOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8pQEufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8pQEefXEduqHoOJbURZRw" x="-981" y="262"/>
-                </children>
-                <children xmi:id="_G8pQE-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8pQFefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8pQFOfXEduqHoOJbURZRw" x="362" y="-319"/>
-                </children>
-                <children xmi:id="_G8pQFufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8pQGOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8pQF-fXEduqHoOJbURZRw" x="1185" y="229"/>
-                </children>
-                <children xmi:id="_G8pQGefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8pQG-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8pQGufXEduqHoOJbURZRw" x="-464" y="-263"/>
-                </children>
-                <children xmi:id="_G8pQHOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8pQHufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pQH-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8pQHefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8pQIOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8pQIufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pQI-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8pQIefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8pQJOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0FFD300F1">
-                  <children xmi:id="_G8pQJufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8pQJ-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8pQJefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G8zAsOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0FFD300F0">
-                  <children xmi:id="_G8zAsufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zAs-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zAsefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8pQCufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8pQC-fXEduqHoOJbURZRw" points="[-1879, -238, -1508, 3519]$[-4445, -238, -4074, 3519]$[-4445, -3652, -4074, 105]$[-1323, -3652, -952, 105]"/>
-              </edges>
-              <edges xmi:id="_G8zAxOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FED602AE" source="_G8pP0OfXEduqHoOJbURZRw" target="_G8zAtOfXEduqHoOJbURZRw">
-                <children xmi:id="_G8zAx-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8zAyefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8zAyufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zAyOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8zAxefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8zAxufXEduqHoOJbURZRw" points="[0, 465, 0, -1820]$[0, 1828, 0, -457]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8zAy-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8zAzOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8zA5ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G8zA1ufXEduqHoOJbURZRw" target="_G8pPsOfXEduqHoOJbURZRw">
-                <children xmi:id="_G8zA6efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8zA6-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8zA7OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zA6ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8zA5-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8zA6OfXEduqHoOJbURZRw" points="[296, -524, -8, 2726]$[296, -2717, -8, 533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8zA7efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G8zA7ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G8zA_-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60000C" source="_G8zA7-fXEduqHoOJbURZRw" target="_G8zA7-fXEduqHoOJbURZRw">
-                <children xmi:id="_G8zBAufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8zBBOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8zBBefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zBA-fXEduqHoOJbURZRw" x="-876" y="393"/>
-                </children>
-                <children xmi:id="_G8zBBufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G8zBCOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBB-fXEduqHoOJbURZRw" x="-122" y="636"/>
-                </children>
-                <children xmi:id="_G8zBCefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G8zBC-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBCufXEduqHoOJbURZRw" x="462" y="-371"/>
-                </children>
-                <children xmi:id="_G8zBDOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G8zBDufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBDefXEduqHoOJbURZRw" x="-867" y="171"/>
-                </children>
-                <children xmi:id="_G8zBD-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G8zBEefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBEOfXEduqHoOJbURZRw" x="-802" y="-1111"/>
-                </children>
-                <children xmi:id="_G8zBEufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G8zBFOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBFefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBE-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8zBFufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G8zBGOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBGefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBF-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8zBGufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60000F">
-                  <children xmi:id="_G8zBHOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBHefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBG-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G8zBHufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60000D">
-                  <children xmi:id="_G8zBIOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBIefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBH-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8zBAOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8zBAefXEduqHoOJbURZRw" points="[177, 584, 177, 584]$[177, 2446, 177, 2446]$[-3462, 2446, -3462, 2446]$[-3462, 397, -3462, 397]$[-1998, 397, -1998, 397]"/>
-              </edges>
-              <edges xmi:id="_G8zBQufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600052" source="_G8zBMufXEduqHoOJbURZRw" target="_G8zBMufXEduqHoOJbURZRw">
-                <children xmi:id="_G8zBRefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G8zBR-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G8zBSOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G8zBRufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G8zBSefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G8zBS-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBSufXEduqHoOJbURZRw" x="627" y="2"/>
-                </children>
-                <children xmi:id="_G8zBTOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G8zBTufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBTefXEduqHoOJbURZRw" x="-547" y="260"/>
-                </children>
-                <children xmi:id="_G8zBT-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G8zBUefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBUOfXEduqHoOJbURZRw" x="-807" y="-290"/>
-                </children>
-                <children xmi:id="_G8zBUufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G8zBVOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBU-fXEduqHoOJbURZRw" x="-151" y="247"/>
-                </children>
-                <children xmi:id="_G8zBVefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G8zBV-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G8zBWOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G8zBVufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G88KoOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G88KoufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88Ko-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KoefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G88KpOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600055">
-                  <children xmi:id="_G88KpufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88Kp-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KpefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G88KqOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600053">
-                  <children xmi:id="_G88KqufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88Kq-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KqefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G8zBQ-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G8zBROfXEduqHoOJbURZRw" points="[1354, 0, 1354, 0]$[3395, 0, 3395, 0]$[3395, -1921, 3395, -1921]$[186, -1921, 186, -1921]$[186, -1117, 186, -1117]"/>
-              </edges>
-              <edges xmi:id="_G88KrOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003E" source="_G8zBMufXEduqHoOJbURZRw" target="_G8pP4OfXEduqHoOJbURZRw">
-                <children xmi:id="_G88Kr-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88KsefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88KsufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88KsOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88KrefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88KrufXEduqHoOJbURZRw" points="[-1126, -1126, 2429, 2429]$[-3031, -3031, 524, 524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88Ks-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88KtOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G88KtefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60003F" source="_G8zBIufXEduqHoOJbURZRw" target="_G8zBMufXEduqHoOJbURZRw">
-                <children xmi:id="_G88KuOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88KuufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88Ku-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88KuefXEduqHoOJbURZRw" x="-173" y="-499"/>
-                </children>
-                <children xmi:id="_G88KvOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G88KvufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KvefXEduqHoOJbURZRw" x="-133" y="-245"/>
-                </children>
-                <children xmi:id="_G88Kv-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G88KwefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KwOfXEduqHoOJbURZRw" x="527" y="339"/>
-                </children>
-                <children xmi:id="_G88KwufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G88KxOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88Kw-fXEduqHoOJbURZRw" x="-2" y="213"/>
-                </children>
-                <children xmi:id="_G88KxefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G88Kx-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KxufXEduqHoOJbURZRw" x="167" y="-346"/>
-                </children>
-                <children xmi:id="_G88KyOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G88KyufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88Ky-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KyefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G88KzOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G88KzufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88Kz-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88KzefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G88K0OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600042">
-                  <children xmi:id="_G88K0ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88K0-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88K0efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G88K1OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C600040">
-                  <children xmi:id="_G88K1ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G88K1-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G88K1efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88KtufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88Kt-fXEduqHoOJbURZRw" points="[1508, -27, -2196, 2302]$[3545, -27, -159, 2302]$[3545, -1217, -159, 1112]"/>
-              </edges>
-              <edges xmi:id="_G88K2OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600160" source="_G8zBIufXEduqHoOJbURZRw" target="_G8pPsOfXEduqHoOJbURZRw">
-                <children xmi:id="_G88K2-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88K3efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88K3ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88K3OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88K2efXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88K2ufXEduqHoOJbURZRw" points="[-567, -524, 2887, 2624]$[-2870, -2616, 584, 533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88K3-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88K4OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G88K4efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G8zA7-fXEduqHoOJbURZRw" target="_G8pPsOfXEduqHoOJbURZRw">
-                <children xmi:id="_G88K5OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88K5ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88K5-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88K5efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88K4ufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88K4-fXEduqHoOJbURZRw" points="[728, -592, -3437, 2709]$[3471, -2768, -694, 533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88K6OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88K6efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G88K-ufXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G8pP-efXEduqHoOJbURZRw" target="_G88K6ufXEduqHoOJbURZRw">
-                <children xmi:id="_G88K_efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88K_-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88LAOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88K_ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88K--fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88K_OfXEduqHoOJbURZRw" points="[0, 516, -101, -1261]$[0, 1253, -101, -524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LAefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LAufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G88LA-fXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G88K6ufXEduqHoOJbURZRw" target="_G8pP4OfXEduqHoOJbURZRw">
-                <children xmi:id="_G88LBufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88LCOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88LCefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88LB-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88LBOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88LBefXEduqHoOJbURZRw" points="[-238, 318, -212, -1667]$[-238, 1667, -212, -318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LCufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LC-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G88LHOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F02A0" source="_G88LDOfXEduqHoOJbURZRw" target="_G8pP-efXEduqHoOJbURZRw">
-                <children xmi:id="_G88LH-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88LIefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88LIufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88LIOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88LHefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88LHufXEduqHoOJbURZRw" points="[728, 524, -2269, -1608]$[2260, 1608, -736, -524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LI-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LJOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G88LNefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F029F" source="_G88LJefXEduqHoOJbURZRw" target="_G8pP-efXEduqHoOJbURZRw">
-                <children xmi:id="_G88LOOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88LOufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88LO-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88LOefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88LNufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88LN-fXEduqHoOJbURZRw" points="[-753, 524, 2345, -1710]$[-2387, 1710, 711, -524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LPOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LPefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G88LPufXEduqHoOJbURZRw" element="_3ADC7B74022D42B1EC1B0349" source="_G8pPwOfXEduqHoOJbURZRw" target="_G88K6ufXEduqHoOJbURZRw">
-                <children xmi:id="_G88LQefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G88LQ-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G88LROfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G88LQufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G88LP-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G88LQOfXEduqHoOJbURZRw" points="[-965, 516, 2489, -1363]$[-2506, 1346, 948, -533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LRefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G88LRufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F5F6780045" type="Class" name="ProcessGuidance">
-              <children xmi:id="_G9F7oOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-                <children xmi:id="_G9F7o-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9F7pOfXEduqHoOJbURZRw" width="1676" height="914"/>
-                </children>
-                <children xmi:id="_G9F7pefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9F7pufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9F7p-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9F7qOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9F7qefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9F7qufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9F7q-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9F7rOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9F7refXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9F7rufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9F7r-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9F7oefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9F7oufXEduqHoOJbURZRw" x="1447" y="13157"/>
-              </children>
-              <children xmi:id="_G9F70OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0077">
-                <children xmi:id="_G9F70-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9F71OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G9F71efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9F71ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9F71-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9F72OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9F72efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9F72ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9F72-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9F73OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9F73efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9F73ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9F73-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9F70efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9F70ufXEduqHoOJbURZRw" x="812" y="15113" height="1667"/>
-              </children>
-              <children xmi:id="_G9F74OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01C2">
-                <children xmi:id="_G9PFkufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9PFk-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G9PFlOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9PFlefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9PFlufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9PFl-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFmOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFmefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFmufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFm-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFnOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFnefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9PFnufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9PFkOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PFkefXEduqHoOJbURZRw" x="11346" y="10161"/>
-              </children>
-              <children xmi:id="_G9PFn-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A9E86017E">
-                <children xmi:id="_G9PFoufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9PFo-fXEduqHoOJbURZRw" width="1659" height="905"/>
-                </children>
-                <children xmi:id="_G9PFpOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9PFpefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9PFpufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9PFp-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFqOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFqefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFqufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFq-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFrOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFrefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9PFrufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9PFoOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PFoefXEduqHoOJbURZRw" x="11159" y="8644"/>
-              </children>
-              <children xmi:id="_G9PFuOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01C1">
-                <children xmi:id="_G9PFu-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9PFvOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G9PFvefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9PFvufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9PFv-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9PFwOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFwefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFwufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFw-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFxOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PFxefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PFxufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9PFx-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9PFuefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PFuufXEduqHoOJbURZRw" x="11192" y="11480" width="4336" height="5393"/>
-              </children>
-              <children xmi:id="_G9PGDufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E019A">
-                <children xmi:id="_G9PGEefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9PGEufXEduqHoOJbURZRw" width="2929" height="1032"/>
-                </children>
-                <children xmi:id="_G9PGE-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9PGFOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9PGFefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9PGFufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGF-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PGGOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGGefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PGGufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGG-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PGHOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9PGHefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9PGD-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PGEOfXEduqHoOJbURZRw" x="11184" y="2531"/>
-              </children>
-              <children xmi:id="_G9PGHufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0199">
-                <children xmi:id="_G9PGIefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9PGIufXEduqHoOJbURZRw" width="2929" height="1032"/>
-                </children>
-                <children xmi:id="_G9PGI-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9PGJOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9PGJefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9PGJufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGJ-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PGKOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGKefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PGKufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGK-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PGLOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9PGLefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9PGH-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PGIOfXEduqHoOJbURZRw" x="11184" y="3750"/>
-              </children>
-              <children xmi:id="_G9PGLufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01A3">
-                <children xmi:id="_G9PGMefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9PGMufXEduqHoOJbURZRw" width="2929" height="1032"/>
-                </children>
-                <children xmi:id="_G9PGM-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9PGNOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9PGNefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9PGNufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGN-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9PGOOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGOefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2kOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2kefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2kufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9Y2k-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9PGL-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PGMOfXEduqHoOJbURZRw" x="11184" y="4969"/>
-              </children>
-              <children xmi:id="_G9Y2lOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01A4">
-                <children xmi:id="_G9Y2l-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9Y2mOfXEduqHoOJbURZRw" width="2929" height="1032"/>
-                </children>
-                <children xmi:id="_G9Y2mefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9Y2mufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9Y2m-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9Y2nOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2nefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2nufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2n-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2oOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2oefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2oufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9Y2o-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9Y2lefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9Y2lufXEduqHoOJbURZRw" x="11184" y="6189"/>
-              </children>
-              <children xmi:id="_G9Y2pOfXEduqHoOJbURZRw" element="_3ADC7B74022D4213C91302C5">
-                <children xmi:id="_G9Y2p-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9Y2qOfXEduqHoOJbURZRw" width="2929" height="1032"/>
-                </children>
-                <children xmi:id="_G9Y2qefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9Y2qufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9Y2q-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9Y2rOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2refXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2rufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2r-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2sOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2sefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2sufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9Y2s-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9Y2pefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9Y2pufXEduqHoOJbURZRw" x="11184" y="7408"/>
-              </children>
-              <children xmi:id="_G9Y2tOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FE930077">
-                <children xmi:id="_G9Y2t-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9Y2uOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G9Y2uefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9Y2uufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9Y2u-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9Y2vOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2vefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2vufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2v-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2wOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2wefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9Y2wufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9Y2w-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9Y2tefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9Y2tufXEduqHoOJbURZRw" x="1100" y="2506" width="2379" height="9626"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GmvRI-fXEduqHoOJbURZRw" description="This diagram provides an overview to the different Process-specific Guidance Types added to the Guidance Types already defined in Core Method Content for Processes."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G9PFyOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60011A" source="_G9PFuOfXEduqHoOJbURZRw" target="_G9F70OfXEduqHoOJbURZRw">
-                <children xmi:id="_G9PFy-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9PFzefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9PFzufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PFzOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9PFz-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C60011D">
-                  <children xmi:id="_G9PF0efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF0OfXEduqHoOJbURZRw" x="-732" y="-457"/>
-                </children>
-                <children xmi:id="_G9PF0ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C60011D">
-                  <children xmi:id="_G9PF1OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF0-fXEduqHoOJbURZRw" x="978" y="288"/>
-                </children>
-                <children xmi:id="_G9PF1efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60011B">
-                  <children xmi:id="_G9PF1-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF1ufXEduqHoOJbURZRw" x="742" y="-457"/>
-                </children>
-                <children xmi:id="_G9PF2OfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60011B">
-                  <children xmi:id="_G9PF2ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF2efXEduqHoOJbURZRw" x="361" y="347"/>
-                </children>
-                <children xmi:id="_G9PF2-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C60011D">
-                  <children xmi:id="_G9PF3efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PF3ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF3OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9PF3-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60011B">
-                  <children xmi:id="_G9PF4efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PF4ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF4OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9PF4-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C60011D">
-                  <children xmi:id="_G9PF5efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PF5ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF5OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9PF5-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60011B">
-                  <children xmi:id="_G9PF6efXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PF6ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF6OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9PFyefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9PFyufXEduqHoOJbURZRw" points="[-1507, 2413, 8906, 584]$[-8940, 2413, 1473, 584]"/>
-              </edges>
-              <edges xmi:id="_G9PF6-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60012E" source="_G9PFuOfXEduqHoOJbURZRw" target="_G9F70OfXEduqHoOJbURZRw">
-                <children xmi:id="_G9PF7ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9PF8OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9PF8efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9PF7-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9PF8ufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C600131">
-                  <children xmi:id="_G9PF9OfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF8-fXEduqHoOJbURZRw" x="-732" y="-457"/>
-                </children>
-                <children xmi:id="_G9PF9efXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C600131">
-                  <children xmi:id="_G9PF9-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF9ufXEduqHoOJbURZRw" x="1206" y="338"/>
-                </children>
-                <children xmi:id="_G9PF-OfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C60012F">
-                  <children xmi:id="_G9PF-ufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF-efXEduqHoOJbURZRw" x="742" y="-457"/>
-                </children>
-                <children xmi:id="_G9PF--fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C60012F">
-                  <children xmi:id="_G9PF_efXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF_OfXEduqHoOJbURZRw" x="361" y="347"/>
-                </children>
-                <children xmi:id="_G9PF_ufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C600131">
-                  <children xmi:id="_G9PGAOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGAefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PF_-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9PGAufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C60012F">
-                  <children xmi:id="_G9PGBOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGBefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PGA-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9PGBufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C600131">
-                  <children xmi:id="_G9PGCOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGCefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PGB-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9PGCufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C60012F">
-                  <children xmi:id="_G9PGDOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9PGDefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9PGC-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9PF7OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9PF7efXEduqHoOJbURZRw" points="[-2170, 979, 8837, -291]$[-9446, 979, 1561, -291]"/>
-              </edges>
-              <edges xmi:id="_G9Y2xOfXEduqHoOJbURZRw" element="_3ADC7B74022D40FD561A0396" source="_G9Y2tOfXEduqHoOJbURZRw" target="_G9F74OfXEduqHoOJbURZRw">
-                <children xmi:id="_G9Y2x-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9Y2yefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9Y2yufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9Y2yOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y2y-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40FD561C0079">
-                  <children xmi:id="_G9Y2zefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y2zOfXEduqHoOJbURZRw" x="-919" y="305"/>
-                </children>
-                <children xmi:id="_G9Y2zufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40FD561C0079">
-                  <children xmi:id="_G9Y20OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y2z-fXEduqHoOJbURZRw" x="-403" y="-194"/>
-                </children>
-                <children xmi:id="_G9Y20efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40FD561C0065">
-                  <children xmi:id="_G9Y20-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y20ufXEduqHoOJbURZRw" x="664" y="280"/>
-                </children>
-                <children xmi:id="_G9Y21OfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40FD561C0065">
-                  <children xmi:id="_G9Y21ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y21efXEduqHoOJbURZRw" x="55" y="-220"/>
-                </children>
-                <children xmi:id="_G9Y21-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40FD561C0079">
-                  <children xmi:id="_G9Y22efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y22ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y22OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y22-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40FD561C0065">
-                  <children xmi:id="_G9Y23efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y23ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y23OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y23-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40FD561C0079">
-                  <children xmi:id="_G9Y24efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y24ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y24OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9Y24-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40FD561C0065">
-                  <children xmi:id="_G9Y25efXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y25ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y25OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9Y2xefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9Y2xufXEduqHoOJbURZRw" points="[1185, 3335, -8619, 84]$[8822, 3335, -982, 84]"/>
-              </edges>
-              <edges xmi:id="_G9Y25-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A9EFE01CA" source="_G9PFn-fXEduqHoOJbURZRw" target="_G9Y2tOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9Y26ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9Y27OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9Y27efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9Y26-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y27ufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427A9EFF01A4">
-                  <children xmi:id="_G9Y28OfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y27-fXEduqHoOJbURZRw" x="-942" y="-245"/>
-                </children>
-                <children xmi:id="_G9Y28efXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A9EFF01A4">
-                  <children xmi:id="_G9Y28-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y28ufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9Y29OfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A9EFF019A">
-                  <children xmi:id="_G9Y29ufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y29efXEduqHoOJbURZRw" x="689" y="-245"/>
-                </children>
-                <children xmi:id="_G9Y29-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A9EFF019A">
-                  <children xmi:id="_G9Y2-efXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y2-OfXEduqHoOJbURZRw" x="-683" y="195"/>
-                </children>
-                <children xmi:id="_G9Y2-ufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A9EFF01A4">
-                  <children xmi:id="_G9Y2_OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y2_efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y2--fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y2_ufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A9EFF019A">
-                  <children xmi:id="_G9Y3AOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y3AefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y2_-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y3AufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A9EFF01A4">
-                  <children xmi:id="_G9Y3BOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y3BefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3A-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9Y3BufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A9EFF019A">
-                  <children xmi:id="_G9Y3COfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y3CefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3B-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9Y26OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9Y26efXEduqHoOJbURZRw" points="[-829, 0, 8873, 1778]$[-8517, 0, 1185, 1778]"/>
-              </edges>
-              <edges xmi:id="_G9Y3CufXEduqHoOJbURZRw" element="_3ADC7B74022D427A9F500325" source="_G9Y2tOfXEduqHoOJbURZRw" target="_G9PFuOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9Y3DefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9Y3D-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9Y3EOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9Y3DufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y3EefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427A9F520045">
-                  <children xmi:id="_G9Y3E-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3EufXEduqHoOJbURZRw" x="-770" y="305"/>
-                </children>
-                <children xmi:id="_G9Y3FOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A9F520045">
-                  <children xmi:id="_G9Y3FufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3FefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9Y3F-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A9F520043">
-                  <children xmi:id="_G9Y3GefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3GOfXEduqHoOJbURZRw" x="719" y="305"/>
-                </children>
-                <children xmi:id="_G9Y3GufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A9F520043">
-                  <children xmi:id="_G9Y3HOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3G-fXEduqHoOJbURZRw" x="-652" y="-246"/>
-                </children>
-                <children xmi:id="_G9Y3HefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A9F520045">
-                  <children xmi:id="_G9Y3H-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y3IOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3HufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y3IefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A9F520043">
-                  <children xmi:id="_G9Y3I-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y3JOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3IufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y3JefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A9F520045">
-                  <children xmi:id="_G9Y3J-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y3KOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3JufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9Y3KefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A9F520043">
-                  <children xmi:id="_G9Y3K-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9Y3LOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3KufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9Y3C-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9Y3DOfXEduqHoOJbURZRw" points="[1185, 4631, -9228, -2226]$[8906, 4631, -1507, -2226]"/>
-              </edges>
-              <edges xmi:id="_G9Y3LefXEduqHoOJbURZRw" element="_3ADC7B74022D427A9F8C00C5" source="_G9Y2tOfXEduqHoOJbURZRw" target="_G9PGDufXEduqHoOJbURZRw">
-                <children xmi:id="_G9Y3MOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9Y3MufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9Y3M-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9Y3MefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9Y3NOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427A9F8D001D">
-                  <children xmi:id="_G9Y3NufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3NefXEduqHoOJbURZRw" x="-854" y="295"/>
-                </children>
-                <children xmi:id="_G9Y3N-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A9F8D001D">
-                  <children xmi:id="_G9Y3OefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3OOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9Y3OufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A9F8D0013">
-                  <children xmi:id="_G9Y3POfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3O-fXEduqHoOJbURZRw" x="752" y="295"/>
-                </children>
-                <children xmi:id="_G9Y3PefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A9F8D0013">
-                  <children xmi:id="_G9Y3P-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3PufXEduqHoOJbURZRw" x="-78" y="-187"/>
-                </children>
-                <children xmi:id="_G9Y3QOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A9F8D001D">
-                  <children xmi:id="_G9inkOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9inkefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9Y3QefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9inkufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A9F8D0013">
-                  <children xmi:id="_G9inlOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9inlefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ink-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9inlufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A9F8D001D">
-                  <children xmi:id="_G9inmOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9inmefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inl-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9inmufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A9F8D0013">
-                  <children xmi:id="_G9innOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9innefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inm-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9Y3LufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9Y3L-fXEduqHoOJbURZRw" points="[1185, -4275, -9177, -8]$[8898, -4275, -1464, -8]"/>
-              </edges>
-              <edges xmi:id="_G9innufXEduqHoOJbURZRw" element="_3ADC7B74022D427A9F900252" source="_G9Y2tOfXEduqHoOJbURZRw" target="_G9PGHufXEduqHoOJbURZRw">
-                <children xmi:id="_G9inoefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9ino-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9inpOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9inoufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9inpefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427A9F9101B4">
-                  <children xmi:id="_G9inp-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inpufXEduqHoOJbURZRw" x="-930" y="296"/>
-                </children>
-                <children xmi:id="_G9inqOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A9F9101B4">
-                  <children xmi:id="_G9inqufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inqefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9inq-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A9F9101A9">
-                  <children xmi:id="_G9inrefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inrOfXEduqHoOJbURZRw" x="760" y="296"/>
-                </children>
-                <children xmi:id="_G9inrufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A9F9101A9">
-                  <children xmi:id="_G9insOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inr-fXEduqHoOJbURZRw" x="-10" y="-246"/>
-                </children>
-                <children xmi:id="_G9insefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A9F9101B4">
-                  <children xmi:id="_G9ins-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9intOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9insufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9intefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A9F9101A9">
-                  <children xmi:id="_G9int-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9inuOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9intufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9inuefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A9F9101B4">
-                  <children xmi:id="_G9inu-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9invOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inuufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9invefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A9F9101A9">
-                  <children xmi:id="_G9inv-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9inwOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9invufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9inn-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9inoOfXEduqHoOJbURZRw" points="[1185, -3048, -9177, 0]$[8898, -3048, -1464, 0]"/>
-              </edges>
-              <edges xmi:id="_G9inwefXEduqHoOJbURZRw" element="_3ADC7B74022D427A9F9403B7" source="_G9Y2tOfXEduqHoOJbURZRw" target="_G9PGLufXEduqHoOJbURZRw">
-                <children xmi:id="_G9inxOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9inxufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9inx-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9inxefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9inyOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427A9F95032C">
-                  <children xmi:id="_G9inyufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inyefXEduqHoOJbURZRw" x="-905" y="312"/>
-                </children>
-                <children xmi:id="_G9iny-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A9F95032C">
-                  <children xmi:id="_G9inzefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inzOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9inzufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A9F950322">
-                  <children xmi:id="_G9in0OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9inz-fXEduqHoOJbURZRw" x="701" y="287"/>
-                </children>
-                <children xmi:id="_G9in0efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A9F950322">
-                  <children xmi:id="_G9in0-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in0ufXEduqHoOJbURZRw" x="108" y="-280"/>
-                </children>
-                <children xmi:id="_G9in1OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A9F95032C">
-                  <children xmi:id="_G9in1ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9in1-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in1efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9in2OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A9F950322">
-                  <children xmi:id="_G9in2ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9in2-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in2efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9in3OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A9F95032C">
-                  <children xmi:id="_G9in3ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9in3-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in3efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9in4OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A9F950322">
-                  <children xmi:id="_G9in4ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9in4-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in4efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9inwufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9inw-fXEduqHoOJbURZRw" points="[1185, -1828, -9177, 0]$[8898, -1828, -1464, 0]"/>
-              </edges>
-              <edges xmi:id="_G9in5OfXEduqHoOJbURZRw" element="_3ADC7B74022D427A9F990383" source="_G9Y2tOfXEduqHoOJbURZRw" target="_G9Y2lOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9in5-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9in6efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9in6ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9in6OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9in6-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427A9F9A02E4">
-                  <children xmi:id="_G9in7efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in7OfXEduqHoOJbURZRw" x="-879" y="363"/>
-                </children>
-                <children xmi:id="_G9in7ufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A9F9A02E4">
-                  <children xmi:id="_G9in8OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in7-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9in8efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A9F9A02DA">
-                  <children xmi:id="_G9in8-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in8ufXEduqHoOJbURZRw" x="675" y="262"/>
-                </children>
-                <children xmi:id="_G9in9OfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A9F9A02DA">
-                  <children xmi:id="_G9in9ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in9efXEduqHoOJbURZRw" x="125" y="-340"/>
-                </children>
-                <children xmi:id="_G9in9-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A9F9A02E4">
-                  <children xmi:id="_G9in-efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9in-ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in-OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9in--fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A9F9A02DA">
-                  <children xmi:id="_G9in_efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9in_ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9in_OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9in_-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A9F9A02E4">
-                  <children xmi:id="_G9ioAefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9ioAufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioAOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9ioA-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A9F9A02DA">
-                  <children xmi:id="_G9ioBefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9ioBufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioBOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9in5efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9in5ufXEduqHoOJbURZRw" points="[1185, -609, -9177, 0]$[8898, -609, -1464, 0]"/>
-              </edges>
-              <edges xmi:id="_G9ioB-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A9F9E0178" source="_G9Y2tOfXEduqHoOJbURZRw" target="_G9Y2pOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9ioCufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9ioDOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9ioDefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9ioC-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9ioDufXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427A9F9F008B">
-                  <children xmi:id="_G9ioEOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioD-fXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_G9ioEefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A9F9F008B">
-                  <children xmi:id="_G9ioE-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioEufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9ioFOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A9F9F0089">
-                  <children xmi:id="_G9ioFufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioFefXEduqHoOJbURZRw" x="760" y="263"/>
-                </children>
-                <children xmi:id="_G9ioF-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A9F9F0089">
-                  <children xmi:id="_G9ioGefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioGOfXEduqHoOJbURZRw" x="-290" y="-288"/>
-                </children>
-                <children xmi:id="_G9ioGufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A9F9F008B">
-                  <children xmi:id="_G9ioHOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9ioHefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioG-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9ioHufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A9F9F0089">
-                  <children xmi:id="_G9ioIOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9ioIefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioH-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9ioIufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A9F9F008B">
-                  <children xmi:id="_G9ioJOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9ioJefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioI-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9ioJufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A9F9F0089">
-                  <children xmi:id="_G9ioKOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9ioKefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9ioJ-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9ioCOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9ioCefXEduqHoOJbURZRw" points="[1185, 609, -9177, 0]$[8898, 609, -1464, 0]"/>
-              </edges>
-              <edges xmi:id="_G9ioKufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FED602AE" source="_G9F7oOfXEduqHoOJbURZRw" target="_G9Y2tOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9ioLefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9ioL-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9ioMOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9ioLufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9ioK-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9ioLOfXEduqHoOJbURZRw" points="[84, -465, 84, 5833]$[84, -1498, 84, 4800]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9ioMefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9ioMufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G9ioM-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600110" source="_G9F70OfXEduqHoOJbURZRw" target="_G9F7oOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9ioNufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9ioOOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9ioOefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9ioN-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9ioNOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9ioNefXEduqHoOJbURZRw" points="[-53, -318, -53, 1640]$[-53, -1641, -53, 317]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9ioOufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9ioO-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D42124BCD031A" type="Class" name="ReferenceWorkflows">
-              <children xmi:id="_G9rxkOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-                <children xmi:id="_G9rxk-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9rxlOfXEduqHoOJbURZRw" width="1727" height="905"/>
-                </children>
-                <children xmi:id="_G9rxlefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9rxlufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9rxl-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9rxmOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxmefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxmufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxm-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxnOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxnefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxnufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9rxn-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9rxkefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9rxkufXEduqHoOJbURZRw" x="7608" y="3487"/>
-              </children>
-              <children xmi:id="_G9rxoOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FE930077">
-                <children xmi:id="_G9rxo-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9rxpOfXEduqHoOJbURZRw" width="1574" height="905"/>
-                </children>
-                <children xmi:id="_G9rxpefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9rxpufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9rxp-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9rxqOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxqefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxqufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxq-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxrOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxrefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxrufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9rxr-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9rxoefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9rxoufXEduqHoOJbURZRw" x="7684" y="1658"/>
-              </children>
-              <children xmi:id="_G9rxuefXEduqHoOJbURZRw" element="_3ADC7B74022D42124BEE00DC">
-                <children xmi:id="_G9rxvOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9rxvefXEduqHoOJbURZRw" width="1862" height="905"/>
-                </children>
-                <children xmi:id="_G9rxvufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9rxv-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9rxwOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9rxwefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxwufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxw-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxxOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxxefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rxxufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9rxx-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9rxyOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9rxuufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9rxu-fXEduqHoOJbURZRw" x="936" y="1760"/>
-              </children>
-              <children xmi:id="_G9rx9efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00DC">
-                <children xmi:id="_G9rx-OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9rx-efXEduqHoOJbURZRw" width="3115" height="905"/>
-                </children>
-                <children xmi:id="_G9rx-ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9rx--fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9rx_OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9rx_efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rx_ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91igOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91igefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91igufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91ig-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91ihOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G91ihefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9rx9ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9rx9-fXEduqHoOJbURZRw" x="6913" y="5621"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GmvRJefXEduqHoOJbURZRw" description="This diagram shows how the category discipline has been extended in this package with an additonal assocation to Activity providing standard or reference ways of doing the work described by the Discipline."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G9rxsOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FED602AE" source="_G9rxkOfXEduqHoOJbURZRw" target="_G9rxoOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9rxs-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9rxtefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9rxtufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9rxtOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9rxsefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9rxsufXEduqHoOJbURZRw" points="[0, -457, 0, 1371]$[0, -1380, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9rxt-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9rxuOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G9rx0ufXEduqHoOJbURZRw" element="_3ADC7B74022D42124C3A024E" source="_G9rxuefXEduqHoOJbURZRw" target="_G9rxoOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9rx1efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9rx1-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9rx2OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9rx1ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9rx2efXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42124C3B0137">
-                  <children xmi:id="_G9rx2-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx2ufXEduqHoOJbURZRw" x="46" y="304"/>
-                </children>
-                <children xmi:id="_G9rx3OfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D42124C3B0137">
-                  <children xmi:id="_G9rx3ufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx3efXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G9rx3-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42124C3B010F">
-                  <children xmi:id="_G9rx4efXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx4OfXEduqHoOJbURZRw" x="13" y="296"/>
-                </children>
-                <children xmi:id="_G9rx4ufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42124C3B010F">
-                  <children xmi:id="_G9rx5OfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx4-fXEduqHoOJbURZRw" x="-1155" y="-221"/>
-                </children>
-                <children xmi:id="_G9rx5efXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42124C3B0137">
-                  <children xmi:id="_G9rx5-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rx6OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx5ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9rx6efXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42124C3B010F">
-                  <children xmi:id="_G9rx6-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rx7OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx6ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9rx7efXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42124C3B0137">
-                  <children xmi:id="_G9rx7-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rx8OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx7ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9rx8efXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42124C3B010F">
-                  <children xmi:id="_G9rx8-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9rx9OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9rx8ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9rx0-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9rx1OfXEduqHoOJbURZRw" points="[931, -25, -5672, 76]$[5816, -25, -787, 76]"/>
-              </edges>
-              <edges xmi:id="_G91ihufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028D" source="_G9rx9efXEduqHoOJbURZRw" target="_G9rxkOfXEduqHoOJbURZRw">
-                <children xmi:id="_G91iiefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G91ii-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G91ijOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G91iiufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G91ih-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G91iiOfXEduqHoOJbURZRw" points="[0, -457, 0, 1676]$[0, -1684, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G91ijefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G91ijufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D4283CE9F0291" type="Class" name="ProcessWorkDefinition">
-              <children xmi:id="_G91iqOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A92540227">
-                <children xmi:id="_G91iq-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G91irOfXEduqHoOJbURZRw" width="4267" height="1032"/>
-                </children>
-                <children xmi:id="_G91irefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G91irufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G91ir-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G91isOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91isefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91isufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91is-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91itOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91itefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91itufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G91it-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G91iqefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G91iqufXEduqHoOJbURZRw" x="5130" y="3344"/>
-              </children>
-              <children xmi:id="_G91iuOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CA">
-                <children xmi:id="_G91iu-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G91ivOfXEduqHoOJbURZRw" width="2319" height="1032"/>
-                </children>
-                <children xmi:id="_G91ivefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G91ivufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G91iv-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G91iwOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91iwefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91iwufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91iw-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91ixOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91ixefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91ixufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G91ix-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G91iuefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G91iuufXEduqHoOJbURZRw" x="2853" y="7608"/>
-              </children>
-              <children xmi:id="_G91iyOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CB">
-                <children xmi:id="_G91iy-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G91izOfXEduqHoOJbURZRw" width="2319" height="1032"/>
-                </children>
-                <children xmi:id="_G91izefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G91izufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G91iz-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G91i0OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91i0efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91i0ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91i0-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91i1OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91i1efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91i1ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G91i1-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G91iyefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G91iyufXEduqHoOJbURZRw" x="317" y="7608"/>
-              </children>
-              <children xmi:id="_G91i2OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G91i2-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G91i3OfXEduqHoOJbURZRw" width="2726" height="1032"/>
-                </children>
-                <children xmi:id="_G91i3efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G91i3ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G91i3-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G91i4OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91i4efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91i4ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91i4-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91i5OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G91i5efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G91i5ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G91i5-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G91i2efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G91i2ufXEduqHoOJbURZRw" x="5901" y="5630"/>
-              </children>
-              <children xmi:id="_G9_TiefXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_G9_TjOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9_TjefXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G9_TjufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9_Tj-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9_TkOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9_TkefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_TkufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_Tk-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_TlOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_TlefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_TlufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_Tl-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9_TmOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9_TiufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_Ti-fXEduqHoOJbURZRw" x="2853" y="1268" height="1375"/>
-              </children>
-              <children xmi:id="_G9_TmefXEduqHoOJbURZRw" element="_3ADC7B74022D427A857B0333">
-                <children xmi:id="_G9_TnOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9_TnefXEduqHoOJbURZRw" width="2794" height="1032"/>
-                </children>
-                <children xmi:id="_G9_TnufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9_Tn-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9_ToOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9_ToefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_ToufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_To-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_TpOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_TpefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_TpufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_Tp-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9_TqOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9_TmufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_Tm-fXEduqHoOJbURZRw" x="10778" y="1268" height="1322"/>
-              </children>
-              <children xmi:id="_G9_T7-fXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FE930077">
-                <children xmi:id="_G9_T8ufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9_T8-fXEduqHoOJbURZRw" width="1591" height="905"/>
-                </children>
-                <children xmi:id="_G9_T9OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9_T9efXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9_T9ufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9_T9-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_T-OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_T-efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_T-ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_T--fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_T_OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_T_efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9_T_ufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9_T8OfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_T8efXEduqHoOJbURZRw" x="5389" y="6974"/>
-              </children>
-              <children xmi:id="_G9_T_-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00DC">
-                <children xmi:id="_G9_UAufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9_UA-fXEduqHoOJbURZRw" width="3115" height="905"/>
-                </children>
-                <children xmi:id="_G9_UBOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9_UBefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9_UBufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9_UB-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_UCOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_UCefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_UCufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_UC-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_UDOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_UDefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9_UDufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9_UAOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_UAefXEduqHoOJbURZRw" x="7925" y="10144"/>
-              </children>
-              <children xmi:id="_G9_UD-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-                <children xmi:id="_G9_UEufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G9_UE-fXEduqHoOJbURZRw" width="1727" height="905"/>
-                </children>
-                <children xmi:id="_G9_UFOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G9_UFefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G9_UFufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G9_UF-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_UGOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_UGefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_UGufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_UG-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_UHOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G9_UHefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G9_UHufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9_UEOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_UEefXEduqHoOJbURZRw" x="6657" y="8559"/>
-              </children>
-              <children xmi:id="_G9_UKOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0077">
-                <children xmi:id="_G-IdcOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-IdcefXEduqHoOJbURZRw" width="2844" height="905"/>
-                </children>
-                <children xmi:id="_G-IdcufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-Idc-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-IddOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-IddefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IddufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-Idd-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IdeOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-IdeefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IdeufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-Ide-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-IdfOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G9_UKefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_UKufXEduqHoOJbURZRw" x="4064" y="10219"/>
-              </children>
-              <children xmi:id="_G-Idj-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G-IdkufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-Idk-fXEduqHoOJbURZRw" width="2319" height="1032"/>
-                </children>
-                <children xmi:id="_G-IdlOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-IdlefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-IdlufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-Idl-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IdmOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-IdmefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IdmufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-Idm-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IdnOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-IdnefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-IdnufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-IdkOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-IdkefXEduqHoOJbURZRw" x="2536" y="4438"/>
-              </children>
-              <children xmi:id="_G-IdqOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G-Idq-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-IdrOfXEduqHoOJbURZRw" width="3386" height="1032"/>
-                </children>
-                <children xmi:id="_G-IdrefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-IdrufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-Idr-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-IdsOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IdsefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-IdsufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-Ids-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-IdtOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-IdtefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-IdtufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-Idt-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-IdqefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-IdqufXEduqHoOJbURZRw" x="10651" y="3344"/>
-              </children>
-              <children xmi:id="_G-Id3OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0031">
-                <children xmi:id="_G-Id3-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-Id4OfXEduqHoOJbURZRw" width="2319" height="1032"/>
-                </children>
-                <children xmi:id="_G-Id4efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-Id4ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-Id4-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-Id5OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-Id5efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-Id5ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-Id5-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-Id6OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-Id6efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-Id6ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-Id6-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-Id3efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-Id3ufXEduqHoOJbURZRw" x="9193" y="5630"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GmvRJ-fXEduqHoOJbURZRw"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G9_TgOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A923B0002" source="_G91i2OfXEduqHoOJbURZRw" target="_G91iqOfXEduqHoOJbURZRw">
-                <children xmi:id="_G9_Tg-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9_ThefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9_ThufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_ThOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9_TgefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9_TgufXEduqHoOJbURZRw" points="[0, -524, 0, 1761]$[0, -1769, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9_Th-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9_TiOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G9_TqefXEduqHoOJbURZRw" element="_3ADC7B74022D427A87E90061" source="_G9_TiefXEduqHoOJbURZRw" target="_G9_TmefXEduqHoOJbURZRw">
-                <children xmi:id="_G9_TrOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9_TrufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9_Tr-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_TrefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9_TsOfXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_G9_TsufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_TsefXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_G9_Ts-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_G9_TtefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_TtOfXEduqHoOJbURZRw" x="-202" y="-347"/>
-                </children>
-                <children xmi:id="_G9_TtufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_G9_TuOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_Tt-fXEduqHoOJbURZRw" x="-38" y="259"/>
-                </children>
-                <children xmi:id="_G9_TuefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_G9_Tu-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_TuufXEduqHoOJbURZRw" x="-578" y="-175"/>
-                </children>
-                <children xmi:id="_G9_TvOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_G9_TvufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_Tv-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_TvefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9_TwOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_G9_TwufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_Tw-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_TwefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9_TxOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_G9_TxufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_Tx-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_TxefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9_TyOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_G9_TyufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_Ty-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_TyefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9_TqufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9_Tq-fXEduqHoOJbURZRw" points="[2090, 609, -5345, 635]$[5821, 609, -1614, 635]"/>
-              </edges>
-              <edges xmi:id="_G9_TzOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A88340110" source="_G9_TiefXEduqHoOJbURZRw" target="_G9_TmefXEduqHoOJbURZRw">
-                <children xmi:id="_G9_Tz-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9_T0efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9_T0ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_T0OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9_T0-fXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_G9_T1efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T1OfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_G9_T1ufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_G9_T2OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T1-fXEduqHoOJbURZRw" x="-202" y="-348"/>
-                </children>
-                <children xmi:id="_G9_T2efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_G9_T2-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T2ufXEduqHoOJbURZRw" x="-90" y="157"/>
-                </children>
-                <children xmi:id="_G9_T3OfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_G9_T3ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T3efXEduqHoOJbURZRw" x="-788" y="-170"/>
-                </children>
-                <children xmi:id="_G9_T3-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_G9_T4efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_T4ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T4OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9_T4-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_G9_T5efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_T5ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T5OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G9_T5-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_G9_T6efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_T6ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T6OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G9_T6-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_G9_T7efXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G9_T7ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G9_T7OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9_TzefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9_TzufXEduqHoOJbURZRw" points="[1845, -389, -5621, -389]$[6070, -389, -1397, -389]"/>
-              </edges>
-              <edges xmi:id="_G9_UH-fXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FED602AE" source="_G9_UD-fXEduqHoOJbURZRw" target="_G9_T7-fXEduqHoOJbURZRw">
-                <children xmi:id="_G9_UIufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G9_UJOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G9_UJefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G9_UI-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G9_UIOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G9_UIefXEduqHoOJbURZRw" points="[-550, -457, 2142, 1778]$[-2150, -1786, 541, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9_UJufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G9_UJ-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-IdfefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C600110" source="_G9_UKOfXEduqHoOJbURZRw" target="_G9_UD-fXEduqHoOJbURZRw">
-                <children xmi:id="_G-IdgOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-IdgufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-Idg-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-IdgefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-IdfufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-Idf-fXEduqHoOJbURZRw" points="[330, -457, -1397, 1828]$[1371, -1837, -355, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdhOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdhefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-IdhufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028D" source="_G9_T_-fXEduqHoOJbURZRw" target="_G9_UD-fXEduqHoOJbURZRw">
-                <children xmi:id="_G-IdiefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-Idi-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-IdjOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-IdiufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-Idh-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-IdiOfXEduqHoOJbURZRw" points="[-287, -457, 1134, 1828]$[-1151, -1837, 270, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdjefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdjufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-Idn-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F02A0" source="_G91iyOfXEduqHoOJbURZRw" target="_G-Idj-fXEduqHoOJbURZRw">
-                <children xmi:id="_G-IdoufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-IdpOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-IdpefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-Ido-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-IdoOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-IdoefXEduqHoOJbURZRw" points="[592, -524, -2099, 1811]$[2082, -1820, -609, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdpufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Idp-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-IduOfXEduqHoOJbURZRw" element="_3ADC7B74022D428CD323019A" source="_G91iqOfXEduqHoOJbURZRw" target="_G-IdqOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-Idu-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-IdvefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-IdvufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-IdvOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-IduefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-IduufXEduqHoOJbURZRw" points="[2133, 0, -2946, 0]$[3378, 0, -1701, 0]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Idv-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdwOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-IdwefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F029F" source="_G91iuOfXEduqHoOJbURZRw" target="_G-Idj-fXEduqHoOJbURZRw">
-                <children xmi:id="_G-IdxOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-IdxufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-Idx-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-IdxefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-IdwufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-Idw-fXEduqHoOJbURZRw" points="[-135, -516, -84, 1820]$[-135, -1820, -84, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdyOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-IdyefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-IdyufXEduqHoOJbURZRw" element="_3ADC7B74022D427A92820392" source="_G-Idj-fXEduqHoOJbURZRw" target="_G91iqOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-IdzefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-Idz-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-Id0OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-IdzufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-Idy-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-IdzOfXEduqHoOJbURZRw" points="[660, -524, -2235, 1710]$[2209, -1718, -685, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Id0efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Id0ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-Id0-fXEduqHoOJbURZRw" element="_3ADC7B74022D428CD32901FD" source="_G-Idj-fXEduqHoOJbURZRw" target="_G9_TiefXEduqHoOJbURZRw">
-                <children xmi:id="_G-Id1ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-Id2OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-Id2efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-Id1-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-Id1OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-Id1efXEduqHoOJbURZRw" points="[-321, -516, -728, 3547]$[-321, -3547, -728, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Id2ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Id2-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-Id7OfXEduqHoOJbURZRw" element="_3ADC7B74022D42B1EC1B0349" source="_G-Id3OfXEduqHoOJbURZRw" target="_G91iqOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-Id7-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-Id8efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-Id8ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-Id8OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-Id7efXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-Id7ufXEduqHoOJbURZRw" points="[-643, -524, 2150, 1761]$[-2167, -1769, 626, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Id8-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-Id9OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D42DDE8F20125" type="Class" name="WorkDefinitionTaxonomy">
-              <children xmi:id="_G-SOcOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_G-SOc-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-SOdOfXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G-SOdefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-SOdufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-SOd-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-SOeOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOeefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOeufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOe-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOfOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOfefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOfufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-SOf-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-SOcefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOcufXEduqHoOJbURZRw" x="8822" y="1007"/>
-              </children>
-              <children xmi:id="_G-SOgOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03D3">
-                <children xmi:id="_G-SOg-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-SOhOfXEduqHoOJbURZRw" width="2319" height="1032"/>
-                </children>
-                <children xmi:id="_G-SOhefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-SOhufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-SOh-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-SOiOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOiefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOiufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOi-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOjOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOjefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOjufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-SOj-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-SOgefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOgufXEduqHoOJbURZRw" x="2751" y="2887"/>
-              </children>
-              <children xmi:id="_G-SOmefXEduqHoOJbURZRw" element="_3ADC7B74022D42794A660368">
-                <children xmi:id="_G-SOnOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-SOnefXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G-SOnufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-SOn-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-SOoOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-SOoefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOoufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOo-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOpOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOpefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOpufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOp-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-SOqOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-SOmufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOm-fXEduqHoOJbURZRw" x="9006" y="4755"/>
-              </children>
-              <children xmi:id="_G-SOsufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_G-SOtefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-SOtufXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_G-SOt-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-SOuOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-SOuefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-SOuufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOu-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOvOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOvufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SOv-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SOwOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-SOwefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-SOs-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOtOfXEduqHoOJbURZRw" x="15429" y="4755"/>
-              </children>
-              <children xmi:id="_G-SO7ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G-SO8efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-SO8ufXEduqHoOJbURZRw" width="2726" height="1032"/>
-                </children>
-                <children xmi:id="_G-SO8-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-SO9OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-SO9efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-SO9ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SO9-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SO-OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SO-efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SO-ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SO--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-SO_OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-SO_efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-SO7-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SO8OfXEduqHoOJbURZRw" x="16302" y="7079"/>
-              </children>
-              <children xmi:id="_G-bYd-fXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FE930077">
-                <children xmi:id="_G-bYeufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-bYe-fXEduqHoOJbURZRw" width="1574" height="905"/>
-                </children>
-                <children xmi:id="_G-bYfOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-bYfefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-bYfufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-bYf-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYgOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYgefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYgufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYg-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYhOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYhefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-bYhufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-bYeOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-bYeefXEduqHoOJbURZRw" x="-634" y="4755"/>
-              </children>
-              <children xmi:id="_G-bYkOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-                <children xmi:id="_G-bYk-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-bYlOfXEduqHoOJbURZRw" width="1727" height="905"/>
-                </children>
-                <children xmi:id="_G-bYlefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-bYlufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-bYl-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-bYmOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYmefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYmufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYm-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYnOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYnefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYnufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-bYn-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-bYkefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-bYkufXEduqHoOJbURZRw" x="-556" y="6657"/>
-              </children>
-              <children xmi:id="_G-bYqefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CB">
-                <children xmi:id="_G-bYrOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-bYrefXEduqHoOJbURZRw" width="2319" height="1032"/>
-                </children>
-                <children xmi:id="_G-bYrufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-bYr-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-bYsOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-bYsefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYsufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYs-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYtOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYtefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYtufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYt-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-bYuOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-bYqufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-bYq-fXEduqHoOJbURZRw" x="2751" y="4755"/>
-              </children>
-              <children xmi:id="_G-bYwufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03CA">
-                <children xmi:id="_G-bYxefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-bYxufXEduqHoOJbURZRw" width="2319" height="1032"/>
-                </children>
-                <children xmi:id="_G-bYx-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-bYyOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-bYyefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-bYyufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYy-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYzOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYzefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bYzufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYz-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-bY0OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-bY0efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-bYw-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-bYxOfXEduqHoOJbURZRw" x="5698" y="4755"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gm5CIefXEduqHoOJbURZRw"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G-SOkOfXEduqHoOJbURZRw" element="_3ADC7B74022D428CD32901FD" source="_G-SOgOfXEduqHoOJbURZRw" target="_G-SOcOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-SOk-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-SOlefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-SOlufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOlOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-SOkefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-SOkufXEduqHoOJbURZRw" points="[1159, -338, -5596, 1540]$[4902, -1371, -1854, 508]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-SOl-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-SOmOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-SOqefXEduqHoOJbURZRw" element="_3ADC7B74022D427A832300FE" source="_G-SOmefXEduqHoOJbURZRw" target="_G-SOcOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-SOrOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-SOrufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-SOr-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOrefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-SOqufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-SOq-fXEduqHoOJbURZRw" points="[0, -524, 0, 3234]$[0, -3242, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-SOsOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-SOsefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-SOwufXEduqHoOJbURZRw" element="_3ADC7B74022D427A831800B8" source="_G-SOsufXEduqHoOJbURZRw" target="_G-SOcOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-SOxefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-SOx-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-SOyOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOxufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-SOw-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-SOxOfXEduqHoOJbURZRw" points="[-745, -524, 4741, 3285]$[-4741, -3293, 745, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-SOyefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-SOyufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-SOy-fXEduqHoOJbURZRw" element="_3ADC7B74022D427962D3003F" source="_G-SOsufXEduqHoOJbURZRw" target="_G-SOmefXEduqHoOJbURZRw">
-                <children xmi:id="_G-SOzufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-SO0OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-SO0efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SOz-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-SO0ufXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G-SO1OfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO0-fXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_G-SO1efXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G-SO1-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO1ufXEduqHoOJbURZRw" x="-80" y="345"/>
-                </children>
-                <children xmi:id="_G-SO2OfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G-SO2ufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO2efXEduqHoOJbURZRw" x="-276" y="-299"/>
-                </children>
-                <children xmi:id="_G-SO2-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G-SO3efXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO3OfXEduqHoOJbURZRw" x="-517" y="235"/>
-                </children>
-                <children xmi:id="_G-SO3ufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G-SO4OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SO4efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO3-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-SO4ufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G-SO5OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SO5efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO4-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-SO5ufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_G-SO6OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SO6efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO5-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G-SO6ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_G-SO7OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-SO7efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SO6-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-SOzOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-SOzefXEduqHoOJbURZRw" points="[-1854, -25, 3632, 25]$[-3640, -42, 1845, 8]"/>
-              </edges>
-              <edges xmi:id="_G-SO_ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F030D" source="_G-SOsufXEduqHoOJbURZRw" target="_G-SO7ufXEduqHoOJbURZRw">
-                <children xmi:id="_G-SPAefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-SPA-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-SPBOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-SPAufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-SPBefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G-SPB-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SPBufXEduqHoOJbURZRw" x="268" y="398"/>
-                </children>
-                <children xmi:id="_G-SPCOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G-bYYOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-SPCefXEduqHoOJbURZRw" x="-53" y="-356"/>
-                </children>
-                <children xmi:id="_G-bYYefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G-bYY-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-bYYufXEduqHoOJbURZRw" x="-13" y="220"/>
-                </children>
-                <children xmi:id="_G-bYZOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G-bYZufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-bYZefXEduqHoOJbURZRw" x="38" y="-356"/>
-                </children>
-                <children xmi:id="_G-bYZ-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G-bYaefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYaufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-bYaOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-bYa-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G-bYbefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYbufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-bYbOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-bYb-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0310">
-                  <children xmi:id="_G-bYcefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYcufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-bYcOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G-bYc-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F030E">
-                  <children xmi:id="_G-bYdefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-bYdufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-bYdOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-SO_-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-SPAOfXEduqHoOJbURZRw" points="[0, 516, 0, -1667]$[0, 1659, 0, -524]"/>
-              </edges>
-              <edges xmi:id="_G-bYoOfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0FED602AE" source="_G-bYkOfXEduqHoOJbURZRw" target="_G-bYd-fXEduqHoOJbURZRw">
-                <children xmi:id="_G-bYo-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-bYpefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-bYpufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-bYpOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-bYoefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-bYoufXEduqHoOJbURZRw" points="[0, -457, 0, 1422]$[0, -1430, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-bYp-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-bYqOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-bYuefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F02A0" source="_G-bYqefXEduqHoOJbURZRw" target="_G-SOgOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-bYvOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-bYvufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-bYv-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-bYvefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-bYuufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-bYu-fXEduqHoOJbURZRw" points="[0, -524, 0, 1354]$[0, -1363, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-bYwOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-bYwefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-bY0ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F029F" source="_G-bYwufXEduqHoOJbURZRw" target="_G-SOgOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-bY1efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-bY1-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-bY2OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-bY1ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-bY0-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-bY1OfXEduqHoOJbURZRw" points="[-812, -524, 2133, 1354]$[-2142, -1363, 804, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-bY2efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-bY2ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_Gli-WefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD891F02CD">
-            <body>02</body>
-          </ownedComment>
-          <packageMerge xmi:id="_FoPWEOxMEduONrMRgmz48A" mergedPackage="_3ADC7B74022D40FD854600D8"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0077" name="DeliveryProcess">
-            <ownedComment xmi:id="_GlsvV-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0077">
-              <body>A Delivery Processes is a special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
-A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C600110" general="_3ADC7B74022D40F36C5E009F"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C60011D" name="educationMaterials" visibility="public" type="_3ADC7B74022D40F36C5E01C1" association="_3ADC7B74022D40F36C60011A">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmJbVufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmJbVefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C600131" name="communicationsMaterials" visibility="public" type="_3ADC7B74022D40F36C5E01C1" association="_3ADC7B74022D40F36C60012E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlNufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlNefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E009F" name="Process" isAbstract="true">
-            <ownedComment xmi:id="_GlsvW-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E009F">
-              <body>A Process is a special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
-Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41E0FED602AE" general="_3ADC7B74022D41E0FE930077"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D4119A3F301E2" name="includesPatterns" visibility="public" type="_3ADC7B74022D40F36C5E00DC" association="_3ADC7B74022D4119A3F20238">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gl_qR-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gl_qRufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E00E5" name="ProcessPlanningTemplate">
-            <ownedComment xmi:id="_GlsvX-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E00E5">
-              <body>A Process Planning Template is a special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
-A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C60028E" general="_3ADC7B74022D40F36C5E009F"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D4119A4010017" name="basedOnProcesses" visibility="public" type="_3ADC7B74022D40F36C5E009F" association="_3ADC7B74022D4119A40000E6">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gl_qUOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gl_qT-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01C2" name="Roadmap">
-            <ownedComment xmi:id="_GlsvY-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01C2">
-              <body>A Roadmap is a special Guidance Type which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
-An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41E10582037C" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41E0FE930077" name="Activity">
-            <ownedComment xmi:id="_Gl15Q-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41E0FE930077">
-              <body>This definition of Activity extends Activity introduced in the package Breakdown with new capabilities and is the basis for the definition of the class Process.
-Extends Activity with an association to Roadmap.  This definition of Activity also participates in the extension of the Discipline category.
-</body>
-            </ownedComment>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD561C0065" name="roadmaps" visibility="public" type="_3ADC7B74022D40F36C5E01C2" association="_3ADC7B74022D40FD561A0396">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmJbSufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmJbSefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A9F520043" name="supportingMaterials" visibility="public" type="_3ADC7B74022D40F36C5E01C1" association="_3ADC7B74022D427A9F500325">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmcWM-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmcWMufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A9F8D0013" name="checklists" visibility="public" type="_3ADC7B74022D40F36C5E019A" association="_3ADC7B74022D427A9F8C00C5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmcWPOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmcWO-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A9F9101A9" name="concepts" visibility="public" type="_3ADC7B74022D40F36C5E0199" association="_3ADC7B74022D427A9F900252">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmcWRefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmcWROfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A9F950322" name="examples" visibility="public" type="_3ADC7B74022D40F36C5E01A3" association="_3ADC7B74022D427A9F9403B7">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmlgI-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmlgIufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A9F9A02DA" name="guidelines" visibility="public" type="_3ADC7B74022D40F36C5E01A4" association="_3ADC7B74022D427A9F990383">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmlgLOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmlgK-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A9F9F0089" name="reusableAssets" visibility="public" type="_3ADC7B74022D4213C91302C5" association="_3ADC7B74022D427A9F9E0178">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmlgNefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmlgNOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42124BEE00DC" name="Discipline">
-            <ownedComment xmi:id="_Gl15R-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D42124BEE00DC">
-              <body>Discipline is a categorization of Tasks based upon similarity of concerns and cooperation of work effort.  This is the extensions of Discipline defined in the Method Core package adding an additional association to Activities, which represent typical standard or reference ways of meaningful groupings of the Discipline's Tasks into workflows.
-Tasks represent descriptions of work, which are categorized by Disciplines.  The reason that several Tasks are all categorized by the same Discipline is that they all represent a part in achieving a higher goal or performing work that is all related to each other.  Every Discipline defines standard ways of doing the work it categorizes.  Such standard ways are express by Activities or Capability Patterns defining how the Tasks categorized by the Discipline 'work together' in the most generic way.  These reference workflows are often used for educating and teaching practitioners. 
-</body>
-            </ownedComment>
-            <ownedAttribute xmi:id="_3ADC7B74022D42124C3B010F" name="referenceWorkflows" visibility="public" type="_3ADC7B74022D41E0FE930077" association="_3ADC7B74022D42124C3A024E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlRefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlROfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D427A9E86017E" name="Practice">
-            <ownedAttribute xmi:id="_3ADC7B74022D427A9EFF019A" name="activityReferences" visibility="public" type="_3ADC7B74022D41E0FE930077" association="_3ADC7B74022D427A9EFE01CA">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlTOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlS-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E00DC" name="CapabilityPattern">
-            <ownedComment xmi:id="_Gl15TefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E00DC">
-              <body>A Capability Pattern is a special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
-A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
-- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
-- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
-- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C60028D" general="_3ADC7B74022D40F36C5E009F"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4119A3F20238" memberEnd="_3ADC7B74022D4119A3F301E2 _3ADC7B74022D4119A3F301EC">
-            <ownedComment xmi:id="_Gl_qQ-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A3F20238">
-              <body>This association provides traceability for a Process documenting which Capability Patterns have been used for defining the process.  It documents applications of a pattern through copy as well as pattern binding.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4119A3F301EC" name="_process" visibility="public" type="_3ADC7B74022D40F36C5E009F" isUnique="false" association="_3ADC7B74022D4119A3F20238">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gl_qSufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gl_qSefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4119A40000E6" memberEnd="_3ADC7B74022D4119A4010017 _3ADC7B74022D4119A401002B">
-            <ownedComment xmi:id="_Gl_qTOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A40000E6">
-              <body>If the Plan has been created based on one or more processes (i.e. other Plans, Capability Patterns, a Delivery Process, or any combination of these), then this association captures a trace back to these sources.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4119A401002B" name="_processPlanningTemplate" visibility="public" type="_3ADC7B74022D40F36C5E00E5" isUnique="false" association="_3ADC7B74022D4119A40000E6">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gl_qU-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gl_qUufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4119A4F8020A" memberEnd="_3ADC7B74022D4119A4F90069 _3ADC7B74022D4119A4F90073">
-            <ownedComment xmi:id="_Gl_qVefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4119A4F8020A">
-              <body>The PlanningData class factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4119A4F90073" name="_breakdownElement" visibility="public" type="_3ADC7B74022D40F36C5E00EF" isUnique="false" association="_3ADC7B74022D4119A4F8020A"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40FD561A0396" memberEnd="_3ADC7B74022D40FD561C0065 _3ADC7B74022D40FD561C0079">
-            <ownedComment xmi:id="_GmJbRufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD561A0396">
-              <body>This association links an Activity to zero or mores instances of the Roadmap guidance type.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40FD561C0079" name="activity" visibility="public" type="_3ADC7B74022D41E0FE930077" association="_3ADC7B74022D40FD561A0396">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmJbTefXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmJbTOfXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60011A" memberEnd="_3ADC7B74022D40F36C60011B _3ADC7B74022D40F36C60011D">
-            <ownedComment xmi:id="_GmJbT-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60011A">
-              <body>This association defines a collection of guidance documents that provide education material for teaching stakeholders such as project managers on how to perform projects that follow this Delivery Process.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C60011B" name="_deliveryProcess" visibility="private" type="_3ADC7B74022D40F36C5E0077" isUnique="false" association="_3ADC7B74022D40F36C60011A">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmJbU-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmJbUufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C60012E" memberEnd="_3ADC7B74022D40F36C60012F _3ADC7B74022D40F36C600131">
-            <ownedComment xmi:id="_GmJbWOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C60012E">
-              <body>This association defines a collection of guidance documents that have been related to a Delivery Process instance to describe and characterize its features and capabilities. These documents can be used for several purposes such as internal marketing communications, sales training and general method education.  Examples for Communications Material are Highlight Document, Fact Sheet, and Delivery Process Specification Overview.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C60012F" name="_deliveryProcess" visibility="private" type="_3ADC7B74022D40F36C5E0077" isUnique="false" association="_3ADC7B74022D40F36C60012E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlM-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlMufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41E0FFD300EF" name="BreakdownNesting" memberEnd="_3ADC7B74022D41E0FFD300F0 _3ADC7B74022D41E0FFD300F1">
-            <ownedComment xmi:id="_GmSlOOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41E0FFD300EF">
-              <body>This bidirectional association represents breakdown structure nesting.  It defines an n-level hierarchy of Activities grouping together other Breakdown Elements such as other Activities, Descriptors, Milestones, etc.
-The superActivities role allows navigation of a Breakdown Element to is parent Activity. The breakdownElements role allows navigation from an Activity to its nested Breakdown Elements.
-</body>
-            </ownedComment>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42124C3A024E" memberEnd="_3ADC7B74022D42124C3B010F _3ADC7B74022D42124C3B0137">
-            <ownedComment xmi:id="_GmSlQefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D42124C3A024E">
-              <body>This association provides one more reference workflows for a Discipline.  The reference workflows define the most typical ways of doing the work of a Discipline.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D42124C3B0137" name="_discipline" visibility="public" type="_3ADC7B74022D42124BEE00DC" isUnique="false" association="_3ADC7B74022D42124C3A024E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlSOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlR-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A9EFE01CA" memberEnd="_3ADC7B74022D427A9EFF019A _3ADC7B74022D427A9EFF01A4">
-            <ownedEnd xmi:id="_3ADC7B74022D427A9EFF01A4" name="_practice" visibility="public" type="_3ADC7B74022D427A9E86017E" isUnique="false" association="_3ADC7B74022D427A9EFE01CA">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmSlT-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmSlTufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A9F500325" memberEnd="_3ADC7B74022D427A9F520043 _3ADC7B74022D427A9F520045">
-            <ownedComment xmi:id="_GmSlUefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A9F500325">
-              <body>This association can be used to link all kinds of general guidance to the Activity that is being managed as general Supporting Material.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A9F520045" name="_activity" visibility="public" type="_3ADC7B74022D41E0FE930077" isUnique="false" association="_3ADC7B74022D427A9F500325">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmcWNufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmcWNefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A9F8C00C5" memberEnd="_3ADC7B74022D427A9F8D0013 _3ADC7B74022D427A9F8D001D">
-            <ownedComment xmi:id="_GmcWOOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A9F8C00C5">
-              <body>This association provides Activity- (or Process-) specific check points.  These are typically used in reviews and inspections on the work performed.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A9F8D001D" name="_activity" visibility="public" type="_3ADC7B74022D41E0FE930077" isUnique="false" association="_3ADC7B74022D427A9F8C00C5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmcWP-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmcWPufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A9F900252" memberEnd="_3ADC7B74022D427A9F9101A9 _3ADC7B74022D427A9F9101B4">
-            <ownedComment xmi:id="_GmcWQefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A9F900252">
-              <body>This association relates concepts or whitepapers to the Activity providing important background information necessary for doing the work described by the Activity.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A9F9101B4" name="_activity" visibility="public" type="_3ADC7B74022D41E0FE930077" isUnique="false" association="_3ADC7B74022D427A9F900252">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmcWSOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmcWR-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A9F9403B7" memberEnd="_3ADC7B74022D427A9F950322 _3ADC7B74022D427A9F95032C">
-            <ownedComment xmi:id="_GmcWSufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A9F9403B7">
-              <body>This association can provide references to examples relevant to this specific Activity (or Process).  </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A9F95032C" name="_activity" visibility="public" type="_3ADC7B74022D41E0FE930077" isUnique="false" association="_3ADC7B74022D427A9F9403B7">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmlgJufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmlgJefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A9F990383" memberEnd="_3ADC7B74022D427A9F9A02DA _3ADC7B74022D427A9F9A02E4">
-            <ownedComment xmi:id="_GmlgKOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A9F990383">
-              <body>This association provides Activity-specific Guidelines.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A9F9A02E4" name="_activity" visibility="public" type="_3ADC7B74022D41E0FE930077" isUnique="false" association="_3ADC7B74022D427A9F990383">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GmlgL-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GmlgLufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A9F9E0178" memberEnd="_3ADC7B74022D427A9F9F0089 _3ADC7B74022D427A9F9F008B">
-            <ownedComment xmi:id="_GmlgMefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A9F9E0178">
-              <body>This association refers to Reusable Assets specific to this Activity (or Process). </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A9F9F008B" name="_activity" visibility="public" type="_3ADC7B74022D41E0FE930077" isUnique="false" association="_3ADC7B74022D427A9F9E0178"/>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41E0D0ED0104" name="ProcessPackage">
-          <eAnnotations xmi:id="_GnVuHufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F57DC80197">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F57DC80197" type="Class" name="ProcessPackage">
-              <children xmi:id="_G-lJYOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E013F">
-                <children xmi:id="_G-lJY-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-lJZOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-lJZefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-lJZufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-lJZ-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-lJaOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJaefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJaufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJa-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJbOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJbefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJbufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-lJb-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-lJYefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-lJYufXEduqHoOJbURZRw" x="1972" y="1981"/>
-              </children>
-              <children xmi:id="_G-lJtufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0167">
-                <children xmi:id="_G-lJuefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-lJuufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-lJu-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-lJvOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-lJvefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-lJvufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJv-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJwOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJwefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJwufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJw-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJxOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-lJxefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-lJt-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-lJuOfXEduqHoOJbURZRw" x="7266" y="5928" width="4047" height="1117"/>
-              </children>
-              <children xmi:id="_G-lJxufXEduqHoOJbURZRw" element="_3ADC7B74022D4283E8A10341">
-                <children xmi:id="_G-lJyefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-lJyufXEduqHoOJbURZRw" width="3031" height="1134"/>
-                </children>
-                <children xmi:id="_G-lJy-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-lJzOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-lJzefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-lJzufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJz-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJ0OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJ0efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJ0ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJ0-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJ1OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-lJ1efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-lJx-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-lJyOfXEduqHoOJbURZRw" x="2751" y="9135"/>
-              </children>
-              <children xmi:id="_G-lJ1ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0153">
-                <children xmi:id="_G-lJ2efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-lJ2ufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-lJ2-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-lJ3OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-lJ3efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-lJ3ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJ3-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJ4OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJ4efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJ4ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJ4-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-lJ5OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-lJ5efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-lJ1-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-lJ2OfXEduqHoOJbURZRw" x="2506" y="6129" width="3318" height="1769"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GnVuIOfXEduqHoOJbURZRw" description="This diagram shows the definition of Process Package and what elements it can store.  The Process Package package extends Method Package with the new concept of Process Package.  Whereas the special Method Package Content Packages stores core content elements, the Process package is specialized in storing Process Elements.  The separation of Content versus Process Packages enforces the separation of method content versus its application in processes.  Method content is intended be reused in many processes.  Therefore, storing method content and process elements in the same package would easily violate this principle and process models would be become unnecessarily cohesive.  Therefore, UMA enforces the separation of Content and Process by not allowing to store them in the same type of package. "/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G-lJcOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C610035" source="_G-lJYOfXEduqHoOJbURZRw" target="_G-lJYOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-lJc-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-lJdefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-lJdufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-lJdOfXEduqHoOJbURZRw" x="-610" y="-310"/>
-                </children>
-                <children xmi:id="_G-lJd-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_G-lJeefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJeOfXEduqHoOJbURZRw" x="-717" y="-391"/>
-                </children>
-                <children xmi:id="_G-lJeufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_G-lJfOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJe-fXEduqHoOJbURZRw" x="738" y="-353"/>
-                </children>
-                <children xmi:id="_G-lJfefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_G-lJf-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJfufXEduqHoOJbURZRw" x="-328" y="-297"/>
-                </children>
-                <children xmi:id="_G-lJgOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_G-lJgufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJgefXEduqHoOJbURZRw" x="-237" y="-254"/>
-                </children>
-                <children xmi:id="_G-lJg-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_G-lJhefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJhufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJhOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-lJh-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_G-lJiefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJiufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJiOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-lJi-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_G-lJjefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJjufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJjOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G-lJj-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_G-lJkefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJkufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJkOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-lJcefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-lJcufXEduqHoOJbURZRw" points="[847, 502, 847, 502]$[847, 1802, 847, 1802]$[6880, 1802, 6880, 1802]$[6880, 291, 6880, 291]$[1614, 291, 1614, 291]"/>
-              </edges>
-              <edges xmi:id="_G-lJk-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C610049" source="_G-lJYOfXEduqHoOJbURZRw" target="_G-lJYOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-lJlufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-lJmOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-lJmefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-lJl-fXEduqHoOJbURZRw" x="837" y="-508"/>
-                </children>
-                <children xmi:id="_G-lJmufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_G-lJnOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJm-fXEduqHoOJbURZRw" x="1073" y="-871"/>
-                </children>
-                <children xmi:id="_G-lJnefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_G-lJn-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJnufXEduqHoOJbURZRw" x="-686" y="-277"/>
-                </children>
-                <children xmi:id="_G-lJoOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_G-lJoufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJoefXEduqHoOJbURZRw" x="713" y="-308"/>
-                </children>
-                <children xmi:id="_G-lJo-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_G-lJpefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJpOfXEduqHoOJbURZRw" x="-777" y="-330"/>
-                </children>
-                <children xmi:id="_G-lJpufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_G-lJqOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJqefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJp-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-lJqufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_G-lJrOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJrefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJq-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-lJrufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_G-lJsOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJsefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJr-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G-lJsufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_G-lJtOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-lJtefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-lJs-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-lJlOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-lJlefXEduqHoOJbURZRw" points="[1614, 53, 1614, 53]$[6853, 53, 6853, 53]$[6853, -1905, 6853, -1905]$[239, -1905, 239, -1905]$[239, -530, 239, -530]"/>
-              </edges>
-              <edges xmi:id="_G-lJ5ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9102E7" source="_G-lJ1ufXEduqHoOJbURZRw" target="_G-lJYOfXEduqHoOJbURZRw">
-                <children xmi:id="_G-lJ6efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-lJ6-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-lJ7OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-lJ6ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-lJ5-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-lJ6OfXEduqHoOJbURZRw" points="[67, -880, 16, 3335]$[67, -3403, 16, 812]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-u6YOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-u6YefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-u6YufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9103B9" source="_G-lJtufXEduqHoOJbURZRw" target="_G-lJ1ufXEduqHoOJbURZRw">
-                <children xmi:id="_G-u6ZefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-u6Z-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-u6aOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-u6ZufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-u6Y-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-u6ZOfXEduqHoOJbURZRw" points="[-2037, 80, 3255, -79]$[-3625, 80, 1667, -79]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-u6aefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-u6aufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-u6a-fXEduqHoOJbURZRw" element="_3ADC7B74022D4283ED890362" source="_G-lJ1ufXEduqHoOJbURZRw" target="_G-lJxufXEduqHoOJbURZRw">
-                <children xmi:id="_G-u6bufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-u6cOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-u6cefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-u6b-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-u6cufXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D4283ED890364">
-                  <children xmi:id="_G-u6dOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6c-fXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_G-u6defXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4283ED890364">
-                  <children xmi:id="_G-u6d-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6dufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G-u6eOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4283ED890363">
-                  <children xmi:id="_G-u6eufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6eefXEduqHoOJbURZRw" x="-168" y="-187"/>
-                </children>
-                <children xmi:id="_G-u6e-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4283ED890363">
-                  <children xmi:id="_G-u6fefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6fOfXEduqHoOJbURZRw" x="-207" y="1531"/>
-                </children>
-                <children xmi:id="_G-u6fufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4283ED890364">
-                  <children xmi:id="_G-u6gOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6gefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6f-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-u6gufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4283ED890363">
-                  <children xmi:id="_G-u6hOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6hefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6g-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-u6hufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4283ED890364">
-                  <children xmi:id="_G-u6iOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6iefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6h-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G-u6iufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4283ED890363">
-                  <children xmi:id="_G-u6jOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6jefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-u6i-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-u6bOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-u6befXEduqHoOJbURZRw" points="[84, 880, -16, -1811]$[84, 2125, -16, -567]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D410AB660039B" type="Class" name="ProcessComponent">
-              <children xmi:id="_G-u6jufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00E6">
-                <children xmi:id="_G-u6kefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-u6kufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-u6k-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-u6lOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-u6lefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-u6lufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6l-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6mOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6mefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6mufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6m-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6nOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-u6nefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-u6j-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-u6kOfXEduqHoOJbURZRw" x="4089" y="7476"/>
-              </children>
-              <children xmi:id="_G-u6nufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00EF">
-                <children xmi:id="_G-u6oefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-u6oufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-u6o-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-u6pOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-u6pefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-u6pufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6p-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6qOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6qefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6qufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6q-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6rOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-u6refXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-u6n-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-u6oOfXEduqHoOJbURZRw" x="3513" y="4580"/>
-              </children>
-              <children xmi:id="_G-u6t-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0153">
-                <children xmi:id="_G-u6uufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-u6u-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-u6vOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-u6vefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-u6vufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-u6v-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6wOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6wefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6wufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6w-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-u6xOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-u6xefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-u6xufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-u6uOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-u6uefXEduqHoOJbURZRw" x="15392" y="2353"/>
-              </children>
-              <children xmi:id="_G-4EUOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0009">
-                <children xmi:id="_G-4EU-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-4EVOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-4EVefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-4EVufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-4EV-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-4EWOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EWefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4EWufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EW-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4EXOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EXefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4EXufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-4EX-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-4EUefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4EUufXEduqHoOJbURZRw" x="7467" y="10320"/>
-              </children>
-              <children xmi:id="_G-4EaefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0045">
-                <children xmi:id="_G-4EbOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-4EbefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-4EbufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-4Eb-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-4EcOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-4EcefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EcufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4Ec-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EdOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4EdefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EdufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4Ed-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-4EeOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-4EaufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4Ea-fXEduqHoOJbURZRw" x="10312" y="7442"/>
-              </children>
-              <children xmi:id="_G-4EgufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0171">
-                <children xmi:id="_G-4EhefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-4EhufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-4Eh-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-4EiOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-4EiefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-4EiufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4Ei-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4EjOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EjefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4EjufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4Ej-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4EkOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-4EkefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-4Eg-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4EhOfXEduqHoOJbURZRw" x="19558" y="7391"/>
-              </children>
-              <children xmi:id="_G-4E4efXEduqHoOJbURZRw" element="_3ADC7B74022D410581E30342">
-                <children xmi:id="_G-4E5OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-4E5efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G-4E5ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-4E5-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-4E6OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G-4E6efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4E6ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4E6-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4E7OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4E7efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4E7ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G-4E7-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G-4E8OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-4E4ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4E4-fXEduqHoOJbURZRw" x="1151" y="10337"/>
-              </children>
-              <children xmi:id="_G-4E-ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E009F">
-                <children xmi:id="_G-4E_efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G-4E_ufXEduqHoOJbURZRw" width="2675" height="1100"/>
-                </children>
-                <children xmi:id="_G-4E_-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G-4FAOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G-4FAefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_B1UOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1UefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_B1UufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1U-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_B1VOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1VefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_B1VufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_B1V-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G-4E--fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4E_OfXEduqHoOJbURZRw" x="20658" y="1532"/>
-              </children>
-              <children xmi:id="_G_B1WOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0167">
-                <children xmi:id="_G_B1W-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_B1XOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_G_B1XefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_B1XufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_B1X-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_B1YOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1YefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_B1YufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1Y-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_B1ZOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1ZefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_B1ZufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_B1Z-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_B1WefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_B1WufXEduqHoOJbURZRw" x="20209" y="4292"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GnVuIufXEduqHoOJbURZRw" description="This diagram provides an overview to the specification of Process Components."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G-u6rufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C60028F" source="_G-u6jufXEduqHoOJbURZRw" target="_G-u6nufXEduqHoOJbURZRw">
-                <children xmi:id="_G-u6sefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-u6s-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-u6tOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-u6sufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-u6r-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-u6sOfXEduqHoOJbURZRw" points="[0, -558, 0, 2336]$[0, -2345, 0, 550]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-u6tefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-u6tufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-4EYOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0303" source="_G-4EUOfXEduqHoOJbURZRw" target="_G-u6jufXEduqHoOJbURZRw">
-                <children xmi:id="_G-4EY-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-4EZefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-4EZufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4EZOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-4EYefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-4EYufXEduqHoOJbURZRw" points="[-711, -558, 2895, 2286]$[-2912, -2294, 694, 550]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4EZ-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4EaOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-4EeefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F03D6" source="_G-4EaefXEduqHoOJbURZRw" target="_G-u6jufXEduqHoOJbURZRw">
-                <children xmi:id="_G-4EfOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-4EfufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-4Ef-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4EfefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-4EeufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-4Ee-fXEduqHoOJbURZRw" points="[-2032, 8, 5080, -42]$[-5969, 8, 1143, -42]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4EgOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4EgefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-4EkufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9103CD" source="_G-4EUOfXEduqHoOJbURZRw" target="_G-4EgufXEduqHoOJbURZRw">
-                <children xmi:id="_G-4ElefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-4El-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-4EmOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4ElufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-4EmefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9103D0">
-                  <children xmi:id="_G-4Em-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EmufXEduqHoOJbURZRw" x="-1684" y="-294"/>
-                </children>
-                <children xmi:id="_G-4EnOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9103D0">
-                  <children xmi:id="_G-4EnufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EnefXEduqHoOJbURZRw" x="102" y="313"/>
-                </children>
-                <children xmi:id="_G-4En-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9103CE">
-                  <children xmi:id="_G-4EoefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EoOfXEduqHoOJbURZRw" x="1457" y="237"/>
-                </children>
-                <children xmi:id="_G-4EoufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C9103CE">
-                  <children xmi:id="_G-4EpOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4Eo-fXEduqHoOJbURZRw" x="695" y="-347"/>
-                </children>
-                <children xmi:id="_G-4EpefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9103D0">
-                  <children xmi:id="_G-4Ep-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EqOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EpufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-4EqefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9103CE">
-                  <children xmi:id="_G-4Eq-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4ErOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EqufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-4ErefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9103D0">
-                  <children xmi:id="_G-4Er-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EsOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4ErufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G-4EsefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9103CE">
-                  <children xmi:id="_G-4Es-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4EtOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EsufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-4Ek-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-4ElOfXEduqHoOJbURZRw" points="[1371, -93, -11734, 2904]$[13064, -93, -42, 2904]$[13064, -2514, -42, 482]"/>
-              </edges>
-              <edges xmi:id="_G-4EtefXEduqHoOJbURZRw" element="_3ADC7B74022D41016B1A031E" source="_G-4EgufXEduqHoOJbURZRw" target="_G-4EaefXEduqHoOJbURZRw">
-                <children xmi:id="_G-4EuOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-4EuufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-4Eu-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4EuefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-4EvOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41016B1B0219">
-                  <children xmi:id="_G-4EvufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EvefXEduqHoOJbURZRw" x="-252" y="-297"/>
-                </children>
-                <children xmi:id="_G-4Ev-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41016B1B0219">
-                  <children xmi:id="_G-4EwefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EwOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G-4EwufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41016B1B01D3">
-                  <children xmi:id="_G-4ExOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4Ew-fXEduqHoOJbURZRw" x="235" y="194"/>
-                </children>
-                <children xmi:id="_G-4ExefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41016B1B01D3">
-                  <children xmi:id="_G-4Ex-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4ExufXEduqHoOJbURZRw" x="-681" y="-304"/>
-                </children>
-                <children xmi:id="_G-4EyOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41016B1B0219">
-                  <children xmi:id="_G-4EyufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4Ey-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EyefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-4EzOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41016B1B01D3">
-                  <children xmi:id="_G-4EzufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4Ez-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4EzefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G-4E0OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41016B1B0219">
-                  <children xmi:id="_G-4E0ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4E0-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4E0efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G-4E1OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41016B1B01D3">
-                  <children xmi:id="_G-4E1ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G-4E1-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G-4E1efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-4EtufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-4Et-fXEduqHoOJbURZRw" points="[-2387, 50, 7213, -50]$[-7569, 50, 2032, -50]"/>
-              </edges>
-              <edges xmi:id="_G-4E2OfXEduqHoOJbURZRw" element="_3ADC7B74022D4101BD6A023B" source="_G-4EgufXEduqHoOJbURZRw" target="_G-u6nufXEduqHoOJbURZRw">
-                <children xmi:id="_G-4E2-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-4E3efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-4E3ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4E3OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-4E2efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-4E2ufXEduqHoOJbURZRw" points="[-2091, -482, 14621, 2260]$[-2091, -2497, 14621, 245]$[-14994, -2497, 1718, 245]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4E3-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4E4OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G-4E8efXEduqHoOJbURZRw" element="_3ADC7B74022D4105821B0087" source="_G-4E4efXEduqHoOJbURZRw" target="_G-u6jufXEduqHoOJbURZRw">
-                <children xmi:id="_G-4E9OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G-4E9ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G-4E9-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G-4E9efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G-4E8ufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G-4E8-fXEduqHoOJbURZRw" points="[262, -491, -1312, 2302]$[1244, -2243, -330, 550]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4E-OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G-4E-efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G_B1aOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9103B9" source="_G_B1WOfXEduqHoOJbURZRw" target="_G-u6t-fXEduqHoOJbURZRw">
-                <children xmi:id="_G_B1a-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_B1befXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_B1bufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_B1bOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_B1aefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_B1aufXEduqHoOJbURZRw" points="[-1253, -491, 3725, 1439]$[-3699, -1439, 1278, 491]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_B1b-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_B1cOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G_B1cefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9103BA" source="_G-4EgufXEduqHoOJbURZRw" target="_G_B1WOfXEduqHoOJbURZRw">
-                <children xmi:id="_G_B1dOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_B1dufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_B1d-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_B1defXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1eOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9103BD">
-                  <children xmi:id="_G_B1eufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1eefXEduqHoOJbURZRw" x="199" y="-299"/>
-                </children>
-                <children xmi:id="_G_B1e-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9103BD">
-                  <children xmi:id="_G_B1fefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1fOfXEduqHoOJbURZRw" x="137" y="1023"/>
-                </children>
-                <children xmi:id="_G_B1fufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9103BB">
-                  <children xmi:id="_G_B1gOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1f-fXEduqHoOJbURZRw" x="62" y="-160"/>
-                </children>
-                <children xmi:id="_G_B1gefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C9103BB">
-                  <children xmi:id="_G_B1g-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1gufXEduqHoOJbURZRw" x="70" y="1016"/>
-                </children>
-                <children xmi:id="_G_B1hOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9103BD">
-                  <children xmi:id="_G_B1hufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1h-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1hefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1iOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9103BB">
-                  <children xmi:id="_G_B1iufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1i-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1iefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1jOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9103BD">
-                  <children xmi:id="_G_B1jufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1j-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1jefXEduqHoOJbURZRw" x="794" y="978"/>
-                </children>
-                <children xmi:id="_G_B1kOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9103BB">
-                  <children xmi:id="_G_B1kufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1k-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1kefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_B1cufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_B1c-fXEduqHoOJbURZRw" points="[0, -491, 0, 2607]$[0, -2616, 0, 482]"/>
-              </edges>
-              <edges xmi:id="_G_B1lOfXEduqHoOJbURZRw" element="_3ADC7B74022D410589E2004D" source="_G-4E4efXEduqHoOJbURZRw" target="_G_B1WOfXEduqHoOJbURZRw">
-                <children xmi:id="_G_B1l-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_B1mefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_B1mufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_B1mOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1m-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D410589E3013C">
-                  <children xmi:id="_G_B1nefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1nOfXEduqHoOJbURZRw" x="-3872" y="-778"/>
-                </children>
-                <children xmi:id="_G_B1nufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D410589E3013C">
-                  <children xmi:id="_G_B1oOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1n-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G_B1oefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D410589E30114">
-                  <children xmi:id="_G_B1o-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1oufXEduqHoOJbURZRw" x="1733" y="-3000"/>
-                </children>
-                <children xmi:id="_G_B1pOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D410589E30114">
-                  <children xmi:id="_G_B1pufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1pefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G_B1p-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D410589E3013C">
-                  <children xmi:id="_G_B1qefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1qufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1qOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1q-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D410589E30114">
-                  <children xmi:id="_G_B1refXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1rufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1rOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1r-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D410589E3013C">
-                  <children xmi:id="_G_B1sefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1sufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1sOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G_B1s-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D410589E30114">
-                  <children xmi:id="_G_B1tefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1tufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1tOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_B1lefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_B1lufXEduqHoOJbURZRw" points="[338, 482, -17949, 6527]$[338, 1642, -17949, 7687]$[23554, 1642, 5266, 7687]$[23554, -6256, 5266, -211]$[20023, -6256, 1735, -211]"/>
-              </edges>
-              <edges xmi:id="_G_B1t-fXEduqHoOJbURZRw" element="_3ADC7B74022D427BF43901BB" source="_G_B1WOfXEduqHoOJbURZRw" target="_G-4E-ufXEduqHoOJbURZRw">
-                <children xmi:id="_G_B1uufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_B1vOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_B1vefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_B1u-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1vufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427BF43A039D">
-                  <children xmi:id="_G_B1wOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1v-fXEduqHoOJbURZRw" x="414" y="192"/>
-                </children>
-                <children xmi:id="_G_B1wefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427BF43A039D">
-                  <children xmi:id="_G_B1w-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1wufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_G_B1xOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427BF43A032F">
-                  <children xmi:id="_G_B1xufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1xefXEduqHoOJbURZRw" x="-238" y="185"/>
-                </children>
-                <children xmi:id="_G_B1x-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427BF43A032F">
-                  <children xmi:id="_G_B1yefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1yOfXEduqHoOJbURZRw" x="-209" y="-736"/>
-                </children>
-                <children xmi:id="_G_B1yufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427BF43A039D">
-                  <children xmi:id="_G_B1zOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B1zefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1y-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B1zufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427BF43A032F">
-                  <children xmi:id="_G_B10OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B10efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B1z-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_G_B10ufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427BF43A039D">
-                  <children xmi:id="_G_B11OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B11efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B10-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_G_B11ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427BF43A032F">
-                  <children xmi:id="_G_B12OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_B12efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_G_B11-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_B1uOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_B1uefXEduqHoOJbURZRw" points="[50, -482, 0, 2209]$[50, -2142, 0, 550]"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_Gm5CI-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41E0D0ED0104">
-            <body>03</body>
-          </ownedComment>
-          <packageMerge xmi:id="_r0VRIOxhEduHje3pPahN4A" mergedPackage="_3ADC7B74022D41DF2A1B02E7"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0167" name="ProcessComponent">
-            <ownedComment xmi:id="_Gm5CLefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0167">
-              <body>A Process Component is a special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
-UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a &quot;black box&quot;.  At any point during a project the component &quot;realization&quot; detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C9103B9" general="_3ADC7B74022D40F36C5E0153">
-              <eAnnotations xmi:id="_oCQpcO-dEdu5OOejy0624w" source="http://www.eclipse.org/uml2/2.0.0/UML">
-                <details xmi:id="_oCQpce-dEdu5OOejy0624w" key="extend"/>
-              </eAnnotations>
-            </generalization>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9103BD" name="interfaces" visibility="public" type="_3ADC7B74022D40F36C5E0171" association="_3ADC7B74022D40F36C9103BA">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnCMIufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnCMIefXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427BF43A032F" name="process" visibility="public" type="_3ADC7B74022D40F36C5E009F" aggregation="composite" association="_3ADC7B74022D427BF43901BB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnVuE-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnVuEufXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D410581E30342" name="ProcessComponentDescriptor">
-            <ownedComment xmi:id="_Gm5CMefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D410581E30342">
-              <body>A Process Component Descriptor represents a Process Component application in a Process, i.e. the breakdown structure defining the Process.  The Process Component Descriptor is used to encapsulate the details of the component in a breakdown structure and to provide its own set of relationships such as it own predecessors and successors.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4105821B0087" general="_3ADC7B74022D40F36C5E00E6"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D410589E30114" name="_processComponent" visibility="public" type="_3ADC7B74022D40F36C5E0167" isUnique="false" association="_3ADC7B74022D410589E2004D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnL9JefXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnL9JOfXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0171" name="ProcessComponentInterface">
-            <ownedComment xmi:id="_GnCME-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0171">
-              <body>A Process Component Interface comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4101BD6A023B" general="_3ADC7B74022D40F36C5E00EF"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9103D0" name="interfaceSpecifications" visibility="public" type="_3ADC7B74022D40F36C5E0009" aggregation="composite" association="_3ADC7B74022D40F36C9103CD">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnL9FufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnL9FefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41016B1B01D3" name="interfaceIO" visibility="public" type="_3ADC7B74022D40F36C5E0045" aggregation="composite" association="_3ADC7B74022D41016B1A031E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnL9HOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnL9G-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0153" name="ProcessPackage">
-            <ownedComment xmi:id="_GnCMF-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0153">
-              <body>Process Package is a special Method Package that contains Process Elements, only.
-A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C9102E7" general="_3ADC7B74022D40F36C5E013F"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D4283ED890363" name="processElements" visibility="public" type="_3ADC7B74022D4283E8A10341" aggregation="composite" association="_3ADC7B74022D4283ED890362">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnVuHOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnVuG-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C9103BA" memberEnd="_3ADC7B74022D40F36C9103BB _3ADC7B74022D40F36C9103BD">
-            <ownedComment xmi:id="_GnCMG-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C9103BA">
-              <body>This association describes the realization relationships between a Process Component and a Process Component Interface.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C9103BB" name="realizedBy" visibility="public" type="_3ADC7B74022D40F36C5E0167" association="_3ADC7B74022D40F36C9103BA">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnCMH-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnCMHufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C9103CD" memberEnd="_3ADC7B74022D40F36C9103CE _3ADC7B74022D40F36C9103D0">
-            <ownedComment xmi:id="_GnCMJOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C9103CD">
-              <body>Instances of this association contain the list of Task Descriptors that represent a Process Component Interface.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C9103CE" name="_processComponentInterface" visibility="private" type="_3ADC7B74022D40F36C5E0171" isUnique="false" association="_3ADC7B74022D40F36C9103CD">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnL9E-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnL9EufXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41016B1A031E" memberEnd="_3ADC7B74022D41016B1B01D3 _3ADC7B74022D41016B1B0219">
-            <ownedComment xmi:id="_GnL9GOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41016B1A031E">
-              <body>This association contains the input and output Work Product type instances used for the interface specification.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41016B1B0219" name="_processComponentInterface" visibility="public" type="_3ADC7B74022D40F36C5E0171" isUnique="false" association="_3ADC7B74022D41016B1A031E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnL9H-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnL9HufXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D410589E2004D" memberEnd="_3ADC7B74022D410589E30114 _3ADC7B74022D410589E3013C">
-            <ownedComment xmi:id="_GnL9IefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D410589E2004D">
-              <body>This association represents the reference from the descriptor to the Process Component it refers to.  A Process Component Descriptor represents exactly one Process Component.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D410589E3013C" name="_processComponentDescriptor" visibility="public" type="_3ADC7B74022D410581E30342" isUnique="false" association="_3ADC7B74022D410589E2004D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnL9KOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnL9J-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427BF43901BB" memberEnd="_3ADC7B74022D427BF43A032F _3ADC7B74022D427BF43A039D">
-            <ownedComment xmi:id="_GnL9KufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427BF43901BB">
-              <body>A Process Component contains only exactly one Process.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427BF43A039D" name="_processComponent" visibility="public" type="_3ADC7B74022D40F36C5E0167" isUnique="false" association="_3ADC7B74022D427BF43901BB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GnVuFufXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GnVuFefXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4283ED890362" memberEnd="_3ADC7B74022D4283ED890363 _3ADC7B74022D4283ED890364">
-            <ownedComment xmi:id="_GnVuGOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4283ED890362">
-              <body>A Process Package contains Process Elements which are used to define Breakdown and Processes.  A Process Element instance can be part of only one Process Package instance.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4283ED890364" name="_processPackage" visibility="public" type="_3ADC7B74022D40F36C5E0153" isUnique="false" association="_3ADC7B74022D4283ED890362"/>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41DF2A1B02E7" name="ProcessDescriptions">
-          <eAnnotations xmi:id="_GoOe5-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41ED682B0170">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41ED682B0170" type="Class" name="Main">
-              <children xmi:id="_G_LmdufXEduqHoOJbURZRw" element="_3ADC7B74022D41E104110387">
-                <children xmi:id="_G_LmeefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_LmeufXEduqHoOJbURZRw" width="3437" height="1998"/>
-                </children>
-                <children xmi:id="_G_Lme-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_LmfOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_LmfefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_LmfufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lmf-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmgOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_LmgefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmgufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lmg-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmhOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_LmhefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_Lmd-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_LmeOfXEduqHoOJbURZRw" x="5393" y="8805"/>
-              </children>
-              <children xmi:id="_G_LmhufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0D1B600D8">
-                <children xmi:id="_G_LmiefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_LmiufXEduqHoOJbURZRw" width="5147" height="1151"/>
-                </children>
-                <children xmi:id="_G_Lmi-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_LmjOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_LmjefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_LmjufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lmj-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmkOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_LmkefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmkufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lmk-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmlOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_LmlefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_Lmh-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_LmiOfXEduqHoOJbURZRw" x="2353" y="6383"/>
-              </children>
-              <children xmi:id="_G_LmlufXEduqHoOJbURZRw" element="_3ADC7B74022D41E104550208">
-                <children xmi:id="_G_LmmefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_LmmufXEduqHoOJbURZRw" width="5435" height="3268"/>
-                </children>
-                <children xmi:id="_G_Lmm-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_LmnOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_LmnefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_LmnufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lmn-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmoOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_LmoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmoufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lmo-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmpOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_LmpefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_Lml-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_LmmOfXEduqHoOJbURZRw" x="4550" y="14549"/>
-              </children>
-              <children xmi:id="_G_LmpufXEduqHoOJbURZRw" element="_3ADC7B74022D41E10474011A">
-                <children xmi:id="_G_LmqefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_LmqufXEduqHoOJbURZRw" width="3539" height="1998"/>
-                </children>
-                <children xmi:id="_G_Lmq-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_LmrOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_LmrefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_LmrufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lmr-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmsOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_LmsefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmsufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Lms-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_LmtOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_LmtefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_Lmp-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_LmqOfXEduqHoOJbURZRw" x="5342" y="11954"/>
-              </children>
-              <children xmi:id="_G_UwQOfXEduqHoOJbURZRw" element="_3ADC7B74022D41ED7B490086">
-                <children xmi:id="_G_UwQ-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_UwROfXEduqHoOJbURZRw" width="4436" height="1151"/>
-                </children>
-                <children xmi:id="_G_UwRefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_UwRufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_UwR-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_UwSOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwSefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwSufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwS-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwTOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwTefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwTufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_UwT-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_UwQefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwQufXEduqHoOJbURZRw" x="575" y="8822"/>
-              </children>
-              <children xmi:id="_G_UwUOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4A970123">
-                <children xmi:id="_G_UwU-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_UwVOfXEduqHoOJbURZRw" width="4182" height="1540"/>
-                </children>
-                <children xmi:id="_G_UwVefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_UwVufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_UwV-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_UwWOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwWefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwWufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwW-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwXOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwXefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwXufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_UwX-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_UwUefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwUufXEduqHoOJbURZRw" x="2755" y="1395"/>
-              </children>
-              <children xmi:id="_G_UwhOfXEduqHoOJbURZRw" element="_3ADC7B74022D42797F740392">
-                <children xmi:id="_G_Uwh-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_G_UwiOfXEduqHoOJbURZRw" width="4538" height="1540"/>
-                </children>
-                <children xmi:id="_G_UwiefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_G_UwiufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_G_Uwi-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_G_UwjOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwjefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwjufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_Uwj-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwkOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_G_UwkefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_G_UwkufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_G_Uwk-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_G_UwhefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwhufXEduqHoOJbURZRw" x="2658" y="3598"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GoOe6efXEduqHoOJbURZRw" description="The definition of textual description attributes are handled differently for Processes than for Method Core Content Elements.  The rationale for this can be found in package Method Units in which the granularity of Method Units for these elements has been defined differently.  Whereas a Content Description Method Unit is created for every Content Element, Process is maintained as a whole in a Process Component Method Unit.  Therefore the package Method Core Description contains a taxonomy of special Content Description specialization and the Process Descriptions package contains extended version of classes defined in the Process package which merge new attributes for description into these classes via package merge."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_G_UwYOfXEduqHoOJbURZRw" element="_3ADC7B74022D42798C8003BA" source="_G_LmpufXEduqHoOJbURZRw" target="_G_LmdufXEduqHoOJbURZRw">
-                <children xmi:id="_G_UwY-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_UwZefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_UwZufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwZOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_UwYefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_UwYufXEduqHoOJbURZRw" points="[0, -1007, 0, 2142]$[0, -2150, 0, 999]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UwZ-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UwaOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G_UwaefXEduqHoOJbURZRw" element="_3ADC7B74022D42798CA402D1" source="_G_LmlufXEduqHoOJbURZRw" target="_G_LmpufXEduqHoOJbURZRw">
-                <children xmi:id="_G_UwbOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_UwbufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_Uwb-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwbefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_UwaufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_Uwa-fXEduqHoOJbURZRw" points="[-50, -1642, 0, 2116]$[-50, -2760, 0, 999]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UwcOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UwcefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G_UwcufXEduqHoOJbURZRw" element="_3ADC7B74022D42798CE902CA" source="_G_UwQOfXEduqHoOJbURZRw" target="_G_LmhufXEduqHoOJbURZRw">
-                <children xmi:id="_G_UwdefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_Uwd-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_UweOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwdufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_Uwc-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_UwdOfXEduqHoOJbURZRw" points="[855, -584, -1278, 1854]$[855, -1862, -1278, 575]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UweefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UweufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G_Uwe-fXEduqHoOJbURZRw" element="_3ADC7B74022D42798C6F0197" source="_G_LmdufXEduqHoOJbURZRw" target="_G_LmhufXEduqHoOJbURZRw">
-                <children xmi:id="_G_UwfufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_UwgOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_UwgefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_Uwf-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_UwfOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_UwfefXEduqHoOJbURZRw" points="[-414, -1007, 1769, 1837]$[-414, -2277, 1769, 567]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UwgufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_Uwg-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_G_UwnefXEduqHoOJbURZRw" element="_3ADC7B74022D42798CCC036A" source="_G_LmhufXEduqHoOJbURZRw" target="_G_UwhOfXEduqHoOJbURZRw">
-                <children xmi:id="_G_UwoOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_G_UwoufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_G_Uwo-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_G_UwoefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_G_UwnufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_G_Uwn-fXEduqHoOJbURZRw" points="[-8, -575, -8, 2015]$[-8, -1820, -8, 770]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UwpOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_G_UwpefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_Gne4DufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DF2A1B02E7">
-            <body>04</body>
-          </ownedComment>
-          <packageMerge xmi:id="_IZt_MOxMEduONrMRgmz48A" mergedPackage="_3ADC7B74022D40FD891F02CD"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41E0D1B600D8" name="BreakdownElementDescription">
-            <generalization xmi:id="_3ADC7B74022D42798CCC036A" general="_3ADC7B74022D42797F740392"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D4137627D0084" name="usageGuidance" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gne4G-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4137627D0084">
-                <body>Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_FYbrweyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_FYbrwOyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_FQYjAOyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41E104110387" name="ActivityDescription">
-            <generalization xmi:id="_3ADC7B74022D42798C6F0197" general="_3ADC7B74022D41E0D1B600D8"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E02E4" name="purpose" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GnopBOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E02E4">
-                <body>Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_7JEUweyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_7JEUwOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_6_PDUOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E0352" name="alternatives" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gnxy8ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0352">
-                <body>Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ZbnYIeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ZbnYIOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_ZS-ZgOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41376283015A" name="howtoStaff" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gnxy9efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41376283015A">
-                <body>Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_XTr3weyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_XTr3wOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_XKJhQOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41E104550208" name="DeliveryProcessDescription">
-            <generalization xmi:id="_3ADC7B74022D42798CA402D1" general="_3ADC7B74022D41E10474011A"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E0371" name="scale" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gnxy-ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0371">
-                <body>Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_clM0seyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_clM0sOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_caeLYOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E037A" name="projectCharacteristics" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gnxy_efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E037A">
-                <body>Characterizes the project that would typically perform this Process</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_6LOzgeyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_6LOzgOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_6DLqwOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E0384" name="riskLevel" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gn7j8ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0384">
-                <body>Outlines typical project risks that are addressed with this process.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_gVvRoeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_gVvRoOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_g6Ps4OyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E0385" name="estimatingTechnique" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gn7j9efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0385">
-                <body>Describes the Estimation Techniques provided for this Process.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_YZwSgeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_YZwSgOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_YPUkIOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E038E" name="projectMemberExpertise" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gn7j-OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E038E">
-                <body>Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-k7CgeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-k7CgOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_-aMZMOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E0398" name="typeOfContract" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gn7j--fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0398">
-                <body>Provides background information about the contracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_IL1ngeyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_IL1ngOyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_IEissOyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41E10474011A" name="ProcessDescription">
-            <generalization xmi:id="_3ADC7B74022D42798C8003BA" general="_3ADC7B74022D41E104110387"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03AC" name="scope" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GoFU8-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03AC">
-                <body>Defines the scope of the Process, i.e. which types of projects does it address and which not.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_eEmVceyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_eEmVcOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_d7Nv8OyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5E03AD" name="usageNotes" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GoFU9ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E03AD">
-                <body>Any additional notes on how to apply and instantiate this process for a project.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_u1ANAeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_u1ANAOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_urd2gOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41ED7B490086" name="DescriptorDescription">
-            <generalization xmi:id="_3ADC7B74022D42798CE902CA" general="_3ADC7B74022D41E0D1B600D8"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D41ED7B650394" name="refinedDescription" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GoFU--fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41ED7B650394">
-                <body>A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. </body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_HSeWkeyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_HSeWkOyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_HKbN0OyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42375E040390" memberEnd="_3ADC7B74022D42375E050173 _3ADC7B74022D42375E050175">
-            <ownedComment xmi:id="_GoFU_ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D42375E040390">
-              <body>List the steps that have been selected to be performed for the instance of the Task Descriptor.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D42375E050175" name="_taskDescriptor" visibility="public" type="_3ADC7B74022D40F36C5E0009" isUnique="false" association="_3ADC7B74022D42375E040390">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GoOe5ufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GoOe5efXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-        </packagedElement>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C5E00FB" name="MethodPlugin">
-        <eAnnotations xmi:id="_GpH2wOfXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F57AC8035E">
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F57AC8035E" type="Class" name="MethodPlugin">
-            <children xmi:id="_HAz-AOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0104">
-              <children xmi:id="_HAz-A-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAz-BOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HAz-BefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAz-BufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAz-B-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAz-COfXEduqHoOJbURZRw" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-CefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-CufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-C-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-DOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-DefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-DufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAz-D-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAz-AefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAz-AufXEduqHoOJbURZRw" x="13495" y="3843"/>
-            </children>
-            <children xmi:id="_HAz-M-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E013F">
-              <children xmi:id="_HAz-NufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAz-N-fXEduqHoOJbURZRw" width="4504" height="1625"/>
-              </children>
-              <children xmi:id="_HAz-OOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAz-OefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAz-OufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAz-O-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-POfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-PefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-PufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-P-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-QOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-QefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAz-QufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAz-NOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAz-NefXEduqHoOJbURZRw" x="4504" y="3708"/>
-            </children>
-            <children xmi:id="_HAz-iefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-              <children xmi:id="_HAz-jOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HAz-jefXEduqHoOJbURZRw" width="2827" height="1049"/>
-              </children>
-              <children xmi:id="_HAz-jufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HAz-j-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HAz-kOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HAz-kefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-kufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-k-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-lOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-lefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-lufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HAz-l-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HAz-mOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HAz-iufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAz-i-fXEduqHoOJbURZRw" x="10219" y="999"/>
-            </children>
-            <children xmi:id="_HA9vD-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFA3602C1">
-              <children xmi:id="_HA9vEufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HA9vE-fXEduqHoOJbURZRw" width="2506" height="1134"/>
-              </children>
-              <children xmi:id="_HA9vFOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HA9vFefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HA9vFufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HA9vF-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vGOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HA9vGefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vGufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HA9vG-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vHOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HA9vHefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HA9vHufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HA9vEOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vEefXEduqHoOJbURZRw" x="10176" y="6646"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GpH2wufXEduqHoOJbURZRw" description="This diagrams shows the definition of Method Plugins. Method Plugins extend each other and are the container of all Method Packages."/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_HAz-EOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6002E7" source="_HAz-AOfXEduqHoOJbURZRw" target="_HAz-AOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAz-E-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAz-FefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAz-FufXEduqHoOJbURZRw" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAz-FOfXEduqHoOJbURZRw" x="998" y="317"/>
-              </children>
-              <children xmi:id="_HAz-F-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C6002EA">
-                <children xmi:id="_HAz-GefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-GOfXEduqHoOJbURZRw" x="482" y="769"/>
-              </children>
-              <children xmi:id="_HAz-GufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C6002EA">
-                <children xmi:id="_HAz-HOfXEduqHoOJbURZRw" type="ToRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-G-fXEduqHoOJbURZRw" x="-387" y="778"/>
-              </children>
-              <children xmi:id="_HAz-HefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C6002E8">
-                <children xmi:id="_HAz-H-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-HufXEduqHoOJbURZRw" x="-1382" y="271"/>
-              </children>
-              <children xmi:id="_HAz-IOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C6002E8">
-                <children xmi:id="_HAz-IufXEduqHoOJbURZRw" type="FromRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-IefXEduqHoOJbURZRw" x="-792" y="-303"/>
-              </children>
-              <children xmi:id="_HAz-I-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C6002EA">
-                <children xmi:id="_HAz-JefXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-JufXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-JOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-J-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C6002E8">
-                <children xmi:id="_HAz-KefXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-KufXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-KOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-K-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C6002EA">
-                <children xmi:id="_HAz-LefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-LufXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-LOfXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <children xmi:id="_HAz-L-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C6002E8">
-                <children xmi:id="_HAz-MefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-MufXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-MOfXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAz-EefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAz-EufXEduqHoOJbURZRw" points="[2607, -245, 2607, -245]$[4817, -245, 4817, -245]$[4817, 1837, 4817, 1837]$[550, 1837, 550, 1837]$[550, 575, 550, 575]"/>
-            </edges>
-            <edges xmi:id="_HAz-Q-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6002D5" source="_HAz-M-fXEduqHoOJbURZRw" target="_HAz-AOfXEduqHoOJbURZRw">
-              <children xmi:id="_HAz-RufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAz-SOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAz-SefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAz-R-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-SufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C6002D8">
-                <children xmi:id="_HAz-TOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-S-fXEduqHoOJbURZRw" x="-123" y="364"/>
-              </children>
-              <children xmi:id="_HAz-TefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C6002D8">
-                <children xmi:id="_HAz-T-fXEduqHoOJbURZRw" type="ToRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-TufXEduqHoOJbURZRw" x="1139" y="-288"/>
-              </children>
-              <children xmi:id="_HAz-UOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C6002D6">
-                <children xmi:id="_HAz-UufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-UefXEduqHoOJbURZRw" x="436" y="457"/>
-              </children>
-              <children xmi:id="_HAz-U-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C6002D6">
-                <children xmi:id="_HAz-VefXEduqHoOJbURZRw" type="FromRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-VOfXEduqHoOJbURZRw" x="225" y="-347"/>
-              </children>
-              <children xmi:id="_HAz-VufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C6002D8">
-                <children xmi:id="_HAz-WOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-WefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-V-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-WufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C6002D6">
-                <children xmi:id="_HAz-XOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-XefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-W-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-XufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C6002D8">
-                <children xmi:id="_HAz-YOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-YefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-X-fXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <children xmi:id="_HAz-YufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C6002D6">
-                <children xmi:id="_HAz-ZOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-ZefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-Y-fXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAz-ROfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAz-RefXEduqHoOJbURZRw" points="[2252, -127, -7095, -25]$[6739, -127, -2607, -25]"/>
-            </edges>
-            <edges xmi:id="_HAz-ZufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C610049" source="_HAz-M-fXEduqHoOJbURZRw" target="_HAz-M-fXEduqHoOJbURZRw">
-              <children xmi:id="_HAz-aefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HAz-a-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HAz-bOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HAz-aufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-befXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C61004C">
-                <children xmi:id="_HAz-b-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-bufXEduqHoOJbURZRw" x="452" y="-855"/>
-              </children>
-              <children xmi:id="_HAz-cOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C61004C">
-                <children xmi:id="_HAz-cufXEduqHoOJbURZRw" type="ToRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-cefXEduqHoOJbURZRw" x="-1200" y="-887"/>
-              </children>
-              <children xmi:id="_HAz-c-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C61004A">
-                <children xmi:id="_HAz-defXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-dOfXEduqHoOJbURZRw" x="-1271" y="-233"/>
-              </children>
-              <children xmi:id="_HAz-dufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C61004A">
-                <children xmi:id="_HAz-eOfXEduqHoOJbURZRw" type="FromRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-d-fXEduqHoOJbURZRw" x="-221" y="323"/>
-              </children>
-              <children xmi:id="_HAz-eefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C61004C">
-                <children xmi:id="_HAz-e-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-fOfXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-eufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-fefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C61004A">
-                <children xmi:id="_HAz-f-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-gOfXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-fufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HAz-gefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C61004C">
-                <children xmi:id="_HAz-g-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-hOfXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-gufXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <children xmi:id="_HAz-hefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C61004A">
-                <children xmi:id="_HAz-h-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HAz-iOfXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HAz-hufXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAz-Z-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAz-aOfXEduqHoOJbURZRw" points="[-2252, 50, -2252, 50]$[-4487, 50, -4487, 50]$[-4487, 1862, -4487, 1862]$[-1219, 1862, -1219, 1862]$[-1219, 812, -1219, 812]"/>
-            </edges>
-            <edges xmi:id="_HAz-mefXEduqHoOJbURZRw" element="_3ADC7B74022D41FAD5F8038E" source="_HAz-M-fXEduqHoOJbURZRw" target="_HAz-iefXEduqHoOJbURZRw">
-              <children xmi:id="_HA9vAOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HA9vAufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HA9vA-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vAefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HAz-mufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HAz-m-fXEduqHoOJbURZRw" points="[1312, -821, -3564, 2175]$[4004, -2472, -872, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vBOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vBefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HA9vBufXEduqHoOJbURZRw" element="_3ADC7B74022D41FADC01028D" source="_HAz-AOfXEduqHoOJbURZRw" target="_HAz-iefXEduqHoOJbURZRw">
-              <children xmi:id="_HA9vCefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HA9vC-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HA9vDOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vCufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HA9vB-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HA9vCOfXEduqHoOJbURZRw" points="[-889, -584, 3581, 2311]$[-3649, -2370, 821, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vDefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vDufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HA9vH-fXEduqHoOJbURZRw" element="_3ADC7B74022D41E0CC0A01D7" source="_HAz-M-fXEduqHoOJbURZRw" target="_HA9vD-fXEduqHoOJbURZRw">
-              <children xmi:id="_HA9vIufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HA9vJOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HA9vJefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vI-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HA9vIOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HA9vIefXEduqHoOJbURZRw" points="[1413, 812, -3259, -1879]$[3691, 2116, -982, -575]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vJufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vJ-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HA9vKOfXEduqHoOJbURZRw" element="_3ADC7B74022D42518BD701E3" source="_HAz-AOfXEduqHoOJbURZRw" target="_HA9vD-fXEduqHoOJbURZRw">
-              <children xmi:id="_HA9vK-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HA9vLefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HA9vLufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vLOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HA9vKefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HA9vKufXEduqHoOJbURZRw" points="[-990, 575, 3683, -2218]$[-3742, 2218, 931, -575]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vL-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HA9vMOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-          </contents>
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F9C5F002E1" type="Class" name="VariabilityElement">
-            <children xmi:id="_HA9vMefXEduqHoOJbURZRw" type="Note">
-              <children xmi:id="_HA9vNOfXEduqHoOJbURZRw" type="DiagramName">
-                <element xsi:nil="true"/>
-              </children>
-              <children xmi:id="_HA9vNefXEduqHoOJbURZRw" type="Description">
-                <element xsi:nil="true"/>
-              </children>
-              <styles xmi:type="notation:ShapeStyle" xmi:id="_HA9vMufXEduqHoOJbURZRw" fontName="Arial" fontHeight="8" description="{variabilitySpecialElement.type() == variabilityBasedOnElement.type()} : {varability can only be defined between ContentElements of the same subtype, e.g. Roles with Roles, but not Roles and Tasks}" lineColor="0"/>
-              <element xsi:nil="true"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vM-fXEduqHoOJbURZRw" x="6723" y="7788" width="9596" height="1625"/>
-            </children>
-            <children xmi:id="_HA9vNufXEduqHoOJbURZRw" element="_3ADC7B74022D40F6B00202EC">
-              <children xmi:id="_HA9vOefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HA9vOufXEduqHoOJbURZRw" width="2912" height="4165"/>
-              </children>
-              <children xmi:id="_HA9vO-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HA9vPOfXEduqHoOJbURZRw" type="Kind"/>
-              <children xmi:id="_HA9vPefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HA9vPufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HA9vP-fXEduqHoOJbURZRw" type="EnumerationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vQOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HA9vQefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vQufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HA9vQ-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vROfXEduqHoOJbURZRw"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HA9vN-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vOOfXEduqHoOJbURZRw" x="13195" y="2205"/>
-            </children>
-            <children xmi:id="_HA9vRefXEduqHoOJbURZRw" element="_3ADC7B74022D41DE495001F5">
-              <children xmi:id="_HA9vSOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HA9vSefXEduqHoOJbURZRw" width="4961" height="1574"/>
-              </children>
-              <children xmi:id="_HA9vSufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HA9vS-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HA9vTOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HA9vTefXEduqHoOJbURZRw" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vTufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HA9vT-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HA9vUOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHgAOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBHgAefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHgAufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HBHgA-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HA9vRufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" showListSignature="true" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HA9vR-fXEduqHoOJbURZRw" x="2389" y="1159"/>
-            </children>
-            <children xmi:id="_HBHgiefXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4962020F">
-              <children xmi:id="_HBHgjOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HBHgjefXEduqHoOJbURZRw" width="2878" height="905"/>
-              </children>
-              <children xmi:id="_HBHgjufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HBHgj-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HBHgkOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HBHgkefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBHgkufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHgk-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBHglOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHglefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBHglufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHgl-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HBHgmOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HBHgiufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBHgi-fXEduqHoOJbURZRw" x="1063" y="9738"/>
-            </children>
-            <children xmi:id="_HBHgmefXEduqHoOJbURZRw" element="_3ADC7B74022D421E886803E5">
-              <children xmi:id="_HBHgnOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HBHgnefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HBHgnufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HBHgn-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HBHgoOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HBHgoefXEduqHoOJbURZRw" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBHgoufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHgo-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBHgpOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHgpefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBHgpufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBHgp-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HBHgqOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HBHgmufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" showListSignature="true" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBHgm-fXEduqHoOJbURZRw" x="1766" y="4194" width="6985" height="1583"/>
-            </children>
-            <children xmi:id="_HBQqRefXEduqHoOJbURZRw" element="_3ADC7B74022D427AA0AE039D">
-              <children xmi:id="_HBQqSOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HBQqSefXEduqHoOJbURZRw" width="1574" height="905"/>
-              </children>
-              <children xmi:id="_HBQqSufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HBQqS-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HBQqTOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HBQqTefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqTufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBQqT-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqUOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBQqUefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqUufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBQqU-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HBQqVOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HBQqRufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBQqR-fXEduqHoOJbURZRw" x="3035" y="8295"/>
-            </children>
-            <children xmi:id="_HBQqZ-fXEduqHoOJbURZRw" element="_3ADC7B74022D427955450134">
-              <children xmi:id="_HBQqaufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HBQqa-fXEduqHoOJbURZRw" width="1574" height="905"/>
-              </children>
-              <children xmi:id="_HBQqbOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HBQqbefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HBQqbufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HBQqb-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqcOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBQqcefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqcufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBQqc-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqdOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HBQqdefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HBQqdufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HBQqaOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBQqaefXEduqHoOJbURZRw" x="4517" y="9714"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GpH2xOfXEduqHoOJbURZRw" description="This diagram shows how content elements can define variations of one and another.  "/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_HBHgqefXEduqHoOJbURZRw" element="_3ADC7B74022D41DE587A03A0" source="_HBHgmefXEduqHoOJbURZRw" target="_HBHgmefXEduqHoOJbURZRw">
-              <children xmi:id="_HBHgrOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HBHgrufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HBHgr-fXEduqHoOJbURZRw" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBHgrefXEduqHoOJbURZRw" x="-1203" y="-349"/>
-              </children>
-              <children xmi:id="_HBQp8OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DE587A03A2">
-                <children xmi:id="_HBQp8ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQp8efXEduqHoOJbURZRw" x="1287" y="-264"/>
-              </children>
-              <children xmi:id="_HBQp8-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41DE587A03A2">
-                <children xmi:id="_HBQp9efXEduqHoOJbURZRw" type="ToRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQp9OfXEduqHoOJbURZRw" x="-604" y="236"/>
-              </children>
-              <children xmi:id="_HBQp9ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DE587A03A1">
-                <children xmi:id="_HBQp-OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQp9-fXEduqHoOJbURZRw" x="-706" y="-320"/>
-              </children>
-              <children xmi:id="_HBQp-efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41DE587A03A1">
-                <children xmi:id="_HBQp--fXEduqHoOJbURZRw" type="FromRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQp-ufXEduqHoOJbURZRw" x="942" y="281"/>
-              </children>
-              <children xmi:id="_HBQp_OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DE587A03A2">
-                <children xmi:id="_HBQp_ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQp_-fXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQp_efXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HBQqAOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DE587A03A1">
-                <children xmi:id="_HBQqAufXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqA-fXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqAefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HBQqBOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DE587A03A2">
-                <children xmi:id="_HBQqBufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqB-fXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqBefXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <children xmi:id="_HBQqCOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DE587A03A1">
-                <children xmi:id="_HBQqCufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqC-fXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqCefXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HBHgqufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HBHgq-fXEduqHoOJbURZRw" points="[855, 787, 855, 787]$[855, 1651, 855, 1651]$[6680, 1651, 6680, 1651]$[6680, -50, 6680, -50]$[3488, -50, 3488, -50]"/>
-            </edges>
-            <edges xmi:id="_HBQqDOfXEduqHoOJbURZRw" type="NoteAttachment" source="_HA9vMefXEduqHoOJbURZRw" target="_HBHgqefXEduqHoOJbURZRw">
-              <styles xmi:type="notation:ConnectorStyle" xmi:id="_HBQqDefXEduqHoOJbURZRw" lineColor="0"/>
-              <element xsi:nil="true"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HBQqDufXEduqHoOJbURZRw" points="[-127, -821, 186, 1439]$[-313, -2260, 0, 0]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBQqD-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBQqEOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HBQqI-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DE58B6018B" source="_HBHgiefXEduqHoOJbURZRw" target="_HBHgmefXEduqHoOJbURZRw">
-              <children xmi:id="_HBQqJufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HBQqKOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HBQqKefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBQqJ-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HBQqJOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HBQqJefXEduqHoOJbURZRw" points="[795, -448, -1744, 4783]$[795, -4453, -1744, 778]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBQqKufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBQqK-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HBQqXufXEduqHoOJbURZRw" element="_3ADC7B74022D427AA0D30245" source="_HBQqRefXEduqHoOJbURZRw" target="_HBHgmefXEduqHoOJbURZRw">
-              <children xmi:id="_HBQqYefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HBQqY-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HBQqZOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBQqYufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HBQqX-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HBQqYOfXEduqHoOJbURZRw" points="[159, -317, -1455, 3307]$[159, -2831, -1455, 793]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBQqZefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBQqZufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HBQqd-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E8E650213" source="_HBQqZ-fXEduqHoOJbURZRw" target="_HBQqZ-fXEduqHoOJbURZRw">
-              <children xmi:id="_HBQqeufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HBQqfOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HBQqfefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBQqe-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HBQqfufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E8E6701BC">
-                <children xmi:id="_HBQqgOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqf-fXEduqHoOJbURZRw" x="435" y="193"/>
-              </children>
-              <children xmi:id="_HBQqgefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E8E6701BC">
-                <children xmi:id="_HBQqg-fXEduqHoOJbURZRw" type="ToRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqgufXEduqHoOJbURZRw" x="-320" y="-347"/>
-              </children>
-              <children xmi:id="_HBQqhOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E8E6701B1">
-                <children xmi:id="_HBQqhufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqhefXEduqHoOJbURZRw" x="-394" y="407"/>
-              </children>
-              <children xmi:id="_HBQqh-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E8E6701B1">
-                <children xmi:id="_HBQqiefXEduqHoOJbURZRw" type="FromRole"/>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqiOfXEduqHoOJbURZRw" x="1325" y="339"/>
-              </children>
-              <children xmi:id="_HBQqiufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E8E6701BC">
-                <children xmi:id="_HBQqjOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqjefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqi-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HBQqjufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E8E6701B1">
-                <children xmi:id="_HBQqkOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqkefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqj-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <children xmi:id="_HBQqkufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E8E6701BC">
-                <children xmi:id="_HBQqlOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqlefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQqk-fXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <children xmi:id="_HBQqlufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E8E6701B1">
-                <children xmi:id="_HBQqmOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HBQqmefXEduqHoOJbURZRw"/>
-                </children>
-                <layoutConstraint xmi:type="notation:Location" xmi:id="_HBQql-fXEduqHoOJbURZRw" y="1058"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HBQqeOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HBQqeefXEduqHoOJbURZRw" points="[787, 203, 787, 203]$[1913, 203, 1913, 203]$[1913, 1363, 1913, 1363]$[8, 1363, 8, 1363]$[8, 448, 8, 448]"/>
-            </edges>
-            <edges xmi:id="_HBaa9OfXEduqHoOJbURZRw" element="_3ADC7B74022D427955600170" source="_HBQqZ-fXEduqHoOJbURZRw" target="_HBHgmefXEduqHoOJbURZRw">
-              <children xmi:id="_HBaa9-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HBaa-efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HBaa-ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBaa-OfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HBaa9efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HBaa9ufXEduqHoOJbURZRw" points="[0, -448, 50, 4732]$[0, -4394, 50, 787]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBaa--fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HBaa_OfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_JxPf4exZEduONrMRgmz48A" element="_JxPf4OxZEduONrMRgmz48A" source="_HBHgmefXEduqHoOJbURZRw" target="_HA9vRefXEduqHoOJbURZRw">
-              <children xmi:id="_JxPf5OxZEduONrMRgmz48A" type="NameLabel">
-                <children xmi:id="_JxPf5uxZEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_JxPf5-xZEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JxPf5exZEduONrMRgmz48A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_JxPf4uxZEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_JxPf4-xZEduONrMRgmz48A" points="[-23, -30, 88, 103]$[-116, -160, -5, -27]"/>
-            </edges>
-          </contents>
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41E57B200087" type="Class" name="Main">
-            <children xmi:id="_HBaa_efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E00FB">
-              <children xmi:id="_HBabAOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HBabAefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HBabAufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HBabA-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HBabBOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HBabBefXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HBabBufXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HBaa_ufXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HBaa_-fXEduqHoOJbURZRw" x="3013" y="523" width="3148" height="1083"/>
-            </children>
-            <children xmi:id="_k9OnsOxnEduwObkIA6x1gA" element="_3ADC7B74022D41E0D0ED0104">
-              <children xmi:id="_k9Ons-xnEduwObkIA6x1gA" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_k9OntOxnEduwObkIA6x1gA" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_k9OntexnEduwObkIA6x1gA" type="Stereotype"/>
-              <children xmi:id="_k9OntuxnEduwObkIA6x1gA" type="Name"/>
-              <children xmi:id="_k9Ont-xnEduwObkIA6x1gA" type="Parent"/>
-              <children xmi:id="_k9OnuOxnEduwObkIA6x1gA" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_k9OnuexnEduwObkIA6x1gA" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_k9OnsexnEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_k9OnsuxnEduwObkIA6x1gA" x="632" y="3223" width="3148" height="1083"/>
-            </children>
-            <children xmi:id="_zzLvUOxnEduwObkIA6x1gA" element="_3ADC7B74022D41DE478E000D">
-              <children xmi:id="_zzLvU-xnEduwObkIA6x1gA" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_zzLvVOxnEduwObkIA6x1gA" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_zzLvVexnEduwObkIA6x1gA" type="Stereotype"/>
-              <children xmi:id="_zzLvVuxnEduwObkIA6x1gA" type="Name"/>
-              <children xmi:id="_zzLvV-xnEduwObkIA6x1gA" type="Parent"/>
-              <children xmi:id="_zzLvWOxnEduwObkIA6x1gA" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_zzLvWexnEduwObkIA6x1gA" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_zzLvUexnEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zzLvUuxnEduwObkIA6x1gA" x="5396" y="3225"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GpH2xufXEduqHoOJbURZRw" description="|The Method-Plugin package defines extensibility and variability mechanisms for method content and processes.  It provides more flexibility in defining different variants of method content and processes by allowing content and process fragments to be plugged-in on demand creating tailored or specialized content only when it is required and which can be maintained as separate units worked on by distributed teams.&#xA;|Methods and Processes are never developed in isolation.  Many concurrent teams of process engineers might work on different or the same parts of a Method Content or particular Processes.  They have to either coordinate their work or preferably to modularize Method Content and Process definitions that they can work on in isolation without any shared resource problems.&#xA;|Moreover, work on a development Process is never final because they have to be tailored for every specific project situation.  To avoid developing Delivery Processes from scratch for every specific project situation a truly reusable Process allows defining many different variations on it.  Therefore, tailoring and extension of pre-defined processes is a key requirement for organizations adopting and implementing processes.   For example, image a scenario in which a development organization purchases a third-party Delivery Process from a method vendor and its underlying method content.  While implementing the process in their organization they might discover that they would like to tailor the process to their particular needs and organization specific variations.  If they would directly modify the purchased process they would mingle their additions and changes with the original process.  If a new version of the original process is released by the vendor it would be very hard for them to find and reproduce these changes to the new process version.&#xA;|The package Method Plugin adds the capabilities of modularization and extensibility of Method Content and Processes to UMA.  In other words, it supports tailoring of Method Content and Processes without directly modifying them, but by describing changes from a separate unit called a Method Plug-in.  This new capability is achieved by adding new concepts to the meta-model: &#xA;|- All Method Elements are organized in Method Plugins.  Method Plugins are containers for Method Packages.  Every Method Element is part of exactly one Method Plugin, i.e. Method Plugins partition the space of all Method Elements.  &#xA;|- Method Plugins can define extensions to other Method Plugins.  One Method Plugin can define extensions for many other Plugins and can be extended by many Plugins.&#xA;|- The Method Plugin meta-model package adds a new set of relationships and semantics to specific Method Elements that define how these Method Elements can extend each other across the boundary of Method Plugins or Method Packages (to allow modularization even within one Method Plugin).&#xA;|The following sections define the detailed rules for these extensions for specific Method Elements.&#xA;"/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_RnIeEexZEduONrMRgmz48A" element="_RnIeEOxZEduONrMRgmz48A" source="_HBaa_efXEduqHoOJbURZRw" target="_k9OnsOxnEduwObkIA6x1gA">
-              <children xmi:id="_RnIeFOxZEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_RnIeFuxZEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_RnIeGOxZEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_RnIeF-xZEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RnIeFexZEduONrMRgmz48A" x="-27" y="899"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_RnIeEuxZEduONrMRgmz48A" routing="Rectilinear" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_RnIeE-xZEduONrMRgmz48A" points="[0, 556, 2381, -2143]$[-2381, 2143, 0, -556]"/>
-            </edges>
-            <edges xmi:id="_w3vNsexuEduM14unWaqP5Q" element="_w3vNsOxuEduM14unWaqP5Q" source="_HBaa_efXEduqHoOJbURZRw" target="_zzLvUOxnEduwObkIA6x1gA">
-              <children xmi:id="_w3vNtOxuEduM14unWaqP5Q" type="KindLabel">
-                <children xmi:id="_w3vNtuxuEduM14unWaqP5Q" type="Stereotype"/>
-                <children xmi:id="_w3vNuOxuEduM14unWaqP5Q" type="Kind"/>
-                <children xmi:id="_w3vNt-xuEduM14unWaqP5Q" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_w3vNtexuEduM14unWaqP5Q" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_w3vNsuxuEduM14unWaqP5Q" routing="Rectilinear" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_w3vNs-xuEduM14unWaqP5Q" points="[8, 21, -83, -81]$[35, 123, -56, 21]"/>
-            </edges>
-          </contents>
-        </eAnnotations>
-        <ownedComment xmi:id="_GoYP4OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E00FB">
-          <body>03</body>
-        </ownedComment>
-        <packageMerge xmi:id="_RnIeEOxZEduONrMRgmz48A" mergedPackage="_3ADC7B74022D41E0D0ED0104"/>
-        <packageMerge xmi:id="_w3vNsOxuEduM14unWaqP5Q" mergedPackage="_3ADC7B74022D41DE478E000D"/>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0104" name="MethodPlugin">
-          <ownedComment xmi:id="_GoYP8ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0104">
-            <body>A Method Plugin is a Method Element that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.
-</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41FADC01028D" general="_3ADC7B74022D40F36C5E0280"/>
-          <generalization xmi:id="_3ADC7B74022D42518BD701E3" general="_3ADC7B74022D41DDFA3602C1"/>
-          <ownedAttribute xmi:id="_3ADC7B74022D41AE707303B8" name="userChangeable" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-            <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GoYP9-fXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-              <body>true</body>
-            </defaultValue>
-          </ownedAttribute>
-          <ownedAttribute xmi:id="_3ADC7B74022D40F36C6002D8" name="methodPackages" visibility="public" type="_3ADC7B74022D40F36C5E013F" aggregation="composite" association="_3ADC7B74022D40F36C6002D5">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go-FwefXEduqHoOJbURZRw" value="*"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go-FwOfXEduqHoOJbURZRw" value="1"/>
-          </ownedAttribute>
-          <ownedAttribute xmi:id="_3ADC7B74022D40F36C6002EA" name="bases" visibility="public" type="_3ADC7B74022D40F36C5E0104" association="_3ADC7B74022D40F36C6002E7">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go-FyufXEduqHoOJbURZRw" value="*"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go-FyefXEduqHoOJbURZRw"/>
-          </ownedAttribute>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE4962020F" name="ContentElement" isAbstract="true">
-          <ownedComment xmi:id="_GoYP-efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE4962020F">
-            <body>Content Element in the package Method Plugin inherits from Variability Element and not directly from Method Element anymore.  This is achieved using UML 2.0 package merge semantics.  Only if an adopter of this meta-model decides to realize Method Plugins, he would get the variability and extension capabilities for all Content Elements.
-Content Element inherits the semantics of Variability Element.
-</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D41DE58B6018B" general="_3ADC7B74022D421E886803E5"/>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE495001F5" name="MethodElement" isAbstract="true">
-          <ownedComment xmi:id="_GoYP_ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE495001F5">
-            <body>Method Element in the package Method Plugin adds additional properties via package merge to Method Element defined in Method Core needed for the variability and extensibility capabilities introduces in this package.</body>
-          </ownedComment>
-          <ownedAttribute xmi:id="_3ADC7B74022D418ACA0A00EB" name="suppressed" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-            <ownedComment xmi:id="_GoiA4-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D418ACA0A00EB">
-              <body>If a Variability Element is derived from another Variability Element using the Extends Variability Specialization then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.</body>
-            </ownedComment>
-            <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GoiA5efXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-              <body>false</body>
-            </defaultValue>
-          </ownedAttribute>
-          <ownedAttribute xmi:id="_3ADC7B74022D4238E94D003F" name="orderingGuide" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-            <ownedComment xmi:id="_GoiA5-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4238E94D003F">
-              <body>This attribute is used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.</body>
-            </ownedComment>
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9rQPkeyGEdu5-vVjlfVsfQ" value="1"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9rQPkOyGEdu5-vVjlfVsfQ"/>
-            <defaultValue xmi:type="uml:LiteralString" xmi:id="_9ht5EOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-          </ownedAttribute>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Enumeration" xmi:id="_3ADC7B74022D40F6B00202EC" name="VariabilityType">
-          <ownedComment xmi:id="_GoiA6ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F6B00202EC">
-            <body>Variability Type is an Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.</body>
-          </ownedComment>
-          <ownedLiteral xmi:id="_3ADC7B74022D40F9C6A30338" name="na">
-            <ownedComment xmi:id="_GoiA7efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F9C6A30338">
-              <body>This is the default &quot;not assigned&quot; value of a Variabillity Element's variabilityType attribute which is set in the case no variability association is present between the Variability Element and other Variability Elements.
-</body>
-            </ownedComment>
-          </ownedLiteral>
-          <ownedLiteral xmi:id="_3ADC7B74022D40F6B01F03C0" name="contributes">
-            <ownedComment xmi:id="_GorK0ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F6B01F03C0">
-              <body>Contributes provides a way for instances of Variability Elements to contribute their properties into their base Variability Element without directly altering any of its existing properties, i.e. in an additive fashion.  Properties contributed are: attribute values and association instances.  The effect after interpretation of contribution is that the base Variability Element is logically replaced with an augmented variant of the element that combines attribute values and association instances.  The way this combination is realized depends on the type of the attribute or association.  For example, String attributes are concatenated resolving embedded commands for dependent text or merging text fragments (e.g. descriptions for content elements).  Additional elements in to-many associations are added (e.g. additional Guidance elements or Task Descriptors of an Activity).  Different elements in to-one associations are ignored (e.g. the one Primary Performer of a Task).  Multiple Content Elements can contribute to the same base element and all of these contributions properties are added to the base in the same fashion. The following table provides the detailed list of interpretation rules:
-attribute values:	String values from the special Variability Element are concatenated with values from the based-on Variability Element.  Other values from the special Variability Element of any other type such as Integer, Date are ignored.
-The identifying attributes guid and name of Method Element are exempt from this rule and will not be modified.
-0..1-association instances:	The one association instance of the based-on Variability Element is kept and any association from the contributing special Variability Element is ignored.
-0..n-association instances:	Association instances of the special Variability Element are added to the already existing association instances of the based-on element.  If both Variability Elements refer to the same object then only one instance of the association will remain.
-</body>
-            </ownedComment>
-          </ownedLiteral>
-          <ownedLiteral xmi:id="_3ADC7B74022D40F6B01801E0" name="extends">
-            <ownedComment xmi:id="_GorK1efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F6B01801E0">
-              <body>Extension allows Method Plugins to easily reuse elements from a Base Plugin by providing a kind of inheritance for the special Variability Element.  Attribute values and Association instances are inherited from the based-on Variability Element to the special Variability Element.  The result of interpretation is that the special element has the same properties as the based-on has, but might define its own additions.  Hence extends is not used to modify content of the base Plugin, but to provide the ability for the extending Plugin to define its own content which is a variant of content already defined (e.g. a special version of a generic Review Record for a specific type of review).  The effect of this is that the base Variability Element and any number of extending Variability Elements can be used side by side, but refer to each other via the extends relationship.  Extends also provides the key mechanism for binding Capability Patterns to Processes: A pattern is applied by defining an extends relationships from an Activity of the applying Processes to the Pattern.  The Activity inherits associations instances from the pattern and the pattern appears to be part of the resulting Process after Interpretation.
-attribute values:	Values from the based-on Variability element are inherited and used to populate the special Variability Elements attributes.  If the special element attributes are already populated the inherited values are ignored.  
-The identifying attributes guid and name of Method Element are exempt from this rule and will not be modified.
-0..1-association instances:	The one association instance of the based-on Variability Element is inherited to the special Variability Element.  If the special Variability Element defines its own association instance then the inherited one is ignored.
-0..n-association instances:	Association instances defined for the based-on Variability Element are inherited to the special Variability Element.  The special element can add additional association instances.
-
-</body>
-            </ownedComment>
-          </ownedLiteral>
-          <ownedLiteral xmi:id="_3ADC7B74022D40F6B01C0286" name="replaces">
-            <ownedComment xmi:id="_GorK2OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F6B01C0286">
-              <body>Replaces provides a way for Variability Elements to replace a base Variability Element without directly changing any of its existing properties.  This is in most cases used for Method Plugins that aim to replace specific Content Elements such as Roles, Task, or Activities with either a complete new variant or to change fundamental relationships of these elements (e.g. Role-Artifact responsibility).  Properties replaced are attribute values and association instances.  The effect of this is that the base Content Element is logically replaced with this new variant of the element to which all incoming associations still point as before, but which has potentially new attribute values and outgoing association properties.  This provides a very powerful mechanism to replace, for example, whole Activities in a Process with complete new realizations of the Activity.  For instance, replacing an Activity doing use case-based design with an activity doing agile code-centric development doing the same work using a different development technique utilizing different Roles, Tasks, etc.  Another example, would be to replace an Activity that describes database design for an RDBMS with an Activity that describes database design for an OODBMS.  A Variability Element can only be replaced by one other element at a time.  For example, if two Method Plugins replace the same element only one Method Plugin can be used for interpretation (see concept of Method Configuration for more details on how to resolve such conflicts, Section 7.1.2).  The following table provides the detailed list of interpretation rules:
-attribute values:	Values from the special Variability Element are replaced with values from the based-on Variability Element including unassigned values.
-The identifying attributes guid and name of Method Element are exempt from this rule and will not be modified.
-0..1-association instances:	The one association instance of the based-on Variability Element is replaced with the association instance from the replacing special Variability Element.  If the special Variability Element does not have an association instance then resulting element will also not have an association.
-0..n-association instances:	Association instances of the special Variability Element replace all association instances of the based-on Variability Element.
-
-</body>
-            </ownedComment>
-          </ownedLiteral>
-          <ownedLiteral xmi:id="_3ADC7B74022D44628E4B0133" name="localContribution"/>
-          <ownedLiteral xmi:id="_3ADC7B74022D44628E5E013B" name="localReplacement"/>
-          <ownedLiteral xmi:id="_3ADC7B74022D45C8D67002A9" name="extendsReplaces"/>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D421E886803E5" name="VariabilityElement" isAbstract="true">
-          <ownedComment xmi:id="_GorK3ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D421E886803E5">
-            <body>Variability Element is an abstract class derived from Method Element that provides new capabilities for content variation and extension to Content Elements or any other Method Element that derives from it.  It has been placed in-between the classes Method Element and Content Element in the overall UMA taxonomy of classes using the UML 2.0 package merge mechanism.  The association Variability Specialization shall only be instantiated between two subclasses of Variability Element of the same type.  The element on varaibilitySpecialElement side of the relationship defines a value for the attribute variabilityType defining the nature of the relationship using a literal from the enumeration Variability Type.
-Variability Element of the meta-model package Method Plugins adds the capabilities of variation and extension to Method Elements that derive from it.  By default all Content Elements such as Role, Task, Guidance Types, or Activities are defined to be Variability Elements.
-Variability and extension provides unique mechanisms for customizing method content without actually directly modifying the original content, but by just be able to describe with separate objects the differences (additions, changes, omissions) relative to the original.  This plug-in concept allows users to factor their method content and processes in interrelated units and even to architect method content and processes in layers that extend each other with new capabilities.  The resulting method and process design can be dynamically combined and applied on demand using the interpretation rules defined for Variability Element Specializations assembling to process practitioners the most accurate method and process descriptions possible.  It also allows process practitioners to extends and tailor method content and processes they do not own and to easily upgrade to newer versions by simply reapply their personal changes to these upgrades.
-Variability Element defines two types of variability and one type of extension which are formally defined for the enumeration Variability Type.
-</body>
-          </ownedComment>
-          <generalization xmi:id="_JxPf4OxZEduONrMRgmz48A" general="_3ADC7B74022D41DE495001F5"/>
-          <ownedAttribute xmi:id="_3ADC7B74022D40F6B0E603C7" name="variabilityType" visibility="public" type="_3ADC7B74022D40F6B00202EC">
-            <ownedComment xmi:id="_GorK4ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F6B0E603C7">
-              <body>If in instance of the variabilitySpecialization association between two Variability Elements of the same type exists, then the variabilityType attribute specifies how the element at the variabilitySpecialElement end of the association changes the Content Element at the variabilityBasedOnElement end. See the Variability Type enumeration class for definitions for the different types of variability.</body>
-            </ownedComment>
-            <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_Go070efXEduqHoOJbURZRw">
-              <body>na</body>
-            </defaultValue>
-          </ownedAttribute>
-          <ownedAttribute xmi:id="_3ADC7B74022D41DE587A03A2" name="variabilityBasedOnElement" visibility="public" type="_3ADC7B74022D421E886803E5" association="_3ADC7B74022D41DE587A03A0">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go-F0-fXEduqHoOJbURZRw" value="1"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go-F0ufXEduqHoOJbURZRw" value="1"/>
-          </ownedAttribute>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D427955450134" name="Section">
-          <ownedComment xmi:id="_Go070-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427955450134">
-            <body>Section in the package Method Plugin inherits from Variability Element and extends Section defined in Method Core :: Basic Elements with new capabilities for variability. 
-For example, when a Task contributes to another Task its Presentation association is contributed including its Sections (i.e. its Steps), which are modeled as parts of the Content Description instance.  Sections can be nested and therefore Task Descriptions can be flexibly organized in Steps with sub-Steps.  Sections are Variability Elements themselves, so they can contribute to each other.  For example, one could model a Task step as a Section instance without relating it to a Task Description that directly contributes to (or replaces) another Section which is part of a Task Description.  This contribution (or replacement) would add new description text to the original step description (or replace the original step description).  Another example would be to contribute new Check List items organized as Sections to an existing Check List (defined as guidance).  
-
-</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D427955600170" general="_3ADC7B74022D421E886803E5"/>
-          <ownedAttribute xmi:id="_3ADC7B74022D421E8E6701B1" name="predecessor" visibility="public" type="_3ADC7B74022D427955450134" association="_3ADC7B74022D421E8E650213">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go-F2efXEduqHoOJbURZRw" value="1"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go-F2OfXEduqHoOJbURZRw"/>
-          </ownedAttribute>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D427AA0AE039D" name="Activity">
-          <ownedComment xmi:id="_Go072OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427AA0AE039D">
-            <body>Activity in the package Method Plugin inherits from Variability Element to extend Activity with new capabilities for variability.&#xD;
-Activity inherits the semantics of Variability Element which provides key mechanism to enable dynamic binding of Capability Patterns in Processes as well as Process Contributions.  Variability is used in the following way for Activities:&#xD;
-- Extend: To apply a Capability Pattern to a process one would create an Activity which extends the pattern's top-level activity.  Through extension the extending Activity inherits the patterns Breakdown Elements.&#xD;
-- Replace: To replace an Activity of an applied Capability Pattern or an existing process for which one develops a Process Contribution (or a combination of both) one would create an Activity and specify the replace variability specialization between them.&#xD;
-- Contribute: To contribute new Breakdown Elements to an existing Activity one would define an Activity with Breakdown Elements that relates via the Contributes Variability Specialization to this existing Activity.  The contributing Activity's Breakdown Elements will be added to the contributed Activity.&#xD;
-&#xD;
-</body>
-          </ownedComment>
-          <generalization xmi:id="_3ADC7B74022D427AA0D30245" general="_3ADC7B74022D421E886803E5"/>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C6002D5" memberEnd="_3ADC7B74022D40F36C6002D6 _3ADC7B74022D40F36C6002D8">
-          <ownedComment xmi:id="_Go073efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C6002D5">
-            <body>This composition association represents that every Method Package (either Content Package, Process Package, or Process Component) is part of exactly one Method Plugin.</body>
-          </ownedComment>
-          <ownedEnd xmi:id="_3ADC7B74022D40F36C6002D6" name="_methodPlugin" visibility="public" type="_3ADC7B74022D40F36C5E0104" isUnique="false" association="_3ADC7B74022D40F36C6002D5">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go074efXEduqHoOJbURZRw" value="1"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go074OfXEduqHoOJbURZRw" value="1"/>
-          </ownedEnd>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C6002E7" name="Extension" memberEnd="_3ADC7B74022D40F36C6002E8 _3ADC7B74022D40F36C6002EA">
-          <ownedComment xmi:id="_Go-Fw-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C6002E7">
-            <body>This association defines how Method Plugins extend many other Method Plugins.  The extending plug-in contains new method elements, extends existing method elements and processes using content element variability mechanisms (e.g. contribution, replace, etc.), provides additional Delivery and Capability Processes for a Method Framework, etc.</body>
-          </ownedComment>
-          <ownedEnd xmi:id="_3ADC7B74022D40F36C6002E8" name="plugins" visibility="public" type="_3ADC7B74022D40F36C5E0104" association="_3ADC7B74022D40F36C6002E7">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go-Fx-fXEduqHoOJbURZRw" value="*"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go-FxufXEduqHoOJbURZRw"/>
-          </ownedEnd>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DE587A03A0" name="variabilitySpecialization" memberEnd="_3ADC7B74022D41DE587A03A1 _3ADC7B74022D41DE587A03A2">
-          <ownedComment xmi:id="_Go-FzOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE587A03A0">
-            <body>This 1-to-many association defines in combination with the variabilityType attribute that a number of special Variability Elements of the same type represent a variation of exactly one other Variability Element.  See the Variability Type enumeration class for definitions for the different types of variability.</body>
-          </ownedComment>
-          <ownedEnd xmi:id="_3ADC7B74022D41DE587A03A1" name="variabilitySpecialElement" visibility="public" type="_3ADC7B74022D421E886803E5" association="_3ADC7B74022D41DE587A03A0">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go-F0OfXEduqHoOJbURZRw" value="*"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go-Fz-fXEduqHoOJbURZRw"/>
-          </ownedEnd>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D421E8E650213" memberEnd="_3ADC7B74022D421E8E6701B1 _3ADC7B74022D421E8E6701BC">
-          <ownedComment xmi:id="_Go-F1efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D421E8E650213">
-            <body>This association describes the order in which contributed Sections shall be inserted into an  existing list of Sections maintained for a Content Description.</body>
-          </ownedComment>
-          <ownedEnd xmi:id="_3ADC7B74022D421E8E6701BC" name="_section" visibility="public" type="_3ADC7B74022D427955450134" isUnique="false" association="_3ADC7B74022D421E8E650213">
-            <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Go-F3OfXEduqHoOJbURZRw" value="*"/>
-            <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Go-F2-fXEduqHoOJbURZRw"/>
-          </ownedEnd>
-        </packagedElement>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C5E017B" name="MethodCore">
-        <eAnnotations xmi:id="_GvPF0ufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F87B4E034A">
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F87B4E034A" type="Class" name="Main">
-            <children xmi:id="_HIHf5ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0262">
-              <children xmi:id="_HIHf6efXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIHf6ufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIHf6-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIHf7OfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIHf7efXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIHf7ufXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIHf7-fXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIHf5-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIHf6OfXEduqHoOJbURZRw" x="9623" y="14518" width="4402" height="1684"/>
-            </children>
-            <children xmi:id="_HIHf8OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0294">
-              <children xmi:id="_HIHf8-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIHf9OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIHf9efXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIHf9ufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIHf9-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIHf-OfXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIHf-efXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIHf8efXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIHf8ufXEduqHoOJbURZRw" x="10839" y="11400" width="4432" height="1676"/>
-            </children>
-            <children xmi:id="_HIHf-ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0190">
-              <children xmi:id="_HIHf_efXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIHf_ufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIHf_-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIHgAOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIHgAefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIHgAufXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIHgA-fXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIHf--fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIHf_OfXEduqHoOJbURZRw" x="7608" y="8242" width="4537" height="1676"/>
-            </children>
-            <children xmi:id="_HIHgBOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0225">
-              <children xmi:id="_HIHgB-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIHgCOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIHgCefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIHgCufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIHgC-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIHgDOfXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIHgDefXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIHgBefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIHgBufXEduqHoOJbURZRw" x="7608" y="4940" width="4537" height="1676"/>
-            </children>
-            <children xmi:id="_HIHgIOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE478E000D">
-              <children xmi:id="_HIHgI-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIHgJOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIHgJefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIHgJufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIHgJ-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIHgKOfXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIHgKefXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIHgIefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIHgIufXEduqHoOJbURZRw" x="7608" y="2219" width="4114" height="1676"/>
-            </children>
-            <children xmi:id="_HIHgKufXEduqHoOJbURZRw" element="_3ADC7B74022D41DE49EA01E2">
-              <children xmi:id="_HIHgLefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIHgLufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIHgL-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIHgMOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIHgMefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIHgMufXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIHgM-fXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIHgK-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIHgLOfXEduqHoOJbURZRw" x="1268" y="6974" width="4720" height="1676"/>
-            </children>
-            <children xmi:id="_HIHgT-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDE280025D">
-              <children xmi:id="_HIHgUufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIHgU-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIHgVOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIHgVefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIHgVufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIHgV-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIHgWOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIHgUOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIHgUefXEduqHoOJbURZRw" x="14378" y="8178" width="3841" height="1684"/>
-            </children>
-            <children xmi:id="_x4GuQOxdEduHje3pPahN4A" element="_3ADC7B74022D41DDF869012E">
-              <children xmi:id="_x4GuQ-xdEduHje3pPahN4A" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_x4GuROxdEduHje3pPahN4A" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_x4GuRexdEduHje3pPahN4A" type="Stereotype"/>
-              <children xmi:id="_x4GuRuxdEduHje3pPahN4A" type="Name"/>
-              <children xmi:id="_x4GuR-xdEduHje3pPahN4A" type="Parent"/>
-              <children xmi:id="_x4P4MOxdEduHje3pPahN4A" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_x4P4MexdEduHje3pPahN4A" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_x4GuQexdEduHje3pPahN4A" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_x4GuQuxdEduHje3pPahN4A" x="9623" y="17487"/>
-            </children>
-            <children xmi:id="_ZCTBkOx5Edu5-vVjlfVsfQ" element="_3ADC7B74022D4119A62B036F">
-              <children xmi:id="_ZCTBk-x5Edu5-vVjlfVsfQ" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_ZCTBlOx5Edu5-vVjlfVsfQ" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_ZCcykOx5Edu5-vVjlfVsfQ" type="Stereotype"/>
-              <children xmi:id="_ZCcykex5Edu5-vVjlfVsfQ" type="Name"/>
-              <children xmi:id="_ZCcykux5Edu5-vVjlfVsfQ" type="Parent"/>
-              <children xmi:id="_ZCcyk-x5Edu5-vVjlfVsfQ" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_ZCcylOx5Edu5-vVjlfVsfQ" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_ZCTBkex5Edu5-vVjlfVsfQ" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZCTBkux5Edu5-vVjlfVsfQ" x="14265" y="17487"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GvPF1OfXEduqHoOJbURZRw" description="The Method Core package defines the fundamental concepts for describing and organizing method content.  The package itself provides layers as depicted in diagram that gradually extend the core concepts with more and more capabilities (i.e. supporting classes, additional attributes, and relationships). The Basic Elements package defines the root element from which all classes in this specification have been derived.  Core Content Elements defines the core elements of every method such as roles, tasks, and work products.  The next layer adds different types of guidance to the core elements such as work product tem-plates, guidelines, or checklists.  The Categories package provides pre-defined as well as user-definable categorizations of core content elements as well as guidance types.  The Method Content Descriptions adds properties for detailed content descriptions to the elements defined below.  These descriptions are optional additions, which an implementer of this specification is free to choose from.  Finally, Method Package de-fines how the elements defined in all four layers below can be organized in package hierarchies."/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_UR9WsOoWEduOBPQA2hKqUQ" element="_URzlsOoWEduOBPQA2hKqUQ" source="_HIHgT-fXEduqHoOJbURZRw" target="_HIHf8OfXEduqHoOJbURZRw">
-              <children xmi:id="_UR9Ws-oWEduOBPQA2hKqUQ" type="KindLabel">
-                <children xmi:id="_UR9WteoWEduOBPQA2hKqUQ" type="Stereotype"/>
-                <children xmi:id="_UR9Wt-oWEduOBPQA2hKqUQ" type="Kind"/>
-                <children xmi:id="_UR9WtuoWEduOBPQA2hKqUQ" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UR9WtOoWEduOBPQA2hKqUQ" x="-776" y="-1065"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_UR9WseoWEduOBPQA2hKqUQ" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UR9WsuoWEduOBPQA2hKqUQ" points="[-34, 32, 149, -90]$[-109, 119, 74, -3]"/>
-            </edges>
-            <edges xmi:id="_N19lcexMEduONrMRgmz48A" element="_N19lcOxMEduONrMRgmz48A" source="_HIHf-ufXEduqHoOJbURZRw" target="_HIHf8OfXEduqHoOJbURZRw">
-              <children xmi:id="_N19ldOxMEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_N19lduxMEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_N19leOxMEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_N19ld-xMEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_N19ldexMEduONrMRgmz48A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_N19lcuxMEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_N19lc-xMEduONrMRgmz48A" points="[2, 33, 0, -85]$[2, 150, 0, 32]"/>
-            </edges>
-            <edges xmi:id="_CsEQIOxdEduHje3pPahN4A" element="_Cr6fIOxdEduHje3pPahN4A" source="_HIHf8OfXEduqHoOJbURZRw" target="_HIHf5ufXEduqHoOJbURZRw">
-              <children xmi:id="_CsEQI-xdEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_CsEQJexdEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_CsEQJ-xdEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_CsEQJuxdEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CsEQJOxdEduHje3pPahN4A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_CsEQIexdEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CsEQIuxdEduHje3pPahN4A" points="[-185, 873, -2143, -5424]$[-185, 3651, -2143, -2646]$[1244, 5424, -714, -873]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_hV1lEOx5Edu5-vVjlfVsfQ" id="(0.4616426,0.77565634)"/>
-            </edges>
-            <edges xmi:id="_ddttsOxdEduHje3pPahN4A" element="_ddj8sOxdEduHje3pPahN4A" source="_HIHgBOfXEduqHoOJbURZRw" target="_HIHf-ufXEduqHoOJbURZRw">
-              <children xmi:id="_ddtts-xdEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_ddtttexdEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_ddttt-xdEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_ddtttuxdEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ddtttOxdEduHje3pPahN4A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_ddttsexdEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ddttsuxdEduHje3pPahN4A" points="[2, 32, 2, -92]$[16, 157, 16, 33]"/>
-            </edges>
-            <edges xmi:id="_eaW8IexdEduHje3pPahN4A" element="_eaW8IOxdEduHje3pPahN4A" source="_HIHgBOfXEduqHoOJbURZRw" target="_HIHf8OfXEduqHoOJbURZRw">
-              <children xmi:id="_eaW8JOxdEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_eaW8JuxdEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_eaW8KOxdEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_eaW8J-xdEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eaW8JexdEduHje3pPahN4A" x="-1488" y="-811"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_eaW8IuxdEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_eaW8I-xdEduHje3pPahN4A" points="[1535, 846, -1640, -5610]$[3413, 1878, 238, -4578]$[3413, 5900, 238, -556]"/>
-            </edges>
-            <edges xmi:id="_VPR3MOxeEduHje3pPahN4A" element="_VPIGMOxeEduHje3pPahN4A" source="_HIHgKufXEduqHoOJbURZRw" target="_HIHf-ufXEduqHoOJbURZRw">
-              <children xmi:id="_VPR3M-xeEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_VPR3NexeEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_VPR3N-xeEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_VPR3NuxeEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VPR3NOxeEduHje3pPahN4A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_VPR3MexeEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VPR3MuxeEduHje3pPahN4A" points="[-90, 11, 239, -1]$[-245, 43, 84, 31]"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WtdFYOxeEduHje3pPahN4A" id="(0.77165526,0.74343675)"/>
-            </edges>
-            <edges xmi:id="_RKEDYexgEduHje3pPahN4A" element="_RKEDYOxgEduHje3pPahN4A" source="_HIHgIOfXEduqHoOJbURZRw" target="_HIHgKufXEduqHoOJbURZRw">
-              <children xmi:id="_RKEDZOxgEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_RKEDZuxgEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_RKEDaOxgEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_RKEDZ-xgEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RKEDZexgEduHje3pPahN4A" x="-481" y="-487"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_RKEDYuxgEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_RKEDY-xgEduHje3pPahN4A" points="[-2090, 476, 3943, -4287]$[-6059, 1403, -26, -3360]$[-6059, 4207, -26, -556]"/>
-            </edges>
-            <edges xmi:id="_RqGOUexgEduHje3pPahN4A" element="_RqGOUOxgEduHje3pPahN4A" source="_HIHgIOfXEduqHoOJbURZRw" target="_HIHgBOfXEduqHoOJbURZRw">
-              <children xmi:id="_RqGOVOxgEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_RqGOVuxgEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_RqGOWOxgEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_RqGOV-xgEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RqGOVexgEduHje3pPahN4A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_RqGOUuxgEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_RqGOU-xgEduHje3pPahN4A" points="[6, 33, -2, -70]$[95, 110, 87, 7]"/>
-            </edges>
-            <edges xmi:id="_SLVTIexgEduHje3pPahN4A" element="_SLVTIOxgEduHje3pPahN4A" source="_HIHgIOfXEduqHoOJbURZRw" target="_HIHgT-fXEduqHoOJbURZRw">
-              <children xmi:id="_SLVTJOxgEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_SLVTJuxgEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_SLVTKOxgEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_SLVTJ-xgEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SLVTJexgEduHje3pPahN4A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_SLVTIuxgEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_SLVTI-xgEduHje3pPahN4A" points="[1931, 873, -4710, -5107]$[6614, 2990, -27, -2990]$[6614, 5424, -27, -556]"/>
-            </edges>
-            <edges xmi:id="_noyTMexgEduHje3pPahN4A" element="_noyTMOxgEduHje3pPahN4A" source="_HIHf5ufXEduqHoOJbURZRw" target="_x4GuQOxdEduHje3pPahN4A">
-              <children xmi:id="_noyTNOxgEduHje3pPahN4A" type="KindLabel">
-                <children xmi:id="_noyTNuxgEduHje3pPahN4A" type="Stereotype"/>
-                <children xmi:id="_noyTOOxgEduHje3pPahN4A" type="Kind"/>
-                <children xmi:id="_noyTN-xgEduHje3pPahN4A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_noyTNexgEduHje3pPahN4A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_noyTMuxgEduHje3pPahN4A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_noyTM-xgEduHje3pPahN4A" points="[-7, 33, -6, -70]$[-7, 131, -6, 28]"/>
-            </edges>
-            <edges xmi:id="_c62ngOx5Edu5-vVjlfVsfQ" element="_c6tdkOx5Edu5-vVjlfVsfQ" source="_HIHf5ufXEduqHoOJbURZRw" target="_ZCTBkOx5Edu5-vVjlfVsfQ">
-              <children xmi:id="_c62ng-x5Edu5-vVjlfVsfQ" type="KindLabel">
-                <children xmi:id="_c62nhex5Edu5-vVjlfVsfQ" type="Stereotype"/>
-                <children xmi:id="_c62nh-x5Edu5-vVjlfVsfQ" type="Kind"/>
-                <children xmi:id="_c62nhux5Edu5-vVjlfVsfQ" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c62nhOx5Edu5-vVjlfVsfQ" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_c62ngex5Edu5-vVjlfVsfQ" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_c62ngux5Edu5-vVjlfVsfQ" points="[41, 33, -134, -74]$[91, 108, -84, 1]"/>
-            </edges>
-          </contents>
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41E0CD3701ED" type="Class" name="Taxonomy">
-            <children xmi:id="_HIRQ6efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E017F">
-              <children xmi:id="_HIRQ7OfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIRQ7efXEduqHoOJbURZRw" width="4521" height="1083"/>
-              </children>
-              <children xmi:id="_HIRQ7ufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIRQ7-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIRQ8OfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIRQ8efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRQ8ufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRQ8-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRQ9OfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRQ9efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRQ9ufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRQ9-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIRQ-OfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIRQ6ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIRQ6-fXEduqHoOJbURZRw" x="12050" y="11018"/>
-            </children>
-            <children xmi:id="_HIRQ-efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0185">
-              <children xmi:id="_HIRQ_OfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIRQ_efXEduqHoOJbURZRw" width="3996" height="1083"/>
-              </children>
-              <children xmi:id="_HIRQ_ufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIRQ_-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIRRAOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIRRAefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRAufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRA-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRBOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRBefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRBufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRB-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIRRCOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIRQ-ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIRQ--fXEduqHoOJbURZRw" x="16779" y="11018"/>
-            </children>
-            <children xmi:id="_HIRRCefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02DA">
-              <children xmi:id="_HIRRDOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIRRDefXEduqHoOJbURZRw" width="3708" height="1134"/>
-              </children>
-              <children xmi:id="_HIRRDufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIRRD-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIRREOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIRREefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRREufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRE-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRFOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRFefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRFufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRF-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIRRGOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIRRCufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIRRC-fXEduqHoOJbURZRw" x="7308" y="8348"/>
-            </children>
-            <children xmi:id="_HIRRGefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E018F">
-              <children xmi:id="_HIRRHOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIRRHefXEduqHoOJbURZRw" width="3708" height="1083"/>
-              </children>
-              <children xmi:id="_HIRRHufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIRRH-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIRRIOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIRRIefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRIufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRI-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRJOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRJefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRJufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRJ-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIRRKOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIRRGufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIRRG-fXEduqHoOJbURZRw" x="21516" y="11018"/>
-            </children>
-            <children xmi:id="_HIRRKefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-              <children xmi:id="_HIRRLOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIRRLefXEduqHoOJbURZRw" width="4013" height="1117"/>
-              </children>
-              <children xmi:id="_HIRRLufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIRRL-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIRRMOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIRRMefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRMufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRM-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRNOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRNefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRNufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRN-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIRROOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIRRKufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIRRK-fXEduqHoOJbURZRw" x="12042" y="8356"/>
-            </children>
-            <children xmi:id="_HIRROefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-              <children xmi:id="_HIRRPOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIRRPefXEduqHoOJbURZRw" width="4470" height="1134"/>
-              </children>
-              <children xmi:id="_HIRRPufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIRRP-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIRRQOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIRRQefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRQufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRQ-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRROfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRRefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIRRRufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIRRR-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIRRSOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIRROufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIRRO-fXEduqHoOJbURZRw" x="16766" y="8348"/>
-            </children>
-            <children xmi:id="_HIaa6-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-              <children xmi:id="_HIaa7ufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIaa7-fXEduqHoOJbURZRw" width="4182" height="1117"/>
-              </children>
-              <children xmi:id="_HIaa8OfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIaa8efXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIaa8ufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIaa8-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIaa9OfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIaa9efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIaa9ufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIaa9-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIaa-OfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIaa-efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIaa-ufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIaa7OfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIaa7efXEduqHoOJbURZRw" x="21507" y="8356"/>
-            </children>
-            <children xmi:id="_HIabPefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E012B">
-              <children xmi:id="_HIabQOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIabQefXEduqHoOJbURZRw" width="3064" height="1083"/>
-              </children>
-              <children xmi:id="_HIabQufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIabQ-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIabROfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIabRefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabRufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabR-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabSOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabSefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabSufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabS-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIabTOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIabPufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIabP-fXEduqHoOJbURZRw" x="8505" y="5671"/>
-            </children>
-            <children xmi:id="_HIabZufXEduqHoOJbURZRw" element="_3ADC7B74022D427A857B0333">
-              <children xmi:id="_HIabaefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIabaufXEduqHoOJbURZRw" width="2794" height="1049"/>
-              </children>
-              <children xmi:id="_HIaba-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIabbOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIabbefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIabbufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabb-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabcOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabcefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabcufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabc-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabdOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIabdefXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIabZ-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIabaOfXEduqHoOJbURZRw" x="1020" y="3010"/>
-            </children>
-            <children xmi:id="_HIabdufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-              <children xmi:id="_HIabeefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIabeufXEduqHoOJbURZRw" width="3115" height="1134"/>
-              </children>
-              <children xmi:id="_HIabe-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIabfOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIabfefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIabfufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabf-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabgOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabgefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabgufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIabg-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIabhOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIabhefXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIabd-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIabeOfXEduqHoOJbURZRw" x="9193" y="317"/>
-            </children>
-            <children xmi:id="_HIkL0-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E026C">
-              <children xmi:id="_HIkL1ufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIkL1-fXEduqHoOJbURZRw" width="2878" height="1049"/>
-              </children>
-              <children xmi:id="_HIkL2OfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIkL2efXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIkL2ufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIkL2-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkL3OfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkL3efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkL3ufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkL3-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkL4OfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkL4efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIkL4ufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIkL1OfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkL1efXEduqHoOJbURZRw" x="12666" y="5661"/>
-            </children>
-            <children xmi:id="_HIkMEOfXEduqHoOJbURZRw" element="_3ADC7B74022D421E4CF301AE">
-              <children xmi:id="_HIkME-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIkMFOfXEduqHoOJbURZRw" width="3437" height="1117"/>
-              </children>
-              <children xmi:id="_HIkMFefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIkMFufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIkMF-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIkMGOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMGefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMGufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMG-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMHOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMHefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMHufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIkMH-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIkMEefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMEufXEduqHoOJbURZRw" x="4763" y="3003"/>
-            </children>
-            <children xmi:id="_HIkMKefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E013F">
-              <children xmi:id="_HIkMLOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIkMLefXEduqHoOJbURZRw" width="3014" height="1049"/>
-              </children>
-              <children xmi:id="_HIkMLufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIkML-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIkMMOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIkMMefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMMufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMM-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMNOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMNefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMNufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMN-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIkMOOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIkMKufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMK-fXEduqHoOJbURZRw" x="8504" y="3010"/>
-            </children>
-            <children xmi:id="_HIkMS-fXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-              <children xmi:id="_HIkMTufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIkMT-fXEduqHoOJbURZRw" width="3589" height="990"/>
-              </children>
-              <children xmi:id="_HIkMUOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIkMUefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIkMUufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIkMU-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMVOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMVefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMVufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMV-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMWOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMWefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIkMWufXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIkMTOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMTefXEduqHoOJbURZRw" x="12443" y="2991"/>
-            </children>
-            <children xmi:id="_HIkMZOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4A970123">
-              <children xmi:id="_HIkMZ-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HIkMaOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HIkMaefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HIkMaufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HIkMa-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HIkMbOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMbefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMbufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMb-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMcOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIkMcefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HIkMcufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HIkMc-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HIkMZefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMZufXEduqHoOJbURZRw" x="16710" y="3009" width="4417" height="979"/>
-            </children>
-            <children xmi:id="_eHO04OolEduVA7vt5qbIJQ" element="_3ADC7B74022D40F36C5E0244">
-              <children xmi:id="_eHO04-olEduVA7vt5qbIJQ" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_eHO05OolEduVA7vt5qbIJQ" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_eHO05eolEduVA7vt5qbIJQ" type="Stereotype"/>
-              <children xmi:id="_eHO05uolEduVA7vt5qbIJQ" type="Name"/>
-              <children xmi:id="_eHO05-olEduVA7vt5qbIJQ" type="Parent"/>
-              <children xmi:id="_eHO06OolEduVA7vt5qbIJQ" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_eHO06eolEduVA7vt5qbIJQ"/>
-              </children>
-              <children xmi:id="_eHO06uolEduVA7vt5qbIJQ" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_eHO06-olEduVA7vt5qbIJQ"/>
-              </children>
-              <children xmi:id="_eHO07OolEduVA7vt5qbIJQ" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_eHO07eolEduVA7vt5qbIJQ"/>
-              </children>
-              <children xmi:id="_eHO07uolEduVA7vt5qbIJQ" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_eHO07-olEduVA7vt5qbIJQ"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_eHO04eolEduVA7vt5qbIJQ" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHO04uolEduVA7vt5qbIJQ" x="3319" y="8358"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GvPF1ufXEduqHoOJbURZRw"/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_HIaa0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92000F" source="_HIRQ6efXEduqHoOJbURZRw" target="_HIRROefXEduqHoOJbURZRw">
-              <children xmi:id="_HIaa0-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIaa1efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIaa1ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIaa1OfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIaa0efXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIaa0ufXEduqHoOJbURZRw" points="[-26, -503, -4789, 2169]$[4755, -2196, -8, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIaa1-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIaa2OfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIaa2efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92002C" source="_HIRQ-efXEduqHoOJbURZRw" target="_HIRROefXEduqHoOJbURZRw">
-              <children xmi:id="_HIaa3OfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIaa3ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIaa3-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIaa3efXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIaa2ufXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIaa2-fXEduqHoOJbURZRw" points="[-27, -503, -27, 2169]$[-8, -2196, -8, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIaa4OfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIaa4efXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIaa4ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92004A" source="_HIRRGefXEduqHoOJbURZRw" target="_HIRROefXEduqHoOJbURZRw">
-              <children xmi:id="_HIaa5efXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIaa5-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIaa6OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIaa5ufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIaa4-fXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIaa5OfXEduqHoOJbURZRw" points="[-26, -503, 4710, 2169]$[-4744, -2196, -8, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIaa6efXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIaa6ufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIabhufXEduqHoOJbURZRw" element="_3ADC7B74022D427A85AE02CE" source="_HIabZufXEduqHoOJbURZRw" target="_HIabdufXEduqHoOJbURZRw">
-              <children xmi:id="_HIabiefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIabi-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkL0OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIabiufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIabh-fXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIabiOfXEduqHoOJbURZRw" points="[-27, -502, -8149, 2170]$[8136, -2196, 14, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL0efXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL0ufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkL4-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C93011D" source="_HIRRCefXEduqHoOJbURZRw" target="_HIkL0-fXEduqHoOJbURZRw">
-              <children xmi:id="_HIkL5ufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkL6OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkL6efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkL5-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkL5OfXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkL5efXEduqHoOJbURZRw" points="[-27, -503, -7118, 2169]$[7097, -2196, 6, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL6ufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL6-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkL7OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920307" source="_HIRRKefXEduqHoOJbURZRw" target="_HIkL0-fXEduqHoOJbURZRw">
-              <children xmi:id="_HIkL7-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkL8efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkL8ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkL8OfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkL7efXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkL7ufXEduqHoOJbURZRw" points="[-27, -503, -2382, 2169]$[2361, -2196, 6, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL8-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL9OfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkL9efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9203D9" source="_HIRROefXEduqHoOJbURZRw" target="_HIkL0-fXEduqHoOJbURZRw">
-              <children xmi:id="_HIkL-OfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkL-ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkL--fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkL-efXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkL9ufXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkL9-fXEduqHoOJbURZRw" points="[-27, -503, 2354, 2169]$[-2375, -2196, 6, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL_OfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkL_efXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkL_ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92032F" source="_HIaa6-fXEduqHoOJbURZRw" target="_HIkL0-fXEduqHoOJbURZRw">
-              <children xmi:id="_HIkMAefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkMA-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkMBOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMAufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkL_-fXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkMAOfXEduqHoOJbURZRw" points="[-26, -503, 7091, 2169]$[-7111, -2196, 6, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMBefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMBufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkMIOfXEduqHoOJbURZRw" element="_3ADC7B74022D42795624017E" source="_HIkMEOfXEduqHoOJbURZRw" target="_HIabdufXEduqHoOJbURZRw">
-              <children xmi:id="_HIkMI-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkMJefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkMJufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMJOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkMIefXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkMIufXEduqHoOJbURZRw" points="[-26, -502, -4418, 2170]$[4406, -2196, 14, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMJ-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMKOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkMOefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6003AF" source="_HIabPefXEduqHoOJbURZRw" target="_HIkMKefXEduqHoOJbURZRw">
-              <children xmi:id="_HIkMPOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkMPufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkMP-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMPefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkMOufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkMO-fXEduqHoOJbURZRw" points="[-238, -503, -238, 2170]$[-238, -2197, -238, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMQOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMQefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkMQufXEduqHoOJbURZRw" element="_3ADC7B74022D41FAD5F8038E" source="_HIkMKefXEduqHoOJbURZRw" target="_HIabdufXEduqHoOJbURZRw">
-              <children xmi:id="_HIkMRefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkMR-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkMSOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMRufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkMQ-fXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkMROfXEduqHoOJbURZRw" points="[-27, -502, -582, 2170]$[569, -2196, 14, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMSefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMSufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkMW-fXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC4A0306" source="_HIkL0-fXEduqHoOJbURZRw" target="_HIkMS-fXEduqHoOJbURZRw">
-              <children xmi:id="_HIkMXufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkMYOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkMYefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMX-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkMXOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkMXefXEduqHoOJbURZRw" points="[-133, -503, -133, 2170]$[-133, -2197, -133, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMYufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMY-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkMdOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_HIkMS-fXEduqHoOJbURZRw" target="_HIabdufXEduqHoOJbURZRw">
-              <children xmi:id="_HIkMd-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkMeefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkMeufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMeOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkMdefXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkMdufXEduqHoOJbURZRw" points="[-27, -502, 3519, 2170]$[-3532, -2196, 14, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMe-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMfOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HIkMfefXEduqHoOJbURZRw" element="_3ADC7B74022D4200583B01E6" source="_HIkMZOfXEduqHoOJbURZRw" target="_HIabdufXEduqHoOJbURZRw">
-              <children xmi:id="_HIkMgOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HIkMgufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HIkMg-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HIkMgefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HIkMfufXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HIkMf-fXEduqHoOJbURZRw" points="[-27, -502, 8149, 2170]$[-8162, -2196, 14, 476]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMhOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HIkMhefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_eHYl4OolEduVA7vt5qbIJQ" element="_D3b8oOokEduVA7vt5qbIJQ" source="_eHO04OolEduVA7vt5qbIJQ" target="_HIkL0-fXEduqHoOJbURZRw">
-              <children xmi:id="_eHYl4-olEduVA7vt5qbIJQ" type="NameLabel">
-                <children xmi:id="_eHYl5eolEduVA7vt5qbIJQ" type="Stereotype"/>
-                <children xmi:id="_eHYl5uolEduVA7vt5qbIJQ" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHYl5OolEduVA7vt5qbIJQ" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_eHYl4eolEduVA7vt5qbIJQ" routing="Tree" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_eHYl4uolEduVA7vt5qbIJQ" points="[1746, -159, -8679, 846]$[8784, -847, -1641, 158]"/>
-            </edges>
-          </contents>
-        </eAnnotations>
-        <ownedComment xmi:id="_GpH2yOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E017B">
-          <body>01</body>
-        </ownedComment>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C5E0190" name="GuidanceTypes">
-          <eAnnotations xmi:id="_GqUJtefXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F49FF3000E">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F49FF3000E" type="Class" name="Structure">
-              <children xmi:id="_HB3G4OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01E0">
-                <children xmi:id="_HCAQ0OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCAQ0efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCAQ0ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCAQ0-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCAQ1OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCAQ1efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAQ1ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCAQ1-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAQ2OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCAQ2efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAQ2ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCAQ2-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCAQ3OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HB3G4efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HB3G4ufXEduqHoOJbURZRw" x="18025" y="18381"/>
-              </children>
-              <children xmi:id="_HCAQ3efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01F3">
-                <children xmi:id="_HCAQ4OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCAQ4efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCAQ4ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCAQ4-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCAQ5OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCAQ5efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAQ5ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCAQ5-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAQ6OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCAQ6efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAQ6ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCAQ6-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCAQ7OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCAQ3ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCAQ3-fXEduqHoOJbURZRw" x="10461" y="23141"/>
-              </children>
-              <children xmi:id="_HCARHefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01C1">
-                <children xmi:id="_HCARIOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCARIefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCARIufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCARI-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCARJOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCARJefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARJufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARJ-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARKOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARKefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARKufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARK-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCARLOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCARHufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCARH-fXEduqHoOJbURZRw" x="14452" y="19778"/>
-              </children>
-              <children xmi:id="_HCARLefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0199">
-                <children xmi:id="_HCARMOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCARMefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCARMufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCARM-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCARNOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCARNefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARNufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARN-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAROOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCAROefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCAROufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARO-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCARPOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCARLufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCARL-fXEduqHoOJbURZRw" x="14952" y="17669"/>
-              </children>
-              <children xmi:id="_HCARRufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01A4">
-                <children xmi:id="_HCARSefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCARSufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCARS-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCARTOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCARTefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCARTufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCART-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARUOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARUefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARUufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARU-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARVOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCARVefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCARR-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCARSOfXEduqHoOJbURZRw" x="14588" y="15841"/>
-              </children>
-              <children xmi:id="_HCARVufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E019A">
-                <children xmi:id="_HCARWefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCARWufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCARW-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCARXOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCARXefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCARXufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARX-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARYOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARYefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARYufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARY-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARZOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCARZefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCARV-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCARWOfXEduqHoOJbURZRw" x="14571" y="14164"/>
-              </children>
-              <children xmi:id="_HCARZufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01A3">
-                <children xmi:id="_HCARaefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCARaufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCARa-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCARbOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCARbefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCARbufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARb-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARcOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARcefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARcufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARc-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARdOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCARdefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCARZ-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCARaOfXEduqHoOJbURZRw" x="14528" y="12589"/>
-              </children>
-              <children xmi:id="_HCARdufXEduqHoOJbURZRw" element="_3ADC7B74022D4213C91302C5">
-                <children xmi:id="_HCAReefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCAReufXEduqHoOJbURZRw" width="2827" height="939"/>
-                </children>
-                <children xmi:id="_HCARe-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCARfOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCARfefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCARfufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARf-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARgOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARgefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCARgufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCARg-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCKB0OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCKB0efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCARd-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCAReOfXEduqHoOJbURZRw" x="13673" y="10608"/>
-              </children>
-              <children xmi:id="_HCKB0ufXEduqHoOJbURZRw" element="_3ADC7B74022D40FD4EB402BB">
-                <children xmi:id="_HCKB1efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCKB1ufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCKB1-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCKB2OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCKB2efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCKB2ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKB2-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCKB3OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKB3efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCKB3ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKB3-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCKB4OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCKB4efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCKB0-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCKB1OfXEduqHoOJbURZRw" x="14376" y="21242" width="3564" height="2116"/>
-              </children>
-              <children xmi:id="_HCKCBefXEduqHoOJbURZRw" element="_3ADC7B74022D41DF41A501B6">
-                <children xmi:id="_HCKCCOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCKCCefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCKCCufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCKCC-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCKCDOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCKCDefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCDufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCKCD-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCEOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCKCEefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCEufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCKCE-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCKCFOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCKCBufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCKCB-fXEduqHoOJbURZRw" x="1574" y="10193" width="3454" height="13758"/>
-              </children>
-              <children xmi:id="_HCTzXOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01B7">
-                <children xmi:id="_HCTzX-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCTzYOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCTzYefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCTzYufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCTzY-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCTzZOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzZefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCTzZufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzZ-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCTzaOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzaefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCTzaufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCTza-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCTzXefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCTzXufXEduqHoOJbURZRw" x="15087" y="4817"/>
-              </children>
-              <children xmi:id="_HCTzbOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01B8">
-                <children xmi:id="_HCTzb-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCTzcOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCTzcefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCTzcufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCTzc-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCTzdOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzdefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCTzdufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzd-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc8wOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc8wefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc8wufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCc8w-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCTzbefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCTzbufXEduqHoOJbURZRw" x="14215" y="3445"/>
-              </children>
-              <children xmi:id="_HCc8xOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01CB">
-                <children xmi:id="_HCc8x-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCc8yOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCc8yefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCc8yufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCc8y-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCc8zOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc8zefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc8zufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc8z-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc80OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc80efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc80ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCc80-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCc8xefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCc8xufXEduqHoOJbURZRw" x="14351" y="5985"/>
-              </children>
-              <children xmi:id="_HCc81OfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5EE10111">
-                <children xmi:id="_HCc81-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCc82OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCc82efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCc82ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCc82-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCc83OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc83efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc83ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc83-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc84OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc84efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc84ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCc84-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCc81efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCc81ufXEduqHoOJbURZRw" x="24925" y="5274" width="2988" height="3674"/>
-              </children>
-              <children xmi:id="_HCc9EOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5D4700FB">
-                <children xmi:id="_HCc9E-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCc9FOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HCc9FefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCc9FufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCc9F-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCc9GOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9GefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc9GufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9G-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc9HOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9HefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCc9HufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCc9H-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCc9EefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCc9EufXEduqHoOJbURZRw" x="1566" y="2794" width="3573" height="6908"/>
-              </children>
-              <children xmi:id="_HCmt4OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01D5">
-                <children xmi:id="_HCmt4-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HCmt5OfXEduqHoOJbURZRw" width="4301" height="990"/>
-                </children>
-                <children xmi:id="_HCmt5efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HCmt5ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HCmt5-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HCmt6OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmt6efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCmt6ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmt6-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCmt7OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmt7efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HCmt7ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HCmt7-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HCmt4efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCmt4ufXEduqHoOJbURZRw" x="12987" y="7992"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GqUJt-fXEduqHoOJbURZRw" description="This diagram shows all guidance types and their relationships to other content elements.  Associations and multiplicities have been predefined on that level of detail to ensure that guidance is only related to appropriate content elements.  For example, UMA defines that only on checklist can be associated with one content element at a time.  Other packages add variability capabilities to checklists (and other content elements) that allows to dynamically provide additional check points or even check point groupings to check list so that an associated check list always contains the right check points within the context of a particular method configuration or process."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HCARPefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9200B0" source="_HB3G4OfXEduqHoOJbURZRw" target="_HCARLefXEduqHoOJbURZRw">
-                <children xmi:id="_HCARQOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCARQufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCARQ-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCARQefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCARPufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCARP-fXEduqHoOJbURZRw" points="[-1083, -245, 2218, 465]$[-2455, -533, 846, 177]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HCARROfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HCARRefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HCKB4ufXEduqHoOJbURZRw" element="_3ADC7B74022D40FD58B40236" source="_HCKB0ufXEduqHoOJbURZRw" target="_HCKB0ufXEduqHoOJbURZRw">
-                <children xmi:id="_HCKB5efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCKB5-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCKB6OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCKB5ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKB6efXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D40FD58B5037A">
-                  <children xmi:id="_HCKB6-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKB6ufXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HCKB7OfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40FD58B5037A">
-                  <children xmi:id="_HCKB7ufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKB7efXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HCKB7-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40FD58B50370">
-                  <children xmi:id="_HCKB8efXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKB8OfXEduqHoOJbURZRw" x="-342" y="457"/>
-                </children>
-                <children xmi:id="_HCKB8ufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40FD58B50370">
-                  <children xmi:id="_HCKB9OfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKB8-fXEduqHoOJbURZRw" x="295" y="-470"/>
-                </children>
-                <children xmi:id="_HCKB9efXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40FD58B5037A">
-                  <children xmi:id="_HCKB9-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKB-OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKB9ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKB-efXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40FD58B50370">
-                  <children xmi:id="_HCKB--fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKB_OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKB-ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKB_efXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40FD58B5037A">
-                  <children xmi:id="_HCKB_-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCAOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKB_ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCKCAefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40FD58B50370">
-                  <children xmi:id="_HCKCA-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCBOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCAufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCKB4-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCKB5OfXEduqHoOJbURZRw" points="[1778, 8, 1778, 8]$[3378, 8, 3378, 8]$[3378, 2590, 3378, 2590]$[804, 2590, 804, 2590]$[804, 1058, 804, 1058]"/>
-              </edges>
-              <edges xmi:id="_HCKCFefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920270" source="_HCARHefXEduqHoOJbURZRw" target="_HCKCBefXEduqHoOJbURZRw">
-                <children xmi:id="_HCKCGOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCKCGufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCKCG-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCKCGefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCHOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C920273">
-                  <children xmi:id="_HCKCHufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCHefXEduqHoOJbURZRw" x="-805" y="-279"/>
-                </children>
-                <children xmi:id="_HCKCH-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C920273">
-                  <children xmi:id="_HCKCIefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCIOfXEduqHoOJbURZRw" x="482" y="272"/>
-                </children>
-                <children xmi:id="_HCKCIufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C920271">
-                  <children xmi:id="_HCKCJOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCI-fXEduqHoOJbURZRw" x="1046" y="-372"/>
-                </children>
-                <children xmi:id="_HCKCJefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C920271">
-                  <children xmi:id="_HCKCJ-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCJufXEduqHoOJbURZRw" x="461" y="348"/>
-                </children>
-                <children xmi:id="_HCKCKOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C920273">
-                  <children xmi:id="_HCKCKufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCK-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCKefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCLOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C920271">
-                  <children xmi:id="_HCKCLufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCL-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCLefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCMOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C920273">
-                  <children xmi:id="_HCKCMufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCM-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCMefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCKCNOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C920271">
-                  <children xmi:id="_HCKCNufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCN-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCNefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCKCFufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCKCF-fXEduqHoOJbURZRw" points="[-1803, -101, 11049, 3098]$[-11235, -101, 1617, 3098]"/>
-              </edges>
-              <edges xmi:id="_HCKCQefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92028E" source="_HCARLefXEduqHoOJbURZRw" target="_HCKCBefXEduqHoOJbURZRw">
-                <children xmi:id="_HCKCROfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCKCRufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCKCR-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCKCRefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCSOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C920291">
-                  <children xmi:id="_HCKCSufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCSefXEduqHoOJbURZRw" x="-1041" y="-280"/>
-                </children>
-                <children xmi:id="_HCKCS-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C920291">
-                  <children xmi:id="_HCKCTefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCTOfXEduqHoOJbURZRw" x="635" y="169"/>
-                </children>
-                <children xmi:id="_HCKCTufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C92028F">
-                  <children xmi:id="_HCKCUOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCT-fXEduqHoOJbURZRw" x="975" y="-458"/>
-                </children>
-                <children xmi:id="_HCKCUefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C92028F">
-                  <children xmi:id="_HCKCU-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCUufXEduqHoOJbURZRw" x="492" y="347"/>
-                </children>
-                <children xmi:id="_HCKCVOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C920291">
-                  <children xmi:id="_HCKCVufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCV-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCVefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCWOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C92028F">
-                  <children xmi:id="_HCKCWufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCW-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCWefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCXOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C920291">
-                  <children xmi:id="_HCKCXufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCX-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCXefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCKCYOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C92028F">
-                  <children xmi:id="_HCKCYufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCY-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCYefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCKCQufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCKCQ-fXEduqHoOJbURZRw" points="[-846, 59, 11548, 1126]$[-10778, 59, 1617, 1126]"/>
-              </edges>
-              <edges xmi:id="_HCKCZOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5DD7014C" source="_HCARRufXEduqHoOJbURZRw" target="_HCKCBefXEduqHoOJbURZRw">
-                <children xmi:id="_HCKCZ-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCKCaefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCKCaufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCKCaOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCa-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DE5DD7014E">
-                  <children xmi:id="_HCKCbefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCbOfXEduqHoOJbURZRw" x="-936" y="-255"/>
-                </children>
-                <children xmi:id="_HCKCbufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41DE5DD7014E">
-                  <children xmi:id="_HCKCcOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCb-fXEduqHoOJbURZRw" x="-199" y="185"/>
-                </children>
-                <children xmi:id="_HCKCcefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DE5DD7014D">
-                  <children xmi:id="_HCKCc-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCcufXEduqHoOJbURZRw" x="937" y="-458"/>
-                </children>
-                <children xmi:id="_HCKCdOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41DE5DD7014D">
-                  <children xmi:id="_HCKCdufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCdefXEduqHoOJbURZRw" x="-79" y="312"/>
-                </children>
-                <children xmi:id="_HCKCd-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DE5DD7014E">
-                  <children xmi:id="_HCKCeefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCeufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCeOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCe-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DE5DD7014D">
-                  <children xmi:id="_HCKCfefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCfufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCfOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCKCf-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DE5DD7014E">
-                  <children xmi:id="_HCKCgefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKCgufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKCgOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCKCg-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DE5DD7014D">
-                  <children xmi:id="_HCKChefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCKChufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCKChOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCKCZefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCKCZufXEduqHoOJbURZRw" points="[-956, 16, 11184, -745]$[-10524, 16, 1617, -745]"/>
-              </edges>
-              <edges xmi:id="_HCTy0OfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5D73020E" source="_HCARVufXEduqHoOJbURZRw" target="_HCKCBefXEduqHoOJbURZRw">
-                <children xmi:id="_HCTy0-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCTy1efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCTy1ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCTy1OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTy1-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DE5D730210">
-                  <children xmi:id="_HCTy2efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy2OfXEduqHoOJbURZRw" x="-914" y="169"/>
-                </children>
-                <children xmi:id="_HCTy2ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41DE5D730210">
-                  <children xmi:id="_HCTy3OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy2-fXEduqHoOJbURZRw" x="-195" y="-297"/>
-                </children>
-                <children xmi:id="_HCTy3efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DE5D73020F">
-                  <children xmi:id="_HCTy3-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy3ufXEduqHoOJbURZRw" x="1039" y="-348"/>
-                </children>
-                <children xmi:id="_HCTy4OfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41DE5D73020F">
-                  <children xmi:id="_HCTy4ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy4efXEduqHoOJbURZRw" x="-138" y="245"/>
-                </children>
-                <children xmi:id="_HCTy4-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DE5D730210">
-                  <children xmi:id="_HCTy5efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTy5ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy5OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTy5-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DE5D73020F">
-                  <children xmi:id="_HCTy6efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTy6ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy6OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTy6-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DE5D730210">
-                  <children xmi:id="_HCTy7efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTy7ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy7OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCTy7-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DE5D73020F">
-                  <children xmi:id="_HCTy8efXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTy8ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy8OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCTy0efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCTy0ufXEduqHoOJbURZRw" points="[-922, 33, 11167, -2404]$[-10473, 33, 1617, -2404]"/>
-              </edges>
-              <edges xmi:id="_HCTy8-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5E5500C5" source="_HCARZufXEduqHoOJbURZRw" target="_HCKCBefXEduqHoOJbURZRw">
-                <children xmi:id="_HCTy9ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCTy-OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCTy-efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCTy9-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTy-ufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DE5E5500C7">
-                  <children xmi:id="_HCTy_OfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy--fXEduqHoOJbURZRw" x="-951" y="-457"/>
-                </children>
-                <children xmi:id="_HCTy_efXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41DE5E5500C7">
-                  <children xmi:id="_HCTy_-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTy_ufXEduqHoOJbURZRw" x="-206" y="220"/>
-                </children>
-                <children xmi:id="_HCTzAOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DE5E5500C6">
-                  <children xmi:id="_HCTzAufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzAefXEduqHoOJbURZRw" x="1192" y="-338"/>
-                </children>
-                <children xmi:id="_HCTzA-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41DE5E5500C6">
-                  <children xmi:id="_HCTzBefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzBOfXEduqHoOJbURZRw" x="-222" y="305"/>
-                </children>
-                <children xmi:id="_HCTzBufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DE5E5500C7">
-                  <children xmi:id="_HCTzCOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzCefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzB-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzCufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DE5E5500C6">
-                  <children xmi:id="_HCTzDOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzDefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzC-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzDufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DE5E5500C7">
-                  <children xmi:id="_HCTzEOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzEefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzD-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCTzEufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DE5E5500C6">
-                  <children xmi:id="_HCTzFOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzFefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzE-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCTy9OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCTy9efXEduqHoOJbURZRw" points="[-914, -42, 11125, -4055]$[-10422, -42, 1617, -4055]"/>
-              </edges>
-              <edges xmi:id="_HCTzFufXEduqHoOJbURZRw" element="_3ADC7B74022D4213C93D0321" source="_HCKCBefXEduqHoOJbURZRw" target="_HCARdufXEduqHoOJbURZRw">
-                <children xmi:id="_HCTzGefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCTzG-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCTzHOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCTzGufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzHefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4213C93F0099">
-                  <children xmi:id="_HCTzH-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzHufXEduqHoOJbURZRw" x="-1062" y="347"/>
-                </children>
-                <children xmi:id="_HCTzIOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4213C93F0099">
-                  <children xmi:id="_HCTzIufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzIefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HCTzI-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4213C93F0049">
-                  <children xmi:id="_HCTzJefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzJOfXEduqHoOJbURZRw" x="893" y="-102"/>
-                </children>
-                <children xmi:id="_HCTzJufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4213C93F0049">
-                  <children xmi:id="_HCTzKOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzJ-fXEduqHoOJbURZRw" x="537" y="211"/>
-                </children>
-                <children xmi:id="_HCTzKefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4213C93F0099">
-                  <children xmi:id="_HCTzK-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzLOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzKufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzLefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4213C93F0049">
-                  <children xmi:id="_HCTzL-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzMOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzLufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzMefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4213C93F0099">
-                  <children xmi:id="_HCTzM-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzNOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzMufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCTzNefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4213C93F0049">
-                  <children xmi:id="_HCTzN-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzOOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzNufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCTzF-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCTzGOfXEduqHoOJbURZRw" points="[1617, -6036, -10066, -42]$[10270, -6036, -1413, -42]"/>
-              </edges>
-              <edges xmi:id="_HCTzOefXEduqHoOJbURZRw" element="_3ADC7B74022D41DF41C603A0" source="_HCKB0ufXEduqHoOJbURZRw" target="_HCKCBefXEduqHoOJbURZRw">
-                <children xmi:id="_HCTzPOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCTzPufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCTzP-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCTzPefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzQOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DF41C603A2">
-                  <children xmi:id="_HCTzQufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzQefXEduqHoOJbURZRw" x="-1132" y="137"/>
-                </children>
-                <children xmi:id="_HCTzQ-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41DF41C603A2">
-                  <children xmi:id="_HCTzRefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzROfXEduqHoOJbURZRw" x="-438" y="-439"/>
-                </children>
-                <children xmi:id="_HCTzRufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DF41C603A1">
-                  <children xmi:id="_HCTzSOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzR-fXEduqHoOJbURZRw" x="644" y="196"/>
-                </children>
-                <children xmi:id="_HCTzSefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41DF41C603A1">
-                  <children xmi:id="_HCTzS-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzSufXEduqHoOJbURZRw" x="-778" y="-261"/>
-                </children>
-                <children xmi:id="_HCTzTOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DF41C603A2">
-                  <children xmi:id="_HCTzTufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzT-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzTefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzUOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DF41C603A1">
-                  <children xmi:id="_HCTzUufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzU-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzUefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCTzVOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DF41C603A2">
-                  <children xmi:id="_HCTzVufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzV-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzVefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCTzWOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DF41C603A1">
-                  <children xmi:id="_HCTzWufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCTzW-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCTzWefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCTzOufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCTzO-fXEduqHoOJbURZRw" points="[-1778, -50, 10972, 5181]$[-11133, -50, 1617, 5181]"/>
-              </edges>
-              <edges xmi:id="_HCc87efXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5FF70304" source="_HCc8xOfXEduqHoOJbURZRw" target="_HCc81OfXEduqHoOJbURZRw">
-                <children xmi:id="_HCc88OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCc88ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCc88-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCc88efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc89OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DE5FF70306">
-                  <children xmi:id="_HCc89ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc89efXEduqHoOJbURZRw" x="-732" y="-212"/>
-                </children>
-                <children xmi:id="_HCc89-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41DE5FF70306">
-                  <children xmi:id="_HCc8-efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc8-OfXEduqHoOJbURZRw" x="64" y="304"/>
-                </children>
-                <children xmi:id="_HCc8-ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DE5FF70305">
-                  <children xmi:id="_HCc8_OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc8--fXEduqHoOJbURZRw" x="978" y="-254"/>
-                </children>
-                <children xmi:id="_HCc8_efXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41DE5FF70305">
-                  <children xmi:id="_HCc8_-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc8_ufXEduqHoOJbURZRw" x="716" y="-263"/>
-                </children>
-                <children xmi:id="_HCc9AOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DE5FF70306">
-                  <children xmi:id="_HCc9AufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9A-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9AefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9BOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DE5FF70305">
-                  <children xmi:id="_HCc9BufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9B-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9BefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9COfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DE5FF70306">
-                  <children xmi:id="_HCc9CufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9C-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9CefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCc9DOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DE5FF70305">
-                  <children xmi:id="_HCc9DufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9D-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9DefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCc87ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCc87-fXEduqHoOJbURZRw" points="[1041, -101, -9982, -762]$[9533, -101, -1490, -762]"/>
-              </edges>
-              <edges xmi:id="_HCc9IOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5E4403E1" source="_HCTzXOfXEduqHoOJbURZRw" target="_HCc9EOfXEduqHoOJbURZRw">
-                <children xmi:id="_HCc9I-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCc9JefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCc9JufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCc9JOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9J-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DE5E4403E3">
-                  <children xmi:id="_HCc9KefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9KOfXEduqHoOJbURZRw" x="-255" y="-278"/>
-                </children>
-                <children xmi:id="_HCc9KufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41DE5E4403E3">
-                  <children xmi:id="_HCc9LOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9K-fXEduqHoOJbURZRw" x="372" y="416"/>
-                </children>
-                <children xmi:id="_HCc9LefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DE5E4403E2">
-                  <children xmi:id="_HCc9L-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9LufXEduqHoOJbURZRw" x="1224" y="-278"/>
-                </children>
-                <children xmi:id="_HCc9MOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41DE5E4403E2">
-                  <children xmi:id="_HCc9MufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9MefXEduqHoOJbURZRw" x="98" y="331"/>
-                </children>
-                <children xmi:id="_HCc9M-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DE5E4403E3">
-                  <children xmi:id="_HCc9NefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9NufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9NOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9N-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DE5E4403E2">
-                  <children xmi:id="_HCc9OefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9OufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9OOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9O-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DE5E4403E3">
-                  <children xmi:id="_HCc9PefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9PufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9POfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCc9P-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DE5E4403E2">
-                  <children xmi:id="_HCc9QefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9QufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9QOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCc9IefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCc9IufXEduqHoOJbURZRw" points="[-762, -67, 10871, -1032]$[-9956, -67, 1676, -1032]"/>
-              </edges>
-              <edges xmi:id="_HCc9Q-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DE5E6102CC" source="_HCTzbOfXEduqHoOJbURZRw" target="_HCc9EOfXEduqHoOJbURZRw">
-                <children xmi:id="_HCc9RufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCc9SOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCc9SefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCc9R-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9SufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41DE5E6102CE">
-                  <children xmi:id="_HCc9TOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9S-fXEduqHoOJbURZRw" x="-905" y="-313"/>
-                </children>
-                <children xmi:id="_HCc9TefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41DE5E6102CE">
-                  <children xmi:id="_HCc9T-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9TufXEduqHoOJbURZRw" x="-126" y="288"/>
-                </children>
-                <children xmi:id="_HCc9UOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41DE5E6102CD">
-                  <children xmi:id="_HCc9UufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9UefXEduqHoOJbURZRw" x="1094" y="288"/>
-                </children>
-                <children xmi:id="_HCc9U-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41DE5E6102CD">
-                  <children xmi:id="_HCc9VefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9VOfXEduqHoOJbURZRw" x="154" y="-372"/>
-                </children>
-                <children xmi:id="_HCc9VufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41DE5E6102CE">
-                  <children xmi:id="_HCc9WOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9WefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9V-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9WufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41DE5E6102CD">
-                  <children xmi:id="_HCc9XOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9XefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9W-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCc9XufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41DE5E6102CE">
-                  <children xmi:id="_HCc9YOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9YefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9X-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCc9YufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41DE5E6102CD">
-                  <children xmi:id="_HCc9ZOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCc9ZefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCc9Y-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCc9ROfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCc9RefXEduqHoOJbURZRw" points="[-922, -59, 10761, -2396]$[-10007, -59, 1676, -2396]"/>
-              </edges>
-              <edges xmi:id="_HCc9b-fXEduqHoOJbURZRw" element="_3ADC7B74022D427ABC8802D0" source="_HCc9EOfXEduqHoOJbURZRw" target="_HCc8xOfXEduqHoOJbURZRw">
-                <children xmi:id="_HCmtwOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCmtwufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCmtw-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCmtwefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmtxOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427ABC89037E">
-                  <children xmi:id="_HCmtxufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmtxefXEduqHoOJbURZRw" x="-995" y="-212"/>
-                </children>
-                <children xmi:id="_HCmtx-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427ABC89037E">
-                  <children xmi:id="_HCmtyefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmtyOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HCmtyufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427ABC89037C">
-                  <children xmi:id="_HCmtzOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmty-fXEduqHoOJbURZRw" x="901" y="-110"/>
-                </children>
-                <children xmi:id="_HCmtzefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427ABC89037C">
-                  <children xmi:id="_HCmtz-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmtzufXEduqHoOJbURZRw" x="20" y="322"/>
-                </children>
-                <children xmi:id="_HCmt0OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427ABC89037E">
-                  <children xmi:id="_HCmt0ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmt0-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmt0efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmt1OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427ABC89037C">
-                  <children xmi:id="_HCmt1ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmt1-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmt1efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmt2OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427ABC89037E">
-                  <children xmi:id="_HCmt2ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmt2-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmt2efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCmt3OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427ABC89037C">
-                  <children xmi:id="_HCmt3ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmt3-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmt3efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCc9cOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCc9cefXEduqHoOJbURZRw" points="[1676, 203, -10261, 0]$[10896, 203, -1041, 0]"/>
-              </edges>
-              <edges xmi:id="_HCmt8OfXEduqHoOJbURZRw" element="_3ADC7B74022D44D8F5140226" source="_HCmt4OfXEduqHoOJbURZRw" target="_HCc81OfXEduqHoOJbURZRw">
-                <children xmi:id="_HCmt8-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCmt9efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCmt9ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCmt9OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmt9-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D44D8F5140228">
-                  <children xmi:id="_HCmt-efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmt-OfXEduqHoOJbURZRw" x="-697" y="-238"/>
-                </children>
-                <children xmi:id="_HCmt-ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D44D8F5140228">
-                  <children xmi:id="_HCmt_OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmt--fXEduqHoOJbURZRw" x="1437" y="262"/>
-                </children>
-                <children xmi:id="_HCmt_efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D44D8F5140227">
-                  <children xmi:id="_HCmt_-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmt_ufXEduqHoOJbURZRw" x="842" y="-204"/>
-                </children>
-                <children xmi:id="_HCmuAOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D44D8F5140227">
-                  <children xmi:id="_HCmuAufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuAefXEduqHoOJbURZRw" x="384" y="355"/>
-                </children>
-                <children xmi:id="_HCmuA-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D44D8F5140228">
-                  <children xmi:id="_HCmuBefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuBufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuBOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmuB-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D44D8F5140227">
-                  <children xmi:id="_HCmuCefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuCufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuCOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmuC-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D44D8F5140228">
-                  <children xmi:id="_HCmuDefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuDufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuDOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCmuD-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D44D8F5140227">
-                  <children xmi:id="_HCmuEefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuEufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuEOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCmt8efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCmt8ufXEduqHoOJbURZRw" points="[2150, -16, -9127, 1354]$[9787, -16, -1490, 1354]"/>
-              </edges>
-              <edges xmi:id="_HCmuE-fXEduqHoOJbURZRw" element="_3ADC7B74022D44D8F51800F5" source="_HCmt4OfXEduqHoOJbURZRw" target="_HCc9EOfXEduqHoOJbURZRw">
-                <children xmi:id="_HCmuFufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HCmuGOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HCmuGefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HCmuF-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmuGufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D44D8F51800F7">
-                  <children xmi:id="_HCmuHOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuG-fXEduqHoOJbURZRw" x="-789" y="-457"/>
-                </children>
-                <children xmi:id="_HCmuHefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D44D8F51800F7">
-                  <children xmi:id="_HCmuH-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuHufXEduqHoOJbURZRw" x="1395" y="347"/>
-                </children>
-                <children xmi:id="_HCmuIOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D44D8F51800F6">
-                  <children xmi:id="_HCmuIufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuIefXEduqHoOJbURZRw" x="783" y="-457"/>
-                </children>
-                <children xmi:id="_HCmuI-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D44D8F51800F6">
-                  <children xmi:id="_HCmuJefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuJOfXEduqHoOJbURZRw" x="377" y="347"/>
-                </children>
-                <children xmi:id="_HCmuJufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D44D8F51800F7">
-                  <children xmi:id="_HCmuKOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuKefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuJ-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmuKufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D44D8F51800F6">
-                  <children xmi:id="_HCmuLOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuLefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuK-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HCmuLufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D44D8F51800F7">
-                  <children xmi:id="_HCmuMOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuMefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuL-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HCmuMufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D44D8F51800F6">
-                  <children xmi:id="_HCmuNOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HCmuNefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HCmuM-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HCmuFOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HCmuFefXEduqHoOJbURZRw" points="[-2150, 0, 9533, 2235]$[-10007, 0, 1676, 2235]"/>
-              </edges>
-              <edges xmi:id="_-g7LsO0oEdutCLECN96BNw" element="_-d8wMO0oEdutCLECN96BNw" source="_HCKCBefXEduqHoOJbURZRw" target="_HCAQ3efXEduqHoOJbURZRw">
-                <children xmi:id="_-g7Ls-0oEdutCLECN96BNw" type="NameLabel">
-                  <children xmi:id="_-g7Lte0oEdutCLECN96BNw" type="Stereotype"/>
-                  <children xmi:id="_-g7Ltu0oEdutCLECN96BNw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-g7LtO0oEdutCLECN96BNw" y="-186"/>
-                </children>
-                <children xmi:id="_-g7Lt-0oEdutCLECN96BNw" type="ToMultiplicityLabel" element="_-gBz0u0oEdutCLECN96BNw">
-                  <children xmi:id="_-g7Lue0oEdutCLECN96BNw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-g7LuO0oEdutCLECN96BNw" x="-477" y="263"/>
-                </children>
-                <children xmi:id="_-g7Luu0oEdutCLECN96BNw" type="ToRoleLabel" element="_-gBz0u0oEdutCLECN96BNw">
-                  <children xmi:id="_-g7LvO0oEdutCLECN96BNw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-g7Lu-0oEdutCLECN96BNw" y="-397"/>
-                </children>
-                <children xmi:id="_-g7Lve0oEdutCLECN96BNw" type="FromMultiplicityLabel" element="_-e1hAO0oEdutCLECN96BNw">
-                  <children xmi:id="_-g7Lv-0oEdutCLECN96BNw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-g7Lvu0oEdutCLECN96BNw" x="317" y="237"/>
-                </children>
-                <children xmi:id="_-g7LwO0oEdutCLECN96BNw" type="FromRoleLabel" element="_-e1hAO0oEdutCLECN96BNw">
-                  <children xmi:id="_-g7Lwu0oEdutCLECN96BNw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-g7Lwe0oEdutCLECN96BNw" x="-667" y="-208"/>
-                </children>
-                <children xmi:id="_-g7Lw-0oEdutCLECN96BNw" type="ToQualifierLabel" element="_-gBz0u0oEdutCLECN96BNw">
-                  <children xmi:id="_-g7Lxe0oEdutCLECN96BNw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-g7Lxu0oEdutCLECN96BNw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-g7LxO0oEdutCLECN96BNw" y="-186"/>
-                </children>
-                <children xmi:id="_-hE8sO0oEdutCLECN96BNw" type="FromQualifierLabel" element="_-e1hAO0oEdutCLECN96BNw">
-                  <children xmi:id="_-hE8su0oEdutCLECN96BNw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-hE8s-0oEdutCLECN96BNw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-hE8se0oEdutCLECN96BNw" y="-186"/>
-                </children>
-                <children xmi:id="_-hE8tO0oEdutCLECN96BNw" type="ToConstraintLabel" element="_-gBz0u0oEdutCLECN96BNw">
-                  <children xmi:id="_-hE8tu0oEdutCLECN96BNw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-hE8t-0oEdutCLECN96BNw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-hE8te0oEdutCLECN96BNw" y="1058"/>
-                </children>
-                <children xmi:id="_-hE8uO0oEdutCLECN96BNw" type="FromConstraintLabel" element="_-e1hAO0oEdutCLECN96BNw">
-                  <children xmi:id="_-hE8uu0oEdutCLECN96BNw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_-hE8u-0oEdutCLECN96BNw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_-hE8ue0oEdutCLECN96BNw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_-g7Lse0oEdutCLECN96BNw" routing="Rectilinear" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-g7Lsu0oEdutCLECN96BNw" points="[65, 57, -262, -184]$[270, 245, -57, 4]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F49FE703C1" type="Class" name="Taxonomy">
-              <children xmi:id="_HC5osOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E019A">
-                <children xmi:id="_HC5os-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HC5otOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HC5otefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HC5otufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HC5ot-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HC5ouOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5ouefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5ouufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5ou-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5ovOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5ovefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5ovufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HC5ov-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HC5osefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HC5osufXEduqHoOJbURZRw" x="26937" y="10011"/>
-              </children>
-              <children xmi:id="_HC5owOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0199">
-                <children xmi:id="_HC5ow-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HC5oxOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HC5oxefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HC5oxufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HC5ox-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HC5oyOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5oyefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5oyufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5oy-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5ozOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5ozefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5ozufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HC5oz-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HC5owefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HC5owufXEduqHoOJbURZRw" x="29356" y="10011"/>
-              </children>
-              <children xmi:id="_HC5o0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01A3">
-                <children xmi:id="_HC5o0-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HC5o1OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HC5o1efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HC5o1ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HC5o1-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HC5o2OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5o2efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5o2ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5o2-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5o3OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5o3efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5o3ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HC5o3-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HC5o0efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HC5o0ufXEduqHoOJbURZRw" x="22056" y="10011"/>
-              </children>
-              <children xmi:id="_HC5o4OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01B7">
-                <children xmi:id="_HC5o4-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HC5o5OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HC5o5efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HC5o5ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HC5o5-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HC5o6OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5o6efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5o6ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5o6-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5o7OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HC5o7efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HC5o7ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HC5o7-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HC5o4efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HC5o4ufXEduqHoOJbURZRw" x="19917" y="10011"/>
-              </children>
-              <children xmi:id="_HC5o8OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01C1">
-                <children xmi:id="_HDDZsOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDZsefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDZsufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDZs-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDZtOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDZtefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZtufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZt-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZuOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZuefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZuufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZu-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDZvOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HC5o8efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HC5o8ufXEduqHoOJbURZRw" x="491" y="10011"/>
-              </children>
-              <children xmi:id="_HDDZvefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01A4">
-                <children xmi:id="_HDDZwOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDZwefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDZwufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDZw-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDZxOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDZxefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZxufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZx-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZyOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZyefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZyufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZy-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDZzOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDDZvufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDZv-fXEduqHoOJbURZRw" x="9917" y="10002"/>
-              </children>
-              <children xmi:id="_HDDZzefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01B8">
-                <children xmi:id="_HDDZ0OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDZ0efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDZ0ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDZ0-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDZ1OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDZ1efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ1ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ1-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ2OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ2efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ2ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ2-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDZ3OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDDZzufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDZz-fXEduqHoOJbURZRw" x="24400" y="10011"/>
-              </children>
-              <children xmi:id="_HDDZ3efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01F3">
-                <children xmi:id="_HDDZ4OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDZ4efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDZ4ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDZ4-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDZ5OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDZ5efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ5ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ5-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ6OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ6efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ6ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ6-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDZ7OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDDZ3ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDZ3-fXEduqHoOJbURZRw" x="6618" y="10011"/>
-              </children>
-              <children xmi:id="_HDDZ7efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01CB">
-                <children xmi:id="_HDDZ8OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDZ8efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDZ8ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDZ8-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDZ9OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDZ9efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ9ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ9-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ-OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ-efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDZ-ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDZ--fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDZ_OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDDZ7ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDZ7-fXEduqHoOJbURZRw" x="12373" y="10011"/>
-              </children>
-              <children xmi:id="_HDDZ_efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01E0">
-                <children xmi:id="_HDDaAOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDaAefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDaAufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDaA-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDaBOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDaBefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaBufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaB-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaCOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaCefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaCufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaC-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDaDOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDDZ_ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDZ_-fXEduqHoOJbURZRw" x="29164" y="11729"/>
-              </children>
-              <children xmi:id="_HDDaFufXEduqHoOJbURZRw" element="_3ADC7B74022D40FD4EB402BB">
-                <children xmi:id="_HDDaGefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDaGufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDaG-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDaHOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDaHefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDaHufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaH-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaIOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaIefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaIufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaI-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaJOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDaJefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDDaF-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDaGOfXEduqHoOJbURZRw" x="4331" y="10011"/>
-              </children>
-              <children xmi:id="_HDDaJufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E026C">
-                <children xmi:id="_HDDaKefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDDaKufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDDaK-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDDaLOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDDaLefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDDaLufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaL-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaMOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaMefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaMufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDDaM-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDDaNOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDDaNefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDDaJ-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDaKOfXEduqHoOJbURZRw" x="15827" y="4835" width="3479" height="1100"/>
-              </children>
-              <children xmi:id="_HDMj2efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02DA">
-                <children xmi:id="_HDMj3OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDMj3efXEduqHoOJbURZRw" width="3776" height="1134"/>
-                </children>
-                <children xmi:id="_HDMj3ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDMj3-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDMj4OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDMj4efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMj4ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMj4-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMj5OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMj5efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMj5ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMj5-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDMj6OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDMj2ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMj2-fXEduqHoOJbURZRw" x="15508" y="7345"/>
-              </children>
-              <children xmi:id="_HDMj--fXEduqHoOJbURZRw" element="_3ADC7B74022D4213C91302C5">
-                <children xmi:id="_HDMj_ufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDMj_-fXEduqHoOJbURZRw" width="2802" height="999"/>
-                </children>
-                <children xmi:id="_HDMkAOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDMkAefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDMkAufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDMkA-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMkBOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMkBefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMkBufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMkB-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMkCOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMkCefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDMkCufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDMj_OfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMj_efXEduqHoOJbURZRw" x="31739" y="10021"/>
-              </children>
-              <children xmi:id="_HDMkFOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_HDMkF-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDMkGOfXEduqHoOJbURZRw" width="3522" height="1066"/>
-                </children>
-                <children xmi:id="_HDMkGefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDMkGufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDMkG-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDMkHOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMkHefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMkHufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMkH-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMkIOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDMkIefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDMkIufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDMkI-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDMkFefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMkFufXEduqHoOJbURZRw" x="15850" y="2853"/>
-              </children>
-              <children xmi:id="_821wEOoVEduOBPQA2hKqUQ" element="_3ADC7B74022D40F36C5E01D5">
-                <children xmi:id="_821wE-oVEduOBPQA2hKqUQ" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_821wFOoVEduOBPQA2hKqUQ" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_821wFeoVEduOBPQA2hKqUQ" type="Stereotype"/>
-                <children xmi:id="_821wFuoVEduOBPQA2hKqUQ" type="Name"/>
-                <children xmi:id="_821wF-oVEduOBPQA2hKqUQ" type="Parent"/>
-                <children xmi:id="_821wGOoVEduOBPQA2hKqUQ" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_821wGeoVEduOBPQA2hKqUQ"/>
-                </children>
-                <children xmi:id="_821wGuoVEduOBPQA2hKqUQ" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_821wG-oVEduOBPQA2hKqUQ"/>
-                </children>
-                <children xmi:id="_821wHOoVEduOBPQA2hKqUQ" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_821wHeoVEduOBPQA2hKqUQ"/>
-                </children>
-                <children xmi:id="_821wHuoVEduOBPQA2hKqUQ" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_821wH-oVEduOBPQA2hKqUQ"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_821wEeoVEduOBPQA2hKqUQ" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_821wEuoVEduOBPQA2hKqUQ" x="15195" y="10009"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gqd6kefXEduqHoOJbURZRw" description="The Guidance Types package defines a number of pre-defined concrete guidance types that can be related to specific content elements.  Guidance is a content element itself, so it is possible to associate guidance to guidance. This diagram shows the taxonomy of all guidance types."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HDDaDefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9200B0" source="_HDDZ_efXEduqHoOJbURZRw" target="_HC5owOfXEduqHoOJbURZRw">
-                <children xmi:id="_HDDaEOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDDaEufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDDaE-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDaEefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDDaDufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDDaD-fXEduqHoOJbURZRw" points="[0, -318, 0, 1773]$[0, -1773, 0, 318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaFOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaFefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDDaRufXEduqHoOJbURZRw" element="_3ADC7B74022D41DF466F0119" source="_HC5o8OfXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDDaSefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDDaS-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDDaTOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDaSufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDDaR-fXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDDaSOfXEduqHoOJbURZRw" points="[952, -317, -12039, 4022]$[11562, -3862, -1429, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaTefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaTufXEduqHoOJbURZRw" id="(0.19396244,0.38712972)"/>
-              </edges>
-              <edges xmi:id="_HDDaT-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DF46730055" source="_HDDaFufXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDDaUufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDDaVOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDDaVefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDaU-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDDaUOfXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDDaUefXEduqHoOJbURZRw" points="[740, -317, -9314, 4022]$[8942, -3862, -1112, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaVufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaV-fXEduqHoOJbURZRw" id="(0.1561683,0.7926456)"/>
-              </edges>
-              <edges xmi:id="_HDDaWOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F4D2AB03CA" source="_HDDZ3efXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDDaW-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDDaXefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDDaXufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDaXOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDDaWefXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDDaWufXEduqHoOJbURZRw" points="[555, -317, -6959, 4022]$[6693, -3862, -821, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaX-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDDaYOfXEduqHoOJbURZRw" id="(0.2821488,0.76608783)"/>
-              </edges>
-              <edges xmi:id="_HDDaYefXEduqHoOJbURZRw" element="_3ADC7B74022D41DF467B025D" source="_HDDZvefXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDDaZOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDDaZufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMjoOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDDaZefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDDaYufXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDDaY-fXEduqHoOJbURZRw" points="[370, -317, -4631, 4022]$[4445, -3862, -556, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjoefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDMjo-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92009B" source="_HDDZ7efXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDMjpufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMjqOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMjqefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMjp-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMjpOfXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMjpefXEduqHoOJbURZRw" points="[185, -317, -2382, 4022]$[2276, -3862, -291, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjqufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDMjrOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920090" source="_HC5o4OfXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDMjr-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMjsefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMjsufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMjsOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMjrefXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMjrufXEduqHoOJbURZRw" points="[-27, -317, 370, 4022]$[-344, -3862, 53, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjs-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjtOfXEduqHoOJbURZRw" id="(0.47706205,0.76608783)"/>
-              </edges>
-              <edges xmi:id="_HDMjtefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92005F" source="_HC5o0OfXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDMjuOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMjuufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMju-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMjuefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMjtufXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMjt-fXEduqHoOJbURZRw" points="[-106, -317, 1349, 4022]$[-1297, -3862, 158, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjvOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjvefXEduqHoOJbURZRw" id="(0.5966247,0.7926456)"/>
-              </edges>
-              <edges xmi:id="_HDMjvufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920091" source="_HDDZzefXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDMjwefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMjw-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMjxOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMjwufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMjv-fXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMjwOfXEduqHoOJbURZRw" points="[-265, -317, 3439, 4022]$[-3307, -3862, 397, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjxefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjxufXEduqHoOJbURZRw" id="(0.6907535,0.7926456)"/>
-              </edges>
-              <edges xmi:id="_HDMjx-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92005E" source="_HC5osOfXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDMjyufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMjzOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMjzefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMjy-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMjyOfXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMjyefXEduqHoOJbURZRw" points="[-423, -317, 5424, 4022]$[-5212, -3862, 635, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjzufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMjz-fXEduqHoOJbURZRw" id="(0.7663418,0.5771195)"/>
-              </edges>
-              <edges xmi:id="_HDMj0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920056" source="_HC5owOfXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDMj0-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMj1efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMj1ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMj1OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMj0efXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMj0ufXEduqHoOJbURZRw" points="[-582, -317, 7487, 4022]$[-7170, -3862, 899, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMj1-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMj2OfXEduqHoOJbURZRw" id="(0.8668885,0.7926456)"/>
-              </edges>
-              <edges xmi:id="_HDMj6efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C93011D" source="_HDMj2efXEduqHoOJbURZRw" target="_HDDaJufXEduqHoOJbURZRw">
-                <children xmi:id="_HDMj7OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMj7ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMj7-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMj7efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMj6ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMj6-fXEduqHoOJbURZRw" points="[-80, -502, 0, 1350]$[-80, -1296, 0, 556]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMj8OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMj8efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDMkC-fXEduqHoOJbURZRw" element="_3ADC7B74022D422FA0C3007C" source="_HDMj--fXEduqHoOJbURZRw" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDMkDufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMkEOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMkEefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMkD-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMkDOfXEduqHoOJbURZRw" routing="Tree" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMkDefXEduqHoOJbURZRw" points="[-768, -318, 9789, 3995]$[-9393, -3836, 1164, 477]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMkEufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMkE-fXEduqHoOJbURZRw" id="(0.88590443,0.5771195)"/>
-              </edges>
-              <edges xmi:id="_HDMkJOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC4A0306" source="_HDDaJufXEduqHoOJbURZRw" target="_HDMkFOfXEduqHoOJbURZRw">
-                <children xmi:id="_HDMkJ-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDMkKefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDMkKufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDMkKOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDMkJefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDMkJufXEduqHoOJbURZRw" points="[-26, -555, 0, 1588]$[-26, -1825, 0, 318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMkK-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDMkLOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_821wIOoVEduOBPQA2hKqUQ" element="_3ADC7B74022D40F4A1D60245" source="_821wEOoVEduOBPQA2hKqUQ" target="_HDMj2efXEduqHoOJbURZRw">
-                <children xmi:id="_821wI-oVEduOBPQA2hKqUQ" type="NameLabel">
-                  <children xmi:id="_821wJeoVEduOBPQA2hKqUQ" type="Stereotype"/>
-                  <children xmi:id="_821wJuoVEduOBPQA2hKqUQ" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_821wJOoVEduOBPQA2hKqUQ" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_821wIeoVEduOBPQA2hKqUQ" routing="Tree" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_821wIuoVEduOBPQA2hKqUQ" points="[79, -317, -1244, 5213]$[1217, -5053, -106, 477]"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GpH2y-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0190">
-            <body>03</body>
-          </ownedComment>
-          <packageMerge xmi:id="_N19lcOxMEduONrMRgmz48A" mergedPackage="_3ADC7B74022D40F36C5E0294"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0199" name="Concept">
-            <ownedComment xmi:id="_GpRnxufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0199">
-              <body>A Concept is a specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C920056" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E019A" name="Checklist">
-            <ownedComment xmi:id="_GpRnyufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E019A">
-              <body>A Checklist is a specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. </body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92005E" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01A3" name="Example">
-            <ownedComment xmi:id="_GpRnzufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01A3">
-              <body>An Example is a specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92005F" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01A4" name="Guideline">
-            <ownedComment xmi:id="_GpRn0ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01A4">
-              <body>A Guideline is a specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41DF467B025D" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01B7" name="Report">
-            <ownedComment xmi:id="_Gpaxs-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01B7">
-              <body>A Report is a predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C920090" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01B8" name="Template">
-            <ownedComment xmi:id="_Gpaxt-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01B8">
-              <body>A Template is a specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C920091" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01C1" name="SupportingMaterial">
-            <ownedComment xmi:id="_Gpaxu-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01C1">
-              <body>Supporting Materials is catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41DF466F0119" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01CB" name="ToolMentor">
-            <ownedComment xmi:id="_Gpaxv-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01CB">
-              <body>A Tool Mentor is a specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92009B" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01E0" name="Whitepaper">
-            <ownedComment xmi:id="_Gpaxw-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01E0">
-              <body>Whitepapers are a special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C9200B0" general="_3ADC7B74022D40F36C5E0199"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01F3" name="TermDefinition">
-            <ownedComment xmi:id="_Gpkis-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01F3">
-              <body>TermDefinitions define concepts and are used to build up the Glossary. They are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F4D2AB03CA" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40FD4EB402BB" name="Practice">
-            <ownedComment xmi:id="_Gpkit-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD4EB402BB">
-              <body>A Practice represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be &quot;Manage Risks&quot;, &quot;Continuously verify quality&quot;, &quot;Architecture-centric and component-based development&quot;, etc.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41DF46730055" general="_3ADC7B74022D40F36C5E02DA"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD58B50370" name="subPractices" visibility="public" type="_3ADC7B74022D40FD4EB402BB" aggregation="composite" association="_3ADC7B74022D40FD58B40236">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqKYpefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqKYpOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DF41C603A1" name="contentReferences" visibility="public" type="_3ADC7B74022D41DF41A501B6" association="_3ADC7B74022D41DF41C603A0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJk-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJkufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE5D4700FB" name="WorkProduct" isAbstract="true">
-            <ownedComment xmi:id="_Gpkiu-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5D4700FB">
-              <body>This is the Guidance Types package's extension of Work Product (defined in Content Elements) providing additonal associations.</body>
-            </ownedComment>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DE5E4403E3" name="reports" visibility="public" type="_3ADC7B74022D40F36C5E01B7" association="_3ADC7B74022D41DE5E4403E1">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqBOr-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqBOrufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DE5E6102CE" name="templates" visibility="public" type="_3ADC7B74022D40F36C5E01B8" association="_3ADC7B74022D41DE5E6102CC">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqKYlufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqKYlefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427ABC89037C" name="toolMentors" visibility="public" type="_3ADC7B74022D40F36C5E01CB" association="_3ADC7B74022D427ABC8802D0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJo-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJoufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D44D8F51800F7" name="estimationConsiderations" visibility="public" type="_3ADC7B74022D40F36C5E01D5" association="_3ADC7B74022D44D8F51800F5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJtOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJs-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE5EE10111" name="Task">
-            <ownedComment xmi:id="_Gpkiv-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5EE10111">
-              <body>This is the Guidance Types package's extension of Task (defined in Content Elements) providing additional associations.</body>
-            </ownedComment>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DE5FF70306" name="toolMentors" visibility="public" type="_3ADC7B74022D40F36C5E01CB" association="_3ADC7B74022D41DE5FF70304">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqKYn-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqKYnufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D44D8F5140228" name="estimationConsiderations" visibility="public" type="_3ADC7B74022D40F36C5E01D5" association="_3ADC7B74022D44D8F5140226">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJrefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJrOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DF41A501B6" name="ContentElement" isAbstract="true">
-            <ownedComment xmi:id="_GpuTs-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DF41A501B6">
-              <body>This is the Guidance Types package's extension of Content Element (defined in Content Elements) providing additonal associations.</body>
-            </ownedComment>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920273" name="supportingMaterials" visibility="public" type="_3ADC7B74022D40F36C5E01C1" association="_3ADC7B74022D40F36C920270">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gp3dqOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gp3dp-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920291" name="conceptsAndPapers" visibility="public" type="_3ADC7B74022D40F36C5E0199" association="_3ADC7B74022D40F36C92028E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gp3dsefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gp3dsOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DE5D730210" name="checklists" visibility="public" type="_3ADC7B74022D40F36C5E019A" association="_3ADC7B74022D41DE5D73020E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gp3duufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gp3duefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DE5DD7014E" name="guidelines" visibility="public" type="_3ADC7B74022D40F36C5E01A4" association="_3ADC7B74022D41DE5DD7014C">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqBOpufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqBOpefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DE5E5500C7" name="examples" visibility="public" type="_3ADC7B74022D40F36C5E01A3" association="_3ADC7B74022D41DE5E5500C5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqBOuOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqBOt-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4213C93F0049" name="assets" visibility="public" type="_3ADC7B74022D4213C91302C5" association="_3ADC7B74022D4213C93D0321">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJnOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJm-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_-e1hAO0oEdutCLECN96BNw" name="termDefinition" visibility="public" type="_3ADC7B74022D40F36C5E01F3" association="_-d8wMO0oEdutCLECN96BNw">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-gBz0e0oEdutCLECN96BNw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-gBz0O0oEdutCLECN96BNw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4213C91302C5" name="ReusableAsset">
-            <ownedComment xmi:id="_GpuTu-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4213C91302C5">
-              <body>A Reusable Asset provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
-how the asset should be used.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D422FA0C3007C" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E01D5" name="EstimationConsiderations">
-            <ownedComment xmi:id="_GpuTv-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E01D5">
-              <body>Estimation Considerations qualify the usage and application of estimation metrics in the development of an actual estimate.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F4A1D60245" general="_3ADC7B74022D40F36C5E02DA"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C920270" memberEnd="_3ADC7B74022D40F36C920271 _3ADC7B74022D40F36C920273">
-            <ownedComment xmi:id="_Gp3doefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C920270">
-              <body>Content Elements can be related to any number of Supporting Material guidance elements.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C920271" name="_contentElement" visibility="private" type="_3ADC7B74022D41DF41A501B6" isUnique="false" association="_3ADC7B74022D40F36C920270">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gp3dpefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gp3dpOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C92028E" memberEnd="_3ADC7B74022D40F36C92028F _3ADC7B74022D40F36C920291">
-            <ownedComment xmi:id="_Gp3dqufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C92028E">
-              <body>Content Elements can refer to any number of Concept guidance. </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C92028F" name="_contentElement" visibility="private" type="_3ADC7B74022D41DF41A501B6" isUnique="false" association="_3ADC7B74022D40F36C92028E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gp3drufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gp3drefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DE5D73020E" memberEnd="_3ADC7B74022D41DE5D73020F _3ADC7B74022D41DE5D730210">
-            <ownedComment xmi:id="_Gp3ds-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5D73020E">
-              <body>Provides check points related to a particular content elements.  These are typically used in reviews and inspections on work products.
-
-</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41DE5D73020F" name="_contentElement" visibility="public" type="_3ADC7B74022D41DF41A501B6" isUnique="false" association="_3ADC7B74022D41DE5D73020E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gp3dt-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gp3dtufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DE5DD7014C" memberEnd="_3ADC7B74022D41DE5DD7014D _3ADC7B74022D41DE5DD7014E">
-            <ownedComment xmi:id="_Gp3dvOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5DD7014C">
-              <body>This association provides access to detailed Guidelines related to this Content Element.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41DE5DD7014D" name="_contentElement" visibility="public" type="_3ADC7B74022D41DF41A501B6" isUnique="false" association="_3ADC7B74022D41DE5DD7014C">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqBOo-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqBOoufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DE5E4403E1" memberEnd="_3ADC7B74022D41DE5E4403E2 _3ADC7B74022D41DE5E4403E3">
-            <ownedComment xmi:id="_GqBOqOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5E4403E1">
-              <body>A Report extracts information about one or more Work Product; normally directly from a tool that maintains the Work Products. For example, a Report can present details of an Artifact or a set of Artifacts for use in a technical review. </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41DE5E4403E2" name="_workProduct" visibility="public" type="_3ADC7B74022D41DE5D4700FB" isUnique="false" association="_3ADC7B74022D41DE5E4403E1">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqBOrOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqBOq-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DE5E5500C5" memberEnd="_3ADC7B74022D41DE5E5500C6 _3ADC7B74022D41DE5E5500C7">
-            <ownedComment xmi:id="_GqBOsefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5E5500C5">
-              <body>Provides a sample of what the work product may look like, an actual instance.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41DE5E5500C6" name="_contentElement" visibility="public" type="_3ADC7B74022D41DF41A501B6" isUnique="false" association="_3ADC7B74022D41DE5E5500C5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqBOtefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqBOtOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DE5E6102CC" memberEnd="_3ADC7B74022D41DE5E6102CD _3ADC7B74022D41DE5E6102CE">
-            <ownedComment xmi:id="_GqBOuufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5E6102CC">
-              <body>Provides detailed guidance on how to produce the work product independent of a specific set of tasks or WBS.  May contain specific algorithms or alternative development approaches.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41DE5E6102CD" name="_workProduct" visibility="public" type="_3ADC7B74022D41DE5D4700FB" isUnique="false" association="_3ADC7B74022D41DE5E6102CC">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqKYk-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqKYkufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DE5FF70304" memberEnd="_3ADC7B74022D41DE5FF70305 _3ADC7B74022D41DE5FF70306">
-            <ownedComment xmi:id="_GqKYmOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE5FF70304">
-              <body>Links Tasks with Tool Mentors which are a specific type of guidance that show how to use a specific tool to perform the Task.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41DE5FF70305" name="_task" visibility="public" type="_3ADC7B74022D41DE5EE10111" isUnique="false" association="_3ADC7B74022D41DE5FF70304">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqKYnOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqKYm-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40FD58B40236" memberEnd="_3ADC7B74022D40FD58B50370 _3ADC7B74022D40FD58B5037A">
-            <ownedComment xmi:id="_GqKYoefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD58B40236">
-              <body>A Practice can be composed of other Practices.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40FD58B5037A" name="_practice" visibility="public" type="_3ADC7B74022D40FD4EB402BB" isUnique="false" association="_3ADC7B74022D40FD58B40236"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41DF41C603A0" memberEnd="_3ADC7B74022D41DF41C603A1 _3ADC7B74022D41DF41C603A2">
-            <ownedComment xmi:id="_GqKYqOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DF41C603A0">
-              <body>A Practice can reference any Content Element.  The association expresses that this Content Element is part of or belongs to this Practice.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41DF41C603A2" name="_practice" visibility="public" type="_3ADC7B74022D40FD4EB402BB" isUnique="false" association="_3ADC7B74022D41DF41C603A0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJlufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJlefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4213C93D0321" memberEnd="_3ADC7B74022D4213C93F0049 _3ADC7B74022D4213C93F0099">
-            <ownedComment xmi:id="_GqUJmOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4213C93D0321">
-              <body>A work product is related to one or more assets to </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4213C93F0099" name="_contentElement" visibility="public" type="_3ADC7B74022D41DF41A501B6" isUnique="false" association="_3ADC7B74022D4213C93D0321">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJn-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJnufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427ABC8802D0" memberEnd="_3ADC7B74022D427ABC89037C _3ADC7B74022D427ABC89037E">
-            <ownedEnd xmi:id="_3ADC7B74022D427ABC89037E" name="_workProduct" visibility="public" type="_3ADC7B74022D41DE5D4700FB" isUnique="false" association="_3ADC7B74022D427ABC8802D0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJpufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJpefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D44D8F5140226" memberEnd="_3ADC7B74022D44D8F5140227 _3ADC7B74022D44D8F5140228">
-            <ownedEnd xmi:id="_3ADC7B74022D44D8F5140227" name="_task" visibility="public" type="_3ADC7B74022D41DE5EE10111" isUnique="false" association="_3ADC7B74022D44D8F5140226">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJqufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJqefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D44D8F51800F5" memberEnd="_3ADC7B74022D44D8F51800F6 _3ADC7B74022D44D8F51800F7">
-            <ownedEnd xmi:id="_3ADC7B74022D44D8F51800F6" name="_workProduct" visibility="public" type="_3ADC7B74022D41DE5D4700FB" isUnique="false" association="_3ADC7B74022D44D8F51800F5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GqUJsefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GqUJsOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_-d8wMO0oEdutCLECN96BNw" memberEnd="_-e1hAO0oEdutCLECN96BNw _-gBz0u0oEdutCLECN96BNw">
-            <ownedEnd xmi:id="_-gBz0u0oEdutCLECN96BNw" name="" visibility="private" type="_3ADC7B74022D41DF41A501B6" association="_-d8wMO0oEdutCLECN96BNw">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-gBz1O0oEdutCLECN96BNw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-gBz0-0oEdutCLECN96BNw"/>
-            </ownedEnd>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C5E0225" name="Categories">
-          <eAnnotations xmi:id="_Grgcc-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F48FCE0060">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F48FCE0060" type="Class" name="Categorizations">
-              <children xmi:id="_HDWUsOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0259">
-                <children xmi:id="_HDWUs-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDWUtOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDWUtefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDWUtufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDWUt-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDWUuOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDWUuefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDWUuufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDWUu-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDWUvOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDWUvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDWUvufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDWUv-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDWUsefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDWUsufXEduqHoOJbURZRw" x="15612" y="9880"/>
-              </children>
-              <children xmi:id="_HDWUwOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_HDWUw-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDWUxOfXEduqHoOJbURZRw" width="4013" height="1117"/>
-                </children>
-                <children xmi:id="_HDWUxefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDWUxufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDWUx-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDWUyOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDWUyefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDWUyufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDWUy-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDWUzOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDWUzefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDWUzufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDWUz-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDWUwefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDWUwufXEduqHoOJbURZRw" x="20294" y="13411"/>
-              </children>
-              <children xmi:id="_HDWU0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0230">
-                <children xmi:id="_HDgFoOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDgFoefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDgFoufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDgFo-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDgFpOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDgFpefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgFpufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgFp-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgFqOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgFqefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgFqufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgFq-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDgFrOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDWU0efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDWU0ufXEduqHoOJbURZRw" x="21192" y="9931"/>
-              </children>
-              <children xmi:id="_HDgF8-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0231">
-                <children xmi:id="_HDgF9ufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDgF9-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDgF-OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDgF-efXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDgF-ufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDgF--fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgF_OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgF_efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgF_ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgF_-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGAOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgGAefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDgGAufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDgF9OfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDgF9efXEduqHoOJbURZRw" x="26272" y="9931"/>
-              </children>
-              <children xmi:id="_HDgGJufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_HDgGKefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDgGKufXEduqHoOJbURZRw" width="4470" height="1117"/>
-                </children>
-                <children xmi:id="_HDgGK-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDgGLOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDgGLefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDgGLufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGL-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgGMOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGMefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgGMufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGM-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDgGNOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDgGNefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDgGJ-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDgGKOfXEduqHoOJbURZRw" x="27127" y="13411"/>
-              </children>
-              <children xmi:id="_HDpPlufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E023A">
-                <children xmi:id="_HDpPmefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDpPmufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDpPm-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDpPnOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDpPnefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDpPnufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPn-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpPoOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpPoufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPo-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpPpOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDpPpefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDpPl-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDpPmOfXEduqHoOJbURZRw" x="29751" y="9931"/>
-              </children>
-              <children xmi:id="_HDpPyefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01CB">
-                <children xmi:id="_HDpPzOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDpPzefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDpPzufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDpPz-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDpP0OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDpP0efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpP0ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpP0-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpP1OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpP1efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpP1ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpP1-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDpP2OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDpPyufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDpPy-fXEduqHoOJbURZRw" x="34459" y="13235"/>
-              </children>
-              <children xmi:id="_HDpP2efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0258">
-                <children xmi:id="_HDpP3OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDpP3efXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDpP3ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDpP3-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDpP4OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDpP4efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpP4ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpP4-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpP5OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpP5efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpP5ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDpP5-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDpP6OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDpP2ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDpP2-fXEduqHoOJbURZRw" x="35661" y="9931"/>
-              </children>
-              <children xmi:id="_HDzAmufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0244">
-                <children xmi:id="_HDzAnefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDzAnufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HDzAn-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDzAoOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDzAoefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDzAoufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzAo-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzApOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzApefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzApufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzAp-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzAqOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDzAqefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDzAm-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzAnOfXEduqHoOJbURZRw" x="16374" y="3945" width="4233" height="2175"/>
-              </children>
-              <children xmi:id="_HDzA4OfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_HDzA4-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDzA5OfXEduqHoOJbURZRw" width="3572" height="1168"/>
-                </children>
-                <children xmi:id="_HDzA5efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDzA5ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDzA5-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDzA6OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzA6efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzA6ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzA6-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzA7OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzA7efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzA7ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDzA7-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDzA4efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzA4ufXEduqHoOJbURZRw" x="38854" y="13301"/>
-              </children>
-              <children xmi:id="_HDzA8OfXEduqHoOJbURZRw" element="_3ADC7B74022D41BDEBA2009C">
-                <children xmi:id="_HDzA8-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HDzA9OfXEduqHoOJbURZRw" width="3014" height="897"/>
-                </children>
-                <children xmi:id="_HDzA9efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HDzA9ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HDzA9-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HDzA-OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzA-efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzA-ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzA--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzA_OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzA_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HDzA_ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HDzA_-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HDzA8efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzA8ufXEduqHoOJbURZRw" x="38777" y="10016"/>
-              </children>
-              <children xmi:id="_HD8xlOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E024E">
-                <children xmi:id="_HD8xl-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HD8xmOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HD8xmefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HD8xmufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HD8xm-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HD8xnOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xnefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xnufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xn-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xoOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xoufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HD8xo-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HD8xlefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8xlufXEduqHoOJbURZRw" x="3403" y="9931"/>
-              </children>
-              <children xmi:id="_HD8xrefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_HD8xsOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HD8xsefXEduqHoOJbURZRw" width="4182" height="1117"/>
-                </children>
-                <children xmi:id="_HD8xsufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HD8xs-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HD8xtOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HD8xtefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xtufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xt-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xuOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xuefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xuufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xu-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HD8xvOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HD8xrufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8xr-fXEduqHoOJbURZRw" x="9448" y="12667"/>
-              </children>
-              <children xmi:id="_HD8xvefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0227">
-                <children xmi:id="_HD8xwOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HD8xwefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HD8xwufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HD8xw-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HD8xxOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HD8xxefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xxufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xx-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xyOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xyefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xyufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HD8xy-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HD8xzOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HD8xvufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8xv-fXEduqHoOJbURZRw" x="11006" y="9914"/>
-              </children>
-              <children xmi:id="_9ub-EOojEduVA7vt5qbIJQ" element="_3ADC7B74022D40F36C5E026C">
-                <children xmi:id="_9ulIAOojEduVA7vt5qbIJQ" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_9ulIAeojEduVA7vt5qbIJQ" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_9ulIAuojEduVA7vt5qbIJQ" type="Stereotype"/>
-                <children xmi:id="_9ulIA-ojEduVA7vt5qbIJQ" type="Name"/>
-                <children xmi:id="_9ulIBOojEduVA7vt5qbIJQ" type="Parent"/>
-                <children xmi:id="_9ulIBeojEduVA7vt5qbIJQ" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_9ulIBuojEduVA7vt5qbIJQ"/>
-                </children>
-                <children xmi:id="_9ulIB-ojEduVA7vt5qbIJQ" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_9ulICOojEduVA7vt5qbIJQ"/>
-                </children>
-                <children xmi:id="_9ulICeojEduVA7vt5qbIJQ" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_9ulICuojEduVA7vt5qbIJQ"/>
-                </children>
-                <children xmi:id="_9ulIC-ojEduVA7vt5qbIJQ" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_9ulIDOojEduVA7vt5qbIJQ"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_9ub-EeojEduVA7vt5qbIJQ" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9ub-EuojEduVA7vt5qbIJQ" x="16827" y="2089"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GrgcdefXEduqHoOJbURZRw" description="|The Categories package contains classes that provide different ways to logically categorize content elements.  In addition to standard categories that have been predefined for most content element types in this meta-model, it provides the capability for users to define their own custom categories on content elements.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a &quot;Testing&quot; category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it. This diagram shows the taxonomy of all pre-defined/standard category meta-classes as well as the definition for Custom Category classes, which can be defined by the user to categorizes any Content Element as well as can be nested with other Categories (i.e. other categories can be defined to be a sub-category of any custom category).&#xA;|&#xA;"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HDgFrefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920216" source="_HDWU0OfXEduqHoOJbURZRw" target="_HDWUsOfXEduqHoOJbURZRw">
-                <children xmi:id="_HDgFsOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDgFsufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDgFs-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDgFsefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgFtOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C920219">
-                  <children xmi:id="_HDgFtufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFtefXEduqHoOJbURZRw" x="20" y="-296"/>
-                </children>
-                <children xmi:id="_HDgFt-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C920219">
-                  <children xmi:id="_HDgFuefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFuOfXEduqHoOJbURZRw" x="409" y="272"/>
-                </children>
-                <children xmi:id="_HDgFuufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C920217">
-                  <children xmi:id="_HDgFvOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFu-fXEduqHoOJbURZRw" x="-88" y="-270"/>
-                </children>
-                <children xmi:id="_HDgFvefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C920217">
-                  <children xmi:id="_HDgFv-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFvufXEduqHoOJbURZRw" x="-748" y="-592"/>
-                </children>
-                <children xmi:id="_HDgFwOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C920219">
-                  <children xmi:id="_HDgFwufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgFw-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFwefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgFxOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C920217">
-                  <children xmi:id="_HDgFxufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgFx-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFxefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgFyOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C920219">
-                  <children xmi:id="_HDgFyufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgFy-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFyefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HDgFzOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C920217">
-                  <children xmi:id="_HDgFzufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgFz-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgFzefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDgFrufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDgFr-fXEduqHoOJbURZRw" points="[-855, -42, 4021, 8]$[-3318, -42, 1557, 8]"/>
-              </edges>
-              <edges xmi:id="_HDgF0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920159" source="_HDWUwOfXEduqHoOJbURZRw" target="_HDWU0OfXEduqHoOJbURZRw">
-                <children xmi:id="_HDgF0-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDgF1efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDgF1ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDgF1OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgF1-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C92015C">
-                  <children xmi:id="_HDgF2efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF2OfXEduqHoOJbURZRw" x="-20" y="448"/>
-                </children>
-                <children xmi:id="_HDgF2ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C92015C">
-                  <children xmi:id="_HDgF3OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF2-fXEduqHoOJbURZRw" x="98" y="-636"/>
-                </children>
-                <children xmi:id="_HDgF3efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C92015A">
-                  <children xmi:id="_HDgF3-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF3ufXEduqHoOJbURZRw" x="-123" y="482"/>
-                </children>
-                <children xmi:id="_HDgF4OfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C92015A">
-                  <children xmi:id="_HDgF4ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF4efXEduqHoOJbURZRw" x="-241" y="-805"/>
-                </children>
-                <children xmi:id="_HDgF4-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C92015C">
-                  <children xmi:id="_HDgF5efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgF5ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF5OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgF5-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C92015A">
-                  <children xmi:id="_HDgF6efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgF6ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF6OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgF6-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C92015C">
-                  <children xmi:id="_HDgF7efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgF7ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF7OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HDgF7-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C92015A">
-                  <children xmi:id="_HDgF8efXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgF8ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgF8OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDgF0efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDgF0ufXEduqHoOJbURZRw" points="[-262, -567, -8, 2988]$[-262, -3073, -8, 482]"/>
-              </edges>
-              <edges xmi:id="_HDgGA-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920194" source="_HDgF8-fXEduqHoOJbURZRw" target="_HDgF8-fXEduqHoOJbURZRw">
-                <children xmi:id="_HDgGBufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDgGCOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDgGCefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDgGB-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgGCufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C920197">
-                  <children xmi:id="_HDgGDOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGC-fXEduqHoOJbURZRw" x="-99" y="-262"/>
-                </children>
-                <children xmi:id="_HDgGDefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C920197">
-                  <children xmi:id="_HDgGD-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGDufXEduqHoOJbURZRw" x="-1119" y="316"/>
-                </children>
-                <children xmi:id="_HDgGEOfXEduqHoOJbURZRw" visible="false" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C920195">
-                  <children xmi:id="_HDgGEufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGEefXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HDgGE-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C920195">
-                  <children xmi:id="_HDgGFefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGFOfXEduqHoOJbURZRw" x="-118" y="-321"/>
-                </children>
-                <children xmi:id="_HDgGFufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C920197">
-                  <children xmi:id="_HDgGGOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGGefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGF-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgGGufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C920195">
-                  <children xmi:id="_HDgGHOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGHefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGG-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgGHufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C920197">
-                  <children xmi:id="_HDgGIOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGIefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGH-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HDgGIufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C920195">
-                  <children xmi:id="_HDgGJOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGJefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGI-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDgGBOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDgGBefXEduqHoOJbURZRw" points="[-855, 76, -855, 76]$[-3183, 76, -3183, 76]$[-3183, 1464, -3183, 1464]$[-406, 1464, -406, 1464]$[-406, 482, -406, 482]"/>
-              </edges>
-              <edges xmi:id="_HDgGNufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920177" source="_HDgGJufXEduqHoOJbURZRw" target="_HDgF8-fXEduqHoOJbURZRw">
-                <children xmi:id="_HDgGOefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDgGO-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDgGPOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDgGOufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgGPefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C92017A">
-                  <children xmi:id="_HDgGP-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGPufXEduqHoOJbURZRw" x="-51" y="150"/>
-                </children>
-                <children xmi:id="_HDgGQOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C92017A">
-                  <children xmi:id="_HDgGQufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGQefXEduqHoOJbURZRw" x="704" y="-1082"/>
-                </children>
-                <children xmi:id="_HDgGQ-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C920178">
-                  <children xmi:id="_HDgGRefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGROfXEduqHoOJbURZRw" x="-2" y="-241"/>
-                </children>
-                <children xmi:id="_HDgGRufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C920178">
-                  <children xmi:id="_HDgGSOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGR-fXEduqHoOJbURZRw" x="-399" y="796"/>
-                </children>
-                <children xmi:id="_HDgGSefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C92017A">
-                  <children xmi:id="_HDgGS-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGTOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGSufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgGTefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C920178">
-                  <children xmi:id="_HDgGT-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDgGUOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGTufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDgGUefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C92017A">
-                  <children xmi:id="_HDpPkOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPkefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDgGUufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HDpPkufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C920178">
-                  <children xmi:id="_HDpPlOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPlefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPk-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDgGN-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDgGOOfXEduqHoOJbURZRw" points="[-355, -567, 1879, 2988]$[-1930, -3073, 304, 482]"/>
-              </edges>
-              <edges xmi:id="_HDpPpufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9201A9" source="_HDgGJufXEduqHoOJbURZRw" target="_HDpPlufXEduqHoOJbURZRw">
-                <children xmi:id="_HDpPqefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDpPq-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDpPrOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDpPqufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDpPrefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9201AC">
-                  <children xmi:id="_HDpPr-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPrufXEduqHoOJbURZRw" x="-21" y="-135"/>
-                </children>
-                <children xmi:id="_HDpPsOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9201AC">
-                  <children xmi:id="_HDpPsufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPsefXEduqHoOJbURZRw" x="851" y="1071"/>
-                </children>
-                <children xmi:id="_HDpPs-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9201AA">
-                  <children xmi:id="_HDpPtefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPtOfXEduqHoOJbURZRw" x="-4" y="-306"/>
-                </children>
-                <children xmi:id="_HDpPtufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C9201AA">
-                  <children xmi:id="_HDpPuOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPt-fXEduqHoOJbURZRw" x="1025" y="1385"/>
-                </children>
-                <children xmi:id="_HDpPuefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9201AC">
-                  <children xmi:id="_HDpPu-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPvOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPuufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDpPvefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9201AA">
-                  <children xmi:id="_HDpPv-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPwOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPvufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDpPwefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9201AC">
-                  <children xmi:id="_HDpPw-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPxOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPwufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HDpPxefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9201AA">
-                  <children xmi:id="_HDpPx-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpPyOfXEduqHoOJbURZRw" collapsed="true"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpPxufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDpPp-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDpPqOfXEduqHoOJbURZRw" points="[296, -567, -1684, 2988]$[1701, -3073, -279, 482]"/>
-              </edges>
-              <edges xmi:id="_HDpP6efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9201F9" source="_HDpPyefXEduqHoOJbURZRw" target="_HDpP2efXEduqHoOJbURZRw">
-                <children xmi:id="_HDpP7OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDpP7ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDpP7-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDpP7efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDpP8OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9201FC">
-                  <children xmi:id="_HDpP8ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpP8efXEduqHoOJbURZRw" x="-40" y="-373"/>
-                </children>
-                <children xmi:id="_HDpP8-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9201FC">
-                  <children xmi:id="_HDpP9efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpP9OfXEduqHoOJbURZRw" x="-57" y="1159"/>
-                </children>
-                <children xmi:id="_HDpP9ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9201FA">
-                  <children xmi:id="_HDpP-OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpP9-fXEduqHoOJbURZRw" x="-22" y="-221"/>
-                </children>
-                <children xmi:id="_HDpP-efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C9201FA">
-                  <children xmi:id="_HDpP--fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpP-ufXEduqHoOJbURZRw" x="12" y="576"/>
-                </children>
-                <children xmi:id="_HDpP_OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9201FC">
-                  <children xmi:id="_HDpP_ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDpP_-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpP_efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDpQAOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9201FA">
-                  <children xmi:id="_HDzAkOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzAkefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDpQAefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDzAkufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9201FC">
-                  <children xmi:id="_HDzAlOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzAlefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzAk-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HDzAlufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9201FA">
-                  <children xmi:id="_HDzAmOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzAmefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzAl-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDpP6ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDpP6-fXEduqHoOJbURZRw" points="[-304, -550, -50, 3107]$[-304, -3175, -50, 482]"/>
-              </edges>
-              <edges xmi:id="_HDzAqufXEduqHoOJbURZRw" element="_3ADC7B74022D40F71295017F" source="_HDWUsOfXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HDzArefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzAr-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzAsOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzArufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzAq-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzArOfXEduqHoOJbURZRw" points="[110, -491, -1210, 4842]$[1032, -4250, -287, 1083]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzAsefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzAsufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDzAvOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920158" source="_HDWU0OfXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HDzAv-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzAwefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzAwufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzAwOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzAvefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzAvufXEduqHoOJbURZRw" points="[-330, -491, 3225, 4893]$[-2853, -4301, 702, 1083]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzAw-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzAxOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDzAxefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920176" source="_HDgF8-fXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HDzAyOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzAyufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzAy-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzAyefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzAxufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzAx-fXEduqHoOJbURZRw" points="[-770, -491, 7865, 4893]$[-6891, -4301, 1744, 1083]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzAzOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzAzefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDzAzufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9201A8" source="_HDpPlufXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HDzA0efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzA0-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzA1OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzA0ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzAz-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzA0OfXEduqHoOJbURZRw" points="[-1143, -491, 11709, 4893]$[-10735, -4504, 2116, 880]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzA1efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzA1ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDzA1-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9201F8" source="_HDpP2efXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HDzA2ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzA3OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzA3efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzA2-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzA2OfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzA2efXEduqHoOJbURZRw" points="[-770, -355, 16399, 5029]$[-5046, -2302, 12124, 3081]$[-15053, -4851, 2116, 533]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzA3ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzA3-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDzBAOfXEduqHoOJbURZRw" element="_3ADC7B74022D41BDEBAE0298" source="_HDzA8OfXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HDzBA-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzBBefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzBBufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzBBOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzBAefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzBAufXEduqHoOJbURZRw" points="[-939, -457, 20853, 4978]$[-8288, -3937, 13504, 1498]$[-19676, -5207, 2116, 228]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzBB-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HDzBCOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HDzBCefXEduqHoOJbURZRw" element="_3ADC7B74022D420D3650033F" source="_HDzA8OfXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HDzBDOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzBDufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzBD-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzBDefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDzBEOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D420D365203B7">
-                  <children xmi:id="_HDzBEufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBEefXEduqHoOJbURZRw" x="-3058" y="263"/>
-                </children>
-                <children xmi:id="_HDzBE-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D420D365203B7">
-                  <children xmi:id="_HDzBFefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBFOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HDzBFufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D420D365203AD">
-                  <children xmi:id="_HDzBGOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBF-fXEduqHoOJbURZRw" x="3177" y="93"/>
-                </children>
-                <children xmi:id="_HDzBGefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D420D365203AD">
-                  <children xmi:id="_HDzBG-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBGufXEduqHoOJbURZRw" x="1526" y="246"/>
-                </children>
-                <children xmi:id="_HDzBHOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D420D365203B7">
-                  <children xmi:id="_HDzBHufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzBH-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBHefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDzBIOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D420D365203AD">
-                  <children xmi:id="_HDzBIufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzBI-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBIefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDzBJOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D420D365203B7">
-                  <children xmi:id="_HDzBJufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzBJ-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBJefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HDzBKOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D420D365203AD">
-                  <children xmi:id="_HDzBKufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzBK-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBKefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzBCufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzBC-fXEduqHoOJbURZRw" points="[33, -448, 21827, 4986]$[33, -5757, 21827, -321]$[-19676, -5757, 2116, -321]"/>
-              </edges>
-              <edges xmi:id="_HDzBLOfXEduqHoOJbURZRw" element="_3ADC7B74022D41BDEBDE023D" source="_HDzA8OfXEduqHoOJbURZRw" target="_HDzA4OfXEduqHoOJbURZRw">
-                <children xmi:id="_HDzBL-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HDzBMefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HDzBMufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HDzBMOfXEduqHoOJbURZRw" x="-500" y="-1"/>
-                </children>
-                <children xmi:id="_HDzBM-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41BDEBDF03CF">
-                  <children xmi:id="_HDzBNefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBNOfXEduqHoOJbURZRw" x="172" y="380"/>
-                </children>
-                <children xmi:id="_HDzBNufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41BDEBDF03CF">
-                  <children xmi:id="_HDzBOOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBN-fXEduqHoOJbURZRw" x="3" y="-1609"/>
-                </children>
-                <children xmi:id="_HDzBOefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41BDEBDF037F">
-                  <children xmi:id="_HDzBO-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBOufXEduqHoOJbURZRw" x="-10" y="406"/>
-                </children>
-                <children xmi:id="_HDzBPOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41BDEBDF037F">
-                  <children xmi:id="_HDzBPufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBPefXEduqHoOJbURZRw" x="-69" y="-1846"/>
-                </children>
-                <children xmi:id="_HDzBP-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41BDEBDF03CF">
-                  <children xmi:id="_HDzBQefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzBQufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBQOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDzBQ-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41BDEBDF037F">
-                  <children xmi:id="_HDzBRefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzBRufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBROfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HDzBR-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41BDEBDF03CF">
-                  <children xmi:id="_HDzBSefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HDzBSufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HDzBSOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HD8xkOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41BDEBDF037F">
-                  <children xmi:id="_HD8xkufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8xk-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8xkefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HDzBLefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HDzBLufXEduqHoOJbURZRw" points="[50, 440, -254, -3166]$[50, 3014, -254, -592]"/>
-              </edges>
-              <edges xmi:id="_HD8xpOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9201E4" source="_HD8xlOfXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HD8xp-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HD8xqefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HD8xqufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8xqOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HD8xpefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HD8xpufXEduqHoOJbURZRw" points="[1176, -491, -12285, 4893]$[11336, -4546, -2125, 838]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HD8xq-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HD8xrOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HD8xzefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9201E5" source="_HD8xvefXEduqHoOJbURZRw" target="_HD8xlOfXEduqHoOJbURZRw">
-                <children xmi:id="_HD8x0OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HD8x0ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HD8x0-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8x0efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8x1OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9201E8">
-                  <children xmi:id="_HD8x1ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x1efXEduqHoOJbURZRw" x="-84" y="-346"/>
-                </children>
-                <children xmi:id="_HD8x1-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9201E8">
-                  <children xmi:id="_HD8x2efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x2OfXEduqHoOJbURZRw" x="559" y="319"/>
-                </children>
-                <children xmi:id="_HD8x2ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9201E6">
-                  <children xmi:id="_HD8x3OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x2-fXEduqHoOJbURZRw" x="-169" y="289"/>
-                </children>
-                <children xmi:id="_HD8x3efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C9201E6">
-                  <children xmi:id="_HD8x3-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x3ufXEduqHoOJbURZRw" x="-1032" y="-380"/>
-                </children>
-                <children xmi:id="_HD8x4OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9201E8">
-                  <children xmi:id="_HD8x4ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8x4-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x4efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8x5OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9201E6">
-                  <children xmi:id="_HD8x5ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8x5-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x5efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8x6OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9201E8">
-                  <children xmi:id="_HD8x6ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8x6-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x6efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HD8x7OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9201E6">
-                  <children xmi:id="_HD8x7ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8x7-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x7efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HD8xzufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HD8xz-fXEduqHoOJbURZRw" points="[-931, -118, 5977, -118]$[-5283, -118, 1625, -118]"/>
-              </edges>
-              <edges xmi:id="_HD8x8OfXEduqHoOJbURZRw" element="_3ADC7B74022D427988B200EB" source="_HD8xvefXEduqHoOJbURZRw" target="_HD8xrefXEduqHoOJbURZRw">
-                <children xmi:id="_HD8x8-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HD8x9efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HD8x9ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8x9OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8x9-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D427988B200ED">
-                  <children xmi:id="_HD8x-efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x-OfXEduqHoOJbURZRw" x="99" y="-183"/>
-                </children>
-                <children xmi:id="_HD8x-ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D427988B200ED">
-                  <children xmi:id="_HD8x_OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x--fXEduqHoOJbURZRw" x="96" y="899"/>
-                </children>
-                <children xmi:id="_HD8x_efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427988B200EC">
-                  <children xmi:id="_HD8x_-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8x_ufXEduqHoOJbURZRw" x="-269" y="-187"/>
-                </children>
-                <children xmi:id="_HD8yAOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427988B200EC">
-                  <children xmi:id="_HD8yAufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yAefXEduqHoOJbURZRw" x="-359" y="670"/>
-                </children>
-                <children xmi:id="_HD8yA-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427988B200ED">
-                  <children xmi:id="_HD8yBefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yBufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yBOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8yB-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427988B200EC">
-                  <children xmi:id="_HD8yCefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yCufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yCOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8yC-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427988B200ED">
-                  <children xmi:id="_HD8yDefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yDufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yDOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HD8yD-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427988B200EC">
-                  <children xmi:id="_HD8yEefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yEufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yEOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HD8x8efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HD8x8ufXEduqHoOJbURZRw" points="[-662, 318, 238, -1931]$[-662, 1932, 238, -317]"/>
-              </edges>
-              <edges xmi:id="_HD8yE-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92013B" source="_HD8xvefXEduqHoOJbURZRw" target="_HDzAmufXEduqHoOJbURZRw">
-                <children xmi:id="_HD8yFufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HD8yGOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HD8yGefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8yF-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HD8yFOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HD8yFefXEduqHoOJbURZRw" points="[601, -508, -5952, 4876]$[5215, -4301, -1337, 1083]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HD8yGufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HD8yG-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HD8yHOfXEduqHoOJbURZRw" element="_3ADC7B74022D445A59250266" source="_HD8xvefXEduqHoOJbURZRw" target="_HD8xvefXEduqHoOJbURZRw">
-                <children xmi:id="_HD8yH-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HD8yIefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HD8yIufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HD8yIOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8yI-fXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D445A5927036F">
-                  <children xmi:id="_HD8yJefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yJOfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HD8yJufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D445A5927036F">
-                  <children xmi:id="_HD8yKOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yJ-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HD8yKefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D445A5927036D">
-                  <children xmi:id="_HD8yK-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yKufXEduqHoOJbURZRw" x="-344" y="-204"/>
-                </children>
-                <children xmi:id="_HD8yLOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D445A5927036D">
-                  <children xmi:id="_HD8yLufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yLefXEduqHoOJbURZRw" x="594" y="-972"/>
-                </children>
-                <children xmi:id="_HD8yL-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D445A5927036F">
-                  <children xmi:id="_HD8yMefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yMufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yMOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8yM-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D445A5927036D">
-                  <children xmi:id="_HD8yNefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yNufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yNOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HD8yN-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D445A5927036F">
-                  <children xmi:id="_HD8yOefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yOufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yOOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HD8yO-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D445A5927036D">
-                  <children xmi:id="_HD8yPefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HD8yPufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HD8yPOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HD8yHefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HD8yHufXEduqHoOJbURZRw" points="[414, 499, 414, 499]$[414, 1430, 414, 1430]$[2150, 1430, 2150, 1430]$[2150, -42, 2150, -42]$[931, -42, 931, -42]"/>
-              </edges>
-              <edges xmi:id="_D3ltoOokEduVA7vt5qbIJQ" element="_D3b8oOokEduVA7vt5qbIJQ" source="_HDzAmufXEduqHoOJbURZRw" target="_9ub-EOojEduVA7vt5qbIJQ">
-                <children xmi:id="_D3lto-okEduVA7vt5qbIJQ" type="NameLabel">
-                  <children xmi:id="_D3ltpeokEduVA7vt5qbIJQ" type="Stereotype"/>
-                  <children xmi:id="_D3ltpuokEduVA7vt5qbIJQ" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D3ltpOokEduVA7vt5qbIJQ" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_D3ltoeokEduVA7vt5qbIJQ" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D3ltouokEduVA7vt5qbIJQ" points="[-5, -41, -4, 59]$[-63, -104, -62, -4]"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_Gqd6k-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0225">
-            <body>04</body>
-          </ownedComment>
-          <packageImport xmi:id="_ddj8sOxdEduHje3pPahN4A" importedPackage="_3ADC7B74022D40F36C5E0190"/>
-          <packageImport xmi:id="_eaW8IOxdEduHje3pPahN4A" importedPackage="_3ADC7B74022D40F36C5E0294"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0227" name="Discipline">
-            <ownedComment xmi:id="_GqnEh-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0227">
-              <body>A Discipline is a categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
-A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92013B" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D427988B200EC" name="tasks" visibility="public" type="_3ADC7B74022D40F36C5E029E" association="_3ADC7B74022D427988B200EB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrgcaufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrgcaefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D445A5927036D" name="subdiscipline" visibility="public" type="_3ADC7B74022D40F36C5E0227" aggregation="composite" association="_3ADC7B74022D445A59250266">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrgccefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrgccOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0230" name="RoleSet">
-            <ownedComment xmi:id="_GqnEi-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0230">
-              <body>A Role Set organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the &quot;Analysts&quot; Role Set could group the &quot;Business Process Analyst&quot;, &quot;System Analyst&quot;, as well as &quot;Requirements Specifier&quot; roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C920158" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C92015C" name="roles" visibility="public" type="_3ADC7B74022D40F36C5E0296" association="_3ADC7B74022D40F36C920159">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gq6miufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gq6miefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0231" name="Domain">
-            <ownedComment xmi:id="_GqnEj-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0231">
-              <body>Domain is a refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
-Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C920176" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C92017A" name="workProducts" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D40F36C920177">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gq6mk-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gq6mkufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920197" name="subdomains" visibility="public" type="_3ADC7B74022D40F36C5E0231" aggregation="composite" association="_3ADC7B74022D40F36C920194">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrDwcOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gq6mmefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E023A" name="WorkProductType">
-            <ownedComment xmi:id="_GqnEk-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E023A">
-              <body>Work Product Type is a second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is &quot;Class Diagram&quot;, which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or &quot;Specification&quot;, which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C9201A8" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9201AC" name="workProducts" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D40F36C9201A9">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrDweefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrDweOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0244" name="ContentCategory" isAbstract="true">
-            <ownedComment xmi:id="_Gqw1gOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0244">
-              <body>Content Category is an abstract class generalizing content category types.</body>
-            </ownedComment>
-            <generalization xmi:id="_D3b8oOokEduVA7vt5qbIJQ" general="_3ADC7B74022D40F36C5E026C"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E024E" name="DisciplineGrouping">
-            <ownedComment xmi:id="_Gqw1hOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E024E">
-              <body>Discipline Groupings are used to group Disciplines.  For example, the Discipline Grouping &quot;Software Disciplines&quot; would be the group of all disciplines related to developing software such as &quot;Requirements Management&quot; or &quot;Testing&quot;; &quot;IT Infrastructure Management&quot; would be a Disciplines Grouping for disciplines such as &quot;IT Operational Services&quot;, &quot;IT Customer Relationships&quot;, or &quot;IT Enabling Services&quot;.  Disciplines can be associated to more than one Discipline Grouping.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C9201E4" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9201E8" name="disciplines" visibility="public" type="_3ADC7B74022D40F36C5E0227" association="_3ADC7B74022D40F36C9201E5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrNhdufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrNhdefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0258" name="Tool">
-            <ownedComment xmi:id="_Gqw1iOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0258">
-              <body>A Tool is a container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C9201F8" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9201FC" name="toolMentors" visibility="public" type="_3ADC7B74022D40F36C5E01CB" association="_3ADC7B74022D40F36C9201F9">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrWrYOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrNhfufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0259" name="RoleSetGrouping">
-            <ownedComment xmi:id="_Gqw1jOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0259">
-              <body>Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F71295017F" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920219" name="roleSets" visibility="public" type="_3ADC7B74022D40F36C5E0230" association="_3ADC7B74022D40F36C920216">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrWraefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrWraOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41BDEBA2009C" name="CustomCategory">
-            <ownedComment xmi:id="_Gqw1kOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41BDEBA2009C">
-              <body>A Custom Category is a category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a &quot;Testing&quot; category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41BDEBAE0298" general="_3ADC7B74022D40F36C5E0244"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D41BDEBDF037F" name="categorizedElements" visibility="public" type="_3ADC7B74022D4294EB9000FC" association="_3ADC7B74022D41BDEBDE023D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrWrb-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrWrbufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D420D365203AD" name="subCategories" visibility="public" type="_3ADC7B74022D40F36C5E0244" association="_3ADC7B74022D420D3650033F">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrgcYefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrgcYOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C920159" memberEnd="_3ADC7B74022D40F36C92015A _3ADC7B74022D40F36C92015C">
-            <ownedComment xmi:id="_Gq6mg-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C920159">
-              <body>A Role Set categorizes many Roles and a Role can be represented in may Role Sets.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C92015A" name="roleSets" visibility="public" type="_3ADC7B74022D40F36C5E0230" association="_3ADC7B74022D40F36C920159">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gq6mh-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gq6mhufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C920177" memberEnd="_3ADC7B74022D40F36C920178 _3ADC7B74022D40F36C92017A">
-            <ownedComment xmi:id="_Gq6mjOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C920177">
-              <body>A Domain categorizes many Work Products. A Work Product belongs at most to one Domain.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C920178" name="domain" visibility="public" type="_3ADC7B74022D40F36C5E0231" association="_3ADC7B74022D40F36C920177">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gq6mkOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gq6mj-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C920194" memberEnd="_3ADC7B74022D40F36C920195 _3ADC7B74022D40F36C920197">
-            <ownedComment xmi:id="_Gq6mlefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C920194">
-              <body>Domains can be further divided into Subdomains, with work product elements only to be categorized at the leaf-level.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C920195" name="_domain" visibility="public" type="_3ADC7B74022D40F36C5E0231" isUnique="false" association="_3ADC7B74022D40F36C920194"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C9201A9" memberEnd="_3ADC7B74022D40F36C9201AA _3ADC7B74022D40F36C9201AC">
-            <ownedComment xmi:id="_GrDwcufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C9201A9">
-              <body>A Work Product can be categorized to be zero of many Work Product Types.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C9201AA" name="workProductTypes" visibility="public" type="_3ADC7B74022D40F36C5E023A" association="_3ADC7B74022D40F36C9201A9">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrDwdufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrDwdefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C9201E5" memberEnd="_3ADC7B74022D40F36C9201E6 _3ADC7B74022D40F36C9201E8">
-            <ownedComment xmi:id="_GrDwe-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C9201E5">
-              <body>Discipline Groupings group many Disciplines.  A Discipline can be in many Discipline Groups.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C9201E6" name="disciplineGroups" visibility="public" type="_3ADC7B74022D40F36C5E024E" association="_3ADC7B74022D40F36C9201E5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrNhc-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrNhcufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C9201F9" memberEnd="_3ADC7B74022D40F36C9201FA _3ADC7B74022D40F36C9201FC">
-            <ownedComment xmi:id="_GrNheOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C9201F9">
-              <body>A Tool Mentor describes work with exactly one Tool.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C9201FA" name="tool" visibility="public" type="_3ADC7B74022D40F36C5E0258" association="_3ADC7B74022D40F36C9201F9">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrNhfOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrNhe-fXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C920216" memberEnd="_3ADC7B74022D40F36C920217 _3ADC7B74022D40F36C920219">
-            <ownedComment xmi:id="_GrWrYufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C920216">
-              <body>A Role Set Grouping contains many Role Sets. Role Sets can be in many Role Set Groupings.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C920217" name="roleSetGroups" visibility="public" type="_3ADC7B74022D40F36C5E0259" association="_3ADC7B74022D40F36C920216">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrWrZufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrWrZefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41BDEBDE023D" memberEnd="_3ADC7B74022D41BDEBDF037F _3ADC7B74022D41BDEBDF03CF">
-            <ownedComment xmi:id="_GrWra-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41BDEBDE023D">
-              <body>A CustomCategory groups together any number of ContentElements including other ContentCategory. </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41BDEBDF03CF" name="customCategories" visibility="public" type="_3ADC7B74022D41BDEBA2009C" association="_3ADC7B74022D41BDEBDE023D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrWrcufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrWrcefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D420D3650033F" memberEnd="_3ADC7B74022D420D365203AD _3ADC7B74022D420D365203B7">
-            <ownedComment xmi:id="_GrWrdOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D420D3650033F">
-              <body>A CustomCategory can have any number of ContentCategories defined as nested subCategories.  Therefore, one could nest CustomCategories into n-level hierarchies. </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D420D365203B7" name="_customCategory" visibility="public" type="_3ADC7B74022D41BDEBA2009C" isUnique="false" association="_3ADC7B74022D420D3650033F">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrgcZOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrgcY-fXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427988B200EB" memberEnd="_3ADC7B74022D427988B200EC _3ADC7B74022D427988B200ED">
-            <ownedComment xmi:id="_GrgcZufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427988B200EB">
-              <body>Every Task should be related to exactly one Discipline.  For legacy reasons this is not enforced (e.g. GS Method does not define Disciplines, yet).</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427988B200ED" name="discipline" visibility="public" type="_3ADC7B74022D40F36C5E0227" association="_3ADC7B74022D427988B200EB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GrgcbefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GrgcbOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D445A59250266" memberEnd="_3ADC7B74022D445A5927036D _3ADC7B74022D445A5927036F">
-            <ownedEnd xmi:id="_3ADC7B74022D445A5927036F" name="_discipline" visibility="public" type="_3ADC7B74022D40F36C5E0227" isUnique="false" association="_3ADC7B74022D445A59250266"/>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C5E0262" name="BasicElements">
-          <eAnnotations xmi:id="_GsZ0SefXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F36D6602FB">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F36D6602FB" type="Class" name="Main">
-              <children xmi:id="_HEF7gOfXEduqHoOJbURZRw" type="Note">
-                <children xmi:id="_HEF7g-fXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_HEF7hOfXEduqHoOJbURZRw" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_HEF7gefXEduqHoOJbURZRw" description="UML2 Infrastructure" lineColor="4194368"/>
-                <element xsi:nil="true"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEF7gufXEduqHoOJbURZRw" x="4419" y="516" width="8839" height="7095"/>
-              </children>
-              <children xmi:id="_HEF7hefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE6580157">
-                <children xmi:id="_HEF7iOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEF7iefXEduqHoOJbURZRw" width="2573" height="1049"/>
-                </children>
-                <children xmi:id="_HEF7iufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEF7i-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEF7jOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEF7jefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7jufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7j-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7kOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7kefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7kufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7k-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEF7lOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEF7hufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEF7h-fXEduqHoOJbURZRw" x="10498" y="6333"/>
-              </children>
-              <children xmi:id="_HEF7lefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE83301A5">
-                <children xmi:id="_HEF7mOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEF7mefXEduqHoOJbURZRw" width="4368" height="1032"/>
-                </children>
-                <children xmi:id="_HEF7mufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEF7m-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEF7nOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEF7nefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7nufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7n-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7oOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7oefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7oufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7o-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEF7pOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEF7lufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEF7l-fXEduqHoOJbURZRw" x="5384" y="3598"/>
-              </children>
-              <children xmi:id="_HEF7pefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDECB50098">
-                <children xmi:id="_HEF7qOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEF7qefXEduqHoOJbURZRw" width="2573" height="1032"/>
-                </children>
-                <children xmi:id="_HEF7qufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEF7q-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEF7rOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEF7refXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7rufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7r-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7sOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7sefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEF7sufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEF7s-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEF7tOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEF7pufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEF7p-fXEduqHoOJbURZRw" x="10498" y="4411"/>
-              </children>
-              <children xmi:id="_HEPsjefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE06202D5">
-                <children xmi:id="_HEPskOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEPskefXEduqHoOJbURZRw" width="2810" height="1540"/>
-                </children>
-                <children xmi:id="_HEPskufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEPsk-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEPslOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEPslefXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPslufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsl-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPsmOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsmefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPsmufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsm-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEPsnOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEPsjufXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPsj-fXEduqHoOJbURZRw" x="6214" y="1109"/>
-              </children>
-              <children xmi:id="_HEPsr-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E026C">
-                <children xmi:id="_HEPssufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEPss-fXEduqHoOJbURZRw" width="3352" height="1083"/>
-                </children>
-                <children xmi:id="_HEPstOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEPstefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEPstufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEPst-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPsuOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsuefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPsuufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsu-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPsvOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsvefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEPsvufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEPssOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPssefXEduqHoOJbURZRw" x="9296" y="12158"/>
-              </children>
-              <children xmi:id="_HEPsv-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E4CF301AE">
-                <children xmi:id="_HEPswufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEPsw-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HEPsxOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEPsxefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEPsxufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEPsx-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPsyOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsyefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPsyufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPsy-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPszOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPszefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEPszufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEPswOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPswefXEduqHoOJbURZRw" x="3979" y="16442" width="4538" height="1557"/>
-              </children>
-              <children xmi:id="_HEPs8ufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_HEPs9efXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEPs9ufXEduqHoOJbURZRw" width="4182" height="1151"/>
-                </children>
-                <children xmi:id="_HEPs9-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEPs-OfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEPs-efXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEPs-ufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPs--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPs_OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPs_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPs_ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPs_-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPtAOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEPtAefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEPs8-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPs9OfXEduqHoOJbURZRw" x="10557" y="9939"/>
-              </children>
-              <children xmi:id="_HEPtC-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4A970123">
-                <children xmi:id="_HEPtDufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEPtD-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HEPtEOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEPtEefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEPtEufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEPtE-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPtFOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPtFefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPtFufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPtF-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPtGOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEPtGefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEPtGufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEPtDOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPtDefXEduqHoOJbURZRw" x="7628" y="13944" width="4555" height="1481"/>
-              </children>
-              <children xmi:id="_HEY2r-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A857B0333">
-                <children xmi:id="_HEY2sufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEY2s-fXEduqHoOJbURZRw" width="2489" height="1151"/>
-                </children>
-                <children xmi:id="_HEY2tOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEY2tefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEY2tufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEY2t-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2uOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY2uefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2uufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY2u-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2vOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY2vefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEY2vufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEY2sOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY2sefXEduqHoOJbURZRw" x="4191" y="11209"/>
-              </children>
-              <children xmi:id="_HEY2v-fXEduqHoOJbURZRw" element="_3ADC7B74022D455E6202032A">
-                <children xmi:id="_HEY2wufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEY2w-fXEduqHoOJbURZRw" width="4080" height="1151"/>
-                </children>
-                <children xmi:id="_HEY2xOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEY2xefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEY2xufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEY2x-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2yOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY2yefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2yufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY2y-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2zOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY2zefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEY2zufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEY2wOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY2wefXEduqHoOJbURZRw" x="1312" y="13445"/>
-              </children>
-              <children xmi:id="_HEY2z-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_HEY20ufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEY20-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HEY21OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEY21efXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEY21ufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEY21-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY22OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY22efXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY22ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY22-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY23OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEY23efXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEY23ufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEY20OfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY20efXEduqHoOJbURZRw" x="5537" y="7958" width="4064" height="1557"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GsZ0S-fXEduqHoOJbURZRw" description="The lowest level package in Method Core defines the class Method Element from which all other classes defined in the specification are derived from.  Method Element itself is derived from the UML 2.0 Infra-structure Library element Packageable Elements.  This package also defines key basic elements used to de-fine and structure method content types.  Every class defined in this specification is derived from Method Element.  In other words Method Element is the root generalization for all UMA classes and defines a common set of attributes inherited by every other element type of this model.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.  Method Element inherits the Name attribute from Packageable Element's super class. A Model Element is part of a method model and every method model part is a Method Element.  Every Method Element is at least defined by a unique id as well as brief description."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HEF7tefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF8BD028F" source="_HEF7hefXEduqHoOJbURZRw" target="_HEF7pefXEduqHoOJbURZRw">
-                <children xmi:id="_HEF7uOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEPsgOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEPsgefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEF7uefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEF7tufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEF7t-fXEduqHoOJbURZRw" points="[0, -533, 0, 1397]$[0, -1413, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPsgufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPsg-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEPshOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF71B03A8" source="_HEF7pefXEduqHoOJbURZRw" target="_HEF7lefXEduqHoOJbURZRw">
-                <children xmi:id="_HEPsh-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEPsiefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEPsiufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPsiOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEPshefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEPshufXEduqHoOJbURZRw" points="[-1295, -254, 2921, 558]$[-2032, -397, 2184, 414]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPsi-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPsjOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEPsnefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF8D40211" source="_HEF7lefXEduqHoOJbURZRw" target="_HEPsjefXEduqHoOJbURZRw">
-                <children xmi:id="_HEPsoOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEPsoufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEPso-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPsoefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEPsnufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEPsn-fXEduqHoOJbURZRw" points="[50, -524, 0, 1710]$[50, -1464, 0, 770]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPspOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPspefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEPspufXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF91203C0" source="_HEF7pefXEduqHoOJbURZRw" target="_HEPsjefXEduqHoOJbURZRw">
-                <children xmi:id="_HEPsqefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEPsq-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEPsrOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPsqufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEPsp-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEPsqOfXEduqHoOJbURZRw" points="[-711, -524, 3454, 2523]$[-3115, -2277, 1049, 770]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPsrefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPsrufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEPsz-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E4E3B0319" source="_HEPsv-fXEduqHoOJbURZRw" target="_HEPsv-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEPs0ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEPs1OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEPs1efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPs0-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEPs1ufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HEPs2OfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs1-fXEduqHoOJbURZRw" x="-22" y="626"/>
-                </children>
-                <children xmi:id="_HEPs2efXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HEPs2-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs2ufXEduqHoOJbURZRw" x="37" y="287"/>
-                </children>
-                <children xmi:id="_HEPs3OfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HEPs3ufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs3efXEduqHoOJbURZRw" x="-479" y="562"/>
-                </children>
-                <children xmi:id="_HEPs3-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HEPs4efXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs4OfXEduqHoOJbURZRw" x="-1150" y="306"/>
-                </children>
-                <children xmi:id="_HEPs4ufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HEPs5OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPs5efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs4-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEPs5ufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HEPs6OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPs6efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs5-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEPs6ufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HEPs7OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPs7efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs6-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HEPs7ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HEPs8OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEPs8efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPs7-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEPs0OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEPs0efXEduqHoOJbURZRw" points="[-812, 778, -812, 778]$[-812, 1718, -812, 1718]$[-3615, 1718, -3615, 1718]$[-3615, 84, -3615, 84]$[-2269, 84, -2269, 84]"/>
-              </edges>
-              <edges xmi:id="_HEPtAufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC270106" source="_HEPs8ufXEduqHoOJbURZRw" target="_HEF7hefXEduqHoOJbURZRw">
-                <children xmi:id="_HEPtBefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEPtB-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEPtCOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPtBufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEPtA-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEPtBOfXEduqHoOJbURZRw" points="[-1243, -503, 0, 3280]$[-1243, -3466, 0, 317]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPtCefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEPtCufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEPtG-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E4DAC01A0" source="_HEPtC-fXEduqHoOJbURZRw" target="_HEPsv-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEPtHufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEPtIOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEPtIefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEPtH-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEPtIufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HEPtJOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPtI-fXEduqHoOJbURZRw" x="242" y="389"/>
-                </children>
-                <children xmi:id="_HEPtJefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HEPtJ-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPtJufXEduqHoOJbURZRw" x="-114" y="-356"/>
-                </children>
-                <children xmi:id="_HEPtKOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HEPtKufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEPtKefXEduqHoOJbURZRw" x="-46" y="143"/>
-                </children>
-                <children xmi:id="_HEY2cOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HEY2cufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2cefXEduqHoOJbURZRw" x="-521" y="-204"/>
-                </children>
-                <children xmi:id="_HEY2c-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HEY2defXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2dufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2dOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY2d-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HEY2eefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2eufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2eOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY2e-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HEY2fefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2fufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2fOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HEY2f-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HEY2gefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2gufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2gOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEPtHOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEPtHefXEduqHoOJbURZRw" points="[476, 714, 4127, -1826]$[476, 2619, 4127, 79]$[-1402, 2619, 2249, 79]"/>
-              </edges>
-              <edges xmi:id="_HEY2g-fXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC6002BD" source="_HEPtC-fXEduqHoOJbURZRw" target="_HEPs8ufXEduqHoOJbURZRw">
-                <children xmi:id="_HEY2hufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEY2iOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEY2iefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY2h-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY2iufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HEY2jOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2i-fXEduqHoOJbURZRw" x="-134" y="-279"/>
-                </children>
-                <children xmi:id="_HEY2jefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HEY2j-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2jufXEduqHoOJbURZRw" x="752" y="176"/>
-                </children>
-                <children xmi:id="_HEY2kOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HEY2kufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2kefXEduqHoOJbURZRw" x="139" y="-144"/>
-                </children>
-                <children xmi:id="_HEY2k-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HEY2lefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2lOfXEduqHoOJbURZRw" x="274" y="-348"/>
-                </children>
-                <children xmi:id="_HEY2lufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HEY2mOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2mefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2l-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY2mufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HEY2nOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2nefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2m-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY2nufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HEY2oOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2oefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2n-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HEY2oufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HEY2pOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2pefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2o-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEY2hOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEY2hefXEduqHoOJbURZRw" points="[2277, 59, -465, 4224]$[4318, 59, 1574, 4224]$[4318, -3589, 1574, 575]"/>
-              </edges>
-              <edges xmi:id="_HEY2pufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC4A0306" source="_HEPsr-fXEduqHoOJbURZRw" target="_HEPs8ufXEduqHoOJbURZRw">
-                <children xmi:id="_HEY2qefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEY2q-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEY2rOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY2qufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEY2p-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEY2qOfXEduqHoOJbURZRw" points="[457, -550, -1219, 1634]$[457, -1608, -1219, 575]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY2refXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY2rufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEY23-fXEduqHoOJbURZRw" element="_3ADC7B74022D41EC334F0198" source="_HEY2z-fXEduqHoOJbURZRw" target="_HEF7lefXEduqHoOJbURZRw">
-                <children xmi:id="_HEY24ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEY25OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEY25efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY24-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEY24OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEY24efXEduqHoOJbURZRw" points="[0, -787, 0, 3835]$[0, -4106, 0, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY25ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY25-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEY26OfXEduqHoOJbURZRw" element="_3ADC7B74022D427A85E70052" source="_HEY2z-fXEduqHoOJbURZRw" target="_HEY2r-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEY26-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEY27efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEY27ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY27OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY27-fXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427A85E9000A">
-                  <children xmi:id="_HEY28efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY28OfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HEY28ufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A85E9000A">
-                  <children xmi:id="_HEY29OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY28-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HEY29efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A85E90008">
-                  <children xmi:id="_HEY29-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY29ufXEduqHoOJbURZRw" x="6" y="-168"/>
-                </children>
-                <children xmi:id="_HEY2-OfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A85E90008">
-                  <children xmi:id="_HEY2-ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2-efXEduqHoOJbURZRw" x="-27" y="1093"/>
-                </children>
-                <children xmi:id="_HEY2--fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A85E9000A">
-                  <children xmi:id="_HEY2_efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY2_ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY2_OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY2_-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A85E90008">
-                  <children xmi:id="_HEY3AefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY3AufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY3AOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEY3A-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A85E9000A">
-                  <children xmi:id="_HEY3BefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY3BufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY3BOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HEY3B-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A85E90008">
-                  <children xmi:id="_HEY3CefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEY3CufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEY3COfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEY26efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEY26ufXEduqHoOJbURZRw" points="[-2038, 159, 158, -2804]$[-2699, 159, -503, -2804]$[-2699, 2460, -503, -503]"/>
-              </edges>
-              <edges xmi:id="_HEY3C-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A85AE02CE" source="_HEY2r-fXEduqHoOJbURZRw" target="_HEY2z-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEY3DufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEY3EOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEY3EefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY3D-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEY3DOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEY3DefXEduqHoOJbURZRw" points="[541, -575, -1591, 2472]$[541, -2277, -1591, 770]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY3EufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY3E-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEY3FOfXEduqHoOJbURZRw" element="_3ADC7B74022D42795624017E" source="_HEPsv-fXEduqHoOJbURZRw" target="_HEY2z-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEY3F-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEY3GefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEY3GufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEY3GOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEY3FefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEY3FufXEduqHoOJbURZRw" points="[899, -794, -424, 7699]$[899, -7726, -424, 767]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY3G-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEY3HOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEY3HefXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_HEPs8ufXEduqHoOJbURZRw" target="_HEY2z-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEincOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEincufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEinc-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEincefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEY3HufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEY3H-fXEduqHoOJbURZRw" points="[-2091, 84, 2988, 1862]$[-3437, 84, 1642, 1862]$[-3437, -999, 1642, 778]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEindOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEindefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEindufXEduqHoOJbURZRw" element="_3ADC7B74022D4200583B01E6" source="_HEPtC-fXEduqHoOJbURZRw" target="_HEY2z-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEineefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEine-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEinfOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEineufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEind-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEineOfXEduqHoOJbURZRw" points="[-1701, -736, 635, 5207]$[-1701, -5173, 635, 770]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEinfefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEinfufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEinf-fXEduqHoOJbURZRw" element="_3ADC7B74022D455E650C00A6" source="_HEY2z-fXEduqHoOJbURZRw" target="_HEY2v-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEingufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEinhOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEinhefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEing-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEinhufXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D455E650D0037">
-                  <children xmi:id="_HEiniOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEinh-fXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HEiniefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D455E650D0037">
-                  <children xmi:id="_HEini-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEiniufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HEinjOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D455E650D0005">
-                  <children xmi:id="_HEinjufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEinjefXEduqHoOJbURZRw" x="682" y="179"/>
-                </children>
-                <children xmi:id="_HEinj-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D455E650D0005">
-                  <children xmi:id="_HEinkefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEinkOfXEduqHoOJbURZRw" x="682" y="-2031"/>
-                </children>
-                <children xmi:id="_HEinkufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D455E650D0037">
-                  <children xmi:id="_HEinlOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEinlefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEink-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEinlufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D455E650D0005">
-                  <children xmi:id="_HEinmOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEinmefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEinl-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HEinmufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D455E650D0037">
-                  <children xmi:id="_HEinnOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEinnefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEinm-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HEinnufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D455E650D0005">
-                  <children xmi:id="_HEinoOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEinoefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HEinn-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEingOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEingefXEduqHoOJbURZRw" points="[-2038, -476, 1905, -5688]$[-5107, -476, -1164, -5688]$[-5107, 4709, -1164, -503]"/>
-              </edges>
-              <edges xmi:id="_HEinoufXEduqHoOJbURZRw" element="_3ADC7B74022D455E667A00D9" source="_HEY2v-fXEduqHoOJbURZRw" target="_HEF7lefXEduqHoOJbURZRw">
-                <children xmi:id="_HEinpefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEinp-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEinqOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEinpufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEino-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEinpOfXEduqHoOJbURZRw" points="[-2328, -159, -6032, 9869]$[-2671, -159, -6375, 9869]$[-2671, -10133, -6375, -105]$[1747, -10133, -1957, -105]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEinqefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEinqufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GrqNYefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0262">
-            <body>01</body>
-          </ownedComment>
-          <packageMerge xmi:id="_noyTMOxgEduHje3pPahN4A" mergedPackage="_3ADC7B74022D41DDF869012E"/>
-          <packageMerge xmi:id="_c6tdkOx5Edu5-vVjlfVsfQ" mergedPackage="_3ADC7B74022D4119A62B036F"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0280" name="MethodElement" isAbstract="true">
-            <ownedComment xmi:id="_GrqNZ-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0280">
-              <body>Every class defined in this specification is derived from Method Element.  In other words Method Element is the root generalization for all UMA classes and defines a common set of attributes inherited by every other element type of this model.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.  Method Element inherits the Name attribute from Packageable Element's super class.  Every element defined as a UMA instance is derived from Model Element.  Every Method Element in-stance is at least defined by a unique id, a name, as well as brief description.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41EC334F0198" general="_3ADC7B74022D41DDE83301A5"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0050" name="guid" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GrqNa-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0050">
-                <body>Every instance of Method Element has a global unique id.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_69AWEeyFEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_69AWEOyFEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_8zUXcOyFEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0047" name="briefDescription" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GrqNbufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0047">
-                <body>Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_R8IZseyFEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_R8IZsOyFEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_TGCoEOyFEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A85E90008" name="ownedRules" visibility="public" type="_3ADC7B74022D427A857B0333" aggregation="composite" association="_3ADC7B74022D427A85E70052">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsQDQufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsQDQefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D455E650D0005" name="methodElementProperty" visibility="public" type="_3ADC7B74022D455E6202032A" aggregation="composite" association="_3ADC7B74022D455E650C00A6">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsZ0R-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsZ0RufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E026C" name="ContentElement" isAbstract="true">
-            <ownedComment xmi:id="_GrzXUufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E026C">
-              <body>Content Element is a Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
-Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4294EC4A0306" general="_3ADC7B74022D4294EB9000FC"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE4A970123" name="ContentDescription">
-            <ownedComment xmi:id="_GrzXVufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE4A970123">
-              <body>Content Description is a Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. </body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4200583B01E6" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D41DF32190029" name="mainDescription" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GrzXWufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DF32190029">
-                <body>This attribute store the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3U11MeyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3U11MOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_3NsEUOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D421E4DAD004D" name="sections" visibility="public" type="_3ADC7B74022D421E4CF301AE" aggregation="composite" association="_3ADC7B74022D421E4DAC01A0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsQDSefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsQDSOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D421E4CF301AE" name="Section">
-            <ownedComment xmi:id="_GrzXXefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D421E4CF301AE">
-              <body>A Section is a special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D42795624017E" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D4279625D0234" name="sectionName" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gr9IU-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4279625D0234">
-                <body>Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_o1VUIeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_o1VUIOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_otb8YOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D421E4DF3003A" name="sectionDescription" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gr9IVufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D421E4DF3003A">
-                <body>This attributes store the description text for a Content Description's Section.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_5PVL8eyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_5PVL8OyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_5HuvIOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D421E4E3D0362" name="subSections" visibility="public" type="_3ADC7B74022D421E4CF301AE" aggregation="composite" association="_3ADC7B74022D421E4E3B0319">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsQDUufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsQDUefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D427A857B0333" name="Constraint">
-            <ownedComment xmi:id="_Gr9IWefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A857B0333">
-              <body>A Constraint is a Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D427A85AE02CE" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A8A1F02F3" name="body" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gr9IXefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A8A1F02F3">
-                <body>This attribute stores the definition of the constraint.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_8piT4eyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_8piT4OyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_8gcpUOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D4294EB9000FC" name="DescribableElement" isAbstract="true">
-            <ownedComment xmi:id="_GsG5UufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4294EB9000FC">
-              <body>Describable Element is an abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
-This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance (see Section 4.1.4).  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4294EC270106" general="_3ADC7B74022D41DDE6580157"/>
-            <generalization xmi:id="_3ADC7B74022D4294EC2B01CA" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F9AB9802B9" name="presentationName" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GsG5V-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F9AB9802B9">
-                <body>Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to &quot;rup_architecture_document&quot; to differentiate from a &quot;j2ee_architcture_document&quot; whereas the external presentation would always be &quot;Architecture Document&quot;.
-</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_4XwLEeyFEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_4XwLEOyFEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_5sZCwOyFEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4294EC6002BF" name="presentation" visibility="public" type="_3ADC7B74022D41DE4A970123" aggregation="composite" association="_3ADC7B74022D4294EC6002BD">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsZ0Q-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsZ0QufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D455E6202032A" name="MethodElementProperty">
-            <generalization xmi:id="_3ADC7B74022D455E667A00D9" general="_3ADC7B74022D41DDE83301A5"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D455E65C80218" name="value" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_dyr7geyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_dyr7gOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_dnzhMOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A85E70052" memberEnd="_3ADC7B74022D427A85E90008 _3ADC7B74022D427A85E9000A">
-            <ownedComment xmi:id="_GsG5XefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A85E70052">
-              <body>A Method Element can own many Constraints defining rules for this element.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A85E9000A" name="_methodElement" visibility="public" type="_3ADC7B74022D40F36C5E0280" isUnique="false" association="_3ADC7B74022D427A85E70052"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D421E4DAC01A0" memberEnd="_3ADC7B74022D421E4DAD004D _3ADC7B74022D421E4DAD0057">
-            <ownedComment xmi:id="_GsQDRefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D421E4DAC01A0">
-              <body>A Content Description can optionally be structure into Sections.  This association is use to decomposed Section into a hierarchy of Sections.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D421E4DAD0057" name="_contentDescription" visibility="public" type="_3ADC7B74022D41DE4A970123" isUnique="false" association="_3ADC7B74022D421E4DAC01A0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsQDTOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsQDS-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D421E4E3B0319" memberEnd="_3ADC7B74022D421E4E3D0362 _3ADC7B74022D421E4E3D0364">
-            <ownedComment xmi:id="_GsQDTufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D421E4E3B0319">
-              <body>Sections can be further decomposed into n levels of sub-sections.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D421E4E3D0364" name="_section" visibility="public" type="_3ADC7B74022D421E4CF301AE" isUnique="false" association="_3ADC7B74022D421E4E3B0319">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsQDVefXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsQDVOfXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4294EC6002BD" memberEnd="_3ADC7B74022D4294EC6002BE _3ADC7B74022D4294EC6002BF">
-            <ownedComment xmi:id="_GsQDV-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4294EC6002BD">
-              <body>A Describable Element can contain a Content Description element that stores textual descriptions for this Content Element.  Content Description is intended to be refined with sub-classes adding more description attributes.  Any of these sub-types can be related to a Content Element.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4294EC6002BE" name="_describableElement" visibility="public" type="_3ADC7B74022D4294EB9000FC" isUnique="false" association="_3ADC7B74022D4294EC6002BD">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GsZ0QOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GsQDWufXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D455E650C00A6" memberEnd="_3ADC7B74022D455E650D0005 _3ADC7B74022D455E650D0037">
-            <ownedEnd xmi:id="_3ADC7B74022D455E650D0037" name="_methodElement" visibility="public" type="_3ADC7B74022D40F36C5E0280" isUnique="false" association="_3ADC7B74022D455E650C00A6"/>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C5E0294" name="CoreContentElements">
-          <eAnnotations xmi:id="_GtTMM-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F48DDC02C7">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F48DDC02C7" type="Class" name="Taxonomy">
-              <children xmi:id="_HEinq-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02DA">
-                <children xmi:id="_HEinrufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEinr-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HEinsOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEinsefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEinsufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEins-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEintOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEintefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEintufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYcOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYcefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYcufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsYc-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEinrOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEinrefXEduqHoOJbURZRw" x="17239" y="8561"/>
-              </children>
-              <children xmi:id="_HEsYdOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_HEsYd-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsYeOfXEduqHoOJbURZRw" width="2827" height="1049"/>
-                </children>
-                <children xmi:id="_HEsYeefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsYeufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsYe-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsYfOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYfefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYfufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYf-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYgOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYgefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYgufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsYg-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsYdefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsYdufXEduqHoOJbURZRw" x="6086" y="785"/>
-              </children>
-              <children xmi:id="_HEsYhOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E017F">
-                <children xmi:id="_HEsYh-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsYiOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HEsYiefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsYiufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsYi-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsYjOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYjefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYjufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYj-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYkOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYkefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYkufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsYk-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsYhefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsYhufXEduqHoOJbURZRw" x="5588" y="11152"/>
-              </children>
-              <children xmi:id="_HEsYlOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E018F">
-                <children xmi:id="_HEsYl-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsYmOfXEduqHoOJbURZRw" width="1828" height="905"/>
-                </children>
-                <children xmi:id="_HEsYmefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsYmufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsYm-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsYnOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYnefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYnufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYn-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYoOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYoufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsYo-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsYlefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsYlufXEduqHoOJbURZRw" x="11443" y="11152"/>
-              </children>
-              <children xmi:id="_HEsYpOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_HEsYp-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsYqOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HEsYqefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsYqufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsYq-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsYrOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYrefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYrufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYr-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYsOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYsefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYsufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsYs-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsYpefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsYpufXEduqHoOJbURZRw" x="23050" y="8559"/>
-              </children>
-              <children xmi:id="_HEsYtOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0185">
-                <children xmi:id="_HEsYt-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsYuOfXEduqHoOJbURZRw" width="2032" height="905"/>
-                </children>
-                <children xmi:id="_HEsYuefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsYuufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsYu-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsYvOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYvufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYv-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYwOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYwefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYwufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsYw-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsYtefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsYtufXEduqHoOJbURZRw" x="17226" y="11152"/>
-              </children>
-              <children xmi:id="_HEsYxOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_HEsYx-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsYyOfXEduqHoOJbURZRw" width="2455" height="905"/>
-                </children>
-                <children xmi:id="_HEsYyefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsYyufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsYy-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsYzOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYzefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsYzufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsYz-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsY0OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsY0efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsY0ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsY0-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsYxefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsYxufXEduqHoOJbURZRw" x="11448" y="8561"/>
-              </children>
-              <children xmi:id="_HEsY1OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_HEsY1-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsY2OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HEsY2efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsY2ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsY2-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsY3OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsY3efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsY3ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsY3-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsY4OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsY4efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsY4ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsY4-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsY1efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsY1ufXEduqHoOJbURZRw" x="5591" y="8559"/>
-              </children>
-              <children xmi:id="_HEsY_-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E026C">
-                <children xmi:id="_HEsZAufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HEsZA-fXEduqHoOJbURZRw" width="2878" height="1049"/>
-                </children>
-                <children xmi:id="_HEsZBOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HEsZBefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HEsZBufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HEsZB-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsZCOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsZCefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsZCufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsZC-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HEsZDOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HEsZDefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HEsZDufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HEsZAOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsZAefXEduqHoOJbURZRw" x="11882" y="5977"/>
-              </children>
-              <children xmi:id="_HE1ia-fXEduqHoOJbURZRw" element="_3ADC7B74022D42794A660368">
-                <children xmi:id="_HE1ibufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HE1ib-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HE1icOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HE1icefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HE1icufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HE1ic-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1idOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1idefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1idufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1id-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1ieOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1ieefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HE1ieufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HE1ibOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1ibefXEduqHoOJbURZRw" x="2415" y="5966"/>
-              </children>
-              <children xmi:id="_HE1ie-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E4CF301AE">
-                <children xmi:id="_HE1ifufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HE1if-fXEduqHoOJbURZRw" width="2794" height="1032"/>
-                </children>
-                <children xmi:id="_HE1igOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HE1igefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HE1igufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HE1ig-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1ihOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1ihefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1ihufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1ih-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1iiOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1iiefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HE1iiufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HE1ifOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1ifefXEduqHoOJbURZRw" x="783" y="3363"/>
-              </children>
-              <children xmi:id="_HE1ilOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_HE1il-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HE1imOfXEduqHoOJbURZRw" width="2658" height="905"/>
-                </children>
-                <children xmi:id="_HE1imefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HE1imufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HE1im-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HE1inOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1inefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1inufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1in-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1ioOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1ioefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1ioufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HE1io-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HE1ilefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1ilufXEduqHoOJbURZRw" x="5593" y="3380"/>
-              </children>
-              <children xmi:id="_HE1itufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_HE1iuefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HE1iuufXEduqHoOJbURZRw" width="3606" height="1032"/>
-                </children>
-                <children xmi:id="_HE1iu-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HE1ivOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HE1ivefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HE1ivufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1iv-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1iwOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1iwefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1iwufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE1iw-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE1ixOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HE1ixefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HE1it-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1iuOfXEduqHoOJbURZRw" x="11437" y="3369"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GtTMNefXEduqHoOJbURZRw" description="The Core Content Elements package defines the core elements of every method such as roles, tasks, and work products.  This diagram shows a taxonomy of the elements defined in this package.  All Core Content Elements, with the exception of Step, are derived from Content Element.  Step is not a Content Element, because it is defined as a special Section which was defined in the last Section as a part of Content Description.  In other words, Step already is a description for content and there does not require being a Content Element with its own Content Description part.  Step and Task are derived from a new abstraction introduced in this package call Work Definition, which represents behavioral descriptions for units of work."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HEsY5OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92000F" source="_HEsYhOfXEduqHoOJbURZRw" target="_HEsYxOfXEduqHoOJbURZRw">
-                <children xmi:id="_HEsY5-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEsY6efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEsY6ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsY6OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEsY5efXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEsY5ufXEduqHoOJbURZRw" points="[-1, -503, -5822, 2090]$[5820, -2091, -1, 502]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsY6-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsY7OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEsY7efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92004A" source="_HEsYlOfXEduqHoOJbURZRw" target="_HEsYxOfXEduqHoOJbURZRw">
-                <children xmi:id="_HEsY8OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEsY8ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEsY8-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsY8efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEsY7ufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEsY7-fXEduqHoOJbURZRw" points="[-1, -503, -1, 2090]$[-1, -2091, -1, 502]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsY9OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsY9efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEsY9ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92002C" source="_HEsYtOfXEduqHoOJbURZRw" target="_HEsYxOfXEduqHoOJbURZRw">
-                <children xmi:id="_HEsY-efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEsY--fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEsY_OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsY-ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEsY9-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEsY-OfXEduqHoOJbURZRw" points="[0, -503, 5820, 2090]$[-5821, -2091, -1, 502]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsY_efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsY_ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEsZD-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C93011D" source="_HEinq-fXEduqHoOJbURZRw" target="_HEsY_-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEsZEufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEsZFOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEsZFefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsZE-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEsZEOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEsZEefXEduqHoOJbURZRw" points="[0, -503, 5807, 2090]$[-5821, -2090, -14, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsZFufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsZF-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEsZGOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920307" source="_HEsYpOfXEduqHoOJbURZRw" target="_HEsY_-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEsZG-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEsZHefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEsZHufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsZHOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEsZGefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEsZGufXEduqHoOJbURZRw" points="[0, -503, 11628, 2090]$[-11642, -2090, -14, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsZH-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HEsZIOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HEsZIefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92032F" source="_HEsY1OfXEduqHoOJbURZRw" target="_HEsY_-fXEduqHoOJbURZRw">
-                <children xmi:id="_HEsZJOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HEsZJufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HEsZJ-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HEsZJefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HEsZIufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HEsZI-fXEduqHoOJbURZRw" points="[-1, -503, -5835, 2090]$[5820, -2090, -14, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1iYOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1iYefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1iYufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9203D9" source="_HEsYxOfXEduqHoOJbURZRw" target="_HEsY_-fXEduqHoOJbURZRw">
-                <children xmi:id="_HE1iZefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1iZ-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1iaOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1iZufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1iY-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1iZOfXEduqHoOJbURZRw" points="[-1, -503, -14, 2090]$[-1, -2090, -14, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1iaefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1iaufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1ii-fXEduqHoOJbURZRw" element="_3ADC7B74022D4279830E0150" source="_HE1ia-fXEduqHoOJbURZRw" target="_HE1ie-fXEduqHoOJbURZRw">
-                <children xmi:id="_HE1ijufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1ikOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1ikefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1ij-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1ijOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1ijefXEduqHoOJbURZRw" points="[-1, -503, 2143, 2090]$[-2144, -2090, 0, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1ikufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1ik-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1ipOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A831800B8" source="_HEsY1OfXEduqHoOJbURZRw" target="_HE1ilOfXEduqHoOJbURZRw">
-                <children xmi:id="_HE1ip-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1iqefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1iqufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1iqOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1ipefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1ipufXEduqHoOJbURZRw" points="[-1, -503, -1, 4683]$[-1, -4683, -1, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1iq-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1irOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1irefXEduqHoOJbURZRw" element="_3ADC7B74022D427A832300FE" source="_HE1ia-fXEduqHoOJbURZRw" target="_HE1ilOfXEduqHoOJbURZRw">
-                <children xmi:id="_HE1isOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1isufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1is-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1isefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1irufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1ir-fXEduqHoOJbURZRw" points="[-1, -503, -3176, 2090]$[3174, -2090, -1, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1itOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1itefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1ixufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC4A0306" source="_HEsY_-fXEduqHoOJbURZRw" target="_HE1itufXEduqHoOJbURZRw">
-                <children xmi:id="_HE1iyefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1iy-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1izOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1iyufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1ix-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1iyOfXEduqHoOJbURZRw" points="[-14, -503, 224, 2090]$[-252, -2090, -14, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1izefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1izufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1iz-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A82F3026E" source="_HE1ilOfXEduqHoOJbURZRw" target="_HEsYdOfXEduqHoOJbURZRw">
-                <children xmi:id="_HE1i0ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1i1OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1i1efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1i0-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1i0OfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1i0efXEduqHoOJbURZRw" points="[-1, -503, 0, 2090]$[-1, -2090, 0, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1i1ufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1i1-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1i2OfXEduqHoOJbURZRw" element="_3ADC7B74022D42795624017E" source="_HE1ie-fXEduqHoOJbURZRw" target="_HEsYdOfXEduqHoOJbURZRw">
-                <children xmi:id="_HE1i2-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1i3efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1i3ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1i3OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1i2efXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1i2ufXEduqHoOJbURZRw" points="[0, -503, -5318, 2090]$[5318, -2090, 0, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1i3-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1i4OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE1i4efXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_HE1itufXEduqHoOJbURZRw" target="_HEsYdOfXEduqHoOJbURZRw">
-                <children xmi:id="_HE1i5OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE1i5ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE1i5-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE1i5efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE1i4ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE1i4-fXEduqHoOJbURZRw" points="[-14, -503, 5583, 2090]$[-5597, -2090, 0, 503]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1i6OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE1i6efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F370A30152" type="Class" name="Structure">
-              <children xmi:id="_HE_TYOfXEduqHoOJbURZRw" type="Note" element="_3ADC7B74022D40F48DDC02C7">
-                <children xmi:id="_HE_TY-fXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_HE_TZOfXEduqHoOJbURZRw" visible="false" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_HE_TYefXEduqHoOJbURZRw" underline="true" description="Class Diagram: CoreContentElements / Taxonomy" lineColor="0"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE_TYufXEduqHoOJbURZRw" x="1016" y="13605" width="4308" height="1134"/>
-              </children>
-              <children xmi:id="_HE_TZefXEduqHoOJbURZRw" type="Note" element="_3ADC7B74022D412ED213032B">
-                <children xmi:id="_HE_TaOfXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_HE_TaefXEduqHoOJbURZRw" visible="false" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_HE_TZufXEduqHoOJbURZRw" underline="true" description="Class Diagram: CoreContentElements / WorkProducts" lineColor="0"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE_TZ-fXEduqHoOJbURZRw" x="1049" y="12090" width="4153" height="1126"/>
-              </children>
-              <children xmi:id="_HE_TaufXEduqHoOJbURZRw" type="Note">
-                <children xmi:id="_HE_TbefXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_HE_TbufXEduqHoOJbURZRw" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_HE_Ta-fXEduqHoOJbURZRw" fontName="Arial" description="{Role.modifies = Role.performs.output}&#xA;kept for compatibility with RUP&#xA;" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE_TbOfXEduqHoOJbURZRw" x="5029" y="10515" width="6908" height="1126"/>
-              </children>
-              <children xmi:id="_HE_Tb-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_HE_TcufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HE_Tc-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HE_TdOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HE_TdefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HE_TdufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HE_Td-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TeOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE_TeefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TeufXEduqHoOJbURZRw" collapsed="true"/>
-                </children>
-                <children xmi:id="_HE_Te-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TfOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE_TfefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HE_TfufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HE_TcOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE_TcefXEduqHoOJbURZRw" x="2218" y="965" width="3395" height="2650"/>
-              </children>
-              <children xmi:id="_HE_Tf-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_HE_TgufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HE_Tg-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HE_ThOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HE_ThefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HE_ThufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HE_Th-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TiOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE_TiefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TiufXEduqHoOJbURZRw" collapsed="true"/>
-                </children>
-                <children xmi:id="_HE_Ti-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TjOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HE_TjefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HE_TjufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HE_TgOfXEduqHoOJbURZRw" italic="true" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE_TgefXEduqHoOJbURZRw" x="17754" y="8077" width="3708" height="2040"/>
-              </children>
-              <children xmi:id="_HFJEYOfXEduqHoOJbURZRw" element="_3ADC7B74022D42794A660368">
-                <children xmi:id="_HFJEY-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFJEZOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFJEZefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFJEZufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFJEZ-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFJEaOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEaefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFJEaufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEa-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFJEbOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEbefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFJEbufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFJEb-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFJEYefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFJEYufXEduqHoOJbURZRw" x="24053" y="1380" width="2184" height="1617"/>
-              </children>
-              <children xmi:id="_HFJEcOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_HFJEc-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFJEdOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFJEdefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFJEdufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFJEd-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFJEeOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEeefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFJEeufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEe-fXEduqHoOJbURZRw" collapsed="true"/>
-                </children>
-                <children xmi:id="_HFJEfOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEfefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFJEfufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFJEf-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFJEcefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFJEcufXEduqHoOJbURZRw" x="17847" y="1066" width="3318" height="2345"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GtcWEefXEduqHoOJbURZRw" description="|Method content is fundamentally described by defining Tasks described with Steps that have Work Products as input and output and which are being performed by Roles.  The diagram depicts these core elements with their relationships.  The relationships are labeled with a &quot;Default_&quot; prefix, because they describe the 'standard' or 'normal' way of performing the method described; i.e. doing the work under 'normal' circumstances, with 'normal' being what the method author perceives as the most general case.  However, different processes would apply these elements in different parts of a lifecycle differently and then need to define changes on these relationships.  For example, if a Task is performed in more then one iteration of an iterative lifecycle model different Roles could be added to (or removed from) performing the Task as well as different inputs might be considered at different points in time.  Such changes would be defined on process specific Descriptors that reference and have been defined based on these core content elements (see Process for more details).&#xA;"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HE_Tj-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9300F5" source="_HE_Tf-fXEduqHoOJbURZRw" target="_HE_Tb-fXEduqHoOJbURZRw">
-                <children xmi:id="_HE_TkufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE_TlOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE_TlefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE_Tk-fXEduqHoOJbURZRw" x="-152" y="304"/>
-                </children>
-                <children xmi:id="_HE_TlufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9300F8">
-                  <children xmi:id="_HE_TmOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_Tl-fXEduqHoOJbURZRw" x="-2761" y="279"/>
-                </children>
-                <children xmi:id="_HE_TmefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9300F8">
-                  <children xmi:id="_HE_Tm-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_TmufXEduqHoOJbURZRw" x="-1839" y="-314"/>
-                </children>
-                <children xmi:id="_HE_TnOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9300F6">
-                  <children xmi:id="_HE_TnufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_TnefXEduqHoOJbURZRw" x="2525" y="279"/>
-                </children>
-                <children xmi:id="_HE_Tn-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C9300F6">
-                  <children xmi:id="_HE_ToefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_ToOfXEduqHoOJbURZRw" x="2568" y="-1245"/>
-                </children>
-                <children xmi:id="_HE_ToufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9300F8">
-                  <children xmi:id="_HE_TpOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TpefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_To-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HE_TpufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9300F6">
-                  <children xmi:id="_HE_TqOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TqefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_Tp-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HE_TqufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9300F8">
-                  <children xmi:id="_HE_TrOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TrefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_Tq-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HE_TrufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9300F6">
-                  <children xmi:id="_HE_TsOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TsefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_Tr-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE_TkOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE_TkefXEduqHoOJbURZRw" points="[-1854, 651, 13843, 7459]$[-16264, 651, -567, 7459]$[-16264, -5486, -567, 1320]"/>
-              </edges>
-              <edges xmi:id="_HE_TsufXEduqHoOJbURZRw" type="NoteAttachment" source="_HE_TaufXEduqHoOJbURZRw" target="_HE_Tj-fXEduqHoOJbURZRw">
-                <styles xmi:type="notation:ConnectorStyle" xmi:id="_HE_Ts-fXEduqHoOJbURZRw" lineColor="0"/>
-                <element xsi:nil="true"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE_TtOfXEduqHoOJbURZRw" points="[-423, -567, 584, 762]$[-1007, -1329, 0, 0]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE_TtefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HE_TtufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HE_Tt-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C930109" source="_HE_Tf-fXEduqHoOJbURZRw" target="_HE_Tb-fXEduqHoOJbURZRw">
-                <children xmi:id="_HE_TuufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HE_TvOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HE_TvefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HE_Tu-fXEduqHoOJbURZRw" x="-339" y="280"/>
-                </children>
-                <children xmi:id="_HE_TvufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HE_TwOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_Tv-fXEduqHoOJbURZRw" x="-2437" y="280"/>
-                </children>
-                <children xmi:id="_HE_TwefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HE_Tw-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_TwufXEduqHoOJbURZRw" x="-693" y="-304"/>
-                </children>
-                <children xmi:id="_HE_TxOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HE_TxufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_TxefXEduqHoOJbURZRw" x="2150" y="-322"/>
-                </children>
-                <children xmi:id="_HE_Tx-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HE_TyefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_TyOfXEduqHoOJbURZRw" x="2218" y="1795"/>
-                </children>
-                <children xmi:id="_HE_TyufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HE_TzOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_TzefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_Ty-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HE_TzufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HE_T0OfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_T0efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_Tz-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HE_T0ufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HE_T1OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_T1efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_T0-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HE_T1ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HE_T2OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HE_T2efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HE_T1-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HE_TuOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HE_TuefXEduqHoOJbURZRw" points="[-1854, -211, 13843, 6595]$[-14791, -211, 905, 6595]$[-14791, -5486, 905, 1320]"/>
-              </edges>
-              <edges xmi:id="_HFJEgOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920308" source="_HFJEcOfXEduqHoOJbURZRw" target="_HE_Tb-fXEduqHoOJbURZRw">
-                <children xmi:id="_HFJEg-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFJEhefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFJEhufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFJEhOfXEduqHoOJbURZRw" x="66" y="262"/>
-                </children>
-                <children xmi:id="_HFJEh-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFJEiefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEiOfXEduqHoOJbURZRw" x="-1438" y="279"/>
-                </children>
-                <children xmi:id="_HFJEiufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFJEjOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEi-fXEduqHoOJbURZRw" x="-782" y="-263"/>
-                </children>
-                <children xmi:id="_HFJEjefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFJEj-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEjufXEduqHoOJbURZRw" x="1221" y="288"/>
-                </children>
-                <children xmi:id="_HFJEkOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFJEkufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEkefXEduqHoOJbURZRw" x="335" y="-322"/>
-                </children>
-                <children xmi:id="_HFJEk-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFJElefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJElufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJElOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJEl-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFJEmefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEmufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEmOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJEm-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFJEnefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEnufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEnOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFJEn-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFJEoefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEoufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEoOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFJEgefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFJEgufXEduqHoOJbURZRw" points="[-1659, 660, 13936, 609]$[-13902, 660, 1693, 609]"/>
-              </edges>
-              <edges xmi:id="_HFJEo-fXEduqHoOJbURZRw" element="_3ADC7B74022D4117CF5C01CC" source="_HE_Tb-fXEduqHoOJbURZRw" target="_HFJEcOfXEduqHoOJbURZRw">
-                <children xmi:id="_HFJEpufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFJEqOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFJEqefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFJEp-fXEduqHoOJbURZRw" x="-148" y="-272"/>
-                </children>
-                <children xmi:id="_HFJEqufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFJErOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEq-fXEduqHoOJbURZRw" x="-1312" y="-263"/>
-                </children>
-                <children xmi:id="_HFJErefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFJEr-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJErufXEduqHoOJbURZRw" x="1541" y="312"/>
-                </children>
-                <children xmi:id="_HFJEsOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFJEsufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEsefXEduqHoOJbURZRw" x="1457" y="-196"/>
-                </children>
-                <children xmi:id="_HFJEs-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFJEtefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEtOfXEduqHoOJbURZRw" x="322" y="312"/>
-                </children>
-                <children xmi:id="_HFJEtufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFJEuOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEuefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEt-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJEuufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFJEvOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEvefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEu-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJEvufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFJEwOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJEwefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEv-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFJEwufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFJExOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJExefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEw-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFJEpOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFJEpefXEduqHoOJbURZRw" points="[1693, -770, -13902, -719]$[13936, -770, -1659, -719]"/>
-              </edges>
-              <edges xmi:id="_HFJExufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92039D" source="_HE_Tf-fXEduqHoOJbURZRw" target="_HFJEcOfXEduqHoOJbURZRw">
-                <children xmi:id="_HFJEyefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFJEy-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFJEzOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFJEyufXEduqHoOJbURZRw" x="1675" y="2111"/>
-                </children>
-                <children xmi:id="_HFJEzefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFJEz-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJEzufXEduqHoOJbURZRw" x="-637" y="-283"/>
-                </children>
-                <children xmi:id="_HFJE0OfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFJE0ufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE0efXEduqHoOJbURZRw" x="1380" y="1522"/>
-                </children>
-                <children xmi:id="_HFJE0-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFJE1efXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE1OfXEduqHoOJbURZRw" x="569" y="-287"/>
-                </children>
-                <children xmi:id="_HFJE1ufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFJE2OfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE1-fXEduqHoOJbURZRw" x="-1079" y="1649"/>
-                </children>
-                <children xmi:id="_HFJE2efXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFJE2-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJE3OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE2ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJE3efXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFJE3-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJE4OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE3ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJE4efXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFJE4-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJE5OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE4ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFJE5efXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFJE5-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJE6OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE5ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFJEx-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFJEyOfXEduqHoOJbURZRw" points="[626, -1024, 728, 5833]$[2286, -3699, 2387, 3158]$[778, -5689, 880, 1168]"/>
-              </edges>
-              <edges xmi:id="_HFJE6efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9203BB" source="_HE_Tf-fXEduqHoOJbURZRw" target="_HFJEcOfXEduqHoOJbURZRw">
-                <children xmi:id="_HFJE7OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFJE7ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFJE7-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFJE7efXEduqHoOJbURZRw" x="1571" y="-1460"/>
-                </children>
-                <children xmi:id="_HFJE8OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFJE8ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE8efXEduqHoOJbURZRw" x="-473" y="279"/>
-                </children>
-                <children xmi:id="_HFJE8-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFJE9efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE9OfXEduqHoOJbURZRw" x="576" y="-773"/>
-                </children>
-                <children xmi:id="_HFJE9ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFJE-OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE9-fXEduqHoOJbURZRw" x="672" y="309"/>
-                </children>
-                <children xmi:id="_HFJE-efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFJE--fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE-ufXEduqHoOJbURZRw" x="-785" y="-1060"/>
-                </children>
-                <children xmi:id="_HFJE_OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFJE_ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJE_-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJE_efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJFAOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFJFAufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJFA-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJFAefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFJFBOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFJFBufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJFB-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJFBefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFJFCOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFJFCufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFJFC-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFJFCefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFJE6ufXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFJE6-fXEduqHoOJbURZRw" points="[-872, -1024, -770, 5833]$[-3115, -3699, -3014, 3158]$[-1236, -5689, -1134, 1168]"/>
-              </edges>
-              <edges xmi:id="_HFSOUOfXEduqHoOJbURZRw" element="_3ADC7B74022D4177F8490131" source="_HFJEcOfXEduqHoOJbURZRw" target="_HE_Tf-fXEduqHoOJbURZRw">
-                <children xmi:id="_HFSOU-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFSOVefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFSOVufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFSOVOfXEduqHoOJbURZRw" x="-47" y="-126"/>
-                </children>
-                <children xmi:id="_HFSOV-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFSOWefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOWOfXEduqHoOJbURZRw" x="-296" y="-278"/>
-                </children>
-                <children xmi:id="_HFSOWufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFSOXOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOW-fXEduqHoOJbURZRw" x="280" y="-253"/>
-                </children>
-                <children xmi:id="_HFSOXefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFSOX-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOXufXEduqHoOJbURZRw" x="456" y="-346"/>
-                </children>
-                <children xmi:id="_HFSOYOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFSOYufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOYefXEduqHoOJbURZRw" x="-560" y="-168"/>
-                </children>
-                <children xmi:id="_HFSOY-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFSOZefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOZufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOZOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFSOZ-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFSOaefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOaufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOaOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFSOa-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFSObefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSObufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSObOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFSOb-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFSOcefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOcufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOcOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFSOUefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFSOUufXEduqHoOJbURZRw" points="[-84, 1168, -186, -5689]$[-84, 5833, -186, -1024]"/>
-              </edges>
-              <edges xmi:id="_HFSOc-fXEduqHoOJbURZRw" element="_3ADC7B74022D427962D3003F" source="_HFJEcOfXEduqHoOJbURZRw" target="_HFJEYOfXEduqHoOJbURZRw">
-                <children xmi:id="_HFSOdufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFSOeOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFSOeefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFSOd-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFSOeufXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HFSOfOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOe-fXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HFSOfefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HFSOf-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOfufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFSOgOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HFSOgufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOgefXEduqHoOJbURZRw" x="-66" y="321"/>
-                </children>
-                <children xmi:id="_HFSOg-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HFSOhefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOhOfXEduqHoOJbURZRw" x="-371" y="-306"/>
-                </children>
-                <children xmi:id="_HFSOhufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HFSOiOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOiefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOh-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFSOiufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HFSOjOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOjefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOi-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFSOjufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HFSOkOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOkefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOj-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFSOkufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HFSOlOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOlefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFSOk-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFSOdOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFSOdefXEduqHoOJbURZRw" points="[1659, -50, -3979, 0]$[4546, -50, -1092, 0]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D410AEEC600CA" type="Class" name="Structure (simplified)">
-              <children xmi:id="_HFSOlufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0296">
-                <children xmi:id="_HFSOmefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFSOmufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFSOm-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFSOnOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFSOnefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFSOnufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOn-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFSOoOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOoefXEduqHoOJbURZRw" collapsed="true"/>
-                </children>
-                <children xmi:id="_HFSOoufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFSOo-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFSOpOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFSOpefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFSOl-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFSOmOfXEduqHoOJbURZRw" x="1515" y="914" width="3175" height="2641"/>
-              </children>
-              <children xmi:id="_HFb_UOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_HFb_U-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFb_VOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFb_VefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFb_VufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFb_V-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFb_WOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_WefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFb_WufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_W-fXEduqHoOJbURZRw" collapsed="true"/>
-                </children>
-                <children xmi:id="_HFb_XOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_XefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFb_XufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFb_X-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFb_UefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFb_UufXEduqHoOJbURZRw" x="11472" y="914" width="5909" height="2641"/>
-              </children>
-              <children xmi:id="_HFb_pufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_HFb_qefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFb_qufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFb_q-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFb_rOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFb_refXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFb_rufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_r-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFb_sOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_sefXEduqHoOJbURZRw" collapsed="true"/>
-                </children>
-                <children xmi:id="_HFb_sufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_s-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFb_tOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFb_tefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFb_p-fXEduqHoOJbURZRw" italic="true" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFb_qOfXEduqHoOJbURZRw" x="11472" y="5410" width="5909" height="2590"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GtcWE-fXEduqHoOJbURZRw" description="This diagram provides a simplified overview to the core content structure not showing attributes and only the most important associations as well as omitting association role names."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HFb_YOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920308" source="_HFb_UOfXEduqHoOJbURZRw" target="_HFSOlufXEduqHoOJbURZRw">
-                <children xmi:id="_HFb_Y-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFb_ZefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFb_ZufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFb_ZOfXEduqHoOJbURZRw" x="-37" y="272"/>
-                </children>
-                <children xmi:id="_HFb_Z-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFb_aefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_aOfXEduqHoOJbURZRw" x="-781" y="221"/>
-                </children>
-                <children xmi:id="_HFb_aufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFb_bOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_a-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_befXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFb_b-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_bufXEduqHoOJbURZRw" x="547" y="229"/>
-                </children>
-                <children xmi:id="_HFb_cOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFb_cufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_cefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_c-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFb_defXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_dufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_dOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_d-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFb_eefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_eufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_eOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_e-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C92030B">
-                  <children xmi:id="_HFb_fefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_fufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_fOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFb_f-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C920309">
-                  <children xmi:id="_HFb_gefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_gufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_gOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFb_YefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFb_YufXEduqHoOJbURZRw" points="[-2954, -677, 8373, -677]$[-9745, -677, 1583, -677]"/>
-              </edges>
-              <edges xmi:id="_HFb_g-fXEduqHoOJbURZRw" element="_3ADC7B74022D4117CF5C01CC" source="_HFSOlufXEduqHoOJbURZRw" target="_HFb_UOfXEduqHoOJbURZRw">
-                <children xmi:id="_HFb_hufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFb_iOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFb_iefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFb_h-fXEduqHoOJbURZRw" x="326" y="-314"/>
-                </children>
-                <children xmi:id="_HFb_iufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFb_jOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_i-fXEduqHoOJbURZRw" x="-604" y="-220"/>
-                </children>
-                <children xmi:id="_HFb_jefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFb_j-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_jufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_kOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFb_kufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_kefXEduqHoOJbURZRw" x="825" y="-170"/>
-                </children>
-                <children xmi:id="_HFb_k-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFb_lefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_lOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_lufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFb_mOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_mefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_l-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_mufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFb_nOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_nefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_m-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_nufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4117CF5D0357">
-                  <children xmi:id="_HFb_oOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_oefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_n-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFb_oufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4117CF5D02FD">
-                  <children xmi:id="_HFb_pOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_pefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_o-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFb_hOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFb_hefXEduqHoOJbURZRw" points="[1583, 381, -9745, 381]$[8373, 381, -2954, 381]"/>
-              </edges>
-              <edges xmi:id="_HFb_tufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C930109" source="_HFb_pufXEduqHoOJbURZRw" target="_HFSOlufXEduqHoOJbURZRw">
-                <children xmi:id="_HFb_uefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFb_u-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFb_vOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFb_uufXEduqHoOJbURZRw" x="-1197" y="-381"/>
-                </children>
-                <children xmi:id="_HFb_vefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HFb_v-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_vufXEduqHoOJbURZRw" x="-1581" y="-245"/>
-                </children>
-                <children xmi:id="_HFb_wOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HFb_wufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_wefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_w-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HFb_xefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_xOfXEduqHoOJbURZRw" x="1346" y="-398"/>
-                </children>
-                <children xmi:id="_HFb_xufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HFb_yOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_x-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_yefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HFb_y-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_zOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_yufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_zefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HFb_z-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_0OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_zufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_0efXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C93010C">
-                  <children xmi:id="_HFb_0-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_1OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_0ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFb_1efXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C93010A">
-                  <children xmi:id="_HFb_1-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_2OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_1ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFb_t-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFb_uOfXEduqHoOJbURZRw" points="[-2954, -8, 8373, 4461]$[-12285, -8, -956, 4461]$[-12285, -3149, -956, 1320]"/>
-              </edges>
-              <edges xmi:id="_HFb_2efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92039D" source="_HFb_pufXEduqHoOJbURZRw" target="_HFb_UOfXEduqHoOJbURZRw">
-                <children xmi:id="_HFb_3OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFb_3ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFb_3-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFb_3efXEduqHoOJbURZRw" x="-183" y="846"/>
-                </children>
-                <children xmi:id="_HFb_4OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFb_4ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_4efXEduqHoOJbURZRw" x="-168" y="-238"/>
-                </children>
-                <children xmi:id="_HFb_4-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFb_5efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_5OfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_5ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFb_6OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_5-fXEduqHoOJbURZRw" x="83" y="-136"/>
-                </children>
-                <children xmi:id="_HFb_6efXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFb_6-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_6ufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFb_7OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFb_7ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_7-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_7efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_8OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFb_8ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_8-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_8efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFb_9OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9203A8">
-                  <children xmi:id="_HFb_9ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_9-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_9efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFb_-OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C92039E">
-                  <children xmi:id="_HFb_-ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFb_--fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFb_-efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFb_2ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFb_2-fXEduqHoOJbURZRw" points="[-67, -1295, -67, 3175]$[-67, -3149, -67, 1320]"/>
-              </edges>
-              <edges xmi:id="_HFlJQOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C9203BB" source="_HFb_pufXEduqHoOJbURZRw" target="_HFb_UOfXEduqHoOJbURZRw">
-                <children xmi:id="_HFlJQ-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFlJRefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFlJRufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFlJROfXEduqHoOJbURZRw" x="72" y="-1568"/>
-                </children>
-                <children xmi:id="_HFlJR-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFlJSefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJSOfXEduqHoOJbURZRw" x="-154" y="143"/>
-                </children>
-                <children xmi:id="_HFlJSufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFlJTOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJS-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFlJTefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFlJT-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJTufXEduqHoOJbURZRw" x="53" y="194"/>
-                </children>
-                <children xmi:id="_HFlJUOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFlJUufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJUefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFlJU-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFlJVefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJVufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJVOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFlJV-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFlJWefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJWufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJWOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFlJW-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C9203BE">
-                  <children xmi:id="_HFlJXefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJXufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJXOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFlJX-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C9203BC">
-                  <children xmi:id="_HFlJYefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJYufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJYOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFlJQefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFlJQufXEduqHoOJbURZRw" points="[-2175, -1295, -2175, 3175]$[-2175, -3158, -2175, 1312]"/>
-              </edges>
-              <edges xmi:id="_HFlJY-fXEduqHoOJbURZRw" element="_3ADC7B74022D4177F8490131" source="_HFb_UOfXEduqHoOJbURZRw" target="_HFb_pufXEduqHoOJbURZRw">
-                <children xmi:id="_HFlJZufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFlJaOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFlJaefXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFlJZ-fXEduqHoOJbURZRw" x="-564" y="-2244"/>
-                </children>
-                <children xmi:id="_HFlJaufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFlJbOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJa-fXEduqHoOJbURZRw" x="-44" y="135"/>
-                </children>
-                <children xmi:id="_HFlJbefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFlJb-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJbufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFlJcOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFlJcufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJcefXEduqHoOJbURZRw" x="145" y="110"/>
-                </children>
-                <children xmi:id="_HFlJc-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFlJdefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJdOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HFlJdufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFlJeOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJeefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJd-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFlJeufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFlJfOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJfefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJe-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFlJfufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4177F84A0272">
-                  <children xmi:id="_HFlJgOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJgefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJf-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFlJgufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4177F84A025E">
-                  <children xmi:id="_HFlJhOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJhefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFlJg-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFlJZOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFlJZefXEduqHoOJbURZRw" points="[1947, 1312, 1947, -3158]$[1947, 3175, 1947, -1295]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D412ED213032B" type="Class" name="WorkProducts">
-              <children xmi:id="_HFlJhufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E018F">
-                <children xmi:id="_HFlJiefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFlJiufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFlJi-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFlJjOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFlJjefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFlJjufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJj-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFlJkOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJkefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFlJkufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJk-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFlJlOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFlJlefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFlJh-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFlJiOfXEduqHoOJbURZRw" x="8128" y="3920" width="3860" height="2015"/>
-              </children>
-              <children xmi:id="_HFlJlufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_HFlJmefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFlJmufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFlJm-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFlJnOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFlJnefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFlJnufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJn-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFlJoOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFlJoufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFlJo-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFlJpOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFlJpefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFlJl-fXEduqHoOJbURZRw" italic="true" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFlJmOfXEduqHoOJbURZRw" x="8128" y="821" width="3860" height="2015"/>
-              </children>
-              <children xmi:id="_HFlJr-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0185">
-                <children xmi:id="_HFlJsufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFlJs-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFlJtOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFlJtefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFu6QOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFu6QefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6QufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFu6Q-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6ROfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFu6RefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6RufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFu6R-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFu6SOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFlJsOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFlJsefXEduqHoOJbURZRw" x="12598" y="3920" width="3860" height="2015"/>
-              </children>
-              <children xmi:id="_HFu6defXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E017F">
-                <children xmi:id="_HFu6eOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HFu6eefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HFu6eufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HFu6e-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HFu6fOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HFu6fefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6fufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFu6f-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6gOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFu6gefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6gufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HFu6g-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HFu6hOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HFu6dufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFu6d-fXEduqHoOJbURZRw" x="3708" y="3920" width="3860" height="2015"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GtcWFefXEduqHoOJbURZRw" description="A simplified overview to Work Products. Work Product is an abstract class which provides a generalization for Artifacts, Outcomes, and Deliverables."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HFlJpufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92004A" source="_HFlJhufXEduqHoOJbURZRw" target="_HFlJlufXEduqHoOJbURZRw">
-                <children xmi:id="_HFlJqefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFlJq-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFlJrOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFlJqufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFlJp-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFlJqOfXEduqHoOJbURZRw" points="[0, -1016, 0, 2082]$[0, -2091, 0, 1007]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HFlJrefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HFlJrufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HFu6SefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92002D" source="_HFlJlufXEduqHoOJbURZRw" target="_HFlJr-fXEduqHoOJbURZRw">
-                <children xmi:id="_HFu6TOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFu6TufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFu6T-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFu6TefXEduqHoOJbURZRw" x="1633" y="1056"/>
-                </children>
-                <children xmi:id="_HFu6UOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C920030">
-                  <children xmi:id="_HFu6UufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6UefXEduqHoOJbURZRw" x="-199" y="238"/>
-                </children>
-                <children xmi:id="_HFu6U-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C920030">
-                  <children xmi:id="_HFu6VefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6VOfXEduqHoOJbURZRw" x="2053" y="-287"/>
-                </children>
-                <children xmi:id="_HFu6VufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C92002E">
-                  <children xmi:id="_HFu6WOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6V-fXEduqHoOJbURZRw" x="377" y="-458"/>
-                </children>
-                <children xmi:id="_HFu6WefXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C92002E">
-                  <children xmi:id="_HFu6W-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6WufXEduqHoOJbURZRw" x="123" y="347"/>
-                </children>
-                <children xmi:id="_HFu6XOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C920030">
-                  <children xmi:id="_HFu6XufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6X-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6XefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFu6YOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C92002E">
-                  <children xmi:id="_HFu6YufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6Y-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6YefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFu6ZOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C920030">
-                  <children xmi:id="_HFu6ZufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6Z-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6ZefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFu6aOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C92002E">
-                  <children xmi:id="_HFu6aufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6a-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6aefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFu6SufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFu6S-fXEduqHoOJbURZRw" points="[1930, 42, -2540, -3056]$[4089, 42, -381, -3056]$[4089, 2091, -381, -1007]"/>
-              </edges>
-              <edges xmi:id="_HFu6bOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92002C" source="_HFlJr-fXEduqHoOJbURZRw" target="_HFlJlufXEduqHoOJbURZRw">
-                <children xmi:id="_HFu6b-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFu6cefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFu6cufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFu6cOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFu6befXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFu6bufXEduqHoOJbURZRw" points="[-1456, -1016, 3014, 2082]$[-3005, -2091, 1464, 1007]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HFu6c-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HFu6dOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HFu6hefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C920010" source="_HFu6defXEduqHoOJbURZRw" target="_HFu6defXEduqHoOJbURZRw">
-                <children xmi:id="_HFu6iOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFu6iufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFu6i-fXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFu6iefXEduqHoOJbURZRw" x="-68" y="-279"/>
-                </children>
-                <children xmi:id="_HFu6jOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C920013">
-                  <children xmi:id="_HFu6jufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6jefXEduqHoOJbURZRw" x="1359" y="282"/>
-                </children>
-                <children xmi:id="_HFu6j-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C920013">
-                  <children xmi:id="_HFu6kefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6kOfXEduqHoOJbURZRw" x="-59" y="-311"/>
-                </children>
-                <children xmi:id="_HFu6kufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C920011">
-                  <children xmi:id="_HFu6lOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6k-fXEduqHoOJbURZRw" x="-401" y="768"/>
-                </children>
-                <children xmi:id="_HFu6lefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C920011">
-                  <children xmi:id="_HFu6l-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6lufXEduqHoOJbURZRw" x="1413" y="738"/>
-                </children>
-                <children xmi:id="_HFu6mOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C920013">
-                  <children xmi:id="_HFu6mufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6m-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6mefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFu6nOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C920011">
-                  <children xmi:id="_HFu6nufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6n-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6nefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HFu6oOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C920013">
-                  <children xmi:id="_HFu6oufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6o-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6oefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HFu6pOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C920011">
-                  <children xmi:id="_HFu6pufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HFu6p-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HFu6pefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFu6hufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFu6h-fXEduqHoOJbURZRw" points="[660, 1007, 660, 1007]$[660, 2556, 660, 2556]$[-3869, 2556, -3869, 2556]$[-3869, 220, -3869, 220]$[-1930, 220, -1930, 220]"/>
-              </edges>
-              <edges xmi:id="_HFu6qOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92000F" source="_HFu6defXEduqHoOJbURZRw" target="_HFlJlufXEduqHoOJbURZRw">
-                <children xmi:id="_HFu6q-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HFu6refXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HFu6rufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HFu6rOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HFu6qefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HFu6qufXEduqHoOJbURZRw" points="[1422, -1016, -2997, 2082]$[2963, -2091, -1456, 1007]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HFu6r-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HFu6sOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D4279862701A6" type="Class" name="TasksAndSteps">
-              <children xmi:id="_HF4rQOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_HF4rQ-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HF4rROfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HF4rRefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HF4rRufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HF4rR-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HF4rSOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rSefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rSufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rS-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rTOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rTefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rTufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HF4rT-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HF4rQefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4rQufXEduqHoOJbURZRw" x="2590" y="5198"/>
-              </children>
-              <children xmi:id="_HF4rUOfXEduqHoOJbURZRw" element="_3ADC7B74022D42794A660368">
-                <children xmi:id="_HF4rU-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HF4rVOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HF4rVefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HF4rVufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HF4rV-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HF4rWOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rWefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rWufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rW-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rXOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rXefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rXufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HF4rX-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HF4rUefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4rUufXEduqHoOJbURZRw" x="13970" y="5156"/>
-              </children>
-              <children xmi:id="_HF4rg-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E026C">
-                <children xmi:id="_HF4rhufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HF4rh-fXEduqHoOJbURZRw" width="2878" height="1049"/>
-                </children>
-                <children xmi:id="_HF4riOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HF4riefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HF4riufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HF4ri-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rjOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rjefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rjufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rj-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rkOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rkefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HF4rkufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HF4rhOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4rhefXEduqHoOJbURZRw" x="1151" y="2980"/>
-              </children>
-              <children xmi:id="_HF4rk-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_HF4rlufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HF4rl-fXEduqHoOJbURZRw" width="2658" height="905"/>
-                </children>
-                <children xmi:id="_HF4rmOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HF4rmefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HF4rmufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HF4rm-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rnOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rnefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rnufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rn-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4roOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4roefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HF4roufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HF4rlOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4rlefXEduqHoOJbURZRw" x="7154" y="6764"/>
-              </children>
-              <children xmi:id="_HF4ro-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E4CF301AE">
-                <children xmi:id="_HF4rpufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HF4rp-fXEduqHoOJbURZRw" width="2794" height="1049"/>
-                </children>
-                <children xmi:id="_HF4rqOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HF4rqefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HF4rqufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HF4rq-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rrOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rrefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rrufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rr-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rsOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HF4rsefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HF4rsufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HF4rpOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4rpefXEduqHoOJbURZRw" x="13487" y="745"/>
-              </children>
-              <children xmi:id="_HF4r1ufXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4A970123">
-                <children xmi:id="_HGB1MOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGB1MefXEduqHoOJbURZRw" width="3403" height="1049"/>
-                </children>
-                <children xmi:id="_HGB1MufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGB1M-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGB1NOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGB1NefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1NufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGB1N-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1OOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGB1OefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1OufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGB1O-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGB1POfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HF4r1-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4r2OfXEduqHoOJbURZRw" x="7442" y="745"/>
-              </children>
-              <children xmi:id="_HGB1YOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_HGB1Y-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGB1ZOfXEduqHoOJbURZRw" width="3589" height="990"/>
-                </children>
-                <children xmi:id="_HGB1ZefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGB1ZufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGB1Z-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGB1aOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1aefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGB1aufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1a-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGB1bOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1befXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGB1bufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGB1b-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGB1YefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1YufXEduqHoOJbURZRw" x="745" y="880"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GtcWF-fXEduqHoOJbURZRw"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HF4rYOfXEduqHoOJbURZRw" element="_3ADC7B74022D427962D3003F" source="_HF4rQOfXEduqHoOJbURZRw" target="_HF4rUOfXEduqHoOJbURZRw">
-                <children xmi:id="_HF4rY-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HF4rZefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HF4rZufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4rZOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HF4rZ-fXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HF4raefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4raOfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HF4raufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HF4rbOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4ra-fXEduqHoOJbURZRw" x="41" y="-348"/>
-                </children>
-                <children xmi:id="_HF4rbefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HF4rb-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rbufXEduqHoOJbURZRw" x="460" y="279"/>
-                </children>
-                <children xmi:id="_HF4rcOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HF4rcufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rcefXEduqHoOJbURZRw" x="-81" y="-288"/>
-                </children>
-                <children xmi:id="_HF4rc-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HF4rdefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rdufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rdOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HF4rd-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HF4reefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4reufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4reOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HF4re-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HF4rfefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rfufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rfOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HF4rf-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HF4rgefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rgufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rgOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HF4rYefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HF4rYufXEduqHoOJbURZRw" points="[762, -67, -10617, -16]$[10617, -67, -762, -16]"/>
-              </edges>
-              <edges xmi:id="_HF4rs-fXEduqHoOJbURZRw" element="_3ADC7B74022D421E4E3B0319" source="_HF4ro-fXEduqHoOJbURZRw" target="_HF4ro-fXEduqHoOJbURZRw">
-                <children xmi:id="_HF4rtufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HF4ruOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HF4ruefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HF4rt-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HF4ruufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HF4rvOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4ru-fXEduqHoOJbURZRw" x="-462" y="254"/>
-                </children>
-                <children xmi:id="_HF4rvefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HF4rv-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rvufXEduqHoOJbURZRw" x="-360" y="-339"/>
-                </children>
-                <children xmi:id="_HF4rwOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HF4rwufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rwefXEduqHoOJbURZRw" x="-212" y="458"/>
-                </children>
-                <children xmi:id="_HF4rw-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HF4rxefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rxOfXEduqHoOJbURZRw" x="476" y="-331"/>
-                </children>
-                <children xmi:id="_HF4rxufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HF4ryOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4ryefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rx-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HF4ryufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HF4rzOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4rzefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4ry-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HF4rzufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HF4r0OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4r0efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4rz-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HF4r0ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HF4r1OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HF4r1efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HF4r0-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HF4rtOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HF4rtefXEduqHoOJbURZRw" points="[1397, 169, 1397, 169]$[2573, 169, 2573, 169]$[2573, 1481, 2573, 1481]$[541, 1481, 541, 1481]$[541, 524, 541, 524]"/>
-              </edges>
-              <edges xmi:id="_HGB1PefXEduqHoOJbURZRw" element="_3ADC7B74022D421E4DAC01A0" source="_HF4r1ufXEduqHoOJbURZRw" target="_HF4ro-fXEduqHoOJbURZRw">
-                <children xmi:id="_HGB1QOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGB1QufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGB1Q-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1QefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGB1ROfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HGB1RufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1RefXEduqHoOJbURZRw" x="400" y="-195"/>
-                </children>
-                <children xmi:id="_HGB1R-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HGB1SefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1SOfXEduqHoOJbURZRw" x="-125" y="-348"/>
-                </children>
-                <children xmi:id="_HGB1SufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HGB1TOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1S-fXEduqHoOJbURZRw" x="-2" y="-144"/>
-                </children>
-                <children xmi:id="_HGB1TefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HGB1T-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1TufXEduqHoOJbURZRw" x="-625" y="223"/>
-                </children>
-                <children xmi:id="_HGB1UOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HGB1UufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1U-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1UefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGB1VOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HGB1VufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1V-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1VefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGB1WOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HGB1WufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1W-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1WefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGB1XOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HGB1XufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1X-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1XefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGB1PufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGB1P-fXEduqHoOJbURZRw" points="[1905, 106, -3149, 106]$[4128, 106, -926, 106]"/>
-              </edges>
-              <edges xmi:id="_HGB1cOfXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC6002BD" source="_HF4r1ufXEduqHoOJbURZRw" target="_HGB1YOfXEduqHoOJbURZRw">
-                <children xmi:id="_HGB1c-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGB1defXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGB1dufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1dOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGB1d-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HGB1eefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1eOfXEduqHoOJbURZRw" x="205" y="194"/>
-                </children>
-                <children xmi:id="_HGB1eufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HGB1fOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1e-fXEduqHoOJbURZRw" x="772" y="-246"/>
-                </children>
-                <children xmi:id="_HGB1fefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HGB1f-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1fufXEduqHoOJbURZRw" x="-161" y="194"/>
-                </children>
-                <children xmi:id="_HGB1gOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HGB1gufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1gefXEduqHoOJbURZRw" x="144" y="347"/>
-                </children>
-                <children xmi:id="_HGB1g-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HGB1hefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1hufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1hOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGB1h-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HGB1iefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1iufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1iOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGB1i-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HGB1jefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1jufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1jOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGB1j-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HGB1kefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGB1kufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGB1kOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGB1cefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGB1cufXEduqHoOJbURZRw" points="[-1701, 50, 4902, -50]$[-4809, 50, 1794, -50]"/>
-              </edges>
-              <edges xmi:id="_HGB1k-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C92032F" source="_HF4rQOfXEduqHoOJbURZRw" target="_HF4rg-fXEduqHoOJbURZRw">
-                <children xmi:id="_HGB1lufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGB1mOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGB1mefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1l-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGB1lOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGB1lefXEduqHoOJbURZRw" points="[-25, -491, -25, 1693]$[-25, -1659, -25, 524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1mufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1m-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HGB1nOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A831800B8" source="_HF4rQOfXEduqHoOJbURZRw" target="_HF4rk-fXEduqHoOJbURZRw">
-                <children xmi:id="_HGB1n-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGB1oefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGB1oufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1oOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGB1nefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGB1nufXEduqHoOJbURZRw" points="[762, 186, -5130, -1337]$[4555, 1168, -1337, -355]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1o-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1pOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HGB1pefXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC4A0306" source="_HF4rg-fXEduqHoOJbURZRw" target="_HGB1YOfXEduqHoOJbURZRw">
-                <children xmi:id="_HGB1qOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGB1qufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGB1q-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1qefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGB1pufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGB1p-fXEduqHoOJbURZRw" points="[25, -524, 76, 1608]$[25, -1642, 76, 491]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1rOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1refXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HGB1rufXEduqHoOJbURZRw" element="_3ADC7B74022D4279830E0150" source="_HF4rUOfXEduqHoOJbURZRw" target="_HF4ro-fXEduqHoOJbURZRw">
-                <children xmi:id="_HGB1sefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGB1s-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGB1tOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1sufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGB1r-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGB1sOfXEduqHoOJbURZRw" points="[211, -482, -702, 3886]$[211, -3843, -702, 524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1tefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1tufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HGB1t-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A832300FE" source="_HF4rUOfXEduqHoOJbURZRw" target="_HF4rk-fXEduqHoOJbURZRw">
-                <children xmi:id="_HGB1uufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGB1vOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGB1vefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGB1u-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGB1uOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGB1uefXEduqHoOJbURZRw" points="[-770, 203, 4715, -1371]$[-4157, 1176, 1329, -397]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1vufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGB1v-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D427A854D02BF" type="Class" name="WorkDefinition">
-              <children xmi:id="_HGLmMOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A857B0333">
-                <children xmi:id="_HGLmM-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGLmNOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HGLmNefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGLmNufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGLmN-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGLmOOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGLmOefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGLmOufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGLmO-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGLmPOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGLmPefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGLmPufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGLmP-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGLmMefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGLmMufXEduqHoOJbURZRw" x="10972" y="948" width="2853" height="2269"/>
-              </children>
-              <children xmi:id="_HGLmQOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_HGLmQ-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGLmROfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HGLmRefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGLmRufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGLmR-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGLmSOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGLmSefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGLmSufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGLmS-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGLmTOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGLmTefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGLmTufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGLmT-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGLmQefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGLmQufXEduqHoOJbURZRw" x="2841" y="897" width="3364" height="2269"/>
-              </children>
-              <children xmi:id="_HGehY-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E029E">
-                <children xmi:id="_HGehZufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGehZ-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HGehaOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGehaefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGehaufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGeha-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehbOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGehbefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehbufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGehb-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehcOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGehcefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGehcufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGehZOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGehZefXEduqHoOJbURZRw" x="1902" y="4755"/>
-              </children>
-              <children xmi:id="_HGehfOfXEduqHoOJbURZRw" element="_3ADC7B74022D42794A660368">
-                <children xmi:id="_HGehf-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGehgOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HGehgefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGoSIOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGoSIefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGoSIufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSI-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGoSJOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSJefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGoSJufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSJ-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGoSKOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGoSKefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGehfefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGehfufXEduqHoOJbURZRw" x="5706" y="4755"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GtmHEefXEduqHoOJbURZRw"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HGLmUOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A87E90061" source="_HGLmQOfXEduqHoOJbURZRw" target="_HGLmMOfXEduqHoOJbURZRw">
-                <children xmi:id="_HGehIOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGehIufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGehI-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGehIefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGehJOfXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_HGehJufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehJefXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HGehJ-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_HGehKefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehKOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HGehKufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_HGehLOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehK-fXEduqHoOJbURZRw" x="157" y="270"/>
-                </children>
-                <children xmi:id="_HGehLefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_HGehL-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehLufXEduqHoOJbURZRw" x="-826" y="-255"/>
-                </children>
-                <children xmi:id="_HGehMOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_HGehMufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehM-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehMefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGehNOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_HGehNufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehN-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehNefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGehOOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A87E902D9">
-                  <children xmi:id="_HGehOufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehO-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehOefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGehPOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A87E902CF">
-                  <children xmi:id="_HGehPufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehP-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehPefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGLmUefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGLmUufXEduqHoOJbURZRw" points="[1430, -575, -6189, -626]$[6197, -575, -1422, -626]"/>
-              </edges>
-              <edges xmi:id="_HGehQOfXEduqHoOJbURZRw" element="_3ADC7B74022D427A88340110" source="_HGLmQOfXEduqHoOJbURZRw" target="_HGLmMOfXEduqHoOJbURZRw">
-                <children xmi:id="_HGehQ-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGehRefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGehRufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGehROfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGehR-fXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_HGehSefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehSOfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HGehSufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_HGehTOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehS-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HGehTefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_HGehT-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehTufXEduqHoOJbURZRw" x="182" y="304"/>
-                </children>
-                <children xmi:id="_HGehUOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_HGehUufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehUefXEduqHoOJbURZRw" x="-876" y="-221"/>
-                </children>
-                <children xmi:id="_HGehU-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_HGehVefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehVufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehVOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGehV-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_HGehWefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehWufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehWOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGehW-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427A883402E8">
-                  <children xmi:id="_HGehXefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehXufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehXOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGehX-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427A883402DE">
-                  <children xmi:id="_HGehYefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGehYufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGehYOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGehQefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGehQufXEduqHoOJbURZRw" points="[1667, 609, -6191, 556]$[6429, 609, -1429, 556]"/>
-              </edges>
-              <edges xmi:id="_HGehc-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A831800B8" source="_HGehY-fXEduqHoOJbURZRw" target="_HGLmQOfXEduqHoOJbURZRw">
-                <children xmi:id="_HGehdufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGeheOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGeheefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGehd-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGehdOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGehdefXEduqHoOJbURZRw" points="[262, -457, -1921, 3251]$[1507, -2573, -677, 1134]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGeheufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGehe-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HGoSKufXEduqHoOJbURZRw" element="_3ADC7B74022D427962D3003F" source="_HGehY-fXEduqHoOJbURZRw" target="_HGehfOfXEduqHoOJbURZRw">
-                <children xmi:id="_HGoSLefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGoSL-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGoSMOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGoSLufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGoSMefXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HGoSM-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSMufXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HGoSNOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HGoSNufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSNefXEduqHoOJbURZRw" x="463" y="-294"/>
-                </children>
-                <children xmi:id="_HGoSN-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HGoSOefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSOOfXEduqHoOJbURZRw" x="-210" y="256"/>
-                </children>
-                <children xmi:id="_HGoSOufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HGoSPOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSO-fXEduqHoOJbURZRw" x="-577" y="-285"/>
-                </children>
-                <children xmi:id="_HGoSPefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HGoSP-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSQOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSPufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGoSQefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HGoSQ-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSROfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSQufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGoSRefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D427962D4020E">
-                  <children xmi:id="_HGoSR-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSSOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSRufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGoSSefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D427962D40203">
-                  <children xmi:id="_HGoSS-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSTOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSSufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGoSK-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGoSLOfXEduqHoOJbURZRw" points="[661, 53, -3175, 53]$[3122, 53, -714, 53]"/>
-              </edges>
-              <edges xmi:id="_HGoSTefXEduqHoOJbURZRw" element="_3ADC7B74022D427A832300FE" source="_HGehfOfXEduqHoOJbURZRw" target="_HGLmQOfXEduqHoOJbURZRw">
-                <children xmi:id="_HGoSUOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGoSUufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGoSU-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGoSUefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGoSTufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGoST-fXEduqHoOJbURZRw" points="[-262, -457, 1820, 3251]$[-1447, -2573, 635, 1134]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGoSVOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGoSVefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GsZ0TefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0294">
-            <body>02</body>
-          </ownedComment>
-          <packageMerge xmi:id="_Cr6fIOxdEduHje3pPahN4A" mergedPackage="_3ADC7B74022D40F36C5E0262"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0296" name="Role">
-            <ownedComment xmi:id="_GsZ0VOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0296">
-              <body>A Role is a content element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
-A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C920307" general="_3ADC7B74022D40F36C5E026C"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9300F8" name="modifies" visibility="public" type="_3ADC7B74022D40F36C5E02BC" isDerived="true" association="_3ADC7B74022D40F36C9300F5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs_qKOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs_qJ-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C93010C" name="responsibleFor" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D40F36C930109">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs_qMefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs_qMOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E029E" name="Task">
-            <ownedComment xmi:id="_Gsi-M-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E029E">
-              <body>A Task is a content element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
-A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
-A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
-For example, a Task such as &quot;Develop Use Case Model&quot; describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the &quot;method&quot; of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92032F" general="_3ADC7B74022D40F36C5E026C"/>
-            <generalization xmi:id="_3ADC7B74022D427A831800B8" general="_3ADC7B74022D427A82D3017F"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920309" name="performedBy" visibility="public" type="_3ADC7B74022D40F36C5E0296" association="_3ADC7B74022D40F36C920308">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs2gN-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs2gNufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9203A8" name="mandatoryInput" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D40F36C92039D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs2gQ-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs2gQufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C9203BE" name="output" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D40F36C9203BB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs2gTOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs2gS-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4117CF5D0357" name="additionallyPerformedBy" visibility="public" type="_3ADC7B74022D40F36C5E0296" association="_3ADC7B74022D4117CF5C01CC">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs_qOufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs_qOefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4177F84A025E" name="optionalInput" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D4177F8490131">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtJbNufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtJbNefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427962D40203" name="steps" visibility="public" type="_3ADC7B74022D42794A660368" isDerived="true" aggregation="composite" association="_3ADC7B74022D427962D3003F">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtTMI-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtTMIufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E02BC" name="WorkProduct" isAbstract="true">
-            <ownedComment xmi:id="_Gsi-OOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E02BC">
-              <body>Work Product is an abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
-A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C9203D9" general="_3ADC7B74022D40F36C5E026C"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E02DA" name="Guidance" isAbstract="true">
-            <ownedComment xmi:id="_Gsi-POfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E02DA">
-              <body>Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C93011D" general="_3ADC7B74022D40F36C5E026C"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E017F" name="Artifact">
-            <ownedComment xmi:id="_Gsi-QOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E017F">
-              <body>Artifact is a Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
-Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might &quot;own&quot; a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92000F" general="_3ADC7B74022D40F36C5E02BC"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920011" name="containerArtifact" visibility="public" type="_3ADC7B74022D40F36C5E017F" association="_3ADC7B74022D40F36C920010">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtJbJOfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtJbI-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920013" name="containedArtifacts" visibility="public" type="_3ADC7B74022D40F36C5E017F" aggregation="composite" association="_3ADC7B74022D40F36C920010">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtJbJ-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtJbJufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E0185" name="Deliverable">
-            <ownedComment xmi:id="_GssvM-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E0185">
-              <body>A deliverable is a Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. </body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92002C" general="_3ADC7B74022D40F36C5E02BC"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C920030" name="deliveredWorkProducts" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D40F36C92002D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtJbMOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtJbL-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E018F" name="Outcome">
-            <ownedComment xmi:id="_GssvN-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E018F">
-              <body>An outcome describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C92004A" general="_3ADC7B74022D40F36C5E02BC"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42794A660368" name="Step">
-            <ownedComment xmi:id="_GssvO-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D42794A660368">
-              <body>A Step is a Section and Work Definition that is used to organize Tasks into parts or subunits of work.  Steps inherit the subSections decomposition from Section and can therefore describe Sub-Steps nested into Steps.
-A Step describes a meaningful and consist part of the overall work described for a Task.  The collection of Steps defined for a Task represents all the work that should be done to achieve the overall development goal of the Task.  Not all steps are necessarily performed each time a Task is invoked in a Process (see Task Descriptor), so they can also be expressed in the form of alternate 'flows' of work.  Different ways of achieving the same development goal can then be 'assembled' by selecting different combinations of steps when applying the Task in a Process.  Typical kinds of steps a Task author should consider are: Thinking steps: where the individual roles understand the nature of the task, gathers and examines the input artifacts, and formulates the outcome. Performing steps: where the individual roles create or update some artifacts. Reviewing steps: where the individual roles inspects the results against some criteria.
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D4279830E0150" general="_3ADC7B74022D421E4CF301AE"/>
-            <generalization xmi:id="_3ADC7B74022D427A832300FE" general="_3ADC7B74022D427A82D3017F"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D427A82D3017F" name="WorkDefinition" isAbstract="true">
-            <ownedComment xmi:id="_GssvQOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A82D3017F">
-              <body>Work Definition is an abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
-Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).
-</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D427A82F3026E" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A87E902CF" name="precondition" visibility="public" type="_3ADC7B74022D427A857B0333" aggregation="composite" association="_3ADC7B74022D427A87E90061">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtTMKufXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtTMKefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D427A883402DE" name="postcondition" visibility="public" type="_3ADC7B74022D427A857B0333" aggregation="composite" association="_3ADC7B74022D427A88340110">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtTMMefXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtTMMOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C920308" name="Default_PrimaryPerformer" memberEnd="_3ADC7B74022D40F36C920309 _3ADC7B74022D40F36C92030B">
-            <ownedComment xmi:id="_Gs2gM-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C920308">
-              <body>Roles can be defined to perform many Tasks, but every Task may have only one Role that is by default the primary performer of this Task.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C92030B" name="performs" visibility="public" type="_3ADC7B74022D40F36C5E029E" association="_3ADC7B74022D40F36C920308">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs2gOufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs2gOefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C92039D" name="Default_MandatoryInputs" memberEnd="_3ADC7B74022D40F36C92039E _3ADC7B74022D40F36C9203A8">
-            <ownedComment xmi:id="_Gs2gPOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C92039D">
-              <body>This association provides links to zero or many definitions of Work Products that are defined as mandatory inputs for performing this Task.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C92039E" name="mandatoryInputTo" visibility="public" type="_3ADC7B74022D40F36C5E029E" association="_3ADC7B74022D40F36C92039D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs2gQOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs2gP-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C9203BB" name="Default_Outputs" memberEnd="_3ADC7B74022D40F36C9203BC _3ADC7B74022D40F36C9203BE">
-            <ownedComment xmi:id="_Gs2gRefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C9203BB">
-              <body>This association provides links to zero or many definitions of Work Products that are defined as outputs of this Task.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C9203BC" name="outputFrom" visibility="public" type="_3ADC7B74022D40F36C5E029E" association="_3ADC7B74022D40F36C9203BB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs2gSefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs2gSOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C9300F5" name="Default_Modifies" memberEnd="_3ADC7B74022D40F36C9300F6 _3ADC7B74022D40F36C9300F8" isDerived="true">
-            <ownedComment xmi:id="_Gs_qIefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C9300F5">
-              <body>This association is derived from the fact that Roles perform Tasks that have Work Products of that particular type as outputs.  /modifies provides all the types of Work Products that the Role produces or modifies via one of the Tasks defined to be performed by the Role, either as primary or additional performer.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C9300F6" name="modifiedBy" visibility="public" type="_3ADC7B74022D40F36C5E0296" isDerived="true" association="_3ADC7B74022D40F36C9300F5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs_qJefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs_qJOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C930109" name="Default_Responsible" memberEnd="_3ADC7B74022D40F36C93010A _3ADC7B74022D40F36C93010C">
-            <ownedComment xmi:id="_Gs_qKufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C930109">
-              <body>Responsibility for a work product indicates the role's ownership of all instances of this work product type.  For example, the role responsible for a work product answers to management about its quality state.  Being responsible for the work product does not mean that the role is the only one modifying it, but makes ultimate decisions about accepting or rejecting these modifications when reviewing these modifications.  Every work product has none or one role responsible role. </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C93010A" name="responsibleRole" visibility="public" type="_3ADC7B74022D40F36C5E0296" association="_3ADC7B74022D40F36C930109">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs_qLufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs_qLefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4117CF5C01CC" name="Default_AdditionalPerformer" memberEnd="_3ADC7B74022D4117CF5D02FD _3ADC7B74022D4117CF5D0357">
-            <ownedComment xmi:id="_Gs_qM-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4117CF5C01CC">
-              <body>This association defines additional roles that by default can be assigned to help completing a Task.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4117CF5D02FD" name="helpsPerforming" visibility="public" type="_3ADC7B74022D40F36C5E029E" association="_3ADC7B74022D4117CF5C01CC">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gs_qN-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gs_qNufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C920010" name="Composition" memberEnd="_3ADC7B74022D40F36C920011 _3ADC7B74022D40F36C920013">
-            <ownedComment xmi:id="_GtJbIOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C920010">
-              <body>Artifact types can be defined to be physically composed of other artifacts.  For example, a use case model is composed of use cases and actors.</body>
-            </ownedComment>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C92002D" name="DefaultDeliveredWP" memberEnd="_3ADC7B74022D40F36C92002E _3ADC7B74022D40F36C920030">
-            <ownedComment xmi:id="_GtJbKefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C92002D">
-              <body>This association defines the default parts of a deliverable, i.e. the types of work products a Deliverable comprises of.  This aggregation can be overridden in a Process.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C92002E" name="_deliverable" visibility="private" type="_3ADC7B74022D40F36C5E0185" isUnique="false" association="_3ADC7B74022D40F36C92002D">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtJbLefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtJbLOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4177F8490131" name="Default_OptionalInputs" memberEnd="_3ADC7B74022D4177F84A025E _3ADC7B74022D4177F84A0272">
-            <ownedComment xmi:id="_GtJbMufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4177F8490131">
-              <body>This association provides links to zero or many definitions of Work Products that are defined as optional inputs for performing this Task.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4177F84A0272" name="optionalInputTo" visibility="public" type="_3ADC7B74022D40F36C5E029E" association="_3ADC7B74022D4177F8490131">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtJbOefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtJbOOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427962D3003F" memberEnd="_3ADC7B74022D427962D40203 _3ADC7B74022D427962D4020E" isDerived="true">
-            <ownedComment xmi:id="_GtJbO-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427962D3003F">
-              <body>This derived association is a shortcut for navigation along the association properties ContentElement.presentation.sections.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427962D4020E" name="_task" visibility="public" type="_3ADC7B74022D40F36C5E029E" isUnique="false" association="_3ADC7B74022D427962D3003F"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A87E90061" memberEnd="_3ADC7B74022D427A87E902CF _3ADC7B74022D427A87E902D9">
-            <ownedComment xmi:id="_GtTMJufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A87E90061">
-              <body>This composition association adds an optional pre-condition to a Work Definition.  A pre-condition defines any kind of constraint that must evaluate to true before the work described for the Work Definition can start. For example, a pre-condition for a Task could define that an input Work Product needs to be in a specific state or that other related work must be in a certain state (e.g. 'Input document X has been reviewed and signed by customer AND Task &quot;Management Review&quot; is complete') before the Task can begin.
-</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A87E902D9" name="_workDefinition" visibility="public" type="_3ADC7B74022D427A82D3017F" isUnique="false" association="_3ADC7B74022D427A87E90061"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D427A88340110" memberEnd="_3ADC7B74022D427A883402DE _3ADC7B74022D427A883402E8">
-            <ownedComment xmi:id="_GtTMLefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D427A88340110">
-              <body>This composition association adds an optional post-condition to a Work Definition.  A post-condition defines any kind of constraint that must evaluate to true before the work described for the Work Definition can be declared completed or finished and which other Work Definitions might depend upon (e.g. for their pre-conditions).  For example, a post-condition for a Task could define that a work product defined to be the output must be in a specific state before the Task can end (e.g. 'Use Case must be in state fully described and reviewed by System Analyst').</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D427A883402E8" name="_workDefinition" visibility="public" type="_3ADC7B74022D427A82D3017F" isUnique="false" association="_3ADC7B74022D427A88340110"/>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41DE478E000D" name="MethodPackage">
-          <eAnnotations xmi:id="_Gt5CB-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41E099B80009">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41E099B80009" type="Class" name="Structure">
-              <children xmi:id="_HGoSVufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E013F">
-                <children xmi:id="_HGoSWefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGoSWufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HGoSW-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGoSXOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGoSXefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGoSXufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSX-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGoSYOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSYefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGoSYufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSY-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGoSZOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGoSZefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGoSV-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGoSWOfXEduqHoOJbURZRw" x="643" y="1718" width="4715" height="2963"/>
-              </children>
-              <children xmi:id="_HGxcNefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E012B">
-                <children xmi:id="_HGxcOOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGxcOefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HGxcOufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGxcO-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGxcPOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGxcPefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcPufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGxcP-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcQOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGxcQefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcQufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGxcQ-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGxcROfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGxcNufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGxcN-fXEduqHoOJbURZRw" x="915" y="7442" width="3596" height="2431"/>
-              </children>
-              <children xmi:id="_HGxcTufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E026C">
-                <children xmi:id="_HGxcUefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGxcUufXEduqHoOJbURZRw" width="3352" height="1032"/>
-                </children>
-                <children xmi:id="_HGxcU-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HGxcVOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HGxcVefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HGxcVufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcV-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGxcWOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcWefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGxcWufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcW-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HGxcXOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HGxcXefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGxcT-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGxcUOfXEduqHoOJbURZRw" x="7975" y="7850"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gt5CCefXEduqHoOJbURZRw" description="Method Package is defined as an abstract class.  Its specialization, Content Package, defines the redefinition of the UML package to contain only Content Elements.  Method Packages can be defined as global (i.e. any element in any other package can access its contents).  They can be nested as well as define dependencies to other packages (via the reusedPackages association)."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HGoSZufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C610049" source="_HGoSVufXEduqHoOJbURZRw" target="_HGoSVufXEduqHoOJbURZRw">
-                <children xmi:id="_HGoSaefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGoSa-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGoSbOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGoSaufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGoSbefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_HGoSb-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSbufXEduqHoOJbURZRw" x="1155" y="-311"/>
-                </children>
-                <children xmi:id="_HGoScOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_HGoScufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoScefXEduqHoOJbURZRw" x="-648" y="-323"/>
-                </children>
-                <children xmi:id="_HGoSc-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_HGoSdefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSdOfXEduqHoOJbURZRw" x="-1472" y="212"/>
-                </children>
-                <children xmi:id="_HGoSdufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_HGoSeOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSd-fXEduqHoOJbURZRw" x="-314" y="-398"/>
-                </children>
-                <children xmi:id="_HGoSeefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_HGoSe-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSfOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSeufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGoSfefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_HGoSf-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoSgOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSfufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGoSgefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C61004C">
-                  <children xmi:id="_HGoSg-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGoShOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoSgufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGoShefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C61004A">
-                  <children xmi:id="_HGxcEOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcEefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGoShufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGoSZ-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGoSaOfXEduqHoOJbURZRw" points="[2353, -567, 2353, -567]$[6214, -567, 6214, -567]$[6214, -2328, 6214, -2328]$[1312, -2328, 1312, -2328]$[1312, -1481, 1312, -1481]"/>
-              </edges>
-              <edges xmi:id="_HGxcEufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C610035" source="_HGoSVufXEduqHoOJbURZRw" target="_HGoSVufXEduqHoOJbURZRw">
-                <children xmi:id="_HGxcFefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGxcF-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGxcGOfXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGxcFufXEduqHoOJbURZRw" x="297" y="1503"/>
-                </children>
-                <children xmi:id="_HGxcGefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_HGxcG-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcGufXEduqHoOJbURZRw" x="697" y="627"/>
-                </children>
-                <children xmi:id="_HGxcHOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_HGxcHufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcHefXEduqHoOJbURZRw" x="-725" y="356"/>
-                </children>
-                <children xmi:id="_HGxcH-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_HGxcIefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcIOfXEduqHoOJbURZRw" x="-917" y="280"/>
-                </children>
-                <children xmi:id="_HGxcIufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_HGxcJOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcI-fXEduqHoOJbURZRw" x="140" y="1388"/>
-                </children>
-                <children xmi:id="_HGxcJefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_HGxcJ-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcKOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcJufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGxcKefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_HGxcK-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcLOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcKufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGxcLefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C610038">
-                  <children xmi:id="_HGxcL-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcMOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcLufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGxcMefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C610036">
-                  <children xmi:id="_HGxcM-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcNOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcMufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGxcE-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGxcFOfXEduqHoOJbURZRw" points="[2353, 609, 2353, 609]$[6180, 609, 6180, 609]$[6180, 2802, 6180, 2802]$[1473, 2802, 1473, 2802]$[1473, 1481, 1473, 1481]"/>
-              </edges>
-              <edges xmi:id="_HGxcRefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6003AF" source="_HGxcNefXEduqHoOJbURZRw" target="_HGoSVufXEduqHoOJbURZRw">
-                <children xmi:id="_HGxcSOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGxcSufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGxcS-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGxcSefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGxcRufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGxcR-fXEduqHoOJbURZRw" points="[-143, -1397, -245, 4241]$[-143, -4157, -245, 1481]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGxcTOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HGxcTefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HGxcXufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0C011000B" source="_HGxcNefXEduqHoOJbURZRw" target="_HGxcTufXEduqHoOJbURZRw">
-                <children xmi:id="_HGxcYefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HGxcY-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HGxcZOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGxcYufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGxcZefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41E0C011000D">
-                  <children xmi:id="_HGxcZ-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcZufXEduqHoOJbURZRw" x="228" y="323"/>
-                </children>
-                <children xmi:id="_HGxcaOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41E0C011000D">
-                  <children xmi:id="_HGxcaufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcaefXEduqHoOJbURZRw" x="-166" y="-348"/>
-                </children>
-                <children xmi:id="_HGxca-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41E0C011000C">
-                  <children xmi:id="_HGxcbefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcbOfXEduqHoOJbURZRw" x="-8" y="297"/>
-                </children>
-                <children xmi:id="_HGxcbufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41E0C011000C">
-                  <children xmi:id="_HGxccOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcb-fXEduqHoOJbURZRw" x="-951" y="-255"/>
-                </children>
-                <children xmi:id="_HGxccefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41E0C011000D">
-                  <children xmi:id="_HGxcc-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcdOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxccufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGxcdefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41E0C011000C">
-                  <children xmi:id="_HGxcd-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxceOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcdufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HGxceefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41E0C011000D">
-                  <children xmi:id="_HGxce-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcfOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxceufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HGxcfefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41E0C011000C">
-                  <children xmi:id="_HGxcf-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HGxcgOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HGxcfufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HGxcX-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HGxcYOfXEduqHoOJbURZRw" points="[1608, -135, -5147, -33]$[5080, -135, -1676, -33]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D42360E720037" type="Class" name="Taxonomy">
-              <children xmi:id="_HGxcgefXEduqHoOJbURZRw" type="Note">
-                <children xmi:id="_HGxchOfXEduqHoOJbURZRw" type="DiagramName">
-                  <element xsi:nil="true"/>
-                </children>
-                <children xmi:id="_HGxchefXEduqHoOJbURZRw" type="Description">
-                  <element xsi:nil="true"/>
-                </children>
-                <styles xmi:type="notation:ShapeStyle" xmi:id="_HGxcgufXEduqHoOJbURZRw" description="UML2 Infrastructure" lineColor="4194368"/>
-                <element xsi:nil="true"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGxcg-fXEduqHoOJbURZRw" x="2015" y="601" width="7044" height="8144"/>
-              </children>
-              <children xmi:id="_HGxchufXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE06202D5">
-                <children xmi:id="_HGxciefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HGxciufXEduqHoOJbURZRw" width="2827" height="1540"/>
-                </children>
-                <children xmi:id="_HG7NEOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HG7NEefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HG7NEufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HG7NE-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NFOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NFefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NFufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NF-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NGOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NGefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HG7NGufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HGxch-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HGxciOfXEduqHoOJbURZRw" x="3361" y="1363"/>
-              </children>
-              <children xmi:id="_HG7NG-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFA3602C1">
-                <children xmi:id="_HG7NHufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HG7NH-fXEduqHoOJbURZRw" width="2573" height="1049"/>
-                </children>
-                <children xmi:id="_HG7NIOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HG7NIefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HG7NIufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HG7NI-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NJOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NJefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NJufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NJ-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NKOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NKefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HG7NKufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HG7NHOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NHefXEduqHoOJbURZRw" x="5594" y="6118"/>
-              </children>
-              <children xmi:id="_HG7NK-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDE83301A5">
-                <children xmi:id="_HG7NLufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HG7NL-fXEduqHoOJbURZRw" width="4368" height="1032"/>
-                </children>
-                <children xmi:id="_HG7NMOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HG7NMefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HG7NMufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HG7NM-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NNOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NNefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NNufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NN-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NOOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NOefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HG7NOufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HG7NLOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NLefXEduqHoOJbURZRw" x="2692" y="4360"/>
-              </children>
-              <children xmi:id="_HG7NO-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_HG7NPufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HG7NP-fXEduqHoOJbURZRw" width="3302" height="1049"/>
-                </children>
-                <children xmi:id="_HG7NQOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HG7NQefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HG7NQufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HG7NQ-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NROfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NRefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NRufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NR-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NSOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NSefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HG7NSufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HG7NPOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NPefXEduqHoOJbURZRw" x="2159" y="9228"/>
-              </children>
-              <children xmi:id="_HG7NZufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E013F">
-                <children xmi:id="_HG7NaefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HG7NaufXEduqHoOJbURZRw" width="3522" height="905"/>
-                </children>
-                <children xmi:id="_HG7Na-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HG7NbOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HG7NbefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HG7NbufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7Nb-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NcOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NcefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NcufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7Nc-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NdOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HG7NdefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HG7NZ-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NaOfXEduqHoOJbURZRw" x="3979" y="11540"/>
-              </children>
-              <children xmi:id="_HG7NiOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E012B">
-                <children xmi:id="_HG7Ni-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HG7NjOfXEduqHoOJbURZRw" width="3454" height="905"/>
-                </children>
-                <children xmi:id="_HG7NjefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HG7NjufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HG7Nj-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HG7NkOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NkefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NkufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7Nk-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NlOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HG7NlefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HG7NlufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HG7Nl-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HG7NiefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NiufXEduqHoOJbURZRw" x="4013" y="13470"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gt5CC-fXEduqHoOJbURZRw" description="The Method Package package defines how the method elements can be physically organized in package hierarchies.  It reused the package concept from the UML 2.0 Infrastructure Library, but redefines it to restrict Content Packages to only contain Content Elements and not any Packageable Elements (TBD: update diagram with {redefines} constraint!). The diagram shows the overall taxonomy is which Method Package is defined as an abstract class. "/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HG7NS-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFBCF02A9" source="_HG7NG-fXEduqHoOJbURZRw" target="_HG7NK-fXEduqHoOJbURZRw">
-                <children xmi:id="_HG7NTufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HG7NUOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HG7NUefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NT-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HG7NTOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HG7NTefXEduqHoOJbURZRw" points="[-979, -79, 979, 1958]$[-1985, -79, -27, 1958]$[-1985, -1719, -27, 318]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NUufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NU-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HG7NVOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF8D40211" source="_HG7NK-fXEduqHoOJbURZRw" target="_HGxchufXEduqHoOJbURZRw">
-                <children xmi:id="_HG7NV-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HG7NWefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HG7NWufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NWOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HG7NVefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HG7NVufXEduqHoOJbURZRw" points="[-84, -516, 16, 2226]$[-84, -1972, 16, 770]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NW-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NXOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HG7NXefXEduqHoOJbURZRw" element="_3ADC7B74022D41EC334F0198" source="_HG7NO-fXEduqHoOJbURZRw" target="_HG7NK-fXEduqHoOJbURZRw">
-                <children xmi:id="_HG7NYOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HG7NYufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HG7NY-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NYefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HG7NXufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HG7NX-fXEduqHoOJbURZRw" points="[50, -524, -1016, 4351]$[50, -4360, -1016, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NZOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NZefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HG7NdufXEduqHoOJbURZRw" element="_3ADC7B74022D41E0CC0A01D7" source="_HG7NZufXEduqHoOJbURZRw" target="_HG7NG-fXEduqHoOJbURZRw">
-                <children xmi:id="_HG7NeefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HG7Ne-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HG7NfOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NeufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HG7Nd-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HG7NeOfXEduqHoOJbURZRw" points="[778, -448, -389, 4631]$[778, -4563, -389, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NfefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NfufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HG7Nf-fXEduqHoOJbURZRw" element="_3ADC7B74022D41FAD5F8038E" source="_HG7NZufXEduqHoOJbURZRw" target="_HG7NO-fXEduqHoOJbURZRw">
-                <children xmi:id="_HG7NgufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HG7NhOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HG7NhefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7Ng-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HG7NgOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HG7NgefXEduqHoOJbURZRw" points="[-1007, -448, 922, 1786]$[-1007, -1718, 922, 516]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NhufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7Nh-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HG7NmOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6003AF" source="_HG7NiOfXEduqHoOJbURZRw" target="_HG7NZufXEduqHoOJbURZRw">
-                <children xmi:id="_HG7Nm-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HG7NnefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HG7NnufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HG7NnOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HG7NmefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HG7NmufXEduqHoOJbURZRw" points="[0, -448, 0, 1481]$[0, -1481, 0, 448]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7Nn-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HG7NoOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GtmHE-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE478E000D">
-            <body>05</body>
-          </ownedComment>
-          <packageMerge xmi:id="_RKEDYOxgEduHje3pPahN4A" mergedPackage="_3ADC7B74022D41DE49EA01E2"/>
-          <packageMerge xmi:id="_RqGOUOxgEduHje3pPahN4A" mergedPackage="_3ADC7B74022D40F36C5E0225"/>
-          <packageMerge xmi:id="_SLVTIOxgEduHje3pPahN4A" mergedPackage="_3ADC7B74022D42DDE280025D"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E013F" name="MethodPackage" isAbstract="true">
-            <ownedComment xmi:id="_GtmHG-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E013F">
-              <body>A Method Package is an abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41E0CC0A01D7" general="_3ADC7B74022D41DDFA3602C1"/>
-            <generalization xmi:id="_3ADC7B74022D41FAD5F8038E" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D412FA854030E" name="global" visibility="public" type="_5GcYAOieEduQbuY6UwMSQg">
-              <ownedComment xmi:id="_GtmHIOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D412FA854030E">
-                <body>Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.</body>
-              </ownedComment>
-              <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_GtmHIufXEduqHoOJbURZRw" type="_5GcYAOieEduQbuY6UwMSQg">
-                <body>false</body>
-              </defaultValue>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C61004C" name="reusedPackages" visibility="public" type="_3ADC7B74022D40F36C5E013F" association="_3ADC7B74022D40F36C610049">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtvRE-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtvREufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C610038" name="childPackages" visibility="public" type="_3ADC7B74022D40F36C5E013F" aggregation="composite" association="_3ADC7B74022D40F36C610035">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gt5CBufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gt5CBefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5E012B" name="ContentPackage">
-            <ownedComment xmi:id="_GtmHJOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5E012B">
-              <body>A Content Package is special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C6003AF" general="_3ADC7B74022D40F36C5E013F"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D41E0C011000C" name="contentElements" visibility="public" type="_3ADC7B74022D40F36C5E026C" aggregation="composite" association="_3ADC7B74022D41E0C011000B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtvRB-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtvRBufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41E0C011000B" memberEnd="_3ADC7B74022D41E0C011000C _3ADC7B74022D41E0C011000D">
-            <ownedComment xmi:id="_GtvRA-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41E0C011000B">
-              <body>A Content Package contains Content Elements.  A Content Element instance can be part of only one package instance.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41E0C011000D" name="_contentPackage" visibility="public" type="_3ADC7B74022D40F36C5E012B" isUnique="false" association="_3ADC7B74022D41E0C011000B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtvRCufXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtvRCefXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C610049" memberEnd="_3ADC7B74022D40F36C61004A _3ADC7B74022D40F36C61004C">
-            <ownedComment xmi:id="_GtvRDOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C610049">
-              <body>This association describes a dependency between the two packages it connects.  The package at the usingPackage end depends on the package at the reusedPackage end.  For example, an element in the former package is using an element in the later in a relationship such as a Task is using a Work Products as an input.  Reflexive reusedPackage links (i.e. a package that depends on itself) are not allowed.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C61004A" name="usingPackages" visibility="public" type="_3ADC7B74022D40F36C5E013F" association="_3ADC7B74022D40F36C610049">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GtvREOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GtvRD-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C610035" name="PackageNesting" memberEnd="_3ADC7B74022D40F36C610036 _3ADC7B74022D40F36C610038">
-            <ownedComment xmi:id="_GtvRFefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C610035">
-              <body>Method Packages can be nested, i.e. a package can be part of another package.  Nested packages do not need to be of the same type, e.g. a Content Package can be defined inside a Process Package (define for the Process part of this model).</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C610036" name="_methodPackage" visibility="public" type="_3ADC7B74022D40F36C5E013F" isUnique="false" association="_3ADC7B74022D40F36C610035">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gt5CA-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gt5CAufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41DE49EA01E2" name="MethodCoreDescriptions">
-          <eAnnotations xmi:id="_GuyZ4efXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41DE4AB40098">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41DE4AB40098" type="Class" name="Main">
-              <children xmi:id="_HHE-EOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE522101D2">
-                <children xmi:id="_HHE-E-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHE-FOfXEduqHoOJbURZRw" width="4758" height="2421"/>
-                </children>
-                <children xmi:id="_HHE-FefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHE-FufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHE-F-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHE-GOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-GefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-GufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-G-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-HOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-HefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-HufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHE-H-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHE-EefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHE-EufXEduqHoOJbURZRw" x="6460" y="16315"/>
-              </children>
-              <children xmi:id="_HHE-IOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE525C0137">
-                <children xmi:id="_HHE-I-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHE-JOfXEduqHoOJbURZRw" width="4402" height="1574"/>
-                </children>
-                <children xmi:id="_HHE-JefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHE-JufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHE-J-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHE-KOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-KefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-KufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-K-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-LOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-LefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-LufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHE-L-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHE-IefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHE-IufXEduqHoOJbURZRw" x="1862" y="16281"/>
-              </children>
-              <children xmi:id="_HHE-MOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DF36360109">
-                <children xmi:id="_HHE-M-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHE-NOfXEduqHoOJbURZRw" width="3928" height="3268"/>
-                </children>
-                <children xmi:id="_HHE-NefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHE-NufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHE-N-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHE-OOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-OefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-OufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-O-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-POfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-PefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-PufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHE-P-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHE-MefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHE-MufXEduqHoOJbURZRw" x="22165" y="12945"/>
-              </children>
-              <children xmi:id="_HHE-QOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE53190350">
-                <children xmi:id="_HHE-Q-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHE-ROfXEduqHoOJbURZRw" width="4995" height="1998"/>
-                </children>
-                <children xmi:id="_HHE-RefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHE-RufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHE-R-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHE-SOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-SefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-SufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-S-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-TOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-TefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-TufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHE-T-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHE-QefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHE-QufXEduqHoOJbURZRw" x="12285" y="12920"/>
-              </children>
-              <children xmi:id="_HHE-UOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE53510013">
-                <children xmi:id="_HHE-U-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHE-VOfXEduqHoOJbURZRw" width="3115" height="1574"/>
-                </children>
-                <children xmi:id="_HHE-VefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHE-VufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHE-V-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHE-WOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-WefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-WufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-W-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-XOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-XefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-XufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHE-X-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHE-UefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHE-UufXEduqHoOJbURZRw" x="8754" y="12928"/>
-              </children>
-              <children xmi:id="_HHE-YOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DF3620009A">
-                <children xmi:id="_HHE-Y-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHE-ZOfXEduqHoOJbURZRw" width="3606" height="1151"/>
-                </children>
-                <children xmi:id="_HHE-ZefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHE-ZufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHE-Z-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHE-aOfXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-aefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-aufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-a-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-bOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHE-befXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHE-bufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHE-b-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHE-YefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHE-YufXEduqHoOJbURZRw" x="17957" y="12937"/>
-              </children>
-              <children xmi:id="_HHE-cOfXEduqHoOJbURZRw" element="_3ADC7B74022D41DE536A00D8">
-                <children xmi:id="_HHE-c-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHE-dOfXEduqHoOJbURZRw" width="4876" height="2421"/>
-                </children>
-                <children xmi:id="_HHOIAOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHOIAefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHOIAufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHOIA-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIBOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIBefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIBufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIB-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOICOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOICefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHOICufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHE-cefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHE-cufXEduqHoOJbURZRw" x="3454" y="12911"/>
-              </children>
-              <children xmi:id="_HHOIC-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_HHOIDufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHOID-fXEduqHoOJbURZRw" width="2827" height="1049"/>
-                </children>
-                <children xmi:id="_HHOIEOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHOIEefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHOIEufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHOIE-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIFOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIFefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIFufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIF-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIGOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIGefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHOIGufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHOIDOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIDefXEduqHoOJbURZRw" x="13064" y="999"/>
-              </children>
-              <children xmi:id="_HHOIG-fXEduqHoOJbURZRw" element="_3ADC7B74022D42797F740392">
-                <children xmi:id="_HHOIHufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHOIH-fXEduqHoOJbURZRw" width="4555" height="1151"/>
-                </children>
-                <children xmi:id="_HHOIIOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHOIIefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHOIIufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHOII-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIJOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIJefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIJufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIJ-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIKOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIKefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHOIKufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHOIHOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIHefXEduqHoOJbURZRw" x="11946" y="8568"/>
-              </children>
-              <children xmi:id="_HHOIaufXEduqHoOJbURZRw" element="_3ADC7B74022D421E4CF301AE">
-                <children xmi:id="_HHOIbefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHOIbufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HHOIb-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHOIcOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHOIcefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHOIcufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIc-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIdOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIdefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIdufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOId-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIeOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHOIeefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHOIa-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIbOfXEduqHoOJbURZRw" x="19532" y="3513" width="5130" height="2218"/>
-              </children>
-              <children xmi:id="_HHOIpufXEduqHoOJbURZRw" element="_3ADC7B74022D41DE4A970123">
-                <children xmi:id="_HHOIqefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHOIqufXEduqHoOJbURZRw" width="4182" height="1540"/>
-                </children>
-                <children xmi:id="_HHOIq-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHOIrOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHOIrefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHOIrufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIr-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIsOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIsefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOIsufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIs-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHOItOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHOItefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHOIp-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIqOfXEduqHoOJbURZRw" x="12437" y="4004"/>
-              </children>
-              <children xmi:id="_HHX5MufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EB9000FC">
-                <children xmi:id="_HHX5NefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHX5NufXEduqHoOJbURZRw" width="4487" height="1540"/>
-                </children>
-                <children xmi:id="_HHX5N-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHX5OOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHX5OefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHX5OufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5O-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHX5POfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5PefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHX5PufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5P-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHX5QOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHX5QefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHX5M-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="12632256" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHX5NOfXEduqHoOJbURZRw" x="4715" y="4004"/>
-              </children>
-              <children xmi:id="_HHX5bufXEduqHoOJbURZRw" element="_3ADC7B74022D41FEDE4C0384">
-                <children xmi:id="_HHX5cefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHX5cufXEduqHoOJbURZRw" width="3589" height="1574"/>
-                </children>
-                <children xmi:id="_HHX5c-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHX5dOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHX5defXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHX5dufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5d-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHX5eOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5eefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHX5eufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5e-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHX5fOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHX5fefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHX5b-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHX5cOfXEduqHoOJbURZRw" x="5164" y="8305"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GuyZ4-fXEduqHoOJbURZRw" description="The Method Core Descriptions package defines the exact nature of textual descriptions that shall be maintained for Content Elements.  The declarations for these descriptions have been factored into this separate package, because every implementer of this meta-model might decide to define a different set of description attributes for their Content Elements.  However, only the description attributes defined in this package are the standardized set for IBM's Unified Method Architecture and are supported for method content interchange (i.e. import/export scenarios for different content sources)."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HHOIK-fXEduqHoOJbURZRw" element="_3ADC7B74022D41FAE0850383" source="_HHE-QOfXEduqHoOJbURZRw" target="_HHOIG-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHOILufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIMOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIMefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIL-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOILOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOILefXEduqHoOJbURZRw" points="[-203, -999, 355, 3776]$[-203, -4199, 355, 575]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIMufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIM-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOINOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FAE07503C7" source="_HHE-cOfXEduqHoOJbURZRw" target="_HHOIG-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHOIN-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIOefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIOufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIOOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOINefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOINufXEduqHoOJbURZRw" points="[0, -1219, -8331, 3759]$[8, -2895, -8322, 2082]$[6045, -4419, -2286, 558]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIO-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIPOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOIPefXEduqHoOJbURZRw" element="_3ADC7B74022D4279849E0001" source="_HHE-UOfXEduqHoOJbURZRw" target="_HHOIG-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHOIQOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIQufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIQ-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIQefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOIPufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOIP-fXEduqHoOJbURZRw" points="[0, -795, -3911, 3776]$[8, -1769, -3903, 2802]$[3073, -3996, -838, 575]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIROfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIRefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOIRufXEduqHoOJbURZRw" element="_3ADC7B74022D41FAE088013F" source="_HHE-YOfXEduqHoOJbURZRw" target="_HHOIG-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHOISefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIS-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOITOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOISufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOIR-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOISOfXEduqHoOJbURZRw" points="[-8, -584, 5528, 3784]$[-16, -1676, 5520, 2692]$[-4351, -3793, 1185, 575]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOITefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOITufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOIT-fXEduqHoOJbURZRw" element="_3ADC7B74022D41FAE07B01AC" source="_HHE-IOfXEduqHoOJbURZRw" target="_HHE-cOfXEduqHoOJbURZRw">
-                <children xmi:id="_HHOIUufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIVOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIVefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIU-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOIUOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOIUefXEduqHoOJbURZRw" points="[482, -795, -1346, 2150]$[1066, -1735, -762, 1210]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIVufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIV-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOIWOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FAE07D0364" source="_HHE-EOfXEduqHoOJbURZRw" target="_HHE-cOfXEduqHoOJbURZRw">
-                <children xmi:id="_HHOIW-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIXefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIXufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIXOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOIWefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOIWufXEduqHoOJbURZRw" points="[-1058, -1219, 1888, 2184]$[-1896, -2192, 1049, 1210]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIX-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIYOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOIYefXEduqHoOJbURZRw" element="_3ADC7B74022D41FAE08B00AA" source="_HHE-MOfXEduqHoOJbURZRw" target="_HHOIG-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHOIZOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIZufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIZ-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIZefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOIYufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOIY-fXEduqHoOJbURZRw" points="[-8, -1642, 9897, 3793]$[-16, -3801, 9889, 1634]$[-7628, -5063, 2277, 372]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIaOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIaefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOIeufXEduqHoOJbURZRw" element="_3ADC7B74022D421E4E3B0319" source="_HHOIaufXEduqHoOJbURZRw" target="_HHOIaufXEduqHoOJbURZRw">
-                <children xmi:id="_HHOIfefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIf-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIgOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIfufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHOIgefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HHOIg-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOIgufXEduqHoOJbURZRw" x="25" y="-166"/>
-                </children>
-                <children xmi:id="_HHOIhOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HHOIhufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOIhefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HHOIh-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HHOIiefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOIiOfXEduqHoOJbURZRw" x="282" y="362"/>
-                </children>
-                <children xmi:id="_HHOIiufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HHOIjOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOIi-fXEduqHoOJbURZRw" x="1621" y="408"/>
-                </children>
-                <children xmi:id="_HHOIjefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HHOIj-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIkOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOIjufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHOIkefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HHOIk-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOIlOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOIkufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHOIlefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E4E3D0364">
-                  <children xmi:id="_HHOIl-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOImOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOIlufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HHOImefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E4E3D0362">
-                  <children xmi:id="_HHOIm-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHOInOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHOImufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOIe-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOIfOfXEduqHoOJbURZRw" points="[2565, 592, 2565, 592]$[3149, 592, 3149, 592]$[3149, 1888, 3149, 1888]$[1193, 1888, 1193, 1888]$[1193, 1109, 1193, 1109]"/>
-              </edges>
-              <edges xmi:id="_HHOInefXEduqHoOJbURZRw" element="_3ADC7B74022D42795624017E" source="_HHOIaufXEduqHoOJbURZRw" target="_HHOIC-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHOIoOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHOIoufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHOIo-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHOIoefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOInufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOIn-fXEduqHoOJbURZRw" points="[-177, -1109, 7442, 1989]$[-177, -3149, 7442, -50]$[-6206, -3149, 1413, -50]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIpOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHOIpefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHOItufXEduqHoOJbURZRw" element="_3ADC7B74022D421E4DAC01A0" source="_HHOIpufXEduqHoOJbURZRw" target="_HHOIaufXEduqHoOJbURZRw">
-                <children xmi:id="_HHX5AOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHX5AufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHX5A-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHX5AefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHX5BOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HHX5BufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5BefXEduqHoOJbURZRw" x="249" y="271"/>
-                </children>
-                <children xmi:id="_HHX5B-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HHX5CefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5COfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HHX5CufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HHX5DOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5C-fXEduqHoOJbURZRw" x="-3" y="305"/>
-                </children>
-                <children xmi:id="_HHX5DefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HHX5D-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5DufXEduqHoOJbURZRw" x="-680" y="-220"/>
-                </children>
-                <children xmi:id="_HHX5EOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HHX5EufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5E-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5EefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHX5FOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HHX5FufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5F-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5FefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHX5GOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421E4DAD0057">
-                  <children xmi:id="_HHX5GufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5G-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5GefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HHX5HOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421E4DAD004D">
-                  <children xmi:id="_HHX5HufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5H-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5HefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHOIt-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHOIuOfXEduqHoOJbURZRw" points="[2091, 93, -5477, 245]$[5003, 93, -2565, 245]"/>
-              </edges>
-              <edges xmi:id="_HHX5IOfXEduqHoOJbURZRw" element="_3ADC7B74022D4200583B01E6" source="_HHOIpufXEduqHoOJbURZRw" target="_HHOIC-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHX5I-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHX5JefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHX5JufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHX5JOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHX5IefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHX5IufXEduqHoOJbURZRw" points="[-50, -770, 0, 2480]$[-50, -2726, 0, 524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHX5J-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHX5KOfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HHX5QufXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC6002BD" source="_HHOIpufXEduqHoOJbURZRw" target="_HHX5MufXEduqHoOJbURZRw">
-                <children xmi:id="_HHX5RefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHX5R-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHX5SOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHX5RufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHX5SefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HHX5S-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5SufXEduqHoOJbURZRw" x="108" y="229"/>
-                </children>
-                <children xmi:id="_HHX5TOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HHX5TufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5TefXEduqHoOJbURZRw" x="828" y="-263"/>
-                </children>
-                <children xmi:id="_HHX5T-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HHX5UefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5UOfXEduqHoOJbURZRw" x="-92" y="178"/>
-                </children>
-                <children xmi:id="_HHX5UufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HHX5VOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5U-fXEduqHoOJbURZRw" x="162" y="-355"/>
-                </children>
-                <children xmi:id="_HHX5VefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HHX5V-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5WOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5VufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHX5WefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HHX5W-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5XOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5WufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHX5XefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4294EC6002BF">
-                  <children xmi:id="_HHX5X-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5YOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5XufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HHX5YefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4294EC6002BE">
-                  <children xmi:id="_HHX5Y-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHX5ZOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHX5YufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHX5Q-fXEduqHoOJbURZRw" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHX5ROfXEduqHoOJbURZRw" points="[-2099, 0, 5469, 0]$[-5325, 0, 2243, 0]"/>
-              </edges>
-              <edges xmi:id="_HHX5ZefXEduqHoOJbURZRw" element="_3ADC7B74022D4294EC2B01CA" source="_HHX5MufXEduqHoOJbURZRw" target="_HHOIC-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHX5aOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHX5aufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHX5a-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHX5aefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHX5ZufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="12632256" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHX5Z-fXEduqHoOJbURZRw" points="[25, -770, -7493, 2480]$[25, -3251, -7493, 0]$[6104, -3251, -1413, 0]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHX5bOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HHX5befXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_Gt5CDefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41DE49EA01E2">
-            <body>06</body>
-          </ownedComment>
-          <packageMerge xmi:id="_VPIGMOxeEduHje3pPahN4A" mergedPackage="_3ADC7B74022D40F36C5E0190"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE522101D2" name="ArtifactDescription">
-            <generalization xmi:id="_3ADC7B74022D41FAE07D0364" general="_3ADC7B74022D41DE536A00D8"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F000A" name="briefOutline" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gt5CGOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F000A">
-                <body>Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GndVkeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GndVkOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_Gfj90OyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F000B" name="representationOptions" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuCzAefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F000B">
-                <body>Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_nsnYkeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_nsnYkOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_niVbMOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4611DB2F020D" name="representation" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_2EEw4eyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_2EEw4OyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_18LZIOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4611DB4D0248" name="notation" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_PBil8eyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_PBil8OyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_O4cUUOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE525C0137" name="DeliverableDescription">
-            <generalization xmi:id="_3ADC7B74022D41FAE07B01AC" general="_3ADC7B74022D41DE536A00D8"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0014" name="externalDescription" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuCzCOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0014">
-                <body>The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_6pr8AeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_6pr8AOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_6brVMOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F001E" name="packagingGuidance" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuCzC-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F001E">
-                <body>Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_euljEeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_euljEOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_ekwRoOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE53190350" name="RoleDescription">
-            <generalization xmi:id="_3ADC7B74022D41FAE0850383" general="_3ADC7B74022D42797F740392"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0078" name="skills" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuCzEOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0078">
-                <body>Lists of set of required skills a person needs to possess to fulfill that Role.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-OXRweyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-OXRwOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_-De3cOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0082" name="assignmentApproaches" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuCzE-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0082">
-                <body>Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ptXIUeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ptXIUOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_pl51cOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D414B377D0272" name="synonyms" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuL88ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D414B377D0272">
-                <body>Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_7qWu0eyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_7qWu0OyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_7g0YUOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE53510013" name="TaskDescription">
-            <generalization xmi:id="_3ADC7B74022D4279849E0001" general="_3ADC7B74022D42797F740392"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F008D" name="purpose" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuL89-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F008D">
-                <body>Summarizes the main reason for performing this Task and what is intended to be achieved.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_BG_zIeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_BG_zIOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_CKf3gOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0096" name="alternatives" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuL8-ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0096">
-                <body>Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_AAzfweyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_AAzfwOyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="__46IAOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DE536A00D8" name="WorkProductDescription">
-            <generalization xmi:id="_3ADC7B74022D41FAE07503C7" general="_3ADC7B74022D42797F740392"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F00B4" name="purpose" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuVt8ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F00B4">
-                <body>Describes why the work product is produced and to what use it will be put.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_akm18eyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_akm18OyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_acs3IOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F00BE" name="impactOfNotHaving" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuVt9efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F00BE">
-                <body>Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_bZ8igeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_bZ8igOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_bRme0OyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F00BF" name="reasonsForNotNeeding" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuVt-OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F00BF">
-                <body>Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_BAI10eyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_BAI10OyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_A378EOyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DF3620009A" name="GuidanceDescription">
-            <generalization xmi:id="_3ADC7B74022D41FAE088013F" general="_3ADC7B74022D42797F740392"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D41BE251800D2" name="attachments" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuVt_efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41BE251800D2">
-                <body>This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_78VkweyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_78VkwOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_71Lz4OyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41DF36360109" name="PracticeDescription">
-            <generalization xmi:id="_3ADC7B74022D41FAE08B00AA" general="_3ADC7B74022D42797F740392"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD4F060138" name="additionalInfo" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuVuAufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD4F060138">
-                <body>Any additional Information not covered by the other attributes.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GZsUcOyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GZjKgOyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_GS2FkOyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD4EF0027F" name="problem" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gufe8ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD4EF0027F">
-                <body>A description of the problem the Practice addresses.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_4W_1weyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_4W_1wOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_4OW3IOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD4EF80192" name="background" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gufe9efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD4EF80192">
-                <body>Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Cc-AMeyJEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Cc-AMOyJEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_CSPW4OyJEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD5D53011D" name="goals" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gufe-OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD5D53011D">
-                <body>A summary of the overall goals to be addressed by the Practice.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_0UUDceyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_0UUDcOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_0LYJ4OyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD4F010206" name="application" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Gufe--fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD4F010206">
-                <body>Describes how the Practice is being applied or introduced into the context described in background.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_80qT4eyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_80qT4OyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_8tzd8OyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40FD5D3E0325" name="levelsOfAdoption" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Guoo4OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40FD5D3E0325">
-                <body>Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_te4HkeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_te4HkOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_uEbEoOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41FEDE4C0384" name="DescribableElement" isAbstract="true">
-            <ownedComment xmi:id="_Guoo4-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41FEDE4C0384">
-              <body>This definition of Content Element extends the Content Element definition via package merge with references to icons that are used for presenting Content Elements in a UMA-based modeling environment as well as when publishing Content Elements into documentation presentation (e.g. document or html pages).</body>
-            </ownedComment>
-            <ownedAttribute xmi:id="_3ADC7B74022D41E495370343" name="shapeicon" visibility="public" type="_3ADC7B74022D4113EA2902FE">
-              <ownedComment xmi:id="_Guoo5-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41E495370343">
-                <body>A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_JZHrQeyPEduFKJovBL64XQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_JZHrQOyPEduFKJovBL64XQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_JOiL4OyPEduFKJovBL64XQ" type="_3ADC7B74022D4113EA2902FE" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41E4953C0319" name="nodeicon" visibility="public" type="_3ADC7B74022D4113EA2902FE">
-              <ownedComment xmi:id="_Guoo6ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41E4953C0319">
-                <body>A reference to an icon that can be used in tree browser presentations and breakdown structures.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Fj1bweyPEduFKJovBL64XQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Fj1bwOyPEduFKJovBL64XQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_GRlSkOyPEduFKJovBL64XQ" type="_3ADC7B74022D4113EA2902FE" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42797F740392" name="ContentDescription">
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F00AA" name="externalId" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GuL8_-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F00AA">
-                <body>An external visible number that is used to reference this artifact. Used like a synonym.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ho4UgeyHEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ho4UgOyHEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_hfV-AOyHEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4177E716037F" name="keyConsiderations" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_Guoo7-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4177E716037F">
-                <body>Key Considerations provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_1MMtseyIEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_1MMtsOyIEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_1DZ-EOyIEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D42DDE280025D" name="WorkProductStates">
-          <eAnnotations xmi:id="_GvFU-OfXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D42DDE9FE003A">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D42DDE9FE003A" type="Class" name="MethodLink">
-              <children xmi:id="_HHhqAOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_HHhqA-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHhqBOfXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_HHhqBefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHhqBufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHhqB-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHhqCOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqCefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqCufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqC-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqDOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqDefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqDufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHhqD-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHhqAefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHhqAufXEduqHoOJbURZRw" x="1902" y="5389"/>
-              </children>
-              <children xmi:id="_HHhqEOfXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEA050008">
-                <children xmi:id="_HHhqE-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHhqFOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HHhqFefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHhqFufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHhqF-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHhqGOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqGefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqGufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqG-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqHOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqHefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqHufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHhqH-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHhqEefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHhqEufXEduqHoOJbURZRw" x="3420" y="3382"/>
-              </children>
-              <children xmi:id="_HHhqQ-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_HHhqRufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHhqR-fXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_HHhqSOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHhqSefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHhqSufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHhqS-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqTOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqTefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqTufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqT-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqUOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqUefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHhqUufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHhqROfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHhqRefXEduqHoOJbURZRw" x="4197" y="1180"/>
-              </children>
-              <children xmi:id="_HHhqU-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEAC301A5">
-                <children xmi:id="_HHhqVufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHhqV-fXEduqHoOJbURZRw" width="1879" height="905"/>
-                </children>
-                <children xmi:id="_HHhqWOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHhqWefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHhqWufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHhqW-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqXOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqXefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqXufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqX-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqYOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHhqYefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHhqYufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHhqVOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHhqVefXEduqHoOJbURZRw" x="5207" y="3361"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GvFU-ufXEduqHoOJbURZRw"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HHhqIOfXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC2102D5" source="_HHhqEOfXEduqHoOJbURZRw" target="_HHhqAOfXEduqHoOJbURZRw">
-                <children xmi:id="_HHhqI-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHhqJefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHhqJufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHhqJOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHhqJ-fXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HHhqKefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqKOfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HHhqKufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HHhqLOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqK-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HHhqLefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HHhqL-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqLufXEduqHoOJbURZRw" x="-314" y="-391"/>
-                </children>
-                <children xmi:id="_HHhqMOfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HHhqMufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqMefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HHhqM-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HHhqNefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqNufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqNOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHhqN-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HHhqOefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqOufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqOOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHhqO-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HHhqPefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqPufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqPOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HHhqP-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HHhqQefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqQufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqQOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHhqIefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHhqIufXEduqHoOJbURZRw" points="[347, 448, -1278, -1634]$[1210, 1557, -414, -524]"/>
-              </edges>
-              <edges xmi:id="_HHhqY-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC25003C" source="_HHhqU-fXEduqHoOJbURZRw" target="_HHhqQ-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHhqZufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHhqaOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHhqaefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHhqZ-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHhqaufXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHhqbOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqa-fXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HHhqbefXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHhqb-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqbufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HHhqcOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHhqcufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqcefXEduqHoOJbURZRw" x="-304" y="519"/>
-                </children>
-                <children xmi:id="_HHhqc-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHhqdefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqdOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HHhqdufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHhqeOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqeefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqd-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHhqeufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHhqfOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqfefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqe-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHhqfufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHhqgOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqgefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqf-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HHhqgufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHhqhOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHhqhefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHhqg-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHhqZOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHhqZefXEduqHoOJbURZRw" points="[-347, -457, 1227, 1676]$[-1202, -1617, 372, 516]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D42DDEC3F0039" type="Class" name="StateMachine">
-              <children xmi:id="_HHqz8OfXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC810323">
-                <children xmi:id="_HHqz8-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHqz9OfXEduqHoOJbURZRw" width="2370" height="905"/>
-                </children>
-                <children xmi:id="_HHqz9efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHqz9ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHqz9-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHqz-OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHqz-efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHqz-ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHqz--fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHqz_OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHqz_efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHqz_ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHqz_-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHqz8efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHqz8ufXEduqHoOJbURZRw" x="9685" y="13267"/>
-              </children>
-              <children xmi:id="_HHq0AOfXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEDDC0318">
-                <children xmi:id="_HHq0A-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHq0BOfXEduqHoOJbURZRw" width="3166" height="4588"/>
-                </children>
-                <children xmi:id="_HHq0BefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHq0BufXEduqHoOJbURZRw" type="Kind"/>
-                <children xmi:id="_HHq0B-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHq0COfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHq0CefXEduqHoOJbURZRw" type="EnumerationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0CufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0C-fXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0DOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0DefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0DufXEduqHoOJbURZRw"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHq0AefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHq0AufXEduqHoOJbURZRw" x="2125" y="6747"/>
-              </children>
-              <children xmi:id="_HHq0D-fXEduqHoOJbURZRw" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_HHq0EufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHq0E-fXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_HHq0FOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHq0FefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHq0FufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHq0F-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0GOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0GefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0GufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0G-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0HOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0HefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHq0HufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHq0EOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHq0EefXEduqHoOJbURZRw" x="10833" y="2365"/>
-              </children>
-              <children xmi:id="_HHq0H-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEAC301A5">
-                <children xmi:id="_HHq0IufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHq0I-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HHq0JOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHq0JefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHq0JufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHq0J-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0KOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0KefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0KufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0K-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0LOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HHq0LefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HHq0LufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHq0IOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHq0IefXEduqHoOJbURZRw" x="14623" y="10648" width="2373" height="1574"/>
-              </children>
-              <children xmi:id="_HHq0UufXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC7C0109">
-                <children xmi:id="_HHq0VefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HHq0VufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HHq0V-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HHq0WOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HHq0WefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HHq0WufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0W-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0k8OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0k8efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0k8ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0k8-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0k9OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HH0k9efXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HHq0U-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHq0VOfXEduqHoOJbURZRw" x="8831" y="10490" width="1769" height="1574"/>
-              </children>
-              <children xmi:id="_HH0lRefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E02BC">
-                <children xmi:id="_HH0lSOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HH0lSefXEduqHoOJbURZRw" width="3691" height="1032"/>
-                </children>
-                <children xmi:id="_HH0lSufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HH0lS-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HH0lTOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HH0lTefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lTufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0lT-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lUOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0lUefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lUufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0lU-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HH0lVOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HH0lRufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0lR-fXEduqHoOJbURZRw" x="1507" y="13199"/>
-              </children>
-              <children xmi:id="_HH0lVefXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC4E00B3">
-                <children xmi:id="_HH0lWOfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HH0lWefXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HH0lWufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HH0lW-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HH0lXOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HH0lXefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lXufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0lX-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lYOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0lYefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lYufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0lY-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HH0lZOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HH0lVufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0lV-fXEduqHoOJbURZRw" x="11226" y="5046" width="3095" height="1905"/>
-              </children>
-              <children xmi:id="_HH0lbufXEduqHoOJbURZRw" element="_3ADC7B74022D42DDF1C40333">
-                <children xmi:id="_HH0lcefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HH0lcufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HH0lc-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HH0ldOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HH0ldefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HH0ldufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0ld-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0leOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0leefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0leufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0le-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH0lfOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HH0lfefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HH0lb-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0lcOfXEduqHoOJbURZRw" x="11675" y="8331" width="1827" height="1219"/>
-              </children>
-              <children xmi:id="_HH9vI-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEA050008">
-                <children xmi:id="_HH9vJufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HH9vJ-fXEduqHoOJbURZRw" width="2015" height="897"/>
-                </children>
-                <children xmi:id="_HH9vKOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HH9vKefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HH9vKufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HH9vK-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vLOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH9vLefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vLufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH9vL-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vMOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HH9vMefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HH9vMufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HH9vJOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH9vJefXEduqHoOJbURZRw" x="7120" y="13267"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GvPF0efXEduqHoOJbURZRw"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HHq0L-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC25003C" source="_HHq0H-fXEduqHoOJbURZRw" target="_HHq0D-fXEduqHoOJbURZRw">
-                <children xmi:id="_HHq0MufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HHq0NOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HHq0NefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HHq0M-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHq0NufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHq0OOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0N-fXEduqHoOJbURZRw" x="-396" y="343"/>
-                </children>
-                <children xmi:id="_HHq0OefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHq0O-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0OufXEduqHoOJbURZRw" x="-984" y="975"/>
-                </children>
-                <children xmi:id="_HHq0POfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHq0PufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0PefXEduqHoOJbURZRw" x="280" y="-305"/>
-                </children>
-                <children xmi:id="_HHq0P-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHq0QefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0QOfXEduqHoOJbURZRw" x="-18" y="227"/>
-                </children>
-                <children xmi:id="_HHq0QufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHq0ROfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0RefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0Q-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHq0RufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHq0SOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0SefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0R-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HHq0SufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEC250245">
-                  <children xmi:id="_HHq0TOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0TefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0S-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HHq0TufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEC25023B">
-                  <children xmi:id="_HHq0UOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HHq0UefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HHq0T-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HHq0MOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HHq0MefXEduqHoOJbURZRw" points="[677, -795, 3623, 7281]$[677, -8221, 3623, -143]$[-1100, -8221, 1845, -143]"/>
-              </edges>
-              <edges xmi:id="_HH0k9ufXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEEE1038C" source="_HHqz8OfXEduqHoOJbURZRw" target="_HHq0UufXEduqHoOJbURZRw">
-                <children xmi:id="_HH0k-efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH0k--fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH0k_OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0k-ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH0k9-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH0k-OfXEduqHoOJbURZRw" points="[-203, -457, 863, 1981]$[-728, -1651, 338, 787]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HH0k_efXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HH0k_ufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HH0k_-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEF8B019B" source="_HHq0UufXEduqHoOJbURZRw" target="_HHq0H-fXEduqHoOJbURZRw">
-                <children xmi:id="_HH0lAufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH0lBOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH0lBefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0lA-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lBufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEF8C014D">
-                  <children xmi:id="_HH0lCOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lB-fXEduqHoOJbURZRw" x="-445" y="-204"/>
-                </children>
-                <children xmi:id="_HH0lCefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDEF8C014D">
-                  <children xmi:id="_HH0lC-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lCufXEduqHoOJbURZRw" x="182" y="211"/>
-                </children>
-                <children xmi:id="_HH0lDOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEF8C0143">
-                  <children xmi:id="_HH0lDufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lDefXEduqHoOJbURZRw" x="403" y="-178"/>
-                </children>
-                <children xmi:id="_HH0lD-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDEF8C0143">
-                  <children xmi:id="_HH0lEefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lEOfXEduqHoOJbURZRw" x="-156" y="211"/>
-                </children>
-                <children xmi:id="_HH0lEufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEF8C014D">
-                  <children xmi:id="_HH0lFOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lFefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lE-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lFufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEF8C0143">
-                  <children xmi:id="_HH0lGOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lGefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lF-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lGufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEF8C014D">
-                  <children xmi:id="_HH0lHOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lHefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lG-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HH0lHufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEF8C0143">
-                  <children xmi:id="_HH0lIOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lIefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lH-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH0lAOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH0lAefXEduqHoOJbURZRw" points="[787, -558, -4902, -558]$[4766, -558, -922, -558]"/>
-              </edges>
-              <edges xmi:id="_HH0lIufXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEF9403BB" source="_HHq0UufXEduqHoOJbURZRw" target="_HHq0H-fXEduqHoOJbURZRw">
-                <children xmi:id="_HH0lJefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH0lJ-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH0lKOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0lJufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lKefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEF95035A">
-                  <children xmi:id="_HH0lK-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lKufXEduqHoOJbURZRw" x="-394" y="246"/>
-                </children>
-                <children xmi:id="_HH0lLOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDEF95035A">
-                  <children xmi:id="_HH0lLufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lLefXEduqHoOJbURZRw" x="80" y="-228"/>
-                </children>
-                <children xmi:id="_HH0lL-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEF950358">
-                  <children xmi:id="_HH0lMefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lMOfXEduqHoOJbURZRw" x="369" y="271"/>
-                </children>
-                <children xmi:id="_HH0lMufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDEF950358">
-                  <children xmi:id="_HH0lNOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lM-fXEduqHoOJbURZRw" x="-215" y="-228"/>
-                </children>
-                <children xmi:id="_HH0lNefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEF95035A">
-                  <children xmi:id="_HH0lN-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lOOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lNufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lOefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEF950358">
-                  <children xmi:id="_HH0lO-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lPOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lOufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lPefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEF95035A">
-                  <children xmi:id="_HH0lP-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lQOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lPufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HH0lQefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEF950358">
-                  <children xmi:id="_HH0lQ-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lROfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lQufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH0lI-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH0lJOfXEduqHoOJbURZRw" points="[794, 555, -4895, 555]$[4763, 555, -926, 555]"/>
-              </edges>
-              <edges xmi:id="_HH0lZefXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC680092" source="_HH0lVefXEduqHoOJbURZRw" target="_HHq0D-fXEduqHoOJbURZRw">
-                <children xmi:id="_HH0laOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH0laufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH0la-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0laefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH0lZufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH0lZ-fXEduqHoOJbURZRw" points="[0, -948, -50, 1845]$[0, -2286, -50, 508]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HH0lbOfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HH0lbefXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HH0lfufXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEEF10078" source="_HH0lbufXEduqHoOJbURZRw" target="_HHq0H-fXEduqHoOJbURZRw">
-                <children xmi:id="_HH0lgefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH0lg-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH0lhOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH0lgufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lhefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEEF102FA">
-                  <children xmi:id="_HH0lh-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lhufXEduqHoOJbURZRw" x="218" y="297"/>
-                </children>
-                <children xmi:id="_HH0liOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDEEF102FA">
-                  <children xmi:id="_HH0liufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0liefXEduqHoOJbURZRw" x="658" y="-296"/>
-                </children>
-                <children xmi:id="_HH0li-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEEF102F8">
-                  <children xmi:id="_HH0ljefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0ljOfXEduqHoOJbURZRw" x="62" y="-153"/>
-                </children>
-                <children xmi:id="_HH0ljufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDEEF102F8">
-                  <children xmi:id="_HH0lkOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lj-fXEduqHoOJbURZRw" y="1006"/>
-                </children>
-                <children xmi:id="_HH0lkefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEEF102FA">
-                  <children xmi:id="_HH0lk-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0llOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lkufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0llefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEEF102F8">
-                  <children xmi:id="_HH0ll-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lmOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0llufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH0lmefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEEF102FA">
-                  <children xmi:id="_HH0lm-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0lnOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lmufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HH0lnefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEEF102F8">
-                  <children xmi:id="_HH0ln-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH0loOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH0lnufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH0lf-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH0lgOfXEduqHoOJbURZRw" points="[821, 59, -2175, -2277]$[2853, 59, -143, -2277]$[2853, 1549, -143, -787]"/>
-              </edges>
-              <edges xmi:id="_HH0loefXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEEEE0164" source="_HH0lbufXEduqHoOJbURZRw" target="_HHq0UufXEduqHoOJbURZRw">
-                <children xmi:id="_HH9u4OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH9u4ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH9u4-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH9u4efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9u5OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEEEE0396">
-                  <children xmi:id="_HH9u5ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u5efXEduqHoOJbURZRw" x="165" y="-306"/>
-                </children>
-                <children xmi:id="_HH9u5-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDEEEE0396">
-                  <children xmi:id="_HH9u6efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u6OfXEduqHoOJbURZRw" x="785" y="219"/>
-                </children>
-                <children xmi:id="_HH9u6ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEEEE0394">
-                  <children xmi:id="_HH9u7OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u6-fXEduqHoOJbURZRw" x="200" y="135"/>
-                </children>
-                <children xmi:id="_HH9u7efXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDEEEE0394">
-                  <children xmi:id="_HH9u7-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u7ufXEduqHoOJbURZRw" x="132" y="-714"/>
-                </children>
-                <children xmi:id="_HH9u8OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEEEE0396">
-                  <children xmi:id="_HH9u8ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9u8-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u8efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9u9OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEEEE0394">
-                  <children xmi:id="_HH9u9ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9u9-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u9efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9u-OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEEEE0396">
-                  <children xmi:id="_HH9u-ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9u--fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u-efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HH9u_OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEEEE0394">
-                  <children xmi:id="_HH9u_ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9u_-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9u_efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH0loufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH0lo-fXEduqHoOJbURZRw" points="[-926, 212, 1879, -2143]$[-3069, 212, -264, -2143]$[-3069, 1561, -264, -794]"/>
-              </edges>
-              <edges xmi:id="_HH9vAOfXEduqHoOJbURZRw" element="_3ADC7B74022D42DDF1FD0100" source="_HH0lVefXEduqHoOJbURZRw" target="_HH0lbufXEduqHoOJbURZRw">
-                <children xmi:id="_HH9vA-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH9vBefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH9vBufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH9vBOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vB-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDF1FE00E7">
-                  <children xmi:id="_HH9vCefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vCOfXEduqHoOJbURZRw" x="376" y="381"/>
-                </children>
-                <children xmi:id="_HH9vCufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDF1FE00E7">
-                  <children xmi:id="_HH9vDOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vC-fXEduqHoOJbURZRw" x="264" y="-1137"/>
-                </children>
-                <children xmi:id="_HH9vDefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDF1FE00E5">
-                  <children xmi:id="_HH9vD-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vDufXEduqHoOJbURZRw" x="-10" y="347"/>
-                </children>
-                <children xmi:id="_HH9vEOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDF1FE00E5">
-                  <children xmi:id="_HH9vEufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vEefXEduqHoOJbURZRw" x="-53" y="-767"/>
-                </children>
-                <children xmi:id="_HH9vE-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDF1FE00E7">
-                  <children xmi:id="_HH9vFefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vFufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vFOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vF-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDF1FE00E5">
-                  <children xmi:id="_HH9vGefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vGufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vGOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vG-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDF1FE00E7">
-                  <children xmi:id="_HH9vHefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vHufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vHOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HH9vH-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDF1FE00E5">
-                  <children xmi:id="_HH9vIefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vIufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vIOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH9vAefXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH9vAufXEduqHoOJbURZRw" points="[212, 953, 106, -1984]$[212, 2328, 106, -609]"/>
-              </edges>
-              <edges xmi:id="_HH9vM-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEEDF0112" source="_HH9vI-fXEduqHoOJbURZRw" target="_HHq0UufXEduqHoOJbURZRw">
-                <children xmi:id="_HH9vNufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH9vOOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH9vOefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH9vN-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH9vNOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH9vNefXEduqHoOJbURZRw" points="[304, -457, -1371, 1981]$[1117, -1651, -558, 787]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HH9vOufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HH9vO-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HH9vPOfXEduqHoOJbURZRw" element="_3ADC7B74022D42DDEC2102D5" source="_HH9vI-fXEduqHoOJbURZRw" target="_HH0lRefXEduqHoOJbURZRw">
-                <children xmi:id="_HH9vP-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH9vQefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH9vQufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH9vQOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vQ-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HH9vRefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vROfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HH9vRufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HH9vSOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vR-fXEduqHoOJbURZRw" x="83" y="-287"/>
-                </children>
-                <children xmi:id="_HH9vSefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HH9vS-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vSufXEduqHoOJbURZRw" x="-135" y="-296"/>
-                </children>
-                <children xmi:id="_HH9vTOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HH9vTufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vTefXEduqHoOJbURZRw" x="-311" y="598"/>
-                </children>
-                <children xmi:id="_HH9vT-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HH9vUefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vUufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vUOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vU-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HH9vVefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vVufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vVOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vV-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDEC22018C">
-                  <children xmi:id="_HH9vWefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vWufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vWOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HH9vW-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDEC220182">
-                  <children xmi:id="_HH9vXefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vXufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vXOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH9vPefXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH9vPufXEduqHoOJbURZRw" points="[-1016, 0, 3759, 0]$[-2929, 0, 1845, 0]"/>
-              </edges>
-              <edges xmi:id="_HH9vX-fXEduqHoOJbURZRw" element="_3ADC7B74022D42DDF1390186" source="_HH9vI-fXEduqHoOJbURZRw" target="_HH0lVefXEduqHoOJbURZRw">
-                <children xmi:id="_HH9vYufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH9vZOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH9vZefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH9vY-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vZufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDF13A0360">
-                  <children xmi:id="_HH9vaOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vZ-fXEduqHoOJbURZRw" x="-933" y="-283"/>
-                </children>
-                <children xmi:id="_HH9vaefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDF13A0360">
-                  <children xmi:id="_HH9va-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vaufXEduqHoOJbURZRw" x="-423" y="-1641"/>
-                </children>
-                <children xmi:id="_HH9vbOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDF13A035E">
-                  <children xmi:id="_HH9vbufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vbefXEduqHoOJbURZRw" x="1136" y="330"/>
-                </children>
-                <children xmi:id="_HH9vb-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDF13A035E">
-                  <children xmi:id="_HH9vcefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vcOfXEduqHoOJbURZRw" x="433" y="-246"/>
-                </children>
-                <children xmi:id="_HH9vcufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDF13A0360">
-                  <children xmi:id="_HH9vdOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vdefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vc-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vdufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDF13A035E">
-                  <children xmi:id="_HH9veOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9veefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vd-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9veufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDF13A0360">
-                  <children xmi:id="_HH9vfOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vfefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9ve-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HH9vfufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDF13A035E">
-                  <children xmi:id="_HH9vgOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vgefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vf-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH9vYOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH9vYefXEduqHoOJbURZRw" points="[-476, -318, -5371, 7276]$[-476, -8467, -5371, -873]$[3334, -8467, -1561, -873]"/>
-              </edges>
-              <edges xmi:id="_HH9vgufXEduqHoOJbURZRw" element="_3ADC7B74022D42DDF0D80140" source="_HH9vI-fXEduqHoOJbURZRw" target="_HH0lbufXEduqHoOJbURZRw">
-                <children xmi:id="_HH9vhefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HH9vh-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HH9viOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HH9vhufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9viefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42DDF0D903D6">
-                  <children xmi:id="_HH9vi-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9viufXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HH9vjOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D42DDF0D903D6">
-                  <children xmi:id="_HH9vjufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vjefXEduqHoOJbURZRw" x="-449" y="476"/>
-                </children>
-                <children xmi:id="_HH9vj-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42DDF0D903CC">
-                  <children xmi:id="_HH9vkefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vkOfXEduqHoOJbURZRw" x="788" y="253"/>
-                </children>
-                <children xmi:id="_HH9vkufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42DDF0D903CC">
-                  <children xmi:id="_HH9vlOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vk-fXEduqHoOJbURZRw" x="-8" y="-246"/>
-                </children>
-                <children xmi:id="_HH9vlefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42DDF0D903D6">
-                  <children xmi:id="_HH9vl-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vmOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vlufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vmefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42DDF0D903CC">
-                  <children xmi:id="_HH9vm-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HH9vnOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vmufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HH9vnefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42DDF0D903D6">
-                  <children xmi:id="_HIHf4OfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIHf4efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HH9vnufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HIHf4ufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42DDF0D903CC">
-                  <children xmi:id="_HIHf5OfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HIHf5efXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HIHf4-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HH9vg-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HH9vhOfXEduqHoOJbURZRw" points="[-159, -318, -4869, 4339]$[-159, -5609, -4869, -952]$[4260, -5609, -450, -952]$[4260, -5266, -450, -609]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_CnQ5kOxmEduwObkIA6x1gA" type="Class" name="Taxonomy">
-              <children xmi:id="_E709MOxmEduwObkIA6x1gA" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_E709M-xmEduwObkIA6x1gA" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_E709NOxmEduwObkIA6x1gA" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_E709NexmEduwObkIA6x1gA" type="Stereotype"/>
-                <children xmi:id="_E709NuxmEduwObkIA6x1gA" type="Name"/>
-                <children xmi:id="_E709N-xmEduwObkIA6x1gA" type="Parent"/>
-                <children xmi:id="_E709OOxmEduwObkIA6x1gA" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_E709OexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_E709OuxmEduwObkIA6x1gA" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_E709O-xmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_E709POxmEduwObkIA6x1gA" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_E709PexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_E709PuxmEduwObkIA6x1gA" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_E709P-xmEduwObkIA6x1gA"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_E709MexmEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showParent="Name" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E709MuxmEduwObkIA6x1gA" x="8412" y="714"/>
-              </children>
-              <children xmi:id="_GAFPgOxmEduwObkIA6x1gA" element="_3ADC7B74022D42DDEC4E00B3">
-                <children xmi:id="_GAFPg-xmEduwObkIA6x1gA" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_GAFPhOxmEduwObkIA6x1gA" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_GAFPhexmEduwObkIA6x1gA" type="Stereotype"/>
-                <children xmi:id="_GAFPhuxmEduwObkIA6x1gA" type="Name"/>
-                <children xmi:id="_GAFPh-xmEduwObkIA6x1gA" type="Parent"/>
-                <children xmi:id="_GAFPiOxmEduwObkIA6x1gA" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_GAFPiexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_GAFPiuxmEduwObkIA6x1gA" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_GAFPi-xmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_GAFPjOxmEduwObkIA6x1gA" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_GAFPjexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_GAFPjuxmEduwObkIA6x1gA" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_GAFPj-xmEduwObkIA6x1gA"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_GAFPgexmEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GAFPguxmEduwObkIA6x1gA" x="4576" y="5741"/>
-              </children>
-              <children xmi:id="_IthtMOxmEduwObkIA6x1gA" element="_3ADC7B74022D427A82D3017F">
-                <children xmi:id="_IthtM-xmEduwObkIA6x1gA" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_IthtNOxmEduwObkIA6x1gA" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_IthtNexmEduwObkIA6x1gA" type="Stereotype"/>
-                <children xmi:id="_IthtNuxmEduwObkIA6x1gA" type="Name"/>
-                <children xmi:id="_IthtN-xmEduwObkIA6x1gA" type="Parent"/>
-                <children xmi:id="_IthtOOxmEduwObkIA6x1gA" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IthtOexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_IthtOuxmEduwObkIA6x1gA" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IthtO-xmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_IthtPOxmEduwObkIA6x1gA" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_IthtPexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_IthtPuxmEduwObkIA6x1gA" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_IthtP-xmEduwObkIA6x1gA"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_IthtMexmEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IthtMuxmEduwObkIA6x1gA" x="4469" y="3385"/>
-              </children>
-              <children xmi:id="_LeQIYOxmEduwObkIA6x1gA" element="_3ADC7B74022D42DDF1C40333">
-                <children xmi:id="_LeQIY-xmEduwObkIA6x1gA" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_LeQIZOxmEduwObkIA6x1gA" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_LeQIZexmEduwObkIA6x1gA" type="Stereotype"/>
-                <children xmi:id="_LeQIZuxmEduwObkIA6x1gA" type="Name"/>
-                <children xmi:id="_LeQIZ-xmEduwObkIA6x1gA" type="Parent"/>
-                <children xmi:id="_LeQIaOxmEduwObkIA6x1gA" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_LeQIaexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_LeQIauxmEduwObkIA6x1gA" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_LeQIa-xmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_LeQIbOxmEduwObkIA6x1gA" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_LeQIbexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_LeQIbuxmEduwObkIA6x1gA" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_LeQIb-xmEduwObkIA6x1gA"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_LeQIYexmEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LeQIYuxmEduwObkIA6x1gA" x="10872" y="3385"/>
-              </children>
-              <children xmi:id="_Rqx8EOxmEduwObkIA6x1gA" element="_3ADC7B74022D42DDEAC301A5">
-                <children xmi:id="_Rqx8E-xmEduwObkIA6x1gA" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_Rqx8FOxmEduwObkIA6x1gA" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_Rqx8FexmEduwObkIA6x1gA" type="Stereotype"/>
-                <children xmi:id="_Rqx8FuxmEduwObkIA6x1gA" type="Name"/>
-                <children xmi:id="_Rqx8F-xmEduwObkIA6x1gA" type="Parent"/>
-                <children xmi:id="_Rqx8GOxmEduwObkIA6x1gA" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Rqx8GexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_Rqx8GuxmEduwObkIA6x1gA" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Rqx8G-xmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_Rqx8HOxmEduwObkIA6x1gA" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_Rqx8HexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_Rqx8HuxmEduwObkIA6x1gA" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_Rqx8H-xmEduwObkIA6x1gA"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_Rqx8EexmEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Rqx8EuxmEduwObkIA6x1gA" x="8096" y="3360"/>
-              </children>
-              <children xmi:id="_TQsxAOxmEduwObkIA6x1gA" element="_3ADC7B74022D42DDEC7C0109">
-                <children xmi:id="_TQsxA-xmEduwObkIA6x1gA" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_TQsxBOxmEduwObkIA6x1gA" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_TQsxBexmEduwObkIA6x1gA" type="Stereotype"/>
-                <children xmi:id="_TQsxBuxmEduwObkIA6x1gA" type="Name"/>
-                <children xmi:id="_TQsxB-xmEduwObkIA6x1gA" type="Parent"/>
-                <children xmi:id="_TQsxCOxmEduwObkIA6x1gA" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_TQsxCexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_TQsxCuxmEduwObkIA6x1gA" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_TQsxC-xmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_TQsxDOxmEduwObkIA6x1gA" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_TQsxDexmEduwObkIA6x1gA"/>
-                </children>
-                <children xmi:id="_TQsxDuxmEduwObkIA6x1gA" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_TQsxD-xmEduwObkIA6x1gA"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_TQsxAexmEduwObkIA6x1gA" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TQsxAuxmEduwObkIA6x1gA" x="13148" y="3385"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_CnQ5kexmEduwObkIA6x1gA"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_IthtQOxmEduwObkIA6x1gA" element="_3ADC7B74022D427A82F3026E" source="_IthtMOxmEduwObkIA6x1gA" target="_E709MOxmEduwObkIA6x1gA">
-                <children xmi:id="_IthtQ-xmEduwObkIA6x1gA" type="NameLabel">
-                  <children xmi:id="_ItreMOxmEduwObkIA6x1gA" type="Stereotype"/>
-                  <children xmi:id="_ItreMexmEduwObkIA6x1gA" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_IthtROxmEduwObkIA6x1gA" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_IthtQexmEduwObkIA6x1gA" routing="Tree" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_IthtQuxmEduwObkIA6x1gA" points="[291, -318, -1535, 1614]$[1376, -1456, -450, 476]"/>
-              </edges>
-              <edges xmi:id="_ItreMuxmEduwObkIA6x1gA" element="_3ADC7B74022D42DDEC680092" source="_GAFPgOxmEduwObkIA6x1gA" target="_IthtMOxmEduwObkIA6x1gA">
-                <children xmi:id="_ItreNexmEduwObkIA6x1gA" type="NameLabel">
-                  <children xmi:id="_ItreN-xmEduwObkIA6x1gA" type="Stereotype"/>
-                  <children xmi:id="_ItreOOxmEduwObkIA6x1gA" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ItreNuxmEduwObkIA6x1gA" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_ItreM-xmEduwObkIA6x1gA" routing="Rectilinear" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ItreNOxmEduwObkIA6x1gA" points="[53, -343, 53, 2038]$[53, -2063, 53, 318]"/>
-              </edges>
-              <edges xmi:id="_OOPjwexmEduwObkIA6x1gA" element="_OOPjwOxmEduwObkIA6x1gA" source="_LeQIYOxmEduwObkIA6x1gA" target="_E709MOxmEduwObkIA6x1gA">
-                <children xmi:id="_OOPjxOxmEduwObkIA6x1gA" type="NameLabel">
-                  <children xmi:id="_OOPjxuxmEduwObkIA6x1gA" type="Stereotype"/>
-                  <children xmi:id="_OOPjx-xmEduwObkIA6x1gA" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_OOPjxexmEduwObkIA6x1gA" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_OOPjwuxmEduwObkIA6x1gA" routing="Tree" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_OOPjw-xmEduwObkIA6x1gA" points="[-423, -344, 2540, 2011]$[-2355, -1879, 608, 476]"/>
-              </edges>
-              <edges xmi:id="_WEHT0exmEduwObkIA6x1gA" element="_WEHT0OxmEduwObkIA6x1gA" source="_Rqx8EOxmEduwObkIA6x1gA" target="_E709MOxmEduwObkIA6x1gA">
-                <children xmi:id="_WEHT1OxmEduwObkIA6x1gA" type="NameLabel">
-                  <children xmi:id="_WEHT1uxmEduwObkIA6x1gA" type="Stereotype"/>
-                  <children xmi:id="_WEHT1-xmEduwObkIA6x1gA" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WEHT1exmEduwObkIA6x1gA" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_WEHT0uxmEduwObkIA6x1gA" routing="Tree" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WEHT0-xmEduwObkIA6x1gA" points="[-79, -317, 1085, 3890]$[-1032, -3731, 132, 476]"/>
-              </edges>
-              <edges xmi:id="_WeVxsexmEduwObkIA6x1gA" element="_WeVxsOxmEduwObkIA6x1gA" source="_TQsxAOxmEduwObkIA6x1gA" target="_E709MOxmEduwObkIA6x1gA">
-                <children xmi:id="_WeVxtOxmEduwObkIA6x1gA" type="NameLabel">
-                  <children xmi:id="_WeVxtuxmEduwObkIA6x1gA" type="Stereotype"/>
-                  <children xmi:id="_WeVxt-xmEduwObkIA6x1gA" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_WeVxtexmEduwObkIA6x1gA" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_WeVxsuxmEduwObkIA6x1gA" routing="Tree" lineColor="0" showStereotype="Text"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WeVxs-xmEduwObkIA6x1gA" points="[-344, -344, 3995, 3969]$[-3863, -3837, 476, 476]"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <packageImport xmi:id="_URzlsOoWEduOBPQA2hKqUQ" importedPackage="_3ADC7B74022D40F36C5E0294"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42DDEA050008" name="State">
-            <generalization xmi:id="_3ADC7B74022D42DDEEDF0112" general="_3ADC7B74022D42DDEC7C0109"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEC220182" name="workProduct" visibility="public" type="_3ADC7B74022D40F36C5E02BC" association="_3ADC7B74022D42DDEC2102D5">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GuyZ_efXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GuyZ_OfXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDF0D903CC" name="region" visibility="public" type="_3ADC7B74022D42DDF1C40333" aggregation="composite" association="_3ADC7B74022D42DDF0D80140">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU6OfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU5-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDF13A035E" name="submachine" visibility="public" type="_3ADC7B74022D42DDEC4E00B3" association="_3ADC7B74022D42DDF1390186">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU7efXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU7OfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42DDEAC301A5" name="Transition">
-            <generalization xmi:id="_WEHT0OxmEduwObkIA6x1gA" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEC25023B" name="workDefinition" visibility="public" type="_3ADC7B74022D427A82D3017F" association="_3ADC7B74022D42DDEC25003C">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gu7j0ufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gu7j0efXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEEF102FA" name="container" visibility="public" type="_3ADC7B74022D42DDF1C40333" association="_3ADC7B74022D42DDEEF10078">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU1ufXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU1efXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEF8C014D" name="source" visibility="public" type="_3ADC7B74022D42DDEC7C0109" association="_3ADC7B74022D42DDEF8B019B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU3efXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU3OfXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEF95035A" name="target" visibility="public" type="_3ADC7B74022D42DDEC7C0109" association="_3ADC7B74022D42DDEF9403BB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU5OfXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU4-fXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42DDEC4E00B3" name="StateMachine">
-            <generalization xmi:id="_3ADC7B74022D42DDEC680092" general="_3ADC7B74022D427A82D3017F"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDF1FE00E5" name="region" visibility="public" type="_3ADC7B74022D42DDF1C40333" aggregation="composite" association="_3ADC7B74022D42DDF1FD0100">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU9OfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU8-fXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42DDEC7C0109" name="Vertex">
-            <generalization xmi:id="_WeVxsOxmEduwObkIA6x1gA" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEEEE0396" name="container" visibility="public" type="_3ADC7B74022D42DDF1C40333" association="_3ADC7B74022D42DDEEEE0164">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gu7j2ufXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gu7j2efXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEF8C0143" name="outgoing" visibility="public" type="_3ADC7B74022D42DDEAC301A5" association="_3ADC7B74022D42DDEF8B019B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU2ufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU2efXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEF950358" name="incoming" visibility="public" type="_3ADC7B74022D42DDEAC301A5" association="_3ADC7B74022D42DDEF9403BB">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU4efXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU4OfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42DDEC810323" name="PseudoState">
-            <generalization xmi:id="_3ADC7B74022D42DDEEE1038C" general="_3ADC7B74022D42DDEC7C0109"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Enumeration" xmi:id="_3ADC7B74022D42DDEDDC0318" name="PseudoStateKind">
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEDF602EE" name="initial"/>
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEE340289" name="join"/>
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEE3902CC" name="fork"/>
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEE3E011A" name="junction"/>
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEE4401EB" name="choice"/>
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEE49013E" name="entryPoint"/>
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEE500293" name="exitPoint"/>
-            <ownedLiteral xmi:id="_3ADC7B74022D42DDEE560089" name="terminate"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D42DDF1C40333" name="Region">
-            <generalization xmi:id="_OOPjwOxmEduwObkIA6x1gA" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEEEE0394" name="vertex" visibility="public" type="_3ADC7B74022D42DDEC7C0109" aggregation="composite" association="_3ADC7B74022D42DDEEEE0164">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gu7j1-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gu7j1ufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDEEF102F8" name="transition" visibility="public" type="_3ADC7B74022D42DDEAC301A5" aggregation="composite" association="_3ADC7B74022D42DDEEF10078">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU0-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU0ufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDF0D903D6" name="state" visibility="public" type="_3ADC7B74022D42DDEA050008" association="_3ADC7B74022D42DDF0D80140"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D42DDF1FE00E7" name="stateMachine" visibility="public" type="_3ADC7B74022D42DDEC4E00B3" association="_3ADC7B74022D42DDF1FD0100">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU9-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU9ufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDEC2102D5" memberEnd="_3ADC7B74022D42DDEC220182 _3ADC7B74022D42DDEC22018C">
-            <ownedEnd xmi:id="_3ADC7B74022D42DDEC22018C" name="state" visibility="public" type="_3ADC7B74022D42DDEA050008" association="_3ADC7B74022D42DDEC2102D5"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDEC25003C" memberEnd="_3ADC7B74022D42DDEC25023B _3ADC7B74022D42DDEC250245">
-            <ownedEnd xmi:id="_3ADC7B74022D42DDEC250245" name="transition" visibility="public" type="_3ADC7B74022D42DDEAC301A5" association="_3ADC7B74022D42DDEC25003C"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDEEEE0164" memberEnd="_3ADC7B74022D42DDEEEE0394 _3ADC7B74022D42DDEEEE0396"/>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDEEF10078" memberEnd="_3ADC7B74022D42DDEEF102F8 _3ADC7B74022D42DDEEF102FA"/>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDEF8B019B" memberEnd="_3ADC7B74022D42DDEF8C0143 _3ADC7B74022D42DDEF8C014D"/>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDEF9403BB" memberEnd="_3ADC7B74022D42DDEF950358 _3ADC7B74022D42DDEF95035A"/>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDF0D80140" memberEnd="_3ADC7B74022D42DDF0D903CC _3ADC7B74022D42DDF0D903D6"/>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDF1390186" memberEnd="_3ADC7B74022D42DDF13A035E _3ADC7B74022D42DDF13A0360">
-            <ownedEnd xmi:id="_3ADC7B74022D42DDF13A0360" name="subMachineState" visibility="public" type="_3ADC7B74022D42DDEA050008" association="_3ADC7B74022D42DDF1390186">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvFU8OfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvFU7-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42DDF1FD0100" memberEnd="_3ADC7B74022D42DDF1FE00E5 _3ADC7B74022D42DDF1FE00E7"/>
-        </packagedElement>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D40F36C57003B" name="MethodLibrary">
-        <eAnnotations xmi:id="_GwbYpufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41FFDA2500FD">
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41FFDA2500FD" type="Class" name="Main">
-            <children xmi:id="_HKDZkOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FEDDB60306">
-              <children xmi:id="_HKDZk-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKDZlOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HKDZlefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKDZlufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKDZl-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKDZmOfXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKDZmefXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKDZkefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZkufXEduqHoOJbURZRw" x="4381" y="4749" width="4284" height="1676"/>
-            </children>
-            <children xmi:id="_HKDZmufXEduqHoOJbURZRw" element="_3ADC7B74022D41FEDB38011E">
-              <children xmi:id="_HKDZnefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKDZnufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HKDZn-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKDZoOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKDZoefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKDZoufXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKDZo-fXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKDZm-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZnOfXEduqHoOJbURZRw" x="4381" y="1451" width="4284" height="1676"/>
-            </children>
-            <children xmi:id="_-_T6cOxwEduM14unWaqP5Q" element="_3ADC7B74022D4151E996009D">
-              <children xmi:id="_-_T6c-xwEduM14unWaqP5Q" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_-_T6dOxwEduM14unWaqP5Q" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_-_T6dexwEduM14unWaqP5Q" type="Stereotype"/>
-              <children xmi:id="_-_T6duxwEduM14unWaqP5Q" type="Name"/>
-              <children xmi:id="_-_T6d-xwEduM14unWaqP5Q" type="Parent"/>
-              <children xmi:id="_-_T6eOxwEduM14unWaqP5Q" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_-_T6eexwEduM14unWaqP5Q" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_-_T6cexwEduM14unWaqP5Q" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-_T6cuxwEduM14unWaqP5Q" x="1453" y="8041" width="4284" height="1676"/>
-            </children>
-            <children xmi:id="_LAqzgOxxEduM14unWaqP5Q" element="_3ADC7B74022D40F36C5E00FB">
-              <children xmi:id="_LAqzg-xxEduM14unWaqP5Q" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_LAqzhOxxEduM14unWaqP5Q" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_LAqzhexxEduM14unWaqP5Q" type="Stereotype"/>
-              <children xmi:id="_LAqzhuxxEduM14unWaqP5Q" type="Name"/>
-              <children xmi:id="_LAqzh-xxEduM14unWaqP5Q" type="Parent"/>
-              <children xmi:id="_LAqziOxxEduM14unWaqP5Q" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_LAqziexxEduM14unWaqP5Q" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_LAqzgexxEduM14unWaqP5Q" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LAqzguxxEduM14unWaqP5Q" x="7354" y="8040" width="4284" height="1676"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GwbYqOfXEduqHoOJbURZRw" description="The Method Library package defines capabilities around managing whole libraries of Method Content and Processes.  It addresses requirements around physically separating descriptions of Content Elements from their modeled relationships defining separate units of control.  It also addresses the concern of scaling to large Method Libraries by defining Method Configurations that define visibility spaces or working sets for Method Content and Process allowing a Process Engineer to focus on relevant parts of Library instead of seeing the whole library all at once.  By defining Configurations as subsets of Plugins and Method Packages that shall be considered for process authoring only, Configurations also define the space of variability interpretation to avoid conflicts amongst 'competing' content (e.g. content that replaces the same elements)."/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_A___oexMEduONrMRgmz48A" element="_A___oOxMEduONrMRgmz48A" source="_HKDZmufXEduqHoOJbURZRw" target="_HKDZkOfXEduqHoOJbURZRw">
-              <children xmi:id="_A___pOxMEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_A___puxMEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_A___qOxMEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_A___p-xMEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_A___pexMEduONrMRgmz48A" y="-530"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_A___ouxMEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_A___o-xMEduONrMRgmz48A" points="[-14, 860, -14, -2435]$[-14, 2448, -14, -847]"/>
-            </edges>
-            <edges xmi:id="_LAqzkexxEduM14unWaqP5Q" element="_GNkB8OxSEduONrMRgmz48A" source="_HKDZkOfXEduqHoOJbURZRw" target="_LAqzgOxxEduM14unWaqP5Q">
-              <children xmi:id="_LAqzlOxxEduM14unWaqP5Q" type="KindLabel">
-                <children xmi:id="_LAqzluxxEduM14unWaqP5Q" type="Stereotype"/>
-                <children xmi:id="_LAqzmOxxEduM14unWaqP5Q" type="Kind"/>
-                <children xmi:id="_LAqzl-xxEduM14unWaqP5Q" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LAqzlexxEduM14unWaqP5Q" x="424" y="-645"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_LAqzkuxxEduM14unWaqP5Q" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_LAqzk-xxEduM14unWaqP5Q" points="[-14, 846, -2977, -2447]$[2950, 2433, -13, -860]"/>
-            </edges>
-            <edges xmi:id="_RcqfMex0Edu5-vVjlfVsfQ" element="_RcqfMOx0Edu5-vVjlfVsfQ" source="_HKDZkOfXEduqHoOJbURZRw" target="_-_T6cOxwEduM14unWaqP5Q">
-              <children xmi:id="_RczpIOx0Edu5-vVjlfVsfQ" type="KindLabel">
-                <children xmi:id="_RczpIux0Edu5-vVjlfVsfQ" type="Stereotype"/>
-                <children xmi:id="_RczpJOx0Edu5-vVjlfVsfQ" type="Kind"/>
-                <children xmi:id="_RczpI-x0Edu5-vVjlfVsfQ" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_RczpIex0Edu5-vVjlfVsfQ" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_RcqfMux0Edu5-vVjlfVsfQ" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_RcqfM-x0Edu5-vVjlfVsfQ" points="[-23, 32, 88, -92]$[-87, 157, 24, 33]"/>
-            </edges>
-          </contents>
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41FDD551037C" type="Class" name="Taxonomy">
-            <children xmi:id="_HKDZrefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-              <children xmi:id="_HKDZsOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKDZsefXEduqHoOJbURZRw" width="3115" height="1117"/>
-              </children>
-              <children xmi:id="_HKDZsufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKDZs-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKDZtOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKDZtefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZtufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZt-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZuOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZuefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZuufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZu-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKDZvOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKDZrufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZr-fXEduqHoOJbURZRw" x="12920" y="1016"/>
-            </children>
-            <children xmi:id="_HKDZvefXEduqHoOJbURZRw" element="_3ADC7B74022D41FED88101B5">
-              <children xmi:id="_HKDZwOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKDZwefXEduqHoOJbURZRw" width="2472" height="1049"/>
-              </children>
-              <children xmi:id="_HKDZwufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKDZw-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKDZxOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKDZxefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZxufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZx-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZyOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZyefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZyufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZy-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKDZzOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKDZvufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZv-fXEduqHoOJbURZRw" x="3081" y="3437"/>
-            </children>
-            <children xmi:id="_HKDZ1ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03AB">
-              <children xmi:id="_HKDZ2efXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKDZ2ufXEduqHoOJbURZRw" width="3606" height="1032"/>
-              </children>
-              <children xmi:id="_HKDZ2-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKDZ3OfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKDZ3efXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKDZ3ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZ3-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZ4OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZ4efXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZ4ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZ4-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZ5OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKDZ5efXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKDZ1-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZ2OfXEduqHoOJbURZRw" x="17754" y="5782"/>
-            </children>
-            <children xmi:id="_HKDZ5ufXEduqHoOJbURZRw" element="_3ADC7B74022D41FEDE75004E">
-              <children xmi:id="_HKDZ6efXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKDZ6ufXEduqHoOJbURZRw" width="2573" height="1032"/>
-              </children>
-              <children xmi:id="_HKDZ6-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKDZ7OfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKDZ7efXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKDZ7ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZ7-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZ8OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZ8efXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZ8ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKDZ8-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKDZ9OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKDZ9efXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKDZ5-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZ6OfXEduqHoOJbURZRw" x="7603" y="7967"/>
-            </children>
-            <children xmi:id="_HKNKkOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FEDE800252">
-              <children xmi:id="_HKNKk-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKNKlOfXEduqHoOJbURZRw" width="3437" height="1032"/>
-              </children>
-              <children xmi:id="_HKNKlefXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKNKlufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKNKl-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKNKmOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKmefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKmufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKm-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKnOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKnefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKnufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKNKn-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKNKkefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNKkufXEduqHoOJbURZRw" x="2599" y="5782"/>
-            </children>
-            <children xmi:id="_HKNKqefXEduqHoOJbURZRw" element="_3ADC7B74022D41DDFA3602C1">
-              <children xmi:id="_HKNKrOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKNKrefXEduqHoOJbURZRw" width="2218" height="1032"/>
-              </children>
-              <children xmi:id="_HKNKrufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKNKr-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKNKsOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKNKsefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKsufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKs-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKtOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKtefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKtufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKt-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKNKuOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKNKqufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNKq-fXEduqHoOJbURZRw" x="10828" y="3445"/>
-            </children>
-            <children xmi:id="_HKNKuefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5700EF">
-              <children xmi:id="_HKNKvOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKNKvefXEduqHoOJbURZRw" width="3606" height="1032"/>
-              </children>
-              <children xmi:id="_HKNKvufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKNKv-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKNKwOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKNKwefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKwufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKw-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKxOfXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKxefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNKxufXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNKx-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKNKyOfXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKNKuufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNKu-fXEduqHoOJbURZRw" x="17039" y="3471"/>
-            </children>
-            <children xmi:id="_HKNK0ufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03B5">
-              <children xmi:id="_HKNK1efXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKNK1ufXEduqHoOJbURZRw" width="3606" height="1032"/>
-              </children>
-              <children xmi:id="_HKNK1-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKNK2OfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKNK2efXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKNK2ufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNK2-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNK3OfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNK3efXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNK3ufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNK3-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNK4OfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKNK4efXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKNK0-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNK1OfXEduqHoOJbURZRw" x="7594" y="5782"/>
-            </children>
-            <children xmi:id="_HKNK9OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0104">
-              <children xmi:id="_HKNK9-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HKNK-OfXEduqHoOJbURZRw" width="2743" height="1032"/>
-              </children>
-              <children xmi:id="_HKNK-efXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HKNK-ufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HKNK--fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HKNK_OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNK_efXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNK_ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNK_-fXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNLAOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HKNLAefXEduqHoOJbURZRw"/>
-              </children>
-              <children xmi:id="_HKNLAufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HKNLA-fXEduqHoOJbURZRw" canonical="false"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HKNK9efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showParent="Name" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNK9ufXEduqHoOJbURZRw" x="13106" y="5782"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GwbYqufXEduqHoOJbURZRw"/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_HKDZzefXEduqHoOJbURZRw" element="_3ADC7B74022D41FED89103AD" source="_HKDZvefXEduqHoOJbURZRw" target="_HKDZrefXEduqHoOJbURZRw">
-              <children xmi:id="_HKDZ0OfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKDZ0ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKDZ0-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZ0efXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKDZzufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKDZz-fXEduqHoOJbURZRw" points="[1236, -304, -8923, 2082]$[8593, -2032, -1566, 355]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKDZ1OfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKDZ1efXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HKDZ9ufXEduqHoOJbURZRw" element="_3ADC7B74022D41FEE0C503A1" source="_HKDZ5ufXEduqHoOJbURZRw" target="_HKDZvefXEduqHoOJbURZRw">
-              <children xmi:id="_HKDZ-efXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKDZ--fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKDZ_OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKDZ-ufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKDZ9-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKDZ-OfXEduqHoOJbURZRw" points="[-533, -524, 4038, 3996]$[-4038, -3996, 533, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKDZ_efXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKDZ_ufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HKNKoOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FEE0C90194" source="_HKNKkOfXEduqHoOJbURZRw" target="_HKDZvefXEduqHoOJbURZRw">
-              <children xmi:id="_HKNKo-fXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKNKpefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKNKpufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNKpOfXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKNKoefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKNKoufXEduqHoOJbURZRw" points="[0, -524, 0, 1811]$[0, -1811, 0, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNKp-fXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNKqOfXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HKNKyefXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0263" source="_HKDZ1ufXEduqHoOJbURZRw" target="_HKNKuefXEduqHoOJbURZRw">
-              <children xmi:id="_HKNKzOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKNKzufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKNKz-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNKzefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKNKyufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKNKy-fXEduqHoOJbURZRw" points="[0, -524, 0, 1811]$[0, -1820, 0, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNK0OfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNK0efXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HKNK4ufXEduqHoOJbURZRw" element="_3ADC7B74022D41FFDF820166" source="_HKNK0ufXEduqHoOJbURZRw" target="_HKDZvefXEduqHoOJbURZRw">
-              <children xmi:id="_HKNK5efXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKNK5-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKNK6OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNK5ufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKNK4-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKNK5OfXEduqHoOJbURZRw" points="[-1126, -524, 3953, 1811]$[-3937, -1811, 1143, 524]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNK6efXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNK6ufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HKNK6-fXEduqHoOJbURZRw" element="_3ADC7B74022D42518C93008F" source="_HKNK0ufXEduqHoOJbURZRw" target="_HKNKqefXEduqHoOJbURZRw">
-              <children xmi:id="_HKNK7ufXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKNK8OfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKNK8efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNK7-fXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKNK7OfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKNK7efXEduqHoOJbURZRw" points="[558, -524, -1981, 1811]$[1964, -1820, -575, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNK8ufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNK8-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HKNLDefXEduqHoOJbURZRw" element="_3ADC7B74022D41FADC01028D" source="_HKNK9OfXEduqHoOJbURZRw" target="_HKDZrefXEduqHoOJbURZRw">
-              <children xmi:id="_HKNLEOfXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKNLEufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKNLE-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNLEefXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKNLDufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKNLD-fXEduqHoOJbURZRw" points="[0, -524, 0, 4199]$[0, -4165, 0, 558]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNLFOfXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNLFefXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_HKNLFufXEduqHoOJbURZRw" element="_3ADC7B74022D42518BD701E3" source="_HKNK9OfXEduqHoOJbURZRw" target="_HKNKqefXEduqHoOJbURZRw">
-              <children xmi:id="_HKNLGefXEduqHoOJbURZRw" type="NameLabel">
-                <children xmi:id="_HKNLG-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HKNLHOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HKNLGufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HKNLF-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HKNLGOfXEduqHoOJbURZRw" points="[-567, -524, 1972, 1811]$[-1981, -1820, 558, 516]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNLHefXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HKNLHufXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-          </contents>
-        </eAnnotations>
-        <ownedComment xmi:id="_GvPF2ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C57003B">
-          <body>04</body>
-        </ownedComment>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41FEDB38011E" name="LibraryConfigurations">
-          <eAnnotations xmi:id="_Gv-sxufXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D40F36D7B0305">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D40F36D7B0305" type="Class" name="MethodLibraryAndConfigurations">
-              <children xmi:id="_HJA3wOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0104">
-                <children xmi:id="_HJA3w-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJA3xOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJA3xefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJA3xufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJA3x-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJA3yOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA3yefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA3yufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA3y-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA3zOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA3zefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA3zufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJA3z-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJA3wefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA3wufXEduqHoOJbURZRw" x="1083" y="3810" width="3725" height="2336"/>
-              </children>
-              <children xmi:id="_HJA30OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E013F">
-                <children xmi:id="_HJA30-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJA31OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJA31efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJA31ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJA31-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJA32OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA32efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA32ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA32-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA33OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA33efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA33ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJA33-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJA30efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA30ufXEduqHoOJbURZRw" x="1439" y="9127"/>
-              </children>
-              <children xmi:id="_HJA4A-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03B5">
-                <children xmi:id="_HJA4BufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJA4B-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJA4COfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJA4CefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJA4CufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJA4C-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4DOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4DefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4DufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4D-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4EOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4EefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJA4EufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJA4BOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA4BefXEduqHoOJbURZRw" x="5005" y="99" width="5130" height="2226"/>
-              </children>
-              <children xmi:id="_HJA4NufXEduqHoOJbURZRw" element="_3ADC7B74022D41EF09580152">
-                <children xmi:id="_HJA4OefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJA4OufXEduqHoOJbURZRw" width="3589" height="1032"/>
-                </children>
-                <children xmi:id="_HJA4O-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJA4POfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJA4PefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJA4PufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4P-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4QOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4QefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4QufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4Q-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4ROfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJA4RefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJA4N-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA4OOfXEduqHoOJbURZRw" x="15985" y="7459"/>
-              </children>
-              <children xmi:id="_HJA4RufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0244">
-                <children xmi:id="_HJA4SefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJA4SufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJA4S-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJA4TOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJA4TefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJA4TufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4T-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4UOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4UefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4UufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4U-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJA4VOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJA4VefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJA4R-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA4SOfXEduqHoOJbURZRw" x="9474" y="10930" width="4123" height="1109"/>
-              </children>
-              <children xmi:id="_HJA4VufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5700EF">
-                <children xmi:id="_HJA4WefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJA4WufXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJA4W-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJA4XOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJA4XefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJA4XufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4X-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJKBsOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKBsefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJKBsufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKBs-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJKBtOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJKBtefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJA4V-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA4WOfXEduqHoOJbURZRw" x="10336" y="3810" width="4466" height="2336"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_Gv-syOfXEduqHoOJbURZRw" description="The Library Configurations package adds additional capabilities for packaging Method Plugins and scaling method and process authoring work.  It defines the key concept of Library which comprises of Method Plugins as well as Method Configurations.  A Library represents the overall physical container for all Method Elements.  Libraries represent a separate Method 'universe', i.e. a Method Library cannot reference elements from another Method Library.  A Configuration is a subset of Plugins and Method Packages, i.e. selections of Method Plugins with a selected subset of Method Packages.  They are used to define working sets for process authoring providing a process engineer only with lists of elements to be used for creating process within such a Configuration.  Configurations also define the space of variability interpretation to avoid conflicts amongst 'competing' content (e.g. content that replaces the same elements) as well as define sets of Method Content and Processes for export and distribution."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HJA34OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C6002D5" source="_HJA30OfXEduqHoOJbURZRw" target="_HJA3wOfXEduqHoOJbURZRw">
-                <children xmi:id="_HJA34-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJA35efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJA35ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA35OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJA35-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C6002D8">
-                  <children xmi:id="_HJA36efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA36OfXEduqHoOJbURZRw" x="84" y="-398"/>
-                </children>
-                <children xmi:id="_HJA36ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C6002D8">
-                  <children xmi:id="_HJA37OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA36-fXEduqHoOJbURZRw" x="160" y="1626"/>
-                </children>
-                <children xmi:id="_HJA37efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C6002D6">
-                  <children xmi:id="_HJA37-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA37ufXEduqHoOJbURZRw" x="-278" y="-279"/>
-                </children>
-                <children xmi:id="_HJA38OfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C6002D6">
-                  <children xmi:id="_HJA38ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA38efXEduqHoOJbURZRw" x="146" y="356"/>
-                </children>
-                <children xmi:id="_HJA38-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C6002D8">
-                  <children xmi:id="_HJA39efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA39ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA39OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJA39-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C6002D6">
-                  <children xmi:id="_HJA3-efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA3-ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA3-OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJA3--fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C6002D8">
-                  <children xmi:id="_HJA3_efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA3_ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA3_OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJA3_-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C6002D6">
-                  <children xmi:id="_HJA4AefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4AufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4AOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJA34efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJA34ufXEduqHoOJbURZRw" points="[59, -575, 59, 4148]$[59, -3564, 59, 1159]"/>
-              </edges>
-              <edges xmi:id="_HJA4E-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0282" source="_HJA3wOfXEduqHoOJbURZRw" target="_HJA4A-fXEduqHoOJbURZRw">
-                <children xmi:id="_HJA4FufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJA4GOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJA4GefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJA4F-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJA4GufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0285">
-                  <children xmi:id="_HJA4HOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4G-fXEduqHoOJbURZRw" x="-204" y="-169"/>
-                </children>
-                <children xmi:id="_HJA4HefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0285">
-                  <children xmi:id="_HJA4H-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4HufXEduqHoOJbURZRw" x="-170" y="1380"/>
-                </children>
-                <children xmi:id="_HJA4IOfXEduqHoOJbURZRw" visible="false" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0283">
-                  <children xmi:id="_HJA4IufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4IefXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HJA4I-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0283">
-                  <children xmi:id="_HJA4JefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4JOfXEduqHoOJbURZRw" x="127" y="-347"/>
-                </children>
-                <children xmi:id="_HJA4JufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0285">
-                  <children xmi:id="_HJA4KOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4KefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4J-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJA4KufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0283">
-                  <children xmi:id="_HJA4LOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4LefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4K-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJA4LufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0285">
-                  <children xmi:id="_HJA4MOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4MefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4L-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJA4MufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0283">
-                  <children xmi:id="_HJA4NOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJA4NefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJA4M-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJA4FOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJA4FefXEduqHoOJbURZRw" points="[93, -1168, -4478, 2336]$[93, -3378, -4478, 127]$[2006, -3378, -2565, 127]"/>
-              </edges>
-              <edges xmi:id="_HJKBtufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0215" source="_HJA3wOfXEduqHoOJbURZRw" target="_HJA4VufXEduqHoOJbURZRw">
-                <children xmi:id="_HJKBuefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJKBu-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJKBvOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJKBuufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKBvefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F021D">
-                  <children xmi:id="_HJKBv-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKBvufXEduqHoOJbURZRw" x="-185" y="-254"/>
-                </children>
-                <children xmi:id="_HJKBwOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F021D">
-                  <children xmi:id="_HJKBwufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKBwefXEduqHoOJbURZRw" x="1390" y="237"/>
-                </children>
-                <children xmi:id="_HJKBw-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0216">
-                  <children xmi:id="_HJKBxefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKBxOfXEduqHoOJbURZRw" x="296" y="-118"/>
-                </children>
-                <children xmi:id="_HJKBxufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0216">
-                  <children xmi:id="_HJKByOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKBx-fXEduqHoOJbURZRw" x="296" y="356"/>
-                </children>
-                <children xmi:id="_HJKByefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F021D">
-                  <children xmi:id="_HJKBy-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKBzOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKByufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKBzefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0216">
-                  <children xmi:id="_HJKBz-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKB0OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKBzufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKB0efXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F021D">
-                  <children xmi:id="_HJKB0-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKB1OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB0ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJKB1efXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0216">
-                  <children xmi:id="_HJKB1-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKB2OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB1ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJKBt-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJKBuOfXEduqHoOJbURZRw" points="[1862, 601, -7840, 601]$[7840, 601, -1862, 601]"/>
-              </edges>
-              <edges xmi:id="_HJKB2efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0245" source="_HJA30OfXEduqHoOJbURZRw" target="_HJA4VufXEduqHoOJbURZRw">
-                <children xmi:id="_HJKB3OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJKB3ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJKB3-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJKB3efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKB4OfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0248">
-                  <children xmi:id="_HJKB4ufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB4efXEduqHoOJbURZRw" x="-840" y="279"/>
-                </children>
-                <children xmi:id="_HJKB4-fXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0248">
-                  <children xmi:id="_HJKB5efXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB5OfXEduqHoOJbURZRw" x="853" y="-203"/>
-                </children>
-                <children xmi:id="_HJKB5ufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0246">
-                  <children xmi:id="_HJKB6OfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB5-fXEduqHoOJbURZRw" x="1161" y="-160"/>
-                </children>
-                <children xmi:id="_HJKB6efXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0246">
-                  <children xmi:id="_HJKB6-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB6ufXEduqHoOJbURZRw" x="501" y="356"/>
-                </children>
-                <children xmi:id="_HJKB7OfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0248">
-                  <children xmi:id="_HJKB7ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKB7-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB7efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKB8OfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0246">
-                  <children xmi:id="_HJKB8ufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKB8-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB8efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKB9OfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0248">
-                  <children xmi:id="_HJKB9ufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKB9-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB9efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJKB-OfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0246">
-                  <children xmi:id="_HJKB-ufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKB--fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKB-efXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJKB2ufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJKB2-fXEduqHoOJbURZRw" points="[1507, -152, -8195, 4572]$[8051, -152, -1651, 4572]$[8051, -3556, -1651, 1168]"/>
-              </edges>
-              <edges xmi:id="_HJKB_OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F87BF60126" source="_HJA4A-fXEduqHoOJbURZRw" target="_HJA4VufXEduqHoOJbURZRw">
-                <children xmi:id="_HJKB_-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJKCAefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJKCAufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJKCAOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCA-fXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D40F87BF70093">
-                  <children xmi:id="_HJKCBefXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCBOfXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HJKCBufXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D40F87BF70093">
-                  <children xmi:id="_HJKCCOfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCB-fXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HJKCCefXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F87BF70091">
-                  <children xmi:id="_HJKCC-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCCufXEduqHoOJbURZRw" x="157" y="169"/>
-                </children>
-                <children xmi:id="_HJKCDOfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F87BF70091">
-                  <children xmi:id="_HJKCDufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCDefXEduqHoOJbURZRw" x="225" y="-2235"/>
-                </children>
-                <children xmi:id="_HJKCD-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F87BF70093">
-                  <children xmi:id="_HJKCEefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCEufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCEOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCE-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F87BF70091">
-                  <children xmi:id="_HJKCFefXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCFufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCFOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCF-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F87BF70093">
-                  <children xmi:id="_HJKCGefXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCGufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCGOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJKCG-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F87BF70091">
-                  <children xmi:id="_HJKCHefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCHufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCHOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJKB_efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJKB_ufXEduqHoOJbURZRw" points="[2565, 101, -2565, -3403]$[5046, 101, -84, -3403]$[5046, 2336, -84, -1168]"/>
-              </edges>
-              <edges xmi:id="_HJKCH-fXEduqHoOJbURZRw" element="_3ADC7B74022D41EF09980110" source="_HJA4VufXEduqHoOJbURZRw" target="_HJA4NufXEduqHoOJbURZRw">
-                <children xmi:id="_HJKCIufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJKCJOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJKCJefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJKCI-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCJufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41EF09980112">
-                  <children xmi:id="_HJKCKOfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCJ-fXEduqHoOJbURZRw" x="-208" y="228"/>
-                </children>
-                <children xmi:id="_HJKCKefXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41EF09980112">
-                  <children xmi:id="_HJKCK-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCKufXEduqHoOJbURZRw" x="-208" y="-1355"/>
-                </children>
-                <children xmi:id="_HJKCLOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41EF09980111">
-                  <children xmi:id="_HJKCLufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCLefXEduqHoOJbURZRw" x="420" y="-169"/>
-                </children>
-                <children xmi:id="_HJKCL-fXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41EF09980111">
-                  <children xmi:id="_HJKCMefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCMOfXEduqHoOJbURZRw" x="268" y="356"/>
-                </children>
-                <children xmi:id="_HJKCMufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41EF09980112">
-                  <children xmi:id="_HJKCNOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCNefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCM-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCNufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41EF09980111">
-                  <children xmi:id="_HJKCOOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCOefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCN-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCOufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41EF09980112">
-                  <children xmi:id="_HJKCPOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCPefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCO-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJKCPufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41EF09980111">
-                  <children xmi:id="_HJKCQOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCQefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCP-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJKCIOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJKCIefXEduqHoOJbURZRw" points="[1244, 1164, -3095, -1614]$[1244, 2646, -3095, -132]$[3413, 2646, -926, -132]"/>
-              </edges>
-              <edges xmi:id="_HJKCQufXEduqHoOJbURZRw" element="_3ADC7B74022D41EF099F017E" source="_HJA4VufXEduqHoOJbURZRw" target="_HJA4NufXEduqHoOJbURZRw">
-                <children xmi:id="_HJKCRefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJKCR-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJKCSOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJKCRufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCSefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41EF099F0180">
-                  <children xmi:id="_HJKCS-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCSufXEduqHoOJbURZRw" x="-265" y="262"/>
-                </children>
-                <children xmi:id="_HJKCTOfXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D41EF099F0180">
-                  <children xmi:id="_HJKCTufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCTefXEduqHoOJbURZRw" x="395" y="-229"/>
-                </children>
-                <children xmi:id="_HJKCT-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41EF099F017F">
-                  <children xmi:id="_HJKCUefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCUOfXEduqHoOJbURZRw" x="621" y="152"/>
-                </children>
-                <children xmi:id="_HJKCUufXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D41EF099F017F">
-                  <children xmi:id="_HJKCVOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCU-fXEduqHoOJbURZRw" x="265" y="347"/>
-                </children>
-                <children xmi:id="_HJKCVefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41EF099F0180">
-                  <children xmi:id="_HJKCV-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCWOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCVufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCWefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41EF099F017F">
-                  <children xmi:id="_HJKCW-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCXOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCWufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJKCXefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41EF099F0180">
-                  <children xmi:id="_HJKCX-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCYOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCXufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJKCYefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41EF099F017F">
-                  <children xmi:id="_HJKCY-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJKCZOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJKCYufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJKCQ-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJKCROfXEduqHoOJbURZRw" points="[1862, 364, -3268, -2633]$[5071, 364, -59, -2633]$[5071, 2480, -59, -516]"/>
-              </edges>
-              <edges xmi:id="_HJKCZefXEduqHoOJbURZRw" element="_3ADC7B74022D4276CE5203B0" source="_HJA4VufXEduqHoOJbURZRw" target="_HJA4VufXEduqHoOJbURZRw">
-                <children xmi:id="_HJTysOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJTysufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJTys-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJTysefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTytOfXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4276CE5602A9">
-                  <children xmi:id="_HJTytufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTytefXEduqHoOJbURZRw" x="-32" y="-262"/>
-                </children>
-                <children xmi:id="_HJTyt-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4276CE5602A9">
-                  <children xmi:id="_HJTyuefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTyuOfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HJTyuufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4276CE5602A7">
-                  <children xmi:id="_HJTyvOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTyu-fXEduqHoOJbURZRw" x="-279" y="-187"/>
-                </children>
-                <children xmi:id="_HJTyvefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4276CE5602A7">
-                  <children xmi:id="_HJTyv-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTyvufXEduqHoOJbURZRw" x="234" y="-1491"/>
-                </children>
-                <children xmi:id="_HJTywOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4276CE5602A9">
-                  <children xmi:id="_HJTywufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTyw-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTywefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTyxOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4276CE5602A7">
-                  <children xmi:id="_HJTyxufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTyx-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTyxefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTyyOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4276CE5602A9">
-                  <children xmi:id="_HJTyyufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTyy-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTyyefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJTyzOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4276CE5602A7">
-                  <children xmi:id="_HJTyzufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTyz-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTyzefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJKCZufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJKCZ-fXEduqHoOJbURZRw" points="[-1405, -1168, -1405, -1168]$[-1405, -1989, -1405, -1989]$[-3496, -1989, -3496, -1989]$[-3496, -389, -3496, -389]$[-1862, -389, -1862, -389]"/>
-              </edges>
-              <edges xmi:id="_HJTy0OfXEduqHoOJbURZRw" element="_3ADC7B74022D420D3F000396" source="_HJA4RufXEduqHoOJbURZRw" target="_HJA4VufXEduqHoOJbURZRw">
-                <children xmi:id="_HJTy0-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJTy1efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJTy1ufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJTy1OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTy1-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D420D3F000398">
-                  <children xmi:id="_HJTy2efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy2OfXEduqHoOJbURZRw" x="163" y="170"/>
-                </children>
-                <children xmi:id="_HJTy2ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D420D3F000398">
-                  <children xmi:id="_HJTy3OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy2-fXEduqHoOJbURZRw" x="-269" y="1254"/>
-                </children>
-                <children xmi:id="_HJTy3efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D420D3F000397">
-                  <children xmi:id="_HJTy3-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy3ufXEduqHoOJbURZRw" x="357" y="-143"/>
-                </children>
-                <children xmi:id="_HJTy4OfXEduqHoOJbURZRw" visible="false" type="FromRoleLabel" element="_3ADC7B74022D420D3F000397">
-                  <children xmi:id="_HJTy4ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy4efXEduqHoOJbURZRw" x="230" y="-347"/>
-                </children>
-                <children xmi:id="_HJTy4-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D420D3F000398">
-                  <children xmi:id="_HJTy5efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTy5ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy5OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTy5-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D420D3F000397">
-                  <children xmi:id="_HJTy6efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTy6ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy6OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTy6-fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D420D3F000398">
-                  <children xmi:id="_HJTy7efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTy7ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy7OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJTy7-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D420D3F000397">
-                  <children xmi:id="_HJTy8efXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTy8ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy8OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJTy0efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJTy0ufXEduqHoOJbURZRw" points="[423, -558, -694, 5943]$[423, -5342, -694, 1159]"/>
-              </edges>
-              <edges xmi:id="_HJTy8-fXEduqHoOJbURZRw" element="_3ADC7B74022D421291CD018B" source="_HJA4VufXEduqHoOJbURZRw" target="_HJA4RufXEduqHoOJbURZRw">
-                <children xmi:id="_HJTy9ufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJTy-OfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJTy-efXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJTy9-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTy-ufXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D421291D00059">
-                  <children xmi:id="_HJTy_OfXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy--fXEduqHoOJbURZRw" x="-355" y="144"/>
-                </children>
-                <children xmi:id="_HJTy_efXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D421291D00059">
-                  <children xmi:id="_HJTy_-fXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTy_ufXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HJTzAOfXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D421291D00045">
-                  <children xmi:id="_HJTzAufXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzAefXEduqHoOJbURZRw" x="-144" y="195"/>
-                </children>
-                <children xmi:id="_HJTzA-fXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D421291D00045">
-                  <children xmi:id="_HJTzBefXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzBOfXEduqHoOJbURZRw" x="220" y="999"/>
-                </children>
-                <children xmi:id="_HJTzBufXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D421291D00059">
-                  <children xmi:id="_HJTzCOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzCefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzB-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzCufXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D421291D00045">
-                  <children xmi:id="_HJTzDOfXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzDefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzC-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzDufXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D421291D00059">
-                  <children xmi:id="_HJTzEOfXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzEefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzD-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJTzEufXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D421291D00045">
-                  <children xmi:id="_HJTzFOfXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzFefXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzE-fXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJTy9OfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJTy9efXEduqHoOJbURZRw" points="[-1143, 1159, -25, -5342]$[-1143, 5943, -25, -558]"/>
-              </edges>
-              <edges xmi:id="_HJTzFufXEduqHoOJbURZRw" element="_3ADC7B74022D4558EF7C0353" source="_HJA4VufXEduqHoOJbURZRw" target="_HJA4RufXEduqHoOJbURZRw">
-                <children xmi:id="_HJTzGefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJTzG-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJTzHOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJTzGufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzHefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D4558EF7E0056">
-                  <children xmi:id="_HJTzH-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzHufXEduqHoOJbURZRw" x="-924" y="-203"/>
-                </children>
-                <children xmi:id="_HJTzIOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4558EF7E0056">
-                  <children xmi:id="_HJTzIufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzIefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HJTzI-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4558EF7E0042">
-                  <children xmi:id="_HJTzJefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzJOfXEduqHoOJbURZRw" x="796" y="93"/>
-                </children>
-                <children xmi:id="_HJTzJufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4558EF7E0042">
-                  <children xmi:id="_HJTzKOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzJ-fXEduqHoOJbURZRw" x="1090" y="-588"/>
-                </children>
-                <children xmi:id="_HJTzKefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4558EF7E0056">
-                  <children xmi:id="_HJTzK-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzLOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzKufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzLefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4558EF7E0042">
-                  <children xmi:id="_HJTzL-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzMOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzLufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzMefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4558EF7E0056">
-                  <children xmi:id="_HJTzM-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzNOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzMufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJTzNefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4558EF7E0042">
-                  <children xmi:id="_HJTzN-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzOOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzNufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJTzF-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJTzGOfXEduqHoOJbURZRw" points="[42, 1168, 1159, -5334]$[42, 5080, 1159, -1422]$[2218, 5080, 3335, -1422]$[2218, 6180, 3335, -321]$[939, 6180, 2057, -321]"/>
-              </edges>
-              <edges xmi:id="_HJTzOefXEduqHoOJbURZRw" element="_3ADC7B74022D4559006A0317" source="_HJA4VufXEduqHoOJbURZRw" target="_HJA4RufXEduqHoOJbURZRw">
-                <children xmi:id="_HJTzPOfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJTzPufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJTzP-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJTzPefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzQOfXEduqHoOJbURZRw" visible="false" type="ToMultiplicityLabel" element="_3ADC7B74022D4559006B027A">
-                  <children xmi:id="_HJTzQufXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzQefXEduqHoOJbURZRw" y="396"/>
-                </children>
-                <children xmi:id="_HJTzQ-fXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D4559006B027A">
-                  <children xmi:id="_HJTzRefXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzROfXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HJTzRufXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D4559006B0270">
-                  <children xmi:id="_HJTzSOfXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzR-fXEduqHoOJbURZRw" x="1261" y="144"/>
-                </children>
-                <children xmi:id="_HJTzSefXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D4559006B0270">
-                  <children xmi:id="_HJTzS-fXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzSufXEduqHoOJbURZRw" x="474" y="2658"/>
-                </children>
-                <children xmi:id="_HJTzTOfXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D4559006B027A">
-                  <children xmi:id="_HJTzTufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzT-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzTefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzUOfXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D4559006B0270">
-                  <children xmi:id="_HJTzUufXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzU-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzUefXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJTzVOfXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D4559006B027A">
-                  <children xmi:id="_HJTzVufXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzV-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzVefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJTzWOfXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D4559006B0270">
-                  <children xmi:id="_HJTzWufXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJTzW-fXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJTzWefXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJTzOufXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJTzO-fXEduqHoOJbURZRw" points="[711, 1168, 1828, -5334]$[711, 4334, 1828, -2167]$[3852, 4334, 4969, -2167]$[3852, 6739, 4969, 237]$[939, 6739, 2057, 237]"/>
-              </edges>
-            </contents>
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D4176A3EC0027" type="Class" name="ProcessFamily">
-              <children xmi:id="_HJdjsOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5700EF">
-                <children xmi:id="_HJdjs-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJdjtOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJdjtefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJdjtufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJdjt-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJdjuOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdjuefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdjuufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdju-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdjvOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdjvefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdjvufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJdjv-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJdjsefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJdjsufXEduqHoOJbURZRw" x="668" y="914"/>
-              </children>
-              <children xmi:id="_HJdjwOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0077">
-                <children xmi:id="_HJdjw-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJdjxOfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJdjxefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJdjxufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJdjx-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJdjyOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdjyefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdjyufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdjy-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdjzOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdjzefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdjzufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJdjz-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJdjwefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJdjwufXEduqHoOJbURZRw" x="9110" y="3776" width="3282" height="1083"/>
-              </children>
-              <children xmi:id="_HJdj0OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03AB">
-                <children xmi:id="_HJdj0-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJdj1OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-                </children>
-                <children xmi:id="_HJdj1efXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJdj1ufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJdj1-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJdj2OfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdj2efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdj2ufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdj2-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdj3OfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdj3efXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJdj3ufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJdj3-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJdj0efXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJdj0ufXEduqHoOJbURZRw" x="1024" y="3860"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GwH2oefXEduqHoOJbURZRw" description="This diagram shows how processes are packaged in methodlibrary and related to configurations."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HJdj4OfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0264" source="_HJdjwOfXEduqHoOJbURZRw" target="_HJdj0OfXEduqHoOJbURZRw">
-                <children xmi:id="_HJdj4-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJdj5efXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJdj5ufXEduqHoOJbURZRw" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJdj5OfXEduqHoOJbURZRw" x="-699" y="-331"/>
-                </children>
-                <children xmi:id="_HJdj5-fXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D40F36C5F0267">
-                  <children xmi:id="_HJdj6efXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdj6OfXEduqHoOJbURZRw" x="-55" y="205"/>
-                </children>
-                <children xmi:id="_HJdj6ufXEduqHoOJbURZRw" type="ToRoleLabel" element="_3ADC7B74022D40F36C5F0267">
-                  <children xmi:id="_HJdj7OfXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdj6-fXEduqHoOJbURZRw" x="1049" y="-229"/>
-                </children>
-                <children xmi:id="_HJdj7efXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D40F36C5F0265">
-                  <children xmi:id="_HJdj7-fXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdj7ufXEduqHoOJbURZRw" x="339" y="-288"/>
-                </children>
-                <children xmi:id="_HJdj8OfXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D40F36C5F0265">
-                  <children xmi:id="_HJdj8ufXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdj8efXEduqHoOJbURZRw" x="-669" y="230"/>
-                </children>
-                <children xmi:id="_HJdj8-fXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D40F36C5F0267">
-                  <children xmi:id="_HJdj9efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdj9ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdj9OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJdj9-fXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D40F36C5F0265">
-                  <children xmi:id="_HJdj-efXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdj-ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdj-OfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJdj--fXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D40F36C5F0267">
-                  <children xmi:id="_HJdj_efXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdj_ufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdj_OfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJdj_-fXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D40F36C5F0265">
-                  <children xmi:id="_HJdkAefXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJdkAufXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJdkAOfXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJdj4efXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJdj4ufXEduqHoOJbURZRw" points="[-1456, 33, 6671, 33]$[-6714, 33, 1413, 33]"/>
-              </edges>
-              <edges xmi:id="_HJdkA-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5F0263" source="_HJdj0OfXEduqHoOJbURZRw" target="_HJdjsOfXEduqHoOJbURZRw">
-                <children xmi:id="_HJdkBufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJdkCOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJdkCefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJdkB-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJdkBOfXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJdkBefXEduqHoOJbURZRw" points="[0, -457, -50, 2489]$[0, -2489, -50, 457]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJdkCufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJdkC-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GvYPy-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41FEDB38011E">
-            <body>02</body>
-          </ownedComment>
-          <packageMerge xmi:id="_A___oOxMEduONrMRgmz48A" mergedPackage="_3ADC7B74022D41FEDDB60306"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5700EF" name="MethodConfiguration">
-            <ownedComment xmi:id="_GvYP3OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5700EF">
-              <body>A Method Configuration is a collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D44565BB1015F" general="_3ADC7B74022D41FED88101B5"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F021D" name="methodPluginSelection" visibility="public" type="_3ADC7B74022D40F36C5E0104" association="_3ADC7B74022D40F36C5F0215">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GviA1OfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GviA0-fXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0248" name="methodPackageSelection" visibility="public" type="_3ADC7B74022D40F36C5E013F" association="_3ADC7B74022D40F36C5F0245">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvrxxufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvrxxefXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D420D3F000398" name="processViews" visibility="public" type="_3ADC7B74022D40F36C5E0244" association="_3ADC7B74022D420D3F000396">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv07zefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv07zOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D421291D00045" name="defaultView" visibility="public" type="_3ADC7B74022D40F36C5E0244" association="_3ADC7B74022D421291CD018B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv070efXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv070OfXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4276CE5602A7" name="baseConfigurations" visibility="public" type="_3ADC7B74022D40F36C5700EF" association="_3ADC7B74022D4276CE5203B0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv-stufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv-stefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4558EF7E0042" name="subtractedCategory" visibility="public" type="_3ADC7B74022D40F36C5E0244" association="_3ADC7B74022D4558EF7C0353">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv-svefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv-svOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D4559006B0270" name="addedCategory" visibility="public" type="_3ADC7B74022D40F36C5E0244" association="_3ADC7B74022D4559006A0317">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv-sxOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv-sw-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5D03AB" name="ProcessFamily">
-            <ownedComment xmi:id="_GvYP4OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5D03AB">
-              <body>A Delivery Model Family is a convenient grouping of Delivery Processes and Capability Patterns of interest to some specific user community.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D40F36C5F0263" general="_3ADC7B74022D40F36C5700EF"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0267" name="deliveryProcesses" visibility="public" type="_3ADC7B74022D40F36C5E0077" association="_3ADC7B74022D40F36C5F0264">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gvrxz-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvrxzufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41EF09580152" name="Process" isAbstract="true">
-            <ownedComment xmi:id="_GviAw-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41EF09580152">
-              <body>Process in the package Library Configuration extends the class Process with association relating a Process to one default and many optional valid Configurations.
-These configurations describe valid contexts for the Process within a Method Library indicating under which Configurations a Process is well defined.
-</body>
-            </ownedComment>
-            <ownedAttribute xmi:id="_3ADC7B74022D41EF09980112" name="defaultContext" visibility="public" type="_3ADC7B74022D40F36C5700EF" association="_3ADC7B74022D41EF09980110">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv07vefXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv07vOfXEduqHoOJbURZRw" value="1"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D41EF099F0180" name="validContext" visibility="public" type="_3ADC7B74022D40F36C5700EF" association="_3ADC7B74022D41EF099F017E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv07xufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv07xefXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D40F36C5D03B5" name="MethodLibrary">
-            <ownedComment xmi:id="_GviAx-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5D03B5">
-              <body>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41FFDF820166" general="_3ADC7B74022D41FED88101B5"/>
-            <generalization xmi:id="_3ADC7B74022D420060CE0337" general="_3ADC7B74022D40F36C5E0280"/>
-            <generalization xmi:id="_3ADC7B74022D42518C93008F" general="_3ADC7B74022D41DDFA3602C1"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0285" name="methodPlugins" visibility="public" type="_3ADC7B74022D40F36C5E0104" aggregation="composite" association="_3ADC7B74022D40F36C5F0282">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gvrx1ufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gvrx1efXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F87BF70091" name="predefinedConfigurations" visibility="public" type="_3ADC7B74022D40F36C5700EF" aggregation="composite" association="_3ADC7B74022D40F87BF60126">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv07s-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv07sufXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F0215" memberEnd="_3ADC7B74022D40F36C5F0216 _3ADC7B74022D40F36C5F021D">
-            <ownedComment xmi:id="_GviAzefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0215">
-              <body>A selection of packages to be included in the configuration.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F0216" name="_methodConfiguration" visibility="private" type="_3ADC7B74022D40F36C5700EF" isUnique="false" association="_3ADC7B74022D40F36C5F0215">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GviA0efXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GviA0OfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F0245" memberEnd="_3ADC7B74022D40F36C5F0246 _3ADC7B74022D40F36C5F0248">
-            <ownedComment xmi:id="_GviA1ufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0245">
-              <body>A selection of packages to be included in the configuration.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F0246" name="_methodConfiguration" visibility="private" type="_3ADC7B74022D40F36C5700EF" isUnique="false" association="_3ADC7B74022D40F36C5F0245">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gvrxw-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GvrxwufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F0264" memberEnd="_3ADC7B74022D40F36C5F0265 _3ADC7B74022D40F36C5F0267">
-            <ownedComment xmi:id="_GvrxyOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0264">
-              <body>Delivery Process can be organized in many Process Families.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F0265" name="processFamilies" visibility="public" type="_3ADC7B74022D40F36C5D03AB" association="_3ADC7B74022D40F36C5F0264">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GvrxzOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gvrxy-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F36C5F0282" memberEnd="_3ADC7B74022D40F36C5F0283 _3ADC7B74022D40F36C5F0285">
-            <ownedComment xmi:id="_Gvrx0efXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0282">
-              <body>A Method Library physically comprises of Method Plugins.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F36C5F0283" name="_methodLibrary" visibility="private" type="_3ADC7B74022D40F36C5D03B5" isUnique="false" association="_3ADC7B74022D40F36C5F0282"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D40F87BF60126" memberEnd="_3ADC7B74022D40F87BF70091 _3ADC7B74022D40F87BF70093">
-            <ownedComment xmi:id="_Gvrx2OfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F87BF60126">
-              <body>A Method Library stores a set of predefined Method Configurations that are regularly used by the library authors (e.g. the configurations that they ship to their users).</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D40F87BF70093" name="_methodLibrary" visibility="public" type="_3ADC7B74022D40F36C5D03B5" isUnique="false" association="_3ADC7B74022D40F87BF60126"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41EF09980110" memberEnd="_3ADC7B74022D41EF09980111 _3ADC7B74022D41EF09980112">
-            <ownedComment xmi:id="_Gv07tufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41EF09980110">
-              <body>A Process has exactly on default configuration.  This is in most cases the configuration in which the process has been created.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41EF09980111" name="_process" visibility="public" type="_3ADC7B74022D41EF09580152" isUnique="false" association="_3ADC7B74022D41EF09980110">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv07uufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv07uefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41EF099F017E" memberEnd="_3ADC7B74022D41EF099F017F _3ADC7B74022D41EF099F0180">
-            <ownedComment xmi:id="_Gv07v-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41EF099F017E">
-              <body>A Process can have many additional configurations that have been verified to also produce valid results.  Process Elements (e.g. Descriptors) that refer to content packages that are defined outside the scope of such a configuration would not be shown in the process when published or used under such a configuration.  This allows to easily remove content from a process by removing content packages to from the related configuration.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41EF099F017F" name="_process" visibility="public" type="_3ADC7B74022D41EF09580152" isUnique="false" association="_3ADC7B74022D41EF099F017E">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv07w-fXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv07wufXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D420D3F000396" memberEnd="_3ADC7B74022D420D3F000397 _3ADC7B74022D420D3F000398">
-            <ownedEnd xmi:id="_3ADC7B74022D420D3F000397" name="_methodConfiguration" visibility="public" type="_3ADC7B74022D40F36C5700EF" isUnique="false" association="_3ADC7B74022D420D3F000396">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv07yufXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv07yefXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D421291CD018B" memberEnd="_3ADC7B74022D421291D00045 _3ADC7B74022D421291D00059">
-            <ownedEnd xmi:id="_3ADC7B74022D421291D00059" name="_methodConfiguration" visibility="public" type="_3ADC7B74022D40F36C5700EF" isUnique="false" association="_3ADC7B74022D421291CD018B">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv-ssOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv070-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4276CE5203B0" memberEnd="_3ADC7B74022D4276CE5602A7 _3ADC7B74022D4276CE5602A9">
-            <ownedComment xmi:id="_Gv-ssufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4276CE5203B0">
-              <body>The definition of a configuration can be based on the definitions of other configurations.  For example, a configuration A could be defined as the superset of configurations B, C, and D plus add more selected Plugins and Packages.  In such a case A would list B, C, and D as its baseConfigurations.  If any of these base configurations changes all updates would be automatically valid for A as well reducing maintainability overhead for overlapping/dependent configurations. </body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D4276CE5602A9" name="_methodConfiguration" visibility="public" type="_3ADC7B74022D40F36C5700EF" isUnique="false" association="_3ADC7B74022D4276CE5203B0">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv-suefXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv-suOfXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4558EF7C0353" memberEnd="_3ADC7B74022D4558EF7E0042 _3ADC7B74022D4558EF7E0056">
-            <ownedEnd xmi:id="_3ADC7B74022D4558EF7E0056" name="_methodConfiguration" visibility="public" type="_3ADC7B74022D40F36C5700EF" isUnique="false" association="_3ADC7B74022D4558EF7C0353">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Gv-swOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gv-sv-fXEduqHoOJbURZRw"/>
-            </ownedEnd>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D4559006A0317" memberEnd="_3ADC7B74022D4559006B0270 _3ADC7B74022D4559006B027A">
-            <ownedEnd xmi:id="_3ADC7B74022D4559006B027A" name="_methodConfiguration" visibility="public" type="_3ADC7B74022D40F36C5700EF" isUnique="false" association="_3ADC7B74022D4559006A0317"/>
-          </packagedElement>
-        </packagedElement>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D41FEDDB60306" name="MethodUnits">
-          <eAnnotations xmi:id="_GwbYo-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D41FEDE0903B0">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D41FEDE0903B0" type="Class" name="Main">
-              <children xmi:id="_HJweoOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FEDE75004E">
-                <children xmi:id="_HJweo-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJwepOfXEduqHoOJbURZRw" width="2573" height="905"/>
-                </children>
-                <children xmi:id="_HJwepefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJwepufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJwep-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJweqOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJweqefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwequfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJweq-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwerOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwerefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwerufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJwer-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJweoefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJweoufXEduqHoOJbURZRw" x="5887" y="6004"/>
-              </children>
-              <children xmi:id="_HJwesOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FEDE800252">
-                <children xmi:id="_HJwes-fXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJwetOfXEduqHoOJbURZRw" width="3454" height="905"/>
-                </children>
-                <children xmi:id="_HJwetefXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJwetufXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJwet-fXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJweuOfXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJweuefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJweuufXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJweu-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwevOfXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwevefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwevufXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJwev-fXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJwesefXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJwesufXEduqHoOJbURZRw" x="9022" y="6004"/>
-              </children>
-              <children xmi:id="_HJwe6efXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0280">
-                <children xmi:id="_HJwe7OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJwe7efXEduqHoOJbURZRw" width="2827" height="1049"/>
-                </children>
-                <children xmi:id="_HJwe7ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJwe7-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJwe8OfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJwe8efXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwe8ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwe8-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwe9OfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwe9efXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwe9ufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwe9-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJwe-OfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJwe6ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJwe6-fXEduqHoOJbURZRw" x="7984" y="186"/>
-              </children>
-              <children xmi:id="_HJwe-efXEduqHoOJbURZRw" element="_3ADC7B74022D427947E50178">
-                <children xmi:id="_HJwe_OfXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJwe_efXEduqHoOJbURZRw" width="3386" height="905"/>
-                </children>
-                <children xmi:id="_HJwe_ufXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJwe_-fXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJwfAOfXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJwfAefXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwfAufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwfA-fXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwfBOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwfBefXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwfBufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJwfB-fXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJwfCOfXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJwe-ufXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJwe--fXEduqHoOJbURZRw" x="1511" y="6004"/>
-              </children>
-              <children xmi:id="_HJwfEufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E01C1">
-                <children xmi:id="_HJwfFefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJwfFufXEduqHoOJbURZRw" width="3318" height="1032"/>
-                </children>
-                <children xmi:id="_HJwfF-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJwfGOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJwfGefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJwfGufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJwfG-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6PoOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6PoefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6PoufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6Po-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6PpOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJ6PpefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJwfE-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJwfFOfXEduqHoOJbURZRw" x="220" y="2988"/>
-              </children>
-              <children xmi:id="_HJ6PpufXEduqHoOJbURZRw" element="_3ADC7B74022D41FED88101B5">
-                <children xmi:id="_HJ6PqefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJ6PqufXEduqHoOJbURZRw" width="4538" height="2421"/>
-                </children>
-                <children xmi:id="_HJ6Pq-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJ6PrOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJ6PrefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJ6PrufXEduqHoOJbURZRw" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6Pr-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6PsOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6PsefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6PsufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6Ps-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6PtOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJ6PtefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJ6Pp-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6PqOfXEduqHoOJbURZRw" x="7179" y="2345"/>
-              </children>
-              <children xmi:id="_HJ6QFufXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5D03B5">
-                <children xmi:id="_HJ6QGefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJ6QGufXEduqHoOJbURZRw" width="3606" height="1032"/>
-                </children>
-                <children xmi:id="_HJ6QG-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJ6QHOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJ6QHefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJ6QHufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6QH-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6QIOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6QIefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6QIufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6QI-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6QJOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJ6QJefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJ6QF-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="4194368" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6QGOfXEduqHoOJbURZRw" x="13030" y="5935"/>
-              </children>
-              <children xmi:id="_HJ6QL-fXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5700EF">
-                <children xmi:id="_HJ6QMufXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HJ6QM-fXEduqHoOJbURZRw" width="3606" height="1032"/>
-                </children>
-                <children xmi:id="_HJ6QNOfXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HJ6QNefXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HJ6QNufXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HJ6QN-fXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6QOOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6QOefXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6QOufXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6QO-fXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6QPOfXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HJ6QPefXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HJ6QPufXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HJ6QMOfXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6QMefXEduqHoOJbURZRw" x="16840" y="5935"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GwbYpefXEduqHoOJbURZRw" description="|Method and Process Authoring is not done in isolation by a single process engineer.  Especially, when large scale Method Libraries shall be maintained it is important to define the right modularization principles that allow concurrent development of large scale process engineering teams.  Method Plugins were a first step of modularization.  However, even working with Method Plugins can only scale in limited ways supporting only very small authoring teams.  For larger scale method libraries concurrent access and working even within a Method Plugin is required.  To address these requirements the Method Units package extends Method Elements via package merge with a new capability defined as Method Unit.  A Method Unit is a unit of control that can be worked on by one process engineer and can serve as one unit of version control.&#xA;|The diagram shows that four types of Method Units have been defined.  Content Description representing all major textual description of a Content Element such as Task, Artifact, Guideline, or Whitepaper shall be maintained in a separate unit of control.  Whereas every Content Element's Content Description can be seen as an element that can be maintained in isolation, Processes are kept and managed as a whole.  If a breakdown structure needs to be split and handled as separate units of control then new processes such as Capability Patterns will be created for such a refactoring.  Hence, exactly one instance of Process shall be stored in an instance of Process Component, which is defined to be the container for a Process and therefore its Method Unit.  Finally, Method Plugins and Method Libraries are defined as Method Units.  Whereas, the former stores all 'modeled' elements organized in Method Packages such as all Content Elements (only the description classes are maintained as separate units), the later defines a Method Unit to store references to the Method Plugins that are part of the Library as well as Method Configurations.&#xA;"/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HJ6PtufXEduqHoOJbURZRw" element="_3ADC7B74022D41FEE0C503A1" source="_HJweoOfXEduqHoOJbURZRw" target="_HJ6PpufXEduqHoOJbURZRw">
-                <children xmi:id="_HJ6PuefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJ6Pu-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJ6PvOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6PuufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJ6Pt-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJ6PuOfXEduqHoOJbURZRw" points="[203, -457, -1117, 2387]$[745, -1634, -575, 1210]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6PvefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6PvufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HJ6Pv-fXEduqHoOJbURZRw" element="_3ADC7B74022D41FEE0C90194" source="_HJwesOfXEduqHoOJbURZRw" target="_HJ6PpufXEduqHoOJbURZRw">
-                <children xmi:id="_HJ6PwufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJ6PxOfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJ6PxefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6Pw-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJ6PwOfXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJ6PwefXEduqHoOJbURZRw" points="[-296, -457, 1481, 2387]$[-1032, -1634, 745, 1210]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6PxufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6Px-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HJ6PyOfXEduqHoOJbURZRw" element="_3ADC7B74022D41FED89103AD" source="_HJ6PpufXEduqHoOJbURZRw" target="_HJwe6efXEduqHoOJbURZRw">
-                <children xmi:id="_HJ6Py-fXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJ6PzefXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJ6PzufXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6PzOfXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJ6PyefXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJ6PyufXEduqHoOJbURZRw" points="[-25, -1219, 25, 1625]$[-50, -2319, 0, 524]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6Pz-fXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6P0OfXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HJ6P0efXEduqHoOJbURZRw" element="_3ADC7B74022D4279480001AE" source="_HJwe-efXEduqHoOJbURZRw" target="_HJ6PpufXEduqHoOJbURZRw">
-                <children xmi:id="_HJ6P1OfXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJ6P1ufXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJ6P1-fXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6P1efXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJ6P0ufXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJ6P0-fXEduqHoOJbURZRw" points="[702, -457, -3767, 2387]$[2556, -1634, -1913, 1210]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6P2OfXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6P2efXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HJ6P2ufXEduqHoOJbURZRw" element="_3ADC7B74022D42A7D52F0243" source="_HJ6PpufXEduqHoOJbURZRw" target="_HJwfEufXEduqHoOJbURZRw">
-                <children xmi:id="_HJ6P3efXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJ6P3-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJ6P4OfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6P3ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJ6P4efXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D42A7D5300209">
-                  <children xmi:id="_HJ6P4-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P4ufXEduqHoOJbURZRw" x="-264" y="-212"/>
-                </children>
-                <children xmi:id="_HJ6P5OfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D42A7D5300209">
-                  <children xmi:id="_HJ6P5ufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P5efXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HJ6P5-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D42A7D53001E1">
-                  <children xmi:id="_HJ6P6efXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P6OfXEduqHoOJbURZRw" x="-44" y="-289"/>
-                </children>
-                <children xmi:id="_HJ6P6ufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D42A7D53001E1">
-                  <children xmi:id="_HJ6P7OfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P6-fXEduqHoOJbURZRw" x="-1300" y="221"/>
-                </children>
-                <children xmi:id="_HJ6P7efXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D42A7D5300209">
-                  <children xmi:id="_HJ6P7-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6P8OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P7ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJ6P8efXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D42A7D53001E1">
-                  <children xmi:id="_HJ6P8-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6P9OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P8ufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HJ6P9efXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D42A7D5300209">
-                  <children xmi:id="_HJ6P9-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6P-OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P9ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HJ6P-efXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D42A7D53001E1">
-                  <children xmi:id="_HJ6P--fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HJ6P_OfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HJ6P-ufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJ6P2-fXEduqHoOJbURZRw" routing="Rectilinear" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJ6P3OfXEduqHoOJbURZRw" points="[-2269, -50, 5300, 0]$[-5909, -50, 1659, 0]"/>
-              </edges>
-              <edges xmi:id="_HJ6QJufXEduqHoOJbURZRw" element="_3ADC7B74022D41FFDF820166" source="_HJ6QFufXEduqHoOJbURZRw" target="_HJ6PpufXEduqHoOJbURZRw">
-                <children xmi:id="_HJ6QKefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJ6QK-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJ6QLOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6QKufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJ6QJ-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJ6QKOfXEduqHoOJbURZRw" points="[-956, -524, 4428, 2370]$[-3115, -1684, 2269, 1210]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6QLefXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6QLufXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-              <edges xmi:id="_HJ6QP-fXEduqHoOJbURZRw" element="_3ADC7B74022D44565BB1015F" source="_HJ6QL-fXEduqHoOJbURZRw" target="_HJ6PpufXEduqHoOJbURZRw">
-                <children xmi:id="_HJ6QQufXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HJ6QROfXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HJ6QRefXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HJ6QQ-fXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HJ6QQOfXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HJ6QQefXEduqHoOJbURZRw" points="[-1617, -524, 7577, 2370]$[-6925, -2184, 2269, 711]"/>
-                <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6QRufXEduqHoOJbURZRw" id="anchor50"/>
-                <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HJ6QR-fXEduqHoOJbURZRw" id="anchor50"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GwH2pefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41FEDDB60306">
-            <body>01</body>
-          </ownedComment>
-          <packageMerge xmi:id="_GNkB8OxSEduONrMRgmz48A" mergedPackage="_3ADC7B74022D40F36C5E00FB"/>
-          <packageMerge xmi:id="_RcqfMOx0Edu5-vVjlfVsfQ" mergedPackage="_3ADC7B74022D4151E996009D"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41FEDE75004E" name="MethodPlugin">
-            <generalization xmi:id="_3ADC7B74022D41FEE0C503A1" general="_3ADC7B74022D41FED88101B5"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41FEDE800252" name="ProcessComponent">
-            <generalization xmi:id="_3ADC7B74022D41FEE0C90194" general="_3ADC7B74022D41FED88101B5"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41FED88101B5" name="MethodUnit" isAbstract="true">
-            <ownedComment xmi:id="_GwH2s-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41FED88101B5">
-              <body>A Method Unit is a special Method Element that shall be maintained in a Method Library as a separate unit of control.</body>
-            </ownedComment>
-            <generalization xmi:id="_3ADC7B74022D41FED89103AD" general="_3ADC7B74022D40F36C5E0280"/>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F005B" name="authors" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GwH2t-fXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F005B">
-                <body>Every Method Unit is being created and owned by an author or authoring team.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_5dGNEeyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_5dGNEOyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_5UTdcOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F0064" name="changeDate" visibility="public" type="_3ADC7B74022D40F4498D0185">
-              <ownedComment xmi:id="_GwRnoufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F0064">
-                <body>The date the last change that resulted into this version has been made.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_UZ-Q8eyMEduFKJovBL64XQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_UZ-Q8OyMEduFKJovBL64XQ"/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F006E" name="changeDescription" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GwRnpefXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F006E">
-                <body>The description of the last change that resulted into this version.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_NGe5YeyFEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_NGe5YOyFEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_O9ZXsOyFEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D40F36C5F006F" name="version" visibility="public" type="_3ADC7B74022D3CA010B103C3">
-              <ownedComment xmi:id="_GwRnqOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D40F36C5F006F">
-                <body>Every Package has a version number used to track changes.</body>
-              </ownedComment>
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_sWTV8eyGEdu5-vVjlfVsfQ" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_sWTV8OyGEdu5-vVjlfVsfQ"/>
-              <defaultValue xmi:type="uml:LiteralString" xmi:id="_sMU6kOyGEdu5-vVjlfVsfQ" type="_3ADC7B74022D3CA010B103C3" value=""/>
-            </ownedAttribute>
-            <ownedAttribute xmi:id="_3ADC7B74022D42A7D53001E1" name="copyrightStatement" visibility="public" type="_3ADC7B74022D40F36C5E01C1" association="_3ADC7B74022D42A7D52F0243">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GwbYoefXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GwbYoOfXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D427947E50178" name="ContentDescription">
-            <generalization xmi:id="_3ADC7B74022D4279480001AE" general="_3ADC7B74022D41FED88101B5"/>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D42A7D52F0243" memberEnd="_3ADC7B74022D42A7D53001E1 _3ADC7B74022D42A7D5300209">
-            <ownedComment xmi:id="_GwRnrufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D42A7D52F0243">
-              <body>A Method Unit can have exactly one Copyright Statement securing the intellectual capital it represents.  It will be published with the respective concrete Element.  Note, that Copyright Statements for Method Libraries and Method Plugins define the default statement for its contained elements, which can be 'overwritten' with revised statements for every Content Description or Process Component.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D42A7D5300209" name="_methodUnit" visibility="public" type="_3ADC7B74022D41FED88101B5" association="_3ADC7B74022D42A7D52F0243">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_nrF8UeyMEduFKJovBL64XQ" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_nrF8UOyMEduFKJovBL64XQ"/>
-            </ownedEnd>
-          </packagedElement>
-        </packagedElement>
-      </packagedElement>
-      <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D411994BF0282" name="ProcessDiagrams">
-        <eAnnotations xmi:id="_GwuTl-fXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D415336120151">
-          <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D415336120151" type="Class" name="Main">
-            <children xmi:id="_HK8xwufXEduqHoOJbURZRw" element="_3ADC7B74022D4151F66B0155">
-              <children xmi:id="_HK8xxefXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HK8xxufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HK8xx-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HK8xyOfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HK8xyefXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HK8xyufXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HK8xy-fXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HK8xw-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK8xxOfXEduqHoOJbURZRw" x="1820" y="3852" width="4954" height="1794"/>
-            </children>
-            <children xmi:id="_HK8xzOfXEduqHoOJbURZRw" element="_3ADC7B74022D40F36C5E0262">
-              <children xmi:id="_HK8xz-fXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HK8x0OfXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HK8x0efXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HK8x0ufXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HK8x0-fXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HK8x1OfXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HK8x1efXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HK8xzefXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK8xzufXEduqHoOJbURZRw" x="2641" y="7366" width="3149" height="1676"/>
-            </children>
-            <children xmi:id="_HK8x1ufXEduqHoOJbURZRw" element="_3ADC7B74022D4151E996009D">
-              <children xmi:id="_HK8x2efXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HK8x2ufXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HK8x2-fXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HK8x3OfXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HK8x3efXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HK8x3ufXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HK8x3-fXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HK8x1-fXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="0" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK8x2OfXEduqHoOJbURZRw" x="2556" y="668" width="3530" height="1862"/>
-            </children>
-            <children xmi:id="_HK8x4OfXEduqHoOJbURZRw" element="_3ADC7B74022D41E0D0ED0104">
-              <children xmi:id="_HLGicOfXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HLGicefXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HLGicufXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HLGic-fXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HLGidOfXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HLGidefXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLGidufXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HK8x4efXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK8x4ufXEduqHoOJbURZRw" x="9457" y="2032" width="3335" height="1676"/>
-            </children>
-            <children xmi:id="_HLGid-fXEduqHoOJbURZRw" element="_3ADC7B74022D41DDF869012E">
-              <children xmi:id="_HLGieufXEduqHoOJbURZRw" type="ImageCompartment">
-                <layoutConstraint xmi:type="notation:Size" xmi:id="_HLGie-fXEduqHoOJbURZRw" width="1320" height="1320"/>
-              </children>
-              <children xmi:id="_HLGifOfXEduqHoOJbURZRw" type="Stereotype"/>
-              <children xmi:id="_HLGifefXEduqHoOJbURZRw" type="Name"/>
-              <children xmi:id="_HLGifufXEduqHoOJbURZRw" type="Parent"/>
-              <children xmi:id="_HLGif-fXEduqHoOJbURZRw" visible="false" type="PackageContents">
-                <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HLGigOfXEduqHoOJbURZRw" canonical="false" collapsed="true"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HLGieOfXEduqHoOJbURZRw" showListStereotype="None" showListVisibility="None" lineColor="4194368" showStereotype="Text"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLGieefXEduqHoOJbURZRw" x="4114" y="10820" width="4876" height="1676"/>
-            </children>
-            <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GwuTmefXEduqHoOJbURZRw" description="This diagram shows how uma diagrams are based on the uml2 diagram interchange.  The method model package accesses these diagrams, because the process packages defined in method models package/contain the diagrams."/>
-            <element xsi:nil="true"/>
-            <edges xmi:id="_HLGiiufXEduqHoOJbURZRw" element="_3ADC7B74022D41E57740023D" source="_HK8xwufXEduqHoOJbURZRw" target="_HLGid-fXEduqHoOJbURZRw">
-              <children xmi:id="_HLGijefXEduqHoOJbURZRw" type="KindLabel">
-                <children xmi:id="_HLGij-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HLGikefXEduqHoOJbURZRw" type="Kind"/>
-                <children xmi:id="_HLGikOfXEduqHoOJbURZRw" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HLGijufXEduqHoOJbURZRw" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HLGii-fXEduqHoOJbURZRw" lineColor="4194368" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HLGijOfXEduqHoOJbURZRw" points="[948, 897, -1439, -6011]$[2362, 2125, -25, -4783]$[2370, 5757, -16, -1151]"/>
-              <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLGikufXEduqHoOJbURZRw" id="anchor50"/>
-              <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_HLGik-fXEduqHoOJbURZRw" id="anchor50"/>
-            </edges>
-            <edges xmi:id="_SavYkeolEduVA7vt5qbIJQ" element="_SavYkOolEduVA7vt5qbIJQ" source="_HK8x1ufXEduqHoOJbURZRw" target="_HK8x4OfXEduqHoOJbURZRw">
-              <children xmi:id="_SavYlOolEduVA7vt5qbIJQ" type="KindLabel">
-                <children xmi:id="_SavYluolEduVA7vt5qbIJQ" type="Stereotype"/>
-                <children xmi:id="_SavYmOolEduVA7vt5qbIJQ" type="Kind"/>
-                <children xmi:id="_SavYl-olEduVA7vt5qbIJQ" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SavYleolEduVA7vt5qbIJQ" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_SavYkuolEduVA7vt5qbIJQ" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_SavYk-olEduVA7vt5qbIJQ" points="[68, 18, -189, -30]$[222, 81, -35, 33]"/>
-            </edges>
-            <edges xmi:id="_ylD3sOxZEduONrMRgmz48A" element="_ykw8wOxZEduONrMRgmz48A" source="_HK8xwufXEduqHoOJbURZRw" target="_HK8xzOfXEduqHoOJbURZRw">
-              <children xmi:id="_ylD3s-xZEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_ylD3texZEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_ylD3t-xZEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_ylD3tuxZEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ylD3tOxZEduONrMRgmz48A" y="1349"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_ylD3sexZEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ylD3suxZEduONrMRgmz48A" points="[2, 35, 5, -96]$[18, 163, 21, 32]"/>
-            </edges>
-            <edges xmi:id="_2D1rsexZEduONrMRgmz48A" element="_2D1rsOxZEduONrMRgmz48A" source="_HK8x1ufXEduqHoOJbURZRw" target="_HK8xwufXEduqHoOJbURZRw">
-              <children xmi:id="_2D1rtOxZEduONrMRgmz48A" type="KindLabel">
-                <children xmi:id="_2D1rtuxZEduONrMRgmz48A" type="Stereotype"/>
-                <children xmi:id="_2D1ruOxZEduONrMRgmz48A" type="Kind"/>
-                <children xmi:id="_2D1rt-xZEduONrMRgmz48A" type="Name"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2D1rtexZEduONrMRgmz48A" y="-186"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_2D1rsuxZEduONrMRgmz48A" lineColor="0" showStereotype="Text"/>
-              <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_2D1rs-xZEduONrMRgmz48A" points="[7, 36, 8, -83]$[93, 116, 94, -3]"/>
-            </edges>
-          </contents>
-        </eAnnotations>
-        <ownedComment xmi:id="_GwbYrufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D411994BF0282">
-          <body>05</body>
-        </ownedComment>
-        <packagedElement xmi:type="uml:Package" xmi:id="_3ADC7B74022D4151E996009D" name="UMADiagrams">
-          <eAnnotations xmi:id="_GwuTlOfXEduqHoOJbURZRw" source="uml2.diagrams" references="_3ADC7B74022D4151E9E301B8">
-            <contents xmi:type="notation:Diagram" xmi:id="_3ADC7B74022D4151E9E301B8" type="Class" name="Main">
-              <children xmi:id="_HK8xdufXEduqHoOJbURZRw" element="_3ADC7B74022D41530E340156">
-                <children xmi:id="_HK8xeefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HK8xeufXEduqHoOJbURZRw" width="4250" height="1049"/>
-                </children>
-                <children xmi:id="_HK8xe-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HK8xfOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HK8xfefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HK8xfufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xf-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HK8xgOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xgefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HK8xgufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xg-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HK8xhOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HK8xhefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HK8xd-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK8xeOfXEduqHoOJbURZRw" x="2219" y="3804"/>
-              </children>
-              <children xmi:id="_HK8xhufXEduqHoOJbURZRw" element="_3ADC7B74022D41E1FAF10376">
-                <children xmi:id="_HK8xiefXEduqHoOJbURZRw" type="ImageCompartment">
-                  <layoutConstraint xmi:type="notation:Size" xmi:id="_HK8xiufXEduqHoOJbURZRw" width="3064" height="905"/>
-                </children>
-                <children xmi:id="_HK8xi-fXEduqHoOJbURZRw" type="Stereotype"/>
-                <children xmi:id="_HK8xjOfXEduqHoOJbURZRw" type="Name"/>
-                <children xmi:id="_HK8xjefXEduqHoOJbURZRw" type="Parent"/>
-                <children xmi:id="_HK8xjufXEduqHoOJbURZRw" visible="false" type="AttributeCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xj-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HK8xkOfXEduqHoOJbURZRw" visible="false" type="OperationCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xkefXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HK8xkufXEduqHoOJbURZRw" visible="false" type="SignalCompartment">
-                  <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xk-fXEduqHoOJbURZRw"/>
-                </children>
-                <children xmi:id="_HK8xlOfXEduqHoOJbURZRw" visible="false" type="StructureCompartment">
-                  <styles xmi:type="umlnotation:UMLShapeCompartmentStyle" xmi:id="_HK8xlefXEduqHoOJbURZRw" canonical="false"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLShapeStyle" xmi:id="_HK8xh-fXEduqHoOJbURZRw" showListStereotype="Text" showListVisibility="Text" lineColor="0" showStereotype="Text"/>
-                <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK8xiOfXEduqHoOJbURZRw" x="1585" y="951"/>
-              </children>
-              <styles xmi:type="umlnotation:UMLDiagramStyle" xmi:id="_GwuTlufXEduqHoOJbURZRw" description="UMA supports three types of diagrams. However, this specification does not define the syntax of these diagrams, but rather relies on a tool implementation for the exact presentation of the three diagrams.  Utilzing the UML2 Diagram Interchange specification this specification provides all structures to represent and persist these diagrams."/>
-              <element xsi:nil="true"/>
-              <edges xmi:id="_HK8xlufXEduqHoOJbURZRw" element="_3ADC7B74022D41533DE701EA" source="_HK8xhufXEduqHoOJbURZRw" target="_HK8xdufXEduqHoOJbURZRw">
-                <children xmi:id="_HK8xmefXEduqHoOJbURZRw" type="NameLabel">
-                  <children xmi:id="_HK8xm-fXEduqHoOJbURZRw" type="Stereotype"/>
-                  <children xmi:id="_HK8xnOfXEduqHoOJbURZRw" visible="false" type="Name"/>
-                  <layoutConstraint xmi:type="notation:Bounds" xmi:id="_HK8xmufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HK8xnefXEduqHoOJbURZRw" type="ToMultiplicityLabel" element="_3ADC7B74022D41533DE703AD">
-                  <children xmi:id="_HK8xn-fXEduqHoOJbURZRw" type="ToMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xnufXEduqHoOJbURZRw" x="187" y="-339"/>
-                </children>
-                <children xmi:id="_HK8xoOfXEduqHoOJbURZRw" visible="false" type="ToRoleLabel" element="_3ADC7B74022D41533DE703AD">
-                  <children xmi:id="_HK8xoufXEduqHoOJbURZRw" type="ToRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xoefXEduqHoOJbURZRw" y="-397"/>
-                </children>
-                <children xmi:id="_HK8xo-fXEduqHoOJbURZRw" type="FromMultiplicityLabel" element="_3ADC7B74022D41533DE703A3">
-                  <children xmi:id="_HK8xpefXEduqHoOJbURZRw" type="FromMultiplicity"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xpOfXEduqHoOJbURZRw" x="-229" y="-258"/>
-                </children>
-                <children xmi:id="_HK8xpufXEduqHoOJbURZRw" type="FromRoleLabel" element="_3ADC7B74022D41533DE703A3">
-                  <children xmi:id="_HK8xqOfXEduqHoOJbURZRw" type="FromRole"/>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xp-fXEduqHoOJbURZRw" x="-240" y="903"/>
-                </children>
-                <children xmi:id="_HK8xqefXEduqHoOJbURZRw" type="ToQualifierLabel" element="_3ADC7B74022D41533DE703AD">
-                  <children xmi:id="_HK8xq-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xrOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xqufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HK8xrefXEduqHoOJbURZRw" type="FromQualifierLabel" element="_3ADC7B74022D41533DE703A3">
-                  <children xmi:id="_HK8xr-fXEduqHoOJbURZRw" type="QualifierCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xsOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xrufXEduqHoOJbURZRw" y="-186"/>
-                </children>
-                <children xmi:id="_HK8xsefXEduqHoOJbURZRw" type="ToConstraintLabel" element="_3ADC7B74022D41533DE703AD">
-                  <children xmi:id="_HK8xs-fXEduqHoOJbURZRw" type="ToConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xtOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xsufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <children xmi:id="_HK8xtefXEduqHoOJbURZRw" type="FromConstraintLabel" element="_3ADC7B74022D41533DE703A3">
-                  <children xmi:id="_HK8xt-fXEduqHoOJbURZRw" type="FromConstraintCompartment">
-                    <styles xmi:type="umlnotation:UMLListCompartmentStyle" xmi:id="_HK8xuOfXEduqHoOJbURZRw"/>
-                  </children>
-                  <layoutConstraint xmi:type="notation:Location" xmi:id="_HK8xtufXEduqHoOJbURZRw" y="1058"/>
-                </children>
-                <styles xmi:type="umlnotation:UMLConnectorStyle" xmi:id="_HK8xl-fXEduqHoOJbURZRw" lineColor="0" showStereotype="None"/>
-                <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HK8xmOfXEduqHoOJbURZRw" points="[0, 448, 0, -3107]$[0, 3022, 0, -533]"/>
-              </edges>
-            </contents>
-          </eAnnotations>
-          <ownedComment xmi:id="_GwbYsufXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D4151E996009D">
-            <body>02</body>
-          </ownedComment>
-          <packageMerge xmi:id="_SavYkOolEduVA7vt5qbIJQ" mergedPackage="_3ADC7B74022D41E0D0ED0104"/>
-          <packageMerge xmi:id="_2D1rsOxZEduONrMRgmz48A" mergedPackage="_3ADC7B74022D4151F66B0155"/>
-          <packagedElement xmi:type="uml:Class" xmi:id="_3ADC7B74022D41E1FAF10376" name="ProcessPackage">
-            <ownedAttribute xmi:id="_3ADC7B74022D41533DE703A3" name="diagrams" visibility="public" type="_3ADC7B74022D41530E340156" aggregation="composite" association="_3ADC7B74022D41533DE701EA">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GwuTkOfXEduqHoOJbURZRw" value="*"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Gwkin-fXEduqHoOJbURZRw"/>
-            </ownedAttribute>
-          </packagedElement>
-          <packagedElement xmi:type="uml:Association" xmi:id="_3ADC7B74022D41533DE701EA" memberEnd="_3ADC7B74022D41533DE703A3 _3ADC7B74022D41533DE703AD">
-            <ownedComment xmi:id="_GwkinOfXEduqHoOJbURZRw" annotatedElement="_3ADC7B74022D41533DE701EA">
-              <body>This association is the only member of the umadiagrams package.  It defines that Diagrams can be packaged in Process Packages.</body>
-            </ownedComment>
-            <ownedEnd xmi:id="_3ADC7B74022D41533DE703AD" name="_processPackage" visibility="public" type="_3ADC7B74022D41E1FAF10376" isUnique="false" association="_3ADC7B74022D41533DE701EA">
-              <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GwuTk-fXEduqHoOJbURZRw" value="1"/>
-              <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GwuTkufXEduqHoOJbURZRw" value="1"/>
-            </ownedEnd>
-          </packagedElement>
-        </packagedElement>
-      </packagedElement>
-    </packagedElement>
-    <profileApplication xmi:id="_GdpmkefXEduqHoOJbURZRw">
-      <eAnnotations xmi:id="_GdzXkOfXEduqHoOJbURZRw" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Standard.profile.uml#_yzU58YinEdqtvbnfB2L_5w"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML_PROFILES/Standard.profile.uml#_0"/>
-    </profileApplication>
-    <profileApplication xmi:id="_GdzXkefXEduqHoOJbURZRw">
-      <eAnnotations xmi:id="_GdzXkufXEduqHoOJbURZRw" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML2_MSL_PROFILES/Default.epx#_IN8k8MmBEdqBcN1R6EvWUw?Default/Default?"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default?"/>
-    </profileApplication>
-    <profileApplication xmi:id="_GdzXk-fXEduqHoOJbURZRw">
-      <eAnnotations xmi:id="_GdzXlOfXEduqHoOJbURZRw" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_IrdAUMmBEdqBcN1R6EvWUw?Deployment/Deployment?"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment?"/>
-    </profileApplication>
-    <profileApplication xmi:id="_gqOQoAB2Edueq-ViLYieyQ">
-      <eAnnotations xmi:id="_gqOQoQB2Edueq-ViLYieyQ" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_vy-HUYinEdqtvbnfB2L_5w"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
-    </profileApplication>
-  </uml:Model>
-  <Default:Documentation xmi:id="_GhOfAOfXEduqHoOJbURZRw" base_Comment="_GhEuAufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GhYQAOfXEduqHoOJbURZRw" base_Comment="_GhOfAufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GhrK8OfXEduqHoOJbURZRw" base_Comment="_GhhZ9OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gh0U4OfXEduqHoOJbURZRw" base_Comment="_GhrK-ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gh0U5efXEduqHoOJbURZRw" base_Comment="_Gh0U5OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gh-F4OfXEduqHoOJbURZRw" base_Comment="_Gh0U6OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gh-F5OfXEduqHoOJbURZRw" base_Comment="_Gh-F4-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GiH24OfXEduqHoOJbURZRw" base_Comment="_Gh-F5-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GiH25OfXEduqHoOJbURZRw" base_Comment="_GiH24-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GiH25-fXEduqHoOJbURZRw" base_Comment="_GiH25ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GiRA0ufXEduqHoOJbURZRw" base_Comment="_GiRA0efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GiRA1efXEduqHoOJbURZRw" base_Comment="_GiRA1OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Giax0OfXEduqHoOJbURZRw" base_Comment="_GiRA1-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Giax0-fXEduqHoOJbURZRw" base_Comment="_Giax0ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Giax1-fXEduqHoOJbURZRw" base_Comment="_Giax1ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Giki0OfXEduqHoOJbURZRw" base_Comment="_Giax2ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Giki1OfXEduqHoOJbURZRw" base_Comment="_Giki0-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Giki1-fXEduqHoOJbURZRw" base_Comment="_Giki1ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GitswOfXEduqHoOJbURZRw" base_Comment="_Giki2efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gitsw-fXEduqHoOJbURZRw" base_Comment="_GitswufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gi3dwOfXEduqHoOJbURZRw" base_Comment="_Gitsx-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gi3dw-fXEduqHoOJbURZRw" base_Comment="_Gi3dwufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gi3dyOfXEduqHoOJbURZRw" base_Comment="_Gi3dx-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gi3dzOfXEduqHoOJbURZRw" base_Comment="_Gi3dy-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjAnsufXEduqHoOJbURZRw" base_Comment="_GjAnsefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjAnuOfXEduqHoOJbURZRw" base_Comment="_GjAnt-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjAnvOfXEduqHoOJbURZRw" base_Comment="_GjAnu-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjKYsOfXEduqHoOJbURZRw" base_Comment="_GjAnwOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjKYtOfXEduqHoOJbURZRw" base_Comment="_GjKYs-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjKYt-fXEduqHoOJbURZRw" base_Comment="_GjKYtufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjUJsOfXEduqHoOJbURZRw" base_Comment="_GjKYuefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjdToOfXEduqHoOJbURZRw" base_Comment="_GjUJs-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjdTpOfXEduqHoOJbURZRw" base_Comment="_GjdTo-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjdTqOfXEduqHoOJbURZRw" base_Comment="_GjdTp-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjdTrOfXEduqHoOJbURZRw" base_Comment="_GjdTq-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjnEoOfXEduqHoOJbURZRw" base_Comment="_GjdTr-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GjnEpOfXEduqHoOJbURZRw" base_Comment="_GjnEo-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkDwkOfXEduqHoOJbURZRw" base_Comment="_Gj5_lOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkDwmefXEduqHoOJbURZRw" base_Comment="_GkDwmOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkDwoufXEduqHoOJbURZRw" base_Comment="_GkDwoefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkM6gOfXEduqHoOJbURZRw" base_Comment="_GkDwqufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkM6iefXEduqHoOJbURZRw" base_Comment="_GkM6iOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkM6kufXEduqHoOJbURZRw" base_Comment="_GkM6kefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkWrgOfXEduqHoOJbURZRw" base_Comment="_GkM6mufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkWriefXEduqHoOJbURZRw" base_Comment="_GkWriOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkWrkufXEduqHoOJbURZRw" base_Comment="_GkWrkefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkgcgOfXEduqHoOJbURZRw" base_Comment="_GkWrmufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkgciefXEduqHoOJbURZRw" base_Comment="_GkgciOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkgckufXEduqHoOJbURZRw" base_Comment="_GkgckefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkpmcOfXEduqHoOJbURZRw" base_Comment="_GkgcmufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkpmeefXEduqHoOJbURZRw" base_Comment="_GkpmeOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkpmgufXEduqHoOJbURZRw" base_Comment="_GkpmgefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkzXcOfXEduqHoOJbURZRw" base_Comment="_GkpmiufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GkzXgOfXEduqHoOJbURZRw" base_Comment="_GkzXf-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gk9IcOfXEduqHoOJbURZRw" base_Comment="_GkzXiOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gk9IeefXEduqHoOJbURZRw" base_Comment="_Gk9IeOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GlsvUOfXEduqHoOJbURZRw" base_Comment="_Gli-WefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GlsvWOfXEduqHoOJbURZRw" base_Comment="_GlsvV-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GlsvXOfXEduqHoOJbURZRw" base_Comment="_GlsvW-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GlsvYOfXEduqHoOJbURZRw" base_Comment="_GlsvX-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gl15QOfXEduqHoOJbURZRw" base_Comment="_GlsvY-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gl15ROfXEduqHoOJbURZRw" base_Comment="_Gl15Q-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gl15SOfXEduqHoOJbURZRw" base_Comment="_Gl15R-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gl_qQOfXEduqHoOJbURZRw" base_Comment="_Gl15TefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gl_qROfXEduqHoOJbURZRw" base_Comment="_Gl_qQ-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gl_qTefXEduqHoOJbURZRw" base_Comment="_Gl_qTOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmJbQOfXEduqHoOJbURZRw" base_Comment="_Gl_qVefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmJbR-fXEduqHoOJbURZRw" base_Comment="_GmJbRufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmJbUOfXEduqHoOJbURZRw" base_Comment="_GmJbT-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmSlMOfXEduqHoOJbURZRw" base_Comment="_GmJbWOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmSlOefXEduqHoOJbURZRw" base_Comment="_GmSlOOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmSlQufXEduqHoOJbURZRw" base_Comment="_GmSlQefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmcWMOfXEduqHoOJbURZRw" base_Comment="_GmSlUefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmcWOefXEduqHoOJbURZRw" base_Comment="_GmcWOOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmcWQufXEduqHoOJbURZRw" base_Comment="_GmcWQefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmlgIOfXEduqHoOJbURZRw" base_Comment="_GmcWSufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmlgKefXEduqHoOJbURZRw" base_Comment="_GmlgKOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GmlgMufXEduqHoOJbURZRw" base_Comment="_GmlgMefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gm5CJOfXEduqHoOJbURZRw" base_Comment="_Gm5CI-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gm5CLufXEduqHoOJbURZRw" base_Comment="_Gm5CLefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnCMEOfXEduqHoOJbURZRw" base_Comment="_Gm5CMefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnCMFOfXEduqHoOJbURZRw" base_Comment="_GnCME-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnCMGOfXEduqHoOJbURZRw" base_Comment="_GnCMF-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnCMHOfXEduqHoOJbURZRw" base_Comment="_GnCMG-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnL9EOfXEduqHoOJbURZRw" base_Comment="_GnCMJOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnL9GefXEduqHoOJbURZRw" base_Comment="_GnL9GOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnL9IufXEduqHoOJbURZRw" base_Comment="_GnL9IefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnVuEOfXEduqHoOJbURZRw" base_Comment="_GnL9KufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnVuGefXEduqHoOJbURZRw" base_Comment="_GnVuGOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gne4D-fXEduqHoOJbURZRw" base_Comment="_Gne4DufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GnopAOfXEduqHoOJbURZRw" base_Comment="_Gne4G-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gnxy8OfXEduqHoOJbURZRw" base_Comment="_GnopBOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gnxy8-fXEduqHoOJbURZRw" base_Comment="_Gnxy8ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gnxy9ufXEduqHoOJbURZRw" base_Comment="_Gnxy9efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gnxy--fXEduqHoOJbURZRw" base_Comment="_Gnxy-ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gn7j8OfXEduqHoOJbURZRw" base_Comment="_Gnxy_efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gn7j8-fXEduqHoOJbURZRw" base_Comment="_Gn7j8ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gn7j9ufXEduqHoOJbURZRw" base_Comment="_Gn7j9efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gn7j-efXEduqHoOJbURZRw" base_Comment="_Gn7j-OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gn7j_OfXEduqHoOJbURZRw" base_Comment="_Gn7j--fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoFU9OfXEduqHoOJbURZRw" base_Comment="_GoFU8-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoFU9-fXEduqHoOJbURZRw" base_Comment="_GoFU9ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoFU_OfXEduqHoOJbURZRw" base_Comment="_GoFU--fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoOe4OfXEduqHoOJbURZRw" base_Comment="_GoFU_ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoYP4efXEduqHoOJbURZRw" base_Comment="_GoYP4OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoYP8-fXEduqHoOJbURZRw" base_Comment="_GoYP8ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoYP-ufXEduqHoOJbURZRw" base_Comment="_GoYP-efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoiA4OfXEduqHoOJbURZRw" base_Comment="_GoYP_ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoiA5OfXEduqHoOJbURZRw" base_Comment="_GoiA4-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoiA6OfXEduqHoOJbURZRw" base_Comment="_GoiA5-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GoiA6-fXEduqHoOJbURZRw" base_Comment="_GoiA6ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GorK0OfXEduqHoOJbURZRw" base_Comment="_GoiA7efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GorK0-fXEduqHoOJbURZRw" base_Comment="_GorK0ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GorK1ufXEduqHoOJbURZRw" base_Comment="_GorK1efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GorK2efXEduqHoOJbURZRw" base_Comment="_GorK2OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GorK3-fXEduqHoOJbURZRw" base_Comment="_GorK3ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Go070OfXEduqHoOJbURZRw" base_Comment="_GorK4ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Go071OfXEduqHoOJbURZRw" base_Comment="_Go070-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Go072efXEduqHoOJbURZRw" base_Comment="_Go072OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Go073ufXEduqHoOJbURZRw" base_Comment="_Go073efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Go-FxOfXEduqHoOJbURZRw" base_Comment="_Go-Fw-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Go-FzefXEduqHoOJbURZRw" base_Comment="_Go-FzOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Go-F1ufXEduqHoOJbURZRw" base_Comment="_Go-F1efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpH2yefXEduqHoOJbURZRw" base_Comment="_GpH2yOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpRnwOfXEduqHoOJbURZRw" base_Comment="_GpH2y-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpRnx-fXEduqHoOJbURZRw" base_Comment="_GpRnxufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpRny-fXEduqHoOJbURZRw" base_Comment="_GpRnyufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpRnz-fXEduqHoOJbURZRw" base_Comment="_GpRnzufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpaxsOfXEduqHoOJbURZRw" base_Comment="_GpRn0ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpaxtOfXEduqHoOJbURZRw" base_Comment="_Gpaxs-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpaxuOfXEduqHoOJbURZRw" base_Comment="_Gpaxt-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpaxvOfXEduqHoOJbURZRw" base_Comment="_Gpaxu-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpaxwOfXEduqHoOJbURZRw" base_Comment="_Gpaxv-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpkisOfXEduqHoOJbURZRw" base_Comment="_Gpaxw-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpkitOfXEduqHoOJbURZRw" base_Comment="_Gpkis-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpkiuOfXEduqHoOJbURZRw" base_Comment="_Gpkit-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpkivOfXEduqHoOJbURZRw" base_Comment="_Gpkiu-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpuTsOfXEduqHoOJbURZRw" base_Comment="_Gpkiv-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpuTtOfXEduqHoOJbURZRw" base_Comment="_GpuTs-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpuTvOfXEduqHoOJbURZRw" base_Comment="_GpuTu-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GpuTwOfXEduqHoOJbURZRw" base_Comment="_GpuTv-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gp3doufXEduqHoOJbURZRw" base_Comment="_Gp3doefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gp3dq-fXEduqHoOJbURZRw" base_Comment="_Gp3dqufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gp3dtOfXEduqHoOJbURZRw" base_Comment="_Gp3ds-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqBOoOfXEduqHoOJbURZRw" base_Comment="_Gp3dvOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqBOqefXEduqHoOJbURZRw" base_Comment="_GqBOqOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqBOsufXEduqHoOJbURZRw" base_Comment="_GqBOsefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqKYkOfXEduqHoOJbURZRw" base_Comment="_GqBOuufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqKYmefXEduqHoOJbURZRw" base_Comment="_GqKYmOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqKYoufXEduqHoOJbURZRw" base_Comment="_GqKYoefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqUJkOfXEduqHoOJbURZRw" base_Comment="_GqKYqOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqUJmefXEduqHoOJbURZRw" base_Comment="_GqUJmOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqnEgOfXEduqHoOJbURZRw" base_Comment="_Gqd6k-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqnEiOfXEduqHoOJbURZRw" base_Comment="_GqnEh-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqnEjOfXEduqHoOJbURZRw" base_Comment="_GqnEi-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqnEkOfXEduqHoOJbURZRw" base_Comment="_GqnEj-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GqnElOfXEduqHoOJbURZRw" base_Comment="_GqnEk-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gqw1gefXEduqHoOJbURZRw" base_Comment="_Gqw1gOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gqw1hefXEduqHoOJbURZRw" base_Comment="_Gqw1hOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gqw1iefXEduqHoOJbURZRw" base_Comment="_Gqw1iOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gqw1jefXEduqHoOJbURZRw" base_Comment="_Gqw1jOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gq6mgOfXEduqHoOJbURZRw" base_Comment="_Gqw1kOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gq6mhOfXEduqHoOJbURZRw" base_Comment="_Gq6mg-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gq6mjefXEduqHoOJbURZRw" base_Comment="_Gq6mjOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gq6mlufXEduqHoOJbURZRw" base_Comment="_Gq6mlefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrDwc-fXEduqHoOJbURZRw" base_Comment="_GrDwcufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrNhcOfXEduqHoOJbURZRw" base_Comment="_GrDwe-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrNheefXEduqHoOJbURZRw" base_Comment="_GrNheOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrWrY-fXEduqHoOJbURZRw" base_Comment="_GrWrYufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrWrbOfXEduqHoOJbURZRw" base_Comment="_GrWra-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrWrdefXEduqHoOJbURZRw" base_Comment="_GrWrdOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrgcZ-fXEduqHoOJbURZRw" base_Comment="_GrgcZufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrqNYufXEduqHoOJbURZRw" base_Comment="_GrqNYefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrqNaOfXEduqHoOJbURZRw" base_Comment="_GrqNZ-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrqNbOfXEduqHoOJbURZRw" base_Comment="_GrqNa-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrzXUOfXEduqHoOJbURZRw" base_Comment="_GrqNbufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrzXU-fXEduqHoOJbURZRw" base_Comment="_GrzXUufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrzXV-fXEduqHoOJbURZRw" base_Comment="_GrzXVufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GrzXW-fXEduqHoOJbURZRw" base_Comment="_GrzXWufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gr9IUOfXEduqHoOJbURZRw" base_Comment="_GrzXXefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gr9IVOfXEduqHoOJbURZRw" base_Comment="_Gr9IU-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gr9IV-fXEduqHoOJbURZRw" base_Comment="_Gr9IVufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gr9IWufXEduqHoOJbURZRw" base_Comment="_Gr9IWefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsG5UOfXEduqHoOJbURZRw" base_Comment="_Gr9IXefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsG5U-fXEduqHoOJbURZRw" base_Comment="_GsG5UufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsG5WOfXEduqHoOJbURZRw" base_Comment="_GsG5V-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsG5XufXEduqHoOJbURZRw" base_Comment="_GsG5XefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsQDRufXEduqHoOJbURZRw" base_Comment="_GsQDRefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsQDT-fXEduqHoOJbURZRw" base_Comment="_GsQDTufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsQDWOfXEduqHoOJbURZRw" base_Comment="_GsQDV-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GsZ0TufXEduqHoOJbURZRw" base_Comment="_GsZ0TefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gsi-MOfXEduqHoOJbURZRw" base_Comment="_GsZ0VOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gsi-NOfXEduqHoOJbURZRw" base_Comment="_Gsi-M-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gsi-OefXEduqHoOJbURZRw" base_Comment="_Gsi-OOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gsi-PefXEduqHoOJbURZRw" base_Comment="_Gsi-POfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GssvMOfXEduqHoOJbURZRw" base_Comment="_Gsi-QOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GssvNOfXEduqHoOJbURZRw" base_Comment="_GssvM-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GssvOOfXEduqHoOJbURZRw" base_Comment="_GssvN-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GssvPOfXEduqHoOJbURZRw" base_Comment="_GssvO-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gs2gMOfXEduqHoOJbURZRw" base_Comment="_GssvQOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gs2gNOfXEduqHoOJbURZRw" base_Comment="_Gs2gM-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gs2gPefXEduqHoOJbURZRw" base_Comment="_Gs2gPOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gs2gRufXEduqHoOJbURZRw" base_Comment="_Gs2gRefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gs_qIufXEduqHoOJbURZRw" base_Comment="_Gs_qIefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gs_qK-fXEduqHoOJbURZRw" base_Comment="_Gs_qKufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gs_qNOfXEduqHoOJbURZRw" base_Comment="_Gs_qM-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtJbIefXEduqHoOJbURZRw" base_Comment="_GtJbIOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtJbKufXEduqHoOJbURZRw" base_Comment="_GtJbKefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtJbM-fXEduqHoOJbURZRw" base_Comment="_GtJbMufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtTMIOfXEduqHoOJbURZRw" base_Comment="_GtJbO-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtTMJ-fXEduqHoOJbURZRw" base_Comment="_GtTMJufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtTMLufXEduqHoOJbURZRw" base_Comment="_GtTMLefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtmHFOfXEduqHoOJbURZRw" base_Comment="_GtmHE-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtmHHOfXEduqHoOJbURZRw" base_Comment="_GtmHG-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtmHIefXEduqHoOJbURZRw" base_Comment="_GtmHIOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtvRAOfXEduqHoOJbURZRw" base_Comment="_GtmHJOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtvRBOfXEduqHoOJbURZRw" base_Comment="_GtvRA-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GtvRDefXEduqHoOJbURZRw" base_Comment="_GtvRDOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gt5CAOfXEduqHoOJbURZRw" base_Comment="_GtvRFefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gt5CDufXEduqHoOJbURZRw" base_Comment="_Gt5CDefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gt5CGefXEduqHoOJbURZRw" base_Comment="_Gt5CGOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuCzAufXEduqHoOJbURZRw" base_Comment="_GuCzAefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuCzCefXEduqHoOJbURZRw" base_Comment="_GuCzCOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuCzDOfXEduqHoOJbURZRw" base_Comment="_GuCzC-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuCzEefXEduqHoOJbURZRw" base_Comment="_GuCzEOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuL88OfXEduqHoOJbURZRw" base_Comment="_GuCzE-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuL88-fXEduqHoOJbURZRw" base_Comment="_GuL88ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuL8-OfXEduqHoOJbURZRw" base_Comment="_GuL89-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuL8--fXEduqHoOJbURZRw" base_Comment="_GuL8-ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuVt8OfXEduqHoOJbURZRw" base_Comment="_GuL8_-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuVt8-fXEduqHoOJbURZRw" base_Comment="_GuVt8ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuVt9ufXEduqHoOJbURZRw" base_Comment="_GuVt9efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuVt-efXEduqHoOJbURZRw" base_Comment="_GuVt-OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuVt_ufXEduqHoOJbURZRw" base_Comment="_GuVt_efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gufe8OfXEduqHoOJbURZRw" base_Comment="_GuVuAufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gufe8-fXEduqHoOJbURZRw" base_Comment="_Gufe8ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gufe9ufXEduqHoOJbURZRw" base_Comment="_Gufe9efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gufe-efXEduqHoOJbURZRw" base_Comment="_Gufe-OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gufe_OfXEduqHoOJbURZRw" base_Comment="_Gufe--fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Guoo4efXEduqHoOJbURZRw" base_Comment="_Guoo4OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Guoo5OfXEduqHoOJbURZRw" base_Comment="_Guoo4-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Guoo6OfXEduqHoOJbURZRw" base_Comment="_Guoo5-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Guoo6-fXEduqHoOJbURZRw" base_Comment="_Guoo6ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GuyZ4OfXEduqHoOJbURZRw" base_Comment="_Guoo7-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GvYPwOfXEduqHoOJbURZRw" base_Comment="_GvPF2ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GvYPzOfXEduqHoOJbURZRw" base_Comment="_GvYPy-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GvYP3efXEduqHoOJbURZRw" base_Comment="_GvYP3OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GviAwOfXEduqHoOJbURZRw" base_Comment="_GvYP4OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GviAxOfXEduqHoOJbURZRw" base_Comment="_GviAw-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GviAyOfXEduqHoOJbURZRw" base_Comment="_GviAx-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GviAzufXEduqHoOJbURZRw" base_Comment="_GviAzefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GvrxwOfXEduqHoOJbURZRw" base_Comment="_GviA1ufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GvrxyefXEduqHoOJbURZRw" base_Comment="_GvrxyOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gvrx0ufXEduqHoOJbURZRw" base_Comment="_Gvrx0efXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gv07sOfXEduqHoOJbURZRw" base_Comment="_Gvrx2OfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gv07t-fXEduqHoOJbURZRw" base_Comment="_Gv07tufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gv07wOfXEduqHoOJbURZRw" base_Comment="_Gv07v-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gv-ss-fXEduqHoOJbURZRw" base_Comment="_Gv-ssufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwH2pufXEduqHoOJbURZRw" base_Comment="_GwH2pefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwH2tOfXEduqHoOJbURZRw" base_Comment="_GwH2s-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwRnoOfXEduqHoOJbURZRw" base_Comment="_GwH2t-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwRno-fXEduqHoOJbURZRw" base_Comment="_GwRnoufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwRnpufXEduqHoOJbURZRw" base_Comment="_GwRnpefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwRnqefXEduqHoOJbURZRw" base_Comment="_GwRnqOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwRnr-fXEduqHoOJbURZRw" base_Comment="_GwRnrufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwbYr-fXEduqHoOJbURZRw" base_Comment="_GwbYrufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwkikOfXEduqHoOJbURZRw" base_Comment="_GwbYsufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GwkinefXEduqHoOJbURZRw" base_Comment="_GwkinOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gw4EkOfXEduqHoOJbURZRw" base_Comment="_GwuToOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gw4Ek-fXEduqHoOJbURZRw" base_Comment="_Gw4EkufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gw4ElufXEduqHoOJbURZRw" base_Comment="_Gw4ElefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GxBOgufXEduqHoOJbURZRw" base_Comment="_GxBOgefXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GxnrcOfXEduqHoOJbURZRw" base_Comment="_Gxd6dufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GxnrdOfXEduqHoOJbURZRw" base_Comment="_Gxnrc-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gxnrd-fXEduqHoOJbURZRw" base_Comment="_GxnrdufXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GxnrfOfXEduqHoOJbURZRw" base_Comment="_Gxnre-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_GxnrgOfXEduqHoOJbURZRw" base_Comment="_Gxnrf-fXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gxw1YOfXEduqHoOJbURZRw" base_Comment="_GxnrhOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gxw1ZefXEduqHoOJbURZRw" base_Comment="_Gxw1ZOfXEduqHoOJbURZRw"/>
-  <Default:Documentation xmi:id="_Gx6mYefXEduqHoOJbURZRw" base_Comment="_Gx6mYOfXEduqHoOJbURZRw"/>
-  <Ecore:EDataType xmi:id="_5GcYCeieEduQbuY6UwMSQg" instanceClassName="java.lang.Boolean" base_PrimitiveType="_5GcYAOieEduQbuY6UwMSQg"/>
-  <Default:Documentation xmi:id="_5GcYDeieEduQbuY6UwMSQg" base_Comment="_5GcYAeieEduQbuY6UwMSQg"/>
-  <Ecore:EDataType xmi:id="_BastMOifEduQbuY6UwMSQg" instanceClassName="java.lang.String" base_PrimitiveType="_3ADC7B74022D3CA010B103C3"/>
-  <Default:Documentation xmi:id="_i7FToeifEduQbuY6UwMSQg" base_Comment="_i7FToOifEduQbuY6UwMSQg"/>
-  <Ecore:EDataType xmi:id="_We-QkOoFEduOBPQA2hKqUQ" instanceClassName="int" base_PrimitiveType="_3ADC7B74022D3CA010A4007B"/>
-  <Default:Documentation xmi:id="_dUc6oeoFEduOBPQA2hKqUQ" base_Comment="_dUc6oOoFEduOBPQA2hKqUQ"/>
-  <Ecore:EDataType xmi:id="_v1nIsOoFEduOBPQA2hKqUQ" instanceClassName="java.util.Date" base_PrimitiveType="_3ADC7B74022D40F4498D0185"/>
-  <Ecore:EDataType xmi:id="_7gHA8OoFEduOBPQA2hKqUQ" instanceClassName="java.util.List" base_PrimitiveType="_3ADC7B74022D3F09899C00EA"/>
-  <Ecore:EDataType xmi:id="_AG_FcOoGEduOBPQA2hKqUQ" instanceClassName="java.util.Set" base_PrimitiveType="_3ADC7B74022D3F0989B90290"/>
-  <Ecore:EDataType xmi:id="_EIdW0OoGEduOBPQA2hKqUQ" instanceClassName="java.net.URI" base_PrimitiveType="_3ADC7B74022D4113EA2902FE"/>
-  <Ecore:EAttribute xmi:id="_ogiGoOoHEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D40F36C5F0050" isID="true"/>
-  <Ecore:EAttribute xmi:id="_52TfoOoHEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D40F36C5F0047"/>
-  <Ecore:EAttribute xmi:id="_JAIBoOoMEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D427A8A1F02F3"/>
-  <Ecore:EAttribute xmi:id="_LRaHwOoMEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D40F9AB9802B9"/>
-  <Ecore:EAttribute xmi:id="_NcbN0OoMEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D455E65C80218"/>
-  <Ecore:EAttribute xmi:id="_PFnZMOoMEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D41DF32190029"/>
-  <Ecore:EAttribute xmi:id="_RWTCYOoMEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D4279625D0234"/>
-  <Ecore:EAttribute xmi:id="_UDS0IOoMEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D421E4DF3003A"/>
-  <Ecore:EAttribute xmi:id="_pwvYAOoMEduOBPQA2hKqUQ" isUnsettable="true" base_Property="_3ADC7B74022D41DDFC8E00B6"/>
-  <Ecore:EReference xmi:id="_p6x2EOoSEduOBPQA2hKqUQ" isTransient="true" base_Property="_3ADC7B74022D427962D40203"/>
-  <Ecore:EReference xmi:id="_1qXpsOoSEduOBPQA2hKqUQ" isTransient="true" base_Property="_3ADC7B74022D40F36C9300F6"/>
-  <Ecore:EReference xmi:id="_4Z-DgOoSEduOBPQA2hKqUQ" isTransient="true" base_Property="_3ADC7B74022D40F36C9300F8"/>
-  <Default:Documentation xmi:id="_P4osYeoeEduVA7vt5qbIJQ" base_Comment="_P4osYOoeEduVA7vt5qbIJQ"/>
-  <Ecore:EDataType xmi:id="_CEIHkOx3Edu5-vVjlfVsfQ" instanceClassName="java.lang.Double" base_PrimitiveType="_AUq8IOx3Edu5-vVjlfVsfQ"/>
-</xmi:XMI>
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.ecore b/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.ecore
deleted file mode 100644
index 14b8368..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.ecore
+++ /dev/null
@@ -1,1239 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="uma"
-    nsURI="http://www.eclipse.org/epf/uma/1.0.4/uma.ecore" nsPrefix="org.eclipse.epf.uma">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="03"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EDataType" name="Date" instanceClassName="java.util.Date">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Data type used for attributes of meta-model classes of the type Date."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="Uri" instanceClassName="java.net.URI">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Data type used for attributes of meta-model classes that point to resources such as files."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="UnlimitedNatural" instanceClassName="int"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="String" instanceClassName="java.lang.String"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Set" instanceClassName="java.util.Set"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Sequence" instanceClassName="java.util.List"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Integer" instanceClassName="int"/>
-  <eClassifiers xsi:type="ecore:EDataType" name="Float" instanceClassName="java.lang.Float"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Classifier" abstract="true" eSuperTypes="#//Type">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Classifier."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Type" abstract="true" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Type."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NamedElement" abstract="true" eSuperTypes="#//Element">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Named Element.  Defined that every element has a name."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PackageableElement" abstract="true"
-      eSuperTypes="#//NamedElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Packagable Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Package" eSuperTypes="#//Namespace #//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Package."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Namespace" abstract="true" eSuperTypes="#//NamedElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="UML 2.0 meta-class Namespace."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodElement" abstract="true" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Every class defined in this specification is derived from Method Element.  In other words Method Element is the root generalization for all UMA classes and defines a common set of attributes inherited by every other element type of this model.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.  Method Element inherits the Name attribute from Packageable Element's super class.  Every element defined as a UMA instance is derived from Model Element.  Every Method Element in-stance is at least defined by a unique id, a name, as well as brief description."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="guid" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element has a global unique id."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element shall be briefly described with one or two sentences summarizing the element."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ownedRules" ordered="false"
-        upperBound="-1" eType="#//Constraint" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodElementProperty"
-        ordered="false" upperBound="-1" eType="#//MethodElementProperty" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="suppressed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If a Variability Element is derived from another Variability Element using the Extends Variability Specialization then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="orderingGuide" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute is used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Constraint" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Constraint is a Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="body" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute stores the definition of the constraint."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodElementProperty" eSuperTypes="#//PackageableElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentElement" abstract="true" eSuperTypes="#//DescribableElement #//VariabilityElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Element is a Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.&#xD;&#xA;Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportingMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="conceptsAndPapers" ordered="false"
-        upperBound="-1" eType="#//Concept"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="checklists" ordered="false"
-        upperBound="-1" eType="#//Checklist"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="guidelines" ordered="false"
-        upperBound="-1" eType="#//Guideline"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="examples" ordered="false"
-        upperBound="-1" eType="#//Example"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assets" ordered="false"
-        upperBound="-1" eType="#//ReusableAsset"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="termDefinition" ordered="false"
-        upperBound="-1" eType="#//TermDefinition"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescribableElement" abstract="true"
-      eSuperTypes="#//MethodElement #//Classifier">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Describable Element is an abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.&#xD;&#xA;This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance (see Section 4.1.4).  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentationName" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to &quot;rup_architecture_document&quot; to differentiate from a &quot;j2ee_architcture_document&quot; whereas the external presentation would always be &quot;Architecture Document&quot;."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentation" eType="#//ContentDescription"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shapeicon" eType="#//Uri">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nodeicon" eType="#//Uri">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used in tree browser presentations and breakdown structures."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentDescription" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Description is a Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mainDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute store the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sections" ordered="false"
-        upperBound="-1" eType="#//Section" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalId" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="An external visible number that is used to reference this artifact. Used like a synonym."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="keyConsiderations" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Key Considerations provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Section" eSuperTypes="#//VariabilityElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Section is a special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionName" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attributes store the description text for a Content Description's Section."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subSections" ordered="false"
-        upperBound="-1" eType="#//Section" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predecessor" eType="#//Section"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Role" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role is a content element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  &#xD;&#xA;A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="modifies" ordered="false"
-        upperBound="-1" eType="#//WorkProduct" changeable="false" volatile="true"
-        transient="true" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="responsibleFor" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProduct" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Product is an abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.&#xD;&#xA;A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reports" ordered="false"
-        upperBound="-1" eType="#//Report"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="templates" ordered="false"
-        upperBound="-1" eType="#//Template"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimationConsiderations"
-        ordered="false" upperBound="-1" eType="#//EstimationConsiderations"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Task" eSuperTypes="#//ContentElement #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Task is a content element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.&#xD;&#xA;A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). &#xD;&#xA;A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. &#xD;&#xA;For example, a Task such as &quot;Develop Use Case Model&quot; describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the &quot;method&quot; of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performedBy" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mandatoryInput" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="output" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="additionallyPerformedBy"
-        ordered="false" upperBound="-1" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="optionalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="steps" ordered="false"
-        upperBound="-1" eType="#//Step" changeable="false" volatile="true" transient="true"
-        derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="estimationConsiderations"
-        ordered="false" upperBound="-1" eType="#//EstimationConsiderations"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkDefinition" abstract="true" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Definition is an abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.&#xD;&#xA;Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="precondition" eType="#//Constraint"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="postcondition" eType="#//Constraint"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Step" eSuperTypes="#//Section #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Step is a Section and Work Definition that is used to organize Tasks into parts or subunits of work.  Steps inherit the subSections decomposition from Section and can therefore describe Sub-Steps nested into Steps.&#xD;&#xA;A Step describes a meaningful and consist part of the overall work described for a Task.  The collection of Steps defined for a Task represents all the work that should be done to achieve the overall development goal of the Task.  Not all steps are necessarily performed each time a Task is invoked in a Process (see Task Descriptor), so they can also be expressed in the form of alternate 'flows' of work.  Different ways of achieving the same development goal can then be 'assembled' by selecting different combinations of steps when applying the Task in a Process.  Typical kinds of steps a Task author should consider are: Thinking steps: where the individual roles understand the nature of the task, gathers and examines the input artifacts, and formulates the outcome. Performing steps: where the individual roles create or update some artifacts. Reviewing steps: where the individual roles inspects the results against some criteria."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guidance" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Artifact" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Artifact is a Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.&#xD;&#xA;Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might &quot;own&quot; a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="containerArtifact" eType="#//Artifact"
-        transient="true" eOpposite="#//Artifact/containedArtifacts"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="containedArtifacts" ordered="false"
-        upperBound="-1" eType="#//Artifact" containment="true" eOpposite="#//Artifact/containerArtifact"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Deliverable" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A deliverable is a Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliveredWorkProducts"
-        ordered="false" upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Outcome" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An outcome describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPackage" abstract="true" eSuperTypes="#//MethodElement #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Package is an abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="global" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reusedPackages" ordered="false"
-        upperBound="-1" eType="#//MethodPackage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childPackages" ordered="false"
-        upperBound="-1" eType="#//MethodPackage" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Content Package is special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentElements" ordered="false"
-        upperBound="-1" eType="#//ContentElement" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ArtifactDescription" eSuperTypes="#//WorkProductDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefOutline" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="representationOptions"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="representation" eType="#//String"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notation" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes why the work product is produced and to what use it will be put."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="impactOfNotHaving" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reasonsForNotNeeding" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliverableDescription" eSuperTypes="#//WorkProductDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="packagingGuidance" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="skills" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists of set of required skills a person needs to possess to fulfill that Role."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="assignmentApproaches" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="synonyms" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Task and what is intended to be achieved."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GuidanceDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="attachments" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PracticeDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="additionalInfo" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional Information not covered by the other attributes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="problem" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A description of the problem the Practice addresses."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="background" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goals" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A summary of the overall goals to be addressed by the Practice."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="application" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes how the Practice is being applied or introduced into the context described in background."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelsOfAdoption" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Point">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="x" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="y" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphElement" abstract="true" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="position" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contained" ordered="false"
-        upperBound="-1" eType="#//DiagramElement" containment="true" eOpposite="#//DiagramElement/container"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="link" ordered="false" upperBound="-1"
-        eType="#//DiagramLink" containment="true" eOpposite="#//DiagramLink/graphElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="anchorage" ordered="false"
-        upperBound="-1" eType="#//GraphConnector" containment="true" eOpposite="#//GraphConnector/graphElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="semanticModel" lowerBound="1"
-        eType="#//SemanticModelBridge" containment="true" eOpposite="#//SemanticModelBridge/graphElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DiagramElement" abstract="true" eSuperTypes="#//MethodElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isVisible" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="container" eType="#//GraphElement"
-        transient="true" eOpposite="#//GraphElement/contained"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reference" ordered="false"
-        upperBound="-1" eType="#//Reference" eOpposite="#//Reference/referenced"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" ordered="false"
-        upperBound="-1" eType="#//Property" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DiagramLink" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="zoom" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewport" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" lowerBound="1"
-        eType="#//GraphElement" transient="true" eOpposite="#//GraphElement/link"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagram" lowerBound="1"
-        eType="#//Diagram" eOpposite="#//Diagram/diagramLink"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphConnector" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" lowerBound="1"
-        eType="#//GraphElement" transient="true" eOpposite="#//GraphElement/anchorage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphEdge" ordered="false"
-        upperBound="-1" eType="#//GraphEdge" eOpposite="#//GraphEdge/anchor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SemanticModelBridge" abstract="true"
-      eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentation" eType="#//String"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="graphElement" eType="#//GraphElement"
-        transient="true" eOpposite="#//GraphElement/semanticModel"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagram" eType="#//Diagram"
-        transient="true" eOpposite="#//Diagram/namespace"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Dimension">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="width" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="height" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Reference" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isIndividualRepresentation"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referenced" lowerBound="1"
-        eType="#//DiagramElement" eOpposite="#//DiagramElement/reference"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Property" eSuperTypes="#//DiagramElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="#//String"
-        defaultValueLiteral=""/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphEdge" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="anchor" ordered="false"
-        lowerBound="2" upperBound="2" eType="#//GraphConnector" eOpposite="#//GraphConnector/graphEdge"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="waypoints" ordered="false"
-        lowerBound="2" upperBound="-1" eType="#//Point" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Diagram" eSuperTypes="#//GraphNode">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="zoom" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewpoint" eType="#//Point"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagramLink" ordered="false"
-        upperBound="-1" eType="#//DiagramLink" eOpposite="#//DiagramLink/diagram"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="namespace" lowerBound="1"
-        eType="#//SemanticModelBridge" containment="true" eOpposite="#//SemanticModelBridge/diagram"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphNode" eSuperTypes="#//GraphElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="size" eType="#//Dimension"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SimpleSemanticModelElement" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeInfo" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="UMASemanticModelBridge" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="element" lowerBound="1"
-        eType="#//MethodElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CoreSemanticModelBridge" eSuperTypes="#//SemanticModelBridge">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="element" lowerBound="1"
-        eType="#//Element"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LeafElement" abstract="true" eSuperTypes="#//DiagramElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="TextElement" eSuperTypes="#//LeafElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="text" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Image" eSuperTypes="#//LeafElement">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="#//Uri"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mimeType" eType="#//String"
-        defaultValueLiteral=""/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GraphicPrimitive" abstract="true" eSuperTypes="#//LeafElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Polyline" eSuperTypes="#//GraphicPrimitive">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="closed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="waypoints" ordered="false"
-        lowerBound="2" upperBound="-1" eType="#//Point" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Ellipse" eSuperTypes="#//GraphicPrimitive">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="radiusX" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="radiusY" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rotation" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startAngle" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="endAngle" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDoubleObject"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="center" eType="#//Point"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Activity" eSuperTypes="#//WorkBreakdownElement #//VariabilityElement #//WorkDefinition">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Activity is a Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.&#xD;&#xA;Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="breakdownElements" ordered="false"
-        upperBound="-1" eType="#//BreakdownElement" eOpposite="#//BreakdownElement/superActivities"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roadmaps" ordered="false"
-        upperBound="-1" eType="#//Roadmap"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportingMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="checklists" ordered="false"
-        upperBound="-1" eType="#//Checklist"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="concepts" ordered="false"
-        upperBound="-1" eType="#//Concept"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="examples" ordered="false"
-        upperBound="-1" eType="#//Example"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="guidelines" ordered="false"
-        upperBound="-1" eType="#//Guideline"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="reusableAssets" ordered="false"
-        upperBound="-1" eType="#//ReusableAsset"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEnactable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkBreakdownElement" abstract="true"
-      eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Breakdown Element is a special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRepeatable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOngoing" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEventDriven" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.&#xD;&#xA;&#xD;&#xA;"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="linkToPredecessor" ordered="false"
-        upperBound="-1" eType="#//WorkOrder"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElement" abstract="true" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Breakdown Element is an abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="prefix" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. &quot;SRA.Establish Requirements&quot; with SRA indicating that this Activity belongs to the &quot;Software Requirements Analysis&quot; module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, &quot;Customer.Architect&quot; would define a &quot;Customer&quot; prefix for the Role Descriptor &quot;Architect&quot; expressing that this is an architect on the customer side and not the development team side."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isPlanned" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.&#xD;&#xA;&#xD;&#xA;"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hasMultipleOccurrences"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as &quot;Detail Use Case&quot; would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOptional" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The isOptional attribute indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentedAfter" eType="#//BreakdownElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentedBefore" eType="#//BreakdownElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="planningData" eType="#//PlanningData"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="superActivities" lowerBound="1"
-        eType="#//Activity" eOpposite="#//Activity/breakdownElements"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Milestone" eSuperTypes="#//WorkBreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Milestone describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure)."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Iteration" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Iteration is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Phase" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Phase is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TeamProfile" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Team Profile is a Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.&#xD;&#xA;Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).&#xD;&#xA;Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="teamRoles" ordered="false"
-        upperBound="-1" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="superTeam" lowerBound="1"
-        eType="#//TeamProfile" eOpposite="#//TeamProfile/subTeam"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subTeam" ordered="false"
-        upperBound="-1" eType="#//TeamProfile" eOpposite="#//TeamProfile/superTeam"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role Descriptor represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Role" eType="#//Role"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="modifies" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" changeable="false" volatile="true"
-        transient="true" derived="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="responsibleFor" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="WorkOrderType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Order represents a relationship between two Breakdown Element in which one Breakdown Element (referred to as (B) below) depends on the start or finish of another Breakdown Element (referred to as (A) below) in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute."/>
-    </eAnnotations>
-    <eLiterals name="finishToStart"/>
-    <eLiterals name="finishToFinish" value="1"/>
-    <eLiterals name="startToStart" value="2"/>
-    <eLiterals name="startToFinish" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkOrder" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Order is a Method Element that represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  &#xD;&#xA;(Note, Work Order is not modeled as an Association Class to provide a straightforward mapping  to XMI and EMF.)&#xD;&#xA;The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkType" eType="#//WorkOrderType"
-        defaultValueLiteral="finishToStart">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="pred" lowerBound="1" eType="#//WorkBreakdownElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessElement" abstract="true" eSuperTypes="#//DescribableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Process Element is a Describable Element that represents an abstract generalization for all elements defined in the Process package.&#xD;&#xA;Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. "/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PlanningData" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Planning Data is a Method Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.&#xD;&#xA;Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.&#xD;&#xA;(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default start date for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishDate" eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default finish date for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rank" eType="#//Integer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default rank for a planed Task."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Descriptor" abstract="true" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Descriptor is an abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.&#xD;&#xA;Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. "/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSynchronizedWithSource"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Product Descriptor represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityEntryState" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  &#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityExitState" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).&#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="WorkProduct" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="impactedBy" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/impacts"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="impacts" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" eOpposite="#//WorkProductDescriptor/impactedBy"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliverableParts" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescriptor" eSuperTypes="#//WorkBreakdownElement #//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Task Descriptor is a Descriptor and Work Breakdown Element that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.&#xD;&#xA;A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.&#xD;&#xA;"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Task" eType="#//Task"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="additionallyPerformedBy"
-        ordered="false" upperBound="-1" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="assistedBy" ordered="false"
-        upperBound="-1" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mandatoryInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="optionalInput" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="output" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="performedPrimarilyBy" eType="#//RoleDescriptor"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="selectedSteps" ordered="false"
-        upperBound="-1" eType="#//Section"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CompositeRole" eSuperTypes="#//RoleDescriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Composite Role is a special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.&#xD;&#xA;A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="aggregatedRoles" ordered="false"
-        upperBound="-1" eType="#//Role"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElementDescription" eSuperTypes="#//ContentDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageGuidance" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="howtoStaff" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcessDescription" eSuperTypes="#//ProcessDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scale" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectCharacteristics"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Characterizes the project that would typically perform this Process"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="riskLevel" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines typical project risks that are addressed with this process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimatingTechnique" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the Estimation Techniques provided for this Process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectMemberExpertise"
-        eType="#//String" defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeOfContract" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background information about the contracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement)."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessDescription" eSuperTypes="#//ActivityDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scope" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the scope of the Process, i.e. which types of projects does it address and which not."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageNotes" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional notes on how to apply and instantiate this process for a project."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescriptorDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="refinedDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. "/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Concept" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Concept is a specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Checklist" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Checklist is a specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. "/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Example" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Example is a specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guideline" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Guideline is a specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Report" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Report is a predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Template" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Template is a specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SupportingMaterial" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Supporting Materials is catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ToolMentor" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Tool Mentor is a specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Whitepaper" eSuperTypes="#//Concept">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Whitepapers are a special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TermDefinition" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="TermDefinitions define concepts and are used to build up the Glossary. They are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Practice" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Practice represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be &quot;Manage Risks&quot;, &quot;Continuously verify quality&quot;, &quot;Architecture-centric and component-based development&quot;, etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subPractices" ordered="false"
-        upperBound="-1" eType="#//Practice" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentReferences" ordered="false"
-        upperBound="-1" eType="#//ContentElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="activityReferences" ordered="false"
-        upperBound="-1" eType="#//Activity"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EstimationConsiderations" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Estimation Considerations qualify the usage and application of estimation metrics in the development of an actual estimate."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReusableAsset" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Reusable Asset provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing&#xD;&#xA;how the asset should be used."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="State" eSuperTypes="#//Vertex">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="WorkProduct" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Region" ordered="false"
-        upperBound="-1" eType="#//Region" containment="true" eOpposite="#//Region/State"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="submachine" eType="#//StateMachine"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Vertex">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="container" eType="#//Region"
-        transient="true" eOpposite="#//Region/Vertex"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="outgoing" ordered="false"
-        upperBound="-1" eType="#//Transition" eOpposite="#//Transition/source"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="incoming" ordered="false"
-        upperBound="-1" eType="#//Transition" eOpposite="#//Transition/target"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Region">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Vertex" ordered="false"
-        upperBound="-1" eType="#//Vertex" containment="true" eOpposite="#//Vertex/container"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Transition" ordered="false"
-        upperBound="-1" eType="#//Transition" containment="true" eOpposite="#//Transition/container"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="State" eType="#//State"
-        transient="true" eOpposite="#//State/Region"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="StateMachine" eType="#//StateMachine"
-        transient="true" eOpposite="#//StateMachine/Region"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="StateMachine" eSuperTypes="#//WorkDefinition">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="Region" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//Region" containment="true" eOpposite="#//Region/StateMachine"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Transition">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="WorkDefinition" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//WorkDefinition"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="container" lowerBound="1"
-        eType="#//Region" transient="true" eOpposite="#//Region/Transition"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1"
-        eType="#//Vertex" eOpposite="#//Vertex/outgoing"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="target" lowerBound="1"
-        eType="#//Vertex" eOpposite="#//Vertex/incoming"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PseudoState" eSuperTypes="#//Vertex"/>
-  <eClassifiers xsi:type="ecore:EEnum" name="PseudoStateKind">
-    <eLiterals name="initial"/>
-    <eLiterals name="join" value="1"/>
-    <eLiterals name="fork" value="2"/>
-    <eLiterals name="junction" value="3"/>
-    <eLiterals name="choice" value="4"/>
-    <eLiterals name="entryPoint" value="5"/>
-    <eLiterals name="exitPoint" value="6"/>
-    <eLiterals name="terminate" value="7"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Discipline" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Discipline is a categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.&#xD;&#xA;A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tasks" ordered="false"
-        upperBound="-1" eType="#//Task"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subdiscipline" ordered="false"
-        upperBound="-1" eType="#//Discipline" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referenceWorkflows" ordered="false"
-        upperBound="-1" eType="#//Activity"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentCategory" abstract="true" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Content Category is an abstract class generalizing content category types."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSet" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Role Set organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the &quot;Analysts&quot; Role Set could group the &quot;Business Process Analyst&quot;, &quot;System Analyst&quot;, as well as &quot;Requirements Specifier&quot; roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roles" ordered="false"
-        upperBound="-1" eType="#//Role"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Domain" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Domain is a refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.&#xD;&#xA;Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workProducts" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subdomains" ordered="false"
-        upperBound="-1" eType="#//Domain" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductType" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Work Product Type is a second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is &quot;Class Diagram&quot;, which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or &quot;Specification&quot;, which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="workProducts" ordered="false"
-        upperBound="-1" eType="#//WorkProduct"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisciplineGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Discipline Groupings are used to group Disciplines.  For example, the Discipline Grouping &quot;Software Disciplines&quot; would be the group of all disciplines related to developing software such as &quot;Requirements Management&quot; or &quot;Testing&quot;; &quot;IT Infrastructure Management&quot; would be a Disciplines Grouping for disciplines such as &quot;IT Operational Services&quot;, &quot;IT Customer Relationships&quot;, or &quot;IT Enabling Services&quot;.  Disciplines can be associated to more than one Discipline Grouping."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="disciplines" ordered="false"
-        upperBound="-1" eType="#//Discipline"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Tool" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Tool is a container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toolMentors" ordered="false"
-        upperBound="-1" eType="#//ToolMentor"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSetGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="roleSets" ordered="false"
-        upperBound="-1" eType="#//RoleSet"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CustomCategory" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Custom Category is a category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a &quot;Testing&quot; category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="categorizedElements" ordered="false"
-        upperBound="-1" eType="#//DescribableElement"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subCategories" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcess" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Delivery Processes is a special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.&#xD;&#xA;A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="educationMaterials" ordered="false"
-        upperBound="-1" eType="#//SupportingMaterial"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="communicationsMaterials"
-        ordered="false" upperBound="-1" eType="#//SupportingMaterial"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Process" abstract="true" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process is a special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.&#xD;&#xA;Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed)."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="includesPatterns" ordered="false"
-        upperBound="-1" eType="#//CapabilityPattern"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultContext" lowerBound="1"
-        eType="#//MethodConfiguration"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validContext" ordered="false"
-        upperBound="-1" eType="#//MethodConfiguration"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CapabilityPattern" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Capability Pattern is a special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.&#xD;&#xA;A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:&#xD;&#xA;- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.&#xD;&#xA;- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).&#xD;&#xA;- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPlanningTemplate" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Planning Template is a special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).&#xD;&#xA;A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="basedOnProcesses" ordered="false"
-        upperBound="-1" eType="#//Process"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Roadmap" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Roadmap is a special Guidance Type which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.&#xD;&#xA;An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information."/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponent" eSuperTypes="#//ProcessPackage #//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component is a special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).&#xD;&#xA;UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a &quot;black box&quot;.  At any point during a project the component &quot;realization&quot; detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaces" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//ProcessComponentInterface"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="process" lowerBound="1"
-        eType="#//Process" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Process Package is a special Method Package that contains Process Elements, only.&#xD;&#xA;A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="processElements" ordered="false"
-        upperBound="-1" eType="#//ProcessElement" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diagrams" ordered="false"
-        upperBound="-1" eType="#//Diagram" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponentInterface" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component Interface comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceSpecifications"
-        ordered="false" upperBound="-1" eType="#//TaskDescriptor" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceIO" ordered="false"
-        upperBound="-1" eType="#//WorkProductDescriptor" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponentDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Component Descriptor represents a Process Component application in a Process, i.e. the breakdown structure defining the Process.  The Process Component Descriptor is used to encapsulate the details of the component in a breakdown structure and to provide its own set of relationships such as it own predecessors and successors."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ProcessComponent" lowerBound="1"
-        eType="#//ProcessComponent"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPlugin" eSuperTypes="#//MethodUnit #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Plugin is a Method Element that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.&#xD;&#xA;Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.&#xD;&#xA;Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="userChangeable" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"
-        defaultValueLiteral="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackages" ordered="false"
-        lowerBound="1" upperBound="-1" eType="#//MethodPackage" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="bases" ordered="false"
-        upperBound="-1" eType="#//MethodPlugin"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VariabilityElement" abstract="true"
-      eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Variability Element is an abstract class derived from Method Element that provides new capabilities for content variation and extension to Content Elements or any other Method Element that derives from it.  It has been placed in-between the classes Method Element and Content Element in the overall UMA taxonomy of classes using the UML 2.0 package merge mechanism.  The association Variability Specialization shall only be instantiated between two subclasses of Variability Element of the same type.  The element on varaibilitySpecialElement side of the relationship defines a value for the attribute variabilityType defining the nature of the relationship using a literal from the enumeration Variability Type.&#xD;&#xA;Variability Element of the meta-model package Method Plugins adds the capabilities of variation and extension to Method Elements that derive from it.  By default all Content Elements such as Role, Task, Guidance Types, or Activities are defined to be Variability Elements.&#xD;&#xA;Variability and extension provides unique mechanisms for customizing method content without actually directly modifying the original content, but by just be able to describe with separate objects the differences (additions, changes, omissions) relative to the original.  This plug-in concept allows users to factor their method content and processes in interrelated units and even to architect method content and processes in layers that extend each other with new capabilities.  The resulting method and process design can be dynamically combined and applied on demand using the interpretation rules defined for Variability Element Specializations assembling to process practitioners the most accurate method and process descriptions possible.  It also allows process practitioners to extends and tailor method content and processes they do not own and to easily upgrade to newer versions by simply reapply their personal changes to these upgrades.&#xD;&#xA;Variability Element defines two types of variability and one type of extension which are formally defined for the enumeration Variability Type."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityType" eType="#//VariabilityType"
-        defaultValueLiteral="na">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If in instance of the variabilitySpecialization association between two Variability Elements of the same type exists, then the variabilityType attribute specifies how the element at the variabilitySpecialElement end of the association changes the Content Element at the variabilityBasedOnElement end. See the Variability Type enumeration class for definitions for the different types of variability."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variabilityBasedOnElement"
-        lowerBound="1" eType="#//VariabilityElement"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="VariabilityType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Variability Type is an Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type."/>
-    </eAnnotations>
-    <eLiterals name="na"/>
-    <eLiterals name="contributes" value="1"/>
-    <eLiterals name="extends" value="2"/>
-    <eLiterals name="replaces" value="3"/>
-    <eLiterals name="localContribution" value="4"/>
-    <eLiterals name="localReplacement" value="5"/>
-    <eLiterals name="extendsReplaces" value="6"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodUnit" abstract="true" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Unit is a special Method Element that shall be maintained in a Method Library as a separate unit of control."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="authors" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Method Unit is being created and owned by an author or authoring team."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDate" eType="#//Date">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date the last change that resulted into this version has been made."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDescription" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the last change that resulted into this version."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" eType="#//String"
-        defaultValueLiteral="">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Package has a version number used to track changes."/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="copyrightStatement" lowerBound="1"
-        eType="#//SupportingMaterial"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodConfiguration" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Configuration is a collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPluginSelection"
-        ordered="false" lowerBound="1" upperBound="-1" eType="#//MethodPlugin"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackageSelection"
-        ordered="false" lowerBound="1" upperBound="-1" eType="#//MethodPackage"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="processViews" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultView" lowerBound="1"
-        eType="#//ContentCategory"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseConfigurations" ordered="false"
-        upperBound="-1" eType="#//MethodConfiguration"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subtractedCategory" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="addedCategory" ordered="false"
-        upperBound="-1" eType="#//ContentCategory"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessFamily" eSuperTypes="#//MethodConfiguration">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Delivery Model Family is a convenient grouping of Delivery Processes and Capability Patterns of interest to some specific user community."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="deliveryProcesses" ordered="false"
-        upperBound="-1" eType="#//DeliveryProcess"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodLibrary" eSuperTypes="#//MethodUnit #//Package">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library."/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPlugins" ordered="false"
-        upperBound="-1" eType="#//MethodPlugin" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predefinedConfigurations"
-        ordered="false" upperBound="-1" eType="#//MethodConfiguration" containment="true"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.emx b/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.emx
deleted file mode 100644
index 0f76933..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.emx
+++ /dev/null
@@ -1,3321 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--xtools2_universal_type_manager-->
-<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.uml.msl.model" version="7.0.0"><feature description="" name="com.ibm.xtools.ruml.feature" url="" version="7.0.0"/></signature>?>
-<?com.ibm.xtools.emf.core.signature <signature id="com.ibm.xtools.mmi.ui.signatures.diagram" version="7.0.0"><feature description="" name="Rational Modeling Platform (com.ibm.xtools.rmp)" url="" version="7.0.0"/></signature>?>
-<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Default="http:///schemas/Default/1" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/3" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/2.0.0/UML" xsi:schemaLocation="http:///schemas/Default/1 pathmap://UML2_MSL_PROFILES/Default.epx#_IN8k8MmBEdqBcN1R6EvWUw?Default/Default? http://www.eclipse.org/uml2/schemas/Ecore/3 pathmap://UML_PROFILES/Ecore.profile.uml#_vy-HUYinEdqtvbnfB2L_5w">
-  <uml:Model xmi:id="_J7tG0OyCEdu5-vVjlfVsfQ" name="uma">
-    <eAnnotations xmi:id="_J7tG0eyCEdu5-vVjlfVsfQ" source="uml2.diagrams"/>
-    <eAnnotations xmi:id="_zTl18O-sEduH59KSHV8vgA" source="http://www.eclipse.org/uml2/2.0.0/UML">
-      <eAnnotations xmi:id="_zTl18e-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UML2InfrastructureMini::Constructs" references="_yxKfCu-sEduH59KSHV8vgA _yxKfDe-sEduH59KSHV8vgA _yxKfEu-sEduH59KSHV8vgA _yxKfD--sEduH59KSHV8vgA _yxKfFu-sEduH59KSHV8vgA _yxUPUO-sEduH59KSHV8vgA _yxUPVO-sEduH59KSHV8vgA _yxUPWO-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl18u-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UML2InfrastructureMini::PrimitiveTypes" references="_yxUPZO-sEduH59KSHV8vgA _yxUPZu-sEduH59KSHV8vgA _yxUPaO-sEduH59KSHV8vgA _yxUPau-sEduH59KSHV8vgA _yxUPa--sEduH59KSHV8vgA _yxUPbO-sEduH59KSHV8vgA _yxUPbu-sEduH59KSHV8vgA _yxUPcO-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl18--sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodCore::BasicElements" references="_yxw7RO-sEduH59KSHV8vgA _yxw7Se-sEduH59KSHV8vgA _yxw7Tu-sEduH59KSHV8vgA _yxw7Ue-sEduH59KSHV8vgA _yxw7Qe-sEduH59KSHV8vgA _yxw7VO-sEduH59KSHV8vgA _yxw7Wu-sEduH59KSHV8vgA _yxw7X--sEduH59KSHV8vgA _yxw7V--sEduH59KSHV8vgA _yxw7Ze-sEduH59KSHV8vgA _yxw7au-sEduH59KSHV8vgA _yxw7b--sEduH59KSHV8vgA _yxw7Yu-sEduH59KSHV8vgA _yxw7de-sEduH59KSHV8vgA _yxw7cu-sEduH59KSHV8vgA _yxw7fu-sEduH59KSHV8vgA _yxw7g--sEduH59KSHV8vgA _yxw7eu-sEduH59KSHV8vgA _yxw7iO-sEduH59KSHV8vgA _yxw7hu-sEduH59KSHV8vgA _yxw7ju-sEduH59KSHV8vgA _yxw7jO-sEduH59KSHV8vgA _yxw7ke-sEduH59KSHV8vgA _yxw7j--sEduH59KSHV8vgA _yxw7lu-sEduH59KSHV8vgA _yxw7lO-sEduH59KSHV8vgA _yxw7m--sEduH59KSHV8vgA _yxw7me-sEduH59KSHV8vgA _yx6FMe-sEduH59KSHV8vgA _yx6FMO-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl19O-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodPlugin" references="_yxw7Qe-sEduH59KSHV8vgA _yxw7VO-sEduH59KSHV8vgA _yxw7Yu-sEduH59KSHV8vgA _y7mMsO-sEduH59KSHV8vgA _zGLFBO-sEduH59KSHV8vgA _zGLFBu-sEduH59KSHV8vgA _zGLFCe-sEduH59KSHV8vgA _zGLFAO-sEduH59KSHV8vgA _zGLFD--sEduH59KSHV8vgA _zGLFEu-sEduH59KSHV8vgA _zGLFF--sEduH59KSHV8vgA _zGLFJ--sEduH59KSHV8vgA _zGLFKu-sEduH59KSHV8vgA _zGLFJO-sEduH59KSHV8vgA _zGLFL--sEduH59KSHV8vgA _zGU2Au-sEduH59KSHV8vgA _zGU2AO-sEduH59KSHV8vgA _zGU2B--sEduH59KSHV8vgA _zGU2Be-sEduH59KSHV8vgA _zGU2DO-sEduH59KSHV8vgA _zGU2Cu-sEduH59KSHV8vgA _zGU2Ee-sEduH59KSHV8vgA _zGU2D--sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl19e-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodCore::GuidanceTypes" references="_yxw7VO-sEduH59KSHV8vgA _yyzdGu-sEduH59KSHV8vgA _yyzdMO-sEduH59KSHV8vgA _yz1-4e-sEduH59KSHV8vgA _yz1-5O-sEduH59KSHV8vgA _yz1-5--sEduH59KSHV8vgA _yz1-6u-sEduH59KSHV8vgA _yz1-7e-sEduH59KSHV8vgA _yz1-8O-sEduH59KSHV8vgA _yz1-8--sEduH59KSHV8vgA _yz1-9u-sEduH59KSHV8vgA _yz1--e-sEduH59KSHV8vgA _yz1-_O-sEduH59KSHV8vgA _yz1_Au-sEduH59KSHV8vgA _yz1_Be-sEduH59KSHV8vgA _yz1-_--sEduH59KSHV8vgA _yz1_Ce-sEduH59KSHV8vgA _yz1_DO-sEduH59KSHV8vgA _yz1_D--sEduH59KSHV8vgA _yz1_Eu-sEduH59KSHV8vgA _yz_v4O-sEduH59KSHV8vgA _yz_v4--sEduH59KSHV8vgA _yz_v5--sEduH59KSHV8vgA _yz_v6u-sEduH59KSHV8vgA _yz_v7e-sEduH59KSHV8vgA _yz_v8O-sEduH59KSHV8vgA _yz_v8--sEduH59KSHV8vgA _yz_v9u-sEduH59KSHV8vgA _yz_v-e-sEduH59KSHV8vgA _yz_v_O-sEduH59KSHV8vgA _yz_v_--sEduH59KSHV8vgA _yz_wBO-sEduH59KSHV8vgA _yz_wAu-sEduH59KSHV8vgA _yz_wCe-sEduH59KSHV8vgA _yz_wB--sEduH59KSHV8vgA _yz_wDu-sEduH59KSHV8vgA _yz_wDO-sEduH59KSHV8vgA _yz_wE--sEduH59KSHV8vgA _yz_wEe-sEduH59KSHV8vgA _yz_wGO-sEduH59KSHV8vgA _yz_wFu-sEduH59KSHV8vgA _yz_wHe-sEduH59KSHV8vgA _yz_wG--sEduH59KSHV8vgA _yz_wIu-sEduH59KSHV8vgA _yz_wIO-sEduH59KSHV8vgA _yz_wJ--sEduH59KSHV8vgA _yz_wJe-sEduH59KSHV8vgA _yz_wLO-sEduH59KSHV8vgA _yz_wKu-sEduH59KSHV8vgA _y0Jg4u-sEduH59KSHV8vgA _y0Jg4O-sEduH59KSHV8vgA _y0Jg5--sEduH59KSHV8vgA _y0Jg5e-sEduH59KSHV8vgA _y0Jg6--sEduH59KSHV8vgA _y0Jg6u-sEduH59KSHV8vgA _y0Jg7--sEduH59KSHV8vgA _y0Jg7u-sEduH59KSHV8vgA _y0Jg8--sEduH59KSHV8vgA _y0Jg8u-sEduH59KSHV8vgA _y0Jg9--sEduH59KSHV8vgA _y0Jg9u-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl19u-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodCore::MethodCoreDescriptions" references="_yxw7V--sEduH59KSHV8vgA _yxw7eu-sEduH59KSHV8vgA _y1MCsu-sEduH59KSHV8vgA _y1MCt--sEduH59KSHV8vgA _y1MCvO-sEduH59KSHV8vgA _y1MCwO-sEduH59KSHV8vgA _y1MCsO-sEduH59KSHV8vgA _y1MCxu-sEduH59KSHV8vgA _y1MCy--sEduH59KSHV8vgA _y1MCxO-sEduH59KSHV8vgA _y1MC0u-sEduH59KSHV8vgA _y1MC1--sEduH59KSHV8vgA _y1MC3O-sEduH59KSHV8vgA _y1MC0O-sEduH59KSHV8vgA _y1MC4--sEduH59KSHV8vgA _y1MC6O-sEduH59KSHV8vgA _y1MC4e-sEduH59KSHV8vgA _y1MC7--sEduH59KSHV8vgA _y1MC9O-sEduH59KSHV8vgA _y1MC-e-sEduH59KSHV8vgA _y1MC7e-sEduH59KSHV8vgA _y1MDAO-sEduH59KSHV8vgA _y1MC_u-sEduH59KSHV8vgA _y1MDB--sEduH59KSHV8vgA _y1MDDO-sEduH59KSHV8vgA _y1MDEe-sEduH59KSHV8vgA _y1MDFu-sEduH59KSHV8vgA _y1MDG--sEduH59KSHV8vgA _y1MDIO-sEduH59KSHV8vgA _y1MDBe-sEduH59KSHV8vgA _y1MDJu-sEduH59KSHV8vgA _y1MDK--sEduH59KSHV8vgA _y1MDMO-sEduH59KSHV8vgA _y1MDNe-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl19--sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodLibrary::MethodUnits" references="_yxw7V--sEduH59KSHV8vgA _zDpVcO-sEduH59KSHV8vgA _zGLFAO-sEduH59KSHV8vgA _zN7S1e-sEduH59KSHV8vgA _zN7S2u-sEduH59KSHV8vgA _zN7S3u-sEduH59KSHV8vgA _zN7S4--sEduH59KSHV8vgA _zN7S6O-sEduH59KSHV8vgA _zN7S0u-sEduH59KSHV8vgA _zOEcw--sEduH59KSHV8vgA _zOEcwe-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl1-O-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodCore::CoreContentElements" references="_yyzdFO-sEduH59KSHV8vgA _yyzdF--sEduH59KSHV8vgA _yyzdEe-sEduH59KSHV8vgA _yyzdHu-sEduH59KSHV8vgA _yyzdIe-sEduH59KSHV8vgA _yyzdJO-sEduH59KSHV8vgA _yyzdJ--sEduH59KSHV8vgA _yyzdKu-sEduH59KSHV8vgA _yyzdLe-sEduH59KSHV8vgA _yyzdGu-sEduH59KSHV8vgA _yyzdMO-sEduH59KSHV8vgA _yyzdM--sEduH59KSHV8vgA _yyzdOe-sEduH59KSHV8vgA _yyzdPO-sEduH59KSHV8vgA _yyzdNu-sEduH59KSHV8vgA _yyzdQu-sEduH59KSHV8vgA _yyzdP--sEduH59KSHV8vgA _yyzdRe-sEduH59KSHV8vgA _yyzdSO-sEduH59KSHV8vgA _yyzdT--sEduH59KSHV8vgA _yyzdUu-sEduH59KSHV8vgA _yyzdTO-sEduH59KSHV8vgA _yyzdV--sEduH59KSHV8vgA _yyzdVe-sEduH59KSHV8vgA _yyzdXO-sEduH59KSHV8vgA _yyzdWu-sEduH59KSHV8vgA _yyzdYe-sEduH59KSHV8vgA _yyzdX--sEduH59KSHV8vgA _yyzdZu-sEduH59KSHV8vgA _yyzdZO-sEduH59KSHV8vgA _yyzda--sEduH59KSHV8vgA _yyzdae-sEduH59KSHV8vgA _yy9OEu-sEduH59KSHV8vgA _yy9OEO-sEduH59KSHV8vgA _yy9OFe-sEduH59KSHV8vgA _yy9OGe-sEduH59KSHV8vgA _yy9OF--sEduH59KSHV8vgA _yy9OHu-sEduH59KSHV8vgA _yy9OHO-sEduH59KSHV8vgA _yy9OI--sEduH59KSHV8vgA _yy9OIe-sEduH59KSHV8vgA _yy9OJu-sEduH59KSHV8vgA _yy9OJO-sEduH59KSHV8vgA _yy9OKe-sEduH59KSHV8vgA _yy9OJ--sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl1-e-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::Process::ProcessTypes" references="_yz1-_--sEduH59KSHV8vgA _y2OkgO-sEduH59KSHV8vgA _y7mMsO-sEduH59KSHV8vgA _y-4KM--sEduH59KSHV8vgA _y-4KNu-sEduH59KSHV8vgA _y-4KMO-sEduH59KSHV8vgA _y-4KPO-sEduH59KSHV8vgA _y-4KOe-sEduH59KSHV8vgA _y-4KQu-sEduH59KSHV8vgA _y-4KP--sEduH59KSHV8vgA _y-4KRe-sEduH59KSHV8vgA _y-4KSe-sEduH59KSHV8vgA _y-4KTO-sEduH59KSHV8vgA _y-4KT--sEduH59KSHV8vgA _y-4KUu-sEduH59KSHV8vgA _y-4KVe-sEduH59KSHV8vgA _y-4KWO-sEduH59KSHV8vgA _y-4KW--sEduH59KSHV8vgA _y_BUIe-sEduH59KSHV8vgA _y_BUJO-sEduH59KSHV8vgA _y_BUJ--sEduH59KSHV8vgA _y_BULO-sEduH59KSHV8vgA _y_BUKu-sEduH59KSHV8vgA _y_BUMe-sEduH59KSHV8vgA _y_BUL--sEduH59KSHV8vgA _y_BUNu-sEduH59KSHV8vgA _y_BUNO-sEduH59KSHV8vgA _y_BUOe-sEduH59KSHV8vgA _y_BUN--sEduH59KSHV8vgA _y_BUPu-sEduH59KSHV8vgA _y_BUPO-sEduH59KSHV8vgA _y_BUQ--sEduH59KSHV8vgA _y_BUQe-sEduH59KSHV8vgA _y_BURu-sEduH59KSHV8vgA _y_BUSu-sEduH59KSHV8vgA _y_BUSO-sEduH59KSHV8vgA _y_BUTu-sEduH59KSHV8vgA _y_BUTe-sEduH59KSHV8vgA _y_BUU--sEduH59KSHV8vgA _y_BUUe-sEduH59KSHV8vgA _y_BUWO-sEduH59KSHV8vgA _y_BUVu-sEduH59KSHV8vgA _y_BUXe-sEduH59KSHV8vgA _y_BUW--sEduH59KSHV8vgA _y_BUYu-sEduH59KSHV8vgA _y_BUYO-sEduH59KSHV8vgA _y_BUZ--sEduH59KSHV8vgA _y_BUZe-sEduH59KSHV8vgA _y_BUbO-sEduH59KSHV8vgA _y_BUau-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTl1-u-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodCore::Categories" references="_y2Okg--sEduH59KSHV8vgA _y2Okhu-sEduH59KSHV8vgA _y2OkgO-sEduH59KSHV8vgA _y2OkjO-sEduH59KSHV8vgA _y2Okie-sEduH59KSHV8vgA _y2Okku-sEduH59KSHV8vgA _y2Okle-sEduH59KSHV8vgA _y2Okj--sEduH59KSHV8vgA _y2Okm--sEduH59KSHV8vgA _y2OkmO-sEduH59KSHV8vgA _y2Oknu-sEduH59KSHV8vgA _y2OkpO-sEduH59KSHV8vgA _y2Okoe-sEduH59KSHV8vgA _y2Okqu-sEduH59KSHV8vgA _y2Okp--sEduH59KSHV8vgA _y2OksO-sEduH59KSHV8vgA _y2Okre-sEduH59KSHV8vgA _y2Oktu-sEduH59KSHV8vgA _y2Okue-sEduH59KSHV8vgA _y2Oks--sEduH59KSHV8vgA _y2Okvu-sEduH59KSHV8vgA _y2OkvO-sEduH59KSHV8vgA _y2Okw--sEduH59KSHV8vgA _y2Okwe-sEduH59KSHV8vgA _y2OkyO-sEduH59KSHV8vgA _y2Okxu-sEduH59KSHV8vgA _y2Oky--sEduH59KSHV8vgA _y2Okye-sEduH59KSHV8vgA _y2Ok0O-sEduH59KSHV8vgA _y2Okzu-sEduH59KSHV8vgA _y2Ok1e-sEduH59KSHV8vgA _y2Ok0--sEduH59KSHV8vgA _y2Ok2u-sEduH59KSHV8vgA _y2Ok2O-sEduH59KSHV8vgA _y2Ok3--sEduH59KSHV8vgA _y2Ok3e-sEduH59KSHV8vgA _y2Ok5O-sEduH59KSHV8vgA _y2Ok4u-sEduH59KSHV8vgA _y2Ok6e-sEduH59KSHV8vgA _y2Ok5--sEduH59KSHV8vgA _y2Ok7e-sEduH59KSHV8vgA _y2Ok7O-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTu_4O-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodCore::WorkProductStates" references="_y3RtYu-sEduH59KSHV8vgA _y3RtZe-sEduH59KSHV8vgA _y3RtaO-sEduH59KSHV8vgA _y3RtYO-sEduH59KSHV8vgA _y3a3Uu-sEduH59KSHV8vgA _y3a3Ve-sEduH59KSHV8vgA _y3a3WO-sEduH59KSHV8vgA _y3a3W--sEduH59KSHV8vgA _y3a3UO-sEduH59KSHV8vgA _y3a3YO-sEduH59KSHV8vgA _y3a3Xu-sEduH59KSHV8vgA _y3a3Ze-sEduH59KSHV8vgA _y3a3aO-sEduH59KSHV8vgA _y3a3a--sEduH59KSHV8vgA _y3a3Y--sEduH59KSHV8vgA _y3a3bu-sEduH59KSHV8vgA _y3a3cO-sEduH59KSHV8vgA _y3a3e--sEduH59KSHV8vgA _y3a3fu-sEduH59KSHV8vgA _y3a3ge-sEduH59KSHV8vgA _y3a3gu-sEduH59KSHV8vgA _y3a3ee-sEduH59KSHV8vgA _y3a3hu-sEduH59KSHV8vgA _y3a3he-sEduH59KSHV8vgA _y3a3iO-sEduH59KSHV8vgA _y3a3h--sEduH59KSHV8vgA _y3a3ie-sEduH59KSHV8vgA _y3a3iu-sEduH59KSHV8vgA _y3a3i--sEduH59KSHV8vgA _y3a3jO-sEduH59KSHV8vgA _y3a3je-sEduH59KSHV8vgA _y3a3j--sEduH59KSHV8vgA _y3a3ju-sEduH59KSHV8vgA _y3a3ku-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTu_4e-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodCore::MethodPackage" references="_y4eANe-sEduH59KSHV8vgA _y4eAOO-sEduH59KSHV8vgA _y4eAO--sEduH59KSHV8vgA _y4eAMe-sEduH59KSHV8vgA _y4eAQe-sEduH59KSHV8vgA _y4eAPu-sEduH59KSHV8vgA _y4eARu-sEduH59KSHV8vgA _y4eARO-sEduH59KSHV8vgA _y4eAS--sEduH59KSHV8vgA _y4eASe-sEduH59KSHV8vgA _y4eAUO-sEduH59KSHV8vgA _y4eATu-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTu_4u-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::Process::Breakdown" references="_y7mMtO-sEduH59KSHV8vgA _y7mMsO-sEduH59KSHV8vgA _y7mMt--sEduH59KSHV8vgA _y7mMuu-sEduH59KSHV8vgA _y7mMve-sEduH59KSHV8vgA _y7mMw--sEduH59KSHV8vgA _y7mMxu-sEduH59KSHV8vgA _y7mMye-sEduH59KSHV8vgA _y7mMwO-sEduH59KSHV8vgA _y7vWoO-sEduH59KSHV8vgA _y7vWre-sEduH59KSHV8vgA _y7vWsO-sEduH59KSHV8vgA _y7vWqu-sEduH59KSHV8vgA _y7vWtu-sEduH59KSHV8vgA _y7vWuO-sEduH59KSHV8vgA _y7vWuu-sEduH59KSHV8vgA _y7vWs--sEduH59KSHV8vgA _y7vWwO-sEduH59KSHV8vgA _y7vWxe-sEduH59KSHV8vgA _y7vWyO-sEduH59KSHV8vgA _y7vWy--sEduH59KSHV8vgA _y7vWzu-sEduH59KSHV8vgA _y7vW0e-sEduH59KSHV8vgA _y7vW1O-sEduH59KSHV8vgA _y7vW1--sEduH59KSHV8vgA _y7vWvO-sEduH59KSHV8vgA _y7vW3e-sEduH59KSHV8vgA _y7vW2u-sEduH59KSHV8vgA _y7vW4u-sEduH59KSHV8vgA _y7vW5e-sEduH59KSHV8vgA _y7vW6O-sEduH59KSHV8vgA _y7vW3--sEduH59KSHV8vgA _y7vW7--sEduH59KSHV8vgA _y7vW8u-sEduH59KSHV8vgA _y7vW9e-sEduH59KSHV8vgA _y7vW-O-sEduH59KSHV8vgA _y7vW---sEduH59KSHV8vgA _y7vW_u-sEduH59KSHV8vgA _y7vXAe-sEduH59KSHV8vgA _y7vXBO-sEduH59KSHV8vgA _y7vXB--sEduH59KSHV8vgA _y7vW6--sEduH59KSHV8vgA _y7vXDe-sEduH59KSHV8vgA _y7vXEu-sEduH59KSHV8vgA _y7vXF--sEduH59KSHV8vgA _y7vXGu-sEduH59KSHV8vgA _y7vXHe-sEduH59KSHV8vgA _y7vXIO-sEduH59KSHV8vgA _y7vXCu-sEduH59KSHV8vgA _y7vXJu-sEduH59KSHV8vgA _y7vXI--sEduH59KSHV8vgA _y7vXLO-sEduH59KSHV8vgA _y7vXL--sEduH59KSHV8vgA _y7vXMu-sEduH59KSHV8vgA _y7vXNe-sEduH59KSHV8vgA _y7vXKe-sEduH59KSHV8vgA _y7vXOO-sEduH59KSHV8vgA _y7vXPe-sEduH59KSHV8vgA _y7vXO--sEduH59KSHV8vgA _y75HoO-sEduH59KSHV8vgA _y75HpO-sEduH59KSHV8vgA _y75Hou-sEduH59KSHV8vgA _y75Hqe-sEduH59KSHV8vgA _y75Hp--sEduH59KSHV8vgA _y75Hru-sEduH59KSHV8vgA _y75HrO-sEduH59KSHV8vgA _y75Hs--sEduH59KSHV8vgA _y75Hse-sEduH59KSHV8vgA _y75HuO-sEduH59KSHV8vgA _y75Htu-sEduH59KSHV8vgA _y75Hve-sEduH59KSHV8vgA _y75Hu--sEduH59KSHV8vgA _y75Hwu-sEduH59KSHV8vgA _y75HwO-sEduH59KSHV8vgA _y75Hxe-sEduH59KSHV8vgA _y75Hye-sEduH59KSHV8vgA _y75Hx--sEduH59KSHV8vgA _y75Hzu-sEduH59KSHV8vgA _y75HzO-sEduH59KSHV8vgA _y75H0--sEduH59KSHV8vgA _y75H0e-sEduH59KSHV8vgA _y75H2O-sEduH59KSHV8vgA _y75H1u-sEduH59KSHV8vgA _y75H3e-sEduH59KSHV8vgA _y75H2--sEduH59KSHV8vgA _y75H4u-sEduH59KSHV8vgA _y75H4O-sEduH59KSHV8vgA _y75H5--sEduH59KSHV8vgA _y75H5e-sEduH59KSHV8vgA _y75H6--sEduH59KSHV8vgA _y75H6u-sEduH59KSHV8vgA _y75H8O-sEduH59KSHV8vgA _y75H7u-sEduH59KSHV8vgA _y75H9e-sEduH59KSHV8vgA _y75H8--sEduH59KSHV8vgA _y75H-u-sEduH59KSHV8vgA _y75H-O-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTu_4--sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::MethodLibrary::LibraryConfigurations" references="_y-4KOe-sEduH59KSHV8vgA _zQdCY--sEduH59KSHV8vgA _zQdCZu-sEduH59KSHV8vgA _zQdCae-sEduH59KSHV8vgA _zQdCbO-sEduH59KSHV8vgA _zQdCb--sEduH59KSHV8vgA _zQdCcu-sEduH59KSHV8vgA _zQdCde-sEduH59KSHV8vgA _zQdCYO-sEduH59KSHV8vgA _zQdCe--sEduH59KSHV8vgA _zQdCeO-sEduH59KSHV8vgA _zQdCf--sEduH59KSHV8vgA _zQmzYO-sEduH59KSHV8vgA _zQmzaO-sEduH59KSHV8vgA _zQmza--sEduH59KSHV8vgA _zQmzY--sEduH59KSHV8vgA _zQmzcO-sEduH59KSHV8vgA _zQmzbu-sEduH59KSHV8vgA _zQmzde-sEduH59KSHV8vgA _zQmzc--sEduH59KSHV8vgA _zQmzeu-sEduH59KSHV8vgA _zQmzeO-sEduH59KSHV8vgA _zQmzf--sEduH59KSHV8vgA _zQmzfe-sEduH59KSHV8vgA _zQmzgu-sEduH59KSHV8vgA _zQmzgO-sEduH59KSHV8vgA _zQmzhe-sEduH59KSHV8vgA _zQmzg--sEduH59KSHV8vgA _zQmziu-sEduH59KSHV8vgA _zQmziO-sEduH59KSHV8vgA _zQmzju-sEduH59KSHV8vgA _zQmzje-sEduH59KSHV8vgA _zQmzku-sEduH59KSHV8vgA _zQmzke-sEduH59KSHV8vgA _zQmzl--sEduH59KSHV8vgA _zQmzle-sEduH59KSHV8vgA _zQmzm--sEduH59KSHV8vgA _zQmzmu-sEduH59KSHV8vgA _zQmzn--sEduH59KSHV8vgA _zQmznu-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTu_5O-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::Process::ProcessDescriptions" references="_zBZ5wu-sEduH59KSHV8vgA _zBZ5wO-sEduH59KSHV8vgA _zBZ5ye-sEduH59KSHV8vgA _zBZ5zu-sEduH59KSHV8vgA _zBZ50--sEduH59KSHV8vgA _zBZ5x--sEduH59KSHV8vgA _zBZ52u-sEduH59KSHV8vgA _zBZ53--sEduH59KSHV8vgA _zBZ55O-sEduH59KSHV8vgA _zBZ56e-sEduH59KSHV8vgA _zBZ57u-sEduH59KSHV8vgA _zBZ58--sEduH59KSHV8vgA _zBZ52O-sEduH59KSHV8vgA _zBZ5-u-sEduH59KSHV8vgA _zBZ5_--sEduH59KSHV8vgA _zBZ5-O-sEduH59KSHV8vgA _zBZ6Bu-sEduH59KSHV8vgA _zBZ6BO-sEduH59KSHV8vgA _zBZ6De-sEduH59KSHV8vgA _zBZ6C--sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTu_5e-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::Process::ProcessPackage" references="_zDpVde-sEduH59KSHV8vgA _zDpVeO-sEduH59KSHV8vgA _zDpVcO-sEduH59KSHV8vgA _zDpVfu-sEduH59KSHV8vgA _zDpVe--sEduH59KSHV8vgA _zDpVhO-sEduH59KSHV8vgA _zDpVh--sEduH59KSHV8vgA _zDpVge-sEduH59KSHV8vgA _zDpVje-sEduH59KSHV8vgA _zDpViu-sEduH59KSHV8vgA _zDpVku-sEduH59KSHV8vgA _zDpVkO-sEduH59KSHV8vgA _zDpVl--sEduH59KSHV8vgA _zDpVle-sEduH59KSHV8vgA _zDpVnO-sEduH59KSHV8vgA _zDpVmu-sEduH59KSHV8vgA _zDpVoe-sEduH59KSHV8vgA _zDpVn--sEduH59KSHV8vgA _zDpVpu-sEduH59KSHV8vgA _zDpVpO-sEduH59KSHV8vgA _zDpVq--sEduH59KSHV8vgA _zDpVqe-sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zTu_5u-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UnifiedMethodArchitecture::ProcessDiagrams::UMADiagrams" references="_zDpViu-sEduH59KSHV8vgA _zLitMO-sEduH59KSHV8vgA _zLitNe-sEduH59KSHV8vgA _zLitM--sEduH59KSHV8vgA"/>
-      <eAnnotations xmi:id="_zT4w4O-sEduH59KSHV8vgA" source="UnifiedMethodArchitecture::UML2DiagramInterchange" references="_zJAWke-sEduH59KSHV8vgA _zJAWku-sEduH59KSHV8vgA _zJAWkO-sEduH59KSHV8vgA _zJAWle-sEduH59KSHV8vgA _zJAWlu-sEduH59KSHV8vgA _zJAWme-sEduH59KSHV8vgA _zJAWnO-sEduH59KSHV8vgA _zJAWn--sEduH59KSHV8vgA _zJAWk--sEduH59KSHV8vgA _zJAWo--sEduH59KSHV8vgA _zJAWpO-sEduH59KSHV8vgA _zJAWou-sEduH59KSHV8vgA _zJAWp--sEduH59KSHV8vgA _zJAWqe-sEduH59KSHV8vgA _zJAWrO-sEduH59KSHV8vgA _zJAWr--sEduH59KSHV8vgA _zJAWpe-sEduH59KSHV8vgA _zJAWtO-sEduH59KSHV8vgA _zJAWtu-sEduH59KSHV8vgA _zJAWsu-sEduH59KSHV8vgA _zJAWu--sEduH59KSHV8vgA _zJAWv--sEduH59KSHV8vgA _zJAWue-sEduH59KSHV8vgA _zJAWxe-sEduH59KSHV8vgA _zJAWyO-sEduH59KSHV8vgA _zJAWw--sEduH59KSHV8vgA _zJAWze-sEduH59KSHV8vgA _zJAW0O-sEduH59KSHV8vgA _zJAWy--sEduH59KSHV8vgA _zJKHku-sEduH59KSHV8vgA _zJKHk--sEduH59KSHV8vgA _zJKHlO-sEduH59KSHV8vgA _zJKHl--sEduH59KSHV8vgA _zJKHkO-sEduH59KSHV8vgA _zJKHnO-sEduH59KSHV8vgA _zJKHmu-sEduH59KSHV8vgA _zJKHn--sEduH59KSHV8vgA _zJKHou-sEduH59KSHV8vgA _zJKHo--sEduH59KSHV8vgA _zJKHpu-sEduH59KSHV8vgA _zJKHne-sEduH59KSHV8vgA _zJKHq--sEduH59KSHV8vgA _zJKHr--sEduH59KSHV8vgA _zJKHsu-sEduH59KSHV8vgA _zJKHqe-sEduH59KSHV8vgA _zJKHt--sEduH59KSHV8vgA _zJKHte-sEduH59KSHV8vgA _zJKHve-sEduH59KSHV8vgA _zJKHu--sEduH59KSHV8vgA _zJKHwu-sEduH59KSHV8vgA _zJKHwO-sEduH59KSHV8vgA _zJKHxe-sEduH59KSHV8vgA _zJKHye-sEduH59KSHV8vgA _zJKHx--sEduH59KSHV8vgA _zJKHz--sEduH59KSHV8vgA _zJKH0--sEduH59KSHV8vgA _zJKHze-sEduH59KSHV8vgA _zJKH1--sEduH59KSHV8vgA _zJKH2--sEduH59KSHV8vgA _zJKH3e-sEduH59KSHV8vgA _zJKH2e-sEduH59KSHV8vgA _zJKH4u-sEduH59KSHV8vgA _zJKH4--sEduH59KSHV8vgA _zJKH5O-sEduH59KSHV8vgA _zJKH5e-sEduH59KSHV8vgA _zJKH5u-sEduH59KSHV8vgA _zJKH5--sEduH59KSHV8vgA _zJKH4O-sEduH59KSHV8vgA _zJKH6O-sEduH59KSHV8vgA _zJKH6e-sEduH59KSHV8vgA _zJKH6--sEduH59KSHV8vgA _zJKH6u-sEduH59KSHV8vgA _zJKH7u-sEduH59KSHV8vgA _zJKH7--sEduH59KSHV8vgA _zJKH8O-sEduH59KSHV8vgA _zJKH8u-sEduH59KSHV8vgA _zJKH8e-sEduH59KSHV8vgA _zJKH9e-sEduH59KSHV8vgA _zJKH9u-sEduH59KSHV8vgA _zJTRgO-sEduH59KSHV8vgA _zJTRgu-sEduH59KSHV8vgA _zJTRge-sEduH59KSHV8vgA _zJTRhu-sEduH59KSHV8vgA _zJTRhe-sEduH59KSHV8vgA _zJTRiu-sEduH59KSHV8vgA _zJTRie-sEduH59KSHV8vgA"/>
-    </eAnnotations>
-    <ownedComment xmi:id="_yxUPY--sEduH59KSHV8vgA" annotatedElement="_J7tG0OyCEdu5-vVjlfVsfQ">
-      <body>00</body>
-    </ownedComment>
-    <ownedComment xmi:id="_y1CRsO-sEduH59KSHV8vgA" annotatedElement="_J7tG0OyCEdu5-vVjlfVsfQ">
-      <body>06</body>
-    </ownedComment>
-    <ownedComment xmi:id="_y4eAMO-sEduH59KSHV8vgA" annotatedElement="_J7tG0OyCEdu5-vVjlfVsfQ">
-      <body>05</body>
-    </ownedComment>
-    <ownedComment xmi:id="_y2FakO-sEduH59KSHV8vgA" annotatedElement="_J7tG0OyCEdu5-vVjlfVsfQ">
-      <body>04</body>
-    </ownedComment>
-    <ownedComment xmi:id="_yz1-4O-sEduH59KSHV8vgA" annotatedElement="_J7tG0OyCEdu5-vVjlfVsfQ">
-      <body>03</body>
-    </ownedComment>
-    <ownedComment xmi:id="_yxw7QO-sEduH59KSHV8vgA" annotatedElement="_J7tG0OyCEdu5-vVjlfVsfQ">
-      <body>01</body>
-    </ownedComment>
-    <ownedComment xmi:id="_yyzdEO-sEduH59KSHV8vgA" annotatedElement="_J7tG0OyCEdu5-vVjlfVsfQ">
-      <body>02</body>
-    </ownedComment>
-    <packageImport xmi:id="_J7tG1OyCEdu5-vVjlfVsfQ">
-      <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
-    </packageImport>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxKfCu-sEduH59KSHV8vgA" name="Classifier" isAbstract="true">
-      <ownedComment xmi:id="_yxKfC--sEduH59KSHV8vgA" annotatedElement="_yxKfCu-sEduH59KSHV8vgA">
-        <body>UML 2.0 meta-class Classifier.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxKfDO-sEduH59KSHV8vgA" general="_yxUPUO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxKfDe-sEduH59KSHV8vgA" name="Element" isAbstract="true">
-      <ownedComment xmi:id="_yxKfDu-sEduH59KSHV8vgA" annotatedElement="_yxKfDe-sEduH59KSHV8vgA">
-        <body>UML 2.0 meta-class Element.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxKfD--sEduH59KSHV8vgA" name="NamedElement" isAbstract="true">
-      <ownedComment xmi:id="_yxKfEO-sEduH59KSHV8vgA" annotatedElement="_yxKfD--sEduH59KSHV8vgA">
-        <body>UML 2.0 meta-class Named Element.  Defined that every element has a name.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxKfEe-sEduH59KSHV8vgA" general="_yxKfDe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yxKfEu-sEduH59KSHV8vgA" name="name" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxKfE--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxKfFO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxKfFe-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxKfFu-sEduH59KSHV8vgA" name="PackageableElement" isAbstract="true">
-      <ownedComment xmi:id="_yxKfF--sEduH59KSHV8vgA" annotatedElement="_yxKfFu-sEduH59KSHV8vgA">
-        <body>UML 2.0 meta-class Packagable Element.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxKfGO-sEduH59KSHV8vgA" general="_yxKfD--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxUPUO-sEduH59KSHV8vgA" name="Type" isAbstract="true">
-      <ownedComment xmi:id="_yxUPUe-sEduH59KSHV8vgA" annotatedElement="_yxUPUO-sEduH59KSHV8vgA">
-        <body>UML 2.0 meta-class Type.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxUPUu-sEduH59KSHV8vgA" general="_yxKfFu-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxUPVO-sEduH59KSHV8vgA" name="Package">
-      <ownedComment xmi:id="_yxUPVe-sEduH59KSHV8vgA" annotatedElement="_yxUPVO-sEduH59KSHV8vgA">
-        <body>UML 2.0 meta-class Package.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxUPVu-sEduH59KSHV8vgA" general="_yxUPWO-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_yxUPV--sEduH59KSHV8vgA" general="_yxKfFu-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxUPWO-sEduH59KSHV8vgA" name="Namespace" isAbstract="true">
-      <ownedComment xmi:id="_yxUPWe-sEduH59KSHV8vgA" annotatedElement="_yxUPWO-sEduH59KSHV8vgA">
-        <body>UML 2.0 meta-class Namespace.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxUPWu-sEduH59KSHV8vgA" general="_yxKfD--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPZO-sEduH59KSHV8vgA" name="Date">
-      <ownedComment xmi:id="_yxUPZe-sEduH59KSHV8vgA" annotatedElement="_yxUPZO-sEduH59KSHV8vgA">
-        <body>Data type used for attributes of meta-model classes of the type Date.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPZu-sEduH59KSHV8vgA" name="Uri">
-      <ownedComment xmi:id="_yxUPZ--sEduH59KSHV8vgA" annotatedElement="_yxUPZu-sEduH59KSHV8vgA">
-        <body>Data type used for attributes of meta-model classes that point to resources such as files.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPaO-sEduH59KSHV8vgA" name="String">
-      <ownedComment xmi:id="_yxUPae-sEduH59KSHV8vgA" annotatedElement="_yxUPaO-sEduH59KSHV8vgA">
-        <body>A string is a sequence of characters in some suitable character set used to display information about the model. Character sets may include non-Roman alphabets and characters.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPau-sEduH59KSHV8vgA" name="Set"/>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPa--sEduH59KSHV8vgA" name="Sequence"/>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPbO-sEduH59KSHV8vgA" name="Integer">
-      <ownedComment xmi:id="_yxUPbe-sEduH59KSHV8vgA" annotatedElement="_yxUPbO-sEduH59KSHV8vgA">
-        <body>An integer is a primitive type representing integer values.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPbu-sEduH59KSHV8vgA" name="Boolean">
-      <ownedComment xmi:id="_yxUPb--sEduH59KSHV8vgA" annotatedElement="_yxUPbu-sEduH59KSHV8vgA">
-        <body>A Boolean type is used for logical expression, consisting of the predefined values true and false.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_yxUPcO-sEduH59KSHV8vgA" name="Double"/>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxw7cu-sEduH59KSHV8vgA" name="Constraint">
-      <ownedComment xmi:id="_yxw7c--sEduH59KSHV8vgA" annotatedElement="_yxw7cu-sEduH59KSHV8vgA">
-        <body>A Constraint is a Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxw7dO-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yxw7de-sEduH59KSHV8vgA" name="body" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_yxw7du-sEduH59KSHV8vgA" annotatedElement="_yxw7de-sEduH59KSHV8vgA">
-          <body>This attribute stores the definition of the constraint.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7d--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7eO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7ee-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxw7hu-sEduH59KSHV8vgA" name="MethodElementProperty">
-      <generalization xmi:id="_yxw7h--sEduH59KSHV8vgA" general="_yxKfFu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yxw7iO-sEduH59KSHV8vgA" name="value" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7ie-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7iu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7i--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yxw7jO-sEduH59KSHV8vgA" memberEnd="_yxw7Tu-sEduH59KSHV8vgA _yxw7ju-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yxw7je-sEduH59KSHV8vgA" annotatedElement="_yxw7jO-sEduH59KSHV8vgA">
-        <body>A Method Element can own many Constraints defining rules for this element.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yxw7ju-sEduH59KSHV8vgA" name="_methodElement" visibility="public" type="_yxw7Qe-sEduH59KSHV8vgA" isUnique="false" association="_yxw7jO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yxw7j--sEduH59KSHV8vgA" memberEnd="_yxw7X--sEduH59KSHV8vgA _yxw7ke-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yxw7kO-sEduH59KSHV8vgA" annotatedElement="_yxw7j--sEduH59KSHV8vgA">
-        <body>A Content Description can optionally be structure into Sections.  This association is use to decomposed Section into a hierarchy of Sections.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yxw7ke-sEduH59KSHV8vgA" name="_contentDescription" visibility="public" type="_yxw7V--sEduH59KSHV8vgA" isUnique="false" association="_yxw7j--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7ku-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7k--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yxw7lO-sEduH59KSHV8vgA" memberEnd="_yxw7b--sEduH59KSHV8vgA _yxw7lu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yxw7le-sEduH59KSHV8vgA" annotatedElement="_yxw7lO-sEduH59KSHV8vgA">
-        <body>Sections can be further decomposed into n levels of sub-sections.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yxw7lu-sEduH59KSHV8vgA" name="_section" visibility="public" type="_yxw7Yu-sEduH59KSHV8vgA" isUnique="false" association="_yxw7lO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7l--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7mO-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yxw7me-sEduH59KSHV8vgA" memberEnd="_yxw7m--sEduH59KSHV8vgA _yxw7g--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yxw7mu-sEduH59KSHV8vgA" annotatedElement="_yxw7me-sEduH59KSHV8vgA">
-        <body>A Describable Element can contain a Content Description element that stores textual descriptions for this Content Element.  Content Description is intended to be refined with sub-classes adding more description attributes.  Any of these sub-types can be related to a Content Element.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yxw7m--sEduH59KSHV8vgA" name="_describableElement" visibility="public" type="_yxw7eu-sEduH59KSHV8vgA" isUnique="false" association="_yxw7me-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7nO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7ne-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yx6FMO-sEduH59KSHV8vgA" memberEnd="_yxw7Ue-sEduH59KSHV8vgA _yx6FMe-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_yx6FMe-sEduH59KSHV8vgA" name="_methodElement" visibility="public" type="_yxw7Qe-sEduH59KSHV8vgA" isUnique="false" association="_yx6FMO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdEe-sEduH59KSHV8vgA" name="Role">
-      <ownedComment xmi:id="_yyzdEu-sEduH59KSHV8vgA" annotatedElement="_yyzdEe-sEduH59KSHV8vgA">
-        <body>A Role is a content element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
-A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdE--sEduH59KSHV8vgA" general="_yxw7VO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yyzdFO-sEduH59KSHV8vgA" name="modifies" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" isDerived="true" association="_yyzdZO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdFe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdFu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdF--sEduH59KSHV8vgA" name="responsibleFor" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_yyzdae-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdGO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdGe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdM--sEduH59KSHV8vgA" name="Guidance" isAbstract="true">
-      <ownedComment xmi:id="_yyzdNO-sEduH59KSHV8vgA" annotatedElement="_yyzdM--sEduH59KSHV8vgA">
-        <body>Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdNe-sEduH59KSHV8vgA" general="_yxw7VO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdNu-sEduH59KSHV8vgA" name="Artifact">
-      <ownedComment xmi:id="_yyzdN--sEduH59KSHV8vgA" annotatedElement="_yyzdNu-sEduH59KSHV8vgA">
-        <body>Artifact is a Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
-Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might &quot;own&quot; a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdOO-sEduH59KSHV8vgA" general="_yyzdMO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yyzdOe-sEduH59KSHV8vgA" name="containerArtifact" visibility="public" type="_yyzdNu-sEduH59KSHV8vgA" association="_yy9OFe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdOu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdO--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdPO-sEduH59KSHV8vgA" name="containedArtifacts" visibility="public" type="_yyzdNu-sEduH59KSHV8vgA" aggregation="composite" association="_yy9OFe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdPe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdPu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdP--sEduH59KSHV8vgA" name="Deliverable">
-      <ownedComment xmi:id="_yyzdQO-sEduH59KSHV8vgA" annotatedElement="_yyzdP--sEduH59KSHV8vgA">
-        <body>A deliverable is a Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. </body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdQe-sEduH59KSHV8vgA" general="_yyzdMO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yyzdQu-sEduH59KSHV8vgA" name="deliveredWorkProducts" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_yy9OF--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdQ--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdRO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdRe-sEduH59KSHV8vgA" name="Outcome">
-      <ownedComment xmi:id="_yyzdRu-sEduH59KSHV8vgA" annotatedElement="_yyzdRe-sEduH59KSHV8vgA">
-        <body>An outcome describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdR--sEduH59KSHV8vgA" general="_yyzdMO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdSO-sEduH59KSHV8vgA" name="Step">
-      <ownedComment xmi:id="_yyzdSe-sEduH59KSHV8vgA" annotatedElement="_yyzdSO-sEduH59KSHV8vgA">
-        <body>A Step is a Section and Work Definition that is used to organize Tasks into parts or subunits of work.  Steps inherit the subSections decomposition from Section and can therefore describe Sub-Steps nested into Steps.
-A Step describes a meaningful and consist part of the overall work described for a Task.  The collection of Steps defined for a Task represents all the work that should be done to achieve the overall development goal of the Task.  Not all steps are necessarily performed each time a Task is invoked in a Process (see Task Descriptor), so they can also be expressed in the form of alternate 'flows' of work.  Different ways of achieving the same development goal can then be 'assembled' by selecting different combinations of steps when applying the Task in a Process.  Typical kinds of steps a Task author should consider are: Thinking steps: where the individual roles understand the nature of the task, gathers and examines the input artifacts, and formulates the outcome. Performing steps: where the individual roles create or update some artifacts. Reviewing steps: where the individual roles inspects the results against some criteria.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdSu-sEduH59KSHV8vgA" general="_yxw7Yu-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_yyzdS--sEduH59KSHV8vgA" general="_yyzdTO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdTO-sEduH59KSHV8vgA" name="WorkDefinition" isAbstract="true">
-      <ownedComment xmi:id="_yyzdTe-sEduH59KSHV8vgA" annotatedElement="_yyzdTO-sEduH59KSHV8vgA">
-        <body>Work Definition is an abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
-Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).
-</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdTu-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yyzdT--sEduH59KSHV8vgA" name="precondition" visibility="public" type="_yxw7cu-sEduH59KSHV8vgA" aggregation="composite" association="_yy9OJO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdUO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdUe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdUu-sEduH59KSHV8vgA" name="postcondition" visibility="public" type="_yxw7cu-sEduH59KSHV8vgA" aggregation="composite" association="_yy9OJ--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdU--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdVO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yyzdVe-sEduH59KSHV8vgA" name="Default_PrimaryPerformer" memberEnd="_yyzdHu-sEduH59KSHV8vgA _yyzdV--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yyzdVu-sEduH59KSHV8vgA" annotatedElement="_yyzdVe-sEduH59KSHV8vgA">
-        <body>Roles can be defined to perform many Tasks, but every Task may have only one Role that is by default the primary performer of this Task.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yyzdV--sEduH59KSHV8vgA" name="performs" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" association="_yyzdVe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdWO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdWe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yyzdWu-sEduH59KSHV8vgA" name="Default_MandatoryInputs" memberEnd="_yyzdXO-sEduH59KSHV8vgA _yyzdIe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yyzdW--sEduH59KSHV8vgA" annotatedElement="_yyzdWu-sEduH59KSHV8vgA">
-        <body>This association provides links to zero or many definitions of Work Products that are defined as mandatory inputs for performing this Task.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yyzdXO-sEduH59KSHV8vgA" name="mandatoryInputTo" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" association="_yyzdWu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdXe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdXu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yyzdX--sEduH59KSHV8vgA" name="Default_Outputs" memberEnd="_yyzdYe-sEduH59KSHV8vgA _yyzdJO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yyzdYO-sEduH59KSHV8vgA" annotatedElement="_yyzdX--sEduH59KSHV8vgA">
-        <body>This association provides links to zero or many definitions of Work Products that are defined as outputs of this Task.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yyzdYe-sEduH59KSHV8vgA" name="outputFrom" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" association="_yyzdX--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdYu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdY--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yyzdZO-sEduH59KSHV8vgA" name="Default_Modifies" memberEnd="_yyzdZu-sEduH59KSHV8vgA _yyzdFO-sEduH59KSHV8vgA" isDerived="true">
-      <ownedComment xmi:id="_yyzdZe-sEduH59KSHV8vgA" annotatedElement="_yyzdZO-sEduH59KSHV8vgA">
-        <body>This association is derived from the fact that Roles perform Tasks that have Work Products of that particular type as outputs.  /modifies provides all the types of Work Products that the Role produces or modifies via one of the Tasks defined to be performed by the Role, either as primary or additional performer.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yyzdZu-sEduH59KSHV8vgA" name="modifiedBy" visibility="public" type="_yyzdEe-sEduH59KSHV8vgA" isDerived="true" association="_yyzdZO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdZ--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdaO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yyzdae-sEduH59KSHV8vgA" name="Default_Responsible" memberEnd="_yyzda--sEduH59KSHV8vgA _yyzdF--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yyzdau-sEduH59KSHV8vgA" annotatedElement="_yyzdae-sEduH59KSHV8vgA">
-        <body>Responsibility for a work product indicates the role's ownership of all instances of this work product type.  For example, the role responsible for a work product answers to management about its quality state.  Being responsible for the work product does not mean that the role is the only one modifying it, but makes ultimate decisions about accepting or rejecting these modifications when reviewing these modifications.  Every work product has none or one role responsible role. </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yyzda--sEduH59KSHV8vgA" name="responsibleRole" visibility="public" type="_yyzdEe-sEduH59KSHV8vgA" association="_yyzdae-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdbO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdbe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yy9OEO-sEduH59KSHV8vgA" name="Default_AdditionalPerformer" memberEnd="_yy9OEu-sEduH59KSHV8vgA _yyzdJ--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yy9OEe-sEduH59KSHV8vgA" annotatedElement="_yy9OEO-sEduH59KSHV8vgA">
-        <body>This association defines additional roles that by default can be assigned to help completing a Task.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yy9OEu-sEduH59KSHV8vgA" name="helpsPerforming" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" association="_yy9OEO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yy9OE--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yy9OFO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yy9OFe-sEduH59KSHV8vgA" name="Composition" memberEnd="_yyzdOe-sEduH59KSHV8vgA _yyzdPO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yy9OFu-sEduH59KSHV8vgA" annotatedElement="_yy9OFe-sEduH59KSHV8vgA">
-        <body>Artifact types can be defined to be physically composed of other artifacts.  For example, a use case model is composed of use cases and actors.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yy9OF--sEduH59KSHV8vgA" name="DefaultDeliveredWP" memberEnd="_yy9OGe-sEduH59KSHV8vgA _yyzdQu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yy9OGO-sEduH59KSHV8vgA" annotatedElement="_yy9OF--sEduH59KSHV8vgA">
-        <body>This association defines the default parts of a deliverable, i.e. the types of work products a Deliverable comprises of.  This aggregation can be overridden in a Process.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yy9OGe-sEduH59KSHV8vgA" name="_deliverable" visibility="private" type="_yyzdP--sEduH59KSHV8vgA" isUnique="false" association="_yy9OF--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yy9OGu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yy9OG--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yy9OHO-sEduH59KSHV8vgA" name="Default_OptionalInputs" memberEnd="_yyzdKu-sEduH59KSHV8vgA _yy9OHu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yy9OHe-sEduH59KSHV8vgA" annotatedElement="_yy9OHO-sEduH59KSHV8vgA">
-        <body>This association provides links to zero or many definitions of Work Products that are defined as optional inputs for performing this Task.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yy9OHu-sEduH59KSHV8vgA" name="optionalInputTo" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" association="_yy9OHO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yy9OH--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yy9OIO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yy9OIe-sEduH59KSHV8vgA" memberEnd="_yyzdLe-sEduH59KSHV8vgA _yy9OI--sEduH59KSHV8vgA" isDerived="true">
-      <ownedComment xmi:id="_yy9OIu-sEduH59KSHV8vgA" annotatedElement="_yy9OIe-sEduH59KSHV8vgA">
-        <body>This derived association is a shortcut for navigation along the association properties ContentElement.presentation.sections.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yy9OI--sEduH59KSHV8vgA" name="_task" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" isUnique="false" association="_yy9OIe-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yy9OJO-sEduH59KSHV8vgA" memberEnd="_yyzdT--sEduH59KSHV8vgA _yy9OJu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yy9OJe-sEduH59KSHV8vgA" annotatedElement="_yy9OJO-sEduH59KSHV8vgA">
-        <body>This composition association adds an optional pre-condition to a Work Definition.  A pre-condition defines any kind of constraint that must evaluate to true before the work described for the Work Definition can start. For example, a pre-condition for a Task could define that an input Work Product needs to be in a specific state or that other related work must be in a certain state (e.g. 'Input document X has been reviewed and signed by customer AND Task &quot;Management Review&quot; is complete') before the Task can begin.
-</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yy9OJu-sEduH59KSHV8vgA" name="_workDefinition" visibility="public" type="_yyzdTO-sEduH59KSHV8vgA" isUnique="false" association="_yy9OJO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yy9OJ--sEduH59KSHV8vgA" memberEnd="_yyzdUu-sEduH59KSHV8vgA _yy9OKe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yy9OKO-sEduH59KSHV8vgA" annotatedElement="_yy9OJ--sEduH59KSHV8vgA">
-        <body>This composition association adds an optional post-condition to a Work Definition.  A post-condition defines any kind of constraint that must evaluate to true before the work described for the Work Definition can be declared completed or finished and which other Work Definitions might depend upon (e.g. for their pre-conditions).  For example, a post-condition for a Task could define that a work product defined to be the output must be in a specific state before the Task can end (e.g. 'Use Case must be in state fully described and reviewed by System Analyst').</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yy9OKe-sEduH59KSHV8vgA" name="_workDefinition" visibility="public" type="_yyzdTO-sEduH59KSHV8vgA" isUnique="false" association="_yy9OJ--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-4e-sEduH59KSHV8vgA" name="Concept">
-      <ownedComment xmi:id="_yz1-4u-sEduH59KSHV8vgA" annotatedElement="_yz1-4e-sEduH59KSHV8vgA">
-        <body>A Concept is a specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-4--sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-5O-sEduH59KSHV8vgA" name="Checklist">
-      <ownedComment xmi:id="_yz1-5e-sEduH59KSHV8vgA" annotatedElement="_yz1-5O-sEduH59KSHV8vgA">
-        <body>A Checklist is a specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. </body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-5u-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-5--sEduH59KSHV8vgA" name="Example">
-      <ownedComment xmi:id="_yz1-6O-sEduH59KSHV8vgA" annotatedElement="_yz1-5--sEduH59KSHV8vgA">
-        <body>An Example is a specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-6e-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-6u-sEduH59KSHV8vgA" name="Guideline">
-      <ownedComment xmi:id="_yz1-6--sEduH59KSHV8vgA" annotatedElement="_yz1-6u-sEduH59KSHV8vgA">
-        <body>A Guideline is a specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-7O-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-7e-sEduH59KSHV8vgA" name="Report">
-      <ownedComment xmi:id="_yz1-7u-sEduH59KSHV8vgA" annotatedElement="_yz1-7e-sEduH59KSHV8vgA">
-        <body>A Report is a predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-7--sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-8O-sEduH59KSHV8vgA" name="Template">
-      <ownedComment xmi:id="_yz1-8e-sEduH59KSHV8vgA" annotatedElement="_yz1-8O-sEduH59KSHV8vgA">
-        <body>A Template is a specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-8u-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-8--sEduH59KSHV8vgA" name="SupportingMaterial">
-      <ownedComment xmi:id="_yz1-9O-sEduH59KSHV8vgA" annotatedElement="_yz1-8--sEduH59KSHV8vgA">
-        <body>Supporting Materials is catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-9e-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-9u-sEduH59KSHV8vgA" name="ToolMentor">
-      <ownedComment xmi:id="_yz1-9--sEduH59KSHV8vgA" annotatedElement="_yz1-9u-sEduH59KSHV8vgA">
-        <body>A Tool Mentor is a specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1--O-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1--e-sEduH59KSHV8vgA" name="Whitepaper">
-      <ownedComment xmi:id="_yz1--u-sEduH59KSHV8vgA" annotatedElement="_yz1--e-sEduH59KSHV8vgA">
-        <body>Whitepapers are a special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1----sEduH59KSHV8vgA" general="_yz1-4e-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-_O-sEduH59KSHV8vgA" name="TermDefinition">
-      <ownedComment xmi:id="_yz1-_e-sEduH59KSHV8vgA" annotatedElement="_yz1-_O-sEduH59KSHV8vgA">
-        <body>TermDefinitions define concepts and are used to build up the Glossary. They are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1-_u-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdMO-sEduH59KSHV8vgA" name="WorkProduct" isAbstract="true">
-      <ownedComment xmi:id="_yyzdMe-sEduH59KSHV8vgA" annotatedElement="_yyzdMO-sEduH59KSHV8vgA">
-        <body>Work Product is an abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
-A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_yz1_CO-sEduH59KSHV8vgA" annotatedElement="_yyzdMO-sEduH59KSHV8vgA">
-        <body>This is the Guidance Types package's extension of Work Product (defined in Content Elements) providing additonal associations.</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdMu-sEduH59KSHV8vgA" general="_yxw7VO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yz1_Ce-sEduH59KSHV8vgA" name="reports" visibility="public" type="_yz1-7e-sEduH59KSHV8vgA" association="_yz_wFu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz1_Cu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz1_C--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz1_DO-sEduH59KSHV8vgA" name="templates" visibility="public" type="_yz1-8O-sEduH59KSHV8vgA" association="_yz_wIO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz1_De-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz1_Du-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz1_D--sEduH59KSHV8vgA" name="toolMentors" visibility="public" type="_yz1-9u-sEduH59KSHV8vgA" association="_y0Jg6u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz1_EO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz1_Ee-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz1_Eu-sEduH59KSHV8vgA" name="estimationConsiderations" visibility="public" type="_yz_v_--sEduH59KSHV8vgA" association="_y0Jg8u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz1_E--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz1_FO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yyzdGu-sEduH59KSHV8vgA" name="Task">
-      <ownedComment xmi:id="_yyzdG--sEduH59KSHV8vgA" annotatedElement="_yyzdGu-sEduH59KSHV8vgA">
-        <body>A Task is a content element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
-A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
-A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
-For example, a Task such as &quot;Develop Use Case Model&quot; describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the &quot;method&quot; of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_yz1_Fe-sEduH59KSHV8vgA" annotatedElement="_yyzdGu-sEduH59KSHV8vgA">
-        <body>This is the Guidance Types package's extension of Task (defined in Content Elements) providing additional associations.</body>
-      </ownedComment>
-      <generalization xmi:id="_yyzdHO-sEduH59KSHV8vgA" general="_yxw7VO-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_yyzdHe-sEduH59KSHV8vgA" general="_yyzdTO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yyzdHu-sEduH59KSHV8vgA" name="performedBy" visibility="public" type="_yyzdEe-sEduH59KSHV8vgA" association="_yyzdVe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdH--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdIO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdIe-sEduH59KSHV8vgA" name="mandatoryInput" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_yyzdWu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdIu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdI--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdJO-sEduH59KSHV8vgA" name="output" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_yyzdX--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdJe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdJu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdJ--sEduH59KSHV8vgA" name="additionallyPerformedBy" visibility="public" type="_yyzdEe-sEduH59KSHV8vgA" association="_yy9OEO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdKO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdKe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdKu-sEduH59KSHV8vgA" name="optionalInput" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_yy9OHO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdK--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdLO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yyzdLe-sEduH59KSHV8vgA" name="steps" visibility="public" type="_yyzdSO-sEduH59KSHV8vgA" isDerived="true" aggregation="composite" association="_yy9OIe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yyzdLu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yyzdL--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v4O-sEduH59KSHV8vgA" name="toolMentors" visibility="public" type="_yz1-9u-sEduH59KSHV8vgA" association="_yz_wJe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v4e-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v4u-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v4--sEduH59KSHV8vgA" name="estimationConsiderations" visibility="public" type="_yz_v_--sEduH59KSHV8vgA" association="_y0Jg7u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v5O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v5e-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz_v_O-sEduH59KSHV8vgA" name="ReusableAsset">
-      <ownedComment xmi:id="_yz_v_e-sEduH59KSHV8vgA" annotatedElement="_yz_v_O-sEduH59KSHV8vgA">
-        <body>A Reusable Asset provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
-how the asset should be used.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_yz_v_u-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz_v_--sEduH59KSHV8vgA" name="EstimationConsiderations">
-      <ownedComment xmi:id="_yz_wAO-sEduH59KSHV8vgA" annotatedElement="_yz_v_--sEduH59KSHV8vgA">
-        <body>Estimation Considerations qualify the usage and application of estimation metrics in the development of an actual estimate.</body>
-      </ownedComment>
-      <generalization xmi:id="_yz_wAe-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wAu-sEduH59KSHV8vgA" memberEnd="_yz_wBO-sEduH59KSHV8vgA _yz_v5--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wA--sEduH59KSHV8vgA" annotatedElement="_yz_wAu-sEduH59KSHV8vgA">
-        <body>Content Elements can be related to any number of Supporting Material guidance elements.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wBO-sEduH59KSHV8vgA" name="_contentElement" visibility="private" type="_yxw7VO-sEduH59KSHV8vgA" isUnique="false" association="_yz_wAu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wBe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wBu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wB--sEduH59KSHV8vgA" memberEnd="_yz_wCe-sEduH59KSHV8vgA _yz_v6u-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wCO-sEduH59KSHV8vgA" annotatedElement="_yz_wB--sEduH59KSHV8vgA">
-        <body>Content Elements can refer to any number of Concept guidance. </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wCe-sEduH59KSHV8vgA" name="_contentElement" visibility="private" type="_yxw7VO-sEduH59KSHV8vgA" isUnique="false" association="_yz_wB--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wCu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wC--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wDO-sEduH59KSHV8vgA" memberEnd="_yz_wDu-sEduH59KSHV8vgA _yz_v7e-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wDe-sEduH59KSHV8vgA" annotatedElement="_yz_wDO-sEduH59KSHV8vgA">
-        <body>Provides check points related to a particular content elements.  These are typically used in reviews and inspections on work products.
-
-</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wDu-sEduH59KSHV8vgA" name="_contentElement" visibility="public" type="_yxw7VO-sEduH59KSHV8vgA" isUnique="false" association="_yz_wDO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wD--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wEO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wEe-sEduH59KSHV8vgA" memberEnd="_yz_wE--sEduH59KSHV8vgA _yz_v8O-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wEu-sEduH59KSHV8vgA" annotatedElement="_yz_wEe-sEduH59KSHV8vgA">
-        <body>This association provides access to detailed Guidelines related to this Content Element.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wE--sEduH59KSHV8vgA" name="_contentElement" visibility="public" type="_yxw7VO-sEduH59KSHV8vgA" isUnique="false" association="_yz_wEe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wFO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wFe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wFu-sEduH59KSHV8vgA" memberEnd="_yz_wGO-sEduH59KSHV8vgA _yz1_Ce-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wF--sEduH59KSHV8vgA" annotatedElement="_yz_wFu-sEduH59KSHV8vgA">
-        <body>A Report extracts information about one or more Work Product; normally directly from a tool that maintains the Work Products. For example, a Report can present details of an Artifact or a set of Artifacts for use in a technical review. </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wGO-sEduH59KSHV8vgA" name="_workProduct" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" isUnique="false" association="_yz_wFu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wGe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wGu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wG--sEduH59KSHV8vgA" memberEnd="_yz_wHe-sEduH59KSHV8vgA _yz_v8--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wHO-sEduH59KSHV8vgA" annotatedElement="_yz_wG--sEduH59KSHV8vgA">
-        <body>Provides a sample of what the work product may look like, an actual instance.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wHe-sEduH59KSHV8vgA" name="_contentElement" visibility="public" type="_yxw7VO-sEduH59KSHV8vgA" isUnique="false" association="_yz_wG--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wHu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wH--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wIO-sEduH59KSHV8vgA" memberEnd="_yz_wIu-sEduH59KSHV8vgA _yz1_DO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wIe-sEduH59KSHV8vgA" annotatedElement="_yz_wIO-sEduH59KSHV8vgA">
-        <body>Provides detailed guidance on how to produce the work product independent of a specific set of tasks or WBS.  May contain specific algorithms or alternative development approaches.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wIu-sEduH59KSHV8vgA" name="_workProduct" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" isUnique="false" association="_yz_wIO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wI--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wJO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wJe-sEduH59KSHV8vgA" memberEnd="_yz_wJ--sEduH59KSHV8vgA _yz_v4O-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wJu-sEduH59KSHV8vgA" annotatedElement="_yz_wJe-sEduH59KSHV8vgA">
-        <body>Links Tasks with Tool Mentors which are a specific type of guidance that show how to use a specific tool to perform the Task.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wJ--sEduH59KSHV8vgA" name="_task" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" isUnique="false" association="_yz_wJe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_wKO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_wKe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_yz_wKu-sEduH59KSHV8vgA" memberEnd="_yz1_Au-sEduH59KSHV8vgA _yz_wLO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_yz_wK--sEduH59KSHV8vgA" annotatedElement="_yz_wKu-sEduH59KSHV8vgA">
-        <body>A Practice can be composed of other Practices.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_yz_wLO-sEduH59KSHV8vgA" name="_practice" visibility="public" type="_yz1-_--sEduH59KSHV8vgA" isUnique="false" association="_yz_wKu-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y0Jg4O-sEduH59KSHV8vgA" memberEnd="_yz1_Be-sEduH59KSHV8vgA _y0Jg4u-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y0Jg4e-sEduH59KSHV8vgA" annotatedElement="_y0Jg4O-sEduH59KSHV8vgA">
-        <body>A Practice can reference any Content Element.  The association expresses that this Content Element is part of or belongs to this Practice.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y0Jg4u-sEduH59KSHV8vgA" name="_practice" visibility="public" type="_yz1-_--sEduH59KSHV8vgA" isUnique="false" association="_y0Jg4O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y0Jg4--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y0Jg5O-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y0Jg5e-sEduH59KSHV8vgA" memberEnd="_yz_v9u-sEduH59KSHV8vgA _y0Jg5--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y0Jg5u-sEduH59KSHV8vgA" annotatedElement="_y0Jg5e-sEduH59KSHV8vgA">
-        <body>A work product is related to one or more assets to </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y0Jg5--sEduH59KSHV8vgA" name="_contentElement" visibility="public" type="_yxw7VO-sEduH59KSHV8vgA" isUnique="false" association="_y0Jg5e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y0Jg6O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y0Jg6e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y0Jg6u-sEduH59KSHV8vgA" memberEnd="_yz1_D--sEduH59KSHV8vgA _y0Jg6--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y0Jg6--sEduH59KSHV8vgA" name="_workProduct" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" isUnique="false" association="_y0Jg6u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y0Jg7O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y0Jg7e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y0Jg7u-sEduH59KSHV8vgA" memberEnd="_y0Jg7--sEduH59KSHV8vgA _yz_v4--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y0Jg7--sEduH59KSHV8vgA" name="_task" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" isUnique="false" association="_y0Jg7u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y0Jg8O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y0Jg8e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y0Jg8u-sEduH59KSHV8vgA" memberEnd="_y0Jg8--sEduH59KSHV8vgA _yz1_Eu-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y0Jg8--sEduH59KSHV8vgA" name="_workProduct" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" isUnique="false" association="_y0Jg8u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y0Jg9O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y0Jg9e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y0Jg9u-sEduH59KSHV8vgA" memberEnd="_yz_v-e-sEduH59KSHV8vgA _y0Jg9--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y0Jg9--sEduH59KSHV8vgA" name="" visibility="private" type="_yxw7VO-sEduH59KSHV8vgA" association="_y0Jg9u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y0Jg-O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y0Jg-e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y1MCsO-sEduH59KSHV8vgA" name="ArtifactDescription">
-      <generalization xmi:id="_y1MCse-sEduH59KSHV8vgA" general="_y1MC7e-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y1MCsu-sEduH59KSHV8vgA" name="briefOutline" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MCs--sEduH59KSHV8vgA" annotatedElement="_y1MCsu-sEduH59KSHV8vgA">
-          <body>Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MCtO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MCte-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MCtu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MCt--sEduH59KSHV8vgA" name="representationOptions" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MCuO-sEduH59KSHV8vgA" annotatedElement="_y1MCt--sEduH59KSHV8vgA">
-          <body>Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MCue-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MCuu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MCu--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MCvO-sEduH59KSHV8vgA" name="representation" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MCve-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MCvu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MCv--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MCwO-sEduH59KSHV8vgA" name="notation" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MCwe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MCwu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MCw--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y1MCxO-sEduH59KSHV8vgA" name="DeliverableDescription">
-      <generalization xmi:id="_y1MCxe-sEduH59KSHV8vgA" general="_y1MC7e-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y1MCxu-sEduH59KSHV8vgA" name="externalDescription" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MCx--sEduH59KSHV8vgA" annotatedElement="_y1MCxu-sEduH59KSHV8vgA">
-          <body>The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MCyO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MCye-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MCyu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MCy--sEduH59KSHV8vgA" name="packagingGuidance" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MCzO-sEduH59KSHV8vgA" annotatedElement="_y1MCy--sEduH59KSHV8vgA">
-          <body>Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MCze-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MCzu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MCz--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y1MC0O-sEduH59KSHV8vgA" name="RoleDescription">
-      <generalization xmi:id="_y1MC0e-sEduH59KSHV8vgA" general="_yxw7V--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y1MC0u-sEduH59KSHV8vgA" name="skills" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC0--sEduH59KSHV8vgA" annotatedElement="_y1MC0u-sEduH59KSHV8vgA">
-          <body>Lists of set of required skills a person needs to possess to fulfill that Role.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC1O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC1e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC1u-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MC1--sEduH59KSHV8vgA" name="assignmentApproaches" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC2O-sEduH59KSHV8vgA" annotatedElement="_y1MC1--sEduH59KSHV8vgA">
-          <body>Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC2e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC2u-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC2--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MC3O-sEduH59KSHV8vgA" name="synonyms" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC3e-sEduH59KSHV8vgA" annotatedElement="_y1MC3O-sEduH59KSHV8vgA">
-          <body>Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC3u-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC3--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC4O-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y1MC4e-sEduH59KSHV8vgA" name="TaskDescription">
-      <generalization xmi:id="_y1MC4u-sEduH59KSHV8vgA" general="_yxw7V--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y1MC4--sEduH59KSHV8vgA" name="purpose" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC5O-sEduH59KSHV8vgA" annotatedElement="_y1MC4--sEduH59KSHV8vgA">
-          <body>Summarizes the main reason for performing this Task and what is intended to be achieved.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC5e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC5u-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC5--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MC6O-sEduH59KSHV8vgA" name="alternatives" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC6e-sEduH59KSHV8vgA" annotatedElement="_y1MC6O-sEduH59KSHV8vgA">
-          <body>Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC6u-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC6--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC7O-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y1MC7e-sEduH59KSHV8vgA" name="WorkProductDescription">
-      <generalization xmi:id="_y1MC7u-sEduH59KSHV8vgA" general="_yxw7V--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y1MC7--sEduH59KSHV8vgA" name="purpose" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC8O-sEduH59KSHV8vgA" annotatedElement="_y1MC7--sEduH59KSHV8vgA">
-          <body>Describes why the work product is produced and to what use it will be put.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC8e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC8u-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC8--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MC9O-sEduH59KSHV8vgA" name="impactOfNotHaving" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC9e-sEduH59KSHV8vgA" annotatedElement="_y1MC9O-sEduH59KSHV8vgA">
-          <body>Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC9u-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC9--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC-O-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MC-e-sEduH59KSHV8vgA" name="reasonsForNotNeeding" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MC-u-sEduH59KSHV8vgA" annotatedElement="_y1MC-e-sEduH59KSHV8vgA">
-          <body>Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MC---sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MC_O-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MC_e-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y1MC_u-sEduH59KSHV8vgA" name="GuidanceDescription">
-      <generalization xmi:id="_y1MC_--sEduH59KSHV8vgA" general="_yxw7V--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y1MDAO-sEduH59KSHV8vgA" name="attachments" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDAe-sEduH59KSHV8vgA" annotatedElement="_y1MDAO-sEduH59KSHV8vgA">
-          <body>This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDAu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDA--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDBO-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y1MDBe-sEduH59KSHV8vgA" name="PracticeDescription">
-      <generalization xmi:id="_y1MDBu-sEduH59KSHV8vgA" general="_yxw7V--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y1MDB--sEduH59KSHV8vgA" name="additionalInfo" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDCO-sEduH59KSHV8vgA" annotatedElement="_y1MDB--sEduH59KSHV8vgA">
-          <body>Any additional Information not covered by the other attributes.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDCe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDCu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDC--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDDO-sEduH59KSHV8vgA" name="problem" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDDe-sEduH59KSHV8vgA" annotatedElement="_y1MDDO-sEduH59KSHV8vgA">
-          <body>A description of the problem the Practice addresses.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDDu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDD--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDEO-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDEe-sEduH59KSHV8vgA" name="background" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDEu-sEduH59KSHV8vgA" annotatedElement="_y1MDEe-sEduH59KSHV8vgA">
-          <body>Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDE--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDFO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDFe-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDFu-sEduH59KSHV8vgA" name="goals" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDF--sEduH59KSHV8vgA" annotatedElement="_y1MDFu-sEduH59KSHV8vgA">
-          <body>A summary of the overall goals to be addressed by the Practice.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDGO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDGe-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDGu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDG--sEduH59KSHV8vgA" name="application" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDHO-sEduH59KSHV8vgA" annotatedElement="_y1MDG--sEduH59KSHV8vgA">
-          <body>Describes how the Practice is being applied or introduced into the context described in background.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDHe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDHu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDH--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDIO-sEduH59KSHV8vgA" name="levelsOfAdoption" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDIe-sEduH59KSHV8vgA" annotatedElement="_y1MDIO-sEduH59KSHV8vgA">
-          <body>Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDIu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDI--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDJO-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxw7eu-sEduH59KSHV8vgA" name="DescribableElement" isAbstract="true">
-      <ownedComment xmi:id="_yxw7e--sEduH59KSHV8vgA" annotatedElement="_yxw7eu-sEduH59KSHV8vgA">
-        <body>Describable Element is an abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
-This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance (see Section 4.1.4).  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_y1MDJe-sEduH59KSHV8vgA" annotatedElement="_yxw7eu-sEduH59KSHV8vgA">
-        <body>This definition of Content Element extends the Content Element definition via package merge with references to icons that are used for presenting Content Elements in a UMA-based modeling environment as well as when publishing Content Elements into documentation presentation (e.g. document or html pages).</body>
-      </ownedComment>
-      <generalization xmi:id="_yxw7fO-sEduH59KSHV8vgA" general="_yxKfCu-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_yxw7fe-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yxw7fu-sEduH59KSHV8vgA" name="presentationName" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_yxw7f--sEduH59KSHV8vgA" annotatedElement="_yxw7fu-sEduH59KSHV8vgA">
-          <body>Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to &quot;rup_architecture_document&quot; to differentiate from a &quot;j2ee_architcture_document&quot; whereas the external presentation would always be &quot;Architecture Document&quot;.
-</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7gO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7ge-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7gu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yxw7g--sEduH59KSHV8vgA" name="presentation" visibility="public" type="_yxw7V--sEduH59KSHV8vgA" aggregation="composite" association="_yxw7me-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7hO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7he-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDJu-sEduH59KSHV8vgA" name="shapeicon" visibility="public" type="_yxUPZu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDJ--sEduH59KSHV8vgA" annotatedElement="_y1MDJu-sEduH59KSHV8vgA">
-          <body>A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDKO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDKe-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDKu-sEduH59KSHV8vgA" type="_yxUPZu-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDK--sEduH59KSHV8vgA" name="nodeicon" visibility="public" type="_yxUPZu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDLO-sEduH59KSHV8vgA" annotatedElement="_y1MDK--sEduH59KSHV8vgA">
-          <body>A reference to an icon that can be used in tree browser presentations and breakdown structures.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDLe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDLu-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDL--sEduH59KSHV8vgA" type="_yxUPZu-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2Okie-sEduH59KSHV8vgA" name="RoleSet">
-      <ownedComment xmi:id="_y2Okiu-sEduH59KSHV8vgA" annotatedElement="_y2Okie-sEduH59KSHV8vgA">
-        <body>A Role Set organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the &quot;Analysts&quot; Role Set could group the &quot;Business Process Analyst&quot;, &quot;System Analyst&quot;, as well as &quot;Requirements Specifier&quot; roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Oki--sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2OkjO-sEduH59KSHV8vgA" name="roles" visibility="public" type="_yyzdEe-sEduH59KSHV8vgA" association="_y2OkvO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okje-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Okju-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2Okj--sEduH59KSHV8vgA" name="Domain">
-      <ownedComment xmi:id="_y2OkkO-sEduH59KSHV8vgA" annotatedElement="_y2Okj--sEduH59KSHV8vgA">
-        <body>Domain is a refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
-Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Okke-sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2Okku-sEduH59KSHV8vgA" name="workProducts" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_y2Okwe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okk--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2OklO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y2Okle-sEduH59KSHV8vgA" name="subdomains" visibility="public" type="_y2Okj--sEduH59KSHV8vgA" aggregation="composite" association="_y2Okxu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Oklu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Okl--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2OkmO-sEduH59KSHV8vgA" name="WorkProductType">
-      <ownedComment xmi:id="_y2Okme-sEduH59KSHV8vgA" annotatedElement="_y2OkmO-sEduH59KSHV8vgA">
-        <body>Work Product Type is a second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is &quot;Class Diagram&quot;, which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or &quot;Specification&quot;, which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Okmu-sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2Okm--sEduH59KSHV8vgA" name="workProducts" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_y2Okye-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2OknO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Okne-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2Oknu-sEduH59KSHV8vgA" name="ContentCategory" isAbstract="true">
-      <ownedComment xmi:id="_y2Okn--sEduH59KSHV8vgA" annotatedElement="_y2Oknu-sEduH59KSHV8vgA">
-        <body>Content Category is an abstract class generalizing content category types.</body>
-      </ownedComment>
-      <generalization xmi:id="_y2OkoO-sEduH59KSHV8vgA" general="_yxw7VO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2Okoe-sEduH59KSHV8vgA" name="DisciplineGrouping">
-      <ownedComment xmi:id="_y2Okou-sEduH59KSHV8vgA" annotatedElement="_y2Okoe-sEduH59KSHV8vgA">
-        <body>Discipline Groupings are used to group Disciplines.  For example, the Discipline Grouping &quot;Software Disciplines&quot; would be the group of all disciplines related to developing software such as &quot;Requirements Management&quot; or &quot;Testing&quot;; &quot;IT Infrastructure Management&quot; would be a Disciplines Grouping for disciplines such as &quot;IT Operational Services&quot;, &quot;IT Customer Relationships&quot;, or &quot;IT Enabling Services&quot;.  Disciplines can be associated to more than one Discipline Grouping.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Oko--sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2OkpO-sEduH59KSHV8vgA" name="disciplines" visibility="public" type="_y2OkgO-sEduH59KSHV8vgA" association="_y2Okzu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okpe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Okpu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2Okp--sEduH59KSHV8vgA" name="Tool">
-      <ownedComment xmi:id="_y2OkqO-sEduH59KSHV8vgA" annotatedElement="_y2Okp--sEduH59KSHV8vgA">
-        <body>A Tool is a container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Okqe-sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2Okqu-sEduH59KSHV8vgA" name="toolMentors" visibility="public" type="_yz1-9u-sEduH59KSHV8vgA" association="_y2Ok0--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okq--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2OkrO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2Okre-sEduH59KSHV8vgA" name="RoleSetGrouping">
-      <ownedComment xmi:id="_y2Okru-sEduH59KSHV8vgA" annotatedElement="_y2Okre-sEduH59KSHV8vgA">
-        <body>Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Okr--sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2OksO-sEduH59KSHV8vgA" name="roleSets" visibility="public" type="_y2Okie-sEduH59KSHV8vgA" association="_y2Ok2O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okse-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Oksu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2Oks--sEduH59KSHV8vgA" name="CustomCategory">
-      <ownedComment xmi:id="_y2OktO-sEduH59KSHV8vgA" annotatedElement="_y2Oks--sEduH59KSHV8vgA">
-        <body>A Custom Category is a category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a &quot;Testing&quot; category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Okte-sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2Oktu-sEduH59KSHV8vgA" name="categorizedElements" visibility="public" type="_yxw7eu-sEduH59KSHV8vgA" association="_y2Ok3e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okt--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2OkuO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y2Okue-sEduH59KSHV8vgA" name="subCategories" visibility="public" type="_y2Oknu-sEduH59KSHV8vgA" association="_y2Ok4u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okuu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Oku--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2OkvO-sEduH59KSHV8vgA" memberEnd="_y2Okvu-sEduH59KSHV8vgA _y2OkjO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Okve-sEduH59KSHV8vgA" annotatedElement="_y2OkvO-sEduH59KSHV8vgA">
-        <body>A Role Set categorizes many Roles and a Role can be represented in may Role Sets.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Okvu-sEduH59KSHV8vgA" name="roleSets" visibility="public" type="_y2Okie-sEduH59KSHV8vgA" association="_y2OkvO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okv--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2OkwO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Okwe-sEduH59KSHV8vgA" memberEnd="_y2Okw--sEduH59KSHV8vgA _y2Okku-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Okwu-sEduH59KSHV8vgA" annotatedElement="_y2Okwe-sEduH59KSHV8vgA">
-        <body>A Domain categorizes many Work Products. A Work Product belongs at most to one Domain.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Okw--sEduH59KSHV8vgA" name="domain" visibility="public" type="_y2Okj--sEduH59KSHV8vgA" association="_y2Okwe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2OkxO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Okxe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Okxu-sEduH59KSHV8vgA" memberEnd="_y2OkyO-sEduH59KSHV8vgA _y2Okle-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Okx--sEduH59KSHV8vgA" annotatedElement="_y2Okxu-sEduH59KSHV8vgA">
-        <body>Domains can be further divided into Subdomains, with work product elements only to be categorized at the leaf-level.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2OkyO-sEduH59KSHV8vgA" name="_domain" visibility="public" type="_y2Okj--sEduH59KSHV8vgA" isUnique="false" association="_y2Okxu-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Okye-sEduH59KSHV8vgA" memberEnd="_y2Oky--sEduH59KSHV8vgA _y2Okm--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Okyu-sEduH59KSHV8vgA" annotatedElement="_y2Okye-sEduH59KSHV8vgA">
-        <body>A Work Product can be categorized to be zero of many Work Product Types.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Oky--sEduH59KSHV8vgA" name="workProductTypes" visibility="public" type="_y2OkmO-sEduH59KSHV8vgA" association="_y2Okye-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2OkzO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Okze-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Okzu-sEduH59KSHV8vgA" memberEnd="_y2Ok0O-sEduH59KSHV8vgA _y2OkpO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Okz--sEduH59KSHV8vgA" annotatedElement="_y2Okzu-sEduH59KSHV8vgA">
-        <body>Discipline Groupings group many Disciplines.  A Discipline can be in many Discipline Groups.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Ok0O-sEduH59KSHV8vgA" name="disciplineGroups" visibility="public" type="_y2Okoe-sEduH59KSHV8vgA" association="_y2Okzu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Ok0e-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Ok0u-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Ok0--sEduH59KSHV8vgA" memberEnd="_y2Ok1e-sEduH59KSHV8vgA _y2Okqu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Ok1O-sEduH59KSHV8vgA" annotatedElement="_y2Ok0--sEduH59KSHV8vgA">
-        <body>A Tool Mentor describes work with exactly one Tool.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Ok1e-sEduH59KSHV8vgA" name="tool" visibility="public" type="_y2Okp--sEduH59KSHV8vgA" association="_y2Ok0--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Ok1u-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Ok1--sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Ok2O-sEduH59KSHV8vgA" memberEnd="_y2Ok2u-sEduH59KSHV8vgA _y2OksO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Ok2e-sEduH59KSHV8vgA" annotatedElement="_y2Ok2O-sEduH59KSHV8vgA">
-        <body>A Role Set Grouping contains many Role Sets. Role Sets can be in many Role Set Groupings.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Ok2u-sEduH59KSHV8vgA" name="roleSetGroups" visibility="public" type="_y2Okre-sEduH59KSHV8vgA" association="_y2Ok2O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Ok2--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Ok3O-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Ok3e-sEduH59KSHV8vgA" memberEnd="_y2Oktu-sEduH59KSHV8vgA _y2Ok3--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Ok3u-sEduH59KSHV8vgA" annotatedElement="_y2Ok3e-sEduH59KSHV8vgA">
-        <body>A CustomCategory groups together any number of ContentElements including other ContentCategory. </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Ok3--sEduH59KSHV8vgA" name="customCategories" visibility="public" type="_y2Oks--sEduH59KSHV8vgA" association="_y2Ok3e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Ok4O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Ok4e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Ok4u-sEduH59KSHV8vgA" memberEnd="_y2Okue-sEduH59KSHV8vgA _y2Ok5O-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Ok4--sEduH59KSHV8vgA" annotatedElement="_y2Ok4u-sEduH59KSHV8vgA">
-        <body>A CustomCategory can have any number of ContentCategories defined as nested subCategories.  Therefore, one could nest CustomCategories into n-level hierarchies. </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Ok5O-sEduH59KSHV8vgA" name="_customCategory" visibility="public" type="_y2Oks--sEduH59KSHV8vgA" isUnique="false" association="_y2Ok4u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Ok5e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Ok5u-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Ok5--sEduH59KSHV8vgA" memberEnd="_y2Okg--sEduH59KSHV8vgA _y2Ok6e-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y2Ok6O-sEduH59KSHV8vgA" annotatedElement="_y2Ok5--sEduH59KSHV8vgA">
-        <body>Every Task should be related to exactly one Discipline.  For legacy reasons this is not enforced (e.g. GS Method does not define Disciplines, yet).</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y2Ok6e-sEduH59KSHV8vgA" name="discipline" visibility="public" type="_y2OkgO-sEduH59KSHV8vgA" association="_y2Ok5--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Ok6u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Ok6--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y2Ok7O-sEduH59KSHV8vgA" memberEnd="_y2Okhu-sEduH59KSHV8vgA _y2Ok7e-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y2Ok7e-sEduH59KSHV8vgA" name="_discipline" visibility="public" type="_y2OkgO-sEduH59KSHV8vgA" isUnique="false" association="_y2Ok7O-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y3RtYO-sEduH59KSHV8vgA" name="State">
-      <generalization xmi:id="_y3RtYe-sEduH59KSHV8vgA" general="_y3a3Y--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y3RtYu-sEduH59KSHV8vgA" name="workProduct" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_y3a3he-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3RtY--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3RtZO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3RtZe-sEduH59KSHV8vgA" name="region" visibility="public" type="_y3a3ee-sEduH59KSHV8vgA" aggregation="composite" association="_y3a3je-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3RtZu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3RtZ--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3RtaO-sEduH59KSHV8vgA" name="submachine" visibility="public" type="_y3a3Xu-sEduH59KSHV8vgA" association="_y3a3ju-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3Rtae-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3Rtau-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y3a3UO-sEduH59KSHV8vgA" name="Transition">
-      <generalization xmi:id="_y3a3Ue-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y3a3Uu-sEduH59KSHV8vgA" name="workDefinition" visibility="public" type="_yyzdTO-sEduH59KSHV8vgA" association="_y3a3h--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3U--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3VO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3a3Ve-sEduH59KSHV8vgA" name="container" visibility="public" type="_y3a3ee-sEduH59KSHV8vgA" association="_y3a3iu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3Vu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3V--sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3a3WO-sEduH59KSHV8vgA" name="source" visibility="public" type="_y3a3Y--sEduH59KSHV8vgA" association="_y3a3i--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3We-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3Wu-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3a3W--sEduH59KSHV8vgA" name="target" visibility="public" type="_y3a3Y--sEduH59KSHV8vgA" association="_y3a3jO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3XO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3Xe-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y3a3Xu-sEduH59KSHV8vgA" name="StateMachine">
-      <generalization xmi:id="_y3a3X--sEduH59KSHV8vgA" general="_yyzdTO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y3a3YO-sEduH59KSHV8vgA" name="region" visibility="public" type="_y3a3ee-sEduH59KSHV8vgA" aggregation="composite" association="_y3a3ku-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3Ye-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3Yu-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y3a3Y--sEduH59KSHV8vgA" name="Vertex">
-      <generalization xmi:id="_y3a3ZO-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y3a3Ze-sEduH59KSHV8vgA" name="container" visibility="public" type="_y3a3ee-sEduH59KSHV8vgA" association="_y3a3ie-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3Zu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3Z--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3a3aO-sEduH59KSHV8vgA" name="outgoing" visibility="public" type="_y3a3UO-sEduH59KSHV8vgA" association="_y3a3i--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3ae-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3au-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3a3a--sEduH59KSHV8vgA" name="incoming" visibility="public" type="_y3a3UO-sEduH59KSHV8vgA" association="_y3a3jO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3bO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3be-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y3a3bu-sEduH59KSHV8vgA" name="PseudoState">
-      <generalization xmi:id="_y3a3b--sEduH59KSHV8vgA" general="_y3a3Y--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Enumeration" xmi:id="_y3a3cO-sEduH59KSHV8vgA" name="PseudoStateKind">
-      <ownedLiteral xmi:id="_y3a3ce-sEduH59KSHV8vgA" name="initial"/>
-      <ownedLiteral xmi:id="_y3a3cu-sEduH59KSHV8vgA" name="join"/>
-      <ownedLiteral xmi:id="_y3a3c--sEduH59KSHV8vgA" name="fork"/>
-      <ownedLiteral xmi:id="_y3a3dO-sEduH59KSHV8vgA" name="junction"/>
-      <ownedLiteral xmi:id="_y3a3de-sEduH59KSHV8vgA" name="choice"/>
-      <ownedLiteral xmi:id="_y3a3du-sEduH59KSHV8vgA" name="entryPoint"/>
-      <ownedLiteral xmi:id="_y3a3d--sEduH59KSHV8vgA" name="exitPoint"/>
-      <ownedLiteral xmi:id="_y3a3eO-sEduH59KSHV8vgA" name="terminate"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y3a3ee-sEduH59KSHV8vgA" name="Region">
-      <generalization xmi:id="_y3a3eu-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y3a3e--sEduH59KSHV8vgA" name="vertex" visibility="public" type="_y3a3Y--sEduH59KSHV8vgA" aggregation="composite" association="_y3a3ie-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3fO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3fe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3a3fu-sEduH59KSHV8vgA" name="transition" visibility="public" type="_y3a3UO-sEduH59KSHV8vgA" aggregation="composite" association="_y3a3iu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3f--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3gO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y3a3ge-sEduH59KSHV8vgA" name="state" visibility="public" type="_y3RtYO-sEduH59KSHV8vgA" association="_y3a3je-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y3a3gu-sEduH59KSHV8vgA" name="stateMachine" visibility="public" type="_y3a3Xu-sEduH59KSHV8vgA" association="_y3a3ku-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3g--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3hO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3he-sEduH59KSHV8vgA" memberEnd="_y3RtYu-sEduH59KSHV8vgA _y3a3hu-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y3a3hu-sEduH59KSHV8vgA" name="state" visibility="public" type="_y3RtYO-sEduH59KSHV8vgA" association="_y3a3he-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3h--sEduH59KSHV8vgA" memberEnd="_y3a3Uu-sEduH59KSHV8vgA _y3a3iO-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y3a3iO-sEduH59KSHV8vgA" name="transition" visibility="public" type="_y3a3UO-sEduH59KSHV8vgA" association="_y3a3h--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3ie-sEduH59KSHV8vgA" memberEnd="_y3a3e--sEduH59KSHV8vgA _y3a3Ze-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3iu-sEduH59KSHV8vgA" memberEnd="_y3a3fu-sEduH59KSHV8vgA _y3a3Ve-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3i--sEduH59KSHV8vgA" memberEnd="_y3a3aO-sEduH59KSHV8vgA _y3a3WO-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3jO-sEduH59KSHV8vgA" memberEnd="_y3a3a--sEduH59KSHV8vgA _y3a3W--sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3je-sEduH59KSHV8vgA" memberEnd="_y3RtZe-sEduH59KSHV8vgA _y3a3ge-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3ju-sEduH59KSHV8vgA" memberEnd="_y3RtaO-sEduH59KSHV8vgA _y3a3j--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y3a3j--sEduH59KSHV8vgA" name="subMachineState" visibility="public" type="_y3RtYO-sEduH59KSHV8vgA" association="_y3a3ju-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y3a3kO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y3a3ke-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y3a3ku-sEduH59KSHV8vgA" memberEnd="_y3a3YO-sEduH59KSHV8vgA _y3a3gu-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y4eAMe-sEduH59KSHV8vgA" name="MethodPackage" isAbstract="true">
-      <ownedComment xmi:id="_y4eAMu-sEduH59KSHV8vgA" annotatedElement="_y4eAMe-sEduH59KSHV8vgA">
-        <body>A Method Package is an abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.</body>
-      </ownedComment>
-      <generalization xmi:id="_y4eAM--sEduH59KSHV8vgA" general="_yxUPVO-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_y4eANO-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y4eANe-sEduH59KSHV8vgA" name="global" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y4eANu-sEduH59KSHV8vgA" annotatedElement="_y4eANe-sEduH59KSHV8vgA">
-          <body>Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y4eAN--sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>false</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y4eAOO-sEduH59KSHV8vgA" name="reusedPackages" visibility="public" type="_y4eAMe-sEduH59KSHV8vgA" association="_y4eASe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y4eAOe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y4eAOu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y4eAO--sEduH59KSHV8vgA" name="childPackages" visibility="public" type="_y4eAMe-sEduH59KSHV8vgA" aggregation="composite" association="_y4eATu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y4eAPO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y4eAPe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y4eAPu-sEduH59KSHV8vgA" name="ContentPackage">
-      <ownedComment xmi:id="_y4eAP--sEduH59KSHV8vgA" annotatedElement="_y4eAPu-sEduH59KSHV8vgA">
-        <body>A Content Package is special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</body>
-      </ownedComment>
-      <generalization xmi:id="_y4eAQO-sEduH59KSHV8vgA" general="_y4eAMe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y4eAQe-sEduH59KSHV8vgA" name="contentElements" visibility="public" type="_yxw7VO-sEduH59KSHV8vgA" aggregation="composite" association="_y4eARO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y4eAQu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y4eAQ--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y4eARO-sEduH59KSHV8vgA" memberEnd="_y4eAQe-sEduH59KSHV8vgA _y4eARu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y4eARe-sEduH59KSHV8vgA" annotatedElement="_y4eARO-sEduH59KSHV8vgA">
-        <body>A Content Package contains Content Elements.  A Content Element instance can be part of only one package instance.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y4eARu-sEduH59KSHV8vgA" name="_contentPackage" visibility="public" type="_y4eAPu-sEduH59KSHV8vgA" isUnique="false" association="_y4eARO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y4eAR--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y4eASO-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y4eASe-sEduH59KSHV8vgA" memberEnd="_y4eAS--sEduH59KSHV8vgA _y4eAOO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y4eASu-sEduH59KSHV8vgA" annotatedElement="_y4eASe-sEduH59KSHV8vgA">
-        <body>This association describes a dependency between the two packages it connects.  The package at the usingPackage end depends on the package at the reusedPackage end.  For example, an element in the former package is using an element in the later in a relationship such as a Task is using a Work Products as an input.  Reflexive reusedPackage links (i.e. a package that depends on itself) are not allowed.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y4eAS--sEduH59KSHV8vgA" name="usingPackages" visibility="public" type="_y4eAMe-sEduH59KSHV8vgA" association="_y4eASe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y4eATO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y4eATe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y4eATu-sEduH59KSHV8vgA" name="PackageNesting" memberEnd="_y4eAUO-sEduH59KSHV8vgA _y4eAO--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y4eAT--sEduH59KSHV8vgA" annotatedElement="_y4eATu-sEduH59KSHV8vgA">
-        <body>Method Packages can be nested, i.e. a package can be part of another package.  Nested packages do not need to be of the same type, e.g. a Content Package can be defined inside a Process Package (define for the Process part of this model).</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y4eAUO-sEduH59KSHV8vgA" name="_methodPackage" visibility="public" type="_y4eAMe-sEduH59KSHV8vgA" isUnique="false" association="_y4eATu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y4eAUe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y4eAUu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7mMt--sEduH59KSHV8vgA" name="Milestone">
-      <ownedComment xmi:id="_y7mMuO-sEduH59KSHV8vgA" annotatedElement="_y7mMt--sEduH59KSHV8vgA">
-        <body>A Milestone describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).</body>
-      </ownedComment>
-      <generalization xmi:id="_y7mMue-sEduH59KSHV8vgA" general="_y7vXKe-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7mMuu-sEduH59KSHV8vgA" name="Iteration">
-      <ownedComment xmi:id="_y7mMu--sEduH59KSHV8vgA" annotatedElement="_y7mMuu-sEduH59KSHV8vgA">
-        <body>Iteration is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7mMvO-sEduH59KSHV8vgA" general="_y7mMsO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7mMve-sEduH59KSHV8vgA" name="Phase">
-      <ownedComment xmi:id="_y7mMvu-sEduH59KSHV8vgA" annotatedElement="_y7mMve-sEduH59KSHV8vgA">
-        <body>Phase is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7mMv--sEduH59KSHV8vgA" general="_y7mMsO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7mMwO-sEduH59KSHV8vgA" name="TeamProfile">
-      <ownedComment xmi:id="_y7mMwe-sEduH59KSHV8vgA" annotatedElement="_y7mMwO-sEduH59KSHV8vgA">
-        <body>A Team Profile is a Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
-Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
-Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7mMwu-sEduH59KSHV8vgA" general="_y7vWvO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7mMw--sEduH59KSHV8vgA" name="teamRoles" visibility="public" type="_y7vW3--sEduH59KSHV8vgA" association="_y7vXO--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7mMxO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7mMxe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7mMxu-sEduH59KSHV8vgA" name="superTeam" visibility="public" type="_y7mMwO-sEduH59KSHV8vgA" association="_y75HoO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7mMx--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7mMyO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7mMye-sEduH59KSHV8vgA" name="subTeam" visibility="public" type="_y7mMwO-sEduH59KSHV8vgA" association="_y75HoO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7mMyu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7mMy--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Enumeration" xmi:id="_y7vWoO-sEduH59KSHV8vgA" name="WorkOrderType">
-      <ownedComment xmi:id="_y7vWoe-sEduH59KSHV8vgA" annotatedElement="_y7vWoO-sEduH59KSHV8vgA">
-        <body>Work Order represents a relationship between two Breakdown Element in which one Breakdown Element (referred to as (B) below) depends on the start or finish of another Breakdown Element (referred to as (A) below) in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.</body>
-      </ownedComment>
-      <ownedLiteral xmi:id="_y7vWou-sEduH59KSHV8vgA" name="finishToStart">
-        <ownedComment xmi:id="_y7vWo--sEduH59KSHV8vgA" annotatedElement="_y7vWou-sEduH59KSHV8vgA">
-          <body>Breakdown Element (B) cannot start until Breakdown Element (A) finishes. For example, if you have two Breakdown Elements, &quot;Construct fence&quot; and &quot;Paint fence,&quot; &quot;Paint fence&quot; can't start until &quot;Construct fence&quot; finishes. This is the most common type of dependency and the default for a new Work Order instance.
-</body>
-        </ownedComment>
-      </ownedLiteral>
-      <ownedLiteral xmi:id="_y7vWpO-sEduH59KSHV8vgA" name="finishToFinish">
-        <ownedComment xmi:id="_y7vWpe-sEduH59KSHV8vgA" annotatedElement="_y7vWpO-sEduH59KSHV8vgA">
-          <body>Breakdown Element (B) cannot finish until Breakdown Element (A) finishes. For example, if you have two Breakdown Elements, &quot;Add wiring&quot; and &quot;Inspect electrical,&quot; &quot;Inspect electrical&quot; can't finish until &quot;Add wiring&quot; finishes.
-</body>
-        </ownedComment>
-      </ownedLiteral>
-      <ownedLiteral xmi:id="_y7vWpu-sEduH59KSHV8vgA" name="startToStart">
-        <ownedComment xmi:id="_y7vWp--sEduH59KSHV8vgA" annotatedElement="_y7vWpu-sEduH59KSHV8vgA">
-          <body>Breakdown Element (B) cannot start until Breakdown Element (A) starts. For example, if you have two Breakdown Elements, &quot;Pour foundation&quot; and &quot;Level concrete,&quot; &quot;Level concrete&quot; can't begin until &quot;Pour foundation&quot; begins.
-</body>
-        </ownedComment>
-      </ownedLiteral>
-      <ownedLiteral xmi:id="_y7vWqO-sEduH59KSHV8vgA" name="startToFinish">
-        <ownedComment xmi:id="_y7vWqe-sEduH59KSHV8vgA" annotatedElement="_y7vWqO-sEduH59KSHV8vgA">
-          <body>Breakdown Element (B) cannot finish until Breakdown Element (A) starts. This dependency type can be used for just-in-time scheduling up to a milestone or the project finish date to minimize the risk of a Breakdown Element finishing late if its dependent Breakdown Elements slip. If a related Breakdown Element needs to finish before the milestone or project finish date, but it doesn't matter exactly when and you don't want a late finish to affect the just-in-time Breakdown Element, you can create an SF dependency between the Breakdown Element you want scheduled just in time (the predecessor) and its related Breakdown Element (the successor). Then if you update progress on the successor Breakdown Element, it won't affect the scheduled dates of the predecessor Breakdown Element.</body>
-        </ownedComment>
-      </ownedLiteral>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vWqu-sEduH59KSHV8vgA" name="WorkOrder">
-      <ownedComment xmi:id="_y7vWq--sEduH59KSHV8vgA" annotatedElement="_y7vWqu-sEduH59KSHV8vgA">
-        <body>Work Order is a Method Element that represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
-(Note, Work Order is not modeled as an Association Class to provide a straightforward mapping  to XMI and EMF.)
-The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vWrO-sEduH59KSHV8vgA" general="_y7vXOO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vWre-sEduH59KSHV8vgA" name="linkType" visibility="public" type="_y7vWoO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWru-sEduH59KSHV8vgA" annotatedElement="_y7vWre-sEduH59KSHV8vgA">
-          <body>This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vWr--sEduH59KSHV8vgA">
-          <body>finishToStart</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vWsO-sEduH59KSHV8vgA" name="pred" visibility="public" type="_y7vXKe-sEduH59KSHV8vgA" association="_y75H8--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vWse-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vWsu-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vWs--sEduH59KSHV8vgA" name="PlanningData">
-      <ownedComment xmi:id="_y7vWtO-sEduH59KSHV8vgA" annotatedElement="_y7vWs--sEduH59KSHV8vgA">
-        <body>Planning Data is a Method Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
-Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
-(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vWte-sEduH59KSHV8vgA" general="_y7vXOO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vWtu-sEduH59KSHV8vgA" name="startDate" visibility="public" type="_yxUPZO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWt--sEduH59KSHV8vgA" annotatedElement="_y7vWtu-sEduH59KSHV8vgA">
-          <body>The default start date for a planed Task.</body>
-        </ownedComment>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vWuO-sEduH59KSHV8vgA" name="finishDate" visibility="public" type="_yxUPZO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWue-sEduH59KSHV8vgA" annotatedElement="_y7vWuO-sEduH59KSHV8vgA">
-          <body>The default finish date for a planed Task.</body>
-        </ownedComment>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vWuu-sEduH59KSHV8vgA" name="rank" visibility="public" type="_yxUPbO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWu--sEduH59KSHV8vgA" annotatedElement="_y7vWuu-sEduH59KSHV8vgA">
-          <body>The default rank for a planed Task.</body>
-        </ownedComment>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vWvO-sEduH59KSHV8vgA" name="BreakdownElement" isAbstract="true">
-      <ownedComment xmi:id="_y7vWve-sEduH59KSHV8vgA" annotatedElement="_y7vWvO-sEduH59KSHV8vgA">
-        <body>Breakdown Element is an abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vWv--sEduH59KSHV8vgA" general="_y7vXOO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vWwO-sEduH59KSHV8vgA" name="prefix" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWwe-sEduH59KSHV8vgA" annotatedElement="_y7vWwO-sEduH59KSHV8vgA">
-          <body>Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. &quot;SRA.Establish Requirements&quot; with SRA indicating that this Activity belongs to the &quot;Software Requirements Analysis&quot; module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, &quot;Customer.Architect&quot; would define a &quot;Customer&quot; prefix for the Role Descriptor &quot;Architect&quot; expressing that this is an architect on the customer side and not the development team side.
-</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vWwu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vWw--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y7vWxO-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vWxe-sEduH59KSHV8vgA" name="isPlanned" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWxu-sEduH59KSHV8vgA" annotatedElement="_y7vWxe-sEduH59KSHV8vgA">
-          <body>A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-
-
-</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vWx--sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>true</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vWyO-sEduH59KSHV8vgA" name="hasMultipleOccurrences" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWye-sEduH59KSHV8vgA" annotatedElement="_y7vWyO-sEduH59KSHV8vgA">
-          <body>Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as &quot;Detail Use Case&quot; would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.
-</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vWyu-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>false</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vWy--sEduH59KSHV8vgA" name="isOptional" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vWzO-sEduH59KSHV8vgA" annotatedElement="_y7vWy--sEduH59KSHV8vgA">
-          <body>The isOptional attribute indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vWze-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>false</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vWzu-sEduH59KSHV8vgA" name="presentedAfter" visibility="public" type="_y7vWvO-sEduH59KSHV8vgA" association="_y75Hou-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vWz--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW0O-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW0e-sEduH59KSHV8vgA" name="presentedBefore" visibility="public" type="_y7vWvO-sEduH59KSHV8vgA" association="_y75H7u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW0u-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW0--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW1O-sEduH59KSHV8vgA" name="planningData" visibility="public" type="_y7vWs--sEduH59KSHV8vgA" aggregation="composite" association="_y_BUNO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW1e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW1u-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW1--sEduH59KSHV8vgA" name="superActivities" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" association="_y_BURu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW2O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW2e-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vW2u-sEduH59KSHV8vgA" name="Descriptor" isAbstract="true">
-      <ownedComment xmi:id="_y7vW2--sEduH59KSHV8vgA" annotatedElement="_y7vW2u-sEduH59KSHV8vgA">
-        <body>A Descriptor is an abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
-Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. 
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vW3O-sEduH59KSHV8vgA" general="_y7vWvO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vW3e-sEduH59KSHV8vgA" name="isSynchronizedWithSource" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vW3u-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>true</body>
-        </defaultValue>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vW3--sEduH59KSHV8vgA" name="RoleDescriptor">
-      <ownedComment xmi:id="_y7vW4O-sEduH59KSHV8vgA" annotatedElement="_y7vW3--sEduH59KSHV8vgA">
-        <body>A Role Descriptor represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vW4e-sEduH59KSHV8vgA" general="_y7vW2u-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vW4u-sEduH59KSHV8vgA" name="role" visibility="public" type="_yyzdEe-sEduH59KSHV8vgA" association="_y75Hse-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW4--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW5O-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW5e-sEduH59KSHV8vgA" name="modifies" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" isDerived="true" association="_y75HzO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW5u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW5--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW6O-sEduH59KSHV8vgA" name="responsibleFor" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75H5e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW6e-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW6u-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vW6--sEduH59KSHV8vgA" name="TaskDescriptor">
-      <ownedComment xmi:id="_y7vW7O-sEduH59KSHV8vgA" annotatedElement="_y7vW6--sEduH59KSHV8vgA">
-        <body>A Task Descriptor is a Descriptor and Work Breakdown Element that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
-A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
-
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vW7e-sEduH59KSHV8vgA" general="_y7vW2u-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_y7vW7u-sEduH59KSHV8vgA" general="_y7vXKe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vW7--sEduH59KSHV8vgA" name="task" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" association="_y75Hp--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW8O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW8e-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW8u-sEduH59KSHV8vgA" name="additionallyPerformedBy" visibility="public" type="_y7vW3--sEduH59KSHV8vgA" association="_y75Htu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW8--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW9O-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW9e-sEduH59KSHV8vgA" name="assistedBy" visibility="public" type="_y7vW3--sEduH59KSHV8vgA" association="_y75Hu--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW9u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW9--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW-O-sEduH59KSHV8vgA" name="externalInput" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75HwO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW-e-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW-u-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW---sEduH59KSHV8vgA" name="mandatoryInput" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75Hx--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW_O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vW_e-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vW_u-sEduH59KSHV8vgA" name="optionalInput" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75H0e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vW_--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXAO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXAe-sEduH59KSHV8vgA" name="output" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75H1u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXAu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXA--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXBO-sEduH59KSHV8vgA" name="performedPrimarilyBy" visibility="public" type="_y7vW3--sEduH59KSHV8vgA" association="_y75H4O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXBe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXBu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXB--sEduH59KSHV8vgA" name="selectedSteps" visibility="public" type="_yxw7Yu-sEduH59KSHV8vgA" association="_zBZ6C--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXCO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXCe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vXCu-sEduH59KSHV8vgA" name="WorkProductDescriptor">
-      <ownedComment xmi:id="_y7vXC--sEduH59KSHV8vgA" annotatedElement="_y7vXCu-sEduH59KSHV8vgA">
-        <body>A Work Product Descriptor represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vXDO-sEduH59KSHV8vgA" general="_y7vW2u-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vXDe-sEduH59KSHV8vgA" name="activityEntryState" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vXDu-sEduH59KSHV8vgA" annotatedElement="_y7vXDe-sEduH59KSHV8vgA">
-          <body>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXD--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXEO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y7vXEe-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXEu-sEduH59KSHV8vgA" name="activityExitState" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vXE--sEduH59KSHV8vgA" annotatedElement="_y7vXEu-sEduH59KSHV8vgA">
-          <body>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXFO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXFe-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y7vXFu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXF--sEduH59KSHV8vgA" name="workProduct" visibility="public" type="_yyzdMO-sEduH59KSHV8vgA" association="_y75HrO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXGO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXGe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXGu-sEduH59KSHV8vgA" name="impactedBy" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75Hxe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXG--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXHO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXHe-sEduH59KSHV8vgA" name="impacts" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75Hxe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXHu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXH--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXIO-sEduH59KSHV8vgA" name="deliverableParts" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75H2--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXIe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXIu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vXI--sEduH59KSHV8vgA" name="CompositeRole">
-      <ownedComment xmi:id="_y7vXJO-sEduH59KSHV8vgA" annotatedElement="_y7vXI--sEduH59KSHV8vgA">
-        <body>A Composite Role is a special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
-A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vXJe-sEduH59KSHV8vgA" general="_y7vW3--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vXJu-sEduH59KSHV8vgA" name="aggregatedRoles" visibility="public" type="_yyzdEe-sEduH59KSHV8vgA" association="_y75H6u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXJ--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXKO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vXKe-sEduH59KSHV8vgA" name="WorkBreakdownElement" isAbstract="true">
-      <ownedComment xmi:id="_y7vXKu-sEduH59KSHV8vgA" annotatedElement="_y7vXKe-sEduH59KSHV8vgA">
-        <body>A Work Breakdown Element is a special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vXK--sEduH59KSHV8vgA" general="_y7vWvO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7vXLO-sEduH59KSHV8vgA" name="isRepeatable" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vXLe-sEduH59KSHV8vgA" annotatedElement="_y7vXLO-sEduH59KSHV8vgA">
-          <body>This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vXLu-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>false</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXL--sEduH59KSHV8vgA" name="isOngoing" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vXMO-sEduH59KSHV8vgA" annotatedElement="_y7vXL--sEduH59KSHV8vgA">
-          <body>If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vXMe-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>false</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXMu-sEduH59KSHV8vgA" name="isEventDriven" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y7vXM--sEduH59KSHV8vgA" annotatedElement="_y7vXMu-sEduH59KSHV8vgA">
-          <body>The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-
-
-</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_y7vXNO-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>false</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y7vXNe-sEduH59KSHV8vgA" name="linkToPredecessor" visibility="public" type="_y7vWqu-sEduH59KSHV8vgA" association="_y75H-O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXNu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXN--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7vXOO-sEduH59KSHV8vgA" name="ProcessElement" isAbstract="true">
-      <ownedComment xmi:id="_y7vXOe-sEduH59KSHV8vgA" annotatedElement="_y7vXOO-sEduH59KSHV8vgA">
-        <body>Process Element is a Describable Element that represents an abstract generalization for all elements defined in the Process package.
-Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. 
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7vXOu-sEduH59KSHV8vgA" general="_yxw7eu-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y7vXO--sEduH59KSHV8vgA" memberEnd="_y7vXPe-sEduH59KSHV8vgA _y7mMw--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y7vXPO-sEduH59KSHV8vgA" annotatedElement="_y7vXO--sEduH59KSHV8vgA">
-        <body>This aggregation association specifies the roles of team members with Role Descriptors.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y7vXPe-sEduH59KSHV8vgA" name="_teamProfile" visibility="public" type="_y7mMwO-sEduH59KSHV8vgA" isUnique="false" association="_y7vXO--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7vXPu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7vXP--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75HoO-sEduH59KSHV8vgA" memberEnd="_y7mMxu-sEduH59KSHV8vgA _y7mMye-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75Hoe-sEduH59KSHV8vgA" annotatedElement="_y75HoO-sEduH59KSHV8vgA">
-        <body>This association relates a Sub-Team to its Super-Team, i.e. the Team that it is part of.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75Hou-sEduH59KSHV8vgA" memberEnd="_y7vWzu-sEduH59KSHV8vgA _y75HpO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75Ho--sEduH59KSHV8vgA" annotatedElement="_y75Hou-sEduH59KSHV8vgA">
-        <body>Breakdown structures are nested structures (see superActivities association) presented normally as indented lists.  Within this nesting children on the same level are not specifically ordered.  However, a user of these data structures would expect to order elements within a list.  This association is used to store the presentation sequence amongst Breakdown Elements.  The association presentedAfter is redundant to the association presentedBefore.  This redundancy is required to support Process Contributions (see plugins).</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75HpO-sEduH59KSHV8vgA" name="_breakdownElement" visibility="public" type="_y7vWvO-sEduH59KSHV8vgA" isUnique="false" association="_y75Hou-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hpe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75Hpu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75Hp--sEduH59KSHV8vgA" memberEnd="_y75Hqe-sEduH59KSHV8vgA _y7vW7--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75HqO-sEduH59KSHV8vgA" annotatedElement="_y75Hp--sEduH59KSHV8vgA">
-        <body>This association represents the reference from the descriptor to the core content element it refers to.  Every Task Descriptor can reference only on Task.  However, a Task can be represented by many Task Descriptors.  In the UMA Profile this association is instantiated by a dependency relationship with a trace stereotype.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75Hqe-sEduH59KSHV8vgA" name="taskDescriptor" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75Hp--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hqu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75Hq--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75HrO-sEduH59KSHV8vgA" memberEnd="_y75Hru-sEduH59KSHV8vgA _y7vXF--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75Hre-sEduH59KSHV8vgA" annotatedElement="_y75HrO-sEduH59KSHV8vgA">
-        <body>This association represents the reference from the descriptor to the core content element it refers to.  Every Work Product Descriptor can reference only one Work Product.  However, a Work Product can be represented by many Work Product Descriptors.  In the UMA Profile this association is instantiated by a dependency relationship with a trace stereotype.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75Hru-sEduH59KSHV8vgA" name="workProductDescriptor" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75HrO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hr--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75HsO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75Hse-sEduH59KSHV8vgA" memberEnd="_y75Hs--sEduH59KSHV8vgA _y7vW4u-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75Hsu-sEduH59KSHV8vgA" annotatedElement="_y75Hse-sEduH59KSHV8vgA">
-        <body>This association represents the reference from the descriptor to the core content element it refers to.  Every Role Descriptor can reference only one Role.  However, a Role can be represented by many Role Descriptors.  In the UMA Profile this association is instantiated by a dependency relationship with a trace stereotype.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75Hs--sEduH59KSHV8vgA" name="roleDescriptor" visibility="public" type="_y7vW3--sEduH59KSHV8vgA" association="_y75Hse-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75HtO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75Hte-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75Htu-sEduH59KSHV8vgA" name="AdditionallyPerforms" memberEnd="_y7vW8u-sEduH59KSHV8vgA _y75HuO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75Ht--sEduH59KSHV8vgA" annotatedElement="_y75Htu-sEduH59KSHV8vgA">
-        <body>This association maps to the respective association in Core Content Elements.  It specifies descriptors for additional roles necessary to complete the referred Task.  Instances of these roles would show up as scheduled resources on a corresponding project plan generated from this structure.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75HuO-sEduH59KSHV8vgA" name="performsAdditionally" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75Htu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hue-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75Huu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75Hu--sEduH59KSHV8vgA" name="Assists" memberEnd="_y7vW9e-sEduH59KSHV8vgA _y75Hve-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75HvO-sEduH59KSHV8vgA" annotatedElement="_y75Hu--sEduH59KSHV8vgA">
-        <body>This association is specific to a process, i.e. no defaults have been defined in Core Content Elements.  It specifies descriptors for additional roles that may provide information or assistance helpful, but not mandatory to the completion of the Task.  Instances of these roles would not show up as scheduled resources on the corresponding project plan generated from this structure.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75Hve-sEduH59KSHV8vgA" name="assistsIn" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75Hu--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hvu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75Hv--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75HwO-sEduH59KSHV8vgA" name="ExternalInput" memberEnd="_y7vW-O-sEduH59KSHV8vgA _y75Hwu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75Hwe-sEduH59KSHV8vgA" annotatedElement="_y75HwO-sEduH59KSHV8vgA">
-        <body>This association is specific to a process, i.e. no defaults will be defined in Core Content Elements.  It specifies descriptors for Work Products used as inputs that are not produced by Tasks within the same Process, but by another external process or an unknown source.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75Hwu-sEduH59KSHV8vgA" name="externalInputTo" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75HwO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hw--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75HxO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75Hxe-sEduH59KSHV8vgA" name="ImpactsDependency" memberEnd="_y7vXGu-sEduH59KSHV8vgA _y7vXHe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75Hxu-sEduH59KSHV8vgA" annotatedElement="_y75Hxe-sEduH59KSHV8vgA">
-        <body>This association is used to semi-formally specify traceability relationships between Work Products within the scope of an Activity.  A link from one Work Product Descriptor to another indicates that one Work Product is required as input to a Task that produces the related Work Product ('impacts' role end).  It would also mean that a change on one Work Product instance may affect a change on the related product.</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75Hx--sEduH59KSHV8vgA" name="MandatoryInput" memberEnd="_y7vW---sEduH59KSHV8vgA _y75Hye-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75HyO-sEduH59KSHV8vgA" annotatedElement="_y75Hx--sEduH59KSHV8vgA">
-        <body>This association maps to the respective association in Core Content Elements.  It points to descriptors for Work Products that are mandatory for the Task to be performed.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75Hye-sEduH59KSHV8vgA" name="mandatoryInputTo" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75Hx--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hyu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75Hy--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75HzO-sEduH59KSHV8vgA" name="Modifies" memberEnd="_y7vW5e-sEduH59KSHV8vgA _y75Hzu-sEduH59KSHV8vgA" isDerived="true">
-      <ownedComment xmi:id="_y75Hze-sEduH59KSHV8vgA" annotatedElement="_y75HzO-sEduH59KSHV8vgA">
-        <body>This derived association maps to the Modifies association defined between Work Products and Tasks in Core Method Content.  The same derivation rule as for the core content elements applies.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75Hzu-sEduH59KSHV8vgA" name="_roleDescriptor" visibility="public" type="_y7vW3--sEduH59KSHV8vgA" isUnique="false" association="_y75HzO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75Hz--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H0O-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H0e-sEduH59KSHV8vgA" name="OptionalInput" memberEnd="_y75H0--sEduH59KSHV8vgA _y7vW_u-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H0u-sEduH59KSHV8vgA" annotatedElement="_y75H0e-sEduH59KSHV8vgA">
-        <body>This association maps to the respective association in Core Content Elements.  It points to descriptors for Work Products that are optional for the Task to be performed.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H0--sEduH59KSHV8vgA" name="OptionalInputTo" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75H0e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H1O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H1e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H1u-sEduH59KSHV8vgA" name="Output" memberEnd="_y75H2O-sEduH59KSHV8vgA _y7vXAe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H1--sEduH59KSHV8vgA" annotatedElement="_y75H1u-sEduH59KSHV8vgA">
-        <body>This association maps to the respective association in Core Content Elements.  It points to descriptors for Work Products that are outputs for performing the referred Task.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H2O-sEduH59KSHV8vgA" name="outputFrom" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75H1u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H2e-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H2u-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H2--sEduH59KSHV8vgA" name="PackagedWP" memberEnd="_y75H3e-sEduH59KSHV8vgA _y7vXIO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H3O-sEduH59KSHV8vgA" annotatedElement="_y75H2--sEduH59KSHV8vgA">
-        <body>If a Work Product Descriptor refers at the 'deliverable' role end to a Deliverable Work Product then this association is used to specify the Deliverable's Work Product parts.  As indicated for Deliverable in the Core Method Content package, this association overrides the 'deliveredWorkProducts' association of the Work Product, which stores the recommended deliverable parts, but can be customized for every Work Product Descriptor. </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H3e-sEduH59KSHV8vgA" name="deliverable" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" association="_y75H2--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H3u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H3--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H4O-sEduH59KSHV8vgA" name="PrimaryPerforms" memberEnd="_y7vXBO-sEduH59KSHV8vgA _y75H4u-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H4e-sEduH59KSHV8vgA" annotatedElement="_y75H4O-sEduH59KSHV8vgA">
-        <body>This association maps to the respective association in Core Content Elements.  It points to a descriptor for the one role responsible for the completion of the task.  An instance of this role would show up as a scheduled resource on a corresponding project plan generated from this structure.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H4u-sEduH59KSHV8vgA" name="performsAsOwner" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" association="_y75H4O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H4--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H5O-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H5e-sEduH59KSHV8vgA" name="Responsible" memberEnd="_y7vW6O-sEduH59KSHV8vgA _y75H5--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H5u-sEduH59KSHV8vgA" annotatedElement="_y75H5e-sEduH59KSHV8vgA">
-        <body>This association represents responsibility for Work Product instances.  It indicates ownership and for example would define the Role that answers to management questions about the quality work product.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H5--sEduH59KSHV8vgA" name="responsibleRole" visibility="public" type="_y7vW3--sEduH59KSHV8vgA" association="_y75H5e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H6O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H6e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H6u-sEduH59KSHV8vgA" memberEnd="_y7vXJu-sEduH59KSHV8vgA _y75H6--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y75H6--sEduH59KSHV8vgA" name="_compositeRole" visibility="public" type="_y7vXI--sEduH59KSHV8vgA" isUnique="false" association="_y75H6u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H7O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H7e-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H7u-sEduH59KSHV8vgA" memberEnd="_y7vW0e-sEduH59KSHV8vgA _y75H8O-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H7--sEduH59KSHV8vgA" annotatedElement="_y75H7u-sEduH59KSHV8vgA">
-        <body>Breakdown structures are nested structures (see superActivities association) presented normally as indented lists.  Within this nesting children on the same level are not specifically ordered.  However, a user of these data structures would expect to order elements within a list.  This association is used to store the presentation sequence amongst Breakdown Elements.  The association presentedBefore is redundant to the association presentedAfter.  This redundancy is required to support Process Contributions (see plugins).</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H8O-sEduH59KSHV8vgA" name="_breakdownElement" visibility="public" type="_y7vWvO-sEduH59KSHV8vgA" isUnique="false" association="_y75H7u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H8e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H8u-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H8--sEduH59KSHV8vgA" memberEnd="_y7vWsO-sEduH59KSHV8vgA _y75H9e-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H9O-sEduH59KSHV8vgA" annotatedElement="_y75H8--sEduH59KSHV8vgA">
-        <body>The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This association links a Work Breakdown Element to its successor Work Breakdown Element.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H9e-sEduH59KSHV8vgA" name="linkToSuccessor" visibility="public" type="_y7vWqu-sEduH59KSHV8vgA" association="_y75H8--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H9u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H9--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y75H-O-sEduH59KSHV8vgA" memberEnd="_y75H-u-sEduH59KSHV8vgA _y7vXNe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y75H-e-sEduH59KSHV8vgA" annotatedElement="_y75H-O-sEduH59KSHV8vgA">
-        <body>This association links a Work Breakdown Element to its predecessor.  Every Work Breakdown Element can have predecessor information associated to it.  Specific predecessor information is stored in instances of the class Work Order, which defines the kind of predecessor another Work Breakdown Element represents for another.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y75H-u-sEduH59KSHV8vgA" name="succ" visibility="public" type="_y7vXKe-sEduH59KSHV8vgA" association="_y75H-O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y75H---sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y75H_O-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y-4KMO-sEduH59KSHV8vgA" name="DeliveryProcess">
-      <ownedComment xmi:id="_y-4KMe-sEduH59KSHV8vgA" annotatedElement="_y-4KMO-sEduH59KSHV8vgA">
-        <body>A Delivery Processes is a special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
-A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y-4KMu-sEduH59KSHV8vgA" general="_y-4KOe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y-4KM--sEduH59KSHV8vgA" name="educationMaterials" visibility="public" type="_yz1-8--sEduH59KSHV8vgA" association="_y_BUPO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KNO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KNe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KNu-sEduH59KSHV8vgA" name="communicationsMaterials" visibility="public" type="_yz1-8--sEduH59KSHV8vgA" association="_y_BUQe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KN--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KOO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y-4KP--sEduH59KSHV8vgA" name="ProcessPlanningTemplate">
-      <ownedComment xmi:id="_y-4KQO-sEduH59KSHV8vgA" annotatedElement="_y-4KP--sEduH59KSHV8vgA">
-        <body>A Process Planning Template is a special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
-A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y-4KQe-sEduH59KSHV8vgA" general="_y-4KOe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y-4KQu-sEduH59KSHV8vgA" name="basedOnProcesses" visibility="public" type="_y-4KOe-sEduH59KSHV8vgA" association="_y_BUL--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KQ--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KRO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y-4KRe-sEduH59KSHV8vgA" name="Roadmap">
-      <ownedComment xmi:id="_y-4KRu-sEduH59KSHV8vgA" annotatedElement="_y-4KRe-sEduH59KSHV8vgA">
-        <body>A Roadmap is a special Guidance Type which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
-An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y-4KR--sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y2OkgO-sEduH59KSHV8vgA" name="Discipline">
-      <ownedComment xmi:id="_y2Okge-sEduH59KSHV8vgA" annotatedElement="_y2OkgO-sEduH59KSHV8vgA">
-        <body>A Discipline is a categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
-A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_y_BUIO-sEduH59KSHV8vgA" annotatedElement="_y2OkgO-sEduH59KSHV8vgA">
-        <body>Discipline is a categorization of Tasks based upon similarity of concerns and cooperation of work effort.  This is the extensions of Discipline defined in the Method Core package adding an additional association to Activities, which represent typical standard or reference ways of meaningful groupings of the Discipline's Tasks into workflows.
-Tasks represent descriptions of work, which are categorized by Disciplines.  The reason that several Tasks are all categorized by the same Discipline is that they all represent a part in achieving a higher goal or performing work that is all related to each other.  Every Discipline defines standard ways of doing the work it categorizes.  Such standard ways are express by Activities or Capability Patterns defining how the Tasks categorized by the Discipline 'work together' in the most generic way.  These reference workflows are often used for educating and teaching practitioners. 
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y2Okgu-sEduH59KSHV8vgA" general="_y2Oknu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y2Okg--sEduH59KSHV8vgA" name="tasks" visibility="public" type="_yyzdGu-sEduH59KSHV8vgA" association="_y2Ok5--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2OkhO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2Okhe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y2Okhu-sEduH59KSHV8vgA" name="subdiscipline" visibility="public" type="_y2OkgO-sEduH59KSHV8vgA" aggregation="composite" association="_y2Ok7O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y2Okh--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y2OkiO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y_BUIe-sEduH59KSHV8vgA" name="referenceWorkflows" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" association="_y_BUSO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUIu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUI--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yz1-_--sEduH59KSHV8vgA" name="Practice">
-      <ownedComment xmi:id="_yz1_AO-sEduH59KSHV8vgA" annotatedElement="_yz1-_--sEduH59KSHV8vgA">
-        <body>A Practice represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be &quot;Manage Risks&quot;, &quot;Continuously verify quality&quot;, &quot;Architecture-centric and component-based development&quot;, etc.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_yz1_Ae-sEduH59KSHV8vgA" general="_yyzdM--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yz1_Au-sEduH59KSHV8vgA" name="subPractices" visibility="public" type="_yz1-_--sEduH59KSHV8vgA" aggregation="composite" association="_yz_wKu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz1_A--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz1_BO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz1_Be-sEduH59KSHV8vgA" name="contentReferences" visibility="public" type="_yxw7VO-sEduH59KSHV8vgA" association="_y0Jg4O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz1_Bu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz1_B--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y_BUJO-sEduH59KSHV8vgA" name="activityReferences" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" association="_y_BUTe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUJe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUJu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y_BUJ--sEduH59KSHV8vgA" name="CapabilityPattern">
-      <ownedComment xmi:id="_y_BUKO-sEduH59KSHV8vgA" annotatedElement="_y_BUJ--sEduH59KSHV8vgA">
-        <body>A Capability Pattern is a special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
-A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
-- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
-- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
-- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y_BUKe-sEduH59KSHV8vgA" general="_y-4KOe-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUKu-sEduH59KSHV8vgA" memberEnd="_y-4KPO-sEduH59KSHV8vgA _y_BULO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUK--sEduH59KSHV8vgA" annotatedElement="_y_BUKu-sEduH59KSHV8vgA">
-        <body>This association provides traceability for a Process documenting which Capability Patterns have been used for defining the process.  It documents applications of a pattern through copy as well as pattern binding.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BULO-sEduH59KSHV8vgA" name="_process" visibility="public" type="_y-4KOe-sEduH59KSHV8vgA" isUnique="false" association="_y_BUKu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BULe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BULu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUL--sEduH59KSHV8vgA" memberEnd="_y-4KQu-sEduH59KSHV8vgA _y_BUMe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUMO-sEduH59KSHV8vgA" annotatedElement="_y_BUL--sEduH59KSHV8vgA">
-        <body>If the Plan has been created based on one or more processes (i.e. other Plans, Capability Patterns, a Delivery Process, or any combination of these), then this association captures a trace back to these sources.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUMe-sEduH59KSHV8vgA" name="_processPlanningTemplate" visibility="public" type="_y-4KP--sEduH59KSHV8vgA" isUnique="false" association="_y_BUL--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUMu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUM--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUNO-sEduH59KSHV8vgA" memberEnd="_y7vW1O-sEduH59KSHV8vgA _y_BUNu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUNe-sEduH59KSHV8vgA" annotatedElement="_y_BUNO-sEduH59KSHV8vgA">
-        <body>The PlanningData class factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUNu-sEduH59KSHV8vgA" name="_breakdownElement" visibility="public" type="_y7vWvO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUNO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUN--sEduH59KSHV8vgA" memberEnd="_y-4KSe-sEduH59KSHV8vgA _y_BUOe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUOO-sEduH59KSHV8vgA" annotatedElement="_y_BUN--sEduH59KSHV8vgA">
-        <body>This association links an Activity to zero or mores instances of the Roadmap guidance type.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUOe-sEduH59KSHV8vgA" name="activity" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" association="_y_BUN--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUOu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUO--sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUPO-sEduH59KSHV8vgA" memberEnd="_y_BUPu-sEduH59KSHV8vgA _y-4KM--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUPe-sEduH59KSHV8vgA" annotatedElement="_y_BUPO-sEduH59KSHV8vgA">
-        <body>This association defines a collection of guidance documents that provide education material for teaching stakeholders such as project managers on how to perform projects that follow this Delivery Process.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUPu-sEduH59KSHV8vgA" name="_deliveryProcess" visibility="private" type="_y-4KMO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUPO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUP--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUQO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUQe-sEduH59KSHV8vgA" memberEnd="_y_BUQ--sEduH59KSHV8vgA _y-4KNu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUQu-sEduH59KSHV8vgA" annotatedElement="_y_BUQe-sEduH59KSHV8vgA">
-        <body>This association defines a collection of guidance documents that have been related to a Delivery Process instance to describe and characterize its features and capabilities. These documents can be used for several purposes such as internal marketing communications, sales training and general method education.  Examples for Communications Material are Highlight Document, Fact Sheet, and Delivery Process Specification Overview.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUQ--sEduH59KSHV8vgA" name="_deliveryProcess" visibility="private" type="_y-4KMO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUQe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BURO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BURe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BURu-sEduH59KSHV8vgA" name="BreakdownNesting" memberEnd="_y7vW1--sEduH59KSHV8vgA _y7mMtO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUR--sEduH59KSHV8vgA" annotatedElement="_y_BURu-sEduH59KSHV8vgA">
-        <body>This bidirectional association represents breakdown structure nesting.  It defines an n-level hierarchy of Activities grouping together other Breakdown Elements such as other Activities, Descriptors, Milestones, etc.
-The superActivities role allows navigation of a Breakdown Element to is parent Activity. The breakdownElements role allows navigation from an Activity to its nested Breakdown Elements.
-</body>
-      </ownedComment>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUSO-sEduH59KSHV8vgA" memberEnd="_y_BUIe-sEduH59KSHV8vgA _y_BUSu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUSe-sEduH59KSHV8vgA" annotatedElement="_y_BUSO-sEduH59KSHV8vgA">
-        <body>This association provides one more reference workflows for a Discipline.  The reference workflows define the most typical ways of doing the work of a Discipline.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUSu-sEduH59KSHV8vgA" name="_discipline" visibility="public" type="_y2OkgO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUSO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUS--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUTO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUTe-sEduH59KSHV8vgA" memberEnd="_y_BUJO-sEduH59KSHV8vgA _y_BUTu-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_y_BUTu-sEduH59KSHV8vgA" name="_practice" visibility="public" type="_yz1-_--sEduH59KSHV8vgA" isUnique="false" association="_y_BUTe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUT--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUUO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUUe-sEduH59KSHV8vgA" memberEnd="_y-4KTO-sEduH59KSHV8vgA _y_BUU--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUUu-sEduH59KSHV8vgA" annotatedElement="_y_BUUe-sEduH59KSHV8vgA">
-        <body>This association can be used to link all kinds of general guidance to the Activity that is being managed as general Supporting Material.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUU--sEduH59KSHV8vgA" name="_activity" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUUe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUVO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUVe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUVu-sEduH59KSHV8vgA" memberEnd="_y-4KT--sEduH59KSHV8vgA _y_BUWO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUV--sEduH59KSHV8vgA" annotatedElement="_y_BUVu-sEduH59KSHV8vgA">
-        <body>This association provides Activity- (or Process-) specific check points.  These are typically used in reviews and inspections on the work performed.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUWO-sEduH59KSHV8vgA" name="_activity" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUVu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUWe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUWu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUW--sEduH59KSHV8vgA" memberEnd="_y-4KUu-sEduH59KSHV8vgA _y_BUXe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUXO-sEduH59KSHV8vgA" annotatedElement="_y_BUW--sEduH59KSHV8vgA">
-        <body>This association relates concepts or whitepapers to the Activity providing important background information necessary for doing the work described by the Activity.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUXe-sEduH59KSHV8vgA" name="_activity" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUW--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUXu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUX--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUYO-sEduH59KSHV8vgA" memberEnd="_y-4KVe-sEduH59KSHV8vgA _y_BUYu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUYe-sEduH59KSHV8vgA" annotatedElement="_y_BUYO-sEduH59KSHV8vgA">
-        <body>This association can provide references to examples relevant to this specific Activity (or Process).  </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUYu-sEduH59KSHV8vgA" name="_activity" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUYO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUY--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUZO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUZe-sEduH59KSHV8vgA" memberEnd="_y-4KWO-sEduH59KSHV8vgA _y_BUZ--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUZu-sEduH59KSHV8vgA" annotatedElement="_y_BUZe-sEduH59KSHV8vgA">
-        <body>This association provides Activity-specific Guidelines.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUZ--sEduH59KSHV8vgA" name="_activity" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUZe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y_BUaO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y_BUae-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_y_BUau-sEduH59KSHV8vgA" memberEnd="_y-4KW--sEduH59KSHV8vgA _y_BUbO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_y_BUa--sEduH59KSHV8vgA" annotatedElement="_y_BUau-sEduH59KSHV8vgA">
-        <body>This association refers to Reusable Assets specific to this Activity (or Process). </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_y_BUbO-sEduH59KSHV8vgA" name="_activity" visibility="public" type="_y7mMsO-sEduH59KSHV8vgA" isUnique="false" association="_y_BUau-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zBZ5wO-sEduH59KSHV8vgA" name="BreakdownElementDescription">
-      <generalization xmi:id="_zBZ5we-sEduH59KSHV8vgA" general="_yxw7V--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zBZ5wu-sEduH59KSHV8vgA" name="usageGuidance" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ5w--sEduH59KSHV8vgA" annotatedElement="_zBZ5wu-sEduH59KSHV8vgA">
-          <body>Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ5xO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ5xe-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ5xu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zBZ5x--sEduH59KSHV8vgA" name="ActivityDescription">
-      <generalization xmi:id="_zBZ5yO-sEduH59KSHV8vgA" general="_zBZ5wO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zBZ5ye-sEduH59KSHV8vgA" name="purpose" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ5yu-sEduH59KSHV8vgA" annotatedElement="_zBZ5ye-sEduH59KSHV8vgA">
-          <body>Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ5y--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ5zO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ5ze-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ5zu-sEduH59KSHV8vgA" name="alternatives" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ5z--sEduH59KSHV8vgA" annotatedElement="_zBZ5zu-sEduH59KSHV8vgA">
-          <body>Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ50O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ50e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ50u-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ50--sEduH59KSHV8vgA" name="howtoStaff" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ51O-sEduH59KSHV8vgA" annotatedElement="_zBZ50--sEduH59KSHV8vgA">
-          <body>Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ51e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ51u-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ51--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zBZ52O-sEduH59KSHV8vgA" name="DeliveryProcessDescription">
-      <generalization xmi:id="_zBZ52e-sEduH59KSHV8vgA" general="_zBZ5-O-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zBZ52u-sEduH59KSHV8vgA" name="scale" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ52--sEduH59KSHV8vgA" annotatedElement="_zBZ52u-sEduH59KSHV8vgA">
-          <body>Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ53O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ53e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ53u-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ53--sEduH59KSHV8vgA" name="projectCharacteristics" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ54O-sEduH59KSHV8vgA" annotatedElement="_zBZ53--sEduH59KSHV8vgA">
-          <body>Characterizes the project that would typically perform this Process</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ54e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ54u-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ54--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ55O-sEduH59KSHV8vgA" name="riskLevel" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ55e-sEduH59KSHV8vgA" annotatedElement="_zBZ55O-sEduH59KSHV8vgA">
-          <body>Outlines typical project risks that are addressed with this process.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ55u-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ55--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ56O-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ56e-sEduH59KSHV8vgA" name="estimatingTechnique" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ56u-sEduH59KSHV8vgA" annotatedElement="_zBZ56e-sEduH59KSHV8vgA">
-          <body>Describes the Estimation Techniques provided for this Process.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ56--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ57O-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ57e-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ57u-sEduH59KSHV8vgA" name="projectMemberExpertise" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ57--sEduH59KSHV8vgA" annotatedElement="_zBZ57u-sEduH59KSHV8vgA">
-          <body>Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ58O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ58e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ58u-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ58--sEduH59KSHV8vgA" name="typeOfContract" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ59O-sEduH59KSHV8vgA" annotatedElement="_zBZ58--sEduH59KSHV8vgA">
-          <body>Provides background information about the contracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ59e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ59u-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ59--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zBZ5-O-sEduH59KSHV8vgA" name="ProcessDescription">
-      <generalization xmi:id="_zBZ5-e-sEduH59KSHV8vgA" general="_zBZ5x--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zBZ5-u-sEduH59KSHV8vgA" name="scope" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ5---sEduH59KSHV8vgA" annotatedElement="_zBZ5-u-sEduH59KSHV8vgA">
-          <body>Defines the scope of the Process, i.e. which types of projects does it address and which not.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ5_O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ5_e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ5_u-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zBZ5_--sEduH59KSHV8vgA" name="usageNotes" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ6AO-sEduH59KSHV8vgA" annotatedElement="_zBZ5_--sEduH59KSHV8vgA">
-          <body>Any additional notes on how to apply and instantiate this process for a project.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ6Ae-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ6Au-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ6A--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zBZ6BO-sEduH59KSHV8vgA" name="DescriptorDescription">
-      <generalization xmi:id="_zBZ6Be-sEduH59KSHV8vgA" general="_zBZ5wO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zBZ6Bu-sEduH59KSHV8vgA" name="refinedDescription" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zBZ6B--sEduH59KSHV8vgA" annotatedElement="_zBZ6Bu-sEduH59KSHV8vgA">
-          <body>A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. </body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ6CO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ6Ce-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zBZ6Cu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zBZ6C--sEduH59KSHV8vgA" memberEnd="_y7vXB--sEduH59KSHV8vgA _zBZ6De-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zBZ6DO-sEduH59KSHV8vgA" annotatedElement="_zBZ6C--sEduH59KSHV8vgA">
-        <body>List the steps that have been selected to be performed for the instance of the Task Descriptor.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zBZ6De-sEduH59KSHV8vgA" name="_taskDescriptor" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" isUnique="false" association="_zBZ6C--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zBZ6Du-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zBZ6D--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zDpVe--sEduH59KSHV8vgA" name="ProcessComponentDescriptor">
-      <ownedComment xmi:id="_zDpVfO-sEduH59KSHV8vgA" annotatedElement="_zDpVe--sEduH59KSHV8vgA">
-        <body>A Process Component Descriptor represents a Process Component application in a Process, i.e. the breakdown structure defining the Process.  The Process Component Descriptor is used to encapsulate the details of the component in a breakdown structure and to provide its own set of relationships such as it own predecessors and successors.</body>
-      </ownedComment>
-      <generalization xmi:id="_zDpVfe-sEduH59KSHV8vgA" general="_y7vW2u-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zDpVfu-sEduH59KSHV8vgA" name="_processComponent" visibility="public" type="_zDpVcO-sEduH59KSHV8vgA" isUnique="false" association="_zDpVn--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVf--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVgO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zDpVge-sEduH59KSHV8vgA" name="ProcessComponentInterface">
-      <ownedComment xmi:id="_zDpVgu-sEduH59KSHV8vgA" annotatedElement="_zDpVge-sEduH59KSHV8vgA">
-        <body>A Process Component Interface comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.</body>
-      </ownedComment>
-      <generalization xmi:id="_zDpVg--sEduH59KSHV8vgA" general="_y7vWvO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zDpVhO-sEduH59KSHV8vgA" name="interfaceSpecifications" visibility="public" type="_y7vW6--sEduH59KSHV8vgA" aggregation="composite" association="_zDpVle-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVhe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVhu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zDpVh--sEduH59KSHV8vgA" name="interfaceIO" visibility="public" type="_y7vXCu-sEduH59KSHV8vgA" aggregation="composite" association="_zDpVmu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpViO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVie-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zDpVkO-sEduH59KSHV8vgA" memberEnd="_zDpVku-sEduH59KSHV8vgA _zDpVde-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zDpVke-sEduH59KSHV8vgA" annotatedElement="_zDpVkO-sEduH59KSHV8vgA">
-        <body>This association describes the realization relationships between a Process Component and a Process Component Interface.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zDpVku-sEduH59KSHV8vgA" name="realizedBy" visibility="public" type="_zDpVcO-sEduH59KSHV8vgA" association="_zDpVkO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVk--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVlO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zDpVle-sEduH59KSHV8vgA" memberEnd="_zDpVl--sEduH59KSHV8vgA _zDpVhO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zDpVlu-sEduH59KSHV8vgA" annotatedElement="_zDpVle-sEduH59KSHV8vgA">
-        <body>Instances of this association contain the list of Task Descriptors that represent a Process Component Interface.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zDpVl--sEduH59KSHV8vgA" name="_processComponentInterface" visibility="private" type="_zDpVge-sEduH59KSHV8vgA" isUnique="false" association="_zDpVle-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVmO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVme-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zDpVmu-sEduH59KSHV8vgA" memberEnd="_zDpVh--sEduH59KSHV8vgA _zDpVnO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zDpVm--sEduH59KSHV8vgA" annotatedElement="_zDpVmu-sEduH59KSHV8vgA">
-        <body>This association contains the input and output Work Product type instances used for the interface specification.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zDpVnO-sEduH59KSHV8vgA" name="_processComponentInterface" visibility="public" type="_zDpVge-sEduH59KSHV8vgA" isUnique="false" association="_zDpVmu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVne-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVnu-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zDpVn--sEduH59KSHV8vgA" memberEnd="_zDpVfu-sEduH59KSHV8vgA _zDpVoe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zDpVoO-sEduH59KSHV8vgA" annotatedElement="_zDpVn--sEduH59KSHV8vgA">
-        <body>This association represents the reference from the descriptor to the Process Component it refers to.  A Process Component Descriptor represents exactly one Process Component.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zDpVoe-sEduH59KSHV8vgA" name="_processComponentDescriptor" visibility="public" type="_zDpVe--sEduH59KSHV8vgA" isUnique="false" association="_zDpVn--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVou-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVo--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zDpVpO-sEduH59KSHV8vgA" memberEnd="_zDpVeO-sEduH59KSHV8vgA _zDpVpu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zDpVpe-sEduH59KSHV8vgA" annotatedElement="_zDpVpO-sEduH59KSHV8vgA">
-        <body>A Process Component contains only exactly one Process.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zDpVpu-sEduH59KSHV8vgA" name="_processComponent" visibility="public" type="_zDpVcO-sEduH59KSHV8vgA" isUnique="false" association="_zDpVpO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVp--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVqO-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zDpVqe-sEduH59KSHV8vgA" memberEnd="_zDpVje-sEduH59KSHV8vgA _zDpVq--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zDpVqu-sEduH59KSHV8vgA" annotatedElement="_zDpVqe-sEduH59KSHV8vgA">
-        <body>A Process Package contains Process Elements which are used to define Breakdown and Processes.  A Process Element instance can be part of only one Process Package instance.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zDpVq--sEduH59KSHV8vgA" name="_processPackage" visibility="public" type="_zDpViu-sEduH59KSHV8vgA" isUnique="false" association="_zDpVqe-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxw7VO-sEduH59KSHV8vgA" name="ContentElement" isAbstract="true">
-      <ownedComment xmi:id="_yxw7Ve-sEduH59KSHV8vgA" annotatedElement="_yxw7VO-sEduH59KSHV8vgA">
-        <body>Content Element is a Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
-Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_yz_v5u-sEduH59KSHV8vgA" annotatedElement="_yxw7VO-sEduH59KSHV8vgA">
-        <body>This is the Guidance Types package's extension of Content Element (defined in Content Elements) providing additonal associations.</body>
-      </ownedComment>
-      <ownedComment xmi:id="_zGLFDO-sEduH59KSHV8vgA" annotatedElement="_yxw7VO-sEduH59KSHV8vgA">
-        <body>Content Element in the package Method Plugin inherits from Variability Element and not directly from Method Element anymore.  This is achieved using UML 2.0 package merge semantics.  Only if an adopter of this meta-model decides to realize Method Plugins, he would get the variability and extension capabilities for all Content Elements.
-Content Element inherits the semantics of Variability Element.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_yxw7Vu-sEduH59KSHV8vgA" general="_yxw7eu-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_zGLFDe-sEduH59KSHV8vgA" general="_zGLFJO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yz_v5--sEduH59KSHV8vgA" name="supportingMaterials" visibility="public" type="_yz1-8--sEduH59KSHV8vgA" association="_yz_wAu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v6O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v6e-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v6u-sEduH59KSHV8vgA" name="conceptsAndPapers" visibility="public" type="_yz1-4e-sEduH59KSHV8vgA" association="_yz_wB--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v6--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v7O-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v7e-sEduH59KSHV8vgA" name="checklists" visibility="public" type="_yz1-5O-sEduH59KSHV8vgA" association="_yz_wDO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v7u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v7--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v8O-sEduH59KSHV8vgA" name="guidelines" visibility="public" type="_yz1-6u-sEduH59KSHV8vgA" association="_yz_wEe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v8e-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v8u-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v8--sEduH59KSHV8vgA" name="examples" visibility="public" type="_yz1-5--sEduH59KSHV8vgA" association="_yz_wG--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v9O-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v9e-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v9u-sEduH59KSHV8vgA" name="assets" visibility="public" type="_yz_v_O-sEduH59KSHV8vgA" association="_y0Jg5e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v9--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v-O-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yz_v-e-sEduH59KSHV8vgA" name="termDefinition" visibility="public" type="_yz1-_O-sEduH59KSHV8vgA" association="_y0Jg9u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yz_v-u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yz_v---sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxw7Qe-sEduH59KSHV8vgA" name="MethodElement" isAbstract="true">
-      <ownedComment xmi:id="_yxw7Qu-sEduH59KSHV8vgA" annotatedElement="_yxw7Qe-sEduH59KSHV8vgA">
-        <body>Every class defined in this specification is derived from Method Element.  In other words Method Element is the root generalization for all UMA classes and defines a common set of attributes inherited by every other element type of this model.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.  Method Element inherits the Name attribute from Packageable Element's super class.  Every element defined as a UMA instance is derived from Model Element.  Every Method Element in-stance is at least defined by a unique id, a name, as well as brief description.</body>
-      </ownedComment>
-      <ownedComment xmi:id="_zGLFDu-sEduH59KSHV8vgA" annotatedElement="_yxw7Qe-sEduH59KSHV8vgA">
-        <body>Method Element in the package Method Plugin adds additional properties via package merge to Method Element defined in Method Core needed for the variability and extensibility capabilities introduces in this package.</body>
-      </ownedComment>
-      <generalization xmi:id="_yxw7Q--sEduH59KSHV8vgA" general="_yxKfFu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yxw7RO-sEduH59KSHV8vgA" name="guid" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_yxw7Re-sEduH59KSHV8vgA" annotatedElement="_yxw7RO-sEduH59KSHV8vgA">
-          <body>Every instance of Method Element has a global unique id.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7Ru-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7R--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7SO-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yxw7Se-sEduH59KSHV8vgA" name="briefDescription" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_yxw7Su-sEduH59KSHV8vgA" annotatedElement="_yxw7Se-sEduH59KSHV8vgA">
-          <body>Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7S--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7TO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7Te-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yxw7Tu-sEduH59KSHV8vgA" name="ownedRules" visibility="public" type="_yxw7cu-sEduH59KSHV8vgA" aggregation="composite" association="_yxw7jO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7T--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7UO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yxw7Ue-sEduH59KSHV8vgA" name="methodElementProperty" visibility="public" type="_yxw7hu-sEduH59KSHV8vgA" aggregation="composite" association="_yx6FMO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7Uu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7U--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zGLFD--sEduH59KSHV8vgA" name="suppressed" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zGLFEO-sEduH59KSHV8vgA" annotatedElement="_zGLFD--sEduH59KSHV8vgA">
-          <body>If a Variability Element is derived from another Variability Element using the Extends Variability Specialization then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_zGLFEe-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>false</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zGLFEu-sEduH59KSHV8vgA" name="orderingGuide" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zGLFE--sEduH59KSHV8vgA" annotatedElement="_zGLFEu-sEduH59KSHV8vgA">
-          <body>This attribute is used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGLFFO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGLFFe-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zGLFFu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Enumeration" xmi:id="_zGLFF--sEduH59KSHV8vgA" name="VariabilityType">
-      <ownedComment xmi:id="_zGLFGO-sEduH59KSHV8vgA" annotatedElement="_zGLFF--sEduH59KSHV8vgA">
-        <body>Variability Type is an Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.</body>
-      </ownedComment>
-      <ownedLiteral xmi:id="_zGLFGe-sEduH59KSHV8vgA" name="na">
-        <ownedComment xmi:id="_zGLFGu-sEduH59KSHV8vgA" annotatedElement="_zGLFGe-sEduH59KSHV8vgA">
-          <body>This is the default &quot;not assigned&quot; value of a Variabillity Element's variabilityType attribute which is set in the case no variability association is present between the Variability Element and other Variability Elements.
-</body>
-        </ownedComment>
-      </ownedLiteral>
-      <ownedLiteral xmi:id="_zGLFG--sEduH59KSHV8vgA" name="contributes">
-        <ownedComment xmi:id="_zGLFHO-sEduH59KSHV8vgA" annotatedElement="_zGLFG--sEduH59KSHV8vgA">
-          <body>Contributes provides a way for instances of Variability Elements to contribute their properties into their base Variability Element without directly altering any of its existing properties, i.e. in an additive fashion.  Properties contributed are: attribute values and association instances.  The effect after interpretation of contribution is that the base Variability Element is logically replaced with an augmented variant of the element that combines attribute values and association instances.  The way this combination is realized depends on the type of the attribute or association.  For example, String attributes are concatenated resolving embedded commands for dependent text or merging text fragments (e.g. descriptions for content elements).  Additional elements in to-many associations are added (e.g. additional Guidance elements or Task Descriptors of an Activity).  Different elements in to-one associations are ignored (e.g. the one Primary Performer of a Task).  Multiple Content Elements can contribute to the same base element and all of these contributions properties are added to the base in the same fashion. The following table provides the detailed list of interpretation rules:
-attribute values:	String values from the special Variability Element are concatenated with values from the based-on Variability Element.  Other values from the special Variability Element of any other type such as Integer, Date are ignored.
-The identifying attributes guid and name of Method Element are exempt from this rule and will not be modified.
-0..1-association instances:	The one association instance of the based-on Variability Element is kept and any association from the contributing special Variability Element is ignored.
-0..n-association instances:	Association instances of the special Variability Element are added to the already existing association instances of the based-on element.  If both Variability Elements refer to the same object then only one instance of the association will remain.
-</body>
-        </ownedComment>
-      </ownedLiteral>
-      <ownedLiteral xmi:id="_zGLFHe-sEduH59KSHV8vgA" name="extends">
-        <ownedComment xmi:id="_zGLFHu-sEduH59KSHV8vgA" annotatedElement="_zGLFHe-sEduH59KSHV8vgA">
-          <body>Extension allows Method Plugins to easily reuse elements from a Base Plugin by providing a kind of inheritance for the special Variability Element.  Attribute values and Association instances are inherited from the based-on Variability Element to the special Variability Element.  The result of interpretation is that the special element has the same properties as the based-on has, but might define its own additions.  Hence extends is not used to modify content of the base Plugin, but to provide the ability for the extending Plugin to define its own content which is a variant of content already defined (e.g. a special version of a generic Review Record for a specific type of review).  The effect of this is that the base Variability Element and any number of extending Variability Elements can be used side by side, but refer to each other via the extends relationship.  Extends also provides the key mechanism for binding Capability Patterns to Processes: A pattern is applied by defining an extends relationships from an Activity of the applying Processes to the Pattern.  The Activity inherits associations instances from the pattern and the pattern appears to be part of the resulting Process after Interpretation.
-attribute values:	Values from the based-on Variability element are inherited and used to populate the special Variability Elements attributes.  If the special element attributes are already populated the inherited values are ignored.  
-The identifying attributes guid and name of Method Element are exempt from this rule and will not be modified.
-0..1-association instances:	The one association instance of the based-on Variability Element is inherited to the special Variability Element.  If the special Variability Element defines its own association instance then the inherited one is ignored.
-0..n-association instances:	Association instances defined for the based-on Variability Element are inherited to the special Variability Element.  The special element can add additional association instances.
-
-</body>
-        </ownedComment>
-      </ownedLiteral>
-      <ownedLiteral xmi:id="_zGLFH--sEduH59KSHV8vgA" name="replaces">
-        <ownedComment xmi:id="_zGLFIO-sEduH59KSHV8vgA" annotatedElement="_zGLFH--sEduH59KSHV8vgA">
-          <body>Replaces provides a way for Variability Elements to replace a base Variability Element without directly changing any of its existing properties.  This is in most cases used for Method Plugins that aim to replace specific Content Elements such as Roles, Task, or Activities with either a complete new variant or to change fundamental relationships of these elements (e.g. Role-Artifact responsibility).  Properties replaced are attribute values and association instances.  The effect of this is that the base Content Element is logically replaced with this new variant of the element to which all incoming associations still point as before, but which has potentially new attribute values and outgoing association properties.  This provides a very powerful mechanism to replace, for example, whole Activities in a Process with complete new realizations of the Activity.  For instance, replacing an Activity doing use case-based design with an activity doing agile code-centric development doing the same work using a different development technique utilizing different Roles, Tasks, etc.  Another example, would be to replace an Activity that describes database design for an RDBMS with an Activity that describes database design for an OODBMS.  A Variability Element can only be replaced by one other element at a time.  For example, if two Method Plugins replace the same element only one Method Plugin can be used for interpretation (see concept of Method Configuration for more details on how to resolve such conflicts, Section 7.1.2).  The following table provides the detailed list of interpretation rules:
-attribute values:	Values from the special Variability Element are replaced with values from the based-on Variability Element including unassigned values.
-The identifying attributes guid and name of Method Element are exempt from this rule and will not be modified.
-0..1-association instances:	The one association instance of the based-on Variability Element is replaced with the association instance from the replacing special Variability Element.  If the special Variability Element does not have an association instance then resulting element will also not have an association.
-0..n-association instances:	Association instances of the special Variability Element replace all association instances of the based-on Variability Element.
-
-</body>
-        </ownedComment>
-      </ownedLiteral>
-      <ownedLiteral xmi:id="_zGLFIe-sEduH59KSHV8vgA" name="localContribution"/>
-      <ownedLiteral xmi:id="_zGLFIu-sEduH59KSHV8vgA" name="localReplacement"/>
-      <ownedLiteral xmi:id="_zGLFI--sEduH59KSHV8vgA" name="extendsReplaces"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zGLFJO-sEduH59KSHV8vgA" name="VariabilityElement" isAbstract="true">
-      <ownedComment xmi:id="_zGLFJe-sEduH59KSHV8vgA" annotatedElement="_zGLFJO-sEduH59KSHV8vgA">
-        <body>Variability Element is an abstract class derived from Method Element that provides new capabilities for content variation and extension to Content Elements or any other Method Element that derives from it.  It has been placed in-between the classes Method Element and Content Element in the overall UMA taxonomy of classes using the UML 2.0 package merge mechanism.  The association Variability Specialization shall only be instantiated between two subclasses of Variability Element of the same type.  The element on varaibilitySpecialElement side of the relationship defines a value for the attribute variabilityType defining the nature of the relationship using a literal from the enumeration Variability Type.
-Variability Element of the meta-model package Method Plugins adds the capabilities of variation and extension to Method Elements that derive from it.  By default all Content Elements such as Role, Task, Guidance Types, or Activities are defined to be Variability Elements.
-Variability and extension provides unique mechanisms for customizing method content without actually directly modifying the original content, but by just be able to describe with separate objects the differences (additions, changes, omissions) relative to the original.  This plug-in concept allows users to factor their method content and processes in interrelated units and even to architect method content and processes in layers that extend each other with new capabilities.  The resulting method and process design can be dynamically combined and applied on demand using the interpretation rules defined for Variability Element Specializations assembling to process practitioners the most accurate method and process descriptions possible.  It also allows process practitioners to extends and tailor method content and processes they do not own and to easily upgrade to newer versions by simply reapply their personal changes to these upgrades.
-Variability Element defines two types of variability and one type of extension which are formally defined for the enumeration Variability Type.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_zGLFJu-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zGLFJ--sEduH59KSHV8vgA" name="variabilityType" visibility="public" type="_zGLFF--sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zGLFKO-sEduH59KSHV8vgA" annotatedElement="_zGLFJ--sEduH59KSHV8vgA">
-          <body>If in instance of the variabilitySpecialization association between two Variability Elements of the same type exists, then the variabilityType attribute specifies how the element at the variabilitySpecialElement end of the association changes the Content Element at the variabilityBasedOnElement end. See the Variability Type enumeration class for definitions for the different types of variability.</body>
-        </ownedComment>
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_zGLFKe-sEduH59KSHV8vgA">
-          <body>na</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zGLFKu-sEduH59KSHV8vgA" name="variabilityBasedOnElement" visibility="public" type="_zGLFJO-sEduH59KSHV8vgA" association="_zGU2Cu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGLFK--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGLFLO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxw7Yu-sEduH59KSHV8vgA" name="Section">
-      <ownedComment xmi:id="_yxw7Y--sEduH59KSHV8vgA" annotatedElement="_yxw7Yu-sEduH59KSHV8vgA">
-        <body>A Section is a special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.</body>
-      </ownedComment>
-      <ownedComment xmi:id="_zGLFLe-sEduH59KSHV8vgA" annotatedElement="_yxw7Yu-sEduH59KSHV8vgA">
-        <body>Section in the package Method Plugin inherits from Variability Element and extends Section defined in Method Core :: Basic Elements with new capabilities for variability. 
-For example, when a Task contributes to another Task its Presentation association is contributed including its Sections (i.e. its Steps), which are modeled as parts of the Content Description instance.  Sections can be nested and therefore Task Descriptions can be flexibly organized in Steps with sub-Steps.  Sections are Variability Elements themselves, so they can contribute to each other.  For example, one could model a Task step as a Section instance without relating it to a Task Description that directly contributes to (or replaces) another Section which is part of a Task Description.  This contribution (or replacement) would add new description text to the original step description (or replace the original step description).  Another example would be to contribute new Check List items organized as Sections to an existing Check List (defined as guidance).  
-
-</body>
-      </ownedComment>
-      <generalization xmi:id="_zGLFLu-sEduH59KSHV8vgA" general="_zGLFJO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yxw7Ze-sEduH59KSHV8vgA" name="sectionName" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_yxw7Zu-sEduH59KSHV8vgA" annotatedElement="_yxw7Ze-sEduH59KSHV8vgA">
-          <body>Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7Z--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7aO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7ae-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yxw7au-sEduH59KSHV8vgA" name="sectionDescription" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_yxw7a--sEduH59KSHV8vgA" annotatedElement="_yxw7au-sEduH59KSHV8vgA">
-          <body>This attributes store the description text for a Content Description's Section.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7bO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7be-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7bu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yxw7b--sEduH59KSHV8vgA" name="subSections" visibility="public" type="_yxw7Yu-sEduH59KSHV8vgA" aggregation="composite" association="_yxw7lO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7cO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7ce-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zGLFL--sEduH59KSHV8vgA" name="predecessor" visibility="public" type="_yxw7Yu-sEduH59KSHV8vgA" association="_zGU2D--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGLFMO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGLFMe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y7mMsO-sEduH59KSHV8vgA" name="Activity">
-      <ownedComment xmi:id="_y7mMse-sEduH59KSHV8vgA" annotatedElement="_y7mMsO-sEduH59KSHV8vgA">
-        <body>An Activity is a Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
-Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_y-4KSO-sEduH59KSHV8vgA" annotatedElement="_y7mMsO-sEduH59KSHV8vgA">
-        <body>This definition of Activity extends Activity introduced in the package Breakdown with new capabilities and is the basis for the definition of the class Process.
-Extends Activity with an association to Roadmap.  This definition of Activity also participates in the extension of the Discipline category.
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_zGLFMu-sEduH59KSHV8vgA" annotatedElement="_y7mMsO-sEduH59KSHV8vgA">
-        <body>Activity in the package Method Plugin inherits from Variability Element to extend Activity with new capabilities for variability.&#xD;
-Activity inherits the semantics of Variability Element which provides key mechanism to enable dynamic binding of Capability Patterns in Processes as well as Process Contributions.  Variability is used in the following way for Activities:&#xD;
-- Extend: To apply a Capability Pattern to a process one would create an Activity which extends the pattern's top-level activity.  Through extension the extending Activity inherits the patterns Breakdown Elements.&#xD;
-- Replace: To replace an Activity of an applied Capability Pattern or an existing process for which one develops a Process Contribution (or a combination of both) one would create an Activity and specify the replace variability specialization between them.&#xD;
-- Contribute: To contribute new Breakdown Elements to an existing Activity one would define an Activity with Breakdown Elements that relates via the Contributes Variability Specialization to this existing Activity.  The contributing Activity's Breakdown Elements will be added to the contributed Activity.&#xD;
-&#xD;
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y7mMsu-sEduH59KSHV8vgA" general="_y7vXKe-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_y7mMs--sEduH59KSHV8vgA" general="_yyzdTO-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_zGLFM--sEduH59KSHV8vgA" general="_zGLFJO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y7mMtO-sEduH59KSHV8vgA" name="breakdownElements" visibility="public" type="_y7vWvO-sEduH59KSHV8vgA" association="_y_BURu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y7mMte-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y7mMtu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KSe-sEduH59KSHV8vgA" name="roadmaps" visibility="public" type="_y-4KRe-sEduH59KSHV8vgA" association="_y_BUN--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KSu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KS--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KTO-sEduH59KSHV8vgA" name="supportingMaterials" visibility="public" type="_yz1-8--sEduH59KSHV8vgA" association="_y_BUUe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KTe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KTu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KT--sEduH59KSHV8vgA" name="checklists" visibility="public" type="_yz1-5O-sEduH59KSHV8vgA" association="_y_BUVu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KUO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KUe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KUu-sEduH59KSHV8vgA" name="concepts" visibility="public" type="_yz1-4e-sEduH59KSHV8vgA" association="_y_BUW--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KU--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KVO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KVe-sEduH59KSHV8vgA" name="examples" visibility="public" type="_yz1-5--sEduH59KSHV8vgA" association="_y_BUYO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KVu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KV--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KWO-sEduH59KSHV8vgA" name="guidelines" visibility="public" type="_yz1-6u-sEduH59KSHV8vgA" association="_y_BUZe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KWe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KWu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y-4KW--sEduH59KSHV8vgA" name="reusableAssets" visibility="public" type="_yz_v_O-sEduH59KSHV8vgA" association="_y_BUau-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KXO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KXe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zGU2AO-sEduH59KSHV8vgA" memberEnd="_zGU2Au-sEduH59KSHV8vgA _zGLFBu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zGU2Ae-sEduH59KSHV8vgA" annotatedElement="_zGU2AO-sEduH59KSHV8vgA">
-        <body>This composition association represents that every Method Package (either Content Package, Process Package, or Process Component) is part of exactly one Method Plugin.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zGU2Au-sEduH59KSHV8vgA" name="_methodPlugin" visibility="public" type="_zGLFAO-sEduH59KSHV8vgA" isUnique="false" association="_zGU2AO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGU2A--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGU2BO-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zGU2Be-sEduH59KSHV8vgA" name="Extension" memberEnd="_zGU2B--sEduH59KSHV8vgA _zGLFCe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zGU2Bu-sEduH59KSHV8vgA" annotatedElement="_zGU2Be-sEduH59KSHV8vgA">
-        <body>This association defines how Method Plugins extend many other Method Plugins.  The extending plug-in contains new method elements, extends existing method elements and processes using content element variability mechanisms (e.g. contribution, replace, etc.), provides additional Delivery and Capability Processes for a Method Framework, etc.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zGU2B--sEduH59KSHV8vgA" name="plugins" visibility="public" type="_zGLFAO-sEduH59KSHV8vgA" association="_zGU2Be-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGU2CO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGU2Ce-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zGU2Cu-sEduH59KSHV8vgA" name="variabilitySpecialization" memberEnd="_zGU2DO-sEduH59KSHV8vgA _zGLFKu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zGU2C--sEduH59KSHV8vgA" annotatedElement="_zGU2Cu-sEduH59KSHV8vgA">
-        <body>This 1-to-many association defines in combination with the variabilityType attribute that a number of special Variability Elements of the same type represent a variation of exactly one other Variability Element.  See the Variability Type enumeration class for definitions for the different types of variability.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zGU2DO-sEduH59KSHV8vgA" name="variabilitySpecialElement" visibility="public" type="_zGLFJO-sEduH59KSHV8vgA" association="_zGU2Cu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGU2De-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGU2Du-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zGU2D--sEduH59KSHV8vgA" memberEnd="_zGLFL--sEduH59KSHV8vgA _zGU2Ee-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zGU2EO-sEduH59KSHV8vgA" annotatedElement="_zGU2D--sEduH59KSHV8vgA">
-        <body>This association describes the order in which contributed Sections shall be inserted into an  existing list of Sections maintained for a Content Description.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zGU2Ee-sEduH59KSHV8vgA" name="_section" visibility="public" type="_yxw7Yu-sEduH59KSHV8vgA" isUnique="false" association="_zGU2D--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGU2Eu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGU2E--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWkO-sEduH59KSHV8vgA" name="Point">
-      <ownedAttribute xmi:id="_zJAWke-sEduH59KSHV8vgA" name="x" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWku-sEduH59KSHV8vgA" name="y" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWk--sEduH59KSHV8vgA" name="GraphElement" isAbstract="true">
-      <generalization xmi:id="_zJAWlO-sEduH59KSHV8vgA" general="_zJAWpe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWle-sEduH59KSHV8vgA" name="position" visibility="public" type="_zJAWkO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWlu-sEduH59KSHV8vgA" name="contained" visibility="public" type="_zJAWpe-sEduH59KSHV8vgA" aggregation="composite" association="_zJKH6O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWl--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWmO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWme-sEduH59KSHV8vgA" name="link" visibility="public" type="_zJKHkO-sEduH59KSHV8vgA" aggregation="composite" association="_zJKH7u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWmu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWm--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWnO-sEduH59KSHV8vgA" name="anchorage" visibility="public" type="_zJAWw--sEduH59KSHV8vgA" aggregation="composite" association="_zJKH7--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWne-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWnu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWn--sEduH59KSHV8vgA" name="semanticModel" visibility="public" type="_zJKHqe-sEduH59KSHV8vgA" aggregation="composite" association="_zJKH9u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWoO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWoe-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWou-sEduH59KSHV8vgA" name="Dimension">
-      <ownedAttribute xmi:id="_zJAWo--sEduH59KSHV8vgA" name="width" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWpO-sEduH59KSHV8vgA" name="height" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWpe-sEduH59KSHV8vgA" name="DiagramElement" isAbstract="true">
-      <generalization xmi:id="_zJAWpu-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWp--sEduH59KSHV8vgA" name="isVisible" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_zJAWqO-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>true</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWqe-sEduH59KSHV8vgA" name="container" visibility="public" type="_zJAWk--sEduH59KSHV8vgA" association="_zJKH6O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWqu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWq--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWrO-sEduH59KSHV8vgA" name="reference" visibility="public" type="_zJAWsu-sEduH59KSHV8vgA" association="_zJKH6e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWre-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWru-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWr--sEduH59KSHV8vgA" name="property" visibility="public" type="_zJAWue-sEduH59KSHV8vgA" aggregation="composite" association="_zJKH6u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWsO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWse-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWsu-sEduH59KSHV8vgA" name="Reference">
-      <generalization xmi:id="_zJAWs--sEduH59KSHV8vgA" general="_zJAWpe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWtO-sEduH59KSHV8vgA" name="isIndividualRepresentation" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_zJAWte-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWtu-sEduH59KSHV8vgA" name="referenced" visibility="public" type="_zJAWpe-sEduH59KSHV8vgA" association="_zJKH6e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWt--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWuO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWue-sEduH59KSHV8vgA" name="Property">
-      <generalization xmi:id="_zJAWuu-sEduH59KSHV8vgA" general="_zJAWpe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWu--sEduH59KSHV8vgA" name="key" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWvO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWve-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zJAWvu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWv--sEduH59KSHV8vgA" name="value" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWwO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWwe-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zJAWwu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWw--sEduH59KSHV8vgA" name="GraphConnector">
-      <generalization xmi:id="_zJAWxO-sEduH59KSHV8vgA" general="_zJAWk--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWxe-sEduH59KSHV8vgA" name="graphElement" visibility="public" type="_zJAWk--sEduH59KSHV8vgA" association="_zJKH7--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWxu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWx--sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAWyO-sEduH59KSHV8vgA" name="graphEdge" visibility="public" type="_zJAWy--sEduH59KSHV8vgA" association="_zJKH8O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWye-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWyu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJAWy--sEduH59KSHV8vgA" name="GraphEdge">
-      <generalization xmi:id="_zJAWzO-sEduH59KSHV8vgA" general="_zJAWk--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJAWze-sEduH59KSHV8vgA" name="anchor" visibility="public" type="_zJAWw--sEduH59KSHV8vgA" association="_zJKH8O-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAWzu-sEduH59KSHV8vgA" value="2"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAWz--sEduH59KSHV8vgA" value="2"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJAW0O-sEduH59KSHV8vgA" name="waypoints" visibility="public" type="_zJAWkO-sEduH59KSHV8vgA" aggregation="composite" association="_zJKH8e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJAW0e-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJAW0u-sEduH59KSHV8vgA" value="2"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHkO-sEduH59KSHV8vgA" name="DiagramLink">
-      <generalization xmi:id="_zJKHke-sEduH59KSHV8vgA" general="_zJAWpe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHku-sEduH59KSHV8vgA" name="zoom" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHk--sEduH59KSHV8vgA" name="viewport" visibility="public" type="_zJAWkO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHlO-sEduH59KSHV8vgA" name="graphElement" visibility="public" type="_zJAWk--sEduH59KSHV8vgA" association="_zJKH7u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHle-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHlu-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJKHl--sEduH59KSHV8vgA" name="diagram" visibility="public" type="_zJKHne-sEduH59KSHV8vgA" association="_zJKH9e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHmO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHme-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHmu-sEduH59KSHV8vgA" name="GraphNode">
-      <generalization xmi:id="_zJKHm--sEduH59KSHV8vgA" general="_zJAWk--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHnO-sEduH59KSHV8vgA" name="size" visibility="public" type="_zJAWou-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHne-sEduH59KSHV8vgA" name="Diagram">
-      <generalization xmi:id="_zJKHnu-sEduH59KSHV8vgA" general="_zJKHmu-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHn--sEduH59KSHV8vgA" name="zoom" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHoO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHoe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJKHou-sEduH59KSHV8vgA" name="viewpoint" visibility="public" type="_zJAWkO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHo--sEduH59KSHV8vgA" name="diagramLink" visibility="public" type="_zJKHkO-sEduH59KSHV8vgA" association="_zJKH9e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHpO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHpe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJKHpu-sEduH59KSHV8vgA" name="namespace" visibility="public" type="_zJKHqe-sEduH59KSHV8vgA" aggregation="composite" association="_zJTRgO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHp--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHqO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHqe-sEduH59KSHV8vgA" name="SemanticModelBridge" isAbstract="true">
-      <generalization xmi:id="_zJKHqu-sEduH59KSHV8vgA" general="_zJAWpe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHq--sEduH59KSHV8vgA" name="presentation" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHrO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHre-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zJKHru-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJKHr--sEduH59KSHV8vgA" name="graphElement" visibility="public" type="_zJAWk--sEduH59KSHV8vgA" association="_zJKH9u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHsO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHse-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJKHsu-sEduH59KSHV8vgA" name="diagram" visibility="public" type="_zJKHne-sEduH59KSHV8vgA" association="_zJTRgO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHs--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHtO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHte-sEduH59KSHV8vgA" name="SimpleSemanticModelElement">
-      <generalization xmi:id="_zJKHtu-sEduH59KSHV8vgA" general="_zJKHqe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHt--sEduH59KSHV8vgA" name="typeInfo" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHuO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHue-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zJKHuu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHu--sEduH59KSHV8vgA" name="UMASemanticModelBridge">
-      <generalization xmi:id="_zJKHvO-sEduH59KSHV8vgA" general="_zJKHqe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHve-sEduH59KSHV8vgA" name="element" visibility="public" type="_yxw7Qe-sEduH59KSHV8vgA" association="_zJTRhe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHvu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHv--sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHwO-sEduH59KSHV8vgA" name="CoreSemanticModelBridge">
-      <generalization xmi:id="_zJKHwe-sEduH59KSHV8vgA" general="_zJKHqe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHwu-sEduH59KSHV8vgA" name="element" visibility="public" type="_yxKfDe-sEduH59KSHV8vgA" association="_zJTRge-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHw--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHxO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHxe-sEduH59KSHV8vgA" name="LeafElement" isAbstract="true">
-      <generalization xmi:id="_zJKHxu-sEduH59KSHV8vgA" general="_zJAWpe-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHx--sEduH59KSHV8vgA" name="TextElement">
-      <generalization xmi:id="_zJKHyO-sEduH59KSHV8vgA" general="_zJKHxe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHye-sEduH59KSHV8vgA" name="text" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKHyu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKHy--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zJKHzO-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKHze-sEduH59KSHV8vgA" name="Image">
-      <generalization xmi:id="_zJKHzu-sEduH59KSHV8vgA" general="_zJKHxe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKHz--sEduH59KSHV8vgA" name="uri" visibility="public" type="_yxUPZu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKH0O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKH0e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zJKH0u-sEduH59KSHV8vgA" type="_yxUPZu-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJKH0--sEduH59KSHV8vgA" name="mimeType" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKH1O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKH1e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zJKH1u-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKH1--sEduH59KSHV8vgA" name="GraphicPrimitive" isAbstract="true">
-      <generalization xmi:id="_zJKH2O-sEduH59KSHV8vgA" general="_zJKHxe-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKH2e-sEduH59KSHV8vgA" name="Polyline">
-      <generalization xmi:id="_zJKH2u-sEduH59KSHV8vgA" general="_zJKH1--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKH2--sEduH59KSHV8vgA" name="closed" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_zJKH3O-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>true</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zJKH3e-sEduH59KSHV8vgA" name="waypoints" visibility="public" type="_zJAWkO-sEduH59KSHV8vgA" aggregation="composite" association="_zJTRie-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKH3u-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKH3--sEduH59KSHV8vgA" value="2"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zJKH4O-sEduH59KSHV8vgA" name="Ellipse">
-      <generalization xmi:id="_zJKH4e-sEduH59KSHV8vgA" general="_zJKH1--sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKH4u-sEduH59KSHV8vgA" name="center" visibility="public" type="_zJAWkO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKH4--sEduH59KSHV8vgA" name="radiusX" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKH5O-sEduH59KSHV8vgA" name="radiusY" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKH5e-sEduH59KSHV8vgA" name="rotation" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKH5u-sEduH59KSHV8vgA" name="startAngle" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zJKH5--sEduH59KSHV8vgA" name="endAngle" visibility="public" type="_yxUPcO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH6O-sEduH59KSHV8vgA" memberEnd="_zJAWlu-sEduH59KSHV8vgA _zJAWqe-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH6e-sEduH59KSHV8vgA" memberEnd="_zJAWtu-sEduH59KSHV8vgA _zJAWrO-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH6u-sEduH59KSHV8vgA" memberEnd="_zJAWr--sEduH59KSHV8vgA _zJKH6--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zJKH6--sEduH59KSHV8vgA" name="_diagramElement" visibility="public" type="_zJAWpe-sEduH59KSHV8vgA" isUnique="false" association="_zJKH6u-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKH7O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKH7e-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH7u-sEduH59KSHV8vgA" memberEnd="_zJAWme-sEduH59KSHV8vgA _zJKHlO-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH7--sEduH59KSHV8vgA" memberEnd="_zJAWnO-sEduH59KSHV8vgA _zJAWxe-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH8O-sEduH59KSHV8vgA" memberEnd="_zJAWyO-sEduH59KSHV8vgA _zJAWze-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH8e-sEduH59KSHV8vgA" memberEnd="_zJAW0O-sEduH59KSHV8vgA _zJKH8u-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zJKH8u-sEduH59KSHV8vgA" name="_graphEdge" visibility="public" type="_zJAWy--sEduH59KSHV8vgA" isUnique="false" association="_zJKH8e-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJKH8--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJKH9O-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH9e-sEduH59KSHV8vgA" memberEnd="_zJKHo--sEduH59KSHV8vgA _zJKHl--sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJKH9u-sEduH59KSHV8vgA" memberEnd="_zJAWn--sEduH59KSHV8vgA _zJKHr--sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJTRgO-sEduH59KSHV8vgA" memberEnd="_zJKHpu-sEduH59KSHV8vgA _zJKHsu-sEduH59KSHV8vgA"/>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJTRge-sEduH59KSHV8vgA" memberEnd="_zJKHwu-sEduH59KSHV8vgA _zJTRgu-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zJTRgu-sEduH59KSHV8vgA" name="_coreSemanticModelBridge" visibility="public" type="_zJKHwO-sEduH59KSHV8vgA" isUnique="false" association="_zJTRge-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJTRg--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJTRhO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJTRhe-sEduH59KSHV8vgA" memberEnd="_zJKHve-sEduH59KSHV8vgA _zJTRhu-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zJTRhu-sEduH59KSHV8vgA" name="_uMASemanticModelBridge" visibility="public" type="_zJKHu--sEduH59KSHV8vgA" isUnique="false" association="_zJTRhe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJTRh--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJTRiO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zJTRie-sEduH59KSHV8vgA" memberEnd="_zJKH3e-sEduH59KSHV8vgA _zJTRiu-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zJTRiu-sEduH59KSHV8vgA" name="_polyline" visibility="public" type="_zJKH2e-sEduH59KSHV8vgA" isUnique="false" association="_zJTRie-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zJTRi--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zJTRjO-sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zDpViu-sEduH59KSHV8vgA" name="ProcessPackage">
-      <ownedComment xmi:id="_zDpVi--sEduH59KSHV8vgA" annotatedElement="_zDpViu-sEduH59KSHV8vgA">
-        <body>Process Package is a special Method Package that contains Process Elements, only.
-A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_zDpVjO-sEduH59KSHV8vgA" general="_y4eAMe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zDpVje-sEduH59KSHV8vgA" name="processElements" visibility="public" type="_y7vXOO-sEduH59KSHV8vgA" aggregation="composite" association="_zDpVqe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVju-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVj--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zLitMO-sEduH59KSHV8vgA" name="diagrams" visibility="public" type="_zJKHne-sEduH59KSHV8vgA" aggregation="composite" association="_zLitM--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zLitMe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zLitMu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zLitM--sEduH59KSHV8vgA" memberEnd="_zLitMO-sEduH59KSHV8vgA _zLitNe-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zLitNO-sEduH59KSHV8vgA" annotatedElement="_zLitM--sEduH59KSHV8vgA">
-        <body>This association is the only member of the umadiagrams package.  It defines that Diagrams can be packaged in Process Packages.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zLitNe-sEduH59KSHV8vgA" name="_processPackage" visibility="public" type="_zDpViu-sEduH59KSHV8vgA" isUnique="false" association="_zLitM--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zLitNu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zLitN--sEduH59KSHV8vgA" value="1"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zGLFAO-sEduH59KSHV8vgA" name="MethodPlugin">
-      <ownedComment xmi:id="_zGLFAe-sEduH59KSHV8vgA" annotatedElement="_zGLFAO-sEduH59KSHV8vgA">
-        <body>A Method Plugin is a Method Element that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_zGLFA--sEduH59KSHV8vgA" general="_yxUPVO-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_zN7S0O-sEduH59KSHV8vgA" general="_zN7S0u-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zGLFBO-sEduH59KSHV8vgA" name="userChangeable" visibility="public" type="_yxUPbu-sEduH59KSHV8vgA">
-        <defaultValue xmi:type="uml:OpaqueExpression" xmi:id="_zGLFBe-sEduH59KSHV8vgA" type="_yxUPbu-sEduH59KSHV8vgA">
-          <body>true</body>
-        </defaultValue>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zGLFBu-sEduH59KSHV8vgA" name="methodPackages" visibility="public" type="_y4eAMe-sEduH59KSHV8vgA" aggregation="composite" association="_zGU2AO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGLFB--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGLFCO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zGLFCe-sEduH59KSHV8vgA" name="bases" visibility="public" type="_zGLFAO-sEduH59KSHV8vgA" association="_zGU2Be-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zGLFCu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zGLFC--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zDpVcO-sEduH59KSHV8vgA" name="ProcessComponent">
-      <ownedComment xmi:id="_zDpVce-sEduH59KSHV8vgA" annotatedElement="_zDpVcO-sEduH59KSHV8vgA">
-        <body>A Process Component is a special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
-UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a &quot;black box&quot;.  At any point during a project the component &quot;realization&quot; detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_zDpVcu-sEduH59KSHV8vgA" general="_zDpViu-sEduH59KSHV8vgA">
-        <eAnnotations xmi:id="_zDpVc--sEduH59KSHV8vgA" source="http://www.eclipse.org/uml2/2.0.0/UML">
-          <details xmi:id="_zDpVdO-sEduH59KSHV8vgA" key="extend"/>
-        </eAnnotations>
-      </generalization>
-      <generalization xmi:id="_zN7S0e-sEduH59KSHV8vgA" general="_zN7S0u-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zDpVde-sEduH59KSHV8vgA" name="interfaces" visibility="public" type="_zDpVge-sEduH59KSHV8vgA" association="_zDpVkO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVdu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVd--sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zDpVeO-sEduH59KSHV8vgA" name="process" visibility="public" type="_y-4KOe-sEduH59KSHV8vgA" aggregation="composite" association="_zDpVpO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zDpVee-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zDpVeu-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zN7S0u-sEduH59KSHV8vgA" name="MethodUnit" isAbstract="true">
-      <ownedComment xmi:id="_zN7S0--sEduH59KSHV8vgA" annotatedElement="_zN7S0u-sEduH59KSHV8vgA">
-        <body>A Method Unit is a special Method Element that shall be maintained in a Method Library as a separate unit of control.</body>
-      </ownedComment>
-      <generalization xmi:id="_zN7S1O-sEduH59KSHV8vgA" general="_yxw7Qe-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zN7S1e-sEduH59KSHV8vgA" name="authors" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zN7S1u-sEduH59KSHV8vgA" annotatedElement="_zN7S1e-sEduH59KSHV8vgA">
-          <body>Every Method Unit is being created and owned by an author or authoring team.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zN7S1--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zN7S2O-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zN7S2e-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zN7S2u-sEduH59KSHV8vgA" name="changeDate" visibility="public" type="_yxUPZO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zN7S2--sEduH59KSHV8vgA" annotatedElement="_zN7S2u-sEduH59KSHV8vgA">
-          <body>The date the last change that resulted into this version has been made.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zN7S3O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zN7S3e-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zN7S3u-sEduH59KSHV8vgA" name="changeDescription" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zN7S3--sEduH59KSHV8vgA" annotatedElement="_zN7S3u-sEduH59KSHV8vgA">
-          <body>The description of the last change that resulted into this version.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zN7S4O-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zN7S4e-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zN7S4u-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zN7S4--sEduH59KSHV8vgA" name="version" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_zN7S5O-sEduH59KSHV8vgA" annotatedElement="_zN7S4--sEduH59KSHV8vgA">
-          <body>Every Package has a version number used to track changes.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zN7S5e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zN7S5u-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_zN7S5--sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zN7S6O-sEduH59KSHV8vgA" name="copyrightStatement" visibility="public" type="_yz1-8--sEduH59KSHV8vgA" association="_zOEcwe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zN7S6e-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zN7S6u-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_yxw7V--sEduH59KSHV8vgA" name="ContentDescription">
-      <ownedComment xmi:id="_yxw7WO-sEduH59KSHV8vgA" annotatedElement="_yxw7V--sEduH59KSHV8vgA">
-        <body>Content Description is a Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. </body>
-      </ownedComment>
-      <generalization xmi:id="_zOEcwO-sEduH59KSHV8vgA" general="_zN7S0u-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_yxw7Wu-sEduH59KSHV8vgA" name="mainDescription" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_yxw7W--sEduH59KSHV8vgA" annotatedElement="_yxw7Wu-sEduH59KSHV8vgA">
-          <body>This attribute store the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7XO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7Xe-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_yxw7Xu-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_yxw7X--sEduH59KSHV8vgA" name="sections" visibility="public" type="_yxw7Yu-sEduH59KSHV8vgA" aggregation="composite" association="_yxw7j--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_yxw7YO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_yxw7Ye-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDMO-sEduH59KSHV8vgA" name="externalId" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDMe-sEduH59KSHV8vgA" annotatedElement="_y1MDMO-sEduH59KSHV8vgA">
-          <body>An external visible number that is used to reference this artifact. Used like a synonym.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDMu-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDM--sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDNO-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_y1MDNe-sEduH59KSHV8vgA" name="keyConsiderations" visibility="public" type="_yxUPaO-sEduH59KSHV8vgA">
-        <ownedComment xmi:id="_y1MDNu-sEduH59KSHV8vgA" annotatedElement="_y1MDNe-sEduH59KSHV8vgA">
-          <body>Key Considerations provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.</body>
-        </ownedComment>
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y1MDN--sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y1MDOO-sEduH59KSHV8vgA"/>
-        <defaultValue xmi:type="uml:LiteralString" xmi:id="_y1MDOe-sEduH59KSHV8vgA" type="_yxUPaO-sEduH59KSHV8vgA" value=""/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zOEcwe-sEduH59KSHV8vgA" memberEnd="_zN7S6O-sEduH59KSHV8vgA _zOEcw--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zOEcwu-sEduH59KSHV8vgA" annotatedElement="_zOEcwe-sEduH59KSHV8vgA">
-        <body>A Method Unit can have exactly one Copyright Statement securing the intellectual capital it represents.  It will be published with the respective concrete Element.  Note, that Copyright Statements for Method Libraries and Method Plugins define the default statement for its contained elements, which can be 'overwritten' with revised statements for every Content Description or Process Component.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zOEcw--sEduH59KSHV8vgA" name="_methodUnit" visibility="public" type="_zN7S0u-sEduH59KSHV8vgA" association="_zOEcwe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zOEcxO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zOEcxe-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zQdCYO-sEduH59KSHV8vgA" name="MethodConfiguration">
-      <ownedComment xmi:id="_zQdCYe-sEduH59KSHV8vgA" annotatedElement="_zQdCYO-sEduH59KSHV8vgA">
-        <body>A Method Configuration is a collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</body>
-      </ownedComment>
-      <generalization xmi:id="_zQdCYu-sEduH59KSHV8vgA" general="_zN7S0u-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zQdCY--sEduH59KSHV8vgA" name="methodPluginSelection" visibility="public" type="_zGLFAO-sEduH59KSHV8vgA" association="_zQmzbu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCZO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCZe-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQdCZu-sEduH59KSHV8vgA" name="methodPackageSelection" visibility="public" type="_y4eAMe-sEduH59KSHV8vgA" association="_zQmzc--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCZ--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCaO-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQdCae-sEduH59KSHV8vgA" name="processViews" visibility="public" type="_y2Oknu-sEduH59KSHV8vgA" association="_zQmzje-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCau-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCa--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQdCbO-sEduH59KSHV8vgA" name="defaultView" visibility="public" type="_y2Oknu-sEduH59KSHV8vgA" association="_zQmzke-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCbe-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCbu-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQdCb--sEduH59KSHV8vgA" name="baseConfigurations" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" association="_zQmzle-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCcO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCce-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQdCcu-sEduH59KSHV8vgA" name="subtractedCategory" visibility="public" type="_y2Oknu-sEduH59KSHV8vgA" association="_zQmzmu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCc--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCdO-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQdCde-sEduH59KSHV8vgA" name="addedCategory" visibility="public" type="_y2Oknu-sEduH59KSHV8vgA" association="_zQmznu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCdu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCd--sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zQdCeO-sEduH59KSHV8vgA" name="ProcessFamily">
-      <ownedComment xmi:id="_zQdCee-sEduH59KSHV8vgA" annotatedElement="_zQdCeO-sEduH59KSHV8vgA">
-        <body>A Delivery Model Family is a convenient grouping of Delivery Processes and Capability Patterns of interest to some specific user community.</body>
-      </ownedComment>
-      <generalization xmi:id="_zQdCeu-sEduH59KSHV8vgA" general="_zQdCYO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zQdCe--sEduH59KSHV8vgA" name="deliveryProcesses" visibility="public" type="_y-4KMO-sEduH59KSHV8vgA" association="_zQmzeO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCfO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCfe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_y-4KOe-sEduH59KSHV8vgA" name="Process" isAbstract="true">
-      <ownedComment xmi:id="_y-4KOu-sEduH59KSHV8vgA" annotatedElement="_y-4KOe-sEduH59KSHV8vgA">
-        <body>A Process is a special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
-Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).
-</body>
-      </ownedComment>
-      <ownedComment xmi:id="_zQdCfu-sEduH59KSHV8vgA" annotatedElement="_y-4KOe-sEduH59KSHV8vgA">
-        <body>Process in the package Library Configuration extends the class Process with association relating a Process to one default and many optional valid Configurations.
-These configurations describe valid contexts for the Process within a Method Library indicating under which Configurations a Process is well defined.
-</body>
-      </ownedComment>
-      <generalization xmi:id="_y-4KO--sEduH59KSHV8vgA" general="_y7mMsO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_y-4KPO-sEduH59KSHV8vgA" name="includesPatterns" visibility="public" type="_y_BUJ--sEduH59KSHV8vgA" association="_y_BUKu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y-4KPe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y-4KPu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQdCf--sEduH59KSHV8vgA" name="defaultContext" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" association="_zQmzg--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQdCgO-sEduH59KSHV8vgA" value="1"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQdCge-sEduH59KSHV8vgA" value="1"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQmzYO-sEduH59KSHV8vgA" name="validContext" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" association="_zQmziO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzYe-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzYu-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Class" xmi:id="_zQmzY--sEduH59KSHV8vgA" name="MethodLibrary">
-      <ownedComment xmi:id="_zQmzZO-sEduH59KSHV8vgA" annotatedElement="_zQmzY--sEduH59KSHV8vgA">
-        <body>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</body>
-      </ownedComment>
-      <generalization xmi:id="_zQmzZe-sEduH59KSHV8vgA" general="_zN7S0u-sEduH59KSHV8vgA"/>
-      <generalization xmi:id="_zQmzZ--sEduH59KSHV8vgA" general="_yxUPVO-sEduH59KSHV8vgA"/>
-      <ownedAttribute xmi:id="_zQmzaO-sEduH59KSHV8vgA" name="methodPlugins" visibility="public" type="_zGLFAO-sEduH59KSHV8vgA" aggregation="composite" association="_zQmzfe-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzae-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzau-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-      <ownedAttribute xmi:id="_zQmza--sEduH59KSHV8vgA" name="predefinedConfigurations" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" aggregation="composite" association="_zQmzgO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzbO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzbe-sEduH59KSHV8vgA"/>
-      </ownedAttribute>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzbu-sEduH59KSHV8vgA" memberEnd="_zQmzcO-sEduH59KSHV8vgA _zQdCY--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzb--sEduH59KSHV8vgA" annotatedElement="_zQmzbu-sEduH59KSHV8vgA">
-        <body>A selection of packages to be included in the configuration.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmzcO-sEduH59KSHV8vgA" name="_methodConfiguration" visibility="private" type="_zQdCYO-sEduH59KSHV8vgA" isUnique="false" association="_zQmzbu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzce-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzcu-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzc--sEduH59KSHV8vgA" memberEnd="_zQmzde-sEduH59KSHV8vgA _zQdCZu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzdO-sEduH59KSHV8vgA" annotatedElement="_zQmzc--sEduH59KSHV8vgA">
-        <body>A selection of packages to be included in the configuration.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmzde-sEduH59KSHV8vgA" name="_methodConfiguration" visibility="private" type="_zQdCYO-sEduH59KSHV8vgA" isUnique="false" association="_zQmzc--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzdu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzd--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzeO-sEduH59KSHV8vgA" memberEnd="_zQmzeu-sEduH59KSHV8vgA _zQdCe--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzee-sEduH59KSHV8vgA" annotatedElement="_zQmzeO-sEduH59KSHV8vgA">
-        <body>Delivery Process can be organized in many Process Families.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmzeu-sEduH59KSHV8vgA" name="processFamilies" visibility="public" type="_zQdCeO-sEduH59KSHV8vgA" association="_zQmzeO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmze--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzfO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzfe-sEduH59KSHV8vgA" memberEnd="_zQmzf--sEduH59KSHV8vgA _zQmzaO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzfu-sEduH59KSHV8vgA" annotatedElement="_zQmzfe-sEduH59KSHV8vgA">
-        <body>A Method Library physically comprises of Method Plugins.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmzf--sEduH59KSHV8vgA" name="_methodLibrary" visibility="private" type="_zQmzY--sEduH59KSHV8vgA" isUnique="false" association="_zQmzfe-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzgO-sEduH59KSHV8vgA" memberEnd="_zQmza--sEduH59KSHV8vgA _zQmzgu-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzge-sEduH59KSHV8vgA" annotatedElement="_zQmzgO-sEduH59KSHV8vgA">
-        <body>A Method Library stores a set of predefined Method Configurations that are regularly used by the library authors (e.g. the configurations that they ship to their users).</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmzgu-sEduH59KSHV8vgA" name="_methodLibrary" visibility="public" type="_zQmzY--sEduH59KSHV8vgA" isUnique="false" association="_zQmzgO-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzg--sEduH59KSHV8vgA" memberEnd="_zQmzhe-sEduH59KSHV8vgA _zQdCf--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzhO-sEduH59KSHV8vgA" annotatedElement="_zQmzg--sEduH59KSHV8vgA">
-        <body>A Process has exactly on default configuration.  This is in most cases the configuration in which the process has been created.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmzhe-sEduH59KSHV8vgA" name="_process" visibility="public" type="_y-4KOe-sEduH59KSHV8vgA" isUnique="false" association="_zQmzg--sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzhu-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzh--sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmziO-sEduH59KSHV8vgA" memberEnd="_zQmziu-sEduH59KSHV8vgA _zQmzYO-sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzie-sEduH59KSHV8vgA" annotatedElement="_zQmziO-sEduH59KSHV8vgA">
-        <body>A Process can have many additional configurations that have been verified to also produce valid results.  Process Elements (e.g. Descriptors) that refer to content packages that are defined outside the scope of such a configuration would not be shown in the process when published or used under such a configuration.  This allows to easily remove content from a process by removing content packages to from the related configuration.</body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmziu-sEduH59KSHV8vgA" name="_process" visibility="public" type="_y-4KOe-sEduH59KSHV8vgA" isUnique="false" association="_zQmziO-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzi--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzjO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzje-sEduH59KSHV8vgA" memberEnd="_zQmzju-sEduH59KSHV8vgA _zQdCae-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zQmzju-sEduH59KSHV8vgA" name="_methodConfiguration" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" isUnique="false" association="_zQmzje-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzj--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzkO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzke-sEduH59KSHV8vgA" memberEnd="_zQdCbO-sEduH59KSHV8vgA _zQmzku-sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zQmzku-sEduH59KSHV8vgA" name="_methodConfiguration" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" isUnique="false" association="_zQmzke-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzk--sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzlO-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzle-sEduH59KSHV8vgA" memberEnd="_zQdCb--sEduH59KSHV8vgA _zQmzl--sEduH59KSHV8vgA">
-      <ownedComment xmi:id="_zQmzlu-sEduH59KSHV8vgA" annotatedElement="_zQmzle-sEduH59KSHV8vgA">
-        <body>The definition of a configuration can be based on the definitions of other configurations.  For example, a configuration A could be defined as the superset of configurations B, C, and D plus add more selected Plugins and Packages.  In such a case A would list B, C, and D as its baseConfigurations.  If any of these base configurations changes all updates would be automatically valid for A as well reducing maintainability overhead for overlapping/dependent configurations. </body>
-      </ownedComment>
-      <ownedEnd xmi:id="_zQmzl--sEduH59KSHV8vgA" name="_methodConfiguration" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" isUnique="false" association="_zQmzle-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmzmO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzme-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmzmu-sEduH59KSHV8vgA" memberEnd="_zQdCcu-sEduH59KSHV8vgA _zQmzm--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zQmzm--sEduH59KSHV8vgA" name="_methodConfiguration" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" isUnique="false" association="_zQmzmu-sEduH59KSHV8vgA">
-        <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zQmznO-sEduH59KSHV8vgA" value="*"/>
-        <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zQmzne-sEduH59KSHV8vgA"/>
-      </ownedEnd>
-    </packagedElement>
-    <packagedElement xmi:type="uml:Association" xmi:id="_zQmznu-sEduH59KSHV8vgA" memberEnd="_zQdCde-sEduH59KSHV8vgA _zQmzn--sEduH59KSHV8vgA">
-      <ownedEnd xmi:id="_zQmzn--sEduH59KSHV8vgA" name="_methodConfiguration" visibility="public" type="_zQdCYO-sEduH59KSHV8vgA" isUnique="false" association="_zQmznu-sEduH59KSHV8vgA"/>
-    </packagedElement>
-    <profileApplication xmi:id="_J7tG1eyCEdu5-vVjlfVsfQ">
-      <eAnnotations xmi:id="_J7tG1uyCEdu5-vVjlfVsfQ" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Standard.profile.uml#_yzU58YinEdqtvbnfB2L_5w"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML_PROFILES/Standard.profile.uml#_0"/>
-    </profileApplication>
-    <profileApplication xmi:id="_J7tG1-yCEdu5-vVjlfVsfQ">
-      <eAnnotations xmi:id="_J7tG2OyCEdu5-vVjlfVsfQ" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML2_MSL_PROFILES/Default.epx#_IN8k8MmBEdqBcN1R6EvWUw?Default/Default?"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML2_MSL_PROFILES/Default.epx#_a_S3wNWLEdiy4IqP8whjFA?Default?"/>
-    </profileApplication>
-    <profileApplication xmi:id="_J7tG2eyCEdu5-vVjlfVsfQ">
-      <eAnnotations xmi:id="_J7tG2uyCEdu5-vVjlfVsfQ" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_IrdAUMmBEdqBcN1R6EvWUw?Deployment/Deployment?"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML2_MSL_PROFILES/Deployment.epx#_vjbuwOvHEdiDX5bji0iVSA?Deployment?"/>
-    </profileApplication>
-    <profileApplication xmi:id="_T_ccoOyCEdu5-vVjlfVsfQ">
-      <eAnnotations xmi:id="_T_ccoeyCEdu5-vVjlfVsfQ" source="http://www.eclipse.org/uml2/2.0.0/UML">
-        <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_vy-HUYinEdqtvbnfB2L_5w"/>
-      </eAnnotations>
-      <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
-    </profileApplication>
-  </uml:Model>
-  <Ecore:EPackage xmi:id="_U9Iz8OyCEdu5-vVjlfVsfQ" base_Package="_J7tG0OyCEdu5-vVjlfVsfQ" packageName="uma" nsPrefix="org.eclipse.epf.uma" nsURI="http://www.eclipse.org/epf/uma/1.0.4/uma.ecore" basePackage="org.eclipse.epf"/>
-  <Default:Documentation xmi:id="_yxUPW--sEduH59KSHV8vgA" base_Comment="_yxKfC--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPXO-sEduH59KSHV8vgA" base_Comment="_yxKfDu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPXe-sEduH59KSHV8vgA" base_Comment="_yxKfEO-sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yxUPXu-sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxKfEu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPX--sEduH59KSHV8vgA" base_Comment="_yxKfF--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPYO-sEduH59KSHV8vgA" base_Comment="_yxUPUe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPYe-sEduH59KSHV8vgA" base_Comment="_yxUPVe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPYu-sEduH59KSHV8vgA" base_Comment="_yxUPWe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPce-sEduH59KSHV8vgA" base_Comment="_yxUPY--sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxUPcu-sEduH59KSHV8vgA" instanceClassName="java.util.Date" base_PrimitiveType="_yxUPZO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPc--sEduH59KSHV8vgA" base_Comment="_yxUPZe-sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxUPdO-sEduH59KSHV8vgA" instanceClassName="java.net.URI" base_PrimitiveType="_yxUPZu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPde-sEduH59KSHV8vgA" base_Comment="_yxUPZ--sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxUPdu-sEduH59KSHV8vgA" instanceClassName="java.lang.String" base_PrimitiveType="_yxUPaO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxUPd--sEduH59KSHV8vgA" base_Comment="_yxUPae-sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxUPeO-sEduH59KSHV8vgA" instanceClassName="java.util.Set" base_PrimitiveType="_yxUPau-sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxUPee-sEduH59KSHV8vgA" instanceClassName="java.util.List" base_PrimitiveType="_yxUPa--sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxdZQO-sEduH59KSHV8vgA" instanceClassName="int" base_PrimitiveType="_yxUPbO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxdZQe-sEduH59KSHV8vgA" base_Comment="_yxUPbe-sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxdZQu-sEduH59KSHV8vgA" instanceClassName="java.lang.Boolean" base_PrimitiveType="_yxUPbu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yxdZQ--sEduH59KSHV8vgA" base_Comment="_yxUPb--sEduH59KSHV8vgA"/>
-  <Ecore:EDataType xmi:id="_yxdZRO-sEduH59KSHV8vgA" instanceClassName="java.lang.Double" base_PrimitiveType="_yxUPcO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FMu-sEduH59KSHV8vgA" base_Comment="_yxw7QO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FM--sEduH59KSHV8vgA" base_Comment="_yxw7Qu-sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FNO-sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7RO-sEduH59KSHV8vgA" isID="true"/>
-  <Default:Documentation xmi:id="_yx6FNe-sEduH59KSHV8vgA" base_Comment="_yxw7Re-sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FNu-sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7Se-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FN--sEduH59KSHV8vgA" base_Comment="_yxw7Su-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FOO-sEduH59KSHV8vgA" base_Comment="_yxw7Ve-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FOe-sEduH59KSHV8vgA" base_Comment="_yxw7WO-sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FOu-sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7Wu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FO--sEduH59KSHV8vgA" base_Comment="_yxw7W--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FPO-sEduH59KSHV8vgA" base_Comment="_yxw7Y--sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FPe-sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7Ze-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FPu-sEduH59KSHV8vgA" base_Comment="_yxw7Zu-sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FP--sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7au-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FQO-sEduH59KSHV8vgA" base_Comment="_yxw7a--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FQe-sEduH59KSHV8vgA" base_Comment="_yxw7c--sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FQu-sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7de-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FQ--sEduH59KSHV8vgA" base_Comment="_yxw7du-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FRO-sEduH59KSHV8vgA" base_Comment="_yxw7e--sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FRe-sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7fu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FRu-sEduH59KSHV8vgA" base_Comment="_yxw7f--sEduH59KSHV8vgA"/>
-  <Ecore:EAttribute xmi:id="_yx6FR--sEduH59KSHV8vgA" isUnsettable="true" base_Property="_yxw7iO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FSO-sEduH59KSHV8vgA" base_Comment="_yxw7je-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FSe-sEduH59KSHV8vgA" base_Comment="_yxw7kO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FSu-sEduH59KSHV8vgA" base_Comment="_yxw7le-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yx6FS--sEduH59KSHV8vgA" base_Comment="_yxw7mu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OKu-sEduH59KSHV8vgA" base_Comment="_yyzdEO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OK--sEduH59KSHV8vgA" base_Comment="_yyzdEu-sEduH59KSHV8vgA"/>
-  <Ecore:EReference xmi:id="_yy9OLO-sEduH59KSHV8vgA" isTransient="true" base_Property="_yyzdFO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OLe-sEduH59KSHV8vgA" base_Comment="_yyzdG--sEduH59KSHV8vgA"/>
-  <Ecore:EReference xmi:id="_yy9OLu-sEduH59KSHV8vgA" isTransient="true" base_Property="_yyzdLe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OL--sEduH59KSHV8vgA" base_Comment="_yyzdMe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OMO-sEduH59KSHV8vgA" base_Comment="_yyzdNO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OMe-sEduH59KSHV8vgA" base_Comment="_yyzdN--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OMu-sEduH59KSHV8vgA" base_Comment="_yyzdQO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OM--sEduH59KSHV8vgA" base_Comment="_yyzdRu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9ONO-sEduH59KSHV8vgA" base_Comment="_yyzdSe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9ONe-sEduH59KSHV8vgA" base_Comment="_yyzdTe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9ONu-sEduH59KSHV8vgA" base_Comment="_yyzdVu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9ON--sEduH59KSHV8vgA" base_Comment="_yyzdW--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OOO-sEduH59KSHV8vgA" base_Comment="_yyzdYO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OOe-sEduH59KSHV8vgA" base_Comment="_yyzdZe-sEduH59KSHV8vgA"/>
-  <Ecore:EReference xmi:id="_yy9OOu-sEduH59KSHV8vgA" isTransient="true" base_Property="_yyzdZu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OO--sEduH59KSHV8vgA" base_Comment="_yyzdau-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OPO-sEduH59KSHV8vgA" base_Comment="_yy9OEe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OPe-sEduH59KSHV8vgA" base_Comment="_yy9OFu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OPu-sEduH59KSHV8vgA" base_Comment="_yy9OGO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OP--sEduH59KSHV8vgA" base_Comment="_yy9OHe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OQO-sEduH59KSHV8vgA" base_Comment="_yy9OIu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OQe-sEduH59KSHV8vgA" base_Comment="_yy9OJe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_yy9OQu-sEduH59KSHV8vgA" base_Comment="_yy9OKO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0Jg-u-sEduH59KSHV8vgA" base_Comment="_yz1-4O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0Jg---sEduH59KSHV8vgA" base_Comment="_yz1-4u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0Jg_O-sEduH59KSHV8vgA" base_Comment="_yz1-5e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0Jg_e-sEduH59KSHV8vgA" base_Comment="_yz1-6O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0Jg_u-sEduH59KSHV8vgA" base_Comment="_yz1-6--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0Jg_--sEduH59KSHV8vgA" base_Comment="_yz1-7u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhAO-sEduH59KSHV8vgA" base_Comment="_yz1-8e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhAe-sEduH59KSHV8vgA" base_Comment="_yz1-9O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhAu-sEduH59KSHV8vgA" base_Comment="_yz1-9--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhA--sEduH59KSHV8vgA" base_Comment="_yz1--u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhBO-sEduH59KSHV8vgA" base_Comment="_yz1-_e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhBe-sEduH59KSHV8vgA" base_Comment="_yz1_AO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhBu-sEduH59KSHV8vgA" base_Comment="_yz1_CO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhB--sEduH59KSHV8vgA" base_Comment="_yz1_Fe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhCO-sEduH59KSHV8vgA" base_Comment="_yz_v5u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhCe-sEduH59KSHV8vgA" base_Comment="_yz_v_e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhCu-sEduH59KSHV8vgA" base_Comment="_yz_wAO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhC--sEduH59KSHV8vgA" base_Comment="_yz_wA--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhDO-sEduH59KSHV8vgA" base_Comment="_yz_wCO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhDe-sEduH59KSHV8vgA" base_Comment="_yz_wDe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhDu-sEduH59KSHV8vgA" base_Comment="_yz_wEu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhD--sEduH59KSHV8vgA" base_Comment="_yz_wF--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhEO-sEduH59KSHV8vgA" base_Comment="_yz_wHO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhEe-sEduH59KSHV8vgA" base_Comment="_yz_wIe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhEu-sEduH59KSHV8vgA" base_Comment="_yz_wJu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhE--sEduH59KSHV8vgA" base_Comment="_yz_wK--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhFO-sEduH59KSHV8vgA" base_Comment="_y0Jg4e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y0JhFe-sEduH59KSHV8vgA" base_Comment="_y0Jg5u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1VzsO-sEduH59KSHV8vgA" base_Comment="_y1CRsO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzse-sEduH59KSHV8vgA" base_Comment="_y1MCs--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzsu-sEduH59KSHV8vgA" base_Comment="_y1MCuO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzs--sEduH59KSHV8vgA" base_Comment="_y1MCx--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1VztO-sEduH59KSHV8vgA" base_Comment="_y1MCzO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzte-sEduH59KSHV8vgA" base_Comment="_y1MC0--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vztu-sEduH59KSHV8vgA" base_Comment="_y1MC2O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzt--sEduH59KSHV8vgA" base_Comment="_y1MC3e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1VzuO-sEduH59KSHV8vgA" base_Comment="_y1MC5O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzue-sEduH59KSHV8vgA" base_Comment="_y1MC6e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzuu-sEduH59KSHV8vgA" base_Comment="_y1MC8O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzu--sEduH59KSHV8vgA" base_Comment="_y1MC9e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1VzvO-sEduH59KSHV8vgA" base_Comment="_y1MC-u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzve-sEduH59KSHV8vgA" base_Comment="_y1MDAe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzvu-sEduH59KSHV8vgA" base_Comment="_y1MDCO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzv--sEduH59KSHV8vgA" base_Comment="_y1MDDe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1VzwO-sEduH59KSHV8vgA" base_Comment="_y1MDEu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzwe-sEduH59KSHV8vgA" base_Comment="_y1MDF--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzwu-sEduH59KSHV8vgA" base_Comment="_y1MDHO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzw--sEduH59KSHV8vgA" base_Comment="_y1MDIe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1VzxO-sEduH59KSHV8vgA" base_Comment="_y1MDJe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzxe-sEduH59KSHV8vgA" base_Comment="_y1MDJ--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzxu-sEduH59KSHV8vgA" base_Comment="_y1MDLO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1Vzx--sEduH59KSHV8vgA" base_Comment="_y1MDMe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y1VzyO-sEduH59KSHV8vgA" base_Comment="_y1MDNu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVgO-sEduH59KSHV8vgA" base_Comment="_y2FakO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVge-sEduH59KSHV8vgA" base_Comment="_y2Okge-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVgu-sEduH59KSHV8vgA" base_Comment="_y2Okiu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVg--sEduH59KSHV8vgA" base_Comment="_y2OkkO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVhO-sEduH59KSHV8vgA" base_Comment="_y2Okme-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVhe-sEduH59KSHV8vgA" base_Comment="_y2Okn--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVhu-sEduH59KSHV8vgA" base_Comment="_y2Okou-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVh--sEduH59KSHV8vgA" base_Comment="_y2OkqO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YViO-sEduH59KSHV8vgA" base_Comment="_y2Okru-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVie-sEduH59KSHV8vgA" base_Comment="_y2OktO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YViu-sEduH59KSHV8vgA" base_Comment="_y2Okve-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVi--sEduH59KSHV8vgA" base_Comment="_y2Okwu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVjO-sEduH59KSHV8vgA" base_Comment="_y2Okx--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVje-sEduH59KSHV8vgA" base_Comment="_y2Okyu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVju-sEduH59KSHV8vgA" base_Comment="_y2Okz--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVj--sEduH59KSHV8vgA" base_Comment="_y2Ok1O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVkO-sEduH59KSHV8vgA" base_Comment="_y2Ok2e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVke-sEduH59KSHV8vgA" base_Comment="_y2Ok3u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVku-sEduH59KSHV8vgA" base_Comment="_y2Ok4--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y2YVk--sEduH59KSHV8vgA" base_Comment="_y2Ok6O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y4eAU--sEduH59KSHV8vgA" base_Comment="_y4eAMO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y4eAVO-sEduH59KSHV8vgA" base_Comment="_y4eAMu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y4eAVe-sEduH59KSHV8vgA" base_Comment="_y4eANu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y4eAVu-sEduH59KSHV8vgA" base_Comment="_y4eAP--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y4eAV--sEduH59KSHV8vgA" base_Comment="_y4eARe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y4eAWO-sEduH59KSHV8vgA" base_Comment="_y4eASu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y4eAWe-sEduH59KSHV8vgA" base_Comment="_y4eAT--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4oO-sEduH59KSHV8vgA" base_Comment="_y7mMse-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4oe-sEduH59KSHV8vgA" base_Comment="_y7mMuO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4ou-sEduH59KSHV8vgA" base_Comment="_y7mMu--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4o--sEduH59KSHV8vgA" base_Comment="_y7mMvu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4pO-sEduH59KSHV8vgA" base_Comment="_y7mMwe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4pe-sEduH59KSHV8vgA" base_Comment="_y7vWoe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4pu-sEduH59KSHV8vgA" base_Comment="_y7vWo--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4p--sEduH59KSHV8vgA" base_Comment="_y7vWpe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4qO-sEduH59KSHV8vgA" base_Comment="_y7vWp--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4qe-sEduH59KSHV8vgA" base_Comment="_y7vWqe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4qu-sEduH59KSHV8vgA" base_Comment="_y7vWq--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4q--sEduH59KSHV8vgA" base_Comment="_y7vWru-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4rO-sEduH59KSHV8vgA" base_Comment="_y7vWtO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4re-sEduH59KSHV8vgA" base_Comment="_y7vWt--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4ru-sEduH59KSHV8vgA" base_Comment="_y7vWue-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4r--sEduH59KSHV8vgA" base_Comment="_y7vWu--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4sO-sEduH59KSHV8vgA" base_Comment="_y7vWve-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4se-sEduH59KSHV8vgA" base_Comment="_y7vWwe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4su-sEduH59KSHV8vgA" base_Comment="_y7vWxu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4s--sEduH59KSHV8vgA" base_Comment="_y7vWye-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4tO-sEduH59KSHV8vgA" base_Comment="_y7vWzO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4te-sEduH59KSHV8vgA" base_Comment="_y7vW2--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4tu-sEduH59KSHV8vgA" base_Comment="_y7vW4O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4t--sEduH59KSHV8vgA" base_Comment="_y7vW7O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4uO-sEduH59KSHV8vgA" base_Comment="_y7vXC--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4ue-sEduH59KSHV8vgA" base_Comment="_y7vXDu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4uu-sEduH59KSHV8vgA" base_Comment="_y7vXE--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4u--sEduH59KSHV8vgA" base_Comment="_y7vXJO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4vO-sEduH59KSHV8vgA" base_Comment="_y7vXKu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4ve-sEduH59KSHV8vgA" base_Comment="_y7vXLe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4vu-sEduH59KSHV8vgA" base_Comment="_y7vXMO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4v--sEduH59KSHV8vgA" base_Comment="_y7vXM--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4wO-sEduH59KSHV8vgA" base_Comment="_y7vXOe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4we-sEduH59KSHV8vgA" base_Comment="_y7vXPO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4wu-sEduH59KSHV8vgA" base_Comment="_y75Hoe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4w--sEduH59KSHV8vgA" base_Comment="_y75Ho--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4xO-sEduH59KSHV8vgA" base_Comment="_y75HqO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4xe-sEduH59KSHV8vgA" base_Comment="_y75Hre-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4xu-sEduH59KSHV8vgA" base_Comment="_y75Hsu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4x--sEduH59KSHV8vgA" base_Comment="_y75Ht--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4yO-sEduH59KSHV8vgA" base_Comment="_y75HvO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4ye-sEduH59KSHV8vgA" base_Comment="_y75Hwe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4yu-sEduH59KSHV8vgA" base_Comment="_y75Hxu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4y--sEduH59KSHV8vgA" base_Comment="_y75HyO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4zO-sEduH59KSHV8vgA" base_Comment="_y75Hze-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4ze-sEduH59KSHV8vgA" base_Comment="_y75H0u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4zu-sEduH59KSHV8vgA" base_Comment="_y75H1--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C4z--sEduH59KSHV8vgA" base_Comment="_y75H3O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C40O-sEduH59KSHV8vgA" base_Comment="_y75H4e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C40e-sEduH59KSHV8vgA" base_Comment="_y75H5u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C40u-sEduH59KSHV8vgA" base_Comment="_y75H7--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C40--sEduH59KSHV8vgA" base_Comment="_y75H9O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y8C41O-sEduH59KSHV8vgA" base_Comment="_y75H-e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFIO-sEduH59KSHV8vgA" base_Comment="_y-4KMe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFIe-sEduH59KSHV8vgA" base_Comment="_y-4KOu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFIu-sEduH59KSHV8vgA" base_Comment="_y-4KQO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFI--sEduH59KSHV8vgA" base_Comment="_y-4KRu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFJO-sEduH59KSHV8vgA" base_Comment="_y-4KSO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFJe-sEduH59KSHV8vgA" base_Comment="_y_BUIO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFJu-sEduH59KSHV8vgA" base_Comment="_y_BUKO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFJ--sEduH59KSHV8vgA" base_Comment="_y_BUK--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFKO-sEduH59KSHV8vgA" base_Comment="_y_BUMO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFKe-sEduH59KSHV8vgA" base_Comment="_y_BUNe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFKu-sEduH59KSHV8vgA" base_Comment="_y_BUOO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFK--sEduH59KSHV8vgA" base_Comment="_y_BUPe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFLO-sEduH59KSHV8vgA" base_Comment="_y_BUQu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFLe-sEduH59KSHV8vgA" base_Comment="_y_BUR--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFLu-sEduH59KSHV8vgA" base_Comment="_y_BUSe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFL--sEduH59KSHV8vgA" base_Comment="_y_BUUu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFMO-sEduH59KSHV8vgA" base_Comment="_y_BUV--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFMe-sEduH59KSHV8vgA" base_Comment="_y_BUXO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFMu-sEduH59KSHV8vgA" base_Comment="_y_BUYe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFM--sEduH59KSHV8vgA" base_Comment="_y_BUZu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_y_LFNO-sEduH59KSHV8vgA" base_Comment="_y_BUa--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6EO-sEduH59KSHV8vgA" base_Comment="_zBZ5w--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6Ee-sEduH59KSHV8vgA" base_Comment="_zBZ5yu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6Eu-sEduH59KSHV8vgA" base_Comment="_zBZ5z--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6E--sEduH59KSHV8vgA" base_Comment="_zBZ51O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6FO-sEduH59KSHV8vgA" base_Comment="_zBZ52--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6Fe-sEduH59KSHV8vgA" base_Comment="_zBZ54O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6Fu-sEduH59KSHV8vgA" base_Comment="_zBZ55e-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6F--sEduH59KSHV8vgA" base_Comment="_zBZ56u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6GO-sEduH59KSHV8vgA" base_Comment="_zBZ57--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6Ge-sEduH59KSHV8vgA" base_Comment="_zBZ59O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6Gu-sEduH59KSHV8vgA" base_Comment="_zBZ5---sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6G--sEduH59KSHV8vgA" base_Comment="_zBZ6AO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6HO-sEduH59KSHV8vgA" base_Comment="_zBZ6B--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zBZ6He-sEduH59KSHV8vgA" base_Comment="_zBZ6DO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVrO-sEduH59KSHV8vgA" base_Comment="_zDpVce-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVre-sEduH59KSHV8vgA" base_Comment="_zDpVfO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVru-sEduH59KSHV8vgA" base_Comment="_zDpVgu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVr--sEduH59KSHV8vgA" base_Comment="_zDpVi--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVsO-sEduH59KSHV8vgA" base_Comment="_zDpVke-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVse-sEduH59KSHV8vgA" base_Comment="_zDpVlu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVsu-sEduH59KSHV8vgA" base_Comment="_zDpVm--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVs--sEduH59KSHV8vgA" base_Comment="_zDpVoO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVtO-sEduH59KSHV8vgA" base_Comment="_zDpVpe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zDpVte-sEduH59KSHV8vgA" base_Comment="_zDpVqu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2FO-sEduH59KSHV8vgA" base_Comment="_zGLFAe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Fe-sEduH59KSHV8vgA" base_Comment="_zGLFDO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Fu-sEduH59KSHV8vgA" base_Comment="_zGLFDu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2F--sEduH59KSHV8vgA" base_Comment="_zGLFEO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2GO-sEduH59KSHV8vgA" base_Comment="_zGLFE--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Ge-sEduH59KSHV8vgA" base_Comment="_zGLFGO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Gu-sEduH59KSHV8vgA" base_Comment="_zGLFGu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2G--sEduH59KSHV8vgA" base_Comment="_zGLFHO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2HO-sEduH59KSHV8vgA" base_Comment="_zGLFHu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2He-sEduH59KSHV8vgA" base_Comment="_zGLFIO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Hu-sEduH59KSHV8vgA" base_Comment="_zGLFJe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2H--sEduH59KSHV8vgA" base_Comment="_zGLFKO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2IO-sEduH59KSHV8vgA" base_Comment="_zGLFLe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Ie-sEduH59KSHV8vgA" base_Comment="_zGLFMu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Iu-sEduH59KSHV8vgA" base_Comment="_zGU2Ae-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2I--sEduH59KSHV8vgA" base_Comment="_zGU2Bu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2JO-sEduH59KSHV8vgA" base_Comment="_zGU2C--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zGU2Je-sEduH59KSHV8vgA" base_Comment="_zGU2EO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zLitOO-sEduH59KSHV8vgA" base_Comment="_zLitNO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zOEcxu-sEduH59KSHV8vgA" base_Comment="_zN7S0--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zOEcx--sEduH59KSHV8vgA" base_Comment="_zN7S1u-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zOEcyO-sEduH59KSHV8vgA" base_Comment="_zN7S2--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zOEcye-sEduH59KSHV8vgA" base_Comment="_zN7S3--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zOEcyu-sEduH59KSHV8vgA" base_Comment="_zN7S5O-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zOEcy--sEduH59KSHV8vgA" base_Comment="_zOEcwu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzoO-sEduH59KSHV8vgA" base_Comment="_zQdCYe-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzoe-sEduH59KSHV8vgA" base_Comment="_zQdCee-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzou-sEduH59KSHV8vgA" base_Comment="_zQdCfu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzo--sEduH59KSHV8vgA" base_Comment="_zQmzZO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzpO-sEduH59KSHV8vgA" base_Comment="_zQmzb--sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzpe-sEduH59KSHV8vgA" base_Comment="_zQmzdO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzpu-sEduH59KSHV8vgA" base_Comment="_zQmzee-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzp--sEduH59KSHV8vgA" base_Comment="_zQmzfu-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzqO-sEduH59KSHV8vgA" base_Comment="_zQmzge-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzqe-sEduH59KSHV8vgA" base_Comment="_zQmzhO-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzqu-sEduH59KSHV8vgA" base_Comment="_zQmzie-sEduH59KSHV8vgA"/>
-  <Default:Documentation xmi:id="_zQmzq--sEduH59KSHV8vgA" base_Comment="_zQmzlu-sEduH59KSHV8vgA"/>
-</xmi:XMI>
diff --git a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.genmodel b/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.genmodel
deleted file mode 100644
index adcd962..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/model/1.0.4/uma.genmodel
+++ /dev/null
@@ -1,499 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.epf.uma/src"
-    editDirectory="/org.eclipse.epf.uma.edit/src" editorDirectory="/org.eclipse.epf.uma.editor/src"
-    modelPluginID="org.eclipse.epf.uma" templateDirectory="/org.eclipse.epf.uma.ecore/templates"
-    runtimeJar="true" dynamicTemplates="true" modelName="Uma" editPluginClass="org.eclipse.epf.uma.provider.UmaEditPlugin"
-    editorPluginClass="org.eclipse.epf.uma.presentation.UmaEditorPlugin" nonNLSMarkers="true"
-    rootExtendsInterface="org.eclipse.epf.uma.ecore.IModelObject" rootExtendsClass="org.eclipse.epf.uma.ecore.impl.MultiResourceEObject"
-    rootImplementsInterface="org.eclipse.emf.ecore.sdo.InternalEDataObject" suppressEMFTypes="true"
-    featureMapWrapperInterface="commonj.sdo.Sequence" featureMapWrapperInternalInterface="org.eclipse.emf.ecore.sdo.util.ESequence"
-    featureMapWrapperClass="org.eclipse.emf.ecore.sdo.util.BasicESequence" codeFormatting="true"
-    containmentProxies="true">
-  <foreignModel>C:\Home\phTNG\TNG_docs\OOAD\ContentArchitecture\Models\UMA04\UnifiedMethodArchitecture.mdl</foreignModel>
-  <staticPackages>http://www.eclipse.org/emf/2003/SDO</staticPackages>
-  <modelPluginVariables>EMF_COMMONJ_SDO=org.eclipse.emf.commonj.sdo</modelPluginVariables>
-  <modelPluginVariables>EMF_ECORE_SDO=org.eclipse.emf.ecore.sdo</modelPluginVariables>
-  <genPackages prefix="Uma" basePackage="org.eclipse.epf" disposableProviderFactory="true"
-      ecorePackage="uma.ecore#/">
-    <genEnums ecoreEnum="uma.ecore#//WorkOrderType">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/finishToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/finishToFinish"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/startToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//WorkOrderType/startToFinish"/>
-    </genEnums>
-    <genEnums ecoreEnum="uma.ecore#//PseudoStateKind">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/initial"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/join"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/fork"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/junction"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/choice"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/entryPoint"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/exitPoint"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//PseudoStateKind/terminate"/>
-    </genEnums>
-    <genEnums ecoreEnum="uma.ecore#//VariabilityType">
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/na"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/contributes"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/extends"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/replaces"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/localContribution"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/localReplacement"/>
-      <genEnumLiterals ecoreEnumLiteral="uma.ecore#//VariabilityType/extendsReplaces"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="uma.ecore#//Date"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Uri"/>
-    <genDataTypes ecoreDataType="uma.ecore#//UnlimitedNatural"/>
-    <genDataTypes ecoreDataType="uma.ecore#//String"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Set"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Sequence"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Integer"/>
-    <genDataTypes ecoreDataType="uma.ecore#//Float"/>
-    <genClasses ecoreClass="uma.ecore#//Classifier"/>
-    <genClasses ecoreClass="uma.ecore#//Type"/>
-    <genClasses ecoreClass="uma.ecore#//Element"/>
-    <genClasses ecoreClass="uma.ecore#//NamedElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//NamedElement/name"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PackageableElement"/>
-    <genClasses ecoreClass="uma.ecore#//Package"/>
-    <genClasses ecoreClass="uma.ecore#//Namespace"/>
-    <genClasses ecoreClass="uma.ecore#//MethodElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/guid"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/briefDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodElement/ownedRules"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodElement/methodElementProperty"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/suppressed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElement/orderingGuide"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Constraint">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Constraint/body"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodElementProperty">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodElementProperty/value"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentElement">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/supportingMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/conceptsAndPapers"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/checklists"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/guidelines"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/examples"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/assets"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ContentElement/termDefinition"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DescribableElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/presentationName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DescribableElement/presentation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/shapeicon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescribableElement/nodeicon"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ContentDescription/mainDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ContentDescription/sections"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ContentDescription/externalId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ContentDescription/keyConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Section">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Section/sectionName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Section/sectionDescription"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Section/subSections"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Section/predecessor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Role">
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Role/modifies"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Role/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProduct">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/reports"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/templates"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/toolMentors"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProduct/estimationConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Task">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/performedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/mandatoryInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/output"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/additionallyPerformedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/optionalInput"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/steps"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/toolMentors"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Task/estimationConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkDefinition">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//WorkDefinition/precondition"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//WorkDefinition/postcondition"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Step"/>
-    <genClasses ecoreClass="uma.ecore#//Guidance"/>
-    <genClasses ecoreClass="uma.ecore#//Artifact">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Artifact/containerArtifact"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Artifact/containedArtifacts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Deliverable">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Deliverable/deliveredWorkProducts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Outcome"/>
-    <genClasses ecoreClass="uma.ecore#//MethodPackage">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodPackage/global"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/reusedPackages"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodPackage/childPackages"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ContentPackage/contentElements"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ArtifactDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/briefOutline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/representationOptions"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/representation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ArtifactDescription/notation"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/impactOfNotHaving"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescription/reasonsForNotNeeding"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliverableDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliverableDescription/externalDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliverableDescription/packagingGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/skills"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/assignmentApproaches"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//RoleDescription/synonyms"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//TaskDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TaskDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TaskDescription/alternatives"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GuidanceDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//GuidanceDescription/attachments"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PracticeDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/additionalInfo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/problem"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/background"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/goals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/application"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PracticeDescription/levelsOfAdoption"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Point">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Point/x"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Point/y"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/position"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/contained"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/link"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/anchorage"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphElement/semanticModel"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DiagramElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DiagramElement/isVisible"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/container"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/reference"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DiagramElement/property"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DiagramLink">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DiagramLink/zoom"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/viewport"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/graphElement"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DiagramLink/diagram"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphConnector">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphConnector/graphElement"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphConnector/graphEdge"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//SemanticModelBridge">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//SemanticModelBridge/presentation"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//SemanticModelBridge/graphElement"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//SemanticModelBridge/diagram"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Dimension">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Dimension/width"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Dimension/height"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Reference">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Reference/isIndividualRepresentation"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Reference/referenced"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Property">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Property/key"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Property/value"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphEdge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//GraphEdge/anchor"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphEdge/waypoints"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Diagram">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Diagram/zoom"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Diagram/viewpoint"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Diagram/diagramLink"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Diagram/namespace"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphNode">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//GraphNode/size"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//SimpleSemanticModelElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//SimpleSemanticModelElement/typeInfo"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//UMASemanticModelBridge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//UMASemanticModelBridge/element"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CoreSemanticModelBridge">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CoreSemanticModelBridge/element"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//LeafElement"/>
-    <genClasses ecoreClass="uma.ecore#//TextElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//TextElement/text"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Image">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Image/uri"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Image/mimeType"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//GraphicPrimitive"/>
-    <genClasses ecoreClass="uma.ecore#//Polyline">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Polyline/closed"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Polyline/waypoints"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Ellipse">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/radiusX"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/radiusY"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/rotation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/startAngle"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Ellipse/endAngle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Ellipse/center"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Activity">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/breakdownElements"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/roadmaps"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/supportingMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/checklists"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/concepts"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/examples"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/guidelines"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Activity/reusableAssets"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Activity/isEnactable"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkBreakdownElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isRepeatable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isOngoing"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkBreakdownElement/isEventDriven"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkBreakdownElement/linkToPredecessor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//BreakdownElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/prefix"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/isPlanned"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/hasMultipleOccurrences"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElement/isOptional"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/presentedAfter"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/presentedBefore"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/planningData"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//BreakdownElement/superActivities"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Milestone"/>
-    <genClasses ecoreClass="uma.ecore#//Iteration"/>
-    <genClasses ecoreClass="uma.ecore#//Phase"/>
-    <genClasses ecoreClass="uma.ecore#//TeamProfile">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/teamRoles"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/superTeam"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TeamProfile/subTeam"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/Role"/>
-      <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/modifies"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleDescriptor/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkOrder">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkOrder/linkType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkOrder/pred"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessElement"/>
-    <genClasses ecoreClass="uma.ecore#//PlanningData">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/startDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/finishDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//PlanningData/rank"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Descriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//Descriptor/isSynchronizedWithSource"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescriptor/activityEntryState"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//WorkProductDescriptor/activityExitState"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/WorkProduct"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/impactedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/impacts"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductDescriptor/deliverableParts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//TaskDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/Task"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/additionallyPerformedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/assistedBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/externalInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/mandatoryInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/optionalInput"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/output"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/performedPrimarilyBy"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//TaskDescriptor/selectedSteps"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CompositeRole">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CompositeRole/aggregatedRoles"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//BreakdownElementDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//BreakdownElementDescription/usageGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ActivityDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/alternatives"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ActivityDescription/howtoStaff"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliveryProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/scale"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/projectCharacteristics"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/riskLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/estimatingTechnique"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/projectMemberExpertise"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DeliveryProcessDescription/typeOfContract"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/scope"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//ProcessDescription/usageNotes"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DescriptorDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//DescriptorDescription/refinedDescription"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Concept"/>
-    <genClasses ecoreClass="uma.ecore#//Checklist"/>
-    <genClasses ecoreClass="uma.ecore#//Example"/>
-    <genClasses ecoreClass="uma.ecore#//Guideline"/>
-    <genClasses ecoreClass="uma.ecore#//Report"/>
-    <genClasses ecoreClass="uma.ecore#//Template"/>
-    <genClasses ecoreClass="uma.ecore#//SupportingMaterial"/>
-    <genClasses ecoreClass="uma.ecore#//ToolMentor"/>
-    <genClasses ecoreClass="uma.ecore#//Whitepaper"/>
-    <genClasses ecoreClass="uma.ecore#//TermDefinition"/>
-    <genClasses ecoreClass="uma.ecore#//Practice">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Practice/subPractices"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Practice/contentReferences"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Practice/activityReferences"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//EstimationConsiderations"/>
-    <genClasses ecoreClass="uma.ecore#//ReusableAsset"/>
-    <genClasses ecoreClass="uma.ecore#//State">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//State/WorkProduct"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//State/Region"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//State/submachine"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Vertex">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Vertex/container"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Vertex/outgoing"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Vertex/incoming"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Region">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Region/Vertex"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Region/Transition"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Region/State"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Region/StateMachine"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//StateMachine">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//StateMachine/Region"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Transition">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/WorkDefinition"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/container"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/source"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Transition/target"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//PseudoState"/>
-    <genClasses ecoreClass="uma.ecore#//Discipline">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Discipline/tasks"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Discipline/subdiscipline"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Discipline/referenceWorkflows"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ContentCategory"/>
-    <genClasses ecoreClass="uma.ecore#//RoleSet">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleSet/roles"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Domain">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Domain/workProducts"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//Domain/subdomains"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//WorkProductType">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//WorkProductType/workProducts"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DisciplineGrouping">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DisciplineGrouping/disciplines"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Tool">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Tool/toolMentors"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//RoleSetGrouping">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//RoleSetGrouping/roleSets"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CustomCategory">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CustomCategory/categorizedElements"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//CustomCategory/subCategories"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//DeliveryProcess">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DeliveryProcess/educationMaterials"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//DeliveryProcess/communicationsMaterials"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Process">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/includesPatterns"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/defaultContext"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//Process/validContext"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//CapabilityPattern"/>
-    <genClasses ecoreClass="uma.ecore#//ProcessPlanningTemplate">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessPlanningTemplate/basedOnProcesses"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//Roadmap"/>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponent">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponent/interfaces"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponent/process"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessPackage/processElements"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessPackage/diagrams"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponentInterface">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentInterface/interfaceSpecifications"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentInterface/interfaceIO"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessComponentDescriptor">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessComponentDescriptor/ProcessComponent"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodPlugin">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodPlugin/userChangeable"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodPlugin/methodPackages"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodPlugin/bases"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//VariabilityElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//VariabilityElement/variabilityType"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//VariabilityElement/variabilityBasedOnElement"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodUnit">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/authors"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/changeDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/changeDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute uma.ecore#//MethodUnit/version"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodUnit/copyrightStatement"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodConfiguration">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/methodPluginSelection"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/methodPackageSelection"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/processViews"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/defaultView"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/baseConfigurations"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/subtractedCategory"/>
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//MethodConfiguration/addedCategory"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//ProcessFamily">
-      <genFeatures notify="false" createChild="false" ecoreFeature="ecore:EReference uma.ecore#//ProcessFamily/deliveryProcesses"/>
-    </genClasses>
-    <genClasses ecoreClass="uma.ecore#//MethodLibrary">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodLibrary/methodPlugins"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference uma.ecore#//MethodLibrary/predefinedConfigurations"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.uma/plugin.properties b/1.5/plugins/org.eclipse.epf.uma/plugin.properties
deleted file mode 100644
index 2916485..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/plugin.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF UMA
-providerName=Eclipse.org
-
-# ====================================================================
-
diff --git a/1.5/plugins/org.eclipse.epf.uma/plugin.xml b/1.5/plugins/org.eclipse.epf.uma/plugin.xml
deleted file mode 100644
index 1eb2dd9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/plugin.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<plugin>
-
-   <extension point="org.eclipse.emf.ecore.generated_package">
-      <package 
-            uri = "http://www.ibm.com/uma/1.0.2/uma.ecore" 
-            class = "org.eclipse.epf.uma.UmaPackage" />
-      <package
-            class="org.eclipse.epf.uma.UmaPackage"
-            uri="http://www.eclipse.org/epf/uma/1.0.3/uma.ecore"/>
-  </extension>
-
-</plugin>
-
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Activity.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Activity.java
deleted file mode 100644
index f46d8ae..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Activity.java
+++ /dev/null
@@ -1,203 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Activity</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An Activity is a Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
- * Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Activity#getBreakdownElements <em>Breakdown Elements</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getRoadmaps <em>Roadmaps</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getSupportingMaterials <em>Supporting Materials</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getChecklists <em>Checklists</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getConcepts <em>Concepts</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getExamples <em>Examples</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getGuidelines <em>Guidelines</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getReusableAssets <em>Reusable Assets</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Activity#getIsEnactable <em>Is Enactable</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getActivity()
- * @model
- * @generated
- */
-public interface Activity extends WorkBreakdownElement, VariabilityElement,
-		WorkDefinition {
-	/**
-	 * Returns the value of the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.BreakdownElement}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.BreakdownElement#getSuperActivities <em>Super Activities</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Breakdown Elements</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Breakdown Elements</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_BreakdownElements()
-	 * @see org.eclipse.epf.uma.BreakdownElement#getSuperActivities
-	 * @model type="org.eclipse.epf.uma.BreakdownElement" opposite="superActivities" ordered="false"
-	 * @generated
-	 */
-	List getBreakdownElements();
-
-	/**
-	 * Returns the value of the '<em><b>Roadmaps</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Roadmap}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Roadmaps</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Roadmaps</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_Roadmaps()
-	 * @model type="org.eclipse.epf.uma.Roadmap" ordered="false"
-	 * @generated
-	 */
-	List getRoadmaps();
-
-	/**
-	 * Returns the value of the '<em><b>Supporting Materials</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.SupportingMaterial}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Supporting Materials</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Supporting Materials</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_SupportingMaterials()
-	 * @model type="org.eclipse.epf.uma.SupportingMaterial" ordered="false"
-	 * @generated
-	 */
-	List getSupportingMaterials();
-
-	/**
-	 * Returns the value of the '<em><b>Checklists</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Checklist}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Checklists</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Checklists</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_Checklists()
-	 * @model type="org.eclipse.epf.uma.Checklist" ordered="false"
-	 * @generated
-	 */
-	List getChecklists();
-
-	/**
-	 * Returns the value of the '<em><b>Concepts</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Concept}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Concepts</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Concepts</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_Concepts()
-	 * @model type="org.eclipse.epf.uma.Concept" ordered="false"
-	 * @generated
-	 */
-	List getConcepts();
-
-	/**
-	 * Returns the value of the '<em><b>Examples</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Example}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Examples</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Examples</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_Examples()
-	 * @model type="org.eclipse.epf.uma.Example" ordered="false"
-	 * @generated
-	 */
-	List getExamples();
-
-	/**
-	 * Returns the value of the '<em><b>Guidelines</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Guideline}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Guidelines</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Guidelines</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_Guidelines()
-	 * @model type="org.eclipse.epf.uma.Guideline" ordered="false"
-	 * @generated
-	 */
-	List getGuidelines();
-
-	/**
-	 * Returns the value of the '<em><b>Reusable Assets</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ReusableAsset}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reusable Assets</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Reusable Assets</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_ReusableAssets()
-	 * @model type="org.eclipse.epf.uma.ReusableAsset" ordered="false"
-	 * @generated
-	 */
-	List getReusableAssets();
-
-	/**
-	 * Returns the value of the '<em><b>Is Enactable</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Is Enactable</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Is Enactable</em>' attribute.
-	 * @see #setIsEnactable(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivity_IsEnactable()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getIsEnactable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Activity#getIsEnactable <em>Is Enactable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Enactable</em>' attribute.
-	 * @see #getIsEnactable()
-	 * @generated
-	 */
-	void setIsEnactable(Boolean value);
-
-} // Activity
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ActivityDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ActivityDescription.java
deleted file mode 100644
index 2db6130..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ActivityDescription.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Activity Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ActivityDescription#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ActivityDescription#getAlternatives <em>Alternatives</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ActivityDescription#getHowtoStaff <em>Howto Staff</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getActivityDescription()
- * @model
- * @generated
- */
-public interface ActivityDescription extends BreakdownElementDescription {
-	/**
-	 * Returns the value of the '<em><b>Purpose</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Purpose</em>' attribute.
-	 * @see #setPurpose(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivityDescription_Purpose()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getPurpose();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ActivityDescription#getPurpose <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Purpose</em>' attribute.
-	 * @see #getPurpose()
-	 * @generated
-	 */
-	void setPurpose(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Alternatives</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Alternatives</em>' attribute.
-	 * @see #setAlternatives(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivityDescription_Alternatives()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getAlternatives();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ActivityDescription#getAlternatives <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Alternatives</em>' attribute.
-	 * @see #getAlternatives()
-	 * @generated
-	 */
-	void setAlternatives(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Howto Staff</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Howto Staff</em>' attribute.
-	 * @see #setHowtoStaff(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getActivityDescription_HowtoStaff()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getHowtoStaff();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ActivityDescription#getHowtoStaff <em>Howto Staff</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Howto Staff</em>' attribute.
-	 * @see #getHowtoStaff()
-	 * @generated
-	 */
-	void setHowtoStaff(String value);
-
-} // ActivityDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Artifact.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Artifact.java
deleted file mode 100644
index 7412ae2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Artifact.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Artifact</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Artifact is a Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
- * Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might "own" a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Artifact#getContainerArtifact <em>Container Artifact</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Artifact#getContainedArtifacts <em>Contained Artifacts</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getArtifact()
- * @model
- * @generated
- */
-public interface Artifact extends WorkProduct {
-	/**
-	 * Returns the value of the '<em><b>Container Artifact</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Artifact#getContainedArtifacts <em>Contained Artifacts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Container Artifact</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Container Artifact</em>' container reference.
-	 * @see #setContainerArtifact(Artifact)
-	 * @see org.eclipse.epf.uma.UmaPackage#getArtifact_ContainerArtifact()
-	 * @see org.eclipse.epf.uma.Artifact#getContainedArtifacts
-	 * @model opposite="containedArtifacts"
-	 * @generated
-	 */
-	Artifact getContainerArtifact();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Artifact#getContainerArtifact <em>Container Artifact</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Container Artifact</em>' container reference.
-	 * @see #getContainerArtifact()
-	 * @generated
-	 */
-	void setContainerArtifact(Artifact value);
-
-	/**
-	 * Returns the value of the '<em><b>Contained Artifacts</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Artifact}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Artifact#getContainerArtifact <em>Container Artifact</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Contained Artifacts</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>Contained Artifacts</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getArtifact_ContainedArtifacts()
-	 * @see org.eclipse.epf.uma.Artifact#getContainerArtifact
-	 * @model type="org.eclipse.epf.uma.Artifact" opposite="containerArtifact" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getContainedArtifacts();
-
-} // Artifact
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ArtifactDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ArtifactDescription.java
deleted file mode 100644
index 4680e6e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ArtifactDescription.java
+++ /dev/null
@@ -1,139 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Artifact Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ArtifactDescription#getBriefOutline <em>Brief Outline</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ArtifactDescription#getRepresentationOptions <em>Representation Options</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ArtifactDescription#getRepresentation <em>Representation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ArtifactDescription#getNotation <em>Notation</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getArtifactDescription()
- * @model
- * @generated
- */
-public interface ArtifactDescription extends WorkProductDescription {
-	/**
-	 * Returns the value of the '<em><b>Brief Outline</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Brief Outline</em>' attribute.
-	 * @see #setBriefOutline(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getArtifactDescription_BriefOutline()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getBriefOutline();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ArtifactDescription#getBriefOutline <em>Brief Outline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Brief Outline</em>' attribute.
-	 * @see #getBriefOutline()
-	 * @generated
-	 */
-	void setBriefOutline(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Representation Options</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Representation Options</em>' attribute.
-	 * @see #setRepresentationOptions(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getArtifactDescription_RepresentationOptions()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getRepresentationOptions();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ArtifactDescription#getRepresentationOptions <em>Representation Options</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Representation Options</em>' attribute.
-	 * @see #getRepresentationOptions()
-	 * @generated
-	 */
-	void setRepresentationOptions(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Representation</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Representation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Representation</em>' attribute.
-	 * @see #setRepresentation(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getArtifactDescription_Representation()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getRepresentation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ArtifactDescription#getRepresentation <em>Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Representation</em>' attribute.
-	 * @see #getRepresentation()
-	 * @generated
-	 */
-	void setRepresentation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Notation</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Notation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Notation</em>' attribute.
-	 * @see #setNotation(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getArtifactDescription_Notation()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getNotation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ArtifactDescription#getNotation <em>Notation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Notation</em>' attribute.
-	 * @see #getNotation()
-	 * @generated
-	 */
-	void setNotation(String value);
-
-} // ArtifactDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/BreakdownElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/BreakdownElement.java
deleted file mode 100644
index 68976ee..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/BreakdownElement.java
+++ /dev/null
@@ -1,253 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Breakdown Element is an abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getPrefix <em>Prefix</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getIsPlanned <em>Is Planned</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getHasMultipleOccurrences <em>Has Multiple Occurrences</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getIsOptional <em>Is Optional</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getPresentedAfter <em>Presented After</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getPresentedBefore <em>Presented Before</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getPlanningData <em>Planning Data</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElement#getSuperActivities <em>Super Activities</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement()
- * @model abstract="true"
- * @generated
- */
-public interface BreakdownElement extends ProcessElement {
-	/**
-	 * Returns the value of the '<em><b>Prefix</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. "SRA.Establish Requirements" with SRA indicating that this Activity belongs to the "Software Requirements Analysis" module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, "Customer.Architect" would define a "Customer" prefix for the Role Descriptor "Architect" expressing that this is an architect on the customer side and not the development team side.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Prefix</em>' attribute.
-	 * @see #setPrefix(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_Prefix()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getPrefix();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getPrefix <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Prefix</em>' attribute.
-	 * @see #getPrefix()
-	 * @generated
-	 */
-	void setPrefix(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Is Planned</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-	 * 
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Planned</em>' attribute.
-	 * @see #setIsPlanned(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_IsPlanned()
-	 * @model default="true"
-	 * @generated
-	 */
-	Boolean getIsPlanned();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getIsPlanned <em>Is Planned</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Planned</em>' attribute.
-	 * @see #getIsPlanned()
-	 * @generated
-	 */
-	void setIsPlanned(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as "Detail Use Case" would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Has Multiple Occurrences</em>' attribute.
-	 * @see #setHasMultipleOccurrences(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_HasMultipleOccurrences()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getHasMultipleOccurrences();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getHasMultipleOccurrences <em>Has Multiple Occurrences</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Has Multiple Occurrences</em>' attribute.
-	 * @see #getHasMultipleOccurrences()
-	 * @generated
-	 */
-	void setHasMultipleOccurrences(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Is Optional</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The isOptional attribute indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Optional</em>' attribute.
-	 * @see #setIsOptional(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_IsOptional()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getIsOptional();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getIsOptional <em>Is Optional</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Optional</em>' attribute.
-	 * @see #getIsOptional()
-	 * @generated
-	 */
-	void setIsOptional(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presented After</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Presented After</em>' reference.
-	 * @see #setPresentedAfter(BreakdownElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_PresentedAfter()
-	 * @model
-	 * @generated
-	 */
-	BreakdownElement getPresentedAfter();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getPresentedAfter <em>Presented After</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presented After</em>' reference.
-	 * @see #getPresentedAfter()
-	 * @generated
-	 */
-	void setPresentedAfter(BreakdownElement value);
-
-	/**
-	 * Returns the value of the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presented Before</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Presented Before</em>' reference.
-	 * @see #setPresentedBefore(BreakdownElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_PresentedBefore()
-	 * @model
-	 * @generated
-	 */
-	BreakdownElement getPresentedBefore();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getPresentedBefore <em>Presented Before</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presented Before</em>' reference.
-	 * @see #getPresentedBefore()
-	 * @generated
-	 */
-	void setPresentedBefore(BreakdownElement value);
-
-	/**
-	 * Returns the value of the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Planning Data</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>Planning Data</em>' containment reference.
-	 * @see #setPlanningData(PlanningData)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_PlanningData()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	PlanningData getPlanningData();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getPlanningData <em>Planning Data</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Planning Data</em>' containment reference.
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	void setPlanningData(PlanningData value);
-
-	/**
-	 * Returns the value of the '<em><b>Super Activities</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Activity#getBreakdownElements <em>Breakdown Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Super Activities</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Super Activities</em>' reference.
-	 * @see #setSuperActivities(Activity)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElement_SuperActivities()
-	 * @see org.eclipse.epf.uma.Activity#getBreakdownElements
-	 * @model opposite="breakdownElements"
-	 * @generated
-	 */
-	Activity getSuperActivities();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElement#getSuperActivities <em>Super Activities</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Super Activities</em>' reference.
-	 * @see #getSuperActivities()
-	 * @generated
-	 */
-	void setSuperActivities(Activity value);
-
-} // BreakdownElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/BreakdownElementDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/BreakdownElementDescription.java
deleted file mode 100644
index aa98e9b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/BreakdownElementDescription.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Breakdown Element Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.BreakdownElementDescription#getUsageGuidance <em>Usage Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElementDescription()
- * @model
- * @generated
- */
-public interface BreakdownElementDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Usage Guidance</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Usage Guidance</em>' attribute.
-	 * @see #setUsageGuidance(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getBreakdownElementDescription_UsageGuidance()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getUsageGuidance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.BreakdownElementDescription#getUsageGuidance <em>Usage Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Usage Guidance</em>' attribute.
-	 * @see #getUsageGuidance()
-	 * @generated
-	 */
-	void setUsageGuidance(String value);
-
-} // BreakdownElementDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CapabilityPattern.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CapabilityPattern.java
deleted file mode 100644
index b30fd84..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CapabilityPattern.java
+++ /dev/null
@@ -1,32 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Capability Pattern</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Capability Pattern is a special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
- * A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
- * - To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
- * - To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
- * - To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getCapabilityPattern()
- * @model
- * @generated
- */
-public interface CapabilityPattern extends org.eclipse.epf.uma.Process {
-} // CapabilityPattern
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Checklist.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Checklist.java
deleted file mode 100644
index 22f8e1e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Checklist.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Checklist</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Checklist is a specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. 
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getChecklist()
- * @model
- * @generated
- */
-public interface Checklist extends Guidance {
-} // Checklist
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Classifier.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Classifier.java
deleted file mode 100644
index b154b90..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Classifier.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Classifier</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * UML 2.0 meta-class Classifier.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getClassifier()
- * @model abstract="true"
- * @generated
- */
-public interface Classifier extends Type {
-} // Classifier
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CompositeRole.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CompositeRole.java
deleted file mode 100644
index 06bda71..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CompositeRole.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Composite Role</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Composite Role is a special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
- * A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.CompositeRole#getAggregatedRoles <em>Aggregated Roles</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getCompositeRole()
- * @model
- * @generated
- */
-public interface CompositeRole extends RoleDescriptor {
-	/**
-	 * Returns the value of the '<em><b>Aggregated Roles</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Role}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Aggregated Roles</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Aggregated Roles</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getCompositeRole_AggregatedRoles()
-	 * @model type="org.eclipse.epf.uma.Role" ordered="false"
-	 * @generated
-	 */
-	List getAggregatedRoles();
-
-} // CompositeRole
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Concept.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Concept.java
deleted file mode 100644
index 9092134..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Concept.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Concept</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Concept is a specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getConcept()
- * @model
- * @generated
- */
-public interface Concept extends Guidance {
-} // Concept
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Constraint.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Constraint.java
deleted file mode 100644
index 6a3c9ac..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Constraint.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Constraint</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Constraint is a Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Constraint#getBody <em>Body</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getConstraint()
- * @model
- * @generated
- */
-public interface Constraint extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Body</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attribute stores the definition of the constraint.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Body</em>' attribute.
-	 * @see #setBody(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getConstraint_Body()
-	 * @model default="" unique="false" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getBody();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Constraint#getBody <em>Body</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Body</em>' attribute.
-	 * @see #getBody()
-	 * @generated
-	 */
-	void setBody(String value);
-
-} // Constraint
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentCategory.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentCategory.java
deleted file mode 100644
index 75b13a2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentCategory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Category</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Content Category is an abstract class generalizing content category types.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getContentCategory()
- * @model abstract="true"
- * @generated
- */
-public interface ContentCategory extends ContentElement {
-} // ContentCategory
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentDescription.java
deleted file mode 100644
index e6bdca8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentDescription.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Content Description is a Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ContentDescription#getMainDescription <em>Main Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentDescription#getSections <em>Sections</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentDescription#getExternalId <em>External Id</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentDescription#getKeyConsiderations <em>Key Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getContentDescription()
- * @model
- * @generated
- */
-public interface ContentDescription extends MethodUnit {
-	/**
-	 * Returns the value of the '<em><b>Main Description</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attribute store the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Main Description</em>' attribute.
-	 * @see #setMainDescription(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentDescription_MainDescription()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getMainDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ContentDescription#getMainDescription <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Main Description</em>' attribute.
-	 * @see #getMainDescription()
-	 * @generated
-	 */
-	void setMainDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Sections</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Section}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sections</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>Sections</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentDescription_Sections()
-	 * @model type="org.eclipse.epf.uma.Section" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getSections();
-
-	/**
-	 * Returns the value of the '<em><b>External Id</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * An external visible number that is used to reference this artifact. Used like a synonym.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Id</em>' attribute.
-	 * @see #setExternalId(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentDescription_ExternalId()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getExternalId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ContentDescription#getExternalId <em>External Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Id</em>' attribute.
-	 * @see #getExternalId()
-	 * @generated
-	 */
-	void setExternalId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Key Considerations</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Key Considerations provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Key Considerations</em>' attribute.
-	 * @see #setKeyConsiderations(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentDescription_KeyConsiderations()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getKeyConsiderations();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ContentDescription#getKeyConsiderations <em>Key Considerations</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key Considerations</em>' attribute.
-	 * @see #getKeyConsiderations()
-	 * @generated
-	 */
-	void setKeyConsiderations(String value);
-
-} // ContentDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentElement.java
deleted file mode 100644
index 90998ae..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentElement.java
+++ /dev/null
@@ -1,155 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Content Element is a Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
- * Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ContentElement#getSupportingMaterials <em>Supporting Materials</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentElement#getConceptsAndPapers <em>Concepts And Papers</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentElement#getChecklists <em>Checklists</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentElement#getGuidelines <em>Guidelines</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentElement#getExamples <em>Examples</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentElement#getAssets <em>Assets</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ContentElement#getTermDefinition <em>Term Definition</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getContentElement()
- * @model abstract="true"
- * @generated
- */
-public interface ContentElement extends DescribableElement, VariabilityElement {
-	/**
-	 * Returns the value of the '<em><b>Supporting Materials</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.SupportingMaterial}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Supporting Materials</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Supporting Materials</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentElement_SupportingMaterials()
-	 * @model type="org.eclipse.epf.uma.SupportingMaterial" ordered="false"
-	 * @generated
-	 */
-	List getSupportingMaterials();
-
-	/**
-	 * Returns the value of the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Concept}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Concepts And Papers</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Concepts And Papers</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentElement_ConceptsAndPapers()
-	 * @model type="org.eclipse.epf.uma.Concept" ordered="false"
-	 * @generated
-	 */
-	List getConceptsAndPapers();
-
-	/**
-	 * Returns the value of the '<em><b>Checklists</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Checklist}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Checklists</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Checklists</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentElement_Checklists()
-	 * @model type="org.eclipse.epf.uma.Checklist" ordered="false"
-	 * @generated
-	 */
-	List getChecklists();
-
-	/**
-	 * Returns the value of the '<em><b>Guidelines</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Guideline}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Guidelines</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Guidelines</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentElement_Guidelines()
-	 * @model type="org.eclipse.epf.uma.Guideline" ordered="false"
-	 * @generated
-	 */
-	List getGuidelines();
-
-	/**
-	 * Returns the value of the '<em><b>Examples</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Example}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Examples</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Examples</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentElement_Examples()
-	 * @model type="org.eclipse.epf.uma.Example" ordered="false"
-	 * @generated
-	 */
-	List getExamples();
-
-	/**
-	 * Returns the value of the '<em><b>Assets</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ReusableAsset}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Assets</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Assets</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentElement_Assets()
-	 * @model type="org.eclipse.epf.uma.ReusableAsset" ordered="false"
-	 * @generated
-	 */
-	List getAssets();
-
-	/**
-	 * Returns the value of the '<em><b>Term Definition</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.TermDefinition}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Term Definition</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Term Definition</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentElement_TermDefinition()
-	 * @model type="org.eclipse.epf.uma.TermDefinition" ordered="false"
-	 * @generated
-	 */
-	List getTermDefinition();
-
-} // ContentElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentPackage.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentPackage.java
deleted file mode 100644
index 57a3f2a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ContentPackage.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Content Package is special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ContentPackage#getContentElements <em>Content Elements</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getContentPackage()
- * @model
- * @generated
- */
-public interface ContentPackage extends MethodPackage {
-	/**
-	 * Returns the value of the '<em><b>Content Elements</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ContentElement}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Content Elements</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>Content Elements</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getContentPackage_ContentElements()
-	 * @model type="org.eclipse.epf.uma.ContentElement" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getContentElements();
-
-} // ContentPackage
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CoreSemanticModelBridge.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CoreSemanticModelBridge.java
deleted file mode 100644
index 585ffc9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CoreSemanticModelBridge.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Core Semantic Model Bridge</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.CoreSemanticModelBridge#getElement <em>Element</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getCoreSemanticModelBridge()
- * @model
- * @generated
- */
-public interface CoreSemanticModelBridge extends SemanticModelBridge {
-	/**
-	 * Returns the value of the '<em><b>Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Element</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Element</em>' reference.
-	 * @see #setElement(Element)
-	 * @see org.eclipse.epf.uma.UmaPackage#getCoreSemanticModelBridge_Element()
-	 * @model required="true"
-	 * @generated
-	 */
-	Element getElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.CoreSemanticModelBridge#getElement <em>Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Element</em>' reference.
-	 * @see #getElement()
-	 * @generated
-	 */
-	void setElement(Element value);
-
-} // CoreSemanticModelBridge
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CustomCategory.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CustomCategory.java
deleted file mode 100644
index a222795..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/CustomCategory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Custom Category</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Custom Category is a category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a "Testing" category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.CustomCategory#getCategorizedElements <em>Categorized Elements</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.CustomCategory#getSubCategories <em>Sub Categories</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getCustomCategory()
- * @model
- * @generated
- */
-public interface CustomCategory extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Categorized Elements</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.DescribableElement}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Categorized Elements</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Categorized Elements</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getCustomCategory_CategorizedElements()
-	 * @model type="org.eclipse.epf.uma.DescribableElement" ordered="false"
-	 * @generated
-	 */
-	List getCategorizedElements();
-
-	/**
-	 * Returns the value of the '<em><b>Sub Categories</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ContentCategory}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Categories</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Sub Categories</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getCustomCategory_SubCategories()
-	 * @model type="org.eclipse.epf.uma.ContentCategory" ordered="false"
-	 * @generated
-	 */
-	List getSubCategories();
-
-} // CustomCategory
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Deliverable.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Deliverable.java
deleted file mode 100644
index c120c37..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Deliverable.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Deliverable</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A deliverable is a Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Deliverable#getDeliveredWorkProducts <em>Delivered Work Products</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDeliverable()
- * @model
- * @generated
- */
-public interface Deliverable extends WorkProduct {
-	/**
-	 * Returns the value of the '<em><b>Delivered Work Products</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Delivered Work Products</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Delivered Work Products</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliverable_DeliveredWorkProducts()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" ordered="false"
-	 * @generated
-	 */
-	List getDeliveredWorkProducts();
-
-} // Deliverable
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliverableDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliverableDescription.java
deleted file mode 100644
index 0094dd8..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliverableDescription.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Deliverable Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DeliverableDescription#getExternalDescription <em>External Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DeliverableDescription#getPackagingGuidance <em>Packaging Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDeliverableDescription()
- * @model
- * @generated
- */
-public interface DeliverableDescription extends WorkProductDescription {
-	/**
-	 * Returns the value of the '<em><b>External Description</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Description</em>' attribute.
-	 * @see #setExternalDescription(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliverableDescription_ExternalDescription()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getExternalDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliverableDescription#getExternalDescription <em>External Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Description</em>' attribute.
-	 * @see #getExternalDescription()
-	 * @generated
-	 */
-	void setExternalDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Packaging Guidance</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Packaging Guidance</em>' attribute.
-	 * @see #setPackagingGuidance(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliverableDescription_PackagingGuidance()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getPackagingGuidance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliverableDescription#getPackagingGuidance <em>Packaging Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Packaging Guidance</em>' attribute.
-	 * @see #getPackagingGuidance()
-	 * @generated
-	 */
-	void setPackagingGuidance(String value);
-
-} // DeliverableDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliveryProcess.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliveryProcess.java
deleted file mode 100644
index 7893ea4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliveryProcess.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Delivery Process</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Delivery Processes is a special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
- * A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcess#getEducationMaterials <em>Education Materials</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcess#getCommunicationsMaterials <em>Communications Materials</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcess()
- * @model
- * @generated
- */
-public interface DeliveryProcess extends org.eclipse.epf.uma.Process {
-	/**
-	 * Returns the value of the '<em><b>Education Materials</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.SupportingMaterial}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Education Materials</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Education Materials</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcess_EducationMaterials()
-	 * @model type="org.eclipse.epf.uma.SupportingMaterial" ordered="false"
-	 * @generated
-	 */
-	List getEducationMaterials();
-
-	/**
-	 * Returns the value of the '<em><b>Communications Materials</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.SupportingMaterial}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Communications Materials</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Communications Materials</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcess_CommunicationsMaterials()
-	 * @model type="org.eclipse.epf.uma.SupportingMaterial" ordered="false"
-	 * @generated
-	 */
-	List getCommunicationsMaterials();
-
-} // DeliveryProcess
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliveryProcessDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliveryProcessDescription.java
deleted file mode 100644
index 09a169e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DeliveryProcessDescription.java
+++ /dev/null
@@ -1,191 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Delivery Process Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcessDescription#getScale <em>Scale</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcessDescription#getProjectCharacteristics <em>Project Characteristics</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcessDescription#getRiskLevel <em>Risk Level</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcessDescription#getEstimatingTechnique <em>Estimating Technique</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcessDescription#getProjectMemberExpertise <em>Project Member Expertise</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DeliveryProcessDescription#getTypeOfContract <em>Type Of Contract</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcessDescription()
- * @model
- * @generated
- */
-public interface DeliveryProcessDescription extends ProcessDescription {
-	/**
-	 * Returns the value of the '<em><b>Scale</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Scale</em>' attribute.
-	 * @see #setScale(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcessDescription_Scale()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getScale();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getScale <em>Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Scale</em>' attribute.
-	 * @see #getScale()
-	 * @generated
-	 */
-	void setScale(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Project Characteristics</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Characterizes the project that would typically perform this Process
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Project Characteristics</em>' attribute.
-	 * @see #setProjectCharacteristics(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcessDescription_ProjectCharacteristics()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getProjectCharacteristics();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getProjectCharacteristics <em>Project Characteristics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Project Characteristics</em>' attribute.
-	 * @see #getProjectCharacteristics()
-	 * @generated
-	 */
-	void setProjectCharacteristics(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Risk Level</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Outlines typical project risks that are addressed with this process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Risk Level</em>' attribute.
-	 * @see #setRiskLevel(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcessDescription_RiskLevel()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getRiskLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getRiskLevel <em>Risk Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Risk Level</em>' attribute.
-	 * @see #getRiskLevel()
-	 * @generated
-	 */
-	void setRiskLevel(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Estimating Technique</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes the Estimation Techniques provided for this Process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Estimating Technique</em>' attribute.
-	 * @see #setEstimatingTechnique(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcessDescription_EstimatingTechnique()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getEstimatingTechnique();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getEstimatingTechnique <em>Estimating Technique</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Estimating Technique</em>' attribute.
-	 * @see #getEstimatingTechnique()
-	 * @generated
-	 */
-	void setEstimatingTechnique(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Project Member Expertise</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Project Member Expertise</em>' attribute.
-	 * @see #setProjectMemberExpertise(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcessDescription_ProjectMemberExpertise()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getProjectMemberExpertise();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getProjectMemberExpertise <em>Project Member Expertise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Project Member Expertise</em>' attribute.
-	 * @see #getProjectMemberExpertise()
-	 * @generated
-	 */
-	void setProjectMemberExpertise(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type Of Contract</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides background information about the contracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type Of Contract</em>' attribute.
-	 * @see #setTypeOfContract(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDeliveryProcessDescription_TypeOfContract()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getTypeOfContract();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getTypeOfContract <em>Type Of Contract</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type Of Contract</em>' attribute.
-	 * @see #getTypeOfContract()
-	 * @generated
-	 */
-	void setTypeOfContract(String value);
-
-} // DeliveryProcessDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DescribableElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DescribableElement.java
deleted file mode 100644
index 70f80ae..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DescribableElement.java
+++ /dev/null
@@ -1,142 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.net.URI;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Describable Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Describable Element is an abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
- * This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance (see Section 4.1.4).  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DescribableElement#getPresentationName <em>Presentation Name</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DescribableElement#getPresentation <em>Presentation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DescribableElement#getShapeicon <em>Shapeicon</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DescribableElement#getNodeicon <em>Nodeicon</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDescribableElement()
- * @model abstract="true"
- * @generated
- */
-public interface DescribableElement extends MethodElement, Classifier {
-	/**
-	 * Returns the value of the '<em><b>Presentation Name</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to "rup_architecture_document" to differentiate from a "j2ee_architcture_document" whereas the external presentation would always be "Architecture Document".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Presentation Name</em>' attribute.
-	 * @see #setPresentationName(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDescribableElement_PresentationName()
-	 * @model default="" unique="false" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getPresentationName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DescribableElement#getPresentationName <em>Presentation Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presentation Name</em>' attribute.
-	 * @see #getPresentationName()
-	 * @generated
-	 */
-	void setPresentationName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presentation</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</em>' containment reference.
-	 * @see #setPresentation(ContentDescription)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDescribableElement_Presentation()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	ContentDescription getPresentation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DescribableElement#getPresentation <em>Presentation</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presentation</em>' containment reference.
-	 * @see #getPresentation()
-	 * @generated
-	 */
-	void setPresentation(ContentDescription value);
-
-	/**
-	 * Returns the value of the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Shapeicon</em>' attribute.
-	 * @see #setShapeicon(URI)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDescribableElement_Shapeicon()
-	 * @model unique="false" dataType="org.eclipse.epf.uma.Uri"
-	 * @generated
-	 */
-	URI getShapeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DescribableElement#getShapeicon <em>Shapeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Shapeicon</em>' attribute.
-	 * @see #getShapeicon()
-	 * @generated
-	 */
-	void setShapeicon(URI value);
-
-	/**
-	 * Returns the value of the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A reference to an icon that can be used in tree browser presentations and breakdown structures.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Nodeicon</em>' attribute.
-	 * @see #setNodeicon(URI)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDescribableElement_Nodeicon()
-	 * @model dataType="org.eclipse.epf.uma.Uri"
-	 * @generated
-	 */
-	URI getNodeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DescribableElement#getNodeicon <em>Nodeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Nodeicon</em>' attribute.
-	 * @see #getNodeicon()
-	 * @generated
-	 */
-	void setNodeicon(URI value);
-
-} // DescribableElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Descriptor.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Descriptor.java
deleted file mode 100644
index f091f9c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Descriptor.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Descriptor is an abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
- * Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Descriptor#getIsSynchronizedWithSource <em>Is Synchronized With Source</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDescriptor()
- * @model abstract="true"
- * @generated
- */
-public interface Descriptor extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Is Synchronized With Source</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Is Synchronized With Source</em>' attribute.
-	 * @see #setIsSynchronizedWithSource(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDescriptor_IsSynchronizedWithSource()
-	 * @model default="true"
-	 * @generated
-	 */
-	Boolean getIsSynchronizedWithSource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Descriptor#getIsSynchronizedWithSource <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Synchronized With Source</em>' attribute.
-	 * @see #getIsSynchronizedWithSource()
-	 * @generated
-	 */
-	void setIsSynchronizedWithSource(Boolean value);
-
-} // Descriptor
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DescriptorDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DescriptorDescription.java
deleted file mode 100644
index b56687a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DescriptorDescription.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Descriptor Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DescriptorDescription#getRefinedDescription <em>Refined Description</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDescriptorDescription()
- * @model
- * @generated
- */
-public interface DescriptorDescription extends BreakdownElementDescription {
-	/**
-	 * Returns the value of the '<em><b>Refined Description</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Refined Description</em>' attribute.
-	 * @see #setRefinedDescription(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDescriptorDescription_RefinedDescription()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getRefinedDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DescriptorDescription#getRefinedDescription <em>Refined Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Refined Description</em>' attribute.
-	 * @see #getRefinedDescription()
-	 * @generated
-	 */
-	void setRefinedDescription(String value);
-
-} // DescriptorDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Diagram.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Diagram.java
deleted file mode 100644
index 1404d99..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Diagram.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Diagram</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Diagram#getZoom <em>Zoom</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Diagram#getViewpoint <em>Viewpoint</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Diagram#getDiagramLink <em>Diagram Link</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Diagram#getNamespace <em>Namespace</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDiagram()
- * @model
- * @generated
- */
-public interface Diagram extends GraphNode {
-	/**
-	 * Returns the value of the '<em><b>Zoom</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Zoom</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Zoom</em>' attribute.
-	 * @see #setZoom(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagram_Zoom()
-	 * @model
-	 * @generated
-	 */
-	Double getZoom();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Diagram#getZoom <em>Zoom</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Zoom</em>' attribute.
-	 * @see #getZoom()
-	 * @generated
-	 */
-	void setZoom(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Viewpoint</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Viewpoint</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>Viewpoint</em>' containment reference.
-	 * @see #setViewpoint(Point)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagram_Viewpoint()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	Point getViewpoint();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Diagram#getViewpoint <em>Viewpoint</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Viewpoint</em>' containment reference.
-	 * @see #getViewpoint()
-	 * @generated
-	 */
-	void setViewpoint(Point value);
-
-	/**
-	 * Returns the value of the '<em><b>Diagram Link</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.DiagramLink}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.DiagramLink#getDiagram <em>Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Diagram Link</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Diagram Link</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagram_DiagramLink()
-	 * @see org.eclipse.epf.uma.DiagramLink#getDiagram
-	 * @model type="org.eclipse.epf.uma.DiagramLink" opposite="diagram" ordered="false"
-	 * @generated
-	 */
-	List getDiagramLink();
-
-	/**
-	 * Returns the value of the '<em><b>Namespace</b></em>' containment reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.SemanticModelBridge#getDiagram <em>Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Namespace</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>Namespace</em>' containment reference.
-	 * @see #setNamespace(SemanticModelBridge)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagram_Namespace()
-	 * @see org.eclipse.epf.uma.SemanticModelBridge#getDiagram
-	 * @model opposite="diagram" containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	SemanticModelBridge getNamespace();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Diagram#getNamespace <em>Namespace</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Namespace</em>' containment reference.
-	 * @see #getNamespace()
-	 * @generated
-	 */
-	void setNamespace(SemanticModelBridge value);
-
-} // Diagram
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DiagramElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DiagramElement.java
deleted file mode 100644
index a888a57..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DiagramElement.java
+++ /dev/null
@@ -1,124 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Diagram Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DiagramElement#getIsVisible <em>Is Visible</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DiagramElement#getContainer_ <em>Container</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DiagramElement#getReference <em>Reference</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DiagramElement#getProperty <em>Property</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDiagramElement()
- * @model abstract="true"
- * @generated
- */
-public interface DiagramElement extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Is Visible</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Is Visible</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Is Visible</em>' attribute.
-	 * @see #setIsVisible(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramElement_IsVisible()
-	 * @model default="true"
-	 * @generated
-	 */
-	Boolean getIsVisible();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DiagramElement#getIsVisible <em>Is Visible</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Visible</em>' attribute.
-	 * @see #getIsVisible()
-	 * @generated
-	 */
-	void setIsVisible(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Container</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.GraphElement#getContained <em>Contained</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Container</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Container</em>' container reference.
-	 * @see #setContainer(GraphElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramElement_Container()
-	 * @see org.eclipse.epf.uma.GraphElement#getContained
-	 * @model opposite="contained"
-	 * @generated
-	 */
-	GraphElement getContainer_();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DiagramElement#getContainer_ <em>Container</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Container</em>' container reference.
-	 * @see #getContainer_()
-	 * @generated
-	 */
-	void setContainer(GraphElement value);
-
-	/**
-	 * Returns the value of the '<em><b>Reference</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Reference}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Reference#getReferenced <em>Referenced</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reference</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Reference</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramElement_Reference()
-	 * @see org.eclipse.epf.uma.Reference#getReferenced
-	 * @model type="org.eclipse.epf.uma.Reference" opposite="referenced" ordered="false"
-	 * @generated
-	 */
-	List getReference();
-
-	/**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Property}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</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>Property</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramElement_Property()
-	 * @model type="org.eclipse.epf.uma.Property" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getProperty();
-
-} // DiagramElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DiagramLink.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DiagramLink.java
deleted file mode 100644
index d67b587..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DiagramLink.java
+++ /dev/null
@@ -1,141 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Diagram Link</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DiagramLink#getZoom <em>Zoom</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DiagramLink#getViewport <em>Viewport</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DiagramLink#getGraphElement <em>Graph Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.DiagramLink#getDiagram <em>Diagram</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDiagramLink()
- * @model
- * @generated
- */
-public interface DiagramLink extends DiagramElement {
-	/**
-	 * Returns the value of the '<em><b>Zoom</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Zoom</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Zoom</em>' attribute.
-	 * @see #setZoom(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramLink_Zoom()
-	 * @model
-	 * @generated
-	 */
-	Double getZoom();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DiagramLink#getZoom <em>Zoom</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Zoom</em>' attribute.
-	 * @see #getZoom()
-	 * @generated
-	 */
-	void setZoom(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Viewport</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Viewport</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>Viewport</em>' containment reference.
-	 * @see #setViewport(Point)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramLink_Viewport()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	Point getViewport();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DiagramLink#getViewport <em>Viewport</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Viewport</em>' containment reference.
-	 * @see #getViewport()
-	 * @generated
-	 */
-	void setViewport(Point value);
-
-	/**
-	 * Returns the value of the '<em><b>Graph Element</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.GraphElement#getLink <em>Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Graph Element</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Graph Element</em>' container reference.
-	 * @see #setGraphElement(GraphElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramLink_GraphElement()
-	 * @see org.eclipse.epf.uma.GraphElement#getLink
-	 * @model opposite="link" required="true"
-	 * @generated
-	 */
-	GraphElement getGraphElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DiagramLink#getGraphElement <em>Graph Element</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Graph Element</em>' container reference.
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	void setGraphElement(GraphElement value);
-
-	/**
-	 * Returns the value of the '<em><b>Diagram</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Diagram#getDiagramLink <em>Diagram Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Diagram</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Diagram</em>' reference.
-	 * @see #setDiagram(Diagram)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiagramLink_Diagram()
-	 * @see org.eclipse.epf.uma.Diagram#getDiagramLink
-	 * @model opposite="diagramLink" required="true"
-	 * @generated
-	 */
-	Diagram getDiagram();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.DiagramLink#getDiagram <em>Diagram</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Diagram</em>' reference.
-	 * @see #getDiagram()
-	 * @generated
-	 */
-	void setDiagram(Diagram value);
-
-} // DiagramLink
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Dimension.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Dimension.java
deleted file mode 100644
index 81acbcf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Dimension.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import org.eclipse.epf.uma.ecore.IModelObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Dimension</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Dimension#getWidth <em>Width</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Dimension#getHeight <em>Height</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDimension()
- * @model
- * @extends IModelObject
- * @generated
- */
-public interface Dimension extends IModelObject {
-	/**
-	 * Returns the value of the '<em><b>Width</b></em>' attribute.
-	 * <!-- 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 #setWidth(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDimension_Width()
-	 * @model
-	 * @generated
-	 */
-	Double getWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Dimension#getWidth <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Width</em>' attribute.
-	 * @see #getWidth()
-	 * @generated
-	 */
-	void setWidth(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Height</em>' attribute.
-	 * @see #setHeight(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getDimension_Height()
-	 * @model
-	 * @generated
-	 */
-	Double getHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Dimension#getHeight <em>Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Height</em>' attribute.
-	 * @see #getHeight()
-	 * @generated
-	 */
-	void setHeight(Double value);
-
-} // Dimension
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Discipline.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Discipline.java
deleted file mode 100644
index 91652d2..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Discipline.java
+++ /dev/null
@@ -1,87 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Discipline</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Discipline is a categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
- * A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Discipline#getTasks <em>Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Discipline#getSubdiscipline <em>Subdiscipline</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Discipline#getReferenceWorkflows <em>Reference Workflows</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDiscipline()
- * @model
- * @generated
- */
-public interface Discipline extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Tasks</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Task}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tasks</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tasks</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiscipline_Tasks()
-	 * @model type="org.eclipse.epf.uma.Task" ordered="false"
-	 * @generated
-	 */
-	List getTasks();
-
-	/**
-	 * Returns the value of the '<em><b>Subdiscipline</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Discipline}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Subdiscipline</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>Subdiscipline</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiscipline_Subdiscipline()
-	 * @model type="org.eclipse.epf.uma.Discipline" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getSubdiscipline();
-
-	/**
-	 * Returns the value of the '<em><b>Reference Workflows</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Activity}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reference Workflows</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Reference Workflows</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDiscipline_ReferenceWorkflows()
-	 * @model type="org.eclipse.epf.uma.Activity" ordered="false"
-	 * @generated
-	 */
-	List getReferenceWorkflows();
-
-} // Discipline
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DisciplineGrouping.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DisciplineGrouping.java
deleted file mode 100644
index 0623f21..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/DisciplineGrouping.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Discipline Grouping</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Discipline Groupings are used to group Disciplines.  For example, the Discipline Grouping "Software Disciplines" would be the group of all disciplines related to developing software such as "Requirements Management" or "Testing"; "IT Infrastructure Management" would be a Disciplines Grouping for disciplines such as "IT Operational Services", "IT Customer Relationships", or "IT Enabling Services".  Disciplines can be associated to more than one Discipline Grouping.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.DisciplineGrouping#getDisciplines <em>Disciplines</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDisciplineGrouping()
- * @model
- * @generated
- */
-public interface DisciplineGrouping extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Disciplines</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Discipline}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Disciplines</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Disciplines</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDisciplineGrouping_Disciplines()
-	 * @model type="org.eclipse.epf.uma.Discipline" ordered="false"
-	 * @generated
-	 */
-	List getDisciplines();
-
-} // DisciplineGrouping
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Domain.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Domain.java
deleted file mode 100644
index 1689009..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Domain.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Domain</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Domain is a refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
- * Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Domain#getWorkProducts <em>Work Products</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Domain#getSubdomains <em>Subdomains</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getDomain()
- * @model
- * @generated
- */
-public interface Domain extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Work Products</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Products</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Work Products</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDomain_WorkProducts()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" ordered="false"
-	 * @generated
-	 */
-	List getWorkProducts();
-
-	/**
-	 * Returns the value of the '<em><b>Subdomains</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Domain}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Subdomains</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>Subdomains</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getDomain_Subdomains()
-	 * @model type="org.eclipse.epf.uma.Domain" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getSubdomains();
-
-} // Domain
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Element.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Element.java
deleted file mode 100644
index 6614af9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Element.java
+++ /dev/null
@@ -1,31 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import org.eclipse.epf.uma.ecore.IModelObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * UML 2.0 meta-class Element.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getElement()
- * @model abstract="true"
- * @extends IModelObject
- * @generated
- */
-public interface Element extends IModelObject {
-} // Element
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Ellipse.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Ellipse.java
deleted file mode 100644
index 59cadcb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Ellipse.java
+++ /dev/null
@@ -1,191 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ellipse</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Ellipse#getRadiusX <em>Radius X</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Ellipse#getRadiusY <em>Radius Y</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Ellipse#getRotation <em>Rotation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Ellipse#getStartAngle <em>Start Angle</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Ellipse#getEndAngle <em>End Angle</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Ellipse#getCenter <em>Center</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getEllipse()
- * @model
- * @generated
- */
-public interface Ellipse extends GraphicPrimitive {
-	/**
-	 * Returns the value of the '<em><b>Radius X</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Radius X</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Radius X</em>' attribute.
-	 * @see #setRadiusX(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getEllipse_RadiusX()
-	 * @model
-	 * @generated
-	 */
-	Double getRadiusX();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Ellipse#getRadiusX <em>Radius X</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Radius X</em>' attribute.
-	 * @see #getRadiusX()
-	 * @generated
-	 */
-	void setRadiusX(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Radius Y</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Radius Y</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Radius Y</em>' attribute.
-	 * @see #setRadiusY(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getEllipse_RadiusY()
-	 * @model
-	 * @generated
-	 */
-	Double getRadiusY();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Ellipse#getRadiusY <em>Radius Y</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Radius Y</em>' attribute.
-	 * @see #getRadiusY()
-	 * @generated
-	 */
-	void setRadiusY(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Rotation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Rotation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Rotation</em>' attribute.
-	 * @see #setRotation(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getEllipse_Rotation()
-	 * @model
-	 * @generated
-	 */
-	Double getRotation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Ellipse#getRotation <em>Rotation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rotation</em>' attribute.
-	 * @see #getRotation()
-	 * @generated
-	 */
-	void setRotation(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Start Angle</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Start Angle</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Start Angle</em>' attribute.
-	 * @see #setStartAngle(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getEllipse_StartAngle()
-	 * @model
-	 * @generated
-	 */
-	Double getStartAngle();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Ellipse#getStartAngle <em>Start Angle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start Angle</em>' attribute.
-	 * @see #getStartAngle()
-	 * @generated
-	 */
-	void setStartAngle(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>End Angle</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>End Angle</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>End Angle</em>' attribute.
-	 * @see #setEndAngle(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getEllipse_EndAngle()
-	 * @model
-	 * @generated
-	 */
-	Double getEndAngle();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Ellipse#getEndAngle <em>End Angle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>End Angle</em>' attribute.
-	 * @see #getEndAngle()
-	 * @generated
-	 */
-	void setEndAngle(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Center</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Center</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>Center</em>' containment reference.
-	 * @see #setCenter(Point)
-	 * @see org.eclipse.epf.uma.UmaPackage#getEllipse_Center()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	Point getCenter();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Ellipse#getCenter <em>Center</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Center</em>' containment reference.
-	 * @see #getCenter()
-	 * @generated
-	 */
-	void setCenter(Point value);
-
-} // Ellipse
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/EstimationConsiderations.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/EstimationConsiderations.java
deleted file mode 100644
index 71215de..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/EstimationConsiderations.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Estimation Considerations</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Estimation Considerations qualify the usage and application of estimation metrics in the development of an actual estimate.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getEstimationConsiderations()
- * @model
- * @generated
- */
-public interface EstimationConsiderations extends Guidance {
-} // EstimationConsiderations
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Example.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Example.java
deleted file mode 100644
index f6b874b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Example.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Example</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An Example is a specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getExample()
- * @model
- * @generated
- */
-public interface Example extends Guidance {
-} // Example
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphConnector.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphConnector.java
deleted file mode 100644
index 7813778..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphConnector.java
+++ /dev/null
@@ -1,79 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Graph Connector</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.GraphConnector#getGraphElement <em>Graph Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.GraphConnector#getGraphEdge <em>Graph Edge</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGraphConnector()
- * @model
- * @generated
- */
-public interface GraphConnector extends GraphElement {
-	/**
-	 * Returns the value of the '<em><b>Graph Element</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.GraphElement#getAnchorage <em>Anchorage</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Graph Element</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Graph Element</em>' container reference.
-	 * @see #setGraphElement(GraphElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphConnector_GraphElement()
-	 * @see org.eclipse.epf.uma.GraphElement#getAnchorage
-	 * @model opposite="anchorage" required="true"
-	 * @generated
-	 */
-	GraphElement getGraphElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.GraphConnector#getGraphElement <em>Graph Element</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Graph Element</em>' container reference.
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	void setGraphElement(GraphElement value);
-
-	/**
-	 * Returns the value of the '<em><b>Graph Edge</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.GraphEdge}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.GraphEdge#getAnchor <em>Anchor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Graph Edge</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Graph Edge</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphConnector_GraphEdge()
-	 * @see org.eclipse.epf.uma.GraphEdge#getAnchor
-	 * @model type="org.eclipse.epf.uma.GraphEdge" opposite="anchor" ordered="false"
-	 * @generated
-	 */
-	List getGraphEdge();
-
-} // GraphConnector
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphEdge.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphEdge.java
deleted file mode 100644
index 5a67524..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphEdge.java
+++ /dev/null
@@ -1,67 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Graph Edge</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.GraphEdge#getAnchor <em>Anchor</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.GraphEdge#getWaypoints <em>Waypoints</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGraphEdge()
- * @model
- * @generated
- */
-public interface GraphEdge extends GraphElement {
-	/**
-	 * Returns the value of the '<em><b>Anchor</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.GraphConnector}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.GraphConnector#getGraphEdge <em>Graph Edge</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Anchor</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Anchor</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphEdge_Anchor()
-	 * @see org.eclipse.epf.uma.GraphConnector#getGraphEdge
-	 * @model type="org.eclipse.epf.uma.GraphConnector" opposite="graphEdge" upper="2" ordered="false"
-	 * @generated
-	 */
-	List getAnchor();
-
-	/**
-	 * Returns the value of the '<em><b>Waypoints</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Point}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Waypoints</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>Waypoints</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphEdge_Waypoints()
-	 * @model type="org.eclipse.epf.uma.Point" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getWaypoints();
-
-} // GraphEdge
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphElement.java
deleted file mode 100644
index 3eec81b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphElement.java
+++ /dev/null
@@ -1,144 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Graph Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.GraphElement#getPosition <em>Position</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.GraphElement#getContained <em>Contained</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.GraphElement#getLink <em>Link</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.GraphElement#getAnchorage <em>Anchorage</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.GraphElement#getSemanticModel <em>Semantic Model</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGraphElement()
- * @model abstract="true"
- * @generated
- */
-public interface GraphElement extends DiagramElement {
-	/**
-	 * Returns the value of the '<em><b>Position</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Position</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>Position</em>' containment reference.
-	 * @see #setPosition(Point)
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphElement_Position()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	Point getPosition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.GraphElement#getPosition <em>Position</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Position</em>' containment reference.
-	 * @see #getPosition()
-	 * @generated
-	 */
-	void setPosition(Point value);
-
-	/**
-	 * Returns the value of the '<em><b>Contained</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.DiagramElement}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.DiagramElement#getContainer_ <em>Container</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Contained</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>Contained</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphElement_Contained()
-	 * @see org.eclipse.epf.uma.DiagramElement#getContainer_
-	 * @model type="org.eclipse.epf.uma.DiagramElement" opposite="container" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getContained();
-
-	/**
-	 * Returns the value of the '<em><b>Link</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.DiagramLink}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.DiagramLink#getGraphElement <em>Graph Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Link</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>Link</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphElement_Link()
-	 * @see org.eclipse.epf.uma.DiagramLink#getGraphElement
-	 * @model type="org.eclipse.epf.uma.DiagramLink" opposite="graphElement" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getLink();
-
-	/**
-	 * Returns the value of the '<em><b>Anchorage</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.GraphConnector}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.GraphConnector#getGraphElement <em>Graph Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Anchorage</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>Anchorage</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphElement_Anchorage()
-	 * @see org.eclipse.epf.uma.GraphConnector#getGraphElement
-	 * @model type="org.eclipse.epf.uma.GraphConnector" opposite="graphElement" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getAnchorage();
-
-	/**
-	 * Returns the value of the '<em><b>Semantic Model</b></em>' containment reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.SemanticModelBridge#getGraphElement <em>Graph Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Semantic Model</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>Semantic Model</em>' containment reference.
-	 * @see #setSemanticModel(SemanticModelBridge)
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphElement_SemanticModel()
-	 * @see org.eclipse.epf.uma.SemanticModelBridge#getGraphElement
-	 * @model opposite="graphElement" containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	SemanticModelBridge getSemanticModel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.GraphElement#getSemanticModel <em>Semantic Model</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Semantic Model</em>' containment reference.
-	 * @see #getSemanticModel()
-	 * @generated
-	 */
-	void setSemanticModel(SemanticModelBridge value);
-
-} // GraphElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphNode.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphNode.java
deleted file mode 100644
index 3978d44..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphNode.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Graph Node</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.GraphNode#getSize <em>Size</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGraphNode()
- * @model
- * @generated
- */
-public interface GraphNode extends GraphElement {
-	/**
-	 * Returns the value of the '<em><b>Size</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Size</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>Size</em>' containment reference.
-	 * @see #setSize(Dimension)
-	 * @see org.eclipse.epf.uma.UmaPackage#getGraphNode_Size()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	Dimension getSize();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.GraphNode#getSize <em>Size</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Size</em>' containment reference.
-	 * @see #getSize()
-	 * @generated
-	 */
-	void setSize(Dimension value);
-
-} // GraphNode
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphicPrimitive.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphicPrimitive.java
deleted file mode 100644
index b40c8cd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GraphicPrimitive.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Graphic Primitive</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGraphicPrimitive()
- * @model abstract="true"
- * @generated
- */
-public interface GraphicPrimitive extends LeafElement {
-} // GraphicPrimitive
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Guidance.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Guidance.java
deleted file mode 100644
index 6f6c460..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Guidance.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Guidance</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGuidance()
- * @model abstract="true"
- * @generated
- */
-public interface Guidance extends ContentElement {
-} // Guidance
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GuidanceDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GuidanceDescription.java
deleted file mode 100644
index 8314294..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/GuidanceDescription.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Guidance Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.GuidanceDescription#getAttachments <em>Attachments</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGuidanceDescription()
- * @model
- * @generated
- */
-public interface GuidanceDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Attachments</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attachments</em>' attribute.
-	 * @see #setAttachments(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getGuidanceDescription_Attachments()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getAttachments();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.GuidanceDescription#getAttachments <em>Attachments</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attachments</em>' attribute.
-	 * @see #getAttachments()
-	 * @generated
-	 */
-	void setAttachments(String value);
-
-} // GuidanceDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Guideline.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Guideline.java
deleted file mode 100644
index 3db18d0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Guideline.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Guideline</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Guideline is a specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getGuideline()
- * @model
- * @generated
- */
-public interface Guideline extends Guidance {
-} // Guideline
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Image.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Image.java
deleted file mode 100644
index c362e69..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Image.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.net.URI;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Image</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Image#getUri <em>Uri</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Image#getMimeType <em>Mime Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getImage()
- * @model
- * @generated
- */
-public interface Image extends LeafElement {
-	/**
-	 * Returns the value of the '<em><b>Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Uri</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Uri</em>' attribute.
-	 * @see #setUri(URI)
-	 * @see org.eclipse.epf.uma.UmaPackage#getImage_Uri()
-	 * @model dataType="org.eclipse.epf.uma.Uri"
-	 * @generated
-	 */
-	URI getUri();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Image#getUri <em>Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Uri</em>' attribute.
-	 * @see #getUri()
-	 * @generated
-	 */
-	void setUri(URI value);
-
-	/**
-	 * Returns the value of the '<em><b>Mime Type</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mime Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Mime Type</em>' attribute.
-	 * @see #setMimeType(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getImage_MimeType()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getMimeType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Image#getMimeType <em>Mime Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Mime Type</em>' attribute.
-	 * @see #getMimeType()
-	 * @generated
-	 */
-	void setMimeType(String value);
-
-} // Image
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Iteration.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Iteration.java
deleted file mode 100644
index 85bc672..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Iteration.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Iteration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Iteration is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
- * Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getIteration()
- * @model
- * @generated
- */
-public interface Iteration extends Activity {
-} // Iteration
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/LeafElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/LeafElement.java
deleted file mode 100644
index 9b8f9e0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/LeafElement.java
+++ /dev/null
@@ -1,24 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Leaf Element</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getLeafElement()
- * @model abstract="true"
- * @generated
- */
-public interface LeafElement extends DiagramElement {
-} // LeafElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodConfiguration.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodConfiguration.java
deleted file mode 100644
index da52fdb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodConfiguration.java
+++ /dev/null
@@ -1,164 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Configuration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Method Configuration is a collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.MethodConfiguration#getMethodPluginSelection <em>Method Plugin Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodConfiguration#getMethodPackageSelection <em>Method Package Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodConfiguration#getProcessViews <em>Process Views</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodConfiguration#getDefaultView <em>Default View</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodConfiguration#getBaseConfigurations <em>Base Configurations</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodConfiguration#getSubtractedCategory <em>Subtracted Category</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodConfiguration#getAddedCategory <em>Added Category</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration()
- * @model
- * @generated
- */
-public interface MethodConfiguration extends MethodUnit {
-	/**
-	 * Returns the value of the '<em><b>Method Plugin Selection</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodPlugin}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Plugin Selection</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Method Plugin Selection</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration_MethodPluginSelection()
-	 * @model type="org.eclipse.epf.uma.MethodPlugin" ordered="false"
-	 * @generated
-	 */
-	List getMethodPluginSelection();
-
-	/**
-	 * Returns the value of the '<em><b>Method Package Selection</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodPackage}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Package Selection</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Method Package Selection</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration_MethodPackageSelection()
-	 * @model type="org.eclipse.epf.uma.MethodPackage" ordered="false"
-	 * @generated
-	 */
-	List getMethodPackageSelection();
-
-	/**
-	 * Returns the value of the '<em><b>Process Views</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ContentCategory}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Process Views</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Process Views</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration_ProcessViews()
-	 * @model type="org.eclipse.epf.uma.ContentCategory" ordered="false"
-	 * @generated
-	 */
-	List getProcessViews();
-
-	/**
-	 * Returns the value of the '<em><b>Default View</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default View</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default View</em>' reference.
-	 * @see #setDefaultView(ContentCategory)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration_DefaultView()
-	 * @model
-	 * @generated
-	 */
-	ContentCategory getDefaultView();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodConfiguration#getDefaultView <em>Default View</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default View</em>' reference.
-	 * @see #getDefaultView()
-	 * @generated
-	 */
-	void setDefaultView(ContentCategory value);
-
-	/**
-	 * Returns the value of the '<em><b>Base Configurations</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodConfiguration}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Base Configurations</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Base Configurations</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration_BaseConfigurations()
-	 * @model type="org.eclipse.epf.uma.MethodConfiguration" ordered="false"
-	 * @generated
-	 */
-	List getBaseConfigurations();
-
-	/**
-	 * Returns the value of the '<em><b>Subtracted Category</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ContentCategory}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Subtracted Category</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Subtracted Category</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration_SubtractedCategory()
-	 * @model type="org.eclipse.epf.uma.ContentCategory" ordered="false"
-	 * @generated
-	 */
-	List getSubtractedCategory();
-
-	/**
-	 * Returns the value of the '<em><b>Added Category</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ContentCategory}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Added Category</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Added Category</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodConfiguration_AddedCategory()
-	 * @model type="org.eclipse.epf.uma.ContentCategory" ordered="false"
-	 * @generated
-	 */
-	List getAddedCategory();
-
-} // MethodConfiguration
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodElement.java
deleted file mode 100644
index 48309ee..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodElement.java
+++ /dev/null
@@ -1,177 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Every class defined in this specification is derived from Method Element.  In other words Method Element is the root generalization for all UMA classes and defines a common set of attributes inherited by every other element type of this model.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.  Method Element inherits the Name attribute from Packageable Element's super class.  Every element defined as a UMA instance is derived from Model Element.  Every Method Element in-stance is at least defined by a unique id, a name, as well as brief description.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.MethodElement#getGuid <em>Guid</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodElement#getBriefDescription <em>Brief Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodElement#getOwnedRules <em>Owned Rules</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodElement#getMethodElementProperty <em>Method Element Property</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodElement#getSuppressed <em>Suppressed</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodElement#getOrderingGuide <em>Ordering Guide</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMethodElement()
- * @model abstract="true"
- * @generated
- */
-public interface MethodElement extends PackageableElement {
-	/**
-	 * Returns the value of the '<em><b>Guid</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every instance of Method Element has a global unique id.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Guid</em>' attribute.
-	 * @see #setGuid(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodElement_Guid()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getGuid();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodElement#getGuid <em>Guid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Guid</em>' attribute.
-	 * @see #getGuid()
-	 * @generated
-	 */
-	void setGuid(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Brief Description</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Brief Description</em>' attribute.
-	 * @see #setBriefDescription(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodElement_BriefDescription()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getBriefDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodElement#getBriefDescription <em>Brief Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Brief Description</em>' attribute.
-	 * @see #getBriefDescription()
-	 * @generated
-	 */
-	void setBriefDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Constraint}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Owned Rules</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>Owned Rules</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodElement_OwnedRules()
-	 * @model type="org.eclipse.epf.uma.Constraint" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getOwnedRules();
-
-	/**
-	 * Returns the value of the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodElementProperty}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Element Property</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>Method Element Property</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodElement_MethodElementProperty()
-	 * @model type="org.eclipse.epf.uma.MethodElementProperty" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getMethodElementProperty();
-
-	/**
-	 * Returns the value of the '<em><b>Suppressed</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * If a Variability Element is derived from another Variability Element using the Extends Variability Specialization then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Suppressed</em>' attribute.
-	 * @see #setSuppressed(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodElement_Suppressed()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getSuppressed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodElement#getSuppressed <em>Suppressed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suppressed</em>' attribute.
-	 * @see #getSuppressed()
-	 * @generated
-	 */
-	void setSuppressed(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Ordering Guide</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attribute is used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Ordering Guide</em>' attribute.
-	 * @see #setOrderingGuide(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodElement_OrderingGuide()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getOrderingGuide();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodElement#getOrderingGuide <em>Ordering Guide</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ordering Guide</em>' attribute.
-	 * @see #getOrderingGuide()
-	 * @generated
-	 */
-	void setOrderingGuide(String value);
-
-} // MethodElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodElementProperty.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodElementProperty.java
deleted file mode 100644
index f26ad7a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodElementProperty.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Element Property</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.MethodElementProperty#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMethodElementProperty()
- * @model
- * @generated
- */
-public interface MethodElementProperty extends PackageableElement {
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodElementProperty_Value()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodElementProperty#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // MethodElementProperty
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodLibrary.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodLibrary.java
deleted file mode 100644
index c34f6c1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodLibrary.java
+++ /dev/null
@@ -1,69 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.MethodLibrary#getMethodPlugins <em>Method Plugins</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodLibrary#getPredefinedConfigurations <em>Predefined Configurations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMethodLibrary()
- * @model
- * @generated
- */
-public interface MethodLibrary extends MethodUnit, org.eclipse.epf.uma.Package {
-	/**
-	 * Returns the value of the '<em><b>Method Plugins</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodPlugin}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Plugins</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>Method Plugins</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodLibrary_MethodPlugins()
-	 * @model type="org.eclipse.epf.uma.MethodPlugin" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getMethodPlugins();
-
-	/**
-	 * Returns the value of the '<em><b>Predefined Configurations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodConfiguration}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Predefined 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>Predefined Configurations</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodLibrary_PredefinedConfigurations()
-	 * @model type="org.eclipse.epf.uma.MethodConfiguration" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getPredefinedConfigurations();
-
-} // MethodLibrary
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodPackage.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodPackage.java
deleted file mode 100644
index 98e4d7c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodPackage.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Method Package is an abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.MethodPackage#getGlobal <em>Global</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodPackage#getReusedPackages <em>Reused Packages</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodPackage#getChildPackages <em>Child Packages</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMethodPackage()
- * @model abstract="true"
- * @generated
- */
-public interface MethodPackage extends MethodElement,
-		org.eclipse.epf.uma.Package {
-	/**
-	 * Returns the value of the '<em><b>Global</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Global</em>' attribute.
-	 * @see #setGlobal(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodPackage_Global()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getGlobal();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodPackage#getGlobal <em>Global</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Global</em>' attribute.
-	 * @see #getGlobal()
-	 * @generated
-	 */
-	void setGlobal(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Reused Packages</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodPackage}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reused Packages</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Reused Packages</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodPackage_ReusedPackages()
-	 * @model type="org.eclipse.epf.uma.MethodPackage" ordered="false"
-	 * @generated
-	 */
-	List getReusedPackages();
-
-	/**
-	 * Returns the value of the '<em><b>Child Packages</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodPackage}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Child Packages</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>Child Packages</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodPackage_ChildPackages()
-	 * @model type="org.eclipse.epf.uma.MethodPackage" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getChildPackages();
-
-	MethodPackage getParentPackage();
-
-} // MethodPackage
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodPlugin.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodPlugin.java
deleted file mode 100644
index d23f6bc..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodPlugin.java
+++ /dev/null
@@ -1,99 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Plugin</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Method Plugin is a Method Element that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
- * Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
- * Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.MethodPlugin#getUserChangeable <em>User Changeable</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodPlugin#getMethodPackages <em>Method Packages</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodPlugin#getBases <em>Bases</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMethodPlugin()
- * @model
- * @generated
- */
-public interface MethodPlugin extends MethodUnit, org.eclipse.epf.uma.Package {
-	/**
-	 * Returns the value of the '<em><b>User Changeable</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>User Changeable</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>User Changeable</em>' attribute.
-	 * @see #setUserChangeable(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodPlugin_UserChangeable()
-	 * @model default="true"
-	 * @generated
-	 */
-	Boolean getUserChangeable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodPlugin#getUserChangeable <em>User Changeable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>User Changeable</em>' attribute.
-	 * @see #getUserChangeable()
-	 * @generated
-	 */
-	void setUserChangeable(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Method Packages</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodPackage}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Packages</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>Method Packages</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodPlugin_MethodPackages()
-	 * @model type="org.eclipse.epf.uma.MethodPackage" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getMethodPackages();
-
-	/**
-	 * Returns the value of the '<em><b>Bases</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodPlugin}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Bases</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Bases</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodPlugin_Bases()
-	 * @model type="org.eclipse.epf.uma.MethodPlugin" ordered="false"
-	 * @generated
-	 */
-	List getBases();
-
-} // MethodPlugin
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodUnit.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodUnit.java
deleted file mode 100644
index f3a7cfa..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/MethodUnit.java
+++ /dev/null
@@ -1,165 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.Date;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Unit</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Method Unit is a special Method Element that shall be maintained in a Method Library as a separate unit of control.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.MethodUnit#getAuthors <em>Authors</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodUnit#getChangeDate <em>Change Date</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodUnit#getChangeDescription <em>Change Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodUnit#getVersion <em>Version</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.MethodUnit#getCopyrightStatement <em>Copyright Statement</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMethodUnit()
- * @model abstract="true"
- * @generated
- */
-public interface MethodUnit extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Authors</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Method Unit is being created and owned by an author or authoring team.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Authors</em>' attribute.
-	 * @see #setAuthors(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodUnit_Authors()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getAuthors();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodUnit#getAuthors <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Authors</em>' attribute.
-	 * @see #getAuthors()
-	 * @generated
-	 */
-	void setAuthors(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date the last change that resulted into this version has been made.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Change Date</em>' attribute.
-	 * @see #setChangeDate(Date)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodUnit_ChangeDate()
-	 * @model unique="false" dataType="org.eclipse.epf.uma.Date"
-	 * @generated
-	 */
-	Date getChangeDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodUnit#getChangeDate <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Change Date</em>' attribute.
-	 * @see #getChangeDate()
-	 * @generated
-	 */
-	void setChangeDate(Date value);
-
-	/**
-	 * Returns the value of the '<em><b>Change Description</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The description of the last change that resulted into this version.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Change Description</em>' attribute.
-	 * @see #setChangeDescription(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodUnit_ChangeDescription()
-	 * @model default="" unique="false" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getChangeDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodUnit#getChangeDescription <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Change Description</em>' attribute.
-	 * @see #getChangeDescription()
-	 * @generated
-	 */
-	void setChangeDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Version</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Package has a version number used to track changes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Version</em>' attribute.
-	 * @see #setVersion(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodUnit_Version()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getVersion();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodUnit#getVersion <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Version</em>' attribute.
-	 * @see #getVersion()
-	 * @generated
-	 */
-	void setVersion(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Copyright Statement</em>' reference.
-	 * @see #setCopyrightStatement(SupportingMaterial)
-	 * @see org.eclipse.epf.uma.UmaPackage#getMethodUnit_CopyrightStatement()
-	 * @model
-	 * @generated
-	 */
-	SupportingMaterial getCopyrightStatement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.MethodUnit#getCopyrightStatement <em>Copyright Statement</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Copyright Statement</em>' reference.
-	 * @see #getCopyrightStatement()
-	 * @generated
-	 */
-	void setCopyrightStatement(SupportingMaterial value);
-
-} // MethodUnit
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Milestone.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Milestone.java
deleted file mode 100644
index 50efa29..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Milestone.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Milestone</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Milestone describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getMilestone()
- * @model
- * @generated
- */
-public interface Milestone extends WorkBreakdownElement {
-} // Milestone
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/NamedElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/NamedElement.java
deleted file mode 100644
index 81e334c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/NamedElement.java
+++ /dev/null
@@ -1,61 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Named Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * UML 2.0 meta-class Named Element.  Defined that every element has a name.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.NamedElement#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getNamedElement()
- * @model abstract="true"
- * @generated
- */
-public interface NamedElement extends Element {
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getNamedElement_Name()
-	 * @model default="" unique="false" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.NamedElement#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-} // NamedElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Namespace.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Namespace.java
deleted file mode 100644
index 7ceaa26..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Namespace.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Namespace</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * UML 2.0 meta-class Namespace.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getNamespace()
- * @model abstract="true"
- * @generated
- */
-public interface Namespace extends NamedElement {
-} // Namespace
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Outcome.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Outcome.java
deleted file mode 100644
index 913596f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Outcome.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Outcome</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An outcome describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getOutcome()
- * @model
- * @generated
- */
-public interface Outcome extends WorkProduct {
-} // Outcome
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Package.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Package.java
deleted file mode 100644
index 374463d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Package.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * UML 2.0 meta-class Package.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPackage()
- * @model
- * @generated
- */
-public interface Package extends Namespace, PackageableElement {
-} // Package
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PackageableElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PackageableElement.java
deleted file mode 100644
index 4c947e5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PackageableElement.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Packageable Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * UML 2.0 meta-class Packagable Element.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPackageableElement()
- * @model abstract="true"
- * @generated
- */
-public interface PackageableElement extends NamedElement {
-} // PackageableElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Phase.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Phase.java
deleted file mode 100644
index 38175eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Phase.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Phase</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Phase is a special Activity, which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
- * Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPhase()
- * @model
- * @generated
- */
-public interface Phase extends Activity {
-} // Phase
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PlanningData.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PlanningData.java
deleted file mode 100644
index e7ec58d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PlanningData.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.Date;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Planning Data</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Planning Data is a Method Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
- * Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
- * (NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.PlanningData#getStartDate <em>Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.PlanningData#getFinishDate <em>Finish Date</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.PlanningData#getRank <em>Rank</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPlanningData()
- * @model
- * @generated
- */
-public interface PlanningData extends ProcessElement {
-	/**
-	 * Returns the value of the '<em><b>Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default start date for a planed Task.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start Date</em>' attribute.
-	 * @see #setStartDate(Date)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPlanningData_StartDate()
-	 * @model unique="false" dataType="org.eclipse.epf.uma.Date"
-	 * @generated
-	 */
-	Date getStartDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PlanningData#getStartDate <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start Date</em>' attribute.
-	 * @see #getStartDate()
-	 * @generated
-	 */
-	void setStartDate(Date value);
-
-	/**
-	 * Returns the value of the '<em><b>Finish Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default finish date for a planed Task.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish Date</em>' attribute.
-	 * @see #setFinishDate(Date)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPlanningData_FinishDate()
-	 * @model unique="false" dataType="org.eclipse.epf.uma.Date"
-	 * @generated
-	 */
-	Date getFinishDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PlanningData#getFinishDate <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish Date</em>' attribute.
-	 * @see #getFinishDate()
-	 * @generated
-	 */
-	void setFinishDate(Date value);
-
-	/**
-	 * Returns the value of the '<em><b>Rank</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default rank for a planed Task.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rank</em>' attribute.
-	 * @see #setRank(int)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPlanningData_Rank()
-	 * @model unique="false" dataType="org.eclipse.epf.uma.Integer"
-	 * @generated
-	 */
-	int getRank();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PlanningData#getRank <em>Rank</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rank</em>' attribute.
-	 * @see #getRank()
-	 * @generated
-	 */
-	void setRank(int value);
-
-} // PlanningData
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Point.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Point.java
deleted file mode 100644
index af09264..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Point.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import org.eclipse.epf.uma.ecore.IModelObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Point</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Point#getX <em>X</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Point#getY <em>Y</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPoint()
- * @model
- * @extends IModelObject
- * @generated
- */
-public interface Point extends IModelObject {
-	/**
-	 * Returns the value of the '<em><b>X</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>X</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>X</em>' attribute.
-	 * @see #setX(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPoint_X()
-	 * @model
-	 * @generated
-	 */
-	Double getX();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Point#getX <em>X</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>X</em>' attribute.
-	 * @see #getX()
-	 * @generated
-	 */
-	void setX(Double value);
-
-	/**
-	 * Returns the value of the '<em><b>Y</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Y</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Y</em>' attribute.
-	 * @see #setY(Double)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPoint_Y()
-	 * @model
-	 * @generated
-	 */
-	Double getY();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Point#getY <em>Y</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Y</em>' attribute.
-	 * @see #getY()
-	 * @generated
-	 */
-	void setY(Double value);
-
-} // Point
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Polyline.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Polyline.java
deleted file mode 100644
index 7682819e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Polyline.java
+++ /dev/null
@@ -1,76 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Polyline</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Polyline#getClosed <em>Closed</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Polyline#getWaypoints <em>Waypoints</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPolyline()
- * @model
- * @generated
- */
-public interface Polyline extends GraphicPrimitive {
-	/**
-	 * Returns the value of the '<em><b>Closed</b></em>' attribute.
-	 * The default value is <code>"true"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Closed</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Closed</em>' attribute.
-	 * @see #setClosed(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPolyline_Closed()
-	 * @model default="true"
-	 * @generated
-	 */
-	Boolean getClosed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Polyline#getClosed <em>Closed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Closed</em>' attribute.
-	 * @see #getClosed()
-	 * @generated
-	 */
-	void setClosed(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Waypoints</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Point}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Waypoints</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>Waypoints</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getPolyline_Waypoints()
-	 * @model type="org.eclipse.epf.uma.Point" containment="true" resolveProxies="true" lower="2" ordered="false"
-	 * @generated
-	 */
-	List getWaypoints();
-
-} // Polyline
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Practice.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Practice.java
deleted file mode 100644
index e8be486..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Practice.java
+++ /dev/null
@@ -1,86 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Practice</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Practice represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be "Manage Risks", "Continuously verify quality", "Architecture-centric and component-based development", etc.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Practice#getSubPractices <em>Sub Practices</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Practice#getContentReferences <em>Content References</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Practice#getActivityReferences <em>Activity References</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPractice()
- * @model
- * @generated
- */
-public interface Practice extends Guidance {
-	/**
-	 * Returns the value of the '<em><b>Sub Practices</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Practice}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Practices</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>Sub Practices</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getPractice_SubPractices()
-	 * @model type="org.eclipse.epf.uma.Practice" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getSubPractices();
-
-	/**
-	 * Returns the value of the '<em><b>Content References</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ContentElement}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Content References</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Content References</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getPractice_ContentReferences()
-	 * @model type="org.eclipse.epf.uma.ContentElement" ordered="false"
-	 * @generated
-	 */
-	List getContentReferences();
-
-	/**
-	 * Returns the value of the '<em><b>Activity References</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Activity}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Activity References</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Activity References</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getPractice_ActivityReferences()
-	 * @model type="org.eclipse.epf.uma.Activity" ordered="false"
-	 * @generated
-	 */
-	List getActivityReferences();
-
-} // Practice
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PracticeDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PracticeDescription.java
deleted file mode 100644
index f3f6094..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PracticeDescription.java
+++ /dev/null
@@ -1,191 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Practice Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.PracticeDescription#getAdditionalInfo <em>Additional Info</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.PracticeDescription#getProblem <em>Problem</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.PracticeDescription#getBackground <em>Background</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.PracticeDescription#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.PracticeDescription#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.PracticeDescription#getLevelsOfAdoption <em>Levels Of Adoption</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPracticeDescription()
- * @model
- * @generated
- */
-public interface PracticeDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Additional Info</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Any additional Information not covered by the other attributes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Additional Info</em>' attribute.
-	 * @see #setAdditionalInfo(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPracticeDescription_AdditionalInfo()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getAdditionalInfo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PracticeDescription#getAdditionalInfo <em>Additional Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Additional Info</em>' attribute.
-	 * @see #getAdditionalInfo()
-	 * @generated
-	 */
-	void setAdditionalInfo(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Problem</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A description of the problem the Practice addresses.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Problem</em>' attribute.
-	 * @see #setProblem(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPracticeDescription_Problem()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getProblem();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PracticeDescription#getProblem <em>Problem</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Problem</em>' attribute.
-	 * @see #getProblem()
-	 * @generated
-	 */
-	void setProblem(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Background</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Background</em>' attribute.
-	 * @see #setBackground(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPracticeDescription_Background()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getBackground();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PracticeDescription#getBackground <em>Background</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Background</em>' attribute.
-	 * @see #getBackground()
-	 * @generated
-	 */
-	void setBackground(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Goals</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A summary of the overall goals to be addressed by the Practice.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Goals</em>' attribute.
-	 * @see #setGoals(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPracticeDescription_Goals()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PracticeDescription#getGoals <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Goals</em>' attribute.
-	 * @see #getGoals()
-	 * @generated
-	 */
-	void setGoals(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Application</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes how the Practice is being applied or introduced into the context described in background.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Application</em>' attribute.
-	 * @see #setApplication(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPracticeDescription_Application()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getApplication();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PracticeDescription#getApplication <em>Application</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Application</em>' attribute.
-	 * @see #getApplication()
-	 * @generated
-	 */
-	void setApplication(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Levels Of Adoption</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Levels Of Adoption</em>' attribute.
-	 * @see #setLevelsOfAdoption(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getPracticeDescription_LevelsOfAdoption()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getLevelsOfAdoption();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.PracticeDescription#getLevelsOfAdoption <em>Levels Of Adoption</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Levels Of Adoption</em>' attribute.
-	 * @see #getLevelsOfAdoption()
-	 * @generated
-	 */
-	void setLevelsOfAdoption(String value);
-
-} // PracticeDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Process.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Process.java
deleted file mode 100644
index 1df6324..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Process.java
+++ /dev/null
@@ -1,97 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Process is a special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
- * Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Process#getIncludesPatterns <em>Includes Patterns</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Process#getDefaultContext <em>Default Context</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Process#getValidContext <em>Valid Context</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcess()
- * @model abstract="true"
- * @generated
- */
-public interface Process extends Activity {
-	/**
-	 * Returns the value of the '<em><b>Includes Patterns</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.CapabilityPattern}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Includes Patterns</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Includes Patterns</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcess_IncludesPatterns()
-	 * @model type="org.eclipse.epf.uma.CapabilityPattern" ordered="false"
-	 * @generated
-	 */
-	List getIncludesPatterns();
-
-	/**
-	 * Returns the value of the '<em><b>Default Context</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Context</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Context</em>' reference.
-	 * @see #setDefaultContext(MethodConfiguration)
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcess_DefaultContext()
-	 * @model required="true"
-	 * @generated
-	 */
-	MethodConfiguration getDefaultContext();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Process#getDefaultContext <em>Default Context</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Context</em>' reference.
-	 * @see #getDefaultContext()
-	 * @generated
-	 */
-	void setDefaultContext(MethodConfiguration value);
-
-	/**
-	 * Returns the value of the '<em><b>Valid Context</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.MethodConfiguration}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Valid Context</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Valid Context</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcess_ValidContext()
-	 * @model type="org.eclipse.epf.uma.MethodConfiguration" ordered="false"
-	 * @generated
-	 */
-	List getValidContext();
-
-} // Process
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponent.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponent.java
deleted file mode 100644
index 57470d4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponent.java
+++ /dev/null
@@ -1,80 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Component</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Process Component is a special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
- * UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a "black box".  At any point during a project the component "realization" detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ProcessComponent#getInterfaces <em>Interfaces</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ProcessComponent#getProcess <em>Process</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessComponent()
- * @model
- * @generated
- */
-public interface ProcessComponent extends ProcessPackage, MethodUnit {
-	/**
-	 * Returns the value of the '<em><b>Interfaces</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ProcessComponentInterface}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Interfaces</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Interfaces</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessComponent_Interfaces()
-	 * @model type="org.eclipse.epf.uma.ProcessComponentInterface" ordered="false"
-	 * @generated
-	 */
-	List getInterfaces();
-
-	/**
-	 * Returns the value of the '<em><b>Process</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Process</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>Process</em>' containment reference.
-	 * @see #setProcess(org.eclipse.epf.uma.Process)
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessComponent_Process()
-	 * @model containment="true" resolveProxies="true" required="true"
-	 * @generated
-	 */
-	org.eclipse.epf.uma.Process getProcess();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ProcessComponent#getProcess <em>Process</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Process</em>' containment reference.
-	 * @see #getProcess()
-	 * @generated
-	 */
-	void setProcess(org.eclipse.epf.uma.Process value);
-
-} // ProcessComponent
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponentDescriptor.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponentDescriptor.java
deleted file mode 100644
index c5481c1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponentDescriptor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Component Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Process Component Descriptor represents a Process Component application in a Process, i.e. the breakdown structure defining the Process.  The Process Component Descriptor is used to encapsulate the details of the component in a breakdown structure and to provide its own set of relationships such as it own predecessors and successors.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ProcessComponentDescriptor#getProcessComponent <em>Process Component</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessComponentDescriptor()
- * @model
- * @generated
- */
-public interface ProcessComponentDescriptor extends Descriptor {
-	/**
-	 * Returns the value of the '<em><b>Process Component</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Process Component</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Process Component</em>' reference.
-	 * @see #setProcessComponent(ProcessComponent)
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessComponentDescriptor_ProcessComponent()
-	 * @model required="true"
-	 * @generated
-	 */
-	ProcessComponent getProcessComponent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ProcessComponentDescriptor#getProcessComponent <em>Process Component</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Process Component</em>' reference.
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	void setProcessComponent(ProcessComponent value);
-
-} // ProcessComponentDescriptor
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponentInterface.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponentInterface.java
deleted file mode 100644
index eb9e672..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessComponentInterface.java
+++ /dev/null
@@ -1,69 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Component Interface</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Process Component Interface comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ProcessComponentInterface#getInterfaceSpecifications <em>Interface Specifications</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ProcessComponentInterface#getInterfaceIO <em>Interface IO</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessComponentInterface()
- * @model
- * @generated
- */
-public interface ProcessComponentInterface extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Interface Specifications</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.TaskDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Interface Specifications</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>Interface Specifications</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessComponentInterface_InterfaceSpecifications()
-	 * @model type="org.eclipse.epf.uma.TaskDescriptor" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getInterfaceSpecifications();
-
-	/**
-	 * Returns the value of the '<em><b>Interface IO</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Interface IO</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>Interface IO</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessComponentInterface_InterfaceIO()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getInterfaceIO();
-
-} // ProcessComponentInterface
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessDescription.java
deleted file mode 100644
index acf8c55..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessDescription.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ProcessDescription#getScope <em>Scope</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ProcessDescription#getUsageNotes <em>Usage Notes</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessDescription()
- * @model
- * @generated
- */
-public interface ProcessDescription extends ActivityDescription {
-	/**
-	 * Returns the value of the '<em><b>Scope</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Defines the scope of the Process, i.e. which types of projects does it address and which not.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Scope</em>' attribute.
-	 * @see #setScope(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessDescription_Scope()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getScope();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ProcessDescription#getScope <em>Scope</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Scope</em>' attribute.
-	 * @see #getScope()
-	 * @generated
-	 */
-	void setScope(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Usage Notes</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Any additional notes on how to apply and instantiate this process for a project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Usage Notes</em>' attribute.
-	 * @see #setUsageNotes(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessDescription_UsageNotes()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getUsageNotes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.ProcessDescription#getUsageNotes <em>Usage Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Usage Notes</em>' attribute.
-	 * @see #getUsageNotes()
-	 * @generated
-	 */
-	void setUsageNotes(String value);
-
-} // ProcessDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessElement.java
deleted file mode 100644
index 07d33b4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessElement.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Process Element is a Describable Element that represents an abstract generalization for all elements defined in the Process package.
- * Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. 
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessElement()
- * @model abstract="true"
- * @generated
- */
-public interface ProcessElement extends DescribableElement {
-} // ProcessElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessFamily.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessFamily.java
deleted file mode 100644
index e0f1989..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessFamily.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Family</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Delivery Model Family is a convenient grouping of Delivery Processes and Capability Patterns of interest to some specific user community.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ProcessFamily#getDeliveryProcesses <em>Delivery Processes</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessFamily()
- * @model
- * @generated
- */
-public interface ProcessFamily extends MethodConfiguration {
-	/**
-	 * Returns the value of the '<em><b>Delivery Processes</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.DeliveryProcess}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Delivery Processes</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Delivery Processes</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessFamily_DeliveryProcesses()
-	 * @model type="org.eclipse.epf.uma.DeliveryProcess" ordered="false"
-	 * @generated
-	 */
-	List getDeliveryProcesses();
-
-} // ProcessFamily
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessPackage.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessPackage.java
deleted file mode 100644
index 463fb5f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessPackage.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Process Package is a special Method Package that contains Process Elements, only.
- * A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ProcessPackage#getProcessElements <em>Process Elements</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.ProcessPackage#getDiagrams <em>Diagrams</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessPackage()
- * @model
- * @generated
- */
-public interface ProcessPackage extends MethodPackage {
-	/**
-	 * Returns the value of the '<em><b>Process Elements</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ProcessElement}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Process Elements</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>Process Elements</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessPackage_ProcessElements()
-	 * @model type="org.eclipse.epf.uma.ProcessElement" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getProcessElements();
-
-	/**
-	 * Returns the value of the '<em><b>Diagrams</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Diagram}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Diagrams</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>Diagrams</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessPackage_Diagrams()
-	 * @model type="org.eclipse.epf.uma.Diagram" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getDiagrams();
-
-} // ProcessPackage
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessPlanningTemplate.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessPlanningTemplate.java
deleted file mode 100644
index 91f428f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ProcessPlanningTemplate.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Planning Template</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Process Planning Template is a special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
- * A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.ProcessPlanningTemplate#getBasedOnProcesses <em>Based On Processes</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProcessPlanningTemplate()
- * @model
- * @generated
- */
-public interface ProcessPlanningTemplate extends org.eclipse.epf.uma.Process {
-	/**
-	 * Returns the value of the '<em><b>Based On Processes</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Process}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Based On Processes</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Based On Processes</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getProcessPlanningTemplate_BasedOnProcesses()
-	 * @model type="org.eclipse.epf.uma.Process" ordered="false"
-	 * @generated
-	 */
-	List getBasedOnProcesses();
-
-} // ProcessPlanningTemplate
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Property.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Property.java
deleted file mode 100644
index 79271f4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Property.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Property#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Property#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getProperty()
- * @model
- * @generated
- */
-public interface Property extends DiagramElement {
-	/**
-	 * Returns the value of the '<em><b>Key</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Key</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Key</em>' attribute.
-	 * @see #setKey(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getProperty_Key()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getKey();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Property#getKey <em>Key</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key</em>' attribute.
-	 * @see #getKey()
-	 * @generated
-	 */
-	void setKey(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getProperty_Value()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Property#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // Property
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PseudoState.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PseudoState.java
deleted file mode 100644
index 89abf51..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PseudoState.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PseudoState.java,v 1.1 2008/01/15 08:52:03 jtham Exp $
- */
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Pseudo State</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getPseudoState()
- * @model
- * @generated
- */
-public interface PseudoState extends Vertex {
-} // PseudoState
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PseudoStateKind.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PseudoStateKind.java
deleted file mode 100644
index 5372789..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/PseudoStateKind.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PseudoStateKind.java,v 1.1 2008/01/15 08:52:03 jtham Exp $
- */
-package org.eclipse.epf.uma;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Pseudo State Kind</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.epf.uma.UmaPackage#getPseudoStateKind()
- * @model
- * @generated
- */
-public final class PseudoStateKind extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Initial</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Initial</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #INITIAL_LITERAL
-	 * @model name="initial"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int INITIAL = 0;
-
-	/**
-	 * The '<em><b>Join</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Join</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #JOIN_LITERAL
-	 * @model name="join"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int JOIN = 1;
-
-	/**
-	 * The '<em><b>Fork</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Fork</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #FORK_LITERAL
-	 * @model name="fork"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int FORK = 2;
-
-	/**
-	 * The '<em><b>Junction</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Junction</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #JUNCTION_LITERAL
-	 * @model name="junction"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int JUNCTION = 3;
-
-	/**
-	 * The '<em><b>Choice</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Choice</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #CHOICE_LITERAL
-	 * @model name="choice"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int CHOICE = 4;
-
-	/**
-	 * The '<em><b>Entry Point</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Entry Point</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #ENTRY_POINT_LITERAL
-	 * @model name="entryPoint"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int ENTRY_POINT = 5;
-
-	/**
-	 * The '<em><b>Exit Point</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Exit Point</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #EXIT_POINT_LITERAL
-	 * @model name="exitPoint"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int EXIT_POINT = 6;
-
-	/**
-	 * The '<em><b>Terminate</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Terminate</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #TERMINATE_LITERAL
-	 * @model name="terminate"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int TERMINATE = 7;
-
-	/**
-	 * The '<em><b>Initial</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #INITIAL
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind INITIAL_LITERAL = new PseudoStateKind(
-			INITIAL, "initial", "initial"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Join</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #JOIN
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind JOIN_LITERAL = new PseudoStateKind(
-			JOIN, "join", "join"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Fork</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FORK
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind FORK_LITERAL = new PseudoStateKind(
-			FORK, "fork", "fork"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Junction</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #JUNCTION
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind JUNCTION_LITERAL = new PseudoStateKind(
-			JUNCTION, "junction", "junction"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Choice</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CHOICE
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind CHOICE_LITERAL = new PseudoStateKind(
-			CHOICE, "choice", "choice"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Entry Point</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ENTRY_POINT
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind ENTRY_POINT_LITERAL = new PseudoStateKind(
-			ENTRY_POINT, "entryPoint", "entryPoint"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Exit Point</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXIT_POINT
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind EXIT_POINT_LITERAL = new PseudoStateKind(
-			EXIT_POINT, "exitPoint", "exitPoint"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Terminate</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #TERMINATE
-	 * @generated
-	 * @ordered
-	 */
-	public static final PseudoStateKind TERMINATE_LITERAL = new PseudoStateKind(
-			TERMINATE, "terminate", "terminate"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>Pseudo State Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final PseudoStateKind[] VALUES_ARRAY = new PseudoStateKind[] {
-			INITIAL_LITERAL, JOIN_LITERAL, FORK_LITERAL, JUNCTION_LITERAL,
-			CHOICE_LITERAL, ENTRY_POINT_LITERAL, EXIT_POINT_LITERAL,
-			TERMINATE_LITERAL, };
-
-	/**
-	 * A public read-only list of all the '<em><b>Pseudo State Kind</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-			.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Pseudo State Kind</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static PseudoStateKind get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			PseudoStateKind result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Pseudo State Kind</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static PseudoStateKind getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			PseudoStateKind result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Pseudo State Kind</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static PseudoStateKind get(int value) {
-		switch (value) {
-		case INITIAL:
-			return INITIAL_LITERAL;
-		case JOIN:
-			return JOIN_LITERAL;
-		case FORK:
-			return FORK_LITERAL;
-		case JUNCTION:
-			return JUNCTION_LITERAL;
-		case CHOICE:
-			return CHOICE_LITERAL;
-		case ENTRY_POINT:
-			return ENTRY_POINT_LITERAL;
-		case EXIT_POINT:
-			return EXIT_POINT_LITERAL;
-		case TERMINATE:
-			return TERMINATE_LITERAL;
-		}
-		return null;
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private PseudoStateKind(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //PseudoStateKind
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Reference.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Reference.java
deleted file mode 100644
index ad05a39..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Reference.java
+++ /dev/null
@@ -1,85 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Reference</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Reference#getIsIndividualRepresentation <em>Is Individual Representation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Reference#getReferenced <em>Referenced</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getReference()
- * @model
- * @generated
- */
-public interface Reference extends DiagramElement {
-	/**
-	 * Returns the value of the '<em><b>Is Individual Representation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Is Individual Representation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Is Individual Representation</em>' attribute.
-	 * @see #setIsIndividualRepresentation(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getReference_IsIndividualRepresentation()
-	 * @model
-	 * @generated
-	 */
-	Boolean getIsIndividualRepresentation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Reference#getIsIndividualRepresentation <em>Is Individual Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Individual Representation</em>' attribute.
-	 * @see #getIsIndividualRepresentation()
-	 * @generated
-	 */
-	void setIsIndividualRepresentation(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Referenced</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.DiagramElement#getReference <em>Reference</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Referenced</em>' reference.
-	 * @see #setReferenced(DiagramElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getReference_Referenced()
-	 * @see org.eclipse.epf.uma.DiagramElement#getReference
-	 * @model opposite="reference" required="true"
-	 * @generated
-	 */
-	DiagramElement getReferenced();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Reference#getReferenced <em>Referenced</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced</em>' reference.
-	 * @see #getReferenced()
-	 * @generated
-	 */
-	void setReferenced(DiagramElement value);
-
-} // Reference
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Region.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Region.java
deleted file mode 100644
index a033b71..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Region.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Region.java,v 1.1 2008/01/15 08:52:02 jtham Exp $
- */
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-import org.eclipse.epf.uma.ecore.IModelObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Region</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Region#getVertex <em>Vertex</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Region#getTransition <em>Transition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Region#getState <em>State</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Region#getStateMachine <em>State Machine</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getRegion()
- * @model
- * @extends IModelObject
- * @generated
- */
-public interface Region extends IModelObject {
-	/**
-	 * Returns the value of the '<em><b>Vertex</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Vertex}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Vertex#getContainer_ <em>Container</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Vertex</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>Vertex</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRegion_Vertex()
-	 * @see org.eclipse.epf.uma.Vertex#getContainer_
-	 * @model type="org.eclipse.epf.uma.Vertex" opposite="container" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getVertex();
-
-	/**
-	 * Returns the value of the '<em><b>Transition</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Transition}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Transition#getContainer_ <em>Container</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Transition</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>Transition</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRegion_Transition()
-	 * @see org.eclipse.epf.uma.Transition#getContainer_
-	 * @model type="org.eclipse.epf.uma.Transition" opposite="container" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getTransition();
-
-	/**
-	 * Returns the value of the '<em><b>State</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.State#getRegion <em>Region</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>State</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>State</em>' container reference.
-	 * @see #setState(State)
-	 * @see org.eclipse.epf.uma.UmaPackage#getRegion_State()
-	 * @see org.eclipse.epf.uma.State#getRegion
-	 * @model opposite="Region"
-	 * @generated
-	 */
-	State getState();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Region#getState <em>State</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>State</em>' container reference.
-	 * @see #getState()
-	 * @generated
-	 */
-	void setState(State value);
-
-	/**
-	 * Returns the value of the '<em><b>State Machine</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.StateMachine#getRegion <em>Region</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>State Machine</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>State Machine</em>' container reference.
-	 * @see #setStateMachine(StateMachine)
-	 * @see org.eclipse.epf.uma.UmaPackage#getRegion_StateMachine()
-	 * @see org.eclipse.epf.uma.StateMachine#getRegion
-	 * @model opposite="Region"
-	 * @generated
-	 */
-	StateMachine getStateMachine();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Region#getStateMachine <em>State Machine</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>State Machine</em>' container reference.
-	 * @see #getStateMachine()
-	 * @generated
-	 */
-	void setStateMachine(StateMachine value);
-
-} // Region
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Report.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Report.java
deleted file mode 100644
index 8887d44..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Report.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Report</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Report is a predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getReport()
- * @model
- * @generated
- */
-public interface Report extends Guidance {
-} // Report
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ReusableAsset.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ReusableAsset.java
deleted file mode 100644
index 308b646..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ReusableAsset.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Reusable Asset</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Reusable Asset provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
- * how the asset should be used.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getReusableAsset()
- * @model
- * @generated
- */
-public interface ReusableAsset extends Guidance {
-} // ReusableAsset
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Roadmap.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Roadmap.java
deleted file mode 100644
index 2ce9b47..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Roadmap.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Roadmap</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Roadmap is a special Guidance Type which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
- * An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getRoadmap()
- * @model
- * @generated
- */
-public interface Roadmap extends Guidance {
-} // Roadmap
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Role.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Role.java
deleted file mode 100644
index a157766..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Role.java
+++ /dev/null
@@ -1,70 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Role is a content element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
- * A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Role#getModifies <em>Modifies</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Role#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getRole()
- * @model
- * @generated
- */
-public interface Role extends ContentElement {
-	/**
-	 * Returns the value of the '<em><b>Modifies</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Modifies</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Modifies</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRole_Modifies()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
-	 * @generated
-	 */
-	List getModifies();
-
-	/**
-	 * Returns the value of the '<em><b>Responsible For</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Responsible For</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Responsible For</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRole_ResponsibleFor()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" ordered="false"
-	 * @generated
-	 */
-	List getResponsibleFor();
-
-} // Role
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleDescription.java
deleted file mode 100644
index e6f9b3c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleDescription.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.RoleDescription#getSkills <em>Skills</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.RoleDescription#getAssignmentApproaches <em>Assignment Approaches</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.RoleDescription#getSynonyms <em>Synonyms</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getRoleDescription()
- * @model
- * @generated
- */
-public interface RoleDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Skills</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Lists of set of required skills a person needs to possess to fulfill that Role.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Skills</em>' attribute.
-	 * @see #setSkills(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleDescription_Skills()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getSkills();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.RoleDescription#getSkills <em>Skills</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Skills</em>' attribute.
-	 * @see #getSkills()
-	 * @generated
-	 */
-	void setSkills(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Assignment Approaches</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Assignment Approaches</em>' attribute.
-	 * @see #setAssignmentApproaches(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleDescription_AssignmentApproaches()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getAssignmentApproaches();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.RoleDescription#getAssignmentApproaches <em>Assignment Approaches</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Assignment Approaches</em>' attribute.
-	 * @see #getAssignmentApproaches()
-	 * @generated
-	 */
-	void setAssignmentApproaches(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Synonyms</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Synonyms</em>' attribute.
-	 * @see #setSynonyms(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleDescription_Synonyms()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getSynonyms();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.RoleDescription#getSynonyms <em>Synonyms</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Synonyms</em>' attribute.
-	 * @see #getSynonyms()
-	 * @generated
-	 */
-	void setSynonyms(String value);
-
-} // RoleDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleDescriptor.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleDescriptor.java
deleted file mode 100644
index bb8294f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleDescriptor.java
+++ /dev/null
@@ -1,96 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Role Descriptor represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.RoleDescriptor#getRole <em>Role</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.RoleDescriptor#getModifies <em>Modifies</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.RoleDescriptor#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getRoleDescriptor()
- * @model
- * @generated
- */
-public interface RoleDescriptor extends Descriptor {
-	/**
-	 * Returns the value of the '<em><b>Role</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Role</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Role</em>' reference.
-	 * @see #setRole(Role)
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleDescriptor_Role()
-	 * @model
-	 * @generated
-	 */
-	Role getRole();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.RoleDescriptor#getRole <em>Role</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Role</em>' reference.
-	 * @see #getRole()
-	 * @generated
-	 */
-	void setRole(Role value);
-
-	/**
-	 * Returns the value of the '<em><b>Modifies</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Modifies</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Modifies</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleDescriptor_Modifies()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
-	 * @generated
-	 */
-	List getModifies();
-
-	/**
-	 * Returns the value of the '<em><b>Responsible For</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Responsible For</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Responsible For</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleDescriptor_ResponsibleFor()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getResponsibleFor();
-
-} // RoleDescriptor
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleSet.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleSet.java
deleted file mode 100644
index 6e6a94a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleSet.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Set</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Role Set organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the "Analysts" Role Set could group the "Business Process Analyst", "System Analyst", as well as "Requirements Specifier" roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.RoleSet#getRoles <em>Roles</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getRoleSet()
- * @model
- * @generated
- */
-public interface RoleSet extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Roles</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Role}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Roles</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Roles</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleSet_Roles()
-	 * @model type="org.eclipse.epf.uma.Role" ordered="false"
-	 * @generated
-	 */
-	List getRoles();
-
-} // RoleSet
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleSetGrouping.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleSetGrouping.java
deleted file mode 100644
index cfe29a6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/RoleSetGrouping.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Set Grouping</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.RoleSetGrouping#getRoleSets <em>Role Sets</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getRoleSetGrouping()
- * @model
- * @generated
- */
-public interface RoleSetGrouping extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Role Sets</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.RoleSet}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Role Sets</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Role Sets</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getRoleSetGrouping_RoleSets()
-	 * @model type="org.eclipse.epf.uma.RoleSet" ordered="false"
-	 * @generated
-	 */
-	List getRoleSets();
-
-} // RoleSetGrouping
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Section.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Section.java
deleted file mode 100644
index ee7cb42..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Section.java
+++ /dev/null
@@ -1,133 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Section</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Section is a special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Section#getSectionName <em>Section Name</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Section#getSectionDescription <em>Section Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Section#getSubSections <em>Sub Sections</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Section#getPredecessor <em>Predecessor</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getSection()
- * @model
- * @generated
- */
-public interface Section extends VariabilityElement {
-	/**
-	 * Returns the value of the '<em><b>Section Name</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Section Name</em>' attribute.
-	 * @see #setSectionName(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getSection_SectionName()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getSectionName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Section#getSectionName <em>Section Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Section Name</em>' attribute.
-	 * @see #getSectionName()
-	 * @generated
-	 */
-	void setSectionName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Section Description</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attributes store the description text for a Content Description's Section.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Section Description</em>' attribute.
-	 * @see #setSectionDescription(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getSection_SectionDescription()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getSectionDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Section#getSectionDescription <em>Section Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Section Description</em>' attribute.
-	 * @see #getSectionDescription()
-	 * @generated
-	 */
-	void setSectionDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Sub Sections</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Section}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Sections</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>Sub Sections</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getSection_SubSections()
-	 * @model type="org.eclipse.epf.uma.Section" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getSubSections();
-
-	/**
-	 * Returns the value of the '<em><b>Predecessor</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Predecessor</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Predecessor</em>' reference.
-	 * @see #setPredecessor(Section)
-	 * @see org.eclipse.epf.uma.UmaPackage#getSection_Predecessor()
-	 * @model
-	 * @generated
-	 */
-	Section getPredecessor();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Section#getPredecessor <em>Predecessor</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Predecessor</em>' reference.
-	 * @see #getPredecessor()
-	 * @generated
-	 */
-	void setPredecessor(Section value);
-
-} // Section
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SemanticModelBridge.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SemanticModelBridge.java
deleted file mode 100644
index 04160e6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SemanticModelBridge.java
+++ /dev/null
@@ -1,115 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Semantic Model Bridge</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.SemanticModelBridge#getPresentation <em>Presentation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.SemanticModelBridge#getGraphElement <em>Graph Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.SemanticModelBridge#getDiagram <em>Diagram</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getSemanticModelBridge()
- * @model abstract="true"
- * @generated
- */
-public interface SemanticModelBridge extends DiagramElement {
-	/**
-	 * Returns the value of the '<em><b>Presentation</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presentation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Presentation</em>' attribute.
-	 * @see #setPresentation(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getSemanticModelBridge_Presentation()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getPresentation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.SemanticModelBridge#getPresentation <em>Presentation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presentation</em>' attribute.
-	 * @see #getPresentation()
-	 * @generated
-	 */
-	void setPresentation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Graph Element</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.GraphElement#getSemanticModel <em>Semantic Model</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Graph Element</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Graph Element</em>' container reference.
-	 * @see #setGraphElement(GraphElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getSemanticModelBridge_GraphElement()
-	 * @see org.eclipse.epf.uma.GraphElement#getSemanticModel
-	 * @model opposite="semanticModel"
-	 * @generated
-	 */
-	GraphElement getGraphElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.SemanticModelBridge#getGraphElement <em>Graph Element</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Graph Element</em>' container reference.
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	void setGraphElement(GraphElement value);
-
-	/**
-	 * Returns the value of the '<em><b>Diagram</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Diagram#getNamespace <em>Namespace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Diagram</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Diagram</em>' container reference.
-	 * @see #setDiagram(Diagram)
-	 * @see org.eclipse.epf.uma.UmaPackage#getSemanticModelBridge_Diagram()
-	 * @see org.eclipse.epf.uma.Diagram#getNamespace
-	 * @model opposite="namespace"
-	 * @generated
-	 */
-	Diagram getDiagram();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.SemanticModelBridge#getDiagram <em>Diagram</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Diagram</em>' container reference.
-	 * @see #getDiagram()
-	 * @generated
-	 */
-	void setDiagram(Diagram value);
-
-} // SemanticModelBridge
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SimpleSemanticModelElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SimpleSemanticModelElement.java
deleted file mode 100644
index 3c7b30c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SimpleSemanticModelElement.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Simple Semantic Model Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.SimpleSemanticModelElement#getTypeInfo <em>Type Info</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getSimpleSemanticModelElement()
- * @model
- * @generated
- */
-public interface SimpleSemanticModelElement extends SemanticModelBridge {
-	/**
-	 * Returns the value of the '<em><b>Type Info</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type Info</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Type Info</em>' attribute.
-	 * @see #setTypeInfo(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getSimpleSemanticModelElement_TypeInfo()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getTypeInfo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.SimpleSemanticModelElement#getTypeInfo <em>Type Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type Info</em>' attribute.
-	 * @see #getTypeInfo()
-	 * @generated
-	 */
-	void setTypeInfo(String value);
-
-} // SimpleSemanticModelElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/State.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/State.java
deleted file mode 100644
index c5de400..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/State.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: State.java,v 1.1 2008/01/15 08:52:02 jtham Exp $
- */
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>State</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.State#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.State#getRegion <em>Region</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.State#getSubmachine <em>Submachine</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getState()
- * @model
- * @generated
- */
-public interface State extends Vertex {
-	/**
-	 * Returns the value of the '<em><b>Work Product</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Product</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Work Product</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getState_WorkProduct()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" required="true" ordered="false"
-	 * @generated
-	 */
-	List getWorkProduct();
-
-	/**
-	 * Returns the value of the '<em><b>Region</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Region}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Region#getState <em>State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Region</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>Region</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getState_Region()
-	 * @see org.eclipse.epf.uma.Region#getState
-	 * @model type="org.eclipse.epf.uma.Region" opposite="State" containment="true" resolveProxies="true" ordered="false"
-	 * @generated
-	 */
-	List getRegion();
-
-	/**
-	 * Returns the value of the '<em><b>Submachine</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Submachine</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Submachine</em>' reference.
-	 * @see #setSubmachine(StateMachine)
-	 * @see org.eclipse.epf.uma.UmaPackage#getState_Submachine()
-	 * @model
-	 * @generated
-	 */
-	StateMachine getSubmachine();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.State#getSubmachine <em>Submachine</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Submachine</em>' reference.
-	 * @see #getSubmachine()
-	 * @generated
-	 */
-	void setSubmachine(StateMachine value);
-
-} // State
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/StateMachine.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/StateMachine.java
deleted file mode 100644
index 52650b9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/StateMachine.java
+++ /dev/null
@@ -1,50 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>State Machine</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.StateMachine#getRegion <em>Region</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getStateMachine()
- * @model
- * @generated
- */
-public interface StateMachine extends WorkDefinition {
-	/**
-	 * Returns the value of the '<em><b>Region</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Region}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Region#getStateMachine <em>State Machine</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Region</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>Region</em>' containment reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getStateMachine_Region()
-	 * @see org.eclipse.epf.uma.Region#getStateMachine
-	 * @model type="org.eclipse.epf.uma.Region" opposite="StateMachine" containment="true" resolveProxies="true" required="true" ordered="false"
-	 * @generated
-	 */
-	List getRegion();
-
-} // StateMachine
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Step.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Step.java
deleted file mode 100644
index e3b5a28..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Step.java
+++ /dev/null
@@ -1,29 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Step</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Step is a Section and Work Definition that is used to organize Tasks into parts or subunits of work.  Steps inherit the subSections decomposition from Section and can therefore describe Sub-Steps nested into Steps.
- * A Step describes a meaningful and consist part of the overall work described for a Task.  The collection of Steps defined for a Task represents all the work that should be done to achieve the overall development goal of the Task.  Not all steps are necessarily performed each time a Task is invoked in a Process (see Task Descriptor), so they can also be expressed in the form of alternate 'flows' of work.  Different ways of achieving the same development goal can then be 'assembled' by selecting different combinations of steps when applying the Task in a Process.  Typical kinds of steps a Task author should consider are: Thinking steps: where the individual roles understand the nature of the task, gathers and examines the input artifacts, and formulates the outcome. Performing steps: where the individual roles create or update some artifacts. Reviewing steps: where the individual roles inspects the results against some criteria.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getStep()
- * @model
- * @generated
- */
-public interface Step extends Section, WorkDefinition {
-} // Step
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SupportingMaterial.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SupportingMaterial.java
deleted file mode 100644
index 8612a3f..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/SupportingMaterial.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Supporting Material</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Supporting Materials is catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getSupportingMaterial()
- * @model
- * @generated
- */
-public interface SupportingMaterial extends Guidance {
-} // SupportingMaterial
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Task.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Task.java
deleted file mode 100644
index c934ad3..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Task.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Task</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Task is a content element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
- * A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
- * A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
- * For example, a Task such as "Develop Use Case Model" describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the "method" of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Task#getPerformedBy <em>Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Task#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Task#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Task#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Task#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Task#getSteps <em>Steps</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Task#getToolMentors <em>Tool Mentors</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Task#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTask()
- * @model
- * @generated
- */
-public interface Task extends ContentElement, WorkDefinition {
-	/**
-	 * Returns the value of the '<em><b>Performed By</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Performed By</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Performed By</em>' reference.
-	 * @see #setPerformedBy(Role)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_PerformedBy()
-	 * @model
-	 * @generated
-	 */
-	Role getPerformedBy();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Task#getPerformedBy <em>Performed By</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Performed By</em>' reference.
-	 * @see #getPerformedBy()
-	 * @generated
-	 */
-	void setPerformedBy(Role value);
-
-	/**
-	 * Returns the value of the '<em><b>Mandatory Input</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mandatory Input</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Mandatory Input</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_MandatoryInput()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" ordered="false"
-	 * @generated
-	 */
-	List getMandatoryInput();
-
-	/**
-	 * Returns the value of the '<em><b>Output</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Output</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Output</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_Output()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" ordered="false"
-	 * @generated
-	 */
-	List getOutput();
-
-	/**
-	 * Returns the value of the '<em><b>Additionally Performed By</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Role}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Additionally Performed By</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Additionally Performed By</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_AdditionallyPerformedBy()
-	 * @model type="org.eclipse.epf.uma.Role" ordered="false"
-	 * @generated
-	 */
-	List getAdditionallyPerformedBy();
-
-	/**
-	 * Returns the value of the '<em><b>Optional Input</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Optional Input</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Optional Input</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_OptionalInput()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" ordered="false"
-	 * @generated
-	 */
-	List getOptionalInput();
-
-	/**
-	 * Returns the value of the '<em><b>Steps</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Step}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Steps</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Steps</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_Steps()
-	 * @model type="org.eclipse.epf.uma.Step" transient="true" changeable="false" volatile="true" derived="true" ordered="false"
-	 * @generated
-	 */
-	List getSteps();
-
-	/**
-	 * Returns the value of the '<em><b>Tool Mentors</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ToolMentor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tool Mentors</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tool Mentors</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_ToolMentors()
-	 * @model type="org.eclipse.epf.uma.ToolMentor" ordered="false"
-	 * @generated
-	 */
-	List getToolMentors();
-
-	/**
-	 * Returns the value of the '<em><b>Estimation Considerations</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.EstimationConsiderations}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimation Considerations</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Estimation Considerations</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTask_EstimationConsiderations()
-	 * @model type="org.eclipse.epf.uma.EstimationConsiderations" ordered="false"
-	 * @generated
-	 */
-	List getEstimationConsiderations();
-
-} // Task
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TaskDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TaskDescription.java
deleted file mode 100644
index ac35633..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TaskDescription.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Task Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.TaskDescription#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescription#getAlternatives <em>Alternatives</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTaskDescription()
- * @model
- * @generated
- */
-public interface TaskDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Purpose</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Summarizes the main reason for performing this Task and what is intended to be achieved.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Purpose</em>' attribute.
-	 * @see #setPurpose(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescription_Purpose()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getPurpose();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.TaskDescription#getPurpose <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Purpose</em>' attribute.
-	 * @see #getPurpose()
-	 * @generated
-	 */
-	void setPurpose(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Alternatives</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Alternatives</em>' attribute.
-	 * @see #setAlternatives(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescription_Alternatives()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getAlternatives();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.TaskDescription#getAlternatives <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Alternatives</em>' attribute.
-	 * @see #getAlternatives()
-	 * @generated
-	 */
-	void setAlternatives(String value);
-
-} // TaskDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TaskDescriptor.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TaskDescriptor.java
deleted file mode 100644
index 4b401a9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TaskDescriptor.java
+++ /dev/null
@@ -1,210 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Task Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Task Descriptor is a Descriptor and Work Breakdown Element that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
- * A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
- * 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getTask <em>Task</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getAssistedBy <em>Assisted By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getExternalInput <em>External Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getPerformedPrimarilyBy <em>Performed Primarily By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TaskDescriptor#getSelectedSteps <em>Selected Steps</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor()
- * @model
- * @generated
- */
-public interface TaskDescriptor extends WorkBreakdownElement, Descriptor {
-	/**
-	 * Returns the value of the '<em><b>Task</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Task</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Task</em>' reference.
-	 * @see #setTask(Task)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_Task()
-	 * @model
-	 * @generated
-	 */
-	Task getTask();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.TaskDescriptor#getTask <em>Task</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Task</em>' reference.
-	 * @see #getTask()
-	 * @generated
-	 */
-	void setTask(Task value);
-
-	/**
-	 * Returns the value of the '<em><b>Additionally Performed By</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.RoleDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Additionally Performed By</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Additionally Performed By</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_AdditionallyPerformedBy()
-	 * @model type="org.eclipse.epf.uma.RoleDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getAdditionallyPerformedBy();
-
-	/**
-	 * Returns the value of the '<em><b>Assisted By</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.RoleDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Assisted By</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Assisted By</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_AssistedBy()
-	 * @model type="org.eclipse.epf.uma.RoleDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getAssistedBy();
-
-	/**
-	 * Returns the value of the '<em><b>External Input</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>External Input</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>External Input</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_ExternalInput()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getExternalInput();
-
-	/**
-	 * Returns the value of the '<em><b>Mandatory Input</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mandatory Input</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Mandatory Input</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_MandatoryInput()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getMandatoryInput();
-
-	/**
-	 * Returns the value of the '<em><b>Optional Input</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Optional Input</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Optional Input</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_OptionalInput()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getOptionalInput();
-
-	/**
-	 * Returns the value of the '<em><b>Output</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Output</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Output</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_Output()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getOutput();
-
-	/**
-	 * Returns the value of the '<em><b>Performed Primarily By</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Performed Primarily By</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Performed Primarily By</em>' reference.
-	 * @see #setPerformedPrimarilyBy(RoleDescriptor)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_PerformedPrimarilyBy()
-	 * @model
-	 * @generated
-	 */
-	RoleDescriptor getPerformedPrimarilyBy();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.TaskDescriptor#getPerformedPrimarilyBy <em>Performed Primarily By</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Performed Primarily By</em>' reference.
-	 * @see #getPerformedPrimarilyBy()
-	 * @generated
-	 */
-	void setPerformedPrimarilyBy(RoleDescriptor value);
-
-	/**
-	 * Returns the value of the '<em><b>Selected Steps</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Section}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Selected Steps</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Selected Steps</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTaskDescriptor_SelectedSteps()
-	 * @model type="org.eclipse.epf.uma.Section" ordered="false"
-	 * @generated
-	 */
-	List getSelectedSteps();
-
-} // TaskDescriptor
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TeamProfile.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TeamProfile.java
deleted file mode 100644
index 98833d7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TeamProfile.java
+++ /dev/null
@@ -1,102 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Team Profile</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Team Profile is a Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
- * Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
- * Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.TeamProfile#getTeamRoles <em>Team Roles</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TeamProfile#getSuperTeam <em>Super Team</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.TeamProfile#getSubTeam <em>Sub Team</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTeamProfile()
- * @model
- * @generated
- */
-public interface TeamProfile extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Team Roles</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.RoleDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Team Roles</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Team Roles</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTeamProfile_TeamRoles()
-	 * @model type="org.eclipse.epf.uma.RoleDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getTeamRoles();
-
-	/**
-	 * Returns the value of the '<em><b>Super Team</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.TeamProfile#getSubTeam <em>Sub Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Super Team</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Super Team</em>' reference.
-	 * @see #setSuperTeam(TeamProfile)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTeamProfile_SuperTeam()
-	 * @see org.eclipse.epf.uma.TeamProfile#getSubTeam
-	 * @model opposite="subTeam" required="true"
-	 * @generated
-	 */
-	TeamProfile getSuperTeam();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.TeamProfile#getSuperTeam <em>Super Team</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Super Team</em>' reference.
-	 * @see #getSuperTeam()
-	 * @generated
-	 */
-	void setSuperTeam(TeamProfile value);
-
-	/**
-	 * Returns the value of the '<em><b>Sub Team</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.TeamProfile}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.TeamProfile#getSuperTeam <em>Super Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Team</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Sub Team</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTeamProfile_SubTeam()
-	 * @see org.eclipse.epf.uma.TeamProfile#getSuperTeam
-	 * @model type="org.eclipse.epf.uma.TeamProfile" opposite="superTeam" ordered="false"
-	 * @generated
-	 */
-	List getSubTeam();
-
-} // TeamProfile
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Template.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Template.java
deleted file mode 100644
index 40adc49..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Template.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Template</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Template is a specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTemplate()
- * @model
- * @generated
- */
-public interface Template extends Guidance {
-} // Template
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TermDefinition.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TermDefinition.java
deleted file mode 100644
index c73edcb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TermDefinition.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Term Definition</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * TermDefinitions define concepts and are used to build up the Glossary. They are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTermDefinition()
- * @model
- * @generated
- */
-public interface TermDefinition extends Guidance {
-} // TermDefinition
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TextElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TextElement.java
deleted file mode 100644
index a041835..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/TextElement.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Text Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.TextElement#getText <em>Text</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTextElement()
- * @model
- * @generated
- */
-public interface TextElement extends LeafElement {
-	/**
-	 * Returns the value of the '<em><b>Text</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text</em>' attribute.
-	 * @see #setText(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTextElement_Text()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getText();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.TextElement#getText <em>Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text</em>' attribute.
-	 * @see #getText()
-	 * @generated
-	 */
-	void setText(String value);
-
-} // TextElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Tool.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Tool.java
deleted file mode 100644
index e75a09c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Tool.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tool</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Tool is a container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Tool#getToolMentors <em>Tool Mentors</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTool()
- * @model
- * @generated
- */
-public interface Tool extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Tool Mentors</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ToolMentor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tool Mentors</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tool Mentors</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTool_ToolMentors()
-	 * @model type="org.eclipse.epf.uma.ToolMentor" ordered="false"
-	 * @generated
-	 */
-	List getToolMentors();
-
-} // Tool
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ToolMentor.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ToolMentor.java
deleted file mode 100644
index 4f6e959..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/ToolMentor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tool Mentor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Tool Mentor is a specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getToolMentor()
- * @model
- * @generated
- */
-public interface ToolMentor extends Guidance {
-} // ToolMentor
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Transition.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Transition.java
deleted file mode 100644
index 1bae7ed..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Transition.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Transition.java,v 1.1 2008/01/15 08:52:02 jtham Exp $
- */
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-import org.eclipse.epf.uma.ecore.IModelObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Transition</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Transition#getWorkDefinition <em>Work Definition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Transition#getContainer_ <em>Container</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Transition#getSource <em>Source</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Transition#getTarget <em>Target</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getTransition()
- * @model
- * @extends IModelObject
- * @generated
- */
-public interface Transition extends IModelObject {
-	/**
-	 * Returns the value of the '<em><b>Work Definition</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkDefinition}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Definition</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Work Definition</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getTransition_WorkDefinition()
-	 * @model type="org.eclipse.epf.uma.WorkDefinition" required="true" ordered="false"
-	 * @generated
-	 */
-	List getWorkDefinition();
-
-	/**
-	 * Returns the value of the '<em><b>Container</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Region#getTransition <em>Transition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Container</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Container</em>' container reference.
-	 * @see #setContainer(Region)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTransition_Container()
-	 * @see org.eclipse.epf.uma.Region#getTransition
-	 * @model opposite="Transition" required="true"
-	 * @generated
-	 */
-	Region getContainer_();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Transition#getContainer_ <em>Container</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Container</em>' container reference.
-	 * @see #getContainer_()
-	 * @generated
-	 */
-	void setContainer(Region value);
-
-	/**
-	 * Returns the value of the '<em><b>Source</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Vertex#getOutgoing <em>Outgoing</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source</em>' reference.
-	 * @see #setSource(Vertex)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTransition_Source()
-	 * @see org.eclipse.epf.uma.Vertex#getOutgoing
-	 * @model opposite="outgoing" required="true"
-	 * @generated
-	 */
-	Vertex getSource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Transition#getSource <em>Source</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source</em>' reference.
-	 * @see #getSource()
-	 * @generated
-	 */
-	void setSource(Vertex value);
-
-	/**
-	 * Returns the value of the '<em><b>Target</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Vertex#getIncoming <em>Incoming</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Target</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Target</em>' reference.
-	 * @see #setTarget(Vertex)
-	 * @see org.eclipse.epf.uma.UmaPackage#getTransition_Target()
-	 * @see org.eclipse.epf.uma.Vertex#getIncoming
-	 * @model opposite="incoming" required="true"
-	 * @generated
-	 */
-	Vertex getTarget();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Transition#getTarget <em>Target</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Target</em>' reference.
-	 * @see #getTarget()
-	 * @generated
-	 */
-	void setTarget(Vertex value);
-
-} // Transition
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Type.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Type.java
deleted file mode 100644
index 0a3ceac..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Type.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * UML 2.0 meta-class Type.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getType()
- * @model abstract="true"
- * @generated
- */
-public interface Type extends PackageableElement {
-} // Type
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UMASemanticModelBridge.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UMASemanticModelBridge.java
deleted file mode 100644
index 01a8958..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UMASemanticModelBridge.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>UMA Semantic Model Bridge</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.UMASemanticModelBridge#getElement <em>Element</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getUMASemanticModelBridge()
- * @model
- * @generated
- */
-public interface UMASemanticModelBridge extends SemanticModelBridge {
-	/**
-	 * Returns the value of the '<em><b>Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Element</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Element</em>' reference.
-	 * @see #setElement(MethodElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getUMASemanticModelBridge_Element()
-	 * @model
-	 * @generated
-	 */
-	MethodElement getElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.UMASemanticModelBridge#getElement <em>Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Element</em>' reference.
-	 * @see #getElement()
-	 * @generated
-	 */
-	void setElement(MethodElement value);
-
-} // UMASemanticModelBridge
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UmaFactory.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UmaFactory.java
deleted file mode 100644
index 0488cee..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UmaFactory.java
+++ /dev/null
@@ -1,851 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-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.epf.uma.UmaPackage
- * @generated
- */
-public interface UmaFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	UmaFactory eINSTANCE = org.eclipse.epf.uma.impl.UmaFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Package</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Package</em>'.
-	 * @generated
-	 */
-	org.eclipse.epf.uma.Package createPackage();
-
-	/**
-	 * Returns a new object of class '<em>Constraint</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Constraint</em>'.
-	 * @generated
-	 */
-	Constraint createConstraint();
-
-	/**
-	 * Returns a new object of class '<em>Method Element Property</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Element Property</em>'.
-	 * @generated
-	 */
-	MethodElementProperty createMethodElementProperty();
-
-	/**
-	 * Returns a new object of class '<em>Content Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Content Description</em>'.
-	 * @generated
-	 */
-	ContentDescription createContentDescription();
-
-	/**
-	 * Returns a new object of class '<em>Section</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Section</em>'.
-	 * @generated
-	 */
-	Section createSection();
-
-	/**
-	 * Returns a new object of class '<em>Role</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role</em>'.
-	 * @generated
-	 */
-	Role createRole();
-
-	/**
-	 * Returns a new object of class '<em>Task</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task</em>'.
-	 * @generated
-	 */
-	Task createTask();
-
-	/**
-	 * Returns a new object of class '<em>Step</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Step</em>'.
-	 * @generated
-	 */
-	Step createStep();
-
-	/**
-	 * Returns a new object of class '<em>Artifact</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Artifact</em>'.
-	 * @generated
-	 */
-	Artifact createArtifact();
-
-	/**
-	 * Returns a new object of class '<em>Deliverable</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Deliverable</em>'.
-	 * @generated
-	 */
-	Deliverable createDeliverable();
-
-	/**
-	 * Returns a new object of class '<em>Outcome</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Outcome</em>'.
-	 * @generated
-	 */
-	Outcome createOutcome();
-
-	/**
-	 * Returns a new object of class '<em>Content Package</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Content Package</em>'.
-	 * @generated
-	 */
-	ContentPackage createContentPackage();
-
-	/**
-	 * Returns a new object of class '<em>Artifact Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Artifact Description</em>'.
-	 * @generated
-	 */
-	ArtifactDescription createArtifactDescription();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Description</em>'.
-	 * @generated
-	 */
-	WorkProductDescription createWorkProductDescription();
-
-	/**
-	 * Returns a new object of class '<em>Deliverable Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Deliverable Description</em>'.
-	 * @generated
-	 */
-	DeliverableDescription createDeliverableDescription();
-
-	/**
-	 * Returns a new object of class '<em>Role Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Description</em>'.
-	 * @generated
-	 */
-	RoleDescription createRoleDescription();
-
-	/**
-	 * Returns a new object of class '<em>Task Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task Description</em>'.
-	 * @generated
-	 */
-	TaskDescription createTaskDescription();
-
-	/**
-	 * Returns a new object of class '<em>Guidance Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Guidance Description</em>'.
-	 * @generated
-	 */
-	GuidanceDescription createGuidanceDescription();
-
-	/**
-	 * Returns a new object of class '<em>Practice Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Practice Description</em>'.
-	 * @generated
-	 */
-	PracticeDescription createPracticeDescription();
-
-	/**
-	 * Returns a new object of class '<em>Point</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Point</em>'.
-	 * @generated
-	 */
-	Point createPoint();
-
-	/**
-	 * Returns a new object of class '<em>Diagram Link</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Diagram Link</em>'.
-	 * @generated
-	 */
-	DiagramLink createDiagramLink();
-
-	/**
-	 * Returns a new object of class '<em>Graph Connector</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Graph Connector</em>'.
-	 * @generated
-	 */
-	GraphConnector createGraphConnector();
-
-	/**
-	 * Returns a new object of class '<em>Dimension</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Dimension</em>'.
-	 * @generated
-	 */
-	Dimension createDimension();
-
-	/**
-	 * Returns a new object of class '<em>Reference</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Reference</em>'.
-	 * @generated
-	 */
-	Reference createReference();
-
-	/**
-	 * Returns a new object of class '<em>Property</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property</em>'.
-	 * @generated
-	 */
-	Property createProperty();
-
-	/**
-	 * Returns a new object of class '<em>Graph Edge</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Graph Edge</em>'.
-	 * @generated
-	 */
-	GraphEdge createGraphEdge();
-
-	/**
-	 * Returns a new object of class '<em>Diagram</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Diagram</em>'.
-	 * @generated
-	 */
-	Diagram createDiagram();
-
-	/**
-	 * Returns a new object of class '<em>Graph Node</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Graph Node</em>'.
-	 * @generated
-	 */
-	GraphNode createGraphNode();
-
-	/**
-	 * Returns a new object of class '<em>Simple Semantic Model Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Simple Semantic Model Element</em>'.
-	 * @generated
-	 */
-	SimpleSemanticModelElement createSimpleSemanticModelElement();
-
-	/**
-	 * Returns a new object of class '<em>UMA Semantic Model Bridge</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>UMA Semantic Model Bridge</em>'.
-	 * @generated
-	 */
-	UMASemanticModelBridge createUMASemanticModelBridge();
-
-	/**
-	 * Returns a new object of class '<em>Core Semantic Model Bridge</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Core Semantic Model Bridge</em>'.
-	 * @generated
-	 */
-	CoreSemanticModelBridge createCoreSemanticModelBridge();
-
-	/**
-	 * Returns a new object of class '<em>Text Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Text Element</em>'.
-	 * @generated
-	 */
-	TextElement createTextElement();
-
-	/**
-	 * Returns a new object of class '<em>Image</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Image</em>'.
-	 * @generated
-	 */
-	Image createImage();
-
-	/**
-	 * Returns a new object of class '<em>Polyline</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Polyline</em>'.
-	 * @generated
-	 */
-	Polyline createPolyline();
-
-	/**
-	 * Returns a new object of class '<em>Ellipse</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ellipse</em>'.
-	 * @generated
-	 */
-	Ellipse createEllipse();
-
-	/**
-	 * Returns a new object of class '<em>Activity</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Activity</em>'.
-	 * @generated
-	 */
-	Activity createActivity();
-
-	/**
-	 * Returns a new object of class '<em>Milestone</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Milestone</em>'.
-	 * @generated
-	 */
-	Milestone createMilestone();
-
-	/**
-	 * Returns a new object of class '<em>Iteration</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Iteration</em>'.
-	 * @generated
-	 */
-	Iteration createIteration();
-
-	/**
-	 * Returns a new object of class '<em>Phase</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Phase</em>'.
-	 * @generated
-	 */
-	Phase createPhase();
-
-	/**
-	 * Returns a new object of class '<em>Team Profile</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Team Profile</em>'.
-	 * @generated
-	 */
-	TeamProfile createTeamProfile();
-
-	/**
-	 * Returns a new object of class '<em>Role Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Descriptor</em>'.
-	 * @generated
-	 */
-	RoleDescriptor createRoleDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Work Order</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Order</em>'.
-	 * @generated
-	 */
-	WorkOrder createWorkOrder();
-
-	/**
-	 * Returns a new object of class '<em>Planning Data</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Planning Data</em>'.
-	 * @generated
-	 */
-	PlanningData createPlanningData();
-
-	/**
-	 * Returns a new object of class '<em>Task Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task Descriptor</em>'.
-	 * @generated
-	 */
-	TaskDescriptor createTaskDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Descriptor</em>'.
-	 * @generated
-	 */
-	WorkProductDescriptor createWorkProductDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Composite Role</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Composite Role</em>'.
-	 * @generated
-	 */
-	CompositeRole createCompositeRole();
-
-	/**
-	 * Returns a new object of class '<em>Breakdown Element Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Breakdown Element Description</em>'.
-	 * @generated
-	 */
-	BreakdownElementDescription createBreakdownElementDescription();
-
-	/**
-	 * Returns a new object of class '<em>Activity Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Activity Description</em>'.
-	 * @generated
-	 */
-	ActivityDescription createActivityDescription();
-
-	/**
-	 * Returns a new object of class '<em>Delivery Process Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Delivery Process Description</em>'.
-	 * @generated
-	 */
-	DeliveryProcessDescription createDeliveryProcessDescription();
-
-	/**
-	 * Returns a new object of class '<em>Process Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Description</em>'.
-	 * @generated
-	 */
-	ProcessDescription createProcessDescription();
-
-	/**
-	 * Returns a new object of class '<em>Descriptor Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Descriptor Description</em>'.
-	 * @generated
-	 */
-	DescriptorDescription createDescriptorDescription();
-
-	/**
-	 * Returns a new object of class '<em>Concept</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Concept</em>'.
-	 * @generated
-	 */
-	Concept createConcept();
-
-	/**
-	 * Returns a new object of class '<em>Checklist</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Checklist</em>'.
-	 * @generated
-	 */
-	Checklist createChecklist();
-
-	/**
-	 * Returns a new object of class '<em>Example</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Example</em>'.
-	 * @generated
-	 */
-	Example createExample();
-
-	/**
-	 * Returns a new object of class '<em>Guideline</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Guideline</em>'.
-	 * @generated
-	 */
-	Guideline createGuideline();
-
-	/**
-	 * Returns a new object of class '<em>Estimation Considerations</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Estimation Considerations</em>'.
-	 * @generated
-	 */
-	EstimationConsiderations createEstimationConsiderations();
-
-	/**
-	 * Returns a new object of class '<em>Report</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Report</em>'.
-	 * @generated
-	 */
-	Report createReport();
-
-	/**
-	 * Returns a new object of class '<em>Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Template</em>'.
-	 * @generated
-	 */
-	Template createTemplate();
-
-	/**
-	 * Returns a new object of class '<em>Supporting Material</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Supporting Material</em>'.
-	 * @generated
-	 */
-	SupportingMaterial createSupportingMaterial();
-
-	/**
-	 * Returns a new object of class '<em>Tool Mentor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tool Mentor</em>'.
-	 * @generated
-	 */
-	ToolMentor createToolMentor();
-
-	/**
-	 * Returns a new object of class '<em>Whitepaper</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Whitepaper</em>'.
-	 * @generated
-	 */
-	Whitepaper createWhitepaper();
-
-	/**
-	 * Returns a new object of class '<em>Term Definition</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Term Definition</em>'.
-	 * @generated
-	 */
-	TermDefinition createTermDefinition();
-
-	/**
-	 * Returns a new object of class '<em>Practice</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Practice</em>'.
-	 * @generated
-	 */
-	Practice createPractice();
-
-	/**
-	 * Returns a new object of class '<em>Reusable Asset</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Reusable Asset</em>'.
-	 * @generated
-	 */
-	ReusableAsset createReusableAsset();
-
-	/**
-	 * Returns a new object of class '<em>State</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>State</em>'.
-	 * @generated
-	 */
-	State createState();
-
-	/**
-	 * Returns a new object of class '<em>Vertex</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Vertex</em>'.
-	 * @generated
-	 */
-	Vertex createVertex();
-
-	/**
-	 * Returns a new object of class '<em>Region</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Region</em>'.
-	 * @generated
-	 */
-	Region createRegion();
-
-	/**
-	 * Returns a new object of class '<em>State Machine</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>State Machine</em>'.
-	 * @generated
-	 */
-	StateMachine createStateMachine();
-
-	/**
-	 * Returns a new object of class '<em>Transition</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Transition</em>'.
-	 * @generated
-	 */
-	Transition createTransition();
-
-	/**
-	 * Returns a new object of class '<em>Pseudo State</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Pseudo State</em>'.
-	 * @generated
-	 */
-	PseudoState createPseudoState();
-
-	/**
-	 * Returns a new object of class '<em>Discipline</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Discipline</em>'.
-	 * @generated
-	 */
-	Discipline createDiscipline();
-
-	/**
-	 * Returns a new object of class '<em>Role Set</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Set</em>'.
-	 * @generated
-	 */
-	RoleSet createRoleSet();
-
-	/**
-	 * Returns a new object of class '<em>Domain</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Domain</em>'.
-	 * @generated
-	 */
-	Domain createDomain();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Type</em>'.
-	 * @generated
-	 */
-	WorkProductType createWorkProductType();
-
-	/**
-	 * Returns a new object of class '<em>Discipline Grouping</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Discipline Grouping</em>'.
-	 * @generated
-	 */
-	DisciplineGrouping createDisciplineGrouping();
-
-	/**
-	 * Returns a new object of class '<em>Tool</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tool</em>'.
-	 * @generated
-	 */
-	Tool createTool();
-
-	/**
-	 * Returns a new object of class '<em>Role Set Grouping</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Set Grouping</em>'.
-	 * @generated
-	 */
-	RoleSetGrouping createRoleSetGrouping();
-
-	/**
-	 * Returns a new object of class '<em>Custom Category</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Custom Category</em>'.
-	 * @generated
-	 */
-	CustomCategory createCustomCategory();
-
-	/**
-	 * Returns a new object of class '<em>Delivery Process</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Delivery Process</em>'.
-	 * @generated
-	 */
-	DeliveryProcess createDeliveryProcess();
-
-	/**
-	 * Returns a new object of class '<em>Capability Pattern</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Capability Pattern</em>'.
-	 * @generated
-	 */
-	CapabilityPattern createCapabilityPattern();
-
-	/**
-	 * Returns a new object of class '<em>Process Planning Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Planning Template</em>'.
-	 * @generated
-	 */
-	ProcessPlanningTemplate createProcessPlanningTemplate();
-
-	/**
-	 * Returns a new object of class '<em>Roadmap</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Roadmap</em>'.
-	 * @generated
-	 */
-	Roadmap createRoadmap();
-
-	/**
-	 * Returns a new object of class '<em>Process Component</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Component</em>'.
-	 * @generated
-	 */
-	ProcessComponent createProcessComponent();
-
-	/**
-	 * Returns a new object of class '<em>Process Package</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Package</em>'.
-	 * @generated
-	 */
-	ProcessPackage createProcessPackage();
-
-	/**
-	 * Returns a new object of class '<em>Process Component Interface</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Component Interface</em>'.
-	 * @generated
-	 */
-	ProcessComponentInterface createProcessComponentInterface();
-
-	/**
-	 * Returns a new object of class '<em>Process Component Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Component Descriptor</em>'.
-	 * @generated
-	 */
-	ProcessComponentDescriptor createProcessComponentDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Method Plugin</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Plugin</em>'.
-	 * @generated
-	 */
-	MethodPlugin createMethodPlugin();
-
-	/**
-	 * Returns a new object of class '<em>Method Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Configuration</em>'.
-	 * @generated
-	 */
-	MethodConfiguration createMethodConfiguration();
-
-	/**
-	 * Returns a new object of class '<em>Process Family</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Family</em>'.
-	 * @generated
-	 */
-	ProcessFamily createProcessFamily();
-
-	/**
-	 * Returns a new object of class '<em>Method Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Library</em>'.
-	 * @generated
-	 */
-	MethodLibrary createMethodLibrary();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	UmaPackage getUmaPackage();
-
-} //UmaFactory
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UmaPackage.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UmaPackage.java
deleted file mode 100644
index 0068ca1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/UmaPackage.java
+++ /dev/null
@@ -1,27850 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-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 -->
- * <!-- begin-model-doc -->
- * 03
- * <!-- end-model-doc -->
- * @see org.eclipse.epf.uma.UmaFactory
- * @model kind="package"
- * @generated
- */
-public interface UmaPackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "uma";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/epf/uma/1.0.4/uma.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "org.eclipse.epf.uma";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	UmaPackage eINSTANCE = org.eclipse.epf.uma.impl.UmaPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ElementImpl <em>Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getElement()
-	 * @generated
-	 */
-	int ELEMENT = 2;
-
-	/**
-	 * The number of structural features of the '<em>Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELEMENT_FEATURE_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.NamedElementImpl <em>Named Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.NamedElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getNamedElement()
-	 * @generated
-	 */
-	int NAMED_ELEMENT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMED_ELEMENT__NAME = ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Named Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMED_ELEMENT_FEATURE_COUNT = ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PackageableElementImpl <em>Packageable Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PackageableElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPackageableElement()
-	 * @generated
-	 */
-	int PACKAGEABLE_ELEMENT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PACKAGEABLE_ELEMENT__NAME = NAMED_ELEMENT__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Packageable Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PACKAGEABLE_ELEMENT_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TypeImpl <em>Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TypeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getType()
-	 * @generated
-	 */
-	int TYPE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TYPE__NAME = PACKAGEABLE_ELEMENT__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TYPE_FEATURE_COUNT = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ClassifierImpl <em>Classifier</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ClassifierImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getClassifier()
-	 * @generated
-	 */
-	int CLASSIFIER = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLASSIFIER__NAME = TYPE__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Classifier</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLASSIFIER_FEATURE_COUNT = TYPE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.NamespaceImpl <em>Namespace</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.NamespaceImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getNamespace()
-	 * @generated
-	 */
-	int NAMESPACE = 6;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMESPACE__NAME = NAMED_ELEMENT__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Namespace</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMESPACE_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PackageImpl <em>Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PackageImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPackage()
-	 * @generated
-	 */
-	int PACKAGE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PACKAGE__NAME = NAMESPACE__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PACKAGE_FEATURE_COUNT = NAMESPACE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MethodElementImpl <em>Method Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MethodElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodElement()
-	 * @generated
-	 */
-	int METHOD_ELEMENT = 7;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__NAME = PACKAGEABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__GUID = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__BRIEF_DESCRIPTION = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__OWNED_RULES = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__SUPPRESSED = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__ORDERING_GUIDE = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Method Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_FEATURE_COUNT = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ConstraintImpl <em>Constraint</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ConstraintImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getConstraint()
-	 * @generated
-	 */
-	int CONSTRAINT = 8;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__GUID = METHOD_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__OWNED_RULES = METHOD_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Body</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__BODY = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Constraint</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MethodElementPropertyImpl <em>Method Element Property</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MethodElementPropertyImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodElementProperty()
-	 * @generated
-	 */
-	int METHOD_ELEMENT_PROPERTY = 9;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_PROPERTY__NAME = PACKAGEABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_PROPERTY__VALUE = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Method Element Property</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_PROPERTY_FEATURE_COUNT = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DescribableElementImpl <em>Describable Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DescribableElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDescribableElement()
-	 * @generated
-	 */
-	int DESCRIBABLE_ELEMENT = 11;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__GUID = METHOD_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__OWNED_RULES = METHOD_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__PRESENTATION_NAME = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__PRESENTATION = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__SHAPEICON = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__NODEICON = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Describable Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.VariabilityElementImpl <em>Variability Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.VariabilityElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getVariabilityElement()
-	 * @generated
-	 */
-	int VARIABILITY_ELEMENT = 111;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ContentElementImpl <em>Content Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ContentElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentElement()
-	 * @generated
-	 */
-	int CONTENT_ELEMENT = 10;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__NAME = DESCRIBABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__GUID = DESCRIBABLE_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__BRIEF_DESCRIPTION = DESCRIBABLE_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__OWNED_RULES = DESCRIBABLE_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY = DESCRIBABLE_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__SUPPRESSED = DESCRIBABLE_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__ORDERING_GUIDE = DESCRIBABLE_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__PRESENTATION_NAME = DESCRIBABLE_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__PRESENTATION = DESCRIBABLE_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__SHAPEICON = DESCRIBABLE_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__NODEICON = DESCRIBABLE_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__VARIABILITY_TYPE = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__SUPPORTING_MATERIALS = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__CONCEPTS_AND_PAPERS = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__CHECKLISTS = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__GUIDELINES = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__EXAMPLES = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__ASSETS = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__TERM_DEFINITION = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The number of structural features of the '<em>Content Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT_FEATURE_COUNT = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MethodUnitImpl <em>Method Unit</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MethodUnitImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodUnit()
-	 * @generated
-	 */
-	int METHOD_UNIT = 112;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__GUID = METHOD_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__OWNED_RULES = METHOD_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__AUTHORS = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__CHANGE_DATE = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__CHANGE_DESCRIPTION = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__VERSION = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__COPYRIGHT_STATEMENT = METHOD_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The number of structural features of the '<em>Method Unit</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ContentDescriptionImpl <em>Content Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ContentDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentDescription()
-	 * @generated
-	 */
-	int CONTENT_DESCRIPTION = 12;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__GUID = METHOD_UNIT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__OWNED_RULES = METHOD_UNIT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__COPYRIGHT_STATEMENT = METHOD_UNIT__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__MAIN_DESCRIPTION = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__SECTIONS = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__EXTERNAL_ID = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__KEY_CONSIDERATIONS = METHOD_UNIT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Content Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__GUID = METHOD_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__OWNED_RULES = METHOD_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__VARIABILITY_TYPE = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Variability Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABILITY_ELEMENT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.SectionImpl <em>Section</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.SectionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSection()
-	 * @generated
-	 */
-	int SECTION = 13;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__NAME = VARIABILITY_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__GUID = VARIABILITY_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__BRIEF_DESCRIPTION = VARIABILITY_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__OWNED_RULES = VARIABILITY_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__METHOD_ELEMENT_PROPERTY = VARIABILITY_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__SUPPRESSED = VARIABILITY_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__ORDERING_GUIDE = VARIABILITY_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__VARIABILITY_TYPE = VARIABILITY_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__VARIABILITY_BASED_ON_ELEMENT = VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Section Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__SECTION_NAME = VARIABILITY_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Section Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__SECTION_DESCRIPTION = VARIABILITY_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Sub Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__SUB_SECTIONS = VARIABILITY_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__PREDECESSOR = VARIABILITY_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Section</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_FEATURE_COUNT = VARIABILITY_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.RoleImpl <em>Role</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.RoleImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRole()
-	 * @generated
-	 */
-	int ROLE = 14;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__GUID = CONTENT_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__OWNED_RULES = CONTENT_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__SUPPORTING_MATERIALS = CONTENT_ELEMENT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__CONCEPTS_AND_PAPERS = CONTENT_ELEMENT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__CHECKLISTS = CONTENT_ELEMENT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__GUIDELINES = CONTENT_ELEMENT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__EXAMPLES = CONTENT_ELEMENT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__ASSETS = CONTENT_ELEMENT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__TERM_DEFINITION = CONTENT_ELEMENT__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Modifies</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__MODIFIES = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Responsible For</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__RESPONSIBLE_FOR = CONTENT_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Role</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WorkProductImpl <em>Work Product</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WorkProductImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProduct()
-	 * @generated
-	 */
-	int WORK_PRODUCT = 15;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__GUID = CONTENT_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__OWNED_RULES = CONTENT_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__SUPPORTING_MATERIALS = CONTENT_ELEMENT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__CONCEPTS_AND_PAPERS = CONTENT_ELEMENT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__CHECKLISTS = CONTENT_ELEMENT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__GUIDELINES = CONTENT_ELEMENT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__EXAMPLES = CONTENT_ELEMENT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__ASSETS = CONTENT_ELEMENT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__TERM_DEFINITION = CONTENT_ELEMENT__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Reports</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__REPORTS = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Templates</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__TEMPLATES = CONTENT_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentors</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__TOOL_MENTORS = CONTENT_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__ESTIMATION_CONSIDERATIONS = CONTENT_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Work Product</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TaskImpl <em>Task</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TaskImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTask()
-	 * @generated
-	 */
-	int TASK = 16;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__GUID = CONTENT_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OWNED_RULES = CONTENT_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SUPPORTING_MATERIALS = CONTENT_ELEMENT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CONCEPTS_AND_PAPERS = CONTENT_ELEMENT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CHECKLISTS = CONTENT_ELEMENT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__GUIDELINES = CONTENT_ELEMENT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EXAMPLES = CONTENT_ELEMENT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ASSETS = CONTENT_ELEMENT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__TERM_DEFINITION = CONTENT_ELEMENT__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRECONDITION = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__POSTCONDITION = CONTENT_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Performed By</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PERFORMED_BY = CONTENT_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Mandatory Input</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__MANDATORY_INPUT = CONTENT_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Output</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OUTPUT = CONTENT_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Additionally Performed By</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ADDITIONALLY_PERFORMED_BY = CONTENT_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Optional Input</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OPTIONAL_INPUT = CONTENT_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Steps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__STEPS = CONTENT_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentors</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__TOOL_MENTORS = CONTENT_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ESTIMATION_CONSIDERATIONS = CONTENT_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The number of structural features of the '<em>Task</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 10;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WorkDefinitionImpl <em>Work Definition</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WorkDefinitionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkDefinition()
-	 * @generated
-	 */
-	int WORK_DEFINITION = 17;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__GUID = METHOD_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__OWNED_RULES = METHOD_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__PRECONDITION = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__POSTCONDITION = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Work Definition</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.StepImpl <em>Step</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.StepImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getStep()
-	 * @generated
-	 */
-	int STEP = 18;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__NAME = SECTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__GUID = SECTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__BRIEF_DESCRIPTION = SECTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__OWNED_RULES = SECTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__METHOD_ELEMENT_PROPERTY = SECTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__SUPPRESSED = SECTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__ORDERING_GUIDE = SECTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__VARIABILITY_TYPE = SECTION__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__VARIABILITY_BASED_ON_ELEMENT = SECTION__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Section Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__SECTION_NAME = SECTION__SECTION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Section Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__SECTION_DESCRIPTION = SECTION__SECTION_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sub Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__SUB_SECTIONS = SECTION__SUB_SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__PREDECESSOR = SECTION__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__PRECONDITION = SECTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP__POSTCONDITION = SECTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Step</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STEP_FEATURE_COUNT = SECTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GuidanceImpl <em>Guidance</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GuidanceImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGuidance()
-	 * @generated
-	 */
-	int GUIDANCE = 19;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__GUID = CONTENT_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__OWNED_RULES = CONTENT_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__SUPPORTING_MATERIALS = CONTENT_ELEMENT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__CONCEPTS_AND_PAPERS = CONTENT_ELEMENT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__CHECKLISTS = CONTENT_ELEMENT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__GUIDELINES = CONTENT_ELEMENT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__EXAMPLES = CONTENT_ELEMENT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__ASSETS = CONTENT_ELEMENT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__TERM_DEFINITION = CONTENT_ELEMENT__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Guidance</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ArtifactImpl <em>Artifact</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ArtifactImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getArtifact()
-	 * @generated
-	 */
-	int ARTIFACT = 20;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__NAME = WORK_PRODUCT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__GUID = WORK_PRODUCT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__BRIEF_DESCRIPTION = WORK_PRODUCT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__OWNED_RULES = WORK_PRODUCT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__SUPPRESSED = WORK_PRODUCT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__ORDERING_GUIDE = WORK_PRODUCT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__PRESENTATION_NAME = WORK_PRODUCT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__PRESENTATION = WORK_PRODUCT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__SHAPEICON = WORK_PRODUCT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__NODEICON = WORK_PRODUCT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__VARIABILITY_TYPE = WORK_PRODUCT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__VARIABILITY_BASED_ON_ELEMENT = WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__SUPPORTING_MATERIALS = WORK_PRODUCT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__CONCEPTS_AND_PAPERS = WORK_PRODUCT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__CHECKLISTS = WORK_PRODUCT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__GUIDELINES = WORK_PRODUCT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__EXAMPLES = WORK_PRODUCT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__ASSETS = WORK_PRODUCT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__TERM_DEFINITION = WORK_PRODUCT__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Reports</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__REPORTS = WORK_PRODUCT__REPORTS;
-
-	/**
-	 * The feature id for the '<em><b>Templates</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__TEMPLATES = WORK_PRODUCT__TEMPLATES;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentors</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__TOOL_MENTORS = WORK_PRODUCT__TOOL_MENTORS;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__ESTIMATION_CONSIDERATIONS = WORK_PRODUCT__ESTIMATION_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Container Artifact</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__CONTAINER_ARTIFACT = WORK_PRODUCT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Contained Artifacts</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__CONTAINED_ARTIFACTS = WORK_PRODUCT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Artifact</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_FEATURE_COUNT = WORK_PRODUCT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DeliverableImpl <em>Deliverable</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DeliverableImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliverable()
-	 * @generated
-	 */
-	int DELIVERABLE = 21;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__NAME = WORK_PRODUCT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__GUID = WORK_PRODUCT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__BRIEF_DESCRIPTION = WORK_PRODUCT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__OWNED_RULES = WORK_PRODUCT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__SUPPRESSED = WORK_PRODUCT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__ORDERING_GUIDE = WORK_PRODUCT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__PRESENTATION_NAME = WORK_PRODUCT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__PRESENTATION = WORK_PRODUCT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__SHAPEICON = WORK_PRODUCT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__NODEICON = WORK_PRODUCT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__VARIABILITY_TYPE = WORK_PRODUCT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__VARIABILITY_BASED_ON_ELEMENT = WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__SUPPORTING_MATERIALS = WORK_PRODUCT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__CONCEPTS_AND_PAPERS = WORK_PRODUCT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__CHECKLISTS = WORK_PRODUCT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__GUIDELINES = WORK_PRODUCT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__EXAMPLES = WORK_PRODUCT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__ASSETS = WORK_PRODUCT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__TERM_DEFINITION = WORK_PRODUCT__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Reports</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__REPORTS = WORK_PRODUCT__REPORTS;
-
-	/**
-	 * The feature id for the '<em><b>Templates</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__TEMPLATES = WORK_PRODUCT__TEMPLATES;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentors</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__TOOL_MENTORS = WORK_PRODUCT__TOOL_MENTORS;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__ESTIMATION_CONSIDERATIONS = WORK_PRODUCT__ESTIMATION_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Delivered Work Products</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__DELIVERED_WORK_PRODUCTS = WORK_PRODUCT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Deliverable</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_FEATURE_COUNT = WORK_PRODUCT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.OutcomeImpl <em>Outcome</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.OutcomeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getOutcome()
-	 * @generated
-	 */
-	int OUTCOME = 22;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__NAME = WORK_PRODUCT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__GUID = WORK_PRODUCT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__BRIEF_DESCRIPTION = WORK_PRODUCT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__OWNED_RULES = WORK_PRODUCT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__SUPPRESSED = WORK_PRODUCT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__ORDERING_GUIDE = WORK_PRODUCT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__PRESENTATION_NAME = WORK_PRODUCT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__PRESENTATION = WORK_PRODUCT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__SHAPEICON = WORK_PRODUCT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__NODEICON = WORK_PRODUCT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__VARIABILITY_TYPE = WORK_PRODUCT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__VARIABILITY_BASED_ON_ELEMENT = WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__SUPPORTING_MATERIALS = WORK_PRODUCT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__CONCEPTS_AND_PAPERS = WORK_PRODUCT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__CHECKLISTS = WORK_PRODUCT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__GUIDELINES = WORK_PRODUCT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__EXAMPLES = WORK_PRODUCT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__ASSETS = WORK_PRODUCT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__TERM_DEFINITION = WORK_PRODUCT__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Reports</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__REPORTS = WORK_PRODUCT__REPORTS;
-
-	/**
-	 * The feature id for the '<em><b>Templates</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__TEMPLATES = WORK_PRODUCT__TEMPLATES;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentors</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__TOOL_MENTORS = WORK_PRODUCT__TOOL_MENTORS;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__ESTIMATION_CONSIDERATIONS = WORK_PRODUCT__ESTIMATION_CONSIDERATIONS;
-
-	/**
-	 * The number of structural features of the '<em>Outcome</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME_FEATURE_COUNT = WORK_PRODUCT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MethodPackageImpl <em>Method Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MethodPackageImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodPackage()
-	 * @generated
-	 */
-	int METHOD_PACKAGE = 23;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__GUID = METHOD_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__OWNED_RULES = METHOD_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__GLOBAL = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Reused Packages</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__REUSED_PACKAGES = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Child Packages</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__CHILD_PACKAGES = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Method Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ContentPackageImpl <em>Content Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ContentPackageImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentPackage()
-	 * @generated
-	 */
-	int CONTENT_PACKAGE = 24;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__NAME = METHOD_PACKAGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__GUID = METHOD_PACKAGE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__BRIEF_DESCRIPTION = METHOD_PACKAGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__OWNED_RULES = METHOD_PACKAGE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__METHOD_ELEMENT_PROPERTY = METHOD_PACKAGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__SUPPRESSED = METHOD_PACKAGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__ORDERING_GUIDE = METHOD_PACKAGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__GLOBAL = METHOD_PACKAGE__GLOBAL;
-
-	/**
-	 * The feature id for the '<em><b>Reused Packages</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__REUSED_PACKAGES = METHOD_PACKAGE__REUSED_PACKAGES;
-
-	/**
-	 * The feature id for the '<em><b>Child Packages</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__CHILD_PACKAGES = METHOD_PACKAGE__CHILD_PACKAGES;
-
-	/**
-	 * The feature id for the '<em><b>Content Elements</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__CONTENT_ELEMENTS = METHOD_PACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Content Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE_FEATURE_COUNT = METHOD_PACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WorkProductDescriptionImpl <em>Work Product Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WorkProductDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProductDescription()
-	 * @generated
-	 */
-	int WORK_PRODUCT_DESCRIPTION = 26;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__GUID = CONTENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__OWNED_RULES = CONTENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__COPYRIGHT_STATEMENT = CONTENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__SECTIONS = CONTENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__PURPOSE = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ArtifactDescriptionImpl <em>Artifact Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ArtifactDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getArtifactDescription()
-	 * @generated
-	 */
-	int ARTIFACT_DESCRIPTION = 25;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__NAME = WORK_PRODUCT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__GUID = WORK_PRODUCT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__BRIEF_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__OWNED_RULES = WORK_PRODUCT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__SUPPRESSED = WORK_PRODUCT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__ORDERING_GUIDE = WORK_PRODUCT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__AUTHORS = WORK_PRODUCT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__CHANGE_DATE = WORK_PRODUCT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__CHANGE_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__VERSION = WORK_PRODUCT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__COPYRIGHT_STATEMENT = WORK_PRODUCT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__MAIN_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__SECTIONS = WORK_PRODUCT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__EXTERNAL_ID = WORK_PRODUCT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__KEY_CONSIDERATIONS = WORK_PRODUCT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__PURPOSE = WORK_PRODUCT_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__IMPACT_OF_NOT_HAVING = WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING;
-
-	/**
-	 * The feature id for the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__REASONS_FOR_NOT_NEEDING = WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING;
-
-	/**
-	 * The feature id for the '<em><b>Brief Outline</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__BRIEF_OUTLINE = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Representation Options</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Representation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__REPRESENTATION = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Notation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__NOTATION = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Artifact Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION_FEATURE_COUNT = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DeliverableDescriptionImpl <em>Deliverable Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DeliverableDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliverableDescription()
-	 * @generated
-	 */
-	int DELIVERABLE_DESCRIPTION = 27;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__NAME = WORK_PRODUCT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__GUID = WORK_PRODUCT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__BRIEF_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__OWNED_RULES = WORK_PRODUCT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__SUPPRESSED = WORK_PRODUCT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__ORDERING_GUIDE = WORK_PRODUCT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__AUTHORS = WORK_PRODUCT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__CHANGE_DATE = WORK_PRODUCT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__CHANGE_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__VERSION = WORK_PRODUCT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__COPYRIGHT_STATEMENT = WORK_PRODUCT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__MAIN_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__SECTIONS = WORK_PRODUCT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__EXTERNAL_ID = WORK_PRODUCT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__KEY_CONSIDERATIONS = WORK_PRODUCT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__PURPOSE = WORK_PRODUCT_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__IMPACT_OF_NOT_HAVING = WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING;
-
-	/**
-	 * The feature id for the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__REASONS_FOR_NOT_NEEDING = WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING;
-
-	/**
-	 * The feature id for the '<em><b>External Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Packaging Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Deliverable Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION_FEATURE_COUNT = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.RoleDescriptionImpl <em>Role Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.RoleDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleDescription()
-	 * @generated
-	 */
-	int ROLE_DESCRIPTION = 28;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__GUID = CONTENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__OWNED_RULES = CONTENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__COPYRIGHT_STATEMENT = CONTENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SECTIONS = CONTENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Skills</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SKILLS = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Assignment Approaches</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Synonyms</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SYNONYMS = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Role Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TaskDescriptionImpl <em>Task Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TaskDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTaskDescription()
-	 * @generated
-	 */
-	int TASK_DESCRIPTION = 29;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__GUID = CONTENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__OWNED_RULES = CONTENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__COPYRIGHT_STATEMENT = CONTENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__SECTIONS = CONTENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__PURPOSE = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__ALTERNATIVES = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Task Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GuidanceDescriptionImpl <em>Guidance Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GuidanceDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGuidanceDescription()
-	 * @generated
-	 */
-	int GUIDANCE_DESCRIPTION = 30;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__GUID = CONTENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__OWNED_RULES = CONTENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__COPYRIGHT_STATEMENT = CONTENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__SECTIONS = CONTENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Attachments</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__ATTACHMENTS = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Guidance Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl <em>Practice Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PracticeDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPracticeDescription()
-	 * @generated
-	 */
-	int PRACTICE_DESCRIPTION = 31;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__GUID = CONTENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__OWNED_RULES = CONTENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__COPYRIGHT_STATEMENT = CONTENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__SECTIONS = CONTENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Additional Info</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__ADDITIONAL_INFO = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Problem</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__PROBLEM = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Background</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__BACKGROUND = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__GOALS = CONTENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Application</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__APPLICATION = CONTENT_DESCRIPTION_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Levels Of Adoption</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION = CONTENT_DESCRIPTION_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Practice Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PointImpl <em>Point</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PointImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPoint()
-	 * @generated
-	 */
-	int POINT = 32;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POINT__X = 0;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POINT__Y = 1;
-
-	/**
-	 * The number of structural features of the '<em>Point</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POINT_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DiagramElementImpl <em>Diagram Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DiagramElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiagramElement()
-	 * @generated
-	 */
-	int DIAGRAM_ELEMENT = 34;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__GUID = METHOD_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__OWNED_RULES = METHOD_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__IS_VISIBLE = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__CONTAINER = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__REFERENCE = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT__PROPERTY = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Diagram Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_ELEMENT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GraphElementImpl <em>Graph Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GraphElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphElement()
-	 * @generated
-	 */
-	int GRAPH_ELEMENT = 33;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__NAME = DIAGRAM_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__GUID = DIAGRAM_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__BRIEF_DESCRIPTION = DIAGRAM_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__OWNED_RULES = DIAGRAM_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__METHOD_ELEMENT_PROPERTY = DIAGRAM_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__SUPPRESSED = DIAGRAM_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__ORDERING_GUIDE = DIAGRAM_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__IS_VISIBLE = DIAGRAM_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__CONTAINER = DIAGRAM_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__REFERENCE = DIAGRAM_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__PROPERTY = DIAGRAM_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Position</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__POSITION = DIAGRAM_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Contained</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__CONTAINED = DIAGRAM_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__LINK = DIAGRAM_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Anchorage</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__ANCHORAGE = DIAGRAM_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Semantic Model</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT__SEMANTIC_MODEL = DIAGRAM_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The number of structural features of the '<em>Graph Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_ELEMENT_FEATURE_COUNT = DIAGRAM_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DiagramLinkImpl <em>Diagram Link</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DiagramLinkImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiagramLink()
-	 * @generated
-	 */
-	int DIAGRAM_LINK = 35;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__NAME = DIAGRAM_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__GUID = DIAGRAM_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__BRIEF_DESCRIPTION = DIAGRAM_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__OWNED_RULES = DIAGRAM_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__METHOD_ELEMENT_PROPERTY = DIAGRAM_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__SUPPRESSED = DIAGRAM_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__ORDERING_GUIDE = DIAGRAM_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__IS_VISIBLE = DIAGRAM_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__CONTAINER = DIAGRAM_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__REFERENCE = DIAGRAM_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__PROPERTY = DIAGRAM_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Zoom</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__ZOOM = DIAGRAM_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Viewport</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__VIEWPORT = DIAGRAM_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Graph Element</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__GRAPH_ELEMENT = DIAGRAM_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Diagram</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK__DIAGRAM = DIAGRAM_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Diagram Link</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_LINK_FEATURE_COUNT = DIAGRAM_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GraphConnectorImpl <em>Graph Connector</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GraphConnectorImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphConnector()
-	 * @generated
-	 */
-	int GRAPH_CONNECTOR = 36;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__NAME = GRAPH_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__GUID = GRAPH_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__BRIEF_DESCRIPTION = GRAPH_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__OWNED_RULES = GRAPH_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__METHOD_ELEMENT_PROPERTY = GRAPH_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__SUPPRESSED = GRAPH_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__ORDERING_GUIDE = GRAPH_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__IS_VISIBLE = GRAPH_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__CONTAINER = GRAPH_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__REFERENCE = GRAPH_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__PROPERTY = GRAPH_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Position</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__POSITION = GRAPH_ELEMENT__POSITION;
-
-	/**
-	 * The feature id for the '<em><b>Contained</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__CONTAINED = GRAPH_ELEMENT__CONTAINED;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__LINK = GRAPH_ELEMENT__LINK;
-
-	/**
-	 * The feature id for the '<em><b>Anchorage</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__ANCHORAGE = GRAPH_ELEMENT__ANCHORAGE;
-
-	/**
-	 * The feature id for the '<em><b>Semantic Model</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__SEMANTIC_MODEL = GRAPH_ELEMENT__SEMANTIC_MODEL;
-
-	/**
-	 * The feature id for the '<em><b>Graph Element</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__GRAPH_ELEMENT = GRAPH_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Graph Edge</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR__GRAPH_EDGE = GRAPH_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Graph Connector</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_CONNECTOR_FEATURE_COUNT = GRAPH_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.SemanticModelBridgeImpl <em>Semantic Model Bridge</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.SemanticModelBridgeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSemanticModelBridge()
-	 * @generated
-	 */
-	int SEMANTIC_MODEL_BRIDGE = 37;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__NAME = DIAGRAM_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__GUID = DIAGRAM_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__BRIEF_DESCRIPTION = DIAGRAM_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__OWNED_RULES = DIAGRAM_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__METHOD_ELEMENT_PROPERTY = DIAGRAM_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__SUPPRESSED = DIAGRAM_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__ORDERING_GUIDE = DIAGRAM_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__IS_VISIBLE = DIAGRAM_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__CONTAINER = DIAGRAM_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__REFERENCE = DIAGRAM_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__PROPERTY = DIAGRAM_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__PRESENTATION = DIAGRAM_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Graph Element</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT = DIAGRAM_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Diagram</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE__DIAGRAM = DIAGRAM_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Semantic Model Bridge</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT = DIAGRAM_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DimensionImpl <em>Dimension</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DimensionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDimension()
-	 * @generated
-	 */
-	int DIMENSION = 38;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIMENSION__WIDTH = 0;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIMENSION__HEIGHT = 1;
-
-	/**
-	 * The number of structural features of the '<em>Dimension</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIMENSION_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ReferenceImpl <em>Reference</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ReferenceImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getReference()
-	 * @generated
-	 */
-	int REFERENCE = 39;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__NAME = DIAGRAM_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__GUID = DIAGRAM_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__BRIEF_DESCRIPTION = DIAGRAM_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__OWNED_RULES = DIAGRAM_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__METHOD_ELEMENT_PROPERTY = DIAGRAM_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__SUPPRESSED = DIAGRAM_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__ORDERING_GUIDE = DIAGRAM_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__IS_VISIBLE = DIAGRAM_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__CONTAINER = DIAGRAM_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__REFERENCE = DIAGRAM_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__PROPERTY = DIAGRAM_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Is Individual Representation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__IS_INDIVIDUAL_REPRESENTATION = DIAGRAM_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Referenced</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE__REFERENCED = DIAGRAM_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Reference</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCE_FEATURE_COUNT = DIAGRAM_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PropertyImpl <em>Property</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PropertyImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProperty()
-	 * @generated
-	 */
-	int PROPERTY = 40;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__NAME = DIAGRAM_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__GUID = DIAGRAM_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__BRIEF_DESCRIPTION = DIAGRAM_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__OWNED_RULES = DIAGRAM_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__METHOD_ELEMENT_PROPERTY = DIAGRAM_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__SUPPRESSED = DIAGRAM_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__ORDERING_GUIDE = DIAGRAM_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__IS_VISIBLE = DIAGRAM_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__CONTAINER = DIAGRAM_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__REFERENCE = DIAGRAM_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__PROPERTY = DIAGRAM_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Key</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__KEY = DIAGRAM_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY__VALUE = DIAGRAM_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Property</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_FEATURE_COUNT = DIAGRAM_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GraphEdgeImpl <em>Graph Edge</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GraphEdgeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphEdge()
-	 * @generated
-	 */
-	int GRAPH_EDGE = 41;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__NAME = GRAPH_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__GUID = GRAPH_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__BRIEF_DESCRIPTION = GRAPH_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__OWNED_RULES = GRAPH_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__METHOD_ELEMENT_PROPERTY = GRAPH_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__SUPPRESSED = GRAPH_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__ORDERING_GUIDE = GRAPH_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__IS_VISIBLE = GRAPH_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__CONTAINER = GRAPH_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__REFERENCE = GRAPH_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__PROPERTY = GRAPH_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Position</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__POSITION = GRAPH_ELEMENT__POSITION;
-
-	/**
-	 * The feature id for the '<em><b>Contained</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__CONTAINED = GRAPH_ELEMENT__CONTAINED;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__LINK = GRAPH_ELEMENT__LINK;
-
-	/**
-	 * The feature id for the '<em><b>Anchorage</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__ANCHORAGE = GRAPH_ELEMENT__ANCHORAGE;
-
-	/**
-	 * The feature id for the '<em><b>Semantic Model</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__SEMANTIC_MODEL = GRAPH_ELEMENT__SEMANTIC_MODEL;
-
-	/**
-	 * The feature id for the '<em><b>Anchor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__ANCHOR = GRAPH_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Waypoints</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE__WAYPOINTS = GRAPH_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Graph Edge</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_EDGE_FEATURE_COUNT = GRAPH_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GraphNodeImpl <em>Graph Node</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GraphNodeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphNode()
-	 * @generated
-	 */
-	int GRAPH_NODE = 43;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__NAME = GRAPH_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__GUID = GRAPH_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__BRIEF_DESCRIPTION = GRAPH_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__OWNED_RULES = GRAPH_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__METHOD_ELEMENT_PROPERTY = GRAPH_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__SUPPRESSED = GRAPH_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__ORDERING_GUIDE = GRAPH_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__IS_VISIBLE = GRAPH_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__CONTAINER = GRAPH_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__REFERENCE = GRAPH_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__PROPERTY = GRAPH_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Position</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__POSITION = GRAPH_ELEMENT__POSITION;
-
-	/**
-	 * The feature id for the '<em><b>Contained</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__CONTAINED = GRAPH_ELEMENT__CONTAINED;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__LINK = GRAPH_ELEMENT__LINK;
-
-	/**
-	 * The feature id for the '<em><b>Anchorage</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__ANCHORAGE = GRAPH_ELEMENT__ANCHORAGE;
-
-	/**
-	 * The feature id for the '<em><b>Semantic Model</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__SEMANTIC_MODEL = GRAPH_ELEMENT__SEMANTIC_MODEL;
-
-	/**
-	 * The feature id for the '<em><b>Size</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE__SIZE = GRAPH_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Graph Node</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPH_NODE_FEATURE_COUNT = GRAPH_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DiagramImpl <em>Diagram</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DiagramImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiagram()
-	 * @generated
-	 */
-	int DIAGRAM = 42;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__NAME = GRAPH_NODE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__GUID = GRAPH_NODE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__BRIEF_DESCRIPTION = GRAPH_NODE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__OWNED_RULES = GRAPH_NODE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__METHOD_ELEMENT_PROPERTY = GRAPH_NODE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__SUPPRESSED = GRAPH_NODE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__ORDERING_GUIDE = GRAPH_NODE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__IS_VISIBLE = GRAPH_NODE__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__CONTAINER = GRAPH_NODE__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__REFERENCE = GRAPH_NODE__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__PROPERTY = GRAPH_NODE__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Position</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__POSITION = GRAPH_NODE__POSITION;
-
-	/**
-	 * The feature id for the '<em><b>Contained</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__CONTAINED = GRAPH_NODE__CONTAINED;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__LINK = GRAPH_NODE__LINK;
-
-	/**
-	 * The feature id for the '<em><b>Anchorage</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__ANCHORAGE = GRAPH_NODE__ANCHORAGE;
-
-	/**
-	 * The feature id for the '<em><b>Semantic Model</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__SEMANTIC_MODEL = GRAPH_NODE__SEMANTIC_MODEL;
-
-	/**
-	 * The feature id for the '<em><b>Size</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__SIZE = GRAPH_NODE__SIZE;
-
-	/**
-	 * The feature id for the '<em><b>Zoom</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__ZOOM = GRAPH_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Viewpoint</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__VIEWPOINT = GRAPH_NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Diagram Link</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__DIAGRAM_LINK = GRAPH_NODE_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Namespace</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM__NAMESPACE = GRAPH_NODE_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Diagram</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DIAGRAM_FEATURE_COUNT = GRAPH_NODE_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.SimpleSemanticModelElementImpl <em>Simple Semantic Model Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.SimpleSemanticModelElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSimpleSemanticModelElement()
-	 * @generated
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT = 44;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__NAME = SEMANTIC_MODEL_BRIDGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__GUID = SEMANTIC_MODEL_BRIDGE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__BRIEF_DESCRIPTION = SEMANTIC_MODEL_BRIDGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__OWNED_RULES = SEMANTIC_MODEL_BRIDGE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__METHOD_ELEMENT_PROPERTY = SEMANTIC_MODEL_BRIDGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__SUPPRESSED = SEMANTIC_MODEL_BRIDGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__ORDERING_GUIDE = SEMANTIC_MODEL_BRIDGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__IS_VISIBLE = SEMANTIC_MODEL_BRIDGE__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__CONTAINER = SEMANTIC_MODEL_BRIDGE__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__REFERENCE = SEMANTIC_MODEL_BRIDGE__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__PROPERTY = SEMANTIC_MODEL_BRIDGE__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__PRESENTATION = SEMANTIC_MODEL_BRIDGE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Graph Element</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__GRAPH_ELEMENT = SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Diagram</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__DIAGRAM = SEMANTIC_MODEL_BRIDGE__DIAGRAM;
-
-	/**
-	 * The feature id for the '<em><b>Type Info</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO = SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Simple Semantic Model Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SIMPLE_SEMANTIC_MODEL_ELEMENT_FEATURE_COUNT = SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.UMASemanticModelBridgeImpl <em>UMA Semantic Model Bridge</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.UMASemanticModelBridgeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getUMASemanticModelBridge()
-	 * @generated
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE = 45;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__NAME = SEMANTIC_MODEL_BRIDGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__GUID = SEMANTIC_MODEL_BRIDGE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__BRIEF_DESCRIPTION = SEMANTIC_MODEL_BRIDGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__OWNED_RULES = SEMANTIC_MODEL_BRIDGE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__METHOD_ELEMENT_PROPERTY = SEMANTIC_MODEL_BRIDGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__SUPPRESSED = SEMANTIC_MODEL_BRIDGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__ORDERING_GUIDE = SEMANTIC_MODEL_BRIDGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__IS_VISIBLE = SEMANTIC_MODEL_BRIDGE__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__CONTAINER = SEMANTIC_MODEL_BRIDGE__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__REFERENCE = SEMANTIC_MODEL_BRIDGE__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__PROPERTY = SEMANTIC_MODEL_BRIDGE__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__PRESENTATION = SEMANTIC_MODEL_BRIDGE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Graph Element</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT = SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Diagram</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__DIAGRAM = SEMANTIC_MODEL_BRIDGE__DIAGRAM;
-
-	/**
-	 * The feature id for the '<em><b>Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT = SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>UMA Semantic Model Bridge</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int UMA_SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT = SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.CoreSemanticModelBridgeImpl <em>Core Semantic Model Bridge</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.CoreSemanticModelBridgeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCoreSemanticModelBridge()
-	 * @generated
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE = 46;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__NAME = SEMANTIC_MODEL_BRIDGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__GUID = SEMANTIC_MODEL_BRIDGE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__BRIEF_DESCRIPTION = SEMANTIC_MODEL_BRIDGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__OWNED_RULES = SEMANTIC_MODEL_BRIDGE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__METHOD_ELEMENT_PROPERTY = SEMANTIC_MODEL_BRIDGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__SUPPRESSED = SEMANTIC_MODEL_BRIDGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__ORDERING_GUIDE = SEMANTIC_MODEL_BRIDGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__IS_VISIBLE = SEMANTIC_MODEL_BRIDGE__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__CONTAINER = SEMANTIC_MODEL_BRIDGE__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__REFERENCE = SEMANTIC_MODEL_BRIDGE__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__PROPERTY = SEMANTIC_MODEL_BRIDGE__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__PRESENTATION = SEMANTIC_MODEL_BRIDGE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Graph Element</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT = SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Diagram</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__DIAGRAM = SEMANTIC_MODEL_BRIDGE__DIAGRAM;
-
-	/**
-	 * The feature id for the '<em><b>Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT = SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Core Semantic Model Bridge</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CORE_SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT = SEMANTIC_MODEL_BRIDGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.LeafElementImpl <em>Leaf Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.LeafElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getLeafElement()
-	 * @generated
-	 */
-	int LEAF_ELEMENT = 47;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__NAME = DIAGRAM_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__GUID = DIAGRAM_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__BRIEF_DESCRIPTION = DIAGRAM_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__OWNED_RULES = DIAGRAM_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__METHOD_ELEMENT_PROPERTY = DIAGRAM_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__SUPPRESSED = DIAGRAM_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__ORDERING_GUIDE = DIAGRAM_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__IS_VISIBLE = DIAGRAM_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__CONTAINER = DIAGRAM_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__REFERENCE = DIAGRAM_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT__PROPERTY = DIAGRAM_ELEMENT__PROPERTY;
-
-	/**
-	 * The number of structural features of the '<em>Leaf Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LEAF_ELEMENT_FEATURE_COUNT = DIAGRAM_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TextElementImpl <em>Text Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TextElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTextElement()
-	 * @generated
-	 */
-	int TEXT_ELEMENT = 48;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__NAME = LEAF_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__GUID = LEAF_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__BRIEF_DESCRIPTION = LEAF_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__OWNED_RULES = LEAF_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__METHOD_ELEMENT_PROPERTY = LEAF_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__SUPPRESSED = LEAF_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__ORDERING_GUIDE = LEAF_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__IS_VISIBLE = LEAF_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__CONTAINER = LEAF_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__REFERENCE = LEAF_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__PROPERTY = LEAF_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Text</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT__TEXT = LEAF_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Text Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEXT_ELEMENT_FEATURE_COUNT = LEAF_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ImageImpl <em>Image</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ImageImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getImage()
-	 * @generated
-	 */
-	int IMAGE = 49;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__NAME = LEAF_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__GUID = LEAF_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__BRIEF_DESCRIPTION = LEAF_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__OWNED_RULES = LEAF_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__METHOD_ELEMENT_PROPERTY = LEAF_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__SUPPRESSED = LEAF_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__ORDERING_GUIDE = LEAF_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__IS_VISIBLE = LEAF_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__CONTAINER = LEAF_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__REFERENCE = LEAF_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__PROPERTY = LEAF_ELEMENT__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Uri</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__URI = LEAF_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Mime Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE__MIME_TYPE = LEAF_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Image</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IMAGE_FEATURE_COUNT = LEAF_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GraphicPrimitiveImpl <em>Graphic Primitive</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GraphicPrimitiveImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphicPrimitive()
-	 * @generated
-	 */
-	int GRAPHIC_PRIMITIVE = 50;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__NAME = LEAF_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__GUID = LEAF_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__BRIEF_DESCRIPTION = LEAF_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__OWNED_RULES = LEAF_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__METHOD_ELEMENT_PROPERTY = LEAF_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__SUPPRESSED = LEAF_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__ORDERING_GUIDE = LEAF_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__IS_VISIBLE = LEAF_ELEMENT__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__CONTAINER = LEAF_ELEMENT__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__REFERENCE = LEAF_ELEMENT__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE__PROPERTY = LEAF_ELEMENT__PROPERTY;
-
-	/**
-	 * The number of structural features of the '<em>Graphic Primitive</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GRAPHIC_PRIMITIVE_FEATURE_COUNT = LEAF_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PolylineImpl <em>Polyline</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PolylineImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPolyline()
-	 * @generated
-	 */
-	int POLYLINE = 51;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__NAME = GRAPHIC_PRIMITIVE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__GUID = GRAPHIC_PRIMITIVE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__BRIEF_DESCRIPTION = GRAPHIC_PRIMITIVE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__OWNED_RULES = GRAPHIC_PRIMITIVE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__METHOD_ELEMENT_PROPERTY = GRAPHIC_PRIMITIVE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__SUPPRESSED = GRAPHIC_PRIMITIVE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__ORDERING_GUIDE = GRAPHIC_PRIMITIVE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__IS_VISIBLE = GRAPHIC_PRIMITIVE__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__CONTAINER = GRAPHIC_PRIMITIVE__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__REFERENCE = GRAPHIC_PRIMITIVE__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__PROPERTY = GRAPHIC_PRIMITIVE__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Closed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__CLOSED = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Waypoints</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE__WAYPOINTS = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Polyline</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int POLYLINE_FEATURE_COUNT = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.EllipseImpl <em>Ellipse</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.EllipseImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getEllipse()
-	 * @generated
-	 */
-	int ELLIPSE = 52;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__NAME = GRAPHIC_PRIMITIVE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__GUID = GRAPHIC_PRIMITIVE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__BRIEF_DESCRIPTION = GRAPHIC_PRIMITIVE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__OWNED_RULES = GRAPHIC_PRIMITIVE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__METHOD_ELEMENT_PROPERTY = GRAPHIC_PRIMITIVE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__SUPPRESSED = GRAPHIC_PRIMITIVE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__ORDERING_GUIDE = GRAPHIC_PRIMITIVE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Is Visible</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__IS_VISIBLE = GRAPHIC_PRIMITIVE__IS_VISIBLE;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__CONTAINER = GRAPHIC_PRIMITIVE__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Reference</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__REFERENCE = GRAPHIC_PRIMITIVE__REFERENCE;
-
-	/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__PROPERTY = GRAPHIC_PRIMITIVE__PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Radius X</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__RADIUS_X = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Radius Y</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__RADIUS_Y = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Rotation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__ROTATION = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Start Angle</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__START_ANGLE = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>End Angle</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__END_ANGLE = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Center</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE__CENTER = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Ellipse</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELLIPSE_FEATURE_COUNT = GRAPHIC_PRIMITIVE_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessElementImpl <em>Process Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessElement()
-	 * @generated
-	 */
-	int PROCESS_ELEMENT = 62;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__NAME = DESCRIBABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__GUID = DESCRIBABLE_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__BRIEF_DESCRIPTION = DESCRIBABLE_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__OWNED_RULES = DESCRIBABLE_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__METHOD_ELEMENT_PROPERTY = DESCRIBABLE_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__SUPPRESSED = DESCRIBABLE_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__ORDERING_GUIDE = DESCRIBABLE_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__PRESENTATION_NAME = DESCRIBABLE_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__PRESENTATION = DESCRIBABLE_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__SHAPEICON = DESCRIBABLE_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__NODEICON = DESCRIBABLE_ELEMENT__NODEICON;
-
-	/**
-	 * The number of structural features of the '<em>Process Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT_FEATURE_COUNT = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.BreakdownElementImpl <em>Breakdown Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.BreakdownElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getBreakdownElement()
-	 * @generated
-	 */
-	int BREAKDOWN_ELEMENT = 55;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__NAME = PROCESS_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__GUID = PROCESS_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION = PROCESS_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__OWNED_RULES = PROCESS_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY = PROCESS_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__SUPPRESSED = PROCESS_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__ORDERING_GUIDE = PROCESS_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTATION_NAME = PROCESS_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTATION = PROCESS_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__SHAPEICON = PROCESS_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__NODEICON = PROCESS_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PREFIX = PROCESS_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__IS_PLANNED = PROCESS_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES = PROCESS_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__IS_OPTIONAL = PROCESS_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTED_AFTER = PROCESS_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTED_BEFORE = PROCESS_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PLANNING_DATA = PROCESS_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__SUPER_ACTIVITIES = PROCESS_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The number of structural features of the '<em>Breakdown Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_FEATURE_COUNT = PROCESS_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WorkBreakdownElementImpl <em>Work Breakdown Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WorkBreakdownElementImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkBreakdownElement()
-	 * @generated
-	 */
-	int WORK_BREAKDOWN_ELEMENT = 54;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__GUID = BREAKDOWN_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__OWNED_RULES = BREAKDOWN_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITIES = BREAKDOWN_ELEMENT__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_ONGOING = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN = BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR = BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Work Breakdown Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ActivityImpl <em>Activity</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ActivityImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getActivity()
-	 * @generated
-	 */
-	int ACTIVITY = 53;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__NAME = WORK_BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__GUID = WORK_BREAKDOWN_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__BRIEF_DESCRIPTION = WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__OWNED_RULES = WORK_BREAKDOWN_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__METHOD_ELEMENT_PROPERTY = WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SUPPRESSED = WORK_BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__ORDERING_GUIDE = WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTATION_NAME = WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTATION = WORK_BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SHAPEICON = WORK_BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__NODEICON = WORK_BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PREFIX = WORK_BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_PLANNED = WORK_BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__HAS_MULTIPLE_OCCURRENCES = WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_OPTIONAL = WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTED_AFTER = WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTED_BEFORE = WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PLANNING_DATA = WORK_BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SUPER_ACTIVITIES = WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_REPEATABLE = WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_ONGOING = WORK_BREAKDOWN_ELEMENT__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_EVENT_DRIVEN = WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__LINK_TO_PREDECESSOR = WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__VARIABILITY_TYPE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__VARIABILITY_BASED_ON_ELEMENT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRECONDITION = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__POSTCONDITION = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__BREAKDOWN_ELEMENTS = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Roadmaps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__ROADMAPS = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SUPPORTING_MATERIALS = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__CHECKLISTS = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Concepts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__CONCEPTS = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__EXAMPLES = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__GUIDELINES = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 10;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__REUSABLE_ASSETS = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 11;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_ENACTABLE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 12;
-
-	/**
-	 * The number of structural features of the '<em>Activity</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_FEATURE_COUNT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 13;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MilestoneImpl <em>Milestone</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MilestoneImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMilestone()
-	 * @generated
-	 */
-	int MILESTONE = 56;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__NAME = WORK_BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__GUID = WORK_BREAKDOWN_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__BRIEF_DESCRIPTION = WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__OWNED_RULES = WORK_BREAKDOWN_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__METHOD_ELEMENT_PROPERTY = WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__SUPPRESSED = WORK_BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__ORDERING_GUIDE = WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTATION_NAME = WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTATION = WORK_BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__SHAPEICON = WORK_BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__NODEICON = WORK_BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PREFIX = WORK_BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_PLANNED = WORK_BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__HAS_MULTIPLE_OCCURRENCES = WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_OPTIONAL = WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTED_AFTER = WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTED_BEFORE = WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PLANNING_DATA = WORK_BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__SUPER_ACTIVITIES = WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_REPEATABLE = WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_ONGOING = WORK_BREAKDOWN_ELEMENT__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_EVENT_DRIVEN = WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__LINK_TO_PREDECESSOR = WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The number of structural features of the '<em>Milestone</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE_FEATURE_COUNT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.IterationImpl <em>Iteration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.IterationImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getIteration()
-	 * @generated
-	 */
-	int ITERATION = 57;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__NAME = ACTIVITY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__GUID = ACTIVITY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__BRIEF_DESCRIPTION = ACTIVITY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__OWNED_RULES = ACTIVITY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__METHOD_ELEMENT_PROPERTY = ACTIVITY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SUPPRESSED = ACTIVITY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__ORDERING_GUIDE = ACTIVITY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTATION_NAME = ACTIVITY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTATION = ACTIVITY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SHAPEICON = ACTIVITY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__NODEICON = ACTIVITY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PREFIX = ACTIVITY__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_PLANNED = ACTIVITY__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__HAS_MULTIPLE_OCCURRENCES = ACTIVITY__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_OPTIONAL = ACTIVITY__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTED_AFTER = ACTIVITY__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTED_BEFORE = ACTIVITY__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PLANNING_DATA = ACTIVITY__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SUPER_ACTIVITIES = ACTIVITY__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_REPEATABLE = ACTIVITY__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_ONGOING = ACTIVITY__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_EVENT_DRIVEN = ACTIVITY__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__LINK_TO_PREDECESSOR = ACTIVITY__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__VARIABILITY_TYPE = ACTIVITY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__VARIABILITY_BASED_ON_ELEMENT = ACTIVITY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRECONDITION = ACTIVITY__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__POSTCONDITION = ACTIVITY__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__BREAKDOWN_ELEMENTS = ACTIVITY__BREAKDOWN_ELEMENTS;
-
-	/**
-	 * The feature id for the '<em><b>Roadmaps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__ROADMAPS = ACTIVITY__ROADMAPS;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SUPPORTING_MATERIALS = ACTIVITY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__CHECKLISTS = ACTIVITY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__CONCEPTS = ACTIVITY__CONCEPTS;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__EXAMPLES = ACTIVITY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__GUIDELINES = ACTIVITY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__REUSABLE_ASSETS = ACTIVITY__REUSABLE_ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_ENACTABLE = ACTIVITY__IS_ENACTABLE;
-
-	/**
-	 * The number of structural features of the '<em>Iteration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PhaseImpl <em>Phase</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PhaseImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPhase()
-	 * @generated
-	 */
-	int PHASE = 58;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__NAME = ACTIVITY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__GUID = ACTIVITY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__BRIEF_DESCRIPTION = ACTIVITY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__OWNED_RULES = ACTIVITY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__METHOD_ELEMENT_PROPERTY = ACTIVITY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SUPPRESSED = ACTIVITY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__ORDERING_GUIDE = ACTIVITY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTATION_NAME = ACTIVITY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTATION = ACTIVITY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SHAPEICON = ACTIVITY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__NODEICON = ACTIVITY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PREFIX = ACTIVITY__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_PLANNED = ACTIVITY__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__HAS_MULTIPLE_OCCURRENCES = ACTIVITY__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_OPTIONAL = ACTIVITY__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTED_AFTER = ACTIVITY__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTED_BEFORE = ACTIVITY__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PLANNING_DATA = ACTIVITY__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SUPER_ACTIVITIES = ACTIVITY__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_REPEATABLE = ACTIVITY__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_ONGOING = ACTIVITY__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_EVENT_DRIVEN = ACTIVITY__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__LINK_TO_PREDECESSOR = ACTIVITY__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__VARIABILITY_TYPE = ACTIVITY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__VARIABILITY_BASED_ON_ELEMENT = ACTIVITY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRECONDITION = ACTIVITY__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__POSTCONDITION = ACTIVITY__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__BREAKDOWN_ELEMENTS = ACTIVITY__BREAKDOWN_ELEMENTS;
-
-	/**
-	 * The feature id for the '<em><b>Roadmaps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__ROADMAPS = ACTIVITY__ROADMAPS;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SUPPORTING_MATERIALS = ACTIVITY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__CHECKLISTS = ACTIVITY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__CONCEPTS = ACTIVITY__CONCEPTS;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__EXAMPLES = ACTIVITY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__GUIDELINES = ACTIVITY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__REUSABLE_ASSETS = ACTIVITY__REUSABLE_ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_ENACTABLE = ACTIVITY__IS_ENACTABLE;
-
-	/**
-	 * The number of structural features of the '<em>Phase</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TeamProfileImpl <em>Team Profile</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TeamProfileImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTeamProfile()
-	 * @generated
-	 */
-	int TEAM_PROFILE = 59;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__GUID = BREAKDOWN_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__OWNED_RULES = BREAKDOWN_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUPER_ACTIVITIES = BREAKDOWN_ELEMENT__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Team Roles</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__TEAM_ROLES = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Super Team</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUPER_TEAM = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Sub Team</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUB_TEAM = BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Team Profile</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DescriptorImpl <em>Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DescriptorImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDescriptor()
-	 * @generated
-	 */
-	int DESCRIPTOR = 64;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__GUID = BREAKDOWN_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__OWNED_RULES = BREAKDOWN_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__SUPER_ACTIVITIES = BREAKDOWN_ELEMENT__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.RoleDescriptorImpl <em>Role Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.RoleDescriptorImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleDescriptor()
-	 * @generated
-	 */
-	int ROLE_DESCRIPTOR = 60;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__NAME = DESCRIPTOR__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__GUID = DESCRIPTOR__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__BRIEF_DESCRIPTION = DESCRIPTOR__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__OWNED_RULES = DESCRIPTOR__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__METHOD_ELEMENT_PROPERTY = DESCRIPTOR__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__SUPPRESSED = DESCRIPTOR__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__ORDERING_GUIDE = DESCRIPTOR__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTATION_NAME = DESCRIPTOR__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTATION = DESCRIPTOR__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__SHAPEICON = DESCRIPTOR__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__NODEICON = DESCRIPTOR__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PREFIX = DESCRIPTOR__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__IS_PLANNED = DESCRIPTOR__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__IS_OPTIONAL = DESCRIPTOR__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTED_AFTER = DESCRIPTOR__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTED_BEFORE = DESCRIPTOR__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PLANNING_DATA = DESCRIPTOR__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__SUPER_ACTIVITIES = DESCRIPTOR__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-
-	/**
-	 * The feature id for the '<em><b>Role</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__ROLE = DESCRIPTOR_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Modifies</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__MODIFIES = DESCRIPTOR_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Responsible For</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__RESPONSIBLE_FOR = DESCRIPTOR_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Role Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR_FEATURE_COUNT = DESCRIPTOR_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WorkOrderImpl <em>Work Order</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WorkOrderImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkOrder()
-	 * @generated
-	 */
-	int WORK_ORDER = 61;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__NAME = PROCESS_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__GUID = PROCESS_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__BRIEF_DESCRIPTION = PROCESS_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__OWNED_RULES = PROCESS_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__METHOD_ELEMENT_PROPERTY = PROCESS_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__SUPPRESSED = PROCESS_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__ORDERING_GUIDE = PROCESS_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__PRESENTATION_NAME = PROCESS_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__PRESENTATION = PROCESS_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__SHAPEICON = PROCESS_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__NODEICON = PROCESS_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Link Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__LINK_TYPE = PROCESS_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Pred</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__PRED = PROCESS_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Work Order</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER_FEATURE_COUNT = PROCESS_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PlanningDataImpl <em>Planning Data</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PlanningDataImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPlanningData()
-	 * @generated
-	 */
-	int PLANNING_DATA = 63;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__NAME = PROCESS_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__GUID = PROCESS_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__BRIEF_DESCRIPTION = PROCESS_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__OWNED_RULES = PROCESS_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__METHOD_ELEMENT_PROPERTY = PROCESS_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__SUPPRESSED = PROCESS_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__ORDERING_GUIDE = PROCESS_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__PRESENTATION_NAME = PROCESS_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__PRESENTATION = PROCESS_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__SHAPEICON = PROCESS_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__NODEICON = PROCESS_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__START_DATE = PROCESS_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Finish Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__FINISH_DATE = PROCESS_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Rank</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__RANK = PROCESS_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Planning Data</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA_FEATURE_COUNT = PROCESS_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl <em>Task Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TaskDescriptorImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTaskDescriptor()
-	 * @generated
-	 */
-	int TASK_DESCRIPTOR = 66;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl <em>Work Product Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WorkProductDescriptorImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProductDescriptor()
-	 * @generated
-	 */
-	int WORK_PRODUCT_DESCRIPTOR = 65;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__NAME = DESCRIPTOR__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__GUID = DESCRIPTOR__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__BRIEF_DESCRIPTION = DESCRIPTOR__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__OWNED_RULES = DESCRIPTOR__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__METHOD_ELEMENT_PROPERTY = DESCRIPTOR__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__SUPPRESSED = DESCRIPTOR__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__ORDERING_GUIDE = DESCRIPTOR__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTATION_NAME = DESCRIPTOR__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTATION = DESCRIPTOR__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__SHAPEICON = DESCRIPTOR__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__NODEICON = DESCRIPTOR__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PREFIX = DESCRIPTOR__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IS_PLANNED = DESCRIPTOR__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IS_OPTIONAL = DESCRIPTOR__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTED_AFTER = DESCRIPTOR__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTED_BEFORE = DESCRIPTOR__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PLANNING_DATA = DESCRIPTOR__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__SUPER_ACTIVITIES = DESCRIPTOR__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-
-	/**
-	 * The feature id for the '<em><b>Activity Entry State</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE = DESCRIPTOR_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Activity Exit State</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE = DESCRIPTOR_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Work Product</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT = DESCRIPTOR_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Impacted By</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY = DESCRIPTOR_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Impacts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IMPACTS = DESCRIPTOR_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Deliverable Parts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS = DESCRIPTOR_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_FEATURE_COUNT = DESCRIPTOR_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__NAME = WORK_BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__GUID = WORK_BREAKDOWN_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__BRIEF_DESCRIPTION = WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__OWNED_RULES = WORK_BREAKDOWN_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__METHOD_ELEMENT_PROPERTY = WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__SUPPRESSED = WORK_BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__ORDERING_GUIDE = WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTATION_NAME = WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTATION = WORK_BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__SHAPEICON = WORK_BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__NODEICON = WORK_BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PREFIX = WORK_BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_PLANNED = WORK_BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_OPTIONAL = WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTED_AFTER = WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTED_BEFORE = WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PLANNING_DATA = WORK_BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__SUPER_ACTIVITIES = WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_REPEATABLE = WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_ONGOING = WORK_BREAKDOWN_ELEMENT__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_EVENT_DRIVEN = WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__LINK_TO_PREDECESSOR = WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Task</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__TASK = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Additionally Performed By</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Assisted By</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__ASSISTED_BY = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>External Input</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__EXTERNAL_INPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Mandatory Input</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__MANDATORY_INPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Optional Input</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__OPTIONAL_INPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Output</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__OUTPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Performed Primarily By</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Selected Steps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__SELECTED_STEPS = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The number of structural features of the '<em>Task Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR_FEATURE_COUNT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 10;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.CompositeRoleImpl <em>Composite Role</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.CompositeRoleImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCompositeRole()
-	 * @generated
-	 */
-	int COMPOSITE_ROLE = 67;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__NAME = ROLE_DESCRIPTOR__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__GUID = ROLE_DESCRIPTOR__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__BRIEF_DESCRIPTION = ROLE_DESCRIPTOR__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__OWNED_RULES = ROLE_DESCRIPTOR__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__METHOD_ELEMENT_PROPERTY = ROLE_DESCRIPTOR__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__SUPPRESSED = ROLE_DESCRIPTOR__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__ORDERING_GUIDE = ROLE_DESCRIPTOR__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTATION_NAME = ROLE_DESCRIPTOR__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTATION = ROLE_DESCRIPTOR__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__SHAPEICON = ROLE_DESCRIPTOR__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__NODEICON = ROLE_DESCRIPTOR__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PREFIX = ROLE_DESCRIPTOR__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__IS_PLANNED = ROLE_DESCRIPTOR__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__HAS_MULTIPLE_OCCURRENCES = ROLE_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__IS_OPTIONAL = ROLE_DESCRIPTOR__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTED_AFTER = ROLE_DESCRIPTOR__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTED_BEFORE = ROLE_DESCRIPTOR__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PLANNING_DATA = ROLE_DESCRIPTOR__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__SUPER_ACTIVITIES = ROLE_DESCRIPTOR__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__IS_SYNCHRONIZED_WITH_SOURCE = ROLE_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-
-	/**
-	 * The feature id for the '<em><b>Role</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__ROLE = ROLE_DESCRIPTOR__ROLE;
-
-	/**
-	 * The feature id for the '<em><b>Modifies</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__MODIFIES = ROLE_DESCRIPTOR__MODIFIES;
-
-	/**
-	 * The feature id for the '<em><b>Responsible For</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__RESPONSIBLE_FOR = ROLE_DESCRIPTOR__RESPONSIBLE_FOR;
-
-	/**
-	 * The feature id for the '<em><b>Aggregated Roles</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__AGGREGATED_ROLES = ROLE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Composite Role</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE_FEATURE_COUNT = ROLE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.BreakdownElementDescriptionImpl <em>Breakdown Element Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.BreakdownElementDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getBreakdownElementDescription()
-	 * @generated
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION = 68;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__GUID = CONTENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__OWNED_RULES = CONTENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__COPYRIGHT_STATEMENT = CONTENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__SECTIONS = CONTENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Breakdown Element Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ActivityDescriptionImpl <em>Activity Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ActivityDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getActivityDescription()
-	 * @generated
-	 */
-	int ACTIVITY_DESCRIPTION = 69;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__NAME = BREAKDOWN_ELEMENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__GUID = BREAKDOWN_ELEMENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__OWNED_RULES = BREAKDOWN_ELEMENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__SUPPRESSED = BREAKDOWN_ELEMENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__ORDERING_GUIDE = BREAKDOWN_ELEMENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__AUTHORS = BREAKDOWN_ELEMENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__CHANGE_DATE = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__CHANGE_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__VERSION = BREAKDOWN_ELEMENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__COPYRIGHT_STATEMENT = BREAKDOWN_ELEMENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__MAIN_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__SECTIONS = BREAKDOWN_ELEMENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__EXTERNAL_ID = BREAKDOWN_ELEMENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__KEY_CONSIDERATIONS = BREAKDOWN_ELEMENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__USAGE_GUIDANCE = BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__PURPOSE = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__ALTERNATIVES = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Howto Staff</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__HOWTO_STAFF = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Activity Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION_FEATURE_COUNT = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessDescriptionImpl <em>Process Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessDescription()
-	 * @generated
-	 */
-	int PROCESS_DESCRIPTION = 71;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__NAME = ACTIVITY_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__GUID = ACTIVITY_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__BRIEF_DESCRIPTION = ACTIVITY_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__OWNED_RULES = ACTIVITY_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__METHOD_ELEMENT_PROPERTY = ACTIVITY_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__SUPPRESSED = ACTIVITY_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__ORDERING_GUIDE = ACTIVITY_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__AUTHORS = ACTIVITY_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__CHANGE_DATE = ACTIVITY_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__CHANGE_DESCRIPTION = ACTIVITY_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__VERSION = ACTIVITY_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__COPYRIGHT_STATEMENT = ACTIVITY_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__MAIN_DESCRIPTION = ACTIVITY_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__SECTIONS = ACTIVITY_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__EXTERNAL_ID = ACTIVITY_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__KEY_CONSIDERATIONS = ACTIVITY_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__USAGE_GUIDANCE = ACTIVITY_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__PURPOSE = ACTIVITY_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__ALTERNATIVES = ACTIVITY_DESCRIPTION__ALTERNATIVES;
-
-	/**
-	 * The feature id for the '<em><b>Howto Staff</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__HOWTO_STAFF = ACTIVITY_DESCRIPTION__HOWTO_STAFF;
-
-	/**
-	 * The feature id for the '<em><b>Scope</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__SCOPE = ACTIVITY_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Usage Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__USAGE_NOTES = ACTIVITY_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Process Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION_FEATURE_COUNT = ACTIVITY_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl <em>Delivery Process Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliveryProcessDescription()
-	 * @generated
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION = 70;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__NAME = PROCESS_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__GUID = PROCESS_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__BRIEF_DESCRIPTION = PROCESS_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__OWNED_RULES = PROCESS_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__METHOD_ELEMENT_PROPERTY = PROCESS_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SUPPRESSED = PROCESS_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__ORDERING_GUIDE = PROCESS_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__AUTHORS = PROCESS_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__CHANGE_DATE = PROCESS_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__CHANGE_DESCRIPTION = PROCESS_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__VERSION = PROCESS_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__COPYRIGHT_STATEMENT = PROCESS_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__MAIN_DESCRIPTION = PROCESS_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SECTIONS = PROCESS_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__EXTERNAL_ID = PROCESS_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__KEY_CONSIDERATIONS = PROCESS_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__USAGE_GUIDANCE = PROCESS_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__PURPOSE = PROCESS_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__ALTERNATIVES = PROCESS_DESCRIPTION__ALTERNATIVES;
-
-	/**
-	 * The feature id for the '<em><b>Howto Staff</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__HOWTO_STAFF = PROCESS_DESCRIPTION__HOWTO_STAFF;
-
-	/**
-	 * The feature id for the '<em><b>Scope</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SCOPE = PROCESS_DESCRIPTION__SCOPE;
-
-	/**
-	 * The feature id for the '<em><b>Usage Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__USAGE_NOTES = PROCESS_DESCRIPTION__USAGE_NOTES;
-
-	/**
-	 * The feature id for the '<em><b>Scale</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SCALE = PROCESS_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Project Characteristics</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS = PROCESS_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Risk Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL = PROCESS_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Estimating Technique</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE = PROCESS_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Project Member Expertise</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE = PROCESS_DESCRIPTION_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Type Of Contract</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT = PROCESS_DESCRIPTION_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Delivery Process Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION_FEATURE_COUNT = PROCESS_DESCRIPTION_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DescriptorDescriptionImpl <em>Descriptor Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DescriptorDescriptionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDescriptorDescription()
-	 * @generated
-	 */
-	int DESCRIPTOR_DESCRIPTION = 72;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__NAME = BREAKDOWN_ELEMENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__GUID = BREAKDOWN_ELEMENT_DESCRIPTION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__OWNED_RULES = BREAKDOWN_ELEMENT_DESCRIPTION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__SUPPRESSED = BREAKDOWN_ELEMENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__ORDERING_GUIDE = BREAKDOWN_ELEMENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__AUTHORS = BREAKDOWN_ELEMENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__CHANGE_DATE = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__CHANGE_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__VERSION = BREAKDOWN_ELEMENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__COPYRIGHT_STATEMENT = BREAKDOWN_ELEMENT_DESCRIPTION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__MAIN_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__SECTIONS = BREAKDOWN_ELEMENT_DESCRIPTION__SECTIONS;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__EXTERNAL_ID = BREAKDOWN_ELEMENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__KEY_CONSIDERATIONS = BREAKDOWN_ELEMENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__USAGE_GUIDANCE = BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Refined Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Descriptor Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION_FEATURE_COUNT = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ConceptImpl <em>Concept</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ConceptImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getConcept()
-	 * @generated
-	 */
-	int CONCEPT = 73;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Concept</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ChecklistImpl <em>Checklist</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ChecklistImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getChecklist()
-	 * @generated
-	 */
-	int CHECKLIST = 74;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Checklist</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ExampleImpl <em>Example</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ExampleImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getExample()
-	 * @generated
-	 */
-	int EXAMPLE = 75;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Example</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.GuidelineImpl <em>Guideline</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.GuidelineImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGuideline()
-	 * @generated
-	 */
-	int GUIDELINE = 76;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Guideline</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.EstimationConsiderationsImpl <em>Estimation Considerations</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.EstimationConsiderationsImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getEstimationConsiderations()
-	 * @generated
-	 */
-	int ESTIMATION_CONSIDERATIONS = 84;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ReportImpl <em>Report</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ReportImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getReport()
-	 * @generated
-	 */
-	int REPORT = 77;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Report</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TemplateImpl <em>Template</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TemplateImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTemplate()
-	 * @generated
-	 */
-	int TEMPLATE = 78;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Template</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.SupportingMaterialImpl <em>Supporting Material</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.SupportingMaterialImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSupportingMaterial()
-	 * @generated
-	 */
-	int SUPPORTING_MATERIAL = 79;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Supporting Material</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ToolMentorImpl <em>Tool Mentor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ToolMentorImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getToolMentor()
-	 * @generated
-	 */
-	int TOOL_MENTOR = 80;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Tool Mentor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WhitepaperImpl <em>Whitepaper</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WhitepaperImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWhitepaper()
-	 * @generated
-	 */
-	int WHITEPAPER = 81;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__NAME = CONCEPT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__GUID = CONCEPT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__BRIEF_DESCRIPTION = CONCEPT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__OWNED_RULES = CONCEPT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__METHOD_ELEMENT_PROPERTY = CONCEPT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__SUPPRESSED = CONCEPT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__ORDERING_GUIDE = CONCEPT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__PRESENTATION_NAME = CONCEPT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__PRESENTATION = CONCEPT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__SHAPEICON = CONCEPT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__NODEICON = CONCEPT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__VARIABILITY_TYPE = CONCEPT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__VARIABILITY_BASED_ON_ELEMENT = CONCEPT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__SUPPORTING_MATERIALS = CONCEPT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__CONCEPTS_AND_PAPERS = CONCEPT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__CHECKLISTS = CONCEPT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__GUIDELINES = CONCEPT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__EXAMPLES = CONCEPT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__ASSETS = CONCEPT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__TERM_DEFINITION = CONCEPT__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Whitepaper</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER_FEATURE_COUNT = CONCEPT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TermDefinitionImpl <em>Term Definition</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TermDefinitionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTermDefinition()
-	 * @generated
-	 */
-	int TERM_DEFINITION = 82;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Term Definition</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PracticeImpl <em>Practice</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PracticeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPractice()
-	 * @generated
-	 */
-	int PRACTICE = 83;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Sub Practices</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SUB_PRACTICES = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Content References</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__CONTENT_REFERENCES = GUIDANCE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Activity References</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__ACTIVITY_REFERENCES = GUIDANCE_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Practice</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ReusableAssetImpl <em>Reusable Asset</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ReusableAssetImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getReusableAsset()
-	 * @generated
-	 */
-	int REUSABLE_ASSET = 85;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.VertexImpl <em>Vertex</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.VertexImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getVertex()
-	 * @generated
-	 */
-	int VERTEX = 87;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.StateImpl <em>State</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.StateImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getState()
-	 * @generated
-	 */
-	int STATE = 86;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.RegionImpl <em>Region</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.RegionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRegion()
-	 * @generated
-	 */
-	int REGION = 88;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.StateMachineImpl <em>State Machine</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.StateMachineImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getStateMachine()
-	 * @generated
-	 */
-	int STATE_MACHINE = 89;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.TransitionImpl <em>Transition</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.TransitionImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTransition()
-	 * @generated
-	 */
-	int TRANSITION = 90;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.PseudoStateImpl <em>Pseudo State</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.PseudoStateImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPseudoState()
-	 * @generated
-	 */
-	int PSEUDO_STATE = 91;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ContentCategoryImpl <em>Content Category</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ContentCategoryImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentCategory()
-	 * @generated
-	 */
-	int CONTENT_CATEGORY = 93;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DisciplineImpl <em>Discipline</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DisciplineImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiscipline()
-	 * @generated
-	 */
-	int DISCIPLINE = 92;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.RoleSetImpl <em>Role Set</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.RoleSetImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleSet()
-	 * @generated
-	 */
-	int ROLE_SET = 94;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DomainImpl <em>Domain</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DomainImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDomain()
-	 * @generated
-	 */
-	int DOMAIN = 95;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.WorkProductTypeImpl <em>Work Product Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.WorkProductTypeImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProductType()
-	 * @generated
-	 */
-	int WORK_PRODUCT_TYPE = 96;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DisciplineGroupingImpl <em>Discipline Grouping</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DisciplineGroupingImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDisciplineGrouping()
-	 * @generated
-	 */
-	int DISCIPLINE_GROUPING = 97;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ToolImpl <em>Tool</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ToolImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTool()
-	 * @generated
-	 */
-	int TOOL = 98;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.RoleSetGroupingImpl <em>Role Set Grouping</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.RoleSetGroupingImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleSetGrouping()
-	 * @generated
-	 */
-	int ROLE_SET_GROUPING = 99;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.CustomCategoryImpl <em>Custom Category</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.CustomCategoryImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCustomCategory()
-	 * @generated
-	 */
-	int CUSTOM_CATEGORY = 100;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessImpl <em>Process</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcess()
-	 * @generated
-	 */
-	int PROCESS = 102;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.DeliveryProcessImpl <em>Delivery Process</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.DeliveryProcessImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliveryProcess()
-	 * @generated
-	 */
-	int DELIVERY_PROCESS = 101;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.CapabilityPatternImpl <em>Capability Pattern</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.CapabilityPatternImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCapabilityPattern()
-	 * @generated
-	 */
-	int CAPABILITY_PATTERN = 103;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessPlanningTemplateImpl <em>Process Planning Template</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessPlanningTemplateImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessPlanningTemplate()
-	 * @generated
-	 */
-	int PROCESS_PLANNING_TEMPLATE = 104;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.RoadmapImpl <em>Roadmap</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.RoadmapImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoadmap()
-	 * @generated
-	 */
-	int ROADMAP = 105;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessPackageImpl <em>Process Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessPackageImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessPackage()
-	 * @generated
-	 */
-	int PROCESS_PACKAGE = 107;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessComponentImpl <em>Process Component</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessComponentImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessComponent()
-	 * @generated
-	 */
-	int PROCESS_COMPONENT = 106;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessComponentInterfaceImpl <em>Process Component Interface</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessComponentInterfaceImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessComponentInterface()
-	 * @generated
-	 */
-	int PROCESS_COMPONENT_INTERFACE = 108;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessComponentDescriptorImpl <em>Process Component Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessComponentDescriptorImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessComponentDescriptor()
-	 * @generated
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR = 109;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MethodPluginImpl <em>Method Plugin</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MethodPluginImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodPlugin()
-	 * @generated
-	 */
-	int METHOD_PLUGIN = 110;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Estimation Considerations</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Reusable Asset</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VERTEX__CONTAINER = 0;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VERTEX__OUTGOING = 1;
-
-	/**
-	 * The feature id for the '<em><b>Incoming</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VERTEX__INCOMING = 2;
-
-	/**
-	 * The number of structural features of the '<em>Vertex</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VERTEX_FEATURE_COUNT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE__CONTAINER = VERTEX__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE__OUTGOING = VERTEX__OUTGOING;
-
-	/**
-	 * The feature id for the '<em><b>Incoming</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE__INCOMING = VERTEX__INCOMING;
-
-	/**
-	 * The feature id for the '<em><b>Work Product</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE__WORK_PRODUCT = VERTEX_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Region</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE__REGION = VERTEX_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Submachine</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE__SUBMACHINE = VERTEX_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>State</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_FEATURE_COUNT = VERTEX_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Vertex</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REGION__VERTEX = 0;
-
-	/**
-	 * The feature id for the '<em><b>Transition</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REGION__TRANSITION = 1;
-
-	/**
-	 * The feature id for the '<em><b>State</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REGION__STATE = 2;
-
-	/**
-	 * The feature id for the '<em><b>State Machine</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REGION__STATE_MACHINE = 3;
-
-	/**
-	 * The number of structural features of the '<em>Region</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REGION_FEATURE_COUNT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__NAME = WORK_DEFINITION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__GUID = WORK_DEFINITION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__BRIEF_DESCRIPTION = WORK_DEFINITION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__OWNED_RULES = WORK_DEFINITION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__METHOD_ELEMENT_PROPERTY = WORK_DEFINITION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__SUPPRESSED = WORK_DEFINITION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__ORDERING_GUIDE = WORK_DEFINITION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__PRECONDITION = WORK_DEFINITION__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__POSTCONDITION = WORK_DEFINITION__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Region</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE__REGION = WORK_DEFINITION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>State Machine</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MACHINE_FEATURE_COUNT = WORK_DEFINITION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Work Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRANSITION__WORK_DEFINITION = 0;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRANSITION__CONTAINER = 1;
-
-	/**
-	 * The feature id for the '<em><b>Source</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRANSITION__SOURCE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Target</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRANSITION__TARGET = 3;
-
-	/**
-	 * The number of structural features of the '<em>Transition</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TRANSITION_FEATURE_COUNT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Container</b></em>' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PSEUDO_STATE__CONTAINER = VERTEX__CONTAINER;
-
-	/**
-	 * The feature id for the '<em><b>Outgoing</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PSEUDO_STATE__OUTGOING = VERTEX__OUTGOING;
-
-	/**
-	 * The feature id for the '<em><b>Incoming</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PSEUDO_STATE__INCOMING = VERTEX__INCOMING;
-
-	/**
-	 * The number of structural features of the '<em>Pseudo State</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PSEUDO_STATE_FEATURE_COUNT = VERTEX_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__GUID = CONTENT_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__OWNED_RULES = CONTENT_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__SUPPORTING_MATERIALS = CONTENT_ELEMENT__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__CONCEPTS_AND_PAPERS = CONTENT_ELEMENT__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__CHECKLISTS = CONTENT_ELEMENT__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__GUIDELINES = CONTENT_ELEMENT__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__EXAMPLES = CONTENT_ELEMENT__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__ASSETS = CONTENT_ELEMENT__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__TERM_DEFINITION = CONTENT_ELEMENT__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Content Category</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Tasks</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__TASKS = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Subdiscipline</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SUBDISCIPLINE = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Reference Workflows</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__REFERENCE_WORKFLOWS = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Discipline</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Roles</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__ROLES = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Role Set</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Work Products</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__WORK_PRODUCTS = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Subdomains</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SUBDOMAINS = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Domain</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Work Products</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__WORK_PRODUCTS = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Disciplines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__DISCIPLINES = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Discipline Grouping</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentors</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__TOOL_MENTORS = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Tool</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Role Sets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__ROLE_SETS = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Role Set Grouping</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__GUID = CONTENT_CATEGORY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__OWNED_RULES = CONTENT_CATEGORY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SUPPORTING_MATERIALS = CONTENT_CATEGORY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__CONCEPTS_AND_PAPERS = CONTENT_CATEGORY__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__CHECKLISTS = CONTENT_CATEGORY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__GUIDELINES = CONTENT_CATEGORY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__EXAMPLES = CONTENT_CATEGORY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__ASSETS = CONTENT_CATEGORY__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__TERM_DEFINITION = CONTENT_CATEGORY__TERM_DEFINITION;
-
-	/**
-	 * The feature id for the '<em><b>Categorized Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Sub Categories</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SUB_CATEGORIES = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Custom Category</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__NAME = ACTIVITY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__GUID = ACTIVITY__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__BRIEF_DESCRIPTION = ACTIVITY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__OWNED_RULES = ACTIVITY__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__METHOD_ELEMENT_PROPERTY = ACTIVITY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SUPPRESSED = ACTIVITY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__ORDERING_GUIDE = ACTIVITY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTATION_NAME = ACTIVITY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTATION = ACTIVITY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SHAPEICON = ACTIVITY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__NODEICON = ACTIVITY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PREFIX = ACTIVITY__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_PLANNED = ACTIVITY__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__HAS_MULTIPLE_OCCURRENCES = ACTIVITY__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_OPTIONAL = ACTIVITY__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTED_AFTER = ACTIVITY__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTED_BEFORE = ACTIVITY__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PLANNING_DATA = ACTIVITY__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SUPER_ACTIVITIES = ACTIVITY__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_REPEATABLE = ACTIVITY__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_ONGOING = ACTIVITY__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_EVENT_DRIVEN = ACTIVITY__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__LINK_TO_PREDECESSOR = ACTIVITY__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__VARIABILITY_TYPE = ACTIVITY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__VARIABILITY_BASED_ON_ELEMENT = ACTIVITY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRECONDITION = ACTIVITY__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__POSTCONDITION = ACTIVITY__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__BREAKDOWN_ELEMENTS = ACTIVITY__BREAKDOWN_ELEMENTS;
-
-	/**
-	 * The feature id for the '<em><b>Roadmaps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__ROADMAPS = ACTIVITY__ROADMAPS;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SUPPORTING_MATERIALS = ACTIVITY__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__CHECKLISTS = ACTIVITY__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__CONCEPTS = ACTIVITY__CONCEPTS;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__EXAMPLES = ACTIVITY__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__GUIDELINES = ACTIVITY__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__REUSABLE_ASSETS = ACTIVITY__REUSABLE_ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_ENACTABLE = ACTIVITY__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Patterns</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__INCLUDES_PATTERNS = ACTIVITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__DEFAULT_CONTEXT = ACTIVITY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__VALID_CONTEXT = ACTIVITY_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Process</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__NAME = PROCESS__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__GUID = PROCESS__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__BRIEF_DESCRIPTION = PROCESS__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__OWNED_RULES = PROCESS__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__METHOD_ELEMENT_PROPERTY = PROCESS__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SUPPRESSED = PROCESS__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__ORDERING_GUIDE = PROCESS__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTATION_NAME = PROCESS__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTATION = PROCESS__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SHAPEICON = PROCESS__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__NODEICON = PROCESS__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PREFIX = PROCESS__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_PLANNED = PROCESS__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__HAS_MULTIPLE_OCCURRENCES = PROCESS__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_OPTIONAL = PROCESS__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTED_AFTER = PROCESS__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTED_BEFORE = PROCESS__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PLANNING_DATA = PROCESS__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SUPER_ACTIVITIES = PROCESS__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_REPEATABLE = PROCESS__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_ONGOING = PROCESS__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_EVENT_DRIVEN = PROCESS__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__LINK_TO_PREDECESSOR = PROCESS__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__VARIABILITY_TYPE = PROCESS__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__VARIABILITY_BASED_ON_ELEMENT = PROCESS__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRECONDITION = PROCESS__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__POSTCONDITION = PROCESS__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__BREAKDOWN_ELEMENTS = PROCESS__BREAKDOWN_ELEMENTS;
-
-	/**
-	 * The feature id for the '<em><b>Roadmaps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__ROADMAPS = PROCESS__ROADMAPS;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SUPPORTING_MATERIALS = PROCESS__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__CHECKLISTS = PROCESS__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__CONCEPTS = PROCESS__CONCEPTS;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__EXAMPLES = PROCESS__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__GUIDELINES = PROCESS__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__REUSABLE_ASSETS = PROCESS__REUSABLE_ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_ENACTABLE = PROCESS__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Patterns</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__INCLUDES_PATTERNS = PROCESS__INCLUDES_PATTERNS;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__DEFAULT_CONTEXT = PROCESS__DEFAULT_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__VALID_CONTEXT = PROCESS__VALID_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Education Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__EDUCATION_MATERIALS = PROCESS_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Communications Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS = PROCESS_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Delivery Process</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_FEATURE_COUNT = PROCESS_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__NAME = PROCESS__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__GUID = PROCESS__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__BRIEF_DESCRIPTION = PROCESS__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__OWNED_RULES = PROCESS__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__METHOD_ELEMENT_PROPERTY = PROCESS__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SUPPRESSED = PROCESS__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__ORDERING_GUIDE = PROCESS__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTATION_NAME = PROCESS__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTATION = PROCESS__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SHAPEICON = PROCESS__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__NODEICON = PROCESS__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PREFIX = PROCESS__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_PLANNED = PROCESS__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__HAS_MULTIPLE_OCCURRENCES = PROCESS__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_OPTIONAL = PROCESS__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTED_AFTER = PROCESS__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTED_BEFORE = PROCESS__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PLANNING_DATA = PROCESS__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SUPER_ACTIVITIES = PROCESS__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_REPEATABLE = PROCESS__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_ONGOING = PROCESS__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_EVENT_DRIVEN = PROCESS__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__LINK_TO_PREDECESSOR = PROCESS__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__VARIABILITY_TYPE = PROCESS__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__VARIABILITY_BASED_ON_ELEMENT = PROCESS__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRECONDITION = PROCESS__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__POSTCONDITION = PROCESS__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__BREAKDOWN_ELEMENTS = PROCESS__BREAKDOWN_ELEMENTS;
-
-	/**
-	 * The feature id for the '<em><b>Roadmaps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__ROADMAPS = PROCESS__ROADMAPS;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SUPPORTING_MATERIALS = PROCESS__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__CHECKLISTS = PROCESS__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__CONCEPTS = PROCESS__CONCEPTS;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__EXAMPLES = PROCESS__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__GUIDELINES = PROCESS__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__REUSABLE_ASSETS = PROCESS__REUSABLE_ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_ENACTABLE = PROCESS__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Patterns</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__INCLUDES_PATTERNS = PROCESS__INCLUDES_PATTERNS;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__DEFAULT_CONTEXT = PROCESS__DEFAULT_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__VALID_CONTEXT = PROCESS__VALID_CONTEXT;
-
-	/**
-	 * The number of structural features of the '<em>Capability Pattern</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN_FEATURE_COUNT = PROCESS_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__NAME = PROCESS__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__GUID = PROCESS__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__BRIEF_DESCRIPTION = PROCESS__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__OWNED_RULES = PROCESS__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__METHOD_ELEMENT_PROPERTY = PROCESS__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SUPPRESSED = PROCESS__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__ORDERING_GUIDE = PROCESS__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTATION_NAME = PROCESS__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTATION = PROCESS__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SHAPEICON = PROCESS__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__NODEICON = PROCESS__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PREFIX = PROCESS__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_PLANNED = PROCESS__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__HAS_MULTIPLE_OCCURRENCES = PROCESS__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_OPTIONAL = PROCESS__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTED_AFTER = PROCESS__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTED_BEFORE = PROCESS__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PLANNING_DATA = PROCESS__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SUPER_ACTIVITIES = PROCESS__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_REPEATABLE = PROCESS__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_ONGOING = PROCESS__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_EVENT_DRIVEN = PROCESS__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__LINK_TO_PREDECESSOR = PROCESS__LINK_TO_PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__VARIABILITY_TYPE = PROCESS__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__VARIABILITY_BASED_ON_ELEMENT = PROCESS__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRECONDITION = PROCESS__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__POSTCONDITION = PROCESS__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Elements</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__BREAKDOWN_ELEMENTS = PROCESS__BREAKDOWN_ELEMENTS;
-
-	/**
-	 * The feature id for the '<em><b>Roadmaps</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__ROADMAPS = PROCESS__ROADMAPS;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SUPPORTING_MATERIALS = PROCESS__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__CHECKLISTS = PROCESS__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__CONCEPTS = PROCESS__CONCEPTS;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__EXAMPLES = PROCESS__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__GUIDELINES = PROCESS__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__REUSABLE_ASSETS = PROCESS__REUSABLE_ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_ENACTABLE = PROCESS__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Patterns</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__INCLUDES_PATTERNS = PROCESS__INCLUDES_PATTERNS;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__DEFAULT_CONTEXT = PROCESS__DEFAULT_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__VALID_CONTEXT = PROCESS__VALID_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Based On Processes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES = PROCESS_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Process Planning Template</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE_FEATURE_COUNT = PROCESS_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__GUID = GUIDANCE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__OWNED_RULES = GUIDANCE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Materials</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__SUPPORTING_MATERIALS = GUIDANCE__SUPPORTING_MATERIALS;
-
-	/**
-	 * The feature id for the '<em><b>Concepts And Papers</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__CONCEPTS_AND_PAPERS = GUIDANCE__CONCEPTS_AND_PAPERS;
-
-	/**
-	 * The feature id for the '<em><b>Checklists</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__CHECKLISTS = GUIDANCE__CHECKLISTS;
-
-	/**
-	 * The feature id for the '<em><b>Guidelines</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__GUIDELINES = GUIDANCE__GUIDELINES;
-
-	/**
-	 * The feature id for the '<em><b>Examples</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__EXAMPLES = GUIDANCE__EXAMPLES;
-
-	/**
-	 * The feature id for the '<em><b>Assets</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__ASSETS = GUIDANCE__ASSETS;
-
-	/**
-	 * The feature id for the '<em><b>Term Definition</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__TERM_DEFINITION = GUIDANCE__TERM_DEFINITION;
-
-	/**
-	 * The number of structural features of the '<em>Roadmap</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__NAME = METHOD_PACKAGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__GUID = METHOD_PACKAGE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__BRIEF_DESCRIPTION = METHOD_PACKAGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__OWNED_RULES = METHOD_PACKAGE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__METHOD_ELEMENT_PROPERTY = METHOD_PACKAGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__SUPPRESSED = METHOD_PACKAGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__ORDERING_GUIDE = METHOD_PACKAGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__GLOBAL = METHOD_PACKAGE__GLOBAL;
-
-	/**
-	 * The feature id for the '<em><b>Reused Packages</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__REUSED_PACKAGES = METHOD_PACKAGE__REUSED_PACKAGES;
-
-	/**
-	 * The feature id for the '<em><b>Child Packages</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__CHILD_PACKAGES = METHOD_PACKAGE__CHILD_PACKAGES;
-
-	/**
-	 * The feature id for the '<em><b>Process Elements</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__PROCESS_ELEMENTS = METHOD_PACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Diagrams</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__DIAGRAMS = METHOD_PACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Process Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE_FEATURE_COUNT = METHOD_PACKAGE_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__NAME = PROCESS_PACKAGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__GUID = PROCESS_PACKAGE__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__BRIEF_DESCRIPTION = PROCESS_PACKAGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__OWNED_RULES = PROCESS_PACKAGE__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__METHOD_ELEMENT_PROPERTY = PROCESS_PACKAGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__SUPPRESSED = PROCESS_PACKAGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__ORDERING_GUIDE = PROCESS_PACKAGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__GLOBAL = PROCESS_PACKAGE__GLOBAL;
-
-	/**
-	 * The feature id for the '<em><b>Reused Packages</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__REUSED_PACKAGES = PROCESS_PACKAGE__REUSED_PACKAGES;
-
-	/**
-	 * The feature id for the '<em><b>Child Packages</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__CHILD_PACKAGES = PROCESS_PACKAGE__CHILD_PACKAGES;
-
-	/**
-	 * The feature id for the '<em><b>Process Elements</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__PROCESS_ELEMENTS = PROCESS_PACKAGE__PROCESS_ELEMENTS;
-
-	/**
-	 * The feature id for the '<em><b>Diagrams</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__DIAGRAMS = PROCESS_PACKAGE__DIAGRAMS;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__AUTHORS = PROCESS_PACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__CHANGE_DATE = PROCESS_PACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__CHANGE_DESCRIPTION = PROCESS_PACKAGE_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__VERSION = PROCESS_PACKAGE_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__COPYRIGHT_STATEMENT = PROCESS_PACKAGE_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Interfaces</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__INTERFACES = PROCESS_PACKAGE_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Process</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__PROCESS = PROCESS_PACKAGE_FEATURE_COUNT + 6;
-
-	/**
-	 * The number of structural features of the '<em>Process Component</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_FEATURE_COUNT = PROCESS_PACKAGE_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__GUID = BREAKDOWN_ELEMENT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__OWNED_RULES = BREAKDOWN_ELEMENT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__SUPER_ACTIVITIES = BREAKDOWN_ELEMENT__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Interface Specifications</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Interface IO</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__INTERFACE_IO = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Process Component Interface</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__NAME = DESCRIPTOR__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__GUID = DESCRIPTOR__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__BRIEF_DESCRIPTION = DESCRIPTOR__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__OWNED_RULES = DESCRIPTOR__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__METHOD_ELEMENT_PROPERTY = DESCRIPTOR__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__SUPPRESSED = DESCRIPTOR__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__ORDERING_GUIDE = DESCRIPTOR__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__PRESENTATION_NAME = DESCRIPTOR__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__PRESENTATION = DESCRIPTOR__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__SHAPEICON = DESCRIPTOR__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__NODEICON = DESCRIPTOR__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__PREFIX = DESCRIPTOR__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__IS_PLANNED = DESCRIPTOR__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__IS_OPTIONAL = DESCRIPTOR__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__PRESENTED_AFTER = DESCRIPTOR__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__PRESENTED_BEFORE = DESCRIPTOR__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__PLANNING_DATA = DESCRIPTOR__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activities</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__SUPER_ACTIVITIES = DESCRIPTOR__SUPER_ACTIVITIES;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-
-	/**
-	 * The feature id for the '<em><b>Process Component</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT = DESCRIPTOR_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Process Component Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_DESCRIPTOR_FEATURE_COUNT = DESCRIPTOR_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__GUID = METHOD_UNIT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__OWNED_RULES = METHOD_UNIT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__COPYRIGHT_STATEMENT = METHOD_UNIT__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>User Changeable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__USER_CHANGEABLE = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Method Packages</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__METHOD_PACKAGES = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Bases</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__BASES = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Method Plugin</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl <em>Method Configuration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MethodConfigurationImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodConfiguration()
-	 * @generated
-	 */
-	int METHOD_CONFIGURATION = 113;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__GUID = METHOD_UNIT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__OWNED_RULES = METHOD_UNIT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__COPYRIGHT_STATEMENT = METHOD_UNIT__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Method Plugin Selection</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Method Package Selection</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Process Views</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__PROCESS_VIEWS = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Default View</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__DEFAULT_VIEW = METHOD_UNIT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Base Configurations</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__BASE_CONFIGURATIONS = METHOD_UNIT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Subtracted Category</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__SUBTRACTED_CATEGORY = METHOD_UNIT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Added Category</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__ADDED_CATEGORY = METHOD_UNIT_FEATURE_COUNT + 6;
-
-	/**
-	 * The number of structural features of the '<em>Method Configuration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 7;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.ProcessFamilyImpl <em>Process Family</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.ProcessFamilyImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessFamily()
-	 * @generated
-	 */
-	int PROCESS_FAMILY = 114;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__NAME = METHOD_CONFIGURATION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__GUID = METHOD_CONFIGURATION__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__BRIEF_DESCRIPTION = METHOD_CONFIGURATION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__OWNED_RULES = METHOD_CONFIGURATION__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__METHOD_ELEMENT_PROPERTY = METHOD_CONFIGURATION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__SUPPRESSED = METHOD_CONFIGURATION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__ORDERING_GUIDE = METHOD_CONFIGURATION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__AUTHORS = METHOD_CONFIGURATION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__CHANGE_DATE = METHOD_CONFIGURATION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__CHANGE_DESCRIPTION = METHOD_CONFIGURATION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__VERSION = METHOD_CONFIGURATION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__COPYRIGHT_STATEMENT = METHOD_CONFIGURATION__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Method Plugin Selection</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__METHOD_PLUGIN_SELECTION = METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION;
-
-	/**
-	 * The feature id for the '<em><b>Method Package Selection</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__METHOD_PACKAGE_SELECTION = METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION;
-
-	/**
-	 * The feature id for the '<em><b>Process Views</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__PROCESS_VIEWS = METHOD_CONFIGURATION__PROCESS_VIEWS;
-
-	/**
-	 * The feature id for the '<em><b>Default View</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__DEFAULT_VIEW = METHOD_CONFIGURATION__DEFAULT_VIEW;
-
-	/**
-	 * The feature id for the '<em><b>Base Configurations</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__BASE_CONFIGURATIONS = METHOD_CONFIGURATION__BASE_CONFIGURATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Subtracted Category</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__SUBTRACTED_CATEGORY = METHOD_CONFIGURATION__SUBTRACTED_CATEGORY;
-
-	/**
-	 * The feature id for the '<em><b>Added Category</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__ADDED_CATEGORY = METHOD_CONFIGURATION__ADDED_CATEGORY;
-
-	/**
-	 * The feature id for the '<em><b>Delivery Processes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY__DELIVERY_PROCESSES = METHOD_CONFIGURATION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Process Family</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FAMILY_FEATURE_COUNT = METHOD_CONFIGURATION_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.impl.MethodLibraryImpl <em>Method Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.MethodLibraryImpl
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodLibrary()
-	 * @generated
-	 */
-	int METHOD_LIBRARY = 115;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Guid</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__GUID = METHOD_UNIT__GUID;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rules</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__OWNED_RULES = METHOD_UNIT__OWNED_RULES;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Copyright Statement</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__COPYRIGHT_STATEMENT = METHOD_UNIT__COPYRIGHT_STATEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Method Plugins</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__METHOD_PLUGINS = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Predefined Configurations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Method Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.WorkOrderType <em>Work Order Type</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.WorkOrderType
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkOrderType()
-	 * @generated
-	 */
-	int WORK_ORDER_TYPE = 116;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.PseudoStateKind <em>Pseudo State Kind</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.PseudoStateKind
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPseudoStateKind()
-	 * @generated
-	 */
-	int PSEUDO_STATE_KIND = 117;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.uma.VariabilityType <em>Variability Type</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.VariabilityType
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getVariabilityType()
-	 * @generated
-	 */
-	int VARIABILITY_TYPE = 118;
-
-	/**
-	 * The meta object id for the '<em>Date</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.util.Date
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDate()
-	 * @generated
-	 */
-	int DATE = 119;
-
-	/**
-	 * The meta object id for the '<em>Uri</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.net.URI
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getUri()
-	 * @generated
-	 */
-	int URI = 120;
-
-	/**
-	 * The meta object id for the '<em>Unlimited Natural</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getUnlimitedNatural()
-	 * @generated
-	 */
-	int UNLIMITED_NATURAL = 121;
-
-	/**
-	 * The meta object id for the '<em>String</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.String
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getString()
-	 * @generated
-	 */
-	int STRING = 122;
-
-	/**
-	 * The meta object id for the '<em>Set</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.util.Set
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSet()
-	 * @generated
-	 */
-	int SET = 123;
-
-	/**
-	 * The meta object id for the '<em>Sequence</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.util.List
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSequence()
-	 * @generated
-	 */
-	int SEQUENCE = 124;
-
-	/**
-	 * The meta object id for the '<em>Integer</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getInteger()
-	 * @generated
-	 */
-	int INTEGER = 125;
-
-	/**
-	 * The meta object id for the '<em>Float</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see java.lang.Float
-	 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getFloat()
-	 * @generated
-	 */
-	int FLOAT = 126;
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Classifier <em>Classifier</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Classifier</em>'.
-	 * @see org.eclipse.epf.uma.Classifier
-	 * @generated
-	 */
-	EClass getClassifier();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Type <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Type</em>'.
-	 * @see org.eclipse.epf.uma.Type
-	 * @generated
-	 */
-	EClass getType();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Element <em>Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Element</em>'.
-	 * @see org.eclipse.epf.uma.Element
-	 * @generated
-	 */
-	EClass getElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.NamedElement <em>Named Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Named Element</em>'.
-	 * @see org.eclipse.epf.uma.NamedElement
-	 * @generated
-	 */
-	EClass getNamedElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.NamedElement#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.uma.NamedElement#getName()
-	 * @see #getNamedElement()
-	 * @generated
-	 */
-	EAttribute getNamedElement_Name();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.PackageableElement <em>Packageable Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Packageable Element</em>'.
-	 * @see org.eclipse.epf.uma.PackageableElement
-	 * @generated
-	 */
-	EClass getPackageableElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Package <em>Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Package</em>'.
-	 * @see org.eclipse.epf.uma.Package
-	 * @generated
-	 */
-	EClass getPackage();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Namespace <em>Namespace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Namespace</em>'.
-	 * @see org.eclipse.epf.uma.Namespace
-	 * @generated
-	 */
-	EClass getNamespace();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.MethodElement <em>Method Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Element</em>'.
-	 * @see org.eclipse.epf.uma.MethodElement
-	 * @generated
-	 */
-	EClass getMethodElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodElement#getGuid <em>Guid</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Guid</em>'.
-	 * @see org.eclipse.epf.uma.MethodElement#getGuid()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_Guid();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodElement#getBriefDescription <em>Brief Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Brief Description</em>'.
-	 * @see org.eclipse.epf.uma.MethodElement#getBriefDescription()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_BriefDescription();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.MethodElement#getOwnedRules <em>Owned Rules</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Owned Rules</em>'.
-	 * @see org.eclipse.epf.uma.MethodElement#getOwnedRules()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EReference getMethodElement_OwnedRules();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.MethodElement#getMethodElementProperty <em>Method Element Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Element Property</em>'.
-	 * @see org.eclipse.epf.uma.MethodElement#getMethodElementProperty()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EReference getMethodElement_MethodElementProperty();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodElement#getSuppressed <em>Suppressed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Suppressed</em>'.
-	 * @see org.eclipse.epf.uma.MethodElement#getSuppressed()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_Suppressed();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodElement#getOrderingGuide <em>Ordering Guide</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Ordering Guide</em>'.
-	 * @see org.eclipse.epf.uma.MethodElement#getOrderingGuide()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_OrderingGuide();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Constraint <em>Constraint</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Constraint</em>'.
-	 * @see org.eclipse.epf.uma.Constraint
-	 * @generated
-	 */
-	EClass getConstraint();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Constraint#getBody <em>Body</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Body</em>'.
-	 * @see org.eclipse.epf.uma.Constraint#getBody()
-	 * @see #getConstraint()
-	 * @generated
-	 */
-	EAttribute getConstraint_Body();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.MethodElementProperty <em>Method Element Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Element Property</em>'.
-	 * @see org.eclipse.epf.uma.MethodElementProperty
-	 * @generated
-	 */
-	EClass getMethodElementProperty();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodElementProperty#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.uma.MethodElementProperty#getValue()
-	 * @see #getMethodElementProperty()
-	 * @generated
-	 */
-	EAttribute getMethodElementProperty_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ContentElement <em>Content Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Element</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement
-	 * @generated
-	 */
-	EClass getContentElement();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ContentElement#getSupportingMaterials <em>Supporting Materials</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Supporting Materials</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement#getSupportingMaterials()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EReference getContentElement_SupportingMaterials();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ContentElement#getConceptsAndPapers <em>Concepts And Papers</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Concepts And Papers</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement#getConceptsAndPapers()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EReference getContentElement_ConceptsAndPapers();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ContentElement#getChecklists <em>Checklists</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Checklists</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement#getChecklists()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EReference getContentElement_Checklists();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ContentElement#getGuidelines <em>Guidelines</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Guidelines</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement#getGuidelines()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EReference getContentElement_Guidelines();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ContentElement#getExamples <em>Examples</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Examples</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement#getExamples()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EReference getContentElement_Examples();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ContentElement#getAssets <em>Assets</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Assets</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement#getAssets()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EReference getContentElement_Assets();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ContentElement#getTermDefinition <em>Term Definition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Term Definition</em>'.
-	 * @see org.eclipse.epf.uma.ContentElement#getTermDefinition()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EReference getContentElement_TermDefinition();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DescribableElement <em>Describable Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Describable Element</em>'.
-	 * @see org.eclipse.epf.uma.DescribableElement
-	 * @generated
-	 */
-	EClass getDescribableElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DescribableElement#getPresentationName <em>Presentation Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Presentation Name</em>'.
-	 * @see org.eclipse.epf.uma.DescribableElement#getPresentationName()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EAttribute getDescribableElement_PresentationName();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.DescribableElement#getPresentation <em>Presentation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Presentation</em>'.
-	 * @see org.eclipse.epf.uma.DescribableElement#getPresentation()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EReference getDescribableElement_Presentation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DescribableElement#getShapeicon <em>Shapeicon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Shapeicon</em>'.
-	 * @see org.eclipse.epf.uma.DescribableElement#getShapeicon()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EAttribute getDescribableElement_Shapeicon();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DescribableElement#getNodeicon <em>Nodeicon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Nodeicon</em>'.
-	 * @see org.eclipse.epf.uma.DescribableElement#getNodeicon()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EAttribute getDescribableElement_Nodeicon();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ContentDescription <em>Content Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Description</em>'.
-	 * @see org.eclipse.epf.uma.ContentDescription
-	 * @generated
-	 */
-	EClass getContentDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ContentDescription#getMainDescription <em>Main Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Main Description</em>'.
-	 * @see org.eclipse.epf.uma.ContentDescription#getMainDescription()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EAttribute getContentDescription_MainDescription();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.ContentDescription#getSections <em>Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sections</em>'.
-	 * @see org.eclipse.epf.uma.ContentDescription#getSections()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EReference getContentDescription_Sections();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ContentDescription#getExternalId <em>External Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>External Id</em>'.
-	 * @see org.eclipse.epf.uma.ContentDescription#getExternalId()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EAttribute getContentDescription_ExternalId();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ContentDescription#getKeyConsiderations <em>Key Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Key Considerations</em>'.
-	 * @see org.eclipse.epf.uma.ContentDescription#getKeyConsiderations()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EAttribute getContentDescription_KeyConsiderations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Section <em>Section</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Section</em>'.
-	 * @see org.eclipse.epf.uma.Section
-	 * @generated
-	 */
-	EClass getSection();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Section#getSectionName <em>Section Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Section Name</em>'.
-	 * @see org.eclipse.epf.uma.Section#getSectionName()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EAttribute getSection_SectionName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Section#getSectionDescription <em>Section Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Section Description</em>'.
-	 * @see org.eclipse.epf.uma.Section#getSectionDescription()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EAttribute getSection_SectionDescription();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Section#getSubSections <em>Sub Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sub Sections</em>'.
-	 * @see org.eclipse.epf.uma.Section#getSubSections()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EReference getSection_SubSections();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.Section#getPredecessor <em>Predecessor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Predecessor</em>'.
-	 * @see org.eclipse.epf.uma.Section#getPredecessor()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EReference getSection_Predecessor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Role <em>Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role</em>'.
-	 * @see org.eclipse.epf.uma.Role
-	 * @generated
-	 */
-	EClass getRole();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Role#getModifies <em>Modifies</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Modifies</em>'.
-	 * @see org.eclipse.epf.uma.Role#getModifies()
-	 * @see #getRole()
-	 * @generated
-	 */
-	EReference getRole_Modifies();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Role#getResponsibleFor <em>Responsible For</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Responsible For</em>'.
-	 * @see org.eclipse.epf.uma.Role#getResponsibleFor()
-	 * @see #getRole()
-	 * @generated
-	 */
-	EReference getRole_ResponsibleFor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.WorkProduct <em>Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product</em>'.
-	 * @see org.eclipse.epf.uma.WorkProduct
-	 * @generated
-	 */
-	EClass getWorkProduct();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProduct#getReports <em>Reports</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Reports</em>'.
-	 * @see org.eclipse.epf.uma.WorkProduct#getReports()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EReference getWorkProduct_Reports();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProduct#getTemplates <em>Templates</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Templates</em>'.
-	 * @see org.eclipse.epf.uma.WorkProduct#getTemplates()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EReference getWorkProduct_Templates();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProduct#getToolMentors <em>Tool Mentors</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Tool Mentors</em>'.
-	 * @see org.eclipse.epf.uma.WorkProduct#getToolMentors()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EReference getWorkProduct_ToolMentors();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProduct#getEstimationConsiderations <em>Estimation Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Estimation Considerations</em>'.
-	 * @see org.eclipse.epf.uma.WorkProduct#getEstimationConsiderations()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EReference getWorkProduct_EstimationConsiderations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Task <em>Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task</em>'.
-	 * @see org.eclipse.epf.uma.Task
-	 * @generated
-	 */
-	EClass getTask();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.Task#getPerformedBy <em>Performed By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Performed By</em>'.
-	 * @see org.eclipse.epf.uma.Task#getPerformedBy()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_PerformedBy();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Task#getMandatoryInput <em>Mandatory Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Mandatory Input</em>'.
-	 * @see org.eclipse.epf.uma.Task#getMandatoryInput()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_MandatoryInput();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Task#getOutput <em>Output</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Output</em>'.
-	 * @see org.eclipse.epf.uma.Task#getOutput()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_Output();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Task#getAdditionallyPerformedBy <em>Additionally Performed By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Additionally Performed By</em>'.
-	 * @see org.eclipse.epf.uma.Task#getAdditionallyPerformedBy()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_AdditionallyPerformedBy();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Task#getOptionalInput <em>Optional Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Optional Input</em>'.
-	 * @see org.eclipse.epf.uma.Task#getOptionalInput()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_OptionalInput();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Task#getSteps <em>Steps</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Steps</em>'.
-	 * @see org.eclipse.epf.uma.Task#getSteps()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_Steps();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Task#getToolMentors <em>Tool Mentors</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Tool Mentors</em>'.
-	 * @see org.eclipse.epf.uma.Task#getToolMentors()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_ToolMentors();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Task#getEstimationConsiderations <em>Estimation Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Estimation Considerations</em>'.
-	 * @see org.eclipse.epf.uma.Task#getEstimationConsiderations()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EReference getTask_EstimationConsiderations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.WorkDefinition <em>Work Definition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Definition</em>'.
-	 * @see org.eclipse.epf.uma.WorkDefinition
-	 * @generated
-	 */
-	EClass getWorkDefinition();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.WorkDefinition#getPrecondition <em>Precondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Precondition</em>'.
-	 * @see org.eclipse.epf.uma.WorkDefinition#getPrecondition()
-	 * @see #getWorkDefinition()
-	 * @generated
-	 */
-	EReference getWorkDefinition_Precondition();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.WorkDefinition#getPostcondition <em>Postcondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Postcondition</em>'.
-	 * @see org.eclipse.epf.uma.WorkDefinition#getPostcondition()
-	 * @see #getWorkDefinition()
-	 * @generated
-	 */
-	EReference getWorkDefinition_Postcondition();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Step <em>Step</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Step</em>'.
-	 * @see org.eclipse.epf.uma.Step
-	 * @generated
-	 */
-	EClass getStep();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Guidance <em>Guidance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Guidance</em>'.
-	 * @see org.eclipse.epf.uma.Guidance
-	 * @generated
-	 */
-	EClass getGuidance();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Artifact <em>Artifact</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Artifact</em>'.
-	 * @see org.eclipse.epf.uma.Artifact
-	 * @generated
-	 */
-	EClass getArtifact();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.Artifact#getContainerArtifact <em>Container Artifact</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Container Artifact</em>'.
-	 * @see org.eclipse.epf.uma.Artifact#getContainerArtifact()
-	 * @see #getArtifact()
-	 * @generated
-	 */
-	EReference getArtifact_ContainerArtifact();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Artifact#getContainedArtifacts <em>Contained Artifacts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Contained Artifacts</em>'.
-	 * @see org.eclipse.epf.uma.Artifact#getContainedArtifacts()
-	 * @see #getArtifact()
-	 * @generated
-	 */
-	EReference getArtifact_ContainedArtifacts();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Deliverable <em>Deliverable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Deliverable</em>'.
-	 * @see org.eclipse.epf.uma.Deliverable
-	 * @generated
-	 */
-	EClass getDeliverable();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Deliverable#getDeliveredWorkProducts <em>Delivered Work Products</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Delivered Work Products</em>'.
-	 * @see org.eclipse.epf.uma.Deliverable#getDeliveredWorkProducts()
-	 * @see #getDeliverable()
-	 * @generated
-	 */
-	EReference getDeliverable_DeliveredWorkProducts();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Outcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Outcome</em>'.
-	 * @see org.eclipse.epf.uma.Outcome
-	 * @generated
-	 */
-	EClass getOutcome();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.MethodPackage <em>Method Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Package</em>'.
-	 * @see org.eclipse.epf.uma.MethodPackage
-	 * @generated
-	 */
-	EClass getMethodPackage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodPackage#getGlobal <em>Global</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Global</em>'.
-	 * @see org.eclipse.epf.uma.MethodPackage#getGlobal()
-	 * @see #getMethodPackage()
-	 * @generated
-	 */
-	EAttribute getMethodPackage_Global();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodPackage#getReusedPackages <em>Reused Packages</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Reused Packages</em>'.
-	 * @see org.eclipse.epf.uma.MethodPackage#getReusedPackages()
-	 * @see #getMethodPackage()
-	 * @generated
-	 */
-	EReference getMethodPackage_ReusedPackages();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.MethodPackage#getChildPackages <em>Child Packages</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Child Packages</em>'.
-	 * @see org.eclipse.epf.uma.MethodPackage#getChildPackages()
-	 * @see #getMethodPackage()
-	 * @generated
-	 */
-	EReference getMethodPackage_ChildPackages();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ContentPackage <em>Content Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Package</em>'.
-	 * @see org.eclipse.epf.uma.ContentPackage
-	 * @generated
-	 */
-	EClass getContentPackage();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.ContentPackage#getContentElements <em>Content Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Content Elements</em>'.
-	 * @see org.eclipse.epf.uma.ContentPackage#getContentElements()
-	 * @see #getContentPackage()
-	 * @generated
-	 */
-	EReference getContentPackage_ContentElements();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ArtifactDescription <em>Artifact Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Artifact Description</em>'.
-	 * @see org.eclipse.epf.uma.ArtifactDescription
-	 * @generated
-	 */
-	EClass getArtifactDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ArtifactDescription#getBriefOutline <em>Brief Outline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Brief Outline</em>'.
-	 * @see org.eclipse.epf.uma.ArtifactDescription#getBriefOutline()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_BriefOutline();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ArtifactDescription#getRepresentationOptions <em>Representation Options</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Representation Options</em>'.
-	 * @see org.eclipse.epf.uma.ArtifactDescription#getRepresentationOptions()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_RepresentationOptions();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ArtifactDescription#getRepresentation <em>Representation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Representation</em>'.
-	 * @see org.eclipse.epf.uma.ArtifactDescription#getRepresentation()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_Representation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ArtifactDescription#getNotation <em>Notation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Notation</em>'.
-	 * @see org.eclipse.epf.uma.ArtifactDescription#getNotation()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_Notation();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.WorkProductDescription <em>Work Product Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Description</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescription
-	 * @generated
-	 */
-	EClass getWorkProductDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkProductDescription#getPurpose <em>Purpose</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Purpose</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescription#getPurpose()
-	 * @see #getWorkProductDescription()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescription_Purpose();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkProductDescription#getImpactOfNotHaving <em>Impact Of Not Having</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Impact Of Not Having</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescription#getImpactOfNotHaving()
-	 * @see #getWorkProductDescription()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescription_ImpactOfNotHaving();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkProductDescription#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Reasons For Not Needing</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescription#getReasonsForNotNeeding()
-	 * @see #getWorkProductDescription()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescription_ReasonsForNotNeeding();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DeliverableDescription <em>Deliverable Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Deliverable Description</em>'.
-	 * @see org.eclipse.epf.uma.DeliverableDescription
-	 * @generated
-	 */
-	EClass getDeliverableDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliverableDescription#getExternalDescription <em>External Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>External Description</em>'.
-	 * @see org.eclipse.epf.uma.DeliverableDescription#getExternalDescription()
-	 * @see #getDeliverableDescription()
-	 * @generated
-	 */
-	EAttribute getDeliverableDescription_ExternalDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliverableDescription#getPackagingGuidance <em>Packaging Guidance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Packaging Guidance</em>'.
-	 * @see org.eclipse.epf.uma.DeliverableDescription#getPackagingGuidance()
-	 * @see #getDeliverableDescription()
-	 * @generated
-	 */
-	EAttribute getDeliverableDescription_PackagingGuidance();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.RoleDescription <em>Role Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Description</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescription
-	 * @generated
-	 */
-	EClass getRoleDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.RoleDescription#getSkills <em>Skills</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Skills</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescription#getSkills()
-	 * @see #getRoleDescription()
-	 * @generated
-	 */
-	EAttribute getRoleDescription_Skills();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.RoleDescription#getAssignmentApproaches <em>Assignment Approaches</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Assignment Approaches</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescription#getAssignmentApproaches()
-	 * @see #getRoleDescription()
-	 * @generated
-	 */
-	EAttribute getRoleDescription_AssignmentApproaches();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.RoleDescription#getSynonyms <em>Synonyms</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Synonyms</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescription#getSynonyms()
-	 * @see #getRoleDescription()
-	 * @generated
-	 */
-	EAttribute getRoleDescription_Synonyms();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.TaskDescription <em>Task Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task Description</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescription
-	 * @generated
-	 */
-	EClass getTaskDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.TaskDescription#getPurpose <em>Purpose</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Purpose</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescription#getPurpose()
-	 * @see #getTaskDescription()
-	 * @generated
-	 */
-	EAttribute getTaskDescription_Purpose();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.TaskDescription#getAlternatives <em>Alternatives</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Alternatives</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescription#getAlternatives()
-	 * @see #getTaskDescription()
-	 * @generated
-	 */
-	EAttribute getTaskDescription_Alternatives();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.GuidanceDescription <em>Guidance Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Guidance Description</em>'.
-	 * @see org.eclipse.epf.uma.GuidanceDescription
-	 * @generated
-	 */
-	EClass getGuidanceDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.GuidanceDescription#getAttachments <em>Attachments</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Attachments</em>'.
-	 * @see org.eclipse.epf.uma.GuidanceDescription#getAttachments()
-	 * @see #getGuidanceDescription()
-	 * @generated
-	 */
-	EAttribute getGuidanceDescription_Attachments();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.PracticeDescription <em>Practice Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Practice Description</em>'.
-	 * @see org.eclipse.epf.uma.PracticeDescription
-	 * @generated
-	 */
-	EClass getPracticeDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PracticeDescription#getAdditionalInfo <em>Additional Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Additional Info</em>'.
-	 * @see org.eclipse.epf.uma.PracticeDescription#getAdditionalInfo()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_AdditionalInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PracticeDescription#getProblem <em>Problem</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Problem</em>'.
-	 * @see org.eclipse.epf.uma.PracticeDescription#getProblem()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Problem();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PracticeDescription#getBackground <em>Background</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Background</em>'.
-	 * @see org.eclipse.epf.uma.PracticeDescription#getBackground()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Background();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PracticeDescription#getGoals <em>Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Goals</em>'.
-	 * @see org.eclipse.epf.uma.PracticeDescription#getGoals()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Goals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PracticeDescription#getApplication <em>Application</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Application</em>'.
-	 * @see org.eclipse.epf.uma.PracticeDescription#getApplication()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Application();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PracticeDescription#getLevelsOfAdoption <em>Levels Of Adoption</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Levels Of Adoption</em>'.
-	 * @see org.eclipse.epf.uma.PracticeDescription#getLevelsOfAdoption()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_LevelsOfAdoption();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Point <em>Point</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Point</em>'.
-	 * @see org.eclipse.epf.uma.Point
-	 * @generated
-	 */
-	EClass getPoint();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Point#getX <em>X</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>X</em>'.
-	 * @see org.eclipse.epf.uma.Point#getX()
-	 * @see #getPoint()
-	 * @generated
-	 */
-	EAttribute getPoint_X();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Point#getY <em>Y</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Y</em>'.
-	 * @see org.eclipse.epf.uma.Point#getY()
-	 * @see #getPoint()
-	 * @generated
-	 */
-	EAttribute getPoint_Y();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.GraphElement <em>Graph Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Graph Element</em>'.
-	 * @see org.eclipse.epf.uma.GraphElement
-	 * @generated
-	 */
-	EClass getGraphElement();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.GraphElement#getPosition <em>Position</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Position</em>'.
-	 * @see org.eclipse.epf.uma.GraphElement#getPosition()
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	EReference getGraphElement_Position();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.GraphElement#getContained <em>Contained</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Contained</em>'.
-	 * @see org.eclipse.epf.uma.GraphElement#getContained()
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	EReference getGraphElement_Contained();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.GraphElement#getLink <em>Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Link</em>'.
-	 * @see org.eclipse.epf.uma.GraphElement#getLink()
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	EReference getGraphElement_Link();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.GraphElement#getAnchorage <em>Anchorage</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Anchorage</em>'.
-	 * @see org.eclipse.epf.uma.GraphElement#getAnchorage()
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	EReference getGraphElement_Anchorage();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.GraphElement#getSemanticModel <em>Semantic Model</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Semantic Model</em>'.
-	 * @see org.eclipse.epf.uma.GraphElement#getSemanticModel()
-	 * @see #getGraphElement()
-	 * @generated
-	 */
-	EReference getGraphElement_SemanticModel();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DiagramElement <em>Diagram Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Diagram Element</em>'.
-	 * @see org.eclipse.epf.uma.DiagramElement
-	 * @generated
-	 */
-	EClass getDiagramElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DiagramElement#getIsVisible <em>Is Visible</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Visible</em>'.
-	 * @see org.eclipse.epf.uma.DiagramElement#getIsVisible()
-	 * @see #getDiagramElement()
-	 * @generated
-	 */
-	EAttribute getDiagramElement_IsVisible();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.DiagramElement#getContainer_ <em>Container</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Container</em>'.
-	 * @see org.eclipse.epf.uma.DiagramElement#getContainer_()
-	 * @see #getDiagramElement()
-	 * @generated
-	 */
-	EReference getDiagramElement_Container();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.DiagramElement#getReference <em>Reference</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Reference</em>'.
-	 * @see org.eclipse.epf.uma.DiagramElement#getReference()
-	 * @see #getDiagramElement()
-	 * @generated
-	 */
-	EReference getDiagramElement_Reference();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.DiagramElement#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.epf.uma.DiagramElement#getProperty()
-	 * @see #getDiagramElement()
-	 * @generated
-	 */
-	EReference getDiagramElement_Property();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DiagramLink <em>Diagram Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Diagram Link</em>'.
-	 * @see org.eclipse.epf.uma.DiagramLink
-	 * @generated
-	 */
-	EClass getDiagramLink();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DiagramLink#getZoom <em>Zoom</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Zoom</em>'.
-	 * @see org.eclipse.epf.uma.DiagramLink#getZoom()
-	 * @see #getDiagramLink()
-	 * @generated
-	 */
-	EAttribute getDiagramLink_Zoom();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.DiagramLink#getViewport <em>Viewport</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Viewport</em>'.
-	 * @see org.eclipse.epf.uma.DiagramLink#getViewport()
-	 * @see #getDiagramLink()
-	 * @generated
-	 */
-	EReference getDiagramLink_Viewport();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.DiagramLink#getGraphElement <em>Graph Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Graph Element</em>'.
-	 * @see org.eclipse.epf.uma.DiagramLink#getGraphElement()
-	 * @see #getDiagramLink()
-	 * @generated
-	 */
-	EReference getDiagramLink_GraphElement();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.DiagramLink#getDiagram <em>Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Diagram</em>'.
-	 * @see org.eclipse.epf.uma.DiagramLink#getDiagram()
-	 * @see #getDiagramLink()
-	 * @generated
-	 */
-	EReference getDiagramLink_Diagram();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.GraphConnector <em>Graph Connector</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Graph Connector</em>'.
-	 * @see org.eclipse.epf.uma.GraphConnector
-	 * @generated
-	 */
-	EClass getGraphConnector();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.GraphConnector#getGraphElement <em>Graph Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Graph Element</em>'.
-	 * @see org.eclipse.epf.uma.GraphConnector#getGraphElement()
-	 * @see #getGraphConnector()
-	 * @generated
-	 */
-	EReference getGraphConnector_GraphElement();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.GraphConnector#getGraphEdge <em>Graph Edge</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Graph Edge</em>'.
-	 * @see org.eclipse.epf.uma.GraphConnector#getGraphEdge()
-	 * @see #getGraphConnector()
-	 * @generated
-	 */
-	EReference getGraphConnector_GraphEdge();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.SemanticModelBridge <em>Semantic Model Bridge</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Semantic Model Bridge</em>'.
-	 * @see org.eclipse.epf.uma.SemanticModelBridge
-	 * @generated
-	 */
-	EClass getSemanticModelBridge();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.SemanticModelBridge#getPresentation <em>Presentation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Presentation</em>'.
-	 * @see org.eclipse.epf.uma.SemanticModelBridge#getPresentation()
-	 * @see #getSemanticModelBridge()
-	 * @generated
-	 */
-	EAttribute getSemanticModelBridge_Presentation();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.SemanticModelBridge#getGraphElement <em>Graph Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Graph Element</em>'.
-	 * @see org.eclipse.epf.uma.SemanticModelBridge#getGraphElement()
-	 * @see #getSemanticModelBridge()
-	 * @generated
-	 */
-	EReference getSemanticModelBridge_GraphElement();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.SemanticModelBridge#getDiagram <em>Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Diagram</em>'.
-	 * @see org.eclipse.epf.uma.SemanticModelBridge#getDiagram()
-	 * @see #getSemanticModelBridge()
-	 * @generated
-	 */
-	EReference getSemanticModelBridge_Diagram();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Dimension <em>Dimension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Dimension</em>'.
-	 * @see org.eclipse.epf.uma.Dimension
-	 * @generated
-	 */
-	EClass getDimension();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Dimension#getWidth <em>Width</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Width</em>'.
-	 * @see org.eclipse.epf.uma.Dimension#getWidth()
-	 * @see #getDimension()
-	 * @generated
-	 */
-	EAttribute getDimension_Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Dimension#getHeight <em>Height</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Height</em>'.
-	 * @see org.eclipse.epf.uma.Dimension#getHeight()
-	 * @see #getDimension()
-	 * @generated
-	 */
-	EAttribute getDimension_Height();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Reference <em>Reference</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Reference</em>'.
-	 * @see org.eclipse.epf.uma.Reference
-	 * @generated
-	 */
-	EClass getReference();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Reference#getIsIndividualRepresentation <em>Is Individual Representation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Individual Representation</em>'.
-	 * @see org.eclipse.epf.uma.Reference#getIsIndividualRepresentation()
-	 * @see #getReference()
-	 * @generated
-	 */
-	EAttribute getReference_IsIndividualRepresentation();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.Reference#getReferenced <em>Referenced</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Referenced</em>'.
-	 * @see org.eclipse.epf.uma.Reference#getReferenced()
-	 * @see #getReference()
-	 * @generated
-	 */
-	EReference getReference_Referenced();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Property <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property</em>'.
-	 * @see org.eclipse.epf.uma.Property
-	 * @generated
-	 */
-	EClass getProperty();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Property#getKey <em>Key</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Key</em>'.
-	 * @see org.eclipse.epf.uma.Property#getKey()
-	 * @see #getProperty()
-	 * @generated
-	 */
-	EAttribute getProperty_Key();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Property#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.uma.Property#getValue()
-	 * @see #getProperty()
-	 * @generated
-	 */
-	EAttribute getProperty_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.GraphEdge <em>Graph Edge</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Graph Edge</em>'.
-	 * @see org.eclipse.epf.uma.GraphEdge
-	 * @generated
-	 */
-	EClass getGraphEdge();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.GraphEdge#getAnchor <em>Anchor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Anchor</em>'.
-	 * @see org.eclipse.epf.uma.GraphEdge#getAnchor()
-	 * @see #getGraphEdge()
-	 * @generated
-	 */
-	EReference getGraphEdge_Anchor();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.GraphEdge#getWaypoints <em>Waypoints</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Waypoints</em>'.
-	 * @see org.eclipse.epf.uma.GraphEdge#getWaypoints()
-	 * @see #getGraphEdge()
-	 * @generated
-	 */
-	EReference getGraphEdge_Waypoints();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Diagram <em>Diagram</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Diagram</em>'.
-	 * @see org.eclipse.epf.uma.Diagram
-	 * @generated
-	 */
-	EClass getDiagram();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Diagram#getZoom <em>Zoom</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Zoom</em>'.
-	 * @see org.eclipse.epf.uma.Diagram#getZoom()
-	 * @see #getDiagram()
-	 * @generated
-	 */
-	EAttribute getDiagram_Zoom();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.Diagram#getViewpoint <em>Viewpoint</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Viewpoint</em>'.
-	 * @see org.eclipse.epf.uma.Diagram#getViewpoint()
-	 * @see #getDiagram()
-	 * @generated
-	 */
-	EReference getDiagram_Viewpoint();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Diagram#getDiagramLink <em>Diagram Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Diagram Link</em>'.
-	 * @see org.eclipse.epf.uma.Diagram#getDiagramLink()
-	 * @see #getDiagram()
-	 * @generated
-	 */
-	EReference getDiagram_DiagramLink();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.Diagram#getNamespace <em>Namespace</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Namespace</em>'.
-	 * @see org.eclipse.epf.uma.Diagram#getNamespace()
-	 * @see #getDiagram()
-	 * @generated
-	 */
-	EReference getDiagram_Namespace();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.GraphNode <em>Graph Node</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Graph Node</em>'.
-	 * @see org.eclipse.epf.uma.GraphNode
-	 * @generated
-	 */
-	EClass getGraphNode();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.GraphNode#getSize <em>Size</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Size</em>'.
-	 * @see org.eclipse.epf.uma.GraphNode#getSize()
-	 * @see #getGraphNode()
-	 * @generated
-	 */
-	EReference getGraphNode_Size();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.SimpleSemanticModelElement <em>Simple Semantic Model Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Simple Semantic Model Element</em>'.
-	 * @see org.eclipse.epf.uma.SimpleSemanticModelElement
-	 * @generated
-	 */
-	EClass getSimpleSemanticModelElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.SimpleSemanticModelElement#getTypeInfo <em>Type Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type Info</em>'.
-	 * @see org.eclipse.epf.uma.SimpleSemanticModelElement#getTypeInfo()
-	 * @see #getSimpleSemanticModelElement()
-	 * @generated
-	 */
-	EAttribute getSimpleSemanticModelElement_TypeInfo();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.UMASemanticModelBridge <em>UMA Semantic Model Bridge</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>UMA Semantic Model Bridge</em>'.
-	 * @see org.eclipse.epf.uma.UMASemanticModelBridge
-	 * @generated
-	 */
-	EClass getUMASemanticModelBridge();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.UMASemanticModelBridge#getElement <em>Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Element</em>'.
-	 * @see org.eclipse.epf.uma.UMASemanticModelBridge#getElement()
-	 * @see #getUMASemanticModelBridge()
-	 * @generated
-	 */
-	EReference getUMASemanticModelBridge_Element();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.CoreSemanticModelBridge <em>Core Semantic Model Bridge</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Core Semantic Model Bridge</em>'.
-	 * @see org.eclipse.epf.uma.CoreSemanticModelBridge
-	 * @generated
-	 */
-	EClass getCoreSemanticModelBridge();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.CoreSemanticModelBridge#getElement <em>Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Element</em>'.
-	 * @see org.eclipse.epf.uma.CoreSemanticModelBridge#getElement()
-	 * @see #getCoreSemanticModelBridge()
-	 * @generated
-	 */
-	EReference getCoreSemanticModelBridge_Element();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.LeafElement <em>Leaf Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Leaf Element</em>'.
-	 * @see org.eclipse.epf.uma.LeafElement
-	 * @generated
-	 */
-	EClass getLeafElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.TextElement <em>Text Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Text Element</em>'.
-	 * @see org.eclipse.epf.uma.TextElement
-	 * @generated
-	 */
-	EClass getTextElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.TextElement#getText <em>Text</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text</em>'.
-	 * @see org.eclipse.epf.uma.TextElement#getText()
-	 * @see #getTextElement()
-	 * @generated
-	 */
-	EAttribute getTextElement_Text();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Image <em>Image</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Image</em>'.
-	 * @see org.eclipse.epf.uma.Image
-	 * @generated
-	 */
-	EClass getImage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Image#getUri <em>Uri</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Uri</em>'.
-	 * @see org.eclipse.epf.uma.Image#getUri()
-	 * @see #getImage()
-	 * @generated
-	 */
-	EAttribute getImage_Uri();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Image#getMimeType <em>Mime Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Mime Type</em>'.
-	 * @see org.eclipse.epf.uma.Image#getMimeType()
-	 * @see #getImage()
-	 * @generated
-	 */
-	EAttribute getImage_MimeType();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.GraphicPrimitive <em>Graphic Primitive</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Graphic Primitive</em>'.
-	 * @see org.eclipse.epf.uma.GraphicPrimitive
-	 * @generated
-	 */
-	EClass getGraphicPrimitive();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Polyline <em>Polyline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Polyline</em>'.
-	 * @see org.eclipse.epf.uma.Polyline
-	 * @generated
-	 */
-	EClass getPolyline();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Polyline#getClosed <em>Closed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Closed</em>'.
-	 * @see org.eclipse.epf.uma.Polyline#getClosed()
-	 * @see #getPolyline()
-	 * @generated
-	 */
-	EAttribute getPolyline_Closed();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Polyline#getWaypoints <em>Waypoints</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Waypoints</em>'.
-	 * @see org.eclipse.epf.uma.Polyline#getWaypoints()
-	 * @see #getPolyline()
-	 * @generated
-	 */
-	EReference getPolyline_Waypoints();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Ellipse <em>Ellipse</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ellipse</em>'.
-	 * @see org.eclipse.epf.uma.Ellipse
-	 * @generated
-	 */
-	EClass getEllipse();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Ellipse#getRadiusX <em>Radius X</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Radius X</em>'.
-	 * @see org.eclipse.epf.uma.Ellipse#getRadiusX()
-	 * @see #getEllipse()
-	 * @generated
-	 */
-	EAttribute getEllipse_RadiusX();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Ellipse#getRadiusY <em>Radius Y</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Radius Y</em>'.
-	 * @see org.eclipse.epf.uma.Ellipse#getRadiusY()
-	 * @see #getEllipse()
-	 * @generated
-	 */
-	EAttribute getEllipse_RadiusY();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Ellipse#getRotation <em>Rotation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rotation</em>'.
-	 * @see org.eclipse.epf.uma.Ellipse#getRotation()
-	 * @see #getEllipse()
-	 * @generated
-	 */
-	EAttribute getEllipse_Rotation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Ellipse#getStartAngle <em>Start Angle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start Angle</em>'.
-	 * @see org.eclipse.epf.uma.Ellipse#getStartAngle()
-	 * @see #getEllipse()
-	 * @generated
-	 */
-	EAttribute getEllipse_StartAngle();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Ellipse#getEndAngle <em>End Angle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>End Angle</em>'.
-	 * @see org.eclipse.epf.uma.Ellipse#getEndAngle()
-	 * @see #getEllipse()
-	 * @generated
-	 */
-	EAttribute getEllipse_EndAngle();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.Ellipse#getCenter <em>Center</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Center</em>'.
-	 * @see org.eclipse.epf.uma.Ellipse#getCenter()
-	 * @see #getEllipse()
-	 * @generated
-	 */
-	EReference getEllipse_Center();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Activity <em>Activity</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Activity</em>'.
-	 * @see org.eclipse.epf.uma.Activity
-	 * @generated
-	 */
-	EClass getActivity();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getBreakdownElements <em>Breakdown Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Breakdown Elements</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getBreakdownElements()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_BreakdownElements();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getRoadmaps <em>Roadmaps</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Roadmaps</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getRoadmaps()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_Roadmaps();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getSupportingMaterials <em>Supporting Materials</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Supporting Materials</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getSupportingMaterials()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_SupportingMaterials();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getChecklists <em>Checklists</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Checklists</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getChecklists()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_Checklists();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getConcepts <em>Concepts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Concepts</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getConcepts()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_Concepts();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getExamples <em>Examples</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Examples</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getExamples()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_Examples();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getGuidelines <em>Guidelines</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Guidelines</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getGuidelines()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_Guidelines();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Activity#getReusableAssets <em>Reusable Assets</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Reusable Assets</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getReusableAssets()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_ReusableAssets();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Activity#getIsEnactable <em>Is Enactable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Enactable</em>'.
-	 * @see org.eclipse.epf.uma.Activity#getIsEnactable()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_IsEnactable();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.WorkBreakdownElement <em>Work Breakdown Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Breakdown Element</em>'.
-	 * @see org.eclipse.epf.uma.WorkBreakdownElement
-	 * @generated
-	 */
-	EClass getWorkBreakdownElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsRepeatable <em>Is Repeatable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Repeatable</em>'.
-	 * @see org.eclipse.epf.uma.WorkBreakdownElement#getIsRepeatable()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getWorkBreakdownElement_IsRepeatable();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsOngoing <em>Is Ongoing</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Ongoing</em>'.
-	 * @see org.eclipse.epf.uma.WorkBreakdownElement#getIsOngoing()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getWorkBreakdownElement_IsOngoing();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsEventDriven <em>Is Event Driven</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Event Driven</em>'.
-	 * @see org.eclipse.epf.uma.WorkBreakdownElement#getIsEventDriven()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getWorkBreakdownElement_IsEventDriven();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkBreakdownElement#getLinkToPredecessor <em>Link To Predecessor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Link To Predecessor</em>'.
-	 * @see org.eclipse.epf.uma.WorkBreakdownElement#getLinkToPredecessor()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EReference getWorkBreakdownElement_LinkToPredecessor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.BreakdownElement <em>Breakdown Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Breakdown Element</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement
-	 * @generated
-	 */
-	EClass getBreakdownElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.BreakdownElement#getPrefix <em>Prefix</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Prefix</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getPrefix()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_Prefix();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.BreakdownElement#getIsPlanned <em>Is Planned</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Planned</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getIsPlanned()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_IsPlanned();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.BreakdownElement#getHasMultipleOccurrences <em>Has Multiple Occurrences</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Has Multiple Occurrences</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getHasMultipleOccurrences()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_HasMultipleOccurrences();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.BreakdownElement#getIsOptional <em>Is Optional</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Optional</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getIsOptional()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_IsOptional();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.BreakdownElement#getPresentedAfter <em>Presented After</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Presented After</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getPresentedAfter()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EReference getBreakdownElement_PresentedAfter();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.BreakdownElement#getPresentedBefore <em>Presented Before</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Presented Before</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getPresentedBefore()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EReference getBreakdownElement_PresentedBefore();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.BreakdownElement#getPlanningData <em>Planning Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Planning Data</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getPlanningData()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EReference getBreakdownElement_PlanningData();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.BreakdownElement#getSuperActivities <em>Super Activities</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Super Activities</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElement#getSuperActivities()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EReference getBreakdownElement_SuperActivities();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Milestone <em>Milestone</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Milestone</em>'.
-	 * @see org.eclipse.epf.uma.Milestone
-	 * @generated
-	 */
-	EClass getMilestone();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Iteration <em>Iteration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Iteration</em>'.
-	 * @see org.eclipse.epf.uma.Iteration
-	 * @generated
-	 */
-	EClass getIteration();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Phase <em>Phase</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Phase</em>'.
-	 * @see org.eclipse.epf.uma.Phase
-	 * @generated
-	 */
-	EClass getPhase();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.TeamProfile <em>Team Profile</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Team Profile</em>'.
-	 * @see org.eclipse.epf.uma.TeamProfile
-	 * @generated
-	 */
-	EClass getTeamProfile();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TeamProfile#getTeamRoles <em>Team Roles</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Team Roles</em>'.
-	 * @see org.eclipse.epf.uma.TeamProfile#getTeamRoles()
-	 * @see #getTeamProfile()
-	 * @generated
-	 */
-	EReference getTeamProfile_TeamRoles();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.TeamProfile#getSuperTeam <em>Super Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Super Team</em>'.
-	 * @see org.eclipse.epf.uma.TeamProfile#getSuperTeam()
-	 * @see #getTeamProfile()
-	 * @generated
-	 */
-	EReference getTeamProfile_SuperTeam();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TeamProfile#getSubTeam <em>Sub Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Sub Team</em>'.
-	 * @see org.eclipse.epf.uma.TeamProfile#getSubTeam()
-	 * @see #getTeamProfile()
-	 * @generated
-	 */
-	EReference getTeamProfile_SubTeam();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.RoleDescriptor <em>Role Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Descriptor</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescriptor
-	 * @generated
-	 */
-	EClass getRoleDescriptor();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.RoleDescriptor#getRole <em>Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Role</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescriptor#getRole()
-	 * @see #getRoleDescriptor()
-	 * @generated
-	 */
-	EReference getRoleDescriptor_Role();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.RoleDescriptor#getModifies <em>Modifies</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Modifies</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescriptor#getModifies()
-	 * @see #getRoleDescriptor()
-	 * @generated
-	 */
-	EReference getRoleDescriptor_Modifies();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.RoleDescriptor#getResponsibleFor <em>Responsible For</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Responsible For</em>'.
-	 * @see org.eclipse.epf.uma.RoleDescriptor#getResponsibleFor()
-	 * @see #getRoleDescriptor()
-	 * @generated
-	 */
-	EReference getRoleDescriptor_ResponsibleFor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.WorkOrder <em>Work Order</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Order</em>'.
-	 * @see org.eclipse.epf.uma.WorkOrder
-	 * @generated
-	 */
-	EClass getWorkOrder();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkOrder#getLinkType <em>Link Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Link Type</em>'.
-	 * @see org.eclipse.epf.uma.WorkOrder#getLinkType()
-	 * @see #getWorkOrder()
-	 * @generated
-	 */
-	EAttribute getWorkOrder_LinkType();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.WorkOrder#getPred <em>Pred</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Pred</em>'.
-	 * @see org.eclipse.epf.uma.WorkOrder#getPred()
-	 * @see #getWorkOrder()
-	 * @generated
-	 */
-	EReference getWorkOrder_Pred();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessElement <em>Process Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Element</em>'.
-	 * @see org.eclipse.epf.uma.ProcessElement
-	 * @generated
-	 */
-	EClass getProcessElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.PlanningData <em>Planning Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Planning Data</em>'.
-	 * @see org.eclipse.epf.uma.PlanningData
-	 * @generated
-	 */
-	EClass getPlanningData();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PlanningData#getStartDate <em>Start Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start Date</em>'.
-	 * @see org.eclipse.epf.uma.PlanningData#getStartDate()
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	EAttribute getPlanningData_StartDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PlanningData#getFinishDate <em>Finish Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish Date</em>'.
-	 * @see org.eclipse.epf.uma.PlanningData#getFinishDate()
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	EAttribute getPlanningData_FinishDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.PlanningData#getRank <em>Rank</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rank</em>'.
-	 * @see org.eclipse.epf.uma.PlanningData#getRank()
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	EAttribute getPlanningData_Rank();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Descriptor <em>Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Descriptor</em>'.
-	 * @see org.eclipse.epf.uma.Descriptor
-	 * @generated
-	 */
-	EClass getDescriptor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.Descriptor#getIsSynchronizedWithSource <em>Is Synchronized With Source</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Synchronized With Source</em>'.
-	 * @see org.eclipse.epf.uma.Descriptor#getIsSynchronizedWithSource()
-	 * @see #getDescriptor()
-	 * @generated
-	 */
-	EAttribute getDescriptor_IsSynchronizedWithSource();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.TaskDescriptor <em>Task Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task Descriptor</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor
-	 * @generated
-	 */
-	EClass getTaskDescriptor();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.TaskDescriptor#getTask <em>Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Task</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getTask()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_Task();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TaskDescriptor#getAdditionallyPerformedBy <em>Additionally Performed By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Additionally Performed By</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getAdditionallyPerformedBy()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_AdditionallyPerformedBy();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TaskDescriptor#getAssistedBy <em>Assisted By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Assisted By</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getAssistedBy()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_AssistedBy();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TaskDescriptor#getExternalInput <em>External Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>External Input</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getExternalInput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_ExternalInput();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TaskDescriptor#getMandatoryInput <em>Mandatory Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Mandatory Input</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getMandatoryInput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_MandatoryInput();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TaskDescriptor#getOptionalInput <em>Optional Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Optional Input</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getOptionalInput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_OptionalInput();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TaskDescriptor#getOutput <em>Output</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Output</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getOutput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_Output();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.TaskDescriptor#getPerformedPrimarilyBy <em>Performed Primarily By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Performed Primarily By</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getPerformedPrimarilyBy()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_PerformedPrimarilyBy();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.TaskDescriptor#getSelectedSteps <em>Selected Steps</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Selected Steps</em>'.
-	 * @see org.eclipse.epf.uma.TaskDescriptor#getSelectedSteps()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_SelectedSteps();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.WorkProductDescriptor <em>Work Product Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Descriptor</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor
-	 * @generated
-	 */
-	EClass getWorkProductDescriptor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkProductDescriptor#getActivityEntryState <em>Activity Entry State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Activity Entry State</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getActivityEntryState()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_ActivityEntryState();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.WorkProductDescriptor#getActivityExitState <em>Activity Exit State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Activity Exit State</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getActivityExitState()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_ActivityExitState();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.WorkProductDescriptor#getWorkProduct <em>Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Work Product</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getWorkProduct()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EReference getWorkProductDescriptor_WorkProduct();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProductDescriptor#getImpactedBy <em>Impacted By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Impacted By</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getImpactedBy()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EReference getWorkProductDescriptor_ImpactedBy();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProductDescriptor#getImpacts <em>Impacts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Impacts</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getImpacts()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EReference getWorkProductDescriptor_Impacts();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProductDescriptor#getDeliverableParts <em>Deliverable Parts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Deliverable Parts</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getDeliverableParts()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EReference getWorkProductDescriptor_DeliverableParts();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.CompositeRole <em>Composite Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Composite Role</em>'.
-	 * @see org.eclipse.epf.uma.CompositeRole
-	 * @generated
-	 */
-	EClass getCompositeRole();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.CompositeRole#getAggregatedRoles <em>Aggregated Roles</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Aggregated Roles</em>'.
-	 * @see org.eclipse.epf.uma.CompositeRole#getAggregatedRoles()
-	 * @see #getCompositeRole()
-	 * @generated
-	 */
-	EReference getCompositeRole_AggregatedRoles();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.BreakdownElementDescription <em>Breakdown Element Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Breakdown Element Description</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElementDescription
-	 * @generated
-	 */
-	EClass getBreakdownElementDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.BreakdownElementDescription#getUsageGuidance <em>Usage Guidance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Usage Guidance</em>'.
-	 * @see org.eclipse.epf.uma.BreakdownElementDescription#getUsageGuidance()
-	 * @see #getBreakdownElementDescription()
-	 * @generated
-	 */
-	EAttribute getBreakdownElementDescription_UsageGuidance();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ActivityDescription <em>Activity Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Activity Description</em>'.
-	 * @see org.eclipse.epf.uma.ActivityDescription
-	 * @generated
-	 */
-	EClass getActivityDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ActivityDescription#getPurpose <em>Purpose</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Purpose</em>'.
-	 * @see org.eclipse.epf.uma.ActivityDescription#getPurpose()
-	 * @see #getActivityDescription()
-	 * @generated
-	 */
-	EAttribute getActivityDescription_Purpose();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ActivityDescription#getAlternatives <em>Alternatives</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Alternatives</em>'.
-	 * @see org.eclipse.epf.uma.ActivityDescription#getAlternatives()
-	 * @see #getActivityDescription()
-	 * @generated
-	 */
-	EAttribute getActivityDescription_Alternatives();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ActivityDescription#getHowtoStaff <em>Howto Staff</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Howto Staff</em>'.
-	 * @see org.eclipse.epf.uma.ActivityDescription#getHowtoStaff()
-	 * @see #getActivityDescription()
-	 * @generated
-	 */
-	EAttribute getActivityDescription_HowtoStaff();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DeliveryProcessDescription <em>Delivery Process Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Delivery Process Description</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcessDescription
-	 * @generated
-	 */
-	EClass getDeliveryProcessDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getScale <em>Scale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Scale</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcessDescription#getScale()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_Scale();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getProjectCharacteristics <em>Project Characteristics</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Project Characteristics</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcessDescription#getProjectCharacteristics()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_ProjectCharacteristics();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getRiskLevel <em>Risk Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Risk Level</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcessDescription#getRiskLevel()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_RiskLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getEstimatingTechnique <em>Estimating Technique</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Estimating Technique</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcessDescription#getEstimatingTechnique()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_EstimatingTechnique();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getProjectMemberExpertise <em>Project Member Expertise</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Project Member Expertise</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcessDescription#getProjectMemberExpertise()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_ProjectMemberExpertise();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DeliveryProcessDescription#getTypeOfContract <em>Type Of Contract</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type Of Contract</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcessDescription#getTypeOfContract()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_TypeOfContract();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessDescription <em>Process Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Description</em>'.
-	 * @see org.eclipse.epf.uma.ProcessDescription
-	 * @generated
-	 */
-	EClass getProcessDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ProcessDescription#getScope <em>Scope</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Scope</em>'.
-	 * @see org.eclipse.epf.uma.ProcessDescription#getScope()
-	 * @see #getProcessDescription()
-	 * @generated
-	 */
-	EAttribute getProcessDescription_Scope();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.ProcessDescription#getUsageNotes <em>Usage Notes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Usage Notes</em>'.
-	 * @see org.eclipse.epf.uma.ProcessDescription#getUsageNotes()
-	 * @see #getProcessDescription()
-	 * @generated
-	 */
-	EAttribute getProcessDescription_UsageNotes();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DescriptorDescription <em>Descriptor Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Descriptor Description</em>'.
-	 * @see org.eclipse.epf.uma.DescriptorDescription
-	 * @generated
-	 */
-	EClass getDescriptorDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.DescriptorDescription#getRefinedDescription <em>Refined Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Refined Description</em>'.
-	 * @see org.eclipse.epf.uma.DescriptorDescription#getRefinedDescription()
-	 * @see #getDescriptorDescription()
-	 * @generated
-	 */
-	EAttribute getDescriptorDescription_RefinedDescription();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Concept <em>Concept</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Concept</em>'.
-	 * @see org.eclipse.epf.uma.Concept
-	 * @generated
-	 */
-	EClass getConcept();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Checklist <em>Checklist</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Checklist</em>'.
-	 * @see org.eclipse.epf.uma.Checklist
-	 * @generated
-	 */
-	EClass getChecklist();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Example <em>Example</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Example</em>'.
-	 * @see org.eclipse.epf.uma.Example
-	 * @generated
-	 */
-	EClass getExample();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Guideline <em>Guideline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Guideline</em>'.
-	 * @see org.eclipse.epf.uma.Guideline
-	 * @generated
-	 */
-	EClass getGuideline();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.EstimationConsiderations <em>Estimation Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Estimation Considerations</em>'.
-	 * @see org.eclipse.epf.uma.EstimationConsiderations
-	 * @generated
-	 */
-	EClass getEstimationConsiderations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Report <em>Report</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Report</em>'.
-	 * @see org.eclipse.epf.uma.Report
-	 * @generated
-	 */
-	EClass getReport();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Template <em>Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Template</em>'.
-	 * @see org.eclipse.epf.uma.Template
-	 * @generated
-	 */
-	EClass getTemplate();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.SupportingMaterial <em>Supporting Material</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Supporting Material</em>'.
-	 * @see org.eclipse.epf.uma.SupportingMaterial
-	 * @generated
-	 */
-	EClass getSupportingMaterial();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ToolMentor <em>Tool Mentor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tool Mentor</em>'.
-	 * @see org.eclipse.epf.uma.ToolMentor
-	 * @generated
-	 */
-	EClass getToolMentor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Whitepaper <em>Whitepaper</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Whitepaper</em>'.
-	 * @see org.eclipse.epf.uma.Whitepaper
-	 * @generated
-	 */
-	EClass getWhitepaper();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.TermDefinition <em>Term Definition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Term Definition</em>'.
-	 * @see org.eclipse.epf.uma.TermDefinition
-	 * @generated
-	 */
-	EClass getTermDefinition();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Practice <em>Practice</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Practice</em>'.
-	 * @see org.eclipse.epf.uma.Practice
-	 * @generated
-	 */
-	EClass getPractice();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Practice#getSubPractices <em>Sub Practices</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sub Practices</em>'.
-	 * @see org.eclipse.epf.uma.Practice#getSubPractices()
-	 * @see #getPractice()
-	 * @generated
-	 */
-	EReference getPractice_SubPractices();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Practice#getContentReferences <em>Content References</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Content References</em>'.
-	 * @see org.eclipse.epf.uma.Practice#getContentReferences()
-	 * @see #getPractice()
-	 * @generated
-	 */
-	EReference getPractice_ContentReferences();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Practice#getActivityReferences <em>Activity References</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Activity References</em>'.
-	 * @see org.eclipse.epf.uma.Practice#getActivityReferences()
-	 * @see #getPractice()
-	 * @generated
-	 */
-	EReference getPractice_ActivityReferences();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ReusableAsset <em>Reusable Asset</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Reusable Asset</em>'.
-	 * @see org.eclipse.epf.uma.ReusableAsset
-	 * @generated
-	 */
-	EClass getReusableAsset();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.State <em>State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>State</em>'.
-	 * @see org.eclipse.epf.uma.State
-	 * @generated
-	 */
-	EClass getState();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.State#getWorkProduct <em>Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Work Product</em>'.
-	 * @see org.eclipse.epf.uma.State#getWorkProduct()
-	 * @see #getState()
-	 * @generated
-	 */
-	EReference getState_WorkProduct();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.State#getRegion <em>Region</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Region</em>'.
-	 * @see org.eclipse.epf.uma.State#getRegion()
-	 * @see #getState()
-	 * @generated
-	 */
-	EReference getState_Region();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.State#getSubmachine <em>Submachine</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Submachine</em>'.
-	 * @see org.eclipse.epf.uma.State#getSubmachine()
-	 * @see #getState()
-	 * @generated
-	 */
-	EReference getState_Submachine();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Vertex <em>Vertex</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Vertex</em>'.
-	 * @see org.eclipse.epf.uma.Vertex
-	 * @generated
-	 */
-	EClass getVertex();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.Vertex#getContainer_ <em>Container</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Container</em>'.
-	 * @see org.eclipse.epf.uma.Vertex#getContainer_()
-	 * @see #getVertex()
-	 * @generated
-	 */
-	EReference getVertex_Container();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Vertex#getOutgoing <em>Outgoing</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Outgoing</em>'.
-	 * @see org.eclipse.epf.uma.Vertex#getOutgoing()
-	 * @see #getVertex()
-	 * @generated
-	 */
-	EReference getVertex_Outgoing();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Vertex#getIncoming <em>Incoming</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Incoming</em>'.
-	 * @see org.eclipse.epf.uma.Vertex#getIncoming()
-	 * @see #getVertex()
-	 * @generated
-	 */
-	EReference getVertex_Incoming();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Region <em>Region</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Region</em>'.
-	 * @see org.eclipse.epf.uma.Region
-	 * @generated
-	 */
-	EClass getRegion();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Region#getVertex <em>Vertex</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Vertex</em>'.
-	 * @see org.eclipse.epf.uma.Region#getVertex()
-	 * @see #getRegion()
-	 * @generated
-	 */
-	EReference getRegion_Vertex();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Region#getTransition <em>Transition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Transition</em>'.
-	 * @see org.eclipse.epf.uma.Region#getTransition()
-	 * @see #getRegion()
-	 * @generated
-	 */
-	EReference getRegion_Transition();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.Region#getState <em>State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>State</em>'.
-	 * @see org.eclipse.epf.uma.Region#getState()
-	 * @see #getRegion()
-	 * @generated
-	 */
-	EReference getRegion_State();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.Region#getStateMachine <em>State Machine</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>State Machine</em>'.
-	 * @see org.eclipse.epf.uma.Region#getStateMachine()
-	 * @see #getRegion()
-	 * @generated
-	 */
-	EReference getRegion_StateMachine();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.StateMachine <em>State Machine</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>State Machine</em>'.
-	 * @see org.eclipse.epf.uma.StateMachine
-	 * @generated
-	 */
-	EClass getStateMachine();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.StateMachine#getRegion <em>Region</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Region</em>'.
-	 * @see org.eclipse.epf.uma.StateMachine#getRegion()
-	 * @see #getStateMachine()
-	 * @generated
-	 */
-	EReference getStateMachine_Region();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Transition <em>Transition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Transition</em>'.
-	 * @see org.eclipse.epf.uma.Transition
-	 * @generated
-	 */
-	EClass getTransition();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Transition#getWorkDefinition <em>Work Definition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Work Definition</em>'.
-	 * @see org.eclipse.epf.uma.Transition#getWorkDefinition()
-	 * @see #getTransition()
-	 * @generated
-	 */
-	EReference getTransition_WorkDefinition();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.epf.uma.Transition#getContainer_ <em>Container</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the container reference '<em>Container</em>'.
-	 * @see org.eclipse.epf.uma.Transition#getContainer_()
-	 * @see #getTransition()
-	 * @generated
-	 */
-	EReference getTransition_Container();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.Transition#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Source</em>'.
-	 * @see org.eclipse.epf.uma.Transition#getSource()
-	 * @see #getTransition()
-	 * @generated
-	 */
-	EReference getTransition_Source();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.Transition#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Target</em>'.
-	 * @see org.eclipse.epf.uma.Transition#getTarget()
-	 * @see #getTransition()
-	 * @generated
-	 */
-	EReference getTransition_Target();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.PseudoState <em>Pseudo State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Pseudo State</em>'.
-	 * @see org.eclipse.epf.uma.PseudoState
-	 * @generated
-	 */
-	EClass getPseudoState();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Discipline <em>Discipline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Discipline</em>'.
-	 * @see org.eclipse.epf.uma.Discipline
-	 * @generated
-	 */
-	EClass getDiscipline();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Discipline#getTasks <em>Tasks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Tasks</em>'.
-	 * @see org.eclipse.epf.uma.Discipline#getTasks()
-	 * @see #getDiscipline()
-	 * @generated
-	 */
-	EReference getDiscipline_Tasks();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Discipline#getSubdiscipline <em>Subdiscipline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Subdiscipline</em>'.
-	 * @see org.eclipse.epf.uma.Discipline#getSubdiscipline()
-	 * @see #getDiscipline()
-	 * @generated
-	 */
-	EReference getDiscipline_Subdiscipline();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Discipline#getReferenceWorkflows <em>Reference Workflows</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Reference Workflows</em>'.
-	 * @see org.eclipse.epf.uma.Discipline#getReferenceWorkflows()
-	 * @see #getDiscipline()
-	 * @generated
-	 */
-	EReference getDiscipline_ReferenceWorkflows();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ContentCategory <em>Content Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Category</em>'.
-	 * @see org.eclipse.epf.uma.ContentCategory
-	 * @generated
-	 */
-	EClass getContentCategory();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.RoleSet <em>Role Set</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Set</em>'.
-	 * @see org.eclipse.epf.uma.RoleSet
-	 * @generated
-	 */
-	EClass getRoleSet();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.RoleSet#getRoles <em>Roles</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Roles</em>'.
-	 * @see org.eclipse.epf.uma.RoleSet#getRoles()
-	 * @see #getRoleSet()
-	 * @generated
-	 */
-	EReference getRoleSet_Roles();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Domain <em>Domain</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Domain</em>'.
-	 * @see org.eclipse.epf.uma.Domain
-	 * @generated
-	 */
-	EClass getDomain();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Domain#getWorkProducts <em>Work Products</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Work Products</em>'.
-	 * @see org.eclipse.epf.uma.Domain#getWorkProducts()
-	 * @see #getDomain()
-	 * @generated
-	 */
-	EReference getDomain_WorkProducts();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.Domain#getSubdomains <em>Subdomains</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Subdomains</em>'.
-	 * @see org.eclipse.epf.uma.Domain#getSubdomains()
-	 * @see #getDomain()
-	 * @generated
-	 */
-	EReference getDomain_Subdomains();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.WorkProductType <em>Work Product Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Type</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductType
-	 * @generated
-	 */
-	EClass getWorkProductType();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.WorkProductType#getWorkProducts <em>Work Products</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Work Products</em>'.
-	 * @see org.eclipse.epf.uma.WorkProductType#getWorkProducts()
-	 * @see #getWorkProductType()
-	 * @generated
-	 */
-	EReference getWorkProductType_WorkProducts();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DisciplineGrouping <em>Discipline Grouping</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Discipline Grouping</em>'.
-	 * @see org.eclipse.epf.uma.DisciplineGrouping
-	 * @generated
-	 */
-	EClass getDisciplineGrouping();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.DisciplineGrouping#getDisciplines <em>Disciplines</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Disciplines</em>'.
-	 * @see org.eclipse.epf.uma.DisciplineGrouping#getDisciplines()
-	 * @see #getDisciplineGrouping()
-	 * @generated
-	 */
-	EReference getDisciplineGrouping_Disciplines();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Tool <em>Tool</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tool</em>'.
-	 * @see org.eclipse.epf.uma.Tool
-	 * @generated
-	 */
-	EClass getTool();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Tool#getToolMentors <em>Tool Mentors</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Tool Mentors</em>'.
-	 * @see org.eclipse.epf.uma.Tool#getToolMentors()
-	 * @see #getTool()
-	 * @generated
-	 */
-	EReference getTool_ToolMentors();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.RoleSetGrouping <em>Role Set Grouping</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Set Grouping</em>'.
-	 * @see org.eclipse.epf.uma.RoleSetGrouping
-	 * @generated
-	 */
-	EClass getRoleSetGrouping();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.RoleSetGrouping#getRoleSets <em>Role Sets</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Role Sets</em>'.
-	 * @see org.eclipse.epf.uma.RoleSetGrouping#getRoleSets()
-	 * @see #getRoleSetGrouping()
-	 * @generated
-	 */
-	EReference getRoleSetGrouping_RoleSets();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.CustomCategory <em>Custom Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Custom Category</em>'.
-	 * @see org.eclipse.epf.uma.CustomCategory
-	 * @generated
-	 */
-	EClass getCustomCategory();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.CustomCategory#getCategorizedElements <em>Categorized Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Categorized Elements</em>'.
-	 * @see org.eclipse.epf.uma.CustomCategory#getCategorizedElements()
-	 * @see #getCustomCategory()
-	 * @generated
-	 */
-	EReference getCustomCategory_CategorizedElements();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.CustomCategory#getSubCategories <em>Sub Categories</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Sub Categories</em>'.
-	 * @see org.eclipse.epf.uma.CustomCategory#getSubCategories()
-	 * @see #getCustomCategory()
-	 * @generated
-	 */
-	EReference getCustomCategory_SubCategories();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.DeliveryProcess <em>Delivery Process</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Delivery Process</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcess
-	 * @generated
-	 */
-	EClass getDeliveryProcess();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.DeliveryProcess#getEducationMaterials <em>Education Materials</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Education Materials</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcess#getEducationMaterials()
-	 * @see #getDeliveryProcess()
-	 * @generated
-	 */
-	EReference getDeliveryProcess_EducationMaterials();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.DeliveryProcess#getCommunicationsMaterials <em>Communications Materials</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Communications Materials</em>'.
-	 * @see org.eclipse.epf.uma.DeliveryProcess#getCommunicationsMaterials()
-	 * @see #getDeliveryProcess()
-	 * @generated
-	 */
-	EReference getDeliveryProcess_CommunicationsMaterials();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Process <em>Process</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process</em>'.
-	 * @see org.eclipse.epf.uma.Process
-	 * @generated
-	 */
-	EClass getProcess();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Process#getIncludesPatterns <em>Includes Patterns</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Includes Patterns</em>'.
-	 * @see org.eclipse.epf.uma.Process#getIncludesPatterns()
-	 * @see #getProcess()
-	 * @generated
-	 */
-	EReference getProcess_IncludesPatterns();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.Process#getDefaultContext <em>Default Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Default Context</em>'.
-	 * @see org.eclipse.epf.uma.Process#getDefaultContext()
-	 * @see #getProcess()
-	 * @generated
-	 */
-	EReference getProcess_DefaultContext();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.Process#getValidContext <em>Valid Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Valid Context</em>'.
-	 * @see org.eclipse.epf.uma.Process#getValidContext()
-	 * @see #getProcess()
-	 * @generated
-	 */
-	EReference getProcess_ValidContext();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.CapabilityPattern <em>Capability Pattern</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Capability Pattern</em>'.
-	 * @see org.eclipse.epf.uma.CapabilityPattern
-	 * @generated
-	 */
-	EClass getCapabilityPattern();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessPlanningTemplate <em>Process Planning Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Planning Template</em>'.
-	 * @see org.eclipse.epf.uma.ProcessPlanningTemplate
-	 * @generated
-	 */
-	EClass getProcessPlanningTemplate();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ProcessPlanningTemplate#getBasedOnProcesses <em>Based On Processes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Based On Processes</em>'.
-	 * @see org.eclipse.epf.uma.ProcessPlanningTemplate#getBasedOnProcesses()
-	 * @see #getProcessPlanningTemplate()
-	 * @generated
-	 */
-	EReference getProcessPlanningTemplate_BasedOnProcesses();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.Roadmap <em>Roadmap</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Roadmap</em>'.
-	 * @see org.eclipse.epf.uma.Roadmap
-	 * @generated
-	 */
-	EClass getRoadmap();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessComponent <em>Process Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Component</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponent
-	 * @generated
-	 */
-	EClass getProcessComponent();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ProcessComponent#getInterfaces <em>Interfaces</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Interfaces</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponent#getInterfaces()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EReference getProcessComponent_Interfaces();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.uma.ProcessComponent#getProcess <em>Process</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Process</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponent#getProcess()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EReference getProcessComponent_Process();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessPackage <em>Process Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Package</em>'.
-	 * @see org.eclipse.epf.uma.ProcessPackage
-	 * @generated
-	 */
-	EClass getProcessPackage();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.ProcessPackage#getProcessElements <em>Process Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Process Elements</em>'.
-	 * @see org.eclipse.epf.uma.ProcessPackage#getProcessElements()
-	 * @see #getProcessPackage()
-	 * @generated
-	 */
-	EReference getProcessPackage_ProcessElements();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.ProcessPackage#getDiagrams <em>Diagrams</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Diagrams</em>'.
-	 * @see org.eclipse.epf.uma.ProcessPackage#getDiagrams()
-	 * @see #getProcessPackage()
-	 * @generated
-	 */
-	EReference getProcessPackage_Diagrams();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessComponentInterface <em>Process Component Interface</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Component Interface</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponentInterface
-	 * @generated
-	 */
-	EClass getProcessComponentInterface();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.ProcessComponentInterface#getInterfaceSpecifications <em>Interface Specifications</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Interface Specifications</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponentInterface#getInterfaceSpecifications()
-	 * @see #getProcessComponentInterface()
-	 * @generated
-	 */
-	EReference getProcessComponentInterface_InterfaceSpecifications();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.ProcessComponentInterface#getInterfaceIO <em>Interface IO</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Interface IO</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponentInterface#getInterfaceIO()
-	 * @see #getProcessComponentInterface()
-	 * @generated
-	 */
-	EReference getProcessComponentInterface_InterfaceIO();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessComponentDescriptor <em>Process Component Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Component Descriptor</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponentDescriptor
-	 * @generated
-	 */
-	EClass getProcessComponentDescriptor();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.ProcessComponentDescriptor#getProcessComponent <em>Process Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Process Component</em>'.
-	 * @see org.eclipse.epf.uma.ProcessComponentDescriptor#getProcessComponent()
-	 * @see #getProcessComponentDescriptor()
-	 * @generated
-	 */
-	EReference getProcessComponentDescriptor_ProcessComponent();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.MethodPlugin <em>Method Plugin</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Plugin</em>'.
-	 * @see org.eclipse.epf.uma.MethodPlugin
-	 * @generated
-	 */
-	EClass getMethodPlugin();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodPlugin#getUserChangeable <em>User Changeable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>User Changeable</em>'.
-	 * @see org.eclipse.epf.uma.MethodPlugin#getUserChangeable()
-	 * @see #getMethodPlugin()
-	 * @generated
-	 */
-	EAttribute getMethodPlugin_UserChangeable();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.MethodPlugin#getMethodPackages <em>Method Packages</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Packages</em>'.
-	 * @see org.eclipse.epf.uma.MethodPlugin#getMethodPackages()
-	 * @see #getMethodPlugin()
-	 * @generated
-	 */
-	EReference getMethodPlugin_MethodPackages();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodPlugin#getBases <em>Bases</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Bases</em>'.
-	 * @see org.eclipse.epf.uma.MethodPlugin#getBases()
-	 * @see #getMethodPlugin()
-	 * @generated
-	 */
-	EReference getMethodPlugin_Bases();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.VariabilityElement <em>Variability Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Variability Element</em>'.
-	 * @see org.eclipse.epf.uma.VariabilityElement
-	 * @generated
-	 */
-	EClass getVariabilityElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.VariabilityElement#getVariabilityType <em>Variability Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Variability Type</em>'.
-	 * @see org.eclipse.epf.uma.VariabilityElement#getVariabilityType()
-	 * @see #getVariabilityElement()
-	 * @generated
-	 */
-	EAttribute getVariabilityElement_VariabilityType();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.VariabilityElement#getVariabilityBasedOnElement <em>Variability Based On Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Variability Based On Element</em>'.
-	 * @see org.eclipse.epf.uma.VariabilityElement#getVariabilityBasedOnElement()
-	 * @see #getVariabilityElement()
-	 * @generated
-	 */
-	EReference getVariabilityElement_VariabilityBasedOnElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.MethodUnit <em>Method Unit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Unit</em>'.
-	 * @see org.eclipse.epf.uma.MethodUnit
-	 * @generated
-	 */
-	EClass getMethodUnit();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodUnit#getAuthors <em>Authors</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Authors</em>'.
-	 * @see org.eclipse.epf.uma.MethodUnit#getAuthors()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_Authors();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodUnit#getChangeDate <em>Change Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Change Date</em>'.
-	 * @see org.eclipse.epf.uma.MethodUnit#getChangeDate()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_ChangeDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodUnit#getChangeDescription <em>Change Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Change Description</em>'.
-	 * @see org.eclipse.epf.uma.MethodUnit#getChangeDescription()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_ChangeDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.uma.MethodUnit#getVersion <em>Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Version</em>'.
-	 * @see org.eclipse.epf.uma.MethodUnit#getVersion()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_Version();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.MethodUnit#getCopyrightStatement <em>Copyright Statement</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Copyright Statement</em>'.
-	 * @see org.eclipse.epf.uma.MethodUnit#getCopyrightStatement()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EReference getMethodUnit_CopyrightStatement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.MethodConfiguration <em>Method Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Configuration</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration
-	 * @generated
-	 */
-	EClass getMethodConfiguration();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodConfiguration#getMethodPluginSelection <em>Method Plugin Selection</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Method Plugin Selection</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration#getMethodPluginSelection()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EReference getMethodConfiguration_MethodPluginSelection();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodConfiguration#getMethodPackageSelection <em>Method Package Selection</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Method Package Selection</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration#getMethodPackageSelection()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EReference getMethodConfiguration_MethodPackageSelection();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodConfiguration#getProcessViews <em>Process Views</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Process Views</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration#getProcessViews()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EReference getMethodConfiguration_ProcessViews();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.epf.uma.MethodConfiguration#getDefaultView <em>Default View</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Default View</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration#getDefaultView()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EReference getMethodConfiguration_DefaultView();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodConfiguration#getBaseConfigurations <em>Base Configurations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Base Configurations</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration#getBaseConfigurations()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EReference getMethodConfiguration_BaseConfigurations();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodConfiguration#getSubtractedCategory <em>Subtracted Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Subtracted Category</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration#getSubtractedCategory()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EReference getMethodConfiguration_SubtractedCategory();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.MethodConfiguration#getAddedCategory <em>Added Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Added Category</em>'.
-	 * @see org.eclipse.epf.uma.MethodConfiguration#getAddedCategory()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EReference getMethodConfiguration_AddedCategory();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.ProcessFamily <em>Process Family</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Family</em>'.
-	 * @see org.eclipse.epf.uma.ProcessFamily
-	 * @generated
-	 */
-	EClass getProcessFamily();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.epf.uma.ProcessFamily#getDeliveryProcesses <em>Delivery Processes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Delivery Processes</em>'.
-	 * @see org.eclipse.epf.uma.ProcessFamily#getDeliveryProcesses()
-	 * @see #getProcessFamily()
-	 * @generated
-	 */
-	EReference getProcessFamily_DeliveryProcesses();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.uma.MethodLibrary <em>Method Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Library</em>'.
-	 * @see org.eclipse.epf.uma.MethodLibrary
-	 * @generated
-	 */
-	EClass getMethodLibrary();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.MethodLibrary#getMethodPlugins <em>Method Plugins</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Plugins</em>'.
-	 * @see org.eclipse.epf.uma.MethodLibrary#getMethodPlugins()
-	 * @see #getMethodLibrary()
-	 * @generated
-	 */
-	EReference getMethodLibrary_MethodPlugins();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.uma.MethodLibrary#getPredefinedConfigurations <em>Predefined Configurations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Predefined Configurations</em>'.
-	 * @see org.eclipse.epf.uma.MethodLibrary#getPredefinedConfigurations()
-	 * @see #getMethodLibrary()
-	 * @generated
-	 */
-	EReference getMethodLibrary_PredefinedConfigurations();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.epf.uma.WorkOrderType <em>Work Order Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Work Order Type</em>'.
-	 * @see org.eclipse.epf.uma.WorkOrderType
-	 * @generated
-	 */
-	EEnum getWorkOrderType();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.epf.uma.PseudoStateKind <em>Pseudo State Kind</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Pseudo State Kind</em>'.
-	 * @see org.eclipse.epf.uma.PseudoStateKind
-	 * @generated
-	 */
-	EEnum getPseudoStateKind();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.epf.uma.VariabilityType <em>Variability Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Variability Type</em>'.
-	 * @see org.eclipse.epf.uma.VariabilityType
-	 * @generated
-	 */
-	EEnum getVariabilityType();
-
-	/**
-	 * Returns the meta object for data type '{@link java.util.Date <em>Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Date</em>'.
-	 * @see java.util.Date
-	 * @model instanceClass="java.util.Date"
-	 * @generated
-	 */
-	EDataType getDate();
-
-	/**
-	 * Returns the meta object for data type '{@link java.net.URI <em>Uri</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Uri</em>'.
-	 * @see java.net.URI
-	 * @model instanceClass="java.net.URI"
-	 * @generated
-	 */
-	EDataType getUri();
-
-	/**
-	 * Returns the meta object for data type '<em>Unlimited Natural</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Unlimited Natural</em>'.
-	 * @model instanceClass="int"
-	 * @generated
-	 */
-	EDataType getUnlimitedNatural();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.String <em>String</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>String</em>'.
-	 * @see java.lang.String
-	 * @model instanceClass="java.lang.String"
-	 * @generated
-	 */
-	EDataType getString();
-
-	/**
-	 * Returns the meta object for data type '{@link java.util.Set <em>Set</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Set</em>'.
-	 * @see java.util.Set
-	 * @model instanceClass="java.util.Set"
-	 * @generated
-	 */
-	EDataType getSet();
-
-	/**
-	 * Returns the meta object for data type '{@link java.util.List <em>Sequence</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Sequence</em>'.
-	 * @see java.util.List
-	 * @model instanceClass="java.util.List"
-	 * @generated
-	 */
-	EDataType getSequence();
-
-	/**
-	 * Returns the meta object for data type '<em>Integer</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Integer</em>'.
-	 * @model instanceClass="int"
-	 * @generated
-	 */
-	EDataType getInteger();
-
-	/**
-	 * Returns the meta object for data type '{@link java.lang.Float <em>Float</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Float</em>'.
-	 * @see java.lang.Float
-	 * @model instanceClass="java.lang.Float"
-	 * @generated
-	 */
-	EDataType getFloat();
-
-	/**
-	 * 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
-	 */
-	UmaFactory getUmaFactory();
-
-	/**
-	 * <!-- 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.epf.uma.impl.ClassifierImpl <em>Classifier</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ClassifierImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getClassifier()
-		 * @generated
-		 */
-		EClass CLASSIFIER = eINSTANCE.getClassifier();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TypeImpl <em>Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TypeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getType()
-		 * @generated
-		 */
-		EClass TYPE = eINSTANCE.getType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ElementImpl <em>Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getElement()
-		 * @generated
-		 */
-		EClass ELEMENT = eINSTANCE.getElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.NamedElementImpl <em>Named Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.NamedElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getNamedElement()
-		 * @generated
-		 */
-		EClass NAMED_ELEMENT = eINSTANCE.getNamedElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NAMED_ELEMENT__NAME = eINSTANCE.getNamedElement_Name();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PackageableElementImpl <em>Packageable Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PackageableElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPackageableElement()
-		 * @generated
-		 */
-		EClass PACKAGEABLE_ELEMENT = eINSTANCE.getPackageableElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PackageImpl <em>Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PackageImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPackage()
-		 * @generated
-		 */
-		EClass PACKAGE = eINSTANCE.getPackage();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.NamespaceImpl <em>Namespace</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.NamespaceImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getNamespace()
-		 * @generated
-		 */
-		EClass NAMESPACE = eINSTANCE.getNamespace();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MethodElementImpl <em>Method Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MethodElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodElement()
-		 * @generated
-		 */
-		EClass METHOD_ELEMENT = eINSTANCE.getMethodElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Guid</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__GUID = eINSTANCE.getMethodElement_Guid();
-
-		/**
-		 * The meta object literal for the '<em><b>Brief Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__BRIEF_DESCRIPTION = eINSTANCE
-				.getMethodElement_BriefDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Owned Rules</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_ELEMENT__OWNED_RULES = eINSTANCE
-				.getMethodElement_OwnedRules();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Element Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY = eINSTANCE
-				.getMethodElement_MethodElementProperty();
-
-		/**
-		 * The meta object literal for the '<em><b>Suppressed</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__SUPPRESSED = eINSTANCE
-				.getMethodElement_Suppressed();
-
-		/**
-		 * The meta object literal for the '<em><b>Ordering Guide</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__ORDERING_GUIDE = eINSTANCE
-				.getMethodElement_OrderingGuide();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ConstraintImpl <em>Constraint</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ConstraintImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getConstraint()
-		 * @generated
-		 */
-		EClass CONSTRAINT = eINSTANCE.getConstraint();
-
-		/**
-		 * The meta object literal for the '<em><b>Body</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONSTRAINT__BODY = eINSTANCE.getConstraint_Body();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MethodElementPropertyImpl <em>Method Element Property</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MethodElementPropertyImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodElementProperty()
-		 * @generated
-		 */
-		EClass METHOD_ELEMENT_PROPERTY = eINSTANCE.getMethodElementProperty();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT_PROPERTY__VALUE = eINSTANCE
-				.getMethodElementProperty_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ContentElementImpl <em>Content Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ContentElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentElement()
-		 * @generated
-		 */
-		EClass CONTENT_ELEMENT = eINSTANCE.getContentElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Supporting Materials</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_ELEMENT__SUPPORTING_MATERIALS = eINSTANCE
-				.getContentElement_SupportingMaterials();
-
-		/**
-		 * The meta object literal for the '<em><b>Concepts And Papers</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_ELEMENT__CONCEPTS_AND_PAPERS = eINSTANCE
-				.getContentElement_ConceptsAndPapers();
-
-		/**
-		 * The meta object literal for the '<em><b>Checklists</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_ELEMENT__CHECKLISTS = eINSTANCE
-				.getContentElement_Checklists();
-
-		/**
-		 * The meta object literal for the '<em><b>Guidelines</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_ELEMENT__GUIDELINES = eINSTANCE
-				.getContentElement_Guidelines();
-
-		/**
-		 * The meta object literal for the '<em><b>Examples</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_ELEMENT__EXAMPLES = eINSTANCE
-				.getContentElement_Examples();
-
-		/**
-		 * The meta object literal for the '<em><b>Assets</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_ELEMENT__ASSETS = eINSTANCE
-				.getContentElement_Assets();
-
-		/**
-		 * The meta object literal for the '<em><b>Term Definition</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_ELEMENT__TERM_DEFINITION = eINSTANCE
-				.getContentElement_TermDefinition();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DescribableElementImpl <em>Describable Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DescribableElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDescribableElement()
-		 * @generated
-		 */
-		EClass DESCRIBABLE_ELEMENT = eINSTANCE.getDescribableElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Presentation Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIBABLE_ELEMENT__PRESENTATION_NAME = eINSTANCE
-				.getDescribableElement_PresentationName();
-
-		/**
-		 * The meta object literal for the '<em><b>Presentation</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DESCRIBABLE_ELEMENT__PRESENTATION = eINSTANCE
-				.getDescribableElement_Presentation();
-
-		/**
-		 * The meta object literal for the '<em><b>Shapeicon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIBABLE_ELEMENT__SHAPEICON = eINSTANCE
-				.getDescribableElement_Shapeicon();
-
-		/**
-		 * The meta object literal for the '<em><b>Nodeicon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIBABLE_ELEMENT__NODEICON = eINSTANCE
-				.getDescribableElement_Nodeicon();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ContentDescriptionImpl <em>Content Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ContentDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentDescription()
-		 * @generated
-		 */
-		EClass CONTENT_DESCRIPTION = eINSTANCE.getContentDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Main Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_DESCRIPTION__MAIN_DESCRIPTION = eINSTANCE
-				.getContentDescription_MainDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Sections</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_DESCRIPTION__SECTIONS = eINSTANCE
-				.getContentDescription_Sections();
-
-		/**
-		 * The meta object literal for the '<em><b>External Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_DESCRIPTION__EXTERNAL_ID = eINSTANCE
-				.getContentDescription_ExternalId();
-
-		/**
-		 * The meta object literal for the '<em><b>Key Considerations</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_DESCRIPTION__KEY_CONSIDERATIONS = eINSTANCE
-				.getContentDescription_KeyConsiderations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.SectionImpl <em>Section</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.SectionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSection()
-		 * @generated
-		 */
-		EClass SECTION = eINSTANCE.getSection();
-
-		/**
-		 * The meta object literal for the '<em><b>Section Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION__SECTION_NAME = eINSTANCE.getSection_SectionName();
-
-		/**
-		 * The meta object literal for the '<em><b>Section Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION__SECTION_DESCRIPTION = eINSTANCE
-				.getSection_SectionDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Sections</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SECTION__SUB_SECTIONS = eINSTANCE.getSection_SubSections();
-
-		/**
-		 * The meta object literal for the '<em><b>Predecessor</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SECTION__PREDECESSOR = eINSTANCE.getSection_Predecessor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.RoleImpl <em>Role</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.RoleImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRole()
-		 * @generated
-		 */
-		EClass ROLE = eINSTANCE.getRole();
-
-		/**
-		 * The meta object literal for the '<em><b>Modifies</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ROLE__MODIFIES = eINSTANCE.getRole_Modifies();
-
-		/**
-		 * The meta object literal for the '<em><b>Responsible For</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ROLE__RESPONSIBLE_FOR = eINSTANCE.getRole_ResponsibleFor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WorkProductImpl <em>Work Product</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WorkProductImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProduct()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT = eINSTANCE.getWorkProduct();
-
-		/**
-		 * The meta object literal for the '<em><b>Reports</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT__REPORTS = eINSTANCE.getWorkProduct_Reports();
-
-		/**
-		 * The meta object literal for the '<em><b>Templates</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT__TEMPLATES = eINSTANCE
-				.getWorkProduct_Templates();
-
-		/**
-		 * The meta object literal for the '<em><b>Tool Mentors</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT__TOOL_MENTORS = eINSTANCE
-				.getWorkProduct_ToolMentors();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimation Considerations</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT__ESTIMATION_CONSIDERATIONS = eINSTANCE
-				.getWorkProduct_EstimationConsiderations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TaskImpl <em>Task</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TaskImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTask()
-		 * @generated
-		 */
-		EClass TASK = eINSTANCE.getTask();
-
-		/**
-		 * The meta object literal for the '<em><b>Performed By</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__PERFORMED_BY = eINSTANCE.getTask_PerformedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Mandatory Input</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__MANDATORY_INPUT = eINSTANCE.getTask_MandatoryInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Output</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__OUTPUT = eINSTANCE.getTask_Output();
-
-		/**
-		 * The meta object literal for the '<em><b>Additionally Performed By</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__ADDITIONALLY_PERFORMED_BY = eINSTANCE
-				.getTask_AdditionallyPerformedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Optional Input</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__OPTIONAL_INPUT = eINSTANCE.getTask_OptionalInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Steps</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__STEPS = eINSTANCE.getTask_Steps();
-
-		/**
-		 * The meta object literal for the '<em><b>Tool Mentors</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__TOOL_MENTORS = eINSTANCE.getTask_ToolMentors();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimation Considerations</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK__ESTIMATION_CONSIDERATIONS = eINSTANCE
-				.getTask_EstimationConsiderations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WorkDefinitionImpl <em>Work Definition</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WorkDefinitionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkDefinition()
-		 * @generated
-		 */
-		EClass WORK_DEFINITION = eINSTANCE.getWorkDefinition();
-
-		/**
-		 * The meta object literal for the '<em><b>Precondition</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_DEFINITION__PRECONDITION = eINSTANCE
-				.getWorkDefinition_Precondition();
-
-		/**
-		 * The meta object literal for the '<em><b>Postcondition</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_DEFINITION__POSTCONDITION = eINSTANCE
-				.getWorkDefinition_Postcondition();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.StepImpl <em>Step</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.StepImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getStep()
-		 * @generated
-		 */
-		EClass STEP = eINSTANCE.getStep();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GuidanceImpl <em>Guidance</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GuidanceImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGuidance()
-		 * @generated
-		 */
-		EClass GUIDANCE = eINSTANCE.getGuidance();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ArtifactImpl <em>Artifact</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ArtifactImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getArtifact()
-		 * @generated
-		 */
-		EClass ARTIFACT = eINSTANCE.getArtifact();
-
-		/**
-		 * The meta object literal for the '<em><b>Container Artifact</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ARTIFACT__CONTAINER_ARTIFACT = eINSTANCE
-				.getArtifact_ContainerArtifact();
-
-		/**
-		 * The meta object literal for the '<em><b>Contained Artifacts</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ARTIFACT__CONTAINED_ARTIFACTS = eINSTANCE
-				.getArtifact_ContainedArtifacts();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DeliverableImpl <em>Deliverable</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DeliverableImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliverable()
-		 * @generated
-		 */
-		EClass DELIVERABLE = eINSTANCE.getDeliverable();
-
-		/**
-		 * The meta object literal for the '<em><b>Delivered Work Products</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DELIVERABLE__DELIVERED_WORK_PRODUCTS = eINSTANCE
-				.getDeliverable_DeliveredWorkProducts();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.OutcomeImpl <em>Outcome</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.OutcomeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getOutcome()
-		 * @generated
-		 */
-		EClass OUTCOME = eINSTANCE.getOutcome();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MethodPackageImpl <em>Method Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MethodPackageImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodPackage()
-		 * @generated
-		 */
-		EClass METHOD_PACKAGE = eINSTANCE.getMethodPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Global</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_PACKAGE__GLOBAL = eINSTANCE.getMethodPackage_Global();
-
-		/**
-		 * The meta object literal for the '<em><b>Reused Packages</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_PACKAGE__REUSED_PACKAGES = eINSTANCE
-				.getMethodPackage_ReusedPackages();
-
-		/**
-		 * The meta object literal for the '<em><b>Child Packages</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_PACKAGE__CHILD_PACKAGES = eINSTANCE
-				.getMethodPackage_ChildPackages();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ContentPackageImpl <em>Content Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ContentPackageImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentPackage()
-		 * @generated
-		 */
-		EClass CONTENT_PACKAGE = eINSTANCE.getContentPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Content Elements</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_PACKAGE__CONTENT_ELEMENTS = eINSTANCE
-				.getContentPackage_ContentElements();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ArtifactDescriptionImpl <em>Artifact Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ArtifactDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getArtifactDescription()
-		 * @generated
-		 */
-		EClass ARTIFACT_DESCRIPTION = eINSTANCE.getArtifactDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Brief Outline</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__BRIEF_OUTLINE = eINSTANCE
-				.getArtifactDescription_BriefOutline();
-
-		/**
-		 * The meta object literal for the '<em><b>Representation Options</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS = eINSTANCE
-				.getArtifactDescription_RepresentationOptions();
-
-		/**
-		 * The meta object literal for the '<em><b>Representation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__REPRESENTATION = eINSTANCE
-				.getArtifactDescription_Representation();
-
-		/**
-		 * The meta object literal for the '<em><b>Notation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__NOTATION = eINSTANCE
-				.getArtifactDescription_Notation();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WorkProductDescriptionImpl <em>Work Product Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WorkProductDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProductDescription()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_DESCRIPTION = eINSTANCE.getWorkProductDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Purpose</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTION__PURPOSE = eINSTANCE
-				.getWorkProductDescription_Purpose();
-
-		/**
-		 * The meta object literal for the '<em><b>Impact Of Not Having</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING = eINSTANCE
-				.getWorkProductDescription_ImpactOfNotHaving();
-
-		/**
-		 * The meta object literal for the '<em><b>Reasons For Not Needing</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING = eINSTANCE
-				.getWorkProductDescription_ReasonsForNotNeeding();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DeliverableDescriptionImpl <em>Deliverable Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DeliverableDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliverableDescription()
-		 * @generated
-		 */
-		EClass DELIVERABLE_DESCRIPTION = eINSTANCE.getDeliverableDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>External Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION = eINSTANCE
-				.getDeliverableDescription_ExternalDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Packaging Guidance</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE = eINSTANCE
-				.getDeliverableDescription_PackagingGuidance();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.RoleDescriptionImpl <em>Role Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.RoleDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleDescription()
-		 * @generated
-		 */
-		EClass ROLE_DESCRIPTION = eINSTANCE.getRoleDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Skills</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTION__SKILLS = eINSTANCE
-				.getRoleDescription_Skills();
-
-		/**
-		 * The meta object literal for the '<em><b>Assignment Approaches</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES = eINSTANCE
-				.getRoleDescription_AssignmentApproaches();
-
-		/**
-		 * The meta object literal for the '<em><b>Synonyms</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTION__SYNONYMS = eINSTANCE
-				.getRoleDescription_Synonyms();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TaskDescriptionImpl <em>Task Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TaskDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTaskDescription()
-		 * @generated
-		 */
-		EClass TASK_DESCRIPTION = eINSTANCE.getTaskDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Purpose</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTION__PURPOSE = eINSTANCE
-				.getTaskDescription_Purpose();
-
-		/**
-		 * The meta object literal for the '<em><b>Alternatives</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTION__ALTERNATIVES = eINSTANCE
-				.getTaskDescription_Alternatives();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GuidanceDescriptionImpl <em>Guidance Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GuidanceDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGuidanceDescription()
-		 * @generated
-		 */
-		EClass GUIDANCE_DESCRIPTION = eINSTANCE.getGuidanceDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Attachments</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GUIDANCE_DESCRIPTION__ATTACHMENTS = eINSTANCE
-				.getGuidanceDescription_Attachments();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl <em>Practice Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PracticeDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPracticeDescription()
-		 * @generated
-		 */
-		EClass PRACTICE_DESCRIPTION = eINSTANCE.getPracticeDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Additional Info</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__ADDITIONAL_INFO = eINSTANCE
-				.getPracticeDescription_AdditionalInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Problem</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__PROBLEM = eINSTANCE
-				.getPracticeDescription_Problem();
-
-		/**
-		 * The meta object literal for the '<em><b>Background</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__BACKGROUND = eINSTANCE
-				.getPracticeDescription_Background();
-
-		/**
-		 * The meta object literal for the '<em><b>Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__GOALS = eINSTANCE
-				.getPracticeDescription_Goals();
-
-		/**
-		 * The meta object literal for the '<em><b>Application</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__APPLICATION = eINSTANCE
-				.getPracticeDescription_Application();
-
-		/**
-		 * The meta object literal for the '<em><b>Levels Of Adoption</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION = eINSTANCE
-				.getPracticeDescription_LevelsOfAdoption();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PointImpl <em>Point</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PointImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPoint()
-		 * @generated
-		 */
-		EClass POINT = eINSTANCE.getPoint();
-
-		/**
-		 * The meta object literal for the '<em><b>X</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute POINT__X = eINSTANCE.getPoint_X();
-
-		/**
-		 * The meta object literal for the '<em><b>Y</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute POINT__Y = eINSTANCE.getPoint_Y();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GraphElementImpl <em>Graph Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GraphElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphElement()
-		 * @generated
-		 */
-		EClass GRAPH_ELEMENT = eINSTANCE.getGraphElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Position</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_ELEMENT__POSITION = eINSTANCE
-				.getGraphElement_Position();
-
-		/**
-		 * The meta object literal for the '<em><b>Contained</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_ELEMENT__CONTAINED = eINSTANCE
-				.getGraphElement_Contained();
-
-		/**
-		 * The meta object literal for the '<em><b>Link</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_ELEMENT__LINK = eINSTANCE.getGraphElement_Link();
-
-		/**
-		 * The meta object literal for the '<em><b>Anchorage</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_ELEMENT__ANCHORAGE = eINSTANCE
-				.getGraphElement_Anchorage();
-
-		/**
-		 * The meta object literal for the '<em><b>Semantic Model</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_ELEMENT__SEMANTIC_MODEL = eINSTANCE
-				.getGraphElement_SemanticModel();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DiagramElementImpl <em>Diagram Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DiagramElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiagramElement()
-		 * @generated
-		 */
-		EClass DIAGRAM_ELEMENT = eINSTANCE.getDiagramElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Visible</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DIAGRAM_ELEMENT__IS_VISIBLE = eINSTANCE
-				.getDiagramElement_IsVisible();
-
-		/**
-		 * The meta object literal for the '<em><b>Container</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM_ELEMENT__CONTAINER = eINSTANCE
-				.getDiagramElement_Container();
-
-		/**
-		 * The meta object literal for the '<em><b>Reference</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM_ELEMENT__REFERENCE = eINSTANCE
-				.getDiagramElement_Reference();
-
-		/**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM_ELEMENT__PROPERTY = eINSTANCE
-				.getDiagramElement_Property();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DiagramLinkImpl <em>Diagram Link</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DiagramLinkImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiagramLink()
-		 * @generated
-		 */
-		EClass DIAGRAM_LINK = eINSTANCE.getDiagramLink();
-
-		/**
-		 * The meta object literal for the '<em><b>Zoom</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DIAGRAM_LINK__ZOOM = eINSTANCE.getDiagramLink_Zoom();
-
-		/**
-		 * The meta object literal for the '<em><b>Viewport</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM_LINK__VIEWPORT = eINSTANCE.getDiagramLink_Viewport();
-
-		/**
-		 * The meta object literal for the '<em><b>Graph Element</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM_LINK__GRAPH_ELEMENT = eINSTANCE
-				.getDiagramLink_GraphElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Diagram</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM_LINK__DIAGRAM = eINSTANCE.getDiagramLink_Diagram();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GraphConnectorImpl <em>Graph Connector</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GraphConnectorImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphConnector()
-		 * @generated
-		 */
-		EClass GRAPH_CONNECTOR = eINSTANCE.getGraphConnector();
-
-		/**
-		 * The meta object literal for the '<em><b>Graph Element</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_CONNECTOR__GRAPH_ELEMENT = eINSTANCE
-				.getGraphConnector_GraphElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Graph Edge</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_CONNECTOR__GRAPH_EDGE = eINSTANCE
-				.getGraphConnector_GraphEdge();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.SemanticModelBridgeImpl <em>Semantic Model Bridge</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.SemanticModelBridgeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSemanticModelBridge()
-		 * @generated
-		 */
-		EClass SEMANTIC_MODEL_BRIDGE = eINSTANCE.getSemanticModelBridge();
-
-		/**
-		 * The meta object literal for the '<em><b>Presentation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SEMANTIC_MODEL_BRIDGE__PRESENTATION = eINSTANCE
-				.getSemanticModelBridge_Presentation();
-
-		/**
-		 * The meta object literal for the '<em><b>Graph Element</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT = eINSTANCE
-				.getSemanticModelBridge_GraphElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Diagram</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SEMANTIC_MODEL_BRIDGE__DIAGRAM = eINSTANCE
-				.getSemanticModelBridge_Diagram();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DimensionImpl <em>Dimension</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DimensionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDimension()
-		 * @generated
-		 */
-		EClass DIMENSION = eINSTANCE.getDimension();
-
-		/**
-		 * The meta object literal for the '<em><b>Width</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DIMENSION__WIDTH = eINSTANCE.getDimension_Width();
-
-		/**
-		 * The meta object literal for the '<em><b>Height</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DIMENSION__HEIGHT = eINSTANCE.getDimension_Height();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ReferenceImpl <em>Reference</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ReferenceImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getReference()
-		 * @generated
-		 */
-		EClass REFERENCE = eINSTANCE.getReference();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Individual Representation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute REFERENCE__IS_INDIVIDUAL_REPRESENTATION = eINSTANCE
-				.getReference_IsIndividualRepresentation();
-
-		/**
-		 * The meta object literal for the '<em><b>Referenced</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REFERENCE__REFERENCED = eINSTANCE.getReference_Referenced();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PropertyImpl <em>Property</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PropertyImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProperty()
-		 * @generated
-		 */
-		EClass PROPERTY = eINSTANCE.getProperty();
-
-		/**
-		 * The meta object literal for the '<em><b>Key</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROPERTY__KEY = eINSTANCE.getProperty_Key();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROPERTY__VALUE = eINSTANCE.getProperty_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GraphEdgeImpl <em>Graph Edge</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GraphEdgeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphEdge()
-		 * @generated
-		 */
-		EClass GRAPH_EDGE = eINSTANCE.getGraphEdge();
-
-		/**
-		 * The meta object literal for the '<em><b>Anchor</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_EDGE__ANCHOR = eINSTANCE.getGraphEdge_Anchor();
-
-		/**
-		 * The meta object literal for the '<em><b>Waypoints</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_EDGE__WAYPOINTS = eINSTANCE.getGraphEdge_Waypoints();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DiagramImpl <em>Diagram</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DiagramImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiagram()
-		 * @generated
-		 */
-		EClass DIAGRAM = eINSTANCE.getDiagram();
-
-		/**
-		 * The meta object literal for the '<em><b>Zoom</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DIAGRAM__ZOOM = eINSTANCE.getDiagram_Zoom();
-
-		/**
-		 * The meta object literal for the '<em><b>Viewpoint</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM__VIEWPOINT = eINSTANCE.getDiagram_Viewpoint();
-
-		/**
-		 * The meta object literal for the '<em><b>Diagram Link</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM__DIAGRAM_LINK = eINSTANCE.getDiagram_DiagramLink();
-
-		/**
-		 * The meta object literal for the '<em><b>Namespace</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DIAGRAM__NAMESPACE = eINSTANCE.getDiagram_Namespace();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GraphNodeImpl <em>Graph Node</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GraphNodeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphNode()
-		 * @generated
-		 */
-		EClass GRAPH_NODE = eINSTANCE.getGraphNode();
-
-		/**
-		 * The meta object literal for the '<em><b>Size</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference GRAPH_NODE__SIZE = eINSTANCE.getGraphNode_Size();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.SimpleSemanticModelElementImpl <em>Simple Semantic Model Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.SimpleSemanticModelElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSimpleSemanticModelElement()
-		 * @generated
-		 */
-		EClass SIMPLE_SEMANTIC_MODEL_ELEMENT = eINSTANCE
-				.getSimpleSemanticModelElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Type Info</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO = eINSTANCE
-				.getSimpleSemanticModelElement_TypeInfo();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.UMASemanticModelBridgeImpl <em>UMA Semantic Model Bridge</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.UMASemanticModelBridgeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getUMASemanticModelBridge()
-		 * @generated
-		 */
-		EClass UMA_SEMANTIC_MODEL_BRIDGE = eINSTANCE
-				.getUMASemanticModelBridge();
-
-		/**
-		 * The meta object literal for the '<em><b>Element</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT = eINSTANCE
-				.getUMASemanticModelBridge_Element();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.CoreSemanticModelBridgeImpl <em>Core Semantic Model Bridge</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.CoreSemanticModelBridgeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCoreSemanticModelBridge()
-		 * @generated
-		 */
-		EClass CORE_SEMANTIC_MODEL_BRIDGE = eINSTANCE
-				.getCoreSemanticModelBridge();
-
-		/**
-		 * The meta object literal for the '<em><b>Element</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT = eINSTANCE
-				.getCoreSemanticModelBridge_Element();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.LeafElementImpl <em>Leaf Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.LeafElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getLeafElement()
-		 * @generated
-		 */
-		EClass LEAF_ELEMENT = eINSTANCE.getLeafElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TextElementImpl <em>Text Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TextElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTextElement()
-		 * @generated
-		 */
-		EClass TEXT_ELEMENT = eINSTANCE.getTextElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Text</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TEXT_ELEMENT__TEXT = eINSTANCE.getTextElement_Text();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ImageImpl <em>Image</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ImageImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getImage()
-		 * @generated
-		 */
-		EClass IMAGE = eINSTANCE.getImage();
-
-		/**
-		 * The meta object literal for the '<em><b>Uri</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute IMAGE__URI = eINSTANCE.getImage_Uri();
-
-		/**
-		 * The meta object literal for the '<em><b>Mime Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute IMAGE__MIME_TYPE = eINSTANCE.getImage_MimeType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GraphicPrimitiveImpl <em>Graphic Primitive</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GraphicPrimitiveImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGraphicPrimitive()
-		 * @generated
-		 */
-		EClass GRAPHIC_PRIMITIVE = eINSTANCE.getGraphicPrimitive();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PolylineImpl <em>Polyline</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PolylineImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPolyline()
-		 * @generated
-		 */
-		EClass POLYLINE = eINSTANCE.getPolyline();
-
-		/**
-		 * The meta object literal for the '<em><b>Closed</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute POLYLINE__CLOSED = eINSTANCE.getPolyline_Closed();
-
-		/**
-		 * The meta object literal for the '<em><b>Waypoints</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference POLYLINE__WAYPOINTS = eINSTANCE.getPolyline_Waypoints();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.EllipseImpl <em>Ellipse</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.EllipseImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getEllipse()
-		 * @generated
-		 */
-		EClass ELLIPSE = eINSTANCE.getEllipse();
-
-		/**
-		 * The meta object literal for the '<em><b>Radius X</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ELLIPSE__RADIUS_X = eINSTANCE.getEllipse_RadiusX();
-
-		/**
-		 * The meta object literal for the '<em><b>Radius Y</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ELLIPSE__RADIUS_Y = eINSTANCE.getEllipse_RadiusY();
-
-		/**
-		 * The meta object literal for the '<em><b>Rotation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ELLIPSE__ROTATION = eINSTANCE.getEllipse_Rotation();
-
-		/**
-		 * The meta object literal for the '<em><b>Start Angle</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ELLIPSE__START_ANGLE = eINSTANCE.getEllipse_StartAngle();
-
-		/**
-		 * The meta object literal for the '<em><b>End Angle</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ELLIPSE__END_ANGLE = eINSTANCE.getEllipse_EndAngle();
-
-		/**
-		 * The meta object literal for the '<em><b>Center</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ELLIPSE__CENTER = eINSTANCE.getEllipse_Center();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ActivityImpl <em>Activity</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ActivityImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getActivity()
-		 * @generated
-		 */
-		EClass ACTIVITY = eINSTANCE.getActivity();
-
-		/**
-		 * The meta object literal for the '<em><b>Breakdown Elements</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__BREAKDOWN_ELEMENTS = eINSTANCE
-				.getActivity_BreakdownElements();
-
-		/**
-		 * The meta object literal for the '<em><b>Roadmaps</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__ROADMAPS = eINSTANCE.getActivity_Roadmaps();
-
-		/**
-		 * The meta object literal for the '<em><b>Supporting Materials</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__SUPPORTING_MATERIALS = eINSTANCE
-				.getActivity_SupportingMaterials();
-
-		/**
-		 * The meta object literal for the '<em><b>Checklists</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__CHECKLISTS = eINSTANCE.getActivity_Checklists();
-
-		/**
-		 * The meta object literal for the '<em><b>Concepts</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__CONCEPTS = eINSTANCE.getActivity_Concepts();
-
-		/**
-		 * The meta object literal for the '<em><b>Examples</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__EXAMPLES = eINSTANCE.getActivity_Examples();
-
-		/**
-		 * The meta object literal for the '<em><b>Guidelines</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__GUIDELINES = eINSTANCE.getActivity_Guidelines();
-
-		/**
-		 * The meta object literal for the '<em><b>Reusable Assets</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__REUSABLE_ASSETS = eINSTANCE
-				.getActivity_ReusableAssets();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Enactable</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__IS_ENACTABLE = eINSTANCE.getActivity_IsEnactable();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WorkBreakdownElementImpl <em>Work Breakdown Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WorkBreakdownElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkBreakdownElement()
-		 * @generated
-		 */
-		EClass WORK_BREAKDOWN_ELEMENT = eINSTANCE.getWorkBreakdownElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Repeatable</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE = eINSTANCE
-				.getWorkBreakdownElement_IsRepeatable();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Ongoing</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_BREAKDOWN_ELEMENT__IS_ONGOING = eINSTANCE
-				.getWorkBreakdownElement_IsOngoing();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Event Driven</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN = eINSTANCE
-				.getWorkBreakdownElement_IsEventDriven();
-
-		/**
-		 * The meta object literal for the '<em><b>Link To Predecessor</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR = eINSTANCE
-				.getWorkBreakdownElement_LinkToPredecessor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.BreakdownElementImpl <em>Breakdown Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.BreakdownElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getBreakdownElement()
-		 * @generated
-		 */
-		EClass BREAKDOWN_ELEMENT = eINSTANCE.getBreakdownElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Prefix</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__PREFIX = eINSTANCE
-				.getBreakdownElement_Prefix();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Planned</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__IS_PLANNED = eINSTANCE
-				.getBreakdownElement_IsPlanned();
-
-		/**
-		 * The meta object literal for the '<em><b>Has Multiple Occurrences</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES = eINSTANCE
-				.getBreakdownElement_HasMultipleOccurrences();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Optional</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__IS_OPTIONAL = eINSTANCE
-				.getBreakdownElement_IsOptional();
-
-		/**
-		 * The meta object literal for the '<em><b>Presented After</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BREAKDOWN_ELEMENT__PRESENTED_AFTER = eINSTANCE
-				.getBreakdownElement_PresentedAfter();
-
-		/**
-		 * The meta object literal for the '<em><b>Presented Before</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BREAKDOWN_ELEMENT__PRESENTED_BEFORE = eINSTANCE
-				.getBreakdownElement_PresentedBefore();
-
-		/**
-		 * The meta object literal for the '<em><b>Planning Data</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BREAKDOWN_ELEMENT__PLANNING_DATA = eINSTANCE
-				.getBreakdownElement_PlanningData();
-
-		/**
-		 * The meta object literal for the '<em><b>Super Activities</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BREAKDOWN_ELEMENT__SUPER_ACTIVITIES = eINSTANCE
-				.getBreakdownElement_SuperActivities();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MilestoneImpl <em>Milestone</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MilestoneImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMilestone()
-		 * @generated
-		 */
-		EClass MILESTONE = eINSTANCE.getMilestone();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.IterationImpl <em>Iteration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.IterationImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getIteration()
-		 * @generated
-		 */
-		EClass ITERATION = eINSTANCE.getIteration();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PhaseImpl <em>Phase</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PhaseImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPhase()
-		 * @generated
-		 */
-		EClass PHASE = eINSTANCE.getPhase();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TeamProfileImpl <em>Team Profile</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TeamProfileImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTeamProfile()
-		 * @generated
-		 */
-		EClass TEAM_PROFILE = eINSTANCE.getTeamProfile();
-
-		/**
-		 * The meta object literal for the '<em><b>Team Roles</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TEAM_PROFILE__TEAM_ROLES = eINSTANCE
-				.getTeamProfile_TeamRoles();
-
-		/**
-		 * The meta object literal for the '<em><b>Super Team</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TEAM_PROFILE__SUPER_TEAM = eINSTANCE
-				.getTeamProfile_SuperTeam();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Team</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TEAM_PROFILE__SUB_TEAM = eINSTANCE.getTeamProfile_SubTeam();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.RoleDescriptorImpl <em>Role Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.RoleDescriptorImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleDescriptor()
-		 * @generated
-		 */
-		EClass ROLE_DESCRIPTOR = eINSTANCE.getRoleDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Role</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ROLE_DESCRIPTOR__ROLE = eINSTANCE.getRoleDescriptor_Role();
-
-		/**
-		 * The meta object literal for the '<em><b>Modifies</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ROLE_DESCRIPTOR__MODIFIES = eINSTANCE
-				.getRoleDescriptor_Modifies();
-
-		/**
-		 * The meta object literal for the '<em><b>Responsible For</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ROLE_DESCRIPTOR__RESPONSIBLE_FOR = eINSTANCE
-				.getRoleDescriptor_ResponsibleFor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WorkOrderImpl <em>Work Order</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WorkOrderImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkOrder()
-		 * @generated
-		 */
-		EClass WORK_ORDER = eINSTANCE.getWorkOrder();
-
-		/**
-		 * The meta object literal for the '<em><b>Link Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_ORDER__LINK_TYPE = eINSTANCE.getWorkOrder_LinkType();
-
-		/**
-		 * The meta object literal for the '<em><b>Pred</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_ORDER__PRED = eINSTANCE.getWorkOrder_Pred();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessElementImpl <em>Process Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessElement()
-		 * @generated
-		 */
-		EClass PROCESS_ELEMENT = eINSTANCE.getProcessElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PlanningDataImpl <em>Planning Data</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PlanningDataImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPlanningData()
-		 * @generated
-		 */
-		EClass PLANNING_DATA = eINSTANCE.getPlanningData();
-
-		/**
-		 * The meta object literal for the '<em><b>Start Date</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLANNING_DATA__START_DATE = eINSTANCE
-				.getPlanningData_StartDate();
-
-		/**
-		 * The meta object literal for the '<em><b>Finish Date</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLANNING_DATA__FINISH_DATE = eINSTANCE
-				.getPlanningData_FinishDate();
-
-		/**
-		 * The meta object literal for the '<em><b>Rank</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLANNING_DATA__RANK = eINSTANCE.getPlanningData_Rank();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DescriptorImpl <em>Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DescriptorImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDescriptor()
-		 * @generated
-		 */
-		EClass DESCRIPTOR = eINSTANCE.getDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Synchronized With Source</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = eINSTANCE
-				.getDescriptor_IsSynchronizedWithSource();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl <em>Task Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TaskDescriptorImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTaskDescriptor()
-		 * @generated
-		 */
-		EClass TASK_DESCRIPTOR = eINSTANCE.getTaskDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Task</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__TASK = eINSTANCE.getTaskDescriptor_Task();
-
-		/**
-		 * The meta object literal for the '<em><b>Additionally Performed By</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY = eINSTANCE
-				.getTaskDescriptor_AdditionallyPerformedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Assisted By</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__ASSISTED_BY = eINSTANCE
-				.getTaskDescriptor_AssistedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>External Input</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__EXTERNAL_INPUT = eINSTANCE
-				.getTaskDescriptor_ExternalInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Mandatory Input</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__MANDATORY_INPUT = eINSTANCE
-				.getTaskDescriptor_MandatoryInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Optional Input</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__OPTIONAL_INPUT = eINSTANCE
-				.getTaskDescriptor_OptionalInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Output</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__OUTPUT = eINSTANCE
-				.getTaskDescriptor_Output();
-
-		/**
-		 * The meta object literal for the '<em><b>Performed Primarily By</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY = eINSTANCE
-				.getTaskDescriptor_PerformedPrimarilyBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Selected Steps</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__SELECTED_STEPS = eINSTANCE
-				.getTaskDescriptor_SelectedSteps();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl <em>Work Product Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WorkProductDescriptorImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProductDescriptor()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_DESCRIPTOR = eINSTANCE.getWorkProductDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Activity Entry State</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE = eINSTANCE
-				.getWorkProductDescriptor_ActivityEntryState();
-
-		/**
-		 * The meta object literal for the '<em><b>Activity Exit State</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE = eINSTANCE
-				.getWorkProductDescriptor_ActivityExitState();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Product</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT = eINSTANCE
-				.getWorkProductDescriptor_WorkProduct();
-
-		/**
-		 * The meta object literal for the '<em><b>Impacted By</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY = eINSTANCE
-				.getWorkProductDescriptor_ImpactedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Impacts</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT_DESCRIPTOR__IMPACTS = eINSTANCE
-				.getWorkProductDescriptor_Impacts();
-
-		/**
-		 * The meta object literal for the '<em><b>Deliverable Parts</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS = eINSTANCE
-				.getWorkProductDescriptor_DeliverableParts();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.CompositeRoleImpl <em>Composite Role</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.CompositeRoleImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCompositeRole()
-		 * @generated
-		 */
-		EClass COMPOSITE_ROLE = eINSTANCE.getCompositeRole();
-
-		/**
-		 * The meta object literal for the '<em><b>Aggregated Roles</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference COMPOSITE_ROLE__AGGREGATED_ROLES = eINSTANCE
-				.getCompositeRole_AggregatedRoles();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.BreakdownElementDescriptionImpl <em>Breakdown Element Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.BreakdownElementDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getBreakdownElementDescription()
-		 * @generated
-		 */
-		EClass BREAKDOWN_ELEMENT_DESCRIPTION = eINSTANCE
-				.getBreakdownElementDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Usage Guidance</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE = eINSTANCE
-				.getBreakdownElementDescription_UsageGuidance();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ActivityDescriptionImpl <em>Activity Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ActivityDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getActivityDescription()
-		 * @generated
-		 */
-		EClass ACTIVITY_DESCRIPTION = eINSTANCE.getActivityDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Purpose</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY_DESCRIPTION__PURPOSE = eINSTANCE
-				.getActivityDescription_Purpose();
-
-		/**
-		 * The meta object literal for the '<em><b>Alternatives</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY_DESCRIPTION__ALTERNATIVES = eINSTANCE
-				.getActivityDescription_Alternatives();
-
-		/**
-		 * The meta object literal for the '<em><b>Howto Staff</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY_DESCRIPTION__HOWTO_STAFF = eINSTANCE
-				.getActivityDescription_HowtoStaff();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl <em>Delivery Process Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliveryProcessDescription()
-		 * @generated
-		 */
-		EClass DELIVERY_PROCESS_DESCRIPTION = eINSTANCE
-				.getDeliveryProcessDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Scale</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__SCALE = eINSTANCE
-				.getDeliveryProcessDescription_Scale();
-
-		/**
-		 * The meta object literal for the '<em><b>Project Characteristics</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS = eINSTANCE
-				.getDeliveryProcessDescription_ProjectCharacteristics();
-
-		/**
-		 * The meta object literal for the '<em><b>Risk Level</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL = eINSTANCE
-				.getDeliveryProcessDescription_RiskLevel();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimating Technique</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE = eINSTANCE
-				.getDeliveryProcessDescription_EstimatingTechnique();
-
-		/**
-		 * The meta object literal for the '<em><b>Project Member Expertise</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE = eINSTANCE
-				.getDeliveryProcessDescription_ProjectMemberExpertise();
-
-		/**
-		 * The meta object literal for the '<em><b>Type Of Contract</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT = eINSTANCE
-				.getDeliveryProcessDescription_TypeOfContract();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessDescriptionImpl <em>Process Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessDescription()
-		 * @generated
-		 */
-		EClass PROCESS_DESCRIPTION = eINSTANCE.getProcessDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Scope</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_DESCRIPTION__SCOPE = eINSTANCE
-				.getProcessDescription_Scope();
-
-		/**
-		 * The meta object literal for the '<em><b>Usage Notes</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_DESCRIPTION__USAGE_NOTES = eINSTANCE
-				.getProcessDescription_UsageNotes();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DescriptorDescriptionImpl <em>Descriptor Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DescriptorDescriptionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDescriptorDescription()
-		 * @generated
-		 */
-		EClass DESCRIPTOR_DESCRIPTION = eINSTANCE.getDescriptorDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Refined Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION = eINSTANCE
-				.getDescriptorDescription_RefinedDescription();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ConceptImpl <em>Concept</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ConceptImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getConcept()
-		 * @generated
-		 */
-		EClass CONCEPT = eINSTANCE.getConcept();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ChecklistImpl <em>Checklist</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ChecklistImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getChecklist()
-		 * @generated
-		 */
-		EClass CHECKLIST = eINSTANCE.getChecklist();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ExampleImpl <em>Example</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ExampleImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getExample()
-		 * @generated
-		 */
-		EClass EXAMPLE = eINSTANCE.getExample();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.GuidelineImpl <em>Guideline</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.GuidelineImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getGuideline()
-		 * @generated
-		 */
-		EClass GUIDELINE = eINSTANCE.getGuideline();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.EstimationConsiderationsImpl <em>Estimation Considerations</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.EstimationConsiderationsImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getEstimationConsiderations()
-		 * @generated
-		 */
-		EClass ESTIMATION_CONSIDERATIONS = eINSTANCE
-				.getEstimationConsiderations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ReportImpl <em>Report</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ReportImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getReport()
-		 * @generated
-		 */
-		EClass REPORT = eINSTANCE.getReport();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TemplateImpl <em>Template</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TemplateImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTemplate()
-		 * @generated
-		 */
-		EClass TEMPLATE = eINSTANCE.getTemplate();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.SupportingMaterialImpl <em>Supporting Material</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.SupportingMaterialImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSupportingMaterial()
-		 * @generated
-		 */
-		EClass SUPPORTING_MATERIAL = eINSTANCE.getSupportingMaterial();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ToolMentorImpl <em>Tool Mentor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ToolMentorImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getToolMentor()
-		 * @generated
-		 */
-		EClass TOOL_MENTOR = eINSTANCE.getToolMentor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WhitepaperImpl <em>Whitepaper</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WhitepaperImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWhitepaper()
-		 * @generated
-		 */
-		EClass WHITEPAPER = eINSTANCE.getWhitepaper();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TermDefinitionImpl <em>Term Definition</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TermDefinitionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTermDefinition()
-		 * @generated
-		 */
-		EClass TERM_DEFINITION = eINSTANCE.getTermDefinition();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PracticeImpl <em>Practice</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PracticeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPractice()
-		 * @generated
-		 */
-		EClass PRACTICE = eINSTANCE.getPractice();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Practices</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PRACTICE__SUB_PRACTICES = eINSTANCE
-				.getPractice_SubPractices();
-
-		/**
-		 * The meta object literal for the '<em><b>Content References</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PRACTICE__CONTENT_REFERENCES = eINSTANCE
-				.getPractice_ContentReferences();
-
-		/**
-		 * The meta object literal for the '<em><b>Activity References</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PRACTICE__ACTIVITY_REFERENCES = eINSTANCE
-				.getPractice_ActivityReferences();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ReusableAssetImpl <em>Reusable Asset</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ReusableAssetImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getReusableAsset()
-		 * @generated
-		 */
-		EClass REUSABLE_ASSET = eINSTANCE.getReusableAsset();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.StateImpl <em>State</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.StateImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getState()
-		 * @generated
-		 */
-		EClass STATE = eINSTANCE.getState();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Product</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference STATE__WORK_PRODUCT = eINSTANCE.getState_WorkProduct();
-
-		/**
-		 * The meta object literal for the '<em><b>Region</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference STATE__REGION = eINSTANCE.getState_Region();
-
-		/**
-		 * The meta object literal for the '<em><b>Submachine</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference STATE__SUBMACHINE = eINSTANCE.getState_Submachine();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.VertexImpl <em>Vertex</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.VertexImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getVertex()
-		 * @generated
-		 */
-		EClass VERTEX = eINSTANCE.getVertex();
-
-		/**
-		 * The meta object literal for the '<em><b>Container</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference VERTEX__CONTAINER = eINSTANCE.getVertex_Container();
-
-		/**
-		 * The meta object literal for the '<em><b>Outgoing</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference VERTEX__OUTGOING = eINSTANCE.getVertex_Outgoing();
-
-		/**
-		 * The meta object literal for the '<em><b>Incoming</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference VERTEX__INCOMING = eINSTANCE.getVertex_Incoming();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.RegionImpl <em>Region</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.RegionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRegion()
-		 * @generated
-		 */
-		EClass REGION = eINSTANCE.getRegion();
-
-		/**
-		 * The meta object literal for the '<em><b>Vertex</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REGION__VERTEX = eINSTANCE.getRegion_Vertex();
-
-		/**
-		 * The meta object literal for the '<em><b>Transition</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REGION__TRANSITION = eINSTANCE.getRegion_Transition();
-
-		/**
-		 * The meta object literal for the '<em><b>State</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REGION__STATE = eINSTANCE.getRegion_State();
-
-		/**
-		 * The meta object literal for the '<em><b>State Machine</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REGION__STATE_MACHINE = eINSTANCE.getRegion_StateMachine();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.StateMachineImpl <em>State Machine</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.StateMachineImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getStateMachine()
-		 * @generated
-		 */
-		EClass STATE_MACHINE = eINSTANCE.getStateMachine();
-
-		/**
-		 * The meta object literal for the '<em><b>Region</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference STATE_MACHINE__REGION = eINSTANCE.getStateMachine_Region();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.TransitionImpl <em>Transition</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.TransitionImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTransition()
-		 * @generated
-		 */
-		EClass TRANSITION = eINSTANCE.getTransition();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Definition</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TRANSITION__WORK_DEFINITION = eINSTANCE
-				.getTransition_WorkDefinition();
-
-		/**
-		 * The meta object literal for the '<em><b>Container</b></em>' container reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TRANSITION__CONTAINER = eINSTANCE.getTransition_Container();
-
-		/**
-		 * The meta object literal for the '<em><b>Source</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TRANSITION__SOURCE = eINSTANCE.getTransition_Source();
-
-		/**
-		 * The meta object literal for the '<em><b>Target</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TRANSITION__TARGET = eINSTANCE.getTransition_Target();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.PseudoStateImpl <em>Pseudo State</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.PseudoStateImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPseudoState()
-		 * @generated
-		 */
-		EClass PSEUDO_STATE = eINSTANCE.getPseudoState();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DisciplineImpl <em>Discipline</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DisciplineImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDiscipline()
-		 * @generated
-		 */
-		EClass DISCIPLINE = eINSTANCE.getDiscipline();
-
-		/**
-		 * The meta object literal for the '<em><b>Tasks</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DISCIPLINE__TASKS = eINSTANCE.getDiscipline_Tasks();
-
-		/**
-		 * The meta object literal for the '<em><b>Subdiscipline</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DISCIPLINE__SUBDISCIPLINE = eINSTANCE
-				.getDiscipline_Subdiscipline();
-
-		/**
-		 * The meta object literal for the '<em><b>Reference Workflows</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DISCIPLINE__REFERENCE_WORKFLOWS = eINSTANCE
-				.getDiscipline_ReferenceWorkflows();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ContentCategoryImpl <em>Content Category</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ContentCategoryImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getContentCategory()
-		 * @generated
-		 */
-		EClass CONTENT_CATEGORY = eINSTANCE.getContentCategory();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.RoleSetImpl <em>Role Set</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.RoleSetImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleSet()
-		 * @generated
-		 */
-		EClass ROLE_SET = eINSTANCE.getRoleSet();
-
-		/**
-		 * The meta object literal for the '<em><b>Roles</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ROLE_SET__ROLES = eINSTANCE.getRoleSet_Roles();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DomainImpl <em>Domain</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DomainImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDomain()
-		 * @generated
-		 */
-		EClass DOMAIN = eINSTANCE.getDomain();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Products</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOMAIN__WORK_PRODUCTS = eINSTANCE.getDomain_WorkProducts();
-
-		/**
-		 * The meta object literal for the '<em><b>Subdomains</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOMAIN__SUBDOMAINS = eINSTANCE.getDomain_Subdomains();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.WorkProductTypeImpl <em>Work Product Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.WorkProductTypeImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkProductType()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_TYPE = eINSTANCE.getWorkProductType();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Products</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_PRODUCT_TYPE__WORK_PRODUCTS = eINSTANCE
-				.getWorkProductType_WorkProducts();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DisciplineGroupingImpl <em>Discipline Grouping</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DisciplineGroupingImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDisciplineGrouping()
-		 * @generated
-		 */
-		EClass DISCIPLINE_GROUPING = eINSTANCE.getDisciplineGrouping();
-
-		/**
-		 * The meta object literal for the '<em><b>Disciplines</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DISCIPLINE_GROUPING__DISCIPLINES = eINSTANCE
-				.getDisciplineGrouping_Disciplines();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ToolImpl <em>Tool</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ToolImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getTool()
-		 * @generated
-		 */
-		EClass TOOL = eINSTANCE.getTool();
-
-		/**
-		 * The meta object literal for the '<em><b>Tool Mentors</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TOOL__TOOL_MENTORS = eINSTANCE.getTool_ToolMentors();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.RoleSetGroupingImpl <em>Role Set Grouping</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.RoleSetGroupingImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoleSetGrouping()
-		 * @generated
-		 */
-		EClass ROLE_SET_GROUPING = eINSTANCE.getRoleSetGrouping();
-
-		/**
-		 * The meta object literal for the '<em><b>Role Sets</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ROLE_SET_GROUPING__ROLE_SETS = eINSTANCE
-				.getRoleSetGrouping_RoleSets();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.CustomCategoryImpl <em>Custom Category</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.CustomCategoryImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCustomCategory()
-		 * @generated
-		 */
-		EClass CUSTOM_CATEGORY = eINSTANCE.getCustomCategory();
-
-		/**
-		 * The meta object literal for the '<em><b>Categorized Elements</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS = eINSTANCE
-				.getCustomCategory_CategorizedElements();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Categories</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CUSTOM_CATEGORY__SUB_CATEGORIES = eINSTANCE
-				.getCustomCategory_SubCategories();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.DeliveryProcessImpl <em>Delivery Process</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.DeliveryProcessImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDeliveryProcess()
-		 * @generated
-		 */
-		EClass DELIVERY_PROCESS = eINSTANCE.getDeliveryProcess();
-
-		/**
-		 * The meta object literal for the '<em><b>Education Materials</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DELIVERY_PROCESS__EDUCATION_MATERIALS = eINSTANCE
-				.getDeliveryProcess_EducationMaterials();
-
-		/**
-		 * The meta object literal for the '<em><b>Communications Materials</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS = eINSTANCE
-				.getDeliveryProcess_CommunicationsMaterials();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessImpl <em>Process</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcess()
-		 * @generated
-		 */
-		EClass PROCESS = eINSTANCE.getProcess();
-
-		/**
-		 * The meta object literal for the '<em><b>Includes Patterns</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS__INCLUDES_PATTERNS = eINSTANCE
-				.getProcess_IncludesPatterns();
-
-		/**
-		 * The meta object literal for the '<em><b>Default Context</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS__DEFAULT_CONTEXT = eINSTANCE
-				.getProcess_DefaultContext();
-
-		/**
-		 * The meta object literal for the '<em><b>Valid Context</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS__VALID_CONTEXT = eINSTANCE.getProcess_ValidContext();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.CapabilityPatternImpl <em>Capability Pattern</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.CapabilityPatternImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getCapabilityPattern()
-		 * @generated
-		 */
-		EClass CAPABILITY_PATTERN = eINSTANCE.getCapabilityPattern();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessPlanningTemplateImpl <em>Process Planning Template</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessPlanningTemplateImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessPlanningTemplate()
-		 * @generated
-		 */
-		EClass PROCESS_PLANNING_TEMPLATE = eINSTANCE
-				.getProcessPlanningTemplate();
-
-		/**
-		 * The meta object literal for the '<em><b>Based On Processes</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES = eINSTANCE
-				.getProcessPlanningTemplate_BasedOnProcesses();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.RoadmapImpl <em>Roadmap</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.RoadmapImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getRoadmap()
-		 * @generated
-		 */
-		EClass ROADMAP = eINSTANCE.getRoadmap();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessComponentImpl <em>Process Component</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessComponentImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessComponent()
-		 * @generated
-		 */
-		EClass PROCESS_COMPONENT = eINSTANCE.getProcessComponent();
-
-		/**
-		 * The meta object literal for the '<em><b>Interfaces</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT__INTERFACES = eINSTANCE
-				.getProcessComponent_Interfaces();
-
-		/**
-		 * The meta object literal for the '<em><b>Process</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT__PROCESS = eINSTANCE
-				.getProcessComponent_Process();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessPackageImpl <em>Process Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessPackageImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessPackage()
-		 * @generated
-		 */
-		EClass PROCESS_PACKAGE = eINSTANCE.getProcessPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Process Elements</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_PACKAGE__PROCESS_ELEMENTS = eINSTANCE
-				.getProcessPackage_ProcessElements();
-
-		/**
-		 * The meta object literal for the '<em><b>Diagrams</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_PACKAGE__DIAGRAMS = eINSTANCE
-				.getProcessPackage_Diagrams();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessComponentInterfaceImpl <em>Process Component Interface</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessComponentInterfaceImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessComponentInterface()
-		 * @generated
-		 */
-		EClass PROCESS_COMPONENT_INTERFACE = eINSTANCE
-				.getProcessComponentInterface();
-
-		/**
-		 * The meta object literal for the '<em><b>Interface Specifications</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS = eINSTANCE
-				.getProcessComponentInterface_InterfaceSpecifications();
-
-		/**
-		 * The meta object literal for the '<em><b>Interface IO</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT_INTERFACE__INTERFACE_IO = eINSTANCE
-				.getProcessComponentInterface_InterfaceIO();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessComponentDescriptorImpl <em>Process Component Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessComponentDescriptorImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessComponentDescriptor()
-		 * @generated
-		 */
-		EClass PROCESS_COMPONENT_DESCRIPTOR = eINSTANCE
-				.getProcessComponentDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Process Component</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT = eINSTANCE
-				.getProcessComponentDescriptor_ProcessComponent();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MethodPluginImpl <em>Method Plugin</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MethodPluginImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodPlugin()
-		 * @generated
-		 */
-		EClass METHOD_PLUGIN = eINSTANCE.getMethodPlugin();
-
-		/**
-		 * The meta object literal for the '<em><b>User Changeable</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_PLUGIN__USER_CHANGEABLE = eINSTANCE
-				.getMethodPlugin_UserChangeable();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Packages</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_PLUGIN__METHOD_PACKAGES = eINSTANCE
-				.getMethodPlugin_MethodPackages();
-
-		/**
-		 * The meta object literal for the '<em><b>Bases</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_PLUGIN__BASES = eINSTANCE.getMethodPlugin_Bases();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.VariabilityElementImpl <em>Variability Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.VariabilityElementImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getVariabilityElement()
-		 * @generated
-		 */
-		EClass VARIABILITY_ELEMENT = eINSTANCE.getVariabilityElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VARIABILITY_ELEMENT__VARIABILITY_TYPE = eINSTANCE
-				.getVariabilityElement_VariabilityType();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Based On Element</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT = eINSTANCE
-				.getVariabilityElement_VariabilityBasedOnElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MethodUnitImpl <em>Method Unit</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MethodUnitImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodUnit()
-		 * @generated
-		 */
-		EClass METHOD_UNIT = eINSTANCE.getMethodUnit();
-
-		/**
-		 * The meta object literal for the '<em><b>Authors</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__AUTHORS = eINSTANCE.getMethodUnit_Authors();
-
-		/**
-		 * The meta object literal for the '<em><b>Change Date</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__CHANGE_DATE = eINSTANCE
-				.getMethodUnit_ChangeDate();
-
-		/**
-		 * The meta object literal for the '<em><b>Change Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__CHANGE_DESCRIPTION = eINSTANCE
-				.getMethodUnit_ChangeDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Version</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__VERSION = eINSTANCE.getMethodUnit_Version();
-
-		/**
-		 * The meta object literal for the '<em><b>Copyright Statement</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_UNIT__COPYRIGHT_STATEMENT = eINSTANCE
-				.getMethodUnit_CopyrightStatement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl <em>Method Configuration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MethodConfigurationImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodConfiguration()
-		 * @generated
-		 */
-		EClass METHOD_CONFIGURATION = eINSTANCE.getMethodConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Plugin Selection</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION = eINSTANCE
-				.getMethodConfiguration_MethodPluginSelection();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Package Selection</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION = eINSTANCE
-				.getMethodConfiguration_MethodPackageSelection();
-
-		/**
-		 * The meta object literal for the '<em><b>Process Views</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_CONFIGURATION__PROCESS_VIEWS = eINSTANCE
-				.getMethodConfiguration_ProcessViews();
-
-		/**
-		 * The meta object literal for the '<em><b>Default View</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_CONFIGURATION__DEFAULT_VIEW = eINSTANCE
-				.getMethodConfiguration_DefaultView();
-
-		/**
-		 * The meta object literal for the '<em><b>Base Configurations</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_CONFIGURATION__BASE_CONFIGURATIONS = eINSTANCE
-				.getMethodConfiguration_BaseConfigurations();
-
-		/**
-		 * The meta object literal for the '<em><b>Subtracted Category</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_CONFIGURATION__SUBTRACTED_CATEGORY = eINSTANCE
-				.getMethodConfiguration_SubtractedCategory();
-
-		/**
-		 * The meta object literal for the '<em><b>Added Category</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_CONFIGURATION__ADDED_CATEGORY = eINSTANCE
-				.getMethodConfiguration_AddedCategory();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.ProcessFamilyImpl <em>Process Family</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.ProcessFamilyImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getProcessFamily()
-		 * @generated
-		 */
-		EClass PROCESS_FAMILY = eINSTANCE.getProcessFamily();
-
-		/**
-		 * The meta object literal for the '<em><b>Delivery Processes</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_FAMILY__DELIVERY_PROCESSES = eINSTANCE
-				.getProcessFamily_DeliveryProcesses();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.impl.MethodLibraryImpl <em>Method Library</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.MethodLibraryImpl
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getMethodLibrary()
-		 * @generated
-		 */
-		EClass METHOD_LIBRARY = eINSTANCE.getMethodLibrary();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Plugins</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_LIBRARY__METHOD_PLUGINS = eINSTANCE
-				.getMethodLibrary_MethodPlugins();
-
-		/**
-		 * The meta object literal for the '<em><b>Predefined Configurations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS = eINSTANCE
-				.getMethodLibrary_PredefinedConfigurations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.WorkOrderType <em>Work Order Type</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.WorkOrderType
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getWorkOrderType()
-		 * @generated
-		 */
-		EEnum WORK_ORDER_TYPE = eINSTANCE.getWorkOrderType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.PseudoStateKind <em>Pseudo State Kind</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.PseudoStateKind
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getPseudoStateKind()
-		 * @generated
-		 */
-		EEnum PSEUDO_STATE_KIND = eINSTANCE.getPseudoStateKind();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.uma.VariabilityType <em>Variability Type</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.VariabilityType
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getVariabilityType()
-		 * @generated
-		 */
-		EEnum VARIABILITY_TYPE = eINSTANCE.getVariabilityType();
-
-		/**
-		 * The meta object literal for the '<em>Date</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see java.util.Date
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getDate()
-		 * @generated
-		 */
-		EDataType DATE = eINSTANCE.getDate();
-
-		/**
-		 * The meta object literal for the '<em>Uri</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see java.net.URI
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getUri()
-		 * @generated
-		 */
-		EDataType URI = eINSTANCE.getUri();
-
-		/**
-		 * The meta object literal for the '<em>Unlimited Natural</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getUnlimitedNatural()
-		 * @generated
-		 */
-		EDataType UNLIMITED_NATURAL = eINSTANCE.getUnlimitedNatural();
-
-		/**
-		 * The meta object literal for the '<em>String</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see java.lang.String
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getString()
-		 * @generated
-		 */
-		EDataType STRING = eINSTANCE.getString();
-
-		/**
-		 * The meta object literal for the '<em>Set</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see java.util.Set
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSet()
-		 * @generated
-		 */
-		EDataType SET = eINSTANCE.getSet();
-
-		/**
-		 * The meta object literal for the '<em>Sequence</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see java.util.List
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getSequence()
-		 * @generated
-		 */
-		EDataType SEQUENCE = eINSTANCE.getSequence();
-
-		/**
-		 * The meta object literal for the '<em>Integer</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getInteger()
-		 * @generated
-		 */
-		EDataType INTEGER = eINSTANCE.getInteger();
-
-		/**
-		 * The meta object literal for the '<em>Float</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see java.lang.Float
-		 * @see org.eclipse.epf.uma.impl.UmaPackageImpl#getFloat()
-		 * @generated
-		 */
-		EDataType FLOAT = eINSTANCE.getFloat();
-
-	}
-
-} //UmaPackage
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/VariabilityElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/VariabilityElement.java
deleted file mode 100644
index 3edda93..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/VariabilityElement.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Variability Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Variability Element is an abstract class derived from Method Element that provides new capabilities for content variation and extension to Content Elements or any other Method Element that derives from it.  It has been placed in-between the classes Method Element and Content Element in the overall UMA taxonomy of classes using the UML 2.0 package merge mechanism.  The association Variability Specialization shall only be instantiated between two subclasses of Variability Element of the same type.  The element on varaibilitySpecialElement side of the relationship defines a value for the attribute variabilityType defining the nature of the relationship using a literal from the enumeration Variability Type.
- * Variability Element of the meta-model package Method Plugins adds the capabilities of variation and extension to Method Elements that derive from it.  By default all Content Elements such as Role, Task, Guidance Types, or Activities are defined to be Variability Elements.
- * Variability and extension provides unique mechanisms for customizing method content without actually directly modifying the original content, but by just be able to describe with separate objects the differences (additions, changes, omissions) relative to the original.  This plug-in concept allows users to factor their method content and processes in interrelated units and even to architect method content and processes in layers that extend each other with new capabilities.  The resulting method and process design can be dynamically combined and applied on demand using the interpretation rules defined for Variability Element Specializations assembling to process practitioners the most accurate method and process descriptions possible.  It also allows process practitioners to extends and tailor method content and processes they do not own and to easily upgrade to newer versions by simply reapply their personal changes to these upgrades.
- * Variability Element defines two types of variability and one type of extension which are formally defined for the enumeration Variability Type.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.VariabilityElement#getVariabilityType <em>Variability Type</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.VariabilityElement#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getVariabilityElement()
- * @model abstract="true"
- * @generated
- */
-public interface VariabilityElement extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Variability Type</b></em>' attribute.
-	 * The default value is <code>"na"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.epf.uma.VariabilityType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * If in instance of the variabilitySpecialization association between two Variability Elements of the same type exists, then the variabilityType attribute specifies how the element at the variabilitySpecialElement end of the association changes the Content Element at the variabilityBasedOnElement end. See the Variability Type enumeration class for definitions for the different types of variability.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.uma.VariabilityType
-	 * @see #setVariabilityType(VariabilityType)
-	 * @see org.eclipse.epf.uma.UmaPackage#getVariabilityElement_VariabilityType()
-	 * @model default="na" unique="false"
-	 * @generated
-	 */
-	VariabilityType getVariabilityType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.VariabilityElement#getVariabilityType <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.uma.VariabilityType
-	 * @see #getVariabilityType()
-	 * @generated
-	 */
-	void setVariabilityType(VariabilityType value);
-
-	/**
-	 * Returns the value of the '<em><b>Variability Based On Element</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variability Based On Element</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variability Based On Element</em>' reference.
-	 * @see #setVariabilityBasedOnElement(VariabilityElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getVariabilityElement_VariabilityBasedOnElement()
-	 * @model
-	 * @generated
-	 */
-	VariabilityElement getVariabilityBasedOnElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.VariabilityElement#getVariabilityBasedOnElement <em>Variability Based On Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Based On Element</em>' reference.
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 */
-	void setVariabilityBasedOnElement(VariabilityElement value);
-
-} // VariabilityElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/VariabilityType.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/VariabilityType.java
deleted file mode 100644
index f9a04c9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/VariabilityType.java
+++ /dev/null
@@ -1,302 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Variability Type</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * Variability Type is an Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.
- * <!-- end-model-doc -->
- * @see org.eclipse.epf.uma.UmaPackage#getVariabilityType()
- * @model
- * @generated
- */
-public final class VariabilityType extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Na</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Na</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #NA_LITERAL
-	 * @model name="na"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int NA = 0;
-
-	/**
-	 * The '<em><b>Contributes</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Contributes</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #CONTRIBUTES_LITERAL
-	 * @model name="contributes"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int CONTRIBUTES = 1;
-
-	/**
-	 * The '<em><b>Extends</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Extends</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS_LITERAL
-	 * @model name="extends"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int EXTENDS = 2;
-
-	/**
-	 * The '<em><b>Replaces</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Replaces</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #REPLACES_LITERAL
-	 * @model name="replaces"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int REPLACES = 3;
-
-	/**
-	 * The '<em><b>Local Contribution</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Local Contribution</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_CONTRIBUTION_LITERAL
-	 * @model name="localContribution"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOCAL_CONTRIBUTION = 4;
-
-	/**
-	 * The '<em><b>Local Replacement</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Local Replacement</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_REPLACEMENT_LITERAL
-	 * @model name="localReplacement"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOCAL_REPLACEMENT = 5;
-
-	/**
-	 * The '<em><b>Extends Replaces</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Extends Replaces</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS_REPLACES_LITERAL
-	 * @model name="extendsReplaces"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int EXTENDS_REPLACES = 6;
-
-	/**
-	 * The '<em><b>Na</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #NA
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType NA_LITERAL = new VariabilityType(NA,
-			"na", "na");
-
-	/**
-	 * The '<em><b>Contributes</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CONTRIBUTES
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType CONTRIBUTES_LITERAL = new VariabilityType(
-			CONTRIBUTES, "contributes", "contributes");
-
-	/**
-	 * The '<em><b>Extends</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType EXTENDS_LITERAL = new VariabilityType(
-			EXTENDS, "extends", "extends");
-
-	/**
-	 * The '<em><b>Replaces</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #REPLACES
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType REPLACES_LITERAL = new VariabilityType(
-			REPLACES, "replaces", "replaces");
-
-	/**
-	 * The '<em><b>Local Contribution</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_CONTRIBUTION
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType LOCAL_CONTRIBUTION_LITERAL = new VariabilityType(
-			LOCAL_CONTRIBUTION, "localContribution", "localContribution"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Local Replacement</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_REPLACEMENT
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType LOCAL_REPLACEMENT_LITERAL = new VariabilityType(
-			LOCAL_REPLACEMENT, "localReplacement", "localReplacement"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>Extends Replaces</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS_REPLACES
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType EXTENDS_REPLACES_LITERAL = new VariabilityType(
-			EXTENDS_REPLACES, "extendsReplaces", "extendsReplaces"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * An array of all the '<em><b>Variability Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final VariabilityType[] VALUES_ARRAY = new VariabilityType[] {
-			NA_LITERAL, CONTRIBUTES_LITERAL, EXTENDS_LITERAL, REPLACES_LITERAL,
-			LOCAL_CONTRIBUTION_LITERAL, LOCAL_REPLACEMENT_LITERAL,
-			EXTENDS_REPLACES_LITERAL, };
-
-	/**
-	 * A public read-only list of all the '<em><b>Variability Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-			.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Variability Type</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static VariabilityType get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			VariabilityType result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Variability Type</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static VariabilityType getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			VariabilityType result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Variability Type</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static VariabilityType get(int value) {
-		switch (value) {
-		case NA:
-			return NA_LITERAL;
-		case CONTRIBUTES:
-			return CONTRIBUTES_LITERAL;
-		case EXTENDS:
-			return EXTENDS_LITERAL;
-		case REPLACES:
-			return REPLACES_LITERAL;
-		case LOCAL_CONTRIBUTION:
-			return LOCAL_CONTRIBUTION_LITERAL;
-		case LOCAL_REPLACEMENT:
-			return LOCAL_REPLACEMENT_LITERAL;
-		case EXTENDS_REPLACES:
-			return EXTENDS_REPLACES_LITERAL;
-		}
-		return null;
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private VariabilityType(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //VariabilityType
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Vertex.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Vertex.java
deleted file mode 100644
index 6cb2b57..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Vertex.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-import org.eclipse.epf.uma.ecore.IModelObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Vertex</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.Vertex#getContainer_ <em>Container</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Vertex#getOutgoing <em>Outgoing</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.Vertex#getIncoming <em>Incoming</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getVertex()
- * @model
- * @extends IModelObject
- * @generated
- */
-public interface Vertex extends IModelObject {
-	/**
-	 * Returns the value of the '<em><b>Container</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Region#getVertex <em>Vertex</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Container</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Container</em>' container reference.
-	 * @see #setContainer(Region)
-	 * @see org.eclipse.epf.uma.UmaPackage#getVertex_Container()
-	 * @see org.eclipse.epf.uma.Region#getVertex
-	 * @model opposite="Vertex"
-	 * @generated
-	 */
-	Region getContainer_();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.Vertex#getContainer_ <em>Container</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Container</em>' container reference.
-	 * @see #getContainer_()
-	 * @generated
-	 */
-	void setContainer(Region value);
-
-	/**
-	 * Returns the value of the '<em><b>Outgoing</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Transition}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Transition#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Outgoing</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Outgoing</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getVertex_Outgoing()
-	 * @see org.eclipse.epf.uma.Transition#getSource
-	 * @model type="org.eclipse.epf.uma.Transition" opposite="source" ordered="false"
-	 * @generated
-	 */
-	List getOutgoing();
-
-	/**
-	 * Returns the value of the '<em><b>Incoming</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Transition}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.Transition#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Incoming</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Incoming</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getVertex_Incoming()
-	 * @see org.eclipse.epf.uma.Transition#getTarget
-	 * @model type="org.eclipse.epf.uma.Transition" opposite="target" ordered="false"
-	 * @generated
-	 */
-	List getIncoming();
-
-} // Vertex
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Whitepaper.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Whitepaper.java
deleted file mode 100644
index b1e6d28..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/Whitepaper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Whitepaper</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Whitepapers are a special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWhitepaper()
- * @model
- * @generated
- */
-public interface Whitepaper extends Concept {
-} // Whitepaper
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkBreakdownElement.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkBreakdownElement.java
deleted file mode 100644
index fd1a998..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkBreakdownElement.java
+++ /dev/null
@@ -1,135 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Work Breakdown Element is a special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsRepeatable <em>Is Repeatable</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsOngoing <em>Is Ongoing</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsEventDriven <em>Is Event Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkBreakdownElement#getLinkToPredecessor <em>Link To Predecessor</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWorkBreakdownElement()
- * @model abstract="true"
- * @generated
- */
-public interface WorkBreakdownElement extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Is Repeatable</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Repeatable</em>' attribute.
-	 * @see #setIsRepeatable(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkBreakdownElement_IsRepeatable()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getIsRepeatable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsRepeatable <em>Is Repeatable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Repeatable</em>' attribute.
-	 * @see #getIsRepeatable()
-	 * @generated
-	 */
-	void setIsRepeatable(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Is Ongoing</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Ongoing</em>' attribute.
-	 * @see #setIsOngoing(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkBreakdownElement_IsOngoing()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getIsOngoing();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsOngoing <em>Is Ongoing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Ongoing</em>' attribute.
-	 * @see #getIsOngoing()
-	 * @generated
-	 */
-	void setIsOngoing(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Is Event Driven</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-	 * 
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Event Driven</em>' attribute.
-	 * @see #setIsEventDriven(Boolean)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkBreakdownElement_IsEventDriven()
-	 * @model default="false"
-	 * @generated
-	 */
-	Boolean getIsEventDriven();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkBreakdownElement#getIsEventDriven <em>Is Event Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Event Driven</em>' attribute.
-	 * @see #getIsEventDriven()
-	 * @generated
-	 */
-	void setIsEventDriven(Boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Link To Predecessor</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkOrder}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Link To Predecessor</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Link To Predecessor</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkBreakdownElement_LinkToPredecessor()
-	 * @model type="org.eclipse.epf.uma.WorkOrder" ordered="false"
-	 * @generated
-	 */
-	List getLinkToPredecessor();
-
-} // WorkBreakdownElement
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkDefinition.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkDefinition.java
deleted file mode 100644
index bcb9871..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkDefinition.java
+++ /dev/null
@@ -1,88 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Definition</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Work Definition is an abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
- * Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.WorkDefinition#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkDefinition#getPostcondition <em>Postcondition</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWorkDefinition()
- * @model abstract="true"
- * @generated
- */
-public interface WorkDefinition extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Precondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Precondition</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>Precondition</em>' containment reference.
-	 * @see #setPrecondition(Constraint)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkDefinition_Precondition()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	Constraint getPrecondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkDefinition#getPrecondition <em>Precondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Precondition</em>' containment reference.
-	 * @see #getPrecondition()
-	 * @generated
-	 */
-	void setPrecondition(Constraint value);
-
-	/**
-	 * Returns the value of the '<em><b>Postcondition</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Postcondition</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>Postcondition</em>' containment reference.
-	 * @see #setPostcondition(Constraint)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkDefinition_Postcondition()
-	 * @model containment="true" resolveProxies="true"
-	 * @generated
-	 */
-	Constraint getPostcondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkDefinition#getPostcondition <em>Postcondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Postcondition</em>' containment reference.
-	 * @see #getPostcondition()
-	 * @generated
-	 */
-	void setPostcondition(Constraint value);
-
-} // WorkDefinition
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkOrder.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkOrder.java
deleted file mode 100644
index 12b9ac6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkOrder.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Order</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Work Order is a Method Element that represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
- * (Note, Work Order is not modeled as an Association Class to provide a straightforward mapping  to XMI and EMF.)
- * The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.WorkOrder#getLinkType <em>Link Type</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkOrder#getPred <em>Pred</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWorkOrder()
- * @model
- * @generated
- */
-public interface WorkOrder extends ProcessElement {
-	/**
-	 * Returns the value of the '<em><b>Link Type</b></em>' attribute.
-	 * The default value is <code>"finishToStart"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.epf.uma.WorkOrderType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Link Type</em>' attribute.
-	 * @see org.eclipse.epf.uma.WorkOrderType
-	 * @see #setLinkType(WorkOrderType)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkOrder_LinkType()
-	 * @model default="finishToStart" unique="false"
-	 * @generated
-	 */
-	WorkOrderType getLinkType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkOrder#getLinkType <em>Link Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Link Type</em>' attribute.
-	 * @see org.eclipse.epf.uma.WorkOrderType
-	 * @see #getLinkType()
-	 * @generated
-	 */
-	void setLinkType(WorkOrderType value);
-
-	/**
-	 * Returns the value of the '<em><b>Pred</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Pred</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Pred</em>' reference.
-	 * @see #setPred(WorkBreakdownElement)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkOrder_Pred()
-	 * @model required="true"
-	 * @generated
-	 */
-	WorkBreakdownElement getPred();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkOrder#getPred <em>Pred</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Pred</em>' reference.
-	 * @see #getPred()
-	 * @generated
-	 */
-	void setPred(WorkBreakdownElement value);
-
-} // WorkOrder
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkOrderType.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkOrderType.java
deleted file mode 100644
index 141d392..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkOrderType.java
+++ /dev/null
@@ -1,217 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Work Order Type</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * Work Order represents a relationship between two Breakdown Element in which one Breakdown Element (referred to as (B) below) depends on the start or finish of another Breakdown Element (referred to as (A) below) in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.
- * <!-- end-model-doc -->
- * @see org.eclipse.epf.uma.UmaPackage#getWorkOrderType()
- * @model
- * @generated
- */
-public final class WorkOrderType extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Finish To Start</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Finish To Start</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_START_LITERAL
-	 * @model name="finishToStart"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int FINISH_TO_START = 0;
-
-	/**
-	 * The '<em><b>Finish To Finish</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Finish To Finish</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_FINISH_LITERAL
-	 * @model name="finishToFinish"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int FINISH_TO_FINISH = 1;
-
-	/**
-	 * The '<em><b>Start To Start</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Start To Start</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_START_LITERAL
-	 * @model name="startToStart"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int START_TO_START = 2;
-
-	/**
-	 * The '<em><b>Start To Finish</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Start To Finish</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_FINISH_LITERAL
-	 * @model name="startToFinish"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int START_TO_FINISH = 3;
-
-	/**
-	 * The '<em><b>Finish To Start</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_START
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType FINISH_TO_START_LITERAL = new WorkOrderType(
-			FINISH_TO_START, "finishToStart", "finishToStart");
-
-	/**
-	 * The '<em><b>Finish To Finish</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_FINISH
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType FINISH_TO_FINISH_LITERAL = new WorkOrderType(
-			FINISH_TO_FINISH, "finishToFinish", "finishToFinish");
-
-	/**
-	 * The '<em><b>Start To Start</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_START
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType START_TO_START_LITERAL = new WorkOrderType(
-			START_TO_START, "startToStart", "startToStart");
-
-	/**
-	 * The '<em><b>Start To Finish</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_FINISH
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType START_TO_FINISH_LITERAL = new WorkOrderType(
-			START_TO_FINISH, "startToFinish", "startToFinish");
-
-	/**
-	 * An array of all the '<em><b>Work Order Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final WorkOrderType[] VALUES_ARRAY = new WorkOrderType[] {
-			FINISH_TO_START_LITERAL, FINISH_TO_FINISH_LITERAL,
-			START_TO_START_LITERAL, START_TO_FINISH_LITERAL, };
-
-	/**
-	 * A public read-only list of all the '<em><b>Work Order Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays
-			.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Work Order Type</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WorkOrderType get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			WorkOrderType result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Work Order Type</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WorkOrderType getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			WorkOrderType result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Work Order Type</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WorkOrderType get(int value) {
-		switch (value) {
-		case FINISH_TO_START:
-			return FINISH_TO_START_LITERAL;
-		case FINISH_TO_FINISH:
-			return FINISH_TO_FINISH_LITERAL;
-		case START_TO_START:
-			return START_TO_START_LITERAL;
-		case START_TO_FINISH:
-			return START_TO_FINISH_LITERAL;
-		}
-		return null;
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private WorkOrderType(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //WorkOrderType
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProduct.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProduct.java
deleted file mode 100644
index 18683a9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProduct.java
+++ /dev/null
@@ -1,104 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Work Product is an abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
- * A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.WorkProduct#getReports <em>Reports</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProduct#getTemplates <em>Templates</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProduct#getToolMentors <em>Tool Mentors</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProduct#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWorkProduct()
- * @model abstract="true"
- * @generated
- */
-public interface WorkProduct extends ContentElement {
-	/**
-	 * Returns the value of the '<em><b>Reports</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Report}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reports</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Reports</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProduct_Reports()
-	 * @model type="org.eclipse.epf.uma.Report" ordered="false"
-	 * @generated
-	 */
-	List getReports();
-
-	/**
-	 * Returns the value of the '<em><b>Templates</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.Template}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Templates</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Templates</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProduct_Templates()
-	 * @model type="org.eclipse.epf.uma.Template" ordered="false"
-	 * @generated
-	 */
-	List getTemplates();
-
-	/**
-	 * Returns the value of the '<em><b>Tool Mentors</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.ToolMentor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tool Mentors</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tool Mentors</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProduct_ToolMentors()
-	 * @model type="org.eclipse.epf.uma.ToolMentor" ordered="false"
-	 * @generated
-	 */
-	List getToolMentors();
-
-	/**
-	 * Returns the value of the '<em><b>Estimation Considerations</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.EstimationConsiderations}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimation Considerations</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Estimation Considerations</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProduct_EstimationConsiderations()
-	 * @model type="org.eclipse.epf.uma.EstimationConsiderations" ordered="false"
-	 * @generated
-	 */
-	List getEstimationConsiderations();
-
-} // WorkProduct
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductDescription.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductDescription.java
deleted file mode 100644
index c4ccabc..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductDescription.java
+++ /dev/null
@@ -1,110 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescription#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescription#getImpactOfNotHaving <em>Impact Of Not Having</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescription#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescription()
- * @model
- * @generated
- */
-public interface WorkProductDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Purpose</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes why the work product is produced and to what use it will be put.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Purpose</em>' attribute.
-	 * @see #setPurpose(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescription_Purpose()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getPurpose();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkProductDescription#getPurpose <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Purpose</em>' attribute.
-	 * @see #getPurpose()
-	 * @generated
-	 */
-	void setPurpose(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Impact Of Not Having</em>' attribute.
-	 * @see #setImpactOfNotHaving(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescription_ImpactOfNotHaving()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getImpactOfNotHaving();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkProductDescription#getImpactOfNotHaving <em>Impact Of Not Having</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Impact Of Not Having</em>' attribute.
-	 * @see #getImpactOfNotHaving()
-	 * @generated
-	 */
-	void setImpactOfNotHaving(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Reasons For Not Needing</em>' attribute.
-	 * @see #setReasonsForNotNeeding(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescription_ReasonsForNotNeeding()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getReasonsForNotNeeding();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkProductDescription#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Reasons For Not Needing</em>' attribute.
-	 * @see #getReasonsForNotNeeding()
-	 * @generated
-	 */
-	void setReasonsForNotNeeding(String value);
-
-} // WorkProductDescription
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductDescriptor.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductDescriptor.java
deleted file mode 100644
index 383dd27..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductDescriptor.java
+++ /dev/null
@@ -1,173 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Work Product Descriptor represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescriptor#getActivityEntryState <em>Activity Entry State</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescriptor#getActivityExitState <em>Activity Exit State</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescriptor#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescriptor#getImpactedBy <em>Impacted By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescriptor#getImpacts <em>Impacts</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.WorkProductDescriptor#getDeliverableParts <em>Deliverable Parts</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescriptor()
- * @model
- * @generated
- */
-public interface WorkProductDescriptor extends Descriptor {
-	/**
-	 * Returns the value of the '<em><b>Activity Entry State</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-	 * For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Activity Entry State</em>' attribute.
-	 * @see #setActivityEntryState(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescriptor_ActivityEntryState()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getActivityEntryState();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkProductDescriptor#getActivityEntryState <em>Activity Entry State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Activity Entry State</em>' attribute.
-	 * @see #getActivityEntryState()
-	 * @generated
-	 */
-	void setActivityEntryState(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Activity Exit State</b></em>' attribute.
-	 * The default value is <code>""</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-	 * For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Activity Exit State</em>' attribute.
-	 * @see #setActivityExitState(String)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescriptor_ActivityExitState()
-	 * @model default="" dataType="org.eclipse.epf.uma.String"
-	 * @generated
-	 */
-	String getActivityExitState();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkProductDescriptor#getActivityExitState <em>Activity Exit State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Activity Exit State</em>' attribute.
-	 * @see #getActivityExitState()
-	 * @generated
-	 */
-	void setActivityExitState(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Work Product</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Product</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Work Product</em>' reference.
-	 * @see #setWorkProduct(WorkProduct)
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescriptor_WorkProduct()
-	 * @model
-	 * @generated
-	 */
-	WorkProduct getWorkProduct();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.uma.WorkProductDescriptor#getWorkProduct <em>Work Product</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Product</em>' reference.
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	void setWorkProduct(WorkProduct value);
-
-	/**
-	 * Returns the value of the '<em><b>Impacted By</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.WorkProductDescriptor#getImpacts <em>Impacts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Impacted By</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Impacted By</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescriptor_ImpactedBy()
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getImpacts
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" opposite="impacts" ordered="false"
-	 * @generated
-	 */
-	List getImpactedBy();
-
-	/**
-	 * Returns the value of the '<em><b>Impacts</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.epf.uma.WorkProductDescriptor#getImpactedBy <em>Impacted By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Impacts</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Impacts</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescriptor_Impacts()
-	 * @see org.eclipse.epf.uma.WorkProductDescriptor#getImpactedBy
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" opposite="impactedBy" ordered="false"
-	 * @generated
-	 */
-	List getImpacts();
-
-	/**
-	 * Returns the value of the '<em><b>Deliverable Parts</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Deliverable Parts</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Deliverable Parts</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductDescriptor_DeliverableParts()
-	 * @model type="org.eclipse.epf.uma.WorkProductDescriptor" ordered="false"
-	 * @generated
-	 */
-	List getDeliverableParts();
-
-} // WorkProductDescriptor
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductType.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductType.java
deleted file mode 100644
index aa459d7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/WorkProductType.java
+++ /dev/null
@@ -1,52 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma;
-
-import java.util.List;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Work Product Type is a second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is "Class Diagram", which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or "Specification", which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.WorkProductType#getWorkProducts <em>Work Products</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.uma.UmaPackage#getWorkProductType()
- * @model
- * @generated
- */
-public interface WorkProductType extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Work Products</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.epf.uma.WorkProduct}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Products</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Work Products</em>' reference list.
-	 * @see org.eclipse.epf.uma.UmaPackage#getWorkProductType_WorkProducts()
-	 * @model type="org.eclipse.epf.uma.WorkProduct" ordered="false"
-	 * @generated
-	 */
-	List getWorkProducts();
-
-} // WorkProductType
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ActivityDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ActivityDescriptionImpl.java
deleted file mode 100644
index 065fcec..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ActivityDescriptionImpl.java
+++ /dev/null
@@ -1,298 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Activity Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityDescriptionImpl#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityDescriptionImpl#getAlternatives <em>Alternatives</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityDescriptionImpl#getHowtoStaff <em>Howto Staff</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActivityDescriptionImpl extends BreakdownElementDescriptionImpl
-		implements ActivityDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PURPOSE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected String purpose = PURPOSE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ALTERNATIVES_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected String alternatives = ALTERNATIVES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHowtoStaff() <em>Howto Staff</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHowtoStaff()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HOWTO_STAFF_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getHowtoStaff() <em>Howto Staff</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHowtoStaff()
-	 * @generated
-	 * @ordered
-	 */
-	protected String howtoStaff = HOWTO_STAFF_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ACTIVITY_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPurpose() {
-		return purpose;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPurpose(String newPurpose) {
-		String oldPurpose = purpose;
-		purpose = newPurpose;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE, oldPurpose,
-					purpose));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAlternatives() {
-		return alternatives;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAlternatives(String newAlternatives) {
-		String oldAlternatives = alternatives;
-		alternatives = newAlternatives;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES,
-					oldAlternatives, alternatives));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHowtoStaff() {
-		return howtoStaff;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHowtoStaff(String newHowtoStaff) {
-		String oldHowtoStaff = howtoStaff;
-		howtoStaff = newHowtoStaff;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY_DESCRIPTION__HOWTO_STAFF,
-					oldHowtoStaff, howtoStaff));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-			return getPurpose();
-		case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-			return getAlternatives();
-		case UmaPackage.ACTIVITY_DESCRIPTION__HOWTO_STAFF:
-			return getHowtoStaff();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-			setPurpose((String) newValue);
-			return;
-		case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-			setAlternatives((String) newValue);
-			return;
-		case UmaPackage.ACTIVITY_DESCRIPTION__HOWTO_STAFF:
-			setHowtoStaff((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-			setPurpose(PURPOSE_EDEFAULT);
-			return;
-		case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-			setAlternatives(ALTERNATIVES_EDEFAULT);
-			return;
-		case UmaPackage.ACTIVITY_DESCRIPTION__HOWTO_STAFF:
-			setHowtoStaff(HOWTO_STAFF_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-			return PURPOSE_EDEFAULT == null ? purpose != null
-					: !PURPOSE_EDEFAULT.equals(purpose);
-		case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-			return ALTERNATIVES_EDEFAULT == null ? alternatives != null
-					: !ALTERNATIVES_EDEFAULT.equals(alternatives);
-		case UmaPackage.ACTIVITY_DESCRIPTION__HOWTO_STAFF:
-			return HOWTO_STAFF_EDEFAULT == null ? howtoStaff != null
-					: !HOWTO_STAFF_EDEFAULT.equals(howtoStaff);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (purpose: "); //$NON-NLS-1$
-		result.append(purpose);
-		result.append(", alternatives: "); //$NON-NLS-1$
-		result.append(alternatives);
-		result.append(", howtoStaff: "); //$NON-NLS-1$
-		result.append(howtoStaff);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ActivityDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ActivityImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ActivityImpl.java
deleted file mode 100644
index 4dff918..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ActivityImpl.java
+++ /dev/null
@@ -1,927 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkDefinition;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Activity</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getVariabilityType <em>Variability Type</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getPostcondition <em>Postcondition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getBreakdownElements <em>Breakdown Elements</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getRoadmaps <em>Roadmaps</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getSupportingMaterials <em>Supporting Materials</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getChecklists <em>Checklists</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getConcepts <em>Concepts</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getExamples <em>Examples</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getGuidelines <em>Guidelines</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getReusableAssets <em>Reusable Assets</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ActivityImpl#getIsEnactable <em>Is Enactable</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActivityImpl extends WorkBreakdownElementImpl implements Activity {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final VariabilityType VARIABILITY_TYPE_EDEFAULT = VariabilityType.NA_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityType variabilityType = VARIABILITY_TYPE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityElement variabilityBasedOnElement = null;
-
-	/**
-	 * The cached value of the '{@link #getPrecondition() <em>Precondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint precondition = null;
-
-	/**
-	 * The cached value of the '{@link #getPostcondition() <em>Postcondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint postcondition = null;
-
-	/**
-	 * The cached value of the '{@link #getBreakdownElements() <em>Breakdown Elements</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBreakdownElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList breakdownElements = null;
-
-	/**
-	 * The cached value of the '{@link #getRoadmaps() <em>Roadmaps</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRoadmaps()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList roadmaps = null;
-
-	/**
-	 * The cached value of the '{@link #getSupportingMaterials() <em>Supporting Materials</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSupportingMaterials()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList supportingMaterials = null;
-
-	/**
-	 * The cached value of the '{@link #getChecklists() <em>Checklists</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChecklists()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList checklists = null;
-
-	/**
-	 * The cached value of the '{@link #getConcepts() <em>Concepts</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConcepts()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList concepts = null;
-
-	/**
-	 * The cached value of the '{@link #getExamples() <em>Examples</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExamples()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList examples = null;
-
-	/**
-	 * The cached value of the '{@link #getGuidelines() <em>Guidelines</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGuidelines()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList guidelines = null;
-
-	/**
-	 * The cached value of the '{@link #getReusableAssets() <em>Reusable Assets</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReusableAssets()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList reusableAssets = null;
-
-	/**
-	 * The default value of the '{@link #getIsEnactable() <em>Is Enactable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsEnactable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_ENACTABLE_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getIsEnactable() <em>Is Enactable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsEnactable()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isEnactable = IS_ENACTABLE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ACTIVITY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getChecklists() {
-		if (checklists == null) {
-			checklists = new EObjectResolvingEList(Checklist.class, this,
-					UmaPackage.ACTIVITY__CHECKLISTS);
-		}
-		return checklists;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getConcepts() {
-		if (concepts == null) {
-			concepts = new EObjectResolvingEList(Concept.class, this,
-					UmaPackage.ACTIVITY__CONCEPTS);
-		}
-		return concepts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType getVariabilityType() {
-		return variabilityType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityType(VariabilityType newVariabilityType) {
-		VariabilityType oldVariabilityType = variabilityType;
-		variabilityType = newVariabilityType == null ? VARIABILITY_TYPE_EDEFAULT
-				: newVariabilityType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY__VARIABILITY_TYPE, oldVariabilityType,
-					variabilityType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityElement getVariabilityBasedOnElement() {
-		if (variabilityBasedOnElement != null
-				&& ((EObject) variabilityBasedOnElement).eIsProxy()) {
-			InternalEObject oldVariabilityBasedOnElement = (InternalEObject) variabilityBasedOnElement;
-			variabilityBasedOnElement = (VariabilityElement) eResolveProxy(oldVariabilityBasedOnElement);
-			if (variabilityBasedOnElement != oldVariabilityBasedOnElement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT,
-							oldVariabilityBasedOnElement,
-							variabilityBasedOnElement));
-			}
-		}
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityElement basicGetVariabilityBasedOnElement() {
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityBasedOnElement(
-			VariabilityElement newVariabilityBasedOnElement) {
-		VariabilityElement oldVariabilityBasedOnElement = variabilityBasedOnElement;
-		variabilityBasedOnElement = newVariabilityBasedOnElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT,
-					oldVariabilityBasedOnElement, variabilityBasedOnElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPrecondition() {
-		if (precondition != null && ((EObject) precondition).eIsProxy()) {
-			InternalEObject oldPrecondition = (InternalEObject) precondition;
-			precondition = (Constraint) eResolveProxy(oldPrecondition);
-			if (precondition != oldPrecondition) {
-				InternalEObject newPrecondition = (InternalEObject) precondition;
-				NotificationChain msgs = oldPrecondition
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.ACTIVITY__PRECONDITION, null, null);
-				if (newPrecondition.eInternalContainer() == null) {
-					msgs = newPrecondition.eInverseAdd(this,
-							EOPPOSITE_FEATURE_BASE
-									- UmaPackage.ACTIVITY__PRECONDITION, null,
-							msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.ACTIVITY__PRECONDITION, oldPrecondition,
-							precondition));
-			}
-		}
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPrecondition() {
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPrecondition(Constraint newPrecondition,
-			NotificationChain msgs) {
-		Constraint oldPrecondition = precondition;
-		precondition = newPrecondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.ACTIVITY__PRECONDITION,
-					oldPrecondition, newPrecondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrecondition(Constraint newPrecondition) {
-		if (newPrecondition != precondition) {
-			NotificationChain msgs = null;
-			if (precondition != null)
-				msgs = ((InternalEObject) precondition)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.ACTIVITY__PRECONDITION, null, msgs);
-			if (newPrecondition != null)
-				msgs = ((InternalEObject) newPrecondition)
-						.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.ACTIVITY__PRECONDITION, null, msgs);
-			msgs = basicSetPrecondition(newPrecondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY__PRECONDITION, newPrecondition,
-					newPrecondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPostcondition() {
-		if (postcondition != null && ((EObject) postcondition).eIsProxy()) {
-			InternalEObject oldPostcondition = (InternalEObject) postcondition;
-			postcondition = (Constraint) eResolveProxy(oldPostcondition);
-			if (postcondition != oldPostcondition) {
-				InternalEObject newPostcondition = (InternalEObject) postcondition;
-				NotificationChain msgs = oldPostcondition.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.ACTIVITY__POSTCONDITION, null,
-						null);
-				if (newPostcondition.eInternalContainer() == null) {
-					msgs = newPostcondition.eInverseAdd(this,
-							EOPPOSITE_FEATURE_BASE
-									- UmaPackage.ACTIVITY__POSTCONDITION, null,
-							msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.ACTIVITY__POSTCONDITION,
-							oldPostcondition, postcondition));
-			}
-		}
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPostcondition() {
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPostcondition(Constraint newPostcondition,
-			NotificationChain msgs) {
-		Constraint oldPostcondition = postcondition;
-		postcondition = newPostcondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.ACTIVITY__POSTCONDITION,
-					oldPostcondition, newPostcondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPostcondition(Constraint newPostcondition) {
-		if (newPostcondition != postcondition) {
-			NotificationChain msgs = null;
-			if (postcondition != null)
-				msgs = ((InternalEObject) postcondition).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.ACTIVITY__POSTCONDITION, null,
-						msgs);
-			if (newPostcondition != null)
-				msgs = ((InternalEObject) newPostcondition).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.ACTIVITY__POSTCONDITION, null,
-						msgs);
-			msgs = basicSetPostcondition(newPostcondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY__POSTCONDITION, newPostcondition,
-					newPostcondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getBreakdownElements() {
-		if (breakdownElements == null) {
-			breakdownElements = new EObjectWithInverseResolvingEList(
-					BreakdownElement.class, this,
-					UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS,
-					UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES);
-		}
-		return breakdownElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getRoadmaps() {
-		if (roadmaps == null) {
-			roadmaps = new EObjectResolvingEList(Roadmap.class, this,
-					UmaPackage.ACTIVITY__ROADMAPS);
-		}
-		return roadmaps;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSupportingMaterials() {
-		if (supportingMaterials == null) {
-			supportingMaterials = new EObjectResolvingEList(
-					SupportingMaterial.class, this,
-					UmaPackage.ACTIVITY__SUPPORTING_MATERIALS);
-		}
-		return supportingMaterials;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getExamples() {
-		if (examples == null) {
-			examples = new EObjectResolvingEList(Example.class, this,
-					UmaPackage.ACTIVITY__EXAMPLES);
-		}
-		return examples;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getGuidelines() {
-		if (guidelines == null) {
-			guidelines = new EObjectResolvingEList(Guideline.class, this,
-					UmaPackage.ACTIVITY__GUIDELINES);
-		}
-		return guidelines;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getReusableAssets() {
-		if (reusableAssets == null) {
-			reusableAssets = new EObjectResolvingEList(ReusableAsset.class,
-					this, UmaPackage.ACTIVITY__REUSABLE_ASSETS);
-		}
-		return reusableAssets;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsEnactable() {
-		return isEnactable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsEnactable(Boolean newIsEnactable) {
-		Boolean oldIsEnactable = isEnactable;
-		isEnactable = newIsEnactable;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ACTIVITY__IS_ENACTABLE, oldIsEnactable,
-					isEnactable));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-			return ((InternalEList) getBreakdownElements()).basicAdd(otherEnd,
-					msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY__PRECONDITION:
-			return basicSetPrecondition(null, msgs);
-		case UmaPackage.ACTIVITY__POSTCONDITION:
-			return basicSetPostcondition(null, msgs);
-		case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-			return ((InternalEList) getBreakdownElements()).basicRemove(
-					otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-			return getVariabilityType();
-		case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-			if (resolve)
-				return getVariabilityBasedOnElement();
-			return basicGetVariabilityBasedOnElement();
-		case UmaPackage.ACTIVITY__PRECONDITION:
-			if (resolve)
-				return getPrecondition();
-			return basicGetPrecondition();
-		case UmaPackage.ACTIVITY__POSTCONDITION:
-			if (resolve)
-				return getPostcondition();
-			return basicGetPostcondition();
-		case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-			return getBreakdownElements();
-		case UmaPackage.ACTIVITY__ROADMAPS:
-			return getRoadmaps();
-		case UmaPackage.ACTIVITY__SUPPORTING_MATERIALS:
-			return getSupportingMaterials();
-		case UmaPackage.ACTIVITY__CHECKLISTS:
-			return getChecklists();
-		case UmaPackage.ACTIVITY__CONCEPTS:
-			return getConcepts();
-		case UmaPackage.ACTIVITY__EXAMPLES:
-			return getExamples();
-		case UmaPackage.ACTIVITY__GUIDELINES:
-			return getGuidelines();
-		case UmaPackage.ACTIVITY__REUSABLE_ASSETS:
-			return getReusableAssets();
-		case UmaPackage.ACTIVITY__IS_ENACTABLE:
-			return getIsEnactable();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-			setVariabilityType((VariabilityType) newValue);
-			return;
-		case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-			setVariabilityBasedOnElement((VariabilityElement) newValue);
-			return;
-		case UmaPackage.ACTIVITY__PRECONDITION:
-			setPrecondition((Constraint) newValue);
-			return;
-		case UmaPackage.ACTIVITY__POSTCONDITION:
-			setPostcondition((Constraint) newValue);
-			return;
-		case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-			getBreakdownElements().clear();
-			getBreakdownElements().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__ROADMAPS:
-			getRoadmaps().clear();
-			getRoadmaps().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__SUPPORTING_MATERIALS:
-			getSupportingMaterials().clear();
-			getSupportingMaterials().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__CHECKLISTS:
-			getChecklists().clear();
-			getChecklists().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__CONCEPTS:
-			getConcepts().clear();
-			getConcepts().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__EXAMPLES:
-			getExamples().clear();
-			getExamples().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__GUIDELINES:
-			getGuidelines().clear();
-			getGuidelines().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__REUSABLE_ASSETS:
-			getReusableAssets().clear();
-			getReusableAssets().addAll((Collection) newValue);
-			return;
-		case UmaPackage.ACTIVITY__IS_ENACTABLE:
-			setIsEnactable((Boolean) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-			setVariabilityType(VARIABILITY_TYPE_EDEFAULT);
-			return;
-		case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-			setVariabilityBasedOnElement((VariabilityElement) null);
-			return;
-		case UmaPackage.ACTIVITY__PRECONDITION:
-			setPrecondition((Constraint) null);
-			return;
-		case UmaPackage.ACTIVITY__POSTCONDITION:
-			setPostcondition((Constraint) null);
-			return;
-		case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-			getBreakdownElements().clear();
-			return;
-		case UmaPackage.ACTIVITY__ROADMAPS:
-			getRoadmaps().clear();
-			return;
-		case UmaPackage.ACTIVITY__SUPPORTING_MATERIALS:
-			getSupportingMaterials().clear();
-			return;
-		case UmaPackage.ACTIVITY__CHECKLISTS:
-			getChecklists().clear();
-			return;
-		case UmaPackage.ACTIVITY__CONCEPTS:
-			getConcepts().clear();
-			return;
-		case UmaPackage.ACTIVITY__EXAMPLES:
-			getExamples().clear();
-			return;
-		case UmaPackage.ACTIVITY__GUIDELINES:
-			getGuidelines().clear();
-			return;
-		case UmaPackage.ACTIVITY__REUSABLE_ASSETS:
-			getReusableAssets().clear();
-			return;
-		case UmaPackage.ACTIVITY__IS_ENACTABLE:
-			setIsEnactable(IS_ENACTABLE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-			return variabilityType != VARIABILITY_TYPE_EDEFAULT;
-		case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-			return variabilityBasedOnElement != null;
-		case UmaPackage.ACTIVITY__PRECONDITION:
-			return precondition != null;
-		case UmaPackage.ACTIVITY__POSTCONDITION:
-			return postcondition != null;
-		case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS:
-			return breakdownElements != null && !breakdownElements.isEmpty();
-		case UmaPackage.ACTIVITY__ROADMAPS:
-			return roadmaps != null && !roadmaps.isEmpty();
-		case UmaPackage.ACTIVITY__SUPPORTING_MATERIALS:
-			return supportingMaterials != null
-					&& !supportingMaterials.isEmpty();
-		case UmaPackage.ACTIVITY__CHECKLISTS:
-			return checklists != null && !checklists.isEmpty();
-		case UmaPackage.ACTIVITY__CONCEPTS:
-			return concepts != null && !concepts.isEmpty();
-		case UmaPackage.ACTIVITY__EXAMPLES:
-			return examples != null && !examples.isEmpty();
-		case UmaPackage.ACTIVITY__GUIDELINES:
-			return guidelines != null && !guidelines.isEmpty();
-		case UmaPackage.ACTIVITY__REUSABLE_ASSETS:
-			return reusableAssets != null && !reusableAssets.isEmpty();
-		case UmaPackage.ACTIVITY__IS_ENACTABLE:
-			return IS_ENACTABLE_EDEFAULT == null ? isEnactable != null
-					: !IS_ENACTABLE_EDEFAULT.equals(isEnactable);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-		if (baseClass == VariabilityElement.class) {
-			switch (derivedFeatureID) {
-			case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-				return UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE;
-			case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-				return UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-			default:
-				return -1;
-			}
-		}
-		if (baseClass == WorkDefinition.class) {
-			switch (derivedFeatureID) {
-			case UmaPackage.ACTIVITY__PRECONDITION:
-				return UmaPackage.WORK_DEFINITION__PRECONDITION;
-			case UmaPackage.ACTIVITY__POSTCONDITION:
-				return UmaPackage.WORK_DEFINITION__POSTCONDITION;
-			default:
-				return -1;
-			}
-		}
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-		if (baseClass == VariabilityElement.class) {
-			switch (baseFeatureID) {
-			case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE:
-				return UmaPackage.ACTIVITY__VARIABILITY_TYPE;
-			case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-				return UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT;
-			default:
-				return -1;
-			}
-		}
-		if (baseClass == WorkDefinition.class) {
-			switch (baseFeatureID) {
-			case UmaPackage.WORK_DEFINITION__PRECONDITION:
-				return UmaPackage.ACTIVITY__PRECONDITION;
-			case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-				return UmaPackage.ACTIVITY__POSTCONDITION;
-			default:
-				return -1;
-			}
-		}
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (variabilityType: "); //$NON-NLS-1$
-		result.append(variabilityType);
-		result.append(", isEnactable: "); //$NON-NLS-1$
-		result.append(isEnactable);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ActivityImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ArtifactDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ArtifactDescriptionImpl.java
deleted file mode 100644
index ee871fd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ArtifactDescriptionImpl.java
+++ /dev/null
@@ -1,356 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.ArtifactDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Artifact Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ArtifactDescriptionImpl#getBriefOutline <em>Brief Outline</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ArtifactDescriptionImpl#getRepresentationOptions <em>Representation Options</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ArtifactDescriptionImpl#getRepresentation <em>Representation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ArtifactDescriptionImpl#getNotation <em>Notation</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ArtifactDescriptionImpl extends WorkProductDescriptionImpl
-		implements ArtifactDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getBriefOutline() <em>Brief Outline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefOutline()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BRIEF_OUTLINE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getBriefOutline() <em>Brief Outline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefOutline()
-	 * @generated
-	 * @ordered
-	 */
-	protected String briefOutline = BRIEF_OUTLINE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRepresentationOptions() <em>Representation Options</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentationOptions()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REPRESENTATION_OPTIONS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getRepresentationOptions() <em>Representation Options</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentationOptions()
-	 * @generated
-	 * @ordered
-	 */
-	protected String representationOptions = REPRESENTATION_OPTIONS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRepresentation() <em>Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REPRESENTATION_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getRepresentation() <em>Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String representation = REPRESENTATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNotation() <em>Notation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NOTATION_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getNotation() <em>Notation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String notation = NOTATION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArtifactDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ARTIFACT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBriefOutline() {
-		return briefOutline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBriefOutline(String newBriefOutline) {
-		String oldBriefOutline = briefOutline;
-		briefOutline = newBriefOutline;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE,
-					oldBriefOutline, briefOutline));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRepresentationOptions() {
-		return representationOptions;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRepresentationOptions(String newRepresentationOptions) {
-		String oldRepresentationOptions = representationOptions;
-		representationOptions = newRepresentationOptions;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS,
-					oldRepresentationOptions, representationOptions));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRepresentation() {
-		return representation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRepresentation(String newRepresentation) {
-		String oldRepresentation = representation;
-		representation = newRepresentation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION,
-					oldRepresentation, representation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNotation() {
-		return notation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNotation(String newNotation) {
-		String oldNotation = notation;
-		notation = newNotation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ARTIFACT_DESCRIPTION__NOTATION, oldNotation,
-					notation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-			return getBriefOutline();
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-			return getRepresentationOptions();
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-			return getRepresentation();
-		case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-			return getNotation();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-			setBriefOutline((String) newValue);
-			return;
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-			setRepresentationOptions((String) newValue);
-			return;
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-			setRepresentation((String) newValue);
-			return;
-		case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-			setNotation((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-			setBriefOutline(BRIEF_OUTLINE_EDEFAULT);
-			return;
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-			setRepresentationOptions(REPRESENTATION_OPTIONS_EDEFAULT);
-			return;
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-			setRepresentation(REPRESENTATION_EDEFAULT);
-			return;
-		case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-			setNotation(NOTATION_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-			return BRIEF_OUTLINE_EDEFAULT == null ? briefOutline != null
-					: !BRIEF_OUTLINE_EDEFAULT.equals(briefOutline);
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-			return REPRESENTATION_OPTIONS_EDEFAULT == null ? representationOptions != null
-					: !REPRESENTATION_OPTIONS_EDEFAULT
-							.equals(representationOptions);
-		case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-			return REPRESENTATION_EDEFAULT == null ? representation != null
-					: !REPRESENTATION_EDEFAULT.equals(representation);
-		case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-			return NOTATION_EDEFAULT == null ? notation != null
-					: !NOTATION_EDEFAULT.equals(notation);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (briefOutline: "); //$NON-NLS-1$
-		result.append(briefOutline);
-		result.append(", representationOptions: "); //$NON-NLS-1$
-		result.append(representationOptions);
-		result.append(", representation: "); //$NON-NLS-1$
-		result.append(representation);
-		result.append(", notation: "); //$NON-NLS-1$
-		result.append(notation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ArtifactDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ArtifactImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ArtifactImpl.java
deleted file mode 100644
index 87e0aae..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ArtifactImpl.java
+++ /dev/null
@@ -1,285 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Artifact</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ArtifactImpl#getContainerArtifact <em>Container Artifact</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ArtifactImpl#getContainedArtifacts <em>Contained Artifacts</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ArtifactImpl extends WorkProductImpl implements Artifact {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getContainedArtifacts() <em>Contained Artifacts</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getContainedArtifacts()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList containedArtifacts = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArtifactImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ARTIFACT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Artifact getContainerArtifact() {
-		if (eContainerFeatureID != UmaPackage.ARTIFACT__CONTAINER_ARTIFACT)
-			return null;
-		return (Artifact) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Artifact basicGetContainerArtifact() {
-		if (eContainerFeatureID != UmaPackage.ARTIFACT__CONTAINER_ARTIFACT)
-			return null;
-		return (Artifact) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetContainerArtifact(
-			Artifact newContainerArtifact, NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContainerArtifact,
-				UmaPackage.ARTIFACT__CONTAINER_ARTIFACT, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setContainerArtifact(Artifact newContainerArtifact) {
-		if (newContainerArtifact != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.ARTIFACT__CONTAINER_ARTIFACT && newContainerArtifact != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newContainerArtifact))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newContainerArtifact != null)
-				msgs = ((InternalEObject) newContainerArtifact).eInverseAdd(
-						this, UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS,
-						Artifact.class, msgs);
-			msgs = basicSetContainerArtifact(newContainerArtifact, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ARTIFACT__CONTAINER_ARTIFACT,
-					newContainerArtifact, newContainerArtifact));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getContainedArtifacts() {
-		if (containedArtifacts == null) {
-			containedArtifacts = new EObjectContainmentWithInverseEList.Resolving(
-					Artifact.class, this,
-					UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS,
-					UmaPackage.ARTIFACT__CONTAINER_ARTIFACT);
-		}
-		return containedArtifacts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT__CONTAINER_ARTIFACT:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetContainerArtifact((Artifact) otherEnd, msgs);
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			return ((InternalEList) getContainedArtifacts()).basicAdd(otherEnd,
-					msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT__CONTAINER_ARTIFACT:
-			return basicSetContainerArtifact(null, msgs);
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			return ((InternalEList) getContainedArtifacts()).basicRemove(
-					otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.ARTIFACT__CONTAINER_ARTIFACT:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS, Artifact.class,
-					msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT__CONTAINER_ARTIFACT:
-			if (resolve)
-				return getContainerArtifact();
-			return basicGetContainerArtifact();
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			return getContainedArtifacts();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT__CONTAINER_ARTIFACT:
-			setContainerArtifact((Artifact) newValue);
-			return;
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			getContainedArtifacts().clear();
-			getContainedArtifacts().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ARTIFACT__CONTAINER_ARTIFACT:
-			setContainerArtifact((Artifact) null);
-			return;
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			getContainedArtifacts().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ARTIFACT__CONTAINER_ARTIFACT:
-			return basicGetContainerArtifact() != null;
-		case UmaPackage.ARTIFACT__CONTAINED_ARTIFACTS:
-			return containedArtifacts != null && !containedArtifacts.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ArtifactImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/BreakdownElementDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/BreakdownElementDescriptionImpl.java
deleted file mode 100644
index b497815..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/BreakdownElementDescriptionImpl.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Breakdown Element Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementDescriptionImpl#getUsageGuidance <em>Usage Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BreakdownElementDescriptionImpl extends ContentDescriptionImpl
-		implements BreakdownElementDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getUsageGuidance() <em>Usage Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String USAGE_GUIDANCE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getUsageGuidance() <em>Usage Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected String usageGuidance = USAGE_GUIDANCE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BreakdownElementDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.BREAKDOWN_ELEMENT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getUsageGuidance() {
-		return usageGuidance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUsageGuidance(String newUsageGuidance) {
-		String oldUsageGuidance = usageGuidance;
-		usageGuidance = newUsageGuidance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE,
-					oldUsageGuidance, usageGuidance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-			return getUsageGuidance();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-			setUsageGuidance((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-			setUsageGuidance(USAGE_GUIDANCE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-			return USAGE_GUIDANCE_EDEFAULT == null ? usageGuidance != null
-					: !USAGE_GUIDANCE_EDEFAULT.equals(usageGuidance);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (usageGuidance: "); //$NON-NLS-1$
-		result.append(usageGuidance);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BreakdownElementDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/BreakdownElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/BreakdownElementImpl.java
deleted file mode 100644
index 6dc9579..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/BreakdownElementImpl.java
+++ /dev/null
@@ -1,737 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.PlanningData;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getPrefix <em>Prefix</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getIsPlanned <em>Is Planned</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getHasMultipleOccurrences <em>Has Multiple Occurrences</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getIsOptional <em>Is Optional</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getPresentedAfter <em>Presented After</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getPresentedBefore <em>Presented Before</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getPlanningData <em>Planning Data</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.BreakdownElementImpl#getSuperActivities <em>Super Activities</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class BreakdownElementImpl extends ProcessElementImpl implements
-		BreakdownElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrefix()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PREFIX_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrefix()
-	 * @generated
-	 * @ordered
-	 */
-	protected String prefix = PREFIX_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getIsPlanned() <em>Is Planned</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsPlanned()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_PLANNED_EDEFAULT = Boolean.TRUE;
-
-	/**
-	 * The cached value of the '{@link #getIsPlanned() <em>Is Planned</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsPlanned()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isPlanned = IS_PLANNED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHasMultipleOccurrences() <em>Has Multiple Occurrences</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHasMultipleOccurrences()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean HAS_MULTIPLE_OCCURRENCES_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getHasMultipleOccurrences() <em>Has Multiple Occurrences</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHasMultipleOccurrences()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean hasMultipleOccurrences = HAS_MULTIPLE_OCCURRENCES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getIsOptional() <em>Is Optional</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsOptional()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_OPTIONAL_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getIsOptional() <em>Is Optional</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsOptional()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isOptional = IS_OPTIONAL_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getPresentedAfter() <em>Presented After</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentedAfter()
-	 * @generated
-	 * @ordered
-	 */
-	protected BreakdownElement presentedAfter = null;
-
-	/**
-	 * The cached value of the '{@link #getPresentedBefore() <em>Presented Before</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentedBefore()
-	 * @generated
-	 * @ordered
-	 */
-	protected BreakdownElement presentedBefore = null;
-
-	/**
-	 * The cached value of the '{@link #getPlanningData() <em>Planning Data</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPlanningData()
-	 * @generated
-	 * @ordered
-	 */
-	protected PlanningData planningData = null;
-
-	/**
-	 * The cached value of the '{@link #getSuperActivities() <em>Super Activities</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuperActivities()
-	 * @generated
-	 * @ordered
-	 */
-	protected Activity superActivities = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BreakdownElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.BREAKDOWN_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrefix(String newPrefix) {
-		String oldPrefix = prefix;
-		prefix = newPrefix;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__PREFIX, oldPrefix, prefix));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsPlanned() {
-		return isPlanned;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsPlanned(Boolean newIsPlanned) {
-		Boolean oldIsPlanned = isPlanned;
-		isPlanned = newIsPlanned;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED, oldIsPlanned,
-					isPlanned));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getHasMultipleOccurrences() {
-		return hasMultipleOccurrences;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHasMultipleOccurrences(Boolean newHasMultipleOccurrences) {
-		Boolean oldHasMultipleOccurrences = hasMultipleOccurrences;
-		hasMultipleOccurrences = newHasMultipleOccurrences;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES,
-					oldHasMultipleOccurrences, hasMultipleOccurrences));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsOptional() {
-		return isOptional;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsOptional(Boolean newIsOptional) {
-		Boolean oldIsOptional = isOptional;
-		isOptional = newIsOptional;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL, oldIsOptional,
-					isOptional));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElement getPresentedAfter() {
-		if (presentedAfter != null && ((EObject) presentedAfter).eIsProxy()) {
-			InternalEObject oldPresentedAfter = (InternalEObject) presentedAfter;
-			presentedAfter = (BreakdownElement) eResolveProxy(oldPresentedAfter);
-			if (presentedAfter != oldPresentedAfter) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER,
-							oldPresentedAfter, presentedAfter));
-			}
-		}
-		return presentedAfter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElement basicGetPresentedAfter() {
-		return presentedAfter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentedAfter(BreakdownElement newPresentedAfter) {
-		BreakdownElement oldPresentedAfter = presentedAfter;
-		presentedAfter = newPresentedAfter;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER,
-					oldPresentedAfter, presentedAfter));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElement getPresentedBefore() {
-		if (presentedBefore != null && ((EObject) presentedBefore).eIsProxy()) {
-			InternalEObject oldPresentedBefore = (InternalEObject) presentedBefore;
-			presentedBefore = (BreakdownElement) eResolveProxy(oldPresentedBefore);
-			if (presentedBefore != oldPresentedBefore) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE,
-							oldPresentedBefore, presentedBefore));
-			}
-		}
-		return presentedBefore;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElement basicGetPresentedBefore() {
-		return presentedBefore;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentedBefore(BreakdownElement newPresentedBefore) {
-		BreakdownElement oldPresentedBefore = presentedBefore;
-		presentedBefore = newPresentedBefore;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE,
-					oldPresentedBefore, presentedBefore));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlanningData getPlanningData() {
-		if (planningData != null && ((EObject) planningData).eIsProxy()) {
-			InternalEObject oldPlanningData = (InternalEObject) planningData;
-			planningData = (PlanningData) eResolveProxy(oldPlanningData);
-			if (planningData != oldPlanningData) {
-				InternalEObject newPlanningData = (InternalEObject) planningData;
-				NotificationChain msgs = oldPlanningData.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA,
-						null, null);
-				if (newPlanningData.eInternalContainer() == null) {
-					msgs = newPlanningData
-							.eInverseAdd(
-									this,
-									EOPPOSITE_FEATURE_BASE
-											- UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA,
-									null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA,
-							oldPlanningData, planningData));
-			}
-		}
-		return planningData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlanningData basicGetPlanningData() {
-		return planningData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPlanningData(PlanningData newPlanningData,
-			NotificationChain msgs) {
-		PlanningData oldPlanningData = planningData;
-		planningData = newPlanningData;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA,
-					oldPlanningData, newPlanningData);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPlanningData(PlanningData newPlanningData) {
-		if (newPlanningData != planningData) {
-			NotificationChain msgs = null;
-			if (planningData != null)
-				msgs = ((InternalEObject) planningData).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA,
-						null, msgs);
-			if (newPlanningData != null)
-				msgs = ((InternalEObject) newPlanningData).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA,
-						null, msgs);
-			msgs = basicSetPlanningData(newPlanningData, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA,
-					newPlanningData, newPlanningData));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Activity getSuperActivities() {
-		if (superActivities != null && ((EObject) superActivities).eIsProxy()) {
-			InternalEObject oldSuperActivities = (InternalEObject) superActivities;
-			superActivities = (Activity) eResolveProxy(oldSuperActivities);
-			if (superActivities != oldSuperActivities) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES,
-							oldSuperActivities, superActivities));
-			}
-		}
-		return superActivities;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Activity basicGetSuperActivities() {
-		return superActivities;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuperActivities(
-			Activity newSuperActivities, NotificationChain msgs) {
-		Activity oldSuperActivities = superActivities;
-		superActivities = newSuperActivities;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES,
-					oldSuperActivities, newSuperActivities);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuperActivities(Activity newSuperActivities) {
-		if (newSuperActivities != superActivities) {
-			NotificationChain msgs = null;
-			if (superActivities != null)
-				msgs = ((InternalEObject) superActivities).eInverseRemove(this,
-						UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS,
-						Activity.class, msgs);
-			if (newSuperActivities != null)
-				msgs = ((InternalEObject) newSuperActivities).eInverseAdd(this,
-						UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS,
-						Activity.class, msgs);
-			msgs = basicSetSuperActivities(newSuperActivities, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES,
-					newSuperActivities, newSuperActivities));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES:
-			if (superActivities != null)
-				msgs = ((InternalEObject) superActivities).eInverseRemove(this,
-						UmaPackage.ACTIVITY__BREAKDOWN_ELEMENTS,
-						Activity.class, msgs);
-			return basicSetSuperActivities((Activity) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-			return basicSetPlanningData(null, msgs);
-		case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES:
-			return basicSetSuperActivities(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-			return getPrefix();
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-			return getIsPlanned();
-		case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-			return getHasMultipleOccurrences();
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-			return getIsOptional();
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-			if (resolve)
-				return getPresentedAfter();
-			return basicGetPresentedAfter();
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-			if (resolve)
-				return getPresentedBefore();
-			return basicGetPresentedBefore();
-		case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-			if (resolve)
-				return getPlanningData();
-			return basicGetPlanningData();
-		case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES:
-			if (resolve)
-				return getSuperActivities();
-			return basicGetSuperActivities();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-			setPrefix((String) newValue);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-			setIsPlanned((Boolean) newValue);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-			setHasMultipleOccurrences((Boolean) newValue);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-			setIsOptional((Boolean) newValue);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-			setPresentedAfter((BreakdownElement) newValue);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-			setPresentedBefore((BreakdownElement) newValue);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-			setPlanningData((PlanningData) newValue);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES:
-			setSuperActivities((Activity) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-			setPrefix(PREFIX_EDEFAULT);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-			setIsPlanned(IS_PLANNED_EDEFAULT);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-			setHasMultipleOccurrences(HAS_MULTIPLE_OCCURRENCES_EDEFAULT);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-			setIsOptional(IS_OPTIONAL_EDEFAULT);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-			setPresentedAfter((BreakdownElement) null);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-			setPresentedBefore((BreakdownElement) null);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-			setPlanningData((PlanningData) null);
-			return;
-		case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES:
-			setSuperActivities((Activity) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-			return PREFIX_EDEFAULT == null ? prefix != null : !PREFIX_EDEFAULT
-					.equals(prefix);
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-			return IS_PLANNED_EDEFAULT == null ? isPlanned != null
-					: !IS_PLANNED_EDEFAULT.equals(isPlanned);
-		case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-			return HAS_MULTIPLE_OCCURRENCES_EDEFAULT == null ? hasMultipleOccurrences != null
-					: !HAS_MULTIPLE_OCCURRENCES_EDEFAULT
-							.equals(hasMultipleOccurrences);
-		case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-			return IS_OPTIONAL_EDEFAULT == null ? isOptional != null
-					: !IS_OPTIONAL_EDEFAULT.equals(isOptional);
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-			return presentedAfter != null;
-		case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-			return presentedBefore != null;
-		case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-			return planningData != null;
-		case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITIES:
-			return superActivities != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (prefix: "); //$NON-NLS-1$
-		result.append(prefix);
-		result.append(", isPlanned: "); //$NON-NLS-1$
-		result.append(isPlanned);
-		result.append(", hasMultipleOccurrences: "); //$NON-NLS-1$
-		result.append(hasMultipleOccurrences);
-		result.append(", isOptional: "); //$NON-NLS-1$
-		result.append(isOptional);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BreakdownElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CapabilityPatternImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CapabilityPatternImpl.java
deleted file mode 100644
index 5f5739a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CapabilityPatternImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Capability Pattern</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class CapabilityPatternImpl extends ProcessImpl implements
-		CapabilityPattern {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CapabilityPatternImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CAPABILITY_PATTERN;
-	}
-
-} //CapabilityPatternImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ChecklistImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ChecklistImpl.java
deleted file mode 100644
index 7265421..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ChecklistImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Checklist</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ChecklistImpl extends GuidanceImpl implements Checklist {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ChecklistImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CHECKLIST;
-	}
-
-} //ChecklistImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ClassifierImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ClassifierImpl.java
deleted file mode 100644
index 7c033ff..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ClassifierImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Classifier;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Classifier</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class ClassifierImpl extends TypeImpl implements Classifier {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClassifierImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CLASSIFIER;
-	}
-
-} //ClassifierImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CompositeRoleImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CompositeRoleImpl.java
deleted file mode 100644
index c2bb13a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CompositeRoleImpl.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Composite Role</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.CompositeRoleImpl#getAggregatedRoles <em>Aggregated Roles</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class CompositeRoleImpl extends RoleDescriptorImpl implements
-		CompositeRole {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getAggregatedRoles() <em>Aggregated Roles</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAggregatedRoles()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList aggregatedRoles = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CompositeRoleImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.COMPOSITE_ROLE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAggregatedRoles() {
-		if (aggregatedRoles == null) {
-			aggregatedRoles = new EObjectResolvingEList(Role.class, this,
-					UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLES);
-		}
-		return aggregatedRoles;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLES:
-			return getAggregatedRoles();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLES:
-			getAggregatedRoles().clear();
-			getAggregatedRoles().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLES:
-			getAggregatedRoles().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLES:
-			return aggregatedRoles != null && !aggregatedRoles.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //CompositeRoleImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ConceptImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ConceptImpl.java
deleted file mode 100644
index 90353ee..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ConceptImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Concept</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ConceptImpl extends GuidanceImpl implements Concept {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConceptImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONCEPT;
-	}
-
-} //ConceptImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ConstraintImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ConstraintImpl.java
deleted file mode 100644
index de8d691..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ConstraintImpl.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Constraint</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ConstraintImpl#getBody <em>Body</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConstraintImpl extends MethodElementImpl implements Constraint {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getBody() <em>Body</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBody()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BODY_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getBody() <em>Body</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBody()
-	 * @generated
-	 * @ordered
-	 */
-	protected String body = BODY_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConstraintImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONSTRAINT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBody() {
-		return body;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBody(String newBody) {
-		String oldBody = body;
-		body = newBody;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.CONSTRAINT__BODY, oldBody, body));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.CONSTRAINT__BODY:
-			return getBody();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.CONSTRAINT__BODY:
-			setBody((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.CONSTRAINT__BODY:
-			setBody(BODY_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.CONSTRAINT__BODY:
-			return BODY_EDEFAULT == null ? body != null : !BODY_EDEFAULT
-					.equals(body);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (body: "); //$NON-NLS-1$
-		result.append(body);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConstraintImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentCategoryImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentCategoryImpl.java
deleted file mode 100644
index 0658a74..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentCategoryImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Category</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class ContentCategoryImpl extends ContentElementImpl implements
-		ContentCategory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentCategoryImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_CATEGORY;
-	}
-
-} //ContentCategoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentDescriptionImpl.java
deleted file mode 100644
index f6ce864..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentDescriptionImpl.java
+++ /dev/null
@@ -1,356 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentDescriptionImpl#getMainDescription <em>Main Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentDescriptionImpl#getSections <em>Sections</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentDescriptionImpl#getExternalId <em>External Id</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentDescriptionImpl#getKeyConsiderations <em>Key Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContentDescriptionImpl extends MethodUnitImpl implements
-		ContentDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getMainDescription() <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMainDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MAIN_DESCRIPTION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getMainDescription() <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMainDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String mainDescription = MAIN_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getSections() <em>Sections</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSections()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList sections = null;
-
-	/**
-	 * The default value of the '{@link #getExternalId() <em>External Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String EXTERNAL_ID_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getExternalId() <em>External Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String externalId = EXTERNAL_ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getKeyConsiderations() <em>Key Considerations</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKeyConsiderations()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String KEY_CONSIDERATIONS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getKeyConsiderations() <em>Key Considerations</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKeyConsiderations()
-	 * @generated
-	 * @ordered
-	 */
-	protected String keyConsiderations = KEY_CONSIDERATIONS_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getMainDescription() {
-		return mainDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMainDescription(String newMainDescription) {
-		String oldMainDescription = mainDescription;
-		mainDescription = newMainDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION,
-					oldMainDescription, mainDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSections() {
-		if (sections == null) {
-			sections = new EObjectContainmentEList.Resolving(Section.class,
-					this, UmaPackage.CONTENT_DESCRIPTION__SECTIONS);
-		}
-		return sections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getExternalId() {
-		return externalId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalId(String newExternalId) {
-		String oldExternalId = externalId;
-		externalId = newExternalId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID, oldExternalId,
-					externalId));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getKeyConsiderations() {
-		return keyConsiderations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKeyConsiderations(String newKeyConsiderations) {
-		String oldKeyConsiderations = keyConsiderations;
-		keyConsiderations = newKeyConsiderations;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS,
-					oldKeyConsiderations, keyConsiderations));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_DESCRIPTION__SECTIONS:
-			return ((InternalEList) getSections()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-			return getMainDescription();
-		case UmaPackage.CONTENT_DESCRIPTION__SECTIONS:
-			return getSections();
-		case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-			return getExternalId();
-		case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-			return getKeyConsiderations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-			setMainDescription((String) newValue);
-			return;
-		case UmaPackage.CONTENT_DESCRIPTION__SECTIONS:
-			getSections().clear();
-			getSections().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-			setExternalId((String) newValue);
-			return;
-		case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-			setKeyConsiderations((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-			setMainDescription(MAIN_DESCRIPTION_EDEFAULT);
-			return;
-		case UmaPackage.CONTENT_DESCRIPTION__SECTIONS:
-			getSections().clear();
-			return;
-		case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-			setExternalId(EXTERNAL_ID_EDEFAULT);
-			return;
-		case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-			setKeyConsiderations(KEY_CONSIDERATIONS_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-			return MAIN_DESCRIPTION_EDEFAULT == null ? mainDescription != null
-					: !MAIN_DESCRIPTION_EDEFAULT.equals(mainDescription);
-		case UmaPackage.CONTENT_DESCRIPTION__SECTIONS:
-			return sections != null && !sections.isEmpty();
-		case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-			return EXTERNAL_ID_EDEFAULT == null ? externalId != null
-					: !EXTERNAL_ID_EDEFAULT.equals(externalId);
-		case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-			return KEY_CONSIDERATIONS_EDEFAULT == null ? keyConsiderations != null
-					: !KEY_CONSIDERATIONS_EDEFAULT.equals(keyConsiderations);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (mainDescription: "); //$NON-NLS-1$
-		result.append(mainDescription);
-		result.append(", externalId: "); //$NON-NLS-1$
-		result.append(externalId);
-		result.append(", keyConsiderations: "); //$NON-NLS-1$
-		result.append(keyConsiderations);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ContentDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentElementImpl.java
deleted file mode 100644
index f735ebe..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentElementImpl.java
+++ /dev/null
@@ -1,576 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getVariabilityType <em>Variability Type</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getSupportingMaterials <em>Supporting Materials</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getConceptsAndPapers <em>Concepts And Papers</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getChecklists <em>Checklists</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getGuidelines <em>Guidelines</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getExamples <em>Examples</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getAssets <em>Assets</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentElementImpl#getTermDefinition <em>Term Definition</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ContentElementImpl extends DescribableElementImpl
-		implements ContentElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final VariabilityType VARIABILITY_TYPE_EDEFAULT = VariabilityType.NA_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityType variabilityType = VARIABILITY_TYPE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityElement variabilityBasedOnElement = null;
-
-	/**
-	 * The cached value of the '{@link #getSupportingMaterials() <em>Supporting Materials</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSupportingMaterials()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList supportingMaterials = null;
-
-	/**
-	 * The cached value of the '{@link #getConceptsAndPapers() <em>Concepts And Papers</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConceptsAndPapers()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList conceptsAndPapers = null;
-
-	/**
-	 * The cached value of the '{@link #getChecklists() <em>Checklists</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChecklists()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList checklists = null;
-
-	/**
-	 * The cached value of the '{@link #getGuidelines() <em>Guidelines</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGuidelines()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList guidelines = null;
-
-	/**
-	 * The cached value of the '{@link #getExamples() <em>Examples</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExamples()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList examples = null;
-
-	/**
-	 * The cached value of the '{@link #getAssets() <em>Assets</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssets()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList assets = null;
-
-	/**
-	 * The cached value of the '{@link #getTermDefinition() <em>Term Definition</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTermDefinition()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList termDefinition = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType getVariabilityType() {
-		return variabilityType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityType(VariabilityType newVariabilityType) {
-		VariabilityType oldVariabilityType = variabilityType;
-		variabilityType = newVariabilityType == null ? VARIABILITY_TYPE_EDEFAULT
-				: newVariabilityType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE,
-					oldVariabilityType, variabilityType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityElement getVariabilityBasedOnElement() {
-		if (variabilityBasedOnElement != null
-				&& ((EObject) variabilityBasedOnElement).eIsProxy()) {
-			InternalEObject oldVariabilityBasedOnElement = (InternalEObject) variabilityBasedOnElement;
-			variabilityBasedOnElement = (VariabilityElement) eResolveProxy(oldVariabilityBasedOnElement);
-			if (variabilityBasedOnElement != oldVariabilityBasedOnElement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(
-							this,
-							Notification.RESOLVE,
-							UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT,
-							oldVariabilityBasedOnElement,
-							variabilityBasedOnElement));
-			}
-		}
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityElement basicGetVariabilityBasedOnElement() {
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityBasedOnElement(
-			VariabilityElement newVariabilityBasedOnElement) {
-		VariabilityElement oldVariabilityBasedOnElement = variabilityBasedOnElement;
-		variabilityBasedOnElement = newVariabilityBasedOnElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT,
-					oldVariabilityBasedOnElement, variabilityBasedOnElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getConceptsAndPapers() {
-		if (conceptsAndPapers == null) {
-			conceptsAndPapers = new EObjectResolvingEList(Concept.class, this,
-					UmaPackage.CONTENT_ELEMENT__CONCEPTS_AND_PAPERS);
-		}
-		return conceptsAndPapers;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getChecklists() {
-		if (checklists == null) {
-			checklists = new EObjectResolvingEList(Checklist.class, this,
-					UmaPackage.CONTENT_ELEMENT__CHECKLISTS);
-		}
-		return checklists;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getGuidelines() {
-		if (guidelines == null) {
-			guidelines = new EObjectResolvingEList(Guideline.class, this,
-					UmaPackage.CONTENT_ELEMENT__GUIDELINES);
-		}
-		return guidelines;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getExamples() {
-		if (examples == null) {
-			examples = new EObjectResolvingEList(Example.class, this,
-					UmaPackage.CONTENT_ELEMENT__EXAMPLES);
-		}
-		return examples;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAssets() {
-		if (assets == null) {
-			assets = new EObjectResolvingEList(ReusableAsset.class, this,
-					UmaPackage.CONTENT_ELEMENT__ASSETS);
-		}
-		return assets;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getTermDefinition() {
-		if (termDefinition == null) {
-			termDefinition = new EObjectResolvingEList(TermDefinition.class,
-					this, UmaPackage.CONTENT_ELEMENT__TERM_DEFINITION);
-		}
-		return termDefinition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-			return getVariabilityType();
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			if (resolve)
-				return getVariabilityBasedOnElement();
-			return basicGetVariabilityBasedOnElement();
-		case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIALS:
-			return getSupportingMaterials();
-		case UmaPackage.CONTENT_ELEMENT__CONCEPTS_AND_PAPERS:
-			return getConceptsAndPapers();
-		case UmaPackage.CONTENT_ELEMENT__CHECKLISTS:
-			return getChecklists();
-		case UmaPackage.CONTENT_ELEMENT__GUIDELINES:
-			return getGuidelines();
-		case UmaPackage.CONTENT_ELEMENT__EXAMPLES:
-			return getExamples();
-		case UmaPackage.CONTENT_ELEMENT__ASSETS:
-			return getAssets();
-		case UmaPackage.CONTENT_ELEMENT__TERM_DEFINITION:
-			return getTermDefinition();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-			setVariabilityType((VariabilityType) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			setVariabilityBasedOnElement((VariabilityElement) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIALS:
-			getSupportingMaterials().clear();
-			getSupportingMaterials().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__CONCEPTS_AND_PAPERS:
-			getConceptsAndPapers().clear();
-			getConceptsAndPapers().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__CHECKLISTS:
-			getChecklists().clear();
-			getChecklists().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__GUIDELINES:
-			getGuidelines().clear();
-			getGuidelines().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__EXAMPLES:
-			getExamples().clear();
-			getExamples().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__ASSETS:
-			getAssets().clear();
-			getAssets().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__TERM_DEFINITION:
-			getTermDefinition().clear();
-			getTermDefinition().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-			setVariabilityType(VARIABILITY_TYPE_EDEFAULT);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			setVariabilityBasedOnElement((VariabilityElement) null);
-			return;
-		case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIALS:
-			getSupportingMaterials().clear();
-			return;
-		case UmaPackage.CONTENT_ELEMENT__CONCEPTS_AND_PAPERS:
-			getConceptsAndPapers().clear();
-			return;
-		case UmaPackage.CONTENT_ELEMENT__CHECKLISTS:
-			getChecklists().clear();
-			return;
-		case UmaPackage.CONTENT_ELEMENT__GUIDELINES:
-			getGuidelines().clear();
-			return;
-		case UmaPackage.CONTENT_ELEMENT__EXAMPLES:
-			getExamples().clear();
-			return;
-		case UmaPackage.CONTENT_ELEMENT__ASSETS:
-			getAssets().clear();
-			return;
-		case UmaPackage.CONTENT_ELEMENT__TERM_DEFINITION:
-			getTermDefinition().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-			return variabilityType != VARIABILITY_TYPE_EDEFAULT;
-		case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			return variabilityBasedOnElement != null;
-		case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIALS:
-			return supportingMaterials != null
-					&& !supportingMaterials.isEmpty();
-		case UmaPackage.CONTENT_ELEMENT__CONCEPTS_AND_PAPERS:
-			return conceptsAndPapers != null && !conceptsAndPapers.isEmpty();
-		case UmaPackage.CONTENT_ELEMENT__CHECKLISTS:
-			return checklists != null && !checklists.isEmpty();
-		case UmaPackage.CONTENT_ELEMENT__GUIDELINES:
-			return guidelines != null && !guidelines.isEmpty();
-		case UmaPackage.CONTENT_ELEMENT__EXAMPLES:
-			return examples != null && !examples.isEmpty();
-		case UmaPackage.CONTENT_ELEMENT__ASSETS:
-			return assets != null && !assets.isEmpty();
-		case UmaPackage.CONTENT_ELEMENT__TERM_DEFINITION:
-			return termDefinition != null && !termDefinition.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSupportingMaterials() {
-		if (supportingMaterials == null) {
-			supportingMaterials = new EObjectResolvingEList(
-					SupportingMaterial.class, this,
-					UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIALS);
-		}
-		return supportingMaterials;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-		if (baseClass == VariabilityElement.class) {
-			switch (derivedFeatureID) {
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-				return UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE;
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-				return UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-			default:
-				return -1;
-			}
-		}
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-		if (baseClass == VariabilityElement.class) {
-			switch (baseFeatureID) {
-			case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE:
-				return UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE;
-			case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-				return UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-			default:
-				return -1;
-			}
-		}
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (variabilityType: "); //$NON-NLS-1$
-		result.append(variabilityType);
-		result.append(')');
-		return result.toString();
-	}
-
-	//
-	// Start custom code
-	//
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.impl.NamedElementImpl#setName(java.lang.String)
-	 */
-	public void setName(String newName) {
-		if (presentation == null) {
-			super.setName(newName);
-			return;
-		}
-
-		String oldName = name;
-		super.setName(newName);
-		if (newName != null && !newName.equals(oldName)) {
-			presentation.setName(UmaUtil.createContentDescriptionName(this));
-		}
-	}
-
-} //ContentElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentPackageImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentPackageImpl.java
deleted file mode 100644
index 8e70c0c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ContentPackageImpl.java
+++ /dev/null
@@ -1,171 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ContentPackageImpl#getContentElements <em>Content Elements</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContentPackageImpl extends MethodPackageImpl implements
-		ContentPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getContentElements() <em>Content Elements</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getContentElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList contentElements = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentPackageImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_PACKAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getContentElements() {
-		if (contentElements == null) {
-			contentElements = new EObjectContainmentEList.Resolving(
-					ContentElement.class, this,
-					UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS);
-		}
-		return contentElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS:
-			return ((InternalEList) getContentElements()).basicRemove(otherEnd,
-					msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS:
-			return getContentElements();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS:
-			getContentElements().clear();
-			getContentElements().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS:
-			getContentElements().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS:
-			return contentElements != null && !contentElements.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ContentPackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CoreSemanticModelBridgeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CoreSemanticModelBridgeImpl.java
deleted file mode 100644
index 2b3f614..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CoreSemanticModelBridgeImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.CoreSemanticModelBridge;
-import org.eclipse.epf.uma.Element;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Core Semantic Model Bridge</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.CoreSemanticModelBridgeImpl#getElement <em>Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class CoreSemanticModelBridgeImpl extends SemanticModelBridgeImpl
-		implements CoreSemanticModelBridge {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getElement() <em>Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected Element element = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CoreSemanticModelBridgeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CORE_SEMANTIC_MODEL_BRIDGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Element getElement() {
-		if (element != null && ((EObject) element).eIsProxy()) {
-			InternalEObject oldElement = (InternalEObject) element;
-			element = (Element) eResolveProxy(oldElement);
-			if (element != oldElement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT,
-							oldElement, element));
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Element basicGetElement() {
-		return element;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setElement(Element newElement) {
-		Element oldElement = element;
-		element = newElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT, oldElement,
-					element));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			if (resolve)
-				return getElement();
-			return basicGetElement();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			setElement((Element) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			setElement((Element) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			return element != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //CoreSemanticModelBridgeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CustomCategoryImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CustomCategoryImpl.java
deleted file mode 100644
index 2a478f3..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/CustomCategoryImpl.java
+++ /dev/null
@@ -1,190 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Custom Category</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.CustomCategoryImpl#getCategorizedElements <em>Categorized Elements</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.CustomCategoryImpl#getSubCategories <em>Sub Categories</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class CustomCategoryImpl extends ContentCategoryImpl implements
-		CustomCategory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getCategorizedElements() <em>Categorized Elements</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCategorizedElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList categorizedElements = null;
-
-	/**
-	 * The cached value of the '{@link #getSubCategories() <em>Sub Categories</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubCategories()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subCategories = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CustomCategoryImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CUSTOM_CATEGORY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getCategorizedElements() {
-		if (categorizedElements == null) {
-			categorizedElements = new EObjectResolvingEList(
-					DescribableElement.class, this,
-					UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS);
-		}
-		return categorizedElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubCategories() {
-		if (subCategories == null) {
-			subCategories = new EObjectResolvingEList(ContentCategory.class,
-					this, UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORIES);
-		}
-		return subCategories;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS:
-			return getCategorizedElements();
-		case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORIES:
-			return getSubCategories();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS:
-			getCategorizedElements().clear();
-			getCategorizedElements().addAll((Collection) newValue);
-			return;
-		case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORIES:
-			getSubCategories().clear();
-			getSubCategories().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS:
-			getCategorizedElements().clear();
-			return;
-		case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORIES:
-			getSubCategories().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS:
-			return categorizedElements != null
-					&& !categorizedElements.isEmpty();
-		case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORIES:
-			return subCategories != null && !subCategories.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //CustomCategoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliverableDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliverableDescriptionImpl.java
deleted file mode 100644
index 17d2dc4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliverableDescriptionImpl.java
+++ /dev/null
@@ -1,242 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.DeliverableDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Deliverable Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliverableDescriptionImpl#getExternalDescription <em>External Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliverableDescriptionImpl#getPackagingGuidance <em>Packaging Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliverableDescriptionImpl extends WorkProductDescriptionImpl
-		implements DeliverableDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getExternalDescription() <em>External Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String EXTERNAL_DESCRIPTION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getExternalDescription() <em>External Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String externalDescription = EXTERNAL_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPackagingGuidance() <em>Packaging Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPackagingGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PACKAGING_GUIDANCE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getPackagingGuidance() <em>Packaging Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPackagingGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected String packagingGuidance = PACKAGING_GUIDANCE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliverableDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERABLE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getExternalDescription() {
-		return externalDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalDescription(String newExternalDescription) {
-		String oldExternalDescription = externalDescription;
-		externalDescription = newExternalDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION,
-					oldExternalDescription, externalDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPackagingGuidance() {
-		return packagingGuidance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPackagingGuidance(String newPackagingGuidance) {
-		String oldPackagingGuidance = packagingGuidance;
-		packagingGuidance = newPackagingGuidance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE,
-					oldPackagingGuidance, packagingGuidance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-			return getExternalDescription();
-		case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-			return getPackagingGuidance();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-			setExternalDescription((String) newValue);
-			return;
-		case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-			setPackagingGuidance((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-			setExternalDescription(EXTERNAL_DESCRIPTION_EDEFAULT);
-			return;
-		case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-			setPackagingGuidance(PACKAGING_GUIDANCE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-			return EXTERNAL_DESCRIPTION_EDEFAULT == null ? externalDescription != null
-					: !EXTERNAL_DESCRIPTION_EDEFAULT
-							.equals(externalDescription);
-		case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-			return PACKAGING_GUIDANCE_EDEFAULT == null ? packagingGuidance != null
-					: !PACKAGING_GUIDANCE_EDEFAULT.equals(packagingGuidance);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (externalDescription: "); //$NON-NLS-1$
-		result.append(externalDescription);
-		result.append(", packagingGuidance: "); //$NON-NLS-1$
-		result.append(packagingGuidance);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DeliverableDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliverableImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliverableImpl.java
deleted file mode 100644
index 4a00f47..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliverableImpl.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Deliverable</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliverableImpl#getDeliveredWorkProducts <em>Delivered Work Products</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliverableImpl extends WorkProductImpl implements Deliverable {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getDeliveredWorkProducts() <em>Delivered Work Products</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDeliveredWorkProducts()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList deliveredWorkProducts = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliverableImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERABLE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getDeliveredWorkProducts() {
-		if (deliveredWorkProducts == null) {
-			deliveredWorkProducts = new EObjectResolvingEList(
-					WorkProduct.class, this,
-					UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCTS);
-		}
-		return deliveredWorkProducts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCTS:
-			return getDeliveredWorkProducts();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCTS:
-			getDeliveredWorkProducts().clear();
-			getDeliveredWorkProducts().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCTS:
-			getDeliveredWorkProducts().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCTS:
-			return deliveredWorkProducts != null
-					&& !deliveredWorkProducts.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DeliverableImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliveryProcessDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliveryProcessDescriptionImpl.java
deleted file mode 100644
index f6b0e6b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliveryProcessDescriptionImpl.java
+++ /dev/null
@@ -1,478 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.DeliveryProcessDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Delivery Process Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl#getScale <em>Scale</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl#getProjectCharacteristics <em>Project Characteristics</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl#getRiskLevel <em>Risk Level</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl#getEstimatingTechnique <em>Estimating Technique</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl#getProjectMemberExpertise <em>Project Member Expertise</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessDescriptionImpl#getTypeOfContract <em>Type Of Contract</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliveryProcessDescriptionImpl extends ProcessDescriptionImpl
-		implements DeliveryProcessDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getScale() <em>Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScale()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SCALE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getScale() <em>Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScale()
-	 * @generated
-	 * @ordered
-	 */
-	protected String scale = SCALE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getProjectCharacteristics() <em>Project Characteristics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectCharacteristics()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PROJECT_CHARACTERISTICS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getProjectCharacteristics() <em>Project Characteristics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectCharacteristics()
-	 * @generated
-	 * @ordered
-	 */
-	protected String projectCharacteristics = PROJECT_CHARACTERISTICS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRiskLevel() <em>Risk Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRiskLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RISK_LEVEL_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getRiskLevel() <em>Risk Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRiskLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String riskLevel = RISK_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEstimatingTechnique() <em>Estimating Technique</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEstimatingTechnique()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ESTIMATING_TECHNIQUE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getEstimatingTechnique() <em>Estimating Technique</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEstimatingTechnique()
-	 * @generated
-	 * @ordered
-	 */
-	protected String estimatingTechnique = ESTIMATING_TECHNIQUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getProjectMemberExpertise() <em>Project Member Expertise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectMemberExpertise()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PROJECT_MEMBER_EXPERTISE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getProjectMemberExpertise() <em>Project Member Expertise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectMemberExpertise()
-	 * @generated
-	 * @ordered
-	 */
-	protected String projectMemberExpertise = PROJECT_MEMBER_EXPERTISE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTypeOfContract() <em>Type Of Contract</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTypeOfContract()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TYPE_OF_CONTRACT_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getTypeOfContract() <em>Type Of Contract</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTypeOfContract()
-	 * @generated
-	 * @ordered
-	 */
-	protected String typeOfContract = TYPE_OF_CONTRACT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliveryProcessDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getScale() {
-		return scale;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setScale(String newScale) {
-		String oldScale = scale;
-		scale = newScale;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE, oldScale,
-					scale));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getProjectCharacteristics() {
-		return projectCharacteristics;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProjectCharacteristics(String newProjectCharacteristics) {
-		String oldProjectCharacteristics = projectCharacteristics;
-		projectCharacteristics = newProjectCharacteristics;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(
-					this,
-					Notification.SET,
-					UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS,
-					oldProjectCharacteristics, projectCharacteristics));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRiskLevel() {
-		return riskLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRiskLevel(String newRiskLevel) {
-		String oldRiskLevel = riskLevel;
-		riskLevel = newRiskLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL,
-					oldRiskLevel, riskLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getEstimatingTechnique() {
-		return estimatingTechnique;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEstimatingTechnique(String newEstimatingTechnique) {
-		String oldEstimatingTechnique = estimatingTechnique;
-		estimatingTechnique = newEstimatingTechnique;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(
-					this,
-					Notification.SET,
-					UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE,
-					oldEstimatingTechnique, estimatingTechnique));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getProjectMemberExpertise() {
-		return projectMemberExpertise;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProjectMemberExpertise(String newProjectMemberExpertise) {
-		String oldProjectMemberExpertise = projectMemberExpertise;
-		projectMemberExpertise = newProjectMemberExpertise;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(
-					this,
-					Notification.SET,
-					UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE,
-					oldProjectMemberExpertise, projectMemberExpertise));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTypeOfContract() {
-		return typeOfContract;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTypeOfContract(String newTypeOfContract) {
-		String oldTypeOfContract = typeOfContract;
-		typeOfContract = newTypeOfContract;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT,
-					oldTypeOfContract, typeOfContract));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-			return getScale();
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-			return getProjectCharacteristics();
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-			return getRiskLevel();
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-			return getEstimatingTechnique();
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-			return getProjectMemberExpertise();
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-			return getTypeOfContract();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-			setScale((String) newValue);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-			setProjectCharacteristics((String) newValue);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-			setRiskLevel((String) newValue);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-			setEstimatingTechnique((String) newValue);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-			setProjectMemberExpertise((String) newValue);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-			setTypeOfContract((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-			setScale(SCALE_EDEFAULT);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-			setProjectCharacteristics(PROJECT_CHARACTERISTICS_EDEFAULT);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-			setRiskLevel(RISK_LEVEL_EDEFAULT);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-			setEstimatingTechnique(ESTIMATING_TECHNIQUE_EDEFAULT);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-			setProjectMemberExpertise(PROJECT_MEMBER_EXPERTISE_EDEFAULT);
-			return;
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-			setTypeOfContract(TYPE_OF_CONTRACT_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-			return SCALE_EDEFAULT == null ? scale != null : !SCALE_EDEFAULT
-					.equals(scale);
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-			return PROJECT_CHARACTERISTICS_EDEFAULT == null ? projectCharacteristics != null
-					: !PROJECT_CHARACTERISTICS_EDEFAULT
-							.equals(projectCharacteristics);
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-			return RISK_LEVEL_EDEFAULT == null ? riskLevel != null
-					: !RISK_LEVEL_EDEFAULT.equals(riskLevel);
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-			return ESTIMATING_TECHNIQUE_EDEFAULT == null ? estimatingTechnique != null
-					: !ESTIMATING_TECHNIQUE_EDEFAULT
-							.equals(estimatingTechnique);
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-			return PROJECT_MEMBER_EXPERTISE_EDEFAULT == null ? projectMemberExpertise != null
-					: !PROJECT_MEMBER_EXPERTISE_EDEFAULT
-							.equals(projectMemberExpertise);
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-			return TYPE_OF_CONTRACT_EDEFAULT == null ? typeOfContract != null
-					: !TYPE_OF_CONTRACT_EDEFAULT.equals(typeOfContract);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (scale: "); //$NON-NLS-1$
-		result.append(scale);
-		result.append(", projectCharacteristics: "); //$NON-NLS-1$
-		result.append(projectCharacteristics);
-		result.append(", riskLevel: "); //$NON-NLS-1$
-		result.append(riskLevel);
-		result.append(", estimatingTechnique: "); //$NON-NLS-1$
-		result.append(estimatingTechnique);
-		result.append(", projectMemberExpertise: "); //$NON-NLS-1$
-		result.append(projectMemberExpertise);
-		result.append(", typeOfContract: "); //$NON-NLS-1$
-		result.append(typeOfContract);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DeliveryProcessDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliveryProcessImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliveryProcessImpl.java
deleted file mode 100644
index d3ebef9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DeliveryProcessImpl.java
+++ /dev/null
@@ -1,189 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Delivery Process</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessImpl#getEducationMaterials <em>Education Materials</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DeliveryProcessImpl#getCommunicationsMaterials <em>Communications Materials</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliveryProcessImpl extends ProcessImpl implements DeliveryProcess {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getEducationMaterials() <em>Education Materials</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEducationMaterials()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList educationMaterials = null;
-
-	/**
-	 * The cached value of the '{@link #getCommunicationsMaterials() <em>Communications Materials</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCommunicationsMaterials()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList communicationsMaterials = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliveryProcessImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERY_PROCESS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getEducationMaterials() {
-		if (educationMaterials == null) {
-			educationMaterials = new EObjectResolvingEList(
-					SupportingMaterial.class, this,
-					UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIALS);
-		}
-		return educationMaterials;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getCommunicationsMaterials() {
-		if (communicationsMaterials == null) {
-			communicationsMaterials = new EObjectResolvingEList(
-					SupportingMaterial.class, this,
-					UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS);
-		}
-		return communicationsMaterials;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIALS:
-			return getEducationMaterials();
-		case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS:
-			return getCommunicationsMaterials();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIALS:
-			getEducationMaterials().clear();
-			getEducationMaterials().addAll((Collection) newValue);
-			return;
-		case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS:
-			getCommunicationsMaterials().clear();
-			getCommunicationsMaterials().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIALS:
-			getEducationMaterials().clear();
-			return;
-		case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS:
-			getCommunicationsMaterials().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIALS:
-			return educationMaterials != null && !educationMaterials.isEmpty();
-		case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS:
-			return communicationsMaterials != null
-					&& !communicationsMaterials.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DeliveryProcessImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescribableElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescribableElementImpl.java
deleted file mode 100644
index bdaf29b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescribableElementImpl.java
+++ /dev/null
@@ -1,452 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.net.URI;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.ContentDescriptionFactory;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Describable Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DescribableElementImpl#getPresentationName <em>Presentation Name</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DescribableElementImpl#getPresentation <em>Presentation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DescribableElementImpl#getShapeicon <em>Shapeicon</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DescribableElementImpl#getNodeicon <em>Nodeicon</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class DescribableElementImpl extends MethodElementImpl
-		implements DescribableElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getPresentationName() <em>Presentation Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentationName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRESENTATION_NAME_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getPresentationName() <em>Presentation Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentationName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String presentationName = PRESENTATION_NAME_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getPresentation() <em>Presentation</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected ContentDescription presentation = null;
-
-	/**
-	 * The default value of the '{@link #getShapeicon() <em>Shapeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShapeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final URI SHAPEICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getShapeicon() <em>Shapeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShapeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected URI shapeicon = SHAPEICON_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNodeicon() <em>Nodeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNodeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final URI NODEICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNodeicon() <em>Nodeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNodeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected URI nodeicon = NODEICON_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescribableElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DESCRIBABLE_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPresentationName() {
-		return presentationName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentationName(String newPresentationName) {
-		String oldPresentationName = presentationName;
-		presentationName = newPresentationName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME,
-					oldPresentationName, presentationName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPresentation(
-			ContentDescription newPresentation, NotificationChain msgs) {
-		ContentDescription oldPresentation = presentation;
-		presentation = newPresentation;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET,
-					UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION,
-					oldPresentation, newPresentation);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public URI getShapeicon() {
-		return shapeicon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setShapeicon(URI newShapeicon) {
-		URI oldShapeicon = shapeicon;
-		shapeicon = newShapeicon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON, oldShapeicon,
-					shapeicon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public URI getNodeicon() {
-		return nodeicon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNodeicon(URI newNodeicon) {
-		URI oldNodeicon = nodeicon;
-		nodeicon = newNodeicon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DESCRIBABLE_ELEMENT__NODEICON, oldNodeicon,
-					nodeicon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-			return basicSetPresentation(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-			return getPresentationName();
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-			if (resolve)
-				return getPresentation();
-			return basicGetPresentation();
-		case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-			return getShapeicon();
-		case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-			return getNodeicon();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-			setPresentationName((String) newValue);
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-			setPresentation((ContentDescription) newValue);
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-			setShapeicon((URI) newValue);
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-			setNodeicon((URI) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-			setPresentationName(PRESENTATION_NAME_EDEFAULT);
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-			setPresentation((ContentDescription) null);
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-			setShapeicon(SHAPEICON_EDEFAULT);
-			return;
-		case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-			setNodeicon(NODEICON_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-			return PRESENTATION_NAME_EDEFAULT == null ? presentationName != null
-					: !PRESENTATION_NAME_EDEFAULT.equals(presentationName);
-		case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-			return presentation != null;
-		case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-			return SHAPEICON_EDEFAULT == null ? shapeicon != null
-					: !SHAPEICON_EDEFAULT.equals(shapeicon);
-		case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-			return NODEICON_EDEFAULT == null ? nodeicon != null
-					: !NODEICON_EDEFAULT.equals(nodeicon);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (presentationName: "); //$NON-NLS-1$
-		result.append(presentationName);
-		result.append(", shapeicon: "); //$NON-NLS-1$
-		result.append(shapeicon);
-		result.append(", nodeicon: "); //$NON-NLS-1$
-		result.append(nodeicon);
-		result.append(')');
-		return result.toString();
-	}
-
-	//
-	// Start custom code
-	//
-
-	public ContentDescription basicGetPresentation() {
-		return presentation;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.impl.DescribableElementImpl#getPresentation()
-	 */
-	public ContentDescription getPresentation() {
-		if (presentation instanceof EObject
-				&& ((EObject) presentation).eIsProxy()) {
-			ContentDescription oldPresentation = presentation;
-			presentation = (ContentDescription) eResolveProxy((InternalEObject) presentation);
-			if (presentation != oldPresentation) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION,
-							oldPresentation, presentation));
-			}
-		} else if (presentation == null) {
-			//			setPresentation(ContentDescriptionFactory.createContentDescription(this));
-			if (emptyPresentation == null) {
-				emptyPresentation = ContentDescriptionFactory
-						.createContentDescription(this);
-				emptyPresentation.eAdapters().add(changeListener);
-			}
-			return emptyPresentation;
-		}
-
-		return presentation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public void setPresentation(ContentDescription newPresentation) {
-		if (newPresentation != presentation) {
-			NotificationChain msgs = null;
-			if (presentation != null)
-				msgs = ((InternalEObject) presentation).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION,
-						null, msgs);
-			if (newPresentation != null)
-				msgs = ((InternalEObject) newPresentation).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION,
-						null, msgs);
-			msgs = basicSetPresentation(newPresentation, msgs);
-
-			// custom code
-			//
-			emptyPresentation = null;
-
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION,
-					newPresentation, newPresentation));
-	}
-
-	private ContentDescription emptyPresentation;
-
-	private Adapter changeListener = new AdapterImpl() {
-		public void notifyChanged(Notification msg) {
-			switch (msg.getEventType()) {
-			case Notification.ADD:
-			case Notification.ADD_MANY:
-			case Notification.SET:
-				ContentDescription content = (ContentDescription) getTarget();
-				content.eAdapters().remove(this);
-
-				// emptyPresentation is modified, convert it to real presentation if no presentation is set yet 
-				// for the ProcessElement
-				//
-				if (presentation == null) {
-					setPresentation(content);
-				}
-			}
-		}
-	};
-} //DescribableElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescriptorDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescriptorDescriptionImpl.java
deleted file mode 100644
index 708982e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescriptorDescriptionImpl.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Descriptor Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DescriptorDescriptionImpl#getRefinedDescription <em>Refined Description</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DescriptorDescriptionImpl extends BreakdownElementDescriptionImpl
-		implements DescriptorDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getRefinedDescription() <em>Refined Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRefinedDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REFINED_DESCRIPTION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getRefinedDescription() <em>Refined Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRefinedDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String refinedDescription = REFINED_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptorDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DESCRIPTOR_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRefinedDescription() {
-		return refinedDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRefinedDescription(String newRefinedDescription) {
-		String oldRefinedDescription = refinedDescription;
-		refinedDescription = newRefinedDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION,
-					oldRefinedDescription, refinedDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-			return getRefinedDescription();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-			setRefinedDescription((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-			setRefinedDescription(REFINED_DESCRIPTION_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-			return REFINED_DESCRIPTION_EDEFAULT == null ? refinedDescription != null
-					: !REFINED_DESCRIPTION_EDEFAULT.equals(refinedDescription);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (refinedDescription: "); //$NON-NLS-1$
-		result.append(refinedDescription);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DescriptorDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescriptorImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescriptorImpl.java
deleted file mode 100644
index dfc3beb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DescriptorImpl.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DescriptorImpl#getIsSynchronizedWithSource <em>Is Synchronized With Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class DescriptorImpl extends BreakdownElementImpl implements
-		Descriptor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT = Boolean.TRUE;
-
-	/**
-	 * The cached value of the '{@link #getIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isSynchronizedWithSource = IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptorImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsSynchronizedWithSource() {
-		return isSynchronizedWithSource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsSynchronizedWithSource(Boolean newIsSynchronizedWithSource) {
-		Boolean oldIsSynchronizedWithSource = isSynchronizedWithSource;
-		isSynchronizedWithSource = newIsSynchronizedWithSource;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE,
-					oldIsSynchronizedWithSource, isSynchronizedWithSource));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			return getIsSynchronizedWithSource();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			setIsSynchronizedWithSource((Boolean) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			setIsSynchronizedWithSource(IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			return IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT == null ? isSynchronizedWithSource != null
-					: !IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT
-							.equals(isSynchronizedWithSource);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (isSynchronizedWithSource: "); //$NON-NLS-1$
-		result.append(isSynchronizedWithSource);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DescriptorImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramElementImpl.java
deleted file mode 100644
index 99c0aa6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramElementImpl.java
+++ /dev/null
@@ -1,395 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.Reference;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Diagram Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramElementImpl#getIsVisible <em>Is Visible</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramElementImpl#getContainer_ <em>Container</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramElementImpl#getReference <em>Reference</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramElementImpl#getProperty <em>Property</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class DiagramElementImpl extends MethodElementImpl implements
-		DiagramElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getIsVisible() <em>Is Visible</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsVisible()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_VISIBLE_EDEFAULT = Boolean.TRUE;
-
-	/**
-	 * The cached value of the '{@link #getIsVisible() <em>Is Visible</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsVisible()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isVisible = IS_VISIBLE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getReference() <em>Reference</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReference()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList reference = null;
-
-	/**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DiagramElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DIAGRAM_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsVisible() {
-		return isVisible;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsVisible(Boolean newIsVisible) {
-		Boolean oldIsVisible = isVisible;
-		isVisible = newIsVisible;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM_ELEMENT__IS_VISIBLE, oldIsVisible,
-					isVisible));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement getContainer_() {
-		if (eContainerFeatureID != UmaPackage.DIAGRAM_ELEMENT__CONTAINER)
-			return null;
-		return (GraphElement) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement basicGetContainer() {
-		if (eContainerFeatureID != UmaPackage.DIAGRAM_ELEMENT__CONTAINER)
-			return null;
-		return (GraphElement) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetContainer(GraphElement newContainer,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContainer,
-				UmaPackage.DIAGRAM_ELEMENT__CONTAINER, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setContainer(GraphElement newContainer) {
-		if (newContainer != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.DIAGRAM_ELEMENT__CONTAINER && newContainer != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newContainer))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newContainer != null)
-				msgs = ((InternalEObject) newContainer).eInverseAdd(this,
-						UmaPackage.GRAPH_ELEMENT__CONTAINED,
-						GraphElement.class, msgs);
-			msgs = basicSetContainer(newContainer, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM_ELEMENT__CONTAINER, newContainer,
-					newContainer));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getReference() {
-		if (reference == null) {
-			reference = new EObjectWithInverseResolvingEList(Reference.class,
-					this, UmaPackage.DIAGRAM_ELEMENT__REFERENCE,
-					UmaPackage.REFERENCE__REFERENCED);
-		}
-		return reference;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList.Resolving(Property.class,
-					this, UmaPackage.DIAGRAM_ELEMENT__PROPERTY);
-		}
-		return property;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_ELEMENT__CONTAINER:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetContainer((GraphElement) otherEnd, msgs);
-		case UmaPackage.DIAGRAM_ELEMENT__REFERENCE:
-			return ((InternalEList) getReference()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_ELEMENT__CONTAINER:
-			return basicSetContainer(null, msgs);
-		case UmaPackage.DIAGRAM_ELEMENT__REFERENCE:
-			return ((InternalEList) getReference()).basicRemove(otherEnd, msgs);
-		case UmaPackage.DIAGRAM_ELEMENT__PROPERTY:
-			return ((InternalEList) getProperty()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.DIAGRAM_ELEMENT__CONTAINER:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.GRAPH_ELEMENT__CONTAINED, GraphElement.class,
-					msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_ELEMENT__IS_VISIBLE:
-			return getIsVisible();
-		case UmaPackage.DIAGRAM_ELEMENT__CONTAINER:
-			if (resolve)
-				return getContainer_();
-			return basicGetContainer();
-		case UmaPackage.DIAGRAM_ELEMENT__REFERENCE:
-			return getReference();
-		case UmaPackage.DIAGRAM_ELEMENT__PROPERTY:
-			return getProperty();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_ELEMENT__IS_VISIBLE:
-			setIsVisible((Boolean) newValue);
-			return;
-		case UmaPackage.DIAGRAM_ELEMENT__CONTAINER:
-			setContainer((GraphElement) newValue);
-			return;
-		case UmaPackage.DIAGRAM_ELEMENT__REFERENCE:
-			getReference().clear();
-			getReference().addAll((Collection) newValue);
-			return;
-		case UmaPackage.DIAGRAM_ELEMENT__PROPERTY:
-			getProperty().clear();
-			getProperty().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_ELEMENT__IS_VISIBLE:
-			setIsVisible(IS_VISIBLE_EDEFAULT);
-			return;
-		case UmaPackage.DIAGRAM_ELEMENT__CONTAINER:
-			setContainer((GraphElement) null);
-			return;
-		case UmaPackage.DIAGRAM_ELEMENT__REFERENCE:
-			getReference().clear();
-			return;
-		case UmaPackage.DIAGRAM_ELEMENT__PROPERTY:
-			getProperty().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_ELEMENT__IS_VISIBLE:
-			return IS_VISIBLE_EDEFAULT == null ? isVisible != null
-					: !IS_VISIBLE_EDEFAULT.equals(isVisible);
-		case UmaPackage.DIAGRAM_ELEMENT__CONTAINER:
-			return basicGetContainer() != null;
-		case UmaPackage.DIAGRAM_ELEMENT__REFERENCE:
-			return reference != null && !reference.isEmpty();
-		case UmaPackage.DIAGRAM_ELEMENT__PROPERTY:
-			return property != null && !property.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (isVisible: "); //$NON-NLS-1$
-		result.append(isVisible);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DiagramElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramImpl.java
deleted file mode 100644
index 5a6a4cf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramImpl.java
+++ /dev/null
@@ -1,483 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Diagram</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramImpl#getZoom <em>Zoom</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramImpl#getViewpoint <em>Viewpoint</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramImpl#getDiagramLink <em>Diagram Link</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramImpl#getNamespace <em>Namespace</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DiagramImpl extends GraphNodeImpl implements Diagram {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getZoom() <em>Zoom</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getZoom()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double ZOOM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getZoom() <em>Zoom</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getZoom()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double zoom = ZOOM_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getViewpoint() <em>Viewpoint</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewpoint()
-	 * @generated
-	 * @ordered
-	 */
-	protected Point viewpoint = null;
-
-	/**
-	 * The cached value of the '{@link #getDiagramLink() <em>Diagram Link</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDiagramLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList diagramLink = null;
-
-	/**
-	 * The cached value of the '{@link #getNamespace() <em>Namespace</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNamespace()
-	 * @generated
-	 * @ordered
-	 */
-	protected SemanticModelBridge namespace = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DiagramImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DIAGRAM;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getZoom() {
-		return zoom;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setZoom(Double newZoom) {
-		Double oldZoom = zoom;
-		zoom = newZoom;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM__ZOOM, oldZoom, zoom));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point getViewpoint() {
-		if (viewpoint != null && ((EObject) viewpoint).eIsProxy()) {
-			InternalEObject oldViewpoint = (InternalEObject) viewpoint;
-			viewpoint = (Point) eResolveProxy(oldViewpoint);
-			if (viewpoint != oldViewpoint) {
-				InternalEObject newViewpoint = (InternalEObject) viewpoint;
-				NotificationChain msgs = oldViewpoint.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.DIAGRAM__VIEWPOINT,
-						null, null);
-				if (newViewpoint.eInternalContainer() == null) {
-					msgs = newViewpoint
-							.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-									- UmaPackage.DIAGRAM__VIEWPOINT, null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.DIAGRAM__VIEWPOINT, oldViewpoint,
-							viewpoint));
-			}
-		}
-		return viewpoint;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point basicGetViewpoint() {
-		return viewpoint;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetViewpoint(Point newViewpoint,
-			NotificationChain msgs) {
-		Point oldViewpoint = viewpoint;
-		viewpoint = newViewpoint;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.DIAGRAM__VIEWPOINT,
-					oldViewpoint, newViewpoint);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setViewpoint(Point newViewpoint) {
-		if (newViewpoint != viewpoint) {
-			NotificationChain msgs = null;
-			if (viewpoint != null)
-				msgs = ((InternalEObject) viewpoint).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.DIAGRAM__VIEWPOINT,
-						null, msgs);
-			if (newViewpoint != null)
-				msgs = ((InternalEObject) newViewpoint).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.DIAGRAM__VIEWPOINT,
-						null, msgs);
-			msgs = basicSetViewpoint(newViewpoint, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM__VIEWPOINT, newViewpoint, newViewpoint));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getDiagramLink() {
-		if (diagramLink == null) {
-			diagramLink = new EObjectWithInverseResolvingEList(
-					DiagramLink.class, this, UmaPackage.DIAGRAM__DIAGRAM_LINK,
-					UmaPackage.DIAGRAM_LINK__DIAGRAM);
-		}
-		return diagramLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SemanticModelBridge getNamespace() {
-		if (namespace != null && ((EObject) namespace).eIsProxy()) {
-			InternalEObject oldNamespace = (InternalEObject) namespace;
-			namespace = (SemanticModelBridge) eResolveProxy(oldNamespace);
-			if (namespace != oldNamespace) {
-				InternalEObject newNamespace = (InternalEObject) namespace;
-				NotificationChain msgs = oldNamespace.eInverseRemove(this,
-						UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM,
-						SemanticModelBridge.class, null);
-				if (newNamespace.eInternalContainer() == null) {
-					msgs = newNamespace.eInverseAdd(this,
-							UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM,
-							SemanticModelBridge.class, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.DIAGRAM__NAMESPACE, oldNamespace,
-							namespace));
-			}
-		}
-		return namespace;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SemanticModelBridge basicGetNamespace() {
-		return namespace;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNamespace(
-			SemanticModelBridge newNamespace, NotificationChain msgs) {
-		SemanticModelBridge oldNamespace = namespace;
-		namespace = newNamespace;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.DIAGRAM__NAMESPACE,
-					oldNamespace, newNamespace);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNamespace(SemanticModelBridge newNamespace) {
-		if (newNamespace != namespace) {
-			NotificationChain msgs = null;
-			if (namespace != null)
-				msgs = ((InternalEObject) namespace).eInverseRemove(this,
-						UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM,
-						SemanticModelBridge.class, msgs);
-			if (newNamespace != null)
-				msgs = ((InternalEObject) newNamespace).eInverseAdd(this,
-						UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM,
-						SemanticModelBridge.class, msgs);
-			msgs = basicSetNamespace(newNamespace, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM__NAMESPACE, newNamespace, newNamespace));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM__DIAGRAM_LINK:
-			return ((InternalEList) getDiagramLink()).basicAdd(otherEnd, msgs);
-		case UmaPackage.DIAGRAM__NAMESPACE:
-			if (namespace != null)
-				msgs = ((InternalEObject) namespace).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.DIAGRAM__NAMESPACE,
-						null, msgs);
-			return basicSetNamespace((SemanticModelBridge) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM__VIEWPOINT:
-			return basicSetViewpoint(null, msgs);
-		case UmaPackage.DIAGRAM__DIAGRAM_LINK:
-			return ((InternalEList) getDiagramLink()).basicRemove(otherEnd,
-					msgs);
-		case UmaPackage.DIAGRAM__NAMESPACE:
-			return basicSetNamespace(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM__ZOOM:
-			return getZoom();
-		case UmaPackage.DIAGRAM__VIEWPOINT:
-			if (resolve)
-				return getViewpoint();
-			return basicGetViewpoint();
-		case UmaPackage.DIAGRAM__DIAGRAM_LINK:
-			return getDiagramLink();
-		case UmaPackage.DIAGRAM__NAMESPACE:
-			if (resolve)
-				return getNamespace();
-			return basicGetNamespace();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM__ZOOM:
-			setZoom((Double) newValue);
-			return;
-		case UmaPackage.DIAGRAM__VIEWPOINT:
-			setViewpoint((Point) newValue);
-			return;
-		case UmaPackage.DIAGRAM__DIAGRAM_LINK:
-			getDiagramLink().clear();
-			getDiagramLink().addAll((Collection) newValue);
-			return;
-		case UmaPackage.DIAGRAM__NAMESPACE:
-			setNamespace((SemanticModelBridge) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM__ZOOM:
-			setZoom(ZOOM_EDEFAULT);
-			return;
-		case UmaPackage.DIAGRAM__VIEWPOINT:
-			setViewpoint((Point) null);
-			return;
-		case UmaPackage.DIAGRAM__DIAGRAM_LINK:
-			getDiagramLink().clear();
-			return;
-		case UmaPackage.DIAGRAM__NAMESPACE:
-			setNamespace((SemanticModelBridge) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DIAGRAM__ZOOM:
-			return ZOOM_EDEFAULT == null ? zoom != null : !ZOOM_EDEFAULT
-					.equals(zoom);
-		case UmaPackage.DIAGRAM__VIEWPOINT:
-			return viewpoint != null;
-		case UmaPackage.DIAGRAM__DIAGRAM_LINK:
-			return diagramLink != null && !diagramLink.isEmpty();
-		case UmaPackage.DIAGRAM__NAMESPACE:
-			return namespace != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (zoom: "); //$NON-NLS-1$
-		result.append(zoom);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DiagramImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramLinkImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramLinkImpl.java
deleted file mode 100644
index ebaad31..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DiagramLinkImpl.java
+++ /dev/null
@@ -1,517 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Diagram Link</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramLinkImpl#getZoom <em>Zoom</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramLinkImpl#getViewport <em>Viewport</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramLinkImpl#getGraphElement <em>Graph Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DiagramLinkImpl#getDiagram <em>Diagram</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DiagramLinkImpl extends DiagramElementImpl implements DiagramLink {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getZoom() <em>Zoom</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getZoom()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double ZOOM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getZoom() <em>Zoom</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getZoom()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double zoom = ZOOM_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getViewport() <em>Viewport</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewport()
-	 * @generated
-	 * @ordered
-	 */
-	protected Point viewport = null;
-
-	/**
-	 * The cached value of the '{@link #getDiagram() <em>Diagram</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDiagram()
-	 * @generated
-	 * @ordered
-	 */
-	protected Diagram diagram = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DiagramLinkImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DIAGRAM_LINK;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getZoom() {
-		return zoom;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setZoom(Double newZoom) {
-		Double oldZoom = zoom;
-		zoom = newZoom;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM_LINK__ZOOM, oldZoom, zoom));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point getViewport() {
-		if (viewport != null && ((EObject) viewport).eIsProxy()) {
-			InternalEObject oldViewport = (InternalEObject) viewport;
-			viewport = (Point) eResolveProxy(oldViewport);
-			if (viewport != oldViewport) {
-				InternalEObject newViewport = (InternalEObject) viewport;
-				NotificationChain msgs = oldViewport
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.DIAGRAM_LINK__VIEWPORT, null, null);
-				if (newViewport.eInternalContainer() == null) {
-					msgs = newViewport.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-							- UmaPackage.DIAGRAM_LINK__VIEWPORT, null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.DIAGRAM_LINK__VIEWPORT, oldViewport,
-							viewport));
-			}
-		}
-		return viewport;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point basicGetViewport() {
-		return viewport;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetViewport(Point newViewport,
-			NotificationChain msgs) {
-		Point oldViewport = viewport;
-		viewport = newViewport;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.DIAGRAM_LINK__VIEWPORT,
-					oldViewport, newViewport);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setViewport(Point newViewport) {
-		if (newViewport != viewport) {
-			NotificationChain msgs = null;
-			if (viewport != null)
-				msgs = ((InternalEObject) viewport)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.DIAGRAM_LINK__VIEWPORT, null, msgs);
-			if (newViewport != null)
-				msgs = ((InternalEObject) newViewport)
-						.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.DIAGRAM_LINK__VIEWPORT, null, msgs);
-			msgs = basicSetViewport(newViewport, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM_LINK__VIEWPORT, newViewport, newViewport));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement getGraphElement() {
-		if (eContainerFeatureID != UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT)
-			return null;
-		return (GraphElement) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement basicGetGraphElement() {
-		if (eContainerFeatureID != UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT)
-			return null;
-		return (GraphElement) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetGraphElement(GraphElement newGraphElement,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newGraphElement,
-				UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGraphElement(GraphElement newGraphElement) {
-		if (newGraphElement != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT && newGraphElement != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newGraphElement))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newGraphElement != null)
-				msgs = ((InternalEObject) newGraphElement).eInverseAdd(this,
-						UmaPackage.GRAPH_ELEMENT__LINK, GraphElement.class,
-						msgs);
-			msgs = basicSetGraphElement(newGraphElement, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT, newGraphElement,
-					newGraphElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Diagram getDiagram() {
-		if (diagram != null && ((EObject) diagram).eIsProxy()) {
-			InternalEObject oldDiagram = (InternalEObject) diagram;
-			diagram = (Diagram) eResolveProxy(oldDiagram);
-			if (diagram != oldDiagram) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.DIAGRAM_LINK__DIAGRAM, oldDiagram,
-							diagram));
-			}
-		}
-		return diagram;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Diagram basicGetDiagram() {
-		return diagram;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDiagram(Diagram newDiagram,
-			NotificationChain msgs) {
-		Diagram oldDiagram = diagram;
-		diagram = newDiagram;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.DIAGRAM_LINK__DIAGRAM,
-					oldDiagram, newDiagram);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDiagram(Diagram newDiagram) {
-		if (newDiagram != diagram) {
-			NotificationChain msgs = null;
-			if (diagram != null)
-				msgs = ((InternalEObject) diagram).eInverseRemove(this,
-						UmaPackage.DIAGRAM__DIAGRAM_LINK, Diagram.class, msgs);
-			if (newDiagram != null)
-				msgs = ((InternalEObject) newDiagram).eInverseAdd(this,
-						UmaPackage.DIAGRAM__DIAGRAM_LINK, Diagram.class, msgs);
-			msgs = basicSetDiagram(newDiagram, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIAGRAM_LINK__DIAGRAM, newDiagram, newDiagram));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetGraphElement((GraphElement) otherEnd, msgs);
-		case UmaPackage.DIAGRAM_LINK__DIAGRAM:
-			if (diagram != null)
-				msgs = ((InternalEObject) diagram).eInverseRemove(this,
-						UmaPackage.DIAGRAM__DIAGRAM_LINK, Diagram.class, msgs);
-			return basicSetDiagram((Diagram) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_LINK__VIEWPORT:
-			return basicSetViewport(null, msgs);
-		case UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT:
-			return basicSetGraphElement(null, msgs);
-		case UmaPackage.DIAGRAM_LINK__DIAGRAM:
-			return basicSetDiagram(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.GRAPH_ELEMENT__LINK, GraphElement.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_LINK__ZOOM:
-			return getZoom();
-		case UmaPackage.DIAGRAM_LINK__VIEWPORT:
-			if (resolve)
-				return getViewport();
-			return basicGetViewport();
-		case UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT:
-			if (resolve)
-				return getGraphElement();
-			return basicGetGraphElement();
-		case UmaPackage.DIAGRAM_LINK__DIAGRAM:
-			if (resolve)
-				return getDiagram();
-			return basicGetDiagram();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_LINK__ZOOM:
-			setZoom((Double) newValue);
-			return;
-		case UmaPackage.DIAGRAM_LINK__VIEWPORT:
-			setViewport((Point) newValue);
-			return;
-		case UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT:
-			setGraphElement((GraphElement) newValue);
-			return;
-		case UmaPackage.DIAGRAM_LINK__DIAGRAM:
-			setDiagram((Diagram) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_LINK__ZOOM:
-			setZoom(ZOOM_EDEFAULT);
-			return;
-		case UmaPackage.DIAGRAM_LINK__VIEWPORT:
-			setViewport((Point) null);
-			return;
-		case UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT:
-			setGraphElement((GraphElement) null);
-			return;
-		case UmaPackage.DIAGRAM_LINK__DIAGRAM:
-			setDiagram((Diagram) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DIAGRAM_LINK__ZOOM:
-			return ZOOM_EDEFAULT == null ? zoom != null : !ZOOM_EDEFAULT
-					.equals(zoom);
-		case UmaPackage.DIAGRAM_LINK__VIEWPORT:
-			return viewport != null;
-		case UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT:
-			return basicGetGraphElement() != null;
-		case UmaPackage.DIAGRAM_LINK__DIAGRAM:
-			return diagram != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (zoom: "); //$NON-NLS-1$
-		result.append(zoom);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DiagramLinkImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DimensionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DimensionImpl.java
deleted file mode 100644
index 3db4e1d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DimensionImpl.java
+++ /dev/null
@@ -1,239 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dimension</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DimensionImpl#getWidth <em>Width</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DimensionImpl#getHeight <em>Height</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DimensionImpl extends MultiResourceEObject implements Dimension {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getWidth() <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double WIDTH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double width = WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHeight() <em>Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double HEIGHT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHeight() <em>Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double height = HEIGHT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DimensionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DIMENSION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getWidth() {
-		return width;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWidth(Double newWidth) {
-		Double oldWidth = width;
-		width = newWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIMENSION__WIDTH, oldWidth, width));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getHeight() {
-		return height;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHeight(Double newHeight) {
-		Double oldHeight = height;
-		height = newHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.DIMENSION__HEIGHT, oldHeight, height));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DIMENSION__WIDTH:
-			return getWidth();
-		case UmaPackage.DIMENSION__HEIGHT:
-			return getHeight();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DIMENSION__WIDTH:
-			setWidth((Double) newValue);
-			return;
-		case UmaPackage.DIMENSION__HEIGHT:
-			setHeight((Double) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DIMENSION__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case UmaPackage.DIMENSION__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DIMENSION__WIDTH:
-			return WIDTH_EDEFAULT == null ? width != null : !WIDTH_EDEFAULT
-					.equals(width);
-		case UmaPackage.DIMENSION__HEIGHT:
-			return HEIGHT_EDEFAULT == null ? height != null : !HEIGHT_EDEFAULT
-					.equals(height);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (width: "); //$NON-NLS-1$
-		result.append(width);
-		result.append(", height: "); //$NON-NLS-1$
-		result.append(height);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DimensionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DisciplineGroupingImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DisciplineGroupingImpl.java
deleted file mode 100644
index caa77e4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DisciplineGroupingImpl.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Discipline Grouping</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DisciplineGroupingImpl#getDisciplines <em>Disciplines</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DisciplineGroupingImpl extends ContentCategoryImpl implements
-		DisciplineGrouping {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getDisciplines() <em>Disciplines</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisciplines()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList disciplines = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisciplineGroupingImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DISCIPLINE_GROUPING;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getDisciplines() {
-		if (disciplines == null) {
-			disciplines = new EObjectResolvingEList(Discipline.class, this,
-					UmaPackage.DISCIPLINE_GROUPING__DISCIPLINES);
-		}
-		return disciplines;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINES:
-			return getDisciplines();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINES:
-			getDisciplines().clear();
-			getDisciplines().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINES:
-			getDisciplines().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINES:
-			return disciplines != null && !disciplines.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DisciplineGroupingImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DisciplineImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DisciplineImpl.java
deleted file mode 100644
index bf3ca96..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DisciplineImpl.java
+++ /dev/null
@@ -1,242 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Discipline</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DisciplineImpl#getTasks <em>Tasks</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DisciplineImpl#getSubdiscipline <em>Subdiscipline</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DisciplineImpl#getReferenceWorkflows <em>Reference Workflows</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DisciplineImpl extends ContentCategoryImpl implements Discipline {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getTasks() <em>Tasks</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTasks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList tasks = null;
-
-	/**
-	 * The cached value of the '{@link #getSubdiscipline() <em>Subdiscipline</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubdiscipline()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subdiscipline = null;
-
-	/**
-	 * The cached value of the '{@link #getReferenceWorkflows() <em>Reference Workflows</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferenceWorkflows()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList referenceWorkflows = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisciplineImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DISCIPLINE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getTasks() {
-		if (tasks == null) {
-			tasks = new EObjectResolvingEList(Task.class, this,
-					UmaPackage.DISCIPLINE__TASKS);
-		}
-		return tasks;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubdiscipline() {
-		if (subdiscipline == null) {
-			subdiscipline = new EObjectContainmentEList.Resolving(
-					Discipline.class, this,
-					UmaPackage.DISCIPLINE__SUBDISCIPLINE);
-		}
-		return subdiscipline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getReferenceWorkflows() {
-		if (referenceWorkflows == null) {
-			referenceWorkflows = new EObjectResolvingEList(Activity.class,
-					this, UmaPackage.DISCIPLINE__REFERENCE_WORKFLOWS);
-		}
-		return referenceWorkflows;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE__SUBDISCIPLINE:
-			return ((InternalEList) getSubdiscipline()).basicRemove(otherEnd,
-					msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE__TASKS:
-			return getTasks();
-		case UmaPackage.DISCIPLINE__SUBDISCIPLINE:
-			return getSubdiscipline();
-		case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOWS:
-			return getReferenceWorkflows();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE__TASKS:
-			getTasks().clear();
-			getTasks().addAll((Collection) newValue);
-			return;
-		case UmaPackage.DISCIPLINE__SUBDISCIPLINE:
-			getSubdiscipline().clear();
-			getSubdiscipline().addAll((Collection) newValue);
-			return;
-		case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOWS:
-			getReferenceWorkflows().clear();
-			getReferenceWorkflows().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE__TASKS:
-			getTasks().clear();
-			return;
-		case UmaPackage.DISCIPLINE__SUBDISCIPLINE:
-			getSubdiscipline().clear();
-			return;
-		case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOWS:
-			getReferenceWorkflows().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DISCIPLINE__TASKS:
-			return tasks != null && !tasks.isEmpty();
-		case UmaPackage.DISCIPLINE__SUBDISCIPLINE:
-			return subdiscipline != null && !subdiscipline.isEmpty();
-		case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOWS:
-			return referenceWorkflows != null && !referenceWorkflows.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DisciplineImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DomainImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DomainImpl.java
deleted file mode 100644
index a3dad4d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/DomainImpl.java
+++ /dev/null
@@ -1,205 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Domain</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.DomainImpl#getWorkProducts <em>Work Products</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.DomainImpl#getSubdomains <em>Subdomains</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DomainImpl extends ContentCategoryImpl implements Domain {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getWorkProducts() <em>Work Products</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkProducts()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList workProducts = null;
-
-	/**
-	 * The cached value of the '{@link #getSubdomains() <em>Subdomains</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubdomains()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subdomains = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DomainImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DOMAIN;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getWorkProducts() {
-		if (workProducts == null) {
-			workProducts = new EObjectResolvingEList(WorkProduct.class, this,
-					UmaPackage.DOMAIN__WORK_PRODUCTS);
-		}
-		return workProducts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubdomains() {
-		if (subdomains == null) {
-			subdomains = new EObjectContainmentEList.Resolving(Domain.class,
-					this, UmaPackage.DOMAIN__SUBDOMAINS);
-		}
-		return subdomains;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.DOMAIN__SUBDOMAINS:
-			return ((InternalEList) getSubdomains())
-					.basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.DOMAIN__WORK_PRODUCTS:
-			return getWorkProducts();
-		case UmaPackage.DOMAIN__SUBDOMAINS:
-			return getSubdomains();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.DOMAIN__WORK_PRODUCTS:
-			getWorkProducts().clear();
-			getWorkProducts().addAll((Collection) newValue);
-			return;
-		case UmaPackage.DOMAIN__SUBDOMAINS:
-			getSubdomains().clear();
-			getSubdomains().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.DOMAIN__WORK_PRODUCTS:
-			getWorkProducts().clear();
-			return;
-		case UmaPackage.DOMAIN__SUBDOMAINS:
-			getSubdomains().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.DOMAIN__WORK_PRODUCTS:
-			return workProducts != null && !workProducts.isEmpty();
-		case UmaPackage.DOMAIN__SUBDOMAINS:
-			return subdomains != null && !subdomains.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DomainImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ElementImpl.java
deleted file mode 100644
index 1067139..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ElementImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Element;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class ElementImpl extends MultiResourceEObject implements
-		Element {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ELEMENT;
-	}
-
-} //ElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/EllipseImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/EllipseImpl.java
deleted file mode 100644
index 7a7ee93..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/EllipseImpl.java
+++ /dev/null
@@ -1,529 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Ellipse;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ellipse</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.EllipseImpl#getRadiusX <em>Radius X</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.EllipseImpl#getRadiusY <em>Radius Y</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.EllipseImpl#getRotation <em>Rotation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.EllipseImpl#getStartAngle <em>Start Angle</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.EllipseImpl#getEndAngle <em>End Angle</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.EllipseImpl#getCenter <em>Center</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class EllipseImpl extends GraphicPrimitiveImpl implements Ellipse {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getRadiusX() <em>Radius X</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRadiusX()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double RADIUS_X_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRadiusX() <em>Radius X</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRadiusX()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double radiusX = RADIUS_X_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRadiusY() <em>Radius Y</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRadiusY()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double RADIUS_Y_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRadiusY() <em>Radius Y</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRadiusY()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double radiusY = RADIUS_Y_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRotation() <em>Rotation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRotation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double ROTATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRotation() <em>Rotation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRotation()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double rotation = ROTATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStartAngle() <em>Start Angle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartAngle()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double START_ANGLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStartAngle() <em>Start Angle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartAngle()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double startAngle = START_ANGLE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEndAngle() <em>End Angle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEndAngle()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double END_ANGLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEndAngle() <em>End Angle</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEndAngle()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double endAngle = END_ANGLE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getCenter() <em>Center</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCenter()
-	 * @generated
-	 * @ordered
-	 */
-	protected Point center = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EllipseImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ELLIPSE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getRadiusX() {
-		return radiusX;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRadiusX(Double newRadiusX) {
-		Double oldRadiusX = radiusX;
-		radiusX = newRadiusX;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ELLIPSE__RADIUS_X, oldRadiusX, radiusX));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getRadiusY() {
-		return radiusY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRadiusY(Double newRadiusY) {
-		Double oldRadiusY = radiusY;
-		radiusY = newRadiusY;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ELLIPSE__RADIUS_Y, oldRadiusY, radiusY));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getRotation() {
-		return rotation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRotation(Double newRotation) {
-		Double oldRotation = rotation;
-		rotation = newRotation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ELLIPSE__ROTATION, oldRotation, rotation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getStartAngle() {
-		return startAngle;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStartAngle(Double newStartAngle) {
-		Double oldStartAngle = startAngle;
-		startAngle = newStartAngle;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ELLIPSE__START_ANGLE, oldStartAngle, startAngle));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getEndAngle() {
-		return endAngle;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEndAngle(Double newEndAngle) {
-		Double oldEndAngle = endAngle;
-		endAngle = newEndAngle;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ELLIPSE__END_ANGLE, oldEndAngle, endAngle));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point getCenter() {
-		if (center != null && ((EObject) center).eIsProxy()) {
-			InternalEObject oldCenter = (InternalEObject) center;
-			center = (Point) eResolveProxy(oldCenter);
-			if (center != oldCenter) {
-				InternalEObject newCenter = (InternalEObject) center;
-				NotificationChain msgs = oldCenter.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.ELLIPSE__CENTER,
-						null, null);
-				if (newCenter.eInternalContainer() == null) {
-					msgs = newCenter.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-							- UmaPackage.ELLIPSE__CENTER, null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.ELLIPSE__CENTER, oldCenter, center));
-			}
-		}
-		return center;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point basicGetCenter() {
-		return center;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetCenter(Point newCenter,
-			NotificationChain msgs) {
-		Point oldCenter = center;
-		center = newCenter;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.ELLIPSE__CENTER, oldCenter,
-					newCenter);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCenter(Point newCenter) {
-		if (newCenter != center) {
-			NotificationChain msgs = null;
-			if (center != null)
-				msgs = ((InternalEObject) center).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.ELLIPSE__CENTER,
-						null, msgs);
-			if (newCenter != null)
-				msgs = ((InternalEObject) newCenter).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.ELLIPSE__CENTER,
-						null, msgs);
-			msgs = basicSetCenter(newCenter, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ELLIPSE__CENTER, newCenter, newCenter));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.ELLIPSE__CENTER:
-			return basicSetCenter(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ELLIPSE__RADIUS_X:
-			return getRadiusX();
-		case UmaPackage.ELLIPSE__RADIUS_Y:
-			return getRadiusY();
-		case UmaPackage.ELLIPSE__ROTATION:
-			return getRotation();
-		case UmaPackage.ELLIPSE__START_ANGLE:
-			return getStartAngle();
-		case UmaPackage.ELLIPSE__END_ANGLE:
-			return getEndAngle();
-		case UmaPackage.ELLIPSE__CENTER:
-			if (resolve)
-				return getCenter();
-			return basicGetCenter();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ELLIPSE__RADIUS_X:
-			setRadiusX((Double) newValue);
-			return;
-		case UmaPackage.ELLIPSE__RADIUS_Y:
-			setRadiusY((Double) newValue);
-			return;
-		case UmaPackage.ELLIPSE__ROTATION:
-			setRotation((Double) newValue);
-			return;
-		case UmaPackage.ELLIPSE__START_ANGLE:
-			setStartAngle((Double) newValue);
-			return;
-		case UmaPackage.ELLIPSE__END_ANGLE:
-			setEndAngle((Double) newValue);
-			return;
-		case UmaPackage.ELLIPSE__CENTER:
-			setCenter((Point) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ELLIPSE__RADIUS_X:
-			setRadiusX(RADIUS_X_EDEFAULT);
-			return;
-		case UmaPackage.ELLIPSE__RADIUS_Y:
-			setRadiusY(RADIUS_Y_EDEFAULT);
-			return;
-		case UmaPackage.ELLIPSE__ROTATION:
-			setRotation(ROTATION_EDEFAULT);
-			return;
-		case UmaPackage.ELLIPSE__START_ANGLE:
-			setStartAngle(START_ANGLE_EDEFAULT);
-			return;
-		case UmaPackage.ELLIPSE__END_ANGLE:
-			setEndAngle(END_ANGLE_EDEFAULT);
-			return;
-		case UmaPackage.ELLIPSE__CENTER:
-			setCenter((Point) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ELLIPSE__RADIUS_X:
-			return RADIUS_X_EDEFAULT == null ? radiusX != null
-					: !RADIUS_X_EDEFAULT.equals(radiusX);
-		case UmaPackage.ELLIPSE__RADIUS_Y:
-			return RADIUS_Y_EDEFAULT == null ? radiusY != null
-					: !RADIUS_Y_EDEFAULT.equals(radiusY);
-		case UmaPackage.ELLIPSE__ROTATION:
-			return ROTATION_EDEFAULT == null ? rotation != null
-					: !ROTATION_EDEFAULT.equals(rotation);
-		case UmaPackage.ELLIPSE__START_ANGLE:
-			return START_ANGLE_EDEFAULT == null ? startAngle != null
-					: !START_ANGLE_EDEFAULT.equals(startAngle);
-		case UmaPackage.ELLIPSE__END_ANGLE:
-			return END_ANGLE_EDEFAULT == null ? endAngle != null
-					: !END_ANGLE_EDEFAULT.equals(endAngle);
-		case UmaPackage.ELLIPSE__CENTER:
-			return center != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (radiusX: "); //$NON-NLS-1$
-		result.append(radiusX);
-		result.append(", radiusY: "); //$NON-NLS-1$
-		result.append(radiusY);
-		result.append(", rotation: "); //$NON-NLS-1$
-		result.append(rotation);
-		result.append(", startAngle: "); //$NON-NLS-1$
-		result.append(startAngle);
-		result.append(", endAngle: "); //$NON-NLS-1$
-		result.append(endAngle);
-		result.append(')');
-		return result.toString();
-	}
-
-} //EllipseImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/EstimationConsiderationsImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/EstimationConsiderationsImpl.java
deleted file mode 100644
index 31aebe9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/EstimationConsiderationsImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Estimation Considerations</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class EstimationConsiderationsImpl extends GuidanceImpl implements
-		EstimationConsiderations {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EstimationConsiderationsImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ESTIMATION_CONSIDERATIONS;
-	}
-
-} //EstimationConsiderationsImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ExampleImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ExampleImpl.java
deleted file mode 100644
index d7476ac..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ExampleImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Example</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ExampleImpl extends GuidanceImpl implements Example {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExampleImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.EXAMPLE;
-	}
-
-} //ExampleImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphConnectorImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphConnectorImpl.java
deleted file mode 100644
index 6974c9a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphConnectorImpl.java
+++ /dev/null
@@ -1,286 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Graph Connector</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphConnectorImpl#getGraphElement <em>Graph Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphConnectorImpl#getGraphEdge <em>Graph Edge</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class GraphConnectorImpl extends GraphElementImpl implements
-		GraphConnector {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getGraphEdge() <em>Graph Edge</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGraphEdge()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList graphEdge = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphConnectorImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GRAPH_CONNECTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement getGraphElement() {
-		if (eContainerFeatureID != UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT)
-			return null;
-		return (GraphElement) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement basicGetGraphElement() {
-		if (eContainerFeatureID != UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT)
-			return null;
-		return (GraphElement) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetGraphElement(GraphElement newGraphElement,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newGraphElement,
-				UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGraphElement(GraphElement newGraphElement) {
-		if (newGraphElement != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT && newGraphElement != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newGraphElement))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newGraphElement != null)
-				msgs = ((InternalEObject) newGraphElement).eInverseAdd(this,
-						UmaPackage.GRAPH_ELEMENT__ANCHORAGE,
-						GraphElement.class, msgs);
-			msgs = basicSetGraphElement(newGraphElement, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT, newGraphElement,
-					newGraphElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getGraphEdge() {
-		if (graphEdge == null) {
-			graphEdge = new EObjectWithInverseResolvingEList.ManyInverse(
-					GraphEdge.class, this,
-					UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE,
-					UmaPackage.GRAPH_EDGE__ANCHOR);
-		}
-		return graphEdge;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetGraphElement((GraphElement) otherEnd, msgs);
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE:
-			return ((InternalEList) getGraphEdge()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT:
-			return basicSetGraphElement(null, msgs);
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE:
-			return ((InternalEList) getGraphEdge()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.GRAPH_ELEMENT__ANCHORAGE, GraphElement.class,
-					msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT:
-			if (resolve)
-				return getGraphElement();
-			return basicGetGraphElement();
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE:
-			return getGraphEdge();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT:
-			setGraphElement((GraphElement) newValue);
-			return;
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE:
-			getGraphEdge().clear();
-			getGraphEdge().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT:
-			setGraphElement((GraphElement) null);
-			return;
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE:
-			getGraphEdge().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT:
-			return basicGetGraphElement() != null;
-		case UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE:
-			return graphEdge != null && !graphEdge.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //GraphConnectorImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphEdgeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphEdgeImpl.java
deleted file mode 100644
index 7b2c909..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphEdgeImpl.java
+++ /dev/null
@@ -1,222 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Graph Edge</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphEdgeImpl#getAnchor <em>Anchor</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphEdgeImpl#getWaypoints <em>Waypoints</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class GraphEdgeImpl extends GraphElementImpl implements GraphEdge {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getAnchor() <em>Anchor</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAnchor()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList anchor = null;
-
-	/**
-	 * The cached value of the '{@link #getWaypoints() <em>Waypoints</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWaypoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList waypoints = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphEdgeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GRAPH_EDGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAnchor() {
-		if (anchor == null) {
-			anchor = new EObjectWithInverseResolvingEList.ManyInverse(
-					GraphConnector.class, this, UmaPackage.GRAPH_EDGE__ANCHOR,
-					UmaPackage.GRAPH_CONNECTOR__GRAPH_EDGE);
-		}
-		return anchor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getWaypoints() {
-		if (waypoints == null) {
-			waypoints = new EObjectContainmentEList.Resolving(Point.class,
-					this, UmaPackage.GRAPH_EDGE__WAYPOINTS);
-		}
-		return waypoints;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_EDGE__ANCHOR:
-			return ((InternalEList) getAnchor()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_EDGE__ANCHOR:
-			return ((InternalEList) getAnchor()).basicRemove(otherEnd, msgs);
-		case UmaPackage.GRAPH_EDGE__WAYPOINTS:
-			return ((InternalEList) getWaypoints()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_EDGE__ANCHOR:
-			return getAnchor();
-		case UmaPackage.GRAPH_EDGE__WAYPOINTS:
-			return getWaypoints();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_EDGE__ANCHOR:
-			getAnchor().clear();
-			getAnchor().addAll((Collection) newValue);
-			return;
-		case UmaPackage.GRAPH_EDGE__WAYPOINTS:
-			getWaypoints().clear();
-			getWaypoints().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_EDGE__ANCHOR:
-			getAnchor().clear();
-			return;
-		case UmaPackage.GRAPH_EDGE__WAYPOINTS:
-			getWaypoints().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.GRAPH_EDGE__ANCHOR:
-			return anchor != null && !anchor.isEmpty();
-		case UmaPackage.GRAPH_EDGE__WAYPOINTS:
-			return waypoints != null && !waypoints.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //GraphEdgeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphElementImpl.java
deleted file mode 100644
index a6e36e4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphElementImpl.java
+++ /dev/null
@@ -1,502 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Graph Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphElementImpl#getPosition <em>Position</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphElementImpl#getContained <em>Contained</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphElementImpl#getLink <em>Link</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphElementImpl#getAnchorage <em>Anchorage</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphElementImpl#getSemanticModel <em>Semantic Model</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class GraphElementImpl extends DiagramElementImpl implements
-		GraphElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getPosition() <em>Position</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPosition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Point position = null;
-
-	/**
-	 * The cached value of the '{@link #getContained() <em>Contained</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getContained()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList contained = null;
-
-	/**
-	 * The cached value of the '{@link #getLink() <em>Link</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList link = null;
-
-	/**
-	 * The cached value of the '{@link #getAnchorage() <em>Anchorage</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAnchorage()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList anchorage = null;
-
-	/**
-	 * The cached value of the '{@link #getSemanticModel() <em>Semantic Model</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSemanticModel()
-	 * @generated
-	 * @ordered
-	 */
-	protected SemanticModelBridge semanticModel = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GRAPH_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point getPosition() {
-		if (position != null && ((EObject) position).eIsProxy()) {
-			InternalEObject oldPosition = (InternalEObject) position;
-			position = (Point) eResolveProxy(oldPosition);
-			if (position != oldPosition) {
-				InternalEObject newPosition = (InternalEObject) position;
-				NotificationChain msgs = oldPosition.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.GRAPH_ELEMENT__POSITION, null,
-						null);
-				if (newPosition.eInternalContainer() == null) {
-					msgs = newPosition.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-							- UmaPackage.GRAPH_ELEMENT__POSITION, null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.GRAPH_ELEMENT__POSITION, oldPosition,
-							position));
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point basicGetPosition() {
-		return position;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPosition(Point newPosition,
-			NotificationChain msgs) {
-		Point oldPosition = position;
-		position = newPosition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.GRAPH_ELEMENT__POSITION,
-					oldPosition, newPosition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPosition(Point newPosition) {
-		if (newPosition != position) {
-			NotificationChain msgs = null;
-			if (position != null)
-				msgs = ((InternalEObject) position).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.GRAPH_ELEMENT__POSITION, null,
-						msgs);
-			if (newPosition != null)
-				msgs = ((InternalEObject) newPosition).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.GRAPH_ELEMENT__POSITION, null,
-						msgs);
-			msgs = basicSetPosition(newPosition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.GRAPH_ELEMENT__POSITION, newPosition,
-					newPosition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getContained() {
-		if (contained == null) {
-			contained = new EObjectContainmentWithInverseEList.Resolving(
-					DiagramElement.class, this,
-					UmaPackage.GRAPH_ELEMENT__CONTAINED,
-					UmaPackage.DIAGRAM_ELEMENT__CONTAINER);
-		}
-		return contained;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getLink() {
-		if (link == null) {
-			link = new EObjectContainmentWithInverseEList.Resolving(
-					DiagramLink.class, this, UmaPackage.GRAPH_ELEMENT__LINK,
-					UmaPackage.DIAGRAM_LINK__GRAPH_ELEMENT);
-		}
-		return link;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAnchorage() {
-		if (anchorage == null) {
-			anchorage = new EObjectContainmentWithInverseEList.Resolving(
-					GraphConnector.class, this,
-					UmaPackage.GRAPH_ELEMENT__ANCHORAGE,
-					UmaPackage.GRAPH_CONNECTOR__GRAPH_ELEMENT);
-		}
-		return anchorage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SemanticModelBridge getSemanticModel() {
-		if (semanticModel != null && ((EObject) semanticModel).eIsProxy()) {
-			InternalEObject oldSemanticModel = (InternalEObject) semanticModel;
-			semanticModel = (SemanticModelBridge) eResolveProxy(oldSemanticModel);
-			if (semanticModel != oldSemanticModel) {
-				InternalEObject newSemanticModel = (InternalEObject) semanticModel;
-				NotificationChain msgs = oldSemanticModel.eInverseRemove(this,
-						UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT,
-						SemanticModelBridge.class, null);
-				if (newSemanticModel.eInternalContainer() == null) {
-					msgs = newSemanticModel.eInverseAdd(this,
-							UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT,
-							SemanticModelBridge.class, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL,
-							oldSemanticModel, semanticModel));
-			}
-		}
-		return semanticModel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SemanticModelBridge basicGetSemanticModel() {
-		return semanticModel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSemanticModel(
-			SemanticModelBridge newSemanticModel, NotificationChain msgs) {
-		SemanticModelBridge oldSemanticModel = semanticModel;
-		semanticModel = newSemanticModel;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL,
-					oldSemanticModel, newSemanticModel);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSemanticModel(SemanticModelBridge newSemanticModel) {
-		if (newSemanticModel != semanticModel) {
-			NotificationChain msgs = null;
-			if (semanticModel != null)
-				msgs = ((InternalEObject) semanticModel).eInverseRemove(this,
-						UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT,
-						SemanticModelBridge.class, msgs);
-			if (newSemanticModel != null)
-				msgs = ((InternalEObject) newSemanticModel).eInverseAdd(this,
-						UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT,
-						SemanticModelBridge.class, msgs);
-			msgs = basicSetSemanticModel(newSemanticModel, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL, newSemanticModel,
-					newSemanticModel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_ELEMENT__CONTAINED:
-			return ((InternalEList) getContained()).basicAdd(otherEnd, msgs);
-		case UmaPackage.GRAPH_ELEMENT__LINK:
-			return ((InternalEList) getLink()).basicAdd(otherEnd, msgs);
-		case UmaPackage.GRAPH_ELEMENT__ANCHORAGE:
-			return ((InternalEList) getAnchorage()).basicAdd(otherEnd, msgs);
-		case UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL:
-			if (semanticModel != null)
-				msgs = ((InternalEObject) semanticModel).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL,
-						null, msgs);
-			return basicSetSemanticModel((SemanticModelBridge) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_ELEMENT__POSITION:
-			return basicSetPosition(null, msgs);
-		case UmaPackage.GRAPH_ELEMENT__CONTAINED:
-			return ((InternalEList) getContained()).basicRemove(otherEnd, msgs);
-		case UmaPackage.GRAPH_ELEMENT__LINK:
-			return ((InternalEList) getLink()).basicRemove(otherEnd, msgs);
-		case UmaPackage.GRAPH_ELEMENT__ANCHORAGE:
-			return ((InternalEList) getAnchorage()).basicRemove(otherEnd, msgs);
-		case UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL:
-			return basicSetSemanticModel(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_ELEMENT__POSITION:
-			if (resolve)
-				return getPosition();
-			return basicGetPosition();
-		case UmaPackage.GRAPH_ELEMENT__CONTAINED:
-			return getContained();
-		case UmaPackage.GRAPH_ELEMENT__LINK:
-			return getLink();
-		case UmaPackage.GRAPH_ELEMENT__ANCHORAGE:
-			return getAnchorage();
-		case UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL:
-			if (resolve)
-				return getSemanticModel();
-			return basicGetSemanticModel();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_ELEMENT__POSITION:
-			setPosition((Point) newValue);
-			return;
-		case UmaPackage.GRAPH_ELEMENT__CONTAINED:
-			getContained().clear();
-			getContained().addAll((Collection) newValue);
-			return;
-		case UmaPackage.GRAPH_ELEMENT__LINK:
-			getLink().clear();
-			getLink().addAll((Collection) newValue);
-			return;
-		case UmaPackage.GRAPH_ELEMENT__ANCHORAGE:
-			getAnchorage().clear();
-			getAnchorage().addAll((Collection) newValue);
-			return;
-		case UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL:
-			setSemanticModel((SemanticModelBridge) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_ELEMENT__POSITION:
-			setPosition((Point) null);
-			return;
-		case UmaPackage.GRAPH_ELEMENT__CONTAINED:
-			getContained().clear();
-			return;
-		case UmaPackage.GRAPH_ELEMENT__LINK:
-			getLink().clear();
-			return;
-		case UmaPackage.GRAPH_ELEMENT__ANCHORAGE:
-			getAnchorage().clear();
-			return;
-		case UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL:
-			setSemanticModel((SemanticModelBridge) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.GRAPH_ELEMENT__POSITION:
-			return position != null;
-		case UmaPackage.GRAPH_ELEMENT__CONTAINED:
-			return contained != null && !contained.isEmpty();
-		case UmaPackage.GRAPH_ELEMENT__LINK:
-			return link != null && !link.isEmpty();
-		case UmaPackage.GRAPH_ELEMENT__ANCHORAGE:
-			return anchorage != null && !anchorage.isEmpty();
-		case UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL:
-			return semanticModel != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //GraphElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphNodeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphNodeImpl.java
deleted file mode 100644
index 98a0a8e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphNodeImpl.java
+++ /dev/null
@@ -1,235 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Graph Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.GraphNodeImpl#getSize <em>Size</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class GraphNodeImpl extends GraphElementImpl implements GraphNode {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getSize() <em>Size</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSize()
-	 * @generated
-	 * @ordered
-	 */
-	protected Dimension size = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphNodeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GRAPH_NODE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Dimension getSize() {
-		if (size != null && ((EObject) size).eIsProxy()) {
-			InternalEObject oldSize = (InternalEObject) size;
-			size = (Dimension) eResolveProxy(oldSize);
-			if (size != oldSize) {
-				InternalEObject newSize = (InternalEObject) size;
-				NotificationChain msgs = oldSize.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.GRAPH_NODE__SIZE,
-						null, null);
-				if (newSize.eInternalContainer() == null) {
-					msgs = newSize.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-							- UmaPackage.GRAPH_NODE__SIZE, null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.GRAPH_NODE__SIZE, oldSize, size));
-			}
-		}
-		return size;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Dimension basicGetSize() {
-		return size;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSize(Dimension newSize,
-			NotificationChain msgs) {
-		Dimension oldSize = size;
-		size = newSize;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.GRAPH_NODE__SIZE, oldSize,
-					newSize);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSize(Dimension newSize) {
-		if (newSize != size) {
-			NotificationChain msgs = null;
-			if (size != null)
-				msgs = ((InternalEObject) size).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.GRAPH_NODE__SIZE,
-						null, msgs);
-			if (newSize != null)
-				msgs = ((InternalEObject) newSize).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.GRAPH_NODE__SIZE,
-						null, msgs);
-			msgs = basicSetSize(newSize, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.GRAPH_NODE__SIZE, newSize, newSize));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_NODE__SIZE:
-			return basicSetSize(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_NODE__SIZE:
-			if (resolve)
-				return getSize();
-			return basicGetSize();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_NODE__SIZE:
-			setSize((Dimension) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.GRAPH_NODE__SIZE:
-			setSize((Dimension) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.GRAPH_NODE__SIZE:
-			return size != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //GraphNodeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphicPrimitiveImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphicPrimitiveImpl.java
deleted file mode 100644
index c5a12d7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GraphicPrimitiveImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.GraphicPrimitive;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Graphic Primitive</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class GraphicPrimitiveImpl extends LeafElementImpl implements
-		GraphicPrimitive {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GraphicPrimitiveImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GRAPHIC_PRIMITIVE;
-	}
-
-} //GraphicPrimitiveImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidanceDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidanceDescriptionImpl.java
deleted file mode 100644
index e8d6120..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidanceDescriptionImpl.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Guidance Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.GuidanceDescriptionImpl#getAttachments <em>Attachments</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class GuidanceDescriptionImpl extends ContentDescriptionImpl implements
-		GuidanceDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getAttachments() <em>Attachments</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttachments()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ATTACHMENTS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getAttachments() <em>Attachments</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttachments()
-	 * @generated
-	 * @ordered
-	 */
-	protected String attachments = ATTACHMENTS_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidanceDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GUIDANCE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAttachments() {
-		return attachments;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttachments(String newAttachments) {
-		String oldAttachments = attachments;
-		attachments = newAttachments;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENTS,
-					oldAttachments, attachments));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENTS:
-			return getAttachments();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENTS:
-			setAttachments((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENTS:
-			setAttachments(ATTACHMENTS_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENTS:
-			return ATTACHMENTS_EDEFAULT == null ? attachments != null
-					: !ATTACHMENTS_EDEFAULT.equals(attachments);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (attachments: "); //$NON-NLS-1$
-		result.append(attachments);
-		result.append(')');
-		return result.toString();
-	}
-
-} //GuidanceDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidanceImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidanceImpl.java
deleted file mode 100644
index e5abbfb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidanceImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Guidance</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class GuidanceImpl extends ContentElementImpl implements
-		Guidance {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidanceImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GUIDANCE;
-	}
-
-} //GuidanceImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidelineImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidelineImpl.java
deleted file mode 100644
index 9ee19a4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/GuidelineImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Guideline</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class GuidelineImpl extends GuidanceImpl implements Guideline {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidelineImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GUIDELINE;
-	}
-
-} //GuidelineImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ImageImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ImageImpl.java
deleted file mode 100644
index a1e119a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ImageImpl.java
+++ /dev/null
@@ -1,240 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.net.URI;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Image;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Image</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ImageImpl#getUri <em>Uri</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ImageImpl#getMimeType <em>Mime Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ImageImpl extends LeafElementImpl implements Image {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getUri() <em>Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUri()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final URI URI_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUri() <em>Uri</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUri()
-	 * @generated
-	 * @ordered
-	 */
-	protected URI uri = URI_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMimeType() <em>Mime Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMimeType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MIME_TYPE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getMimeType() <em>Mime Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMimeType()
-	 * @generated
-	 * @ordered
-	 */
-	protected String mimeType = MIME_TYPE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ImageImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.IMAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public URI getUri() {
-		return uri;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUri(URI newUri) {
-		URI oldUri = uri;
-		uri = newUri;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.IMAGE__URI, oldUri, uri));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getMimeType() {
-		return mimeType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMimeType(String newMimeType) {
-		String oldMimeType = mimeType;
-		mimeType = newMimeType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.IMAGE__MIME_TYPE, oldMimeType, mimeType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.IMAGE__URI:
-			return getUri();
-		case UmaPackage.IMAGE__MIME_TYPE:
-			return getMimeType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.IMAGE__URI:
-			setUri((URI) newValue);
-			return;
-		case UmaPackage.IMAGE__MIME_TYPE:
-			setMimeType((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.IMAGE__URI:
-			setUri(URI_EDEFAULT);
-			return;
-		case UmaPackage.IMAGE__MIME_TYPE:
-			setMimeType(MIME_TYPE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.IMAGE__URI:
-			return URI_EDEFAULT == null ? uri != null : !URI_EDEFAULT
-					.equals(uri);
-		case UmaPackage.IMAGE__MIME_TYPE:
-			return MIME_TYPE_EDEFAULT == null ? mimeType != null
-					: !MIME_TYPE_EDEFAULT.equals(mimeType);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (uri: "); //$NON-NLS-1$
-		result.append(uri);
-		result.append(", mimeType: "); //$NON-NLS-1$
-		result.append(mimeType);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ImageImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/IterationImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/IterationImpl.java
deleted file mode 100644
index cd2238b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/IterationImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Iteration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IterationImpl extends ActivityImpl implements Iteration {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IterationImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ITERATION;
-	}
-
-} //IterationImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/LeafElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/LeafElementImpl.java
deleted file mode 100644
index 7757a28..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/LeafElementImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.LeafElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Leaf Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class LeafElementImpl extends DiagramElementImpl implements
-		LeafElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LeafElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.LEAF_ELEMENT;
-	}
-
-} //LeafElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodConfigurationImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodConfigurationImpl.java
deleted file mode 100644
index 08a852b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodConfigurationImpl.java
+++ /dev/null
@@ -1,404 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Configuration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl#getMethodPluginSelection <em>Method Plugin Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl#getMethodPackageSelection <em>Method Package Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl#getProcessViews <em>Process Views</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl#getDefaultView <em>Default View</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl#getBaseConfigurations <em>Base Configurations</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl#getSubtractedCategory <em>Subtracted Category</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodConfigurationImpl#getAddedCategory <em>Added Category</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodConfigurationImpl extends MethodUnitImpl implements
-		MethodConfiguration {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getMethodPluginSelection() <em>Method Plugin Selection</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPluginSelection()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPluginSelection = null;
-
-	/**
-	 * The cached value of the '{@link #getMethodPackageSelection() <em>Method Package Selection</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPackageSelection()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPackageSelection = null;
-
-	/**
-	 * The cached value of the '{@link #getProcessViews() <em>Process Views</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProcessViews()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList processViews = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultView() <em>Default View</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultView()
-	 * @generated
-	 * @ordered
-	 */
-	protected ContentCategory defaultView = null;
-
-	/**
-	 * The cached value of the '{@link #getBaseConfigurations() <em>Base Configurations</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaseConfigurations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList baseConfigurations = null;
-
-	/**
-	 * The cached value of the '{@link #getSubtractedCategory() <em>Subtracted Category</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubtractedCategory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subtractedCategory = null;
-
-	/**
-	 * The cached value of the '{@link #getAddedCategory() <em>Added Category</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAddedCategory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList addedCategory = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodConfigurationImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_CONFIGURATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getMethodPluginSelection() {
-		if (methodPluginSelection == null) {
-			methodPluginSelection = new EObjectResolvingEList(
-					MethodPlugin.class, this,
-					UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION);
-		}
-		return methodPluginSelection;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getMethodPackageSelection() {
-		if (methodPackageSelection == null) {
-			methodPackageSelection = new EObjectResolvingEList(
-					MethodPackage.class, this,
-					UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION);
-		}
-		return methodPackageSelection;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getProcessViews() {
-		if (processViews == null) {
-			processViews = new EObjectResolvingEList(ContentCategory.class,
-					this, UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEWS);
-		}
-		return processViews;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentCategory getDefaultView() {
-		if (defaultView != null && ((EObject) defaultView).eIsProxy()) {
-			InternalEObject oldDefaultView = (InternalEObject) defaultView;
-			defaultView = (ContentCategory) eResolveProxy(oldDefaultView);
-			if (defaultView != oldDefaultView) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW,
-							oldDefaultView, defaultView));
-			}
-		}
-		return defaultView;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentCategory basicGetDefaultView() {
-		return defaultView;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultView(ContentCategory newDefaultView) {
-		ContentCategory oldDefaultView = defaultView;
-		defaultView = newDefaultView;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW,
-					oldDefaultView, defaultView));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getBaseConfigurations() {
-		if (baseConfigurations == null) {
-			baseConfigurations = new EObjectResolvingEList(
-					MethodConfiguration.class, this,
-					UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATIONS);
-		}
-		return baseConfigurations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubtractedCategory() {
-		if (subtractedCategory == null) {
-			subtractedCategory = new EObjectResolvingEList(
-					ContentCategory.class, this,
-					UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY);
-		}
-		return subtractedCategory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAddedCategory() {
-		if (addedCategory == null) {
-			addedCategory = new EObjectResolvingEList(ContentCategory.class,
-					this, UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY);
-		}
-		return addedCategory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-			return getMethodPluginSelection();
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-			return getMethodPackageSelection();
-		case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEWS:
-			return getProcessViews();
-		case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-			if (resolve)
-				return getDefaultView();
-			return basicGetDefaultView();
-		case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATIONS:
-			return getBaseConfigurations();
-		case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-			return getSubtractedCategory();
-		case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-			return getAddedCategory();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-			getMethodPluginSelection().clear();
-			getMethodPluginSelection().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-			getMethodPackageSelection().clear();
-			getMethodPackageSelection().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEWS:
-			getProcessViews().clear();
-			getProcessViews().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-			setDefaultView((ContentCategory) newValue);
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATIONS:
-			getBaseConfigurations().clear();
-			getBaseConfigurations().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-			getSubtractedCategory().clear();
-			getSubtractedCategory().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-			getAddedCategory().clear();
-			getAddedCategory().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-			getMethodPluginSelection().clear();
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-			getMethodPackageSelection().clear();
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEWS:
-			getProcessViews().clear();
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-			setDefaultView((ContentCategory) null);
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATIONS:
-			getBaseConfigurations().clear();
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-			getSubtractedCategory().clear();
-			return;
-		case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-			getAddedCategory().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-			return methodPluginSelection != null
-					&& !methodPluginSelection.isEmpty();
-		case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-			return methodPackageSelection != null
-					&& !methodPackageSelection.isEmpty();
-		case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEWS:
-			return processViews != null && !processViews.isEmpty();
-		case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-			return defaultView != null;
-		case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATIONS:
-			return baseConfigurations != null && !baseConfigurations.isEmpty();
-		case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-			return subtractedCategory != null && !subtractedCategory.isEmpty();
-		case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-			return addedCategory != null && !addedCategory.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //MethodConfigurationImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodElementImpl.java
deleted file mode 100644
index 7ca51e1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodElementImpl.java
+++ /dev/null
@@ -1,465 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodElementImpl#getGuid <em>Guid</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodElementImpl#getBriefDescription <em>Brief Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodElementImpl#getOwnedRules <em>Owned Rules</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodElementImpl#getMethodElementProperty <em>Method Element Property</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodElementImpl#getSuppressed <em>Suppressed</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodElementImpl#getOrderingGuide <em>Ordering Guide</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class MethodElementImpl extends PackageableElementImpl
-		implements MethodElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getGuid() <em>Guid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGuid()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String GUID_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getGuid() <em>Guid</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGuid()
-	 * @generated
-	 * @ordered
-	 */
-	protected String guid = GUID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBriefDescription() <em>Brief Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BRIEF_DESCRIPTION_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getBriefDescription() <em>Brief Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String briefDescription = BRIEF_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getOwnedRules() <em>Owned Rules</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOwnedRules()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList ownedRules = null;
-
-	/**
-	 * The cached value of the '{@link #getMethodElementProperty() <em>Method Element Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodElementProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodElementProperty = null;
-
-	/**
-	 * The default value of the '{@link #getSuppressed() <em>Suppressed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuppressed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean SUPPRESSED_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getSuppressed() <em>Suppressed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuppressed()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean suppressed = SUPPRESSED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOrderingGuide() <em>Ordering Guide</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOrderingGuide()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ORDERING_GUIDE_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getOrderingGuide() <em>Ordering Guide</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOrderingGuide()
-	 * @generated
-	 * @ordered
-	 */
-	protected String orderingGuide = ORDERING_GUIDE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public String getGuid() {
-		if (guid == null || guid.length() == 0) {
-			guid = UmaUtil.generateGUID();
-		}
-		return guid;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public void setGuid(String newGuid) {
-		String oldGuid = guid;
-		guid = newGuid;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_ELEMENT__GUID, oldGuid, guid));
-
-		// synch up the resource's IDToEObjectMap and EObjectToIDMap with newGuid
-		//
-		if (eResource() instanceof XMLResource) {
-			XMLResource resource = ((XMLResource) eResource());
-			resource.setID(this, newGuid);
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBriefDescription() {
-		return briefDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBriefDescription(String newBriefDescription) {
-		String oldBriefDescription = briefDescription;
-		briefDescription = newBriefDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION,
-					oldBriefDescription, briefDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getOwnedRules() {
-		if (ownedRules == null) {
-			ownedRules = new EObjectContainmentEList.Resolving(
-					Constraint.class, this,
-					UmaPackage.METHOD_ELEMENT__OWNED_RULES);
-		}
-		return ownedRules;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getMethodElementProperty() {
-		if (methodElementProperty == null) {
-			methodElementProperty = new EObjectContainmentEList.Resolving(
-					MethodElementProperty.class, this,
-					UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY);
-		}
-		return methodElementProperty;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getSuppressed() {
-		return suppressed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuppressed(Boolean newSuppressed) {
-		Boolean oldSuppressed = suppressed;
-		suppressed = newSuppressed;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_ELEMENT__SUPPRESSED, oldSuppressed,
-					suppressed));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getOrderingGuide() {
-		return orderingGuide;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOrderingGuide(String newOrderingGuide) {
-		String oldOrderingGuide = orderingGuide;
-		orderingGuide = newOrderingGuide;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE,
-					oldOrderingGuide, orderingGuide));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT__OWNED_RULES:
-			return ((InternalEList) getOwnedRules())
-					.basicRemove(otherEnd, msgs);
-		case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-			return ((InternalEList) getMethodElementProperty()).basicRemove(
-					otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT__GUID:
-			return getGuid();
-		case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-			return getBriefDescription();
-		case UmaPackage.METHOD_ELEMENT__OWNED_RULES:
-			return getOwnedRules();
-		case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-			return getMethodElementProperty();
-		case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-			return getSuppressed();
-		case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-			return getOrderingGuide();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT__GUID:
-			setGuid((String) newValue);
-			return;
-		case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-			setBriefDescription((String) newValue);
-			return;
-		case UmaPackage.METHOD_ELEMENT__OWNED_RULES:
-			getOwnedRules().clear();
-			getOwnedRules().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-			getMethodElementProperty().clear();
-			getMethodElementProperty().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-			setSuppressed((Boolean) newValue);
-			return;
-		case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-			setOrderingGuide((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT__GUID:
-			setGuid(GUID_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-			setBriefDescription(BRIEF_DESCRIPTION_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_ELEMENT__OWNED_RULES:
-			getOwnedRules().clear();
-			return;
-		case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-			getMethodElementProperty().clear();
-			return;
-		case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-			setSuppressed(SUPPRESSED_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-			setOrderingGuide(ORDERING_GUIDE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT__GUID:
-			return GUID_EDEFAULT == null ? guid != null : !GUID_EDEFAULT
-					.equals(guid);
-		case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-			return BRIEF_DESCRIPTION_EDEFAULT == null ? briefDescription != null
-					: !BRIEF_DESCRIPTION_EDEFAULT.equals(briefDescription);
-		case UmaPackage.METHOD_ELEMENT__OWNED_RULES:
-			return ownedRules != null && !ownedRules.isEmpty();
-		case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-			return methodElementProperty != null
-					&& !methodElementProperty.isEmpty();
-		case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-			return SUPPRESSED_EDEFAULT == null ? suppressed != null
-					: !SUPPRESSED_EDEFAULT.equals(suppressed);
-		case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-			return ORDERING_GUIDE_EDEFAULT == null ? orderingGuide != null
-					: !ORDERING_GUIDE_EDEFAULT.equals(orderingGuide);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (guid: "); //$NON-NLS-1$
-		result.append(guid);
-		result.append(", briefDescription: "); //$NON-NLS-1$
-		result.append(briefDescription);
-		result.append(", suppressed: "); //$NON-NLS-1$
-		result.append(suppressed);
-		result.append(", orderingGuide: "); //$NON-NLS-1$
-		result.append(orderingGuide);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodElementPropertyImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodElementPropertyImpl.java
deleted file mode 100644
index 64ad3b5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodElementPropertyImpl.java
+++ /dev/null
@@ -1,186 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Element Property</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodElementPropertyImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodElementPropertyImpl extends PackageableElementImpl implements
-		MethodElementProperty {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodElementPropertyImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_ELEMENT_PROPERTY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-			return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-			setValue((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-			setValue(VALUE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-			return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT
-					.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (value: "); //$NON-NLS-1$
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodElementPropertyImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodLibraryImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodLibraryImpl.java
deleted file mode 100644
index cc4626c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodLibraryImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodLibraryImpl#getMethodPlugins <em>Method Plugins</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodLibraryImpl#getPredefinedConfigurations <em>Predefined Configurations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodLibraryImpl extends MethodUnitImpl implements MethodLibrary {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getMethodPlugins() <em>Method Plugins</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPlugins()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPlugins = null;
-
-	/**
-	 * The cached value of the '{@link #getPredefinedConfigurations() <em>Predefined Configurations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPredefinedConfigurations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList predefinedConfigurations = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodLibraryImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_LIBRARY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getMethodPlugins() {
-		if (methodPlugins == null) {
-			methodPlugins = new EObjectContainmentEList.Resolving(
-					MethodPlugin.class, this,
-					UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS);
-		}
-		return methodPlugins;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPredefinedConfigurations() {
-		if (predefinedConfigurations == null) {
-			predefinedConfigurations = new EObjectContainmentEList.Resolving(
-					MethodConfiguration.class, this,
-					UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS);
-		}
-		return predefinedConfigurations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS:
-			return ((InternalEList) getMethodPlugins()).basicRemove(otherEnd,
-					msgs);
-		case UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS:
-			return ((InternalEList) getPredefinedConfigurations()).basicRemove(
-					otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS:
-			return getMethodPlugins();
-		case UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS:
-			return getPredefinedConfigurations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS:
-			getMethodPlugins().clear();
-			getMethodPlugins().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS:
-			getPredefinedConfigurations().clear();
-			getPredefinedConfigurations().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS:
-			getMethodPlugins().clear();
-			return;
-		case UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS:
-			getPredefinedConfigurations().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.METHOD_LIBRARY__METHOD_PLUGINS:
-			return methodPlugins != null && !methodPlugins.isEmpty();
-		case UmaPackage.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS:
-			return predefinedConfigurations != null
-					&& !predefinedConfigurations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //MethodLibraryImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodPackageImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodPackageImpl.java
deleted file mode 100644
index 908847c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodPackageImpl.java
+++ /dev/null
@@ -1,290 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodPackageImpl#getGlobal <em>Global</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodPackageImpl#getReusedPackages <em>Reused Packages</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodPackageImpl#getChildPackages <em>Child Packages</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class MethodPackageImpl extends MethodElementImpl implements
-		MethodPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getGlobal() <em>Global</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGlobal()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean GLOBAL_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getGlobal() <em>Global</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGlobal()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean global = GLOBAL_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getReusedPackages() <em>Reused Packages</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReusedPackages()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList reusedPackages = null;
-
-	/**
-	 * The cached value of the '{@link #getChildPackages() <em>Child Packages</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChildPackages()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList childPackages = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodPackageImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_PACKAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getGlobal() {
-		return global;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGlobal(Boolean newGlobal) {
-		Boolean oldGlobal = global;
-		global = newGlobal;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_PACKAGE__GLOBAL, oldGlobal, global));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getReusedPackages() {
-		if (reusedPackages == null) {
-			reusedPackages = new EObjectResolvingEList(MethodPackage.class,
-					this, UmaPackage.METHOD_PACKAGE__REUSED_PACKAGES);
-		}
-		return reusedPackages;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getChildPackages() {
-		if (childPackages == null) {
-			childPackages = new EObjectContainmentEList.Resolving(
-					MethodPackage.class, this,
-					UmaPackage.METHOD_PACKAGE__CHILD_PACKAGES);
-		}
-		return childPackages;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PACKAGE__CHILD_PACKAGES:
-			return ((InternalEList) getChildPackages()).basicRemove(otherEnd,
-					msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PACKAGE__GLOBAL:
-			return getGlobal();
-		case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGES:
-			return getReusedPackages();
-		case UmaPackage.METHOD_PACKAGE__CHILD_PACKAGES:
-			return getChildPackages();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PACKAGE__GLOBAL:
-			setGlobal((Boolean) newValue);
-			return;
-		case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGES:
-			getReusedPackages().clear();
-			getReusedPackages().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_PACKAGE__CHILD_PACKAGES:
-			getChildPackages().clear();
-			getChildPackages().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PACKAGE__GLOBAL:
-			setGlobal(GLOBAL_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGES:
-			getReusedPackages().clear();
-			return;
-		case UmaPackage.METHOD_PACKAGE__CHILD_PACKAGES:
-			getChildPackages().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.METHOD_PACKAGE__GLOBAL:
-			return GLOBAL_EDEFAULT == null ? global != null : !GLOBAL_EDEFAULT
-					.equals(global);
-		case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGES:
-			return reusedPackages != null && !reusedPackages.isEmpty();
-		case UmaPackage.METHOD_PACKAGE__CHILD_PACKAGES:
-			return childPackages != null && !childPackages.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (global: "); //$NON-NLS-1$
-		result.append(global);
-		result.append(')');
-		return result.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.epf.uma.MethodPackage#getParentPackage()
-	 */
-	public MethodPackage getParentPackage() {
-		EObject parent = eContainer();
-		if (parent instanceof MethodPackage) {
-			return (MethodPackage) parent;
-		}
-		return null;
-	}
-
-} //MethodPackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodPluginImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodPluginImpl.java
deleted file mode 100644
index ab86c42..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodPluginImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Plugin</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodPluginImpl#getUserChangeable <em>User Changeable</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodPluginImpl#getMethodPackages <em>Method Packages</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodPluginImpl#getBases <em>Bases</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodPluginImpl extends MethodUnitImpl implements MethodPlugin {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getUserChangeable() <em>User Changeable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUserChangeable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean USER_CHANGEABLE_EDEFAULT = Boolean.TRUE;
-
-	/**
-	 * The cached value of the '{@link #getUserChangeable() <em>User Changeable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUserChangeable()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean userChangeable = USER_CHANGEABLE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getMethodPackages() <em>Method Packages</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPackages()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPackages = null;
-
-	/**
-	 * The cached value of the '{@link #getBases() <em>Bases</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBases()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList bases = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodPluginImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_PLUGIN;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getUserChangeable() {
-		return userChangeable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUserChangeable(Boolean newUserChangeable) {
-		Boolean oldUserChangeable = userChangeable;
-		userChangeable = newUserChangeable;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE,
-					oldUserChangeable, userChangeable));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getMethodPackages() {
-		if (methodPackages == null) {
-			methodPackages = new EObjectContainmentEList.Resolving(
-					MethodPackage.class, this,
-					UmaPackage.METHOD_PLUGIN__METHOD_PACKAGES);
-		}
-		return methodPackages;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getBases() {
-		if (bases == null) {
-			bases = new EObjectResolvingEList(MethodPlugin.class, this,
-					UmaPackage.METHOD_PLUGIN__BASES);
-		}
-		return bases;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGES:
-			return ((InternalEList) getMethodPackages()).basicRemove(otherEnd,
-					msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-			return getUserChangeable();
-		case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGES:
-			return getMethodPackages();
-		case UmaPackage.METHOD_PLUGIN__BASES:
-			return getBases();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-			setUserChangeable((Boolean) newValue);
-			return;
-		case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGES:
-			getMethodPackages().clear();
-			getMethodPackages().addAll((Collection) newValue);
-			return;
-		case UmaPackage.METHOD_PLUGIN__BASES:
-			getBases().clear();
-			getBases().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-			setUserChangeable(USER_CHANGEABLE_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGES:
-			getMethodPackages().clear();
-			return;
-		case UmaPackage.METHOD_PLUGIN__BASES:
-			getBases().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-			return USER_CHANGEABLE_EDEFAULT == null ? userChangeable != null
-					: !USER_CHANGEABLE_EDEFAULT.equals(userChangeable);
-		case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGES:
-			return methodPackages != null && !methodPackages.isEmpty();
-		case UmaPackage.METHOD_PLUGIN__BASES:
-			return bases != null && !bases.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (userChangeable: "); //$NON-NLS-1$
-		result.append(userChangeable);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodPluginImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodUnitImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodUnitImpl.java
deleted file mode 100644
index f25d048..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MethodUnitImpl.java
+++ /dev/null
@@ -1,424 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Date;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Unit</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodUnitImpl#getAuthors <em>Authors</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodUnitImpl#getChangeDate <em>Change Date</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodUnitImpl#getChangeDescription <em>Change Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodUnitImpl#getVersion <em>Version</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.MethodUnitImpl#getCopyrightStatement <em>Copyright Statement</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class MethodUnitImpl extends MethodElementImpl implements
-		MethodUnit {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String AUTHORS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected String authors = AUTHORS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Date CHANGE_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Date changeDate = CHANGE_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CHANGE_DESCRIPTION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String changeDescription = CHANGE_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VERSION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected String version = VERSION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getCopyrightStatement() <em>Copyright Statement</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCopyrightStatement()
-	 * @generated
-	 * @ordered
-	 */
-	protected SupportingMaterial copyrightStatement = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodUnitImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_UNIT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAuthors() {
-		return authors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAuthors(String newAuthors) {
-		String oldAuthors = authors;
-		authors = newAuthors;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_UNIT__AUTHORS, oldAuthors, authors));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Date getChangeDate() {
-		return changeDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDate(Date newChangeDate) {
-		Date oldChangeDate = changeDate;
-		changeDate = newChangeDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_UNIT__CHANGE_DATE, oldChangeDate,
-					changeDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getChangeDescription() {
-		return changeDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDescription(String newChangeDescription) {
-		String oldChangeDescription = changeDescription;
-		changeDescription = newChangeDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION,
-					oldChangeDescription, changeDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVersion(String newVersion) {
-		String oldVersion = version;
-		version = newVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_UNIT__VERSION, oldVersion, version));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportingMaterial getCopyrightStatement() {
-		if (copyrightStatement != null
-				&& ((EObject) copyrightStatement).eIsProxy()) {
-			InternalEObject oldCopyrightStatement = (InternalEObject) copyrightStatement;
-			copyrightStatement = (SupportingMaterial) eResolveProxy(oldCopyrightStatement);
-			if (copyrightStatement != oldCopyrightStatement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT,
-							oldCopyrightStatement, copyrightStatement));
-			}
-		}
-		return copyrightStatement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportingMaterial basicGetCopyrightStatement() {
-		return copyrightStatement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCopyrightStatement(SupportingMaterial newCopyrightStatement) {
-		SupportingMaterial oldCopyrightStatement = copyrightStatement;
-		copyrightStatement = newCopyrightStatement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT,
-					oldCopyrightStatement, copyrightStatement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.METHOD_UNIT__AUTHORS:
-			return getAuthors();
-		case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-			return getChangeDate();
-		case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-			return getChangeDescription();
-		case UmaPackage.METHOD_UNIT__VERSION:
-			return getVersion();
-		case UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT:
-			if (resolve)
-				return getCopyrightStatement();
-			return basicGetCopyrightStatement();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.METHOD_UNIT__AUTHORS:
-			setAuthors((String) newValue);
-			return;
-		case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-			setChangeDate((Date) newValue);
-			return;
-		case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-			setChangeDescription((String) newValue);
-			return;
-		case UmaPackage.METHOD_UNIT__VERSION:
-			setVersion((String) newValue);
-			return;
-		case UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT:
-			setCopyrightStatement((SupportingMaterial) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.METHOD_UNIT__AUTHORS:
-			setAuthors(AUTHORS_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-			setChangeDate(CHANGE_DATE_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-			setChangeDescription(CHANGE_DESCRIPTION_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_UNIT__VERSION:
-			setVersion(VERSION_EDEFAULT);
-			return;
-		case UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT:
-			setCopyrightStatement((SupportingMaterial) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.METHOD_UNIT__AUTHORS:
-			return AUTHORS_EDEFAULT == null ? authors != null
-					: !AUTHORS_EDEFAULT.equals(authors);
-		case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-			return CHANGE_DATE_EDEFAULT == null ? changeDate != null
-					: !CHANGE_DATE_EDEFAULT.equals(changeDate);
-		case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-			return CHANGE_DESCRIPTION_EDEFAULT == null ? changeDescription != null
-					: !CHANGE_DESCRIPTION_EDEFAULT.equals(changeDescription);
-		case UmaPackage.METHOD_UNIT__VERSION:
-			return VERSION_EDEFAULT == null ? version != null
-					: !VERSION_EDEFAULT.equals(version);
-		case UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT:
-			return copyrightStatement != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (authors: "); //$NON-NLS-1$
-		result.append(authors);
-		result.append(", changeDate: "); //$NON-NLS-1$
-		result.append(changeDate);
-		result.append(", changeDescription: "); //$NON-NLS-1$
-		result.append(changeDescription);
-		result.append(", version: "); //$NON-NLS-1$
-		result.append(version);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodUnitImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MilestoneImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MilestoneImpl.java
deleted file mode 100644
index 52e7208..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/MilestoneImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Milestone</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class MilestoneImpl extends WorkBreakdownElementImpl implements
-		Milestone {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MilestoneImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.MILESTONE;
-	}
-
-} //MilestoneImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/NamedElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/NamedElementImpl.java
deleted file mode 100644
index 2fd8dd9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/NamedElementImpl.java
+++ /dev/null
@@ -1,183 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Named Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.NamedElementImpl#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class NamedElementImpl extends ElementImpl implements
-		NamedElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NamedElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.NAMED_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.NAMED_ELEMENT__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.NAMED_ELEMENT__NAME:
-			return getName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.NAMED_ELEMENT__NAME:
-			setName((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.NAMED_ELEMENT__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.NAMED_ELEMENT__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NamedElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/NamespaceImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/NamespaceImpl.java
deleted file mode 100644
index 10b2317..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/NamespaceImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Namespace;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Namespace</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class NamespaceImpl extends NamedElementImpl implements
-		Namespace {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NamespaceImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.NAMESPACE;
-	}
-
-} //NamespaceImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/OutcomeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/OutcomeImpl.java
deleted file mode 100644
index 969f9ac..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/OutcomeImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Outcome</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class OutcomeImpl extends WorkProductImpl implements Outcome {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OutcomeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.OUTCOME;
-	}
-
-} //OutcomeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PackageImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PackageImpl.java
deleted file mode 100644
index 216ecdb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PackageImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PackageImpl extends NamespaceImpl implements
-		org.eclipse.epf.uma.Package {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PackageImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PACKAGE;
-	}
-
-} //PackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PackageableElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PackageableElementImpl.java
deleted file mode 100644
index 73ace8b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PackageableElementImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.PackageableElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Packageable Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class PackageableElementImpl extends NamedElementImpl implements
-		PackageableElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PackageableElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PACKAGEABLE_ELEMENT;
-	}
-
-} //PackageableElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PhaseImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PhaseImpl.java
deleted file mode 100644
index 9548e8b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PhaseImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Phase</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PhaseImpl extends ActivityImpl implements Phase {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PhaseImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PHASE;
-	}
-
-} //PhaseImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PlanningDataImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PlanningDataImpl.java
deleted file mode 100644
index af276b6..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PlanningDataImpl.java
+++ /dev/null
@@ -1,298 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Date;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.PlanningData;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Planning Data</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.PlanningDataImpl#getStartDate <em>Start Date</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PlanningDataImpl#getFinishDate <em>Finish Date</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PlanningDataImpl#getRank <em>Rank</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PlanningDataImpl extends ProcessElementImpl implements
-		PlanningData {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getStartDate() <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Date START_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStartDate() <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Date startDate = START_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFinishDate() <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Date FINISH_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinishDate() <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Date finishDate = FINISH_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRank() <em>Rank</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRank()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int RANK_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getRank() <em>Rank</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRank()
-	 * @generated
-	 * @ordered
-	 */
-	protected int rank = RANK_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PlanningDataImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PLANNING_DATA;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Date getStartDate() {
-		return startDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStartDate(Date newStartDate) {
-		Date oldStartDate = startDate;
-		startDate = newStartDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PLANNING_DATA__START_DATE, oldStartDate,
-					startDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Date getFinishDate() {
-		return finishDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinishDate(Date newFinishDate) {
-		Date oldFinishDate = finishDate;
-		finishDate = newFinishDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PLANNING_DATA__FINISH_DATE, oldFinishDate,
-					finishDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getRank() {
-		return rank;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRank(int newRank) {
-		int oldRank = rank;
-		rank = newRank;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PLANNING_DATA__RANK, oldRank, rank));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PLANNING_DATA__START_DATE:
-			return getStartDate();
-		case UmaPackage.PLANNING_DATA__FINISH_DATE:
-			return getFinishDate();
-		case UmaPackage.PLANNING_DATA__RANK:
-			return new Integer(getRank());
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PLANNING_DATA__START_DATE:
-			setStartDate((Date) newValue);
-			return;
-		case UmaPackage.PLANNING_DATA__FINISH_DATE:
-			setFinishDate((Date) newValue);
-			return;
-		case UmaPackage.PLANNING_DATA__RANK:
-			setRank(((Integer) newValue).intValue());
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PLANNING_DATA__START_DATE:
-			setStartDate(START_DATE_EDEFAULT);
-			return;
-		case UmaPackage.PLANNING_DATA__FINISH_DATE:
-			setFinishDate(FINISH_DATE_EDEFAULT);
-			return;
-		case UmaPackage.PLANNING_DATA__RANK:
-			setRank(RANK_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PLANNING_DATA__START_DATE:
-			return START_DATE_EDEFAULT == null ? startDate != null
-					: !START_DATE_EDEFAULT.equals(startDate);
-		case UmaPackage.PLANNING_DATA__FINISH_DATE:
-			return FINISH_DATE_EDEFAULT == null ? finishDate != null
-					: !FINISH_DATE_EDEFAULT.equals(finishDate);
-		case UmaPackage.PLANNING_DATA__RANK:
-			return rank != RANK_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (startDate: "); //$NON-NLS-1$
-		result.append(startDate);
-		result.append(", finishDate: "); //$NON-NLS-1$
-		result.append(finishDate);
-		result.append(", rank: "); //$NON-NLS-1$
-		result.append(rank);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PlanningDataImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PointImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PointImpl.java
deleted file mode 100644
index 6623376..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PointImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Point</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.PointImpl#getX <em>X</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PointImpl#getY <em>Y</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PointImpl extends MultiResourceEObject implements Point {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getX() <em>X</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double X_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getX() <em>X</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double x = X_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getY() <em>Y</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Double Y_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getY() <em>Y</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected Double y = Y_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PointImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.POINT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getX() {
-		return x;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setX(Double newX) {
-		Double oldX = x;
-		x = newX;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.POINT__X, oldX, x));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Double getY() {
-		return y;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setY(Double newY) {
-		Double oldY = y;
-		y = newY;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.POINT__Y, oldY, y));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.POINT__X:
-			return getX();
-		case UmaPackage.POINT__Y:
-			return getY();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.POINT__X:
-			setX((Double) newValue);
-			return;
-		case UmaPackage.POINT__Y:
-			setY((Double) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.POINT__X:
-			setX(X_EDEFAULT);
-			return;
-		case UmaPackage.POINT__Y:
-			setY(Y_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.POINT__X:
-			return X_EDEFAULT == null ? x != null : !X_EDEFAULT.equals(x);
-		case UmaPackage.POINT__Y:
-			return Y_EDEFAULT == null ? y != null : !Y_EDEFAULT.equals(y);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (x: "); //$NON-NLS-1$
-		result.append(x);
-		result.append(", y: "); //$NON-NLS-1$
-		result.append(y);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PointImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PolylineImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PolylineImpl.java
deleted file mode 100644
index 2f78fcd..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PolylineImpl.java
+++ /dev/null
@@ -1,240 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.Polyline;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Polyline</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.PolylineImpl#getClosed <em>Closed</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PolylineImpl#getWaypoints <em>Waypoints</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PolylineImpl extends GraphicPrimitiveImpl implements Polyline {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getClosed() <em>Closed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClosed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean CLOSED_EDEFAULT = Boolean.TRUE;
-
-	/**
-	 * The cached value of the '{@link #getClosed() <em>Closed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClosed()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean closed = CLOSED_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getWaypoints() <em>Waypoints</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWaypoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList waypoints = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PolylineImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.POLYLINE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getClosed() {
-		return closed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setClosed(Boolean newClosed) {
-		Boolean oldClosed = closed;
-		closed = newClosed;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.POLYLINE__CLOSED, oldClosed, closed));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getWaypoints() {
-		if (waypoints == null) {
-			waypoints = new EObjectContainmentEList.Resolving(Point.class,
-					this, UmaPackage.POLYLINE__WAYPOINTS);
-		}
-		return waypoints;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.POLYLINE__WAYPOINTS:
-			return ((InternalEList) getWaypoints()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.POLYLINE__CLOSED:
-			return getClosed();
-		case UmaPackage.POLYLINE__WAYPOINTS:
-			return getWaypoints();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.POLYLINE__CLOSED:
-			setClosed((Boolean) newValue);
-			return;
-		case UmaPackage.POLYLINE__WAYPOINTS:
-			getWaypoints().clear();
-			getWaypoints().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.POLYLINE__CLOSED:
-			setClosed(CLOSED_EDEFAULT);
-			return;
-		case UmaPackage.POLYLINE__WAYPOINTS:
-			getWaypoints().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.POLYLINE__CLOSED:
-			return CLOSED_EDEFAULT == null ? closed != null : !CLOSED_EDEFAULT
-					.equals(closed);
-		case UmaPackage.POLYLINE__WAYPOINTS:
-			return waypoints != null && !waypoints.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (closed: "); //$NON-NLS-1$
-		result.append(closed);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PolylineImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PracticeDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PracticeDescriptionImpl.java
deleted file mode 100644
index 0cbe17c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PracticeDescriptionImpl.java
+++ /dev/null
@@ -1,468 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.PracticeDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Practice Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl#getAdditionalInfo <em>Additional Info</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl#getProblem <em>Problem</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl#getBackground <em>Background</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeDescriptionImpl#getLevelsOfAdoption <em>Levels Of Adoption</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PracticeDescriptionImpl extends ContentDescriptionImpl implements
-		PracticeDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getAdditionalInfo() <em>Additional Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAdditionalInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ADDITIONAL_INFO_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getAdditionalInfo() <em>Additional Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAdditionalInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected String additionalInfo = ADDITIONAL_INFO_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getProblem() <em>Problem</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProblem()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PROBLEM_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getProblem() <em>Problem</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProblem()
-	 * @generated
-	 * @ordered
-	 */
-	protected String problem = PROBLEM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBackground() <em>Background</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBackground()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BACKGROUND_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getBackground() <em>Background</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBackground()
-	 * @generated
-	 * @ordered
-	 */
-	protected String background = BACKGROUND_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String GOALS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected String goals = GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getApplication() <em>Application</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplication()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String APPLICATION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getApplication() <em>Application</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplication()
-	 * @generated
-	 * @ordered
-	 */
-	protected String application = APPLICATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLevelsOfAdoption() <em>Levels Of Adoption</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelsOfAdoption()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LEVELS_OF_ADOPTION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getLevelsOfAdoption() <em>Levels Of Adoption</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelsOfAdoption()
-	 * @generated
-	 * @ordered
-	 */
-	protected String levelsOfAdoption = LEVELS_OF_ADOPTION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PracticeDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PRACTICE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAdditionalInfo() {
-		return additionalInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAdditionalInfo(String newAdditionalInfo) {
-		String oldAdditionalInfo = additionalInfo;
-		additionalInfo = newAdditionalInfo;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO,
-					oldAdditionalInfo, additionalInfo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getProblem() {
-		return problem;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProblem(String newProblem) {
-		String oldProblem = problem;
-		problem = newProblem;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PRACTICE_DESCRIPTION__PROBLEM, oldProblem,
-					problem));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBackground() {
-		return background;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBackground(String newBackground) {
-		String oldBackground = background;
-		background = newBackground;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND, oldBackground,
-					background));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getGoals() {
-		return goals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGoals(String newGoals) {
-		String oldGoals = goals;
-		goals = newGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PRACTICE_DESCRIPTION__GOALS, oldGoals, goals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getApplication() {
-		return application;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setApplication(String newApplication) {
-		String oldApplication = application;
-		application = newApplication;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PRACTICE_DESCRIPTION__APPLICATION,
-					oldApplication, application));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLevelsOfAdoption() {
-		return levelsOfAdoption;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelsOfAdoption(String newLevelsOfAdoption) {
-		String oldLevelsOfAdoption = levelsOfAdoption;
-		levelsOfAdoption = newLevelsOfAdoption;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION,
-					oldLevelsOfAdoption, levelsOfAdoption));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-			return getAdditionalInfo();
-		case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-			return getProblem();
-		case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-			return getBackground();
-		case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-			return getGoals();
-		case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-			return getApplication();
-		case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-			return getLevelsOfAdoption();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-			setAdditionalInfo((String) newValue);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-			setProblem((String) newValue);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-			setBackground((String) newValue);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-			setGoals((String) newValue);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-			setApplication((String) newValue);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-			setLevelsOfAdoption((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-			setAdditionalInfo(ADDITIONAL_INFO_EDEFAULT);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-			setProblem(PROBLEM_EDEFAULT);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-			setBackground(BACKGROUND_EDEFAULT);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-			setGoals(GOALS_EDEFAULT);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-			setApplication(APPLICATION_EDEFAULT);
-			return;
-		case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-			setLevelsOfAdoption(LEVELS_OF_ADOPTION_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-			return ADDITIONAL_INFO_EDEFAULT == null ? additionalInfo != null
-					: !ADDITIONAL_INFO_EDEFAULT.equals(additionalInfo);
-		case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-			return PROBLEM_EDEFAULT == null ? problem != null
-					: !PROBLEM_EDEFAULT.equals(problem);
-		case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-			return BACKGROUND_EDEFAULT == null ? background != null
-					: !BACKGROUND_EDEFAULT.equals(background);
-		case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-			return GOALS_EDEFAULT == null ? goals != null : !GOALS_EDEFAULT
-					.equals(goals);
-		case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-			return APPLICATION_EDEFAULT == null ? application != null
-					: !APPLICATION_EDEFAULT.equals(application);
-		case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-			return LEVELS_OF_ADOPTION_EDEFAULT == null ? levelsOfAdoption != null
-					: !LEVELS_OF_ADOPTION_EDEFAULT.equals(levelsOfAdoption);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (additionalInfo: "); //$NON-NLS-1$
-		result.append(additionalInfo);
-		result.append(", problem: "); //$NON-NLS-1$
-		result.append(problem);
-		result.append(", background: "); //$NON-NLS-1$
-		result.append(background);
-		result.append(", goals: "); //$NON-NLS-1$
-		result.append(goals);
-		result.append(", application: "); //$NON-NLS-1$
-		result.append(application);
-		result.append(", levelsOfAdoption: "); //$NON-NLS-1$
-		result.append(levelsOfAdoption);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PracticeDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PracticeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PracticeImpl.java
deleted file mode 100644
index e1965a0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PracticeImpl.java
+++ /dev/null
@@ -1,241 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Practice</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeImpl#getSubPractices <em>Sub Practices</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeImpl#getContentReferences <em>Content References</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PracticeImpl#getActivityReferences <em>Activity References</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PracticeImpl extends GuidanceImpl implements Practice {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getSubPractices() <em>Sub Practices</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubPractices()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subPractices = null;
-
-	/**
-	 * The cached value of the '{@link #getContentReferences() <em>Content References</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getContentReferences()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList contentReferences = null;
-
-	/**
-	 * The cached value of the '{@link #getActivityReferences() <em>Activity References</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityReferences()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList activityReferences = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PracticeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PRACTICE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubPractices() {
-		if (subPractices == null) {
-			subPractices = new EObjectContainmentEList.Resolving(
-					Practice.class, this, UmaPackage.PRACTICE__SUB_PRACTICES);
-		}
-		return subPractices;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getContentReferences() {
-		if (contentReferences == null) {
-			contentReferences = new EObjectResolvingEList(ContentElement.class,
-					this, UmaPackage.PRACTICE__CONTENT_REFERENCES);
-		}
-		return contentReferences;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getActivityReferences() {
-		if (activityReferences == null) {
-			activityReferences = new EObjectResolvingEList(Activity.class,
-					this, UmaPackage.PRACTICE__ACTIVITY_REFERENCES);
-		}
-		return activityReferences;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.PRACTICE__SUB_PRACTICES:
-			return ((InternalEList) getSubPractices()).basicRemove(otherEnd,
-					msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PRACTICE__SUB_PRACTICES:
-			return getSubPractices();
-		case UmaPackage.PRACTICE__CONTENT_REFERENCES:
-			return getContentReferences();
-		case UmaPackage.PRACTICE__ACTIVITY_REFERENCES:
-			return getActivityReferences();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PRACTICE__SUB_PRACTICES:
-			getSubPractices().clear();
-			getSubPractices().addAll((Collection) newValue);
-			return;
-		case UmaPackage.PRACTICE__CONTENT_REFERENCES:
-			getContentReferences().clear();
-			getContentReferences().addAll((Collection) newValue);
-			return;
-		case UmaPackage.PRACTICE__ACTIVITY_REFERENCES:
-			getActivityReferences().clear();
-			getActivityReferences().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PRACTICE__SUB_PRACTICES:
-			getSubPractices().clear();
-			return;
-		case UmaPackage.PRACTICE__CONTENT_REFERENCES:
-			getContentReferences().clear();
-			return;
-		case UmaPackage.PRACTICE__ACTIVITY_REFERENCES:
-			getActivityReferences().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PRACTICE__SUB_PRACTICES:
-			return subPractices != null && !subPractices.isEmpty();
-		case UmaPackage.PRACTICE__CONTENT_REFERENCES:
-			return contentReferences != null && !contentReferences.isEmpty();
-		case UmaPackage.PRACTICE__ACTIVITY_REFERENCES:
-			return activityReferences != null && !activityReferences.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //PracticeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentDescriptorImpl.java
deleted file mode 100644
index 4de4719..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentDescriptorImpl.java
+++ /dev/null
@@ -1,183 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessComponentDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Component Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentDescriptorImpl#getProcessComponent <em>Process Component</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessComponentDescriptorImpl extends DescriptorImpl implements
-		ProcessComponentDescriptor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getProcessComponent() <em>Process Component</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProcessComponent()
-	 * @generated
-	 * @ordered
-	 */
-	protected ProcessComponent processComponent = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentDescriptorImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_COMPONENT_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponent getProcessComponent() {
-		if (processComponent != null && ((EObject) processComponent).eIsProxy()) {
-			InternalEObject oldProcessComponent = (InternalEObject) processComponent;
-			processComponent = (ProcessComponent) eResolveProxy(oldProcessComponent);
-			if (processComponent != oldProcessComponent) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(
-							this,
-							Notification.RESOLVE,
-							UmaPackage.PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT,
-							oldProcessComponent, processComponent));
-			}
-		}
-		return processComponent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponent basicGetProcessComponent() {
-		return processComponent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProcessComponent(ProcessComponent newProcessComponent) {
-		ProcessComponent oldProcessComponent = processComponent;
-		processComponent = newProcessComponent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT,
-					oldProcessComponent, processComponent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT:
-			if (resolve)
-				return getProcessComponent();
-			return basicGetProcessComponent();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT:
-			setProcessComponent((ProcessComponent) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT:
-			setProcessComponent((ProcessComponent) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT:
-			return processComponent != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProcessComponentDescriptorImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentImpl.java
deleted file mode 100644
index 429bffb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentImpl.java
+++ /dev/null
@@ -1,643 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessComponentInterface;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Component</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentImpl#getAuthors <em>Authors</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentImpl#getChangeDate <em>Change Date</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentImpl#getChangeDescription <em>Change Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentImpl#getVersion <em>Version</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentImpl#getCopyrightStatement <em>Copyright Statement</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentImpl#getInterfaces <em>Interfaces</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentImpl#getProcess <em>Process</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessComponentImpl extends ProcessPackageImpl implements
-		ProcessComponent {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String AUTHORS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected String authors = AUTHORS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Date CHANGE_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Date changeDate = CHANGE_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CHANGE_DESCRIPTION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String changeDescription = CHANGE_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VERSION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected String version = VERSION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getCopyrightStatement() <em>Copyright Statement</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCopyrightStatement()
-	 * @generated
-	 * @ordered
-	 */
-	protected SupportingMaterial copyrightStatement = null;
-
-	/**
-	 * The cached value of the '{@link #getInterfaces() <em>Interfaces</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInterfaces()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList interfaces = null;
-
-	/**
-	 * The cached value of the '{@link #getProcess() <em>Process</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProcess()
-	 * @generated
-	 * @ordered
-	 */
-	protected org.eclipse.epf.uma.Process process = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_COMPONENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAuthors() {
-		return authors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAuthors(String newAuthors) {
-		String oldAuthors = authors;
-		authors = newAuthors;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_COMPONENT__AUTHORS, oldAuthors, authors));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Date getChangeDate() {
-		return changeDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDate(Date newChangeDate) {
-		Date oldChangeDate = changeDate;
-		changeDate = newChangeDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_COMPONENT__CHANGE_DATE, oldChangeDate,
-					changeDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getChangeDescription() {
-		return changeDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDescription(String newChangeDescription) {
-		String oldChangeDescription = changeDescription;
-		changeDescription = newChangeDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION,
-					oldChangeDescription, changeDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVersion(String newVersion) {
-		String oldVersion = version;
-		version = newVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_COMPONENT__VERSION, oldVersion, version));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportingMaterial getCopyrightStatement() {
-		if (copyrightStatement != null
-				&& ((EObject) copyrightStatement).eIsProxy()) {
-			InternalEObject oldCopyrightStatement = (InternalEObject) copyrightStatement;
-			copyrightStatement = (SupportingMaterial) eResolveProxy(oldCopyrightStatement);
-			if (copyrightStatement != oldCopyrightStatement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT,
-							oldCopyrightStatement, copyrightStatement));
-			}
-		}
-		return copyrightStatement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportingMaterial basicGetCopyrightStatement() {
-		return copyrightStatement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCopyrightStatement(SupportingMaterial newCopyrightStatement) {
-		SupportingMaterial oldCopyrightStatement = copyrightStatement;
-		copyrightStatement = newCopyrightStatement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT,
-					oldCopyrightStatement, copyrightStatement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getInterfaces() {
-		if (interfaces == null) {
-			interfaces = new EObjectResolvingEList(
-					ProcessComponentInterface.class, this,
-					UmaPackage.PROCESS_COMPONENT__INTERFACES);
-		}
-		return interfaces;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public org.eclipse.epf.uma.Process getProcess() {
-		if (process != null && ((EObject) process).eIsProxy()) {
-			InternalEObject oldProcess = (InternalEObject) process;
-			process = (org.eclipse.epf.uma.Process) eResolveProxy(oldProcess);
-			if (process != oldProcess) {
-				InternalEObject newProcess = (InternalEObject) process;
-				NotificationChain msgs = oldProcess.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.PROCESS_COMPONENT__PROCESS, null,
-						null);
-				if (newProcess.eInternalContainer() == null) {
-					msgs = newProcess
-							.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-									- UmaPackage.PROCESS_COMPONENT__PROCESS,
-									null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.PROCESS_COMPONENT__PROCESS, oldProcess,
-							process));
-			}
-		}
-		return process;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public org.eclipse.epf.uma.Process basicGetProcess() {
-		return process;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetProcess(
-			org.eclipse.epf.uma.Process newProcess, NotificationChain msgs) {
-		org.eclipse.epf.uma.Process oldProcess = process;
-		process = newProcess;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.PROCESS_COMPONENT__PROCESS,
-					oldProcess, newProcess);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProcess(org.eclipse.epf.uma.Process newProcess) {
-		if (newProcess != process) {
-			NotificationChain msgs = null;
-			if (process != null)
-				msgs = ((InternalEObject) process).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.PROCESS_COMPONENT__PROCESS, null,
-						msgs);
-			if (newProcess != null)
-				msgs = ((InternalEObject) newProcess).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.PROCESS_COMPONENT__PROCESS, null,
-						msgs);
-			msgs = basicSetProcess(newProcess, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_COMPONENT__PROCESS, newProcess,
-					newProcess));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT__PROCESS:
-			return basicSetProcess(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-			return getAuthors();
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-			return getChangeDate();
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-			return getChangeDescription();
-		case UmaPackage.PROCESS_COMPONENT__VERSION:
-			return getVersion();
-		case UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT:
-			if (resolve)
-				return getCopyrightStatement();
-			return basicGetCopyrightStatement();
-		case UmaPackage.PROCESS_COMPONENT__INTERFACES:
-			return getInterfaces();
-		case UmaPackage.PROCESS_COMPONENT__PROCESS:
-			if (resolve)
-				return getProcess();
-			return basicGetProcess();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-			setAuthors((String) newValue);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-			setChangeDate((Date) newValue);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-			setChangeDescription((String) newValue);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__VERSION:
-			setVersion((String) newValue);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT:
-			setCopyrightStatement((SupportingMaterial) newValue);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__INTERFACES:
-			getInterfaces().clear();
-			getInterfaces().addAll((Collection) newValue);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__PROCESS:
-			setProcess((org.eclipse.epf.uma.Process) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-			setAuthors(AUTHORS_EDEFAULT);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-			setChangeDate(CHANGE_DATE_EDEFAULT);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-			setChangeDescription(CHANGE_DESCRIPTION_EDEFAULT);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__VERSION:
-			setVersion(VERSION_EDEFAULT);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT:
-			setCopyrightStatement((SupportingMaterial) null);
-			return;
-		case UmaPackage.PROCESS_COMPONENT__INTERFACES:
-			getInterfaces().clear();
-			return;
-		case UmaPackage.PROCESS_COMPONENT__PROCESS:
-			setProcess((org.eclipse.epf.uma.Process) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-			return AUTHORS_EDEFAULT == null ? authors != null
-					: !AUTHORS_EDEFAULT.equals(authors);
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-			return CHANGE_DATE_EDEFAULT == null ? changeDate != null
-					: !CHANGE_DATE_EDEFAULT.equals(changeDate);
-		case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-			return CHANGE_DESCRIPTION_EDEFAULT == null ? changeDescription != null
-					: !CHANGE_DESCRIPTION_EDEFAULT.equals(changeDescription);
-		case UmaPackage.PROCESS_COMPONENT__VERSION:
-			return VERSION_EDEFAULT == null ? version != null
-					: !VERSION_EDEFAULT.equals(version);
-		case UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT:
-			return copyrightStatement != null;
-		case UmaPackage.PROCESS_COMPONENT__INTERFACES:
-			return interfaces != null && !interfaces.isEmpty();
-		case UmaPackage.PROCESS_COMPONENT__PROCESS:
-			return process != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-		if (baseClass == MethodUnit.class) {
-			switch (derivedFeatureID) {
-			case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-				return UmaPackage.METHOD_UNIT__AUTHORS;
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-				return UmaPackage.METHOD_UNIT__CHANGE_DATE;
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-				return UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION;
-			case UmaPackage.PROCESS_COMPONENT__VERSION:
-				return UmaPackage.METHOD_UNIT__VERSION;
-			case UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT:
-				return UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT;
-			default:
-				return -1;
-			}
-		}
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-		if (baseClass == MethodUnit.class) {
-			switch (baseFeatureID) {
-			case UmaPackage.METHOD_UNIT__AUTHORS:
-				return UmaPackage.PROCESS_COMPONENT__AUTHORS;
-			case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-				return UmaPackage.PROCESS_COMPONENT__CHANGE_DATE;
-			case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-				return UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION;
-			case UmaPackage.METHOD_UNIT__VERSION:
-				return UmaPackage.PROCESS_COMPONENT__VERSION;
-			case UmaPackage.METHOD_UNIT__COPYRIGHT_STATEMENT:
-				return UmaPackage.PROCESS_COMPONENT__COPYRIGHT_STATEMENT;
-			default:
-				return -1;
-			}
-		}
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (authors: "); //$NON-NLS-1$
-		result.append(authors);
-		result.append(", changeDate: "); //$NON-NLS-1$
-		result.append(changeDate);
-		result.append(", changeDescription: "); //$NON-NLS-1$
-		result.append(changeDescription);
-		result.append(", version: "); //$NON-NLS-1$
-		result.append(version);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessComponentImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentInterfaceImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentInterfaceImpl.java
deleted file mode 100644
index 1eea5d4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessComponentInterfaceImpl.java
+++ /dev/null
@@ -1,213 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.ProcessComponentInterface;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Component Interface</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentInterfaceImpl#getInterfaceSpecifications <em>Interface Specifications</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessComponentInterfaceImpl#getInterfaceIO <em>Interface IO</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessComponentInterfaceImpl extends BreakdownElementImpl
-		implements ProcessComponentInterface {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getInterfaceSpecifications() <em>Interface Specifications</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInterfaceSpecifications()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList interfaceSpecifications = null;
-
-	/**
-	 * The cached value of the '{@link #getInterfaceIO() <em>Interface IO</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInterfaceIO()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList interfaceIO = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentInterfaceImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getInterfaceSpecifications() {
-		if (interfaceSpecifications == null) {
-			interfaceSpecifications = new EObjectContainmentEList.Resolving(
-					TaskDescriptor.class,
-					this,
-					UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS);
-		}
-		return interfaceSpecifications;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getInterfaceIO() {
-		if (interfaceIO == null) {
-			interfaceIO = new EObjectContainmentEList.Resolving(
-					WorkProductDescriptor.class, this,
-					UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO);
-		}
-		return interfaceIO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS:
-			return ((InternalEList) getInterfaceSpecifications()).basicRemove(
-					otherEnd, msgs);
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-			return ((InternalEList) getInterfaceIO()).basicRemove(otherEnd,
-					msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS:
-			return getInterfaceSpecifications();
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-			return getInterfaceIO();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS:
-			getInterfaceSpecifications().clear();
-			getInterfaceSpecifications().addAll((Collection) newValue);
-			return;
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-			getInterfaceIO().clear();
-			getInterfaceIO().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS:
-			getInterfaceSpecifications().clear();
-			return;
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-			getInterfaceIO().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS:
-			return interfaceSpecifications != null
-					&& !interfaceSpecifications.isEmpty();
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-			return interfaceIO != null && !interfaceIO.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProcessComponentInterfaceImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessDescriptionImpl.java
deleted file mode 100644
index ab86f8c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessDescriptionImpl.java
+++ /dev/null
@@ -1,240 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.ProcessDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessDescriptionImpl#getScope <em>Scope</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessDescriptionImpl#getUsageNotes <em>Usage Notes</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessDescriptionImpl extends ActivityDescriptionImpl implements
-		ProcessDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getScope() <em>Scope</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScope()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SCOPE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getScope() <em>Scope</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScope()
-	 * @generated
-	 * @ordered
-	 */
-	protected String scope = SCOPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getUsageNotes() <em>Usage Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String USAGE_NOTES_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getUsageNotes() <em>Usage Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected String usageNotes = USAGE_NOTES_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getScope() {
-		return scope;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setScope(String newScope) {
-		String oldScope = scope;
-		scope = newScope;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_DESCRIPTION__SCOPE, oldScope, scope));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getUsageNotes() {
-		return usageNotes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUsageNotes(String newUsageNotes) {
-		String oldUsageNotes = usageNotes;
-		usageNotes = newUsageNotes;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES, oldUsageNotes,
-					usageNotes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-			return getScope();
-		case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-			return getUsageNotes();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-			setScope((String) newValue);
-			return;
-		case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-			setUsageNotes((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-			setScope(SCOPE_EDEFAULT);
-			return;
-		case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-			setUsageNotes(USAGE_NOTES_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-			return SCOPE_EDEFAULT == null ? scope != null : !SCOPE_EDEFAULT
-					.equals(scope);
-		case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-			return USAGE_NOTES_EDEFAULT == null ? usageNotes != null
-					: !USAGE_NOTES_EDEFAULT.equals(usageNotes);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (scope: "); //$NON-NLS-1$
-		result.append(scope);
-		result.append(", usageNotes: "); //$NON-NLS-1$
-		result.append(usageNotes);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessElementImpl.java
deleted file mode 100644
index 3f13c4c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessElementImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class ProcessElementImpl extends DescribableElementImpl
-		implements ProcessElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_ELEMENT;
-	}
-
-} //ProcessElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessFamilyImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessFamilyImpl.java
deleted file mode 100644
index b1fbc22..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessFamilyImpl.java
+++ /dev/null
@@ -1,153 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Family</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessFamilyImpl#getDeliveryProcesses <em>Delivery Processes</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessFamilyImpl extends MethodConfigurationImpl implements
-		ProcessFamily {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getDeliveryProcesses() <em>Delivery Processes</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDeliveryProcesses()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList deliveryProcesses = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessFamilyImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_FAMILY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getDeliveryProcesses() {
-		if (deliveryProcesses == null) {
-			deliveryProcesses = new EObjectResolvingEList(
-					DeliveryProcess.class, this,
-					UmaPackage.PROCESS_FAMILY__DELIVERY_PROCESSES);
-		}
-		return deliveryProcesses;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_FAMILY__DELIVERY_PROCESSES:
-			return getDeliveryProcesses();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_FAMILY__DELIVERY_PROCESSES:
-			getDeliveryProcesses().clear();
-			getDeliveryProcesses().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_FAMILY__DELIVERY_PROCESSES:
-			getDeliveryProcesses().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS_FAMILY__DELIVERY_PROCESSES:
-			return deliveryProcesses != null && !deliveryProcesses.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProcessFamilyImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessImpl.java
deleted file mode 100644
index c6050bb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessImpl.java
+++ /dev/null
@@ -1,257 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessImpl#getIncludesPatterns <em>Includes Patterns</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessImpl#getDefaultContext <em>Default Context</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessImpl#getValidContext <em>Valid Context</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ProcessImpl extends ActivityImpl implements
-		org.eclipse.epf.uma.Process {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getIncludesPatterns() <em>Includes Patterns</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIncludesPatterns()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList includesPatterns = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultContext() <em>Default Context</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultContext()
-	 * @generated
-	 * @ordered
-	 */
-	protected MethodConfiguration defaultContext = null;
-
-	/**
-	 * The cached value of the '{@link #getValidContext() <em>Valid Context</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidContext()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList validContext = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getIncludesPatterns() {
-		if (includesPatterns == null) {
-			includesPatterns = new EObjectResolvingEList(
-					CapabilityPattern.class, this,
-					UmaPackage.PROCESS__INCLUDES_PATTERNS);
-		}
-		return includesPatterns;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodConfiguration getDefaultContext() {
-		if (defaultContext != null && ((EObject) defaultContext).eIsProxy()) {
-			InternalEObject oldDefaultContext = (InternalEObject) defaultContext;
-			defaultContext = (MethodConfiguration) eResolveProxy(oldDefaultContext);
-			if (defaultContext != oldDefaultContext) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.PROCESS__DEFAULT_CONTEXT,
-							oldDefaultContext, defaultContext));
-			}
-		}
-		return defaultContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodConfiguration basicGetDefaultContext() {
-		return defaultContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultContext(MethodConfiguration newDefaultContext) {
-		MethodConfiguration oldDefaultContext = defaultContext;
-		defaultContext = newDefaultContext;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROCESS__DEFAULT_CONTEXT, oldDefaultContext,
-					defaultContext));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getValidContext() {
-		if (validContext == null) {
-			validContext = new EObjectResolvingEList(MethodConfiguration.class,
-					this, UmaPackage.PROCESS__VALID_CONTEXT);
-		}
-		return validContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS__INCLUDES_PATTERNS:
-			return getIncludesPatterns();
-		case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-			if (resolve)
-				return getDefaultContext();
-			return basicGetDefaultContext();
-		case UmaPackage.PROCESS__VALID_CONTEXT:
-			return getValidContext();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS__INCLUDES_PATTERNS:
-			getIncludesPatterns().clear();
-			getIncludesPatterns().addAll((Collection) newValue);
-			return;
-		case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-			setDefaultContext((MethodConfiguration) newValue);
-			return;
-		case UmaPackage.PROCESS__VALID_CONTEXT:
-			getValidContext().clear();
-			getValidContext().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS__INCLUDES_PATTERNS:
-			getIncludesPatterns().clear();
-			return;
-		case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-			setDefaultContext((MethodConfiguration) null);
-			return;
-		case UmaPackage.PROCESS__VALID_CONTEXT:
-			getValidContext().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS__INCLUDES_PATTERNS:
-			return includesPatterns != null && !includesPatterns.isEmpty();
-		case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-			return defaultContext != null;
-		case UmaPackage.PROCESS__VALID_CONTEXT:
-			return validContext != null && !validContext.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProcessImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessPackageImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessPackageImpl.java
deleted file mode 100644
index b632d8d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessPackageImpl.java
+++ /dev/null
@@ -1,209 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessPackageImpl#getProcessElements <em>Process Elements</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessPackageImpl#getDiagrams <em>Diagrams</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessPackageImpl extends MethodPackageImpl implements
-		ProcessPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getProcessElements() <em>Process Elements</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProcessElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList processElements = null;
-
-	/**
-	 * The cached value of the '{@link #getDiagrams() <em>Diagrams</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDiagrams()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList diagrams = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessPackageImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_PACKAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getProcessElements() {
-		if (processElements == null) {
-			processElements = new EObjectContainmentEList.Resolving(
-					ProcessElement.class, this,
-					UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENTS);
-		}
-		return processElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getDiagrams() {
-		if (diagrams == null) {
-			diagrams = new EObjectContainmentEList.Resolving(Diagram.class,
-					this, UmaPackage.PROCESS_PACKAGE__DIAGRAMS);
-		}
-		return diagrams;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENTS:
-			return ((InternalEList) getProcessElements()).basicRemove(otherEnd,
-					msgs);
-		case UmaPackage.PROCESS_PACKAGE__DIAGRAMS:
-			return ((InternalEList) getDiagrams()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENTS:
-			return getProcessElements();
-		case UmaPackage.PROCESS_PACKAGE__DIAGRAMS:
-			return getDiagrams();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENTS:
-			getProcessElements().clear();
-			getProcessElements().addAll((Collection) newValue);
-			return;
-		case UmaPackage.PROCESS_PACKAGE__DIAGRAMS:
-			getDiagrams().clear();
-			getDiagrams().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENTS:
-			getProcessElements().clear();
-			return;
-		case UmaPackage.PROCESS_PACKAGE__DIAGRAMS:
-			getDiagrams().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENTS:
-			return processElements != null && !processElements.isEmpty();
-		case UmaPackage.PROCESS_PACKAGE__DIAGRAMS:
-			return diagrams != null && !diagrams.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProcessPackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessPlanningTemplateImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessPlanningTemplateImpl.java
deleted file mode 100644
index 8cfc57c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ProcessPlanningTemplateImpl.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Planning Template</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ProcessPlanningTemplateImpl#getBasedOnProcesses <em>Based On Processes</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessPlanningTemplateImpl extends ProcessImpl implements
-		ProcessPlanningTemplate {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getBasedOnProcesses() <em>Based On Processes</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBasedOnProcesses()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList basedOnProcesses = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessPlanningTemplateImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_PLANNING_TEMPLATE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getBasedOnProcesses() {
-		if (basedOnProcesses == null) {
-			basedOnProcesses = new EObjectResolvingEList(
-					org.eclipse.epf.uma.Process.class, this,
-					UmaPackage.PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES);
-		}
-		return basedOnProcesses;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES:
-			return getBasedOnProcesses();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES:
-			getBasedOnProcesses().clear();
-			getBasedOnProcesses().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES:
-			getBasedOnProcesses().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES:
-			return basedOnProcesses != null && !basedOnProcesses.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ProcessPlanningTemplateImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PropertyImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PropertyImpl.java
deleted file mode 100644
index ce80e51..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PropertyImpl.java
+++ /dev/null
@@ -1,238 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.PropertyImpl#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.PropertyImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyImpl extends DiagramElementImpl implements Property {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getKey() <em>Key</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKey()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String KEY_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getKey() <em>Key</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKey()
-	 * @generated
-	 * @ordered
-	 */
-	protected String key = KEY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROPERTY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getKey() {
-		return key;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKey(String newKey) {
-		String oldKey = key;
-		key = newKey;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROPERTY__KEY, oldKey, key));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.PROPERTY__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.PROPERTY__KEY:
-			return getKey();
-		case UmaPackage.PROPERTY__VALUE:
-			return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.PROPERTY__KEY:
-			setKey((String) newValue);
-			return;
-		case UmaPackage.PROPERTY__VALUE:
-			setValue((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.PROPERTY__KEY:
-			setKey(KEY_EDEFAULT);
-			return;
-		case UmaPackage.PROPERTY__VALUE:
-			setValue(VALUE_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.PROPERTY__KEY:
-			return KEY_EDEFAULT == null ? key != null : !KEY_EDEFAULT
-					.equals(key);
-		case UmaPackage.PROPERTY__VALUE:
-			return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT
-					.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (key: "); //$NON-NLS-1$
-		result.append(key);
-		result.append(", value: "); //$NON-NLS-1$
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PseudoStateImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PseudoStateImpl.java
deleted file mode 100644
index 2906dec..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/PseudoStateImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PseudoStateImpl.java,v 1.1 2008/01/15 08:52:00 jtham Exp $
- */
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.PseudoState;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Pseudo State</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PseudoStateImpl extends VertexImpl implements PseudoState {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PseudoStateImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PSEUDO_STATE;
-	}
-
-} //PseudoStateImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReferenceImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReferenceImpl.java
deleted file mode 100644
index 2275ee4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReferenceImpl.java
+++ /dev/null
@@ -1,318 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.Reference;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Reference</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ReferenceImpl#getIsIndividualRepresentation <em>Is Individual Representation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.ReferenceImpl#getReferenced <em>Referenced</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferenceImpl extends DiagramElementImpl implements Reference {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getIsIndividualRepresentation() <em>Is Individual Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsIndividualRepresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_INDIVIDUAL_REPRESENTATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getIsIndividualRepresentation() <em>Is Individual Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsIndividualRepresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isIndividualRepresentation = IS_INDIVIDUAL_REPRESENTATION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getReferenced() <em>Referenced</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferenced()
-	 * @generated
-	 * @ordered
-	 */
-	protected DiagramElement referenced = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferenceImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.REFERENCE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsIndividualRepresentation() {
-		return isIndividualRepresentation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsIndividualRepresentation(
-			Boolean newIsIndividualRepresentation) {
-		Boolean oldIsIndividualRepresentation = isIndividualRepresentation;
-		isIndividualRepresentation = newIsIndividualRepresentation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.REFERENCE__IS_INDIVIDUAL_REPRESENTATION,
-					oldIsIndividualRepresentation, isIndividualRepresentation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramElement getReferenced() {
-		if (referenced != null && ((EObject) referenced).eIsProxy()) {
-			InternalEObject oldReferenced = (InternalEObject) referenced;
-			referenced = (DiagramElement) eResolveProxy(oldReferenced);
-			if (referenced != oldReferenced) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.REFERENCE__REFERENCED, oldReferenced,
-							referenced));
-			}
-		}
-		return referenced;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramElement basicGetReferenced() {
-		return referenced;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferenced(DiagramElement newReferenced,
-			NotificationChain msgs) {
-		DiagramElement oldReferenced = referenced;
-		referenced = newReferenced;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.REFERENCE__REFERENCED,
-					oldReferenced, newReferenced);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferenced(DiagramElement newReferenced) {
-		if (newReferenced != referenced) {
-			NotificationChain msgs = null;
-			if (referenced != null)
-				msgs = ((InternalEObject) referenced).eInverseRemove(this,
-						UmaPackage.DIAGRAM_ELEMENT__REFERENCE,
-						DiagramElement.class, msgs);
-			if (newReferenced != null)
-				msgs = ((InternalEObject) newReferenced).eInverseAdd(this,
-						UmaPackage.DIAGRAM_ELEMENT__REFERENCE,
-						DiagramElement.class, msgs);
-			msgs = basicSetReferenced(newReferenced, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.REFERENCE__REFERENCED, newReferenced,
-					newReferenced));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.REFERENCE__REFERENCED:
-			if (referenced != null)
-				msgs = ((InternalEObject) referenced).eInverseRemove(this,
-						UmaPackage.DIAGRAM_ELEMENT__REFERENCE,
-						DiagramElement.class, msgs);
-			return basicSetReferenced((DiagramElement) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.REFERENCE__REFERENCED:
-			return basicSetReferenced(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.REFERENCE__IS_INDIVIDUAL_REPRESENTATION:
-			return getIsIndividualRepresentation();
-		case UmaPackage.REFERENCE__REFERENCED:
-			if (resolve)
-				return getReferenced();
-			return basicGetReferenced();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.REFERENCE__IS_INDIVIDUAL_REPRESENTATION:
-			setIsIndividualRepresentation((Boolean) newValue);
-			return;
-		case UmaPackage.REFERENCE__REFERENCED:
-			setReferenced((DiagramElement) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.REFERENCE__IS_INDIVIDUAL_REPRESENTATION:
-			setIsIndividualRepresentation(IS_INDIVIDUAL_REPRESENTATION_EDEFAULT);
-			return;
-		case UmaPackage.REFERENCE__REFERENCED:
-			setReferenced((DiagramElement) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.REFERENCE__IS_INDIVIDUAL_REPRESENTATION:
-			return IS_INDIVIDUAL_REPRESENTATION_EDEFAULT == null ? isIndividualRepresentation != null
-					: !IS_INDIVIDUAL_REPRESENTATION_EDEFAULT
-							.equals(isIndividualRepresentation);
-		case UmaPackage.REFERENCE__REFERENCED:
-			return referenced != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (isIndividualRepresentation: "); //$NON-NLS-1$
-		result.append(isIndividualRepresentation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferenceImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RegionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RegionImpl.java
deleted file mode 100644
index 24033be..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RegionImpl.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RegionImpl.java,v 1.1 2008/01/15 08:52:01 jtham Exp $
- */
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.State;
-import org.eclipse.epf.uma.StateMachine;
-import org.eclipse.epf.uma.Transition;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Vertex;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Region</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.RegionImpl#getVertex <em>Vertex</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RegionImpl#getTransition <em>Transition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RegionImpl#getState <em>State</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RegionImpl#getStateMachine <em>State Machine</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RegionImpl extends MultiResourceEObject implements Region {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getVertex() <em>Vertex</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVertex()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList vertex = null;
-
-	/**
-	 * The cached value of the '{@link #getTransition() <em>Transition</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTransition()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList transition = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RegionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.REGION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getVertex() {
-		if (vertex == null) {
-			vertex = new EObjectContainmentWithInverseEList.Resolving(
-					Vertex.class, this, UmaPackage.REGION__VERTEX,
-					UmaPackage.VERTEX__CONTAINER);
-		}
-		return vertex;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getTransition() {
-		if (transition == null) {
-			transition = new EObjectContainmentWithInverseEList.Resolving(
-					Transition.class, this, UmaPackage.REGION__TRANSITION,
-					UmaPackage.TRANSITION__CONTAINER);
-		}
-		return transition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public State getState() {
-		if (eContainerFeatureID != UmaPackage.REGION__STATE)
-			return null;
-		return (State) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public State basicGetState() {
-		if (eContainerFeatureID != UmaPackage.REGION__STATE)
-			return null;
-		return (State) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetState(State newState,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newState,
-				UmaPackage.REGION__STATE, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setState(State newState) {
-		if (newState != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.REGION__STATE && newState != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newState))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newState != null)
-				msgs = ((InternalEObject) newState).eInverseAdd(this,
-						UmaPackage.STATE__REGION, State.class, msgs);
-			msgs = basicSetState(newState, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.REGION__STATE, newState, newState));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateMachine getStateMachine() {
-		if (eContainerFeatureID != UmaPackage.REGION__STATE_MACHINE)
-			return null;
-		return (StateMachine) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateMachine basicGetStateMachine() {
-		if (eContainerFeatureID != UmaPackage.REGION__STATE_MACHINE)
-			return null;
-		return (StateMachine) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetStateMachine(StateMachine newStateMachine,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newStateMachine,
-				UmaPackage.REGION__STATE_MACHINE, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStateMachine(StateMachine newStateMachine) {
-		if (newStateMachine != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.REGION__STATE_MACHINE && newStateMachine != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newStateMachine))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newStateMachine != null)
-				msgs = ((InternalEObject) newStateMachine).eInverseAdd(this,
-						UmaPackage.STATE_MACHINE__REGION, StateMachine.class,
-						msgs);
-			msgs = basicSetStateMachine(newStateMachine, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.REGION__STATE_MACHINE, newStateMachine,
-					newStateMachine));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.REGION__VERTEX:
-			return ((InternalEList) getVertex()).basicAdd(otherEnd, msgs);
-		case UmaPackage.REGION__TRANSITION:
-			return ((InternalEList) getTransition()).basicAdd(otherEnd, msgs);
-		case UmaPackage.REGION__STATE:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetState((State) otherEnd, msgs);
-		case UmaPackage.REGION__STATE_MACHINE:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetStateMachine((StateMachine) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.REGION__VERTEX:
-			return ((InternalEList) getVertex()).basicRemove(otherEnd, msgs);
-		case UmaPackage.REGION__TRANSITION:
-			return ((InternalEList) getTransition())
-					.basicRemove(otherEnd, msgs);
-		case UmaPackage.REGION__STATE:
-			return basicSetState(null, msgs);
-		case UmaPackage.REGION__STATE_MACHINE:
-			return basicSetStateMachine(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.REGION__STATE:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.STATE__REGION, State.class, msgs);
-		case UmaPackage.REGION__STATE_MACHINE:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.STATE_MACHINE__REGION, StateMachine.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.REGION__VERTEX:
-			return getVertex();
-		case UmaPackage.REGION__TRANSITION:
-			return getTransition();
-		case UmaPackage.REGION__STATE:
-			if (resolve)
-				return getState();
-			return basicGetState();
-		case UmaPackage.REGION__STATE_MACHINE:
-			if (resolve)
-				return getStateMachine();
-			return basicGetStateMachine();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.REGION__VERTEX:
-			getVertex().clear();
-			getVertex().addAll((Collection) newValue);
-			return;
-		case UmaPackage.REGION__TRANSITION:
-			getTransition().clear();
-			getTransition().addAll((Collection) newValue);
-			return;
-		case UmaPackage.REGION__STATE:
-			setState((State) newValue);
-			return;
-		case UmaPackage.REGION__STATE_MACHINE:
-			setStateMachine((StateMachine) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.REGION__VERTEX:
-			getVertex().clear();
-			return;
-		case UmaPackage.REGION__TRANSITION:
-			getTransition().clear();
-			return;
-		case UmaPackage.REGION__STATE:
-			setState((State) null);
-			return;
-		case UmaPackage.REGION__STATE_MACHINE:
-			setStateMachine((StateMachine) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.REGION__VERTEX:
-			return vertex != null && !vertex.isEmpty();
-		case UmaPackage.REGION__TRANSITION:
-			return transition != null && !transition.isEmpty();
-		case UmaPackage.REGION__STATE:
-			return basicGetState() != null;
-		case UmaPackage.REGION__STATE_MACHINE:
-			return basicGetStateMachine() != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //RegionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReportImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReportImpl.java
deleted file mode 100644
index 374995e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReportImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Report</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ReportImpl extends GuidanceImpl implements Report {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReportImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.REPORT;
-	}
-
-} //ReportImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReusableAssetImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReusableAssetImpl.java
deleted file mode 100644
index 9b1e52d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ReusableAssetImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Reusable Asset</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ReusableAssetImpl extends GuidanceImpl implements ReusableAsset {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReusableAssetImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.REUSABLE_ASSET;
-	}
-
-} //ReusableAssetImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoadmapImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoadmapImpl.java
deleted file mode 100644
index 9060e8b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoadmapImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Roadmap</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class RoadmapImpl extends GuidanceImpl implements Roadmap {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoadmapImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROADMAP;
-	}
-
-} //RoadmapImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleDescriptionImpl.java
deleted file mode 100644
index 14070f0..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleDescriptionImpl.java
+++ /dev/null
@@ -1,298 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.RoleDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleDescriptionImpl#getSkills <em>Skills</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleDescriptionImpl#getAssignmentApproaches <em>Assignment Approaches</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleDescriptionImpl#getSynonyms <em>Synonyms</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleDescriptionImpl extends ContentDescriptionImpl implements
-		RoleDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getSkills() <em>Skills</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSkills()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SKILLS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getSkills() <em>Skills</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSkills()
-	 * @generated
-	 * @ordered
-	 */
-	protected String skills = SKILLS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAssignmentApproaches() <em>Assignment Approaches</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssignmentApproaches()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ASSIGNMENT_APPROACHES_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getAssignmentApproaches() <em>Assignment Approaches</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssignmentApproaches()
-	 * @generated
-	 * @ordered
-	 */
-	protected String assignmentApproaches = ASSIGNMENT_APPROACHES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSynonyms() <em>Synonyms</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSynonyms()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SYNONYMS_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getSynonyms() <em>Synonyms</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSynonyms()
-	 * @generated
-	 * @ordered
-	 */
-	protected String synonyms = SYNONYMS_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSkills() {
-		return skills;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSkills(String newSkills) {
-		String oldSkills = skills;
-		skills = newSkills;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ROLE_DESCRIPTION__SKILLS, oldSkills, skills));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAssignmentApproaches() {
-		return assignmentApproaches;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAssignmentApproaches(String newAssignmentApproaches) {
-		String oldAssignmentApproaches = assignmentApproaches;
-		assignmentApproaches = newAssignmentApproaches;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES,
-					oldAssignmentApproaches, assignmentApproaches));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSynonyms() {
-		return synonyms;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSynonyms(String newSynonyms) {
-		String oldSynonyms = synonyms;
-		synonyms = newSynonyms;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ROLE_DESCRIPTION__SYNONYMS, oldSynonyms,
-					synonyms));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-			return getSkills();
-		case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-			return getAssignmentApproaches();
-		case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-			return getSynonyms();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-			setSkills((String) newValue);
-			return;
-		case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-			setAssignmentApproaches((String) newValue);
-			return;
-		case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-			setSynonyms((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-			setSkills(SKILLS_EDEFAULT);
-			return;
-		case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-			setAssignmentApproaches(ASSIGNMENT_APPROACHES_EDEFAULT);
-			return;
-		case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-			setSynonyms(SYNONYMS_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-			return SKILLS_EDEFAULT == null ? skills != null : !SKILLS_EDEFAULT
-					.equals(skills);
-		case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-			return ASSIGNMENT_APPROACHES_EDEFAULT == null ? assignmentApproaches != null
-					: !ASSIGNMENT_APPROACHES_EDEFAULT
-							.equals(assignmentApproaches);
-		case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-			return SYNONYMS_EDEFAULT == null ? synonyms != null
-					: !SYNONYMS_EDEFAULT.equals(synonyms);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (skills: "); //$NON-NLS-1$
-		result.append(skills);
-		result.append(", assignmentApproaches: "); //$NON-NLS-1$
-		result.append(assignmentApproaches);
-		result.append(", synonyms: "); //$NON-NLS-1$
-		result.append(synonyms);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RoleDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleDescriptorImpl.java
deleted file mode 100644
index 04793b5..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleDescriptorImpl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.BasicInternalEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleDescriptorImpl#getRole <em>Role</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleDescriptorImpl#getModifies <em>Modifies</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleDescriptorImpl#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleDescriptorImpl extends DescriptorImpl implements
-		RoleDescriptor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getRole() <em>Role</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRole()
-	 * @generated
-	 * @ordered
-	 */
-	protected Role role = null;
-
-	/**
-	 * The cached value of the '{@link #getResponsibleFor() <em>Responsible For</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResponsibleFor()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList responsibleFor = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleDescriptorImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Role getRole() {
-		if (role != null && ((EObject) role).eIsProxy()) {
-			InternalEObject oldRole = (InternalEObject) role;
-			role = (Role) eResolveProxy(oldRole);
-			if (role != oldRole) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.ROLE_DESCRIPTOR__ROLE, oldRole, role));
-			}
-		}
-		return role;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Role basicGetRole() {
-		return role;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRole(Role newRole) {
-		Role oldRole = role;
-		role = newRole;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.ROLE_DESCRIPTOR__ROLE, oldRole, role));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public List getModifies() {
-		List performs = AssociationHelper.getPrimaryTaskDescriptors(this);
-		InternalEList modifies = new BasicInternalEList(
-				WorkProductDescriptor.class);
-		if (performs != null && performs.size() > 0) {
-			for (Iterator i = performs.iterator(); i.hasNext();) {
-				TaskDescriptor td = (TaskDescriptor) i.next();
-
-				// for each task, get output work product;
-				List outputWPs = td.getOutput();
-				if (outputWPs != null && outputWPs.size() > 0) {
-					for (Iterator it = outputWPs.iterator(); it.hasNext();) {
-						WorkProductDescriptor wpd = (WorkProductDescriptor) it
-								.next();
-						if (wpd != null) {
-							if (!modifies.contains(wpd)) {
-								modifies.add(wpd);
-							}
-						}
-					}
-				}
-			}
-		}
-		return modifies;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getResponsibleFor() {
-		if (responsibleFor == null) {
-			responsibleFor = new EObjectResolvingEList(
-					WorkProductDescriptor.class, this,
-					UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR);
-		}
-		return responsibleFor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-			if (resolve)
-				return getRole();
-			return basicGetRole();
-		case UmaPackage.ROLE_DESCRIPTOR__MODIFIES:
-			return getModifies();
-		case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-			return getResponsibleFor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-			setRole((Role) newValue);
-			return;
-		case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-			getResponsibleFor().clear();
-			getResponsibleFor().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-			setRole((Role) null);
-			return;
-		case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-			getResponsibleFor().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-			return role != null;
-		case UmaPackage.ROLE_DESCRIPTOR__MODIFIES:
-			return !getModifies().isEmpty();
-		case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-			return responsibleFor != null && !responsibleFor.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //RoleDescriptorImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleImpl.java
deleted file mode 100644
index 0c867db..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleImpl.java
+++ /dev/null
@@ -1,165 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleImpl#getModifies <em>Modifies</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleImpl#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleImpl extends ContentElementImpl implements Role {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getResponsibleFor() <em>Responsible For</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResponsibleFor()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList responsibleFor = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public List getModifies() {
-		return AssociationHelper.getModifiedWorkProducts(this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getResponsibleFor() {
-		if (responsibleFor == null) {
-			responsibleFor = new EObjectResolvingEList(WorkProduct.class, this,
-					UmaPackage.ROLE__RESPONSIBLE_FOR);
-		}
-		return responsibleFor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ROLE__MODIFIES:
-			return getModifies();
-		case UmaPackage.ROLE__RESPONSIBLE_FOR:
-			return getResponsibleFor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ROLE__RESPONSIBLE_FOR:
-			getResponsibleFor().clear();
-			getResponsibleFor().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ROLE__RESPONSIBLE_FOR:
-			getResponsibleFor().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ROLE__MODIFIES:
-			return !getModifies().isEmpty();
-		case UmaPackage.ROLE__RESPONSIBLE_FOR:
-			return responsibleFor != null && !responsibleFor.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //RoleImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleSetGroupingImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleSetGroupingImpl.java
deleted file mode 100644
index 0611a29..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleSetGroupingImpl.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Set Grouping</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleSetGroupingImpl#getRoleSets <em>Role Sets</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleSetGroupingImpl extends ContentCategoryImpl implements
-		RoleSetGrouping {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getRoleSets() <em>Role Sets</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRoleSets()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList roleSets = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleSetGroupingImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_SET_GROUPING;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getRoleSets() {
-		if (roleSets == null) {
-			roleSets = new EObjectResolvingEList(RoleSet.class, this,
-					UmaPackage.ROLE_SET_GROUPING__ROLE_SETS);
-		}
-		return roleSets;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ROLE_SET_GROUPING__ROLE_SETS:
-			return getRoleSets();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ROLE_SET_GROUPING__ROLE_SETS:
-			getRoleSets().clear();
-			getRoleSets().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ROLE_SET_GROUPING__ROLE_SETS:
-			getRoleSets().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ROLE_SET_GROUPING__ROLE_SETS:
-			return roleSets != null && !roleSets.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //RoleSetGroupingImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleSetImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleSetImpl.java
deleted file mode 100644
index c61d316..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/RoleSetImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Set</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.RoleSetImpl#getRoles <em>Roles</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleSetImpl extends ContentCategoryImpl implements RoleSet {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getRoles() <em>Roles</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRoles()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList roles = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleSetImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_SET;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getRoles() {
-		if (roles == null) {
-			roles = new EObjectResolvingEList(Role.class, this,
-					UmaPackage.ROLE_SET__ROLES);
-		}
-		return roles;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.ROLE_SET__ROLES:
-			return getRoles();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.ROLE_SET__ROLES:
-			getRoles().clear();
-			getRoles().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.ROLE_SET__ROLES:
-			getRoles().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.ROLE_SET__ROLES:
-			return roles != null && !roles.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //RoleSetImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SectionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SectionImpl.java
deleted file mode 100644
index 3bb1a65..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SectionImpl.java
+++ /dev/null
@@ -1,364 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Section</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.SectionImpl#getSectionName <em>Section Name</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.SectionImpl#getSectionDescription <em>Section Description</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.SectionImpl#getSubSections <em>Sub Sections</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.SectionImpl#getPredecessor <em>Predecessor</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SectionImpl extends VariabilityElementImpl implements Section {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getSectionName() <em>Section Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSectionName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SECTION_NAME_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getSectionName() <em>Section Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSectionName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String sectionName = SECTION_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSectionDescription() <em>Section Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSectionDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SECTION_DESCRIPTION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getSectionDescription() <em>Section Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSectionDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String sectionDescription = SECTION_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getSubSections() <em>Sub Sections</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubSections()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subSections = null;
-
-	/**
-	 * The cached value of the '{@link #getPredecessor() <em>Predecessor</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPredecessor()
-	 * @generated
-	 * @ordered
-	 */
-	protected Section predecessor = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SectionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.SECTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSectionName() {
-		return sectionName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSectionName(String newSectionName) {
-		String oldSectionName = sectionName;
-		sectionName = newSectionName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.SECTION__SECTION_NAME, oldSectionName,
-					sectionName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSectionDescription() {
-		return sectionDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSectionDescription(String newSectionDescription) {
-		String oldSectionDescription = sectionDescription;
-		sectionDescription = newSectionDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.SECTION__SECTION_DESCRIPTION,
-					oldSectionDescription, sectionDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubSections() {
-		if (subSections == null) {
-			subSections = new EObjectContainmentEList.Resolving(Section.class,
-					this, UmaPackage.SECTION__SUB_SECTIONS);
-		}
-		return subSections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Section getPredecessor() {
-		if (predecessor != null && ((EObject) predecessor).eIsProxy()) {
-			InternalEObject oldPredecessor = (InternalEObject) predecessor;
-			predecessor = (Section) eResolveProxy(oldPredecessor);
-			if (predecessor != oldPredecessor) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.SECTION__PREDECESSOR, oldPredecessor,
-							predecessor));
-			}
-		}
-		return predecessor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Section basicGetPredecessor() {
-		return predecessor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPredecessor(Section newPredecessor) {
-		Section oldPredecessor = predecessor;
-		predecessor = newPredecessor;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.SECTION__PREDECESSOR, oldPredecessor,
-					predecessor));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.SECTION__SUB_SECTIONS:
-			return ((InternalEList) getSubSections()).basicRemove(otherEnd,
-					msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.SECTION__SECTION_NAME:
-			return getSectionName();
-		case UmaPackage.SECTION__SECTION_DESCRIPTION:
-			return getSectionDescription();
-		case UmaPackage.SECTION__SUB_SECTIONS:
-			return getSubSections();
-		case UmaPackage.SECTION__PREDECESSOR:
-			if (resolve)
-				return getPredecessor();
-			return basicGetPredecessor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.SECTION__SECTION_NAME:
-			setSectionName((String) newValue);
-			return;
-		case UmaPackage.SECTION__SECTION_DESCRIPTION:
-			setSectionDescription((String) newValue);
-			return;
-		case UmaPackage.SECTION__SUB_SECTIONS:
-			getSubSections().clear();
-			getSubSections().addAll((Collection) newValue);
-			return;
-		case UmaPackage.SECTION__PREDECESSOR:
-			setPredecessor((Section) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.SECTION__SECTION_NAME:
-			setSectionName(SECTION_NAME_EDEFAULT);
-			return;
-		case UmaPackage.SECTION__SECTION_DESCRIPTION:
-			setSectionDescription(SECTION_DESCRIPTION_EDEFAULT);
-			return;
-		case UmaPackage.SECTION__SUB_SECTIONS:
-			getSubSections().clear();
-			return;
-		case UmaPackage.SECTION__PREDECESSOR:
-			setPredecessor((Section) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.SECTION__SECTION_NAME:
-			return SECTION_NAME_EDEFAULT == null ? sectionName != null
-					: !SECTION_NAME_EDEFAULT.equals(sectionName);
-		case UmaPackage.SECTION__SECTION_DESCRIPTION:
-			return SECTION_DESCRIPTION_EDEFAULT == null ? sectionDescription != null
-					: !SECTION_DESCRIPTION_EDEFAULT.equals(sectionDescription);
-		case UmaPackage.SECTION__SUB_SECTIONS:
-			return subSections != null && !subSections.isEmpty();
-		case UmaPackage.SECTION__PREDECESSOR:
-			return predecessor != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (sectionName: "); //$NON-NLS-1$
-		result.append(sectionName);
-		result.append(", sectionDescription: "); //$NON-NLS-1$
-		result.append(sectionDescription);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SectionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SemanticModelBridgeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SemanticModelBridgeImpl.java
deleted file mode 100644
index 6ee0637..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SemanticModelBridgeImpl.java
+++ /dev/null
@@ -1,392 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Semantic Model Bridge</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.SemanticModelBridgeImpl#getPresentation <em>Presentation</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.SemanticModelBridgeImpl#getGraphElement <em>Graph Element</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.SemanticModelBridgeImpl#getDiagram <em>Diagram</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class SemanticModelBridgeImpl extends DiagramElementImpl
-		implements SemanticModelBridge {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getPresentation() <em>Presentation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRESENTATION_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getPresentation() <em>Presentation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String presentation = PRESENTATION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SemanticModelBridgeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.SEMANTIC_MODEL_BRIDGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPresentation() {
-		return presentation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentation(String newPresentation) {
-		String oldPresentation = presentation;
-		presentation = newPresentation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.SEMANTIC_MODEL_BRIDGE__PRESENTATION,
-					oldPresentation, presentation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement getGraphElement() {
-		if (eContainerFeatureID != UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT)
-			return null;
-		return (GraphElement) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphElement basicGetGraphElement() {
-		if (eContainerFeatureID != UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT)
-			return null;
-		return (GraphElement) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetGraphElement(GraphElement newGraphElement,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newGraphElement,
-				UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGraphElement(GraphElement newGraphElement) {
-		if (newGraphElement != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT && newGraphElement != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newGraphElement))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newGraphElement != null)
-				msgs = ((InternalEObject) newGraphElement).eInverseAdd(this,
-						UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL,
-						GraphElement.class, msgs);
-			msgs = basicSetGraphElement(newGraphElement, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT,
-					newGraphElement, newGraphElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Diagram getDiagram() {
-		if (eContainerFeatureID != UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM)
-			return null;
-		return (Diagram) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Diagram basicGetDiagram() {
-		if (eContainerFeatureID != UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM)
-			return null;
-		return (Diagram) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDiagram(Diagram newDiagram,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newDiagram,
-				UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDiagram(Diagram newDiagram) {
-		if (newDiagram != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM && newDiagram != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newDiagram))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newDiagram != null)
-				msgs = ((InternalEObject) newDiagram).eInverseAdd(this,
-						UmaPackage.DIAGRAM__NAMESPACE, Diagram.class, msgs);
-			msgs = basicSetDiagram(newDiagram, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM, newDiagram,
-					newDiagram));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetGraphElement((GraphElement) otherEnd, msgs);
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetDiagram((Diagram) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT:
-			return basicSetGraphElement(null, msgs);
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM:
-			return basicSetDiagram(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.GRAPH_ELEMENT__SEMANTIC_MODEL,
-					GraphElement.class, msgs);
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.DIAGRAM__NAMESPACE, Diagram.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__PRESENTATION:
-			return getPresentation();
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT:
-			if (resolve)
-				return getGraphElement();
-			return basicGetGraphElement();
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM:
-			if (resolve)
-				return getDiagram();
-			return basicGetDiagram();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__PRESENTATION:
-			setPresentation((String) newValue);
-			return;
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT:
-			setGraphElement((GraphElement) newValue);
-			return;
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM:
-			setDiagram((Diagram) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__PRESENTATION:
-			setPresentation(PRESENTATION_EDEFAULT);
-			return;
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT:
-			setGraphElement((GraphElement) null);
-			return;
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM:
-			setDiagram((Diagram) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__PRESENTATION:
-			return PRESENTATION_EDEFAULT == null ? presentation != null
-					: !PRESENTATION_EDEFAULT.equals(presentation);
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT:
-			return basicGetGraphElement() != null;
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE__DIAGRAM:
-			return basicGetDiagram() != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (presentation: "); //$NON-NLS-1$
-		result.append(presentation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SemanticModelBridgeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SimpleSemanticModelElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SimpleSemanticModelElementImpl.java
deleted file mode 100644
index ba5a32b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SimpleSemanticModelElementImpl.java
+++ /dev/null
@@ -1,184 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Simple Semantic Model Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.SimpleSemanticModelElementImpl#getTypeInfo <em>Type Info</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SimpleSemanticModelElementImpl extends SemanticModelBridgeImpl
-		implements SimpleSemanticModelElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getTypeInfo() <em>Type Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTypeInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TYPE_INFO_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getTypeInfo() <em>Type Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTypeInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected String typeInfo = TYPE_INFO_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SimpleSemanticModelElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.SIMPLE_SEMANTIC_MODEL_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTypeInfo() {
-		return typeInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTypeInfo(String newTypeInfo) {
-		String oldTypeInfo = typeInfo;
-		typeInfo = newTypeInfo;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO,
-					oldTypeInfo, typeInfo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO:
-			return getTypeInfo();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO:
-			setTypeInfo((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO:
-			setTypeInfo(TYPE_INFO_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO:
-			return TYPE_INFO_EDEFAULT == null ? typeInfo != null
-					: !TYPE_INFO_EDEFAULT.equals(typeInfo);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (typeInfo: "); //$NON-NLS-1$
-		result.append(typeInfo);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SimpleSemanticModelElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StateImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StateImpl.java
deleted file mode 100644
index bdf768e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StateImpl.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: StateImpl.java,v 1.1 2008/01/15 08:52:00 jtham Exp $
- */
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.State;
-import org.eclipse.epf.uma.StateMachine;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>State</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.StateImpl#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.StateImpl#getRegion <em>Region</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.StateImpl#getSubmachine <em>Submachine</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class StateImpl extends VertexImpl implements State {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getWorkProduct() <em>Work Product</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkProduct()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList workProduct = null;
-
-	/**
-	 * The cached value of the '{@link #getRegion() <em>Region</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegion()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList region = null;
-
-	/**
-	 * The cached value of the '{@link #getSubmachine() <em>Submachine</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubmachine()
-	 * @generated
-	 * @ordered
-	 */
-	protected StateMachine submachine = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.STATE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getWorkProduct() {
-		if (workProduct == null) {
-			workProduct = new EObjectResolvingEList(WorkProduct.class, this,
-					UmaPackage.STATE__WORK_PRODUCT);
-		}
-		return workProduct;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getRegion() {
-		if (region == null) {
-			region = new EObjectContainmentWithInverseEList.Resolving(
-					Region.class, this, UmaPackage.STATE__REGION,
-					UmaPackage.REGION__STATE);
-		}
-		return region;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateMachine getSubmachine() {
-		if (submachine != null && ((EObject) submachine).eIsProxy()) {
-			InternalEObject oldSubmachine = (InternalEObject) submachine;
-			submachine = (StateMachine) eResolveProxy(oldSubmachine);
-			if (submachine != oldSubmachine) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.STATE__SUBMACHINE, oldSubmachine,
-							submachine));
-			}
-		}
-		return submachine;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateMachine basicGetSubmachine() {
-		return submachine;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSubmachine(StateMachine newSubmachine) {
-		StateMachine oldSubmachine = submachine;
-		submachine = newSubmachine;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.STATE__SUBMACHINE, oldSubmachine, submachine));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.STATE__REGION:
-			return ((InternalEList) getRegion()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.STATE__REGION:
-			return ((InternalEList) getRegion()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.STATE__WORK_PRODUCT:
-			return getWorkProduct();
-		case UmaPackage.STATE__REGION:
-			return getRegion();
-		case UmaPackage.STATE__SUBMACHINE:
-			if (resolve)
-				return getSubmachine();
-			return basicGetSubmachine();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.STATE__WORK_PRODUCT:
-			getWorkProduct().clear();
-			getWorkProduct().addAll((Collection) newValue);
-			return;
-		case UmaPackage.STATE__REGION:
-			getRegion().clear();
-			getRegion().addAll((Collection) newValue);
-			return;
-		case UmaPackage.STATE__SUBMACHINE:
-			setSubmachine((StateMachine) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.STATE__WORK_PRODUCT:
-			getWorkProduct().clear();
-			return;
-		case UmaPackage.STATE__REGION:
-			getRegion().clear();
-			return;
-		case UmaPackage.STATE__SUBMACHINE:
-			setSubmachine((StateMachine) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.STATE__WORK_PRODUCT:
-			return workProduct != null && !workProduct.isEmpty();
-		case UmaPackage.STATE__REGION:
-			return region != null && !region.isEmpty();
-		case UmaPackage.STATE__SUBMACHINE:
-			return submachine != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //StateImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StateMachineImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StateMachineImpl.java
deleted file mode 100644
index 5394504..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StateMachineImpl.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: StateMachineImpl.java,v 1.1 2008/01/15 08:52:00 jtham Exp $
- */
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.StateMachine;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>State Machine</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.StateMachineImpl#getRegion <em>Region</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class StateMachineImpl extends WorkDefinitionImpl implements
-		StateMachine {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getRegion() <em>Region</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRegion()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList region = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateMachineImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.STATE_MACHINE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getRegion() {
-		if (region == null) {
-			region = new EObjectContainmentWithInverseEList.Resolving(
-					Region.class, this, UmaPackage.STATE_MACHINE__REGION,
-					UmaPackage.REGION__STATE_MACHINE);
-		}
-		return region;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.STATE_MACHINE__REGION:
-			return ((InternalEList) getRegion()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.STATE_MACHINE__REGION:
-			return ((InternalEList) getRegion()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.STATE_MACHINE__REGION:
-			return getRegion();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.STATE_MACHINE__REGION:
-			getRegion().clear();
-			getRegion().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.STATE_MACHINE__REGION:
-			getRegion().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.STATE_MACHINE__REGION:
-			return region != null && !region.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //StateMachineImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StepImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StepImpl.java
deleted file mode 100644
index 80876ea..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/StepImpl.java
+++ /dev/null
@@ -1,388 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.Step;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkDefinition;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Step</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.StepImpl#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.StepImpl#getPostcondition <em>Postcondition</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class StepImpl extends SectionImpl implements Step {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getPrecondition() <em>Precondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint precondition = null;
-
-	/**
-	 * The cached value of the '{@link #getPostcondition() <em>Postcondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint postcondition = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StepImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.STEP;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPrecondition() {
-		if (precondition != null && ((EObject) precondition).eIsProxy()) {
-			InternalEObject oldPrecondition = (InternalEObject) precondition;
-			precondition = (Constraint) eResolveProxy(oldPrecondition);
-			if (precondition != oldPrecondition) {
-				InternalEObject newPrecondition = (InternalEObject) precondition;
-				NotificationChain msgs = oldPrecondition.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.STEP__PRECONDITION,
-						null, null);
-				if (newPrecondition.eInternalContainer() == null) {
-					msgs = newPrecondition
-							.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-									- UmaPackage.STEP__PRECONDITION, null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.STEP__PRECONDITION, oldPrecondition,
-							precondition));
-			}
-		}
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPrecondition() {
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPrecondition(Constraint newPrecondition,
-			NotificationChain msgs) {
-		Constraint oldPrecondition = precondition;
-		precondition = newPrecondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.STEP__PRECONDITION,
-					oldPrecondition, newPrecondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrecondition(Constraint newPrecondition) {
-		if (newPrecondition != precondition) {
-			NotificationChain msgs = null;
-			if (precondition != null)
-				msgs = ((InternalEObject) precondition).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.STEP__PRECONDITION,
-						null, msgs);
-			if (newPrecondition != null)
-				msgs = ((InternalEObject) newPrecondition).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.STEP__PRECONDITION,
-						null, msgs);
-			msgs = basicSetPrecondition(newPrecondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.STEP__PRECONDITION, newPrecondition,
-					newPrecondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPostcondition() {
-		if (postcondition != null && ((EObject) postcondition).eIsProxy()) {
-			InternalEObject oldPostcondition = (InternalEObject) postcondition;
-			postcondition = (Constraint) eResolveProxy(oldPostcondition);
-			if (postcondition != oldPostcondition) {
-				InternalEObject newPostcondition = (InternalEObject) postcondition;
-				NotificationChain msgs = oldPostcondition
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.STEP__POSTCONDITION, null, null);
-				if (newPostcondition.eInternalContainer() == null) {
-					msgs = newPostcondition.eInverseAdd(this,
-							EOPPOSITE_FEATURE_BASE
-									- UmaPackage.STEP__POSTCONDITION, null,
-							msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.STEP__POSTCONDITION, oldPostcondition,
-							postcondition));
-			}
-		}
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPostcondition() {
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPostcondition(Constraint newPostcondition,
-			NotificationChain msgs) {
-		Constraint oldPostcondition = postcondition;
-		postcondition = newPostcondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.STEP__POSTCONDITION,
-					oldPostcondition, newPostcondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPostcondition(Constraint newPostcondition) {
-		if (newPostcondition != postcondition) {
-			NotificationChain msgs = null;
-			if (postcondition != null)
-				msgs = ((InternalEObject) postcondition)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.STEP__POSTCONDITION, null, msgs);
-			if (newPostcondition != null)
-				msgs = ((InternalEObject) newPostcondition)
-						.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.STEP__POSTCONDITION, null, msgs);
-			msgs = basicSetPostcondition(newPostcondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.STEP__POSTCONDITION, newPostcondition,
-					newPostcondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.STEP__PRECONDITION:
-			return basicSetPrecondition(null, msgs);
-		case UmaPackage.STEP__POSTCONDITION:
-			return basicSetPostcondition(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.STEP__PRECONDITION:
-			if (resolve)
-				return getPrecondition();
-			return basicGetPrecondition();
-		case UmaPackage.STEP__POSTCONDITION:
-			if (resolve)
-				return getPostcondition();
-			return basicGetPostcondition();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.STEP__PRECONDITION:
-			setPrecondition((Constraint) newValue);
-			return;
-		case UmaPackage.STEP__POSTCONDITION:
-			setPostcondition((Constraint) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.STEP__PRECONDITION:
-			setPrecondition((Constraint) null);
-			return;
-		case UmaPackage.STEP__POSTCONDITION:
-			setPostcondition((Constraint) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.STEP__PRECONDITION:
-			return precondition != null;
-		case UmaPackage.STEP__POSTCONDITION:
-			return postcondition != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-		if (baseClass == WorkDefinition.class) {
-			switch (derivedFeatureID) {
-			case UmaPackage.STEP__PRECONDITION:
-				return UmaPackage.WORK_DEFINITION__PRECONDITION;
-			case UmaPackage.STEP__POSTCONDITION:
-				return UmaPackage.WORK_DEFINITION__POSTCONDITION;
-			default:
-				return -1;
-			}
-		}
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-		if (baseClass == WorkDefinition.class) {
-			switch (baseFeatureID) {
-			case UmaPackage.WORK_DEFINITION__PRECONDITION:
-				return UmaPackage.STEP__PRECONDITION;
-			case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-				return UmaPackage.STEP__POSTCONDITION;
-			default:
-				return -1;
-			}
-		}
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-} //StepImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SupportingMaterialImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SupportingMaterialImpl.java
deleted file mode 100644
index da57da7..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/SupportingMaterialImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Supporting Material</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class SupportingMaterialImpl extends GuidanceImpl implements
-		SupportingMaterial {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SupportingMaterialImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.SUPPORTING_MATERIAL;
-	}
-
-} //SupportingMaterialImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskDescriptionImpl.java
deleted file mode 100644
index f50b3a9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskDescriptionImpl.java
+++ /dev/null
@@ -1,240 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.TaskDescription;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Task Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptionImpl#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptionImpl#getAlternatives <em>Alternatives</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskDescriptionImpl extends ContentDescriptionImpl implements
-		TaskDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PURPOSE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected String purpose = PURPOSE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ALTERNATIVES_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected String alternatives = ALTERNATIVES_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TASK_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPurpose() {
-		return purpose;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPurpose(String newPurpose) {
-		String oldPurpose = purpose;
-		purpose = newPurpose;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK_DESCRIPTION__PURPOSE, oldPurpose, purpose));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAlternatives() {
-		return alternatives;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAlternatives(String newAlternatives) {
-		String oldAlternatives = alternatives;
-		alternatives = newAlternatives;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK_DESCRIPTION__ALTERNATIVES, oldAlternatives,
-					alternatives));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-			return getPurpose();
-		case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-			return getAlternatives();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-			setPurpose((String) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-			setAlternatives((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-			setPurpose(PURPOSE_EDEFAULT);
-			return;
-		case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-			setAlternatives(ALTERNATIVES_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-			return PURPOSE_EDEFAULT == null ? purpose != null
-					: !PURPOSE_EDEFAULT.equals(purpose);
-		case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-			return ALTERNATIVES_EDEFAULT == null ? alternatives != null
-					: !ALTERNATIVES_EDEFAULT.equals(alternatives);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (purpose: "); //$NON-NLS-1$
-		result.append(purpose);
-		result.append(", alternatives: "); //$NON-NLS-1$
-		result.append(alternatives);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TaskDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskDescriptorImpl.java
deleted file mode 100644
index 4ebdf04..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskDescriptorImpl.java
+++ /dev/null
@@ -1,620 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.util.DefaultValueManager;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Task Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getIsSynchronizedWithSource <em>Is Synchronized With Source</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getTask <em>Task</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getAssistedBy <em>Assisted By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getExternalInput <em>External Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getPerformedPrimarilyBy <em>Performed Primarily By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskDescriptorImpl#getSelectedSteps <em>Selected Steps</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskDescriptorImpl extends WorkBreakdownElementImpl implements
-		TaskDescriptor {
-	/**
-	 * Comment for <code>serialVersionUID</code>
-	 */
-	private static final long serialVersionUID = -4419414664273910863L;
-
-	/**
-	 * The default value of the '{@link #getIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT = Boolean.TRUE;
-
-	/**
-	 * The cached value of the '{@link #getIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isSynchronizedWithSource = IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTask() <em>Task</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTask()
-	 * @generated
-	 * @ordered
-	 */
-	protected Task task = null;
-
-	/**
-	 * The cached value of the '{@link #getAdditionallyPerformedBy() <em>Additionally Performed By</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAdditionallyPerformedBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList additionallyPerformedBy = null;
-
-	/**
-	 * The cached value of the '{@link #getAssistedBy() <em>Assisted By</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssistedBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList assistedBy = null;
-
-	/**
-	 * The cached value of the '{@link #getExternalInput() <em>External Input</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalInput()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList externalInput = null;
-
-	/**
-	 * The cached value of the '{@link #getMandatoryInput() <em>Mandatory Input</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMandatoryInput()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList mandatoryInput = null;
-
-	/**
-	 * The cached value of the '{@link #getOptionalInput() <em>Optional Input</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOptionalInput()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList optionalInput = null;
-
-	/**
-	 * The cached value of the '{@link #getOutput() <em>Output</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutput()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList output = null;
-
-	/**
-	 * The cached value of the '{@link #getPerformedPrimarilyBy() <em>Performed Primarily By</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPerformedPrimarilyBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected RoleDescriptor performedPrimarilyBy = null;
-
-	/**
-	 * The cached value of the '{@link #getSelectedSteps() <em>Selected Steps</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSelectedSteps()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList selectedSteps = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskDescriptorImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TASK_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsSynchronizedWithSource() {
-		return isSynchronizedWithSource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsSynchronizedWithSource(Boolean newIsSynchronizedWithSource) {
-		Boolean oldIsSynchronizedWithSource = isSynchronizedWithSource;
-		isSynchronizedWithSource = newIsSynchronizedWithSource;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE,
-					oldIsSynchronizedWithSource, isSynchronizedWithSource));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Task getTask() {
-		if (task != null && ((EObject) task).eIsProxy()) {
-			InternalEObject oldTask = (InternalEObject) task;
-			task = (Task) eResolveProxy(oldTask);
-			if (task != oldTask) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TASK_DESCRIPTOR__TASK, oldTask, task));
-			}
-		}
-		return task;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Task basicGetTask() {
-		return task;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTask(Task newTask) {
-		Task oldTask = task;
-		task = newTask;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK_DESCRIPTOR__TASK, oldTask, task));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAdditionallyPerformedBy() {
-		if (additionallyPerformedBy == null) {
-			additionallyPerformedBy = new EObjectResolvingEList(
-					RoleDescriptor.class, this,
-					UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY);
-		}
-		return additionallyPerformedBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAssistedBy() {
-		if (assistedBy == null) {
-			assistedBy = new EObjectResolvingEList(RoleDescriptor.class, this,
-					UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY);
-		}
-		return assistedBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getExternalInput() {
-		if (externalInput == null) {
-			externalInput = new EObjectResolvingEList(
-					WorkProductDescriptor.class, this,
-					UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT);
-		}
-		return externalInput;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getMandatoryInput() {
-		if (mandatoryInput == null) {
-			mandatoryInput = new EObjectResolvingEList(
-					WorkProductDescriptor.class, this,
-					UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT);
-		}
-		return mandatoryInput;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getOptionalInput() {
-		if (optionalInput == null) {
-			optionalInput = new EObjectResolvingEList(
-					WorkProductDescriptor.class, this,
-					UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT);
-		}
-		return optionalInput;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getOutput() {
-		if (output == null) {
-			output = new EObjectResolvingEList(WorkProductDescriptor.class,
-					this, UmaPackage.TASK_DESCRIPTOR__OUTPUT);
-		}
-		return output;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescriptor getPerformedPrimarilyBy() {
-		if (performedPrimarilyBy != null
-				&& ((EObject) performedPrimarilyBy).eIsProxy()) {
-			InternalEObject oldPerformedPrimarilyBy = (InternalEObject) performedPrimarilyBy;
-			performedPrimarilyBy = (RoleDescriptor) eResolveProxy(oldPerformedPrimarilyBy);
-			if (performedPrimarilyBy != oldPerformedPrimarilyBy) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY,
-							oldPerformedPrimarilyBy, performedPrimarilyBy));
-			}
-		}
-		return performedPrimarilyBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescriptor basicGetPerformedPrimarilyBy() {
-		return performedPrimarilyBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPerformedPrimarilyBy(RoleDescriptor newPerformedPrimarilyBy) {
-		RoleDescriptor oldPerformedPrimarilyBy = performedPrimarilyBy;
-		performedPrimarilyBy = newPerformedPrimarilyBy;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY,
-					oldPerformedPrimarilyBy, performedPrimarilyBy));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSelectedSteps() {
-		if (selectedSteps == null) {
-			selectedSteps = new EObjectResolvingEList(Section.class, this,
-					UmaPackage.TASK_DESCRIPTOR__SELECTED_STEPS);
-		}
-		return selectedSteps;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			return getIsSynchronizedWithSource();
-		case UmaPackage.TASK_DESCRIPTOR__TASK:
-			if (resolve)
-				return getTask();
-			return basicGetTask();
-		case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-			return getAdditionallyPerformedBy();
-		case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-			return getAssistedBy();
-		case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-			return getExternalInput();
-		case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-			return getMandatoryInput();
-		case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-			return getOptionalInput();
-		case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-			return getOutput();
-		case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-			if (resolve)
-				return getPerformedPrimarilyBy();
-			return basicGetPerformedPrimarilyBy();
-		case UmaPackage.TASK_DESCRIPTOR__SELECTED_STEPS:
-			return getSelectedSteps();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			setIsSynchronizedWithSource((Boolean) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__TASK:
-			setTask((Task) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-			getAdditionallyPerformedBy().clear();
-			getAdditionallyPerformedBy().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-			getAssistedBy().clear();
-			getAssistedBy().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-			getExternalInput().clear();
-			getExternalInput().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-			getMandatoryInput().clear();
-			getMandatoryInput().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-			getOptionalInput().clear();
-			getOptionalInput().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-			getOutput().clear();
-			getOutput().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-			setPerformedPrimarilyBy((RoleDescriptor) newValue);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__SELECTED_STEPS:
-			getSelectedSteps().clear();
-			getSelectedSteps().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			setIsSynchronizedWithSource(IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__TASK:
-			setTask((Task) null);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-			getAdditionallyPerformedBy().clear();
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-			getAssistedBy().clear();
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-			getExternalInput().clear();
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-			getMandatoryInput().clear();
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-			getOptionalInput().clear();
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-			getOutput().clear();
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-			setPerformedPrimarilyBy((RoleDescriptor) null);
-			return;
-		case UmaPackage.TASK_DESCRIPTOR__SELECTED_STEPS:
-			getSelectedSteps().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-			return IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT == null ? isSynchronizedWithSource != null
-					: !IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT
-							.equals(isSynchronizedWithSource);
-		case UmaPackage.TASK_DESCRIPTOR__TASK:
-			return task != null;
-		case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-			return additionallyPerformedBy != null
-					&& !additionallyPerformedBy.isEmpty();
-		case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-			return assistedBy != null && !assistedBy.isEmpty();
-		case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-			return externalInput != null && !externalInput.isEmpty();
-		case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-			return mandatoryInput != null && !mandatoryInput.isEmpty();
-		case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-			return optionalInput != null && !optionalInput.isEmpty();
-		case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-			return output != null && !output.isEmpty();
-		case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-			return performedPrimarilyBy != null;
-		case UmaPackage.TASK_DESCRIPTOR__SELECTED_STEPS:
-			return selectedSteps != null && !selectedSteps.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-		if (baseClass == Descriptor.class) {
-			switch (derivedFeatureID) {
-			case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				return UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-			default:
-				return -1;
-			}
-		}
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-		if (baseClass == Descriptor.class) {
-			switch (baseFeatureID) {
-			case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				return UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-			default:
-				return -1;
-			}
-		}
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (isSynchronizedWithSource: "); //$NON-NLS-1$
-		result.append(isSynchronizedWithSource);
-		result.append(')');
-		return result.toString();
-	}
-
-	////////////////////////
-	// Begin of custom code 
-	////////////////////////
-
-	static {
-		// override the default value of BreakdownElement.isPlanned
-		//
-		DefaultValueManager.INSTANCE.setStaticDefaultValue(UmaPackage.eINSTANCE
-				.getTaskDescriptor(), UmaPackage.eINSTANCE
-				.getBreakdownElement_IsPlanned(), Boolean.FALSE);
-	}
-} //TaskDescriptorImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskImpl.java
deleted file mode 100644
index 1e78db4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TaskImpl.java
+++ /dev/null
@@ -1,687 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkDefinition;
-import org.eclipse.epf.uma.WorkProduct;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Task</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getPostcondition <em>Postcondition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getPerformedBy <em>Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getSteps <em>Steps</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getToolMentors <em>Tool Mentors</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TaskImpl#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskImpl extends ContentElementImpl implements Task {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getPrecondition() <em>Precondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint precondition = null;
-
-	/**
-	 * The cached value of the '{@link #getPostcondition() <em>Postcondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint postcondition = null;
-
-	/**
-	 * The cached value of the '{@link #getPerformedBy() <em>Performed By</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPerformedBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected Role performedBy = null;
-
-	/**
-	 * The cached value of the '{@link #getMandatoryInput() <em>Mandatory Input</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMandatoryInput()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList mandatoryInput = null;
-
-	/**
-	 * The cached value of the '{@link #getOutput() <em>Output</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutput()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList output = null;
-
-	/**
-	 * The cached value of the '{@link #getAdditionallyPerformedBy() <em>Additionally Performed By</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAdditionallyPerformedBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList additionallyPerformedBy = null;
-
-	/**
-	 * The cached value of the '{@link #getOptionalInput() <em>Optional Input</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOptionalInput()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList optionalInput = null;
-
-	/**
-	 * The cached value of the '{@link #getToolMentors() <em>Tool Mentors</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToolMentors()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList toolMentors = null;
-
-	/**
-	 * The cached value of the '{@link #getEstimationConsiderations() <em>Estimation Considerations</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEstimationConsiderations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList estimationConsiderations = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TASK;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPrecondition() {
-		if (precondition != null && ((EObject) precondition).eIsProxy()) {
-			InternalEObject oldPrecondition = (InternalEObject) precondition;
-			precondition = (Constraint) eResolveProxy(oldPrecondition);
-			if (precondition != oldPrecondition) {
-				InternalEObject newPrecondition = (InternalEObject) precondition;
-				NotificationChain msgs = oldPrecondition.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.TASK__PRECONDITION,
-						null, null);
-				if (newPrecondition.eInternalContainer() == null) {
-					msgs = newPrecondition
-							.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-									- UmaPackage.TASK__PRECONDITION, null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TASK__PRECONDITION, oldPrecondition,
-							precondition));
-			}
-		}
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPrecondition() {
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPrecondition(Constraint newPrecondition,
-			NotificationChain msgs) {
-		Constraint oldPrecondition = precondition;
-		precondition = newPrecondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.TASK__PRECONDITION,
-					oldPrecondition, newPrecondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrecondition(Constraint newPrecondition) {
-		if (newPrecondition != precondition) {
-			NotificationChain msgs = null;
-			if (precondition != null)
-				msgs = ((InternalEObject) precondition).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.TASK__PRECONDITION,
-						null, msgs);
-			if (newPrecondition != null)
-				msgs = ((InternalEObject) newPrecondition).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE - UmaPackage.TASK__PRECONDITION,
-						null, msgs);
-			msgs = basicSetPrecondition(newPrecondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK__PRECONDITION, newPrecondition,
-					newPrecondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPostcondition() {
-		if (postcondition != null && ((EObject) postcondition).eIsProxy()) {
-			InternalEObject oldPostcondition = (InternalEObject) postcondition;
-			postcondition = (Constraint) eResolveProxy(oldPostcondition);
-			if (postcondition != oldPostcondition) {
-				InternalEObject newPostcondition = (InternalEObject) postcondition;
-				NotificationChain msgs = oldPostcondition
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.TASK__POSTCONDITION, null, null);
-				if (newPostcondition.eInternalContainer() == null) {
-					msgs = newPostcondition.eInverseAdd(this,
-							EOPPOSITE_FEATURE_BASE
-									- UmaPackage.TASK__POSTCONDITION, null,
-							msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TASK__POSTCONDITION, oldPostcondition,
-							postcondition));
-			}
-		}
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPostcondition() {
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPostcondition(Constraint newPostcondition,
-			NotificationChain msgs) {
-		Constraint oldPostcondition = postcondition;
-		postcondition = newPostcondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.TASK__POSTCONDITION,
-					oldPostcondition, newPostcondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPostcondition(Constraint newPostcondition) {
-		if (newPostcondition != postcondition) {
-			NotificationChain msgs = null;
-			if (postcondition != null)
-				msgs = ((InternalEObject) postcondition)
-						.eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.TASK__POSTCONDITION, null, msgs);
-			if (newPostcondition != null)
-				msgs = ((InternalEObject) newPostcondition)
-						.eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-								- UmaPackage.TASK__POSTCONDITION, null, msgs);
-			msgs = basicSetPostcondition(newPostcondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK__POSTCONDITION, newPostcondition,
-					newPostcondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Role getPerformedBy() {
-		if (performedBy != null && ((EObject) performedBy).eIsProxy()) {
-			InternalEObject oldPerformedBy = (InternalEObject) performedBy;
-			performedBy = (Role) eResolveProxy(oldPerformedBy);
-			if (performedBy != oldPerformedBy) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TASK__PERFORMED_BY, oldPerformedBy,
-							performedBy));
-			}
-		}
-		return performedBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Role basicGetPerformedBy() {
-		return performedBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPerformedBy(Role newPerformedBy) {
-		Role oldPerformedBy = performedBy;
-		performedBy = newPerformedBy;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TASK__PERFORMED_BY, oldPerformedBy, performedBy));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getMandatoryInput() {
-		if (mandatoryInput == null) {
-			mandatoryInput = new EObjectResolvingEList(WorkProduct.class, this,
-					UmaPackage.TASK__MANDATORY_INPUT);
-		}
-		return mandatoryInput;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getOutput() {
-		if (output == null) {
-			output = new EObjectResolvingEList(WorkProduct.class, this,
-					UmaPackage.TASK__OUTPUT);
-		}
-		return output;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getAdditionallyPerformedBy() {
-		if (additionallyPerformedBy == null) {
-			additionallyPerformedBy = new EObjectResolvingEList(Role.class,
-					this, UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY);
-		}
-		return additionallyPerformedBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getOptionalInput() {
-		if (optionalInput == null) {
-			optionalInput = new EObjectResolvingEList(WorkProduct.class, this,
-					UmaPackage.TASK__OPTIONAL_INPUT);
-		}
-		return optionalInput;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public List getSteps() {
-		return getPresentation().getSections();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getToolMentors() {
-		if (toolMentors == null) {
-			toolMentors = new EObjectResolvingEList(ToolMentor.class, this,
-					UmaPackage.TASK__TOOL_MENTORS);
-		}
-		return toolMentors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getEstimationConsiderations() {
-		if (estimationConsiderations == null) {
-			estimationConsiderations = new EObjectResolvingEList(
-					EstimationConsiderations.class, this,
-					UmaPackage.TASK__ESTIMATION_CONSIDERATIONS);
-		}
-		return estimationConsiderations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.TASK__PRECONDITION:
-			return basicSetPrecondition(null, msgs);
-		case UmaPackage.TASK__POSTCONDITION:
-			return basicSetPostcondition(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.TASK__PRECONDITION:
-			if (resolve)
-				return getPrecondition();
-			return basicGetPrecondition();
-		case UmaPackage.TASK__POSTCONDITION:
-			if (resolve)
-				return getPostcondition();
-			return basicGetPostcondition();
-		case UmaPackage.TASK__PERFORMED_BY:
-			if (resolve)
-				return getPerformedBy();
-			return basicGetPerformedBy();
-		case UmaPackage.TASK__MANDATORY_INPUT:
-			return getMandatoryInput();
-		case UmaPackage.TASK__OUTPUT:
-			return getOutput();
-		case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-			return getAdditionallyPerformedBy();
-		case UmaPackage.TASK__OPTIONAL_INPUT:
-			return getOptionalInput();
-		case UmaPackage.TASK__STEPS:
-			return getSteps();
-		case UmaPackage.TASK__TOOL_MENTORS:
-			return getToolMentors();
-		case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-			return getEstimationConsiderations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.TASK__PRECONDITION:
-			setPrecondition((Constraint) newValue);
-			return;
-		case UmaPackage.TASK__POSTCONDITION:
-			setPostcondition((Constraint) newValue);
-			return;
-		case UmaPackage.TASK__PERFORMED_BY:
-			setPerformedBy((Role) newValue);
-			return;
-		case UmaPackage.TASK__MANDATORY_INPUT:
-			getMandatoryInput().clear();
-			getMandatoryInput().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK__OUTPUT:
-			getOutput().clear();
-			getOutput().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-			getAdditionallyPerformedBy().clear();
-			getAdditionallyPerformedBy().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK__OPTIONAL_INPUT:
-			getOptionalInput().clear();
-			getOptionalInput().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK__TOOL_MENTORS:
-			getToolMentors().clear();
-			getToolMentors().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-			getEstimationConsiderations().clear();
-			getEstimationConsiderations().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.TASK__PRECONDITION:
-			setPrecondition((Constraint) null);
-			return;
-		case UmaPackage.TASK__POSTCONDITION:
-			setPostcondition((Constraint) null);
-			return;
-		case UmaPackage.TASK__PERFORMED_BY:
-			setPerformedBy((Role) null);
-			return;
-		case UmaPackage.TASK__MANDATORY_INPUT:
-			getMandatoryInput().clear();
-			return;
-		case UmaPackage.TASK__OUTPUT:
-			getOutput().clear();
-			return;
-		case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-			getAdditionallyPerformedBy().clear();
-			return;
-		case UmaPackage.TASK__OPTIONAL_INPUT:
-			getOptionalInput().clear();
-			return;
-		case UmaPackage.TASK__TOOL_MENTORS:
-			getToolMentors().clear();
-			return;
-		case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-			getEstimationConsiderations().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.TASK__PRECONDITION:
-			return precondition != null;
-		case UmaPackage.TASK__POSTCONDITION:
-			return postcondition != null;
-		case UmaPackage.TASK__PERFORMED_BY:
-			return performedBy != null;
-		case UmaPackage.TASK__MANDATORY_INPUT:
-			return mandatoryInput != null && !mandatoryInput.isEmpty();
-		case UmaPackage.TASK__OUTPUT:
-			return output != null && !output.isEmpty();
-		case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-			return additionallyPerformedBy != null
-					&& !additionallyPerformedBy.isEmpty();
-		case UmaPackage.TASK__OPTIONAL_INPUT:
-			return optionalInput != null && !optionalInput.isEmpty();
-		case UmaPackage.TASK__STEPS:
-			return !getSteps().isEmpty();
-		case UmaPackage.TASK__TOOL_MENTORS:
-			return toolMentors != null && !toolMentors.isEmpty();
-		case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-			return estimationConsiderations != null
-					&& !estimationConsiderations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eBaseStructuralFeatureID(int derivedFeatureID, Class baseClass) {
-		if (baseClass == WorkDefinition.class) {
-			switch (derivedFeatureID) {
-			case UmaPackage.TASK__PRECONDITION:
-				return UmaPackage.WORK_DEFINITION__PRECONDITION;
-			case UmaPackage.TASK__POSTCONDITION:
-				return UmaPackage.WORK_DEFINITION__POSTCONDITION;
-			default:
-				return -1;
-			}
-		}
-		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int eDerivedStructuralFeatureID(int baseFeatureID, Class baseClass) {
-		if (baseClass == WorkDefinition.class) {
-			switch (baseFeatureID) {
-			case UmaPackage.WORK_DEFINITION__PRECONDITION:
-				return UmaPackage.TASK__PRECONDITION;
-			case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-				return UmaPackage.TASK__POSTCONDITION;
-			default:
-				return -1;
-			}
-		}
-		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
-	}
-
-} //TaskImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TeamProfileImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TeamProfileImpl.java
deleted file mode 100644
index e5e2d69..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TeamProfileImpl.java
+++ /dev/null
@@ -1,328 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Team Profile</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.TeamProfileImpl#getTeamRoles <em>Team Roles</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TeamProfileImpl#getSuperTeam <em>Super Team</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TeamProfileImpl#getSubTeam <em>Sub Team</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TeamProfileImpl extends BreakdownElementImpl implements
-		TeamProfile {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getTeamRoles() <em>Team Roles</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTeamRoles()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList teamRoles = null;
-
-	/**
-	 * The cached value of the '{@link #getSuperTeam() <em>Super Team</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuperTeam()
-	 * @generated
-	 * @ordered
-	 */
-	protected TeamProfile superTeam = null;
-
-	/**
-	 * The cached value of the '{@link #getSubTeam() <em>Sub Team</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubTeam()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subTeam = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TeamProfileImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TEAM_PROFILE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getTeamRoles() {
-		if (teamRoles == null) {
-			teamRoles = new EObjectResolvingEList(RoleDescriptor.class, this,
-					UmaPackage.TEAM_PROFILE__TEAM_ROLES);
-		}
-		return teamRoles;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TeamProfile getSuperTeam() {
-		if (superTeam != null && ((EObject) superTeam).eIsProxy()) {
-			InternalEObject oldSuperTeam = (InternalEObject) superTeam;
-			superTeam = (TeamProfile) eResolveProxy(oldSuperTeam);
-			if (superTeam != oldSuperTeam) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TEAM_PROFILE__SUPER_TEAM, oldSuperTeam,
-							superTeam));
-			}
-		}
-		return superTeam;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TeamProfile basicGetSuperTeam() {
-		return superTeam;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuperTeam(TeamProfile newSuperTeam,
-			NotificationChain msgs) {
-		TeamProfile oldSuperTeam = superTeam;
-		superTeam = newSuperTeam;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.TEAM_PROFILE__SUPER_TEAM,
-					oldSuperTeam, newSuperTeam);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuperTeam(TeamProfile newSuperTeam) {
-		if (newSuperTeam != superTeam) {
-			NotificationChain msgs = null;
-			if (superTeam != null)
-				msgs = ((InternalEObject) superTeam).eInverseRemove(this,
-						UmaPackage.TEAM_PROFILE__SUB_TEAM, TeamProfile.class,
-						msgs);
-			if (newSuperTeam != null)
-				msgs = ((InternalEObject) newSuperTeam).eInverseAdd(this,
-						UmaPackage.TEAM_PROFILE__SUB_TEAM, TeamProfile.class,
-						msgs);
-			msgs = basicSetSuperTeam(newSuperTeam, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TEAM_PROFILE__SUPER_TEAM, newSuperTeam,
-					newSuperTeam));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getSubTeam() {
-		if (subTeam == null) {
-			subTeam = new EObjectWithInverseResolvingEList(TeamProfile.class,
-					this, UmaPackage.TEAM_PROFILE__SUB_TEAM,
-					UmaPackage.TEAM_PROFILE__SUPER_TEAM);
-		}
-		return subTeam;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-			if (superTeam != null)
-				msgs = ((InternalEObject) superTeam).eInverseRemove(this,
-						UmaPackage.TEAM_PROFILE__SUB_TEAM, TeamProfile.class,
-						msgs);
-			return basicSetSuperTeam((TeamProfile) otherEnd, msgs);
-		case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-			return ((InternalEList) getSubTeam()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-			return basicSetSuperTeam(null, msgs);
-		case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-			return ((InternalEList) getSubTeam()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.TEAM_PROFILE__TEAM_ROLES:
-			return getTeamRoles();
-		case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-			if (resolve)
-				return getSuperTeam();
-			return basicGetSuperTeam();
-		case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-			return getSubTeam();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.TEAM_PROFILE__TEAM_ROLES:
-			getTeamRoles().clear();
-			getTeamRoles().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-			setSuperTeam((TeamProfile) newValue);
-			return;
-		case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-			getSubTeam().clear();
-			getSubTeam().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.TEAM_PROFILE__TEAM_ROLES:
-			getTeamRoles().clear();
-			return;
-		case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-			setSuperTeam((TeamProfile) null);
-			return;
-		case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-			getSubTeam().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.TEAM_PROFILE__TEAM_ROLES:
-			return teamRoles != null && !teamRoles.isEmpty();
-		case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-			return superTeam != null;
-		case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-			return subTeam != null && !subTeam.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TeamProfileImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TemplateImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TemplateImpl.java
deleted file mode 100644
index f92aa2a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TemplateImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Template</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class TemplateImpl extends GuidanceImpl implements Template {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TemplateImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TEMPLATE;
-	}
-
-} //TemplateImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TermDefinitionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TermDefinitionImpl.java
deleted file mode 100644
index e19b6c9..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TermDefinitionImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Term Definition</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class TermDefinitionImpl extends GuidanceImpl implements TermDefinition {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TermDefinitionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TERM_DEFINITION;
-	}
-
-} //TermDefinitionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TextElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TextElementImpl.java
deleted file mode 100644
index 2b127da..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TextElementImpl.java
+++ /dev/null
@@ -1,182 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.TextElement;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Text Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.TextElementImpl#getText <em>Text</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TextElementImpl extends LeafElementImpl implements TextElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getText() <em>Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getText()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getText() <em>Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getText()
-	 * @generated
-	 * @ordered
-	 */
-	protected String text = TEXT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TextElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TEXT_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText() {
-		return text;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setText(String newText) {
-		String oldText = text;
-		text = newText;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TEXT_ELEMENT__TEXT, oldText, text));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.TEXT_ELEMENT__TEXT:
-			return getText();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.TEXT_ELEMENT__TEXT:
-			setText((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.TEXT_ELEMENT__TEXT:
-			setText(TEXT_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.TEXT_ELEMENT__TEXT:
-			return TEXT_EDEFAULT == null ? text != null : !TEXT_EDEFAULT
-					.equals(text);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (text: "); //$NON-NLS-1$
-		result.append(text);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TextElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ToolImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ToolImpl.java
deleted file mode 100644
index f634c07..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ToolImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tool</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.ToolImpl#getToolMentors <em>Tool Mentors</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ToolImpl extends ContentCategoryImpl implements Tool {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getToolMentors() <em>Tool Mentors</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToolMentors()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList toolMentors = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToolImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TOOL;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getToolMentors() {
-		if (toolMentors == null) {
-			toolMentors = new EObjectResolvingEList(ToolMentor.class, this,
-					UmaPackage.TOOL__TOOL_MENTORS);
-		}
-		return toolMentors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.TOOL__TOOL_MENTORS:
-			return getToolMentors();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.TOOL__TOOL_MENTORS:
-			getToolMentors().clear();
-			getToolMentors().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.TOOL__TOOL_MENTORS:
-			getToolMentors().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.TOOL__TOOL_MENTORS:
-			return toolMentors != null && !toolMentors.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ToolImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ToolMentorImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ToolMentorImpl.java
deleted file mode 100644
index fe80d85..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/ToolMentorImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tool Mentor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ToolMentorImpl extends GuidanceImpl implements ToolMentor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToolMentorImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TOOL_MENTOR;
-	}
-
-} //ToolMentorImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TransitionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TransitionImpl.java
deleted file mode 100644
index e617572..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TransitionImpl.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TransitionImpl.java,v 1.1 2008/01/15 08:52:00 jtham Exp $
- */
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.Transition;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Vertex;
-import org.eclipse.epf.uma.WorkDefinition;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Transition</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.TransitionImpl#getWorkDefinition <em>Work Definition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TransitionImpl#getContainer_ <em>Container</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TransitionImpl#getSource <em>Source</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.TransitionImpl#getTarget <em>Target</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TransitionImpl extends MultiResourceEObject implements Transition {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getWorkDefinition() <em>Work Definition</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkDefinition()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList workDefinition = null;
-
-	/**
-	 * The cached value of the '{@link #getSource() <em>Source</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected Vertex source = null;
-
-	/**
-	 * The cached value of the '{@link #getTarget() <em>Target</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTarget()
-	 * @generated
-	 * @ordered
-	 */
-	protected Vertex target = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TransitionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TRANSITION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getWorkDefinition() {
-		if (workDefinition == null) {
-			workDefinition = new EObjectResolvingEList(WorkDefinition.class,
-					this, UmaPackage.TRANSITION__WORK_DEFINITION);
-		}
-		return workDefinition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Region getContainer_() {
-		if (eContainerFeatureID != UmaPackage.TRANSITION__CONTAINER)
-			return null;
-		return (Region) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Region basicGetContainer() {
-		if (eContainerFeatureID != UmaPackage.TRANSITION__CONTAINER)
-			return null;
-		return (Region) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetContainer(Region newContainer,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContainer,
-				UmaPackage.TRANSITION__CONTAINER, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setContainer(Region newContainer) {
-		if (newContainer != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.TRANSITION__CONTAINER && newContainer != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newContainer))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newContainer != null)
-				msgs = ((InternalEObject) newContainer).eInverseAdd(this,
-						UmaPackage.REGION__TRANSITION, Region.class, msgs);
-			msgs = basicSetContainer(newContainer, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TRANSITION__CONTAINER, newContainer,
-					newContainer));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Vertex getSource() {
-		if (source != null && ((EObject) source).eIsProxy()) {
-			InternalEObject oldSource = (InternalEObject) source;
-			source = (Vertex) eResolveProxy(oldSource);
-			if (source != oldSource) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TRANSITION__SOURCE, oldSource, source));
-			}
-		}
-		return source;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Vertex basicGetSource() {
-		return source;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSource(Vertex newSource,
-			NotificationChain msgs) {
-		Vertex oldSource = source;
-		source = newSource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.TRANSITION__SOURCE, oldSource,
-					newSource);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSource(Vertex newSource) {
-		if (newSource != source) {
-			NotificationChain msgs = null;
-			if (source != null)
-				msgs = ((InternalEObject) source).eInverseRemove(this,
-						UmaPackage.VERTEX__OUTGOING, Vertex.class, msgs);
-			if (newSource != null)
-				msgs = ((InternalEObject) newSource).eInverseAdd(this,
-						UmaPackage.VERTEX__OUTGOING, Vertex.class, msgs);
-			msgs = basicSetSource(newSource, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TRANSITION__SOURCE, newSource, newSource));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Vertex getTarget() {
-		if (target != null && ((EObject) target).eIsProxy()) {
-			InternalEObject oldTarget = (InternalEObject) target;
-			target = (Vertex) eResolveProxy(oldTarget);
-			if (target != oldTarget) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.TRANSITION__TARGET, oldTarget, target));
-			}
-		}
-		return target;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Vertex basicGetTarget() {
-		return target;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTarget(Vertex newTarget,
-			NotificationChain msgs) {
-		Vertex oldTarget = target;
-		target = newTarget;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.TRANSITION__TARGET, oldTarget,
-					newTarget);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTarget(Vertex newTarget) {
-		if (newTarget != target) {
-			NotificationChain msgs = null;
-			if (target != null)
-				msgs = ((InternalEObject) target).eInverseRemove(this,
-						UmaPackage.VERTEX__INCOMING, Vertex.class, msgs);
-			if (newTarget != null)
-				msgs = ((InternalEObject) newTarget).eInverseAdd(this,
-						UmaPackage.VERTEX__INCOMING, Vertex.class, msgs);
-			msgs = basicSetTarget(newTarget, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.TRANSITION__TARGET, newTarget, newTarget));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.TRANSITION__CONTAINER:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetContainer((Region) otherEnd, msgs);
-		case UmaPackage.TRANSITION__SOURCE:
-			if (source != null)
-				msgs = ((InternalEObject) source).eInverseRemove(this,
-						UmaPackage.VERTEX__OUTGOING, Vertex.class, msgs);
-			return basicSetSource((Vertex) otherEnd, msgs);
-		case UmaPackage.TRANSITION__TARGET:
-			if (target != null)
-				msgs = ((InternalEObject) target).eInverseRemove(this,
-						UmaPackage.VERTEX__INCOMING, Vertex.class, msgs);
-			return basicSetTarget((Vertex) otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.TRANSITION__CONTAINER:
-			return basicSetContainer(null, msgs);
-		case UmaPackage.TRANSITION__SOURCE:
-			return basicSetSource(null, msgs);
-		case UmaPackage.TRANSITION__TARGET:
-			return basicSetTarget(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.TRANSITION__CONTAINER:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.REGION__TRANSITION, Region.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.TRANSITION__WORK_DEFINITION:
-			return getWorkDefinition();
-		case UmaPackage.TRANSITION__CONTAINER:
-			if (resolve)
-				return getContainer_();
-			return basicGetContainer();
-		case UmaPackage.TRANSITION__SOURCE:
-			if (resolve)
-				return getSource();
-			return basicGetSource();
-		case UmaPackage.TRANSITION__TARGET:
-			if (resolve)
-				return getTarget();
-			return basicGetTarget();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.TRANSITION__WORK_DEFINITION:
-			getWorkDefinition().clear();
-			getWorkDefinition().addAll((Collection) newValue);
-			return;
-		case UmaPackage.TRANSITION__CONTAINER:
-			setContainer((Region) newValue);
-			return;
-		case UmaPackage.TRANSITION__SOURCE:
-			setSource((Vertex) newValue);
-			return;
-		case UmaPackage.TRANSITION__TARGET:
-			setTarget((Vertex) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.TRANSITION__WORK_DEFINITION:
-			getWorkDefinition().clear();
-			return;
-		case UmaPackage.TRANSITION__CONTAINER:
-			setContainer((Region) null);
-			return;
-		case UmaPackage.TRANSITION__SOURCE:
-			setSource((Vertex) null);
-			return;
-		case UmaPackage.TRANSITION__TARGET:
-			setTarget((Vertex) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.TRANSITION__WORK_DEFINITION:
-			return workDefinition != null && !workDefinition.isEmpty();
-		case UmaPackage.TRANSITION__CONTAINER:
-			return basicGetContainer() != null;
-		case UmaPackage.TRANSITION__SOURCE:
-			return source != null;
-		case UmaPackage.TRANSITION__TARGET:
-			return target != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TransitionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TypeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TypeImpl.java
deleted file mode 100644
index 33d73e4..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/TypeImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.Type;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public abstract class TypeImpl extends PackageableElementImpl implements Type {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TypeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TYPE;
-	}
-
-} //TypeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UMASemanticModelBridgeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UMASemanticModelBridgeImpl.java
deleted file mode 100644
index 9c357cf..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UMASemanticModelBridgeImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>UMA Semantic Model Bridge</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.UMASemanticModelBridgeImpl#getElement <em>Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class UMASemanticModelBridgeImpl extends SemanticModelBridgeImpl
-		implements UMASemanticModelBridge {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getElement() <em>Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected MethodElement element = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected UMASemanticModelBridgeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.UMA_SEMANTIC_MODEL_BRIDGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElement getElement() {
-		if (element != null && ((EObject) element).eIsProxy()) {
-			InternalEObject oldElement = (InternalEObject) element;
-			element = (MethodElement) eResolveProxy(oldElement);
-			if (element != oldElement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT,
-							oldElement, element));
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElement basicGetElement() {
-		return element;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setElement(MethodElement newElement) {
-		MethodElement oldElement = element;
-		element = newElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT, oldElement,
-					element));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			if (resolve)
-				return getElement();
-			return basicGetElement();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			setElement((MethodElement) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			setElement((MethodElement) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT:
-			return element != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //UMASemanticModelBridgeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UmaFactoryImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UmaFactoryImpl.java
deleted file mode 100644
index 23ba80d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UmaFactoryImpl.java
+++ /dev/null
@@ -1,1561 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.net.URI;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-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.epf.uma.Activity;
-import org.eclipse.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ArtifactDescription;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CoreSemanticModelBridge;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DeliverableDescription;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DeliveryProcessDescription;
-import org.eclipse.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Ellipse;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Image;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.PlanningData;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.Polyline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.PracticeDescription;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessComponentDescriptor;
-import org.eclipse.epf.uma.ProcessComponentInterface;
-import org.eclipse.epf.uma.ProcessDescription;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.PseudoState;
-import org.eclipse.epf.uma.PseudoStateKind;
-import org.eclipse.epf.uma.Reference;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescription;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.State;
-import org.eclipse.epf.uma.StateMachine;
-import org.eclipse.epf.uma.Step;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescription;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.TextElement;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Transition;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.Vertex;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-import org.eclipse.epf.uma.WorkProductDescription;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class UmaFactoryImpl extends EFactoryImpl implements UmaFactory {
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static UmaFactory init() {
-		try {
-			UmaFactory theUmaFactory = (UmaFactory) EPackage.Registry.INSTANCE
-					.getEFactory("http://www.eclipse.org/epf/uma/1.0.4/uma.ecore"); //$NON-NLS-1$ 
-			if (theUmaFactory != null) {
-				return theUmaFactory;
-			}
-		} catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new UmaFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-		case UmaPackage.PACKAGE:
-			return (EObject) createPackage();
-		case UmaPackage.CONSTRAINT:
-			return (EObject) createConstraint();
-		case UmaPackage.METHOD_ELEMENT_PROPERTY:
-			return (EObject) createMethodElementProperty();
-		case UmaPackage.CONTENT_DESCRIPTION:
-			return (EObject) createContentDescription();
-		case UmaPackage.SECTION:
-			return (EObject) createSection();
-		case UmaPackage.ROLE:
-			return (EObject) createRole();
-		case UmaPackage.TASK:
-			return (EObject) createTask();
-		case UmaPackage.STEP:
-			return (EObject) createStep();
-		case UmaPackage.ARTIFACT:
-			return (EObject) createArtifact();
-		case UmaPackage.DELIVERABLE:
-			return (EObject) createDeliverable();
-		case UmaPackage.OUTCOME:
-			return (EObject) createOutcome();
-		case UmaPackage.CONTENT_PACKAGE:
-			return (EObject) createContentPackage();
-		case UmaPackage.ARTIFACT_DESCRIPTION:
-			return (EObject) createArtifactDescription();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION:
-			return (EObject) createWorkProductDescription();
-		case UmaPackage.DELIVERABLE_DESCRIPTION:
-			return (EObject) createDeliverableDescription();
-		case UmaPackage.ROLE_DESCRIPTION:
-			return (EObject) createRoleDescription();
-		case UmaPackage.TASK_DESCRIPTION:
-			return (EObject) createTaskDescription();
-		case UmaPackage.GUIDANCE_DESCRIPTION:
-			return (EObject) createGuidanceDescription();
-		case UmaPackage.PRACTICE_DESCRIPTION:
-			return (EObject) createPracticeDescription();
-		case UmaPackage.POINT:
-			return (EObject) createPoint();
-		case UmaPackage.DIAGRAM_LINK:
-			return (EObject) createDiagramLink();
-		case UmaPackage.GRAPH_CONNECTOR:
-			return (EObject) createGraphConnector();
-		case UmaPackage.DIMENSION:
-			return (EObject) createDimension();
-		case UmaPackage.REFERENCE:
-			return (EObject) createReference();
-		case UmaPackage.PROPERTY:
-			return (EObject) createProperty();
-		case UmaPackage.GRAPH_EDGE:
-			return (EObject) createGraphEdge();
-		case UmaPackage.DIAGRAM:
-			return (EObject) createDiagram();
-		case UmaPackage.GRAPH_NODE:
-			return (EObject) createGraphNode();
-		case UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT:
-			return (EObject) createSimpleSemanticModelElement();
-		case UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE:
-			return (EObject) createUMASemanticModelBridge();
-		case UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE:
-			return (EObject) createCoreSemanticModelBridge();
-		case UmaPackage.TEXT_ELEMENT:
-			return (EObject) createTextElement();
-		case UmaPackage.IMAGE:
-			return (EObject) createImage();
-		case UmaPackage.POLYLINE:
-			return (EObject) createPolyline();
-		case UmaPackage.ELLIPSE:
-			return (EObject) createEllipse();
-		case UmaPackage.ACTIVITY:
-			return (EObject) createActivity();
-		case UmaPackage.MILESTONE:
-			return (EObject) createMilestone();
-		case UmaPackage.ITERATION:
-			return (EObject) createIteration();
-		case UmaPackage.PHASE:
-			return (EObject) createPhase();
-		case UmaPackage.TEAM_PROFILE:
-			return (EObject) createTeamProfile();
-		case UmaPackage.ROLE_DESCRIPTOR:
-			return (EObject) createRoleDescriptor();
-		case UmaPackage.WORK_ORDER:
-			return (EObject) createWorkOrder();
-		case UmaPackage.PLANNING_DATA:
-			return (EObject) createPlanningData();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR:
-			return (EObject) createWorkProductDescriptor();
-		case UmaPackage.TASK_DESCRIPTOR:
-			return (EObject) createTaskDescriptor();
-		case UmaPackage.COMPOSITE_ROLE:
-			return (EObject) createCompositeRole();
-		case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION:
-			return (EObject) createBreakdownElementDescription();
-		case UmaPackage.ACTIVITY_DESCRIPTION:
-			return (EObject) createActivityDescription();
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION:
-			return (EObject) createDeliveryProcessDescription();
-		case UmaPackage.PROCESS_DESCRIPTION:
-			return (EObject) createProcessDescription();
-		case UmaPackage.DESCRIPTOR_DESCRIPTION:
-			return (EObject) createDescriptorDescription();
-		case UmaPackage.CONCEPT:
-			return (EObject) createConcept();
-		case UmaPackage.CHECKLIST:
-			return (EObject) createChecklist();
-		case UmaPackage.EXAMPLE:
-			return (EObject) createExample();
-		case UmaPackage.GUIDELINE:
-			return (EObject) createGuideline();
-		case UmaPackage.REPORT:
-			return (EObject) createReport();
-		case UmaPackage.TEMPLATE:
-			return (EObject) createTemplate();
-		case UmaPackage.SUPPORTING_MATERIAL:
-			return (EObject) createSupportingMaterial();
-		case UmaPackage.TOOL_MENTOR:
-			return (EObject) createToolMentor();
-		case UmaPackage.WHITEPAPER:
-			return (EObject) createWhitepaper();
-		case UmaPackage.TERM_DEFINITION:
-			return (EObject) createTermDefinition();
-		case UmaPackage.PRACTICE:
-			return (EObject) createPractice();
-		case UmaPackage.ESTIMATION_CONSIDERATIONS:
-			return (EObject) createEstimationConsiderations();
-		case UmaPackage.REUSABLE_ASSET:
-			return (EObject) createReusableAsset();
-		case UmaPackage.STATE:
-			return (EObject) createState();
-		case UmaPackage.VERTEX:
-			return (EObject) createVertex();
-		case UmaPackage.REGION:
-			return (EObject) createRegion();
-		case UmaPackage.STATE_MACHINE:
-			return (EObject) createStateMachine();
-		case UmaPackage.TRANSITION:
-			return (EObject) createTransition();
-		case UmaPackage.PSEUDO_STATE:
-			return (EObject) createPseudoState();
-		case UmaPackage.DISCIPLINE:
-			return (EObject) createDiscipline();
-		case UmaPackage.ROLE_SET:
-			return (EObject) createRoleSet();
-		case UmaPackage.DOMAIN:
-			return (EObject) createDomain();
-		case UmaPackage.WORK_PRODUCT_TYPE:
-			return (EObject) createWorkProductType();
-		case UmaPackage.DISCIPLINE_GROUPING:
-			return (EObject) createDisciplineGrouping();
-		case UmaPackage.TOOL:
-			return (EObject) createTool();
-		case UmaPackage.ROLE_SET_GROUPING:
-			return (EObject) createRoleSetGrouping();
-		case UmaPackage.CUSTOM_CATEGORY:
-			return (EObject) createCustomCategory();
-		case UmaPackage.DELIVERY_PROCESS:
-			return (EObject) createDeliveryProcess();
-		case UmaPackage.CAPABILITY_PATTERN:
-			return (EObject) createCapabilityPattern();
-		case UmaPackage.PROCESS_PLANNING_TEMPLATE:
-			return (EObject) createProcessPlanningTemplate();
-		case UmaPackage.ROADMAP:
-			return (EObject) createRoadmap();
-		case UmaPackage.PROCESS_COMPONENT:
-			return (EObject) createProcessComponent();
-		case UmaPackage.PROCESS_PACKAGE:
-			return (EObject) createProcessPackage();
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE:
-			return (EObject) createProcessComponentInterface();
-		case UmaPackage.PROCESS_COMPONENT_DESCRIPTOR:
-			return (EObject) createProcessComponentDescriptor();
-		case UmaPackage.METHOD_PLUGIN:
-			return (EObject) createMethodPlugin();
-		case UmaPackage.METHOD_CONFIGURATION:
-			return (EObject) createMethodConfiguration();
-		case UmaPackage.PROCESS_FAMILY:
-			return (EObject) createProcessFamily();
-		case UmaPackage.METHOD_LIBRARY:
-			return (EObject) createMethodLibrary();
-		default:
-			throw new IllegalArgumentException(
-					"The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-		case UmaPackage.WORK_ORDER_TYPE:
-			return createWorkOrderTypeFromString(eDataType, initialValue);
-		case UmaPackage.PSEUDO_STATE_KIND:
-			return createPseudoStateKindFromString(eDataType, initialValue);
-		case UmaPackage.VARIABILITY_TYPE:
-			return createVariabilityTypeFromString(eDataType, initialValue);
-		case UmaPackage.DATE:
-			return createDateFromString(eDataType, initialValue);
-		case UmaPackage.URI:
-			return createUriFromString(eDataType, initialValue);
-		case UmaPackage.UNLIMITED_NATURAL:
-			return createUnlimitedNaturalFromString(eDataType, initialValue);
-		case UmaPackage.STRING:
-			return createStringFromString(eDataType, initialValue);
-		case UmaPackage.SET:
-			return createSetFromString(eDataType, initialValue);
-		case UmaPackage.SEQUENCE:
-			return createSequenceFromString(eDataType, initialValue);
-		case UmaPackage.INTEGER:
-			return createIntegerFromString(eDataType, initialValue);
-		case UmaPackage.FLOAT:
-			return createFloatFromString(eDataType, initialValue);
-		default:
-			throw new IllegalArgumentException(
-					"The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-		case UmaPackage.WORK_ORDER_TYPE:
-			return convertWorkOrderTypeToString(eDataType, instanceValue);
-		case UmaPackage.PSEUDO_STATE_KIND:
-			return convertPseudoStateKindToString(eDataType, instanceValue);
-		case UmaPackage.VARIABILITY_TYPE:
-			return convertVariabilityTypeToString(eDataType, instanceValue);
-		case UmaPackage.DATE:
-			return convertDateToString(eDataType, instanceValue);
-		case UmaPackage.URI:
-			return convertUriToString(eDataType, instanceValue);
-		case UmaPackage.UNLIMITED_NATURAL:
-			return convertUnlimitedNaturalToString(eDataType, instanceValue);
-		case UmaPackage.STRING:
-			return convertStringToString(eDataType, instanceValue);
-		case UmaPackage.SET:
-			return convertSetToString(eDataType, instanceValue);
-		case UmaPackage.SEQUENCE:
-			return convertSequenceToString(eDataType, instanceValue);
-		case UmaPackage.INTEGER:
-			return convertIntegerToString(eDataType, instanceValue);
-		case UmaPackage.FLOAT:
-			return convertFloatToString(eDataType, instanceValue);
-		default:
-			throw new IllegalArgumentException(
-					"The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public org.eclipse.epf.uma.Package createPackage() {
-		PackageImpl package_ = new PackageImpl();
-		return package_;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint createConstraint() {
-		ConstraintImpl constraint = new ConstraintImpl();
-		return constraint;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElementProperty createMethodElementProperty() {
-		MethodElementPropertyImpl methodElementProperty = new MethodElementPropertyImpl();
-		return methodElementProperty;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentDescription createContentDescription() {
-		ContentDescriptionImpl contentDescription = new ContentDescriptionImpl();
-		return contentDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Section createSection() {
-		SectionImpl section = new SectionImpl();
-		return section;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Role createRole() {
-		RoleImpl role = new RoleImpl();
-		return role;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Task createTask() {
-		TaskImpl task = new TaskImpl();
-		return task;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Step createStep() {
-		StepImpl step = new StepImpl();
-		return step;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Artifact createArtifact() {
-		ArtifactImpl artifact = new ArtifactImpl();
-		return artifact;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Deliverable createDeliverable() {
-		DeliverableImpl deliverable = new DeliverableImpl();
-		return deliverable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Outcome createOutcome() {
-		OutcomeImpl outcome = new OutcomeImpl();
-		return outcome;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentPackage createContentPackage() {
-		ContentPackageImpl contentPackage = new ContentPackageImpl();
-		return contentPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArtifactDescription createArtifactDescription() {
-		ArtifactDescriptionImpl artifactDescription = new ArtifactDescriptionImpl();
-		return artifactDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescription createWorkProductDescription() {
-		WorkProductDescriptionImpl workProductDescription = new WorkProductDescriptionImpl();
-		return workProductDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliverableDescription createDeliverableDescription() {
-		DeliverableDescriptionImpl deliverableDescription = new DeliverableDescriptionImpl();
-		return deliverableDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescription createRoleDescription() {
-		RoleDescriptionImpl roleDescription = new RoleDescriptionImpl();
-		return roleDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskDescription createTaskDescription() {
-		TaskDescriptionImpl taskDescription = new TaskDescriptionImpl();
-		return taskDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GuidanceDescription createGuidanceDescription() {
-		GuidanceDescriptionImpl guidanceDescription = new GuidanceDescriptionImpl();
-		return guidanceDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PracticeDescription createPracticeDescription() {
-		PracticeDescriptionImpl practiceDescription = new PracticeDescriptionImpl();
-		return practiceDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Point createPoint() {
-		PointImpl point = new PointImpl();
-		return point;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DiagramLink createDiagramLink() {
-		DiagramLinkImpl diagramLink = new DiagramLinkImpl();
-		return diagramLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphConnector createGraphConnector() {
-		GraphConnectorImpl graphConnector = new GraphConnectorImpl();
-		return graphConnector;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Dimension createDimension() {
-		DimensionImpl dimension = new DimensionImpl();
-		return dimension;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Reference createReference() {
-		ReferenceImpl reference = new ReferenceImpl();
-		return reference;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Property createProperty() {
-		PropertyImpl property = new PropertyImpl();
-		return property;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphEdge createGraphEdge() {
-		GraphEdgeImpl graphEdge = new GraphEdgeImpl();
-		return graphEdge;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Diagram createDiagram() {
-		DiagramImpl diagram = new DiagramImpl();
-		return diagram;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GraphNode createGraphNode() {
-		GraphNodeImpl graphNode = new GraphNodeImpl();
-		return graphNode;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SimpleSemanticModelElement createSimpleSemanticModelElement() {
-		SimpleSemanticModelElementImpl simpleSemanticModelElement = new SimpleSemanticModelElementImpl();
-		return simpleSemanticModelElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UMASemanticModelBridge createUMASemanticModelBridge() {
-		UMASemanticModelBridgeImpl umaSemanticModelBridge = new UMASemanticModelBridgeImpl();
-		return umaSemanticModelBridge;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CoreSemanticModelBridge createCoreSemanticModelBridge() {
-		CoreSemanticModelBridgeImpl coreSemanticModelBridge = new CoreSemanticModelBridgeImpl();
-		return coreSemanticModelBridge;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TextElement createTextElement() {
-		TextElementImpl textElement = new TextElementImpl();
-		return textElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Image createImage() {
-		ImageImpl image = new ImageImpl();
-		return image;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Polyline createPolyline() {
-		PolylineImpl polyline = new PolylineImpl();
-		return polyline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Ellipse createEllipse() {
-		EllipseImpl ellipse = new EllipseImpl();
-		return ellipse;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Activity createActivity() {
-		ActivityImpl activity = new ActivityImpl();
-		return activity;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Milestone createMilestone() {
-		MilestoneImpl milestone = new MilestoneImpl();
-		return milestone;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Iteration createIteration() {
-		IterationImpl iteration = new IterationImpl();
-		return iteration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Phase createPhase() {
-		PhaseImpl phase = new PhaseImpl();
-		return phase;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TeamProfile createTeamProfile() {
-		TeamProfileImpl teamProfile = new TeamProfileImpl();
-		return teamProfile;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescriptor createRoleDescriptor() {
-		RoleDescriptorImpl roleDescriptor = new RoleDescriptorImpl();
-		return roleDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrder createWorkOrder() {
-		WorkOrderImpl workOrder = new WorkOrderImpl();
-		return workOrder;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlanningData createPlanningData() {
-		PlanningDataImpl planningData = new PlanningDataImpl();
-		return planningData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskDescriptor createTaskDescriptor() {
-		TaskDescriptorImpl taskDescriptor = new TaskDescriptorImpl();
-		return taskDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescriptor createWorkProductDescriptor() {
-		WorkProductDescriptorImpl workProductDescriptor = new WorkProductDescriptorImpl();
-		return workProductDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CompositeRole createCompositeRole() {
-		CompositeRoleImpl compositeRole = new CompositeRoleImpl();
-		return compositeRole;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElementDescription createBreakdownElementDescription() {
-		BreakdownElementDescriptionImpl breakdownElementDescription = new BreakdownElementDescriptionImpl();
-		return breakdownElementDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityDescription createActivityDescription() {
-		ActivityDescriptionImpl activityDescription = new ActivityDescriptionImpl();
-		return activityDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliveryProcessDescription createDeliveryProcessDescription() {
-		DeliveryProcessDescriptionImpl deliveryProcessDescription = new DeliveryProcessDescriptionImpl();
-		return deliveryProcessDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessDescription createProcessDescription() {
-		ProcessDescriptionImpl processDescription = new ProcessDescriptionImpl();
-		return processDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptorDescription createDescriptorDescription() {
-		DescriptorDescriptionImpl descriptorDescription = new DescriptorDescriptionImpl();
-		return descriptorDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Concept createConcept() {
-		ConceptImpl concept = new ConceptImpl();
-		return concept;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Checklist createChecklist() {
-		ChecklistImpl checklist = new ChecklistImpl();
-		return checklist;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Example createExample() {
-		ExampleImpl example = new ExampleImpl();
-		return example;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Guideline createGuideline() {
-		GuidelineImpl guideline = new GuidelineImpl();
-		return guideline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EstimationConsiderations createEstimationConsiderations() {
-		EstimationConsiderationsImpl estimationConsiderations = new EstimationConsiderationsImpl();
-		return estimationConsiderations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Report createReport() {
-		ReportImpl report = new ReportImpl();
-		return report;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Template createTemplate() {
-		TemplateImpl template = new TemplateImpl();
-		return template;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportingMaterial createSupportingMaterial() {
-		SupportingMaterialImpl supportingMaterial = new SupportingMaterialImpl();
-		return supportingMaterial;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToolMentor createToolMentor() {
-		ToolMentorImpl toolMentor = new ToolMentorImpl();
-		return toolMentor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Whitepaper createWhitepaper() {
-		WhitepaperImpl whitepaper = new WhitepaperImpl();
-		return whitepaper;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TermDefinition createTermDefinition() {
-		TermDefinitionImpl termDefinition = new TermDefinitionImpl();
-		return termDefinition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Practice createPractice() {
-		PracticeImpl practice = new PracticeImpl();
-		return practice;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReusableAsset createReusableAsset() {
-		ReusableAssetImpl reusableAsset = new ReusableAssetImpl();
-		return reusableAsset;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public State createState() {
-		StateImpl state = new StateImpl();
-		return state;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Vertex createVertex() {
-		VertexImpl vertex = new VertexImpl();
-		return vertex;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Region createRegion() {
-		RegionImpl region = new RegionImpl();
-		return region;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateMachine createStateMachine() {
-		StateMachineImpl stateMachine = new StateMachineImpl();
-		return stateMachine;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Transition createTransition() {
-		TransitionImpl transition = new TransitionImpl();
-		return transition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PseudoState createPseudoState() {
-		PseudoStateImpl pseudoState = new PseudoStateImpl();
-		return pseudoState;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Discipline createDiscipline() {
-		DisciplineImpl discipline = new DisciplineImpl();
-		return discipline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleSet createRoleSet() {
-		RoleSetImpl roleSet = new RoleSetImpl();
-		return roleSet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Domain createDomain() {
-		DomainImpl domain = new DomainImpl();
-		return domain;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductType createWorkProductType() {
-		WorkProductTypeImpl workProductType = new WorkProductTypeImpl();
-		return workProductType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisciplineGrouping createDisciplineGrouping() {
-		DisciplineGroupingImpl disciplineGrouping = new DisciplineGroupingImpl();
-		return disciplineGrouping;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Tool createTool() {
-		ToolImpl tool = new ToolImpl();
-		return tool;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleSetGrouping createRoleSetGrouping() {
-		RoleSetGroupingImpl roleSetGrouping = new RoleSetGroupingImpl();
-		return roleSetGrouping;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CustomCategory createCustomCategory() {
-		CustomCategoryImpl customCategory = new CustomCategoryImpl();
-		return customCategory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliveryProcess createDeliveryProcess() {
-		DeliveryProcessImpl deliveryProcess = new DeliveryProcessImpl();
-		return deliveryProcess;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CapabilityPattern createCapabilityPattern() {
-		CapabilityPatternImpl capabilityPattern = new CapabilityPatternImpl();
-		return capabilityPattern;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessPlanningTemplate createProcessPlanningTemplate() {
-		ProcessPlanningTemplateImpl processPlanningTemplate = new ProcessPlanningTemplateImpl();
-		return processPlanningTemplate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Roadmap createRoadmap() {
-		RoadmapImpl roadmap = new RoadmapImpl();
-		return roadmap;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponent createProcessComponent() {
-		ProcessComponentImpl processComponent = new ProcessComponentImpl();
-		return processComponent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessPackage createProcessPackage() {
-		ProcessPackageImpl processPackage = new ProcessPackageImpl();
-		return processPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponentInterface createProcessComponentInterface() {
-		ProcessComponentInterfaceImpl processComponentInterface = new ProcessComponentInterfaceImpl();
-		return processComponentInterface;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponentDescriptor createProcessComponentDescriptor() {
-		ProcessComponentDescriptorImpl processComponentDescriptor = new ProcessComponentDescriptorImpl();
-		return processComponentDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodPlugin createMethodPlugin() {
-		MethodPluginImpl methodPlugin = new MethodPluginImpl();
-		return methodPlugin;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodConfiguration createMethodConfiguration() {
-		MethodConfigurationImpl methodConfiguration = new MethodConfigurationImpl();
-		return methodConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessFamily createProcessFamily() {
-		ProcessFamilyImpl processFamily = new ProcessFamilyImpl();
-		return processFamily;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodLibrary createMethodLibrary() {
-		MethodLibraryImpl methodLibrary = new MethodLibraryImpl();
-		return methodLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrderType createWorkOrderTypeFromString(EDataType eDataType,
-			String initialValue) {
-		WorkOrderType result = WorkOrderType.get(initialValue);
-		if (result == null)
-			throw new IllegalArgumentException(
-					"The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWorkOrderTypeToString(EDataType eDataType,
-			Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PseudoStateKind createPseudoStateKindFromString(EDataType eDataType,
-			String initialValue) {
-		PseudoStateKind result = PseudoStateKind.get(initialValue);
-		if (result == null)
-			throw new IllegalArgumentException(
-					"The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertPseudoStateKindToString(EDataType eDataType,
-			Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType createVariabilityTypeFromString(EDataType eDataType,
-			String initialValue) {
-		VariabilityType result = VariabilityType.get(initialValue);
-		if (result == null)
-			throw new IllegalArgumentException(
-					"The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertVariabilityTypeToString(EDataType eDataType,
-			Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Date createDateFromString(EDataType eDataType, String initialValue) {
-		return (Date) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertDateToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public URI createUriFromString(EDataType eDataType, String initialValue) {
-		return (URI) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertUriToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Integer createUnlimitedNaturalFromString(EDataType eDataType,
-			String initialValue) {
-		return (Integer) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertUnlimitedNaturalToString(EDataType eDataType,
-			Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String createStringFromString(EDataType eDataType,
-			String initialValue) {
-		return (String) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertStringToString(EDataType eDataType,
-			Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Set createSetFromString(EDataType eDataType, String initialValue) {
-		return (Set) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertSetToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List createSequenceFromString(EDataType eDataType,
-			String initialValue) {
-		return (List) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertSequenceToString(EDataType eDataType,
-			Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Integer createIntegerFromString(EDataType eDataType,
-			String initialValue) {
-		return (Integer) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertIntegerToString(EDataType eDataType,
-			Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float createFloatFromString(EDataType eDataType, String initialValue) {
-		return (Float) super.createFromString(eDataType, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertFloatToString(EDataType eDataType, Object instanceValue) {
-		return super.convertToString(eDataType, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaPackage getUmaPackage() {
-		return (UmaPackage) getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static UmaPackage getPackage() {
-		return UmaPackage.eINSTANCE;
-	}
-
-} //UmaFactoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UmaPackageImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UmaPackageImpl.java
deleted file mode 100644
index 89eb64c..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/UmaPackageImpl.java
+++ /dev/null
@@ -1,7121 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ArtifactDescription;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Classifier;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CoreSemanticModelBridge;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DeliverableDescription;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DeliveryProcessDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Element;
-import org.eclipse.epf.uma.Ellipse;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.GraphicPrimitive;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Image;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.LeafElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Namespace;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.PackageableElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.PlanningData;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.Polyline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.PracticeDescription;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessComponentDescriptor;
-import org.eclipse.epf.uma.ProcessComponentInterface;
-import org.eclipse.epf.uma.ProcessDescription;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.PseudoState;
-import org.eclipse.epf.uma.PseudoStateKind;
-import org.eclipse.epf.uma.Reference;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescription;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.State;
-import org.eclipse.epf.uma.StateMachine;
-import org.eclipse.epf.uma.Step;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescription;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.TextElement;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Transition;
-import org.eclipse.epf.uma.Type;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.Vertex;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkDefinition;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescription;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.WorkProductType;
-
-import org.eclipse.epf.uma.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class UmaPackageImpl extends EPackageImpl implements UmaPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass classifierEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass typeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass elementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass namedElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass packageableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass packageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass namespaceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass constraintEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodElementPropertyEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass describableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sectionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workDefinitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stepEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass guidanceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass artifactEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliverableEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass outcomeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodPackageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentPackageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass artifactDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliverableDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass guidanceDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass practiceDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass pointEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass graphElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass diagramElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass diagramLinkEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass graphConnectorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass semanticModelBridgeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dimensionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referenceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass graphEdgeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass diagramEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass graphNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass simpleSemanticModelElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass umaSemanticModelBridgeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass coreSemanticModelBridgeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass leafElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass textElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass imageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass graphicPrimitiveEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass polylineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass ellipseEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workBreakdownElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass breakdownElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass milestoneEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass iterationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass phaseEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass teamProfileEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workOrderEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass planningDataEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass descriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass compositeRoleEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass breakdownElementDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliveryProcessDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass descriptorDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass conceptEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass checklistEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass exampleEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass guidelineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass estimationConsiderationsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass reportEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass templateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass supportingMaterialEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass toolMentorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass whitepaperEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass termDefinitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass practiceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass reusableAssetEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass vertexEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass regionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stateMachineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass transitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass pseudoStateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass disciplineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentCategoryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleSetEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass domainEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductTypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass disciplineGroupingEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass toolEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleSetGroupingEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass customCategoryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliveryProcessEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass capabilityPatternEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processPlanningTemplateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roadmapEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processComponentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processPackageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processComponentInterfaceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processComponentDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodPluginEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass variabilityElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodUnitEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodConfigurationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processFamilyEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum workOrderTypeEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum pseudoStateKindEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum variabilityTypeEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType dateEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType uriEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType unlimitedNaturalEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType stringEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType setEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType sequenceEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType integerEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType floatEDataType = 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.epf.uma.UmaPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private UmaPackageImpl() {
-		super(eNS_URI, UmaFactory.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.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static UmaPackage init() {
-		if (isInited)
-			return (UmaPackage) EPackage.Registry.INSTANCE
-					.getEPackage(UmaPackage.eNS_URI);
-
-		// Obtain or create and register package
-		UmaPackageImpl theUmaPackage = (UmaPackageImpl) (EPackage.Registry.INSTANCE
-				.getEPackage(eNS_URI) instanceof UmaPackageImpl ? EPackage.Registry.INSTANCE
-				.getEPackage(eNS_URI)
-				: new UmaPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theUmaPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theUmaPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theUmaPackage.freeze();
-
-		return theUmaPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClassifier() {
-		return classifierEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getType() {
-		return typeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getElement() {
-		return elementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNamedElement() {
-		return namedElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNamedElement_Name() {
-		return (EAttribute) namedElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPackageableElement() {
-		return packageableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPackage() {
-		return packageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNamespace() {
-		return namespaceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodElement() {
-		return methodElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_Guid() {
-		return (EAttribute) methodElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_BriefDescription() {
-		return (EAttribute) methodElementEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodElement_OwnedRules() {
-		return (EReference) methodElementEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodElement_MethodElementProperty() {
-		return (EReference) methodElementEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_Suppressed() {
-		return (EAttribute) methodElementEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_OrderingGuide() {
-		return (EAttribute) methodElementEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConstraint() {
-		return constraintEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConstraint_Body() {
-		return (EAttribute) constraintEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodElementProperty() {
-		return methodElementPropertyEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElementProperty_Value() {
-		return (EAttribute) methodElementPropertyEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentElement() {
-		return contentElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentElement_SupportingMaterials() {
-		return (EReference) contentElementEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentElement_ConceptsAndPapers() {
-		return (EReference) contentElementEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentElement_Checklists() {
-		return (EReference) contentElementEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentElement_Guidelines() {
-		return (EReference) contentElementEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentElement_Examples() {
-		return (EReference) contentElementEClass.getEStructuralFeatures()
-				.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentElement_Assets() {
-		return (EReference) contentElementEClass.getEStructuralFeatures()
-				.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentElement_TermDefinition() {
-		return (EReference) contentElementEClass.getEStructuralFeatures()
-				.get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescribableElement() {
-		return describableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescribableElement_PresentationName() {
-		return (EAttribute) describableElementEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDescribableElement_Presentation() {
-		return (EReference) describableElementEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescribableElement_Shapeicon() {
-		return (EAttribute) describableElementEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescribableElement_Nodeicon() {
-		return (EAttribute) describableElementEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentDescription() {
-		return contentDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentDescription_MainDescription() {
-		return (EAttribute) contentDescriptionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentDescription_Sections() {
-		return (EReference) contentDescriptionEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentDescription_ExternalId() {
-		return (EAttribute) contentDescriptionEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentDescription_KeyConsiderations() {
-		return (EAttribute) contentDescriptionEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSection() {
-		return sectionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSection_SectionName() {
-		return (EAttribute) sectionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSection_SectionDescription() {
-		return (EAttribute) sectionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSection_SubSections() {
-		return (EReference) sectionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSection_Predecessor() {
-		return (EReference) sectionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRole() {
-		return roleEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRole_Modifies() {
-		return (EReference) roleEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRole_ResponsibleFor() {
-		return (EReference) roleEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProduct() {
-		return workProductEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProduct_Reports() {
-		return (EReference) workProductEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProduct_Templates() {
-		return (EReference) workProductEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProduct_ToolMentors() {
-		return (EReference) workProductEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProduct_EstimationConsiderations() {
-		return (EReference) workProductEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTask() {
-		return taskEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_PerformedBy() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_MandatoryInput() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_Output() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_AdditionallyPerformedBy() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_OptionalInput() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_Steps() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_ToolMentors() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTask_EstimationConsiderations() {
-		return (EReference) taskEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkDefinition() {
-		return workDefinitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkDefinition_Precondition() {
-		return (EReference) workDefinitionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkDefinition_Postcondition() {
-		return (EReference) workDefinitionEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStep() {
-		return stepEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGuidance() {
-		return guidanceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArtifact() {
-		return artifactEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArtifact_ContainerArtifact() {
-		return (EReference) artifactEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArtifact_ContainedArtifacts() {
-		return (EReference) artifactEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliverable() {
-		return deliverableEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeliverable_DeliveredWorkProducts() {
-		return (EReference) deliverableEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOutcome() {
-		return outcomeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodPackage() {
-		return methodPackageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodPackage_Global() {
-		return (EAttribute) methodPackageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodPackage_ReusedPackages() {
-		return (EReference) methodPackageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodPackage_ChildPackages() {
-		return (EReference) methodPackageEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentPackage() {
-		return contentPackageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentPackage_ContentElements() {
-		return (EReference) contentPackageEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArtifactDescription() {
-		return artifactDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_BriefOutline() {
-		return (EAttribute) artifactDescriptionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_RepresentationOptions() {
-		return (EAttribute) artifactDescriptionEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_Representation() {
-		return (EAttribute) artifactDescriptionEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_Notation() {
-		return (EAttribute) artifactDescriptionEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductDescription() {
-		return workProductDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescription_Purpose() {
-		return (EAttribute) workProductDescriptionEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescription_ImpactOfNotHaving() {
-		return (EAttribute) workProductDescriptionEClass
-				.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescription_ReasonsForNotNeeding() {
-		return (EAttribute) workProductDescriptionEClass
-				.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliverableDescription() {
-		return deliverableDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliverableDescription_ExternalDescription() {
-		return (EAttribute) deliverableDescriptionEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliverableDescription_PackagingGuidance() {
-		return (EAttribute) deliverableDescriptionEClass
-				.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleDescription() {
-		return roleDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescription_Skills() {
-		return (EAttribute) roleDescriptionEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescription_AssignmentApproaches() {
-		return (EAttribute) roleDescriptionEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescription_Synonyms() {
-		return (EAttribute) roleDescriptionEClass.getEStructuralFeatures().get(
-				2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTaskDescription() {
-		return taskDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescription_Purpose() {
-		return (EAttribute) taskDescriptionEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescription_Alternatives() {
-		return (EAttribute) taskDescriptionEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGuidanceDescription() {
-		return guidanceDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGuidanceDescription_Attachments() {
-		return (EAttribute) guidanceDescriptionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPracticeDescription() {
-		return practiceDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_AdditionalInfo() {
-		return (EAttribute) practiceDescriptionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Problem() {
-		return (EAttribute) practiceDescriptionEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Background() {
-		return (EAttribute) practiceDescriptionEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Goals() {
-		return (EAttribute) practiceDescriptionEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Application() {
-		return (EAttribute) practiceDescriptionEClass.getEStructuralFeatures()
-				.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_LevelsOfAdoption() {
-		return (EAttribute) practiceDescriptionEClass.getEStructuralFeatures()
-				.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPoint() {
-		return pointEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPoint_X() {
-		return (EAttribute) pointEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPoint_Y() {
-		return (EAttribute) pointEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGraphElement() {
-		return graphElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphElement_Position() {
-		return (EReference) graphElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphElement_Contained() {
-		return (EReference) graphElementEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphElement_Link() {
-		return (EReference) graphElementEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphElement_Anchorage() {
-		return (EReference) graphElementEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphElement_SemanticModel() {
-		return (EReference) graphElementEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDiagramElement() {
-		return diagramElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDiagramElement_IsVisible() {
-		return (EAttribute) diagramElementEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagramElement_Container() {
-		return (EReference) diagramElementEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagramElement_Reference() {
-		return (EReference) diagramElementEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagramElement_Property() {
-		return (EReference) diagramElementEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDiagramLink() {
-		return diagramLinkEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDiagramLink_Zoom() {
-		return (EAttribute) diagramLinkEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagramLink_Viewport() {
-		return (EReference) diagramLinkEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagramLink_GraphElement() {
-		return (EReference) diagramLinkEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagramLink_Diagram() {
-		return (EReference) diagramLinkEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGraphConnector() {
-		return graphConnectorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphConnector_GraphElement() {
-		return (EReference) graphConnectorEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphConnector_GraphEdge() {
-		return (EReference) graphConnectorEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSemanticModelBridge() {
-		return semanticModelBridgeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSemanticModelBridge_Presentation() {
-		return (EAttribute) semanticModelBridgeEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSemanticModelBridge_GraphElement() {
-		return (EReference) semanticModelBridgeEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSemanticModelBridge_Diagram() {
-		return (EReference) semanticModelBridgeEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDimension() {
-		return dimensionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDimension_Width() {
-		return (EAttribute) dimensionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDimension_Height() {
-		return (EAttribute) dimensionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReference() {
-		return referenceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReference_IsIndividualRepresentation() {
-		return (EAttribute) referenceEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReference_Referenced() {
-		return (EReference) referenceEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProperty() {
-		return propertyEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_Key() {
-		return (EAttribute) propertyEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProperty_Value() {
-		return (EAttribute) propertyEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGraphEdge() {
-		return graphEdgeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphEdge_Anchor() {
-		return (EReference) graphEdgeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphEdge_Waypoints() {
-		return (EReference) graphEdgeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDiagram() {
-		return diagramEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDiagram_Zoom() {
-		return (EAttribute) diagramEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagram_Viewpoint() {
-		return (EReference) diagramEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagram_DiagramLink() {
-		return (EReference) diagramEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiagram_Namespace() {
-		return (EReference) diagramEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGraphNode() {
-		return graphNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getGraphNode_Size() {
-		return (EReference) graphNodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSimpleSemanticModelElement() {
-		return simpleSemanticModelElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSimpleSemanticModelElement_TypeInfo() {
-		return (EAttribute) simpleSemanticModelElementEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getUMASemanticModelBridge() {
-		return umaSemanticModelBridgeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getUMASemanticModelBridge_Element() {
-		return (EReference) umaSemanticModelBridgeEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCoreSemanticModelBridge() {
-		return coreSemanticModelBridgeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCoreSemanticModelBridge_Element() {
-		return (EReference) coreSemanticModelBridgeEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLeafElement() {
-		return leafElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTextElement() {
-		return textElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTextElement_Text() {
-		return (EAttribute) textElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getImage() {
-		return imageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getImage_Uri() {
-		return (EAttribute) imageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getImage_MimeType() {
-		return (EAttribute) imageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGraphicPrimitive() {
-		return graphicPrimitiveEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPolyline() {
-		return polylineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPolyline_Closed() {
-		return (EAttribute) polylineEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPolyline_Waypoints() {
-		return (EReference) polylineEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEllipse() {
-		return ellipseEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEllipse_RadiusX() {
-		return (EAttribute) ellipseEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEllipse_RadiusY() {
-		return (EAttribute) ellipseEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEllipse_Rotation() {
-		return (EAttribute) ellipseEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEllipse_StartAngle() {
-		return (EAttribute) ellipseEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEllipse_EndAngle() {
-		return (EAttribute) ellipseEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getEllipse_Center() {
-		return (EReference) ellipseEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivity() {
-		return activityEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_BreakdownElements() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Roadmaps() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_SupportingMaterials() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Checklists() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Concepts() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Examples() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_Guidelines() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_ReusableAssets() {
-		return (EReference) activityEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_IsEnactable() {
-		return (EAttribute) activityEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkBreakdownElement() {
-		return workBreakdownElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkBreakdownElement_IsRepeatable() {
-		return (EAttribute) workBreakdownElementEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkBreakdownElement_IsOngoing() {
-		return (EAttribute) workBreakdownElementEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkBreakdownElement_IsEventDriven() {
-		return (EAttribute) workBreakdownElementEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkBreakdownElement_LinkToPredecessor() {
-		return (EReference) workBreakdownElementEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBreakdownElement() {
-		return breakdownElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_Prefix() {
-		return (EAttribute) breakdownElementEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_IsPlanned() {
-		return (EAttribute) breakdownElementEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_HasMultipleOccurrences() {
-		return (EAttribute) breakdownElementEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_IsOptional() {
-		return (EAttribute) breakdownElementEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBreakdownElement_PresentedAfter() {
-		return (EReference) breakdownElementEClass.getEStructuralFeatures()
-				.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBreakdownElement_PresentedBefore() {
-		return (EReference) breakdownElementEClass.getEStructuralFeatures()
-				.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBreakdownElement_PlanningData() {
-		return (EReference) breakdownElementEClass.getEStructuralFeatures()
-				.get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBreakdownElement_SuperActivities() {
-		return (EReference) breakdownElementEClass.getEStructuralFeatures()
-				.get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMilestone() {
-		return milestoneEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIteration() {
-		return iterationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPhase() {
-		return phaseEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTeamProfile() {
-		return teamProfileEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTeamProfile_TeamRoles() {
-		return (EReference) teamProfileEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTeamProfile_SuperTeam() {
-		return (EReference) teamProfileEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTeamProfile_SubTeam() {
-		return (EReference) teamProfileEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleDescriptor() {
-		return roleDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRoleDescriptor_Role() {
-		return (EReference) roleDescriptorEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRoleDescriptor_Modifies() {
-		return (EReference) roleDescriptorEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRoleDescriptor_ResponsibleFor() {
-		return (EReference) roleDescriptorEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkOrder() {
-		return workOrderEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkOrder_LinkType() {
-		return (EAttribute) workOrderEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkOrder_Pred() {
-		return (EReference) workOrderEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessElement() {
-		return processElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPlanningData() {
-		return planningDataEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlanningData_StartDate() {
-		return (EAttribute) planningDataEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlanningData_FinishDate() {
-		return (EAttribute) planningDataEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlanningData_Rank() {
-		return (EAttribute) planningDataEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescriptor() {
-		return descriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptor_IsSynchronizedWithSource() {
-		return (EAttribute) descriptorEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTaskDescriptor() {
-		return taskDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_Task() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_AdditionallyPerformedBy() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_AssistedBy() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_ExternalInput() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_MandatoryInput() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_OptionalInput() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_Output() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_PerformedPrimarilyBy() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_SelectedSteps() {
-		return (EReference) taskDescriptorEClass.getEStructuralFeatures()
-				.get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductDescriptor() {
-		return workProductDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_ActivityEntryState() {
-		return (EAttribute) workProductDescriptorEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_ActivityExitState() {
-		return (EAttribute) workProductDescriptorEClass
-				.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProductDescriptor_WorkProduct() {
-		return (EReference) workProductDescriptorEClass
-				.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProductDescriptor_ImpactedBy() {
-		return (EReference) workProductDescriptorEClass
-				.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProductDescriptor_Impacts() {
-		return (EReference) workProductDescriptorEClass
-				.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProductDescriptor_DeliverableParts() {
-		return (EReference) workProductDescriptorEClass
-				.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCompositeRole() {
-		return compositeRoleEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCompositeRole_AggregatedRoles() {
-		return (EReference) compositeRoleEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBreakdownElementDescription() {
-		return breakdownElementDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElementDescription_UsageGuidance() {
-		return (EAttribute) breakdownElementDescriptionEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityDescription() {
-		return activityDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityDescription_Purpose() {
-		return (EAttribute) activityDescriptionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityDescription_Alternatives() {
-		return (EAttribute) activityDescriptionEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityDescription_HowtoStaff() {
-		return (EAttribute) activityDescriptionEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliveryProcessDescription() {
-		return deliveryProcessDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_Scale() {
-		return (EAttribute) deliveryProcessDescriptionEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_ProjectCharacteristics() {
-		return (EAttribute) deliveryProcessDescriptionEClass
-				.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_RiskLevel() {
-		return (EAttribute) deliveryProcessDescriptionEClass
-				.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_EstimatingTechnique() {
-		return (EAttribute) deliveryProcessDescriptionEClass
-				.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_ProjectMemberExpertise() {
-		return (EAttribute) deliveryProcessDescriptionEClass
-				.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_TypeOfContract() {
-		return (EAttribute) deliveryProcessDescriptionEClass
-				.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessDescription() {
-		return processDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessDescription_Scope() {
-		return (EAttribute) processDescriptionEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessDescription_UsageNotes() {
-		return (EAttribute) processDescriptionEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescriptorDescription() {
-		return descriptorDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptorDescription_RefinedDescription() {
-		return (EAttribute) descriptorDescriptionEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConcept() {
-		return conceptEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getChecklist() {
-		return checklistEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExample() {
-		return exampleEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGuideline() {
-		return guidelineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEstimationConsiderations() {
-		return estimationConsiderationsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReport() {
-		return reportEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTemplate() {
-		return templateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSupportingMaterial() {
-		return supportingMaterialEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getToolMentor() {
-		return toolMentorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWhitepaper() {
-		return whitepaperEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTermDefinition() {
-		return termDefinitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPractice() {
-		return practiceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPractice_SubPractices() {
-		return (EReference) practiceEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPractice_ContentReferences() {
-		return (EReference) practiceEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPractice_ActivityReferences() {
-		return (EReference) practiceEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReusableAsset() {
-		return reusableAssetEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getState() {
-		return stateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_WorkProduct() {
-		return (EReference) stateEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_Region() {
-		return (EReference) stateEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getState_Submachine() {
-		return (EReference) stateEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVertex() {
-		return vertexEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVertex_Container() {
-		return (EReference) vertexEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVertex_Outgoing() {
-		return (EReference) vertexEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVertex_Incoming() {
-		return (EReference) vertexEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRegion() {
-		return regionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_Vertex() {
-		return (EReference) regionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_Transition() {
-		return (EReference) regionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_State() {
-		return (EReference) regionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRegion_StateMachine() {
-		return (EReference) regionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStateMachine() {
-		return stateMachineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getStateMachine_Region() {
-		return (EReference) stateMachineEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTransition() {
-		return transitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_WorkDefinition() {
-		return (EReference) transitionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Container() {
-		return (EReference) transitionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Source() {
-		return (EReference) transitionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTransition_Target() {
-		return (EReference) transitionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPseudoState() {
-		return pseudoStateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDiscipline() {
-		return disciplineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiscipline_Tasks() {
-		return (EReference) disciplineEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiscipline_Subdiscipline() {
-		return (EReference) disciplineEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiscipline_ReferenceWorkflows() {
-		return (EReference) disciplineEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentCategory() {
-		return contentCategoryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleSet() {
-		return roleSetEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRoleSet_Roles() {
-		return (EReference) roleSetEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDomain() {
-		return domainEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDomain_WorkProducts() {
-		return (EReference) domainEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDomain_Subdomains() {
-		return (EReference) domainEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductType() {
-		return workProductTypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkProductType_WorkProducts() {
-		return (EReference) workProductTypeEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDisciplineGrouping() {
-		return disciplineGroupingEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDisciplineGrouping_Disciplines() {
-		return (EReference) disciplineGroupingEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTool() {
-		return toolEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTool_ToolMentors() {
-		return (EReference) toolEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleSetGrouping() {
-		return roleSetGroupingEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRoleSetGrouping_RoleSets() {
-		return (EReference) roleSetGroupingEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCustomCategory() {
-		return customCategoryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCustomCategory_CategorizedElements() {
-		return (EReference) customCategoryEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCustomCategory_SubCategories() {
-		return (EReference) customCategoryEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliveryProcess() {
-		return deliveryProcessEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeliveryProcess_EducationMaterials() {
-		return (EReference) deliveryProcessEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDeliveryProcess_CommunicationsMaterials() {
-		return (EReference) deliveryProcessEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcess() {
-		return processEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcess_IncludesPatterns() {
-		return (EReference) processEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcess_DefaultContext() {
-		return (EReference) processEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcess_ValidContext() {
-		return (EReference) processEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCapabilityPattern() {
-		return capabilityPatternEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessPlanningTemplate() {
-		return processPlanningTemplateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessPlanningTemplate_BasedOnProcesses() {
-		return (EReference) processPlanningTemplateEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoadmap() {
-		return roadmapEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessComponent() {
-		return processComponentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponent_Interfaces() {
-		return (EReference) processComponentEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponent_Process() {
-		return (EReference) processComponentEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessPackage() {
-		return processPackageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessPackage_ProcessElements() {
-		return (EReference) processPackageEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessPackage_Diagrams() {
-		return (EReference) processPackageEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessComponentInterface() {
-		return processComponentInterfaceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponentInterface_InterfaceSpecifications() {
-		return (EReference) processComponentInterfaceEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponentInterface_InterfaceIO() {
-		return (EReference) processComponentInterfaceEClass
-				.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessComponentDescriptor() {
-		return processComponentDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponentDescriptor_ProcessComponent() {
-		return (EReference) processComponentDescriptorEClass
-				.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodPlugin() {
-		return methodPluginEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodPlugin_UserChangeable() {
-		return (EAttribute) methodPluginEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodPlugin_MethodPackages() {
-		return (EReference) methodPluginEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodPlugin_Bases() {
-		return (EReference) methodPluginEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVariabilityElement() {
-		return variabilityElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVariabilityElement_VariabilityType() {
-		return (EAttribute) variabilityElementEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getVariabilityElement_VariabilityBasedOnElement() {
-		return (EReference) variabilityElementEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodUnit() {
-		return methodUnitEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_Authors() {
-		return (EAttribute) methodUnitEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_ChangeDate() {
-		return (EAttribute) methodUnitEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_ChangeDescription() {
-		return (EAttribute) methodUnitEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_Version() {
-		return (EAttribute) methodUnitEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodUnit_CopyrightStatement() {
-		return (EReference) methodUnitEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodConfiguration() {
-		return methodConfigurationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodConfiguration_MethodPluginSelection() {
-		return (EReference) methodConfigurationEClass.getEStructuralFeatures()
-				.get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodConfiguration_MethodPackageSelection() {
-		return (EReference) methodConfigurationEClass.getEStructuralFeatures()
-				.get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodConfiguration_ProcessViews() {
-		return (EReference) methodConfigurationEClass.getEStructuralFeatures()
-				.get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodConfiguration_DefaultView() {
-		return (EReference) methodConfigurationEClass.getEStructuralFeatures()
-				.get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodConfiguration_BaseConfigurations() {
-		return (EReference) methodConfigurationEClass.getEStructuralFeatures()
-				.get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodConfiguration_SubtractedCategory() {
-		return (EReference) methodConfigurationEClass.getEStructuralFeatures()
-				.get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodConfiguration_AddedCategory() {
-		return (EReference) methodConfigurationEClass.getEStructuralFeatures()
-				.get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessFamily() {
-		return processFamilyEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessFamily_DeliveryProcesses() {
-		return (EReference) processFamilyEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodLibrary() {
-		return methodLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodLibrary_MethodPlugins() {
-		return (EReference) methodLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodLibrary_PredefinedConfigurations() {
-		return (EReference) methodLibraryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getWorkOrderType() {
-		return workOrderTypeEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getPseudoStateKind() {
-		return pseudoStateKindEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getVariabilityType() {
-		return variabilityTypeEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getDate() {
-		return dateEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getUri() {
-		return uriEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getUnlimitedNatural() {
-		return unlimitedNaturalEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getString() {
-		return stringEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getSet() {
-		return setEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getSequence() {
-		return sequenceEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getInteger() {
-		return integerEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getFloat() {
-		return floatEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaFactory getUmaFactory() {
-		return (UmaFactory) 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
-		classifierEClass = createEClass(CLASSIFIER);
-
-		typeEClass = createEClass(TYPE);
-
-		elementEClass = createEClass(ELEMENT);
-
-		namedElementEClass = createEClass(NAMED_ELEMENT);
-		createEAttribute(namedElementEClass, NAMED_ELEMENT__NAME);
-
-		packageableElementEClass = createEClass(PACKAGEABLE_ELEMENT);
-
-		packageEClass = createEClass(PACKAGE);
-
-		namespaceEClass = createEClass(NAMESPACE);
-
-		methodElementEClass = createEClass(METHOD_ELEMENT);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__GUID);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__BRIEF_DESCRIPTION);
-		createEReference(methodElementEClass, METHOD_ELEMENT__OWNED_RULES);
-		createEReference(methodElementEClass,
-				METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__SUPPRESSED);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__ORDERING_GUIDE);
-
-		constraintEClass = createEClass(CONSTRAINT);
-		createEAttribute(constraintEClass, CONSTRAINT__BODY);
-
-		methodElementPropertyEClass = createEClass(METHOD_ELEMENT_PROPERTY);
-		createEAttribute(methodElementPropertyEClass,
-				METHOD_ELEMENT_PROPERTY__VALUE);
-
-		contentElementEClass = createEClass(CONTENT_ELEMENT);
-		createEReference(contentElementEClass,
-				CONTENT_ELEMENT__SUPPORTING_MATERIALS);
-		createEReference(contentElementEClass,
-				CONTENT_ELEMENT__CONCEPTS_AND_PAPERS);
-		createEReference(contentElementEClass, CONTENT_ELEMENT__CHECKLISTS);
-		createEReference(contentElementEClass, CONTENT_ELEMENT__GUIDELINES);
-		createEReference(contentElementEClass, CONTENT_ELEMENT__EXAMPLES);
-		createEReference(contentElementEClass, CONTENT_ELEMENT__ASSETS);
-		createEReference(contentElementEClass, CONTENT_ELEMENT__TERM_DEFINITION);
-
-		describableElementEClass = createEClass(DESCRIBABLE_ELEMENT);
-		createEAttribute(describableElementEClass,
-				DESCRIBABLE_ELEMENT__PRESENTATION_NAME);
-		createEReference(describableElementEClass,
-				DESCRIBABLE_ELEMENT__PRESENTATION);
-		createEAttribute(describableElementEClass,
-				DESCRIBABLE_ELEMENT__SHAPEICON);
-		createEAttribute(describableElementEClass,
-				DESCRIBABLE_ELEMENT__NODEICON);
-
-		contentDescriptionEClass = createEClass(CONTENT_DESCRIPTION);
-		createEAttribute(contentDescriptionEClass,
-				CONTENT_DESCRIPTION__MAIN_DESCRIPTION);
-		createEReference(contentDescriptionEClass,
-				CONTENT_DESCRIPTION__SECTIONS);
-		createEAttribute(contentDescriptionEClass,
-				CONTENT_DESCRIPTION__EXTERNAL_ID);
-		createEAttribute(contentDescriptionEClass,
-				CONTENT_DESCRIPTION__KEY_CONSIDERATIONS);
-
-		sectionEClass = createEClass(SECTION);
-		createEAttribute(sectionEClass, SECTION__SECTION_NAME);
-		createEAttribute(sectionEClass, SECTION__SECTION_DESCRIPTION);
-		createEReference(sectionEClass, SECTION__SUB_SECTIONS);
-		createEReference(sectionEClass, SECTION__PREDECESSOR);
-
-		roleEClass = createEClass(ROLE);
-		createEReference(roleEClass, ROLE__MODIFIES);
-		createEReference(roleEClass, ROLE__RESPONSIBLE_FOR);
-
-		workProductEClass = createEClass(WORK_PRODUCT);
-		createEReference(workProductEClass, WORK_PRODUCT__REPORTS);
-		createEReference(workProductEClass, WORK_PRODUCT__TEMPLATES);
-		createEReference(workProductEClass, WORK_PRODUCT__TOOL_MENTORS);
-		createEReference(workProductEClass,
-				WORK_PRODUCT__ESTIMATION_CONSIDERATIONS);
-
-		taskEClass = createEClass(TASK);
-		createEReference(taskEClass, TASK__PERFORMED_BY);
-		createEReference(taskEClass, TASK__MANDATORY_INPUT);
-		createEReference(taskEClass, TASK__OUTPUT);
-		createEReference(taskEClass, TASK__ADDITIONALLY_PERFORMED_BY);
-		createEReference(taskEClass, TASK__OPTIONAL_INPUT);
-		createEReference(taskEClass, TASK__STEPS);
-		createEReference(taskEClass, TASK__TOOL_MENTORS);
-		createEReference(taskEClass, TASK__ESTIMATION_CONSIDERATIONS);
-
-		workDefinitionEClass = createEClass(WORK_DEFINITION);
-		createEReference(workDefinitionEClass, WORK_DEFINITION__PRECONDITION);
-		createEReference(workDefinitionEClass, WORK_DEFINITION__POSTCONDITION);
-
-		stepEClass = createEClass(STEP);
-
-		guidanceEClass = createEClass(GUIDANCE);
-
-		artifactEClass = createEClass(ARTIFACT);
-		createEReference(artifactEClass, ARTIFACT__CONTAINER_ARTIFACT);
-		createEReference(artifactEClass, ARTIFACT__CONTAINED_ARTIFACTS);
-
-		deliverableEClass = createEClass(DELIVERABLE);
-		createEReference(deliverableEClass,
-				DELIVERABLE__DELIVERED_WORK_PRODUCTS);
-
-		outcomeEClass = createEClass(OUTCOME);
-
-		methodPackageEClass = createEClass(METHOD_PACKAGE);
-		createEAttribute(methodPackageEClass, METHOD_PACKAGE__GLOBAL);
-		createEReference(methodPackageEClass, METHOD_PACKAGE__REUSED_PACKAGES);
-		createEReference(methodPackageEClass, METHOD_PACKAGE__CHILD_PACKAGES);
-
-		contentPackageEClass = createEClass(CONTENT_PACKAGE);
-		createEReference(contentPackageEClass,
-				CONTENT_PACKAGE__CONTENT_ELEMENTS);
-
-		artifactDescriptionEClass = createEClass(ARTIFACT_DESCRIPTION);
-		createEAttribute(artifactDescriptionEClass,
-				ARTIFACT_DESCRIPTION__BRIEF_OUTLINE);
-		createEAttribute(artifactDescriptionEClass,
-				ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS);
-		createEAttribute(artifactDescriptionEClass,
-				ARTIFACT_DESCRIPTION__REPRESENTATION);
-		createEAttribute(artifactDescriptionEClass,
-				ARTIFACT_DESCRIPTION__NOTATION);
-
-		workProductDescriptionEClass = createEClass(WORK_PRODUCT_DESCRIPTION);
-		createEAttribute(workProductDescriptionEClass,
-				WORK_PRODUCT_DESCRIPTION__PURPOSE);
-		createEAttribute(workProductDescriptionEClass,
-				WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING);
-		createEAttribute(workProductDescriptionEClass,
-				WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING);
-
-		deliverableDescriptionEClass = createEClass(DELIVERABLE_DESCRIPTION);
-		createEAttribute(deliverableDescriptionEClass,
-				DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION);
-		createEAttribute(deliverableDescriptionEClass,
-				DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE);
-
-		roleDescriptionEClass = createEClass(ROLE_DESCRIPTION);
-		createEAttribute(roleDescriptionEClass, ROLE_DESCRIPTION__SKILLS);
-		createEAttribute(roleDescriptionEClass,
-				ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES);
-		createEAttribute(roleDescriptionEClass, ROLE_DESCRIPTION__SYNONYMS);
-
-		taskDescriptionEClass = createEClass(TASK_DESCRIPTION);
-		createEAttribute(taskDescriptionEClass, TASK_DESCRIPTION__PURPOSE);
-		createEAttribute(taskDescriptionEClass, TASK_DESCRIPTION__ALTERNATIVES);
-
-		guidanceDescriptionEClass = createEClass(GUIDANCE_DESCRIPTION);
-		createEAttribute(guidanceDescriptionEClass,
-				GUIDANCE_DESCRIPTION__ATTACHMENTS);
-
-		practiceDescriptionEClass = createEClass(PRACTICE_DESCRIPTION);
-		createEAttribute(practiceDescriptionEClass,
-				PRACTICE_DESCRIPTION__ADDITIONAL_INFO);
-		createEAttribute(practiceDescriptionEClass,
-				PRACTICE_DESCRIPTION__PROBLEM);
-		createEAttribute(practiceDescriptionEClass,
-				PRACTICE_DESCRIPTION__BACKGROUND);
-		createEAttribute(practiceDescriptionEClass, PRACTICE_DESCRIPTION__GOALS);
-		createEAttribute(practiceDescriptionEClass,
-				PRACTICE_DESCRIPTION__APPLICATION);
-		createEAttribute(practiceDescriptionEClass,
-				PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION);
-
-		pointEClass = createEClass(POINT);
-		createEAttribute(pointEClass, POINT__X);
-		createEAttribute(pointEClass, POINT__Y);
-
-		graphElementEClass = createEClass(GRAPH_ELEMENT);
-		createEReference(graphElementEClass, GRAPH_ELEMENT__POSITION);
-		createEReference(graphElementEClass, GRAPH_ELEMENT__CONTAINED);
-		createEReference(graphElementEClass, GRAPH_ELEMENT__LINK);
-		createEReference(graphElementEClass, GRAPH_ELEMENT__ANCHORAGE);
-		createEReference(graphElementEClass, GRAPH_ELEMENT__SEMANTIC_MODEL);
-
-		diagramElementEClass = createEClass(DIAGRAM_ELEMENT);
-		createEAttribute(diagramElementEClass, DIAGRAM_ELEMENT__IS_VISIBLE);
-		createEReference(diagramElementEClass, DIAGRAM_ELEMENT__CONTAINER);
-		createEReference(diagramElementEClass, DIAGRAM_ELEMENT__REFERENCE);
-		createEReference(diagramElementEClass, DIAGRAM_ELEMENT__PROPERTY);
-
-		diagramLinkEClass = createEClass(DIAGRAM_LINK);
-		createEAttribute(diagramLinkEClass, DIAGRAM_LINK__ZOOM);
-		createEReference(diagramLinkEClass, DIAGRAM_LINK__VIEWPORT);
-		createEReference(diagramLinkEClass, DIAGRAM_LINK__GRAPH_ELEMENT);
-		createEReference(diagramLinkEClass, DIAGRAM_LINK__DIAGRAM);
-
-		graphConnectorEClass = createEClass(GRAPH_CONNECTOR);
-		createEReference(graphConnectorEClass, GRAPH_CONNECTOR__GRAPH_ELEMENT);
-		createEReference(graphConnectorEClass, GRAPH_CONNECTOR__GRAPH_EDGE);
-
-		semanticModelBridgeEClass = createEClass(SEMANTIC_MODEL_BRIDGE);
-		createEAttribute(semanticModelBridgeEClass,
-				SEMANTIC_MODEL_BRIDGE__PRESENTATION);
-		createEReference(semanticModelBridgeEClass,
-				SEMANTIC_MODEL_BRIDGE__GRAPH_ELEMENT);
-		createEReference(semanticModelBridgeEClass,
-				SEMANTIC_MODEL_BRIDGE__DIAGRAM);
-
-		dimensionEClass = createEClass(DIMENSION);
-		createEAttribute(dimensionEClass, DIMENSION__WIDTH);
-		createEAttribute(dimensionEClass, DIMENSION__HEIGHT);
-
-		referenceEClass = createEClass(REFERENCE);
-		createEAttribute(referenceEClass,
-				REFERENCE__IS_INDIVIDUAL_REPRESENTATION);
-		createEReference(referenceEClass, REFERENCE__REFERENCED);
-
-		propertyEClass = createEClass(PROPERTY);
-		createEAttribute(propertyEClass, PROPERTY__KEY);
-		createEAttribute(propertyEClass, PROPERTY__VALUE);
-
-		graphEdgeEClass = createEClass(GRAPH_EDGE);
-		createEReference(graphEdgeEClass, GRAPH_EDGE__ANCHOR);
-		createEReference(graphEdgeEClass, GRAPH_EDGE__WAYPOINTS);
-
-		diagramEClass = createEClass(DIAGRAM);
-		createEAttribute(diagramEClass, DIAGRAM__ZOOM);
-		createEReference(diagramEClass, DIAGRAM__VIEWPOINT);
-		createEReference(diagramEClass, DIAGRAM__DIAGRAM_LINK);
-		createEReference(diagramEClass, DIAGRAM__NAMESPACE);
-
-		graphNodeEClass = createEClass(GRAPH_NODE);
-		createEReference(graphNodeEClass, GRAPH_NODE__SIZE);
-
-		simpleSemanticModelElementEClass = createEClass(SIMPLE_SEMANTIC_MODEL_ELEMENT);
-		createEAttribute(simpleSemanticModelElementEClass,
-				SIMPLE_SEMANTIC_MODEL_ELEMENT__TYPE_INFO);
-
-		umaSemanticModelBridgeEClass = createEClass(UMA_SEMANTIC_MODEL_BRIDGE);
-		createEReference(umaSemanticModelBridgeEClass,
-				UMA_SEMANTIC_MODEL_BRIDGE__ELEMENT);
-
-		coreSemanticModelBridgeEClass = createEClass(CORE_SEMANTIC_MODEL_BRIDGE);
-		createEReference(coreSemanticModelBridgeEClass,
-				CORE_SEMANTIC_MODEL_BRIDGE__ELEMENT);
-
-		leafElementEClass = createEClass(LEAF_ELEMENT);
-
-		textElementEClass = createEClass(TEXT_ELEMENT);
-		createEAttribute(textElementEClass, TEXT_ELEMENT__TEXT);
-
-		imageEClass = createEClass(IMAGE);
-		createEAttribute(imageEClass, IMAGE__URI);
-		createEAttribute(imageEClass, IMAGE__MIME_TYPE);
-
-		graphicPrimitiveEClass = createEClass(GRAPHIC_PRIMITIVE);
-
-		polylineEClass = createEClass(POLYLINE);
-		createEAttribute(polylineEClass, POLYLINE__CLOSED);
-		createEReference(polylineEClass, POLYLINE__WAYPOINTS);
-
-		ellipseEClass = createEClass(ELLIPSE);
-		createEAttribute(ellipseEClass, ELLIPSE__RADIUS_X);
-		createEAttribute(ellipseEClass, ELLIPSE__RADIUS_Y);
-		createEAttribute(ellipseEClass, ELLIPSE__ROTATION);
-		createEAttribute(ellipseEClass, ELLIPSE__START_ANGLE);
-		createEAttribute(ellipseEClass, ELLIPSE__END_ANGLE);
-		createEReference(ellipseEClass, ELLIPSE__CENTER);
-
-		activityEClass = createEClass(ACTIVITY);
-		createEReference(activityEClass, ACTIVITY__BREAKDOWN_ELEMENTS);
-		createEReference(activityEClass, ACTIVITY__ROADMAPS);
-		createEReference(activityEClass, ACTIVITY__SUPPORTING_MATERIALS);
-		createEReference(activityEClass, ACTIVITY__CHECKLISTS);
-		createEReference(activityEClass, ACTIVITY__CONCEPTS);
-		createEReference(activityEClass, ACTIVITY__EXAMPLES);
-		createEReference(activityEClass, ACTIVITY__GUIDELINES);
-		createEReference(activityEClass, ACTIVITY__REUSABLE_ASSETS);
-		createEAttribute(activityEClass, ACTIVITY__IS_ENACTABLE);
-
-		workBreakdownElementEClass = createEClass(WORK_BREAKDOWN_ELEMENT);
-		createEAttribute(workBreakdownElementEClass,
-				WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE);
-		createEAttribute(workBreakdownElementEClass,
-				WORK_BREAKDOWN_ELEMENT__IS_ONGOING);
-		createEAttribute(workBreakdownElementEClass,
-				WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN);
-		createEReference(workBreakdownElementEClass,
-				WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR);
-
-		breakdownElementEClass = createEClass(BREAKDOWN_ELEMENT);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__PREFIX);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__IS_PLANNED);
-		createEAttribute(breakdownElementEClass,
-				BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__IS_OPTIONAL);
-		createEReference(breakdownElementEClass,
-				BREAKDOWN_ELEMENT__PRESENTED_AFTER);
-		createEReference(breakdownElementEClass,
-				BREAKDOWN_ELEMENT__PRESENTED_BEFORE);
-		createEReference(breakdownElementEClass,
-				BREAKDOWN_ELEMENT__PLANNING_DATA);
-		createEReference(breakdownElementEClass,
-				BREAKDOWN_ELEMENT__SUPER_ACTIVITIES);
-
-		milestoneEClass = createEClass(MILESTONE);
-
-		iterationEClass = createEClass(ITERATION);
-
-		phaseEClass = createEClass(PHASE);
-
-		teamProfileEClass = createEClass(TEAM_PROFILE);
-		createEReference(teamProfileEClass, TEAM_PROFILE__TEAM_ROLES);
-		createEReference(teamProfileEClass, TEAM_PROFILE__SUPER_TEAM);
-		createEReference(teamProfileEClass, TEAM_PROFILE__SUB_TEAM);
-
-		roleDescriptorEClass = createEClass(ROLE_DESCRIPTOR);
-		createEReference(roleDescriptorEClass, ROLE_DESCRIPTOR__ROLE);
-		createEReference(roleDescriptorEClass, ROLE_DESCRIPTOR__MODIFIES);
-		createEReference(roleDescriptorEClass, ROLE_DESCRIPTOR__RESPONSIBLE_FOR);
-
-		workOrderEClass = createEClass(WORK_ORDER);
-		createEAttribute(workOrderEClass, WORK_ORDER__LINK_TYPE);
-		createEReference(workOrderEClass, WORK_ORDER__PRED);
-
-		processElementEClass = createEClass(PROCESS_ELEMENT);
-
-		planningDataEClass = createEClass(PLANNING_DATA);
-		createEAttribute(planningDataEClass, PLANNING_DATA__START_DATE);
-		createEAttribute(planningDataEClass, PLANNING_DATA__FINISH_DATE);
-		createEAttribute(planningDataEClass, PLANNING_DATA__RANK);
-
-		descriptorEClass = createEClass(DESCRIPTOR);
-		createEAttribute(descriptorEClass,
-				DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE);
-
-		workProductDescriptorEClass = createEClass(WORK_PRODUCT_DESCRIPTOR);
-		createEAttribute(workProductDescriptorEClass,
-				WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE);
-		createEAttribute(workProductDescriptorEClass,
-				WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE);
-		createEReference(workProductDescriptorEClass,
-				WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT);
-		createEReference(workProductDescriptorEClass,
-				WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY);
-		createEReference(workProductDescriptorEClass,
-				WORK_PRODUCT_DESCRIPTOR__IMPACTS);
-		createEReference(workProductDescriptorEClass,
-				WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS);
-
-		taskDescriptorEClass = createEClass(TASK_DESCRIPTOR);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__TASK);
-		createEReference(taskDescriptorEClass,
-				TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__ASSISTED_BY);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__EXTERNAL_INPUT);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__MANDATORY_INPUT);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__OPTIONAL_INPUT);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__OUTPUT);
-		createEReference(taskDescriptorEClass,
-				TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__SELECTED_STEPS);
-
-		compositeRoleEClass = createEClass(COMPOSITE_ROLE);
-		createEReference(compositeRoleEClass, COMPOSITE_ROLE__AGGREGATED_ROLES);
-
-		breakdownElementDescriptionEClass = createEClass(BREAKDOWN_ELEMENT_DESCRIPTION);
-		createEAttribute(breakdownElementDescriptionEClass,
-				BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE);
-
-		activityDescriptionEClass = createEClass(ACTIVITY_DESCRIPTION);
-		createEAttribute(activityDescriptionEClass,
-				ACTIVITY_DESCRIPTION__PURPOSE);
-		createEAttribute(activityDescriptionEClass,
-				ACTIVITY_DESCRIPTION__ALTERNATIVES);
-		createEAttribute(activityDescriptionEClass,
-				ACTIVITY_DESCRIPTION__HOWTO_STAFF);
-
-		deliveryProcessDescriptionEClass = createEClass(DELIVERY_PROCESS_DESCRIPTION);
-		createEAttribute(deliveryProcessDescriptionEClass,
-				DELIVERY_PROCESS_DESCRIPTION__SCALE);
-		createEAttribute(deliveryProcessDescriptionEClass,
-				DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS);
-		createEAttribute(deliveryProcessDescriptionEClass,
-				DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL);
-		createEAttribute(deliveryProcessDescriptionEClass,
-				DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE);
-		createEAttribute(deliveryProcessDescriptionEClass,
-				DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE);
-		createEAttribute(deliveryProcessDescriptionEClass,
-				DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT);
-
-		processDescriptionEClass = createEClass(PROCESS_DESCRIPTION);
-		createEAttribute(processDescriptionEClass, PROCESS_DESCRIPTION__SCOPE);
-		createEAttribute(processDescriptionEClass,
-				PROCESS_DESCRIPTION__USAGE_NOTES);
-
-		descriptorDescriptionEClass = createEClass(DESCRIPTOR_DESCRIPTION);
-		createEAttribute(descriptorDescriptionEClass,
-				DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION);
-
-		conceptEClass = createEClass(CONCEPT);
-
-		checklistEClass = createEClass(CHECKLIST);
-
-		exampleEClass = createEClass(EXAMPLE);
-
-		guidelineEClass = createEClass(GUIDELINE);
-
-		reportEClass = createEClass(REPORT);
-
-		templateEClass = createEClass(TEMPLATE);
-
-		supportingMaterialEClass = createEClass(SUPPORTING_MATERIAL);
-
-		toolMentorEClass = createEClass(TOOL_MENTOR);
-
-		whitepaperEClass = createEClass(WHITEPAPER);
-
-		termDefinitionEClass = createEClass(TERM_DEFINITION);
-
-		practiceEClass = createEClass(PRACTICE);
-		createEReference(practiceEClass, PRACTICE__SUB_PRACTICES);
-		createEReference(practiceEClass, PRACTICE__CONTENT_REFERENCES);
-		createEReference(practiceEClass, PRACTICE__ACTIVITY_REFERENCES);
-
-		estimationConsiderationsEClass = createEClass(ESTIMATION_CONSIDERATIONS);
-
-		reusableAssetEClass = createEClass(REUSABLE_ASSET);
-
-		stateEClass = createEClass(STATE);
-		createEReference(stateEClass, STATE__WORK_PRODUCT);
-		createEReference(stateEClass, STATE__REGION);
-		createEReference(stateEClass, STATE__SUBMACHINE);
-
-		vertexEClass = createEClass(VERTEX);
-		createEReference(vertexEClass, VERTEX__CONTAINER);
-		createEReference(vertexEClass, VERTEX__OUTGOING);
-		createEReference(vertexEClass, VERTEX__INCOMING);
-
-		regionEClass = createEClass(REGION);
-		createEReference(regionEClass, REGION__VERTEX);
-		createEReference(regionEClass, REGION__TRANSITION);
-		createEReference(regionEClass, REGION__STATE);
-		createEReference(regionEClass, REGION__STATE_MACHINE);
-
-		stateMachineEClass = createEClass(STATE_MACHINE);
-		createEReference(stateMachineEClass, STATE_MACHINE__REGION);
-
-		transitionEClass = createEClass(TRANSITION);
-		createEReference(transitionEClass, TRANSITION__WORK_DEFINITION);
-		createEReference(transitionEClass, TRANSITION__CONTAINER);
-		createEReference(transitionEClass, TRANSITION__SOURCE);
-		createEReference(transitionEClass, TRANSITION__TARGET);
-
-		pseudoStateEClass = createEClass(PSEUDO_STATE);
-
-		disciplineEClass = createEClass(DISCIPLINE);
-		createEReference(disciplineEClass, DISCIPLINE__TASKS);
-		createEReference(disciplineEClass, DISCIPLINE__SUBDISCIPLINE);
-		createEReference(disciplineEClass, DISCIPLINE__REFERENCE_WORKFLOWS);
-
-		contentCategoryEClass = createEClass(CONTENT_CATEGORY);
-
-		roleSetEClass = createEClass(ROLE_SET);
-		createEReference(roleSetEClass, ROLE_SET__ROLES);
-
-		domainEClass = createEClass(DOMAIN);
-		createEReference(domainEClass, DOMAIN__WORK_PRODUCTS);
-		createEReference(domainEClass, DOMAIN__SUBDOMAINS);
-
-		workProductTypeEClass = createEClass(WORK_PRODUCT_TYPE);
-		createEReference(workProductTypeEClass,
-				WORK_PRODUCT_TYPE__WORK_PRODUCTS);
-
-		disciplineGroupingEClass = createEClass(DISCIPLINE_GROUPING);
-		createEReference(disciplineGroupingEClass,
-				DISCIPLINE_GROUPING__DISCIPLINES);
-
-		toolEClass = createEClass(TOOL);
-		createEReference(toolEClass, TOOL__TOOL_MENTORS);
-
-		roleSetGroupingEClass = createEClass(ROLE_SET_GROUPING);
-		createEReference(roleSetGroupingEClass, ROLE_SET_GROUPING__ROLE_SETS);
-
-		customCategoryEClass = createEClass(CUSTOM_CATEGORY);
-		createEReference(customCategoryEClass,
-				CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS);
-		createEReference(customCategoryEClass, CUSTOM_CATEGORY__SUB_CATEGORIES);
-
-		deliveryProcessEClass = createEClass(DELIVERY_PROCESS);
-		createEReference(deliveryProcessEClass,
-				DELIVERY_PROCESS__EDUCATION_MATERIALS);
-		createEReference(deliveryProcessEClass,
-				DELIVERY_PROCESS__COMMUNICATIONS_MATERIALS);
-
-		processEClass = createEClass(PROCESS);
-		createEReference(processEClass, PROCESS__INCLUDES_PATTERNS);
-		createEReference(processEClass, PROCESS__DEFAULT_CONTEXT);
-		createEReference(processEClass, PROCESS__VALID_CONTEXT);
-
-		capabilityPatternEClass = createEClass(CAPABILITY_PATTERN);
-
-		processPlanningTemplateEClass = createEClass(PROCESS_PLANNING_TEMPLATE);
-		createEReference(processPlanningTemplateEClass,
-				PROCESS_PLANNING_TEMPLATE__BASED_ON_PROCESSES);
-
-		roadmapEClass = createEClass(ROADMAP);
-
-		processComponentEClass = createEClass(PROCESS_COMPONENT);
-		createEReference(processComponentEClass, PROCESS_COMPONENT__INTERFACES);
-		createEReference(processComponentEClass, PROCESS_COMPONENT__PROCESS);
-
-		processPackageEClass = createEClass(PROCESS_PACKAGE);
-		createEReference(processPackageEClass,
-				PROCESS_PACKAGE__PROCESS_ELEMENTS);
-		createEReference(processPackageEClass, PROCESS_PACKAGE__DIAGRAMS);
-
-		processComponentInterfaceEClass = createEClass(PROCESS_COMPONENT_INTERFACE);
-		createEReference(processComponentInterfaceEClass,
-				PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATIONS);
-		createEReference(processComponentInterfaceEClass,
-				PROCESS_COMPONENT_INTERFACE__INTERFACE_IO);
-
-		processComponentDescriptorEClass = createEClass(PROCESS_COMPONENT_DESCRIPTOR);
-		createEReference(processComponentDescriptorEClass,
-				PROCESS_COMPONENT_DESCRIPTOR__PROCESS_COMPONENT);
-
-		methodPluginEClass = createEClass(METHOD_PLUGIN);
-		createEAttribute(methodPluginEClass, METHOD_PLUGIN__USER_CHANGEABLE);
-		createEReference(methodPluginEClass, METHOD_PLUGIN__METHOD_PACKAGES);
-		createEReference(methodPluginEClass, METHOD_PLUGIN__BASES);
-
-		variabilityElementEClass = createEClass(VARIABILITY_ELEMENT);
-		createEAttribute(variabilityElementEClass,
-				VARIABILITY_ELEMENT__VARIABILITY_TYPE);
-		createEReference(variabilityElementEClass,
-				VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT);
-
-		methodUnitEClass = createEClass(METHOD_UNIT);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__AUTHORS);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__CHANGE_DATE);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__CHANGE_DESCRIPTION);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__VERSION);
-		createEReference(methodUnitEClass, METHOD_UNIT__COPYRIGHT_STATEMENT);
-
-		methodConfigurationEClass = createEClass(METHOD_CONFIGURATION);
-		createEReference(methodConfigurationEClass,
-				METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION);
-		createEReference(methodConfigurationEClass,
-				METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION);
-		createEReference(methodConfigurationEClass,
-				METHOD_CONFIGURATION__PROCESS_VIEWS);
-		createEReference(methodConfigurationEClass,
-				METHOD_CONFIGURATION__DEFAULT_VIEW);
-		createEReference(methodConfigurationEClass,
-				METHOD_CONFIGURATION__BASE_CONFIGURATIONS);
-		createEReference(methodConfigurationEClass,
-				METHOD_CONFIGURATION__SUBTRACTED_CATEGORY);
-		createEReference(methodConfigurationEClass,
-				METHOD_CONFIGURATION__ADDED_CATEGORY);
-
-		processFamilyEClass = createEClass(PROCESS_FAMILY);
-		createEReference(processFamilyEClass,
-				PROCESS_FAMILY__DELIVERY_PROCESSES);
-
-		methodLibraryEClass = createEClass(METHOD_LIBRARY);
-		createEReference(methodLibraryEClass, METHOD_LIBRARY__METHOD_PLUGINS);
-		createEReference(methodLibraryEClass,
-				METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS);
-
-		// Create enums
-		workOrderTypeEEnum = createEEnum(WORK_ORDER_TYPE);
-		pseudoStateKindEEnum = createEEnum(PSEUDO_STATE_KIND);
-		variabilityTypeEEnum = createEEnum(VARIABILITY_TYPE);
-
-		// Create data types
-		dateEDataType = createEDataType(DATE);
-		uriEDataType = createEDataType(URI);
-		unlimitedNaturalEDataType = createEDataType(UNLIMITED_NATURAL);
-		stringEDataType = createEDataType(STRING);
-		setEDataType = createEDataType(SET);
-		sequenceEDataType = createEDataType(SEQUENCE);
-		integerEDataType = createEDataType(INTEGER);
-		floatEDataType = createEDataType(FLOAT);
-	}
-
-	/**
-	 * <!-- 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);
-
-		// Add supertypes to classes
-		classifierEClass.getESuperTypes().add(this.getType());
-		typeEClass.getESuperTypes().add(this.getPackageableElement());
-		namedElementEClass.getESuperTypes().add(this.getElement());
-		packageableElementEClass.getESuperTypes().add(this.getNamedElement());
-		packageEClass.getESuperTypes().add(this.getNamespace());
-		packageEClass.getESuperTypes().add(this.getPackageableElement());
-		namespaceEClass.getESuperTypes().add(this.getNamedElement());
-		methodElementEClass.getESuperTypes().add(this.getPackageableElement());
-		constraintEClass.getESuperTypes().add(this.getMethodElement());
-		methodElementPropertyEClass.getESuperTypes().add(
-				this.getPackageableElement());
-		contentElementEClass.getESuperTypes().add(this.getDescribableElement());
-		contentElementEClass.getESuperTypes().add(this.getVariabilityElement());
-		describableElementEClass.getESuperTypes().add(this.getMethodElement());
-		describableElementEClass.getESuperTypes().add(this.getClassifier());
-		contentDescriptionEClass.getESuperTypes().add(this.getMethodUnit());
-		sectionEClass.getESuperTypes().add(this.getVariabilityElement());
-		roleEClass.getESuperTypes().add(this.getContentElement());
-		workProductEClass.getESuperTypes().add(this.getContentElement());
-		taskEClass.getESuperTypes().add(this.getContentElement());
-		taskEClass.getESuperTypes().add(this.getWorkDefinition());
-		workDefinitionEClass.getESuperTypes().add(this.getMethodElement());
-		stepEClass.getESuperTypes().add(this.getSection());
-		stepEClass.getESuperTypes().add(this.getWorkDefinition());
-		guidanceEClass.getESuperTypes().add(this.getContentElement());
-		artifactEClass.getESuperTypes().add(this.getWorkProduct());
-		deliverableEClass.getESuperTypes().add(this.getWorkProduct());
-		outcomeEClass.getESuperTypes().add(this.getWorkProduct());
-		methodPackageEClass.getESuperTypes().add(this.getMethodElement());
-		methodPackageEClass.getESuperTypes().add(this.getPackage());
-		contentPackageEClass.getESuperTypes().add(this.getMethodPackage());
-		artifactDescriptionEClass.getESuperTypes().add(
-				this.getWorkProductDescription());
-		workProductDescriptionEClass.getESuperTypes().add(
-				this.getContentDescription());
-		deliverableDescriptionEClass.getESuperTypes().add(
-				this.getWorkProductDescription());
-		roleDescriptionEClass.getESuperTypes()
-				.add(this.getContentDescription());
-		taskDescriptionEClass.getESuperTypes()
-				.add(this.getContentDescription());
-		guidanceDescriptionEClass.getESuperTypes().add(
-				this.getContentDescription());
-		practiceDescriptionEClass.getESuperTypes().add(
-				this.getContentDescription());
-		graphElementEClass.getESuperTypes().add(this.getDiagramElement());
-		diagramElementEClass.getESuperTypes().add(this.getMethodElement());
-		diagramLinkEClass.getESuperTypes().add(this.getDiagramElement());
-		graphConnectorEClass.getESuperTypes().add(this.getGraphElement());
-		semanticModelBridgeEClass.getESuperTypes()
-				.add(this.getDiagramElement());
-		referenceEClass.getESuperTypes().add(this.getDiagramElement());
-		propertyEClass.getESuperTypes().add(this.getDiagramElement());
-		graphEdgeEClass.getESuperTypes().add(this.getGraphElement());
-		diagramEClass.getESuperTypes().add(this.getGraphNode());
-		graphNodeEClass.getESuperTypes().add(this.getGraphElement());
-		simpleSemanticModelElementEClass.getESuperTypes().add(
-				this.getSemanticModelBridge());
-		umaSemanticModelBridgeEClass.getESuperTypes().add(
-				this.getSemanticModelBridge());
-		coreSemanticModelBridgeEClass.getESuperTypes().add(
-				this.getSemanticModelBridge());
-		leafElementEClass.getESuperTypes().add(this.getDiagramElement());
-		textElementEClass.getESuperTypes().add(this.getLeafElement());
-		imageEClass.getESuperTypes().add(this.getLeafElement());
-		graphicPrimitiveEClass.getESuperTypes().add(this.getLeafElement());
-		polylineEClass.getESuperTypes().add(this.getGraphicPrimitive());
-		ellipseEClass.getESuperTypes().add(this.getGraphicPrimitive());
-		activityEClass.getESuperTypes().add(this.getWorkBreakdownElement());
-		activityEClass.getESuperTypes().add(this.getVariabilityElement());
-		activityEClass.getESuperTypes().add(this.getWorkDefinition());
-		workBreakdownElementEClass.getESuperTypes().add(
-				this.getBreakdownElement());
-		breakdownElementEClass.getESuperTypes().add(this.getProcessElement());
-		milestoneEClass.getESuperTypes().add(this.getWorkBreakdownElement());
-		iterationEClass.getESuperTypes().add(this.getActivity());
-		phaseEClass.getESuperTypes().add(this.getActivity());
-		teamProfileEClass.getESuperTypes().add(this.getBreakdownElement());
-		roleDescriptorEClass.getESuperTypes().add(this.getDescriptor());
-		workOrderEClass.getESuperTypes().add(this.getProcessElement());
-		processElementEClass.getESuperTypes().add(this.getDescribableElement());
-		planningDataEClass.getESuperTypes().add(this.getProcessElement());
-		descriptorEClass.getESuperTypes().add(this.getBreakdownElement());
-		workProductDescriptorEClass.getESuperTypes().add(this.getDescriptor());
-		taskDescriptorEClass.getESuperTypes().add(
-				this.getWorkBreakdownElement());
-		taskDescriptorEClass.getESuperTypes().add(this.getDescriptor());
-		compositeRoleEClass.getESuperTypes().add(this.getRoleDescriptor());
-		breakdownElementDescriptionEClass.getESuperTypes().add(
-				this.getContentDescription());
-		activityDescriptionEClass.getESuperTypes().add(
-				this.getBreakdownElementDescription());
-		deliveryProcessDescriptionEClass.getESuperTypes().add(
-				this.getProcessDescription());
-		processDescriptionEClass.getESuperTypes().add(
-				this.getActivityDescription());
-		descriptorDescriptionEClass.getESuperTypes().add(
-				this.getBreakdownElementDescription());
-		conceptEClass.getESuperTypes().add(this.getGuidance());
-		checklistEClass.getESuperTypes().add(this.getGuidance());
-		exampleEClass.getESuperTypes().add(this.getGuidance());
-		guidelineEClass.getESuperTypes().add(this.getGuidance());
-		reportEClass.getESuperTypes().add(this.getGuidance());
-		templateEClass.getESuperTypes().add(this.getGuidance());
-		supportingMaterialEClass.getESuperTypes().add(this.getGuidance());
-		toolMentorEClass.getESuperTypes().add(this.getGuidance());
-		whitepaperEClass.getESuperTypes().add(this.getConcept());
-		termDefinitionEClass.getESuperTypes().add(this.getGuidance());
-		practiceEClass.getESuperTypes().add(this.getGuidance());
-		estimationConsiderationsEClass.getESuperTypes().add(this.getGuidance());
-		reusableAssetEClass.getESuperTypes().add(this.getGuidance());
-		stateEClass.getESuperTypes().add(this.getVertex());
-		stateMachineEClass.getESuperTypes().add(this.getWorkDefinition());
-		pseudoStateEClass.getESuperTypes().add(this.getVertex());
-		disciplineEClass.getESuperTypes().add(this.getContentCategory());
-		contentCategoryEClass.getESuperTypes().add(this.getContentElement());
-		roleSetEClass.getESuperTypes().add(this.getContentCategory());
-		domainEClass.getESuperTypes().add(this.getContentCategory());
-		workProductTypeEClass.getESuperTypes().add(this.getContentCategory());
-		disciplineGroupingEClass.getESuperTypes()
-				.add(this.getContentCategory());
-		toolEClass.getESuperTypes().add(this.getContentCategory());
-		roleSetGroupingEClass.getESuperTypes().add(this.getContentCategory());
-		customCategoryEClass.getESuperTypes().add(this.getContentCategory());
-		deliveryProcessEClass.getESuperTypes().add(this.getProcess());
-		processEClass.getESuperTypes().add(this.getActivity());
-		capabilityPatternEClass.getESuperTypes().add(this.getProcess());
-		processPlanningTemplateEClass.getESuperTypes().add(this.getProcess());
-		roadmapEClass.getESuperTypes().add(this.getGuidance());
-		processComponentEClass.getESuperTypes().add(this.getProcessPackage());
-		processComponentEClass.getESuperTypes().add(this.getMethodUnit());
-		processPackageEClass.getESuperTypes().add(this.getMethodPackage());
-		processComponentInterfaceEClass.getESuperTypes().add(
-				this.getBreakdownElement());
-		processComponentDescriptorEClass.getESuperTypes().add(
-				this.getDescriptor());
-		methodPluginEClass.getESuperTypes().add(this.getMethodUnit());
-		methodPluginEClass.getESuperTypes().add(this.getPackage());
-		variabilityElementEClass.getESuperTypes().add(this.getMethodElement());
-		methodUnitEClass.getESuperTypes().add(this.getMethodElement());
-		methodConfigurationEClass.getESuperTypes().add(this.getMethodUnit());
-		processFamilyEClass.getESuperTypes().add(this.getMethodConfiguration());
-		methodLibraryEClass.getESuperTypes().add(this.getMethodUnit());
-		methodLibraryEClass.getESuperTypes().add(this.getPackage());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(
-				classifierEClass,
-				Classifier.class,
-				"Classifier", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(typeEClass, Type.class,
-				"Type", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				elementEClass,
-				Element.class,
-				"Element", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				namedElementEClass,
-				NamedElement.class,
-				"NamedElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getNamedElement_Name(),
-				this.getString(),
-				"name", "", 0, 1, NamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				packageableElementEClass,
-				PackageableElement.class,
-				"PackageableElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				packageEClass,
-				org.eclipse.epf.uma.Package.class,
-				"Package", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				namespaceEClass,
-				Namespace.class,
-				"Namespace", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				methodElementEClass,
-				MethodElement.class,
-				"MethodElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getMethodElement_Guid(),
-				this.getString(),
-				"guid", "", 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getMethodElement_BriefDescription(),
-				this.getString(),
-				"briefDescription", "", 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getMethodElement_OwnedRules(),
-				this.getConstraint(),
-				null,
-				"ownedRules", null, 0, -1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodElement_MethodElementProperty(),
-				this.getMethodElementProperty(),
-				null,
-				"methodElementProperty", null, 0, -1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getMethodElement_Suppressed(),
-				ecorePackage.getEBooleanObject(),
-				"suppressed", "false", 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getMethodElement_OrderingGuide(),
-				this.getString(),
-				"orderingGuide", "", 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				constraintEClass,
-				Constraint.class,
-				"Constraint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getConstraint_Body(),
-				this.getString(),
-				"body", "", 0, 1, Constraint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				methodElementPropertyEClass,
-				MethodElementProperty.class,
-				"MethodElementProperty", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getMethodElementProperty_Value(),
-				this.getString(),
-				"value", "", 0, 1, MethodElementProperty.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				contentElementEClass,
-				ContentElement.class,
-				"ContentElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getContentElement_SupportingMaterials(),
-				this.getSupportingMaterial(),
-				null,
-				"supportingMaterials", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getContentElement_ConceptsAndPapers(),
-				this.getConcept(),
-				null,
-				"conceptsAndPapers", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getContentElement_Checklists(),
-				this.getChecklist(),
-				null,
-				"checklists", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getContentElement_Guidelines(),
-				this.getGuideline(),
-				null,
-				"guidelines", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getContentElement_Examples(),
-				this.getExample(),
-				null,
-				"examples", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getContentElement_Assets(),
-				this.getReusableAsset(),
-				null,
-				"assets", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getContentElement_TermDefinition(),
-				this.getTermDefinition(),
-				null,
-				"termDefinition", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				describableElementEClass,
-				DescribableElement.class,
-				"DescribableElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDescribableElement_PresentationName(),
-				this.getString(),
-				"presentationName", "", 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getDescribableElement_Presentation(),
-				this.getContentDescription(),
-				null,
-				"presentation", null, 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getDescribableElement_Shapeicon(),
-				this.getUri(),
-				"shapeicon", null, 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getDescribableElement_Nodeicon(),
-				this.getUri(),
-				"nodeicon", null, 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				contentDescriptionEClass,
-				ContentDescription.class,
-				"ContentDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getContentDescription_MainDescription(),
-				this.getString(),
-				"mainDescription", "", 0, 1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getContentDescription_Sections(),
-				this.getSection(),
-				null,
-				"sections", null, 0, -1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getContentDescription_ExternalId(),
-				this.getString(),
-				"externalId", "", 0, 1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getContentDescription_KeyConsiderations(),
-				this.getString(),
-				"keyConsiderations", "", 0, 1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				sectionEClass,
-				Section.class,
-				"Section", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getSection_SectionName(),
-				this.getString(),
-				"sectionName", "", 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getSection_SectionDescription(),
-				this.getString(),
-				"sectionDescription", "", 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getSection_SubSections(),
-				this.getSection(),
-				null,
-				"subSections", null, 0, -1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getSection_Predecessor(),
-				this.getSection(),
-				null,
-				"predecessor", null, 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				roleEClass,
-				Role.class,
-				"Role", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getRole_Modifies(),
-				this.getWorkProduct(),
-				null,
-				"modifies", null, 0, -1, Role.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getRole_ResponsibleFor(),
-				this.getWorkProduct(),
-				null,
-				"responsibleFor", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				workProductEClass,
-				WorkProduct.class,
-				"WorkProduct", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getWorkProduct_Reports(),
-				this.getReport(),
-				null,
-				"reports", null, 0, -1, WorkProduct.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getWorkProduct_Templates(),
-				this.getTemplate(),
-				null,
-				"templates", null, 0, -1, WorkProduct.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getWorkProduct_ToolMentors(),
-				this.getToolMentor(),
-				null,
-				"toolMentors", null, 0, -1, WorkProduct.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getWorkProduct_EstimationConsiderations(),
-				this.getEstimationConsiderations(),
-				null,
-				"estimationConsiderations", null, 0, -1, WorkProduct.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				taskEClass,
-				Task.class,
-				"Task", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getTask_PerformedBy(),
-				this.getRole(),
-				null,
-				"performedBy", null, 0, 1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTask_MandatoryInput(),
-				this.getWorkProduct(),
-				null,
-				"mandatoryInput", null, 0, -1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTask_Output(),
-				this.getWorkProduct(),
-				null,
-				"output", null, 0, -1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTask_AdditionallyPerformedBy(),
-				this.getRole(),
-				null,
-				"additionallyPerformedBy", null, 0, -1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTask_OptionalInput(),
-				this.getWorkProduct(),
-				null,
-				"optionalInput", null, 0, -1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTask_Steps(),
-				this.getStep(),
-				null,
-				"steps", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTask_ToolMentors(),
-				this.getToolMentor(),
-				null,
-				"toolMentors", null, 0, -1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTask_EstimationConsiderations(),
-				this.getEstimationConsiderations(),
-				null,
-				"estimationConsiderations", null, 0, -1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				workDefinitionEClass,
-				WorkDefinition.class,
-				"WorkDefinition", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getWorkDefinition_Precondition(),
-				this.getConstraint(),
-				null,
-				"precondition", null, 0, 1, WorkDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getWorkDefinition_Postcondition(),
-				this.getConstraint(),
-				null,
-				"postcondition", null, 0, 1, WorkDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				stepEClass,
-				Step.class,
-				"Step", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				guidanceEClass,
-				Guidance.class,
-				"Guidance", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				artifactEClass,
-				Artifact.class,
-				"Artifact", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getArtifact_ContainerArtifact(),
-				this.getArtifact(),
-				this.getArtifact_ContainedArtifacts(),
-				"containerArtifact", null, 0, 1, Artifact.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getArtifact_ContainedArtifacts(),
-				this.getArtifact(),
-				this.getArtifact_ContainerArtifact(),
-				"containedArtifacts", null, 0, -1, Artifact.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				deliverableEClass,
-				Deliverable.class,
-				"Deliverable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getDeliverable_DeliveredWorkProducts(),
-				this.getWorkProduct(),
-				null,
-				"deliveredWorkProducts", null, 0, -1, Deliverable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				outcomeEClass,
-				Outcome.class,
-				"Outcome", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				methodPackageEClass,
-				MethodPackage.class,
-				"MethodPackage", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getMethodPackage_Global(),
-				ecorePackage.getEBooleanObject(),
-				"global", "false", 0, 1, MethodPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getMethodPackage_ReusedPackages(),
-				this.getMethodPackage(),
-				null,
-				"reusedPackages", null, 0, -1, MethodPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodPackage_ChildPackages(),
-				this.getMethodPackage(),
-				null,
-				"childPackages", null, 0, -1, MethodPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				contentPackageEClass,
-				ContentPackage.class,
-				"ContentPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getContentPackage_ContentElements(),
-				this.getContentElement(),
-				null,
-				"contentElements", null, 0, -1, ContentPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				artifactDescriptionEClass,
-				ArtifactDescription.class,
-				"ArtifactDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getArtifactDescription_BriefOutline(),
-				this.getString(),
-				"briefOutline", "", 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getArtifactDescription_RepresentationOptions(),
-				this.getString(),
-				"representationOptions", "", 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getArtifactDescription_Representation(),
-				this.getString(),
-				"representation", "", 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getArtifactDescription_Notation(),
-				this.getString(),
-				"notation", "", 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				workProductDescriptionEClass,
-				WorkProductDescription.class,
-				"WorkProductDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getWorkProductDescription_Purpose(),
-				this.getString(),
-				"purpose", "", 0, 1, WorkProductDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getWorkProductDescription_ImpactOfNotHaving(),
-				this.getString(),
-				"impactOfNotHaving", "", 0, 1, WorkProductDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getWorkProductDescription_ReasonsForNotNeeding(),
-				this.getString(),
-				"reasonsForNotNeeding", "", 0, 1, WorkProductDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				deliverableDescriptionEClass,
-				DeliverableDescription.class,
-				"DeliverableDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDeliverableDescription_ExternalDescription(),
-				this.getString(),
-				"externalDescription", "", 0, 1, DeliverableDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getDeliverableDescription_PackagingGuidance(),
-				this.getString(),
-				"packagingGuidance", "", 0, 1, DeliverableDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				roleDescriptionEClass,
-				RoleDescription.class,
-				"RoleDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getRoleDescription_Skills(),
-				this.getString(),
-				"skills", "", 0, 1, RoleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getRoleDescription_AssignmentApproaches(),
-				this.getString(),
-				"assignmentApproaches", "", 0, 1, RoleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getRoleDescription_Synonyms(),
-				this.getString(),
-				"synonyms", "", 0, 1, RoleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				taskDescriptionEClass,
-				TaskDescription.class,
-				"TaskDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getTaskDescription_Purpose(),
-				this.getString(),
-				"purpose", "", 0, 1, TaskDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getTaskDescription_Alternatives(),
-				this.getString(),
-				"alternatives", "", 0, 1, TaskDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				guidanceDescriptionEClass,
-				GuidanceDescription.class,
-				"GuidanceDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getGuidanceDescription_Attachments(),
-				this.getString(),
-				"attachments", "", 0, 1, GuidanceDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				practiceDescriptionEClass,
-				PracticeDescription.class,
-				"PracticeDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getPracticeDescription_AdditionalInfo(),
-				this.getString(),
-				"additionalInfo", "", 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getPracticeDescription_Problem(),
-				this.getString(),
-				"problem", "", 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getPracticeDescription_Background(),
-				this.getString(),
-				"background", "", 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getPracticeDescription_Goals(),
-				this.getString(),
-				"goals", "", 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getPracticeDescription_Application(),
-				this.getString(),
-				"application", "", 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getPracticeDescription_LevelsOfAdoption(),
-				this.getString(),
-				"levelsOfAdoption", "", 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				pointEClass,
-				Point.class,
-				"Point", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getPoint_X(),
-				ecorePackage.getEDoubleObject(),
-				"x", null, 0, 1, Point.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getPoint_Y(),
-				ecorePackage.getEDoubleObject(),
-				"y", null, 0, 1, Point.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				graphElementEClass,
-				GraphElement.class,
-				"GraphElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getGraphElement_Position(),
-				this.getPoint(),
-				null,
-				"position", null, 0, 1, GraphElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getGraphElement_Contained(),
-				this.getDiagramElement(),
-				this.getDiagramElement_Container(),
-				"contained", null, 0, -1, GraphElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getGraphElement_Link(),
-				this.getDiagramLink(),
-				this.getDiagramLink_GraphElement(),
-				"link", null, 0, -1, GraphElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getGraphElement_Anchorage(),
-				this.getGraphConnector(),
-				this.getGraphConnector_GraphElement(),
-				"anchorage", null, 0, -1, GraphElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getGraphElement_SemanticModel(),
-				this.getSemanticModelBridge(),
-				this.getSemanticModelBridge_GraphElement(),
-				"semanticModel", null, 1, 1, GraphElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				diagramElementEClass,
-				DiagramElement.class,
-				"DiagramElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDiagramElement_IsVisible(),
-				ecorePackage.getEBooleanObject(),
-				"isVisible", "true", 0, 1, DiagramElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getDiagramElement_Container(),
-				this.getGraphElement(),
-				this.getGraphElement_Contained(),
-				"container", null, 0, 1, DiagramElement.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagramElement_Reference(),
-				this.getReference(),
-				this.getReference_Referenced(),
-				"reference", null, 0, -1, DiagramElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagramElement_Property(),
-				this.getProperty(),
-				null,
-				"property", null, 0, -1, DiagramElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				diagramLinkEClass,
-				DiagramLink.class,
-				"DiagramLink", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDiagramLink_Zoom(),
-				ecorePackage.getEDoubleObject(),
-				"zoom", null, 0, 1, DiagramLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagramLink_Viewport(),
-				this.getPoint(),
-				null,
-				"viewport", null, 0, 1, DiagramLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagramLink_GraphElement(),
-				this.getGraphElement(),
-				this.getGraphElement_Link(),
-				"graphElement", null, 1, 1, DiagramLink.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagramLink_Diagram(),
-				this.getDiagram(),
-				this.getDiagram_DiagramLink(),
-				"diagram", null, 1, 1, DiagramLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				graphConnectorEClass,
-				GraphConnector.class,
-				"GraphConnector", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getGraphConnector_GraphElement(),
-				this.getGraphElement(),
-				this.getGraphElement_Anchorage(),
-				"graphElement", null, 1, 1, GraphConnector.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getGraphConnector_GraphEdge(),
-				this.getGraphEdge(),
-				this.getGraphEdge_Anchor(),
-				"graphEdge", null, 0, -1, GraphConnector.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				semanticModelBridgeEClass,
-				SemanticModelBridge.class,
-				"SemanticModelBridge", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getSemanticModelBridge_Presentation(),
-				this.getString(),
-				"presentation", "", 0, 1, SemanticModelBridge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getSemanticModelBridge_GraphElement(),
-				this.getGraphElement(),
-				this.getGraphElement_SemanticModel(),
-				"graphElement", null, 0, 1, SemanticModelBridge.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getSemanticModelBridge_Diagram(),
-				this.getDiagram(),
-				this.getDiagram_Namespace(),
-				"diagram", null, 0, 1, SemanticModelBridge.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				dimensionEClass,
-				Dimension.class,
-				"Dimension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDimension_Width(),
-				ecorePackage.getEDoubleObject(),
-				"width", null, 0, 1, Dimension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getDimension_Height(),
-				ecorePackage.getEDoubleObject(),
-				"height", null, 0, 1, Dimension.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				referenceEClass,
-				Reference.class,
-				"Reference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getReference_IsIndividualRepresentation(),
-				ecorePackage.getEBooleanObject(),
-				"isIndividualRepresentation", null, 0, 1, Reference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getReference_Referenced(),
-				this.getDiagramElement(),
-				this.getDiagramElement_Reference(),
-				"referenced", null, 1, 1, Reference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				propertyEClass,
-				Property.class,
-				"Property", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getProperty_Key(),
-				this.getString(),
-				"key", "", 0, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getProperty_Value(),
-				this.getString(),
-				"value", "", 0, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				graphEdgeEClass,
-				GraphEdge.class,
-				"GraphEdge", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getGraphEdge_Anchor(),
-				this.getGraphConnector(),
-				this.getGraphConnector_GraphEdge(),
-				"anchor", null, 2, 2, GraphEdge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getGraphEdge_Waypoints(),
-				this.getPoint(),
-				null,
-				"waypoints", null, 2, -1, GraphEdge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				diagramEClass,
-				Diagram.class,
-				"Diagram", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDiagram_Zoom(),
-				ecorePackage.getEDoubleObject(),
-				"zoom", null, 0, 1, Diagram.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagram_Viewpoint(),
-				this.getPoint(),
-				null,
-				"viewpoint", null, 0, 1, Diagram.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagram_DiagramLink(),
-				this.getDiagramLink(),
-				this.getDiagramLink_Diagram(),
-				"diagramLink", null, 0, -1, Diagram.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiagram_Namespace(),
-				this.getSemanticModelBridge(),
-				this.getSemanticModelBridge_Diagram(),
-				"namespace", null, 1, 1, Diagram.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				graphNodeEClass,
-				GraphNode.class,
-				"GraphNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getGraphNode_Size(),
-				this.getDimension(),
-				null,
-				"size", null, 0, 1, GraphNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				simpleSemanticModelElementEClass,
-				SimpleSemanticModelElement.class,
-				"SimpleSemanticModelElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getSimpleSemanticModelElement_TypeInfo(),
-				this.getString(),
-				"typeInfo", "", 0, 1, SimpleSemanticModelElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				umaSemanticModelBridgeEClass,
-				UMASemanticModelBridge.class,
-				"UMASemanticModelBridge", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getUMASemanticModelBridge_Element(),
-				this.getMethodElement(),
-				null,
-				"element", null, 1, 1, UMASemanticModelBridge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				coreSemanticModelBridgeEClass,
-				CoreSemanticModelBridge.class,
-				"CoreSemanticModelBridge", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getCoreSemanticModelBridge_Element(),
-				this.getElement(),
-				null,
-				"element", null, 1, 1, CoreSemanticModelBridge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				leafElementEClass,
-				LeafElement.class,
-				"LeafElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				textElementEClass,
-				TextElement.class,
-				"TextElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getTextElement_Text(),
-				this.getString(),
-				"text", "", 0, 1, TextElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				imageEClass,
-				Image.class,
-				"Image", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getImage_Uri(),
-				this.getUri(),
-				"uri", null, 0, 1, Image.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getImage_MimeType(),
-				this.getString(),
-				"mimeType", "", 0, 1, Image.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				graphicPrimitiveEClass,
-				GraphicPrimitive.class,
-				"GraphicPrimitive", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				polylineEClass,
-				Polyline.class,
-				"Polyline", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getPolyline_Closed(),
-				ecorePackage.getEBooleanObject(),
-				"closed", "true", 0, 1, Polyline.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getPolyline_Waypoints(),
-				this.getPoint(),
-				null,
-				"waypoints", null, 2, -1, Polyline.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				ellipseEClass,
-				Ellipse.class,
-				"Ellipse", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getEllipse_RadiusX(),
-				ecorePackage.getEDoubleObject(),
-				"radiusX", null, 0, 1, Ellipse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getEllipse_RadiusY(),
-				ecorePackage.getEDoubleObject(),
-				"radiusY", null, 0, 1, Ellipse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getEllipse_Rotation(),
-				ecorePackage.getEDoubleObject(),
-				"rotation", null, 0, 1, Ellipse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getEllipse_StartAngle(),
-				ecorePackage.getEDoubleObject(),
-				"startAngle", null, 0, 1, Ellipse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getEllipse_EndAngle(),
-				ecorePackage.getEDoubleObject(),
-				"endAngle", null, 0, 1, Ellipse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getEllipse_Center(),
-				this.getPoint(),
-				null,
-				"center", null, 0, 1, Ellipse.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				activityEClass,
-				Activity.class,
-				"Activity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getActivity_BreakdownElements(),
-				this.getBreakdownElement(),
-				this.getBreakdownElement_SuperActivities(),
-				"breakdownElements", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getActivity_Roadmaps(),
-				this.getRoadmap(),
-				null,
-				"roadmaps", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getActivity_SupportingMaterials(),
-				this.getSupportingMaterial(),
-				null,
-				"supportingMaterials", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getActivity_Checklists(),
-				this.getChecklist(),
-				null,
-				"checklists", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getActivity_Concepts(),
-				this.getConcept(),
-				null,
-				"concepts", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getActivity_Examples(),
-				this.getExample(),
-				null,
-				"examples", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getActivity_Guidelines(),
-				this.getGuideline(),
-				null,
-				"guidelines", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getActivity_ReusableAssets(),
-				this.getReusableAsset(),
-				null,
-				"reusableAssets", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getActivity_IsEnactable(),
-				ecorePackage.getEBooleanObject(),
-				"isEnactable", "false", 0, 1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				workBreakdownElementEClass,
-				WorkBreakdownElement.class,
-				"WorkBreakdownElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getWorkBreakdownElement_IsRepeatable(),
-				ecorePackage.getEBooleanObject(),
-				"isRepeatable", "false", 0, 1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getWorkBreakdownElement_IsOngoing(),
-				ecorePackage.getEBooleanObject(),
-				"isOngoing", "false", 0, 1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getWorkBreakdownElement_IsEventDriven(),
-				ecorePackage.getEBooleanObject(),
-				"isEventDriven", "false", 0, 1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getWorkBreakdownElement_LinkToPredecessor(),
-				this.getWorkOrder(),
-				null,
-				"linkToPredecessor", null, 0, -1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				breakdownElementEClass,
-				BreakdownElement.class,
-				"BreakdownElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getBreakdownElement_Prefix(),
-				this.getString(),
-				"prefix", "", 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getBreakdownElement_IsPlanned(),
-				ecorePackage.getEBooleanObject(),
-				"isPlanned", "true", 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getBreakdownElement_HasMultipleOccurrences(),
-				ecorePackage.getEBooleanObject(),
-				"hasMultipleOccurrences", "false", 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getBreakdownElement_IsOptional(),
-				ecorePackage.getEBooleanObject(),
-				"isOptional", "false", 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getBreakdownElement_PresentedAfter(),
-				this.getBreakdownElement(),
-				null,
-				"presentedAfter", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getBreakdownElement_PresentedBefore(),
-				this.getBreakdownElement(),
-				null,
-				"presentedBefore", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getBreakdownElement_PlanningData(),
-				this.getPlanningData(),
-				null,
-				"planningData", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getBreakdownElement_SuperActivities(),
-				this.getActivity(),
-				this.getActivity_BreakdownElements(),
-				"superActivities", null, 1, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				milestoneEClass,
-				Milestone.class,
-				"Milestone", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				iterationEClass,
-				Iteration.class,
-				"Iteration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				phaseEClass,
-				Phase.class,
-				"Phase", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				teamProfileEClass,
-				TeamProfile.class,
-				"TeamProfile", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getTeamProfile_TeamRoles(),
-				this.getRoleDescriptor(),
-				null,
-				"teamRoles", null, 0, -1, TeamProfile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTeamProfile_SuperTeam(),
-				this.getTeamProfile(),
-				this.getTeamProfile_SubTeam(),
-				"superTeam", null, 1, 1, TeamProfile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTeamProfile_SubTeam(),
-				this.getTeamProfile(),
-				this.getTeamProfile_SuperTeam(),
-				"subTeam", null, 0, -1, TeamProfile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				roleDescriptorEClass,
-				RoleDescriptor.class,
-				"RoleDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getRoleDescriptor_Role(),
-				this.getRole(),
-				null,
-				"Role", null, 0, 1, RoleDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getRoleDescriptor_Modifies(),
-				this.getWorkProductDescriptor(),
-				null,
-				"modifies", null, 0, -1, RoleDescriptor.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getRoleDescriptor_ResponsibleFor(),
-				this.getWorkProductDescriptor(),
-				null,
-				"responsibleFor", null, 0, -1, RoleDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				workOrderEClass,
-				WorkOrder.class,
-				"WorkOrder", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getWorkOrder_LinkType(),
-				this.getWorkOrderType(),
-				"linkType", "finishToStart", 0, 1, WorkOrder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getWorkOrder_Pred(),
-				this.getWorkBreakdownElement(),
-				null,
-				"pred", null, 1, 1, WorkOrder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				processElementEClass,
-				ProcessElement.class,
-				"ProcessElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				planningDataEClass,
-				PlanningData.class,
-				"PlanningData", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getPlanningData_StartDate(),
-				this.getDate(),
-				"startDate", null, 0, 1, PlanningData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getPlanningData_FinishDate(),
-				this.getDate(),
-				"finishDate", null, 0, 1, PlanningData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getPlanningData_Rank(),
-				this.getInteger(),
-				"rank", null, 0, 1, PlanningData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				descriptorEClass,
-				org.eclipse.epf.uma.Descriptor.class,
-				"Descriptor", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDescriptor_IsSynchronizedWithSource(),
-				ecorePackage.getEBooleanObject(),
-				"isSynchronizedWithSource", "true", 0, 1, org.eclipse.epf.uma.Descriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				workProductDescriptorEClass,
-				WorkProductDescriptor.class,
-				"WorkProductDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getWorkProductDescriptor_ActivityEntryState(),
-				this.getString(),
-				"activityEntryState", "", 0, 1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getWorkProductDescriptor_ActivityExitState(),
-				this.getString(),
-				"activityExitState", "", 0, 1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getWorkProductDescriptor_WorkProduct(),
-				this.getWorkProduct(),
-				null,
-				"WorkProduct", null, 0, 1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getWorkProductDescriptor_ImpactedBy(),
-				this.getWorkProductDescriptor(),
-				this.getWorkProductDescriptor_Impacts(),
-				"impactedBy", null, 0, -1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getWorkProductDescriptor_Impacts(),
-				this.getWorkProductDescriptor(),
-				this.getWorkProductDescriptor_ImpactedBy(),
-				"impacts", null, 0, -1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getWorkProductDescriptor_DeliverableParts(),
-				this.getWorkProductDescriptor(),
-				null,
-				"deliverableParts", null, 0, -1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				taskDescriptorEClass,
-				TaskDescriptor.class,
-				"TaskDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_Task(),
-				this.getTask(),
-				null,
-				"Task", null, 0, 1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_AdditionallyPerformedBy(),
-				this.getRoleDescriptor(),
-				null,
-				"additionallyPerformedBy", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_AssistedBy(),
-				this.getRoleDescriptor(),
-				null,
-				"assistedBy", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_ExternalInput(),
-				this.getWorkProductDescriptor(),
-				null,
-				"externalInput", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_MandatoryInput(),
-				this.getWorkProductDescriptor(),
-				null,
-				"mandatoryInput", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_OptionalInput(),
-				this.getWorkProductDescriptor(),
-				null,
-				"optionalInput", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_Output(),
-				this.getWorkProductDescriptor(),
-				null,
-				"output", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_PerformedPrimarilyBy(),
-				this.getRoleDescriptor(),
-				null,
-				"performedPrimarilyBy", null, 0, 1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTaskDescriptor_SelectedSteps(),
-				this.getSection(),
-				null,
-				"selectedSteps", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				compositeRoleEClass,
-				CompositeRole.class,
-				"CompositeRole", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getCompositeRole_AggregatedRoles(),
-				this.getRole(),
-				null,
-				"aggregatedRoles", null, 0, -1, CompositeRole.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				breakdownElementDescriptionEClass,
-				BreakdownElementDescription.class,
-				"BreakdownElementDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getBreakdownElementDescription_UsageGuidance(),
-				this.getString(),
-				"usageGuidance", "", 0, 1, BreakdownElementDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				activityDescriptionEClass,
-				ActivityDescription.class,
-				"ActivityDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getActivityDescription_Purpose(),
-				this.getString(),
-				"purpose", "", 0, 1, ActivityDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getActivityDescription_Alternatives(),
-				this.getString(),
-				"alternatives", "", 0, 1, ActivityDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getActivityDescription_HowtoStaff(),
-				this.getString(),
-				"howtoStaff", "", 0, 1, ActivityDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				deliveryProcessDescriptionEClass,
-				DeliveryProcessDescription.class,
-				"DeliveryProcessDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDeliveryProcessDescription_Scale(),
-				this.getString(),
-				"scale", "", 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getDeliveryProcessDescription_ProjectCharacteristics(),
-				this.getString(),
-				"projectCharacteristics", "", 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getDeliveryProcessDescription_RiskLevel(),
-				this.getString(),
-				"riskLevel", "", 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getDeliveryProcessDescription_EstimatingTechnique(),
-				this.getString(),
-				"estimatingTechnique", "", 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getDeliveryProcessDescription_ProjectMemberExpertise(),
-				this.getString(),
-				"projectMemberExpertise", "", 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getDeliveryProcessDescription_TypeOfContract(),
-				this.getString(),
-				"typeOfContract", "", 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				processDescriptionEClass,
-				ProcessDescription.class,
-				"ProcessDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getProcessDescription_Scope(),
-				this.getString(),
-				"scope", "", 0, 1, ProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getProcessDescription_UsageNotes(),
-				this.getString(),
-				"usageNotes", "", 0, 1, ProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				descriptorDescriptionEClass,
-				DescriptorDescription.class,
-				"DescriptorDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getDescriptorDescription_RefinedDescription(),
-				this.getString(),
-				"refinedDescription", "", 0, 1, DescriptorDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(
-				conceptEClass,
-				Concept.class,
-				"Concept", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				checklistEClass,
-				Checklist.class,
-				"Checklist", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				exampleEClass,
-				Example.class,
-				"Example", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				guidelineEClass,
-				Guideline.class,
-				"Guideline", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				reportEClass,
-				Report.class,
-				"Report", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				templateEClass,
-				Template.class,
-				"Template", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				supportingMaterialEClass,
-				SupportingMaterial.class,
-				"SupportingMaterial", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				toolMentorEClass,
-				ToolMentor.class,
-				"ToolMentor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				whitepaperEClass,
-				Whitepaper.class,
-				"Whitepaper", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				termDefinitionEClass,
-				TermDefinition.class,
-				"TermDefinition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				practiceEClass,
-				Practice.class,
-				"Practice", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getPractice_SubPractices(),
-				this.getPractice(),
-				null,
-				"subPractices", null, 0, -1, Practice.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getPractice_ContentReferences(),
-				this.getContentElement(),
-				null,
-				"contentReferences", null, 0, -1, Practice.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getPractice_ActivityReferences(),
-				this.getActivity(),
-				null,
-				"activityReferences", null, 0, -1, Practice.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				estimationConsiderationsEClass,
-				EstimationConsiderations.class,
-				"EstimationConsiderations", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				reusableAssetEClass,
-				ReusableAsset.class,
-				"ReusableAsset", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				stateEClass,
-				State.class,
-				"State", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getState_WorkProduct(),
-				this.getWorkProduct(),
-				null,
-				"WorkProduct", null, 1, -1, State.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getState_Region(),
-				this.getRegion(),
-				this.getRegion_State(),
-				"Region", null, 0, -1, State.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getState_Submachine(),
-				this.getStateMachine(),
-				null,
-				"submachine", null, 0, 1, State.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				vertexEClass,
-				Vertex.class,
-				"Vertex", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getVertex_Container(),
-				this.getRegion(),
-				this.getRegion_Vertex(),
-				"container", null, 0, 1, Vertex.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getVertex_Outgoing(),
-				this.getTransition(),
-				this.getTransition_Source(),
-				"outgoing", null, 0, -1, Vertex.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getVertex_Incoming(),
-				this.getTransition(),
-				this.getTransition_Target(),
-				"incoming", null, 0, -1, Vertex.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				regionEClass,
-				Region.class,
-				"Region", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getRegion_Vertex(),
-				this.getVertex(),
-				this.getVertex_Container(),
-				"Vertex", null, 0, -1, Region.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getRegion_Transition(),
-				this.getTransition(),
-				this.getTransition_Container(),
-				"Transition", null, 0, -1, Region.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getRegion_State(),
-				this.getState(),
-				this.getState_Region(),
-				"State", null, 0, 1, Region.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getRegion_StateMachine(),
-				this.getStateMachine(),
-				this.getStateMachine_Region(),
-				"StateMachine", null, 0, 1, Region.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				stateMachineEClass,
-				StateMachine.class,
-				"StateMachine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getStateMachine_Region(),
-				this.getRegion(),
-				this.getRegion_StateMachine(),
-				"Region", null, 1, -1, StateMachine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				transitionEClass,
-				Transition.class,
-				"Transition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getTransition_WorkDefinition(),
-				this.getWorkDefinition(),
-				null,
-				"WorkDefinition", null, 1, -1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTransition_Container(),
-				this.getRegion(),
-				this.getRegion_Transition(),
-				"container", null, 1, 1, Transition.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTransition_Source(),
-				this.getVertex(),
-				this.getVertex_Outgoing(),
-				"source", null, 1, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getTransition_Target(),
-				this.getVertex(),
-				this.getVertex_Incoming(),
-				"target", null, 1, 1, Transition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				pseudoStateEClass,
-				PseudoState.class,
-				"PseudoState", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				disciplineEClass,
-				Discipline.class,
-				"Discipline", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getDiscipline_Tasks(),
-				this.getTask(),
-				null,
-				"tasks", null, 0, -1, Discipline.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiscipline_Subdiscipline(),
-				this.getDiscipline(),
-				null,
-				"subdiscipline", null, 0, -1, Discipline.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDiscipline_ReferenceWorkflows(),
-				this.getActivity(),
-				null,
-				"referenceWorkflows", null, 0, -1, Discipline.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				contentCategoryEClass,
-				ContentCategory.class,
-				"ContentCategory", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				roleSetEClass,
-				RoleSet.class,
-				"RoleSet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getRoleSet_Roles(),
-				this.getRole(),
-				null,
-				"roles", null, 0, -1, RoleSet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				domainEClass,
-				Domain.class,
-				"Domain", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getDomain_WorkProducts(),
-				this.getWorkProduct(),
-				null,
-				"workProducts", null, 0, -1, Domain.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDomain_Subdomains(),
-				this.getDomain(),
-				null,
-				"subdomains", null, 0, -1, Domain.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				workProductTypeEClass,
-				WorkProductType.class,
-				"WorkProductType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getWorkProductType_WorkProducts(),
-				this.getWorkProduct(),
-				null,
-				"workProducts", null, 0, -1, WorkProductType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				disciplineGroupingEClass,
-				DisciplineGrouping.class,
-				"DisciplineGrouping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getDisciplineGrouping_Disciplines(),
-				this.getDiscipline(),
-				null,
-				"disciplines", null, 0, -1, DisciplineGrouping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				toolEClass,
-				Tool.class,
-				"Tool", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getTool_ToolMentors(),
-				this.getToolMentor(),
-				null,
-				"toolMentors", null, 0, -1, Tool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				roleSetGroupingEClass,
-				RoleSetGrouping.class,
-				"RoleSetGrouping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getRoleSetGrouping_RoleSets(),
-				this.getRoleSet(),
-				null,
-				"roleSets", null, 0, -1, RoleSetGrouping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				customCategoryEClass,
-				CustomCategory.class,
-				"CustomCategory", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getCustomCategory_CategorizedElements(),
-				this.getDescribableElement(),
-				null,
-				"categorizedElements", null, 0, -1, CustomCategory.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getCustomCategory_SubCategories(),
-				this.getContentCategory(),
-				null,
-				"subCategories", null, 0, -1, CustomCategory.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				deliveryProcessEClass,
-				DeliveryProcess.class,
-				"DeliveryProcess", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getDeliveryProcess_EducationMaterials(),
-				this.getSupportingMaterial(),
-				null,
-				"educationMaterials", null, 0, -1, DeliveryProcess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getDeliveryProcess_CommunicationsMaterials(),
-				this.getSupportingMaterial(),
-				null,
-				"communicationsMaterials", null, 0, -1, DeliveryProcess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				processEClass,
-				org.eclipse.epf.uma.Process.class,
-				"Process", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getProcess_IncludesPatterns(),
-				this.getCapabilityPattern(),
-				null,
-				"includesPatterns", null, 0, -1, org.eclipse.epf.uma.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getProcess_DefaultContext(),
-				this.getMethodConfiguration(),
-				null,
-				"defaultContext", null, 1, 1, org.eclipse.epf.uma.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getProcess_ValidContext(),
-				this.getMethodConfiguration(),
-				null,
-				"validContext", null, 0, -1, org.eclipse.epf.uma.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				capabilityPatternEClass,
-				CapabilityPattern.class,
-				"CapabilityPattern", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				processPlanningTemplateEClass,
-				ProcessPlanningTemplate.class,
-				"ProcessPlanningTemplate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getProcessPlanningTemplate_BasedOnProcesses(),
-				this.getProcess(),
-				null,
-				"basedOnProcesses", null, 0, -1, ProcessPlanningTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				roadmapEClass,
-				Roadmap.class,
-				"Roadmap", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		initEClass(
-				processComponentEClass,
-				ProcessComponent.class,
-				"ProcessComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getProcessComponent_Interfaces(),
-				this.getProcessComponentInterface(),
-				null,
-				"interfaces", null, 1, -1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getProcessComponent_Process(),
-				this.getProcess(),
-				null,
-				"process", null, 1, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				processPackageEClass,
-				ProcessPackage.class,
-				"ProcessPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getProcessPackage_ProcessElements(),
-				this.getProcessElement(),
-				null,
-				"processElements", null, 0, -1, ProcessPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getProcessPackage_Diagrams(),
-				this.getDiagram(),
-				null,
-				"diagrams", null, 0, -1, ProcessPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				processComponentInterfaceEClass,
-				ProcessComponentInterface.class,
-				"ProcessComponentInterface", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getProcessComponentInterface_InterfaceSpecifications(),
-				this.getTaskDescriptor(),
-				null,
-				"interfaceSpecifications", null, 0, -1, ProcessComponentInterface.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getProcessComponentInterface_InterfaceIO(),
-				this.getWorkProductDescriptor(),
-				null,
-				"interfaceIO", null, 0, -1, ProcessComponentInterface.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				processComponentDescriptorEClass,
-				ProcessComponentDescriptor.class,
-				"ProcessComponentDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getProcessComponentDescriptor_ProcessComponent(),
-				this.getProcessComponent(),
-				null,
-				"ProcessComponent", null, 1, 1, ProcessComponentDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				methodPluginEClass,
-				MethodPlugin.class,
-				"MethodPlugin", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getMethodPlugin_UserChangeable(),
-				ecorePackage.getEBooleanObject(),
-				"userChangeable", "true", 0, 1, MethodPlugin.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getMethodPlugin_MethodPackages(),
-				this.getMethodPackage(),
-				null,
-				"methodPackages", null, 1, -1, MethodPlugin.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodPlugin_Bases(),
-				this.getMethodPlugin(),
-				null,
-				"bases", null, 0, -1, MethodPlugin.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				variabilityElementEClass,
-				VariabilityElement.class,
-				"VariabilityElement", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getVariabilityElement_VariabilityType(),
-				this.getVariabilityType(),
-				"variabilityType", "na", 0, 1, VariabilityElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getVariabilityElement_VariabilityBasedOnElement(),
-				this.getVariabilityElement(),
-				null,
-				"variabilityBasedOnElement", null, 1, 1, VariabilityElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				methodUnitEClass,
-				MethodUnit.class,
-				"MethodUnit", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(
-				getMethodUnit_Authors(),
-				this.getString(),
-				"authors", "", 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getMethodUnit_ChangeDate(),
-				this.getDate(),
-				"changeDate", null, 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(
-				getMethodUnit_ChangeDescription(),
-				this.getString(),
-				"changeDescription", "", 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(
-				getMethodUnit_Version(),
-				this.getString(),
-				"version", "", 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(
-				getMethodUnit_CopyrightStatement(),
-				this.getSupportingMaterial(),
-				null,
-				"copyrightStatement", null, 1, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				methodConfigurationEClass,
-				MethodConfiguration.class,
-				"MethodConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getMethodConfiguration_MethodPluginSelection(),
-				this.getMethodPlugin(),
-				null,
-				"methodPluginSelection", null, 1, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodConfiguration_MethodPackageSelection(),
-				this.getMethodPackage(),
-				null,
-				"methodPackageSelection", null, 1, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodConfiguration_ProcessViews(),
-				this.getContentCategory(),
-				null,
-				"processViews", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodConfiguration_DefaultView(),
-				this.getContentCategory(),
-				null,
-				"defaultView", null, 1, 1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodConfiguration_BaseConfigurations(),
-				this.getMethodConfiguration(),
-				null,
-				"baseConfigurations", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodConfiguration_SubtractedCategory(),
-				this.getContentCategory(),
-				null,
-				"subtractedCategory", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodConfiguration_AddedCategory(),
-				this.getContentCategory(),
-				null,
-				"addedCategory", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				processFamilyEClass,
-				ProcessFamily.class,
-				"ProcessFamily", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getProcessFamily_DeliveryProcesses(),
-				this.getDeliveryProcess(),
-				null,
-				"deliveryProcesses", null, 0, -1, ProcessFamily.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(
-				methodLibraryEClass,
-				MethodLibrary.class,
-				"MethodLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(
-				getMethodLibrary_MethodPlugins(),
-				this.getMethodPlugin(),
-				null,
-				"methodPlugins", null, 0, -1, MethodLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-		initEReference(
-				getMethodLibrary_PredefinedConfigurations(),
-				this.getMethodConfiguration(),
-				null,
-				"predefinedConfigurations", null, 0, -1, MethodLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
-
-		// Initialize enums and add enum literals
-		initEEnum(workOrderTypeEEnum, WorkOrderType.class, "WorkOrderType"); //$NON-NLS-1$
-		addEEnumLiteral(workOrderTypeEEnum,
-				WorkOrderType.FINISH_TO_START_LITERAL);
-		addEEnumLiteral(workOrderTypeEEnum,
-				WorkOrderType.FINISH_TO_FINISH_LITERAL);
-		addEEnumLiteral(workOrderTypeEEnum,
-				WorkOrderType.START_TO_START_LITERAL);
-		addEEnumLiteral(workOrderTypeEEnum,
-				WorkOrderType.START_TO_FINISH_LITERAL);
-
-		initEEnum(pseudoStateKindEEnum, PseudoStateKind.class,
-				"PseudoStateKind"); //$NON-NLS-1$
-		addEEnumLiteral(pseudoStateKindEEnum, PseudoStateKind.INITIAL_LITERAL);
-		addEEnumLiteral(pseudoStateKindEEnum, PseudoStateKind.JOIN_LITERAL);
-		addEEnumLiteral(pseudoStateKindEEnum, PseudoStateKind.FORK_LITERAL);
-		addEEnumLiteral(pseudoStateKindEEnum, PseudoStateKind.JUNCTION_LITERAL);
-		addEEnumLiteral(pseudoStateKindEEnum, PseudoStateKind.CHOICE_LITERAL);
-		addEEnumLiteral(pseudoStateKindEEnum,
-				PseudoStateKind.ENTRY_POINT_LITERAL);
-		addEEnumLiteral(pseudoStateKindEEnum,
-				PseudoStateKind.EXIT_POINT_LITERAL);
-		addEEnumLiteral(pseudoStateKindEEnum, PseudoStateKind.TERMINATE_LITERAL);
-
-		initEEnum(variabilityTypeEEnum, VariabilityType.class,
-				"VariabilityType"); //$NON-NLS-1$
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.NA_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum,
-				VariabilityType.CONTRIBUTES_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.EXTENDS_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.REPLACES_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum,
-				VariabilityType.LOCAL_CONTRIBUTION_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum,
-				VariabilityType.LOCAL_REPLACEMENT_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum,
-				VariabilityType.EXTENDS_REPLACES_LITERAL);
-
-		// Initialize data types
-		initEDataType(dateEDataType, Date.class,
-				"Date", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(uriEDataType, java.net.URI.class,
-				"Uri", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(
-				unlimitedNaturalEDataType,
-				int.class,
-				"UnlimitedNatural", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(stringEDataType, String.class,
-				"String", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(setEDataType, Set.class,
-				"Set", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(sequenceEDataType, List.class,
-				"Sequence", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(integerEDataType, int.class,
-				"Integer", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEDataType(floatEDataType, Float.class,
-				"Float", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} //UmaPackageImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/VariabilityElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/VariabilityElementImpl.java
deleted file mode 100644
index 1788296..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/VariabilityElementImpl.java
+++ /dev/null
@@ -1,259 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Variability Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.VariabilityElementImpl#getVariabilityType <em>Variability Type</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.VariabilityElementImpl#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class VariabilityElementImpl extends MethodElementImpl
-		implements VariabilityElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final VariabilityType VARIABILITY_TYPE_EDEFAULT = VariabilityType.NA_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityType variabilityType = VARIABILITY_TYPE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityElement variabilityBasedOnElement = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VariabilityElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.VARIABILITY_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType getVariabilityType() {
-		return variabilityType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityType(VariabilityType newVariabilityType) {
-		VariabilityType oldVariabilityType = variabilityType;
-		variabilityType = newVariabilityType == null ? VARIABILITY_TYPE_EDEFAULT
-				: newVariabilityType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE,
-					oldVariabilityType, variabilityType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityElement getVariabilityBasedOnElement() {
-		if (variabilityBasedOnElement != null
-				&& ((EObject) variabilityBasedOnElement).eIsProxy()) {
-			InternalEObject oldVariabilityBasedOnElement = (InternalEObject) variabilityBasedOnElement;
-			variabilityBasedOnElement = (VariabilityElement) eResolveProxy(oldVariabilityBasedOnElement);
-			if (variabilityBasedOnElement != oldVariabilityBasedOnElement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(
-							this,
-							Notification.RESOLVE,
-							UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT,
-							oldVariabilityBasedOnElement,
-							variabilityBasedOnElement));
-			}
-		}
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityElement basicGetVariabilityBasedOnElement() {
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityBasedOnElement(
-			VariabilityElement newVariabilityBasedOnElement) {
-		VariabilityElement oldVariabilityBasedOnElement = variabilityBasedOnElement;
-		variabilityBasedOnElement = newVariabilityBasedOnElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(
-					this,
-					Notification.SET,
-					UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT,
-					oldVariabilityBasedOnElement, variabilityBasedOnElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE:
-			return getVariabilityType();
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			if (resolve)
-				return getVariabilityBasedOnElement();
-			return basicGetVariabilityBasedOnElement();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE:
-			setVariabilityType((VariabilityType) newValue);
-			return;
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			setVariabilityBasedOnElement((VariabilityElement) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE:
-			setVariabilityType(VARIABILITY_TYPE_EDEFAULT);
-			return;
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			setVariabilityBasedOnElement((VariabilityElement) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_TYPE:
-			return variabilityType != VARIABILITY_TYPE_EDEFAULT;
-		case UmaPackage.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-			return variabilityBasedOnElement != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (variabilityType: "); //$NON-NLS-1$
-		result.append(variabilityType);
-		result.append(')');
-		return result.toString();
-	}
-
-} //VariabilityElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/VertexImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/VertexImpl.java
deleted file mode 100644
index d119e9a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/VertexImpl.java
+++ /dev/null
@@ -1,322 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.Transition;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Vertex;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Vertex</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.VertexImpl#getContainer_ <em>Container</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.VertexImpl#getOutgoing <em>Outgoing</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.VertexImpl#getIncoming <em>Incoming</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VertexImpl extends MultiResourceEObject implements Vertex {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getOutgoing() <em>Outgoing</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOutgoing()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList outgoing = null;
-
-	/**
-	 * The cached value of the '{@link #getIncoming() <em>Incoming</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIncoming()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList incoming = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VertexImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.VERTEX;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Region getContainer_() {
-		if (eContainerFeatureID != UmaPackage.VERTEX__CONTAINER)
-			return null;
-		return (Region) eContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Region basicGetContainer() {
-		if (eContainerFeatureID != UmaPackage.VERTEX__CONTAINER)
-			return null;
-		return (Region) eInternalContainer();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetContainer(Region newContainer,
-			NotificationChain msgs) {
-		msgs = eBasicSetContainer((InternalEObject) newContainer,
-				UmaPackage.VERTEX__CONTAINER, msgs);
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setContainer(Region newContainer) {
-		if (newContainer != eInternalContainer()
-				|| (eContainerFeatureID != UmaPackage.VERTEX__CONTAINER && newContainer != null)) {
-			if (EcoreUtil.isAncestor(this, (EObject) newContainer))
-				throw new IllegalArgumentException(
-						"Recursive containment not allowed for " + toString()); //$NON-NLS-1$
-			NotificationChain msgs = null;
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newContainer != null)
-				msgs = ((InternalEObject) newContainer).eInverseAdd(this,
-						UmaPackage.REGION__VERTEX, Region.class, msgs);
-			msgs = basicSetContainer(newContainer, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.VERTEX__CONTAINER, newContainer, newContainer));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getOutgoing() {
-		if (outgoing == null) {
-			outgoing = new EObjectWithInverseResolvingEList(Transition.class,
-					this, UmaPackage.VERTEX__OUTGOING,
-					UmaPackage.TRANSITION__SOURCE);
-		}
-		return outgoing;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getIncoming() {
-		if (incoming == null) {
-			incoming = new EObjectWithInverseResolvingEList(Transition.class,
-					this, UmaPackage.VERTEX__INCOMING,
-					UmaPackage.TRANSITION__TARGET);
-		}
-		return incoming;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.VERTEX__CONTAINER:
-			if (eInternalContainer() != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			return basicSetContainer((Region) otherEnd, msgs);
-		case UmaPackage.VERTEX__OUTGOING:
-			return ((InternalEList) getOutgoing()).basicAdd(otherEnd, msgs);
-		case UmaPackage.VERTEX__INCOMING:
-			return ((InternalEList) getIncoming()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.VERTEX__CONTAINER:
-			return basicSetContainer(null, msgs);
-		case UmaPackage.VERTEX__OUTGOING:
-			return ((InternalEList) getOutgoing()).basicRemove(otherEnd, msgs);
-		case UmaPackage.VERTEX__INCOMING:
-			return ((InternalEList) getIncoming()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainerFeature(
-			NotificationChain msgs) {
-		switch (eContainerFeatureID) {
-		case UmaPackage.VERTEX__CONTAINER:
-			return eInternalContainer().eInverseRemove(this,
-					UmaPackage.REGION__VERTEX, Region.class, msgs);
-		}
-		return super.eBasicRemoveFromContainerFeature(msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.VERTEX__CONTAINER:
-			if (resolve)
-				return getContainer_();
-			return basicGetContainer();
-		case UmaPackage.VERTEX__OUTGOING:
-			return getOutgoing();
-		case UmaPackage.VERTEX__INCOMING:
-			return getIncoming();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.VERTEX__CONTAINER:
-			setContainer((Region) newValue);
-			return;
-		case UmaPackage.VERTEX__OUTGOING:
-			getOutgoing().clear();
-			getOutgoing().addAll((Collection) newValue);
-			return;
-		case UmaPackage.VERTEX__INCOMING:
-			getIncoming().clear();
-			getIncoming().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.VERTEX__CONTAINER:
-			setContainer((Region) null);
-			return;
-		case UmaPackage.VERTEX__OUTGOING:
-			getOutgoing().clear();
-			return;
-		case UmaPackage.VERTEX__INCOMING:
-			getIncoming().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.VERTEX__CONTAINER:
-			return basicGetContainer() != null;
-		case UmaPackage.VERTEX__OUTGOING:
-			return outgoing != null && !outgoing.isEmpty();
-		case UmaPackage.VERTEX__INCOMING:
-			return incoming != null && !incoming.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //VertexImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WhitepaperImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WhitepaperImpl.java
deleted file mode 100644
index 00cd5a1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WhitepaperImpl.java
+++ /dev/null
@@ -1,56 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.Whitepaper;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Whitepaper</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class WhitepaperImpl extends ConceptImpl implements Whitepaper {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WhitepaperImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WHITEPAPER;
-	}
-
-} //WhitepaperImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkBreakdownElementImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkBreakdownElementImpl.java
deleted file mode 100644
index 307ae1b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkBreakdownElementImpl.java
+++ /dev/null
@@ -1,340 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkBreakdownElementImpl#getIsRepeatable <em>Is Repeatable</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkBreakdownElementImpl#getIsOngoing <em>Is Ongoing</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkBreakdownElementImpl#getIsEventDriven <em>Is Event Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkBreakdownElementImpl#getLinkToPredecessor <em>Link To Predecessor</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class WorkBreakdownElementImpl extends BreakdownElementImpl
-		implements WorkBreakdownElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getIsRepeatable() <em>Is Repeatable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsRepeatable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_REPEATABLE_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getIsRepeatable() <em>Is Repeatable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsRepeatable()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isRepeatable = IS_REPEATABLE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getIsOngoing() <em>Is Ongoing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsOngoing()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_ONGOING_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getIsOngoing() <em>Is Ongoing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsOngoing()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isOngoing = IS_ONGOING_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getIsEventDriven() <em>Is Event Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsEventDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Boolean IS_EVENT_DRIVEN_EDEFAULT = Boolean.FALSE;
-
-	/**
-	 * The cached value of the '{@link #getIsEventDriven() <em>Is Event Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIsEventDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected Boolean isEventDriven = IS_EVENT_DRIVEN_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getLinkToPredecessor() <em>Link To Predecessor</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkToPredecessor()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList linkToPredecessor = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkBreakdownElementImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsRepeatable() {
-		return isRepeatable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsRepeatable(Boolean newIsRepeatable) {
-		Boolean oldIsRepeatable = isRepeatable;
-		isRepeatable = newIsRepeatable;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE,
-					oldIsRepeatable, isRepeatable));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsOngoing() {
-		return isOngoing;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsOngoing(Boolean newIsOngoing) {
-		Boolean oldIsOngoing = isOngoing;
-		isOngoing = newIsOngoing;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING,
-					oldIsOngoing, isOngoing));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Boolean getIsEventDriven() {
-		return isEventDriven;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsEventDriven(Boolean newIsEventDriven) {
-		Boolean oldIsEventDriven = isEventDriven;
-		isEventDriven = newIsEventDriven;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN,
-					oldIsEventDriven, isEventDriven));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getLinkToPredecessor() {
-		if (linkToPredecessor == null) {
-			linkToPredecessor = new EObjectResolvingEList(WorkOrder.class,
-					this,
-					UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR);
-		}
-		return linkToPredecessor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-			return getIsRepeatable();
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-			return getIsOngoing();
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-			return getIsEventDriven();
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR:
-			return getLinkToPredecessor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-			setIsRepeatable((Boolean) newValue);
-			return;
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-			setIsOngoing((Boolean) newValue);
-			return;
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-			setIsEventDriven((Boolean) newValue);
-			return;
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR:
-			getLinkToPredecessor().clear();
-			getLinkToPredecessor().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-			setIsRepeatable(IS_REPEATABLE_EDEFAULT);
-			return;
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-			setIsOngoing(IS_ONGOING_EDEFAULT);
-			return;
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-			setIsEventDriven(IS_EVENT_DRIVEN_EDEFAULT);
-			return;
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR:
-			getLinkToPredecessor().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-			return IS_REPEATABLE_EDEFAULT == null ? isRepeatable != null
-					: !IS_REPEATABLE_EDEFAULT.equals(isRepeatable);
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-			return IS_ONGOING_EDEFAULT == null ? isOngoing != null
-					: !IS_ONGOING_EDEFAULT.equals(isOngoing);
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-			return IS_EVENT_DRIVEN_EDEFAULT == null ? isEventDriven != null
-					: !IS_EVENT_DRIVEN_EDEFAULT.equals(isEventDriven);
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT__LINK_TO_PREDECESSOR:
-			return linkToPredecessor != null && !linkToPredecessor.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (isRepeatable: "); //$NON-NLS-1$
-		result.append(isRepeatable);
-		result.append(", isOngoing: "); //$NON-NLS-1$
-		result.append(isOngoing);
-		result.append(", isEventDriven: "); //$NON-NLS-1$
-		result.append(isEventDriven);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkBreakdownElementImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkDefinitionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkDefinitionImpl.java
deleted file mode 100644
index 54ae44a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkDefinitionImpl.java
+++ /dev/null
@@ -1,360 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkDefinition;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Definition</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkDefinitionImpl#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkDefinitionImpl#getPostcondition <em>Postcondition</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class WorkDefinitionImpl extends MethodElementImpl implements
-		WorkDefinition {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getPrecondition() <em>Precondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint precondition = null;
-
-	/**
-	 * The cached value of the '{@link #getPostcondition() <em>Postcondition</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected Constraint postcondition = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkDefinitionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_DEFINITION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPrecondition() {
-		if (precondition != null && ((EObject) precondition).eIsProxy()) {
-			InternalEObject oldPrecondition = (InternalEObject) precondition;
-			precondition = (Constraint) eResolveProxy(oldPrecondition);
-			if (precondition != oldPrecondition) {
-				InternalEObject newPrecondition = (InternalEObject) precondition;
-				NotificationChain msgs = oldPrecondition.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.WORK_DEFINITION__PRECONDITION,
-						null, null);
-				if (newPrecondition.eInternalContainer() == null) {
-					msgs = newPrecondition.eInverseAdd(this,
-							EOPPOSITE_FEATURE_BASE
-									- UmaPackage.WORK_DEFINITION__PRECONDITION,
-							null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.WORK_DEFINITION__PRECONDITION,
-							oldPrecondition, precondition));
-			}
-		}
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPrecondition() {
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPrecondition(Constraint newPrecondition,
-			NotificationChain msgs) {
-		Constraint oldPrecondition = precondition;
-		precondition = newPrecondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, UmaPackage.WORK_DEFINITION__PRECONDITION,
-					oldPrecondition, newPrecondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrecondition(Constraint newPrecondition) {
-		if (newPrecondition != precondition) {
-			NotificationChain msgs = null;
-			if (precondition != null)
-				msgs = ((InternalEObject) precondition).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.WORK_DEFINITION__PRECONDITION,
-						null, msgs);
-			if (newPrecondition != null)
-				msgs = ((InternalEObject) newPrecondition).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.WORK_DEFINITION__PRECONDITION,
-						null, msgs);
-			msgs = basicSetPrecondition(newPrecondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_DEFINITION__PRECONDITION, newPrecondition,
-					newPrecondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint getPostcondition() {
-		if (postcondition != null && ((EObject) postcondition).eIsProxy()) {
-			InternalEObject oldPostcondition = (InternalEObject) postcondition;
-			postcondition = (Constraint) eResolveProxy(oldPostcondition);
-			if (postcondition != oldPostcondition) {
-				InternalEObject newPostcondition = (InternalEObject) postcondition;
-				NotificationChain msgs = oldPostcondition.eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.WORK_DEFINITION__POSTCONDITION,
-						null, null);
-				if (newPostcondition.eInternalContainer() == null) {
-					msgs = newPostcondition
-							.eInverseAdd(
-									this,
-									EOPPOSITE_FEATURE_BASE
-											- UmaPackage.WORK_DEFINITION__POSTCONDITION,
-									null, msgs);
-				}
-				if (msgs != null)
-					msgs.dispatch();
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.WORK_DEFINITION__POSTCONDITION,
-							oldPostcondition, postcondition));
-			}
-		}
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint basicGetPostcondition() {
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPostcondition(Constraint newPostcondition,
-			NotificationChain msgs) {
-		Constraint oldPostcondition = postcondition;
-		postcondition = newPostcondition;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET,
-					UmaPackage.WORK_DEFINITION__POSTCONDITION,
-					oldPostcondition, newPostcondition);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPostcondition(Constraint newPostcondition) {
-		if (newPostcondition != postcondition) {
-			NotificationChain msgs = null;
-			if (postcondition != null)
-				msgs = ((InternalEObject) postcondition).eInverseRemove(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.WORK_DEFINITION__POSTCONDITION,
-						null, msgs);
-			if (newPostcondition != null)
-				msgs = ((InternalEObject) newPostcondition).eInverseAdd(this,
-						EOPPOSITE_FEATURE_BASE
-								- UmaPackage.WORK_DEFINITION__POSTCONDITION,
-						null, msgs);
-			msgs = basicSetPostcondition(newPostcondition, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_DEFINITION__POSTCONDITION,
-					newPostcondition, newPostcondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.WORK_DEFINITION__PRECONDITION:
-			return basicSetPrecondition(null, msgs);
-		case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-			return basicSetPostcondition(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.WORK_DEFINITION__PRECONDITION:
-			if (resolve)
-				return getPrecondition();
-			return basicGetPrecondition();
-		case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-			if (resolve)
-				return getPostcondition();
-			return basicGetPostcondition();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.WORK_DEFINITION__PRECONDITION:
-			setPrecondition((Constraint) newValue);
-			return;
-		case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-			setPostcondition((Constraint) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.WORK_DEFINITION__PRECONDITION:
-			setPrecondition((Constraint) null);
-			return;
-		case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-			setPostcondition((Constraint) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.WORK_DEFINITION__PRECONDITION:
-			return precondition != null;
-		case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-			return postcondition != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //WorkDefinitionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkOrderImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkOrderImpl.java
deleted file mode 100644
index 71458e1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkOrderImpl.java
+++ /dev/null
@@ -1,248 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkOrderType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Order</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkOrderImpl#getLinkType <em>Link Type</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkOrderImpl#getPred <em>Pred</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkOrderImpl extends ProcessElementImpl implements WorkOrder {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getLinkType() <em>Link Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final WorkOrderType LINK_TYPE_EDEFAULT = WorkOrderType.FINISH_TO_START_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getLinkType() <em>Link Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkType()
-	 * @generated
-	 * @ordered
-	 */
-	protected WorkOrderType linkType = LINK_TYPE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getPred() <em>Pred</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPred()
-	 * @generated
-	 * @ordered
-	 */
-	protected WorkBreakdownElement pred = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkOrderImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_ORDER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrderType getLinkType() {
-		return linkType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLinkType(WorkOrderType newLinkType) {
-		WorkOrderType oldLinkType = linkType;
-		linkType = newLinkType == null ? LINK_TYPE_EDEFAULT : newLinkType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_ORDER__LINK_TYPE, oldLinkType, linkType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkBreakdownElement getPred() {
-		if (pred != null && ((EObject) pred).eIsProxy()) {
-			InternalEObject oldPred = (InternalEObject) pred;
-			pred = (WorkBreakdownElement) eResolveProxy(oldPred);
-			if (pred != oldPred) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.WORK_ORDER__PRED, oldPred, pred));
-			}
-		}
-		return pred;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkBreakdownElement basicGetPred() {
-		return pred;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPred(WorkBreakdownElement newPred) {
-		WorkBreakdownElement oldPred = pred;
-		pred = newPred;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_ORDER__PRED, oldPred, pred));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.WORK_ORDER__LINK_TYPE:
-			return getLinkType();
-		case UmaPackage.WORK_ORDER__PRED:
-			if (resolve)
-				return getPred();
-			return basicGetPred();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.WORK_ORDER__LINK_TYPE:
-			setLinkType((WorkOrderType) newValue);
-			return;
-		case UmaPackage.WORK_ORDER__PRED:
-			setPred((WorkBreakdownElement) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.WORK_ORDER__LINK_TYPE:
-			setLinkType(LINK_TYPE_EDEFAULT);
-			return;
-		case UmaPackage.WORK_ORDER__PRED:
-			setPred((WorkBreakdownElement) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.WORK_ORDER__LINK_TYPE:
-			return linkType != LINK_TYPE_EDEFAULT;
-		case UmaPackage.WORK_ORDER__PRED:
-			return pred != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (linkType: "); //$NON-NLS-1$
-		result.append(linkType);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkOrderImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductDescriptionImpl.java
deleted file mode 100644
index 4eeb06a..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductDescriptionImpl.java
+++ /dev/null
@@ -1,301 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProductDescription;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptionImpl#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptionImpl#getImpactOfNotHaving <em>Impact Of Not Having</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptionImpl#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductDescriptionImpl extends ContentDescriptionImpl
-		implements WorkProductDescription {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PURPOSE_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected String purpose = PURPOSE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getImpactOfNotHaving() <em>Impact Of Not Having</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImpactOfNotHaving()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String IMPACT_OF_NOT_HAVING_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getImpactOfNotHaving() <em>Impact Of Not Having</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImpactOfNotHaving()
-	 * @generated
-	 * @ordered
-	 */
-	protected String impactOfNotHaving = IMPACT_OF_NOT_HAVING_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getReasonsForNotNeeding() <em>Reasons For Not Needing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReasonsForNotNeeding()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REASONS_FOR_NOT_NEEDING_EDEFAULT = "";
-
-	/**
-	 * The cached value of the '{@link #getReasonsForNotNeeding() <em>Reasons For Not Needing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReasonsForNotNeeding()
-	 * @generated
-	 * @ordered
-	 */
-	protected String reasonsForNotNeeding = REASONS_FOR_NOT_NEEDING_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDescriptionImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPurpose() {
-		return purpose;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPurpose(String newPurpose) {
-		String oldPurpose = purpose;
-		purpose = newPurpose;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE, oldPurpose,
-					purpose));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getImpactOfNotHaving() {
-		return impactOfNotHaving;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setImpactOfNotHaving(String newImpactOfNotHaving) {
-		String oldImpactOfNotHaving = impactOfNotHaving;
-		impactOfNotHaving = newImpactOfNotHaving;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING,
-					oldImpactOfNotHaving, impactOfNotHaving));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getReasonsForNotNeeding() {
-		return reasonsForNotNeeding;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReasonsForNotNeeding(String newReasonsForNotNeeding) {
-		String oldReasonsForNotNeeding = reasonsForNotNeeding;
-		reasonsForNotNeeding = newReasonsForNotNeeding;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(
-					this,
-					Notification.SET,
-					UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING,
-					oldReasonsForNotNeeding, reasonsForNotNeeding));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-			return getPurpose();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-			return getImpactOfNotHaving();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-			return getReasonsForNotNeeding();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-			setPurpose((String) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-			setImpactOfNotHaving((String) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-			setReasonsForNotNeeding((String) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-			setPurpose(PURPOSE_EDEFAULT);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-			setImpactOfNotHaving(IMPACT_OF_NOT_HAVING_EDEFAULT);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-			setReasonsForNotNeeding(REASONS_FOR_NOT_NEEDING_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-			return PURPOSE_EDEFAULT == null ? purpose != null
-					: !PURPOSE_EDEFAULT.equals(purpose);
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-			return IMPACT_OF_NOT_HAVING_EDEFAULT == null ? impactOfNotHaving != null
-					: !IMPACT_OF_NOT_HAVING_EDEFAULT.equals(impactOfNotHaving);
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-			return REASONS_FOR_NOT_NEEDING_EDEFAULT == null ? reasonsForNotNeeding != null
-					: !REASONS_FOR_NOT_NEEDING_EDEFAULT
-							.equals(reasonsForNotNeeding);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (purpose: "); //$NON-NLS-1$
-		result.append(purpose);
-		result.append(", impactOfNotHaving: "); //$NON-NLS-1$
-		result.append(impactOfNotHaving);
-		result.append(", reasonsForNotNeeding: "); //$NON-NLS-1$
-		result.append(reasonsForNotNeeding);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkProductDescriptionImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductDescriptorImpl.java
deleted file mode 100644
index e894301..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductDescriptorImpl.java
+++ /dev/null
@@ -1,460 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-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.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl#getActivityEntryState <em>Activity Entry State</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl#getActivityExitState <em>Activity Exit State</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl#getImpactedBy <em>Impacted By</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl#getImpacts <em>Impacts</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductDescriptorImpl#getDeliverableParts <em>Deliverable Parts</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductDescriptorImpl extends DescriptorImpl implements
-		WorkProductDescriptor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The default value of the '{@link #getActivityEntryState() <em>Activity Entry State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityEntryState()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ACTIVITY_ENTRY_STATE_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getActivityEntryState() <em>Activity Entry State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityEntryState()
-	 * @generated
-	 * @ordered
-	 */
-	protected String activityEntryState = ACTIVITY_ENTRY_STATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActivityExitState() <em>Activity Exit State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityExitState()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ACTIVITY_EXIT_STATE_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getActivityExitState() <em>Activity Exit State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityExitState()
-	 * @generated
-	 * @ordered
-	 */
-	protected String activityExitState = ACTIVITY_EXIT_STATE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getWorkProduct() <em>Work Product</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkProduct()
-	 * @generated
-	 * @ordered
-	 */
-	protected WorkProduct workProduct = null;
-
-	/**
-	 * The cached value of the '{@link #getImpactedBy() <em>Impacted By</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImpactedBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList impactedBy = null;
-
-	/**
-	 * The cached value of the '{@link #getImpacts() <em>Impacts</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImpacts()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList impacts = null;
-
-	/**
-	 * The cached value of the '{@link #getDeliverableParts() <em>Deliverable Parts</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDeliverableParts()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList deliverableParts = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDescriptorImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getActivityEntryState() {
-		return activityEntryState;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActivityEntryState(String newActivityEntryState) {
-		String oldActivityEntryState = activityEntryState;
-		activityEntryState = newActivityEntryState;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE,
-					oldActivityEntryState, activityEntryState));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getActivityExitState() {
-		return activityExitState;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActivityExitState(String newActivityExitState) {
-		String oldActivityExitState = activityExitState;
-		activityExitState = newActivityExitState;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE,
-					oldActivityExitState, activityExitState));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProduct getWorkProduct() {
-		if (workProduct != null && ((EObject) workProduct).eIsProxy()) {
-			InternalEObject oldWorkProduct = (InternalEObject) workProduct;
-			workProduct = (WorkProduct) eResolveProxy(oldWorkProduct);
-			if (workProduct != oldWorkProduct) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT,
-							oldWorkProduct, workProduct));
-			}
-		}
-		return workProduct;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProduct basicGetWorkProduct() {
-		return workProduct;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkProduct(WorkProduct newWorkProduct) {
-		WorkProduct oldWorkProduct = workProduct;
-		workProduct = newWorkProduct;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT,
-					oldWorkProduct, workProduct));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getImpactedBy() {
-		if (impactedBy == null) {
-			impactedBy = new EObjectWithInverseResolvingEList.ManyInverse(
-					WorkProductDescriptor.class, this,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS);
-		}
-		return impactedBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getImpacts() {
-		if (impacts == null) {
-			impacts = new EObjectWithInverseResolvingEList.ManyInverse(
-					WorkProductDescriptor.class, this,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY);
-		}
-		return impacts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getDeliverableParts() {
-		if (deliverableParts == null) {
-			deliverableParts = new EObjectResolvingEList(
-					WorkProductDescriptor.class, this,
-					UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS);
-		}
-		return deliverableParts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-			return ((InternalEList) getImpactedBy()).basicAdd(otherEnd, msgs);
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-			return ((InternalEList) getImpacts()).basicAdd(otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-			return ((InternalEList) getImpactedBy())
-					.basicRemove(otherEnd, msgs);
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-			return ((InternalEList) getImpacts()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-			return getActivityEntryState();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-			return getActivityExitState();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-			if (resolve)
-				return getWorkProduct();
-			return basicGetWorkProduct();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-			return getImpactedBy();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-			return getImpacts();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-			return getDeliverableParts();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-			setActivityEntryState((String) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-			setActivityExitState((String) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-			setWorkProduct((WorkProduct) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-			getImpactedBy().clear();
-			getImpactedBy().addAll((Collection) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-			getImpacts().clear();
-			getImpacts().addAll((Collection) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-			getDeliverableParts().clear();
-			getDeliverableParts().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-			setActivityEntryState(ACTIVITY_ENTRY_STATE_EDEFAULT);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-			setActivityExitState(ACTIVITY_EXIT_STATE_EDEFAULT);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-			setWorkProduct((WorkProduct) null);
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-			getImpactedBy().clear();
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-			getImpacts().clear();
-			return;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-			getDeliverableParts().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-			return ACTIVITY_ENTRY_STATE_EDEFAULT == null ? activityEntryState != null
-					: !ACTIVITY_ENTRY_STATE_EDEFAULT.equals(activityEntryState);
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-			return ACTIVITY_EXIT_STATE_EDEFAULT == null ? activityExitState != null
-					: !ACTIVITY_EXIT_STATE_EDEFAULT.equals(activityExitState);
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-			return workProduct != null;
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-			return impactedBy != null && !impactedBy.isEmpty();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-			return impacts != null && !impacts.isEmpty();
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-			return deliverableParts != null && !deliverableParts.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (activityEntryState: "); //$NON-NLS-1$
-		result.append(activityEntryState);
-		result.append(", activityExitState: "); //$NON-NLS-1$
-		result.append(activityExitState);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkProductDescriptorImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductImpl.java
deleted file mode 100644
index d37cd7e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductImpl.java
+++ /dev/null
@@ -1,289 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.util.AssociationHelper;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductImpl#getReports <em>Reports</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductImpl#getTemplates <em>Templates</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductImpl#getToolMentors <em>Tool Mentors</em>}</li>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductImpl#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class WorkProductImpl extends ContentElementImpl implements
-		WorkProduct {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getReports() <em>Reports</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReports()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList reports = null;
-
-	/**
-	 * The cached value of the '{@link #getTemplates() <em>Templates</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTemplates()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList templates = null;
-
-	/**
-	 * The cached value of the '{@link #getToolMentors() <em>Tool Mentors</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToolMentors()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList toolMentors = null;
-
-	/**
-	 * The cached value of the '{@link #getEstimationConsiderations() <em>Estimation Considerations</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEstimationConsiderations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList estimationConsiderations = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 */
-	public List getModifiedBy() {
-		List outputFrom = AssociationHelper.getOutputtingTasks(this); //this.getOutputFrom();
-		List modifies = new BasicEList();
-		if (outputFrom != null && outputFrom.size() > 0) {
-			for (Iterator it = outputFrom.iterator(); it.hasNext();) {
-				//	for each task get, get primary performer role
-				Task task = (Task) it.next();
-				Role modifiedByRole = task.getPerformedBy();
-				if (modifiedByRole != null) {
-					if (!modifies.contains(modifiedByRole)) {
-						modifies.add(modifiedByRole);
-					}
-				}
-			}
-		}
-		return modifies;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getReports() {
-		if (reports == null) {
-			reports = new EObjectResolvingEList(Report.class, this,
-					UmaPackage.WORK_PRODUCT__REPORTS);
-		}
-		return reports;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getTemplates() {
-		if (templates == null) {
-			templates = new EObjectResolvingEList(Template.class, this,
-					UmaPackage.WORK_PRODUCT__TEMPLATES);
-		}
-		return templates;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getToolMentors() {
-		if (toolMentors == null) {
-			toolMentors = new EObjectResolvingEList(ToolMentor.class, this,
-					UmaPackage.WORK_PRODUCT__TOOL_MENTORS);
-		}
-		return toolMentors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getEstimationConsiderations() {
-		if (estimationConsiderations == null) {
-			estimationConsiderations = new EObjectResolvingEList(
-					EstimationConsiderations.class, this,
-					UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS);
-		}
-		return estimationConsiderations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT__REPORTS:
-			return getReports();
-		case UmaPackage.WORK_PRODUCT__TEMPLATES:
-			return getTemplates();
-		case UmaPackage.WORK_PRODUCT__TOOL_MENTORS:
-			return getToolMentors();
-		case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-			return getEstimationConsiderations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT__REPORTS:
-			getReports().clear();
-			getReports().addAll((Collection) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT__TEMPLATES:
-			getTemplates().clear();
-			getTemplates().addAll((Collection) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT__TOOL_MENTORS:
-			getToolMentors().clear();
-			getToolMentors().addAll((Collection) newValue);
-			return;
-		case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-			getEstimationConsiderations().clear();
-			getEstimationConsiderations().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT__REPORTS:
-			getReports().clear();
-			return;
-		case UmaPackage.WORK_PRODUCT__TEMPLATES:
-			getTemplates().clear();
-			return;
-		case UmaPackage.WORK_PRODUCT__TOOL_MENTORS:
-			getToolMentors().clear();
-			return;
-		case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-			getEstimationConsiderations().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT__REPORTS:
-			return reports != null && !reports.isEmpty();
-		case UmaPackage.WORK_PRODUCT__TEMPLATES:
-			return templates != null && !templates.isEmpty();
-		case UmaPackage.WORK_PRODUCT__TOOL_MENTORS:
-			return toolMentors != null && !toolMentors.isEmpty();
-		case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-			return estimationConsiderations != null
-					&& !estimationConsiderations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //WorkProductImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductTypeImpl.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductTypeImpl.java
deleted file mode 100644
index 07f426b..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/WorkProductTypeImpl.java
+++ /dev/null
@@ -1,152 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.impl;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.uma.impl.WorkProductTypeImpl#getWorkProducts <em>Work Products</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductTypeImpl extends ContentCategoryImpl implements
-		WorkProductType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * The cached value of the '{@link #getWorkProducts() <em>Work Products</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkProducts()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList workProducts = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductTypeImpl() {
-		super();
-
-		//UMA-->
-		reassignDefaultValues();
-		//UMA<--
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getWorkProducts() {
-		if (workProducts == null) {
-			workProducts = new EObjectResolvingEList(WorkProduct.class, this,
-					UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCTS);
-		}
-		return workProducts;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCTS:
-			return getWorkProducts();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCTS:
-			getWorkProducts().clear();
-			getWorkProducts().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCTS:
-			getWorkProducts().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		//UMA-->
-		EStructuralFeature feature = getFeatureWithOverridenDefaultValue(featureID);
-		if (feature != null) {
-			return isFeatureWithOverridenDefaultValueSet(feature);
-		}
-		//UMA<--		
-		switch (featureID) {
-		case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCTS:
-			return workProducts != null && !workProducts.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //WorkProductTypeImpl
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/package.html b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/package.html
deleted file mode 100644
index ef0fb75..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation for the UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/package.html b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/package.html
deleted file mode 100644
index fc44385..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/AssociationHelper.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/AssociationHelper.java
deleted file mode 100644
index 684ad42..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/AssociationHelper.java
+++ /dev/null
@@ -1,1307 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.util;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.common.util.BasicEList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.ecore.impl.MultiResourceEObject;
-import org.eclipse.epf.uma.ecore.util.OppositeFeature;
-
-/**
- * A helper class for navigating and querying bidirectional associations among
- * the model objects.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public final class AssociationHelper {
-
-	/**
-	 * An opposite feature used for retrieving the disciplines which a task is
-	 * categorized under.
-	 */
-	public static final OppositeFeature Task_Disciplines = new OppositeFeature(
-			Task.class,
-			"Task_Disciplines", UmaPackage.eINSTANCE.getDiscipline_Tasks(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the task descriptors which are
-	 * created from a specific task.
-	 */
-	public static final OppositeFeature Task_TaskDescriptors = new OppositeFeature(
-			Task.class,
-			"Task_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_Task(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the domains which a work product
-	 * is categorized under.
-	 */
-	public static final OppositeFeature WorkProduct_Domains = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_Domains", UmaPackage.eINSTANCE.getDomain_WorkProducts(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the tasks which produce a work
-	 * product as an output.
-	 */
-	public static final OppositeFeature WorkProduct_OutputFrom_Tasks = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_OutputFrom_Tasks", UmaPackage.eINSTANCE.getTask_Output(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the tasks which use a work
-	 * product as a mandatory input.
-	 */
-	public static final OppositeFeature WorkProduct_MandatoryInputTo_Tasks = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_InputTo_Tasks", UmaPackage.eINSTANCE.getTask_MandatoryInput(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the work product types which a
-	 * work product is categorized under.
-	 */
-	public static final OppositeFeature WorkProduct_WorkProductTypes = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_WorkProductTypes", UmaPackage.eINSTANCE.getWorkProductType_WorkProducts(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the responsible roles for a work
-	 * product.
-	 */
-	public static final OppositeFeature WorkProduct_ResponsibleRoles = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_ResponsibleRoles", UmaPackage.eINSTANCE.getRole_ResponsibleFor(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the deliverables which a work
-	 * product is contained in.
-	 */
-	public static final OppositeFeature WorkProduct_Deliverables = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_Deliverables", UmaPackage.eINSTANCE.getDeliverable_DeliveredWorkProducts(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the tasks that use a work product
-	 * as an optional input.
-	 */
-	public static final OppositeFeature WorkProduct_OptionalInputTo_Tasks = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_OptionalInputTo_Tasks", UmaPackage.eINSTANCE.getTask_OptionalInput(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the work product descriptors
-	 * which are created from a work product.
-	 */
-	public static final OppositeFeature WorkProduct_WorkProductDescriptors = new OppositeFeature(
-			WorkProduct.class,
-			"WorkProduct_WorkProductDescriptors", UmaPackage.eINSTANCE.getWorkProductDescriptor_WorkProduct(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the primary tasks of a role.
-	 */
-	public static final OppositeFeature Role_Primary_Tasks = new OppositeFeature(
-			Role.class,
-			"Role_Primary_Tasks", UmaPackage.eINSTANCE.getTask_PerformedBy(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the secondary tasks of a role.
-	 */
-	public static final OppositeFeature Role_Secondary_Tasks = new OppositeFeature(
-			Role.class,
-			"Role_Secondary_Tasks", UmaPackage.eINSTANCE.getTask_AdditionallyPerformedBy(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the role sets which a role is
-	 * categorized under.
-	 */
-	public static final OppositeFeature Role_RoleSets = new OppositeFeature(
-			Role.class,
-			"Role_RoleSets", UmaPackage.eINSTANCE.getRoleSet_Roles(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the composite roles which
-	 * includes a role.
-	 */
-	public static final OppositeFeature Role_CompositeRoles = new OppositeFeature(
-			Role.class,
-			"Role_CompositeRoles", UmaPackage.eINSTANCE.getCompositeRole_AggregatedRoles(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the role descriptors which are
-	 * created from a role.
-	 */
-	public static final OppositeFeature Role_RoleDescriptors = new OppositeFeature(
-			Role.class,
-			"Role_RoleDescriptors", UmaPackage.eINSTANCE.getRoleDescriptor_Role(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the content elements which a
-	 * checklist is associated with.
-	 */
-	public static final OppositeFeature Checklist_ContentElements = new OppositeFeature(
-			Checklist.class,
-			"Checklist_ContentElements", UmaPackage.eINSTANCE.getContentElement_Checklists(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the activities which a checklist is
-	 * associated with.
-	 */
-	public static final OppositeFeature Checklist_Activities = new OppositeFeature(
-			Checklist.class,
-			"Checklist_Activities", UmaPackage.eINSTANCE.getActivity_Checklists(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the activities which a concept is
-	 * associated with.
-	 */
-	public static final OppositeFeature Concept_Activities = new OppositeFeature(
-			Concept.class,
-			"Concept_Activities", UmaPackage.eINSTANCE.getActivity_Concepts(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the activities which an example is
-	 * associated with.
-	 */
-	public static final OppositeFeature Example_Activities = new OppositeFeature(
-			Concept.class,
-			"Example_Activities", UmaPackage.eINSTANCE.getActivity_Examples(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the activities which a ReusableAsset is
-	 * associated with.
-	 */
-	public static final OppositeFeature ReusableAsset_Activities = new OppositeFeature(
-			Concept.class,
-			"ReusableAsset_Activities", UmaPackage.eINSTANCE.getActivity_ReusableAssets(), true, false); //$NON-NLS-1$
-
-
-	/**
-	 * An opposite feature used for retrieving the content elements which a
-	 * concept is associated with.
-	 */
-	public static final OppositeFeature Concept_ContentElements = new OppositeFeature(
-			Concept.class,
-			"Concept_ContentElements", UmaPackage.eINSTANCE.getContentElement_ConceptsAndPapers(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the content elements which an
-	 * example is associated with.
-	 */
-	public static final OppositeFeature Example_ContentElements = new OppositeFeature(
-			Example.class,
-			"Example_ContentElements", UmaPackage.eINSTANCE.getContentElement_Examples(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the content elements which a
-	 * report is associated with.
-	 */
-	public static final OppositeFeature Report_WorkProducts = new OppositeFeature(
-			Report.class,
-			"Report_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_Reports(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the tasks which a
-	 * EstimationConsiderations is associated with.
-	 */
-	public static final OppositeFeature EstimationConsiderations_Tasks = new OppositeFeature(
-			Report.class,
-			"EstimationConsiderations_Tasks", UmaPackage.eINSTANCE.getTask_EstimationConsiderations(), true); //$NON-NLS-1$
-	
-	/**
-	 * An opposite feature used for retrieving the work products which a
-	 * EstimationConsiderations is associated with.
-	 */
-	public static final OppositeFeature EstimationConsiderations_WorkProducts = new OppositeFeature(
-			Report.class,
-			"EstimationConsiderations_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_EstimationConsiderations(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the content elements which a
-	 * reusable asset is associated with.
-	 */
-	public static final OppositeFeature ReusableAsset_ContentElements = new OppositeFeature(
-			ReusableAsset.class,
-			"ReusableAsset_ContentElements", UmaPackage.eINSTANCE.getContentElement_Assets(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the activities which a roadmap is
-	 * associated with.
-	 */
-	public static final OppositeFeature Roadmap_Activites = new OppositeFeature(
-			Roadmap.class,
-			"Roadmap_Activites", UmaPackage.eINSTANCE.getActivity_Roadmaps(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the activities which a supporting
-	 * material is associated with.
-	 */
-	public static final OppositeFeature SupportingMaterial_Activities = new OppositeFeature(
-			SupportingMaterial.class,
-			"SupportingMaterial_Activities", UmaPackage.eINSTANCE.getActivity_SupportingMaterials(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the content elements which a
-	 * supporting material is associated with.
-	 */
-	public static final OppositeFeature SupportingMaterial_ContentElements = new OppositeFeature(
-			SupportingMaterial.class,
-			"SupportingMaterial_ContentElements", UmaPackage.eINSTANCE.getContentElement_SupportingMaterials(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the delivery processes which a
-	 * communication supporting material is associated with.
-	 */
-	public static final OppositeFeature SupportingMaterial_Communications_DeliveryProcesses = new OppositeFeature(
-			SupportingMaterial.class,
-			"SupportingMaterial_Communications_DeliveryProcesses", UmaPackage.eINSTANCE.getDeliveryProcess_CommunicationsMaterials(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the delivery processes which an
-	 * education supporting material is associated with.
-	 */
-	public static final OppositeFeature SupportingMaterial_Education_DeliveryProcesses = new OppositeFeature(
-			SupportingMaterial.class,
-			"SupportingMaterial_Education_DeliveryProcesses", UmaPackage.eINSTANCE.getDeliveryProcess_EducationMaterials(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the method units which a
-	 * copyright supporting material is associated with.
-	 */
-	public static final OppositeFeature SupportingMaterial_CopyrightStatement_MethodUnits = new OppositeFeature(
-			SupportingMaterial.class,
-			"SupportingMaterial_CopyrightStatement_MethodPlugins", UmaPackage.eINSTANCE.getMethodUnit_CopyrightStatement(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the content elements which a
-	 * guideline is associated with.
-	 */
-	public static final OppositeFeature Guideline_ContentElements = new OppositeFeature(
-			Guideline.class,
-			"Guideline_ContentElements", UmaPackage.eINSTANCE.getContentElement_Guidelines(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the activities which a guideline
-	 * is associated with.
-	 */
-	public static final OppositeFeature Guideline_Activities = new OppositeFeature(
-			Guideline.class,
-			"Guideline_Activities", UmaPackage.eINSTANCE.getActivity_Guidelines(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the work products which a
-	 * template is associated with.
-	 */
-	public static final OppositeFeature Template_WorkProducts = new OppositeFeature(
-			Template.class,
-			"Template_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_Templates(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the tool which a tool mentor is
-	 * categorized under.
-	 */
-	public static final OppositeFeature ToolMentor_Tool = new OppositeFeature(
-			ToolMentor.class,
-			"ToolMentor_Tool", UmaPackage.eINSTANCE.getTool_ToolMentors(), false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the tasks which a tool mentor is
-	 * associated with.
-	 */
-	public static final OppositeFeature ToolMentor_Tasks = new OppositeFeature(
-			ToolMentor.class,
-			"ToolMentor_Tasks", UmaPackage.eINSTANCE.getTask_ToolMentors(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the work products which a tool
-	 * mentor is associated with.
-	 */
-	public static final OppositeFeature ToolMentor_WorkProducts = new OppositeFeature(
-			Template.class,
-			"ToolMentor_WorkProducts", UmaPackage.eINSTANCE.getWorkProduct_ToolMentors(), true); //$NON-NLS-1$	
-
-	/**
-	 * An opposite feature used for retrieving the custom categories which a
-	 * describable element is associated with.
-	 */
-	public static final OppositeFeature DescribableElement_CustomCategories = new OppositeFeature(
-			DescribableElement.class,
-			"ContentElement_CustomCategories", UmaPackage.eINSTANCE.getCustomCategory_CategorizedElements(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the practices referenced by a
-	 * content element.
-	 */
-	public static final OppositeFeature ContentElement_Practices = new OppositeFeature(
-			ContentElement.class,
-			"ContentElement_Practices", UmaPackage.eINSTANCE.getPractice_ContentReferences(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the method plug-ins referenced by
-	 * a method plug-in.
-	 */
-	public static final OppositeFeature MethodPlugin_DirectExtensions = new OppositeFeature(
-			MethodPlugin.class,
-			"MethodPlugin_DirectExtensions", UmaPackage.eINSTANCE.getMethodPlugin_Bases(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the method configurations which
-	 * contain a reference to a method plug-in.
-	 */
-	public static final OppositeFeature MethodPlugin_MethodConfigurations = new OppositeFeature(
-			MethodPlugin.class,
-			"MethodPlugin_MethodConfigurations", UmaPackage.eINSTANCE.getMethodConfiguration_MethodPluginSelection(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the method packages
-	 * used/referenced by a method package.
-	 */
-	public static final OppositeFeature MethodPackage_UsingPackages = new OppositeFeature(
-			MethodPackage.class,
-			"MethodPackage_UsingPackages", UmaPackage.eINSTANCE.getMethodPackage_ReusedPackages(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the method configurations which
-	 * contain a reference to a method package.
-	 */
-	public static final OppositeFeature MethodPackage_MethodConfigurations = new OppositeFeature(
-			MethodPackage.class,
-			"MethodPackage_MethodConfigurations", UmaPackage.eINSTANCE.getMethodConfiguration_MethodPackageSelection(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the method configurations which
-	 * contain a reference to a CustomCategory.
-	 */
-	public static final OppositeFeature CustomCategory_MethodConfigurations = new OppositeFeature(
-			CustomCategory.class,
-			"CustomCategory_MethodConfigurations", UmaPackage.eINSTANCE.getMethodConfiguration_ProcessViews(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the discipline groupings which
-	 * contain a reference to a discipline.
-	 */
-	public static final OppositeFeature Discipline_DisciplineGroupings = new OppositeFeature(
-			Discipline.class,
-			"Discipline_DisciplineGroupings", UmaPackage.eINSTANCE.getDisciplineGrouping_Disciplines(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the disciplines which
-	 * contain a reference to a discipline (ie, a subdiscipline).
-	 */
-	public static final OppositeFeature Subdiscipline_Discipline = new OppositeFeature(
-			Discipline.class,
-			"Subdiscipline_Discipline", UmaPackage.eINSTANCE.getDiscipline_Subdiscipline(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the role set groupings which
-	 * contain a reference to a role set.
-	 */
-	public static final OppositeFeature RoleSet_RoleSetGrouppings = new OppositeFeature(
-			RoleSet.class,
-			"RoleSet_RoleSetGrouppings", UmaPackage.eINSTANCE.getRoleSetGrouping_RoleSets(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the successor of a work order.
-	 */
-	public static final OppositeFeature WorkOrder_Successor = new OppositeFeature(
-			WorkOrder.class,
-			"WorkOrder_Successor", UmaPackage.eINSTANCE.getWorkBreakdownElement_LinkToPredecessor(), false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the successor link of a work
-	 * breakdown element.
-	 */
-	public static final OppositeFeature WorkBreakdownElement_LinkToSuccessor = new OppositeFeature(
-			WorkBreakdownElement.class,
-			"WorkBreakdownElement_LinkToSuccessor", UmaPackage.eINSTANCE.getWorkOrder_Pred(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the immediate variaties of a
-	 * variability element.
-	 */
-	public static final OppositeFeature VariabilityElement_ImmediateVarieties = new OppositeFeature(
-			VariabilityElement.class,
-			"VariabilityElement_ImmediateVarieties", UmaPackage.eINSTANCE.getVariabilityElement_VariabilityBasedOnElement(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the successors to a section.
-	 */
-	public static final OppositeFeature Section_Successors = new OppositeFeature(
-			Section.class,
-			"Section_Successors", UmaPackage.eINSTANCE.getSection_Predecessor(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the task descriptors which a
-	 * section is associated with.
-	 */
-	public static final OppositeFeature Section_TaskDescriptors = new OppositeFeature(
-			Section.class,
-			"Section_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_SelectedSteps(), true, false); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the team profiles which includes
-	 * a specific role descriptor.
-	 */
-	public static final OppositeFeature RoleDescriptor_TeamProfiles = new OppositeFeature(
-			RoleDescriptor.class,
-			"RoleDescriptor_TeamProfiles", UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the primary task descriptors
-	 * performed by a role descriptor.
-	 */
-	public static final OppositeFeature RoleDescriptor_PrimaryTaskDescriptors = new OppositeFeature(
-			RoleDescriptor.class,
-			"RoleDescriptor_PrimaryTaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the additional task descriptors
-	 * performed by a role descriptor.
-	 */
-	public static final OppositeFeature RoleDescriptor_AdditionalTaskDescriptors = new OppositeFeature(
-			RoleDescriptor.class,
-			"RoleDescriptor_AdditionalTaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_AdditionallyPerformedBy(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the assisting task descriptors
-	 * performed by a role descriptor.
-	 */
-	public static final OppositeFeature RoleDescriptor_AssistsIn_TaskDescriptors = new OppositeFeature(
-			RoleDescriptor.class,
-			"RoleDescriptor_AssistsIn_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_AssistedBy(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the dependent processes
-	 * referenced in a method configuration.
-	 */
-	public static final OppositeFeature MethodConfiguration_DependentProcesses = new OppositeFeature(
-			MethodConfiguration.class,
-			"MethodConfiguration_DependentProcesses", UmaPackage.eINSTANCE.getProcess_DefaultContext(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the valid processes referenced in
-	 * a method configuration.
-	 */
-	public static final OppositeFeature MethodConfiguration_ValidContext_Processes = new OppositeFeature(
-			MethodConfiguration.class,
-			"MethodConfiguration_ValidContext_Processes", UmaPackage.eINSTANCE.getProcess_ValidContext(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the task descriptors which
-	 * produce a work product descriptor as an output.
-	 */
-	public static final OppositeFeature WorkProductDescriptor_OutputFrom_TaskDescriptors = new OppositeFeature(
-			WorkProductDescriptor.class,
-			"WorkProductDescriptor_OutputFrom_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_Output(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the task descriptors which use a
-	 * work product descriptor as an optional input.
-	 */
-	public static final OppositeFeature WorkProductDescriptor_OptionalInputTo_TaskDescriptors = new OppositeFeature(
-			WorkProductDescriptor.class,
-			"WorkProductDescriptor_OptionalInputTo_TaskDescriptors", UmaPackage.eINSTANCE.getTaskDescriptor_OptionalInput(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the task descriptors which use a
-	 * work product descriptor as an mandatory input.
-	 */
-	public static final OppositeFeature WorkProductDescriptor_MandatoryInputTo_TaskDescriptors = new OppositeFeature(
-			WorkProductDescriptor.class,
-			"WorkProductDescriptor_MandatoryInputTo_TaskDescriptors", //$NON-NLS-1$
-			UmaPackage.eINSTANCE.getTaskDescriptor_MandatoryInput(), true);
-
-	/**
-	 * An opposite feature used for retrieving the task descriptors which use a
-	 * work product descriptor as an external input.
-	 */
-	public static final OppositeFeature WorkProductDescriptor_ExternalInputTo_TaskDescriptors = new OppositeFeature(
-			WorkProductDescriptor.class,
-			"WorkProductDescriptor_ExternalInputTo_TaskDescriptors", //$NON-NLS-1$
-			UmaPackage.eINSTANCE.getTaskDescriptor_ExternalInput(), true);
-
-	/**
-	 * An opposite feature used for retrieving the role descriptors which are
-	 * responsible for a work product descriptor.
-	 */
-	public static final OppositeFeature WorkProductDescriptor_ResponsibleRoleDescriptors = new OppositeFeature(
-			WorkProductDescriptor.class,
-			"WorkProductDescriptor_ResponsibleRoleDescriptors", //$NON-NLS-1$
-			UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor(), true);
-
-	/**
-	 * An opposite feature used for retrieving the deliverable descriptors which
-	 * contain a specific work product descriptor.
-	 */
-	public static final OppositeFeature WorkProductDescriptor_DeliverableDescriptors = new OppositeFeature(
-			WorkProductDescriptor.class,
-			"WorkProductDescriptor_DeliverableDescriptors", UmaPackage.eINSTANCE.getWorkProductDescriptor_DeliverableParts(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the disciplines which an activity
-	 * is associated with.
-	 */
-	public static final OppositeFeature Activity_Disciplines = new OppositeFeature(
-			Activity.class,
-			"Activity_Disciplines", UmaPackage.eINSTANCE.getDiscipline_ReferenceWorkflows(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the practices which an activity
-	 * is associated with.
-	 */
-	public static final OppositeFeature Activity_Pratices = new OppositeFeature(
-			Activity.class,
-			"Activity_Pratices", UmaPackage.eINSTANCE.getPractice_ActivityReferences(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the process planning templates
-	 * which a process is associated with.
-	 */
-	public static final OppositeFeature Process_ProcessPlanningTemplates = new OppositeFeature(
-			Process.class,
-			"Process_ProcessPlanningTemplates", UmaPackage.eINSTANCE.getProcessPlanningTemplate_BasedOnProcesses(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the procesess which references a
-	 * capability pattern.
-	 */
-	public static final OppositeFeature CapabilityPattern_ConsumingProcesses = new OppositeFeature(
-			CapabilityPattern.class,
-			"CapabilityPattern_ConsumingProcesses", UmaPackage.eINSTANCE.getProcess_IncludesPatterns(), true); //$NON-NLS-1$
-
-	/**
-	 * An opposite feature used for retrieving the breakdown element which is
-	 * displayed before a breakdown element.
-	 */
-	public static final OppositeFeature BreakdownElement_PresentedBefore = new OppositeFeature(
-			BreakdownElement.class,
-			"BreakdownElement_PresentedBefore", //$NON-NLS-1$
-			UmaPackage.eINSTANCE.getBreakdownElement_PresentedAfter(), true,
-			false);
-
-	/**
-	 * An opposite feature used for retrieving the breakdown element which is
-	 * displayed after a breakdown element.
-	 */
-	public static final OppositeFeature BreakdownElement_PresentedAfter = new OppositeFeature(
-			BreakdownElement.class,
-			"BreakdownElement_PresentedAfter", //$NON-NLS-1$
-			UmaPackage.eINSTANCE.getBreakdownElement_PresentedBefore(), true,
-			false);
-
-	/**
-	 * An opposite feature used for retrieving the UMA sematic model bridges
-	 * referenced by a method element.
-	 */
-	public static final OppositeFeature MethodElement_UMASematicModelBridges = new OppositeFeature(
-			MethodElement.class,
-			"MethodElement_UMASematicModelBridges", //$NON-NLS-1$
-			UmaPackage.eINSTANCE.getUMASemanticModelBridge_Element(), true,
-			false);
-
-	private static ArrayList predefinedOppositeFeatures;
-
-	static {
-		registerPredefinedOppositeFeatures();
-	}
-
-	/**
-	 * Registers the predefined opposite features.
-	 */
-	public static final void registerPredefinedOppositeFeatures() {
-		predefinedOppositeFeatures = new ArrayList();
-		AssociationHelper object = new AssociationHelper();
-		Field[] fields = object.getClass().getDeclaredFields();
-		for (int i = 0; i < fields.length; i++) {
-			Field field = fields[i];
-			int mod = field.getModifiers();
-			if (Modifier.isPublic(mod) && Modifier.isStatic(mod)
-					&& Modifier.isFinal(mod)
-					&& field.getType() == OppositeFeature.class) {
-				try {
-					predefinedOppositeFeatures.add(field.get(object));
-				} catch (IllegalArgumentException e) {
-					e.printStackTrace();
-				} catch (IllegalAccessException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-
-		/*
-		 * System.out
-		 * .println("AssociationHelper.registerPredefinedOppositeFeatures():
-		 * defined opposite features: " + predefinedOppositeFeatures.size());
-		 * //$NON-NLS-1$ System.out.println(predefinedOppositeFeatures);
-		 */
-
-		for (Iterator iter = predefinedOppositeFeatures.iterator(); iter
-				.hasNext();) {
-			OppositeFeature feature = (OppositeFeature) iter.next();
-			OppositeFeature.registerOppositeFeature(feature);
-		}
-	}
-
-	/**
-	 * Gets the predefined opposite features.
-	 * 
-	 * @return the predefined opposite features
-	 */
-	public static Collection getPredefinedOppositeFeatures() {
-		return predefinedOppositeFeatures;
-	}
-
-	/**
-	 * Gets the deliverable descriptors which contain the given work product
-	 * descriptor.
-	 * 
-	 * @param wpd
-	 *            a work descriptor
-	 * @return a list of deliverable descriptors
-	 */
-	public static List getDeliverableDescriptors(WorkProductDescriptor wpd) {
-		return (List) ((MultiResourceEObject) wpd)
-				.getOppositeFeatureValue(WorkProductDescriptor_DeliverableDescriptors);
-	}
-
-	/**
-	 * Gets the task descriptors which use a work product descriptor as an
-	 * external input.
-	 * 
-	 * @param wpd
-	 *            a work descriptor
-	 * @return a list of task descriptors
-	 */
-	public static List getExternalInputTo(WorkProductDescriptor wpd) {
-		return (List) ((MultiResourceEObject) wpd)
-				.getOppositeFeatureValue(WorkProductDescriptor_ExternalInputTo_TaskDescriptors);
-	}
-
-	/**
-	 * Gets the task descriptors which use a work product descriptor as a
-	 * mandatory input.
-	 * 
-	 * @param wpd
-	 *            a work descriptor
-	 * @return a list of task descriptors
-	 */
-	public static List getMandatoryInputTo(WorkProductDescriptor wpd) {
-		return (List) ((MultiResourceEObject) wpd)
-				.getOppositeFeatureValue(WorkProductDescriptor_MandatoryInputTo_TaskDescriptors);
-	}
-
-	/**
-	 * Gets the task descriptors which use a work product descriptor as an
-	 * optional input.
-	 * 
-	 * @param wpd
-	 *            a work descriptor
-	 * @return a list of task descriptors
-	 */
-	public static List getOptionalInputTo(WorkProductDescriptor wpd) {
-		return (List) ((MultiResourceEObject) wpd)
-				.getOppositeFeatureValue(WorkProductDescriptor_OptionalInputTo_TaskDescriptors);
-	}
-
-	/**
-	 * Gets the task descriptors which which produce a work product descriptor
-	 * as an output.
-	 * 
-	 * @param wpd
-	 *            a work descriptor
-	 * @return a list of task descriptors
-	 */
-	public static List getOutputFrom(WorkProductDescriptor wpd) {
-		return (List) ((MultiResourceEObject) wpd)
-				.getOppositeFeatureValue(WorkProductDescriptor_OutputFrom_TaskDescriptors);
-	}
-
-	/**
-	 * Gets the role descriptors which are responsible for a work product
-	 * descriptor.
-	 * 
-	 * @param wpd
-	 *            a work descriptor
-	 * @return a list of role descriptors
-	 */
-	public static List getResponsibleRoleDescriptors(WorkProductDescriptor wpd) {
-		return (List) wpd
-				.getOppositeFeatureValue(WorkProductDescriptor_ResponsibleRoleDescriptors);
-	}
-
-	/**
-	 * Gets the the dependent processes referenced in a method configuration.
-	 * 
-	 * @param e
-	 *            a method configuration
-	 * @return a list of processes
-	 */
-	public static List getDependentProcesses(MethodConfiguration e) {
-		return (List) ((MultiResourceEObject) e)
-				.getOppositeFeatureValue(MethodConfiguration_DependentProcesses);
-	}
-
-	/**
-	 * Gets the team profiles which includes a specific role descriptor.
-	 * 
-	 * @param e
-	 *            a role descriptor
-	 * @return a list of team profiles
-	 */
-	public static List getTeamProfiles(RoleDescriptor e) {
-		return (List) ((MultiResourceEObject) e)
-				.getOppositeFeatureValue(RoleDescriptor_TeamProfiles);
-	}
-
-	/**
-	 * Gets the practices referenced by a content element.
-	 * 
-	 * @param e
-	 *            a content element
-	 * @return a list of practices
-	 */
-	public static List getPractices(ContentElement e) {
-		return (List) ((MultiResourceEObject) e)
-				.getOppositeFeatureValue(ContentElement_Practices);
-	}
-
-	/**
-	 * Gets the tool which a tool mentor is categorized under.
-	 * 
-	 * @param e
-	 *            a tool mentor
-	 * @return a tool
-	 */
-	public static Tool getTool(ToolMentor toolMentor) {
-		return (Tool) ((MultiResourceEObject) toolMentor)
-				.getOppositeFeatureValue(ToolMentor_Tool);
-	}
-
-	/**
-	 * Gets the successors to a section.
-	 * 
-	 * @param e
-	 *            a section
-	 * @return a list of sections that are postioned after the given section
-	 */
-	public static List getSuccessors(Section section) {
-		return (List) ((MultiResourceEObject) section)
-				.getOppositeFeatureValue(Section_Successors);
-	}
-
-	/**
-	 * Gets the immediate variaties of a variability element.
-	 * 
-	 * @param e
-	 *            a variability element
-	 * @return a list of immediate variaties
-	 */
-	public static List getImmediateVarieties(VariabilityElement e) {
-		return (List) ((MultiResourceEObject) e)
-				.getOppositeFeatureValue(VariabilityElement_ImmediateVarieties);
-	}
-
-	/**
-	 * Gets the primary tasks of a role.
-	 * 
-	 * @param role
-	 *            a role
-	 * @return a list of tasks
-	 */
-	public static List getPrimaryTasks(Role role) {
-		return (List) ((MultiResourceEObject) role)
-				.getOppositeFeatureValue(Role_Primary_Tasks);
-	}
-
-	/**
-	 * Gets the secondary tasks of a role.
-	 * 
-	 * @param role
-	 *            a role
-	 * @return a list of tasks
-	 */
-	public static List getSecondaryTasks(Role role) {
-		return (List) ((MultiResourceEObject) role)
-				.getOppositeFeatureValue(Role_Secondary_Tasks);
-	}
-
-	/**
-	 * Gets the successor link of a work breakdown element.
-	 * 
-	 * @param e
-	 *            a break down element
-	 * @return a list of links to work breakdown elements
-	 */
-	public static List getLinkToSuccessor(BreakdownElement e) {
-		return (List) ((MultiResourceEObject) e)
-				.getOppositeFeatureValue(WorkBreakdownElement_LinkToSuccessor);
-	}
-
-	/**
-	 * Gets the successor of a work order.
-	 * 
-	 * @param workOrder
-	 *            a work order
-	 * @return a work breakdown element
-	 */
-	public static WorkBreakdownElement getSuccessor(WorkOrder workOrder) {
-		return (WorkBreakdownElement) ((MultiResourceEObject) workOrder)
-				.getOppositeFeatureValue(WorkOrder_Successor);
-	}
-
-	/**
-	 * Gets the tasks which produce a work product as an output.
-	 * 
-	 * @param wp
-	 *            a work product
-	 * @return a list of tasks
-	 */
-	public static List getOutputtingTasks(WorkProduct wp) {
-		return (List) ((MultiResourceEObject) wp)
-				.getOppositeFeatureValue(WorkProduct_OutputFrom_Tasks);
-	}
-
-	/**
-	 * Gets the tasks which use a work product as a mandatory input.
-	 * 
-	 * @param wp
-	 *            a work product
-	 * @return a list of tasks
-	 */
-	public static List getMandatoryInputToTasks(WorkProduct wp) {
-		return (List) ((MultiResourceEObject) wp)
-				.getOppositeFeatureValue(WorkProduct_MandatoryInputTo_Tasks);
-	}
-
-	/**
-	 * Gets the responsible roles for a work product.
-	 * 
-	 * @param wp
-	 *            a work product
-	 * @return a list of roles
-	 */
-	public static List getResponsibleRoles(WorkProduct wp) {
-		return (List) wp.getOppositeFeatureValue(WorkProduct_ResponsibleRoles);
-	}
-
-	/**
-	 * Gets the work products modified by a role.
-	 * 
-	 * @param role
-	 *            a role
-	 * @return a list of work products
-	 */
-	public static List getModifiedWorkProducts(Role role) {
-		List performs = getPrimaryTasks(role);
-		List modifies = new BasicEList();
-		if (performs != null && performs.size() > 0) {
-			for (Iterator i = performs.iterator(); i.hasNext();) {
-				Task task = (Task) i.next();
-
-				// for each task, get output work product;
-				List outputWPs = task.getOutput();
-				if (outputWPs != null && outputWPs.size() > 0) {
-					for (Iterator it = outputWPs.iterator(); it.hasNext();) {
-						WorkProduct wp = (WorkProduct) it.next();
-						if (wp != null) {
-							if (!modifies.contains(wp)) {
-								modifies.add(wp);
-							}
-						}
-					}
-				}
-			}
-		}
-		return modifies;
-
-	}
-
-	/**
-	 * Gets the roles that modify a work product.
-	 * 
-	 * @param wp
-	 *            a work product
-	 * @return a list of roles
-	 */
-	public static List getModifiedBy(WorkProduct wp) {
-		List outputFrom = AssociationHelper.getOutputtingTasks(wp); // this.getOutputFrom();
-		java.util.ArrayList modifies = new java.util.ArrayList();
-		if (outputFrom != null && outputFrom.size() > 0) {
-			for (Iterator it = outputFrom.iterator(); it.hasNext();) {
-				// for each task get, get primary performer role
-				Task task = (Task) it.next();
-				Role modifiedByRole = task.getPerformedBy();
-				if (modifiedByRole != null) {
-					if (!modifies.contains(modifiedByRole)) {
-						modifies.add(modifiedByRole);
-					}
-				}
-			}
-		}
-		return modifies;
-	}
-
-	/**
-	 * Gets the discipline groupings which contain a reference to a discipline.
-	 * 
-	 * @param discipline
-	 *            a discipline
-	 * @return a list of discipline groupings
-	 */
-	public static List getDisciplineGroups(Discipline discipline) {
-		return (List) ((MultiResourceEObject) discipline)
-				.getOppositeFeatureValue(Discipline_DisciplineGroupings);
-	}
-
-	/**
-	 * Gets the discipline which contain a reference to a subdiscipline.
-	 * 
-	 * @param discipline
-	 *            a discipline
-	 * @return a list of discipline groupings
-	 */
-	public static List getDiscipline(Discipline subdiscipline) {
-		return (List) ((MultiResourceEObject) subdiscipline)
-				.getOppositeFeatureValue(Subdiscipline_Discipline);
-	}
-
-	/**
-	 * Gets the domains which a work product is categorized under.
-	 * 
-	 * @param wp
-	 *            a work product
-	 * @return a domain
-	 */
-	public static List getDomains(WorkProduct wp) {
-		return (List) ((MultiResourceEObject) wp)
-				.getOppositeFeatureValue(WorkProduct_Domains);
-	}
-
-	/**
-	 * Gets the role set groupings which contain a reference to a role set.
-	 * 
-	 * @param roleSet
-	 *            a role set
-	 * @return a list of role set groupings
-	 */
-	public static List getRoleSetGroups(RoleSet roleSet) {
-		return (List) ((MultiResourceEObject) roleSet)
-				.getOppositeFeatureValue(RoleSet_RoleSetGrouppings);
-	}
-
-	/**
-	 * Gets the role sets which a role is categorized under.
-	 * 
-	 * @param role
-	 *            a role
-	 * @return a list of role sets
-	 */
-	public static List getRoleSets(Role role) {
-		return (List) ((MultiResourceEObject) role)
-				.getOppositeFeatureValue(Role_RoleSets);
-	}
-
-	/**
-	 * Gets the task descriptors which have been created from a task.
-	 * 
-	 * @param task
-	 *            a task
-	 * @return a list of task descriptors
-	 */
-	public static List getTaskDescriptors(Task task) {
-		return (List) task.getOppositeFeatureValue(Task_TaskDescriptors);
-	}
-
-	/**
-	 * Gets the disciplines which a task is categorized under.
-	 * 
-	 * @param task
-	 *            a task
-	 * @return a list of disciplines
-	 */
-	public static List getDisciplines(Task task) {
-		return (List) task.getOppositeFeatureValue(Task_Disciplines);
-	}
-
-	/**
-	 * Gets the disciplines which an activity is associated with.
-	 * 
-	 * @param activity
-	 *            an activity
-	 * @return a list of disciplines
-	 */
-	public static List getDisciplines(Activity activity) {
-		return (List) activity.getOppositeFeatureValue(Activity_Disciplines);
-	}
-
-	/**
-	 * Gets the primary task descriptors performed by a role descriptor.
-	 * 
-	 * @param roleDesc
-	 *            a role descriptor
-	 * @return a list of task descriptors
-	 */
-	public static List getPrimaryTaskDescriptors(RoleDescriptor roleDesc) {
-		return (List) ((MultiResourceEObject) roleDesc)
-				.getOppositeFeatureValue(RoleDescriptor_PrimaryTaskDescriptors);
-	}
-
-	/**
-	 * Gets the additional task descriptors performed by a role descriptor.
-	 * 
-	 * @param roleDesc
-	 *            a role descriptor
-	 * @return a list of task descriptors
-	 */
-	public static List getAdditionalTaskDescriptors(RoleDescriptor roleDesc) {
-		return (List) ((MultiResourceEObject) roleDesc)
-				.getOppositeFeatureValue(RoleDescriptor_AdditionalTaskDescriptors);
-	}
-
-	/**
-	 * Gets the assisting task descriptors performed by a role descriptor.
-	 * 
-	 * @param roleDesc
-	 *            a role descriptor
-	 * @return a list of task descriptors
-	 */
-	public static List getAssistedTaskDescriptors(RoleDescriptor roleDesc) {
-		return (List) ((MultiResourceEObject) roleDesc)
-				.getOppositeFeatureValue(RoleDescriptor_AssistsIn_TaskDescriptors);
-	}
-
-	/**
-	 * Gets the work product types which a work product is categorized under.
-	 * 
-	 * @param wp
-	 *            a work product
-	 * @return a list of work product types
-	 */
-	public static List getWorkProductTypes(WorkProduct wp) {
-		return (List) ((MultiResourceEObject) wp)
-				.getOppositeFeatureValue(WorkProduct_WorkProductTypes);
-	}
-
-	/**
-	 * Gets the custom categories which a describable element is associated
-	 * with.
-	 * 
-	 * @param wp
-	 *            a describable element
-	 * @return a list of custom categories
-	 */
-	public static List getCustomCategories(DescribableElement element) {
-		return (List) ((MultiResourceEObject) element)
-				.getOppositeFeatureValue(DescribableElement_CustomCategories);
-	}
-
-	/**
-	 * Gets the Deliverables which a WorkProduct element is associated with.
-	 * 
-	 * @param wp
-	 *            a WorkProduct element
-	 * @return a list of Deliverables
-	 */
-	public static List getDeliverables(WorkProduct element) {
-		return (List) ((MultiResourceEObject) element)
-				.getOppositeFeatureValue(WorkProduct_Deliverables);
-	}
-
-	/**
-	 * Gets the method plug-ins referenced by a method plug-in.
-	 * 
-	 * @param plugin
-	 *            a method plug-in
-	 * @return a list of method plug-ins
-	 */
-	public static List getPluginDirectExtensions(MethodPlugin plugin) {
-		return (List) ((MultiResourceEObject) plugin)
-				.getOppositeFeatureValue(MethodPlugin_DirectExtensions);
-	}
-
-	/**
-	 * Gets all the references to a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a collection of method element references
-	 */
-	public static Collection getReferences(MethodElement element) {
-		Set references = new HashSet();
-		MultiResourceEObject eObj = (MultiResourceEObject) element;
-
-		if (eObj.basicGetOppositeFeatureMap() == null)
-			return references;
-
-		for (Iterator iter = eObj.getOppositeFeatureMap().entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			OppositeFeature oppositeFeature = ((OppositeFeature) entry.getKey());
-			oppositeFeature.getTargetFeature();
-			if (oppositeFeature.isMany()) {
-				references.addAll((Collection) eObj
-						.getOppositeFeatureValue(oppositeFeature));
-			} else {
-				EObject obj = (EObject) eObj
-						.getOppositeFeatureValue(oppositeFeature);
-				if (obj != null) {
-					references.add(obj);
-				}
-			}
-		}
-
-		return references;
-	}
-
-	/**
-	 * Gets all the references to a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a map containing method element references
-	 */
-	public static Map<EObject, Collection<EStructuralFeature>> getReferenceMap(MethodElement element) {
-		Map<EObject, Collection<EStructuralFeature>> objectToFeaturesMap = new HashMap<EObject, Collection<EStructuralFeature>>();
-
-		MultiResourceEObject eObj = (MultiResourceEObject) element;
-
-		if (eObj.basicGetOppositeFeatureMap() == null) {
-			return objectToFeaturesMap;
-		}
-
-		for (Iterator iter = eObj.getOppositeFeatureMap().entrySet().iterator(); iter
-				.hasNext();) {
-			Map.Entry entry = (Map.Entry) iter.next();
-			OppositeFeature oppositeFeature = ((OppositeFeature) entry.getKey());
-			EStructuralFeature feature = oppositeFeature.getTargetFeature();
-			if (oppositeFeature.isMany()) {
-				for (Iterator iterator = ((Collection) eObj
-						.getOppositeFeatureValue(oppositeFeature)).iterator(); iterator
-						.hasNext();) {
-					EObject object = (EObject) iterator.next();
-					Collection<EStructuralFeature> features = objectToFeaturesMap
-							.get(object);
-					if (features == null) {
-						features = new ArrayList<EStructuralFeature>();
-						objectToFeaturesMap.put(object, features);
-					}
-					features.add(feature);
-				}
-				;
-			} else {
-				EObject object = (EObject) eObj
-						.getOppositeFeatureValue(oppositeFeature);
-				if (object != null) {
-					Collection<EStructuralFeature> features = objectToFeaturesMap
-							.get(object);
-					if (features == null) {
-						features = new ArrayList<EStructuralFeature>();
-						objectToFeaturesMap.put(object, features);
-					}
-					features.add(feature);
-				}
-			}
-		}
-
-		return objectToFeaturesMap;
-	}
-
-	public static final void init() {
-	}
-
-	/**
-	 * Given a set of elements, returns the set of those elements plus any
-	 * variability elements associated with them.
-	 * 
-	 * @param elementSet
-	 *            a set of method elements for which to retrieve the variability
-	 *            elements
-	 * @param getBases
-	 *            if <code>true</code>, recurse into the variability base
-	 *            elements ("up the tree")
-	 * @param getChildren
-	 *            if <code>true</code>, recurse into the varieties ("down the
-	 *            tree")
-	 * @return a collective set of method elements plus the associated
-	 *         variability elements
-	 */
-	public static Set getVariabilityElements(Set elementSet, boolean getBases,
-			boolean getChildren) {
-		if (elementSet != null && !elementSet.isEmpty()) {
-			Set varSet = new HashSet();
-			for (Iterator iter = elementSet.iterator(); iter.hasNext();) {
-				Object o = iter.next();
-				if (o instanceof VariabilityElement) {
-					VariabilityElement element = (VariabilityElement) o;
-					if (getChildren)
-						varSet.addAll(getImmediateVarieties(element));
-					if (getBases
-							&& element.getVariabilityBasedOnElement() != null)
-						varSet.add(element.getVariabilityBasedOnElement());
-				}
-			}
-			if (varSet.isEmpty())
-				return elementSet;
-			if (elementSet.containsAll(varSet))
-				return elementSet;
-			elementSet.addAll(varSet);
-			elementSet.addAll(getVariabilityElements(elementSet, getBases,
-					getChildren));
-		}
-		return elementSet;
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/ContentDescriptionFactory.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/ContentDescriptionFactory.java
deleted file mode 100644
index 325e78d..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/ContentDescriptionFactory.java
+++ /dev/null
@@ -1,192 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.util;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.impl.ContentElementImpl;
-import org.eclipse.epf.uma.impl.ProcessElementImpl;
-
-/**
- * Manages the creation of content descriptions.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public final class ContentDescriptionFactory {
-
-	// Maps ContentElement implementation Class to ContentDesciptionInfo.
-	private static final Map<EClass, EClass> contentDescClassMap = new HashMap<EClass, EClass>();
-
-	static {
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getPractice(),
-				UmaPackage.eINSTANCE.getPracticeDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getRole(),
-				UmaPackage.eINSTANCE.getRoleDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getTask(),
-				UmaPackage.eINSTANCE.getTaskDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getTemplate(),
-				UmaPackage.eINSTANCE.getGuidanceDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getExample(),
-				UmaPackage.eINSTANCE.getGuidanceDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getReusableAsset(),
-				UmaPackage.eINSTANCE.getGuidanceDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getWhitepaper(),
-				UmaPackage.eINSTANCE.getGuidanceDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getArtifact(),
-				UmaPackage.eINSTANCE.getArtifactDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getDeliverable(),
-				UmaPackage.eINSTANCE.getDeliverableDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getOutcome(),
-				UmaPackage.eINSTANCE.getWorkProductDescription());
-
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getRoleDescriptor(),
-				UmaPackage.eINSTANCE.getDescriptorDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getCompositeRole(),
-				UmaPackage.eINSTANCE.getDescriptorDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getTaskDescriptor(),
-				UmaPackage.eINSTANCE.getDescriptorDescription());
-		contentDescClassMap.put(
-				UmaPackage.eINSTANCE.getWorkProductDescriptor(),
-				UmaPackage.eINSTANCE.getDescriptorDescription());
-
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getMilestone(),
-				UmaPackage.eINSTANCE.getBreakdownElementDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getTeamProfile(),
-				UmaPackage.eINSTANCE.getBreakdownElementDescription());
-
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getActivity(),
-				UmaPackage.eINSTANCE.getActivityDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getIteration(),
-				UmaPackage.eINSTANCE.getActivityDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getPhase(),
-				UmaPackage.eINSTANCE.getActivityDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getCapabilityPattern(),
-				UmaPackage.eINSTANCE.getProcessDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE.getDeliveryProcess(),
-				UmaPackage.eINSTANCE.getDeliveryProcessDescription());
-		contentDescClassMap.put(UmaPackage.eINSTANCE
-				.getProcessPlanningTemplate(), UmaPackage.eINSTANCE
-				.getProcessDescription());
-	}
-
-	public static EClass getContentDescriptionType(EClass describableElementType) {
-		EClass type = (EClass) contentDescClassMap.get(describableElementType);
-		if(type == null && UmaPackage.eINSTANCE.getDescribableElement().isSuperTypeOf(describableElementType)) {
-			type = UmaPackage.eINSTANCE.getContentDescription();
-		}
-		return type;
-	}
-
-	public static final ContentDescription createContentDescription(
-			DescribableElement e) {
-		EClass eClass = (EClass) contentDescClassMap.get(e.eClass());
-		if (eClass == null) {
-			eClass = UmaPackage.eINSTANCE.getContentDescription();
-		}
-		ContentDescription content = (ContentDescription) UmaFactory.eINSTANCE
-				.create(eClass);
-		content.setName(UmaUtil.createContentDescriptionName(e));
-		content.setGuid(UmaUtil.generateGUID(e.getGuid()));
-		return content;
-	}
-
-	/**
-	 * Creates a new ContentDescription object for the given ContentElement and
-	 * save it to a file
-	 * 
-	 * @param e
-	 * @return
-	 * @deprecated use createContentDescription(DescribableElement e) instead
-	 */
-	public static ContentDescription createContentDescription(ContentElement e) {
-		return createContentDescription(e, false);
-	}
-
-	/**
-	 * 
-	 * @param e
-	 * @param saveContentOnly
-	 * @return
-	 * @deprecated use createContentDescription(DescribableElement e) instead
-	 */
-	public static ContentDescription createContentDescription(
-			DescribableElement e, boolean saveContentOnly) {
-		// if ( e instanceof ContentElement)
-		// {
-		// return createContentDescription((ContentElement)e, saveContentOnly);
-		// }
-		//		
-		// return createContentDescription(e);
-
-		return createContentDescription(e);
-	}
-
-	public static ContentDescription createContentDescription(ContentElement e,
-			boolean saveContentOnly) {
-		ContentDescription description = createContentDescription((DescribableElement) e);
-
-		// Set descriptions = (Set)
-		// contentDescriptionsMap.get(descInfo.packageName);
-		// if(descriptions == null) {
-		// descriptions = new HashSet();
-		// contentDescriptionsMap.put(descInfo.packageName, descriptions);
-		// }
-		// descriptions.add(description);
-
-		// saving ContentDescription right after its creation it no longer
-		// needed since ContentDescription is
-		// now contained by a DescribableElement
-		//
-		// if(libPersister != null) {
-		// libPersister.save(e, description, saveContentOnly);
-		// }
-		return description;
-	}
-
-	// public static final Map getContentDescriptionsMap() {
-	// return contentDescriptionsMap;
-	// }
-
-	public static boolean hasPresentation(MethodElement e) {
-		if (e instanceof ContentElementImpl) {
-			return ((ContentElementImpl) e).basicGetPresentation() != null;
-		} else if (e instanceof ProcessElementImpl) {
-			return ((ProcessElementImpl) e).basicGetPresentation() != null;
-		}
-		return false;
-	}
-
-	public static EClass getContentDescriptionEClass(DescribableElement e) {
-		return (EClass) contentDescClassMap.get(e.eClass());
-	}
-
-	public static void main(String[] args) throws Exception {
-		// MessageDigest md5 = MessageDigest.getInstance("MD5");
-		String input = args[0];
-		// byte[] hash = md5.digest(input.getBytes());
-		System.out.println("input: '" + input + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-		System.out.println("Java's hash code: " + input.hashCode()); //$NON-NLS-1$
-		// System.out.println("hash length: " + hash.length);
-		// System.out.println("base64 encoded: " +
-		// DataValue.Base64.encode(hash));
-		System.out.println("new GUID: " + UmaUtil.generateGUID(input)); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/MessageException.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/MessageException.java
deleted file mode 100644
index b4a88bb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/MessageException.java
+++ /dev/null
@@ -1,49 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.util;
-
-import org.eclipse.emf.common.util.WrappedException;
-
-/**
- * Signals that a method library persistence operation has failed.
- * 
- * @author Phong Nguyen Le
- * @since 1.0
- */
-public class MessageException extends WrappedException {
-
-	private static final Exception DUMMY_EXCEPTION = new Exception();
-
-	private static final long serialVersionUID = 3904682656683013433L;
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param message
-	 *            an error message
-	 */
-	public MessageException(String msg) {
-		super(msg, DUMMY_EXCEPTION);
-	}
-
-	/**
-	 * Creates a new instance.
-	 * 
-	 * @param message
-	 *            an error message
-	 * @param exception
-	 *            an exception object
-	 */
-	public MessageException(String message, Exception exception) {
-		super(message, exception);
-	}
-
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/Resources.properties b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/Resources.properties
deleted file mode 100644
index 77261a1..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/Resources.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-copyright=IBM Corporation
-err_cannotModify0=Cannot modify ''{0}''
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaAdapterFactory.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaAdapterFactory.java
deleted file mode 100644
index 4f42e5e..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaAdapterFactory.java
+++ /dev/null
@@ -1,2313 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.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.epf.uma.Activity;
-import org.eclipse.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ArtifactDescription;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Classifier;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CoreSemanticModelBridge;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DeliverableDescription;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DeliveryProcessDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Element;
-import org.eclipse.epf.uma.Ellipse;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.GraphicPrimitive;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Image;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.LeafElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Namespace;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.PackageableElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.PlanningData;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.Polyline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.PracticeDescription;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessComponentDescriptor;
-import org.eclipse.epf.uma.ProcessComponentInterface;
-import org.eclipse.epf.uma.ProcessDescription;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.PseudoState;
-import org.eclipse.epf.uma.Reference;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescription;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.State;
-import org.eclipse.epf.uma.StateMachine;
-import org.eclipse.epf.uma.Step;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescription;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.TextElement;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Transition;
-import org.eclipse.epf.uma.Type;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.Vertex;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkDefinition;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescription;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.WorkProductType;
-
-import org.eclipse.epf.uma.*;
-
-/**
- * <!-- 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.epf.uma.UmaPackage
- * @generated
- */
-public class UmaAdapterFactory extends AdapterFactoryImpl {
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static UmaPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = UmaPackage.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
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject) object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected UmaSwitch modelSwitch = new UmaSwitch() {
-		public Object caseClassifier(Classifier object) {
-			return createClassifierAdapter();
-		}
-
-		public Object caseType(Type object) {
-			return createTypeAdapter();
-		}
-
-		public Object caseElement(Element object) {
-			return createElementAdapter();
-		}
-
-		public Object caseNamedElement(NamedElement object) {
-			return createNamedElementAdapter();
-		}
-
-		public Object casePackageableElement(PackageableElement object) {
-			return createPackageableElementAdapter();
-		}
-
-		public Object casePackage(org.eclipse.epf.uma.Package object) {
-			return createPackageAdapter();
-		}
-
-		public Object caseNamespace(Namespace object) {
-			return createNamespaceAdapter();
-		}
-
-		public Object caseMethodElement(MethodElement object) {
-			return createMethodElementAdapter();
-		}
-
-		public Object caseConstraint(Constraint object) {
-			return createConstraintAdapter();
-		}
-
-		public Object caseMethodElementProperty(MethodElementProperty object) {
-			return createMethodElementPropertyAdapter();
-		}
-
-		public Object caseContentElement(ContentElement object) {
-			return createContentElementAdapter();
-		}
-
-		public Object caseDescribableElement(DescribableElement object) {
-			return createDescribableElementAdapter();
-		}
-
-		public Object caseContentDescription(ContentDescription object) {
-			return createContentDescriptionAdapter();
-		}
-
-		public Object caseSection(Section object) {
-			return createSectionAdapter();
-		}
-
-		public Object caseRole(Role object) {
-			return createRoleAdapter();
-		}
-
-		public Object caseWorkProduct(WorkProduct object) {
-			return createWorkProductAdapter();
-		}
-
-		public Object caseTask(Task object) {
-			return createTaskAdapter();
-		}
-
-		public Object caseWorkDefinition(WorkDefinition object) {
-			return createWorkDefinitionAdapter();
-		}
-
-		public Object caseStep(Step object) {
-			return createStepAdapter();
-		}
-
-		public Object caseGuidance(Guidance object) {
-			return createGuidanceAdapter();
-		}
-
-		public Object caseArtifact(Artifact object) {
-			return createArtifactAdapter();
-		}
-
-		public Object caseDeliverable(Deliverable object) {
-			return createDeliverableAdapter();
-		}
-
-		public Object caseOutcome(Outcome object) {
-			return createOutcomeAdapter();
-		}
-
-		public Object caseMethodPackage(MethodPackage object) {
-			return createMethodPackageAdapter();
-		}
-
-		public Object caseContentPackage(ContentPackage object) {
-			return createContentPackageAdapter();
-		}
-
-		public Object caseArtifactDescription(ArtifactDescription object) {
-			return createArtifactDescriptionAdapter();
-		}
-
-		public Object caseWorkProductDescription(WorkProductDescription object) {
-			return createWorkProductDescriptionAdapter();
-		}
-
-		public Object caseDeliverableDescription(DeliverableDescription object) {
-			return createDeliverableDescriptionAdapter();
-		}
-
-		public Object caseRoleDescription(RoleDescription object) {
-			return createRoleDescriptionAdapter();
-		}
-
-		public Object caseTaskDescription(TaskDescription object) {
-			return createTaskDescriptionAdapter();
-		}
-
-		public Object caseGuidanceDescription(GuidanceDescription object) {
-			return createGuidanceDescriptionAdapter();
-		}
-
-		public Object casePracticeDescription(PracticeDescription object) {
-			return createPracticeDescriptionAdapter();
-		}
-
-		public Object casePoint(Point object) {
-			return createPointAdapter();
-		}
-
-		public Object caseGraphElement(GraphElement object) {
-			return createGraphElementAdapter();
-		}
-
-		public Object caseDiagramElement(DiagramElement object) {
-			return createDiagramElementAdapter();
-		}
-
-		public Object caseDiagramLink(DiagramLink object) {
-			return createDiagramLinkAdapter();
-		}
-
-		public Object caseGraphConnector(GraphConnector object) {
-			return createGraphConnectorAdapter();
-		}
-
-		public Object caseSemanticModelBridge(SemanticModelBridge object) {
-			return createSemanticModelBridgeAdapter();
-		}
-
-		public Object caseDimension(Dimension object) {
-			return createDimensionAdapter();
-		}
-
-		public Object caseReference(Reference object) {
-			return createReferenceAdapter();
-		}
-
-		public Object caseProperty(Property object) {
-			return createPropertyAdapter();
-		}
-
-		public Object caseGraphEdge(GraphEdge object) {
-			return createGraphEdgeAdapter();
-		}
-
-		public Object caseDiagram(Diagram object) {
-			return createDiagramAdapter();
-		}
-
-		public Object caseGraphNode(GraphNode object) {
-			return createGraphNodeAdapter();
-		}
-
-		public Object caseSimpleSemanticModelElement(
-				SimpleSemanticModelElement object) {
-			return createSimpleSemanticModelElementAdapter();
-		}
-
-		public Object caseUMASemanticModelBridge(UMASemanticModelBridge object) {
-			return createUMASemanticModelBridgeAdapter();
-		}
-
-		public Object caseCoreSemanticModelBridge(CoreSemanticModelBridge object) {
-			return createCoreSemanticModelBridgeAdapter();
-		}
-
-		public Object caseLeafElement(LeafElement object) {
-			return createLeafElementAdapter();
-		}
-
-		public Object caseTextElement(TextElement object) {
-			return createTextElementAdapter();
-		}
-
-		public Object caseImage(Image object) {
-			return createImageAdapter();
-		}
-
-		public Object caseGraphicPrimitive(GraphicPrimitive object) {
-			return createGraphicPrimitiveAdapter();
-		}
-
-		public Object casePolyline(Polyline object) {
-			return createPolylineAdapter();
-		}
-
-		public Object caseEllipse(Ellipse object) {
-			return createEllipseAdapter();
-		}
-
-		public Object caseActivity(Activity object) {
-			return createActivityAdapter();
-		}
-
-		public Object caseWorkBreakdownElement(WorkBreakdownElement object) {
-			return createWorkBreakdownElementAdapter();
-		}
-
-		public Object caseBreakdownElement(BreakdownElement object) {
-			return createBreakdownElementAdapter();
-		}
-
-		public Object caseMilestone(Milestone object) {
-			return createMilestoneAdapter();
-		}
-
-		public Object caseIteration(Iteration object) {
-			return createIterationAdapter();
-		}
-
-		public Object casePhase(Phase object) {
-			return createPhaseAdapter();
-		}
-
-		public Object caseTeamProfile(TeamProfile object) {
-			return createTeamProfileAdapter();
-		}
-
-		public Object caseRoleDescriptor(RoleDescriptor object) {
-			return createRoleDescriptorAdapter();
-		}
-
-		public Object caseWorkOrder(WorkOrder object) {
-			return createWorkOrderAdapter();
-		}
-
-		public Object caseProcessElement(ProcessElement object) {
-			return createProcessElementAdapter();
-		}
-
-		public Object casePlanningData(PlanningData object) {
-			return createPlanningDataAdapter();
-		}
-
-		public Object caseDescriptor(Descriptor object) {
-			return createDescriptorAdapter();
-		}
-
-		public Object caseWorkProductDescriptor(WorkProductDescriptor object) {
-			return createWorkProductDescriptorAdapter();
-		}
-
-		public Object caseTaskDescriptor(TaskDescriptor object) {
-			return createTaskDescriptorAdapter();
-		}
-
-		public Object caseCompositeRole(CompositeRole object) {
-			return createCompositeRoleAdapter();
-		}
-
-		public Object caseBreakdownElementDescription(
-				BreakdownElementDescription object) {
-			return createBreakdownElementDescriptionAdapter();
-		}
-
-		public Object caseActivityDescription(ActivityDescription object) {
-			return createActivityDescriptionAdapter();
-		}
-
-		public Object caseDeliveryProcessDescription(
-				DeliveryProcessDescription object) {
-			return createDeliveryProcessDescriptionAdapter();
-		}
-
-		public Object caseProcessDescription(ProcessDescription object) {
-			return createProcessDescriptionAdapter();
-		}
-
-		public Object caseDescriptorDescription(DescriptorDescription object) {
-			return createDescriptorDescriptionAdapter();
-		}
-
-		public Object caseConcept(Concept object) {
-			return createConceptAdapter();
-		}
-
-		public Object caseChecklist(Checklist object) {
-			return createChecklistAdapter();
-		}
-
-		public Object caseExample(Example object) {
-			return createExampleAdapter();
-		}
-
-		public Object caseGuideline(Guideline object) {
-			return createGuidelineAdapter();
-		}
-
-		public Object caseReport(Report object) {
-			return createReportAdapter();
-		}
-
-		public Object caseTemplate(Template object) {
-			return createTemplateAdapter();
-		}
-
-		public Object caseSupportingMaterial(SupportingMaterial object) {
-			return createSupportingMaterialAdapter();
-		}
-
-		public Object caseToolMentor(ToolMentor object) {
-			return createToolMentorAdapter();
-		}
-
-		public Object caseWhitepaper(Whitepaper object) {
-			return createWhitepaperAdapter();
-		}
-
-		public Object caseTermDefinition(TermDefinition object) {
-			return createTermDefinitionAdapter();
-		}
-
-		public Object casePractice(Practice object) {
-			return createPracticeAdapter();
-		}
-
-		public Object caseEstimationConsiderations(
-				EstimationConsiderations object) {
-			return createEstimationConsiderationsAdapter();
-		}
-
-		public Object caseReusableAsset(ReusableAsset object) {
-			return createReusableAssetAdapter();
-		}
-
-		public Object caseState(State object) {
-			return createStateAdapter();
-		}
-
-		public Object caseVertex(Vertex object) {
-			return createVertexAdapter();
-		}
-
-		public Object caseRegion(Region object) {
-			return createRegionAdapter();
-		}
-
-		public Object caseStateMachine(StateMachine object) {
-			return createStateMachineAdapter();
-		}
-
-		public Object caseTransition(Transition object) {
-			return createTransitionAdapter();
-		}
-
-		public Object casePseudoState(PseudoState object) {
-			return createPseudoStateAdapter();
-		}
-
-		public Object caseDiscipline(Discipline object) {
-			return createDisciplineAdapter();
-		}
-
-		public Object caseContentCategory(ContentCategory object) {
-			return createContentCategoryAdapter();
-		}
-
-		public Object caseRoleSet(RoleSet object) {
-			return createRoleSetAdapter();
-		}
-
-		public Object caseDomain(Domain object) {
-			return createDomainAdapter();
-		}
-
-		public Object caseWorkProductType(WorkProductType object) {
-			return createWorkProductTypeAdapter();
-		}
-
-		public Object caseDisciplineGrouping(DisciplineGrouping object) {
-			return createDisciplineGroupingAdapter();
-		}
-
-		public Object caseTool(Tool object) {
-			return createToolAdapter();
-		}
-
-		public Object caseRoleSetGrouping(RoleSetGrouping object) {
-			return createRoleSetGroupingAdapter();
-		}
-
-		public Object caseCustomCategory(CustomCategory object) {
-			return createCustomCategoryAdapter();
-		}
-
-		public Object caseDeliveryProcess(DeliveryProcess object) {
-			return createDeliveryProcessAdapter();
-		}
-
-		public Object caseProcess(org.eclipse.epf.uma.Process object) {
-			return createProcessAdapter();
-		}
-
-		public Object caseCapabilityPattern(CapabilityPattern object) {
-			return createCapabilityPatternAdapter();
-		}
-
-		public Object caseProcessPlanningTemplate(ProcessPlanningTemplate object) {
-			return createProcessPlanningTemplateAdapter();
-		}
-
-		public Object caseRoadmap(Roadmap object) {
-			return createRoadmapAdapter();
-		}
-
-		public Object caseProcessComponent(ProcessComponent object) {
-			return createProcessComponentAdapter();
-		}
-
-		public Object caseProcessPackage(ProcessPackage object) {
-			return createProcessPackageAdapter();
-		}
-
-		public Object caseProcessComponentInterface(
-				ProcessComponentInterface object) {
-			return createProcessComponentInterfaceAdapter();
-		}
-
-		public Object caseProcessComponentDescriptor(
-				ProcessComponentDescriptor object) {
-			return createProcessComponentDescriptorAdapter();
-		}
-
-		public Object caseMethodPlugin(MethodPlugin object) {
-			return createMethodPluginAdapter();
-		}
-
-		public Object caseVariabilityElement(VariabilityElement object) {
-			return createVariabilityElementAdapter();
-		}
-
-		public Object caseMethodUnit(MethodUnit object) {
-			return createMethodUnitAdapter();
-		}
-
-		public Object caseMethodConfiguration(MethodConfiguration object) {
-			return createMethodConfigurationAdapter();
-		}
-
-		public Object caseProcessFamily(ProcessFamily object) {
-			return createProcessFamilyAdapter();
-		}
-
-		public Object caseMethodLibrary(MethodLibrary object) {
-			return createMethodLibraryAdapter();
-		}
-
-		public Object 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
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter) modelSwitch.doSwitch((EObject) target);
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Classifier <em>Classifier</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.epf.uma.Classifier
-	 * @generated
-	 */
-	public Adapter createClassifierAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Type <em>Type</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.epf.uma.Type
-	 * @generated
-	 */
-	public Adapter createTypeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Element <em>Element</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.epf.uma.Element
-	 * @generated
-	 */
-	public Adapter createElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.NamedElement <em>Named Element</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.epf.uma.NamedElement
-	 * @generated
-	 */
-	public Adapter createNamedElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.PackageableElement <em>Packageable Element</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.epf.uma.PackageableElement
-	 * @generated
-	 */
-	public Adapter createPackageableElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Package <em>Package</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.epf.uma.Package
-	 * @generated
-	 */
-	public Adapter createPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Namespace <em>Namespace</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.epf.uma.Namespace
-	 * @generated
-	 */
-	public Adapter createNamespaceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.MethodElement <em>Method Element</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.epf.uma.MethodElement
-	 * @generated
-	 */
-	public Adapter createMethodElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Constraint <em>Constraint</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.epf.uma.Constraint
-	 * @generated
-	 */
-	public Adapter createConstraintAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.MethodElementProperty <em>Method Element Property</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.epf.uma.MethodElementProperty
-	 * @generated
-	 */
-	public Adapter createMethodElementPropertyAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ContentElement <em>Content Element</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.epf.uma.ContentElement
-	 * @generated
-	 */
-	public Adapter createContentElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DescribableElement <em>Describable Element</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.epf.uma.DescribableElement
-	 * @generated
-	 */
-	public Adapter createDescribableElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ContentDescription <em>Content Description</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.epf.uma.ContentDescription
-	 * @generated
-	 */
-	public Adapter createContentDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Section <em>Section</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.epf.uma.Section
-	 * @generated
-	 */
-	public Adapter createSectionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Role <em>Role</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.epf.uma.Role
-	 * @generated
-	 */
-	public Adapter createRoleAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.WorkProduct <em>Work Product</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.epf.uma.WorkProduct
-	 * @generated
-	 */
-	public Adapter createWorkProductAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Task <em>Task</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.epf.uma.Task
-	 * @generated
-	 */
-	public Adapter createTaskAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.WorkDefinition <em>Work Definition</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.epf.uma.WorkDefinition
-	 * @generated
-	 */
-	public Adapter createWorkDefinitionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Step <em>Step</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.epf.uma.Step
-	 * @generated
-	 */
-	public Adapter createStepAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Guidance <em>Guidance</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.epf.uma.Guidance
-	 * @generated
-	 */
-	public Adapter createGuidanceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Artifact <em>Artifact</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.epf.uma.Artifact
-	 * @generated
-	 */
-	public Adapter createArtifactAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Deliverable <em>Deliverable</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.epf.uma.Deliverable
-	 * @generated
-	 */
-	public Adapter createDeliverableAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Outcome <em>Outcome</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.epf.uma.Outcome
-	 * @generated
-	 */
-	public Adapter createOutcomeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.MethodPackage <em>Method Package</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.epf.uma.MethodPackage
-	 * @generated
-	 */
-	public Adapter createMethodPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ContentPackage <em>Content Package</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.epf.uma.ContentPackage
-	 * @generated
-	 */
-	public Adapter createContentPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ArtifactDescription <em>Artifact Description</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.epf.uma.ArtifactDescription
-	 * @generated
-	 */
-	public Adapter createArtifactDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.WorkProductDescription <em>Work Product Description</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.epf.uma.WorkProductDescription
-	 * @generated
-	 */
-	public Adapter createWorkProductDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DeliverableDescription <em>Deliverable Description</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.epf.uma.DeliverableDescription
-	 * @generated
-	 */
-	public Adapter createDeliverableDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.RoleDescription <em>Role Description</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.epf.uma.RoleDescription
-	 * @generated
-	 */
-	public Adapter createRoleDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.TaskDescription <em>Task Description</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.epf.uma.TaskDescription
-	 * @generated
-	 */
-	public Adapter createTaskDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.GuidanceDescription <em>Guidance Description</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.epf.uma.GuidanceDescription
-	 * @generated
-	 */
-	public Adapter createGuidanceDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.PracticeDescription <em>Practice Description</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.epf.uma.PracticeDescription
-	 * @generated
-	 */
-	public Adapter createPracticeDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Point <em>Point</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.epf.uma.Point
-	 * @generated
-	 */
-	public Adapter createPointAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.GraphElement <em>Graph Element</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.epf.uma.GraphElement
-	 * @generated
-	 */
-	public Adapter createGraphElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DiagramElement <em>Diagram Element</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.epf.uma.DiagramElement
-	 * @generated
-	 */
-	public Adapter createDiagramElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DiagramLink <em>Diagram Link</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.epf.uma.DiagramLink
-	 * @generated
-	 */
-	public Adapter createDiagramLinkAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.GraphConnector <em>Graph Connector</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.epf.uma.GraphConnector
-	 * @generated
-	 */
-	public Adapter createGraphConnectorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.SemanticModelBridge <em>Semantic Model Bridge</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.epf.uma.SemanticModelBridge
-	 * @generated
-	 */
-	public Adapter createSemanticModelBridgeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Dimension <em>Dimension</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.epf.uma.Dimension
-	 * @generated
-	 */
-	public Adapter createDimensionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Reference <em>Reference</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.epf.uma.Reference
-	 * @generated
-	 */
-	public Adapter createReferenceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Property <em>Property</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.epf.uma.Property
-	 * @generated
-	 */
-	public Adapter createPropertyAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.GraphEdge <em>Graph Edge</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.epf.uma.GraphEdge
-	 * @generated
-	 */
-	public Adapter createGraphEdgeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Diagram <em>Diagram</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.epf.uma.Diagram
-	 * @generated
-	 */
-	public Adapter createDiagramAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.GraphNode <em>Graph Node</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.epf.uma.GraphNode
-	 * @generated
-	 */
-	public Adapter createGraphNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.SimpleSemanticModelElement <em>Simple Semantic Model Element</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.epf.uma.SimpleSemanticModelElement
-	 * @generated
-	 */
-	public Adapter createSimpleSemanticModelElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.UMASemanticModelBridge <em>UMA Semantic Model Bridge</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.epf.uma.UMASemanticModelBridge
-	 * @generated
-	 */
-	public Adapter createUMASemanticModelBridgeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.CoreSemanticModelBridge <em>Core Semantic Model Bridge</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.epf.uma.CoreSemanticModelBridge
-	 * @generated
-	 */
-	public Adapter createCoreSemanticModelBridgeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.LeafElement <em>Leaf Element</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.epf.uma.LeafElement
-	 * @generated
-	 */
-	public Adapter createLeafElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.TextElement <em>Text Element</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.epf.uma.TextElement
-	 * @generated
-	 */
-	public Adapter createTextElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Image <em>Image</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.epf.uma.Image
-	 * @generated
-	 */
-	public Adapter createImageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.GraphicPrimitive <em>Graphic Primitive</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.epf.uma.GraphicPrimitive
-	 * @generated
-	 */
-	public Adapter createGraphicPrimitiveAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Polyline <em>Polyline</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.epf.uma.Polyline
-	 * @generated
-	 */
-	public Adapter createPolylineAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Ellipse <em>Ellipse</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.epf.uma.Ellipse
-	 * @generated
-	 */
-	public Adapter createEllipseAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Activity <em>Activity</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.epf.uma.Activity
-	 * @generated
-	 */
-	public Adapter createActivityAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.WorkBreakdownElement <em>Work Breakdown Element</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.epf.uma.WorkBreakdownElement
-	 * @generated
-	 */
-	public Adapter createWorkBreakdownElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.BreakdownElement <em>Breakdown Element</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.epf.uma.BreakdownElement
-	 * @generated
-	 */
-	public Adapter createBreakdownElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Milestone <em>Milestone</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.epf.uma.Milestone
-	 * @generated
-	 */
-	public Adapter createMilestoneAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Iteration <em>Iteration</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.epf.uma.Iteration
-	 * @generated
-	 */
-	public Adapter createIterationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Phase <em>Phase</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.epf.uma.Phase
-	 * @generated
-	 */
-	public Adapter createPhaseAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.TeamProfile <em>Team Profile</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.epf.uma.TeamProfile
-	 * @generated
-	 */
-	public Adapter createTeamProfileAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.RoleDescriptor <em>Role Descriptor</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.epf.uma.RoleDescriptor
-	 * @generated
-	 */
-	public Adapter createRoleDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.WorkOrder <em>Work Order</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.epf.uma.WorkOrder
-	 * @generated
-	 */
-	public Adapter createWorkOrderAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessElement <em>Process Element</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.epf.uma.ProcessElement
-	 * @generated
-	 */
-	public Adapter createProcessElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.PlanningData <em>Planning Data</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.epf.uma.PlanningData
-	 * @generated
-	 */
-	public Adapter createPlanningDataAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Descriptor <em>Descriptor</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.epf.uma.Descriptor
-	 * @generated
-	 */
-	public Adapter createDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.TaskDescriptor <em>Task Descriptor</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.epf.uma.TaskDescriptor
-	 * @generated
-	 */
-	public Adapter createTaskDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.WorkProductDescriptor <em>Work Product Descriptor</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.epf.uma.WorkProductDescriptor
-	 * @generated
-	 */
-	public Adapter createWorkProductDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.CompositeRole <em>Composite Role</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.epf.uma.CompositeRole
-	 * @generated
-	 */
-	public Adapter createCompositeRoleAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.BreakdownElementDescription <em>Breakdown Element Description</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.epf.uma.BreakdownElementDescription
-	 * @generated
-	 */
-	public Adapter createBreakdownElementDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ActivityDescription <em>Activity Description</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.epf.uma.ActivityDescription
-	 * @generated
-	 */
-	public Adapter createActivityDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DeliveryProcessDescription <em>Delivery Process Description</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.epf.uma.DeliveryProcessDescription
-	 * @generated
-	 */
-	public Adapter createDeliveryProcessDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessDescription <em>Process Description</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.epf.uma.ProcessDescription
-	 * @generated
-	 */
-	public Adapter createProcessDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DescriptorDescription <em>Descriptor Description</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.epf.uma.DescriptorDescription
-	 * @generated
-	 */
-	public Adapter createDescriptorDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Concept <em>Concept</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.epf.uma.Concept
-	 * @generated
-	 */
-	public Adapter createConceptAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Checklist <em>Checklist</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.epf.uma.Checklist
-	 * @generated
-	 */
-	public Adapter createChecklistAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Example <em>Example</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.epf.uma.Example
-	 * @generated
-	 */
-	public Adapter createExampleAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Guideline <em>Guideline</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.epf.uma.Guideline
-	 * @generated
-	 */
-	public Adapter createGuidelineAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.EstimationConsiderations <em>Estimation Considerations</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.epf.uma.EstimationConsiderations
-	 * @generated
-	 */
-	public Adapter createEstimationConsiderationsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Report <em>Report</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.epf.uma.Report
-	 * @generated
-	 */
-	public Adapter createReportAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Template <em>Template</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.epf.uma.Template
-	 * @generated
-	 */
-	public Adapter createTemplateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.SupportingMaterial <em>Supporting Material</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.epf.uma.SupportingMaterial
-	 * @generated
-	 */
-	public Adapter createSupportingMaterialAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ToolMentor <em>Tool Mentor</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.epf.uma.ToolMentor
-	 * @generated
-	 */
-	public Adapter createToolMentorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Whitepaper <em>Whitepaper</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.epf.uma.Whitepaper
-	 * @generated
-	 */
-	public Adapter createWhitepaperAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.TermDefinition <em>Term Definition</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.epf.uma.TermDefinition
-	 * @generated
-	 */
-	public Adapter createTermDefinitionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Practice <em>Practice</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.epf.uma.Practice
-	 * @generated
-	 */
-	public Adapter createPracticeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ReusableAsset <em>Reusable Asset</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.epf.uma.ReusableAsset
-	 * @generated
-	 */
-	public Adapter createReusableAssetAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.State <em>State</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.epf.uma.State
-	 * @generated
-	 */
-	public Adapter createStateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Vertex <em>Vertex</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.epf.uma.Vertex
-	 * @generated
-	 */
-	public Adapter createVertexAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Region <em>Region</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.epf.uma.Region
-	 * @generated
-	 */
-	public Adapter createRegionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.StateMachine <em>State Machine</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.epf.uma.StateMachine
-	 * @generated
-	 */
-	public Adapter createStateMachineAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Transition <em>Transition</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.epf.uma.Transition
-	 * @generated
-	 */
-	public Adapter createTransitionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.PseudoState <em>Pseudo State</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.epf.uma.PseudoState
-	 * @generated
-	 */
-	public Adapter createPseudoStateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Discipline <em>Discipline</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.epf.uma.Discipline
-	 * @generated
-	 */
-	public Adapter createDisciplineAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ContentCategory <em>Content Category</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.epf.uma.ContentCategory
-	 * @generated
-	 */
-	public Adapter createContentCategoryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.RoleSet <em>Role Set</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.epf.uma.RoleSet
-	 * @generated
-	 */
-	public Adapter createRoleSetAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Domain <em>Domain</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.epf.uma.Domain
-	 * @generated
-	 */
-	public Adapter createDomainAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.WorkProductType <em>Work Product Type</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.epf.uma.WorkProductType
-	 * @generated
-	 */
-	public Adapter createWorkProductTypeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DisciplineGrouping <em>Discipline Grouping</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.epf.uma.DisciplineGrouping
-	 * @generated
-	 */
-	public Adapter createDisciplineGroupingAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Tool <em>Tool</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.epf.uma.Tool
-	 * @generated
-	 */
-	public Adapter createToolAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.RoleSetGrouping <em>Role Set Grouping</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.epf.uma.RoleSetGrouping
-	 * @generated
-	 */
-	public Adapter createRoleSetGroupingAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.CustomCategory <em>Custom Category</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.epf.uma.CustomCategory
-	 * @generated
-	 */
-	public Adapter createCustomCategoryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.DeliveryProcess <em>Delivery Process</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.epf.uma.DeliveryProcess
-	 * @generated
-	 */
-	public Adapter createDeliveryProcessAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Process <em>Process</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.epf.uma.Process
-	 * @generated
-	 */
-	public Adapter createProcessAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.CapabilityPattern <em>Capability Pattern</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.epf.uma.CapabilityPattern
-	 * @generated
-	 */
-	public Adapter createCapabilityPatternAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessPlanningTemplate <em>Process Planning Template</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.epf.uma.ProcessPlanningTemplate
-	 * @generated
-	 */
-	public Adapter createProcessPlanningTemplateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.Roadmap <em>Roadmap</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.epf.uma.Roadmap
-	 * @generated
-	 */
-	public Adapter createRoadmapAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessComponent <em>Process Component</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.epf.uma.ProcessComponent
-	 * @generated
-	 */
-	public Adapter createProcessComponentAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessPackage <em>Process Package</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.epf.uma.ProcessPackage
-	 * @generated
-	 */
-	public Adapter createProcessPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessComponentInterface <em>Process Component Interface</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.epf.uma.ProcessComponentInterface
-	 * @generated
-	 */
-	public Adapter createProcessComponentInterfaceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessComponentDescriptor <em>Process Component Descriptor</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.epf.uma.ProcessComponentDescriptor
-	 * @generated
-	 */
-	public Adapter createProcessComponentDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.MethodPlugin <em>Method Plugin</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.epf.uma.MethodPlugin
-	 * @generated
-	 */
-	public Adapter createMethodPluginAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.VariabilityElement <em>Variability Element</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.epf.uma.VariabilityElement
-	 * @generated
-	 */
-	public Adapter createVariabilityElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.MethodUnit <em>Method Unit</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.epf.uma.MethodUnit
-	 * @generated
-	 */
-	public Adapter createMethodUnitAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.MethodConfiguration <em>Method 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.epf.uma.MethodConfiguration
-	 * @generated
-	 */
-	public Adapter createMethodConfigurationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.ProcessFamily <em>Process Family</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.epf.uma.ProcessFamily
-	 * @generated
-	 */
-	public Adapter createProcessFamilyAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.uma.MethodLibrary <em>Method Library</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.epf.uma.MethodLibrary
-	 * @generated
-	 */
-	public Adapter createMethodLibraryAdapter() {
-		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;
-	}
-
-} //UmaAdapterFactory
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaResources.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaResources.java
deleted file mode 100644
index 5afc847..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaResources.java
+++ /dev/null
@@ -1,38 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.util;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The UMA resource bundle.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public final class UmaResources extends NLS {
-
-	private static String BUNDLE_NAME = UmaResources.class.getPackage()
-			.getName()
-			+ ".Resources"; //$NON-NLS-1$
-
-	private UmaResources() {
-		// Do not instantiate
-	}
-
-	public static String copyright;
-
-	public static String err_cannotModify0;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, UmaResources.class);
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaSwitch.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaSwitch.java
deleted file mode 100644
index f6d5d72..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaSwitch.java
+++ /dev/null
@@ -1,4460 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.ActivityDescription;
-import org.eclipse.epf.uma.Artifact;
-import org.eclipse.epf.uma.ArtifactDescription;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.BreakdownElementDescription;
-import org.eclipse.epf.uma.CapabilityPattern;
-import org.eclipse.epf.uma.Checklist;
-import org.eclipse.epf.uma.Classifier;
-import org.eclipse.epf.uma.CompositeRole;
-import org.eclipse.epf.uma.Concept;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.ContentCategory;
-import org.eclipse.epf.uma.ContentDescription;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CoreSemanticModelBridge;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.Deliverable;
-import org.eclipse.epf.uma.DeliverableDescription;
-import org.eclipse.epf.uma.DeliveryProcess;
-import org.eclipse.epf.uma.DeliveryProcessDescription;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.Descriptor;
-import org.eclipse.epf.uma.DescriptorDescription;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.DiagramLink;
-import org.eclipse.epf.uma.Dimension;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Element;
-import org.eclipse.epf.uma.Ellipse;
-import org.eclipse.epf.uma.EstimationConsiderations;
-import org.eclipse.epf.uma.Example;
-import org.eclipse.epf.uma.GraphConnector;
-import org.eclipse.epf.uma.GraphEdge;
-import org.eclipse.epf.uma.GraphElement;
-import org.eclipse.epf.uma.GraphNode;
-import org.eclipse.epf.uma.GraphicPrimitive;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.GuidanceDescription;
-import org.eclipse.epf.uma.Guideline;
-import org.eclipse.epf.uma.Image;
-import org.eclipse.epf.uma.Iteration;
-import org.eclipse.epf.uma.LeafElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodElementProperty;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Namespace;
-import org.eclipse.epf.uma.Outcome;
-import org.eclipse.epf.uma.PackageableElement;
-import org.eclipse.epf.uma.Phase;
-import org.eclipse.epf.uma.PlanningData;
-import org.eclipse.epf.uma.Point;
-import org.eclipse.epf.uma.Polyline;
-import org.eclipse.epf.uma.Practice;
-import org.eclipse.epf.uma.PracticeDescription;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessComponentDescriptor;
-import org.eclipse.epf.uma.ProcessComponentInterface;
-import org.eclipse.epf.uma.ProcessDescription;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessFamily;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.uma.Property;
-import org.eclipse.epf.uma.PseudoState;
-import org.eclipse.epf.uma.Reference;
-import org.eclipse.epf.uma.Region;
-import org.eclipse.epf.uma.Report;
-import org.eclipse.epf.uma.ReusableAsset;
-import org.eclipse.epf.uma.Roadmap;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleDescription;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Section;
-import org.eclipse.epf.uma.SemanticModelBridge;
-import org.eclipse.epf.uma.SimpleSemanticModelElement;
-import org.eclipse.epf.uma.State;
-import org.eclipse.epf.uma.StateMachine;
-import org.eclipse.epf.uma.Step;
-import org.eclipse.epf.uma.SupportingMaterial;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.TaskDescription;
-import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.Template;
-import org.eclipse.epf.uma.TermDefinition;
-import org.eclipse.epf.uma.TextElement;
-import org.eclipse.epf.uma.Tool;
-import org.eclipse.epf.uma.ToolMentor;
-import org.eclipse.epf.uma.Transition;
-import org.eclipse.epf.uma.Type;
-import org.eclipse.epf.uma.UMASemanticModelBridge;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.Vertex;
-import org.eclipse.epf.uma.Whitepaper;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkDefinition;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductDescription;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.uma.WorkProductType;
-
-import org.eclipse.epf.uma.*;
-
-/**
- * <!-- 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.epf.uma.UmaPackage
- * @generated
- */
-public class UmaSwitch {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static UmaPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaSwitch() {
-		if (modelPackage == null) {
-			modelPackage = UmaPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		} else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return eSuperTypes.isEmpty() ? defaultCase(theEObject) : doSwitch(
-					(EClass) eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-		case UmaPackage.CLASSIFIER: {
-			Classifier classifier = (Classifier) theEObject;
-			Object result = caseClassifier(classifier);
-			if (result == null)
-				result = caseType(classifier);
-			if (result == null)
-				result = casePackageableElement(classifier);
-			if (result == null)
-				result = caseNamedElement(classifier);
-			if (result == null)
-				result = caseElement(classifier);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TYPE: {
-			Type type = (Type) theEObject;
-			Object result = caseType(type);
-			if (result == null)
-				result = casePackageableElement(type);
-			if (result == null)
-				result = caseNamedElement(type);
-			if (result == null)
-				result = caseElement(type);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ELEMENT: {
-			Element element = (Element) theEObject;
-			Object result = caseElement(element);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.NAMED_ELEMENT: {
-			NamedElement namedElement = (NamedElement) theEObject;
-			Object result = caseNamedElement(namedElement);
-			if (result == null)
-				result = caseElement(namedElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PACKAGEABLE_ELEMENT: {
-			PackageableElement packageableElement = (PackageableElement) theEObject;
-			Object result = casePackageableElement(packageableElement);
-			if (result == null)
-				result = caseNamedElement(packageableElement);
-			if (result == null)
-				result = caseElement(packageableElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PACKAGE: {
-			org.eclipse.epf.uma.Package package_ = (org.eclipse.epf.uma.Package) theEObject;
-			Object result = casePackage(package_);
-			if (result == null)
-				result = caseNamespace(package_);
-			if (result == null)
-				result = casePackageableElement(package_);
-			if (result == null)
-				result = caseNamedElement(package_);
-			if (result == null)
-				result = caseElement(package_);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.NAMESPACE: {
-			Namespace namespace = (Namespace) theEObject;
-			Object result = caseNamespace(namespace);
-			if (result == null)
-				result = caseNamedElement(namespace);
-			if (result == null)
-				result = caseElement(namespace);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.METHOD_ELEMENT: {
-			MethodElement methodElement = (MethodElement) theEObject;
-			Object result = caseMethodElement(methodElement);
-			if (result == null)
-				result = casePackageableElement(methodElement);
-			if (result == null)
-				result = caseNamedElement(methodElement);
-			if (result == null)
-				result = caseElement(methodElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CONSTRAINT: {
-			Constraint constraint = (Constraint) theEObject;
-			Object result = caseConstraint(constraint);
-			if (result == null)
-				result = caseMethodElement(constraint);
-			if (result == null)
-				result = casePackageableElement(constraint);
-			if (result == null)
-				result = caseNamedElement(constraint);
-			if (result == null)
-				result = caseElement(constraint);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.METHOD_ELEMENT_PROPERTY: {
-			MethodElementProperty methodElementProperty = (MethodElementProperty) theEObject;
-			Object result = caseMethodElementProperty(methodElementProperty);
-			if (result == null)
-				result = casePackageableElement(methodElementProperty);
-			if (result == null)
-				result = caseNamedElement(methodElementProperty);
-			if (result == null)
-				result = caseElement(methodElementProperty);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CONTENT_ELEMENT: {
-			ContentElement contentElement = (ContentElement) theEObject;
-			Object result = caseContentElement(contentElement);
-			if (result == null)
-				result = caseDescribableElement(contentElement);
-			if (result == null)
-				result = caseVariabilityElement(contentElement);
-			if (result == null)
-				result = caseMethodElement(contentElement);
-			if (result == null)
-				result = caseClassifier(contentElement);
-			if (result == null)
-				result = casePackageableElement(contentElement);
-			if (result == null)
-				result = caseType(contentElement);
-			if (result == null)
-				result = caseNamedElement(contentElement);
-			if (result == null)
-				result = caseElement(contentElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DESCRIBABLE_ELEMENT: {
-			DescribableElement describableElement = (DescribableElement) theEObject;
-			Object result = caseDescribableElement(describableElement);
-			if (result == null)
-				result = caseMethodElement(describableElement);
-			if (result == null)
-				result = caseClassifier(describableElement);
-			if (result == null)
-				result = casePackageableElement(describableElement);
-			if (result == null)
-				result = caseType(describableElement);
-			if (result == null)
-				result = caseNamedElement(describableElement);
-			if (result == null)
-				result = caseElement(describableElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CONTENT_DESCRIPTION: {
-			ContentDescription contentDescription = (ContentDescription) theEObject;
-			Object result = caseContentDescription(contentDescription);
-			if (result == null)
-				result = caseMethodUnit(contentDescription);
-			if (result == null)
-				result = caseMethodElement(contentDescription);
-			if (result == null)
-				result = casePackageableElement(contentDescription);
-			if (result == null)
-				result = caseNamedElement(contentDescription);
-			if (result == null)
-				result = caseElement(contentDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.SECTION: {
-			Section section = (Section) theEObject;
-			Object result = caseSection(section);
-			if (result == null)
-				result = caseVariabilityElement(section);
-			if (result == null)
-				result = caseMethodElement(section);
-			if (result == null)
-				result = casePackageableElement(section);
-			if (result == null)
-				result = caseNamedElement(section);
-			if (result == null)
-				result = caseElement(section);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ROLE: {
-			Role role = (Role) theEObject;
-			Object result = caseRole(role);
-			if (result == null)
-				result = caseContentElement(role);
-			if (result == null)
-				result = caseDescribableElement(role);
-			if (result == null)
-				result = caseVariabilityElement(role);
-			if (result == null)
-				result = caseMethodElement(role);
-			if (result == null)
-				result = caseClassifier(role);
-			if (result == null)
-				result = casePackageableElement(role);
-			if (result == null)
-				result = caseType(role);
-			if (result == null)
-				result = caseNamedElement(role);
-			if (result == null)
-				result = caseElement(role);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WORK_PRODUCT: {
-			WorkProduct workProduct = (WorkProduct) theEObject;
-			Object result = caseWorkProduct(workProduct);
-			if (result == null)
-				result = caseContentElement(workProduct);
-			if (result == null)
-				result = caseDescribableElement(workProduct);
-			if (result == null)
-				result = caseVariabilityElement(workProduct);
-			if (result == null)
-				result = caseMethodElement(workProduct);
-			if (result == null)
-				result = caseClassifier(workProduct);
-			if (result == null)
-				result = casePackageableElement(workProduct);
-			if (result == null)
-				result = caseType(workProduct);
-			if (result == null)
-				result = caseNamedElement(workProduct);
-			if (result == null)
-				result = caseElement(workProduct);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TASK: {
-			Task task = (Task) theEObject;
-			Object result = caseTask(task);
-			if (result == null)
-				result = caseContentElement(task);
-			if (result == null)
-				result = caseWorkDefinition(task);
-			if (result == null)
-				result = caseDescribableElement(task);
-			if (result == null)
-				result = caseVariabilityElement(task);
-			if (result == null)
-				result = caseMethodElement(task);
-			if (result == null)
-				result = caseClassifier(task);
-			if (result == null)
-				result = casePackageableElement(task);
-			if (result == null)
-				result = caseType(task);
-			if (result == null)
-				result = caseNamedElement(task);
-			if (result == null)
-				result = caseElement(task);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WORK_DEFINITION: {
-			WorkDefinition workDefinition = (WorkDefinition) theEObject;
-			Object result = caseWorkDefinition(workDefinition);
-			if (result == null)
-				result = caseMethodElement(workDefinition);
-			if (result == null)
-				result = casePackageableElement(workDefinition);
-			if (result == null)
-				result = caseNamedElement(workDefinition);
-			if (result == null)
-				result = caseElement(workDefinition);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.STEP: {
-			Step step = (Step) theEObject;
-			Object result = caseStep(step);
-			if (result == null)
-				result = caseSection(step);
-			if (result == null)
-				result = caseWorkDefinition(step);
-			if (result == null)
-				result = caseVariabilityElement(step);
-			if (result == null)
-				result = caseMethodElement(step);
-			if (result == null)
-				result = casePackageableElement(step);
-			if (result == null)
-				result = caseNamedElement(step);
-			if (result == null)
-				result = caseElement(step);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GUIDANCE: {
-			Guidance guidance = (Guidance) theEObject;
-			Object result = caseGuidance(guidance);
-			if (result == null)
-				result = caseContentElement(guidance);
-			if (result == null)
-				result = caseDescribableElement(guidance);
-			if (result == null)
-				result = caseVariabilityElement(guidance);
-			if (result == null)
-				result = caseMethodElement(guidance);
-			if (result == null)
-				result = caseClassifier(guidance);
-			if (result == null)
-				result = casePackageableElement(guidance);
-			if (result == null)
-				result = caseType(guidance);
-			if (result == null)
-				result = caseNamedElement(guidance);
-			if (result == null)
-				result = caseElement(guidance);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ARTIFACT: {
-			Artifact artifact = (Artifact) theEObject;
-			Object result = caseArtifact(artifact);
-			if (result == null)
-				result = caseWorkProduct(artifact);
-			if (result == null)
-				result = caseContentElement(artifact);
-			if (result == null)
-				result = caseDescribableElement(artifact);
-			if (result == null)
-				result = caseVariabilityElement(artifact);
-			if (result == null)
-				result = caseMethodElement(artifact);
-			if (result == null)
-				result = caseClassifier(artifact);
-			if (result == null)
-				result = casePackageableElement(artifact);
-			if (result == null)
-				result = caseType(artifact);
-			if (result == null)
-				result = caseNamedElement(artifact);
-			if (result == null)
-				result = caseElement(artifact);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DELIVERABLE: {
-			Deliverable deliverable = (Deliverable) theEObject;
-			Object result = caseDeliverable(deliverable);
-			if (result == null)
-				result = caseWorkProduct(deliverable);
-			if (result == null)
-				result = caseContentElement(deliverable);
-			if (result == null)
-				result = caseDescribableElement(deliverable);
-			if (result == null)
-				result = caseVariabilityElement(deliverable);
-			if (result == null)
-				result = caseMethodElement(deliverable);
-			if (result == null)
-				result = caseClassifier(deliverable);
-			if (result == null)
-				result = casePackageableElement(deliverable);
-			if (result == null)
-				result = caseType(deliverable);
-			if (result == null)
-				result = caseNamedElement(deliverable);
-			if (result == null)
-				result = caseElement(deliverable);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.OUTCOME: {
-			Outcome outcome = (Outcome) theEObject;
-			Object result = caseOutcome(outcome);
-			if (result == null)
-				result = caseWorkProduct(outcome);
-			if (result == null)
-				result = caseContentElement(outcome);
-			if (result == null)
-				result = caseDescribableElement(outcome);
-			if (result == null)
-				result = caseVariabilityElement(outcome);
-			if (result == null)
-				result = caseMethodElement(outcome);
-			if (result == null)
-				result = caseClassifier(outcome);
-			if (result == null)
-				result = casePackageableElement(outcome);
-			if (result == null)
-				result = caseType(outcome);
-			if (result == null)
-				result = caseNamedElement(outcome);
-			if (result == null)
-				result = caseElement(outcome);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.METHOD_PACKAGE: {
-			MethodPackage methodPackage = (MethodPackage) theEObject;
-			Object result = caseMethodPackage(methodPackage);
-			if (result == null)
-				result = caseMethodElement(methodPackage);
-			if (result == null)
-				result = casePackage(methodPackage);
-			if (result == null)
-				result = casePackageableElement(methodPackage);
-			if (result == null)
-				result = caseNamespace(methodPackage);
-			if (result == null)
-				result = caseNamedElement(methodPackage);
-			if (result == null)
-				result = caseElement(methodPackage);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CONTENT_PACKAGE: {
-			ContentPackage contentPackage = (ContentPackage) theEObject;
-			Object result = caseContentPackage(contentPackage);
-			if (result == null)
-				result = caseMethodPackage(contentPackage);
-			if (result == null)
-				result = caseMethodElement(contentPackage);
-			if (result == null)
-				result = casePackage(contentPackage);
-			if (result == null)
-				result = casePackageableElement(contentPackage);
-			if (result == null)
-				result = caseNamespace(contentPackage);
-			if (result == null)
-				result = caseNamedElement(contentPackage);
-			if (result == null)
-				result = caseElement(contentPackage);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ARTIFACT_DESCRIPTION: {
-			ArtifactDescription artifactDescription = (ArtifactDescription) theEObject;
-			Object result = caseArtifactDescription(artifactDescription);
-			if (result == null)
-				result = caseWorkProductDescription(artifactDescription);
-			if (result == null)
-				result = caseContentDescription(artifactDescription);
-			if (result == null)
-				result = caseMethodUnit(artifactDescription);
-			if (result == null)
-				result = caseMethodElement(artifactDescription);
-			if (result == null)
-				result = casePackageableElement(artifactDescription);
-			if (result == null)
-				result = caseNamedElement(artifactDescription);
-			if (result == null)
-				result = caseElement(artifactDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WORK_PRODUCT_DESCRIPTION: {
-			WorkProductDescription workProductDescription = (WorkProductDescription) theEObject;
-			Object result = caseWorkProductDescription(workProductDescription);
-			if (result == null)
-				result = caseContentDescription(workProductDescription);
-			if (result == null)
-				result = caseMethodUnit(workProductDescription);
-			if (result == null)
-				result = caseMethodElement(workProductDescription);
-			if (result == null)
-				result = casePackageableElement(workProductDescription);
-			if (result == null)
-				result = caseNamedElement(workProductDescription);
-			if (result == null)
-				result = caseElement(workProductDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DELIVERABLE_DESCRIPTION: {
-			DeliverableDescription deliverableDescription = (DeliverableDescription) theEObject;
-			Object result = caseDeliverableDescription(deliverableDescription);
-			if (result == null)
-				result = caseWorkProductDescription(deliverableDescription);
-			if (result == null)
-				result = caseContentDescription(deliverableDescription);
-			if (result == null)
-				result = caseMethodUnit(deliverableDescription);
-			if (result == null)
-				result = caseMethodElement(deliverableDescription);
-			if (result == null)
-				result = casePackageableElement(deliverableDescription);
-			if (result == null)
-				result = caseNamedElement(deliverableDescription);
-			if (result == null)
-				result = caseElement(deliverableDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ROLE_DESCRIPTION: {
-			RoleDescription roleDescription = (RoleDescription) theEObject;
-			Object result = caseRoleDescription(roleDescription);
-			if (result == null)
-				result = caseContentDescription(roleDescription);
-			if (result == null)
-				result = caseMethodUnit(roleDescription);
-			if (result == null)
-				result = caseMethodElement(roleDescription);
-			if (result == null)
-				result = casePackageableElement(roleDescription);
-			if (result == null)
-				result = caseNamedElement(roleDescription);
-			if (result == null)
-				result = caseElement(roleDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TASK_DESCRIPTION: {
-			TaskDescription taskDescription = (TaskDescription) theEObject;
-			Object result = caseTaskDescription(taskDescription);
-			if (result == null)
-				result = caseContentDescription(taskDescription);
-			if (result == null)
-				result = caseMethodUnit(taskDescription);
-			if (result == null)
-				result = caseMethodElement(taskDescription);
-			if (result == null)
-				result = casePackageableElement(taskDescription);
-			if (result == null)
-				result = caseNamedElement(taskDescription);
-			if (result == null)
-				result = caseElement(taskDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GUIDANCE_DESCRIPTION: {
-			GuidanceDescription guidanceDescription = (GuidanceDescription) theEObject;
-			Object result = caseGuidanceDescription(guidanceDescription);
-			if (result == null)
-				result = caseContentDescription(guidanceDescription);
-			if (result == null)
-				result = caseMethodUnit(guidanceDescription);
-			if (result == null)
-				result = caseMethodElement(guidanceDescription);
-			if (result == null)
-				result = casePackageableElement(guidanceDescription);
-			if (result == null)
-				result = caseNamedElement(guidanceDescription);
-			if (result == null)
-				result = caseElement(guidanceDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PRACTICE_DESCRIPTION: {
-			PracticeDescription practiceDescription = (PracticeDescription) theEObject;
-			Object result = casePracticeDescription(practiceDescription);
-			if (result == null)
-				result = caseContentDescription(practiceDescription);
-			if (result == null)
-				result = caseMethodUnit(practiceDescription);
-			if (result == null)
-				result = caseMethodElement(practiceDescription);
-			if (result == null)
-				result = casePackageableElement(practiceDescription);
-			if (result == null)
-				result = caseNamedElement(practiceDescription);
-			if (result == null)
-				result = caseElement(practiceDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.POINT: {
-			Point point = (Point) theEObject;
-			Object result = casePoint(point);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GRAPH_ELEMENT: {
-			GraphElement graphElement = (GraphElement) theEObject;
-			Object result = caseGraphElement(graphElement);
-			if (result == null)
-				result = caseDiagramElement(graphElement);
-			if (result == null)
-				result = caseMethodElement(graphElement);
-			if (result == null)
-				result = casePackageableElement(graphElement);
-			if (result == null)
-				result = caseNamedElement(graphElement);
-			if (result == null)
-				result = caseElement(graphElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DIAGRAM_ELEMENT: {
-			DiagramElement diagramElement = (DiagramElement) theEObject;
-			Object result = caseDiagramElement(diagramElement);
-			if (result == null)
-				result = caseMethodElement(diagramElement);
-			if (result == null)
-				result = casePackageableElement(diagramElement);
-			if (result == null)
-				result = caseNamedElement(diagramElement);
-			if (result == null)
-				result = caseElement(diagramElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DIAGRAM_LINK: {
-			DiagramLink diagramLink = (DiagramLink) theEObject;
-			Object result = caseDiagramLink(diagramLink);
-			if (result == null)
-				result = caseDiagramElement(diagramLink);
-			if (result == null)
-				result = caseMethodElement(diagramLink);
-			if (result == null)
-				result = casePackageableElement(diagramLink);
-			if (result == null)
-				result = caseNamedElement(diagramLink);
-			if (result == null)
-				result = caseElement(diagramLink);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GRAPH_CONNECTOR: {
-			GraphConnector graphConnector = (GraphConnector) theEObject;
-			Object result = caseGraphConnector(graphConnector);
-			if (result == null)
-				result = caseGraphElement(graphConnector);
-			if (result == null)
-				result = caseDiagramElement(graphConnector);
-			if (result == null)
-				result = caseMethodElement(graphConnector);
-			if (result == null)
-				result = casePackageableElement(graphConnector);
-			if (result == null)
-				result = caseNamedElement(graphConnector);
-			if (result == null)
-				result = caseElement(graphConnector);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.SEMANTIC_MODEL_BRIDGE: {
-			SemanticModelBridge semanticModelBridge = (SemanticModelBridge) theEObject;
-			Object result = caseSemanticModelBridge(semanticModelBridge);
-			if (result == null)
-				result = caseDiagramElement(semanticModelBridge);
-			if (result == null)
-				result = caseMethodElement(semanticModelBridge);
-			if (result == null)
-				result = casePackageableElement(semanticModelBridge);
-			if (result == null)
-				result = caseNamedElement(semanticModelBridge);
-			if (result == null)
-				result = caseElement(semanticModelBridge);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DIMENSION: {
-			Dimension dimension = (Dimension) theEObject;
-			Object result = caseDimension(dimension);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.REFERENCE: {
-			Reference reference = (Reference) theEObject;
-			Object result = caseReference(reference);
-			if (result == null)
-				result = caseDiagramElement(reference);
-			if (result == null)
-				result = caseMethodElement(reference);
-			if (result == null)
-				result = casePackageableElement(reference);
-			if (result == null)
-				result = caseNamedElement(reference);
-			if (result == null)
-				result = caseElement(reference);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROPERTY: {
-			Property property = (Property) theEObject;
-			Object result = caseProperty(property);
-			if (result == null)
-				result = caseDiagramElement(property);
-			if (result == null)
-				result = caseMethodElement(property);
-			if (result == null)
-				result = casePackageableElement(property);
-			if (result == null)
-				result = caseNamedElement(property);
-			if (result == null)
-				result = caseElement(property);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GRAPH_EDGE: {
-			GraphEdge graphEdge = (GraphEdge) theEObject;
-			Object result = caseGraphEdge(graphEdge);
-			if (result == null)
-				result = caseGraphElement(graphEdge);
-			if (result == null)
-				result = caseDiagramElement(graphEdge);
-			if (result == null)
-				result = caseMethodElement(graphEdge);
-			if (result == null)
-				result = casePackageableElement(graphEdge);
-			if (result == null)
-				result = caseNamedElement(graphEdge);
-			if (result == null)
-				result = caseElement(graphEdge);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DIAGRAM: {
-			Diagram diagram = (Diagram) theEObject;
-			Object result = caseDiagram(diagram);
-			if (result == null)
-				result = caseGraphNode(diagram);
-			if (result == null)
-				result = caseGraphElement(diagram);
-			if (result == null)
-				result = caseDiagramElement(diagram);
-			if (result == null)
-				result = caseMethodElement(diagram);
-			if (result == null)
-				result = casePackageableElement(diagram);
-			if (result == null)
-				result = caseNamedElement(diagram);
-			if (result == null)
-				result = caseElement(diagram);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GRAPH_NODE: {
-			GraphNode graphNode = (GraphNode) theEObject;
-			Object result = caseGraphNode(graphNode);
-			if (result == null)
-				result = caseGraphElement(graphNode);
-			if (result == null)
-				result = caseDiagramElement(graphNode);
-			if (result == null)
-				result = caseMethodElement(graphNode);
-			if (result == null)
-				result = casePackageableElement(graphNode);
-			if (result == null)
-				result = caseNamedElement(graphNode);
-			if (result == null)
-				result = caseElement(graphNode);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.SIMPLE_SEMANTIC_MODEL_ELEMENT: {
-			SimpleSemanticModelElement simpleSemanticModelElement = (SimpleSemanticModelElement) theEObject;
-			Object result = caseSimpleSemanticModelElement(simpleSemanticModelElement);
-			if (result == null)
-				result = caseSemanticModelBridge(simpleSemanticModelElement);
-			if (result == null)
-				result = caseDiagramElement(simpleSemanticModelElement);
-			if (result == null)
-				result = caseMethodElement(simpleSemanticModelElement);
-			if (result == null)
-				result = casePackageableElement(simpleSemanticModelElement);
-			if (result == null)
-				result = caseNamedElement(simpleSemanticModelElement);
-			if (result == null)
-				result = caseElement(simpleSemanticModelElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.UMA_SEMANTIC_MODEL_BRIDGE: {
-			UMASemanticModelBridge umaSemanticModelBridge = (UMASemanticModelBridge) theEObject;
-			Object result = caseUMASemanticModelBridge(umaSemanticModelBridge);
-			if (result == null)
-				result = caseSemanticModelBridge(umaSemanticModelBridge);
-			if (result == null)
-				result = caseDiagramElement(umaSemanticModelBridge);
-			if (result == null)
-				result = caseMethodElement(umaSemanticModelBridge);
-			if (result == null)
-				result = casePackageableElement(umaSemanticModelBridge);
-			if (result == null)
-				result = caseNamedElement(umaSemanticModelBridge);
-			if (result == null)
-				result = caseElement(umaSemanticModelBridge);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CORE_SEMANTIC_MODEL_BRIDGE: {
-			CoreSemanticModelBridge coreSemanticModelBridge = (CoreSemanticModelBridge) theEObject;
-			Object result = caseCoreSemanticModelBridge(coreSemanticModelBridge);
-			if (result == null)
-				result = caseSemanticModelBridge(coreSemanticModelBridge);
-			if (result == null)
-				result = caseDiagramElement(coreSemanticModelBridge);
-			if (result == null)
-				result = caseMethodElement(coreSemanticModelBridge);
-			if (result == null)
-				result = casePackageableElement(coreSemanticModelBridge);
-			if (result == null)
-				result = caseNamedElement(coreSemanticModelBridge);
-			if (result == null)
-				result = caseElement(coreSemanticModelBridge);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.LEAF_ELEMENT: {
-			LeafElement leafElement = (LeafElement) theEObject;
-			Object result = caseLeafElement(leafElement);
-			if (result == null)
-				result = caseDiagramElement(leafElement);
-			if (result == null)
-				result = caseMethodElement(leafElement);
-			if (result == null)
-				result = casePackageableElement(leafElement);
-			if (result == null)
-				result = caseNamedElement(leafElement);
-			if (result == null)
-				result = caseElement(leafElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TEXT_ELEMENT: {
-			TextElement textElement = (TextElement) theEObject;
-			Object result = caseTextElement(textElement);
-			if (result == null)
-				result = caseLeafElement(textElement);
-			if (result == null)
-				result = caseDiagramElement(textElement);
-			if (result == null)
-				result = caseMethodElement(textElement);
-			if (result == null)
-				result = casePackageableElement(textElement);
-			if (result == null)
-				result = caseNamedElement(textElement);
-			if (result == null)
-				result = caseElement(textElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.IMAGE: {
-			Image image = (Image) theEObject;
-			Object result = caseImage(image);
-			if (result == null)
-				result = caseLeafElement(image);
-			if (result == null)
-				result = caseDiagramElement(image);
-			if (result == null)
-				result = caseMethodElement(image);
-			if (result == null)
-				result = casePackageableElement(image);
-			if (result == null)
-				result = caseNamedElement(image);
-			if (result == null)
-				result = caseElement(image);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GRAPHIC_PRIMITIVE: {
-			GraphicPrimitive graphicPrimitive = (GraphicPrimitive) theEObject;
-			Object result = caseGraphicPrimitive(graphicPrimitive);
-			if (result == null)
-				result = caseLeafElement(graphicPrimitive);
-			if (result == null)
-				result = caseDiagramElement(graphicPrimitive);
-			if (result == null)
-				result = caseMethodElement(graphicPrimitive);
-			if (result == null)
-				result = casePackageableElement(graphicPrimitive);
-			if (result == null)
-				result = caseNamedElement(graphicPrimitive);
-			if (result == null)
-				result = caseElement(graphicPrimitive);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.POLYLINE: {
-			Polyline polyline = (Polyline) theEObject;
-			Object result = casePolyline(polyline);
-			if (result == null)
-				result = caseGraphicPrimitive(polyline);
-			if (result == null)
-				result = caseLeafElement(polyline);
-			if (result == null)
-				result = caseDiagramElement(polyline);
-			if (result == null)
-				result = caseMethodElement(polyline);
-			if (result == null)
-				result = casePackageableElement(polyline);
-			if (result == null)
-				result = caseNamedElement(polyline);
-			if (result == null)
-				result = caseElement(polyline);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ELLIPSE: {
-			Ellipse ellipse = (Ellipse) theEObject;
-			Object result = caseEllipse(ellipse);
-			if (result == null)
-				result = caseGraphicPrimitive(ellipse);
-			if (result == null)
-				result = caseLeafElement(ellipse);
-			if (result == null)
-				result = caseDiagramElement(ellipse);
-			if (result == null)
-				result = caseMethodElement(ellipse);
-			if (result == null)
-				result = casePackageableElement(ellipse);
-			if (result == null)
-				result = caseNamedElement(ellipse);
-			if (result == null)
-				result = caseElement(ellipse);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ACTIVITY: {
-			Activity activity = (Activity) theEObject;
-			Object result = caseActivity(activity);
-			if (result == null)
-				result = caseWorkBreakdownElement(activity);
-			if (result == null)
-				result = caseVariabilityElement(activity);
-			if (result == null)
-				result = caseWorkDefinition(activity);
-			if (result == null)
-				result = caseBreakdownElement(activity);
-			if (result == null)
-				result = caseMethodElement(activity);
-			if (result == null)
-				result = caseProcessElement(activity);
-			if (result == null)
-				result = casePackageableElement(activity);
-			if (result == null)
-				result = caseDescribableElement(activity);
-			if (result == null)
-				result = caseNamedElement(activity);
-			if (result == null)
-				result = caseClassifier(activity);
-			if (result == null)
-				result = caseElement(activity);
-			if (result == null)
-				result = caseType(activity);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WORK_BREAKDOWN_ELEMENT: {
-			WorkBreakdownElement workBreakdownElement = (WorkBreakdownElement) theEObject;
-			Object result = caseWorkBreakdownElement(workBreakdownElement);
-			if (result == null)
-				result = caseBreakdownElement(workBreakdownElement);
-			if (result == null)
-				result = caseProcessElement(workBreakdownElement);
-			if (result == null)
-				result = caseDescribableElement(workBreakdownElement);
-			if (result == null)
-				result = caseMethodElement(workBreakdownElement);
-			if (result == null)
-				result = caseClassifier(workBreakdownElement);
-			if (result == null)
-				result = casePackageableElement(workBreakdownElement);
-			if (result == null)
-				result = caseType(workBreakdownElement);
-			if (result == null)
-				result = caseNamedElement(workBreakdownElement);
-			if (result == null)
-				result = caseElement(workBreakdownElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.BREAKDOWN_ELEMENT: {
-			BreakdownElement breakdownElement = (BreakdownElement) theEObject;
-			Object result = caseBreakdownElement(breakdownElement);
-			if (result == null)
-				result = caseProcessElement(breakdownElement);
-			if (result == null)
-				result = caseDescribableElement(breakdownElement);
-			if (result == null)
-				result = caseMethodElement(breakdownElement);
-			if (result == null)
-				result = caseClassifier(breakdownElement);
-			if (result == null)
-				result = casePackageableElement(breakdownElement);
-			if (result == null)
-				result = caseType(breakdownElement);
-			if (result == null)
-				result = caseNamedElement(breakdownElement);
-			if (result == null)
-				result = caseElement(breakdownElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.MILESTONE: {
-			Milestone milestone = (Milestone) theEObject;
-			Object result = caseMilestone(milestone);
-			if (result == null)
-				result = caseWorkBreakdownElement(milestone);
-			if (result == null)
-				result = caseBreakdownElement(milestone);
-			if (result == null)
-				result = caseProcessElement(milestone);
-			if (result == null)
-				result = caseDescribableElement(milestone);
-			if (result == null)
-				result = caseMethodElement(milestone);
-			if (result == null)
-				result = caseClassifier(milestone);
-			if (result == null)
-				result = casePackageableElement(milestone);
-			if (result == null)
-				result = caseType(milestone);
-			if (result == null)
-				result = caseNamedElement(milestone);
-			if (result == null)
-				result = caseElement(milestone);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ITERATION: {
-			Iteration iteration = (Iteration) theEObject;
-			Object result = caseIteration(iteration);
-			if (result == null)
-				result = caseActivity(iteration);
-			if (result == null)
-				result = caseWorkBreakdownElement(iteration);
-			if (result == null)
-				result = caseVariabilityElement(iteration);
-			if (result == null)
-				result = caseWorkDefinition(iteration);
-			if (result == null)
-				result = caseBreakdownElement(iteration);
-			if (result == null)
-				result = caseMethodElement(iteration);
-			if (result == null)
-				result = caseProcessElement(iteration);
-			if (result == null)
-				result = casePackageableElement(iteration);
-			if (result == null)
-				result = caseDescribableElement(iteration);
-			if (result == null)
-				result = caseNamedElement(iteration);
-			if (result == null)
-				result = caseClassifier(iteration);
-			if (result == null)
-				result = caseElement(iteration);
-			if (result == null)
-				result = caseType(iteration);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PHASE: {
-			Phase phase = (Phase) theEObject;
-			Object result = casePhase(phase);
-			if (result == null)
-				result = caseActivity(phase);
-			if (result == null)
-				result = caseWorkBreakdownElement(phase);
-			if (result == null)
-				result = caseVariabilityElement(phase);
-			if (result == null)
-				result = caseWorkDefinition(phase);
-			if (result == null)
-				result = caseBreakdownElement(phase);
-			if (result == null)
-				result = caseMethodElement(phase);
-			if (result == null)
-				result = caseProcessElement(phase);
-			if (result == null)
-				result = casePackageableElement(phase);
-			if (result == null)
-				result = caseDescribableElement(phase);
-			if (result == null)
-				result = caseNamedElement(phase);
-			if (result == null)
-				result = caseClassifier(phase);
-			if (result == null)
-				result = caseElement(phase);
-			if (result == null)
-				result = caseType(phase);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TEAM_PROFILE: {
-			TeamProfile teamProfile = (TeamProfile) theEObject;
-			Object result = caseTeamProfile(teamProfile);
-			if (result == null)
-				result = caseBreakdownElement(teamProfile);
-			if (result == null)
-				result = caseProcessElement(teamProfile);
-			if (result == null)
-				result = caseDescribableElement(teamProfile);
-			if (result == null)
-				result = caseMethodElement(teamProfile);
-			if (result == null)
-				result = caseClassifier(teamProfile);
-			if (result == null)
-				result = casePackageableElement(teamProfile);
-			if (result == null)
-				result = caseType(teamProfile);
-			if (result == null)
-				result = caseNamedElement(teamProfile);
-			if (result == null)
-				result = caseElement(teamProfile);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ROLE_DESCRIPTOR: {
-			RoleDescriptor roleDescriptor = (RoleDescriptor) theEObject;
-			Object result = caseRoleDescriptor(roleDescriptor);
-			if (result == null)
-				result = caseDescriptor(roleDescriptor);
-			if (result == null)
-				result = caseBreakdownElement(roleDescriptor);
-			if (result == null)
-				result = caseProcessElement(roleDescriptor);
-			if (result == null)
-				result = caseDescribableElement(roleDescriptor);
-			if (result == null)
-				result = caseMethodElement(roleDescriptor);
-			if (result == null)
-				result = caseClassifier(roleDescriptor);
-			if (result == null)
-				result = casePackageableElement(roleDescriptor);
-			if (result == null)
-				result = caseType(roleDescriptor);
-			if (result == null)
-				result = caseNamedElement(roleDescriptor);
-			if (result == null)
-				result = caseElement(roleDescriptor);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WORK_ORDER: {
-			WorkOrder workOrder = (WorkOrder) theEObject;
-			Object result = caseWorkOrder(workOrder);
-			if (result == null)
-				result = caseProcessElement(workOrder);
-			if (result == null)
-				result = caseDescribableElement(workOrder);
-			if (result == null)
-				result = caseMethodElement(workOrder);
-			if (result == null)
-				result = caseClassifier(workOrder);
-			if (result == null)
-				result = casePackageableElement(workOrder);
-			if (result == null)
-				result = caseType(workOrder);
-			if (result == null)
-				result = caseNamedElement(workOrder);
-			if (result == null)
-				result = caseElement(workOrder);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_ELEMENT: {
-			ProcessElement processElement = (ProcessElement) theEObject;
-			Object result = caseProcessElement(processElement);
-			if (result == null)
-				result = caseDescribableElement(processElement);
-			if (result == null)
-				result = caseMethodElement(processElement);
-			if (result == null)
-				result = caseClassifier(processElement);
-			if (result == null)
-				result = casePackageableElement(processElement);
-			if (result == null)
-				result = caseType(processElement);
-			if (result == null)
-				result = caseNamedElement(processElement);
-			if (result == null)
-				result = caseElement(processElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PLANNING_DATA: {
-			PlanningData planningData = (PlanningData) theEObject;
-			Object result = casePlanningData(planningData);
-			if (result == null)
-				result = caseProcessElement(planningData);
-			if (result == null)
-				result = caseDescribableElement(planningData);
-			if (result == null)
-				result = caseMethodElement(planningData);
-			if (result == null)
-				result = caseClassifier(planningData);
-			if (result == null)
-				result = casePackageableElement(planningData);
-			if (result == null)
-				result = caseType(planningData);
-			if (result == null)
-				result = caseNamedElement(planningData);
-			if (result == null)
-				result = caseElement(planningData);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DESCRIPTOR: {
-			Descriptor descriptor = (Descriptor) theEObject;
-			Object result = caseDescriptor(descriptor);
-			if (result == null)
-				result = caseBreakdownElement(descriptor);
-			if (result == null)
-				result = caseProcessElement(descriptor);
-			if (result == null)
-				result = caseDescribableElement(descriptor);
-			if (result == null)
-				result = caseMethodElement(descriptor);
-			if (result == null)
-				result = caseClassifier(descriptor);
-			if (result == null)
-				result = casePackageableElement(descriptor);
-			if (result == null)
-				result = caseType(descriptor);
-			if (result == null)
-				result = caseNamedElement(descriptor);
-			if (result == null)
-				result = caseElement(descriptor);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WORK_PRODUCT_DESCRIPTOR: {
-			WorkProductDescriptor workProductDescriptor = (WorkProductDescriptor) theEObject;
-			Object result = caseWorkProductDescriptor(workProductDescriptor);
-			if (result == null)
-				result = caseDescriptor(workProductDescriptor);
-			if (result == null)
-				result = caseBreakdownElement(workProductDescriptor);
-			if (result == null)
-				result = caseProcessElement(workProductDescriptor);
-			if (result == null)
-				result = caseDescribableElement(workProductDescriptor);
-			if (result == null)
-				result = caseMethodElement(workProductDescriptor);
-			if (result == null)
-				result = caseClassifier(workProductDescriptor);
-			if (result == null)
-				result = casePackageableElement(workProductDescriptor);
-			if (result == null)
-				result = caseType(workProductDescriptor);
-			if (result == null)
-				result = caseNamedElement(workProductDescriptor);
-			if (result == null)
-				result = caseElement(workProductDescriptor);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TASK_DESCRIPTOR: {
-			TaskDescriptor taskDescriptor = (TaskDescriptor) theEObject;
-			Object result = caseTaskDescriptor(taskDescriptor);
-			if (result == null)
-				result = caseWorkBreakdownElement(taskDescriptor);
-			if (result == null)
-				result = caseDescriptor(taskDescriptor);
-			if (result == null)
-				result = caseBreakdownElement(taskDescriptor);
-			if (result == null)
-				result = caseProcessElement(taskDescriptor);
-			if (result == null)
-				result = caseDescribableElement(taskDescriptor);
-			if (result == null)
-				result = caseMethodElement(taskDescriptor);
-			if (result == null)
-				result = caseClassifier(taskDescriptor);
-			if (result == null)
-				result = casePackageableElement(taskDescriptor);
-			if (result == null)
-				result = caseType(taskDescriptor);
-			if (result == null)
-				result = caseNamedElement(taskDescriptor);
-			if (result == null)
-				result = caseElement(taskDescriptor);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.COMPOSITE_ROLE: {
-			CompositeRole compositeRole = (CompositeRole) theEObject;
-			Object result = caseCompositeRole(compositeRole);
-			if (result == null)
-				result = caseRoleDescriptor(compositeRole);
-			if (result == null)
-				result = caseDescriptor(compositeRole);
-			if (result == null)
-				result = caseBreakdownElement(compositeRole);
-			if (result == null)
-				result = caseProcessElement(compositeRole);
-			if (result == null)
-				result = caseDescribableElement(compositeRole);
-			if (result == null)
-				result = caseMethodElement(compositeRole);
-			if (result == null)
-				result = caseClassifier(compositeRole);
-			if (result == null)
-				result = casePackageableElement(compositeRole);
-			if (result == null)
-				result = caseType(compositeRole);
-			if (result == null)
-				result = caseNamedElement(compositeRole);
-			if (result == null)
-				result = caseElement(compositeRole);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION: {
-			BreakdownElementDescription breakdownElementDescription = (BreakdownElementDescription) theEObject;
-			Object result = caseBreakdownElementDescription(breakdownElementDescription);
-			if (result == null)
-				result = caseContentDescription(breakdownElementDescription);
-			if (result == null)
-				result = caseMethodUnit(breakdownElementDescription);
-			if (result == null)
-				result = caseMethodElement(breakdownElementDescription);
-			if (result == null)
-				result = casePackageableElement(breakdownElementDescription);
-			if (result == null)
-				result = caseNamedElement(breakdownElementDescription);
-			if (result == null)
-				result = caseElement(breakdownElementDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ACTIVITY_DESCRIPTION: {
-			ActivityDescription activityDescription = (ActivityDescription) theEObject;
-			Object result = caseActivityDescription(activityDescription);
-			if (result == null)
-				result = caseBreakdownElementDescription(activityDescription);
-			if (result == null)
-				result = caseContentDescription(activityDescription);
-			if (result == null)
-				result = caseMethodUnit(activityDescription);
-			if (result == null)
-				result = caseMethodElement(activityDescription);
-			if (result == null)
-				result = casePackageableElement(activityDescription);
-			if (result == null)
-				result = caseNamedElement(activityDescription);
-			if (result == null)
-				result = caseElement(activityDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DELIVERY_PROCESS_DESCRIPTION: {
-			DeliveryProcessDescription deliveryProcessDescription = (DeliveryProcessDescription) theEObject;
-			Object result = caseDeliveryProcessDescription(deliveryProcessDescription);
-			if (result == null)
-				result = caseProcessDescription(deliveryProcessDescription);
-			if (result == null)
-				result = caseActivityDescription(deliveryProcessDescription);
-			if (result == null)
-				result = caseBreakdownElementDescription(deliveryProcessDescription);
-			if (result == null)
-				result = caseContentDescription(deliveryProcessDescription);
-			if (result == null)
-				result = caseMethodUnit(deliveryProcessDescription);
-			if (result == null)
-				result = caseMethodElement(deliveryProcessDescription);
-			if (result == null)
-				result = casePackageableElement(deliveryProcessDescription);
-			if (result == null)
-				result = caseNamedElement(deliveryProcessDescription);
-			if (result == null)
-				result = caseElement(deliveryProcessDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_DESCRIPTION: {
-			ProcessDescription processDescription = (ProcessDescription) theEObject;
-			Object result = caseProcessDescription(processDescription);
-			if (result == null)
-				result = caseActivityDescription(processDescription);
-			if (result == null)
-				result = caseBreakdownElementDescription(processDescription);
-			if (result == null)
-				result = caseContentDescription(processDescription);
-			if (result == null)
-				result = caseMethodUnit(processDescription);
-			if (result == null)
-				result = caseMethodElement(processDescription);
-			if (result == null)
-				result = casePackageableElement(processDescription);
-			if (result == null)
-				result = caseNamedElement(processDescription);
-			if (result == null)
-				result = caseElement(processDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DESCRIPTOR_DESCRIPTION: {
-			DescriptorDescription descriptorDescription = (DescriptorDescription) theEObject;
-			Object result = caseDescriptorDescription(descriptorDescription);
-			if (result == null)
-				result = caseBreakdownElementDescription(descriptorDescription);
-			if (result == null)
-				result = caseContentDescription(descriptorDescription);
-			if (result == null)
-				result = caseMethodUnit(descriptorDescription);
-			if (result == null)
-				result = caseMethodElement(descriptorDescription);
-			if (result == null)
-				result = casePackageableElement(descriptorDescription);
-			if (result == null)
-				result = caseNamedElement(descriptorDescription);
-			if (result == null)
-				result = caseElement(descriptorDescription);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CONCEPT: {
-			Concept concept = (Concept) theEObject;
-			Object result = caseConcept(concept);
-			if (result == null)
-				result = caseGuidance(concept);
-			if (result == null)
-				result = caseContentElement(concept);
-			if (result == null)
-				result = caseDescribableElement(concept);
-			if (result == null)
-				result = caseVariabilityElement(concept);
-			if (result == null)
-				result = caseMethodElement(concept);
-			if (result == null)
-				result = caseClassifier(concept);
-			if (result == null)
-				result = casePackageableElement(concept);
-			if (result == null)
-				result = caseType(concept);
-			if (result == null)
-				result = caseNamedElement(concept);
-			if (result == null)
-				result = caseElement(concept);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CHECKLIST: {
-			Checklist checklist = (Checklist) theEObject;
-			Object result = caseChecklist(checklist);
-			if (result == null)
-				result = caseGuidance(checklist);
-			if (result == null)
-				result = caseContentElement(checklist);
-			if (result == null)
-				result = caseDescribableElement(checklist);
-			if (result == null)
-				result = caseVariabilityElement(checklist);
-			if (result == null)
-				result = caseMethodElement(checklist);
-			if (result == null)
-				result = caseClassifier(checklist);
-			if (result == null)
-				result = casePackageableElement(checklist);
-			if (result == null)
-				result = caseType(checklist);
-			if (result == null)
-				result = caseNamedElement(checklist);
-			if (result == null)
-				result = caseElement(checklist);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.EXAMPLE: {
-			Example example = (Example) theEObject;
-			Object result = caseExample(example);
-			if (result == null)
-				result = caseGuidance(example);
-			if (result == null)
-				result = caseContentElement(example);
-			if (result == null)
-				result = caseDescribableElement(example);
-			if (result == null)
-				result = caseVariabilityElement(example);
-			if (result == null)
-				result = caseMethodElement(example);
-			if (result == null)
-				result = caseClassifier(example);
-			if (result == null)
-				result = casePackageableElement(example);
-			if (result == null)
-				result = caseType(example);
-			if (result == null)
-				result = caseNamedElement(example);
-			if (result == null)
-				result = caseElement(example);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.GUIDELINE: {
-			Guideline guideline = (Guideline) theEObject;
-			Object result = caseGuideline(guideline);
-			if (result == null)
-				result = caseGuidance(guideline);
-			if (result == null)
-				result = caseContentElement(guideline);
-			if (result == null)
-				result = caseDescribableElement(guideline);
-			if (result == null)
-				result = caseVariabilityElement(guideline);
-			if (result == null)
-				result = caseMethodElement(guideline);
-			if (result == null)
-				result = caseClassifier(guideline);
-			if (result == null)
-				result = casePackageableElement(guideline);
-			if (result == null)
-				result = caseType(guideline);
-			if (result == null)
-				result = caseNamedElement(guideline);
-			if (result == null)
-				result = caseElement(guideline);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.REPORT: {
-			Report report = (Report) theEObject;
-			Object result = caseReport(report);
-			if (result == null)
-				result = caseGuidance(report);
-			if (result == null)
-				result = caseContentElement(report);
-			if (result == null)
-				result = caseDescribableElement(report);
-			if (result == null)
-				result = caseVariabilityElement(report);
-			if (result == null)
-				result = caseMethodElement(report);
-			if (result == null)
-				result = caseClassifier(report);
-			if (result == null)
-				result = casePackageableElement(report);
-			if (result == null)
-				result = caseType(report);
-			if (result == null)
-				result = caseNamedElement(report);
-			if (result == null)
-				result = caseElement(report);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TEMPLATE: {
-			Template template = (Template) theEObject;
-			Object result = caseTemplate(template);
-			if (result == null)
-				result = caseGuidance(template);
-			if (result == null)
-				result = caseContentElement(template);
-			if (result == null)
-				result = caseDescribableElement(template);
-			if (result == null)
-				result = caseVariabilityElement(template);
-			if (result == null)
-				result = caseMethodElement(template);
-			if (result == null)
-				result = caseClassifier(template);
-			if (result == null)
-				result = casePackageableElement(template);
-			if (result == null)
-				result = caseType(template);
-			if (result == null)
-				result = caseNamedElement(template);
-			if (result == null)
-				result = caseElement(template);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.SUPPORTING_MATERIAL: {
-			SupportingMaterial supportingMaterial = (SupportingMaterial) theEObject;
-			Object result = caseSupportingMaterial(supportingMaterial);
-			if (result == null)
-				result = caseGuidance(supportingMaterial);
-			if (result == null)
-				result = caseContentElement(supportingMaterial);
-			if (result == null)
-				result = caseDescribableElement(supportingMaterial);
-			if (result == null)
-				result = caseVariabilityElement(supportingMaterial);
-			if (result == null)
-				result = caseMethodElement(supportingMaterial);
-			if (result == null)
-				result = caseClassifier(supportingMaterial);
-			if (result == null)
-				result = casePackageableElement(supportingMaterial);
-			if (result == null)
-				result = caseType(supportingMaterial);
-			if (result == null)
-				result = caseNamedElement(supportingMaterial);
-			if (result == null)
-				result = caseElement(supportingMaterial);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TOOL_MENTOR: {
-			ToolMentor toolMentor = (ToolMentor) theEObject;
-			Object result = caseToolMentor(toolMentor);
-			if (result == null)
-				result = caseGuidance(toolMentor);
-			if (result == null)
-				result = caseContentElement(toolMentor);
-			if (result == null)
-				result = caseDescribableElement(toolMentor);
-			if (result == null)
-				result = caseVariabilityElement(toolMentor);
-			if (result == null)
-				result = caseMethodElement(toolMentor);
-			if (result == null)
-				result = caseClassifier(toolMentor);
-			if (result == null)
-				result = casePackageableElement(toolMentor);
-			if (result == null)
-				result = caseType(toolMentor);
-			if (result == null)
-				result = caseNamedElement(toolMentor);
-			if (result == null)
-				result = caseElement(toolMentor);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WHITEPAPER: {
-			Whitepaper whitepaper = (Whitepaper) theEObject;
-			Object result = caseWhitepaper(whitepaper);
-			if (result == null)
-				result = caseConcept(whitepaper);
-			if (result == null)
-				result = caseGuidance(whitepaper);
-			if (result == null)
-				result = caseContentElement(whitepaper);
-			if (result == null)
-				result = caseDescribableElement(whitepaper);
-			if (result == null)
-				result = caseVariabilityElement(whitepaper);
-			if (result == null)
-				result = caseMethodElement(whitepaper);
-			if (result == null)
-				result = caseClassifier(whitepaper);
-			if (result == null)
-				result = casePackageableElement(whitepaper);
-			if (result == null)
-				result = caseType(whitepaper);
-			if (result == null)
-				result = caseNamedElement(whitepaper);
-			if (result == null)
-				result = caseElement(whitepaper);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TERM_DEFINITION: {
-			TermDefinition termDefinition = (TermDefinition) theEObject;
-			Object result = caseTermDefinition(termDefinition);
-			if (result == null)
-				result = caseGuidance(termDefinition);
-			if (result == null)
-				result = caseContentElement(termDefinition);
-			if (result == null)
-				result = caseDescribableElement(termDefinition);
-			if (result == null)
-				result = caseVariabilityElement(termDefinition);
-			if (result == null)
-				result = caseMethodElement(termDefinition);
-			if (result == null)
-				result = caseClassifier(termDefinition);
-			if (result == null)
-				result = casePackageableElement(termDefinition);
-			if (result == null)
-				result = caseType(termDefinition);
-			if (result == null)
-				result = caseNamedElement(termDefinition);
-			if (result == null)
-				result = caseElement(termDefinition);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PRACTICE: {
-			Practice practice = (Practice) theEObject;
-			Object result = casePractice(practice);
-			if (result == null)
-				result = caseGuidance(practice);
-			if (result == null)
-				result = caseContentElement(practice);
-			if (result == null)
-				result = caseDescribableElement(practice);
-			if (result == null)
-				result = caseVariabilityElement(practice);
-			if (result == null)
-				result = caseMethodElement(practice);
-			if (result == null)
-				result = caseClassifier(practice);
-			if (result == null)
-				result = casePackageableElement(practice);
-			if (result == null)
-				result = caseType(practice);
-			if (result == null)
-				result = caseNamedElement(practice);
-			if (result == null)
-				result = caseElement(practice);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ESTIMATION_CONSIDERATIONS: {
-			EstimationConsiderations estimationConsiderations = (EstimationConsiderations) theEObject;
-			Object result = caseEstimationConsiderations(estimationConsiderations);
-			if (result == null)
-				result = caseGuidance(estimationConsiderations);
-			if (result == null)
-				result = caseContentElement(estimationConsiderations);
-			if (result == null)
-				result = caseDescribableElement(estimationConsiderations);
-			if (result == null)
-				result = caseVariabilityElement(estimationConsiderations);
-			if (result == null)
-				result = caseMethodElement(estimationConsiderations);
-			if (result == null)
-				result = caseClassifier(estimationConsiderations);
-			if (result == null)
-				result = casePackageableElement(estimationConsiderations);
-			if (result == null)
-				result = caseType(estimationConsiderations);
-			if (result == null)
-				result = caseNamedElement(estimationConsiderations);
-			if (result == null)
-				result = caseElement(estimationConsiderations);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.REUSABLE_ASSET: {
-			ReusableAsset reusableAsset = (ReusableAsset) theEObject;
-			Object result = caseReusableAsset(reusableAsset);
-			if (result == null)
-				result = caseGuidance(reusableAsset);
-			if (result == null)
-				result = caseContentElement(reusableAsset);
-			if (result == null)
-				result = caseDescribableElement(reusableAsset);
-			if (result == null)
-				result = caseVariabilityElement(reusableAsset);
-			if (result == null)
-				result = caseMethodElement(reusableAsset);
-			if (result == null)
-				result = caseClassifier(reusableAsset);
-			if (result == null)
-				result = casePackageableElement(reusableAsset);
-			if (result == null)
-				result = caseType(reusableAsset);
-			if (result == null)
-				result = caseNamedElement(reusableAsset);
-			if (result == null)
-				result = caseElement(reusableAsset);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.STATE: {
-			State state = (State) theEObject;
-			Object result = caseState(state);
-			if (result == null)
-				result = caseVertex(state);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.VERTEX: {
-			Vertex vertex = (Vertex) theEObject;
-			Object result = caseVertex(vertex);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.REGION: {
-			Region region = (Region) theEObject;
-			Object result = caseRegion(region);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.STATE_MACHINE: {
-			StateMachine stateMachine = (StateMachine) theEObject;
-			Object result = caseStateMachine(stateMachine);
-			if (result == null)
-				result = caseWorkDefinition(stateMachine);
-			if (result == null)
-				result = caseMethodElement(stateMachine);
-			if (result == null)
-				result = casePackageableElement(stateMachine);
-			if (result == null)
-				result = caseNamedElement(stateMachine);
-			if (result == null)
-				result = caseElement(stateMachine);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TRANSITION: {
-			Transition transition = (Transition) theEObject;
-			Object result = caseTransition(transition);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PSEUDO_STATE: {
-			PseudoState pseudoState = (PseudoState) theEObject;
-			Object result = casePseudoState(pseudoState);
-			if (result == null)
-				result = caseVertex(pseudoState);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DISCIPLINE: {
-			Discipline discipline = (Discipline) theEObject;
-			Object result = caseDiscipline(discipline);
-			if (result == null)
-				result = caseContentCategory(discipline);
-			if (result == null)
-				result = caseContentElement(discipline);
-			if (result == null)
-				result = caseDescribableElement(discipline);
-			if (result == null)
-				result = caseVariabilityElement(discipline);
-			if (result == null)
-				result = caseMethodElement(discipline);
-			if (result == null)
-				result = caseClassifier(discipline);
-			if (result == null)
-				result = casePackageableElement(discipline);
-			if (result == null)
-				result = caseType(discipline);
-			if (result == null)
-				result = caseNamedElement(discipline);
-			if (result == null)
-				result = caseElement(discipline);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CONTENT_CATEGORY: {
-			ContentCategory contentCategory = (ContentCategory) theEObject;
-			Object result = caseContentCategory(contentCategory);
-			if (result == null)
-				result = caseContentElement(contentCategory);
-			if (result == null)
-				result = caseDescribableElement(contentCategory);
-			if (result == null)
-				result = caseVariabilityElement(contentCategory);
-			if (result == null)
-				result = caseMethodElement(contentCategory);
-			if (result == null)
-				result = caseClassifier(contentCategory);
-			if (result == null)
-				result = casePackageableElement(contentCategory);
-			if (result == null)
-				result = caseType(contentCategory);
-			if (result == null)
-				result = caseNamedElement(contentCategory);
-			if (result == null)
-				result = caseElement(contentCategory);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ROLE_SET: {
-			RoleSet roleSet = (RoleSet) theEObject;
-			Object result = caseRoleSet(roleSet);
-			if (result == null)
-				result = caseContentCategory(roleSet);
-			if (result == null)
-				result = caseContentElement(roleSet);
-			if (result == null)
-				result = caseDescribableElement(roleSet);
-			if (result == null)
-				result = caseVariabilityElement(roleSet);
-			if (result == null)
-				result = caseMethodElement(roleSet);
-			if (result == null)
-				result = caseClassifier(roleSet);
-			if (result == null)
-				result = casePackageableElement(roleSet);
-			if (result == null)
-				result = caseType(roleSet);
-			if (result == null)
-				result = caseNamedElement(roleSet);
-			if (result == null)
-				result = caseElement(roleSet);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DOMAIN: {
-			Domain domain = (Domain) theEObject;
-			Object result = caseDomain(domain);
-			if (result == null)
-				result = caseContentCategory(domain);
-			if (result == null)
-				result = caseContentElement(domain);
-			if (result == null)
-				result = caseDescribableElement(domain);
-			if (result == null)
-				result = caseVariabilityElement(domain);
-			if (result == null)
-				result = caseMethodElement(domain);
-			if (result == null)
-				result = caseClassifier(domain);
-			if (result == null)
-				result = casePackageableElement(domain);
-			if (result == null)
-				result = caseType(domain);
-			if (result == null)
-				result = caseNamedElement(domain);
-			if (result == null)
-				result = caseElement(domain);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.WORK_PRODUCT_TYPE: {
-			WorkProductType workProductType = (WorkProductType) theEObject;
-			Object result = caseWorkProductType(workProductType);
-			if (result == null)
-				result = caseContentCategory(workProductType);
-			if (result == null)
-				result = caseContentElement(workProductType);
-			if (result == null)
-				result = caseDescribableElement(workProductType);
-			if (result == null)
-				result = caseVariabilityElement(workProductType);
-			if (result == null)
-				result = caseMethodElement(workProductType);
-			if (result == null)
-				result = caseClassifier(workProductType);
-			if (result == null)
-				result = casePackageableElement(workProductType);
-			if (result == null)
-				result = caseType(workProductType);
-			if (result == null)
-				result = caseNamedElement(workProductType);
-			if (result == null)
-				result = caseElement(workProductType);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DISCIPLINE_GROUPING: {
-			DisciplineGrouping disciplineGrouping = (DisciplineGrouping) theEObject;
-			Object result = caseDisciplineGrouping(disciplineGrouping);
-			if (result == null)
-				result = caseContentCategory(disciplineGrouping);
-			if (result == null)
-				result = caseContentElement(disciplineGrouping);
-			if (result == null)
-				result = caseDescribableElement(disciplineGrouping);
-			if (result == null)
-				result = caseVariabilityElement(disciplineGrouping);
-			if (result == null)
-				result = caseMethodElement(disciplineGrouping);
-			if (result == null)
-				result = caseClassifier(disciplineGrouping);
-			if (result == null)
-				result = casePackageableElement(disciplineGrouping);
-			if (result == null)
-				result = caseType(disciplineGrouping);
-			if (result == null)
-				result = caseNamedElement(disciplineGrouping);
-			if (result == null)
-				result = caseElement(disciplineGrouping);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.TOOL: {
-			Tool tool = (Tool) theEObject;
-			Object result = caseTool(tool);
-			if (result == null)
-				result = caseContentCategory(tool);
-			if (result == null)
-				result = caseContentElement(tool);
-			if (result == null)
-				result = caseDescribableElement(tool);
-			if (result == null)
-				result = caseVariabilityElement(tool);
-			if (result == null)
-				result = caseMethodElement(tool);
-			if (result == null)
-				result = caseClassifier(tool);
-			if (result == null)
-				result = casePackageableElement(tool);
-			if (result == null)
-				result = caseType(tool);
-			if (result == null)
-				result = caseNamedElement(tool);
-			if (result == null)
-				result = caseElement(tool);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ROLE_SET_GROUPING: {
-			RoleSetGrouping roleSetGrouping = (RoleSetGrouping) theEObject;
-			Object result = caseRoleSetGrouping(roleSetGrouping);
-			if (result == null)
-				result = caseContentCategory(roleSetGrouping);
-			if (result == null)
-				result = caseContentElement(roleSetGrouping);
-			if (result == null)
-				result = caseDescribableElement(roleSetGrouping);
-			if (result == null)
-				result = caseVariabilityElement(roleSetGrouping);
-			if (result == null)
-				result = caseMethodElement(roleSetGrouping);
-			if (result == null)
-				result = caseClassifier(roleSetGrouping);
-			if (result == null)
-				result = casePackageableElement(roleSetGrouping);
-			if (result == null)
-				result = caseType(roleSetGrouping);
-			if (result == null)
-				result = caseNamedElement(roleSetGrouping);
-			if (result == null)
-				result = caseElement(roleSetGrouping);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CUSTOM_CATEGORY: {
-			CustomCategory customCategory = (CustomCategory) theEObject;
-			Object result = caseCustomCategory(customCategory);
-			if (result == null)
-				result = caseContentCategory(customCategory);
-			if (result == null)
-				result = caseContentElement(customCategory);
-			if (result == null)
-				result = caseDescribableElement(customCategory);
-			if (result == null)
-				result = caseVariabilityElement(customCategory);
-			if (result == null)
-				result = caseMethodElement(customCategory);
-			if (result == null)
-				result = caseClassifier(customCategory);
-			if (result == null)
-				result = casePackageableElement(customCategory);
-			if (result == null)
-				result = caseType(customCategory);
-			if (result == null)
-				result = caseNamedElement(customCategory);
-			if (result == null)
-				result = caseElement(customCategory);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.DELIVERY_PROCESS: {
-			DeliveryProcess deliveryProcess = (DeliveryProcess) theEObject;
-			Object result = caseDeliveryProcess(deliveryProcess);
-			if (result == null)
-				result = caseProcess(deliveryProcess);
-			if (result == null)
-				result = caseActivity(deliveryProcess);
-			if (result == null)
-				result = caseWorkBreakdownElement(deliveryProcess);
-			if (result == null)
-				result = caseVariabilityElement(deliveryProcess);
-			if (result == null)
-				result = caseWorkDefinition(deliveryProcess);
-			if (result == null)
-				result = caseBreakdownElement(deliveryProcess);
-			if (result == null)
-				result = caseMethodElement(deliveryProcess);
-			if (result == null)
-				result = caseProcessElement(deliveryProcess);
-			if (result == null)
-				result = casePackageableElement(deliveryProcess);
-			if (result == null)
-				result = caseDescribableElement(deliveryProcess);
-			if (result == null)
-				result = caseNamedElement(deliveryProcess);
-			if (result == null)
-				result = caseClassifier(deliveryProcess);
-			if (result == null)
-				result = caseElement(deliveryProcess);
-			if (result == null)
-				result = caseType(deliveryProcess);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS: {
-			org.eclipse.epf.uma.Process process = (org.eclipse.epf.uma.Process) theEObject;
-			Object result = caseProcess(process);
-			if (result == null)
-				result = caseActivity(process);
-			if (result == null)
-				result = caseWorkBreakdownElement(process);
-			if (result == null)
-				result = caseVariabilityElement(process);
-			if (result == null)
-				result = caseWorkDefinition(process);
-			if (result == null)
-				result = caseBreakdownElement(process);
-			if (result == null)
-				result = caseMethodElement(process);
-			if (result == null)
-				result = caseProcessElement(process);
-			if (result == null)
-				result = casePackageableElement(process);
-			if (result == null)
-				result = caseDescribableElement(process);
-			if (result == null)
-				result = caseNamedElement(process);
-			if (result == null)
-				result = caseClassifier(process);
-			if (result == null)
-				result = caseElement(process);
-			if (result == null)
-				result = caseType(process);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.CAPABILITY_PATTERN: {
-			CapabilityPattern capabilityPattern = (CapabilityPattern) theEObject;
-			Object result = caseCapabilityPattern(capabilityPattern);
-			if (result == null)
-				result = caseProcess(capabilityPattern);
-			if (result == null)
-				result = caseActivity(capabilityPattern);
-			if (result == null)
-				result = caseWorkBreakdownElement(capabilityPattern);
-			if (result == null)
-				result = caseVariabilityElement(capabilityPattern);
-			if (result == null)
-				result = caseWorkDefinition(capabilityPattern);
-			if (result == null)
-				result = caseBreakdownElement(capabilityPattern);
-			if (result == null)
-				result = caseMethodElement(capabilityPattern);
-			if (result == null)
-				result = caseProcessElement(capabilityPattern);
-			if (result == null)
-				result = casePackageableElement(capabilityPattern);
-			if (result == null)
-				result = caseDescribableElement(capabilityPattern);
-			if (result == null)
-				result = caseNamedElement(capabilityPattern);
-			if (result == null)
-				result = caseClassifier(capabilityPattern);
-			if (result == null)
-				result = caseElement(capabilityPattern);
-			if (result == null)
-				result = caseType(capabilityPattern);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_PLANNING_TEMPLATE: {
-			ProcessPlanningTemplate processPlanningTemplate = (ProcessPlanningTemplate) theEObject;
-			Object result = caseProcessPlanningTemplate(processPlanningTemplate);
-			if (result == null)
-				result = caseProcess(processPlanningTemplate);
-			if (result == null)
-				result = caseActivity(processPlanningTemplate);
-			if (result == null)
-				result = caseWorkBreakdownElement(processPlanningTemplate);
-			if (result == null)
-				result = caseVariabilityElement(processPlanningTemplate);
-			if (result == null)
-				result = caseWorkDefinition(processPlanningTemplate);
-			if (result == null)
-				result = caseBreakdownElement(processPlanningTemplate);
-			if (result == null)
-				result = caseMethodElement(processPlanningTemplate);
-			if (result == null)
-				result = caseProcessElement(processPlanningTemplate);
-			if (result == null)
-				result = casePackageableElement(processPlanningTemplate);
-			if (result == null)
-				result = caseDescribableElement(processPlanningTemplate);
-			if (result == null)
-				result = caseNamedElement(processPlanningTemplate);
-			if (result == null)
-				result = caseClassifier(processPlanningTemplate);
-			if (result == null)
-				result = caseElement(processPlanningTemplate);
-			if (result == null)
-				result = caseType(processPlanningTemplate);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.ROADMAP: {
-			Roadmap roadmap = (Roadmap) theEObject;
-			Object result = caseRoadmap(roadmap);
-			if (result == null)
-				result = caseGuidance(roadmap);
-			if (result == null)
-				result = caseContentElement(roadmap);
-			if (result == null)
-				result = caseDescribableElement(roadmap);
-			if (result == null)
-				result = caseVariabilityElement(roadmap);
-			if (result == null)
-				result = caseMethodElement(roadmap);
-			if (result == null)
-				result = caseClassifier(roadmap);
-			if (result == null)
-				result = casePackageableElement(roadmap);
-			if (result == null)
-				result = caseType(roadmap);
-			if (result == null)
-				result = caseNamedElement(roadmap);
-			if (result == null)
-				result = caseElement(roadmap);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_COMPONENT: {
-			ProcessComponent processComponent = (ProcessComponent) theEObject;
-			Object result = caseProcessComponent(processComponent);
-			if (result == null)
-				result = caseProcessPackage(processComponent);
-			if (result == null)
-				result = caseMethodUnit(processComponent);
-			if (result == null)
-				result = caseMethodPackage(processComponent);
-			if (result == null)
-				result = caseMethodElement(processComponent);
-			if (result == null)
-				result = casePackage(processComponent);
-			if (result == null)
-				result = casePackageableElement(processComponent);
-			if (result == null)
-				result = caseNamespace(processComponent);
-			if (result == null)
-				result = caseNamedElement(processComponent);
-			if (result == null)
-				result = caseElement(processComponent);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_PACKAGE: {
-			ProcessPackage processPackage = (ProcessPackage) theEObject;
-			Object result = caseProcessPackage(processPackage);
-			if (result == null)
-				result = caseMethodPackage(processPackage);
-			if (result == null)
-				result = caseMethodElement(processPackage);
-			if (result == null)
-				result = casePackage(processPackage);
-			if (result == null)
-				result = casePackageableElement(processPackage);
-			if (result == null)
-				result = caseNamespace(processPackage);
-			if (result == null)
-				result = caseNamedElement(processPackage);
-			if (result == null)
-				result = caseElement(processPackage);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_COMPONENT_INTERFACE: {
-			ProcessComponentInterface processComponentInterface = (ProcessComponentInterface) theEObject;
-			Object result = caseProcessComponentInterface(processComponentInterface);
-			if (result == null)
-				result = caseBreakdownElement(processComponentInterface);
-			if (result == null)
-				result = caseProcessElement(processComponentInterface);
-			if (result == null)
-				result = caseDescribableElement(processComponentInterface);
-			if (result == null)
-				result = caseMethodElement(processComponentInterface);
-			if (result == null)
-				result = caseClassifier(processComponentInterface);
-			if (result == null)
-				result = casePackageableElement(processComponentInterface);
-			if (result == null)
-				result = caseType(processComponentInterface);
-			if (result == null)
-				result = caseNamedElement(processComponentInterface);
-			if (result == null)
-				result = caseElement(processComponentInterface);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_COMPONENT_DESCRIPTOR: {
-			ProcessComponentDescriptor processComponentDescriptor = (ProcessComponentDescriptor) theEObject;
-			Object result = caseProcessComponentDescriptor(processComponentDescriptor);
-			if (result == null)
-				result = caseDescriptor(processComponentDescriptor);
-			if (result == null)
-				result = caseBreakdownElement(processComponentDescriptor);
-			if (result == null)
-				result = caseProcessElement(processComponentDescriptor);
-			if (result == null)
-				result = caseDescribableElement(processComponentDescriptor);
-			if (result == null)
-				result = caseMethodElement(processComponentDescriptor);
-			if (result == null)
-				result = caseClassifier(processComponentDescriptor);
-			if (result == null)
-				result = casePackageableElement(processComponentDescriptor);
-			if (result == null)
-				result = caseType(processComponentDescriptor);
-			if (result == null)
-				result = caseNamedElement(processComponentDescriptor);
-			if (result == null)
-				result = caseElement(processComponentDescriptor);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.METHOD_PLUGIN: {
-			MethodPlugin methodPlugin = (MethodPlugin) theEObject;
-			Object result = caseMethodPlugin(methodPlugin);
-			if (result == null)
-				result = caseMethodUnit(methodPlugin);
-			if (result == null)
-				result = casePackage(methodPlugin);
-			if (result == null)
-				result = caseMethodElement(methodPlugin);
-			if (result == null)
-				result = caseNamespace(methodPlugin);
-			if (result == null)
-				result = casePackageableElement(methodPlugin);
-			if (result == null)
-				result = caseNamedElement(methodPlugin);
-			if (result == null)
-				result = caseElement(methodPlugin);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.VARIABILITY_ELEMENT: {
-			VariabilityElement variabilityElement = (VariabilityElement) theEObject;
-			Object result = caseVariabilityElement(variabilityElement);
-			if (result == null)
-				result = caseMethodElement(variabilityElement);
-			if (result == null)
-				result = casePackageableElement(variabilityElement);
-			if (result == null)
-				result = caseNamedElement(variabilityElement);
-			if (result == null)
-				result = caseElement(variabilityElement);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.METHOD_UNIT: {
-			MethodUnit methodUnit = (MethodUnit) theEObject;
-			Object result = caseMethodUnit(methodUnit);
-			if (result == null)
-				result = caseMethodElement(methodUnit);
-			if (result == null)
-				result = casePackageableElement(methodUnit);
-			if (result == null)
-				result = caseNamedElement(methodUnit);
-			if (result == null)
-				result = caseElement(methodUnit);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.METHOD_CONFIGURATION: {
-			MethodConfiguration methodConfiguration = (MethodConfiguration) theEObject;
-			Object result = caseMethodConfiguration(methodConfiguration);
-			if (result == null)
-				result = caseMethodUnit(methodConfiguration);
-			if (result == null)
-				result = caseMethodElement(methodConfiguration);
-			if (result == null)
-				result = casePackageableElement(methodConfiguration);
-			if (result == null)
-				result = caseNamedElement(methodConfiguration);
-			if (result == null)
-				result = caseElement(methodConfiguration);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.PROCESS_FAMILY: {
-			ProcessFamily processFamily = (ProcessFamily) theEObject;
-			Object result = caseProcessFamily(processFamily);
-			if (result == null)
-				result = caseMethodConfiguration(processFamily);
-			if (result == null)
-				result = caseMethodUnit(processFamily);
-			if (result == null)
-				result = caseMethodElement(processFamily);
-			if (result == null)
-				result = casePackageableElement(processFamily);
-			if (result == null)
-				result = caseNamedElement(processFamily);
-			if (result == null)
-				result = caseElement(processFamily);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case UmaPackage.METHOD_LIBRARY: {
-			MethodLibrary methodLibrary = (MethodLibrary) theEObject;
-			Object result = caseMethodLibrary(methodLibrary);
-			if (result == null)
-				result = caseMethodUnit(methodLibrary);
-			if (result == null)
-				result = casePackage(methodLibrary);
-			if (result == null)
-				result = caseMethodElement(methodLibrary);
-			if (result == null)
-				result = caseNamespace(methodLibrary);
-			if (result == null)
-				result = casePackageableElement(methodLibrary);
-			if (result == null)
-				result = caseNamedElement(methodLibrary);
-			if (result == null)
-				result = caseElement(methodLibrary);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		default:
-			return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Classifier</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 interpretting the object as an instance of '<em>Classifier</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseClassifier(Classifier object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Type</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 interpretting the object as an instance of '<em>Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseType(Type object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Element</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 interpretting the object as an instance of '<em>Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseElement(Element object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Named Element</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 interpretting the object as an instance of '<em>Named Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNamedElement(NamedElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Packageable Element</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 interpretting the object as an instance of '<em>Packageable Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePackageableElement(PackageableElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Package</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 interpretting the object as an instance of '<em>Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePackage(org.eclipse.epf.uma.Package object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Namespace</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 interpretting the object as an instance of '<em>Namespace</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNamespace(Namespace object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Element</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 interpretting the object as an instance of '<em>Method Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodElement(MethodElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Constraint</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 interpretting the object as an instance of '<em>Constraint</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConstraint(Constraint object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Element Property</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 interpretting the object as an instance of '<em>Method Element Property</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodElementProperty(MethodElementProperty object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Element</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 interpretting the object as an instance of '<em>Content Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentElement(ContentElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Describable Element</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 interpretting the object as an instance of '<em>Describable Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescribableElement(DescribableElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Description</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 interpretting the object as an instance of '<em>Content Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentDescription(ContentDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Section</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 interpretting the object as an instance of '<em>Section</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSection(Section object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role</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 interpretting the object as an instance of '<em>Role</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRole(Role object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product</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 interpretting the object as an instance of '<em>Work Product</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProduct(WorkProduct object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Task</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 interpretting the object as an instance of '<em>Task</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTask(Task object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Definition</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 interpretting the object as an instance of '<em>Work Definition</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkDefinition(WorkDefinition object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Step</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 interpretting the object as an instance of '<em>Step</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseStep(Step object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Guidance</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 interpretting the object as an instance of '<em>Guidance</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGuidance(Guidance object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Artifact</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 interpretting the object as an instance of '<em>Artifact</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArtifact(Artifact object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Deliverable</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 interpretting the object as an instance of '<em>Deliverable</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliverable(Deliverable object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Outcome</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 interpretting the object as an instance of '<em>Outcome</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOutcome(Outcome object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Package</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 interpretting the object as an instance of '<em>Method Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodPackage(MethodPackage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Package</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 interpretting the object as an instance of '<em>Content Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentPackage(ContentPackage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Artifact Description</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 interpretting the object as an instance of '<em>Artifact Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArtifactDescription(ArtifactDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product Description</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 interpretting the object as an instance of '<em>Work Product Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProductDescription(WorkProductDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Deliverable Description</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 interpretting the object as an instance of '<em>Deliverable Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliverableDescription(DeliverableDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Description</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 interpretting the object as an instance of '<em>Role Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleDescription(RoleDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Task Description</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 interpretting the object as an instance of '<em>Task Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTaskDescription(TaskDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Guidance Description</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 interpretting the object as an instance of '<em>Guidance Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGuidanceDescription(GuidanceDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Practice Description</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 interpretting the object as an instance of '<em>Practice Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePracticeDescription(PracticeDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Point</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 interpretting the object as an instance of '<em>Point</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePoint(Point object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Graph Element</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 interpretting the object as an instance of '<em>Graph Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGraphElement(GraphElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Diagram Element</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 interpretting the object as an instance of '<em>Diagram Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDiagramElement(DiagramElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Diagram Link</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 interpretting the object as an instance of '<em>Diagram Link</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDiagramLink(DiagramLink object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Graph Connector</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 interpretting the object as an instance of '<em>Graph Connector</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGraphConnector(GraphConnector object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Semantic Model Bridge</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 interpretting the object as an instance of '<em>Semantic Model Bridge</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSemanticModelBridge(SemanticModelBridge object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Dimension</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 interpretting the object as an instance of '<em>Dimension</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDimension(Dimension object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Reference</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 interpretting the object as an instance of '<em>Reference</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReference(Reference object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Property</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 interpretting the object as an instance of '<em>Property</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProperty(Property object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Graph Edge</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 interpretting the object as an instance of '<em>Graph Edge</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGraphEdge(GraphEdge object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Diagram</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 interpretting the object as an instance of '<em>Diagram</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDiagram(Diagram object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Graph Node</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 interpretting the object as an instance of '<em>Graph Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGraphNode(GraphNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Simple Semantic Model Element</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 interpretting the object as an instance of '<em>Simple Semantic Model Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSimpleSemanticModelElement(
-			SimpleSemanticModelElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>UMA Semantic Model Bridge</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 interpretting the object as an instance of '<em>UMA Semantic Model Bridge</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseUMASemanticModelBridge(UMASemanticModelBridge object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Core Semantic Model Bridge</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 interpretting the object as an instance of '<em>Core Semantic Model Bridge</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCoreSemanticModelBridge(CoreSemanticModelBridge object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Leaf Element</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 interpretting the object as an instance of '<em>Leaf Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLeafElement(LeafElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Text Element</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 interpretting the object as an instance of '<em>Text Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTextElement(TextElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Image</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 interpretting the object as an instance of '<em>Image</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseImage(Image object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Graphic Primitive</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 interpretting the object as an instance of '<em>Graphic Primitive</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGraphicPrimitive(GraphicPrimitive object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Polyline</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 interpretting the object as an instance of '<em>Polyline</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePolyline(Polyline object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Ellipse</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 interpretting the object as an instance of '<em>Ellipse</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEllipse(Ellipse object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Activity</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 interpretting the object as an instance of '<em>Activity</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseActivity(Activity object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Breakdown Element</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 interpretting the object as an instance of '<em>Work Breakdown Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkBreakdownElement(WorkBreakdownElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Breakdown Element</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 interpretting the object as an instance of '<em>Breakdown Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBreakdownElement(BreakdownElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Milestone</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 interpretting the object as an instance of '<em>Milestone</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMilestone(Milestone object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Iteration</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 interpretting the object as an instance of '<em>Iteration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIteration(Iteration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Phase</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 interpretting the object as an instance of '<em>Phase</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePhase(Phase object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Team Profile</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 interpretting the object as an instance of '<em>Team Profile</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTeamProfile(TeamProfile object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Descriptor</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 interpretting the object as an instance of '<em>Role Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleDescriptor(RoleDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Order</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 interpretting the object as an instance of '<em>Work Order</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkOrder(WorkOrder object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Element</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 interpretting the object as an instance of '<em>Process Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessElement(ProcessElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Planning Data</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 interpretting the object as an instance of '<em>Planning Data</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePlanningData(PlanningData object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Descriptor</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 interpretting the object as an instance of '<em>Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescriptor(Descriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Task Descriptor</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 interpretting the object as an instance of '<em>Task Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTaskDescriptor(TaskDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product Descriptor</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 interpretting the object as an instance of '<em>Work Product Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProductDescriptor(WorkProductDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Composite Role</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 interpretting the object as an instance of '<em>Composite Role</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCompositeRole(CompositeRole object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Breakdown Element Description</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 interpretting the object as an instance of '<em>Breakdown Element Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBreakdownElementDescription(
-			BreakdownElementDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Activity Description</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 interpretting the object as an instance of '<em>Activity Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseActivityDescription(ActivityDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Delivery Process Description</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 interpretting the object as an instance of '<em>Delivery Process Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliveryProcessDescription(
-			DeliveryProcessDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Description</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 interpretting the object as an instance of '<em>Process Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessDescription(ProcessDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Descriptor Description</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 interpretting the object as an instance of '<em>Descriptor Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescriptorDescription(DescriptorDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Concept</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 interpretting the object as an instance of '<em>Concept</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConcept(Concept object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Checklist</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 interpretting the object as an instance of '<em>Checklist</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseChecklist(Checklist object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Example</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 interpretting the object as an instance of '<em>Example</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExample(Example object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Guideline</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 interpretting the object as an instance of '<em>Guideline</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGuideline(Guideline object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Estimation Considerations</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 interpretting the object as an instance of '<em>Estimation Considerations</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEstimationConsiderations(EstimationConsiderations object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Report</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 interpretting the object as an instance of '<em>Report</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReport(Report object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Template</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 interpretting the object as an instance of '<em>Template</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTemplate(Template object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Supporting Material</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 interpretting the object as an instance of '<em>Supporting Material</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSupportingMaterial(SupportingMaterial object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tool Mentor</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 interpretting the object as an instance of '<em>Tool Mentor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseToolMentor(ToolMentor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Whitepaper</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 interpretting the object as an instance of '<em>Whitepaper</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWhitepaper(Whitepaper object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Term Definition</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 interpretting the object as an instance of '<em>Term Definition</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTermDefinition(TermDefinition object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Practice</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 interpretting the object as an instance of '<em>Practice</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePractice(Practice object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Reusable Asset</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 interpretting the object as an instance of '<em>Reusable Asset</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReusableAsset(ReusableAsset object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>State</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 interpretting the object as an instance of '<em>State</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseState(State object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Vertex</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 interpretting the object as an instance of '<em>Vertex</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseVertex(Vertex object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Region</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 interpretting the object as an instance of '<em>Region</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRegion(Region object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>State Machine</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 interpretting the object as an instance of '<em>State Machine</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseStateMachine(StateMachine object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Transition</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 interpretting the object as an instance of '<em>Transition</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTransition(Transition object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Pseudo State</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 interpretting the object as an instance of '<em>Pseudo State</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePseudoState(PseudoState object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Discipline</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 interpretting the object as an instance of '<em>Discipline</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDiscipline(Discipline object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Category</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 interpretting the object as an instance of '<em>Content Category</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentCategory(ContentCategory object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Set</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 interpretting the object as an instance of '<em>Role Set</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleSet(RoleSet object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Domain</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 interpretting the object as an instance of '<em>Domain</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDomain(Domain object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product Type</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 interpretting the object as an instance of '<em>Work Product Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProductType(WorkProductType object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Discipline Grouping</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 interpretting the object as an instance of '<em>Discipline Grouping</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDisciplineGrouping(DisciplineGrouping object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tool</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 interpretting the object as an instance of '<em>Tool</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTool(Tool object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Set Grouping</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 interpretting the object as an instance of '<em>Role Set Grouping</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleSetGrouping(RoleSetGrouping object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Custom Category</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 interpretting the object as an instance of '<em>Custom Category</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCustomCategory(CustomCategory object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Delivery Process</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 interpretting the object as an instance of '<em>Delivery Process</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliveryProcess(DeliveryProcess object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process</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 interpretting the object as an instance of '<em>Process</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcess(org.eclipse.epf.uma.Process object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Capability Pattern</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 interpretting the object as an instance of '<em>Capability Pattern</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCapabilityPattern(CapabilityPattern object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Planning Template</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 interpretting the object as an instance of '<em>Process Planning Template</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessPlanningTemplate(ProcessPlanningTemplate object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Roadmap</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 interpretting the object as an instance of '<em>Roadmap</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoadmap(Roadmap object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Component</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 interpretting the object as an instance of '<em>Process Component</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessComponent(ProcessComponent object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Package</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 interpretting the object as an instance of '<em>Process Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessPackage(ProcessPackage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Component Interface</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 interpretting the object as an instance of '<em>Process Component Interface</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessComponentInterface(ProcessComponentInterface object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Component Descriptor</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 interpretting the object as an instance of '<em>Process Component Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessComponentDescriptor(
-			ProcessComponentDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Plugin</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 interpretting the object as an instance of '<em>Method Plugin</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodPlugin(MethodPlugin object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Variability Element</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 interpretting the object as an instance of '<em>Variability Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseVariabilityElement(VariabilityElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Unit</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 interpretting the object as an instance of '<em>Method Unit</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodUnit(MethodUnit object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method 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 interpretting the object as an instance of '<em>Method Configuration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodConfiguration(MethodConfiguration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Family</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 interpretting the object as an instance of '<em>Process Family</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessFamily(ProcessFamily object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Library</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 interpretting the object as an instance of '<em>Method Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodLibrary(MethodLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting 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 interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //UmaSwitch
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaUtil.java b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaUtil.java
deleted file mode 100644
index 04db419..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/UmaUtil.java
+++ /dev/null
@@ -1,807 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.uma.util;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EContentsEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.epf.uma.Activity;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.Diagram;
-import org.eclipse.epf.uma.Discipline;
-import org.eclipse.epf.uma.DisciplineGrouping;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.MethodUnit;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessElement;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.Role;
-import org.eclipse.epf.uma.RoleSet;
-import org.eclipse.epf.uma.RoleSetGrouping;
-import org.eclipse.epf.uma.Task;
-import org.eclipse.epf.uma.UmaFactory;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
-import org.eclipse.epf.uma.WorkBreakdownElement;
-import org.eclipse.epf.uma.WorkOrder;
-import org.eclipse.epf.uma.WorkProduct;
-import org.eclipse.epf.uma.WorkProductType;
-
-/**
- * Utility class for accessing and updating the UMA model objects.
- * 
- * @author Phong Nguyen Le
- * @author Kelvin Low
- * @since 1.0
- */
-public class UmaUtil {
-
-	/**
-	 * Replaces the feature values of an old method element with the
-	 * corresponding feature values of a new method element.
-	 * <p>
-	 * Note: All features are updated except for the GUID feature.
-	 * 
-	 * @param oldElement
-	 *            the old method element
-	 * @param newElement
-	 *            the new method element
-	 */
-	public static void replace(MethodElement oldElement,
-			MethodElement newElement) {
-		List features = oldElement.eClass().getEAllStructuralFeatures();
-		if (features != null) {
-			int size = features.size();
-			for (int i = 0; i < size; i++) {
-				EStructuralFeature feature = (EStructuralFeature) features
-						.get(i);
-				if (feature != UmaPackage.eINSTANCE.getMethodElement_Guid()) {
-					// don't replace GUID
-					Object newValue = newElement.eGet(feature);
-					oldElement.eSet(feature, newValue);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * Checks whether a model object has a direct resource.
-	 * 
-	 * @param e
-	 *            a model object
-	 * @return <code>true</code> if the specified model object is contained by
-	 *         a resource
-	 */
-	public static boolean hasDirectResource(EObject e) {
-		Resource resource = e.eResource();
-		return (resource != null && resource.getContents().contains(e));
-	}
-	
-	/**
-	 * Gets all resources owned by the specified object.
-	 * 
-	 * @param e
-	 * @return
-	 */
-	public static Collection<Resource> getResources(EObject e) {
-		HashSet<Resource> resources = new HashSet<Resource>();
-		getResources(e, resources);
-		return resources;
-	}
-	
-	public static void getResources(EObject e, Collection<Resource> resources) {
-		if (UmaUtil.hasDirectResource(e)) {
-			resources.add(e.eResource());
-		} else {
-			for (Iterator iter = e.eContents().iterator(); iter.hasNext();) {
-				getResources((EObject) iter.next(), resources);
-			}
-		}
-	}
-
-	/**
-	 * Gets a specific type of adapter associated with a notifier.
-	 * 
-	 * @param eObj
-	 *            a notifier
-	 * @param cls
-	 *            the adapter class
-	 * @return an <code>Adapter<code> object or <code>null</code>
-	 */
-	public static Object getAdapter(EObject eObj, Class cls) {
-		for (Iterator adapters = eObj.eAdapters().iterator(); adapters
-				.hasNext();) {
-			Adapter adapter = (Adapter) adapters.next();
-			if (cls.isInstance(adapter)) {
-				return adapter;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Removes all adapters of the specified object and all of its children.
-	 * 
-	 * @param eObject
-	 */
-	public static void removeAllAdapters(EObject eObject) {
-		for (TreeIterator<EObject> iter = eObject.eAllContents(); iter.hasNext();) {
-			EObject o = iter.next();
-			o.eAdapters().clear();
-		}
-	}
-
-	/**
-	 * Gets the method package with a specific name.
-	 * 
-	 * @param methodPackages
-	 *            a list of method packages
-	 * @param name
-	 *            a method package name
-	 * @return a method package with the matching name or <code>null</code>
-	 */
-	public static MethodPackage findMethodPackage(List methodPackages,
-			String name) {
-		for (int i = methodPackages.size() - 1; i > -1; i--) {
-			Object obj = methodPackages.get(i);
-			if (obj instanceof MethodPackage) {
-				MethodPackage pkg = (MethodPackage) obj;
-				if (name.equals(pkg.getName())) {
-					return pkg;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the method package with a specific path.
-	 * 
-	 * @param methodPlugin
-	 *            a method plug-in
-	 * @param path
-	 *            an array of method element path fragments
-	 * @return a method package with the matching path or <code>null</code>
-	 */
-	public static MethodPackage findMethodPackage(MethodPlugin methodPlugin,
-			String[] path) {
-		MethodPackage pkg = null;
-		List list = methodPlugin.getMethodPackages();
-		for (int i = 0; i < path.length; i++) {
-			pkg = findMethodPackage(list, path[i]);
-			if (pkg == null) {
-				return null;
-			}
-			list = pkg.getChildPackages();
-		}
-		return pkg;
-	}
-
-	/**
-	 * Gets the parent activity of a breakdown element.
-	 * 
-	 * @param e
-	 *            a breakdown element
-	 * @return the parent activity or <code>null</code>
-	 */
-	public static Activity getParentActivity(BreakdownElement e) {
-		return e.getSuperActivities();
-	}
-
-	/**
-	 * Gets the parent activity of a work order.
-	 * 
-	 * @param workOrder
-	 *            a work order
-	 * @return the parent activity or <code>null</code>
-	 */
-	public static Activity getOwningActivity(WorkOrder workOrder) {
-		ProcessPackage pkg = (ProcessPackage) workOrder.eContainer();
-		for (Iterator iter = pkg.getProcessElements().iterator(); iter
-				.hasNext();) {
-			Object element = iter.next();
-			if (element instanceof Activity) {
-				return (Activity) element;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the content package with a specific name.
-	 * 
-	 * @param methodPackages
-	 *            a list of method packages
-	 * @param name
-	 *            a content package name
-	 * @return a content package with the mathcing name or <code>null</code>
-	 */
-	public static ContentPackage findContentPackage(List methodPackages,
-			String name) {
-		for (int i = methodPackages.size() - 1; i > -1; i--) {
-			Object obj = methodPackages.get(i);
-			if (obj instanceof ContentPackage) {
-				ContentPackage pkg = (ContentPackage) obj;
-				if (name.equals(pkg.getName())) {
-					return pkg;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the content package with a specific path.
-	 * 
-	 * @param methodPlugin
-	 *            a method plug-in
-	 * @param path
-	 *            an array of method element path fragments
-	 * @return a content package with the matching path or <code>null</code>
-	 */
-	public static ContentPackage findContentPackage(MethodPlugin methodPlugin,
-			String[] path) {
-		ContentPackage pkg = null;
-		List list = methodPlugin.getMethodPackages();
-		for (int i = 0; i < path.length; i++) {
-			pkg = findContentPackage(list, path[i]);
-			if (pkg == null) {
-				return null;
-			}
-			list = pkg.getChildPackages();
-		}
-		return pkg;
-	}
-
-	/**
-	 * Gets the parent method plug-in of a method element.
-	 * 
-	 * @param element
-	 *            a Method element
-	 * @return the parent method plug-in or <code>null</code>
-	 */
-	public static MethodPlugin getMethodPlugin(EObject element) {
-		for (EObject obj = element; obj != null; obj = obj.eContainer()) {
-			if (obj instanceof MethodPlugin) {
-				return (MethodPlugin) obj;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the parent method library of a method element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return the parent method library or <code>null</code>
-	 */
-	public static MethodLibrary getMethodLibrary(EObject element) {
-		for (EObject obj = element; obj != null; obj = obj.eContainer()) {
-			if (obj instanceof MethodLibrary) {
-				return (MethodLibrary) obj;
-			}
-		}
-		return null;
-	}
-	
-	public static EObject getTopContainer(EObject element) {
-		EObject container = null;
-		for (EObject obj = element.eContainer(); obj != null; obj = obj.eContainer()) {
-			container = obj;
-		}
-		return container;		
-	}
-
-	/**
-	 * Gets the parent content package of a content element.
-	 * 
-	 * @param element
-	 *            a content element
-	 * @return the parent content package or <code>null</code>
-	 */
-	public static ContentPackage getContentPackage(EObject element) {
-		for (EObject obj = element; obj != null; obj = obj.eContainer()) {
-			if (obj instanceof ContentPackage) {
-				return (ContentPackage) obj;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the parent process package of a process element.
-	 * 
-	 * @param element
-	 *            a Process element
-	 * @return the parent process package or <code>null</code>
-	 */
-	public static ProcessPackage getProcessPackage(EObject element) {
-		for (EObject obj = element; obj != null; obj = obj.eContainer()) {
-			if (obj instanceof ProcessPackage) {
-				return (ProcessPackage) obj;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the parent diagram of a diagram element.
-	 * 
-	 * @param element
-	 *            a diagram element
-	 * @return the parent diagram or <code>null</code>
-	 */
-	public static Diagram getDiagram(EObject element) {
-		for (EObject obj = element; obj != null; obj = obj.eContainer()) {
-			if (obj instanceof Diagram) {
-				return (Diagram) obj;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Checks whether a method element is contained by a specific content
-	 * package.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @param contentPackage
-	 *            a content package
-	 * @return <code>true</code> if the method element is contained by the
-	 *         content package
-	 */
-	public static boolean isContainedByContentPackage(EObject element,
-			ContentPackage contentPackage) {
-		return isContainedBy(element, contentPackage);
-	}
-
-	/**
-	 * Checks whether a model object is contained by a specific container.
-	 * 
-	 * @param eObj
-	 *            a model object
-	 * @param container
-	 *            a container
-	 * @return <code>true</code> if the model object is contained by the
-	 *         container
-	 */
-	public static boolean isContainedBy(EObject eObj, Object container) {
-		if (eObj == null) {
-			return false;
-		}
-		for (EObject obj = eObj.eContainer(); obj != null; obj = obj
-				.eContainer()) {
-			if (obj == container) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Generates and returns a unique ID.
-	 * 
-	 * @return a unique ID
-	 */
-	public static String generateGUID() {
-		return EcoreUtil.generateUUID();
-	}
-
-	/**
-	 * Creates and returns the content description name of a given method
-	 * element.
-	 * 
-	 * @param element
-	 *            a method element
-	 * @return a suitable content description name
-	 */
-	public static String createContentDescriptionName(MethodElement e) {
-		return e.getName() + ',' + e.getGuid();
-	}
-
-	public static void getAllSupers(List supers, VariabilityElement e,
-			VariabilityType type) {
-		VariabilityElement base = e.getVariabilityBasedOnElement();
-		if (base != null && e.getVariabilityType() == type
-				&& !supers.contains(base)) {
-			supers.add(base);
-			getAllSupers(supers, base, type);
-		}
-	}
-
-	public static void getAllSupersBoth(List supers, VariabilityElement e,
-			VariabilityType type1, VariabilityType type2) {
-		VariabilityElement base = e.getVariabilityBasedOnElement();
-		if (base != null
-				&& (e.getVariabilityType() == type1 || e.getVariabilityType() == type2)
-				&& !supers.contains(base)) {
-			supers.add(base);
-			getAllSupersBoth(supers, base, type1, type2);
-		}
-	}
-
-	/**
-	 * Gets the class of a content element.
-	 * 
-	 * @param contentElement
-	 *            a content element
-	 * @return the content element class
-	 */
-	public static Class getClassOfContentElement(ContentElement contentElement) {
-		if (contentElement instanceof Role)
-			return Role.class;
-		if (contentElement instanceof Task)
-			return Task.class;
-		if (contentElement instanceof WorkProduct)
-			return WorkProduct.class;
-		if (contentElement instanceof Guidance)
-			return Guidance.class;
-		if (contentElement instanceof Domain)
-			return Domain.class;
-		if (contentElement instanceof Discipline)
-			return Discipline.class;
-		if (contentElement instanceof DisciplineGrouping)
-			return DisciplineGrouping.class;
-		if (contentElement instanceof RoleSet)
-			return RoleSet.class;
-		if (contentElement instanceof RoleSetGrouping)
-			return RoleSetGrouping.class;
-		if (contentElement instanceof WorkProductType)
-			return WorkProductType.class;
-		return Object.class;
-	}
-
-	/**
-	 * Creates a default work order for two work breakdown elements.
-	 * 
-	 * @param e
-	 *            a work breakdown element
-	 * @param predecessor
-	 *            the predecessor work breakdown element
-	 * @return the newly created work order
-	 */
-	public static WorkOrder createDefaultWorkOrder(WorkBreakdownElement succ,
-			WorkBreakdownElement pred) {
-		return createDefaultWorkOrder(succ, pred, true);
-	}
-	
-	public static WorkOrder createDefaultWorkOrder(WorkBreakdownElement succ,
-			WorkBreakdownElement pred, boolean link) {
-		WorkOrder wo = UmaFactory.eINSTANCE.createWorkOrder();
-		wo.setPred(pred);
-		if(link) {
-			succ.getLinkToPredecessor().add(wo);
-		}
-		return wo;
-	}	
-
-	/**
-	 * Locates the work order associated with two work breakdown elements.
-	 * 
-	 * @param e
-	 *            a work breakdown element
-	 * @param predecessor
-	 *            the predecessor work breakdown element
-	 * @return a work order or <code>null</code>
-	 */
-	public static WorkOrder findWorkOrder(WorkBreakdownElement e,
-			Object predecessor) {
-		for (Iterator iter = e.getLinkToPredecessor().iterator(); iter
-				.hasNext();) {
-			WorkOrder workOrder = (WorkOrder) iter.next();
-			if (workOrder.getPred() == predecessor)
-				return workOrder;
-		}
-
-		return null;
-	}
-	
-	/**
-	 * Locates the work order associated with two work breakdown elements. If
-	 * includeBase is true, will collect WorkOrder for base element of the
-	 * predecessor as well.
-	 * 
-	 * @param e
-	 * @param predecessor
-	 * @param includeBase
-	 * @return
-	 */
-	public static Collection<WorkOrder> findWorkOrder(WorkBreakdownElement e, WorkBreakdownElement predecessor, boolean includeBase) {
-		if(!includeBase) {
-			WorkOrder wo = findWorkOrder(e, predecessor);
-			return (Collection<WorkOrder>) (wo == null ? Collections.emptyList() : Collections.singletonList(wo));
-		}
-		ArrayList<WorkOrder> workOrders = new ArrayList<WorkOrder>();
-		collectWorkOrders(workOrders, e, predecessor);
-		return workOrders;
-	}
-	
-	/**
-	 * Collects the WorkOrder objects associated between the specified work
-	 * breakdown element <code>e</code> and the predecessor or any of its base elements.
-	 * 
-	 * @param workOrders
-	 * @param e
-	 * @param predecessor
-	 */
-	public static void collectWorkOrders(Collection<WorkOrder> workOrders,
-			WorkBreakdownElement e, Object predecessor) {
-		for (Iterator iter = e.getLinkToPredecessor().iterator(); iter
-				.hasNext();) {
-			WorkOrder workOrder = (WorkOrder) iter.next();
-			if (workOrder.getPred() == predecessor) {
-				workOrders.add(workOrder);
-			}
-		}
-		if(predecessor instanceof VariabilityElement) {
-			VariabilityElement ve = ((VariabilityElement)predecessor).getVariabilityBasedOnElement();
-			if(ve != null) {
-				collectWorkOrders(workOrders, e, ve);
-			}
-		}
-	}
-
-	/**
-	 * Removes the work order associated with two work breakdown elements.
-	 * 
-	 * @param e
-	 *            a work breakdown element
-	 * @param predecessor
-	 *            the predecessor work breakdown element
-	 * @return the removed work order or <code>null</code>
-	 */
-	public static WorkOrder removeWorkOrder(WorkBreakdownElement e,
-			Object predecessor) {
-		for (Iterator iterator = e.getLinkToPredecessor().iterator(); iterator
-				.hasNext();) {
-			WorkOrder order = (WorkOrder) iterator.next();
-			if (order.getPred() == predecessor) {
-				iterator.remove();
-				return order;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the parent process component of a method element.
-	 * 
-	 * @param e
-	 *            a method element, typically a process element
-	 * @return the parent process component or <code>null</code>
-	 */
-	public static ProcessComponent getProcessComponent(MethodElement e) {
-		EObject container;
-		for (container = e; container != null
-				&& !(container instanceof ProcessComponent); container = container
-				.eContainer())
-			;
-		if (container != null) {
-			return ((ProcessComponent) container);
-		}
-		return null;
-	}
-
-	/**
-	 * Gets the parent method unit of a method element.
-	 * 
-	 * @param e
-	 *            a method element
-	 * @return the parent method unit or <code>null</code>
-	 */
-	public static MethodUnit getMethodUnit(MethodElement e) {
-		EObject container;
-		for (container = e; container != null
-				&& !(container instanceof MethodUnit); container = container
-				.eContainer())
-			;
-		if (container != null) {
-			return ((MethodUnit) container);
-		}
-		return null;
-
-	}
-
-	/**
-	 * Checks whether a method plug-in has method elements that reference
-	 * elements in a base plug-in.
-	 * <p>
-	 * Note: This is a expensive call to make for a large method plug-in.
-	 * 
-	 * @param plugin
-	 *            a method plug-in
-	 * @param base
-	 *            a base method plug-in
-	 * @return <code>true</code> if the specified method plug-in contain
-	 *         method elements that reference elements in a base plug-in.
-	 */
-	public static boolean hasReference(MethodPlugin plugin, MethodPlugin base) {
-		for (EContentsEList.FeatureIterator featureIterator = (EContentsEList.FeatureIterator) plugin
-				.eCrossReferences().iterator(); featureIterator.hasNext();) {
-			EObject ref = (EObject) featureIterator.next();
-			EStructuralFeature f = featureIterator.feature();
-
-			if (f != UmaPackage.eINSTANCE.getMethodPlugin_Bases()
-					&& UmaUtil.getMethodPlugin(ref) == base) {
-				return true;
-			}
-		}
-
-		for (Iterator iter = plugin.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-
-			// ignore ProcessElement b/c it can references anything
-			//
-			if (element instanceof ProcessElement) {
-				continue;
-			}
-
-			for (Iterator iterator = element.eCrossReferences().iterator(); iterator
-					.hasNext();) {
-				EObject ref = (EObject) iterator.next();
-				if (getMethodPlugin(ref) == base) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Removes all element references in a method plug-in that point to elements
-	 * in a base plug-in.
-	 * <p>
-	 * Note: This is a expensive call to make for a large method plug-in.
-	 * 
-	 * @param plugin
-	 *            a method plug-in
-	 * @param base
-	 *            the base method plug-in
-	 * @return <code>true</code> if the operation is successful
-	 */
-	public static boolean removeReferences(MethodPlugin plugin,
-			MethodPlugin base) {
-		for (Iterator iter = plugin.eAllContents(); iter.hasNext();) {
-			EObject element = (EObject) iter.next();
-
-			// ignore ProcessElement b/c it can references anything
-			//
-			if (element instanceof ProcessElement) {
-				continue;
-			}
-
-			for (EContentsEList.FeatureIterator featureIterator = (EContentsEList.FeatureIterator) element
-					.eCrossReferences().iterator(); featureIterator.hasNext();) {
-				EObject ref = (EObject) featureIterator.next();
-
-				if (getMethodPlugin(ref) == base) {
-					EStructuralFeature f = featureIterator.feature();
-					if (f.isMany()) {
-						((Collection) element.eGet(f)).remove(ref);
-					} else {
-						element.eSet(f, null);
-					}
-				}
-			}
-		}
-
-		return false;
-	}
-
-	public static String getMessage(IStatus status) {
-		String msg = status.getMessage();
-		if (status.isMultiStatus()) {
-			StringBuffer strBuf = new StringBuffer(msg);
-			IStatus statuses[] = status.getChildren();
-			for (int i = 0; i < statuses.length; i++) {
-				strBuf.append('\n').append(statuses[i].getMessage());
-			}
-			msg = strBuf.toString();
-		}
-		if (msg != null && msg.trim().length() == 0) {
-			msg = null;
-		}
-		return msg;
-	}
-
-	/**
-	 * Generates a GUID using a base GUID.
-	 * 
-	 * @param baseGUID
-	 *            a base GUID
-	 * @return a unique ID
-	 */
-	public static final String generateGUID(String baseGUID) {
-		return GUID.generate(baseGUID);
-	}
-
-	private static class GUID {
-		private static MessageDigest md5 = null;
-
-		private static MessageDigest getMD5() {
-			if (md5 == null) {
-				synchronized (GUID.class) {
-					if (md5 == null) {
-						try {
-							md5 = MessageDigest.getInstance("MD5"); //$NON-NLS-1$
-						} catch (NoSuchAlgorithmException e) {
-							e.printStackTrace();
-						}
-					}
-				}
-			}
-			return md5;
-		}
-
-		public static final String generate(String baseGUID) {
-			MessageDigest md5 = getMD5();
-			md5.update(baseGUID.getBytes());
-			byte[] hash = md5.digest();
-			char[] buffer = new char[23];
-			buffer[0] = '-';
-
-			// Do a base 64 conversion by turning every 3 bytes into 4 base 64
-			// characters
-			//
-			for (int i = 0; i < 5; ++i) {
-				buffer[4 * i + 1] = BASE64_DIGITS[(hash[i * 3] >> 2) & 0x3F];
-				buffer[4 * i + 2] = BASE64_DIGITS[((hash[i * 3] << 4) & 0x30)
-						| ((hash[i * 3 + 1] >> 4) & 0xF)];
-				buffer[4 * i + 3] = BASE64_DIGITS[((hash[i * 3 + 1] << 2) & 0x3C)
-						| ((hash[i * 3 + 2] >> 6) & 0x3)];
-				buffer[4 * i + 4] = BASE64_DIGITS[hash[i * 3 + 2] & 0x3F];
-			}
-
-			// Handle the last byte at the end.
-			//
-			buffer[21] = BASE64_DIGITS[(hash[15] >> 2) & 0x3F];
-			buffer[22] = BASE64_DIGITS[(hash[15] << 4) & 0x30];
-
-			return new String(buffer);
-		}
-
-		private static final char[] BASE64_DIGITS = { 'A', 'B', 'C', 'D', 'E',
-				'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
-				'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c',
-				'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
-				'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0',
-				'1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' };
-	}
-	
-	public static void main(String[] args) {
-		System.out.println(generateGUID());
-	}
-}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/package.html b/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/package.html
deleted file mode 100644
index 83776eb..0000000
--- a/1.5/plugins/org.eclipse.epf.uma/src/org/eclipse/epf/uma/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for accessing the UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.validation/.classpath b/1.5/plugins/org.eclipse.epf.validation/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.validation/.options b/1.5/plugins/org.eclipse.epf.validation/.options
deleted file mode 100644
index cc842fc..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/.options
+++ /dev/null
@@ -1,2 +0,0 @@
-# Turn on debug trace for the Common plug-in
-org.eclipse.epf.validation/debug=true
diff --git a/1.5/plugins/org.eclipse.epf.validation/.project b/1.5/plugins/org.eclipse.epf.validation/.project
deleted file mode 100644
index 32ee2d4..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.validation</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.validation/.settings/org.eclipse.core.resources.prefs b/1.5/plugins/org.eclipse.epf.validation/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index d718e26..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Thu Feb 01 17:03:45 PST 2007
-eclipse.preferences.version=1
-encoding//src/org/eclipse/epf/validation/Resources.properties=8859_1
diff --git a/1.5/plugins/org.eclipse.epf.validation/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.validation/META-INF/MANIFEST.MF
deleted file mode 100644
index ccb0a45..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,18 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.validation;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.epf.validation.Activator
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.validation;visibility:=reexport,
- org.eclipse.epf.uma,
- org.eclipse.epf.library.edit,
- org.eclipse.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.epf.validation,
- org.eclipse.epf.validation.constraints,
- org.eclipse.epf.validation.util
-Bundle-Vendor: %providerName
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.validation/build.properties b/1.5/plugins/org.eclipse.epf.validation/build.properties
deleted file mode 100644
index 0dc34f7..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties
diff --git a/1.5/plugins/org.eclipse.epf.validation/plugin.properties b/1.5/plugins/org.eclipse.epf.validation/plugin.properties
deleted file mode 100644
index 89acd16..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2005, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-# Plug-in
-pluginName=EPF Validation
-providerName=Eclipse.org
-               
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.validation/plugin.xml b/1.5/plugins/org.eclipse.epf.validation/plugin.xml
deleted file mode 100644
index 87a7fc4..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/plugin.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.emf.validation.constraintProviders">
-      <category
-            id="org.eclipse.epf.validation.library.category"
-            name="Method Library Constraints"/>
-      <constraintProvider
-            cache="true"
-            >
-         <package namespaceUri="http://www.eclipse.org/epf/uma/1.0.4/uma.ecore"/>
-         <constraints categories="org.eclipse.epf.validation.library.category">
-            <constraint
-                  class="org.eclipse.epf.validation.constraints.NameConstraint"
-                  id="org.eclipse.epf.validation.constraints.NameConstraint"
-                  lang="Java"
-                  mode="Batch"
-                  name="Name Constraint"
-                  severity="ERROR"
-                  statusCode="1">
-               <message>
-                  A {0} has been found to have children with invalid name or presentation name
-               </message>
-            </constraint>
-            <constraint
-                  class="org.eclipse.epf.validation.constraints.RelationshipConstraint"
-                  id="org.eclipse.epf.validation.constraints.RelationshipConstraint"
-                  lang="Java"
-                  mode="Batch"
-                  name="Relationship Constraint"
-                  severity="ERROR"
-                  statusCode="2">
-               <message>
-                  A {0} has been found to have invalid relationship
-               </message>
-            </constraint>
-         </constraints>
-      </constraintProvider>
-   </extension>
-
-   <extension
-         point="org.eclipse.emf.validation.constraintBindings">
-      <clientContext
-            default="true"
-            id="org.eclipse.epf.validation.library.defaultClientContext">
-         <enablement>
-            <instanceof value="org.eclipse.epf.uma.MethodElement"/>
-         </enablement>
-      </clientContext>
-   </extension>
-
-   <extension
-         point="org.eclipse.emf.validation.traversal">
-      <traversalStrategy
-            class="org.eclipse.epf.validation.constraints.LibraryTraversalStrategy"
-            namespaceUri="http://www.eclipse.org/epf/uma/1.0.4/uma.ecore"/>
-   </extension>
-   <extension
-         point="org.eclipse.ui.startup">
-      <startup class="org.eclipse.epf.validation.util.Startup"/>
-   </extension>
-
-</plugin>
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/Activator.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/Activator.java
deleted file mode 100644
index b6633b6..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/Activator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.eclipse.epf.validation;
-
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends Plugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.epf.validation"; //$NON-NLS-1$
-
-	// The shared instance
-	private static Activator plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/LibraryEValidator.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/LibraryEValidator.java
deleted file mode 100644
index 7d89974..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/LibraryEValidator.java
+++ /dev/null
@@ -1,417 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.DiagnosticChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EObjectValidator;
-import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.validation.model.Category;
-import org.eclipse.emf.validation.model.EvaluationMode;
-import org.eclipse.emf.validation.model.IConstraintStatus;
-import org.eclipse.emf.validation.service.IBatchValidator;
-import org.eclipse.emf.validation.service.IConstraintDescriptor;
-import org.eclipse.emf.validation.service.IConstraintFilter;
-import org.eclipse.emf.validation.service.ModelValidationService;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.IAdapterFactoryProvider;
-import org.eclipse.epf.library.edit.process.DescribableElementWrapperItemProvider;
-import org.eclipse.epf.library.edit.process.IBSItemProvider;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.library.edit.validation.DependencyValidationMgr;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.uma.BreakdownElement;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.Process;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.RoleDescriptor;
-import org.eclipse.epf.uma.TeamProfile;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.epf.validation.constraints.LibraryTraversalStrategy;
-import org.eclipse.epf.validation.util.ValidationStatus;
-
-/**
- * An adapter that plugs the EMF Model Validation Service API into the
- * {@link org.eclipse.emf.ecore.EValidator} API.
- * 
- * @author Phong Nguyen Le
- * @since 1.1
- */
-public class LibraryEValidator extends EObjectValidator {
-	private static final boolean DEBUG = Activator.getDefault().isDebugging();
-	private static final Map featureToPropertyMap = createFeatureToAttributeMap();
-
-	public static final String CTX_ADAPTER_FACTORY_PROVIDER = "CTX_ADAPTER_FACTORY_PROVIDER"; //$NON-NLS-1$
-	public static final String CTX_DEPENDENCY_VALIDATION_MGR = "CTX_DEPENDENCY_VALIDATION_MGR"; //$NON-NLS-1$
-	public static final String CTX_CONSTRAINT_FILTER = "CTX_CONSTRAINT_FILTER"; //$NON-NLS-1$
-	
-	public static final String CONSTRAINT_CATEGORY = "org.eclipse.epf.validation.library.category"; //$NON-NLS-1$
-
-	private static Map createFeatureToAttributeMap() {
-		Map map = new HashMap();
-		map.put(UmaPackage.Literals.NAMED_ELEMENT__NAME, IBSItemProvider.COL_NAME);
-		map.put(UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME, IBSItemProvider.COL_PRESENTATION_NAME);
-		return map;
-	}
-	
-	/**
-	 * Model Validation Service interface for batch validation of EMF elements.
-	 */
-	private final IBatchValidator batchValidator;
-
-	/**
-	 * Initializes me.
-	 */
-	public LibraryEValidator() {
-		super();
-
-		batchValidator = (IBatchValidator) ModelValidationService.getInstance()
-				.newValidator(EvaluationMode.BATCH);
-		batchValidator.setIncludeLiveConstraints(true);
-		batchValidator.setReportSuccesses(false);
-		batchValidator.addConstraintFilter(new IConstraintFilter() {
-
-			public boolean accept(IConstraintDescriptor constraint,
-					EObject target) {
-				Set<Category> categories = constraint.getCategories();
-				if(categories != null && !categories.isEmpty()) {
-					for (Iterator<Category> iterator = categories.iterator(); iterator
-							.hasNext();) {
-						Category category = (Category) iterator.next();
-						if(CONSTRAINT_CATEGORY.equals(category.getId())) {
-							return true;
-						}
-					}
-				}
-				return false;
-			}
-			
-		});
-	}
-
-	public boolean validate(EObject eObject, DiagnosticChain diagnostics,
-			Map context) {
-		return validate(eObject.eClass(), eObject, diagnostics, context);
-	}
-
-	/**
-	 * Implements validation by delegation to the EMF validation framework.
-	 */
-	public boolean validate(EClass eClass, EObject eObject,
-			DiagnosticChain diagnostics, Map context) {
-		// first, do whatever the basic EcoreValidator does
-		// super.validate(eClass, eObject, diagnostics, context);
-
-		IStatus status = Status.OK_STATUS;
-
-		boolean circularCheckOk = true;
-		DependencyValidationMgr mgr = (DependencyValidationMgr) context.get(CTX_DEPENDENCY_VALIDATION_MGR);
-		if (DependencyChecker.newCheck && mgr != null && 
-				(eObject instanceof VariabilityElement || eObject instanceof MethodPlugin)) {
-			status = mgr.checkCircularDependnecy((MethodElement) eObject);
-			if(!status.isOK()) {
-				circularCheckOk = false;
-				String msg = status.getMessage();
-				if(StrUtil.isBlank(msg)) {
-					//msg = NLS.bind(ValidationResources.circularDependency_error, ref.getEContainingClass().getName(), ref.getName());
-					msg = ValidationResources.circularDependency_error;
-				}
-				appendDiagnostics(status, diagnostics);
-			}
-		}
-		
-		// no point in validating if we can't report results
-		if (diagnostics != null) {
-			// if EMF Mode Validation Service already covered the sub-tree,
-			// which it does for efficient computation and error reporting,
-			// then don't repeat (the Diagnostician does the recursion
-			// externally). If there is no context map, then we can't
-			// help it
-			if (!hasProcessed(eObject, context)) {
-				if (getTraversalType(context) == LibraryTraversalStrategy.DEEP) {
-					batchValidator
-							.setTraversalStrategy(LibraryTraversalStrategy.deepTraversalStrategy);
-				}
-				
-				IConstraintFilter filter = (IConstraintFilter) context.get(CTX_CONSTRAINT_FILTER);
-				if(filter != null) {
-					batchValidator.addConstraintFilter(filter);
-				}
-				try {
-					status = batchValidator.validate(eObject,
-							new NullProgressMonitor());
-				} finally {
-					if (filter != null) {
-						batchValidator.removeConstraintFilter(filter);
-					}
-				}
-
-				processed(eObject, context, status);
-
-				appendDiagnostics(status, diagnostics);
-			}
-		}
-
-		if (eObject instanceof ProcessComponent) {
-			Process proc = ((ProcessComponent) eObject).getProcess();
-			if (proc != null) {
-				validateProcess(proc, diagnostics, context);
-			}
-		}
-
-		return circularCheckOk && status.isOK();
-	}
-	
-	/**
-	 * @param proc
-	 * @param diagnostics
-	 * @param context
-	 */
-	public void validateProcess(Process proc, final DiagnosticChain diagnostics,
-			Map context) {
-		Object o = context.get(CTX_ADAPTER_FACTORY_PROVIDER);
-		if (!(o instanceof IAdapterFactoryProvider)) {
-			return;
-		}
-
-		class FilteredAdapterFactoryTreeIterator extends AdapterFactoryTreeIterator {
-			
-			public FilteredAdapterFactoryTreeIterator(AdapterFactory adapterFactory, Object object) {
-				super(adapterFactory, object);
-			}
-			
-			protected boolean accept(Object child) {
-				return child instanceof NamedElement;
-			}
-			
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 0L;
-
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator#getChildren(java.lang.Object)
-			 */
-			protected Iterator getChildren(Object o) {
-				ArrayList children = new ArrayList();
-				for (Iterator iter = super.getChildren(o); iter.hasNext();) {
-					Object child = iter.next();
-					if (child instanceof MethodElement
-							|| (child instanceof DescribableElementWrapperItemProvider
-							&& !((DescribableElementWrapperItemProvider) child).isReadOnly())) {
-						children.add(child);
-						child = TngUtil.unwrap(child);
-					}
-					if (accept(child)) {
-						try {
-							ArrayList features = new ArrayList();
-							features.add(UmaPackage.Literals.NAMED_ELEMENT__NAME);
-							if(child instanceof DescribableElement) {
-								features.add(UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME);
-							}
-							NamedElement e = (NamedElement) child;
-							if (e instanceof BreakdownElement) {
-								//continue;
-							}
-							if(DEBUG) {
-								System.out
-										.println("FilteredAdapterFactoryTreeIterator.getChildren(): validating '" + e.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$
-							}
-							for (Iterator iterator = features.iterator(); iterator
-									.hasNext();) {
-								EStructuralFeature feature = (EStructuralFeature) iterator.next();
-								IValidator validator = IValidatorFactory.INSTANCE
-										.createValidator(o, null,
-												(EObject) child, feature,
-												adapterFactory);
-								Object itemProvider = adapterFactory.adapt(child, ITreeItemContentProvider.class);
-								String prop = (String) featureToPropertyMap.get(feature);
-								String name;
-								if(itemProvider instanceof IBSItemProvider && prop != null) {
-									name = ((IBSItemProvider)itemProvider).getAttribute(child, prop);
-								}
-								else {
-									name = (String) e.eGet(feature);
-								}
-								String msg = validator.isValid(name);
-								if (msg != null) {
-									appendDiagnostics(new ValidationStatus(
-											IStatus.ERROR, 0, msg, e, feature),
-											diagnostics);
-								}
-							}
-						} catch (Exception e) {
-
-						}
-					}
-				}				
-				return children.iterator();
-			}
-		};
-		IAdapterFactoryProvider provider = (IAdapterFactoryProvider) o;
-		Iterator iterator = new FilteredAdapterFactoryTreeIterator(provider
-				.getWBSAdapterFactory(), proc);
-		for (; iterator.hasNext(); iterator.next())
-			;
-		
-		iterator = new FilteredAdapterFactoryTreeIterator(provider.getTBSAdapterFactory(), proc) {
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 1L;
-
-			/* (non-Javadoc)
-			 * @see #accept(java.lang.Object)
-			 */
-			protected boolean accept(Object child) {
-				return child instanceof RoleDescriptor || child instanceof TeamProfile;
-			}
-		};
-		for (; iterator.hasNext(); iterator.next())
-			;
-		
-		iterator = new FilteredAdapterFactoryTreeIterator(provider.getWPBSAdapterFactory(), proc) {
-			/**
-			 * Comment for <code>serialVersionUID</code>
-			 */
-			private static final long serialVersionUID = 1L;
-
-			/* (non-Javadoc)
-			 * @see #accept(java.lang.Object)
-			 */
-			protected boolean accept(Object child) {
-				return child instanceof WorkProductDescriptor;
-			}
-		};
-		for (; iterator.hasNext(); iterator.next())
-			;
-	}
-
-	private static int getTraversalType(Map context) {
-		Object type = context.get(LibraryTraversalStrategy.TRAVERSAL_TYPE);
-		return (type instanceof Number && ((Number) type).intValue() == LibraryTraversalStrategy.DEEP) ? LibraryTraversalStrategy.DEEP
-				: LibraryTraversalStrategy.SHADOW;
-	}
-
-	/**
-	 * Direct validation of {@link EDataType}s is not supported by the EMF
-	 * validation framework; they are validated indirectly via the
-	 * {@link EObject}s that hold their values.
-	 */
-	public boolean validate(EDataType eDataType, Object value,
-			DiagnosticChain diagnostics, Map context) {
-		return super.validate(eDataType, value, diagnostics, context);
-	}
-
-	/**
-	 * If we have a context map, record this object's <code>status</code> in
-	 * it so that we will know later that we have processed it and its sub-tree.
-	 * 
-	 * @param eObject
-	 *            an element that we have validated
-	 * @param context
-	 *            the context (may be <code>null</code>)
-	 * @param status
-	 *            the element's validation status
-	 */
-	private void processed(EObject eObject, Map context, IStatus status) {
-		if (context != null) {
-			context.put(eObject, status);
-		}
-	}
-
-	/**
-	 * Determines whether we have processed this <code>eObject</code> before,
-	 * by automatic recursion of the EMF Model Validation Service. This is only
-	 * possible if we do, indeed, have a context.
-	 * 
-	 * @param eObject
-	 *            an element to be validated (we hope not)
-	 * @param context
-	 *            the context (may be <code>null</code>)
-	 * @return <code>true</code> if the context is not <code>null</code> and
-	 *         the <code>eObject</code> or one of its containers has already
-	 *         been validated; <code>false</code>, otherwise
-	 */
-	private boolean hasProcessed(EObject eObject, Map context) {
-		boolean result = false;
-
-		if (context != null) {
-			// this is O(NlogN) but there's no helping it
-			while (eObject != null) {
-				if (context.containsKey(eObject)) {
-					result = true;
-					eObject = null;
-				} else {
-					eObject = eObject.eContainer();
-				}
-			}
-		}
-
-		return result;
-	}
-
-	/**
-	 * Converts a status result from the EMF validation service to diagnostics.
-	 * 
-	 * @param status
-	 *            the EMF validation service's status result
-	 * @param diagnostics
-	 *            a diagnostic chain to accumulate results on
-	 */
-	private void appendDiagnostics(IStatus status, DiagnosticChain diagnostics) {
-		if (status.isMultiStatus()) {
-			IStatus[] children = status.getChildren();
-
-			for (int i = 0; i < children.length; i++) {
-				appendDiagnostics(children[i], diagnostics);
-			}
-		} else if (status instanceof IConstraintStatus) {
-			diagnostics.add(new BasicDiagnostic(status.getSeverity(), status
-					.getPlugin(), status.getCode(), status.getMessage(),
-					((IConstraintStatus) status).getResultLocus().toArray()));
-		} else if (status instanceof org.eclipse.epf.library.edit.validation.ValidationStatus) {
-			diagnostics.add(new BasicDiagnostic(status.getSeverity(), status
-					.getPlugin(), status.getCode(), status.getMessage(),
-					new Object[] { ((org.eclipse.epf.library.edit.validation.ValidationStatus) status)
-							.getCheckedObject() }));
-		} else {
-			diagnostics.add(new BasicDiagnostic(status.getSeverity(), status
-					.getPlugin(), status.getCode(), status.getMessage(),
-					null));
-		}
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/Resources.properties b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/Resources.properties
deleted file mode 100644
index 672a427..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/Resources.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-#-------------------------------------------------------------------------------
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial implementation.
-#-------------------------------------------------------------------------------
-# NLS_MESSAGEFORMAT_VAR
-
-circularDependency_error=Cycles found in the dependency graph of the association {0}.{1}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/ValidationResources.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/ValidationResources.java
deleted file mode 100644
index 43d5449..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/ValidationResources.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.epf.validation;
-
-import org.eclipse.osgi.util.NLS;
-
-public class ValidationResources extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.epf.validation.Resources"; //$NON-NLS-1$
-
-	public static String circularDependency_error;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, ValidationResources.class);
-	}
-
-	private ValidationResources() {
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/LibraryTraversalStrategy.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/LibraryTraversalStrategy.java
deleted file mode 100644
index 8a23451..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/LibraryTraversalStrategy.java
+++ /dev/null
@@ -1,296 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.validation.constraints;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.EContentsEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.emf.ecore.util.EcoreUtil.ContentTreeIterator;
-import org.eclipse.emf.validation.service.AbstractTraversalStrategy;
-import org.eclipse.emf.validation.service.ITraversalStrategy;
-import org.eclipse.epf.library.edit.util.ModelStructure;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.uma.Constraint;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DiagramElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPackage;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.UmaUtil;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.1
- */
-public class LibraryTraversalStrategy extends AbstractTraversalStrategy {
-	public static final String TRAVERSAL_TYPE = "TRAVERSAL_TYPE"; //$NON-NLS-1$
-	/**
-	 * Traversal strategy type constant for shadow traversal
-	 */
-	public static final int SHADOW = 0;
-	
-	/**
-	 * Traversal strategy type constant for deep traversal
-	 */
-	public static final int DEEP = 1;
-	
-	public static final ITraversalStrategy deepTraversalStrategy = new LibraryTraversalStrategy(DEEP);
-	
-	public static class LibraryIterator extends ContentTreeIterator {
-		private static final long serialVersionUID = -1175428027503440970L;
-		private int traversalType = DEEP;
-		
-		protected LibraryIterator(Collection emfObjects) {
-			super(emfObjects);
-		}
-		
-		/**
-		 * @param object
-		 * @param isResolveProxies
-		 */
-		public LibraryIterator(Collection eObjects, boolean isResolveProxies, int traversalType, boolean disjoint) {
-			super(disjoint ? makeTargetsDisjoint(eObjects) : eObjects, isResolveProxies);
-			this.traversalType  = traversalType;
-		}
-		
-		@Override
-		protected Iterator<?> getEObjectChildren(EObject object) {
-			if(traversalType == DEEP) {
-				if(!(object instanceof MethodElement)
-						|| (object instanceof Constraint || object instanceof DiagramElement)) 
-				{
-					return Collections.EMPTY_LIST.iterator();
-				}
-				return super.getEObjectChildren(object);
-			}
-			
-			if(object instanceof CustomCategory) {
-				return getEObjectChildren((CustomCategory)object, UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS,
-						UmaPackage.Literals.CUSTOM_CATEGORY);
-			}
-			else if (object instanceof ProcessComponent
-					|| object instanceof MethodConfiguration
-					|| object instanceof ContentElement
-			) {
-				return Collections.EMPTY_LIST.iterator();
-			}
-			else if (object instanceof MethodPackage) {
-				MethodPackage pkg = (MethodPackage) object;
-				if(TngUtil.isPredefined(pkg) && ModelStructure.CUSTOM_CATEGORY_PACKAGE_NAME.equals(pkg.getName())) {
-					// this is the content package that contains all the custom categories
-					// return root custom category as its only child
-					//
-					ContentPackage hiddenPkg = UmaUtil.findContentPackage(pkg
-							.getChildPackages(), ModelStructure.HIDDEN_PACKAGE_NAME);
-					if (hiddenPkg != null && !hiddenPkg.getContentElements().isEmpty()) {
-						return hiddenPkg.getContentElements().iterator();
-					}
-					else {
-						return Collections.EMPTY_LIST.iterator();
-					}
-				}
-				else {
-					return getEObjectChildren(pkg, UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES, null);
-				}
-			}
-			else if (object instanceof MethodLibrary) {
-				return getEObjectChildren(
-						(MethodLibrary) object,
-						new EStructuralFeature[] {
-								UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS,
-								UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS });
-			}
-			else if (object instanceof MethodPlugin) {
-				return getEObjectChildren((EObject) object, UmaPackage.Literals.METHOD_PLUGIN__METHOD_PACKAGES, null);
-			}
-			else if (object == this.object) {
-				return ((Collection)object).iterator();
-			}
-			
-			return Collections.EMPTY_LIST.iterator();
-		}
-		
-		private Iterator getEObjectChildren(EObject eObject, EStructuralFeature[] features) {
-			EContentsEList list = new EContentsEList(eObject, features);
-			return isResolveProxies() ? list.iterator() : list.basicIterator();
-		}
-		
-		private Iterator getEObjectChildren(EObject eObject, EReference reference, EClass eClass) {
-			Iterator iter;
-			if(reference.isMany()) {
-				boolean resolve = isResolveProxies();
-				List list = (List) eObject.eGet(reference, resolve);
-				iter = !resolve && (list instanceof InternalEList) ? ((InternalEList)list).basicIterator() : list.iterator();
-			}
-			else {
-				Object value = eObject.eGet(reference, isResolveProxies());
-				iter = value != null ? Collections.singletonList(value).iterator() : Collections.EMPTY_LIST.iterator();
-			}
-			if(eClass == null) {
-				return iter;
-			}
-			else {
-				ArrayList list = new ArrayList();
-				while(iter.hasNext()) {
-					Object o = iter.next();
-					if(eClass.isInstance(o)) {
-						list.add(o);
-					}
-				}
-				if(list.isEmpty()) {
-					return Collections.EMPTY_LIST.iterator();
-				}
-				else {
-					return list.iterator();
-				}
-			}
-		}
-	}
-	
-	public static int countElements(Collection traversalRoots, int traversalType) {
-		return countElements(traversalRoots, true, traversalType);
-	}
-	
-	private static int countElements(Collection traversalRoots, boolean makeDisjoint, int traversalType) {
-		int count = 0;
-		for(Iterator iter = new LibraryIterator(traversalRoots, true, traversalType, makeDisjoint); iter.hasNext(); count++) {
-			iter.next();
-		}
-		return count;
-	}
-
-	private Collection roots;
-	private boolean contextChanged = true;
-
-	private int type = DEEP;
-	
-	/**
-	 * Initializes me.
-	 */
-	public LibraryTraversalStrategy() {
-		super();
-	}
-	
-	public LibraryTraversalStrategy(int traversalType) {
-		this.type  = traversalType;
-	}
-	
-	public void startTraversal(
-			Collection traversalRoots,
-			IProgressMonitor progressMonitor) {
-		
-		roots = makeTargetsDisjoint(traversalRoots);
-		
-		super.startTraversal(traversalRoots, progressMonitor);
-	}
-	
-	private Collection getRoots() {
-		return roots;
-	}
-	
-	/* (non-Javadoc)
-	 * Implements the inherited method.
-	 */
-	protected int countElements(Collection ignored) {
-		return countElements(getRoots(), false, type);
-	}
-	
-	/* (non-Javadoc)
-	 * Implements the inherited method.
-	 */
-	protected Iterator createIterator(Collection ignored) {
-		return new LibraryIterator(getRoots(), true, type, false) {
-			private static final long serialVersionUID = -5653134989235663973L;
-
-			public Iterator getChildren(Object obj) {
-				if (obj == getRoots()) {
-					return new Iterator() {
-						private final Iterator delegate =
-							getRoots().iterator();
-						
-						public boolean hasNext() {
-							return delegate.hasNext();
-						}
-
-						public Object next() {
-							// if I'm being asked for my next element, then
-							//    we are stepping to another traversal root
-							contextChanged = true;
-							
-							return delegate.next();
-						}
-
-						public void remove() {
-							delegate.remove();
-						}};
-				} else {
-					return super.getChildren(obj);
-				}
-			}
-			
-			public Object next() {
-				// this will be set to true again the next time we test hasNext() at
-				//    the traversal root level
-				contextChanged = false;
-				
-				return super.next();
-			}};
-	}
-	
-	public boolean isClientContextChanged() {
-		return contextChanged;
-	}
-	
-	public static Set makeTargetsDisjoint(Collection objects) {
-		Set result = new java.util.HashSet();
-		
-		// ensure that any contained (descendent) elements of other elements
-		//    that we include are not included, because they will be
-		//    traversed by recursion, anyway
-		
-		for (Iterator outer = objects.iterator(); outer.hasNext();) {
-			EObject outerNext = (EObject)outer.next();
-			
-			for (Iterator inner = result.iterator(); inner.hasNext();) {
-				EObject innerNext = (EObject)inner.next();
-				
-				if (EcoreUtil.isAncestor(innerNext, outerNext)) {
-					outerNext = null;  // forget this one
-					break;
-				}
-			}
-			
-			if (outerNext != null) {
-				result.add(outerNext);
-			}
-		}
-		
-		return result;
-	}	
-}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/NameConstraint.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/NameConstraint.java
deleted file mode 100644
index a861de7..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/NameConstraint.java
+++ /dev/null
@@ -1,292 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.validation.constraints;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.validation.AbstractModelConstraint;
-import org.eclipse.emf.validation.EMFEventType;
-import org.eclipse.emf.validation.IValidationContext;
-import org.eclipse.epf.library.edit.IFilter;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.IValidator;
-import org.eclipse.epf.library.edit.validation.IValidatorFactory;
-import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory.TypeFilter;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.ContentPackage;
-import org.eclipse.epf.uma.CustomCategory;
-import org.eclipse.epf.uma.DescribableElement;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodPlugin;
-import org.eclipse.epf.uma.Milestone;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.ProcessComponent;
-import org.eclipse.epf.uma.ProcessPackage;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.util.AssociationHelper;
-import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.epf.validation.Activator;
-import org.eclipse.epf.validation.util.ValidationStatus;
-
-/**
- * @author Phong Nguyen Le
- * @since 1.1
- */
-public class NameConstraint extends AbstractModelConstraint {
-	private static final boolean DEBUG = Activator.getDefault().isDebugging();
-	
-//	private static final EClass[] CONTENT_ELEMENT_TYPES = getContentElementTypes();
-//
-//	private static EClass[] getContentElementTypes() {
-//		ArrayList types = new ArrayList();
-//		for (Iterator iter = UmaPackage.eINSTANCE.getEClassifiers().iterator(); iter.hasNext();) {
-//			Object type = iter.next();
-//			if(type instanceof EClass && UmaPackage.Literals.CONTENT_ELEMENT.isSuperTypeOf((EClass) type)) {
-//				types.add(type);
-//			}
-//		}
-//		EClass[] eClasses = new EClass[types.size()];
-//		types.toArray(eClasses);
-//		return eClasses;
-//	}
-	
-	private boolean canCheck(Object eObj) {
-		return eObj instanceof MethodPlugin
-				|| eObj instanceof MethodConfiguration
-				|| eObj instanceof ContentPackage
-				|| eObj instanceof ProcessComponent
-				|| ((eObj instanceof ProcessPackage || eObj instanceof ContentElement) && UmaUtil
-						.getProcessComponent((MethodElement) eObj) == null);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.emf.validation.IValidationContext)
-	 */
-	public IStatus validate(IValidationContext ctx) {
-		EObject eObj = ctx.getTarget();
-		EMFEventType eType = ctx.getEventType();
-
-		if(DEBUG) {
-			if(eObj instanceof NamedElement) {
-				NamedElement e = (NamedElement) eObj;
-				System.out.println("NameConstraint.validate(): " + TngUtil.getTypeText(e) + ": '" + e.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			if(eObj instanceof Milestone) {
-				System.out.println();
-			}
-		}
-		MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
-
-		// In the case of batch mode.
-		if (eType == EMFEventType.NULL) {
-			if((eObj instanceof MethodElement && TngUtil.isPredefined((MethodElement) eObj)))
-			{
-				// skip validating predefined method elements, ContentDescription
-				//
-				return ctx.createSuccessStatus();
-			}
-			
-			// validate object's name
-			//
-			if(eObj instanceof CustomCategory) {
-				CustomCategory cc = (CustomCategory)eObj;
-				List list = AssociationHelper.getCustomCategories(cc);
-				for (Iterator iter = list.iterator(); iter.hasNext();) {
-					CustomCategory parent = (CustomCategory) iter.next();
-					IValidator validator = IValidatorFactory.INSTANCE.createNameValidator(parent, cc);
-					String msg = validator.isValid(cc.getName());
-					if(msg != null) {
-						multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, cc, UmaPackage.Literals.NAMED_ELEMENT__NAME));
-					}
-					validator = IValidatorFactory.INSTANCE.createPresentationNameValidator(parent, cc);
-					msg = validator.isValid(cc.getPresentationName());
-					if(msg != null) {
-						multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, cc, UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME));
-					}
-				}
-			}
-			else if(canCheck(eObj)) 
-			{
-				NamedElement e = (NamedElement)eObj;
-				IValidator validator = IValidatorFactory.INSTANCE.createNameValidator(eObj.eContainer(), e);
-				String msg = validator.isValid(e.getName());
-				if(msg != null) {
-					multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, e, UmaPackage.Literals.NAMED_ELEMENT__NAME));
-				}
-/*				if(eObj instanceof DescribableElement) {
-					DescribableElement de = (DescribableElement) eObj;
-					validator = IValidatorFactory.INSTANCE.createPresentationNameValidator(eObj.eContainer(), de);
-					msg = validator.isValid(de.getPresentationName());
-					if(msg != null) {
-						multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, e, UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME));
-					}
-				}*/
-			}
-			
-//			// validate name of the children
-//			//
-//			if(eObj instanceof MethodLibrary) {
-//				IStatus status = checkChildren(eObj, UmaPackage.Literals.METHOD_LIBRARY__METHOD_PLUGINS, 
-//						UmaPackage.Literals.METHOD_PLUGIN);
-//				if(!status.isOK()) {
-//					multiStatus.merge(status);
-//				}
-//				status = checkChildren(eObj, UmaPackage.Literals.METHOD_LIBRARY__PREDEFINED_CONFIGURATIONS, 
-//						UmaPackage.Literals.METHOD_CONFIGURATION);
-//				if(!status.isOK()) {
-//					multiStatus.merge(status);
-//				}
-//			}
-//			else if(eObj instanceof ContentPackage) {
-//				ContentPackage pkg = (ContentPackage) eObj;
-//				boolean checked = false;
-//				if(TngUtil.isPredefined(pkg)) {
-//					String name = pkg.getName();
-//					if(ModelStructure.DISCIPLINE_PACKAGE_NAME.equals(name)) {
-//						IStatus status = checkChildren(eObj, UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS, 
-//								UmaPackage.Literals.DISCIPLINE);				
-//						if(!status.isOK()) {
-//							multiStatus.merge(status);
-//						}
-//						checked = true;
-//					}
-//					else if (ModelStructure.ROLE_SET_PACKAGE_NAME.equals(name)) {
-//						IStatus status = checkChildren(eObj, UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS, 
-//								UmaPackage.Literals.ROLE_SET);				
-//						if(!status.isOK()) {
-//							multiStatus.merge(status);
-//						}
-//						checked = true;
-//					}
-//					else if (!(ModelStructure.CORE_CONTENT_PACAKGE_NAME.equals(name))) {
-//						checked = true;
-//					}
-//				}
-//				if(!checked) {
-//					for (int i = 0; i < CONTENT_ELEMENT_TYPES.length; i++) {
-//						IStatus status = checkChildren(eObj, UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENTS, 
-//								CONTENT_ELEMENT_TYPES[i]);				
-//						if(!status.isOK()) {
-//							multiStatus.merge(status);
-//						}
-//					}
-//				}
-//			}
-//			else if(eObj instanceof ProcessPackage) {
-//				IStatus status = checkChildren(eObj, UmaPackage.Literals.METHOD_PACKAGE__CHILD_PACKAGES, 
-//						UmaPackage.Literals.PROCESS_PACKAGE);
-//				if(!status.isOK()) {
-//					multiStatus.merge(status);
-//				}
-//			}
-			
-			if(multiStatus.isOK()) {
-				return ctx.createSuccessStatus();
-			}
-			else {
-				return multiStatus;
-			}
-			
-		// In the case of live mode.
-		} else {
-			Object newValue = ctx.getFeatureNewValue();
-			
-			if (newValue == null || ((String)newValue).length() == 0) {
-				return ctx.createFailureStatus(new Object[] {eObj.eClass().getName()});
-			}
-		}
-		
-		return ctx.createSuccessStatus();
-	}
-
-	private static class ChildFilter extends TypeFilter {
-
-		private Set checkedChildren;
-
-		public ChildFilter(EClass eClass, Set checkedChildren) {
-			super(eClass);
-			this.checkedChildren = checkedChildren;
-		}
-
-		public boolean accept(Object obj) {
-			if (checkedChildren.contains(obj)) {
-				return false;
-			}
-			return super.accept(obj);
-		}
-	}
-
-	private IStatus checkChildren(EObject object, EReference childFeature,
-			EClass eClass) {
-		List statusList = new ArrayList();
-		List children = (List) object.eGet(childFeature);
-		Set checkedChildren = new HashSet();
-		IFilter childFilter = new ChildFilter(eClass, checkedChildren);
-		for (Iterator iter = children.iterator(); iter.hasNext();) {
-			EObject child = (EObject) iter.next();
-			if (child instanceof NamedElement) {
-				IValidator validator = IValidatorFactory.INSTANCE
-						.createValidator(object, childFeature, childFilter,
-								child, UmaPackage.Literals.NAMED_ELEMENT__NAME);
-				NamedElement e = (NamedElement) child;
-				String msg = validator.isValid(e.getName());
-				if (msg != null) {
-					statusList.add(new ValidationStatus(IStatus.ERROR, 0, msg,
-							e, UmaPackage.Literals.NAMED_ELEMENT__NAME));
-				}
-			}
-			if (child instanceof DescribableElement) {
-				IValidator validator = IValidatorFactory.INSTANCE
-						.createValidator(
-								object,
-								childFeature,
-								childFilter,
-								child,
-								UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME);
-				DescribableElement e = (DescribableElement) child;
-				String msg = validator.isValid(e.getPresentationName());
-				if (msg != null) {
-					statusList
-							.add(new ValidationStatus(
-									IStatus.ERROR,
-									0,
-									msg,
-									e,
-									UmaPackage.Literals.DESCRIBABLE_ELEMENT__PRESENTATION_NAME));
-				}
-			}
-		}
-		if (!statusList.isEmpty()) {
-			if (statusList.size() == 1) {
-				return (IStatus) statusList.get(0);
-			} else {
-				IStatus[] newChildren = new IStatus[statusList.size()];
-				statusList.toArray(newChildren);
-				return new MultiStatus(Activator.PLUGIN_ID, 0, newChildren,
-						"", null); //$NON-NLS-1$
-			}
-		}
-		return Status.OK_STATUS;
-	}
-}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/RelationshipConstraint.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/RelationshipConstraint.java
deleted file mode 100644
index 8a5eca2..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/constraints/RelationshipConstraint.java
+++ /dev/null
@@ -1,117 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.validation.constraints;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.validation.AbstractModelConstraint;
-import org.eclipse.emf.validation.EMFEventType;
-import org.eclipse.emf.validation.IValidationContext;
-import org.eclipse.epf.common.utils.StrUtil;
-import org.eclipse.epf.library.edit.util.TngUtil;
-import org.eclipse.epf.library.edit.validation.DependencyChecker;
-import org.eclipse.epf.uma.NamedElement;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.validation.Activator;
-import org.eclipse.epf.validation.ValidationResources;
-import org.eclipse.epf.validation.util.ValidationStatus;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class RelationshipConstraint extends AbstractModelConstraint {
-	private static final boolean DEBUG = Activator.getDefault().isDebugging();
-
-	private static final Collection referencesToCheckForCircularDependency = Arrays.asList(new Object[] {
-			UmaPackage.Literals.METHOD_PLUGIN__BASES
-			, UmaPackage.Literals.VARIABILITY_ELEMENT__VARIABILITY_BASED_ON_ELEMENT
-			, UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENTS
-			, UmaPackage.Literals.DELIVERABLE__DELIVERED_WORK_PRODUCTS
-			, UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENTS
-	});
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.validation.AbstractModelConstraint#validate(org.eclipse.emf.validation.IValidationContext)
-	 */
-	public IStatus validate(IValidationContext ctx) {
-		if (DependencyChecker.newCheck) {
-			return Status.OK_STATUS;
-		}
-		EObject eObj = ctx.getTarget();
-		EMFEventType eType = ctx.getEventType();
-		
-		if(DEBUG) {
-			if(eObj instanceof NamedElement) {
-				NamedElement e = (NamedElement) eObj;
-				System.out.println("RelationshipConstraint.validate(): " + TngUtil.getTypeText(e) + ": '" + e.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-		}
-
-		MultiStatus multiStatus = new MultiStatus(Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
-
-		// In the case of batch mode.
-		if (eType == EMFEventType.NULL) {
-			Collection features = new ArrayList(referencesToCheckForCircularDependency);
-			features.retainAll(eObj.eClass().getEAllReferences());
-			for (Iterator iter = features.iterator(); iter.hasNext();) {
-				EReference ref = (EReference) iter.next();
-				if(ref.isMany()) {
-					for (Iterator iterator = ((List)eObj.eGet(ref)).iterator(); iterator.hasNext();) {
-						Object o = iterator.next();
-						IStatus status = DependencyChecker.checkCircularDependency(eObj, ref, o);
-						if(!status.isOK()) {
-							String msg = status.getMessage();
-							if(StrUtil.isBlank(msg)) {
-								msg = NLS.bind(ValidationResources.circularDependency_error, ref.getEContainingClass().getName(), ref.getName());
-							}
-							multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, eObj, ref));
-						}
-					}
-				}
-				else {
-					Object o = eObj.eGet(ref);
-					if(o != null) {
-						IStatus status = DependencyChecker.checkCircularDependency(eObj, ref, o);
-						if(!status.isOK()) {
-							String msg = status.getMessage();
-							if(StrUtil.isBlank(msg)) {
-								msg = NLS.bind(ValidationResources.circularDependency_error, ref.getEContainingClass().getName(), ref.getName());
-							}
-							multiStatus.add(new ValidationStatus(IStatus.ERROR, 0, msg, eObj, ref));
-						}
-					}
-				}
-			}
-
-			if(multiStatus.isOK()) {
-				return ctx.createSuccessStatus();
-			}
-			else {
-				return multiStatus;
-			}			
-		} 
-		
-		return ctx.createSuccessStatus();
-		
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/util/Startup.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/util/Startup.java
deleted file mode 100644
index 2fc3179..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/util/Startup.java
+++ /dev/null
@@ -1,33 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.validation.util;
-
-import org.eclipse.emf.ecore.EValidator;
-import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.validation.LibraryEValidator;
-import org.eclipse.ui.IStartup;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class Startup implements IStartup {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IStartup#earlyStartup()
-	 */
-	public void earlyStartup() {
-		EValidator.Registry.INSTANCE.put(
-				UmaPackage.eINSTANCE,
-				new LibraryEValidator());
-	}
-
-}
diff --git a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/util/ValidationStatus.java b/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/util/ValidationStatus.java
deleted file mode 100644
index 4fd47c0..0000000
--- a/1.5/plugins/org.eclipse.epf.validation/src/org/eclipse/epf/validation/util/ValidationStatus.java
+++ /dev/null
@@ -1,28 +0,0 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 IBM Corporation and others.
-// All rights reserved. This program and the accompanying materials
-// are made available under the terms of the Eclipse Public License v1.0
-// which accompanies this distribution, and is available at
-// http://www.eclipse.org/legal/epl-v10.html
-//
-// Contributors:
-// IBM Corporation - initial implementation
-//------------------------------------------------------------------------------
-package org.eclipse.epf.validation.util;
-
-
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.epf.validation.Activator;
-
-/**
- * @author Phong Nguyen Le
- * @since  1.0
- */
-public class ValidationStatus extends org.eclipse.epf.library.edit.validation.ValidationStatus {
-
-	public ValidationStatus(int severity, int code, String message, Object checkedObject, EStructuralFeature feature) {
-		super(Activator.PLUGIN_ID, severity, code, message, checkedObject, feature);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/.classpath b/1.5/plugins/org.eclipse.epf.xml.uma/.classpath
deleted file mode 100644
index 0b164b9..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="runtime"/>
-</classpath>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/.project b/1.5/plugins/org.eclipse.epf.xml.uma/.project
deleted file mode 100644
index 1c32a9a..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.xml.uma</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/.settings/org.eclipse.core.resources.prefs b/1.5/plugins/org.eclipse.epf.xml.uma/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 9f001c7..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Thu May 03 16:56:57 PDT 2007
-eclipse.preferences.version=1
-encoding//src/model/EPF_Schema_200609071334.xsd=UTF8
-encoding//src/model/EPF_Schema_200704031425.xsd=UTF8
-encoding//src/model/UMA.xsd=UTF8
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/META-INF/MANIFEST.MF b/1.5/plugins/org.eclipse.epf.xml.uma/META-INF/MANIFEST.MF
deleted file mode 100644
index 44b41c2..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.epf.xml.uma; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Export-Package: org.eclipse.epf.xml.uma,
- org.eclipse.epf.xml.uma.impl,
- org.eclipse.epf.xml.uma.util
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.ecore;visibility:=reexport,
- org.eclipse.emf.ecore.xmi;visibility:=reexport,
- org.eclipse.emf.ecore.sdo
-Eclipse-LazyStart: true
-Import-Package: org.eclipse.epf.common.serviceability
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/build.properties b/1.5/plugins/org.eclipse.epf.xml.uma/build.properties
deleted file mode 100644
index 1bfb16c..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-# <copyright>
-# </copyright>
-#
-# $Id: build.properties,v 1.1 2008/01/15 08:53:04 jtham Exp $
-
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties,\
-               plugin.xml
-
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/plugin.properties b/1.5/plugins/org.eclipse.epf.xml.uma/plugin.properties
deleted file mode 100644
index 19814f2..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/plugin.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-# <copyright>
-# </copyright>
-#
-# $Id: plugin.properties,v 1.1 2008/01/15 08:53:04 jtham Exp $
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-# NLS_MESSAGEFORMAT_VAR
-
-pluginName = EPF XML UMA Model
-providerName=Eclipse.org
-
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/plugin.xml b/1.5/plugins/org.eclipse.epf.xml.uma/plugin.xml
deleted file mode 100644
index 1e35b1d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/plugin.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- <copyright>
- </copyright>
-
- $Id: plugin.xml,v 1.1 2008/01/15 08:53:04 jtham Exp $
--->
-
-<plugin>
-
-  <extension point="org.eclipse.emf.ecore.generated_package">
-    <package 
-       uri = "http://www.eclipse.org/epf/uma/1.0.3" 
-       class = "org.eclipse.epf.xml.uma.UmaPackage" />
-  </extension>
-
-  <extension point="org.eclipse.emf.ecore.extension_parser">
-    <parser 
-       type="uma" 
-       class="org.eclipse.epf.xml.uma.util.UmaResourceFactoryImpl" />
-  </extension>
-
-</plugin>
-
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200608300736.xsd b/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200608300736.xsd
deleted file mode 100644
index e7bc451..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200608300736.xsd
+++ /dev/null
@@ -1,1398 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- EPF UMA XML Data Interchange Schema -->
-<xsd:schema targetNamespace="http://www.eclipse.org/epf/uma/1.0.3" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:uma="http://www.eclipse.org/epf/uma/1.0.3">
-	<xsd:simpleType name="WorkOrderType">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Element in which one Breakdown Element depends on the start or finish of another Breakdown Element in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="finishToStart"/>
-			<xsd:enumeration value="finishToFinish"/>
-			<xsd:enumeration value="startToStart"/>
-			<xsd:enumeration value="startToFinish"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:simpleType name="VariabilityType">
-		<xsd:annotation>
-			<xsd:documentation>An Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="na"/>
-			<xsd:enumeration value="contributes"/>
-			<xsd:enumeration value="extends"/>
-			<xsd:enumeration value="replaces"/>
-			<xsd:enumeration value="localContribution"/>
-			<xsd:enumeration value="localReplacement"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:complexType name="Element">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Element.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:complexType>
-	<xsd:complexType name="NamedElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Named Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Element">
-				<xsd:attribute name="name" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PackageableElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Packagable Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:NamedElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodElement">
-		<xsd:annotation>
-			<xsd:documentation>The root generalization for all UMA Method Elements.  Defines a common set of attributes inherited by all UMA Method Elements.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:PackageableElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="OwnedRule" type="uma:Constraint">
-						<xsd:annotation>
-							<xsd:documentation>Defines the packaging rules for this Method Element.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-				<xsd:attribute name="id" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element has a global unique id.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="briefDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="suppressed" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If a Variability Element is derived from another Variability Element using the "extends" Variability Specialization, then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="orderingGuide" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Constraint">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:attribute name="mainDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Stores the main definition of the constraint.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Section">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="SubSection" type="uma:Section" minOccurs="0"/>
-					<xsd:element name="Predecessor" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Description" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>This attributes store the description text for a Content Description's Section.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="sectionName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="predecessor" type="xsd:string"/>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodUnit">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that shall be maintained in a Method Library as a separate unit of control.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="Copyright" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="MainDescription" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Stores the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="KeyConsiderations" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Section" type="uma:Section" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="GuidanceDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Attachment" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PracticeDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Practice.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="AdditionalInfo" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Any additional Information not covered by the other attributes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Application" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes how the Practice is being applied or introduced into the context described in background.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Background" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Goals" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>A summary of the overall goals to be addressed by the Practice.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="LevelsOfAdoption" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Problem" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>A description of the problem the Practice addresses.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Work Product.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="ImpactOfNotHaving" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes why the work product is produced and to what use it will be put.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ReasonsForNotNeeding" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="externalId" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>An external visible number that is used to reference this artifact. Used like a synonym.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ArtifactDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for an Artifact.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element name="BriefOutline" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="RepresentationOptions" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliverableDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for a Deliverable.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element name="ExternalDescription" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="PackagingGuidance" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Role.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="AssignmentApproaches" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Skills" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Lists of set of required skills a person needs to possess to fulfill that Role.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Synonyms" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="Alternatives" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Task and what is intended to be achieved.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescribableElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
-This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance.  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Presentation" type="uma:ContentDescription"/>
-				</xsd:choice>
-				<xsd:attribute name="presentationName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to "rup_architecture_document" to differentiate from a "j2ee_architcture_document" whereas the external presentation would always be "Architecture Document".</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="shapeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="nodeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used in tree browser presentations and breakdown structures.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
-Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement">
-				<xsd:sequence>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guidance">
-		<xsd:annotation>
-			<xsd:documentation>Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Concept">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Checklist">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Example">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guideline">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Estimate">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that provides sizing measures, or standards for sizing the work effort associated with performing a particular piece of work and instructions for their successful use. It may be comprised of estimation considerations and estimation metrics.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="EstimationMetric" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimatingMetric">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that describes a metric or measure that is associated with an element and which is used to calculate the size of the work effort as well as a range of potential labor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimationConsiderations">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that qualifies the usage and application of estimation metrics in the development of an actual estimate.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Roadmap">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
-An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Report">
-		<xsd:annotation>
-			<xsd:documentation>A predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Template">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="SupportingMaterial">
-		<xsd:annotation>
-			<xsd:documentation>A catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ToolMentor">
-		<xsd:annotation>
-			<xsd:documentation>A  specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Whitepaper">
-		<xsd:annotation>
-			<xsd:documentation>A special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Concept"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TermDefinition">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that defines concepts and are used to build up the Glossary. TermDefinitions are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Practice">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be "Manage Risks", "Continuously verify quality", "Architecture-centric and component-based development", etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ActivityReference" type="xsd:string"/>
-					<xsd:element name="ContentReference" type="xsd:string"/>
-					<xsd:element name="SubPractice" type="uma:Practice"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ReusableAsset">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
-how the asset should be used.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProduct">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
-A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Estimate" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-					<xsd:element name="Report" type="xsd:string"/>
-					<xsd:element name="Template" type="xsd:string"/>
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Artifact">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
-Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might "own" a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContainedArtifact" type="uma:Artifact"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Deliverable">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="DeliveredWorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Outcome">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Role">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
-A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ResponsibleFor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Task">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
-A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
-A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
-For example, a Task such as "Develop Use Case Model" describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the "method" of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PerformedBy" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Estimate" type="xsd:string"/>
-						<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-						<xsd:element name="ToolMentor" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkDefinition">
-		<xsd:annotation>
-			<xsd:documentation>An abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
-Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategory">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class generalizing content category types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Discipline">
-		<xsd:annotation>
-			<xsd:documentation>A categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
-A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Task" type="xsd:string"/>
-					<xsd:element name="SubDiscipline" type="uma:Discipline"/>
-					<xsd:element name="ReferenceWorkflow" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DisciplineGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Used to group Disciplines.  For example, the Discipline Grouping "Software Disciplines" would be the group of all disciplines related to developing software such as "Requirements Management" or "Testing"; "IT Infrastructure Management" would be a Disciplines Grouping for disciplines such as "IT Operational Services", "IT Customer Relationships", or "IT Enabling Services".  Disciplines can be associated to more than one Discipline Grouping.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Discipline" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Domain">
-		<xsd:annotation>
-			<xsd:documentation>A refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
-Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-					<xsd:element name="Subdomain" type="uma:Domain"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSet">
-		<xsd:annotation>
-			<xsd:documentation>Organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the "Analysts" Role Set could group the "Business Process Analyst", "System Analyst", as well as "Requirements Specifier" roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Role" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSetGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="RoleSet" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Tool">
-		<xsd:annotation>
-			<xsd:documentation>A container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductType">
-		<xsd:annotation>
-			<xsd:documentation>A second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is "Class Diagram", which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or "Specification", which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CustomCategory">
-		<xsd:annotation>
-			<xsd:documentation>A category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a "Testing" category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="CategorizedElement" type="xsd:string"/>
-					<xsd:element name="SubCategory" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPackage">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ReusedPackage" type="xsd:string"/>
-					<xsd:element name="MethodPackage" type="uma:MethodPackage"/>
-				</xsd:choice>
-				<xsd:attribute name="global" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContentElement" type="uma:ContentElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategoryPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that only contains Content Category Elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContentCategory" type="uma:ContentCategory"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements defined in the Process package.
-Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PlanningData">
-		<xsd:annotation>
-			<xsd:documentation>A Process Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
-Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
-(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:attribute name="startDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default start date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="finishDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default finish date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="rank" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The default rank for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:sequence>
-					<xsd:element name="PresentedAfter" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PresentedBefore" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PlanningData" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="SuperActivity" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-				<xsd:attribute name="prefix" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. "SRA.Establish Requirements" with SRA indicating that this Activity belongs to the "Software Requirements Analysis" module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, "Customer.Architect" would define a "Customer" prefix for the Role Descriptor "Architect" expressing that this is an architect on the customer side and not the development team side.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isPlanned" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="hasMultipleOccurrences" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as "Detail Use Case" would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOptional" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkOrder">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
-The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:simpleContent>
-			<xsd:extension base="xsd:string">
-				<xsd:attribute name="id" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Defines a global unique id for a work order.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="linkType" type="uma:WorkOrderType">
-					<xsd:annotation>
-						<xsd:documentation>This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:simpleContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkBreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Predecessor" type="uma:WorkOrder"/>
-				</xsd:choice>
-				<xsd:attribute name="isRepeatable" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOngoing" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isEventDriven" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Milestone">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Activity">
-		<xsd:annotation>
-			<xsd:documentation>A Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
-Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="BreakdownElement" type="uma:BreakdownElement"/>
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="Roadmap" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-				<xsd:attribute name="IsEnactable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Phase">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Iteration">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElementDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Breakdown Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:attribute name="usageGuidance" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ActivityDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for an Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:sequence>
-					<xsd:element name="Alternatives" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="HowToStaff" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescriptorDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for a Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="RefinedDescription" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. </xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Activity Description that is used to store the textual description for a Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ActivityDescription">
-				<xsd:sequence>
-					<xsd:element name="Scope" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Defines the scope of the Process, i.e. which types of projects does it address and which not.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="UsageNotes" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Any additional notes on how to apply and instantiate this process for a project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="externalId" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>An external visible number that is used to reference this delivery patterns and models. It is used like a synonym.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Process Description that is used to store the textual description for a Delivery Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessDescription">
-				<xsd:sequence>
-					<xsd:element name="Scale" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ProjectCharacteristics" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Characterizes the project that would typically perform this Process</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="RiskLevel" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines typical project risks that are addressed with this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="EstimatingTechnique" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the Estimation Techniques provided for this Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ProjectMemberExpertise" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="TypeOfContract" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides background information about the coI'm chaI'm ntracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Descriptor">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
-Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element name="WorkProduct" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ResponsibleRole" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="ExternalInputTo" type="xsd:string"/>
-						<xsd:element name="ImpactedBy" type="xsd:string"/>
-						<xsd:element name="Impacts" type="xsd:string"/>
-						<xsd:element name="MandatoryInputTo" type="xsd:string"/>
-						<xsd:element name="OptionalInputTo" type="xsd:string"/>
-						<xsd:element name="OutputFrom" type="xsd:string"/>
-						<xsd:element name="DeliverableParts" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="activityEntryState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="activityExitState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element name="Role" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ResponsibleFor" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
-A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
-</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element name="Task" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PerformedPrimarilyBy" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="AssistedBy" type="xsd:string"/>
-						<xsd:element name="ExternalInput" type="xsd:string"/>
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-					</xsd:choice>
-					<xsd:element name="Step" type="uma:Section" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CompositeRole">
-		<xsd:annotation>
-			<xsd:documentation>A special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
-A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:RoleDescriptor">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="AggregatedRole" type="uma:Role"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TeamProfile">
-		<xsd:annotation>
-			<xsd:documentation>A Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
-Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
-Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Role" type="xsd:string"/>
-					<xsd:element name="SuperTeam" type="xsd:string"/>
-					<xsd:element name="SubTeam" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Process">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
-Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity">
-				<xsd:sequence>
-					<xsd:element name="IncludesPattern" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="DefaultContext" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ValidContext" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcess">
-		<xsd:annotation>
-			<xsd:documentation>A special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
-A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="CommunicationsMaterial" type="xsd:string"/>
-					<xsd:element name="EducationMaterial" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CapabilityPattern">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
-A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
-- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
-- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
-- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPlanningTemplate">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
-A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="BaseProcess" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Process Elements, only.
-A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ProcessElement" type="uma:ProcessElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponentInterface">
-		<xsd:annotation>
-			<xsd:documentation>Comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="InterfaceSpecification" type="uma:TaskDescriptor"/>
-					<xsd:element name="InterfaceIO" type="uma:WorkProductDescriptor"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponent">
-		<xsd:annotation>
-			<xsd:documentation>A special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
-UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a "black box".  At any point during a project the component "realization" detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessPackage">
-				<xsd:sequence>
-					<xsd:element name="Copyright" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Interface" type="uma:ProcessComponentInterface" minOccurs="0"/>
-					<xsd:element name="Process" type="uma:Process"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="ReferencedMethodPlugin" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPackage" type="uma:MethodPackage" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="userChangeable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodPlugin" type="uma:MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="BaseConfiguration" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPluginSelection" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPackageSelection" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="DefaultView" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ProcessView" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodConfiguration" type="uma:MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="MethodPlugin" type="uma:MethodPlugin" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodConfiguration" type="uma:MethodConfiguration" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodLibrary" type="uma:MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-</xsd:schema>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200609071334.xsd b/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200609071334.xsd
deleted file mode 100644
index 7d3e4fe..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200609071334.xsd
+++ /dev/null
@@ -1,1409 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- EPF UMA XML Data Interchange Schema -->
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:uma="http://www.eclipse.org/epf/uma/1.0.3" targetNamespace="http://www.eclipse.org/epf/uma/1.0.3">
-	<xsd:simpleType name="WorkOrderType">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Element in which one Breakdown Element depends on the start or finish of another Breakdown Element in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="finishToStart"/>
-			<xsd:enumeration value="finishToFinish"/>
-			<xsd:enumeration value="startToStart"/>
-			<xsd:enumeration value="startToFinish"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:simpleType name="VariabilityType">
-		<xsd:annotation>
-			<xsd:documentation>An Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="na"/>
-			<xsd:enumeration value="contributes"/>
-			<xsd:enumeration value="extends"/>
-			<xsd:enumeration value="replaces"/>
-			<xsd:enumeration value="localContribution"/>
-			<xsd:enumeration value="localReplacement"/>
-			<xsd:enumeration value="extendsReplaces"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:complexType name="Element">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Element.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:complexType>
-	<xsd:complexType name="NamedElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Named Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Element">
-				<xsd:attribute name="name" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PackageableElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Packagable Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:NamedElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodElement">
-		<xsd:annotation>
-			<xsd:documentation>The root generalization for all UMA Method Elements.  Defines a common set of attributes inherited by all UMA Method Elements.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:PackageableElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="OwnedRule" type="uma:Constraint">
-						<xsd:annotation>
-							<xsd:documentation>Defines the packaging rules for this Method Element.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-				<xsd:attribute name="id" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element has a global unique id.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="briefDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="suppressed" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If a Variability Element is derived from another Variability Element using the "extends" Variability Specialization, then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="orderingGuide" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Constraint">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:attribute name="mainDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Stores the main definition of the constraint.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Section">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="SubSection" type="uma:Section" minOccurs="0"/>
-					<xsd:element name="Predecessor" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Description" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>This attributes store the description text for a Content Description's Section.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="sectionName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="predecessor" type="xsd:string"/>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodUnit">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that shall be maintained in a Method Library as a separate unit of control.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="Copyright" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="MainDescription" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Stores the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="KeyConsiderations" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Section" type="uma:Section" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="GuidanceDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Attachment" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PracticeDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Practice.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="AdditionalInfo" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Any additional Information not covered by the other attributes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Application" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes how the Practice is being applied or introduced into the context described in background.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Background" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Goals" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>A summary of the overall goals to be addressed by the Practice.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="LevelsOfAdoption" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Problem" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>A description of the problem the Practice addresses.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Work Product.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="ImpactOfNotHaving" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes why the work product is produced and to what use it will be put.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ReasonsForNotNeeding" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="externalId" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>An external visible number that is used to reference this artifact. Used like a synonym.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ArtifactDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for an Artifact.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element name="BriefOutline" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="RepresentationOptions" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliverableDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for a Deliverable.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element name="ExternalDescription" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="PackagingGuidance" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Role.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="AssignmentApproaches" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Skills" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Lists of set of required skills a person needs to possess to fulfill that Role.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Synonyms" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="Alternatives" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Task and what is intended to be achieved.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescribableElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
-This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance.  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Presentation" type="uma:ContentDescription"/>
-				</xsd:choice>
-				<xsd:attribute name="presentationName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to "rup_architecture_document" to differentiate from a "j2ee_architcture_document" whereas the external presentation would always be "Architecture Document".</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="shapeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="nodeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used in tree browser presentations and breakdown structures.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
-Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement">
-				<xsd:sequence>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guidance">
-		<xsd:annotation>
-			<xsd:documentation>Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Concept">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Checklist">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Example">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guideline">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Estimate">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that provides sizing measures, or standards for sizing the work effort associated with performing a particular piece of work and instructions for their successful use. It may be comprised of estimation considerations and estimation metrics.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="EstimationMetric" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimatingMetric">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that describes a metric or measure that is associated with an element and which is used to calculate the size of the work effort as well as a range of potential labor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimationConsiderations">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that qualifies the usage and application of estimation metrics in the development of an actual estimate.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Roadmap">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
-An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Report">
-		<xsd:annotation>
-			<xsd:documentation>A predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Template">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="SupportingMaterial">
-		<xsd:annotation>
-			<xsd:documentation>A catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ToolMentor">
-		<xsd:annotation>
-			<xsd:documentation>A  specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Whitepaper">
-		<xsd:annotation>
-			<xsd:documentation>A special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Concept"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TermDefinition">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that defines concepts and are used to build up the Glossary. TermDefinitions are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Practice">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be "Manage Risks", "Continuously verify quality", "Architecture-centric and component-based development", etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ActivityReference" type="xsd:string"/>
-					<xsd:element name="ContentReference" type="xsd:string"/>
-					<xsd:element name="SubPractice" type="uma:Practice"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ReusableAsset">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
-how the asset should be used.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProduct">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
-A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Estimate" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-					<xsd:element name="Report" type="xsd:string"/>
-					<xsd:element name="Template" type="xsd:string"/>
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Artifact">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
-Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might "own" a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContainedArtifact" type="uma:Artifact"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Deliverable">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="DeliveredWorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Outcome">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Role">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
-A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ResponsibleFor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Task">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
-A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
-A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
-For example, a Task such as "Develop Use Case Model" describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the "method" of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PerformedBy" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Estimate" type="xsd:string"/>
-						<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-						<xsd:element name="ToolMentor" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkDefinition">
-		<xsd:annotation>
-			<xsd:documentation>An abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
-Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategory">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class generalizing content category types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Discipline">
-		<xsd:annotation>
-			<xsd:documentation>A categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
-A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Task" type="xsd:string"/>
-					<xsd:element name="SubDiscipline" type="uma:Discipline"/>
-					<xsd:element name="ReferenceWorkflow" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DisciplineGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Used to group Disciplines.  For example, the Discipline Grouping "Software Disciplines" would be the group of all disciplines related to developing software such as "Requirements Management" or "Testing"; "IT Infrastructure Management" would be a Disciplines Grouping for disciplines such as "IT Operational Services", "IT Customer Relationships", or "IT Enabling Services".  Disciplines can be associated to more than one Discipline Grouping.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Discipline" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Domain">
-		<xsd:annotation>
-			<xsd:documentation>A refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
-Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-					<xsd:element name="Subdomain" type="uma:Domain"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSet">
-		<xsd:annotation>
-			<xsd:documentation>Organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the "Analysts" Role Set could group the "Business Process Analyst", "System Analyst", as well as "Requirements Specifier" roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Role" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSetGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="RoleSet" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Tool">
-		<xsd:annotation>
-			<xsd:documentation>A container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductType">
-		<xsd:annotation>
-			<xsd:documentation>A second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is "Class Diagram", which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or "Specification", which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CustomCategory">
-		<xsd:annotation>
-			<xsd:documentation>A category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a "Testing" category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="CategorizedElement" type="xsd:string"/>
-					<xsd:element name="SubCategory" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPackage">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ReusedPackage" type="xsd:string"/>
-					<xsd:element name="MethodPackage" type="uma:MethodPackage"/>
-				</xsd:choice>
-				<xsd:attribute name="global" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContentElement" type="uma:ContentElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategoryPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that only contains Content Category Elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContentCategory" type="uma:ContentCategory"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements defined in the Process package.
-Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PlanningData">
-		<xsd:annotation>
-			<xsd:documentation>A Process Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
-Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
-(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:attribute name="startDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default start date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="finishDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default finish date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="rank" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The default rank for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:sequence>
-					<xsd:element name="PresentedAfter" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PresentedBefore" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PlanningData" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="SuperActivity" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-				<xsd:attribute name="prefix" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. "SRA.Establish Requirements" with SRA indicating that this Activity belongs to the "Software Requirements Analysis" module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, "Customer.Architect" would define a "Customer" prefix for the Role Descriptor "Architect" expressing that this is an architect on the customer side and not the development team side.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isPlanned" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="hasMultipleOccurrences" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as "Detail Use Case" would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOptional" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkOrder">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
-The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:simpleContent>
-			<xsd:extension base="xsd:string">
-				<xsd:attribute name="id" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Defines a global unique id for a work order.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="linkType" type="uma:WorkOrderType">
-					<xsd:annotation>
-						<xsd:documentation>This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:simpleContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkBreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Predecessor" type="uma:WorkOrder"/>
-				</xsd:choice>
-				<xsd:attribute name="isRepeatable" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOngoing" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isEventDriven" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Milestone">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Activity">
-		<xsd:annotation>
-			<xsd:documentation>A Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
-Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="BreakdownElement" type="uma:BreakdownElement"/>
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="Roadmap" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-				<xsd:attribute name="IsEnactable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Phase">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Iteration">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElementDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Breakdown Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:attribute name="usageGuidance" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ActivityDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for an Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:sequence>
-					<xsd:element name="Alternatives" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="HowToStaff" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescriptorDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for a Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="RefinedDescription" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. </xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Activity Description that is used to store the textual description for a Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ActivityDescription">
-				<xsd:sequence>
-					<xsd:element name="Scope" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Defines the scope of the Process, i.e. which types of projects does it address and which not.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="UsageNotes" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Any additional notes on how to apply and instantiate this process for a project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="externalId" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>An external visible number that is used to reference this delivery patterns and models. It is used like a synonym.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Process Description that is used to store the textual description for a Delivery Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessDescription">
-				<xsd:sequence>
-					<xsd:element name="Scale" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ProjectCharacteristics" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Characterizes the project that would typically perform this Process</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="RiskLevel" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines typical project risks that are addressed with this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="EstimatingTechnique" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the Estimation Techniques provided for this Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ProjectMemberExpertise" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="TypeOfContract" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides background information about the coI'm chaI'm ntracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Descriptor">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
-Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element name="WorkProduct" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ResponsibleRole" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="ExternalInputTo" type="xsd:string"/>
-						<xsd:element name="ImpactedBy" type="xsd:string"/>
-						<xsd:element name="Impacts" type="xsd:string"/>
-						<xsd:element name="MandatoryInputTo" type="xsd:string"/>
-						<xsd:element name="OptionalInputTo" type="xsd:string"/>
-						<xsd:element name="OutputFrom" type="xsd:string"/>
-						<xsd:element name="DeliverableParts" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="activityEntryState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="activityExitState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element name="Role" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ResponsibleFor" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
-A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
-</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element name="Task" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PerformedPrimarilyBy" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="AssistedBy" type="xsd:string"/>
-						<xsd:element name="ExternalInput" type="xsd:string"/>
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-					</xsd:choice>
-					<xsd:element name="Step" type="uma:Section" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CompositeRole">
-		<xsd:annotation>
-			<xsd:documentation>A special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
-A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:RoleDescriptor">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="AggregatedRole" type="uma:Role"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TeamProfile">
-		<xsd:annotation>
-			<xsd:documentation>A Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
-Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
-Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Role" type="xsd:string"/>
-					<xsd:element name="SuperTeam" type="xsd:string"/>
-					<xsd:element name="SubTeam" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Process">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
-Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity">
-				<xsd:sequence>
-					<xsd:element name="IncludesPattern" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="DefaultContext" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ValidContext" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="diagramURI" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The URI of the diagram file associated with the process.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcess">
-		<xsd:annotation>
-			<xsd:documentation>A special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
-A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="CommunicationsMaterial" type="xsd:string"/>
-					<xsd:element name="EducationMaterial" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CapabilityPattern">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
-A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
-- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
-- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
-- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPlanningTemplate">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
-A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="BaseProcess" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Process Elements, only.
-A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ProcessElement" type="uma:ProcessElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponentInterface">
-		<xsd:annotation>
-			<xsd:documentation>Comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="InterfaceSpecification" type="uma:TaskDescriptor"/>
-					<xsd:element name="InterfaceIO" type="uma:WorkProductDescriptor"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponent">
-		<xsd:annotation>
-			<xsd:documentation>A special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
-UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a "black box".  At any point during a project the component "realization" detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessPackage">
-				<xsd:sequence>
-					<xsd:element name="Copyright" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Interface" type="uma:ProcessComponentInterface" minOccurs="0"/>
-					<xsd:element name="Process" type="uma:Process"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="ReferencedMethodPlugin" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPackage" type="uma:MethodPackage" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="userChangeable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodPlugin" type="uma:MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="BaseConfiguration" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPluginSelection" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPackageSelection" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="DefaultView" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ProcessView" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodConfiguration" type="uma:MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="MethodPlugin" type="uma:MethodPlugin" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodConfiguration" type="uma:MethodConfiguration" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="tool" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The tool that generated the XML file.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodLibrary" type="uma:MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-</xsd:schema>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200704031425.xsd b/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200704031425.xsd
deleted file mode 100644
index 1e7b163..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/EPF_Schema_200704031425.xsd
+++ /dev/null
@@ -1,1418 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- EPF UMA XML Data Interchange Schema -->
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:uma="http://www.eclipse.org/epf/uma/1.0.3" targetNamespace="http://www.eclipse.org/epf/uma/1.0.3">
-	<xsd:simpleType name="WorkOrderType">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Element in which one Breakdown Element depends on the start or finish of another Breakdown Element in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="finishToStart"/>
-			<xsd:enumeration value="finishToFinish"/>
-			<xsd:enumeration value="startToStart"/>
-			<xsd:enumeration value="startToFinish"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:simpleType name="VariabilityType">
-		<xsd:annotation>
-			<xsd:documentation>An Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="na"/>
-			<xsd:enumeration value="contributes"/>
-			<xsd:enumeration value="extends"/>
-			<xsd:enumeration value="replaces"/>
-			<xsd:enumeration value="localContribution"/>
-			<xsd:enumeration value="localReplacement"/>
-			<xsd:enumeration value="extendsReplaces"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:complexType name="Element">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Element.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:complexType>
-	<xsd:complexType name="NamedElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Named Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Element">
-				<xsd:attribute name="name" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PackageableElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Packagable Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:NamedElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodElement">
-		<xsd:annotation>
-			<xsd:documentation>The root generalization for all UMA Method Elements.  Defines a common set of attributes inherited by all UMA Method Elements.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:PackageableElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="OwnedRule" type="uma:Constraint">
-						<xsd:annotation>
-							<xsd:documentation>Defines the packaging rules for this Method Element.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="MethodElementProperty" type="uma:MethodElementProperty">
-					</xsd:element>
-				</xsd:choice>
-				<xsd:attribute name="id" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element has a global unique id.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="briefDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="suppressed" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If a Variability Element is derived from another Variability Element using the "extends" Variability Specialization, then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="orderingGuide" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Constraint">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:attribute name="mainDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Stores the main definition of the constraint.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	  <xsd:complexType name="MethodElementProperty">
-	    <xsd:complexContent>
-	      <xsd:extension base="uma:PackageableElement">
-	        <xsd:attribute name="value" type="xsd:string"/>
-	      </xsd:extension>
-	    </xsd:complexContent>
-  	</xsd:complexType>
-	<xsd:complexType name="Section">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="SubSection" type="uma:Section" minOccurs="0"/>
-					<xsd:element name="Predecessor" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Description" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>This attributes store the description text for a Content Description's Section.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="sectionName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodUnit">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that shall be maintained in a Method Library as a separate unit of control.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="Copyright" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="MainDescription" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Stores the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="KeyConsiderations" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Section" type="uma:Section" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="externalId" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>An external visible number that is used to reference this artifact. Used like a synonym.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>				
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="GuidanceDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Attachment" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PracticeDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Practice.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="AdditionalInfo" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Any additional Information not covered by the other attributes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Application" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes how the Practice is being applied or introduced into the context described in background.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Background" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Goals" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>A summary of the overall goals to be addressed by the Practice.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="LevelsOfAdoption" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Problem" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>A description of the problem the Practice addresses.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Work Product.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="ImpactOfNotHaving" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes why the work product is produced and to what use it will be put.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ReasonsForNotNeeding" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ArtifactDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for an Artifact.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element name="BriefOutline" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="RepresentationOptions" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Representation" type="xsd:string" minOccurs="0">
-					</xsd:element>
-					<xsd:element name="Notation" type="xsd:string" minOccurs="0">
-					</xsd:element>					
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliverableDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for a Deliverable.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element name="ExternalDescription" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="PackagingGuidance" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Role.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="AssignmentApproaches" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Skills" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Lists of set of required skills a person needs to possess to fulfill that Role.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Synonyms" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element name="Alternatives" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Task and what is intended to be achieved.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescribableElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
-This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance.  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Presentation" type="uma:ContentDescription"/>
-				</xsd:choice>
-				<xsd:attribute name="presentationName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to "rup_architecture_document" to differentiate from a "j2ee_architcture_document" whereas the external presentation would always be "Architecture Document".</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="shapeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="nodeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used in tree browser presentations and breakdown structures.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
-Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement">
-				<xsd:sequence>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guidance">
-		<xsd:annotation>
-			<xsd:documentation>Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Concept">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Checklist">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Example">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guideline">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Estimate">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that provides sizing measures, or standards for sizing the work effort associated with performing a particular piece of work and instructions for their successful use. It may be comprised of estimation considerations and estimation metrics.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="EstimationMetric" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimatingMetric">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that describes a metric or measure that is associated with an element and which is used to calculate the size of the work effort as well as a range of potential labor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimationConsiderations">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that qualifies the usage and application of estimation metrics in the development of an actual estimate.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Roadmap">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
-An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Report">
-		<xsd:annotation>
-			<xsd:documentation>A predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Template">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="SupportingMaterial">
-		<xsd:annotation>
-			<xsd:documentation>A catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ToolMentor">
-		<xsd:annotation>
-			<xsd:documentation>A  specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Whitepaper">
-		<xsd:annotation>
-			<xsd:documentation>A special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Concept"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TermDefinition">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that defines concepts and are used to build up the Glossary. TermDefinitions are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Practice">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be "Manage Risks", "Continuously verify quality", "Architecture-centric and component-based development", etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ActivityReference" type="xsd:string"/>
-					<xsd:element name="ContentReference" type="xsd:string"/>
-					<xsd:element name="SubPractice" type="uma:Practice"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ReusableAsset">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
-how the asset should be used.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProduct">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
-A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Estimate" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-					<xsd:element name="Report" type="xsd:string"/>
-					<xsd:element name="Template" type="xsd:string"/>
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Artifact">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
-Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might "own" a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContainedArtifact" type="uma:Artifact"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Deliverable">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="DeliveredWorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Outcome">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Role">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
-A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ResponsibleFor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Task">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
-A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
-A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
-For example, a Task such as "Develop Use Case Model" describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the "method" of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PerformedBy" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Estimate" type="xsd:string"/>
-						<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-						<xsd:element name="ToolMentor" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkDefinition">
-		<xsd:annotation>
-			<xsd:documentation>An abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
-Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategory">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class generalizing content category types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Discipline">
-		<xsd:annotation>
-			<xsd:documentation>A categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
-A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Task" type="xsd:string"/>
-					<xsd:element name="SubDiscipline" type="uma:Discipline"/>
-					<xsd:element name="ReferenceWorkflow" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DisciplineGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Used to group Disciplines.  For example, the Discipline Grouping "Software Disciplines" would be the group of all disciplines related to developing software such as "Requirements Management" or "Testing"; "IT Infrastructure Management" would be a Disciplines Grouping for disciplines such as "IT Operational Services", "IT Customer Relationships", or "IT Enabling Services".  Disciplines can be associated to more than one Discipline Grouping.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Discipline" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Domain">
-		<xsd:annotation>
-			<xsd:documentation>A refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
-Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-					<xsd:element name="Subdomain" type="uma:Domain"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSet">
-		<xsd:annotation>
-			<xsd:documentation>Organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the "Analysts" Role Set could group the "Business Process Analyst", "System Analyst", as well as "Requirements Specifier" roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Role" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSetGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="RoleSet" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Tool">
-		<xsd:annotation>
-			<xsd:documentation>A container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductType">
-		<xsd:annotation>
-			<xsd:documentation>A second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is "Class Diagram", which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or "Specification", which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CustomCategory">
-		<xsd:annotation>
-			<xsd:documentation>A category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a "Testing" category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="CategorizedElement" type="xsd:string"/>
-					<xsd:element name="SubCategory" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPackage">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ReusedPackage" type="xsd:string"/>
-					<xsd:element name="MethodPackage" type="uma:MethodPackage"/>
-				</xsd:choice>
-				<xsd:attribute name="global" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContentElement" type="uma:ContentElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategoryPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that only contains Content Category Elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ContentCategory" type="uma:ContentCategory"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements defined in the Process package.
-Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PlanningData">
-		<xsd:annotation>
-			<xsd:documentation>A Process Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
-Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
-(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:attribute name="startDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default start date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="finishDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default finish date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="rank" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The default rank for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:sequence>
-					<xsd:element name="PresentedAfter" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PresentedBefore" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PlanningData" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="SuperActivity" type="xsd:string" minOccurs="0"/>
-				</xsd:sequence>
-				<xsd:attribute name="prefix" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. "SRA.Establish Requirements" with SRA indicating that this Activity belongs to the "Software Requirements Analysis" module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, "Customer.Architect" would define a "Customer" prefix for the Role Descriptor "Architect" expressing that this is an architect on the customer side and not the development team side.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isPlanned" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="hasMultipleOccurrences" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as "Detail Use Case" would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOptional" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkOrder">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
-The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:simpleContent>
-			<xsd:extension base="xsd:string">
-				<xsd:attribute name="id" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Defines a global unique id for a work order.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="linkType" type="uma:WorkOrderType">
-					<xsd:annotation>
-						<xsd:documentation>This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:simpleContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkBreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Predecessor" type="uma:WorkOrder"/>
-				</xsd:choice>
-				<xsd:attribute name="isRepeatable" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOngoing" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isEventDriven" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Milestone">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Activity">
-		<xsd:annotation>
-			<xsd:documentation>A Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
-Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element name="Precondition" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Postcondition" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="BreakdownElement" type="uma:BreakdownElement"/>
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="Roadmap" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-				<xsd:attribute name="IsEnactable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Phase">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Iteration">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElementDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Breakdown Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:attribute name="usageGuidance" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ActivityDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for an Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:sequence>
-					<xsd:element name="Alternatives" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="HowToStaff" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="Purpose" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescriptorDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for a Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="RefinedDescription" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. </xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Activity Description that is used to store the textual description for a Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ActivityDescription">
-				<xsd:sequence>
-					<xsd:element name="Scope" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Defines the scope of the Process, i.e. which types of projects does it address and which not.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="UsageNotes" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Any additional notes on how to apply and instantiate this process for a project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Process Description that is used to store the textual description for a Delivery Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessDescription">
-				<xsd:sequence>
-					<xsd:element name="Scale" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ProjectCharacteristics" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Characterizes the project that would typically perform this Process</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="RiskLevel" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Outlines typical project risks that are addressed with this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="EstimatingTechnique" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Describes the Estimation Techniques provided for this Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="ProjectMemberExpertise" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element name="TypeOfContract" type="xsd:string" minOccurs="0">
-						<xsd:annotation>
-							<xsd:documentation>Provides background information about the coI'm chaI'm ntracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Descriptor">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
-Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element name="WorkProduct" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ResponsibleRole" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="ExternalInputTo" type="xsd:string"/>
-						<xsd:element name="ImpactedBy" type="xsd:string"/>
-						<xsd:element name="Impacts" type="xsd:string"/>
-						<xsd:element name="MandatoryInputTo" type="xsd:string"/>
-						<xsd:element name="OptionalInputTo" type="xsd:string"/>
-						<xsd:element name="OutputFrom" type="xsd:string"/>
-						<xsd:element name="DeliverableParts" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="activityEntryState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="activityExitState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element name="Role" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ResponsibleFor" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
-A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
-</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element name="Task" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="PerformedPrimarilyBy" type="xsd:string" minOccurs="0"/>
-					<xsd:choice minOccurs="0" maxOccurs="unbounded">
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="AssistedBy" type="xsd:string"/>
-						<xsd:element name="ExternalInput" type="xsd:string"/>
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-					</xsd:choice>
-					<xsd:element name="Step" type="uma:Section" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CompositeRole">
-		<xsd:annotation>
-			<xsd:documentation>A special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
-A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:RoleDescriptor">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="AggregatedRole" type="uma:Role"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TeamProfile">
-		<xsd:annotation>
-			<xsd:documentation>A Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
-Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
-Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="Role" type="xsd:string"/>
-					<xsd:element name="SuperTeam" type="xsd:string"/>
-					<xsd:element name="SubTeam" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Process">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
-Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity">
-				<xsd:sequence>
-					<xsd:element name="IncludesPattern" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="DefaultContext" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ValidContext" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="diagramURI" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The URI of the diagram file associated with the process.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcess">
-		<xsd:annotation>
-			<xsd:documentation>A special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
-A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="CommunicationsMaterial" type="xsd:string"/>
-					<xsd:element name="EducationMaterial" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CapabilityPattern">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
-A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
-- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
-- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
-- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPlanningTemplate">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
-A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="BaseProcess" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Process Elements, only.
-A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="ProcessElement" type="uma:ProcessElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponentInterface">
-		<xsd:annotation>
-			<xsd:documentation>Comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice minOccurs="0" maxOccurs="unbounded">
-					<xsd:element name="InterfaceSpecification" type="uma:TaskDescriptor"/>
-					<xsd:element name="InterfaceIO" type="uma:WorkProductDescriptor"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponent">
-		<xsd:annotation>
-			<xsd:documentation>A special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
-UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a "black box".  At any point during a project the component "realization" detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessPackage">
-				<xsd:sequence>
-					<xsd:element name="Copyright" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="Interface" type="uma:ProcessComponentInterface" minOccurs="0"/>
-					<xsd:element name="Process" type="uma:Process"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="ReferencedMethodPlugin" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPackage" type="uma:MethodPackage" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="userChangeable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodPlugin" type="uma:MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="BaseConfiguration" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPluginSelection" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodPackageSelection" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="DefaultView" type="xsd:string" minOccurs="0"/>
-					<xsd:element name="ProcessView" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="SubtractedCategory" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="AddedCategory" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodConfiguration" type="uma:MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element name="MethodPlugin" type="uma:MethodPlugin" minOccurs="0" maxOccurs="unbounded"/>
-					<xsd:element name="MethodConfiguration" type="uma:MethodConfiguration" minOccurs="0" maxOccurs="unbounded"/>
-				</xsd:sequence>
-				<xsd:attribute name="tool" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The tool that generated the XML file.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodLibrary" type="uma:MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-</xsd:schema>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.ecore b/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.ecore
deleted file mode 100644
index 6259dec..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.ecore
+++ /dev/null
@@ -1,2863 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="uma"
-    nsURI="http://www.eclipse.org/epf/uma/1.0.3" nsPrefix="uma">
-  <eClassifiers xsi:type="ecore:EClass" name="Activity" eSuperTypes="#//WorkBreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.&#xD;&#xA;Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Activity"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="precondition" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Precondition"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="postcondition" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Postcondition"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="breakdownElement" upperBound="-1"
-        eType="#//BreakdownElement" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BreakdownElement"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="checklist" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Checklist"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="concept" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Concept"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="example" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Example"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="guideline" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Guideline"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="roadmap" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Roadmap"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reusableAsset" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ReusableAsset"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="supportingMaterial" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SupportingMaterial"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="whitepaper" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Whitepaper"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEnactable" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="IsEnactable"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityBasedOnElement"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="variabilityBasedOnElement"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityType" unique="false"
-        eType="#//VariabilityType" defaultValueLiteral="na" unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="variabilityType"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActivityDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Breakdown Element Description that is used to store the textual description for an Activity."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ActivityDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Alternatives"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="howToStaff" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="HowToStaff"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Purpose"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Artifact" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.&#xD;&#xA;Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might &quot;own&quot; a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Artifact"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group3" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:28"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="containedArtifact" upperBound="-1"
-        eType="#//Artifact" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ContainedArtifact"/>
-        <details key="group" value="#group:28"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ArtifactDescription" eSuperTypes="#//WorkProductDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Work Product Description that is used to store the textual description for an Artifact."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ArtifactDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefOutline" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BriefOutline"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="representationOptions"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RepresentationOptions"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="representation" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Representation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="notation" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Notation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElement" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BreakdownElement"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentedAfter" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PresentedAfter"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentedBefore" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PresentedBefore"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="planningData" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PlanningData"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="superActivity" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SuperActivity"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="hasMultipleOccurrences"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as &quot;Detail Use Case&quot; would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="hasMultipleOccurrences"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOptional" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="isOptional"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isPlanned" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.&#xD;&#xA;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="isPlanned"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="prefix" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. &quot;SRA.Establish Requirements&quot; with SRA indicating that this Activity belongs to the &quot;Software Requirements Analysis&quot; module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, &quot;Customer.Architect&quot; would define a &quot;Customer&quot; prefix for the Role Descriptor &quot;Architect&quot; expressing that this is an architect on the customer side and not the development team side."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BreakdownElementDescription" eSuperTypes="#//ContentDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Content Description that is used to store the textual description for a Breakdown Element."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="BreakdownElementDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageGuidance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="usageGuidance"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CapabilityPattern" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.&#xD;&#xA;A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:&#xD;&#xA;- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.&#xD;&#xA;- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).&#xD;&#xA;- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CapabilityPattern"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Checklist" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Checklist"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CompositeRole" eSuperTypes="#//RoleDescriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.&#xD;&#xA;A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CompositeRole"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group1" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="aggregatedRole" upperBound="-1"
-        eType="#//Role" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AggregatedRole"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Concept" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Concept"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Constraint" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Constraint"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mainDescription" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Stores the main definition of the constraint."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="mainDescription"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentCategory" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An abstract class generalizing content category types."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ContentCategory"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentCategoryPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Method Package that only contains Content Category Elements."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ContentCategoryPackage"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentCategory" upperBound="-1"
-        eType="#//ContentCategory" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ContentCategory"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentDescription" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ContentDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mainDescription" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Stores the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading)."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MainDescription"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="keyConsiderations" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="KeyConsiderations"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="section" upperBound="-1"
-        eType="#//Section" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Section"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalId" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="An external visible number that is used to reference this artifact. Used like a synonym."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="externalId"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentElement" eSuperTypes="#//DescribableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.&#xD;&#xA;Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ContentElement"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group1" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="checklist" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Checklist"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="concept" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Concept"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="example" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Example"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="guideline" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Guideline"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reusableAsset" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ReusableAsset"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="supportingMaterial" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SupportingMaterial"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="whitepaper" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Whitepaper"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityBasedOnElement"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="variabilityBasedOnElement"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityType" unique="false"
-        eType="#//VariabilityType" defaultValueLiteral="na" unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="variabilityType"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ContentPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ContentPackage"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="contentElement" upperBound="-1"
-        eType="#//ContentElement" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ContentElement"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="CustomCategory" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a &quot;Testing&quot; category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="CustomCategory"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="categorizedElement" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CategorizedElement"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="subCategory" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubCategory"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Deliverable" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Deliverable"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group3" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:28"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="deliveredWorkProduct" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DeliveredWorkProduct"/>
-        <details key="group" value="#group:28"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliverableDescription" eSuperTypes="#//WorkProductDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Work Product Description that is used to store the textual description for a Deliverable."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DeliverableDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalDescription" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExternalDescription"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="packagingGuidance" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PackagingGuidance"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcess" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.&#xD;&#xA;A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DeliveryProcess"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group3" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:44"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="communicationsMaterial"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="CommunicationsMaterial"/>
-        <details key="group" value="#group:44"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="educationMaterial" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EducationMaterial"/>
-        <details key="group" value="#group:44"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DeliveryProcessDescription" eSuperTypes="#//ProcessDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Process Description that is used to store the textual description for a Delivery Process."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DeliveryProcessDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scale" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Scale"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectCharacteristics"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Characterizes the project that would typically perform this Process"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ProjectCharacteristics"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="riskLevel" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines typical project risks that are addressed with this process."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RiskLevel"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimatingTechnique" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the Estimation Techniques provided for this Process."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EstimatingTechnique"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="projectMemberExpertise"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ProjectMemberExpertise"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="typeOfContract" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides background information about the coI'm chaI'm ntracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement)."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="TypeOfContract"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescribableElement" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.&#xD;&#xA;This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance.  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DescribableElement"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="presentation" eType="#//ContentDescription"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Presentation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nodeicon" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used in tree browser presentations and breakdown structures."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="nodeicon"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="presentationName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to &quot;rup_architecture_document&quot; to differentiate from a &quot;j2ee_architcture_document&quot; whereas the external presentation would always be &quot;Architecture Document&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="presentationName"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="shapeicon" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="shapeicon"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Descriptor" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.&#xD;&#xA;Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Descriptor"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSynchronizedWithSource"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="isSynchronizedWithSource"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescriptorDescription" eSuperTypes="#//BreakdownElementDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Breakdown Element Description that is used to store the textual description for a Descriptor."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DescriptorDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="refinedDescription" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RefinedDescription"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Discipline" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.&#xD;&#xA;A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Discipline"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="task" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String" volatile="true"
-        transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Task"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subDiscipline" upperBound="-1"
-        eType="#//Discipline" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubDiscipline"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="referenceWorkflow" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ReferenceWorkflow"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisciplineGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Used to group Disciplines.  For example, the Discipline Grouping &quot;Software Disciplines&quot; would be the group of all disciplines related to developing software such as &quot;Requirements Management&quot; or &quot;Testing&quot;; &quot;IT Infrastructure Management&quot; would be a Disciplines Grouping for disciplines such as &quot;IT Operational Services&quot;, &quot;IT Customer Relationships&quot;, or &quot;IT Enabling Services&quot;.  Disciplines can be associated to more than one Discipline Grouping."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="DisciplineGrouping"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="discipline" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Discipline"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value=""/>
-      <details key="kind" value="mixed"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="name" value=":mixed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns:prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xsi:schemaLocation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodConfiguration" upperBound="-2"
-        eType="#//MethodConfiguration" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodConfiguration"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodLibrary" upperBound="-2"
-        eType="#//MethodLibrary" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodLibrary"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPlugin" upperBound="-2"
-        eType="#//MethodPlugin" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.&#xD;&#xA;Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.&#xD;&#xA;Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodPlugin"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Domain" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.&#xD;&#xA;Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Domain"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workProduct" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkProduct"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subdomain" upperBound="-1"
-        eType="#//Domain" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Subdomain"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Element">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A UML 2.0 meta-class Element."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Element"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Estimate" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of Guidance that provides sizing measures, or standards for sizing the work effort associated with performing a particular piece of work and instructions for their successful use. It may be comprised of estimation considerations and estimation metrics."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Estimate"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimationMetric" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EstimationMetric"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimationConsiderations"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EstimationConsiderations"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EstimatingMetric" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of Guidance that describes a metric or measure that is associated with an element and which is used to calculate the size of the work effort as well as a range of potential labor."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EstimatingMetric"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="EstimationConsiderations" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of Guidance that qualifies the usage and application of estimation metrics in the development of an actual estimate."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="EstimationConsiderations"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Example" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Example"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guidance" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Guidance"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="GuidanceDescription" eSuperTypes="#//ContentDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Content Description that is used to store the textual description for a Guidance."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="GuidanceDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="attachment" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Attachment"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Guideline" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Guideline"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Iteration" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)"/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Iteration"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodConfiguration" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MethodConfiguration"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="baseConfiguration" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BaseConfiguration"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="methodPluginSelection"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodPluginSelection"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="methodPackageSelection"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodPackageSelection"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultView" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultView"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="processView" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ProcessView"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="subtractedCategory" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubtractedCategory"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="addedCategory" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AddedCategory"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodElement" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="The root generalization for all UMA Method Elements.  Defines a common set of attributes inherited by all UMA Method Elements.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MethodElement"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:1"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ownedRule" upperBound="-1"
-        eType="#//Constraint" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the packaging rules for this Method Element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OwnedRule"/>
-        <details key="group" value="#group:1"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodElementProperty"
-        upperBound="-1" eType="#//MethodElementProperty" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodElementProperty"/>
-        <details key="group" value="#group:1"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="briefDescription" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element shall be briefly described with one or two sentences summarizing the element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="briefDescription"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every instance of Method Element has a global unique id."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="orderingGuide" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="orderingGuide"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="suppressed" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If a Variability Element is derived from another Variability Element using the &quot;extends&quot; Variability Specialization, then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="suppressed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodElementProperty" eSuperTypes="#//PackageableElement">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MethodElementProperty"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="value"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodLibrary" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MethodLibrary"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPlugin" upperBound="-1"
-        eType="#//MethodPlugin" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodPlugin"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodConfiguration" upperBound="-1"
-        eType="#//MethodConfiguration" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodConfiguration"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="tool" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The tool that generated the XML file."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="tool"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPackage" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MethodPackage"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group1" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:8"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reusedPackage" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ReusedPackage"/>
-        <details key="group" value="#group:8"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackage" upperBound="-1"
-        eType="#//MethodPackage" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodPackage"/>
-        <details key="group" value="#group:8"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="global" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="global"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodPlugin" eSuperTypes="#//MethodUnit">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.&#xD;&#xA;Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.&#xD;&#xA;Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MethodPlugin"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="referencedMethodPlugin"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ReferencedMethodPlugin"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="methodPackage" upperBound="-1"
-        eType="#//MethodPackage" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MethodPackage"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="userChangeable" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="userChangeable"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MethodUnit" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Method Element that shall be maintained in a Method Library as a separate unit of control."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="MethodUnit"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="copyright" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Copyright"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="authors" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Method Unit is being created and owned by an author or authoring team."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="authors"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date the last change that resulted into this version has been made."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="changeDate"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDescription" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the last change that resulted into this version."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="changeDescription"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Package has a version number used to track changes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="version"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Milestone" eSuperTypes="#//WorkBreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Breakdown Element that describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure)."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Milestone"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NamedElement" eSuperTypes="#//Element">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A UML 2.0 meta-class Named Element."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="NamedElement"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="name"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Outcome" eSuperTypes="#//WorkProduct">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Work Product that describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Outcome"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PackageableElement" eSuperTypes="#//NamedElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A UML 2.0 meta-class Packagable Element."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="PackageableElement"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Phase" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.&#xD;&#xA;Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Phase"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PlanningData" eSuperTypes="#//ProcessElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Process Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.&#xD;&#xA;Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.&#xD;&#xA;(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)"/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="PlanningData"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="finishDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default finish date for a planed Task."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="finishDate"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="rank" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default rank for a planed Task."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="rank"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The default start date for a planed Task."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="startDate"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Practice" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of guidance that represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be &quot;Manage Risks&quot;, &quot;Continuously verify quality&quot;, &quot;Architecture-centric and component-based development&quot;, etc."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Practice"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityReference" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ActivityReference"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="contentReference" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ContentReference"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subPractice" upperBound="-1"
-        eType="#//Practice" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubPractice"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PracticeDescription" eSuperTypes="#//ContentDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Content Description that is used to store the textual description for a Practice."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="PracticeDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="additionalInfo" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional Information not covered by the other attributes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AdditionalInfo"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="application" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes how the Practice is being applied or introduced into the context described in background."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Application"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="background" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Background"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="goals" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A summary of the overall goals to be addressed by the Practice."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Goals"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="levelsOfAdoption" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="LevelsOfAdoption"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="problem" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="A description of the problem the Practice addresses."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Problem"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Process" eSuperTypes="#//Activity">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.&#xD;&#xA;Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed)."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Process"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="includesPattern" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="IncludesPattern"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultContext" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DefaultContext"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="validContext" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ValidContext"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="diagramURI" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The URI of the diagram file associated with the process."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="diagramURI"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponent" eSuperTypes="#//ProcessPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).&#xD;&#xA;UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a &quot;black box&quot;.  At any point during a project the component &quot;realization&quot; detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ProcessComponent"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="copyright" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Copyright"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interface" eType="#//ProcessComponentInterface"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Interface"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="process" lowerBound="1"
-        eType="#//Process" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Process"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="authors" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Method Unit is being created and owned by an author or authoring team."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="authors"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDate" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//DateTime">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The date the last change that resulted into this version has been made."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="changeDate"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeDescription" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The description of the last change that resulted into this version."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="changeDescription"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Package has a version number used to track changes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="version"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessComponentInterface" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ProcessComponentInterface"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group1" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceSpecification"
-        upperBound="-1" eType="#//TaskDescriptor" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="InterfaceSpecification"/>
-        <details key="group" value="#group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="interfaceIO" upperBound="-1"
-        eType="#//WorkProductDescriptor" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="InterfaceIO"/>
-        <details key="group" value="#group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessDescription" eSuperTypes="#//ActivityDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Activity Description that is used to store the textual description for a Process."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ProcessDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="scope" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines the scope of the Process, i.e. which types of projects does it address and which not."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Scope"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usageNotes" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Any additional notes on how to apply and instantiate this process for a project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="UsageNotes"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessElement" eSuperTypes="#//DescribableElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Describable Element that represents an abstract generalization for all elements defined in the Process package.&#xD;&#xA;Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. "/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ProcessElement"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPackage" eSuperTypes="#//MethodPackage">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Method Package that contains Process Elements, only.&#xD;&#xA;A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ProcessPackage"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="processElement" upperBound="-1"
-        eType="#//ProcessElement" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ProcessElement"/>
-        <details key="group" value="#group:12"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ProcessPlanningTemplate" eSuperTypes="#//Process">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).&#xD;&#xA;A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ProcessPlanningTemplate"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group3" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:44"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="baseProcess" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="BaseProcess"/>
-        <details key="group" value="#group:44"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Report" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Report"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReusableAsset" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of guidance that provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing&#xD;&#xA;how the asset should be used."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ReusableAsset"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Roadmap" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of Guidance which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.&#xD;&#xA;An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Roadmap"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Role" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Content Element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  &#xD;&#xA;A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Role"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="responsibleFor" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResponsibleFor"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescription" eSuperTypes="#//ContentDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Content Description that is used to store the textual description for a Role."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RoleDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="assignmentApproaches" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AssignmentApproaches"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="skills" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists of set of required skills a person needs to possess to fulfill that Role."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Skills"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="synonyms" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Synonyms"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Descriptor that represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RoleDescriptor"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="role" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Role"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="responsibleFor" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResponsibleFor"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSet" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the &quot;Analysts&quot; Role Set could group the &quot;Business Process Analyst&quot;, &quot;System Analyst&quot;, as well as &quot;Requirements Specifier&quot; roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on)."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RoleSet"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="role" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String" volatile="true"
-        transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Role"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RoleSetGrouping" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="RoleSetGrouping"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="roleSet" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="RoleSet"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Section" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Section"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="subSection" eType="#//Section"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubSection"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="predecessor" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Predecessor"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attributes store the description text for a Content Description's Section."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Description"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionName" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="sectionName"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityBasedOnElement"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="variabilityBasedOnElement"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="variabilityType" unique="false"
-        eType="#//VariabilityType" defaultValueLiteral="na" unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="variabilityType"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SupportingMaterial" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="SupportingMaterial"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Task" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Content Element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.&#xD;&#xA;A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). &#xD;&#xA;A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. &#xD;&#xA;For example, a Task such as &quot;Develop Use Case Model&quot; describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the &quot;method&quot; of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Task"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="precondition" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Precondition"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="postcondition" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Postcondition"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="performedBy" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PerformedBy"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mandatoryInput" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MandatoryInput"/>
-        <details key="group" value="#group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="output" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Output"/>
-        <details key="group" value="#group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="additionallyPerformedBy"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AdditionallyPerformedBy"/>
-        <details key="group" value="#group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="optionalInput" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OptionalInput"/>
-        <details key="group" value="#group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimate" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Estimate"/>
-        <details key="group" value="#group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimationConsiderations"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EstimationConsiderations"/>
-        <details key="group" value="#group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="toolMentor" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ToolMentor"/>
-        <details key="group" value="#group:25"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescription" eSuperTypes="#//ContentDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Content Description that is used to store the textual description for a Task."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TaskDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="alternatives" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Alternatives"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Summarizes the main reason for performing this Task and what is intended to be achieved."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Purpose"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TaskDescriptor" eSuperTypes="#//WorkBreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Descriptor that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.&#xD;&#xA;A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.&#xD;&#xA;"/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TaskDescriptor"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="task" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Task"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="performedPrimarilyBy" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="PerformedPrimarilyBy"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="additionallyPerformedBy"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AdditionallyPerformedBy"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="assistedBy" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="AssistedBy"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalInput" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExternalInput"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mandatoryInput" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MandatoryInput"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="optionalInput" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OptionalInput"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="output" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Output"/>
-        <details key="group" value="#group:27"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="step" upperBound="-1" eType="#//Section"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Step"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isSynchronizedWithSource"
-        unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="isSynchronizedWithSource"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TeamProfile" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.&#xD;&#xA;Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).&#xD;&#xA;Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TeamProfile"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group1" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="role" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String" volatile="true"
-        transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Role"/>
-        <details key="group" value="#group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="superTeam" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SuperTeam"/>
-        <details key="group" value="#group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="subTeam" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="SubTeam"/>
-        <details key="group" value="#group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Template" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Template"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TermDefinition" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A specific type of guidance that defines concepts and are used to build up the Glossary. TermDefinitions are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="TermDefinition"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Tool" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Tool"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="toolMentor" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ToolMentor"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ToolMentor" eSuperTypes="#//Guidance">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A  specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ToolMentor"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="VariabilityType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="VariabilityType"/>
-    </eAnnotations>
-    <eLiterals name="na"/>
-    <eLiterals name="contributes" value="1"/>
-    <eLiterals name="extends" value="2"/>
-    <eLiterals name="replaces" value="3"/>
-    <eLiterals name="localContribution" value="4"/>
-    <eLiterals name="localReplacement" value="5"/>
-    <eLiterals name="extendsReplaces" value="6"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="VariabilityTypeObject" instanceClassName="org.eclipse.emf.common.util.Enumerator">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="VariabilityType:Object"/>
-      <details key="baseType" value="VariabilityType"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Whitepaper" eSuperTypes="#//Concept">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="Whitepaper"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkBreakdownElement" eSuperTypes="#//BreakdownElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkBreakdownElement"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group1" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="predecessor" upperBound="-1"
-        eType="#//WorkOrder" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Predecessor"/>
-        <details key="group" value="#group:20"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isEventDriven" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.&#xD;&#xA;"/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="isEventDriven"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isOngoing" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="isOngoing"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="isRepeatable" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"
-        unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task)."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="isRepeatable"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkDefinition" eSuperTypes="#//MethodElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.&#xD;&#xA;Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration)."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkDefinition"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="precondition" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Precondition"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="postcondition" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Postcondition"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkOrder">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  &#xD;&#xA;The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkOrder"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Defines a global unique id for a work order."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="linkType" unique="false"
-        eType="#//WorkOrderType" defaultValueLiteral="finishToStart" unsettable="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="linkType"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="WorkOrderType">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="Represents a relationship between two Breakdown Element in which one Breakdown Element depends on the start or finish of another Breakdown Element in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkOrderType"/>
-    </eAnnotations>
-    <eLiterals name="finishToStart"/>
-    <eLiterals name="finishToFinish" value="1"/>
-    <eLiterals name="startToStart" value="2"/>
-    <eLiterals name="startToFinish" value="3"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EDataType" name="WorkOrderTypeObject" instanceClassName="org.eclipse.emf.common.util.Enumerator">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkOrderType:Object"/>
-      <details key="baseType" value="WorkOrderType"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProduct" eSuperTypes="#//ContentElement">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="An abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.&#xD;&#xA;A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkProduct"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimate" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Estimate"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="estimationConsiderations"
-        unique="false" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="EstimationConsiderations"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="report" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Report"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="template" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Template"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="toolMentor" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ToolMentor"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescription" eSuperTypes="#//ContentDescription">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A generalized Content Description that is used to store the textual description for a Work Product."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkProductDescription"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="impactOfNotHaving" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ImpactOfNotHaving"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="purpose" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes why the work product is produced and to what use it will be put."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Purpose"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reasonsForNotNeeding" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ReasonsForNotNeeding"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductDescriptor" eSuperTypes="#//Descriptor">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A special Descriptor that represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkProductDescriptor"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workProduct" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkProduct"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="responsibleRole" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ResponsibleRole"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group1" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="externalInputTo" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ExternalInputTo"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="impactedBy" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ImpactedBy"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="impacts" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="Impacts"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mandatoryInputTo" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="MandatoryInputTo"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="optionalInputTo" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OptionalInputTo"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="outputFrom" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="OutputFrom"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="deliverableParts" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="DeliverableParts"/>
-        <details key="group" value="#group:23"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityEntryState" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  &#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="activityEntryState"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="activityExitState" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).&#xD;&#xA;For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested]."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="activityExitState"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="WorkProductType" eSuperTypes="#//ContentCategory">
-    <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-      <details key="documentation" value="A second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is &quot;Class Diagram&quot;, which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or &quot;Specification&quot;, which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type."/>
-    </eAnnotations>
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="WorkProductType"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="group2" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="group"/>
-        <details key="name" value="group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="workProduct" unique="false"
-        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        volatile="true" transient="true" derived="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="WorkProduct"/>
-        <details key="group" value="#group:22"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.genmodel b/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.genmodel
deleted file mode 100644
index c724fac..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.genmodel
+++ /dev/null
@@ -1,416 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.epf.xml.uma/src"
-    editDirectory="/org.eclipse.epf.xml.uma.edit/src" editorDirectory="/org.eclipse.epf.xml.uma.editor/src"
-    modelPluginID="org.eclipse.epf.xml.uma" templateDirectory="" modelName="UMA" editPluginClass="org.eclipse.epf.xml.uma.edit.UMAEditPlugin"
-    editorPluginClass="org.eclipse.epf.xml.uma.editor.UMAEditorPlugin" rootExtendsInterface="org.eclipse.emf.ecore.sdo.EDataObject"
-    rootExtendsClass="org.eclipse.emf.ecore.sdo.impl.EDataObjectImpl" rootImplementsInterface=""
-    testSuiteClass="org.eclipse.epf.xml.uma.tests.UMAAllTests" importerID="org.eclipse.xsd.ecore.importer">
-  <foreignModel>EPF_Schema_200704031425.xsd</foreignModel>
-  <genPackages prefix="Uma" basePackage="org.eclipse.epf.xml" resource="XML" disposableProviderFactory="true"
-      ecorePackage="UMA.ecore#/">
-    <genEnums ecoreEnum="UMA.ecore#//VariabilityType">
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//VariabilityType/na"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//VariabilityType/contributes"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//VariabilityType/extends"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//VariabilityType/replaces"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//VariabilityType/localContribution"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//VariabilityType/localReplacement"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//VariabilityType/extendsReplaces"/>
-    </genEnums>
-    <genEnums ecoreEnum="UMA.ecore#//WorkOrderType">
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//WorkOrderType/finishToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//WorkOrderType/finishToFinish"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//WorkOrderType/startToStart"/>
-      <genEnumLiterals ecoreEnumLiteral="UMA.ecore#//WorkOrderType/startToFinish"/>
-    </genEnums>
-    <genDataTypes ecoreDataType="UMA.ecore#//VariabilityTypeObject"/>
-    <genDataTypes ecoreDataType="UMA.ecore#//WorkOrderTypeObject"/>
-    <genClasses ecoreClass="UMA.ecore#//Activity">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/precondition"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/postcondition"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/group2"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//Activity/breakdownElement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/checklist"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/concept"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/example"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/guideline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/roadmap"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/reusableAsset"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/supportingMaterial"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/whitepaper"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/isEnactable"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/variabilityBasedOnElement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Activity/variabilityType"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ActivityDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ActivityDescription/alternatives"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ActivityDescription/howToStaff"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ActivityDescription/purpose"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Artifact">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Artifact/group3"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//Artifact/containedArtifact"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ArtifactDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ArtifactDescription/briefOutline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ArtifactDescription/representationOptions"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ArtifactDescription/representation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ArtifactDescription/notation"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//BreakdownElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/presentedAfter"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/presentedBefore"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/planningData"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/superActivity"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/hasMultipleOccurrences"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/isOptional"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/isPlanned"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElement/prefix"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//BreakdownElementDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//BreakdownElementDescription/usageGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//CapabilityPattern"/>
-    <genClasses ecoreClass="UMA.ecore#//Checklist"/>
-    <genClasses ecoreClass="UMA.ecore#//CompositeRole">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//CompositeRole/group1"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//CompositeRole/aggregatedRole"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Concept"/>
-    <genClasses ecoreClass="UMA.ecore#//Constraint">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Constraint/mainDescription"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ContentCategory"/>
-    <genClasses ecoreClass="UMA.ecore#//ContentCategoryPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentCategoryPackage/group2"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//ContentCategoryPackage/contentCategory"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ContentDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentDescription/mainDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentDescription/keyConsiderations"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//ContentDescription/section"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentDescription/externalId"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ContentElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/group1"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/checklist"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/concept"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/example"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/guideline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/reusableAsset"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/supportingMaterial"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/whitepaper"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/variabilityBasedOnElement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentElement/variabilityType"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ContentPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//ContentPackage/group2"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//ContentPackage/contentElement"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//CustomCategory">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//CustomCategory/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//CustomCategory/categorizedElement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//CustomCategory/subCategory"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Deliverable">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Deliverable/group3"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Deliverable/deliveredWorkProduct"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//DeliverableDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliverableDescription/externalDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliverableDescription/packagingGuidance"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//DeliveryProcess">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcess/group3"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcess/communicationsMaterial"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcess/educationMaterial"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//DeliveryProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcessDescription/scale"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcessDescription/projectCharacteristics"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcessDescription/riskLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcessDescription/estimatingTechnique"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcessDescription/projectMemberExpertise"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DeliveryProcessDescription/typeOfContract"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//DescribableElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//DescribableElement/presentation"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DescribableElement/nodeicon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DescribableElement/presentationName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DescribableElement/shapeicon"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Descriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Descriptor/isSynchronizedWithSource"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//DescriptorDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DescriptorDescription/refinedDescription"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Discipline">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Discipline/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Discipline/task"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//Discipline/subDiscipline"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Discipline/referenceWorkflow"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//DisciplineGrouping">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//DisciplineGrouping/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//DisciplineGrouping/discipline"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//DocumentRoot">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//DocumentRoot/mixed"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//DocumentRoot/xMLNSPrefixMap"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//DocumentRoot/xSISchemaLocation"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//DocumentRoot/methodConfiguration"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//DocumentRoot/methodLibrary"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//DocumentRoot/methodPlugin"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Domain">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Domain/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Domain/workProduct"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//Domain/subdomain"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Element"/>
-    <genClasses ecoreClass="UMA.ecore#//Estimate">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Estimate/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Estimate/estimationMetric"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Estimate/estimationConsiderations"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//EstimatingMetric"/>
-    <genClasses ecoreClass="UMA.ecore#//EstimationConsiderations"/>
-    <genClasses ecoreClass="UMA.ecore#//Example"/>
-    <genClasses ecoreClass="UMA.ecore#//Guidance"/>
-    <genClasses ecoreClass="UMA.ecore#//GuidanceDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//GuidanceDescription/attachment"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Guideline"/>
-    <genClasses ecoreClass="UMA.ecore#//Iteration"/>
-    <genClasses ecoreClass="UMA.ecore#//MethodConfiguration">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodConfiguration/baseConfiguration"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodConfiguration/methodPluginSelection"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodConfiguration/methodPackageSelection"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodConfiguration/defaultView"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodConfiguration/processView"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodConfiguration/subtractedCategory"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodConfiguration/addedCategory"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//MethodElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodElement/group"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//MethodElement/ownedRule"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//MethodElement/methodElementProperty"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodElement/briefDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodElement/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodElement/orderingGuide"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodElement/suppressed"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//MethodElementProperty">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodElementProperty/value"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//MethodLibrary">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//MethodLibrary/methodPlugin"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//MethodLibrary/methodConfiguration"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodLibrary/tool"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//MethodPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodPackage/group1"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodPackage/reusedPackage"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//MethodPackage/methodPackage"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodPackage/global"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//MethodPlugin">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodPlugin/referencedMethodPlugin"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//MethodPlugin/methodPackage"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodPlugin/userChangeable"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//MethodUnit">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodUnit/copyright"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodUnit/authors"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodUnit/changeDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodUnit/changeDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//MethodUnit/version"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Milestone"/>
-    <genClasses ecoreClass="UMA.ecore#//NamedElement">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//NamedElement/name"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Outcome"/>
-    <genClasses ecoreClass="UMA.ecore#//PackageableElement"/>
-    <genClasses ecoreClass="UMA.ecore#//Phase"/>
-    <genClasses ecoreClass="UMA.ecore#//PlanningData">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PlanningData/finishDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PlanningData/rank"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PlanningData/startDate"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Practice">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Practice/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Practice/activityReference"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Practice/contentReference"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//Practice/subPractice"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//PracticeDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PracticeDescription/additionalInfo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PracticeDescription/application"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PracticeDescription/background"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PracticeDescription/goals"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PracticeDescription/levelsOfAdoption"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//PracticeDescription/problem"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Process">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Process/includesPattern"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Process/defaultContext"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Process/validContext"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Process/diagramURI"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ProcessComponent">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessComponent/copyright"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//ProcessComponent/interface"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//ProcessComponent/process"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessComponent/authors"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessComponent/changeDate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessComponent/changeDescription"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessComponent/version"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ProcessComponentInterface">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessComponentInterface/group1"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//ProcessComponentInterface/interfaceSpecification"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//ProcessComponentInterface/interfaceIO"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ProcessDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessDescription/scope"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessDescription/usageNotes"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ProcessElement"/>
-    <genClasses ecoreClass="UMA.ecore#//ProcessPackage">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessPackage/group2"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//ProcessPackage/processElement"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ProcessPlanningTemplate">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessPlanningTemplate/group3"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//ProcessPlanningTemplate/baseProcess"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Report"/>
-    <genClasses ecoreClass="UMA.ecore#//ReusableAsset"/>
-    <genClasses ecoreClass="UMA.ecore#//Roadmap"/>
-    <genClasses ecoreClass="UMA.ecore#//Role">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Role/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Role/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//RoleDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleDescription/assignmentApproaches"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleDescription/skills"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleDescription/synonyms"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//RoleDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleDescriptor/role"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleDescriptor/responsibleFor"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//RoleSet">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleSet/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleSet/role"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//RoleSetGrouping">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleSetGrouping/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//RoleSetGrouping/roleSet"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Section">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//Section/subSection"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Section/predecessor"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Section/description"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Section/sectionName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Section/variabilityBasedOnElement"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Section/variabilityType"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//SupportingMaterial"/>
-    <genClasses ecoreClass="UMA.ecore#//Task">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/precondition"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/postcondition"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/performedBy"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/mandatoryInput"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/output"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/additionallyPerformedBy"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/optionalInput"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/estimate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/estimationConsiderations"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Task/toolMentor"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//TaskDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescription/alternatives"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescription/purpose"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//TaskDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/task"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/performedPrimarilyBy"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/additionallyPerformedBy"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/assistedBy"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/externalInput"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/mandatoryInput"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/optionalInput"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/output"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference UMA.ecore#//TaskDescriptor/step"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TaskDescriptor/isSynchronizedWithSource"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//TeamProfile">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//TeamProfile/group1"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TeamProfile/role"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TeamProfile/superTeam"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//TeamProfile/subTeam"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//Template"/>
-    <genClasses ecoreClass="UMA.ecore#//TermDefinition"/>
-    <genClasses ecoreClass="UMA.ecore#//Tool">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//Tool/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//Tool/toolMentor"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//ToolMentor"/>
-    <genClasses ecoreClass="UMA.ecore#//Whitepaper"/>
-    <genClasses ecoreClass="UMA.ecore#//WorkBreakdownElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkBreakdownElement/group1"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference UMA.ecore#//WorkBreakdownElement/predecessor"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkBreakdownElement/isEventDriven"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkBreakdownElement/isOngoing"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkBreakdownElement/isRepeatable"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//WorkDefinition">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkDefinition/precondition"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkDefinition/postcondition"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//WorkOrder">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkOrder/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkOrder/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkOrder/linkType"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//WorkProduct">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProduct/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProduct/estimate"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProduct/estimationConsiderations"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProduct/report"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProduct/template"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProduct/toolMentor"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//WorkProductDescription">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescription/impactOfNotHaving"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescription/purpose"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescription/reasonsForNotNeeding"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//WorkProductDescriptor">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/workProduct"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/responsibleRole"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/group1"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/externalInputTo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/impactedBy"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/impacts"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/mandatoryInputTo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/optionalInputTo"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/outputFrom"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/deliverableParts"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/activityEntryState"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductDescriptor/activityExitState"/>
-    </genClasses>
-    <genClasses ecoreClass="UMA.ecore#//WorkProductType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductType/group2"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute UMA.ecore#//WorkProductType/workProduct"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.xsd b/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.xsd
deleted file mode 100644
index 8b8e87e..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/model/UMA.xsd
+++ /dev/null
@@ -1,1387 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- EPF UMA XML Data Interchange Schema -->
-<xsd:schema xmlns:uma="http://www.eclipse.org/epf/uma/1.0.3" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.eclipse.org/epf/uma/1.0.3">
-	<xsd:simpleType name="WorkOrderType">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Element in which one Breakdown Element depends on the start or finish of another Breakdown Element in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="finishToStart"/>
-			<xsd:enumeration value="finishToFinish"/>
-			<xsd:enumeration value="startToStart"/>
-			<xsd:enumeration value="startToFinish"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:simpleType name="VariabilityType">
-		<xsd:annotation>
-			<xsd:documentation>An Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:restriction base="xsd:NCName">
-			<xsd:enumeration value="na"/>
-			<xsd:enumeration value="contributes"/>
-			<xsd:enumeration value="extends"/>
-			<xsd:enumeration value="replaces"/>
-			<xsd:enumeration value="localContribution"/>
-			<xsd:enumeration value="localReplacement"/>
-		</xsd:restriction>
-	</xsd:simpleType>
-	<xsd:complexType name="Element">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Element.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:complexType>
-	<xsd:complexType name="NamedElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Named Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Element">
-				<xsd:attribute name="name" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PackageableElement">
-		<xsd:annotation>
-			<xsd:documentation>A UML 2.0 meta-class Packagable Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:NamedElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodElement">
-		<xsd:annotation>
-			<xsd:documentation>The root generalization for all UMA Method Elements.  Defines a common set of attributes inherited by all UMA Method Elements.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:PackageableElement">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="OwnedRule" type="uma:Constraint">
-						<xsd:annotation>
-							<xsd:documentation>Defines the packaging rules for this Method Element.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-				<xsd:attribute name="id" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element has a global unique id.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="briefDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="suppressed" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If a Variability Element is derived from another Variability Element using the "extends" Variability Specialization, then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="orderingGuide" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Constraint">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:attribute name="mainDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Stores the main definition of the constraint.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Section">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="SubSection" type="uma:Section"/>
-					<xsd:element minOccurs="0" name="Predecessor" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="Description" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>This attributes store the description text for a Content Description's Section.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="sectionName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodUnit">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Element that shall be maintained in a Method Library as a separate unit of control.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Copyright" type="xsd:string"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="MainDescription" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Stores the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="KeyConsiderations" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="Section" type="uma:Section"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="GuidanceDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Attachment" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PracticeDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Practice.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="AdditionalInfo" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Any additional Information not covered by the other attributes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Application" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Describes how the Practice is being applied or introduced into the context described in background.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Background" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Goals" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>A summary of the overall goals to be addressed by the Practice.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="LevelsOfAdoption" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Problem" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>A description of the problem the Practice addresses.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Work Product.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="ImpactOfNotHaving" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Purpose" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Describes why the work product is produced and to what use it will be put.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="ReasonsForNotNeeding" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="externalId" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>An external visible number that is used to reference this artifact. Used like a synonym.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ArtifactDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for an Artifact.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="BriefOutline" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="RepresentationOptions" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliverableDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Work Product Description that is used to store the textual description for a Deliverable.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProductDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="ExternalDescription" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="PackagingGuidance" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Role.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="AssignmentApproaches" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Skills" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Lists of set of required skills a person needs to possess to fulfill that Role.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Synonyms" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Alternatives" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Purpose" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Task and what is intended to be achieved.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescribableElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
-This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance.  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="Presentation" type="uma:ContentDescription"/>
-				</xsd:choice>
-				<xsd:attribute name="presentationName" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to "rup_architecture_document" to differentiate from a "j2ee_architcture_document" whereas the external presentation would always be "Architecture Document".</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="shapeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="nodeicon" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>A reference to an icon that can be used in tree browser presentations and breakdown structures.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
-Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement">
-				<xsd:sequence>
-					<xsd:choice maxOccurs="unbounded" minOccurs="0">
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guidance">
-		<xsd:annotation>
-			<xsd:documentation>Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Concept">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Checklist">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Example">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Guideline">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Estimate">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that provides sizing measures, or standards for sizing the work effort associated with performing a particular piece of work and instructions for their successful use. It may be comprised of estimation considerations and estimation metrics.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="EstimationMetric" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimatingMetric">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that describes a metric or measure that is associated with an element and which is used to calculate the size of the work effort as well as a range of potential labor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="EstimationConsiderations">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance that qualifies the usage and application of estimation metrics in the development of an actual estimate.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Roadmap">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of Guidance which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
-An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Report">
-		<xsd:annotation>
-			<xsd:documentation>A predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Template">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="SupportingMaterial">
-		<xsd:annotation>
-			<xsd:documentation>A catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ToolMentor">
-		<xsd:annotation>
-			<xsd:documentation>A  specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Whitepaper">
-		<xsd:annotation>
-			<xsd:documentation>A special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Concept"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TermDefinition">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that defines concepts and are used to build up the Glossary. TermDefinitions are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Practice">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be "Manage Risks", "Continuously verify quality", "Architecture-centric and component-based development", etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ActivityReference" type="xsd:string"/>
-					<xsd:element name="ContentReference" type="xsd:string"/>
-					<xsd:element name="SubPractice" type="uma:Practice"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ReusableAsset">
-		<xsd:annotation>
-			<xsd:documentation>A specific type of guidance that provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
-how the asset should be used.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Guidance"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProduct">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
-A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="Estimate" type="xsd:string"/>
-					<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-					<xsd:element name="Report" type="xsd:string"/>
-					<xsd:element name="Template" type="xsd:string"/>
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Artifact">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
-Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might "own" a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ContainedArtifact" type="uma:Artifact"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Deliverable">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="DeliveredWorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Outcome">
-		<xsd:annotation>
-			<xsd:documentation>A Work Product that describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkProduct"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Role">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
-A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ResponsibleFor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Task">
-		<xsd:annotation>
-			<xsd:documentation>A Content Element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
-A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
-A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
-For example, a Task such as "Develop Use Case Model" describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the "method" of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Precondition" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="Postcondition" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="PerformedBy" type="xsd:string"/>
-					<xsd:choice maxOccurs="unbounded" minOccurs="0">
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Estimate" type="xsd:string"/>
-						<xsd:element name="EstimationConsiderations" type="xsd:string"/>
-						<xsd:element name="ToolMentor" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkDefinition">
-		<xsd:annotation>
-			<xsd:documentation>An abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
-Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Precondition" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="Postcondition" type="xsd:string"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategory">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class generalizing content category types.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Discipline">
-		<xsd:annotation>
-			<xsd:documentation>A categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
-A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="Task" type="xsd:string"/>
-					<xsd:element name="SubDiscipline" type="uma:Discipline"/>
-					<xsd:element name="ReferenceWorkflow" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DisciplineGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Used to group Disciplines.  For example, the Discipline Grouping "Software Disciplines" would be the group of all disciplines related to developing software such as "Requirements Management" or "Testing"; "IT Infrastructure Management" would be a Disciplines Grouping for disciplines such as "IT Operational Services", "IT Customer Relationships", or "IT Enabling Services".  Disciplines can be associated to more than one Discipline Grouping.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="Discipline" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Domain">
-		<xsd:annotation>
-			<xsd:documentation>A refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
-Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-					<xsd:element name="Subdomain" type="uma:Domain"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSet">
-		<xsd:annotation>
-			<xsd:documentation>Organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the "Analysts" Role Set could group the "Business Process Analyst", "System Analyst", as well as "Requirements Specifier" roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="Role" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleSetGrouping">
-		<xsd:annotation>
-			<xsd:documentation>Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="RoleSet" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Tool">
-		<xsd:annotation>
-			<xsd:documentation>A container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ToolMentor" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductType">
-		<xsd:annotation>
-			<xsd:documentation>A second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is "Class Diagram", which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or "Specification", which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="WorkProduct" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CustomCategory">
-		<xsd:annotation>
-			<xsd:documentation>A category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a "Testing" category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentCategory">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="CategorizedElement" type="xsd:string"/>
-					<xsd:element name="SubCategory" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPackage">
-		<xsd:annotation>
-			<xsd:documentation>An abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodElement">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ReusedPackage" type="xsd:string"/>
-					<xsd:element name="MethodPackage" type="uma:MethodPackage"/>
-				</xsd:choice>
-				<xsd:attribute name="global" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ContentElement" type="uma:ContentElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ContentCategoryPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that only contains Content Category Elements.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ContentCategory" type="uma:ContentCategory"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessElement">
-		<xsd:annotation>
-			<xsd:documentation>A Describable Element that represents an abstract generalization for all elements defined in the Process package.
-Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:DescribableElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="PlanningData">
-		<xsd:annotation>
-			<xsd:documentation>A Process Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
-Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
-(NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:attribute name="startDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default start date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="finishDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The default finish date for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="rank" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The default rank for a planed Task.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessElement">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="PresentedAfter" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="PresentedBefore" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="PlanningData" type="xsd:string"/>
-					<xsd:element name="SuperActivity" type="xsd:string"/>
-				</xsd:sequence>
-				<xsd:attribute name="prefix" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. "SRA.Establish Requirements" with SRA indicating that this Activity belongs to the "Software Requirements Analysis" module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, "Customer.Architect" would define a "Customer" prefix for the Role Descriptor "Architect" expressing that this is an architect on the customer side and not the development team side.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isPlanned" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="hasMultipleOccurrences" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as "Detail Use Case" would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOptional" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>Indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkOrder">
-		<xsd:annotation>
-			<xsd:documentation>Represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
-The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:simpleContent>
-			<xsd:extension base="xsd:string">
-				<xsd:attribute name="linkType" type="uma:WorkOrderType">
-					<xsd:annotation>
-						<xsd:documentation>This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:simpleContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkBreakdownElement">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="Predecessor" type="uma:WorkOrder"/>
-				</xsd:choice>
-				<xsd:attribute name="isRepeatable" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isOngoing" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="isEventDriven" type="xsd:boolean">
-					<xsd:annotation>
-						<xsd:documentation>The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Milestone">
-		<xsd:annotation>
-			<xsd:documentation>A special Breakdown Element that describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Activity">
-		<xsd:annotation>
-			<xsd:documentation>A Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
-Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Precondition" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="Postcondition" type="xsd:string"/>
-					<xsd:choice maxOccurs="unbounded" minOccurs="0">
-						<xsd:element name="BreakdownElement" type="uma:BreakdownElement"/>
-						<xsd:element name="Checklist" type="xsd:string"/>
-						<xsd:element name="Concept" type="xsd:string"/>
-						<xsd:element name="Example" type="xsd:string"/>
-						<xsd:element name="Guideline" type="xsd:string"/>
-						<xsd:element name="Roadmap" type="xsd:string"/>
-						<xsd:element name="ReusableAsset" type="xsd:string"/>
-						<xsd:element name="SupportingMaterial" type="xsd:string"/>
-						<xsd:element name="Whitepaper" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="variabilityType" type="uma:VariabilityType"/>
-				<xsd:attribute name="variabilityBasedOnElement" type="xsd:string"/>
-				<xsd:attribute name="IsEnactable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Phase">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Iteration">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
-Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="BreakdownElementDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Content Description that is used to store the textual description for a Breakdown Element.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ContentDescription">
-				<xsd:attribute name="usageGuidance" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ActivityDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for an Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Alternatives" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="HowToStaff" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="Purpose" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DescriptorDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Breakdown Element Description that is used to store the textual description for a Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElementDescription">
-				<xsd:choice minOccurs="0">
-					<xsd:element name="RefinedDescription" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. </xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Activity Description that is used to store the textual description for a Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ActivityDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Scope" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Defines the scope of the Process, i.e. which types of projects does it address and which not.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="UsageNotes" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Any additional notes on how to apply and instantiate this process for a project.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-				<xsd:attribute name="externalId" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>An external visible number that is used to reference this delivery patterns and models. It is used like a synonym.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcessDescription">
-		<xsd:annotation>
-			<xsd:documentation>A generalized Process Description that is used to store the textual description for a Delivery Process.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessDescription">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Scale" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="ProjectCharacteristics" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Characterizes the project that would typically perform this Process</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="RiskLevel" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Outlines typical project risks that are addressed with this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="EstimatingTechnique" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Describes the Estimation Techniques provided for this Process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="ProjectMemberExpertise" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-					<xsd:element minOccurs="0" name="TypeOfContract" type="xsd:string">
-						<xsd:annotation>
-							<xsd:documentation>Provides background information about the coI'm chaI'm ntracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).</xsd:documentation>
-						</xsd:annotation>
-					</xsd:element>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Descriptor">
-		<xsd:annotation>
-			<xsd:documentation>An abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
-Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. </xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="WorkProductDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="WorkProduct" type="xsd:string"/>
-					<xsd:choice maxOccurs="unbounded" minOccurs="0">
-						<xsd:element name="ImpactedBy" type="xsd:string"/>
-						<xsd:element name="Impacts" type="xsd:string"/>
-						<xsd:element name="DeliverableParts" type="xsd:string"/>
-					</xsd:choice>
-				</xsd:sequence>
-				<xsd:attribute name="activityEntryState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="activityExitState" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="RoleDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Descriptor">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Role" type="xsd:string"/>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="ResponsibleFor" type="xsd:string"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TaskDescriptor">
-		<xsd:annotation>
-			<xsd:documentation>A special Descriptor that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
-A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
-</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:WorkBreakdownElement">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Task" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="PerformedPrimarilyBy" type="xsd:string"/>
-					<xsd:choice maxOccurs="unbounded" minOccurs="0">
-						<xsd:element name="AdditionallyPerformedBy" type="xsd:string"/>
-						<xsd:element name="AssistedBy" type="xsd:string"/>
-						<xsd:element name="ExternalInput" type="xsd:string"/>
-						<xsd:element name="MandatoryInput" type="xsd:string"/>
-						<xsd:element name="OptionalInput" type="xsd:string"/>
-						<xsd:element name="Output" type="xsd:string"/>
-					</xsd:choice>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="Step" type="uma:Section"/>
-				</xsd:sequence>
-				<xsd:attribute name="isSynchronizedWithSource" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CompositeRole">
-		<xsd:annotation>
-			<xsd:documentation>A special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
-A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:RoleDescriptor">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="AggregatedRole" type="uma:Role"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="TeamProfile">
-		<xsd:annotation>
-			<xsd:documentation>A Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
-Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
-Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="Role" type="xsd:string"/>
-					<xsd:element name="SuperTeam" type="xsd:string"/>
-					<xsd:element name="SubTeam" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="Process">
-		<xsd:annotation>
-			<xsd:documentation>A special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
-Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Activity">
-				<xsd:sequence>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="IncludesPattern" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="DefaultContext" type="xsd:string"/>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="ValidContext" type="xsd:string"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="DeliveryProcess">
-		<xsd:annotation>
-			<xsd:documentation>A special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
-A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="CommunicationsMaterial" type="xsd:string"/>
-					<xsd:element name="EducationMaterial" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="CapabilityPattern">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
-A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
-- To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
-- To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
-- To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process"/>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPlanningTemplate">
-		<xsd:annotation>
-			<xsd:documentation>A special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
-A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:Process">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="BaseProcess" type="xsd:string"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessPackage">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Package that contains Process Elements, only.
-A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodPackage">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="ProcessElement" type="uma:ProcessElement"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponentInterface">
-		<xsd:annotation>
-			<xsd:documentation>Comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:BreakdownElement">
-				<xsd:choice maxOccurs="unbounded" minOccurs="0">
-					<xsd:element name="InterfaceSpecification" type="uma:TaskDescriptor"/>
-					<xsd:element name="InterfaceIO" type="uma:WorkProductDescriptor"/>
-				</xsd:choice>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="ProcessComponent">
-		<xsd:annotation>
-			<xsd:documentation>A special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
-UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a "black box".  At any point during a project the component "realization" detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:ProcessPackage">
-				<xsd:sequence>
-					<xsd:element minOccurs="0" name="Copyright" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="Interface" type="uma:ProcessComponentInterface"/>
-					<xsd:element name="Process" type="uma:Process"/>
-				</xsd:sequence>
-				<xsd:attribute name="authors" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Method Unit is being created and owned by an author or authoring team.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDate" type="xsd:dateTime">
-					<xsd:annotation>
-						<xsd:documentation>The date the last change that resulted into this version has been made.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="changeDescription" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>The description of the last change that resulted into this version.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-				<xsd:attribute name="version" type="xsd:string">
-					<xsd:annotation>
-						<xsd:documentation>Every Package has a version number used to track changes.</xsd:documentation>
-					</xsd:annotation>
-				</xsd:attribute>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:complexType name="MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="ReferencedMethodPlugin" type="xsd:string"/>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="MethodPackage" type="uma:MethodPackage"/>
-				</xsd:sequence>
-				<xsd:attribute name="userChangeable" type="xsd:boolean"/>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodPlugin" type="uma:MethodPlugin">
-		<xsd:annotation>
-			<xsd:documentation>A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="BaseConfiguration" type="xsd:string"/>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="MethodPluginSelection" type="xsd:string"/>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="MethodPackageSelection" type="xsd:string"/>
-					<xsd:element minOccurs="0" name="DefaultView" type="xsd:string"/>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="ProcessView" type="xsd:string"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodConfiguration" type="uma:MethodConfiguration">
-		<xsd:annotation>
-			<xsd:documentation>A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-	<xsd:complexType name="MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-		<xsd:complexContent>
-			<xsd:extension base="uma:MethodUnit">
-				<xsd:sequence>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="MethodPlugin" type="uma:MethodPlugin"/>
-					<xsd:element maxOccurs="unbounded" minOccurs="0" name="MethodConfiguration" type="uma:MethodConfiguration"/>
-				</xsd:sequence>
-			</xsd:extension>
-		</xsd:complexContent>
-	</xsd:complexType>
-	<xsd:element name="MethodLibrary" type="uma:MethodLibrary">
-		<xsd:annotation>
-			<xsd:documentation>A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.</xsd:documentation>
-		</xsd:annotation>
-	</xsd:element>
-</xsd:schema>
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Activity.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Activity.java
deleted file mode 100644
index de6320c..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Activity.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Activity.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Activity</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Work Breakdown Element and Work Definition which supports the nesting and logical grouping of related Breakdown Elements forming breakdown structures.  Although Activity is a concrete meta-class, other classes which represent breakdown structures derive from it; such as Phase, Iteration, Delivery Process, or Capability Pattern.
- * Activity represents a grouping element for other Breakdown Elements such as Activities, Descriptors, Milestones, etc.  It is not per-se a 'high-level' grouping of only work as in other meta-models, but groups any kind of Breakdown Elements.  For example, one can define valid Activities that group only Work Products Descriptors without any matching Task Descriptors.  Activities also inherit all properties from Work Breakdown Element and indirectly from Process Element; i.e. Activity is ready to have a full content description attached to it.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getPostcondition <em>Postcondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getBreakdownElement <em>Breakdown Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getChecklist <em>Checklist</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getConcept <em>Concept</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getExample <em>Example</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getGuideline <em>Guideline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getRoadmap <em>Roadmap</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getReusableAsset <em>Reusable Asset</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getSupportingMaterial <em>Supporting Material</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getWhitepaper <em>Whitepaper</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#isIsEnactable <em>Is Enactable</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Activity#getVariabilityType <em>Variability Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity()
- * @model extendedMetaData="name='Activity' kind='elementOnly'"
- * @generated
- */
-public interface Activity extends WorkBreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Precondition</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Precondition</em>' attribute.
-	 * @see #setPrecondition(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Precondition()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Precondition'"
-	 * @generated
-	 */
-	String getPrecondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Activity#getPrecondition <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Precondition</em>' attribute.
-	 * @see #getPrecondition()
-	 * @generated
-	 */
-	void setPrecondition(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Postcondition</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Postcondition</em>' attribute.
-	 * @see #setPostcondition(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Postcondition()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Postcondition'"
-	 * @generated
-	 */
-	String getPostcondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Activity#getPostcondition <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Postcondition</em>' attribute.
-	 * @see #getPostcondition()
-	 * @generated
-	 */
-	void setPostcondition(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:27'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.BreakdownElement}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Breakdown Element</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>Breakdown Element</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_BreakdownElement()
-	 * @model type="org.eclipse.epf.xml.uma.BreakdownElement" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='BreakdownElement' group='#group:27'"
-	 * @generated
-	 */
-	EList getBreakdownElement();
-
-	/**
-	 * Returns the value of the '<em><b>Checklist</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Checklist</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>Checklist</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Checklist()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Checklist' group='#group:27'"
-	 * @generated
-	 */
-	EList getChecklist();
-
-	/**
-	 * Returns the value of the '<em><b>Concept</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Concept</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>Concept</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Concept()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Concept' group='#group:27'"
-	 * @generated
-	 */
-	EList getConcept();
-
-	/**
-	 * Returns the value of the '<em><b>Example</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Example</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>Example</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Example()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Example' group='#group:27'"
-	 * @generated
-	 */
-	EList getExample();
-
-	/**
-	 * Returns the value of the '<em><b>Guideline</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Guideline</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>Guideline</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Guideline()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Guideline' group='#group:27'"
-	 * @generated
-	 */
-	EList getGuideline();
-
-	/**
-	 * Returns the value of the '<em><b>Roadmap</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Roadmap</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>Roadmap</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Roadmap()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Roadmap' group='#group:27'"
-	 * @generated
-	 */
-	EList getRoadmap();
-
-	/**
-	 * Returns the value of the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reusable Asset</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>Reusable Asset</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_ReusableAsset()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ReusableAsset' group='#group:27'"
-	 * @generated
-	 */
-	EList getReusableAsset();
-
-	/**
-	 * Returns the value of the '<em><b>Supporting Material</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Supporting Material</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>Supporting Material</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_SupportingMaterial()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='SupportingMaterial' group='#group:27'"
-	 * @generated
-	 */
-	EList getSupportingMaterial();
-
-	/**
-	 * Returns the value of the '<em><b>Whitepaper</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Whitepaper</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>Whitepaper</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_Whitepaper()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Whitepaper' group='#group:27'"
-	 * @generated
-	 */
-	EList getWhitepaper();
-
-	/**
-	 * Returns the value of the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Is Enactable</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Is Enactable</em>' attribute.
-	 * @see #isSetIsEnactable()
-	 * @see #unsetIsEnactable()
-	 * @see #setIsEnactable(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_IsEnactable()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='IsEnactable'"
-	 * @generated
-	 */
-	boolean isIsEnactable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Activity#isIsEnactable <em>Is Enactable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Enactable</em>' attribute.
-	 * @see #isSetIsEnactable()
-	 * @see #unsetIsEnactable()
-	 * @see #isIsEnactable()
-	 * @generated
-	 */
-	void setIsEnactable(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.Activity#isIsEnactable <em>Is Enactable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsEnactable()
-	 * @see #isIsEnactable()
-	 * @see #setIsEnactable(boolean)
-	 * @generated
-	 */
-	void unsetIsEnactable();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.Activity#isIsEnactable <em>Is Enactable</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Enactable</em>' attribute is set.
-	 * @see #unsetIsEnactable()
-	 * @see #isIsEnactable()
-	 * @see #setIsEnactable(boolean)
-	 * @generated
-	 */
-	boolean isSetIsEnactable();
-
-	/**
-	 * Returns the value of the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variability Based On Element</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variability Based On Element</em>' attribute.
-	 * @see #setVariabilityBasedOnElement(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_VariabilityBasedOnElement()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='variabilityBasedOnElement'"
-	 * @generated
-	 */
-	String getVariabilityBasedOnElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Activity#getVariabilityBasedOnElement <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Based On Element</em>' attribute.
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 */
-	void setVariabilityBasedOnElement(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Variability Type</b></em>' attribute.
-	 * The default value is <code>"na"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.epf.xml.uma.VariabilityType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variability Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see #isSetVariabilityType()
-	 * @see #unsetVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivity_VariabilityType()
-	 * @model default="na" unique="false" unsettable="true"
-	 *        extendedMetaData="kind='attribute' name='variabilityType'"
-	 * @generated
-	 */
-	VariabilityType getVariabilityType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Activity#getVariabilityType <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see #isSetVariabilityType()
-	 * @see #unsetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @generated
-	 */
-	void setVariabilityType(VariabilityType value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.Activity#getVariabilityType <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @generated
-	 */
-	void unsetVariabilityType();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.Activity#getVariabilityType <em>Variability Type</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Variability Type</em>' attribute is set.
-	 * @see #unsetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @generated
-	 */
-	boolean isSetVariabilityType();
-
-} // Activity
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ActivityDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ActivityDescription.java
deleted file mode 100644
index 205a79d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ActivityDescription.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ActivityDescription.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Activity Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Breakdown Element Description that is used to store the textual description for an Activity.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ActivityDescription#getAlternatives <em>Alternatives</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ActivityDescription#getHowToStaff <em>How To Staff</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ActivityDescription#getPurpose <em>Purpose</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getActivityDescription()
- * @model extendedMetaData="name='ActivityDescription' kind='elementOnly'"
- * @generated
- */
-public interface ActivityDescription extends BreakdownElementDescription {
-	/**
-	 * Returns the value of the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Comprises of summaries describing important exceptional and non-standard ways of doing the work of this Activity not covered by the Activity's Tasks.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Alternatives</em>' attribute.
-	 * @see #setAlternatives(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivityDescription_Alternatives()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Alternatives'"
-	 * @generated
-	 */
-	String getAlternatives();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ActivityDescription#getAlternatives <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Alternatives</em>' attribute.
-	 * @see #getAlternatives()
-	 * @generated
-	 */
-	void setAlternatives(String value);
-
-	/**
-	 * Returns the value of the '<em><b>How To Staff</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides background on who should be involved in this activity what are the required skills, experience,  and perhaps attitudes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>How To Staff</em>' attribute.
-	 * @see #setHowToStaff(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivityDescription_HowToStaff()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='HowToStaff'"
-	 * @generated
-	 */
-	String getHowToStaff();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ActivityDescription#getHowToStaff <em>How To Staff</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>How To Staff</em>' attribute.
-	 * @see #getHowToStaff()
-	 * @generated
-	 */
-	void setHowToStaff(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Summarizes the main reason for performing this Activity, describes what the activity as a whole is intended to achieve.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Purpose</em>' attribute.
-	 * @see #setPurpose(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getActivityDescription_Purpose()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Purpose'"
-	 * @generated
-	 */
-	String getPurpose();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ActivityDescription#getPurpose <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Purpose</em>' attribute.
-	 * @see #getPurpose()
-	 * @generated
-	 */
-	void setPurpose(String value);
-
-} // ActivityDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Artifact.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Artifact.java
deleted file mode 100644
index 3fca564..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Artifact.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Artifact.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Artifact</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Work Product that provides a description and definition for tangible work product types. Artifacts may be composed of other artifacts. For example, a model artifact can be composed of model elements, which are also artifacts.
- * Artifacts are tangible work products consumed, produced, or modified by Tasks.  It may serve as a basis for defining reusable assets.  Roles use Artifacts to perform Tasks and produce Artifacts in the course of performing Tasks.  Artifacts are the responsibility of a single Role, making responsibility easy to identify and understand, and promoting the idea that every piece of information produced in the method requires the appropriate set of skills. Even though one role might "own" a specific type of Artifacts, other roles can still use the Artifacts; perhaps even update them if the Role has been given permission to do so.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Artifact#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Artifact#getContainedArtifact <em>Contained Artifact</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifact()
- * @model extendedMetaData="name='Artifact' kind='elementOnly'"
- * @generated
- */
-public interface Artifact extends WorkProduct {
-	/**
-	 * Returns the value of the '<em><b>Group3</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group3</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>Group3</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifact_Group3()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:28'"
-	 * @generated
-	 */
-	FeatureMap getGroup3();
-
-	/**
-	 * Returns the value of the '<em><b>Contained Artifact</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Artifact}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Contained Artifact</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>Contained Artifact</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifact_ContainedArtifact()
-	 * @model type="org.eclipse.epf.xml.uma.Artifact" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ContainedArtifact' group='#group:28'"
-	 * @generated
-	 */
-	EList getContainedArtifact();
-
-} // Artifact
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ArtifactDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ArtifactDescription.java
deleted file mode 100644
index 2c0ad65..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ArtifactDescription.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ArtifactDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Artifact Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Work Product Description that is used to store the textual description for an Artifact.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ArtifactDescription#getBriefOutline <em>Brief Outline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentationOptions <em>Representation Options</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentation <em>Representation</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ArtifactDescription#getNotation <em>Notation</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifactDescription()
- * @model extendedMetaData="name='ArtifactDescription' kind='elementOnly'"
- * @generated
- */
-public interface ArtifactDescription extends WorkProductDescription {
-	/**
-	 * Returns the value of the '<em><b>Brief Outline</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides a brief description of the information that can be found in this artifact. For example, discusses the contents for key chapters of a document artifact or the key packages and modules of a model artifact.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Brief Outline</em>' attribute.
-	 * @see #setBriefOutline(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifactDescription_BriefOutline()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='BriefOutline'"
-	 * @generated
-	 */
-	String getBriefOutline();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getBriefOutline <em>Brief Outline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Brief Outline</em>' attribute.
-	 * @see #getBriefOutline()
-	 * @generated
-	 */
-	void setBriefOutline(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Representation Options</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Discusses different possible alternative representations for the artifact. For example a design model can be represented as a UML model or an informal block diagram or by textual description only.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Representation Options</em>' attribute.
-	 * @see #setRepresentationOptions(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifactDescription_RepresentationOptions()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='RepresentationOptions'"
-	 * @generated
-	 */
-	String getRepresentationOptions();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentationOptions <em>Representation Options</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Representation Options</em>' attribute.
-	 * @see #getRepresentationOptions()
-	 * @generated
-	 */
-	void setRepresentationOptions(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Representation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Representation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Representation</em>' attribute.
-	 * @see #setRepresentation(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifactDescription_Representation()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Representation'"
-	 * @generated
-	 */
-	String getRepresentation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentation <em>Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Representation</em>' attribute.
-	 * @see #getRepresentation()
-	 * @generated
-	 */
-	void setRepresentation(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Notation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Notation</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Notation</em>' attribute.
-	 * @see #setNotation(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getArtifactDescription_Notation()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Notation'"
-	 * @generated
-	 */
-	String getNotation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getNotation <em>Notation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Notation</em>' attribute.
-	 * @see #getNotation()
-	 * @generated
-	 */
-	void setNotation(String value);
-
-} // ArtifactDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/BreakdownElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/BreakdownElement.java
deleted file mode 100644
index 5aa4ede..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/BreakdownElement.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: BreakdownElement.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An abstract generalization for any type of Method Element that is part of a breakdown structure.  It defines a set of properties available to all of its specializations.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#getPresentedAfter <em>Presented After</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#getPresentedBefore <em>Presented Before</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#getPlanningData <em>Planning Data</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#getSuperActivity <em>Super Activity</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#isHasMultipleOccurrences <em>Has Multiple Occurrences</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsOptional <em>Is Optional</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsPlanned <em>Is Planned</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElement#getPrefix <em>Prefix</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement()
- * @model extendedMetaData="name='BreakdownElement' kind='elementOnly'"
- * @generated
- */
-public interface BreakdownElement extends ProcessElement {
-	/**
-	 * Returns the value of the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presented After</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Presented After</em>' attribute.
-	 * @see #setPresentedAfter(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_PresentedAfter()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='PresentedAfter'"
-	 * @generated
-	 */
-	String getPresentedAfter();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPresentedAfter <em>Presented After</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presented After</em>' attribute.
-	 * @see #getPresentedAfter()
-	 * @generated
-	 */
-	void setPresentedAfter(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presented Before</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Presented Before</em>' attribute.
-	 * @see #setPresentedBefore(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_PresentedBefore()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='PresentedBefore'"
-	 * @generated
-	 */
-	String getPresentedBefore();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPresentedBefore <em>Presented Before</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presented Before</em>' attribute.
-	 * @see #getPresentedBefore()
-	 * @generated
-	 */
-	void setPresentedBefore(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Planning Data</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Planning Data</em>' attribute.
-	 * @see #setPlanningData(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_PlanningData()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='PlanningData'"
-	 * @generated
-	 */
-	String getPlanningData();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPlanningData <em>Planning Data</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Planning Data</em>' attribute.
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	void setPlanningData(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Super Activity</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Super Activity</em>' attribute.
-	 * @see #setSuperActivity(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_SuperActivity()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='SuperActivity'"
-	 * @generated
-	 */
-	String getSuperActivity();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#getSuperActivity <em>Super Activity</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Super Activity</em>' attribute.
-	 * @see #getSuperActivity()
-	 * @generated
-	 */
-	void setSuperActivity(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Just as the isPlanned attribute the hasMultipleOccurrences attribute has an impact on generating plans from a Process.  When this attribute is set to True for a Breakdown Element then it will typically occur multiple times within the same Activity.  For example, a Task such as "Detail Use Case" would be performed for every use case identified for a particular Iteration or Activity.  Generating a plan would list one Task instance per use case.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Has Multiple Occurrences</em>' attribute.
-	 * @see #isSetHasMultipleOccurrences()
-	 * @see #unsetHasMultipleOccurrences()
-	 * @see #setHasMultipleOccurrences(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_HasMultipleOccurrences()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='hasMultipleOccurrences'"
-	 * @generated
-	 */
-	boolean isHasMultipleOccurrences();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isHasMultipleOccurrences <em>Has Multiple Occurrences</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Has Multiple Occurrences</em>' attribute.
-	 * @see #isSetHasMultipleOccurrences()
-	 * @see #unsetHasMultipleOccurrences()
-	 * @see #isHasMultipleOccurrences()
-	 * @generated
-	 */
-	void setHasMultipleOccurrences(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isHasMultipleOccurrences <em>Has Multiple Occurrences</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetHasMultipleOccurrences()
-	 * @see #isHasMultipleOccurrences()
-	 * @see #setHasMultipleOccurrences(boolean)
-	 * @generated
-	 */
-	void unsetHasMultipleOccurrences();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isHasMultipleOccurrences <em>Has Multiple Occurrences</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Has Multiple Occurrences</em>' attribute is set.
-	 * @see #unsetHasMultipleOccurrences()
-	 * @see #isHasMultipleOccurrences()
-	 * @see #setHasMultipleOccurrences(boolean)
-	 * @generated
-	 */
-	boolean isSetHasMultipleOccurrences();
-
-	/**
-	 * Returns the value of the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Indicates that the Breakdown Element describes work, a work result, or even work resources, which inclusion is not mandatory when performing a project that is planned based on a process containing this element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Optional</em>' attribute.
-	 * @see #isSetIsOptional()
-	 * @see #unsetIsOptional()
-	 * @see #setIsOptional(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_IsOptional()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='isOptional'"
-	 * @generated
-	 */
-	boolean isIsOptional();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsOptional <em>Is Optional</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Optional</em>' attribute.
-	 * @see #isSetIsOptional()
-	 * @see #unsetIsOptional()
-	 * @see #isIsOptional()
-	 * @generated
-	 */
-	void setIsOptional(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsOptional <em>Is Optional</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsOptional()
-	 * @see #isIsOptional()
-	 * @see #setIsOptional(boolean)
-	 * @generated
-	 */
-	void unsetIsOptional();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsOptional <em>Is Optional</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Optional</em>' attribute is set.
-	 * @see #unsetIsOptional()
-	 * @see #isIsOptional()
-	 * @see #setIsOptional(boolean)
-	 * @generated
-	 */
-	boolean isSetIsOptional();
-
-	/**
-	 * Returns the value of the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A key application for Development Processes expressed with Breakdown structures is to generate a project plan from it.  A process as defined in UMA (cf. with Sections XX and 5.2) is a multi-dimensional structure defining what work is being performed at what time by which roles using which input and producing what outputs.  A project plan as it is represented in project planning tools such as IBM Rational Portfolio Manager or Microsoft Project normally does not need all this information and is normally limited to just representing a subset.  For example, a typical MS Project plan only represents the work breakdown consisting of Tasks and Activities (sometimes referred to as summary tasks).  It does not show the input and output Work Products for a Task, but it can show which roles shall be staffed for performing the Task.  However, such role allocation need to be replaced with concrete resources when instantiating the plan for a concrete project.  Sometimes project plans can then again be organized differently by organizing work by deliverables in which Work Products are mapped to the plan's summary tasks and Task that have these work products as output mapped below such as summary task.  Therefore, a process can make recommendations about which elements to include and which to exclude when generating a plan.  When the isPlanned attribute is set to False for an instance of a Breakdown Element, then this element shall not be not included when a concrete project plan is being generated from the breakdown structure that contains this element.
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Planned</em>' attribute.
-	 * @see #isSetIsPlanned()
-	 * @see #unsetIsPlanned()
-	 * @see #setIsPlanned(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_IsPlanned()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='isPlanned'"
-	 * @generated
-	 */
-	boolean isIsPlanned();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsPlanned <em>Is Planned</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Planned</em>' attribute.
-	 * @see #isSetIsPlanned()
-	 * @see #unsetIsPlanned()
-	 * @see #isIsPlanned()
-	 * @generated
-	 */
-	void setIsPlanned(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsPlanned <em>Is Planned</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsPlanned()
-	 * @see #isIsPlanned()
-	 * @see #setIsPlanned(boolean)
-	 * @generated
-	 */
-	void unsetIsPlanned();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsPlanned <em>Is Planned</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Planned</em>' attribute is set.
-	 * @see #unsetIsPlanned()
-	 * @see #isIsPlanned()
-	 * @see #setIsPlanned(boolean)
-	 * @generated
-	 */
-	boolean isSetIsPlanned();
-
-	/**
-	 * Returns the value of the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Prefix represents an additional label that will be presented as a prefix to any Breakdown Element to indicate a user-defined sub-type for the element.  For example, if the process engineer would like to distinguish his Activities by 'Module' (as done in the IBM Rational Summit Ascendant Method), he can define a different prefix for every model to be used in addition to naming Activities, e.g. "SRA.Establish Requirements" with SRA indicating that this Activity belongs to the "Software Requirements Analysis" module.  Another common application for prefix is to qualify roles in Role Descriptors.  For example, "Customer.Architect" would define a "Customer" prefix for the Role Descriptor "Architect" expressing that this is an architect on the customer side and not the development team side.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Prefix</em>' attribute.
-	 * @see #setPrefix(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElement_Prefix()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='prefix'"
-	 * @generated
-	 */
-	String getPrefix();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPrefix <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Prefix</em>' attribute.
-	 * @see #getPrefix()
-	 * @generated
-	 */
-	void setPrefix(String value);
-
-} // BreakdownElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/BreakdownElementDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/BreakdownElementDescription.java
deleted file mode 100644
index 7566d1f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/BreakdownElementDescription.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: BreakdownElementDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Breakdown Element Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Content Description that is used to store the textual description for a Breakdown Element.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.BreakdownElementDescription#getUsageGuidance <em>Usage Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElementDescription()
- * @model extendedMetaData="name='BreakdownElementDescription' kind='elementOnly'"
- * @generated
- */
-public interface BreakdownElementDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides information and guidance on the meaning of the Boolean flag values and under what circumstances they should be overridden. For example, it describes why the breakdown element is optional or considerations for repeating it and differences in the individual occurrences of this Breakdown Element across the lifecycle.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Usage Guidance</em>' attribute.
-	 * @see #setUsageGuidance(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getBreakdownElementDescription_UsageGuidance()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='usageGuidance'"
-	 * @generated
-	 */
-	String getUsageGuidance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.BreakdownElementDescription#getUsageGuidance <em>Usage Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Usage Guidance</em>' attribute.
-	 * @see #getUsageGuidance()
-	 * @generated
-	 */
-	void setUsageGuidance(String value);
-
-} // BreakdownElementDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CapabilityPattern.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CapabilityPattern.java
deleted file mode 100644
index d1e71e2..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CapabilityPattern.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CapabilityPattern.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Capability Pattern</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Process that describes a reusable cluster of doing work in common process areas.  Capabilities Patterns express and communicate process knowledge for a key area of interest such as a Discipline and can be directly used by process practitioner to guide his work.  They are also used as building blocks to assemble Delivery Processes or larger Capability Patterns ensuring optimal reuse and application of the key practices they express.
- * A Capability Pattern is a special Process that describes a reusable cluster of doing work in a general process area that provides a consistent development approach to common problems.  Examples for Capability Pattern could be 'use case-based requirements management', 'use case analysis', or 'unit testing'. Typically but not necessarily, Capability Patterns have the scope of one discipline providing a breakdown of reusable complex Activities, relationships to the Roles which perform Tasks within these Activities, as well as to the Work Products that are used and produced.  A capability pattern does not relate to any specific phase or iteration of a development lifecycle, and should not imply any.  In other words, a pattern should be designed in a way that it is applicable anywhere in a Delivery Process.  This enables its Activities to be flexibly assigned to whatever phases there are in the Delivery Process to which it is being applied.  It is a good practice to design a Capability Pattern to produce one or more generic Deliverables.  The typical configuration is that each Activity in the Capability Pattern produces one Deliverable, and the last Task Descriptor in the Activity explicitly outputs just this Deliverable.  This enables the process engineer to select Patterns or just Activities by deciding which Deliverables are required.  It also offers a simple integration approach: an Activity from a capability pattern is linked to the Phase or Iteration which is required to produce the Activity's Deliverable.  Key applications areas of / areas of reuse for Capability Patterns are:
- * - To serve as building blocks for assembling Delivery Processes or larger Capability Patterns.  Normally developing a Delivery Process is not done from scratch but by systematically applying and binding patterns.  In addition to the standard pattern application of 'copy-and-modify', which allows the process engineer to individually customize the pattern's content to the particular situation it is applied for, the Plugin meta-model package (Section 6.1) introduces even more sophisticated inheritance relationships that support dynamic binding of patterns (i.e. the pattern is referenced and not copied).  This unique new way of reusing process knowledge allows to factor out commonly reoccurring Activities into patterns and to apply them over and over again for a process.  When the pattern is being revised or updated, all changes will be automatically reflected in all pattern application in all processes because of the dynamic binding.
- * - To support direct execution in a development project that does not work following a well-defined process, but works based on loosely connected process fragments of best practices in a flexible manner (e.g. Agile Development).
- * - To support process education by describing knowledge for a key area such as best practices on how to perform the work for a Discipline (e.g. Requirements Management), for a specific development technique (aspect-oriented development), or a specific technical area (e.g. relational database design), which is used for education and teaching.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getCapabilityPattern()
- * @model extendedMetaData="name='CapabilityPattern' kind='elementOnly'"
- * @generated
- */
-public interface CapabilityPattern extends org.eclipse.epf.xml.uma.Process {
-} // CapabilityPattern
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Checklist.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Checklist.java
deleted file mode 100644
index 7eed7df..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Checklist.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Checklist.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Checklist</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of guidance that identifies a series of items that need to be completed or veri-fied.  Checklists are often used in reviews such as walkthroughs or inspections. 
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getChecklist()
- * @model extendedMetaData="name='Checklist' kind='elementOnly'"
- * @generated
- */
-public interface Checklist extends Guidance {
-} // Checklist
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CompositeRole.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CompositeRole.java
deleted file mode 100644
index 0fea2a9..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CompositeRole.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CompositeRole.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Composite Role</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Role Descriptor that relates to more then one Role.  It represents a grouping of Roles with the main purpose of simplification, i.e. reducing the number of roles for a process.
- * A Composite Role is a grouping of Roles that can be used in an Activity or Process to reduce the number of Roles.  A typical application would be a process for a small team in which a standard set of roles from the method content would be all performed by one or more resource.  By using Composite Role the process would suggest a typical clustering of Roles to Resources.  A Composite Role could perform all Tasks defined for the Roles it refers to.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.CompositeRole#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.CompositeRole#getAggregatedRole <em>Aggregated Role</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getCompositeRole()
- * @model extendedMetaData="name='CompositeRole' kind='elementOnly'"
- * @generated
- */
-public interface CompositeRole extends RoleDescriptor {
-	/**
-	 * Returns the value of the '<em><b>Group1</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group1</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>Group1</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getCompositeRole_Group1()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:23'"
-	 * @generated
-	 */
-	FeatureMap getGroup1();
-
-	/**
-	 * Returns the value of the '<em><b>Aggregated Role</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Role}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Aggregated Role</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>Aggregated Role</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getCompositeRole_AggregatedRole()
-	 * @model type="org.eclipse.epf.xml.uma.Role" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='AggregatedRole' group='#group:23'"
-	 * @generated
-	 */
-	EList getAggregatedRole();
-
-} // CompositeRole
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Concept.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Concept.java
deleted file mode 100644
index 12a322e..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Concept.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Concept.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Concept</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of guidance that outlines key ideas associated with basic principles underlying the referenced item. Concepts normally address more general topics than Guidelines and span across sev-eral work product and/or tasks/activities.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getConcept()
- * @model extendedMetaData="name='Concept' kind='elementOnly'"
- * @generated
- */
-public interface Concept extends Guidance {
-} // Concept
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Constraint.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Constraint.java
deleted file mode 100644
index f0214ee..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Constraint.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Constraint.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Constraint</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Method Element that represents a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of a Method Element.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Constraint#getMainDescription <em>Main Description</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getConstraint()
- * @model extendedMetaData="name='Constraint' kind='elementOnly'"
- * @generated
- */
-public interface Constraint extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Stores the main definition of the constraint.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Main Description</em>' attribute.
-	 * @see #setMainDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getConstraint_MainDescription()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='mainDescription'"
-	 * @generated
-	 */
-	String getMainDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Constraint#getMainDescription <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Main Description</em>' attribute.
-	 * @see #getMainDescription()
-	 * @generated
-	 */
-	void setMainDescription(String value);
-
-} // Constraint
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentCategory.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentCategory.java
deleted file mode 100644
index 21c7817..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentCategory.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentCategory.java,v 1.1 2008/01/15 08:52:06 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Category</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An abstract class generalizing content category types.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getContentCategory()
- * @model extendedMetaData="name='ContentCategory' kind='elementOnly'"
- * @generated
- */
-public interface ContentCategory extends ContentElement {
-} // ContentCategory
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentCategoryPackage.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentCategoryPackage.java
deleted file mode 100644
index 36f45e4..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentCategoryPackage.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentCategoryPackage.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Category Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Method Package that only contains Content Category Elements.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentCategoryPackage#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentCategoryPackage#getContentCategory <em>Content Category</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getContentCategoryPackage()
- * @model extendedMetaData="name='ContentCategoryPackage' kind='elementOnly'"
- * @generated
- */
-public interface ContentCategoryPackage extends MethodPackage {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentCategoryPackage_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:12'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Content Category</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.ContentCategory}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Content Category</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>Content Category</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentCategoryPackage_ContentCategory()
-	 * @model type="org.eclipse.epf.xml.uma.ContentCategory" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ContentCategory' group='#group:12'"
-	 * @generated
-	 */
-	EList getContentCategory();
-
-} // ContentCategoryPackage
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentDescription.java
deleted file mode 100644
index 41e9735..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentDescription.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Method Element that is used to store the textual description for a Content Element.  It defines standard attributes applicable for all Content Element types.  Specific Content Element sub-types can define their own matching Content Description sub-types. 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentDescription#getMainDescription <em>Main Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentDescription#getKeyConsiderations <em>Key Considerations</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentDescription#getSection <em>Section</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentDescription#getExternalId <em>External Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getContentDescription()
- * @model extendedMetaData="name='ContentDescription' kind='elementOnly'"
- * @generated
- */
-public interface ContentDescription extends MethodUnit {
-	/**
-	 * Returns the value of the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Stores the main descriptive text for the Content Element.  All text that is not part of any of the more specific attributes shall be stored here.  If the Content Description is divided into sections using the Section class, then only the text from the 'start' of the content description to the first section will be stored here (similar to a normal document where you can place text between its beginning to its first diction heading).
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Main Description</em>' attribute.
-	 * @see #setMainDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentDescription_MainDescription()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='MainDescription'"
-	 * @generated
-	 */
-	String getMainDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ContentDescription#getMainDescription <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Main Description</em>' attribute.
-	 * @see #getMainDescription()
-	 * @generated
-	 */
-	void setMainDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides advise and guidance of a critical nature for the content element as well as warnings, cautions, pitfalls, dangers.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Key Considerations</em>' attribute.
-	 * @see #setKeyConsiderations(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentDescription_KeyConsiderations()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='KeyConsiderations'"
-	 * @generated
-	 */
-	String getKeyConsiderations();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ContentDescription#getKeyConsiderations <em>Key Considerations</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key Considerations</em>' attribute.
-	 * @see #getKeyConsiderations()
-	 * @generated
-	 */
-	void setKeyConsiderations(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Section</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Section}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Section</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>Section</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentDescription_Section()
-	 * @model type="org.eclipse.epf.xml.uma.Section" containment="true"
-	 *        extendedMetaData="kind='element' name='Section'"
-	 * @generated
-	 */
-	EList getSection();
-
-	/**
-	 * Returns the value of the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * An external visible number that is used to reference this artifact. Used like a synonym.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Id</em>' attribute.
-	 * @see #setExternalId(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentDescription_ExternalId()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='externalId'"
-	 * @generated
-	 */
-	String getExternalId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ContentDescription#getExternalId <em>External Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Id</em>' attribute.
-	 * @see #getExternalId()
-	 * @generated
-	 */
-	void setExternalId(String value);
-
-} // ContentDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentElement.java
deleted file mode 100644
index a8bc660..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentElement.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentElement.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Describable Element that represents an abstract generalization for all elements that are considered to be and managed as Method Content.
- * Content Elements represents reusable Method Content that is supposed to be managed in Content Packages.  The separation of Content Element from Process Element allows to clearly distinguish between pure method content from content that is represented in processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getChecklist <em>Checklist</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getConcept <em>Concept</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getExample <em>Example</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getGuideline <em>Guideline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getReusableAsset <em>Reusable Asset</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getSupportingMaterial <em>Supporting Material</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getWhitepaper <em>Whitepaper</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityType <em>Variability Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement()
- * @model extendedMetaData="name='ContentElement' kind='elementOnly'"
- * @generated
- */
-public interface ContentElement extends DescribableElement {
-	/**
-	 * Returns the value of the '<em><b>Group1</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group1</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>Group1</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_Group1()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:12'"
-	 * @generated
-	 */
-	FeatureMap getGroup1();
-
-	/**
-	 * Returns the value of the '<em><b>Checklist</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Checklist</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>Checklist</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_Checklist()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Checklist' group='#group:12'"
-	 * @generated
-	 */
-	EList getChecklist();
-
-	/**
-	 * Returns the value of the '<em><b>Concept</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Concept</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>Concept</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_Concept()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Concept' group='#group:12'"
-	 * @generated
-	 */
-	EList getConcept();
-
-	/**
-	 * Returns the value of the '<em><b>Example</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Example</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>Example</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_Example()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Example' group='#group:12'"
-	 * @generated
-	 */
-	EList getExample();
-
-	/**
-	 * Returns the value of the '<em><b>Guideline</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Guideline</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>Guideline</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_Guideline()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Guideline' group='#group:12'"
-	 * @generated
-	 */
-	EList getGuideline();
-
-	/**
-	 * Returns the value of the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reusable Asset</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>Reusable Asset</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_ReusableAsset()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ReusableAsset' group='#group:12'"
-	 * @generated
-	 */
-	EList getReusableAsset();
-
-	/**
-	 * Returns the value of the '<em><b>Supporting Material</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Supporting Material</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>Supporting Material</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_SupportingMaterial()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='SupportingMaterial' group='#group:12'"
-	 * @generated
-	 */
-	EList getSupportingMaterial();
-
-	/**
-	 * Returns the value of the '<em><b>Whitepaper</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Whitepaper</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>Whitepaper</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_Whitepaper()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Whitepaper' group='#group:12'"
-	 * @generated
-	 */
-	EList getWhitepaper();
-
-	/**
-	 * Returns the value of the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variability Based On Element</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variability Based On Element</em>' attribute.
-	 * @see #setVariabilityBasedOnElement(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_VariabilityBasedOnElement()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='variabilityBasedOnElement'"
-	 * @generated
-	 */
-	String getVariabilityBasedOnElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityBasedOnElement <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Based On Element</em>' attribute.
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 */
-	void setVariabilityBasedOnElement(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Variability Type</b></em>' attribute.
-	 * The default value is <code>"na"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.epf.xml.uma.VariabilityType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variability Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see #isSetVariabilityType()
-	 * @see #unsetVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentElement_VariabilityType()
-	 * @model default="na" unique="false" unsettable="true"
-	 *        extendedMetaData="kind='attribute' name='variabilityType'"
-	 * @generated
-	 */
-	VariabilityType getVariabilityType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityType <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see #isSetVariabilityType()
-	 * @see #unsetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @generated
-	 */
-	void setVariabilityType(VariabilityType value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityType <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @generated
-	 */
-	void unsetVariabilityType();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityType <em>Variability Type</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Variability Type</em>' attribute is set.
-	 * @see #unsetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @generated
-	 */
-	boolean isSetVariabilityType();
-
-} // ContentElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentPackage.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentPackage.java
deleted file mode 100644
index ae27748..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ContentPackage.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentPackage.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Content Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Method Package that contains Content Elements and Content Elements, only.  Examples for Content Element are Artifacts, Tasks, Roles, etc.  A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentPackage#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ContentPackage#getContentElement <em>Content Element</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getContentPackage()
- * @model extendedMetaData="name='ContentPackage' kind='elementOnly'"
- * @generated
- */
-public interface ContentPackage extends MethodPackage {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentPackage_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:12'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Content Element</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.ContentElement}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Content Element</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>Content Element</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getContentPackage_ContentElement()
-	 * @model type="org.eclipse.epf.xml.uma.ContentElement" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ContentElement' group='#group:12'"
-	 * @generated
-	 */
-	EList getContentElement();
-
-} // ContentPackage
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CustomCategory.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CustomCategory.java
deleted file mode 100644
index 38ead0a3..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/CustomCategory.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CustomCategory.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Custom Category</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A category introduced by a method content author to structure any number of method Content Elements of any subtype based on user-defined criteria.  Because Content Categories (and therefore Custom Categories, too) are Content Elements themselves, Custom Categories can be used to recursively categorize Content Categories as well.  Custom Categories can also be nested with any Content Category.  Custom categories can be used to categorize content based on the user's criteria as well as to define whole tree-structures of nested categories allowing the user to systematically navigate and browse method content and processes based on these categories.  For example, one could create a custom category to logically organize content relevant for the user's development organization departments; e.g. a "Testing" category that groups together all roles, work products, tasks, and guidance element relevant to testing.  Another example would be categories that express licensing levels of the content grouping freely distributable method content versus content that represent intellectual property and requires a license to be purchased to be able to use it.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.CustomCategory#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.CustomCategory#getCategorizedElement <em>Categorized Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.CustomCategory#getSubCategory <em>Sub Category</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getCustomCategory()
- * @model extendedMetaData="name='CustomCategory' kind='elementOnly'"
- * @generated
- */
-public interface CustomCategory extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getCustomCategory_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Categorized Element</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Categorized Element</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>Categorized Element</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getCustomCategory_CategorizedElement()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='CategorizedElement' group='#group:22'"
-	 * @generated
-	 */
-	EList getCategorizedElement();
-
-	/**
-	 * Returns the value of the '<em><b>Sub Category</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Category</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>Sub Category</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getCustomCategory_SubCategory()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='SubCategory' group='#group:22'"
-	 * @generated
-	 */
-	EList getSubCategory();
-
-} // CustomCategory
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Deliverable.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Deliverable.java
deleted file mode 100644
index 9abea8b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Deliverable.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Deliverable.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Deliverable</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Work Product that provides a description and definition for packaging other Work Products, and may be delivered to an internal or external party.  Therefore, a Deliverable aggregates other Work Products. Therefore, a Deliverable aggregates other Work Products.  A Deliverable is used to pre-define typical or recommended content in the form or work products that would be packaged for delivery.  The actual packaging of the Deliverable in an actual process or even project could be a modification of this recommendation.  Deliverables are used to represent an output from a process that has value, material or otherwise, to a client, customer or other stakeholder. 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Deliverable#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Deliverable#getDeliveredWorkProduct <em>Delivered Work Product</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliverable()
- * @model extendedMetaData="name='Deliverable' kind='elementOnly'"
- * @generated
- */
-public interface Deliverable extends WorkProduct {
-	/**
-	 * Returns the value of the '<em><b>Group3</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group3</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>Group3</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliverable_Group3()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:28'"
-	 * @generated
-	 */
-	FeatureMap getGroup3();
-
-	/**
-	 * Returns the value of the '<em><b>Delivered Work Product</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Delivered Work Product</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>Delivered Work Product</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliverable_DeliveredWorkProduct()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='DeliveredWorkProduct' group='#group:28'"
-	 * @generated
-	 */
-	EList getDeliveredWorkProduct();
-
-} // Deliverable
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliverableDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliverableDescription.java
deleted file mode 100644
index ad7961b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliverableDescription.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DeliverableDescription.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Deliverable Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Work Product Description that is used to store the textual description for a Deliverable.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliverableDescription#getExternalDescription <em>External Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliverableDescription#getPackagingGuidance <em>Packaging Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliverableDescription()
- * @model extendedMetaData="name='DeliverableDescription' kind='elementOnly'"
- * @generated
- */
-public interface DeliverableDescription extends WorkProductDescription {
-	/**
-	 * Returns the value of the '<em><b>External Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The description of the Deliverable used for client documents (proposal, statements of work or contractual agreements).  It might use a different language and follow legal constraints.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Description</em>' attribute.
-	 * @see #setExternalDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliverableDescription_ExternalDescription()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ExternalDescription'"
-	 * @generated
-	 */
-	String getExternalDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliverableDescription#getExternalDescription <em>External Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Description</em>' attribute.
-	 * @see #getExternalDescription()
-	 * @generated
-	 */
-	void setExternalDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Packaging Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides guidance on how to assemble the deliverable from all its required inputs.  This section describes the most common content medium and format.  Distribution of the deliverable is addressed in this section, if necessary.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Packaging Guidance</em>' attribute.
-	 * @see #setPackagingGuidance(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliverableDescription_PackagingGuidance()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='PackagingGuidance'"
-	 * @generated
-	 */
-	String getPackagingGuidance();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliverableDescription#getPackagingGuidance <em>Packaging Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Packaging Guidance</em>' attribute.
-	 * @see #getPackagingGuidance()
-	 * @generated
-	 */
-	void setPackagingGuidance(String value);
-
-} // DeliverableDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliveryProcess.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliveryProcess.java
deleted file mode 100644
index 282c6e5..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliveryProcess.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DeliveryProcess.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Delivery Process</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Process describing a complete and integrated approach for performing a specific project type.  It describes a complete project lifecycle end-to-end and shall be used as a reference for running projects with similar characteristics as defined for the process.  A Delivery Process is related to specific supporting information such as Roadmaps (inherited via Activity) as well as Communications and Education Material.
- * A Delivery Process is a Process that covers a whole development lifecycle from beginning to end.  A Delivery Process shall be used as a template for planning and running a project.  It provides a complete lifecycle model with predefined phases, iterations, and activities that have been detailed by sequencing referencing method content in breakdown structures.  It is defined on the basis of experience with past projects or engagements, and/or the best practice use of a development or delivery approach.  It defines what gets produced, how those items are produced, and the required staffing in the form of integrated Work, Work Product, and Team Breakdown Structures.  For example, a process engineer can define alternative Delivery Processes for software development projects that differ in the scale of the engagement and staffing necessary, the type of the software application to be developed, the development methods and technologies to be used, etc.  Although, the Delivery Process aims to cover a whole project it keeps certain decision that are too project specific open.  For example, the breakdown structure defines which Breakdown Elements have multiple occurrences or is repeatable via it respective attributes, but does not say how many occurrences and how many repeats/iterations it will have.  These decisions have to be done by a project manager when planning a concrete project, project phase, or project iterations.  A Delivery Process is always a complete description of a process in terms of completeness of the lifecycle, as well as in terms of all three views on the process which are the Work Breakdown Structure, Work Product Breakdown Structure, and Team Breakdown Structure have to be fully and consistently populated.  Consistency of a Delivery Process is actually ensured by the fact that all three breakdowns are represented by one single data structure and one particular breakdown such as Team Breakdown is just a view on that data structure.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcess#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcess#getCommunicationsMaterial <em>Communications Material</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcess#getEducationMaterial <em>Education Material</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcess()
- * @model extendedMetaData="name='DeliveryProcess' kind='elementOnly'"
- * @generated
- */
-public interface DeliveryProcess extends org.eclipse.epf.xml.uma.Process {
-	/**
-	 * Returns the value of the '<em><b>Group3</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group3</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>Group3</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcess_Group3()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:44'"
-	 * @generated
-	 */
-	FeatureMap getGroup3();
-
-	/**
-	 * Returns the value of the '<em><b>Communications Material</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Communications Material</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>Communications Material</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcess_CommunicationsMaterial()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='CommunicationsMaterial' group='#group:44'"
-	 * @generated
-	 */
-	EList getCommunicationsMaterial();
-
-	/**
-	 * Returns the value of the '<em><b>Education Material</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Education Material</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>Education Material</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcess_EducationMaterial()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='EducationMaterial' group='#group:44'"
-	 * @generated
-	 */
-	EList getEducationMaterial();
-
-} // DeliveryProcess
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliveryProcessDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliveryProcessDescription.java
deleted file mode 100644
index 1a78da5..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DeliveryProcessDescription.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DeliveryProcessDescription.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Delivery Process Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Process Description that is used to store the textual description for a Delivery Process.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getScale <em>Scale</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectCharacteristics <em>Project Characteristics</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getRiskLevel <em>Risk Level</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getEstimatingTechnique <em>Estimating Technique</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectMemberExpertise <em>Project Member Expertise</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getTypeOfContract <em>Type Of Contract</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcessDescription()
- * @model extendedMetaData="name='DeliveryProcessDescription' kind='elementOnly'"
- * @generated
- */
-public interface DeliveryProcessDescription extends ProcessDescription {
-	/**
-	 * Returns the value of the '<em><b>Scale</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Outlines characteristics about the size of a typical project that performs this project expressed in team size, man years, etc.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Scale</em>' attribute.
-	 * @see #setScale(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcessDescription_Scale()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Scale'"
-	 * @generated
-	 */
-	String getScale();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getScale <em>Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Scale</em>' attribute.
-	 * @see #getScale()
-	 * @generated
-	 */
-	void setScale(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Project Characteristics</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Characterizes the project that would typically perform this Process
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Project Characteristics</em>' attribute.
-	 * @see #setProjectCharacteristics(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcessDescription_ProjectCharacteristics()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ProjectCharacteristics'"
-	 * @generated
-	 */
-	String getProjectCharacteristics();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectCharacteristics <em>Project Characteristics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Project Characteristics</em>' attribute.
-	 * @see #getProjectCharacteristics()
-	 * @generated
-	 */
-	void setProjectCharacteristics(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Risk Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Outlines typical project risks that are addressed with this process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Risk Level</em>' attribute.
-	 * @see #setRiskLevel(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcessDescription_RiskLevel()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='RiskLevel'"
-	 * @generated
-	 */
-	String getRiskLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getRiskLevel <em>Risk Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Risk Level</em>' attribute.
-	 * @see #getRiskLevel()
-	 * @generated
-	 */
-	void setRiskLevel(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Estimating Technique</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes the Estimation Techniques provided for this Process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Estimating Technique</em>' attribute.
-	 * @see #setEstimatingTechnique(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcessDescription_EstimatingTechnique()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='EstimatingTechnique'"
-	 * @generated
-	 */
-	String getEstimatingTechnique();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getEstimatingTechnique <em>Estimating Technique</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Estimating Technique</em>' attribute.
-	 * @see #getEstimatingTechnique()
-	 * @generated
-	 */
-	void setEstimatingTechnique(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Project Member Expertise</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides a profile of a typical project team, the distribution of roles, skills required for a team performs a project based on this process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Project Member Expertise</em>' attribute.
-	 * @see #setProjectMemberExpertise(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcessDescription_ProjectMemberExpertise()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ProjectMemberExpertise'"
-	 * @generated
-	 */
-	String getProjectMemberExpertise();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectMemberExpertise <em>Project Member Expertise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Project Member Expertise</em>' attribute.
-	 * @see #getProjectMemberExpertise()
-	 * @generated
-	 */
-	void setProjectMemberExpertise(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type Of Contract</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides background information about the coI'm chaI'm ntracts that need to be established between a project team that performs this process and a client (e.g. for an IGS engagement).
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Type Of Contract</em>' attribute.
-	 * @see #setTypeOfContract(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDeliveryProcessDescription_TypeOfContract()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='TypeOfContract'"
-	 * @generated
-	 */
-	String getTypeOfContract();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getTypeOfContract <em>Type Of Contract</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type Of Contract</em>' attribute.
-	 * @see #getTypeOfContract()
-	 * @generated
-	 */
-	void setTypeOfContract(String value);
-
-} // DeliveryProcessDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DescribableElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DescribableElement.java
deleted file mode 100644
index 77455b4..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DescribableElement.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DescribableElement.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Describable Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An abstract generalization of Method Elements for which external presentation names as well as content descriptions have been defined, such as Roles or Work Products.  Presentation Name and Content Descriptions are typically localized using a resource allocation mechanism for its String type attributes.
- * This abstraction represents all elements in the Method Content as well as Process space for which concrete textual descriptions are defined in the form of documenting attributes grouped in a matching Content Description instance.  Describable Elements are intended to be published in method or process publications (similar to the IBM Rational Unified Process web).  Describable Element defines that the element it represents will have content 'attached' to it.  Content Description is the abstraction for the actual places in which the content is being represented.  This separation allows a distinction between core method model elements describing the structure of the model from the actual description container providing, for example, the documentation of the content element in different alternatives languages, audiences, licensing levels, etc.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.DescribableElement#getPresentation <em>Presentation</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DescribableElement#getNodeicon <em>Nodeicon</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DescribableElement#getPresentationName <em>Presentation Name</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DescribableElement#getShapeicon <em>Shapeicon</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDescribableElement()
- * @model extendedMetaData="name='DescribableElement' kind='elementOnly'"
- * @generated
- */
-public interface DescribableElement extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Presentation</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</em>' containment reference.
-	 * @see #setPresentation(ContentDescription)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDescribableElement_Presentation()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='Presentation'"
-	 * @generated
-	 */
-	ContentDescription getPresentation();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DescribableElement#getPresentation <em>Presentation</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presentation</em>' containment reference.
-	 * @see #getPresentation()
-	 * @generated
-	 */
-	void setPresentation(ContentDescription value);
-
-	/**
-	 * Returns the value of the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A reference to an icon that can be used in tree browser presentations and breakdown structures.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Nodeicon</em>' attribute.
-	 * @see #setNodeicon(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDescribableElement_Nodeicon()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='nodeicon'"
-	 * @generated
-	 */
-	String getNodeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DescribableElement#getNodeicon <em>Nodeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Nodeicon</em>' attribute.
-	 * @see #getNodeicon()
-	 * @generated
-	 */
-	void setNodeicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Describable Element has a presentation name, which is used for external presentation of the element.  For example, name (the internal representation) might be set to "rup_architecture_document" to differentiate from a "j2ee_architcture_document" whereas the external presentation would always be "Architecture Document".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Presentation Name</em>' attribute.
-	 * @see #setPresentationName(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDescribableElement_PresentationName()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='presentationName'"
-	 * @generated
-	 */
-	String getPresentationName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DescribableElement#getPresentationName <em>Presentation Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Presentation Name</em>' attribute.
-	 * @see #getPresentationName()
-	 * @generated
-	 */
-	void setPresentationName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A reference to an icon that can be used for modeling with specific Content Element instances (as graphical stereotypes, e.g. a use case symbol for a use case artifact) as well as publication of content.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Shapeicon</em>' attribute.
-	 * @see #setShapeicon(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDescribableElement_Shapeicon()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='shapeicon'"
-	 * @generated
-	 */
-	String getShapeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DescribableElement#getShapeicon <em>Shapeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Shapeicon</em>' attribute.
-	 * @see #getShapeicon()
-	 * @generated
-	 */
-	void setShapeicon(String value);
-
-} // DescribableElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Descriptor.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Descriptor.java
deleted file mode 100644
index 4394400..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Descriptor.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Descriptor.java,v 1.1 2008/01/15 08:52:06 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An abstract generalization for special Breakdown Elements that references one concrete Content Element.  A descriptor provides a representation of a Content Element within breakdown structures.  In addition to just referencing Content Elements it allows overriding the Content Elements structural relationships by defining its own sets of associations.
- * Descriptors are the key concept for realizing the separation of processes from method content.  A Descriptor can be characterized as a reference object for one particular Content Element, which has its own relationships and properties.  When a Descriptor is created it shall be provided with congruent copies of the relationships defined for the referenced content element.  However, a user can modify these relationships for the particular process situation for which the descriptor has been created. 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Descriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDescriptor()
- * @model extendedMetaData="name='Descriptor' kind='elementOnly'"
- * @generated
- */
-public interface Descriptor extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Is Synchronized With Source</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Is Synchronized With Source</em>' attribute.
-	 * @see #isSetIsSynchronizedWithSource()
-	 * @see #unsetIsSynchronizedWithSource()
-	 * @see #setIsSynchronizedWithSource(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDescriptor_IsSynchronizedWithSource()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='isSynchronizedWithSource'"
-	 * @generated
-	 */
-	boolean isIsSynchronizedWithSource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Descriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Synchronized With Source</em>' attribute.
-	 * @see #isSetIsSynchronizedWithSource()
-	 * @see #unsetIsSynchronizedWithSource()
-	 * @see #isIsSynchronizedWithSource()
-	 * @generated
-	 */
-	void setIsSynchronizedWithSource(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.Descriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsSynchronizedWithSource()
-	 * @see #isIsSynchronizedWithSource()
-	 * @see #setIsSynchronizedWithSource(boolean)
-	 * @generated
-	 */
-	void unsetIsSynchronizedWithSource();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.Descriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Synchronized With Source</em>' attribute is set.
-	 * @see #unsetIsSynchronizedWithSource()
-	 * @see #isIsSynchronizedWithSource()
-	 * @see #setIsSynchronizedWithSource(boolean)
-	 * @generated
-	 */
-	boolean isSetIsSynchronizedWithSource();
-
-} // Descriptor
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DescriptorDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DescriptorDescription.java
deleted file mode 100644
index 979452d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DescriptorDescription.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DescriptorDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Descriptor Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Breakdown Element Description that is used to store the textual description for a Descriptor.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.DescriptorDescription#getRefinedDescription <em>Refined Description</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDescriptorDescription()
- * @model extendedMetaData="name='DescriptorDescription' kind='elementOnly'"
- * @generated
- */
-public interface DescriptorDescription extends BreakdownElementDescription {
-	/**
-	 * Returns the value of the '<em><b>Refined Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A Descriptor might add refinements to the main description of the Content Element it refers to.  For example, it could provide additional information about a Work Product relevant for the specific point in time in the process this Work Product type is being used.  It could describe additional skills needed for a Role at that particular point in time in a process, etc. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Refined Description</em>' attribute.
-	 * @see #setRefinedDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDescriptorDescription_RefinedDescription()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='RefinedDescription'"
-	 * @generated
-	 */
-	String getRefinedDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DescriptorDescription#getRefinedDescription <em>Refined Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Refined Description</em>' attribute.
-	 * @see #getRefinedDescription()
-	 * @generated
-	 */
-	void setRefinedDescription(String value);
-
-} // DescriptorDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Discipline.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Discipline.java
deleted file mode 100644
index 2968733..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Discipline.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Discipline.java,v 1.1 2008/01/15 08:52:06 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Discipline</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A categorization of work (i.e. Tasks for Method Content), based upon similarity of concerns and cooperation of work effort.
- * A discipline is a collection of Tasks that are related to a major 'area of concern' within the overall project. The grouping of Tasks into disciplines is mainly an aid to understanding the project from a 'traditional' waterfall perspective. However, typically, for example, it is more common to perform certain requirements activities in close coordination with analysis and design activities. Separating these activities into separate disciplines makes the activities easier to comprehend.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Discipline#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Discipline#getTask <em>Task</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Discipline#getSubDiscipline <em>Sub Discipline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Discipline#getReferenceWorkflow <em>Reference Workflow</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDiscipline()
- * @model extendedMetaData="name='Discipline' kind='elementOnly'"
- * @generated
- */
-public interface Discipline extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDiscipline_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Task</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Task</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>Task</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDiscipline_Task()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Task' group='#group:22'"
-	 * @generated
-	 */
-	EList getTask();
-
-	/**
-	 * Returns the value of the '<em><b>Sub Discipline</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Discipline}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Discipline</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>Sub Discipline</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDiscipline_SubDiscipline()
-	 * @model type="org.eclipse.epf.xml.uma.Discipline" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='SubDiscipline' group='#group:22'"
-	 * @generated
-	 */
-	EList getSubDiscipline();
-
-	/**
-	 * Returns the value of the '<em><b>Reference Workflow</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reference Workflow</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>Reference Workflow</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDiscipline_ReferenceWorkflow()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ReferenceWorkflow' group='#group:22'"
-	 * @generated
-	 */
-	EList getReferenceWorkflow();
-
-} // Discipline
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DisciplineGrouping.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DisciplineGrouping.java
deleted file mode 100644
index 262ccb8..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DisciplineGrouping.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DisciplineGrouping.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Discipline Grouping</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Used to group Disciplines.  For example, the Discipline Grouping "Software Disciplines" would be the group of all disciplines related to developing software such as "Requirements Management" or "Testing"; "IT Infrastructure Management" would be a Disciplines Grouping for disciplines such as "IT Operational Services", "IT Customer Relationships", or "IT Enabling Services".  Disciplines can be associated to more than one Discipline Grouping.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.DisciplineGrouping#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DisciplineGrouping#getDiscipline <em>Discipline</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDisciplineGrouping()
- * @model extendedMetaData="name='DisciplineGrouping' kind='elementOnly'"
- * @generated
- */
-public interface DisciplineGrouping extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDisciplineGrouping_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Discipline</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Discipline</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>Discipline</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDisciplineGrouping_Discipline()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Discipline' group='#group:22'"
-	 * @generated
-	 */
-	EList getDiscipline();
-
-} // DisciplineGrouping
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DocumentRoot.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DocumentRoot.java
deleted file mode 100644
index 0c3c85c..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/DocumentRoot.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DocumentRoot.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.sdo.EDataObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.DocumentRoot#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodConfiguration <em>Method Configuration</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodLibrary <em>Method Library</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodPlugin <em>Method Plugin</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDocumentRoot()
- * @model extendedMetaData="name='' kind='mixed'"
- * @extends EDataObject
- * @generated
- */
-public interface DocumentRoot extends EDataObject {
-	/**
-	 * Returns the value of the '<em><b>Mixed</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mixed</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>Mixed</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDocumentRoot_Mixed()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='elementWildcard' name=':mixed'"
-	 * @generated
-	 */
-	FeatureMap getMixed();
-
-	/**
-	 * Returns the value of the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XMLNS Prefix Map</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XMLNS Prefix Map</em>' map.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDocumentRoot_XMLNSPrefixMap()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xmlns:prefix'"
-	 * @generated
-	 */
-	EMap getXMLNSPrefixMap();
-
-	/**
-	 * Returns the value of the '<em><b>XSI Schema Location</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XSI Schema Location</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XSI Schema Location</em>' map.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDocumentRoot_XSISchemaLocation()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xsi:schemaLocation'"
-	 * @generated
-	 */
-	EMap getXSISchemaLocation();
-
-	/**
-	 * Returns the value of the '<em><b>Method Configuration</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Method Configuration</em>' containment reference.
-	 * @see #setMethodConfiguration(MethodConfiguration)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDocumentRoot_MethodConfiguration()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MethodConfiguration' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MethodConfiguration getMethodConfiguration();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodConfiguration <em>Method Configuration</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Method Configuration</em>' containment reference.
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	void setMethodConfiguration(MethodConfiguration value);
-
-	/**
-	 * Returns the value of the '<em><b>Method Library</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Method Library</em>' containment reference.
-	 * @see #setMethodLibrary(MethodLibrary)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDocumentRoot_MethodLibrary()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MethodLibrary' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MethodLibrary getMethodLibrary();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodLibrary <em>Method Library</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Method Library</em>' containment reference.
-	 * @see #getMethodLibrary()
-	 * @generated
-	 */
-	void setMethodLibrary(MethodLibrary value);
-
-	/**
-	 * Returns the value of the '<em><b>Method Plugin</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
-	 * Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
-	 * Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Method Plugin</em>' containment reference.
-	 * @see #setMethodPlugin(MethodPlugin)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDocumentRoot_MethodPlugin()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MethodPlugin' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MethodPlugin getMethodPlugin();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodPlugin <em>Method Plugin</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Method Plugin</em>' containment reference.
-	 * @see #getMethodPlugin()
-	 * @generated
-	 */
-	void setMethodPlugin(MethodPlugin value);
-
-} // DocumentRoot
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Domain.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Domain.java
deleted file mode 100644
index 24499c6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Domain.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Domain.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Domain</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A refineable hierarchy grouping related work products.  In other words, Domains can be further divided into sub-domains, with work product elements to be categorized only at the leaf-level of this hierarchy.
- * Domain is a logical grouping of work products that have an affinity to each other based on resources, timing, or relationship.  A Domain may be divided into subdomains.  For example, GS Method uses six predefined Domains for Work Products: Application, Architecture, Business, Engagement, Operations and Organization.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Domain#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Domain#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Domain#getSubdomain <em>Subdomain</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getDomain()
- * @model extendedMetaData="name='Domain' kind='elementOnly'"
- * @generated
- */
-public interface Domain extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDomain_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Work Product</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Product</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>Work Product</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDomain_WorkProduct()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='WorkProduct' group='#group:22'"
-	 * @generated
-	 */
-	EList getWorkProduct();
-
-	/**
-	 * Returns the value of the '<em><b>Subdomain</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Domain}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Subdomain</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>Subdomain</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getDomain_Subdomain()
-	 * @model type="org.eclipse.epf.xml.uma.Domain" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Subdomain' group='#group:22'"
-	 * @generated
-	 */
-	EList getSubdomain();
-
-} // Domain
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Element.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Element.java
deleted file mode 100644
index 86699b4..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Element.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Element.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.ecore.sdo.EDataObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A UML 2.0 meta-class Element.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getElement()
- * @model extendedMetaData="name='Element' kind='empty'"
- * @extends EDataObject
- * @generated
- */
-public interface Element extends EDataObject {
-} // Element
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Estimate.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Estimate.java
deleted file mode 100644
index 7912aa2..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Estimate.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Estimate.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Estimate</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of Guidance that provides sizing measures, or standards for sizing the work effort associated with performing a particular piece of work and instructions for their successful use. It may be comprised of estimation considerations and estimation metrics.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Estimate#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Estimate#getEstimationMetric <em>Estimation Metric</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Estimate#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getEstimate()
- * @model extendedMetaData="name='Estimate' kind='elementOnly'"
- * @generated
- */
-public interface Estimate extends Guidance {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getEstimate_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Estimation Metric</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimation Metric</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>Estimation Metric</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getEstimate_EstimationMetric()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='EstimationMetric' group='#group:22'"
-	 * @generated
-	 */
-	EList getEstimationMetric();
-
-	/**
-	 * Returns the value of the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimation Considerations</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>Estimation Considerations</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getEstimate_EstimationConsiderations()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='EstimationConsiderations' group='#group:22'"
-	 * @generated
-	 */
-	EList getEstimationConsiderations();
-
-} // Estimate
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/EstimatingMetric.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/EstimatingMetric.java
deleted file mode 100644
index 4049a9a..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/EstimatingMetric.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EstimatingMetric.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Estimating Metric</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of Guidance that describes a metric or measure that is associated with an element and which is used to calculate the size of the work effort as well as a range of potential labor.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getEstimatingMetric()
- * @model extendedMetaData="name='EstimatingMetric' kind='elementOnly'"
- * @generated
- */
-public interface EstimatingMetric extends Guidance {
-} // EstimatingMetric
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/EstimationConsiderations.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/EstimationConsiderations.java
deleted file mode 100644
index 13be2be..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/EstimationConsiderations.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EstimationConsiderations.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Estimation Considerations</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of Guidance that qualifies the usage and application of estimation metrics in the development of an actual estimate.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getEstimationConsiderations()
- * @model extendedMetaData="name='EstimationConsiderations' kind='elementOnly'"
- * @generated
- */
-public interface EstimationConsiderations extends Guidance {
-} // EstimationConsiderations
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Example.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Example.java
deleted file mode 100644
index 46b204f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Example.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Example.java,v 1.1 2008/01/15 08:52:06 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Example</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of Guidance that represents a typical, partially completed, sample instance of one or more work products or scenario like descriptions of how Task may be performed. Examples can be related to Work Products as well as Tasks that produce them as well as any other Content Element.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getExample()
- * @model extendedMetaData="name='Example' kind='elementOnly'"
- * @generated
- */
-public interface Example extends Guidance {
-} // Example
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Guidance.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Guidance.java
deleted file mode 100644
index 4e1d011..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Guidance.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Guidance.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Guidance</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Guidance is an abstract generalization of additional information related to content elements such as Roles, Tasks, and Work Products.  Examples for Guidance are Guidelines, Templates, Checklists, Tool Mentors, Estimates, Supporting Materials, Reports, Concepts, etc.  This package only contains the definition of the abstract Guidance class.  The package Guidance Types defines concrete guidance types.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getGuidance()
- * @model extendedMetaData="name='Guidance' kind='elementOnly'"
- * @generated
- */
-public interface Guidance extends ContentElement {
-} // Guidance
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/GuidanceDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/GuidanceDescription.java
deleted file mode 100644
index c4f72c0..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/GuidanceDescription.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: GuidanceDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Guidance Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Content Description that is used to store the textual description for a Guidance.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.GuidanceDescription#getAttachment <em>Attachment</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getGuidanceDescription()
- * @model extendedMetaData="name='GuidanceDescription' kind='elementOnly'"
- * @generated
- */
-public interface GuidanceDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Attachment</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This field is primarily used for attachments augmenting the information provided for guidance.  In particular the attribute is used for Templates, Examples, and Reusable Assets to contain the actual attachment described in the mainDescription.  It can additionally contain representations of the guidance in just a third party format, e.g. PDF, MS Word, or Word Perfect.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attachment</em>' attribute.
-	 * @see #setAttachment(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getGuidanceDescription_Attachment()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Attachment'"
-	 * @generated
-	 */
-	String getAttachment();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.GuidanceDescription#getAttachment <em>Attachment</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attachment</em>' attribute.
-	 * @see #getAttachment()
-	 * @generated
-	 */
-	void setAttachment(String value);
-
-} // GuidanceDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Guideline.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Guideline.java
deleted file mode 100644
index cfb9068..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Guideline.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Guideline.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Guideline</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of guidance that provides additional detail on how to perform a particular task or grouping of tasks (e.g. grouped together as activities) or that provides additional detail, rules, and recommendations on work products and their properties.  Amongst others, it can include details about best practices and different approaches for doing work, how to use particular types of work products, information on different subtypes and variants of the work product and how they evolve throughout a lifecycle, discussions on skills the performing roles should acquire or improve upon, measurements for progress and maturity, etc.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getGuideline()
- * @model extendedMetaData="name='Guideline' kind='elementOnly'"
- * @generated
- */
-public interface Guideline extends Guidance {
-} // Guideline
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Iteration.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Iteration.java
deleted file mode 100644
index 09d85b7..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Iteration.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Iteration.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Iteration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Iteration') and isRepeatable ('True').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
- * Iteration groups a set of nested Activities that are repeated more than once.  It represents an important structuring element to organize work in repetitive cycles.  The concept of Iteration can be associated with different rules in different methods.  For example, the IBM Rational Unified Process method framework (RUP) defines a rule that Iterations are not allowed to span across Phases.  In contrast IBM Global Services Method (GSMethod) based method frameworks this rule does not apply and Iteration can be defined which nest Phases.  Rules like these, which play an important role for each individual method and are therefore not enforced by this meta-model.  Instead, process authors are expected to follow and check these rules manually.  (Note: Any Breakdown Element can be repeated; however, Iterations has been introduced as a special meta-model concept, because of its important role for many methods.)
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getIteration()
- * @model extendedMetaData="name='Iteration' kind='elementOnly'"
- * @generated
- */
-public interface Iteration extends Activity {
-} // Iteration
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodConfiguration.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodConfiguration.java
deleted file mode 100644
index 41a3241..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodConfiguration.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodConfiguration.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Configuration</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A collection of selected Method Models and MethodPackages. A configuration can be exported into its own standalone library when it includes the full transitive closure of all elements all other elements depend on.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodConfiguration#getBaseConfiguration <em>Base Configuration</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodConfiguration#getMethodPluginSelection <em>Method Plugin Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodConfiguration#getMethodPackageSelection <em>Method Package Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodConfiguration#getDefaultView <em>Default View</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodConfiguration#getProcessView <em>Process View</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodConfiguration#getSubtractedCategory <em>Subtracted Category</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodConfiguration#getAddedCategory <em>Added Category</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration()
- * @model extendedMetaData="name='MethodConfiguration' kind='elementOnly'"
- * @generated
- */
-public interface MethodConfiguration extends MethodUnit {
-	/**
-	 * Returns the value of the '<em><b>Base Configuration</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Base Configuration</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>Base Configuration</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration_BaseConfiguration()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='BaseConfiguration'"
-	 * @generated
-	 */
-	EList getBaseConfiguration();
-
-	/**
-	 * Returns the value of the '<em><b>Method Plugin Selection</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Plugin Selection</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>Method Plugin Selection</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration_MethodPluginSelection()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='MethodPluginSelection'"
-	 * @generated
-	 */
-	EList getMethodPluginSelection();
-
-	/**
-	 * Returns the value of the '<em><b>Method Package Selection</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Package Selection</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>Method Package Selection</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration_MethodPackageSelection()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='MethodPackageSelection'"
-	 * @generated
-	 */
-	EList getMethodPackageSelection();
-
-	/**
-	 * Returns the value of the '<em><b>Default View</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default View</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default View</em>' attribute.
-	 * @see #setDefaultView(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration_DefaultView()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='DefaultView'"
-	 * @generated
-	 */
-	String getDefaultView();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getDefaultView <em>Default View</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default View</em>' attribute.
-	 * @see #getDefaultView()
-	 * @generated
-	 */
-	void setDefaultView(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Process View</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Process View</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>Process View</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration_ProcessView()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ProcessView'"
-	 * @generated
-	 */
-	EList getProcessView();
-
-	/**
-	 * Returns the value of the '<em><b>Subtracted Category</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Subtracted Category</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>Subtracted Category</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration_SubtractedCategory()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='SubtractedCategory'"
-	 * @generated
-	 */
-	EList getSubtractedCategory();
-
-	/**
-	 * Returns the value of the '<em><b>Added Category</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Added Category</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>Added Category</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodConfiguration_AddedCategory()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='AddedCategory'"
-	 * @generated
-	 */
-	EList getAddedCategory();
-
-} // MethodConfiguration
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodElement.java
deleted file mode 100644
index cd20b09..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodElement.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodElement.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * The root generalization for all UMA Method Elements.  Defines a common set of attributes inherited by all UMA Method Elements.  Method Element itself is derived from Packageable Element from the UML 2.0 Infrastructure.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElement#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElement#getOwnedRule <em>Owned Rule</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElement#getMethodElementProperty <em>Method Element Property</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElement#getBriefDescription <em>Brief Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElement#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElement#getOrderingGuide <em>Ordering Guide</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElement#isSuppressed <em>Suppressed</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement()
- * @model extendedMetaData="name='MethodElement' kind='elementOnly'"
- * @generated
- */
-public interface MethodElement extends PackageableElement {
-	/**
-	 * Returns the value of the '<em><b>Group</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group</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>Group</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement_Group()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:1'"
-	 * @generated
-	 */
-	FeatureMap getGroup();
-
-	/**
-	 * Returns the value of the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Constraint}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Defines the packaging rules for this Method Element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Owned Rule</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement_OwnedRule()
-	 * @model type="org.eclipse.epf.xml.uma.Constraint" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='OwnedRule' group='#group:1'"
-	 * @generated
-	 */
-	EList getOwnedRule();
-
-	/**
-	 * Returns the value of the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.MethodElementProperty}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Element Property</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>Method Element Property</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement_MethodElementProperty()
-	 * @model type="org.eclipse.epf.xml.uma.MethodElementProperty" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MethodElementProperty' group='#group:1'"
-	 * @generated
-	 */
-	EList getMethodElementProperty();
-
-	/**
-	 * Returns the value of the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every instance of Method Element shall be briefly described with one or two sentences summarizing the element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Brief Description</em>' attribute.
-	 * @see #setBriefDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement_BriefDescription()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='briefDescription'"
-	 * @generated
-	 */
-	String getBriefDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodElement#getBriefDescription <em>Brief Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Brief Description</em>' attribute.
-	 * @see #getBriefDescription()
-	 * @generated
-	 */
-	void setBriefDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every instance of Method Element has a global unique id.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement_Id()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='id'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodElement#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Used for CASE tool realizations of this model to contain information about layout and ordering of the method element and its parts.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Ordering Guide</em>' attribute.
-	 * @see #setOrderingGuide(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement_OrderingGuide()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='orderingGuide'"
-	 * @generated
-	 */
-	String getOrderingGuide();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodElement#getOrderingGuide <em>Ordering Guide</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ordering Guide</em>' attribute.
-	 * @see #getOrderingGuide()
-	 * @generated
-	 */
-	void setOrderingGuide(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * If a Variability Element is derived from another Variability Element using the "extends" Variability Specialization, then this attribute can be used to suppress inherited Method Elements that were part of the based-on Variability Element, which can be any type of Method Element.  In other words, if this attribute is set to true on a Method Element that has the same name than an inherited method element then it will not be regarded as inherited at all.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Suppressed</em>' attribute.
-	 * @see #isSetSuppressed()
-	 * @see #unsetSuppressed()
-	 * @see #setSuppressed(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElement_Suppressed()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='suppressed'"
-	 * @generated
-	 */
-	boolean isSuppressed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodElement#isSuppressed <em>Suppressed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suppressed</em>' attribute.
-	 * @see #isSetSuppressed()
-	 * @see #unsetSuppressed()
-	 * @see #isSuppressed()
-	 * @generated
-	 */
-	void setSuppressed(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.MethodElement#isSuppressed <em>Suppressed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetSuppressed()
-	 * @see #isSuppressed()
-	 * @see #setSuppressed(boolean)
-	 * @generated
-	 */
-	void unsetSuppressed();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.MethodElement#isSuppressed <em>Suppressed</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Suppressed</em>' attribute is set.
-	 * @see #unsetSuppressed()
-	 * @see #isSuppressed()
-	 * @see #setSuppressed(boolean)
-	 * @generated
-	 */
-	boolean isSetSuppressed();
-
-} // MethodElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodElementProperty.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodElementProperty.java
deleted file mode 100644
index d917274..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodElementProperty.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodElementProperty.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Element Property</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodElementProperty#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElementProperty()
- * @model extendedMetaData="name='MethodElementProperty' kind='empty'"
- * @generated
- */
-public interface MethodElementProperty extends PackageableElement {
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodElementProperty_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='value'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodElementProperty#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // MethodElementProperty
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodLibrary.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodLibrary.java
deleted file mode 100644
index 56cd08a..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodLibrary.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodLibrary.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Library</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Method Library is a physical container for Method Plugins and Method Configuration definitions.  All Method Elements are stored in a Method Library.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodLibrary#getMethodPlugin <em>Method Plugin</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodLibrary#getMethodConfiguration <em>Method Configuration</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodLibrary#getTool <em>Tool</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodLibrary()
- * @model extendedMetaData="name='MethodLibrary' kind='elementOnly'"
- * @generated
- */
-public interface MethodLibrary extends MethodUnit {
-	/**
-	 * Returns the value of the '<em><b>Method Plugin</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.MethodPlugin}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Plugin</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>Method Plugin</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodLibrary_MethodPlugin()
-	 * @model type="org.eclipse.epf.xml.uma.MethodPlugin" containment="true"
-	 *        extendedMetaData="kind='element' name='MethodPlugin'"
-	 * @generated
-	 */
-	EList getMethodPlugin();
-
-	/**
-	 * Returns the value of the '<em><b>Method Configuration</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.MethodConfiguration}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Configuration</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>Method Configuration</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodLibrary_MethodConfiguration()
-	 * @model type="org.eclipse.epf.xml.uma.MethodConfiguration" containment="true"
-	 *        extendedMetaData="kind='element' name='MethodConfiguration'"
-	 * @generated
-	 */
-	EList getMethodConfiguration();
-
-	/**
-	 * Returns the value of the '<em><b>Tool</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tool</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The tool that generated the XML file.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Tool</em>' attribute.
-	 * @see #setTool(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodLibrary_Tool()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='tool'"
-	 * @generated
-	 */
-	String getTool();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodLibrary#getTool <em>Tool</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tool</em>' attribute.
-	 * @see #getTool()
-	 * @generated
-	 */
-	void setTool(String value);
-
-} // MethodLibrary
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodPackage.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodPackage.java
deleted file mode 100644
index e77fae6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodPackage.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodPackage.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An abstract class for packaging Method Elements.  All Method Elements shall be located in exactly one of Method Package's concrete specializations (e.g. Content Package).   Method Package defines common properties for all of its specializations. Elements are organized in Method Packages to structure large scale of method content and processes as well as to define a mechanism for reuse.  Method Elements from one package can reuse element from other packages by defining a reusedPackages link.  For example, a work product defined in one package can be used as an input for Tasks defined in other packages.  By reusing it from one common place (i.e. the package in which it has been defined) ensures that no redundant definitions of the same elements are required.  Also maintenance of method content is greatly improved as changes can be performed in only one place.  Note, that other packages will introduce more specializations of Method Package, e.g. Process Package and Process Component.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodPackage#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodPackage#getReusedPackage <em>Reused Package</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodPackage#getMethodPackage <em>Method Package</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodPackage#isGlobal <em>Global</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPackage()
- * @model extendedMetaData="name='MethodPackage' kind='elementOnly'"
- * @generated
- */
-public interface MethodPackage extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Group1</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group1</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>Group1</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPackage_Group1()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:8'"
-	 * @generated
-	 */
-	FeatureMap getGroup1();
-
-	/**
-	 * Returns the value of the '<em><b>Reused Package</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reused Package</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>Reused Package</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPackage_ReusedPackage()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ReusedPackage' group='#group:8'"
-	 * @generated
-	 */
-	EList getReusedPackage();
-
-	/**
-	 * Returns the value of the '<em><b>Method Package</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.MethodPackage}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Package</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>Method Package</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPackage_MethodPackage()
-	 * @model type="org.eclipse.epf.xml.uma.MethodPackage" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MethodPackage' group='#group:8'"
-	 * @generated
-	 */
-	EList getMethodPackage();
-
-	/**
-	 * Returns the value of the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Method Packages can have a global scope.  This means that every element of every other Method Package can see the global package's contents.  Global Method Packages are primarily used to store commonly used category definitions such as for Disciplines or Domains, which are used by many Task and Work Products respectively.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Global</em>' attribute.
-	 * @see #isSetGlobal()
-	 * @see #unsetGlobal()
-	 * @see #setGlobal(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPackage_Global()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='global'"
-	 * @generated
-	 */
-	boolean isGlobal();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodPackage#isGlobal <em>Global</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Global</em>' attribute.
-	 * @see #isSetGlobal()
-	 * @see #unsetGlobal()
-	 * @see #isGlobal()
-	 * @generated
-	 */
-	void setGlobal(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.MethodPackage#isGlobal <em>Global</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetGlobal()
-	 * @see #isGlobal()
-	 * @see #setGlobal(boolean)
-	 * @generated
-	 */
-	void unsetGlobal();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.MethodPackage#isGlobal <em>Global</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Global</em>' attribute is set.
-	 * @see #unsetGlobal()
-	 * @see #isGlobal()
-	 * @see #setGlobal(boolean)
-	 * @generated
-	 */
-	boolean isSetGlobal();
-
-} // MethodPackage
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodPlugin.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodPlugin.java
deleted file mode 100644
index 01803cf..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodPlugin.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodPlugin.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Plugin</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Method Unit that represents a physical container for Method Packages.  It defines a granularity level for the modularization and organization of method content and processes.  A Method Plugin can extend many other Method Plugins and it can be extended by many Method Plugins.  It can also be used stand-alone, i.e. with no Extension relationship to other plug-ins.
- * Method Plugin conceptually represents a unit for configuration, modularization, extension, packaging, and deployment of method content and processes.  A Process Engineer shall design his Plugins and allocate his content to these Plugins with requirements for extensibility, modularity, reuse, and maintainability in mind.
- * Special extensibility mechanisms defined for the meta-classes Variability Element and Process Contribution allow Plugin content to directly contribute new content, replace existing content, or to cross-reference to any Content Element or Process within another Plugin that it extends.  Similar to UML 2.0's 'package merge' mechanism transformation interpretations, interpreting these Method Plugin mechanisms results into new extended Method Content and Processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodPlugin#getReferencedMethodPlugin <em>Referenced Method Plugin</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodPlugin#getMethodPackage <em>Method Package</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodPlugin#isUserChangeable <em>User Changeable</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPlugin()
- * @model extendedMetaData="name='MethodPlugin' kind='elementOnly'"
- * @generated
- */
-public interface MethodPlugin extends MethodUnit {
-	/**
-	 * Returns the value of the '<em><b>Referenced Method Plugin</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Method Plugin</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>Referenced Method Plugin</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPlugin_ReferencedMethodPlugin()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ReferencedMethodPlugin'"
-	 * @generated
-	 */
-	EList getReferencedMethodPlugin();
-
-	/**
-	 * Returns the value of the '<em><b>Method Package</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.MethodPackage}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Method Package</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>Method Package</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPlugin_MethodPackage()
-	 * @model type="org.eclipse.epf.xml.uma.MethodPackage" containment="true"
-	 *        extendedMetaData="kind='element' name='MethodPackage'"
-	 * @generated
-	 */
-	EList getMethodPackage();
-
-	/**
-	 * Returns the value of the '<em><b>User Changeable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>User Changeable</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>User Changeable</em>' attribute.
-	 * @see #isSetUserChangeable()
-	 * @see #unsetUserChangeable()
-	 * @see #setUserChangeable(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodPlugin_UserChangeable()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='userChangeable'"
-	 * @generated
-	 */
-	boolean isUserChangeable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodPlugin#isUserChangeable <em>User Changeable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>User Changeable</em>' attribute.
-	 * @see #isSetUserChangeable()
-	 * @see #unsetUserChangeable()
-	 * @see #isUserChangeable()
-	 * @generated
-	 */
-	void setUserChangeable(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.MethodPlugin#isUserChangeable <em>User Changeable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetUserChangeable()
-	 * @see #isUserChangeable()
-	 * @see #setUserChangeable(boolean)
-	 * @generated
-	 */
-	void unsetUserChangeable();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.MethodPlugin#isUserChangeable <em>User Changeable</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>User Changeable</em>' attribute is set.
-	 * @see #unsetUserChangeable()
-	 * @see #isUserChangeable()
-	 * @see #setUserChangeable(boolean)
-	 * @generated
-	 */
-	boolean isSetUserChangeable();
-
-} // MethodPlugin
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodUnit.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodUnit.java
deleted file mode 100644
index 9b92033..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/MethodUnit.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodUnit.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Method Unit</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Method Element that shall be maintained in a Method Library as a separate unit of control.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodUnit#getCopyright <em>Copyright</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodUnit#getAuthors <em>Authors</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodUnit#getChangeDate <em>Change Date</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodUnit#getChangeDescription <em>Change Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.MethodUnit#getVersion <em>Version</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodUnit()
- * @model extendedMetaData="name='MethodUnit' kind='elementOnly'"
- * @generated
- */
-public interface MethodUnit extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Copyright</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Copyright</em>' attribute.
-	 * @see #setCopyright(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodUnit_Copyright()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Copyright'"
-	 * @generated
-	 */
-	String getCopyright();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodUnit#getCopyright <em>Copyright</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Copyright</em>' attribute.
-	 * @see #getCopyright()
-	 * @generated
-	 */
-	void setCopyright(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Method Unit is being created and owned by an author or authoring team.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Authors</em>' attribute.
-	 * @see #setAuthors(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodUnit_Authors()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='authors'"
-	 * @generated
-	 */
-	String getAuthors();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodUnit#getAuthors <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Authors</em>' attribute.
-	 * @see #getAuthors()
-	 * @generated
-	 */
-	void setAuthors(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date the last change that resulted into this version has been made.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Change Date</em>' attribute.
-	 * @see #setChangeDate(Object)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodUnit_ChangeDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='attribute' name='changeDate'"
-	 * @generated
-	 */
-	Object getChangeDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodUnit#getChangeDate <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Change Date</em>' attribute.
-	 * @see #getChangeDate()
-	 * @generated
-	 */
-	void setChangeDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The description of the last change that resulted into this version.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Change Description</em>' attribute.
-	 * @see #setChangeDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodUnit_ChangeDescription()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='changeDescription'"
-	 * @generated
-	 */
-	String getChangeDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodUnit#getChangeDescription <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Change Description</em>' attribute.
-	 * @see #getChangeDescription()
-	 * @generated
-	 */
-	void setChangeDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Package has a version number used to track changes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Version</em>' attribute.
-	 * @see #setVersion(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getMethodUnit_Version()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='version'"
-	 * @generated
-	 */
-	String getVersion();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.MethodUnit#getVersion <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Version</em>' attribute.
-	 * @see #getVersion()
-	 * @generated
-	 */
-	void setVersion(String value);
-
-} // MethodUnit
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Milestone.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Milestone.java
deleted file mode 100644
index 917f81f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Milestone.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Milestone.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Milestone</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Breakdown Element that describes a significant event in a development project, such as a major decision, completion of a deliverable, or meeting of a major dependency (like completion of a project phase).  Because, Milestone is commonly used to refer to both the event itself and the point in time at which the event is scheduled to happen, it is modeled as a Breakdown Element (i.e. it appears as part of a breakdown structure).
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getMilestone()
- * @model extendedMetaData="name='Milestone' kind='elementOnly'"
- * @generated
- */
-public interface Milestone extends WorkBreakdownElement {
-} // Milestone
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/NamedElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/NamedElement.java
deleted file mode 100644
index 75c39ab..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/NamedElement.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: NamedElement.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Named Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A UML 2.0 meta-class Named Element.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.NamedElement#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getNamedElement()
- * @model extendedMetaData="name='NamedElement' kind='empty'"
- * @generated
- */
-public interface NamedElement extends Element {
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getNamedElement_Name()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='name'"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.NamedElement#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-} // NamedElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Outcome.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Outcome.java
deleted file mode 100644
index 0419d1c..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Outcome.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Outcome.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Outcome</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Work Product that describes intangible work products that are a result or state. Outcomes may also be used to describe work products that are not formally defined.  A key differentiator for outcomes against artifacts is that outcomes are not candidates for harvesting as reusable assets.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getOutcome()
- * @model extendedMetaData="name='Outcome' kind='elementOnly'"
- * @generated
- */
-public interface Outcome extends WorkProduct {
-} // Outcome
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PackageableElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PackageableElement.java
deleted file mode 100644
index 68857aa..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PackageableElement.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PackageableElement.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Packageable Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A UML 2.0 meta-class Packagable Element.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getPackageableElement()
- * @model extendedMetaData="name='PackageableElement' kind='empty'"
- * @generated
- */
-public interface PackageableElement extends NamedElement {
-} // PackageableElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Phase.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Phase.java
deleted file mode 100644
index ad522ec..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Phase.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Phase.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Phase</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Activity which prescribes pre-defined values for its instances for the attributes prefix ('Phase') and isRepeatable ('False').  It has been included into the meta-model for convenience and to provide a special stereotype, because it represents a very commonly used Activity type.
- * Phase represent a significant period in a project, ending with major management checkpoint, milestone or set of Deliverables.  It is included in the model as a predefined special Activity, because of its significance in defining breakdowns.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getPhase()
- * @model extendedMetaData="name='Phase' kind='elementOnly'"
- * @generated
- */
-public interface Phase extends Activity {
-} // Phase
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PlanningData.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PlanningData.java
deleted file mode 100644
index fa7d4a4..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PlanningData.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PlanningData.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Planning Data</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Process Element that adds planning data to Breakdown Elements when it is used for a Process Planning Template.  For Delivery Processes and Capability Patterns this class can either not be instantiated or populated with default data.
- * Planning Data factors out specific optional data needed for representing planning templates.  This association allows to access planning data if it is stored for the Breakdown Element.
- * (NOTE, THE ATTRIBUTES FOR THIS CLASS ARE NOT COMPLETE, YET)
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.PlanningData#getFinishDate <em>Finish Date</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.PlanningData#getRank <em>Rank</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.PlanningData#getStartDate <em>Start Date</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getPlanningData()
- * @model extendedMetaData="name='PlanningData' kind='elementOnly'"
- * @generated
- */
-public interface PlanningData extends ProcessElement {
-	/**
-	 * Returns the value of the '<em><b>Finish Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default finish date for a planed Task.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Finish Date</em>' attribute.
-	 * @see #setFinishDate(Object)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPlanningData_FinishDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='attribute' name='finishDate'"
-	 * @generated
-	 */
-	Object getFinishDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PlanningData#getFinishDate <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Finish Date</em>' attribute.
-	 * @see #getFinishDate()
-	 * @generated
-	 */
-	void setFinishDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Rank</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default rank for a planed Task.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Rank</em>' attribute.
-	 * @see #setRank(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPlanningData_Rank()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='rank'"
-	 * @generated
-	 */
-	String getRank();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PlanningData#getRank <em>Rank</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Rank</em>' attribute.
-	 * @see #getRank()
-	 * @generated
-	 */
-	void setRank(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The default start date for a planed Task.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Start Date</em>' attribute.
-	 * @see #setStartDate(Object)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPlanningData_StartDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='attribute' name='startDate'"
-	 * @generated
-	 */
-	Object getStartDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PlanningData#getStartDate <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Start Date</em>' attribute.
-	 * @see #getStartDate()
-	 * @generated
-	 */
-	void setStartDate(Object value);
-
-} // PlanningData
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Practice.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Practice.java
deleted file mode 100644
index 51dac60..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Practice.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Practice.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Practice</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of guidance that represents a proven way or strategy of doing work to achieve a goal that has a positive impact on work product or process quality.  Practices are defined orthogonal to methods and processes.  They could summarize aspects that impact many different parts of a method or specific processes.  Examples for practices would be "Manage Risks", "Continuously verify quality", "Architecture-centric and component-based development", etc.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Practice#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Practice#getActivityReference <em>Activity Reference</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Practice#getContentReference <em>Content Reference</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Practice#getSubPractice <em>Sub Practice</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getPractice()
- * @model extendedMetaData="name='Practice' kind='elementOnly'"
- * @generated
- */
-public interface Practice extends Guidance {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPractice_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Activity Reference</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Activity Reference</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>Activity Reference</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPractice_ActivityReference()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ActivityReference' group='#group:22'"
-	 * @generated
-	 */
-	EList getActivityReference();
-
-	/**
-	 * Returns the value of the '<em><b>Content Reference</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Content Reference</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>Content Reference</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPractice_ContentReference()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ContentReference' group='#group:22'"
-	 * @generated
-	 */
-	EList getContentReference();
-
-	/**
-	 * Returns the value of the '<em><b>Sub Practice</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Practice}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Practice</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>Sub Practice</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPractice_SubPractice()
-	 * @model type="org.eclipse.epf.xml.uma.Practice" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='SubPractice' group='#group:22'"
-	 * @generated
-	 */
-	EList getSubPractice();
-
-} // Practice
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PracticeDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PracticeDescription.java
deleted file mode 100644
index 1724c01..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/PracticeDescription.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PracticeDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Practice Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Content Description that is used to store the textual description for a Practice.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.PracticeDescription#getAdditionalInfo <em>Additional Info</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.PracticeDescription#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.PracticeDescription#getBackground <em>Background</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.PracticeDescription#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.PracticeDescription#getLevelsOfAdoption <em>Levels Of Adoption</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.PracticeDescription#getProblem <em>Problem</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getPracticeDescription()
- * @model extendedMetaData="name='PracticeDescription' kind='elementOnly'"
- * @generated
- */
-public interface PracticeDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Additional Info</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Any additional Information not covered by the other attributes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Additional Info</em>' attribute.
-	 * @see #setAdditionalInfo(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPracticeDescription_AdditionalInfo()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='AdditionalInfo'"
-	 * @generated
-	 */
-	String getAdditionalInfo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PracticeDescription#getAdditionalInfo <em>Additional Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Additional Info</em>' attribute.
-	 * @see #getAdditionalInfo()
-	 * @generated
-	 */
-	void setAdditionalInfo(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Application</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes how the Practice is being applied or introduced into the context described in background.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Application</em>' attribute.
-	 * @see #setApplication(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPracticeDescription_Application()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Application'"
-	 * @generated
-	 */
-	String getApplication();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PracticeDescription#getApplication <em>Application</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Application</em>' attribute.
-	 * @see #getApplication()
-	 * @generated
-	 */
-	void setApplication(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Background</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Elaboration on the background and the context in which the problem occurs and where the solution described by this Practice will fit in.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Background</em>' attribute.
-	 * @see #setBackground(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPracticeDescription_Background()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Background'"
-	 * @generated
-	 */
-	String getBackground();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PracticeDescription#getBackground <em>Background</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Background</em>' attribute.
-	 * @see #getBackground()
-	 * @generated
-	 */
-	void setBackground(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A summary of the overall goals to be addressed by the Practice.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Goals</em>' attribute.
-	 * @see #setGoals(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPracticeDescription_Goals()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Goals'"
-	 * @generated
-	 */
-	String getGoals();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PracticeDescription#getGoals <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Goals</em>' attribute.
-	 * @see #getGoals()
-	 * @generated
-	 */
-	void setGoals(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Levels Of Adoption</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Outlines the different forms or variants in which the practice could be realized. (e.g. full adoption verus a partial adoption of the Practice)
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Levels Of Adoption</em>' attribute.
-	 * @see #setLevelsOfAdoption(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPracticeDescription_LevelsOfAdoption()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='LevelsOfAdoption'"
-	 * @generated
-	 */
-	String getLevelsOfAdoption();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PracticeDescription#getLevelsOfAdoption <em>Levels Of Adoption</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Levels Of Adoption</em>' attribute.
-	 * @see #getLevelsOfAdoption()
-	 * @generated
-	 */
-	void setLevelsOfAdoption(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Problem</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * A description of the problem the Practice addresses.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Problem</em>' attribute.
-	 * @see #setProblem(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getPracticeDescription_Problem()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Problem'"
-	 * @generated
-	 */
-	String getProblem();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.PracticeDescription#getProblem <em>Problem</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Problem</em>' attribute.
-	 * @see #getProblem()
-	 * @generated
-	 */
-	void setProblem(String value);
-
-} // PracticeDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Process.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Process.java
deleted file mode 100644
index 0716b42..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Process.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Process.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Activity that describes a structure for particular types of development projects.  To perform such a development project a Processes would be 'instantiated' and adapted for the specific situation.  Process is an abstract class and this meta-model defines different special types of Processes for different process management applications and different situations of process reuse.  Every Process comprises of and is the top-level element of an n-level breakdown structure using the Nesting association defined on Activity.
- * Core Method Content provides step-by-step explanations, describing how very specific development goals are achieved independent of the placement of these steps within a development lifecycle.  Processes take these method elements and relate them into semi-ordered sequences that are customized to specific types of projects.  Thus, a process is a set of partially ordered work descriptions intended to reach a higher development goal, such as the release of a specific software system.  A process and the process meta-model structure defined in this specification focuses on the lifecycle and the sequencing of work in breakdown structures.  To achieve this it uses the Descriptor concept referencing method content and allowing defining time-specific customizations of the referenced content (e.g. defining a focus on different steps of the same Task and providing input Work Products in different states within the different Phases of a process lifecycle in which the same Task is performed).
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Process#getIncludesPattern <em>Includes Pattern</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Process#getDefaultContext <em>Default Context</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Process#getValidContext <em>Valid Context</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Process#getDiagramURI <em>Diagram URI</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getProcess()
- * @model extendedMetaData="name='Process' kind='elementOnly'"
- * @generated
- */
-public interface Process extends Activity {
-	/**
-	 * Returns the value of the '<em><b>Includes Pattern</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Includes Pattern</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>Includes Pattern</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcess_IncludesPattern()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='IncludesPattern'"
-	 * @generated
-	 */
-	EList getIncludesPattern();
-
-	/**
-	 * Returns the value of the '<em><b>Default Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Context</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Context</em>' attribute.
-	 * @see #setDefaultContext(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcess_DefaultContext()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='DefaultContext'"
-	 * @generated
-	 */
-	String getDefaultContext();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Process#getDefaultContext <em>Default Context</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Context</em>' attribute.
-	 * @see #getDefaultContext()
-	 * @generated
-	 */
-	void setDefaultContext(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Valid Context</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Valid Context</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>Valid Context</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcess_ValidContext()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ValidContext'"
-	 * @generated
-	 */
-	EList getValidContext();
-
-	/**
-	 * Returns the value of the '<em><b>Diagram URI</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The URI of the diagram file associated with the process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Diagram URI</em>' attribute.
-	 * @see #setDiagramURI(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcess_DiagramURI()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='diagramURI'"
-	 * @generated
-	 */
-	String getDiagramURI();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Process#getDiagramURI <em>Diagram URI</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Diagram URI</em>' attribute.
-	 * @see #getDiagramURI()
-	 * @generated
-	 */
-	void setDiagramURI(String value);
-
-} // Process
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessComponent.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessComponent.java
deleted file mode 100644
index c6c60f1..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessComponent.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessComponent.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Component</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Process Package that applies the principles of encapsulation.  A Process Component realizes one or more Interfaces which specify inputs and outputs of the component. There might be many components realizing the same interfaces, but using different techniques to achieve similar outputs for similar inputs.  Whereas the Component Interfaces represent component specifications (black box descriptions of the component), good candidates for component realizations can be found in Capability Patterns (white box descriptions for the component).
- * UMA supports replaceable and reusable Process Components realizing the principles of encapsulation. Certain situations in a software development project might require that concrete realizations of parts of the process remain undecided or will be decided by the executing team itself (e.g. in outsourcing situations).  UMA provides a unique component concept defining interfaces for work product input and output, allowing treating the actual definition of the work that produces the outputs as a "black box".  At any point during a project the component "realization" detailing the work can be added to the process.  The component approach also allows that different styles or techniques of doing work can be replaced with one another.  For example, a software code output of a component could be produced with a model-driven development or a code-centric technique.  The component concept encapsulates the actual work and lets the development team choose the appropriate technique and fill the component's realization with their choice of Activities that produce the required outputs.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponent#getCopyright <em>Copyright</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponent#getInterface <em>Interface</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponent#getProcess <em>Process</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponent#getAuthors <em>Authors</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponent#getChangeDate <em>Change Date</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponent#getChangeDescription <em>Change Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponent#getVersion <em>Version</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent()
- * @model extendedMetaData="name='ProcessComponent' kind='elementOnly'"
- * @generated
- */
-public interface ProcessComponent extends ProcessPackage {
-	/**
-	 * Returns the value of the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Copyright</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Copyright</em>' attribute.
-	 * @see #setCopyright(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent_Copyright()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Copyright'"
-	 * @generated
-	 */
-	String getCopyright();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessComponent#getCopyright <em>Copyright</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Copyright</em>' attribute.
-	 * @see #getCopyright()
-	 * @generated
-	 */
-	void setCopyright(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Interface</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Interface</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>Interface</em>' containment reference.
-	 * @see #setInterface(ProcessComponentInterface)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent_Interface()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='Interface'"
-	 * @generated
-	 */
-	ProcessComponentInterface getInterface();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessComponent#getInterface <em>Interface</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Interface</em>' containment reference.
-	 * @see #getInterface()
-	 * @generated
-	 */
-	void setInterface(ProcessComponentInterface value);
-
-	/**
-	 * Returns the value of the '<em><b>Process</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Process</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>Process</em>' containment reference.
-	 * @see #setProcess(org.eclipse.epf.xml.uma.Process)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent_Process()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='Process'"
-	 * @generated
-	 */
-	org.eclipse.epf.xml.uma.Process getProcess();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessComponent#getProcess <em>Process</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Process</em>' containment reference.
-	 * @see #getProcess()
-	 * @generated
-	 */
-	void setProcess(org.eclipse.epf.xml.uma.Process value);
-
-	/**
-	 * Returns the value of the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Method Unit is being created and owned by an author or authoring team.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Authors</em>' attribute.
-	 * @see #setAuthors(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent_Authors()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='authors'"
-	 * @generated
-	 */
-	String getAuthors();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessComponent#getAuthors <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Authors</em>' attribute.
-	 * @see #getAuthors()
-	 * @generated
-	 */
-	void setAuthors(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The date the last change that resulted into this version has been made.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Change Date</em>' attribute.
-	 * @see #setChangeDate(Object)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent_ChangeDate()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.DateTime"
-	 *        extendedMetaData="kind='attribute' name='changeDate'"
-	 * @generated
-	 */
-	Object getChangeDate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessComponent#getChangeDate <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Change Date</em>' attribute.
-	 * @see #getChangeDate()
-	 * @generated
-	 */
-	void setChangeDate(Object value);
-
-	/**
-	 * Returns the value of the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The description of the last change that resulted into this version.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Change Description</em>' attribute.
-	 * @see #setChangeDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent_ChangeDescription()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='changeDescription'"
-	 * @generated
-	 */
-	String getChangeDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessComponent#getChangeDescription <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Change Description</em>' attribute.
-	 * @see #getChangeDescription()
-	 * @generated
-	 */
-	void setChangeDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Package has a version number used to track changes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Version</em>' attribute.
-	 * @see #setVersion(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponent_Version()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='version'"
-	 * @generated
-	 */
-	String getVersion();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessComponent#getVersion <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Version</em>' attribute.
-	 * @see #getVersion()
-	 * @generated
-	 */
-	void setVersion(String value);
-
-} // ProcessComponent
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessComponentInterface.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessComponentInterface.java
deleted file mode 100644
index 2475117..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessComponentInterface.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessComponentInterface.java,v 1.1 2008/01/15 08:52:08 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Component Interface</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Comprises of a list of interface specifications (similar to operation declarations) that express inputs and outputs for a process component.  These interface specifications are expressed using Task Descriptors which are not linked to Tasks that are related to Work Product Descriptors as well as optional a Role Descriptor.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponentInterface#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponentInterface#getInterfaceSpecification <em>Interface Specification</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessComponentInterface#getInterfaceIO <em>Interface IO</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponentInterface()
- * @model extendedMetaData="name='ProcessComponentInterface' kind='elementOnly'"
- * @generated
- */
-public interface ProcessComponentInterface extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Group1</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group1</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>Group1</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponentInterface_Group1()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:20'"
-	 * @generated
-	 */
-	FeatureMap getGroup1();
-
-	/**
-	 * Returns the value of the '<em><b>Interface Specification</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.TaskDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Interface Specification</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>Interface Specification</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponentInterface_InterfaceSpecification()
-	 * @model type="org.eclipse.epf.xml.uma.TaskDescriptor" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='InterfaceSpecification' group='#group:20'"
-	 * @generated
-	 */
-	EList getInterfaceSpecification();
-
-	/**
-	 * Returns the value of the '<em><b>Interface IO</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.WorkProductDescriptor}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Interface IO</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>Interface IO</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessComponentInterface_InterfaceIO()
-	 * @model type="org.eclipse.epf.xml.uma.WorkProductDescriptor" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='InterfaceIO' group='#group:20'"
-	 * @generated
-	 */
-	EList getInterfaceIO();
-
-} // ProcessComponentInterface
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessDescription.java
deleted file mode 100644
index 185d3ab..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessDescription.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Activity Description that is used to store the textual description for a Process.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessDescription#getScope <em>Scope</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessDescription#getUsageNotes <em>Usage Notes</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessDescription()
- * @model extendedMetaData="name='ProcessDescription' kind='elementOnly'"
- * @generated
- */
-public interface ProcessDescription extends ActivityDescription {
-	/**
-	 * Returns the value of the '<em><b>Scope</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Defines the scope of the Process, i.e. which types of projects does it address and which not.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Scope</em>' attribute.
-	 * @see #setScope(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessDescription_Scope()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Scope'"
-	 * @generated
-	 */
-	String getScope();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessDescription#getScope <em>Scope</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Scope</em>' attribute.
-	 * @see #getScope()
-	 * @generated
-	 */
-	void setScope(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Usage Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Any additional notes on how to apply and instantiate this process for a project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Usage Notes</em>' attribute.
-	 * @see #setUsageNotes(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessDescription_UsageNotes()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='UsageNotes'"
-	 * @generated
-	 */
-	String getUsageNotes();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.ProcessDescription#getUsageNotes <em>Usage Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Usage Notes</em>' attribute.
-	 * @see #getUsageNotes()
-	 * @generated
-	 */
-	void setUsageNotes(String value);
-
-} // ProcessDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessElement.java
deleted file mode 100644
index 505a36d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessElement.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessElement.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Describable Element that represents an abstract generalization for all elements defined in the Process package.
- * Process Elements represents Process specific elements that are supposed to be managed in Process Packages.  The separation of Process Element from Content Element allows to clearly distinguish between pure method content from content that is represented in processes. 
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessElement()
- * @model extendedMetaData="name='ProcessElement' kind='elementOnly'"
- * @generated
- */
-public interface ProcessElement extends DescribableElement {
-} // ProcessElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessPackage.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessPackage.java
deleted file mode 100644
index b6b9946..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessPackage.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessPackage.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Package</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Method Package that contains Process Elements, only.
- * A key separation of concerns in UMA is the distinction between Method Content and Process.  This separation is enforced by special package types, which do not allow the mixing of method content with processes.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessPackage#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessPackage#getProcessElement <em>Process Element</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessPackage()
- * @model extendedMetaData="name='ProcessPackage' kind='elementOnly'"
- * @generated
- */
-public interface ProcessPackage extends MethodPackage {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessPackage_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:12'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Process Element</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.ProcessElement}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Process Element</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>Process Element</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessPackage_ProcessElement()
-	 * @model type="org.eclipse.epf.xml.uma.ProcessElement" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ProcessElement' group='#group:12'"
-	 * @generated
-	 */
-	EList getProcessElement();
-
-} // ProcessPackage
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessPlanningTemplate.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessPlanningTemplate.java
deleted file mode 100644
index dd1384e..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ProcessPlanningTemplate.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessPlanningTemplate.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Process Planning Template</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Process that is prepared for instantiation by a project planning tool.  Typically, it is created based on a Process such as a Delivery Process as a whole (e.g. in case of a waterfall-based development approach) or in parts (e.g. in case of an iterative development approach).
- * A Process Planning Template represents a partially finished plan for a concrete project.  It uses the same information structures as all other Process Types to represent templates for project plans.  However, certain planning decisions have already been applied to the template as well as information has been removed and/or reformatted to be ready for export to a specific planning tool.  Examples for such decisions are: a template has been created to represent a plan for a particular Iteration in an iterative development project, which fr example distinguishes early from late iterations in the Elaboration phase of a project; if the targeted planning tool cannot represent input and output of Task, then these have been removed from the structure; certain repetitions have been already applied, e.g. stating that a cycle of specific Task grouped in an Activity have to be repeated n-times; etc.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessPlanningTemplate#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.ProcessPlanningTemplate#getBaseProcess <em>Base Process</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessPlanningTemplate()
- * @model extendedMetaData="name='ProcessPlanningTemplate' kind='elementOnly'"
- * @generated
- */
-public interface ProcessPlanningTemplate extends org.eclipse.epf.xml.uma.Process {
-	/**
-	 * Returns the value of the '<em><b>Group3</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group3</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>Group3</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessPlanningTemplate_Group3()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:44'"
-	 * @generated
-	 */
-	FeatureMap getGroup3();
-
-	/**
-	 * Returns the value of the '<em><b>Base Process</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Base Process</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>Base Process</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getProcessPlanningTemplate_BaseProcess()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='BaseProcess' group='#group:44'"
-	 * @generated
-	 */
-	EList getBaseProcess();
-
-} // ProcessPlanningTemplate
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Report.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Report.java
deleted file mode 100644
index 5b4888b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Report.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Report.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Report</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A predefined template of a result that is generated on the basis of other work products as an output from some form of tool automation. An example for a report would be a use case model survey, which is generated by extracting diagram information from a graphical model and textual information from documents and combines these two types of information into a report.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getReport()
- * @model extendedMetaData="name='Report' kind='elementOnly'"
- * @generated
- */
-public interface Report extends Guidance {
-} // Report
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ReusableAsset.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ReusableAsset.java
deleted file mode 100644
index 244961d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ReusableAsset.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ReusableAsset.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Reusable Asset</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of guidance that provides a solution to a problem for a given context. The asset may have a variability point, which is a location in the asset that may have a value provided or customized by the asset consumer. The asset has rules for usage which are the instructions describing
- * how the asset should be used.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getReusableAsset()
- * @model extendedMetaData="name='ReusableAsset' kind='elementOnly'"
- * @generated
- */
-public interface ReusableAsset extends Guidance {
-} // ReusableAsset
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Roadmap.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Roadmap.java
deleted file mode 100644
index d406784..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Roadmap.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Roadmap.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Roadmap</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of Guidance which is only related to Activates and therefore has been added by this package to the list of Guidance Types rather than listed in the Guidance Types package.  A Roadmap represents a linear walkthrough of an Activity, typically a Process.
- * An instance of a Roadmap represents important documentation for the Activity or Process it is related to.  Often a complex Activity such as a Process can be much easier understood by providing a walkthrough with a linear thread of a typical instantiation of this Activity.  In addition to making the process practitioner understand how work in the process is being performed, a Roadmap provides additional information about how Activities and Tasks relate to each other over time.  Roadmaps are also used to show how specific aspects are distributed over a whole process providing a kind of filter on the process for this information.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getRoadmap()
- * @model extendedMetaData="name='Roadmap' kind='elementOnly'"
- * @generated
- */
-public interface Roadmap extends Guidance {
-} // Roadmap
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Role.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Role.java
deleted file mode 100644
index 5b11ef6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Role.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Role.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Content Element that defines a set of related skills, competencies, and responsibilities.  Roles are used by Tasks to define who performs them as well as define a set of work products they are responsible for.  
- * A Role defines a set of related skills, competencies, and responsibilities of an individual or a set of individuals.  Roles are not individuals or resources.  Individual members of the development organization will wear different hats, or perform different roles. The mapping from individual to role, performed by the project manager when planning and staffing for a project, allows different individuals to act as several different roles, and for a role to be played by several individuals.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Role#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Role#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getRole()
- * @model extendedMetaData="name='Role' kind='elementOnly'"
- * @generated
- */
-public interface Role extends ContentElement {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRole_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Responsible For</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Responsible For</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>Responsible For</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRole_ResponsibleFor()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ResponsibleFor' group='#group:22'"
-	 * @generated
-	 */
-	EList getResponsibleFor();
-
-} // Role
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleDescription.java
deleted file mode 100644
index 846420b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleDescription.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleDescription.java,v 1.1 2008/01/15 08:52:06 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Content Description that is used to store the textual description for a Role.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleDescription#getAssignmentApproaches <em>Assignment Approaches</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleDescription#getSkills <em>Skills</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleDescription#getSynonyms <em>Synonyms</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleDescription()
- * @model extendedMetaData="name='RoleDescription' kind='elementOnly'"
- * @generated
- */
-public interface RoleDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Assignment Approaches</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Provides guidance on for assigning individuals to the Role in terms of what other roles these individuals could perform and what responsibility different individuals assigned to this role might have.  The guidance can also describe different assignment approaches for different types of projects, e.g. for large versus small teams where individuals could be allocated to roles full time versus sharing roles within the team.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Assignment Approaches</em>' attribute.
-	 * @see #setAssignmentApproaches(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleDescription_AssignmentApproaches()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='AssignmentApproaches'"
-	 * @generated
-	 */
-	String getAssignmentApproaches();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.RoleDescription#getAssignmentApproaches <em>Assignment Approaches</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Assignment Approaches</em>' attribute.
-	 * @see #getAssignmentApproaches()
-	 * @generated
-	 */
-	void setAssignmentApproaches(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Skills</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Lists of set of required skills a person needs to possess to fulfill that Role.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Skills</em>' attribute.
-	 * @see #setSkills(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleDescription_Skills()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Skills'"
-	 * @generated
-	 */
-	String getSkills();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.RoleDescription#getSkills <em>Skills</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Skills</em>' attribute.
-	 * @see #getSkills()
-	 * @generated
-	 */
-	void setSkills(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Synonyms</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Lists synonyms, i.e. other names the Role might be referred by.  Tool support for the meta-model might support that a Role name can be consistently be replaced with one of its synonyms throught a Process.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Synonyms</em>' attribute.
-	 * @see #setSynonyms(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleDescription_Synonyms()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Synonyms'"
-	 * @generated
-	 */
-	String getSynonyms();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.RoleDescription#getSynonyms <em>Synonyms</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Synonyms</em>' attribute.
-	 * @see #getSynonyms()
-	 * @generated
-	 */
-	void setSynonyms(String value);
-
-} // RoleDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleDescriptor.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleDescriptor.java
deleted file mode 100644
index c16ecf7..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleDescriptor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleDescriptor.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Descriptor that represents a Role in the context of one specific Activity.  Every breakdown structure can define different relationships of Role Descriptors to Task Descriptors and Work Product Descriptors.  Therefore one Role can be represented by many Role Descriptors each within the context of an Activity with its own set of relationships.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleDescriptor#getRole <em>Role</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleDescriptor#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleDescriptor()
- * @model extendedMetaData="name='RoleDescriptor' kind='elementOnly'"
- * @generated
- */
-public interface RoleDescriptor extends Descriptor {
-	/**
-	 * Returns the value of the '<em><b>Role</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Role</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Role</em>' attribute.
-	 * @see #setRole(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleDescriptor_Role()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Role'"
-	 * @generated
-	 */
-	String getRole();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.RoleDescriptor#getRole <em>Role</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Role</em>' attribute.
-	 * @see #getRole()
-	 * @generated
-	 */
-	void setRole(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Responsible For</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Responsible For</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>Responsible For</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleDescriptor_ResponsibleFor()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ResponsibleFor'"
-	 * @generated
-	 */
-	EList getResponsibleFor();
-
-} // RoleDescriptor
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleSet.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleSet.java
deleted file mode 100644
index 376155a..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleSet.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleSet.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Set</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Organizes Roles into categories.  It is used to group roles together that have certain commonalities.  For example, the "Analysts" Role Set could group the "Business Process Analyst", "System Analyst", as well as "Requirements Specifier" roles.  All of these work with similar techniques and have overlapping skills, but are required as distinct roles for a method (e.g. the method the IBM Rational Unified Process is based on).
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleSet#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleSet#getRole <em>Role</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleSet()
- * @model extendedMetaData="name='RoleSet' kind='elementOnly'"
- * @generated
- */
-public interface RoleSet extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleSet_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Role</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Role</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>Role</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleSet_Role()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Role' group='#group:22'"
-	 * @generated
-	 */
-	EList getRole();
-
-} // RoleSet
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleSetGrouping.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleSetGrouping.java
deleted file mode 100644
index 33ef2fb..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/RoleSetGrouping.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleSetGrouping.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Role Set Grouping</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Role Sets can be categorized into Role Set Groupings.  For example, different methods might define similar Role Sets, which however need to be distinguished from each other on a global scale.  Thus, Role Set Groupings allow distinguishing, for example, Software Services Manager Role Sets from Software Development Organization Manager Role Sets.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleSetGrouping#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.RoleSetGrouping#getRoleSet <em>Role Set</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleSetGrouping()
- * @model extendedMetaData="name='RoleSetGrouping' kind='elementOnly'"
- * @generated
- */
-public interface RoleSetGrouping extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleSetGrouping_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Role Set</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Role Set</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>Role Set</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getRoleSetGrouping_RoleSet()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='RoleSet' group='#group:22'"
-	 * @generated
-	 */
-	EList getRoleSet();
-
-} // RoleSetGrouping
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Section.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Section.java
deleted file mode 100644
index 1d9433f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Section.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Section.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Section</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Method Element that represents structural subsections of a Content Description's sectionDescription attribute.  It is used for either large scale documentation of Content Elements organized into sections as well as to flexibly add new Sections to Content Elements using contribution variability added to the Section concept for Method Plug-ins.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Section#getSubSection <em>Sub Section</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Section#getPredecessor <em>Predecessor</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Section#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Section#getSectionName <em>Section Name</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Section#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Section#getVariabilityType <em>Variability Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getSection()
- * @model extendedMetaData="name='Section' kind='elementOnly'"
- * @generated
- */
-public interface Section extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Sub Section</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Section</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>Sub Section</em>' containment reference.
-	 * @see #setSubSection(Section)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getSection_SubSection()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='SubSection'"
-	 * @generated
-	 */
-	Section getSubSection();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Section#getSubSection <em>Sub Section</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Sub Section</em>' containment reference.
-	 * @see #getSubSection()
-	 * @generated
-	 */
-	void setSubSection(Section value);
-
-	/**
-	 * Returns the value of the '<em><b>Predecessor</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Predecessor</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Predecessor</em>' attribute.
-	 * @see #setPredecessor(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getSection_Predecessor()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Predecessor'"
-	 * @generated
-	 */
-	String getPredecessor();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Section#getPredecessor <em>Predecessor</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Predecessor</em>' attribute.
-	 * @see #getPredecessor()
-	 * @generated
-	 */
-	void setPredecessor(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attributes store the description text for a Content Description's Section.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Description</em>' attribute.
-	 * @see #setDescription(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getSection_Description()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Description'"
-	 * @generated
-	 */
-	String getDescription();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Section#getDescription <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Description</em>' attribute.
-	 * @see #getDescription()
-	 * @generated
-	 */
-	void setDescription(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Section Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Every Section has a name used for external presentation of the section, e.g. when published or when section heading are listed in a table of contents.  This attribute is similar to Presentation Name for Content Elements.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Section Name</em>' attribute.
-	 * @see #setSectionName(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getSection_SectionName()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='sectionName'"
-	 * @generated
-	 */
-	String getSectionName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Section#getSectionName <em>Section Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Section Name</em>' attribute.
-	 * @see #getSectionName()
-	 * @generated
-	 */
-	void setSectionName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variability Based On Element</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variability Based On Element</em>' attribute.
-	 * @see #setVariabilityBasedOnElement(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getSection_VariabilityBasedOnElement()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='variabilityBasedOnElement'"
-	 * @generated
-	 */
-	String getVariabilityBasedOnElement();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Section#getVariabilityBasedOnElement <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Based On Element</em>' attribute.
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 */
-	void setVariabilityBasedOnElement(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Variability Type</b></em>' attribute.
-	 * The default value is <code>"na"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.epf.xml.uma.VariabilityType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variability Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see #isSetVariabilityType()
-	 * @see #unsetVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getSection_VariabilityType()
-	 * @model default="na" unique="false" unsettable="true"
-	 *        extendedMetaData="kind='attribute' name='variabilityType'"
-	 * @generated
-	 */
-	VariabilityType getVariabilityType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Section#getVariabilityType <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variability Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see #isSetVariabilityType()
-	 * @see #unsetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @generated
-	 */
-	void setVariabilityType(VariabilityType value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.Section#getVariabilityType <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @generated
-	 */
-	void unsetVariabilityType();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.Section#getVariabilityType <em>Variability Type</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Variability Type</em>' attribute is set.
-	 * @see #unsetVariabilityType()
-	 * @see #getVariabilityType()
-	 * @see #setVariabilityType(VariabilityType)
-	 * @generated
-	 */
-	boolean isSetVariabilityType();
-
-} // Section
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/SupportingMaterial.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/SupportingMaterial.java
deleted file mode 100644
index eab9426..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/SupportingMaterial.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: SupportingMaterial.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Supporting Material</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A catchall for other types of guidance not specifically defined elsewhere. It can be related to all kinds of Content Elements, i.e. including other guidance elements.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getSupportingMaterial()
- * @model extendedMetaData="name='SupportingMaterial' kind='elementOnly'"
- * @generated
- */
-public interface SupportingMaterial extends Guidance {
-} // SupportingMaterial
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Task.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Task.java
deleted file mode 100644
index b0a0eac..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Task.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Task.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Task</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Content Element that describes work being performed by Roles.  It defines one default performing Role as well as many additional performers.  A Task is associated to input and output work products.  Inputs are differentiated in mandatory versus optional inputs.  The associations to Work Products are not instantiatable/variable-like parameters.  They rather express (hyper-)links to the descriptions of the work products types that are related to the Task as inputs and outputs.  In other words, these associations are not intended to be used to capture which concrete instances will be passed when instantiating the method in a project.  All of the Task's default associations can be overridden in an actual process definition.
- * A Task describes an assignable unit of work.  Every Task is assigned to specific Roles.  The granularity of a Task is generally a few hours to a few days.  It usually affects one or only a small number of work products. A Task is used as an element of defining a process. Tasks are further used for planning and tracking progress; therefore, if they are defined too fine-grained, they will be neglected, and if they are too large, progress would have to be expressed in terms of a Task's parts (e.g. Steps, which is not recommended). 
- * A Task has a clear purpose in which the performing roles achieve a well defined goal.  It provides complete step-by-step explanations of doing all the work that needs to be done to achieve this goal.  This description is complete, independent of when in a process lifecycle the work would actually be done.  It therefore does not describe when you do what work at what point of time, but describes all the work that gets done throughout the development lifecycle that contributes to the achievement of this goal.  When the Task is being applied in a process then this process application (defined as Task Descriptor) provides the information of which pieces of the Task will actually be performed at any particular point in time. This assumes that the Task will be performed in the process over and over again, but each time with a slightly different emphasis on different steps or aspects of the task description. 
- * For example, a Task such as "Develop Use Case Model" describes all the work that needs to be done to develop a complete use case model. This would comprise of the identification and naming of use cases and actors, the writing of a brief description, the modeling of use cases and their relationships in diagrams, the detailed description of a basic flow, the detailed description of alternatives flows, performing of walkthroughs workshops and reviews, etc.  All of these parts contribute to the development goal of developing the use case model, but the parts will be performed at different points in time in a process.  Identification, naming, and brief descriptions would be performed early in a typical development process versus the writing of detailed alternative flows which would be performed much later.  All these parts or steps within the same Task define the "method" of Developing a Use Case Model.  Applying such a method in a lifecycle (i.e. in a process) is defining which steps are done when going from one iteration to the next.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getPostcondition <em>Postcondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getPerformedBy <em>Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getEstimate <em>Estimate</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Task#getToolMentor <em>Tool Mentor</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getTask()
- * @model extendedMetaData="name='Task' kind='elementOnly'"
- * @generated
- */
-public interface Task extends ContentElement {
-	/**
-	 * Returns the value of the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Precondition</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Precondition</em>' attribute.
-	 * @see #setPrecondition(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_Precondition()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Precondition'"
-	 * @generated
-	 */
-	String getPrecondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Task#getPrecondition <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Precondition</em>' attribute.
-	 * @see #getPrecondition()
-	 * @generated
-	 */
-	void setPrecondition(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Postcondition</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Postcondition</em>' attribute.
-	 * @see #setPostcondition(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_Postcondition()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Postcondition'"
-	 * @generated
-	 */
-	String getPostcondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Task#getPostcondition <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Postcondition</em>' attribute.
-	 * @see #getPostcondition()
-	 * @generated
-	 */
-	void setPostcondition(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Performed By</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Performed By</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Performed By</em>' attribute.
-	 * @see #setPerformedBy(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_PerformedBy()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='PerformedBy'"
-	 * @generated
-	 */
-	String getPerformedBy();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.Task#getPerformedBy <em>Performed By</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Performed By</em>' attribute.
-	 * @see #getPerformedBy()
-	 * @generated
-	 */
-	void setPerformedBy(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:25'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Mandatory Input</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mandatory Input</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>Mandatory Input</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_MandatoryInput()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MandatoryInput' group='#group:25'"
-	 * @generated
-	 */
-	EList getMandatoryInput();
-
-	/**
-	 * Returns the value of the '<em><b>Output</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Output</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>Output</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_Output()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Output' group='#group:25'"
-	 * @generated
-	 */
-	EList getOutput();
-
-	/**
-	 * Returns the value of the '<em><b>Additionally Performed By</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Additionally Performed By</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>Additionally Performed By</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_AdditionallyPerformedBy()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='AdditionallyPerformedBy' group='#group:25'"
-	 * @generated
-	 */
-	EList getAdditionallyPerformedBy();
-
-	/**
-	 * Returns the value of the '<em><b>Optional Input</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Optional Input</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>Optional Input</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_OptionalInput()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='OptionalInput' group='#group:25'"
-	 * @generated
-	 */
-	EList getOptionalInput();
-
-	/**
-	 * Returns the value of the '<em><b>Estimate</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimate</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>Estimate</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_Estimate()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Estimate' group='#group:25'"
-	 * @generated
-	 */
-	EList getEstimate();
-
-	/**
-	 * Returns the value of the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimation Considerations</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>Estimation Considerations</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_EstimationConsiderations()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='EstimationConsiderations' group='#group:25'"
-	 * @generated
-	 */
-	EList getEstimationConsiderations();
-
-	/**
-	 * Returns the value of the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tool Mentor</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>Tool Mentor</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTask_ToolMentor()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ToolMentor' group='#group:25'"
-	 * @generated
-	 */
-	EList getToolMentor();
-
-} // Task
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TaskDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TaskDescription.java
deleted file mode 100644
index 14b52cf..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TaskDescription.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TaskDescription.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Task Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Content Description that is used to store the textual description for a Task.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescription#getAlternatives <em>Alternatives</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescription#getPurpose <em>Purpose</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescription()
- * @model extendedMetaData="name='TaskDescription' kind='elementOnly'"
- * @generated
- */
-public interface TaskDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Comprises of summaries describing important exceptional and non-standard ways of achieving this Task's development goals that were not covered by the Task's Steps.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Alternatives</em>' attribute.
-	 * @see #setAlternatives(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescription_Alternatives()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Alternatives'"
-	 * @generated
-	 */
-	String getAlternatives();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.TaskDescription#getAlternatives <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Alternatives</em>' attribute.
-	 * @see #getAlternatives()
-	 * @generated
-	 */
-	void setAlternatives(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Summarizes the main reason for performing this Task and what is intended to be achieved.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Purpose</em>' attribute.
-	 * @see #setPurpose(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescription_Purpose()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Purpose'"
-	 * @generated
-	 */
-	String getPurpose();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.TaskDescription#getPurpose <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Purpose</em>' attribute.
-	 * @see #getPurpose()
-	 * @generated
-	 */
-	void setPurpose(String value);
-
-} // TaskDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TaskDescriptor.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TaskDescriptor.java
deleted file mode 100644
index 52713f8..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TaskDescriptor.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TaskDescriptor.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Task Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Descriptor that represents a proxy for a Task in the context of one specific Activity.  Every breakdown structure can define different relationships of Task Descriptors to Work Product Descriptors and Role Descriptors. Therefore one Task can be represented by many Task Descriptors each within the context of an Activity with its own set of relationships.
- * A key difference between Method Content and Process is that a Content Element such as Task describes all aspects of doing work defined around this Task.  This description is managed in steps, which are modeled as Sections of the Tasks' Content Descriptions.  When applying a Task in a Process' Activity with a Task Descriptor a Process Engineer needs to indicate that at that particular point in time in the Process definition for which the Task Descriptor has been created, only a subset of steps shall be performed.  He defines this selection using the selectedSteps association.  If he wants to add steps to a Task Descriptor, he can describe these either pragmatically in the refinedDescription attribute or 'properly' create a contributing Task to the Task the Task Descriptor refers to.
- * 
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getTask <em>Task</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getPerformedPrimarilyBy <em>Performed Primarily By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getAssistedBy <em>Assisted By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getExternalInput <em>External Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#getStep <em>Step</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TaskDescriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor()
- * @model extendedMetaData="name='TaskDescriptor' kind='elementOnly'"
- * @generated
- */
-public interface TaskDescriptor extends WorkBreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Task</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Task</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Task</em>' attribute.
-	 * @see #setTask(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_Task()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Task'"
-	 * @generated
-	 */
-	String getTask();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getTask <em>Task</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Task</em>' attribute.
-	 * @see #getTask()
-	 * @generated
-	 */
-	void setTask(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Performed Primarily By</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Performed Primarily By</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Performed Primarily By</em>' attribute.
-	 * @see #setPerformedPrimarilyBy(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_PerformedPrimarilyBy()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='PerformedPrimarilyBy'"
-	 * @generated
-	 */
-	String getPerformedPrimarilyBy();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getPerformedPrimarilyBy <em>Performed Primarily By</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Performed Primarily By</em>' attribute.
-	 * @see #getPerformedPrimarilyBy()
-	 * @generated
-	 */
-	void setPerformedPrimarilyBy(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:27'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Additionally Performed By</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Additionally Performed By</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>Additionally Performed By</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_AdditionallyPerformedBy()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='AdditionallyPerformedBy' group='#group:27'"
-	 * @generated
-	 */
-	EList getAdditionallyPerformedBy();
-
-	/**
-	 * Returns the value of the '<em><b>Assisted By</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Assisted By</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>Assisted By</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_AssistedBy()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='AssistedBy' group='#group:27'"
-	 * @generated
-	 */
-	EList getAssistedBy();
-
-	/**
-	 * Returns the value of the '<em><b>External Input</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>External Input</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>External Input</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_ExternalInput()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ExternalInput' group='#group:27'"
-	 * @generated
-	 */
-	EList getExternalInput();
-
-	/**
-	 * Returns the value of the '<em><b>Mandatory Input</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mandatory Input</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>Mandatory Input</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_MandatoryInput()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MandatoryInput' group='#group:27'"
-	 * @generated
-	 */
-	EList getMandatoryInput();
-
-	/**
-	 * Returns the value of the '<em><b>Optional Input</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Optional Input</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>Optional Input</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_OptionalInput()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='OptionalInput' group='#group:27'"
-	 * @generated
-	 */
-	EList getOptionalInput();
-
-	/**
-	 * Returns the value of the '<em><b>Output</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Output</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>Output</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_Output()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Output' group='#group:27'"
-	 * @generated
-	 */
-	EList getOutput();
-
-	/**
-	 * Returns the value of the '<em><b>Step</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.Section}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Step</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>Step</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_Step()
-	 * @model type="org.eclipse.epf.xml.uma.Section" containment="true"
-	 *        extendedMetaData="kind='element' name='Step'"
-	 * @generated
-	 */
-	EList getStep();
-
-	/**
-	 * Returns the value of the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Is Synchronized With Source</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Is Synchronized With Source</em>' attribute.
-	 * @see #isSetIsSynchronizedWithSource()
-	 * @see #unsetIsSynchronizedWithSource()
-	 * @see #setIsSynchronizedWithSource(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTaskDescriptor_IsSynchronizedWithSource()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='isSynchronizedWithSource'"
-	 * @generated
-	 */
-	boolean isIsSynchronizedWithSource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.TaskDescriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Synchronized With Source</em>' attribute.
-	 * @see #isSetIsSynchronizedWithSource()
-	 * @see #unsetIsSynchronizedWithSource()
-	 * @see #isIsSynchronizedWithSource()
-	 * @generated
-	 */
-	void setIsSynchronizedWithSource(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.TaskDescriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsSynchronizedWithSource()
-	 * @see #isIsSynchronizedWithSource()
-	 * @see #setIsSynchronizedWithSource(boolean)
-	 * @generated
-	 */
-	void unsetIsSynchronizedWithSource();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.TaskDescriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Synchronized With Source</em>' attribute is set.
-	 * @see #unsetIsSynchronizedWithSource()
-	 * @see #isIsSynchronizedWithSource()
-	 * @see #setIsSynchronizedWithSource(boolean)
-	 * @generated
-	 */
-	boolean isSetIsSynchronizedWithSource();
-
-} // TaskDescriptor
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TeamProfile.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TeamProfile.java
deleted file mode 100644
index cfa8433..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TeamProfile.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TeamProfile.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Team Profile</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A Breakdown Element that groups Role Descriptors or Resource Definitions defining a nested hierarchy of teams and team members.
- * Work assignments and Work Product responsibilities can be different from Activity to Activity in a development project. Different phases require different staffing profiles, i.e. different skills and resources doing different types of work.  Therefore, a process needs to define such different profiles in a flexible manner.  Whereas Core Method Content defines standard responsibilities and assignments, a process express by a breakdown structures needs to be able refine and redefine these throughout its definition.  Role Descriptors, Resource Definitions, as well as Team Profiles provide the data structure necessary to achieve this flexibility and to provide a process user with the capability to define different teams and role relationships for every Activity (including Activities on any nesting-level as well as Iterations or Phases).
- * Hence, in addition to the work breakdown and work product breakdown structures defined so far, Team Profiles are used to define a third type of breakdown structure: team breakdown structures.  These are created as an Activity specific hierarchy of Team Profiles comprising of Role Descriptors and Resource Definitions.  These structures can be presented as well-known Org-Charts.  Just as with any other Breakdown Element and Descriptors, Team Profiles can be defined within the scope of any Activity in a breakdown structure.  In other words every Activity can define its own Team Profiles consisting of Activity specific Role Descriptors and Resource Definitions.  Typically, Team Profiles are defined on the level of Iterations or Phases or other higher-level Activity.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.TeamProfile#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TeamProfile#getRole <em>Role</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TeamProfile#getSuperTeam <em>Super Team</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.TeamProfile#getSubTeam <em>Sub Team</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getTeamProfile()
- * @model extendedMetaData="name='TeamProfile' kind='elementOnly'"
- * @generated
- */
-public interface TeamProfile extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Group1</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group1</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>Group1</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTeamProfile_Group1()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:20'"
-	 * @generated
-	 */
-	FeatureMap getGroup1();
-
-	/**
-	 * Returns the value of the '<em><b>Role</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Role</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>Role</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTeamProfile_Role()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Role' group='#group:20'"
-	 * @generated
-	 */
-	EList getRole();
-
-	/**
-	 * Returns the value of the '<em><b>Super Team</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Super Team</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>Super Team</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTeamProfile_SuperTeam()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='SuperTeam' group='#group:20'"
-	 * @generated
-	 */
-	EList getSuperTeam();
-
-	/**
-	 * Returns the value of the '<em><b>Sub Team</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sub Team</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>Sub Team</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTeamProfile_SubTeam()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='SubTeam' group='#group:20'"
-	 * @generated
-	 */
-	EList getSubTeam();
-
-} // TeamProfile
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Template.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Template.java
deleted file mode 100644
index 6ccdaab..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Template.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Template.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Template</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of guidance that provides for a work product a pre-defined table of contents, sections, packages, and/or headings, a standardized format, as well as descriptions how the sections and packages are supposed to be used and completed. Templates cannot only be provided for documents, but also for conceptual models or physical data stores.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getTemplate()
- * @model extendedMetaData="name='Template' kind='elementOnly'"
- * @generated
- */
-public interface Template extends Guidance {
-} // Template
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TermDefinition.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TermDefinition.java
deleted file mode 100644
index 6a2e56f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/TermDefinition.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TermDefinition.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Term Definition</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A specific type of guidance that defines concepts and are used to build up the Glossary. TermDefinitions are not directly related to ContentElements, but their relationship is being derived when the Term is used in the ContentElements description text.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getTermDefinition()
- * @model extendedMetaData="name='TermDefinition' kind='elementOnly'"
- * @generated
- */
-public interface TermDefinition extends Guidance {
-} // TermDefinition
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Tool.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Tool.java
deleted file mode 100644
index b96c81d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Tool.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Tool.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tool</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A container/aggregate for ToolMentors.  It can also provide general descriptions of the tool and its general capabilities.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.Tool#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.Tool#getToolMentor <em>Tool Mentor</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getTool()
- * @model extendedMetaData="name='Tool' kind='elementOnly'"
- * @generated
- */
-public interface Tool extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTool_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tool Mentor</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>Tool Mentor</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getTool_ToolMentor()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ToolMentor' group='#group:22'"
-	 * @generated
-	 */
-	EList getToolMentor();
-
-} // Tool
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ToolMentor.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ToolMentor.java
deleted file mode 100644
index 484f793..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/ToolMentor.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ToolMentor.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tool Mentor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A  specific type of guidance that shows how to use a specific tool to accomplish some piece of work a Work Product either in the context of or independent from a Task or Activity.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getToolMentor()
- * @model extendedMetaData="name='ToolMentor' kind='elementOnly'"
- * @generated
- */
-public interface ToolMentor extends Guidance {
-} // ToolMentor
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/UmaFactory.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/UmaFactory.java
deleted file mode 100644
index ea3afed..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/UmaFactory.java
+++ /dev/null
@@ -1,802 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaFactory.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-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.epf.xml.uma.UmaPackage
- * @generated
- */
-public interface UmaFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	UmaFactory eINSTANCE = org.eclipse.epf.xml.uma.impl.UmaFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Activity</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Activity</em>'.
-	 * @generated
-	 */
-	Activity createActivity();
-
-	/**
-	 * Returns a new object of class '<em>Activity Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Activity Description</em>'.
-	 * @generated
-	 */
-	ActivityDescription createActivityDescription();
-
-	/**
-	 * Returns a new object of class '<em>Artifact</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Artifact</em>'.
-	 * @generated
-	 */
-	Artifact createArtifact();
-
-	/**
-	 * Returns a new object of class '<em>Artifact Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Artifact Description</em>'.
-	 * @generated
-	 */
-	ArtifactDescription createArtifactDescription();
-
-	/**
-	 * Returns a new object of class '<em>Breakdown Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Breakdown Element</em>'.
-	 * @generated
-	 */
-	BreakdownElement createBreakdownElement();
-
-	/**
-	 * Returns a new object of class '<em>Breakdown Element Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Breakdown Element Description</em>'.
-	 * @generated
-	 */
-	BreakdownElementDescription createBreakdownElementDescription();
-
-	/**
-	 * Returns a new object of class '<em>Capability Pattern</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Capability Pattern</em>'.
-	 * @generated
-	 */
-	CapabilityPattern createCapabilityPattern();
-
-	/**
-	 * Returns a new object of class '<em>Checklist</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Checklist</em>'.
-	 * @generated
-	 */
-	Checklist createChecklist();
-
-	/**
-	 * Returns a new object of class '<em>Composite Role</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Composite Role</em>'.
-	 * @generated
-	 */
-	CompositeRole createCompositeRole();
-
-	/**
-	 * Returns a new object of class '<em>Concept</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Concept</em>'.
-	 * @generated
-	 */
-	Concept createConcept();
-
-	/**
-	 * Returns a new object of class '<em>Constraint</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Constraint</em>'.
-	 * @generated
-	 */
-	Constraint createConstraint();
-
-	/**
-	 * Returns a new object of class '<em>Content Category</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Content Category</em>'.
-	 * @generated
-	 */
-	ContentCategory createContentCategory();
-
-	/**
-	 * Returns a new object of class '<em>Content Category Package</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Content Category Package</em>'.
-	 * @generated
-	 */
-	ContentCategoryPackage createContentCategoryPackage();
-
-	/**
-	 * Returns a new object of class '<em>Content Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Content Description</em>'.
-	 * @generated
-	 */
-	ContentDescription createContentDescription();
-
-	/**
-	 * Returns a new object of class '<em>Content Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Content Element</em>'.
-	 * @generated
-	 */
-	ContentElement createContentElement();
-
-	/**
-	 * Returns a new object of class '<em>Content Package</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Content Package</em>'.
-	 * @generated
-	 */
-	ContentPackage createContentPackage();
-
-	/**
-	 * Returns a new object of class '<em>Custom Category</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Custom Category</em>'.
-	 * @generated
-	 */
-	CustomCategory createCustomCategory();
-
-	/**
-	 * Returns a new object of class '<em>Deliverable</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Deliverable</em>'.
-	 * @generated
-	 */
-	Deliverable createDeliverable();
-
-	/**
-	 * Returns a new object of class '<em>Deliverable Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Deliverable Description</em>'.
-	 * @generated
-	 */
-	DeliverableDescription createDeliverableDescription();
-
-	/**
-	 * Returns a new object of class '<em>Delivery Process</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Delivery Process</em>'.
-	 * @generated
-	 */
-	DeliveryProcess createDeliveryProcess();
-
-	/**
-	 * Returns a new object of class '<em>Delivery Process Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Delivery Process Description</em>'.
-	 * @generated
-	 */
-	DeliveryProcessDescription createDeliveryProcessDescription();
-
-	/**
-	 * Returns a new object of class '<em>Describable Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Describable Element</em>'.
-	 * @generated
-	 */
-	DescribableElement createDescribableElement();
-
-	/**
-	 * Returns a new object of class '<em>Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Descriptor</em>'.
-	 * @generated
-	 */
-	Descriptor createDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Descriptor Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Descriptor Description</em>'.
-	 * @generated
-	 */
-	DescriptorDescription createDescriptorDescription();
-
-	/**
-	 * Returns a new object of class '<em>Discipline</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Discipline</em>'.
-	 * @generated
-	 */
-	Discipline createDiscipline();
-
-	/**
-	 * Returns a new object of class '<em>Discipline Grouping</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Discipline Grouping</em>'.
-	 * @generated
-	 */
-	DisciplineGrouping createDisciplineGrouping();
-
-	/**
-	 * Returns a new object of class '<em>Document Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Document Root</em>'.
-	 * @generated
-	 */
-	DocumentRoot createDocumentRoot();
-
-	/**
-	 * Returns a new object of class '<em>Domain</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Domain</em>'.
-	 * @generated
-	 */
-	Domain createDomain();
-
-	/**
-	 * Returns a new object of class '<em>Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Element</em>'.
-	 * @generated
-	 */
-	Element createElement();
-
-	/**
-	 * Returns a new object of class '<em>Estimate</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Estimate</em>'.
-	 * @generated
-	 */
-	Estimate createEstimate();
-
-	/**
-	 * Returns a new object of class '<em>Estimating Metric</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Estimating Metric</em>'.
-	 * @generated
-	 */
-	EstimatingMetric createEstimatingMetric();
-
-	/**
-	 * Returns a new object of class '<em>Estimation Considerations</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Estimation Considerations</em>'.
-	 * @generated
-	 */
-	EstimationConsiderations createEstimationConsiderations();
-
-	/**
-	 * Returns a new object of class '<em>Example</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Example</em>'.
-	 * @generated
-	 */
-	Example createExample();
-
-	/**
-	 * Returns a new object of class '<em>Guidance</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Guidance</em>'.
-	 * @generated
-	 */
-	Guidance createGuidance();
-
-	/**
-	 * Returns a new object of class '<em>Guidance Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Guidance Description</em>'.
-	 * @generated
-	 */
-	GuidanceDescription createGuidanceDescription();
-
-	/**
-	 * Returns a new object of class '<em>Guideline</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Guideline</em>'.
-	 * @generated
-	 */
-	Guideline createGuideline();
-
-	/**
-	 * Returns a new object of class '<em>Iteration</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Iteration</em>'.
-	 * @generated
-	 */
-	Iteration createIteration();
-
-	/**
-	 * Returns a new object of class '<em>Method Configuration</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Configuration</em>'.
-	 * @generated
-	 */
-	MethodConfiguration createMethodConfiguration();
-
-	/**
-	 * Returns a new object of class '<em>Method Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Element</em>'.
-	 * @generated
-	 */
-	MethodElement createMethodElement();
-
-	/**
-	 * Returns a new object of class '<em>Method Element Property</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Element Property</em>'.
-	 * @generated
-	 */
-	MethodElementProperty createMethodElementProperty();
-
-	/**
-	 * Returns a new object of class '<em>Method Library</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Library</em>'.
-	 * @generated
-	 */
-	MethodLibrary createMethodLibrary();
-
-	/**
-	 * Returns a new object of class '<em>Method Package</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Package</em>'.
-	 * @generated
-	 */
-	MethodPackage createMethodPackage();
-
-	/**
-	 * Returns a new object of class '<em>Method Plugin</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Plugin</em>'.
-	 * @generated
-	 */
-	MethodPlugin createMethodPlugin();
-
-	/**
-	 * Returns a new object of class '<em>Method Unit</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Method Unit</em>'.
-	 * @generated
-	 */
-	MethodUnit createMethodUnit();
-
-	/**
-	 * Returns a new object of class '<em>Milestone</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Milestone</em>'.
-	 * @generated
-	 */
-	Milestone createMilestone();
-
-	/**
-	 * Returns a new object of class '<em>Named Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Named Element</em>'.
-	 * @generated
-	 */
-	NamedElement createNamedElement();
-
-	/**
-	 * Returns a new object of class '<em>Outcome</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Outcome</em>'.
-	 * @generated
-	 */
-	Outcome createOutcome();
-
-	/**
-	 * Returns a new object of class '<em>Packageable Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Packageable Element</em>'.
-	 * @generated
-	 */
-	PackageableElement createPackageableElement();
-
-	/**
-	 * Returns a new object of class '<em>Phase</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Phase</em>'.
-	 * @generated
-	 */
-	Phase createPhase();
-
-	/**
-	 * Returns a new object of class '<em>Planning Data</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Planning Data</em>'.
-	 * @generated
-	 */
-	PlanningData createPlanningData();
-
-	/**
-	 * Returns a new object of class '<em>Practice</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Practice</em>'.
-	 * @generated
-	 */
-	Practice createPractice();
-
-	/**
-	 * Returns a new object of class '<em>Practice Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Practice Description</em>'.
-	 * @generated
-	 */
-	PracticeDescription createPracticeDescription();
-
-	/**
-	 * Returns a new object of class '<em>Process</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process</em>'.
-	 * @generated
-	 */
-	org.eclipse.epf.xml.uma.Process createProcess();
-
-	/**
-	 * Returns a new object of class '<em>Process Component</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Component</em>'.
-	 * @generated
-	 */
-	ProcessComponent createProcessComponent();
-
-	/**
-	 * Returns a new object of class '<em>Process Component Interface</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Component Interface</em>'.
-	 * @generated
-	 */
-	ProcessComponentInterface createProcessComponentInterface();
-
-	/**
-	 * Returns a new object of class '<em>Process Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Description</em>'.
-	 * @generated
-	 */
-	ProcessDescription createProcessDescription();
-
-	/**
-	 * Returns a new object of class '<em>Process Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Element</em>'.
-	 * @generated
-	 */
-	ProcessElement createProcessElement();
-
-	/**
-	 * Returns a new object of class '<em>Process Package</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Package</em>'.
-	 * @generated
-	 */
-	ProcessPackage createProcessPackage();
-
-	/**
-	 * Returns a new object of class '<em>Process Planning Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Process Planning Template</em>'.
-	 * @generated
-	 */
-	ProcessPlanningTemplate createProcessPlanningTemplate();
-
-	/**
-	 * Returns a new object of class '<em>Report</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Report</em>'.
-	 * @generated
-	 */
-	Report createReport();
-
-	/**
-	 * Returns a new object of class '<em>Reusable Asset</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Reusable Asset</em>'.
-	 * @generated
-	 */
-	ReusableAsset createReusableAsset();
-
-	/**
-	 * Returns a new object of class '<em>Roadmap</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Roadmap</em>'.
-	 * @generated
-	 */
-	Roadmap createRoadmap();
-
-	/**
-	 * Returns a new object of class '<em>Role</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role</em>'.
-	 * @generated
-	 */
-	Role createRole();
-
-	/**
-	 * Returns a new object of class '<em>Role Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Description</em>'.
-	 * @generated
-	 */
-	RoleDescription createRoleDescription();
-
-	/**
-	 * Returns a new object of class '<em>Role Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Descriptor</em>'.
-	 * @generated
-	 */
-	RoleDescriptor createRoleDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Role Set</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Set</em>'.
-	 * @generated
-	 */
-	RoleSet createRoleSet();
-
-	/**
-	 * Returns a new object of class '<em>Role Set Grouping</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Role Set Grouping</em>'.
-	 * @generated
-	 */
-	RoleSetGrouping createRoleSetGrouping();
-
-	/**
-	 * Returns a new object of class '<em>Section</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Section</em>'.
-	 * @generated
-	 */
-	Section createSection();
-
-	/**
-	 * Returns a new object of class '<em>Supporting Material</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Supporting Material</em>'.
-	 * @generated
-	 */
-	SupportingMaterial createSupportingMaterial();
-
-	/**
-	 * Returns a new object of class '<em>Task</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task</em>'.
-	 * @generated
-	 */
-	Task createTask();
-
-	/**
-	 * Returns a new object of class '<em>Task Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task Description</em>'.
-	 * @generated
-	 */
-	TaskDescription createTaskDescription();
-
-	/**
-	 * Returns a new object of class '<em>Task Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Task Descriptor</em>'.
-	 * @generated
-	 */
-	TaskDescriptor createTaskDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Team Profile</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Team Profile</em>'.
-	 * @generated
-	 */
-	TeamProfile createTeamProfile();
-
-	/**
-	 * Returns a new object of class '<em>Template</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Template</em>'.
-	 * @generated
-	 */
-	Template createTemplate();
-
-	/**
-	 * Returns a new object of class '<em>Term Definition</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Term Definition</em>'.
-	 * @generated
-	 */
-	TermDefinition createTermDefinition();
-
-	/**
-	 * Returns a new object of class '<em>Tool</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tool</em>'.
-	 * @generated
-	 */
-	Tool createTool();
-
-	/**
-	 * Returns a new object of class '<em>Tool Mentor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tool Mentor</em>'.
-	 * @generated
-	 */
-	ToolMentor createToolMentor();
-
-	/**
-	 * Returns a new object of class '<em>Whitepaper</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Whitepaper</em>'.
-	 * @generated
-	 */
-	Whitepaper createWhitepaper();
-
-	/**
-	 * Returns a new object of class '<em>Work Breakdown Element</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Breakdown Element</em>'.
-	 * @generated
-	 */
-	WorkBreakdownElement createWorkBreakdownElement();
-
-	/**
-	 * Returns a new object of class '<em>Work Definition</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Definition</em>'.
-	 * @generated
-	 */
-	WorkDefinition createWorkDefinition();
-
-	/**
-	 * Returns a new object of class '<em>Work Order</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Order</em>'.
-	 * @generated
-	 */
-	WorkOrder createWorkOrder();
-
-	/**
-	 * Returns a new object of class '<em>Work Product</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product</em>'.
-	 * @generated
-	 */
-	WorkProduct createWorkProduct();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Description</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Description</em>'.
-	 * @generated
-	 */
-	WorkProductDescription createWorkProductDescription();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Descriptor</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Descriptor</em>'.
-	 * @generated
-	 */
-	WorkProductDescriptor createWorkProductDescriptor();
-
-	/**
-	 * Returns a new object of class '<em>Work Product Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Work Product Type</em>'.
-	 * @generated
-	 */
-	WorkProductType createWorkProductType();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	UmaPackage getUmaPackage();
-
-} //UmaFactory
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/UmaPackage.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/UmaPackage.java
deleted file mode 100644
index 71ac6bd..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/UmaPackage.java
+++ /dev/null
@@ -1,24773 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaPackage.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-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.epf.xml.uma.UmaFactory
- * @model kind="package"
- * @generated
- */
-public interface UmaPackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "uma";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/epf/uma/1.0.3";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "uma";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	UmaPackage eINSTANCE = org.eclipse.epf.xml.uma.impl.UmaPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ElementImpl <em>Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getElement()
-	 * @generated
-	 */
-	int ELEMENT = 28;
-
-	/**
-	 * The number of structural features of the '<em>Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ELEMENT_FEATURE_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.NamedElementImpl <em>Named Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.NamedElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getNamedElement()
-	 * @generated
-	 */
-	int NAMED_ELEMENT = 45;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMED_ELEMENT__NAME = ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Named Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAMED_ELEMENT_FEATURE_COUNT = ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.PackageableElementImpl <em>Packageable Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.PackageableElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPackageableElement()
-	 * @generated
-	 */
-	int PACKAGEABLE_ELEMENT = 47;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PACKAGEABLE_ELEMENT__NAME = NAMED_ELEMENT__NAME;
-
-	/**
-	 * The number of structural features of the '<em>Packageable Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PACKAGEABLE_ELEMENT_FEATURE_COUNT = NAMED_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl <em>Method Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MethodElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodElement()
-	 * @generated
-	 */
-	int METHOD_ELEMENT = 38;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__NAME = PACKAGEABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__GROUP = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__OWNED_RULE = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__BRIEF_DESCRIPTION = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__ID = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__ORDERING_GUIDE = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT__SUPPRESSED = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The number of structural features of the '<em>Method Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_FEATURE_COUNT = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DescribableElementImpl <em>Describable Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DescribableElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDescribableElement()
-	 * @generated
-	 */
-	int DESCRIBABLE_ELEMENT = 21;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__GROUP = METHOD_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__OWNED_RULE = METHOD_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__ID = METHOD_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__PRESENTATION = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__NODEICON = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__PRESENTATION_NAME = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT__SHAPEICON = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Describable Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIBABLE_ELEMENT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ProcessElementImpl <em>Process Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ProcessElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessElement()
-	 * @generated
-	 */
-	int PROCESS_ELEMENT = 56;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__NAME = DESCRIBABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__GROUP = DESCRIBABLE_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__OWNED_RULE = DESCRIBABLE_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__METHOD_ELEMENT_PROPERTY = DESCRIBABLE_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__BRIEF_DESCRIPTION = DESCRIBABLE_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__ID = DESCRIBABLE_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__ORDERING_GUIDE = DESCRIBABLE_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__SUPPRESSED = DESCRIBABLE_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__PRESENTATION = DESCRIBABLE_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__NODEICON = DESCRIBABLE_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__PRESENTATION_NAME = DESCRIBABLE_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT__SHAPEICON = DESCRIBABLE_ELEMENT__SHAPEICON;
-
-	/**
-	 * The number of structural features of the '<em>Process Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_ELEMENT_FEATURE_COUNT = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl <em>Breakdown Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.BreakdownElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getBreakdownElement()
-	 * @generated
-	 */
-	int BREAKDOWN_ELEMENT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__NAME = PROCESS_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__GROUP = PROCESS_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__OWNED_RULE = PROCESS_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY = PROCESS_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION = PROCESS_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__ID = PROCESS_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__ORDERING_GUIDE = PROCESS_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__SUPPRESSED = PROCESS_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTATION = PROCESS_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__NODEICON = PROCESS_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTATION_NAME = PROCESS_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__SHAPEICON = PROCESS_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTED_AFTER = PROCESS_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PRESENTED_BEFORE = PROCESS_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PLANNING_DATA = PROCESS_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__SUPER_ACTIVITY = PROCESS_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES = PROCESS_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__IS_OPTIONAL = PROCESS_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__IS_PLANNED = PROCESS_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT__PREFIX = PROCESS_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The number of structural features of the '<em>Breakdown Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_FEATURE_COUNT = PROCESS_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl <em>Work Breakdown Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkBreakdownElement()
-	 * @generated
-	 */
-	int WORK_BREAKDOWN_ELEMENT = 78;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__GROUP = BREAKDOWN_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__OWNED_RULE = BREAKDOWN_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__ID = BREAKDOWN_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITY = BREAKDOWN_ELEMENT__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__GROUP1 = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__PREDECESSOR = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN = BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_ONGOING = BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE = BREAKDOWN_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The number of structural features of the '<em>Work Breakdown Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ActivityImpl <em>Activity</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ActivityImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getActivity()
-	 * @generated
-	 */
-	int ACTIVITY = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__NAME = WORK_BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__GROUP = WORK_BREAKDOWN_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__OWNED_RULE = WORK_BREAKDOWN_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__METHOD_ELEMENT_PROPERTY = WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__BRIEF_DESCRIPTION = WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__ID = WORK_BREAKDOWN_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__ORDERING_GUIDE = WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SUPPRESSED = WORK_BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTATION = WORK_BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__NODEICON = WORK_BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTATION_NAME = WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SHAPEICON = WORK_BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTED_AFTER = WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRESENTED_BEFORE = WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PLANNING_DATA = WORK_BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SUPER_ACTIVITY = WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__HAS_MULTIPLE_OCCURRENCES = WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_OPTIONAL = WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_PLANNED = WORK_BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PREFIX = WORK_BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__GROUP1 = WORK_BREAKDOWN_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PREDECESSOR = WORK_BREAKDOWN_ELEMENT__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_EVENT_DRIVEN = WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_ONGOING = WORK_BREAKDOWN_ELEMENT__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_REPEATABLE = WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__PRECONDITION = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__POSTCONDITION = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__GROUP2 = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__BREAKDOWN_ELEMENT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__CHECKLIST = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__CONCEPT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__EXAMPLE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__GUIDELINE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Roadmap</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__ROADMAP = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__REUSABLE_ASSET = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__SUPPORTING_MATERIAL = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 10;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__WHITEPAPER = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 11;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__IS_ENACTABLE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 12;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__VARIABILITY_BASED_ON_ELEMENT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 13;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY__VARIABILITY_TYPE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 14;
-
-	/**
-	 * The number of structural features of the '<em>Activity</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_FEATURE_COUNT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 15;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MethodUnitImpl <em>Method Unit</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MethodUnitImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodUnit()
-	 * @generated
-	 */
-	int METHOD_UNIT = 43;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__GROUP = METHOD_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__OWNED_RULE = METHOD_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__ID = METHOD_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__COPYRIGHT = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__AUTHORS = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__CHANGE_DATE = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__CHANGE_DESCRIPTION = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT__VERSION = METHOD_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The number of structural features of the '<em>Method Unit</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_UNIT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl <em>Content Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentDescription()
-	 * @generated
-	 */
-	int CONTENT_DESCRIPTION = 13;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__GROUP = METHOD_UNIT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__OWNED_RULE = METHOD_UNIT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__ID = METHOD_UNIT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__COPYRIGHT = METHOD_UNIT__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__MAIN_DESCRIPTION = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__KEY_CONSIDERATIONS = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__SECTION = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION__EXTERNAL_ID = METHOD_UNIT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Content Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_DESCRIPTION_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.BreakdownElementDescriptionImpl <em>Breakdown Element Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.BreakdownElementDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getBreakdownElementDescription()
-	 * @generated
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION = 5;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__GROUP = CONTENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__OWNED_RULE = CONTENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__ID = CONTENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__COPYRIGHT = CONTENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__SECTION = CONTENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Breakdown Element Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ActivityDescriptionImpl <em>Activity Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ActivityDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getActivityDescription()
-	 * @generated
-	 */
-	int ACTIVITY_DESCRIPTION = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__NAME = BREAKDOWN_ELEMENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__GROUP = BREAKDOWN_ELEMENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__OWNED_RULE = BREAKDOWN_ELEMENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__ID = BREAKDOWN_ELEMENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__ORDERING_GUIDE = BREAKDOWN_ELEMENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__SUPPRESSED = BREAKDOWN_ELEMENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__COPYRIGHT = BREAKDOWN_ELEMENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__AUTHORS = BREAKDOWN_ELEMENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__CHANGE_DATE = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__CHANGE_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__VERSION = BREAKDOWN_ELEMENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__MAIN_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__KEY_CONSIDERATIONS = BREAKDOWN_ELEMENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__SECTION = BREAKDOWN_ELEMENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__EXTERNAL_ID = BREAKDOWN_ELEMENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__USAGE_GUIDANCE = BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__ALTERNATIVES = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>How To Staff</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__HOW_TO_STAFF = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION__PURPOSE = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Activity Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTIVITY_DESCRIPTION_FEATURE_COUNT = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl <em>Content Element</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ContentElementImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentElement()
-	 * @generated
-	 */
-	int CONTENT_ELEMENT = 14;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__NAME = DESCRIBABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__GROUP = DESCRIBABLE_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__OWNED_RULE = DESCRIBABLE_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY = DESCRIBABLE_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__BRIEF_DESCRIPTION = DESCRIBABLE_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__ID = DESCRIBABLE_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__ORDERING_GUIDE = DESCRIBABLE_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__SUPPRESSED = DESCRIBABLE_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__PRESENTATION = DESCRIBABLE_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__NODEICON = DESCRIBABLE_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__PRESENTATION_NAME = DESCRIBABLE_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__SHAPEICON = DESCRIBABLE_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__GROUP1 = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__CHECKLIST = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__CONCEPT = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__EXAMPLE = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__GUIDELINE = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__REUSABLE_ASSET = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__SUPPORTING_MATERIAL = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__WHITEPAPER = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT__VARIABILITY_TYPE = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The number of structural features of the '<em>Content Element</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_ELEMENT_FEATURE_COUNT = DESCRIBABLE_ELEMENT_FEATURE_COUNT + 10;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl <em>Work Product</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WorkProductImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProduct()
-	 * @generated
-	 */
-	int WORK_PRODUCT = 81;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__GROUP = CONTENT_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__OWNED_RULE = CONTENT_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__ID = CONTENT_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__GROUP1 = CONTENT_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__CHECKLIST = CONTENT_ELEMENT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__CONCEPT = CONTENT_ELEMENT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__EXAMPLE = CONTENT_ELEMENT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__GUIDELINE = CONTENT_ELEMENT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__REUSABLE_ASSET = CONTENT_ELEMENT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__SUPPORTING_MATERIAL = CONTENT_ELEMENT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__WHITEPAPER = CONTENT_ELEMENT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__GROUP2 = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Estimate</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__ESTIMATE = CONTENT_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__ESTIMATION_CONSIDERATIONS = CONTENT_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Report</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__REPORT = CONTENT_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__TEMPLATE = CONTENT_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT__TOOL_MENTOR = CONTENT_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Work Product</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ArtifactImpl <em>Artifact</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ArtifactImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getArtifact()
-	 * @generated
-	 */
-	int ARTIFACT = 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__NAME = WORK_PRODUCT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__GROUP = WORK_PRODUCT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__OWNED_RULE = WORK_PRODUCT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__BRIEF_DESCRIPTION = WORK_PRODUCT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__ID = WORK_PRODUCT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__ORDERING_GUIDE = WORK_PRODUCT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__SUPPRESSED = WORK_PRODUCT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__PRESENTATION = WORK_PRODUCT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__NODEICON = WORK_PRODUCT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__PRESENTATION_NAME = WORK_PRODUCT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__SHAPEICON = WORK_PRODUCT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__GROUP1 = WORK_PRODUCT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__CHECKLIST = WORK_PRODUCT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__CONCEPT = WORK_PRODUCT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__EXAMPLE = WORK_PRODUCT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__GUIDELINE = WORK_PRODUCT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__REUSABLE_ASSET = WORK_PRODUCT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__SUPPORTING_MATERIAL = WORK_PRODUCT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__WHITEPAPER = WORK_PRODUCT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__VARIABILITY_BASED_ON_ELEMENT = WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__VARIABILITY_TYPE = WORK_PRODUCT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__GROUP2 = WORK_PRODUCT__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Estimate</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__ESTIMATE = WORK_PRODUCT__ESTIMATE;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__ESTIMATION_CONSIDERATIONS = WORK_PRODUCT__ESTIMATION_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Report</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__REPORT = WORK_PRODUCT__REPORT;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__TEMPLATE = WORK_PRODUCT__TEMPLATE;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__TOOL_MENTOR = WORK_PRODUCT__TOOL_MENTOR;
-
-	/**
-	 * The feature id for the '<em><b>Group3</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__GROUP3 = WORK_PRODUCT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Contained Artifact</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT__CONTAINED_ARTIFACT = WORK_PRODUCT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Artifact</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_FEATURE_COUNT = WORK_PRODUCT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptionImpl <em>Work Product Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WorkProductDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProductDescription()
-	 * @generated
-	 */
-	int WORK_PRODUCT_DESCRIPTION = 82;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__GROUP = CONTENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__OWNED_RULE = CONTENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__ID = CONTENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__COPYRIGHT = CONTENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__SECTION = CONTENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__PURPOSE = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl <em>Artifact Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getArtifactDescription()
-	 * @generated
-	 */
-	int ARTIFACT_DESCRIPTION = 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__NAME = WORK_PRODUCT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__GROUP = WORK_PRODUCT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__OWNED_RULE = WORK_PRODUCT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__BRIEF_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__ID = WORK_PRODUCT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__ORDERING_GUIDE = WORK_PRODUCT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__SUPPRESSED = WORK_PRODUCT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__COPYRIGHT = WORK_PRODUCT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__AUTHORS = WORK_PRODUCT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__CHANGE_DATE = WORK_PRODUCT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__CHANGE_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__VERSION = WORK_PRODUCT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__MAIN_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__KEY_CONSIDERATIONS = WORK_PRODUCT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__SECTION = WORK_PRODUCT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__EXTERNAL_ID = WORK_PRODUCT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__IMPACT_OF_NOT_HAVING = WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__PURPOSE = WORK_PRODUCT_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__REASONS_FOR_NOT_NEEDING = WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING;
-
-	/**
-	 * The feature id for the '<em><b>Brief Outline</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__BRIEF_OUTLINE = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Representation Options</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Representation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__REPRESENTATION = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Notation</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION__NOTATION = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Artifact Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ARTIFACT_DESCRIPTION_FEATURE_COUNT = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ProcessImpl <em>Process</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ProcessImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcess()
-	 * @generated
-	 */
-	int PROCESS = 52;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__NAME = ACTIVITY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__GROUP = ACTIVITY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__OWNED_RULE = ACTIVITY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__METHOD_ELEMENT_PROPERTY = ACTIVITY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__BRIEF_DESCRIPTION = ACTIVITY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__ID = ACTIVITY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__ORDERING_GUIDE = ACTIVITY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SUPPRESSED = ACTIVITY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTATION = ACTIVITY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__NODEICON = ACTIVITY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTATION_NAME = ACTIVITY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SHAPEICON = ACTIVITY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTED_AFTER = ACTIVITY__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRESENTED_BEFORE = ACTIVITY__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PLANNING_DATA = ACTIVITY__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SUPER_ACTIVITY = ACTIVITY__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__HAS_MULTIPLE_OCCURRENCES = ACTIVITY__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_OPTIONAL = ACTIVITY__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_PLANNED = ACTIVITY__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PREFIX = ACTIVITY__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__GROUP1 = ACTIVITY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PREDECESSOR = ACTIVITY__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_EVENT_DRIVEN = ACTIVITY__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_ONGOING = ACTIVITY__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_REPEATABLE = ACTIVITY__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__PRECONDITION = ACTIVITY__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__POSTCONDITION = ACTIVITY__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__GROUP2 = ACTIVITY__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__BREAKDOWN_ELEMENT = ACTIVITY__BREAKDOWN_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__CHECKLIST = ACTIVITY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__CONCEPT = ACTIVITY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__EXAMPLE = ACTIVITY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__GUIDELINE = ACTIVITY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Roadmap</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__ROADMAP = ACTIVITY__ROADMAP;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__REUSABLE_ASSET = ACTIVITY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__SUPPORTING_MATERIAL = ACTIVITY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__WHITEPAPER = ACTIVITY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__IS_ENACTABLE = ACTIVITY__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__VARIABILITY_BASED_ON_ELEMENT = ACTIVITY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__VARIABILITY_TYPE = ACTIVITY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Pattern</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__INCLUDES_PATTERN = ACTIVITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__DEFAULT_CONTEXT = ACTIVITY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__VALID_CONTEXT = ACTIVITY_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Diagram URI</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS__DIAGRAM_URI = ACTIVITY_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Process</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.CapabilityPatternImpl <em>Capability Pattern</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.CapabilityPatternImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getCapabilityPattern()
-	 * @generated
-	 */
-	int CAPABILITY_PATTERN = 6;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__NAME = PROCESS__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__GROUP = PROCESS__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__OWNED_RULE = PROCESS__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__METHOD_ELEMENT_PROPERTY = PROCESS__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__BRIEF_DESCRIPTION = PROCESS__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__ID = PROCESS__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__ORDERING_GUIDE = PROCESS__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SUPPRESSED = PROCESS__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTATION = PROCESS__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__NODEICON = PROCESS__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTATION_NAME = PROCESS__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SHAPEICON = PROCESS__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTED_AFTER = PROCESS__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRESENTED_BEFORE = PROCESS__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PLANNING_DATA = PROCESS__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SUPER_ACTIVITY = PROCESS__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__HAS_MULTIPLE_OCCURRENCES = PROCESS__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_OPTIONAL = PROCESS__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_PLANNED = PROCESS__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PREFIX = PROCESS__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__GROUP1 = PROCESS__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PREDECESSOR = PROCESS__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_EVENT_DRIVEN = PROCESS__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_ONGOING = PROCESS__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_REPEATABLE = PROCESS__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__PRECONDITION = PROCESS__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__POSTCONDITION = PROCESS__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__GROUP2 = PROCESS__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__BREAKDOWN_ELEMENT = PROCESS__BREAKDOWN_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__CHECKLIST = PROCESS__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__CONCEPT = PROCESS__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__EXAMPLE = PROCESS__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__GUIDELINE = PROCESS__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Roadmap</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__ROADMAP = PROCESS__ROADMAP;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__REUSABLE_ASSET = PROCESS__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__SUPPORTING_MATERIAL = PROCESS__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__WHITEPAPER = PROCESS__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__IS_ENACTABLE = PROCESS__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__VARIABILITY_BASED_ON_ELEMENT = PROCESS__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__VARIABILITY_TYPE = PROCESS__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Pattern</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__INCLUDES_PATTERN = PROCESS__INCLUDES_PATTERN;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__DEFAULT_CONTEXT = PROCESS__DEFAULT_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__VALID_CONTEXT = PROCESS__VALID_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Diagram URI</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN__DIAGRAM_URI = PROCESS__DIAGRAM_URI;
-
-	/**
-	 * The number of structural features of the '<em>Capability Pattern</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CAPABILITY_PATTERN_FEATURE_COUNT = PROCESS_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.GuidanceImpl <em>Guidance</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.GuidanceImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getGuidance()
-	 * @generated
-	 */
-	int GUIDANCE = 33;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__GROUP = CONTENT_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__OWNED_RULE = CONTENT_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__ID = CONTENT_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__GROUP1 = CONTENT_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__CHECKLIST = CONTENT_ELEMENT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__CONCEPT = CONTENT_ELEMENT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__EXAMPLE = CONTENT_ELEMENT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__GUIDELINE = CONTENT_ELEMENT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__REUSABLE_ASSET = CONTENT_ELEMENT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__SUPPORTING_MATERIAL = CONTENT_ELEMENT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__WHITEPAPER = CONTENT_ELEMENT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Guidance</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ChecklistImpl <em>Checklist</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ChecklistImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getChecklist()
-	 * @generated
-	 */
-	int CHECKLIST = 7;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Checklist</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CHECKLIST_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DescriptorImpl <em>Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DescriptorImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDescriptor()
-	 * @generated
-	 */
-	int DESCRIPTOR = 22;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__GROUP = BREAKDOWN_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__OWNED_RULE = BREAKDOWN_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__ID = BREAKDOWN_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__SUPER_ACTIVITY = BREAKDOWN_ELEMENT__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.RoleDescriptorImpl <em>Role Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.RoleDescriptorImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleDescriptor()
-	 * @generated
-	 */
-	int ROLE_DESCRIPTOR = 64;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__NAME = DESCRIPTOR__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__GROUP = DESCRIPTOR__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__OWNED_RULE = DESCRIPTOR__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__METHOD_ELEMENT_PROPERTY = DESCRIPTOR__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__BRIEF_DESCRIPTION = DESCRIPTOR__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__ID = DESCRIPTOR__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__ORDERING_GUIDE = DESCRIPTOR__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__SUPPRESSED = DESCRIPTOR__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTATION = DESCRIPTOR__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__NODEICON = DESCRIPTOR__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTATION_NAME = DESCRIPTOR__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__SHAPEICON = DESCRIPTOR__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTED_AFTER = DESCRIPTOR__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PRESENTED_BEFORE = DESCRIPTOR__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PLANNING_DATA = DESCRIPTOR__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__SUPER_ACTIVITY = DESCRIPTOR__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__IS_OPTIONAL = DESCRIPTOR__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__IS_PLANNED = DESCRIPTOR__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__PREFIX = DESCRIPTOR__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-
-	/**
-	 * The feature id for the '<em><b>Role</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__ROLE = DESCRIPTOR_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Responsible For</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR__RESPONSIBLE_FOR = DESCRIPTOR_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Role Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTOR_FEATURE_COUNT = DESCRIPTOR_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.CompositeRoleImpl <em>Composite Role</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.CompositeRoleImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getCompositeRole()
-	 * @generated
-	 */
-	int COMPOSITE_ROLE = 8;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__NAME = ROLE_DESCRIPTOR__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__GROUP = ROLE_DESCRIPTOR__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__OWNED_RULE = ROLE_DESCRIPTOR__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__METHOD_ELEMENT_PROPERTY = ROLE_DESCRIPTOR__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__BRIEF_DESCRIPTION = ROLE_DESCRIPTOR__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__ID = ROLE_DESCRIPTOR__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__ORDERING_GUIDE = ROLE_DESCRIPTOR__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__SUPPRESSED = ROLE_DESCRIPTOR__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTATION = ROLE_DESCRIPTOR__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__NODEICON = ROLE_DESCRIPTOR__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTATION_NAME = ROLE_DESCRIPTOR__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__SHAPEICON = ROLE_DESCRIPTOR__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTED_AFTER = ROLE_DESCRIPTOR__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PRESENTED_BEFORE = ROLE_DESCRIPTOR__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PLANNING_DATA = ROLE_DESCRIPTOR__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__SUPER_ACTIVITY = ROLE_DESCRIPTOR__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__HAS_MULTIPLE_OCCURRENCES = ROLE_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__IS_OPTIONAL = ROLE_DESCRIPTOR__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__IS_PLANNED = ROLE_DESCRIPTOR__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__PREFIX = ROLE_DESCRIPTOR__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__IS_SYNCHRONIZED_WITH_SOURCE = ROLE_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-
-	/**
-	 * The feature id for the '<em><b>Role</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__ROLE = ROLE_DESCRIPTOR__ROLE;
-
-	/**
-	 * The feature id for the '<em><b>Responsible For</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__RESPONSIBLE_FOR = ROLE_DESCRIPTOR__RESPONSIBLE_FOR;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__GROUP1 = ROLE_DESCRIPTOR_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Aggregated Role</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE__AGGREGATED_ROLE = ROLE_DESCRIPTOR_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Composite Role</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPOSITE_ROLE_FEATURE_COUNT = ROLE_DESCRIPTOR_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ConceptImpl <em>Concept</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ConceptImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getConcept()
-	 * @generated
-	 */
-	int CONCEPT = 9;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Concept</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONCEPT_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ConstraintImpl <em>Constraint</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ConstraintImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getConstraint()
-	 * @generated
-	 */
-	int CONSTRAINT = 10;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__GROUP = METHOD_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__OWNED_RULE = METHOD_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__ID = METHOD_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT__MAIN_DESCRIPTION = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Constraint</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONSTRAINT_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ContentCategoryImpl <em>Content Category</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ContentCategoryImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentCategory()
-	 * @generated
-	 */
-	int CONTENT_CATEGORY = 11;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__GROUP = CONTENT_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__OWNED_RULE = CONTENT_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__ID = CONTENT_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__GROUP1 = CONTENT_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__CHECKLIST = CONTENT_ELEMENT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__CONCEPT = CONTENT_ELEMENT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__EXAMPLE = CONTENT_ELEMENT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__GUIDELINE = CONTENT_ELEMENT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__REUSABLE_ASSET = CONTENT_ELEMENT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__SUPPORTING_MATERIAL = CONTENT_ELEMENT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__WHITEPAPER = CONTENT_ELEMENT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Content Category</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MethodPackageImpl <em>Method Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MethodPackageImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodPackage()
-	 * @generated
-	 */
-	int METHOD_PACKAGE = 41;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__GROUP = METHOD_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__OWNED_RULE = METHOD_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__ID = METHOD_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__GROUP1 = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Reused Package</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__REUSED_PACKAGE = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Method Package</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__METHOD_PACKAGE = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE__GLOBAL = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Method Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PACKAGE_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ContentCategoryPackageImpl <em>Content Category Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ContentCategoryPackageImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentCategoryPackage()
-	 * @generated
-	 */
-	int CONTENT_CATEGORY_PACKAGE = 12;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__NAME = METHOD_PACKAGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__GROUP = METHOD_PACKAGE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__OWNED_RULE = METHOD_PACKAGE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__METHOD_ELEMENT_PROPERTY = METHOD_PACKAGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__BRIEF_DESCRIPTION = METHOD_PACKAGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__ID = METHOD_PACKAGE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__ORDERING_GUIDE = METHOD_PACKAGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__SUPPRESSED = METHOD_PACKAGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__GROUP1 = METHOD_PACKAGE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Reused Package</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__REUSED_PACKAGE = METHOD_PACKAGE__REUSED_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Method Package</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__METHOD_PACKAGE = METHOD_PACKAGE__METHOD_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__GLOBAL = METHOD_PACKAGE__GLOBAL;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__GROUP2 = METHOD_PACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Content Category</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY = METHOD_PACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Content Category Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_CATEGORY_PACKAGE_FEATURE_COUNT = METHOD_PACKAGE_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ContentPackageImpl <em>Content Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ContentPackageImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentPackage()
-	 * @generated
-	 */
-	int CONTENT_PACKAGE = 15;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__NAME = METHOD_PACKAGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__GROUP = METHOD_PACKAGE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__OWNED_RULE = METHOD_PACKAGE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__METHOD_ELEMENT_PROPERTY = METHOD_PACKAGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__BRIEF_DESCRIPTION = METHOD_PACKAGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__ID = METHOD_PACKAGE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__ORDERING_GUIDE = METHOD_PACKAGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__SUPPRESSED = METHOD_PACKAGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__GROUP1 = METHOD_PACKAGE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Reused Package</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__REUSED_PACKAGE = METHOD_PACKAGE__REUSED_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Method Package</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__METHOD_PACKAGE = METHOD_PACKAGE__METHOD_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__GLOBAL = METHOD_PACKAGE__GLOBAL;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__GROUP2 = METHOD_PACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Content Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE__CONTENT_ELEMENT = METHOD_PACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Content Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONTENT_PACKAGE_FEATURE_COUNT = METHOD_PACKAGE_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.CustomCategoryImpl <em>Custom Category</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.CustomCategoryImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getCustomCategory()
-	 * @generated
-	 */
-	int CUSTOM_CATEGORY = 16;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Categorized Element</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__CATEGORIZED_ELEMENT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Sub Category</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY__SUB_CATEGORY = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Custom Category</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CUSTOM_CATEGORY_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DeliverableImpl <em>Deliverable</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DeliverableImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliverable()
-	 * @generated
-	 */
-	int DELIVERABLE = 17;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__NAME = WORK_PRODUCT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__GROUP = WORK_PRODUCT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__OWNED_RULE = WORK_PRODUCT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__BRIEF_DESCRIPTION = WORK_PRODUCT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__ID = WORK_PRODUCT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__ORDERING_GUIDE = WORK_PRODUCT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__SUPPRESSED = WORK_PRODUCT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__PRESENTATION = WORK_PRODUCT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__NODEICON = WORK_PRODUCT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__PRESENTATION_NAME = WORK_PRODUCT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__SHAPEICON = WORK_PRODUCT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__GROUP1 = WORK_PRODUCT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__CHECKLIST = WORK_PRODUCT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__CONCEPT = WORK_PRODUCT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__EXAMPLE = WORK_PRODUCT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__GUIDELINE = WORK_PRODUCT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__REUSABLE_ASSET = WORK_PRODUCT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__SUPPORTING_MATERIAL = WORK_PRODUCT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__WHITEPAPER = WORK_PRODUCT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__VARIABILITY_BASED_ON_ELEMENT = WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__VARIABILITY_TYPE = WORK_PRODUCT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__GROUP2 = WORK_PRODUCT__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Estimate</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__ESTIMATE = WORK_PRODUCT__ESTIMATE;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__ESTIMATION_CONSIDERATIONS = WORK_PRODUCT__ESTIMATION_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Report</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__REPORT = WORK_PRODUCT__REPORT;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__TEMPLATE = WORK_PRODUCT__TEMPLATE;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__TOOL_MENTOR = WORK_PRODUCT__TOOL_MENTOR;
-
-	/**
-	 * The feature id for the '<em><b>Group3</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__GROUP3 = WORK_PRODUCT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Delivered Work Product</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE__DELIVERED_WORK_PRODUCT = WORK_PRODUCT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Deliverable</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_FEATURE_COUNT = WORK_PRODUCT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DeliverableDescriptionImpl <em>Deliverable Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DeliverableDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliverableDescription()
-	 * @generated
-	 */
-	int DELIVERABLE_DESCRIPTION = 18;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__NAME = WORK_PRODUCT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__GROUP = WORK_PRODUCT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__OWNED_RULE = WORK_PRODUCT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__BRIEF_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__ID = WORK_PRODUCT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__ORDERING_GUIDE = WORK_PRODUCT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__SUPPRESSED = WORK_PRODUCT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__COPYRIGHT = WORK_PRODUCT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__AUTHORS = WORK_PRODUCT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__CHANGE_DATE = WORK_PRODUCT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__CHANGE_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__VERSION = WORK_PRODUCT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__MAIN_DESCRIPTION = WORK_PRODUCT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__KEY_CONSIDERATIONS = WORK_PRODUCT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__SECTION = WORK_PRODUCT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__EXTERNAL_ID = WORK_PRODUCT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__IMPACT_OF_NOT_HAVING = WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__PURPOSE = WORK_PRODUCT_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__REASONS_FOR_NOT_NEEDING = WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING;
-
-	/**
-	 * The feature id for the '<em><b>External Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Packaging Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Deliverable Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERABLE_DESCRIPTION_FEATURE_COUNT = WORK_PRODUCT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessImpl <em>Delivery Process</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DeliveryProcessImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliveryProcess()
-	 * @generated
-	 */
-	int DELIVERY_PROCESS = 19;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__NAME = PROCESS__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__GROUP = PROCESS__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__OWNED_RULE = PROCESS__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__METHOD_ELEMENT_PROPERTY = PROCESS__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__BRIEF_DESCRIPTION = PROCESS__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__ID = PROCESS__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__ORDERING_GUIDE = PROCESS__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SUPPRESSED = PROCESS__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTATION = PROCESS__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__NODEICON = PROCESS__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTATION_NAME = PROCESS__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SHAPEICON = PROCESS__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTED_AFTER = PROCESS__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRESENTED_BEFORE = PROCESS__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PLANNING_DATA = PROCESS__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SUPER_ACTIVITY = PROCESS__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__HAS_MULTIPLE_OCCURRENCES = PROCESS__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_OPTIONAL = PROCESS__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_PLANNED = PROCESS__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PREFIX = PROCESS__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__GROUP1 = PROCESS__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PREDECESSOR = PROCESS__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_EVENT_DRIVEN = PROCESS__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_ONGOING = PROCESS__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_REPEATABLE = PROCESS__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__PRECONDITION = PROCESS__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__POSTCONDITION = PROCESS__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__GROUP2 = PROCESS__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__BREAKDOWN_ELEMENT = PROCESS__BREAKDOWN_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__CHECKLIST = PROCESS__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__CONCEPT = PROCESS__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__EXAMPLE = PROCESS__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__GUIDELINE = PROCESS__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Roadmap</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__ROADMAP = PROCESS__ROADMAP;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__REUSABLE_ASSET = PROCESS__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__SUPPORTING_MATERIAL = PROCESS__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__WHITEPAPER = PROCESS__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__IS_ENACTABLE = PROCESS__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__VARIABILITY_BASED_ON_ELEMENT = PROCESS__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__VARIABILITY_TYPE = PROCESS__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Pattern</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__INCLUDES_PATTERN = PROCESS__INCLUDES_PATTERN;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__DEFAULT_CONTEXT = PROCESS__DEFAULT_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__VALID_CONTEXT = PROCESS__VALID_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Diagram URI</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__DIAGRAM_URI = PROCESS__DIAGRAM_URI;
-
-	/**
-	 * The feature id for the '<em><b>Group3</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__GROUP3 = PROCESS_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Communications Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL = PROCESS_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Education Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS__EDUCATION_MATERIAL = PROCESS_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Delivery Process</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_FEATURE_COUNT = PROCESS_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ProcessDescriptionImpl <em>Process Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ProcessDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessDescription()
-	 * @generated
-	 */
-	int PROCESS_DESCRIPTION = 55;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__NAME = ACTIVITY_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__GROUP = ACTIVITY_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__OWNED_RULE = ACTIVITY_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__METHOD_ELEMENT_PROPERTY = ACTIVITY_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__BRIEF_DESCRIPTION = ACTIVITY_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__ID = ACTIVITY_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__ORDERING_GUIDE = ACTIVITY_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__SUPPRESSED = ACTIVITY_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__COPYRIGHT = ACTIVITY_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__AUTHORS = ACTIVITY_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__CHANGE_DATE = ACTIVITY_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__CHANGE_DESCRIPTION = ACTIVITY_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__VERSION = ACTIVITY_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__MAIN_DESCRIPTION = ACTIVITY_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__KEY_CONSIDERATIONS = ACTIVITY_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__SECTION = ACTIVITY_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__EXTERNAL_ID = ACTIVITY_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__USAGE_GUIDANCE = ACTIVITY_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__ALTERNATIVES = ACTIVITY_DESCRIPTION__ALTERNATIVES;
-
-	/**
-	 * The feature id for the '<em><b>How To Staff</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__HOW_TO_STAFF = ACTIVITY_DESCRIPTION__HOW_TO_STAFF;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__PURPOSE = ACTIVITY_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Scope</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__SCOPE = ACTIVITY_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Usage Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION__USAGE_NOTES = ACTIVITY_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Process Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_DESCRIPTION_FEATURE_COUNT = ACTIVITY_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl <em>Delivery Process Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliveryProcessDescription()
-	 * @generated
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION = 20;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__NAME = PROCESS_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__GROUP = PROCESS_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__OWNED_RULE = PROCESS_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__METHOD_ELEMENT_PROPERTY = PROCESS_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__BRIEF_DESCRIPTION = PROCESS_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__ID = PROCESS_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__ORDERING_GUIDE = PROCESS_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SUPPRESSED = PROCESS_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__COPYRIGHT = PROCESS_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__AUTHORS = PROCESS_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__CHANGE_DATE = PROCESS_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__CHANGE_DESCRIPTION = PROCESS_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__VERSION = PROCESS_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__MAIN_DESCRIPTION = PROCESS_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__KEY_CONSIDERATIONS = PROCESS_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SECTION = PROCESS_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__EXTERNAL_ID = PROCESS_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__USAGE_GUIDANCE = PROCESS_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__ALTERNATIVES = PROCESS_DESCRIPTION__ALTERNATIVES;
-
-	/**
-	 * The feature id for the '<em><b>How To Staff</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__HOW_TO_STAFF = PROCESS_DESCRIPTION__HOW_TO_STAFF;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__PURPOSE = PROCESS_DESCRIPTION__PURPOSE;
-
-	/**
-	 * The feature id for the '<em><b>Scope</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SCOPE = PROCESS_DESCRIPTION__SCOPE;
-
-	/**
-	 * The feature id for the '<em><b>Usage Notes</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__USAGE_NOTES = PROCESS_DESCRIPTION__USAGE_NOTES;
-
-	/**
-	 * The feature id for the '<em><b>Scale</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__SCALE = PROCESS_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Project Characteristics</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS = PROCESS_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Risk Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL = PROCESS_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Estimating Technique</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE = PROCESS_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Project Member Expertise</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE = PROCESS_DESCRIPTION_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Type Of Contract</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT = PROCESS_DESCRIPTION_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Delivery Process Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DELIVERY_PROCESS_DESCRIPTION_FEATURE_COUNT = PROCESS_DESCRIPTION_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DescriptorDescriptionImpl <em>Descriptor Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DescriptorDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDescriptorDescription()
-	 * @generated
-	 */
-	int DESCRIPTOR_DESCRIPTION = 23;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__NAME = BREAKDOWN_ELEMENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__GROUP = BREAKDOWN_ELEMENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__OWNED_RULE = BREAKDOWN_ELEMENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__ID = BREAKDOWN_ELEMENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__ORDERING_GUIDE = BREAKDOWN_ELEMENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__SUPPRESSED = BREAKDOWN_ELEMENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__COPYRIGHT = BREAKDOWN_ELEMENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__AUTHORS = BREAKDOWN_ELEMENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__CHANGE_DATE = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__CHANGE_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__VERSION = BREAKDOWN_ELEMENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__MAIN_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__KEY_CONSIDERATIONS = BREAKDOWN_ELEMENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__SECTION = BREAKDOWN_ELEMENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__EXTERNAL_ID = BREAKDOWN_ELEMENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Usage Guidance</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__USAGE_GUIDANCE = BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE;
-
-	/**
-	 * The feature id for the '<em><b>Refined Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Descriptor Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTOR_DESCRIPTION_FEATURE_COUNT = BREAKDOWN_ELEMENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DisciplineImpl <em>Discipline</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DisciplineImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDiscipline()
-	 * @generated
-	 */
-	int DISCIPLINE = 24;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Task</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__TASK = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Sub Discipline</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__SUB_DISCIPLINE = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Reference Workflow</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE__REFERENCE_WORKFLOW = CONTENT_CATEGORY_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Discipline</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DisciplineGroupingImpl <em>Discipline Grouping</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DisciplineGroupingImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDisciplineGrouping()
-	 * @generated
-	 */
-	int DISCIPLINE_GROUPING = 25;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Discipline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING__DISCIPLINE = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Discipline Grouping</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISCIPLINE_GROUPING_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl <em>Document Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DocumentRootImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDocumentRoot()
-	 * @generated
-	 */
-	int DOCUMENT_ROOT = 26;
-
-	/**
-	 * The feature id for the '<em><b>Mixed</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MIXED = 0;
-
-	/**
-	 * The feature id for the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XMLNS_PREFIX_MAP = 1;
-
-	/**
-	 * The feature id for the '<em><b>XSI Schema Location</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Method Configuration</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__METHOD_CONFIGURATION = 3;
-
-	/**
-	 * The feature id for the '<em><b>Method Library</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__METHOD_LIBRARY = 4;
-
-	/**
-	 * The feature id for the '<em><b>Method Plugin</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__METHOD_PLUGIN = 5;
-
-	/**
-	 * The number of structural features of the '<em>Document Root</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT_FEATURE_COUNT = 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.DomainImpl <em>Domain</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.DomainImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDomain()
-	 * @generated
-	 */
-	int DOMAIN = 27;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Work Product</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__WORK_PRODUCT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Subdomain</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN__SUBDOMAIN = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Domain</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOMAIN_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.EstimateImpl <em>Estimate</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.EstimateImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getEstimate()
-	 * @generated
-	 */
-	int ESTIMATE = 29;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__GROUP2 = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Metric</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__ESTIMATION_METRIC = GUIDANCE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE__ESTIMATION_CONSIDERATIONS = GUIDANCE_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Estimate</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.EstimatingMetricImpl <em>Estimating Metric</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.EstimatingMetricImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getEstimatingMetric()
-	 * @generated
-	 */
-	int ESTIMATING_METRIC = 30;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Estimating Metric</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATING_METRIC_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.EstimationConsiderationsImpl <em>Estimation Considerations</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.EstimationConsiderationsImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getEstimationConsiderations()
-	 * @generated
-	 */
-	int ESTIMATION_CONSIDERATIONS = 31;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Estimation Considerations</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ESTIMATION_CONSIDERATIONS_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ExampleImpl <em>Example</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ExampleImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getExample()
-	 * @generated
-	 */
-	int EXAMPLE = 32;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Example</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXAMPLE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.GuidanceDescriptionImpl <em>Guidance Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.GuidanceDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getGuidanceDescription()
-	 * @generated
-	 */
-	int GUIDANCE_DESCRIPTION = 34;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__GROUP = CONTENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__OWNED_RULE = CONTENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__ID = CONTENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__COPYRIGHT = CONTENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__SECTION = CONTENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Attachment</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION__ATTACHMENT = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Guidance Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDANCE_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.GuidelineImpl <em>Guideline</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.GuidelineImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getGuideline()
-	 * @generated
-	 */
-	int GUIDELINE = 35;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Guideline</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int GUIDELINE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.IterationImpl <em>Iteration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.IterationImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getIteration()
-	 * @generated
-	 */
-	int ITERATION = 36;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__NAME = ACTIVITY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__GROUP = ACTIVITY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__OWNED_RULE = ACTIVITY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__METHOD_ELEMENT_PROPERTY = ACTIVITY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__BRIEF_DESCRIPTION = ACTIVITY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__ID = ACTIVITY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__ORDERING_GUIDE = ACTIVITY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SUPPRESSED = ACTIVITY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTATION = ACTIVITY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__NODEICON = ACTIVITY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTATION_NAME = ACTIVITY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SHAPEICON = ACTIVITY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTED_AFTER = ACTIVITY__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRESENTED_BEFORE = ACTIVITY__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PLANNING_DATA = ACTIVITY__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SUPER_ACTIVITY = ACTIVITY__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__HAS_MULTIPLE_OCCURRENCES = ACTIVITY__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_OPTIONAL = ACTIVITY__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_PLANNED = ACTIVITY__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PREFIX = ACTIVITY__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__GROUP1 = ACTIVITY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PREDECESSOR = ACTIVITY__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_EVENT_DRIVEN = ACTIVITY__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_ONGOING = ACTIVITY__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_REPEATABLE = ACTIVITY__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__PRECONDITION = ACTIVITY__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__POSTCONDITION = ACTIVITY__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__GROUP2 = ACTIVITY__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__BREAKDOWN_ELEMENT = ACTIVITY__BREAKDOWN_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__CHECKLIST = ACTIVITY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__CONCEPT = ACTIVITY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__EXAMPLE = ACTIVITY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__GUIDELINE = ACTIVITY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Roadmap</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__ROADMAP = ACTIVITY__ROADMAP;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__REUSABLE_ASSET = ACTIVITY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__SUPPORTING_MATERIAL = ACTIVITY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__WHITEPAPER = ACTIVITY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__IS_ENACTABLE = ACTIVITY__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__VARIABILITY_BASED_ON_ELEMENT = ACTIVITY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION__VARIABILITY_TYPE = ACTIVITY__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Iteration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ITERATION_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl <em>Method Configuration</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodConfiguration()
-	 * @generated
-	 */
-	int METHOD_CONFIGURATION = 37;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__GROUP = METHOD_UNIT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__OWNED_RULE = METHOD_UNIT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__ID = METHOD_UNIT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__COPYRIGHT = METHOD_UNIT__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Base Configuration</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__BASE_CONFIGURATION = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Method Plugin Selection</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Method Package Selection</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Default View</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__DEFAULT_VIEW = METHOD_UNIT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Process View</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__PROCESS_VIEW = METHOD_UNIT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Subtracted Category</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__SUBTRACTED_CATEGORY = METHOD_UNIT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Added Category</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION__ADDED_CATEGORY = METHOD_UNIT_FEATURE_COUNT + 6;
-
-	/**
-	 * The number of structural features of the '<em>Method Configuration</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_CONFIGURATION_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 7;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MethodElementPropertyImpl <em>Method Element Property</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MethodElementPropertyImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodElementProperty()
-	 * @generated
-	 */
-	int METHOD_ELEMENT_PROPERTY = 39;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_PROPERTY__NAME = PACKAGEABLE_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_PROPERTY__VALUE = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of structural features of the '<em>Method Element Property</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_ELEMENT_PROPERTY_FEATURE_COUNT = PACKAGEABLE_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MethodLibraryImpl <em>Method Library</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MethodLibraryImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodLibrary()
-	 * @generated
-	 */
-	int METHOD_LIBRARY = 40;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__GROUP = METHOD_UNIT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__OWNED_RULE = METHOD_UNIT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__ID = METHOD_UNIT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__COPYRIGHT = METHOD_UNIT__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Method Plugin</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__METHOD_PLUGIN = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Method Configuration</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__METHOD_CONFIGURATION = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Tool</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY__TOOL = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Method Library</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_LIBRARY_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MethodPluginImpl <em>Method Plugin</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MethodPluginImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodPlugin()
-	 * @generated
-	 */
-	int METHOD_PLUGIN = 42;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__NAME = METHOD_UNIT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__GROUP = METHOD_UNIT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__OWNED_RULE = METHOD_UNIT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__METHOD_ELEMENT_PROPERTY = METHOD_UNIT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__BRIEF_DESCRIPTION = METHOD_UNIT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__ID = METHOD_UNIT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__ORDERING_GUIDE = METHOD_UNIT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__SUPPRESSED = METHOD_UNIT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__COPYRIGHT = METHOD_UNIT__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__AUTHORS = METHOD_UNIT__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__CHANGE_DATE = METHOD_UNIT__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__CHANGE_DESCRIPTION = METHOD_UNIT__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__VERSION = METHOD_UNIT__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Referenced Method Plugin</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN = METHOD_UNIT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Method Package</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__METHOD_PACKAGE = METHOD_UNIT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>User Changeable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN__USER_CHANGEABLE = METHOD_UNIT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Method Plugin</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int METHOD_PLUGIN_FEATURE_COUNT = METHOD_UNIT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.MilestoneImpl <em>Milestone</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.MilestoneImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMilestone()
-	 * @generated
-	 */
-	int MILESTONE = 44;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__NAME = WORK_BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__GROUP = WORK_BREAKDOWN_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__OWNED_RULE = WORK_BREAKDOWN_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__METHOD_ELEMENT_PROPERTY = WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__BRIEF_DESCRIPTION = WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__ID = WORK_BREAKDOWN_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__ORDERING_GUIDE = WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__SUPPRESSED = WORK_BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTATION = WORK_BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__NODEICON = WORK_BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTATION_NAME = WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__SHAPEICON = WORK_BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTED_AFTER = WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PRESENTED_BEFORE = WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PLANNING_DATA = WORK_BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__SUPER_ACTIVITY = WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__HAS_MULTIPLE_OCCURRENCES = WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_OPTIONAL = WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_PLANNED = WORK_BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PREFIX = WORK_BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__GROUP1 = WORK_BREAKDOWN_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__PREDECESSOR = WORK_BREAKDOWN_ELEMENT__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_EVENT_DRIVEN = WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_ONGOING = WORK_BREAKDOWN_ELEMENT__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE__IS_REPEATABLE = WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE;
-
-	/**
-	 * The number of structural features of the '<em>Milestone</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MILESTONE_FEATURE_COUNT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.OutcomeImpl <em>Outcome</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.OutcomeImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getOutcome()
-	 * @generated
-	 */
-	int OUTCOME = 46;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__NAME = WORK_PRODUCT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__GROUP = WORK_PRODUCT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__OWNED_RULE = WORK_PRODUCT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__METHOD_ELEMENT_PROPERTY = WORK_PRODUCT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__BRIEF_DESCRIPTION = WORK_PRODUCT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__ID = WORK_PRODUCT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__ORDERING_GUIDE = WORK_PRODUCT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__SUPPRESSED = WORK_PRODUCT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__PRESENTATION = WORK_PRODUCT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__NODEICON = WORK_PRODUCT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__PRESENTATION_NAME = WORK_PRODUCT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__SHAPEICON = WORK_PRODUCT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__GROUP1 = WORK_PRODUCT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__CHECKLIST = WORK_PRODUCT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__CONCEPT = WORK_PRODUCT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__EXAMPLE = WORK_PRODUCT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__GUIDELINE = WORK_PRODUCT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__REUSABLE_ASSET = WORK_PRODUCT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__SUPPORTING_MATERIAL = WORK_PRODUCT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__WHITEPAPER = WORK_PRODUCT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__VARIABILITY_BASED_ON_ELEMENT = WORK_PRODUCT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__VARIABILITY_TYPE = WORK_PRODUCT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__GROUP2 = WORK_PRODUCT__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Estimate</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__ESTIMATE = WORK_PRODUCT__ESTIMATE;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__ESTIMATION_CONSIDERATIONS = WORK_PRODUCT__ESTIMATION_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Report</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__REPORT = WORK_PRODUCT__REPORT;
-
-	/**
-	 * The feature id for the '<em><b>Template</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__TEMPLATE = WORK_PRODUCT__TEMPLATE;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME__TOOL_MENTOR = WORK_PRODUCT__TOOL_MENTOR;
-
-	/**
-	 * The number of structural features of the '<em>Outcome</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OUTCOME_FEATURE_COUNT = WORK_PRODUCT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.PhaseImpl <em>Phase</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.PhaseImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPhase()
-	 * @generated
-	 */
-	int PHASE = 48;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__NAME = ACTIVITY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__GROUP = ACTIVITY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__OWNED_RULE = ACTIVITY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__METHOD_ELEMENT_PROPERTY = ACTIVITY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__BRIEF_DESCRIPTION = ACTIVITY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__ID = ACTIVITY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__ORDERING_GUIDE = ACTIVITY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SUPPRESSED = ACTIVITY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTATION = ACTIVITY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__NODEICON = ACTIVITY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTATION_NAME = ACTIVITY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SHAPEICON = ACTIVITY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTED_AFTER = ACTIVITY__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRESENTED_BEFORE = ACTIVITY__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PLANNING_DATA = ACTIVITY__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SUPER_ACTIVITY = ACTIVITY__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__HAS_MULTIPLE_OCCURRENCES = ACTIVITY__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_OPTIONAL = ACTIVITY__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_PLANNED = ACTIVITY__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PREFIX = ACTIVITY__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__GROUP1 = ACTIVITY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PREDECESSOR = ACTIVITY__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_EVENT_DRIVEN = ACTIVITY__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_ONGOING = ACTIVITY__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_REPEATABLE = ACTIVITY__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__PRECONDITION = ACTIVITY__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__POSTCONDITION = ACTIVITY__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__GROUP2 = ACTIVITY__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__BREAKDOWN_ELEMENT = ACTIVITY__BREAKDOWN_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__CHECKLIST = ACTIVITY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__CONCEPT = ACTIVITY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__EXAMPLE = ACTIVITY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__GUIDELINE = ACTIVITY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Roadmap</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__ROADMAP = ACTIVITY__ROADMAP;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__REUSABLE_ASSET = ACTIVITY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__SUPPORTING_MATERIAL = ACTIVITY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__WHITEPAPER = ACTIVITY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__IS_ENACTABLE = ACTIVITY__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__VARIABILITY_BASED_ON_ELEMENT = ACTIVITY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE__VARIABILITY_TYPE = ACTIVITY__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Phase</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_FEATURE_COUNT = ACTIVITY_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.PlanningDataImpl <em>Planning Data</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.PlanningDataImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPlanningData()
-	 * @generated
-	 */
-	int PLANNING_DATA = 49;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__NAME = PROCESS_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__GROUP = PROCESS_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__OWNED_RULE = PROCESS_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__METHOD_ELEMENT_PROPERTY = PROCESS_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__BRIEF_DESCRIPTION = PROCESS_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__ID = PROCESS_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__ORDERING_GUIDE = PROCESS_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__SUPPRESSED = PROCESS_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__PRESENTATION = PROCESS_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__NODEICON = PROCESS_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__PRESENTATION_NAME = PROCESS_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__SHAPEICON = PROCESS_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Finish Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__FINISH_DATE = PROCESS_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Rank</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__RANK = PROCESS_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Start Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA__START_DATE = PROCESS_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Planning Data</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PLANNING_DATA_FEATURE_COUNT = PROCESS_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.PracticeImpl <em>Practice</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.PracticeImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPractice()
-	 * @generated
-	 */
-	int PRACTICE = 50;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__GROUP2 = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Activity Reference</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__ACTIVITY_REFERENCE = GUIDANCE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Content Reference</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__CONTENT_REFERENCE = GUIDANCE_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Sub Practice</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE__SUB_PRACTICE = GUIDANCE_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Practice</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl <em>Practice Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPracticeDescription()
-	 * @generated
-	 */
-	int PRACTICE_DESCRIPTION = 51;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__GROUP = CONTENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__OWNED_RULE = CONTENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__ID = CONTENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__COPYRIGHT = CONTENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__SECTION = CONTENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Additional Info</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__ADDITIONAL_INFO = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Application</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__APPLICATION = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Background</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__BACKGROUND = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Goals</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__GOALS = CONTENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Levels Of Adoption</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION = CONTENT_DESCRIPTION_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Problem</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION__PROBLEM = CONTENT_DESCRIPTION_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Practice Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PRACTICE_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ProcessPackageImpl <em>Process Package</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ProcessPackageImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessPackage()
-	 * @generated
-	 */
-	int PROCESS_PACKAGE = 57;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__NAME = METHOD_PACKAGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__GROUP = METHOD_PACKAGE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__OWNED_RULE = METHOD_PACKAGE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__METHOD_ELEMENT_PROPERTY = METHOD_PACKAGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__BRIEF_DESCRIPTION = METHOD_PACKAGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__ID = METHOD_PACKAGE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__ORDERING_GUIDE = METHOD_PACKAGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__SUPPRESSED = METHOD_PACKAGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__GROUP1 = METHOD_PACKAGE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Reused Package</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__REUSED_PACKAGE = METHOD_PACKAGE__REUSED_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Method Package</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__METHOD_PACKAGE = METHOD_PACKAGE__METHOD_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__GLOBAL = METHOD_PACKAGE__GLOBAL;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__GROUP2 = METHOD_PACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Process Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE__PROCESS_ELEMENT = METHOD_PACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Process Package</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PACKAGE_FEATURE_COUNT = METHOD_PACKAGE_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl <em>Process Component</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ProcessComponentImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessComponent()
-	 * @generated
-	 */
-	int PROCESS_COMPONENT = 53;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__NAME = PROCESS_PACKAGE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__GROUP = PROCESS_PACKAGE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__OWNED_RULE = PROCESS_PACKAGE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__METHOD_ELEMENT_PROPERTY = PROCESS_PACKAGE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__BRIEF_DESCRIPTION = PROCESS_PACKAGE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__ID = PROCESS_PACKAGE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__ORDERING_GUIDE = PROCESS_PACKAGE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__SUPPRESSED = PROCESS_PACKAGE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__GROUP1 = PROCESS_PACKAGE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Reused Package</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__REUSED_PACKAGE = PROCESS_PACKAGE__REUSED_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Method Package</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__METHOD_PACKAGE = PROCESS_PACKAGE__METHOD_PACKAGE;
-
-	/**
-	 * The feature id for the '<em><b>Global</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__GLOBAL = PROCESS_PACKAGE__GLOBAL;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__GROUP2 = PROCESS_PACKAGE__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Process Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__PROCESS_ELEMENT = PROCESS_PACKAGE__PROCESS_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__COPYRIGHT = PROCESS_PACKAGE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Interface</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__INTERFACE = PROCESS_PACKAGE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Process</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__PROCESS = PROCESS_PACKAGE_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__AUTHORS = PROCESS_PACKAGE_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__CHANGE_DATE = PROCESS_PACKAGE_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__CHANGE_DESCRIPTION = PROCESS_PACKAGE_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT__VERSION = PROCESS_PACKAGE_FEATURE_COUNT + 6;
-
-	/**
-	 * The number of structural features of the '<em>Process Component</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_FEATURE_COUNT = PROCESS_PACKAGE_FEATURE_COUNT + 7;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ProcessComponentInterfaceImpl <em>Process Component Interface</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ProcessComponentInterfaceImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessComponentInterface()
-	 * @generated
-	 */
-	int PROCESS_COMPONENT_INTERFACE = 54;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__GROUP = BREAKDOWN_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__OWNED_RULE = BREAKDOWN_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__ID = BREAKDOWN_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__SUPER_ACTIVITY = BREAKDOWN_ELEMENT__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__GROUP1 = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Interface Specification</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Interface IO</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE__INTERFACE_IO = BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Process Component Interface</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_COMPONENT_INTERFACE_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ProcessPlanningTemplateImpl <em>Process Planning Template</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ProcessPlanningTemplateImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessPlanningTemplate()
-	 * @generated
-	 */
-	int PROCESS_PLANNING_TEMPLATE = 58;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__NAME = PROCESS__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__GROUP = PROCESS__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__OWNED_RULE = PROCESS__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__METHOD_ELEMENT_PROPERTY = PROCESS__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__BRIEF_DESCRIPTION = PROCESS__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__ID = PROCESS__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__ORDERING_GUIDE = PROCESS__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SUPPRESSED = PROCESS__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTATION = PROCESS__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__NODEICON = PROCESS__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTATION_NAME = PROCESS__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SHAPEICON = PROCESS__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTED_AFTER = PROCESS__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRESENTED_BEFORE = PROCESS__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PLANNING_DATA = PROCESS__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SUPER_ACTIVITY = PROCESS__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__HAS_MULTIPLE_OCCURRENCES = PROCESS__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_OPTIONAL = PROCESS__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_PLANNED = PROCESS__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PREFIX = PROCESS__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__GROUP1 = PROCESS__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PREDECESSOR = PROCESS__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_EVENT_DRIVEN = PROCESS__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_ONGOING = PROCESS__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_REPEATABLE = PROCESS__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__PRECONDITION = PROCESS__PRECONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__POSTCONDITION = PROCESS__POSTCONDITION;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__GROUP2 = PROCESS__GROUP2;
-
-	/**
-	 * The feature id for the '<em><b>Breakdown Element</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__BREAKDOWN_ELEMENT = PROCESS__BREAKDOWN_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__CHECKLIST = PROCESS__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__CONCEPT = PROCESS__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__EXAMPLE = PROCESS__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__GUIDELINE = PROCESS__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Roadmap</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__ROADMAP = PROCESS__ROADMAP;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__REUSABLE_ASSET = PROCESS__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__SUPPORTING_MATERIAL = PROCESS__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__WHITEPAPER = PROCESS__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Is Enactable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__IS_ENACTABLE = PROCESS__IS_ENACTABLE;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__VARIABILITY_BASED_ON_ELEMENT = PROCESS__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__VARIABILITY_TYPE = PROCESS__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Includes Pattern</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__INCLUDES_PATTERN = PROCESS__INCLUDES_PATTERN;
-
-	/**
-	 * The feature id for the '<em><b>Default Context</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__DEFAULT_CONTEXT = PROCESS__DEFAULT_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Valid Context</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__VALID_CONTEXT = PROCESS__VALID_CONTEXT;
-
-	/**
-	 * The feature id for the '<em><b>Diagram URI</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__DIAGRAM_URI = PROCESS__DIAGRAM_URI;
-
-	/**
-	 * The feature id for the '<em><b>Group3</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__GROUP3 = PROCESS_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Base Process</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE__BASE_PROCESS = PROCESS_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Process Planning Template</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROCESS_PLANNING_TEMPLATE_FEATURE_COUNT = PROCESS_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ReportImpl <em>Report</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ReportImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getReport()
-	 * @generated
-	 */
-	int REPORT = 59;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Report</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REPORT_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ReusableAssetImpl <em>Reusable Asset</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ReusableAssetImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getReusableAsset()
-	 * @generated
-	 */
-	int REUSABLE_ASSET = 60;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Reusable Asset</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REUSABLE_ASSET_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.RoadmapImpl <em>Roadmap</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.RoadmapImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoadmap()
-	 * @generated
-	 */
-	int ROADMAP = 61;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Roadmap</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROADMAP_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.RoleImpl <em>Role</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.RoleImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRole()
-	 * @generated
-	 */
-	int ROLE = 62;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__GROUP = CONTENT_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__OWNED_RULE = CONTENT_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__ID = CONTENT_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__GROUP1 = CONTENT_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__CHECKLIST = CONTENT_ELEMENT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__CONCEPT = CONTENT_ELEMENT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__EXAMPLE = CONTENT_ELEMENT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__GUIDELINE = CONTENT_ELEMENT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__REUSABLE_ASSET = CONTENT_ELEMENT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__SUPPORTING_MATERIAL = CONTENT_ELEMENT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__WHITEPAPER = CONTENT_ELEMENT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__GROUP2 = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Responsible For</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE__RESPONSIBLE_FOR = CONTENT_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Role</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.RoleDescriptionImpl <em>Role Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.RoleDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleDescription()
-	 * @generated
-	 */
-	int ROLE_DESCRIPTION = 63;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__GROUP = CONTENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__OWNED_RULE = CONTENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__ID = CONTENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__COPYRIGHT = CONTENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SECTION = CONTENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Assignment Approaches</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Skills</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SKILLS = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Synonyms</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION__SYNONYMS = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the '<em>Role Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.RoleSetImpl <em>Role Set</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.RoleSetImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleSet()
-	 * @generated
-	 */
-	int ROLE_SET = 65;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Role</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET__ROLE = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Role Set</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.RoleSetGroupingImpl <em>Role Set Grouping</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.RoleSetGroupingImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleSetGrouping()
-	 * @generated
-	 */
-	int ROLE_SET_GROUPING = 66;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Role Set</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING__ROLE_SET = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Role Set Grouping</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ROLE_SET_GROUPING_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.SectionImpl <em>Section</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.SectionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getSection()
-	 * @generated
-	 */
-	int SECTION = 67;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__GROUP = METHOD_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__OWNED_RULE = METHOD_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__ID = METHOD_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Sub Section</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__SUB_SECTION = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__PREDECESSOR = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__DESCRIPTION = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Section Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__SECTION_NAME = METHOD_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__VARIABILITY_BASED_ON_ELEMENT = METHOD_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION__VARIABILITY_TYPE = METHOD_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The number of structural features of the '<em>Section</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.SupportingMaterialImpl <em>Supporting Material</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.SupportingMaterialImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getSupportingMaterial()
-	 * @generated
-	 */
-	int SUPPORTING_MATERIAL = 68;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Supporting Material</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTING_MATERIAL_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.TaskImpl <em>Task</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.TaskImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTask()
-	 * @generated
-	 */
-	int TASK = 69;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__NAME = CONTENT_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__GROUP = CONTENT_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OWNED_RULE = CONTENT_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__METHOD_ELEMENT_PROPERTY = CONTENT_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__BRIEF_DESCRIPTION = CONTENT_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ID = CONTENT_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ORDERING_GUIDE = CONTENT_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SUPPRESSED = CONTENT_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRESENTATION = CONTENT_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__NODEICON = CONTENT_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRESENTATION_NAME = CONTENT_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SHAPEICON = CONTENT_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__GROUP1 = CONTENT_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CHECKLIST = CONTENT_ELEMENT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__CONCEPT = CONTENT_ELEMENT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__EXAMPLE = CONTENT_ELEMENT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__GUIDELINE = CONTENT_ELEMENT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__REUSABLE_ASSET = CONTENT_ELEMENT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__SUPPORTING_MATERIAL = CONTENT_ELEMENT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__WHITEPAPER = CONTENT_ELEMENT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__VARIABILITY_BASED_ON_ELEMENT = CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__VARIABILITY_TYPE = CONTENT_ELEMENT__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PRECONDITION = CONTENT_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__POSTCONDITION = CONTENT_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Performed By</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__PERFORMED_BY = CONTENT_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__GROUP2 = CONTENT_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Mandatory Input</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__MANDATORY_INPUT = CONTENT_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Output</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OUTPUT = CONTENT_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Additionally Performed By</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ADDITIONALLY_PERFORMED_BY = CONTENT_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Optional Input</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__OPTIONAL_INPUT = CONTENT_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Estimate</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ESTIMATE = CONTENT_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__ESTIMATION_CONSIDERATIONS = CONTENT_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK__TOOL_MENTOR = CONTENT_ELEMENT_FEATURE_COUNT + 10;
-
-	/**
-	 * The number of structural features of the '<em>Task</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_FEATURE_COUNT = CONTENT_ELEMENT_FEATURE_COUNT + 11;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.TaskDescriptionImpl <em>Task Description</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.TaskDescriptionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTaskDescription()
-	 * @generated
-	 */
-	int TASK_DESCRIPTION = 70;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__NAME = CONTENT_DESCRIPTION__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__GROUP = CONTENT_DESCRIPTION__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__OWNED_RULE = CONTENT_DESCRIPTION__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__METHOD_ELEMENT_PROPERTY = CONTENT_DESCRIPTION__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__BRIEF_DESCRIPTION = CONTENT_DESCRIPTION__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__ID = CONTENT_DESCRIPTION__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__ORDERING_GUIDE = CONTENT_DESCRIPTION__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__SUPPRESSED = CONTENT_DESCRIPTION__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Copyright</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__COPYRIGHT = CONTENT_DESCRIPTION__COPYRIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Authors</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__AUTHORS = CONTENT_DESCRIPTION__AUTHORS;
-
-	/**
-	 * The feature id for the '<em><b>Change Date</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__CHANGE_DATE = CONTENT_DESCRIPTION__CHANGE_DATE;
-
-	/**
-	 * The feature id for the '<em><b>Change Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__CHANGE_DESCRIPTION = CONTENT_DESCRIPTION__CHANGE_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Version</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__VERSION = CONTENT_DESCRIPTION__VERSION;
-
-	/**
-	 * The feature id for the '<em><b>Main Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__MAIN_DESCRIPTION = CONTENT_DESCRIPTION__MAIN_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Key Considerations</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__KEY_CONSIDERATIONS = CONTENT_DESCRIPTION__KEY_CONSIDERATIONS;
-
-	/**
-	 * The feature id for the '<em><b>Section</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__SECTION = CONTENT_DESCRIPTION__SECTION;
-
-	/**
-	 * The feature id for the '<em><b>External Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__EXTERNAL_ID = CONTENT_DESCRIPTION__EXTERNAL_ID;
-
-	/**
-	 * The feature id for the '<em><b>Alternatives</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__ALTERNATIVES = CONTENT_DESCRIPTION_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION__PURPOSE = CONTENT_DESCRIPTION_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Task Description</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTION_FEATURE_COUNT = CONTENT_DESCRIPTION_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl <em>Task Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTaskDescriptor()
-	 * @generated
-	 */
-	int TASK_DESCRIPTOR = 71;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__NAME = WORK_BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__GROUP = WORK_BREAKDOWN_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__OWNED_RULE = WORK_BREAKDOWN_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__METHOD_ELEMENT_PROPERTY = WORK_BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__BRIEF_DESCRIPTION = WORK_BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__ID = WORK_BREAKDOWN_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__ORDERING_GUIDE = WORK_BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__SUPPRESSED = WORK_BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTATION = WORK_BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__NODEICON = WORK_BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTATION_NAME = WORK_BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__SHAPEICON = WORK_BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTED_AFTER = WORK_BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PRESENTED_BEFORE = WORK_BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PLANNING_DATA = WORK_BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__SUPER_ACTIVITY = WORK_BREAKDOWN_ELEMENT__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = WORK_BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_OPTIONAL = WORK_BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_PLANNED = WORK_BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PREFIX = WORK_BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__GROUP1 = WORK_BREAKDOWN_ELEMENT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Predecessor</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PREDECESSOR = WORK_BREAKDOWN_ELEMENT__PREDECESSOR;
-
-	/**
-	 * The feature id for the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_EVENT_DRIVEN = WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN;
-
-	/**
-	 * The feature id for the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_ONGOING = WORK_BREAKDOWN_ELEMENT__IS_ONGOING;
-
-	/**
-	 * The feature id for the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_REPEATABLE = WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE;
-
-	/**
-	 * The feature id for the '<em><b>Task</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__TASK = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Performed Primarily By</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__GROUP2 = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Additionally Performed By</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Assisted By</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__ASSISTED_BY = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>External Input</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__EXTERNAL_INPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Mandatory Input</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__MANDATORY_INPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Optional Input</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__OPTIONAL_INPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Output</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__OUTPUT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Step</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__STEP = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 10;
-
-	/**
-	 * The number of structural features of the '<em>Task Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TASK_DESCRIPTOR_FEATURE_COUNT = WORK_BREAKDOWN_ELEMENT_FEATURE_COUNT + 11;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.TeamProfileImpl <em>Team Profile</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.TeamProfileImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTeamProfile()
-	 * @generated
-	 */
-	int TEAM_PROFILE = 72;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__NAME = BREAKDOWN_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__GROUP = BREAKDOWN_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__OWNED_RULE = BREAKDOWN_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__METHOD_ELEMENT_PROPERTY = BREAKDOWN_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__BRIEF_DESCRIPTION = BREAKDOWN_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__ID = BREAKDOWN_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__ORDERING_GUIDE = BREAKDOWN_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUPPRESSED = BREAKDOWN_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTATION = BREAKDOWN_ELEMENT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__NODEICON = BREAKDOWN_ELEMENT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTATION_NAME = BREAKDOWN_ELEMENT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SHAPEICON = BREAKDOWN_ELEMENT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTED_AFTER = BREAKDOWN_ELEMENT__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PRESENTED_BEFORE = BREAKDOWN_ELEMENT__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PLANNING_DATA = BREAKDOWN_ELEMENT__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUPER_ACTIVITY = BREAKDOWN_ELEMENT__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__HAS_MULTIPLE_OCCURRENCES = BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__IS_OPTIONAL = BREAKDOWN_ELEMENT__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__IS_PLANNED = BREAKDOWN_ELEMENT__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__PREFIX = BREAKDOWN_ELEMENT__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__GROUP1 = BREAKDOWN_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Role</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__ROLE = BREAKDOWN_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Super Team</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUPER_TEAM = BREAKDOWN_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Sub Team</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE__SUB_TEAM = BREAKDOWN_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The number of structural features of the '<em>Team Profile</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEAM_PROFILE_FEATURE_COUNT = BREAKDOWN_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.TemplateImpl <em>Template</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.TemplateImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTemplate()
-	 * @generated
-	 */
-	int TEMPLATE = 73;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Template</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TEMPLATE_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.TermDefinitionImpl <em>Term Definition</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.TermDefinitionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTermDefinition()
-	 * @generated
-	 */
-	int TERM_DEFINITION = 74;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Term Definition</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TERM_DEFINITION_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ToolImpl <em>Tool</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ToolImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTool()
-	 * @generated
-	 */
-	int TOOL = 75;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL__TOOL_MENTOR = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Tool</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.ToolMentorImpl <em>Tool Mentor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.ToolMentorImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getToolMentor()
-	 * @generated
-	 */
-	int TOOL_MENTOR = 76;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__NAME = GUIDANCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__GROUP = GUIDANCE__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__OWNED_RULE = GUIDANCE__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__METHOD_ELEMENT_PROPERTY = GUIDANCE__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__BRIEF_DESCRIPTION = GUIDANCE__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__ID = GUIDANCE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__ORDERING_GUIDE = GUIDANCE__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__SUPPRESSED = GUIDANCE__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__PRESENTATION = GUIDANCE__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__NODEICON = GUIDANCE__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__PRESENTATION_NAME = GUIDANCE__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__SHAPEICON = GUIDANCE__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__GROUP1 = GUIDANCE__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__CHECKLIST = GUIDANCE__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__CONCEPT = GUIDANCE__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__EXAMPLE = GUIDANCE__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__GUIDELINE = GUIDANCE__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__REUSABLE_ASSET = GUIDANCE__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__SUPPORTING_MATERIAL = GUIDANCE__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__WHITEPAPER = GUIDANCE__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__VARIABILITY_BASED_ON_ELEMENT = GUIDANCE__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR__VARIABILITY_TYPE = GUIDANCE__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Tool Mentor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TOOL_MENTOR_FEATURE_COUNT = GUIDANCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WhitepaperImpl <em>Whitepaper</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WhitepaperImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWhitepaper()
-	 * @generated
-	 */
-	int WHITEPAPER = 77;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__NAME = CONCEPT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__GROUP = CONCEPT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__OWNED_RULE = CONCEPT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__METHOD_ELEMENT_PROPERTY = CONCEPT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__BRIEF_DESCRIPTION = CONCEPT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__ID = CONCEPT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__ORDERING_GUIDE = CONCEPT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__SUPPRESSED = CONCEPT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__PRESENTATION = CONCEPT__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__NODEICON = CONCEPT__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__PRESENTATION_NAME = CONCEPT__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__SHAPEICON = CONCEPT__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__GROUP1 = CONCEPT__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__CHECKLIST = CONCEPT__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__CONCEPT = CONCEPT__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__EXAMPLE = CONCEPT__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__GUIDELINE = CONCEPT__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__REUSABLE_ASSET = CONCEPT__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__SUPPORTING_MATERIAL = CONCEPT__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__WHITEPAPER = CONCEPT__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__VARIABILITY_BASED_ON_ELEMENT = CONCEPT__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER__VARIABILITY_TYPE = CONCEPT__VARIABILITY_TYPE;
-
-	/**
-	 * The number of structural features of the '<em>Whitepaper</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WHITEPAPER_FEATURE_COUNT = CONCEPT_FEATURE_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WorkDefinitionImpl <em>Work Definition</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WorkDefinitionImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkDefinition()
-	 * @generated
-	 */
-	int WORK_DEFINITION = 79;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__NAME = METHOD_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__GROUP = METHOD_ELEMENT__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__OWNED_RULE = METHOD_ELEMENT__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__METHOD_ELEMENT_PROPERTY = METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__BRIEF_DESCRIPTION = METHOD_ELEMENT__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__ID = METHOD_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__ORDERING_GUIDE = METHOD_ELEMENT__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__SUPPRESSED = METHOD_ELEMENT__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__PRECONDITION = METHOD_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION__POSTCONDITION = METHOD_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Work Definition</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_DEFINITION_FEATURE_COUNT = METHOD_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WorkOrderImpl <em>Work Order</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WorkOrderImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkOrder()
-	 * @generated
-	 */
-	int WORK_ORDER = 80;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__VALUE = 0;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__ID = 1;
-
-	/**
-	 * The feature id for the '<em><b>Link Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER__LINK_TYPE = 2;
-
-	/**
-	 * The number of structural features of the '<em>Work Order</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_ORDER_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl <em>Work Product Descriptor</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProductDescriptor()
-	 * @generated
-	 */
-	int WORK_PRODUCT_DESCRIPTOR = 83;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__NAME = DESCRIPTOR__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__GROUP = DESCRIPTOR__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__OWNED_RULE = DESCRIPTOR__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__METHOD_ELEMENT_PROPERTY = DESCRIPTOR__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__BRIEF_DESCRIPTION = DESCRIPTOR__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__ID = DESCRIPTOR__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__ORDERING_GUIDE = DESCRIPTOR__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__SUPPRESSED = DESCRIPTOR__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTATION = DESCRIPTOR__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__NODEICON = DESCRIPTOR__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTATION_NAME = DESCRIPTOR__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__SHAPEICON = DESCRIPTOR__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presented After</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTED_AFTER = DESCRIPTOR__PRESENTED_AFTER;
-
-	/**
-	 * The feature id for the '<em><b>Presented Before</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PRESENTED_BEFORE = DESCRIPTOR__PRESENTED_BEFORE;
-
-	/**
-	 * The feature id for the '<em><b>Planning Data</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PLANNING_DATA = DESCRIPTOR__PLANNING_DATA;
-
-	/**
-	 * The feature id for the '<em><b>Super Activity</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__SUPER_ACTIVITY = DESCRIPTOR__SUPER_ACTIVITY;
-
-	/**
-	 * The feature id for the '<em><b>Has Multiple Occurrences</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES = DESCRIPTOR__HAS_MULTIPLE_OCCURRENCES;
-
-	/**
-	 * The feature id for the '<em><b>Is Optional</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IS_OPTIONAL = DESCRIPTOR__IS_OPTIONAL;
-
-	/**
-	 * The feature id for the '<em><b>Is Planned</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IS_PLANNED = DESCRIPTOR__IS_PLANNED;
-
-	/**
-	 * The feature id for the '<em><b>Prefix</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__PREFIX = DESCRIPTOR__PREFIX;
-
-	/**
-	 * The feature id for the '<em><b>Is Synchronized With Source</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE;
-
-	/**
-	 * The feature id for the '<em><b>Work Product</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT = DESCRIPTOR_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Responsible Role</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE = DESCRIPTOR_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__GROUP1 = DESCRIPTOR_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>External Input To</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO = DESCRIPTOR_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Impacted By</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY = DESCRIPTOR_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Impacts</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__IMPACTS = DESCRIPTOR_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Mandatory Input To</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO = DESCRIPTOR_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Optional Input To</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO = DESCRIPTOR_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Output From</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM = DESCRIPTOR_FEATURE_COUNT + 8;
-
-	/**
-	 * The feature id for the '<em><b>Deliverable Parts</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS = DESCRIPTOR_FEATURE_COUNT + 9;
-
-	/**
-	 * The feature id for the '<em><b>Activity Entry State</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE = DESCRIPTOR_FEATURE_COUNT + 10;
-
-	/**
-	 * The feature id for the '<em><b>Activity Exit State</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE = DESCRIPTOR_FEATURE_COUNT + 11;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Descriptor</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_DESCRIPTOR_FEATURE_COUNT = DESCRIPTOR_FEATURE_COUNT + 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductTypeImpl <em>Work Product Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.impl.WorkProductTypeImpl
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProductType()
-	 * @generated
-	 */
-	int WORK_PRODUCT_TYPE = 84;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__NAME = CONTENT_CATEGORY__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Group</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__GROUP = CONTENT_CATEGORY__GROUP;
-
-	/**
-	 * The feature id for the '<em><b>Owned Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__OWNED_RULE = CONTENT_CATEGORY__OWNED_RULE;
-
-	/**
-	 * The feature id for the '<em><b>Method Element Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__METHOD_ELEMENT_PROPERTY = CONTENT_CATEGORY__METHOD_ELEMENT_PROPERTY;
-
-	/**
-	 * The feature id for the '<em><b>Brief Description</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__BRIEF_DESCRIPTION = CONTENT_CATEGORY__BRIEF_DESCRIPTION;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__ID = CONTENT_CATEGORY__ID;
-
-	/**
-	 * The feature id for the '<em><b>Ordering Guide</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__ORDERING_GUIDE = CONTENT_CATEGORY__ORDERING_GUIDE;
-
-	/**
-	 * The feature id for the '<em><b>Suppressed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__SUPPRESSED = CONTENT_CATEGORY__SUPPRESSED;
-
-	/**
-	 * The feature id for the '<em><b>Presentation</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__PRESENTATION = CONTENT_CATEGORY__PRESENTATION;
-
-	/**
-	 * The feature id for the '<em><b>Nodeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__NODEICON = CONTENT_CATEGORY__NODEICON;
-
-	/**
-	 * The feature id for the '<em><b>Presentation Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__PRESENTATION_NAME = CONTENT_CATEGORY__PRESENTATION_NAME;
-
-	/**
-	 * The feature id for the '<em><b>Shapeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__SHAPEICON = CONTENT_CATEGORY__SHAPEICON;
-
-	/**
-	 * The feature id for the '<em><b>Group1</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__GROUP1 = CONTENT_CATEGORY__GROUP1;
-
-	/**
-	 * The feature id for the '<em><b>Checklist</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__CHECKLIST = CONTENT_CATEGORY__CHECKLIST;
-
-	/**
-	 * The feature id for the '<em><b>Concept</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__CONCEPT = CONTENT_CATEGORY__CONCEPT;
-
-	/**
-	 * The feature id for the '<em><b>Example</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__EXAMPLE = CONTENT_CATEGORY__EXAMPLE;
-
-	/**
-	 * The feature id for the '<em><b>Guideline</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__GUIDELINE = CONTENT_CATEGORY__GUIDELINE;
-
-	/**
-	 * The feature id for the '<em><b>Reusable Asset</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__REUSABLE_ASSET = CONTENT_CATEGORY__REUSABLE_ASSET;
-
-	/**
-	 * The feature id for the '<em><b>Supporting Material</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__SUPPORTING_MATERIAL = CONTENT_CATEGORY__SUPPORTING_MATERIAL;
-
-	/**
-	 * The feature id for the '<em><b>Whitepaper</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__WHITEPAPER = CONTENT_CATEGORY__WHITEPAPER;
-
-	/**
-	 * The feature id for the '<em><b>Variability Based On Element</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__VARIABILITY_BASED_ON_ELEMENT = CONTENT_CATEGORY__VARIABILITY_BASED_ON_ELEMENT;
-
-	/**
-	 * The feature id for the '<em><b>Variability Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__VARIABILITY_TYPE = CONTENT_CATEGORY__VARIABILITY_TYPE;
-
-	/**
-	 * The feature id for the '<em><b>Group2</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__GROUP2 = CONTENT_CATEGORY_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Work Product</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE__WORK_PRODUCT = CONTENT_CATEGORY_FEATURE_COUNT + 1;
-
-	/**
-	 * The number of structural features of the '<em>Work Product Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int WORK_PRODUCT_TYPE_FEATURE_COUNT = CONTENT_CATEGORY_FEATURE_COUNT + 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.VariabilityType <em>Variability Type</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getVariabilityType()
-	 * @generated
-	 */
-	int VARIABILITY_TYPE = 85;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.epf.xml.uma.WorkOrderType <em>Work Order Type</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.WorkOrderType
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkOrderType()
-	 * @generated
-	 */
-	int WORK_ORDER_TYPE = 86;
-
-	/**
-	 * The meta object id for the '<em>Variability Type Object</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getVariabilityTypeObject()
-	 * @generated
-	 */
-	int VARIABILITY_TYPE_OBJECT = 87;
-
-	/**
-	 * The meta object id for the '<em>Work Order Type Object</em>' data type.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.epf.xml.uma.WorkOrderType
-	 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkOrderTypeObject()
-	 * @generated
-	 */
-	int WORK_ORDER_TYPE_OBJECT = 88;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Activity <em>Activity</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Activity</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity
-	 * @generated
-	 */
-	EClass getActivity();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Activity#getPrecondition <em>Precondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Precondition</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getPrecondition()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Precondition();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Activity#getPostcondition <em>Postcondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Postcondition</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getPostcondition()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Postcondition();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getGroup2()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Group2();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.Activity#getBreakdownElement <em>Breakdown Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Breakdown Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getBreakdownElement()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EReference getActivity_BreakdownElement();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getChecklist <em>Checklist</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Checklist</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getChecklist()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Checklist();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getConcept <em>Concept</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Concept</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getConcept()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Concept();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getExample <em>Example</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Example</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getExample()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Example();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getGuideline <em>Guideline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Guideline</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getGuideline()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Guideline();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getRoadmap <em>Roadmap</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Roadmap</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getRoadmap()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Roadmap();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getReusableAsset <em>Reusable Asset</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Reusable Asset</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getReusableAsset()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_ReusableAsset();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getSupportingMaterial <em>Supporting Material</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Supporting Material</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getSupportingMaterial()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_SupportingMaterial();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Activity#getWhitepaper <em>Whitepaper</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Whitepaper</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getWhitepaper()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_Whitepaper();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Activity#isIsEnactable <em>Is Enactable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Enactable</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#isIsEnactable()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_IsEnactable();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Activity#getVariabilityBasedOnElement <em>Variability Based On Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Variability Based On Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getVariabilityBasedOnElement()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_VariabilityBasedOnElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Activity#getVariabilityType <em>Variability Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Variability Type</em>'.
-	 * @see org.eclipse.epf.xml.uma.Activity#getVariabilityType()
-	 * @see #getActivity()
-	 * @generated
-	 */
-	EAttribute getActivity_VariabilityType();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ActivityDescription <em>Activity Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Activity Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.ActivityDescription
-	 * @generated
-	 */
-	EClass getActivityDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ActivityDescription#getAlternatives <em>Alternatives</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Alternatives</em>'.
-	 * @see org.eclipse.epf.xml.uma.ActivityDescription#getAlternatives()
-	 * @see #getActivityDescription()
-	 * @generated
-	 */
-	EAttribute getActivityDescription_Alternatives();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ActivityDescription#getHowToStaff <em>How To Staff</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>How To Staff</em>'.
-	 * @see org.eclipse.epf.xml.uma.ActivityDescription#getHowToStaff()
-	 * @see #getActivityDescription()
-	 * @generated
-	 */
-	EAttribute getActivityDescription_HowToStaff();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ActivityDescription#getPurpose <em>Purpose</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Purpose</em>'.
-	 * @see org.eclipse.epf.xml.uma.ActivityDescription#getPurpose()
-	 * @see #getActivityDescription()
-	 * @generated
-	 */
-	EAttribute getActivityDescription_Purpose();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Artifact <em>Artifact</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Artifact</em>'.
-	 * @see org.eclipse.epf.xml.uma.Artifact
-	 * @generated
-	 */
-	EClass getArtifact();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Artifact#getGroup3 <em>Group3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group3</em>'.
-	 * @see org.eclipse.epf.xml.uma.Artifact#getGroup3()
-	 * @see #getArtifact()
-	 * @generated
-	 */
-	EAttribute getArtifact_Group3();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.Artifact#getContainedArtifact <em>Contained Artifact</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Contained Artifact</em>'.
-	 * @see org.eclipse.epf.xml.uma.Artifact#getContainedArtifact()
-	 * @see #getArtifact()
-	 * @generated
-	 */
-	EReference getArtifact_ContainedArtifact();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ArtifactDescription <em>Artifact Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Artifact Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.ArtifactDescription
-	 * @generated
-	 */
-	EClass getArtifactDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getBriefOutline <em>Brief Outline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Brief Outline</em>'.
-	 * @see org.eclipse.epf.xml.uma.ArtifactDescription#getBriefOutline()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_BriefOutline();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentationOptions <em>Representation Options</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Representation Options</em>'.
-	 * @see org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentationOptions()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_RepresentationOptions();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentation <em>Representation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Representation</em>'.
-	 * @see org.eclipse.epf.xml.uma.ArtifactDescription#getRepresentation()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_Representation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ArtifactDescription#getNotation <em>Notation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Notation</em>'.
-	 * @see org.eclipse.epf.xml.uma.ArtifactDescription#getNotation()
-	 * @see #getArtifactDescription()
-	 * @generated
-	 */
-	EAttribute getArtifactDescription_Notation();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.BreakdownElement <em>Breakdown Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Breakdown Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement
-	 * @generated
-	 */
-	EClass getBreakdownElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPresentedAfter <em>Presented After</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Presented After</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#getPresentedAfter()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_PresentedAfter();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPresentedBefore <em>Presented Before</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Presented Before</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#getPresentedBefore()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_PresentedBefore();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPlanningData <em>Planning Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Planning Data</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#getPlanningData()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_PlanningData();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#getSuperActivity <em>Super Activity</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Super Activity</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#getSuperActivity()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_SuperActivity();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#isHasMultipleOccurrences <em>Has Multiple Occurrences</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Has Multiple Occurrences</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#isHasMultipleOccurrences()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_HasMultipleOccurrences();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsOptional <em>Is Optional</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Optional</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#isIsOptional()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_IsOptional();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#isIsPlanned <em>Is Planned</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Planned</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#isIsPlanned()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_IsPlanned();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElement#getPrefix <em>Prefix</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Prefix</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElement#getPrefix()
-	 * @see #getBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getBreakdownElement_Prefix();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.BreakdownElementDescription <em>Breakdown Element Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Breakdown Element Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElementDescription
-	 * @generated
-	 */
-	EClass getBreakdownElementDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.BreakdownElementDescription#getUsageGuidance <em>Usage Guidance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Usage Guidance</em>'.
-	 * @see org.eclipse.epf.xml.uma.BreakdownElementDescription#getUsageGuidance()
-	 * @see #getBreakdownElementDescription()
-	 * @generated
-	 */
-	EAttribute getBreakdownElementDescription_UsageGuidance();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.CapabilityPattern <em>Capability Pattern</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Capability Pattern</em>'.
-	 * @see org.eclipse.epf.xml.uma.CapabilityPattern
-	 * @generated
-	 */
-	EClass getCapabilityPattern();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Checklist <em>Checklist</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Checklist</em>'.
-	 * @see org.eclipse.epf.xml.uma.Checklist
-	 * @generated
-	 */
-	EClass getChecklist();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.CompositeRole <em>Composite Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Composite Role</em>'.
-	 * @see org.eclipse.epf.xml.uma.CompositeRole
-	 * @generated
-	 */
-	EClass getCompositeRole();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.CompositeRole#getGroup1 <em>Group1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group1</em>'.
-	 * @see org.eclipse.epf.xml.uma.CompositeRole#getGroup1()
-	 * @see #getCompositeRole()
-	 * @generated
-	 */
-	EAttribute getCompositeRole_Group1();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.CompositeRole#getAggregatedRole <em>Aggregated Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Aggregated Role</em>'.
-	 * @see org.eclipse.epf.xml.uma.CompositeRole#getAggregatedRole()
-	 * @see #getCompositeRole()
-	 * @generated
-	 */
-	EReference getCompositeRole_AggregatedRole();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Concept <em>Concept</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Concept</em>'.
-	 * @see org.eclipse.epf.xml.uma.Concept
-	 * @generated
-	 */
-	EClass getConcept();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Constraint <em>Constraint</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Constraint</em>'.
-	 * @see org.eclipse.epf.xml.uma.Constraint
-	 * @generated
-	 */
-	EClass getConstraint();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Constraint#getMainDescription <em>Main Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Main Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.Constraint#getMainDescription()
-	 * @see #getConstraint()
-	 * @generated
-	 */
-	EAttribute getConstraint_MainDescription();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ContentCategory <em>Content Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Category</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentCategory
-	 * @generated
-	 */
-	EClass getContentCategory();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ContentCategoryPackage <em>Content Category Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Category Package</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentCategoryPackage
-	 * @generated
-	 */
-	EClass getContentCategoryPackage();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentCategoryPackage#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentCategoryPackage#getGroup2()
-	 * @see #getContentCategoryPackage()
-	 * @generated
-	 */
-	EAttribute getContentCategoryPackage_Group2();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.ContentCategoryPackage#getContentCategory <em>Content Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Content Category</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentCategoryPackage#getContentCategory()
-	 * @see #getContentCategoryPackage()
-	 * @generated
-	 */
-	EReference getContentCategoryPackage_ContentCategory();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ContentDescription <em>Content Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentDescription
-	 * @generated
-	 */
-	EClass getContentDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ContentDescription#getMainDescription <em>Main Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Main Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentDescription#getMainDescription()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EAttribute getContentDescription_MainDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ContentDescription#getKeyConsiderations <em>Key Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Key Considerations</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentDescription#getKeyConsiderations()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EAttribute getContentDescription_KeyConsiderations();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.ContentDescription#getSection <em>Section</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Section</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentDescription#getSection()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EReference getContentDescription_Section();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ContentDescription#getExternalId <em>External Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>External Id</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentDescription#getExternalId()
-	 * @see #getContentDescription()
-	 * @generated
-	 */
-	EAttribute getContentDescription_ExternalId();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ContentElement <em>Content Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement
-	 * @generated
-	 */
-	EClass getContentElement();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getGroup1 <em>Group1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group1</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getGroup1()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_Group1();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getChecklist <em>Checklist</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Checklist</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getChecklist()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_Checklist();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getConcept <em>Concept</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Concept</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getConcept()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_Concept();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getExample <em>Example</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Example</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getExample()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_Example();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getGuideline <em>Guideline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Guideline</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getGuideline()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_Guideline();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getReusableAsset <em>Reusable Asset</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Reusable Asset</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getReusableAsset()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_ReusableAsset();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getSupportingMaterial <em>Supporting Material</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Supporting Material</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getSupportingMaterial()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_SupportingMaterial();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentElement#getWhitepaper <em>Whitepaper</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Whitepaper</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getWhitepaper()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_Whitepaper();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityBasedOnElement <em>Variability Based On Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Variability Based On Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getVariabilityBasedOnElement()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_VariabilityBasedOnElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ContentElement#getVariabilityType <em>Variability Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Variability Type</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentElement#getVariabilityType()
-	 * @see #getContentElement()
-	 * @generated
-	 */
-	EAttribute getContentElement_VariabilityType();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ContentPackage <em>Content Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Content Package</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentPackage
-	 * @generated
-	 */
-	EClass getContentPackage();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ContentPackage#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentPackage#getGroup2()
-	 * @see #getContentPackage()
-	 * @generated
-	 */
-	EAttribute getContentPackage_Group2();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.ContentPackage#getContentElement <em>Content Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Content Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.ContentPackage#getContentElement()
-	 * @see #getContentPackage()
-	 * @generated
-	 */
-	EReference getContentPackage_ContentElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.CustomCategory <em>Custom Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Custom Category</em>'.
-	 * @see org.eclipse.epf.xml.uma.CustomCategory
-	 * @generated
-	 */
-	EClass getCustomCategory();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.CustomCategory#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.CustomCategory#getGroup2()
-	 * @see #getCustomCategory()
-	 * @generated
-	 */
-	EAttribute getCustomCategory_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.CustomCategory#getCategorizedElement <em>Categorized Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Categorized Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.CustomCategory#getCategorizedElement()
-	 * @see #getCustomCategory()
-	 * @generated
-	 */
-	EAttribute getCustomCategory_CategorizedElement();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.CustomCategory#getSubCategory <em>Sub Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Sub Category</em>'.
-	 * @see org.eclipse.epf.xml.uma.CustomCategory#getSubCategory()
-	 * @see #getCustomCategory()
-	 * @generated
-	 */
-	EAttribute getCustomCategory_SubCategory();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Deliverable <em>Deliverable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Deliverable</em>'.
-	 * @see org.eclipse.epf.xml.uma.Deliverable
-	 * @generated
-	 */
-	EClass getDeliverable();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Deliverable#getGroup3 <em>Group3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group3</em>'.
-	 * @see org.eclipse.epf.xml.uma.Deliverable#getGroup3()
-	 * @see #getDeliverable()
-	 * @generated
-	 */
-	EAttribute getDeliverable_Group3();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Deliverable#getDeliveredWorkProduct <em>Delivered Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Delivered Work Product</em>'.
-	 * @see org.eclipse.epf.xml.uma.Deliverable#getDeliveredWorkProduct()
-	 * @see #getDeliverable()
-	 * @generated
-	 */
-	EAttribute getDeliverable_DeliveredWorkProduct();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.DeliverableDescription <em>Deliverable Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Deliverable Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliverableDescription
-	 * @generated
-	 */
-	EClass getDeliverableDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliverableDescription#getExternalDescription <em>External Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>External Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliverableDescription#getExternalDescription()
-	 * @see #getDeliverableDescription()
-	 * @generated
-	 */
-	EAttribute getDeliverableDescription_ExternalDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliverableDescription#getPackagingGuidance <em>Packaging Guidance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Packaging Guidance</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliverableDescription#getPackagingGuidance()
-	 * @see #getDeliverableDescription()
-	 * @generated
-	 */
-	EAttribute getDeliverableDescription_PackagingGuidance();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.DeliveryProcess <em>Delivery Process</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Delivery Process</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcess
-	 * @generated
-	 */
-	EClass getDeliveryProcess();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.DeliveryProcess#getGroup3 <em>Group3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group3</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcess#getGroup3()
-	 * @see #getDeliveryProcess()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcess_Group3();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.DeliveryProcess#getCommunicationsMaterial <em>Communications Material</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Communications Material</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcess#getCommunicationsMaterial()
-	 * @see #getDeliveryProcess()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcess_CommunicationsMaterial();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.DeliveryProcess#getEducationMaterial <em>Education Material</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Education Material</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcess#getEducationMaterial()
-	 * @see #getDeliveryProcess()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcess_EducationMaterial();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription <em>Delivery Process Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Delivery Process Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcessDescription
-	 * @generated
-	 */
-	EClass getDeliveryProcessDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getScale <em>Scale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Scale</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcessDescription#getScale()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_Scale();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectCharacteristics <em>Project Characteristics</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Project Characteristics</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectCharacteristics()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_ProjectCharacteristics();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getRiskLevel <em>Risk Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Risk Level</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcessDescription#getRiskLevel()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_RiskLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getEstimatingTechnique <em>Estimating Technique</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Estimating Technique</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcessDescription#getEstimatingTechnique()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_EstimatingTechnique();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectMemberExpertise <em>Project Member Expertise</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Project Member Expertise</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcessDescription#getProjectMemberExpertise()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_ProjectMemberExpertise();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription#getTypeOfContract <em>Type Of Contract</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type Of Contract</em>'.
-	 * @see org.eclipse.epf.xml.uma.DeliveryProcessDescription#getTypeOfContract()
-	 * @see #getDeliveryProcessDescription()
-	 * @generated
-	 */
-	EAttribute getDeliveryProcessDescription_TypeOfContract();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.DescribableElement <em>Describable Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Describable Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.DescribableElement
-	 * @generated
-	 */
-	EClass getDescribableElement();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.xml.uma.DescribableElement#getPresentation <em>Presentation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Presentation</em>'.
-	 * @see org.eclipse.epf.xml.uma.DescribableElement#getPresentation()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EReference getDescribableElement_Presentation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DescribableElement#getNodeicon <em>Nodeicon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Nodeicon</em>'.
-	 * @see org.eclipse.epf.xml.uma.DescribableElement#getNodeicon()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EAttribute getDescribableElement_Nodeicon();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DescribableElement#getPresentationName <em>Presentation Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Presentation Name</em>'.
-	 * @see org.eclipse.epf.xml.uma.DescribableElement#getPresentationName()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EAttribute getDescribableElement_PresentationName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DescribableElement#getShapeicon <em>Shapeicon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Shapeicon</em>'.
-	 * @see org.eclipse.epf.xml.uma.DescribableElement#getShapeicon()
-	 * @see #getDescribableElement()
-	 * @generated
-	 */
-	EAttribute getDescribableElement_Shapeicon();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Descriptor <em>Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Descriptor</em>'.
-	 * @see org.eclipse.epf.xml.uma.Descriptor
-	 * @generated
-	 */
-	EClass getDescriptor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Descriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Synchronized With Source</em>'.
-	 * @see org.eclipse.epf.xml.uma.Descriptor#isIsSynchronizedWithSource()
-	 * @see #getDescriptor()
-	 * @generated
-	 */
-	EAttribute getDescriptor_IsSynchronizedWithSource();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.DescriptorDescription <em>Descriptor Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Descriptor Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.DescriptorDescription
-	 * @generated
-	 */
-	EClass getDescriptorDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.DescriptorDescription#getRefinedDescription <em>Refined Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Refined Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.DescriptorDescription#getRefinedDescription()
-	 * @see #getDescriptorDescription()
-	 * @generated
-	 */
-	EAttribute getDescriptorDescription_RefinedDescription();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Discipline <em>Discipline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Discipline</em>'.
-	 * @see org.eclipse.epf.xml.uma.Discipline
-	 * @generated
-	 */
-	EClass getDiscipline();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Discipline#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Discipline#getGroup2()
-	 * @see #getDiscipline()
-	 * @generated
-	 */
-	EAttribute getDiscipline_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Discipline#getTask <em>Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Task</em>'.
-	 * @see org.eclipse.epf.xml.uma.Discipline#getTask()
-	 * @see #getDiscipline()
-	 * @generated
-	 */
-	EAttribute getDiscipline_Task();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.Discipline#getSubDiscipline <em>Sub Discipline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sub Discipline</em>'.
-	 * @see org.eclipse.epf.xml.uma.Discipline#getSubDiscipline()
-	 * @see #getDiscipline()
-	 * @generated
-	 */
-	EReference getDiscipline_SubDiscipline();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Discipline#getReferenceWorkflow <em>Reference Workflow</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Reference Workflow</em>'.
-	 * @see org.eclipse.epf.xml.uma.Discipline#getReferenceWorkflow()
-	 * @see #getDiscipline()
-	 * @generated
-	 */
-	EAttribute getDiscipline_ReferenceWorkflow();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.DisciplineGrouping <em>Discipline Grouping</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Discipline Grouping</em>'.
-	 * @see org.eclipse.epf.xml.uma.DisciplineGrouping
-	 * @generated
-	 */
-	EClass getDisciplineGrouping();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.DisciplineGrouping#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.DisciplineGrouping#getGroup2()
-	 * @see #getDisciplineGrouping()
-	 * @generated
-	 */
-	EAttribute getDisciplineGrouping_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.DisciplineGrouping#getDiscipline <em>Discipline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Discipline</em>'.
-	 * @see org.eclipse.epf.xml.uma.DisciplineGrouping#getDiscipline()
-	 * @see #getDisciplineGrouping()
-	 * @generated
-	 */
-	EAttribute getDisciplineGrouping_Discipline();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.DocumentRoot <em>Document Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Document Root</em>'.
-	 * @see org.eclipse.epf.xml.uma.DocumentRoot
-	 * @generated
-	 */
-	EClass getDocumentRoot();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.DocumentRoot#getMixed <em>Mixed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Mixed</em>'.
-	 * @see org.eclipse.epf.xml.uma.DocumentRoot#getMixed()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EAttribute getDocumentRoot_Mixed();
-
-	/**
-	 * Returns the meta object for the map '{@link org.eclipse.epf.xml.uma.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XMLNS Prefix Map</em>'.
-	 * @see org.eclipse.epf.xml.uma.DocumentRoot#getXMLNSPrefixMap()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XMLNSPrefixMap();
-
-	/**
-	 * Returns the meta object for the map '{@link org.eclipse.epf.xml.uma.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XSI Schema Location</em>'.
-	 * @see org.eclipse.epf.xml.uma.DocumentRoot#getXSISchemaLocation()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XSISchemaLocation();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodConfiguration <em>Method Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Method Configuration</em>'.
-	 * @see org.eclipse.epf.xml.uma.DocumentRoot#getMethodConfiguration()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MethodConfiguration();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodLibrary <em>Method Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Method Library</em>'.
-	 * @see org.eclipse.epf.xml.uma.DocumentRoot#getMethodLibrary()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MethodLibrary();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.xml.uma.DocumentRoot#getMethodPlugin <em>Method Plugin</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Method Plugin</em>'.
-	 * @see org.eclipse.epf.xml.uma.DocumentRoot#getMethodPlugin()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MethodPlugin();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Domain <em>Domain</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Domain</em>'.
-	 * @see org.eclipse.epf.xml.uma.Domain
-	 * @generated
-	 */
-	EClass getDomain();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Domain#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Domain#getGroup2()
-	 * @see #getDomain()
-	 * @generated
-	 */
-	EAttribute getDomain_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Domain#getWorkProduct <em>Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Work Product</em>'.
-	 * @see org.eclipse.epf.xml.uma.Domain#getWorkProduct()
-	 * @see #getDomain()
-	 * @generated
-	 */
-	EAttribute getDomain_WorkProduct();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.Domain#getSubdomain <em>Subdomain</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Subdomain</em>'.
-	 * @see org.eclipse.epf.xml.uma.Domain#getSubdomain()
-	 * @see #getDomain()
-	 * @generated
-	 */
-	EReference getDomain_Subdomain();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Element <em>Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.Element
-	 * @generated
-	 */
-	EClass getElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Estimate <em>Estimate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Estimate</em>'.
-	 * @see org.eclipse.epf.xml.uma.Estimate
-	 * @generated
-	 */
-	EClass getEstimate();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Estimate#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Estimate#getGroup2()
-	 * @see #getEstimate()
-	 * @generated
-	 */
-	EAttribute getEstimate_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Estimate#getEstimationMetric <em>Estimation Metric</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Estimation Metric</em>'.
-	 * @see org.eclipse.epf.xml.uma.Estimate#getEstimationMetric()
-	 * @see #getEstimate()
-	 * @generated
-	 */
-	EAttribute getEstimate_EstimationMetric();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Estimate#getEstimationConsiderations <em>Estimation Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Estimation Considerations</em>'.
-	 * @see org.eclipse.epf.xml.uma.Estimate#getEstimationConsiderations()
-	 * @see #getEstimate()
-	 * @generated
-	 */
-	EAttribute getEstimate_EstimationConsiderations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.EstimatingMetric <em>Estimating Metric</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Estimating Metric</em>'.
-	 * @see org.eclipse.epf.xml.uma.EstimatingMetric
-	 * @generated
-	 */
-	EClass getEstimatingMetric();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.EstimationConsiderations <em>Estimation Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Estimation Considerations</em>'.
-	 * @see org.eclipse.epf.xml.uma.EstimationConsiderations
-	 * @generated
-	 */
-	EClass getEstimationConsiderations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Example <em>Example</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Example</em>'.
-	 * @see org.eclipse.epf.xml.uma.Example
-	 * @generated
-	 */
-	EClass getExample();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Guidance <em>Guidance</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Guidance</em>'.
-	 * @see org.eclipse.epf.xml.uma.Guidance
-	 * @generated
-	 */
-	EClass getGuidance();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.GuidanceDescription <em>Guidance Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Guidance Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.GuidanceDescription
-	 * @generated
-	 */
-	EClass getGuidanceDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.GuidanceDescription#getAttachment <em>Attachment</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Attachment</em>'.
-	 * @see org.eclipse.epf.xml.uma.GuidanceDescription#getAttachment()
-	 * @see #getGuidanceDescription()
-	 * @generated
-	 */
-	EAttribute getGuidanceDescription_Attachment();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Guideline <em>Guideline</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Guideline</em>'.
-	 * @see org.eclipse.epf.xml.uma.Guideline
-	 * @generated
-	 */
-	EClass getGuideline();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Iteration <em>Iteration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Iteration</em>'.
-	 * @see org.eclipse.epf.xml.uma.Iteration
-	 * @generated
-	 */
-	EClass getIteration();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.MethodConfiguration <em>Method Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Configuration</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration
-	 * @generated
-	 */
-	EClass getMethodConfiguration();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getBaseConfiguration <em>Base Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Base Configuration</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration#getBaseConfiguration()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EAttribute getMethodConfiguration_BaseConfiguration();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getMethodPluginSelection <em>Method Plugin Selection</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Method Plugin Selection</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration#getMethodPluginSelection()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EAttribute getMethodConfiguration_MethodPluginSelection();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getMethodPackageSelection <em>Method Package Selection</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Method Package Selection</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration#getMethodPackageSelection()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EAttribute getMethodConfiguration_MethodPackageSelection();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getDefaultView <em>Default View</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default View</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration#getDefaultView()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EAttribute getMethodConfiguration_DefaultView();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getProcessView <em>Process View</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Process View</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration#getProcessView()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EAttribute getMethodConfiguration_ProcessView();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getSubtractedCategory <em>Subtracted Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Subtracted Category</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration#getSubtractedCategory()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EAttribute getMethodConfiguration_SubtractedCategory();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodConfiguration#getAddedCategory <em>Added Category</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Added Category</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodConfiguration#getAddedCategory()
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 */
-	EAttribute getMethodConfiguration_AddedCategory();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.MethodElement <em>Method Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement
-	 * @generated
-	 */
-	EClass getMethodElement();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodElement#getGroup <em>Group</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement#getGroup()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_Group();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.MethodElement#getOwnedRule <em>Owned Rule</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Owned Rule</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement#getOwnedRule()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EReference getMethodElement_OwnedRule();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.MethodElement#getMethodElementProperty <em>Method Element Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Element Property</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement#getMethodElementProperty()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EReference getMethodElement_MethodElementProperty();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodElement#getBriefDescription <em>Brief Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Brief Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement#getBriefDescription()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_BriefDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodElement#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement#getId()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodElement#getOrderingGuide <em>Ordering Guide</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Ordering Guide</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement#getOrderingGuide()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_OrderingGuide();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodElement#isSuppressed <em>Suppressed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Suppressed</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElement#isSuppressed()
-	 * @see #getMethodElement()
-	 * @generated
-	 */
-	EAttribute getMethodElement_Suppressed();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.MethodElementProperty <em>Method Element Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Element Property</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElementProperty
-	 * @generated
-	 */
-	EClass getMethodElementProperty();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodElementProperty#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodElementProperty#getValue()
-	 * @see #getMethodElementProperty()
-	 * @generated
-	 */
-	EAttribute getMethodElementProperty_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.MethodLibrary <em>Method Library</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Library</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodLibrary
-	 * @generated
-	 */
-	EClass getMethodLibrary();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.MethodLibrary#getMethodPlugin <em>Method Plugin</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Plugin</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodLibrary#getMethodPlugin()
-	 * @see #getMethodLibrary()
-	 * @generated
-	 */
-	EReference getMethodLibrary_MethodPlugin();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.MethodLibrary#getMethodConfiguration <em>Method Configuration</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Configuration</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodLibrary#getMethodConfiguration()
-	 * @see #getMethodLibrary()
-	 * @generated
-	 */
-	EReference getMethodLibrary_MethodConfiguration();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodLibrary#getTool <em>Tool</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Tool</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodLibrary#getTool()
-	 * @see #getMethodLibrary()
-	 * @generated
-	 */
-	EAttribute getMethodLibrary_Tool();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.MethodPackage <em>Method Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Package</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPackage
-	 * @generated
-	 */
-	EClass getMethodPackage();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodPackage#getGroup1 <em>Group1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group1</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPackage#getGroup1()
-	 * @see #getMethodPackage()
-	 * @generated
-	 */
-	EAttribute getMethodPackage_Group1();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodPackage#getReusedPackage <em>Reused Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Reused Package</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPackage#getReusedPackage()
-	 * @see #getMethodPackage()
-	 * @generated
-	 */
-	EAttribute getMethodPackage_ReusedPackage();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.MethodPackage#getMethodPackage <em>Method Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Package</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPackage#getMethodPackage()
-	 * @see #getMethodPackage()
-	 * @generated
-	 */
-	EReference getMethodPackage_MethodPackage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodPackage#isGlobal <em>Global</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Global</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPackage#isGlobal()
-	 * @see #getMethodPackage()
-	 * @generated
-	 */
-	EAttribute getMethodPackage_Global();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.MethodPlugin <em>Method Plugin</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Plugin</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPlugin
-	 * @generated
-	 */
-	EClass getMethodPlugin();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.MethodPlugin#getReferencedMethodPlugin <em>Referenced Method Plugin</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Referenced Method Plugin</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPlugin#getReferencedMethodPlugin()
-	 * @see #getMethodPlugin()
-	 * @generated
-	 */
-	EAttribute getMethodPlugin_ReferencedMethodPlugin();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.MethodPlugin#getMethodPackage <em>Method Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Method Package</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPlugin#getMethodPackage()
-	 * @see #getMethodPlugin()
-	 * @generated
-	 */
-	EReference getMethodPlugin_MethodPackage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodPlugin#isUserChangeable <em>User Changeable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>User Changeable</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodPlugin#isUserChangeable()
-	 * @see #getMethodPlugin()
-	 * @generated
-	 */
-	EAttribute getMethodPlugin_UserChangeable();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.MethodUnit <em>Method Unit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Method Unit</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodUnit
-	 * @generated
-	 */
-	EClass getMethodUnit();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodUnit#getCopyright <em>Copyright</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Copyright</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodUnit#getCopyright()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_Copyright();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodUnit#getAuthors <em>Authors</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Authors</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodUnit#getAuthors()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_Authors();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodUnit#getChangeDate <em>Change Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Change Date</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodUnit#getChangeDate()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_ChangeDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodUnit#getChangeDescription <em>Change Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Change Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodUnit#getChangeDescription()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_ChangeDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.MethodUnit#getVersion <em>Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Version</em>'.
-	 * @see org.eclipse.epf.xml.uma.MethodUnit#getVersion()
-	 * @see #getMethodUnit()
-	 * @generated
-	 */
-	EAttribute getMethodUnit_Version();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Milestone <em>Milestone</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Milestone</em>'.
-	 * @see org.eclipse.epf.xml.uma.Milestone
-	 * @generated
-	 */
-	EClass getMilestone();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.NamedElement <em>Named Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Named Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.NamedElement
-	 * @generated
-	 */
-	EClass getNamedElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.NamedElement#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.epf.xml.uma.NamedElement#getName()
-	 * @see #getNamedElement()
-	 * @generated
-	 */
-	EAttribute getNamedElement_Name();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Outcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Outcome</em>'.
-	 * @see org.eclipse.epf.xml.uma.Outcome
-	 * @generated
-	 */
-	EClass getOutcome();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.PackageableElement <em>Packageable Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Packageable Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.PackageableElement
-	 * @generated
-	 */
-	EClass getPackageableElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Phase <em>Phase</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Phase</em>'.
-	 * @see org.eclipse.epf.xml.uma.Phase
-	 * @generated
-	 */
-	EClass getPhase();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.PlanningData <em>Planning Data</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Planning Data</em>'.
-	 * @see org.eclipse.epf.xml.uma.PlanningData
-	 * @generated
-	 */
-	EClass getPlanningData();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PlanningData#getFinishDate <em>Finish Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Finish Date</em>'.
-	 * @see org.eclipse.epf.xml.uma.PlanningData#getFinishDate()
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	EAttribute getPlanningData_FinishDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PlanningData#getRank <em>Rank</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Rank</em>'.
-	 * @see org.eclipse.epf.xml.uma.PlanningData#getRank()
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	EAttribute getPlanningData_Rank();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PlanningData#getStartDate <em>Start Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Start Date</em>'.
-	 * @see org.eclipse.epf.xml.uma.PlanningData#getStartDate()
-	 * @see #getPlanningData()
-	 * @generated
-	 */
-	EAttribute getPlanningData_StartDate();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Practice <em>Practice</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Practice</em>'.
-	 * @see org.eclipse.epf.xml.uma.Practice
-	 * @generated
-	 */
-	EClass getPractice();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Practice#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Practice#getGroup2()
-	 * @see #getPractice()
-	 * @generated
-	 */
-	EAttribute getPractice_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Practice#getActivityReference <em>Activity Reference</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Activity Reference</em>'.
-	 * @see org.eclipse.epf.xml.uma.Practice#getActivityReference()
-	 * @see #getPractice()
-	 * @generated
-	 */
-	EAttribute getPractice_ActivityReference();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Practice#getContentReference <em>Content Reference</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Content Reference</em>'.
-	 * @see org.eclipse.epf.xml.uma.Practice#getContentReference()
-	 * @see #getPractice()
-	 * @generated
-	 */
-	EAttribute getPractice_ContentReference();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.Practice#getSubPractice <em>Sub Practice</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sub Practice</em>'.
-	 * @see org.eclipse.epf.xml.uma.Practice#getSubPractice()
-	 * @see #getPractice()
-	 * @generated
-	 */
-	EReference getPractice_SubPractice();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.PracticeDescription <em>Practice Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Practice Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.PracticeDescription
-	 * @generated
-	 */
-	EClass getPracticeDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PracticeDescription#getAdditionalInfo <em>Additional Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Additional Info</em>'.
-	 * @see org.eclipse.epf.xml.uma.PracticeDescription#getAdditionalInfo()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_AdditionalInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PracticeDescription#getApplication <em>Application</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Application</em>'.
-	 * @see org.eclipse.epf.xml.uma.PracticeDescription#getApplication()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Application();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PracticeDescription#getBackground <em>Background</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Background</em>'.
-	 * @see org.eclipse.epf.xml.uma.PracticeDescription#getBackground()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Background();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PracticeDescription#getGoals <em>Goals</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Goals</em>'.
-	 * @see org.eclipse.epf.xml.uma.PracticeDescription#getGoals()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Goals();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PracticeDescription#getLevelsOfAdoption <em>Levels Of Adoption</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Levels Of Adoption</em>'.
-	 * @see org.eclipse.epf.xml.uma.PracticeDescription#getLevelsOfAdoption()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_LevelsOfAdoption();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.PracticeDescription#getProblem <em>Problem</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Problem</em>'.
-	 * @see org.eclipse.epf.xml.uma.PracticeDescription#getProblem()
-	 * @see #getPracticeDescription()
-	 * @generated
-	 */
-	EAttribute getPracticeDescription_Problem();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Process <em>Process</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process</em>'.
-	 * @see org.eclipse.epf.xml.uma.Process
-	 * @generated
-	 */
-	EClass getProcess();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Process#getIncludesPattern <em>Includes Pattern</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Includes Pattern</em>'.
-	 * @see org.eclipse.epf.xml.uma.Process#getIncludesPattern()
-	 * @see #getProcess()
-	 * @generated
-	 */
-	EAttribute getProcess_IncludesPattern();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Process#getDefaultContext <em>Default Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Default Context</em>'.
-	 * @see org.eclipse.epf.xml.uma.Process#getDefaultContext()
-	 * @see #getProcess()
-	 * @generated
-	 */
-	EAttribute getProcess_DefaultContext();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Process#getValidContext <em>Valid Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Valid Context</em>'.
-	 * @see org.eclipse.epf.xml.uma.Process#getValidContext()
-	 * @see #getProcess()
-	 * @generated
-	 */
-	EAttribute getProcess_ValidContext();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Process#getDiagramURI <em>Diagram URI</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Diagram URI</em>'.
-	 * @see org.eclipse.epf.xml.uma.Process#getDiagramURI()
-	 * @see #getProcess()
-	 * @generated
-	 */
-	EAttribute getProcess_DiagramURI();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ProcessComponent <em>Process Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Component</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent
-	 * @generated
-	 */
-	EClass getProcessComponent();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ProcessComponent#getCopyright <em>Copyright</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Copyright</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent#getCopyright()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EAttribute getProcessComponent_Copyright();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.xml.uma.ProcessComponent#getInterface <em>Interface</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Interface</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent#getInterface()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EReference getProcessComponent_Interface();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.xml.uma.ProcessComponent#getProcess <em>Process</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Process</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent#getProcess()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EReference getProcessComponent_Process();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ProcessComponent#getAuthors <em>Authors</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Authors</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent#getAuthors()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EAttribute getProcessComponent_Authors();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ProcessComponent#getChangeDate <em>Change Date</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Change Date</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent#getChangeDate()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EAttribute getProcessComponent_ChangeDate();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ProcessComponent#getChangeDescription <em>Change Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Change Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent#getChangeDescription()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EAttribute getProcessComponent_ChangeDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ProcessComponent#getVersion <em>Version</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Version</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponent#getVersion()
-	 * @see #getProcessComponent()
-	 * @generated
-	 */
-	EAttribute getProcessComponent_Version();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ProcessComponentInterface <em>Process Component Interface</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Component Interface</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponentInterface
-	 * @generated
-	 */
-	EClass getProcessComponentInterface();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ProcessComponentInterface#getGroup1 <em>Group1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group1</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponentInterface#getGroup1()
-	 * @see #getProcessComponentInterface()
-	 * @generated
-	 */
-	EAttribute getProcessComponentInterface_Group1();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.ProcessComponentInterface#getInterfaceSpecification <em>Interface Specification</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Interface Specification</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponentInterface#getInterfaceSpecification()
-	 * @see #getProcessComponentInterface()
-	 * @generated
-	 */
-	EReference getProcessComponentInterface_InterfaceSpecification();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.ProcessComponentInterface#getInterfaceIO <em>Interface IO</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Interface IO</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessComponentInterface#getInterfaceIO()
-	 * @see #getProcessComponentInterface()
-	 * @generated
-	 */
-	EReference getProcessComponentInterface_InterfaceIO();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ProcessDescription <em>Process Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessDescription
-	 * @generated
-	 */
-	EClass getProcessDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ProcessDescription#getScope <em>Scope</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Scope</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessDescription#getScope()
-	 * @see #getProcessDescription()
-	 * @generated
-	 */
-	EAttribute getProcessDescription_Scope();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.ProcessDescription#getUsageNotes <em>Usage Notes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Usage Notes</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessDescription#getUsageNotes()
-	 * @see #getProcessDescription()
-	 * @generated
-	 */
-	EAttribute getProcessDescription_UsageNotes();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ProcessElement <em>Process Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessElement
-	 * @generated
-	 */
-	EClass getProcessElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ProcessPackage <em>Process Package</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Package</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessPackage
-	 * @generated
-	 */
-	EClass getProcessPackage();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ProcessPackage#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessPackage#getGroup2()
-	 * @see #getProcessPackage()
-	 * @generated
-	 */
-	EAttribute getProcessPackage_Group2();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.ProcessPackage#getProcessElement <em>Process Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Process Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessPackage#getProcessElement()
-	 * @see #getProcessPackage()
-	 * @generated
-	 */
-	EReference getProcessPackage_ProcessElement();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ProcessPlanningTemplate <em>Process Planning Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Process Planning Template</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessPlanningTemplate
-	 * @generated
-	 */
-	EClass getProcessPlanningTemplate();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ProcessPlanningTemplate#getGroup3 <em>Group3</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group3</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessPlanningTemplate#getGroup3()
-	 * @see #getProcessPlanningTemplate()
-	 * @generated
-	 */
-	EAttribute getProcessPlanningTemplate_Group3();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.ProcessPlanningTemplate#getBaseProcess <em>Base Process</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Base Process</em>'.
-	 * @see org.eclipse.epf.xml.uma.ProcessPlanningTemplate#getBaseProcess()
-	 * @see #getProcessPlanningTemplate()
-	 * @generated
-	 */
-	EAttribute getProcessPlanningTemplate_BaseProcess();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Report <em>Report</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Report</em>'.
-	 * @see org.eclipse.epf.xml.uma.Report
-	 * @generated
-	 */
-	EClass getReport();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ReusableAsset <em>Reusable Asset</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Reusable Asset</em>'.
-	 * @see org.eclipse.epf.xml.uma.ReusableAsset
-	 * @generated
-	 */
-	EClass getReusableAsset();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Roadmap <em>Roadmap</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Roadmap</em>'.
-	 * @see org.eclipse.epf.xml.uma.Roadmap
-	 * @generated
-	 */
-	EClass getRoadmap();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Role <em>Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role</em>'.
-	 * @see org.eclipse.epf.xml.uma.Role
-	 * @generated
-	 */
-	EClass getRole();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Role#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Role#getGroup2()
-	 * @see #getRole()
-	 * @generated
-	 */
-	EAttribute getRole_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Role#getResponsibleFor <em>Responsible For</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Responsible For</em>'.
-	 * @see org.eclipse.epf.xml.uma.Role#getResponsibleFor()
-	 * @see #getRole()
-	 * @generated
-	 */
-	EAttribute getRole_ResponsibleFor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.RoleDescription <em>Role Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleDescription
-	 * @generated
-	 */
-	EClass getRoleDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.RoleDescription#getAssignmentApproaches <em>Assignment Approaches</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Assignment Approaches</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleDescription#getAssignmentApproaches()
-	 * @see #getRoleDescription()
-	 * @generated
-	 */
-	EAttribute getRoleDescription_AssignmentApproaches();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.RoleDescription#getSkills <em>Skills</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Skills</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleDescription#getSkills()
-	 * @see #getRoleDescription()
-	 * @generated
-	 */
-	EAttribute getRoleDescription_Skills();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.RoleDescription#getSynonyms <em>Synonyms</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Synonyms</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleDescription#getSynonyms()
-	 * @see #getRoleDescription()
-	 * @generated
-	 */
-	EAttribute getRoleDescription_Synonyms();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.RoleDescriptor <em>Role Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Descriptor</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleDescriptor
-	 * @generated
-	 */
-	EClass getRoleDescriptor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.RoleDescriptor#getRole <em>Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Role</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleDescriptor#getRole()
-	 * @see #getRoleDescriptor()
-	 * @generated
-	 */
-	EAttribute getRoleDescriptor_Role();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.RoleDescriptor#getResponsibleFor <em>Responsible For</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Responsible For</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleDescriptor#getResponsibleFor()
-	 * @see #getRoleDescriptor()
-	 * @generated
-	 */
-	EAttribute getRoleDescriptor_ResponsibleFor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.RoleSet <em>Role Set</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Set</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleSet
-	 * @generated
-	 */
-	EClass getRoleSet();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.RoleSet#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleSet#getGroup2()
-	 * @see #getRoleSet()
-	 * @generated
-	 */
-	EAttribute getRoleSet_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.RoleSet#getRole <em>Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Role</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleSet#getRole()
-	 * @see #getRoleSet()
-	 * @generated
-	 */
-	EAttribute getRoleSet_Role();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.RoleSetGrouping <em>Role Set Grouping</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Role Set Grouping</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleSetGrouping
-	 * @generated
-	 */
-	EClass getRoleSetGrouping();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.RoleSetGrouping#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleSetGrouping#getGroup2()
-	 * @see #getRoleSetGrouping()
-	 * @generated
-	 */
-	EAttribute getRoleSetGrouping_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.RoleSetGrouping#getRoleSet <em>Role Set</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Role Set</em>'.
-	 * @see org.eclipse.epf.xml.uma.RoleSetGrouping#getRoleSet()
-	 * @see #getRoleSetGrouping()
-	 * @generated
-	 */
-	EAttribute getRoleSetGrouping_RoleSet();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Section <em>Section</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Section</em>'.
-	 * @see org.eclipse.epf.xml.uma.Section
-	 * @generated
-	 */
-	EClass getSection();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.epf.xml.uma.Section#getSubSection <em>Sub Section</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Sub Section</em>'.
-	 * @see org.eclipse.epf.xml.uma.Section#getSubSection()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EReference getSection_SubSection();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Section#getPredecessor <em>Predecessor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Predecessor</em>'.
-	 * @see org.eclipse.epf.xml.uma.Section#getPredecessor()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EAttribute getSection_Predecessor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Section#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.Section#getDescription()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EAttribute getSection_Description();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Section#getSectionName <em>Section Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Section Name</em>'.
-	 * @see org.eclipse.epf.xml.uma.Section#getSectionName()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EAttribute getSection_SectionName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Section#getVariabilityBasedOnElement <em>Variability Based On Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Variability Based On Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.Section#getVariabilityBasedOnElement()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EAttribute getSection_VariabilityBasedOnElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Section#getVariabilityType <em>Variability Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Variability Type</em>'.
-	 * @see org.eclipse.epf.xml.uma.Section#getVariabilityType()
-	 * @see #getSection()
-	 * @generated
-	 */
-	EAttribute getSection_VariabilityType();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.SupportingMaterial <em>Supporting Material</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Supporting Material</em>'.
-	 * @see org.eclipse.epf.xml.uma.SupportingMaterial
-	 * @generated
-	 */
-	EClass getSupportingMaterial();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Task <em>Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task
-	 * @generated
-	 */
-	EClass getTask();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Task#getPrecondition <em>Precondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Precondition</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getPrecondition()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Precondition();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Task#getPostcondition <em>Postcondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Postcondition</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getPostcondition()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Postcondition();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.Task#getPerformedBy <em>Performed By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Performed By</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getPerformedBy()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_PerformedBy();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getGroup2()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getMandatoryInput <em>Mandatory Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Mandatory Input</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getMandatoryInput()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_MandatoryInput();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getOutput <em>Output</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Output</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getOutput()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Output();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getAdditionallyPerformedBy <em>Additionally Performed By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Additionally Performed By</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getAdditionallyPerformedBy()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_AdditionallyPerformedBy();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getOptionalInput <em>Optional Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Optional Input</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getOptionalInput()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_OptionalInput();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getEstimate <em>Estimate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Estimate</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getEstimate()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_Estimate();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getEstimationConsiderations <em>Estimation Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Estimation Considerations</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getEstimationConsiderations()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_EstimationConsiderations();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Task#getToolMentor <em>Tool Mentor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Tool Mentor</em>'.
-	 * @see org.eclipse.epf.xml.uma.Task#getToolMentor()
-	 * @see #getTask()
-	 * @generated
-	 */
-	EAttribute getTask_ToolMentor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.TaskDescription <em>Task Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescription
-	 * @generated
-	 */
-	EClass getTaskDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.TaskDescription#getAlternatives <em>Alternatives</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Alternatives</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescription#getAlternatives()
-	 * @see #getTaskDescription()
-	 * @generated
-	 */
-	EAttribute getTaskDescription_Alternatives();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.TaskDescription#getPurpose <em>Purpose</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Purpose</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescription#getPurpose()
-	 * @see #getTaskDescription()
-	 * @generated
-	 */
-	EAttribute getTaskDescription_Purpose();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.TaskDescriptor <em>Task Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Task Descriptor</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor
-	 * @generated
-	 */
-	EClass getTaskDescriptor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getTask <em>Task</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Task</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getTask()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_Task();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getPerformedPrimarilyBy <em>Performed Primarily By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Performed Primarily By</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getPerformedPrimarilyBy()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_PerformedPrimarilyBy();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getGroup2()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getAdditionallyPerformedBy <em>Additionally Performed By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Additionally Performed By</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getAdditionallyPerformedBy()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_AdditionallyPerformedBy();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getAssistedBy <em>Assisted By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Assisted By</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getAssistedBy()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_AssistedBy();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getExternalInput <em>External Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>External Input</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getExternalInput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_ExternalInput();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getMandatoryInput <em>Mandatory Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Mandatory Input</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getMandatoryInput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_MandatoryInput();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getOptionalInput <em>Optional Input</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Optional Input</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getOptionalInput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_OptionalInput();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getOutput <em>Output</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Output</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getOutput()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_Output();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.TaskDescriptor#getStep <em>Step</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Step</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#getStep()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EReference getTaskDescriptor_Step();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.TaskDescriptor#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Synchronized With Source</em>'.
-	 * @see org.eclipse.epf.xml.uma.TaskDescriptor#isIsSynchronizedWithSource()
-	 * @see #getTaskDescriptor()
-	 * @generated
-	 */
-	EAttribute getTaskDescriptor_IsSynchronizedWithSource();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.TeamProfile <em>Team Profile</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Team Profile</em>'.
-	 * @see org.eclipse.epf.xml.uma.TeamProfile
-	 * @generated
-	 */
-	EClass getTeamProfile();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TeamProfile#getGroup1 <em>Group1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group1</em>'.
-	 * @see org.eclipse.epf.xml.uma.TeamProfile#getGroup1()
-	 * @see #getTeamProfile()
-	 * @generated
-	 */
-	EAttribute getTeamProfile_Group1();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TeamProfile#getRole <em>Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Role</em>'.
-	 * @see org.eclipse.epf.xml.uma.TeamProfile#getRole()
-	 * @see #getTeamProfile()
-	 * @generated
-	 */
-	EAttribute getTeamProfile_Role();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TeamProfile#getSuperTeam <em>Super Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Super Team</em>'.
-	 * @see org.eclipse.epf.xml.uma.TeamProfile#getSuperTeam()
-	 * @see #getTeamProfile()
-	 * @generated
-	 */
-	EAttribute getTeamProfile_SuperTeam();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.TeamProfile#getSubTeam <em>Sub Team</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Sub Team</em>'.
-	 * @see org.eclipse.epf.xml.uma.TeamProfile#getSubTeam()
-	 * @see #getTeamProfile()
-	 * @generated
-	 */
-	EAttribute getTeamProfile_SubTeam();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Template <em>Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Template</em>'.
-	 * @see org.eclipse.epf.xml.uma.Template
-	 * @generated
-	 */
-	EClass getTemplate();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.TermDefinition <em>Term Definition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Term Definition</em>'.
-	 * @see org.eclipse.epf.xml.uma.TermDefinition
-	 * @generated
-	 */
-	EClass getTermDefinition();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Tool <em>Tool</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tool</em>'.
-	 * @see org.eclipse.epf.xml.uma.Tool
-	 * @generated
-	 */
-	EClass getTool();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Tool#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.Tool#getGroup2()
-	 * @see #getTool()
-	 * @generated
-	 */
-	EAttribute getTool_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.Tool#getToolMentor <em>Tool Mentor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Tool Mentor</em>'.
-	 * @see org.eclipse.epf.xml.uma.Tool#getToolMentor()
-	 * @see #getTool()
-	 * @generated
-	 */
-	EAttribute getTool_ToolMentor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.ToolMentor <em>Tool Mentor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tool Mentor</em>'.
-	 * @see org.eclipse.epf.xml.uma.ToolMentor
-	 * @generated
-	 */
-	EClass getToolMentor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.Whitepaper <em>Whitepaper</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Whitepaper</em>'.
-	 * @see org.eclipse.epf.xml.uma.Whitepaper
-	 * @generated
-	 */
-	EClass getWhitepaper();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement <em>Work Breakdown Element</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Breakdown Element</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkBreakdownElement
-	 * @generated
-	 */
-	EClass getWorkBreakdownElement();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#getGroup1 <em>Group1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group1</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkBreakdownElement#getGroup1()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getWorkBreakdownElement_Group1();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#getPredecessor <em>Predecessor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Predecessor</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkBreakdownElement#getPredecessor()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EReference getWorkBreakdownElement_Predecessor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsEventDriven <em>Is Event Driven</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Event Driven</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsEventDriven()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getWorkBreakdownElement_IsEventDriven();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsOngoing <em>Is Ongoing</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Ongoing</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsOngoing()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getWorkBreakdownElement_IsOngoing();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsRepeatable <em>Is Repeatable</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Is Repeatable</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsRepeatable()
-	 * @see #getWorkBreakdownElement()
-	 * @generated
-	 */
-	EAttribute getWorkBreakdownElement_IsRepeatable();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.WorkDefinition <em>Work Definition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Definition</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkDefinition
-	 * @generated
-	 */
-	EClass getWorkDefinition();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkDefinition#getPrecondition <em>Precondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Precondition</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkDefinition#getPrecondition()
-	 * @see #getWorkDefinition()
-	 * @generated
-	 */
-	EAttribute getWorkDefinition_Precondition();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkDefinition#getPostcondition <em>Postcondition</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Postcondition</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkDefinition#getPostcondition()
-	 * @see #getWorkDefinition()
-	 * @generated
-	 */
-	EAttribute getWorkDefinition_Postcondition();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.WorkOrder <em>Work Order</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Order</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkOrder
-	 * @generated
-	 */
-	EClass getWorkOrder();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkOrder#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkOrder#getValue()
-	 * @see #getWorkOrder()
-	 * @generated
-	 */
-	EAttribute getWorkOrder_Value();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkOrder#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkOrder#getId()
-	 * @see #getWorkOrder()
-	 * @generated
-	 */
-	EAttribute getWorkOrder_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkOrder#getLinkType <em>Link Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Link Type</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkOrder#getLinkType()
-	 * @see #getWorkOrder()
-	 * @generated
-	 */
-	EAttribute getWorkOrder_LinkType();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.WorkProduct <em>Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProduct
-	 * @generated
-	 */
-	EClass getWorkProduct();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProduct#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProduct#getGroup2()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EAttribute getWorkProduct_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProduct#getEstimate <em>Estimate</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Estimate</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProduct#getEstimate()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EAttribute getWorkProduct_Estimate();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProduct#getEstimationConsiderations <em>Estimation Considerations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Estimation Considerations</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProduct#getEstimationConsiderations()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EAttribute getWorkProduct_EstimationConsiderations();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProduct#getReport <em>Report</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Report</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProduct#getReport()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EAttribute getWorkProduct_Report();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProduct#getTemplate <em>Template</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Template</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProduct#getTemplate()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EAttribute getWorkProduct_Template();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProduct#getToolMentor <em>Tool Mentor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Tool Mentor</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProduct#getToolMentor()
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	EAttribute getWorkProduct_ToolMentor();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.WorkProductDescription <em>Work Product Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Description</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescription
-	 * @generated
-	 */
-	EClass getWorkProductDescription();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkProductDescription#getImpactOfNotHaving <em>Impact Of Not Having</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Impact Of Not Having</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescription#getImpactOfNotHaving()
-	 * @see #getWorkProductDescription()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescription_ImpactOfNotHaving();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkProductDescription#getPurpose <em>Purpose</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Purpose</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescription#getPurpose()
-	 * @see #getWorkProductDescription()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescription_Purpose();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkProductDescription#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Reasons For Not Needing</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescription#getReasonsForNotNeeding()
-	 * @see #getWorkProductDescription()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescription_ReasonsForNotNeeding();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor <em>Work Product Descriptor</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Descriptor</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor
-	 * @generated
-	 */
-	EClass getWorkProductDescriptor();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getWorkProduct <em>Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Work Product</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getWorkProduct()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_WorkProduct();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getResponsibleRole <em>Responsible Role</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Responsible Role</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getResponsibleRole()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_ResponsibleRole();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getGroup1 <em>Group1</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group1</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getGroup1()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_Group1();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getExternalInputTo <em>External Input To</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>External Input To</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getExternalInputTo()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_ExternalInputTo();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getImpactedBy <em>Impacted By</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Impacted By</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getImpactedBy()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_ImpactedBy();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getImpacts <em>Impacts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Impacts</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getImpacts()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_Impacts();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getMandatoryInputTo <em>Mandatory Input To</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Mandatory Input To</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getMandatoryInputTo()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_MandatoryInputTo();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getOptionalInputTo <em>Optional Input To</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Optional Input To</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getOptionalInputTo()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_OptionalInputTo();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getOutputFrom <em>Output From</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Output From</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getOutputFrom()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_OutputFrom();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getDeliverableParts <em>Deliverable Parts</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Deliverable Parts</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getDeliverableParts()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_DeliverableParts();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityEntryState <em>Activity Entry State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Activity Entry State</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityEntryState()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_ActivityEntryState();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityExitState <em>Activity Exit State</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Activity Exit State</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityExitState()
-	 * @see #getWorkProductDescriptor()
-	 * @generated
-	 */
-	EAttribute getWorkProductDescriptor_ActivityExitState();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.epf.xml.uma.WorkProductType <em>Work Product Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Work Product Type</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductType
-	 * @generated
-	 */
-	EClass getWorkProductType();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductType#getGroup2 <em>Group2</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Group2</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductType#getGroup2()
-	 * @see #getWorkProductType()
-	 * @generated
-	 */
-	EAttribute getWorkProductType_Group2();
-
-	/**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.epf.xml.uma.WorkProductType#getWorkProduct <em>Work Product</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Work Product</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkProductType#getWorkProduct()
-	 * @see #getWorkProductType()
-	 * @generated
-	 */
-	EAttribute getWorkProductType_WorkProduct();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.epf.xml.uma.VariabilityType <em>Variability Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Variability Type</em>'.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @generated
-	 */
-	EEnum getVariabilityType();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.epf.xml.uma.WorkOrderType <em>Work Order Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Work Order Type</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkOrderType
-	 * @generated
-	 */
-	EEnum getWorkOrderType();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.epf.xml.uma.VariabilityType <em>Variability Type Object</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Variability Type Object</em>'.
-	 * @see org.eclipse.epf.xml.uma.VariabilityType
-	 * @model instanceClass="org.eclipse.epf.xml.uma.VariabilityType"
-	 *        extendedMetaData="name='VariabilityType:Object' baseType='VariabilityType'" 
-	 * @generated
-	 */
-	EDataType getVariabilityTypeObject();
-
-	/**
-	 * Returns the meta object for data type '{@link org.eclipse.epf.xml.uma.WorkOrderType <em>Work Order Type Object</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for data type '<em>Work Order Type Object</em>'.
-	 * @see org.eclipse.epf.xml.uma.WorkOrderType
-	 * @model instanceClass="org.eclipse.epf.xml.uma.WorkOrderType"
-	 *        extendedMetaData="name='WorkOrderType:Object' baseType='WorkOrderType'" 
-	 * @generated
-	 */
-	EDataType getWorkOrderTypeObject();
-
-	/**
-	 * 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
-	 */
-	UmaFactory getUmaFactory();
-
-	/**
-	 * <!-- 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.epf.xml.uma.impl.ActivityImpl <em>Activity</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ActivityImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getActivity()
-		 * @generated
-		 */
-		EClass ACTIVITY = eINSTANCE.getActivity();
-
-		/**
-		 * The meta object literal for the '<em><b>Precondition</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__PRECONDITION = eINSTANCE.getActivity_Precondition();
-
-		/**
-		 * The meta object literal for the '<em><b>Postcondition</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__POSTCONDITION = eINSTANCE.getActivity_Postcondition();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__GROUP2 = eINSTANCE.getActivity_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Breakdown Element</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ACTIVITY__BREAKDOWN_ELEMENT = eINSTANCE.getActivity_BreakdownElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Checklist</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__CHECKLIST = eINSTANCE.getActivity_Checklist();
-
-		/**
-		 * The meta object literal for the '<em><b>Concept</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__CONCEPT = eINSTANCE.getActivity_Concept();
-
-		/**
-		 * The meta object literal for the '<em><b>Example</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__EXAMPLE = eINSTANCE.getActivity_Example();
-
-		/**
-		 * The meta object literal for the '<em><b>Guideline</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__GUIDELINE = eINSTANCE.getActivity_Guideline();
-
-		/**
-		 * The meta object literal for the '<em><b>Roadmap</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__ROADMAP = eINSTANCE.getActivity_Roadmap();
-
-		/**
-		 * The meta object literal for the '<em><b>Reusable Asset</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__REUSABLE_ASSET = eINSTANCE.getActivity_ReusableAsset();
-
-		/**
-		 * The meta object literal for the '<em><b>Supporting Material</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__SUPPORTING_MATERIAL = eINSTANCE.getActivity_SupportingMaterial();
-
-		/**
-		 * The meta object literal for the '<em><b>Whitepaper</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__WHITEPAPER = eINSTANCE.getActivity_Whitepaper();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Enactable</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__IS_ENACTABLE = eINSTANCE.getActivity_IsEnactable();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Based On Element</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__VARIABILITY_BASED_ON_ELEMENT = eINSTANCE.getActivity_VariabilityBasedOnElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY__VARIABILITY_TYPE = eINSTANCE.getActivity_VariabilityType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ActivityDescriptionImpl <em>Activity Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ActivityDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getActivityDescription()
-		 * @generated
-		 */
-		EClass ACTIVITY_DESCRIPTION = eINSTANCE.getActivityDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Alternatives</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY_DESCRIPTION__ALTERNATIVES = eINSTANCE.getActivityDescription_Alternatives();
-
-		/**
-		 * The meta object literal for the '<em><b>How To Staff</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY_DESCRIPTION__HOW_TO_STAFF = eINSTANCE.getActivityDescription_HowToStaff();
-
-		/**
-		 * The meta object literal for the '<em><b>Purpose</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ACTIVITY_DESCRIPTION__PURPOSE = eINSTANCE.getActivityDescription_Purpose();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ArtifactImpl <em>Artifact</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ArtifactImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getArtifact()
-		 * @generated
-		 */
-		EClass ARTIFACT = eINSTANCE.getArtifact();
-
-		/**
-		 * The meta object literal for the '<em><b>Group3</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT__GROUP3 = eINSTANCE.getArtifact_Group3();
-
-		/**
-		 * The meta object literal for the '<em><b>Contained Artifact</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ARTIFACT__CONTAINED_ARTIFACT = eINSTANCE.getArtifact_ContainedArtifact();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl <em>Artifact Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getArtifactDescription()
-		 * @generated
-		 */
-		EClass ARTIFACT_DESCRIPTION = eINSTANCE.getArtifactDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Brief Outline</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__BRIEF_OUTLINE = eINSTANCE.getArtifactDescription_BriefOutline();
-
-		/**
-		 * The meta object literal for the '<em><b>Representation Options</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS = eINSTANCE.getArtifactDescription_RepresentationOptions();
-
-		/**
-		 * The meta object literal for the '<em><b>Representation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__REPRESENTATION = eINSTANCE.getArtifactDescription_Representation();
-
-		/**
-		 * The meta object literal for the '<em><b>Notation</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ARTIFACT_DESCRIPTION__NOTATION = eINSTANCE.getArtifactDescription_Notation();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl <em>Breakdown Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.BreakdownElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getBreakdownElement()
-		 * @generated
-		 */
-		EClass BREAKDOWN_ELEMENT = eINSTANCE.getBreakdownElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Presented After</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__PRESENTED_AFTER = eINSTANCE.getBreakdownElement_PresentedAfter();
-
-		/**
-		 * The meta object literal for the '<em><b>Presented Before</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__PRESENTED_BEFORE = eINSTANCE.getBreakdownElement_PresentedBefore();
-
-		/**
-		 * The meta object literal for the '<em><b>Planning Data</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__PLANNING_DATA = eINSTANCE.getBreakdownElement_PlanningData();
-
-		/**
-		 * The meta object literal for the '<em><b>Super Activity</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__SUPER_ACTIVITY = eINSTANCE.getBreakdownElement_SuperActivity();
-
-		/**
-		 * The meta object literal for the '<em><b>Has Multiple Occurrences</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES = eINSTANCE.getBreakdownElement_HasMultipleOccurrences();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Optional</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__IS_OPTIONAL = eINSTANCE.getBreakdownElement_IsOptional();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Planned</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__IS_PLANNED = eINSTANCE.getBreakdownElement_IsPlanned();
-
-		/**
-		 * The meta object literal for the '<em><b>Prefix</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT__PREFIX = eINSTANCE.getBreakdownElement_Prefix();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.BreakdownElementDescriptionImpl <em>Breakdown Element Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.BreakdownElementDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getBreakdownElementDescription()
-		 * @generated
-		 */
-		EClass BREAKDOWN_ELEMENT_DESCRIPTION = eINSTANCE.getBreakdownElementDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Usage Guidance</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE = eINSTANCE.getBreakdownElementDescription_UsageGuidance();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.CapabilityPatternImpl <em>Capability Pattern</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.CapabilityPatternImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getCapabilityPattern()
-		 * @generated
-		 */
-		EClass CAPABILITY_PATTERN = eINSTANCE.getCapabilityPattern();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ChecklistImpl <em>Checklist</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ChecklistImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getChecklist()
-		 * @generated
-		 */
-		EClass CHECKLIST = eINSTANCE.getChecklist();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.CompositeRoleImpl <em>Composite Role</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.CompositeRoleImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getCompositeRole()
-		 * @generated
-		 */
-		EClass COMPOSITE_ROLE = eINSTANCE.getCompositeRole();
-
-		/**
-		 * The meta object literal for the '<em><b>Group1</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute COMPOSITE_ROLE__GROUP1 = eINSTANCE.getCompositeRole_Group1();
-
-		/**
-		 * The meta object literal for the '<em><b>Aggregated Role</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference COMPOSITE_ROLE__AGGREGATED_ROLE = eINSTANCE.getCompositeRole_AggregatedRole();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ConceptImpl <em>Concept</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ConceptImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getConcept()
-		 * @generated
-		 */
-		EClass CONCEPT = eINSTANCE.getConcept();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ConstraintImpl <em>Constraint</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ConstraintImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getConstraint()
-		 * @generated
-		 */
-		EClass CONSTRAINT = eINSTANCE.getConstraint();
-
-		/**
-		 * The meta object literal for the '<em><b>Main Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONSTRAINT__MAIN_DESCRIPTION = eINSTANCE.getConstraint_MainDescription();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ContentCategoryImpl <em>Content Category</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ContentCategoryImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentCategory()
-		 * @generated
-		 */
-		EClass CONTENT_CATEGORY = eINSTANCE.getContentCategory();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ContentCategoryPackageImpl <em>Content Category Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ContentCategoryPackageImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentCategoryPackage()
-		 * @generated
-		 */
-		EClass CONTENT_CATEGORY_PACKAGE = eINSTANCE.getContentCategoryPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_CATEGORY_PACKAGE__GROUP2 = eINSTANCE.getContentCategoryPackage_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Content Category</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY = eINSTANCE.getContentCategoryPackage_ContentCategory();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl <em>Content Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentDescription()
-		 * @generated
-		 */
-		EClass CONTENT_DESCRIPTION = eINSTANCE.getContentDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Main Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_DESCRIPTION__MAIN_DESCRIPTION = eINSTANCE.getContentDescription_MainDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Key Considerations</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_DESCRIPTION__KEY_CONSIDERATIONS = eINSTANCE.getContentDescription_KeyConsiderations();
-
-		/**
-		 * The meta object literal for the '<em><b>Section</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_DESCRIPTION__SECTION = eINSTANCE.getContentDescription_Section();
-
-		/**
-		 * The meta object literal for the '<em><b>External Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_DESCRIPTION__EXTERNAL_ID = eINSTANCE.getContentDescription_ExternalId();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl <em>Content Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ContentElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentElement()
-		 * @generated
-		 */
-		EClass CONTENT_ELEMENT = eINSTANCE.getContentElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Group1</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__GROUP1 = eINSTANCE.getContentElement_Group1();
-
-		/**
-		 * The meta object literal for the '<em><b>Checklist</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__CHECKLIST = eINSTANCE.getContentElement_Checklist();
-
-		/**
-		 * The meta object literal for the '<em><b>Concept</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__CONCEPT = eINSTANCE.getContentElement_Concept();
-
-		/**
-		 * The meta object literal for the '<em><b>Example</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__EXAMPLE = eINSTANCE.getContentElement_Example();
-
-		/**
-		 * The meta object literal for the '<em><b>Guideline</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__GUIDELINE = eINSTANCE.getContentElement_Guideline();
-
-		/**
-		 * The meta object literal for the '<em><b>Reusable Asset</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__REUSABLE_ASSET = eINSTANCE.getContentElement_ReusableAsset();
-
-		/**
-		 * The meta object literal for the '<em><b>Supporting Material</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__SUPPORTING_MATERIAL = eINSTANCE.getContentElement_SupportingMaterial();
-
-		/**
-		 * The meta object literal for the '<em><b>Whitepaper</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__WHITEPAPER = eINSTANCE.getContentElement_Whitepaper();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Based On Element</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT = eINSTANCE.getContentElement_VariabilityBasedOnElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_ELEMENT__VARIABILITY_TYPE = eINSTANCE.getContentElement_VariabilityType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ContentPackageImpl <em>Content Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ContentPackageImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getContentPackage()
-		 * @generated
-		 */
-		EClass CONTENT_PACKAGE = eINSTANCE.getContentPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CONTENT_PACKAGE__GROUP2 = eINSTANCE.getContentPackage_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Content Element</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CONTENT_PACKAGE__CONTENT_ELEMENT = eINSTANCE.getContentPackage_ContentElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.CustomCategoryImpl <em>Custom Category</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.CustomCategoryImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getCustomCategory()
-		 * @generated
-		 */
-		EClass CUSTOM_CATEGORY = eINSTANCE.getCustomCategory();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CUSTOM_CATEGORY__GROUP2 = eINSTANCE.getCustomCategory_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Categorized Element</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CUSTOM_CATEGORY__CATEGORIZED_ELEMENT = eINSTANCE.getCustomCategory_CategorizedElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Category</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CUSTOM_CATEGORY__SUB_CATEGORY = eINSTANCE.getCustomCategory_SubCategory();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DeliverableImpl <em>Deliverable</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DeliverableImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliverable()
-		 * @generated
-		 */
-		EClass DELIVERABLE = eINSTANCE.getDeliverable();
-
-		/**
-		 * The meta object literal for the '<em><b>Group3</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERABLE__GROUP3 = eINSTANCE.getDeliverable_Group3();
-
-		/**
-		 * The meta object literal for the '<em><b>Delivered Work Product</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERABLE__DELIVERED_WORK_PRODUCT = eINSTANCE.getDeliverable_DeliveredWorkProduct();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DeliverableDescriptionImpl <em>Deliverable Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DeliverableDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliverableDescription()
-		 * @generated
-		 */
-		EClass DELIVERABLE_DESCRIPTION = eINSTANCE.getDeliverableDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>External Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION = eINSTANCE.getDeliverableDescription_ExternalDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Packaging Guidance</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE = eINSTANCE.getDeliverableDescription_PackagingGuidance();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessImpl <em>Delivery Process</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DeliveryProcessImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliveryProcess()
-		 * @generated
-		 */
-		EClass DELIVERY_PROCESS = eINSTANCE.getDeliveryProcess();
-
-		/**
-		 * The meta object literal for the '<em><b>Group3</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS__GROUP3 = eINSTANCE.getDeliveryProcess_Group3();
-
-		/**
-		 * The meta object literal for the '<em><b>Communications Material</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL = eINSTANCE.getDeliveryProcess_CommunicationsMaterial();
-
-		/**
-		 * The meta object literal for the '<em><b>Education Material</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS__EDUCATION_MATERIAL = eINSTANCE.getDeliveryProcess_EducationMaterial();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl <em>Delivery Process Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDeliveryProcessDescription()
-		 * @generated
-		 */
-		EClass DELIVERY_PROCESS_DESCRIPTION = eINSTANCE.getDeliveryProcessDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Scale</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__SCALE = eINSTANCE.getDeliveryProcessDescription_Scale();
-
-		/**
-		 * The meta object literal for the '<em><b>Project Characteristics</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS = eINSTANCE.getDeliveryProcessDescription_ProjectCharacteristics();
-
-		/**
-		 * The meta object literal for the '<em><b>Risk Level</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL = eINSTANCE.getDeliveryProcessDescription_RiskLevel();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimating Technique</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE = eINSTANCE.getDeliveryProcessDescription_EstimatingTechnique();
-
-		/**
-		 * The meta object literal for the '<em><b>Project Member Expertise</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE = eINSTANCE.getDeliveryProcessDescription_ProjectMemberExpertise();
-
-		/**
-		 * The meta object literal for the '<em><b>Type Of Contract</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT = eINSTANCE.getDeliveryProcessDescription_TypeOfContract();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DescribableElementImpl <em>Describable Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DescribableElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDescribableElement()
-		 * @generated
-		 */
-		EClass DESCRIBABLE_ELEMENT = eINSTANCE.getDescribableElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Presentation</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DESCRIBABLE_ELEMENT__PRESENTATION = eINSTANCE.getDescribableElement_Presentation();
-
-		/**
-		 * The meta object literal for the '<em><b>Nodeicon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIBABLE_ELEMENT__NODEICON = eINSTANCE.getDescribableElement_Nodeicon();
-
-		/**
-		 * The meta object literal for the '<em><b>Presentation Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIBABLE_ELEMENT__PRESENTATION_NAME = eINSTANCE.getDescribableElement_PresentationName();
-
-		/**
-		 * The meta object literal for the '<em><b>Shapeicon</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIBABLE_ELEMENT__SHAPEICON = eINSTANCE.getDescribableElement_Shapeicon();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DescriptorImpl <em>Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DescriptorImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDescriptor()
-		 * @generated
-		 */
-		EClass DESCRIPTOR = eINSTANCE.getDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Synchronized With Source</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = eINSTANCE.getDescriptor_IsSynchronizedWithSource();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DescriptorDescriptionImpl <em>Descriptor Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DescriptorDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDescriptorDescription()
-		 * @generated
-		 */
-		EClass DESCRIPTOR_DESCRIPTION = eINSTANCE.getDescriptorDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Refined Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION = eINSTANCE.getDescriptorDescription_RefinedDescription();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DisciplineImpl <em>Discipline</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DisciplineImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDiscipline()
-		 * @generated
-		 */
-		EClass DISCIPLINE = eINSTANCE.getDiscipline();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DISCIPLINE__GROUP2 = eINSTANCE.getDiscipline_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Task</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DISCIPLINE__TASK = eINSTANCE.getDiscipline_Task();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Discipline</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DISCIPLINE__SUB_DISCIPLINE = eINSTANCE.getDiscipline_SubDiscipline();
-
-		/**
-		 * The meta object literal for the '<em><b>Reference Workflow</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DISCIPLINE__REFERENCE_WORKFLOW = eINSTANCE.getDiscipline_ReferenceWorkflow();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DisciplineGroupingImpl <em>Discipline Grouping</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DisciplineGroupingImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDisciplineGrouping()
-		 * @generated
-		 */
-		EClass DISCIPLINE_GROUPING = eINSTANCE.getDisciplineGrouping();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DISCIPLINE_GROUPING__GROUP2 = eINSTANCE.getDisciplineGrouping_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Discipline</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DISCIPLINE_GROUPING__DISCIPLINE = eINSTANCE.getDisciplineGrouping_Discipline();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl <em>Document Root</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DocumentRootImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDocumentRoot()
-		 * @generated
-		 */
-		EClass DOCUMENT_ROOT = eINSTANCE.getDocumentRoot();
-
-		/**
-		 * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DOCUMENT_ROOT__MIXED = eINSTANCE.getDocumentRoot_Mixed();
-
-		/**
-		 * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-		/**
-		 * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Configuration</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__METHOD_CONFIGURATION = eINSTANCE.getDocumentRoot_MethodConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Library</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__METHOD_LIBRARY = eINSTANCE.getDocumentRoot_MethodLibrary();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Plugin</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__METHOD_PLUGIN = eINSTANCE.getDocumentRoot_MethodPlugin();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.DomainImpl <em>Domain</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.DomainImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getDomain()
-		 * @generated
-		 */
-		EClass DOMAIN = eINSTANCE.getDomain();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DOMAIN__GROUP2 = eINSTANCE.getDomain_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Product</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DOMAIN__WORK_PRODUCT = eINSTANCE.getDomain_WorkProduct();
-
-		/**
-		 * The meta object literal for the '<em><b>Subdomain</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOMAIN__SUBDOMAIN = eINSTANCE.getDomain_Subdomain();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ElementImpl <em>Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getElement()
-		 * @generated
-		 */
-		EClass ELEMENT = eINSTANCE.getElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.EstimateImpl <em>Estimate</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.EstimateImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getEstimate()
-		 * @generated
-		 */
-		EClass ESTIMATE = eINSTANCE.getEstimate();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ESTIMATE__GROUP2 = eINSTANCE.getEstimate_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimation Metric</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ESTIMATE__ESTIMATION_METRIC = eINSTANCE.getEstimate_EstimationMetric();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimation Considerations</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ESTIMATE__ESTIMATION_CONSIDERATIONS = eINSTANCE.getEstimate_EstimationConsiderations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.EstimatingMetricImpl <em>Estimating Metric</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.EstimatingMetricImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getEstimatingMetric()
-		 * @generated
-		 */
-		EClass ESTIMATING_METRIC = eINSTANCE.getEstimatingMetric();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.EstimationConsiderationsImpl <em>Estimation Considerations</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.EstimationConsiderationsImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getEstimationConsiderations()
-		 * @generated
-		 */
-		EClass ESTIMATION_CONSIDERATIONS = eINSTANCE.getEstimationConsiderations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ExampleImpl <em>Example</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ExampleImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getExample()
-		 * @generated
-		 */
-		EClass EXAMPLE = eINSTANCE.getExample();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.GuidanceImpl <em>Guidance</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.GuidanceImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getGuidance()
-		 * @generated
-		 */
-		EClass GUIDANCE = eINSTANCE.getGuidance();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.GuidanceDescriptionImpl <em>Guidance Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.GuidanceDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getGuidanceDescription()
-		 * @generated
-		 */
-		EClass GUIDANCE_DESCRIPTION = eINSTANCE.getGuidanceDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Attachment</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute GUIDANCE_DESCRIPTION__ATTACHMENT = eINSTANCE.getGuidanceDescription_Attachment();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.GuidelineImpl <em>Guideline</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.GuidelineImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getGuideline()
-		 * @generated
-		 */
-		EClass GUIDELINE = eINSTANCE.getGuideline();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.IterationImpl <em>Iteration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.IterationImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getIteration()
-		 * @generated
-		 */
-		EClass ITERATION = eINSTANCE.getIteration();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl <em>Method Configuration</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodConfiguration()
-		 * @generated
-		 */
-		EClass METHOD_CONFIGURATION = eINSTANCE.getMethodConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Base Configuration</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_CONFIGURATION__BASE_CONFIGURATION = eINSTANCE.getMethodConfiguration_BaseConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Plugin Selection</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION = eINSTANCE.getMethodConfiguration_MethodPluginSelection();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Package Selection</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION = eINSTANCE.getMethodConfiguration_MethodPackageSelection();
-
-		/**
-		 * The meta object literal for the '<em><b>Default View</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_CONFIGURATION__DEFAULT_VIEW = eINSTANCE.getMethodConfiguration_DefaultView();
-
-		/**
-		 * The meta object literal for the '<em><b>Process View</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_CONFIGURATION__PROCESS_VIEW = eINSTANCE.getMethodConfiguration_ProcessView();
-
-		/**
-		 * The meta object literal for the '<em><b>Subtracted Category</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_CONFIGURATION__SUBTRACTED_CATEGORY = eINSTANCE.getMethodConfiguration_SubtractedCategory();
-
-		/**
-		 * The meta object literal for the '<em><b>Added Category</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_CONFIGURATION__ADDED_CATEGORY = eINSTANCE.getMethodConfiguration_AddedCategory();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl <em>Method Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MethodElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodElement()
-		 * @generated
-		 */
-		EClass METHOD_ELEMENT = eINSTANCE.getMethodElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Group</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__GROUP = eINSTANCE.getMethodElement_Group();
-
-		/**
-		 * The meta object literal for the '<em><b>Owned Rule</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_ELEMENT__OWNED_RULE = eINSTANCE.getMethodElement_OwnedRule();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Element Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY = eINSTANCE.getMethodElement_MethodElementProperty();
-
-		/**
-		 * The meta object literal for the '<em><b>Brief Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__BRIEF_DESCRIPTION = eINSTANCE.getMethodElement_BriefDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__ID = eINSTANCE.getMethodElement_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Ordering Guide</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__ORDERING_GUIDE = eINSTANCE.getMethodElement_OrderingGuide();
-
-		/**
-		 * The meta object literal for the '<em><b>Suppressed</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT__SUPPRESSED = eINSTANCE.getMethodElement_Suppressed();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MethodElementPropertyImpl <em>Method Element Property</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MethodElementPropertyImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodElementProperty()
-		 * @generated
-		 */
-		EClass METHOD_ELEMENT_PROPERTY = eINSTANCE.getMethodElementProperty();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_ELEMENT_PROPERTY__VALUE = eINSTANCE.getMethodElementProperty_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MethodLibraryImpl <em>Method Library</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MethodLibraryImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodLibrary()
-		 * @generated
-		 */
-		EClass METHOD_LIBRARY = eINSTANCE.getMethodLibrary();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Plugin</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_LIBRARY__METHOD_PLUGIN = eINSTANCE.getMethodLibrary_MethodPlugin();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Configuration</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_LIBRARY__METHOD_CONFIGURATION = eINSTANCE.getMethodLibrary_MethodConfiguration();
-
-		/**
-		 * The meta object literal for the '<em><b>Tool</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_LIBRARY__TOOL = eINSTANCE.getMethodLibrary_Tool();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MethodPackageImpl <em>Method Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MethodPackageImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodPackage()
-		 * @generated
-		 */
-		EClass METHOD_PACKAGE = eINSTANCE.getMethodPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Group1</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_PACKAGE__GROUP1 = eINSTANCE.getMethodPackage_Group1();
-
-		/**
-		 * The meta object literal for the '<em><b>Reused Package</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_PACKAGE__REUSED_PACKAGE = eINSTANCE.getMethodPackage_ReusedPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Package</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_PACKAGE__METHOD_PACKAGE = eINSTANCE.getMethodPackage_MethodPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Global</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_PACKAGE__GLOBAL = eINSTANCE.getMethodPackage_Global();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MethodPluginImpl <em>Method Plugin</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MethodPluginImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodPlugin()
-		 * @generated
-		 */
-		EClass METHOD_PLUGIN = eINSTANCE.getMethodPlugin();
-
-		/**
-		 * The meta object literal for the '<em><b>Referenced Method Plugin</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN = eINSTANCE.getMethodPlugin_ReferencedMethodPlugin();
-
-		/**
-		 * The meta object literal for the '<em><b>Method Package</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference METHOD_PLUGIN__METHOD_PACKAGE = eINSTANCE.getMethodPlugin_MethodPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>User Changeable</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_PLUGIN__USER_CHANGEABLE = eINSTANCE.getMethodPlugin_UserChangeable();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MethodUnitImpl <em>Method Unit</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MethodUnitImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMethodUnit()
-		 * @generated
-		 */
-		EClass METHOD_UNIT = eINSTANCE.getMethodUnit();
-
-		/**
-		 * The meta object literal for the '<em><b>Copyright</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__COPYRIGHT = eINSTANCE.getMethodUnit_Copyright();
-
-		/**
-		 * The meta object literal for the '<em><b>Authors</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__AUTHORS = eINSTANCE.getMethodUnit_Authors();
-
-		/**
-		 * The meta object literal for the '<em><b>Change Date</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__CHANGE_DATE = eINSTANCE.getMethodUnit_ChangeDate();
-
-		/**
-		 * The meta object literal for the '<em><b>Change Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__CHANGE_DESCRIPTION = eINSTANCE.getMethodUnit_ChangeDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Version</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute METHOD_UNIT__VERSION = eINSTANCE.getMethodUnit_Version();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.MilestoneImpl <em>Milestone</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.MilestoneImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getMilestone()
-		 * @generated
-		 */
-		EClass MILESTONE = eINSTANCE.getMilestone();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.NamedElementImpl <em>Named Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.NamedElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getNamedElement()
-		 * @generated
-		 */
-		EClass NAMED_ELEMENT = eINSTANCE.getNamedElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NAMED_ELEMENT__NAME = eINSTANCE.getNamedElement_Name();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.OutcomeImpl <em>Outcome</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.OutcomeImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getOutcome()
-		 * @generated
-		 */
-		EClass OUTCOME = eINSTANCE.getOutcome();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.PackageableElementImpl <em>Packageable Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.PackageableElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPackageableElement()
-		 * @generated
-		 */
-		EClass PACKAGEABLE_ELEMENT = eINSTANCE.getPackageableElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.PhaseImpl <em>Phase</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.PhaseImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPhase()
-		 * @generated
-		 */
-		EClass PHASE = eINSTANCE.getPhase();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.PlanningDataImpl <em>Planning Data</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.PlanningDataImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPlanningData()
-		 * @generated
-		 */
-		EClass PLANNING_DATA = eINSTANCE.getPlanningData();
-
-		/**
-		 * The meta object literal for the '<em><b>Finish Date</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLANNING_DATA__FINISH_DATE = eINSTANCE.getPlanningData_FinishDate();
-
-		/**
-		 * The meta object literal for the '<em><b>Rank</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLANNING_DATA__RANK = eINSTANCE.getPlanningData_Rank();
-
-		/**
-		 * The meta object literal for the '<em><b>Start Date</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PLANNING_DATA__START_DATE = eINSTANCE.getPlanningData_StartDate();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.PracticeImpl <em>Practice</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.PracticeImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPractice()
-		 * @generated
-		 */
-		EClass PRACTICE = eINSTANCE.getPractice();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE__GROUP2 = eINSTANCE.getPractice_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Activity Reference</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE__ACTIVITY_REFERENCE = eINSTANCE.getPractice_ActivityReference();
-
-		/**
-		 * The meta object literal for the '<em><b>Content Reference</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE__CONTENT_REFERENCE = eINSTANCE.getPractice_ContentReference();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Practice</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PRACTICE__SUB_PRACTICE = eINSTANCE.getPractice_SubPractice();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl <em>Practice Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getPracticeDescription()
-		 * @generated
-		 */
-		EClass PRACTICE_DESCRIPTION = eINSTANCE.getPracticeDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Additional Info</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__ADDITIONAL_INFO = eINSTANCE.getPracticeDescription_AdditionalInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Application</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__APPLICATION = eINSTANCE.getPracticeDescription_Application();
-
-		/**
-		 * The meta object literal for the '<em><b>Background</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__BACKGROUND = eINSTANCE.getPracticeDescription_Background();
-
-		/**
-		 * The meta object literal for the '<em><b>Goals</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__GOALS = eINSTANCE.getPracticeDescription_Goals();
-
-		/**
-		 * The meta object literal for the '<em><b>Levels Of Adoption</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION = eINSTANCE.getPracticeDescription_LevelsOfAdoption();
-
-		/**
-		 * The meta object literal for the '<em><b>Problem</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PRACTICE_DESCRIPTION__PROBLEM = eINSTANCE.getPracticeDescription_Problem();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ProcessImpl <em>Process</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ProcessImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcess()
-		 * @generated
-		 */
-		EClass PROCESS = eINSTANCE.getProcess();
-
-		/**
-		 * The meta object literal for the '<em><b>Includes Pattern</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS__INCLUDES_PATTERN = eINSTANCE.getProcess_IncludesPattern();
-
-		/**
-		 * The meta object literal for the '<em><b>Default Context</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS__DEFAULT_CONTEXT = eINSTANCE.getProcess_DefaultContext();
-
-		/**
-		 * The meta object literal for the '<em><b>Valid Context</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS__VALID_CONTEXT = eINSTANCE.getProcess_ValidContext();
-
-		/**
-		 * The meta object literal for the '<em><b>Diagram URI</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS__DIAGRAM_URI = eINSTANCE.getProcess_DiagramURI();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl <em>Process Component</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ProcessComponentImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessComponent()
-		 * @generated
-		 */
-		EClass PROCESS_COMPONENT = eINSTANCE.getProcessComponent();
-
-		/**
-		 * The meta object literal for the '<em><b>Copyright</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_COMPONENT__COPYRIGHT = eINSTANCE.getProcessComponent_Copyright();
-
-		/**
-		 * The meta object literal for the '<em><b>Interface</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT__INTERFACE = eINSTANCE.getProcessComponent_Interface();
-
-		/**
-		 * The meta object literal for the '<em><b>Process</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT__PROCESS = eINSTANCE.getProcessComponent_Process();
-
-		/**
-		 * The meta object literal for the '<em><b>Authors</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_COMPONENT__AUTHORS = eINSTANCE.getProcessComponent_Authors();
-
-		/**
-		 * The meta object literal for the '<em><b>Change Date</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_COMPONENT__CHANGE_DATE = eINSTANCE.getProcessComponent_ChangeDate();
-
-		/**
-		 * The meta object literal for the '<em><b>Change Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_COMPONENT__CHANGE_DESCRIPTION = eINSTANCE.getProcessComponent_ChangeDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Version</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_COMPONENT__VERSION = eINSTANCE.getProcessComponent_Version();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ProcessComponentInterfaceImpl <em>Process Component Interface</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ProcessComponentInterfaceImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessComponentInterface()
-		 * @generated
-		 */
-		EClass PROCESS_COMPONENT_INTERFACE = eINSTANCE.getProcessComponentInterface();
-
-		/**
-		 * The meta object literal for the '<em><b>Group1</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_COMPONENT_INTERFACE__GROUP1 = eINSTANCE.getProcessComponentInterface_Group1();
-
-		/**
-		 * The meta object literal for the '<em><b>Interface Specification</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION = eINSTANCE.getProcessComponentInterface_InterfaceSpecification();
-
-		/**
-		 * The meta object literal for the '<em><b>Interface IO</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_COMPONENT_INTERFACE__INTERFACE_IO = eINSTANCE.getProcessComponentInterface_InterfaceIO();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ProcessDescriptionImpl <em>Process Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ProcessDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessDescription()
-		 * @generated
-		 */
-		EClass PROCESS_DESCRIPTION = eINSTANCE.getProcessDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Scope</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_DESCRIPTION__SCOPE = eINSTANCE.getProcessDescription_Scope();
-
-		/**
-		 * The meta object literal for the '<em><b>Usage Notes</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_DESCRIPTION__USAGE_NOTES = eINSTANCE.getProcessDescription_UsageNotes();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ProcessElementImpl <em>Process Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ProcessElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessElement()
-		 * @generated
-		 */
-		EClass PROCESS_ELEMENT = eINSTANCE.getProcessElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ProcessPackageImpl <em>Process Package</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ProcessPackageImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessPackage()
-		 * @generated
-		 */
-		EClass PROCESS_PACKAGE = eINSTANCE.getProcessPackage();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_PACKAGE__GROUP2 = eINSTANCE.getProcessPackage_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Process Element</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PROCESS_PACKAGE__PROCESS_ELEMENT = eINSTANCE.getProcessPackage_ProcessElement();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ProcessPlanningTemplateImpl <em>Process Planning Template</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ProcessPlanningTemplateImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getProcessPlanningTemplate()
-		 * @generated
-		 */
-		EClass PROCESS_PLANNING_TEMPLATE = eINSTANCE.getProcessPlanningTemplate();
-
-		/**
-		 * The meta object literal for the '<em><b>Group3</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_PLANNING_TEMPLATE__GROUP3 = eINSTANCE.getProcessPlanningTemplate_Group3();
-
-		/**
-		 * The meta object literal for the '<em><b>Base Process</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PROCESS_PLANNING_TEMPLATE__BASE_PROCESS = eINSTANCE.getProcessPlanningTemplate_BaseProcess();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ReportImpl <em>Report</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ReportImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getReport()
-		 * @generated
-		 */
-		EClass REPORT = eINSTANCE.getReport();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ReusableAssetImpl <em>Reusable Asset</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ReusableAssetImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getReusableAsset()
-		 * @generated
-		 */
-		EClass REUSABLE_ASSET = eINSTANCE.getReusableAsset();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.RoadmapImpl <em>Roadmap</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.RoadmapImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoadmap()
-		 * @generated
-		 */
-		EClass ROADMAP = eINSTANCE.getRoadmap();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.RoleImpl <em>Role</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.RoleImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRole()
-		 * @generated
-		 */
-		EClass ROLE = eINSTANCE.getRole();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE__GROUP2 = eINSTANCE.getRole_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Responsible For</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE__RESPONSIBLE_FOR = eINSTANCE.getRole_ResponsibleFor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.RoleDescriptionImpl <em>Role Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.RoleDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleDescription()
-		 * @generated
-		 */
-		EClass ROLE_DESCRIPTION = eINSTANCE.getRoleDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Assignment Approaches</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES = eINSTANCE.getRoleDescription_AssignmentApproaches();
-
-		/**
-		 * The meta object literal for the '<em><b>Skills</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTION__SKILLS = eINSTANCE.getRoleDescription_Skills();
-
-		/**
-		 * The meta object literal for the '<em><b>Synonyms</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTION__SYNONYMS = eINSTANCE.getRoleDescription_Synonyms();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.RoleDescriptorImpl <em>Role Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.RoleDescriptorImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleDescriptor()
-		 * @generated
-		 */
-		EClass ROLE_DESCRIPTOR = eINSTANCE.getRoleDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Role</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTOR__ROLE = eINSTANCE.getRoleDescriptor_Role();
-
-		/**
-		 * The meta object literal for the '<em><b>Responsible For</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_DESCRIPTOR__RESPONSIBLE_FOR = eINSTANCE.getRoleDescriptor_ResponsibleFor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.RoleSetImpl <em>Role Set</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.RoleSetImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleSet()
-		 * @generated
-		 */
-		EClass ROLE_SET = eINSTANCE.getRoleSet();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_SET__GROUP2 = eINSTANCE.getRoleSet_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Role</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_SET__ROLE = eINSTANCE.getRoleSet_Role();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.RoleSetGroupingImpl <em>Role Set Grouping</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.RoleSetGroupingImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getRoleSetGrouping()
-		 * @generated
-		 */
-		EClass ROLE_SET_GROUPING = eINSTANCE.getRoleSetGrouping();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_SET_GROUPING__GROUP2 = eINSTANCE.getRoleSetGrouping_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Role Set</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ROLE_SET_GROUPING__ROLE_SET = eINSTANCE.getRoleSetGrouping_RoleSet();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.SectionImpl <em>Section</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.SectionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getSection()
-		 * @generated
-		 */
-		EClass SECTION = eINSTANCE.getSection();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Section</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SECTION__SUB_SECTION = eINSTANCE.getSection_SubSection();
-
-		/**
-		 * The meta object literal for the '<em><b>Predecessor</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION__PREDECESSOR = eINSTANCE.getSection_Predecessor();
-
-		/**
-		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION__DESCRIPTION = eINSTANCE.getSection_Description();
-
-		/**
-		 * The meta object literal for the '<em><b>Section Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION__SECTION_NAME = eINSTANCE.getSection_SectionName();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Based On Element</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION__VARIABILITY_BASED_ON_ELEMENT = eINSTANCE.getSection_VariabilityBasedOnElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Variability Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION__VARIABILITY_TYPE = eINSTANCE.getSection_VariabilityType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.SupportingMaterialImpl <em>Supporting Material</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.SupportingMaterialImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getSupportingMaterial()
-		 * @generated
-		 */
-		EClass SUPPORTING_MATERIAL = eINSTANCE.getSupportingMaterial();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.TaskImpl <em>Task</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.TaskImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTask()
-		 * @generated
-		 */
-		EClass TASK = eINSTANCE.getTask();
-
-		/**
-		 * The meta object literal for the '<em><b>Precondition</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__PRECONDITION = eINSTANCE.getTask_Precondition();
-
-		/**
-		 * The meta object literal for the '<em><b>Postcondition</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__POSTCONDITION = eINSTANCE.getTask_Postcondition();
-
-		/**
-		 * The meta object literal for the '<em><b>Performed By</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__PERFORMED_BY = eINSTANCE.getTask_PerformedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__GROUP2 = eINSTANCE.getTask_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Mandatory Input</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__MANDATORY_INPUT = eINSTANCE.getTask_MandatoryInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Output</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__OUTPUT = eINSTANCE.getTask_Output();
-
-		/**
-		 * The meta object literal for the '<em><b>Additionally Performed By</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__ADDITIONALLY_PERFORMED_BY = eINSTANCE.getTask_AdditionallyPerformedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Optional Input</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__OPTIONAL_INPUT = eINSTANCE.getTask_OptionalInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimate</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__ESTIMATE = eINSTANCE.getTask_Estimate();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimation Considerations</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__ESTIMATION_CONSIDERATIONS = eINSTANCE.getTask_EstimationConsiderations();
-
-		/**
-		 * The meta object literal for the '<em><b>Tool Mentor</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK__TOOL_MENTOR = eINSTANCE.getTask_ToolMentor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.TaskDescriptionImpl <em>Task Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.TaskDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTaskDescription()
-		 * @generated
-		 */
-		EClass TASK_DESCRIPTION = eINSTANCE.getTaskDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Alternatives</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTION__ALTERNATIVES = eINSTANCE.getTaskDescription_Alternatives();
-
-		/**
-		 * The meta object literal for the '<em><b>Purpose</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTION__PURPOSE = eINSTANCE.getTaskDescription_Purpose();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl <em>Task Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTaskDescriptor()
-		 * @generated
-		 */
-		EClass TASK_DESCRIPTOR = eINSTANCE.getTaskDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Task</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__TASK = eINSTANCE.getTaskDescriptor_Task();
-
-		/**
-		 * The meta object literal for the '<em><b>Performed Primarily By</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY = eINSTANCE.getTaskDescriptor_PerformedPrimarilyBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__GROUP2 = eINSTANCE.getTaskDescriptor_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Additionally Performed By</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY = eINSTANCE.getTaskDescriptor_AdditionallyPerformedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Assisted By</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__ASSISTED_BY = eINSTANCE.getTaskDescriptor_AssistedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>External Input</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__EXTERNAL_INPUT = eINSTANCE.getTaskDescriptor_ExternalInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Mandatory Input</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__MANDATORY_INPUT = eINSTANCE.getTaskDescriptor_MandatoryInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Optional Input</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__OPTIONAL_INPUT = eINSTANCE.getTaskDescriptor_OptionalInput();
-
-		/**
-		 * The meta object literal for the '<em><b>Output</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__OUTPUT = eINSTANCE.getTaskDescriptor_Output();
-
-		/**
-		 * The meta object literal for the '<em><b>Step</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TASK_DESCRIPTOR__STEP = eINSTANCE.getTaskDescriptor_Step();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Synchronized With Source</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE = eINSTANCE.getTaskDescriptor_IsSynchronizedWithSource();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.TeamProfileImpl <em>Team Profile</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.TeamProfileImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTeamProfile()
-		 * @generated
-		 */
-		EClass TEAM_PROFILE = eINSTANCE.getTeamProfile();
-
-		/**
-		 * The meta object literal for the '<em><b>Group1</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TEAM_PROFILE__GROUP1 = eINSTANCE.getTeamProfile_Group1();
-
-		/**
-		 * The meta object literal for the '<em><b>Role</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TEAM_PROFILE__ROLE = eINSTANCE.getTeamProfile_Role();
-
-		/**
-		 * The meta object literal for the '<em><b>Super Team</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TEAM_PROFILE__SUPER_TEAM = eINSTANCE.getTeamProfile_SuperTeam();
-
-		/**
-		 * The meta object literal for the '<em><b>Sub Team</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TEAM_PROFILE__SUB_TEAM = eINSTANCE.getTeamProfile_SubTeam();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.TemplateImpl <em>Template</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.TemplateImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTemplate()
-		 * @generated
-		 */
-		EClass TEMPLATE = eINSTANCE.getTemplate();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.TermDefinitionImpl <em>Term Definition</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.TermDefinitionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTermDefinition()
-		 * @generated
-		 */
-		EClass TERM_DEFINITION = eINSTANCE.getTermDefinition();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ToolImpl <em>Tool</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ToolImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getTool()
-		 * @generated
-		 */
-		EClass TOOL = eINSTANCE.getTool();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TOOL__GROUP2 = eINSTANCE.getTool_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Tool Mentor</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TOOL__TOOL_MENTOR = eINSTANCE.getTool_ToolMentor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.ToolMentorImpl <em>Tool Mentor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.ToolMentorImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getToolMentor()
-		 * @generated
-		 */
-		EClass TOOL_MENTOR = eINSTANCE.getToolMentor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WhitepaperImpl <em>Whitepaper</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WhitepaperImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWhitepaper()
-		 * @generated
-		 */
-		EClass WHITEPAPER = eINSTANCE.getWhitepaper();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl <em>Work Breakdown Element</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkBreakdownElement()
-		 * @generated
-		 */
-		EClass WORK_BREAKDOWN_ELEMENT = eINSTANCE.getWorkBreakdownElement();
-
-		/**
-		 * The meta object literal for the '<em><b>Group1</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_BREAKDOWN_ELEMENT__GROUP1 = eINSTANCE.getWorkBreakdownElement_Group1();
-
-		/**
-		 * The meta object literal for the '<em><b>Predecessor</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference WORK_BREAKDOWN_ELEMENT__PREDECESSOR = eINSTANCE.getWorkBreakdownElement_Predecessor();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Event Driven</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN = eINSTANCE.getWorkBreakdownElement_IsEventDriven();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Ongoing</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_BREAKDOWN_ELEMENT__IS_ONGOING = eINSTANCE.getWorkBreakdownElement_IsOngoing();
-
-		/**
-		 * The meta object literal for the '<em><b>Is Repeatable</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE = eINSTANCE.getWorkBreakdownElement_IsRepeatable();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WorkDefinitionImpl <em>Work Definition</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WorkDefinitionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkDefinition()
-		 * @generated
-		 */
-		EClass WORK_DEFINITION = eINSTANCE.getWorkDefinition();
-
-		/**
-		 * The meta object literal for the '<em><b>Precondition</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_DEFINITION__PRECONDITION = eINSTANCE.getWorkDefinition_Precondition();
-
-		/**
-		 * The meta object literal for the '<em><b>Postcondition</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_DEFINITION__POSTCONDITION = eINSTANCE.getWorkDefinition_Postcondition();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WorkOrderImpl <em>Work Order</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WorkOrderImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkOrder()
-		 * @generated
-		 */
-		EClass WORK_ORDER = eINSTANCE.getWorkOrder();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_ORDER__VALUE = eINSTANCE.getWorkOrder_Value();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_ORDER__ID = eINSTANCE.getWorkOrder_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Link Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_ORDER__LINK_TYPE = eINSTANCE.getWorkOrder_LinkType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl <em>Work Product</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WorkProductImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProduct()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT = eINSTANCE.getWorkProduct();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT__GROUP2 = eINSTANCE.getWorkProduct_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimate</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT__ESTIMATE = eINSTANCE.getWorkProduct_Estimate();
-
-		/**
-		 * The meta object literal for the '<em><b>Estimation Considerations</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT__ESTIMATION_CONSIDERATIONS = eINSTANCE.getWorkProduct_EstimationConsiderations();
-
-		/**
-		 * The meta object literal for the '<em><b>Report</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT__REPORT = eINSTANCE.getWorkProduct_Report();
-
-		/**
-		 * The meta object literal for the '<em><b>Template</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT__TEMPLATE = eINSTANCE.getWorkProduct_Template();
-
-		/**
-		 * The meta object literal for the '<em><b>Tool Mentor</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT__TOOL_MENTOR = eINSTANCE.getWorkProduct_ToolMentor();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptionImpl <em>Work Product Description</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WorkProductDescriptionImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProductDescription()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_DESCRIPTION = eINSTANCE.getWorkProductDescription();
-
-		/**
-		 * The meta object literal for the '<em><b>Impact Of Not Having</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING = eINSTANCE.getWorkProductDescription_ImpactOfNotHaving();
-
-		/**
-		 * The meta object literal for the '<em><b>Purpose</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTION__PURPOSE = eINSTANCE.getWorkProductDescription_Purpose();
-
-		/**
-		 * The meta object literal for the '<em><b>Reasons For Not Needing</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING = eINSTANCE.getWorkProductDescription_ReasonsForNotNeeding();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl <em>Work Product Descriptor</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProductDescriptor()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_DESCRIPTOR = eINSTANCE.getWorkProductDescriptor();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Product</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT = eINSTANCE.getWorkProductDescriptor_WorkProduct();
-
-		/**
-		 * The meta object literal for the '<em><b>Responsible Role</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE = eINSTANCE.getWorkProductDescriptor_ResponsibleRole();
-
-		/**
-		 * The meta object literal for the '<em><b>Group1</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__GROUP1 = eINSTANCE.getWorkProductDescriptor_Group1();
-
-		/**
-		 * The meta object literal for the '<em><b>External Input To</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO = eINSTANCE.getWorkProductDescriptor_ExternalInputTo();
-
-		/**
-		 * The meta object literal for the '<em><b>Impacted By</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY = eINSTANCE.getWorkProductDescriptor_ImpactedBy();
-
-		/**
-		 * The meta object literal for the '<em><b>Impacts</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__IMPACTS = eINSTANCE.getWorkProductDescriptor_Impacts();
-
-		/**
-		 * The meta object literal for the '<em><b>Mandatory Input To</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO = eINSTANCE.getWorkProductDescriptor_MandatoryInputTo();
-
-		/**
-		 * The meta object literal for the '<em><b>Optional Input To</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO = eINSTANCE.getWorkProductDescriptor_OptionalInputTo();
-
-		/**
-		 * The meta object literal for the '<em><b>Output From</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM = eINSTANCE.getWorkProductDescriptor_OutputFrom();
-
-		/**
-		 * The meta object literal for the '<em><b>Deliverable Parts</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS = eINSTANCE.getWorkProductDescriptor_DeliverableParts();
-
-		/**
-		 * The meta object literal for the '<em><b>Activity Entry State</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE = eINSTANCE.getWorkProductDescriptor_ActivityEntryState();
-
-		/**
-		 * The meta object literal for the '<em><b>Activity Exit State</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE = eINSTANCE.getWorkProductDescriptor_ActivityExitState();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.impl.WorkProductTypeImpl <em>Work Product Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.impl.WorkProductTypeImpl
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkProductType()
-		 * @generated
-		 */
-		EClass WORK_PRODUCT_TYPE = eINSTANCE.getWorkProductType();
-
-		/**
-		 * The meta object literal for the '<em><b>Group2</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_TYPE__GROUP2 = eINSTANCE.getWorkProductType_Group2();
-
-		/**
-		 * The meta object literal for the '<em><b>Work Product</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute WORK_PRODUCT_TYPE__WORK_PRODUCT = eINSTANCE.getWorkProductType_WorkProduct();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.VariabilityType <em>Variability Type</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.VariabilityType
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getVariabilityType()
-		 * @generated
-		 */
-		EEnum VARIABILITY_TYPE = eINSTANCE.getVariabilityType();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.epf.xml.uma.WorkOrderType <em>Work Order Type</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.WorkOrderType
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkOrderType()
-		 * @generated
-		 */
-		EEnum WORK_ORDER_TYPE = eINSTANCE.getWorkOrderType();
-
-		/**
-		 * The meta object literal for the '<em>Variability Type Object</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.VariabilityType
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getVariabilityTypeObject()
-		 * @generated
-		 */
-		EDataType VARIABILITY_TYPE_OBJECT = eINSTANCE.getVariabilityTypeObject();
-
-		/**
-		 * The meta object literal for the '<em>Work Order Type Object</em>' data type.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.epf.xml.uma.WorkOrderType
-		 * @see org.eclipse.epf.xml.uma.impl.UmaPackageImpl#getWorkOrderTypeObject()
-		 * @generated
-		 */
-		EDataType WORK_ORDER_TYPE_OBJECT = eINSTANCE.getWorkOrderTypeObject();
-
-	}
-
-} //UmaPackage
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/VariabilityType.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/VariabilityType.java
deleted file mode 100644
index 5361aee..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/VariabilityType.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: VariabilityType.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Variability Type</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * An Enumeration used for values for instances of Variability Element's attribute variabilityType.  It defines the nature of how a Variability Element extends another Variability Element. See enumeration literals for definitions for each type.
- * <!-- end-model-doc -->
- * @see org.eclipse.epf.xml.uma.UmaPackage#getVariabilityType()
- * @model
- * @generated
- */
-public final class VariabilityType extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Na</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Na</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #NA_LITERAL
-	 * @model name="na"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int NA = 0;
-
-	/**
-	 * The '<em><b>Contributes</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Contributes</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #CONTRIBUTES_LITERAL
-	 * @model name="contributes"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int CONTRIBUTES = 1;
-
-	/**
-	 * The '<em><b>Extends</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Extends</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS_LITERAL
-	 * @model name="extends"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int EXTENDS = 2;
-
-	/**
-	 * The '<em><b>Replaces</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Replaces</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #REPLACES_LITERAL
-	 * @model name="replaces"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int REPLACES = 3;
-
-	/**
-	 * The '<em><b>Local Contribution</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Local Contribution</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_CONTRIBUTION_LITERAL
-	 * @model name="localContribution"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOCAL_CONTRIBUTION = 4;
-
-	/**
-	 * The '<em><b>Local Replacement</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Local Replacement</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_REPLACEMENT_LITERAL
-	 * @model name="localReplacement"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LOCAL_REPLACEMENT = 5;
-
-	/**
-	 * The '<em><b>Extends Replaces</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Extends Replaces</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS_REPLACES_LITERAL
-	 * @model name="extendsReplaces"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int EXTENDS_REPLACES = 6;
-
-	/**
-	 * The '<em><b>Na</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #NA
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType NA_LITERAL = new VariabilityType(NA, "na", "na");
-
-	/**
-	 * The '<em><b>Contributes</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #CONTRIBUTES
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType CONTRIBUTES_LITERAL = new VariabilityType(CONTRIBUTES, "contributes", "contributes");
-
-	/**
-	 * The '<em><b>Extends</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType EXTENDS_LITERAL = new VariabilityType(EXTENDS, "extends", "extends");
-
-	/**
-	 * The '<em><b>Replaces</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #REPLACES
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType REPLACES_LITERAL = new VariabilityType(REPLACES, "replaces", "replaces");
-
-	/**
-	 * The '<em><b>Local Contribution</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_CONTRIBUTION
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType LOCAL_CONTRIBUTION_LITERAL = new VariabilityType(LOCAL_CONTRIBUTION, "localContribution", "localContribution");
-
-	/**
-	 * The '<em><b>Local Replacement</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LOCAL_REPLACEMENT
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType LOCAL_REPLACEMENT_LITERAL = new VariabilityType(LOCAL_REPLACEMENT, "localReplacement", "localReplacement");
-
-	/**
-	 * The '<em><b>Extends Replaces</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXTENDS_REPLACES
-	 * @generated
-	 * @ordered
-	 */
-	public static final VariabilityType EXTENDS_REPLACES_LITERAL = new VariabilityType(EXTENDS_REPLACES, "extendsReplaces", "extendsReplaces");
-
-	/**
-	 * An array of all the '<em><b>Variability Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final VariabilityType[] VALUES_ARRAY =
-		new VariabilityType[] {
-			NA_LITERAL,
-			CONTRIBUTES_LITERAL,
-			EXTENDS_LITERAL,
-			REPLACES_LITERAL,
-			LOCAL_CONTRIBUTION_LITERAL,
-			LOCAL_REPLACEMENT_LITERAL,
-			EXTENDS_REPLACES_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Variability Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Variability Type</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static VariabilityType get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			VariabilityType result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Variability Type</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static VariabilityType getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			VariabilityType result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Variability Type</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static VariabilityType get(int value) {
-		switch (value) {
-			case NA: return NA_LITERAL;
-			case CONTRIBUTES: return CONTRIBUTES_LITERAL;
-			case EXTENDS: return EXTENDS_LITERAL;
-			case REPLACES: return REPLACES_LITERAL;
-			case LOCAL_CONTRIBUTION: return LOCAL_CONTRIBUTION_LITERAL;
-			case LOCAL_REPLACEMENT: return LOCAL_REPLACEMENT_LITERAL;
-			case EXTENDS_REPLACES: return EXTENDS_REPLACES_LITERAL;
-		}
-		return null;
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private VariabilityType(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //VariabilityType
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Whitepaper.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Whitepaper.java
deleted file mode 100644
index 503ea74..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/Whitepaper.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: Whitepaper.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Whitepaper</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Concept guidance that have been externally reviewed or published and can be read and understood in isolation of other content elements and guidance.
- * <!-- end-model-doc -->
- *
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWhitepaper()
- * @model extendedMetaData="name='Whitepaper' kind='elementOnly'"
- * @generated
- */
-public interface Whitepaper extends Concept {
-} // Whitepaper
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkBreakdownElement.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkBreakdownElement.java
deleted file mode 100644
index 4b4e71b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkBreakdownElement.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkBreakdownElement.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Breakdown Element that provides specific properties for Breakdown Elements that represent or refer to Work Definitions.  For example its subclass Activity defines work as it is also a subclass of Work Definition.  Its subclass Task Descriptor does not define work by itself, but refers to a Work Definition and therefore can have the same common properties and Work Breakdown Element has.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#getPredecessor <em>Predecessor</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsEventDriven <em>Is Event Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsOngoing <em>Is Ongoing</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsRepeatable <em>Is Repeatable</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkBreakdownElement()
- * @model extendedMetaData="name='WorkBreakdownElement' kind='elementOnly'"
- * @generated
- */
-public interface WorkBreakdownElement extends BreakdownElement {
-	/**
-	 * Returns the value of the '<em><b>Group1</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group1</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>Group1</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkBreakdownElement_Group1()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:20'"
-	 * @generated
-	 */
-	FeatureMap getGroup1();
-
-	/**
-	 * Returns the value of the '<em><b>Predecessor</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.epf.xml.uma.WorkOrder}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Predecessor</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>Predecessor</em>' containment reference list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkBreakdownElement_Predecessor()
-	 * @model type="org.eclipse.epf.xml.uma.WorkOrder" containment="true" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Predecessor' group='#group:20'"
-	 * @generated
-	 */
-	EList getPredecessor();
-
-	/**
-	 * Returns the value of the '<em><b>Is Event Driven</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * The isEventDriven attribute indicates that the Process Work Definition describes an instance of work which is not started because it has been scheduled to start at a certain point of time, because preceding work is being completed, or input work products are available, but because another specific event has occurred.  Examples for such events are exceptions or problem situations which require specific work to be performed as a result.  Also change management work can be modeled as event driven work analyzing a change request or defect and allocating work dynamically to resources to deal with it following the work described with such Process Work Definition.  The events themselves are not modeled in this version of the specification.  They shall be described as part of the normal descriptions fields available.
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Event Driven</em>' attribute.
-	 * @see #isSetIsEventDriven()
-	 * @see #unsetIsEventDriven()
-	 * @see #setIsEventDriven(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkBreakdownElement_IsEventDriven()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='isEventDriven'"
-	 * @generated
-	 */
-	boolean isIsEventDriven();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsEventDriven <em>Is Event Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Event Driven</em>' attribute.
-	 * @see #isSetIsEventDriven()
-	 * @see #unsetIsEventDriven()
-	 * @see #isIsEventDriven()
-	 * @generated
-	 */
-	void setIsEventDriven(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsEventDriven <em>Is Event Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsEventDriven()
-	 * @see #isIsEventDriven()
-	 * @see #setIsEventDriven(boolean)
-	 * @generated
-	 */
-	void unsetIsEventDriven();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsEventDriven <em>Is Event Driven</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Event Driven</em>' attribute is set.
-	 * @see #unsetIsEventDriven()
-	 * @see #isIsEventDriven()
-	 * @see #setIsEventDriven(boolean)
-	 * @generated
-	 */
-	boolean isSetIsEventDriven();
-
-	/**
-	 * Returns the value of the '<em><b>Is Ongoing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * If the isOngoing attribute is set to True for a Process Work Definition instance, then the element describes an ongoing piece of work without a fixed duration or end state.  For example, the Process Work Definition could represent work of an administrator continuously (e.g. 3h a day) working to ensure that systems are kept in a certain state.  Another example would be program management work overseeing many different projects being scheduled for one particular project at specific reoccurring intervals during the whole lifecycle of the project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Ongoing</em>' attribute.
-	 * @see #isSetIsOngoing()
-	 * @see #unsetIsOngoing()
-	 * @see #setIsOngoing(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkBreakdownElement_IsOngoing()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='isOngoing'"
-	 * @generated
-	 */
-	boolean isIsOngoing();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsOngoing <em>Is Ongoing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Ongoing</em>' attribute.
-	 * @see #isSetIsOngoing()
-	 * @see #unsetIsOngoing()
-	 * @see #isIsOngoing()
-	 * @generated
-	 */
-	void setIsOngoing(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsOngoing <em>Is Ongoing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsOngoing()
-	 * @see #isIsOngoing()
-	 * @see #setIsOngoing(boolean)
-	 * @generated
-	 */
-	void unsetIsOngoing();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsOngoing <em>Is Ongoing</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Ongoing</em>' attribute is set.
-	 * @see #unsetIsOngoing()
-	 * @see #isIsOngoing()
-	 * @see #setIsOngoing(boolean)
-	 * @generated
-	 */
-	boolean isSetIsOngoing();
-
-	/**
-	 * Returns the value of the '<em><b>Is Repeatable</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attribute is used to define repetition of work, e.g. iterations.  A Process Work Definition with this attribute set to True shall be repeated more than once on the same set of artifacts.  For example, for an instance of Iteration (defined as a special Process Work Definition below) this attribute is set to True by default indicating that every sub-Activity will be repeated more than once.  However, any Process Work Definition can set this attribute to True to define iterations (e.g. to iterate one Activity consisting of many sub-activities or even Phases, but to iterate just one Task).
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Is Repeatable</em>' attribute.
-	 * @see #isSetIsRepeatable()
-	 * @see #unsetIsRepeatable()
-	 * @see #setIsRepeatable(boolean)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkBreakdownElement_IsRepeatable()
-	 * @model unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='isRepeatable'"
-	 * @generated
-	 */
-	boolean isIsRepeatable();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsRepeatable <em>Is Repeatable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Is Repeatable</em>' attribute.
-	 * @see #isSetIsRepeatable()
-	 * @see #unsetIsRepeatable()
-	 * @see #isIsRepeatable()
-	 * @generated
-	 */
-	void setIsRepeatable(boolean value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsRepeatable <em>Is Repeatable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetIsRepeatable()
-	 * @see #isIsRepeatable()
-	 * @see #setIsRepeatable(boolean)
-	 * @generated
-	 */
-	void unsetIsRepeatable();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement#isIsRepeatable <em>Is Repeatable</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Is Repeatable</em>' attribute is set.
-	 * @see #unsetIsRepeatable()
-	 * @see #isIsRepeatable()
-	 * @see #setIsRepeatable(boolean)
-	 * @generated
-	 */
-	boolean isSetIsRepeatable();
-
-} // WorkBreakdownElement
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkDefinition.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkDefinition.java
deleted file mode 100644
index e93fa6f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkDefinition.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkDefinition.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Definition</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An abstract Method Element that generalizes all descriptions of work within the Unified Method Architecture.  This package introduces two concrete types of Work Definitions: Task and Step.  Work Definitions can contain sets of pre- and post-conditions defining constraints that need to be valid before the described work can begin or before it can be declared as finished.  Note that general ownedRules can be used to define additional constraints and rules for Work Definitions.
- * Work Definitions represent behavioral descriptions for doing work.  These behavioral descriptions are not bound to one specific classifier, but represent an arbitrary definition of work.  For example, a Work Definition could represent work that is being performed by a specific Role (e.g. a Role performing a specific Task or Steps of a Task), by many Roles working in close collaboration (many Roles all working together on the same interdisciplinary Task), or complex work that is performed throughout the lifecycle (e.g. a process defining a breakdown structure for organizing larger composite units of work performed by many Roles working in collaboration).
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkDefinition#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkDefinition#getPostcondition <em>Postcondition</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkDefinition()
- * @model extendedMetaData="name='WorkDefinition' kind='elementOnly'"
- * @generated
- */
-public interface WorkDefinition extends MethodElement {
-	/**
-	 * Returns the value of the '<em><b>Precondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Precondition</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Precondition</em>' attribute.
-	 * @see #setPrecondition(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkDefinition_Precondition()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Precondition'"
-	 * @generated
-	 */
-	String getPrecondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkDefinition#getPrecondition <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Precondition</em>' attribute.
-	 * @see #getPrecondition()
-	 * @generated
-	 */
-	void setPrecondition(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Postcondition</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Postcondition</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Postcondition</em>' attribute.
-	 * @see #setPostcondition(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkDefinition_Postcondition()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Postcondition'"
-	 * @generated
-	 */
-	String getPostcondition();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkDefinition#getPostcondition <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Postcondition</em>' attribute.
-	 * @see #getPostcondition()
-	 * @generated
-	 */
-	void setPostcondition(String value);
-
-} // WorkDefinition
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkOrder.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkOrder.java
deleted file mode 100644
index 0acdfc2..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkOrder.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkOrder.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.ecore.sdo.EDataObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Order</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * Represents a relationship between two Breakdown Elements in which one Breakdown Elements depends on the start or finish of another Breakdown Elements in order to begin or end.  
- * The Work Order class defines predecessor and successor relations amongst Breakdown Elements.  This information is in particular critical for planning applications.  See more details on different types of Work Order relationships at Work Order Type.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkOrder#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkOrder#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkOrder#getLinkType <em>Link Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkOrder()
- * @model extendedMetaData="name='WorkOrder' kind='simple'"
- * @extends EDataObject
- * @generated
- */
-public interface WorkOrder extends EDataObject {
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkOrder_Value()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkOrder#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Defines a global unique id for a work order.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkOrder_Id()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='id'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkOrder#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Link Type</b></em>' attribute.
-	 * The default value is <code>"finishToStart"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.epf.xml.uma.WorkOrderType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * This attribute expresses the type of the Work Order relationship by assigning a value from the Work Order Type enumeration.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Link Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.WorkOrderType
-	 * @see #isSetLinkType()
-	 * @see #unsetLinkType()
-	 * @see #setLinkType(WorkOrderType)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkOrder_LinkType()
-	 * @model default="finishToStart" unique="false" unsettable="true"
-	 *        extendedMetaData="kind='attribute' name='linkType'"
-	 * @generated
-	 */
-	WorkOrderType getLinkType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkOrder#getLinkType <em>Link Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Link Type</em>' attribute.
-	 * @see org.eclipse.epf.xml.uma.WorkOrderType
-	 * @see #isSetLinkType()
-	 * @see #unsetLinkType()
-	 * @see #getLinkType()
-	 * @generated
-	 */
-	void setLinkType(WorkOrderType value);
-
-	/**
-	 * Unsets the value of the '{@link org.eclipse.epf.xml.uma.WorkOrder#getLinkType <em>Link Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetLinkType()
-	 * @see #getLinkType()
-	 * @see #setLinkType(WorkOrderType)
-	 * @generated
-	 */
-	void unsetLinkType();
-
-	/**
-	 * Returns whether the value of the '{@link org.eclipse.epf.xml.uma.WorkOrder#getLinkType <em>Link Type</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Link Type</em>' attribute is set.
-	 * @see #unsetLinkType()
-	 * @see #getLinkType()
-	 * @see #setLinkType(WorkOrderType)
-	 * @generated
-	 */
-	boolean isSetLinkType();
-
-} // WorkOrder
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkOrderType.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkOrderType.java
deleted file mode 100644
index 36247f6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkOrderType.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkOrderType.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.AbstractEnumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Work Order Type</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * Represents a relationship between two Breakdown Element in which one Breakdown Element depends on the start or finish of another Breakdown Element in order to begin or end. This enumeration defines the different types of Work Order relationships available in UMA and is used to provide values for Work Order's linkType attribute.
- * <!-- end-model-doc -->
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkOrderType()
- * @model
- * @generated
- */
-public final class WorkOrderType extends AbstractEnumerator {
-	/**
-	 * The '<em><b>Finish To Start</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Finish To Start</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_START_LITERAL
-	 * @model name="finishToStart"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int FINISH_TO_START = 0;
-
-	/**
-	 * The '<em><b>Finish To Finish</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Finish To Finish</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_FINISH_LITERAL
-	 * @model name="finishToFinish"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int FINISH_TO_FINISH = 1;
-
-	/**
-	 * The '<em><b>Start To Start</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Start To Start</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_START_LITERAL
-	 * @model name="startToStart"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int START_TO_START = 2;
-
-	/**
-	 * The '<em><b>Start To Finish</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Start To Finish</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_FINISH_LITERAL
-	 * @model name="startToFinish"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int START_TO_FINISH = 3;
-
-	/**
-	 * The '<em><b>Finish To Start</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_START
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType FINISH_TO_START_LITERAL = new WorkOrderType(FINISH_TO_START, "finishToStart", "finishToStart");
-
-	/**
-	 * The '<em><b>Finish To Finish</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #FINISH_TO_FINISH
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType FINISH_TO_FINISH_LITERAL = new WorkOrderType(FINISH_TO_FINISH, "finishToFinish", "finishToFinish");
-
-	/**
-	 * The '<em><b>Start To Start</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_START
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType START_TO_START_LITERAL = new WorkOrderType(START_TO_START, "startToStart", "startToStart");
-
-	/**
-	 * The '<em><b>Start To Finish</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #START_TO_FINISH
-	 * @generated
-	 * @ordered
-	 */
-	public static final WorkOrderType START_TO_FINISH_LITERAL = new WorkOrderType(START_TO_FINISH, "startToFinish", "startToFinish");
-
-	/**
-	 * An array of all the '<em><b>Work Order Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final WorkOrderType[] VALUES_ARRAY =
-		new WorkOrderType[] {
-			FINISH_TO_START_LITERAL,
-			FINISH_TO_FINISH_LITERAL,
-			START_TO_START_LITERAL,
-			START_TO_FINISH_LITERAL,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>Work Order Type</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>Work Order Type</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WorkOrderType get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			WorkOrderType result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Work Order Type</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WorkOrderType getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			WorkOrderType result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>Work Order Type</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static WorkOrderType get(int value) {
-		switch (value) {
-			case FINISH_TO_START: return FINISH_TO_START_LITERAL;
-			case FINISH_TO_FINISH: return FINISH_TO_FINISH_LITERAL;
-			case START_TO_START: return START_TO_START_LITERAL;
-			case START_TO_FINISH: return START_TO_FINISH_LITERAL;
-		}
-		return null;
-	}
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private WorkOrderType(int value, String name, String literal) {
-		super(value, name, literal);
-	}
-
-} //WorkOrderType
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProduct.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProduct.java
deleted file mode 100644
index d30a4b5..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProduct.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProduct.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * An abstract class which provides a generalization for the content element types Artifact, Outcome, and Deliverable.  The meta-model class Work Product actually represents work product types, i.e. an instance of Work Product is a description of a specific type of work product and not an individual work product instance.  However, for simplicity reasons and because of low risk of misinterpretation we did not append the word 'type' to every meta-class.
- * A work product is an abstraction for descriptions of content elements that are used to define anything used, produced, or modified by a task.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProduct#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProduct#getEstimate <em>Estimate</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProduct#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProduct#getReport <em>Report</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProduct#getTemplate <em>Template</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProduct#getToolMentor <em>Tool Mentor</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProduct()
- * @model extendedMetaData="name='WorkProduct' kind='elementOnly'"
- * @generated
- */
-public interface WorkProduct extends ContentElement {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProduct_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Estimate</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimate</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>Estimate</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProduct_Estimate()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Estimate' group='#group:22'"
-	 * @generated
-	 */
-	EList getEstimate();
-
-	/**
-	 * Returns the value of the '<em><b>Estimation Considerations</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Estimation Considerations</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>Estimation Considerations</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProduct_EstimationConsiderations()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='EstimationConsiderations' group='#group:22'"
-	 * @generated
-	 */
-	EList getEstimationConsiderations();
-
-	/**
-	 * Returns the value of the '<em><b>Report</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Report</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>Report</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProduct_Report()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Report' group='#group:22'"
-	 * @generated
-	 */
-	EList getReport();
-
-	/**
-	 * Returns the value of the '<em><b>Template</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Template</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>Template</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProduct_Template()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Template' group='#group:22'"
-	 * @generated
-	 */
-	EList getTemplate();
-
-	/**
-	 * Returns the value of the '<em><b>Tool Mentor</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tool Mentor</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>Tool Mentor</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProduct_ToolMentor()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ToolMentor' group='#group:22'"
-	 * @generated
-	 */
-	EList getToolMentor();
-
-} // WorkProduct
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductDescription.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductDescription.java
deleted file mode 100644
index 785477d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductDescription.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductDescription.java,v 1.1 2008/01/15 08:52:06 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product Description</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A generalized Content Description that is used to store the textual description for a Work Product.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescription#getImpactOfNotHaving <em>Impact Of Not Having</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescription#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescription#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescription()
- * @model extendedMetaData="name='WorkProductDescription' kind='elementOnly'"
- * @generated
- */
-public interface WorkProductDescription extends ContentDescription {
-	/**
-	 * Returns the value of the '<em><b>Impact Of Not Having</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes the consequences of not producing the work product.  This is intended to aid in the tailoring the method/process to the needs of a specific project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Impact Of Not Having</em>' attribute.
-	 * @see #setImpactOfNotHaving(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescription_ImpactOfNotHaving()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ImpactOfNotHaving'"
-	 * @generated
-	 */
-	String getImpactOfNotHaving();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkProductDescription#getImpactOfNotHaving <em>Impact Of Not Having</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Impact Of Not Having</em>' attribute.
-	 * @see #getImpactOfNotHaving()
-	 * @generated
-	 */
-	void setImpactOfNotHaving(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Purpose</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes why the work product is produced and to what use it will be put.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Purpose</em>' attribute.
-	 * @see #setPurpose(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescription_Purpose()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='Purpose'"
-	 * @generated
-	 */
-	String getPurpose();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkProductDescription#getPurpose <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Purpose</em>' attribute.
-	 * @see #getPurpose()
-	 * @generated
-	 */
-	void setPurpose(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Reasons For Not Needing</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Describes the circumstances in which it is reasonable not to produce the work product.  This is intended to aid in the tailoring of the method/process to the needs of a specific project.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Reasons For Not Needing</em>' attribute.
-	 * @see #setReasonsForNotNeeding(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescription_ReasonsForNotNeeding()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ReasonsForNotNeeding'"
-	 * @generated
-	 */
-	String getReasonsForNotNeeding();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkProductDescription#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Reasons For Not Needing</em>' attribute.
-	 * @see #getReasonsForNotNeeding()
-	 * @generated
-	 */
-	void setReasonsForNotNeeding(String value);
-
-} // WorkProductDescription
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductDescriptor.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductDescriptor.java
deleted file mode 100644
index c2aa1cf..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductDescriptor.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductDescriptor.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product Descriptor</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A special Descriptor that represents a Work Product in the context of one specific Activity.  Every breakdown structure can define different relationships of Work Product Descriptors to Task Descriptors and Role Descriptors.  Therefore one Work Product can be represented by many Work Product Descriptors each within the context of an Activity with its own set of relationships.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getResponsibleRole <em>Responsible Role</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getExternalInputTo <em>External Input To</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getImpactedBy <em>Impacted By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getImpacts <em>Impacts</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getMandatoryInputTo <em>Mandatory Input To</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getOptionalInputTo <em>Optional Input To</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getOutputFrom <em>Output From</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getDeliverableParts <em>Deliverable Parts</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityEntryState <em>Activity Entry State</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityExitState <em>Activity Exit State</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor()
- * @model extendedMetaData="name='WorkProductDescriptor' kind='elementOnly'"
- * @generated
- */
-public interface WorkProductDescriptor extends Descriptor {
-	/**
-	 * Returns the value of the '<em><b>Work Product</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Product</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Work Product</em>' attribute.
-	 * @see #setWorkProduct(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_WorkProduct()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='WorkProduct'"
-	 * @generated
-	 */
-	String getWorkProduct();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getWorkProduct <em>Work Product</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Work Product</em>' attribute.
-	 * @see #getWorkProduct()
-	 * @generated
-	 */
-	void setWorkProduct(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Responsible Role</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Responsible Role</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Responsible Role</em>' attribute.
-	 * @see #setResponsibleRole(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_ResponsibleRole()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='element' name='ResponsibleRole'"
-	 * @generated
-	 */
-	String getResponsibleRole();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getResponsibleRole <em>Responsible Role</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Responsible Role</em>' attribute.
-	 * @see #getResponsibleRole()
-	 * @generated
-	 */
-	void setResponsibleRole(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Group1</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group1</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>Group1</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_Group1()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:23'"
-	 * @generated
-	 */
-	FeatureMap getGroup1();
-
-	/**
-	 * Returns the value of the '<em><b>External Input To</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>External Input To</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>External Input To</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_ExternalInputTo()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ExternalInputTo' group='#group:23'"
-	 * @generated
-	 */
-	EList getExternalInputTo();
-
-	/**
-	 * Returns the value of the '<em><b>Impacted By</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Impacted By</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>Impacted By</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_ImpactedBy()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ImpactedBy' group='#group:23'"
-	 * @generated
-	 */
-	EList getImpactedBy();
-
-	/**
-	 * Returns the value of the '<em><b>Impacts</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Impacts</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>Impacts</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_Impacts()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='Impacts' group='#group:23'"
-	 * @generated
-	 */
-	EList getImpacts();
-
-	/**
-	 * Returns the value of the '<em><b>Mandatory Input To</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mandatory Input To</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>Mandatory Input To</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_MandatoryInputTo()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='MandatoryInputTo' group='#group:23'"
-	 * @generated
-	 */
-	EList getMandatoryInputTo();
-
-	/**
-	 * Returns the value of the '<em><b>Optional Input To</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Optional Input To</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>Optional Input To</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_OptionalInputTo()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='OptionalInputTo' group='#group:23'"
-	 * @generated
-	 */
-	EList getOptionalInputTo();
-
-	/**
-	 * Returns the value of the '<em><b>Output From</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Output From</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>Output From</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_OutputFrom()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='OutputFrom' group='#group:23'"
-	 * @generated
-	 */
-	EList getOutputFrom();
-
-	/**
-	 * Returns the value of the '<em><b>Deliverable Parts</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Deliverable Parts</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>Deliverable Parts</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_DeliverableParts()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='DeliverableParts' group='#group:23'"
-	 * @generated
-	 */
-	EList getDeliverableParts();
-
-	/**
-	 * Returns the value of the '<em><b>Activity Entry State</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Entry State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is initiated (i.e. work on the Activity's Task Descriptors is being initiated that use this Work Product Descriptor as input).  
-	 * For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Activity Entry State</em>' attribute.
-	 * @see #setActivityEntryState(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_ActivityEntryState()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='activityEntryState'"
-	 * @generated
-	 */
-	String getActivityEntryState();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityEntryState <em>Activity Entry State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Activity Entry State</em>' attribute.
-	 * @see #getActivityEntryState()
-	 * @generated
-	 */
-	void setActivityEntryState(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Activity Exit State</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * Given that an instance of Work Product Descriptor has been created for a specific Activity, then the Activity Exist State attribute specifies the desired state of instances of the referenced Work Product when work on the Activity is finished (i.e. work on the Activity's Task Descriptors has finished that have this Work Product Descriptor as output).
-	 * For some Work Products state is expressed in percentage of completion, compliance to work product checklist, informal state descriptions, etc.  Others have very specific states expressed as enumerations such as [identified, briefly described, outlined, detailed] for use cases.  Other Work Product states relate to some quality measures or lifecycle states such as [reviewed, implemented, tested].
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Activity Exit State</em>' attribute.
-	 * @see #setActivityExitState(String)
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductDescriptor_ActivityExitState()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='activityExitState'"
-	 * @generated
-	 */
-	String getActivityExitState();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor#getActivityExitState <em>Activity Exit State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Activity Exit State</em>' attribute.
-	 * @see #getActivityExitState()
-	 * @generated
-	 */
-	void setActivityExitState(String value);
-
-} // WorkProductDescriptor
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductType.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductType.java
deleted file mode 100644
index 7685e00..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/WorkProductType.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductType.java,v 1.1 2008/01/15 08:52:07 jtham Exp $
- */
-package org.eclipse.epf.xml.uma;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Work Product Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <!-- begin-model-doc -->
- * A second category for work products, which in contrast to Domain is more presentation oriented.  A work product can have many Work Product Types.  Examples, for a Work Product Type is "Class Diagram", which categorizes the Artifacts Analysis Model, Design Model, User Experience Model, or "Specification", which categorizes requirements specifications that define a system with a well-defined system boundary, such as use case or functional requirements specification.  A Work Product can be categorized to be of many Work Product Types.  For example, a use case model can be categorized as a Specification as well as Diagram Work Product Type.
- * <!-- end-model-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductType#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.WorkProductType#getWorkProduct <em>Work Product</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductType()
- * @model extendedMetaData="name='WorkProductType' kind='elementOnly'"
- * @generated
- */
-public interface WorkProductType extends ContentCategory {
-	/**
-	 * Returns the value of the '<em><b>Group2</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Group2</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>Group2</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductType_Group2()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='group' name='group:22'"
-	 * @generated
-	 */
-	FeatureMap getGroup2();
-
-	/**
-	 * Returns the value of the '<em><b>Work Product</b></em>' attribute list.
-	 * The list contents are of type {@link java.lang.String}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Work Product</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>Work Product</em>' attribute list.
-	 * @see org.eclipse.epf.xml.uma.UmaPackage#getWorkProductType_WorkProduct()
-	 * @model type="java.lang.String" unique="false" dataType="org.eclipse.emf.ecore.xml.type.String" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='WorkProduct' group='#group:22'"
-	 * @generated
-	 */
-	EList getWorkProduct();
-
-} // WorkProductType
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ActivityDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ActivityDescriptionImpl.java
deleted file mode 100644
index 8c0ab0a..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ActivityDescriptionImpl.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ActivityDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.ActivityDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Activity Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityDescriptionImpl#getAlternatives <em>Alternatives</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityDescriptionImpl#getHowToStaff <em>How To Staff</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityDescriptionImpl#getPurpose <em>Purpose</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActivityDescriptionImpl extends BreakdownElementDescriptionImpl implements ActivityDescription {
-	/**
-	 * The default value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ALTERNATIVES_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected String alternatives = ALTERNATIVES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHowToStaff() <em>How To Staff</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHowToStaff()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String HOW_TO_STAFF_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getHowToStaff() <em>How To Staff</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getHowToStaff()
-	 * @generated
-	 * @ordered
-	 */
-	protected String howToStaff = HOW_TO_STAFF_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PURPOSE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected String purpose = PURPOSE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ACTIVITY_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAlternatives() {
-		return alternatives;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAlternatives(String newAlternatives) {
-		String oldAlternatives = alternatives;
-		alternatives = newAlternatives;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES, oldAlternatives, alternatives));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getHowToStaff() {
-		return howToStaff;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHowToStaff(String newHowToStaff) {
-		String oldHowToStaff = howToStaff;
-		howToStaff = newHowToStaff;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY_DESCRIPTION__HOW_TO_STAFF, oldHowToStaff, howToStaff));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPurpose() {
-		return purpose;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPurpose(String newPurpose) {
-		String oldPurpose = purpose;
-		purpose = newPurpose;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE, oldPurpose, purpose));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-				return getAlternatives();
-			case UmaPackage.ACTIVITY_DESCRIPTION__HOW_TO_STAFF:
-				return getHowToStaff();
-			case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-				return getPurpose();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-				setAlternatives((String)newValue);
-				return;
-			case UmaPackage.ACTIVITY_DESCRIPTION__HOW_TO_STAFF:
-				setHowToStaff((String)newValue);
-				return;
-			case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-				setPurpose((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-				setAlternatives(ALTERNATIVES_EDEFAULT);
-				return;
-			case UmaPackage.ACTIVITY_DESCRIPTION__HOW_TO_STAFF:
-				setHowToStaff(HOW_TO_STAFF_EDEFAULT);
-				return;
-			case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-				setPurpose(PURPOSE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY_DESCRIPTION__ALTERNATIVES:
-				return ALTERNATIVES_EDEFAULT == null ? alternatives != null : !ALTERNATIVES_EDEFAULT.equals(alternatives);
-			case UmaPackage.ACTIVITY_DESCRIPTION__HOW_TO_STAFF:
-				return HOW_TO_STAFF_EDEFAULT == null ? howToStaff != null : !HOW_TO_STAFF_EDEFAULT.equals(howToStaff);
-			case UmaPackage.ACTIVITY_DESCRIPTION__PURPOSE:
-				return PURPOSE_EDEFAULT == null ? purpose != null : !PURPOSE_EDEFAULT.equals(purpose);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (alternatives: ");
-		result.append(alternatives);
-		result.append(", howToStaff: ");
-		result.append(howToStaff);
-		result.append(", purpose: ");
-		result.append(purpose);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ActivityDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ActivityImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ActivityImpl.java
deleted file mode 100644
index 9613d68..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ActivityImpl.java
+++ /dev/null
@@ -1,690 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ActivityImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Activity;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.VariabilityType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Activity</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getPostcondition <em>Postcondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getBreakdownElement <em>Breakdown Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getChecklist <em>Checklist</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getConcept <em>Concept</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getExample <em>Example</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getGuideline <em>Guideline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getRoadmap <em>Roadmap</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getReusableAsset <em>Reusable Asset</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getSupportingMaterial <em>Supporting Material</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getWhitepaper <em>Whitepaper</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#isIsEnactable <em>Is Enactable</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ActivityImpl#getVariabilityType <em>Variability Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActivityImpl extends WorkBreakdownElementImpl implements Activity {
-	/**
-	 * The default value of the '{@link #getPrecondition() <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRECONDITION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPrecondition() <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected String precondition = PRECONDITION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPostcondition() <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String POSTCONDITION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPostcondition() <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected String postcondition = POSTCONDITION_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * The default value of the '{@link #isIsEnactable() <em>Is Enactable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsEnactable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_ENACTABLE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsEnactable() <em>Is Enactable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsEnactable()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isEnactable = IS_ENACTABLE_EDEFAULT;
-
-	/**
-	 * This is true if the Is Enactable attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isEnactableESet;
-
-	/**
-	 * The default value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VARIABILITY_BASED_ON_ELEMENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected String variabilityBasedOnElement = VARIABILITY_BASED_ON_ELEMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final VariabilityType VARIABILITY_TYPE_EDEFAULT = VariabilityType.NA_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityType variabilityType = VARIABILITY_TYPE_EDEFAULT;
-
-	/**
-	 * This is true if the Variability Type attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean variabilityTypeESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActivityImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ACTIVITY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPrecondition() {
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrecondition(String newPrecondition) {
-		String oldPrecondition = precondition;
-		precondition = newPrecondition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY__PRECONDITION, oldPrecondition, precondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPostcondition() {
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPostcondition(String newPostcondition) {
-		String oldPostcondition = postcondition;
-		postcondition = newPostcondition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY__POSTCONDITION, oldPostcondition, postcondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.ACTIVITY__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBreakdownElement() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__BREAKDOWN_ELEMENT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getChecklist() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__CHECKLIST);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getConcept() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__CONCEPT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExample() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__EXAMPLE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getGuideline() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__GUIDELINE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRoadmap() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__ROADMAP);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReusableAsset() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__REUSABLE_ASSET);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSupportingMaterial() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__SUPPORTING_MATERIAL);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getWhitepaper() {
-		return getGroup2().list(UmaPackage.Literals.ACTIVITY__WHITEPAPER);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsEnactable() {
-		return isEnactable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsEnactable(boolean newIsEnactable) {
-		boolean oldIsEnactable = isEnactable;
-		isEnactable = newIsEnactable;
-		boolean oldIsEnactableESet = isEnactableESet;
-		isEnactableESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY__IS_ENACTABLE, oldIsEnactable, isEnactable, !oldIsEnactableESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsEnactable() {
-		boolean oldIsEnactable = isEnactable;
-		boolean oldIsEnactableESet = isEnactableESet;
-		isEnactable = IS_ENACTABLE_EDEFAULT;
-		isEnactableESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.ACTIVITY__IS_ENACTABLE, oldIsEnactable, IS_ENACTABLE_EDEFAULT, oldIsEnactableESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsEnactable() {
-		return isEnactableESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVariabilityBasedOnElement() {
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityBasedOnElement(String newVariabilityBasedOnElement) {
-		String oldVariabilityBasedOnElement = variabilityBasedOnElement;
-		variabilityBasedOnElement = newVariabilityBasedOnElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT, oldVariabilityBasedOnElement, variabilityBasedOnElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType getVariabilityType() {
-		return variabilityType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityType(VariabilityType newVariabilityType) {
-		VariabilityType oldVariabilityType = variabilityType;
-		variabilityType = newVariabilityType == null ? VARIABILITY_TYPE_EDEFAULT : newVariabilityType;
-		boolean oldVariabilityTypeESet = variabilityTypeESet;
-		variabilityTypeESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ACTIVITY__VARIABILITY_TYPE, oldVariabilityType, variabilityType, !oldVariabilityTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetVariabilityType() {
-		VariabilityType oldVariabilityType = variabilityType;
-		boolean oldVariabilityTypeESet = variabilityTypeESet;
-		variabilityType = VARIABILITY_TYPE_EDEFAULT;
-		variabilityTypeESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.ACTIVITY__VARIABILITY_TYPE, oldVariabilityType, VARIABILITY_TYPE_EDEFAULT, oldVariabilityTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetVariabilityType() {
-		return variabilityTypeESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENT:
-				return ((InternalEList)getBreakdownElement()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY__PRECONDITION:
-				return getPrecondition();
-			case UmaPackage.ACTIVITY__POSTCONDITION:
-				return getPostcondition();
-			case UmaPackage.ACTIVITY__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENT:
-				return getBreakdownElement();
-			case UmaPackage.ACTIVITY__CHECKLIST:
-				return getChecklist();
-			case UmaPackage.ACTIVITY__CONCEPT:
-				return getConcept();
-			case UmaPackage.ACTIVITY__EXAMPLE:
-				return getExample();
-			case UmaPackage.ACTIVITY__GUIDELINE:
-				return getGuideline();
-			case UmaPackage.ACTIVITY__ROADMAP:
-				return getRoadmap();
-			case UmaPackage.ACTIVITY__REUSABLE_ASSET:
-				return getReusableAsset();
-			case UmaPackage.ACTIVITY__SUPPORTING_MATERIAL:
-				return getSupportingMaterial();
-			case UmaPackage.ACTIVITY__WHITEPAPER:
-				return getWhitepaper();
-			case UmaPackage.ACTIVITY__IS_ENACTABLE:
-				return isIsEnactable() ? Boolean.TRUE : Boolean.FALSE;
-			case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-				return getVariabilityBasedOnElement();
-			case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-				return getVariabilityType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY__PRECONDITION:
-				setPrecondition((String)newValue);
-				return;
-			case UmaPackage.ACTIVITY__POSTCONDITION:
-				setPostcondition((String)newValue);
-				return;
-			case UmaPackage.ACTIVITY__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENT:
-				getBreakdownElement().clear();
-				getBreakdownElement().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__CHECKLIST:
-				getChecklist().clear();
-				getChecklist().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__CONCEPT:
-				getConcept().clear();
-				getConcept().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__EXAMPLE:
-				getExample().clear();
-				getExample().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__GUIDELINE:
-				getGuideline().clear();
-				getGuideline().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__ROADMAP:
-				getRoadmap().clear();
-				getRoadmap().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__REUSABLE_ASSET:
-				getReusableAsset().clear();
-				getReusableAsset().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__SUPPORTING_MATERIAL:
-				getSupportingMaterial().clear();
-				getSupportingMaterial().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__WHITEPAPER:
-				getWhitepaper().clear();
-				getWhitepaper().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ACTIVITY__IS_ENACTABLE:
-				setIsEnactable(((Boolean)newValue).booleanValue());
-				return;
-			case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-				setVariabilityBasedOnElement((String)newValue);
-				return;
-			case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-				setVariabilityType((VariabilityType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY__PRECONDITION:
-				setPrecondition(PRECONDITION_EDEFAULT);
-				return;
-			case UmaPackage.ACTIVITY__POSTCONDITION:
-				setPostcondition(POSTCONDITION_EDEFAULT);
-				return;
-			case UmaPackage.ACTIVITY__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENT:
-				getBreakdownElement().clear();
-				return;
-			case UmaPackage.ACTIVITY__CHECKLIST:
-				getChecklist().clear();
-				return;
-			case UmaPackage.ACTIVITY__CONCEPT:
-				getConcept().clear();
-				return;
-			case UmaPackage.ACTIVITY__EXAMPLE:
-				getExample().clear();
-				return;
-			case UmaPackage.ACTIVITY__GUIDELINE:
-				getGuideline().clear();
-				return;
-			case UmaPackage.ACTIVITY__ROADMAP:
-				getRoadmap().clear();
-				return;
-			case UmaPackage.ACTIVITY__REUSABLE_ASSET:
-				getReusableAsset().clear();
-				return;
-			case UmaPackage.ACTIVITY__SUPPORTING_MATERIAL:
-				getSupportingMaterial().clear();
-				return;
-			case UmaPackage.ACTIVITY__WHITEPAPER:
-				getWhitepaper().clear();
-				return;
-			case UmaPackage.ACTIVITY__IS_ENACTABLE:
-				unsetIsEnactable();
-				return;
-			case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-				setVariabilityBasedOnElement(VARIABILITY_BASED_ON_ELEMENT_EDEFAULT);
-				return;
-			case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-				unsetVariabilityType();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ACTIVITY__PRECONDITION:
-				return PRECONDITION_EDEFAULT == null ? precondition != null : !PRECONDITION_EDEFAULT.equals(precondition);
-			case UmaPackage.ACTIVITY__POSTCONDITION:
-				return POSTCONDITION_EDEFAULT == null ? postcondition != null : !POSTCONDITION_EDEFAULT.equals(postcondition);
-			case UmaPackage.ACTIVITY__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.ACTIVITY__BREAKDOWN_ELEMENT:
-				return !getBreakdownElement().isEmpty();
-			case UmaPackage.ACTIVITY__CHECKLIST:
-				return !getChecklist().isEmpty();
-			case UmaPackage.ACTIVITY__CONCEPT:
-				return !getConcept().isEmpty();
-			case UmaPackage.ACTIVITY__EXAMPLE:
-				return !getExample().isEmpty();
-			case UmaPackage.ACTIVITY__GUIDELINE:
-				return !getGuideline().isEmpty();
-			case UmaPackage.ACTIVITY__ROADMAP:
-				return !getRoadmap().isEmpty();
-			case UmaPackage.ACTIVITY__REUSABLE_ASSET:
-				return !getReusableAsset().isEmpty();
-			case UmaPackage.ACTIVITY__SUPPORTING_MATERIAL:
-				return !getSupportingMaterial().isEmpty();
-			case UmaPackage.ACTIVITY__WHITEPAPER:
-				return !getWhitepaper().isEmpty();
-			case UmaPackage.ACTIVITY__IS_ENACTABLE:
-				return isSetIsEnactable();
-			case UmaPackage.ACTIVITY__VARIABILITY_BASED_ON_ELEMENT:
-				return VARIABILITY_BASED_ON_ELEMENT_EDEFAULT == null ? variabilityBasedOnElement != null : !VARIABILITY_BASED_ON_ELEMENT_EDEFAULT.equals(variabilityBasedOnElement);
-			case UmaPackage.ACTIVITY__VARIABILITY_TYPE:
-				return isSetVariabilityType();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (precondition: ");
-		result.append(precondition);
-		result.append(", postcondition: ");
-		result.append(postcondition);
-		result.append(", group2: ");
-		result.append(group2);
-		result.append(", isEnactable: ");
-		if (isEnactableESet) result.append(isEnactable); else result.append("<unset>");
-		result.append(", variabilityBasedOnElement: ");
-		result.append(variabilityBasedOnElement);
-		result.append(", variabilityType: ");
-		if (variabilityTypeESet) result.append(variabilityType); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //ActivityImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ArtifactDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ArtifactDescriptionImpl.java
deleted file mode 100644
index 171d89d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ArtifactDescriptionImpl.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ArtifactDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.ArtifactDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Artifact Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl#getBriefOutline <em>Brief Outline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl#getRepresentationOptions <em>Representation Options</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl#getRepresentation <em>Representation</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ArtifactDescriptionImpl#getNotation <em>Notation</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ArtifactDescriptionImpl extends WorkProductDescriptionImpl implements ArtifactDescription {
-	/**
-	 * The default value of the '{@link #getBriefOutline() <em>Brief Outline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefOutline()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BRIEF_OUTLINE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBriefOutline() <em>Brief Outline</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefOutline()
-	 * @generated
-	 * @ordered
-	 */
-	protected String briefOutline = BRIEF_OUTLINE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRepresentationOptions() <em>Representation Options</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentationOptions()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REPRESENTATION_OPTIONS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRepresentationOptions() <em>Representation Options</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentationOptions()
-	 * @generated
-	 * @ordered
-	 */
-	protected String representationOptions = REPRESENTATION_OPTIONS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRepresentation() <em>Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REPRESENTATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRepresentation() <em>Representation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRepresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String representation = REPRESENTATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNotation() <em>Notation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotation()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NOTATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNotation() <em>Notation</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNotation()
-	 * @generated
-	 * @ordered
-	 */
-	protected String notation = NOTATION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArtifactDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ARTIFACT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBriefOutline() {
-		return briefOutline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBriefOutline(String newBriefOutline) {
-		String oldBriefOutline = briefOutline;
-		briefOutline = newBriefOutline;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE, oldBriefOutline, briefOutline));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRepresentationOptions() {
-		return representationOptions;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRepresentationOptions(String newRepresentationOptions) {
-		String oldRepresentationOptions = representationOptions;
-		representationOptions = newRepresentationOptions;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS, oldRepresentationOptions, representationOptions));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRepresentation() {
-		return representation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRepresentation(String newRepresentation) {
-		String oldRepresentation = representation;
-		representation = newRepresentation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION, oldRepresentation, representation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNotation() {
-		return notation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNotation(String newNotation) {
-		String oldNotation = notation;
-		notation = newNotation;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ARTIFACT_DESCRIPTION__NOTATION, oldNotation, notation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-				return getBriefOutline();
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-				return getRepresentationOptions();
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-				return getRepresentation();
-			case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-				return getNotation();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-				setBriefOutline((String)newValue);
-				return;
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-				setRepresentationOptions((String)newValue);
-				return;
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-				setRepresentation((String)newValue);
-				return;
-			case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-				setNotation((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-				setBriefOutline(BRIEF_OUTLINE_EDEFAULT);
-				return;
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-				setRepresentationOptions(REPRESENTATION_OPTIONS_EDEFAULT);
-				return;
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-				setRepresentation(REPRESENTATION_EDEFAULT);
-				return;
-			case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-				setNotation(NOTATION_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT_DESCRIPTION__BRIEF_OUTLINE:
-				return BRIEF_OUTLINE_EDEFAULT == null ? briefOutline != null : !BRIEF_OUTLINE_EDEFAULT.equals(briefOutline);
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS:
-				return REPRESENTATION_OPTIONS_EDEFAULT == null ? representationOptions != null : !REPRESENTATION_OPTIONS_EDEFAULT.equals(representationOptions);
-			case UmaPackage.ARTIFACT_DESCRIPTION__REPRESENTATION:
-				return REPRESENTATION_EDEFAULT == null ? representation != null : !REPRESENTATION_EDEFAULT.equals(representation);
-			case UmaPackage.ARTIFACT_DESCRIPTION__NOTATION:
-				return NOTATION_EDEFAULT == null ? notation != null : !NOTATION_EDEFAULT.equals(notation);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (briefOutline: ");
-		result.append(briefOutline);
-		result.append(", representationOptions: ");
-		result.append(representationOptions);
-		result.append(", representation: ");
-		result.append(representation);
-		result.append(", notation: ");
-		result.append(notation);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ArtifactDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ArtifactImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ArtifactImpl.java
deleted file mode 100644
index dc4c8c6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ArtifactImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ArtifactImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Artifact;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Artifact</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ArtifactImpl#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ArtifactImpl#getContainedArtifact <em>Contained Artifact</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ArtifactImpl extends WorkProductImpl implements Artifact {
-	/**
-	 * The cached value of the '{@link #getGroup3() <em>Group3</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup3()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group3;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ArtifactImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ARTIFACT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup3() {
-		if (group3 == null) {
-			group3 = new BasicFeatureMap(this, UmaPackage.ARTIFACT__GROUP3);
-		}
-		return group3;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getContainedArtifact() {
-		return getGroup3().list(UmaPackage.Literals.ARTIFACT__CONTAINED_ARTIFACT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT__GROUP3:
-				return ((InternalEList)getGroup3()).basicRemove(otherEnd, msgs);
-			case UmaPackage.ARTIFACT__CONTAINED_ARTIFACT:
-				return ((InternalEList)getContainedArtifact()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT__GROUP3:
-				if (coreType) return getGroup3();
-				return ((FeatureMap.Internal)getGroup3()).getWrapper();
-			case UmaPackage.ARTIFACT__CONTAINED_ARTIFACT:
-				return getContainedArtifact();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT__GROUP3:
-				((FeatureMap.Internal)getGroup3()).set(newValue);
-				return;
-			case UmaPackage.ARTIFACT__CONTAINED_ARTIFACT:
-				getContainedArtifact().clear();
-				getContainedArtifact().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT__GROUP3:
-				getGroup3().clear();
-				return;
-			case UmaPackage.ARTIFACT__CONTAINED_ARTIFACT:
-				getContainedArtifact().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ARTIFACT__GROUP3:
-				return group3 != null && !group3.isEmpty();
-			case UmaPackage.ARTIFACT__CONTAINED_ARTIFACT:
-				return !getContainedArtifact().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group3: ");
-		result.append(group3);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ArtifactImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/BreakdownElementDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/BreakdownElementDescriptionImpl.java
deleted file mode 100644
index 0db63c8..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/BreakdownElementDescriptionImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: BreakdownElementDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.BreakdownElementDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Breakdown Element Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementDescriptionImpl#getUsageGuidance <em>Usage Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BreakdownElementDescriptionImpl extends ContentDescriptionImpl implements BreakdownElementDescription {
-	/**
-	 * The default value of the '{@link #getUsageGuidance() <em>Usage Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String USAGE_GUIDANCE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUsageGuidance() <em>Usage Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected String usageGuidance = USAGE_GUIDANCE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BreakdownElementDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.BREAKDOWN_ELEMENT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getUsageGuidance() {
-		return usageGuidance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUsageGuidance(String newUsageGuidance) {
-		String oldUsageGuidance = usageGuidance;
-		usageGuidance = newUsageGuidance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE, oldUsageGuidance, usageGuidance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-				return getUsageGuidance();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-				setUsageGuidance((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-				setUsageGuidance(USAGE_GUIDANCE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE:
-				return USAGE_GUIDANCE_EDEFAULT == null ? usageGuidance != null : !USAGE_GUIDANCE_EDEFAULT.equals(usageGuidance);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (usageGuidance: ");
-		result.append(usageGuidance);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BreakdownElementDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/BreakdownElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/BreakdownElementImpl.java
deleted file mode 100644
index 12a3283..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/BreakdownElementImpl.java
+++ /dev/null
@@ -1,637 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: BreakdownElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.BreakdownElement;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#getPresentedAfter <em>Presented After</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#getPresentedBefore <em>Presented Before</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#getPlanningData <em>Planning Data</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#getSuperActivity <em>Super Activity</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#isHasMultipleOccurrences <em>Has Multiple Occurrences</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#isIsOptional <em>Is Optional</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#isIsPlanned <em>Is Planned</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.BreakdownElementImpl#getPrefix <em>Prefix</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BreakdownElementImpl extends ProcessElementImpl implements BreakdownElement {
-	/**
-	 * The default value of the '{@link #getPresentedAfter() <em>Presented After</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentedAfter()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRESENTED_AFTER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPresentedAfter() <em>Presented After</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentedAfter()
-	 * @generated
-	 * @ordered
-	 */
-	protected String presentedAfter = PRESENTED_AFTER_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPresentedBefore() <em>Presented Before</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentedBefore()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRESENTED_BEFORE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPresentedBefore() <em>Presented Before</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentedBefore()
-	 * @generated
-	 * @ordered
-	 */
-	protected String presentedBefore = PRESENTED_BEFORE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPlanningData() <em>Planning Data</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPlanningData()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PLANNING_DATA_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPlanningData() <em>Planning Data</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPlanningData()
-	 * @generated
-	 * @ordered
-	 */
-	protected String planningData = PLANNING_DATA_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSuperActivity() <em>Super Activity</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuperActivity()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SUPER_ACTIVITY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSuperActivity() <em>Super Activity</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuperActivity()
-	 * @generated
-	 * @ordered
-	 */
-	protected String superActivity = SUPER_ACTIVITY_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isHasMultipleOccurrences() <em>Has Multiple Occurrences</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHasMultipleOccurrences()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean HAS_MULTIPLE_OCCURRENCES_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isHasMultipleOccurrences() <em>Has Multiple Occurrences</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHasMultipleOccurrences()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean hasMultipleOccurrences = HAS_MULTIPLE_OCCURRENCES_EDEFAULT;
-
-	/**
-	 * This is true if the Has Multiple Occurrences attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean hasMultipleOccurrencesESet;
-
-	/**
-	 * The default value of the '{@link #isIsOptional() <em>Is Optional</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsOptional()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_OPTIONAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsOptional() <em>Is Optional</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsOptional()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isOptional = IS_OPTIONAL_EDEFAULT;
-
-	/**
-	 * This is true if the Is Optional attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isOptionalESet;
-
-	/**
-	 * The default value of the '{@link #isIsPlanned() <em>Is Planned</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsPlanned()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_PLANNED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsPlanned() <em>Is Planned</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsPlanned()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isPlanned = IS_PLANNED_EDEFAULT;
-
-	/**
-	 * This is true if the Is Planned attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isPlannedESet;
-
-	/**
-	 * The default value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrefix()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PREFIX_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrefix()
-	 * @generated
-	 * @ordered
-	 */
-	protected String prefix = PREFIX_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BreakdownElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.BREAKDOWN_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPresentedAfter() {
-		return presentedAfter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentedAfter(String newPresentedAfter) {
-		String oldPresentedAfter = presentedAfter;
-		presentedAfter = newPresentedAfter;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER, oldPresentedAfter, presentedAfter));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPresentedBefore() {
-		return presentedBefore;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentedBefore(String newPresentedBefore) {
-		String oldPresentedBefore = presentedBefore;
-		presentedBefore = newPresentedBefore;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE, oldPresentedBefore, presentedBefore));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPlanningData() {
-		return planningData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPlanningData(String newPlanningData) {
-		String oldPlanningData = planningData;
-		planningData = newPlanningData;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA, oldPlanningData, planningData));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSuperActivity() {
-		return superActivity;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuperActivity(String newSuperActivity) {
-		String oldSuperActivity = superActivity;
-		superActivity = newSuperActivity;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITY, oldSuperActivity, superActivity));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isHasMultipleOccurrences() {
-		return hasMultipleOccurrences;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHasMultipleOccurrences(boolean newHasMultipleOccurrences) {
-		boolean oldHasMultipleOccurrences = hasMultipleOccurrences;
-		hasMultipleOccurrences = newHasMultipleOccurrences;
-		boolean oldHasMultipleOccurrencesESet = hasMultipleOccurrencesESet;
-		hasMultipleOccurrencesESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES, oldHasMultipleOccurrences, hasMultipleOccurrences, !oldHasMultipleOccurrencesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetHasMultipleOccurrences() {
-		boolean oldHasMultipleOccurrences = hasMultipleOccurrences;
-		boolean oldHasMultipleOccurrencesESet = hasMultipleOccurrencesESet;
-		hasMultipleOccurrences = HAS_MULTIPLE_OCCURRENCES_EDEFAULT;
-		hasMultipleOccurrencesESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES, oldHasMultipleOccurrences, HAS_MULTIPLE_OCCURRENCES_EDEFAULT, oldHasMultipleOccurrencesESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetHasMultipleOccurrences() {
-		return hasMultipleOccurrencesESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsOptional() {
-		return isOptional;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsOptional(boolean newIsOptional) {
-		boolean oldIsOptional = isOptional;
-		isOptional = newIsOptional;
-		boolean oldIsOptionalESet = isOptionalESet;
-		isOptionalESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL, oldIsOptional, isOptional, !oldIsOptionalESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsOptional() {
-		boolean oldIsOptional = isOptional;
-		boolean oldIsOptionalESet = isOptionalESet;
-		isOptional = IS_OPTIONAL_EDEFAULT;
-		isOptionalESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL, oldIsOptional, IS_OPTIONAL_EDEFAULT, oldIsOptionalESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsOptional() {
-		return isOptionalESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsPlanned() {
-		return isPlanned;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsPlanned(boolean newIsPlanned) {
-		boolean oldIsPlanned = isPlanned;
-		isPlanned = newIsPlanned;
-		boolean oldIsPlannedESet = isPlannedESet;
-		isPlannedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED, oldIsPlanned, isPlanned, !oldIsPlannedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsPlanned() {
-		boolean oldIsPlanned = isPlanned;
-		boolean oldIsPlannedESet = isPlannedESet;
-		isPlanned = IS_PLANNED_EDEFAULT;
-		isPlannedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED, oldIsPlanned, IS_PLANNED_EDEFAULT, oldIsPlannedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsPlanned() {
-		return isPlannedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrefix(String newPrefix) {
-		String oldPrefix = prefix;
-		prefix = newPrefix;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.BREAKDOWN_ELEMENT__PREFIX, oldPrefix, prefix));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-				return getPresentedAfter();
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-				return getPresentedBefore();
-			case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-				return getPlanningData();
-			case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITY:
-				return getSuperActivity();
-			case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-				return isHasMultipleOccurrences() ? Boolean.TRUE : Boolean.FALSE;
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-				return isIsOptional() ? Boolean.TRUE : Boolean.FALSE;
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-				return isIsPlanned() ? Boolean.TRUE : Boolean.FALSE;
-			case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-				return getPrefix();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-				setPresentedAfter((String)newValue);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-				setPresentedBefore((String)newValue);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-				setPlanningData((String)newValue);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITY:
-				setSuperActivity((String)newValue);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-				setHasMultipleOccurrences(((Boolean)newValue).booleanValue());
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-				setIsOptional(((Boolean)newValue).booleanValue());
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-				setIsPlanned(((Boolean)newValue).booleanValue());
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-				setPrefix((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-				setPresentedAfter(PRESENTED_AFTER_EDEFAULT);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-				setPresentedBefore(PRESENTED_BEFORE_EDEFAULT);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-				setPlanningData(PLANNING_DATA_EDEFAULT);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITY:
-				setSuperActivity(SUPER_ACTIVITY_EDEFAULT);
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-				unsetHasMultipleOccurrences();
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-				unsetIsOptional();
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-				unsetIsPlanned();
-				return;
-			case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-				setPrefix(PREFIX_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_AFTER:
-				return PRESENTED_AFTER_EDEFAULT == null ? presentedAfter != null : !PRESENTED_AFTER_EDEFAULT.equals(presentedAfter);
-			case UmaPackage.BREAKDOWN_ELEMENT__PRESENTED_BEFORE:
-				return PRESENTED_BEFORE_EDEFAULT == null ? presentedBefore != null : !PRESENTED_BEFORE_EDEFAULT.equals(presentedBefore);
-			case UmaPackage.BREAKDOWN_ELEMENT__PLANNING_DATA:
-				return PLANNING_DATA_EDEFAULT == null ? planningData != null : !PLANNING_DATA_EDEFAULT.equals(planningData);
-			case UmaPackage.BREAKDOWN_ELEMENT__SUPER_ACTIVITY:
-				return SUPER_ACTIVITY_EDEFAULT == null ? superActivity != null : !SUPER_ACTIVITY_EDEFAULT.equals(superActivity);
-			case UmaPackage.BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES:
-				return isSetHasMultipleOccurrences();
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_OPTIONAL:
-				return isSetIsOptional();
-			case UmaPackage.BREAKDOWN_ELEMENT__IS_PLANNED:
-				return isSetIsPlanned();
-			case UmaPackage.BREAKDOWN_ELEMENT__PREFIX:
-				return PREFIX_EDEFAULT == null ? prefix != null : !PREFIX_EDEFAULT.equals(prefix);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (presentedAfter: ");
-		result.append(presentedAfter);
-		result.append(", presentedBefore: ");
-		result.append(presentedBefore);
-		result.append(", planningData: ");
-		result.append(planningData);
-		result.append(", superActivity: ");
-		result.append(superActivity);
-		result.append(", hasMultipleOccurrences: ");
-		if (hasMultipleOccurrencesESet) result.append(hasMultipleOccurrences); else result.append("<unset>");
-		result.append(", isOptional: ");
-		if (isOptionalESet) result.append(isOptional); else result.append("<unset>");
-		result.append(", isPlanned: ");
-		if (isPlannedESet) result.append(isPlanned); else result.append("<unset>");
-		result.append(", prefix: ");
-		result.append(prefix);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BreakdownElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CapabilityPatternImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CapabilityPatternImpl.java
deleted file mode 100644
index a212f37..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CapabilityPatternImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CapabilityPatternImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.CapabilityPattern;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Capability Pattern</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class CapabilityPatternImpl extends ProcessImpl implements CapabilityPattern {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CapabilityPatternImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CAPABILITY_PATTERN;
-	}
-
-} //CapabilityPatternImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ChecklistImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ChecklistImpl.java
deleted file mode 100644
index 67e568d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ChecklistImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ChecklistImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Checklist;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Checklist</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ChecklistImpl extends GuidanceImpl implements Checklist {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ChecklistImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CHECKLIST;
-	}
-
-} //ChecklistImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CompositeRoleImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CompositeRoleImpl.java
deleted file mode 100644
index 2fc5d33..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CompositeRoleImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CompositeRoleImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.CompositeRole;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Composite Role</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.CompositeRoleImpl#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.CompositeRoleImpl#getAggregatedRole <em>Aggregated Role</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class CompositeRoleImpl extends RoleDescriptorImpl implements CompositeRole {
-	/**
-	 * The cached value of the '{@link #getGroup1() <em>Group1</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup1()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group1;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CompositeRoleImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.COMPOSITE_ROLE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup1() {
-		if (group1 == null) {
-			group1 = new BasicFeatureMap(this, UmaPackage.COMPOSITE_ROLE__GROUP1);
-		}
-		return group1;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAggregatedRole() {
-		return getGroup1().list(UmaPackage.Literals.COMPOSITE_ROLE__AGGREGATED_ROLE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.COMPOSITE_ROLE__GROUP1:
-				return ((InternalEList)getGroup1()).basicRemove(otherEnd, msgs);
-			case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLE:
-				return ((InternalEList)getAggregatedRole()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.COMPOSITE_ROLE__GROUP1:
-				if (coreType) return getGroup1();
-				return ((FeatureMap.Internal)getGroup1()).getWrapper();
-			case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLE:
-				return getAggregatedRole();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.COMPOSITE_ROLE__GROUP1:
-				((FeatureMap.Internal)getGroup1()).set(newValue);
-				return;
-			case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLE:
-				getAggregatedRole().clear();
-				getAggregatedRole().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.COMPOSITE_ROLE__GROUP1:
-				getGroup1().clear();
-				return;
-			case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLE:
-				getAggregatedRole().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.COMPOSITE_ROLE__GROUP1:
-				return group1 != null && !group1.isEmpty();
-			case UmaPackage.COMPOSITE_ROLE__AGGREGATED_ROLE:
-				return !getAggregatedRole().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group1: ");
-		result.append(group1);
-		result.append(')');
-		return result.toString();
-	}
-
-} //CompositeRoleImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ConceptImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ConceptImpl.java
deleted file mode 100644
index 4a734a3..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ConceptImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConceptImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Concept;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Concept</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ConceptImpl extends GuidanceImpl implements Concept {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConceptImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONCEPT;
-	}
-
-} //ConceptImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ConstraintImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ConstraintImpl.java
deleted file mode 100644
index fa68359..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ConstraintImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ConstraintImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.Constraint;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Constraint</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ConstraintImpl#getMainDescription <em>Main Description</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConstraintImpl extends MethodElementImpl implements Constraint {
-	/**
-	 * The default value of the '{@link #getMainDescription() <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMainDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MAIN_DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMainDescription() <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMainDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String mainDescription = MAIN_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConstraintImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONSTRAINT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getMainDescription() {
-		return mainDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMainDescription(String newMainDescription) {
-		String oldMainDescription = mainDescription;
-		mainDescription = newMainDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.CONSTRAINT__MAIN_DESCRIPTION, oldMainDescription, mainDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.CONSTRAINT__MAIN_DESCRIPTION:
-				return getMainDescription();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.CONSTRAINT__MAIN_DESCRIPTION:
-				setMainDescription((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONSTRAINT__MAIN_DESCRIPTION:
-				setMainDescription(MAIN_DESCRIPTION_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONSTRAINT__MAIN_DESCRIPTION:
-				return MAIN_DESCRIPTION_EDEFAULT == null ? mainDescription != null : !MAIN_DESCRIPTION_EDEFAULT.equals(mainDescription);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (mainDescription: ");
-		result.append(mainDescription);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConstraintImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentCategoryImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentCategoryImpl.java
deleted file mode 100644
index 85257d8..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentCategoryImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentCategoryImpl.java,v 1.1 2008/01/15 08:51:35 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.ContentCategory;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Category</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ContentCategoryImpl extends ContentElementImpl implements ContentCategory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentCategoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_CATEGORY;
-	}
-
-} //ContentCategoryImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentCategoryPackageImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentCategoryPackageImpl.java
deleted file mode 100644
index 1ac4e23..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentCategoryPackageImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentCategoryPackageImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.ContentCategoryPackage;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Category Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentCategoryPackageImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentCategoryPackageImpl#getContentCategory <em>Content Category</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContentCategoryPackageImpl extends MethodPackageImpl implements ContentCategoryPackage {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentCategoryPackageImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_CATEGORY_PACKAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.CONTENT_CATEGORY_PACKAGE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getContentCategory() {
-		return getGroup2().list(UmaPackage.Literals.CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY:
-				return ((InternalEList)getContentCategory()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY:
-				return getContentCategory();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY:
-				getContentCategory().clear();
-				getContentCategory().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY:
-				getContentCategory().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY:
-				return !getContentCategory().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ContentCategoryPackageImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentDescriptionImpl.java
deleted file mode 100644
index e241a6d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentDescriptionImpl.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.ContentDescription;
-import org.eclipse.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl#getMainDescription <em>Main Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl#getKeyConsiderations <em>Key Considerations</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl#getSection <em>Section</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentDescriptionImpl#getExternalId <em>External Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContentDescriptionImpl extends MethodUnitImpl implements ContentDescription {
-	/**
-	 * The default value of the '{@link #getMainDescription() <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMainDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String MAIN_DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMainDescription() <em>Main Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMainDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String mainDescription = MAIN_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getKeyConsiderations() <em>Key Considerations</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKeyConsiderations()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String KEY_CONSIDERATIONS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getKeyConsiderations() <em>Key Considerations</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKeyConsiderations()
-	 * @generated
-	 * @ordered
-	 */
-	protected String keyConsiderations = KEY_CONSIDERATIONS_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getSection() <em>Section</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSection()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList section;
-
-	/**
-	 * The default value of the '{@link #getExternalId() <em>External Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String EXTERNAL_ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getExternalId() <em>External Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String externalId = EXTERNAL_ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getMainDescription() {
-		return mainDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMainDescription(String newMainDescription) {
-		String oldMainDescription = mainDescription;
-		mainDescription = newMainDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION, oldMainDescription, mainDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getKeyConsiderations() {
-		return keyConsiderations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKeyConsiderations(String newKeyConsiderations) {
-		String oldKeyConsiderations = keyConsiderations;
-		keyConsiderations = newKeyConsiderations;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS, oldKeyConsiderations, keyConsiderations));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSection() {
-		if (section == null) {
-			section = new EObjectContainmentEList(Section.class, this, UmaPackage.CONTENT_DESCRIPTION__SECTION);
-		}
-		return section;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getExternalId() {
-		return externalId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalId(String newExternalId) {
-		String oldExternalId = externalId;
-		externalId = newExternalId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID, oldExternalId, externalId));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_DESCRIPTION__SECTION:
-				return ((InternalEList)getSection()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-				return getMainDescription();
-			case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-				return getKeyConsiderations();
-			case UmaPackage.CONTENT_DESCRIPTION__SECTION:
-				return getSection();
-			case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-				return getExternalId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-				setMainDescription((String)newValue);
-				return;
-			case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-				setKeyConsiderations((String)newValue);
-				return;
-			case UmaPackage.CONTENT_DESCRIPTION__SECTION:
-				getSection().clear();
-				getSection().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-				setExternalId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-				setMainDescription(MAIN_DESCRIPTION_EDEFAULT);
-				return;
-			case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-				setKeyConsiderations(KEY_CONSIDERATIONS_EDEFAULT);
-				return;
-			case UmaPackage.CONTENT_DESCRIPTION__SECTION:
-				getSection().clear();
-				return;
-			case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-				setExternalId(EXTERNAL_ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_DESCRIPTION__MAIN_DESCRIPTION:
-				return MAIN_DESCRIPTION_EDEFAULT == null ? mainDescription != null : !MAIN_DESCRIPTION_EDEFAULT.equals(mainDescription);
-			case UmaPackage.CONTENT_DESCRIPTION__KEY_CONSIDERATIONS:
-				return KEY_CONSIDERATIONS_EDEFAULT == null ? keyConsiderations != null : !KEY_CONSIDERATIONS_EDEFAULT.equals(keyConsiderations);
-			case UmaPackage.CONTENT_DESCRIPTION__SECTION:
-				return section != null && !section.isEmpty();
-			case UmaPackage.CONTENT_DESCRIPTION__EXTERNAL_ID:
-				return EXTERNAL_ID_EDEFAULT == null ? externalId != null : !EXTERNAL_ID_EDEFAULT.equals(externalId);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (mainDescription: ");
-		result.append(mainDescription);
-		result.append(", keyConsiderations: ");
-		result.append(keyConsiderations);
-		result.append(", externalId: ");
-		result.append(externalId);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ContentDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentElementImpl.java
deleted file mode 100644
index 254dcc2..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentElementImpl.java
+++ /dev/null
@@ -1,450 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.ContentElement;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.VariabilityType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getChecklist <em>Checklist</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getConcept <em>Concept</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getExample <em>Example</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getGuideline <em>Guideline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getReusableAsset <em>Reusable Asset</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getSupportingMaterial <em>Supporting Material</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getWhitepaper <em>Whitepaper</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentElementImpl#getVariabilityType <em>Variability Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContentElementImpl extends DescribableElementImpl implements ContentElement {
-	/**
-	 * The cached value of the '{@link #getGroup1() <em>Group1</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup1()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group1;
-
-	/**
-	 * The default value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VARIABILITY_BASED_ON_ELEMENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected String variabilityBasedOnElement = VARIABILITY_BASED_ON_ELEMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final VariabilityType VARIABILITY_TYPE_EDEFAULT = VariabilityType.NA_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityType variabilityType = VARIABILITY_TYPE_EDEFAULT;
-
-	/**
-	 * This is true if the Variability Type attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean variabilityTypeESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup1() {
-		if (group1 == null) {
-			group1 = new BasicFeatureMap(this, UmaPackage.CONTENT_ELEMENT__GROUP1);
-		}
-		return group1;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getChecklist() {
-		return getGroup1().list(UmaPackage.Literals.CONTENT_ELEMENT__CHECKLIST);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getConcept() {
-		return getGroup1().list(UmaPackage.Literals.CONTENT_ELEMENT__CONCEPT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExample() {
-		return getGroup1().list(UmaPackage.Literals.CONTENT_ELEMENT__EXAMPLE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getGuideline() {
-		return getGroup1().list(UmaPackage.Literals.CONTENT_ELEMENT__GUIDELINE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReusableAsset() {
-		return getGroup1().list(UmaPackage.Literals.CONTENT_ELEMENT__REUSABLE_ASSET);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSupportingMaterial() {
-		return getGroup1().list(UmaPackage.Literals.CONTENT_ELEMENT__SUPPORTING_MATERIAL);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getWhitepaper() {
-		return getGroup1().list(UmaPackage.Literals.CONTENT_ELEMENT__WHITEPAPER);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVariabilityBasedOnElement() {
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityBasedOnElement(String newVariabilityBasedOnElement) {
-		String oldVariabilityBasedOnElement = variabilityBasedOnElement;
-		variabilityBasedOnElement = newVariabilityBasedOnElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT, oldVariabilityBasedOnElement, variabilityBasedOnElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType getVariabilityType() {
-		return variabilityType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityType(VariabilityType newVariabilityType) {
-		VariabilityType oldVariabilityType = variabilityType;
-		variabilityType = newVariabilityType == null ? VARIABILITY_TYPE_EDEFAULT : newVariabilityType;
-		boolean oldVariabilityTypeESet = variabilityTypeESet;
-		variabilityTypeESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE, oldVariabilityType, variabilityType, !oldVariabilityTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetVariabilityType() {
-		VariabilityType oldVariabilityType = variabilityType;
-		boolean oldVariabilityTypeESet = variabilityTypeESet;
-		variabilityType = VARIABILITY_TYPE_EDEFAULT;
-		variabilityTypeESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE, oldVariabilityType, VARIABILITY_TYPE_EDEFAULT, oldVariabilityTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetVariabilityType() {
-		return variabilityTypeESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_ELEMENT__GROUP1:
-				return ((InternalEList)getGroup1()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_ELEMENT__GROUP1:
-				if (coreType) return getGroup1();
-				return ((FeatureMap.Internal)getGroup1()).getWrapper();
-			case UmaPackage.CONTENT_ELEMENT__CHECKLIST:
-				return getChecklist();
-			case UmaPackage.CONTENT_ELEMENT__CONCEPT:
-				return getConcept();
-			case UmaPackage.CONTENT_ELEMENT__EXAMPLE:
-				return getExample();
-			case UmaPackage.CONTENT_ELEMENT__GUIDELINE:
-				return getGuideline();
-			case UmaPackage.CONTENT_ELEMENT__REUSABLE_ASSET:
-				return getReusableAsset();
-			case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIAL:
-				return getSupportingMaterial();
-			case UmaPackage.CONTENT_ELEMENT__WHITEPAPER:
-				return getWhitepaper();
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-				return getVariabilityBasedOnElement();
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-				return getVariabilityType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_ELEMENT__GROUP1:
-				((FeatureMap.Internal)getGroup1()).set(newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__CHECKLIST:
-				getChecklist().clear();
-				getChecklist().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__CONCEPT:
-				getConcept().clear();
-				getConcept().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__EXAMPLE:
-				getExample().clear();
-				getExample().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__GUIDELINE:
-				getGuideline().clear();
-				getGuideline().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__REUSABLE_ASSET:
-				getReusableAsset().clear();
-				getReusableAsset().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIAL:
-				getSupportingMaterial().clear();
-				getSupportingMaterial().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__WHITEPAPER:
-				getWhitepaper().clear();
-				getWhitepaper().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-				setVariabilityBasedOnElement((String)newValue);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-				setVariabilityType((VariabilityType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_ELEMENT__GROUP1:
-				getGroup1().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__CHECKLIST:
-				getChecklist().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__CONCEPT:
-				getConcept().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__EXAMPLE:
-				getExample().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__GUIDELINE:
-				getGuideline().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__REUSABLE_ASSET:
-				getReusableAsset().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIAL:
-				getSupportingMaterial().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__WHITEPAPER:
-				getWhitepaper().clear();
-				return;
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-				setVariabilityBasedOnElement(VARIABILITY_BASED_ON_ELEMENT_EDEFAULT);
-				return;
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-				unsetVariabilityType();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_ELEMENT__GROUP1:
-				return group1 != null && !group1.isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__CHECKLIST:
-				return !getChecklist().isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__CONCEPT:
-				return !getConcept().isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__EXAMPLE:
-				return !getExample().isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__GUIDELINE:
-				return !getGuideline().isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__REUSABLE_ASSET:
-				return !getReusableAsset().isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__SUPPORTING_MATERIAL:
-				return !getSupportingMaterial().isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__WHITEPAPER:
-				return !getWhitepaper().isEmpty();
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT:
-				return VARIABILITY_BASED_ON_ELEMENT_EDEFAULT == null ? variabilityBasedOnElement != null : !VARIABILITY_BASED_ON_ELEMENT_EDEFAULT.equals(variabilityBasedOnElement);
-			case UmaPackage.CONTENT_ELEMENT__VARIABILITY_TYPE:
-				return isSetVariabilityType();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group1: ");
-		result.append(group1);
-		result.append(", variabilityBasedOnElement: ");
-		result.append(variabilityBasedOnElement);
-		result.append(", variabilityType: ");
-		if (variabilityTypeESet) result.append(variabilityType); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //ContentElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentPackageImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentPackageImpl.java
deleted file mode 100644
index 95ca5bf..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ContentPackageImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ContentPackageImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.ContentPackage;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Content Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentPackageImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ContentPackageImpl#getContentElement <em>Content Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ContentPackageImpl extends MethodPackageImpl implements ContentPackage {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ContentPackageImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CONTENT_PACKAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.CONTENT_PACKAGE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getContentElement() {
-		return getGroup2().list(UmaPackage.Literals.CONTENT_PACKAGE__CONTENT_ELEMENT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_PACKAGE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENT:
-				return ((InternalEList)getContentElement()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_PACKAGE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENT:
-				return getContentElement();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_PACKAGE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENT:
-				getContentElement().clear();
-				getContentElement().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_PACKAGE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENT:
-				getContentElement().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CONTENT_PACKAGE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENT:
-				return !getContentElement().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ContentPackageImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CustomCategoryImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CustomCategoryImpl.java
deleted file mode 100644
index 5e009ef..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/CustomCategoryImpl.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: CustomCategoryImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.CustomCategory;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Custom Category</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.CustomCategoryImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.CustomCategoryImpl#getCategorizedElement <em>Categorized Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.CustomCategoryImpl#getSubCategory <em>Sub Category</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class CustomCategoryImpl extends ContentCategoryImpl implements CustomCategory {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected CustomCategoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.CUSTOM_CATEGORY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.CUSTOM_CATEGORY__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getCategorizedElement() {
-		return getGroup2().list(UmaPackage.Literals.CUSTOM_CATEGORY__CATEGORIZED_ELEMENT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSubCategory() {
-		return getGroup2().list(UmaPackage.Literals.CUSTOM_CATEGORY__SUB_CATEGORY);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.CUSTOM_CATEGORY__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.CUSTOM_CATEGORY__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENT:
-				return getCategorizedElement();
-			case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORY:
-				return getSubCategory();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.CUSTOM_CATEGORY__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENT:
-				getCategorizedElement().clear();
-				getCategorizedElement().addAll((Collection)newValue);
-				return;
-			case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORY:
-				getSubCategory().clear();
-				getSubCategory().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CUSTOM_CATEGORY__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENT:
-				getCategorizedElement().clear();
-				return;
-			case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORY:
-				getSubCategory().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.CUSTOM_CATEGORY__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.CUSTOM_CATEGORY__CATEGORIZED_ELEMENT:
-				return !getCategorizedElement().isEmpty();
-			case UmaPackage.CUSTOM_CATEGORY__SUB_CATEGORY:
-				return !getSubCategory().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //CustomCategoryImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliverableDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliverableDescriptionImpl.java
deleted file mode 100644
index 5a29a39..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliverableDescriptionImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DeliverableDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.DeliverableDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Deliverable Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliverableDescriptionImpl#getExternalDescription <em>External Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliverableDescriptionImpl#getPackagingGuidance <em>Packaging Guidance</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliverableDescriptionImpl extends WorkProductDescriptionImpl implements DeliverableDescription {
-	/**
-	 * The default value of the '{@link #getExternalDescription() <em>External Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String EXTERNAL_DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getExternalDescription() <em>External Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String externalDescription = EXTERNAL_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPackagingGuidance() <em>Packaging Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPackagingGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PACKAGING_GUIDANCE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPackagingGuidance() <em>Packaging Guidance</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPackagingGuidance()
-	 * @generated
-	 * @ordered
-	 */
-	protected String packagingGuidance = PACKAGING_GUIDANCE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliverableDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERABLE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getExternalDescription() {
-		return externalDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalDescription(String newExternalDescription) {
-		String oldExternalDescription = externalDescription;
-		externalDescription = newExternalDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION, oldExternalDescription, externalDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPackagingGuidance() {
-		return packagingGuidance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPackagingGuidance(String newPackagingGuidance) {
-		String oldPackagingGuidance = packagingGuidance;
-		packagingGuidance = newPackagingGuidance;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE, oldPackagingGuidance, packagingGuidance));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-				return getExternalDescription();
-			case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-				return getPackagingGuidance();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-				setExternalDescription((String)newValue);
-				return;
-			case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-				setPackagingGuidance((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-				setExternalDescription(EXTERNAL_DESCRIPTION_EDEFAULT);
-				return;
-			case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-				setPackagingGuidance(PACKAGING_GUIDANCE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION:
-				return EXTERNAL_DESCRIPTION_EDEFAULT == null ? externalDescription != null : !EXTERNAL_DESCRIPTION_EDEFAULT.equals(externalDescription);
-			case UmaPackage.DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE:
-				return PACKAGING_GUIDANCE_EDEFAULT == null ? packagingGuidance != null : !PACKAGING_GUIDANCE_EDEFAULT.equals(packagingGuidance);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (externalDescription: ");
-		result.append(externalDescription);
-		result.append(", packagingGuidance: ");
-		result.append(packagingGuidance);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DeliverableDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliverableImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliverableImpl.java
deleted file mode 100644
index 1437816..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliverableImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DeliverableImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Deliverable;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Deliverable</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliverableImpl#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliverableImpl#getDeliveredWorkProduct <em>Delivered Work Product</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliverableImpl extends WorkProductImpl implements Deliverable {
-	/**
-	 * The cached value of the '{@link #getGroup3() <em>Group3</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup3()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group3;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliverableImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERABLE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup3() {
-		if (group3 == null) {
-			group3 = new BasicFeatureMap(this, UmaPackage.DELIVERABLE__GROUP3);
-		}
-		return group3;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDeliveredWorkProduct() {
-		return getGroup3().list(UmaPackage.Literals.DELIVERABLE__DELIVERED_WORK_PRODUCT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE__GROUP3:
-				return ((InternalEList)getGroup3()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE__GROUP3:
-				if (coreType) return getGroup3();
-				return ((FeatureMap.Internal)getGroup3()).getWrapper();
-			case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCT:
-				return getDeliveredWorkProduct();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE__GROUP3:
-				((FeatureMap.Internal)getGroup3()).set(newValue);
-				return;
-			case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCT:
-				getDeliveredWorkProduct().clear();
-				getDeliveredWorkProduct().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE__GROUP3:
-				getGroup3().clear();
-				return;
-			case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCT:
-				getDeliveredWorkProduct().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERABLE__GROUP3:
-				return group3 != null && !group3.isEmpty();
-			case UmaPackage.DELIVERABLE__DELIVERED_WORK_PRODUCT:
-				return !getDeliveredWorkProduct().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group3: ");
-		result.append(group3);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DeliverableImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliveryProcessDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliveryProcessDescriptionImpl.java
deleted file mode 100644
index 2ecff96..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliveryProcessDescriptionImpl.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DeliveryProcessDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.DeliveryProcessDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Delivery Process Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl#getScale <em>Scale</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl#getProjectCharacteristics <em>Project Characteristics</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl#getRiskLevel <em>Risk Level</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl#getEstimatingTechnique <em>Estimating Technique</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl#getProjectMemberExpertise <em>Project Member Expertise</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessDescriptionImpl#getTypeOfContract <em>Type Of Contract</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliveryProcessDescriptionImpl extends ProcessDescriptionImpl implements DeliveryProcessDescription {
-	/**
-	 * The default value of the '{@link #getScale() <em>Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScale()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SCALE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getScale() <em>Scale</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScale()
-	 * @generated
-	 * @ordered
-	 */
-	protected String scale = SCALE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getProjectCharacteristics() <em>Project Characteristics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectCharacteristics()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PROJECT_CHARACTERISTICS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getProjectCharacteristics() <em>Project Characteristics</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectCharacteristics()
-	 * @generated
-	 * @ordered
-	 */
-	protected String projectCharacteristics = PROJECT_CHARACTERISTICS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRiskLevel() <em>Risk Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRiskLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RISK_LEVEL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRiskLevel() <em>Risk Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRiskLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected String riskLevel = RISK_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getEstimatingTechnique() <em>Estimating Technique</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEstimatingTechnique()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ESTIMATING_TECHNIQUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getEstimatingTechnique() <em>Estimating Technique</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getEstimatingTechnique()
-	 * @generated
-	 * @ordered
-	 */
-	protected String estimatingTechnique = ESTIMATING_TECHNIQUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getProjectMemberExpertise() <em>Project Member Expertise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectMemberExpertise()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PROJECT_MEMBER_EXPERTISE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getProjectMemberExpertise() <em>Project Member Expertise</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProjectMemberExpertise()
-	 * @generated
-	 * @ordered
-	 */
-	protected String projectMemberExpertise = PROJECT_MEMBER_EXPERTISE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTypeOfContract() <em>Type Of Contract</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTypeOfContract()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TYPE_OF_CONTRACT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTypeOfContract() <em>Type Of Contract</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTypeOfContract()
-	 * @generated
-	 * @ordered
-	 */
-	protected String typeOfContract = TYPE_OF_CONTRACT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliveryProcessDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERY_PROCESS_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getScale() {
-		return scale;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setScale(String newScale) {
-		String oldScale = scale;
-		scale = newScale;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE, oldScale, scale));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getProjectCharacteristics() {
-		return projectCharacteristics;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProjectCharacteristics(String newProjectCharacteristics) {
-		String oldProjectCharacteristics = projectCharacteristics;
-		projectCharacteristics = newProjectCharacteristics;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS, oldProjectCharacteristics, projectCharacteristics));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRiskLevel() {
-		return riskLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRiskLevel(String newRiskLevel) {
-		String oldRiskLevel = riskLevel;
-		riskLevel = newRiskLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL, oldRiskLevel, riskLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getEstimatingTechnique() {
-		return estimatingTechnique;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEstimatingTechnique(String newEstimatingTechnique) {
-		String oldEstimatingTechnique = estimatingTechnique;
-		estimatingTechnique = newEstimatingTechnique;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE, oldEstimatingTechnique, estimatingTechnique));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getProjectMemberExpertise() {
-		return projectMemberExpertise;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProjectMemberExpertise(String newProjectMemberExpertise) {
-		String oldProjectMemberExpertise = projectMemberExpertise;
-		projectMemberExpertise = newProjectMemberExpertise;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE, oldProjectMemberExpertise, projectMemberExpertise));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTypeOfContract() {
-		return typeOfContract;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTypeOfContract(String newTypeOfContract) {
-		String oldTypeOfContract = typeOfContract;
-		typeOfContract = newTypeOfContract;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT, oldTypeOfContract, typeOfContract));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-				return getScale();
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-				return getProjectCharacteristics();
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-				return getRiskLevel();
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-				return getEstimatingTechnique();
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-				return getProjectMemberExpertise();
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-				return getTypeOfContract();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-				setScale((String)newValue);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-				setProjectCharacteristics((String)newValue);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-				setRiskLevel((String)newValue);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-				setEstimatingTechnique((String)newValue);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-				setProjectMemberExpertise((String)newValue);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-				setTypeOfContract((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-				setScale(SCALE_EDEFAULT);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-				setProjectCharacteristics(PROJECT_CHARACTERISTICS_EDEFAULT);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-				setRiskLevel(RISK_LEVEL_EDEFAULT);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-				setEstimatingTechnique(ESTIMATING_TECHNIQUE_EDEFAULT);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-				setProjectMemberExpertise(PROJECT_MEMBER_EXPERTISE_EDEFAULT);
-				return;
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-				setTypeOfContract(TYPE_OF_CONTRACT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__SCALE:
-				return SCALE_EDEFAULT == null ? scale != null : !SCALE_EDEFAULT.equals(scale);
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS:
-				return PROJECT_CHARACTERISTICS_EDEFAULT == null ? projectCharacteristics != null : !PROJECT_CHARACTERISTICS_EDEFAULT.equals(projectCharacteristics);
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL:
-				return RISK_LEVEL_EDEFAULT == null ? riskLevel != null : !RISK_LEVEL_EDEFAULT.equals(riskLevel);
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE:
-				return ESTIMATING_TECHNIQUE_EDEFAULT == null ? estimatingTechnique != null : !ESTIMATING_TECHNIQUE_EDEFAULT.equals(estimatingTechnique);
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE:
-				return PROJECT_MEMBER_EXPERTISE_EDEFAULT == null ? projectMemberExpertise != null : !PROJECT_MEMBER_EXPERTISE_EDEFAULT.equals(projectMemberExpertise);
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT:
-				return TYPE_OF_CONTRACT_EDEFAULT == null ? typeOfContract != null : !TYPE_OF_CONTRACT_EDEFAULT.equals(typeOfContract);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (scale: ");
-		result.append(scale);
-		result.append(", projectCharacteristics: ");
-		result.append(projectCharacteristics);
-		result.append(", riskLevel: ");
-		result.append(riskLevel);
-		result.append(", estimatingTechnique: ");
-		result.append(estimatingTechnique);
-		result.append(", projectMemberExpertise: ");
-		result.append(projectMemberExpertise);
-		result.append(", typeOfContract: ");
-		result.append(typeOfContract);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DeliveryProcessDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliveryProcessImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliveryProcessImpl.java
deleted file mode 100644
index 2f4b1e0..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DeliveryProcessImpl.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DeliveryProcessImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.DeliveryProcess;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Delivery Process</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessImpl#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessImpl#getCommunicationsMaterial <em>Communications Material</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DeliveryProcessImpl#getEducationMaterial <em>Education Material</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DeliveryProcessImpl extends ProcessImpl implements DeliveryProcess {
-	/**
-	 * The cached value of the '{@link #getGroup3() <em>Group3</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup3()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group3;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DeliveryProcessImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DELIVERY_PROCESS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup3() {
-		if (group3 == null) {
-			group3 = new BasicFeatureMap(this, UmaPackage.DELIVERY_PROCESS__GROUP3);
-		}
-		return group3;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getCommunicationsMaterial() {
-		return getGroup3().list(UmaPackage.Literals.DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEducationMaterial() {
-		return getGroup3().list(UmaPackage.Literals.DELIVERY_PROCESS__EDUCATION_MATERIAL);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS__GROUP3:
-				return ((InternalEList)getGroup3()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS__GROUP3:
-				if (coreType) return getGroup3();
-				return ((FeatureMap.Internal)getGroup3()).getWrapper();
-			case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL:
-				return getCommunicationsMaterial();
-			case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIAL:
-				return getEducationMaterial();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS__GROUP3:
-				((FeatureMap.Internal)getGroup3()).set(newValue);
-				return;
-			case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL:
-				getCommunicationsMaterial().clear();
-				getCommunicationsMaterial().addAll((Collection)newValue);
-				return;
-			case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIAL:
-				getEducationMaterial().clear();
-				getEducationMaterial().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS__GROUP3:
-				getGroup3().clear();
-				return;
-			case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL:
-				getCommunicationsMaterial().clear();
-				return;
-			case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIAL:
-				getEducationMaterial().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DELIVERY_PROCESS__GROUP3:
-				return group3 != null && !group3.isEmpty();
-			case UmaPackage.DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL:
-				return !getCommunicationsMaterial().isEmpty();
-			case UmaPackage.DELIVERY_PROCESS__EDUCATION_MATERIAL:
-				return !getEducationMaterial().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group3: ");
-		result.append(group3);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DeliveryProcessImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescribableElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescribableElementImpl.java
deleted file mode 100644
index 8ce1f69..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescribableElementImpl.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DescribableElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.epf.xml.uma.ContentDescription;
-import org.eclipse.epf.xml.uma.DescribableElement;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Describable Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DescribableElementImpl#getPresentation <em>Presentation</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DescribableElementImpl#getNodeicon <em>Nodeicon</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DescribableElementImpl#getPresentationName <em>Presentation Name</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DescribableElementImpl#getShapeicon <em>Shapeicon</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DescribableElementImpl extends MethodElementImpl implements DescribableElement {
-	/**
-	 * The cached value of the '{@link #getPresentation() <em>Presentation</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentation()
-	 * @generated
-	 * @ordered
-	 */
-	protected ContentDescription presentation;
-
-	/**
-	 * The default value of the '{@link #getNodeicon() <em>Nodeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNodeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NODEICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNodeicon() <em>Nodeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNodeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected String nodeicon = NODEICON_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPresentationName() <em>Presentation Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentationName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRESENTATION_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPresentationName() <em>Presentation Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPresentationName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String presentationName = PRESENTATION_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getShapeicon() <em>Shapeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShapeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SHAPEICON_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getShapeicon() <em>Shapeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getShapeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected String shapeicon = SHAPEICON_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescribableElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DESCRIBABLE_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentDescription getPresentation() {
-		return presentation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPresentation(ContentDescription newPresentation, NotificationChain msgs) {
-		ContentDescription oldPresentation = presentation;
-		presentation = newPresentation;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION, oldPresentation, newPresentation);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentation(ContentDescription newPresentation) {
-		if (newPresentation != presentation) {
-			NotificationChain msgs = null;
-			if (presentation != null)
-				msgs = ((InternalEObject)presentation).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION, null, msgs);
-			if (newPresentation != null)
-				msgs = ((InternalEObject)newPresentation).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION, null, msgs);
-			msgs = basicSetPresentation(newPresentation, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION, newPresentation, newPresentation));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNodeicon() {
-		return nodeicon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNodeicon(String newNodeicon) {
-		String oldNodeicon = nodeicon;
-		nodeicon = newNodeicon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DESCRIBABLE_ELEMENT__NODEICON, oldNodeicon, nodeicon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPresentationName() {
-		return presentationName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPresentationName(String newPresentationName) {
-		String oldPresentationName = presentationName;
-		presentationName = newPresentationName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME, oldPresentationName, presentationName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getShapeicon() {
-		return shapeicon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setShapeicon(String newShapeicon) {
-		String oldShapeicon = shapeicon;
-		shapeicon = newShapeicon;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON, oldShapeicon, shapeicon));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-				return basicSetPresentation(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-				return getPresentation();
-			case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-				return getNodeicon();
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-				return getPresentationName();
-			case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-				return getShapeicon();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-				setPresentation((ContentDescription)newValue);
-				return;
-			case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-				setNodeicon((String)newValue);
-				return;
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-				setPresentationName((String)newValue);
-				return;
-			case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-				setShapeicon((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-				setPresentation((ContentDescription)null);
-				return;
-			case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-				setNodeicon(NODEICON_EDEFAULT);
-				return;
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-				setPresentationName(PRESENTATION_NAME_EDEFAULT);
-				return;
-			case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-				setShapeicon(SHAPEICON_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION:
-				return presentation != null;
-			case UmaPackage.DESCRIBABLE_ELEMENT__NODEICON:
-				return NODEICON_EDEFAULT == null ? nodeicon != null : !NODEICON_EDEFAULT.equals(nodeicon);
-			case UmaPackage.DESCRIBABLE_ELEMENT__PRESENTATION_NAME:
-				return PRESENTATION_NAME_EDEFAULT == null ? presentationName != null : !PRESENTATION_NAME_EDEFAULT.equals(presentationName);
-			case UmaPackage.DESCRIBABLE_ELEMENT__SHAPEICON:
-				return SHAPEICON_EDEFAULT == null ? shapeicon != null : !SHAPEICON_EDEFAULT.equals(shapeicon);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (nodeicon: ");
-		result.append(nodeicon);
-		result.append(", presentationName: ");
-		result.append(presentationName);
-		result.append(", shapeicon: ");
-		result.append(shapeicon);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DescribableElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescriptorDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescriptorDescriptionImpl.java
deleted file mode 100644
index 2b347d6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescriptorDescriptionImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DescriptorDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.DescriptorDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Descriptor Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DescriptorDescriptionImpl#getRefinedDescription <em>Refined Description</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DescriptorDescriptionImpl extends BreakdownElementDescriptionImpl implements DescriptorDescription {
-	/**
-	 * The default value of the '{@link #getRefinedDescription() <em>Refined Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRefinedDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REFINED_DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRefinedDescription() <em>Refined Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRefinedDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String refinedDescription = REFINED_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptorDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DESCRIPTOR_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRefinedDescription() {
-		return refinedDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRefinedDescription(String newRefinedDescription) {
-		String oldRefinedDescription = refinedDescription;
-		refinedDescription = newRefinedDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION, oldRefinedDescription, refinedDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-				return getRefinedDescription();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-				setRefinedDescription((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-				setRefinedDescription(REFINED_DESCRIPTION_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION:
-				return REFINED_DESCRIPTION_EDEFAULT == null ? refinedDescription != null : !REFINED_DESCRIPTION_EDEFAULT.equals(refinedDescription);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (refinedDescription: ");
-		result.append(refinedDescription);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DescriptorDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescriptorImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescriptorImpl.java
deleted file mode 100644
index 2fd258f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DescriptorImpl.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DescriptorImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.Descriptor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DescriptorImpl#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DescriptorImpl extends BreakdownElementImpl implements Descriptor {
-	/**
-	 * The default value of the '{@link #isIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSynchronizedWithSource = IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT;
-
-	/**
-	 * This is true if the Is Synchronized With Source attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSynchronizedWithSourceESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptorImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsSynchronizedWithSource() {
-		return isSynchronizedWithSource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsSynchronizedWithSource(boolean newIsSynchronizedWithSource) {
-		boolean oldIsSynchronizedWithSource = isSynchronizedWithSource;
-		isSynchronizedWithSource = newIsSynchronizedWithSource;
-		boolean oldIsSynchronizedWithSourceESet = isSynchronizedWithSourceESet;
-		isSynchronizedWithSourceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE, oldIsSynchronizedWithSource, isSynchronizedWithSource, !oldIsSynchronizedWithSourceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsSynchronizedWithSource() {
-		boolean oldIsSynchronizedWithSource = isSynchronizedWithSource;
-		boolean oldIsSynchronizedWithSourceESet = isSynchronizedWithSourceESet;
-		isSynchronizedWithSource = IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT;
-		isSynchronizedWithSourceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE, oldIsSynchronizedWithSource, IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT, oldIsSynchronizedWithSourceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsSynchronizedWithSource() {
-		return isSynchronizedWithSourceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				return isIsSynchronizedWithSource() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				setIsSynchronizedWithSource(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				unsetIsSynchronizedWithSource();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				return isSetIsSynchronizedWithSource();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (isSynchronizedWithSource: ");
-		if (isSynchronizedWithSourceESet) result.append(isSynchronizedWithSource); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //DescriptorImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DisciplineGroupingImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DisciplineGroupingImpl.java
deleted file mode 100644
index 3ee34a7..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DisciplineGroupingImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DisciplineGroupingImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.DisciplineGrouping;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Discipline Grouping</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DisciplineGroupingImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DisciplineGroupingImpl#getDiscipline <em>Discipline</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DisciplineGroupingImpl extends ContentCategoryImpl implements DisciplineGrouping {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisciplineGroupingImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DISCIPLINE_GROUPING;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.DISCIPLINE_GROUPING__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDiscipline() {
-		return getGroup2().list(UmaPackage.Literals.DISCIPLINE_GROUPING__DISCIPLINE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE_GROUPING__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE_GROUPING__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINE:
-				return getDiscipline();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE_GROUPING__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINE:
-				getDiscipline().clear();
-				getDiscipline().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE_GROUPING__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINE:
-				getDiscipline().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE_GROUPING__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.DISCIPLINE_GROUPING__DISCIPLINE:
-				return !getDiscipline().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DisciplineGroupingImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DisciplineImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DisciplineImpl.java
deleted file mode 100644
index 0f8fece..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DisciplineImpl.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DisciplineImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Discipline;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Discipline</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DisciplineImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DisciplineImpl#getTask <em>Task</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DisciplineImpl#getSubDiscipline <em>Sub Discipline</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DisciplineImpl#getReferenceWorkflow <em>Reference Workflow</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DisciplineImpl extends ContentCategoryImpl implements Discipline {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisciplineImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DISCIPLINE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.DISCIPLINE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTask() {
-		return getGroup2().list(UmaPackage.Literals.DISCIPLINE__TASK);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSubDiscipline() {
-		return getGroup2().list(UmaPackage.Literals.DISCIPLINE__SUB_DISCIPLINE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReferenceWorkflow() {
-		return getGroup2().list(UmaPackage.Literals.DISCIPLINE__REFERENCE_WORKFLOW);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.DISCIPLINE__SUB_DISCIPLINE:
-				return ((InternalEList)getSubDiscipline()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.DISCIPLINE__TASK:
-				return getTask();
-			case UmaPackage.DISCIPLINE__SUB_DISCIPLINE:
-				return getSubDiscipline();
-			case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOW:
-				return getReferenceWorkflow();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.DISCIPLINE__TASK:
-				getTask().clear();
-				getTask().addAll((Collection)newValue);
-				return;
-			case UmaPackage.DISCIPLINE__SUB_DISCIPLINE:
-				getSubDiscipline().clear();
-				getSubDiscipline().addAll((Collection)newValue);
-				return;
-			case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOW:
-				getReferenceWorkflow().clear();
-				getReferenceWorkflow().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.DISCIPLINE__TASK:
-				getTask().clear();
-				return;
-			case UmaPackage.DISCIPLINE__SUB_DISCIPLINE:
-				getSubDiscipline().clear();
-				return;
-			case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOW:
-				getReferenceWorkflow().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DISCIPLINE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.DISCIPLINE__TASK:
-				return !getTask().isEmpty();
-			case UmaPackage.DISCIPLINE__SUB_DISCIPLINE:
-				return !getSubDiscipline().isEmpty();
-			case UmaPackage.DISCIPLINE__REFERENCE_WORKFLOW:
-				return !getReferenceWorkflow().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DisciplineImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DocumentRootImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DocumentRootImpl.java
deleted file mode 100644
index 98b9371..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DocumentRootImpl.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DocumentRootImpl.java,v 1.1 2008/01/15 08:51:35 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
-import org.eclipse.emf.ecore.sdo.impl.EDataObjectImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EcoreEMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.DocumentRoot;
-import org.eclipse.epf.xml.uma.MethodConfiguration;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl#getMethodConfiguration <em>Method Configuration</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl#getMethodLibrary <em>Method Library</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DocumentRootImpl#getMethodPlugin <em>Method Plugin</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DocumentRootImpl extends EDataObjectImpl implements DocumentRoot {
-	/**
-	 * The cached value of the '{@link #getMixed() <em>Mixed</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMixed()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap mixed;
-
-	/**
-	 * The cached value of the '{@link #getXMLNSPrefixMap() <em>XMLNS Prefix Map</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXMLNSPrefixMap()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xMLNSPrefixMap;
-
-	/**
-	 * The cached value of the '{@link #getXSISchemaLocation() <em>XSI Schema Location</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXSISchemaLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xSISchemaLocation;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DocumentRootImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DOCUMENT_ROOT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getMixed() {
-		if (mixed == null) {
-			mixed = new BasicFeatureMap(this, UmaPackage.DOCUMENT_ROOT__MIXED);
-		}
-		return mixed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXMLNSPrefixMap() {
-		if (xMLNSPrefixMap == null) {
-			xMLNSPrefixMap = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, UmaPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-		}
-		return xMLNSPrefixMap;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXSISchemaLocation() {
-		if (xSISchemaLocation == null) {
-			xSISchemaLocation = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, UmaPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-		}
-		return xSISchemaLocation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodConfiguration getMethodConfiguration() {
-		return (MethodConfiguration)getMixed().get(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_CONFIGURATION, true);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMethodConfiguration(MethodConfiguration newMethodConfiguration, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_CONFIGURATION, newMethodConfiguration, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMethodConfiguration(MethodConfiguration newMethodConfiguration) {
-		((FeatureMap.Internal)getMixed()).set(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_CONFIGURATION, newMethodConfiguration);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodLibrary getMethodLibrary() {
-		return (MethodLibrary)getMixed().get(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_LIBRARY, true);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMethodLibrary(MethodLibrary newMethodLibrary, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_LIBRARY, newMethodLibrary, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMethodLibrary(MethodLibrary newMethodLibrary) {
-		((FeatureMap.Internal)getMixed()).set(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_LIBRARY, newMethodLibrary);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodPlugin getMethodPlugin() {
-		return (MethodPlugin)getMixed().get(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_PLUGIN, true);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMethodPlugin(MethodPlugin newMethodPlugin, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_PLUGIN, newMethodPlugin, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMethodPlugin(MethodPlugin newMethodPlugin) {
-		((FeatureMap.Internal)getMixed()).set(UmaPackage.Literals.DOCUMENT_ROOT__METHOD_PLUGIN, newMethodPlugin);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.DOCUMENT_ROOT__MIXED:
-				return ((InternalEList)getMixed()).basicRemove(otherEnd, msgs);
-			case UmaPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return ((InternalEList)getXMLNSPrefixMap()).basicRemove(otherEnd, msgs);
-			case UmaPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return ((InternalEList)getXSISchemaLocation()).basicRemove(otherEnd, msgs);
-			case UmaPackage.DOCUMENT_ROOT__METHOD_CONFIGURATION:
-				return basicSetMethodConfiguration(null, msgs);
-			case UmaPackage.DOCUMENT_ROOT__METHOD_LIBRARY:
-				return basicSetMethodLibrary(null, msgs);
-			case UmaPackage.DOCUMENT_ROOT__METHOD_PLUGIN:
-				return basicSetMethodPlugin(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DOCUMENT_ROOT__MIXED:
-				if (coreType) return getMixed();
-				return ((FeatureMap.Internal)getMixed()).getWrapper();
-			case UmaPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				if (coreType) return getXMLNSPrefixMap();
-				else return getXMLNSPrefixMap().map();
-			case UmaPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				if (coreType) return getXSISchemaLocation();
-				else return getXSISchemaLocation().map();
-			case UmaPackage.DOCUMENT_ROOT__METHOD_CONFIGURATION:
-				return getMethodConfiguration();
-			case UmaPackage.DOCUMENT_ROOT__METHOD_LIBRARY:
-				return getMethodLibrary();
-			case UmaPackage.DOCUMENT_ROOT__METHOD_PLUGIN:
-				return getMethodPlugin();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DOCUMENT_ROOT__MIXED:
-				((FeatureMap.Internal)getMixed()).set(newValue);
-				return;
-			case UmaPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				((EStructuralFeature.Setting)getXMLNSPrefixMap()).set(newValue);
-				return;
-			case UmaPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				((EStructuralFeature.Setting)getXSISchemaLocation()).set(newValue);
-				return;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_CONFIGURATION:
-				setMethodConfiguration((MethodConfiguration)newValue);
-				return;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_LIBRARY:
-				setMethodLibrary((MethodLibrary)newValue);
-				return;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_PLUGIN:
-				setMethodPlugin((MethodPlugin)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DOCUMENT_ROOT__MIXED:
-				getMixed().clear();
-				return;
-			case UmaPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				getXMLNSPrefixMap().clear();
-				return;
-			case UmaPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				getXSISchemaLocation().clear();
-				return;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_CONFIGURATION:
-				setMethodConfiguration((MethodConfiguration)null);
-				return;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_LIBRARY:
-				setMethodLibrary((MethodLibrary)null);
-				return;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_PLUGIN:
-				setMethodPlugin((MethodPlugin)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DOCUMENT_ROOT__MIXED:
-				return mixed != null && !mixed.isEmpty();
-			case UmaPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return xMLNSPrefixMap != null && !xMLNSPrefixMap.isEmpty();
-			case UmaPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return xSISchemaLocation != null && !xSISchemaLocation.isEmpty();
-			case UmaPackage.DOCUMENT_ROOT__METHOD_CONFIGURATION:
-				return getMethodConfiguration() != null;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_LIBRARY:
-				return getMethodLibrary() != null;
-			case UmaPackage.DOCUMENT_ROOT__METHOD_PLUGIN:
-				return getMethodPlugin() != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (mixed: ");
-		result.append(mixed);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DocumentRootImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DomainImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DomainImpl.java
deleted file mode 100644
index 21c9935..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/DomainImpl.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: DomainImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Domain;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Domain</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DomainImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DomainImpl#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.DomainImpl#getSubdomain <em>Subdomain</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DomainImpl extends ContentCategoryImpl implements Domain {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DomainImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.DOMAIN;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.DOMAIN__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getWorkProduct() {
-		return getGroup2().list(UmaPackage.Literals.DOMAIN__WORK_PRODUCT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSubdomain() {
-		return getGroup2().list(UmaPackage.Literals.DOMAIN__SUBDOMAIN);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.DOMAIN__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.DOMAIN__SUBDOMAIN:
-				return ((InternalEList)getSubdomain()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.DOMAIN__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.DOMAIN__WORK_PRODUCT:
-				return getWorkProduct();
-			case UmaPackage.DOMAIN__SUBDOMAIN:
-				return getSubdomain();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.DOMAIN__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.DOMAIN__WORK_PRODUCT:
-				getWorkProduct().clear();
-				getWorkProduct().addAll((Collection)newValue);
-				return;
-			case UmaPackage.DOMAIN__SUBDOMAIN:
-				getSubdomain().clear();
-				getSubdomain().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DOMAIN__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.DOMAIN__WORK_PRODUCT:
-				getWorkProduct().clear();
-				return;
-			case UmaPackage.DOMAIN__SUBDOMAIN:
-				getSubdomain().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.DOMAIN__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.DOMAIN__WORK_PRODUCT:
-				return !getWorkProduct().isEmpty();
-			case UmaPackage.DOMAIN__SUBDOMAIN:
-				return !getSubdomain().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DomainImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ElementImpl.java
deleted file mode 100644
index 1a41798..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ElementImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.sdo.impl.EDataObjectImpl;
-import org.eclipse.epf.xml.uma.Element;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ElementImpl extends EDataObjectImpl implements Element {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ELEMENT;
-	}
-
-} //ElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimateImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimateImpl.java
deleted file mode 100644
index be61874..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimateImpl.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EstimateImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Estimate;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Estimate</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.EstimateImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.EstimateImpl#getEstimationMetric <em>Estimation Metric</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.EstimateImpl#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class EstimateImpl extends GuidanceImpl implements Estimate {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EstimateImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ESTIMATE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.ESTIMATE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEstimationMetric() {
-		return getGroup2().list(UmaPackage.Literals.ESTIMATE__ESTIMATION_METRIC);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEstimationConsiderations() {
-		return getGroup2().list(UmaPackage.Literals.ESTIMATE__ESTIMATION_CONSIDERATIONS);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.ESTIMATE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ESTIMATE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.ESTIMATE__ESTIMATION_METRIC:
-				return getEstimationMetric();
-			case UmaPackage.ESTIMATE__ESTIMATION_CONSIDERATIONS:
-				return getEstimationConsiderations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ESTIMATE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.ESTIMATE__ESTIMATION_METRIC:
-				getEstimationMetric().clear();
-				getEstimationMetric().addAll((Collection)newValue);
-				return;
-			case UmaPackage.ESTIMATE__ESTIMATION_CONSIDERATIONS:
-				getEstimationConsiderations().clear();
-				getEstimationConsiderations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ESTIMATE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.ESTIMATE__ESTIMATION_METRIC:
-				getEstimationMetric().clear();
-				return;
-			case UmaPackage.ESTIMATE__ESTIMATION_CONSIDERATIONS:
-				getEstimationConsiderations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ESTIMATE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.ESTIMATE__ESTIMATION_METRIC:
-				return !getEstimationMetric().isEmpty();
-			case UmaPackage.ESTIMATE__ESTIMATION_CONSIDERATIONS:
-				return !getEstimationConsiderations().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //EstimateImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimatingMetricImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimatingMetricImpl.java
deleted file mode 100644
index 5972ca7..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimatingMetricImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EstimatingMetricImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.EstimatingMetric;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Estimating Metric</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class EstimatingMetricImpl extends GuidanceImpl implements EstimatingMetric {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EstimatingMetricImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ESTIMATING_METRIC;
-	}
-
-} //EstimatingMetricImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimationConsiderationsImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimationConsiderationsImpl.java
deleted file mode 100644
index ffc9d51..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/EstimationConsiderationsImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: EstimationConsiderationsImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.EstimationConsiderations;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Estimation Considerations</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class EstimationConsiderationsImpl extends GuidanceImpl implements EstimationConsiderations {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EstimationConsiderationsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ESTIMATION_CONSIDERATIONS;
-	}
-
-} //EstimationConsiderationsImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ExampleImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ExampleImpl.java
deleted file mode 100644
index a8af3b9..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ExampleImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ExampleImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Example;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Example</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ExampleImpl extends GuidanceImpl implements Example {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExampleImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.EXAMPLE;
-	}
-
-} //ExampleImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidanceDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidanceDescriptionImpl.java
deleted file mode 100644
index 56329ed..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidanceDescriptionImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: GuidanceDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.GuidanceDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Guidance Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.GuidanceDescriptionImpl#getAttachment <em>Attachment</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class GuidanceDescriptionImpl extends ContentDescriptionImpl implements GuidanceDescription {
-	/**
-	 * The default value of the '{@link #getAttachment() <em>Attachment</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttachment()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ATTACHMENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAttachment() <em>Attachment</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttachment()
-	 * @generated
-	 * @ordered
-	 */
-	protected String attachment = ATTACHMENT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidanceDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GUIDANCE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAttachment() {
-		return attachment;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttachment(String newAttachment) {
-		String oldAttachment = attachment;
-		attachment = newAttachment;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENT, oldAttachment, attachment));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENT:
-				return getAttachment();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENT:
-				setAttachment((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENT:
-				setAttachment(ATTACHMENT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.GUIDANCE_DESCRIPTION__ATTACHMENT:
-				return ATTACHMENT_EDEFAULT == null ? attachment != null : !ATTACHMENT_EDEFAULT.equals(attachment);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (attachment: ");
-		result.append(attachment);
-		result.append(')');
-		return result.toString();
-	}
-
-} //GuidanceDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidanceImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidanceImpl.java
deleted file mode 100644
index 145e66a..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidanceImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: GuidanceImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Guidance;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Guidance</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class GuidanceImpl extends ContentElementImpl implements Guidance {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidanceImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GUIDANCE;
-	}
-
-} //GuidanceImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidelineImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidelineImpl.java
deleted file mode 100644
index 926a980..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/GuidelineImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: GuidelineImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Guideline;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Guideline</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class GuidelineImpl extends GuidanceImpl implements Guideline {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected GuidelineImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.GUIDELINE;
-	}
-
-} //GuidelineImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/IterationImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/IterationImpl.java
deleted file mode 100644
index c86dcf6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/IterationImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: IterationImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Iteration;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Iteration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class IterationImpl extends ActivityImpl implements Iteration {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IterationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ITERATION;
-	}
-
-} //IterationImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodConfigurationImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodConfigurationImpl.java
deleted file mode 100644
index 1ae914b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodConfigurationImpl.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodConfigurationImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.EDataTypeEList;
-
-import org.eclipse.epf.xml.uma.MethodConfiguration;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Configuration</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl#getBaseConfiguration <em>Base Configuration</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl#getMethodPluginSelection <em>Method Plugin Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl#getMethodPackageSelection <em>Method Package Selection</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl#getDefaultView <em>Default View</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl#getProcessView <em>Process View</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl#getSubtractedCategory <em>Subtracted Category</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodConfigurationImpl#getAddedCategory <em>Added Category</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodConfigurationImpl extends MethodUnitImpl implements MethodConfiguration {
-	/**
-	 * The cached value of the '{@link #getBaseConfiguration() <em>Base Configuration</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBaseConfiguration()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList baseConfiguration;
-
-	/**
-	 * The cached value of the '{@link #getMethodPluginSelection() <em>Method Plugin Selection</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPluginSelection()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPluginSelection;
-
-	/**
-	 * The cached value of the '{@link #getMethodPackageSelection() <em>Method Package Selection</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPackageSelection()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPackageSelection;
-
-	/**
-	 * The default value of the '{@link #getDefaultView() <em>Default View</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultView()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DEFAULT_VIEW_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultView() <em>Default View</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultView()
-	 * @generated
-	 * @ordered
-	 */
-	protected String defaultView = DEFAULT_VIEW_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getProcessView() <em>Process View</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProcessView()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList processView;
-
-	/**
-	 * The cached value of the '{@link #getSubtractedCategory() <em>Subtracted Category</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubtractedCategory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList subtractedCategory;
-
-	/**
-	 * The cached value of the '{@link #getAddedCategory() <em>Added Category</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAddedCategory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList addedCategory;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodConfigurationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_CONFIGURATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBaseConfiguration() {
-		if (baseConfiguration == null) {
-			baseConfiguration = new EDataTypeEList(String.class, this, UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATION);
-		}
-		return baseConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMethodPluginSelection() {
-		if (methodPluginSelection == null) {
-			methodPluginSelection = new EDataTypeEList(String.class, this, UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION);
-		}
-		return methodPluginSelection;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMethodPackageSelection() {
-		if (methodPackageSelection == null) {
-			methodPackageSelection = new EDataTypeEList(String.class, this, UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION);
-		}
-		return methodPackageSelection;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDefaultView() {
-		return defaultView;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultView(String newDefaultView) {
-		String oldDefaultView = defaultView;
-		defaultView = newDefaultView;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW, oldDefaultView, defaultView));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProcessView() {
-		if (processView == null) {
-			processView = new EDataTypeEList(String.class, this, UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEW);
-		}
-		return processView;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSubtractedCategory() {
-		if (subtractedCategory == null) {
-			subtractedCategory = new EDataTypeEList(String.class, this, UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY);
-		}
-		return subtractedCategory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAddedCategory() {
-		if (addedCategory == null) {
-			addedCategory = new EDataTypeEList(String.class, this, UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY);
-		}
-		return addedCategory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATION:
-				return getBaseConfiguration();
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-				return getMethodPluginSelection();
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-				return getMethodPackageSelection();
-			case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-				return getDefaultView();
-			case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEW:
-				return getProcessView();
-			case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-				return getSubtractedCategory();
-			case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-				return getAddedCategory();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATION:
-				getBaseConfiguration().clear();
-				getBaseConfiguration().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-				getMethodPluginSelection().clear();
-				getMethodPluginSelection().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-				getMethodPackageSelection().clear();
-				getMethodPackageSelection().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-				setDefaultView((String)newValue);
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEW:
-				getProcessView().clear();
-				getProcessView().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-				getSubtractedCategory().clear();
-				getSubtractedCategory().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-				getAddedCategory().clear();
-				getAddedCategory().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATION:
-				getBaseConfiguration().clear();
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-				getMethodPluginSelection().clear();
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-				getMethodPackageSelection().clear();
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-				setDefaultView(DEFAULT_VIEW_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEW:
-				getProcessView().clear();
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-				getSubtractedCategory().clear();
-				return;
-			case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-				getAddedCategory().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_CONFIGURATION__BASE_CONFIGURATION:
-				return baseConfiguration != null && !baseConfiguration.isEmpty();
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
-				return methodPluginSelection != null && !methodPluginSelection.isEmpty();
-			case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
-				return methodPackageSelection != null && !methodPackageSelection.isEmpty();
-			case UmaPackage.METHOD_CONFIGURATION__DEFAULT_VIEW:
-				return DEFAULT_VIEW_EDEFAULT == null ? defaultView != null : !DEFAULT_VIEW_EDEFAULT.equals(defaultView);
-			case UmaPackage.METHOD_CONFIGURATION__PROCESS_VIEW:
-				return processView != null && !processView.isEmpty();
-			case UmaPackage.METHOD_CONFIGURATION__SUBTRACTED_CATEGORY:
-				return subtractedCategory != null && !subtractedCategory.isEmpty();
-			case UmaPackage.METHOD_CONFIGURATION__ADDED_CATEGORY:
-				return addedCategory != null && !addedCategory.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (baseConfiguration: ");
-		result.append(baseConfiguration);
-		result.append(", methodPluginSelection: ");
-		result.append(methodPluginSelection);
-		result.append(", methodPackageSelection: ");
-		result.append(methodPackageSelection);
-		result.append(", defaultView: ");
-		result.append(defaultView);
-		result.append(", processView: ");
-		result.append(processView);
-		result.append(", subtractedCategory: ");
-		result.append(subtractedCategory);
-		result.append(", addedCategory: ");
-		result.append(addedCategory);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodConfigurationImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodElementImpl.java
deleted file mode 100644
index b4dd9eb..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodElementImpl.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.MethodElement;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl#getGroup <em>Group</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl#getOwnedRule <em>Owned Rule</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl#getMethodElementProperty <em>Method Element Property</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl#getBriefDescription <em>Brief Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl#getOrderingGuide <em>Ordering Guide</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementImpl#isSuppressed <em>Suppressed</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodElementImpl extends PackageableElementImpl implements MethodElement {
-	/**
-	 * The cached value of the '{@link #getGroup() <em>Group</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group;
-
-	/**
-	 * The default value of the '{@link #getBriefDescription() <em>Brief Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BRIEF_DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBriefDescription() <em>Brief Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBriefDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String briefDescription = BRIEF_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getOrderingGuide() <em>Ordering Guide</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOrderingGuide()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ORDERING_GUIDE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getOrderingGuide() <em>Ordering Guide</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOrderingGuide()
-	 * @generated
-	 * @ordered
-	 */
-	protected String orderingGuide = ORDERING_GUIDE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isSuppressed() <em>Suppressed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSuppressed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SUPPRESSED_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isSuppressed() <em>Suppressed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSuppressed()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean suppressed = SUPPRESSED_EDEFAULT;
-
-	/**
-	 * This is true if the Suppressed attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean suppressedESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup() {
-		if (group == null) {
-			group = new BasicFeatureMap(this, UmaPackage.METHOD_ELEMENT__GROUP);
-		}
-		return group;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOwnedRule() {
-		return getGroup().list(UmaPackage.Literals.METHOD_ELEMENT__OWNED_RULE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMethodElementProperty() {
-		return getGroup().list(UmaPackage.Literals.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBriefDescription() {
-		return briefDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBriefDescription(String newBriefDescription) {
-		String oldBriefDescription = briefDescription;
-		briefDescription = newBriefDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION, oldBriefDescription, briefDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_ELEMENT__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getOrderingGuide() {
-		return orderingGuide;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOrderingGuide(String newOrderingGuide) {
-		String oldOrderingGuide = orderingGuide;
-		orderingGuide = newOrderingGuide;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE, oldOrderingGuide, orderingGuide));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSuppressed() {
-		return suppressed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuppressed(boolean newSuppressed) {
-		boolean oldSuppressed = suppressed;
-		suppressed = newSuppressed;
-		boolean oldSuppressedESet = suppressedESet;
-		suppressedESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_ELEMENT__SUPPRESSED, oldSuppressed, suppressed, !oldSuppressedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetSuppressed() {
-		boolean oldSuppressed = suppressed;
-		boolean oldSuppressedESet = suppressedESet;
-		suppressed = SUPPRESSED_EDEFAULT;
-		suppressedESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.METHOD_ELEMENT__SUPPRESSED, oldSuppressed, SUPPRESSED_EDEFAULT, oldSuppressedESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetSuppressed() {
-		return suppressedESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT__GROUP:
-				return ((InternalEList)getGroup()).basicRemove(otherEnd, msgs);
-			case UmaPackage.METHOD_ELEMENT__OWNED_RULE:
-				return ((InternalEList)getOwnedRule()).basicRemove(otherEnd, msgs);
-			case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-				return ((InternalEList)getMethodElementProperty()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT__GROUP:
-				if (coreType) return getGroup();
-				return ((FeatureMap.Internal)getGroup()).getWrapper();
-			case UmaPackage.METHOD_ELEMENT__OWNED_RULE:
-				return getOwnedRule();
-			case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-				return getMethodElementProperty();
-			case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-				return getBriefDescription();
-			case UmaPackage.METHOD_ELEMENT__ID:
-				return getId();
-			case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-				return getOrderingGuide();
-			case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-				return isSuppressed() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT__GROUP:
-				((FeatureMap.Internal)getGroup()).set(newValue);
-				return;
-			case UmaPackage.METHOD_ELEMENT__OWNED_RULE:
-				getOwnedRule().clear();
-				getOwnedRule().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-				getMethodElementProperty().clear();
-				getMethodElementProperty().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-				setBriefDescription((String)newValue);
-				return;
-			case UmaPackage.METHOD_ELEMENT__ID:
-				setId((String)newValue);
-				return;
-			case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-				setOrderingGuide((String)newValue);
-				return;
-			case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-				setSuppressed(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT__GROUP:
-				getGroup().clear();
-				return;
-			case UmaPackage.METHOD_ELEMENT__OWNED_RULE:
-				getOwnedRule().clear();
-				return;
-			case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-				getMethodElementProperty().clear();
-				return;
-			case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-				setBriefDescription(BRIEF_DESCRIPTION_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_ELEMENT__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-				setOrderingGuide(ORDERING_GUIDE_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-				unsetSuppressed();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT__GROUP:
-				return group != null && !group.isEmpty();
-			case UmaPackage.METHOD_ELEMENT__OWNED_RULE:
-				return !getOwnedRule().isEmpty();
-			case UmaPackage.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY:
-				return !getMethodElementProperty().isEmpty();
-			case UmaPackage.METHOD_ELEMENT__BRIEF_DESCRIPTION:
-				return BRIEF_DESCRIPTION_EDEFAULT == null ? briefDescription != null : !BRIEF_DESCRIPTION_EDEFAULT.equals(briefDescription);
-			case UmaPackage.METHOD_ELEMENT__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case UmaPackage.METHOD_ELEMENT__ORDERING_GUIDE:
-				return ORDERING_GUIDE_EDEFAULT == null ? orderingGuide != null : !ORDERING_GUIDE_EDEFAULT.equals(orderingGuide);
-			case UmaPackage.METHOD_ELEMENT__SUPPRESSED:
-				return isSetSuppressed();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group: ");
-		result.append(group);
-		result.append(", briefDescription: ");
-		result.append(briefDescription);
-		result.append(", id: ");
-		result.append(id);
-		result.append(", orderingGuide: ");
-		result.append(orderingGuide);
-		result.append(", suppressed: ");
-		if (suppressedESet) result.append(suppressed); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodElementPropertyImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodElementPropertyImpl.java
deleted file mode 100644
index 24d43e3..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodElementPropertyImpl.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodElementPropertyImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.epf.xml.uma.MethodElementProperty;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Element Property</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodElementPropertyImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodElementPropertyImpl extends PackageableElementImpl implements MethodElementProperty {
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodElementPropertyImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_ELEMENT_PROPERTY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_ELEMENT_PROPERTY__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (value: ");
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodElementPropertyImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodLibraryImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodLibraryImpl.java
deleted file mode 100644
index bceb26d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodLibraryImpl.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodLibraryImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.MethodConfiguration;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Library</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodLibraryImpl#getMethodPlugin <em>Method Plugin</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodLibraryImpl#getMethodConfiguration <em>Method Configuration</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodLibraryImpl#getTool <em>Tool</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodLibraryImpl extends MethodUnitImpl implements MethodLibrary {
-	/**
-	 * The cached value of the '{@link #getMethodPlugin() <em>Method Plugin</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPlugin()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPlugin;
-
-	/**
-	 * The cached value of the '{@link #getMethodConfiguration() <em>Method Configuration</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodConfiguration()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodConfiguration;
-
-	/**
-	 * The default value of the '{@link #getTool() <em>Tool</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTool()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TOOL_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTool() <em>Tool</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTool()
-	 * @generated
-	 * @ordered
-	 */
-	protected String tool = TOOL_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodLibraryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_LIBRARY;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMethodPlugin() {
-		if (methodPlugin == null) {
-			methodPlugin = new EObjectContainmentEList(MethodPlugin.class, this, UmaPackage.METHOD_LIBRARY__METHOD_PLUGIN);
-		}
-		return methodPlugin;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMethodConfiguration() {
-		if (methodConfiguration == null) {
-			methodConfiguration = new EObjectContainmentEList(MethodConfiguration.class, this, UmaPackage.METHOD_LIBRARY__METHOD_CONFIGURATION);
-		}
-		return methodConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTool() {
-		return tool;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTool(String newTool) {
-		String oldTool = tool;
-		tool = newTool;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_LIBRARY__TOOL, oldTool, tool));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.METHOD_LIBRARY__METHOD_PLUGIN:
-				return ((InternalEList)getMethodPlugin()).basicRemove(otherEnd, msgs);
-			case UmaPackage.METHOD_LIBRARY__METHOD_CONFIGURATION:
-				return ((InternalEList)getMethodConfiguration()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.METHOD_LIBRARY__METHOD_PLUGIN:
-				return getMethodPlugin();
-			case UmaPackage.METHOD_LIBRARY__METHOD_CONFIGURATION:
-				return getMethodConfiguration();
-			case UmaPackage.METHOD_LIBRARY__TOOL:
-				return getTool();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.METHOD_LIBRARY__METHOD_PLUGIN:
-				getMethodPlugin().clear();
-				getMethodPlugin().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_LIBRARY__METHOD_CONFIGURATION:
-				getMethodConfiguration().clear();
-				getMethodConfiguration().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_LIBRARY__TOOL:
-				setTool((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_LIBRARY__METHOD_PLUGIN:
-				getMethodPlugin().clear();
-				return;
-			case UmaPackage.METHOD_LIBRARY__METHOD_CONFIGURATION:
-				getMethodConfiguration().clear();
-				return;
-			case UmaPackage.METHOD_LIBRARY__TOOL:
-				setTool(TOOL_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_LIBRARY__METHOD_PLUGIN:
-				return methodPlugin != null && !methodPlugin.isEmpty();
-			case UmaPackage.METHOD_LIBRARY__METHOD_CONFIGURATION:
-				return methodConfiguration != null && !methodConfiguration.isEmpty();
-			case UmaPackage.METHOD_LIBRARY__TOOL:
-				return TOOL_EDEFAULT == null ? tool != null : !TOOL_EDEFAULT.equals(tool);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (tool: ");
-		result.append(tool);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodLibraryImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodPackageImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodPackageImpl.java
deleted file mode 100644
index 42ab07b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodPackageImpl.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodPackageImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodPackageImpl#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodPackageImpl#getReusedPackage <em>Reused Package</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodPackageImpl#getMethodPackage <em>Method Package</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodPackageImpl#isGlobal <em>Global</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodPackageImpl extends MethodElementImpl implements MethodPackage {
-	/**
-	 * The cached value of the '{@link #getGroup1() <em>Group1</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup1()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group1;
-
-	/**
-	 * The default value of the '{@link #isGlobal() <em>Global</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isGlobal()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean GLOBAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isGlobal() <em>Global</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isGlobal()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean global = GLOBAL_EDEFAULT;
-
-	/**
-	 * This is true if the Global attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean globalESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodPackageImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_PACKAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup1() {
-		if (group1 == null) {
-			group1 = new BasicFeatureMap(this, UmaPackage.METHOD_PACKAGE__GROUP1);
-		}
-		return group1;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReusedPackage() {
-		return getGroup1().list(UmaPackage.Literals.METHOD_PACKAGE__REUSED_PACKAGE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMethodPackage() {
-		return getGroup1().list(UmaPackage.Literals.METHOD_PACKAGE__METHOD_PACKAGE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isGlobal() {
-		return global;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGlobal(boolean newGlobal) {
-		boolean oldGlobal = global;
-		global = newGlobal;
-		boolean oldGlobalESet = globalESet;
-		globalESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_PACKAGE__GLOBAL, oldGlobal, global, !oldGlobalESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetGlobal() {
-		boolean oldGlobal = global;
-		boolean oldGlobalESet = globalESet;
-		global = GLOBAL_EDEFAULT;
-		globalESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.METHOD_PACKAGE__GLOBAL, oldGlobal, GLOBAL_EDEFAULT, oldGlobalESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetGlobal() {
-		return globalESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PACKAGE__GROUP1:
-				return ((InternalEList)getGroup1()).basicRemove(otherEnd, msgs);
-			case UmaPackage.METHOD_PACKAGE__METHOD_PACKAGE:
-				return ((InternalEList)getMethodPackage()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PACKAGE__GROUP1:
-				if (coreType) return getGroup1();
-				return ((FeatureMap.Internal)getGroup1()).getWrapper();
-			case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGE:
-				return getReusedPackage();
-			case UmaPackage.METHOD_PACKAGE__METHOD_PACKAGE:
-				return getMethodPackage();
-			case UmaPackage.METHOD_PACKAGE__GLOBAL:
-				return isGlobal() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PACKAGE__GROUP1:
-				((FeatureMap.Internal)getGroup1()).set(newValue);
-				return;
-			case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGE:
-				getReusedPackage().clear();
-				getReusedPackage().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_PACKAGE__METHOD_PACKAGE:
-				getMethodPackage().clear();
-				getMethodPackage().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_PACKAGE__GLOBAL:
-				setGlobal(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PACKAGE__GROUP1:
-				getGroup1().clear();
-				return;
-			case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGE:
-				getReusedPackage().clear();
-				return;
-			case UmaPackage.METHOD_PACKAGE__METHOD_PACKAGE:
-				getMethodPackage().clear();
-				return;
-			case UmaPackage.METHOD_PACKAGE__GLOBAL:
-				unsetGlobal();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PACKAGE__GROUP1:
-				return group1 != null && !group1.isEmpty();
-			case UmaPackage.METHOD_PACKAGE__REUSED_PACKAGE:
-				return !getReusedPackage().isEmpty();
-			case UmaPackage.METHOD_PACKAGE__METHOD_PACKAGE:
-				return !getMethodPackage().isEmpty();
-			case UmaPackage.METHOD_PACKAGE__GLOBAL:
-				return isSetGlobal();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group1: ");
-		result.append(group1);
-		result.append(", global: ");
-		if (globalESet) result.append(global); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodPackageImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodPluginImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodPluginImpl.java
deleted file mode 100644
index aaceb7d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodPluginImpl.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodPluginImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.EDataTypeEList;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Plugin</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodPluginImpl#getReferencedMethodPlugin <em>Referenced Method Plugin</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodPluginImpl#getMethodPackage <em>Method Package</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodPluginImpl#isUserChangeable <em>User Changeable</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodPluginImpl extends MethodUnitImpl implements MethodPlugin {
-	/**
-	 * The cached value of the '{@link #getReferencedMethodPlugin() <em>Referenced Method Plugin</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedMethodPlugin()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList referencedMethodPlugin;
-
-	/**
-	 * The cached value of the '{@link #getMethodPackage() <em>Method Package</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMethodPackage()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList methodPackage;
-
-	/**
-	 * The default value of the '{@link #isUserChangeable() <em>User Changeable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isUserChangeable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean USER_CHANGEABLE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isUserChangeable() <em>User Changeable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isUserChangeable()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean userChangeable = USER_CHANGEABLE_EDEFAULT;
-
-	/**
-	 * This is true if the User Changeable attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean userChangeableESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodPluginImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_PLUGIN;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReferencedMethodPlugin() {
-		if (referencedMethodPlugin == null) {
-			referencedMethodPlugin = new EDataTypeEList(String.class, this, UmaPackage.METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN);
-		}
-		return referencedMethodPlugin;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMethodPackage() {
-		if (methodPackage == null) {
-			methodPackage = new EObjectContainmentEList(MethodPackage.class, this, UmaPackage.METHOD_PLUGIN__METHOD_PACKAGE);
-		}
-		return methodPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isUserChangeable() {
-		return userChangeable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUserChangeable(boolean newUserChangeable) {
-		boolean oldUserChangeable = userChangeable;
-		userChangeable = newUserChangeable;
-		boolean oldUserChangeableESet = userChangeableESet;
-		userChangeableESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE, oldUserChangeable, userChangeable, !oldUserChangeableESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetUserChangeable() {
-		boolean oldUserChangeable = userChangeable;
-		boolean oldUserChangeableESet = userChangeableESet;
-		userChangeable = USER_CHANGEABLE_EDEFAULT;
-		userChangeableESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE, oldUserChangeable, USER_CHANGEABLE_EDEFAULT, oldUserChangeableESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetUserChangeable() {
-		return userChangeableESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGE:
-				return ((InternalEList)getMethodPackage()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN:
-				return getReferencedMethodPlugin();
-			case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGE:
-				return getMethodPackage();
-			case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-				return isUserChangeable() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN:
-				getReferencedMethodPlugin().clear();
-				getReferencedMethodPlugin().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGE:
-				getMethodPackage().clear();
-				getMethodPackage().addAll((Collection)newValue);
-				return;
-			case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-				setUserChangeable(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN:
-				getReferencedMethodPlugin().clear();
-				return;
-			case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGE:
-				getMethodPackage().clear();
-				return;
-			case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-				unsetUserChangeable();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN:
-				return referencedMethodPlugin != null && !referencedMethodPlugin.isEmpty();
-			case UmaPackage.METHOD_PLUGIN__METHOD_PACKAGE:
-				return methodPackage != null && !methodPackage.isEmpty();
-			case UmaPackage.METHOD_PLUGIN__USER_CHANGEABLE:
-				return isSetUserChangeable();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (referencedMethodPlugin: ");
-		result.append(referencedMethodPlugin);
-		result.append(", userChangeable: ");
-		if (userChangeableESet) result.append(userChangeable); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodPluginImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodUnitImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodUnitImpl.java
deleted file mode 100644
index 759b41f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MethodUnitImpl.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MethodUnitImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.MethodUnit;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Method Unit</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodUnitImpl#getCopyright <em>Copyright</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodUnitImpl#getAuthors <em>Authors</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodUnitImpl#getChangeDate <em>Change Date</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodUnitImpl#getChangeDescription <em>Change Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.MethodUnitImpl#getVersion <em>Version</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MethodUnitImpl extends MethodElementImpl implements MethodUnit {
-	/**
-	 * The default value of the '{@link #getCopyright() <em>Copyright</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCopyright()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COPYRIGHT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCopyright() <em>Copyright</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCopyright()
-	 * @generated
-	 * @ordered
-	 */
-	protected String copyright = COPYRIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String AUTHORS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected String authors = AUTHORS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CHANGE_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object changeDate = CHANGE_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CHANGE_DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String changeDescription = CHANGE_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VERSION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected String version = VERSION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MethodUnitImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.METHOD_UNIT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCopyright() {
-		return copyright;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCopyright(String newCopyright) {
-		String oldCopyright = copyright;
-		copyright = newCopyright;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_UNIT__COPYRIGHT, oldCopyright, copyright));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAuthors() {
-		return authors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAuthors(String newAuthors) {
-		String oldAuthors = authors;
-		authors = newAuthors;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_UNIT__AUTHORS, oldAuthors, authors));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getChangeDate() {
-		return changeDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDate(Object newChangeDate) {
-		Object oldChangeDate = changeDate;
-		changeDate = newChangeDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_UNIT__CHANGE_DATE, oldChangeDate, changeDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getChangeDescription() {
-		return changeDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDescription(String newChangeDescription) {
-		String oldChangeDescription = changeDescription;
-		changeDescription = newChangeDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION, oldChangeDescription, changeDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVersion(String newVersion) {
-		String oldVersion = version;
-		version = newVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.METHOD_UNIT__VERSION, oldVersion, version));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.METHOD_UNIT__COPYRIGHT:
-				return getCopyright();
-			case UmaPackage.METHOD_UNIT__AUTHORS:
-				return getAuthors();
-			case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-				return getChangeDate();
-			case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-				return getChangeDescription();
-			case UmaPackage.METHOD_UNIT__VERSION:
-				return getVersion();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.METHOD_UNIT__COPYRIGHT:
-				setCopyright((String)newValue);
-				return;
-			case UmaPackage.METHOD_UNIT__AUTHORS:
-				setAuthors((String)newValue);
-				return;
-			case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-				setChangeDate(newValue);
-				return;
-			case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-				setChangeDescription((String)newValue);
-				return;
-			case UmaPackage.METHOD_UNIT__VERSION:
-				setVersion((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_UNIT__COPYRIGHT:
-				setCopyright(COPYRIGHT_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_UNIT__AUTHORS:
-				setAuthors(AUTHORS_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-				setChangeDate(CHANGE_DATE_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-				setChangeDescription(CHANGE_DESCRIPTION_EDEFAULT);
-				return;
-			case UmaPackage.METHOD_UNIT__VERSION:
-				setVersion(VERSION_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.METHOD_UNIT__COPYRIGHT:
-				return COPYRIGHT_EDEFAULT == null ? copyright != null : !COPYRIGHT_EDEFAULT.equals(copyright);
-			case UmaPackage.METHOD_UNIT__AUTHORS:
-				return AUTHORS_EDEFAULT == null ? authors != null : !AUTHORS_EDEFAULT.equals(authors);
-			case UmaPackage.METHOD_UNIT__CHANGE_DATE:
-				return CHANGE_DATE_EDEFAULT == null ? changeDate != null : !CHANGE_DATE_EDEFAULT.equals(changeDate);
-			case UmaPackage.METHOD_UNIT__CHANGE_DESCRIPTION:
-				return CHANGE_DESCRIPTION_EDEFAULT == null ? changeDescription != null : !CHANGE_DESCRIPTION_EDEFAULT.equals(changeDescription);
-			case UmaPackage.METHOD_UNIT__VERSION:
-				return VERSION_EDEFAULT == null ? version != null : !VERSION_EDEFAULT.equals(version);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (copyright: ");
-		result.append(copyright);
-		result.append(", authors: ");
-		result.append(authors);
-		result.append(", changeDate: ");
-		result.append(changeDate);
-		result.append(", changeDescription: ");
-		result.append(changeDescription);
-		result.append(", version: ");
-		result.append(version);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MethodUnitImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MilestoneImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MilestoneImpl.java
deleted file mode 100644
index eca1e6c..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/MilestoneImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MilestoneImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Milestone;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Milestone</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class MilestoneImpl extends WorkBreakdownElementImpl implements Milestone {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MilestoneImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.MILESTONE;
-	}
-
-} //MilestoneImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/NamedElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/NamedElementImpl.java
deleted file mode 100644
index 0cdd11d..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/NamedElementImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: NamedElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.NamedElement;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Named Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.NamedElementImpl#getName <em>Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NamedElementImpl extends ElementImpl implements NamedElement {
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NamedElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.NAMED_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.NAMED_ELEMENT__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.NAMED_ELEMENT__NAME:
-				return getName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.NAMED_ELEMENT__NAME:
-				setName((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.NAMED_ELEMENT__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.NAMED_ELEMENT__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: ");
-		result.append(name);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NamedElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/OutcomeImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/OutcomeImpl.java
deleted file mode 100644
index 97c9050..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/OutcomeImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: OutcomeImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Outcome;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Outcome</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class OutcomeImpl extends WorkProductImpl implements Outcome {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OutcomeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.OUTCOME;
-	}
-
-} //OutcomeImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PackageableElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PackageableElementImpl.java
deleted file mode 100644
index c9029ad..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PackageableElementImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PackageableElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.PackageableElement;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Packageable Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PackageableElementImpl extends NamedElementImpl implements PackageableElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PackageableElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PACKAGEABLE_ELEMENT;
-	}
-
-} //PackageableElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PhaseImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PhaseImpl.java
deleted file mode 100644
index 8f47083..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PhaseImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PhaseImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Phase;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Phase</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PhaseImpl extends ActivityImpl implements Phase {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PhaseImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PHASE;
-	}
-
-} //PhaseImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PlanningDataImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PlanningDataImpl.java
deleted file mode 100644
index 8dbb20c..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PlanningDataImpl.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PlanningDataImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.PlanningData;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Planning Data</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PlanningDataImpl#getFinishDate <em>Finish Date</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PlanningDataImpl#getRank <em>Rank</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PlanningDataImpl#getStartDate <em>Start Date</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PlanningDataImpl extends ProcessElementImpl implements PlanningData {
-	/**
-	 * The default value of the '{@link #getFinishDate() <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object FINISH_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFinishDate() <em>Finish Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFinishDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object finishDate = FINISH_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getRank() <em>Rank</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRank()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RANK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRank() <em>Rank</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRank()
-	 * @generated
-	 * @ordered
-	 */
-	protected String rank = RANK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getStartDate() <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object START_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getStartDate() <em>Start Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStartDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object startDate = START_DATE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PlanningDataImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PLANNING_DATA;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getFinishDate() {
-		return finishDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFinishDate(Object newFinishDate) {
-		Object oldFinishDate = finishDate;
-		finishDate = newFinishDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PLANNING_DATA__FINISH_DATE, oldFinishDate, finishDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRank() {
-		return rank;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRank(String newRank) {
-		String oldRank = rank;
-		rank = newRank;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PLANNING_DATA__RANK, oldRank, rank));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getStartDate() {
-		return startDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStartDate(Object newStartDate) {
-		Object oldStartDate = startDate;
-		startDate = newStartDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PLANNING_DATA__START_DATE, oldStartDate, startDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PLANNING_DATA__FINISH_DATE:
-				return getFinishDate();
-			case UmaPackage.PLANNING_DATA__RANK:
-				return getRank();
-			case UmaPackage.PLANNING_DATA__START_DATE:
-				return getStartDate();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PLANNING_DATA__FINISH_DATE:
-				setFinishDate(newValue);
-				return;
-			case UmaPackage.PLANNING_DATA__RANK:
-				setRank((String)newValue);
-				return;
-			case UmaPackage.PLANNING_DATA__START_DATE:
-				setStartDate(newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PLANNING_DATA__FINISH_DATE:
-				setFinishDate(FINISH_DATE_EDEFAULT);
-				return;
-			case UmaPackage.PLANNING_DATA__RANK:
-				setRank(RANK_EDEFAULT);
-				return;
-			case UmaPackage.PLANNING_DATA__START_DATE:
-				setStartDate(START_DATE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PLANNING_DATA__FINISH_DATE:
-				return FINISH_DATE_EDEFAULT == null ? finishDate != null : !FINISH_DATE_EDEFAULT.equals(finishDate);
-			case UmaPackage.PLANNING_DATA__RANK:
-				return RANK_EDEFAULT == null ? rank != null : !RANK_EDEFAULT.equals(rank);
-			case UmaPackage.PLANNING_DATA__START_DATE:
-				return START_DATE_EDEFAULT == null ? startDate != null : !START_DATE_EDEFAULT.equals(startDate);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (finishDate: ");
-		result.append(finishDate);
-		result.append(", rank: ");
-		result.append(rank);
-		result.append(", startDate: ");
-		result.append(startDate);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PlanningDataImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PracticeDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PracticeDescriptionImpl.java
deleted file mode 100644
index 4b03a2b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PracticeDescriptionImpl.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PracticeDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.PracticeDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Practice Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl#getAdditionalInfo <em>Additional Info</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl#getBackground <em>Background</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl#getGoals <em>Goals</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl#getLevelsOfAdoption <em>Levels Of Adoption</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeDescriptionImpl#getProblem <em>Problem</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PracticeDescriptionImpl extends ContentDescriptionImpl implements PracticeDescription {
-	/**
-	 * The default value of the '{@link #getAdditionalInfo() <em>Additional Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAdditionalInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ADDITIONAL_INFO_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAdditionalInfo() <em>Additional Info</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAdditionalInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected String additionalInfo = ADDITIONAL_INFO_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getApplication() <em>Application</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplication()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String APPLICATION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getApplication() <em>Application</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplication()
-	 * @generated
-	 * @ordered
-	 */
-	protected String application = APPLICATION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getBackground() <em>Background</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBackground()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String BACKGROUND_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getBackground() <em>Background</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBackground()
-	 * @generated
-	 * @ordered
-	 */
-	protected String background = BACKGROUND_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String GOALS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getGoals() <em>Goals</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGoals()
-	 * @generated
-	 * @ordered
-	 */
-	protected String goals = GOALS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLevelsOfAdoption() <em>Levels Of Adoption</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelsOfAdoption()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LEVELS_OF_ADOPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLevelsOfAdoption() <em>Levels Of Adoption</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLevelsOfAdoption()
-	 * @generated
-	 * @ordered
-	 */
-	protected String levelsOfAdoption = LEVELS_OF_ADOPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getProblem() <em>Problem</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProblem()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PROBLEM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getProblem() <em>Problem</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProblem()
-	 * @generated
-	 * @ordered
-	 */
-	protected String problem = PROBLEM_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PracticeDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PRACTICE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAdditionalInfo() {
-		return additionalInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAdditionalInfo(String newAdditionalInfo) {
-		String oldAdditionalInfo = additionalInfo;
-		additionalInfo = newAdditionalInfo;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO, oldAdditionalInfo, additionalInfo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getApplication() {
-		return application;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setApplication(String newApplication) {
-		String oldApplication = application;
-		application = newApplication;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PRACTICE_DESCRIPTION__APPLICATION, oldApplication, application));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getBackground() {
-		return background;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBackground(String newBackground) {
-		String oldBackground = background;
-		background = newBackground;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND, oldBackground, background));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getGoals() {
-		return goals;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setGoals(String newGoals) {
-		String oldGoals = goals;
-		goals = newGoals;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PRACTICE_DESCRIPTION__GOALS, oldGoals, goals));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLevelsOfAdoption() {
-		return levelsOfAdoption;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLevelsOfAdoption(String newLevelsOfAdoption) {
-		String oldLevelsOfAdoption = levelsOfAdoption;
-		levelsOfAdoption = newLevelsOfAdoption;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION, oldLevelsOfAdoption, levelsOfAdoption));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getProblem() {
-		return problem;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProblem(String newProblem) {
-		String oldProblem = problem;
-		problem = newProblem;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PRACTICE_DESCRIPTION__PROBLEM, oldProblem, problem));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-				return getAdditionalInfo();
-			case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-				return getApplication();
-			case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-				return getBackground();
-			case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-				return getGoals();
-			case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-				return getLevelsOfAdoption();
-			case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-				return getProblem();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-				setAdditionalInfo((String)newValue);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-				setApplication((String)newValue);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-				setBackground((String)newValue);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-				setGoals((String)newValue);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-				setLevelsOfAdoption((String)newValue);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-				setProblem((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-				setAdditionalInfo(ADDITIONAL_INFO_EDEFAULT);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-				setApplication(APPLICATION_EDEFAULT);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-				setBackground(BACKGROUND_EDEFAULT);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-				setGoals(GOALS_EDEFAULT);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-				setLevelsOfAdoption(LEVELS_OF_ADOPTION_EDEFAULT);
-				return;
-			case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-				setProblem(PROBLEM_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE_DESCRIPTION__ADDITIONAL_INFO:
-				return ADDITIONAL_INFO_EDEFAULT == null ? additionalInfo != null : !ADDITIONAL_INFO_EDEFAULT.equals(additionalInfo);
-			case UmaPackage.PRACTICE_DESCRIPTION__APPLICATION:
-				return APPLICATION_EDEFAULT == null ? application != null : !APPLICATION_EDEFAULT.equals(application);
-			case UmaPackage.PRACTICE_DESCRIPTION__BACKGROUND:
-				return BACKGROUND_EDEFAULT == null ? background != null : !BACKGROUND_EDEFAULT.equals(background);
-			case UmaPackage.PRACTICE_DESCRIPTION__GOALS:
-				return GOALS_EDEFAULT == null ? goals != null : !GOALS_EDEFAULT.equals(goals);
-			case UmaPackage.PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION:
-				return LEVELS_OF_ADOPTION_EDEFAULT == null ? levelsOfAdoption != null : !LEVELS_OF_ADOPTION_EDEFAULT.equals(levelsOfAdoption);
-			case UmaPackage.PRACTICE_DESCRIPTION__PROBLEM:
-				return PROBLEM_EDEFAULT == null ? problem != null : !PROBLEM_EDEFAULT.equals(problem);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (additionalInfo: ");
-		result.append(additionalInfo);
-		result.append(", application: ");
-		result.append(application);
-		result.append(", background: ");
-		result.append(background);
-		result.append(", goals: ");
-		result.append(goals);
-		result.append(", levelsOfAdoption: ");
-		result.append(levelsOfAdoption);
-		result.append(", problem: ");
-		result.append(problem);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PracticeDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PracticeImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PracticeImpl.java
deleted file mode 100644
index 67a7a6e..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/PracticeImpl.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: PracticeImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Practice;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Practice</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeImpl#getActivityReference <em>Activity Reference</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeImpl#getContentReference <em>Content Reference</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.PracticeImpl#getSubPractice <em>Sub Practice</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PracticeImpl extends GuidanceImpl implements Practice {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PracticeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PRACTICE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.PRACTICE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getActivityReference() {
-		return getGroup2().list(UmaPackage.Literals.PRACTICE__ACTIVITY_REFERENCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getContentReference() {
-		return getGroup2().list(UmaPackage.Literals.PRACTICE__CONTENT_REFERENCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSubPractice() {
-		return getGroup2().list(UmaPackage.Literals.PRACTICE__SUB_PRACTICE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.PRACTICE__SUB_PRACTICE:
-				return ((InternalEList)getSubPractice()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.PRACTICE__ACTIVITY_REFERENCE:
-				return getActivityReference();
-			case UmaPackage.PRACTICE__CONTENT_REFERENCE:
-				return getContentReference();
-			case UmaPackage.PRACTICE__SUB_PRACTICE:
-				return getSubPractice();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.PRACTICE__ACTIVITY_REFERENCE:
-				getActivityReference().clear();
-				getActivityReference().addAll((Collection)newValue);
-				return;
-			case UmaPackage.PRACTICE__CONTENT_REFERENCE:
-				getContentReference().clear();
-				getContentReference().addAll((Collection)newValue);
-				return;
-			case UmaPackage.PRACTICE__SUB_PRACTICE:
-				getSubPractice().clear();
-				getSubPractice().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.PRACTICE__ACTIVITY_REFERENCE:
-				getActivityReference().clear();
-				return;
-			case UmaPackage.PRACTICE__CONTENT_REFERENCE:
-				getContentReference().clear();
-				return;
-			case UmaPackage.PRACTICE__SUB_PRACTICE:
-				getSubPractice().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PRACTICE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.PRACTICE__ACTIVITY_REFERENCE:
-				return !getActivityReference().isEmpty();
-			case UmaPackage.PRACTICE__CONTENT_REFERENCE:
-				return !getContentReference().isEmpty();
-			case UmaPackage.PRACTICE__SUB_PRACTICE:
-				return !getSubPractice().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PracticeImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessComponentImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessComponentImpl.java
deleted file mode 100644
index a4fcdf2..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessComponentImpl.java
+++ /dev/null
@@ -1,519 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessComponentImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.epf.xml.uma.ProcessComponent;
-import org.eclipse.epf.xml.uma.ProcessComponentInterface;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Component</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl#getCopyright <em>Copyright</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl#getInterface <em>Interface</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl#getProcess <em>Process</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl#getAuthors <em>Authors</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl#getChangeDate <em>Change Date</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl#getChangeDescription <em>Change Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentImpl#getVersion <em>Version</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessComponentImpl extends ProcessPackageImpl implements ProcessComponent {
-	/**
-	 * The default value of the '{@link #getCopyright() <em>Copyright</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCopyright()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COPYRIGHT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getCopyright() <em>Copyright</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getCopyright()
-	 * @generated
-	 * @ordered
-	 */
-	protected String copyright = COPYRIGHT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getInterface() <em>Interface</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getInterface()
-	 * @generated
-	 * @ordered
-	 */
-	protected ProcessComponentInterface interface_;
-
-	/**
-	 * The cached value of the '{@link #getProcess() <em>Process</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProcess()
-	 * @generated
-	 * @ordered
-	 */
-	protected org.eclipse.epf.xml.uma.Process process;
-
-	/**
-	 * The default value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String AUTHORS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAuthors() <em>Authors</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAuthors()
-	 * @generated
-	 * @ordered
-	 */
-	protected String authors = AUTHORS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Object CHANGE_DATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getChangeDate() <em>Change Date</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Object changeDate = CHANGE_DATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CHANGE_DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getChangeDescription() <em>Change Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getChangeDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String changeDescription = CHANGE_DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VERSION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVersion()
-	 * @generated
-	 * @ordered
-	 */
-	protected String version = VERSION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_COMPONENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getCopyright() {
-		return copyright;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setCopyright(String newCopyright) {
-		String oldCopyright = copyright;
-		copyright = newCopyright;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__COPYRIGHT, oldCopyright, copyright));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponentInterface getInterface() {
-		return interface_;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetInterface(ProcessComponentInterface newInterface, NotificationChain msgs) {
-		ProcessComponentInterface oldInterface = interface_;
-		interface_ = newInterface;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__INTERFACE, oldInterface, newInterface);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setInterface(ProcessComponentInterface newInterface) {
-		if (newInterface != interface_) {
-			NotificationChain msgs = null;
-			if (interface_ != null)
-				msgs = ((InternalEObject)interface_).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UmaPackage.PROCESS_COMPONENT__INTERFACE, null, msgs);
-			if (newInterface != null)
-				msgs = ((InternalEObject)newInterface).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - UmaPackage.PROCESS_COMPONENT__INTERFACE, null, msgs);
-			msgs = basicSetInterface(newInterface, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__INTERFACE, newInterface, newInterface));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public org.eclipse.epf.xml.uma.Process getProcess() {
-		return process;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetProcess(org.eclipse.epf.xml.uma.Process newProcess, NotificationChain msgs) {
-		org.eclipse.epf.xml.uma.Process oldProcess = process;
-		process = newProcess;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__PROCESS, oldProcess, newProcess);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProcess(org.eclipse.epf.xml.uma.Process newProcess) {
-		if (newProcess != process) {
-			NotificationChain msgs = null;
-			if (process != null)
-				msgs = ((InternalEObject)process).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UmaPackage.PROCESS_COMPONENT__PROCESS, null, msgs);
-			if (newProcess != null)
-				msgs = ((InternalEObject)newProcess).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - UmaPackage.PROCESS_COMPONENT__PROCESS, null, msgs);
-			msgs = basicSetProcess(newProcess, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__PROCESS, newProcess, newProcess));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAuthors() {
-		return authors;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAuthors(String newAuthors) {
-		String oldAuthors = authors;
-		authors = newAuthors;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__AUTHORS, oldAuthors, authors));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getChangeDate() {
-		return changeDate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDate(Object newChangeDate) {
-		Object oldChangeDate = changeDate;
-		changeDate = newChangeDate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__CHANGE_DATE, oldChangeDate, changeDate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getChangeDescription() {
-		return changeDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setChangeDescription(String newChangeDescription) {
-		String oldChangeDescription = changeDescription;
-		changeDescription = newChangeDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION, oldChangeDescription, changeDescription));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVersion() {
-		return version;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVersion(String newVersion) {
-		String oldVersion = version;
-		version = newVersion;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_COMPONENT__VERSION, oldVersion, version));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT__INTERFACE:
-				return basicSetInterface(null, msgs);
-			case UmaPackage.PROCESS_COMPONENT__PROCESS:
-				return basicSetProcess(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT__COPYRIGHT:
-				return getCopyright();
-			case UmaPackage.PROCESS_COMPONENT__INTERFACE:
-				return getInterface();
-			case UmaPackage.PROCESS_COMPONENT__PROCESS:
-				return getProcess();
-			case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-				return getAuthors();
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-				return getChangeDate();
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-				return getChangeDescription();
-			case UmaPackage.PROCESS_COMPONENT__VERSION:
-				return getVersion();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT__COPYRIGHT:
-				setCopyright((String)newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__INTERFACE:
-				setInterface((ProcessComponentInterface)newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__PROCESS:
-				setProcess((org.eclipse.epf.xml.uma.Process)newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-				setAuthors((String)newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-				setChangeDate(newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-				setChangeDescription((String)newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__VERSION:
-				setVersion((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT__COPYRIGHT:
-				setCopyright(COPYRIGHT_EDEFAULT);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__INTERFACE:
-				setInterface((ProcessComponentInterface)null);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__PROCESS:
-				setProcess((org.eclipse.epf.xml.uma.Process)null);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-				setAuthors(AUTHORS_EDEFAULT);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-				setChangeDate(CHANGE_DATE_EDEFAULT);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-				setChangeDescription(CHANGE_DESCRIPTION_EDEFAULT);
-				return;
-			case UmaPackage.PROCESS_COMPONENT__VERSION:
-				setVersion(VERSION_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT__COPYRIGHT:
-				return COPYRIGHT_EDEFAULT == null ? copyright != null : !COPYRIGHT_EDEFAULT.equals(copyright);
-			case UmaPackage.PROCESS_COMPONENT__INTERFACE:
-				return interface_ != null;
-			case UmaPackage.PROCESS_COMPONENT__PROCESS:
-				return process != null;
-			case UmaPackage.PROCESS_COMPONENT__AUTHORS:
-				return AUTHORS_EDEFAULT == null ? authors != null : !AUTHORS_EDEFAULT.equals(authors);
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DATE:
-				return CHANGE_DATE_EDEFAULT == null ? changeDate != null : !CHANGE_DATE_EDEFAULT.equals(changeDate);
-			case UmaPackage.PROCESS_COMPONENT__CHANGE_DESCRIPTION:
-				return CHANGE_DESCRIPTION_EDEFAULT == null ? changeDescription != null : !CHANGE_DESCRIPTION_EDEFAULT.equals(changeDescription);
-			case UmaPackage.PROCESS_COMPONENT__VERSION:
-				return VERSION_EDEFAULT == null ? version != null : !VERSION_EDEFAULT.equals(version);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (copyright: ");
-		result.append(copyright);
-		result.append(", authors: ");
-		result.append(authors);
-		result.append(", changeDate: ");
-		result.append(changeDate);
-		result.append(", changeDescription: ");
-		result.append(changeDescription);
-		result.append(", version: ");
-		result.append(version);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessComponentImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessComponentInterfaceImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessComponentInterfaceImpl.java
deleted file mode 100644
index 81ea4c9..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessComponentInterfaceImpl.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessComponentInterfaceImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.ProcessComponentInterface;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Component Interface</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentInterfaceImpl#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentInterfaceImpl#getInterfaceSpecification <em>Interface Specification</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessComponentInterfaceImpl#getInterfaceIO <em>Interface IO</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessComponentInterfaceImpl extends BreakdownElementImpl implements ProcessComponentInterface {
-	/**
-	 * The cached value of the '{@link #getGroup1() <em>Group1</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup1()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group1;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessComponentInterfaceImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup1() {
-		if (group1 == null) {
-			group1 = new BasicFeatureMap(this, UmaPackage.PROCESS_COMPONENT_INTERFACE__GROUP1);
-		}
-		return group1;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getInterfaceSpecification() {
-		return getGroup1().list(UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getInterfaceIO() {
-		return getGroup1().list(UmaPackage.Literals.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__GROUP1:
-				return ((InternalEList)getGroup1()).basicRemove(otherEnd, msgs);
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION:
-				return ((InternalEList)getInterfaceSpecification()).basicRemove(otherEnd, msgs);
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-				return ((InternalEList)getInterfaceIO()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__GROUP1:
-				if (coreType) return getGroup1();
-				return ((FeatureMap.Internal)getGroup1()).getWrapper();
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION:
-				return getInterfaceSpecification();
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-				return getInterfaceIO();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__GROUP1:
-				((FeatureMap.Internal)getGroup1()).set(newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION:
-				getInterfaceSpecification().clear();
-				getInterfaceSpecification().addAll((Collection)newValue);
-				return;
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-				getInterfaceIO().clear();
-				getInterfaceIO().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__GROUP1:
-				getGroup1().clear();
-				return;
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION:
-				getInterfaceSpecification().clear();
-				return;
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-				getInterfaceIO().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__GROUP1:
-				return group1 != null && !group1.isEmpty();
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION:
-				return !getInterfaceSpecification().isEmpty();
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE__INTERFACE_IO:
-				return !getInterfaceIO().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group1: ");
-		result.append(group1);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessComponentInterfaceImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessDescriptionImpl.java
deleted file mode 100644
index 0e5474c..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessDescriptionImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.ProcessDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessDescriptionImpl#getScope <em>Scope</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessDescriptionImpl#getUsageNotes <em>Usage Notes</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessDescriptionImpl extends ActivityDescriptionImpl implements ProcessDescription {
-	/**
-	 * The default value of the '{@link #getScope() <em>Scope</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScope()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SCOPE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getScope() <em>Scope</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getScope()
-	 * @generated
-	 * @ordered
-	 */
-	protected String scope = SCOPE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getUsageNotes() <em>Usage Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String USAGE_NOTES_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getUsageNotes() <em>Usage Notes</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getUsageNotes()
-	 * @generated
-	 * @ordered
-	 */
-	protected String usageNotes = USAGE_NOTES_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getScope() {
-		return scope;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setScope(String newScope) {
-		String oldScope = scope;
-		scope = newScope;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_DESCRIPTION__SCOPE, oldScope, scope));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getUsageNotes() {
-		return usageNotes;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setUsageNotes(String newUsageNotes) {
-		String oldUsageNotes = usageNotes;
-		usageNotes = newUsageNotes;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES, oldUsageNotes, usageNotes));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-				return getScope();
-			case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-				return getUsageNotes();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-				setScope((String)newValue);
-				return;
-			case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-				setUsageNotes((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-				setScope(SCOPE_EDEFAULT);
-				return;
-			case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-				setUsageNotes(USAGE_NOTES_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_DESCRIPTION__SCOPE:
-				return SCOPE_EDEFAULT == null ? scope != null : !SCOPE_EDEFAULT.equals(scope);
-			case UmaPackage.PROCESS_DESCRIPTION__USAGE_NOTES:
-				return USAGE_NOTES_EDEFAULT == null ? usageNotes != null : !USAGE_NOTES_EDEFAULT.equals(usageNotes);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (scope: ");
-		result.append(scope);
-		result.append(", usageNotes: ");
-		result.append(usageNotes);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessElementImpl.java
deleted file mode 100644
index e615fc9..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessElementImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.ProcessElement;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ProcessElementImpl extends DescribableElementImpl implements ProcessElement {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_ELEMENT;
-	}
-
-} //ProcessElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessImpl.java
deleted file mode 100644
index 98def6e..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessImpl.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-
-import org.eclipse.emf.ecore.util.EDataTypeEList;
-
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessImpl#getIncludesPattern <em>Includes Pattern</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessImpl#getDefaultContext <em>Default Context</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessImpl#getValidContext <em>Valid Context</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessImpl#getDiagramURI <em>Diagram URI</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessImpl extends ActivityImpl implements org.eclipse.epf.xml.uma.Process {
-	/**
-	 * The cached value of the '{@link #getIncludesPattern() <em>Includes Pattern</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIncludesPattern()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList includesPattern;
-
-	/**
-	 * The default value of the '{@link #getDefaultContext() <em>Default Context</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultContext()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DEFAULT_CONTEXT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDefaultContext() <em>Default Context</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultContext()
-	 * @generated
-	 * @ordered
-	 */
-	protected String defaultContext = DEFAULT_CONTEXT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getValidContext() <em>Valid Context</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidContext()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList validContext;
-
-	/**
-	 * The default value of the '{@link #getDiagramURI() <em>Diagram URI</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDiagramURI()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DIAGRAM_URI_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDiagramURI() <em>Diagram URI</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDiagramURI()
-	 * @generated
-	 * @ordered
-	 */
-	protected String diagramURI = DIAGRAM_URI_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIncludesPattern() {
-		if (includesPattern == null) {
-			includesPattern = new EDataTypeEList(String.class, this, UmaPackage.PROCESS__INCLUDES_PATTERN);
-		}
-		return includesPattern;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDefaultContext() {
-		return defaultContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultContext(String newDefaultContext) {
-		String oldDefaultContext = defaultContext;
-		defaultContext = newDefaultContext;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS__DEFAULT_CONTEXT, oldDefaultContext, defaultContext));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValidContext() {
-		if (validContext == null) {
-			validContext = new EDataTypeEList(String.class, this, UmaPackage.PROCESS__VALID_CONTEXT);
-		}
-		return validContext;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDiagramURI() {
-		return diagramURI;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDiagramURI(String newDiagramURI) {
-		String oldDiagramURI = diagramURI;
-		diagramURI = newDiagramURI;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.PROCESS__DIAGRAM_URI, oldDiagramURI, diagramURI));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PROCESS__INCLUDES_PATTERN:
-				return getIncludesPattern();
-			case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-				return getDefaultContext();
-			case UmaPackage.PROCESS__VALID_CONTEXT:
-				return getValidContext();
-			case UmaPackage.PROCESS__DIAGRAM_URI:
-				return getDiagramURI();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PROCESS__INCLUDES_PATTERN:
-				getIncludesPattern().clear();
-				getIncludesPattern().addAll((Collection)newValue);
-				return;
-			case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-				setDefaultContext((String)newValue);
-				return;
-			case UmaPackage.PROCESS__VALID_CONTEXT:
-				getValidContext().clear();
-				getValidContext().addAll((Collection)newValue);
-				return;
-			case UmaPackage.PROCESS__DIAGRAM_URI:
-				setDiagramURI((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS__INCLUDES_PATTERN:
-				getIncludesPattern().clear();
-				return;
-			case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-				setDefaultContext(DEFAULT_CONTEXT_EDEFAULT);
-				return;
-			case UmaPackage.PROCESS__VALID_CONTEXT:
-				getValidContext().clear();
-				return;
-			case UmaPackage.PROCESS__DIAGRAM_URI:
-				setDiagramURI(DIAGRAM_URI_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS__INCLUDES_PATTERN:
-				return includesPattern != null && !includesPattern.isEmpty();
-			case UmaPackage.PROCESS__DEFAULT_CONTEXT:
-				return DEFAULT_CONTEXT_EDEFAULT == null ? defaultContext != null : !DEFAULT_CONTEXT_EDEFAULT.equals(defaultContext);
-			case UmaPackage.PROCESS__VALID_CONTEXT:
-				return validContext != null && !validContext.isEmpty();
-			case UmaPackage.PROCESS__DIAGRAM_URI:
-				return DIAGRAM_URI_EDEFAULT == null ? diagramURI != null : !DIAGRAM_URI_EDEFAULT.equals(diagramURI);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (includesPattern: ");
-		result.append(includesPattern);
-		result.append(", defaultContext: ");
-		result.append(defaultContext);
-		result.append(", validContext: ");
-		result.append(validContext);
-		result.append(", diagramURI: ");
-		result.append(diagramURI);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessPackageImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessPackageImpl.java
deleted file mode 100644
index 1c35be8..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessPackageImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessPackageImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.ProcessPackage;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Package</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessPackageImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessPackageImpl#getProcessElement <em>Process Element</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessPackageImpl extends MethodPackageImpl implements ProcessPackage {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessPackageImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_PACKAGE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.PROCESS_PACKAGE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProcessElement() {
-		return getGroup2().list(UmaPackage.Literals.PROCESS_PACKAGE__PROCESS_ELEMENT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PACKAGE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENT:
-				return ((InternalEList)getProcessElement()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PACKAGE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENT:
-				return getProcessElement();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PACKAGE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENT:
-				getProcessElement().clear();
-				getProcessElement().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PACKAGE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENT:
-				getProcessElement().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PACKAGE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.PROCESS_PACKAGE__PROCESS_ELEMENT:
-				return !getProcessElement().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessPackageImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessPlanningTemplateImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessPlanningTemplateImpl.java
deleted file mode 100644
index 5241f85..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ProcessPlanningTemplateImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ProcessPlanningTemplateImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Process Planning Template</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessPlanningTemplateImpl#getGroup3 <em>Group3</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ProcessPlanningTemplateImpl#getBaseProcess <em>Base Process</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ProcessPlanningTemplateImpl extends ProcessImpl implements ProcessPlanningTemplate {
-	/**
-	 * The cached value of the '{@link #getGroup3() <em>Group3</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup3()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group3;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ProcessPlanningTemplateImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.PROCESS_PLANNING_TEMPLATE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup3() {
-		if (group3 == null) {
-			group3 = new BasicFeatureMap(this, UmaPackage.PROCESS_PLANNING_TEMPLATE__GROUP3);
-		}
-		return group3;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBaseProcess() {
-		return getGroup3().list(UmaPackage.Literals.PROCESS_PLANNING_TEMPLATE__BASE_PROCESS);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__GROUP3:
-				return ((InternalEList)getGroup3()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__GROUP3:
-				if (coreType) return getGroup3();
-				return ((FeatureMap.Internal)getGroup3()).getWrapper();
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASE_PROCESS:
-				return getBaseProcess();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__GROUP3:
-				((FeatureMap.Internal)getGroup3()).set(newValue);
-				return;
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASE_PROCESS:
-				getBaseProcess().clear();
-				getBaseProcess().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__GROUP3:
-				getGroup3().clear();
-				return;
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASE_PROCESS:
-				getBaseProcess().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__GROUP3:
-				return group3 != null && !group3.isEmpty();
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE__BASE_PROCESS:
-				return !getBaseProcess().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group3: ");
-		result.append(group3);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ProcessPlanningTemplateImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ReportImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ReportImpl.java
deleted file mode 100644
index f706f53..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ReportImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ReportImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Report;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Report</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ReportImpl extends GuidanceImpl implements Report {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReportImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.REPORT;
-	}
-
-} //ReportImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ReusableAssetImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ReusableAssetImpl.java
deleted file mode 100644
index 48cd300..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ReusableAssetImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ReusableAssetImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.ReusableAsset;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Reusable Asset</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ReusableAssetImpl extends GuidanceImpl implements ReusableAsset {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReusableAssetImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.REUSABLE_ASSET;
-	}
-
-} //ReusableAssetImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoadmapImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoadmapImpl.java
deleted file mode 100644
index 61e2cb8..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoadmapImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoadmapImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Roadmap;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Roadmap</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class RoadmapImpl extends GuidanceImpl implements Roadmap {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoadmapImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROADMAP;
-	}
-
-} //RoadmapImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleDescriptionImpl.java
deleted file mode 100644
index b6af231..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleDescriptionImpl.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.RoleDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleDescriptionImpl#getAssignmentApproaches <em>Assignment Approaches</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleDescriptionImpl#getSkills <em>Skills</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleDescriptionImpl#getSynonyms <em>Synonyms</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleDescriptionImpl extends ContentDescriptionImpl implements RoleDescription {
-	/**
-	 * The default value of the '{@link #getAssignmentApproaches() <em>Assignment Approaches</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssignmentApproaches()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ASSIGNMENT_APPROACHES_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAssignmentApproaches() <em>Assignment Approaches</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAssignmentApproaches()
-	 * @generated
-	 * @ordered
-	 */
-	protected String assignmentApproaches = ASSIGNMENT_APPROACHES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSkills() <em>Skills</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSkills()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SKILLS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSkills() <em>Skills</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSkills()
-	 * @generated
-	 * @ordered
-	 */
-	protected String skills = SKILLS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSynonyms() <em>Synonyms</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSynonyms()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SYNONYMS_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSynonyms() <em>Synonyms</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSynonyms()
-	 * @generated
-	 * @ordered
-	 */
-	protected String synonyms = SYNONYMS_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAssignmentApproaches() {
-		return assignmentApproaches;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAssignmentApproaches(String newAssignmentApproaches) {
-		String oldAssignmentApproaches = assignmentApproaches;
-		assignmentApproaches = newAssignmentApproaches;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES, oldAssignmentApproaches, assignmentApproaches));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSkills() {
-		return skills;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSkills(String newSkills) {
-		String oldSkills = skills;
-		skills = newSkills;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ROLE_DESCRIPTION__SKILLS, oldSkills, skills));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSynonyms() {
-		return synonyms;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSynonyms(String newSynonyms) {
-		String oldSynonyms = synonyms;
-		synonyms = newSynonyms;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ROLE_DESCRIPTION__SYNONYMS, oldSynonyms, synonyms));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-				return getAssignmentApproaches();
-			case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-				return getSkills();
-			case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-				return getSynonyms();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-				setAssignmentApproaches((String)newValue);
-				return;
-			case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-				setSkills((String)newValue);
-				return;
-			case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-				setSynonyms((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-				setAssignmentApproaches(ASSIGNMENT_APPROACHES_EDEFAULT);
-				return;
-			case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-				setSkills(SKILLS_EDEFAULT);
-				return;
-			case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-				setSynonyms(SYNONYMS_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES:
-				return ASSIGNMENT_APPROACHES_EDEFAULT == null ? assignmentApproaches != null : !ASSIGNMENT_APPROACHES_EDEFAULT.equals(assignmentApproaches);
-			case UmaPackage.ROLE_DESCRIPTION__SKILLS:
-				return SKILLS_EDEFAULT == null ? skills != null : !SKILLS_EDEFAULT.equals(skills);
-			case UmaPackage.ROLE_DESCRIPTION__SYNONYMS:
-				return SYNONYMS_EDEFAULT == null ? synonyms != null : !SYNONYMS_EDEFAULT.equals(synonyms);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (assignmentApproaches: ");
-		result.append(assignmentApproaches);
-		result.append(", skills: ");
-		result.append(skills);
-		result.append(", synonyms: ");
-		result.append(synonyms);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RoleDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleDescriptorImpl.java
deleted file mode 100644
index db97373..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleDescriptorImpl.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleDescriptorImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EDataTypeEList;
-import org.eclipse.epf.xml.uma.RoleDescriptor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleDescriptorImpl#getRole <em>Role</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleDescriptorImpl#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleDescriptorImpl extends DescriptorImpl implements RoleDescriptor {
-	/**
-	 * The default value of the '{@link #getRole() <em>Role</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRole()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ROLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getRole() <em>Role</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRole()
-	 * @generated
-	 * @ordered
-	 */
-	protected String role = ROLE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getResponsibleFor() <em>Responsible For</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResponsibleFor()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList responsibleFor;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleDescriptorImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getRole() {
-		return role;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRole(String newRole) {
-		String oldRole = role;
-		role = newRole;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.ROLE_DESCRIPTOR__ROLE, oldRole, role));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getResponsibleFor() {
-		if (responsibleFor == null) {
-			responsibleFor = new EDataTypeEList(String.class, this, UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR);
-		}
-		return responsibleFor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-				return getRole();
-			case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-				return getResponsibleFor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-				setRole((String)newValue);
-				return;
-			case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-				getResponsibleFor().clear();
-				getResponsibleFor().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-				setRole(ROLE_EDEFAULT);
-				return;
-			case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-				getResponsibleFor().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_DESCRIPTOR__ROLE:
-				return ROLE_EDEFAULT == null ? role != null : !ROLE_EDEFAULT.equals(role);
-			case UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR:
-				return responsibleFor != null && !responsibleFor.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (role: ");
-		result.append(role);
-		result.append(", responsibleFor: ");
-		result.append(responsibleFor);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RoleDescriptorImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleImpl.java
deleted file mode 100644
index 523cab4..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Role;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleImpl#getResponsibleFor <em>Responsible For</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleImpl extends ContentElementImpl implements Role {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.ROLE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getResponsibleFor() {
-		return getGroup2().list(UmaPackage.Literals.ROLE__RESPONSIBLE_FOR);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.ROLE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ROLE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.ROLE__RESPONSIBLE_FOR:
-				return getResponsibleFor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ROLE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.ROLE__RESPONSIBLE_FOR:
-				getResponsibleFor().clear();
-				getResponsibleFor().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.ROLE__RESPONSIBLE_FOR:
-				getResponsibleFor().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.ROLE__RESPONSIBLE_FOR:
-				return !getResponsibleFor().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RoleImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleSetGroupingImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleSetGroupingImpl.java
deleted file mode 100644
index d356008..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleSetGroupingImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleSetGroupingImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.RoleSetGrouping;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Set Grouping</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleSetGroupingImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleSetGroupingImpl#getRoleSet <em>Role Set</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleSetGroupingImpl extends ContentCategoryImpl implements RoleSetGrouping {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleSetGroupingImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_SET_GROUPING;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.ROLE_SET_GROUPING__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRoleSet() {
-		return getGroup2().list(UmaPackage.Literals.ROLE_SET_GROUPING__ROLE_SET);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET_GROUPING__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET_GROUPING__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.ROLE_SET_GROUPING__ROLE_SET:
-				return getRoleSet();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET_GROUPING__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.ROLE_SET_GROUPING__ROLE_SET:
-				getRoleSet().clear();
-				getRoleSet().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET_GROUPING__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.ROLE_SET_GROUPING__ROLE_SET:
-				getRoleSet().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET_GROUPING__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.ROLE_SET_GROUPING__ROLE_SET:
-				return !getRoleSet().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RoleSetGroupingImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleSetImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleSetImpl.java
deleted file mode 100644
index bf8450b..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/RoleSetImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: RoleSetImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.RoleSet;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Role Set</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleSetImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.RoleSetImpl#getRole <em>Role</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RoleSetImpl extends ContentCategoryImpl implements RoleSet {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RoleSetImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.ROLE_SET;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.ROLE_SET__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRole() {
-		return getGroup2().list(UmaPackage.Literals.ROLE_SET__ROLE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.ROLE_SET__ROLE:
-				return getRole();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.ROLE_SET__ROLE:
-				getRole().clear();
-				getRole().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.ROLE_SET__ROLE:
-				getRole().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.ROLE_SET__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.ROLE_SET__ROLE:
-				return !getRole().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RoleSetImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/SectionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/SectionImpl.java
deleted file mode 100644
index 23c10e0..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/SectionImpl.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: SectionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.VariabilityType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Section</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.SectionImpl#getSubSection <em>Sub Section</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.SectionImpl#getPredecessor <em>Predecessor</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.SectionImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.SectionImpl#getSectionName <em>Section Name</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.SectionImpl#getVariabilityBasedOnElement <em>Variability Based On Element</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.SectionImpl#getVariabilityType <em>Variability Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SectionImpl extends MethodElementImpl implements Section {
-	/**
-	 * The cached value of the '{@link #getSubSection() <em>Sub Section</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSubSection()
-	 * @generated
-	 * @ordered
-	 */
-	protected Section subSection;
-
-	/**
-	 * The default value of the '{@link #getPredecessor() <em>Predecessor</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPredecessor()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PREDECESSOR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPredecessor() <em>Predecessor</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPredecessor()
-	 * @generated
-	 * @ordered
-	 */
-	protected String predecessor = PREDECESSOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String DESCRIPTION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected String description = DESCRIPTION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getSectionName() <em>Section Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSectionName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SECTION_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getSectionName() <em>Section Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSectionName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String sectionName = SECTION_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VARIABILITY_BASED_ON_ELEMENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityBasedOnElement() <em>Variability Based On Element</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityBasedOnElement()
-	 * @generated
-	 * @ordered
-	 */
-	protected String variabilityBasedOnElement = VARIABILITY_BASED_ON_ELEMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final VariabilityType VARIABILITY_TYPE_EDEFAULT = VariabilityType.NA_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getVariabilityType() <em>Variability Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariabilityType()
-	 * @generated
-	 * @ordered
-	 */
-	protected VariabilityType variabilityType = VARIABILITY_TYPE_EDEFAULT;
-
-	/**
-	 * This is true if the Variability Type attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean variabilityTypeESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SectionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.SECTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Section getSubSection() {
-		return subSection;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSubSection(Section newSubSection, NotificationChain msgs) {
-		Section oldSubSection = subSection;
-		subSection = newSubSection;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, UmaPackage.SECTION__SUB_SECTION, oldSubSection, newSubSection);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSubSection(Section newSubSection) {
-		if (newSubSection != subSection) {
-			NotificationChain msgs = null;
-			if (subSection != null)
-				msgs = ((InternalEObject)subSection).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - UmaPackage.SECTION__SUB_SECTION, null, msgs);
-			if (newSubSection != null)
-				msgs = ((InternalEObject)newSubSection).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - UmaPackage.SECTION__SUB_SECTION, null, msgs);
-			msgs = basicSetSubSection(newSubSection, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.SECTION__SUB_SECTION, newSubSection, newSubSection));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPredecessor() {
-		return predecessor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPredecessor(String newPredecessor) {
-		String oldPredecessor = predecessor;
-		predecessor = newPredecessor;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.SECTION__PREDECESSOR, oldPredecessor, predecessor));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDescription(String newDescription) {
-		String oldDescription = description;
-		description = newDescription;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.SECTION__DESCRIPTION, oldDescription, description));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getSectionName() {
-		return sectionName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSectionName(String newSectionName) {
-		String oldSectionName = sectionName;
-		sectionName = newSectionName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.SECTION__SECTION_NAME, oldSectionName, sectionName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getVariabilityBasedOnElement() {
-		return variabilityBasedOnElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityBasedOnElement(String newVariabilityBasedOnElement) {
-		String oldVariabilityBasedOnElement = variabilityBasedOnElement;
-		variabilityBasedOnElement = newVariabilityBasedOnElement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.SECTION__VARIABILITY_BASED_ON_ELEMENT, oldVariabilityBasedOnElement, variabilityBasedOnElement));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType getVariabilityType() {
-		return variabilityType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariabilityType(VariabilityType newVariabilityType) {
-		VariabilityType oldVariabilityType = variabilityType;
-		variabilityType = newVariabilityType == null ? VARIABILITY_TYPE_EDEFAULT : newVariabilityType;
-		boolean oldVariabilityTypeESet = variabilityTypeESet;
-		variabilityTypeESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.SECTION__VARIABILITY_TYPE, oldVariabilityType, variabilityType, !oldVariabilityTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetVariabilityType() {
-		VariabilityType oldVariabilityType = variabilityType;
-		boolean oldVariabilityTypeESet = variabilityTypeESet;
-		variabilityType = VARIABILITY_TYPE_EDEFAULT;
-		variabilityTypeESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.SECTION__VARIABILITY_TYPE, oldVariabilityType, VARIABILITY_TYPE_EDEFAULT, oldVariabilityTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetVariabilityType() {
-		return variabilityTypeESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.SECTION__SUB_SECTION:
-				return basicSetSubSection(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.SECTION__SUB_SECTION:
-				return getSubSection();
-			case UmaPackage.SECTION__PREDECESSOR:
-				return getPredecessor();
-			case UmaPackage.SECTION__DESCRIPTION:
-				return getDescription();
-			case UmaPackage.SECTION__SECTION_NAME:
-				return getSectionName();
-			case UmaPackage.SECTION__VARIABILITY_BASED_ON_ELEMENT:
-				return getVariabilityBasedOnElement();
-			case UmaPackage.SECTION__VARIABILITY_TYPE:
-				return getVariabilityType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.SECTION__SUB_SECTION:
-				setSubSection((Section)newValue);
-				return;
-			case UmaPackage.SECTION__PREDECESSOR:
-				setPredecessor((String)newValue);
-				return;
-			case UmaPackage.SECTION__DESCRIPTION:
-				setDescription((String)newValue);
-				return;
-			case UmaPackage.SECTION__SECTION_NAME:
-				setSectionName((String)newValue);
-				return;
-			case UmaPackage.SECTION__VARIABILITY_BASED_ON_ELEMENT:
-				setVariabilityBasedOnElement((String)newValue);
-				return;
-			case UmaPackage.SECTION__VARIABILITY_TYPE:
-				setVariabilityType((VariabilityType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.SECTION__SUB_SECTION:
-				setSubSection((Section)null);
-				return;
-			case UmaPackage.SECTION__PREDECESSOR:
-				setPredecessor(PREDECESSOR_EDEFAULT);
-				return;
-			case UmaPackage.SECTION__DESCRIPTION:
-				setDescription(DESCRIPTION_EDEFAULT);
-				return;
-			case UmaPackage.SECTION__SECTION_NAME:
-				setSectionName(SECTION_NAME_EDEFAULT);
-				return;
-			case UmaPackage.SECTION__VARIABILITY_BASED_ON_ELEMENT:
-				setVariabilityBasedOnElement(VARIABILITY_BASED_ON_ELEMENT_EDEFAULT);
-				return;
-			case UmaPackage.SECTION__VARIABILITY_TYPE:
-				unsetVariabilityType();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.SECTION__SUB_SECTION:
-				return subSection != null;
-			case UmaPackage.SECTION__PREDECESSOR:
-				return PREDECESSOR_EDEFAULT == null ? predecessor != null : !PREDECESSOR_EDEFAULT.equals(predecessor);
-			case UmaPackage.SECTION__DESCRIPTION:
-				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
-			case UmaPackage.SECTION__SECTION_NAME:
-				return SECTION_NAME_EDEFAULT == null ? sectionName != null : !SECTION_NAME_EDEFAULT.equals(sectionName);
-			case UmaPackage.SECTION__VARIABILITY_BASED_ON_ELEMENT:
-				return VARIABILITY_BASED_ON_ELEMENT_EDEFAULT == null ? variabilityBasedOnElement != null : !VARIABILITY_BASED_ON_ELEMENT_EDEFAULT.equals(variabilityBasedOnElement);
-			case UmaPackage.SECTION__VARIABILITY_TYPE:
-				return isSetVariabilityType();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (predecessor: ");
-		result.append(predecessor);
-		result.append(", description: ");
-		result.append(description);
-		result.append(", sectionName: ");
-		result.append(sectionName);
-		result.append(", variabilityBasedOnElement: ");
-		result.append(variabilityBasedOnElement);
-		result.append(", variabilityType: ");
-		if (variabilityTypeESet) result.append(variabilityType); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //SectionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/SupportingMaterialImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/SupportingMaterialImpl.java
deleted file mode 100644
index d5e129e..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/SupportingMaterialImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: SupportingMaterialImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.SupportingMaterial;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Supporting Material</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class SupportingMaterialImpl extends GuidanceImpl implements SupportingMaterial {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SupportingMaterialImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.SUPPORTING_MATERIAL;
-	}
-
-} //SupportingMaterialImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskDescriptionImpl.java
deleted file mode 100644
index 3248005..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskDescriptionImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TaskDescriptionImpl.java,v 1.1 2008/01/15 08:51:35 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.TaskDescription;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Task Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptionImpl#getAlternatives <em>Alternatives</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptionImpl#getPurpose <em>Purpose</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskDescriptionImpl extends ContentDescriptionImpl implements TaskDescription {
-	/**
-	 * The default value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ALTERNATIVES_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAlternatives() <em>Alternatives</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAlternatives()
-	 * @generated
-	 * @ordered
-	 */
-	protected String alternatives = ALTERNATIVES_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PURPOSE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected String purpose = PURPOSE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TASK_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAlternatives() {
-		return alternatives;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAlternatives(String newAlternatives) {
-		String oldAlternatives = alternatives;
-		alternatives = newAlternatives;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK_DESCRIPTION__ALTERNATIVES, oldAlternatives, alternatives));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPurpose() {
-		return purpose;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPurpose(String newPurpose) {
-		String oldPurpose = purpose;
-		purpose = newPurpose;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK_DESCRIPTION__PURPOSE, oldPurpose, purpose));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-				return getAlternatives();
-			case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-				return getPurpose();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-				setAlternatives((String)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-				setPurpose((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-				setAlternatives(ALTERNATIVES_EDEFAULT);
-				return;
-			case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-				setPurpose(PURPOSE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTION__ALTERNATIVES:
-				return ALTERNATIVES_EDEFAULT == null ? alternatives != null : !ALTERNATIVES_EDEFAULT.equals(alternatives);
-			case UmaPackage.TASK_DESCRIPTION__PURPOSE:
-				return PURPOSE_EDEFAULT == null ? purpose != null : !PURPOSE_EDEFAULT.equals(purpose);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (alternatives: ");
-		result.append(alternatives);
-		result.append(", purpose: ");
-		result.append(purpose);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TaskDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskDescriptorImpl.java
deleted file mode 100644
index dc76d29..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskDescriptorImpl.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TaskDescriptorImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.TaskDescriptor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Task Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getTask <em>Task</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getPerformedPrimarilyBy <em>Performed Primarily By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getAssistedBy <em>Assisted By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getExternalInput <em>External Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#getStep <em>Step</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskDescriptorImpl#isIsSynchronizedWithSource <em>Is Synchronized With Source</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskDescriptorImpl extends WorkBreakdownElementImpl implements TaskDescriptor {
-	/**
-	 * The default value of the '{@link #getTask() <em>Task</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTask()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TASK_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTask() <em>Task</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTask()
-	 * @generated
-	 * @ordered
-	 */
-	protected String task = TASK_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPerformedPrimarilyBy() <em>Performed Primarily By</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPerformedPrimarilyBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PERFORMED_PRIMARILY_BY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPerformedPrimarilyBy() <em>Performed Primarily By</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPerformedPrimarilyBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected String performedPrimarilyBy = PERFORMED_PRIMARILY_BY_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * The cached value of the '{@link #getStep() <em>Step</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStep()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList step;
-
-	/**
-	 * The default value of the '{@link #isIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsSynchronizedWithSource() <em>Is Synchronized With Source</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsSynchronizedWithSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSynchronizedWithSource = IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT;
-
-	/**
-	 * This is true if the Is Synchronized With Source attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isSynchronizedWithSourceESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskDescriptorImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TASK_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTask() {
-		return task;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTask(String newTask) {
-		String oldTask = task;
-		task = newTask;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK_DESCRIPTOR__TASK, oldTask, task));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPerformedPrimarilyBy() {
-		return performedPrimarilyBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPerformedPrimarilyBy(String newPerformedPrimarilyBy) {
-		String oldPerformedPrimarilyBy = performedPrimarilyBy;
-		performedPrimarilyBy = newPerformedPrimarilyBy;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY, oldPerformedPrimarilyBy, performedPrimarilyBy));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.TASK_DESCRIPTOR__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAdditionallyPerformedBy() {
-		return getGroup2().list(UmaPackage.Literals.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAssistedBy() {
-		return getGroup2().list(UmaPackage.Literals.TASK_DESCRIPTOR__ASSISTED_BY);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExternalInput() {
-		return getGroup2().list(UmaPackage.Literals.TASK_DESCRIPTOR__EXTERNAL_INPUT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMandatoryInput() {
-		return getGroup2().list(UmaPackage.Literals.TASK_DESCRIPTOR__MANDATORY_INPUT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOptionalInput() {
-		return getGroup2().list(UmaPackage.Literals.TASK_DESCRIPTOR__OPTIONAL_INPUT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOutput() {
-		return getGroup2().list(UmaPackage.Literals.TASK_DESCRIPTOR__OUTPUT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getStep() {
-		if (step == null) {
-			step = new EObjectContainmentEList(Section.class, this, UmaPackage.TASK_DESCRIPTOR__STEP);
-		}
-		return step;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsSynchronizedWithSource() {
-		return isSynchronizedWithSource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsSynchronizedWithSource(boolean newIsSynchronizedWithSource) {
-		boolean oldIsSynchronizedWithSource = isSynchronizedWithSource;
-		isSynchronizedWithSource = newIsSynchronizedWithSource;
-		boolean oldIsSynchronizedWithSourceESet = isSynchronizedWithSourceESet;
-		isSynchronizedWithSourceESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE, oldIsSynchronizedWithSource, isSynchronizedWithSource, !oldIsSynchronizedWithSourceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsSynchronizedWithSource() {
-		boolean oldIsSynchronizedWithSource = isSynchronizedWithSource;
-		boolean oldIsSynchronizedWithSourceESet = isSynchronizedWithSourceESet;
-		isSynchronizedWithSource = IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT;
-		isSynchronizedWithSourceESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE, oldIsSynchronizedWithSource, IS_SYNCHRONIZED_WITH_SOURCE_EDEFAULT, oldIsSynchronizedWithSourceESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsSynchronizedWithSource() {
-		return isSynchronizedWithSourceESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-			case UmaPackage.TASK_DESCRIPTOR__STEP:
-				return ((InternalEList)getStep()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__TASK:
-				return getTask();
-			case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-				return getPerformedPrimarilyBy();
-			case UmaPackage.TASK_DESCRIPTOR__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-				return getAdditionallyPerformedBy();
-			case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-				return getAssistedBy();
-			case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-				return getExternalInput();
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				return getMandatoryInput();
-			case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-				return getOptionalInput();
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				return getOutput();
-			case UmaPackage.TASK_DESCRIPTOR__STEP:
-				return getStep();
-			case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				return isIsSynchronizedWithSource() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__TASK:
-				setTask((String)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-				setPerformedPrimarilyBy((String)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-				getAdditionallyPerformedBy().clear();
-				getAdditionallyPerformedBy().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-				getAssistedBy().clear();
-				getAssistedBy().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-				getExternalInput().clear();
-				getExternalInput().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				getMandatoryInput().clear();
-				getMandatoryInput().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-				getOptionalInput().clear();
-				getOptionalInput().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				getOutput().clear();
-				getOutput().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__STEP:
-				getStep().clear();
-				getStep().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				setIsSynchronizedWithSource(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__TASK:
-				setTask(TASK_EDEFAULT);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-				setPerformedPrimarilyBy(PERFORMED_PRIMARILY_BY_EDEFAULT);
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-				getAdditionallyPerformedBy().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-				getAssistedBy().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-				getExternalInput().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				getMandatoryInput().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-				getOptionalInput().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				getOutput().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__STEP:
-				getStep().clear();
-				return;
-			case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				unsetIsSynchronizedWithSource();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TASK_DESCRIPTOR__TASK:
-				return TASK_EDEFAULT == null ? task != null : !TASK_EDEFAULT.equals(task);
-			case UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY:
-				return PERFORMED_PRIMARILY_BY_EDEFAULT == null ? performedPrimarilyBy != null : !PERFORMED_PRIMARILY_BY_EDEFAULT.equals(performedPrimarilyBy);
-			case UmaPackage.TASK_DESCRIPTOR__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
-				return !getAdditionallyPerformedBy().isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-				return !getAssistedBy().isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT:
-				return !getExternalInput().isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT:
-				return !getMandatoryInput().isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT:
-				return !getOptionalInput().isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__OUTPUT:
-				return !getOutput().isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__STEP:
-				return step != null && !step.isEmpty();
-			case UmaPackage.TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE:
-				return isSetIsSynchronizedWithSource();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (task: ");
-		result.append(task);
-		result.append(", performedPrimarilyBy: ");
-		result.append(performedPrimarilyBy);
-		result.append(", group2: ");
-		result.append(group2);
-		result.append(", isSynchronizedWithSource: ");
-		if (isSynchronizedWithSourceESet) result.append(isSynchronizedWithSource); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //TaskDescriptorImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskImpl.java
deleted file mode 100644
index 97954b8..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TaskImpl.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TaskImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Task;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Task</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getPostcondition <em>Postcondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getPerformedBy <em>Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getMandatoryInput <em>Mandatory Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getOutput <em>Output</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getAdditionallyPerformedBy <em>Additionally Performed By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getOptionalInput <em>Optional Input</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getEstimate <em>Estimate</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TaskImpl#getToolMentor <em>Tool Mentor</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TaskImpl extends ContentElementImpl implements Task {
-	/**
-	 * The default value of the '{@link #getPrecondition() <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRECONDITION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPrecondition() <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected String precondition = PRECONDITION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPostcondition() <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String POSTCONDITION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPostcondition() <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected String postcondition = POSTCONDITION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPerformedBy() <em>Performed By</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPerformedBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PERFORMED_BY_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPerformedBy() <em>Performed By</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPerformedBy()
-	 * @generated
-	 * @ordered
-	 */
-	protected String performedBy = PERFORMED_BY_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TaskImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TASK;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPrecondition() {
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrecondition(String newPrecondition) {
-		String oldPrecondition = precondition;
-		precondition = newPrecondition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK__PRECONDITION, oldPrecondition, precondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPostcondition() {
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPostcondition(String newPostcondition) {
-		String oldPostcondition = postcondition;
-		postcondition = newPostcondition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK__POSTCONDITION, oldPostcondition, postcondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPerformedBy() {
-		return performedBy;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPerformedBy(String newPerformedBy) {
-		String oldPerformedBy = performedBy;
-		performedBy = newPerformedBy;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.TASK__PERFORMED_BY, oldPerformedBy, performedBy));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.TASK__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMandatoryInput() {
-		return getGroup2().list(UmaPackage.Literals.TASK__MANDATORY_INPUT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOutput() {
-		return getGroup2().list(UmaPackage.Literals.TASK__OUTPUT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAdditionallyPerformedBy() {
-		return getGroup2().list(UmaPackage.Literals.TASK__ADDITIONALLY_PERFORMED_BY);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOptionalInput() {
-		return getGroup2().list(UmaPackage.Literals.TASK__OPTIONAL_INPUT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEstimate() {
-		return getGroup2().list(UmaPackage.Literals.TASK__ESTIMATE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEstimationConsiderations() {
-		return getGroup2().list(UmaPackage.Literals.TASK__ESTIMATION_CONSIDERATIONS);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getToolMentor() {
-		return getGroup2().list(UmaPackage.Literals.TASK__TOOL_MENTOR);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.TASK__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.TASK__PRECONDITION:
-				return getPrecondition();
-			case UmaPackage.TASK__POSTCONDITION:
-				return getPostcondition();
-			case UmaPackage.TASK__PERFORMED_BY:
-				return getPerformedBy();
-			case UmaPackage.TASK__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.TASK__MANDATORY_INPUT:
-				return getMandatoryInput();
-			case UmaPackage.TASK__OUTPUT:
-				return getOutput();
-			case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-				return getAdditionallyPerformedBy();
-			case UmaPackage.TASK__OPTIONAL_INPUT:
-				return getOptionalInput();
-			case UmaPackage.TASK__ESTIMATE:
-				return getEstimate();
-			case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-				return getEstimationConsiderations();
-			case UmaPackage.TASK__TOOL_MENTOR:
-				return getToolMentor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.TASK__PRECONDITION:
-				setPrecondition((String)newValue);
-				return;
-			case UmaPackage.TASK__POSTCONDITION:
-				setPostcondition((String)newValue);
-				return;
-			case UmaPackage.TASK__PERFORMED_BY:
-				setPerformedBy((String)newValue);
-				return;
-			case UmaPackage.TASK__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.TASK__MANDATORY_INPUT:
-				getMandatoryInput().clear();
-				getMandatoryInput().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK__OUTPUT:
-				getOutput().clear();
-				getOutput().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-				getAdditionallyPerformedBy().clear();
-				getAdditionallyPerformedBy().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK__OPTIONAL_INPUT:
-				getOptionalInput().clear();
-				getOptionalInput().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK__ESTIMATE:
-				getEstimate().clear();
-				getEstimate().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-				getEstimationConsiderations().clear();
-				getEstimationConsiderations().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TASK__TOOL_MENTOR:
-				getToolMentor().clear();
-				getToolMentor().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TASK__PRECONDITION:
-				setPrecondition(PRECONDITION_EDEFAULT);
-				return;
-			case UmaPackage.TASK__POSTCONDITION:
-				setPostcondition(POSTCONDITION_EDEFAULT);
-				return;
-			case UmaPackage.TASK__PERFORMED_BY:
-				setPerformedBy(PERFORMED_BY_EDEFAULT);
-				return;
-			case UmaPackage.TASK__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.TASK__MANDATORY_INPUT:
-				getMandatoryInput().clear();
-				return;
-			case UmaPackage.TASK__OUTPUT:
-				getOutput().clear();
-				return;
-			case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-				getAdditionallyPerformedBy().clear();
-				return;
-			case UmaPackage.TASK__OPTIONAL_INPUT:
-				getOptionalInput().clear();
-				return;
-			case UmaPackage.TASK__ESTIMATE:
-				getEstimate().clear();
-				return;
-			case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-				getEstimationConsiderations().clear();
-				return;
-			case UmaPackage.TASK__TOOL_MENTOR:
-				getToolMentor().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TASK__PRECONDITION:
-				return PRECONDITION_EDEFAULT == null ? precondition != null : !PRECONDITION_EDEFAULT.equals(precondition);
-			case UmaPackage.TASK__POSTCONDITION:
-				return POSTCONDITION_EDEFAULT == null ? postcondition != null : !POSTCONDITION_EDEFAULT.equals(postcondition);
-			case UmaPackage.TASK__PERFORMED_BY:
-				return PERFORMED_BY_EDEFAULT == null ? performedBy != null : !PERFORMED_BY_EDEFAULT.equals(performedBy);
-			case UmaPackage.TASK__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.TASK__MANDATORY_INPUT:
-				return !getMandatoryInput().isEmpty();
-			case UmaPackage.TASK__OUTPUT:
-				return !getOutput().isEmpty();
-			case UmaPackage.TASK__ADDITIONALLY_PERFORMED_BY:
-				return !getAdditionallyPerformedBy().isEmpty();
-			case UmaPackage.TASK__OPTIONAL_INPUT:
-				return !getOptionalInput().isEmpty();
-			case UmaPackage.TASK__ESTIMATE:
-				return !getEstimate().isEmpty();
-			case UmaPackage.TASK__ESTIMATION_CONSIDERATIONS:
-				return !getEstimationConsiderations().isEmpty();
-			case UmaPackage.TASK__TOOL_MENTOR:
-				return !getToolMentor().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (precondition: ");
-		result.append(precondition);
-		result.append(", postcondition: ");
-		result.append(postcondition);
-		result.append(", performedBy: ");
-		result.append(performedBy);
-		result.append(", group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TaskImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TeamProfileImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TeamProfileImpl.java
deleted file mode 100644
index a7c6c83..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TeamProfileImpl.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TeamProfileImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.TeamProfile;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Team Profile</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TeamProfileImpl#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TeamProfileImpl#getRole <em>Role</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TeamProfileImpl#getSuperTeam <em>Super Team</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.TeamProfileImpl#getSubTeam <em>Sub Team</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TeamProfileImpl extends BreakdownElementImpl implements TeamProfile {
-	/**
-	 * The cached value of the '{@link #getGroup1() <em>Group1</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup1()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group1;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TeamProfileImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TEAM_PROFILE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup1() {
-		if (group1 == null) {
-			group1 = new BasicFeatureMap(this, UmaPackage.TEAM_PROFILE__GROUP1);
-		}
-		return group1;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRole() {
-		return getGroup1().list(UmaPackage.Literals.TEAM_PROFILE__ROLE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSuperTeam() {
-		return getGroup1().list(UmaPackage.Literals.TEAM_PROFILE__SUPER_TEAM);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSubTeam() {
-		return getGroup1().list(UmaPackage.Literals.TEAM_PROFILE__SUB_TEAM);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.TEAM_PROFILE__GROUP1:
-				return ((InternalEList)getGroup1()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.TEAM_PROFILE__GROUP1:
-				if (coreType) return getGroup1();
-				return ((FeatureMap.Internal)getGroup1()).getWrapper();
-			case UmaPackage.TEAM_PROFILE__ROLE:
-				return getRole();
-			case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-				return getSuperTeam();
-			case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-				return getSubTeam();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.TEAM_PROFILE__GROUP1:
-				((FeatureMap.Internal)getGroup1()).set(newValue);
-				return;
-			case UmaPackage.TEAM_PROFILE__ROLE:
-				getRole().clear();
-				getRole().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-				getSuperTeam().clear();
-				getSuperTeam().addAll((Collection)newValue);
-				return;
-			case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-				getSubTeam().clear();
-				getSubTeam().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TEAM_PROFILE__GROUP1:
-				getGroup1().clear();
-				return;
-			case UmaPackage.TEAM_PROFILE__ROLE:
-				getRole().clear();
-				return;
-			case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-				getSuperTeam().clear();
-				return;
-			case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-				getSubTeam().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TEAM_PROFILE__GROUP1:
-				return group1 != null && !group1.isEmpty();
-			case UmaPackage.TEAM_PROFILE__ROLE:
-				return !getRole().isEmpty();
-			case UmaPackage.TEAM_PROFILE__SUPER_TEAM:
-				return !getSuperTeam().isEmpty();
-			case UmaPackage.TEAM_PROFILE__SUB_TEAM:
-				return !getSubTeam().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group1: ");
-		result.append(group1);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TeamProfileImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TemplateImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TemplateImpl.java
deleted file mode 100644
index 47d32f4..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TemplateImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TemplateImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.Template;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Template</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class TemplateImpl extends GuidanceImpl implements Template {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TemplateImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TEMPLATE;
-	}
-
-} //TemplateImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TermDefinitionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TermDefinitionImpl.java
deleted file mode 100644
index 64bb254..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/TermDefinitionImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TermDefinitionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.TermDefinition;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Term Definition</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class TermDefinitionImpl extends GuidanceImpl implements TermDefinition {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TermDefinitionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TERM_DEFINITION;
-	}
-
-} //TermDefinitionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ToolImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ToolImpl.java
deleted file mode 100644
index 70613cf..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ToolImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ToolImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.Tool;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tool</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ToolImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.ToolImpl#getToolMentor <em>Tool Mentor</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ToolImpl extends ContentCategoryImpl implements Tool {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToolImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TOOL;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.TOOL__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getToolMentor() {
-		return getGroup2().list(UmaPackage.Literals.TOOL__TOOL_MENTOR);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.TOOL__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.TOOL__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.TOOL__TOOL_MENTOR:
-				return getToolMentor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.TOOL__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.TOOL__TOOL_MENTOR:
-				getToolMentor().clear();
-				getToolMentor().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TOOL__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.TOOL__TOOL_MENTOR:
-				getToolMentor().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.TOOL__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.TOOL__TOOL_MENTOR:
-				return !getToolMentor().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ToolImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ToolMentorImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ToolMentorImpl.java
deleted file mode 100644
index 1cc5004..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/ToolMentorImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: ToolMentorImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.ToolMentor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tool Mentor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ToolMentorImpl extends GuidanceImpl implements ToolMentor {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToolMentorImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.TOOL_MENTOR;
-	}
-
-} //ToolMentorImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/UmaFactoryImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/UmaFactoryImpl.java
deleted file mode 100644
index 157028a..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/UmaFactoryImpl.java
+++ /dev/null
@@ -1,1222 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaFactoryImpl.java,v 1.1 2008/01/15 08:51:35 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-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.epf.xml.uma.Activity;
-import org.eclipse.epf.xml.uma.ActivityDescription;
-import org.eclipse.epf.xml.uma.Artifact;
-import org.eclipse.epf.xml.uma.ArtifactDescription;
-import org.eclipse.epf.xml.uma.BreakdownElement;
-import org.eclipse.epf.xml.uma.BreakdownElementDescription;
-import org.eclipse.epf.xml.uma.CapabilityPattern;
-import org.eclipse.epf.xml.uma.Checklist;
-import org.eclipse.epf.xml.uma.CompositeRole;
-import org.eclipse.epf.xml.uma.Concept;
-import org.eclipse.epf.xml.uma.Constraint;
-import org.eclipse.epf.xml.uma.ContentCategory;
-import org.eclipse.epf.xml.uma.ContentCategoryPackage;
-import org.eclipse.epf.xml.uma.ContentDescription;
-import org.eclipse.epf.xml.uma.ContentElement;
-import org.eclipse.epf.xml.uma.ContentPackage;
-import org.eclipse.epf.xml.uma.CustomCategory;
-import org.eclipse.epf.xml.uma.Deliverable;
-import org.eclipse.epf.xml.uma.DeliverableDescription;
-import org.eclipse.epf.xml.uma.DeliveryProcess;
-import org.eclipse.epf.xml.uma.DeliveryProcessDescription;
-import org.eclipse.epf.xml.uma.DescribableElement;
-import org.eclipse.epf.xml.uma.Descriptor;
-import org.eclipse.epf.xml.uma.DescriptorDescription;
-import org.eclipse.epf.xml.uma.Discipline;
-import org.eclipse.epf.xml.uma.DisciplineGrouping;
-import org.eclipse.epf.xml.uma.DocumentRoot;
-import org.eclipse.epf.xml.uma.Domain;
-import org.eclipse.epf.xml.uma.Element;
-import org.eclipse.epf.xml.uma.Estimate;
-import org.eclipse.epf.xml.uma.EstimatingMetric;
-import org.eclipse.epf.xml.uma.EstimationConsiderations;
-import org.eclipse.epf.xml.uma.Example;
-import org.eclipse.epf.xml.uma.Guidance;
-import org.eclipse.epf.xml.uma.GuidanceDescription;
-import org.eclipse.epf.xml.uma.Guideline;
-import org.eclipse.epf.xml.uma.Iteration;
-import org.eclipse.epf.xml.uma.MethodConfiguration;
-import org.eclipse.epf.xml.uma.MethodElement;
-import org.eclipse.epf.xml.uma.MethodElementProperty;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.MethodUnit;
-import org.eclipse.epf.xml.uma.Milestone;
-import org.eclipse.epf.xml.uma.NamedElement;
-import org.eclipse.epf.xml.uma.Outcome;
-import org.eclipse.epf.xml.uma.PackageableElement;
-import org.eclipse.epf.xml.uma.Phase;
-import org.eclipse.epf.xml.uma.PlanningData;
-import org.eclipse.epf.xml.uma.Practice;
-import org.eclipse.epf.xml.uma.PracticeDescription;
-import org.eclipse.epf.xml.uma.ProcessComponent;
-import org.eclipse.epf.xml.uma.ProcessComponentInterface;
-import org.eclipse.epf.xml.uma.ProcessDescription;
-import org.eclipse.epf.xml.uma.ProcessElement;
-import org.eclipse.epf.xml.uma.ProcessPackage;
-import org.eclipse.epf.xml.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.xml.uma.Report;
-import org.eclipse.epf.xml.uma.ReusableAsset;
-import org.eclipse.epf.xml.uma.Roadmap;
-import org.eclipse.epf.xml.uma.Role;
-import org.eclipse.epf.xml.uma.RoleDescription;
-import org.eclipse.epf.xml.uma.RoleDescriptor;
-import org.eclipse.epf.xml.uma.RoleSet;
-import org.eclipse.epf.xml.uma.RoleSetGrouping;
-import org.eclipse.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.SupportingMaterial;
-import org.eclipse.epf.xml.uma.Task;
-import org.eclipse.epf.xml.uma.TaskDescription;
-import org.eclipse.epf.xml.uma.TaskDescriptor;
-import org.eclipse.epf.xml.uma.TeamProfile;
-import org.eclipse.epf.xml.uma.Template;
-import org.eclipse.epf.xml.uma.TermDefinition;
-import org.eclipse.epf.xml.uma.Tool;
-import org.eclipse.epf.xml.uma.ToolMentor;
-import org.eclipse.epf.xml.uma.UmaFactory;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.VariabilityType;
-import org.eclipse.epf.xml.uma.Whitepaper;
-import org.eclipse.epf.xml.uma.WorkBreakdownElement;
-import org.eclipse.epf.xml.uma.WorkDefinition;
-import org.eclipse.epf.xml.uma.WorkOrder;
-import org.eclipse.epf.xml.uma.WorkOrderType;
-import org.eclipse.epf.xml.uma.WorkProduct;
-import org.eclipse.epf.xml.uma.WorkProductDescription;
-import org.eclipse.epf.xml.uma.WorkProductDescriptor;
-import org.eclipse.epf.xml.uma.WorkProductType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class UmaFactoryImpl extends EFactoryImpl implements UmaFactory {
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static UmaFactory init() {
-		try {
-			UmaFactory theUmaFactory = (UmaFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/epf/uma/1.0.3"); 
-			if (theUmaFactory != null) {
-				return theUmaFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new UmaFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case UmaPackage.ACTIVITY: return (EObject)createActivity();
-			case UmaPackage.ACTIVITY_DESCRIPTION: return (EObject)createActivityDescription();
-			case UmaPackage.ARTIFACT: return (EObject)createArtifact();
-			case UmaPackage.ARTIFACT_DESCRIPTION: return (EObject)createArtifactDescription();
-			case UmaPackage.BREAKDOWN_ELEMENT: return (EObject)createBreakdownElement();
-			case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION: return (EObject)createBreakdownElementDescription();
-			case UmaPackage.CAPABILITY_PATTERN: return (EObject)createCapabilityPattern();
-			case UmaPackage.CHECKLIST: return (EObject)createChecklist();
-			case UmaPackage.COMPOSITE_ROLE: return (EObject)createCompositeRole();
-			case UmaPackage.CONCEPT: return (EObject)createConcept();
-			case UmaPackage.CONSTRAINT: return (EObject)createConstraint();
-			case UmaPackage.CONTENT_CATEGORY: return (EObject)createContentCategory();
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE: return (EObject)createContentCategoryPackage();
-			case UmaPackage.CONTENT_DESCRIPTION: return (EObject)createContentDescription();
-			case UmaPackage.CONTENT_ELEMENT: return (EObject)createContentElement();
-			case UmaPackage.CONTENT_PACKAGE: return (EObject)createContentPackage();
-			case UmaPackage.CUSTOM_CATEGORY: return (EObject)createCustomCategory();
-			case UmaPackage.DELIVERABLE: return (EObject)createDeliverable();
-			case UmaPackage.DELIVERABLE_DESCRIPTION: return (EObject)createDeliverableDescription();
-			case UmaPackage.DELIVERY_PROCESS: return (EObject)createDeliveryProcess();
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION: return (EObject)createDeliveryProcessDescription();
-			case UmaPackage.DESCRIBABLE_ELEMENT: return (EObject)createDescribableElement();
-			case UmaPackage.DESCRIPTOR: return (EObject)createDescriptor();
-			case UmaPackage.DESCRIPTOR_DESCRIPTION: return (EObject)createDescriptorDescription();
-			case UmaPackage.DISCIPLINE: return (EObject)createDiscipline();
-			case UmaPackage.DISCIPLINE_GROUPING: return (EObject)createDisciplineGrouping();
-			case UmaPackage.DOCUMENT_ROOT: return (EObject)createDocumentRoot();
-			case UmaPackage.DOMAIN: return (EObject)createDomain();
-			case UmaPackage.ELEMENT: return (EObject)createElement();
-			case UmaPackage.ESTIMATE: return (EObject)createEstimate();
-			case UmaPackage.ESTIMATING_METRIC: return (EObject)createEstimatingMetric();
-			case UmaPackage.ESTIMATION_CONSIDERATIONS: return (EObject)createEstimationConsiderations();
-			case UmaPackage.EXAMPLE: return (EObject)createExample();
-			case UmaPackage.GUIDANCE: return (EObject)createGuidance();
-			case UmaPackage.GUIDANCE_DESCRIPTION: return (EObject)createGuidanceDescription();
-			case UmaPackage.GUIDELINE: return (EObject)createGuideline();
-			case UmaPackage.ITERATION: return (EObject)createIteration();
-			case UmaPackage.METHOD_CONFIGURATION: return (EObject)createMethodConfiguration();
-			case UmaPackage.METHOD_ELEMENT: return (EObject)createMethodElement();
-			case UmaPackage.METHOD_ELEMENT_PROPERTY: return (EObject)createMethodElementProperty();
-			case UmaPackage.METHOD_LIBRARY: return (EObject)createMethodLibrary();
-			case UmaPackage.METHOD_PACKAGE: return (EObject)createMethodPackage();
-			case UmaPackage.METHOD_PLUGIN: return (EObject)createMethodPlugin();
-			case UmaPackage.METHOD_UNIT: return (EObject)createMethodUnit();
-			case UmaPackage.MILESTONE: return (EObject)createMilestone();
-			case UmaPackage.NAMED_ELEMENT: return (EObject)createNamedElement();
-			case UmaPackage.OUTCOME: return (EObject)createOutcome();
-			case UmaPackage.PACKAGEABLE_ELEMENT: return (EObject)createPackageableElement();
-			case UmaPackage.PHASE: return (EObject)createPhase();
-			case UmaPackage.PLANNING_DATA: return (EObject)createPlanningData();
-			case UmaPackage.PRACTICE: return (EObject)createPractice();
-			case UmaPackage.PRACTICE_DESCRIPTION: return (EObject)createPracticeDescription();
-			case UmaPackage.PROCESS: return (EObject)createProcess();
-			case UmaPackage.PROCESS_COMPONENT: return (EObject)createProcessComponent();
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE: return (EObject)createProcessComponentInterface();
-			case UmaPackage.PROCESS_DESCRIPTION: return (EObject)createProcessDescription();
-			case UmaPackage.PROCESS_ELEMENT: return (EObject)createProcessElement();
-			case UmaPackage.PROCESS_PACKAGE: return (EObject)createProcessPackage();
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE: return (EObject)createProcessPlanningTemplate();
-			case UmaPackage.REPORT: return (EObject)createReport();
-			case UmaPackage.REUSABLE_ASSET: return (EObject)createReusableAsset();
-			case UmaPackage.ROADMAP: return (EObject)createRoadmap();
-			case UmaPackage.ROLE: return (EObject)createRole();
-			case UmaPackage.ROLE_DESCRIPTION: return (EObject)createRoleDescription();
-			case UmaPackage.ROLE_DESCRIPTOR: return (EObject)createRoleDescriptor();
-			case UmaPackage.ROLE_SET: return (EObject)createRoleSet();
-			case UmaPackage.ROLE_SET_GROUPING: return (EObject)createRoleSetGrouping();
-			case UmaPackage.SECTION: return (EObject)createSection();
-			case UmaPackage.SUPPORTING_MATERIAL: return (EObject)createSupportingMaterial();
-			case UmaPackage.TASK: return (EObject)createTask();
-			case UmaPackage.TASK_DESCRIPTION: return (EObject)createTaskDescription();
-			case UmaPackage.TASK_DESCRIPTOR: return (EObject)createTaskDescriptor();
-			case UmaPackage.TEAM_PROFILE: return (EObject)createTeamProfile();
-			case UmaPackage.TEMPLATE: return (EObject)createTemplate();
-			case UmaPackage.TERM_DEFINITION: return (EObject)createTermDefinition();
-			case UmaPackage.TOOL: return (EObject)createTool();
-			case UmaPackage.TOOL_MENTOR: return (EObject)createToolMentor();
-			case UmaPackage.WHITEPAPER: return (EObject)createWhitepaper();
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT: return (EObject)createWorkBreakdownElement();
-			case UmaPackage.WORK_DEFINITION: return (EObject)createWorkDefinition();
-			case UmaPackage.WORK_ORDER: return (EObject)createWorkOrder();
-			case UmaPackage.WORK_PRODUCT: return (EObject)createWorkProduct();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION: return (EObject)createWorkProductDescription();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR: return (EObject)createWorkProductDescriptor();
-			case UmaPackage.WORK_PRODUCT_TYPE: return (EObject)createWorkProductType();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case UmaPackage.VARIABILITY_TYPE:
-				return createVariabilityTypeFromString(eDataType, initialValue);
-			case UmaPackage.WORK_ORDER_TYPE:
-				return createWorkOrderTypeFromString(eDataType, initialValue);
-			case UmaPackage.VARIABILITY_TYPE_OBJECT:
-				return createVariabilityTypeObjectFromString(eDataType, initialValue);
-			case UmaPackage.WORK_ORDER_TYPE_OBJECT:
-				return createWorkOrderTypeObjectFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case UmaPackage.VARIABILITY_TYPE:
-				return convertVariabilityTypeToString(eDataType, instanceValue);
-			case UmaPackage.WORK_ORDER_TYPE:
-				return convertWorkOrderTypeToString(eDataType, instanceValue);
-			case UmaPackage.VARIABILITY_TYPE_OBJECT:
-				return convertVariabilityTypeObjectToString(eDataType, instanceValue);
-			case UmaPackage.WORK_ORDER_TYPE_OBJECT:
-				return convertWorkOrderTypeObjectToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Activity createActivity() {
-		ActivityImpl activity = new ActivityImpl();
-		return activity;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActivityDescription createActivityDescription() {
-		ActivityDescriptionImpl activityDescription = new ActivityDescriptionImpl();
-		return activityDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Artifact createArtifact() {
-		ArtifactImpl artifact = new ArtifactImpl();
-		return artifact;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ArtifactDescription createArtifactDescription() {
-		ArtifactDescriptionImpl artifactDescription = new ArtifactDescriptionImpl();
-		return artifactDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElement createBreakdownElement() {
-		BreakdownElementImpl breakdownElement = new BreakdownElementImpl();
-		return breakdownElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BreakdownElementDescription createBreakdownElementDescription() {
-		BreakdownElementDescriptionImpl breakdownElementDescription = new BreakdownElementDescriptionImpl();
-		return breakdownElementDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CapabilityPattern createCapabilityPattern() {
-		CapabilityPatternImpl capabilityPattern = new CapabilityPatternImpl();
-		return capabilityPattern;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Checklist createChecklist() {
-		ChecklistImpl checklist = new ChecklistImpl();
-		return checklist;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CompositeRole createCompositeRole() {
-		CompositeRoleImpl compositeRole = new CompositeRoleImpl();
-		return compositeRole;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Concept createConcept() {
-		ConceptImpl concept = new ConceptImpl();
-		return concept;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Constraint createConstraint() {
-		ConstraintImpl constraint = new ConstraintImpl();
-		return constraint;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentCategory createContentCategory() {
-		ContentCategoryImpl contentCategory = new ContentCategoryImpl();
-		return contentCategory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentCategoryPackage createContentCategoryPackage() {
-		ContentCategoryPackageImpl contentCategoryPackage = new ContentCategoryPackageImpl();
-		return contentCategoryPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentDescription createContentDescription() {
-		ContentDescriptionImpl contentDescription = new ContentDescriptionImpl();
-		return contentDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentElement createContentElement() {
-		ContentElementImpl contentElement = new ContentElementImpl();
-		return contentElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ContentPackage createContentPackage() {
-		ContentPackageImpl contentPackage = new ContentPackageImpl();
-		return contentPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public CustomCategory createCustomCategory() {
-		CustomCategoryImpl customCategory = new CustomCategoryImpl();
-		return customCategory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Deliverable createDeliverable() {
-		DeliverableImpl deliverable = new DeliverableImpl();
-		return deliverable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliverableDescription createDeliverableDescription() {
-		DeliverableDescriptionImpl deliverableDescription = new DeliverableDescriptionImpl();
-		return deliverableDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliveryProcess createDeliveryProcess() {
-		DeliveryProcessImpl deliveryProcess = new DeliveryProcessImpl();
-		return deliveryProcess;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DeliveryProcessDescription createDeliveryProcessDescription() {
-		DeliveryProcessDescriptionImpl deliveryProcessDescription = new DeliveryProcessDescriptionImpl();
-		return deliveryProcessDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescribableElement createDescribableElement() {
-		DescribableElementImpl describableElement = new DescribableElementImpl();
-		return describableElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Descriptor createDescriptor() {
-		DescriptorImpl descriptor = new DescriptorImpl();
-		return descriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptorDescription createDescriptorDescription() {
-		DescriptorDescriptionImpl descriptorDescription = new DescriptorDescriptionImpl();
-		return descriptorDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Discipline createDiscipline() {
-		DisciplineImpl discipline = new DisciplineImpl();
-		return discipline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisciplineGrouping createDisciplineGrouping() {
-		DisciplineGroupingImpl disciplineGrouping = new DisciplineGroupingImpl();
-		return disciplineGrouping;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DocumentRoot createDocumentRoot() {
-		DocumentRootImpl documentRoot = new DocumentRootImpl();
-		return documentRoot;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Domain createDomain() {
-		DomainImpl domain = new DomainImpl();
-		return domain;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Element createElement() {
-		ElementImpl element = new ElementImpl();
-		return element;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Estimate createEstimate() {
-		EstimateImpl estimate = new EstimateImpl();
-		return estimate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EstimatingMetric createEstimatingMetric() {
-		EstimatingMetricImpl estimatingMetric = new EstimatingMetricImpl();
-		return estimatingMetric;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EstimationConsiderations createEstimationConsiderations() {
-		EstimationConsiderationsImpl estimationConsiderations = new EstimationConsiderationsImpl();
-		return estimationConsiderations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Example createExample() {
-		ExampleImpl example = new ExampleImpl();
-		return example;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Guidance createGuidance() {
-		GuidanceImpl guidance = new GuidanceImpl();
-		return guidance;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public GuidanceDescription createGuidanceDescription() {
-		GuidanceDescriptionImpl guidanceDescription = new GuidanceDescriptionImpl();
-		return guidanceDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Guideline createGuideline() {
-		GuidelineImpl guideline = new GuidelineImpl();
-		return guideline;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Iteration createIteration() {
-		IterationImpl iteration = new IterationImpl();
-		return iteration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodConfiguration createMethodConfiguration() {
-		MethodConfigurationImpl methodConfiguration = new MethodConfigurationImpl();
-		return methodConfiguration;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElement createMethodElement() {
-		MethodElementImpl methodElement = new MethodElementImpl();
-		return methodElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodElementProperty createMethodElementProperty() {
-		MethodElementPropertyImpl methodElementProperty = new MethodElementPropertyImpl();
-		return methodElementProperty;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodLibrary createMethodLibrary() {
-		MethodLibraryImpl methodLibrary = new MethodLibraryImpl();
-		return methodLibrary;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodPackage createMethodPackage() {
-		MethodPackageImpl methodPackage = new MethodPackageImpl();
-		return methodPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodPlugin createMethodPlugin() {
-		MethodPluginImpl methodPlugin = new MethodPluginImpl();
-		return methodPlugin;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MethodUnit createMethodUnit() {
-		MethodUnitImpl methodUnit = new MethodUnitImpl();
-		return methodUnit;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Milestone createMilestone() {
-		MilestoneImpl milestone = new MilestoneImpl();
-		return milestone;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NamedElement createNamedElement() {
-		NamedElementImpl namedElement = new NamedElementImpl();
-		return namedElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Outcome createOutcome() {
-		OutcomeImpl outcome = new OutcomeImpl();
-		return outcome;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PackageableElement createPackageableElement() {
-		PackageableElementImpl packageableElement = new PackageableElementImpl();
-		return packageableElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Phase createPhase() {
-		PhaseImpl phase = new PhaseImpl();
-		return phase;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PlanningData createPlanningData() {
-		PlanningDataImpl planningData = new PlanningDataImpl();
-		return planningData;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Practice createPractice() {
-		PracticeImpl practice = new PracticeImpl();
-		return practice;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PracticeDescription createPracticeDescription() {
-		PracticeDescriptionImpl practiceDescription = new PracticeDescriptionImpl();
-		return practiceDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public org.eclipse.epf.xml.uma.Process createProcess() {
-		ProcessImpl process = new ProcessImpl();
-		return process;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponent createProcessComponent() {
-		ProcessComponentImpl processComponent = new ProcessComponentImpl();
-		return processComponent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessComponentInterface createProcessComponentInterface() {
-		ProcessComponentInterfaceImpl processComponentInterface = new ProcessComponentInterfaceImpl();
-		return processComponentInterface;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessDescription createProcessDescription() {
-		ProcessDescriptionImpl processDescription = new ProcessDescriptionImpl();
-		return processDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessElement createProcessElement() {
-		ProcessElementImpl processElement = new ProcessElementImpl();
-		return processElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessPackage createProcessPackage() {
-		ProcessPackageImpl processPackage = new ProcessPackageImpl();
-		return processPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ProcessPlanningTemplate createProcessPlanningTemplate() {
-		ProcessPlanningTemplateImpl processPlanningTemplate = new ProcessPlanningTemplateImpl();
-		return processPlanningTemplate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Report createReport() {
-		ReportImpl report = new ReportImpl();
-		return report;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReusableAsset createReusableAsset() {
-		ReusableAssetImpl reusableAsset = new ReusableAssetImpl();
-		return reusableAsset;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Roadmap createRoadmap() {
-		RoadmapImpl roadmap = new RoadmapImpl();
-		return roadmap;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Role createRole() {
-		RoleImpl role = new RoleImpl();
-		return role;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescription createRoleDescription() {
-		RoleDescriptionImpl roleDescription = new RoleDescriptionImpl();
-		return roleDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleDescriptor createRoleDescriptor() {
-		RoleDescriptorImpl roleDescriptor = new RoleDescriptorImpl();
-		return roleDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleSet createRoleSet() {
-		RoleSetImpl roleSet = new RoleSetImpl();
-		return roleSet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RoleSetGrouping createRoleSetGrouping() {
-		RoleSetGroupingImpl roleSetGrouping = new RoleSetGroupingImpl();
-		return roleSetGrouping;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Section createSection() {
-		SectionImpl section = new SectionImpl();
-		return section;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportingMaterial createSupportingMaterial() {
-		SupportingMaterialImpl supportingMaterial = new SupportingMaterialImpl();
-		return supportingMaterial;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Task createTask() {
-		TaskImpl task = new TaskImpl();
-		return task;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskDescription createTaskDescription() {
-		TaskDescriptionImpl taskDescription = new TaskDescriptionImpl();
-		return taskDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TaskDescriptor createTaskDescriptor() {
-		TaskDescriptorImpl taskDescriptor = new TaskDescriptorImpl();
-		return taskDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TeamProfile createTeamProfile() {
-		TeamProfileImpl teamProfile = new TeamProfileImpl();
-		return teamProfile;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Template createTemplate() {
-		TemplateImpl template = new TemplateImpl();
-		return template;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TermDefinition createTermDefinition() {
-		TermDefinitionImpl termDefinition = new TermDefinitionImpl();
-		return termDefinition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Tool createTool() {
-		ToolImpl tool = new ToolImpl();
-		return tool;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToolMentor createToolMentor() {
-		ToolMentorImpl toolMentor = new ToolMentorImpl();
-		return toolMentor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Whitepaper createWhitepaper() {
-		WhitepaperImpl whitepaper = new WhitepaperImpl();
-		return whitepaper;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkBreakdownElement createWorkBreakdownElement() {
-		WorkBreakdownElementImpl workBreakdownElement = new WorkBreakdownElementImpl();
-		return workBreakdownElement;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkDefinition createWorkDefinition() {
-		WorkDefinitionImpl workDefinition = new WorkDefinitionImpl();
-		return workDefinition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrder createWorkOrder() {
-		WorkOrderImpl workOrder = new WorkOrderImpl();
-		return workOrder;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProduct createWorkProduct() {
-		WorkProductImpl workProduct = new WorkProductImpl();
-		return workProduct;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescription createWorkProductDescription() {
-		WorkProductDescriptionImpl workProductDescription = new WorkProductDescriptionImpl();
-		return workProductDescription;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductDescriptor createWorkProductDescriptor() {
-		WorkProductDescriptorImpl workProductDescriptor = new WorkProductDescriptorImpl();
-		return workProductDescriptor;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkProductType createWorkProductType() {
-		WorkProductTypeImpl workProductType = new WorkProductTypeImpl();
-		return workProductType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType createVariabilityTypeFromString(EDataType eDataType, String initialValue) {
-		VariabilityType result = VariabilityType.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertVariabilityTypeToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrderType createWorkOrderTypeFromString(EDataType eDataType, String initialValue) {
-		WorkOrderType result = WorkOrderType.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWorkOrderTypeToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariabilityType createVariabilityTypeObjectFromString(EDataType eDataType, String initialValue) {
-		return createVariabilityTypeFromString(UmaPackage.Literals.VARIABILITY_TYPE, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertVariabilityTypeObjectToString(EDataType eDataType, Object instanceValue) {
-		return convertVariabilityTypeToString(UmaPackage.Literals.VARIABILITY_TYPE, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrderType createWorkOrderTypeObjectFromString(EDataType eDataType, String initialValue) {
-		return createWorkOrderTypeFromString(UmaPackage.Literals.WORK_ORDER_TYPE, initialValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertWorkOrderTypeObjectToString(EDataType eDataType, Object instanceValue) {
-		return convertWorkOrderTypeToString(UmaPackage.Literals.WORK_ORDER_TYPE, instanceValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaPackage getUmaPackage() {
-		return (UmaPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static UmaPackage getPackage() {
-		return UmaPackage.eINSTANCE;
-	}
-
-} //UmaFactoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/UmaPackageImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/UmaPackageImpl.java
deleted file mode 100644
index 850f3d3..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/UmaPackageImpl.java
+++ /dev/null
@@ -1,7140 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaPackageImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EEnum;
-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.type.XMLTypePackage;
-
-import org.eclipse.epf.xml.uma.Activity;
-import org.eclipse.epf.xml.uma.ActivityDescription;
-import org.eclipse.epf.xml.uma.Artifact;
-import org.eclipse.epf.xml.uma.ArtifactDescription;
-import org.eclipse.epf.xml.uma.BreakdownElement;
-import org.eclipse.epf.xml.uma.BreakdownElementDescription;
-import org.eclipse.epf.xml.uma.CapabilityPattern;
-import org.eclipse.epf.xml.uma.Checklist;
-import org.eclipse.epf.xml.uma.CompositeRole;
-import org.eclipse.epf.xml.uma.Concept;
-import org.eclipse.epf.xml.uma.Constraint;
-import org.eclipse.epf.xml.uma.ContentCategory;
-import org.eclipse.epf.xml.uma.ContentCategoryPackage;
-import org.eclipse.epf.xml.uma.ContentDescription;
-import org.eclipse.epf.xml.uma.ContentElement;
-import org.eclipse.epf.xml.uma.ContentPackage;
-import org.eclipse.epf.xml.uma.CustomCategory;
-import org.eclipse.epf.xml.uma.Deliverable;
-import org.eclipse.epf.xml.uma.DeliverableDescription;
-import org.eclipse.epf.xml.uma.DeliveryProcess;
-import org.eclipse.epf.xml.uma.DeliveryProcessDescription;
-import org.eclipse.epf.xml.uma.DescribableElement;
-import org.eclipse.epf.xml.uma.DescriptorDescription;
-import org.eclipse.epf.xml.uma.Discipline;
-import org.eclipse.epf.xml.uma.DisciplineGrouping;
-import org.eclipse.epf.xml.uma.DocumentRoot;
-import org.eclipse.epf.xml.uma.Domain;
-import org.eclipse.epf.xml.uma.Element;
-import org.eclipse.epf.xml.uma.Estimate;
-import org.eclipse.epf.xml.uma.EstimatingMetric;
-import org.eclipse.epf.xml.uma.EstimationConsiderations;
-import org.eclipse.epf.xml.uma.Example;
-import org.eclipse.epf.xml.uma.Guidance;
-import org.eclipse.epf.xml.uma.GuidanceDescription;
-import org.eclipse.epf.xml.uma.Guideline;
-import org.eclipse.epf.xml.uma.Iteration;
-import org.eclipse.epf.xml.uma.MethodConfiguration;
-import org.eclipse.epf.xml.uma.MethodElement;
-import org.eclipse.epf.xml.uma.MethodElementProperty;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.MethodUnit;
-import org.eclipse.epf.xml.uma.Milestone;
-import org.eclipse.epf.xml.uma.NamedElement;
-import org.eclipse.epf.xml.uma.Outcome;
-import org.eclipse.epf.xml.uma.PackageableElement;
-import org.eclipse.epf.xml.uma.Phase;
-import org.eclipse.epf.xml.uma.PlanningData;
-import org.eclipse.epf.xml.uma.Practice;
-import org.eclipse.epf.xml.uma.PracticeDescription;
-import org.eclipse.epf.xml.uma.ProcessComponent;
-import org.eclipse.epf.xml.uma.ProcessComponentInterface;
-import org.eclipse.epf.xml.uma.ProcessDescription;
-import org.eclipse.epf.xml.uma.ProcessElement;
-import org.eclipse.epf.xml.uma.ProcessPackage;
-import org.eclipse.epf.xml.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.xml.uma.Report;
-import org.eclipse.epf.xml.uma.ReusableAsset;
-import org.eclipse.epf.xml.uma.Roadmap;
-import org.eclipse.epf.xml.uma.Role;
-import org.eclipse.epf.xml.uma.RoleDescription;
-import org.eclipse.epf.xml.uma.RoleDescriptor;
-import org.eclipse.epf.xml.uma.RoleSet;
-import org.eclipse.epf.xml.uma.RoleSetGrouping;
-import org.eclipse.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.SupportingMaterial;
-import org.eclipse.epf.xml.uma.Task;
-import org.eclipse.epf.xml.uma.TaskDescription;
-import org.eclipse.epf.xml.uma.TaskDescriptor;
-import org.eclipse.epf.xml.uma.TeamProfile;
-import org.eclipse.epf.xml.uma.Template;
-import org.eclipse.epf.xml.uma.TermDefinition;
-import org.eclipse.epf.xml.uma.Tool;
-import org.eclipse.epf.xml.uma.ToolMentor;
-import org.eclipse.epf.xml.uma.UmaFactory;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.VariabilityType;
-import org.eclipse.epf.xml.uma.Whitepaper;
-import org.eclipse.epf.xml.uma.WorkBreakdownElement;
-import org.eclipse.epf.xml.uma.WorkDefinition;
-import org.eclipse.epf.xml.uma.WorkOrder;
-import org.eclipse.epf.xml.uma.WorkOrderType;
-import org.eclipse.epf.xml.uma.WorkProduct;
-import org.eclipse.epf.xml.uma.WorkProductDescription;
-import org.eclipse.epf.xml.uma.WorkProductDescriptor;
-import org.eclipse.epf.xml.uma.WorkProductType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class UmaPackageImpl extends EPackageImpl implements UmaPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass activityDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass artifactEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass artifactDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass breakdownElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass breakdownElementDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass capabilityPatternEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass checklistEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass compositeRoleEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass conceptEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass constraintEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentCategoryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentCategoryPackageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass contentPackageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass customCategoryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliverableEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliverableDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliveryProcessEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass deliveryProcessDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass describableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass descriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass descriptorDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass disciplineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass disciplineGroupingEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass documentRootEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass domainEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass elementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass estimateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass estimatingMetricEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass estimationConsiderationsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass exampleEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass guidanceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass guidanceDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass guidelineEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass iterationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodConfigurationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodElementPropertyEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodLibraryEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodPackageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodPluginEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass methodUnitEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass milestoneEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass namedElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass outcomeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass packageableElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass phaseEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass planningDataEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass practiceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass practiceDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processComponentEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processComponentInterfaceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processPackageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass processPlanningTemplateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass reportEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass reusableAssetEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roadmapEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleSetEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass roleSetGroupingEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sectionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass supportingMaterialEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass taskDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass teamProfileEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass templateEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass termDefinitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass toolEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass toolMentorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass whitepaperEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workBreakdownElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workDefinitionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workOrderEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductDescriptionEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductDescriptorEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass workProductTypeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum variabilityTypeEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum workOrderTypeEEnum = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType variabilityTypeObjectEDataType = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EDataType workOrderTypeObjectEDataType = 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.epf.xml.uma.UmaPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private UmaPackageImpl() {
-		super(eNS_URI, UmaFactory.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.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static UmaPackage init() {
-		if (isInited) return (UmaPackage)EPackage.Registry.INSTANCE.getEPackage(UmaPackage.eNS_URI);
-
-		// Obtain or create and register package
-		UmaPackageImpl theUmaPackage = (UmaPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof UmaPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new UmaPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		XMLTypePackage.eINSTANCE.eClass();
-
-		// Create package meta-data objects
-		theUmaPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theUmaPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theUmaPackage.freeze();
-
-		return theUmaPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivity() {
-		return activityEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Precondition() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Postcondition() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Group2() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getActivity_BreakdownElement() {
-		return (EReference)activityEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Checklist() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Concept() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Example() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Guideline() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Roadmap() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_ReusableAsset() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_SupportingMaterial() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_Whitepaper() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_IsEnactable() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(12);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_VariabilityBasedOnElement() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(13);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivity_VariabilityType() {
-		return (EAttribute)activityEClass.getEStructuralFeatures().get(14);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActivityDescription() {
-		return activityDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityDescription_Alternatives() {
-		return (EAttribute)activityDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityDescription_HowToStaff() {
-		return (EAttribute)activityDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActivityDescription_Purpose() {
-		return (EAttribute)activityDescriptionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArtifact() {
-		return artifactEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifact_Group3() {
-		return (EAttribute)artifactEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getArtifact_ContainedArtifact() {
-		return (EReference)artifactEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getArtifactDescription() {
-		return artifactDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_BriefOutline() {
-		return (EAttribute)artifactDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_RepresentationOptions() {
-		return (EAttribute)artifactDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_Representation() {
-		return (EAttribute)artifactDescriptionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getArtifactDescription_Notation() {
-		return (EAttribute)artifactDescriptionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBreakdownElement() {
-		return breakdownElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_PresentedAfter() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_PresentedBefore() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_PlanningData() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_SuperActivity() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_HasMultipleOccurrences() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_IsOptional() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_IsPlanned() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElement_Prefix() {
-		return (EAttribute)breakdownElementEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBreakdownElementDescription() {
-		return breakdownElementDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBreakdownElementDescription_UsageGuidance() {
-		return (EAttribute)breakdownElementDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCapabilityPattern() {
-		return capabilityPatternEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getChecklist() {
-		return checklistEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCompositeRole() {
-		return compositeRoleEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCompositeRole_Group1() {
-		return (EAttribute)compositeRoleEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getCompositeRole_AggregatedRole() {
-		return (EReference)compositeRoleEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConcept() {
-		return conceptEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConstraint() {
-		return constraintEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConstraint_MainDescription() {
-		return (EAttribute)constraintEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentCategory() {
-		return contentCategoryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentCategoryPackage() {
-		return contentCategoryPackageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentCategoryPackage_Group2() {
-		return (EAttribute)contentCategoryPackageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentCategoryPackage_ContentCategory() {
-		return (EReference)contentCategoryPackageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentDescription() {
-		return contentDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentDescription_MainDescription() {
-		return (EAttribute)contentDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentDescription_KeyConsiderations() {
-		return (EAttribute)contentDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentDescription_Section() {
-		return (EReference)contentDescriptionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentDescription_ExternalId() {
-		return (EAttribute)contentDescriptionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentElement() {
-		return contentElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_Group1() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_Checklist() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_Concept() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_Example() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_Guideline() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_ReusableAsset() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_SupportingMaterial() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_Whitepaper() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_VariabilityBasedOnElement() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentElement_VariabilityType() {
-		return (EAttribute)contentElementEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getContentPackage() {
-		return contentPackageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getContentPackage_Group2() {
-		return (EAttribute)contentPackageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getContentPackage_ContentElement() {
-		return (EReference)contentPackageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getCustomCategory() {
-		return customCategoryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCustomCategory_Group2() {
-		return (EAttribute)customCategoryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCustomCategory_CategorizedElement() {
-		return (EAttribute)customCategoryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getCustomCategory_SubCategory() {
-		return (EAttribute)customCategoryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliverable() {
-		return deliverableEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliverable_Group3() {
-		return (EAttribute)deliverableEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliverable_DeliveredWorkProduct() {
-		return (EAttribute)deliverableEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliverableDescription() {
-		return deliverableDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliverableDescription_ExternalDescription() {
-		return (EAttribute)deliverableDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliverableDescription_PackagingGuidance() {
-		return (EAttribute)deliverableDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliveryProcess() {
-		return deliveryProcessEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcess_Group3() {
-		return (EAttribute)deliveryProcessEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcess_CommunicationsMaterial() {
-		return (EAttribute)deliveryProcessEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcess_EducationMaterial() {
-		return (EAttribute)deliveryProcessEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDeliveryProcessDescription() {
-		return deliveryProcessDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_Scale() {
-		return (EAttribute)deliveryProcessDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_ProjectCharacteristics() {
-		return (EAttribute)deliveryProcessDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_RiskLevel() {
-		return (EAttribute)deliveryProcessDescriptionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_EstimatingTechnique() {
-		return (EAttribute)deliveryProcessDescriptionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_ProjectMemberExpertise() {
-		return (EAttribute)deliveryProcessDescriptionEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDeliveryProcessDescription_TypeOfContract() {
-		return (EAttribute)deliveryProcessDescriptionEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescribableElement() {
-		return describableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDescribableElement_Presentation() {
-		return (EReference)describableElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescribableElement_Nodeicon() {
-		return (EAttribute)describableElementEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescribableElement_PresentationName() {
-		return (EAttribute)describableElementEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescribableElement_Shapeicon() {
-		return (EAttribute)describableElementEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescriptor() {
-		return descriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptor_IsSynchronizedWithSource() {
-		return (EAttribute)descriptorEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescriptorDescription() {
-		return descriptorDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptorDescription_RefinedDescription() {
-		return (EAttribute)descriptorDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDiscipline() {
-		return disciplineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDiscipline_Group2() {
-		return (EAttribute)disciplineEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDiscipline_Task() {
-		return (EAttribute)disciplineEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDiscipline_SubDiscipline() {
-		return (EReference)disciplineEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDiscipline_ReferenceWorkflow() {
-		return (EAttribute)disciplineEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDisciplineGrouping() {
-		return disciplineGroupingEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisciplineGrouping_Group2() {
-		return (EAttribute)disciplineGroupingEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisciplineGrouping_Discipline() {
-		return (EAttribute)disciplineGroupingEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDocumentRoot() {
-		return documentRootEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDocumentRoot_Mixed() {
-		return (EAttribute)documentRootEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XMLNSPrefixMap() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XSISchemaLocation() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MethodConfiguration() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MethodLibrary() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MethodPlugin() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDomain() {
-		return domainEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDomain_Group2() {
-		return (EAttribute)domainEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDomain_WorkProduct() {
-		return (EAttribute)domainEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDomain_Subdomain() {
-		return (EReference)domainEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getElement() {
-		return elementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEstimate() {
-		return estimateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEstimate_Group2() {
-		return (EAttribute)estimateEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEstimate_EstimationMetric() {
-		return (EAttribute)estimateEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getEstimate_EstimationConsiderations() {
-		return (EAttribute)estimateEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEstimatingMetric() {
-		return estimatingMetricEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getEstimationConsiderations() {
-		return estimationConsiderationsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExample() {
-		return exampleEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGuidance() {
-		return guidanceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGuidanceDescription() {
-		return guidanceDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getGuidanceDescription_Attachment() {
-		return (EAttribute)guidanceDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getGuideline() {
-		return guidelineEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIteration() {
-		return iterationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodConfiguration() {
-		return methodConfigurationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodConfiguration_BaseConfiguration() {
-		return (EAttribute)methodConfigurationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodConfiguration_MethodPluginSelection() {
-		return (EAttribute)methodConfigurationEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodConfiguration_MethodPackageSelection() {
-		return (EAttribute)methodConfigurationEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodConfiguration_DefaultView() {
-		return (EAttribute)methodConfigurationEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodConfiguration_ProcessView() {
-		return (EAttribute)methodConfigurationEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodConfiguration_SubtractedCategory() {
-		return (EAttribute)methodConfigurationEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodConfiguration_AddedCategory() {
-		return (EAttribute)methodConfigurationEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodElement() {
-		return methodElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_Group() {
-		return (EAttribute)methodElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodElement_OwnedRule() {
-		return (EReference)methodElementEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodElement_MethodElementProperty() {
-		return (EReference)methodElementEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_BriefDescription() {
-		return (EAttribute)methodElementEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_Id() {
-		return (EAttribute)methodElementEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_OrderingGuide() {
-		return (EAttribute)methodElementEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElement_Suppressed() {
-		return (EAttribute)methodElementEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodElementProperty() {
-		return methodElementPropertyEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodElementProperty_Value() {
-		return (EAttribute)methodElementPropertyEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodLibrary() {
-		return methodLibraryEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodLibrary_MethodPlugin() {
-		return (EReference)methodLibraryEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodLibrary_MethodConfiguration() {
-		return (EReference)methodLibraryEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodLibrary_Tool() {
-		return (EAttribute)methodLibraryEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodPackage() {
-		return methodPackageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodPackage_Group1() {
-		return (EAttribute)methodPackageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodPackage_ReusedPackage() {
-		return (EAttribute)methodPackageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodPackage_MethodPackage() {
-		return (EReference)methodPackageEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodPackage_Global() {
-		return (EAttribute)methodPackageEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodPlugin() {
-		return methodPluginEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodPlugin_ReferencedMethodPlugin() {
-		return (EAttribute)methodPluginEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMethodPlugin_MethodPackage() {
-		return (EReference)methodPluginEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodPlugin_UserChangeable() {
-		return (EAttribute)methodPluginEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMethodUnit() {
-		return methodUnitEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_Copyright() {
-		return (EAttribute)methodUnitEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_Authors() {
-		return (EAttribute)methodUnitEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_ChangeDate() {
-		return (EAttribute)methodUnitEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_ChangeDescription() {
-		return (EAttribute)methodUnitEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMethodUnit_Version() {
-		return (EAttribute)methodUnitEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMilestone() {
-		return milestoneEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNamedElement() {
-		return namedElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNamedElement_Name() {
-		return (EAttribute)namedElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOutcome() {
-		return outcomeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPackageableElement() {
-		return packageableElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPhase() {
-		return phaseEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPlanningData() {
-		return planningDataEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlanningData_FinishDate() {
-		return (EAttribute)planningDataEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlanningData_Rank() {
-		return (EAttribute)planningDataEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPlanningData_StartDate() {
-		return (EAttribute)planningDataEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPractice() {
-		return practiceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPractice_Group2() {
-		return (EAttribute)practiceEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPractice_ActivityReference() {
-		return (EAttribute)practiceEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPractice_ContentReference() {
-		return (EAttribute)practiceEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPractice_SubPractice() {
-		return (EReference)practiceEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPracticeDescription() {
-		return practiceDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_AdditionalInfo() {
-		return (EAttribute)practiceDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Application() {
-		return (EAttribute)practiceDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Background() {
-		return (EAttribute)practiceDescriptionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Goals() {
-		return (EAttribute)practiceDescriptionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_LevelsOfAdoption() {
-		return (EAttribute)practiceDescriptionEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPracticeDescription_Problem() {
-		return (EAttribute)practiceDescriptionEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcess() {
-		return processEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcess_IncludesPattern() {
-		return (EAttribute)processEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcess_DefaultContext() {
-		return (EAttribute)processEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcess_ValidContext() {
-		return (EAttribute)processEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcess_DiagramURI() {
-		return (EAttribute)processEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessComponent() {
-		return processComponentEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessComponent_Copyright() {
-		return (EAttribute)processComponentEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponent_Interface() {
-		return (EReference)processComponentEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponent_Process() {
-		return (EReference)processComponentEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessComponent_Authors() {
-		return (EAttribute)processComponentEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessComponent_ChangeDate() {
-		return (EAttribute)processComponentEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessComponent_ChangeDescription() {
-		return (EAttribute)processComponentEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessComponent_Version() {
-		return (EAttribute)processComponentEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessComponentInterface() {
-		return processComponentInterfaceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessComponentInterface_Group1() {
-		return (EAttribute)processComponentInterfaceEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponentInterface_InterfaceSpecification() {
-		return (EReference)processComponentInterfaceEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessComponentInterface_InterfaceIO() {
-		return (EReference)processComponentInterfaceEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessDescription() {
-		return processDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessDescription_Scope() {
-		return (EAttribute)processDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessDescription_UsageNotes() {
-		return (EAttribute)processDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessElement() {
-		return processElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessPackage() {
-		return processPackageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessPackage_Group2() {
-		return (EAttribute)processPackageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getProcessPackage_ProcessElement() {
-		return (EReference)processPackageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getProcessPlanningTemplate() {
-		return processPlanningTemplateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessPlanningTemplate_Group3() {
-		return (EAttribute)processPlanningTemplateEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getProcessPlanningTemplate_BaseProcess() {
-		return (EAttribute)processPlanningTemplateEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReport() {
-		return reportEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReusableAsset() {
-		return reusableAssetEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoadmap() {
-		return roadmapEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRole() {
-		return roleEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRole_Group2() {
-		return (EAttribute)roleEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRole_ResponsibleFor() {
-		return (EAttribute)roleEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleDescription() {
-		return roleDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescription_AssignmentApproaches() {
-		return (EAttribute)roleDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescription_Skills() {
-		return (EAttribute)roleDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescription_Synonyms() {
-		return (EAttribute)roleDescriptionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleDescriptor() {
-		return roleDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescriptor_Role() {
-		return (EAttribute)roleDescriptorEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleDescriptor_ResponsibleFor() {
-		return (EAttribute)roleDescriptorEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleSet() {
-		return roleSetEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleSet_Group2() {
-		return (EAttribute)roleSetEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleSet_Role() {
-		return (EAttribute)roleSetEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRoleSetGrouping() {
-		return roleSetGroupingEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleSetGrouping_Group2() {
-		return (EAttribute)roleSetGroupingEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRoleSetGrouping_RoleSet() {
-		return (EAttribute)roleSetGroupingEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSection() {
-		return sectionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSection_SubSection() {
-		return (EReference)sectionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSection_Predecessor() {
-		return (EAttribute)sectionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSection_Description() {
-		return (EAttribute)sectionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSection_SectionName() {
-		return (EAttribute)sectionEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSection_VariabilityBasedOnElement() {
-		return (EAttribute)sectionEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSection_VariabilityType() {
-		return (EAttribute)sectionEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSupportingMaterial() {
-		return supportingMaterialEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTask() {
-		return taskEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Precondition() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Postcondition() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_PerformedBy() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Group2() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_MandatoryInput() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Output() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_AdditionallyPerformedBy() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_OptionalInput() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_Estimate() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_EstimationConsiderations() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTask_ToolMentor() {
-		return (EAttribute)taskEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTaskDescription() {
-		return taskDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescription_Alternatives() {
-		return (EAttribute)taskDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescription_Purpose() {
-		return (EAttribute)taskDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTaskDescriptor() {
-		return taskDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_Task() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_PerformedPrimarilyBy() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_Group2() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_AdditionallyPerformedBy() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_AssistedBy() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_ExternalInput() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_MandatoryInput() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_OptionalInput() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_Output() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTaskDescriptor_Step() {
-		return (EReference)taskDescriptorEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTaskDescriptor_IsSynchronizedWithSource() {
-		return (EAttribute)taskDescriptorEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTeamProfile() {
-		return teamProfileEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTeamProfile_Group1() {
-		return (EAttribute)teamProfileEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTeamProfile_Role() {
-		return (EAttribute)teamProfileEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTeamProfile_SuperTeam() {
-		return (EAttribute)teamProfileEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTeamProfile_SubTeam() {
-		return (EAttribute)teamProfileEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTemplate() {
-		return templateEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTermDefinition() {
-		return termDefinitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTool() {
-		return toolEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTool_Group2() {
-		return (EAttribute)toolEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTool_ToolMentor() {
-		return (EAttribute)toolEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getToolMentor() {
-		return toolMentorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWhitepaper() {
-		return whitepaperEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkBreakdownElement() {
-		return workBreakdownElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkBreakdownElement_Group1() {
-		return (EAttribute)workBreakdownElementEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getWorkBreakdownElement_Predecessor() {
-		return (EReference)workBreakdownElementEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkBreakdownElement_IsEventDriven() {
-		return (EAttribute)workBreakdownElementEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkBreakdownElement_IsOngoing() {
-		return (EAttribute)workBreakdownElementEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkBreakdownElement_IsRepeatable() {
-		return (EAttribute)workBreakdownElementEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkDefinition() {
-		return workDefinitionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkDefinition_Precondition() {
-		return (EAttribute)workDefinitionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkDefinition_Postcondition() {
-		return (EAttribute)workDefinitionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkOrder() {
-		return workOrderEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkOrder_Value() {
-		return (EAttribute)workOrderEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkOrder_Id() {
-		return (EAttribute)workOrderEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkOrder_LinkType() {
-		return (EAttribute)workOrderEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProduct() {
-		return workProductEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProduct_Group2() {
-		return (EAttribute)workProductEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProduct_Estimate() {
-		return (EAttribute)workProductEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProduct_EstimationConsiderations() {
-		return (EAttribute)workProductEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProduct_Report() {
-		return (EAttribute)workProductEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProduct_Template() {
-		return (EAttribute)workProductEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProduct_ToolMentor() {
-		return (EAttribute)workProductEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductDescription() {
-		return workProductDescriptionEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescription_ImpactOfNotHaving() {
-		return (EAttribute)workProductDescriptionEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescription_Purpose() {
-		return (EAttribute)workProductDescriptionEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescription_ReasonsForNotNeeding() {
-		return (EAttribute)workProductDescriptionEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductDescriptor() {
-		return workProductDescriptorEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_WorkProduct() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_ResponsibleRole() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_Group1() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_ExternalInputTo() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_ImpactedBy() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_Impacts() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_MandatoryInputTo() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_OptionalInputTo() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_OutputFrom() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_DeliverableParts() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_ActivityEntryState() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductDescriptor_ActivityExitState() {
-		return (EAttribute)workProductDescriptorEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getWorkProductType() {
-		return workProductTypeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductType_Group2() {
-		return (EAttribute)workProductTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getWorkProductType_WorkProduct() {
-		return (EAttribute)workProductTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getVariabilityType() {
-		return variabilityTypeEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getWorkOrderType() {
-		return workOrderTypeEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getVariabilityTypeObject() {
-		return variabilityTypeObjectEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EDataType getWorkOrderTypeObject() {
-		return workOrderTypeObjectEDataType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaFactory getUmaFactory() {
-		return (UmaFactory)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
-		activityEClass = createEClass(ACTIVITY);
-		createEAttribute(activityEClass, ACTIVITY__PRECONDITION);
-		createEAttribute(activityEClass, ACTIVITY__POSTCONDITION);
-		createEAttribute(activityEClass, ACTIVITY__GROUP2);
-		createEReference(activityEClass, ACTIVITY__BREAKDOWN_ELEMENT);
-		createEAttribute(activityEClass, ACTIVITY__CHECKLIST);
-		createEAttribute(activityEClass, ACTIVITY__CONCEPT);
-		createEAttribute(activityEClass, ACTIVITY__EXAMPLE);
-		createEAttribute(activityEClass, ACTIVITY__GUIDELINE);
-		createEAttribute(activityEClass, ACTIVITY__ROADMAP);
-		createEAttribute(activityEClass, ACTIVITY__REUSABLE_ASSET);
-		createEAttribute(activityEClass, ACTIVITY__SUPPORTING_MATERIAL);
-		createEAttribute(activityEClass, ACTIVITY__WHITEPAPER);
-		createEAttribute(activityEClass, ACTIVITY__IS_ENACTABLE);
-		createEAttribute(activityEClass, ACTIVITY__VARIABILITY_BASED_ON_ELEMENT);
-		createEAttribute(activityEClass, ACTIVITY__VARIABILITY_TYPE);
-
-		activityDescriptionEClass = createEClass(ACTIVITY_DESCRIPTION);
-		createEAttribute(activityDescriptionEClass, ACTIVITY_DESCRIPTION__ALTERNATIVES);
-		createEAttribute(activityDescriptionEClass, ACTIVITY_DESCRIPTION__HOW_TO_STAFF);
-		createEAttribute(activityDescriptionEClass, ACTIVITY_DESCRIPTION__PURPOSE);
-
-		artifactEClass = createEClass(ARTIFACT);
-		createEAttribute(artifactEClass, ARTIFACT__GROUP3);
-		createEReference(artifactEClass, ARTIFACT__CONTAINED_ARTIFACT);
-
-		artifactDescriptionEClass = createEClass(ARTIFACT_DESCRIPTION);
-		createEAttribute(artifactDescriptionEClass, ARTIFACT_DESCRIPTION__BRIEF_OUTLINE);
-		createEAttribute(artifactDescriptionEClass, ARTIFACT_DESCRIPTION__REPRESENTATION_OPTIONS);
-		createEAttribute(artifactDescriptionEClass, ARTIFACT_DESCRIPTION__REPRESENTATION);
-		createEAttribute(artifactDescriptionEClass, ARTIFACT_DESCRIPTION__NOTATION);
-
-		breakdownElementEClass = createEClass(BREAKDOWN_ELEMENT);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__PRESENTED_AFTER);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__PRESENTED_BEFORE);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__PLANNING_DATA);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__SUPER_ACTIVITY);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__HAS_MULTIPLE_OCCURRENCES);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__IS_OPTIONAL);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__IS_PLANNED);
-		createEAttribute(breakdownElementEClass, BREAKDOWN_ELEMENT__PREFIX);
-
-		breakdownElementDescriptionEClass = createEClass(BREAKDOWN_ELEMENT_DESCRIPTION);
-		createEAttribute(breakdownElementDescriptionEClass, BREAKDOWN_ELEMENT_DESCRIPTION__USAGE_GUIDANCE);
-
-		capabilityPatternEClass = createEClass(CAPABILITY_PATTERN);
-
-		checklistEClass = createEClass(CHECKLIST);
-
-		compositeRoleEClass = createEClass(COMPOSITE_ROLE);
-		createEAttribute(compositeRoleEClass, COMPOSITE_ROLE__GROUP1);
-		createEReference(compositeRoleEClass, COMPOSITE_ROLE__AGGREGATED_ROLE);
-
-		conceptEClass = createEClass(CONCEPT);
-
-		constraintEClass = createEClass(CONSTRAINT);
-		createEAttribute(constraintEClass, CONSTRAINT__MAIN_DESCRIPTION);
-
-		contentCategoryEClass = createEClass(CONTENT_CATEGORY);
-
-		contentCategoryPackageEClass = createEClass(CONTENT_CATEGORY_PACKAGE);
-		createEAttribute(contentCategoryPackageEClass, CONTENT_CATEGORY_PACKAGE__GROUP2);
-		createEReference(contentCategoryPackageEClass, CONTENT_CATEGORY_PACKAGE__CONTENT_CATEGORY);
-
-		contentDescriptionEClass = createEClass(CONTENT_DESCRIPTION);
-		createEAttribute(contentDescriptionEClass, CONTENT_DESCRIPTION__MAIN_DESCRIPTION);
-		createEAttribute(contentDescriptionEClass, CONTENT_DESCRIPTION__KEY_CONSIDERATIONS);
-		createEReference(contentDescriptionEClass, CONTENT_DESCRIPTION__SECTION);
-		createEAttribute(contentDescriptionEClass, CONTENT_DESCRIPTION__EXTERNAL_ID);
-
-		contentElementEClass = createEClass(CONTENT_ELEMENT);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__GROUP1);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__CHECKLIST);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__CONCEPT);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__EXAMPLE);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__GUIDELINE);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__REUSABLE_ASSET);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__SUPPORTING_MATERIAL);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__WHITEPAPER);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__VARIABILITY_BASED_ON_ELEMENT);
-		createEAttribute(contentElementEClass, CONTENT_ELEMENT__VARIABILITY_TYPE);
-
-		contentPackageEClass = createEClass(CONTENT_PACKAGE);
-		createEAttribute(contentPackageEClass, CONTENT_PACKAGE__GROUP2);
-		createEReference(contentPackageEClass, CONTENT_PACKAGE__CONTENT_ELEMENT);
-
-		customCategoryEClass = createEClass(CUSTOM_CATEGORY);
-		createEAttribute(customCategoryEClass, CUSTOM_CATEGORY__GROUP2);
-		createEAttribute(customCategoryEClass, CUSTOM_CATEGORY__CATEGORIZED_ELEMENT);
-		createEAttribute(customCategoryEClass, CUSTOM_CATEGORY__SUB_CATEGORY);
-
-		deliverableEClass = createEClass(DELIVERABLE);
-		createEAttribute(deliverableEClass, DELIVERABLE__GROUP3);
-		createEAttribute(deliverableEClass, DELIVERABLE__DELIVERED_WORK_PRODUCT);
-
-		deliverableDescriptionEClass = createEClass(DELIVERABLE_DESCRIPTION);
-		createEAttribute(deliverableDescriptionEClass, DELIVERABLE_DESCRIPTION__EXTERNAL_DESCRIPTION);
-		createEAttribute(deliverableDescriptionEClass, DELIVERABLE_DESCRIPTION__PACKAGING_GUIDANCE);
-
-		deliveryProcessEClass = createEClass(DELIVERY_PROCESS);
-		createEAttribute(deliveryProcessEClass, DELIVERY_PROCESS__GROUP3);
-		createEAttribute(deliveryProcessEClass, DELIVERY_PROCESS__COMMUNICATIONS_MATERIAL);
-		createEAttribute(deliveryProcessEClass, DELIVERY_PROCESS__EDUCATION_MATERIAL);
-
-		deliveryProcessDescriptionEClass = createEClass(DELIVERY_PROCESS_DESCRIPTION);
-		createEAttribute(deliveryProcessDescriptionEClass, DELIVERY_PROCESS_DESCRIPTION__SCALE);
-		createEAttribute(deliveryProcessDescriptionEClass, DELIVERY_PROCESS_DESCRIPTION__PROJECT_CHARACTERISTICS);
-		createEAttribute(deliveryProcessDescriptionEClass, DELIVERY_PROCESS_DESCRIPTION__RISK_LEVEL);
-		createEAttribute(deliveryProcessDescriptionEClass, DELIVERY_PROCESS_DESCRIPTION__ESTIMATING_TECHNIQUE);
-		createEAttribute(deliveryProcessDescriptionEClass, DELIVERY_PROCESS_DESCRIPTION__PROJECT_MEMBER_EXPERTISE);
-		createEAttribute(deliveryProcessDescriptionEClass, DELIVERY_PROCESS_DESCRIPTION__TYPE_OF_CONTRACT);
-
-		describableElementEClass = createEClass(DESCRIBABLE_ELEMENT);
-		createEReference(describableElementEClass, DESCRIBABLE_ELEMENT__PRESENTATION);
-		createEAttribute(describableElementEClass, DESCRIBABLE_ELEMENT__NODEICON);
-		createEAttribute(describableElementEClass, DESCRIBABLE_ELEMENT__PRESENTATION_NAME);
-		createEAttribute(describableElementEClass, DESCRIBABLE_ELEMENT__SHAPEICON);
-
-		descriptorEClass = createEClass(DESCRIPTOR);
-		createEAttribute(descriptorEClass, DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE);
-
-		descriptorDescriptionEClass = createEClass(DESCRIPTOR_DESCRIPTION);
-		createEAttribute(descriptorDescriptionEClass, DESCRIPTOR_DESCRIPTION__REFINED_DESCRIPTION);
-
-		disciplineEClass = createEClass(DISCIPLINE);
-		createEAttribute(disciplineEClass, DISCIPLINE__GROUP2);
-		createEAttribute(disciplineEClass, DISCIPLINE__TASK);
-		createEReference(disciplineEClass, DISCIPLINE__SUB_DISCIPLINE);
-		createEAttribute(disciplineEClass, DISCIPLINE__REFERENCE_WORKFLOW);
-
-		disciplineGroupingEClass = createEClass(DISCIPLINE_GROUPING);
-		createEAttribute(disciplineGroupingEClass, DISCIPLINE_GROUPING__GROUP2);
-		createEAttribute(disciplineGroupingEClass, DISCIPLINE_GROUPING__DISCIPLINE);
-
-		documentRootEClass = createEClass(DOCUMENT_ROOT);
-		createEAttribute(documentRootEClass, DOCUMENT_ROOT__MIXED);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__METHOD_CONFIGURATION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__METHOD_LIBRARY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__METHOD_PLUGIN);
-
-		domainEClass = createEClass(DOMAIN);
-		createEAttribute(domainEClass, DOMAIN__GROUP2);
-		createEAttribute(domainEClass, DOMAIN__WORK_PRODUCT);
-		createEReference(domainEClass, DOMAIN__SUBDOMAIN);
-
-		elementEClass = createEClass(ELEMENT);
-
-		estimateEClass = createEClass(ESTIMATE);
-		createEAttribute(estimateEClass, ESTIMATE__GROUP2);
-		createEAttribute(estimateEClass, ESTIMATE__ESTIMATION_METRIC);
-		createEAttribute(estimateEClass, ESTIMATE__ESTIMATION_CONSIDERATIONS);
-
-		estimatingMetricEClass = createEClass(ESTIMATING_METRIC);
-
-		estimationConsiderationsEClass = createEClass(ESTIMATION_CONSIDERATIONS);
-
-		exampleEClass = createEClass(EXAMPLE);
-
-		guidanceEClass = createEClass(GUIDANCE);
-
-		guidanceDescriptionEClass = createEClass(GUIDANCE_DESCRIPTION);
-		createEAttribute(guidanceDescriptionEClass, GUIDANCE_DESCRIPTION__ATTACHMENT);
-
-		guidelineEClass = createEClass(GUIDELINE);
-
-		iterationEClass = createEClass(ITERATION);
-
-		methodConfigurationEClass = createEClass(METHOD_CONFIGURATION);
-		createEAttribute(methodConfigurationEClass, METHOD_CONFIGURATION__BASE_CONFIGURATION);
-		createEAttribute(methodConfigurationEClass, METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION);
-		createEAttribute(methodConfigurationEClass, METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION);
-		createEAttribute(methodConfigurationEClass, METHOD_CONFIGURATION__DEFAULT_VIEW);
-		createEAttribute(methodConfigurationEClass, METHOD_CONFIGURATION__PROCESS_VIEW);
-		createEAttribute(methodConfigurationEClass, METHOD_CONFIGURATION__SUBTRACTED_CATEGORY);
-		createEAttribute(methodConfigurationEClass, METHOD_CONFIGURATION__ADDED_CATEGORY);
-
-		methodElementEClass = createEClass(METHOD_ELEMENT);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__GROUP);
-		createEReference(methodElementEClass, METHOD_ELEMENT__OWNED_RULE);
-		createEReference(methodElementEClass, METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__BRIEF_DESCRIPTION);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__ID);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__ORDERING_GUIDE);
-		createEAttribute(methodElementEClass, METHOD_ELEMENT__SUPPRESSED);
-
-		methodElementPropertyEClass = createEClass(METHOD_ELEMENT_PROPERTY);
-		createEAttribute(methodElementPropertyEClass, METHOD_ELEMENT_PROPERTY__VALUE);
-
-		methodLibraryEClass = createEClass(METHOD_LIBRARY);
-		createEReference(methodLibraryEClass, METHOD_LIBRARY__METHOD_PLUGIN);
-		createEReference(methodLibraryEClass, METHOD_LIBRARY__METHOD_CONFIGURATION);
-		createEAttribute(methodLibraryEClass, METHOD_LIBRARY__TOOL);
-
-		methodPackageEClass = createEClass(METHOD_PACKAGE);
-		createEAttribute(methodPackageEClass, METHOD_PACKAGE__GROUP1);
-		createEAttribute(methodPackageEClass, METHOD_PACKAGE__REUSED_PACKAGE);
-		createEReference(methodPackageEClass, METHOD_PACKAGE__METHOD_PACKAGE);
-		createEAttribute(methodPackageEClass, METHOD_PACKAGE__GLOBAL);
-
-		methodPluginEClass = createEClass(METHOD_PLUGIN);
-		createEAttribute(methodPluginEClass, METHOD_PLUGIN__REFERENCED_METHOD_PLUGIN);
-		createEReference(methodPluginEClass, METHOD_PLUGIN__METHOD_PACKAGE);
-		createEAttribute(methodPluginEClass, METHOD_PLUGIN__USER_CHANGEABLE);
-
-		methodUnitEClass = createEClass(METHOD_UNIT);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__COPYRIGHT);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__AUTHORS);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__CHANGE_DATE);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__CHANGE_DESCRIPTION);
-		createEAttribute(methodUnitEClass, METHOD_UNIT__VERSION);
-
-		milestoneEClass = createEClass(MILESTONE);
-
-		namedElementEClass = createEClass(NAMED_ELEMENT);
-		createEAttribute(namedElementEClass, NAMED_ELEMENT__NAME);
-
-		outcomeEClass = createEClass(OUTCOME);
-
-		packageableElementEClass = createEClass(PACKAGEABLE_ELEMENT);
-
-		phaseEClass = createEClass(PHASE);
-
-		planningDataEClass = createEClass(PLANNING_DATA);
-		createEAttribute(planningDataEClass, PLANNING_DATA__FINISH_DATE);
-		createEAttribute(planningDataEClass, PLANNING_DATA__RANK);
-		createEAttribute(planningDataEClass, PLANNING_DATA__START_DATE);
-
-		practiceEClass = createEClass(PRACTICE);
-		createEAttribute(practiceEClass, PRACTICE__GROUP2);
-		createEAttribute(practiceEClass, PRACTICE__ACTIVITY_REFERENCE);
-		createEAttribute(practiceEClass, PRACTICE__CONTENT_REFERENCE);
-		createEReference(practiceEClass, PRACTICE__SUB_PRACTICE);
-
-		practiceDescriptionEClass = createEClass(PRACTICE_DESCRIPTION);
-		createEAttribute(practiceDescriptionEClass, PRACTICE_DESCRIPTION__ADDITIONAL_INFO);
-		createEAttribute(practiceDescriptionEClass, PRACTICE_DESCRIPTION__APPLICATION);
-		createEAttribute(practiceDescriptionEClass, PRACTICE_DESCRIPTION__BACKGROUND);
-		createEAttribute(practiceDescriptionEClass, PRACTICE_DESCRIPTION__GOALS);
-		createEAttribute(practiceDescriptionEClass, PRACTICE_DESCRIPTION__LEVELS_OF_ADOPTION);
-		createEAttribute(practiceDescriptionEClass, PRACTICE_DESCRIPTION__PROBLEM);
-
-		processEClass = createEClass(PROCESS);
-		createEAttribute(processEClass, PROCESS__INCLUDES_PATTERN);
-		createEAttribute(processEClass, PROCESS__DEFAULT_CONTEXT);
-		createEAttribute(processEClass, PROCESS__VALID_CONTEXT);
-		createEAttribute(processEClass, PROCESS__DIAGRAM_URI);
-
-		processComponentEClass = createEClass(PROCESS_COMPONENT);
-		createEAttribute(processComponentEClass, PROCESS_COMPONENT__COPYRIGHT);
-		createEReference(processComponentEClass, PROCESS_COMPONENT__INTERFACE);
-		createEReference(processComponentEClass, PROCESS_COMPONENT__PROCESS);
-		createEAttribute(processComponentEClass, PROCESS_COMPONENT__AUTHORS);
-		createEAttribute(processComponentEClass, PROCESS_COMPONENT__CHANGE_DATE);
-		createEAttribute(processComponentEClass, PROCESS_COMPONENT__CHANGE_DESCRIPTION);
-		createEAttribute(processComponentEClass, PROCESS_COMPONENT__VERSION);
-
-		processComponentInterfaceEClass = createEClass(PROCESS_COMPONENT_INTERFACE);
-		createEAttribute(processComponentInterfaceEClass, PROCESS_COMPONENT_INTERFACE__GROUP1);
-		createEReference(processComponentInterfaceEClass, PROCESS_COMPONENT_INTERFACE__INTERFACE_SPECIFICATION);
-		createEReference(processComponentInterfaceEClass, PROCESS_COMPONENT_INTERFACE__INTERFACE_IO);
-
-		processDescriptionEClass = createEClass(PROCESS_DESCRIPTION);
-		createEAttribute(processDescriptionEClass, PROCESS_DESCRIPTION__SCOPE);
-		createEAttribute(processDescriptionEClass, PROCESS_DESCRIPTION__USAGE_NOTES);
-
-		processElementEClass = createEClass(PROCESS_ELEMENT);
-
-		processPackageEClass = createEClass(PROCESS_PACKAGE);
-		createEAttribute(processPackageEClass, PROCESS_PACKAGE__GROUP2);
-		createEReference(processPackageEClass, PROCESS_PACKAGE__PROCESS_ELEMENT);
-
-		processPlanningTemplateEClass = createEClass(PROCESS_PLANNING_TEMPLATE);
-		createEAttribute(processPlanningTemplateEClass, PROCESS_PLANNING_TEMPLATE__GROUP3);
-		createEAttribute(processPlanningTemplateEClass, PROCESS_PLANNING_TEMPLATE__BASE_PROCESS);
-
-		reportEClass = createEClass(REPORT);
-
-		reusableAssetEClass = createEClass(REUSABLE_ASSET);
-
-		roadmapEClass = createEClass(ROADMAP);
-
-		roleEClass = createEClass(ROLE);
-		createEAttribute(roleEClass, ROLE__GROUP2);
-		createEAttribute(roleEClass, ROLE__RESPONSIBLE_FOR);
-
-		roleDescriptionEClass = createEClass(ROLE_DESCRIPTION);
-		createEAttribute(roleDescriptionEClass, ROLE_DESCRIPTION__ASSIGNMENT_APPROACHES);
-		createEAttribute(roleDescriptionEClass, ROLE_DESCRIPTION__SKILLS);
-		createEAttribute(roleDescriptionEClass, ROLE_DESCRIPTION__SYNONYMS);
-
-		roleDescriptorEClass = createEClass(ROLE_DESCRIPTOR);
-		createEAttribute(roleDescriptorEClass, ROLE_DESCRIPTOR__ROLE);
-		createEAttribute(roleDescriptorEClass, ROLE_DESCRIPTOR__RESPONSIBLE_FOR);
-
-		roleSetEClass = createEClass(ROLE_SET);
-		createEAttribute(roleSetEClass, ROLE_SET__GROUP2);
-		createEAttribute(roleSetEClass, ROLE_SET__ROLE);
-
-		roleSetGroupingEClass = createEClass(ROLE_SET_GROUPING);
-		createEAttribute(roleSetGroupingEClass, ROLE_SET_GROUPING__GROUP2);
-		createEAttribute(roleSetGroupingEClass, ROLE_SET_GROUPING__ROLE_SET);
-
-		sectionEClass = createEClass(SECTION);
-		createEReference(sectionEClass, SECTION__SUB_SECTION);
-		createEAttribute(sectionEClass, SECTION__PREDECESSOR);
-		createEAttribute(sectionEClass, SECTION__DESCRIPTION);
-		createEAttribute(sectionEClass, SECTION__SECTION_NAME);
-		createEAttribute(sectionEClass, SECTION__VARIABILITY_BASED_ON_ELEMENT);
-		createEAttribute(sectionEClass, SECTION__VARIABILITY_TYPE);
-
-		supportingMaterialEClass = createEClass(SUPPORTING_MATERIAL);
-
-		taskEClass = createEClass(TASK);
-		createEAttribute(taskEClass, TASK__PRECONDITION);
-		createEAttribute(taskEClass, TASK__POSTCONDITION);
-		createEAttribute(taskEClass, TASK__PERFORMED_BY);
-		createEAttribute(taskEClass, TASK__GROUP2);
-		createEAttribute(taskEClass, TASK__MANDATORY_INPUT);
-		createEAttribute(taskEClass, TASK__OUTPUT);
-		createEAttribute(taskEClass, TASK__ADDITIONALLY_PERFORMED_BY);
-		createEAttribute(taskEClass, TASK__OPTIONAL_INPUT);
-		createEAttribute(taskEClass, TASK__ESTIMATE);
-		createEAttribute(taskEClass, TASK__ESTIMATION_CONSIDERATIONS);
-		createEAttribute(taskEClass, TASK__TOOL_MENTOR);
-
-		taskDescriptionEClass = createEClass(TASK_DESCRIPTION);
-		createEAttribute(taskDescriptionEClass, TASK_DESCRIPTION__ALTERNATIVES);
-		createEAttribute(taskDescriptionEClass, TASK_DESCRIPTION__PURPOSE);
-
-		taskDescriptorEClass = createEClass(TASK_DESCRIPTOR);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__TASK);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__GROUP2);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__ASSISTED_BY);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__EXTERNAL_INPUT);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__MANDATORY_INPUT);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__OPTIONAL_INPUT);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__OUTPUT);
-		createEReference(taskDescriptorEClass, TASK_DESCRIPTOR__STEP);
-		createEAttribute(taskDescriptorEClass, TASK_DESCRIPTOR__IS_SYNCHRONIZED_WITH_SOURCE);
-
-		teamProfileEClass = createEClass(TEAM_PROFILE);
-		createEAttribute(teamProfileEClass, TEAM_PROFILE__GROUP1);
-		createEAttribute(teamProfileEClass, TEAM_PROFILE__ROLE);
-		createEAttribute(teamProfileEClass, TEAM_PROFILE__SUPER_TEAM);
-		createEAttribute(teamProfileEClass, TEAM_PROFILE__SUB_TEAM);
-
-		templateEClass = createEClass(TEMPLATE);
-
-		termDefinitionEClass = createEClass(TERM_DEFINITION);
-
-		toolEClass = createEClass(TOOL);
-		createEAttribute(toolEClass, TOOL__GROUP2);
-		createEAttribute(toolEClass, TOOL__TOOL_MENTOR);
-
-		toolMentorEClass = createEClass(TOOL_MENTOR);
-
-		whitepaperEClass = createEClass(WHITEPAPER);
-
-		workBreakdownElementEClass = createEClass(WORK_BREAKDOWN_ELEMENT);
-		createEAttribute(workBreakdownElementEClass, WORK_BREAKDOWN_ELEMENT__GROUP1);
-		createEReference(workBreakdownElementEClass, WORK_BREAKDOWN_ELEMENT__PREDECESSOR);
-		createEAttribute(workBreakdownElementEClass, WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN);
-		createEAttribute(workBreakdownElementEClass, WORK_BREAKDOWN_ELEMENT__IS_ONGOING);
-		createEAttribute(workBreakdownElementEClass, WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE);
-
-		workDefinitionEClass = createEClass(WORK_DEFINITION);
-		createEAttribute(workDefinitionEClass, WORK_DEFINITION__PRECONDITION);
-		createEAttribute(workDefinitionEClass, WORK_DEFINITION__POSTCONDITION);
-
-		workOrderEClass = createEClass(WORK_ORDER);
-		createEAttribute(workOrderEClass, WORK_ORDER__VALUE);
-		createEAttribute(workOrderEClass, WORK_ORDER__ID);
-		createEAttribute(workOrderEClass, WORK_ORDER__LINK_TYPE);
-
-		workProductEClass = createEClass(WORK_PRODUCT);
-		createEAttribute(workProductEClass, WORK_PRODUCT__GROUP2);
-		createEAttribute(workProductEClass, WORK_PRODUCT__ESTIMATE);
-		createEAttribute(workProductEClass, WORK_PRODUCT__ESTIMATION_CONSIDERATIONS);
-		createEAttribute(workProductEClass, WORK_PRODUCT__REPORT);
-		createEAttribute(workProductEClass, WORK_PRODUCT__TEMPLATE);
-		createEAttribute(workProductEClass, WORK_PRODUCT__TOOL_MENTOR);
-
-		workProductDescriptionEClass = createEClass(WORK_PRODUCT_DESCRIPTION);
-		createEAttribute(workProductDescriptionEClass, WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING);
-		createEAttribute(workProductDescriptionEClass, WORK_PRODUCT_DESCRIPTION__PURPOSE);
-		createEAttribute(workProductDescriptionEClass, WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING);
-
-		workProductDescriptorEClass = createEClass(WORK_PRODUCT_DESCRIPTOR);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__GROUP1);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__IMPACTS);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE);
-		createEAttribute(workProductDescriptorEClass, WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE);
-
-		workProductTypeEClass = createEClass(WORK_PRODUCT_TYPE);
-		createEAttribute(workProductTypeEClass, WORK_PRODUCT_TYPE__GROUP2);
-		createEAttribute(workProductTypeEClass, WORK_PRODUCT_TYPE__WORK_PRODUCT);
-
-		// Create enums
-		variabilityTypeEEnum = createEEnum(VARIABILITY_TYPE);
-		workOrderTypeEEnum = createEEnum(WORK_ORDER_TYPE);
-
-		// Create data types
-		variabilityTypeObjectEDataType = createEDataType(VARIABILITY_TYPE_OBJECT);
-		workOrderTypeObjectEDataType = createEDataType(WORK_ORDER_TYPE_OBJECT);
-	}
-
-	/**
-	 * <!-- 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
-		XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-		// Add supertypes to classes
-		activityEClass.getESuperTypes().add(this.getWorkBreakdownElement());
-		activityDescriptionEClass.getESuperTypes().add(this.getBreakdownElementDescription());
-		artifactEClass.getESuperTypes().add(this.getWorkProduct());
-		artifactDescriptionEClass.getESuperTypes().add(this.getWorkProductDescription());
-		breakdownElementEClass.getESuperTypes().add(this.getProcessElement());
-		breakdownElementDescriptionEClass.getESuperTypes().add(this.getContentDescription());
-		capabilityPatternEClass.getESuperTypes().add(this.getProcess());
-		checklistEClass.getESuperTypes().add(this.getGuidance());
-		compositeRoleEClass.getESuperTypes().add(this.getRoleDescriptor());
-		conceptEClass.getESuperTypes().add(this.getGuidance());
-		constraintEClass.getESuperTypes().add(this.getMethodElement());
-		contentCategoryEClass.getESuperTypes().add(this.getContentElement());
-		contentCategoryPackageEClass.getESuperTypes().add(this.getMethodPackage());
-		contentDescriptionEClass.getESuperTypes().add(this.getMethodUnit());
-		contentElementEClass.getESuperTypes().add(this.getDescribableElement());
-		contentPackageEClass.getESuperTypes().add(this.getMethodPackage());
-		customCategoryEClass.getESuperTypes().add(this.getContentCategory());
-		deliverableEClass.getESuperTypes().add(this.getWorkProduct());
-		deliverableDescriptionEClass.getESuperTypes().add(this.getWorkProductDescription());
-		deliveryProcessEClass.getESuperTypes().add(this.getProcess());
-		deliveryProcessDescriptionEClass.getESuperTypes().add(this.getProcessDescription());
-		describableElementEClass.getESuperTypes().add(this.getMethodElement());
-		descriptorEClass.getESuperTypes().add(this.getBreakdownElement());
-		descriptorDescriptionEClass.getESuperTypes().add(this.getBreakdownElementDescription());
-		disciplineEClass.getESuperTypes().add(this.getContentCategory());
-		disciplineGroupingEClass.getESuperTypes().add(this.getContentCategory());
-		domainEClass.getESuperTypes().add(this.getContentCategory());
-		estimateEClass.getESuperTypes().add(this.getGuidance());
-		estimatingMetricEClass.getESuperTypes().add(this.getGuidance());
-		estimationConsiderationsEClass.getESuperTypes().add(this.getGuidance());
-		exampleEClass.getESuperTypes().add(this.getGuidance());
-		guidanceEClass.getESuperTypes().add(this.getContentElement());
-		guidanceDescriptionEClass.getESuperTypes().add(this.getContentDescription());
-		guidelineEClass.getESuperTypes().add(this.getGuidance());
-		iterationEClass.getESuperTypes().add(this.getActivity());
-		methodConfigurationEClass.getESuperTypes().add(this.getMethodUnit());
-		methodElementEClass.getESuperTypes().add(this.getPackageableElement());
-		methodElementPropertyEClass.getESuperTypes().add(this.getPackageableElement());
-		methodLibraryEClass.getESuperTypes().add(this.getMethodUnit());
-		methodPackageEClass.getESuperTypes().add(this.getMethodElement());
-		methodPluginEClass.getESuperTypes().add(this.getMethodUnit());
-		methodUnitEClass.getESuperTypes().add(this.getMethodElement());
-		milestoneEClass.getESuperTypes().add(this.getWorkBreakdownElement());
-		namedElementEClass.getESuperTypes().add(this.getElement());
-		outcomeEClass.getESuperTypes().add(this.getWorkProduct());
-		packageableElementEClass.getESuperTypes().add(this.getNamedElement());
-		phaseEClass.getESuperTypes().add(this.getActivity());
-		planningDataEClass.getESuperTypes().add(this.getProcessElement());
-		practiceEClass.getESuperTypes().add(this.getGuidance());
-		practiceDescriptionEClass.getESuperTypes().add(this.getContentDescription());
-		processEClass.getESuperTypes().add(this.getActivity());
-		processComponentEClass.getESuperTypes().add(this.getProcessPackage());
-		processComponentInterfaceEClass.getESuperTypes().add(this.getBreakdownElement());
-		processDescriptionEClass.getESuperTypes().add(this.getActivityDescription());
-		processElementEClass.getESuperTypes().add(this.getDescribableElement());
-		processPackageEClass.getESuperTypes().add(this.getMethodPackage());
-		processPlanningTemplateEClass.getESuperTypes().add(this.getProcess());
-		reportEClass.getESuperTypes().add(this.getGuidance());
-		reusableAssetEClass.getESuperTypes().add(this.getGuidance());
-		roadmapEClass.getESuperTypes().add(this.getGuidance());
-		roleEClass.getESuperTypes().add(this.getContentElement());
-		roleDescriptionEClass.getESuperTypes().add(this.getContentDescription());
-		roleDescriptorEClass.getESuperTypes().add(this.getDescriptor());
-		roleSetEClass.getESuperTypes().add(this.getContentCategory());
-		roleSetGroupingEClass.getESuperTypes().add(this.getContentCategory());
-		sectionEClass.getESuperTypes().add(this.getMethodElement());
-		supportingMaterialEClass.getESuperTypes().add(this.getGuidance());
-		taskEClass.getESuperTypes().add(this.getContentElement());
-		taskDescriptionEClass.getESuperTypes().add(this.getContentDescription());
-		taskDescriptorEClass.getESuperTypes().add(this.getWorkBreakdownElement());
-		teamProfileEClass.getESuperTypes().add(this.getBreakdownElement());
-		templateEClass.getESuperTypes().add(this.getGuidance());
-		termDefinitionEClass.getESuperTypes().add(this.getGuidance());
-		toolEClass.getESuperTypes().add(this.getContentCategory());
-		toolMentorEClass.getESuperTypes().add(this.getGuidance());
-		whitepaperEClass.getESuperTypes().add(this.getConcept());
-		workBreakdownElementEClass.getESuperTypes().add(this.getBreakdownElement());
-		workDefinitionEClass.getESuperTypes().add(this.getMethodElement());
-		workProductEClass.getESuperTypes().add(this.getContentElement());
-		workProductDescriptionEClass.getESuperTypes().add(this.getContentDescription());
-		workProductDescriptorEClass.getESuperTypes().add(this.getDescriptor());
-		workProductTypeEClass.getESuperTypes().add(this.getContentCategory());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(activityEClass, Activity.class, "Activity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getActivity_Precondition(), theXMLTypePackage.getString(), "precondition", null, 0, 1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Postcondition(), theXMLTypePackage.getString(), "postcondition", null, 0, 1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getActivity_BreakdownElement(), this.getBreakdownElement(), null, "breakdownElement", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Checklist(), theXMLTypePackage.getString(), "checklist", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Concept(), theXMLTypePackage.getString(), "concept", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Example(), theXMLTypePackage.getString(), "example", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Guideline(), theXMLTypePackage.getString(), "guideline", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Roadmap(), theXMLTypePackage.getString(), "roadmap", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_ReusableAsset(), theXMLTypePackage.getString(), "reusableAsset", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_SupportingMaterial(), theXMLTypePackage.getString(), "supportingMaterial", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_Whitepaper(), theXMLTypePackage.getString(), "whitepaper", null, 0, -1, Activity.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_IsEnactable(), theXMLTypePackage.getBoolean(), "isEnactable", null, 0, 1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_VariabilityBasedOnElement(), theXMLTypePackage.getString(), "variabilityBasedOnElement", null, 0, 1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivity_VariabilityType(), this.getVariabilityType(), "variabilityType", "na", 0, 1, Activity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(activityDescriptionEClass, ActivityDescription.class, "ActivityDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getActivityDescription_Alternatives(), theXMLTypePackage.getString(), "alternatives", null, 0, 1, ActivityDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivityDescription_HowToStaff(), theXMLTypePackage.getString(), "howToStaff", null, 0, 1, ActivityDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActivityDescription_Purpose(), theXMLTypePackage.getString(), "purpose", null, 0, 1, ActivityDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(artifactEClass, Artifact.class, "Artifact", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getArtifact_Group3(), ecorePackage.getEFeatureMapEntry(), "group3", null, 0, -1, Artifact.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getArtifact_ContainedArtifact(), this.getArtifact(), null, "containedArtifact", null, 0, -1, Artifact.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(artifactDescriptionEClass, ArtifactDescription.class, "ArtifactDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getArtifactDescription_BriefOutline(), theXMLTypePackage.getString(), "briefOutline", null, 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getArtifactDescription_RepresentationOptions(), theXMLTypePackage.getString(), "representationOptions", null, 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getArtifactDescription_Representation(), theXMLTypePackage.getString(), "representation", null, 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getArtifactDescription_Notation(), theXMLTypePackage.getString(), "notation", null, 0, 1, ArtifactDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(breakdownElementEClass, BreakdownElement.class, "BreakdownElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBreakdownElement_PresentedAfter(), theXMLTypePackage.getString(), "presentedAfter", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBreakdownElement_PresentedBefore(), theXMLTypePackage.getString(), "presentedBefore", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBreakdownElement_PlanningData(), theXMLTypePackage.getString(), "planningData", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBreakdownElement_SuperActivity(), theXMLTypePackage.getString(), "superActivity", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBreakdownElement_HasMultipleOccurrences(), theXMLTypePackage.getBoolean(), "hasMultipleOccurrences", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBreakdownElement_IsOptional(), theXMLTypePackage.getBoolean(), "isOptional", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBreakdownElement_IsPlanned(), theXMLTypePackage.getBoolean(), "isPlanned", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBreakdownElement_Prefix(), theXMLTypePackage.getString(), "prefix", null, 0, 1, BreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(breakdownElementDescriptionEClass, BreakdownElementDescription.class, "BreakdownElementDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBreakdownElementDescription_UsageGuidance(), theXMLTypePackage.getString(), "usageGuidance", null, 0, 1, BreakdownElementDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(capabilityPatternEClass, CapabilityPattern.class, "CapabilityPattern", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(checklistEClass, Checklist.class, "Checklist", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(compositeRoleEClass, CompositeRole.class, "CompositeRole", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getCompositeRole_Group1(), ecorePackage.getEFeatureMapEntry(), "group1", null, 0, -1, CompositeRole.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getCompositeRole_AggregatedRole(), this.getRole(), null, "aggregatedRole", null, 0, -1, CompositeRole.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(conceptEClass, Concept.class, "Concept", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(constraintEClass, Constraint.class, "Constraint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getConstraint_MainDescription(), theXMLTypePackage.getString(), "mainDescription", null, 0, 1, Constraint.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(contentCategoryEClass, ContentCategory.class, "ContentCategory", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(contentCategoryPackageEClass, ContentCategoryPackage.class, "ContentCategoryPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getContentCategoryPackage_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, ContentCategoryPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getContentCategoryPackage_ContentCategory(), this.getContentCategory(), null, "contentCategory", null, 0, -1, ContentCategoryPackage.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(contentDescriptionEClass, ContentDescription.class, "ContentDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getContentDescription_MainDescription(), theXMLTypePackage.getString(), "mainDescription", null, 0, 1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentDescription_KeyConsiderations(), theXMLTypePackage.getString(), "keyConsiderations", null, 0, 1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getContentDescription_Section(), this.getSection(), null, "section", null, 0, -1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentDescription_ExternalId(), theXMLTypePackage.getString(), "externalId", null, 0, 1, ContentDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(contentElementEClass, ContentElement.class, "ContentElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getContentElement_Group1(), ecorePackage.getEFeatureMapEntry(), "group1", null, 0, -1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_Checklist(), theXMLTypePackage.getString(), "checklist", null, 0, -1, ContentElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_Concept(), theXMLTypePackage.getString(), "concept", null, 0, -1, ContentElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_Example(), theXMLTypePackage.getString(), "example", null, 0, -1, ContentElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_Guideline(), theXMLTypePackage.getString(), "guideline", null, 0, -1, ContentElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_ReusableAsset(), theXMLTypePackage.getString(), "reusableAsset", null, 0, -1, ContentElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_SupportingMaterial(), theXMLTypePackage.getString(), "supportingMaterial", null, 0, -1, ContentElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_Whitepaper(), theXMLTypePackage.getString(), "whitepaper", null, 0, -1, ContentElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_VariabilityBasedOnElement(), theXMLTypePackage.getString(), "variabilityBasedOnElement", null, 0, 1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getContentElement_VariabilityType(), this.getVariabilityType(), "variabilityType", "na", 0, 1, ContentElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(contentPackageEClass, ContentPackage.class, "ContentPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getContentPackage_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, ContentPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getContentPackage_ContentElement(), this.getContentElement(), null, "contentElement", null, 0, -1, ContentPackage.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(customCategoryEClass, CustomCategory.class, "CustomCategory", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getCustomCategory_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, CustomCategory.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getCustomCategory_CategorizedElement(), theXMLTypePackage.getString(), "categorizedElement", null, 0, -1, CustomCategory.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getCustomCategory_SubCategory(), theXMLTypePackage.getString(), "subCategory", null, 0, -1, CustomCategory.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(deliverableEClass, Deliverable.class, "Deliverable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDeliverable_Group3(), ecorePackage.getEFeatureMapEntry(), "group3", null, 0, -1, Deliverable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliverable_DeliveredWorkProduct(), theXMLTypePackage.getString(), "deliveredWorkProduct", null, 0, -1, Deliverable.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(deliverableDescriptionEClass, DeliverableDescription.class, "DeliverableDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDeliverableDescription_ExternalDescription(), theXMLTypePackage.getString(), "externalDescription", null, 0, 1, DeliverableDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliverableDescription_PackagingGuidance(), theXMLTypePackage.getString(), "packagingGuidance", null, 0, 1, DeliverableDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(deliveryProcessEClass, DeliveryProcess.class, "DeliveryProcess", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDeliveryProcess_Group3(), ecorePackage.getEFeatureMapEntry(), "group3", null, 0, -1, DeliveryProcess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliveryProcess_CommunicationsMaterial(), theXMLTypePackage.getString(), "communicationsMaterial", null, 0, -1, DeliveryProcess.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliveryProcess_EducationMaterial(), theXMLTypePackage.getString(), "educationMaterial", null, 0, -1, DeliveryProcess.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(deliveryProcessDescriptionEClass, DeliveryProcessDescription.class, "DeliveryProcessDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDeliveryProcessDescription_Scale(), theXMLTypePackage.getString(), "scale", null, 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliveryProcessDescription_ProjectCharacteristics(), theXMLTypePackage.getString(), "projectCharacteristics", null, 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliveryProcessDescription_RiskLevel(), theXMLTypePackage.getString(), "riskLevel", null, 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliveryProcessDescription_EstimatingTechnique(), theXMLTypePackage.getString(), "estimatingTechnique", null, 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliveryProcessDescription_ProjectMemberExpertise(), theXMLTypePackage.getString(), "projectMemberExpertise", null, 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDeliveryProcessDescription_TypeOfContract(), theXMLTypePackage.getString(), "typeOfContract", null, 0, 1, DeliveryProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(describableElementEClass, DescribableElement.class, "DescribableElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDescribableElement_Presentation(), this.getContentDescription(), null, "presentation", null, 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDescribableElement_Nodeicon(), theXMLTypePackage.getString(), "nodeicon", null, 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDescribableElement_PresentationName(), theXMLTypePackage.getString(), "presentationName", null, 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDescribableElement_Shapeicon(), theXMLTypePackage.getString(), "shapeicon", null, 0, 1, DescribableElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(descriptorEClass, org.eclipse.epf.xml.uma.Descriptor.class, "Descriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDescriptor_IsSynchronizedWithSource(), theXMLTypePackage.getBoolean(), "isSynchronizedWithSource", null, 0, 1, org.eclipse.epf.xml.uma.Descriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(descriptorDescriptionEClass, DescriptorDescription.class, "DescriptorDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDescriptorDescription_RefinedDescription(), theXMLTypePackage.getString(), "refinedDescription", null, 0, 1, DescriptorDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(disciplineEClass, Discipline.class, "Discipline", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDiscipline_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Discipline.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDiscipline_Task(), theXMLTypePackage.getString(), "task", null, 0, -1, Discipline.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDiscipline_SubDiscipline(), this.getDiscipline(), null, "subDiscipline", null, 0, -1, Discipline.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDiscipline_ReferenceWorkflow(), theXMLTypePackage.getString(), "referenceWorkflow", null, 0, -1, Discipline.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(disciplineGroupingEClass, DisciplineGrouping.class, "DisciplineGrouping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDisciplineGrouping_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, DisciplineGrouping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDisciplineGrouping_Discipline(), theXMLTypePackage.getString(), "discipline", null, 0, -1, DisciplineGrouping.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(documentRootEClass, DocumentRoot.class, "DocumentRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDocumentRoot_Mixed(), ecorePackage.getEFeatureMapEntry(), "mixed", null, 0, -1, null, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_XMLNSPrefixMap(), ecorePackage.getEStringToStringMapEntry(), null, "xMLNSPrefixMap", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_XSISchemaLocation(), ecorePackage.getEStringToStringMapEntry(), null, "xSISchemaLocation", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MethodConfiguration(), this.getMethodConfiguration(), null, "methodConfiguration", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MethodLibrary(), this.getMethodLibrary(), null, "methodLibrary", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MethodPlugin(), this.getMethodPlugin(), null, "methodPlugin", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(domainEClass, Domain.class, "Domain", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDomain_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Domain.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDomain_WorkProduct(), theXMLTypePackage.getString(), "workProduct", null, 0, -1, Domain.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDomain_Subdomain(), this.getDomain(), null, "subdomain", null, 0, -1, Domain.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(elementEClass, Element.class, "Element", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(estimateEClass, Estimate.class, "Estimate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getEstimate_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Estimate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getEstimate_EstimationMetric(), theXMLTypePackage.getString(), "estimationMetric", null, 0, -1, Estimate.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getEstimate_EstimationConsiderations(), theXMLTypePackage.getString(), "estimationConsiderations", null, 0, -1, Estimate.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(estimatingMetricEClass, EstimatingMetric.class, "EstimatingMetric", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(estimationConsiderationsEClass, EstimationConsiderations.class, "EstimationConsiderations", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(exampleEClass, Example.class, "Example", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(guidanceEClass, Guidance.class, "Guidance", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(guidanceDescriptionEClass, GuidanceDescription.class, "GuidanceDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getGuidanceDescription_Attachment(), theXMLTypePackage.getString(), "attachment", null, 0, 1, GuidanceDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(guidelineEClass, Guideline.class, "Guideline", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(iterationEClass, Iteration.class, "Iteration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(methodConfigurationEClass, MethodConfiguration.class, "MethodConfiguration", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMethodConfiguration_BaseConfiguration(), theXMLTypePackage.getString(), "baseConfiguration", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodConfiguration_MethodPluginSelection(), theXMLTypePackage.getString(), "methodPluginSelection", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodConfiguration_MethodPackageSelection(), theXMLTypePackage.getString(), "methodPackageSelection", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodConfiguration_DefaultView(), theXMLTypePackage.getString(), "defaultView", null, 0, 1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodConfiguration_ProcessView(), theXMLTypePackage.getString(), "processView", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodConfiguration_SubtractedCategory(), theXMLTypePackage.getString(), "subtractedCategory", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodConfiguration_AddedCategory(), theXMLTypePackage.getString(), "addedCategory", null, 0, -1, MethodConfiguration.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(methodElementEClass, MethodElement.class, "MethodElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMethodElement_Group(), ecorePackage.getEFeatureMapEntry(), "group", null, 0, -1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMethodElement_OwnedRule(), this.getConstraint(), null, "ownedRule", null, 0, -1, MethodElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getMethodElement_MethodElementProperty(), this.getMethodElementProperty(), null, "methodElementProperty", null, 0, -1, MethodElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodElement_BriefDescription(), theXMLTypePackage.getString(), "briefDescription", null, 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodElement_Id(), theXMLTypePackage.getString(), "id", null, 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodElement_OrderingGuide(), theXMLTypePackage.getString(), "orderingGuide", null, 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodElement_Suppressed(), theXMLTypePackage.getBoolean(), "suppressed", null, 0, 1, MethodElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(methodElementPropertyEClass, MethodElementProperty.class, "MethodElementProperty", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMethodElementProperty_Value(), theXMLTypePackage.getString(), "value", null, 0, 1, MethodElementProperty.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(methodLibraryEClass, MethodLibrary.class, "MethodLibrary", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getMethodLibrary_MethodPlugin(), this.getMethodPlugin(), null, "methodPlugin", null, 0, -1, MethodLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMethodLibrary_MethodConfiguration(), this.getMethodConfiguration(), null, "methodConfiguration", null, 0, -1, MethodLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodLibrary_Tool(), theXMLTypePackage.getString(), "tool", null, 0, 1, MethodLibrary.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(methodPackageEClass, MethodPackage.class, "MethodPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMethodPackage_Group1(), ecorePackage.getEFeatureMapEntry(), "group1", null, 0, -1, MethodPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodPackage_ReusedPackage(), theXMLTypePackage.getString(), "reusedPackage", null, 0, -1, MethodPackage.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getMethodPackage_MethodPackage(), this.getMethodPackage(), null, "methodPackage", null, 0, -1, MethodPackage.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodPackage_Global(), theXMLTypePackage.getBoolean(), "global", null, 0, 1, MethodPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(methodPluginEClass, MethodPlugin.class, "MethodPlugin", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMethodPlugin_ReferencedMethodPlugin(), theXMLTypePackage.getString(), "referencedMethodPlugin", null, 0, -1, MethodPlugin.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMethodPlugin_MethodPackage(), this.getMethodPackage(), null, "methodPackage", null, 0, -1, MethodPlugin.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodPlugin_UserChangeable(), theXMLTypePackage.getBoolean(), "userChangeable", null, 0, 1, MethodPlugin.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(methodUnitEClass, MethodUnit.class, "MethodUnit", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMethodUnit_Copyright(), theXMLTypePackage.getString(), "copyright", null, 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodUnit_Authors(), theXMLTypePackage.getString(), "authors", null, 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodUnit_ChangeDate(), theXMLTypePackage.getDateTime(), "changeDate", null, 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodUnit_ChangeDescription(), theXMLTypePackage.getString(), "changeDescription", null, 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMethodUnit_Version(), theXMLTypePackage.getString(), "version", null, 0, 1, MethodUnit.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(milestoneEClass, Milestone.class, "Milestone", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(namedElementEClass, NamedElement.class, "NamedElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getNamedElement_Name(), theXMLTypePackage.getString(), "name", null, 0, 1, NamedElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(outcomeEClass, Outcome.class, "Outcome", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(packageableElementEClass, PackageableElement.class, "PackageableElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(phaseEClass, Phase.class, "Phase", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(planningDataEClass, PlanningData.class, "PlanningData", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPlanningData_FinishDate(), theXMLTypePackage.getDateTime(), "finishDate", null, 0, 1, PlanningData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPlanningData_Rank(), theXMLTypePackage.getString(), "rank", null, 0, 1, PlanningData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPlanningData_StartDate(), theXMLTypePackage.getDateTime(), "startDate", null, 0, 1, PlanningData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(practiceEClass, Practice.class, "Practice", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPractice_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Practice.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPractice_ActivityReference(), theXMLTypePackage.getString(), "activityReference", null, 0, -1, Practice.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPractice_ContentReference(), theXMLTypePackage.getString(), "contentReference", null, 0, -1, Practice.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getPractice_SubPractice(), this.getPractice(), null, "subPractice", null, 0, -1, Practice.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(practiceDescriptionEClass, PracticeDescription.class, "PracticeDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPracticeDescription_AdditionalInfo(), theXMLTypePackage.getString(), "additionalInfo", null, 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPracticeDescription_Application(), theXMLTypePackage.getString(), "application", null, 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPracticeDescription_Background(), theXMLTypePackage.getString(), "background", null, 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPracticeDescription_Goals(), theXMLTypePackage.getString(), "goals", null, 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPracticeDescription_LevelsOfAdoption(), theXMLTypePackage.getString(), "levelsOfAdoption", null, 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPracticeDescription_Problem(), theXMLTypePackage.getString(), "problem", null, 0, 1, PracticeDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(processEClass, org.eclipse.epf.xml.uma.Process.class, "Process", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProcess_IncludesPattern(), theXMLTypePackage.getString(), "includesPattern", null, 0, -1, org.eclipse.epf.xml.uma.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcess_DefaultContext(), theXMLTypePackage.getString(), "defaultContext", null, 0, 1, org.eclipse.epf.xml.uma.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcess_ValidContext(), theXMLTypePackage.getString(), "validContext", null, 0, -1, org.eclipse.epf.xml.uma.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcess_DiagramURI(), theXMLTypePackage.getString(), "diagramURI", null, 0, 1, org.eclipse.epf.xml.uma.Process.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(processComponentEClass, ProcessComponent.class, "ProcessComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProcessComponent_Copyright(), theXMLTypePackage.getString(), "copyright", null, 0, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProcessComponent_Interface(), this.getProcessComponentInterface(), null, "interface", null, 0, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProcessComponent_Process(), this.getProcess(), null, "process", null, 1, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcessComponent_Authors(), theXMLTypePackage.getString(), "authors", null, 0, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcessComponent_ChangeDate(), theXMLTypePackage.getDateTime(), "changeDate", null, 0, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcessComponent_ChangeDescription(), theXMLTypePackage.getString(), "changeDescription", null, 0, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcessComponent_Version(), theXMLTypePackage.getString(), "version", null, 0, 1, ProcessComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(processComponentInterfaceEClass, ProcessComponentInterface.class, "ProcessComponentInterface", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProcessComponentInterface_Group1(), ecorePackage.getEFeatureMapEntry(), "group1", null, 0, -1, ProcessComponentInterface.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProcessComponentInterface_InterfaceSpecification(), this.getTaskDescriptor(), null, "interfaceSpecification", null, 0, -1, ProcessComponentInterface.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getProcessComponentInterface_InterfaceIO(), this.getWorkProductDescriptor(), null, "interfaceIO", null, 0, -1, ProcessComponentInterface.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(processDescriptionEClass, ProcessDescription.class, "ProcessDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProcessDescription_Scope(), theXMLTypePackage.getString(), "scope", null, 0, 1, ProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcessDescription_UsageNotes(), theXMLTypePackage.getString(), "usageNotes", null, 0, 1, ProcessDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(processElementEClass, ProcessElement.class, "ProcessElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(processPackageEClass, ProcessPackage.class, "ProcessPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProcessPackage_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, ProcessPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProcessPackage_ProcessElement(), this.getProcessElement(), null, "processElement", null, 0, -1, ProcessPackage.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(processPlanningTemplateEClass, ProcessPlanningTemplate.class, "ProcessPlanningTemplate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProcessPlanningTemplate_Group3(), ecorePackage.getEFeatureMapEntry(), "group3", null, 0, -1, ProcessPlanningTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProcessPlanningTemplate_BaseProcess(), theXMLTypePackage.getString(), "baseProcess", null, 0, -1, ProcessPlanningTemplate.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(reportEClass, Report.class, "Report", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(reusableAssetEClass, ReusableAsset.class, "ReusableAsset", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(roadmapEClass, Roadmap.class, "Roadmap", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(roleEClass, Role.class, "Role", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRole_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRole_ResponsibleFor(), theXMLTypePackage.getString(), "responsibleFor", null, 0, -1, Role.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(roleDescriptionEClass, RoleDescription.class, "RoleDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRoleDescription_AssignmentApproaches(), theXMLTypePackage.getString(), "assignmentApproaches", null, 0, 1, RoleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRoleDescription_Skills(), theXMLTypePackage.getString(), "skills", null, 0, 1, RoleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRoleDescription_Synonyms(), theXMLTypePackage.getString(), "synonyms", null, 0, 1, RoleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(roleDescriptorEClass, RoleDescriptor.class, "RoleDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRoleDescriptor_Role(), theXMLTypePackage.getString(), "role", null, 0, 1, RoleDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRoleDescriptor_ResponsibleFor(), theXMLTypePackage.getString(), "responsibleFor", null, 0, -1, RoleDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(roleSetEClass, RoleSet.class, "RoleSet", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRoleSet_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, RoleSet.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRoleSet_Role(), theXMLTypePackage.getString(), "role", null, 0, -1, RoleSet.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(roleSetGroupingEClass, RoleSetGrouping.class, "RoleSetGrouping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRoleSetGrouping_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, RoleSetGrouping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRoleSetGrouping_RoleSet(), theXMLTypePackage.getString(), "roleSet", null, 0, -1, RoleSetGrouping.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(sectionEClass, Section.class, "Section", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getSection_SubSection(), this.getSection(), null, "subSection", null, 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSection_Predecessor(), theXMLTypePackage.getString(), "predecessor", null, 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSection_Description(), theXMLTypePackage.getString(), "description", null, 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSection_SectionName(), theXMLTypePackage.getString(), "sectionName", null, 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSection_VariabilityBasedOnElement(), theXMLTypePackage.getString(), "variabilityBasedOnElement", null, 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSection_VariabilityType(), this.getVariabilityType(), "variabilityType", "na", 0, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(supportingMaterialEClass, SupportingMaterial.class, "SupportingMaterial", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(taskEClass, Task.class, "Task", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTask_Precondition(), theXMLTypePackage.getString(), "precondition", null, 0, 1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_Postcondition(), theXMLTypePackage.getString(), "postcondition", null, 0, 1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_PerformedBy(), theXMLTypePackage.getString(), "performedBy", null, 0, 1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Task.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_MandatoryInput(), theXMLTypePackage.getString(), "mandatoryInput", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_Output(), theXMLTypePackage.getString(), "output", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_AdditionallyPerformedBy(), theXMLTypePackage.getString(), "additionallyPerformedBy", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_OptionalInput(), theXMLTypePackage.getString(), "optionalInput", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_Estimate(), theXMLTypePackage.getString(), "estimate", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_EstimationConsiderations(), theXMLTypePackage.getString(), "estimationConsiderations", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTask_ToolMentor(), theXMLTypePackage.getString(), "toolMentor", null, 0, -1, Task.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(taskDescriptionEClass, TaskDescription.class, "TaskDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTaskDescription_Alternatives(), theXMLTypePackage.getString(), "alternatives", null, 0, 1, TaskDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescription_Purpose(), theXMLTypePackage.getString(), "purpose", null, 0, 1, TaskDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(taskDescriptorEClass, TaskDescriptor.class, "TaskDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTaskDescriptor_Task(), theXMLTypePackage.getString(), "task", null, 0, 1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_PerformedPrimarilyBy(), theXMLTypePackage.getString(), "performedPrimarilyBy", null, 0, 1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_AdditionallyPerformedBy(), theXMLTypePackage.getString(), "additionallyPerformedBy", null, 0, -1, TaskDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_AssistedBy(), theXMLTypePackage.getString(), "assistedBy", null, 0, -1, TaskDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_ExternalInput(), theXMLTypePackage.getString(), "externalInput", null, 0, -1, TaskDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_MandatoryInput(), theXMLTypePackage.getString(), "mandatoryInput", null, 0, -1, TaskDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_OptionalInput(), theXMLTypePackage.getString(), "optionalInput", null, 0, -1, TaskDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_Output(), theXMLTypePackage.getString(), "output", null, 0, -1, TaskDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getTaskDescriptor_Step(), this.getSection(), null, "step", null, 0, -1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTaskDescriptor_IsSynchronizedWithSource(), theXMLTypePackage.getBoolean(), "isSynchronizedWithSource", null, 0, 1, TaskDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(teamProfileEClass, TeamProfile.class, "TeamProfile", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTeamProfile_Group1(), ecorePackage.getEFeatureMapEntry(), "group1", null, 0, -1, TeamProfile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTeamProfile_Role(), theXMLTypePackage.getString(), "role", null, 0, -1, TeamProfile.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTeamProfile_SuperTeam(), theXMLTypePackage.getString(), "superTeam", null, 0, -1, TeamProfile.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTeamProfile_SubTeam(), theXMLTypePackage.getString(), "subTeam", null, 0, -1, TeamProfile.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(templateEClass, Template.class, "Template", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(termDefinitionEClass, TermDefinition.class, "TermDefinition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(toolEClass, Tool.class, "Tool", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTool_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, Tool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTool_ToolMentor(), theXMLTypePackage.getString(), "toolMentor", null, 0, -1, Tool.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(toolMentorEClass, ToolMentor.class, "ToolMentor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(whitepaperEClass, Whitepaper.class, "Whitepaper", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(workBreakdownElementEClass, WorkBreakdownElement.class, "WorkBreakdownElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkBreakdownElement_Group1(), ecorePackage.getEFeatureMapEntry(), "group1", null, 0, -1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkBreakdownElement_Predecessor(), this.getWorkOrder(), null, "predecessor", null, 0, -1, WorkBreakdownElement.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkBreakdownElement_IsEventDriven(), theXMLTypePackage.getBoolean(), "isEventDriven", null, 0, 1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkBreakdownElement_IsOngoing(), theXMLTypePackage.getBoolean(), "isOngoing", null, 0, 1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkBreakdownElement_IsRepeatable(), theXMLTypePackage.getBoolean(), "isRepeatable", null, 0, 1, WorkBreakdownElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(workDefinitionEClass, WorkDefinition.class, "WorkDefinition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkDefinition_Precondition(), theXMLTypePackage.getString(), "precondition", null, 0, 1, WorkDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkDefinition_Postcondition(), theXMLTypePackage.getString(), "postcondition", null, 0, 1, WorkDefinition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(workOrderEClass, WorkOrder.class, "WorkOrder", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkOrder_Value(), theXMLTypePackage.getString(), "value", null, 0, 1, WorkOrder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkOrder_Id(), theXMLTypePackage.getString(), "id", null, 0, 1, WorkOrder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkOrder_LinkType(), this.getWorkOrderType(), "linkType", "finishToStart", 0, 1, WorkOrder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(workProductEClass, WorkProduct.class, "WorkProduct", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkProduct_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, WorkProduct.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProduct_Estimate(), theXMLTypePackage.getString(), "estimate", null, 0, -1, WorkProduct.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProduct_EstimationConsiderations(), theXMLTypePackage.getString(), "estimationConsiderations", null, 0, -1, WorkProduct.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProduct_Report(), theXMLTypePackage.getString(), "report", null, 0, -1, WorkProduct.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProduct_Template(), theXMLTypePackage.getString(), "template", null, 0, -1, WorkProduct.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProduct_ToolMentor(), theXMLTypePackage.getString(), "toolMentor", null, 0, -1, WorkProduct.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(workProductDescriptionEClass, WorkProductDescription.class, "WorkProductDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkProductDescription_ImpactOfNotHaving(), theXMLTypePackage.getString(), "impactOfNotHaving", null, 0, 1, WorkProductDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescription_Purpose(), theXMLTypePackage.getString(), "purpose", null, 0, 1, WorkProductDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescription_ReasonsForNotNeeding(), theXMLTypePackage.getString(), "reasonsForNotNeeding", null, 0, 1, WorkProductDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(workProductDescriptorEClass, WorkProductDescriptor.class, "WorkProductDescriptor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkProductDescriptor_WorkProduct(), theXMLTypePackage.getString(), "workProduct", null, 0, 1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_ResponsibleRole(), theXMLTypePackage.getString(), "responsibleRole", null, 0, 1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_Group1(), ecorePackage.getEFeatureMapEntry(), "group1", null, 0, -1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_ExternalInputTo(), theXMLTypePackage.getString(), "externalInputTo", null, 0, -1, WorkProductDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_ImpactedBy(), theXMLTypePackage.getString(), "impactedBy", null, 0, -1, WorkProductDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_Impacts(), theXMLTypePackage.getString(), "impacts", null, 0, -1, WorkProductDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_MandatoryInputTo(), theXMLTypePackage.getString(), "mandatoryInputTo", null, 0, -1, WorkProductDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_OptionalInputTo(), theXMLTypePackage.getString(), "optionalInputTo", null, 0, -1, WorkProductDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_OutputFrom(), theXMLTypePackage.getString(), "outputFrom", null, 0, -1, WorkProductDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_DeliverableParts(), theXMLTypePackage.getString(), "deliverableParts", null, 0, -1, WorkProductDescriptor.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_ActivityEntryState(), theXMLTypePackage.getString(), "activityEntryState", null, 0, 1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductDescriptor_ActivityExitState(), theXMLTypePackage.getString(), "activityExitState", null, 0, 1, WorkProductDescriptor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(workProductTypeEClass, WorkProductType.class, "WorkProductType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkProductType_Group2(), ecorePackage.getEFeatureMapEntry(), "group2", null, 0, -1, WorkProductType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkProductType_WorkProduct(), theXMLTypePackage.getString(), "workProduct", null, 0, -1, WorkProductType.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		// Initialize enums and add enum literals
-		initEEnum(variabilityTypeEEnum, VariabilityType.class, "VariabilityType");
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.NA_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.CONTRIBUTES_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.EXTENDS_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.REPLACES_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.LOCAL_CONTRIBUTION_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.LOCAL_REPLACEMENT_LITERAL);
-		addEEnumLiteral(variabilityTypeEEnum, VariabilityType.EXTENDS_REPLACES_LITERAL);
-
-		initEEnum(workOrderTypeEEnum, WorkOrderType.class, "WorkOrderType");
-		addEEnumLiteral(workOrderTypeEEnum, WorkOrderType.FINISH_TO_START_LITERAL);
-		addEEnumLiteral(workOrderTypeEEnum, WorkOrderType.FINISH_TO_FINISH_LITERAL);
-		addEEnumLiteral(workOrderTypeEEnum, WorkOrderType.START_TO_START_LITERAL);
-		addEEnumLiteral(workOrderTypeEEnum, WorkOrderType.START_TO_FINISH_LITERAL);
-
-		// Initialize data types
-		initEDataType(variabilityTypeObjectEDataType, VariabilityType.class, "VariabilityTypeObject", IS_SERIALIZABLE, IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(workOrderTypeObjectEDataType, WorkOrderType.class, "WorkOrderTypeObject", IS_SERIALIZABLE, IS_GENERATED_INSTANCE_CLASS);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * 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
-		  (activityEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Activity",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getActivity_Precondition(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Precondition"
-		   });		
-		addAnnotation
-		  (getActivity_Postcondition(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Postcondition"
-		   });		
-		addAnnotation
-		  (getActivity_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:27"
-		   });		
-		addAnnotation
-		  (getActivity_BreakdownElement(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "BreakdownElement",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_Checklist(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Checklist",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_Concept(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Concept",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_Example(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Example",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_Guideline(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Guideline",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_Roadmap(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Roadmap",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_ReusableAsset(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ReusableAsset",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_SupportingMaterial(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SupportingMaterial",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_Whitepaper(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Whitepaper",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getActivity_IsEnactable(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "IsEnactable"
-		   });		
-		addAnnotation
-		  (getActivity_VariabilityBasedOnElement(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "variabilityBasedOnElement"
-		   });		
-		addAnnotation
-		  (getActivity_VariabilityType(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "variabilityType"
-		   });			
-		addAnnotation
-		  (activityDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ActivityDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getActivityDescription_Alternatives(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Alternatives"
-		   });			
-		addAnnotation
-		  (getActivityDescription_HowToStaff(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "HowToStaff"
-		   });			
-		addAnnotation
-		  (getActivityDescription_Purpose(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Purpose"
-		   });			
-		addAnnotation
-		  (artifactEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Artifact",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getArtifact_Group3(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:28"
-		   });		
-		addAnnotation
-		  (getArtifact_ContainedArtifact(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ContainedArtifact",
-			 "group", "#group:28"
-		   });			
-		addAnnotation
-		  (artifactDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ArtifactDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getArtifactDescription_BriefOutline(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "BriefOutline"
-		   });			
-		addAnnotation
-		  (getArtifactDescription_RepresentationOptions(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "RepresentationOptions"
-		   });		
-		addAnnotation
-		  (getArtifactDescription_Representation(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Representation"
-		   });		
-		addAnnotation
-		  (getArtifactDescription_Notation(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Notation"
-		   });			
-		addAnnotation
-		  (breakdownElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "BreakdownElement",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getBreakdownElement_PresentedAfter(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "PresentedAfter"
-		   });		
-		addAnnotation
-		  (getBreakdownElement_PresentedBefore(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "PresentedBefore"
-		   });		
-		addAnnotation
-		  (getBreakdownElement_PlanningData(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "PlanningData"
-		   });		
-		addAnnotation
-		  (getBreakdownElement_SuperActivity(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SuperActivity"
-		   });			
-		addAnnotation
-		  (getBreakdownElement_HasMultipleOccurrences(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "hasMultipleOccurrences"
-		   });			
-		addAnnotation
-		  (getBreakdownElement_IsOptional(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "isOptional"
-		   });			
-		addAnnotation
-		  (getBreakdownElement_IsPlanned(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "isPlanned"
-		   });			
-		addAnnotation
-		  (getBreakdownElement_Prefix(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "prefix"
-		   });			
-		addAnnotation
-		  (breakdownElementDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "BreakdownElementDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getBreakdownElementDescription_UsageGuidance(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "usageGuidance"
-		   });			
-		addAnnotation
-		  (capabilityPatternEClass, 
-		   source, 
-		   new String[] {
-			 "name", "CapabilityPattern",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (checklistEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Checklist",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (compositeRoleEClass, 
-		   source, 
-		   new String[] {
-			 "name", "CompositeRole",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getCompositeRole_Group1(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:23"
-		   });		
-		addAnnotation
-		  (getCompositeRole_AggregatedRole(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "AggregatedRole",
-			 "group", "#group:23"
-		   });			
-		addAnnotation
-		  (conceptEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Concept",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (constraintEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Constraint",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getConstraint_MainDescription(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "mainDescription"
-		   });			
-		addAnnotation
-		  (contentCategoryEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ContentCategory",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (contentCategoryPackageEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ContentCategoryPackage",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getContentCategoryPackage_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:12"
-		   });		
-		addAnnotation
-		  (getContentCategoryPackage_ContentCategory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ContentCategory",
-			 "group", "#group:12"
-		   });			
-		addAnnotation
-		  (contentDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ContentDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getContentDescription_MainDescription(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MainDescription"
-		   });			
-		addAnnotation
-		  (getContentDescription_KeyConsiderations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "KeyConsiderations"
-		   });		
-		addAnnotation
-		  (getContentDescription_Section(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Section"
-		   });			
-		addAnnotation
-		  (getContentDescription_ExternalId(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "externalId"
-		   });			
-		addAnnotation
-		  (contentElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ContentElement",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getContentElement_Group1(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_Checklist(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Checklist",
-			 "group", "#group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_Concept(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Concept",
-			 "group", "#group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_Example(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Example",
-			 "group", "#group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_Guideline(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Guideline",
-			 "group", "#group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_ReusableAsset(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ReusableAsset",
-			 "group", "#group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_SupportingMaterial(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SupportingMaterial",
-			 "group", "#group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_Whitepaper(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Whitepaper",
-			 "group", "#group:12"
-		   });		
-		addAnnotation
-		  (getContentElement_VariabilityBasedOnElement(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "variabilityBasedOnElement"
-		   });		
-		addAnnotation
-		  (getContentElement_VariabilityType(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "variabilityType"
-		   });			
-		addAnnotation
-		  (contentPackageEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ContentPackage",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getContentPackage_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:12"
-		   });		
-		addAnnotation
-		  (getContentPackage_ContentElement(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ContentElement",
-			 "group", "#group:12"
-		   });			
-		addAnnotation
-		  (customCategoryEClass, 
-		   source, 
-		   new String[] {
-			 "name", "CustomCategory",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getCustomCategory_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getCustomCategory_CategorizedElement(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "CategorizedElement",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getCustomCategory_SubCategory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SubCategory",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (deliverableEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Deliverable",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDeliverable_Group3(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:28"
-		   });		
-		addAnnotation
-		  (getDeliverable_DeliveredWorkProduct(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "DeliveredWorkProduct",
-			 "group", "#group:28"
-		   });			
-		addAnnotation
-		  (deliverableDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "DeliverableDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getDeliverableDescription_ExternalDescription(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ExternalDescription"
-		   });			
-		addAnnotation
-		  (getDeliverableDescription_PackagingGuidance(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "PackagingGuidance"
-		   });			
-		addAnnotation
-		  (deliveryProcessEClass, 
-		   source, 
-		   new String[] {
-			 "name", "DeliveryProcess",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDeliveryProcess_Group3(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:44"
-		   });		
-		addAnnotation
-		  (getDeliveryProcess_CommunicationsMaterial(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "CommunicationsMaterial",
-			 "group", "#group:44"
-		   });		
-		addAnnotation
-		  (getDeliveryProcess_EducationMaterial(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "EducationMaterial",
-			 "group", "#group:44"
-		   });			
-		addAnnotation
-		  (deliveryProcessDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "DeliveryProcessDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getDeliveryProcessDescription_Scale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Scale"
-		   });			
-		addAnnotation
-		  (getDeliveryProcessDescription_ProjectCharacteristics(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ProjectCharacteristics"
-		   });			
-		addAnnotation
-		  (getDeliveryProcessDescription_RiskLevel(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "RiskLevel"
-		   });			
-		addAnnotation
-		  (getDeliveryProcessDescription_EstimatingTechnique(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "EstimatingTechnique"
-		   });			
-		addAnnotation
-		  (getDeliveryProcessDescription_ProjectMemberExpertise(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ProjectMemberExpertise"
-		   });			
-		addAnnotation
-		  (getDeliveryProcessDescription_TypeOfContract(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "TypeOfContract"
-		   });			
-		addAnnotation
-		  (describableElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "DescribableElement",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDescribableElement_Presentation(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Presentation"
-		   });			
-		addAnnotation
-		  (getDescribableElement_Nodeicon(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "nodeicon"
-		   });			
-		addAnnotation
-		  (getDescribableElement_PresentationName(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "presentationName"
-		   });			
-		addAnnotation
-		  (getDescribableElement_Shapeicon(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "shapeicon"
-		   });			
-		addAnnotation
-		  (descriptorEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Descriptor",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDescriptor_IsSynchronizedWithSource(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "isSynchronizedWithSource"
-		   });			
-		addAnnotation
-		  (descriptorDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "DescriptorDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getDescriptorDescription_RefinedDescription(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "RefinedDescription"
-		   });			
-		addAnnotation
-		  (disciplineEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Discipline",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDiscipline_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getDiscipline_Task(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Task",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getDiscipline_SubDiscipline(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SubDiscipline",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getDiscipline_ReferenceWorkflow(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ReferenceWorkflow",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (disciplineGroupingEClass, 
-		   source, 
-		   new String[] {
-			 "name", "DisciplineGrouping",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDisciplineGrouping_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getDisciplineGrouping_Discipline(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Discipline",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (documentRootEClass, 
-		   source, 
-		   new String[] {
-			 "name", "",
-			 "kind", "mixed"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_Mixed(), 
-		   source, 
-		   new String[] {
-			 "kind", "elementWildcard",
-			 "name", ":mixed"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_XMLNSPrefixMap(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xmlns:prefix"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_XSISchemaLocation(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xsi:schemaLocation"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MethodConfiguration(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodConfiguration",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MethodLibrary(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodLibrary",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MethodPlugin(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodPlugin",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (domainEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Domain",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDomain_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getDomain_WorkProduct(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "WorkProduct",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getDomain_Subdomain(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Subdomain",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (elementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Element",
-			 "kind", "empty"
-		   });			
-		addAnnotation
-		  (estimateEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Estimate",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getEstimate_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getEstimate_EstimationMetric(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "EstimationMetric",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getEstimate_EstimationConsiderations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "EstimationConsiderations",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (estimatingMetricEClass, 
-		   source, 
-		   new String[] {
-			 "name", "EstimatingMetric",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (estimationConsiderationsEClass, 
-		   source, 
-		   new String[] {
-			 "name", "EstimationConsiderations",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (exampleEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Example",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (guidanceEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Guidance",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (guidanceDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "GuidanceDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getGuidanceDescription_Attachment(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Attachment"
-		   });			
-		addAnnotation
-		  (guidelineEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Guideline",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (iterationEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Iteration",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (methodConfigurationEClass, 
-		   source, 
-		   new String[] {
-			 "name", "MethodConfiguration",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMethodConfiguration_BaseConfiguration(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "BaseConfiguration"
-		   });		
-		addAnnotation
-		  (getMethodConfiguration_MethodPluginSelection(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodPluginSelection"
-		   });		
-		addAnnotation
-		  (getMethodConfiguration_MethodPackageSelection(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodPackageSelection"
-		   });		
-		addAnnotation
-		  (getMethodConfiguration_DefaultView(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "DefaultView"
-		   });		
-		addAnnotation
-		  (getMethodConfiguration_ProcessView(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ProcessView"
-		   });		
-		addAnnotation
-		  (getMethodConfiguration_SubtractedCategory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SubtractedCategory"
-		   });		
-		addAnnotation
-		  (getMethodConfiguration_AddedCategory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "AddedCategory"
-		   });			
-		addAnnotation
-		  (methodElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "MethodElement",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMethodElement_Group(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:1"
-		   });			
-		addAnnotation
-		  (getMethodElement_OwnedRule(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "OwnedRule",
-			 "group", "#group:1"
-		   });		
-		addAnnotation
-		  (getMethodElement_MethodElementProperty(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodElementProperty",
-			 "group", "#group:1"
-		   });			
-		addAnnotation
-		  (getMethodElement_BriefDescription(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "briefDescription"
-		   });			
-		addAnnotation
-		  (getMethodElement_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id"
-		   });			
-		addAnnotation
-		  (getMethodElement_OrderingGuide(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "orderingGuide"
-		   });			
-		addAnnotation
-		  (getMethodElement_Suppressed(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "suppressed"
-		   });		
-		addAnnotation
-		  (methodElementPropertyEClass, 
-		   source, 
-		   new String[] {
-			 "name", "MethodElementProperty",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getMethodElementProperty_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "value"
-		   });			
-		addAnnotation
-		  (methodLibraryEClass, 
-		   source, 
-		   new String[] {
-			 "name", "MethodLibrary",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMethodLibrary_MethodPlugin(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodPlugin"
-		   });		
-		addAnnotation
-		  (getMethodLibrary_MethodConfiguration(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodConfiguration"
-		   });			
-		addAnnotation
-		  (getMethodLibrary_Tool(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "tool"
-		   });			
-		addAnnotation
-		  (methodPackageEClass, 
-		   source, 
-		   new String[] {
-			 "name", "MethodPackage",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMethodPackage_Group1(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:8"
-		   });		
-		addAnnotation
-		  (getMethodPackage_ReusedPackage(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ReusedPackage",
-			 "group", "#group:8"
-		   });		
-		addAnnotation
-		  (getMethodPackage_MethodPackage(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodPackage",
-			 "group", "#group:8"
-		   });			
-		addAnnotation
-		  (getMethodPackage_Global(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "global"
-		   });			
-		addAnnotation
-		  (methodPluginEClass, 
-		   source, 
-		   new String[] {
-			 "name", "MethodPlugin",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMethodPlugin_ReferencedMethodPlugin(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ReferencedMethodPlugin"
-		   });		
-		addAnnotation
-		  (getMethodPlugin_MethodPackage(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MethodPackage"
-		   });		
-		addAnnotation
-		  (getMethodPlugin_UserChangeable(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "userChangeable"
-		   });			
-		addAnnotation
-		  (methodUnitEClass, 
-		   source, 
-		   new String[] {
-			 "name", "MethodUnit",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMethodUnit_Copyright(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Copyright"
-		   });			
-		addAnnotation
-		  (getMethodUnit_Authors(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "authors"
-		   });			
-		addAnnotation
-		  (getMethodUnit_ChangeDate(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "changeDate"
-		   });			
-		addAnnotation
-		  (getMethodUnit_ChangeDescription(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "changeDescription"
-		   });			
-		addAnnotation
-		  (getMethodUnit_Version(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "version"
-		   });			
-		addAnnotation
-		  (milestoneEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Milestone",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (namedElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "NamedElement",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getNamedElement_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "name"
-		   });			
-		addAnnotation
-		  (outcomeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Outcome",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (packageableElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "PackageableElement",
-			 "kind", "empty"
-		   });			
-		addAnnotation
-		  (phaseEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Phase",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (planningDataEClass, 
-		   source, 
-		   new String[] {
-			 "name", "PlanningData",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getPlanningData_FinishDate(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "finishDate"
-		   });			
-		addAnnotation
-		  (getPlanningData_Rank(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "rank"
-		   });			
-		addAnnotation
-		  (getPlanningData_StartDate(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "startDate"
-		   });			
-		addAnnotation
-		  (practiceEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Practice",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getPractice_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getPractice_ActivityReference(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ActivityReference",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getPractice_ContentReference(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ContentReference",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getPractice_SubPractice(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SubPractice",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (practiceDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "PracticeDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getPracticeDescription_AdditionalInfo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "AdditionalInfo"
-		   });			
-		addAnnotation
-		  (getPracticeDescription_Application(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Application"
-		   });			
-		addAnnotation
-		  (getPracticeDescription_Background(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Background"
-		   });			
-		addAnnotation
-		  (getPracticeDescription_Goals(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Goals"
-		   });			
-		addAnnotation
-		  (getPracticeDescription_LevelsOfAdoption(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "LevelsOfAdoption"
-		   });			
-		addAnnotation
-		  (getPracticeDescription_Problem(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Problem"
-		   });			
-		addAnnotation
-		  (processEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Process",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getProcess_IncludesPattern(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "IncludesPattern"
-		   });		
-		addAnnotation
-		  (getProcess_DefaultContext(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "DefaultContext"
-		   });		
-		addAnnotation
-		  (getProcess_ValidContext(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ValidContext"
-		   });			
-		addAnnotation
-		  (getProcess_DiagramURI(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "diagramURI"
-		   });			
-		addAnnotation
-		  (processComponentEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ProcessComponent",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getProcessComponent_Copyright(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Copyright"
-		   });		
-		addAnnotation
-		  (getProcessComponent_Interface(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Interface"
-		   });		
-		addAnnotation
-		  (getProcessComponent_Process(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Process"
-		   });			
-		addAnnotation
-		  (getProcessComponent_Authors(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "authors"
-		   });			
-		addAnnotation
-		  (getProcessComponent_ChangeDate(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "changeDate"
-		   });			
-		addAnnotation
-		  (getProcessComponent_ChangeDescription(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "changeDescription"
-		   });			
-		addAnnotation
-		  (getProcessComponent_Version(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "version"
-		   });			
-		addAnnotation
-		  (processComponentInterfaceEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ProcessComponentInterface",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getProcessComponentInterface_Group1(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:20"
-		   });		
-		addAnnotation
-		  (getProcessComponentInterface_InterfaceSpecification(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "InterfaceSpecification",
-			 "group", "#group:20"
-		   });		
-		addAnnotation
-		  (getProcessComponentInterface_InterfaceIO(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "InterfaceIO",
-			 "group", "#group:20"
-		   });			
-		addAnnotation
-		  (processDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ProcessDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getProcessDescription_Scope(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Scope"
-		   });			
-		addAnnotation
-		  (getProcessDescription_UsageNotes(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "UsageNotes"
-		   });			
-		addAnnotation
-		  (processElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ProcessElement",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (processPackageEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ProcessPackage",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getProcessPackage_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:12"
-		   });		
-		addAnnotation
-		  (getProcessPackage_ProcessElement(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ProcessElement",
-			 "group", "#group:12"
-		   });			
-		addAnnotation
-		  (processPlanningTemplateEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ProcessPlanningTemplate",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getProcessPlanningTemplate_Group3(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:44"
-		   });		
-		addAnnotation
-		  (getProcessPlanningTemplate_BaseProcess(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "BaseProcess",
-			 "group", "#group:44"
-		   });			
-		addAnnotation
-		  (reportEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Report",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (reusableAssetEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ReusableAsset",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (roadmapEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Roadmap",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (roleEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Role",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRole_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getRole_ResponsibleFor(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ResponsibleFor",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (roleDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "RoleDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getRoleDescription_AssignmentApproaches(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "AssignmentApproaches"
-		   });			
-		addAnnotation
-		  (getRoleDescription_Skills(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Skills"
-		   });			
-		addAnnotation
-		  (getRoleDescription_Synonyms(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Synonyms"
-		   });			
-		addAnnotation
-		  (roleDescriptorEClass, 
-		   source, 
-		   new String[] {
-			 "name", "RoleDescriptor",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRoleDescriptor_Role(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Role"
-		   });		
-		addAnnotation
-		  (getRoleDescriptor_ResponsibleFor(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ResponsibleFor"
-		   });			
-		addAnnotation
-		  (roleSetEClass, 
-		   source, 
-		   new String[] {
-			 "name", "RoleSet",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRoleSet_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getRoleSet_Role(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Role",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (roleSetGroupingEClass, 
-		   source, 
-		   new String[] {
-			 "name", "RoleSetGrouping",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRoleSetGrouping_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getRoleSetGrouping_RoleSet(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "RoleSet",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (sectionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Section",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getSection_SubSection(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SubSection"
-		   });		
-		addAnnotation
-		  (getSection_Predecessor(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Predecessor"
-		   });			
-		addAnnotation
-		  (getSection_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Description"
-		   });			
-		addAnnotation
-		  (getSection_SectionName(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "sectionName"
-		   });		
-		addAnnotation
-		  (getSection_VariabilityBasedOnElement(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "variabilityBasedOnElement"
-		   });		
-		addAnnotation
-		  (getSection_VariabilityType(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "variabilityType"
-		   });			
-		addAnnotation
-		  (supportingMaterialEClass, 
-		   source, 
-		   new String[] {
-			 "name", "SupportingMaterial",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (taskEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Task",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getTask_Precondition(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Precondition"
-		   });		
-		addAnnotation
-		  (getTask_Postcondition(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Postcondition"
-		   });		
-		addAnnotation
-		  (getTask_PerformedBy(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "PerformedBy"
-		   });		
-		addAnnotation
-		  (getTask_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:25"
-		   });		
-		addAnnotation
-		  (getTask_MandatoryInput(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MandatoryInput",
-			 "group", "#group:25"
-		   });		
-		addAnnotation
-		  (getTask_Output(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Output",
-			 "group", "#group:25"
-		   });		
-		addAnnotation
-		  (getTask_AdditionallyPerformedBy(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "AdditionallyPerformedBy",
-			 "group", "#group:25"
-		   });		
-		addAnnotation
-		  (getTask_OptionalInput(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "OptionalInput",
-			 "group", "#group:25"
-		   });		
-		addAnnotation
-		  (getTask_Estimate(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Estimate",
-			 "group", "#group:25"
-		   });		
-		addAnnotation
-		  (getTask_EstimationConsiderations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "EstimationConsiderations",
-			 "group", "#group:25"
-		   });		
-		addAnnotation
-		  (getTask_ToolMentor(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ToolMentor",
-			 "group", "#group:25"
-		   });			
-		addAnnotation
-		  (taskDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "TaskDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getTaskDescription_Alternatives(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Alternatives"
-		   });			
-		addAnnotation
-		  (getTaskDescription_Purpose(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Purpose"
-		   });			
-		addAnnotation
-		  (taskDescriptorEClass, 
-		   source, 
-		   new String[] {
-			 "name", "TaskDescriptor",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_Task(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Task"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_PerformedPrimarilyBy(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "PerformedPrimarilyBy"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:27"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_AdditionallyPerformedBy(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "AdditionallyPerformedBy",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_AssistedBy(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "AssistedBy",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_ExternalInput(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ExternalInput",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_MandatoryInput(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MandatoryInput",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_OptionalInput(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "OptionalInput",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_Output(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Output",
-			 "group", "#group:27"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_Step(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Step"
-		   });		
-		addAnnotation
-		  (getTaskDescriptor_IsSynchronizedWithSource(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "isSynchronizedWithSource"
-		   });			
-		addAnnotation
-		  (teamProfileEClass, 
-		   source, 
-		   new String[] {
-			 "name", "TeamProfile",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getTeamProfile_Group1(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:20"
-		   });		
-		addAnnotation
-		  (getTeamProfile_Role(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Role",
-			 "group", "#group:20"
-		   });		
-		addAnnotation
-		  (getTeamProfile_SuperTeam(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SuperTeam",
-			 "group", "#group:20"
-		   });		
-		addAnnotation
-		  (getTeamProfile_SubTeam(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "SubTeam",
-			 "group", "#group:20"
-		   });			
-		addAnnotation
-		  (templateEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Template",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (termDefinitionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "TermDefinition",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (toolEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Tool",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getTool_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getTool_ToolMentor(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ToolMentor",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (toolMentorEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ToolMentor",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (variabilityTypeEEnum, 
-		   source, 
-		   new String[] {
-			 "name", "VariabilityType"
-		   });		
-		addAnnotation
-		  (variabilityTypeObjectEDataType, 
-		   source, 
-		   new String[] {
-			 "name", "VariabilityType:Object",
-			 "baseType", "VariabilityType"
-		   });			
-		addAnnotation
-		  (whitepaperEClass, 
-		   source, 
-		   new String[] {
-			 "name", "Whitepaper",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (workBreakdownElementEClass, 
-		   source, 
-		   new String[] {
-			 "name", "WorkBreakdownElement",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getWorkBreakdownElement_Group1(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:20"
-		   });		
-		addAnnotation
-		  (getWorkBreakdownElement_Predecessor(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Predecessor",
-			 "group", "#group:20"
-		   });			
-		addAnnotation
-		  (getWorkBreakdownElement_IsEventDriven(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "isEventDriven"
-		   });			
-		addAnnotation
-		  (getWorkBreakdownElement_IsOngoing(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "isOngoing"
-		   });			
-		addAnnotation
-		  (getWorkBreakdownElement_IsRepeatable(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "isRepeatable"
-		   });			
-		addAnnotation
-		  (workDefinitionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "WorkDefinition",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getWorkDefinition_Precondition(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Precondition"
-		   });		
-		addAnnotation
-		  (getWorkDefinition_Postcondition(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Postcondition"
-		   });			
-		addAnnotation
-		  (workOrderEClass, 
-		   source, 
-		   new String[] {
-			 "name", "WorkOrder",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getWorkOrder_Value(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });			
-		addAnnotation
-		  (getWorkOrder_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id"
-		   });			
-		addAnnotation
-		  (getWorkOrder_LinkType(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "linkType"
-		   });			
-		addAnnotation
-		  (workOrderTypeEEnum, 
-		   source, 
-		   new String[] {
-			 "name", "WorkOrderType"
-		   });		
-		addAnnotation
-		  (workOrderTypeObjectEDataType, 
-		   source, 
-		   new String[] {
-			 "name", "WorkOrderType:Object",
-			 "baseType", "WorkOrderType"
-		   });			
-		addAnnotation
-		  (workProductEClass, 
-		   source, 
-		   new String[] {
-			 "name", "WorkProduct",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getWorkProduct_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getWorkProduct_Estimate(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Estimate",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getWorkProduct_EstimationConsiderations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "EstimationConsiderations",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getWorkProduct_Report(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Report",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getWorkProduct_Template(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Template",
-			 "group", "#group:22"
-		   });		
-		addAnnotation
-		  (getWorkProduct_ToolMentor(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ToolMentor",
-			 "group", "#group:22"
-		   });			
-		addAnnotation
-		  (workProductDescriptionEClass, 
-		   source, 
-		   new String[] {
-			 "name", "WorkProductDescription",
-			 "kind", "elementOnly"
-		   });			
-		addAnnotation
-		  (getWorkProductDescription_ImpactOfNotHaving(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ImpactOfNotHaving"
-		   });			
-		addAnnotation
-		  (getWorkProductDescription_Purpose(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Purpose"
-		   });			
-		addAnnotation
-		  (getWorkProductDescription_ReasonsForNotNeeding(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ReasonsForNotNeeding"
-		   });			
-		addAnnotation
-		  (workProductDescriptorEClass, 
-		   source, 
-		   new String[] {
-			 "name", "WorkProductDescriptor",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_WorkProduct(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "WorkProduct"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_ResponsibleRole(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ResponsibleRole"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_Group1(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:23"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_ExternalInputTo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ExternalInputTo",
-			 "group", "#group:23"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_ImpactedBy(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ImpactedBy",
-			 "group", "#group:23"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_Impacts(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "Impacts",
-			 "group", "#group:23"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_MandatoryInputTo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "MandatoryInputTo",
-			 "group", "#group:23"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_OptionalInputTo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "OptionalInputTo",
-			 "group", "#group:23"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_OutputFrom(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "OutputFrom",
-			 "group", "#group:23"
-		   });		
-		addAnnotation
-		  (getWorkProductDescriptor_DeliverableParts(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "DeliverableParts",
-			 "group", "#group:23"
-		   });			
-		addAnnotation
-		  (getWorkProductDescriptor_ActivityEntryState(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "activityEntryState"
-		   });			
-		addAnnotation
-		  (getWorkProductDescriptor_ActivityExitState(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "activityExitState"
-		   });			
-		addAnnotation
-		  (workProductTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "WorkProductType",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getWorkProductType_Group2(), 
-		   source, 
-		   new String[] {
-			 "kind", "group",
-			 "name", "group:22"
-		   });		
-		addAnnotation
-		  (getWorkProductType_WorkProduct(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "WorkProduct",
-			 "group", "#group:22"
-		   });
-	}
-
-} //UmaPackageImpl
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WhitepaperImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WhitepaperImpl.java
deleted file mode 100644
index f72c0ff..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WhitepaperImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WhitepaperImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.Whitepaper;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Whitepaper</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class WhitepaperImpl extends ConceptImpl implements Whitepaper {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WhitepaperImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WHITEPAPER;
-	}
-
-} //WhitepaperImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkBreakdownElementImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkBreakdownElementImpl.java
deleted file mode 100644
index 2b66f55..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkBreakdownElementImpl.java
+++ /dev/null
@@ -1,447 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkBreakdownElementImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkBreakdownElement;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Breakdown Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl#getPredecessor <em>Predecessor</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl#isIsEventDriven <em>Is Event Driven</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl#isIsOngoing <em>Is Ongoing</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkBreakdownElementImpl#isIsRepeatable <em>Is Repeatable</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkBreakdownElementImpl extends BreakdownElementImpl implements WorkBreakdownElement {
-	/**
-	 * The cached value of the '{@link #getGroup1() <em>Group1</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup1()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group1;
-
-	/**
-	 * The default value of the '{@link #isIsEventDriven() <em>Is Event Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsEventDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_EVENT_DRIVEN_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsEventDriven() <em>Is Event Driven</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsEventDriven()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isEventDriven = IS_EVENT_DRIVEN_EDEFAULT;
-
-	/**
-	 * This is true if the Is Event Driven attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isEventDrivenESet;
-
-	/**
-	 * The default value of the '{@link #isIsOngoing() <em>Is Ongoing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsOngoing()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_ONGOING_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsOngoing() <em>Is Ongoing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsOngoing()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isOngoing = IS_ONGOING_EDEFAULT;
-
-	/**
-	 * This is true if the Is Ongoing attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isOngoingESet;
-
-	/**
-	 * The default value of the '{@link #isIsRepeatable() <em>Is Repeatable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsRepeatable()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IS_REPEATABLE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIsRepeatable() <em>Is Repeatable</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIsRepeatable()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isRepeatable = IS_REPEATABLE_EDEFAULT;
-
-	/**
-	 * This is true if the Is Repeatable attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean isRepeatableESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkBreakdownElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup1() {
-		if (group1 == null) {
-			group1 = new BasicFeatureMap(this, UmaPackage.WORK_BREAKDOWN_ELEMENT__GROUP1);
-		}
-		return group1;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPredecessor() {
-		return getGroup1().list(UmaPackage.Literals.WORK_BREAKDOWN_ELEMENT__PREDECESSOR);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsEventDriven() {
-		return isEventDriven;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsEventDriven(boolean newIsEventDriven) {
-		boolean oldIsEventDriven = isEventDriven;
-		isEventDriven = newIsEventDriven;
-		boolean oldIsEventDrivenESet = isEventDrivenESet;
-		isEventDrivenESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN, oldIsEventDriven, isEventDriven, !oldIsEventDrivenESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsEventDriven() {
-		boolean oldIsEventDriven = isEventDriven;
-		boolean oldIsEventDrivenESet = isEventDrivenESet;
-		isEventDriven = IS_EVENT_DRIVEN_EDEFAULT;
-		isEventDrivenESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN, oldIsEventDriven, IS_EVENT_DRIVEN_EDEFAULT, oldIsEventDrivenESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsEventDriven() {
-		return isEventDrivenESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsOngoing() {
-		return isOngoing;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsOngoing(boolean newIsOngoing) {
-		boolean oldIsOngoing = isOngoing;
-		isOngoing = newIsOngoing;
-		boolean oldIsOngoingESet = isOngoingESet;
-		isOngoingESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING, oldIsOngoing, isOngoing, !oldIsOngoingESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsOngoing() {
-		boolean oldIsOngoing = isOngoing;
-		boolean oldIsOngoingESet = isOngoingESet;
-		isOngoing = IS_ONGOING_EDEFAULT;
-		isOngoingESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING, oldIsOngoing, IS_ONGOING_EDEFAULT, oldIsOngoingESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsOngoing() {
-		return isOngoingESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIsRepeatable() {
-		return isRepeatable;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIsRepeatable(boolean newIsRepeatable) {
-		boolean oldIsRepeatable = isRepeatable;
-		isRepeatable = newIsRepeatable;
-		boolean oldIsRepeatableESet = isRepeatableESet;
-		isRepeatableESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE, oldIsRepeatable, isRepeatable, !oldIsRepeatableESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetIsRepeatable() {
-		boolean oldIsRepeatable = isRepeatable;
-		boolean oldIsRepeatableESet = isRepeatableESet;
-		isRepeatable = IS_REPEATABLE_EDEFAULT;
-		isRepeatableESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE, oldIsRepeatable, IS_REPEATABLE_EDEFAULT, oldIsRepeatableESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetIsRepeatable() {
-		return isRepeatableESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__GROUP1:
-				return ((InternalEList)getGroup1()).basicRemove(otherEnd, msgs);
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__PREDECESSOR:
-				return ((InternalEList)getPredecessor()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__GROUP1:
-				if (coreType) return getGroup1();
-				return ((FeatureMap.Internal)getGroup1()).getWrapper();
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__PREDECESSOR:
-				return getPredecessor();
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-				return isIsEventDriven() ? Boolean.TRUE : Boolean.FALSE;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-				return isIsOngoing() ? Boolean.TRUE : Boolean.FALSE;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-				return isIsRepeatable() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__GROUP1:
-				((FeatureMap.Internal)getGroup1()).set(newValue);
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__PREDECESSOR:
-				getPredecessor().clear();
-				getPredecessor().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-				setIsEventDriven(((Boolean)newValue).booleanValue());
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-				setIsOngoing(((Boolean)newValue).booleanValue());
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-				setIsRepeatable(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__GROUP1:
-				getGroup1().clear();
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__PREDECESSOR:
-				getPredecessor().clear();
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-				unsetIsEventDriven();
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-				unsetIsOngoing();
-				return;
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-				unsetIsRepeatable();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__GROUP1:
-				return group1 != null && !group1.isEmpty();
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__PREDECESSOR:
-				return !getPredecessor().isEmpty();
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_EVENT_DRIVEN:
-				return isSetIsEventDriven();
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_ONGOING:
-				return isSetIsOngoing();
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT__IS_REPEATABLE:
-				return isSetIsRepeatable();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group1: ");
-		result.append(group1);
-		result.append(", isEventDriven: ");
-		if (isEventDrivenESet) result.append(isEventDriven); else result.append("<unset>");
-		result.append(", isOngoing: ");
-		if (isOngoingESet) result.append(isOngoing); else result.append("<unset>");
-		result.append(", isRepeatable: ");
-		if (isRepeatableESet) result.append(isRepeatable); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkBreakdownElementImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkDefinitionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkDefinitionImpl.java
deleted file mode 100644
index 0ed8bd6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkDefinitionImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkDefinitionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkDefinition;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Definition</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkDefinitionImpl#getPrecondition <em>Precondition</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkDefinitionImpl#getPostcondition <em>Postcondition</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkDefinitionImpl extends MethodElementImpl implements WorkDefinition {
-	/**
-	 * The default value of the '{@link #getPrecondition() <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PRECONDITION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPrecondition() <em>Precondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPrecondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected String precondition = PRECONDITION_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPostcondition() <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String POSTCONDITION_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPostcondition() <em>Postcondition</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPostcondition()
-	 * @generated
-	 * @ordered
-	 */
-	protected String postcondition = POSTCONDITION_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkDefinitionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_DEFINITION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPrecondition() {
-		return precondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPrecondition(String newPrecondition) {
-		String oldPrecondition = precondition;
-		precondition = newPrecondition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_DEFINITION__PRECONDITION, oldPrecondition, precondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPostcondition() {
-		return postcondition;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPostcondition(String newPostcondition) {
-		String oldPostcondition = postcondition;
-		postcondition = newPostcondition;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_DEFINITION__POSTCONDITION, oldPostcondition, postcondition));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.WORK_DEFINITION__PRECONDITION:
-				return getPrecondition();
-			case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-				return getPostcondition();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.WORK_DEFINITION__PRECONDITION:
-				setPrecondition((String)newValue);
-				return;
-			case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-				setPostcondition((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_DEFINITION__PRECONDITION:
-				setPrecondition(PRECONDITION_EDEFAULT);
-				return;
-			case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-				setPostcondition(POSTCONDITION_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_DEFINITION__PRECONDITION:
-				return PRECONDITION_EDEFAULT == null ? precondition != null : !PRECONDITION_EDEFAULT.equals(precondition);
-			case UmaPackage.WORK_DEFINITION__POSTCONDITION:
-				return POSTCONDITION_EDEFAULT == null ? postcondition != null : !POSTCONDITION_EDEFAULT.equals(postcondition);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (precondition: ");
-		result.append(precondition);
-		result.append(", postcondition: ");
-		result.append(postcondition);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkDefinitionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkOrderImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkOrderImpl.java
deleted file mode 100644
index b9aed48..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkOrderImpl.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkOrderImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.sdo.impl.EDataObjectImpl;
-
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkOrder;
-import org.eclipse.epf.xml.uma.WorkOrderType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Order</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkOrderImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkOrderImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkOrderImpl#getLinkType <em>Link Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkOrderImpl extends EDataObjectImpl implements WorkOrder {
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getLinkType() <em>Link Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final WorkOrderType LINK_TYPE_EDEFAULT = WorkOrderType.FINISH_TO_START_LITERAL;
-
-	/**
-	 * The cached value of the '{@link #getLinkType() <em>Link Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLinkType()
-	 * @generated
-	 * @ordered
-	 */
-	protected WorkOrderType linkType = LINK_TYPE_EDEFAULT;
-
-	/**
-	 * This is true if the Link Type attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean linkTypeESet;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkOrderImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_ORDER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_ORDER__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_ORDER__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public WorkOrderType getLinkType() {
-		return linkType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLinkType(WorkOrderType newLinkType) {
-		WorkOrderType oldLinkType = linkType;
-		linkType = newLinkType == null ? LINK_TYPE_EDEFAULT : newLinkType;
-		boolean oldLinkTypeESet = linkTypeESet;
-		linkTypeESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_ORDER__LINK_TYPE, oldLinkType, linkType, !oldLinkTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetLinkType() {
-		WorkOrderType oldLinkType = linkType;
-		boolean oldLinkTypeESet = linkTypeESet;
-		linkType = LINK_TYPE_EDEFAULT;
-		linkTypeESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, UmaPackage.WORK_ORDER__LINK_TYPE, oldLinkType, LINK_TYPE_EDEFAULT, oldLinkTypeESet));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetLinkType() {
-		return linkTypeESet;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.WORK_ORDER__VALUE:
-				return getValue();
-			case UmaPackage.WORK_ORDER__ID:
-				return getId();
-			case UmaPackage.WORK_ORDER__LINK_TYPE:
-				return getLinkType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.WORK_ORDER__VALUE:
-				setValue((String)newValue);
-				return;
-			case UmaPackage.WORK_ORDER__ID:
-				setId((String)newValue);
-				return;
-			case UmaPackage.WORK_ORDER__LINK_TYPE:
-				setLinkType((WorkOrderType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_ORDER__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-			case UmaPackage.WORK_ORDER__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case UmaPackage.WORK_ORDER__LINK_TYPE:
-				unsetLinkType();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_ORDER__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-			case UmaPackage.WORK_ORDER__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case UmaPackage.WORK_ORDER__LINK_TYPE:
-				return isSetLinkType();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (value: ");
-		result.append(value);
-		result.append(", id: ");
-		result.append(id);
-		result.append(", linkType: ");
-		if (linkTypeESet) result.append(linkType); else result.append("<unset>");
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkOrderImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductDescriptionImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductDescriptionImpl.java
deleted file mode 100644
index cca7bed..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductDescriptionImpl.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductDescriptionImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkProductDescription;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product Description</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptionImpl#getImpactOfNotHaving <em>Impact Of Not Having</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptionImpl#getPurpose <em>Purpose</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptionImpl#getReasonsForNotNeeding <em>Reasons For Not Needing</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductDescriptionImpl extends ContentDescriptionImpl implements WorkProductDescription {
-	/**
-	 * The default value of the '{@link #getImpactOfNotHaving() <em>Impact Of Not Having</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImpactOfNotHaving()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String IMPACT_OF_NOT_HAVING_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getImpactOfNotHaving() <em>Impact Of Not Having</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getImpactOfNotHaving()
-	 * @generated
-	 * @ordered
-	 */
-	protected String impactOfNotHaving = IMPACT_OF_NOT_HAVING_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PURPOSE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getPurpose() <em>Purpose</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPurpose()
-	 * @generated
-	 * @ordered
-	 */
-	protected String purpose = PURPOSE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getReasonsForNotNeeding() <em>Reasons For Not Needing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReasonsForNotNeeding()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REASONS_FOR_NOT_NEEDING_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getReasonsForNotNeeding() <em>Reasons For Not Needing</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReasonsForNotNeeding()
-	 * @generated
-	 * @ordered
-	 */
-	protected String reasonsForNotNeeding = REASONS_FOR_NOT_NEEDING_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDescriptionImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT_DESCRIPTION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getImpactOfNotHaving() {
-		return impactOfNotHaving;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setImpactOfNotHaving(String newImpactOfNotHaving) {
-		String oldImpactOfNotHaving = impactOfNotHaving;
-		impactOfNotHaving = newImpactOfNotHaving;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING, oldImpactOfNotHaving, impactOfNotHaving));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getPurpose() {
-		return purpose;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPurpose(String newPurpose) {
-		String oldPurpose = purpose;
-		purpose = newPurpose;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE, oldPurpose, purpose));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getReasonsForNotNeeding() {
-		return reasonsForNotNeeding;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReasonsForNotNeeding(String newReasonsForNotNeeding) {
-		String oldReasonsForNotNeeding = reasonsForNotNeeding;
-		reasonsForNotNeeding = newReasonsForNotNeeding;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING, oldReasonsForNotNeeding, reasonsForNotNeeding));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-				return getImpactOfNotHaving();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-				return getPurpose();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-				return getReasonsForNotNeeding();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-				setImpactOfNotHaving((String)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-				setPurpose((String)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-				setReasonsForNotNeeding((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-				setImpactOfNotHaving(IMPACT_OF_NOT_HAVING_EDEFAULT);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-				setPurpose(PURPOSE_EDEFAULT);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-				setReasonsForNotNeeding(REASONS_FOR_NOT_NEEDING_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__IMPACT_OF_NOT_HAVING:
-				return IMPACT_OF_NOT_HAVING_EDEFAULT == null ? impactOfNotHaving != null : !IMPACT_OF_NOT_HAVING_EDEFAULT.equals(impactOfNotHaving);
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__PURPOSE:
-				return PURPOSE_EDEFAULT == null ? purpose != null : !PURPOSE_EDEFAULT.equals(purpose);
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION__REASONS_FOR_NOT_NEEDING:
-				return REASONS_FOR_NOT_NEEDING_EDEFAULT == null ? reasonsForNotNeeding != null : !REASONS_FOR_NOT_NEEDING_EDEFAULT.equals(reasonsForNotNeeding);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (impactOfNotHaving: ");
-		result.append(impactOfNotHaving);
-		result.append(", purpose: ");
-		result.append(purpose);
-		result.append(", reasonsForNotNeeding: ");
-		result.append(reasonsForNotNeeding);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkProductDescriptionImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductDescriptorImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductDescriptorImpl.java
deleted file mode 100644
index e3204e6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductDescriptorImpl.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductDescriptorImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkProductDescriptor;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product Descriptor</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getWorkProduct <em>Work Product</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getResponsibleRole <em>Responsible Role</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getGroup1 <em>Group1</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getExternalInputTo <em>External Input To</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getImpactedBy <em>Impacted By</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getImpacts <em>Impacts</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getMandatoryInputTo <em>Mandatory Input To</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getOptionalInputTo <em>Optional Input To</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getOutputFrom <em>Output From</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getDeliverableParts <em>Deliverable Parts</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getActivityEntryState <em>Activity Entry State</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductDescriptorImpl#getActivityExitState <em>Activity Exit State</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductDescriptorImpl extends DescriptorImpl implements WorkProductDescriptor {
-	/**
-	 * The default value of the '{@link #getWorkProduct() <em>Work Product</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkProduct()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String WORK_PRODUCT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getWorkProduct() <em>Work Product</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getWorkProduct()
-	 * @generated
-	 * @ordered
-	 */
-	protected String workProduct = WORK_PRODUCT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getResponsibleRole() <em>Responsible Role</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResponsibleRole()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String RESPONSIBLE_ROLE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getResponsibleRole() <em>Responsible Role</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResponsibleRole()
-	 * @generated
-	 * @ordered
-	 */
-	protected String responsibleRole = RESPONSIBLE_ROLE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getGroup1() <em>Group1</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup1()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group1;
-
-	/**
-	 * The default value of the '{@link #getActivityEntryState() <em>Activity Entry State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityEntryState()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ACTIVITY_ENTRY_STATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActivityEntryState() <em>Activity Entry State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityEntryState()
-	 * @generated
-	 * @ordered
-	 */
-	protected String activityEntryState = ACTIVITY_ENTRY_STATE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getActivityExitState() <em>Activity Exit State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityExitState()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ACTIVITY_EXIT_STATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getActivityExitState() <em>Activity Exit State</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActivityExitState()
-	 * @generated
-	 * @ordered
-	 */
-	protected String activityExitState = ACTIVITY_EXIT_STATE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductDescriptorImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getWorkProduct() {
-		return workProduct;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWorkProduct(String newWorkProduct) {
-		String oldWorkProduct = workProduct;
-		workProduct = newWorkProduct;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT, oldWorkProduct, workProduct));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getResponsibleRole() {
-		return responsibleRole;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResponsibleRole(String newResponsibleRole) {
-		String oldResponsibleRole = responsibleRole;
-		responsibleRole = newResponsibleRole;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE, oldResponsibleRole, responsibleRole));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup1() {
-		if (group1 == null) {
-			group1 = new BasicFeatureMap(this, UmaPackage.WORK_PRODUCT_DESCRIPTOR__GROUP1);
-		}
-		return group1;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExternalInputTo() {
-		return getGroup1().list(UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getImpactedBy() {
-		return getGroup1().list(UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getImpacts() {
-		return getGroup1().list(UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__IMPACTS);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMandatoryInputTo() {
-		return getGroup1().list(UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOptionalInputTo() {
-		return getGroup1().list(UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOutputFrom() {
-		return getGroup1().list(UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDeliverableParts() {
-		return getGroup1().list(UmaPackage.Literals.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getActivityEntryState() {
-		return activityEntryState;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActivityEntryState(String newActivityEntryState) {
-		String oldActivityEntryState = activityEntryState;
-		activityEntryState = newActivityEntryState;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE, oldActivityEntryState, activityEntryState));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getActivityExitState() {
-		return activityExitState;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActivityExitState(String newActivityExitState) {
-		String oldActivityExitState = activityExitState;
-		activityExitState = newActivityExitState;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE, oldActivityExitState, activityExitState));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__GROUP1:
-				return ((InternalEList)getGroup1()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-				return getWorkProduct();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE:
-				return getResponsibleRole();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__GROUP1:
-				if (coreType) return getGroup1();
-				return ((FeatureMap.Internal)getGroup1()).getWrapper();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO:
-				return getExternalInputTo();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-				return getImpactedBy();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-				return getImpacts();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO:
-				return getMandatoryInputTo();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO:
-				return getOptionalInputTo();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM:
-				return getOutputFrom();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-				return getDeliverableParts();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-				return getActivityEntryState();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-				return getActivityExitState();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-				setWorkProduct((String)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE:
-				setResponsibleRole((String)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__GROUP1:
-				((FeatureMap.Internal)getGroup1()).set(newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO:
-				getExternalInputTo().clear();
-				getExternalInputTo().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-				getImpactedBy().clear();
-				getImpactedBy().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-				getImpacts().clear();
-				getImpacts().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO:
-				getMandatoryInputTo().clear();
-				getMandatoryInputTo().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO:
-				getOptionalInputTo().clear();
-				getOptionalInputTo().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM:
-				getOutputFrom().clear();
-				getOutputFrom().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-				getDeliverableParts().clear();
-				getDeliverableParts().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-				setActivityEntryState((String)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-				setActivityExitState((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-				setWorkProduct(WORK_PRODUCT_EDEFAULT);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE:
-				setResponsibleRole(RESPONSIBLE_ROLE_EDEFAULT);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__GROUP1:
-				getGroup1().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO:
-				getExternalInputTo().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-				getImpactedBy().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-				getImpacts().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO:
-				getMandatoryInputTo().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO:
-				getOptionalInputTo().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM:
-				getOutputFrom().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-				getDeliverableParts().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-				setActivityEntryState(ACTIVITY_ENTRY_STATE_EDEFAULT);
-				return;
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-				setActivityExitState(ACTIVITY_EXIT_STATE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__WORK_PRODUCT:
-				return WORK_PRODUCT_EDEFAULT == null ? workProduct != null : !WORK_PRODUCT_EDEFAULT.equals(workProduct);
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__RESPONSIBLE_ROLE:
-				return RESPONSIBLE_ROLE_EDEFAULT == null ? responsibleRole != null : !RESPONSIBLE_ROLE_EDEFAULT.equals(responsibleRole);
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__GROUP1:
-				return group1 != null && !group1.isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__EXTERNAL_INPUT_TO:
-				return !getExternalInputTo().isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTED_BY:
-				return !getImpactedBy().isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__IMPACTS:
-				return !getImpacts().isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__MANDATORY_INPUT_TO:
-				return !getMandatoryInputTo().isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OPTIONAL_INPUT_TO:
-				return !getOptionalInputTo().isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__OUTPUT_FROM:
-				return !getOutputFrom().isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__DELIVERABLE_PARTS:
-				return !getDeliverableParts().isEmpty();
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_ENTRY_STATE:
-				return ACTIVITY_ENTRY_STATE_EDEFAULT == null ? activityEntryState != null : !ACTIVITY_ENTRY_STATE_EDEFAULT.equals(activityEntryState);
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR__ACTIVITY_EXIT_STATE:
-				return ACTIVITY_EXIT_STATE_EDEFAULT == null ? activityExitState != null : !ACTIVITY_EXIT_STATE_EDEFAULT.equals(activityExitState);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (workProduct: ");
-		result.append(workProduct);
-		result.append(", responsibleRole: ");
-		result.append(responsibleRole);
-		result.append(", group1: ");
-		result.append(group1);
-		result.append(", activityEntryState: ");
-		result.append(activityEntryState);
-		result.append(", activityExitState: ");
-		result.append(activityExitState);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkProductDescriptorImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductImpl.java
deleted file mode 100644
index deb3b43..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductImpl.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductImpl.java,v 1.1 2008/01/15 08:51:35 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkProduct;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl#getEstimate <em>Estimate</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl#getEstimationConsiderations <em>Estimation Considerations</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl#getReport <em>Report</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl#getTemplate <em>Template</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductImpl#getToolMentor <em>Tool Mentor</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductImpl extends ContentElementImpl implements WorkProduct {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.WORK_PRODUCT__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEstimate() {
-		return getGroup2().list(UmaPackage.Literals.WORK_PRODUCT__ESTIMATE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getEstimationConsiderations() {
-		return getGroup2().list(UmaPackage.Literals.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReport() {
-		return getGroup2().list(UmaPackage.Literals.WORK_PRODUCT__REPORT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTemplate() {
-		return getGroup2().list(UmaPackage.Literals.WORK_PRODUCT__TEMPLATE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getToolMentor() {
-		return getGroup2().list(UmaPackage.Literals.WORK_PRODUCT__TOOL_MENTOR);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.WORK_PRODUCT__ESTIMATE:
-				return getEstimate();
-			case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-				return getEstimationConsiderations();
-			case UmaPackage.WORK_PRODUCT__REPORT:
-				return getReport();
-			case UmaPackage.WORK_PRODUCT__TEMPLATE:
-				return getTemplate();
-			case UmaPackage.WORK_PRODUCT__TOOL_MENTOR:
-				return getToolMentor();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT__ESTIMATE:
-				getEstimate().clear();
-				getEstimate().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-				getEstimationConsiderations().clear();
-				getEstimationConsiderations().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT__REPORT:
-				getReport().clear();
-				getReport().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT__TEMPLATE:
-				getTemplate().clear();
-				getTemplate().addAll((Collection)newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT__TOOL_MENTOR:
-				getToolMentor().clear();
-				getToolMentor().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT__ESTIMATE:
-				getEstimate().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-				getEstimationConsiderations().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT__REPORT:
-				getReport().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT__TEMPLATE:
-				getTemplate().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT__TOOL_MENTOR:
-				getToolMentor().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.WORK_PRODUCT__ESTIMATE:
-				return !getEstimate().isEmpty();
-			case UmaPackage.WORK_PRODUCT__ESTIMATION_CONSIDERATIONS:
-				return !getEstimationConsiderations().isEmpty();
-			case UmaPackage.WORK_PRODUCT__REPORT:
-				return !getReport().isEmpty();
-			case UmaPackage.WORK_PRODUCT__TEMPLATE:
-				return !getTemplate().isEmpty();
-			case UmaPackage.WORK_PRODUCT__TOOL_MENTOR:
-				return !getToolMentor().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkProductImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductTypeImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductTypeImpl.java
deleted file mode 100644
index 2740bd6..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/WorkProductTypeImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: WorkProductTypeImpl.java,v 1.1 2008/01/15 08:51:36 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.WorkProductType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Work Product Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductTypeImpl#getGroup2 <em>Group2</em>}</li>
- *   <li>{@link org.eclipse.epf.xml.uma.impl.WorkProductTypeImpl#getWorkProduct <em>Work Product</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class WorkProductTypeImpl extends ContentCategoryImpl implements WorkProductType {
-	/**
-	 * The cached value of the '{@link #getGroup2() <em>Group2</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getGroup2()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap group2;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected WorkProductTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return UmaPackage.Literals.WORK_PRODUCT_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getGroup2() {
-		if (group2 == null) {
-			group2 = new BasicFeatureMap(this, UmaPackage.WORK_PRODUCT_TYPE__GROUP2);
-		}
-		return group2;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getWorkProduct() {
-		return getGroup2().list(UmaPackage.Literals.WORK_PRODUCT_TYPE__WORK_PRODUCT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_TYPE__GROUP2:
-				return ((InternalEList)getGroup2()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_TYPE__GROUP2:
-				if (coreType) return getGroup2();
-				return ((FeatureMap.Internal)getGroup2()).getWrapper();
-			case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCT:
-				return getWorkProduct();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_TYPE__GROUP2:
-				((FeatureMap.Internal)getGroup2()).set(newValue);
-				return;
-			case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCT:
-				getWorkProduct().clear();
-				getWorkProduct().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_TYPE__GROUP2:
-				getGroup2().clear();
-				return;
-			case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCT:
-				getWorkProduct().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case UmaPackage.WORK_PRODUCT_TYPE__GROUP2:
-				return group2 != null && !group2.isEmpty();
-			case UmaPackage.WORK_PRODUCT_TYPE__WORK_PRODUCT:
-				return !getWorkProduct().isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (group2: ");
-		result.append(group2);
-		result.append(')');
-		return result.toString();
-	}
-
-} //WorkProductTypeImpl
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/package.html b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/package.html
deleted file mode 100644
index 4ee28de..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/impl/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the implementation of the XML UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/package.html b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/package.html
deleted file mode 100644
index 746a192..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides the interfaces for the UMA XML model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaAdapterFactory.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaAdapterFactory.java
deleted file mode 100644
index 3820b1f..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaAdapterFactory.java
+++ /dev/null
@@ -1,1629 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaAdapterFactory.java,v 1.1 2008/01/15 08:52:51 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.epf.xml.uma.Activity;
-import org.eclipse.epf.xml.uma.ActivityDescription;
-import org.eclipse.epf.xml.uma.Artifact;
-import org.eclipse.epf.xml.uma.ArtifactDescription;
-import org.eclipse.epf.xml.uma.BreakdownElement;
-import org.eclipse.epf.xml.uma.BreakdownElementDescription;
-import org.eclipse.epf.xml.uma.CapabilityPattern;
-import org.eclipse.epf.xml.uma.Checklist;
-import org.eclipse.epf.xml.uma.CompositeRole;
-import org.eclipse.epf.xml.uma.Concept;
-import org.eclipse.epf.xml.uma.Constraint;
-import org.eclipse.epf.xml.uma.ContentCategory;
-import org.eclipse.epf.xml.uma.ContentCategoryPackage;
-import org.eclipse.epf.xml.uma.ContentDescription;
-import org.eclipse.epf.xml.uma.ContentElement;
-import org.eclipse.epf.xml.uma.ContentPackage;
-import org.eclipse.epf.xml.uma.CustomCategory;
-import org.eclipse.epf.xml.uma.Deliverable;
-import org.eclipse.epf.xml.uma.DeliverableDescription;
-import org.eclipse.epf.xml.uma.DeliveryProcess;
-import org.eclipse.epf.xml.uma.DeliveryProcessDescription;
-import org.eclipse.epf.xml.uma.DescribableElement;
-import org.eclipse.epf.xml.uma.Descriptor;
-import org.eclipse.epf.xml.uma.DescriptorDescription;
-import org.eclipse.epf.xml.uma.Discipline;
-import org.eclipse.epf.xml.uma.DisciplineGrouping;
-import org.eclipse.epf.xml.uma.DocumentRoot;
-import org.eclipse.epf.xml.uma.Domain;
-import org.eclipse.epf.xml.uma.Element;
-import org.eclipse.epf.xml.uma.Estimate;
-import org.eclipse.epf.xml.uma.EstimatingMetric;
-import org.eclipse.epf.xml.uma.EstimationConsiderations;
-import org.eclipse.epf.xml.uma.Example;
-import org.eclipse.epf.xml.uma.Guidance;
-import org.eclipse.epf.xml.uma.GuidanceDescription;
-import org.eclipse.epf.xml.uma.Guideline;
-import org.eclipse.epf.xml.uma.Iteration;
-import org.eclipse.epf.xml.uma.MethodConfiguration;
-import org.eclipse.epf.xml.uma.MethodElement;
-import org.eclipse.epf.xml.uma.MethodElementProperty;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.MethodUnit;
-import org.eclipse.epf.xml.uma.Milestone;
-import org.eclipse.epf.xml.uma.NamedElement;
-import org.eclipse.epf.xml.uma.Outcome;
-import org.eclipse.epf.xml.uma.PackageableElement;
-import org.eclipse.epf.xml.uma.Phase;
-import org.eclipse.epf.xml.uma.PlanningData;
-import org.eclipse.epf.xml.uma.Practice;
-import org.eclipse.epf.xml.uma.PracticeDescription;
-import org.eclipse.epf.xml.uma.ProcessComponent;
-import org.eclipse.epf.xml.uma.ProcessComponentInterface;
-import org.eclipse.epf.xml.uma.ProcessDescription;
-import org.eclipse.epf.xml.uma.ProcessElement;
-import org.eclipse.epf.xml.uma.ProcessPackage;
-import org.eclipse.epf.xml.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.xml.uma.Report;
-import org.eclipse.epf.xml.uma.ReusableAsset;
-import org.eclipse.epf.xml.uma.Roadmap;
-import org.eclipse.epf.xml.uma.Role;
-import org.eclipse.epf.xml.uma.RoleDescription;
-import org.eclipse.epf.xml.uma.RoleDescriptor;
-import org.eclipse.epf.xml.uma.RoleSet;
-import org.eclipse.epf.xml.uma.RoleSetGrouping;
-import org.eclipse.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.SupportingMaterial;
-import org.eclipse.epf.xml.uma.Task;
-import org.eclipse.epf.xml.uma.TaskDescription;
-import org.eclipse.epf.xml.uma.TaskDescriptor;
-import org.eclipse.epf.xml.uma.TeamProfile;
-import org.eclipse.epf.xml.uma.Template;
-import org.eclipse.epf.xml.uma.TermDefinition;
-import org.eclipse.epf.xml.uma.Tool;
-import org.eclipse.epf.xml.uma.ToolMentor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.Whitepaper;
-import org.eclipse.epf.xml.uma.WorkBreakdownElement;
-import org.eclipse.epf.xml.uma.WorkDefinition;
-import org.eclipse.epf.xml.uma.WorkOrder;
-import org.eclipse.epf.xml.uma.WorkProduct;
-import org.eclipse.epf.xml.uma.WorkProductDescription;
-import org.eclipse.epf.xml.uma.WorkProductDescriptor;
-import org.eclipse.epf.xml.uma.WorkProductType;
-
-/**
- * <!-- 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.epf.xml.uma.UmaPackage
- * @generated
- */
-public class UmaAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static UmaPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = UmaPackage.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
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected UmaSwitch modelSwitch =
-		new UmaSwitch() {
-			public Object caseActivity(Activity object) {
-				return createActivityAdapter();
-			}
-			public Object caseActivityDescription(ActivityDescription object) {
-				return createActivityDescriptionAdapter();
-			}
-			public Object caseArtifact(Artifact object) {
-				return createArtifactAdapter();
-			}
-			public Object caseArtifactDescription(ArtifactDescription object) {
-				return createArtifactDescriptionAdapter();
-			}
-			public Object caseBreakdownElement(BreakdownElement object) {
-				return createBreakdownElementAdapter();
-			}
-			public Object caseBreakdownElementDescription(BreakdownElementDescription object) {
-				return createBreakdownElementDescriptionAdapter();
-			}
-			public Object caseCapabilityPattern(CapabilityPattern object) {
-				return createCapabilityPatternAdapter();
-			}
-			public Object caseChecklist(Checklist object) {
-				return createChecklistAdapter();
-			}
-			public Object caseCompositeRole(CompositeRole object) {
-				return createCompositeRoleAdapter();
-			}
-			public Object caseConcept(Concept object) {
-				return createConceptAdapter();
-			}
-			public Object caseConstraint(Constraint object) {
-				return createConstraintAdapter();
-			}
-			public Object caseContentCategory(ContentCategory object) {
-				return createContentCategoryAdapter();
-			}
-			public Object caseContentCategoryPackage(ContentCategoryPackage object) {
-				return createContentCategoryPackageAdapter();
-			}
-			public Object caseContentDescription(ContentDescription object) {
-				return createContentDescriptionAdapter();
-			}
-			public Object caseContentElement(ContentElement object) {
-				return createContentElementAdapter();
-			}
-			public Object caseContentPackage(ContentPackage object) {
-				return createContentPackageAdapter();
-			}
-			public Object caseCustomCategory(CustomCategory object) {
-				return createCustomCategoryAdapter();
-			}
-			public Object caseDeliverable(Deliverable object) {
-				return createDeliverableAdapter();
-			}
-			public Object caseDeliverableDescription(DeliverableDescription object) {
-				return createDeliverableDescriptionAdapter();
-			}
-			public Object caseDeliveryProcess(DeliveryProcess object) {
-				return createDeliveryProcessAdapter();
-			}
-			public Object caseDeliveryProcessDescription(DeliveryProcessDescription object) {
-				return createDeliveryProcessDescriptionAdapter();
-			}
-			public Object caseDescribableElement(DescribableElement object) {
-				return createDescribableElementAdapter();
-			}
-			public Object caseDescriptor(Descriptor object) {
-				return createDescriptorAdapter();
-			}
-			public Object caseDescriptorDescription(DescriptorDescription object) {
-				return createDescriptorDescriptionAdapter();
-			}
-			public Object caseDiscipline(Discipline object) {
-				return createDisciplineAdapter();
-			}
-			public Object caseDisciplineGrouping(DisciplineGrouping object) {
-				return createDisciplineGroupingAdapter();
-			}
-			public Object caseDocumentRoot(DocumentRoot object) {
-				return createDocumentRootAdapter();
-			}
-			public Object caseDomain(Domain object) {
-				return createDomainAdapter();
-			}
-			public Object caseElement(Element object) {
-				return createElementAdapter();
-			}
-			public Object caseEstimate(Estimate object) {
-				return createEstimateAdapter();
-			}
-			public Object caseEstimatingMetric(EstimatingMetric object) {
-				return createEstimatingMetricAdapter();
-			}
-			public Object caseEstimationConsiderations(EstimationConsiderations object) {
-				return createEstimationConsiderationsAdapter();
-			}
-			public Object caseExample(Example object) {
-				return createExampleAdapter();
-			}
-			public Object caseGuidance(Guidance object) {
-				return createGuidanceAdapter();
-			}
-			public Object caseGuidanceDescription(GuidanceDescription object) {
-				return createGuidanceDescriptionAdapter();
-			}
-			public Object caseGuideline(Guideline object) {
-				return createGuidelineAdapter();
-			}
-			public Object caseIteration(Iteration object) {
-				return createIterationAdapter();
-			}
-			public Object caseMethodConfiguration(MethodConfiguration object) {
-				return createMethodConfigurationAdapter();
-			}
-			public Object caseMethodElement(MethodElement object) {
-				return createMethodElementAdapter();
-			}
-			public Object caseMethodElementProperty(MethodElementProperty object) {
-				return createMethodElementPropertyAdapter();
-			}
-			public Object caseMethodLibrary(MethodLibrary object) {
-				return createMethodLibraryAdapter();
-			}
-			public Object caseMethodPackage(MethodPackage object) {
-				return createMethodPackageAdapter();
-			}
-			public Object caseMethodPlugin(MethodPlugin object) {
-				return createMethodPluginAdapter();
-			}
-			public Object caseMethodUnit(MethodUnit object) {
-				return createMethodUnitAdapter();
-			}
-			public Object caseMilestone(Milestone object) {
-				return createMilestoneAdapter();
-			}
-			public Object caseNamedElement(NamedElement object) {
-				return createNamedElementAdapter();
-			}
-			public Object caseOutcome(Outcome object) {
-				return createOutcomeAdapter();
-			}
-			public Object casePackageableElement(PackageableElement object) {
-				return createPackageableElementAdapter();
-			}
-			public Object casePhase(Phase object) {
-				return createPhaseAdapter();
-			}
-			public Object casePlanningData(PlanningData object) {
-				return createPlanningDataAdapter();
-			}
-			public Object casePractice(Practice object) {
-				return createPracticeAdapter();
-			}
-			public Object casePracticeDescription(PracticeDescription object) {
-				return createPracticeDescriptionAdapter();
-			}
-			public Object caseProcess(org.eclipse.epf.xml.uma.Process object) {
-				return createProcessAdapter();
-			}
-			public Object caseProcessComponent(ProcessComponent object) {
-				return createProcessComponentAdapter();
-			}
-			public Object caseProcessComponentInterface(ProcessComponentInterface object) {
-				return createProcessComponentInterfaceAdapter();
-			}
-			public Object caseProcessDescription(ProcessDescription object) {
-				return createProcessDescriptionAdapter();
-			}
-			public Object caseProcessElement(ProcessElement object) {
-				return createProcessElementAdapter();
-			}
-			public Object caseProcessPackage(ProcessPackage object) {
-				return createProcessPackageAdapter();
-			}
-			public Object caseProcessPlanningTemplate(ProcessPlanningTemplate object) {
-				return createProcessPlanningTemplateAdapter();
-			}
-			public Object caseReport(Report object) {
-				return createReportAdapter();
-			}
-			public Object caseReusableAsset(ReusableAsset object) {
-				return createReusableAssetAdapter();
-			}
-			public Object caseRoadmap(Roadmap object) {
-				return createRoadmapAdapter();
-			}
-			public Object caseRole(Role object) {
-				return createRoleAdapter();
-			}
-			public Object caseRoleDescription(RoleDescription object) {
-				return createRoleDescriptionAdapter();
-			}
-			public Object caseRoleDescriptor(RoleDescriptor object) {
-				return createRoleDescriptorAdapter();
-			}
-			public Object caseRoleSet(RoleSet object) {
-				return createRoleSetAdapter();
-			}
-			public Object caseRoleSetGrouping(RoleSetGrouping object) {
-				return createRoleSetGroupingAdapter();
-			}
-			public Object caseSection(Section object) {
-				return createSectionAdapter();
-			}
-			public Object caseSupportingMaterial(SupportingMaterial object) {
-				return createSupportingMaterialAdapter();
-			}
-			public Object caseTask(Task object) {
-				return createTaskAdapter();
-			}
-			public Object caseTaskDescription(TaskDescription object) {
-				return createTaskDescriptionAdapter();
-			}
-			public Object caseTaskDescriptor(TaskDescriptor object) {
-				return createTaskDescriptorAdapter();
-			}
-			public Object caseTeamProfile(TeamProfile object) {
-				return createTeamProfileAdapter();
-			}
-			public Object caseTemplate(Template object) {
-				return createTemplateAdapter();
-			}
-			public Object caseTermDefinition(TermDefinition object) {
-				return createTermDefinitionAdapter();
-			}
-			public Object caseTool(Tool object) {
-				return createToolAdapter();
-			}
-			public Object caseToolMentor(ToolMentor object) {
-				return createToolMentorAdapter();
-			}
-			public Object caseWhitepaper(Whitepaper object) {
-				return createWhitepaperAdapter();
-			}
-			public Object caseWorkBreakdownElement(WorkBreakdownElement object) {
-				return createWorkBreakdownElementAdapter();
-			}
-			public Object caseWorkDefinition(WorkDefinition object) {
-				return createWorkDefinitionAdapter();
-			}
-			public Object caseWorkOrder(WorkOrder object) {
-				return createWorkOrderAdapter();
-			}
-			public Object caseWorkProduct(WorkProduct object) {
-				return createWorkProductAdapter();
-			}
-			public Object caseWorkProductDescription(WorkProductDescription object) {
-				return createWorkProductDescriptionAdapter();
-			}
-			public Object caseWorkProductDescriptor(WorkProductDescriptor object) {
-				return createWorkProductDescriptorAdapter();
-			}
-			public Object caseWorkProductType(WorkProductType object) {
-				return createWorkProductTypeAdapter();
-			}
-			public Object 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
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Activity <em>Activity</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.epf.xml.uma.Activity
-	 * @generated
-	 */
-	public Adapter createActivityAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ActivityDescription <em>Activity Description</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.epf.xml.uma.ActivityDescription
-	 * @generated
-	 */
-	public Adapter createActivityDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Artifact <em>Artifact</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.epf.xml.uma.Artifact
-	 * @generated
-	 */
-	public Adapter createArtifactAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ArtifactDescription <em>Artifact Description</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.epf.xml.uma.ArtifactDescription
-	 * @generated
-	 */
-	public Adapter createArtifactDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.BreakdownElement <em>Breakdown Element</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.epf.xml.uma.BreakdownElement
-	 * @generated
-	 */
-	public Adapter createBreakdownElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.BreakdownElementDescription <em>Breakdown Element Description</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.epf.xml.uma.BreakdownElementDescription
-	 * @generated
-	 */
-	public Adapter createBreakdownElementDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.CapabilityPattern <em>Capability Pattern</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.epf.xml.uma.CapabilityPattern
-	 * @generated
-	 */
-	public Adapter createCapabilityPatternAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Checklist <em>Checklist</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.epf.xml.uma.Checklist
-	 * @generated
-	 */
-	public Adapter createChecklistAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.CompositeRole <em>Composite Role</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.epf.xml.uma.CompositeRole
-	 * @generated
-	 */
-	public Adapter createCompositeRoleAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Concept <em>Concept</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.epf.xml.uma.Concept
-	 * @generated
-	 */
-	public Adapter createConceptAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Constraint <em>Constraint</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.epf.xml.uma.Constraint
-	 * @generated
-	 */
-	public Adapter createConstraintAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ContentCategory <em>Content Category</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.epf.xml.uma.ContentCategory
-	 * @generated
-	 */
-	public Adapter createContentCategoryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ContentCategoryPackage <em>Content Category Package</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.epf.xml.uma.ContentCategoryPackage
-	 * @generated
-	 */
-	public Adapter createContentCategoryPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ContentDescription <em>Content Description</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.epf.xml.uma.ContentDescription
-	 * @generated
-	 */
-	public Adapter createContentDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ContentElement <em>Content Element</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.epf.xml.uma.ContentElement
-	 * @generated
-	 */
-	public Adapter createContentElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ContentPackage <em>Content Package</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.epf.xml.uma.ContentPackage
-	 * @generated
-	 */
-	public Adapter createContentPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.CustomCategory <em>Custom Category</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.epf.xml.uma.CustomCategory
-	 * @generated
-	 */
-	public Adapter createCustomCategoryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Deliverable <em>Deliverable</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.epf.xml.uma.Deliverable
-	 * @generated
-	 */
-	public Adapter createDeliverableAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.DeliverableDescription <em>Deliverable Description</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.epf.xml.uma.DeliverableDescription
-	 * @generated
-	 */
-	public Adapter createDeliverableDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.DeliveryProcess <em>Delivery Process</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.epf.xml.uma.DeliveryProcess
-	 * @generated
-	 */
-	public Adapter createDeliveryProcessAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.DeliveryProcessDescription <em>Delivery Process Description</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.epf.xml.uma.DeliveryProcessDescription
-	 * @generated
-	 */
-	public Adapter createDeliveryProcessDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.DescribableElement <em>Describable Element</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.epf.xml.uma.DescribableElement
-	 * @generated
-	 */
-	public Adapter createDescribableElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Descriptor <em>Descriptor</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.epf.xml.uma.Descriptor
-	 * @generated
-	 */
-	public Adapter createDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.DescriptorDescription <em>Descriptor Description</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.epf.xml.uma.DescriptorDescription
-	 * @generated
-	 */
-	public Adapter createDescriptorDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Discipline <em>Discipline</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.epf.xml.uma.Discipline
-	 * @generated
-	 */
-	public Adapter createDisciplineAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.DisciplineGrouping <em>Discipline Grouping</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.epf.xml.uma.DisciplineGrouping
-	 * @generated
-	 */
-	public Adapter createDisciplineGroupingAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.DocumentRoot <em>Document Root</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.epf.xml.uma.DocumentRoot
-	 * @generated
-	 */
-	public Adapter createDocumentRootAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Domain <em>Domain</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.epf.xml.uma.Domain
-	 * @generated
-	 */
-	public Adapter createDomainAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Element <em>Element</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.epf.xml.uma.Element
-	 * @generated
-	 */
-	public Adapter createElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Estimate <em>Estimate</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.epf.xml.uma.Estimate
-	 * @generated
-	 */
-	public Adapter createEstimateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.EstimatingMetric <em>Estimating Metric</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.epf.xml.uma.EstimatingMetric
-	 * @generated
-	 */
-	public Adapter createEstimatingMetricAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.EstimationConsiderations <em>Estimation Considerations</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.epf.xml.uma.EstimationConsiderations
-	 * @generated
-	 */
-	public Adapter createEstimationConsiderationsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Example <em>Example</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.epf.xml.uma.Example
-	 * @generated
-	 */
-	public Adapter createExampleAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Guidance <em>Guidance</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.epf.xml.uma.Guidance
-	 * @generated
-	 */
-	public Adapter createGuidanceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.GuidanceDescription <em>Guidance Description</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.epf.xml.uma.GuidanceDescription
-	 * @generated
-	 */
-	public Adapter createGuidanceDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Guideline <em>Guideline</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.epf.xml.uma.Guideline
-	 * @generated
-	 */
-	public Adapter createGuidelineAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Iteration <em>Iteration</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.epf.xml.uma.Iteration
-	 * @generated
-	 */
-	public Adapter createIterationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.MethodConfiguration <em>Method 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.epf.xml.uma.MethodConfiguration
-	 * @generated
-	 */
-	public Adapter createMethodConfigurationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.MethodElement <em>Method Element</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.epf.xml.uma.MethodElement
-	 * @generated
-	 */
-	public Adapter createMethodElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.MethodElementProperty <em>Method Element Property</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.epf.xml.uma.MethodElementProperty
-	 * @generated
-	 */
-	public Adapter createMethodElementPropertyAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.MethodLibrary <em>Method Library</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.epf.xml.uma.MethodLibrary
-	 * @generated
-	 */
-	public Adapter createMethodLibraryAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.MethodPackage <em>Method Package</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.epf.xml.uma.MethodPackage
-	 * @generated
-	 */
-	public Adapter createMethodPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.MethodPlugin <em>Method Plugin</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.epf.xml.uma.MethodPlugin
-	 * @generated
-	 */
-	public Adapter createMethodPluginAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.MethodUnit <em>Method Unit</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.epf.xml.uma.MethodUnit
-	 * @generated
-	 */
-	public Adapter createMethodUnitAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Milestone <em>Milestone</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.epf.xml.uma.Milestone
-	 * @generated
-	 */
-	public Adapter createMilestoneAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.NamedElement <em>Named Element</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.epf.xml.uma.NamedElement
-	 * @generated
-	 */
-	public Adapter createNamedElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Outcome <em>Outcome</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.epf.xml.uma.Outcome
-	 * @generated
-	 */
-	public Adapter createOutcomeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.PackageableElement <em>Packageable Element</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.epf.xml.uma.PackageableElement
-	 * @generated
-	 */
-	public Adapter createPackageableElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Phase <em>Phase</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.epf.xml.uma.Phase
-	 * @generated
-	 */
-	public Adapter createPhaseAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.PlanningData <em>Planning Data</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.epf.xml.uma.PlanningData
-	 * @generated
-	 */
-	public Adapter createPlanningDataAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Practice <em>Practice</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.epf.xml.uma.Practice
-	 * @generated
-	 */
-	public Adapter createPracticeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.PracticeDescription <em>Practice Description</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.epf.xml.uma.PracticeDescription
-	 * @generated
-	 */
-	public Adapter createPracticeDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Process <em>Process</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.epf.xml.uma.Process
-	 * @generated
-	 */
-	public Adapter createProcessAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ProcessComponent <em>Process Component</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.epf.xml.uma.ProcessComponent
-	 * @generated
-	 */
-	public Adapter createProcessComponentAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ProcessComponentInterface <em>Process Component Interface</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.epf.xml.uma.ProcessComponentInterface
-	 * @generated
-	 */
-	public Adapter createProcessComponentInterfaceAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ProcessDescription <em>Process Description</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.epf.xml.uma.ProcessDescription
-	 * @generated
-	 */
-	public Adapter createProcessDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ProcessElement <em>Process Element</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.epf.xml.uma.ProcessElement
-	 * @generated
-	 */
-	public Adapter createProcessElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ProcessPackage <em>Process Package</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.epf.xml.uma.ProcessPackage
-	 * @generated
-	 */
-	public Adapter createProcessPackageAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ProcessPlanningTemplate <em>Process Planning Template</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.epf.xml.uma.ProcessPlanningTemplate
-	 * @generated
-	 */
-	public Adapter createProcessPlanningTemplateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Report <em>Report</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.epf.xml.uma.Report
-	 * @generated
-	 */
-	public Adapter createReportAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ReusableAsset <em>Reusable Asset</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.epf.xml.uma.ReusableAsset
-	 * @generated
-	 */
-	public Adapter createReusableAssetAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Roadmap <em>Roadmap</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.epf.xml.uma.Roadmap
-	 * @generated
-	 */
-	public Adapter createRoadmapAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Role <em>Role</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.epf.xml.uma.Role
-	 * @generated
-	 */
-	public Adapter createRoleAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.RoleDescription <em>Role Description</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.epf.xml.uma.RoleDescription
-	 * @generated
-	 */
-	public Adapter createRoleDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.RoleDescriptor <em>Role Descriptor</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.epf.xml.uma.RoleDescriptor
-	 * @generated
-	 */
-	public Adapter createRoleDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.RoleSet <em>Role Set</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.epf.xml.uma.RoleSet
-	 * @generated
-	 */
-	public Adapter createRoleSetAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.RoleSetGrouping <em>Role Set Grouping</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.epf.xml.uma.RoleSetGrouping
-	 * @generated
-	 */
-	public Adapter createRoleSetGroupingAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Section <em>Section</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.epf.xml.uma.Section
-	 * @generated
-	 */
-	public Adapter createSectionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.SupportingMaterial <em>Supporting Material</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.epf.xml.uma.SupportingMaterial
-	 * @generated
-	 */
-	public Adapter createSupportingMaterialAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Task <em>Task</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.epf.xml.uma.Task
-	 * @generated
-	 */
-	public Adapter createTaskAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.TaskDescription <em>Task Description</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.epf.xml.uma.TaskDescription
-	 * @generated
-	 */
-	public Adapter createTaskDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.TaskDescriptor <em>Task Descriptor</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.epf.xml.uma.TaskDescriptor
-	 * @generated
-	 */
-	public Adapter createTaskDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.TeamProfile <em>Team Profile</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.epf.xml.uma.TeamProfile
-	 * @generated
-	 */
-	public Adapter createTeamProfileAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Template <em>Template</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.epf.xml.uma.Template
-	 * @generated
-	 */
-	public Adapter createTemplateAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.TermDefinition <em>Term Definition</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.epf.xml.uma.TermDefinition
-	 * @generated
-	 */
-	public Adapter createTermDefinitionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Tool <em>Tool</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.epf.xml.uma.Tool
-	 * @generated
-	 */
-	public Adapter createToolAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.ToolMentor <em>Tool Mentor</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.epf.xml.uma.ToolMentor
-	 * @generated
-	 */
-	public Adapter createToolMentorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.Whitepaper <em>Whitepaper</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.epf.xml.uma.Whitepaper
-	 * @generated
-	 */
-	public Adapter createWhitepaperAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.WorkBreakdownElement <em>Work Breakdown Element</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.epf.xml.uma.WorkBreakdownElement
-	 * @generated
-	 */
-	public Adapter createWorkBreakdownElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.WorkDefinition <em>Work Definition</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.epf.xml.uma.WorkDefinition
-	 * @generated
-	 */
-	public Adapter createWorkDefinitionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.WorkOrder <em>Work Order</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.epf.xml.uma.WorkOrder
-	 * @generated
-	 */
-	public Adapter createWorkOrderAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.WorkProduct <em>Work Product</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.epf.xml.uma.WorkProduct
-	 * @generated
-	 */
-	public Adapter createWorkProductAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.WorkProductDescription <em>Work Product Description</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.epf.xml.uma.WorkProductDescription
-	 * @generated
-	 */
-	public Adapter createWorkProductDescriptionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.WorkProductDescriptor <em>Work Product Descriptor</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.epf.xml.uma.WorkProductDescriptor
-	 * @generated
-	 */
-	public Adapter createWorkProductDescriptorAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.epf.xml.uma.WorkProductType <em>Work Product Type</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.epf.xml.uma.WorkProductType
-	 * @generated
-	 */
-	public Adapter createWorkProductTypeAdapter() {
-		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;
-	}
-
-} //UmaAdapterFactory
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaResourceFactoryImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaResourceFactoryImpl.java
deleted file mode 100644
index 0b5dd90..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaResourceFactoryImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaResourceFactoryImpl.java,v 1.1 2008/01/15 08:52:51 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.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.epf.xml.uma.util.UmaResourceImpl
- * @generated
- */
-public class UmaResourceFactoryImpl extends ResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Resource createResource(URI uri) {
-		XMLResource result = new UmaResourceImpl(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;
-	}
-
-} //UmaResourceFactoryImpl
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaResourceImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaResourceImpl.java
deleted file mode 100644
index 53258fe..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaResourceImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaResourceImpl.java,v 1.1 2008/01/15 08:52:51 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.util;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.XMLSave;
-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.epf.xml.uma.util.UmaResourceFactoryImpl
- * @generated
- */
-public class UmaResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param uri the URI of the new resource.
-	 * @generated
-	 */
-	public UmaResourceImpl(URI uri) {
-		super(uri);
-	}
-
-	////////////////////////////////////////////////////////////////////////
-	// customization here, Jinhua Xi 04/28/2006
-	////////////////////////////////////////////////////////////////////////
-	
-	/*
-	 * Javadoc copied from interface.
-	 */
-	public void save(Map options) throws IOException {
-		super.save(options);
-	}
-
-	protected XMLSave createXMLSave() {
-		// return super.createXMLSave();
-		return new UmaXMLSaveImpl(createXMLHelper());
-	}
-	
-} //UmaResourceImpl
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaSwitch.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaSwitch.java
deleted file mode 100644
index 13b8618..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaSwitch.java
+++ /dev/null
@@ -1,2508 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaSwitch.java,v 1.1 2008/01/15 08:52:51 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.epf.xml.uma.Activity;
-import org.eclipse.epf.xml.uma.ActivityDescription;
-import org.eclipse.epf.xml.uma.Artifact;
-import org.eclipse.epf.xml.uma.ArtifactDescription;
-import org.eclipse.epf.xml.uma.BreakdownElement;
-import org.eclipse.epf.xml.uma.BreakdownElementDescription;
-import org.eclipse.epf.xml.uma.CapabilityPattern;
-import org.eclipse.epf.xml.uma.Checklist;
-import org.eclipse.epf.xml.uma.CompositeRole;
-import org.eclipse.epf.xml.uma.Concept;
-import org.eclipse.epf.xml.uma.Constraint;
-import org.eclipse.epf.xml.uma.ContentCategory;
-import org.eclipse.epf.xml.uma.ContentCategoryPackage;
-import org.eclipse.epf.xml.uma.ContentDescription;
-import org.eclipse.epf.xml.uma.ContentElement;
-import org.eclipse.epf.xml.uma.ContentPackage;
-import org.eclipse.epf.xml.uma.CustomCategory;
-import org.eclipse.epf.xml.uma.Deliverable;
-import org.eclipse.epf.xml.uma.DeliverableDescription;
-import org.eclipse.epf.xml.uma.DeliveryProcess;
-import org.eclipse.epf.xml.uma.DeliveryProcessDescription;
-import org.eclipse.epf.xml.uma.DescribableElement;
-import org.eclipse.epf.xml.uma.Descriptor;
-import org.eclipse.epf.xml.uma.DescriptorDescription;
-import org.eclipse.epf.xml.uma.Discipline;
-import org.eclipse.epf.xml.uma.DisciplineGrouping;
-import org.eclipse.epf.xml.uma.DocumentRoot;
-import org.eclipse.epf.xml.uma.Domain;
-import org.eclipse.epf.xml.uma.Element;
-import org.eclipse.epf.xml.uma.Estimate;
-import org.eclipse.epf.xml.uma.EstimatingMetric;
-import org.eclipse.epf.xml.uma.EstimationConsiderations;
-import org.eclipse.epf.xml.uma.Example;
-import org.eclipse.epf.xml.uma.Guidance;
-import org.eclipse.epf.xml.uma.GuidanceDescription;
-import org.eclipse.epf.xml.uma.Guideline;
-import org.eclipse.epf.xml.uma.Iteration;
-import org.eclipse.epf.xml.uma.MethodConfiguration;
-import org.eclipse.epf.xml.uma.MethodElement;
-import org.eclipse.epf.xml.uma.MethodElementProperty;
-import org.eclipse.epf.xml.uma.MethodLibrary;
-import org.eclipse.epf.xml.uma.MethodPackage;
-import org.eclipse.epf.xml.uma.MethodPlugin;
-import org.eclipse.epf.xml.uma.MethodUnit;
-import org.eclipse.epf.xml.uma.Milestone;
-import org.eclipse.epf.xml.uma.NamedElement;
-import org.eclipse.epf.xml.uma.Outcome;
-import org.eclipse.epf.xml.uma.PackageableElement;
-import org.eclipse.epf.xml.uma.Phase;
-import org.eclipse.epf.xml.uma.PlanningData;
-import org.eclipse.epf.xml.uma.Practice;
-import org.eclipse.epf.xml.uma.PracticeDescription;
-import org.eclipse.epf.xml.uma.ProcessComponent;
-import org.eclipse.epf.xml.uma.ProcessComponentInterface;
-import org.eclipse.epf.xml.uma.ProcessDescription;
-import org.eclipse.epf.xml.uma.ProcessElement;
-import org.eclipse.epf.xml.uma.ProcessPackage;
-import org.eclipse.epf.xml.uma.ProcessPlanningTemplate;
-import org.eclipse.epf.xml.uma.Report;
-import org.eclipse.epf.xml.uma.ReusableAsset;
-import org.eclipse.epf.xml.uma.Roadmap;
-import org.eclipse.epf.xml.uma.Role;
-import org.eclipse.epf.xml.uma.RoleDescription;
-import org.eclipse.epf.xml.uma.RoleDescriptor;
-import org.eclipse.epf.xml.uma.RoleSet;
-import org.eclipse.epf.xml.uma.RoleSetGrouping;
-import org.eclipse.epf.xml.uma.Section;
-import org.eclipse.epf.xml.uma.SupportingMaterial;
-import org.eclipse.epf.xml.uma.Task;
-import org.eclipse.epf.xml.uma.TaskDescription;
-import org.eclipse.epf.xml.uma.TaskDescriptor;
-import org.eclipse.epf.xml.uma.TeamProfile;
-import org.eclipse.epf.xml.uma.Template;
-import org.eclipse.epf.xml.uma.TermDefinition;
-import org.eclipse.epf.xml.uma.Tool;
-import org.eclipse.epf.xml.uma.ToolMentor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-import org.eclipse.epf.xml.uma.Whitepaper;
-import org.eclipse.epf.xml.uma.WorkBreakdownElement;
-import org.eclipse.epf.xml.uma.WorkDefinition;
-import org.eclipse.epf.xml.uma.WorkOrder;
-import org.eclipse.epf.xml.uma.WorkProduct;
-import org.eclipse.epf.xml.uma.WorkProductDescription;
-import org.eclipse.epf.xml.uma.WorkProductDescriptor;
-import org.eclipse.epf.xml.uma.WorkProductType;
-
-/**
- * <!-- 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.epf.xml.uma.UmaPackage
- * @generated
- */
-public class UmaSwitch {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static UmaPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaSwitch() {
-		if (modelPackage == null) {
-			modelPackage = UmaPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * 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
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case UmaPackage.ACTIVITY: {
-				Activity activity = (Activity)theEObject;
-				Object result = caseActivity(activity);
-				if (result == null) result = caseWorkBreakdownElement(activity);
-				if (result == null) result = caseBreakdownElement(activity);
-				if (result == null) result = caseProcessElement(activity);
-				if (result == null) result = caseDescribableElement(activity);
-				if (result == null) result = caseMethodElement(activity);
-				if (result == null) result = casePackageableElement(activity);
-				if (result == null) result = caseNamedElement(activity);
-				if (result == null) result = caseElement(activity);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ACTIVITY_DESCRIPTION: {
-				ActivityDescription activityDescription = (ActivityDescription)theEObject;
-				Object result = caseActivityDescription(activityDescription);
-				if (result == null) result = caseBreakdownElementDescription(activityDescription);
-				if (result == null) result = caseContentDescription(activityDescription);
-				if (result == null) result = caseMethodUnit(activityDescription);
-				if (result == null) result = caseMethodElement(activityDescription);
-				if (result == null) result = casePackageableElement(activityDescription);
-				if (result == null) result = caseNamedElement(activityDescription);
-				if (result == null) result = caseElement(activityDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ARTIFACT: {
-				Artifact artifact = (Artifact)theEObject;
-				Object result = caseArtifact(artifact);
-				if (result == null) result = caseWorkProduct(artifact);
-				if (result == null) result = caseContentElement(artifact);
-				if (result == null) result = caseDescribableElement(artifact);
-				if (result == null) result = caseMethodElement(artifact);
-				if (result == null) result = casePackageableElement(artifact);
-				if (result == null) result = caseNamedElement(artifact);
-				if (result == null) result = caseElement(artifact);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ARTIFACT_DESCRIPTION: {
-				ArtifactDescription artifactDescription = (ArtifactDescription)theEObject;
-				Object result = caseArtifactDescription(artifactDescription);
-				if (result == null) result = caseWorkProductDescription(artifactDescription);
-				if (result == null) result = caseContentDescription(artifactDescription);
-				if (result == null) result = caseMethodUnit(artifactDescription);
-				if (result == null) result = caseMethodElement(artifactDescription);
-				if (result == null) result = casePackageableElement(artifactDescription);
-				if (result == null) result = caseNamedElement(artifactDescription);
-				if (result == null) result = caseElement(artifactDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.BREAKDOWN_ELEMENT: {
-				BreakdownElement breakdownElement = (BreakdownElement)theEObject;
-				Object result = caseBreakdownElement(breakdownElement);
-				if (result == null) result = caseProcessElement(breakdownElement);
-				if (result == null) result = caseDescribableElement(breakdownElement);
-				if (result == null) result = caseMethodElement(breakdownElement);
-				if (result == null) result = casePackageableElement(breakdownElement);
-				if (result == null) result = caseNamedElement(breakdownElement);
-				if (result == null) result = caseElement(breakdownElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.BREAKDOWN_ELEMENT_DESCRIPTION: {
-				BreakdownElementDescription breakdownElementDescription = (BreakdownElementDescription)theEObject;
-				Object result = caseBreakdownElementDescription(breakdownElementDescription);
-				if (result == null) result = caseContentDescription(breakdownElementDescription);
-				if (result == null) result = caseMethodUnit(breakdownElementDescription);
-				if (result == null) result = caseMethodElement(breakdownElementDescription);
-				if (result == null) result = casePackageableElement(breakdownElementDescription);
-				if (result == null) result = caseNamedElement(breakdownElementDescription);
-				if (result == null) result = caseElement(breakdownElementDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CAPABILITY_PATTERN: {
-				CapabilityPattern capabilityPattern = (CapabilityPattern)theEObject;
-				Object result = caseCapabilityPattern(capabilityPattern);
-				if (result == null) result = caseProcess(capabilityPattern);
-				if (result == null) result = caseActivity(capabilityPattern);
-				if (result == null) result = caseWorkBreakdownElement(capabilityPattern);
-				if (result == null) result = caseBreakdownElement(capabilityPattern);
-				if (result == null) result = caseProcessElement(capabilityPattern);
-				if (result == null) result = caseDescribableElement(capabilityPattern);
-				if (result == null) result = caseMethodElement(capabilityPattern);
-				if (result == null) result = casePackageableElement(capabilityPattern);
-				if (result == null) result = caseNamedElement(capabilityPattern);
-				if (result == null) result = caseElement(capabilityPattern);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CHECKLIST: {
-				Checklist checklist = (Checklist)theEObject;
-				Object result = caseChecklist(checklist);
-				if (result == null) result = caseGuidance(checklist);
-				if (result == null) result = caseContentElement(checklist);
-				if (result == null) result = caseDescribableElement(checklist);
-				if (result == null) result = caseMethodElement(checklist);
-				if (result == null) result = casePackageableElement(checklist);
-				if (result == null) result = caseNamedElement(checklist);
-				if (result == null) result = caseElement(checklist);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.COMPOSITE_ROLE: {
-				CompositeRole compositeRole = (CompositeRole)theEObject;
-				Object result = caseCompositeRole(compositeRole);
-				if (result == null) result = caseRoleDescriptor(compositeRole);
-				if (result == null) result = caseDescriptor(compositeRole);
-				if (result == null) result = caseBreakdownElement(compositeRole);
-				if (result == null) result = caseProcessElement(compositeRole);
-				if (result == null) result = caseDescribableElement(compositeRole);
-				if (result == null) result = caseMethodElement(compositeRole);
-				if (result == null) result = casePackageableElement(compositeRole);
-				if (result == null) result = caseNamedElement(compositeRole);
-				if (result == null) result = caseElement(compositeRole);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CONCEPT: {
-				Concept concept = (Concept)theEObject;
-				Object result = caseConcept(concept);
-				if (result == null) result = caseGuidance(concept);
-				if (result == null) result = caseContentElement(concept);
-				if (result == null) result = caseDescribableElement(concept);
-				if (result == null) result = caseMethodElement(concept);
-				if (result == null) result = casePackageableElement(concept);
-				if (result == null) result = caseNamedElement(concept);
-				if (result == null) result = caseElement(concept);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CONSTRAINT: {
-				Constraint constraint = (Constraint)theEObject;
-				Object result = caseConstraint(constraint);
-				if (result == null) result = caseMethodElement(constraint);
-				if (result == null) result = casePackageableElement(constraint);
-				if (result == null) result = caseNamedElement(constraint);
-				if (result == null) result = caseElement(constraint);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CONTENT_CATEGORY: {
-				ContentCategory contentCategory = (ContentCategory)theEObject;
-				Object result = caseContentCategory(contentCategory);
-				if (result == null) result = caseContentElement(contentCategory);
-				if (result == null) result = caseDescribableElement(contentCategory);
-				if (result == null) result = caseMethodElement(contentCategory);
-				if (result == null) result = casePackageableElement(contentCategory);
-				if (result == null) result = caseNamedElement(contentCategory);
-				if (result == null) result = caseElement(contentCategory);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CONTENT_CATEGORY_PACKAGE: {
-				ContentCategoryPackage contentCategoryPackage = (ContentCategoryPackage)theEObject;
-				Object result = caseContentCategoryPackage(contentCategoryPackage);
-				if (result == null) result = caseMethodPackage(contentCategoryPackage);
-				if (result == null) result = caseMethodElement(contentCategoryPackage);
-				if (result == null) result = casePackageableElement(contentCategoryPackage);
-				if (result == null) result = caseNamedElement(contentCategoryPackage);
-				if (result == null) result = caseElement(contentCategoryPackage);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CONTENT_DESCRIPTION: {
-				ContentDescription contentDescription = (ContentDescription)theEObject;
-				Object result = caseContentDescription(contentDescription);
-				if (result == null) result = caseMethodUnit(contentDescription);
-				if (result == null) result = caseMethodElement(contentDescription);
-				if (result == null) result = casePackageableElement(contentDescription);
-				if (result == null) result = caseNamedElement(contentDescription);
-				if (result == null) result = caseElement(contentDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CONTENT_ELEMENT: {
-				ContentElement contentElement = (ContentElement)theEObject;
-				Object result = caseContentElement(contentElement);
-				if (result == null) result = caseDescribableElement(contentElement);
-				if (result == null) result = caseMethodElement(contentElement);
-				if (result == null) result = casePackageableElement(contentElement);
-				if (result == null) result = caseNamedElement(contentElement);
-				if (result == null) result = caseElement(contentElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CONTENT_PACKAGE: {
-				ContentPackage contentPackage = (ContentPackage)theEObject;
-				Object result = caseContentPackage(contentPackage);
-				if (result == null) result = caseMethodPackage(contentPackage);
-				if (result == null) result = caseMethodElement(contentPackage);
-				if (result == null) result = casePackageableElement(contentPackage);
-				if (result == null) result = caseNamedElement(contentPackage);
-				if (result == null) result = caseElement(contentPackage);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.CUSTOM_CATEGORY: {
-				CustomCategory customCategory = (CustomCategory)theEObject;
-				Object result = caseCustomCategory(customCategory);
-				if (result == null) result = caseContentCategory(customCategory);
-				if (result == null) result = caseContentElement(customCategory);
-				if (result == null) result = caseDescribableElement(customCategory);
-				if (result == null) result = caseMethodElement(customCategory);
-				if (result == null) result = casePackageableElement(customCategory);
-				if (result == null) result = caseNamedElement(customCategory);
-				if (result == null) result = caseElement(customCategory);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DELIVERABLE: {
-				Deliverable deliverable = (Deliverable)theEObject;
-				Object result = caseDeliverable(deliverable);
-				if (result == null) result = caseWorkProduct(deliverable);
-				if (result == null) result = caseContentElement(deliverable);
-				if (result == null) result = caseDescribableElement(deliverable);
-				if (result == null) result = caseMethodElement(deliverable);
-				if (result == null) result = casePackageableElement(deliverable);
-				if (result == null) result = caseNamedElement(deliverable);
-				if (result == null) result = caseElement(deliverable);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DELIVERABLE_DESCRIPTION: {
-				DeliverableDescription deliverableDescription = (DeliverableDescription)theEObject;
-				Object result = caseDeliverableDescription(deliverableDescription);
-				if (result == null) result = caseWorkProductDescription(deliverableDescription);
-				if (result == null) result = caseContentDescription(deliverableDescription);
-				if (result == null) result = caseMethodUnit(deliverableDescription);
-				if (result == null) result = caseMethodElement(deliverableDescription);
-				if (result == null) result = casePackageableElement(deliverableDescription);
-				if (result == null) result = caseNamedElement(deliverableDescription);
-				if (result == null) result = caseElement(deliverableDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DELIVERY_PROCESS: {
-				DeliveryProcess deliveryProcess = (DeliveryProcess)theEObject;
-				Object result = caseDeliveryProcess(deliveryProcess);
-				if (result == null) result = caseProcess(deliveryProcess);
-				if (result == null) result = caseActivity(deliveryProcess);
-				if (result == null) result = caseWorkBreakdownElement(deliveryProcess);
-				if (result == null) result = caseBreakdownElement(deliveryProcess);
-				if (result == null) result = caseProcessElement(deliveryProcess);
-				if (result == null) result = caseDescribableElement(deliveryProcess);
-				if (result == null) result = caseMethodElement(deliveryProcess);
-				if (result == null) result = casePackageableElement(deliveryProcess);
-				if (result == null) result = caseNamedElement(deliveryProcess);
-				if (result == null) result = caseElement(deliveryProcess);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DELIVERY_PROCESS_DESCRIPTION: {
-				DeliveryProcessDescription deliveryProcessDescription = (DeliveryProcessDescription)theEObject;
-				Object result = caseDeliveryProcessDescription(deliveryProcessDescription);
-				if (result == null) result = caseProcessDescription(deliveryProcessDescription);
-				if (result == null) result = caseActivityDescription(deliveryProcessDescription);
-				if (result == null) result = caseBreakdownElementDescription(deliveryProcessDescription);
-				if (result == null) result = caseContentDescription(deliveryProcessDescription);
-				if (result == null) result = caseMethodUnit(deliveryProcessDescription);
-				if (result == null) result = caseMethodElement(deliveryProcessDescription);
-				if (result == null) result = casePackageableElement(deliveryProcessDescription);
-				if (result == null) result = caseNamedElement(deliveryProcessDescription);
-				if (result == null) result = caseElement(deliveryProcessDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DESCRIBABLE_ELEMENT: {
-				DescribableElement describableElement = (DescribableElement)theEObject;
-				Object result = caseDescribableElement(describableElement);
-				if (result == null) result = caseMethodElement(describableElement);
-				if (result == null) result = casePackageableElement(describableElement);
-				if (result == null) result = caseNamedElement(describableElement);
-				if (result == null) result = caseElement(describableElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DESCRIPTOR: {
-				Descriptor descriptor = (Descriptor)theEObject;
-				Object result = caseDescriptor(descriptor);
-				if (result == null) result = caseBreakdownElement(descriptor);
-				if (result == null) result = caseProcessElement(descriptor);
-				if (result == null) result = caseDescribableElement(descriptor);
-				if (result == null) result = caseMethodElement(descriptor);
-				if (result == null) result = casePackageableElement(descriptor);
-				if (result == null) result = caseNamedElement(descriptor);
-				if (result == null) result = caseElement(descriptor);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DESCRIPTOR_DESCRIPTION: {
-				DescriptorDescription descriptorDescription = (DescriptorDescription)theEObject;
-				Object result = caseDescriptorDescription(descriptorDescription);
-				if (result == null) result = caseBreakdownElementDescription(descriptorDescription);
-				if (result == null) result = caseContentDescription(descriptorDescription);
-				if (result == null) result = caseMethodUnit(descriptorDescription);
-				if (result == null) result = caseMethodElement(descriptorDescription);
-				if (result == null) result = casePackageableElement(descriptorDescription);
-				if (result == null) result = caseNamedElement(descriptorDescription);
-				if (result == null) result = caseElement(descriptorDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DISCIPLINE: {
-				Discipline discipline = (Discipline)theEObject;
-				Object result = caseDiscipline(discipline);
-				if (result == null) result = caseContentCategory(discipline);
-				if (result == null) result = caseContentElement(discipline);
-				if (result == null) result = caseDescribableElement(discipline);
-				if (result == null) result = caseMethodElement(discipline);
-				if (result == null) result = casePackageableElement(discipline);
-				if (result == null) result = caseNamedElement(discipline);
-				if (result == null) result = caseElement(discipline);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DISCIPLINE_GROUPING: {
-				DisciplineGrouping disciplineGrouping = (DisciplineGrouping)theEObject;
-				Object result = caseDisciplineGrouping(disciplineGrouping);
-				if (result == null) result = caseContentCategory(disciplineGrouping);
-				if (result == null) result = caseContentElement(disciplineGrouping);
-				if (result == null) result = caseDescribableElement(disciplineGrouping);
-				if (result == null) result = caseMethodElement(disciplineGrouping);
-				if (result == null) result = casePackageableElement(disciplineGrouping);
-				if (result == null) result = caseNamedElement(disciplineGrouping);
-				if (result == null) result = caseElement(disciplineGrouping);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DOCUMENT_ROOT: {
-				DocumentRoot documentRoot = (DocumentRoot)theEObject;
-				Object result = caseDocumentRoot(documentRoot);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.DOMAIN: {
-				Domain domain = (Domain)theEObject;
-				Object result = caseDomain(domain);
-				if (result == null) result = caseContentCategory(domain);
-				if (result == null) result = caseContentElement(domain);
-				if (result == null) result = caseDescribableElement(domain);
-				if (result == null) result = caseMethodElement(domain);
-				if (result == null) result = casePackageableElement(domain);
-				if (result == null) result = caseNamedElement(domain);
-				if (result == null) result = caseElement(domain);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ELEMENT: {
-				Element element = (Element)theEObject;
-				Object result = caseElement(element);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ESTIMATE: {
-				Estimate estimate = (Estimate)theEObject;
-				Object result = caseEstimate(estimate);
-				if (result == null) result = caseGuidance(estimate);
-				if (result == null) result = caseContentElement(estimate);
-				if (result == null) result = caseDescribableElement(estimate);
-				if (result == null) result = caseMethodElement(estimate);
-				if (result == null) result = casePackageableElement(estimate);
-				if (result == null) result = caseNamedElement(estimate);
-				if (result == null) result = caseElement(estimate);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ESTIMATING_METRIC: {
-				EstimatingMetric estimatingMetric = (EstimatingMetric)theEObject;
-				Object result = caseEstimatingMetric(estimatingMetric);
-				if (result == null) result = caseGuidance(estimatingMetric);
-				if (result == null) result = caseContentElement(estimatingMetric);
-				if (result == null) result = caseDescribableElement(estimatingMetric);
-				if (result == null) result = caseMethodElement(estimatingMetric);
-				if (result == null) result = casePackageableElement(estimatingMetric);
-				if (result == null) result = caseNamedElement(estimatingMetric);
-				if (result == null) result = caseElement(estimatingMetric);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ESTIMATION_CONSIDERATIONS: {
-				EstimationConsiderations estimationConsiderations = (EstimationConsiderations)theEObject;
-				Object result = caseEstimationConsiderations(estimationConsiderations);
-				if (result == null) result = caseGuidance(estimationConsiderations);
-				if (result == null) result = caseContentElement(estimationConsiderations);
-				if (result == null) result = caseDescribableElement(estimationConsiderations);
-				if (result == null) result = caseMethodElement(estimationConsiderations);
-				if (result == null) result = casePackageableElement(estimationConsiderations);
-				if (result == null) result = caseNamedElement(estimationConsiderations);
-				if (result == null) result = caseElement(estimationConsiderations);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.EXAMPLE: {
-				Example example = (Example)theEObject;
-				Object result = caseExample(example);
-				if (result == null) result = caseGuidance(example);
-				if (result == null) result = caseContentElement(example);
-				if (result == null) result = caseDescribableElement(example);
-				if (result == null) result = caseMethodElement(example);
-				if (result == null) result = casePackageableElement(example);
-				if (result == null) result = caseNamedElement(example);
-				if (result == null) result = caseElement(example);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.GUIDANCE: {
-				Guidance guidance = (Guidance)theEObject;
-				Object result = caseGuidance(guidance);
-				if (result == null) result = caseContentElement(guidance);
-				if (result == null) result = caseDescribableElement(guidance);
-				if (result == null) result = caseMethodElement(guidance);
-				if (result == null) result = casePackageableElement(guidance);
-				if (result == null) result = caseNamedElement(guidance);
-				if (result == null) result = caseElement(guidance);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.GUIDANCE_DESCRIPTION: {
-				GuidanceDescription guidanceDescription = (GuidanceDescription)theEObject;
-				Object result = caseGuidanceDescription(guidanceDescription);
-				if (result == null) result = caseContentDescription(guidanceDescription);
-				if (result == null) result = caseMethodUnit(guidanceDescription);
-				if (result == null) result = caseMethodElement(guidanceDescription);
-				if (result == null) result = casePackageableElement(guidanceDescription);
-				if (result == null) result = caseNamedElement(guidanceDescription);
-				if (result == null) result = caseElement(guidanceDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.GUIDELINE: {
-				Guideline guideline = (Guideline)theEObject;
-				Object result = caseGuideline(guideline);
-				if (result == null) result = caseGuidance(guideline);
-				if (result == null) result = caseContentElement(guideline);
-				if (result == null) result = caseDescribableElement(guideline);
-				if (result == null) result = caseMethodElement(guideline);
-				if (result == null) result = casePackageableElement(guideline);
-				if (result == null) result = caseNamedElement(guideline);
-				if (result == null) result = caseElement(guideline);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ITERATION: {
-				Iteration iteration = (Iteration)theEObject;
-				Object result = caseIteration(iteration);
-				if (result == null) result = caseActivity(iteration);
-				if (result == null) result = caseWorkBreakdownElement(iteration);
-				if (result == null) result = caseBreakdownElement(iteration);
-				if (result == null) result = caseProcessElement(iteration);
-				if (result == null) result = caseDescribableElement(iteration);
-				if (result == null) result = caseMethodElement(iteration);
-				if (result == null) result = casePackageableElement(iteration);
-				if (result == null) result = caseNamedElement(iteration);
-				if (result == null) result = caseElement(iteration);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.METHOD_CONFIGURATION: {
-				MethodConfiguration methodConfiguration = (MethodConfiguration)theEObject;
-				Object result = caseMethodConfiguration(methodConfiguration);
-				if (result == null) result = caseMethodUnit(methodConfiguration);
-				if (result == null) result = caseMethodElement(methodConfiguration);
-				if (result == null) result = casePackageableElement(methodConfiguration);
-				if (result == null) result = caseNamedElement(methodConfiguration);
-				if (result == null) result = caseElement(methodConfiguration);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.METHOD_ELEMENT: {
-				MethodElement methodElement = (MethodElement)theEObject;
-				Object result = caseMethodElement(methodElement);
-				if (result == null) result = casePackageableElement(methodElement);
-				if (result == null) result = caseNamedElement(methodElement);
-				if (result == null) result = caseElement(methodElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.METHOD_ELEMENT_PROPERTY: {
-				MethodElementProperty methodElementProperty = (MethodElementProperty)theEObject;
-				Object result = caseMethodElementProperty(methodElementProperty);
-				if (result == null) result = casePackageableElement(methodElementProperty);
-				if (result == null) result = caseNamedElement(methodElementProperty);
-				if (result == null) result = caseElement(methodElementProperty);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.METHOD_LIBRARY: {
-				MethodLibrary methodLibrary = (MethodLibrary)theEObject;
-				Object result = caseMethodLibrary(methodLibrary);
-				if (result == null) result = caseMethodUnit(methodLibrary);
-				if (result == null) result = caseMethodElement(methodLibrary);
-				if (result == null) result = casePackageableElement(methodLibrary);
-				if (result == null) result = caseNamedElement(methodLibrary);
-				if (result == null) result = caseElement(methodLibrary);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.METHOD_PACKAGE: {
-				MethodPackage methodPackage = (MethodPackage)theEObject;
-				Object result = caseMethodPackage(methodPackage);
-				if (result == null) result = caseMethodElement(methodPackage);
-				if (result == null) result = casePackageableElement(methodPackage);
-				if (result == null) result = caseNamedElement(methodPackage);
-				if (result == null) result = caseElement(methodPackage);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.METHOD_PLUGIN: {
-				MethodPlugin methodPlugin = (MethodPlugin)theEObject;
-				Object result = caseMethodPlugin(methodPlugin);
-				if (result == null) result = caseMethodUnit(methodPlugin);
-				if (result == null) result = caseMethodElement(methodPlugin);
-				if (result == null) result = casePackageableElement(methodPlugin);
-				if (result == null) result = caseNamedElement(methodPlugin);
-				if (result == null) result = caseElement(methodPlugin);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.METHOD_UNIT: {
-				MethodUnit methodUnit = (MethodUnit)theEObject;
-				Object result = caseMethodUnit(methodUnit);
-				if (result == null) result = caseMethodElement(methodUnit);
-				if (result == null) result = casePackageableElement(methodUnit);
-				if (result == null) result = caseNamedElement(methodUnit);
-				if (result == null) result = caseElement(methodUnit);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.MILESTONE: {
-				Milestone milestone = (Milestone)theEObject;
-				Object result = caseMilestone(milestone);
-				if (result == null) result = caseWorkBreakdownElement(milestone);
-				if (result == null) result = caseBreakdownElement(milestone);
-				if (result == null) result = caseProcessElement(milestone);
-				if (result == null) result = caseDescribableElement(milestone);
-				if (result == null) result = caseMethodElement(milestone);
-				if (result == null) result = casePackageableElement(milestone);
-				if (result == null) result = caseNamedElement(milestone);
-				if (result == null) result = caseElement(milestone);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.NAMED_ELEMENT: {
-				NamedElement namedElement = (NamedElement)theEObject;
-				Object result = caseNamedElement(namedElement);
-				if (result == null) result = caseElement(namedElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.OUTCOME: {
-				Outcome outcome = (Outcome)theEObject;
-				Object result = caseOutcome(outcome);
-				if (result == null) result = caseWorkProduct(outcome);
-				if (result == null) result = caseContentElement(outcome);
-				if (result == null) result = caseDescribableElement(outcome);
-				if (result == null) result = caseMethodElement(outcome);
-				if (result == null) result = casePackageableElement(outcome);
-				if (result == null) result = caseNamedElement(outcome);
-				if (result == null) result = caseElement(outcome);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PACKAGEABLE_ELEMENT: {
-				PackageableElement packageableElement = (PackageableElement)theEObject;
-				Object result = casePackageableElement(packageableElement);
-				if (result == null) result = caseNamedElement(packageableElement);
-				if (result == null) result = caseElement(packageableElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PHASE: {
-				Phase phase = (Phase)theEObject;
-				Object result = casePhase(phase);
-				if (result == null) result = caseActivity(phase);
-				if (result == null) result = caseWorkBreakdownElement(phase);
-				if (result == null) result = caseBreakdownElement(phase);
-				if (result == null) result = caseProcessElement(phase);
-				if (result == null) result = caseDescribableElement(phase);
-				if (result == null) result = caseMethodElement(phase);
-				if (result == null) result = casePackageableElement(phase);
-				if (result == null) result = caseNamedElement(phase);
-				if (result == null) result = caseElement(phase);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PLANNING_DATA: {
-				PlanningData planningData = (PlanningData)theEObject;
-				Object result = casePlanningData(planningData);
-				if (result == null) result = caseProcessElement(planningData);
-				if (result == null) result = caseDescribableElement(planningData);
-				if (result == null) result = caseMethodElement(planningData);
-				if (result == null) result = casePackageableElement(planningData);
-				if (result == null) result = caseNamedElement(planningData);
-				if (result == null) result = caseElement(planningData);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PRACTICE: {
-				Practice practice = (Practice)theEObject;
-				Object result = casePractice(practice);
-				if (result == null) result = caseGuidance(practice);
-				if (result == null) result = caseContentElement(practice);
-				if (result == null) result = caseDescribableElement(practice);
-				if (result == null) result = caseMethodElement(practice);
-				if (result == null) result = casePackageableElement(practice);
-				if (result == null) result = caseNamedElement(practice);
-				if (result == null) result = caseElement(practice);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PRACTICE_DESCRIPTION: {
-				PracticeDescription practiceDescription = (PracticeDescription)theEObject;
-				Object result = casePracticeDescription(practiceDescription);
-				if (result == null) result = caseContentDescription(practiceDescription);
-				if (result == null) result = caseMethodUnit(practiceDescription);
-				if (result == null) result = caseMethodElement(practiceDescription);
-				if (result == null) result = casePackageableElement(practiceDescription);
-				if (result == null) result = caseNamedElement(practiceDescription);
-				if (result == null) result = caseElement(practiceDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PROCESS: {
-				org.eclipse.epf.xml.uma.Process process = (org.eclipse.epf.xml.uma.Process)theEObject;
-				Object result = caseProcess(process);
-				if (result == null) result = caseActivity(process);
-				if (result == null) result = caseWorkBreakdownElement(process);
-				if (result == null) result = caseBreakdownElement(process);
-				if (result == null) result = caseProcessElement(process);
-				if (result == null) result = caseDescribableElement(process);
-				if (result == null) result = caseMethodElement(process);
-				if (result == null) result = casePackageableElement(process);
-				if (result == null) result = caseNamedElement(process);
-				if (result == null) result = caseElement(process);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PROCESS_COMPONENT: {
-				ProcessComponent processComponent = (ProcessComponent)theEObject;
-				Object result = caseProcessComponent(processComponent);
-				if (result == null) result = caseProcessPackage(processComponent);
-				if (result == null) result = caseMethodPackage(processComponent);
-				if (result == null) result = caseMethodElement(processComponent);
-				if (result == null) result = casePackageableElement(processComponent);
-				if (result == null) result = caseNamedElement(processComponent);
-				if (result == null) result = caseElement(processComponent);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PROCESS_COMPONENT_INTERFACE: {
-				ProcessComponentInterface processComponentInterface = (ProcessComponentInterface)theEObject;
-				Object result = caseProcessComponentInterface(processComponentInterface);
-				if (result == null) result = caseBreakdownElement(processComponentInterface);
-				if (result == null) result = caseProcessElement(processComponentInterface);
-				if (result == null) result = caseDescribableElement(processComponentInterface);
-				if (result == null) result = caseMethodElement(processComponentInterface);
-				if (result == null) result = casePackageableElement(processComponentInterface);
-				if (result == null) result = caseNamedElement(processComponentInterface);
-				if (result == null) result = caseElement(processComponentInterface);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PROCESS_DESCRIPTION: {
-				ProcessDescription processDescription = (ProcessDescription)theEObject;
-				Object result = caseProcessDescription(processDescription);
-				if (result == null) result = caseActivityDescription(processDescription);
-				if (result == null) result = caseBreakdownElementDescription(processDescription);
-				if (result == null) result = caseContentDescription(processDescription);
-				if (result == null) result = caseMethodUnit(processDescription);
-				if (result == null) result = caseMethodElement(processDescription);
-				if (result == null) result = casePackageableElement(processDescription);
-				if (result == null) result = caseNamedElement(processDescription);
-				if (result == null) result = caseElement(processDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PROCESS_ELEMENT: {
-				ProcessElement processElement = (ProcessElement)theEObject;
-				Object result = caseProcessElement(processElement);
-				if (result == null) result = caseDescribableElement(processElement);
-				if (result == null) result = caseMethodElement(processElement);
-				if (result == null) result = casePackageableElement(processElement);
-				if (result == null) result = caseNamedElement(processElement);
-				if (result == null) result = caseElement(processElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PROCESS_PACKAGE: {
-				ProcessPackage processPackage = (ProcessPackage)theEObject;
-				Object result = caseProcessPackage(processPackage);
-				if (result == null) result = caseMethodPackage(processPackage);
-				if (result == null) result = caseMethodElement(processPackage);
-				if (result == null) result = casePackageableElement(processPackage);
-				if (result == null) result = caseNamedElement(processPackage);
-				if (result == null) result = caseElement(processPackage);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.PROCESS_PLANNING_TEMPLATE: {
-				ProcessPlanningTemplate processPlanningTemplate = (ProcessPlanningTemplate)theEObject;
-				Object result = caseProcessPlanningTemplate(processPlanningTemplate);
-				if (result == null) result = caseProcess(processPlanningTemplate);
-				if (result == null) result = caseActivity(processPlanningTemplate);
-				if (result == null) result = caseWorkBreakdownElement(processPlanningTemplate);
-				if (result == null) result = caseBreakdownElement(processPlanningTemplate);
-				if (result == null) result = caseProcessElement(processPlanningTemplate);
-				if (result == null) result = caseDescribableElement(processPlanningTemplate);
-				if (result == null) result = caseMethodElement(processPlanningTemplate);
-				if (result == null) result = casePackageableElement(processPlanningTemplate);
-				if (result == null) result = caseNamedElement(processPlanningTemplate);
-				if (result == null) result = caseElement(processPlanningTemplate);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.REPORT: {
-				Report report = (Report)theEObject;
-				Object result = caseReport(report);
-				if (result == null) result = caseGuidance(report);
-				if (result == null) result = caseContentElement(report);
-				if (result == null) result = caseDescribableElement(report);
-				if (result == null) result = caseMethodElement(report);
-				if (result == null) result = casePackageableElement(report);
-				if (result == null) result = caseNamedElement(report);
-				if (result == null) result = caseElement(report);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.REUSABLE_ASSET: {
-				ReusableAsset reusableAsset = (ReusableAsset)theEObject;
-				Object result = caseReusableAsset(reusableAsset);
-				if (result == null) result = caseGuidance(reusableAsset);
-				if (result == null) result = caseContentElement(reusableAsset);
-				if (result == null) result = caseDescribableElement(reusableAsset);
-				if (result == null) result = caseMethodElement(reusableAsset);
-				if (result == null) result = casePackageableElement(reusableAsset);
-				if (result == null) result = caseNamedElement(reusableAsset);
-				if (result == null) result = caseElement(reusableAsset);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ROADMAP: {
-				Roadmap roadmap = (Roadmap)theEObject;
-				Object result = caseRoadmap(roadmap);
-				if (result == null) result = caseGuidance(roadmap);
-				if (result == null) result = caseContentElement(roadmap);
-				if (result == null) result = caseDescribableElement(roadmap);
-				if (result == null) result = caseMethodElement(roadmap);
-				if (result == null) result = casePackageableElement(roadmap);
-				if (result == null) result = caseNamedElement(roadmap);
-				if (result == null) result = caseElement(roadmap);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ROLE: {
-				Role role = (Role)theEObject;
-				Object result = caseRole(role);
-				if (result == null) result = caseContentElement(role);
-				if (result == null) result = caseDescribableElement(role);
-				if (result == null) result = caseMethodElement(role);
-				if (result == null) result = casePackageableElement(role);
-				if (result == null) result = caseNamedElement(role);
-				if (result == null) result = caseElement(role);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ROLE_DESCRIPTION: {
-				RoleDescription roleDescription = (RoleDescription)theEObject;
-				Object result = caseRoleDescription(roleDescription);
-				if (result == null) result = caseContentDescription(roleDescription);
-				if (result == null) result = caseMethodUnit(roleDescription);
-				if (result == null) result = caseMethodElement(roleDescription);
-				if (result == null) result = casePackageableElement(roleDescription);
-				if (result == null) result = caseNamedElement(roleDescription);
-				if (result == null) result = caseElement(roleDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ROLE_DESCRIPTOR: {
-				RoleDescriptor roleDescriptor = (RoleDescriptor)theEObject;
-				Object result = caseRoleDescriptor(roleDescriptor);
-				if (result == null) result = caseDescriptor(roleDescriptor);
-				if (result == null) result = caseBreakdownElement(roleDescriptor);
-				if (result == null) result = caseProcessElement(roleDescriptor);
-				if (result == null) result = caseDescribableElement(roleDescriptor);
-				if (result == null) result = caseMethodElement(roleDescriptor);
-				if (result == null) result = casePackageableElement(roleDescriptor);
-				if (result == null) result = caseNamedElement(roleDescriptor);
-				if (result == null) result = caseElement(roleDescriptor);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ROLE_SET: {
-				RoleSet roleSet = (RoleSet)theEObject;
-				Object result = caseRoleSet(roleSet);
-				if (result == null) result = caseContentCategory(roleSet);
-				if (result == null) result = caseContentElement(roleSet);
-				if (result == null) result = caseDescribableElement(roleSet);
-				if (result == null) result = caseMethodElement(roleSet);
-				if (result == null) result = casePackageableElement(roleSet);
-				if (result == null) result = caseNamedElement(roleSet);
-				if (result == null) result = caseElement(roleSet);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.ROLE_SET_GROUPING: {
-				RoleSetGrouping roleSetGrouping = (RoleSetGrouping)theEObject;
-				Object result = caseRoleSetGrouping(roleSetGrouping);
-				if (result == null) result = caseContentCategory(roleSetGrouping);
-				if (result == null) result = caseContentElement(roleSetGrouping);
-				if (result == null) result = caseDescribableElement(roleSetGrouping);
-				if (result == null) result = caseMethodElement(roleSetGrouping);
-				if (result == null) result = casePackageableElement(roleSetGrouping);
-				if (result == null) result = caseNamedElement(roleSetGrouping);
-				if (result == null) result = caseElement(roleSetGrouping);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.SECTION: {
-				Section section = (Section)theEObject;
-				Object result = caseSection(section);
-				if (result == null) result = caseMethodElement(section);
-				if (result == null) result = casePackageableElement(section);
-				if (result == null) result = caseNamedElement(section);
-				if (result == null) result = caseElement(section);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.SUPPORTING_MATERIAL: {
-				SupportingMaterial supportingMaterial = (SupportingMaterial)theEObject;
-				Object result = caseSupportingMaterial(supportingMaterial);
-				if (result == null) result = caseGuidance(supportingMaterial);
-				if (result == null) result = caseContentElement(supportingMaterial);
-				if (result == null) result = caseDescribableElement(supportingMaterial);
-				if (result == null) result = caseMethodElement(supportingMaterial);
-				if (result == null) result = casePackageableElement(supportingMaterial);
-				if (result == null) result = caseNamedElement(supportingMaterial);
-				if (result == null) result = caseElement(supportingMaterial);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TASK: {
-				Task task = (Task)theEObject;
-				Object result = caseTask(task);
-				if (result == null) result = caseContentElement(task);
-				if (result == null) result = caseDescribableElement(task);
-				if (result == null) result = caseMethodElement(task);
-				if (result == null) result = casePackageableElement(task);
-				if (result == null) result = caseNamedElement(task);
-				if (result == null) result = caseElement(task);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TASK_DESCRIPTION: {
-				TaskDescription taskDescription = (TaskDescription)theEObject;
-				Object result = caseTaskDescription(taskDescription);
-				if (result == null) result = caseContentDescription(taskDescription);
-				if (result == null) result = caseMethodUnit(taskDescription);
-				if (result == null) result = caseMethodElement(taskDescription);
-				if (result == null) result = casePackageableElement(taskDescription);
-				if (result == null) result = caseNamedElement(taskDescription);
-				if (result == null) result = caseElement(taskDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TASK_DESCRIPTOR: {
-				TaskDescriptor taskDescriptor = (TaskDescriptor)theEObject;
-				Object result = caseTaskDescriptor(taskDescriptor);
-				if (result == null) result = caseWorkBreakdownElement(taskDescriptor);
-				if (result == null) result = caseBreakdownElement(taskDescriptor);
-				if (result == null) result = caseProcessElement(taskDescriptor);
-				if (result == null) result = caseDescribableElement(taskDescriptor);
-				if (result == null) result = caseMethodElement(taskDescriptor);
-				if (result == null) result = casePackageableElement(taskDescriptor);
-				if (result == null) result = caseNamedElement(taskDescriptor);
-				if (result == null) result = caseElement(taskDescriptor);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TEAM_PROFILE: {
-				TeamProfile teamProfile = (TeamProfile)theEObject;
-				Object result = caseTeamProfile(teamProfile);
-				if (result == null) result = caseBreakdownElement(teamProfile);
-				if (result == null) result = caseProcessElement(teamProfile);
-				if (result == null) result = caseDescribableElement(teamProfile);
-				if (result == null) result = caseMethodElement(teamProfile);
-				if (result == null) result = casePackageableElement(teamProfile);
-				if (result == null) result = caseNamedElement(teamProfile);
-				if (result == null) result = caseElement(teamProfile);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TEMPLATE: {
-				Template template = (Template)theEObject;
-				Object result = caseTemplate(template);
-				if (result == null) result = caseGuidance(template);
-				if (result == null) result = caseContentElement(template);
-				if (result == null) result = caseDescribableElement(template);
-				if (result == null) result = caseMethodElement(template);
-				if (result == null) result = casePackageableElement(template);
-				if (result == null) result = caseNamedElement(template);
-				if (result == null) result = caseElement(template);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TERM_DEFINITION: {
-				TermDefinition termDefinition = (TermDefinition)theEObject;
-				Object result = caseTermDefinition(termDefinition);
-				if (result == null) result = caseGuidance(termDefinition);
-				if (result == null) result = caseContentElement(termDefinition);
-				if (result == null) result = caseDescribableElement(termDefinition);
-				if (result == null) result = caseMethodElement(termDefinition);
-				if (result == null) result = casePackageableElement(termDefinition);
-				if (result == null) result = caseNamedElement(termDefinition);
-				if (result == null) result = caseElement(termDefinition);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TOOL: {
-				Tool tool = (Tool)theEObject;
-				Object result = caseTool(tool);
-				if (result == null) result = caseContentCategory(tool);
-				if (result == null) result = caseContentElement(tool);
-				if (result == null) result = caseDescribableElement(tool);
-				if (result == null) result = caseMethodElement(tool);
-				if (result == null) result = casePackageableElement(tool);
-				if (result == null) result = caseNamedElement(tool);
-				if (result == null) result = caseElement(tool);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.TOOL_MENTOR: {
-				ToolMentor toolMentor = (ToolMentor)theEObject;
-				Object result = caseToolMentor(toolMentor);
-				if (result == null) result = caseGuidance(toolMentor);
-				if (result == null) result = caseContentElement(toolMentor);
-				if (result == null) result = caseDescribableElement(toolMentor);
-				if (result == null) result = caseMethodElement(toolMentor);
-				if (result == null) result = casePackageableElement(toolMentor);
-				if (result == null) result = caseNamedElement(toolMentor);
-				if (result == null) result = caseElement(toolMentor);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WHITEPAPER: {
-				Whitepaper whitepaper = (Whitepaper)theEObject;
-				Object result = caseWhitepaper(whitepaper);
-				if (result == null) result = caseConcept(whitepaper);
-				if (result == null) result = caseGuidance(whitepaper);
-				if (result == null) result = caseContentElement(whitepaper);
-				if (result == null) result = caseDescribableElement(whitepaper);
-				if (result == null) result = caseMethodElement(whitepaper);
-				if (result == null) result = casePackageableElement(whitepaper);
-				if (result == null) result = caseNamedElement(whitepaper);
-				if (result == null) result = caseElement(whitepaper);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WORK_BREAKDOWN_ELEMENT: {
-				WorkBreakdownElement workBreakdownElement = (WorkBreakdownElement)theEObject;
-				Object result = caseWorkBreakdownElement(workBreakdownElement);
-				if (result == null) result = caseBreakdownElement(workBreakdownElement);
-				if (result == null) result = caseProcessElement(workBreakdownElement);
-				if (result == null) result = caseDescribableElement(workBreakdownElement);
-				if (result == null) result = caseMethodElement(workBreakdownElement);
-				if (result == null) result = casePackageableElement(workBreakdownElement);
-				if (result == null) result = caseNamedElement(workBreakdownElement);
-				if (result == null) result = caseElement(workBreakdownElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WORK_DEFINITION: {
-				WorkDefinition workDefinition = (WorkDefinition)theEObject;
-				Object result = caseWorkDefinition(workDefinition);
-				if (result == null) result = caseMethodElement(workDefinition);
-				if (result == null) result = casePackageableElement(workDefinition);
-				if (result == null) result = caseNamedElement(workDefinition);
-				if (result == null) result = caseElement(workDefinition);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WORK_ORDER: {
-				WorkOrder workOrder = (WorkOrder)theEObject;
-				Object result = caseWorkOrder(workOrder);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WORK_PRODUCT: {
-				WorkProduct workProduct = (WorkProduct)theEObject;
-				Object result = caseWorkProduct(workProduct);
-				if (result == null) result = caseContentElement(workProduct);
-				if (result == null) result = caseDescribableElement(workProduct);
-				if (result == null) result = caseMethodElement(workProduct);
-				if (result == null) result = casePackageableElement(workProduct);
-				if (result == null) result = caseNamedElement(workProduct);
-				if (result == null) result = caseElement(workProduct);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WORK_PRODUCT_DESCRIPTION: {
-				WorkProductDescription workProductDescription = (WorkProductDescription)theEObject;
-				Object result = caseWorkProductDescription(workProductDescription);
-				if (result == null) result = caseContentDescription(workProductDescription);
-				if (result == null) result = caseMethodUnit(workProductDescription);
-				if (result == null) result = caseMethodElement(workProductDescription);
-				if (result == null) result = casePackageableElement(workProductDescription);
-				if (result == null) result = caseNamedElement(workProductDescription);
-				if (result == null) result = caseElement(workProductDescription);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WORK_PRODUCT_DESCRIPTOR: {
-				WorkProductDescriptor workProductDescriptor = (WorkProductDescriptor)theEObject;
-				Object result = caseWorkProductDescriptor(workProductDescriptor);
-				if (result == null) result = caseDescriptor(workProductDescriptor);
-				if (result == null) result = caseBreakdownElement(workProductDescriptor);
-				if (result == null) result = caseProcessElement(workProductDescriptor);
-				if (result == null) result = caseDescribableElement(workProductDescriptor);
-				if (result == null) result = caseMethodElement(workProductDescriptor);
-				if (result == null) result = casePackageableElement(workProductDescriptor);
-				if (result == null) result = caseNamedElement(workProductDescriptor);
-				if (result == null) result = caseElement(workProductDescriptor);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case UmaPackage.WORK_PRODUCT_TYPE: {
-				WorkProductType workProductType = (WorkProductType)theEObject;
-				Object result = caseWorkProductType(workProductType);
-				if (result == null) result = caseContentCategory(workProductType);
-				if (result == null) result = caseContentElement(workProductType);
-				if (result == null) result = caseDescribableElement(workProductType);
-				if (result == null) result = caseMethodElement(workProductType);
-				if (result == null) result = casePackageableElement(workProductType);
-				if (result == null) result = caseNamedElement(workProductType);
-				if (result == null) result = caseElement(workProductType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Activity</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 interpretting the object as an instance of '<em>Activity</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseActivity(Activity object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Activity Description</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 interpretting the object as an instance of '<em>Activity Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseActivityDescription(ActivityDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Artifact</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 interpretting the object as an instance of '<em>Artifact</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArtifact(Artifact object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Artifact Description</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 interpretting the object as an instance of '<em>Artifact Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseArtifactDescription(ArtifactDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Breakdown Element</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 interpretting the object as an instance of '<em>Breakdown Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBreakdownElement(BreakdownElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Breakdown Element Description</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 interpretting the object as an instance of '<em>Breakdown Element Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBreakdownElementDescription(BreakdownElementDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Capability Pattern</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 interpretting the object as an instance of '<em>Capability Pattern</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCapabilityPattern(CapabilityPattern object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Checklist</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 interpretting the object as an instance of '<em>Checklist</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseChecklist(Checklist object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Composite Role</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 interpretting the object as an instance of '<em>Composite Role</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCompositeRole(CompositeRole object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Concept</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 interpretting the object as an instance of '<em>Concept</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConcept(Concept object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Constraint</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 interpretting the object as an instance of '<em>Constraint</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConstraint(Constraint object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Category</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 interpretting the object as an instance of '<em>Content Category</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentCategory(ContentCategory object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Category Package</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 interpretting the object as an instance of '<em>Content Category Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentCategoryPackage(ContentCategoryPackage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Description</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 interpretting the object as an instance of '<em>Content Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentDescription(ContentDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Element</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 interpretting the object as an instance of '<em>Content Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentElement(ContentElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Content Package</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 interpretting the object as an instance of '<em>Content Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseContentPackage(ContentPackage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Custom Category</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 interpretting the object as an instance of '<em>Custom Category</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseCustomCategory(CustomCategory object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Deliverable</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 interpretting the object as an instance of '<em>Deliverable</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliverable(Deliverable object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Deliverable Description</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 interpretting the object as an instance of '<em>Deliverable Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliverableDescription(DeliverableDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Delivery Process</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 interpretting the object as an instance of '<em>Delivery Process</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliveryProcess(DeliveryProcess object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Delivery Process Description</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 interpretting the object as an instance of '<em>Delivery Process Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDeliveryProcessDescription(DeliveryProcessDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Describable Element</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 interpretting the object as an instance of '<em>Describable Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescribableElement(DescribableElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Descriptor</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 interpretting the object as an instance of '<em>Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescriptor(Descriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Descriptor Description</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 interpretting the object as an instance of '<em>Descriptor Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescriptorDescription(DescriptorDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Discipline</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 interpretting the object as an instance of '<em>Discipline</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDiscipline(Discipline object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Discipline Grouping</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 interpretting the object as an instance of '<em>Discipline Grouping</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDisciplineGrouping(DisciplineGrouping object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Document Root</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 interpretting the object as an instance of '<em>Document Root</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDocumentRoot(DocumentRoot object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Domain</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 interpretting the object as an instance of '<em>Domain</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDomain(Domain object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Element</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 interpretting the object as an instance of '<em>Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseElement(Element object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Estimate</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 interpretting the object as an instance of '<em>Estimate</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEstimate(Estimate object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Estimating Metric</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 interpretting the object as an instance of '<em>Estimating Metric</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEstimatingMetric(EstimatingMetric object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Estimation Considerations</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 interpretting the object as an instance of '<em>Estimation Considerations</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseEstimationConsiderations(EstimationConsiderations object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Example</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 interpretting the object as an instance of '<em>Example</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExample(Example object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Guidance</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 interpretting the object as an instance of '<em>Guidance</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGuidance(Guidance object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Guidance Description</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 interpretting the object as an instance of '<em>Guidance Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGuidanceDescription(GuidanceDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Guideline</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 interpretting the object as an instance of '<em>Guideline</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseGuideline(Guideline object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Iteration</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 interpretting the object as an instance of '<em>Iteration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIteration(Iteration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method 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 interpretting the object as an instance of '<em>Method Configuration</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodConfiguration(MethodConfiguration object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Element</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 interpretting the object as an instance of '<em>Method Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodElement(MethodElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Element Property</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 interpretting the object as an instance of '<em>Method Element Property</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodElementProperty(MethodElementProperty object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Library</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 interpretting the object as an instance of '<em>Method Library</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodLibrary(MethodLibrary object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Package</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 interpretting the object as an instance of '<em>Method Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodPackage(MethodPackage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Plugin</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 interpretting the object as an instance of '<em>Method Plugin</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodPlugin(MethodPlugin object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Method Unit</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 interpretting the object as an instance of '<em>Method Unit</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMethodUnit(MethodUnit object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Milestone</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 interpretting the object as an instance of '<em>Milestone</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMilestone(Milestone object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Named Element</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 interpretting the object as an instance of '<em>Named Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNamedElement(NamedElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Outcome</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 interpretting the object as an instance of '<em>Outcome</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOutcome(Outcome object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Packageable Element</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 interpretting the object as an instance of '<em>Packageable Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePackageableElement(PackageableElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Phase</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 interpretting the object as an instance of '<em>Phase</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePhase(Phase object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Planning Data</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 interpretting the object as an instance of '<em>Planning Data</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePlanningData(PlanningData object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Practice</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 interpretting the object as an instance of '<em>Practice</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePractice(Practice object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Practice Description</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 interpretting the object as an instance of '<em>Practice Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePracticeDescription(PracticeDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process</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 interpretting the object as an instance of '<em>Process</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcess(org.eclipse.epf.xml.uma.Process object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Component</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 interpretting the object as an instance of '<em>Process Component</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessComponent(ProcessComponent object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Component Interface</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 interpretting the object as an instance of '<em>Process Component Interface</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessComponentInterface(ProcessComponentInterface object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Description</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 interpretting the object as an instance of '<em>Process Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessDescription(ProcessDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Element</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 interpretting the object as an instance of '<em>Process Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessElement(ProcessElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Package</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 interpretting the object as an instance of '<em>Process Package</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessPackage(ProcessPackage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Process Planning Template</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 interpretting the object as an instance of '<em>Process Planning Template</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseProcessPlanningTemplate(ProcessPlanningTemplate object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Report</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 interpretting the object as an instance of '<em>Report</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReport(Report object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Reusable Asset</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 interpretting the object as an instance of '<em>Reusable Asset</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReusableAsset(ReusableAsset object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Roadmap</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 interpretting the object as an instance of '<em>Roadmap</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoadmap(Roadmap object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role</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 interpretting the object as an instance of '<em>Role</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRole(Role object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Description</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 interpretting the object as an instance of '<em>Role Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleDescription(RoleDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Descriptor</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 interpretting the object as an instance of '<em>Role Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleDescriptor(RoleDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Set</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 interpretting the object as an instance of '<em>Role Set</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleSet(RoleSet object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Role Set Grouping</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 interpretting the object as an instance of '<em>Role Set Grouping</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRoleSetGrouping(RoleSetGrouping object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Section</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 interpretting the object as an instance of '<em>Section</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSection(Section object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Supporting Material</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 interpretting the object as an instance of '<em>Supporting Material</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSupportingMaterial(SupportingMaterial object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Task</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 interpretting the object as an instance of '<em>Task</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTask(Task object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Task Description</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 interpretting the object as an instance of '<em>Task Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTaskDescription(TaskDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Task Descriptor</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 interpretting the object as an instance of '<em>Task Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTaskDescriptor(TaskDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Team Profile</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 interpretting the object as an instance of '<em>Team Profile</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTeamProfile(TeamProfile object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Template</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 interpretting the object as an instance of '<em>Template</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTemplate(Template object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Term Definition</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 interpretting the object as an instance of '<em>Term Definition</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTermDefinition(TermDefinition object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tool</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 interpretting the object as an instance of '<em>Tool</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTool(Tool object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tool Mentor</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 interpretting the object as an instance of '<em>Tool Mentor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseToolMentor(ToolMentor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Whitepaper</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 interpretting the object as an instance of '<em>Whitepaper</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWhitepaper(Whitepaper object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Breakdown Element</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 interpretting the object as an instance of '<em>Work Breakdown Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkBreakdownElement(WorkBreakdownElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Definition</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 interpretting the object as an instance of '<em>Work Definition</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkDefinition(WorkDefinition object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Order</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 interpretting the object as an instance of '<em>Work Order</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkOrder(WorkOrder object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product</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 interpretting the object as an instance of '<em>Work Product</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProduct(WorkProduct object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product Description</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 interpretting the object as an instance of '<em>Work Product Description</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProductDescription(WorkProductDescription object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product Descriptor</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 interpretting the object as an instance of '<em>Work Product Descriptor</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProductDescriptor(WorkProductDescriptor object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Work Product Type</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 interpretting the object as an instance of '<em>Work Product Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseWorkProductType(WorkProductType object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting 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 interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //UmaSwitch
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaXMLProcessor.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaXMLProcessor.java
deleted file mode 100644
index 72a8ba7..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaXMLProcessor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: UmaXMLProcessor.java,v 1.1 2008/01/15 08:52:51 jtham Exp $
- */
-package org.eclipse.epf.xml.uma.util;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
-import org.eclipse.epf.xml.uma.UmaPackage;
-
-/**
- * This class contains helper methods to serialize and deserialize XML documents
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class UmaXMLProcessor extends XMLProcessor {
-	/**
-	 * Public constructor to instantiate the helper.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public UmaXMLProcessor() {
-		super((EPackage.Registry.INSTANCE));
-		UmaPackage.eINSTANCE.eClass();
-	}
-	
-	/**
-	 * Register for "*" and "xml" file extensions the UmaResourceFactoryImpl factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Map getRegistrations() {
-		if (registrations == null) {
-			super.getRegistrations();
-			registrations.put(XML_EXTENSION, new UmaResourceFactoryImpl());
-			registrations.put(STAR_EXTENSION, new UmaResourceFactoryImpl());
-		}
-		return registrations;
-	}
-
-} //UmaXMLProcessor
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaXMLSaveImpl.java b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaXMLSaveImpl.java
deleted file mode 100644
index e6ac6c0..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/UmaXMLSaveImpl.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.eclipse.epf.xml.uma.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.xmi.XMLHelper;
-import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
-import org.eclipse.epf.common.serviceability.VersionUtil;
-
-/**
- * This class customize the XMLSaveImpl to save the string tags as CDATA
- * 
- * @author Jinhua Xi
- * @since 1.0
- *
- */
-public class UmaXMLSaveImpl extends XMLSaveImpl {
-
-	public static List cdataFeatureNames = new ArrayList();
-	static {
-		
-		cdataFeatureNames.add("alternatives");
-		cdataFeatureNames.add("mainDescription");
-		cdataFeatureNames.add("howToStaff");
-		cdataFeatureNames.add("keyConsiderations");
-		cdataFeatureNames.add("purpose");	
-		cdataFeatureNames.add("scope");					// ProcessDescription
-		cdataFeatureNames.add("usageNotes");			// ProcessDescription
-	}
-	
-	private boolean isCDATAFeature(EStructuralFeature f, boolean isAttribute) {
-		
-		if ( isAttribute ) {
-			return false;
-		}
-		
-//		if ( f == UmaPackage.eINSTANCE.getContentDescription_KeyConsiderations() 
-//			|| f == UmaPackage.eINSTANCE.getContentDescription_MainDescription()
-//			|| f == UmaPackage.eINSTANCE.getSection_Description()
-//		) {
-//			System.out.println("test");
-//		}
-		
-		return cdataFeatureNames.contains(f.getName());
-	}
-	
-	/**
-	 * 
-	 * @param helper
-	 */
-	public UmaXMLSaveImpl(XMLHelper helper) {
-		super(helper);
-	}
-
-	/**
-	 * 
-	 * @param options Map
-	 * @param helper XMLHelper
-	 * @param encoding String
-	 */
-	public UmaXMLSaveImpl(Map options, XMLHelper helper, String encoding) {
-		super(options, helper, encoding);
-	}
-
-	protected String getDatatypeValue(Object value, EStructuralFeature f,
-			boolean isAttribute) {	
-		
-		if ( value == null || value.toString().equals("") ) {
-			return "";
-		}				
-		
-		if ( isCDATAFeature(f, isAttribute) ) {
-			String str = value.toString();
-			String replaced = "]]>";								//$NON-NLS-1$
-			if (str != null && str.indexOf(replaced) >= 0) {
-				str = str.replaceAll(replaced, "]]]]><![CDATA[>" );	//$NON-NLS-1$	//175395
-			}
-			return "<![CDATA[" + str + "]]>";
-		}
-		
-		return super.getDatatypeValue(value, f, isAttribute);
-	}
-	
-}
diff --git a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/package.html b/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/package.html
deleted file mode 100644
index fe59fcc..0000000
--- a/1.5/plugins/org.eclipse.epf.xml.uma/src/org/eclipse/epf/xml/uma/util/package.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<body>
-Provides implementation support for accessing the XML UMA model objects.
-</body>
-</html>
\ No newline at end of file
diff --git a/1.5/releng/.project b/1.5/releng/.project
deleted file mode 100644
index 22907ea..0000000
--- a/1.5/releng/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.epf.releng</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/1.5/releng/build-scripts/allElements.xml b/1.5/releng/build-scripts/allElements.xml
deleted file mode 100644
index 5a01c42..0000000
--- a/1.5/releng/build-scripts/allElements.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<project name="allElements Delegator">
-	
- 	<!-- ===================================================================== -->
- 	<!-- Run a given ${target} on all elements being built                     -->
- 	<!-- Replace element.id with the id of the top level element being built.    -->
-	<!-- If element.id does not exist in ${buildDirectory}/features/element.id   -->
-	<!-- or ${baseLocation}/features/element.id, then you must provide the       -->
-	<!-- location by setting the property "pluginPath"                           -->
- 	<!-- Add on <ant> task for each top level element being built.             -->
- 	<!-- ===================================================================== -->
- 	<target name="allElementsDelegator">
- 		<ant antfile="${genericTargets}" target="${target}">
-	 		<property name="type" value="feature" />
-	 		<property name="id" value="org.eclipse.epf.product.feature" />
-		</ant>
-	</target>
- 
- 	<!-- ===================================================================== -->
- 	<!-- Targets to assemble the built elements for particular configurations  -->
- 	<!-- These generally call the generated assemble scripts (named in         -->
- 	<!-- ${assembleScriptName}) but may also add pre and post processing       -->
- 	<!-- Add one target for each root element and each configuration           -->
- 	<!-- Replace element.id with the id of the top level element being built   -->
- 	<!-- ===================================================================== -->
-
- 	<target name="assemble.org.eclipse.epf.product.feature.win32.win32.x86">
- 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">
-			<property name="archiveName" value="${archiveNamePrefix}-${tgtVer}-${buildLabel}-win32.zip"/>
-		</ant>
- 	</target>
-
- 	<target name="assemble.org.eclipse.epf.product.feature.linux.gtk.x86">
- 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">
-			<property name="archiveName" value="${archiveNamePrefix}-${tgtVer}-${buildLabel}-linux.zip"/>
-		</ant>
- 	</target>
-
-
-</project>
diff --git a/1.5/releng/build-scripts/build.properties b/1.5/releng/build-scripts/build.properties
deleted file mode 100644
index cb9624c..0000000
--- a/1.5/releng/build-scripts/build.properties
+++ /dev/null
@@ -1,237 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#####################
-# Parameters describing how and where to execute the build.
-# Typical users need only update the following properties:
-#    baseLocation - where things you are building against are installed
-#    bootclasspath - The base jars to compile against (typicaly rt.jar)
-#    configs - the list of {os, ws, arch} configurations to build.  
-#
-# Of course any of the settings here can be overridden by spec'ing 
-# them on the command line (e.g., -DbaseLocation=d:/eclipse
-
-############# PRODUCT/PACKAGING CONTROL #############
-#product=/plugin or feature id/path/to/.product
-product=org.eclipse.epf.rcp.ui/composer.product
-runPackager=true
-
-#Set the name of the archive that will result from the product build.
-archiveNamePrefix=epf-composer
-
-# The prefix that will be used in the generated archive.
-archivePrefix=epf-composer
-
-# The location underwhich all of the build output will be collected.
-collectingFolder=${archivePrefix}
-
-# The list of {os, ws, arch} configurations to build.  This 
-# value is a '&' separated list of ',' separate triples.  For example, 
-#     configs=win32,win32,x86 & linux,motif,x86
-# By default the value is *,*,*
-#configs=win32, win32, x86 & \
-#	linux, gtk, ppc &\
-# linux, gtk, x86 & \
-#	linux, gtk, x86_64 & \
-#	linux, motif, x86 & \
-#	solaris, motif, sparc & \
-#	solaris, gtk, sparc & \
-#	aix, motif, ppc & \
-#	hpux, motif, PA_RISC & \
-#	macosx, carbon, ppc
-
-#configs=win32,win32,x86
-configs=win32,win32,x86 & linux,gtk,x86
-
-# By default PDE creates one archive (result) per entry listed in the configs property.
-# Setting this value to try will cause PDE to only create one output containing all 
-# artifacts for all the platforms listed in the configs property.
-#groupConfigurations=true
-
-#The format of the archive. By default a zip is created using antZip.
-#The list can only contain the configuration for which the desired format is different than zip.
-#archivesFormat=win32, win32, x86 - antZip& \
-#	linux, gtk, ppc - antZip &\
-#    linux, gtk, x86 - antZip& \
-#	linux, gtk, x86_64 - antZip& \
-# linux, motif, x86 - antZip& \
-#	solaris, motif, sparc - antZip& \
-#	solaris, gtk, sparc - antZip& \
-#	aix, motif, ppc - antZip& \
-#	hpux, motif, PA_RISC - antZip& \
-#	macosx, carbon, ppc - antZip
-
-#archivesFormat=win32,win32,x86 - folder&\
-#    linux, gtk, x86 - folder
-archivesFormat=win32,win32,x86 - antZip&\
-    linux, gtk, x86 - antZip
-	
-#Set to true if you want the output to be ready for an update jar (no site.xml generated)
-#outputUpdateJars = false
-
-#Set to true for Jnlp generation
-#codebase should be a URL that will be used as the root of all relative URLs in the output.
-#generateJnlp=false
-#jnlp.codebase=<codebase url>
-#jnlp.j2se=<j2se version>
-#jnlp.locale=<a locale>
-
-#Set to true if you want to sign jars
-#signJars=false
-#sign.alias=<alias>
-#sign.keystore=<keystore location>
-#sign.storepass=<keystore password>
-
-#Arguments to send to the zip executable
-zipargs=
-
-#Arguments to send to the tar executable
-tarargs=
-
-#Control the creation of a file containing the version included in each configuration - on by default 
-#generateVersionsLists=false
-
-############## BUILD NAMING CONTROL ################
-# The directory into which the build elements are fetched and where
-# the build takes place.
-buildDirectory=${builder}/build
-
-# Type of build.  Used in naming the build output.  Typically this value is
-# one of I, N, M, S, ...
-buildType=N
-
-#buildId is set in run.bat
-# ID of the build.  Used in naming the build output.
-#buildId=20070215-2150
-tgtVer=1.2.0
-tgtMilestone=M2
-
-# Label for the build.  Used in naming the build output
-# Creates a folder named as ${builLabel} in the output location
-buildLabel=${buildType}.${buildId}
-
-# Timestamp for the build.  Used in naming the build output
-timestamp=007
-
-#The value to be used for the qualifier of a plugin or feature when you want to override the value computed by pde.
-#The value will only be applied to plugin or features indicating build.properties, qualifier = context 
-#forceContextQualifier=<the value for the qualifier>
-
-#Enable / disable the generation of a suffix for the features that use .qualifier. 
-#The generated suffix is computed according to the content of the feature   
-#generateFeatureVersionSuffix=true
-
-############# BASE CONTROL #############
-# Settings for the base Eclipse components and Java class libraries 
-# against which you are building.
-# Base location for anything the build needs to compile against.  For example,
-# in most RCP app or a plug-in,  the baseLocation should be the location of a previously
-# installed Eclipse against which the application or plug-in code will be compiled and the RCP delta pack.
-
-#Os/Ws/Arch/nl of the eclipse specified by baseLocation
-baseos=win32
-basews=win32
-basearch=x86
-
-#pluginPath is a list of locations in which to find plugins and features.  This list is separated by the platform file separator (; or :)
-#a location is one of:  
-#- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo
-#- a directory that contains a /plugins or /features subdirectory
-#- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml
-#pluginPath=
-
-skipBase=true
-eclipseURL=<url for eclipse download site>
-eclipseBuildId=<Id of Eclipse build to get>
-eclipseBaseURL=${eclipseURL}/eclipse-platform-${eclipseBuildId}-win32.zip
-
-
-############# MAP FILE CONTROL ################
-# This section defines CVS tags to use when fetching the map files from the repository.
-# If you want to fetch the map file from repository / location, change the getMapFiles target in the customTargets.xml
-
-#skipMaps=true
-#mapsRepo=:pserver:anonymous@example.com/path/to/repo
-mapsRepo=${cvsInfo}@dev.eclipse.org:/cvsroot/technology
-#mapsRoot=path/to/maps
-mapsRoot=org.eclipse.epf/plugins/org.eclipse.epf.releng/maps
-mapsCheckoutTag=HEAD
-#mapsCheckoutTag=v${buildId}
-
-tagMaps=true
-mapsTagTag=v${buildId}
-
-############# UPDATE SITE FILE CONTROL ################
-updateSiteRepo=${cvsInfo}@dev.eclipse.org:/cvsroot/org.eclipse
-updateSiteFile=www/epf/downloads/tool/tool_downloads.php
-updateSiteCheckoutTag=HEAD
-updateSiteDestination=
-
-
-############ REPOSITORY CONTROL ###############
-# This section defines properties parameterizing the repositories where plugins, fragments
-# bundles and features are being obtained from. 
-
-# The tags to use when fetching elements to build.
-# By default thebuilder will use whatever is in the maps.  
-# This value takes the form of a comma separated list of repository identifier (like used in the map files) and the 
-# overriding value
-# For example fetchTag=CVS=HEAD, SVN=v20050101
-#fetchTag=R1_0_BRANCH
-#fetchTag=HEAD
-#skipFetch=true
-
-
-############# JAVA COMPILER OPTIONS ##############
-# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
-bootclasspath=${java.home}/lib/core.jar;${java.home}/lib/charsets.jar;${java.home}/lib/BD.jar;${java.home}/lib/deploy.jar;${java.home}/lib/graphics.jar;${java.home}/lib/ibmcertpathprovider.jar;${java.home}/lib/ibmcfw.jar;${java.home}/lib/ibmjaasactivelm.jar;${java.home}/lib/ibmjaaslm.jar;${java.home}/lib/ibmjcefw.jar;${java.home}/lib/ibmjgssprovider.jar;${java.home}/lib/ibmjsseprovider2.jar;${java.home}/lib/ibmorb.jar;${java.home}/lib/ibmorbapi.jar;${java.home}/lib/ibmpkcs.jar;${java.home}/lib/javaws.jar;${java.home}/lib/plugin.jar;${java.home}/lib/security.jar;${java.home}/lib/server.jar;${java.home}/lib/vm.jar;${java.home}/lib/xml.jar;${java.home}/lib/rt.jar
-
-# specific JRE locations to compile against. These values are used to compile bundles specifying a 
-# Bundle-RequiredExecutionEnvironment. Uncomment and set values for environments that you support
-#CDC-1.0/Foundation-1.0= /path/to/rt.jar
-#CDC-1.1/Foundation-1.1=
-#OSGi/Minimum-1.0=
-#OSGi/Minimum-1.1=
-#JRE-1.1=
-#J2SE-1.2=
-#J2SE-1.3=
-#J2SE-1.4=
-#J2SE-1.5=
-#JavaSE-1.6=
-#PersonalJava-1.1=
-#PersonalJava-1.2=
-#CDC-1.0/PersonalBasis-1.0=
-#CDC-1.0/PersonalJava-1.0=
-#CDC-1.1/PersonalBasis-1.1=
-#CDC-1.1/PersonalJava-1.1=
-
-# Specify the output format of the compiler log when eclipse jdt is used
-logExtension=.log
-
-# Whether or not to include debug info in the output jars
-javacDebugInfo=true 
-
-# Whether or not to fail the build if there are compiler errors
-javacFailOnError=true
-
-# Enable or disable verbose mode of the compiler
-#javacVerbose=true
-
-# Extra arguments for the compiler. These are specific to the java compiler being used.
-#compilerArg=-g
-compilerArg=-nowarn
-
-# Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties
-javacSource=1.5
-
-# Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties.
-javacTarget=1.5
-
-
diff --git a/1.5/releng/build-scripts/customTargets.xml b/1.5/releng/build-scripts/customTargets.xml
deleted file mode 100644
index ff5a138..0000000
--- a/1.5/releng/build-scripts/customTargets.xml
+++ /dev/null
@@ -1,237 +0,0 @@
-<project name="Build specific targets and properties" default="noDefault">
-
-	<!-- ===================================================================== -->
-	<!-- Run a given ${target} on all elements being built -->
-	<!-- Add on <ant> task for each top level element being built. -->
-	<!-- ===================================================================== -->
-	<property name="allElementsFile" value="${builder}/allElements.xml"/>
-	<import file="${allElementsFile}"/>
-
-	<target name="allElements">
-		<antcall target="allElementsDelegator"/>
-	</target>
-	
-	<!-- ===================================================================== -->
-	<!-- ===================================================================== -->
-	<target name="getBaseComponents" depends="checkLocalBase" unless="skipBase">
-		<get src="${eclipseBaseURL}" dest="${buildDirectory}/../temp-base.zip"/>
-		<unzip dest="${base}" overwrite="true" src="${buildDirectory}/../temp-base.zip"/>
-	</target>
-
-	<target name="checkLocalBase">
-		<available file="${base}" property="skipBase"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Check out map files from correct repository -->
-	<!-- Replace values for mapsCheckoutTag as desired. -->
-	<!-- ===================================================================== -->
-	<target name="getMapFiles" depends="checkLocalMaps" unless="skipMaps">
-		<!-- <property name="mapsCheckoutTag" value="HEAD"/> -->
-		<cvs cvsRoot="${mapsRepo}" package="${mapsRoot}" dest="${buildDirectory}/maps" tag="${mapsCheckoutTag}"/>
-	</target>
-
-	<target name="checkLocalMaps">
-		<available property="skipMaps" file="${buildDirectory}/maps"/>
-	</target>
-
-	<target name="tagMapFiles" if="tagMaps">
-		<cvs dest="${buildDirectory}/maps/${mapsRoot}" command="tag ${mapsTagTag}"/>
-	</target>
-
-	<!-- ===================================================================== -->
-
-	<target name="clean" unless="noclean">
-		<antcall target="allElements">
-			<param name="target" value="cleanElement"/>
-		</antcall>
-	</target>
-
-	<target name="cleanBuildDir">
-		<delete includeemptydirs="true">
-			<fileset dir="${buildDirectory}" 
-				includes="**/*"
-				defaultexcludes="no"
-			/>
-		</delete>
-	</target>
-
-	<target name="gatherLogs">
-		<mkdir dir="${buildDirectory}/${buildLabel}/compilelogs"/>
-		<antcall target="allElements">
-			<param name="target" value="gatherLogs"/>
-		</antcall>
-		<unzip dest="${buildDirectory}/${buildLabel}/compilelogs" overwrite="true">
-			<fileset dir="${buildDirectory}/features">
-				<include name="**/*.log.zip"/>
-			</fileset>
-		</unzip>
-	</target>
-	
-	<target name="generateAboutMappings">
-		<replace dir="${buildDirectory}/plugins" value="${buildId}" token="@buildId@">
-			<include name="**/about.mappings" />
-		</replace>
-	</target>
-	
-	<target name="updateRcpIniFile">
-		<replace dir="${buildDirectory}" value="${buildId}" token="@buildId@">
-			<include name="**/epf.ini" />
-		</replace>
-	</target>
-	
-	<target name="updateBuildState">
-		<tstamp>
-			<format property="buildDate" pattern="yyyy-MM-d"/>
-		</tstamp>
-		<property name="currentBuildStateFile" value="${buildStateDir}/tag.current.properties"/>
-		<property file="${currentBuildStateFile}" prefix="prev"/>
-		<property name="prev.buildDate" value="${buildDate}"/>
-		<path id="buildDirTempPath" location="${buildDirectory}"/>
-		<pathconvert dirsep="/" property="buildDirectoryPath" refid="buildDirTempPath"/>
-		<propertyfile
-		    file="${currentBuildStateFile}"
-		    comment="Last build ID and date">
-		  <entry key="buildId" value="${buildId}"/>
-		  <entry key="buildDate" value="${buildDate}"/>
-		  <entry key="buildDir" value="${buildDirectoryPath}"/>
-		</propertyfile>
-		<echo file="${buildStateDir}/../${buildId}.bugs">https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;product=EPF&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;keywords_type=allwords&amp;keywords=&amp;emailtype1=substring&amp;email1=&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;chfieldfrom=${prev.buildDate}&amp;chfieldto=${buildDate}&amp;chfield=resolution&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=
-</echo>
-	</target>
-
-	<!--
-	<target name="push2Site">
-		<property name="upScriptArgs" value="..."/>
-		<exec dir="${builder}" executable="${upScript}" output="epf_push2svr.output.txt">
-			<arg line="${upScriptArgs}"/>
-		</exec>
-	</target>
-
-	<target name="checkoutDLPg">
-		<cvs cvsRoot="${updateSiteRepo}" dest="${buildDirectory}/epfSite" package="${updateSiteFile}"/>
-	</target>
-
-	<target name="updateDLPg" depends="checkoutDLPg">
-		<property name="commitMsg" value="Nightly_Builds"/>
-		<property name="updatePageArgs" value="${tgtVer} ${tgtMilestone} ${epf.buildId} ${buildDirectory}/epfSite/${updateSiteFile}"/>
-		<exec dir="${builder}" executable="s:/bin/epf_changepage.cmd" output="epf_changepage.output.txt">
-			<arg line="${updatePageArgs}"/>
-		</exec>
-	</target>
-
-	<target name="commitDLPg" depends="updateDLPg" unless="noDLPg">
-		<cvs cvsRoot="${updateSiteRepo}" dest="${buildDirectory}/epfSite/${updateSiteFile}" command="checkin -m ${commitMsg} ${updateSiteFile}"/>
-	</target>
-	-->
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before setup -->
-	<!-- ===================================================================== -->
-	<target name="preSetup">
-		<antcall target="cleanBuildDir"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after setup but before starting the build proper -->
-	<!-- ===================================================================== -->
-	<target name="postSetup">
-		<antcall target="getBaseComponents"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before fetching the build elements -->
-	<!-- ===================================================================== -->
-	<target name="preFetch">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after fetching the build elements -->
-	<!-- ===================================================================== -->
-	<target name="postFetch">
-		<antcall target="tagMapFiles"/>
-		<antcall target="generateAboutMappings"/>
-		<antcall target="updateRcpIniFile"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before generating the build scripts. -->
-	<!-- ===================================================================== -->
-	<target name="preGenerate">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after generating the build scripts. -->
-	<!-- ===================================================================== -->
-	<target name="postGenerate">
-		<antcall target="clean"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before running the build.xmls for the elements being built. -->
-	<!-- ===================================================================== -->
-	<target name="preProcess">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after running the build.xmls for the elements being built. -->
-	<!-- ===================================================================== -->
-	<target name="postProcess">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before running assemble. -->
-	<!-- ===================================================================== -->
-	<target name="preAssemble">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after  running assemble. -->
-	<!-- ===================================================================== -->
-	<target name="postAssemble">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before running package. -->
-	<!-- ===================================================================== -->
-	<target name="prePackage">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after  running package. -->
-	<!-- ===================================================================== -->
-	<target name="postPackage">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after the build is done. -->
-	<!-- ===================================================================== -->
-	<target name="postBuild">
-		<antcall target="gatherLogs"/>
-		<antcall target="updateBuildState"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do to test the build results -->
-	<!-- ===================================================================== -->
-	<target name="test">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do to publish the build results -->
-	<!-- ===================================================================== -->
-	<target name="publish">
-		<!--
-		<antcall target="push2Site"/>
-		<antcall target="commitDLPg"/>
-		-->
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Default target                                                        -->
-	<!-- ===================================================================== -->
-	<target name="noDefault">
-		<echo message="You must specify a target when invoking this file"/>
-	</target>
-
-</project>
diff --git a/1.5/releng/build-scripts/readme.txt b/1.5/releng/build-scripts/readme.txt
deleted file mode 100644
index 0fce197..0000000
--- a/1.5/releng/build-scripts/readme.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-run.bat			batch file to run headless build
-build.properties	contains build options
-allElements.xml		build script
-customTargets.xml	build script
-readme.txt		this file
-build/			directory containing source pulled from CVS and build output - to be cleaned up after every build
-templates/		directory containing template files from eclipse
-workspace/		workspace created by Eclipse IDE as mentioned in 1.6
-
-
-More Detailed Instructions
-
-1. Set up Headless Build Environment
-
-  1.1 Install JSDK is on the system and make sure java.exe is available on system PATH environment variable. [JAVAEXE]
-  1.2 Install Apache ANT on the system and make sure the Ant binaries are accessible on the command line.
-  1.3 Install IES or Open-Source Eclipse SDP is on the system and note the install location of Eclipse [ECLIPSEHOME]
-  1.4 Obtain the plugins org.eclipse.pde.build and have this plugin in the Eclipse SDP [SCRIPTSHOME]
-  1.5 Obtain the HEADLESS build scripts and put them it a directory by themselves [BUILDHOME]
-  1.6 Start Eclipse SDP and define a workspace location [WORKSPACE].  Allow the IDE to start fully and then exit.  Only the workspace is needed.
-
-
-2. Customize the Headless Build Scripts
-
-  2.1 Modify run.bat file to suit your environment.
-  2.2 Modify build.properties making sure that the following properties are addressed.
-        product=
-        buildDirectory=
-        base=
-        baseLocation=
-        mapsRepo=
-        mapsRoot=
-        fetchTag=
-  2.3 Modify allElements.xml
-	Provide the correct top level feature being built.
-	Provide the correct elementPath property in the allElementsDelegator target.
-
-  2.4 Make sure the map files in org.eclipse.epf.releng/maps are accurate
-
-
diff --git a/1.5/releng/build-scripts/run.bat b/1.5/releng/build-scripts/run.bat
deleted file mode 100644
index 29513f2..0000000
--- a/1.5/releng/build-scripts/run.bat
+++ /dev/null
@@ -1,86 +0,0 @@
-@echo off
-setlocal
-
-REM The location where the headless build scripts & resource files live.
-set BUILDHOME=%~dp0
-
-REM ******************************************
-REM *          CHANGE THESE SETTINGS         *
-REM ******************************************
-
-REM The JRE java.exe to be used
-set JAVAEXE=C:\bin\jdk\sun\bin\java.exe
-
-REM the Eclipse to use
-set ECLIPSEHOME=C:\bin\sdp\3.2.2\eclipse
-
-REM CVS login info - provide CVS user name and password
-REM :extssh:<username>:<password>
-REM put "" around the value if it contains non-alphanumeric chars
-set CVSINFO=:pserver:anonymous
-
-REM The directory containing tag.current.properties
-SET BUILDSTATEDIR=S:\projects\epf\1.2.0\state
-
-REM ******************************************
-REM *     DO NOT CHANGE THESE SETTINGS       *
-REM ******************************************
-
-REM The Eclipse startup.jar
-set STARTUPJAR="%ECLIPSEHOME%\startup.jar"
-
-REM The scripts directory in the org.eclipse.pde.build Eclipse plugin.
-set SCRIPTSHOME="%ECLIPSEHOME%\plugins\org.eclipse.pde.build_3.2.1.r321_v20060823\scripts"
-
-REM The location where the headless build scripts & resource files live.
-REM set BUILDHOME=C:\builds\epf_110\headless
-set BUILDHOME=%~dp0
-
-REM The location of the temporary build workspace
-set WORKSPACE=%BUILDHOME%\workspace
-
-REM The buildfile to use for the build
-set BUILDFILE=build.xml
-
-REM The builder directory containing build.properties
-REM build.properties, allElements.xml and customTargets.xml needs to be in the same place
-set BUILDERDIR=%BUILDHOME%
-
-set HOUR=%time:~0,2%
-if "%HOUR:~0,1%"==" " set HOUR=0%time:~1,1%
-set BUILDID=%date:~-4%%date:~4,2%%date:~7,2%-%HOUR%%time:~3,2%
-
-REM ****************************************************
-
-
-if not exist %JAVAEXE% echo ERROR: incorrect java.exe=%JAVAEXE%, edit this file and correct the JAVAEXE envar
-if not exist %JAVAEXE% goto done
-
-if not exist %STARTUPJAR% echo ERROR: incorrect startup.jar=%STARTUPJAR%, edit this file and correct the STARTUPJAR envar
-if not exist %STARTUPJAR% goto done
-
-if not exist %BUILDERDIR% echo ERROR: incorrect builderdir=%BUILDERDIR%, edit this file and correct the BUILDERDIR envar
-if not exist %BUILDERDIR% goto done
-
-if not exist %BUILDSTATEDIR% echo ERROR: incorrect buildStateDir=%BUILDSTATEDIR%, edit this file and correct the BUILDSTATEDIR envar
-if not exist %BUILDSTATEDIR% goto done
-
-
-:run
-
-pushd %SCRIPTSHOME%
-
-if not exist %BUILDFILE% echo ERROR: incorrect buildfile=%BUILDFILE%, edit this file and correct the BUILDFILE envar
-if not exist %BUILDFILE% goto done
-
-@echo on
-
-rd /s /q %WORKSPACE%
-
-%JAVAEXE% -cp %STARTUPJAR% org.eclipse.core.launcher.Main -noupdate -application org.eclipse.ant.core.antRunner -data %WORKSPACE% -buildfile %BUILDFILE% -Dbuilder=%BUILDERDIR% -DbuildId=%BUILDID% -DbuildStateDir=%BUILDSTATEDIR% -DcvsInfo=%CVSINFO% -DbaseLocation=%ECLIPSEHOME% %1 %2 %3 %4 %5 %6 %7 %8 %9
-
-@echo off
-popd
-
-:done
-REM pause
diff --git a/1.5/releng/build-scripts/templates/allElements.xml b/1.5/releng/build-scripts/templates/allElements.xml
deleted file mode 100644
index b4eec84..0000000
--- a/1.5/releng/build-scripts/templates/allElements.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<project name="allElements Delegator">
-	
- 	<!-- ===================================================================== -->
- 	<!-- Run a given ${target} on all elements being built                     -->
- 	<!-- Replace element.id with the id of the top level element being built.    -->
-	<!-- If element.id does not exist in ${buildDirectory}/features/element.id   -->
-	<!-- or ${baseLocation}/features/element.id, then you must provide the       -->
-	<!-- location by setting the property "pluginPath"                           -->
- 	<!-- Add on <ant> task for each top level element being built.             -->
- 	<!-- ===================================================================== -->
- 	<target name="allElementsDelegator">
- 		<ant antfile="${genericTargets}" target="${target}">
-	 		<property name="type" value="feature" />
-	 		<property name="id" value="element.id" />
- 		</ant>
- 	</target>
- 
- 	<!-- ===================================================================== -->
- 	<!-- Targets to assemble the built elements for particular configurations  -->
- 	<!-- These generally call the generated assemble scripts (named in         -->
- 	<!-- ${assembleScriptName}) but may also add pre and post processing       -->
- 	<!-- Add one target for each root element and each configuration           -->
- 	<!-- Replace element.id with the id of the top level element being built   -->
- 	<!-- ===================================================================== -->
- 	<target name="assemble.element.id[.config.spec]">
- 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}"/>
- 	</target>
-</project>
diff --git a/1.5/releng/build-scripts/templates/build.properties b/1.5/releng/build-scripts/templates/build.properties
deleted file mode 100644
index 5259585..0000000
--- a/1.5/releng/build-scripts/templates/build.properties
+++ /dev/null
@@ -1,215 +0,0 @@
-###############################################################################
-# Copyright (c) 2003, 2006 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#####################
-# Parameters describing how and where to execute the build.
-# Typical users need only update the following properties:
-#    baseLocation - where things you are building against are installed
-#    bootclasspath - The base jars to compile against (typicaly rt.jar)
-#    configs - the list of {os, ws, arch} configurations to build.  
-#
-# Of course any of the settings here can be overridden by spec'ing 
-# them on the command line (e.g., -DbaseLocation=d:/eclipse
-
-############# PRODUCT/PACKAGING CONTROL #############
-product=/plugin or feature id/path/to/.product
-runPackager=true
-
-#Set the name of the archive that will result from the product build.
-#archiveNamePrefix=
-
-# The prefix that will be used in the generated archive.
-archivePrefix=<output archive root>
-
-# The location underwhich all of the build output will be collected.
-collectingFolder=${archivePrefix}
-
-# The list of {os, ws, arch} configurations to build.  This 
-# value is a '&' separated list of ',' separate triples.  For example, 
-#     configs=win32,win32,x86 & linux,motif,x86
-# By default the value is *,*,*
-#configs=win32, win32, x86 & \
-#	linux, gtk, ppc &\
-# linux, gtk, x86 & \
-#	linux, gtk, x86_64 & \
-#	linux, motif, x86 & \
-#	solaris, motif, sparc & \
-#	solaris, gtk, sparc & \
-#	aix, motif, ppc & \
-#	hpux, motif, PA_RISC & \
-#	macosx, carbon, ppc
-
-# By default PDE creates one archive (result) per entry listed in the configs property.
-# Setting this value to try will cause PDE to only create one output containing all 
-# artifacts for all the platforms listed in the configs property.
-#groupConfigurations=true
-
-#The format of the archive. By default a zip is created using antZip.
-#The list can only contain the configuration for which the desired format is different than zip.
-#archivesFormat=win32, win32, x86 - antZip& \
-#	linux, gtk, ppc - antZip &\
-#    linux, gtk, x86 - antZip& \
-#	linux, gtk, x86_64 - antZip& \
-# linux, motif, x86 - antZip& \
-#	solaris, motif, sparc - antZip& \
-#	solaris, gtk, sparc - antZip& \
-#	aix, motif, ppc - antZip& \
-#	hpux, motif, PA_RISC - antZip& \
-#	macosx, carbon, ppc - antZip
-	
-#Set to true if you want the output to be ready for an update jar (no site.xml generated)
-#outputUpdateJars = false
-
-#Set to true for Jnlp generation
-#codebase should be a URL that will be used as the root of all relative URLs in the output.
-#generateJnlp=false
-#jnlp.codebase=<codebase url>
-#jnlp.j2se=<j2se version>
-#jnlp.locale=<a locale>
-
-#Set to true if you want to sign jars
-#signJars=false
-#sign.alias=<alias>
-#sign.keystore=<keystore location>
-#sign.storepass=<keystore password>
-
-#Arguments to send to the zip executable
-zipargs=
-
-#Arguments to send to the tar executable
-tarargs=
-
-#Control the creation of a file containing the version included in each configuration - on by default 
-#generateVersionsLists=false
-
-############## BUILD NAMING CONTROL ################
-# The directory into which the build elements are fetched and where
-# the build takes place.
-buildDirectory=${user.home}/eclipse.build
-
-# Type of build.  Used in naming the build output.  Typically this value is
-# one of I, N, M, S, ...
-buildType=I
-
-# ID of the build.  Used in naming the build output.
-buildId=TestBuild
-
-# Label for the build.  Used in naming the build output
-buildLabel=${buildType}.${buildId}
-
-# Timestamp for the build.  Used in naming the build output
-timestamp=007
-
-#The value to be used for the qualifier of a plugin or feature when you want to override the value computed by pde.
-#The value will only be applied to plugin or features indicating build.properties, qualifier = context 
-#forceContextQualifier=<the value for the qualifier>
-
-#Enable / disable the generation of a suffix for the features that use .qualifier. 
-#The generated suffix is computed according to the content of the feature   
-#generateFeatureVersionSuffix=true
-
-############# BASE CONTROL #############
-# Settings for the base Eclipse components and Java class libraries 
-# against which you are building.
-# Base location for anything the build needs to compile against.  For example,
-# in most RCP app or a plug-in,  the baseLocation should be the location of a previously
-# installed Eclipse against which the application or plug-in code will be compiled and the RCP delta pack.
-
-base=<path/to/parent/of/eclipse>
-baseLocation=${base}/eclipse
-#Os/Ws/Arch/nl of the eclipse specified by baseLocation
-baseos=win32
-basews=win32
-basearch=x86
-
-#pluginPath is a list of locations in which to find plugins and features.  This list is separated by the platform file separator (; or :)
-#a location is one of:  
-#- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo
-#- a directory that contains a /plugins or /features subdirectory
-#- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml
-#pluginPath=
-
-skipBase=true
-eclipseURL=<url for eclipse download site>
-eclipseBuildId=<Id of Eclipse build to get>
-eclipseBaseURL=${eclipseURL}/eclipse-platform-${eclipseBuildId}-win32.zip
-
-
-############# MAP FILE CONTROL ################
-# This section defines CVS tags to use when fetching the map files from the repository.
-# If you want to fetch the map file from repository / location, change the getMapFiles target in the customTargets.xml
-
-skipMaps=true
-mapsRepo=:pserver:anonymous@example.com/path/to/repo
-mapsRoot=path/to/maps
-mapsCheckoutTag=HEAD
-
-#tagMaps=true
-mapsTagTag=v${buildId}
-
-
-############ REPOSITORY CONTROL ###############
-# This section defines properties parameterizing the repositories where plugins, fragments
-# bundles and features are being obtained from. 
-
-# The tags to use when fetching elements to build.
-# By default thebuilder will use whatever is in the maps.  
-# This value takes the form of a comma separated list of repository identifier (like used in the map files) and the 
-# overriding value
-# For example fetchTag=CVS=HEAD, SVN=v20050101
-# fetchTag=HEAD
-skipFetch=true
-
-
-############# JAVA COMPILER OPTIONS ##############
-# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
-#bootclasspath=${java.home}/lib/rt.jar
-
-# specific JRE locations to compile against. These values are used to compile bundles specifying a 
-# Bundle-RequiredExecutionEnvironment. Uncomment and set values for environments that you support
-#CDC-1.0/Foundation-1.0= /path/to/rt.jar
-#CDC-1.1/Foundation-1.1=
-#OSGi/Minimum-1.0=
-#OSGi/Minimum-1.1=
-#JRE-1.1=
-#J2SE-1.2=
-#J2SE-1.3=
-#J2SE-1.4=
-#J2SE-1.5=
-#JavaSE-1.6=
-#PersonalJava-1.1=
-#PersonalJava-1.2=
-#CDC-1.0/PersonalBasis-1.0=
-#CDC-1.0/PersonalJava-1.0=
-#CDC-1.1/PersonalBasis-1.1=
-#CDC-1.1/PersonalJava-1.1=
-
-# Specify the output format of the compiler log when eclipse jdt is used
-logExtension=.log
-
-# Whether or not to include debug info in the output jars
-javacDebugInfo=false 
-
-# Whether or not to fail the build if there are compiler errors
-javacFailOnError=true
-
-# Enable or disable verbose mode of the compiler
-javacVerbose=true
-
-# Extra arguments for the compiler. These are specific to the java compiler being used.
-#compilerArg=
-
-# Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties
-#javacSource=1.3
-
-# Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties.
-#javacTarget=1.1
-
-
diff --git a/1.5/releng/build-scripts/templates/customTargets.xml b/1.5/releng/build-scripts/templates/customTargets.xml
deleted file mode 100644
index fa7256f..0000000
--- a/1.5/releng/build-scripts/templates/customTargets.xml
+++ /dev/null
@@ -1,161 +0,0 @@
-<project name="Build specific targets and properties" default="noDefault">
-
-	<!-- ===================================================================== -->
-	<!-- Run a given ${target} on all elements being built -->
-	<!-- Add on <ant> task for each top level element being built. -->
-	<!-- ===================================================================== -->
-	<property name="allElementsFile" value="${builder}/allElements.xml"/>
-	<import file="${allElementsFile}"/>
-	<target name="allElements">
-		<antcall target="allElementsDelegator"/>
-	</target>
-	
-	<!-- ===================================================================== -->
-	<!-- ===================================================================== -->
-	<target name="getBaseComponents" depends="checkLocalBase" unless="skipBase">
-		<get src="${eclipseBaseURL}" dest="${buildDirectory}/../temp-base.zip"/>
-		<unzip dest="${base}" overwrite="true" src="${buildDirectory}/../temp-base.zip"/>
-	</target>
-
-	<target name="checkLocalBase">
-		<available file="${base}" property="skipBase"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Check out map files from correct repository -->
-	<!-- Replace values for mapsCheckoutTag as desired. -->
-	<!-- ===================================================================== -->
-	<target name="getMapFiles" depends="checkLocalMaps" unless="skipMaps">
-		<property name="mapsCheckoutTag" value="HEAD"/>
-		<cvs cvsRoot="${mapsRepo}" package="${mapsRoot}" dest="${buildDirectory}/maps" tag="${mapsCheckoutTag}"/>
-	</target>
-
-	<target name="checkLocalMaps">
-		<available property="skipMaps" file="${buildDirectory}/maps"/>
-	</target>
-
-	<target name="tagMapFiles" if="tagMaps">
-		<cvs dest="${buildDirectory}/maps/${mapsRoot}" command="tag ${mapsTagTag}"/>
-	</target>
-
-	<!-- ===================================================================== -->
-
-	<target name="clean" unless="noclean">
-		<antcall target="allElements">
-			<param name="target" value="cleanElement"/>
-		</antcall>
-	</target>
-
-	<target name="gatherLogs">
-		<mkdir dir="${buildDirectory}/${buildLabel}/compilelogs"/>
-		<antcall target="allElements">
-			<param name="target" value="gatherLogs"/>
-		</antcall>
-		<unzip dest="${buildDirectory}/${buildLabel}/compilelogs" overwrite="true">
-			<fileset dir="${buildDirectory}/features">
-				<include name="**/*.log.zip"/>
-			</fileset>
-		</unzip>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before setup -->
-	<!-- ===================================================================== -->
-	<target name="preSetup">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after setup but before starting the build proper -->
-	<!-- ===================================================================== -->
-	<target name="postSetup">
-		<antcall target="getBaseComponents"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before fetching the build elements -->
-	<!-- ===================================================================== -->
-	<target name="preFetch">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after fetching the build elements -->
-	<!-- ===================================================================== -->
-	<target name="postFetch">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before generating the build scripts. -->
-	<!-- ===================================================================== -->
-	<target name="preGenerate">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after generating the build scripts. -->
-	<!-- ===================================================================== -->
-	<target name="postGenerate">
-		<antcall target="clean"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before running the build.xmls for the elements being built. -->
-	<!-- ===================================================================== -->
-	<target name="preProcess">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after running the build.xmls for the elements being built. -->
-	<!-- ===================================================================== -->
-	<target name="postProcess">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before running assemble. -->
-	<!-- ===================================================================== -->
-	<target name="preAssemble">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after  running assemble. -->
-	<!-- ===================================================================== -->
-	<target name="postAssemble">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do before running package. -->
-	<!-- ===================================================================== -->
-	<target name="prePackage">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after  running package. -->
-	<!-- ===================================================================== -->
-	<target name="postPackage">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do after the build is done. -->
-	<!-- ===================================================================== -->
-	<target name="postBuild">
-		<antcall target="gatherLogs"/>
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do to test the build results -->
-	<!-- ===================================================================== -->
-	<target name="test">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Steps to do to publish the build results -->
-	<!-- ===================================================================== -->
-	<target name="publish">
-	</target>
-
-	<!-- ===================================================================== -->
-	<!-- Default target                                                        -->
-	<!-- ===================================================================== -->
-	<target name="noDefault">
-		<echo message="You must specify a target when invoking this file"/>
-	</target>
-
-</project>
\ No newline at end of file
diff --git a/1.5/releng/maps/epf_en.map b/1.5/releng/maps/epf_en.map
deleted file mode 100644
index 4751a0b..0000000
--- a/1.5/releng/maps/epf_en.map
+++ /dev/null
@@ -1,49 +0,0 @@
-feature@org.eclipse.epf.base.feature=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/features/org.eclipse.epf.base.feature
-feature@org.eclipse.epf.doc.feature=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/features/org.eclipse.epf.doc.feature
-feature@org.eclipse.epf.platform.feature=v20071009-1428,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/features/org.eclipse.epf.platform.feature
-feature@org.eclipse.epf.rcp.feature=v20070831-1033,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/features/org.eclipse.epf.rcp.feature
-feature@org.eclipse.epf.product.feature=v20070806-1815,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/features/org.eclipse.epf.product.feature
-plugin@org.eclipse.epf.authoring.ui=v20071109_1544,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.authoring.ui
-plugin@org.eclipse.epf.base=v20071015-1648,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.base
-plugin@org.eclipse.epf.common=v20071102-1707,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.common
-plugin@org.eclipse.epf.common.win32.win32.x86=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.common.win32.win32.x86
-plugin@org.eclipse.epf.dataexchange=v20070906-1418,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.dataexchange
-plugin@org.eclipse.epf.diagram.model=v20071015-1126,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.diagram.model
-plugin@org.eclipse.epf.diagram.ad=v20071015-1126,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.diagram.ad
-plugin@org.eclipse.epf.diagram.add=v20071015-1126,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.diagram.add
-plugin@org.eclipse.epf.diagram.core=v20071025-1311,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.diagram.core
-plugin@org.eclipse.epf.diagram.edit=v20071015-1126,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.diagram.edit
-plugin@org.eclipse.epf.diagram.wpdd=v20071015-1126,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.diagram.wpdd
-plugin@org.eclipse.epf.diagram.ui=v20071113-1309,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.diagram.ui
-plugin@org.eclipse.epf.doc=v20070831-1033,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.doc
-plugin@org.eclipse.epf.export=v20071101-1635,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.export
-plugin@org.eclipse.epf.export.msp=v20071008-1708,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.export.msp
-plugin@org.eclipse.epf.export.msp.ui=v20071029-1233,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.export.msp.ui
-plugin@org.eclipse.epf.export.xml=v20071029-1509,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.export.xml
-plugin@org.eclipse.epf.help.doc=v20070905-1644,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.help.doc
-plugin@org.eclipse.epf.import=v20071031-1043,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.import
-plugin@org.eclipse.epf.import.xml=v20071101-1635,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.import.xml
-plugin@org.eclipse.epf.library=v20071101-1436,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.library
-plugin@org.eclipse.epf.library.edit=v20071109_1544,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.library.edit
-plugin@org.eclipse.epf.library.persistence=v20070927-1135,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.library.persistence
-plugin@org.eclipse.epf.library.ui=v20070831-1755,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.library.ui
-plugin@org.eclipse.epf.library.ui.xmi=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.library.ui.xmi
-plugin@org.eclipse.epf.library.xmi=v20071019-1627,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.library.xmi
-plugin@org.eclipse.epf.migration.diagram=v20071017-1313,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.migration.diagram
-plugin@org.eclipse.epf.msproject=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.msproject
-plugin@org.eclipse.epf.platform=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.platform
-plugin@org.eclipse.epf.publishing=v20071023-1506,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.publishing
-plugin@org.eclipse.epf.publishing.ui=v20071030-2325,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.publishing.ui
-plugin@org.eclipse.epf.rcp=v20071015-1648,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.rcp
-plugin@org.eclipse.epf.rcp.ui=v20071015-1648,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.rcp.ui
-plugin@org.eclipse.epf.richtext=v20071107-1814,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.richtext
-plugin@org.eclipse.epf.search=v20070824-2327,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.search
-plugin@org.eclipse.epf.search.ui=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.search.ui
-plugin@org.eclipse.epf.services=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.services
-plugin@org.eclipse.epf.validation=v20070822-1930,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.validation
-plugin@org.eclipse.epf.ui=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.ui
-plugin@org.eclipse.epf.ui.intro=v20070829-2239,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.ui.intro
-plugin@org.eclipse.epf.uma=v20071019-1802,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.uma
-plugin@org.eclipse.epf.uma.ecore=v20070911-1625,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.uma.ecore
-plugin@org.eclipse.epf.uma.edit=v20070806-1500,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.uma.edit
-plugin@org.eclipse.epf.xml.uma=v20070905-1712,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/prototype/2.0/plugins/org.eclipse.epf.xml.uma
\ No newline at end of file
diff --git a/1.5/releng/maps/epf_nls1.map b/1.5/releng/maps/epf_nls1.map
deleted file mode 100644
index f5a5d29..0000000
--- a/1.5/releng/maps/epf_nls1.map
+++ /dev/null
@@ -1,33 +0,0 @@
-feature@org.eclipse.epf.base.feature.nls1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.base.feature.nls1
-feature@org.eclipse.epf.platform.feature.nls1=v20071018-1859,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.platform.feature.nls1
-feature@org.eclipse.epf.rcp.feature.nls1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.rcp.feature.nls1
-fragment@org.eclipse.epf.authoring.ui.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.authoring.ui.nl1
-fragment@org.eclipse.epf.diagram.ad.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.ad.nl1
-fragment@org.eclipse.epf.diagram.add.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.add.nl1
-fragment@org.eclipse.epf.diagram.core.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.core.nl1
-fragment@org.eclipse.epf.diagram.edit.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.edit.nl1
-fragment@org.eclipse.epf.diagram.model.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.model.nl1
-fragment@org.eclipse.epf.diagram.wpdd.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.wpdd.nl1
-fragment@org.eclipse.epf.export.msp.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.msp.nl1
-fragment@org.eclipse.epf.export.msp.ui.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.msp.ui.nl1
-fragment@org.eclipse.epf.export.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.nl1
-fragment@org.eclipse.epf.export.xml.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.xml.nl1
-fragment@org.eclipse.epf.import.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.import.nl1
-fragment@org.eclipse.epf.import.xml.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.import.xml.nl1
-fragment@org.eclipse.epf.library.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.nl1
-fragment@org.eclipse.epf.library.edit.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.edit.nl1
-fragment@org.eclipse.epf.library.persistence.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.persistence.nl1
-fragment@org.eclipse.epf.library.ui.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.ui.nl1
-fragment@org.eclipse.epf.library.ui.xmi.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.ui.xmi.nl1
-fragment@org.eclipse.epf.library.xmi.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.xmi.nl1
-fragment@org.eclipse.epf.migration.diagram.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.migration.diagram.nl1
-fragment@org.eclipse.epf.publishing.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.publishing.nl1
-fragment@org.eclipse.epf.publishing.ui.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.publishing.ui.nl1
-fragment@org.eclipse.epf.rcp.ui.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.rcp.ui.nl1
-fragment@org.eclipse.epf.richtext.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.richtext.nl1
-fragment@org.eclipse.epf.search.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.search.nl1
-fragment@org.eclipse.epf.search.ui.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.search.ui.nl1
-fragment@org.eclipse.epf.ui.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.ui.nl1
-fragment@org.eclipse.epf.uma.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.uma.nl1
-fragment@org.eclipse.epf.uma.edit.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.uma.edit.nl1
-fragment@org.eclipse.epf.validation.nl1=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.validation.nl1
\ No newline at end of file
diff --git a/1.5/releng/maps/epf_nls2.map b/1.5/releng/maps/epf_nls2.map
deleted file mode 100644
index e39867e..0000000
--- a/1.5/releng/maps/epf_nls2.map
+++ /dev/null
@@ -1,33 +0,0 @@
-feature@org.eclipse.epf.base.feature.nls2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.base.feature.nls2
-feature@org.eclipse.epf.platform.feature.nls2=v20071018-1859,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.platform.feature.nls2
-feature@org.eclipse.epf.rcp.feature.nls2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.rcp.feature.nls2
-fragment@org.eclipse.epf.authoring.ui.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.authoring.ui.nl2
-fragment@org.eclipse.epf.diagram.ad.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.ad.nl2
-fragment@org.eclipse.epf.diagram.add.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.add.nl2
-fragment@org.eclipse.epf.diagram.core.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.core.nl2
-fragment@org.eclipse.epf.diagram.edit.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.edit.nl2
-fragment@org.eclipse.epf.diagram.model.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.model.nl2
-fragment@org.eclipse.epf.diagram.wpdd.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.wpdd.nl2
-fragment@org.eclipse.epf.export.msp.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.msp.nl2
-fragment@org.eclipse.epf.export.msp.ui.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.msp.ui.nl2
-fragment@org.eclipse.epf.export.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.nl2
-fragment@org.eclipse.epf.export.xml.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.xml.nl2
-fragment@org.eclipse.epf.import.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.import.nl2
-fragment@org.eclipse.epf.import.xml.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.import.xml.nl2
-fragment@org.eclipse.epf.library.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.nl2
-fragment@org.eclipse.epf.library.edit.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.edit.nl2
-fragment@org.eclipse.epf.library.persistence.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.persistence.nl2
-fragment@org.eclipse.epf.library.ui.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.ui.nl2
-fragment@org.eclipse.epf.library.ui.xmi.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.ui.xmi.nl2
-fragment@org.eclipse.epf.library.xmi.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.xmi.nl2
-fragment@org.eclipse.epf.migration.diagram.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.migration.diagram.nl2
-fragment@org.eclipse.epf.publishing.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.publishing.nl2
-fragment@org.eclipse.epf.publishing.ui.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.publishing.ui.nl2
-fragment@org.eclipse.epf.rcp.ui.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.rcp.ui.nl2
-fragment@org.eclipse.epf.richtext.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.richtext.nl2
-fragment@org.eclipse.epf.search.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.search.nl2
-fragment@org.eclipse.epf.search.ui.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.search.ui.nl2
-fragment@org.eclipse.epf.ui.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.ui.nl2
-fragment@org.eclipse.epf.uma.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.uma.nl2
-fragment@org.eclipse.epf.uma.edit.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.uma.edit.nl2
-fragment@org.eclipse.epf.validation.nl2=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.validation.nl2
\ No newline at end of file
diff --git a/1.5/releng/maps/epf_nls2a.map b/1.5/releng/maps/epf_nls2a.map
deleted file mode 100644
index a6476b4..0000000
--- a/1.5/releng/maps/epf_nls2a.map
+++ /dev/null
@@ -1,33 +0,0 @@
-feature@org.eclipse.epf.base.feature.nls2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.base.feature.nls2a
-feature@org.eclipse.epf.platform.feature.nls2a=v20071018-1859,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.platform.feature.nls2a
-feature@org.eclipse.epf.rcp.feature.nls2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/features/org.eclipse.epf.rcp.feature.nls2a
-fragment@org.eclipse.epf.authoring.ui.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.authoring.ui.nl2a
-fragment@org.eclipse.epf.diagram.ad.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.ad.nl2a
-fragment@org.eclipse.epf.diagram.add.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.add.nl2a
-fragment@org.eclipse.epf.diagram.core.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.core.nl2a
-fragment@org.eclipse.epf.diagram.edit.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.edit.nl2a
-fragment@org.eclipse.epf.diagram.model.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.model.nl2a
-fragment@org.eclipse.epf.diagram.wpdd.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.diagram.wpdd.nl2a
-fragment@org.eclipse.epf.export.msp.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.msp.nl2a
-fragment@org.eclipse.epf.export.msp.ui.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.msp.ui.nl2a
-fragment@org.eclipse.epf.export.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.nl2a
-fragment@org.eclipse.epf.export.xml.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.export.xml.nl2a
-fragment@org.eclipse.epf.import.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.import.nl2a
-fragment@org.eclipse.epf.import.xml.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.import.xml.nl2a
-fragment@org.eclipse.epf.library.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.nl2a
-fragment@org.eclipse.epf.library.edit.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.edit.nl2a
-fragment@org.eclipse.epf.library.persistence.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.persistence.nl2a
-fragment@org.eclipse.epf.library.ui.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.ui.nl2a
-fragment@org.eclipse.epf.library.ui.xmi.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.ui.xmi.nl2a
-fragment@org.eclipse.epf.library.xmi.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.library.xmi.nl2a
-fragment@org.eclipse.epf.migration.diagram.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.migration.diagram.nl2a
-fragment@org.eclipse.epf.publishing.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.publishing.nl2a
-fragment@org.eclipse.epf.publishing.ui.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.publishing.ui.nl2a
-fragment@org.eclipse.epf.rcp.ui.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.rcp.ui.nl2a
-fragment@org.eclipse.epf.richtext.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.richtext.nl2a
-fragment@org.eclipse.epf.search.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.search.nl2a
-fragment@org.eclipse.epf.search.ui.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.search.ui.nl2a
-fragment@org.eclipse.epf.ui.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.ui.nl2a
-fragment@org.eclipse.epf.uma.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.uma.nl2a
-fragment@org.eclipse.epf.uma.edit.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.uma.edit.nl2a
-fragment@org.eclipse.epf.validation.nl2a=v200708281722,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,,org.eclipse.epf/nl_src/plugins/org.eclipse.epf.validation.nl2a
\ No newline at end of file
diff --git a/1.5/releng/release-notes.html b/1.5/releng/release-notes.html
deleted file mode 100644
index 8e23209..0000000
--- a/1.5/releng/release-notes.html
+++ /dev/null
@@ -1,1279 +0,0 @@
-﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns:v="urn:schemas-microsoft-com:vml"
-xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=utf-8">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 10">
-<meta name=Originator content="Microsoft Word 10">
-<link rel=File-List href="release-notes_files/filelist.xml">
-<link rel=Edit-Time-Data href="release-notes_files/editdata.mso">
-<!--[if !mso]>
-<style>
-v\:* {behavior:url(#default#VML);}
-o\:* {behavior:url(#default#VML);}
-w\:* {behavior:url(#default#VML);}
-.shape {behavior:url(#default#VML);}
-</style>
-<![endif]-->
-<title>IBM Rational Method Composer - Release Notes</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Author>IBM_USER</o:Author>
-  <o:LastAuthor>IBM_USER</o:LastAuthor>
-  <o:Revision>9</o:Revision>
-  <o:TotalTime>24</o:TotalTime>
-  <o:Created>2006-04-19T22:55:00Z</o:Created>
-  <o:LastSaved>2006-04-21T22:16:00Z</o:LastSaved>
-  <o:Pages>1</o:Pages>
-  <o:Words>1958</o:Words>
-  <o:Characters>11163</o:Characters>
-  <o:Company>IBM</o:Company>
-  <o:Lines>93</o:Lines>
-  <o:Paragraphs>26</o:Paragraphs>
-  <o:CharactersWithSpaces>13095</o:CharactersWithSpaces>
-  <o:Version>10.6735</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:SpellingState>Clean</w:SpellingState>
-  <w:GrammarState>Clean</w:GrammarState>
-  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
- @font-face
-	{font-family:Wingdings;
-	panose-1:5 0 0 0 0 0 0 0 0 0;
-	mso-font-charset:2;
-	mso-generic-font-family:auto;
-	mso-font-pitch:variable;
-	mso-font-signature:0 268435456 0 0 -2147483648 0;}
- /* Style Definitions */
- p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-h1
-	{mso-margin-top-alt:auto;
-	margin-right:0in;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	mso-outline-level:1;
-	font-size:24.0pt;
-	font-family:"Times New Roman";
-	font-weight:bold;}
-h2
-	{mso-margin-top-alt:auto;
-	margin-right:0in;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	mso-outline-level:2;
-	font-size:18.0pt;
-	font-family:"Times New Roman";
-	font-weight:bold;}
-h3
-	{mso-margin-top-alt:auto;
-	margin-right:0in;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	mso-outline-level:3;
-	font-size:13.5pt;
-	font-family:"Times New Roman";
-	font-weight:bold;}
-a:link, span.MsoHyperlink
-	{color:blue;
-	text-decoration:underline;
-	text-underline:single;}
-a:visited, span.MsoHyperlinkFollowed
-	{color:blue;
-	text-decoration:underline;
-	text-underline:single;}
-p
-	{mso-margin-top-alt:auto;
-	margin-right:0in;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-code
-	{font-family:"Courier New";
-	mso-ascii-font-family:"Courier New";
-	mso-fareast-font-family:"Times New Roman";
-	mso-hansi-font-family:"Courier New";
-	mso-bidi-font-family:"Courier New";}
-span.SpellE
-	{mso-style-name:"";
-	mso-spl-e:yes;}
-span.GramE
-	{mso-style-name:"";
-	mso-gram-e:yes;}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
- /* List Definitions */
- @list l0
-	{mso-list-id:80880263;
-	mso-list-template-ids:2074100826;}
-@list l0:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l1
-	{mso-list-id:164712945;
-	mso-list-template-ids:-1306615696;}
-@list l1:level1
-	{mso-level-start-at:3;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l2
-	{mso-list-id:207497567;
-	mso-list-template-ids:-834219532;}
-@list l2:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l2:level2
-	{mso-level-number-format:bullet;
-	mso-level-text:o;
-	mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:"Courier New";
-	mso-bidi-font-family:"Times New Roman";}
-@list l2:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l2:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l2:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l2:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l2:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l2:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l2:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l3
-	{mso-list-id:320814423;
-	mso-list-template-ids:-477982726;}
-@list l3:level1
-	{mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l4
-	{mso-list-id:396826824;
-	mso-list-template-ids:-456871430;}
-@list l4:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l4:level2
-	{mso-level-number-format:bullet;
-	mso-level-text:o;
-	mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:"Courier New";
-	mso-bidi-font-family:"Times New Roman";}
-@list l4:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l4:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l4:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l4:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l4:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l4:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l4:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l5
-	{mso-list-id:492183335;
-	mso-list-template-ids:-1818085256;}
-@list l5:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l5:level2
-	{mso-level-number-format:bullet;
-	mso-level-text:o;
-	mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:"Courier New";
-	mso-bidi-font-family:"Times New Roman";}
-@list l6
-	{mso-list-id:515192783;
-	mso-list-template-ids:-1999468180;}
-@list l6:level1
-	{mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l7
-	{mso-list-id:580716713;
-	mso-list-type:hybrid;
-	mso-list-template-ids:-917076132 67698703 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
-@list l7:level1
-	{mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8
-	{mso-list-id:655450294;
-	mso-list-template-ids:-387170132;}
-@list l8:level1
-	{mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level2
-	{mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l8:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l9
-	{mso-list-id:875847284;
-	mso-list-template-ids:-1987675326;}
-@list l9:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l9:level2
-	{mso-level-number-format:bullet;
-	mso-level-text:o;
-	mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:"Courier New";
-	mso-bidi-font-family:"Times New Roman";}
-@list l10
-	{mso-list-id:969016540;
-	mso-list-template-ids:1390943656;}
-@list l10:level1
-	{mso-level-start-at:4;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l10:level2
-	{mso-level-number-format:bullet;
-	mso-level-text:o;
-	mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:"Courier New";
-	mso-bidi-font-family:"Times New Roman";}
-@list l11
-	{mso-list-id:995572997;
-	mso-list-template-ids:1613250442;}
-@list l11:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l12
-	{mso-list-id:1009794136;
-	mso-list-template-ids:1466713360;}
-@list l12:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l12:level2
-	{mso-level-number-format:bullet;
-	mso-level-text:o;
-	mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:"Courier New";
-	mso-bidi-font-family:"Times New Roman";}
-@list l12:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l12:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l12:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l12:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l12:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l12:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l12:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13
-	{mso-list-id:1011109041;
-	mso-list-template-ids:-387405912;}
-@list l13:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l13:level2
-	{mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l13:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14
-	{mso-list-id:1073238748;
-	mso-list-template-ids:-281095530;}
-@list l14:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l14:level2
-	{mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l14:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15
-	{mso-list-id:1095318990;
-	mso-list-template-ids:2024680124;}
-@list l15:level1
-	{mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15:level2
-	{mso-level-number-format:bullet;
-	mso-level-text:o;
-	mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:"Courier New";
-	mso-bidi-font-family:"Times New Roman";}
-@list l15:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l15:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16
-	{mso-list-id:1103458617;
-	mso-list-template-ids:-1238454362;}
-@list l16:level1
-	{mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level2
-	{mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l16:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l17
-	{mso-list-id:1498954557;
-	mso-list-template-ids:-1612949150;}
-@list l17:level1
-	{mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l18
-	{mso-list-id:1826778503;
-	mso-list-template-ids:760893520;}
-@list l18:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l19
-	{mso-list-id:2044208640;
-	mso-list-template-ids:299129598;}
-@list l19:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l20
-	{mso-list-id:2089183746;
-	mso-list-template-ids:360636480;}
-@list l20:level1
-	{mso-level-number-format:bullet;
-	mso-level-text:;
-	mso-level-tab-stop:.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;
-	mso-ansi-font-size:10.0pt;
-	font-family:Symbol;}
-@list l20:level2
-	{mso-level-tab-stop:1.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l20:level3
-	{mso-level-tab-stop:1.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l20:level4
-	{mso-level-tab-stop:2.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l20:level5
-	{mso-level-tab-stop:2.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l20:level6
-	{mso-level-tab-stop:3.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l20:level7
-	{mso-level-tab-stop:3.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l20:level8
-	{mso-level-tab-stop:4.0in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-@list l20:level9
-	{mso-level-tab-stop:4.5in;
-	mso-level-number-position:left;
-	text-indent:-.25in;}
-ol
-	{margin-bottom:0in;}
-ul
-	{margin-bottom:0in;}
--->
-</style>
-<!--[if gte mso 10]>
-<style>
- /* Style Definitions */
- table.MsoNormalTable
-	{mso-style-name:"Table Normal";
-	mso-tstyle-rowband-size:0;
-	mso-tstyle-colband-size:0;
-	mso-style-noshow:yes;
-	mso-style-parent:"";
-	mso-padding-alt:0in 5.4pt 0in 5.4pt;
-	mso-para-margin:0in;
-	mso-para-margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:10.0pt;
-	font-family:"Times New Roman";}
-</style>
-<![endif]-->
-<meta name=copyright content="(C) Copyright IBM Corporation 2006">
-<meta name=DC.rights.owner content="(C) Copyright IBM Corporation 2006">
-<meta name=security content=public>
-<meta name=Robots content="index,follow">
-<meta http-equiv=PICS-Label
-content="(PICS-1.1 &quot;http://www.icra.org/ratingsv02.html&quot; l gen true r (cz 1 lz 1 nz 1 oz 1 vz 1) &quot;http://www.rsac.org/ratingsv01.html&quot; l gen true r (n 0 s 0 v 0 l 0) &quot;http://www.classify.org/safesurf/&quot; l gen true r (SS~~000 1))">
-<meta name=DC.Format content=XHTML>
-<meta name=DC.Language content=en-us>
-<!-- All rights reserved. Licensed Materials Property of IBM --><!-- US Government Users Restricted Rights --><!-- Use, duplication or disclosure restricted by --><!-- GSA ADP Schedule Contract with IBM Corp. -->
-</head>
-
-<body lang=EN-US link=blue vlink=blue style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<h1>EPF Composer Release Notes</h1>
-
-<p><strong>Release 1.0-M2</strong></p>
-
-<h2><a name=intro></a><o:p>&nbsp;</o:p></h2>
-
-<h2>Introduction</h2>
-
-<p>This is an updated version of EPF Composer. The main features added in this
-release include the following:</p>
-
-<ul type=disc>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l2 level1 lfo3;tab-stops:list .5in'>Support for Linux platforms</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l2 level1 lfo3;tab-stops:list .5in'>Several functional
-     improvements and fixes</li>
-</ul>
-
-<h2><a name=requirements></a>System Requirements</h2>
-
-<h3><a name=hardware></a>Hardware Requirements</h3>
-
-<ul type=disc>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l4 level1 lfo6;tab-stops:list .5in'><span class=GramE>Intel(TM)
-     Pentium® III 800 MHz or higher processor.</span> </li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l4 level1 lfo6;tab-stops:list .5in'><span class=GramE>768</span>
-     MB RAM minimum. More memory <span class=GramE>is recommended</span> as it
-     improves responsiveness. </li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l4 level1 lfo6;tab-stops:list .5in'>Disk space: </li>
- <ul type=circle>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l4 level2 lfo6;tab-stops:list 1.0in'><span class=GramE>50
-      MB to install EPF Composer.</span> </li>
- </ul>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l4 level1 lfo6;tab-stops:list .5in'><span class=GramE>Display
-     resolution of 1024 x 768 x 256-color video resolution, or higher.</span>
-     High-color or true-color recommended</li>
-</ul>
-
-<h3><a name=software></a>Software Requirements</h3>
-
-<p>The following software <span class=GramE>must be installed</span> before you
-install EPF Composer: </p>
-
-<ul type=disc>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l12 level1 lfo9;tab-stops:list .5in'>One of the following
-     operating systems: </li>
- <ul type=circle>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'>Windows® XP
-      Professional with Service Packs 1 and 2 </li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'>Windows 2000
-      Professional with Service Pack 4 </li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'>Windows 2003
-      Enterprise Edition with Service Pack 1</li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'>Red Hat Enterprise
-      Linux 4 WS</li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'>SUSE Linux SLES 9 SP3</li>
- </ul>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l12 level1 lfo9;tab-stops:list .5in'>One of the following
-     browsers:</li>
- <ul type=circle>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'>Internet Explorer®
-      6.0 with Service Pack 1</li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'>Internet Explorer 5.5
-      with Service Pack 2</li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'><span class=SpellE>Mozilla</span>
-      1.7.12</li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l12 level2 lfo9;tab-stops:list 1.0in'><span class=SpellE>Firefox</span>
-      1.0.7 or 1.5<a name=other></a></li>
- </ul>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l12 level1 lfo9;tab-stops:list .5in'>Minimum SUN® JRE 1.4.2, or
-     later, is recommended. </li>
-</ul>
-
-<h2><a name=installing></a><a name=features></a>New Features</h2>
-
-<p class=MsoNormal>The main new features in EPF Composer <span class=GramE>are
-described</span> below. </p>
-
-<h3>Export to Microsoft Project</h3>
-
-<p>You can now export a process to Microsoft Project. You can do this as
-follows:</p>
-
-<ol start=1 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l8 level1 lfo12;tab-stops:list .5in'>Start EPF Composer and open
-     the library containing the process you want to export.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l8 level1 lfo12;tab-stops:list .5in'>Select <strong>File-&gt;Export</strong>.
-     This starts the Export wizard.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l8 level1 lfo12;tab-stops:list .5in'>Select <strong>Microsoft
-     Project Template</strong> and click <span class=GramE><strong>Next</strong></span>.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l8 level1 lfo12;tab-stops:list .5in'>Choose the type of process
-     to export - Capability Pattern or Delivery Process and select the process
-     you want to export. If there <span class=GramE>is</span> more than one
-     Configuration associated with the process, select the configuration you
-     want to use.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l8 level1 lfo12;tab-stops:list .5in'>You can choose to publish
-     the configuration at the same time by checking the &quot;Publish the
-     configuration files&quot; checkbox. You can also choose to only export
-     tasks and activities with the Planned attribute set to true. If you do not
-     check this box, all activities and tasks in the selected process <span
-     class=GramE>will be exported</span>.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l8 level1 lfo12;tab-stops:list .5in'>Provide a name for your exported
-     template file and select a location for the file. Click <strong>Finish</strong>.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l8 level1 lfo12;tab-stops:list .5in'>You can open the XML file
-     that <span class=GramE>is exported</span> using Microsoft Project 2003 or
-     later. The XML file format <span class=GramE>is not officially supported</span>
-     in earlier versions.</li>
-</ol>
-
-<h3><a name=synchronization></a>Synchronization of Processes to Method Elements</h3>
-
-<p>When a descriptor <span class=GramE>is created</span> in a process, it has
-the same properties as its corresponding base element. If the base element is
-changed, the changes <span class=GramE>are not automatically reflected</span>
-in corresponding descriptors. Synchronization allows you to update descriptors
-in a process with the latest version of the corresponding base method element.
-This makes it easier to keep processes up to date with changes made to method
-elements after they <span class=GramE>are used</span> in processes.</p>
-
-<p>Each descriptor has a new property, the &quot;Synchronized with source&quot;
-flag, which can be set if you want to synchronize the element with its base
-method element.</p>
-
-<p><span class=GramE>There is a new synchronization wizard that</span> allows
-you to choose the properties to update in a descriptor from the corresponding
-base element.</p>
-
-<p><span class=GramE>To open the synchronization wizard, in the process editor,
-right-click on any breakdown element and select &quot;Custom
-Synchronization&quot;.</span> The wizard explains the feature and allows you to
-select which properties to update from the base element.</p>
-
-<p>You can also update all elements by <span class=GramE>right-clicking</span>
-on a breakdown element and selecting &quot;Default Synchronization from Method
-Content&quot;.</p>
-
-<p>The synchronization features are available for descriptors and activities.
-If you apply synchronization for an activity, all descriptors within the
-activity that have the &quot;Synchronized with source&quot; flag checked <span
-class=GramE>will be synchronized</span>.</p>
-
-<h3>Improvements to Diagrams</h3>
-
-<p>When an element in an extended Capability Pattern <span class=GramE>is
-suppressed</span> in the Work Breakdown Structure, the element is removed from
-the corresponding diagrams. When elements <span class=GramE>are removed</span>
-from a diagram, the resulting diagram may not be satisfactory. For example, you
-may have large empty spaces that seem inappropriate. You may also have nodes
-that <span class=GramE>are not connected</span> to anything. You can manually
-modify these diagrams to improve their appearance. You <span class=GramE>won't</span>
-be able to make connections to nodes that are extensions to other process
-elements (they appear with green italic text under the node). To enable the
-ability to connect to these nodes on your diagram, locate the node in the work
-breakdown structure (WBS) view. Choose 'Local Contribution' from this element's
-context menu.</p>
-
-<p>It is now possible to associate a diagram produced in an external graphics
-tool with an element in a breakdown structure. <span class=GramE>To use this
-facility, in the process editor, right-click on an activity and select
-Diagrams&gt;User Defined Diagrams.</span> You can select which type of user
-defined diagram you want to use and select the diagram file.</p>
-
-<p>You can now resize the nodes on an activity diagram to wrap the name of the
-node. <span class=GramE>On an activity diagram click on an activity or a task
-descriptor.</span> A box with handles <span class=GramE>is displayed</span>
-around the node. Use the handles on the side of the box to reduce or increase
-the width of the box. The name of the activity or task descriptor will wrap
-within the new size.</p>
-
-<h3>Improvements to Guidance</h3>
-
-<p>A new type of guidance - estimating considerations <span class=GramE>has
-been added</span>. The estimating considerations guidance allows you to add
-guidance around how to estimate effort for tasks and work products. </p>
-
-<p>A guidance element can now have associated guidance elements. We now support
-adding guidance elements to other guidance elements using a new Guidance tab on
-the guidance element editor.</p>
-
-<p>A Template can now have multiple file attachments.</p>
-
-<h3>Support for Team Profiles</h3>
-
-<p>In a process, roles <span class=GramE>can now be organized</span> into
-teams. You do this as follows:</p>
-
-<ol start=1 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l16 level1 lfo15;tab-stops:list .5in'><span class=GramE>On the
-     Team Allocation view in the process editor, right-click on an activity.</span>
-     Select New Child or New Sibling, and then select Team Profile. The Team
-     Profile <span class=GramE>will be added</span> as a breakdown element and
-     you can edit its information in the properties view.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l16 level1 lfo15;tab-stops:list .5in'>Select a role descriptor
-     and open the properties view. The Team tab allows you to assign the role
-     to one or more teams.</li>
-</ol>
-
-<p>You can use this feature to organize the roles in a process into teams and
-sub-teams. The make-up of teams can be different in different parts of a
-process.</p>
-
-<h3>Improvements to Published Web Sites</h3>
-
-<p>The publication of process information <span class=GramE>has been improved</span>
-as follows:</p>
-
-<ul type=disc>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l20 level1 lfo18;tab-stops:list .5in'>The Work Breakdown
-     Structure tab now shows a &quot;consolidated view&quot; of tasks with
-     their roles and work products. The display is limited to <span
-     class=GramE>3</span> levels, so sometimes the tasks and roles may not be
-     visible because they are too deep in the hierarchy to be seen. To see the
-     deeper levels, hyperlink to a lower level.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l20 level1 lfo18;tab-stops:list .5in'>The Team Allocation tab now
-     shows all roles 'rolled-up' to the selected activity with their associated
-     work products and tasks.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l20 level1 lfo18;tab-stops:list .5in'>The Work Product Usage tab
-     now shows all work products 'rolled-up' to the selected activity with
-     their associated work products and tasks.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l20 level1 lfo18;tab-stops:list .5in'>Each of the above tab
-     displays provide collapse / expand at the activity/task, role and work
-     product.</li>
-</ul>
-
-<p>These changes provide clearer information about the <span class=GramE>process
-and improve the information about roles</span> and work products.</p>
-
-<h3>Improved Navigation between Views and Elements</h3>
-
-<p>In the library view, you can navigate to variability elements for a base
-element. <span class=GramE>Right-click on an element and select &quot;Open via
-Variability Elements&quot;.</span> A select dialog <span class=GramE>is opened</span>
-that lists the base element and all variability elements that are based on the
-selected element. You can then open an element by double-clicking on it. You
-can also do this from a variability element to find the base element.</p>
-
-<p>The ability to link between the library view and other views <span
-class=GramE>has been enhanced</span> as follows:</p>
-
-<ul type=disc>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l14 level1 lfo21;tab-stops:list .5in'>While in the process
-     editor, you can link from a descriptor to the base method element. <span
-     class=GramE>Right-click on a descriptor in a breakdown and select
-     &quot;Show Linked Element in Library View&quot;.</span> <span class=GramE>There
-     is also a toolbar button that</span> can be used instead of the context
-     menu item.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l14 level1 lfo21;tab-stops:list .5in'>While in the configuration
-     view, you can locate a method element in the library view. <span
-     class=GramE>Right-click on a process element and select &quot;Show in
-     Library View&quot;.</span></li>
-</ul>
-
-<p>In each case, the corresponding base method element <span class=GramE>is
-highlighted</span> in the library view. There could be contributors to this
-element that add additional information, roles, or work products. You can use
-&quot;Open via Variability Elements&quot; described above to locate variability
-elements.</p>
-
-<h3>A few other improvements</h3>
-
-<ul type=disc>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l13 level1 lfo24;tab-stops:list .5in'>There are now toolbar
-     buttons in the process editor to move activities/tasks up or down.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l13 level1 lfo24;tab-stops:list .5in'>&quot;Contributes to<span
-     class=GramE>..&quot;</span> information is now on all tabs in editors.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l13 level1 lfo24;tab-stops:list .5in'>User can customize what
-     columns to display in the process editors</li>
-</ul>
-
-<h2><a name=localized></a><a name=tooling></a>Known EPF Composer Issues</h2>
-
-<ol start=1 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>When using the new <a
-     href="#synchronization">synchronization feature</a>, after each
-     synchronization operation on a capability pattern or delivery process,
-     please save it before doing another synchronization operation. This is to
-     prevent too many objects being stored in the undo command stack. Having
-     too much in the undo command stack may cause too much memory consumption.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>EPF Composer (EPF) <span
-     class=GramE>is not designed</span> for concurrent team authoring on the
-     same instance of a method library. However, there is a <span class=SpellE>whitepaper</span>
-     on &quot;Using EPF with a Version Control System&quot; available on the
-     EPF project web site at: </li>
-</ol>
-
-<p style='margin-left:.5in'><a href="http://www.eclipse.org/epf/">http://www.eclipse.org/epf/</a></p>
-
-<p style='margin-left:.5in'>This explains how you can use a version control
-system to maintain your EPF Composer library.</p>
-
-<ol start=3 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>If you use one of the
-     following EPF 7.0.1 features in your content library, you may not be able
-     open the library using EPF 7.0 tool. </li>
-</ol>
-
-<p style='margin-left:.5in'>A: Added more than one attachment to a template</p>
-
-<p style='margin-left:.5in'>B: Created team profile</p>
-
-<p style='margin-left:.5in'><span class=GramE>C: Customized activity diagrams
-that contain suppressed activities or tasks.</span> These diagrams will not
-have a desirable look when viewed using EPF 7.0, because the suppressed
-elements will reappear.</p>
-
-<p style='margin-left:.5in'>You must use EPF Composer to use a library with
-these features.</p>
-
-<ol start=4 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>&quot;Link with
-     Editor&quot; button does not locate Custom Categories, but will expand
-     down to the &quot;Custom Categories&quot; UI folder in the Library View.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>Editor text fields <span
-     class=GramE>cannot be read</span> in High contrast mode. When High
-     Contrast mode is <span class=GramE>activated</span> as EPF is running,
-     text in non-rich-text fields becomes unreadable. This is an Eclipse platform
-     bug. The workaround is to restart EPF.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>If you make changes to a
-     configuration that <span class=GramE>is used</span> by an active process
-     editor, the changes to the configuration are not automatically refreshed
-     in the process editor. The workaround is to re-select the configuration
-     again in the combo box in the toolbar or use refresh in the context menu
-     or close and reopen the process editor.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>Drag and drop a capability
-     pattern or delivery process from library view to a rich-text editor may
-     not create the desired method element link. To create a method element
-     link to a capability pattern or delivery process, expand a rich-text
-     editor, click on 'add link' button, select the desired link type, click
-     Browse, navigate to the capability pattern or delivery process, expand it
-     and select the first child of the capability pattern or delivery process.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>Windows has a limited
-     overall number of system handles. When the system runs out of system
-     handles, EPF will not function properly. For example, double-clicking on a
-     method element will not bring up the editor. You need to close EPF and
-     close other applications to bring the available system handles to a
-     reasonable level and start EPF again.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>Changes made to the base
-     Activity Diagram of an activity <span class=GramE>are not automatically
-     reflected</span> in any extensions of the activity. To see the changes,
-     open the Activity Diagram of each activity that extends the modified one,
-     right click on the background of the diagram and choose &quot;Refresh from
-     Base&quot;. This will update the diagram. Save the change.</li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>In the Rich Text Editor, it
-     is not possible to input accented characters that require <span
-     class=GramE>2</span> key combinations. <span class=GramE>For example, '`'
-     and 'a' to produce '<span class=SpellE>à</span>'.</span> <span
-     class=GramE>This is a limitation of the Eclipse SWT Browser widget that we
-     use.</span> See <code><span style='font-size:10.0pt'>https://bugs.eclipse.org/bugs/show_bug.cgi?id=131017</span></code>
-     for more info. Workarounds are:</li>
- <ul type=circle>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l15 level2 lfo27;tab-stops:list 1.0in'>Use Alt key codes to
-      enter the accented characters. For a listing of Alt key codes on Windows,
-      see <code><span style='font-size:10.0pt'>http://tlt.its.psu.edu/suggestions/international/accents/codealt.html</span></code>.</li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l15 level2 lfo27;tab-stops:list 1.0in'>Type the accented
-      characters in a <span class=GramE>non rich</span> text field (like Brief
-      Description), and cut and paste the characters onto the rich text field
-      or editor.</li>
-  <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:
-      auto;mso-list:l15 level2 lfo27;tab-stops:list 1.0in'>Expand the rich text
-      field, select the HTML tab and enter the accented characters in the HTML
-      source editor.</li>
- </ul>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l15 level1 lfo27;tab-stops:list .5in'>In the Rich Text Editor,
-     formatting of text inside &lt;pre&gt;...&lt;/pre&gt; may not be fully
-     preserved.</li>
-</ol>
-
-<h2>Version control support in EPF<o:p></o:p></h2>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.25in'><span class=SpellE><b><i>ClearCase</i></b></span><b><i>
-Remote Client (CCRC)<o:p></o:p></i></b></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.25in'><b>Install CCRC from <span class=SpellE>ClearCase</span>
-server<o:p></o:p></b></p>
-
-<ol start=1 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l7 level1 lfo30;tab-stops:list .5in'><span class=GramE>Menu Help
-     / Software Updates / Find and Install…</span><o:p></o:p></li>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l7 level1 lfo30;tab-stops:list .5in'>Select <b style='mso-bidi-font-weight:
-     normal'>Search for new features to install </b>then click <b
-     style='mso-bidi-font-weight:normal'>Next</b><br>
-     <!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
-      o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
-      stroked="f">
-      <v:stroke joinstyle="miter"/>
-      <v:formulas>
-       <v:f eqn="if lineDrawn pixelLineWidth 0"/>
-       <v:f eqn="sum @0 1 0"/>
-       <v:f eqn="sum 0 0 @1"/>
-       <v:f eqn="prod @2 1 2"/>
-       <v:f eqn="prod @3 21600 pixelWidth"/>
-       <v:f eqn="prod @3 21600 pixelHeight"/>
-       <v:f eqn="sum @0 0 1"/>
-       <v:f eqn="prod @6 1 2"/>
-       <v:f eqn="prod @7 21600 pixelWidth"/>
-       <v:f eqn="sum @8 21600 0"/>
-       <v:f eqn="prod @7 21600 pixelHeight"/>
-       <v:f eqn="sum @10 21600 0"/>
-      </v:formulas>
-      <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
-      <o:lock v:ext="edit" aspectratio="t"/>
-     </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:6in;
-      height:381.75pt'>
-      <v:imagedata src="release-notes_files/image001.png" o:title=""/>
-     </v:shape><![endif]--><![if !vml]><img border=0 width=576 height=509
-     src="release-notes_files/image002.jpg" v:shapes="_x0000_i1025"><![endif]></li>
-</ol>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p>&nbsp;</o:p></p>
-
-<ol start=3 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l7 level1 lfo30;tab-stops:list .5in'>Enter new remote update site
-     for CCRC<br>
-     <!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:267pt;
-      height:110.25pt'>
-      <v:imagedata src="release-notes_files/image003.png" o:title=""/>
-     </v:shape><![endif]--><![if !vml]><img border=0 width=356 height=147
-     src="release-notes_files/image004.jpg" v:shapes="_x0000_i1026"><![endif]><br>
-     <br>
-     <!--[if gte vml 1]><v:shape id="_x0000_i1033" type="#_x0000_t75" style='width:6in;
-      height:381.75pt'>
-      <v:imagedata src="release-notes_files/image005.png" o:title=""/>
-     </v:shape><![endif]--><![if !vml]><img border=0 width=576 height=509
-     src="release-notes_files/image006.jpg" v:shapes="_x0000_i1033"><![endif]><br>
-     then click <b style='mso-bidi-font-weight:normal'>Finish</b><o:p></o:p></li>
-</ol>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p>&nbsp;</o:p></p>
-
-<ol start=4 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l7 level1 lfo30;tab-stops:list .5in'>Select <b style='mso-bidi-font-weight:
-     normal'>Rational <span class=SpellE>ClearCase</span> Remote Client for
-     Eclipse</b> then click <b style='mso-bidi-font-weight:normal'>Next</b><br>
-     <!--[if gte vml 1]><v:shape id="_x0000_i1032" type="#_x0000_t75" style='width:6in;
-      height:5in'>
-      <v:imagedata src="release-notes_files/image007.png" o:title=""/>
-     </v:shape><![endif]--><![if !vml]><img border=0 width=576 height=480
-     src="release-notes_files/image008.jpg" v:shapes="_x0000_i1032"><![endif]></li>
-</ol>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p>&nbsp;</o:p></p>
-
-<ol start=5 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l7 level1 lfo30;tab-stops:list .5in'>Follow the on-screen
-     instructions to install CCRC to RMC<br>
-     <!--[if gte vml 1]><v:shape id="_x0000_i1031" type="#_x0000_t75" style='width:6in;
-      height:5in'>
-      <v:imagedata src="release-notes_files/image009.png" o:title=""/>
-     </v:shape><![endif]--><![if !vml]><img border=0 width=576 height=480
-     src="release-notes_files/image010.jpg" v:shapes="_x0000_i1031"><![endif]><br
-     style='mso-special-character:line-break'>
-     <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
-     <![endif]></li>
-</ol>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p>&nbsp;</o:p></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.5in'><!--[if gte vml 1]><v:shape id="_x0000_i1030" type="#_x0000_t75"
- style='width:6in;height:5in'>
- <v:imagedata src="release-notes_files/image011.png" o:title=""/>
-</v:shape><![endif]--><![if !vml]><img border=0 width=576 height=480
-src="release-notes_files/image012.jpg" v:shapes="_x0000_i1030"><![endif]><br
-style='mso-special-character:line-break'>
-<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
-<![endif]></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'><o:p>&nbsp;</o:p></p>
-
-<ol start=6 type=1>
- <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-     mso-list:l7 level1 lfo30;tab-stops:list .5in'>Click on <b
-     style='mso-bidi-font-weight:normal'>Install All</b> when you see the below
-     screen<br>
-     <!--[if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75" style='width:6in;
-      height:5in'>
-      <v:imagedata src="release-notes_files/image013.png" o:title=""/>
-     </v:shape><![endif]--><![if !vml]><img border=0 width=576 height=480
-     src="release-notes_files/image014.jpg" v:shapes="_x0000_i1029"><![endif]><br
-     style='mso-special-character:line-break'>
-     <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
-     <![endif]></li>
-</ol>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.5in'>Click on <b style='mso-bidi-font-weight:normal'>Apply Changes</b>
-when you see the following dialog box<br>
-<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:330.75pt;
- height:109.5pt'>
- <v:imagedata src="release-notes_files/image015.png" o:title=""/>
-</v:shape><![endif]--><![if !vml]><img border=0 width=441 height=146
-src="release-notes_files/image016.jpg" v:shapes="_x0000_i1027"><![endif]><o:p></o:p></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.25in'><b><i>CVS<o:p></o:p></i></b></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.25in'><b>Setting up<br>
-</b><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:6in;
- height:390.75pt'>
- <v:imagedata src="release-notes_files/image017.png" o:title=""/>
-</v:shape><![endif]--><![if !vml]><img border=0 width=576 height=521
-src="release-notes_files/image018.jpg" v:shapes="_x0000_i1028"><![endif]><b><o:p></o:p></b></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.25in'><o:p>&nbsp;</o:p></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.25in'><o:p>&nbsp;</o:p></p>
-
-<p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
-margin-left:.25in'><o:p>&nbsp;</o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/1.5/releng/release-notes_files/filelist.xml b/1.5/releng/release-notes_files/filelist.xml
deleted file mode 100644
index 7834e81..0000000
--- a/1.5/releng/release-notes_files/filelist.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-﻿<xml xmlns:o="urn:schemas-microsoft-com:office:office">
- <o:MainFile HRef="../release-notes.html"/>
- <o:File HRef="image001.png"/>
- <o:File HRef="image002.jpg"/>
- <o:File HRef="image003.png"/>
- <o:File HRef="image004.jpg"/>
- <o:File HRef="image005.png"/>
- <o:File HRef="image006.jpg"/>
- <o:File HRef="image007.png"/>
- <o:File HRef="image008.jpg"/>
- <o:File HRef="image009.png"/>
- <o:File HRef="image010.jpg"/>
- <o:File HRef="image011.png"/>
- <o:File HRef="image012.jpg"/>
- <o:File HRef="image013.png"/>
- <o:File HRef="image014.jpg"/>
- <o:File HRef="image015.png"/>
- <o:File HRef="image016.jpg"/>
- <o:File HRef="image017.png"/>
- <o:File HRef="image018.jpg"/>
- <o:File HRef="filelist.xml"/>
-</xml>
\ No newline at end of file
diff --git a/1.5/releng/release-notes_files/image001.png b/1.5/releng/release-notes_files/image001.png
deleted file mode 100644
index 93b2f35..0000000
--- a/1.5/releng/release-notes_files/image001.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image002.jpg b/1.5/releng/release-notes_files/image002.jpg
deleted file mode 100644
index 85ec004..0000000
--- a/1.5/releng/release-notes_files/image002.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image003.png b/1.5/releng/release-notes_files/image003.png
deleted file mode 100644
index 4acdf0b..0000000
--- a/1.5/releng/release-notes_files/image003.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image004.jpg b/1.5/releng/release-notes_files/image004.jpg
deleted file mode 100644
index d6d3a2c..0000000
--- a/1.5/releng/release-notes_files/image004.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image005.png b/1.5/releng/release-notes_files/image005.png
deleted file mode 100644
index e6cb855..0000000
--- a/1.5/releng/release-notes_files/image005.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image006.jpg b/1.5/releng/release-notes_files/image006.jpg
deleted file mode 100644
index 1484ee0..0000000
--- a/1.5/releng/release-notes_files/image006.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image007.png b/1.5/releng/release-notes_files/image007.png
deleted file mode 100644
index 5b30220..0000000
--- a/1.5/releng/release-notes_files/image007.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image008.jpg b/1.5/releng/release-notes_files/image008.jpg
deleted file mode 100644
index 1ff13ec..0000000
--- a/1.5/releng/release-notes_files/image008.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image009.png b/1.5/releng/release-notes_files/image009.png
deleted file mode 100644
index b89e714..0000000
--- a/1.5/releng/release-notes_files/image009.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image010.jpg b/1.5/releng/release-notes_files/image010.jpg
deleted file mode 100644
index c5e24aa..0000000
--- a/1.5/releng/release-notes_files/image010.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image011.png b/1.5/releng/release-notes_files/image011.png
deleted file mode 100644
index 590763c..0000000
--- a/1.5/releng/release-notes_files/image011.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image012.jpg b/1.5/releng/release-notes_files/image012.jpg
deleted file mode 100644
index db819d1..0000000
--- a/1.5/releng/release-notes_files/image012.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image013.png b/1.5/releng/release-notes_files/image013.png
deleted file mode 100644
index 6342e6c..0000000
--- a/1.5/releng/release-notes_files/image013.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image014.jpg b/1.5/releng/release-notes_files/image014.jpg
deleted file mode 100644
index eeb6e87..0000000
--- a/1.5/releng/release-notes_files/image014.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image015.png b/1.5/releng/release-notes_files/image015.png
deleted file mode 100644
index bd5625a..0000000
--- a/1.5/releng/release-notes_files/image015.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image016.jpg b/1.5/releng/release-notes_files/image016.jpg
deleted file mode 100644
index 5ad70f0..0000000
--- a/1.5/releng/release-notes_files/image016.jpg
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image017.png b/1.5/releng/release-notes_files/image017.png
deleted file mode 100644
index 9414e9e..0000000
--- a/1.5/releng/release-notes_files/image017.png
+++ /dev/null
Binary files differ
diff --git a/1.5/releng/release-notes_files/image018.jpg b/1.5/releng/release-notes_files/image018.jpg
deleted file mode 100644
index 3c67538..0000000
--- a/1.5/releng/release-notes_files/image018.jpg
+++ /dev/null
Binary files differ
